mirror of
https://github.com/postgres/postgres.git
synced 2025-07-28 23:42:10 +03:00
Extend amcheck to check heap pages.
Mark Dilger, reviewed by Peter Geoghegan, Andres Freund, Álvaro Herrera, Michael Paquier, Amul Sul, and by me. Some last-minute cosmetic revisions by me. Discussion: http://postgr.es/m/12ED3DA8-25F0-4B68-937D-D907CFBF08E7@enterprisedb.com
This commit is contained in:
116
contrib/amcheck/sql/check_heap.sql
Normal file
116
contrib/amcheck/sql/check_heap.sql
Normal file
@ -0,0 +1,116 @@
|
||||
CREATE TABLE heaptest (a integer, b text);
|
||||
REVOKE ALL ON heaptest FROM PUBLIC;
|
||||
|
||||
-- Check that invalid skip option is rejected
|
||||
SELECT * FROM verify_heapam(relation := 'heaptest', skip := 'rope');
|
||||
|
||||
-- Check specifying invalid block ranges when verifying an empty table
|
||||
SELECT * FROM verify_heapam(relation := 'heaptest', startblock := 0, endblock := 0);
|
||||
SELECT * FROM verify_heapam(relation := 'heaptest', startblock := 5, endblock := 8);
|
||||
|
||||
-- Check that valid options are not rejected nor corruption reported
|
||||
-- for an empty table, and that skip enum-like parameter is case-insensitive
|
||||
SELECT * FROM verify_heapam(relation := 'heaptest', skip := 'none');
|
||||
SELECT * FROM verify_heapam(relation := 'heaptest', skip := 'all-frozen');
|
||||
SELECT * FROM verify_heapam(relation := 'heaptest', skip := 'all-visible');
|
||||
SELECT * FROM verify_heapam(relation := 'heaptest', skip := 'None');
|
||||
SELECT * FROM verify_heapam(relation := 'heaptest', skip := 'All-Frozen');
|
||||
SELECT * FROM verify_heapam(relation := 'heaptest', skip := 'All-Visible');
|
||||
SELECT * FROM verify_heapam(relation := 'heaptest', skip := 'NONE');
|
||||
SELECT * FROM verify_heapam(relation := 'heaptest', skip := 'ALL-FROZEN');
|
||||
SELECT * FROM verify_heapam(relation := 'heaptest', skip := 'ALL-VISIBLE');
|
||||
|
||||
-- Add some data so subsequent tests are not entirely trivial
|
||||
INSERT INTO heaptest (a, b)
|
||||
(SELECT gs, repeat('x', gs)
|
||||
FROM generate_series(1,50) gs);
|
||||
|
||||
-- Check that valid options are not rejected nor corruption reported
|
||||
-- for a non-empty table
|
||||
SELECT * FROM verify_heapam(relation := 'heaptest', skip := 'none');
|
||||
SELECT * FROM verify_heapam(relation := 'heaptest', skip := 'all-frozen');
|
||||
SELECT * FROM verify_heapam(relation := 'heaptest', skip := 'all-visible');
|
||||
SELECT * FROM verify_heapam(relation := 'heaptest', startblock := 0, endblock := 0);
|
||||
|
||||
CREATE ROLE regress_heaptest_role;
|
||||
|
||||
-- verify permissions are checked (error due to function not callable)
|
||||
SET ROLE regress_heaptest_role;
|
||||
SELECT * FROM verify_heapam(relation := 'heaptest');
|
||||
RESET ROLE;
|
||||
|
||||
GRANT EXECUTE ON FUNCTION verify_heapam(regclass, boolean, boolean, text, bigint, bigint) TO regress_heaptest_role;
|
||||
|
||||
-- verify permissions are now sufficient
|
||||
SET ROLE regress_heaptest_role;
|
||||
SELECT * FROM verify_heapam(relation := 'heaptest');
|
||||
RESET ROLE;
|
||||
|
||||
-- Check specifying invalid block ranges when verifying a non-empty table.
|
||||
SELECT * FROM verify_heapam(relation := 'heaptest', startblock := 0, endblock := 10000);
|
||||
SELECT * FROM verify_heapam(relation := 'heaptest', startblock := 10000, endblock := 11000);
|
||||
|
||||
-- Vacuum freeze to change the xids encountered in subsequent tests
|
||||
VACUUM FREEZE heaptest;
|
||||
|
||||
-- Check that valid options are not rejected nor corruption reported
|
||||
-- for a non-empty frozen table
|
||||
SELECT * FROM verify_heapam(relation := 'heaptest', skip := 'none');
|
||||
SELECT * FROM verify_heapam(relation := 'heaptest', skip := 'all-frozen');
|
||||
SELECT * FROM verify_heapam(relation := 'heaptest', skip := 'all-visible');
|
||||
SELECT * FROM verify_heapam(relation := 'heaptest', startblock := 0, endblock := 0);
|
||||
|
||||
-- Check that partitioned tables (the parent ones) which don't have visibility
|
||||
-- maps are rejected
|
||||
CREATE TABLE test_partitioned (a int, b text default repeat('x', 5000))
|
||||
PARTITION BY list (a);
|
||||
SELECT * FROM verify_heapam('test_partitioned',
|
||||
startblock := NULL,
|
||||
endblock := NULL);
|
||||
|
||||
-- Check that valid options are not rejected nor corruption reported
|
||||
-- for an empty partition table (the child one)
|
||||
CREATE TABLE test_partition partition OF test_partitioned FOR VALUES IN (1);
|
||||
SELECT * FROM verify_heapam('test_partition',
|
||||
startblock := NULL,
|
||||
endblock := NULL);
|
||||
|
||||
-- Check that valid options are not rejected nor corruption reported
|
||||
-- for a non-empty partition table (the child one)
|
||||
INSERT INTO test_partitioned (a) (SELECT 1 FROM generate_series(1,1000) gs);
|
||||
SELECT * FROM verify_heapam('test_partition',
|
||||
startblock := NULL,
|
||||
endblock := NULL);
|
||||
|
||||
-- Check that indexes are rejected
|
||||
CREATE INDEX test_index ON test_partition (a);
|
||||
SELECT * FROM verify_heapam('test_index',
|
||||
startblock := NULL,
|
||||
endblock := NULL);
|
||||
|
||||
-- Check that views are rejected
|
||||
CREATE VIEW test_view AS SELECT 1;
|
||||
SELECT * FROM verify_heapam('test_view',
|
||||
startblock := NULL,
|
||||
endblock := NULL);
|
||||
|
||||
-- Check that sequences are rejected
|
||||
CREATE SEQUENCE test_sequence;
|
||||
SELECT * FROM verify_heapam('test_sequence',
|
||||
startblock := NULL,
|
||||
endblock := NULL);
|
||||
|
||||
-- Check that foreign tables are rejected
|
||||
CREATE FOREIGN DATA WRAPPER dummy;
|
||||
CREATE SERVER dummy_server FOREIGN DATA WRAPPER dummy;
|
||||
CREATE FOREIGN TABLE test_foreign_table () SERVER dummy_server;
|
||||
SELECT * FROM verify_heapam('test_foreign_table',
|
||||
startblock := NULL,
|
||||
endblock := NULL);
|
||||
|
||||
-- cleanup
|
||||
DROP TABLE heaptest;
|
||||
DROP TABLE test_partition;
|
||||
DROP TABLE test_partitioned;
|
||||
DROP OWNED BY regress_heaptest_role; -- permissions
|
||||
DROP ROLE regress_heaptest_role;
|
Reference in New Issue
Block a user