2 SET synchronous_commit = on;
4 DROP TABLE IF EXISTS replication_example;
6 -- Ensure there's tables with toast datums. To do so, we dynamically
7 -- create a function returning a large textblob. We want tables of
8 -- different kinds: mapped catalog table, unmapped catalog table,
9 -- shared catalog table and usertable.
10 CREATE FUNCTION exec(text) returns void language plpgsql volatile
16 CREATE ROLE regress_justforcomments NOLOGIN;
19 format($outer$CREATE FUNCTION iamalongfunction() RETURNS TEXT IMMUTABLE LANGUAGE SQL AS $f$SELECT text %L$f$$outer$,
20 (SELECT repeat(string_agg(to_char(g.i, 'FM0000'), ''), 50) FROM generate_series(1, 500) g(i))));
22 format($outer$COMMENT ON FUNCTION iamalongfunction() IS %L$outer$,
25 format($outer$COMMENT ON ROLE REGRESS_JUSTFORCOMMENTS IS %L$outer$,
27 CREATE TABLE iamalargetable AS SELECT iamalongfunction() longfunctionoutput;
30 SELECT pg_relation_size((SELECT reltoastrelid FROM pg_class WHERE oid = 'pg_proc'::regclass)) > 0;
31 SELECT pg_relation_size((SELECT reltoastrelid FROM pg_class WHERE oid = 'pg_description'::regclass)) > 0;
32 SELECT pg_relation_size((SELECT reltoastrelid FROM pg_class WHERE oid = 'pg_shdescription'::regclass)) > 0;
35 SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot', 'test_decoding');
36 CREATE TABLE replication_example(id SERIAL PRIMARY KEY, somedata int, text varchar(120));
37 INSERT INTO replication_example(somedata) VALUES (1);
38 SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1');
41 INSERT INTO replication_example(somedata) VALUES (2);
42 ALTER TABLE replication_example ADD COLUMN testcolumn1 int;
43 INSERT INTO replication_example(somedata, testcolumn1) VALUES (3, 1);
47 INSERT INTO replication_example(somedata) VALUES (3);
48 ALTER TABLE replication_example ADD COLUMN testcolumn2 int;
49 INSERT INTO replication_example(somedata, testcolumn1, testcolumn2) VALUES (4, 2, 1);
55 VACUUM FULL pg_opclass;
58 VACUUM FULL pg_database;
60 -- repeated rewrites that fail
62 CLUSTER pg_class USING pg_class_oid_index;
63 CLUSTER pg_class USING pg_class_oid_index;
66 -- repeated rewrites that succeed
68 CLUSTER pg_class USING pg_class_oid_index;
69 CLUSTER pg_class USING pg_class_oid_index;
70 CLUSTER pg_class USING pg_class_oid_index;
73 -- repeated rewrites in different transactions
77 -- reindexing of important relations / indexes
78 REINDEX TABLE pg_class;
79 REINDEX INDEX pg_class_oid_index;
80 REINDEX INDEX pg_class_tblspc_relfilenode_index;
82 INSERT INTO replication_example(somedata, testcolumn1) VALUES (5, 3);
85 INSERT INTO replication_example(somedata, testcolumn1) VALUES (6, 4);
86 ALTER TABLE replication_example ADD COLUMN testcolumn3 int;
87 INSERT INTO replication_example(somedata, testcolumn1, testcolumn3) VALUES (7, 5, 1);
90 -- make old files go away
93 SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1');
95 -- trigger repeated rewrites of a system catalog with a toast table,
96 -- that previously was buggy: 20180914021046.oi7dm4ra3ot2g2kt@alap3.anarazel.de
97 VACUUM FULL pg_proc; VACUUM FULL pg_description; VACUUM FULL pg_shdescription; VACUUM FULL iamalargetable;
98 INSERT INTO replication_example(somedata, testcolumn1, testcolumn3) VALUES (8, 6, 1);
99 VACUUM FULL pg_proc; VACUUM FULL pg_description; VACUUM FULL pg_shdescription; VACUUM FULL iamalargetable;
100 INSERT INTO replication_example(somedata, testcolumn1, testcolumn3) VALUES (9, 7, 1);
101 SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1');
103 SELECT pg_drop_replication_slot('regression_slot');
104 DROP TABLE IF EXISTS replication_example;
105 DROP FUNCTION iamalongfunction();
106 DROP FUNCTION exec(text);
107 DROP ROLE regress_justforcomments;