diff options
Diffstat (limited to 'src/backend/optimizer/plan/setrefs.c')
-rw-r--r-- | src/backend/optimizer/plan/setrefs.c | 76 |
1 files changed, 39 insertions, 37 deletions
diff --git a/src/backend/optimizer/plan/setrefs.c b/src/backend/optimizer/plan/setrefs.c index 644ff36ee90..fe80a658f0a 100644 --- a/src/backend/optimizer/plan/setrefs.c +++ b/src/backend/optimizer/plan/setrefs.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/setrefs.c,v 1.14 1998/01/14 19:55:53 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/setrefs.c,v 1.15 1998/01/15 18:59:50 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -44,7 +44,7 @@ static Var *replace_joinvar_refs(Var *var, List *outer_tlist, List *inner_tlist) static List *tlist_temp_references(Oid tempid, List *tlist); static void replace_result_clause(Node *clause, List *subplanTargetList); static bool OperandIsInner(Node *opnd, int inner_relid); -static void replace_agg_clause(Node *expr, List *targetlist); +static List *replace_agg_clause(Node *expr, List *targetlist); static Node *del_agg_clause(Node *clause); /***************************************************************************** @@ -536,13 +536,9 @@ set_result_tlist_references(Result *resultNode) */ subplan = ((Plan *) resultNode)->lefttree; if (subplan != NULL) - { subplanTargetList = subplan->targetlist; - } else - { subplanTargetList = NIL; - } /* * now for traverse all the entris of the target list. These should be @@ -695,13 +691,16 @@ OperandIsInner(Node *opnd, int inner_relid) * changes the target list of an Agg node so that it points to * the tuples returned by its left tree subplan. * + * We now also generate a linked list of Aggreg pointers for Agg. + * */ -void +List * set_agg_tlist_references(Agg *aggNode) { List *aggTargetList; List *subplanTargetList; List *tl; + List *aggreg_list = NIL; aggTargetList = aggNode->plan.targetlist; subplanTargetList = aggNode->plan.lefttree->targetlist; @@ -710,30 +709,18 @@ set_agg_tlist_references(Agg *aggNode) { TargetEntry *tle = lfirst(tl); - replace_agg_clause(tle->expr, subplanTargetList); - } -} - -void -set_agg_agglist_references(Agg *aggNode) -{ - List *subplanTargetList; - Aggreg **aggs; - int i; - - aggs = aggNode->aggs; - subplanTargetList = aggNode->plan.lefttree->targetlist; - - for (i = 0; i < aggNode->numAgg; i++) - { - replace_agg_clause(aggs[i]->target, subplanTargetList); + aggreg_list = nconc( + replace_agg_clause(tle->expr, subplanTargetList),aggreg_list); } + return aggreg_list; } -static void +static List * replace_agg_clause(Node *clause, List *subplanTargetList) { List *t; + List *agg_list = NIL; + if (IsA(clause, Var)) { TargetEntry *subplanVar; @@ -748,41 +735,51 @@ replace_agg_clause(Node *clause, List *subplanTargetList) * */ ((Var *) clause)->varattno = subplanVar->resdom->resno; + + return NIL; } else if (is_funcclause(clause)) { - /* * This is a function. Recursively call this routine for its * arguments... */ foreach(t, ((Expr *) clause)->args) { - replace_agg_clause(lfirst(t), subplanTargetList); + agg_list = nconc(agg_list, + replace_agg_clause(lfirst(t), subplanTargetList)); } + return agg_list; } else if (IsA(clause, Aggreg)) { - replace_agg_clause(((Aggreg *) clause)->target, subplanTargetList); + return lcons(clause, + replace_agg_clause(((Aggreg *) clause)->target, subplanTargetList)); } else if (IsA(clause, ArrayRef)) { ArrayRef *aref = (ArrayRef *) clause; - + /* * This is an arrayref. Recursively call this routine for its * expression and its index expression... */ foreach(t, aref->refupperindexpr) { - replace_agg_clause(lfirst(t), subplanTargetList); + agg_list = nconc(agg_list, + replace_agg_clause(lfirst(t), subplanTargetList)); } foreach(t, aref->reflowerindexpr) { - replace_agg_clause(lfirst(t), subplanTargetList); + agg_list = nconc(agg_list, + replace_agg_clause(lfirst(t), subplanTargetList)); } - replace_agg_clause(aref->refexpr, subplanTargetList); - replace_agg_clause(aref->refassgnexpr, subplanTargetList); + agg_list = nconc(agg_list, + replace_agg_clause(aref->refexpr, subplanTargetList)); + agg_list = nconc(agg_list, + replace_agg_clause(aref->refassgnexpr, subplanTargetList)); + + return agg_list; } else if (is_opclause(clause)) { @@ -792,15 +789,20 @@ replace_agg_clause(Node *clause, List *subplanTargetList) */ Node *left = (Node *) get_leftop((Expr *) clause); Node *right = (Node *) get_rightop((Expr *) clause); - + if (left != (Node *) NULL) - replace_agg_clause(left, subplanTargetList); + agg_list = nconc(agg_list, + replace_agg_clause(left, subplanTargetList)); if (right != (Node *) NULL) - replace_agg_clause(right, subplanTargetList); + agg_list = nconc(agg_list, + replace_agg_clause(right, subplanTargetList)); + + return agg_list; } else if (IsA(clause, Param) ||IsA(clause, Const)) { /* do nothing! */ + return NIL; } else { @@ -809,8 +811,8 @@ replace_agg_clause(Node *clause, List *subplanTargetList) * Ooops! we can not handle that! */ elog(ERROR, "replace_agg_clause: Can not handle this tlist!\n"); + return NIL; } - } /* |