Skip to content

Commit 7db9bfc

Browse files
committed
Add missing query ID reporting in extended query protocol
This commit adds query ID reports for two code paths when processing extended query protocol messages: - When receiving a bind message, setting it to the first Query retrieved from a cached cache. - When receiving an execute message, setting it to the first PlannedStmt stored in a portal. An advantage of this method is that this is able to cover all the types of portals handled in the extended query protocol, particularly these two when the report done in ExecutorStart() is not enough (neither is an addition in ExecutorRun(), actually, for the second point): - Multiple execute messages, with multiple ExecutorRun(). - Portal with execute/fetch messages, like a query with a RETURNING clause and a fetch size that stores the tuples in a first execute message going though ExecutorStart() and ExecuteRun(), followed by one or more execute messages doing only fetches from the tuplestore created in the first message. This corresponds to the case where execute_is_fetch is set, for example. Note that the query ID reporting done in ExecutorStart() is still necessary, as an EXECUTE requires it. Query ID reporting is optimistic and more calls to pgstat_report_query_id() don't matter as the first report takes priority except if the report is forced. The comment in ExecutorStart() is adjusted to reflect better the reality with the extended query protocol. The test added in pg_stat_statements is a courtesy of Robert Haas. This uses psql's \bind metacommand, hence this part is backpatched down to v16. Reported-by: Kaido Vaikla, Erik Wienhold Author: Sami Imseih Reviewed-by: Jian He, Andrei Lepikhov, Michael Paquier Discussion: https://postgr.es/m/CA+427g8DiW3aZ6pOpVgkPbqK97ouBdf18VLiHFesea2jUk3XoQ@mail.gmail.com Discussion: https://postgr.es/m/CA+TgmoZxtnf_jZ=VqBSyaU8hfUkkwoJCJ6ufy4LGpXaunKrjrg@mail.gmail.com Discussion: https://postgr.es/m/1391613709.939460.1684777418070@office.mailbox.org Backpatch-through: 14
1 parent ec1d545 commit 7db9bfc

File tree

6 files changed

+50
-5
lines changed

6 files changed

+50
-5
lines changed

contrib/pg_stat_statements/Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ LDFLAGS_SL += $(filter -lm, $(LIBS))
1919

2020
REGRESS_OPTS = --temp-config $(top_srcdir)/contrib/pg_stat_statements/pg_stat_statements.conf
2121
REGRESS = select dml cursors utility level_tracking planning \
22-
user_activity wal entry_timestamp cleanup oldextversions
22+
user_activity wal entry_timestamp extended cleanup \
23+
oldextversions
2324
# Disabled because these tests require "shared_preload_libraries=pg_stat_statements",
2425
# which typical installcheck users do not have (e.g. buildfarm clients).
2526
NO_INSTALLCHECK = 1
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
-- Tests with extended query protocol
2+
SET pg_stat_statements.track_utility = FALSE;
3+
-- This test checks that an execute message sets a query ID.
4+
SELECT query_id IS NOT NULL AS query_id_set
5+
FROM pg_stat_activity WHERE pid = pg_backend_pid() \bind \g
6+
query_id_set
7+
--------------
8+
t
9+
(1 row)
10+

contrib/pg_stat_statements/meson.build

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ tests += {
5050
'user_activity',
5151
'wal',
5252
'entry_timestamp',
53+
'extended',
5354
'cleanup',
5455
'oldextversions',
5556
],
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
-- Tests with extended query protocol
2+
3+
SET pg_stat_statements.track_utility = FALSE;
4+
5+
-- This test checks that an execute message sets a query ID.
6+
SELECT query_id IS NOT NULL AS query_id_set
7+
FROM pg_stat_activity WHERE pid = pg_backend_pid() \bind \g

src/backend/executor/execMain.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -124,10 +124,12 @@ void
124124
ExecutorStart(QueryDesc *queryDesc, int eflags)
125125
{
126126
/*
127-
* In some cases (e.g. an EXECUTE statement) a query execution will skip
128-
* parse analysis, which means that the query_id won't be reported. Note
129-
* that it's harmless to report the query_id multiple times, as the call
130-
* will be ignored if the top level query_id has already been reported.
127+
* In some cases (e.g. an EXECUTE statement or an execute message with the
128+
* extended query protocol) the query_id won't be reported, so do it now.
129+
*
130+
* Note that it's harmless to report the query_id multiple times, as the
131+
* call will be ignored if the top level query_id has already been
132+
* reported.
131133
*/
132134
pgstat_report_query_id(queryDesc->plannedstmt->queryId, false);
133135

src/backend/tcop/postgres.c

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1648,6 +1648,7 @@ exec_bind_message(StringInfo input_message)
16481648
char msec_str[32];
16491649
ParamsErrorCbData params_data;
16501650
ErrorContextCallback params_errcxt;
1651+
ListCell *lc;
16511652

16521653
/* Get the fixed part of the message */
16531654
portal_name = pq_getmsgstring(input_message);
@@ -1683,6 +1684,17 @@ exec_bind_message(StringInfo input_message)
16831684

16841685
pgstat_report_activity(STATE_RUNNING, psrc->query_string);
16851686

1687+
foreach(lc, psrc->query_list)
1688+
{
1689+
Query *query = lfirst_node(Query, lc);
1690+
1691+
if (query->queryId != UINT64CONST(0))
1692+
{
1693+
pgstat_report_query_id(query->queryId, false);
1694+
break;
1695+
}
1696+
}
1697+
16861698
set_ps_display("BIND");
16871699

16881700
if (save_log_statement_stats)
@@ -2105,6 +2117,7 @@ exec_execute_message(const char *portal_name, long max_rows)
21052117
ErrorContextCallback params_errcxt;
21062118
const char *cmdtagname;
21072119
size_t cmdtaglen;
2120+
ListCell *lc;
21082121

21092122
/* Adjust destination to tell printtup.c what to do */
21102123
dest = whereToSendOutput;
@@ -2151,6 +2164,17 @@ exec_execute_message(const char *portal_name, long max_rows)
21512164

21522165
pgstat_report_activity(STATE_RUNNING, sourceText);
21532166

2167+
foreach(lc, portal->stmts)
2168+
{
2169+
PlannedStmt *stmt = lfirst_node(PlannedStmt, lc);
2170+
2171+
if (stmt->queryId != UINT64CONST(0))
2172+
{
2173+
pgstat_report_query_id(stmt->queryId, false);
2174+
break;
2175+
}
2176+
}
2177+
21542178
cmdtagname = GetCommandTagNameAndLen(portal->commandTag, &cmdtaglen);
21552179

21562180
set_ps_display_with_len(cmdtagname, cmdtaglen);

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy