@@ -113,6 +113,9 @@ static void handle_modification_query(Query *parse, transform_query_cxt *context
113
113
static void partition_filter_visitor (Plan * plan , void * context );
114
114
static void partition_router_visitor (Plan * plan , void * context );
115
115
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
+
116
119
static Oid find_deepest_partition (Oid relid , Index rti , Expr * quals );
117
120
static Node * eval_extern_params_mutator (Node * node , ParamListInfo params );
118
121
static Node * adjust_appendrel_varnos (Node * node , adjust_appendrel_varnos_cxt * context );
@@ -152,9 +155,9 @@ reset_query_id_generator(void)
152
155
* 'visitor' is applied right before return.
153
156
*/
154
157
void
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 )
158
161
{
159
162
ListCell * l ;
160
163
@@ -167,50 +170,152 @@ plan_tree_walker(Plan *plan,
167
170
switch (nodeTag (plan ))
168
171
{
169
172
case T_SubqueryScan :
170
- plan_tree_walker (((SubqueryScan * ) plan )-> subplan , visitor , context );
173
+ plan_tree_visitor (((SubqueryScan * ) plan )-> subplan , visitor , context );
171
174
break ;
172
175
173
176
case 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 );
176
179
break ;
177
180
178
181
case T_ModifyTable :
179
182
foreach (l , ((ModifyTable * ) plan )-> plans )
180
- plan_tree_walker ((Plan * ) lfirst (l ), visitor , context );
183
+ plan_tree_visitor ((Plan * ) lfirst (l ), visitor , context );
181
184
break ;
182
185
183
186
case 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 );
186
189
break ;
187
190
188
191
case 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 );
191
194
break ;
192
195
193
196
case 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 );
196
199
break ;
197
200
198
201
case 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 );
201
204
break ;
202
205
203
206
default :
204
207
break ;
205
208
}
206
209
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 );
209
212
210
213
/* Apply visitor to the current node */
211
214
visitor (plan , context );
212
215
}
213
216
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
+
214
319
215
320
/*
216
321
* -------------------------------
@@ -586,15 +691,15 @@ void
586
691
add_partition_filters (List * rtable , Plan * plan )
587
692
{
588
693
if (pg_pathman_enable_partition_filter )
589
- plan_tree_walker (plan , partition_filter_visitor , rtable );
694
+ plan_tree_visitor (plan , partition_filter_visitor , rtable );
590
695
}
591
696
592
697
/* Add PartitionRouter nodes to the plan tree */
593
698
void
594
699
add_partition_routers (List * rtable , Plan * plan )
595
700
{
596
701
if (pg_pathman_enable_partition_router )
597
- plan_tree_walker (plan , partition_router_visitor , rtable );
702
+ plan_tree_visitor (plan , partition_router_visitor , rtable );
598
703
}
599
704
600
705
/*
0 commit comments