diff --git a/CHANGELOG.md b/CHANGELOG.md index 591b783b..293d1d4a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,6 +40,7 @@ - Do not acquire LWLock under spinlock - Race condition where we could leak memory for the parent query - `plans` now counts only actual planner invocations instead of every execution: utility statements and executions that reuse a cached plan no longer bump the counter +- Normalize the query text of utility statements ([PG-2623](https://perconadev.atlassian.net/browse/PG-2623)) ## [2.3.2] - 2026-03-02 diff --git a/regression/expected/cursors.out b/regression/expected/cursors.out index 5868de91..98b654a8 100644 --- a/regression/expected/cursors.out +++ b/regression/expected/cursors.out @@ -18,10 +18,10 @@ CLOSE cursor_stats_1; DECLARE cursor_stats_1 CURSOR WITH HOLD FOR SELECT 2; CLOSE cursor_stats_1; SELECT calls, rows, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; - calls | rows | query --------+------+------------------------------------------------------ + calls | rows | query +-------+------+------------------------------------------------------- 2 | 0 | CLOSE cursor_stats_1 - 2 | 0 | DECLARE cursor_stats_1 CURSOR WITH HOLD FOR SELECT 1 + 2 | 0 | DECLARE cursor_stats_1 CURSOR WITH HOLD FOR SELECT $1 1 | 1 | SELECT pg_stat_monitor_reset() IS NOT NULL AS t (3 rows) @@ -51,16 +51,16 @@ CLOSE cursor_stats_1; CLOSE cursor_stats_2; COMMIT; SELECT calls, rows, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; - calls | rows | query --------+------+------------------------------------------------------ + calls | rows | query +-------+------+------------------------------------------------------- 1 | 0 | BEGIN 1 | 0 | CLOSE cursor_stats_1 1 | 0 | CLOSE cursor_stats_2 1 | 0 | COMMIT - 1 | 0 | DECLARE cursor_stats_1 CURSOR WITH HOLD FOR SELECT 2 - 1 | 0 | DECLARE cursor_stats_2 CURSOR WITH HOLD FOR SELECT 3 - 1 | 1 | FETCH 1 IN cursor_stats_1 - 1 | 1 | FETCH 1 IN cursor_stats_2 + 1 | 0 | DECLARE cursor_stats_1 CURSOR WITH HOLD FOR SELECT $1 + 1 | 0 | DECLARE cursor_stats_2 CURSOR WITH HOLD FOR SELECT $1 + 1 | 1 | FETCH $1 IN cursor_stats_1 + 1 | 1 | FETCH $1 IN cursor_stats_2 1 | 1 | SELECT pg_stat_monitor_reset() IS NOT NULL AS t (9 rows) @@ -187,12 +187,12 @@ FETCH BACKWARD ALL pgsm_cursor; COMMIT; SELECT calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; - calls | query --------+------------------------------------------------------------------- + calls | query +-------+-------------------------------------------------------------------- 1 | BEGIN 1 | COMMIT - 1 | DECLARE pgsm_cursor CURSOR FOR SELECT FROM generate_series(1, 10) - 3 | FETCH ABSOLUTE 1 pgsm_cursor + 1 | DECLARE pgsm_cursor CURSOR FOR SELECT FROM generate_series($1, $2) + 3 | FETCH ABSOLUTE $1 pgsm_cursor 1 | FETCH ALL pgsm_cursor 1 | FETCH BACKWARD ALL pgsm_cursor 4 | FETCH BACKWARD pgsm_cursor @@ -202,7 +202,7 @@ SELECT calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; 1 | FETCH LAST pgsm_cursor 1 | FETCH NEXT pgsm_cursor 1 | FETCH PRIOR pgsm_cursor - 3 | FETCH RELATIVE 1 pgsm_cursor + 3 | FETCH RELATIVE $1 pgsm_cursor 4 | FETCH pgsm_cursor 1 | SELECT pg_stat_monitor_reset() IS NOT NULL AS t (16 rows) diff --git a/regression/expected/cursors_1.out b/regression/expected/cursors_1.out index 5fffbfd4..7f5ed2ba 100644 --- a/regression/expected/cursors_1.out +++ b/regression/expected/cursors_1.out @@ -18,10 +18,10 @@ CLOSE cursor_stats_1; DECLARE cursor_stats_1 CURSOR WITH HOLD FOR SELECT 2; CLOSE cursor_stats_1; SELECT calls, rows, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; - calls | rows | query --------+------+------------------------------------------------------ + calls | rows | query +-------+------+------------------------------------------------------- 2 | 0 | CLOSE cursor_stats_1 - 2 | 0 | DECLARE cursor_stats_1 CURSOR WITH HOLD FOR SELECT 1 + 2 | 0 | DECLARE cursor_stats_1 CURSOR WITH HOLD FOR SELECT $1 1 | 1 | SELECT pg_stat_monitor_reset() IS NOT NULL AS t (3 rows) @@ -51,14 +51,14 @@ CLOSE cursor_stats_1; CLOSE cursor_stats_2; COMMIT; SELECT calls, rows, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; - calls | rows | query --------+------+------------------------------------------------------ + calls | rows | query +-------+------+------------------------------------------------------- 1 | 0 | BEGIN 1 | 0 | CLOSE cursor_stats_1 1 | 0 | CLOSE cursor_stats_2 1 | 0 | COMMIT - 1 | 0 | DECLARE cursor_stats_1 CURSOR WITH HOLD FOR SELECT 2 - 1 | 0 | DECLARE cursor_stats_2 CURSOR WITH HOLD FOR SELECT 3 + 1 | 0 | DECLARE cursor_stats_1 CURSOR WITH HOLD FOR SELECT $1 + 1 | 0 | DECLARE cursor_stats_2 CURSOR WITH HOLD FOR SELECT $1 1 | 1 | FETCH 1 IN cursor_stats_1 1 | 1 | FETCH 1 IN cursor_stats_2 1 | 1 | SELECT pg_stat_monitor_reset() IS NOT NULL AS t @@ -187,11 +187,11 @@ FETCH BACKWARD ALL pgsm_cursor; COMMIT; SELECT calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; - calls | query --------+------------------------------------------------------------------- + calls | query +-------+-------------------------------------------------------------------- 1 | BEGIN 1 | COMMIT - 1 | DECLARE pgsm_cursor CURSOR FOR SELECT FROM generate_series(1, 10) + 1 | DECLARE pgsm_cursor CURSOR FOR SELECT FROM generate_series($1, $2) 2 | FETCH -1 pgsm_cursor 2 | FETCH 2 pgsm_cursor 1 | FETCH ABSOLUTE 2 pgsm_cursor diff --git a/regression/expected/level_tracking.out b/regression/expected/level_tracking.out index 95e97f1d..a41e2e8b 100644 --- a/regression/expected/level_tracking.out +++ b/regression/expected/level_tracking.out @@ -60,24 +60,24 @@ END $$; SELECT toplevel, calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C", toplevel; - toplevel | calls | query -----------+-------+---------------------------------------- + toplevel | calls | query +----------+-------+------------------------------------- f | 1 | DELETE FROM stats_track_tab t | 1 | DELETE FROM stats_track_tab - t | 1 | DO $$ + - | | BEGIN + - | | -- this is a SELECT + - | | PERFORM 'hello world'::text; + - | | END + + t | 1 | DO $$ + + | | BEGIN + + | | -- this is a SELECT + + | | PERFORM 'hello world'::text; + + | | END + | | $$ - t | 1 | DO $$ + - | | BEGIN + - | | DELETE FROM stats_track_tab; + - | | END + + t | 1 | DO $$ + + | | BEGIN + + | | DELETE FROM stats_track_tab; + + | | END + | | $$ f | 1 | SELECT $1::text t | 1 | SELECT pg_stat_monitor_reset() - t | 1 | SET pg_stat_monitor.pgsm_track = 'all' + t | 1 | SET pg_stat_monitor.pgsm_track = $1 (7 rows) -- Procedure with multiple utility statements. @@ -223,34 +223,34 @@ SELECT toplevel, calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; toplevel | calls | query ----------+-------+--------------------------------------------------------------------- + t | 1 | EXPLAIN (COSTS OFF) (SELECT $1, $2) f | 1 | EXPLAIN (COSTS OFF) (SELECT $1, $2); - t | 1 | EXPLAIN (COSTS OFF) (SELECT 1, 2) t | 1 | EXPLAIN (COSTS OFF) (TABLE test_table) f | 1 | EXPLAIN (COSTS OFF) (TABLE test_table); + t | 1 | EXPLAIN (COSTS OFF) (VALUES ($1, $2)) f | 1 | EXPLAIN (COSTS OFF) (VALUES ($1, $2)); - t | 1 | EXPLAIN (COSTS OFF) (VALUES (1, 2)) t | 1 | EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab f | 1 | EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab; + t | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES (($1)) f | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES (($1)); - t | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES ((1)) + t | 1 | EXPLAIN (COSTS OFF) MERGE INTO stats_track_tab + + | | USING (SELECT id FROM generate_series($1, $2) id) ON x = id + + | | WHEN MATCHED THEN UPDATE SET x = id + + | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id) f | 1 | EXPLAIN (COSTS OFF) MERGE INTO stats_track_tab + | | USING (SELECT id FROM generate_series($1, $2) id) ON x = id + | | WHEN MATCHED THEN UPDATE SET x = id + | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id); - t | 1 | EXPLAIN (COSTS OFF) MERGE INTO stats_track_tab + - | | USING (SELECT id FROM generate_series(1, 10) id) ON x = id + - | | WHEN MATCHED THEN UPDATE SET x = id + - | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id) + t | 1 | EXPLAIN (COSTS OFF) SELECT $1 + t | 1 | EXPLAIN (COSTS OFF) SELECT $1 UNION SELECT $2 f | 1 | EXPLAIN (COSTS OFF) SELECT $1 UNION SELECT $2; f | 1 | EXPLAIN (COSTS OFF) SELECT $1; - t | 1 | EXPLAIN (COSTS OFF) SELECT 1 - t | 1 | EXPLAIN (COSTS OFF) SELECT 1 UNION SELECT 2 t | 1 | EXPLAIN (COSTS OFF) TABLE stats_track_tab f | 1 | EXPLAIN (COSTS OFF) TABLE stats_track_tab; + t | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = $1 WHERE x = $2 f | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = $1 WHERE x = $2; - t | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = 1 WHERE x = 1 + t | 1 | EXPLAIN (COSTS OFF) VALUES ($1) f | 1 | EXPLAIN (COSTS OFF) VALUES ($1); - t | 1 | EXPLAIN (COSTS OFF) VALUES (1) t | 1 | SELECT pg_stat_monitor_reset() (23 rows) @@ -349,22 +349,22 @@ EXPLAIN (COSTS OFF) SELECT 1 UNION SELECT 2; SELECT toplevel, calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; - toplevel | calls | query -----------+-------+------------------------------------------------------------------ - t | 1 | EXPLAIN (COSTS OFF) (SELECT 1, 2) + toplevel | calls | query +----------+-------+-------------------------------------------------------------------- + t | 1 | EXPLAIN (COSTS OFF) (SELECT $1, $2) t | 1 | EXPLAIN (COSTS OFF) (TABLE test_table) - t | 1 | EXPLAIN (COSTS OFF) (VALUES (1, 2)) + t | 1 | EXPLAIN (COSTS OFF) (VALUES ($1, $2)) t | 1 | EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab - t | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES ((1)) - t | 1 | EXPLAIN (COSTS OFF) MERGE INTO stats_track_tab + - | | USING (SELECT id FROM generate_series(1, 10) id) ON x = id + - | | WHEN MATCHED THEN UPDATE SET x = id + + t | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES (($1)) + t | 1 | EXPLAIN (COSTS OFF) MERGE INTO stats_track_tab + + | | USING (SELECT id FROM generate_series($1, $2) id) ON x = id + + | | WHEN MATCHED THEN UPDATE SET x = id + | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id) - t | 1 | EXPLAIN (COSTS OFF) SELECT 1 - t | 1 | EXPLAIN (COSTS OFF) SELECT 1 UNION SELECT 2 + t | 1 | EXPLAIN (COSTS OFF) SELECT $1 + t | 1 | EXPLAIN (COSTS OFF) SELECT $1 UNION SELECT $2 t | 1 | EXPLAIN (COSTS OFF) TABLE stats_track_tab - t | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = 1 WHERE x = 1 - t | 1 | EXPLAIN (COSTS OFF) VALUES (1) + t | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = $1 WHERE x = $2 + t | 1 | EXPLAIN (COSTS OFF) VALUES ($1) t | 1 | SELECT pg_stat_monitor_reset() (12 rows) @@ -424,16 +424,16 @@ SELECT toplevel, calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; toplevel | calls | query ----------+-------+--------------------------------------------------------------------------------------------------------------------- + t | 1 | EXPLAIN (COSTS OFF) (SELECT $1, $2, $3) + t | 1 | EXPLAIN (COSTS OFF) (SELECT $1, $2, $3) UNION SELECT $4, $5, $6 f | 1 | EXPLAIN (COSTS OFF) (SELECT $1, $2, $3); EXPLAIN (COSTS OFF) (SELECT 1, 2, 3, 4); - t | 1 | EXPLAIN (COSTS OFF) (SELECT 1, 2, 3) - t | 1 | EXPLAIN (COSTS OFF) (SELECT 1, 2, 3) UNION SELECT 3, 4, 5 + t | 1 | EXPLAIN (COSTS OFF) (SELECT $1, $2, $3, $4) f | 1 | EXPLAIN (COSTS OFF) (SELECT 1, 2, 3); EXPLAIN (COSTS OFF) (SELECT $1, $2, $3, $4); - t | 1 | EXPLAIN (COSTS OFF) (SELECT 1, 2, 3, 4) + t | 1 | EXPLAIN (COSTS OFF) SELECT $1 + t | 1 | EXPLAIN (COSTS OFF) SELECT $1, $2 + t | 1 | EXPLAIN (COSTS OFF) SELECT $1, $2 UNION SELECT $3, $4 f | 1 | EXPLAIN (COSTS OFF) SELECT $1, $2 UNION SELECT $3, $4; EXPLAIN (COSTS OFF) (SELECT 1, 2, 3) UNION SELECT 3, 4, 5; f | 1 | EXPLAIN (COSTS OFF) SELECT $1; EXPLAIN (COSTS OFF) SELECT 1, 2; - t | 1 | EXPLAIN (COSTS OFF) SELECT 1 - t | 1 | EXPLAIN (COSTS OFF) SELECT 1, 2 - t | 1 | EXPLAIN (COSTS OFF) SELECT 1, 2 UNION SELECT 3, 4 f | 1 | EXPLAIN (COSTS OFF) SELECT 1, 2 UNION SELECT 3, 4; EXPLAIN (COSTS OFF) (SELECT $1, $2, $3) UNION SELECT $4, $5, $6; f | 1 | EXPLAIN (COSTS OFF) SELECT 1; EXPLAIN (COSTS OFF) SELECT $1, $2; t | 1 | SELECT pg_stat_monitor_reset() @@ -514,24 +514,24 @@ SELECT toplevel, calls, query FROM pg_stat_monitor toplevel | calls | query ----------+-------+---------------------------------------------------------------------------------------------------------------------------------- t | 1 | EXPLAIN (COSTS OFF) (TABLE test_table) - t | 1 | EXPLAIN (COSTS OFF) (VALUES (1, 2)) + t | 1 | EXPLAIN (COSTS OFF) (VALUES ($1, $2)) t | 1 | EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab - t | 1 | EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab WHERE x = 1 + t | 1 | EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab WHERE x = $1 f | 1 | EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab; EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab WHERE x = $1; f | 1 | EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab; EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab WHERE x = 1; + t | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES ($1), ($2) + t | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES (($1)) f | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES (($1)); EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES (1), (2); - t | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES ((1)) f | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES ((1)); EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES ($1), ($2); - t | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES (1), (2) t | 1 | EXPLAIN (COSTS OFF) TABLE stats_track_tab f | 1 | EXPLAIN (COSTS OFF) TABLE stats_track_tab; EXPLAIN (COSTS OFF) (TABLE test_table); f | 1 | EXPLAIN (COSTS OFF) TABLE stats_track_tab; EXPLAIN (COSTS OFF) (TABLE test_table); + t | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = $1 + t | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = $1 WHERE x = $2 f | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = $1 WHERE x = $2; EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = 1; - t | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = 1 - t | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = 1 WHERE x = 1 f | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = 1 WHERE x = 1; EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = $1; + t | 1 | EXPLAIN (COSTS OFF) VALUES ($1) f | 1 | EXPLAIN (COSTS OFF) VALUES ($1); EXPLAIN (COSTS OFF) (VALUES (1, 2)); - t | 1 | EXPLAIN (COSTS OFF) VALUES (1) f | 1 | EXPLAIN (COSTS OFF) VALUES (1); EXPLAIN (COSTS OFF) (VALUES ($1, $2)); t | 1 | SELECT pg_stat_monitor_reset() (21 rows) @@ -568,19 +568,19 @@ SELECT toplevel, calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; toplevel | calls | query ----------+-------+------------------------------------------------------------------------------------------------ + t | 1 | EXPLAIN (COSTS OFF) MERGE INTO stats_track_tab + + | | USING (SELECT id FROM generate_series($1, $2) id) ON x = id + + | | WHEN MATCHED THEN UPDATE SET x = id + + | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id) f | 1 | EXPLAIN (COSTS OFF) MERGE INTO stats_track_tab + | | USING (SELECT id FROM generate_series($1, $2) id) ON x = id + | | WHEN MATCHED THEN UPDATE SET x = id + | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id); EXPLAIN (COSTS OFF) SELECT 1, 2, 3, 4, 5; - t | 1 | EXPLAIN (COSTS OFF) MERGE INTO stats_track_tab + - | | USING (SELECT id FROM generate_series(1, 10) id) ON x = id + - | | WHEN MATCHED THEN UPDATE SET x = id + - | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id) f | 1 | EXPLAIN (COSTS OFF) MERGE INTO stats_track_tab + | | USING (SELECT id FROM generate_series(1, 10) id) ON x = id + | | WHEN MATCHED THEN UPDATE SET x = id + | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id); EXPLAIN (COSTS OFF) SELECT $1, $2, $3, $4, $5; - t | 1 | EXPLAIN (COSTS OFF) SELECT 1, 2, 3, 4, 5 + t | 1 | EXPLAIN (COSTS OFF) SELECT $1, $2, $3, $4, $5 t | 1 | SELECT pg_stat_monitor_reset() (5 rows) @@ -719,26 +719,26 @@ SELECT toplevel, calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; toplevel | calls | query ----------+-------+---------------------------------------------------------------------------------------------------------------------------------- - t | 1 | EXPLAIN (COSTS OFF) (SELECT 1, 2, 3) - t | 1 | EXPLAIN (COSTS OFF) (SELECT 1, 2, 3) UNION SELECT 3, 4, 5 - t | 1 | EXPLAIN (COSTS OFF) (SELECT 1, 2, 3, 4) + t | 1 | EXPLAIN (COSTS OFF) (SELECT $1, $2, $3) + t | 1 | EXPLAIN (COSTS OFF) (SELECT $1, $2, $3) UNION SELECT $4, $5, $6 + t | 1 | EXPLAIN (COSTS OFF) (SELECT $1, $2, $3, $4) t | 1 | EXPLAIN (COSTS OFF) (TABLE test_table) - t | 1 | EXPLAIN (COSTS OFF) (VALUES (1, 2)) + t | 1 | EXPLAIN (COSTS OFF) (VALUES ($1, $2)) t | 1 | EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab - t | 1 | EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab WHERE x = 1 - t | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES ((1)) + t | 1 | EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab WHERE x = $1 + t | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES (($1)) t | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES ((1)); EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES ((1), (2)); - t | 1 | EXPLAIN (COSTS OFF) MERGE INTO stats_track_tab USING (SELECT id FROM generate_series(1, 10) id) ON x = id + + t | 1 | EXPLAIN (COSTS OFF) MERGE INTO stats_track_tab USING (SELECT id FROM generate_series($1, $2) id) ON x = id + | | WHEN MATCHED THEN UPDATE SET x = id + | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id) - t | 1 | EXPLAIN (COSTS OFF) SELECT 1 - t | 1 | EXPLAIN (COSTS OFF) SELECT 1, 2 - t | 1 | EXPLAIN (COSTS OFF) SELECT 1, 2 UNION SELECT 3, 4 - t | 1 | EXPLAIN (COSTS OFF) SELECT 1, 2, 3, 4, 5 + t | 1 | EXPLAIN (COSTS OFF) SELECT $1 + t | 1 | EXPLAIN (COSTS OFF) SELECT $1, $2 + t | 1 | EXPLAIN (COSTS OFF) SELECT $1, $2 UNION SELECT $3, $4 + t | 1 | EXPLAIN (COSTS OFF) SELECT $1, $2, $3, $4, $5 t | 1 | EXPLAIN (COSTS OFF) TABLE stats_track_tab - t | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = 1 - t | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = 1 WHERE x = 1 - t | 1 | EXPLAIN (COSTS OFF) VALUES (1) + t | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = $1 + t | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = $1 WHERE x = $2 + t | 1 | EXPLAIN (COSTS OFF) VALUES ($1) t | 1 | SELECT pg_stat_monitor_reset() (19 rows) @@ -815,26 +815,26 @@ SELECT toplevel, calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; toplevel | calls | query ----------+-------+------------------------------------------------------------------------------------------- + t | 1 | EXPLAIN (COSTS OFF) (WITH a AS (SELECT $1) (SELECT $2, $3)) f | 1 | EXPLAIN (COSTS OFF) (WITH a AS (SELECT $1) (SELECT $2, $3)); - t | 1 | EXPLAIN (COSTS OFF) (WITH a AS (SELECT 4) (SELECT 1, 2)) + t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) DELETE FROM stats_track_tab f | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) DELETE FROM stats_track_tab; + t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) INSERT INTO stats_track_tab VALUES (($2)) f | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) INSERT INTO stats_track_tab VALUES (($2)); + t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) MERGE INTO stats_track_tab + + | | USING (SELECT id FROM generate_series($2, $3) id) ON x = id + + | | WHEN MATCHED THEN UPDATE SET x = id + + | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id) f | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) MERGE INTO stats_track_tab + | | USING (SELECT id FROM generate_series($2, $3) id) ON x = id + | | WHEN MATCHED THEN UPDATE SET x = id + | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id); + t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) SELECT $2 + t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) SELECT $2 UNION SELECT $3 f | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) SELECT $2 UNION SELECT $3; f | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) SELECT $2; + t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) UPDATE stats_track_tab SET x = $2 WHERE x = $3 f | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) UPDATE stats_track_tab SET x = $2 WHERE x = $3; - t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) DELETE FROM stats_track_tab - t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) INSERT INTO stats_track_tab VALUES ((1)) - t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) MERGE INTO stats_track_tab + - | | USING (SELECT id FROM generate_series(1, 10) id) ON x = id + - | | WHEN MATCHED THEN UPDATE SET x = id + - | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id) - t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) SELECT 1 - t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) SELECT 1 UNION SELECT 2 - t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) UPDATE stats_track_tab SET x = 1 WHERE x = 1 t | 1 | SELECT pg_stat_monitor_reset() (15 rows) @@ -909,18 +909,18 @@ EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) SELECT 1 UNION SELECT 2; SELECT toplevel, calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; - toplevel | calls | query -----------+-------+--------------------------------------------------------------------------------------- - t | 1 | EXPLAIN (COSTS OFF) (WITH a AS (SELECT 4) (SELECT 1, 2)) - t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) DELETE FROM stats_track_tab - t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) INSERT INTO stats_track_tab VALUES ((1)) - t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) MERGE INTO stats_track_tab + - | | USING (SELECT id FROM generate_series(1, 10) id) ON x = id + - | | WHEN MATCHED THEN UPDATE SET x = id + + toplevel | calls | query +----------+-------+------------------------------------------------------------------------------------------ + t | 1 | EXPLAIN (COSTS OFF) (WITH a AS (SELECT $1) (SELECT $2, $3)) + t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) DELETE FROM stats_track_tab + t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) INSERT INTO stats_track_tab VALUES (($2)) + t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) MERGE INTO stats_track_tab + + | | USING (SELECT id FROM generate_series($2, $3) id) ON x = id + + | | WHEN MATCHED THEN UPDATE SET x = id + | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id) - t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) SELECT 1 - t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) SELECT 1 UNION SELECT 2 - t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) UPDATE stats_track_tab SET x = 1 WHERE x = 1 + t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) SELECT $2 + t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) SELECT $2 UNION SELECT $3 + t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) UPDATE stats_track_tab SET x = $2 WHERE x = $3 t | 1 | SELECT pg_stat_monitor_reset() (8 rows) @@ -953,8 +953,8 @@ SELECT toplevel, calls, query FROM pg_stat_monitor | | DECLARE foocur CURSOR FOR SELECT * FROM stats_track_tab f | 1 | EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) + | | DECLARE foocur CURSOR FOR SELECT * FROM stats_track_tab; + t | 1 | EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) SELECT $1 f | 1 | EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) SELECT $1; - t | 1 | EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) SELECT 100 t | 1 | SELECT pg_stat_monitor_reset() (5 rows) @@ -981,11 +981,11 @@ EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) SELECT toplevel, calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; - toplevel | calls | query -----------+-------+------------------------------------------------------------------------------- - t | 1 | EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) + + toplevel | calls | query +----------+-------+------------------------------------------------------------------------------ + t | 1 | EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) + | | DECLARE foocur CURSOR FOR SELECT * FROM stats_track_tab - t | 1 | EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) SELECT 100 + t | 1 | EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) SELECT $1 t | 1 | SELECT pg_stat_monitor_reset() (3 rows) @@ -1004,7 +1004,7 @@ SELECT toplevel, calls, query FROM pg_stat_monitor toplevel | calls | query ----------+-------+---------------------------------------------------- t | 1 | CREATE MATERIALIZED VIEW pgsm_materialized_view AS+ - | | SELECT * FROM generate_series(1, 5) AS id + | | SELECT * FROM generate_series($1, $2) AS id t | 1 | SELECT pg_stat_monitor_reset() (2 rows) @@ -1023,7 +1023,7 @@ SELECT toplevel, calls, query FROM pg_stat_monitor toplevel | calls | query ----------+-------+------------------------------------------------------ t | 1 | CREATE MATERIALIZED VIEW pgsm_materialized_view_2 AS+ - | | SELECT * FROM generate_series(1, 5) AS id + | | SELECT * FROM generate_series($1, $2) AS id t | 1 | SELECT pg_stat_monitor_reset() (2 rows) @@ -1076,8 +1076,8 @@ SELECT toplevel, calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; toplevel | calls | query ----------+-------+----------------------------------------------------------------- + t | 1 | CREATE TEMPORARY TABLE pgsm_ctas_1 AS SELECT $1 f | 1 | CREATE TEMPORARY TABLE pgsm_ctas_1 AS SELECT $1; - t | 1 | CREATE TEMPORARY TABLE pgsm_ctas_1 AS SELECT 1 t | 1 | CREATE TEMPORARY TABLE pgsm_ctas_2 AS EXECUTE test_prepare_pgsm f | 1 | PREPARE test_prepare_pgsm AS SELECT generate_series($1, $2) t | 1 | SELECT pg_stat_monitor_reset() @@ -1097,7 +1097,7 @@ SELECT toplevel, calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; toplevel | calls | query ----------+-------+----------------------------------------------------------------- - t | 1 | CREATE TEMPORARY TABLE pgsm_ctas_3 AS SELECT 1 + t | 1 | CREATE TEMPORARY TABLE pgsm_ctas_3 AS SELECT $1 t | 1 | CREATE TEMPORARY TABLE pgsm_ctas_4 AS EXECUTE test_prepare_pgsm t | 1 | SELECT pg_stat_monitor_reset() (3 rows) @@ -1120,8 +1120,8 @@ SELECT toplevel, calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; toplevel | calls | query ----------+-------+---------------------------------------------------------------------------- + t | 1 | EXPLAIN (COSTS OFF) CREATE TEMPORARY TABLE pgsm_explain_ctas AS SELECT $1 f | 1 | EXPLAIN (COSTS OFF) CREATE TEMPORARY TABLE pgsm_explain_ctas AS SELECT $1; - t | 1 | EXPLAIN (COSTS OFF) CREATE TEMPORARY TABLE pgsm_explain_ctas AS SELECT 1 t | 1 | SELECT pg_stat_monitor_reset() (3 rows) @@ -1141,9 +1141,9 @@ EXPLAIN (COSTS OFF) CREATE TEMPORARY TABLE pgsm_explain_ctas AS SELECT 1; SELECT toplevel, calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; - toplevel | calls | query -----------+-------+-------------------------------------------------------------------------- - t | 1 | EXPLAIN (COSTS OFF) CREATE TEMPORARY TABLE pgsm_explain_ctas AS SELECT 1 + toplevel | calls | query +----------+-------+--------------------------------------------------------------------------- + t | 1 | EXPLAIN (COSTS OFF) CREATE TEMPORARY TABLE pgsm_explain_ctas AS SELECT $1 t | 1 | SELECT pg_stat_monitor_reset() (2 rows) diff --git a/regression/expected/level_tracking_1.out b/regression/expected/level_tracking_1.out index 3bb9b4f2..bcc79ace 100644 --- a/regression/expected/level_tracking_1.out +++ b/regression/expected/level_tracking_1.out @@ -223,34 +223,34 @@ SELECT toplevel, calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; toplevel | calls | query ----------+-------+--------------------------------------------------------------------- + t | 1 | EXPLAIN (COSTS OFF) (SELECT $1, $2) f | 1 | EXPLAIN (COSTS OFF) (SELECT $1, $2); - t | 1 | EXPLAIN (COSTS OFF) (SELECT 1, 2) t | 1 | EXPLAIN (COSTS OFF) (TABLE test_table) f | 1 | EXPLAIN (COSTS OFF) (TABLE test_table); + t | 1 | EXPLAIN (COSTS OFF) (VALUES ($1, $2)) f | 1 | EXPLAIN (COSTS OFF) (VALUES ($1, $2)); - t | 1 | EXPLAIN (COSTS OFF) (VALUES (1, 2)) t | 1 | EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab f | 1 | EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab; + t | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES (($1)) f | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES (($1)); - t | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES ((1)) + t | 1 | EXPLAIN (COSTS OFF) MERGE INTO stats_track_tab + + | | USING (SELECT id FROM generate_series($1, $2) id) ON x = id + + | | WHEN MATCHED THEN UPDATE SET x = id + + | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id) f | 1 | EXPLAIN (COSTS OFF) MERGE INTO stats_track_tab + | | USING (SELECT id FROM generate_series($1, $2) id) ON x = id + | | WHEN MATCHED THEN UPDATE SET x = id + | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id); - t | 1 | EXPLAIN (COSTS OFF) MERGE INTO stats_track_tab + - | | USING (SELECT id FROM generate_series(1, 10) id) ON x = id + - | | WHEN MATCHED THEN UPDATE SET x = id + - | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id) + t | 1 | EXPLAIN (COSTS OFF) SELECT $1 + t | 1 | EXPLAIN (COSTS OFF) SELECT $1 UNION SELECT $2 f | 1 | EXPLAIN (COSTS OFF) SELECT $1 UNION SELECT $2; f | 1 | EXPLAIN (COSTS OFF) SELECT $1; - t | 1 | EXPLAIN (COSTS OFF) SELECT 1 - t | 1 | EXPLAIN (COSTS OFF) SELECT 1 UNION SELECT 2 t | 1 | EXPLAIN (COSTS OFF) TABLE stats_track_tab f | 1 | EXPLAIN (COSTS OFF) TABLE stats_track_tab; + t | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = $1 WHERE x = $2 f | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = $1 WHERE x = $2; - t | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = 1 WHERE x = 1 + t | 1 | EXPLAIN (COSTS OFF) VALUES ($1) f | 1 | EXPLAIN (COSTS OFF) VALUES ($1); - t | 1 | EXPLAIN (COSTS OFF) VALUES (1) t | 1 | SELECT pg_stat_monitor_reset() (23 rows) @@ -349,22 +349,22 @@ EXPLAIN (COSTS OFF) SELECT 1 UNION SELECT 2; SELECT toplevel, calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; - toplevel | calls | query -----------+-------+------------------------------------------------------------------ - t | 1 | EXPLAIN (COSTS OFF) (SELECT 1, 2) + toplevel | calls | query +----------+-------+-------------------------------------------------------------------- + t | 1 | EXPLAIN (COSTS OFF) (SELECT $1, $2) t | 1 | EXPLAIN (COSTS OFF) (TABLE test_table) - t | 1 | EXPLAIN (COSTS OFF) (VALUES (1, 2)) + t | 1 | EXPLAIN (COSTS OFF) (VALUES ($1, $2)) t | 1 | EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab - t | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES ((1)) - t | 1 | EXPLAIN (COSTS OFF) MERGE INTO stats_track_tab + - | | USING (SELECT id FROM generate_series(1, 10) id) ON x = id + - | | WHEN MATCHED THEN UPDATE SET x = id + + t | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES (($1)) + t | 1 | EXPLAIN (COSTS OFF) MERGE INTO stats_track_tab + + | | USING (SELECT id FROM generate_series($1, $2) id) ON x = id + + | | WHEN MATCHED THEN UPDATE SET x = id + | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id) - t | 1 | EXPLAIN (COSTS OFF) SELECT 1 - t | 1 | EXPLAIN (COSTS OFF) SELECT 1 UNION SELECT 2 + t | 1 | EXPLAIN (COSTS OFF) SELECT $1 + t | 1 | EXPLAIN (COSTS OFF) SELECT $1 UNION SELECT $2 t | 1 | EXPLAIN (COSTS OFF) TABLE stats_track_tab - t | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = 1 WHERE x = 1 - t | 1 | EXPLAIN (COSTS OFF) VALUES (1) + t | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = $1 WHERE x = $2 + t | 1 | EXPLAIN (COSTS OFF) VALUES ($1) t | 1 | SELECT pg_stat_monitor_reset() (12 rows) @@ -424,16 +424,16 @@ SELECT toplevel, calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; toplevel | calls | query ----------+-------+--------------------------------------------------------------------------------------------------------------------- + t | 1 | EXPLAIN (COSTS OFF) (SELECT $1, $2, $3) + t | 1 | EXPLAIN (COSTS OFF) (SELECT $1, $2, $3) UNION SELECT $4, $5, $6 f | 1 | EXPLAIN (COSTS OFF) (SELECT $1, $2, $3); EXPLAIN (COSTS OFF) (SELECT 1, 2, 3, 4); - t | 1 | EXPLAIN (COSTS OFF) (SELECT 1, 2, 3) - t | 1 | EXPLAIN (COSTS OFF) (SELECT 1, 2, 3) UNION SELECT 3, 4, 5 + t | 1 | EXPLAIN (COSTS OFF) (SELECT $1, $2, $3, $4) f | 1 | EXPLAIN (COSTS OFF) (SELECT 1, 2, 3); EXPLAIN (COSTS OFF) (SELECT $1, $2, $3, $4); - t | 1 | EXPLAIN (COSTS OFF) (SELECT 1, 2, 3, 4) + t | 1 | EXPLAIN (COSTS OFF) SELECT $1 + t | 1 | EXPLAIN (COSTS OFF) SELECT $1, $2 + t | 1 | EXPLAIN (COSTS OFF) SELECT $1, $2 UNION SELECT $3, $4 f | 1 | EXPLAIN (COSTS OFF) SELECT $1, $2 UNION SELECT $3, $4; EXPLAIN (COSTS OFF) (SELECT 1, 2, 3) UNION SELECT 3, 4, 5; f | 1 | EXPLAIN (COSTS OFF) SELECT $1; EXPLAIN (COSTS OFF) SELECT 1, 2; - t | 1 | EXPLAIN (COSTS OFF) SELECT 1 - t | 1 | EXPLAIN (COSTS OFF) SELECT 1, 2 - t | 1 | EXPLAIN (COSTS OFF) SELECT 1, 2 UNION SELECT 3, 4 f | 1 | EXPLAIN (COSTS OFF) SELECT 1, 2 UNION SELECT 3, 4; EXPLAIN (COSTS OFF) (SELECT $1, $2, $3) UNION SELECT $4, $5, $6; f | 1 | EXPLAIN (COSTS OFF) SELECT 1; EXPLAIN (COSTS OFF) SELECT $1, $2; t | 1 | SELECT pg_stat_monitor_reset() @@ -514,24 +514,24 @@ SELECT toplevel, calls, query FROM pg_stat_monitor toplevel | calls | query ----------+-------+---------------------------------------------------------------------------------------------------------------------------------- t | 1 | EXPLAIN (COSTS OFF) (TABLE test_table) - t | 1 | EXPLAIN (COSTS OFF) (VALUES (1, 2)) + t | 1 | EXPLAIN (COSTS OFF) (VALUES ($1, $2)) t | 1 | EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab - t | 1 | EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab WHERE x = 1 + t | 1 | EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab WHERE x = $1 f | 1 | EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab; EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab WHERE x = $1; f | 1 | EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab; EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab WHERE x = 1; + t | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES ($1), ($2) + t | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES (($1)) f | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES (($1)); EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES (1), (2); - t | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES ((1)) f | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES ((1)); EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES ($1), ($2); - t | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES (1), (2) t | 1 | EXPLAIN (COSTS OFF) TABLE stats_track_tab f | 1 | EXPLAIN (COSTS OFF) TABLE stats_track_tab; EXPLAIN (COSTS OFF) (TABLE test_table); f | 1 | EXPLAIN (COSTS OFF) TABLE stats_track_tab; EXPLAIN (COSTS OFF) (TABLE test_table); + t | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = $1 + t | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = $1 WHERE x = $2 f | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = $1 WHERE x = $2; EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = 1; - t | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = 1 - t | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = 1 WHERE x = 1 f | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = 1 WHERE x = 1; EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = $1; + t | 1 | EXPLAIN (COSTS OFF) VALUES ($1) f | 1 | EXPLAIN (COSTS OFF) VALUES ($1); EXPLAIN (COSTS OFF) (VALUES (1, 2)); - t | 1 | EXPLAIN (COSTS OFF) VALUES (1) f | 1 | EXPLAIN (COSTS OFF) VALUES (1); EXPLAIN (COSTS OFF) (VALUES ($1, $2)); t | 1 | SELECT pg_stat_monitor_reset() (21 rows) @@ -568,19 +568,19 @@ SELECT toplevel, calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; toplevel | calls | query ----------+-------+------------------------------------------------------------------------------------------------ + t | 1 | EXPLAIN (COSTS OFF) MERGE INTO stats_track_tab + + | | USING (SELECT id FROM generate_series($1, $2) id) ON x = id + + | | WHEN MATCHED THEN UPDATE SET x = id + + | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id) f | 1 | EXPLAIN (COSTS OFF) MERGE INTO stats_track_tab + | | USING (SELECT id FROM generate_series($1, $2) id) ON x = id + | | WHEN MATCHED THEN UPDATE SET x = id + | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id); EXPLAIN (COSTS OFF) SELECT 1, 2, 3, 4, 5; - t | 1 | EXPLAIN (COSTS OFF) MERGE INTO stats_track_tab + - | | USING (SELECT id FROM generate_series(1, 10) id) ON x = id + - | | WHEN MATCHED THEN UPDATE SET x = id + - | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id) f | 1 | EXPLAIN (COSTS OFF) MERGE INTO stats_track_tab + | | USING (SELECT id FROM generate_series(1, 10) id) ON x = id + | | WHEN MATCHED THEN UPDATE SET x = id + | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id); EXPLAIN (COSTS OFF) SELECT $1, $2, $3, $4, $5; - t | 1 | EXPLAIN (COSTS OFF) SELECT 1, 2, 3, 4, 5 + t | 1 | EXPLAIN (COSTS OFF) SELECT $1, $2, $3, $4, $5 t | 1 | SELECT pg_stat_monitor_reset() (5 rows) @@ -719,26 +719,26 @@ SELECT toplevel, calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; toplevel | calls | query ----------+-------+---------------------------------------------------------------------------------------------------------------------------------- - t | 1 | EXPLAIN (COSTS OFF) (SELECT 1, 2, 3) - t | 1 | EXPLAIN (COSTS OFF) (SELECT 1, 2, 3) UNION SELECT 3, 4, 5 - t | 1 | EXPLAIN (COSTS OFF) (SELECT 1, 2, 3, 4) + t | 1 | EXPLAIN (COSTS OFF) (SELECT $1, $2, $3) + t | 1 | EXPLAIN (COSTS OFF) (SELECT $1, $2, $3) UNION SELECT $4, $5, $6 + t | 1 | EXPLAIN (COSTS OFF) (SELECT $1, $2, $3, $4) t | 1 | EXPLAIN (COSTS OFF) (TABLE test_table) - t | 1 | EXPLAIN (COSTS OFF) (VALUES (1, 2)) + t | 1 | EXPLAIN (COSTS OFF) (VALUES ($1, $2)) t | 1 | EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab - t | 1 | EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab WHERE x = 1 - t | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES ((1)) + t | 1 | EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab WHERE x = $1 + t | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES (($1)) t | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES ((1)); EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES ((1), (2)); - t | 1 | EXPLAIN (COSTS OFF) MERGE INTO stats_track_tab USING (SELECT id FROM generate_series(1, 10) id) ON x = id + + t | 1 | EXPLAIN (COSTS OFF) MERGE INTO stats_track_tab USING (SELECT id FROM generate_series($1, $2) id) ON x = id + | | WHEN MATCHED THEN UPDATE SET x = id + | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id) - t | 1 | EXPLAIN (COSTS OFF) SELECT 1 - t | 1 | EXPLAIN (COSTS OFF) SELECT 1, 2 - t | 1 | EXPLAIN (COSTS OFF) SELECT 1, 2 UNION SELECT 3, 4 - t | 1 | EXPLAIN (COSTS OFF) SELECT 1, 2, 3, 4, 5 + t | 1 | EXPLAIN (COSTS OFF) SELECT $1 + t | 1 | EXPLAIN (COSTS OFF) SELECT $1, $2 + t | 1 | EXPLAIN (COSTS OFF) SELECT $1, $2 UNION SELECT $3, $4 + t | 1 | EXPLAIN (COSTS OFF) SELECT $1, $2, $3, $4, $5 t | 1 | EXPLAIN (COSTS OFF) TABLE stats_track_tab - t | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = 1 - t | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = 1 WHERE x = 1 - t | 1 | EXPLAIN (COSTS OFF) VALUES (1) + t | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = $1 + t | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = $1 WHERE x = $2 + t | 1 | EXPLAIN (COSTS OFF) VALUES ($1) t | 1 | SELECT pg_stat_monitor_reset() (19 rows) @@ -815,26 +815,26 @@ SELECT toplevel, calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; toplevel | calls | query ----------+-------+------------------------------------------------------------------------------------------- + t | 1 | EXPLAIN (COSTS OFF) (WITH a AS (SELECT $1) (SELECT $2, $3)) f | 1 | EXPLAIN (COSTS OFF) (WITH a AS (SELECT $1) (SELECT $2, $3)); - t | 1 | EXPLAIN (COSTS OFF) (WITH a AS (SELECT 4) (SELECT 1, 2)) + t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) DELETE FROM stats_track_tab f | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) DELETE FROM stats_track_tab; + t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) INSERT INTO stats_track_tab VALUES (($2)) f | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) INSERT INTO stats_track_tab VALUES (($2)); + t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) MERGE INTO stats_track_tab + + | | USING (SELECT id FROM generate_series($2, $3) id) ON x = id + + | | WHEN MATCHED THEN UPDATE SET x = id + + | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id) f | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) MERGE INTO stats_track_tab + | | USING (SELECT id FROM generate_series($2, $3) id) ON x = id + | | WHEN MATCHED THEN UPDATE SET x = id + | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id); + t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) SELECT $2 + t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) SELECT $2 UNION SELECT $3 f | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) SELECT $2 UNION SELECT $3; f | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) SELECT $2; + t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) UPDATE stats_track_tab SET x = $2 WHERE x = $3 f | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) UPDATE stats_track_tab SET x = $2 WHERE x = $3; - t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) DELETE FROM stats_track_tab - t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) INSERT INTO stats_track_tab VALUES ((1)) - t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) MERGE INTO stats_track_tab + - | | USING (SELECT id FROM generate_series(1, 10) id) ON x = id + - | | WHEN MATCHED THEN UPDATE SET x = id + - | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id) - t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) SELECT 1 - t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) SELECT 1 UNION SELECT 2 - t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) UPDATE stats_track_tab SET x = 1 WHERE x = 1 t | 1 | SELECT pg_stat_monitor_reset() (15 rows) @@ -909,18 +909,18 @@ EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) SELECT 1 UNION SELECT 2; SELECT toplevel, calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; - toplevel | calls | query -----------+-------+--------------------------------------------------------------------------------------- - t | 1 | EXPLAIN (COSTS OFF) (WITH a AS (SELECT 4) (SELECT 1, 2)) - t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) DELETE FROM stats_track_tab - t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) INSERT INTO stats_track_tab VALUES ((1)) - t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) MERGE INTO stats_track_tab + - | | USING (SELECT id FROM generate_series(1, 10) id) ON x = id + - | | WHEN MATCHED THEN UPDATE SET x = id + + toplevel | calls | query +----------+-------+------------------------------------------------------------------------------------------ + t | 1 | EXPLAIN (COSTS OFF) (WITH a AS (SELECT $1) (SELECT $2, $3)) + t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) DELETE FROM stats_track_tab + t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) INSERT INTO stats_track_tab VALUES (($2)) + t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) MERGE INTO stats_track_tab + + | | USING (SELECT id FROM generate_series($2, $3) id) ON x = id + + | | WHEN MATCHED THEN UPDATE SET x = id + | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id) - t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) SELECT 1 - t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) SELECT 1 UNION SELECT 2 - t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) UPDATE stats_track_tab SET x = 1 WHERE x = 1 + t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) SELECT $2 + t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) SELECT $2 UNION SELECT $3 + t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) UPDATE stats_track_tab SET x = $2 WHERE x = $3 t | 1 | SELECT pg_stat_monitor_reset() (8 rows) @@ -951,8 +951,8 @@ SELECT toplevel, calls, query FROM pg_stat_monitor ----------+-------+------------------------------------------------------------------------------- t | 1 | EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) + | | DECLARE foocur CURSOR FOR SELECT * FROM stats_track_tab + t | 1 | EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) SELECT $1 f | 1 | EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) SELECT $1; - t | 1 | EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) SELECT 100 t | 1 | SELECT pg_stat_monitor_reset() (4 rows) @@ -979,11 +979,11 @@ EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) SELECT toplevel, calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; - toplevel | calls | query -----------+-------+------------------------------------------------------------------------------- - t | 1 | EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) + + toplevel | calls | query +----------+-------+------------------------------------------------------------------------------ + t | 1 | EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) + | | DECLARE foocur CURSOR FOR SELECT * FROM stats_track_tab - t | 1 | EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) SELECT 100 + t | 1 | EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) SELECT $1 t | 1 | SELECT pg_stat_monitor_reset() (3 rows) @@ -1002,7 +1002,7 @@ SELECT toplevel, calls, query FROM pg_stat_monitor toplevel | calls | query ----------+-------+---------------------------------------------------- t | 1 | CREATE MATERIALIZED VIEW pgsm_materialized_view AS+ - | | SELECT * FROM generate_series(1, 5) AS id + | | SELECT * FROM generate_series($1, $2) AS id t | 1 | SELECT pg_stat_monitor_reset() (2 rows) @@ -1021,7 +1021,7 @@ SELECT toplevel, calls, query FROM pg_stat_monitor toplevel | calls | query ----------+-------+------------------------------------------------------ t | 1 | CREATE MATERIALIZED VIEW pgsm_materialized_view_2 AS+ - | | SELECT * FROM generate_series(1, 5) AS id + | | SELECT * FROM generate_series($1, $2) AS id t | 1 | SELECT pg_stat_monitor_reset() (2 rows) @@ -1074,7 +1074,7 @@ SELECT toplevel, calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; toplevel | calls | query ----------+-------+----------------------------------------------------------------- - t | 1 | CREATE TEMPORARY TABLE pgsm_ctas_1 AS SELECT 1 + t | 1 | CREATE TEMPORARY TABLE pgsm_ctas_1 AS SELECT $1 t | 1 | CREATE TEMPORARY TABLE pgsm_ctas_2 AS EXECUTE test_prepare_pgsm f | 1 | PREPARE test_prepare_pgsm AS SELECT generate_series($1, $2) t | 1 | SELECT pg_stat_monitor_reset() @@ -1094,7 +1094,7 @@ SELECT toplevel, calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; toplevel | calls | query ----------+-------+----------------------------------------------------------------- - t | 1 | CREATE TEMPORARY TABLE pgsm_ctas_3 AS SELECT 1 + t | 1 | CREATE TEMPORARY TABLE pgsm_ctas_3 AS SELECT $1 t | 1 | CREATE TEMPORARY TABLE pgsm_ctas_4 AS EXECUTE test_prepare_pgsm t | 1 | SELECT pg_stat_monitor_reset() (3 rows) @@ -1115,9 +1115,9 @@ EXPLAIN (COSTS OFF) CREATE TEMPORARY TABLE pgsm_explain_ctas AS SELECT 1; SELECT toplevel, calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; - toplevel | calls | query -----------+-------+-------------------------------------------------------------------------- - t | 1 | EXPLAIN (COSTS OFF) CREATE TEMPORARY TABLE pgsm_explain_ctas AS SELECT 1 + toplevel | calls | query +----------+-------+--------------------------------------------------------------------------- + t | 1 | EXPLAIN (COSTS OFF) CREATE TEMPORARY TABLE pgsm_explain_ctas AS SELECT $1 t | 1 | SELECT pg_stat_monitor_reset() (2 rows) @@ -1137,9 +1137,9 @@ EXPLAIN (COSTS OFF) CREATE TEMPORARY TABLE pgsm_explain_ctas AS SELECT 1; SELECT toplevel, calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; - toplevel | calls | query -----------+-------+-------------------------------------------------------------------------- - t | 1 | EXPLAIN (COSTS OFF) CREATE TEMPORARY TABLE pgsm_explain_ctas AS SELECT 1 + toplevel | calls | query +----------+-------+--------------------------------------------------------------------------- + t | 1 | EXPLAIN (COSTS OFF) CREATE TEMPORARY TABLE pgsm_explain_ctas AS SELECT $1 t | 1 | SELECT pg_stat_monitor_reset() (2 rows) diff --git a/regression/expected/level_tracking_2.out b/regression/expected/level_tracking_2.out index 09418a6c..a022688e 100644 --- a/regression/expected/level_tracking_2.out +++ b/regression/expected/level_tracking_2.out @@ -60,24 +60,24 @@ END $$; SELECT toplevel, calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C", toplevel; - toplevel | calls | query -----------+-------+---------------------------------------- + toplevel | calls | query +----------+-------+------------------------------------- f | 1 | DELETE FROM stats_track_tab t | 1 | DELETE FROM stats_track_tab - t | 1 | DO $$ + - | | BEGIN + - | | -- this is a SELECT + - | | PERFORM 'hello world'::text; + - | | END + + t | 1 | DO $$ + + | | BEGIN + + | | -- this is a SELECT + + | | PERFORM 'hello world'::text; + + | | END + | | $$ - t | 1 | DO $$ + - | | BEGIN + - | | DELETE FROM stats_track_tab; + - | | END + + t | 1 | DO $$ + + | | BEGIN + + | | DELETE FROM stats_track_tab; + + | | END + | | $$ f | 1 | SELECT $1::text t | 1 | SELECT pg_stat_monitor_reset() - t | 1 | SET pg_stat_monitor.pgsm_track = 'all' + t | 1 | SET pg_stat_monitor.pgsm_track = $1 (7 rows) -- Procedure with multiple utility statements. @@ -223,34 +223,34 @@ SELECT toplevel, calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; toplevel | calls | query ----------+-------+--------------------------------------------------------------------- + t | 1 | EXPLAIN (COSTS OFF) (SELECT $1, $2) f | 1 | EXPLAIN (COSTS OFF) (SELECT $1, $2); - t | 1 | EXPLAIN (COSTS OFF) (SELECT 1, 2) t | 1 | EXPLAIN (COSTS OFF) (TABLE test_table) f | 1 | EXPLAIN (COSTS OFF) (TABLE test_table); + t | 1 | EXPLAIN (COSTS OFF) (VALUES ($1, $2)) f | 1 | EXPLAIN (COSTS OFF) (VALUES ($1, $2)); - t | 1 | EXPLAIN (COSTS OFF) (VALUES (1, 2)) t | 1 | EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab f | 1 | EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab; + t | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES (($1)) f | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES (($1)); - t | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES ((1)) + t | 1 | EXPLAIN (COSTS OFF) MERGE INTO stats_track_tab + + | | USING (SELECT id FROM generate_series($1, $2) id) ON x = id + + | | WHEN MATCHED THEN UPDATE SET x = id + + | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id) f | 1 | EXPLAIN (COSTS OFF) MERGE INTO stats_track_tab + | | USING (SELECT id FROM generate_series($1, $2) id) ON x = id + | | WHEN MATCHED THEN UPDATE SET x = id + | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id); - t | 1 | EXPLAIN (COSTS OFF) MERGE INTO stats_track_tab + - | | USING (SELECT id FROM generate_series(1, 10) id) ON x = id + - | | WHEN MATCHED THEN UPDATE SET x = id + - | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id) + t | 1 | EXPLAIN (COSTS OFF) SELECT $1 + t | 1 | EXPLAIN (COSTS OFF) SELECT $1 UNION SELECT $2 f | 1 | EXPLAIN (COSTS OFF) SELECT $1 UNION SELECT $2; f | 1 | EXPLAIN (COSTS OFF) SELECT $1; - t | 1 | EXPLAIN (COSTS OFF) SELECT 1 - t | 1 | EXPLAIN (COSTS OFF) SELECT 1 UNION SELECT 2 t | 1 | EXPLAIN (COSTS OFF) TABLE stats_track_tab f | 1 | EXPLAIN (COSTS OFF) TABLE stats_track_tab; + t | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = $1 WHERE x = $2 f | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = $1 WHERE x = $2; - t | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = 1 WHERE x = 1 + t | 1 | EXPLAIN (COSTS OFF) VALUES ($1) f | 1 | EXPLAIN (COSTS OFF) VALUES ($1); - t | 1 | EXPLAIN (COSTS OFF) VALUES (1) t | 1 | SELECT pg_stat_monitor_reset() (23 rows) @@ -349,22 +349,22 @@ EXPLAIN (COSTS OFF) SELECT 1 UNION SELECT 2; SELECT toplevel, calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; - toplevel | calls | query -----------+-------+------------------------------------------------------------------ - t | 1 | EXPLAIN (COSTS OFF) (SELECT 1, 2) + toplevel | calls | query +----------+-------+-------------------------------------------------------------------- + t | 1 | EXPLAIN (COSTS OFF) (SELECT $1, $2) t | 1 | EXPLAIN (COSTS OFF) (TABLE test_table) - t | 1 | EXPLAIN (COSTS OFF) (VALUES (1, 2)) + t | 1 | EXPLAIN (COSTS OFF) (VALUES ($1, $2)) t | 1 | EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab - t | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES ((1)) - t | 1 | EXPLAIN (COSTS OFF) MERGE INTO stats_track_tab + - | | USING (SELECT id FROM generate_series(1, 10) id) ON x = id + - | | WHEN MATCHED THEN UPDATE SET x = id + + t | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES (($1)) + t | 1 | EXPLAIN (COSTS OFF) MERGE INTO stats_track_tab + + | | USING (SELECT id FROM generate_series($1, $2) id) ON x = id + + | | WHEN MATCHED THEN UPDATE SET x = id + | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id) - t | 1 | EXPLAIN (COSTS OFF) SELECT 1 - t | 1 | EXPLAIN (COSTS OFF) SELECT 1 UNION SELECT 2 + t | 1 | EXPLAIN (COSTS OFF) SELECT $1 + t | 1 | EXPLAIN (COSTS OFF) SELECT $1 UNION SELECT $2 t | 1 | EXPLAIN (COSTS OFF) TABLE stats_track_tab - t | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = 1 WHERE x = 1 - t | 1 | EXPLAIN (COSTS OFF) VALUES (1) + t | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = $1 WHERE x = $2 + t | 1 | EXPLAIN (COSTS OFF) VALUES ($1) t | 1 | SELECT pg_stat_monitor_reset() (12 rows) @@ -424,16 +424,16 @@ SELECT toplevel, calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; toplevel | calls | query ----------+-------+--------------------------------------------------------------------------------------------------------------------- + t | 1 | EXPLAIN (COSTS OFF) (SELECT $1, $2, $3) + t | 1 | EXPLAIN (COSTS OFF) (SELECT $1, $2, $3) UNION SELECT $4, $5, $6 f | 1 | EXPLAIN (COSTS OFF) (SELECT $1, $2, $3); EXPLAIN (COSTS OFF) (SELECT 1, 2, 3, 4); - t | 1 | EXPLAIN (COSTS OFF) (SELECT 1, 2, 3) - t | 1 | EXPLAIN (COSTS OFF) (SELECT 1, 2, 3) UNION SELECT 3, 4, 5 + t | 1 | EXPLAIN (COSTS OFF) (SELECT $1, $2, $3, $4) f | 1 | EXPLAIN (COSTS OFF) (SELECT 1, 2, 3); EXPLAIN (COSTS OFF) (SELECT $1, $2, $3, $4); - t | 1 | EXPLAIN (COSTS OFF) (SELECT 1, 2, 3, 4) + t | 1 | EXPLAIN (COSTS OFF) SELECT $1 + t | 1 | EXPLAIN (COSTS OFF) SELECT $1, $2 + t | 1 | EXPLAIN (COSTS OFF) SELECT $1, $2 UNION SELECT $3, $4 f | 1 | EXPLAIN (COSTS OFF) SELECT $1, $2 UNION SELECT $3, $4; EXPLAIN (COSTS OFF) (SELECT 1, 2, 3) UNION SELECT 3, 4, 5; f | 1 | EXPLAIN (COSTS OFF) SELECT $1; EXPLAIN (COSTS OFF) SELECT 1, 2; - t | 1 | EXPLAIN (COSTS OFF) SELECT 1 - t | 1 | EXPLAIN (COSTS OFF) SELECT 1, 2 - t | 1 | EXPLAIN (COSTS OFF) SELECT 1, 2 UNION SELECT 3, 4 f | 1 | EXPLAIN (COSTS OFF) SELECT 1, 2 UNION SELECT 3, 4; EXPLAIN (COSTS OFF) (SELECT $1, $2, $3) UNION SELECT $4, $5, $6; f | 1 | EXPLAIN (COSTS OFF) SELECT 1; EXPLAIN (COSTS OFF) SELECT $1, $2; t | 1 | SELECT pg_stat_monitor_reset() @@ -514,24 +514,24 @@ SELECT toplevel, calls, query FROM pg_stat_monitor toplevel | calls | query ----------+-------+---------------------------------------------------------------------------------------------------------------------------------- t | 1 | EXPLAIN (COSTS OFF) (TABLE test_table) - t | 1 | EXPLAIN (COSTS OFF) (VALUES (1, 2)) + t | 1 | EXPLAIN (COSTS OFF) (VALUES ($1, $2)) t | 1 | EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab - t | 1 | EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab WHERE x = 1 + t | 1 | EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab WHERE x = $1 f | 1 | EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab; EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab WHERE x = $1; f | 1 | EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab; EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab WHERE x = 1; + t | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES ($1), ($2) + t | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES (($1)) f | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES (($1)); EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES (1), (2); - t | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES ((1)) f | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES ((1)); EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES ($1), ($2); - t | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES (1), (2) t | 1 | EXPLAIN (COSTS OFF) TABLE stats_track_tab f | 1 | EXPLAIN (COSTS OFF) TABLE stats_track_tab; EXPLAIN (COSTS OFF) (TABLE test_table); f | 1 | EXPLAIN (COSTS OFF) TABLE stats_track_tab; EXPLAIN (COSTS OFF) (TABLE test_table); + t | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = $1 + t | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = $1 WHERE x = $2 f | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = $1 WHERE x = $2; EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = 1; - t | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = 1 - t | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = 1 WHERE x = 1 f | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = 1 WHERE x = 1; EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = $1; + t | 1 | EXPLAIN (COSTS OFF) VALUES ($1) f | 1 | EXPLAIN (COSTS OFF) VALUES ($1); EXPLAIN (COSTS OFF) (VALUES (1, 2)); - t | 1 | EXPLAIN (COSTS OFF) VALUES (1) f | 1 | EXPLAIN (COSTS OFF) VALUES (1); EXPLAIN (COSTS OFF) (VALUES ($1, $2)); t | 1 | SELECT pg_stat_monitor_reset() (21 rows) @@ -568,19 +568,19 @@ SELECT toplevel, calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; toplevel | calls | query ----------+-------+------------------------------------------------------------------------------------------------ + t | 1 | EXPLAIN (COSTS OFF) MERGE INTO stats_track_tab + + | | USING (SELECT id FROM generate_series($1, $2) id) ON x = id + + | | WHEN MATCHED THEN UPDATE SET x = id + + | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id) f | 1 | EXPLAIN (COSTS OFF) MERGE INTO stats_track_tab + | | USING (SELECT id FROM generate_series($1, $2) id) ON x = id + | | WHEN MATCHED THEN UPDATE SET x = id + | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id); EXPLAIN (COSTS OFF) SELECT 1, 2, 3, 4, 5; - t | 1 | EXPLAIN (COSTS OFF) MERGE INTO stats_track_tab + - | | USING (SELECT id FROM generate_series(1, 10) id) ON x = id + - | | WHEN MATCHED THEN UPDATE SET x = id + - | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id) f | 1 | EXPLAIN (COSTS OFF) MERGE INTO stats_track_tab + | | USING (SELECT id FROM generate_series(1, 10) id) ON x = id + | | WHEN MATCHED THEN UPDATE SET x = id + | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id); EXPLAIN (COSTS OFF) SELECT $1, $2, $3, $4, $5; - t | 1 | EXPLAIN (COSTS OFF) SELECT 1, 2, 3, 4, 5 + t | 1 | EXPLAIN (COSTS OFF) SELECT $1, $2, $3, $4, $5 t | 1 | SELECT pg_stat_monitor_reset() (5 rows) @@ -719,26 +719,26 @@ SELECT toplevel, calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; toplevel | calls | query ----------+-------+---------------------------------------------------------------------------------------------------------------------------------- - t | 1 | EXPLAIN (COSTS OFF) (SELECT 1, 2, 3) - t | 1 | EXPLAIN (COSTS OFF) (SELECT 1, 2, 3) UNION SELECT 3, 4, 5 - t | 1 | EXPLAIN (COSTS OFF) (SELECT 1, 2, 3, 4) + t | 1 | EXPLAIN (COSTS OFF) (SELECT $1, $2, $3) + t | 1 | EXPLAIN (COSTS OFF) (SELECT $1, $2, $3) UNION SELECT $4, $5, $6 + t | 1 | EXPLAIN (COSTS OFF) (SELECT $1, $2, $3, $4) t | 1 | EXPLAIN (COSTS OFF) (TABLE test_table) - t | 1 | EXPLAIN (COSTS OFF) (VALUES (1, 2)) + t | 1 | EXPLAIN (COSTS OFF) (VALUES ($1, $2)) t | 1 | EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab - t | 1 | EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab WHERE x = 1 - t | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES ((1)) + t | 1 | EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab WHERE x = $1 + t | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES (($1)) t | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES ((1)); EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES ((1), (2)); - t | 1 | EXPLAIN (COSTS OFF) MERGE INTO stats_track_tab USING (SELECT id FROM generate_series(1, 10) id) ON x = id + + t | 1 | EXPLAIN (COSTS OFF) MERGE INTO stats_track_tab USING (SELECT id FROM generate_series($1, $2) id) ON x = id + | | WHEN MATCHED THEN UPDATE SET x = id + | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id) - t | 1 | EXPLAIN (COSTS OFF) SELECT 1 - t | 1 | EXPLAIN (COSTS OFF) SELECT 1, 2 - t | 1 | EXPLAIN (COSTS OFF) SELECT 1, 2 UNION SELECT 3, 4 - t | 1 | EXPLAIN (COSTS OFF) SELECT 1, 2, 3, 4, 5 + t | 1 | EXPLAIN (COSTS OFF) SELECT $1 + t | 1 | EXPLAIN (COSTS OFF) SELECT $1, $2 + t | 1 | EXPLAIN (COSTS OFF) SELECT $1, $2 UNION SELECT $3, $4 + t | 1 | EXPLAIN (COSTS OFF) SELECT $1, $2, $3, $4, $5 t | 1 | EXPLAIN (COSTS OFF) TABLE stats_track_tab - t | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = 1 - t | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = 1 WHERE x = 1 - t | 1 | EXPLAIN (COSTS OFF) VALUES (1) + t | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = $1 + t | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = $1 WHERE x = $2 + t | 1 | EXPLAIN (COSTS OFF) VALUES ($1) t | 1 | SELECT pg_stat_monitor_reset() (19 rows) @@ -815,26 +815,26 @@ SELECT toplevel, calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; toplevel | calls | query ----------+-------+------------------------------------------------------------------------------------------- + t | 1 | EXPLAIN (COSTS OFF) (WITH a AS (SELECT $1) (SELECT $2, $3)) f | 1 | EXPLAIN (COSTS OFF) (WITH a AS (SELECT $1) (SELECT $2, $3)); - t | 1 | EXPLAIN (COSTS OFF) (WITH a AS (SELECT 4) (SELECT 1, 2)) + t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) DELETE FROM stats_track_tab f | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) DELETE FROM stats_track_tab; + t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) INSERT INTO stats_track_tab VALUES (($2)) f | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) INSERT INTO stats_track_tab VALUES (($2)); + t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) MERGE INTO stats_track_tab + + | | USING (SELECT id FROM generate_series($2, $3) id) ON x = id + + | | WHEN MATCHED THEN UPDATE SET x = id + + | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id) f | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) MERGE INTO stats_track_tab + | | USING (SELECT id FROM generate_series($2, $3) id) ON x = id + | | WHEN MATCHED THEN UPDATE SET x = id + | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id); + t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) SELECT $2 + t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) SELECT $2 UNION SELECT $3 f | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) SELECT $2 UNION SELECT $3; f | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) SELECT $2; + t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) UPDATE stats_track_tab SET x = $2 WHERE x = $3 f | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) UPDATE stats_track_tab SET x = $2 WHERE x = $3; - t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) DELETE FROM stats_track_tab - t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) INSERT INTO stats_track_tab VALUES ((1)) - t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) MERGE INTO stats_track_tab + - | | USING (SELECT id FROM generate_series(1, 10) id) ON x = id + - | | WHEN MATCHED THEN UPDATE SET x = id + - | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id) - t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) SELECT 1 - t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) SELECT 1 UNION SELECT 2 - t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) UPDATE stats_track_tab SET x = 1 WHERE x = 1 t | 1 | SELECT pg_stat_monitor_reset() (15 rows) @@ -909,18 +909,18 @@ EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) SELECT 1 UNION SELECT 2; SELECT toplevel, calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; - toplevel | calls | query -----------+-------+--------------------------------------------------------------------------------------- - t | 1 | EXPLAIN (COSTS OFF) (WITH a AS (SELECT 4) (SELECT 1, 2)) - t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) DELETE FROM stats_track_tab - t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) INSERT INTO stats_track_tab VALUES ((1)) - t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) MERGE INTO stats_track_tab + - | | USING (SELECT id FROM generate_series(1, 10) id) ON x = id + - | | WHEN MATCHED THEN UPDATE SET x = id + + toplevel | calls | query +----------+-------+------------------------------------------------------------------------------------------ + t | 1 | EXPLAIN (COSTS OFF) (WITH a AS (SELECT $1) (SELECT $2, $3)) + t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) DELETE FROM stats_track_tab + t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) INSERT INTO stats_track_tab VALUES (($2)) + t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) MERGE INTO stats_track_tab + + | | USING (SELECT id FROM generate_series($2, $3) id) ON x = id + + | | WHEN MATCHED THEN UPDATE SET x = id + | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id) - t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) SELECT 1 - t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) SELECT 1 UNION SELECT 2 - t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) UPDATE stats_track_tab SET x = 1 WHERE x = 1 + t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) SELECT $2 + t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) SELECT $2 UNION SELECT $3 + t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) UPDATE stats_track_tab SET x = $2 WHERE x = $3 t | 1 | SELECT pg_stat_monitor_reset() (8 rows) @@ -953,8 +953,8 @@ SELECT toplevel, calls, query FROM pg_stat_monitor | | DECLARE foocur CURSOR FOR SELECT * FROM stats_track_tab f | 1 | EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) + | | DECLARE foocur CURSOR FOR SELECT * FROM stats_track_tab; + t | 1 | EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) SELECT $1 f | 1 | EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) SELECT $1; - t | 1 | EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) SELECT 100 t | 1 | SELECT pg_stat_monitor_reset() (5 rows) @@ -981,11 +981,11 @@ EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) SELECT toplevel, calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; - toplevel | calls | query -----------+-------+------------------------------------------------------------------------------- - t | 1 | EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) + + toplevel | calls | query +----------+-------+------------------------------------------------------------------------------ + t | 1 | EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) + | | DECLARE foocur CURSOR FOR SELECT * FROM stats_track_tab - t | 1 | EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) SELECT 100 + t | 1 | EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) SELECT $1 t | 1 | SELECT pg_stat_monitor_reset() (3 rows) @@ -1004,7 +1004,7 @@ SELECT toplevel, calls, query FROM pg_stat_monitor toplevel | calls | query ----------+-------+---------------------------------------------------- t | 1 | CREATE MATERIALIZED VIEW pgsm_materialized_view AS+ - | | SELECT * FROM generate_series(1, 5) AS id + | | SELECT * FROM generate_series($1, $2) AS id t | 1 | SELECT pg_stat_monitor_reset() (2 rows) @@ -1023,7 +1023,7 @@ SELECT toplevel, calls, query FROM pg_stat_monitor toplevel | calls | query ----------+-------+------------------------------------------------------ t | 1 | CREATE MATERIALIZED VIEW pgsm_materialized_view_2 AS+ - | | SELECT * FROM generate_series(1, 5) AS id + | | SELECT * FROM generate_series($1, $2) AS id t | 1 | SELECT pg_stat_monitor_reset() (2 rows) @@ -1076,8 +1076,8 @@ SELECT toplevel, calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; toplevel | calls | query ----------+-------+----------------------------------------------------------------- + t | 1 | CREATE TEMPORARY TABLE pgsm_ctas_1 AS SELECT $1 f | 1 | CREATE TEMPORARY TABLE pgsm_ctas_1 AS SELECT $1; - t | 1 | CREATE TEMPORARY TABLE pgsm_ctas_1 AS SELECT 1 t | 1 | CREATE TEMPORARY TABLE pgsm_ctas_2 AS EXECUTE test_prepare_pgsm f | 1 | PREPARE test_prepare_pgsm AS SELECT generate_series($1, $2) t | 1 | SELECT pg_stat_monitor_reset() @@ -1097,7 +1097,7 @@ SELECT toplevel, calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; toplevel | calls | query ----------+-------+----------------------------------------------------------------- - t | 1 | CREATE TEMPORARY TABLE pgsm_ctas_3 AS SELECT 1 + t | 1 | CREATE TEMPORARY TABLE pgsm_ctas_3 AS SELECT $1 t | 1 | CREATE TEMPORARY TABLE pgsm_ctas_4 AS EXECUTE test_prepare_pgsm t | 1 | SELECT pg_stat_monitor_reset() (3 rows) @@ -1120,8 +1120,8 @@ SELECT toplevel, calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; toplevel | calls | query ----------+-------+---------------------------------------------------------------------------- + t | 1 | EXPLAIN (COSTS OFF) CREATE TEMPORARY TABLE pgsm_explain_ctas AS SELECT $1 f | 1 | EXPLAIN (COSTS OFF) CREATE TEMPORARY TABLE pgsm_explain_ctas AS SELECT $1; - t | 1 | EXPLAIN (COSTS OFF) CREATE TEMPORARY TABLE pgsm_explain_ctas AS SELECT 1 t | 1 | SELECT pg_stat_monitor_reset() (3 rows) @@ -1141,9 +1141,9 @@ EXPLAIN (COSTS OFF) CREATE TEMPORARY TABLE pgsm_explain_ctas AS SELECT 1; SELECT toplevel, calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; - toplevel | calls | query -----------+-------+-------------------------------------------------------------------------- - t | 1 | EXPLAIN (COSTS OFF) CREATE TEMPORARY TABLE pgsm_explain_ctas AS SELECT 1 + toplevel | calls | query +----------+-------+--------------------------------------------------------------------------- + t | 1 | EXPLAIN (COSTS OFF) CREATE TEMPORARY TABLE pgsm_explain_ctas AS SELECT $1 t | 1 | SELECT pg_stat_monitor_reset() (2 rows) @@ -1173,7 +1173,7 @@ SELECT toplevel, calls, query FROM pg_stat_monitor t | 1 | COMMIT t | 1 | DECLARE FOOCUR CURSOR FOR SELECT * FROM stats_track_tab f | 1 | DECLARE FOOCUR CURSOR FOR SELECT * FROM stats_track_tab; - t | 1 | FETCH FORWARD 1 FROM foocur + t | 1 | FETCH FORWARD $1 FROM foocur t | 1 | SELECT pg_stat_monitor_reset() (7 rows) @@ -1202,7 +1202,7 @@ SELECT toplevel, calls, query FROM pg_stat_monitor t | 1 | CLOSE foocur t | 1 | COMMIT t | 1 | DECLARE FOOCUR CURSOR FOR SELECT * FROM stats_track_tab - t | 1 | FETCH FORWARD 1 FROM foocur + t | 1 | FETCH FORWARD $1 FROM foocur t | 1 | SELECT pg_stat_monitor_reset() (6 rows) diff --git a/regression/expected/level_tracking_3.out b/regression/expected/level_tracking_3.out index 0c63ec3f..e6cdc621 100644 --- a/regression/expected/level_tracking_3.out +++ b/regression/expected/level_tracking_3.out @@ -223,34 +223,34 @@ SELECT toplevel, calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; toplevel | calls | query ----------+-------+--------------------------------------------------------------------- + t | 1 | EXPLAIN (COSTS OFF) (SELECT $1, $2) f | 1 | EXPLAIN (COSTS OFF) (SELECT $1, $2); - t | 1 | EXPLAIN (COSTS OFF) (SELECT 1, 2) t | 1 | EXPLAIN (COSTS OFF) (TABLE test_table) f | 1 | EXPLAIN (COSTS OFF) (TABLE test_table); + t | 1 | EXPLAIN (COSTS OFF) (VALUES ($1, $2)) f | 1 | EXPLAIN (COSTS OFF) (VALUES ($1, $2)); - t | 1 | EXPLAIN (COSTS OFF) (VALUES (1, 2)) t | 1 | EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab f | 1 | EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab; + t | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES (($1)) f | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES (($1)); - t | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES ((1)) + t | 1 | EXPLAIN (COSTS OFF) MERGE INTO stats_track_tab + + | | USING (SELECT id FROM generate_series($1, $2) id) ON x = id + + | | WHEN MATCHED THEN UPDATE SET x = id + + | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id) f | 1 | EXPLAIN (COSTS OFF) MERGE INTO stats_track_tab + | | USING (SELECT id FROM generate_series($1, $2) id) ON x = id + | | WHEN MATCHED THEN UPDATE SET x = id + | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id); - t | 1 | EXPLAIN (COSTS OFF) MERGE INTO stats_track_tab + - | | USING (SELECT id FROM generate_series(1, 10) id) ON x = id + - | | WHEN MATCHED THEN UPDATE SET x = id + - | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id) + t | 1 | EXPLAIN (COSTS OFF) SELECT $1 + t | 1 | EXPLAIN (COSTS OFF) SELECT $1 UNION SELECT $2 f | 1 | EXPLAIN (COSTS OFF) SELECT $1 UNION SELECT $2; f | 1 | EXPLAIN (COSTS OFF) SELECT $1; - t | 1 | EXPLAIN (COSTS OFF) SELECT 1 - t | 1 | EXPLAIN (COSTS OFF) SELECT 1 UNION SELECT 2 t | 1 | EXPLAIN (COSTS OFF) TABLE stats_track_tab f | 1 | EXPLAIN (COSTS OFF) TABLE stats_track_tab; + t | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = $1 WHERE x = $2 f | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = $1 WHERE x = $2; - t | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = 1 WHERE x = 1 + t | 1 | EXPLAIN (COSTS OFF) VALUES ($1) f | 1 | EXPLAIN (COSTS OFF) VALUES ($1); - t | 1 | EXPLAIN (COSTS OFF) VALUES (1) t | 1 | SELECT pg_stat_monitor_reset() (23 rows) @@ -349,22 +349,22 @@ EXPLAIN (COSTS OFF) SELECT 1 UNION SELECT 2; SELECT toplevel, calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; - toplevel | calls | query -----------+-------+------------------------------------------------------------------ - t | 1 | EXPLAIN (COSTS OFF) (SELECT 1, 2) + toplevel | calls | query +----------+-------+-------------------------------------------------------------------- + t | 1 | EXPLAIN (COSTS OFF) (SELECT $1, $2) t | 1 | EXPLAIN (COSTS OFF) (TABLE test_table) - t | 1 | EXPLAIN (COSTS OFF) (VALUES (1, 2)) + t | 1 | EXPLAIN (COSTS OFF) (VALUES ($1, $2)) t | 1 | EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab - t | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES ((1)) - t | 1 | EXPLAIN (COSTS OFF) MERGE INTO stats_track_tab + - | | USING (SELECT id FROM generate_series(1, 10) id) ON x = id + - | | WHEN MATCHED THEN UPDATE SET x = id + + t | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES (($1)) + t | 1 | EXPLAIN (COSTS OFF) MERGE INTO stats_track_tab + + | | USING (SELECT id FROM generate_series($1, $2) id) ON x = id + + | | WHEN MATCHED THEN UPDATE SET x = id + | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id) - t | 1 | EXPLAIN (COSTS OFF) SELECT 1 - t | 1 | EXPLAIN (COSTS OFF) SELECT 1 UNION SELECT 2 + t | 1 | EXPLAIN (COSTS OFF) SELECT $1 + t | 1 | EXPLAIN (COSTS OFF) SELECT $1 UNION SELECT $2 t | 1 | EXPLAIN (COSTS OFF) TABLE stats_track_tab - t | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = 1 WHERE x = 1 - t | 1 | EXPLAIN (COSTS OFF) VALUES (1) + t | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = $1 WHERE x = $2 + t | 1 | EXPLAIN (COSTS OFF) VALUES ($1) t | 1 | SELECT pg_stat_monitor_reset() (12 rows) @@ -424,16 +424,16 @@ SELECT toplevel, calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; toplevel | calls | query ----------+-------+--------------------------------------------------------------------------------------------------------------------- + t | 1 | EXPLAIN (COSTS OFF) (SELECT $1, $2, $3) + t | 1 | EXPLAIN (COSTS OFF) (SELECT $1, $2, $3) UNION SELECT $4, $5, $6 f | 1 | EXPLAIN (COSTS OFF) (SELECT $1, $2, $3); EXPLAIN (COSTS OFF) (SELECT 1, 2, 3, 4); - t | 1 | EXPLAIN (COSTS OFF) (SELECT 1, 2, 3) - t | 1 | EXPLAIN (COSTS OFF) (SELECT 1, 2, 3) UNION SELECT 3, 4, 5 + t | 1 | EXPLAIN (COSTS OFF) (SELECT $1, $2, $3, $4) f | 1 | EXPLAIN (COSTS OFF) (SELECT 1, 2, 3); EXPLAIN (COSTS OFF) (SELECT $1, $2, $3, $4); - t | 1 | EXPLAIN (COSTS OFF) (SELECT 1, 2, 3, 4) + t | 1 | EXPLAIN (COSTS OFF) SELECT $1 + t | 1 | EXPLAIN (COSTS OFF) SELECT $1, $2 + t | 1 | EXPLAIN (COSTS OFF) SELECT $1, $2 UNION SELECT $3, $4 f | 1 | EXPLAIN (COSTS OFF) SELECT $1, $2 UNION SELECT $3, $4; EXPLAIN (COSTS OFF) (SELECT 1, 2, 3) UNION SELECT 3, 4, 5; f | 1 | EXPLAIN (COSTS OFF) SELECT $1; EXPLAIN (COSTS OFF) SELECT 1, 2; - t | 1 | EXPLAIN (COSTS OFF) SELECT 1 - t | 1 | EXPLAIN (COSTS OFF) SELECT 1, 2 - t | 1 | EXPLAIN (COSTS OFF) SELECT 1, 2 UNION SELECT 3, 4 f | 1 | EXPLAIN (COSTS OFF) SELECT 1, 2 UNION SELECT 3, 4; EXPLAIN (COSTS OFF) (SELECT $1, $2, $3) UNION SELECT $4, $5, $6; f | 1 | EXPLAIN (COSTS OFF) SELECT 1; EXPLAIN (COSTS OFF) SELECT $1, $2; t | 1 | SELECT pg_stat_monitor_reset() @@ -514,24 +514,24 @@ SELECT toplevel, calls, query FROM pg_stat_monitor toplevel | calls | query ----------+-------+---------------------------------------------------------------------------------------------------------------------------------- t | 1 | EXPLAIN (COSTS OFF) (TABLE test_table) - t | 1 | EXPLAIN (COSTS OFF) (VALUES (1, 2)) + t | 1 | EXPLAIN (COSTS OFF) (VALUES ($1, $2)) t | 1 | EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab - t | 1 | EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab WHERE x = 1 + t | 1 | EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab WHERE x = $1 f | 1 | EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab; EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab WHERE x = $1; f | 1 | EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab; EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab WHERE x = 1; + t | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES ($1), ($2) + t | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES (($1)) f | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES (($1)); EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES (1), (2); - t | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES ((1)) f | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES ((1)); EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES ($1), ($2); - t | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES (1), (2) t | 1 | EXPLAIN (COSTS OFF) TABLE stats_track_tab f | 1 | EXPLAIN (COSTS OFF) TABLE stats_track_tab; EXPLAIN (COSTS OFF) (TABLE test_table); f | 1 | EXPLAIN (COSTS OFF) TABLE stats_track_tab; EXPLAIN (COSTS OFF) (TABLE test_table); + t | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = $1 + t | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = $1 WHERE x = $2 f | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = $1 WHERE x = $2; EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = 1; - t | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = 1 - t | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = 1 WHERE x = 1 f | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = 1 WHERE x = 1; EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = $1; + t | 1 | EXPLAIN (COSTS OFF) VALUES ($1) f | 1 | EXPLAIN (COSTS OFF) VALUES ($1); EXPLAIN (COSTS OFF) (VALUES (1, 2)); - t | 1 | EXPLAIN (COSTS OFF) VALUES (1) f | 1 | EXPLAIN (COSTS OFF) VALUES (1); EXPLAIN (COSTS OFF) (VALUES ($1, $2)); t | 1 | SELECT pg_stat_monitor_reset() (21 rows) @@ -568,19 +568,19 @@ SELECT toplevel, calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; toplevel | calls | query ----------+-------+------------------------------------------------------------------------------------------------ + t | 1 | EXPLAIN (COSTS OFF) MERGE INTO stats_track_tab + + | | USING (SELECT id FROM generate_series($1, $2) id) ON x = id + + | | WHEN MATCHED THEN UPDATE SET x = id + + | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id) f | 1 | EXPLAIN (COSTS OFF) MERGE INTO stats_track_tab + | | USING (SELECT id FROM generate_series($1, $2) id) ON x = id + | | WHEN MATCHED THEN UPDATE SET x = id + | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id); EXPLAIN (COSTS OFF) SELECT 1, 2, 3, 4, 5; - t | 1 | EXPLAIN (COSTS OFF) MERGE INTO stats_track_tab + - | | USING (SELECT id FROM generate_series(1, 10) id) ON x = id + - | | WHEN MATCHED THEN UPDATE SET x = id + - | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id) f | 1 | EXPLAIN (COSTS OFF) MERGE INTO stats_track_tab + | | USING (SELECT id FROM generate_series(1, 10) id) ON x = id + | | WHEN MATCHED THEN UPDATE SET x = id + | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id); EXPLAIN (COSTS OFF) SELECT $1, $2, $3, $4, $5; - t | 1 | EXPLAIN (COSTS OFF) SELECT 1, 2, 3, 4, 5 + t | 1 | EXPLAIN (COSTS OFF) SELECT $1, $2, $3, $4, $5 t | 1 | SELECT pg_stat_monitor_reset() (5 rows) @@ -719,26 +719,26 @@ SELECT toplevel, calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; toplevel | calls | query ----------+-------+---------------------------------------------------------------------------------------------------------------------------------- - t | 1 | EXPLAIN (COSTS OFF) (SELECT 1, 2, 3) - t | 1 | EXPLAIN (COSTS OFF) (SELECT 1, 2, 3) UNION SELECT 3, 4, 5 - t | 1 | EXPLAIN (COSTS OFF) (SELECT 1, 2, 3, 4) + t | 1 | EXPLAIN (COSTS OFF) (SELECT $1, $2, $3) + t | 1 | EXPLAIN (COSTS OFF) (SELECT $1, $2, $3) UNION SELECT $4, $5, $6 + t | 1 | EXPLAIN (COSTS OFF) (SELECT $1, $2, $3, $4) t | 1 | EXPLAIN (COSTS OFF) (TABLE test_table) - t | 1 | EXPLAIN (COSTS OFF) (VALUES (1, 2)) + t | 1 | EXPLAIN (COSTS OFF) (VALUES ($1, $2)) t | 1 | EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab - t | 1 | EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab WHERE x = 1 - t | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES ((1)) + t | 1 | EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab WHERE x = $1 + t | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES (($1)) t | 1 | EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES ((1)); EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES ((1), (2)); - t | 1 | EXPLAIN (COSTS OFF) MERGE INTO stats_track_tab USING (SELECT id FROM generate_series(1, 10) id) ON x = id + + t | 1 | EXPLAIN (COSTS OFF) MERGE INTO stats_track_tab USING (SELECT id FROM generate_series($1, $2) id) ON x = id + | | WHEN MATCHED THEN UPDATE SET x = id + | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id) - t | 1 | EXPLAIN (COSTS OFF) SELECT 1 - t | 1 | EXPLAIN (COSTS OFF) SELECT 1, 2 - t | 1 | EXPLAIN (COSTS OFF) SELECT 1, 2 UNION SELECT 3, 4 - t | 1 | EXPLAIN (COSTS OFF) SELECT 1, 2, 3, 4, 5 + t | 1 | EXPLAIN (COSTS OFF) SELECT $1 + t | 1 | EXPLAIN (COSTS OFF) SELECT $1, $2 + t | 1 | EXPLAIN (COSTS OFF) SELECT $1, $2 UNION SELECT $3, $4 + t | 1 | EXPLAIN (COSTS OFF) SELECT $1, $2, $3, $4, $5 t | 1 | EXPLAIN (COSTS OFF) TABLE stats_track_tab - t | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = 1 - t | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = 1 WHERE x = 1 - t | 1 | EXPLAIN (COSTS OFF) VALUES (1) + t | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = $1 + t | 1 | EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = $1 WHERE x = $2 + t | 1 | EXPLAIN (COSTS OFF) VALUES ($1) t | 1 | SELECT pg_stat_monitor_reset() (19 rows) @@ -815,26 +815,26 @@ SELECT toplevel, calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; toplevel | calls | query ----------+-------+------------------------------------------------------------------------------------------- + t | 1 | EXPLAIN (COSTS OFF) (WITH a AS (SELECT $1) (SELECT $2, $3)) f | 1 | EXPLAIN (COSTS OFF) (WITH a AS (SELECT $1) (SELECT $2, $3)); - t | 1 | EXPLAIN (COSTS OFF) (WITH a AS (SELECT 4) (SELECT 1, 2)) + t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) DELETE FROM stats_track_tab f | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) DELETE FROM stats_track_tab; + t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) INSERT INTO stats_track_tab VALUES (($2)) f | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) INSERT INTO stats_track_tab VALUES (($2)); + t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) MERGE INTO stats_track_tab + + | | USING (SELECT id FROM generate_series($2, $3) id) ON x = id + + | | WHEN MATCHED THEN UPDATE SET x = id + + | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id) f | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) MERGE INTO stats_track_tab + | | USING (SELECT id FROM generate_series($2, $3) id) ON x = id + | | WHEN MATCHED THEN UPDATE SET x = id + | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id); + t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) SELECT $2 + t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) SELECT $2 UNION SELECT $3 f | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) SELECT $2 UNION SELECT $3; f | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) SELECT $2; + t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) UPDATE stats_track_tab SET x = $2 WHERE x = $3 f | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) UPDATE stats_track_tab SET x = $2 WHERE x = $3; - t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) DELETE FROM stats_track_tab - t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) INSERT INTO stats_track_tab VALUES ((1)) - t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) MERGE INTO stats_track_tab + - | | USING (SELECT id FROM generate_series(1, 10) id) ON x = id + - | | WHEN MATCHED THEN UPDATE SET x = id + - | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id) - t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) SELECT 1 - t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) SELECT 1 UNION SELECT 2 - t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) UPDATE stats_track_tab SET x = 1 WHERE x = 1 t | 1 | SELECT pg_stat_monitor_reset() (15 rows) @@ -909,18 +909,18 @@ EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) SELECT 1 UNION SELECT 2; SELECT toplevel, calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; - toplevel | calls | query -----------+-------+--------------------------------------------------------------------------------------- - t | 1 | EXPLAIN (COSTS OFF) (WITH a AS (SELECT 4) (SELECT 1, 2)) - t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) DELETE FROM stats_track_tab - t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) INSERT INTO stats_track_tab VALUES ((1)) - t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) MERGE INTO stats_track_tab + - | | USING (SELECT id FROM generate_series(1, 10) id) ON x = id + - | | WHEN MATCHED THEN UPDATE SET x = id + + toplevel | calls | query +----------+-------+------------------------------------------------------------------------------------------ + t | 1 | EXPLAIN (COSTS OFF) (WITH a AS (SELECT $1) (SELECT $2, $3)) + t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) DELETE FROM stats_track_tab + t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) INSERT INTO stats_track_tab VALUES (($2)) + t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) MERGE INTO stats_track_tab + + | | USING (SELECT id FROM generate_series($2, $3) id) ON x = id + + | | WHEN MATCHED THEN UPDATE SET x = id + | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id) - t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) SELECT 1 - t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) SELECT 1 UNION SELECT 2 - t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) UPDATE stats_track_tab SET x = 1 WHERE x = 1 + t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) SELECT $2 + t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) SELECT $2 UNION SELECT $3 + t | 1 | EXPLAIN (COSTS OFF) WITH a AS (SELECT $1) UPDATE stats_track_tab SET x = $2 WHERE x = $3 t | 1 | SELECT pg_stat_monitor_reset() (8 rows) @@ -951,8 +951,8 @@ SELECT toplevel, calls, query FROM pg_stat_monitor ----------+-------+------------------------------------------------------------------------------- t | 1 | EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) + | | DECLARE foocur CURSOR FOR SELECT * FROM stats_track_tab + t | 1 | EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) SELECT $1 f | 1 | EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) SELECT $1; - t | 1 | EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) SELECT 100 t | 1 | SELECT pg_stat_monitor_reset() (4 rows) @@ -979,11 +979,11 @@ EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) SELECT toplevel, calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; - toplevel | calls | query -----------+-------+------------------------------------------------------------------------------- - t | 1 | EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) + + toplevel | calls | query +----------+-------+------------------------------------------------------------------------------ + t | 1 | EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) + | | DECLARE foocur CURSOR FOR SELECT * FROM stats_track_tab - t | 1 | EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) SELECT 100 + t | 1 | EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) SELECT $1 t | 1 | SELECT pg_stat_monitor_reset() (3 rows) @@ -1002,7 +1002,7 @@ SELECT toplevel, calls, query FROM pg_stat_monitor toplevel | calls | query ----------+-------+---------------------------------------------------- t | 1 | CREATE MATERIALIZED VIEW pgsm_materialized_view AS+ - | | SELECT * FROM generate_series(1, 5) AS id + | | SELECT * FROM generate_series($1, $2) AS id t | 1 | SELECT pg_stat_monitor_reset() (2 rows) @@ -1021,7 +1021,7 @@ SELECT toplevel, calls, query FROM pg_stat_monitor toplevel | calls | query ----------+-------+------------------------------------------------------ t | 1 | CREATE MATERIALIZED VIEW pgsm_materialized_view_2 AS+ - | | SELECT * FROM generate_series(1, 5) AS id + | | SELECT * FROM generate_series($1, $2) AS id t | 1 | SELECT pg_stat_monitor_reset() (2 rows) @@ -1074,7 +1074,7 @@ SELECT toplevel, calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; toplevel | calls | query ----------+-------+----------------------------------------------------------------- - t | 1 | CREATE TEMPORARY TABLE pgsm_ctas_1 AS SELECT 1 + t | 1 | CREATE TEMPORARY TABLE pgsm_ctas_1 AS SELECT $1 t | 1 | CREATE TEMPORARY TABLE pgsm_ctas_2 AS EXECUTE test_prepare_pgsm f | 1 | PREPARE test_prepare_pgsm AS SELECT generate_series($1, $2) t | 1 | SELECT pg_stat_monitor_reset() @@ -1094,7 +1094,7 @@ SELECT toplevel, calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; toplevel | calls | query ----------+-------+----------------------------------------------------------------- - t | 1 | CREATE TEMPORARY TABLE pgsm_ctas_3 AS SELECT 1 + t | 1 | CREATE TEMPORARY TABLE pgsm_ctas_3 AS SELECT $1 t | 1 | CREATE TEMPORARY TABLE pgsm_ctas_4 AS EXECUTE test_prepare_pgsm t | 1 | SELECT pg_stat_monitor_reset() (3 rows) @@ -1115,9 +1115,9 @@ EXPLAIN (COSTS OFF) CREATE TEMPORARY TABLE pgsm_explain_ctas AS SELECT 1; SELECT toplevel, calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; - toplevel | calls | query -----------+-------+-------------------------------------------------------------------------- - t | 1 | EXPLAIN (COSTS OFF) CREATE TEMPORARY TABLE pgsm_explain_ctas AS SELECT 1 + toplevel | calls | query +----------+-------+--------------------------------------------------------------------------- + t | 1 | EXPLAIN (COSTS OFF) CREATE TEMPORARY TABLE pgsm_explain_ctas AS SELECT $1 t | 1 | SELECT pg_stat_monitor_reset() (2 rows) @@ -1137,9 +1137,9 @@ EXPLAIN (COSTS OFF) CREATE TEMPORARY TABLE pgsm_explain_ctas AS SELECT 1; SELECT toplevel, calls, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; - toplevel | calls | query -----------+-------+-------------------------------------------------------------------------- - t | 1 | EXPLAIN (COSTS OFF) CREATE TEMPORARY TABLE pgsm_explain_ctas AS SELECT 1 + toplevel | calls | query +----------+-------+--------------------------------------------------------------------------- + t | 1 | EXPLAIN (COSTS OFF) CREATE TEMPORARY TABLE pgsm_explain_ctas AS SELECT $1 t | 1 | SELECT pg_stat_monitor_reset() (2 rows) diff --git a/regression/expected/pgsm_query_id.out b/regression/expected/pgsm_query_id.out index 8e8aafba..ea61f73f 100644 --- a/regression/expected/pgsm_query_id.out +++ b/regression/expected/pgsm_query_id.out @@ -95,11 +95,11 @@ SELECT datname, pgsm_query_id, query, calls FROM pg_stat_monitor ORDER BY pgsm_q db2 | 1988437669671417938 | SELECT * FROM t1 | 1 db1 | 5193804135051352284 | SELECT $1 + $2 | 1 db2 | 5193804135051352284 | SELECT $1 + $2 | 1 - db2 | 6220142855706866455 | set pg_stat_monitor.pgsm_enable_pgsm_query_id = on | 1 + db2 | 8581192202768104099 | set pg_stat_monitor.pgsm_enable_pgsm_query_id = off | 1 db1 | 8828613017640075704 | SELECT *, add(1, 2) FROM t1 | 1 db2 | 8828613017640075704 | SELECT *, add(1, 2) FROM t1 | 1 db2 | | SELECT * FROM t3 | 1 - db2 | | set pg_stat_monitor.pgsm_enable_pgsm_query_id = off | 1 + db2 | | set pg_stat_monitor.pgsm_enable_pgsm_query_id = on | 1 (12 rows) SELECT pg_stat_monitor_reset(); diff --git a/regression/expected/pgsm_query_id_1.out b/regression/expected/pgsm_query_id_1.out index afa3d88f..f8a5314e 100644 --- a/regression/expected/pgsm_query_id_1.out +++ b/regression/expected/pgsm_query_id_1.out @@ -93,11 +93,11 @@ SELECT datname, pgsm_query_id, query, calls FROM pg_stat_monitor ORDER BY pgsm_q db1 | 1897482803466821995 | SELECT * /* x */ FROM t2 | 4 db1 | 1988437669671417938 | SELECT * FROM t1 | 1 db2 | 1988437669671417938 | SELECT * FROM t1 | 1 - db2 | 6220142855706866455 | set pg_stat_monitor.pgsm_enable_pgsm_query_id = on | 1 + db2 | 8581192202768104099 | set pg_stat_monitor.pgsm_enable_pgsm_query_id = off | 1 db1 | 8828613017640075704 | SELECT *, add(1, 2) FROM t1 | 1 db2 | 8828613017640075704 | SELECT *, add(1, 2) FROM t1 | 1 db2 | | SELECT * FROM t3 | 1 - db2 | | set pg_stat_monitor.pgsm_enable_pgsm_query_id = off | 1 + db2 | | set pg_stat_monitor.pgsm_enable_pgsm_query_id = on | 1 (10 rows) SELECT pg_stat_monitor_reset(); diff --git a/regression/expected/pgsm_query_id_2.out b/regression/expected/pgsm_query_id_2.out index 43b1c7f9..27d5a8d5 100644 --- a/regression/expected/pgsm_query_id_2.out +++ b/regression/expected/pgsm_query_id_2.out @@ -93,10 +93,10 @@ SELECT datname, pgsm_query_id, query, calls FROM pg_stat_monitor ORDER BY pgsm_q db1 | 1897482803466821995 | SELECT * /* x */ FROM t2 | 4 db1 | 1988437669671417938 | SELECT * FROM t1 | 1 db2 | 1988437669671417938 | SELECT * FROM t1 | 1 + db2 | 2230366555432676772 | set pg_stat_monitor.pgsm_enable_pgsm_query_id = off | 2 db1 | 8828613017640075704 | SELECT *, add(1, 2) FROM t1 | 1 db2 | 8828613017640075704 | SELECT *, add(1, 2) FROM t1 | 1 db2 | | SELECT * FROM t3 | 1 - db2 | | set pg_stat_monitor.pgsm_enable_pgsm_query_id = off | 2 (9 rows) SELECT pg_stat_monitor_reset(); diff --git a/regression/expected/plancache_1.out b/regression/expected/plancache_1.out index f841b65d..60b274e1 100644 --- a/regression/expected/plancache_1.out +++ b/regression/expected/plancache_1.out @@ -54,7 +54,7 @@ SELECT calls, generic_plan_calls, custom_plan_calls, query FROM pg_stat_monitor -------+--------------------+-------------------+------------------------------------------------- 2 | 1 | 1 | PREPARE p1 AS SELECT $1 AS a; 1 | 0 | 0 | SELECT pg_stat_monitor_reset() IS NOT NULL AS t - 2 | 0 | 0 | SET plan_cache_mode TO force_generic_plan + 2 | 0 | 0 | SET plan_cache_mode TO $1 (3 rows) DEALLOCATE p1; @@ -101,7 +101,7 @@ SELECT calls, generic_plan_calls, custom_plan_calls, toplevel, query FROM pg_sta 2 | 0 | 0 | t | EXPLAIN (COSTS OFF) EXECUTE p1(1) 4 | 2 | 2 | f | PREPARE p1 AS SELECT $1; 1 | 0 | 0 | t | SELECT pg_stat_monitor_reset() IS NOT NULL AS t - 2 | 0 | 0 | t | SET plan_cache_mode TO force_generic_plan + 2 | 0 | 0 | t | SET plan_cache_mode TO $1 (5 rows) RESET pg_stat_monitor.pgsm_track; @@ -134,10 +134,10 @@ SELECT calls, generic_plan_calls, custom_plan_calls, toplevel, query FROM pg_sta ORDER BY query COLLATE "C"; calls | generic_plan_calls | custom_plan_calls | toplevel | query -------+--------------------+-------------------+----------+------------------------------------------------- - 2 | 0 | 0 | t | CALL select_one_proc(1) + 2 | 0 | 0 | t | CALL select_one_proc($1) 1 | 0 | 0 | t | SELECT pg_stat_monitor_reset() IS NOT NULL AS t 2 | 0 | 0 | t | SELECT select_one_func($1) - 2 | 0 | 0 | t | SET plan_cache_mode TO force_generic_plan + 2 | 0 | 0 | t | SET plan_cache_mode TO $1 (4 rows) -- @@ -182,12 +182,12 @@ SELECT calls, generic_plan_calls, custom_plan_calls, toplevel, query FROM pg_sta ORDER BY query COLLATE "C", toplevel; calls | generic_plan_calls | custom_plan_calls | toplevel | query -------+--------------------+-------------------+----------+------------------------------------------------------------------------------------------------ - 2 | 0 | 0 | t | CALL select_one_proc(1) + 2 | 0 | 0 | t | CALL select_one_proc($1) + 2 | 0 | 0 | t | EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) SELECT select_one_func($1) 4 | 0 | 0 | f | EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) SELECT select_one_func($1); - 2 | 0 | 0 | t | EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) SELECT select_one_func(1) - 2 | 0 | 0 | t | EXPLAIN (COSTS OFF) SELECT select_one_func(1) + 2 | 0 | 0 | t | EXPLAIN (COSTS OFF) SELECT select_one_func($1) 1 | 0 | 0 | t | SELECT pg_stat_monitor_reset() IS NOT NULL AS t - 2 | 0 | 0 | t | SET plan_cache_mode TO force_generic_plan + 2 | 0 | 0 | t | SET plan_cache_mode TO $1 (6 rows) RESET pg_stat_monitor.pgsm_track; diff --git a/regression/expected/utility.out b/regression/expected/utility.out index fff7e859..e351c545 100644 --- a/regression/expected/utility.out +++ b/regression/expected/utility.out @@ -110,7 +110,7 @@ SELECT calls, rows, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; 1 | 0 | CREATE FOREIGN TABLE foreign_stats (a int) SERVER server_stats 1 | 0 | CREATE FUNCTION func_stats(a text DEFAULT 'a_data', b text DEFAULT lower('b_data'))+ | | RETURNS text AS $$ SELECT $1::text || '_' || $2::text; $$ LANGUAGE SQL + - | | SET work_mem = '256kB' + | | SET work_mem = $1 1 | 0 | CREATE FUNCTION trigger_func_stats () RETURNS trigger LANGUAGE plpgsql + | | AS $$ BEGIN return OLD; end; $$ 1 | 0 | CREATE INDEX pt_stats2_index ON ONLY pt_stats2 (a) @@ -212,9 +212,9 @@ SELECT calls, rows, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; calls | rows | query -------+------+------------------------------------------------- 2 | 0 | BEGIN - 1 | 0 | COMMIT PREPARED 'stat_trans1' - 2 | 0 | PREPARE TRANSACTION 'stat_trans1' - 1 | 0 | ROLLBACK PREPARED 'stat_trans2' + 1 | 0 | COMMIT PREPARED $1 + 2 | 0 | PREPARE TRANSACTION $1 + 1 | 0 | ROLLBACK PREPARED $1 1 | 1 | SELECT pg_stat_monitor_reset() IS NOT NULL AS t (5 rows) @@ -243,9 +243,9 @@ SELECT calls, rows, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; -------+------+------------------------------------------------- 1 | 0 | BEGIN 1 | 0 | COMMIT - 3 | 0 | RELEASE sp3 - 4 | 0 | ROLLBACK TO sp4 - 4 | 0 | SAVEPOINT sp1 + 3 | 0 | RELEASE $1 + 4 | 0 | ROLLBACK TO $1 + 4 | 0 | SAVEPOINT $1 1 | 1 | SELECT pg_stat_monitor_reset() IS NOT NULL AS t (6 rows) @@ -284,10 +284,10 @@ EXPLAIN (costs off) SELECT a FROM generate_series(1,10) AS tab(a) WHERE a = 7; (2 rows) SELECT calls, rows, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; - calls | rows | query --------+------+------------------------------------------------------------------------------- - 2 | 0 | EXPLAIN (costs off) SELECT 1 - 2 | 0 | EXPLAIN (costs off) SELECT a FROM generate_series(1,10) AS tab(a) WHERE a = 3 + calls | rows | query +-------+------+--------------------------------------------------------------------------------- + 2 | 0 | EXPLAIN (costs off) SELECT $1 + 2 | 0 | EXPLAIN (costs off) SELECT a FROM generate_series($1,$2) AS tab(a) WHERE a = $3 1 | 1 | SELECT pg_stat_monitor_reset() IS NOT NULL AS t (3 rows) @@ -352,11 +352,11 @@ CALL in_out(2, 1, 2); SELECT calls, rows, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; calls | rows | query -------+------+------------------------------------------------- - 2 | 0 | CALL in_out(1, NULL, 1) - 1 | 0 | CALL overload('A') - 1 | 0 | CALL overload(1) - 2 | 0 | CALL sum_one(3) - 2 | 0 | CALL sum_two(1,1) + 2 | 0 | CALL in_out($1, $2, $3) + 1 | 0 | CALL overload($1) + 1 | 0 | CALL overload($1) + 2 | 0 | CALL sum_one($1) + 2 | 0 | CALL sum_two($1,$2) 1 | 1 | SELECT pg_stat_monitor_reset() IS NOT NULL AS t (6 rows) @@ -420,12 +420,12 @@ CREATE TABLE ctas_stats_2 AS FROM generate_series(1, 5) AS tab(a) WHERE a < 4 AND a > 1; DROP TABLE ctas_stats_2; SELECT calls, rows, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; - calls | rows | query --------+------+--------------------------------------------------------------------- - 2 | 2 | CREATE TABLE ctas_stats_1 AS SELECT 1 AS a - 2 | 4 | CREATE TABLE ctas_stats_2 AS + - | | SELECT a AS col1, 2::int AS col2 + - | | FROM generate_series(1, 10) AS tab(a) WHERE a < 5 AND a > 2 + calls | rows | query +-------+------+------------------------------------------------------------------------ + 2 | 2 | CREATE TABLE ctas_stats_1 AS SELECT $1 AS a + 2 | 4 | CREATE TABLE ctas_stats_2 AS + + | | SELECT a AS col1, $1::int AS col2 + + | | FROM generate_series($2, $3) AS tab(a) WHERE a < $4 AND a > $5 2 | 0 | DROP TABLE ctas_stats_1 2 | 0 | DROP TABLE ctas_stats_2 1 | 1 | SELECT pg_stat_monitor_reset() IS NOT NULL AS t @@ -448,11 +448,11 @@ CREATE MATERIALIZED VIEW matview_stats_1 AS FROM generate_series(1, 5) AS tab(a) WHERE a < 4 AND a > 3; DROP MATERIALIZED VIEW matview_stats_1; SELECT calls, rows, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; - calls | rows | query --------+------+--------------------------------------------------------------------- - 2 | 2 | CREATE MATERIALIZED VIEW matview_stats_1 AS + - | | SELECT a AS col1, 2::int AS col2 + - | | FROM generate_series(1, 10) AS tab(a) WHERE a < 5 AND a > 2 + calls | rows | query +-------+------+------------------------------------------------------------------------ + 2 | 2 | CREATE MATERIALIZED VIEW matview_stats_1 AS + + | | SELECT a AS col1, $1::int AS col2 + + | | FROM generate_series($2, $3) AS tab(a) WHERE a < $4 AND a > $5 2 | 0 | DROP MATERIALIZED VIEW matview_stats_1 1 | 1 | SELECT pg_stat_monitor_reset() IS NOT NULL AS t (3 rows) @@ -623,14 +623,14 @@ SELECT calls, rows, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; 1 | 0 | RESET enable_seqscan 1 | 0 | RESET work_mem 1 | 1 | SELECT pg_stat_monitor_reset() IS NOT NULL AS t - 1 | 0 | SET LOCAL SESSION AUTHORIZATION 'regress_stat_set_1' - 1 | 0 | SET LOCAL SESSION AUTHORIZATION 'regress_stat_set_2' + 1 | 0 | SET LOCAL SESSION AUTHORIZATION $1 + 1 | 0 | SET LOCAL SESSION AUTHORIZATION $1 1 | 0 | SET LOCAL SESSION AUTHORIZATION DEFAULT - 2 | 0 | SET LOCAL work_mem = '128kB' + 2 | 0 | SET LOCAL work_mem = $1 2 | 0 | SET LOCAL work_mem = DEFAULT 1 | 0 | SET LOCAL work_mem FROM CURRENT - 1 | 0 | SET SESSION AUTHORIZATION 'regress_stat_set_1' - 1 | 0 | SET SESSION AUTHORIZATION 'regress_stat_set_2' + 1 | 0 | SET SESSION AUTHORIZATION $1 + 1 | 0 | SET SESSION AUTHORIZATION $1 1 | 0 | SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY 1 | 0 | SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY, READ ONLY 1 | 0 | SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY, READ WRITE @@ -644,8 +644,8 @@ SELECT calls, rows, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; 1 | 0 | SET TRANSACTION ISOLATION LEVEL SERIALIZABLE 1 | 0 | SET XML OPTION CONTENT 1 | 0 | SET XML OPTION DOCUMENT - 2 | 0 | SET enable_seqscan = off - 5 | 0 | SET work_mem = '1MB' + 2 | 0 | SET enable_seqscan = $1 + 5 | 0 | SET work_mem = $1 2 | 0 | SET work_mem = DEFAULT 1 | 0 | SET work_mem FROM CURRENT (34 rows) @@ -700,19 +700,19 @@ FETCH FORWARD ALL pgsm_cursor; COMMIT; SELECT calls, rows, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; - calls | rows | query --------+------+---------------------------------------------------------------------------- + calls | rows | query +-------+------+------------------------------------------------------------------------- 1 | 0 | BEGIN 1 | 0 | COMMIT 1 | 3 | COPY pgsm_ctas (a, b) FROM STDIN 1 | 13 | CREATE MATERIALIZED VIEW pgsm_matv AS SELECT * FROM pgsm_ctas - 1 | 10 | CREATE TABLE pgsm_ctas AS SELECT a, 'ctas' b FROM generate_series(1, 10) a + 1 | 10 | CREATE TABLE pgsm_ctas AS SELECT a, $1 b FROM generate_series($2, $3) a 1 | 0 | DECLARE pgsm_cursor CURSOR FOR SELECT * FROM pgsm_matv - 1 | 5 | FETCH FORWARD 5 pgsm_cursor + 1 | 5 | FETCH FORWARD $1 pgsm_cursor 1 | 7 | FETCH FORWARD ALL pgsm_cursor 1 | 1 | FETCH NEXT pgsm_cursor 1 | 13 | REFRESH MATERIALIZED VIEW pgsm_matv - 1 | 10 | SELECT generate_series(1, 10) c INTO pgsm_select_into + 1 | 10 | SELECT generate_series($1, $2) c INTO pgsm_select_into 1 | 1 | SELECT pg_stat_monitor_reset() IS NOT NULL AS t (12 rows) @@ -734,7 +734,7 @@ SELECT calls, rows, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; -------+------+------------------------------------------------- 1 | 0 | RESET ALL 1 | 1 | SELECT pg_stat_monitor_reset() IS NOT NULL AS t - 2 | 0 | SET SCHEMA 'foo' + 2 | 0 | SET SCHEMA $1 (3 rows) SELECT pg_stat_monitor_reset() IS NOT NULL AS t; diff --git a/regression/expected/utility_1.out b/regression/expected/utility_1.out index f35fa2a4..1c305ae6 100644 --- a/regression/expected/utility_1.out +++ b/regression/expected/utility_1.out @@ -212,9 +212,9 @@ SELECT calls, rows, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; calls | rows | query -------+------+------------------------------------------------- 2 | 0 | BEGIN - 1 | 0 | COMMIT PREPARED 'stat_trans1' - 2 | 0 | PREPARE TRANSACTION 'stat_trans1' - 1 | 0 | ROLLBACK PREPARED 'stat_trans2' + 1 | 0 | COMMIT PREPARED $1 + 2 | 0 | PREPARE TRANSACTION $1 + 1 | 0 | ROLLBACK PREPARED $1 1 | 1 | SELECT pg_stat_monitor_reset() IS NOT NULL AS t (5 rows) @@ -243,9 +243,9 @@ SELECT calls, rows, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; -------+------+------------------------------------------------- 1 | 0 | BEGIN 1 | 0 | COMMIT - 3 | 0 | RELEASE sp3 - 4 | 0 | ROLLBACK TO sp4 - 4 | 0 | SAVEPOINT sp1 + 3 | 0 | RELEASE $1 + 4 | 0 | ROLLBACK TO $1 + 4 | 0 | SAVEPOINT $1 1 | 1 | SELECT pg_stat_monitor_reset() IS NOT NULL AS t (6 rows) @@ -284,10 +284,10 @@ EXPLAIN (costs off) SELECT a FROM generate_series(1,10) AS tab(a) WHERE a = 7; (2 rows) SELECT calls, rows, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; - calls | rows | query --------+------+------------------------------------------------------------------------------- - 2 | 0 | EXPLAIN (costs off) SELECT 1 - 2 | 0 | EXPLAIN (costs off) SELECT a FROM generate_series(1,10) AS tab(a) WHERE a = 3 + calls | rows | query +-------+------+--------------------------------------------------------------------------------- + 2 | 0 | EXPLAIN (costs off) SELECT $1 + 2 | 0 | EXPLAIN (costs off) SELECT a FROM generate_series($1,$2) AS tab(a) WHERE a = $3 1 | 1 | SELECT pg_stat_monitor_reset() IS NOT NULL AS t (3 rows) @@ -352,11 +352,11 @@ CALL in_out(2, 1, 2); SELECT calls, rows, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; calls | rows | query -------+------+------------------------------------------------- - 2 | 0 | CALL in_out(1, NULL, 1) - 1 | 0 | CALL overload('A') - 1 | 0 | CALL overload(1) - 2 | 0 | CALL sum_one(3) - 2 | 0 | CALL sum_two(1,1) + 2 | 0 | CALL in_out($1, $2, $3) + 1 | 0 | CALL overload($1) + 1 | 0 | CALL overload($1) + 2 | 0 | CALL sum_one($1) + 2 | 0 | CALL sum_two($1,$2) 1 | 1 | SELECT pg_stat_monitor_reset() IS NOT NULL AS t (6 rows) @@ -420,12 +420,12 @@ CREATE TABLE ctas_stats_2 AS FROM generate_series(1, 5) AS tab(a) WHERE a < 4 AND a > 1; DROP TABLE ctas_stats_2; SELECT calls, rows, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; - calls | rows | query --------+------+--------------------------------------------------------------------- - 2 | 2 | CREATE TABLE ctas_stats_1 AS SELECT 1 AS a - 2 | 4 | CREATE TABLE ctas_stats_2 AS + - | | SELECT a AS col1, 2::int AS col2 + - | | FROM generate_series(1, 10) AS tab(a) WHERE a < 5 AND a > 2 + calls | rows | query +-------+------+------------------------------------------------------------------------ + 2 | 2 | CREATE TABLE ctas_stats_1 AS SELECT $1 AS a + 2 | 4 | CREATE TABLE ctas_stats_2 AS + + | | SELECT a AS col1, $1::int AS col2 + + | | FROM generate_series($2, $3) AS tab(a) WHERE a < $4 AND a > $5 2 | 0 | DROP TABLE ctas_stats_1 2 | 0 | DROP TABLE ctas_stats_2 1 | 1 | SELECT pg_stat_monitor_reset() IS NOT NULL AS t @@ -448,11 +448,11 @@ CREATE MATERIALIZED VIEW matview_stats_1 AS FROM generate_series(1, 5) AS tab(a) WHERE a < 4 AND a > 3; DROP MATERIALIZED VIEW matview_stats_1; SELECT calls, rows, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; - calls | rows | query --------+------+--------------------------------------------------------------------- - 2 | 2 | CREATE MATERIALIZED VIEW matview_stats_1 AS + - | | SELECT a AS col1, 2::int AS col2 + - | | FROM generate_series(1, 10) AS tab(a) WHERE a < 5 AND a > 2 + calls | rows | query +-------+------+------------------------------------------------------------------------ + 2 | 2 | CREATE MATERIALIZED VIEW matview_stats_1 AS + + | | SELECT a AS col1, $1::int AS col2 + + | | FROM generate_series($2, $3) AS tab(a) WHERE a < $4 AND a > $5 2 | 0 | DROP MATERIALIZED VIEW matview_stats_1 1 | 1 | SELECT pg_stat_monitor_reset() IS NOT NULL AS t (3 rows) @@ -705,19 +705,19 @@ FETCH FORWARD ALL pgsm_cursor; COMMIT; SELECT calls, rows, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; - calls | rows | query --------+------+---------------------------------------------------------------------------- + calls | rows | query +-------+------+------------------------------------------------------------------------- 1 | 0 | BEGIN 1 | 0 | COMMIT 1 | 3 | COPY pgsm_ctas (a, b) FROM STDIN 1 | 13 | CREATE MATERIALIZED VIEW pgsm_matv AS SELECT * FROM pgsm_ctas - 1 | 10 | CREATE TABLE pgsm_ctas AS SELECT a, 'ctas' b FROM generate_series(1, 10) a + 1 | 10 | CREATE TABLE pgsm_ctas AS SELECT a, $1 b FROM generate_series($2, $3) a 1 | 0 | DECLARE pgsm_cursor CURSOR FOR SELECT * FROM pgsm_matv 1 | 5 | FETCH FORWARD 5 pgsm_cursor 1 | 7 | FETCH FORWARD ALL pgsm_cursor 1 | 1 | FETCH NEXT pgsm_cursor 1 | 13 | REFRESH MATERIALIZED VIEW pgsm_matv - 1 | 10 | SELECT generate_series(1, 10) c INTO pgsm_select_into + 1 | 10 | SELECT generate_series($1, $2) c INTO pgsm_select_into 1 | 1 | SELECT pg_stat_monitor_reset() IS NOT NULL AS t (12 rows) diff --git a/regression/expected/utility_2.out b/regression/expected/utility_2.out index 0f67bb92..cc3bd371 100644 --- a/regression/expected/utility_2.out +++ b/regression/expected/utility_2.out @@ -292,10 +292,10 @@ EXPLAIN (costs off) SELECT a FROM generate_series(1,10) AS tab(a) WHERE a = 7; (2 rows) SELECT calls, rows, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; - calls | rows | query --------+------+------------------------------------------------------------------------------- - 2 | 0 | EXPLAIN (costs off) SELECT 1 - 2 | 0 | EXPLAIN (costs off) SELECT a FROM generate_series(1,10) AS tab(a) WHERE a = 3 + calls | rows | query +-------+------+--------------------------------------------------------------------------------- + 2 | 0 | EXPLAIN (costs off) SELECT $1 + 2 | 0 | EXPLAIN (costs off) SELECT a FROM generate_series($1,$2) AS tab(a) WHERE a = $3 1 | 1 | SELECT pg_stat_monitor_reset() IS NOT NULL AS t (3 rows) @@ -431,12 +431,12 @@ CREATE TABLE ctas_stats_2 AS FROM generate_series(1, 5) AS tab(a) WHERE a < 4 AND a > 1; DROP TABLE ctas_stats_2; SELECT calls, rows, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; - calls | rows | query --------+------+--------------------------------------------------------------------- - 2 | 2 | CREATE TABLE ctas_stats_1 AS SELECT 1 AS a - 2 | 4 | CREATE TABLE ctas_stats_2 AS + - | | SELECT a AS col1, 2::int AS col2 + - | | FROM generate_series(1, 10) AS tab(a) WHERE a < 5 AND a > 2 + calls | rows | query +-------+------+------------------------------------------------------------------------ + 2 | 2 | CREATE TABLE ctas_stats_1 AS SELECT $1 AS a + 2 | 4 | CREATE TABLE ctas_stats_2 AS + + | | SELECT a AS col1, $1::int AS col2 + + | | FROM generate_series($2, $3) AS tab(a) WHERE a < $4 AND a > $5 2 | 0 | DROP TABLE ctas_stats_1 2 | 0 | DROP TABLE ctas_stats_2 1 | 1 | SELECT pg_stat_monitor_reset() IS NOT NULL AS t @@ -459,11 +459,11 @@ CREATE MATERIALIZED VIEW matview_stats_1 AS FROM generate_series(1, 5) AS tab(a) WHERE a < 4 AND a > 3; DROP MATERIALIZED VIEW matview_stats_1; SELECT calls, rows, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; - calls | rows | query --------+------+--------------------------------------------------------------------- - 2 | 2 | CREATE MATERIALIZED VIEW matview_stats_1 AS + - | | SELECT a AS col1, 2::int AS col2 + - | | FROM generate_series(1, 10) AS tab(a) WHERE a < 5 AND a > 2 + calls | rows | query +-------+------+------------------------------------------------------------------------ + 2 | 2 | CREATE MATERIALIZED VIEW matview_stats_1 AS + + | | SELECT a AS col1, $1::int AS col2 + + | | FROM generate_series($2, $3) AS tab(a) WHERE a < $4 AND a > $5 2 | 0 | DROP MATERIALIZED VIEW matview_stats_1 1 | 1 | SELECT pg_stat_monitor_reset() IS NOT NULL AS t (3 rows) @@ -716,19 +716,19 @@ FETCH FORWARD ALL pgsm_cursor; COMMIT; SELECT calls, rows, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; - calls | rows | query --------+------+---------------------------------------------------------------------------- + calls | rows | query +-------+------+------------------------------------------------------------------------- 1 | 0 | BEGIN 1 | 0 | COMMIT 1 | 3 | COPY pgsm_ctas (a, b) FROM STDIN 1 | 13 | CREATE MATERIALIZED VIEW pgsm_matv AS SELECT * FROM pgsm_ctas - 1 | 10 | CREATE TABLE pgsm_ctas AS SELECT a, 'ctas' b FROM generate_series(1, 10) a + 1 | 10 | CREATE TABLE pgsm_ctas AS SELECT a, $1 b FROM generate_series($2, $3) a 1 | 0 | DECLARE pgsm_cursor CURSOR FOR SELECT * FROM pgsm_matv 1 | 5 | FETCH FORWARD 5 pgsm_cursor 1 | 7 | FETCH FORWARD ALL pgsm_cursor 1 | 1 | FETCH NEXT pgsm_cursor 1 | 13 | REFRESH MATERIALIZED VIEW pgsm_matv - 1 | 10 | SELECT generate_series(1, 10) c INTO pgsm_select_into + 1 | 10 | SELECT generate_series($1, $2) c INTO pgsm_select_into 1 | 1 | SELECT pg_stat_monitor_reset() IS NOT NULL AS t (12 rows) diff --git a/regression/expected/utility_5.out b/regression/expected/utility_5.out new file mode 100644 index 00000000..81e5d5c1 --- /dev/null +++ b/regression/expected/utility_5.out @@ -0,0 +1,746 @@ +-- +-- Utility commands +-- +CREATE EXTENSION pg_stat_monitor; +-- These tests require utility tracking and query normalization to be enabled. +SET pg_stat_monitor.pgsm_track_utility = on; +SET pg_stat_monitor.pgsm_normalized_query = on; +SELECT pg_stat_monitor_reset() IS NOT NULL AS t; + t +--- + t +(1 row) + +-- Tables, indexes, triggers +CREATE TEMP TABLE tab_stats (a int, b char(20)); +CREATE INDEX index_stats ON tab_stats(b, (b || 'data1'), (b || 'data2')) WHERE a > 0; +ALTER TABLE tab_stats ALTER COLUMN b set default 'a'; +ALTER TABLE tab_stats ALTER COLUMN b TYPE text USING 'data' || b; +ALTER TABLE tab_stats ADD CONSTRAINT a_nonzero CHECK (a <> 0); +DROP TABLE tab_stats \; +DROP TABLE IF EXISTS tab_stats \; +-- This DROP query uses two different strings, still they count as one entry. +DROP TABLE IF EXISTS tab_stats \; +Drop Table If Exists tab_stats \; +SELECT calls, rows, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; +NOTICE: table "tab_stats" does not exist, skipping +NOTICE: table "tab_stats" does not exist, skipping +NOTICE: table "tab_stats" does not exist, skipping + calls | rows | query +-------+------+-------------------------------------------------------------------------------------- + 1 | 0 | ALTER TABLE tab_stats ADD CONSTRAINT a_nonzero CHECK (a <> 0) + 1 | 0 | ALTER TABLE tab_stats ALTER COLUMN b TYPE text USING 'data' || b + 1 | 0 | ALTER TABLE tab_stats ALTER COLUMN b set default 'a' + 1 | 0 | CREATE INDEX index_stats ON tab_stats(b, (b || 'data1'), (b || 'data2')) WHERE a > 0 + 1 | 0 | CREATE TEMP TABLE tab_stats (a int, b char(20)) + 3 | 0 | DROP TABLE IF EXISTS tab_stats + 1 | 0 | DROP TABLE tab_stats + 1 | 1 | SELECT pg_stat_monitor_reset() IS NOT NULL AS t +(8 rows) + +SELECT pg_stat_monitor_reset() IS NOT NULL AS t; + t +--- + t +(1 row) + +-- Partitions +CREATE TABLE pt_stats (a int, b int) PARTITION BY range (a); +CREATE TABLE pt_stats1 (a int, b int); +ALTER TABLE pt_stats ATTACH PARTITION pt_stats1 FOR VALUES FROM (0) TO (100); +CREATE TABLE pt_stats2 PARTITION OF pt_stats FOR VALUES FROM (100) TO (200); +CREATE INDEX pt_stats_index ON ONLY pt_stats (a); +CREATE INDEX pt_stats2_index ON ONLY pt_stats2 (a); +ALTER INDEX pt_stats_index ATTACH PARTITION pt_stats2_index; +DROP TABLE pt_stats; +-- Views +CREATE VIEW view_stats AS SELECT 1::int AS a, 2::int AS b; +ALTER VIEW view_stats ALTER COLUMN a SET DEFAULT 2; +DROP VIEW view_stats; +-- Foreign tables +CREATE FOREIGN DATA WRAPPER wrapper_stats; +CREATE SERVER server_stats FOREIGN DATA WRAPPER wrapper_stats; +CREATE FOREIGN TABLE foreign_stats (a int) SERVER server_stats; +ALTER FOREIGN TABLE foreign_stats ADD COLUMN b integer DEFAULT 1; +ALTER FOREIGN TABLE foreign_stats ADD CONSTRAINT b_nonzero CHECK (b <> 0); +DROP FOREIGN TABLE foreign_stats; +DROP SERVER server_stats; +DROP FOREIGN DATA WRAPPER wrapper_stats; +-- Functions +CREATE FUNCTION func_stats(a text DEFAULT 'a_data', b text DEFAULT lower('b_data')) + RETURNS text AS $$ SELECT $1::text || '_' || $2::text; $$ LANGUAGE SQL + SET work_mem = '256kB'; +DROP FUNCTION func_stats; +-- Rules +CREATE TABLE tab_rule_stats (a int, b int); +CREATE TABLE tab_rule_stats_2 (a int, b int, c int, d int); +CREATE RULE rules_stats AS ON INSERT TO tab_rule_stats DO INSTEAD + INSERT INTO tab_rule_stats_2 VALUES(new.*, 1, 2); +DROP RULE rules_stats ON tab_rule_stats; +DROP TABLE tab_rule_stats, tab_rule_stats_2; +-- Types +CREATE TYPE stats_type as (f1 numeric(35, 6), f2 numeric(35, 2)); +DROP TYPE stats_type; +-- Triggers +CREATE TABLE trigger_tab_stats (a int, b int); +CREATE FUNCTION trigger_func_stats () RETURNS trigger LANGUAGE plpgsql + AS $$ BEGIN return OLD; end; $$; +CREATE TRIGGER trigger_tab_stats + AFTER UPDATE ON trigger_tab_stats + FOR EACH ROW WHEN (OLD.a < 0 AND OLD.b < 1 AND true) + EXECUTE FUNCTION trigger_func_stats(); +DROP TABLE trigger_tab_stats; +-- Policies +CREATE TABLE tab_policy_stats (a int, b int); +CREATE POLICY policy_stats ON tab_policy_stats USING (a = 5) WITH CHECK (b < 5); +DROP TABLE tab_policy_stats; +-- Statistics +CREATE TABLE tab_expr_stats (a int, b int); +CREATE STATISTICS tab_expr_stats_1 (mcv) ON a, (2*a), (3*b) FROM tab_expr_stats; +DROP TABLE tab_expr_stats; +SELECT calls, rows, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; + calls | rows | query +-------+------+------------------------------------------------------------------------------------- + 1 | 0 | ALTER FOREIGN TABLE foreign_stats ADD COLUMN b integer DEFAULT 1 + 1 | 0 | ALTER FOREIGN TABLE foreign_stats ADD CONSTRAINT b_nonzero CHECK (b <> 0) + 1 | 0 | ALTER INDEX pt_stats_index ATTACH PARTITION pt_stats2_index + 1 | 0 | ALTER TABLE pt_stats ATTACH PARTITION pt_stats1 FOR VALUES FROM (0) TO (100) + 1 | 0 | ALTER VIEW view_stats ALTER COLUMN a SET DEFAULT 2 + 1 | 0 | CREATE FOREIGN DATA WRAPPER wrapper_stats + 1 | 0 | CREATE FOREIGN TABLE foreign_stats (a int) SERVER server_stats + 1 | 0 | CREATE FUNCTION func_stats(a text DEFAULT 'a_data', b text DEFAULT lower('b_data'))+ + | | RETURNS text AS $$ SELECT $1::text || '_' || $2::text; $$ LANGUAGE SQL + + | | SET work_mem = $1 + 1 | 0 | CREATE FUNCTION trigger_func_stats () RETURNS trigger LANGUAGE plpgsql + + | | AS $$ BEGIN return OLD; end; $$ + 1 | 0 | CREATE INDEX pt_stats2_index ON ONLY pt_stats2 (a) + 1 | 0 | CREATE INDEX pt_stats_index ON ONLY pt_stats (a) + 1 | 0 | CREATE POLICY policy_stats ON tab_policy_stats USING (a = 5) WITH CHECK (b < 5) + 1 | 0 | CREATE RULE rules_stats AS ON INSERT TO tab_rule_stats DO INSTEAD + + | | INSERT INTO tab_rule_stats_2 VALUES(new.*, 1, 2) + 1 | 0 | CREATE SERVER server_stats FOREIGN DATA WRAPPER wrapper_stats + 1 | 0 | CREATE STATISTICS tab_expr_stats_1 (mcv) ON a, (2*a), (3*b) FROM tab_expr_stats + 1 | 0 | CREATE TABLE pt_stats (a int, b int) PARTITION BY range (a) + 1 | 0 | CREATE TABLE pt_stats1 (a int, b int) + 1 | 0 | CREATE TABLE pt_stats2 PARTITION OF pt_stats FOR VALUES FROM (100) TO (200) + 1 | 0 | CREATE TABLE tab_expr_stats (a int, b int) + 1 | 0 | CREATE TABLE tab_policy_stats (a int, b int) + 1 | 0 | CREATE TABLE tab_rule_stats (a int, b int) + 1 | 0 | CREATE TABLE tab_rule_stats_2 (a int, b int, c int, d int) + 1 | 0 | CREATE TABLE trigger_tab_stats (a int, b int) + 1 | 0 | CREATE TRIGGER trigger_tab_stats + + | | AFTER UPDATE ON trigger_tab_stats + + | | FOR EACH ROW WHEN (OLD.a < 0 AND OLD.b < 1 AND true) + + | | EXECUTE FUNCTION trigger_func_stats() + 1 | 0 | CREATE TYPE stats_type as (f1 numeric(35, 6), f2 numeric(35, 2)) + 1 | 0 | CREATE VIEW view_stats AS SELECT 1::int AS a, 2::int AS b + 1 | 0 | DROP FOREIGN DATA WRAPPER wrapper_stats + 1 | 0 | DROP FOREIGN TABLE foreign_stats + 1 | 0 | DROP FUNCTION func_stats + 1 | 0 | DROP RULE rules_stats ON tab_rule_stats + 1 | 0 | DROP SERVER server_stats + 1 | 0 | DROP TABLE pt_stats + 1 | 0 | DROP TABLE tab_expr_stats + 1 | 0 | DROP TABLE tab_policy_stats + 1 | 0 | DROP TABLE tab_rule_stats, tab_rule_stats_2 + 1 | 0 | DROP TABLE trigger_tab_stats + 1 | 0 | DROP TYPE stats_type + 1 | 0 | DROP VIEW view_stats + 1 | 1 | SELECT pg_stat_monitor_reset() IS NOT NULL AS t +(39 rows) + +SELECT pg_stat_monitor_reset() IS NOT NULL AS t; + t +--- + t +(1 row) + +-- Transaction statements +BEGIN; +ABORT; +BEGIN; +ROLLBACK; +-- WORK +BEGIN WORK; +COMMIT WORK; +BEGIN WORK; +ABORT WORK; +-- TRANSACTION +BEGIN TRANSACTION; +COMMIT TRANSACTION; +BEGIN TRANSACTION; +ABORT TRANSACTION; +-- More isolation levels +BEGIN TRANSACTION DEFERRABLE; +COMMIT TRANSACTION AND NO CHAIN; +BEGIN ISOLATION LEVEL SERIALIZABLE; +COMMIT; +BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; +COMMIT; +-- List of A_Const nodes, same lists. +BEGIN TRANSACTION READ ONLY, READ WRITE, DEFERRABLE, NOT DEFERRABLE; +COMMIT; +BEGIN TRANSACTION NOT DEFERRABLE, READ ONLY, READ WRITE, DEFERRABLE; +COMMIT; +SELECT calls, rows, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; + calls | rows | query +-------+------+--------------------------------------------------------------------- + 4 | 0 | ABORT + 6 | 0 | BEGIN + 2 | 0 | BEGIN ISOLATION LEVEL SERIALIZABLE + 1 | 0 | BEGIN TRANSACTION DEFERRABLE + 1 | 0 | BEGIN TRANSACTION NOT DEFERRABLE, READ ONLY, READ WRITE, DEFERRABLE + 1 | 0 | BEGIN TRANSACTION READ ONLY, READ WRITE, DEFERRABLE, NOT DEFERRABLE + 7 | 0 | COMMIT WORK + 1 | 1 | SELECT pg_stat_monitor_reset() IS NOT NULL AS t +(8 rows) + +SELECT pg_stat_monitor_reset() IS NOT NULL AS t; + t +--- + t +(1 row) + +-- Two-phase transactions +BEGIN; +PREPARE TRANSACTION 'stat_trans1'; +COMMIT PREPARED 'stat_trans1'; +BEGIN; +PREPARE TRANSACTION 'stat_trans2'; +ROLLBACK PREPARED 'stat_trans2'; +SELECT calls, rows, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; + calls | rows | query +-------+------+------------------------------------------------- + 2 | 0 | BEGIN + 1 | 0 | COMMIT PREPARED $1 + 2 | 0 | PREPARE TRANSACTION $1 + 1 | 0 | ROLLBACK PREPARED $1 + 1 | 1 | SELECT pg_stat_monitor_reset() IS NOT NULL AS t +(5 rows) + +SELECT pg_stat_monitor_reset() IS NOT NULL AS t; + t +--- + t +(1 row) + +-- Savepoints +BEGIN; +SAVEPOINT sp1; +SAVEPOINT sp2; +SAVEPOINT sp3; +SAVEPOINT sp4; +ROLLBACK TO sp4; +ROLLBACK TO SAVEPOINT sp4; +ROLLBACK TRANSACTION TO SAVEPOINT sp3; +RELEASE sp3; +RELEASE SAVEPOINT sp2; +ROLLBACK TO sp1; +RELEASE SAVEPOINT sp1; +COMMIT; +SELECT calls, rows, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; + calls | rows | query +-------+------+------------------------------------------------- + 1 | 0 | BEGIN + 1 | 0 | COMMIT + 3 | 0 | RELEASE $1 + 4 | 0 | ROLLBACK TO $1 + 4 | 0 | SAVEPOINT $1 + 1 | 1 | SELECT pg_stat_monitor_reset() IS NOT NULL AS t +(6 rows) + +SELECT pg_stat_monitor_reset() IS NOT NULL AS t; + t +--- + t +(1 row) + +-- EXPLAIN statements +-- A Query is used, normalized by the query jumbling. +EXPLAIN (costs off) SELECT 1; + QUERY PLAN +------------ + Result +(1 row) + +EXPLAIN (costs off) SELECT 2; + QUERY PLAN +------------ + Result +(1 row) + +EXPLAIN (costs off) SELECT a FROM generate_series(1,10) AS tab(a) WHERE a = 3; + QUERY PLAN +-------------------------------------- + Function Scan on generate_series tab + Filter: (a = 3) +(2 rows) + +EXPLAIN (costs off) SELECT a FROM generate_series(1,10) AS tab(a) WHERE a = 7; + QUERY PLAN +-------------------------------------- + Function Scan on generate_series tab + Filter: (a = 7) +(2 rows) + +SELECT calls, rows, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; + calls | rows | query +-------+------+--------------------------------------------------------------------------------- + 2 | 0 | EXPLAIN (costs off) SELECT $1 + 2 | 0 | EXPLAIN (costs off) SELECT a FROM generate_series($1,$2) AS tab(a) WHERE a = $3 + 1 | 1 | SELECT pg_stat_monitor_reset() IS NOT NULL AS t +(3 rows) + +-- CALL +CREATE OR REPLACE PROCEDURE sum_one(i int) AS $$ +DECLARE + r int; +BEGIN + SELECT (i + i)::int INTO r; +END; $$ LANGUAGE plpgsql; +CREATE OR REPLACE PROCEDURE sum_two(i int, j int) AS $$ +DECLARE + r int; +BEGIN + SELECT (i + j)::int INTO r; +END; $$ LANGUAGE plpgsql; +-- Overloaded functions. +CREATE OR REPLACE PROCEDURE overload(i int) AS $$ +DECLARE + r int; +BEGIN + SELECT (i + i)::int INTO r; +END; $$ LANGUAGE plpgsql; +CREATE OR REPLACE PROCEDURE overload(i text) AS $$ +DECLARE + r text; +BEGIN + SELECT i::text INTO r; +END; $$ LANGUAGE plpgsql; +-- Mix of IN/OUT parameters. +CREATE OR REPLACE PROCEDURE in_out(i int, i2 OUT int, i3 INOUT int) AS $$ +DECLARE + r int; +BEGIN + i2 := i; + i3 := i3 + i; +END; $$ LANGUAGE plpgsql; +SELECT pg_stat_monitor_reset() IS NOT NULL AS t; + t +--- + t +(1 row) + +CALL sum_one(3); +CALL sum_one(199); +CALL sum_two(1,1); +CALL sum_two(1,2); +CALL overload(1); +CALL overload('A'); +CALL in_out(1, NULL, 1); + i2 | i3 +----+---- + 1 | 2 +(1 row) + +CALL in_out(2, 1, 2); + i2 | i3 +----+---- + 2 | 4 +(1 row) + +SELECT calls, rows, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; + calls | rows | query +-------+------+------------------------------------------------- + 2 | 0 | CALL in_out($1, $2, $3) + 1 | 0 | CALL overload($1) + 1 | 0 | CALL overload($1) + 2 | 0 | CALL sum_one($1) + 2 | 0 | CALL sum_two($1,$2) + 1 | 1 | SELECT pg_stat_monitor_reset() IS NOT NULL AS t +(6 rows) + +-- COPY +CREATE TABLE copy_stats (a int, b int); +SELECT pg_stat_monitor_reset() IS NOT NULL AS t; + t +--- + t +(1 row) + +-- Some queries with A_Const nodes. +COPY (SELECT 1) TO STDOUT; +1 +COPY (SELECT 2) TO STDOUT; +2 +COPY (INSERT INTO copy_stats VALUES (1, 1) RETURNING *) TO STDOUT; +1 1 +COPY (INSERT INTO copy_stats VALUES (2, 2) RETURNING *) TO STDOUT; +2 2 +COPY (UPDATE copy_stats SET b = b + 1 RETURNING *) TO STDOUT; +1 2 +2 3 +COPY (UPDATE copy_stats SET b = b + 2 RETURNING *) TO STDOUT; +1 4 +2 5 +COPY (DELETE FROM copy_stats WHERE a = 1 RETURNING *) TO STDOUT; +1 4 +SELECT calls, rows, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; + calls | rows | query +-------+------+------------------------------------------------------------------- + 1 | 1 | COPY (DELETE FROM copy_stats WHERE a = 1 RETURNING *) TO STDOUT + 1 | 1 | COPY (INSERT INTO copy_stats VALUES (1, 1) RETURNING *) TO STDOUT + 1 | 1 | COPY (INSERT INTO copy_stats VALUES (2, 2) RETURNING *) TO STDOUT + 1 | 1 | COPY (SELECT 1) TO STDOUT + 1 | 1 | COPY (SELECT 2) TO STDOUT + 1 | 2 | COPY (UPDATE copy_stats SET b = b + 1 RETURNING *) TO STDOUT + 1 | 2 | COPY (UPDATE copy_stats SET b = b + 2 RETURNING *) TO STDOUT + 1 | 1 | SELECT pg_stat_monitor_reset() IS NOT NULL AS t +(8 rows) + +DROP TABLE copy_stats; +SELECT pg_stat_monitor_reset() IS NOT NULL AS t; + t +--- + t +(1 row) + +-- CREATE TABLE AS +-- SELECT queries are normalized, creating matching query IDs. +CREATE TABLE ctas_stats_1 AS SELECT 1 AS a; +DROP TABLE ctas_stats_1; +CREATE TABLE ctas_stats_1 AS SELECT 2 AS a; +DROP TABLE ctas_stats_1; +CREATE TABLE ctas_stats_2 AS + SELECT a AS col1, 2::int AS col2 + FROM generate_series(1, 10) AS tab(a) WHERE a < 5 AND a > 2; +DROP TABLE ctas_stats_2; +CREATE TABLE ctas_stats_2 AS + SELECT a AS col1, 4::int AS col2 + FROM generate_series(1, 5) AS tab(a) WHERE a < 4 AND a > 1; +DROP TABLE ctas_stats_2; +SELECT calls, rows, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; + calls | rows | query +-------+------+------------------------------------------------------------------------ + 2 | 2 | CREATE TABLE ctas_stats_1 AS SELECT $1 AS a + 2 | 4 | CREATE TABLE ctas_stats_2 AS + + | | SELECT a AS col1, $1::int AS col2 + + | | FROM generate_series($2, $3) AS tab(a) WHERE a < $4 AND a > $5 + 2 | 0 | DROP TABLE ctas_stats_1 + 2 | 0 | DROP TABLE ctas_stats_2 + 1 | 1 | SELECT pg_stat_monitor_reset() IS NOT NULL AS t +(5 rows) + +SELECT pg_stat_monitor_reset() IS NOT NULL AS t; + t +--- + t +(1 row) + +-- CREATE MATERIALIZED VIEW +-- SELECT queries are normalized, creating matching query IDs. +CREATE MATERIALIZED VIEW matview_stats_1 AS + SELECT a AS col1, 2::int AS col2 + FROM generate_series(1, 10) AS tab(a) WHERE a < 5 AND a > 2; +DROP MATERIALIZED VIEW matview_stats_1; +CREATE MATERIALIZED VIEW matview_stats_1 AS + SELECT a AS col1, 4::int AS col2 + FROM generate_series(1, 5) AS tab(a) WHERE a < 4 AND a > 3; +DROP MATERIALIZED VIEW matview_stats_1; +SELECT calls, rows, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; + calls | rows | query +-------+------+------------------------------------------------------------------------ + 2 | 2 | CREATE MATERIALIZED VIEW matview_stats_1 AS + + | | SELECT a AS col1, $1::int AS col2 + + | | FROM generate_series($2, $3) AS tab(a) WHERE a < $4 AND a > $5 + 2 | 0 | DROP MATERIALIZED VIEW matview_stats_1 + 1 | 1 | SELECT pg_stat_monitor_reset() IS NOT NULL AS t +(3 rows) + +SELECT pg_stat_monitor_reset() IS NOT NULL AS t; + t +--- + t +(1 row) + +-- CREATE VIEW +CREATE VIEW view_stats_1 AS + SELECT a AS col1, 2::int AS col2 + FROM generate_series(1, 10) AS tab(a) WHERE a < 5 AND a > 2; +DROP VIEW view_stats_1; +CREATE VIEW view_stats_1 AS + SELECT a AS col1, 4::int AS col2 + FROM generate_series(1, 5) AS tab(a) WHERE a < 4 AND a > 3; +DROP VIEW view_stats_1; +SELECT calls, rows, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; + calls | rows | query +-------+------+--------------------------------------------------------------------- + 1 | 0 | CREATE VIEW view_stats_1 AS + + | | SELECT a AS col1, 2::int AS col2 + + | | FROM generate_series(1, 10) AS tab(a) WHERE a < 5 AND a > 2 + 1 | 0 | CREATE VIEW view_stats_1 AS + + | | SELECT a AS col1, 4::int AS col2 + + | | FROM generate_series(1, 5) AS tab(a) WHERE a < 4 AND a > 3 + 2 | 0 | DROP VIEW view_stats_1 + 1 | 1 | SELECT pg_stat_monitor_reset() IS NOT NULL AS t +(4 rows) + +SELECT pg_stat_monitor_reset() IS NOT NULL AS t; + t +--- + t +(1 row) + +-- Domains +CREATE DOMAIN domain_stats AS int CHECK (VALUE > 0); +ALTER DOMAIN domain_stats SET DEFAULT '3'; +ALTER DOMAIN domain_stats ADD CONSTRAINT higher_than_one CHECK (VALUE > 1); +DROP DOMAIN domain_stats; +SELECT calls, rows, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; + calls | rows | query +-------+------+---------------------------------------------------------------------------- + 1 | 0 | ALTER DOMAIN domain_stats ADD CONSTRAINT higher_than_one CHECK (VALUE > 1) + 1 | 0 | ALTER DOMAIN domain_stats SET DEFAULT '3' + 1 | 0 | CREATE DOMAIN domain_stats AS int CHECK (VALUE > 0) + 1 | 0 | DROP DOMAIN domain_stats + 1 | 1 | SELECT pg_stat_monitor_reset() IS NOT NULL AS t +(5 rows) + +SELECT pg_stat_monitor_reset() IS NOT NULL AS t; + t +--- + t +(1 row) + +-- Execution statements +-- Unlike upstream pg_stat_statements, pg_stat_monitor does not track the +-- execution of DEALLOCATE, so no entry is reported for it below. +SELECT 1 as a; + a +--- + 1 +(1 row) + +PREPARE stat_select AS SELECT $1 AS a; +EXECUTE stat_select (1); + a +--- + 1 +(1 row) + +DEALLOCATE stat_select; +PREPARE stat_select AS SELECT $1 AS a; +EXECUTE stat_select (2); + a +--- + 2 +(1 row) + +DEALLOCATE PREPARE stat_select; +DEALLOCATE ALL; +DEALLOCATE PREPARE ALL; +SELECT calls, rows, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; + calls | rows | query +-------+------+------------------------------------------------- + 2 | 2 | PREPARE stat_select AS SELECT $1 AS a; + 1 | 1 | SELECT $1 as a + 1 | 1 | SELECT pg_stat_monitor_reset() IS NOT NULL AS t +(3 rows) + +SELECT pg_stat_monitor_reset() IS NOT NULL AS t; + t +--- + t +(1 row) + +-- SET statements. +-- These use two different strings, still they count as one entry. +CREATE ROLE regress_stat_set_1; +CREATE ROLE regress_stat_set_2; +SET work_mem = '1MB'; +Set work_mem = '1MB'; +SET work_mem = '2MB'; +SET work_mem = DEFAULT; +SET work_mem TO DEFAULT; +SET work_mem FROM CURRENT; +BEGIN; +SET LOCAL work_mem = '128kB'; +SET LOCAL work_mem = '256kB'; +SET LOCAL work_mem = DEFAULT; +SET LOCAL work_mem TO DEFAULT; +SET LOCAL work_mem FROM CURRENT; +COMMIT; +RESET work_mem; +SET enable_seqscan = off; +SET enable_seqscan = on; +SET SESSION work_mem = '300kB'; +SET SESSION work_mem = '400kB'; +RESET enable_seqscan; +-- SET TRANSACTION ISOLATION +BEGIN; +SET TRANSACTION ISOLATION LEVEL READ COMMITTED; +SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; +SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; +COMMIT; +-- SET SESSION AUTHORIZATION +SET SESSION SESSION AUTHORIZATION DEFAULT; +SET SESSION AUTHORIZATION 'regress_stat_set_1'; +SET SESSION AUTHORIZATION 'regress_stat_set_2'; +RESET SESSION AUTHORIZATION; +BEGIN; +SET LOCAL SESSION AUTHORIZATION DEFAULT; +SET LOCAL SESSION AUTHORIZATION 'regress_stat_set_1'; +SET LOCAL SESSION AUTHORIZATION 'regress_stat_set_2'; +RESET SESSION AUTHORIZATION; +COMMIT; +-- SET SESSION CHARACTERISTICS +SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY; +SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY, READ ONLY; +SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY, READ WRITE; +-- SET XML OPTION +SET XML OPTION DOCUMENT; +SET XML OPTION CONTENT; +-- SET TIME ZONE +SET TIME ZONE 'America/New_York'; +SET TIME ZONE 'Asia/Tokyo'; +SET TIME ZONE DEFAULT; +SET TIME ZONE LOCAL; +SET TIME ZONE 'CST7CDT,M4.1.0,M10.5.0'; +RESET TIME ZONE; +-- The statements issued under SET SESSION AUTHORIZATION above are attributed +-- to the role they ran as, so some of the entries below are split per user. +-- The user names are deliberately not selected here, as the name of the +-- bootstrap superuser depends on the environment. +SELECT calls, rows, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; + calls | rows | query +-------+------+------------------------------------------------------------------ + 3 | 0 | BEGIN + 3 | 0 | COMMIT + 1 | 0 | CREATE ROLE regress_stat_set_1 + 1 | 0 | CREATE ROLE regress_stat_set_2 + 2 | 0 | RESET SESSION AUTHORIZATION + 1 | 0 | RESET TIME ZONE + 1 | 0 | RESET enable_seqscan + 1 | 0 | RESET work_mem + 1 | 1 | SELECT pg_stat_monitor_reset() IS NOT NULL AS t + 1 | 0 | SET LOCAL SESSION AUTHORIZATION $1 + 1 | 0 | SET LOCAL SESSION AUTHORIZATION $1 + 1 | 0 | SET LOCAL SESSION AUTHORIZATION DEFAULT + 2 | 0 | SET LOCAL work_mem = $1 + 2 | 0 | SET LOCAL work_mem = DEFAULT + 1 | 0 | SET LOCAL work_mem FROM CURRENT + 1 | 0 | SET SESSION AUTHORIZATION $1 + 1 | 0 | SET SESSION AUTHORIZATION $1 + 1 | 0 | SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY + 1 | 0 | SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY, READ ONLY + 1 | 0 | SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY, READ WRITE + 1 | 0 | SET SESSION SESSION AUTHORIZATION DEFAULT + 1 | 0 | SET TIME ZONE 'America/New_York' + 1 | 0 | SET TIME ZONE 'Asia/Tokyo' + 1 | 0 | SET TIME ZONE 'CST7CDT,M4.1.0,M10.5.0' + 2 | 0 | SET TIME ZONE DEFAULT + 1 | 0 | SET TRANSACTION ISOLATION LEVEL READ COMMITTED + 1 | 0 | SET TRANSACTION ISOLATION LEVEL REPEATABLE READ + 1 | 0 | SET TRANSACTION ISOLATION LEVEL SERIALIZABLE + 1 | 0 | SET XML OPTION CONTENT + 1 | 0 | SET XML OPTION DOCUMENT + 2 | 0 | SET enable_seqscan = $1 + 5 | 0 | SET work_mem = $1 + 2 | 0 | SET work_mem = DEFAULT + 1 | 0 | SET work_mem FROM CURRENT +(34 rows) + +DROP ROLE regress_stat_set_1; +DROP ROLE regress_stat_set_2; +SELECT pg_stat_monitor_reset() IS NOT NULL AS t; + t +--- + t +(1 row) + +-- +-- Track the total number of rows retrieved or affected by the utility +-- commands of COPY, FETCH, CREATE TABLE AS, CREATE MATERIALIZED VIEW, +-- REFRESH MATERIALIZED VIEW and SELECT INTO +-- +CREATE TABLE pgsm_ctas AS SELECT a, 'ctas' b FROM generate_series(1, 10) a; +SELECT generate_series(1, 10) c INTO pgsm_select_into; +COPY pgsm_ctas (a, b) FROM STDIN; +CREATE MATERIALIZED VIEW pgsm_matv AS SELECT * FROM pgsm_ctas; +REFRESH MATERIALIZED VIEW pgsm_matv; +BEGIN; +DECLARE pgsm_cursor CURSOR FOR SELECT * FROM pgsm_matv; +FETCH NEXT pgsm_cursor; + a | b +---+------ + 1 | ctas +(1 row) + +FETCH FORWARD 5 pgsm_cursor; + a | b +---+------ + 2 | ctas + 3 | ctas + 4 | ctas + 5 | ctas + 6 | ctas +(5 rows) + +FETCH FORWARD ALL pgsm_cursor; + a | b +----+------ + 7 | ctas + 8 | ctas + 9 | ctas + 10 | ctas + 11 | copy + 12 | copy + 13 | copy +(7 rows) + +COMMIT; +SELECT calls, rows, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; + calls | rows | query +-------+------+------------------------------------------------------------------------- + 1 | 0 | BEGIN + 1 | 0 | COMMIT + 1 | 3 | COPY pgsm_ctas (a, b) FROM STDIN + 1 | 13 | CREATE MATERIALIZED VIEW pgsm_matv AS SELECT * FROM pgsm_ctas + 1 | 10 | CREATE TABLE pgsm_ctas AS SELECT a, $1 b FROM generate_series($2, $3) a + 1 | 0 | DECLARE pgsm_cursor CURSOR FOR SELECT * FROM pgsm_matv + 1 | 5 | FETCH FORWARD 5 pgsm_cursor + 1 | 7 | FETCH FORWARD ALL pgsm_cursor + 1 | 1 | FETCH NEXT pgsm_cursor + 1 | 13 | REFRESH MATERIALIZED VIEW pgsm_matv + 1 | 10 | SELECT generate_series($1, $2) c INTO pgsm_select_into + 1 | 1 | SELECT pg_stat_monitor_reset() IS NOT NULL AS t +(12 rows) + +DROP MATERIALIZED VIEW pgsm_matv; +DROP TABLE pgsm_ctas; +DROP TABLE pgsm_select_into; +SELECT pg_stat_monitor_reset() IS NOT NULL AS t; + t +--- + t +(1 row) + +-- Special cases. Keep these ones at the end to avoid conflicts. +SET SCHEMA 'foo'; +SET SCHEMA 'public'; +RESET ALL; +SELECT calls, rows, query FROM pg_stat_monitor ORDER BY query COLLATE "C"; + calls | rows | query +-------+------+------------------------------------------------- + 1 | 0 | RESET ALL + 1 | 1 | SELECT pg_stat_monitor_reset() IS NOT NULL AS t + 2 | 0 | SET SCHEMA $1 +(3 rows) + +SELECT pg_stat_monitor_reset() IS NOT NULL AS t; + t +--- + t +(1 row) + +DROP EXTENSION pg_stat_monitor; diff --git a/src/pg_stat_monitor.c b/src/pg_stat_monitor.c index cf73751a..5a9cddab 100644 --- a/src/pg_stat_monitor.c +++ b/src/pg_stat_monitor.c @@ -234,24 +234,11 @@ typedef struct pgsmQueryStats Counters counters; /* the statistics for this query */ } pgsmQueryStats; -/* - * Structure to store information about the current statement execution. - * This data may change during the execution of the query and for statistics - * we need to know this data at the time when the statement execution started. - */ -typedef struct pgsmQueryExecInfo -{ - Oid userid; - char appname[NAMEDATALEN]; - char username[NAMEDATALEN]; -} pgsmQueryExecInfo; - static MemoryContext pgsm_memory_context(void); -static void pgsm_fill_query_exec_info(pgsmQueryExecInfo *info); static pgsmQueryStats *pgsm_add_query_stats(int64 queryid, int64 planid, int64 pgsm_query_id, const char *query_text, int query_len, CmdType cmd_type); -static void pgsm_fill_query_stats(pgsmQueryStats *stats, const pgsmQueryExecInfo *info, int64 queryid, int64 planid, int64 pgsm_query_id, const char *query_text, CmdType cmd_type); +static void pgsm_fill_query_stats(pgsmQueryStats *stats, int64 queryid, int64 planid, int64 pgsm_query_id, const char *query_text, CmdType cmd_type); +static pgsmQueryStats *pgsm_find_query_stats(int64 queryid); static void pgsm_delete_query_stats(uint64 queryid); -static pgsmQueryStats *pgsm_get_query_stats(int64 queryid, int64 planid, const char *query_text, CmdType cmd_type); static int64 get_pgsm_query_id_hash(const char *norm_query, int len); static void pgsm_cleanup_callback(void *arg); @@ -478,10 +465,17 @@ pgsm_post_parse_analyze(ParseState *pstate, Query *query, JumbleState *jstate) */ if (query->utilityStmt) { - if (pgsm_track_utility && IsA(query->utilityStmt, ExecuteStmt)) - query->queryId = INT64CONST(0); + /* See pgsm_ProcessUtility for more details regarding this skip logic */ + if (!pgsm_track_utility || + IsA(query->utilityStmt, PrepareStmt) || + IsA(query->utilityStmt, DeallocateStmt)) + return; - return; + if (IsA(query->utilityStmt, ExecuteStmt)) + { + query->queryId = INT64CONST(0); + return; + } } /* @@ -505,6 +499,16 @@ pgsm_post_parse_analyze(ParseState *pstate, Query *query, JumbleState *jstate) &norm_query_len); } + /* + * This is optimization. The only thing that we need here for utility + * statements is normalized query. If we don't have it, we can skip entry + * creation. It will be created in pgsm_ProcessUtility() if needed. + */ + if (query->utilityStmt && norm_query == NULL) + return; + + Assert(query->queryId != INT64CONST(0)); + /* * pgsm_query_id always groups by the normalized form when we have one. * But what gets stored as query text depends on the pgsm_normalized_query @@ -569,8 +573,15 @@ pgsm_ExecutorStart(QueryDesc *queryDesc, int eflags) * snapshot of the execution info (application_name, user) reflects * the state at statement start. */ - (void) pgsm_get_query_stats(queryDesc->plannedstmt->queryId, 0, - queryDesc->sourceText, queryDesc->operation); + if (pgsm_find_query_stats(queryDesc->plannedstmt->queryId) == NULL) + { + int query_len = strlen(queryDesc->sourceText); + + pgsm_add_query_stats(queryDesc->plannedstmt->queryId, 0, + get_pgsm_query_id_hash(queryDesc->sourceText, query_len), + queryDesc->sourceText, query_len, + queryDesc->operation); + } #if PG_VERSION_NUM < 190000 @@ -722,7 +733,16 @@ pgsm_ExecutorEnd(QueryDesc *queryDesc) SysInfo sys_info; int64 planid = plan_ptr ? plan_ptr->planid : 0; - stats = pgsm_get_query_stats(queryId, planid, queryDesc->sourceText, queryDesc->operation); + stats = pgsm_find_query_stats(queryId); + if (stats == NULL) + { + int query_len = strlen(queryDesc->sourceText); + + stats = pgsm_add_query_stats(queryId, planid, + get_pgsm_query_id_hash(queryDesc->sourceText, query_len), + queryDesc->sourceText, query_len, + queryDesc->operation); + } if (stats->key.planid == 0 && planid != 0) stats->key.planid = planid; @@ -914,7 +934,16 @@ pgsm_planner_hook(Query *parse, const char *query_string, int cursorOptions, Par walusage_start = pgWalUsage; INSTR_TIME_SET_CURRENT(start); - stats = pgsm_get_query_stats(queryId, 0, query_string, parse->commandType); + stats = pgsm_find_query_stats(queryId); + if (stats == NULL) + { + int query_len = strlen(query_string); + + stats = pgsm_add_query_stats(queryId, 0, + get_pgsm_query_id_hash(query_string, query_len), + query_string, query_len, + parse->commandType); + } #if PG_VERSION_NUM >= 170000 nesting_level++; @@ -1076,8 +1105,6 @@ pgsm_ProcessUtility(PlannedStmt *pstmt, const char *queryString, !IsA(parsetree, PrepareStmt) && !IsA(parsetree, DeallocateStmt)) { - const char *query_text; - char *store_text; int location = pstmt->stmt_location; int query_len = pstmt->stmt_len; int cmd_type = pstmt->commandType; @@ -1087,21 +1114,39 @@ pgsm_ProcessUtility(PlannedStmt *pstmt, const char *queryString, struct rusage rusage_end; SysInfo sys_info; BufferUsage bufusage; - BufferUsage bufusage_start = pgBufferUsage; + BufferUsage bufusage_start; WalUsage walusage; - WalUsage walusage_start = pgWalUsage; + WalUsage walusage_start; pgsmQueryStats stats = {0}; - pgsmQueryExecInfo info; - - getrusage(RUSAGE_SELF, &rusage_start); + pgsmQueryStats *stashed; /* - * Create a query execution info before utility statement execution - * because statement may change the data itself and for statistics we - * need to know this data at the statement execution start time. + * If there is an entry for the query in the list, use it as it has + * normalized query text. We have to copy entry to the stack here as + * statement execution may cleanup memory context that stores entries + * list. */ - pgsm_fill_query_exec_info(&info); + stashed = pgsm_find_query_stats(queryId); + if (stashed != NULL) + { + stats = *stashed; + stats.query = pstrdup(stashed->query); + pgsm_delete_query_stats(queryId); + } + else + { + const char *query_text = CleanQuerytext(queryString, &location, + &query_len); + pgsm_fill_query_stats(&stats, queryId, 0, + get_pgsm_query_id_hash(query_text, query_len), + pnstrdup(query_text, query_len), /* null terminated */ + cmd_type); + } + + getrusage(RUSAGE_SELF, &rusage_start); + bufusage_start = pgBufferUsage; + walusage_start = pgWalUsage; INSTR_TIME_SET_CURRENT(start); nesting_level++; @@ -1158,15 +1203,6 @@ pgsm_ProcessUtility(PlannedStmt *pstmt, const char *queryString, memset(&bufusage, 0, sizeof(BufferUsage)); BufferUsageAccumDiff(&bufusage, &pgBufferUsage, &bufusage_start); - query_text = CleanQuerytext(queryString, &location, &query_len); - - /* Make it null terminated */ - store_text = pnstrdup(query_text, query_len); - - pgsm_fill_query_stats(&stats, &info, queryId, 0, - get_pgsm_query_id_hash(query_text, query_len), - store_text, cmd_type); - /* The plan details are captured when the query finishes */ pgsm_update_counters(&stats.counters, /* counters */ NULL, /* PlanInfo */ @@ -1183,7 +1219,7 @@ pgsm_ProcessUtility(PlannedStmt *pstmt, const char *queryString, pgsm_store(&stats); - pfree(store_text); + pfree(stats.query); } else { @@ -1271,40 +1307,6 @@ pgsm_set_cached_info(void) } } -/* - * Fill the query execution info with the current statement execution data. - * Some data may be changed by statement execution itself, but for - * statistics we need this data state at the statement execution start time. - */ -static void -pgsm_fill_query_exec_info(pgsmQueryExecInfo *info) -{ - int sec_ctx; - - /* - * Get the user ID. Let's use this instead of GetUserID as this won't - * throw an assertion in case of an error. - */ - GetUserIdAndSecContext(&info->userid, &sec_ctx); - - if (application_name) - strlcpy(info->appname, application_name, NAMEDATALEN); - else - strlcpy(info->appname, "", NAMEDATALEN); - - info->username[0] = '\0'; - if (IsTransactionState()) - { - char *username = GetUserNameFromId(info->userid, true); - - if (username) - { - strlcpy(info->username, username, NAMEDATALEN); - pfree(username); - } - } -} - /* * Implements accidental behaviour for legacy reasons and only really supports * IPv4 addresses. @@ -1562,11 +1564,9 @@ static void pgsm_store_error(const char *query, const ErrorData *edata) { pgsmQueryStats stats = {0}; - pgsmQueryExecInfo info; int len = strlen(query); - pgsm_fill_query_exec_info(&info); - pgsm_fill_query_stats(&stats, &info, + pgsm_fill_query_stats(&stats, pgsm_hash_string(query, len), 0, get_pgsm_query_id_hash(query, len), @@ -1618,18 +1618,15 @@ static pgsmQueryStats * pgsm_add_query_stats(int64 queryid, int64 planid, int64 pgsm_query_id, const char *query_text, int query_len, CmdType cmd_type) { pgsmQueryStats *stats; - pgsmQueryExecInfo info; MemoryContext oldctx; - char *store_text; - - pgsm_fill_query_exec_info(&info); /* Create the stats and own the query text in the pgsm memory context */ oldctx = MemoryContextSwitchTo(pgsm_memory_context()); stats = palloc0_object(pgsmQueryStats); - store_text = pnstrdup(query_text, query_len); - pgsm_fill_query_stats(stats, &info, queryid, planid, pgsm_query_id, store_text, cmd_type); + pgsm_fill_query_stats(stats, queryid, planid, pgsm_query_id, + pnstrdup(query_text, query_len), /* null terminated */ + cmd_type); lentries = lappend(lentries, stats); MemoryContextSwitchTo(oldctx); @@ -1640,28 +1637,49 @@ pgsm_add_query_stats(int64 queryid, int64 planid, int64 pgsm_query_id, const cha * Populate non-counter fields of a pgsmQueryStats. */ static void -pgsm_fill_query_stats(pgsmQueryStats *stats, const pgsmQueryExecInfo *info, int64 queryid, int64 planid, int64 pgsm_query_id, const char *query_text, CmdType cmd_type) +pgsm_fill_query_stats(pgsmQueryStats *stats, int64 queryid, int64 planid, int64 pgsm_query_id, const char *query_text, CmdType cmd_type) { + int sec_ctx; + pgsm_set_cached_info(); + /* + * Get the user ID. Let's use this instead of GetUserID as this won't + * throw an assertion in case of an error. + */ + GetUserIdAndSecContext(&stats->key.userid, &sec_ctx); + + if (application_name) + strlcpy(stats->appname, application_name, NAMEDATALEN); + else + stats->appname[0] = '\0'; + + stats->username[0] = '\0'; + if (IsTransactionState()) + { + char *username = GetUserNameFromId(stats->key.userid, true); + + if (username) + { + strlcpy(stats->username, username, NAMEDATALEN); + pfree(username); + } + } + stats->subxid = IsTransactionState() ? GetCurrentSubTransactionId() : InvalidSubTransactionId; - stats->key.appid = pgsm_hash_string(info->appname, strlen(info->appname)); + stats->key.appid = pgsm_hash_string(stats->appname, strlen(stats->appname)); stats->key.ip = client_ip; stats->key.planid = planid; stats->key.dbid = MyDatabaseId; stats->key.queryid = queryid; stats->key.parentid = 0; - stats->key.userid = info->userid; stats->pgsm_query_id = pgsm_query_id; stats->counters.info.cmd_type = cmd_type; stats->query = unconstify(char *, query_text); - strlcpy(stats->appname, info->appname, NAMEDATALEN); - strlcpy(stats->username, info->username, NAMEDATALEN); - #if PG_VERSION_NUM >= 170000 stats->key.toplevel = (nesting_level == 0); #else @@ -1705,39 +1723,31 @@ pgsm_delete_query_stats(uint64 queryid) } /* - * Function to get a pgsmQueryStats structure from the local list. + * Find query stats by query id. + * Returns NULL if not found. */ static pgsmQueryStats * -pgsm_get_query_stats(int64 queryid, int64 planid, const char *query_text, CmdType cmd_type) +pgsm_find_query_stats(int64 queryid) { pgsmQueryStats *stats; - int query_len; + ListCell *lc; - Assert(query_text != NULL); + if (lentries == NIL) + return NULL; - if (lentries != NIL) - { - ListCell *lc; + /* First bet is on the last item */ + stats = (pgsmQueryStats *) llast(lentries); + if (stats->key.queryid == queryid) + return stats; - /* First bet is on the last item */ - stats = (pgsmQueryStats *) llast(lentries); + foreach(lc, lentries) + { + stats = lfirst(lc); if (stats->key.queryid == queryid) return stats; - - foreach(lc, lentries) - { - stats = lfirst(lc); - if (stats->key.queryid == queryid) - return stats; - } } - query_len = strlen(query_text); - stats = pgsm_add_query_stats(queryid, planid, - get_pgsm_query_id_hash(query_text, query_len), - query_text, query_len, cmd_type); - - return stats; + return NULL; } static void