diff -U3 /tmp/cirrus-ci-build/contrib/pg_stat_statements/expected/select.out /tmp/cirrus-ci-build/contrib/pg_stat_statements/results/select.out --- /tmp/cirrus-ci-build/contrib/pg_stat_statements/expected/select.out 2026-05-12 14:52:22.731058598 +0000 +++ /tmp/cirrus-ci-build/contrib/pg_stat_statements/results/select.out 2026-05-12 14:59:46.221838923 +0000 @@ -206,686 +206,7 @@ DEALLOCATE pgss_test; SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; - calls | rows | query --------+------+------------------------------------------------------------------------------ - 1 | 1 | PREPARE pgss_test (int) AS SELECT $1, $2 LIMIT $3 - 4 | 4 | SELECT $1 + - | | -- but this one will appear + - | | AS "text" - 2 | 2 | SELECT $1 + $2 - 3 | 3 | SELECT $1 + $2 + $3 AS "add" - 1 | 1 | SELECT $1 AS "float" - 2 | 2 | SELECT $1 AS "int" - 2 | 2 | SELECT $1 AS "int" LIMIT $2 - 2 | 0 | SELECT $1 AS "int" OFFSET $2 - 6 | 0 | SELECT $1 AS "int" OFFSET $2 LIMIT $3 - 2 | 2 | SELECT $1 AS "int" ORDER BY 1 - 1 | 2 | SELECT $1 AS i UNION SELECT $2 ORDER BY i - 1 | 1 | SELECT $1 || $2 - 2 | 2 | SELECT DISTINCT $1 AS "int" - 0 | 0 | SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C" - 1 | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t - 1 | 2 | WITH t(f) AS ( + - | | VALUES ($1), ($2) + - | | ) + - | | SELECT f FROM t ORDER BY f - 1 | 1 | select $1::jsonb ? $2 -(17 rows) - -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - --- normalization of constants and parameters, with constant locations --- recorded one or more times. -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -SELECT WHERE '1' IN ('1'::int, '3'::int::text); --- -(1 row) - -SELECT WHERE (1, 2) IN ((1, 2), (2, 3)); --- -(1 row) - -SELECT WHERE (3, 4) IN ((5, 6), (8, 7)); --- -(0 rows) - -SELECT query, calls FROM pg_stat_statements ORDER BY query COLLATE "C"; - query | calls -------------------------------------------------------------------------+------- - SELECT WHERE $1 IN ($2::int, $3::int::text) | 1 - SELECT WHERE ($1, $2) IN (($3, $4), ($5, $6)) | 2 - SELECT pg_stat_statements_reset() IS NOT NULL AS t | 1 - SELECT query, calls FROM pg_stat_statements ORDER BY query COLLATE "C" | 0 -(4 rows) - --- with the last element being an explicit function call with an argument, ensure --- the normalization of the squashing interval is correct. -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -SELECT WHERE 1 IN (1, int4(1), int4(2)); --- -(1 row) - -SELECT WHERE 1 = ANY (ARRAY[1, int4(1), int4(2)]); --- -(1 row) - -SELECT query, calls FROM pg_stat_statements ORDER BY query COLLATE "C"; - query | calls -------------------------------------------------------------------------+------- - SELECT WHERE $1 IN ($2 /*, ... */) | 2 - SELECT pg_stat_statements_reset() IS NOT NULL AS t | 1 - SELECT query, calls FROM pg_stat_statements ORDER BY query COLLATE "C" | 0 -(3 rows) - --- --- queries with locking clauses --- -CREATE TABLE pgss_a (id integer PRIMARY KEY); -CREATE TABLE pgss_b (id integer PRIMARY KEY, a_id integer REFERENCES pgss_a); -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - --- control query -SELECT * FROM pgss_a JOIN pgss_b ON pgss_b.a_id = pgss_a.id; - id | id | a_id -----+----+------ -(0 rows) - --- test range tables -SELECT * FROM pgss_a JOIN pgss_b ON pgss_b.a_id = pgss_a.id FOR UPDATE; - id | id | a_id -----+----+------ -(0 rows) - -SELECT * FROM pgss_a JOIN pgss_b ON pgss_b.a_id = pgss_a.id FOR UPDATE OF pgss_a; - id | id | a_id -----+----+------ -(0 rows) - -SELECT * FROM pgss_a JOIN pgss_b ON pgss_b.a_id = pgss_a.id FOR UPDATE OF pgss_b; - id | id | a_id -----+----+------ -(0 rows) - -SELECT * FROM pgss_a JOIN pgss_b ON pgss_b.a_id = pgss_a.id FOR UPDATE OF pgss_a, pgss_b; -- matches plain "FOR UPDATE" - id | id | a_id -----+----+------ -(0 rows) - -SELECT * FROM pgss_a JOIN pgss_b ON pgss_b.a_id = pgss_a.id FOR UPDATE OF pgss_b, pgss_a; - id | id | a_id -----+----+------ -(0 rows) - --- test strengths -SELECT * FROM pgss_a JOIN pgss_b ON pgss_b.a_id = pgss_a.id FOR NO KEY UPDATE; - id | id | a_id -----+----+------ -(0 rows) - -SELECT * FROM pgss_a JOIN pgss_b ON pgss_b.a_id = pgss_a.id FOR SHARE; - id | id | a_id -----+----+------ -(0 rows) - -SELECT * FROM pgss_a JOIN pgss_b ON pgss_b.a_id = pgss_a.id FOR KEY SHARE; - id | id | a_id -----+----+------ -(0 rows) - --- test wait policies -SELECT * FROM pgss_a JOIN pgss_b ON pgss_b.a_id = pgss_a.id FOR UPDATE NOWAIT; - id | id | a_id -----+----+------ -(0 rows) - -SELECT * FROM pgss_a JOIN pgss_b ON pgss_b.a_id = pgss_a.id FOR UPDATE SKIP LOCKED; - id | id | a_id -----+----+------ -(0 rows) - -SELECT calls, query FROM pg_stat_statements ORDER BY query COLLATE "C"; - calls | query --------+------------------------------------------------------------------------------------------ - 1 | SELECT * FROM pgss_a JOIN pgss_b ON pgss_b.a_id = pgss_a.id - 1 | SELECT * FROM pgss_a JOIN pgss_b ON pgss_b.a_id = pgss_a.id FOR KEY SHARE - 1 | SELECT * FROM pgss_a JOIN pgss_b ON pgss_b.a_id = pgss_a.id FOR NO KEY UPDATE - 1 | SELECT * FROM pgss_a JOIN pgss_b ON pgss_b.a_id = pgss_a.id FOR SHARE - 2 | SELECT * FROM pgss_a JOIN pgss_b ON pgss_b.a_id = pgss_a.id FOR UPDATE - 1 | SELECT * FROM pgss_a JOIN pgss_b ON pgss_b.a_id = pgss_a.id FOR UPDATE NOWAIT - 1 | SELECT * FROM pgss_a JOIN pgss_b ON pgss_b.a_id = pgss_a.id FOR UPDATE OF pgss_a - 1 | SELECT * FROM pgss_a JOIN pgss_b ON pgss_b.a_id = pgss_a.id FOR UPDATE OF pgss_b - 1 | SELECT * FROM pgss_a JOIN pgss_b ON pgss_b.a_id = pgss_a.id FOR UPDATE OF pgss_b, pgss_a - 1 | SELECT * FROM pgss_a JOIN pgss_b ON pgss_b.a_id = pgss_a.id FOR UPDATE SKIP LOCKED - 0 | SELECT calls, query FROM pg_stat_statements ORDER BY query COLLATE "C" - 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t -(12 rows) - -DROP TABLE pgss_a, pgss_b CASCADE; --- --- access to pg_stat_statements_info view --- -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -SELECT dealloc FROM pg_stat_statements_info; - dealloc ---------- - 0 -(1 row) - --- FROM [ONLY] -CREATE TABLE tbl_inh(id integer); -CREATE TABLE tbl_inh_1() INHERITS (tbl_inh); -INSERT INTO tbl_inh_1 SELECT 1; -SELECT * FROM tbl_inh; - id ----- - 1 -(1 row) - -SELECT * FROM ONLY tbl_inh; - id ----- -(0 rows) - -SELECT COUNT(*) FROM pg_stat_statements WHERE query LIKE '%FROM%tbl_inh%'; - count -------- - 2 -(1 row) - --- WITH TIES -CREATE TABLE limitoption AS SELECT 0 AS val FROM generate_series(1, 10); -SELECT * -FROM limitoption -WHERE val < 2 -ORDER BY val -FETCH FIRST 2 ROWS WITH TIES; - val ------ - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 -(10 rows) - -SELECT * -FROM limitoption -WHERE val < 2 -ORDER BY val -FETCH FIRST 2 ROW ONLY; - val ------ - 0 - 0 -(2 rows) - -SELECT COUNT(*) FROM pg_stat_statements WHERE query LIKE '%FETCH FIRST%'; - count -------- - 2 -(1 row) - --- GROUP BY, HAVING, GROUPING -SELECT COUNT(*) FROM (VALUES (1::INT, 2::INT)) AS t(a, b) GROUP BY a; - count -------- - 1 -(1 row) - -SELECT COUNT(*) FROM (VALUES (1::INT, 2::INT)) AS t(a, b) GROUP BY b; - count -------- - 1 -(1 row) - -SELECT COUNT(*) FROM (VALUES (1::INT, 2::INT)) AS t(a, b) GROUP BY a, b; - count -------- - 1 -(1 row) - -SELECT COUNT(*) FROM (VALUES (1::INT, 2::INT)) AS t(a, b) GROUP BY b, a; - count -------- - 1 -(1 row) - -SELECT COUNT(*) FROM (VALUES (1::INT, 2::INT)) AS t(a, b) GROUP BY GROUPING SETS(a, ()); - count -------- - 1 - 1 -(2 rows) - -SELECT COUNT(*) FROM (VALUES (1::INT, 2::INT)) AS t(a, b) GROUP BY GROUPING SETS(b, ()); - count -------- - 1 - 1 -(2 rows) - -SELECT COUNT(*) FROM (VALUES (1::INT, 2::INT)) AS t(a, b) GROUP BY a HAVING a = 1; - count -------- - 1 -(1 row) - -SELECT COUNT(*) FROM (VALUES (1::INT, 2::INT)) AS t(a, b) GROUP BY a HAVING a = 2; - count -------- -(0 rows) - -SELECT COUNT(*) FROM (VALUES (1::INT, 2::INT)) AS t(a, b) GROUP BY b HAVING b = 1; - count -------- -(0 rows) - -SELECT GROUPING(a) FROM (VALUES (1::INT, 2::INT)) AS t(a, b) GROUP BY a; - grouping ----------- - 0 -(1 row) - -SELECT GROUPING(b) FROM (VALUES (1::INT, 2::INT)) AS t(a, b) GROUP BY b; - grouping ----------- - 0 -(1 row) - -SELECT GROUPING(b) FROM (VALUES (1::INT, 2::INT)) AS t(a, b) GROUP BY a, b; - grouping ----------- - 0 -(1 row) - -SELECT GROUPING(b) FROM (VALUES (1::INT, 2::INT)) AS t(a, b) GROUP BY b, a; - grouping ----------- - 0 -(1 row) - -SELECT calls, query FROM pg_stat_statements WHERE query LIKE '%GROUP BY%' ORDER BY query COLLATE "C"; - calls | query --------+------------------------------------------------------------------------------------------- - 1 | SELECT COUNT(*) FROM (VALUES ($1::INT, $2::INT)) AS t(a, b) GROUP BY GROUPING SETS(a, ()) - 1 | SELECT COUNT(*) FROM (VALUES ($1::INT, $2::INT)) AS t(a, b) GROUP BY GROUPING SETS(b, ()) - 1 | SELECT COUNT(*) FROM (VALUES ($1::INT, $2::INT)) AS t(a, b) GROUP BY a - 2 | SELECT COUNT(*) FROM (VALUES ($1::INT, $2::INT)) AS t(a, b) GROUP BY a HAVING a = $3 - 1 | SELECT COUNT(*) FROM (VALUES ($1::INT, $2::INT)) AS t(a, b) GROUP BY a, b - 1 | SELECT COUNT(*) FROM (VALUES ($1::INT, $2::INT)) AS t(a, b) GROUP BY b - 1 | SELECT COUNT(*) FROM (VALUES ($1::INT, $2::INT)) AS t(a, b) GROUP BY b HAVING b = $3 - 1 | SELECT COUNT(*) FROM (VALUES ($1::INT, $2::INT)) AS t(a, b) GROUP BY b, a - 1 | SELECT GROUPING(a) FROM (VALUES ($1::INT, $2::INT)) AS t(a, b) GROUP BY a - 1 | SELECT GROUPING(b) FROM (VALUES ($1::INT, $2::INT)) AS t(a, b) GROUP BY a, b - 1 | SELECT GROUPING(b) FROM (VALUES ($1::INT, $2::INT)) AS t(a, b) GROUP BY b - 1 | SELECT GROUPING(b) FROM (VALUES ($1::INT, $2::INT)) AS t(a, b) GROUP BY b, a -(12 rows) - --- GROUP BY [DISTINCT] -SELECT a, b, c -FROM (VALUES (1, 2, 3), (4, NULL, 6), (7, 8, 9)) AS t (a, b, c) -GROUP BY ROLLUP(a, b), rollup(a, c) -ORDER BY a, b, c; - a | b | c ----+---+--- - 1 | 2 | 3 - 1 | 2 | - 1 | 2 | - 1 | | 3 - 1 | | 3 - 1 | | - 1 | | - 1 | | - 4 | | 6 - 4 | | 6 - 4 | | 6 - 4 | | - 4 | | - 4 | | - 4 | | - 4 | | - 7 | 8 | 9 - 7 | 8 | - 7 | 8 | - 7 | | 9 - 7 | | 9 - 7 | | - 7 | | - 7 | | - | | -(25 rows) - -SELECT a, b, c -FROM (VALUES (1, 2, 3), (4, NULL, 6), (7, 8, 9)) AS t (a, b, c) -GROUP BY DISTINCT ROLLUP(a, b), rollup(a, c) -ORDER BY a, b, c; - a | b | c ----+---+--- - 1 | 2 | 3 - 1 | 2 | - 1 | | 3 - 1 | | - 4 | | 6 - 4 | | 6 - 4 | | - 4 | | - 7 | 8 | 9 - 7 | 8 | - 7 | | 9 - 7 | | - | | -(13 rows) - -SELECT COUNT(*) FROM pg_stat_statements WHERE query LIKE '%GROUP BY%ROLLUP%'; - count -------- - 2 -(1 row) - --- GROUPING SET agglevelsup -SELECT ( - SELECT ( - SELECT GROUPING(a,b) FROM (VALUES (1)) v2(c) - ) FROM (VALUES (1,2)) v1(a,b) GROUP BY (a,b) -) FROM (VALUES(6,7)) v3(e,f) GROUP BY ROLLUP(e,f); - grouping ----------- - 0 - 0 - 0 -(3 rows) - -SELECT ( - SELECT ( - SELECT GROUPING(e,f) FROM (VALUES (1)) v2(c) - ) FROM (VALUES (1,2)) v1(a,b) GROUP BY (a,b) -) FROM (VALUES(6,7)) v3(e,f) GROUP BY ROLLUP(e,f); - grouping ----------- - 3 - 0 - 1 -(3 rows) - -SELECT COUNT(*) FROM pg_stat_statements WHERE query LIKE '%SELECT GROUPING%'; - count -------- - 6 -(1 row) - -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - --- Temporary table with same name, re-created. -BEGIN; - CREATE TEMP TABLE temp_t (id int) ON COMMIT DROP; - SELECT * FROM temp_t; - id ----- -(0 rows) - -COMMIT; -BEGIN; - CREATE TEMP TABLE temp_t (id int) ON COMMIT DROP; - SELECT * FROM temp_t; - id ----- -(0 rows) - -COMMIT; -SELECT calls, query FROM pg_stat_statements ORDER BY query COLLATE "C"; - calls | query --------+------------------------------------------------------------------------ - 2 | SELECT * FROM temp_t - 0 | SELECT calls, query FROM pg_stat_statements ORDER BY query COLLATE "C" - 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t -(3 rows) - -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - --- search_path with various schemas and temporary tables -CREATE SCHEMA pgss_schema_1; -CREATE SCHEMA pgss_schema_2; --- Same attributes. -CREATE TABLE pgss_schema_1.tab_search_same (a int, b int); -CREATE TABLE pgss_schema_2.tab_search_same (a int, b int); -CREATE TEMP TABLE tab_search_same (a int, b int); --- Different number of attributes, mapping types -CREATE TABLE pgss_schema_1.tab_search_diff_1 (a int); -CREATE TABLE pgss_schema_2.tab_search_diff_1 (a int, b int); -CREATE TEMP TABLE tab_search_diff_1 (a int, b int, c int); --- Same number of attributes, different types -CREATE TABLE pgss_schema_1.tab_search_diff_2 (a int); -CREATE TABLE pgss_schema_2.tab_search_diff_2 (a text); -CREATE TEMP TABLE tab_search_diff_2 (a bigint); --- First permanent schema -SET search_path = 'pgss_schema_1'; -SELECT count(*) FROM tab_search_same; - count -------- - 0 -(1 row) - -SELECT a, b FROM tab_search_same; - a | b ----+--- -(0 rows) - -SELECT count(*) FROM tab_search_diff_1; - count -------- - 0 -(1 row) - -SELECT count(*) FROM tab_search_diff_2; - count -------- - 0 -(1 row) - -SELECT a FROM tab_search_diff_2 AS t1; - a ---- -(0 rows) - -SELECT a FROM tab_search_diff_2; - a ---- -(0 rows) - -SELECT a AS a1 FROM tab_search_diff_2; - a1 ----- -(0 rows) - --- Second permanent schema -SET search_path = 'pgss_schema_2'; -SELECT count(*) FROM tab_search_same; - count -------- - 0 -(1 row) - -SELECT a, b FROM tab_search_same; - a | b ----+--- -(0 rows) - -SELECT count(*) FROM tab_search_diff_1; - count -------- - 0 -(1 row) - -SELECT count(*) FROM tab_search_diff_2; - count -------- - 0 -(1 row) - -SELECT a FROM tab_search_diff_2 AS t1; - a ---- -(0 rows) - -SELECT a FROM tab_search_diff_2; - a ---- -(0 rows) - -SELECT a AS a1 FROM tab_search_diff_2; - a1 ----- -(0 rows) - --- Temporary schema -SET search_path = 'pg_temp'; -SELECT count(*) FROM tab_search_same; - count -------- - 0 -(1 row) - -SELECT a, b FROM tab_search_same; - a | b ----+--- -(0 rows) - -SELECT count(*) FROM tab_search_diff_1; - count -------- - 0 -(1 row) - -SELECT count(*) FROM tab_search_diff_2; - count -------- - 0 -(1 row) - -SELECT a FROM tab_search_diff_2 AS t1; - a ---- -(0 rows) - -SELECT a FROM tab_search_diff_2; - a ---- -(0 rows) - -SELECT a AS a1 FROM tab_search_diff_2; - a1 ----- -(0 rows) - -RESET search_path; --- Schema qualifications -SELECT count(*) FROM pgss_schema_1.tab_search_same; - count -------- - 0 -(1 row) - -SELECT a, b FROM pgss_schema_1.tab_search_same; - a | b ----+--- -(0 rows) - -SELECT count(*) FROM pgss_schema_2.tab_search_diff_1; - count -------- - 0 -(1 row) - -SELECT count(*) FROM pg_temp.tab_search_diff_2; - count -------- - 0 -(1 row) - -SELECT a FROM pgss_schema_2.tab_search_diff_2 AS t1; - a ---- -(0 rows) - -SELECT a FROM pgss_schema_2.tab_search_diff_2; - a ---- -(0 rows) - -SELECT a AS a1 FROM pgss_schema_2.tab_search_diff_2; - a1 ----- -(0 rows) - -SELECT calls, query FROM pg_stat_statements ORDER BY query COLLATE "C"; - calls | query --------+------------------------------------------------------------------------ - 8 | SELECT a FROM tab_search_diff_2 - 4 | SELECT a FROM tab_search_diff_2 AS t1 - 4 | SELECT a, b FROM tab_search_same - 0 | SELECT calls, query FROM pg_stat_statements ORDER BY query COLLATE "C" - 4 | SELECT count(*) FROM tab_search_diff_1 - 4 | SELECT count(*) FROM tab_search_diff_2 - 4 | SELECT count(*) FROM tab_search_same - 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t -(8 rows) - -DROP SCHEMA pgss_schema_1 CASCADE; -NOTICE: drop cascades to 3 other objects -DETAIL: drop cascades to table pgss_schema_1.tab_search_same -drop cascades to table pgss_schema_1.tab_search_diff_1 -drop cascades to table pgss_schema_1.tab_search_diff_2 -DROP SCHEMA pgss_schema_2 CASCADE; -NOTICE: drop cascades to 3 other objects -DETAIL: drop cascades to table pgss_schema_2.tab_search_same -drop cascades to table pgss_schema_2.tab_search_diff_1 -drop cascades to table pgss_schema_2.tab_search_diff_2 -DROP TABLE tab_search_same, tab_search_diff_1, tab_search_diff_2; -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - +server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. +connection to server was lost diff -U3 /tmp/cirrus-ci-build/contrib/pg_stat_statements/expected/dml.out /tmp/cirrus-ci-build/contrib/pg_stat_statements/results/dml.out --- /tmp/cirrus-ci-build/contrib/pg_stat_statements/expected/dml.out 2026-05-12 14:52:22.731058598 +0000 +++ /tmp/cirrus-ci-build/contrib/pg_stat_statements/results/dml.out 2026-05-12 14:59:46.321843915 +0000 @@ -1,174 +1,3 @@ --- --- DMLs on test table --- -SET pg_stat_statements.track_utility = FALSE; -CREATE TEMP TABLE pgss_dml_tab (a int, b char(20)); -INSERT INTO pgss_dml_tab VALUES(generate_series(1, 10), 'aaa'); -UPDATE pgss_dml_tab SET b = 'bbb' WHERE a > 7; -DELETE FROM pgss_dml_tab WHERE a > 9; --- explicit transaction -BEGIN; -UPDATE pgss_dml_tab SET b = '111' WHERE a = 1 ; -COMMIT; -BEGIN \; -UPDATE pgss_dml_tab SET b = '222' WHERE a = 2 \; -COMMIT ; -UPDATE pgss_dml_tab SET b = '333' WHERE a = 3 \; -UPDATE pgss_dml_tab SET b = '444' WHERE a = 4 ; -BEGIN \; -UPDATE pgss_dml_tab SET b = '555' WHERE a = 5 \; -UPDATE pgss_dml_tab SET b = '666' WHERE a = 6 \; -COMMIT ; --- many INSERT values -INSERT INTO pgss_dml_tab (a, b) VALUES (1, 'a'), (2, 'b'), (3, 'c'); --- SELECT with constants -SELECT * FROM pgss_dml_tab WHERE a > 5 ORDER BY a ; - a | b ----+---------------------- - 6 | 666 - 7 | aaa - 8 | bbb - 9 | bbb -(4 rows) - -SELECT * - FROM pgss_dml_tab - WHERE a > 9 - ORDER BY a ; - a | b ----+--- -(0 rows) - --- these two need to be done on a different table --- SELECT without constants -SELECT * FROM pgss_dml_tab ORDER BY a; - a | b ----+---------------------- - 1 | a - 1 | 111 - 2 | b - 2 | 222 - 3 | c - 3 | 333 - 4 | 444 - 5 | 555 - 6 | 666 - 7 | aaa - 8 | bbb - 9 | bbb -(12 rows) - --- SELECT with IN clause -SELECT * FROM pgss_dml_tab WHERE a IN (1, 2, 3, 4, 5); - a | b ----+---------------------- - 1 | 111 - 2 | 222 - 3 | 333 - 4 | 444 - 5 | 555 - 1 | a - 2 | b - 3 | c -(8 rows) - -SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; - calls | rows | query --------+------+--------------------------------------------------------------------- - 1 | 1 | DELETE FROM pgss_dml_tab WHERE a > $1 - 1 | 3 | INSERT INTO pgss_dml_tab (a, b) VALUES ($1, $2), ($3, $4), ($5, $6) - 1 | 10 | INSERT INTO pgss_dml_tab VALUES(generate_series($1, $2), $3) - 1 | 12 | SELECT * FROM pgss_dml_tab ORDER BY a - 2 | 4 | SELECT * FROM pgss_dml_tab WHERE a > $1 ORDER BY a - 1 | 8 | SELECT * FROM pgss_dml_tab WHERE a IN ($1 /*, ... */) - 1 | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t - 1 | 0 | SET pg_stat_statements.track_utility = $1 - 6 | 6 | UPDATE pgss_dml_tab SET b = $1 WHERE a = $2 - 1 | 3 | UPDATE pgss_dml_tab SET b = $1 WHERE a > $2 -(10 rows) - -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - --- MERGE -MERGE INTO pgss_dml_tab USING pgss_dml_tab st ON (st.a = pgss_dml_tab.a AND st.a >= 4) - WHEN MATCHED THEN UPDATE SET b = st.b || st.a::text; -MERGE INTO pgss_dml_tab USING pgss_dml_tab st ON (st.a = pgss_dml_tab.a AND st.a >= 4) - WHEN MATCHED THEN UPDATE SET b = pgss_dml_tab.b || st.a::text; -MERGE INTO pgss_dml_tab USING pgss_dml_tab st ON (st.a = pgss_dml_tab.a AND st.a >= 4) - WHEN MATCHED AND length(st.b) > 1 THEN UPDATE SET b = pgss_dml_tab.b || st.a::text; -MERGE INTO pgss_dml_tab USING pgss_dml_tab st ON (st.a = pgss_dml_tab.a) - WHEN NOT MATCHED THEN INSERT (a, b) VALUES (0, NULL); -MERGE INTO pgss_dml_tab USING pgss_dml_tab st ON (st.a = pgss_dml_tab.a) - WHEN NOT MATCHED THEN INSERT VALUES (0, NULL); -- same as above -MERGE INTO pgss_dml_tab USING pgss_dml_tab st ON (st.a = pgss_dml_tab.a) - WHEN NOT MATCHED THEN INSERT (b, a) VALUES (NULL, 0); -MERGE INTO pgss_dml_tab USING pgss_dml_tab st ON (st.a = pgss_dml_tab.a) - WHEN NOT MATCHED THEN INSERT (a) VALUES (0); -MERGE INTO pgss_dml_tab USING pgss_dml_tab st ON (st.a = pgss_dml_tab.a AND st.a >= 4) - WHEN MATCHED THEN DELETE; -MERGE INTO pgss_dml_tab USING pgss_dml_tab st ON (st.a = pgss_dml_tab.a AND st.a >= 4) - WHEN MATCHED THEN DO NOTHING; -MERGE INTO pgss_dml_tab USING pgss_dml_tab st ON (st.a = pgss_dml_tab.a AND st.a >= 4) - WHEN NOT MATCHED THEN DO NOTHING; -DROP TABLE pgss_dml_tab; -SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; - calls | rows | query --------+------+----------------------------------------------------------------------------------------- - 1 | 6 | MERGE INTO pgss_dml_tab USING pgss_dml_tab st ON (st.a = pgss_dml_tab.a AND st.a >= $1)+ - | | WHEN MATCHED AND length(st.b) > $2 THEN UPDATE SET b = pgss_dml_tab.b || st.a::text - 1 | 6 | MERGE INTO pgss_dml_tab USING pgss_dml_tab st ON (st.a = pgss_dml_tab.a AND st.a >= $1)+ - | | WHEN MATCHED THEN DELETE - 1 | 0 | MERGE INTO pgss_dml_tab USING pgss_dml_tab st ON (st.a = pgss_dml_tab.a AND st.a >= $1)+ - | | WHEN MATCHED THEN DO NOTHING - 1 | 6 | MERGE INTO pgss_dml_tab USING pgss_dml_tab st ON (st.a = pgss_dml_tab.a AND st.a >= $1)+ - | | WHEN MATCHED THEN UPDATE SET b = pgss_dml_tab.b || st.a::text - 1 | 6 | MERGE INTO pgss_dml_tab USING pgss_dml_tab st ON (st.a = pgss_dml_tab.a AND st.a >= $1)+ - | | WHEN MATCHED THEN UPDATE SET b = st.b || st.a::text - 1 | 0 | MERGE INTO pgss_dml_tab USING pgss_dml_tab st ON (st.a = pgss_dml_tab.a AND st.a >= $1)+ - | | WHEN NOT MATCHED THEN DO NOTHING - 1 | 0 | MERGE INTO pgss_dml_tab USING pgss_dml_tab st ON (st.a = pgss_dml_tab.a) + - | | WHEN NOT MATCHED THEN INSERT (a) VALUES ($1) - 2 | 0 | MERGE INTO pgss_dml_tab USING pgss_dml_tab st ON (st.a = pgss_dml_tab.a) + - | | WHEN NOT MATCHED THEN INSERT (a, b) VALUES ($1, $2) - 1 | 0 | MERGE INTO pgss_dml_tab USING pgss_dml_tab st ON (st.a = pgss_dml_tab.a) + - | | WHEN NOT MATCHED THEN INSERT (b, a) VALUES ($1, $2) - 1 | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t -(10 rows) - --- check that [temp] table relation extensions are tracked as writes -CREATE TABLE pgss_extend_tab (a int, b text); -CREATE TEMP TABLE pgss_extend_temp_tab (a int, b text); -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -INSERT INTO pgss_extend_tab (a, b) SELECT generate_series(1, 1000), 'something'; -INSERT INTO pgss_extend_temp_tab (a, b) SELECT generate_series(1, 1000), 'something'; -WITH sizes AS ( - SELECT - pg_relation_size('pgss_extend_tab') / current_setting('block_size')::int8 AS rel_size, - pg_relation_size('pgss_extend_temp_tab') / current_setting('block_size')::int8 AS temp_rel_size -) -SELECT - SUM(local_blks_written) >= (SELECT temp_rel_size FROM sizes) AS temp_written_ok, - SUM(local_blks_dirtied) >= (SELECT temp_rel_size FROM sizes) AS temp_dirtied_ok, - SUM(shared_blks_written) >= (SELECT rel_size FROM sizes) AS written_ok, - SUM(shared_blks_dirtied) >= (SELECT rel_size FROM sizes) AS dirtied_ok -FROM pg_stat_statements; - temp_written_ok | temp_dirtied_ok | written_ok | dirtied_ok ------------------+-----------------+------------+------------ - t | t | t | t -(1 row) - -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - +psql: error: connection to server on socket "/tmp/pg_regress-pGEVs9/.s.PGSQL.58928" failed: server closed the connection unexpectedly + This probably means the server terminated abnormally + before or while processing the request. diff -U3 /tmp/cirrus-ci-build/contrib/pg_stat_statements/expected/cursors.out /tmp/cirrus-ci-build/contrib/pg_stat_statements/results/cursors.out --- /tmp/cirrus-ci-build/contrib/pg_stat_statements/expected/cursors.out 2026-05-12 14:52:22.731058598 +0000 +++ /tmp/cirrus-ci-build/contrib/pg_stat_statements/results/cursors.out 2026-05-12 14:59:46.365846111 +0000 @@ -1,207 +1,2 @@ --- --- Cursors --- --- These tests require track_utility to be enabled. -SET pg_stat_statements.track_utility = TRUE; -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - --- DECLARE --- SELECT is normalized. -DECLARE cursor_stats_1 CURSOR WITH HOLD FOR SELECT 1; -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_statements ORDER BY query COLLATE "C"; - calls | rows | query --------+------+------------------------------------------------------- - 2 | 0 | CLOSE cursor_stats_1 - 2 | 0 | DECLARE cursor_stats_1 CURSOR WITH HOLD FOR SELECT $1 - 1 | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t -(3 rows) - -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - --- FETCH -BEGIN; -DECLARE cursor_stats_1 CURSOR WITH HOLD FOR SELECT 2; -DECLARE cursor_stats_2 CURSOR WITH HOLD FOR SELECT 3; -FETCH 1 IN cursor_stats_1; - ?column? ----------- - 2 -(1 row) - -FETCH 1 IN cursor_stats_2; - ?column? ----------- - 3 -(1 row) - -CLOSE cursor_stats_1; -CLOSE cursor_stats_2; -COMMIT; -SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; - 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 $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_statements_reset() IS NOT NULL AS t -(9 rows) - -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - --- Normalization of FETCH statements -BEGIN; -DECLARE pgss_cursor CURSOR FOR SELECT FROM generate_series(1, 10); --- implicit directions -FETCH pgss_cursor; --- -(1 row) - -FETCH 1 pgss_cursor; --- -(1 row) - -FETCH 2 pgss_cursor; --- -(2 rows) - -FETCH -1 pgss_cursor; --- -(1 row) - --- explicit NEXT -FETCH NEXT pgss_cursor; --- -(1 row) - --- explicit PRIOR -FETCH PRIOR pgss_cursor; --- -(1 row) - --- explicit FIRST -FETCH FIRST pgss_cursor; --- -(1 row) - --- explicit LAST -FETCH LAST pgss_cursor; --- -(1 row) - --- explicit ABSOLUTE -FETCH ABSOLUTE 1 pgss_cursor; --- -(1 row) - -FETCH ABSOLUTE 2 pgss_cursor; --- -(1 row) - -FETCH ABSOLUTE -1 pgss_cursor; --- -(1 row) - --- explicit RELATIVE -FETCH RELATIVE 1 pgss_cursor; --- -(0 rows) - -FETCH RELATIVE 2 pgss_cursor; --- -(0 rows) - -FETCH RELATIVE -1 pgss_cursor; --- -(1 row) - --- explicit FORWARD -FETCH ALL pgss_cursor; --- -(0 rows) - --- explicit FORWARD ALL -FETCH FORWARD ALL pgss_cursor; --- -(0 rows) - --- explicit FETCH FORWARD -FETCH FORWARD pgss_cursor; --- -(0 rows) - -FETCH FORWARD 1 pgss_cursor; --- -(0 rows) - -FETCH FORWARD 2 pgss_cursor; --- -(0 rows) - -FETCH FORWARD -1 pgss_cursor; --- -(1 row) - --- explicit FETCH BACKWARD -FETCH BACKWARD pgss_cursor; --- -(1 row) - -FETCH BACKWARD 1 pgss_cursor; --- -(1 row) - -FETCH BACKWARD 2 pgss_cursor; --- -(2 rows) - -FETCH BACKWARD -1 pgss_cursor; --- -(1 row) - --- explicit BACKWARD ALL -FETCH BACKWARD ALL pgss_cursor; --- -(6 rows) - -COMMIT; -SELECT calls, query FROM pg_stat_statements ORDER BY query COLLATE "C"; - calls | query --------+-------------------------------------------------------------------- - 1 | BEGIN - 1 | COMMIT - 1 | DECLARE pgss_cursor CURSOR FOR SELECT FROM generate_series($1, $2) - 3 | FETCH ABSOLUTE $1 pgss_cursor - 1 | FETCH ALL pgss_cursor - 1 | FETCH BACKWARD ALL pgss_cursor - 4 | FETCH BACKWARD pgss_cursor - 1 | FETCH FIRST pgss_cursor - 1 | FETCH FORWARD ALL pgss_cursor - 4 | FETCH FORWARD pgss_cursor - 1 | FETCH LAST pgss_cursor - 1 | FETCH NEXT pgss_cursor - 1 | FETCH PRIOR pgss_cursor - 3 | FETCH RELATIVE $1 pgss_cursor - 4 | FETCH pgss_cursor - 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t -(16 rows) - +psql: error: connection to server on socket "/tmp/pg_regress-pGEVs9/.s.PGSQL.58928" failed: No such file or directory + Is the server running locally and accepting connections on that socket? diff -U3 /tmp/cirrus-ci-build/contrib/pg_stat_statements/expected/utility.out /tmp/cirrus-ci-build/contrib/pg_stat_statements/results/utility.out --- /tmp/cirrus-ci-build/contrib/pg_stat_statements/expected/utility.out 2026-05-12 14:52:22.731058598 +0000 +++ /tmp/cirrus-ci-build/contrib/pg_stat_statements/results/utility.out 2026-05-12 14:59:46.413848506 +0000 @@ -1,739 +1,2 @@ --- --- Utility commands --- --- These tests require track_utility to be enabled. -SET pg_stat_statements.track_utility = TRUE; -SELECT pg_stat_statements_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_statements 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_statements_reset() IS NOT NULL AS t -(8 rows) - -SELECT pg_stat_statements_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_statements 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_statements_reset() IS NOT NULL AS t -(39 rows) - -SELECT pg_stat_statements_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_statements 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_statements_reset() IS NOT NULL AS t -(8 rows) - -SELECT pg_stat_statements_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_statements 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_statements_reset() IS NOT NULL AS t -(5 rows) - -SELECT pg_stat_statements_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_statements 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_statements_reset() IS NOT NULL AS t -(6 rows) - -SELECT pg_stat_statements_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_statements 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_statements_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_statements_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_statements 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_statements_reset() IS NOT NULL AS t -(6 rows) - --- COPY -CREATE TABLE copy_stats (a int, b int); -SELECT pg_stat_statements_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_statements 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_statements_reset() IS NOT NULL AS t -(8 rows) - -DROP TABLE copy_stats; -SELECT pg_stat_statements_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_statements 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_statements_reset() IS NOT NULL AS t -(5 rows) - -SELECT pg_stat_statements_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_statements 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_statements_reset() IS NOT NULL AS t -(3 rows) - -SELECT pg_stat_statements_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_statements 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_statements_reset() IS NOT NULL AS t -(4 rows) - -SELECT pg_stat_statements_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_statements 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_statements_reset() IS NOT NULL AS t -(5 rows) - -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - --- Execution statements -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_statements ORDER BY query COLLATE "C"; - calls | rows | query --------+------+---------------------------------------------------- - 2 | 0 | DEALLOCATE $1 - 2 | 0 | DEALLOCATE ALL - 2 | 2 | PREPARE stat_select AS SELECT $1 AS a - 1 | 1 | SELECT $1 as a - 1 | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t -(5 rows) - -SELECT pg_stat_statements_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; -SELECT calls, rows, query FROM pg_stat_statements 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_statements_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 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 'regress_stat_set_1' - 1 | 0 | SET SESSION AUTHORIZATION 'regress_stat_set_2' - 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_statements_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 pgss_ctas AS SELECT a, 'ctas' b FROM generate_series(1, 10) a; -SELECT generate_series(1, 10) c INTO pgss_select_into; -COPY pgss_ctas (a, b) FROM STDIN; -CREATE MATERIALIZED VIEW pgss_matv AS SELECT * FROM pgss_ctas; -REFRESH MATERIALIZED VIEW pgss_matv; -BEGIN; -DECLARE pgss_cursor CURSOR FOR SELECT * FROM pgss_matv; -FETCH NEXT pgss_cursor; - a | b ----+------ - 1 | ctas -(1 row) - -FETCH FORWARD 5 pgss_cursor; - a | b ----+------ - 2 | ctas - 3 | ctas - 4 | ctas - 5 | ctas - 6 | ctas -(5 rows) - -FETCH FORWARD ALL pgss_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_statements ORDER BY query COLLATE "C"; - calls | rows | query --------+------+------------------------------------------------------------------------- - 1 | 0 | BEGIN - 1 | 0 | COMMIT - 1 | 3 | COPY pgss_ctas (a, b) FROM STDIN - 1 | 13 | CREATE MATERIALIZED VIEW pgss_matv AS SELECT * FROM pgss_ctas - 1 | 10 | CREATE TABLE pgss_ctas AS SELECT a, $1 b FROM generate_series($2, $3) a - 1 | 0 | DECLARE pgss_cursor CURSOR FOR SELECT * FROM pgss_matv - 1 | 5 | FETCH FORWARD $1 pgss_cursor - 1 | 7 | FETCH FORWARD ALL pgss_cursor - 1 | 1 | FETCH NEXT pgss_cursor - 1 | 13 | REFRESH MATERIALIZED VIEW pgss_matv - 1 | 10 | SELECT generate_series($1, $2) c INTO pgss_select_into - 1 | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t -(12 rows) - -DROP MATERIALIZED VIEW pgss_matv; -DROP TABLE pgss_ctas; -DROP TABLE pgss_select_into; -SELECT pg_stat_statements_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_statements ORDER BY query COLLATE "C"; - calls | rows | query --------+------+---------------------------------------------------- - 1 | 0 | RESET ALL - 1 | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t - 2 | 0 | SET SCHEMA $1 -(3 rows) - -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - +psql: error: connection to server on socket "/tmp/pg_regress-pGEVs9/.s.PGSQL.58928" failed: No such file or directory + Is the server running locally and accepting connections on that socket? diff -U3 /tmp/cirrus-ci-build/contrib/pg_stat_statements/expected/level_tracking.out /tmp/cirrus-ci-build/contrib/pg_stat_statements/results/level_tracking.out --- /tmp/cirrus-ci-build/contrib/pg_stat_statements/expected/level_tracking.out 2026-05-12 14:52:22.731058598 +0000 +++ /tmp/cirrus-ci-build/contrib/pg_stat_statements/results/level_tracking.out 2026-05-12 14:59:46.453850503 +0000 @@ -1,1641 +1,2 @@ --- --- Statement level tracking --- -SET pg_stat_statements.track_utility = TRUE; -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - --- DO block - top-level tracking. -CREATE TABLE stats_track_tab (x int); -SET pg_stat_statements.track = 'top'; -DELETE FROM stats_track_tab; -DO $$ -BEGIN - DELETE FROM stats_track_tab; -END; -$$ LANGUAGE plpgsql; -SELECT toplevel, calls, query FROM pg_stat_statements - WHERE query LIKE '%DELETE%' ORDER BY query COLLATE "C", toplevel; - toplevel | calls | query -----------+-------+-------------------------------- - t | 1 | DELETE FROM stats_track_tab - t | 1 | DO $$ + - | | BEGIN + - | | DELETE FROM stats_track_tab;+ - | | END; + - | | $$ LANGUAGE plpgsql -(2 rows) - -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - --- DO block - all-level tracking. -SET pg_stat_statements.track = 'all'; -DELETE FROM stats_track_tab; -DO $$ -BEGIN - DELETE FROM stats_track_tab; -END; $$; -DO LANGUAGE plpgsql $$ -BEGIN - -- this is a SELECT - PERFORM 'hello world'::TEXT; -END; $$; -SELECT toplevel, calls, query FROM pg_stat_statements - ORDER BY query COLLATE "C", toplevel; - toplevel | calls | query -----------+-------+---------------------------------------------------- - f | 1 | DELETE FROM stats_track_tab - t | 1 | DELETE FROM stats_track_tab - t | 1 | DO $$ + - | | BEGIN + - | | DELETE FROM stats_track_tab; + - | | END; $$ - t | 1 | DO LANGUAGE plpgsql $$ + - | | BEGIN + - | | -- this is a SELECT + - | | PERFORM 'hello world'::TEXT; + - | | END; $$ - f | 1 | SELECT $1::TEXT - t | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t - t | 1 | SET pg_stat_statements.track = $1 -(7 rows) - --- Procedure with multiple utility statements. -CREATE OR REPLACE PROCEDURE proc_with_utility_stmt() -LANGUAGE SQL -AS $$ - SHOW pg_stat_statements.track; - show pg_stat_statements.track; - SHOW pg_stat_statements.track_utility; -$$; -SET pg_stat_statements.track_utility = TRUE; --- all-level tracking. -SET pg_stat_statements.track = 'all'; -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -CALL proc_with_utility_stmt(); -SELECT toplevel, calls, query FROM pg_stat_statements - ORDER BY query COLLATE "C", toplevel; - toplevel | calls | query -----------+-------+---------------------------------------------------- - t | 1 | CALL proc_with_utility_stmt() - t | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t - f | 2 | SHOW pg_stat_statements.track - f | 1 | SHOW pg_stat_statements.track_utility -(4 rows) - --- top-level tracking. -SET pg_stat_statements.track = 'top'; -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -CALL proc_with_utility_stmt(); -SELECT toplevel, calls, query FROM pg_stat_statements - ORDER BY query COLLATE "C", toplevel; - toplevel | calls | query -----------+-------+---------------------------------------------------- - t | 1 | CALL proc_with_utility_stmt() - t | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t -(2 rows) - --- EXPLAIN - all-level tracking. -CREATE TABLE test_table (x int); -SET pg_stat_statements.track = 'all'; -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -EXPLAIN (COSTS OFF) SELECT 1; - QUERY PLAN ------------- - Result -(1 row) - -EXPLAIN (COSTS OFF) (SELECT 1, 2); - QUERY PLAN ------------- - Result -(1 row) - -EXPLAIN (COSTS OFF) TABLE stats_track_tab; - QUERY PLAN ------------------------------ - Seq Scan on stats_track_tab -(1 row) - -EXPLAIN (COSTS OFF) (TABLE test_table); - QUERY PLAN ------------------------- - Seq Scan on test_table -(1 row) - -EXPLAIN (COSTS OFF) VALUES (1); - QUERY PLAN ------------- - Result -(1 row) - -EXPLAIN (COSTS OFF) (VALUES (1, 2)); - QUERY PLAN ------------- - Result -(1 row) - -EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = 1 WHERE x = 1; - QUERY PLAN ------------------------------------ - Update on stats_track_tab - -> Seq Scan on stats_track_tab - Filter: (x = 1) -(3 rows) - -EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab; - QUERY PLAN ------------------------------------ - Delete on stats_track_tab - -> Seq Scan on stats_track_tab -(2 rows) - -EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES ((1)); - QUERY PLAN ---------------------------- - Insert on stats_track_tab - -> Result -(2 rows) - -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); - QUERY PLAN -------------------------------------------------------- - Merge on stats_track_tab - -> Hash Right Join - Hash Cond: (stats_track_tab.x = id.id) - -> Seq Scan on stats_track_tab - -> Hash - -> Function Scan on generate_series id -(6 rows) - -EXPLAIN (COSTS OFF) SELECT 1 UNION SELECT 2; - QUERY PLAN --------------------------- - Unique - -> Sort - Sort Key: (1) - -> Append - -> Result - -> Result -(6 rows) - -SELECT toplevel, calls, query FROM pg_stat_statements - 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) (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) 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) 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) 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) 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) VALUES ($1) - f | 1 | EXPLAIN (COSTS OFF) VALUES ($1); - t | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t -(23 rows) - --- EXPLAIN - top-level tracking. -SET pg_stat_statements.track = 'top'; -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -EXPLAIN (COSTS OFF) SELECT 1; - QUERY PLAN ------------- - Result -(1 row) - -EXPLAIN (COSTS OFF) (SELECT 1, 2); - QUERY PLAN ------------- - Result -(1 row) - -EXPLAIN (COSTS OFF) TABLE stats_track_tab; - QUERY PLAN ------------------------------ - Seq Scan on stats_track_tab -(1 row) - -EXPLAIN (COSTS OFF) (TABLE test_table); - QUERY PLAN ------------------------- - Seq Scan on test_table -(1 row) - -EXPLAIN (COSTS OFF) VALUES (1); - QUERY PLAN ------------- - Result -(1 row) - -EXPLAIN (COSTS OFF) (VALUES (1, 2)); - QUERY PLAN ------------- - Result -(1 row) - -EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = 1 WHERE x = 1; - QUERY PLAN ------------------------------------ - Update on stats_track_tab - -> Seq Scan on stats_track_tab - Filter: (x = 1) -(3 rows) - -EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab; - QUERY PLAN ------------------------------------ - Delete on stats_track_tab - -> Seq Scan on stats_track_tab -(2 rows) - -EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES ((1)); - QUERY PLAN ---------------------------- - Insert on stats_track_tab - -> Result -(2 rows) - -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); - QUERY PLAN -------------------------------------------------------- - Merge on stats_track_tab - -> Hash Right Join - Hash Cond: (stats_track_tab.x = id.id) - -> Seq Scan on stats_track_tab - -> Hash - -> Function Scan on generate_series id -(6 rows) - -EXPLAIN (COSTS OFF) SELECT 1 UNION SELECT 2; - QUERY PLAN --------------------------- - Unique - -> Sort - Sort Key: (1) - -> Append - -> Result - -> Result -(6 rows) - -SELECT toplevel, calls, query FROM pg_stat_statements - ORDER BY query COLLATE "C"; - 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) 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, $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) TABLE stats_track_tab - 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_statements_reset() IS NOT NULL AS t -(12 rows) - --- EXPLAIN - all-level tracking with multi-statement strings. -SET pg_stat_statements.track = 'all'; -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - --- SELECT queries -EXPLAIN (COSTS OFF) SELECT 1\; EXPLAIN (COSTS OFF) SELECT 1, 2; - QUERY PLAN ------------- - Result -(1 row) - - QUERY PLAN ------------- - Result -(1 row) - -EXPLAIN (COSTS OFF) (SELECT 1, 2, 3)\; EXPLAIN (COSTS OFF) (SELECT 1, 2, 3, 4); - QUERY PLAN ------------- - Result -(1 row) - - QUERY PLAN ------------- - Result -(1 row) - -EXPLAIN (COSTS OFF) SELECT 1, 2 UNION SELECT 3, 4\; EXPLAIN (COSTS OFF) (SELECT 1, 2, 3) UNION SELECT 3, 4, 5; - QUERY PLAN ----------------------------- - Unique - -> Sort - Sort Key: (1), (2) - -> Append - -> Result - -> Result -(6 rows) - - QUERY PLAN ---------------------------------- - Unique - -> Sort - Sort Key: (1), (2), (3) - -> Append - -> Result - -> Result -(6 rows) - -SELECT toplevel, calls, query FROM pg_stat_statements - 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, $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 - 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; - 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_statements_reset() IS NOT NULL AS t -(13 rows) - -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - --- Most DMLs -EXPLAIN (COSTS OFF) TABLE stats_track_tab\; EXPLAIN (COSTS OFF) (TABLE test_table); - QUERY PLAN ------------------------------ - Seq Scan on stats_track_tab -(1 row) - - QUERY PLAN ------------------------- - Seq Scan on test_table -(1 row) - -EXPLAIN (COSTS OFF) VALUES (1)\; EXPLAIN (COSTS OFF) (VALUES (1, 2)); - QUERY PLAN ------------- - Result -(1 row) - - QUERY PLAN ------------- - Result -(1 row) - -EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = 1 WHERE x = 1\; EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = 1; - QUERY PLAN ------------------------------------ - Update on stats_track_tab - -> Seq Scan on stats_track_tab - Filter: (x = 1) -(3 rows) - - QUERY PLAN ------------------------------------ - Update on stats_track_tab - -> Seq Scan on stats_track_tab -(2 rows) - -EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab\; EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab WHERE x = 1; - QUERY PLAN ------------------------------------ - Delete on stats_track_tab - -> Seq Scan on stats_track_tab -(2 rows) - - QUERY PLAN ------------------------------------ - Delete on stats_track_tab - -> Seq Scan on stats_track_tab - Filter: (x = 1) -(3 rows) - -EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES ((1))\; EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES (1), (2); - QUERY PLAN ---------------------------- - Insert on stats_track_tab - -> Result -(2 rows) - - QUERY PLAN ---------------------------------- - Insert on stats_track_tab - -> Values Scan on "*VALUES*" -(2 rows) - -SELECT toplevel, calls, query FROM pg_stat_statements - ORDER BY query COLLATE "C"; - toplevel | calls | query -----------+-------+---------------------------------------------------------------------------------------------------------------------------------- - t | 1 | EXPLAIN (COSTS OFF) (TABLE test_table) - 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 - 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); - 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) 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; - 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)); - f | 1 | EXPLAIN (COSTS OFF) VALUES (1); EXPLAIN (COSTS OFF) (VALUES ($1, $2)); - t | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t -(21 rows) - -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - --- MERGE, worth its own. -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; - QUERY PLAN -------------------------------------------------------- - Merge on stats_track_tab - -> Hash Right Join - Hash Cond: (stats_track_tab.x = id.id) - -> Seq Scan on stats_track_tab - -> Hash - -> Function Scan on generate_series id -(6 rows) - - QUERY PLAN ------------- - Result -(1 row) - -SELECT toplevel, calls, query FROM pg_stat_statements - 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; - 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 | SELECT pg_stat_statements_reset() IS NOT NULL AS t -(5 rows) - --- EXPLAIN - top-level tracking with multi-statement strings. -SET pg_stat_statements.track = 'top'; -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -EXPLAIN (COSTS OFF) SELECT 1\; EXPLAIN (COSTS OFF) SELECT 1, 2; - QUERY PLAN ------------- - Result -(1 row) - - QUERY PLAN ------------- - Result -(1 row) - -EXPLAIN (COSTS OFF) (SELECT 1, 2, 3)\; EXPLAIN (COSTS OFF) (SELECT 1, 2, 3, 4); - QUERY PLAN ------------- - Result -(1 row) - - QUERY PLAN ------------- - Result -(1 row) - -EXPLAIN (COSTS OFF) TABLE stats_track_tab\; EXPLAIN (COSTS OFF) (TABLE test_table); - QUERY PLAN ------------------------------ - Seq Scan on stats_track_tab -(1 row) - - QUERY PLAN ------------------------- - Seq Scan on test_table -(1 row) - -EXPLAIN (COSTS OFF) VALUES (1)\; EXPLAIN (COSTS OFF) (VALUES (1, 2)); - QUERY PLAN ------------- - Result -(1 row) - - QUERY PLAN ------------- - Result -(1 row) - -EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = 1 WHERE x = 1\; EXPLAIN (COSTS OFF) UPDATE stats_track_tab SET x = 1; - QUERY PLAN ------------------------------------ - Update on stats_track_tab - -> Seq Scan on stats_track_tab - Filter: (x = 1) -(3 rows) - - QUERY PLAN ------------------------------------ - Update on stats_track_tab - -> Seq Scan on stats_track_tab -(2 rows) - -EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab\; EXPLAIN (COSTS OFF) DELETE FROM stats_track_tab WHERE x = 1; - QUERY PLAN ------------------------------------ - Delete on stats_track_tab - -> Seq Scan on stats_track_tab -(2 rows) - - QUERY PLAN ------------------------------------ - Delete on stats_track_tab - -> Seq Scan on stats_track_tab - Filter: (x = 1) -(3 rows) - -EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES ((1))\; EXPLAIN (COSTS OFF) INSERT INTO stats_track_tab VALUES ((1), (2)); - QUERY PLAN ---------------------------- - Insert on stats_track_tab - -> Result -(2 rows) - -ERROR: INSERT has more expressions than target columns -LINE 1: ...N (COSTS OFF) INSERT INTO stats_track_tab VALUES ((1), (2)); - ^ -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; - QUERY PLAN -------------------------------------------------------- - Merge on stats_track_tab - -> Hash Right Join - Hash Cond: (stats_track_tab.x = id.id) - -> Seq Scan on stats_track_tab - -> Hash - -> Function Scan on generate_series id -(6 rows) - - QUERY PLAN ------------- - Result -(1 row) - -EXPLAIN (COSTS OFF) SELECT 1, 2 UNION SELECT 3, 4\; EXPLAIN (COSTS OFF) (SELECT 1, 2, 3) UNION SELECT 3, 4, 5; - QUERY PLAN ----------------------------- - Unique - -> Sort - Sort Key: (1), (2) - -> Append - -> Result - -> Result -(6 rows) - - QUERY PLAN ---------------------------------- - Unique - -> Sort - Sort Key: (1), (2), (3) - -> Append - -> Result - -> Result -(6 rows) - -SELECT toplevel, calls, query FROM pg_stat_statements - 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 - 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) 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) 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) 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 = $2 - t | 1 | EXPLAIN (COSTS OFF) VALUES ($1) - t | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t -(18 rows) - --- EXPLAIN with CTEs - all-level tracking -SET pg_stat_statements.track = 'all'; -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) SELECT 1; - QUERY PLAN ------------- - Result -(1 row) - -EXPLAIN (COSTS OFF) (WITH a AS (SELECT 4) (SELECT 1, 2)); - QUERY PLAN ------------- - Result -(1 row) - -EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) UPDATE stats_track_tab SET x = 1 WHERE x = 1; - QUERY PLAN ------------------------------------ - Update on stats_track_tab - -> Seq Scan on stats_track_tab - Filter: (x = 1) -(3 rows) - -EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) DELETE FROM stats_track_tab; - QUERY PLAN ------------------------------------ - Delete on stats_track_tab - -> Seq Scan on stats_track_tab -(2 rows) - -EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) INSERT INTO stats_track_tab VALUES ((1)); - QUERY PLAN ---------------------------- - Insert on stats_track_tab - -> Result -(2 rows) - -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); - QUERY PLAN -------------------------------------------------------- - Merge on stats_track_tab - -> Hash Right Join - Hash Cond: (stats_track_tab.x = id.id) - -> Seq Scan on stats_track_tab - -> Hash - -> Function Scan on generate_series id -(6 rows) - -EXPLAIN (COSTS OFF) WITH a AS (select 4) SELECT 1 UNION SELECT 2; - QUERY PLAN --------------------------- - Unique - -> Sort - Sort Key: (1) - -> Append - -> Result - -> Result -(6 rows) - -SELECT toplevel, calls, query FROM pg_stat_statements - 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 $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 - 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 $1) SELECT $2 UNION SELECT $3 - f | 1 | EXPLAIN (COSTS OFF) WITH a AS (select $1) SELECT $2 UNION SELECT $3; - t | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t -(15 rows) - --- EXPLAIN with CTEs - top-level tracking -SET pg_stat_statements.track = 'top'; -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) SELECT 1; - QUERY PLAN ------------- - Result -(1 row) - -EXPLAIN (COSTS OFF) (WITH a AS (SELECT 4) (SELECT 1, 2)); - QUERY PLAN ------------- - Result -(1 row) - -EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) UPDATE stats_track_tab SET x = 1 WHERE x = 1; - QUERY PLAN ------------------------------------ - Update on stats_track_tab - -> Seq Scan on stats_track_tab - Filter: (x = 1) -(3 rows) - -EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) DELETE FROM stats_track_tab; - QUERY PLAN ------------------------------------ - Delete on stats_track_tab - -> Seq Scan on stats_track_tab -(2 rows) - -EXPLAIN (COSTS OFF) WITH a AS (SELECT 4) INSERT INTO stats_track_tab VALUES ((1)); - QUERY PLAN ---------------------------- - Insert on stats_track_tab - -> Result -(2 rows) - -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); - QUERY PLAN -------------------------------------------------------- - Merge on stats_track_tab - -> Hash Right Join - Hash Cond: (stats_track_tab.x = id.id) - -> Seq Scan on stats_track_tab - -> Hash - -> Function Scan on generate_series id -(6 rows) - -EXPLAIN (COSTS OFF) WITH a AS (select 4) SELECT 1 UNION SELECT 2; - QUERY PLAN --------------------------- - Unique - -> Sort - Sort Key: (1) - -> Append - -> Result - -> Result -(6 rows) - -SELECT toplevel, calls, query FROM pg_stat_statements - ORDER BY query COLLATE "C"; - 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 $1) SELECT $2 - t | 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 $1) SELECT $2 UNION SELECT $3 - t | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t -(8 rows) - --- Explain analyze, all-level tracking. -SET pg_stat_statements.track = 'all'; -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) SELECT 100; - QUERY PLAN ------------------------------------ - Result (actual rows=1.00 loops=1) -(1 row) - -EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) - DECLARE foocur CURSOR FOR SELECT * FROM stats_track_tab; - QUERY PLAN --------------------------------------------------------- - Seq Scan on stats_track_tab (actual rows=0.00 loops=1) -(1 row) - -SELECT toplevel, calls, query FROM pg_stat_statements - ORDER BY query COLLATE "C"; - toplevel | calls | query -----------+-------+------------------------------------------------------------------------------- - t | 1 | EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) + - | | 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 | SELECT pg_stat_statements_reset() IS NOT NULL AS t -(5 rows) - --- Explain analyze, top tracking. -SET pg_stat_statements.track = 'top'; -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) SELECT 100; - QUERY PLAN ------------------------------------ - Result (actual rows=1.00 loops=1) -(1 row) - -EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) - DECLARE foocur CURSOR FOR SELECT * FROM stats_track_tab; - QUERY PLAN --------------------------------------------------------- - Seq Scan on stats_track_tab (actual rows=0.00 loops=1) -(1 row) - -SELECT toplevel, calls, query FROM pg_stat_statements - ORDER BY query COLLATE "C"; - 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 $1 - t | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t -(3 rows) - --- Create Materialized View, all-level tracking. -SET pg_stat_statements.track = 'all'; -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -CREATE MATERIALIZED VIEW pgss_materialized_view AS - SELECT * FROM generate_series(1, 5) as id; -SELECT toplevel, calls, query FROM pg_stat_statements - ORDER BY query COLLATE "C"; - toplevel | calls | query -----------+-------+---------------------------------------------------- - t | 1 | CREATE MATERIALIZED VIEW pgss_materialized_view AS+ - | | SELECT * FROM generate_series($1, $2) as id - t | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t -(2 rows) - --- CREATE MATERIALIZED VIEW, top-level tracking. -SET pg_stat_statements.track = 'top'; -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -CREATE MATERIALIZED VIEW pgss_materialized_view_2 AS - SELECT * FROM generate_series(1, 5) as id; -SELECT toplevel, calls, query FROM pg_stat_statements - ORDER BY query COLLATE "C"; - toplevel | calls | query -----------+-------+------------------------------------------------------ - t | 1 | CREATE MATERIALIZED VIEW pgss_materialized_view_2 AS+ - | | SELECT * FROM generate_series($1, $2) as id - t | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t -(2 rows) - --- REFRESH MATERIALIZED VIEW, all-level tracking. -SET pg_stat_statements.track = 'all'; -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -REFRESH MATERIALIZED VIEW pgss_materialized_view; -SELECT toplevel, calls, query FROM pg_stat_statements - ORDER BY query COLLATE "C"; - toplevel | calls | query -----------+-------+---------------------------------------------------- - t | 1 | REFRESH MATERIALIZED VIEW pgss_materialized_view - t | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t -(2 rows) - --- REFRESH MATERIALIZED VIEW, top-level tracking. -SET pg_stat_statements.track = 'top'; -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -REFRESH MATERIALIZED VIEW pgss_materialized_view; -SELECT toplevel, calls, query FROM pg_stat_statements - ORDER BY query COLLATE "C"; - toplevel | calls | query -----------+-------+---------------------------------------------------- - t | 1 | REFRESH MATERIALIZED VIEW pgss_materialized_view - t | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t -(2 rows) - --- CREATE TABLE AS, all-level tracking. -SET pg_stat_statements.track = 'all'; -PREPARE test_prepare_pgss AS select generate_series(1, 10); -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -CREATE TEMPORARY TABLE pgss_ctas_1 AS SELECT 1; -CREATE TEMPORARY TABLE pgss_ctas_2 AS EXECUTE test_prepare_pgss; -SELECT toplevel, calls, query FROM pg_stat_statements - ORDER BY query COLLATE "C"; - toplevel | calls | query -----------+-------+----------------------------------------------------------------- - t | 1 | CREATE TEMPORARY TABLE pgss_ctas_1 AS SELECT $1 - f | 1 | CREATE TEMPORARY TABLE pgss_ctas_1 AS SELECT $1; - t | 1 | CREATE TEMPORARY TABLE pgss_ctas_2 AS EXECUTE test_prepare_pgss - f | 1 | PREPARE test_prepare_pgss AS select generate_series($1, $2) - t | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t -(5 rows) - --- CREATE TABLE AS, top-level tracking. -SET pg_stat_statements.track = 'top'; -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -CREATE TEMPORARY TABLE pgss_ctas_3 AS SELECT 1; -CREATE TEMPORARY TABLE pgss_ctas_4 AS EXECUTE test_prepare_pgss; -SELECT toplevel, calls, query FROM pg_stat_statements - ORDER BY query COLLATE "C"; - toplevel | calls | query -----------+-------+----------------------------------------------------------------- - t | 1 | CREATE TEMPORARY TABLE pgss_ctas_3 AS SELECT $1 - t | 1 | CREATE TEMPORARY TABLE pgss_ctas_4 AS EXECUTE test_prepare_pgss - t | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t -(3 rows) - --- EXPLAIN with CREATE TABLE AS - all-level tracking. -SET pg_stat_statements.track = 'all'; -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -EXPLAIN (COSTS OFF) CREATE TEMPORARY TABLE pgss_explain_ctas AS SELECT 1; - QUERY PLAN ------------- - Result -(1 row) - -SELECT toplevel, calls, query FROM pg_stat_statements - ORDER BY query COLLATE "C"; - toplevel | calls | query -----------+-------+---------------------------------------------------------------------------- - t | 1 | EXPLAIN (COSTS OFF) CREATE TEMPORARY TABLE pgss_explain_ctas AS SELECT $1 - f | 1 | EXPLAIN (COSTS OFF) CREATE TEMPORARY TABLE pgss_explain_ctas AS SELECT $1; - t | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t -(3 rows) - --- EXPLAIN with CREATE TABLE AS - top-level tracking. -SET pg_stat_statements.track = 'top'; -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -EXPLAIN (COSTS OFF) CREATE TEMPORARY TABLE pgss_explain_ctas AS SELECT 1; - QUERY PLAN ------------- - Result -(1 row) - -SELECT toplevel, calls, query FROM pg_stat_statements - ORDER BY query COLLATE "C"; - toplevel | calls | query -----------+-------+--------------------------------------------------------------------------- - t | 1 | EXPLAIN (COSTS OFF) CREATE TEMPORARY TABLE pgss_explain_ctas AS SELECT $1 - t | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t -(2 rows) - --- DECLARE CURSOR, all-level tracking. -SET pg_stat_statements.track = 'all'; -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -BEGIN; -DECLARE FOOCUR CURSOR FOR SELECT * from stats_track_tab; -FETCH FORWARD 1 FROM foocur; - x ---- -(0 rows) - -CLOSE foocur; -COMMIT; -SELECT toplevel, calls, query FROM pg_stat_statements - ORDER BY query COLLATE "C"; - toplevel | calls | query -----------+-------+---------------------------------------------------------- - t | 1 | BEGIN - t | 1 | CLOSE foocur - 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 | SELECT pg_stat_statements_reset() IS NOT NULL AS t -(7 rows) - --- DECLARE CURSOR, top-level tracking. -SET pg_stat_statements.track = 'top'; -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -BEGIN; -DECLARE FOOCUR CURSOR FOR SELECT * FROM stats_track_tab; -FETCH FORWARD 1 FROM foocur; - x ---- -(0 rows) - -CLOSE foocur; -COMMIT; -SELECT toplevel, calls, query FROM pg_stat_statements - ORDER BY query COLLATE "C"; - toplevel | calls | query -----------+-------+--------------------------------------------------------- - t | 1 | BEGIN - 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 | SELECT pg_stat_statements_reset() IS NOT NULL AS t -(6 rows) - --- COPY - all-level tracking. -SET pg_stat_statements.track = 'all'; -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -COPY (SELECT 1) TO stdout; -1 -COPY (SELECT 1 UNION SELECT 2) TO stdout; -1 -2 -COPY (MERGE INTO stats_track_tab USING (SELECT 1 id) ON x = id - WHEN MATCHED THEN UPDATE SET x = id - WHEN NOT MATCHED THEN INSERT (x) VALUES (id) RETURNING x) TO stdout; -1 -COPY (INSERT INTO stats_track_tab (x) VALUES (1) RETURNING x) TO stdout; -1 -COPY (UPDATE stats_track_tab SET x = 2 WHERE x = 1 RETURNING x) TO stdout; -2 -2 -COPY (DELETE FROM stats_track_tab WHERE x = 2 RETURNING x) TO stdout; -2 -2 -SELECT toplevel, calls, query FROM pg_stat_statements - ORDER BY query COLLATE "C"; - toplevel | calls | query -----------+-------+----------------------------------------------------------------------------- - f | 1 | COPY (DELETE FROM stats_track_tab WHERE x = $1 RETURNING x) TO stdout - t | 1 | COPY (DELETE FROM stats_track_tab WHERE x = 2 RETURNING x) TO stdout - f | 1 | COPY (INSERT INTO stats_track_tab (x) VALUES ($1) RETURNING x) TO stdout - t | 1 | COPY (INSERT INTO stats_track_tab (x) VALUES (1) RETURNING x) TO stdout - f | 1 | COPY (MERGE INTO stats_track_tab USING (SELECT $1 id) ON x = id + - | | WHEN MATCHED THEN UPDATE SET x = id + - | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id) RETURNING x) TO stdout - t | 1 | COPY (MERGE INTO stats_track_tab USING (SELECT 1 id) ON x = id + - | | WHEN MATCHED THEN UPDATE SET x = id + - | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id) RETURNING x) TO stdout - f | 1 | COPY (SELECT $1 UNION SELECT $2) TO stdout - f | 1 | COPY (SELECT $1) TO stdout - t | 1 | COPY (SELECT 1 UNION SELECT 2) TO stdout - t | 1 | COPY (SELECT 1) TO stdout - f | 1 | COPY (UPDATE stats_track_tab SET x = $1 WHERE x = $2 RETURNING x) TO stdout - t | 1 | COPY (UPDATE stats_track_tab SET x = 2 WHERE x = 1 RETURNING x) TO stdout - t | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t -(13 rows) - --- COPY - top-level tracking. -SET pg_stat_statements.track = 'top'; -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -COPY (SELECT 1) TO stdout; -1 -COPY (SELECT 1 UNION SELECT 2) TO stdout; -1 -2 -COPY (MERGE INTO stats_track_tab USING (SELECT 1 id) ON x = id - WHEN MATCHED THEN UPDATE SET x = id - WHEN NOT MATCHED THEN INSERT (x) VALUES (id) RETURNING x) TO stdout; -1 -COPY (INSERT INTO stats_track_tab (x) VALUES (1) RETURNING x) TO stdout; -1 -COPY (UPDATE stats_track_tab SET x = 2 WHERE x = 1 RETURNING x) TO stdout; -2 -2 -COPY (DELETE FROM stats_track_tab WHERE x = 2 RETURNING x) TO stdout; -2 -2 -SELECT toplevel, calls, query FROM pg_stat_statements - ORDER BY query COLLATE "C"; - toplevel | calls | query -----------+-------+--------------------------------------------------------------------------- - t | 1 | COPY (DELETE FROM stats_track_tab WHERE x = 2 RETURNING x) TO stdout - t | 1 | COPY (INSERT INTO stats_track_tab (x) VALUES (1) RETURNING x) TO stdout - t | 1 | COPY (MERGE INTO stats_track_tab USING (SELECT 1 id) ON x = id + - | | WHEN MATCHED THEN UPDATE SET x = id + - | | WHEN NOT MATCHED THEN INSERT (x) VALUES (id) RETURNING x) TO stdout - t | 1 | COPY (SELECT 1 UNION SELECT 2) TO stdout - t | 1 | COPY (SELECT 1) TO stdout - t | 1 | COPY (UPDATE stats_track_tab SET x = 2 WHERE x = 1 RETURNING x) TO stdout - t | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t -(7 rows) - --- DO block - top-level tracking without utility. -SET pg_stat_statements.track = 'top'; -SET pg_stat_statements.track_utility = FALSE; -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -DELETE FROM stats_track_tab; -DO $$ -BEGIN - DELETE FROM stats_track_tab; -END; $$; -DO LANGUAGE plpgsql $$ -BEGIN - -- this is a SELECT - PERFORM 'hello world'::TEXT; -END; $$; -SELECT toplevel, calls, query FROM pg_stat_statements - ORDER BY query COLLATE "C", toplevel; - toplevel | calls | query -----------+-------+---------------------------------------------------- - t | 1 | DELETE FROM stats_track_tab - t | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t -(2 rows) - --- DO block - all-level tracking without utility. -SET pg_stat_statements.track = 'all'; -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -DELETE FROM stats_track_tab; -DO $$ -BEGIN - DELETE FROM stats_track_tab; -END; $$; -DO LANGUAGE plpgsql $$ -BEGIN - -- this is a SELECT - PERFORM 'hello world'::TEXT; -END; $$; -SELECT toplevel, calls, query FROM pg_stat_statements - ORDER BY query COLLATE "C", toplevel; - toplevel | calls | query -----------+-------+---------------------------------------------------- - f | 1 | DELETE FROM stats_track_tab - t | 1 | DELETE FROM stats_track_tab - f | 1 | SELECT $1::TEXT - t | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t -(4 rows) - --- DO block --- multiple inner queries with separators -SET pg_stat_statements.track = 'all'; -SET pg_stat_statements.track_utility = TRUE; -CREATE TABLE pgss_do_util_tab_1 (a int); -CREATE TABLE pgss_do_util_tab_2 (a int); -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -DO $$ -DECLARE BEGIN - EXECUTE 'CREATE TABLE pgss_do_table (id INT); DROP TABLE pgss_do_table'; - EXECUTE 'SELECT a FROM pgss_do_util_tab_1; SELECT a FROM pgss_do_util_tab_2'; -END $$; -SELECT toplevel, calls, rows, query FROM pg_stat_statements - WHERE toplevel IS FALSE - ORDER BY query COLLATE "C"; - toplevel | calls | rows | query -----------+-------+------+------------------------------------- - f | 1 | 0 | CREATE TABLE pgss_do_table (id INT) - f | 1 | 0 | DROP TABLE pgss_do_table - f | 1 | 0 | SELECT a FROM pgss_do_util_tab_1 - f | 1 | 0 | SELECT a FROM pgss_do_util_tab_2 -(4 rows) - -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - --- Note the extra semicolon at the end of the query. -DO $$ -DECLARE BEGIN - EXECUTE 'CREATE TABLE pgss_do_table (id INT); DROP TABLE pgss_do_table;'; - EXECUTE 'SELECT a FROM pgss_do_util_tab_1; SELECT a FROM pgss_do_util_tab_2;'; -END $$; -SELECT toplevel, calls, rows, query FROM pg_stat_statements - WHERE toplevel IS FALSE - ORDER BY query COLLATE "C"; - toplevel | calls | rows | query -----------+-------+------+------------------------------------- - f | 1 | 0 | CREATE TABLE pgss_do_table (id INT) - f | 1 | 0 | DROP TABLE pgss_do_table - f | 1 | 0 | SELECT a FROM pgss_do_util_tab_1 - f | 1 | 0 | SELECT a FROM pgss_do_util_tab_2 -(4 rows) - -DROP TABLE pgss_do_util_tab_1, pgss_do_util_tab_2; --- PL/pgSQL function - top-level tracking. -SET pg_stat_statements.track = 'top'; -SET pg_stat_statements.track_utility = FALSE; -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -CREATE FUNCTION PLUS_TWO(i INTEGER) RETURNS INTEGER AS $$ -DECLARE - r INTEGER; -BEGIN - SELECT (i + 1 + 1.0)::INTEGER INTO r; - RETURN r; -END; $$ LANGUAGE plpgsql; -SELECT PLUS_TWO(3); - plus_two ----------- - 5 -(1 row) - -SELECT PLUS_TWO(7); - plus_two ----------- - 9 -(1 row) - --- SQL function --- use LIMIT to keep it from being inlined -CREATE FUNCTION PLUS_ONE(i INTEGER) RETURNS INTEGER AS -$$ SELECT (i + 1.0)::INTEGER LIMIT 1 $$ LANGUAGE SQL; -SELECT PLUS_ONE(8); - plus_one ----------- - 9 -(1 row) - -SELECT PLUS_ONE(10); - plus_one ----------- - 11 -(1 row) - -SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; - calls | rows | query --------+------+---------------------------------------------------- - 2 | 2 | SELECT PLUS_ONE($1) - 2 | 2 | SELECT PLUS_TWO($1) - 1 | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t -(3 rows) - --- immutable SQL function --- can be executed at plan time -CREATE FUNCTION PLUS_THREE(i INTEGER) RETURNS INTEGER AS -$$ SELECT i + 3 LIMIT 1 $$ IMMUTABLE LANGUAGE SQL; -SELECT PLUS_THREE(8); - plus_three ------------- - 11 -(1 row) - -SELECT PLUS_THREE(10); - plus_three ------------- - 13 -(1 row) - -SELECT toplevel, calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; - toplevel | calls | rows | query -----------+-------+------+------------------------------------------------------------------------------ - t | 2 | 2 | SELECT PLUS_ONE($1) - t | 2 | 2 | SELECT PLUS_THREE($1) - t | 2 | 2 | SELECT PLUS_TWO($1) - t | 1 | 3 | SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C" - t | 1 | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t -(5 rows) - --- PL/pgSQL function - all-level tracking. -SET pg_stat_statements.track = 'all'; -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - --- we drop and recreate the functions to avoid any caching funnies -DROP FUNCTION PLUS_ONE(INTEGER); -DROP FUNCTION PLUS_TWO(INTEGER); -DROP FUNCTION PLUS_THREE(INTEGER); --- PL/pgSQL function -CREATE FUNCTION PLUS_TWO(i INTEGER) RETURNS INTEGER AS $$ -DECLARE - r INTEGER; -BEGIN - SELECT (i + 1 + 1.0)::INTEGER INTO r; - RETURN r; -END; $$ LANGUAGE plpgsql; -SELECT PLUS_TWO(-1); - plus_two ----------- - 1 -(1 row) - -SELECT PLUS_TWO(2); - plus_two ----------- - 4 -(1 row) - --- SQL function --- use LIMIT to keep it from being inlined -CREATE FUNCTION PLUS_ONE(i INTEGER) RETURNS INTEGER AS -$$ SELECT (i + 1.0)::INTEGER LIMIT 1 $$ LANGUAGE SQL; -SELECT PLUS_ONE(3); - plus_one ----------- - 4 -(1 row) - -SELECT PLUS_ONE(1); - plus_one ----------- - 2 -(1 row) - -SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; - calls | rows | query --------+------+---------------------------------------------------- - 2 | 2 | SELECT (i + $2)::INTEGER LIMIT $3 - 2 | 2 | SELECT PLUS_ONE($1) - 2 | 2 | SELECT PLUS_TWO($1) - 1 | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t -(4 rows) - --- immutable SQL function --- can be executed at plan time -CREATE FUNCTION PLUS_THREE(i INTEGER) RETURNS INTEGER AS -$$ SELECT i + 3 LIMIT 1 $$ IMMUTABLE LANGUAGE SQL; -SELECT PLUS_THREE(8); - plus_three ------------- - 11 -(1 row) - -SELECT PLUS_THREE(10); - plus_three ------------- - 13 -(1 row) - -SELECT toplevel, calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; - toplevel | calls | rows | query -----------+-------+------+------------------------------------------------------------------------------ - f | 2 | 2 | SELECT (i + $2)::INTEGER LIMIT $3 - t | 2 | 2 | SELECT PLUS_ONE($1) - t | 2 | 2 | SELECT PLUS_THREE($1) - t | 2 | 2 | SELECT PLUS_TWO($1) - t | 1 | 4 | SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C" - f | 2 | 2 | SELECT i + $2 LIMIT $3 - t | 1 | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t -(7 rows) - -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - --- planner - all-level tracking. -SET pg_stat_statements.track_planning = TRUE; --- Release all cached plans before the first function call. This matters --- when debug_discard_caches is enabled, which would store a normalized --- version of the inner query of the function. Forcing a plan rebuild --- ensures that a normalized version is always stored with the stats entry, --- while checking that the nesting level is computed correctly in the --- planner hook. -DISCARD PLANS; -SELECT PLUS_THREE(8); - plus_three ------------- - 11 -(1 row) - -SELECT PLUS_THREE(10); - plus_three ------------- - 13 -(1 row) - -SELECT toplevel, calls, rows, plans, query FROM pg_stat_statements - ORDER BY query COLLATE "C"; - toplevel | calls | rows | plans | query -----------+-------+------+-------+-------------------------------------------------------------------- - t | 2 | 2 | 2 | SELECT PLUS_THREE($1) - f | 2 | 2 | 2 | SELECT i + $2 LIMIT $3 - t | 1 | 1 | 0 | SELECT pg_stat_statements_reset() IS NOT NULL AS t - t | 0 | 0 | 1 | SELECT toplevel, calls, rows, plans, query FROM pg_stat_statements+ - | | | | ORDER BY query COLLATE "C" -(4 rows) - -RESET pg_stat_statements.track_planning; --- AFTER trigger SQL (ExecutorFinish) - all-level tracking. -SET pg_stat_statements.track = 'all'; -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -CREATE TABLE test_trigger (id int, name text); -CREATE TABLE audit_table (table_name text, action text, row_id int); -CREATE OR REPLACE FUNCTION audit_trigger_func() -RETURNS TRIGGER AS $$ -BEGIN - INSERT INTO audit_table VALUES ('test_trigger', TG_OP, NEW.id); - RETURN NULL; -END; -$$ LANGUAGE plpgsql; -CREATE TRIGGER audit_after_trigger - AFTER INSERT ON test_trigger - FOR EACH ROW EXECUTE FUNCTION audit_trigger_func(); -INSERT INTO test_trigger VALUES (1, 'test1'); -INSERT INTO test_trigger VALUES (2, 'test2'); -SELECT toplevel, calls, rows, plans, query FROM pg_stat_statements - ORDER BY query COLLATE "C"; - toplevel | calls | rows | plans | query -----------+-------+------+-------+----------------------------------------------------- - f | 2 | 2 | 0 | INSERT INTO audit_table VALUES ($15, TG_OP, NEW.id) - t | 2 | 2 | 0 | INSERT INTO test_trigger VALUES ($1, $2) - t | 1 | 1 | 0 | SELECT pg_stat_statements_reset() IS NOT NULL AS t -(3 rows) - -DROP TRIGGER audit_after_trigger ON test_trigger; -DROP FUNCTION audit_trigger_func(); -DROP TABLE audit_table, test_trigger; --- --- pg_stat_statements.track = none --- -SET pg_stat_statements.track = 'none'; -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -SELECT 1 AS "one"; - one ------ - 1 -(1 row) - -SELECT 1 + 1 AS "two"; - two ------ - 2 -(1 row) - -SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; - calls | rows | query --------+------+------- -(0 rows) - -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - +psql: error: connection to server on socket "/tmp/pg_regress-pGEVs9/.s.PGSQL.58928" failed: No such file or directory + Is the server running locally and accepting connections on that socket? diff -U3 /tmp/cirrus-ci-build/contrib/pg_stat_statements/expected/planning.out /tmp/cirrus-ci-build/contrib/pg_stat_statements/results/planning.out --- /tmp/cirrus-ci-build/contrib/pg_stat_statements/expected/planning.out 2026-05-12 14:52:22.731058598 +0000 +++ /tmp/cirrus-ci-build/contrib/pg_stat_statements/results/planning.out 2026-05-12 14:59:46.517853698 +0000 @@ -1,88 +1,2 @@ --- --- Information related to planning --- --- These tests require track_planning to be enabled. -SET pg_stat_statements.track_planning = TRUE; -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - --- --- [re]plan counting --- -CREATE TABLE stats_plan_test (); -PREPARE prep1 AS SELECT COUNT(*) FROM stats_plan_test; -EXECUTE prep1; - count -------- - 0 -(1 row) - -EXECUTE prep1; - count -------- - 0 -(1 row) - -EXECUTE prep1; - count -------- - 0 -(1 row) - -ALTER TABLE stats_plan_test ADD COLUMN x int; -EXECUTE prep1; - count -------- - 0 -(1 row) - -SELECT 42; - ?column? ----------- - 42 -(1 row) - -SELECT 42; - ?column? ----------- - 42 -(1 row) - -SELECT 42; - ?column? ----------- - 42 -(1 row) - -SELECT plans, calls, rows, query FROM pg_stat_statements - WHERE query NOT LIKE 'PREPARE%' ORDER BY query COLLATE "C"; - plans | calls | rows | query --------+-------+------+---------------------------------------------------------- - 0 | 1 | 0 | ALTER TABLE stats_plan_test ADD COLUMN x int - 0 | 1 | 0 | CREATE TABLE stats_plan_test () - 3 | 3 | 3 | SELECT $1 - 0 | 1 | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t - 1 | 0 | 0 | SELECT plans, calls, rows, query FROM pg_stat_statements+ - | | | WHERE query NOT LIKE $1 ORDER BY query COLLATE "C" -(5 rows) - --- for the prepared statement we expect at least one replan, but cache --- invalidations could force more -SELECT plans >= 2 AND plans <= calls AS plans_ok, calls, rows, query FROM pg_stat_statements - WHERE query LIKE 'PREPARE%' ORDER BY query COLLATE "C"; - plans_ok | calls | rows | query -----------+-------+------+------------------------------------------------------- - t | 4 | 4 | PREPARE prep1 AS SELECT COUNT(*) FROM stats_plan_test -(1 row) - --- Cleanup -DROP TABLE stats_plan_test; -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - +psql: error: connection to server on socket "/tmp/pg_regress-pGEVs9/.s.PGSQL.58928" failed: No such file or directory + Is the server running locally and accepting connections on that socket? diff -U3 /tmp/cirrus-ci-build/contrib/pg_stat_statements/expected/user_activity.out /tmp/cirrus-ci-build/contrib/pg_stat_statements/results/user_activity.out --- /tmp/cirrus-ci-build/contrib/pg_stat_statements/expected/user_activity.out 2026-05-12 14:52:22.731058598 +0000 +++ /tmp/cirrus-ci-build/contrib/pg_stat_statements/results/user_activity.out 2026-05-12 14:59:46.573856493 +0000 @@ -1,209 +1,2 @@ --- --- Track user activity and reset them --- -SET pg_stat_statements.track_utility = TRUE; -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -CREATE ROLE regress_stats_user1; -CREATE ROLE regress_stats_user2; -SET ROLE regress_stats_user1; -SELECT 1 AS "ONE"; - ONE ------ - 1 -(1 row) - -SELECT 1+1 AS "TWO"; - TWO ------ - 2 -(1 row) - -RESET ROLE; -SET ROLE regress_stats_user2; -SELECT 1 AS "ONE"; - ONE ------ - 1 -(1 row) - -SELECT 1+1 AS "TWO"; - TWO ------ - 2 -(1 row) - -RESET ROLE; -SELECT query, calls, rows FROM pg_stat_statements ORDER BY query COLLATE "C"; - query | calls | rows -----------------------------------------------------+-------+------ - CREATE ROLE regress_stats_user1 | 1 | 0 - CREATE ROLE regress_stats_user2 | 1 | 0 - RESET ROLE | 2 | 0 - SELECT $1 AS "ONE" | 1 | 1 - SELECT $1 AS "ONE" | 1 | 1 - SELECT $1+$2 AS "TWO" | 1 | 1 - SELECT $1+$2 AS "TWO" | 1 | 1 - SELECT pg_stat_statements_reset() IS NOT NULL AS t | 1 | 1 - SET ROLE regress_stats_user1 | 1 | 0 - SET ROLE regress_stats_user2 | 1 | 0 -(10 rows) - --- --- Don't reset anything if any of the parameter is NULL --- -SELECT pg_stat_statements_reset(NULL) IS NOT NULL AS t; - t ---- - f -(1 row) - -SELECT query, calls, rows FROM pg_stat_statements ORDER BY query COLLATE "C"; - query | calls | rows -------------------------------------------------------------------------------+-------+------ - CREATE ROLE regress_stats_user1 | 1 | 0 - CREATE ROLE regress_stats_user2 | 1 | 0 - RESET ROLE | 2 | 0 - SELECT $1 AS "ONE" | 1 | 1 - SELECT $1 AS "ONE" | 1 | 1 - SELECT $1+$2 AS "TWO" | 1 | 1 - SELECT $1+$2 AS "TWO" | 1 | 1 - SELECT pg_stat_statements_reset($1) IS NOT NULL AS t | 1 | 1 - SELECT pg_stat_statements_reset() IS NOT NULL AS t | 1 | 1 - SELECT query, calls, rows FROM pg_stat_statements ORDER BY query COLLATE "C" | 1 | 10 - SET ROLE regress_stats_user1 | 1 | 0 - SET ROLE regress_stats_user2 | 1 | 0 -(12 rows) - --- --- remove query ('SELECT $1+$2 AS "TWO"') executed by regress_stats_user2 --- in the current_database --- -SELECT pg_stat_statements_reset( - (SELECT r.oid FROM pg_roles AS r WHERE r.rolname = 'regress_stats_user2'), - (SELECT d.oid FROM pg_database As d where datname = current_database()), - (SELECT s.queryid FROM pg_stat_statements AS s - WHERE s.query = 'SELECT $1+$2 AS "TWO"' LIMIT 1)) - IS NOT NULL AS t; - t ---- - t -(1 row) - -SELECT query, calls, rows FROM pg_stat_statements ORDER BY query COLLATE "C"; - query | calls | rows -----------------------------------------------------------------------------------+-------+------ - CREATE ROLE regress_stats_user1 | 1 | 0 - CREATE ROLE regress_stats_user2 | 1 | 0 - RESET ROLE | 2 | 0 - SELECT $1 AS "ONE" | 1 | 1 - SELECT $1 AS "ONE" | 1 | 1 - SELECT $1+$2 AS "TWO" | 1 | 1 - SELECT pg_stat_statements_reset( +| 1 | 1 - (SELECT r.oid FROM pg_roles AS r WHERE r.rolname = $1), +| | - (SELECT d.oid FROM pg_database As d where datname = current_database()),+| | - (SELECT s.queryid FROM pg_stat_statements AS s +| | - WHERE s.query = $2 LIMIT $3)) +| | - IS NOT NULL AS t | | - SELECT pg_stat_statements_reset($1) IS NOT NULL AS t | 1 | 1 - SELECT pg_stat_statements_reset() IS NOT NULL AS t | 1 | 1 - SELECT query, calls, rows FROM pg_stat_statements ORDER BY query COLLATE "C" | 2 | 22 - SET ROLE regress_stats_user1 | 1 | 0 - SET ROLE regress_stats_user2 | 1 | 0 -(12 rows) - --- --- remove query ('SELECT $1 AS "ONE"') executed by two users --- -SELECT pg_stat_statements_reset(0,0,s.queryid) IS NOT NULL AS t - FROM pg_stat_statements AS s WHERE s.query = 'SELECT $1 AS "ONE"'; - t ---- - t - t -(2 rows) - -SELECT query, calls, rows FROM pg_stat_statements ORDER BY query COLLATE "C"; - query | calls | rows -----------------------------------------------------------------------------------+-------+------ - CREATE ROLE regress_stats_user1 | 1 | 0 - CREATE ROLE regress_stats_user2 | 1 | 0 - RESET ROLE | 2 | 0 - SELECT $1+$2 AS "TWO" | 1 | 1 - SELECT pg_stat_statements_reset( +| 1 | 1 - (SELECT r.oid FROM pg_roles AS r WHERE r.rolname = $1), +| | - (SELECT d.oid FROM pg_database As d where datname = current_database()),+| | - (SELECT s.queryid FROM pg_stat_statements AS s +| | - WHERE s.query = $2 LIMIT $3)) +| | - IS NOT NULL AS t | | - SELECT pg_stat_statements_reset($1) IS NOT NULL AS t | 1 | 1 - SELECT pg_stat_statements_reset($1,$2,s.queryid) IS NOT NULL AS t +| 1 | 2 - FROM pg_stat_statements AS s WHERE s.query = $3 | | - SELECT pg_stat_statements_reset() IS NOT NULL AS t | 1 | 1 - SELECT query, calls, rows FROM pg_stat_statements ORDER BY query COLLATE "C" | 3 | 34 - SET ROLE regress_stats_user1 | 1 | 0 - SET ROLE regress_stats_user2 | 1 | 0 -(11 rows) - --- --- remove query of a user (regress_stats_user1) --- -SELECT pg_stat_statements_reset(r.oid) IS NOT NULL AS t - FROM pg_roles AS r WHERE r.rolname = 'regress_stats_user1'; - t ---- - t -(1 row) - -SELECT query, calls, rows FROM pg_stat_statements ORDER BY query COLLATE "C"; - query | calls | rows -----------------------------------------------------------------------------------+-------+------ - CREATE ROLE regress_stats_user1 | 1 | 0 - CREATE ROLE regress_stats_user2 | 1 | 0 - RESET ROLE | 2 | 0 - SELECT pg_stat_statements_reset( +| 1 | 1 - (SELECT r.oid FROM pg_roles AS r WHERE r.rolname = $1), +| | - (SELECT d.oid FROM pg_database As d where datname = current_database()),+| | - (SELECT s.queryid FROM pg_stat_statements AS s +| | - WHERE s.query = $2 LIMIT $3)) +| | - IS NOT NULL AS t | | - SELECT pg_stat_statements_reset($1) IS NOT NULL AS t | 1 | 1 - SELECT pg_stat_statements_reset($1,$2,s.queryid) IS NOT NULL AS t +| 1 | 2 - FROM pg_stat_statements AS s WHERE s.query = $3 | | - SELECT pg_stat_statements_reset() IS NOT NULL AS t | 1 | 1 - SELECT pg_stat_statements_reset(r.oid) IS NOT NULL AS t +| 1 | 1 - FROM pg_roles AS r WHERE r.rolname = $1 | | - SELECT query, calls, rows FROM pg_stat_statements ORDER BY query COLLATE "C" | 4 | 45 - SET ROLE regress_stats_user2 | 1 | 0 -(10 rows) - --- --- reset all --- -SELECT pg_stat_statements_reset(0,0,0) IS NOT NULL AS t; - t ---- - t -(1 row) - -SELECT query, calls, rows FROM pg_stat_statements ORDER BY query COLLATE "C"; - query | calls | rows ----------------------------------------------------------+-------+------ - SELECT pg_stat_statements_reset(0,0,0) IS NOT NULL AS t | 1 | 1 -(1 row) - --- --- cleanup --- -DROP ROLE regress_stats_user1; -DROP ROLE regress_stats_user2; -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - +psql: error: connection to server on socket "/tmp/pg_regress-pGEVs9/.s.PGSQL.58928" failed: No such file or directory + Is the server running locally and accepting connections on that socket? diff -U3 /tmp/cirrus-ci-build/contrib/pg_stat_statements/expected/wal.out /tmp/cirrus-ci-build/contrib/pg_stat_statements/results/wal.out --- /tmp/cirrus-ci-build/contrib/pg_stat_statements/expected/wal.out 2026-05-12 14:52:22.731058598 +0000 +++ /tmp/cirrus-ci-build/contrib/pg_stat_statements/results/wal.out 2026-05-12 14:59:46.629859287 +0000 @@ -1,30 +1,2 @@ --- --- Validate WAL generation metrics --- -SET pg_stat_statements.track_utility = FALSE; -CREATE TABLE pgss_wal_tab (a int, b char(20)); -INSERT INTO pgss_wal_tab VALUES(generate_series(1, 10), 'aaa'); -UPDATE pgss_wal_tab SET b = 'bbb' WHERE a > 7; -DELETE FROM pgss_wal_tab WHERE a > 9; -DROP TABLE pgss_wal_tab; --- Check WAL is generated for the above statements -SELECT query, calls, rows, -wal_bytes > 0 as wal_bytes_generated, -wal_records > 0 as wal_records_generated, -wal_records >= rows as wal_records_ge_rows -FROM pg_stat_statements ORDER BY query COLLATE "C"; - query | calls | rows | wal_bytes_generated | wal_records_generated | wal_records_ge_rows ---------------------------------------------------------------+-------+------+---------------------+-----------------------+--------------------- - DELETE FROM pgss_wal_tab WHERE a > $1 | 1 | 1 | t | t | t - INSERT INTO pgss_wal_tab VALUES(generate_series($1, $2), $3) | 1 | 10 | t | t | t - SELECT pg_stat_statements_reset() IS NOT NULL AS t | 1 | 1 | f | f | f - SET pg_stat_statements.track_utility = $1 | 1 | 0 | f | f | t - UPDATE pgss_wal_tab SET b = $1 WHERE a > $2 | 1 | 3 | t | t | t -(5 rows) - -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - +psql: error: connection to server on socket "/tmp/pg_regress-pGEVs9/.s.PGSQL.58928" failed: No such file or directory + Is the server running locally and accepting connections on that socket? diff -U3 /tmp/cirrus-ci-build/contrib/pg_stat_statements/expected/entry_timestamp.out /tmp/cirrus-ci-build/contrib/pg_stat_statements/results/entry_timestamp.out --- /tmp/cirrus-ci-build/contrib/pg_stat_statements/expected/entry_timestamp.out 2026-05-12 14:52:22.731058598 +0000 +++ /tmp/cirrus-ci-build/contrib/pg_stat_statements/results/entry_timestamp.out 2026-05-12 14:59:46.681861883 +0000 @@ -1,159 +1,2 @@ --- --- statement timestamps --- --- planning time is needed during tests -SET pg_stat_statements.track_planning = TRUE; -SELECT 1 AS "STMTTS1"; - STMTTS1 ---------- - 1 -(1 row) - -SELECT now() AS ref_ts \gset -SELECT 1,2 AS "STMTTS2"; - ?column? | STMTTS2 -----------+--------- - 1 | 2 -(1 row) - -SELECT stats_since >= :'ref_ts', count(*) FROM pg_stat_statements -WHERE query LIKE '%STMTTS%' -GROUP BY stats_since >= :'ref_ts' -ORDER BY stats_since >= :'ref_ts'; - ?column? | count -----------+------- - f | 1 - t | 1 -(2 rows) - -SELECT now() AS ref_ts \gset -SELECT - count(*) as total, - count(*) FILTER ( - WHERE min_plan_time + max_plan_time = 0 - ) as minmax_plan_zero, - count(*) FILTER ( - WHERE min_exec_time + max_exec_time = 0 - ) as minmax_exec_zero, - count(*) FILTER ( - WHERE minmax_stats_since >= :'ref_ts' - ) as minmax_stats_since_after_ref, - count(*) FILTER ( - WHERE stats_since >= :'ref_ts' - ) as stats_since_after_ref -FROM pg_stat_statements -WHERE query LIKE '%STMTTS%'; - total | minmax_plan_zero | minmax_exec_zero | minmax_stats_since_after_ref | stats_since_after_ref --------+------------------+------------------+------------------------------+----------------------- - 2 | 0 | 0 | 0 | 0 -(1 row) - --- Perform single min/max reset -SELECT pg_stat_statements_reset(0, 0, queryid, true) AS minmax_reset_ts -FROM pg_stat_statements -WHERE query LIKE '%STMTTS1%' \gset --- check -SELECT - count(*) as total, - count(*) FILTER ( - WHERE min_plan_time + max_plan_time = 0 - ) as minmax_plan_zero, - count(*) FILTER ( - WHERE min_exec_time + max_exec_time = 0 - ) as minmax_exec_zero, - count(*) FILTER ( - WHERE minmax_stats_since >= :'ref_ts' - ) as minmax_stats_since_after_ref, - count(*) FILTER ( - WHERE stats_since >= :'ref_ts' - ) as stats_since_after_ref -FROM pg_stat_statements -WHERE query LIKE '%STMTTS%'; - total | minmax_plan_zero | minmax_exec_zero | minmax_stats_since_after_ref | stats_since_after_ref --------+------------------+------------------+------------------------------+----------------------- - 2 | 1 | 1 | 1 | 0 -(1 row) - --- check minmax reset timestamps -SELECT -query, minmax_stats_since = :'minmax_reset_ts' AS reset_ts_match -FROM pg_stat_statements -WHERE query LIKE '%STMTTS%' -ORDER BY query COLLATE "C"; - query | reset_ts_match ----------------------------+---------------- - SELECT $1 AS "STMTTS1" | t - SELECT $1,$2 AS "STMTTS2" | f -(2 rows) - --- check that minmax reset does not set stats_reset -SELECT -stats_reset = :'minmax_reset_ts' AS stats_reset_ts_match -FROM pg_stat_statements_info; - stats_reset_ts_match ----------------------- - f -(1 row) - --- Perform common min/max reset -SELECT pg_stat_statements_reset(0, 0, 0, true) AS minmax_reset_ts \gset --- check again -SELECT - count(*) as total, - count(*) FILTER ( - WHERE min_plan_time + max_plan_time = 0 - ) as minmax_plan_zero, - count(*) FILTER ( - WHERE min_exec_time + max_exec_time = 0 - ) as minmax_exec_zero, - count(*) FILTER ( - WHERE minmax_stats_since >= :'ref_ts' - ) as minmax_ts_after_ref, - count(*) FILTER ( - WHERE minmax_stats_since = :'minmax_reset_ts' - ) as minmax_ts_match, - count(*) FILTER ( - WHERE stats_since >= :'ref_ts' - ) as stats_since_after_ref -FROM pg_stat_statements -WHERE query LIKE '%STMTTS%'; - total | minmax_plan_zero | minmax_exec_zero | minmax_ts_after_ref | minmax_ts_match | stats_since_after_ref --------+------------------+------------------+---------------------+-----------------+----------------------- - 2 | 2 | 2 | 2 | 2 | 0 -(1 row) - --- Execute first query once more to check stats update -SELECT 1 AS "STMTTS1"; - STMTTS1 ---------- - 1 -(1 row) - --- check --- we don't check planing times here to be independent of --- plan caching approach -SELECT - count(*) as total, - count(*) FILTER ( - WHERE min_exec_time + max_exec_time = 0 - ) as minmax_exec_zero, - count(*) FILTER ( - WHERE minmax_stats_since >= :'ref_ts' - ) as minmax_ts_after_ref, - count(*) FILTER ( - WHERE stats_since >= :'ref_ts' - ) as stats_since_after_ref -FROM pg_stat_statements -WHERE query LIKE '%STMTTS%'; - total | minmax_exec_zero | minmax_ts_after_ref | stats_since_after_ref --------+------------------+---------------------+----------------------- - 2 | 1 | 2 | 0 -(1 row) - --- Cleanup -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - +psql: error: connection to server on socket "/tmp/pg_regress-pGEVs9/.s.PGSQL.58928" failed: No such file or directory + Is the server running locally and accepting connections on that socket? diff -U3 /tmp/cirrus-ci-build/contrib/pg_stat_statements/expected/privileges.out /tmp/cirrus-ci-build/contrib/pg_stat_statements/results/privileges.out --- /tmp/cirrus-ci-build/contrib/pg_stat_statements/expected/privileges.out 2026-05-12 14:52:22.731058598 +0000 +++ /tmp/cirrus-ci-build/contrib/pg_stat_statements/results/privileges.out 2026-05-12 14:59:46.729864279 +0000 @@ -1,97 +1,2 @@ --- --- Only superusers and roles with privileges of the pg_read_all_stats role --- are allowed to see the SQL text and queryid of queries executed by --- other users. Other users can see the statistics. --- -SET pg_stat_statements.track_utility = FALSE; -CREATE ROLE regress_stats_superuser SUPERUSER; -CREATE ROLE regress_stats_user1; -CREATE ROLE regress_stats_user2; -GRANT pg_read_all_stats TO regress_stats_user2; -SET ROLE regress_stats_superuser; -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -SELECT 1 AS "ONE"; - ONE ------ - 1 -(1 row) - -SET ROLE regress_stats_user1; -SELECT 1+1 AS "TWO"; - TWO ------ - 2 -(1 row) - --- --- A superuser can read all columns of queries executed by others, --- including query text and queryid. --- -SET ROLE regress_stats_superuser; -SELECT r.rolname, ss.queryid <> 0 AS queryid_bool, ss.query, ss.calls, ss.rows - FROM pg_stat_statements ss JOIN pg_roles r ON ss.userid = r.oid - ORDER BY r.rolname, ss.query COLLATE "C", ss.calls, ss.rows; - rolname | queryid_bool | query | calls | rows --------------------------+--------------+----------------------------------------------------+-------+------ - regress_stats_superuser | t | SELECT $1 AS "ONE" | 1 | 1 - regress_stats_superuser | t | SELECT pg_stat_statements_reset() IS NOT NULL AS t | 1 | 1 - regress_stats_user1 | t | SELECT $1+$2 AS "TWO" | 1 | 1 -(3 rows) - --- --- regress_stats_user1 has no privileges to read the query text or --- queryid of queries executed by others but can see statistics --- like calls and rows. --- -SET ROLE regress_stats_user1; -SELECT r.rolname, ss.queryid <> 0 AS queryid_bool, ss.query, ss.calls, ss.rows - FROM pg_stat_statements ss JOIN pg_roles r ON ss.userid = r.oid - ORDER BY r.rolname, ss.query COLLATE "C", ss.calls, ss.rows; - rolname | queryid_bool | query | calls | rows --------------------------+--------------+--------------------------+-------+------ - regress_stats_superuser | | | 1 | 1 - regress_stats_superuser | | | 1 | 1 - regress_stats_superuser | | | 1 | 3 - regress_stats_user1 | t | SELECT $1+$2 AS "TWO" | 1 | 1 -(4 rows) - --- --- regress_stats_user2, with pg_read_all_stats role privileges, can --- read all columns, including query text and queryid, of queries --- executed by others. --- -SET ROLE regress_stats_user2; -SELECT r.rolname, ss.queryid <> 0 AS queryid_bool, ss.query, ss.calls, ss.rows - FROM pg_stat_statements ss JOIN pg_roles r ON ss.userid = r.oid - ORDER BY r.rolname, ss.query COLLATE "C", ss.calls, ss.rows; - rolname | queryid_bool | query | calls | rows --------------------------+--------------+---------------------------------------------------------------------------------+-------+------ - regress_stats_superuser | t | SELECT $1 AS "ONE" | 1 | 1 - regress_stats_superuser | t | SELECT pg_stat_statements_reset() IS NOT NULL AS t | 1 | 1 - regress_stats_superuser | t | SELECT r.rolname, ss.queryid <> $1 AS queryid_bool, ss.query, ss.calls, ss.rows+| 1 | 3 - | | FROM pg_stat_statements ss JOIN pg_roles r ON ss.userid = r.oid +| | - | | ORDER BY r.rolname, ss.query COLLATE "C", ss.calls, ss.rows | | - regress_stats_user1 | t | SELECT $1+$2 AS "TWO" | 1 | 1 - regress_stats_user1 | t | SELECT r.rolname, ss.queryid <> $1 AS queryid_bool, ss.query, ss.calls, ss.rows+| 1 | 4 - | | FROM pg_stat_statements ss JOIN pg_roles r ON ss.userid = r.oid +| | - | | ORDER BY r.rolname, ss.query COLLATE "C", ss.calls, ss.rows | | -(5 rows) - --- --- cleanup --- -RESET ROLE; -DROP ROLE regress_stats_superuser; -DROP ROLE regress_stats_user1; -DROP ROLE regress_stats_user2; -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - +psql: error: connection to server on socket "/tmp/pg_regress-pGEVs9/.s.PGSQL.58928" failed: No such file or directory + Is the server running locally and accepting connections on that socket? diff -U3 /tmp/cirrus-ci-build/contrib/pg_stat_statements/expected/extended.out /tmp/cirrus-ci-build/contrib/pg_stat_statements/results/extended.out --- /tmp/cirrus-ci-build/contrib/pg_stat_statements/expected/extended.out 2026-05-12 14:52:22.731058598 +0000 +++ /tmp/cirrus-ci-build/contrib/pg_stat_statements/results/extended.out 2026-05-12 14:59:46.773866475 +0000 @@ -1,164 +1,2 @@ --- Tests with extended query protocol -SET pg_stat_statements.track_utility = FALSE; --- This test checks that an execute message sets a query ID. -SELECT query_id IS NOT NULL AS query_id_set - FROM pg_stat_activity WHERE pid = pg_backend_pid() \bind \g - query_id_set --------------- - t -(1 row) - -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -SELECT $1 \parse stmt1 -SELECT $1, $2 \parse stmt2 -SELECT $1, $2, $3 \parse stmt3 -SELECT $1 \bind 'unnamed_val1' \g - ?column? --------------- - unnamed_val1 -(1 row) - -\bind_named stmt1 'stmt1_val1' \g - ?column? ------------- - stmt1_val1 -(1 row) - -\bind_named stmt2 'stmt2_val1' 'stmt2_val2' \g - ?column? | ?column? -------------+------------ - stmt2_val1 | stmt2_val2 -(1 row) - -\bind_named stmt3 'stmt3_val1' 'stmt3_val2' 'stmt3_val3' \g - ?column? | ?column? | ?column? -------------+------------+------------ - stmt3_val1 | stmt3_val2 | stmt3_val3 -(1 row) - -\bind_named stmt3 'stmt3_val4' 'stmt3_val5' 'stmt3_val6' \g - ?column? | ?column? | ?column? -------------+------------+------------ - stmt3_val4 | stmt3_val5 | stmt3_val6 -(1 row) - -\bind_named stmt2 'stmt2_val3' 'stmt2_val4' \g - ?column? | ?column? -------------+------------ - stmt2_val3 | stmt2_val4 -(1 row) - -\bind_named stmt1 'stmt1_val1' \g - ?column? ------------- - stmt1_val1 -(1 row) - -SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; - calls | rows | query --------+------+---------------------------------------------------- - 3 | 3 | SELECT $1 - 2 | 2 | SELECT $1, $2 - 2 | 2 | SELECT $1, $2, $3 - 1 | 1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t -(4 rows) - --- Various parameter numbering patterns --- Unique query IDs with parameter numbers switched. -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -SELECT WHERE ($1::int, 7) IN ((8, $2::int), ($3::int, 9)) \bind '1' '2' '3' \g --- -(0 rows) - -SELECT WHERE ($2::int, 10) IN ((11, $3::int), ($1::int, 12)) \bind '1' '2' '3' \g --- -(0 rows) - -SELECT WHERE $1::int IN ($2::int, $3::int) \bind '1' '2' '3' \g --- -(0 rows) - -SELECT WHERE $2::int IN ($3::int, $1::int) \bind '1' '2' '3' \g --- -(0 rows) - -SELECT WHERE $3::int IN ($1::int, $2::int) \bind '1' '2' '3' \g --- -(0 rows) - -SELECT query, calls FROM pg_stat_statements ORDER BY query COLLATE "C"; - query | calls ---------------------------------------------------------------+------- - SELECT WHERE $1::int IN ($2 /*, ... */) | 1 - SELECT WHERE $1::int IN ($2 /*, ... */) | 1 - SELECT WHERE $1::int IN ($2 /*, ... */) | 1 - SELECT WHERE ($1::int, $4) IN (($5, $2::int), ($3::int, $6)) | 1 - SELECT WHERE ($2::int, $4) IN (($5, $3::int), ($1::int, $6)) | 1 - SELECT pg_stat_statements_reset() IS NOT NULL AS t | 1 -(6 rows) - --- Two groups of two queries with the same query ID. -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -SELECT WHERE '1'::int IN ($1::int, '2'::int) \bind '1' \g --- -(1 row) - -SELECT WHERE '4'::int IN ($1::int, '5'::int) \bind '2' \g --- -(0 rows) - -SELECT WHERE $2::int IN ($1::int, '1'::int) \bind '1' '2' \g --- -(0 rows) - -SELECT WHERE $2::int IN ($1::int, '2'::int) \bind '3' '4' \g --- -(0 rows) - -SELECT query, calls FROM pg_stat_statements ORDER BY query COLLATE "C"; - query | calls -----------------------------------------------------+------- - SELECT WHERE $1::int IN ($2 /*, ... */) | 2 - SELECT WHERE $1::int IN ($2 /*, ... */) | 2 - SELECT pg_stat_statements_reset() IS NOT NULL AS t | 1 -(3 rows) - -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - --- no squashable list, the parameters id's are kept as-is -SELECT WHERE $3 = $1 AND $2 = $4 \bind 1 2 1 2 \g --- -(1 row) - --- squashable list, so the parameter IDs will be re-assigned -SELECT WHERE 1 IN (1, 2, 3) AND $3 = $1 AND $2 = $4 \bind 1 2 1 2 \g --- -(1 row) - -SELECT query, calls FROM pg_stat_statements ORDER BY query COLLATE "C"; - query | calls -------------------------------------------------------------+------- - SELECT WHERE $1 IN ($2 /*, ... */) AND $3 = $4 AND $5 = $6 | 1 - SELECT WHERE $3 = $1 AND $2 = $4 | 1 - SELECT pg_stat_statements_reset() IS NOT NULL AS t | 1 -(3 rows) - +psql: error: connection to server on socket "/tmp/pg_regress-pGEVs9/.s.PGSQL.58928" failed: No such file or directory + Is the server running locally and accepting connections on that socket? diff -U3 /tmp/cirrus-ci-build/contrib/pg_stat_statements/expected/parallel.out /tmp/cirrus-ci-build/contrib/pg_stat_statements/results/parallel.out --- /tmp/cirrus-ci-build/contrib/pg_stat_statements/expected/parallel.out 2026-05-12 14:52:22.731058598 +0000 +++ /tmp/cirrus-ci-build/contrib/pg_stat_statements/results/parallel.out 2026-05-12 14:59:46.837869670 +0000 @@ -1,34 +1,2 @@ --- --- Tests for parallel statistics --- -SET pg_stat_statements.track_utility = FALSE; --- encourage use of parallel plans -SET parallel_setup_cost = 0; -SET parallel_tuple_cost = 0; -SET min_parallel_table_scan_size = 0; -SET max_parallel_workers_per_gather = 2; -CREATE TABLE pgss_parallel_tab (a int); -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -SELECT count(*) FROM pgss_parallel_tab; - count -------- - 0 -(1 row) - -SELECT query, - parallel_workers_to_launch > 0 AS has_workers_to_launch, - parallel_workers_launched > 0 AS has_workers_launched - FROM pg_stat_statements - WHERE query ~ 'SELECT count' - ORDER BY query COLLATE "C"; - query | has_workers_to_launch | has_workers_launched -----------------------------------------+-----------------------+---------------------- - SELECT count(*) FROM pgss_parallel_tab | t | t -(1 row) - -DROP TABLE pgss_parallel_tab; +psql: error: connection to server on socket "/tmp/pg_regress-pGEVs9/.s.PGSQL.58928" failed: No such file or directory + Is the server running locally and accepting connections on that socket? diff -U3 /tmp/cirrus-ci-build/contrib/pg_stat_statements/expected/plancache.out /tmp/cirrus-ci-build/contrib/pg_stat_statements/results/plancache.out --- /tmp/cirrus-ci-build/contrib/pg_stat_statements/expected/plancache.out 2026-05-12 14:52:22.731058598 +0000 +++ /tmp/cirrus-ci-build/contrib/pg_stat_statements/results/plancache.out 2026-05-12 14:59:46.885872065 +0000 @@ -1,260 +1,2 @@ --- --- Tests with plan cache --- --- Setup -CREATE OR REPLACE FUNCTION select_one_func(int) RETURNS VOID AS $$ -DECLARE - ret INT; -BEGIN - SELECT $1 INTO ret; -END; -$$ LANGUAGE plpgsql; -CREATE OR REPLACE PROCEDURE select_one_proc(int) AS $$ -DECLARE - ret INT; -BEGIN - SELECT $1 INTO ret; -END; -$$ LANGUAGE plpgsql; --- Prepared statements -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -PREPARE p1 AS SELECT $1 AS a; -SET plan_cache_mode TO force_generic_plan; -EXECUTE p1(1); - a ---- - 1 -(1 row) - -SET plan_cache_mode TO force_custom_plan; -EXECUTE p1(1); - a ---- - 1 -(1 row) - -SELECT calls, generic_plan_calls, custom_plan_calls, query FROM pg_stat_statements - ORDER BY query COLLATE "C"; - calls | generic_plan_calls | custom_plan_calls | query --------+--------------------+-------------------+---------------------------------------------------- - 2 | 1 | 1 | PREPARE p1 AS SELECT $1 AS a - 1 | 0 | 0 | SELECT pg_stat_statements_reset() IS NOT NULL AS t - 2 | 0 | 0 | SET plan_cache_mode TO $1 -(3 rows) - -DEALLOCATE p1; --- Extended query protocol -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -SELECT $1 AS a \parse p1 -SET plan_cache_mode TO force_generic_plan; -\bind_named p1 1 -; - a ---- - 1 -(1 row) - -SET plan_cache_mode TO force_custom_plan; -\bind_named p1 1 -; - a ---- - 1 -(1 row) - -SELECT calls, generic_plan_calls, custom_plan_calls, query FROM pg_stat_statements - ORDER BY query COLLATE "C"; - calls | generic_plan_calls | custom_plan_calls | query --------+--------------------+-------------------+---------------------------------------------------- - 2 | 1 | 1 | SELECT $1 AS a - 1 | 0 | 0 | SELECT pg_stat_statements_reset() IS NOT NULL AS t - 2 | 0 | 0 | SET plan_cache_mode TO $1 -(3 rows) - -\close_prepared p1 --- EXPLAIN [ANALYZE] EXECUTE -SET pg_stat_statements.track = 'all'; -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -PREPARE p1 AS SELECT $1; -SET plan_cache_mode TO force_generic_plan; -EXPLAIN (COSTS OFF) EXECUTE p1(1); - QUERY PLAN ------------- - Result -(1 row) - -EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) EXECUTE p1(1); - QUERY PLAN ------------------------------------ - Result (actual rows=1.00 loops=1) -(1 row) - -SET plan_cache_mode TO force_custom_plan; -EXPLAIN (COSTS OFF) EXECUTE p1(1); - QUERY PLAN ------------- - Result -(1 row) - -EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) EXECUTE p1(1); - QUERY PLAN ------------------------------------ - Result (actual rows=1.00 loops=1) -(1 row) - -SELECT calls, generic_plan_calls, custom_plan_calls, toplevel, query FROM pg_stat_statements - ORDER BY query COLLATE "C"; - calls | generic_plan_calls | custom_plan_calls | toplevel | query --------+--------------------+-------------------+----------+---------------------------------------------------------------------------------- - 2 | 0 | 0 | t | EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) EXECUTE p1(1) - 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_statements_reset() IS NOT NULL AS t - 2 | 0 | 0 | t | SET plan_cache_mode TO $1 -(5 rows) - -RESET pg_stat_statements.track; -DEALLOCATE p1; --- Functions/procedures -SET pg_stat_statements.track = 'all'; -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -SET plan_cache_mode TO force_generic_plan; -SELECT select_one_func(1); - select_one_func ------------------ - -(1 row) - -CALL select_one_proc(1); -SET plan_cache_mode TO force_custom_plan; -SELECT select_one_func(1); - select_one_func ------------------ - -(1 row) - -CALL select_one_proc(1); -SELECT calls, generic_plan_calls, custom_plan_calls, toplevel, query FROM pg_stat_statements - ORDER BY query COLLATE "C"; - calls | generic_plan_calls | custom_plan_calls | toplevel | query --------+--------------------+-------------------+----------+---------------------------------------------------- - 2 | 0 | 0 | t | CALL select_one_proc($1) - 1 | 0 | 0 | t | SELECT pg_stat_statements_reset() IS NOT NULL AS t - 2 | 0 | 0 | t | SELECT select_one_func($1) - 2 | 0 | 0 | t | SET plan_cache_mode TO $1 -(4 rows) - --- --- EXPLAIN [ANALYZE] EXECUTE + functions/procedures --- -SET pg_stat_statements.track = 'all'; -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -SET plan_cache_mode TO force_generic_plan; -EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) SELECT select_one_func(1); - QUERY PLAN ------------------------------------ - Result (actual rows=1.00 loops=1) -(1 row) - -EXPLAIN (COSTS OFF) SELECT select_one_func(1); - QUERY PLAN ------------- - Result -(1 row) - -CALL select_one_proc(1); -SET plan_cache_mode TO force_custom_plan; -EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF, BUFFERS OFF) SELECT select_one_func(1); - QUERY PLAN ------------------------------------ - Result (actual rows=1.00 loops=1) -(1 row) - -EXPLAIN (COSTS OFF) SELECT select_one_func(1); - QUERY PLAN ------------- - Result -(1 row) - -CALL select_one_proc(1); -SELECT calls, generic_plan_calls, custom_plan_calls, toplevel, query FROM pg_stat_statements - 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 | 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 (COSTS OFF) SELECT select_one_func($1) - 1 | 0 | 0 | t | SELECT pg_stat_statements_reset() IS NOT NULL AS t - 2 | 0 | 0 | t | SET plan_cache_mode TO $1 -(6 rows) - -RESET pg_stat_statements.track; --- --- Procedure with internal ROLLBACK and the extended query protocol. --- The PlannedStmt used in pgss_ProcessUtility() is freed by the internal --- ROLLBACK. --- -CREATE OR REPLACE PROCEDURE rollback_proc(a INOUT int) AS $$ -BEGIN - ROLLBACK; -END; -$$ LANGUAGE plpgsql; -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -CALL rollback_proc($1) \parse stmt_rollback -\bind_named stmt_rollback 1 \g - a ---- - 1 -(1 row) - -\bind_named stmt_rollback 2 \g - a ---- - 2 -(1 row) - -SELECT calls, query FROM pg_stat_statements - WHERE query LIKE '%rollback_proc%' - ORDER BY query COLLATE "C"; - calls | query --------+------------------------ - 2 | CALL rollback_proc($1) -(1 row) - -DROP PROCEDURE rollback_proc; --- --- Cleanup --- -DROP FUNCTION select_one_func(int); -DROP PROCEDURE select_one_proc(int); +psql: error: connection to server on socket "/tmp/pg_regress-pGEVs9/.s.PGSQL.58928" failed: No such file or directory + Is the server running locally and accepting connections on that socket? diff -U3 /tmp/cirrus-ci-build/contrib/pg_stat_statements/expected/squashing.out /tmp/cirrus-ci-build/contrib/pg_stat_statements/results/squashing.out --- /tmp/cirrus-ci-build/contrib/pg_stat_statements/expected/squashing.out 2026-05-12 14:52:22.731058598 +0000 +++ /tmp/cirrus-ci-build/contrib/pg_stat_statements/results/squashing.out 2026-05-12 14:59:46.929874261 +0000 @@ -1,919 +1,2 @@ --- --- Const squashing functionality --- --- --- Simple Lists --- -CREATE TABLE test_squash (id int, data int); --- single element will not be squashed -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -SELECT * FROM test_squash WHERE id IN (1); - id | data -----+------ -(0 rows) - -SELECT ARRAY[1]; - array -------- - {1} -(1 row) - -SELECT query, calls FROM pg_stat_statements ORDER BY query COLLATE "C"; - query | calls -----------------------------------------------------+------- - SELECT * FROM test_squash WHERE id IN ($1) | 1 - SELECT ARRAY[$1] | 1 - SELECT pg_stat_statements_reset() IS NOT NULL AS t | 1 -(3 rows) - --- more than 1 element in a list will be squashed -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -SELECT * FROM test_squash WHERE id IN (1, 2, 3); - id | data -----+------ -(0 rows) - -SELECT * FROM test_squash WHERE id IN (1, 2, 3, 4); - id | data -----+------ -(0 rows) - -SELECT * FROM test_squash WHERE id IN (1, 2, 3, 4, 5); - id | data -----+------ -(0 rows) - -SELECT ARRAY[1, 2, 3]; - array ---------- - {1,2,3} -(1 row) - -SELECT ARRAY[1, 2, 3, 4]; - array ------------ - {1,2,3,4} -(1 row) - -SELECT ARRAY[1, 2, 3, 4, 5]; - array -------------- - {1,2,3,4,5} -(1 row) - -SELECT query, calls FROM pg_stat_statements ORDER BY query COLLATE "C"; - query | calls --------------------------------------------------------+------- - SELECT * FROM test_squash WHERE id IN ($1 /*, ... */) | 3 - SELECT ARRAY[$1 /*, ... */] | 3 - SELECT pg_stat_statements_reset() IS NOT NULL AS t | 1 -(3 rows) - --- built-in functions will be squashed --- the IN and ARRAY forms of this statement will have the same queryId -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -SELECT WHERE 1 IN (1, int4(1), int4(2), 2); --- -(1 row) - -SELECT WHERE 1 = ANY (ARRAY[1, int4(1), int4(2), 2]); --- -(1 row) - -SELECT query, calls FROM pg_stat_statements ORDER BY query COLLATE "C"; - query | calls -----------------------------------------------------+------- - SELECT WHERE $1 IN ($2 /*, ... */) | 2 - SELECT pg_stat_statements_reset() IS NOT NULL AS t | 1 -(2 rows) - --- external parameters will be squashed -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -SELECT * FROM test_squash WHERE id IN ($1, $2, $3, $4, $5) \bind 1 2 3 4 5 -; - id | data -----+------ -(0 rows) - -SELECT * FROM test_squash WHERE id::text = ANY(ARRAY[$1, $2, $3, $4, $5]) \bind 1 2 3 4 5 -; - id | data -----+------ -(0 rows) - -SELECT query, calls FROM pg_stat_statements ORDER BY query COLLATE "C"; - query | calls -----------------------------------------------------------------------+------- - SELECT * FROM test_squash WHERE id IN ($1 /*, ... */) | 1 - SELECT * FROM test_squash WHERE id::text = ANY(ARRAY[$1 /*, ... */]) | 1 - SELECT pg_stat_statements_reset() IS NOT NULL AS t | 1 -(3 rows) - --- prepared statements will also be squashed --- the IN and ARRAY forms of this statement will have the same queryId -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -PREPARE p1(int, int, int, int, int) AS -SELECT * FROM test_squash WHERE id IN ($1, $2, $3, $4, $5); -EXECUTE p1(1, 2, 3, 4, 5); - id | data -----+------ -(0 rows) - -DEALLOCATE p1; -PREPARE p1(int, int, int, int, int) AS -SELECT * FROM test_squash WHERE id = ANY(ARRAY[$1, $2, $3, $4, $5]); -EXECUTE p1(1, 2, 3, 4, 5); - id | data -----+------ -(0 rows) - -DEALLOCATE p1; -SELECT query, calls FROM pg_stat_statements ORDER BY query COLLATE "C"; - query | calls --------------------------------------------------------+------- - DEALLOCATE $1 | 2 - PREPARE p1(int, int, int, int, int) AS +| 2 - SELECT * FROM test_squash WHERE id IN ($1 /*, ... */) | - SELECT pg_stat_statements_reset() IS NOT NULL AS t | 1 -(3 rows) - --- More conditions in the query -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -SELECT * FROM test_squash WHERE id IN (1, 2, 3, 4, 5, 6, 7, 8, 9) AND data = 2; - id | data -----+------ -(0 rows) - -SELECT * FROM test_squash WHERE id IN (1, 2, 3, 4, 5, 6, 7, 8, 9, 10) AND data = 2; - id | data -----+------ -(0 rows) - -SELECT * FROM test_squash WHERE id IN (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11) AND data = 2; - id | data -----+------ -(0 rows) - -SELECT * FROM test_squash WHERE id = ANY (ARRAY[1, 2, 3, 4, 5, 6, 7, 8, 9]) AND data = 2; - id | data -----+------ -(0 rows) - -SELECT * FROM test_squash WHERE id = ANY (ARRAY[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) AND data = 2; - id | data -----+------ -(0 rows) - -SELECT * FROM test_squash WHERE id = ANY (ARRAY[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]) AND data = 2; - id | data -----+------ -(0 rows) - -SELECT query, calls FROM pg_stat_statements ORDER BY query COLLATE "C"; - query | calls ----------------------------------------------------------------------+------- - SELECT * FROM test_squash WHERE id IN ($1 /*, ... */) AND data = $2 | 6 - SELECT pg_stat_statements_reset() IS NOT NULL AS t | 1 -(2 rows) - --- Multiple squashed intervals -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -SELECT * FROM test_squash WHERE id IN (1, 2, 3, 4, 5, 6, 7, 8, 9) - AND data IN (1, 2, 3, 4, 5, 6, 7, 8, 9); - id | data -----+------ -(0 rows) - -SELECT * FROM test_squash WHERE id IN (1, 2, 3, 4, 5, 6, 7, 8, 9, 10) - AND data IN (1, 2, 3, 4, 5, 6, 7, 8, 9, 10); - id | data -----+------ -(0 rows) - -SELECT * FROM test_squash WHERE id IN (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11) - AND data IN (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11); - id | data -----+------ -(0 rows) - -SELECT * FROM test_squash WHERE id = ANY (ARRAY[1, 2, 3, 4, 5, 6, 7, 8, 9]) - AND data = ANY (ARRAY[1, 2, 3, 4, 5, 6, 7, 8, 9]); - id | data -----+------ -(0 rows) - -SELECT * FROM test_squash WHERE id = ANY (ARRAY[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) - AND data = ANY (ARRAY[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); - id | data -----+------ -(0 rows) - -SELECT * FROM test_squash WHERE id = ANY (ARRAY[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]) - AND data = ANY (ARRAY[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]); - id | data -----+------ -(0 rows) - -SELECT query, calls FROM pg_stat_statements ORDER BY query COLLATE "C"; - query | calls --------------------------------------------------------+------- - SELECT * FROM test_squash WHERE id IN ($1 /*, ... */)+| 6 - AND data IN ($2 /*, ... */) | - SELECT pg_stat_statements_reset() IS NOT NULL AS t | 1 -(2 rows) - -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - --- No constants squashing for OpExpr --- The IN and ARRAY forms of this statement will have the same queryId -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -SELECT * FROM test_squash WHERE id IN - (1 + 1, 2 + 2, 3 + 3, 4 + 4, 5 + 5, 6 + 6, 7 + 7, 8 + 8, 9 + 9); - id | data -----+------ -(0 rows) - -SELECT * FROM test_squash WHERE id IN - (@ '-1', @ '-2', @ '-3', @ '-4', @ '-5', @ '-6', @ '-7', @ '-8', @ '-9'); - id | data -----+------ -(0 rows) - -SELECT * FROM test_squash WHERE id = ANY(ARRAY - [1 + 1, 2 + 2, 3 + 3, 4 + 4, 5 + 5, 6 + 6, 7 + 7, 8 + 8, 9 + 9]); - id | data -----+------ -(0 rows) - -SELECT * FROM test_squash WHERE id = ANY(ARRAY - [@ '-1', @ '-2', @ '-3', @ '-4', @ '-5', @ '-6', @ '-7', @ '-8', @ '-9']); - id | data -----+------ -(0 rows) - -SELECT query, calls FROM pg_stat_statements ORDER BY query COLLATE "C"; - query | calls -----------------------------------------------------------------------------------------------------+------- - SELECT * FROM test_squash WHERE id IN +| 2 - ($1 + $2, $3 + $4, $5 + $6, $7 + $8, $9 + $10, $11 + $12, $13 + $14, $15 + $16, $17 + $18) | - SELECT * FROM test_squash WHERE id IN +| 2 - (@ $1, @ $2, @ $3, @ $4, @ $5, @ $6, @ $7, @ $8, @ $9) | - SELECT pg_stat_statements_reset() IS NOT NULL AS t | 1 -(3 rows) - --- --- FuncExpr --- --- Verify multiple type representation end up with the same query_id -CREATE TABLE test_float (data float); --- The casted ARRAY expressions will have the same queryId as the IN clause --- form of the query -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -SELECT data FROM test_float WHERE data IN (1, 2); - data ------- -(0 rows) - -SELECT data FROM test_float WHERE data IN (1, '2'); - data ------- -(0 rows) - -SELECT data FROM test_float WHERE data IN ('1', 2); - data ------- -(0 rows) - -SELECT data FROM test_float WHERE data IN ('1', '2'); - data ------- -(0 rows) - -SELECT data FROM test_float WHERE data IN (1.0, 1.0); - data ------- -(0 rows) - -SELECT data FROM test_float WHERE data = ANY(ARRAY['1'::double precision, '2'::double precision]); - data ------- -(0 rows) - -SELECT data FROM test_float WHERE data = ANY(ARRAY[1.0::double precision, 1.0::double precision]); - data ------- -(0 rows) - -SELECT data FROM test_float WHERE data = ANY(ARRAY[1, 2]); - data ------- -(0 rows) - -SELECT data FROM test_float WHERE data = ANY(ARRAY[1, '2']); - data ------- -(0 rows) - -SELECT data FROM test_float WHERE data = ANY(ARRAY['1', 2]); - data ------- -(0 rows) - -SELECT query, calls FROM pg_stat_statements ORDER BY query COLLATE "C"; - query | calls ---------------------------------------------------------------------+------- - SELECT data FROM test_float WHERE data = ANY(ARRAY[$1 /*, ... */]) | 3 - SELECT data FROM test_float WHERE data IN ($1 /*, ... */) | 7 - SELECT pg_stat_statements_reset() IS NOT NULL AS t | 1 -(3 rows) - --- Numeric type, implicit cast is squashed -CREATE TABLE test_squash_numeric (id int, data numeric(5, 2)); -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -SELECT * FROM test_squash_numeric WHERE data IN (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11); - id | data -----+------ -(0 rows) - -SELECT * FROM test_squash_numeric WHERE data = ANY(ARRAY[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]); - id | data -----+------ -(0 rows) - -SELECT query, calls FROM pg_stat_statements ORDER BY query COLLATE "C"; - query | calls ---------------------------------------------------------------------------+------- - SELECT * FROM test_squash_numeric WHERE data = ANY(ARRAY[$1 /*, ... */]) | 1 - SELECT * FROM test_squash_numeric WHERE data IN ($1 /*, ... */) | 1 - SELECT pg_stat_statements_reset() IS NOT NULL AS t | 1 -(3 rows) - --- Bigint, implicit cast is squashed -CREATE TABLE test_squash_bigint (id int, data bigint); -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -SELECT * FROM test_squash_bigint WHERE data IN (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11); - id | data -----+------ -(0 rows) - -SELECT * FROM test_squash_bigint WHERE data = ANY(ARRAY[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]); - id | data -----+------ -(0 rows) - -SELECT query, calls FROM pg_stat_statements ORDER BY query COLLATE "C"; - query | calls --------------------------------------------------------------------------+------- - SELECT * FROM test_squash_bigint WHERE data = ANY(ARRAY[$1 /*, ... */]) | 1 - SELECT * FROM test_squash_bigint WHERE data IN ($1 /*, ... */) | 1 - SELECT pg_stat_statements_reset() IS NOT NULL AS t | 1 -(3 rows) - --- Bigint, explicit cast is squashed -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -SELECT * FROM test_squash_bigint WHERE data IN - (1::bigint, 2::bigint, 3::bigint, 4::bigint, 5::bigint, 6::bigint, - 7::bigint, 8::bigint, 9::bigint, 10::bigint, 11::bigint); - id | data -----+------ -(0 rows) - -SELECT * FROM test_squash_bigint WHERE data = ANY(ARRAY[ - 1::bigint, 2::bigint, 3::bigint, 4::bigint, 5::bigint, 6::bigint, - 7::bigint, 8::bigint, 9::bigint, 10::bigint, 11::bigint]); - id | data -----+------ -(0 rows) - -SELECT query, calls FROM pg_stat_statements ORDER BY query COLLATE "C"; - query | calls -----------------------------------------------------+------- - SELECT * FROM test_squash_bigint WHERE data IN +| 2 - ($1 /*, ... */) | - SELECT pg_stat_statements_reset() IS NOT NULL AS t | 1 -(2 rows) - --- Bigint, long tokens with parenthesis, will not squash -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -SELECT * FROM test_squash_bigint WHERE id IN - (abs(100), abs(200), abs(300), abs(400), abs(500), abs(600), abs(700), - abs(800), abs(900), abs(1000), ((abs(1100)))); - id | data -----+------ -(0 rows) - -SELECT * FROM test_squash_bigint WHERE id = ANY(ARRAY[ - abs(100), abs(200), abs(300), abs(400), abs(500), abs(600), abs(700), - abs(800), abs(900), abs(1000), ((abs(1100)))]); - id | data -----+------ -(0 rows) - -SELECT query, calls FROM pg_stat_statements ORDER BY query COLLATE "C"; - query | calls --------------------------------------------------------------------------+------- - SELECT * FROM test_squash_bigint WHERE id IN +| 2 - (abs($1), abs($2), abs($3), abs($4), abs($5), abs($6), abs($7),+| - abs($8), abs($9), abs($10), ((abs($11)))) | - SELECT pg_stat_statements_reset() IS NOT NULL AS t | 1 -(2 rows) - --- Multiple FuncExpr's. Will not squash -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -SELECT WHERE 1 IN (1::int::bigint::int, 2::int::bigint::int); --- -(1 row) - -SELECT WHERE 1 = ANY(ARRAY[1::int::bigint::int, 2::int::bigint::int]); --- -(1 row) - -SELECT query, calls FROM pg_stat_statements ORDER BY query COLLATE "C"; - query | calls -----------------------------------------------------+------- - SELECT WHERE $1 IN ($2 /*, ... */) | 2 - SELECT pg_stat_statements_reset() IS NOT NULL AS t | 1 -(2 rows) - --- --- CoerceViaIO --- --- Create some dummy type to force CoerceViaIO -CREATE TYPE casttesttype; -CREATE FUNCTION casttesttype_in(cstring) - RETURNS casttesttype - AS 'textin' - LANGUAGE internal STRICT IMMUTABLE; -NOTICE: return type casttesttype is only a shell -CREATE FUNCTION casttesttype_out(casttesttype) - RETURNS cstring - AS 'textout' - LANGUAGE internal STRICT IMMUTABLE; -NOTICE: argument type casttesttype is only a shell -LINE 1: CREATE FUNCTION casttesttype_out(casttesttype) - ^ -CREATE TYPE casttesttype ( - internallength = variable, - input = casttesttype_in, - output = casttesttype_out, - alignment = int4 -); -CREATE CAST (int4 AS casttesttype) WITH INOUT; -CREATE FUNCTION casttesttype_eq(casttesttype, casttesttype) -returns boolean language sql immutable as $$ - SELECT true -$$; -CREATE OPERATOR = ( - leftarg = casttesttype, - rightarg = casttesttype, - procedure = casttesttype_eq, - commutator = =); -CREATE TABLE test_squash_cast (id int, data casttesttype); --- Use the introduced type to construct a list of CoerceViaIO around Const -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -SELECT * FROM test_squash_cast WHERE data IN - (1::int4::casttesttype, 2::int4::casttesttype, 3::int4::casttesttype, - 4::int4::casttesttype, 5::int4::casttesttype, 6::int4::casttesttype, - 7::int4::casttesttype, 8::int4::casttesttype, 9::int4::casttesttype, - 10::int4::casttesttype, 11::int4::casttesttype); - id | data -----+------ -(0 rows) - -SELECT * FROM test_squash_cast WHERE data = ANY (ARRAY - [1::int4::casttesttype, 2::int4::casttesttype, 3::int4::casttesttype, - 4::int4::casttesttype, 5::int4::casttesttype, 6::int4::casttesttype, - 7::int4::casttesttype, 8::int4::casttesttype, 9::int4::casttesttype, - 10::int4::casttesttype, 11::int4::casttesttype]); - id | data -----+------ -(0 rows) - -SELECT query, calls FROM pg_stat_statements ORDER BY query COLLATE "C"; - query | calls -----------------------------------------------------+------- - SELECT * FROM test_squash_cast WHERE data IN +| 2 - ($1 /*, ... */) | - SELECT pg_stat_statements_reset() IS NOT NULL AS t | 1 -(2 rows) - --- Some casting expression are simplified to Const -CREATE TABLE test_squash_jsonb (id int, data jsonb); -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -SELECT * FROM test_squash_jsonb WHERE data IN - (('"1"')::jsonb, ('"2"')::jsonb, ('"3"')::jsonb, ('"4"')::jsonb, - ('"5"')::jsonb, ('"6"')::jsonb, ('"7"')::jsonb, ('"8"')::jsonb, - ('"9"')::jsonb, ('"10"')::jsonb); - id | data -----+------ -(0 rows) - -SELECT * FROM test_squash_jsonb WHERE data = ANY (ARRAY - [('"1"')::jsonb, ('"2"')::jsonb, ('"3"')::jsonb, ('"4"')::jsonb, - ('"5"')::jsonb, ('"6"')::jsonb, ('"7"')::jsonb, ('"8"')::jsonb, - ('"9"')::jsonb, ('"10"')::jsonb]); - id | data -----+------ -(0 rows) - -SELECT query, calls FROM pg_stat_statements ORDER BY query COLLATE "C"; - query | calls -----------------------------------------------------+------- - SELECT * FROM test_squash_jsonb WHERE data IN +| 2 - ($1 /*, ... */) | - SELECT pg_stat_statements_reset() IS NOT NULL AS t | 1 -(2 rows) - --- CoerceViaIO, SubLink instead of a Const. Will not squash -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -SELECT * FROM test_squash_jsonb WHERE data IN - ((SELECT '"1"')::jsonb, (SELECT '"2"')::jsonb, (SELECT '"3"')::jsonb, - (SELECT '"4"')::jsonb, (SELECT '"5"')::jsonb, (SELECT '"6"')::jsonb, - (SELECT '"7"')::jsonb, (SELECT '"8"')::jsonb, (SELECT '"9"')::jsonb, - (SELECT '"10"')::jsonb); - id | data -----+------ -(0 rows) - -SELECT * FROM test_squash_jsonb WHERE data = ANY(ARRAY - [(SELECT '"1"')::jsonb, (SELECT '"2"')::jsonb, (SELECT '"3"')::jsonb, - (SELECT '"4"')::jsonb, (SELECT '"5"')::jsonb, (SELECT '"6"')::jsonb, - (SELECT '"7"')::jsonb, (SELECT '"8"')::jsonb, (SELECT '"9"')::jsonb, - (SELECT '"10"')::jsonb]); - id | data -----+------ -(0 rows) - -SELECT query, calls FROM pg_stat_statements ORDER BY query COLLATE "C"; - query | calls -----------------------------------------------------------------------+------- - SELECT * FROM test_squash_jsonb WHERE data IN +| 2 - ((SELECT $1)::jsonb, (SELECT $2)::jsonb, (SELECT $3)::jsonb,+| - (SELECT $4)::jsonb, (SELECT $5)::jsonb, (SELECT $6)::jsonb,+| - (SELECT $7)::jsonb, (SELECT $8)::jsonb, (SELECT $9)::jsonb,+| - (SELECT $10)::jsonb) | - SELECT pg_stat_statements_reset() IS NOT NULL AS t | 1 -(2 rows) - --- Multiple CoerceViaIO are squashed -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -SELECT WHERE 1 IN (1::text::int::text::int, 1::text::int::text::int); --- -(1 row) - -SELECT WHERE 1 = ANY(ARRAY[1::text::int::text::int, 1::text::int::text::int]); --- -(1 row) - -SELECT query, calls FROM pg_stat_statements ORDER BY query COLLATE "C"; - query | calls -----------------------------------------------------+------- - SELECT WHERE $1 IN ($2 /*, ... */) | 2 - SELECT pg_stat_statements_reset() IS NOT NULL AS t | 1 -(2 rows) - --- --- RelabelType --- -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - --- However many layers of RelabelType there are, the list will be squashable. -SELECT * FROM test_squash WHERE id IN - (1::oid, 2::oid, 3::oid, 4::oid, 5::oid, 6::oid, 7::oid, 8::oid, 9::oid); - id | data -----+------ -(0 rows) - -SELECT ARRAY[1::oid, 2::oid, 3::oid, 4::oid, 5::oid, 6::oid, 7::oid, 8::oid, 9::oid]; - array ---------------------- - {1,2,3,4,5,6,7,8,9} -(1 row) - -SELECT * FROM test_squash WHERE id IN (1::oid, 2::oid::int::oid); - id | data -----+------ -(0 rows) - -SELECT * FROM test_squash WHERE id = ANY(ARRAY[1::oid, 2::oid::int::oid]); - id | data -----+------ -(0 rows) - --- RelabelType together with CoerceViaIO is also squashable -SELECT * FROM test_squash WHERE id = ANY(ARRAY[1::oid::text::int::oid, 2::oid::int::oid]); - id | data -----+------ -(0 rows) - -SELECT * FROM test_squash WHERE id = ANY(ARRAY[1::text::int::oid, 2::oid::int::oid]); - id | data -----+------ -(0 rows) - -SELECT query, calls FROM pg_stat_statements ORDER BY query COLLATE "C"; - query | calls -----------------------------------------------------+------- - SELECT * FROM test_squash WHERE id IN +| 5 - ($1 /*, ... */) | - SELECT ARRAY[$1 /*, ... */] | 1 - SELECT pg_stat_statements_reset() IS NOT NULL AS t | 1 -(3 rows) - --- --- edge cases --- -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - --- for nested arrays, only constants are squashed -SELECT ARRAY[ - ARRAY[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], - ARRAY[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], - ARRAY[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], - ARRAY[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] - ]; - array ------------------------------------------------------------------------------------------------ - {{1,2,3,4,5,6,7,8,9,10},{1,2,3,4,5,6,7,8,9,10},{1,2,3,4,5,6,7,8,9,10},{1,2,3,4,5,6,7,8,9,10}} -(1 row) - -SELECT query, calls FROM pg_stat_statements ORDER BY query COLLATE "C"; - query | calls -----------------------------------------------------+------- - SELECT ARRAY[ +| 1 - ARRAY[$1 /*, ... */], +| - ARRAY[$2 /*, ... */], +| - ARRAY[$3 /*, ... */], +| - ARRAY[$4 /*, ... */] +| - ] | - SELECT pg_stat_statements_reset() IS NOT NULL AS t | 1 -(2 rows) - --- Test constants evaluation in a CTE, which was causing issues in the past -WITH cte AS ( - SELECT 'const' as const FROM test_squash -) -SELECT ARRAY['a', 'b', 'c', const::varchar] AS result -FROM cte; - result --------- -(0 rows) - -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - --- Rewritten as an OpExpr, so it will not be squashed -select where '1' IN ('1'::int, '2'::int::text); --- -(1 row) - --- Rewritten as an ArrayExpr, so it will be squashed -select where '1' IN ('1'::int, '2'::int); --- -(1 row) - -SELECT query, calls FROM pg_stat_statements ORDER BY query COLLATE "C"; - query | calls -----------------------------------------------------+------- - SELECT pg_stat_statements_reset() IS NOT NULL AS t | 1 - select where $1 IN ($2 /*, ... */) | 1 - select where $1 IN ($2::int, $3::int::text) | 1 -(3 rows) - -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - --- Both of these queries will be rewritten as an ArrayExpr, so they --- will be squashed, and have a similar queryId -select where '1' IN ('1'::int::text, '2'::int::text); --- -(1 row) - -select where '1' = ANY (array['1'::int::text, '2'::int::text]); --- -(1 row) - -SELECT query, calls FROM pg_stat_statements ORDER BY query COLLATE "C"; - query | calls -----------------------------------------------------+------- - SELECT pg_stat_statements_reset() IS NOT NULL AS t | 1 - select where $1 IN ($2 /*, ... */) | 2 -(2 rows) - --- composite function with row expansion -create table test_composite(x integer); -CREATE FUNCTION composite_f(a integer[], out x integer, out y integer) returns -record as $$ begin - x = a[1]; - y = a[2]; - end; -$$ language plpgsql; -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - -SELECT ((composite_f(array[1, 2]))).* FROM test_composite; - x | y ----+--- -(0 rows) - -SELECT ((composite_f(array[1, 2, 3]))).* FROM test_composite; - x | y ----+--- -(0 rows) - -SELECT ((composite_f(array[1, 2, 3]))).*, 1, 2, 3, ((composite_f(array[1, 2, 3]))).*, 1, 2 -FROM test_composite -WHERE x IN (1, 2, 3); - x | y | ?column? | ?column? | ?column? | x | y | ?column? | ?column? ----+---+----------+----------+----------+---+---+----------+---------- -(0 rows) - -SELECT ((composite_f(array[1, $1, 3]))).*, 1 FROM test_composite \bind 1 -; - x | y | ?column? ----+---+---------- -(0 rows) - --- ROW() expression with row expansion -SELECT (ROW(ARRAY[1,2])).*; - f1 -------- - {1,2} -(1 row) - -SELECT (ROW(ARRAY[1, 2], ARRAY[1, 2, 3])).*; - f1 | f2 --------+--------- - {1,2} | {1,2,3} -(1 row) - -SELECT 1, 2, (ROW(ARRAY[1, 2], ARRAY[1, 2, 3])).*, 3, 4; - ?column? | ?column? | f1 | f2 | ?column? | ?column? -----------+----------+-------+---------+----------+---------- - 1 | 2 | {1,2} | {1,2,3} | 3 | 4 -(1 row) - -SELECT (ROW(ARRAY[1, 2], ARRAY[1, $1, 3])).*, 1 \bind 1 -; - f1 | f2 | ?column? --------+---------+---------- - {1,2} | {1,1,3} | 1 -(1 row) - --- IN and ANY clauses with Vars are not squashed. -SELECT * FROM test_squash a, test_squash b WHERE a.id IN (1, 2, 3, b.id, b.id + 1); - id | data | id | data -----+------+----+------ -(0 rows) - -SELECT * FROM test_squash a, test_squash b WHERE a.id = ANY (array[1, ((b.id + b.id * 2)), 5]); - id | data | id | data -----+------+----+------ -(0 rows) - -SELECT * FROM test_squash a, test_squash b WHERE a.id IN ($1, $2, $3, b.id, b.id + $4) \bind 1 2 3 1 -; - id | data | id | data -----+------+----+------ -(0 rows) - -SELECT query, calls FROM pg_stat_statements ORDER BY query COLLATE "C"; - query | calls --------------------------------------------------------------------------------------------------------------+------- - SELECT $1, $2, (ROW(ARRAY[$3 /*, ... */], ARRAY[$4 /*, ... */])).*, $5, $6 | 1 - SELECT ((composite_f(array[$1 /*, ... */]))).* FROM test_composite | 2 - SELECT ((composite_f(array[$1 /*, ... */]))).*, $2 FROM test_composite | 1 - SELECT ((composite_f(array[$1 /*, ... */]))).*, $2, $3, $4, ((composite_f(array[$5 /*, ... */]))).*, $6, $7+| 1 - FROM test_composite +| - WHERE x IN ($8 /*, ... */) | - SELECT (ROW(ARRAY[$1 /*, ... */])).* | 1 - SELECT (ROW(ARRAY[$1 /*, ... */], ARRAY[$2 /*, ... */])).* | 1 - SELECT (ROW(ARRAY[$1 /*, ... */], ARRAY[$2 /*, ... */])).*, $3 | 1 - SELECT * FROM test_squash a, test_squash b WHERE a.id = ANY (array[$1, ((b.id + b.id * $2)), $3]) | 1 - SELECT * FROM test_squash a, test_squash b WHERE a.id IN ($1, $2, $3, b.id, b.id + $4) | 1 - SELECT * FROM test_squash a, test_squash b WHERE a.id IN ($1, $2, $3, b.id, b.id + $4) | 1 - SELECT pg_stat_statements_reset() IS NOT NULL AS t | 1 -(11 rows) - --- --- cleanup --- -DROP TABLE test_squash; -DROP TABLE test_float; -DROP TABLE test_squash_numeric; -DROP TABLE test_squash_bigint; -DROP TABLE test_squash_cast CASCADE; -DROP TABLE test_squash_jsonb; -DROP TABLE test_composite; -DROP FUNCTION composite_f; +psql: error: connection to server on socket "/tmp/pg_regress-pGEVs9/.s.PGSQL.58928" failed: No such file or directory + Is the server running locally and accepting connections on that socket? diff -U3 /tmp/cirrus-ci-build/contrib/pg_stat_statements/expected/cleanup.out /tmp/cirrus-ci-build/contrib/pg_stat_statements/results/cleanup.out --- /tmp/cirrus-ci-build/contrib/pg_stat_statements/expected/cleanup.out 2026-05-12 14:52:22.731058598 +0000 +++ /tmp/cirrus-ci-build/contrib/pg_stat_statements/results/cleanup.out 2026-05-12 14:59:46.985877057 +0000 @@ -1 +1,2 @@ -DROP EXTENSION pg_stat_statements; +psql: error: connection to server on socket "/tmp/pg_regress-pGEVs9/.s.PGSQL.58928" failed: No such file or directory + Is the server running locally and accepting connections on that socket? diff -U3 /tmp/cirrus-ci-build/contrib/pg_stat_statements/expected/oldextversions.out /tmp/cirrus-ci-build/contrib/pg_stat_statements/results/oldextversions.out --- /tmp/cirrus-ci-build/contrib/pg_stat_statements/expected/oldextversions.out 2026-05-12 14:52:22.731058598 +0000 +++ /tmp/cirrus-ci-build/contrib/pg_stat_statements/results/oldextversions.out 2026-05-12 14:59:47.049880255 +0000 @@ -1,477 +1,2 @@ --- test old extension version entry points -CREATE EXTENSION pg_stat_statements WITH VERSION '1.4'; --- Execution of pg_stat_statements_reset() is granted only to --- superusers in 1.4, so this fails. -SET SESSION AUTHORIZATION pg_read_all_stats; -SELECT pg_stat_statements_reset(); -ERROR: permission denied for function pg_stat_statements_reset -RESET SESSION AUTHORIZATION; -AlTER EXTENSION pg_stat_statements UPDATE TO '1.5'; --- Execution of pg_stat_statements_reset() should be granted to --- pg_read_all_stats now, so this works. -SET SESSION AUTHORIZATION pg_read_all_stats; -SELECT pg_stat_statements_reset(); - pg_stat_statements_reset --------------------------- - -(1 row) - -RESET SESSION AUTHORIZATION; --- In 1.6, it got restricted back to superusers. -AlTER EXTENSION pg_stat_statements UPDATE TO '1.6'; -SET SESSION AUTHORIZATION pg_read_all_stats; -SELECT pg_stat_statements_reset(); -ERROR: permission denied for function pg_stat_statements_reset -RESET SESSION AUTHORIZATION; -SELECT pg_get_functiondef('pg_stat_statements_reset'::regproc); - pg_get_functiondef -------------------------------------------------------------------------------- - CREATE OR REPLACE FUNCTION public.pg_stat_statements_reset() + - RETURNS void + - LANGUAGE c + - PARALLEL SAFE + - AS '$libdir/pg_stat_statements', $function$pg_stat_statements_reset$function$+ - -(1 row) - --- New function for pg_stat_statements_reset introduced, still --- restricted for non-superusers. -AlTER EXTENSION pg_stat_statements UPDATE TO '1.7'; -SET SESSION AUTHORIZATION pg_read_all_stats; -SELECT pg_stat_statements_reset(); -ERROR: permission denied for function pg_stat_statements_reset -RESET SESSION AUTHORIZATION; -SELECT pg_get_functiondef('pg_stat_statements_reset'::regproc); - pg_get_functiondef --------------------------------------------------------------------------------------------------------------------------------- - CREATE OR REPLACE FUNCTION public.pg_stat_statements_reset(userid oid DEFAULT 0, dbid oid DEFAULT 0, queryid bigint DEFAULT 0)+ - RETURNS void + - LANGUAGE c + - PARALLEL SAFE STRICT + - AS '$libdir/pg_stat_statements', $function$pg_stat_statements_reset_1_7$function$ + - -(1 row) - -SELECT pg_stat_statements_reset(); - pg_stat_statements_reset --------------------------- - -(1 row) - -\d pg_stat_statements - View "public.pg_stat_statements" - Column | Type | Collation | Nullable | Default ----------------------+------------------+-----------+----------+--------- - userid | oid | | | - dbid | oid | | | - queryid | bigint | | | - query | text | | | - calls | bigint | | | - total_time | double precision | | | - min_time | double precision | | | - max_time | double precision | | | - mean_time | double precision | | | - stddev_time | double precision | | | - rows | bigint | | | - shared_blks_hit | bigint | | | - shared_blks_read | bigint | | | - shared_blks_dirtied | bigint | | | - shared_blks_written | bigint | | | - local_blks_hit | bigint | | | - local_blks_read | bigint | | | - local_blks_dirtied | bigint | | | - local_blks_written | bigint | | | - temp_blks_read | bigint | | | - temp_blks_written | bigint | | | - blk_read_time | double precision | | | - blk_write_time | double precision | | | - -SELECT count(*) > 0 AS has_data FROM pg_stat_statements; - has_data ----------- - t -(1 row) - --- New functions and views for pg_stat_statements in 1.8 -AlTER EXTENSION pg_stat_statements UPDATE TO '1.8'; -SELECT pg_get_functiondef('pg_stat_statements_reset'::regproc); - pg_get_functiondef --------------------------------------------------------------------------------------------------------------------------------- - CREATE OR REPLACE FUNCTION public.pg_stat_statements_reset(userid oid DEFAULT 0, dbid oid DEFAULT 0, queryid bigint DEFAULT 0)+ - RETURNS void + - LANGUAGE c + - PARALLEL SAFE STRICT + - AS '$libdir/pg_stat_statements', $function$pg_stat_statements_reset_1_7$function$ + - -(1 row) - -\d pg_stat_statements - View "public.pg_stat_statements" - Column | Type | Collation | Nullable | Default ----------------------+------------------+-----------+----------+--------- - userid | oid | | | - dbid | oid | | | - queryid | bigint | | | - query | text | | | - plans | bigint | | | - total_plan_time | double precision | | | - min_plan_time | double precision | | | - max_plan_time | double precision | | | - mean_plan_time | double precision | | | - stddev_plan_time | double precision | | | - calls | bigint | | | - total_exec_time | double precision | | | - min_exec_time | double precision | | | - max_exec_time | double precision | | | - mean_exec_time | double precision | | | - stddev_exec_time | double precision | | | - rows | bigint | | | - shared_blks_hit | bigint | | | - shared_blks_read | bigint | | | - shared_blks_dirtied | bigint | | | - shared_blks_written | bigint | | | - local_blks_hit | bigint | | | - local_blks_read | bigint | | | - local_blks_dirtied | bigint | | | - local_blks_written | bigint | | | - temp_blks_read | bigint | | | - temp_blks_written | bigint | | | - blk_read_time | double precision | | | - blk_write_time | double precision | | | - wal_records | bigint | | | - wal_fpi | bigint | | | - wal_bytes | numeric | | | - -SELECT count(*) > 0 AS has_data FROM pg_stat_statements; - has_data ----------- - t -(1 row) - --- New function pg_stat_statement_info, and new function --- and view for pg_stat_statements introduced in 1.9 -AlTER EXTENSION pg_stat_statements UPDATE TO '1.9'; -SELECT pg_get_functiondef('pg_stat_statements_info'::regproc); - pg_get_functiondef -------------------------------------------------------------------------------------------------------------------------- - CREATE OR REPLACE FUNCTION public.pg_stat_statements_info(OUT dealloc bigint, OUT stats_reset timestamp with time zone)+ - RETURNS record + - LANGUAGE c + - PARALLEL SAFE STRICT + - AS '$libdir/pg_stat_statements', $function$pg_stat_statements_info$function$ + - -(1 row) - -\d pg_stat_statements - View "public.pg_stat_statements" - Column | Type | Collation | Nullable | Default ----------------------+------------------+-----------+----------+--------- - userid | oid | | | - dbid | oid | | | - toplevel | boolean | | | - queryid | bigint | | | - query | text | | | - plans | bigint | | | - total_plan_time | double precision | | | - min_plan_time | double precision | | | - max_plan_time | double precision | | | - mean_plan_time | double precision | | | - stddev_plan_time | double precision | | | - calls | bigint | | | - total_exec_time | double precision | | | - min_exec_time | double precision | | | - max_exec_time | double precision | | | - mean_exec_time | double precision | | | - stddev_exec_time | double precision | | | - rows | bigint | | | - shared_blks_hit | bigint | | | - shared_blks_read | bigint | | | - shared_blks_dirtied | bigint | | | - shared_blks_written | bigint | | | - local_blks_hit | bigint | | | - local_blks_read | bigint | | | - local_blks_dirtied | bigint | | | - local_blks_written | bigint | | | - temp_blks_read | bigint | | | - temp_blks_written | bigint | | | - blk_read_time | double precision | | | - blk_write_time | double precision | | | - wal_records | bigint | | | - wal_fpi | bigint | | | - wal_bytes | numeric | | | - -SELECT count(*) > 0 AS has_data FROM pg_stat_statements; - has_data ----------- - t -(1 row) - --- New functions and views for pg_stat_statements in 1.10 -AlTER EXTENSION pg_stat_statements UPDATE TO '1.10'; -\d pg_stat_statements - View "public.pg_stat_statements" - Column | Type | Collation | Nullable | Default -------------------------+------------------+-----------+----------+--------- - userid | oid | | | - dbid | oid | | | - toplevel | boolean | | | - queryid | bigint | | | - query | text | | | - plans | bigint | | | - total_plan_time | double precision | | | - min_plan_time | double precision | | | - max_plan_time | double precision | | | - mean_plan_time | double precision | | | - stddev_plan_time | double precision | | | - calls | bigint | | | - total_exec_time | double precision | | | - min_exec_time | double precision | | | - max_exec_time | double precision | | | - mean_exec_time | double precision | | | - stddev_exec_time | double precision | | | - rows | bigint | | | - shared_blks_hit | bigint | | | - shared_blks_read | bigint | | | - shared_blks_dirtied | bigint | | | - shared_blks_written | bigint | | | - local_blks_hit | bigint | | | - local_blks_read | bigint | | | - local_blks_dirtied | bigint | | | - local_blks_written | bigint | | | - temp_blks_read | bigint | | | - temp_blks_written | bigint | | | - blk_read_time | double precision | | | - blk_write_time | double precision | | | - temp_blk_read_time | double precision | | | - temp_blk_write_time | double precision | | | - wal_records | bigint | | | - wal_fpi | bigint | | | - wal_bytes | numeric | | | - jit_functions | bigint | | | - jit_generation_time | double precision | | | - jit_inlining_count | bigint | | | - jit_inlining_time | double precision | | | - jit_optimization_count | bigint | | | - jit_optimization_time | double precision | | | - jit_emission_count | bigint | | | - jit_emission_time | double precision | | | - -SELECT count(*) > 0 AS has_data FROM pg_stat_statements; - has_data ----------- - t -(1 row) - --- New functions and views for pg_stat_statements in 1.11 -AlTER EXTENSION pg_stat_statements UPDATE TO '1.11'; -\d pg_stat_statements - View "public.pg_stat_statements" - Column | Type | Collation | Nullable | Default -------------------------+--------------------------+-----------+----------+--------- - userid | oid | | | - dbid | oid | | | - toplevel | boolean | | | - queryid | bigint | | | - query | text | | | - plans | bigint | | | - total_plan_time | double precision | | | - min_plan_time | double precision | | | - max_plan_time | double precision | | | - mean_plan_time | double precision | | | - stddev_plan_time | double precision | | | - calls | bigint | | | - total_exec_time | double precision | | | - min_exec_time | double precision | | | - max_exec_time | double precision | | | - mean_exec_time | double precision | | | - stddev_exec_time | double precision | | | - rows | bigint | | | - shared_blks_hit | bigint | | | - shared_blks_read | bigint | | | - shared_blks_dirtied | bigint | | | - shared_blks_written | bigint | | | - local_blks_hit | bigint | | | - local_blks_read | bigint | | | - local_blks_dirtied | bigint | | | - local_blks_written | bigint | | | - temp_blks_read | bigint | | | - temp_blks_written | bigint | | | - shared_blk_read_time | double precision | | | - shared_blk_write_time | double precision | | | - local_blk_read_time | double precision | | | - local_blk_write_time | double precision | | | - temp_blk_read_time | double precision | | | - temp_blk_write_time | double precision | | | - wal_records | bigint | | | - wal_fpi | bigint | | | - wal_bytes | numeric | | | - jit_functions | bigint | | | - jit_generation_time | double precision | | | - jit_inlining_count | bigint | | | - jit_inlining_time | double precision | | | - jit_optimization_count | bigint | | | - jit_optimization_time | double precision | | | - jit_emission_count | bigint | | | - jit_emission_time | double precision | | | - jit_deform_count | bigint | | | - jit_deform_time | double precision | | | - stats_since | timestamp with time zone | | | - minmax_stats_since | timestamp with time zone | | | - -SELECT count(*) > 0 AS has_data FROM pg_stat_statements; - has_data ----------- - t -(1 row) - --- New parameter minmax_only of pg_stat_statements_reset function -SELECT pg_get_functiondef('pg_stat_statements_reset'::regproc); - pg_get_functiondef -------------------------------------------------------------------------------------------------------------------------------------------------------------------- - CREATE OR REPLACE FUNCTION public.pg_stat_statements_reset(userid oid DEFAULT 0, dbid oid DEFAULT 0, queryid bigint DEFAULT 0, minmax_only boolean DEFAULT false)+ - RETURNS timestamp with time zone + - LANGUAGE c + - PARALLEL SAFE STRICT + - AS '$libdir/pg_stat_statements', $function$pg_stat_statements_reset_1_11$function$ + - -(1 row) - -SELECT pg_stat_statements_reset() IS NOT NULL AS t; - t ---- - t -(1 row) - --- New functions and views for pg_stat_statements in 1.12 -AlTER EXTENSION pg_stat_statements UPDATE TO '1.12'; -\d pg_stat_statements - View "public.pg_stat_statements" - Column | Type | Collation | Nullable | Default -----------------------------+--------------------------+-----------+----------+--------- - userid | oid | | | - dbid | oid | | | - toplevel | boolean | | | - queryid | bigint | | | - query | text | | | - plans | bigint | | | - total_plan_time | double precision | | | - min_plan_time | double precision | | | - max_plan_time | double precision | | | - mean_plan_time | double precision | | | - stddev_plan_time | double precision | | | - calls | bigint | | | - total_exec_time | double precision | | | - min_exec_time | double precision | | | - max_exec_time | double precision | | | - mean_exec_time | double precision | | | - stddev_exec_time | double precision | | | - rows | bigint | | | - shared_blks_hit | bigint | | | - shared_blks_read | bigint | | | - shared_blks_dirtied | bigint | | | - shared_blks_written | bigint | | | - local_blks_hit | bigint | | | - local_blks_read | bigint | | | - local_blks_dirtied | bigint | | | - local_blks_written | bigint | | | - temp_blks_read | bigint | | | - temp_blks_written | bigint | | | - shared_blk_read_time | double precision | | | - shared_blk_write_time | double precision | | | - local_blk_read_time | double precision | | | - local_blk_write_time | double precision | | | - temp_blk_read_time | double precision | | | - temp_blk_write_time | double precision | | | - wal_records | bigint | | | - wal_fpi | bigint | | | - wal_bytes | numeric | | | - wal_buffers_full | bigint | | | - jit_functions | bigint | | | - jit_generation_time | double precision | | | - jit_inlining_count | bigint | | | - jit_inlining_time | double precision | | | - jit_optimization_count | bigint | | | - jit_optimization_time | double precision | | | - jit_emission_count | bigint | | | - jit_emission_time | double precision | | | - jit_deform_count | bigint | | | - jit_deform_time | double precision | | | - parallel_workers_to_launch | bigint | | | - parallel_workers_launched | bigint | | | - stats_since | timestamp with time zone | | | - minmax_stats_since | timestamp with time zone | | | - -SELECT count(*) > 0 AS has_data FROM pg_stat_statements; - has_data ----------- - t -(1 row) - --- New functions and views for pg_stat_statements in 1.13 -AlTER EXTENSION pg_stat_statements UPDATE TO '1.13'; -\d pg_stat_statements - View "public.pg_stat_statements" - Column | Type | Collation | Nullable | Default -----------------------------+--------------------------+-----------+----------+--------- - userid | oid | | | - dbid | oid | | | - toplevel | boolean | | | - queryid | bigint | | | - query | text | | | - plans | bigint | | | - total_plan_time | double precision | | | - min_plan_time | double precision | | | - max_plan_time | double precision | | | - mean_plan_time | double precision | | | - stddev_plan_time | double precision | | | - calls | bigint | | | - total_exec_time | double precision | | | - min_exec_time | double precision | | | - max_exec_time | double precision | | | - mean_exec_time | double precision | | | - stddev_exec_time | double precision | | | - rows | bigint | | | - shared_blks_hit | bigint | | | - shared_blks_read | bigint | | | - shared_blks_dirtied | bigint | | | - shared_blks_written | bigint | | | - local_blks_hit | bigint | | | - local_blks_read | bigint | | | - local_blks_dirtied | bigint | | | - local_blks_written | bigint | | | - temp_blks_read | bigint | | | - temp_blks_written | bigint | | | - shared_blk_read_time | double precision | | | - shared_blk_write_time | double precision | | | - local_blk_read_time | double precision | | | - local_blk_write_time | double precision | | | - temp_blk_read_time | double precision | | | - temp_blk_write_time | double precision | | | - wal_records | bigint | | | - wal_fpi | bigint | | | - wal_bytes | numeric | | | - wal_buffers_full | bigint | | | - jit_functions | bigint | | | - jit_generation_time | double precision | | | - jit_inlining_count | bigint | | | - jit_inlining_time | double precision | | | - jit_optimization_count | bigint | | | - jit_optimization_time | double precision | | | - jit_emission_count | bigint | | | - jit_emission_time | double precision | | | - jit_deform_count | bigint | | | - jit_deform_time | double precision | | | - parallel_workers_to_launch | bigint | | | - parallel_workers_launched | bigint | | | - generic_plan_calls | bigint | | | - custom_plan_calls | bigint | | | - stats_since | timestamp with time zone | | | - minmax_stats_since | timestamp with time zone | | | - -SELECT count(*) > 0 AS has_data FROM pg_stat_statements; - has_data ----------- - t -(1 row) - -DROP EXTENSION pg_stat_statements; +psql: error: connection to server on socket "/tmp/pg_regress-pGEVs9/.s.PGSQL.58928" failed: No such file or directory + Is the server running locally and accepting connections on that socket?