summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/commands/explain.c27
1 files changed, 16 insertions, 11 deletions
diff --git a/src/backend/commands/explain.c b/src/backend/commands/explain.c
index a8e6bb56afe..ae5bde754c7 100644
--- a/src/backend/commands/explain.c
+++ b/src/backend/commands/explain.c
@@ -1006,11 +1006,18 @@ ExplainNode(PlanState *planstate, List *ancestors,
/*
* We have to forcibly clean up the instrumentation state because we
* haven't done ExecutorEnd yet. This is pretty grotty ...
+ *
+ * Note: contrib/auto_explain could cause instrumentation to be set up
+ * even though we didn't ask for it here. Be careful not to print any
+ * instrumentation results the user didn't ask for. But we do the
+ * InstrEndLoop call anyway, if possible, to reduce the number of cases
+ * auto_explain has to contend with.
*/
if (planstate->instrument)
InstrEndLoop(planstate->instrument);
- if (planstate->instrument && planstate->instrument->nloops > 0)
+ if (es->analyze &&
+ planstate->instrument && planstate->instrument->nloops > 0)
{
double nloops = planstate->instrument->nloops;
double startup_sec = 1000.0 * planstate->instrument->startup / nloops;
@@ -1019,7 +1026,7 @@ ExplainNode(PlanState *planstate, List *ancestors,
if (es->format == EXPLAIN_FORMAT_TEXT)
{
- if (planstate->instrument->need_timer)
+ if (es->timing)
appendStringInfo(es->str,
" (actual time=%.3f..%.3f rows=%.0f loops=%.0f)",
startup_sec, total_sec, rows, nloops);
@@ -1030,7 +1037,7 @@ ExplainNode(PlanState *planstate, List *ancestors,
}
else
{
- if (planstate->instrument->need_timer)
+ if (es->timing)
{
ExplainPropertyFloat("Actual Startup Time", startup_sec, 3, es);
ExplainPropertyFloat("Actual Total Time", total_sec, 3, es);
@@ -1041,20 +1048,18 @@ ExplainNode(PlanState *planstate, List *ancestors,
}
else if (es->analyze)
{
-
if (es->format == EXPLAIN_FORMAT_TEXT)
appendStringInfo(es->str, " (never executed)");
- else if (planstate->instrument->need_timer)
- {
- ExplainPropertyFloat("Actual Startup Time", 0.0, 3, es);
- ExplainPropertyFloat("Actual Total Time", 0.0, 3, es);
- }
else
{
+ if (es->timing)
+ {
+ ExplainPropertyFloat("Actual Startup Time", 0.0, 3, es);
+ ExplainPropertyFloat("Actual Total Time", 0.0, 3, es);
+ }
ExplainPropertyFloat("Actual Rows", 0.0, 0, es);
ExplainPropertyFloat("Actual Loops", 0.0, 0, es);
}
-
}
/* in text format, first line ends here */
@@ -1220,7 +1225,7 @@ ExplainNode(PlanState *planstate, List *ancestors,
}
/* Show buffer usage */
- if (es->buffers)
+ if (es->buffers && planstate->instrument)
{
const BufferUsage *usage = &planstate->instrument->bufusage;