summaryrefslogtreecommitdiff
path: root/src/backend/optimizer/plan/setrefs.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/optimizer/plan/setrefs.c')
-rw-r--r--src/backend/optimizer/plan/setrefs.c76
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;
}
-
}
/*