PolarDB-for-PostgreSQL
140 строк · 5.1 Кб
1CREATE TABLE bttest_a(id int8);
2CREATE TABLE bttest_b(id int8);
3CREATE TABLE bttest_multi(id int8, data int8);
4CREATE TABLE delete_test_table (a bigint, b bigint, c bigint, d bigint);
5
6-- Stabalize tests
7ALTER TABLE bttest_a SET (autovacuum_enabled = false);
8ALTER TABLE bttest_b SET (autovacuum_enabled = false);
9ALTER TABLE bttest_multi SET (autovacuum_enabled = false);
10ALTER TABLE delete_test_table SET (autovacuum_enabled = false);
11
12INSERT INTO bttest_a SELECT * FROM generate_series(1, 100000);
13INSERT INTO bttest_b SELECT * FROM generate_series(100000, 1, -1);
14INSERT INTO bttest_multi SELECT i, i%2 FROM generate_series(1, 100000) as i;
15
16CREATE INDEX bttest_a_idx ON bttest_a USING btree (id);
17CREATE INDEX bttest_b_idx ON bttest_b USING btree (id);
18CREATE UNIQUE INDEX bttest_multi_idx ON bttest_multi
19USING btree (id) INCLUDE (data);
20
21CREATE ROLE regress_bttest_role;
22
23-- verify permissions are checked (error due to function not callable)
24SET ROLE regress_bttest_role;
25SELECT bt_index_check('bttest_a_idx'::regclass);
26SELECT bt_index_parent_check('bttest_a_idx'::regclass);
27RESET ROLE;
28
29-- we, intentionally, don't check relation permissions - it's useful
30-- to run this cluster-wide with a restricted account, and as tested
31-- above explicit permission has to be granted for that.
32GRANT EXECUTE ON FUNCTION bt_index_check(regclass) TO regress_bttest_role;
33GRANT EXECUTE ON FUNCTION bt_index_parent_check(regclass) TO regress_bttest_role;
34GRANT EXECUTE ON FUNCTION bt_index_check(regclass, boolean) TO regress_bttest_role;
35GRANT EXECUTE ON FUNCTION bt_index_parent_check(regclass, boolean) TO regress_bttest_role;
36SET ROLE regress_bttest_role;
37SELECT bt_index_check('bttest_a_idx');
38SELECT bt_index_parent_check('bttest_a_idx');
39RESET ROLE;
40
41-- verify plain tables are rejected (error)
42SELECT bt_index_check('bttest_a');
43SELECT bt_index_parent_check('bttest_a');
44
45-- verify non-existing indexes are rejected (error)
46SELECT bt_index_check(17);
47SELECT bt_index_parent_check(17);
48
49-- verify wrong index types are rejected (error)
50BEGIN;
51CREATE INDEX bttest_a_brin_idx ON bttest_a USING brin(id);
52SELECT bt_index_parent_check('bttest_a_brin_idx');
53ROLLBACK;
54
55-- normal check outside of xact
56SELECT bt_index_check('bttest_a_idx');
57-- more expansive tests
58SELECT bt_index_check('bttest_a_idx', true);
59SELECT bt_index_parent_check('bttest_b_idx', true);
60
61BEGIN;
62SELECT bt_index_check('bttest_a_idx');
63SELECT bt_index_parent_check('bttest_b_idx');
64-- make sure we don't have any leftover locks
65SELECT * FROM pg_locks
66WHERE relation = ANY(ARRAY['bttest_a', 'bttest_a_idx', 'bttest_b', 'bttest_b_idx']::regclass[])
67AND pid = pg_backend_pid();
68COMMIT;
69
70-- normal check outside of xact for index with included columns
71SELECT bt_index_check('bttest_multi_idx');
72-- more expansive test for index with included columns
73SELECT bt_index_parent_check('bttest_multi_idx', true);
74
75-- repeat expansive test for index built using insertions
76TRUNCATE bttest_multi;
77INSERT INTO bttest_multi SELECT i, i%2 FROM generate_series(1, 100000) as i;
78SELECT bt_index_parent_check('bttest_multi_idx', true);
79
80--
81-- Test for multilevel page deletion/downlink present checks
82--
83INSERT INTO delete_test_table SELECT i, 1, 2, 3 FROM generate_series(1,80000) i;
84ALTER TABLE delete_test_table ADD PRIMARY KEY (a,b,c,d);
85DELETE FROM delete_test_table WHERE a > 40000;
86VACUUM delete_test_table;
87DELETE FROM delete_test_table WHERE a > 10;
88VACUUM delete_test_table;
89SELECT bt_index_parent_check('delete_test_table_pkey', true);
90
91--
92-- BUG #15597: must not assume consistent input toasting state when forming
93-- tuple. Bloom filter must fingerprint normalized index tuple representation.
94--
95CREATE TABLE toast_bug(buggy text);
96ALTER TABLE toast_bug ALTER COLUMN buggy SET STORAGE extended;
97CREATE INDEX toasty ON toast_bug(buggy);
98
99-- pg_attribute entry for toasty.buggy (the index) will have plain storage:
100UPDATE pg_attribute SET attstorage = 'p'
101WHERE attrelid = 'toasty'::regclass AND attname = 'buggy';
102
103-- Whereas pg_attribute entry for toast_bug.buggy (the table) still has extended storage:
104SELECT attstorage FROM pg_attribute
105WHERE attrelid = 'toast_bug'::regclass AND attname = 'buggy';
106
107-- Insert compressible heap tuple (comfortably exceeds TOAST_TUPLE_THRESHOLD):
108INSERT INTO toast_bug SELECT repeat('a', 2200);
109-- Should not get false positive report of corruption:
110SELECT bt_index_check('toasty', true);
111
112--
113-- Check that index expressions and predicates are run as the table's owner
114--
115TRUNCATE bttest_a;
116INSERT INTO bttest_a SELECT * FROM generate_series(1, 1000);
117ALTER TABLE bttest_a OWNER TO regress_bttest_role;
118-- A dummy index function checking current_user
119CREATE FUNCTION ifun(int8) RETURNS int8 AS $$
120BEGIN
121ASSERT current_user = 'regress_bttest_role',
122format('ifun(%s) called by %s', $1, current_user);
123RETURN $1;
124END;
125$$ LANGUAGE plpgsql IMMUTABLE;
126
127CREATE INDEX bttest_a_expr_idx ON bttest_a ((ifun(id) + ifun(0)))
128WHERE ifun(id + 10) > ifun(10);
129
130SELECT bt_index_check('bttest_a_expr_idx', true);
131
132-- cleanup
133DROP TABLE bttest_a;
134DROP TABLE bttest_b;
135DROP TABLE bttest_multi;
136DROP TABLE delete_test_table;
137DROP TABLE toast_bug;
138DROP FUNCTION ifun(int8);
139DROP OWNED BY regress_bttest_role; -- permissions
140DROP ROLE regress_bttest_role;
141