diff options
author | Robert Haas <rhaas@postgresql.org> | 2015-09-17 11:24:49 -0400 |
---|---|---|
committer | Robert Haas <rhaas@postgresql.org> | 2015-09-17 11:27:06 -0400 |
commit | 8dd401aa07b91d46f81e51321523864d32843523 (patch) | |
tree | 6f4074de97647b077785649c11775a79101eb5b4 /src/backend/commands/explain.c | |
parent | 293fd7c77e40cdf06b7a9eb6db95379be8869b04 (diff) | |
download | postgresql-8dd401aa07b91d46f81e51321523864d32843523.tar.gz postgresql-8dd401aa07b91d46f81e51321523864d32843523.zip |
Add new function planstate_tree_walker.
ExplainPreScanNode knows how to iterate over a generic tree of plan
states; factor that logic out into a separate walker function so that
other code, such as upcoming patches for parallel query, can also use
it.
Patch by me, reviewed by Tom Lane.
Diffstat (limited to 'src/backend/commands/explain.c')
-rw-r--r-- | src/backend/commands/explain.c | 93 |
1 files changed, 3 insertions, 90 deletions
diff --git a/src/backend/commands/explain.c b/src/backend/commands/explain.c index 4f32400011f..f0d9e94eed2 100644 --- a/src/backend/commands/explain.c +++ b/src/backend/commands/explain.c @@ -55,10 +55,7 @@ static void ExplainOneQuery(Query *query, IntoClause *into, ExplainState *es, static void report_triggers(ResultRelInfo *rInfo, bool show_relname, ExplainState *es); static double elapsed_time(instr_time *starttime); -static void ExplainPreScanNode(PlanState *planstate, Bitmapset **rels_used); -static void ExplainPreScanMemberNodes(List *plans, PlanState **planstates, - Bitmapset **rels_used); -static void ExplainPreScanSubPlans(List *plans, Bitmapset **rels_used); +static bool ExplainPreScanNode(PlanState *planstate, Bitmapset **rels_used); static void ExplainNode(PlanState *planstate, List *ancestors, const char *relationship, const char *plan_name, ExplainState *es); @@ -724,7 +721,7 @@ elapsed_time(instr_time *starttime) * This ensures that we don't confusingly assign un-suffixed aliases to RTEs * that never appear in the EXPLAIN output (such as inheritance parents). */ -static void +static bool ExplainPreScanNode(PlanState *planstate, Bitmapset **rels_used) { Plan *plan = planstate->plan; @@ -764,91 +761,7 @@ ExplainPreScanNode(PlanState *planstate, Bitmapset **rels_used) break; } - /* initPlan-s */ - if (planstate->initPlan) - ExplainPreScanSubPlans(planstate->initPlan, rels_used); - - /* lefttree */ - if (outerPlanState(planstate)) - ExplainPreScanNode(outerPlanState(planstate), rels_used); - - /* righttree */ - if (innerPlanState(planstate)) - ExplainPreScanNode(innerPlanState(planstate), rels_used); - - /* special child plans */ - switch (nodeTag(plan)) - { - case T_ModifyTable: - ExplainPreScanMemberNodes(((ModifyTable *) plan)->plans, - ((ModifyTableState *) planstate)->mt_plans, - rels_used); - break; - case T_Append: - ExplainPreScanMemberNodes(((Append *) plan)->appendplans, - ((AppendState *) planstate)->appendplans, - rels_used); - break; - case T_MergeAppend: - ExplainPreScanMemberNodes(((MergeAppend *) plan)->mergeplans, - ((MergeAppendState *) planstate)->mergeplans, - rels_used); - break; - case T_BitmapAnd: - ExplainPreScanMemberNodes(((BitmapAnd *) plan)->bitmapplans, - ((BitmapAndState *) planstate)->bitmapplans, - rels_used); - break; - case T_BitmapOr: - ExplainPreScanMemberNodes(((BitmapOr *) plan)->bitmapplans, - ((BitmapOrState *) planstate)->bitmapplans, - rels_used); - break; - case T_SubqueryScan: - ExplainPreScanNode(((SubqueryScanState *) planstate)->subplan, - rels_used); - break; - default: - break; - } - - /* subPlan-s */ - if (planstate->subPlan) - ExplainPreScanSubPlans(planstate->subPlan, rels_used); -} - -/* - * Prescan the constituent plans of a ModifyTable, Append, MergeAppend, - * BitmapAnd, or BitmapOr node. - * - * Note: we don't actually need to examine the Plan list members, but - * we need the list in order to determine the length of the PlanState array. - */ -static void -ExplainPreScanMemberNodes(List *plans, PlanState **planstates, - Bitmapset **rels_used) -{ - int nplans = list_length(plans); - int j; - - for (j = 0; j < nplans; j++) - ExplainPreScanNode(planstates[j], rels_used); -} - -/* - * Prescan a list of SubPlans (or initPlans, which also use SubPlan nodes). - */ -static void -ExplainPreScanSubPlans(List *plans, Bitmapset **rels_used) -{ - ListCell *lst; - - foreach(lst, plans) - { - SubPlanState *sps = (SubPlanState *) lfirst(lst); - - ExplainPreScanNode(sps->planstate, rels_used); - } + return planstate_tree_walker(planstate, ExplainPreScanNode, rels_used); } /* |