-- predictability SET synchronous_commit = on; SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot', 'test_decoding'); ?column? ---------- init (1 row) CREATE TABLE test_prepared1(id int); CREATE TABLE test_prepared2(id int); -- test simple successful use of a prepared xact BEGIN; INSERT INTO test_prepared1 VALUES (1); PREPARE TRANSACTION 'test_prepared#1'; COMMIT PREPARED 'test_prepared#1'; INSERT INTO test_prepared1 VALUES (2); -- test abort of a prepared xact BEGIN; INSERT INTO test_prepared1 VALUES (3); PREPARE TRANSACTION 'test_prepared#2'; ROLLBACK PREPARED 'test_prepared#2'; INSERT INTO test_prepared1 VALUES (4); -- test prepared xact containing ddl BEGIN; INSERT INTO test_prepared1 VALUES (5); ALTER TABLE test_prepared1 ADD COLUMN data text; INSERT INTO test_prepared1 VALUES (6, 'frakbar'); PREPARE TRANSACTION 'test_prepared#3'; -- test that we decode correctly while an uncommitted prepared xact -- with ddl exists. -- separate table because of the lock from the ALTER -- this will come before the '5' row above, as this commits before it. INSERT INTO test_prepared2 VALUES (7); COMMIT PREPARED 'test_prepared#3'; -- make sure stuff still works INSERT INTO test_prepared1 VALUES (8); INSERT INTO test_prepared2 VALUES (9); -- cleanup DROP TABLE test_prepared1; DROP TABLE test_prepared2; -- show results SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1'); data ------------------------------------------------------------------------- BEGIN table public.test_prepared1: INSERT: id[integer]:1 COMMIT BEGIN table public.test_prepared1: INSERT: id[integer]:2 COMMIT BEGIN table public.test_prepared1: INSERT: id[integer]:4 COMMIT BEGIN table public.test_prepared2: INSERT: id[integer]:7 COMMIT BEGIN table public.test_prepared1: INSERT: id[integer]:5 table public.test_prepared1: INSERT: id[integer]:6 data[text]:'frakbar' COMMIT BEGIN table public.test_prepared1: INSERT: id[integer]:8 data[text]:null COMMIT BEGIN table public.test_prepared2: INSERT: id[integer]:9 COMMIT (22 rows) SELECT pg_drop_replication_slot('regression_slot'); pg_drop_replication_slot -------------------------- (1 row)