mirror of
https://github.com/postgres/postgres.git
synced 2025-07-30 11:03:19 +03:00
Refactor more the regression tests of pg_stat_statements
This commit expands more the refactoring of the regression tests of
pg_stat_statements, with tests moved out of pg_stat_statements.sql into
separate files. The following file structure is now used:
- select is mostly the former pg_stat_statements.sql, renamed.
- dml for INSERT/UPDATE/DELETE and MERGE
- user_activity, to test role-level checks and stat resets.
- wal, to check the WAL generation after some queries.
Like e8dbdb1
, there is no change in terms of code coverage or results,
and this finishes the split I was aiming for in these tests. Most of
the tests used "test" of "pgss_test" as names for the tables used, these
are renamed to less generic names.
Reviewed-by: Bertrand Drouvot
Discussion: https://postgr.es/m/Y/7Y9U/y/keAW3qH@paquier.xyz
This commit is contained in:
414
contrib/pg_stat_statements/expected/select.out
Normal file
414
contrib/pg_stat_statements/expected/select.out
Normal file
@ -0,0 +1,414 @@
|
||||
--
|
||||
-- SELECT statements
|
||||
--
|
||||
CREATE EXTENSION pg_stat_statements;
|
||||
SET pg_stat_statements.track_utility = FALSE;
|
||||
SET pg_stat_statements.track_planning = TRUE;
|
||||
SELECT pg_stat_statements_reset();
|
||||
pg_stat_statements_reset
|
||||
--------------------------
|
||||
|
||||
(1 row)
|
||||
|
||||
--
|
||||
-- simple and compound statements
|
||||
--
|
||||
SELECT 1 AS "int";
|
||||
int
|
||||
-----
|
||||
1
|
||||
(1 row)
|
||||
|
||||
SELECT 'hello'
|
||||
-- multiline
|
||||
AS "text";
|
||||
text
|
||||
-------
|
||||
hello
|
||||
(1 row)
|
||||
|
||||
SELECT 'world' AS "text";
|
||||
text
|
||||
-------
|
||||
world
|
||||
(1 row)
|
||||
|
||||
-- transaction
|
||||
BEGIN;
|
||||
SELECT 1 AS "int";
|
||||
int
|
||||
-----
|
||||
1
|
||||
(1 row)
|
||||
|
||||
SELECT 'hello' AS "text";
|
||||
text
|
||||
-------
|
||||
hello
|
||||
(1 row)
|
||||
|
||||
COMMIT;
|
||||
-- compound transaction
|
||||
BEGIN \;
|
||||
SELECT 2.0 AS "float" \;
|
||||
SELECT 'world' AS "text" \;
|
||||
COMMIT;
|
||||
float
|
||||
-------
|
||||
2.0
|
||||
(1 row)
|
||||
|
||||
text
|
||||
-------
|
||||
world
|
||||
(1 row)
|
||||
|
||||
-- compound with empty statements and spurious leading spacing
|
||||
\;\; SELECT 3 + 3 \;\;\; SELECT ' ' || ' !' \;\; SELECT 1 + 4 \;;
|
||||
?column?
|
||||
----------
|
||||
6
|
||||
(1 row)
|
||||
|
||||
?column?
|
||||
----------
|
||||
!
|
||||
(1 row)
|
||||
|
||||
?column?
|
||||
----------
|
||||
5
|
||||
(1 row)
|
||||
|
||||
-- non ;-terminated statements
|
||||
SELECT 1 + 1 + 1 AS "add" \gset
|
||||
SELECT :add + 1 + 1 AS "add" \;
|
||||
SELECT :add + 1 + 1 AS "add" \gset
|
||||
add
|
||||
-----
|
||||
5
|
||||
(1 row)
|
||||
|
||||
-- set operator
|
||||
SELECT 1 AS i UNION SELECT 2 ORDER BY i;
|
||||
i
|
||||
---
|
||||
1
|
||||
2
|
||||
(2 rows)
|
||||
|
||||
-- ? operator
|
||||
select '{"a":1, "b":2}'::jsonb ? 'b';
|
||||
?column?
|
||||
----------
|
||||
t
|
||||
(1 row)
|
||||
|
||||
-- cte
|
||||
WITH t(f) AS (
|
||||
VALUES (1.0), (2.0)
|
||||
)
|
||||
SELECT f FROM t ORDER BY f;
|
||||
f
|
||||
-----
|
||||
1.0
|
||||
2.0
|
||||
(2 rows)
|
||||
|
||||
-- prepared statement with parameter
|
||||
PREPARE pgss_test (int) AS SELECT $1, 'test' LIMIT 1;
|
||||
EXECUTE pgss_test(1);
|
||||
?column? | ?column?
|
||||
----------+----------
|
||||
1 | test
|
||||
(1 row)
|
||||
|
||||
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 +
|
||||
| | -- multiline +
|
||||
| | 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"
|
||||
1 | 2 | SELECT $1 AS i UNION SELECT $2 ORDER BY i
|
||||
1 | 1 | SELECT $1 || $2
|
||||
0 | 0 | SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"
|
||||
1 | 1 | SELECT pg_stat_statements_reset()
|
||||
1 | 2 | WITH t(f) AS ( +
|
||||
| | VALUES ($1), ($2) +
|
||||
| | ) +
|
||||
| | SELECT f FROM t ORDER BY f
|
||||
1 | 1 | select $1::jsonb ? $2
|
||||
(12 rows)
|
||||
|
||||
SELECT pg_stat_statements_reset();
|
||||
pg_stat_statements_reset
|
||||
--------------------------
|
||||
|
||||
(1 row)
|
||||
|
||||
--
|
||||
-- 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();
|
||||
pg_stat_statements_reset
|
||||
--------------------------
|
||||
|
||||
(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()
|
||||
(12 rows)
|
||||
|
||||
DROP TABLE pgss_a, pgss_b CASCADE;
|
||||
--
|
||||
-- access to pg_stat_statements_info view
|
||||
--
|
||||
SELECT pg_stat_statements_reset();
|
||||
pg_stat_statements_reset
|
||||
--------------------------
|
||||
|
||||
(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 [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
|
||||
-------
|
||||
2
|
||||
(1 row)
|
||||
|
||||
SELECT pg_stat_statements_reset();
|
||||
pg_stat_statements_reset
|
||||
--------------------------
|
||||
|
||||
(1 row)
|
||||
|
Reference in New Issue
Block a user