mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-12-15 08:20:16 +08:00
ee0202d552
TOAST tables have a visibility map and a free space map, so they can be supported by pgstattuple_approx just fine. Add test cases to show how various pgstattuple functions accept TOAST tables. Also add similar tests to pg_visibility, which already accepted TOAST tables correctly but had no test coverage for them. Reviewed-by: Laurenz Albe <laurenz.albe@cybertec.at> Discussion: https://www.postgresql.org/message-id/flat/27c4496a-02b9-dc87-8f6f-bddbef54e0fe@2ndquadrant.com
191 lines
6.6 KiB
Plaintext
191 lines
6.6 KiB
Plaintext
CREATE EXTENSION pg_visibility;
|
|
--
|
|
-- recently-dropped table
|
|
--
|
|
\set VERBOSITY sqlstate
|
|
BEGIN;
|
|
CREATE TABLE droppedtest (c int);
|
|
SELECT 'droppedtest'::regclass::oid AS oid \gset
|
|
SAVEPOINT q; DROP TABLE droppedtest; RELEASE q;
|
|
SAVEPOINT q; SELECT * FROM pg_visibility_map(:oid); ROLLBACK TO q;
|
|
ERROR: XX000
|
|
-- ERROR: could not open relation with OID 16xxx
|
|
SAVEPOINT q; SELECT 1; ROLLBACK TO q;
|
|
?column?
|
|
----------
|
|
1
|
|
(1 row)
|
|
|
|
SAVEPOINT q; SELECT 1; ROLLBACK TO q;
|
|
?column?
|
|
----------
|
|
1
|
|
(1 row)
|
|
|
|
SELECT pg_relation_size(:oid), pg_relation_filepath(:oid),
|
|
has_table_privilege(:oid, 'SELECT');
|
|
pg_relation_size | pg_relation_filepath | has_table_privilege
|
|
------------------+----------------------+---------------------
|
|
| |
|
|
(1 row)
|
|
|
|
SELECT * FROM pg_visibility_map(:oid);
|
|
ERROR: XX000
|
|
-- ERROR: could not open relation with OID 16xxx
|
|
ROLLBACK;
|
|
\set VERBOSITY default
|
|
--
|
|
-- check that using the module's functions with unsupported relations will fail
|
|
--
|
|
-- partitioned tables (the parent ones) don't have visibility maps
|
|
create table test_partitioned (a int) partition by list (a);
|
|
-- these should all fail
|
|
select pg_visibility('test_partitioned', 0);
|
|
ERROR: "test_partitioned" is not a table, materialized view, or TOAST table
|
|
select pg_visibility_map('test_partitioned');
|
|
ERROR: "test_partitioned" is not a table, materialized view, or TOAST table
|
|
select pg_visibility_map_summary('test_partitioned');
|
|
ERROR: "test_partitioned" is not a table, materialized view, or TOAST table
|
|
select pg_check_frozen('test_partitioned');
|
|
ERROR: "test_partitioned" is not a table, materialized view, or TOAST table
|
|
select pg_truncate_visibility_map('test_partitioned');
|
|
ERROR: "test_partitioned" is not a table, materialized view, or TOAST table
|
|
create table test_partition partition of test_partitioned for values in (1);
|
|
create index test_index on test_partition (a);
|
|
-- indexes do not, so these all fail
|
|
select pg_visibility('test_index', 0);
|
|
ERROR: "test_index" is not a table, materialized view, or TOAST table
|
|
select pg_visibility_map('test_index');
|
|
ERROR: "test_index" is not a table, materialized view, or TOAST table
|
|
select pg_visibility_map_summary('test_index');
|
|
ERROR: "test_index" is not a table, materialized view, or TOAST table
|
|
select pg_check_frozen('test_index');
|
|
ERROR: "test_index" is not a table, materialized view, or TOAST table
|
|
select pg_truncate_visibility_map('test_index');
|
|
ERROR: "test_index" is not a table, materialized view, or TOAST table
|
|
create view test_view as select 1;
|
|
-- views do not have VMs, so these all fail
|
|
select pg_visibility('test_view', 0);
|
|
ERROR: "test_view" is not a table, materialized view, or TOAST table
|
|
select pg_visibility_map('test_view');
|
|
ERROR: "test_view" is not a table, materialized view, or TOAST table
|
|
select pg_visibility_map_summary('test_view');
|
|
ERROR: "test_view" is not a table, materialized view, or TOAST table
|
|
select pg_check_frozen('test_view');
|
|
ERROR: "test_view" is not a table, materialized view, or TOAST table
|
|
select pg_truncate_visibility_map('test_view');
|
|
ERROR: "test_view" is not a table, materialized view, or TOAST table
|
|
create sequence test_sequence;
|
|
-- sequences do not have VMs, so these all fail
|
|
select pg_visibility('test_sequence', 0);
|
|
ERROR: "test_sequence" is not a table, materialized view, or TOAST table
|
|
select pg_visibility_map('test_sequence');
|
|
ERROR: "test_sequence" is not a table, materialized view, or TOAST table
|
|
select pg_visibility_map_summary('test_sequence');
|
|
ERROR: "test_sequence" is not a table, materialized view, or TOAST table
|
|
select pg_check_frozen('test_sequence');
|
|
ERROR: "test_sequence" is not a table, materialized view, or TOAST table
|
|
select pg_truncate_visibility_map('test_sequence');
|
|
ERROR: "test_sequence" is not a table, materialized view, or TOAST table
|
|
create foreign data wrapper dummy;
|
|
create server dummy_server foreign data wrapper dummy;
|
|
create foreign table test_foreign_table () server dummy_server;
|
|
-- foreign tables do not have VMs, so these all fail
|
|
select pg_visibility('test_foreign_table', 0);
|
|
ERROR: "test_foreign_table" is not a table, materialized view, or TOAST table
|
|
select pg_visibility_map('test_foreign_table');
|
|
ERROR: "test_foreign_table" is not a table, materialized view, or TOAST table
|
|
select pg_visibility_map_summary('test_foreign_table');
|
|
ERROR: "test_foreign_table" is not a table, materialized view, or TOAST table
|
|
select pg_check_frozen('test_foreign_table');
|
|
ERROR: "test_foreign_table" is not a table, materialized view, or TOAST table
|
|
select pg_truncate_visibility_map('test_foreign_table');
|
|
ERROR: "test_foreign_table" is not a table, materialized view, or TOAST table
|
|
-- check some of the allowed relkinds
|
|
create table regular_table (a int, b text);
|
|
alter table regular_table alter column b set storage external;
|
|
insert into regular_table values (1, repeat('one', 1000)), (2, repeat('two', 1000));
|
|
vacuum regular_table;
|
|
select count(*) > 0 from pg_visibility('regular_table');
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select count(*) > 0 from pg_visibility((select reltoastrelid from pg_class where relname = 'regular_table'));
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
truncate regular_table;
|
|
select count(*) > 0 from pg_visibility('regular_table');
|
|
?column?
|
|
----------
|
|
f
|
|
(1 row)
|
|
|
|
select count(*) > 0 from pg_visibility((select reltoastrelid from pg_class where relname = 'regular_table'));
|
|
?column?
|
|
----------
|
|
f
|
|
(1 row)
|
|
|
|
create materialized view matview_visibility_test as select * from regular_table;
|
|
vacuum matview_visibility_test;
|
|
select count(*) > 0 from pg_visibility('matview_visibility_test');
|
|
?column?
|
|
----------
|
|
f
|
|
(1 row)
|
|
|
|
insert into regular_table values (1), (2);
|
|
refresh materialized view matview_visibility_test;
|
|
select count(*) > 0 from pg_visibility('matview_visibility_test');
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
-- regular tables which are part of a partition *do* have visibility maps
|
|
insert into test_partition values (1);
|
|
vacuum test_partition;
|
|
select count(*) > 0 from pg_visibility('test_partition', 0);
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select count(*) > 0 from pg_visibility_map('test_partition');
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select count(*) > 0 from pg_visibility_map_summary('test_partition');
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select * from pg_check_frozen('test_partition'); -- hopefully none
|
|
t_ctid
|
|
--------
|
|
(0 rows)
|
|
|
|
select pg_truncate_visibility_map('test_partition');
|
|
pg_truncate_visibility_map
|
|
----------------------------
|
|
|
|
(1 row)
|
|
|
|
-- cleanup
|
|
drop table test_partitioned;
|
|
drop view test_view;
|
|
drop sequence test_sequence;
|
|
drop foreign table test_foreign_table;
|
|
drop server dummy_server;
|
|
drop foreign data wrapper dummy;
|
|
drop materialized view matview_visibility_test;
|
|
drop table regular_table;
|