diff options
Diffstat (limited to 'src/backend/parser')
-rw-r--r-- | src/backend/parser/parse_agg.c | 23 | ||||
-rw-r--r-- | src/backend/parser/parse_clause.c | 18 |
2 files changed, 27 insertions, 14 deletions
diff --git a/src/backend/parser/parse_agg.c b/src/backend/parser/parse_agg.c index 1b2eb21c7cd..ab00040c654 100644 --- a/src/backend/parser/parse_agg.c +++ b/src/backend/parser/parse_agg.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/parser/parse_agg.c,v 1.18 1999/04/29 01:13:13 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/parser/parse_agg.c,v 1.19 1999/05/12 15:01:48 wieck Exp $ * *------------------------------------------------------------------------- */ @@ -32,8 +32,9 @@ #include "utils/lsyscache.h" static bool contain_agg_clause(Node *clause); -static bool exprIsAggOrGroupCol(Node *expr, List *groupClause); -static bool tleIsAggOrGroupCol(TargetEntry *tle, List *groupClause); +static bool exprIsAggOrGroupCol(Node *expr, List *groupClause, List *tlist); +static bool tleIsAggOrGroupCol(TargetEntry *tle, List *groupClause, + List *tlist); /* * contain_agg_clause @@ -100,7 +101,7 @@ contain_agg_clause(Node *clause) * returns true if the expression does not contain non-group columns. */ static bool -exprIsAggOrGroupCol(Node *expr, List *groupClause) +exprIsAggOrGroupCol(Node *expr, List *groupClause, List *tlist) { List *gl; @@ -113,7 +114,7 @@ exprIsAggOrGroupCol(Node *expr, List *groupClause) { GroupClause *grpcl = lfirst(gl); - if (equal(expr, grpcl->entry->expr)) + if (equal(expr, get_groupclause_expr(grpcl, tlist))) return TRUE; } @@ -122,7 +123,7 @@ exprIsAggOrGroupCol(Node *expr, List *groupClause) List *temp; foreach(temp, ((Expr *) expr)->args) - if (!exprIsAggOrGroupCol(lfirst(temp), groupClause)) + if (!exprIsAggOrGroupCol(lfirst(temp), groupClause, tlist)) return FALSE; return TRUE; } @@ -135,7 +136,7 @@ exprIsAggOrGroupCol(Node *expr, List *groupClause) * returns true if the TargetEntry is Agg or GroupCol. */ static bool -tleIsAggOrGroupCol(TargetEntry *tle, List *groupClause) +tleIsAggOrGroupCol(TargetEntry *tle, List *groupClause, List *tlist) { Node *expr = tle->expr; List *gl; @@ -147,7 +148,7 @@ tleIsAggOrGroupCol(TargetEntry *tle, List *groupClause) { GroupClause *grpcl = lfirst(gl); - if (tle->resdom->resno == grpcl->entry->resdom->resno) + if (tle->resdom->resgroupref == grpcl->tleGroupref) { if (contain_agg_clause((Node *) expr)) elog(ERROR, "Aggregates not allowed in GROUP BY clause"); @@ -163,7 +164,7 @@ tleIsAggOrGroupCol(TargetEntry *tle, List *groupClause) List *temp; foreach(temp, ((Expr *) expr)->args) - if (!exprIsAggOrGroupCol(lfirst(temp), groupClause)) + if (!exprIsAggOrGroupCol(lfirst(temp), groupClause, tlist)) return FALSE; return TRUE; } @@ -200,7 +201,7 @@ parseCheckAggregates(ParseState *pstate, Query *qry) { TargetEntry *tle = lfirst(tl); - if (!tleIsAggOrGroupCol(tle, qry->groupClause)) + if (!tleIsAggOrGroupCol(tle, qry->groupClause, qry->targetList)) elog(ERROR, "Illegal use of aggregates or non-group column in target list"); } @@ -210,7 +211,7 @@ parseCheckAggregates(ParseState *pstate, Query *qry) * restriction as those in the target list. */ - if (!exprIsAggOrGroupCol(qry->havingQual, qry->groupClause)) + if (!exprIsAggOrGroupCol(qry->havingQual, qry->groupClause, qry->targetList)) elog(ERROR, "Illegal use of aggregates or non-group column in HAVING clause"); return; diff --git a/src/backend/parser/parse_clause.c b/src/backend/parser/parse_clause.c index 0085a4781b9..61359e3452a 100644 --- a/src/backend/parser/parse_clause.c +++ b/src/backend/parser/parse_clause.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/parser/parse_clause.c,v 1.29 1999/02/23 07:46:42 thomas Exp $ + * $Header: /cvsroot/pgsql/src/backend/parser/parse_clause.c,v 1.30 1999/05/12 15:01:50 wieck Exp $ * *------------------------------------------------------------------------- */ @@ -550,13 +550,19 @@ transformGroupClause(ParseState *pstate, List *grouplist, List *targetlist) restarget = findTargetlistEntry(pstate, lfirst(grouplist), targetlist, GROUP_CLAUSE); - grpcl->entry = restarget; resdom = restarget->resdom; grpcl->grpOpoid = oprid(oper("<", resdom->restype, resdom->restype, false)); if (glist == NIL) + { + int groupref = length(glist) + 1; + + restarget->resdom->resgroupref = groupref; + grpcl->tleGroupref = groupref; + gl = glist = lcons(grpcl, NIL); + } else { List *i; @@ -565,11 +571,17 @@ transformGroupClause(ParseState *pstate, List *grouplist, List *targetlist) { GroupClause *gcl = (GroupClause *) lfirst(i); - if (gcl->entry == grpcl->entry) + if (equal(get_groupclause_expr(gcl, targetlist), + restarget->expr)) break; } if (i == NIL) /* not in grouplist already */ { + int groupref = length(glist) + 1; + + restarget->resdom->resgroupref = groupref; + grpcl->tleGroupref = groupref; + lnext(gl) = lcons(grpcl, NIL); gl = lnext(gl); } |