Re: BUG #17552: pg_stat_statements tracks internal FK check queries when COPY used to load data
Julien Rouhaud <rjuju123@gmail.com>
From: Julien Rouhaud <rjuju123@gmail.com>
To: maxim.boguk@gmail.com, pgsql-bugs@lists.postgresql.org
Date: 2022-07-18T10:19:55Z
Lists: pgsql-bugs
Commits
Same data as JSON:
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Fix some issues with tracking nesting level in pg_stat_statements.
- 76db9cb6368e 17.0 landed
Hi, On Sun, Jul 17, 2022 at 07:23:36PM +0000, PG Bug reporting form wrote: > > Bug reference: 17552 > Logged by: Maxim Boguk > Email address: maxim.boguk@gmail.com > PostgreSQL version: 14.4 > Operating system: Linux > Description: > > pg_stat_statements track internal FK trigger check queries during data load > via COPY > ( pg_stat_statements.track=top (default) and > pg_stat_statements.track_utility=off (not default) ) > Tested on latest 13 and 14 versions. Reproduced on current master too. > Test script (test.sql): > [...] > select query, calls from public.pg_stat_statements where dbid=(select oid > from pg_database where datname=current_database()) order by calls desc limit > 2; > > run: > psql -e -f test.sql -d sometestdb > > Final output rows: > select query, calls from public.pg_stat_statements where dbid=(select oid > from pg_database where datname=current_database()) order by calls desc limit > 2; > query > | calls > ---------------------------------------------------------------------------------------------+------- > SELECT $2 FROM ONLY "public"."t1" x WHERE "id" OPERATOR(pg_catalog.=) $1 > FOR KEY SHARE OF x | 100 > select pg_stat_statements_reset() > | 1 > (2 rows) > > > Expected output: > query > | calls > ---------------------------------------------------------------------------------------------+------- > select pg_stat_statements_reset() > | 1 > (1 rows) I agree with you that the current behavior seems wrong. If we ignore a utility statement, it doesn't mean that any standard query executed underneath should become a top-level statement as it's the case now. I see that there's an existing test that actually relies on that behavior, which is an anonymous block code like: DO LANGUAGE plpgsql $$ BEGIN -- this is a SELECT PERFORM 'hello world'::TEXT; END; $$; which is expected to reports a "SELECT $1::text" with pg_stat_statements.track = top and track_utility = off, and also doesn't seem right. That test was added in 83f2061dd03, apparently covered by "Also, significantly expand pg_stat_statements' regression test script", but without any discussion on that specific behavior as far as I can see after a quick look. Assuming that we want to fix it, simply increasing the exec_nested_level in the fallback calls to prev_ProcessUtility/standard_ProcessUtility for handled utility commands should get the correct behavior.