Skip to content

Commit b36ee87

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 46d2773 commit b36ee87

File tree

2 files changed

+30
-4
lines changed

2 files changed

+30
-4
lines changed

src/backend/executor/execMain.c

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

src/backend/tcop/postgres.c

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1609,6 +1609,7 @@ exec_bind_message(StringInfo input_message)
16091609
char msec_str[32];
16101610
ParamsErrorCbData params_data;
16111611
ErrorContextCallback params_errcxt;
1612+
ListCell *lc;
16121613

16131614
/* Get the fixed part of the message */
16141615
portal_name = pq_getmsgstring(input_message);
@@ -1644,6 +1645,17 @@ exec_bind_message(StringInfo input_message)
16441645

16451646
pgstat_report_activity(STATE_RUNNING, psrc->query_string);
16461647

1648+
foreach(lc, psrc->query_list)
1649+
{
1650+
Query *query = lfirst_node(Query, lc);
1651+
1652+
if (query->queryId != UINT64CONST(0))
1653+
{
1654+
pgstat_report_query_id(query->queryId, false);
1655+
break;
1656+
}
1657+
}
1658+
16471659
set_ps_display("BIND");
16481660

16491661
if (save_log_statement_stats)
@@ -2067,6 +2079,7 @@ exec_execute_message(const char *portal_name, long max_rows)
20672079
char msec_str[32];
20682080
ParamsErrorCbData params_data;
20692081
ErrorContextCallback params_errcxt;
2082+
ListCell *lc;
20702083

20712084
/* Adjust destination to tell printtup.c what to do */
20722085
dest = whereToSendOutput;
@@ -2113,6 +2126,17 @@ exec_execute_message(const char *portal_name, long max_rows)
21132126

21142127
pgstat_report_activity(STATE_RUNNING, sourceText);
21152128

2129+
foreach(lc, portal->stmts)
2130+
{
2131+
PlannedStmt *stmt = lfirst_node(PlannedStmt, lc);
2132+
2133+
if (stmt->queryId != UINT64CONST(0))
2134+
{
2135+
pgstat_report_query_id(stmt->queryId, false);
2136+
break;
2137+
}
2138+
}
2139+
21162140
set_ps_display(GetCommandTagName(portal->commandTag));
21172141

21182142
if (save_log_statement_stats)

0 commit comments

Comments
 (0)