From 2c14e1dc0845ab173e74ed64edf3aa3352d2d614 Mon Sep 17 00:00:00 2001 From: Diego Fronza Date: Fri, 21 Jan 2022 13:35:14 -0300 Subject: [PATCH 1/2] PG-338: Fix query call count (utilities). There was a missing increment/decrement to exec_nested_level in pgss_ProcessUtility hook, due to this, some utility statements could end up being processed more than once, as PostgreSQL may recurse into this hook for sub-statements or when processing a query string containing multiple semicolon-separated statements. --- pg_stat_monitor.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pg_stat_monitor.c b/pg_stat_monitor.c index bcc8e8b..5b2f007 100644 --- a/pg_stat_monitor.c +++ b/pg_stat_monitor.c @@ -986,6 +986,7 @@ static void pgss_ProcessUtility(PlannedStmt *pstmt, const char *queryString, WalUsage walusage_start = pgWalUsage; #endif INSTR_TIME_SET_CURRENT(start); + exec_nested_level++; PG_TRY(); { #if PG_VERSION_NUM >= 140000 @@ -1024,12 +1025,12 @@ static void pgss_ProcessUtility(PlannedStmt *pstmt, const char *queryString, dest, completionTag); #endif + exec_nested_level--; } PG_CATCH(); { exec_nested_level--; PG_RE_THROW(); - } PG_END_TRY(); From 52fb1fbc7dd5d0ebae8bd103f8bf78c5253225f7 Mon Sep 17 00:00:00 2001 From: Diego Fronza Date: Fri, 21 Jan 2022 13:44:05 -0300 Subject: [PATCH 2/2] PG-338: Fix counters regression test. After fixing the problem with utility statements, this whole block: do $$ declare n integer:= 1; begin loop PERFORM a,b,c,d FROM t1, t2, t3, t4 WHERE t1.a = t2.b AND t3.c = t4.d ORDER BY a; exit when n = 1000; n := n + 1; end loop; end $$; Is only processed once, as those are nested statements, in order to match the 1000 statements the GUC pg_stat_monitor.track must be set to 'all' and then back to the default of 'top' when done testing it. --- regression/expected/counters.out | 26 +++++++++++++++++++++++--- regression/sql/counters.sql | 9 ++++++++- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/regression/expected/counters.out b/regression/expected/counters.out index 744db3f..a210a6f 100644 --- a/regression/expected/counters.out +++ b/regression/expected/counters.out @@ -42,9 +42,16 @@ SELECT query,calls FROM pg_stat_monitor ORDER BY query COLLATE "C"; SELECT pg_stat_monitor_reset() | 1 (2 rows) -SELECT pg_stat_monitor_reset(); - pg_stat_monitor_reset ------------------------ +ALTER SYSTEM SET pg_stat_monitor.track TO 'all'; +SELECT pg_reload_conf(); + pg_reload_conf +---------------- + t +(1 row) + +SELECT pg_sleep(1); + pg_sleep +---------- (1 row) @@ -81,6 +88,19 @@ SELECT query,calls FROM pg_stat_monitor ORDER BY query COLLATE "C"; end $$ | (3 rows) +ALTER SYSTEM SET pg_stat_monitor.track TO 'top'; +SELECT pg_reload_conf(); + pg_reload_conf +---------------- + t +(1 row) + +SELECT pg_sleep(1); + pg_sleep +---------- + +(1 row) + SELECT pg_stat_monitor_reset(); pg_stat_monitor_reset ----------------------- diff --git a/regression/sql/counters.sql b/regression/sql/counters.sql index 8d5c461..093d971 100644 --- a/regression/sql/counters.sql +++ b/regression/sql/counters.sql @@ -12,9 +12,12 @@ SELECT a,b,c,d FROM t1, t2, t3, t4 WHERE t1.a = t2.b AND t3.c = t4.d ORDER BY a; SELECT a,b,c,d FROM t1, t2, t3, t4 WHERE t1.a = t2.b AND t3.c = t4.d ORDER BY a; SELECT a,b,c,d FROM t1, t2, t3, t4 WHERE t1.a = t2.b AND t3.c = t4.d ORDER BY a; SELECT query,calls FROM pg_stat_monitor ORDER BY query COLLATE "C"; + +ALTER SYSTEM SET pg_stat_monitor.track TO 'all'; +SELECT pg_reload_conf(); +SELECT pg_sleep(1); SELECT pg_stat_monitor_reset(); -SELECT pg_stat_monitor_reset(); do $$ declare n integer:= 1; @@ -26,6 +29,10 @@ begin end loop; end $$; SELECT query,calls FROM pg_stat_monitor ORDER BY query COLLATE "C"; + +ALTER SYSTEM SET pg_stat_monitor.track TO 'top'; +SELECT pg_reload_conf(); +SELECT pg_sleep(1); SELECT pg_stat_monitor_reset(); DROP TABLE t1;