1d540f44创建于 2021年9月23日历史提交
-- 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;