Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--contrib/pg_stat_statements/expected/extended.out8
-rw-r--r--contrib/pg_stat_statements/sql/extended.sql4
-rw-r--r--src/backend/executor/execMain.c10
-rw-r--r--src/backend/tcop/postgres.c24
4 files changed, 42 insertions, 4 deletions
diff --git a/contrib/pg_stat_statements/expected/extended.out b/contrib/pg_stat_statements/expected/extended.out
index bc8cb3f1416..04a05943372 100644
--- a/contrib/pg_stat_statements/expected/extended.out
+++ b/contrib/pg_stat_statements/expected/extended.out
@@ -1,5 +1,13 @@
-- Tests with extended query protocol
SET pg_stat_statements.track_utility = FALSE;
+-- This test checks that an execute message sets a query ID.
+SELECT query_id IS NOT NULL AS query_id_set
+ FROM pg_stat_activity WHERE pid = pg_backend_pid() \bind \g
+ query_id_set
+--------------
+ t
+(1 row)
+
SELECT pg_stat_statements_reset() IS NOT NULL AS t;
t
---
diff --git a/contrib/pg_stat_statements/sql/extended.sql b/contrib/pg_stat_statements/sql/extended.sql
index 5ba0678e636..1af0711020c 100644
--- a/contrib/pg_stat_statements/sql/extended.sql
+++ b/contrib/pg_stat_statements/sql/extended.sql
@@ -2,6 +2,10 @@
SET pg_stat_statements.track_utility = FALSE;
+-- This test checks that an execute message sets a query ID.
+SELECT query_id IS NOT NULL AS query_id_set
+ FROM pg_stat_activity WHERE pid = pg_backend_pid() \bind \g
+
SELECT pg_stat_statements_reset() IS NOT NULL AS t;
SELECT $1 \parse stmt1
SELECT $1, $2 \parse stmt2
diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c
index 29e186fa73d..7042ca6c600 100644
--- a/src/backend/executor/execMain.c
+++ b/src/backend/executor/execMain.c
@@ -119,10 +119,12 @@ void
ExecutorStart(QueryDesc *queryDesc, int eflags)
{
/*
- * In some cases (e.g. an EXECUTE statement) a query execution will skip
- * parse analysis, which means that the query_id won't be reported. Note
- * that it's harmless to report the query_id multiple times, as the call
- * will be ignored if the top level query_id has already been reported.
+ * In some cases (e.g. an EXECUTE statement or an execute message with the
+ * extended query protocol) the query_id won't be reported, so do it now.
+ *
+ * Note that it's harmless to report the query_id multiple times, as the
+ * call will be ignored if the top level query_id has already been
+ * reported.
*/
pgstat_report_query_id(queryDesc->plannedstmt->queryId, false);
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index 8bc6bea1135..e394f1419ad 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -1654,6 +1654,7 @@ exec_bind_message(StringInfo input_message)
char msec_str[32];
ParamsErrorCbData params_data;
ErrorContextCallback params_errcxt;
+ ListCell *lc;
/* Get the fixed part of the message */
portal_name = pq_getmsgstring(input_message);
@@ -1689,6 +1690,17 @@ exec_bind_message(StringInfo input_message)
pgstat_report_activity(STATE_RUNNING, psrc->query_string);
+ foreach(lc, psrc->query_list)
+ {
+ Query *query = lfirst_node(Query, lc);
+
+ if (query->queryId != UINT64CONST(0))
+ {
+ pgstat_report_query_id(query->queryId, false);
+ break;
+ }
+ }
+
set_ps_display("BIND");
if (save_log_statement_stats)
@@ -2111,6 +2123,7 @@ exec_execute_message(const char *portal_name, long max_rows)
ErrorContextCallback params_errcxt;
const char *cmdtagname;
size_t cmdtaglen;
+ ListCell *lc;
/* Adjust destination to tell printtup.c what to do */
dest = whereToSendOutput;
@@ -2157,6 +2170,17 @@ exec_execute_message(const char *portal_name, long max_rows)
pgstat_report_activity(STATE_RUNNING, sourceText);
+ foreach(lc, portal->stmts)
+ {
+ PlannedStmt *stmt = lfirst_node(PlannedStmt, lc);
+
+ if (stmt->queryId != UINT64CONST(0))
+ {
+ pgstat_report_query_id(stmt->queryId, false);
+ break;
+ }
+ }
+
cmdtagname = GetCommandTagNameAndLen(portal->commandTag, &cmdtaglen);
set_ps_display_with_len(cmdtagname, cmdtaglen);