-- predictability
SET synchronous_commit = on;
-- fail because we're creating a slot while in an xact with xid
START TRANSACTION;
create table t1(id int)with(storage_type = ustore);
SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot', 'mppdb_decoding');
WARNING: replicationSlotMinLSN is InvalidXLogRecPtr!!!
WARNING: replicationSlotMaxLSN is InvalidXLogRecPtr!!!
ERROR: cannot create logical replication slot in transaction that has performed writes
ROLLBACK;
-- fail because we're creating a slot while in an subxact whose topxact has a xid
START TRANSACTION;
create table t1(id int)with(storage_type = ustore);
SAVEPOINT barf;
SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot', 'mppdb_decoding');
WARNING: replicationSlotMinLSN is InvalidXLogRecPtr!!!
WARNING: replicationSlotMaxLSN is InvalidXLogRecPtr!!!
ERROR: cannot create logical replication slot in transaction that has performed writes
ROLLBACK TO SAVEPOINT barf;
ROLLBACK;
-- succeed, outside tx.
SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot', 'mppdb_decoding');
?column?
----------
init
(1 row)
SELECT 'stop' FROM pg_drop_replication_slot('regression_slot');
WARNING: replicationSlotMinLSN is InvalidXLogRecPtr!!!
WARNING: replicationSlotMaxLSN is InvalidXLogRecPtr!!!
?column?
----------
stop
(1 row)
-- succeed, in tx without xid.
START TRANSACTION;
SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot', 'mppdb_decoding');
?column?
----------
init
(1 row)
COMMIT;
CREATE TABLE nobarf(id serial primary key, data text);
NOTICE: CREATE TABLE will create implicit sequence "nobarf_id_seq" for serial column "nobarf.id"
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "nobarf_pkey" for table "nobarf"
INSERT INTO nobarf(data) VALUES('1');
-- decoding works in transaction with xid
START TRANSACTION;
create table t1(id int)with(storage_type = ustore);
-- don't show yet, haven't committed
INSERT INTO nobarf(data) VALUES('2');
SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1');
--?.*
--?.*
BEGIN
{"table_name":"public.nobarf","op_type":"INSERT","columns_name":["id","data"],"columns_type":["integer","text"],"columns_val":["1","'1'"],"old_keys_name":[],"old_keys_type":[],"old_keys_val":[]}
--?.*
(3 rows)
COMMIT;
INSERT INTO nobarf(data) VALUES('3');
SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1');
--?.*
--?.*
BEGIN
{"table_name":"public.nobarf","op_type":"INSERT","columns_name":["id","data"],"columns_type":["integer","text"],"columns_val":["3","'3'"],"old_keys_name":[],"old_keys_type":[],"old_keys_val":[]}
--?.*
(3 rows)
SELECT 'stop' FROM pg_drop_replication_slot('regression_slot');
WARNING: replicationSlotMinLSN is InvalidXLogRecPtr!!!
WARNING: replicationSlotMaxLSN is InvalidXLogRecPtr!!!
?column?
----------
stop
(1 row)
drop table t1;
drop table nobarf;