From 4a81289f02e9bfb796317b32d492eb949c9ed4a1 Mon Sep 17 00:00:00 2001 From: Julien Rouhaud Date: Sun, 8 Mar 2020 14:34:44 +0100 Subject: [PATCH v12 3/3] Expose query identifier in verbose explain If a query identifier has been computed, either by enabling compute_queryid or using a third-party module, verbose explain will display it. Author: Julien Rouhaud Reviewed-by: Discussion: https://postgr.es/m/CA+8PKvQnMfOE-c3YLRwxOsCYXQDyP8VXs6CDtMZp1V4=D4LuFA@mail.gmail.com --- src/backend/commands/explain.c | 18 ++++++++++++++++++ src/test/regress/expected/explain.out | 9 +++++++++ src/test/regress/sql/explain.sql | 3 +++ 3 files changed, 30 insertions(+) diff --git a/src/backend/commands/explain.c b/src/backend/commands/explain.c index c8e292adfa..bb08c18a3a 100644 --- a/src/backend/commands/explain.c +++ b/src/backend/commands/explain.c @@ -24,6 +24,7 @@ #include "nodes/extensible.h" #include "nodes/makefuncs.h" #include "nodes/nodeFuncs.h" +#include "parser/analyze.h" #include "parser/parsetree.h" #include "rewrite/rewriteHandler.h" #include "storage/bufmgr.h" @@ -163,6 +164,8 @@ ExplainQuery(ParseState *pstate, ExplainStmt *stmt, { ExplainState *es = NewExplainState(); TupOutputState *tstate; + JumbleState *jstate; + Query *query; List *rewritten; ListCell *lc; bool timing_set = false; @@ -239,6 +242,13 @@ ExplainQuery(ParseState *pstate, ExplainStmt *stmt, /* if the summary was not set explicitly, set default value */ es->summary = (summary_set) ? es->summary : es->analyze; + query = castNode(Query, stmt->query); + if (compute_queryid) + jstate = JumbleQuery(query, pstate->p_sourcetext); + + if (post_parse_analyze_hook) + (*post_parse_analyze_hook) (pstate, query, jstate); + /* * Parse analysis was done already, but we still have to run the rule * rewriter. We do not do AcquireRewriteLocks: we assume the query either @@ -582,6 +592,14 @@ ExplainOnePlan(PlannedStmt *plannedstmt, IntoClause *into, ExplainState *es, /* Create textual dump of plan tree */ ExplainPrintPlan(es, queryDesc); + if (es->verbose && plannedstmt->queryId != UINT64CONST(0)) + { + char buf[MAXINT8LEN+1]; + + pg_lltoa(plannedstmt->queryId, buf); + ExplainPropertyText("Query Identifier", buf, es); + } + /* Show buffer usage in planning */ if (bufusage) { diff --git a/src/test/regress/expected/explain.out b/src/test/regress/expected/explain.out index dc7ab2ce8b..966bfef865 100644 --- a/src/test/regress/expected/explain.out +++ b/src/test/regress/expected/explain.out @@ -472,3 +472,12 @@ select jsonb_pretty( (1 row) rollback; +set compute_queryid = on; +select explain_filter('explain (verbose) select 1'); + explain_filter +---------------------------------------- + Result (cost=N.N..N.N rows=N width=N) + Output: N + Query Identifier: -N +(3 rows) + diff --git a/src/test/regress/sql/explain.sql b/src/test/regress/sql/explain.sql index c79116c927..cec23dec73 100644 --- a/src/test/regress/sql/explain.sql +++ b/src/test/regress/sql/explain.sql @@ -105,3 +105,6 @@ select jsonb_pretty( ); rollback; + +set compute_queryid = on; +select explain_filter('explain (verbose) select 1'); -- 2.28.0