mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-10-04 08:37:20 +02:00
Add more tests for VACUUM skips with partitioned tables
A VACUUM or ANALYZE command listing directly a partitioned table expands it to its partitions, causing all elements of a tree to be processed with individual ownership checks done. This results in different relation skips depending on the ownership policy of a tree, which may not be consistent for a partition tree. This commit adds more tests to ensure that any future refactoring allows to keep a consistent behavior, or at least that any changes done are easily identified and checked. The current behavior of VACUUM with partitioned tables is present since 10. Author: Nathan Bossart Reviewed-by: Michael Paquier Discussion: https://postgr.es/m/DC186201-B01F-4A66-9EC4-F855A957C1F9@amazon.com
This commit is contained in:
parent
88ebd62fcc
commit
a569eea699
@ -124,6 +124,9 @@ DROP TABLE vactst;
|
|||||||
DROP TABLE vacparted;
|
DROP TABLE vacparted;
|
||||||
-- relation ownership, WARNING logs generated as all are skipped.
|
-- relation ownership, WARNING logs generated as all are skipped.
|
||||||
CREATE TABLE vacowned (a int);
|
CREATE TABLE vacowned (a int);
|
||||||
|
CREATE TABLE vacowned_parted (a int) PARTITION BY LIST (a);
|
||||||
|
CREATE TABLE vacowned_part1 PARTITION OF vacowned_parted FOR VALUES IN (1);
|
||||||
|
CREATE TABLE vacowned_part2 PARTITION OF vacowned_parted FOR VALUES IN (2);
|
||||||
CREATE ROLE regress_vacuum;
|
CREATE ROLE regress_vacuum;
|
||||||
SET ROLE regress_vacuum;
|
SET ROLE regress_vacuum;
|
||||||
-- Simple table
|
-- Simple table
|
||||||
@ -147,6 +150,102 @@ ANALYZE pg_catalog.pg_authid;
|
|||||||
WARNING: skipping "pg_authid" --- only superuser can analyze it
|
WARNING: skipping "pg_authid" --- only superuser can analyze it
|
||||||
VACUUM (ANALYZE) pg_catalog.pg_authid;
|
VACUUM (ANALYZE) pg_catalog.pg_authid;
|
||||||
WARNING: skipping "pg_authid" --- only superuser can vacuum it
|
WARNING: skipping "pg_authid" --- only superuser can vacuum it
|
||||||
|
-- Partitioned table and its partitions, nothing owned by other user.
|
||||||
|
-- Relations are not listed in a single command to test ownership
|
||||||
|
-- independently.
|
||||||
|
VACUUM vacowned_parted;
|
||||||
|
WARNING: skipping "vacowned_parted" --- only table or database owner can vacuum it
|
||||||
|
WARNING: skipping "vacowned_part1" --- only table or database owner can vacuum it
|
||||||
|
WARNING: skipping "vacowned_part2" --- only table or database owner can vacuum it
|
||||||
|
VACUUM vacowned_part1;
|
||||||
|
WARNING: skipping "vacowned_part1" --- only table or database owner can vacuum it
|
||||||
|
VACUUM vacowned_part2;
|
||||||
|
WARNING: skipping "vacowned_part2" --- only table or database owner can vacuum it
|
||||||
|
ANALYZE vacowned_parted;
|
||||||
|
WARNING: skipping "vacowned_parted" --- only table or database owner can analyze it
|
||||||
|
WARNING: skipping "vacowned_part1" --- only table or database owner can analyze it
|
||||||
|
WARNING: skipping "vacowned_part2" --- only table or database owner can analyze it
|
||||||
|
ANALYZE vacowned_part1;
|
||||||
|
WARNING: skipping "vacowned_part1" --- only table or database owner can analyze it
|
||||||
|
ANALYZE vacowned_part2;
|
||||||
|
WARNING: skipping "vacowned_part2" --- only table or database owner can analyze it
|
||||||
|
VACUUM (ANALYZE) vacowned_parted;
|
||||||
|
WARNING: skipping "vacowned_parted" --- only table or database owner can vacuum it
|
||||||
|
WARNING: skipping "vacowned_part1" --- only table or database owner can vacuum it
|
||||||
|
WARNING: skipping "vacowned_part2" --- only table or database owner can vacuum it
|
||||||
|
VACUUM (ANALYZE) vacowned_part1;
|
||||||
|
WARNING: skipping "vacowned_part1" --- only table or database owner can vacuum it
|
||||||
|
VACUUM (ANALYZE) vacowned_part2;
|
||||||
|
WARNING: skipping "vacowned_part2" --- only table or database owner can vacuum it
|
||||||
|
RESET ROLE;
|
||||||
|
-- Partitioned table and one partition owned by other user.
|
||||||
|
ALTER TABLE vacowned_parted OWNER TO regress_vacuum;
|
||||||
|
ALTER TABLE vacowned_part1 OWNER TO regress_vacuum;
|
||||||
|
SET ROLE regress_vacuum;
|
||||||
|
VACUUM vacowned_parted;
|
||||||
|
WARNING: skipping "vacowned_part2" --- only table or database owner can vacuum it
|
||||||
|
VACUUM vacowned_part1;
|
||||||
|
VACUUM vacowned_part2;
|
||||||
|
WARNING: skipping "vacowned_part2" --- only table or database owner can vacuum it
|
||||||
|
ANALYZE vacowned_parted;
|
||||||
|
WARNING: skipping "vacowned_part2" --- only table or database owner can analyze it
|
||||||
|
ANALYZE vacowned_part1;
|
||||||
|
ANALYZE vacowned_part2;
|
||||||
|
WARNING: skipping "vacowned_part2" --- only table or database owner can analyze it
|
||||||
|
VACUUM (ANALYZE) vacowned_parted;
|
||||||
|
WARNING: skipping "vacowned_part2" --- only table or database owner can vacuum it
|
||||||
|
VACUUM (ANALYZE) vacowned_part1;
|
||||||
|
VACUUM (ANALYZE) vacowned_part2;
|
||||||
|
WARNING: skipping "vacowned_part2" --- only table or database owner can vacuum it
|
||||||
|
RESET ROLE;
|
||||||
|
-- Only one partition owned by other user.
|
||||||
|
ALTER TABLE vacowned_parted OWNER TO CURRENT_USER;
|
||||||
|
SET ROLE regress_vacuum;
|
||||||
|
VACUUM vacowned_parted;
|
||||||
|
WARNING: skipping "vacowned_parted" --- only table or database owner can vacuum it
|
||||||
|
WARNING: skipping "vacowned_part2" --- only table or database owner can vacuum it
|
||||||
|
VACUUM vacowned_part1;
|
||||||
|
VACUUM vacowned_part2;
|
||||||
|
WARNING: skipping "vacowned_part2" --- only table or database owner can vacuum it
|
||||||
|
ANALYZE vacowned_parted;
|
||||||
|
WARNING: skipping "vacowned_parted" --- only table or database owner can analyze it
|
||||||
|
WARNING: skipping "vacowned_part2" --- only table or database owner can analyze it
|
||||||
|
ANALYZE vacowned_part1;
|
||||||
|
ANALYZE vacowned_part2;
|
||||||
|
WARNING: skipping "vacowned_part2" --- only table or database owner can analyze it
|
||||||
|
VACUUM (ANALYZE) vacowned_parted;
|
||||||
|
WARNING: skipping "vacowned_parted" --- only table or database owner can vacuum it
|
||||||
|
WARNING: skipping "vacowned_part2" --- only table or database owner can vacuum it
|
||||||
|
VACUUM (ANALYZE) vacowned_part1;
|
||||||
|
VACUUM (ANALYZE) vacowned_part2;
|
||||||
|
WARNING: skipping "vacowned_part2" --- only table or database owner can vacuum it
|
||||||
|
RESET ROLE;
|
||||||
|
-- Only partitioned table owned by other user.
|
||||||
|
ALTER TABLE vacowned_parted OWNER TO regress_vacuum;
|
||||||
|
ALTER TABLE vacowned_part1 OWNER TO CURRENT_USER;
|
||||||
|
SET ROLE regress_vacuum;
|
||||||
|
VACUUM vacowned_parted;
|
||||||
|
WARNING: skipping "vacowned_part1" --- only table or database owner can vacuum it
|
||||||
|
WARNING: skipping "vacowned_part2" --- only table or database owner can vacuum it
|
||||||
|
VACUUM vacowned_part1;
|
||||||
|
WARNING: skipping "vacowned_part1" --- only table or database owner can vacuum it
|
||||||
|
VACUUM vacowned_part2;
|
||||||
|
WARNING: skipping "vacowned_part2" --- only table or database owner can vacuum it
|
||||||
|
ANALYZE vacowned_parted;
|
||||||
|
WARNING: skipping "vacowned_part1" --- only table or database owner can analyze it
|
||||||
|
WARNING: skipping "vacowned_part2" --- only table or database owner can analyze it
|
||||||
|
ANALYZE vacowned_part1;
|
||||||
|
WARNING: skipping "vacowned_part1" --- only table or database owner can analyze it
|
||||||
|
ANALYZE vacowned_part2;
|
||||||
|
WARNING: skipping "vacowned_part2" --- only table or database owner can analyze it
|
||||||
|
VACUUM (ANALYZE) vacowned_parted;
|
||||||
|
WARNING: skipping "vacowned_part1" --- only table or database owner can vacuum it
|
||||||
|
WARNING: skipping "vacowned_part2" --- only table or database owner can vacuum it
|
||||||
|
VACUUM (ANALYZE) vacowned_part1;
|
||||||
|
WARNING: skipping "vacowned_part1" --- only table or database owner can vacuum it
|
||||||
|
VACUUM (ANALYZE) vacowned_part2;
|
||||||
|
WARNING: skipping "vacowned_part2" --- only table or database owner can vacuum it
|
||||||
RESET ROLE;
|
RESET ROLE;
|
||||||
DROP TABLE vacowned;
|
DROP TABLE vacowned;
|
||||||
|
DROP TABLE vacowned_parted;
|
||||||
DROP ROLE regress_vacuum;
|
DROP ROLE regress_vacuum;
|
||||||
|
@ -99,6 +99,9 @@ DROP TABLE vacparted;
|
|||||||
|
|
||||||
-- relation ownership, WARNING logs generated as all are skipped.
|
-- relation ownership, WARNING logs generated as all are skipped.
|
||||||
CREATE TABLE vacowned (a int);
|
CREATE TABLE vacowned (a int);
|
||||||
|
CREATE TABLE vacowned_parted (a int) PARTITION BY LIST (a);
|
||||||
|
CREATE TABLE vacowned_part1 PARTITION OF vacowned_parted FOR VALUES IN (1);
|
||||||
|
CREATE TABLE vacowned_part2 PARTITION OF vacowned_parted FOR VALUES IN (2);
|
||||||
CREATE ROLE regress_vacuum;
|
CREATE ROLE regress_vacuum;
|
||||||
SET ROLE regress_vacuum;
|
SET ROLE regress_vacuum;
|
||||||
-- Simple table
|
-- Simple table
|
||||||
@ -113,6 +116,60 @@ VACUUM (ANALYZE) pg_catalog.pg_class;
|
|||||||
VACUUM pg_catalog.pg_authid;
|
VACUUM pg_catalog.pg_authid;
|
||||||
ANALYZE pg_catalog.pg_authid;
|
ANALYZE pg_catalog.pg_authid;
|
||||||
VACUUM (ANALYZE) pg_catalog.pg_authid;
|
VACUUM (ANALYZE) pg_catalog.pg_authid;
|
||||||
|
-- Partitioned table and its partitions, nothing owned by other user.
|
||||||
|
-- Relations are not listed in a single command to test ownership
|
||||||
|
-- independently.
|
||||||
|
VACUUM vacowned_parted;
|
||||||
|
VACUUM vacowned_part1;
|
||||||
|
VACUUM vacowned_part2;
|
||||||
|
ANALYZE vacowned_parted;
|
||||||
|
ANALYZE vacowned_part1;
|
||||||
|
ANALYZE vacowned_part2;
|
||||||
|
VACUUM (ANALYZE) vacowned_parted;
|
||||||
|
VACUUM (ANALYZE) vacowned_part1;
|
||||||
|
VACUUM (ANALYZE) vacowned_part2;
|
||||||
|
RESET ROLE;
|
||||||
|
-- Partitioned table and one partition owned by other user.
|
||||||
|
ALTER TABLE vacowned_parted OWNER TO regress_vacuum;
|
||||||
|
ALTER TABLE vacowned_part1 OWNER TO regress_vacuum;
|
||||||
|
SET ROLE regress_vacuum;
|
||||||
|
VACUUM vacowned_parted;
|
||||||
|
VACUUM vacowned_part1;
|
||||||
|
VACUUM vacowned_part2;
|
||||||
|
ANALYZE vacowned_parted;
|
||||||
|
ANALYZE vacowned_part1;
|
||||||
|
ANALYZE vacowned_part2;
|
||||||
|
VACUUM (ANALYZE) vacowned_parted;
|
||||||
|
VACUUM (ANALYZE) vacowned_part1;
|
||||||
|
VACUUM (ANALYZE) vacowned_part2;
|
||||||
|
RESET ROLE;
|
||||||
|
-- Only one partition owned by other user.
|
||||||
|
ALTER TABLE vacowned_parted OWNER TO CURRENT_USER;
|
||||||
|
SET ROLE regress_vacuum;
|
||||||
|
VACUUM vacowned_parted;
|
||||||
|
VACUUM vacowned_part1;
|
||||||
|
VACUUM vacowned_part2;
|
||||||
|
ANALYZE vacowned_parted;
|
||||||
|
ANALYZE vacowned_part1;
|
||||||
|
ANALYZE vacowned_part2;
|
||||||
|
VACUUM (ANALYZE) vacowned_parted;
|
||||||
|
VACUUM (ANALYZE) vacowned_part1;
|
||||||
|
VACUUM (ANALYZE) vacowned_part2;
|
||||||
|
RESET ROLE;
|
||||||
|
-- Only partitioned table owned by other user.
|
||||||
|
ALTER TABLE vacowned_parted OWNER TO regress_vacuum;
|
||||||
|
ALTER TABLE vacowned_part1 OWNER TO CURRENT_USER;
|
||||||
|
SET ROLE regress_vacuum;
|
||||||
|
VACUUM vacowned_parted;
|
||||||
|
VACUUM vacowned_part1;
|
||||||
|
VACUUM vacowned_part2;
|
||||||
|
ANALYZE vacowned_parted;
|
||||||
|
ANALYZE vacowned_part1;
|
||||||
|
ANALYZE vacowned_part2;
|
||||||
|
VACUUM (ANALYZE) vacowned_parted;
|
||||||
|
VACUUM (ANALYZE) vacowned_part1;
|
||||||
|
VACUUM (ANALYZE) vacowned_part2;
|
||||||
RESET ROLE;
|
RESET ROLE;
|
||||||
DROP TABLE vacowned;
|
DROP TABLE vacowned;
|
||||||
|
DROP TABLE vacowned_parted;
|
||||||
DROP ROLE regress_vacuum;
|
DROP ROLE regress_vacuum;
|
||||||
|
Loading…
Reference in New Issue
Block a user