mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-08-23 12:10:41 +02:00
pg_stat_statements.sql acts as the main file for all the core tests of the module, but things have become complicated to follow over the years as some of the sub-scenarios tested in this file rely on assumptions that come from completely different areas of it, like a GUC setup or a relation created previously. For example, row tracking for CTAS/COPY was looking at the number of plans, which was not necessary, or level tracking was mixed with checks on planner counts. This commit refactors the tests of pg_stat_statements, by moving test cases out of pg_stat_statements.sql into their own file, as of: - Planning-related tests in planning.sql, for [re]plan counts and top-level handling. These depend on pg_stat_statements.track_planning. - Utilities in utility.sql (pg_stat_statements.track_utility), that includes now the tests for: -- Row tracking for CTAS, CREATE MATERIALIZED VIEW, COPY. -- Basic utility statements. -- SET statements. - Tracking level, depending on pg_stat_statements.track. This part has been looking at scenarios with DO blocks, PL functions and SQL functions. pg_stat_statements.sql (still named the same for now) still includes some checks for role-level tracking and WAL generation metrics, that ought to become independent in the long term for clarity. While on it, this switches the order of the attributes when querying pg_stat_statements, the query field becoming last. This makes much easier the tracking of changes related to normalization, as queries are the only variable-length attributes queried (unaligned mode would be one extra choice, but that reduces the checks on the other fields). Test scenarios and their results match exactly with what was happening before this commit in terms of calls, number of plans, number of rows, cached data or level tracking, so this has no effect on the coverage in terms of what is produced by the reports in the table pg_stat_statements. A follow-up patch will extend more the tests of pg_stat_statements around utilities, so this split creates a foundation for this purpose, without complicating more pg_stat_statements.sql. Reviewed-by: Bertrand Drouvot Discussion: https://postgr.es/m/Y+MRdEq9W9XVa2AB@paquier.xyz
133 lines
3.9 KiB
Plaintext
133 lines
3.9 KiB
Plaintext
--
|
|
-- Utility commands
|
|
--
|
|
-- These tests require track_utility to be enabled.
|
|
SET pg_stat_statements.track_utility = TRUE;
|
|
SELECT pg_stat_statements_reset();
|
|
pg_stat_statements_reset
|
|
--------------------------
|
|
|
|
(1 row)
|
|
|
|
SELECT 1;
|
|
?column?
|
|
----------
|
|
1
|
|
(1 row)
|
|
|
|
CREATE TEMP TABLE stats_util_tab (a int, b char(20));
|
|
CREATE INDEX test_b ON stats_util_tab(b);
|
|
DROP TABLE stats_util_tab \;
|
|
DROP TABLE IF EXISTS stats_util_tab;
|
|
NOTICE: table "stats_util_tab" does not exist, skipping
|
|
-- This DROP query uses two different strings, still they count as one entry.
|
|
DROP TABLE IF EXISTS stats_util_tab \;
|
|
Drop Table If Exists stats_util_tab;
|
|
NOTICE: table "stats_util_tab" does not exist, skipping
|
|
NOTICE: table "stats_util_tab" does not exist, skipping
|
|
SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C";
|
|
calls | rows | query
|
|
-------+------+------------------------------------------------------
|
|
1 | 0 | CREATE INDEX test_b ON stats_util_tab(b)
|
|
1 | 0 | CREATE TEMP TABLE stats_util_tab (a int, b char(20))
|
|
3 | 0 | DROP TABLE IF EXISTS stats_util_tab
|
|
1 | 0 | DROP TABLE stats_util_tab
|
|
1 | 1 | SELECT $1
|
|
1 | 1 | SELECT pg_stat_statements_reset()
|
|
(6 rows)
|
|
|
|
SELECT pg_stat_statements_reset();
|
|
pg_stat_statements_reset
|
|
--------------------------
|
|
|
|
(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, 'ctas' b FROM generate_series(1, 10) a
|
|
1 | 0 | DECLARE pgss_cursor CURSOR FOR SELECT * FROM pgss_matv
|
|
1 | 5 | FETCH FORWARD 5 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, 10) c INTO pgss_select_into
|
|
1 | 1 | SELECT pg_stat_statements_reset()
|
|
(12 rows)
|
|
|
|
DROP MATERIALIZED VIEW pgss_matv;
|
|
DROP TABLE pgss_ctas;
|
|
DROP TABLE pgss_select_into;
|
|
SELECT pg_stat_statements_reset();
|
|
pg_stat_statements_reset
|
|
--------------------------
|
|
|
|
(1 row)
|
|
|
|
-- SET statements.
|
|
-- These use two different strings, still they count as one entry.
|
|
SET work_mem = '1MB';
|
|
Set work_mem = '1MB';
|
|
SET work_mem = '2MB';
|
|
RESET work_mem;
|
|
SET enable_seqscan = off;
|
|
SET enable_seqscan = on;
|
|
RESET enable_seqscan;
|
|
SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C";
|
|
calls | rows | query
|
|
-------+------+-----------------------------------
|
|
1 | 0 | RESET enable_seqscan
|
|
1 | 0 | RESET work_mem
|
|
1 | 1 | SELECT pg_stat_statements_reset()
|
|
1 | 0 | SET enable_seqscan = off
|
|
1 | 0 | SET enable_seqscan = on
|
|
2 | 0 | SET work_mem = '1MB'
|
|
1 | 0 | SET work_mem = '2MB'
|
|
(7 rows)
|
|
|