diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c index dd3aeada2eb0fbcc73351746bfdabe6e6bb11582..25135893a75d442c57f9ecdd07db4d7e7afd5e87 100644 --- a/src/backend/parser/analyze.c +++ b/src/backend/parser/analyze.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/parser/analyze.c,v 1.45 1997/10/12 07:09:20 vadim Exp $ + * $Header: /cvsroot/pgsql/src/backend/parser/analyze.c,v 1.46 1997/10/16 06:58:38 vadim Exp $ * *------------------------------------------------------------------------- */ @@ -1816,8 +1816,22 @@ transformGroupClause(ParseState *pstate, List *grouplist, List *targetlist) gl = glist = lcons(grpcl, NIL); else { - lnext(gl) = lcons(grpcl, NIL); - gl = lnext(gl); + List *i; + + foreach (i, glist) + { + GroupClause *gcl = (GroupClause *) lfirst (i); + + if ( gcl->entry == grpcl->entry ) + break; + } + if ( i == NIL ) /* not in grouplist already */ + { + lnext(gl) = lcons(grpcl, NIL); + gl = lnext(gl); + } + else + pfree (grpcl); /* get rid of this */ } grouplist = lnext(grouplist); } @@ -1836,8 +1850,7 @@ transformSortClause(ParseState *pstate, char *uniqueFlag) { List *sortlist = NIL; - List *s = NIL, - *i; + List *s = NIL; while (orderlist != NIL) { @@ -1860,14 +1873,30 @@ transformSortClause(ParseState *pstate, } else { - lnext(s) = lcons(sortcl, NIL); - s = lnext(s); + List *i; + + foreach (i, sortlist) + { + SortClause *scl = (SortClause *) lfirst (i); + + if ( scl->resdom == sortcl->resdom ) + break; + } + if ( i == NIL ) /* not in sortlist already */ + { + lnext(s) = lcons(sortcl, NIL); + s = lnext(s); + } + else + pfree (sortcl); /* get rid of this */ } orderlist = lnext(orderlist); } if (uniqueFlag) { + List *i; + if (uniqueFlag[0] == '*') {