diff options
author | Robert Haas <rhaas@postgresql.org> | 2015-06-26 09:40:47 -0400 |
---|---|---|
committer | Robert Haas <rhaas@postgresql.org> | 2015-06-26 09:40:47 -0400 |
commit | 5ca611841bcd37c7ee8448c46c8398ef8d8edcc4 (patch) | |
tree | 492d1f96b9f0b3a25e321f6d58cba98b0a95bfd2 /src/backend/commands/explain.c | |
parent | 4b8e24b9ad308c30dbe2184e06848e638e018114 (diff) | |
download | postgresql-5ca611841bcd37c7ee8448c46c8398ef8d8edcc4.tar.gz postgresql-5ca611841bcd37c7ee8448c46c8398ef8d8edcc4.zip |
Improve handling of CustomPath/CustomPlan(State) children.
Allow CustomPath to have a list of paths, CustomPlan a list of plans,
and CustomPlanState a list of planstates known to the core system, so
that custom path/plan providers can more reasonably use this
infrastructure for nodes with multiple children.
KaiGai Kohei, per a design suggestion from Tom Lane, with some
further kibitzing by me.
Diffstat (limited to 'src/backend/commands/explain.c')
-rw-r--r-- | src/backend/commands/explain.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/src/backend/commands/explain.c b/src/backend/commands/explain.c index a82c6ff7b4d..0d1ecc2a3ed 100644 --- a/src/backend/commands/explain.c +++ b/src/backend/commands/explain.c @@ -115,6 +115,8 @@ static void ExplainMemberNodes(List *plans, PlanState **planstates, List *ancestors, ExplainState *es); static void ExplainSubPlans(List *plans, List *ancestors, const char *relationship, ExplainState *es); +static void ExplainCustomChildren(CustomScanState *css, + List *ancestors, ExplainState *es); static void ExplainProperty(const char *qlabel, const char *value, bool numeric, ExplainState *es); static void ExplainOpenGroup(const char *objtype, const char *labelname, @@ -1624,6 +1626,8 @@ ExplainNode(PlanState *planstate, List *ancestors, IsA(plan, BitmapAnd) || IsA(plan, BitmapOr) || IsA(plan, SubqueryScan) || + (IsA(planstate, CustomScanState) && + ((CustomScanState *) planstate)->custom_ps != NIL) || planstate->subPlan; if (haschildren) { @@ -1678,6 +1682,10 @@ ExplainNode(PlanState *planstate, List *ancestors, ExplainNode(((SubqueryScanState *) planstate)->subplan, ancestors, "Subquery", NULL, es); break; + case T_CustomScan: + ExplainCustomChildren((CustomScanState *) planstate, + ancestors, es); + break; default: break; } @@ -2648,6 +2656,20 @@ ExplainSubPlans(List *plans, List *ancestors, } /* + * Explain a list of children of a CustomScan. + */ +static void +ExplainCustomChildren(CustomScanState *css, List *ancestors, ExplainState *es) +{ + ListCell *cell; + const char *label = + (list_length(css->custom_ps) != 1 ? "children" : "child"); + + foreach (cell, css->custom_ps) + ExplainNode((PlanState *) lfirst(cell), ancestors, label, NULL, es); +} + +/* * Explain a property, such as sort keys or targets, that takes the form of * a list of unlabeled items. "data" is a list of C strings. */ |