diff options
author | Bruce Momjian <bruce@momjian.us> | 1997-09-07 05:04:48 +0000 |
---|---|---|
committer | Bruce Momjian <bruce@momjian.us> | 1997-09-07 05:04:48 +0000 |
commit | 1ccd423235a48739d6f7a4d7889705b5f9ecc69b (patch) | |
tree | 8001c4e839dfad8f29ceda7f8c5f5dbb8759b564 /src/backend/optimizer/plan/setrefs.c | |
parent | 8fecd4febf8357f3cc20383ed29ced484877d5ac (diff) | |
download | postgresql-1ccd423235a48739d6f7a4d7889705b5f9ecc69b.tar.gz postgresql-1ccd423235a48739d6f7a4d7889705b5f9ecc69b.zip |
Massive commit to run PGINDENT on all *.c and *.h files.
Diffstat (limited to 'src/backend/optimizer/plan/setrefs.c')
-rw-r--r-- | src/backend/optimizer/plan/setrefs.c | 1148 |
1 files changed, 621 insertions, 527 deletions
diff --git a/src/backend/optimizer/plan/setrefs.c b/src/backend/optimizer/plan/setrefs.c index 4527837e9d4..19cee246a58 100644 --- a/src/backend/optimizer/plan/setrefs.c +++ b/src/backend/optimizer/plan/setrefs.c @@ -1,13 +1,13 @@ /*------------------------------------------------------------------------- * * setrefs.c-- - * Routines to change varno/attno entries to contain references + * Routines to change varno/attno entries to contain references * * Copyright (c) 1994, Regents of the University of California * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/setrefs.c,v 1.4 1997/06/12 17:26:15 vadim Exp $ + * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/setrefs.c,v 1.5 1997/09/07 04:44:05 momjian Exp $ * *------------------------------------------------------------------------- */ @@ -33,419 +33,468 @@ #include "optimizer/var.h" #include "optimizer/tlist.h" -static void set_join_tlist_references(Join *join); -static void set_tempscan_tlist_references(SeqScan *tempscan); -static void set_temp_tlist_references(Temp *temp); -static List *replace_clause_joinvar_refs(Expr *clause, - List *outer_tlist, List *inner_tlist); -static List *replace_subclause_joinvar_refs(List *clauses, - List *outer_tlist, List *inner_tlist); -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(List *clause, List *subplanTargetList); -static bool OperandIsInner(Node *opnd, int inner_relid); -static void replace_agg_clause(Node *expr, List *targetlist); +static void set_join_tlist_references(Join * join); +static void set_tempscan_tlist_references(SeqScan * tempscan); +static void set_temp_tlist_references(Temp * temp); +static List * +replace_clause_joinvar_refs(Expr * clause, + List * outer_tlist, List * inner_tlist); +static List * +replace_subclause_joinvar_refs(List * clauses, + List * outer_tlist, List * inner_tlist); +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(List * clause, List * subplanTargetList); +static bool OperandIsInner(Node * opnd, int inner_relid); +static void replace_agg_clause(Node * expr, List * targetlist); /***************************************************************************** - * - * SUBPLAN REFERENCES - * + * + * SUBPLAN REFERENCES + * *****************************************************************************/ -/* +/* * set-tlist-references-- - * Modifies the target list of nodes in a plan to reference target lists - * at lower levels. - * + * Modifies the target list of nodes in a plan to reference target lists + * at lower levels. + * * 'plan' is the plan whose target list and children's target lists will - * be modified - * + * be modified + * * Returns nothing of interest, but modifies internal fields of nodes. - * + * */ void -set_tlist_references(Plan *plan) +set_tlist_references(Plan * plan) { - if(plan==NULL) - return; - - if (IsA_Join(plan)) { - set_join_tlist_references((Join*)plan); - } else if (IsA(plan,SeqScan) && plan->lefttree && - IsA_Temp(plan->lefttree)) { - set_tempscan_tlist_references((SeqScan*)plan); - } else if (IsA(plan,Sort)) { - set_temp_tlist_references ((Temp*)plan); - } else if (IsA(plan,Result)) { - set_result_tlist_references((Result*)plan); - } else if (IsA(plan,Hash)) { - set_tlist_references(plan->lefttree); - } else if (IsA(plan,Choose)) { - List *x; - foreach (x, ((Choose*)plan)->chooseplanlist) { - set_tlist_references((Plan*)lfirst(x)); - } - } + if (plan == NULL) + return; + + if (IsA_Join(plan)) + { + set_join_tlist_references((Join *) plan); + } + else if (IsA(plan, SeqScan) && plan->lefttree && + IsA_Temp(plan->lefttree)) + { + set_tempscan_tlist_references((SeqScan *) plan); + } + else if (IsA(plan, Sort)) + { + set_temp_tlist_references((Temp *) plan); + } + else if (IsA(plan, Result)) + { + set_result_tlist_references((Result *) plan); + } + else if (IsA(plan, Hash)) + { + set_tlist_references(plan->lefttree); + } + else if (IsA(plan, Choose)) + { + List *x; + + foreach(x, ((Choose *) plan)->chooseplanlist) + { + set_tlist_references((Plan *) lfirst(x)); + } + } } -/* +/* * set-join-tlist-references-- - * Modifies the target list of a join node by setting the varnos and - * varattnos to reference the target list of the outer and inner join - * relations. - * - * Creates a target list for a join node to contain references by setting - * varno values to OUTER or INNER and setting attno values to the - * result domain number of either the corresponding outer or inner join - * tuple. - * + * Modifies the target list of a join node by setting the varnos and + * varattnos to reference the target list of the outer and inner join + * relations. + * + * Creates a target list for a join node to contain references by setting + * varno values to OUTER or INNER and setting attno values to the + * result domain number of either the corresponding outer or inner join + * tuple. + * * 'join' is a join plan node - * + * * Returns nothing of interest, but modifies internal fields of nodes. - * + * */ static void -set_join_tlist_references(Join *join) +set_join_tlist_references(Join * join) { - Plan *outer = ((Plan*)join)->lefttree; - Plan *inner = ((Plan*)join)->righttree; - List *new_join_targetlist = NIL; - TargetEntry *temp = (TargetEntry *)NULL; - List *entry = NIL; - List *inner_tlist = NULL; - List *outer_tlist = NULL; - TargetEntry *xtl = (TargetEntry *)NULL; - List *qptlist = ((Plan*)join)->targetlist; - - foreach(entry, qptlist) { - List *joinvar; - - xtl = (TargetEntry *)lfirst(entry); - inner_tlist = ((inner==NULL) ? NIL : inner->targetlist); - outer_tlist = ((outer==NULL) ? NIL : outer->targetlist); - joinvar = replace_clause_joinvar_refs((Expr*)get_expr(xtl), - outer_tlist, - inner_tlist); - - temp = MakeTLE(xtl->resdom, (Node*)joinvar); - new_join_targetlist = lappend(new_join_targetlist,temp); - } - - ((Plan*)join)->targetlist = new_join_targetlist; - if (outer!=NULL) - set_tlist_references(outer); - if (inner!=NULL) - set_tlist_references(inner); + Plan *outer = ((Plan *) join)->lefttree; + Plan *inner = ((Plan *) join)->righttree; + List *new_join_targetlist = NIL; + TargetEntry *temp = (TargetEntry *) NULL; + List *entry = NIL; + List *inner_tlist = NULL; + List *outer_tlist = NULL; + TargetEntry *xtl = (TargetEntry *) NULL; + List *qptlist = ((Plan *) join)->targetlist; + + foreach(entry, qptlist) + { + List *joinvar; + + xtl = (TargetEntry *) lfirst(entry); + inner_tlist = ((inner == NULL) ? NIL : inner->targetlist); + outer_tlist = ((outer == NULL) ? NIL : outer->targetlist); + joinvar = replace_clause_joinvar_refs((Expr *) get_expr(xtl), + outer_tlist, + inner_tlist); + + temp = MakeTLE(xtl->resdom, (Node *) joinvar); + new_join_targetlist = lappend(new_join_targetlist, temp); + } + + ((Plan *) join)->targetlist = new_join_targetlist; + if (outer != NULL) + set_tlist_references(outer); + if (inner != NULL) + set_tlist_references(inner); } -/* +/* * set-tempscan-tlist-references-- - * Modifies the target list of a node that scans a temp relation (i.e., a - * sort or hash node) so that the varnos refer to the child temporary. - * + * Modifies the target list of a node that scans a temp relation (i.e., a + * sort or hash node) so that the varnos refer to the child temporary. + * * 'tempscan' is a seqscan node - * + * * Returns nothing of interest, but modifies internal fields of nodes. - * + * */ static void -set_tempscan_tlist_references(SeqScan *tempscan) +set_tempscan_tlist_references(SeqScan * tempscan) { - Temp *temp = (Temp*)((Plan*)tempscan)->lefttree; + Temp *temp = (Temp *) ((Plan *) tempscan)->lefttree; - ((Plan*)tempscan)->targetlist = - tlist_temp_references(temp->tempid, - ((Plan*)tempscan)->targetlist); - set_temp_tlist_references(temp); + ((Plan *) tempscan)->targetlist = + tlist_temp_references(temp->tempid, + ((Plan *) tempscan)->targetlist); + set_temp_tlist_references(temp); } -/* +/* * set-temp-tlist-references-- - * The temp's vars are made consistent with (actually, identical to) the - * modified version of the target list of the node from which temp node - * receives its tuples. - * + * The temp's vars are made consistent with (actually, identical to) the + * modified version of the target list of the node from which temp node + * receives its tuples. + * * 'temp' is a temp (e.g., sort, hash) plan node - * + * * Returns nothing of interest, but modifies internal fields of nodes. - * + * */ static void -set_temp_tlist_references(Temp *temp) +set_temp_tlist_references(Temp * temp) { - Plan *source = ((Plan*)temp)->lefttree; - - if (source!=NULL) { - set_tlist_references(source); - ((Plan*)temp)->targetlist = - copy_vars(((Plan*)temp)->targetlist , - (source)->targetlist); - } else { - elog(WARN, "calling set_temp_tlist_references with empty lefttree"); - } + Plan *source = ((Plan *) temp)->lefttree; + + if (source != NULL) + { + set_tlist_references(source); + ((Plan *) temp)->targetlist = + copy_vars(((Plan *) temp)->targetlist, + (source)->targetlist); + } + else + { + elog(WARN, "calling set_temp_tlist_references with empty lefttree"); + } } -/* +/* * join-references-- - * Creates a new set of join clauses by replacing the varno/varattno - * values of variables in the clauses to reference target list values - * from the outer and inner join relation target lists. - * + * Creates a new set of join clauses by replacing the varno/varattno + * values of variables in the clauses to reference target list values + * from the outer and inner join relation target lists. + * * 'clauses' is the list of join clauses * 'outer-tlist' is the target list of the outer join relation * 'inner-tlist' is the target list of the inner join relation - * + * * Returns the new join clauses. - * + * */ -List * -join_references(List *clauses, - List *outer_tlist, - List *inner_tlist) +List * +join_references(List * clauses, + List * outer_tlist, + List * inner_tlist) { - return (replace_subclause_joinvar_refs(clauses, - outer_tlist, - inner_tlist)); + return (replace_subclause_joinvar_refs(clauses, + outer_tlist, + inner_tlist)); } -/* +/* * index-outerjoin-references-- - * Given a list of join clauses, replace the operand corresponding to the - * outer relation in the join with references to the corresponding target - * list element in 'outer-tlist' (the outer is rather obscurely - * identified as the side that doesn't contain a var whose varno equals - * 'inner-relid'). - * - * As a side effect, the operator is replaced by the regproc id. - * + * Given a list of join clauses, replace the operand corresponding to the + * outer relation in the join with references to the corresponding target + * list element in 'outer-tlist' (the outer is rather obscurely + * identified as the side that doesn't contain a var whose varno equals + * 'inner-relid'). + * + * As a side effect, the operator is replaced by the regproc id. + * * 'inner-indxqual' is the list of join clauses (so-called because they * are used as qualifications for the inner (inbex) scan of a nestloop) - * + * * Returns the new list of clauses. - * + * */ -List * -index_outerjoin_references(List *inner_indxqual, - List *outer_tlist, - Index inner_relid) +List * +index_outerjoin_references(List * inner_indxqual, + List * outer_tlist, + Index inner_relid) { - List *t_list = NIL; - Expr *temp = NULL; - List *t_clause = NIL; - Expr *clause = NULL; + List *t_list = NIL; + Expr *temp = NULL; + List *t_clause = NIL; + Expr *clause = NULL; - foreach (t_clause,inner_indxqual) { - clause = lfirst(t_clause); - /* - * if inner scan on the right. - */ - if (OperandIsInner((Node*)get_rightop(clause), inner_relid)) { - Var *joinvar = (Var*) - replace_clause_joinvar_refs((Expr*)get_leftop(clause), - outer_tlist, - NIL); - temp = make_opclause(replace_opid((Oper*)((Expr*)clause)->oper), - joinvar, - get_rightop(clause)); - t_list = lappend(t_list,temp); - } else { - /* inner scan on left */ - Var *joinvar = (Var*) - replace_clause_joinvar_refs((Expr*)get_rightop(clause), - outer_tlist, - NIL); - temp = make_opclause(replace_opid((Oper*)((Expr*)clause)->oper), - get_leftop(clause), - joinvar); - t_list = lappend(t_list,temp); - } - - } - return(t_list); + foreach(t_clause, inner_indxqual) + { + clause = lfirst(t_clause); + + /* + * if inner scan on the right. + */ + if (OperandIsInner((Node *) get_rightop(clause), inner_relid)) + { + Var *joinvar = (Var *) + replace_clause_joinvar_refs((Expr *) get_leftop(clause), + outer_tlist, + NIL); + + temp = make_opclause(replace_opid((Oper *) ((Expr *) clause)->oper), + joinvar, + get_rightop(clause)); + t_list = lappend(t_list, temp); + } + else + { + /* inner scan on left */ + Var *joinvar = (Var *) + replace_clause_joinvar_refs((Expr *) get_rightop(clause), + outer_tlist, + NIL); + + temp = make_opclause(replace_opid((Oper *) ((Expr *) clause)->oper), + get_leftop(clause), + joinvar); + t_list = lappend(t_list, temp); + } + + } + return (t_list); } -/* +/* * replace-clause-joinvar-refs * replace-subclause-joinvar-refs * replace-joinvar-refs - * - * Replaces all variables within a join clause with a new var node - * whose varno/varattno fields contain a reference to a target list - * element from either the outer or inner join relation. - * + * + * Replaces all variables within a join clause with a new var node + * whose varno/varattno fields contain a reference to a target list + * element from either the outer or inner join relation. + * * 'clause' is the join clause * 'outer-tlist' is the target list of the outer join relation * 'inner-tlist' is the target list of the inner join relation - * + * * Returns the new join clause. - * + * */ -static List * -replace_clause_joinvar_refs(Expr *clause, - List *outer_tlist, - List *inner_tlist) +static List * +replace_clause_joinvar_refs(Expr * clause, + List * outer_tlist, + List * inner_tlist) { - List *temp = NULL; + List *temp = NULL; - if(IsA (clause,Var)) { - temp = (List*)replace_joinvar_refs((Var*)clause, - outer_tlist,inner_tlist); - if(temp) - return(temp); - else - if (clause != NULL) - return((List*)clause); - else - return(NIL); - } else if (single_node((Node*)clause)) { - return ((List*)clause); - } else if (or_clause((Node*)clause)) { - List *orclause = - replace_subclause_joinvar_refs(((Expr*)clause)->args, - outer_tlist, - inner_tlist); - return ((List*)make_orclause(orclause)); - } else if (IsA(clause,ArrayRef)) { - ArrayRef *aref = (ArrayRef *)clause; - - temp = replace_subclause_joinvar_refs(aref->refupperindexpr, - outer_tlist, - inner_tlist); - aref->refupperindexpr = (List*)temp; - temp = replace_subclause_joinvar_refs(aref->reflowerindexpr, - outer_tlist, - inner_tlist); - aref->reflowerindexpr = (List*)temp; - temp = replace_clause_joinvar_refs((Expr*)aref->refexpr, - outer_tlist, - inner_tlist); - aref->refexpr = (Node*)temp; + if (IsA(clause, Var)) + { + temp = (List *) replace_joinvar_refs((Var *) clause, + outer_tlist, inner_tlist); + if (temp) + return (temp); + else if (clause != NULL) + return ((List *) clause); + else + return (NIL); + } + else if (single_node((Node *) clause)) + { + return ((List *) clause); + } + else if (or_clause((Node *) clause)) + { + List *orclause = + replace_subclause_joinvar_refs(((Expr *) clause)->args, + outer_tlist, + inner_tlist); - /* - * no need to set refassgnexpr. we only set that in the - * target list on replaces, and this is an array reference - * in the qualification. if we got this far, it's 0x0 in - * the ArrayRef structure 'clause'. - */ + return ((List *) make_orclause(orclause)); + } + else if (IsA(clause, ArrayRef)) + { + ArrayRef *aref = (ArrayRef *) clause; + + temp = replace_subclause_joinvar_refs(aref->refupperindexpr, + outer_tlist, + inner_tlist); + aref->refupperindexpr = (List *) temp; + temp = replace_subclause_joinvar_refs(aref->reflowerindexpr, + outer_tlist, + inner_tlist); + aref->reflowerindexpr = (List *) temp; + temp = replace_clause_joinvar_refs((Expr *) aref->refexpr, + outer_tlist, + inner_tlist); + aref->refexpr = (Node *) temp; + + /* + * no need to set refassgnexpr. we only set that in the target + * list on replaces, and this is an array reference in the + * qualification. if we got this far, it's 0x0 in the ArrayRef + * structure 'clause'. + */ + + return ((List *) clause); + } + else if (is_funcclause((Node *) clause)) + { + List *funcclause = + replace_subclause_joinvar_refs(((Expr *) clause)->args, + outer_tlist, + inner_tlist); + + return ((List *) make_funcclause((Func *) ((Expr *) clause)->oper, + funcclause)); + } + else if (not_clause((Node *) clause)) + { + List *notclause = + replace_clause_joinvar_refs(get_notclausearg(clause), + outer_tlist, + inner_tlist); - return((List*)clause); - } else if (is_funcclause((Node*)clause)) { - List *funcclause = - replace_subclause_joinvar_refs(((Expr*)clause)->args, - outer_tlist, - inner_tlist); - return ((List*)make_funcclause((Func*)((Expr*)clause)->oper, - funcclause)); - } else if (not_clause((Node*)clause)) { - List *notclause = - replace_clause_joinvar_refs(get_notclausearg(clause), - outer_tlist, - inner_tlist); - return ((List*)make_notclause((Expr*)notclause)); - } else if (is_opclause((Node*)clause)) { - Var *leftvar = - (Var*)replace_clause_joinvar_refs((Expr*)get_leftop(clause), - outer_tlist, - inner_tlist); - Var *rightvar = - (Var*)replace_clause_joinvar_refs((Expr*)get_rightop(clause), - outer_tlist, - inner_tlist); - return ((List*)make_opclause(replace_opid((Oper*)((Expr*)clause)->oper), - leftvar, - rightvar)); - } - /* shouldn't reach here */ - return NULL; + return ((List *) make_notclause((Expr *) notclause)); + } + else if (is_opclause((Node *) clause)) + { + Var *leftvar = + (Var *) replace_clause_joinvar_refs((Expr *) get_leftop(clause), + outer_tlist, + inner_tlist); + Var *rightvar = + (Var *) replace_clause_joinvar_refs((Expr *) get_rightop(clause), + outer_tlist, + inner_tlist); + + return ((List *) make_opclause(replace_opid((Oper *) ((Expr *) clause)->oper), + leftvar, + rightvar)); + } + /* shouldn't reach here */ + return NULL; } -static List * -replace_subclause_joinvar_refs(List *clauses, - List *outer_tlist, - List *inner_tlist) +static List * +replace_subclause_joinvar_refs(List * clauses, + List * outer_tlist, + List * inner_tlist) { - List *t_list = NIL; - List *temp = NIL; - List *clause = NIL; - - foreach (clause,clauses) { - temp = replace_clause_joinvar_refs(lfirst(clause), - outer_tlist, - inner_tlist); - t_list = lappend(t_list,temp); - } - return(t_list); + List *t_list = NIL; + List *temp = NIL; + List *clause = NIL; + + foreach(clause, clauses) + { + temp = replace_clause_joinvar_refs(lfirst(clause), + outer_tlist, + inner_tlist); + t_list = lappend(t_list, temp); + } + return (t_list); } -static Var * -replace_joinvar_refs(Var *var, List *outer_tlist, List *inner_tlist) +static Var * +replace_joinvar_refs(Var * var, List * outer_tlist, List * inner_tlist) { - Resdom *outer_resdom =(Resdom*)NULL; - - outer_resdom= tlist_member(var,outer_tlist); - - if (outer_resdom!=NULL && IsA (outer_resdom,Resdom) ) { - return (makeVar (OUTER, - outer_resdom->resno, - var->vartype, - var->varnoold, - var->varoattno)); - } else { - Resdom *inner_resdom; - inner_resdom = tlist_member(var,inner_tlist); - if ( inner_resdom!=NULL && IsA (inner_resdom,Resdom) ) { - return (makeVar (INNER, - inner_resdom->resno, - var->vartype, - var->varnoold, - var->varoattno)); - } - } - return (Var*)NULL; + Resdom *outer_resdom = (Resdom *) NULL; + + outer_resdom = tlist_member(var, outer_tlist); + + if (outer_resdom != NULL && IsA(outer_resdom, Resdom)) + { + return (makeVar(OUTER, + outer_resdom->resno, + var->vartype, + var->varnoold, + var->varoattno)); + } + else + { + Resdom *inner_resdom; + + inner_resdom = tlist_member(var, inner_tlist); + if (inner_resdom != NULL && IsA(inner_resdom, Resdom)) + { + return (makeVar(INNER, + inner_resdom->resno, + var->vartype, + var->varnoold, + var->varoattno)); + } + } + return (Var *) NULL; } -/* +/* * tlist-temp-references-- - * Creates a new target list for a node that scans a temp relation, - * setting the varnos to the id of the temp relation and setting varids - * if necessary (varids are only needed if this is a targetlist internal - * to the tree, in which case the targetlist entry always contains a var - * node, so we can just copy it from the temp). - * + * Creates a new target list for a node that scans a temp relation, + * setting the varnos to the id of the temp relation and setting varids + * if necessary (varids are only needed if this is a targetlist internal + * to the tree, in which case the targetlist entry always contains a var + * node, so we can just copy it from the temp). + * * 'tempid' is the id of the temp relation * 'tlist' is the target list to be modified - * + * * Returns new target list - * + * */ -static List * -tlist_temp_references(Oid tempid, - List *tlist) +static List * +tlist_temp_references(Oid tempid, + List * tlist) { - List *t_list = NIL; - TargetEntry *temp = (TargetEntry *)NULL; - TargetEntry *xtl = NULL; - List *entry; - - foreach (entry, tlist) { - AttrNumber oattno; - - xtl = lfirst(entry); - if (IsA(get_expr(xtl), Var)) - oattno = ((Var*)xtl->expr)->varoattno; - else - oattno = 0; - - temp = MakeTLE(xtl->resdom, - (Node*)makeVar(tempid, - xtl->resdom->resno, - xtl->resdom->restype, - tempid, - oattno)); - - t_list = lappend(t_list,temp); - } - return(t_list); + List *t_list = NIL; + TargetEntry *temp = (TargetEntry *) NULL; + TargetEntry *xtl = NULL; + List *entry; + + foreach(entry, tlist) + { + AttrNumber oattno; + + xtl = lfirst(entry); + if (IsA(get_expr(xtl), Var)) + oattno = ((Var *) xtl->expr)->varoattno; + else + oattno = 0; + + temp = MakeTLE(xtl->resdom, + (Node *) makeVar(tempid, + xtl->resdom->resno, + xtl->resdom->restype, + tempid, + oattno)); + + t_list = lappend(t_list, temp); + } + return (t_list); } /*--------------------------------------------------------- @@ -456,45 +505,49 @@ tlist_temp_references(Oid tempid, * addresses the tuples returned by its left tree subplan. * * NOTE: - * 1) we ignore the right tree! (in the current implementation - * it is always nil - * 2) this routine will probably *NOT* work with nested dot - * fields.... + * 1) we ignore the right tree! (in the current implementation + * it is always nil + * 2) this routine will probably *NOT* work with nested dot + * fields.... */ void -set_result_tlist_references(Result *resultNode) +set_result_tlist_references(Result * resultNode) { - Plan *subplan; - List *resultTargetList; - List *subplanTargetList; - List *t; - TargetEntry *entry; - Expr *expr; - - resultTargetList= ((Plan*)resultNode)->targetlist; - - /* - * NOTE: we only consider the left tree subplan. - * This is usually a seq scan. - */ - 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 of the form (Resdom_Node Expression). - * For every expression clause, call "replace_result_clause()" - * to appropriatelly change all the Var nodes. - */ - foreach (t, resultTargetList) { - entry = (TargetEntry *)lfirst(t); - expr = (Expr*) get_expr(entry); - replace_result_clause((List*)expr, subplanTargetList); - } + Plan *subplan; + List *resultTargetList; + List *subplanTargetList; + List *t; + TargetEntry *entry; + Expr *expr; + + resultTargetList = ((Plan *) resultNode)->targetlist; + + /* + * NOTE: we only consider the left tree subplan. This is usually a seq + * scan. + */ + 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 + * of the form (Resdom_Node Expression). For every expression clause, + * call "replace_result_clause()" to appropriatelly change all the Var + * nodes. + */ + foreach(t, resultTargetList) + { + entry = (TargetEntry *) lfirst(t); + expr = (Expr *) get_expr(entry); + replace_result_clause((List *) expr, subplanTargetList); + } } /*--------------------------------------------------------- @@ -504,100 +557,121 @@ set_result_tlist_references(Result *resultNode) * This routine is called from set_result_tlist_references(). * and modifies the expressions of the target list of a Result * node so that all Var nodes reference the target list of its subplan. - * + * */ static void -replace_result_clause(List *clause, - List *subplanTargetList) /* target list of the - subplan */ +replace_result_clause(List * clause, + List * subplanTargetList) /* target list of the + * subplan */ { - List *t; - List *subClause; - TargetEntry *subplanVar; + List *t; + List *subClause; + TargetEntry *subplanVar; - if (IsA(clause,Var)) { - /* - * Ha! A Var node! - */ - subplanVar = match_varid((Var*)clause, subplanTargetList); - /* - * Change the varno & varattno fields of the - * var node. - * - */ - ((Var*)clause)->varno = (Index)OUTER; - ((Var*)clause)->varattno = subplanVar->resdom->resno; - } else if (is_funcclause((Node*)clause)) { - /* - * This is a function. Recursively call this routine - * for its arguments... - */ - subClause = ((Expr*)clause)->args; - foreach (t, subClause) { - replace_result_clause(lfirst(t),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... - */ - subClause = aref->refupperindexpr; - foreach (t, subClause) { - replace_result_clause(lfirst(t),subplanTargetList); - } - subClause = aref->reflowerindexpr; - foreach (t, subClause) { - replace_result_clause(lfirst(t),subplanTargetList); - } - replace_result_clause((List*)aref->refexpr, - subplanTargetList); - replace_result_clause((List*)aref->refassgnexpr, - subplanTargetList); - } else if (is_opclause((Node*)clause)) { - /* - * This is an operator. Recursively call this routine - * for both its left and right operands - */ - subClause = (List*)get_leftop((Expr*)clause); - replace_result_clause(subClause,subplanTargetList); - subClause = (List*)get_rightop((Expr*)clause); - replace_result_clause(subClause,subplanTargetList); - } else if (IsA(clause,Param) || IsA(clause,Const)) { - /* do nothing! */ - } else { - /* - * Ooops! we can not handle that! - */ - elog(WARN,"replace_result_clause: Can not handle this tlist!\n"); - } + if (IsA(clause, Var)) + { + + /* + * Ha! A Var node! + */ + subplanVar = match_varid((Var *) clause, subplanTargetList); + + /* + * Change the varno & varattno fields of the var node. + * + */ + ((Var *) clause)->varno = (Index) OUTER; + ((Var *) clause)->varattno = subplanVar->resdom->resno; + } + else if (is_funcclause((Node *) clause)) + { + + /* + * This is a function. Recursively call this routine for its + * arguments... + */ + subClause = ((Expr *) clause)->args; + foreach(t, subClause) + { + replace_result_clause(lfirst(t), 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... + */ + subClause = aref->refupperindexpr; + foreach(t, subClause) + { + replace_result_clause(lfirst(t), subplanTargetList); + } + subClause = aref->reflowerindexpr; + foreach(t, subClause) + { + replace_result_clause(lfirst(t), subplanTargetList); + } + replace_result_clause((List *) aref->refexpr, + subplanTargetList); + replace_result_clause((List *) aref->refassgnexpr, + subplanTargetList); + } + else if (is_opclause((Node *) clause)) + { + + /* + * This is an operator. Recursively call this routine for both its + * left and right operands + */ + subClause = (List *) get_leftop((Expr *) clause); + replace_result_clause(subClause, subplanTargetList); + subClause = (List *) get_rightop((Expr *) clause); + replace_result_clause(subClause, subplanTargetList); + } + else if (IsA(clause, Param) || IsA(clause, Const)) + { + /* do nothing! */ + } + else + { + + /* + * Ooops! we can not handle that! + */ + elog(WARN, "replace_result_clause: Can not handle this tlist!\n"); + } } static -bool OperandIsInner(Node *opnd, int inner_relid) +bool +OperandIsInner(Node * opnd, int inner_relid) { - /* - * Can be the inner scan if its a varnode or a function and the - * inner_relid is equal to the varnode's var number or in the - * case of a function the first argument's var number (all args - * in a functional index are from the same relation). - */ - if ( IsA (opnd,Var) && - (inner_relid == ((Var*)opnd)->varno) ) + + /* + * Can be the inner scan if its a varnode or a function and the + * inner_relid is equal to the varnode's var number or in the case of + * a function the first argument's var number (all args in a + * functional index are from the same relation). + */ + if (IsA(opnd, Var) && + (inner_relid == ((Var *) opnd)->varno)) { - return true; + return true; } - if (is_funcclause(opnd)) + if (is_funcclause(opnd)) { - List *firstArg = lfirst(((Expr*)opnd)->args); + List *firstArg = lfirst(((Expr *) opnd)->args); - if ( IsA (firstArg,Var) && - (inner_relid == ((Var*)firstArg)->varno) ) + if (IsA(firstArg, Var) && + (inner_relid == ((Var *) firstArg)->varno)) { - return true; + return true; } } - return false; + return false; } /***************************************************************************** @@ -607,105 +681,125 @@ bool OperandIsInner(Node *opnd, int inner_relid) /*--------------------------------------------------------- * * set_agg_tlist_references - - * changes the target list of an Agg node so that it points to - * the tuples returned by its left tree subplan. + * changes the target list of an Agg node so that it points to + * the tuples returned by its left tree subplan. * */ void -set_agg_tlist_references(Agg *aggNode) +set_agg_tlist_references(Agg * aggNode) { - List *aggTargetList; - List *subplanTargetList; - List *tl; + List *aggTargetList; + List *subplanTargetList; + List *tl; - aggTargetList = aggNode->plan.targetlist; - subplanTargetList = aggNode->plan.lefttree->targetlist; + aggTargetList = aggNode->plan.targetlist; + subplanTargetList = aggNode->plan.lefttree->targetlist; - foreach (tl, aggTargetList) { - TargetEntry *tle = lfirst(tl); + foreach(tl, aggTargetList) + { + TargetEntry *tle = lfirst(tl); - replace_agg_clause(tle->expr, subplanTargetList); - } + replace_agg_clause(tle->expr, subplanTargetList); + } } void -set_agg_agglist_references(Agg *aggNode) +set_agg_agglist_references(Agg * aggNode) { - List *subplanTargetList; - Aggreg **aggs; - int i; + List *subplanTargetList; + Aggreg **aggs; + int i; - aggs = aggNode->aggs; - subplanTargetList = aggNode->plan.lefttree->targetlist; + aggs = aggNode->aggs; + subplanTargetList = aggNode->plan.lefttree->targetlist; - for (i = 0; i < aggNode->numAgg; i++) { - replace_agg_clause(aggs[i]->target, subplanTargetList); - } + for (i = 0; i < aggNode->numAgg; i++) + { + replace_agg_clause(aggs[i]->target, subplanTargetList); + } } static void -replace_agg_clause(Node *clause, List *subplanTargetList) +replace_agg_clause(Node * clause, List * subplanTargetList) { - List *t; - TargetEntry *subplanVar; + List *t; + TargetEntry *subplanVar; - if (IsA(clause,Var)) { - /* - * Ha! A Var node! - */ - subplanVar = match_varid((Var*)clause, subplanTargetList); - /* - * Change the varno & varattno fields of the - * var node. - * - */ - ((Var*)clause)->varattno = subplanVar->resdom->resno; - } 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); - } - } else if (IsA(clause,Aggreg)) { - replace_agg_clause(((Aggreg*)clause)->target, subplanTargetList); - } else if (IsA(clause,ArrayRef)) { - ArrayRef *aref = (ArrayRef *)clause; + if (IsA(clause, Var)) + { - /* - * 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); + /* + * Ha! A Var node! + */ + subplanVar = match_varid((Var *) clause, subplanTargetList); + + /* + * Change the varno & varattno fields of the var node. + * + */ + ((Var *) clause)->varattno = subplanVar->resdom->resno; + } + 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); + } } - foreach (t, aref->reflowerindexpr) { - replace_agg_clause(lfirst(t),subplanTargetList); + else if (IsA(clause, Aggreg)) + { + replace_agg_clause(((Aggreg *) clause)->target, subplanTargetList); } - replace_agg_clause(aref->refexpr, subplanTargetList); - replace_agg_clause(aref->refassgnexpr, subplanTargetList); - } else if (is_opclause(clause)) { - /* - * This is an operator. Recursively call this routine - * for both its left and right operands - */ - Node *left = (Node*)get_leftop((Expr*)clause); - Node *right = (Node*)get_rightop((Expr*)clause); - - if ( left != (Node*) NULL ) - replace_agg_clause(left, subplanTargetList); - if ( right != (Node*) NULL ) - replace_agg_clause(right, subplanTargetList); - } else if (IsA(clause,Param) || IsA(clause,Const)) { - /* do nothing! */ - } else { - /* - * Ooops! we can not handle that! - */ - elog(WARN,"replace_agg_clause: Can not handle this tlist!\n"); - } + 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); + } + foreach(t, aref->reflowerindexpr) + { + replace_agg_clause(lfirst(t), subplanTargetList); + } + replace_agg_clause(aref->refexpr, subplanTargetList); + replace_agg_clause(aref->refassgnexpr, subplanTargetList); + } + else if (is_opclause(clause)) + { + + /* + * This is an operator. Recursively call this routine for both its + * left and right operands + */ + Node *left = (Node *) get_leftop((Expr *) clause); + Node *right = (Node *) get_rightop((Expr *) clause); + + if (left != (Node *) NULL) + replace_agg_clause(left, subplanTargetList); + if (right != (Node *) NULL) + replace_agg_clause(right, subplanTargetList); + } + else if (IsA(clause, Param) || IsA(clause, Const)) + { + /* do nothing! */ + } + else + { + /* + * Ooops! we can not handle that! + */ + elog(WARN, "replace_agg_clause: Can not handle this tlist!\n"); + } +} |