aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/commands/explain.c106
-rw-r--r--src/include/commands/explain.h4
2 files changed, 63 insertions, 47 deletions
diff --git a/src/backend/commands/explain.c b/src/backend/commands/explain.c
index 78754bc6ba0..a9d5056af48 100644
--- a/src/backend/commands/explain.c
+++ b/src/backend/commands/explain.c
@@ -394,60 +394,72 @@ ExplainOneQuery(Query *query, int cursorOptions,
(*ExplainOneQuery_hook) (query, cursorOptions, into, es,
queryString, params, queryEnv);
else
- {
- PlannedStmt *plan;
- instr_time planstart,
- planduration;
- BufferUsage bufusage_start,
- bufusage;
- MemoryContextCounters mem_counters;
- MemoryContext planner_ctx = NULL;
- MemoryContext saved_ctx = NULL;
-
- if (es->memory)
- {
- /*
- * Create a new memory context to measure planner's memory
- * consumption accurately. Note that if the planner were to be
- * modified to use a different memory context type, here we would
- * be changing that to AllocSet, which might be undesirable.
- * However, we don't have a way to create a context of the same
- * type as another, so we pray and hope that this is OK.
- */
- planner_ctx = AllocSetContextCreate(CurrentMemoryContext,
- "explain analyze planner context",
- ALLOCSET_DEFAULT_SIZES);
- saved_ctx = MemoryContextSwitchTo(planner_ctx);
- }
+ standard_ExplainOneQuery(query, cursorOptions, into, es,
+ queryString, params, queryEnv);
+}
- if (es->buffers)
- bufusage_start = pgBufferUsage;
- INSTR_TIME_SET_CURRENT(planstart);
+/*
+ * standard_ExplainOneQuery -
+ * print out the execution plan for one Query, without calling a hook.
+ */
+void
+standard_ExplainOneQuery(Query *query, int cursorOptions,
+ IntoClause *into, ExplainState *es,
+ const char *queryString, ParamListInfo params,
+ QueryEnvironment *queryEnv)
+{
+ PlannedStmt *plan;
+ instr_time planstart,
+ planduration;
+ BufferUsage bufusage_start,
+ bufusage;
+ MemoryContextCounters mem_counters;
+ MemoryContext planner_ctx = NULL;
+ MemoryContext saved_ctx = NULL;
+
+ if (es->memory)
+ {
+ /*
+ * Create a new memory context to measure planner's memory consumption
+ * accurately. Note that if the planner were to be modified to use a
+ * different memory context type, here we would be changing that to
+ * AllocSet, which might be undesirable. However, we don't have a way
+ * to create a context of the same type as another, so we pray and
+ * hope that this is OK.
+ */
+ planner_ctx = AllocSetContextCreate(CurrentMemoryContext,
+ "explain analyze planner context",
+ ALLOCSET_DEFAULT_SIZES);
+ saved_ctx = MemoryContextSwitchTo(planner_ctx);
+ }
- /* plan the query */
- plan = pg_plan_query(query, queryString, cursorOptions, params);
+ if (es->buffers)
+ bufusage_start = pgBufferUsage;
+ INSTR_TIME_SET_CURRENT(planstart);
- INSTR_TIME_SET_CURRENT(planduration);
- INSTR_TIME_SUBTRACT(planduration, planstart);
+ /* plan the query */
+ plan = pg_plan_query(query, queryString, cursorOptions, params);
- if (es->memory)
- {
- MemoryContextSwitchTo(saved_ctx);
- MemoryContextMemConsumed(planner_ctx, &mem_counters);
- }
+ INSTR_TIME_SET_CURRENT(planduration);
+ INSTR_TIME_SUBTRACT(planduration, planstart);
- /* calc differences of buffer counters. */
- if (es->buffers)
- {
- memset(&bufusage, 0, sizeof(BufferUsage));
- BufferUsageAccumDiff(&bufusage, &pgBufferUsage, &bufusage_start);
- }
+ if (es->memory)
+ {
+ MemoryContextSwitchTo(saved_ctx);
+ MemoryContextMemConsumed(planner_ctx, &mem_counters);
+ }
- /* run it (if needed) and produce output */
- ExplainOnePlan(plan, into, es, queryString, params, queryEnv,
- &planduration, (es->buffers ? &bufusage : NULL),
- es->memory ? &mem_counters : NULL);
+ /* calc differences of buffer counters. */
+ if (es->buffers)
+ {
+ memset(&bufusage, 0, sizeof(BufferUsage));
+ BufferUsageAccumDiff(&bufusage, &pgBufferUsage, &bufusage_start);
}
+
+ /* run it (if needed) and produce output */
+ ExplainOnePlan(plan, into, es, queryString, params, queryEnv,
+ &planduration, (es->buffers ? &bufusage : NULL),
+ es->memory ? &mem_counters : NULL);
}
/*
diff --git a/src/include/commands/explain.h b/src/include/commands/explain.h
index 7c0f0b56365..cf195f13597 100644
--- a/src/include/commands/explain.h
+++ b/src/include/commands/explain.h
@@ -80,6 +80,10 @@ extern PGDLLIMPORT explain_get_index_name_hook_type explain_get_index_name_hook;
extern void ExplainQuery(ParseState *pstate, ExplainStmt *stmt,
ParamListInfo params, DestReceiver *dest);
+extern void standard_ExplainOneQuery(Query *query, int cursorOptions,
+ IntoClause *into, ExplainState *es,
+ const char *queryString, ParamListInfo params,
+ QueryEnvironment *queryEnv);
extern ExplainState *NewExplainState(void);