-- predictability SET synchronous_commit = on; DROP TABLE IF EXISTS replication_example; -- Ensure there's tables with toast datums. To do so, we dynamically -- create a function returning a large textblob. We want tables of -- different kinds: mapped catalog table, unmapped catalog table, -- shared catalog table and usertable. CREATE FUNCTION exec(text) returns void language plpgsql volatile AS $f$ BEGIN EXECUTE $1; END; $f$; CREATE ROLE regress_justforcomments NOLOGIN; SELECT exec( format($outer$CREATE FUNCTION iamalongfunction() RETURNS TEXT IMMUTABLE LANGUAGE SQL AS $f$SELECT text %L$f$$outer$, (SELECT repeat(string_agg(to_char(g.i, 'FM0000'), ''), 50) FROM generate_series(1, 500) g(i)))); exec ------ (1 row) SELECT exec( format($outer$COMMENT ON FUNCTION iamalongfunction() IS %L$outer$, iamalongfunction())); exec ------ (1 row) SELECT exec( format($outer$COMMENT ON ROLE REGRESS_JUSTFORCOMMENTS IS %L$outer$, iamalongfunction())); exec ------ (1 row) CREATE TABLE iamalargetable AS SELECT iamalongfunction() longfunctionoutput; -- verify toast usage SELECT pg_relation_size((SELECT reltoastrelid FROM pg_class WHERE oid = 'pg_proc'::regclass)) > 0; ?column? ---------- t (1 row) SELECT pg_relation_size((SELECT reltoastrelid FROM pg_class WHERE oid = 'pg_description'::regclass)) > 0; ?column? ---------- t (1 row) SELECT pg_relation_size((SELECT reltoastrelid FROM pg_class WHERE oid = 'pg_shdescription'::regclass)) > 0; ?column? ---------- t (1 row) SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot', 'test_decoding'); ?column? ---------- init (1 row) CREATE TABLE replication_example(id SERIAL PRIMARY KEY, somedata int, text varchar(120)); INSERT INTO replication_example(somedata) VALUES (1); SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); data ---------------------------------------------------------------------------------------------------------- BEGIN table public.replication_example: INSERT: id[integer]:1 somedata[integer]:1 text[character varying]:null COMMIT (3 rows) BEGIN; INSERT INTO replication_example(somedata) VALUES (2); ALTER TABLE replication_example ADD COLUMN testcolumn1 int; INSERT INTO replication_example(somedata, testcolumn1) VALUES (3, 1); COMMIT; BEGIN; INSERT INTO replication_example(somedata) VALUES (3); ALTER TABLE replication_example ADD COLUMN testcolumn2 int; INSERT INTO replication_example(somedata, testcolumn1, testcolumn2) VALUES (4, 2, 1); COMMIT; VACUUM FULL pg_am; VACUUM FULL pg_amop; VACUUM FULL pg_proc; VACUUM FULL pg_opclass; VACUUM FULL pg_type; VACUUM FULL pg_index; VACUUM FULL pg_database; -- repeated rewrites that fail BEGIN; CLUSTER pg_class USING pg_class_oid_index; CLUSTER pg_class USING pg_class_oid_index; ROLLBACK; -- repeated rewrites that succeed BEGIN; CLUSTER pg_class USING pg_class_oid_index; CLUSTER pg_class USING pg_class_oid_index; CLUSTER pg_class USING pg_class_oid_index; COMMIT; -- repeated rewrites in different transactions VACUUM FULL pg_class; VACUUM FULL pg_class; -- reindexing of important relations / indexes REINDEX TABLE pg_class; REINDEX INDEX pg_class_oid_index; REINDEX INDEX pg_class_tblspc_relfilenode_index; INSERT INTO replication_example(somedata, testcolumn1) VALUES (5, 3); BEGIN; INSERT INTO replication_example(somedata, testcolumn1) VALUES (6, 4); ALTER TABLE replication_example ADD COLUMN testcolumn3 int; INSERT INTO replication_example(somedata, testcolumn1, testcolumn3) VALUES (7, 5, 1); COMMIT; -- make old files go away CHECKPOINT; SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); data ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- BEGIN table public.replication_example: INSERT: id[integer]:2 somedata[integer]:2 text[character varying]:null table public.replication_example: INSERT: id[integer]:3 somedata[integer]:3 text[character varying]:null testcolumn1[integer]:1 COMMIT BEGIN table public.replication_example: INSERT: id[integer]:4 somedata[integer]:3 text[character varying]:null testcolumn1[integer]:null table public.replication_example: INSERT: id[integer]:5 somedata[integer]:4 text[character varying]:null testcolumn1[integer]:2 testcolumn2[integer]:1 COMMIT BEGIN table public.replication_example: INSERT: id[integer]:6 somedata[integer]:5 text[character varying]:null testcolumn1[integer]:3 testcolumn2[integer]:null COMMIT BEGIN table public.replication_example: INSERT: id[integer]:7 somedata[integer]:6 text[character varying]:null testcolumn1[integer]:4 testcolumn2[integer]:null table public.replication_example: INSERT: id[integer]:8 somedata[integer]:7 text[character varying]:null testcolumn1[integer]:5 testcolumn2[integer]:null testcolumn3[integer]:1 COMMIT (15 rows) -- trigger repeated rewrites of a system catalog with a toast table, -- that previously was buggy: 20180914021046.oi7dm4ra3ot2g2kt@alap3.anarazel.de VACUUM FULL pg_proc; VACUUM FULL pg_description; VACUUM FULL pg_shdescription; VACUUM FULL iamalargetable; INSERT INTO replication_example(somedata, testcolumn1, testcolumn3) VALUES (8, 6, 1); VACUUM FULL pg_proc; VACUUM FULL pg_description; VACUUM FULL pg_shdescription; VACUUM FULL iamalargetable; INSERT INTO replication_example(somedata, testcolumn1, testcolumn3) VALUES (9, 7, 1); SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); data ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- BEGIN table public.replication_example: INSERT: id[integer]:9 somedata[integer]:8 text[character varying]:null testcolumn1[integer]:6 testcolumn2[integer]:null testcolumn3[integer]:1 COMMIT BEGIN table public.replication_example: INSERT: id[integer]:10 somedata[integer]:9 text[character varying]:null testcolumn1[integer]:7 testcolumn2[integer]:null testcolumn3[integer]:1 COMMIT (6 rows) SELECT pg_drop_replication_slot('regression_slot'); pg_drop_replication_slot -------------------------- (1 row) DROP TABLE IF EXISTS replication_example; DROP FUNCTION iamalongfunction(); DROP FUNCTION exec(text); DROP ROLE regress_justforcomments;