@@ -113,6 +113,9 @@ static void handle_modification_query(Query *parse, transform_query_cxt *context
113113static void partition_filter_visitor (Plan * plan ,void * context );
114114static void partition_router_visitor (Plan * plan ,void * context );
115115
116+ static void state_visit_subplans (List * plans ,void (* visitor ) (),void * context );
117+ static void state_visit_members (PlanState * * planstates ,int nplans ,void (* visitor ) (),void * context );
118+
116119static Oid find_deepest_partition (Oid relid ,Index rti ,Expr * quals );
117120static Node * eval_extern_params_mutator (Node * node ,ParamListInfo params );
118121static Node * adjust_appendrel_varnos (Node * node ,adjust_appendrel_varnos_cxt * context );
@@ -152,9 +155,9 @@ reset_query_id_generator(void)
152155 * 'visitor' is applied right before return.
153156 */
154157void
155- plan_tree_walker (Plan * plan ,
156- void (* visitor ) (Plan * plan ,void * context ),
157- void * context )
158+ plan_tree_visitor (Plan * plan ,
159+ void (* visitor ) (Plan * plan ,void * context ),
160+ void * context )
158161{
159162ListCell * l ;
160163
@@ -167,50 +170,152 @@ plan_tree_walker(Plan *plan,
167170switch (nodeTag (plan ))
168171{
169172case T_SubqueryScan :
170- plan_tree_walker (((SubqueryScan * )plan )-> subplan ,visitor ,context );
173+ plan_tree_visitor (((SubqueryScan * )plan )-> subplan ,visitor ,context );
171174break ;
172175
173176case T_CustomScan :
174- foreach (l , ((CustomScan * )plan )-> custom_plans )
175- plan_tree_walker ((Plan * )lfirst (l ),visitor ,context );
177+ foreach (l , ((CustomScan * )plan )-> custom_plans )
178+ plan_tree_visitor ((Plan * )lfirst (l ),visitor ,context );
176179break ;
177180
178181case T_ModifyTable :
179182foreach (l , ((ModifyTable * )plan )-> plans )
180- plan_tree_walker ((Plan * )lfirst (l ),visitor ,context );
183+ plan_tree_visitor ((Plan * )lfirst (l ),visitor ,context );
181184break ;
182185
183186case T_Append :
184- foreach (l , ((Append * )plan )-> appendplans )
185- plan_tree_walker ((Plan * )lfirst (l ),visitor ,context );
187+ foreach (l , ((Append * )plan )-> appendplans )
188+ plan_tree_visitor ((Plan * )lfirst (l ),visitor ,context );
186189break ;
187190
188191case T_MergeAppend :
189- foreach (l , ((MergeAppend * )plan )-> mergeplans )
190- plan_tree_walker ((Plan * )lfirst (l ),visitor ,context );
192+ foreach (l , ((MergeAppend * )plan )-> mergeplans )
193+ plan_tree_visitor ((Plan * )lfirst (l ),visitor ,context );
191194break ;
192195
193196case T_BitmapAnd :
194- foreach (l , ((BitmapAnd * )plan )-> bitmapplans )
195- plan_tree_walker ((Plan * )lfirst (l ),visitor ,context );
197+ foreach (l , ((BitmapAnd * )plan )-> bitmapplans )
198+ plan_tree_visitor ((Plan * )lfirst (l ),visitor ,context );
196199break ;
197200
198201case T_BitmapOr :
199- foreach (l , ((BitmapOr * )plan )-> bitmapplans )
200- plan_tree_walker ((Plan * )lfirst (l ),visitor ,context );
202+ foreach (l , ((BitmapOr * )plan )-> bitmapplans )
203+ plan_tree_visitor ((Plan * )lfirst (l ),visitor ,context );
201204break ;
202205
203206default :
204207break ;
205208}
206209
207- plan_tree_walker (plan -> lefttree ,visitor ,context );
208- plan_tree_walker (plan -> righttree ,visitor ,context );
210+ plan_tree_visitor (plan -> lefttree ,visitor ,context );
211+ plan_tree_visitor (plan -> righttree ,visitor ,context );
209212
210213/* Apply visitor to the current node */
211214visitor (plan ,context );
212215}
213216
217+ void
218+ state_tree_visitor (PlanState * state ,
219+ void (* visitor ) (PlanState * plan ,void * context ),
220+ void * context )
221+ {
222+ Plan * plan ;
223+ ListCell * lc ;
224+
225+ if (state == NULL )
226+ return ;
227+
228+ plan = state -> plan ;
229+
230+ check_stack_depth ();
231+
232+ /* Plan-type-specific fixes */
233+ switch (nodeTag (plan ))
234+ {
235+ case T_SubqueryScan :
236+ state_tree_visitor (((SubqueryScanState * )state )-> subplan ,visitor ,context );
237+ break ;
238+
239+ case T_CustomScan :
240+ foreach (lc , ((CustomScanState * )state )-> custom_ps )
241+ state_tree_visitor ((PlanState * )lfirst (lc ),visitor ,context );
242+ break ;
243+
244+ case T_ModifyTable :
245+ state_visit_members (((ModifyTableState * )state )-> mt_plans ,
246+ ((ModifyTableState * )state )-> mt_nplans ,
247+ visitor ,context );
248+ break ;
249+
250+ case T_Append :
251+ state_visit_members (((AppendState * )state )-> appendplans ,
252+ ((AppendState * )state )-> as_nplans ,
253+ visitor ,context );
254+ break ;
255+
256+ case T_MergeAppend :
257+ state_visit_members (((MergeAppendState * )state )-> mergeplans ,
258+ ((MergeAppendState * )state )-> ms_nplans ,
259+ visitor ,context );
260+ break ;
261+
262+ case T_BitmapAnd :
263+ state_visit_members (((BitmapAndState * )state )-> bitmapplans ,
264+ ((BitmapAndState * )state )-> nplans ,
265+ visitor ,context );
266+ break ;
267+
268+ case T_BitmapOr :
269+ state_visit_members (((BitmapOrState * )state )-> bitmapplans ,
270+ ((BitmapOrState * )state )-> nplans ,
271+ visitor ,context );
272+ break ;
273+
274+ default :
275+ break ;
276+ }
277+
278+ state_visit_subplans (state -> initPlan ,visitor ,context );
279+ state_visit_subplans (state -> subPlan ,visitor ,context );
280+
281+ state_tree_visitor (state -> lefttree ,visitor ,context );
282+ state_tree_visitor (state -> righttree ,visitor ,context );
283+
284+ /* Apply visitor to the current node */
285+ visitor (state ,context );
286+ }
287+
288+ /*
289+ * Walk a list of SubPlans (or initPlans, which also use SubPlan nodes).
290+ */
291+ static void
292+ state_visit_subplans (List * plans ,
293+ void (* visitor ) (),
294+ void * context )
295+ {
296+ ListCell * lc ;
297+
298+ foreach (lc ,plans )
299+ {
300+ SubPlanState * sps = lfirst_node (SubPlanState ,lc );
301+ visitor (sps -> planstate ,context );
302+ }
303+ }
304+
305+ /*
306+ * Walk the constituent plans of a ModifyTable, Append, MergeAppend,
307+ * BitmapAnd, or BitmapOr node.
308+ */
309+ static void
310+ state_visit_members (PlanState * * planstates ,int nplans ,
311+ void (* visitor ) (),void * context )
312+ {
313+ int i ;
314+
315+ for (i = 0 ;i < nplans ;i ++ )
316+ visitor (planstates [i ],context );
317+ }
318+
214319
215320/*
216321 * -------------------------------
@@ -586,15 +691,15 @@ void
586691add_partition_filters (List * rtable ,Plan * plan )
587692{
588693if (pg_pathman_enable_partition_filter )
589- plan_tree_walker (plan ,partition_filter_visitor ,rtable );
694+ plan_tree_visitor (plan ,partition_filter_visitor ,rtable );
590695}
591696
592697/* Add PartitionRouter nodes to the plan tree */
593698void
594699add_partition_routers (List * rtable ,Plan * plan )
595700{
596701if (pg_pathman_enable_partition_router )
597- plan_tree_walker (plan ,partition_router_visitor ,rtable );
702+ plan_tree_visitor (plan ,partition_router_visitor ,rtable );
598703}
599704
600705/*