From 952796fa1c65000948ed2a267f76676e354c989c Mon Sep 17 00:00:00 2001 From: Julien Rouhaud Date: Sun, 8 Mar 2020 14:34:44 +0100 Subject: [PATCH v15 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 --- doc/src/sgml/config.sgml | 14 +++++++------- doc/src/sgml/ref/explain.sgml | 6 ++++-- src/backend/commands/explain.c | 18 ++++++++++++++++++ src/test/regress/expected/explain.out | 9 +++++++++ src/test/regress/sql/explain.sql | 3 +++ 5 files changed, 41 insertions(+), 9 deletions(-) diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml index d9c85a1f80..1d2f7ba393 100644 --- a/doc/src/sgml/config.sgml +++ b/doc/src/sgml/config.sgml @@ -7487,13 +7487,13 @@ COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv; Enables or disables in core query identifier computation. A query identifier can be displayed in the pg_stat_activity - view, or emitted in the log if configured via the parameter. The extension also requires a query identifier - to be computed. Note that an external module can alternatively be used - if the in core query identifier computation specification doesn't suit - your need. In this case, in core computation must be disabled. The - default is off. + view, using EXPLAIN, or emitted in the log if + configured via the parameter. + The extension also requires a query + identifier to be computed. Note that an external module can + alternatively be used if the in core query identifier computation + specification doesn't suit your need. In this case, in core + computation must be disabled. The default is off. diff --git a/doc/src/sgml/ref/explain.sgml b/doc/src/sgml/ref/explain.sgml index c4512332a0..105b069b41 100644 --- a/doc/src/sgml/ref/explain.sgml +++ b/doc/src/sgml/ref/explain.sgml @@ -136,8 +136,10 @@ ROLLBACK; the output column list for each node in the plan tree, schema-qualify table and function names, always label variables in expressions with their range table alias, and always print the name of each trigger for - which statistics are displayed. This parameter defaults to - FALSE. + which statistics are displayed. The query identifier will also be + displayed if one has been compute, see for more details. This parameter + defaults to FALSE. diff --git a/src/backend/commands/explain.c b/src/backend/commands/explain.c index 5d7eb3574c..2e1b4bf0bf 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 = NULL; + 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 @@ -598,6 +608,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.29.2