Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit21aad4b

Browse files
committed
Add missing query ID reporting in extended query protocol
This commit adds query ID reports for two code paths when processingextended query protocol messages:- When receiving a bind message, setting it to the first Query retrievedfrom a cached cache.- When receiving an execute message, setting it to the first PlannedStmtstored in a portal.An advantage of this method is that this is able to cover all the typesof portals handled in the extended query protocol, particularly thesetwo when the report done in ExecutorStart() is not enough (neither is anaddition in ExecutorRun(), actually, for the second point):- Multiple execute messages, with multiple ExecutorRun().- Portal with execute/fetch messages, like a query with a RETURNINGclause and a fetch size that stores the tuples in a first executemessage going though ExecutorStart() and ExecuteRun(), followed by oneor more execute messages doing only fetches from the tuplestore createdin the first message. This corresponds to the case whereexecute_is_fetch is set, for example.Note that the query ID reporting done in ExecutorStart() is stillnecessary, as an EXECUTE requires it. Query ID reporting is optimisticand more calls to pgstat_report_query_id() don't matter as the firstreport takes priority except if the report is forced. The comment inExecutorStart() is adjusted to reflect better the reality with theextended query protocol.The test added in pg_stat_statements is a courtesy of Robert Haas. Thisuses psql's \bind metacommand, hence this part is backpatched down tov16.Reported-by: Kaido Vaikla, Erik WienholdAuthor: Sami ImseihReviewed-by: Jian He, Andrei Lepikhov, Michael PaquierDiscussion:https://postgr.es/m/CA+427g8DiW3aZ6pOpVgkPbqK97ouBdf18VLiHFesea2jUk3XoQ@mail.gmail.comDiscussion:https://postgr.es/m/CA+TgmoZxtnf_jZ=VqBSyaU8hfUkkwoJCJ6ufy4LGpXaunKrjrg@mail.gmail.comDiscussion:https://postgr.es/m/1391613709.939460.1684777418070@office.mailbox.orgBackpatch-through: 14
1 parentb8b175a commit21aad4b

File tree

6 files changed

+49
-5
lines changed

6 files changed

+49
-5
lines changed

‎contrib/pg_stat_statements/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ LDFLAGS_SL += $(filter -lm, $(LIBS))
1818

1919
REGRESS_OPTS = --temp-config$(top_srcdir)/contrib/pg_stat_statements/pg_stat_statements.conf
2020
REGRESS = select dml cursors utility level_tracking planning\
21-
user_activity wal cleanup oldextversions
21+
user_activity walextendedcleanup oldextversions
2222
# Disabled because these tests require "shared_preload_libraries=pg_stat_statements",
2323
# which typical installcheck users do not have (e.g. buildfarm clients).
2424
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
@@ -48,6 +48,7 @@ tests += {
4848
'planning',
4949
'user_activity',
5050
'wal',
51+
'extended',
5152
'cleanup',
5253
'oldextversions',
5354
],
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+
SETpg_stat_statements.track_utility= FALSE;
4+
5+
-- This test checks that an execute message sets a query ID.
6+
SELECT query_idIS NOT NULLAS query_id_set
7+
FROM pg_stat_activityWHERE 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
@@ -132,10 +132,12 @@ void
132132
ExecutorStart(QueryDesc*queryDesc,inteflags)
133133
{
134134
/*
135-
* In some cases (e.g. an EXECUTE statement) a query execution will skip
136-
* parse analysis, which means that the query_id won't be reported. Note
137-
* that it's harmless to report the query_id multiple times, as the call
138-
* will be ignored if the top level query_id has already been reported.
135+
* In some cases (e.g. an EXECUTE statement or an execute message with the
136+
* extended query protocol) the query_id won't be reported, so do it now.
137+
*
138+
* Note that it's harmless to report the query_id multiple times, as the
139+
* call will be ignored if the top level query_id has already been
140+
* reported.
139141
*/
140142
pgstat_report_query_id(queryDesc->plannedstmt->queryId, false);
141143

‎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
charmsec_str[32];
16491649
ParamsErrorCbDataparams_data;
16501650
ErrorContextCallbackparams_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)
@@ -2109,6 +2121,7 @@ exec_execute_message(const char *portal_name, long max_rows)
21092121
ErrorContextCallbackparams_errcxt;
21102122
constchar*cmdtagname;
21112123
size_tcmdtaglen;
2124+
ListCell*lc;
21122125

21132126
/* Adjust destination to tell printtup.c what to do */
21142127
dest=whereToSendOutput;
@@ -2155,6 +2168,17 @@ exec_execute_message(const char *portal_name, long max_rows)
21552168

21562169
pgstat_report_activity(STATE_RUNNING,sourceText);
21572170

2171+
foreach(lc,portal->stmts)
2172+
{
2173+
PlannedStmt*stmt=lfirst_node(PlannedStmt,lc);
2174+
2175+
if (stmt->queryId!=UINT64CONST(0))
2176+
{
2177+
pgstat_report_query_id(stmt->queryId, false);
2178+
break;
2179+
}
2180+
}
2181+
21582182
cmdtagname=GetCommandTagNameAndLen(portal->commandTag,&cmdtaglen);
21592183

21602184
set_ps_display_with_len(cmdtagname,cmdtaglen);

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp