diff options
Diffstat (limited to 'src/backend/commands/explain.c')
-rw-r--r-- | src/backend/commands/explain.c | 42 |
1 files changed, 28 insertions, 14 deletions
diff --git a/src/backend/commands/explain.c b/src/backend/commands/explain.c index 319dd8e2248..9873022bf82 100644 --- a/src/backend/commands/explain.c +++ b/src/backend/commands/explain.c @@ -807,6 +807,7 @@ ExplainNode(PlanState *planstate, List *ancestors, const char *pname; /* node type name for text output */ const char *sname; /* node type name for non-text output */ const char *strategy = NULL; + const char *partialmode = NULL; const char *operation = NULL; const char *custom_name = NULL; int save_indent = es->indent; @@ -943,15 +944,10 @@ ExplainNode(PlanState *planstate, List *ancestors, pname = sname = "Group"; break; case T_Agg: - sname = "Aggregate"; { Agg *agg = (Agg *) plan; - if (DO_AGGSPLIT_SKIPFINAL(agg->aggsplit)) - operation = "Partial"; - else if (DO_AGGSPLIT_COMBINE(agg->aggsplit)) - operation = "Finalize"; - + sname = "Aggregate"; switch (agg->aggstrategy) { case AGG_PLAIN: @@ -972,8 +968,18 @@ ExplainNode(PlanState *planstate, List *ancestors, break; } - if (operation != NULL) - pname = psprintf("%s %s", operation, pname); + if (DO_AGGSPLIT_SKIPFINAL(agg->aggsplit)) + { + partialmode = "Partial"; + pname = psprintf("%s %s", partialmode, pname); + } + else if (DO_AGGSPLIT_COMBINE(agg->aggsplit)) + { + partialmode = "Finalize"; + pname = psprintf("%s %s", partialmode, pname); + } + else + partialmode = "Simple"; } break; case T_WindowAgg: @@ -1042,6 +1048,8 @@ ExplainNode(PlanState *planstate, List *ancestors, ExplainPropertyText("Node Type", sname, es); if (strategy) ExplainPropertyText("Strategy", strategy, es); + if (partialmode) + ExplainPropertyText("Partial Mode", partialmode, es); if (operation) ExplainPropertyText("Operation", operation, es); if (relationship) @@ -1050,8 +1058,7 @@ ExplainNode(PlanState *planstate, List *ancestors, ExplainPropertyText("Subplan Name", plan_name, es); if (custom_name) ExplainPropertyText("Custom Plan Provider", custom_name, es); - if (plan->parallel_aware) - ExplainPropertyText("Parallel Aware", "true", es); + ExplainPropertyBool("Parallel Aware", plan->parallel_aware, es); } switch (nodeTag(plan)) @@ -1349,10 +1356,8 @@ ExplainNode(PlanState *planstate, List *ancestors, ExplainPropertyInteger("Workers Launched", nworkers, es); } - if (gather->single_copy) - ExplainPropertyText("Single Copy", - gather->single_copy ? "true" : "false", - es); + if (gather->single_copy || es->format != EXPLAIN_FORMAT_TEXT) + ExplainPropertyBool("Single Copy", gather->single_copy, es); } break; case T_FunctionScan: @@ -3032,6 +3037,15 @@ ExplainPropertyFloat(const char *qlabel, double value, int ndigits, } /* + * Explain a bool-valued property. + */ +void +ExplainPropertyBool(const char *qlabel, bool value, ExplainState *es) +{ + ExplainProperty(qlabel, value ? "true" : "false", true, es); +} + +/* * Open a group of related objects. * * objtype is the type of the group object, labelname is its label within |