Skip to content

Commit cbcd4bb

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 fc2d1ac commit cbcd4bb

File tree

2 files changed

+30
-4
lines changed

2 files changed

+30
-4
lines changed

src/backend/executor/execMain.c

+6-4
Original file line numberDiff line numberDiff line change
@@ -131,10 +131,12 @@ void
131131
ExecutorStart(QueryDesc *queryDesc, int eflags)
132132
{
133133
/*
134-
* In some cases (e.g. an EXECUTE statement) a query execution will skip
135-
* parse analysis, which means that the query_id won't be reported. Note
136-
* that it's harmless to report the query_id multiple time, as the call
137-
* will be ignored if the top level query_id has already been reported.
134+
* In some cases (e.g. an EXECUTE statement or an execute message with the
135+
* extended query protocol) the query_id won't be reported, so do it now.
136+
*
137+
* Note that it's harmless to report the query_id multiple times, as the
138+
* call will be ignored if the top level query_id has already been
139+
* reported.
138140
*/
139141
pgstat_report_query_id(queryDesc->plannedstmt->queryId, false);
140142

src/backend/tcop/postgres.c

+24
Original file line numberDiff line numberDiff line change
@@ -1624,6 +1624,7 @@ exec_bind_message(StringInfo input_message)
16241624
char msec_str[32];
16251625
ParamsErrorCbData params_data;
16261626
ErrorContextCallback params_errcxt;
1627+
ListCell *lc;
16271628

16281629
/* Get the fixed part of the message */
16291630
portal_name = pq_getmsgstring(input_message);
@@ -1659,6 +1660,17 @@ exec_bind_message(StringInfo input_message)
16591660

16601661
pgstat_report_activity(STATE_RUNNING, psrc->query_string);
16611662

1663+
foreach(lc, psrc->query_list)
1664+
{
1665+
Query *query = lfirst_node(Query, lc);
1666+
1667+
if (query->queryId != UINT64CONST(0))
1668+
{
1669+
pgstat_report_query_id(query->queryId, false);
1670+
break;
1671+
}
1672+
}
1673+
16621674
set_ps_display("BIND");
16631675

16641676
if (save_log_statement_stats)
@@ -2082,6 +2094,7 @@ exec_execute_message(const char *portal_name, long max_rows)
20822094
char msec_str[32];
20832095
ParamsErrorCbData params_data;
20842096
ErrorContextCallback params_errcxt;
2097+
ListCell *lc;
20852098

20862099
/* Adjust destination to tell printtup.c what to do */
20872100
dest = whereToSendOutput;
@@ -2128,6 +2141,17 @@ exec_execute_message(const char *portal_name, long max_rows)
21282141

21292142
pgstat_report_activity(STATE_RUNNING, sourceText);
21302143

2144+
foreach(lc, portal->stmts)
2145+
{
2146+
PlannedStmt *stmt = lfirst_node(PlannedStmt, lc);
2147+
2148+
if (stmt->queryId != UINT64CONST(0))
2149+
{
2150+
pgstat_report_query_id(stmt->queryId, false);
2151+
break;
2152+
}
2153+
}
2154+
21312155
set_ps_display(GetCommandTagName(portal->commandTag));
21322156

21332157
if (save_log_statement_stats)

0 commit comments

Comments
 (0)