PolarDB-for-PostgreSQL

Форк
0
140 строк · 5.1 Кб
1
CREATE TABLE bttest_a(id int8);
2
CREATE TABLE bttest_b(id int8);
3
CREATE TABLE bttest_multi(id int8, data int8);
4
CREATE TABLE delete_test_table (a bigint, b bigint, c bigint, d bigint);
5

6
-- Stabalize tests
7
ALTER TABLE bttest_a SET (autovacuum_enabled = false);
8
ALTER TABLE bttest_b SET (autovacuum_enabled = false);
9
ALTER TABLE bttest_multi SET (autovacuum_enabled = false);
10
ALTER TABLE delete_test_table SET (autovacuum_enabled = false);
11

12
INSERT INTO bttest_a SELECT * FROM generate_series(1, 100000);
13
INSERT INTO bttest_b SELECT * FROM generate_series(100000, 1, -1);
14
INSERT INTO bttest_multi SELECT i, i%2  FROM generate_series(1, 100000) as i;
15

16
CREATE INDEX bttest_a_idx ON bttest_a USING btree (id);
17
CREATE INDEX bttest_b_idx ON bttest_b USING btree (id);
18
CREATE UNIQUE INDEX bttest_multi_idx ON bttest_multi
19
USING btree (id) INCLUDE (data);
20

21
CREATE ROLE regress_bttest_role;
22

23
-- verify permissions are checked (error due to function not callable)
24
SET ROLE regress_bttest_role;
25
SELECT bt_index_check('bttest_a_idx'::regclass);
26
SELECT bt_index_parent_check('bttest_a_idx'::regclass);
27
RESET 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.
32
GRANT EXECUTE ON FUNCTION bt_index_check(regclass) TO regress_bttest_role;
33
GRANT EXECUTE ON FUNCTION bt_index_parent_check(regclass) TO regress_bttest_role;
34
GRANT EXECUTE ON FUNCTION bt_index_check(regclass, boolean) TO regress_bttest_role;
35
GRANT EXECUTE ON FUNCTION bt_index_parent_check(regclass, boolean) TO regress_bttest_role;
36
SET ROLE regress_bttest_role;
37
SELECT bt_index_check('bttest_a_idx');
38
SELECT bt_index_parent_check('bttest_a_idx');
39
RESET ROLE;
40

41
-- verify plain tables are rejected (error)
42
SELECT bt_index_check('bttest_a');
43
SELECT bt_index_parent_check('bttest_a');
44

45
-- verify non-existing indexes are rejected (error)
46
SELECT bt_index_check(17);
47
SELECT bt_index_parent_check(17);
48

49
-- verify wrong index types are rejected (error)
50
BEGIN;
51
CREATE INDEX bttest_a_brin_idx ON bttest_a USING brin(id);
52
SELECT bt_index_parent_check('bttest_a_brin_idx');
53
ROLLBACK;
54

55
-- normal check outside of xact
56
SELECT bt_index_check('bttest_a_idx');
57
-- more expansive tests
58
SELECT bt_index_check('bttest_a_idx', true);
59
SELECT bt_index_parent_check('bttest_b_idx', true);
60

61
BEGIN;
62
SELECT bt_index_check('bttest_a_idx');
63
SELECT bt_index_parent_check('bttest_b_idx');
64
-- make sure we don't have any leftover locks
65
SELECT * FROM pg_locks
66
WHERE relation = ANY(ARRAY['bttest_a', 'bttest_a_idx', 'bttest_b', 'bttest_b_idx']::regclass[])
67
    AND pid = pg_backend_pid();
68
COMMIT;
69

70
-- normal check outside of xact for index with included columns
71
SELECT bt_index_check('bttest_multi_idx');
72
-- more expansive test for index with included columns
73
SELECT bt_index_parent_check('bttest_multi_idx', true);
74

75
-- repeat expansive test for index built using insertions
76
TRUNCATE bttest_multi;
77
INSERT INTO bttest_multi SELECT i, i%2  FROM generate_series(1, 100000) as i;
78
SELECT bt_index_parent_check('bttest_multi_idx', true);
79

80
--
81
-- Test for multilevel page deletion/downlink present checks
82
--
83
INSERT INTO delete_test_table SELECT i, 1, 2, 3 FROM generate_series(1,80000) i;
84
ALTER TABLE delete_test_table ADD PRIMARY KEY (a,b,c,d);
85
DELETE FROM delete_test_table WHERE a > 40000;
86
VACUUM delete_test_table;
87
DELETE FROM delete_test_table WHERE a > 10;
88
VACUUM delete_test_table;
89
SELECT 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
--
95
CREATE TABLE toast_bug(buggy text);
96
ALTER TABLE toast_bug ALTER COLUMN buggy SET STORAGE extended;
97
CREATE INDEX toasty ON toast_bug(buggy);
98

99
-- pg_attribute entry for toasty.buggy (the index) will have plain storage:
100
UPDATE pg_attribute SET attstorage = 'p'
101
WHERE attrelid = 'toasty'::regclass AND attname = 'buggy';
102

103
-- Whereas pg_attribute entry for toast_bug.buggy (the table) still has extended storage:
104
SELECT attstorage FROM pg_attribute
105
WHERE attrelid = 'toast_bug'::regclass AND attname = 'buggy';
106

107
-- Insert compressible heap tuple (comfortably exceeds TOAST_TUPLE_THRESHOLD):
108
INSERT INTO toast_bug SELECT repeat('a', 2200);
109
-- Should not get false positive report of corruption:
110
SELECT bt_index_check('toasty', true);
111

112
--
113
-- Check that index expressions and predicates are run as the table's owner
114
--
115
TRUNCATE bttest_a;
116
INSERT INTO bttest_a SELECT * FROM generate_series(1, 1000);
117
ALTER TABLE bttest_a OWNER TO regress_bttest_role;
118
-- A dummy index function checking current_user
119
CREATE FUNCTION ifun(int8) RETURNS int8 AS $$
120
BEGIN
121
	ASSERT current_user = 'regress_bttest_role',
122
		format('ifun(%s) called by %s', $1, current_user);
123
	RETURN $1;
124
END;
125
$$ LANGUAGE plpgsql IMMUTABLE;
126

127
CREATE INDEX bttest_a_expr_idx ON bttest_a ((ifun(id) + ifun(0)))
128
	WHERE ifun(id + 10) > ifun(10);
129

130
SELECT bt_index_check('bttest_a_expr_idx', true);
131

132
-- cleanup
133
DROP TABLE bttest_a;
134
DROP TABLE bttest_b;
135
DROP TABLE bttest_multi;
136
DROP TABLE delete_test_table;
137
DROP TABLE toast_bug;
138
DROP FUNCTION ifun(int8);
139
DROP OWNED BY regress_bttest_role; -- permissions
140
DROP ROLE regress_bttest_role;
141

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.