99 *
1010 *
1111 * IDENTIFICATION
12- * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/setrefs.c,v 1.77 2002/05/1800:42:55 tgl Exp $
12+ * $Header: /cvsroot/pgsql/src/backend/optimizer/plan/setrefs.c,v 1.78 2002/05/1802:25:50 tgl Exp $
1313 *
1414 *-------------------------------------------------------------------------
1515 */
2828
2929typedef struct
3030{
31- Query * root ;
31+ List * rtable ;
3232List * outer_tlist ;
3333List * inner_tlist ;
3434Index acceptable_rel ;
@@ -42,7 +42,7 @@ typedef struct
4242}replace_vars_with_subplan_refs_context ;
4343
4444static void fix_expr_references (Plan * plan ,Node * node );
45- static void set_join_references (Query * root , Join * join );
45+ static void set_join_references (Join * join , List * rtable );
4646static void set_uppernode_references (Plan * plan ,Index subvarno );
4747static Node * join_references_mutator (Node * node ,
4848join_references_context * context );
@@ -75,7 +75,7 @@ static bool fix_opids_walker(Node *node, void *context);
7575 * Returns nothing of interest, but modifies internal fields of nodes.
7676 */
7777void
78- set_plan_references (Query * root , Plan * plan )
78+ set_plan_references (Plan * plan , List * rtable )
7979{
8080List * pl ;
8181
@@ -110,16 +110,24 @@ set_plan_references(Query *root, Plan *plan)
110110fix_expr_references (plan , (Node * )plan -> qual );
111111break ;
112112case T_SubqueryScan :
113+ {
114+ RangeTblEntry * rte ;
113115
114- /*
115- * We do not do set_uppernode_references() here, because a
116- * SubqueryScan will always have been created with correct
117- * references to its subplan's outputs to begin with.
118- */
119- fix_expr_references (plan , (Node * )plan -> targetlist );
120- fix_expr_references (plan , (Node * )plan -> qual );
121- /* Recurse into subplan too */
122- set_plan_references (root , ((SubqueryScan * )plan )-> subplan );
116+ /*
117+ * We do not do set_uppernode_references() here, because a
118+ * SubqueryScan will always have been created with correct
119+ * references to its subplan's outputs to begin with.
120+ */
121+ fix_expr_references (plan , (Node * )plan -> targetlist );
122+ fix_expr_references (plan , (Node * )plan -> qual );
123+
124+ /* Recurse into subplan too */
125+ rte = rt_fetch (((SubqueryScan * )plan )-> scan .scanrelid ,
126+ rtable );
127+ Assert (rte -> rtekind == RTE_SUBQUERY );
128+ set_plan_references (((SubqueryScan * )plan )-> subplan ,
129+ rte -> subquery -> rtable );
130+ }
123131break ;
124132case T_FunctionScan :
125133{
@@ -128,27 +136,27 @@ set_plan_references(Query *root, Plan *plan)
128136fix_expr_references (plan , (Node * )plan -> targetlist );
129137fix_expr_references (plan , (Node * )plan -> qual );
130138rte = rt_fetch (((FunctionScan * )plan )-> scan .scanrelid ,
131- root -> rtable );
139+ rtable );
132140Assert (rte -> rtekind == RTE_FUNCTION );
133141fix_expr_references (plan ,rte -> funcexpr );
134142}
135143break ;
136144case T_NestLoop :
137- set_join_references (root , (Join * )plan );
145+ set_join_references ((Join * )plan , rtable );
138146fix_expr_references (plan , (Node * )plan -> targetlist );
139147fix_expr_references (plan , (Node * )plan -> qual );
140148fix_expr_references (plan , (Node * ) ((Join * )plan )-> joinqual );
141149break ;
142150case T_MergeJoin :
143- set_join_references (root , (Join * )plan );
151+ set_join_references ((Join * )plan , rtable );
144152fix_expr_references (plan , (Node * )plan -> targetlist );
145153fix_expr_references (plan , (Node * )plan -> qual );
146154fix_expr_references (plan , (Node * ) ((Join * )plan )-> joinqual );
147155fix_expr_references (plan ,
148156(Node * ) ((MergeJoin * )plan )-> mergeclauses );
149157break ;
150158case T_HashJoin :
151- set_join_references (root , (Join * )plan );
159+ set_join_references ((Join * )plan , rtable );
152160fix_expr_references (plan , (Node * )plan -> targetlist );
153161fix_expr_references (plan , (Node * )plan -> qual );
154162fix_expr_references (plan , (Node * ) ((Join * )plan )-> joinqual );
@@ -202,7 +210,7 @@ set_plan_references(Query *root, Plan *plan)
202210 * recurse into subplans.
203211 */
204212foreach (pl , ((Append * )plan )-> appendplans )
205- set_plan_references (root , (Plan * )lfirst (pl ));
213+ set_plan_references ((Plan * )lfirst (pl ), rtable );
206214break ;
207215default :
208216elog (ERROR ,"set_plan_references: unknown plan type %d" ,
@@ -219,21 +227,21 @@ set_plan_references(Query *root, Plan *plan)
219227 * plan's var nodes against the already-modified nodes of the
220228 * subplans.
221229 */
222- set_plan_references (root , plan -> lefttree );
223- set_plan_references (root , plan -> righttree );
230+ set_plan_references (plan -> lefttree , rtable );
231+ set_plan_references (plan -> righttree , rtable );
224232foreach (pl ,plan -> initPlan )
225233{
226234SubPlan * sp = (SubPlan * )lfirst (pl );
227235
228236Assert (IsA (sp ,SubPlan ));
229- set_plan_references (root ,sp -> plan );
237+ set_plan_references (sp -> plan ,sp -> rtable );
230238}
231239foreach (pl ,plan -> subPlan )
232240{
233241SubPlan * sp = (SubPlan * )lfirst (pl );
234242
235243Assert (IsA (sp ,SubPlan ));
236- set_plan_references (root ,sp -> plan );
244+ set_plan_references (sp -> plan ,sp -> rtable );
237245}
238246}
239247
@@ -269,18 +277,19 @@ fix_expr_references(Plan *plan, Node *node)
269277 * creation of a plan node by createplan.c and its fixing by this module.
270278 * Fortunately, there doesn't seem to be any need to do that.
271279 *
272- * 'join' is a join plan node
280+ *'join' is a join plan node
281+ *'rtable' is the associated range table
273282 */
274283static void
275- set_join_references (Query * root , Join * join )
284+ set_join_references (Join * join , List * rtable )
276285{
277286Plan * outer = join -> plan .lefttree ;
278287Plan * inner = join -> plan .righttree ;
279288List * outer_tlist = ((outer == NULL ) ?NIL :outer -> targetlist );
280289List * inner_tlist = ((inner == NULL ) ?NIL :inner -> targetlist );
281290
282291join -> plan .targetlist = join_references (join -> plan .targetlist ,
283- root ,
292+ rtable ,
284293outer_tlist ,
285294inner_tlist ,
286295(Index )0 );
@@ -374,6 +383,7 @@ set_uppernode_references(Plan *plan, Index subvarno)
374383 * pass inner_tlist = NIL and acceptable_rel = the ID of the inner relation.
375384 *
376385 * 'clauses' is the targetlist or list of join clauses
386+ * 'rtable' is the current range table
377387 * 'outer_tlist' is the target list of the outer join relation
378388 * 'inner_tlist' is the target list of the inner join relation, or NIL
379389 * 'acceptable_rel' is either zero or the rangetable index of a relation
@@ -384,14 +394,14 @@ set_uppernode_references(Plan *plan, Index subvarno)
384394 */
385395List *
386396join_references (List * clauses ,
387- Query * root ,
397+ List * rtable ,
388398List * outer_tlist ,
389399List * inner_tlist ,
390400Index acceptable_rel )
391401{
392402join_references_context context ;
393403
394- context .root = root ;
404+ context .rtable = rtable ;
395405context .outer_tlist = outer_tlist ;
396406context .inner_tlist = inner_tlist ;
397407context .acceptable_rel = acceptable_rel ;
@@ -432,7 +442,7 @@ join_references_mutator(Node *node,
432442
433443/* Perhaps it's a join alias that can be resolved to input vars? */
434444newnode = flatten_join_alias_vars ((Node * )var ,
435- context -> root ,
445+ context -> rtable ,
436446 true);
437447if (!equal (newnode , (Node * )var ))
438448{