mirror of
https://github.com/postgres/postgres.git
synced 2025-04-20 00:42:27 +03:00
pg_stat_statements: Add more tests with temp tables and namespaces
These tests provide coverage for RangeTblEntry and how query jumbling works with search_path, as well as the case where relations are re-created, generating a different query ID as the relation OID is used in the computation. A patch is under discussion to switch to a different approach based on the relation name, and there was no test coverage for this area, including how queries are currently grouped with search_path. This is useful to track how the situation changes between HEAD and any patches proposed. Christoph has proposed the test with ON COMMIT DROP temporary tables, and I have written the second part. Author: Christoph Berg <myon@debian.org> Author: Michael Paquier <michael@paquier.xyz> Discussion: https://postgr.es/m/Z9iWXKGwkm8RAC93@msg.df7cb.de
This commit is contained in:
parent
626d7236b6
commit
3430215fe3
@ -413,3 +413,243 @@ SELECT pg_stat_statements_reset() IS NOT NULL AS t;
|
|||||||
t
|
t
|
||||||
(1 row)
|
(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
|
||||||
|
-------+------------------------------------------------------------------------
|
||||||
|
1 | SELECT * FROM temp_t
|
||||||
|
1 | 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
|
||||||
|
(4 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
|
||||||
|
-------+------------------------------------------------------------------------
|
||||||
|
3 | SELECT a FROM pgss_schema_2.tab_search_diff_2 AS t1
|
||||||
|
9 | SELECT a FROM tab_search_diff_2 AS t1
|
||||||
|
1 | SELECT a, b FROM pgss_schema_1.tab_search_same
|
||||||
|
3 | SELECT a, b FROM tab_search_same
|
||||||
|
0 | SELECT calls, query FROM pg_stat_statements ORDER BY query COLLATE "C"
|
||||||
|
1 | SELECT count(*) FROM pgss_schema_1.tab_search_same
|
||||||
|
1 | SELECT count(*) FROM pgss_schema_2.tab_search_diff_1
|
||||||
|
3 | SELECT count(*) FROM tab_search_diff_1
|
||||||
|
4 | SELECT count(*) FROM tab_search_diff_2
|
||||||
|
3 | SELECT count(*) FROM tab_search_same
|
||||||
|
1 | SELECT pg_stat_statements_reset() IS NOT NULL AS t
|
||||||
|
(11 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)
|
||||||
|
|
||||||
|
@ -148,3 +148,72 @@ SELECT (
|
|||||||
|
|
||||||
SELECT COUNT(*) FROM pg_stat_statements WHERE query LIKE '%SELECT GROUPING%';
|
SELECT COUNT(*) FROM pg_stat_statements WHERE query LIKE '%SELECT GROUPING%';
|
||||||
SELECT pg_stat_statements_reset() IS NOT NULL AS t;
|
SELECT pg_stat_statements_reset() IS NOT NULL AS t;
|
||||||
|
|
||||||
|
-- Temporary table with same name, re-created.
|
||||||
|
BEGIN;
|
||||||
|
CREATE TEMP TABLE temp_t (id int) ON COMMIT DROP;
|
||||||
|
SELECT * FROM temp_t;
|
||||||
|
COMMIT;
|
||||||
|
BEGIN;
|
||||||
|
CREATE TEMP TABLE temp_t (id int) ON COMMIT DROP;
|
||||||
|
SELECT * FROM temp_t;
|
||||||
|
COMMIT;
|
||||||
|
SELECT calls, query FROM pg_stat_statements ORDER BY query COLLATE "C";
|
||||||
|
SELECT pg_stat_statements_reset() IS NOT NULL AS t;
|
||||||
|
|
||||||
|
-- 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;
|
||||||
|
SELECT a, b FROM tab_search_same;
|
||||||
|
SELECT count(*) FROM tab_search_diff_1;
|
||||||
|
SELECT count(*) FROM tab_search_diff_2;
|
||||||
|
SELECT a FROM tab_search_diff_2 AS t1;
|
||||||
|
SELECT a FROM tab_search_diff_2;
|
||||||
|
SELECT a AS a1 FROM tab_search_diff_2;
|
||||||
|
-- Second permanent schema
|
||||||
|
SET search_path = 'pgss_schema_2';
|
||||||
|
SELECT count(*) FROM tab_search_same;
|
||||||
|
SELECT a, b FROM tab_search_same;
|
||||||
|
SELECT count(*) FROM tab_search_diff_1;
|
||||||
|
SELECT count(*) FROM tab_search_diff_2;
|
||||||
|
SELECT a FROM tab_search_diff_2 AS t1;
|
||||||
|
SELECT a FROM tab_search_diff_2;
|
||||||
|
SELECT a AS a1 FROM tab_search_diff_2;
|
||||||
|
-- Temporary schema
|
||||||
|
SET search_path = 'pg_temp';
|
||||||
|
SELECT count(*) FROM tab_search_same;
|
||||||
|
SELECT a, b FROM tab_search_same;
|
||||||
|
SELECT count(*) FROM tab_search_diff_1;
|
||||||
|
SELECT count(*) FROM tab_search_diff_2;
|
||||||
|
SELECT a FROM tab_search_diff_2 AS t1;
|
||||||
|
SELECT a FROM tab_search_diff_2;
|
||||||
|
SELECT a AS a1 FROM tab_search_diff_2;
|
||||||
|
RESET search_path;
|
||||||
|
-- Schema qualifications
|
||||||
|
SELECT count(*) FROM pgss_schema_1.tab_search_same;
|
||||||
|
SELECT a, b FROM pgss_schema_1.tab_search_same;
|
||||||
|
SELECT count(*) FROM pgss_schema_2.tab_search_diff_1;
|
||||||
|
SELECT count(*) FROM pg_temp.tab_search_diff_2;
|
||||||
|
SELECT a FROM pgss_schema_2.tab_search_diff_2 AS t1;
|
||||||
|
SELECT a FROM pgss_schema_2.tab_search_diff_2;
|
||||||
|
SELECT a AS a1 FROM pgss_schema_2.tab_search_diff_2;
|
||||||
|
SELECT calls, query FROM pg_stat_statements ORDER BY query COLLATE "C";
|
||||||
|
DROP SCHEMA pgss_schema_1 CASCADE;
|
||||||
|
DROP SCHEMA pgss_schema_2 CASCADE;
|
||||||
|
DROP TABLE tab_search_same, tab_search_diff_1, tab_search_diff_2;
|
||||||
|
SELECT pg_stat_statements_reset() IS NOT NULL AS t;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user