aboutsummaryrefslogtreecommitdiff
path: root/src/backend/commands/explain.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2016-06-29 18:51:20 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2016-06-29 18:51:20 -0400
commit8ebb69f85445177575684a0ba5cfedda8d840a91 (patch)
treef392ff74376ba2b90cd67fa3fbd8517e6936854c /src/backend/commands/explain.c
parent0584df32f577ef05fc2a682a97d3c81387eccdb9 (diff)
downloadpostgresql-8ebb69f85445177575684a0ba5cfedda8d840a91.tar.gz
postgresql-8ebb69f85445177575684a0ba5cfedda8d840a91.zip
Fix some infelicities in EXPLAIN output for parallel query plans.
In non-text output formats, parallelized aggregates were reporting "Partial" or "Finalize" as a field named "Operation", which might be all right in the absence of any context --- but other plan node types use that field to report SQL-visible semantics, such as Select/Insert/Update/Delete. So that naming choice didn't seem good to me. I changed it to "Partial Mode". Also, the field did not appear at all for a non-parallelized Agg plan node, which is contrary to expectation in non-text formats. We're notionally producing objects that conform to a schema, so the set of fields for a given node type and EXPLAIN mode should be well-defined. I set it up to fill in "Simple" in such cases. Other fields that were added for parallel query, namely "Parallel Aware" and Gather's "Single Copy", had not gotten the word on that point either. Make them appear always in non-text output. Also, the latter two fields were nominally producing boolean output, but were getting it wrong, because bool values shouldn't be quoted in JSON or YAML. Somehow we'd not needed an ExplainPropertyBool formatting subroutine before 9.6; but now we do, so invent it. Discussion: <16002.1466972724@sss.pgh.pa.us>
Diffstat (limited to 'src/backend/commands/explain.c')
-rw-r--r--src/backend/commands/explain.c42
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