mirror of
https://github.com/postgres/postgres.git
synced 2025-07-27 12:41:57 +03:00
Introduce logical decoding.
This feature, building on previous commits, allows the write-ahead log stream to be decoded into a series of logical changes; that is, inserts, updates, and deletes and the transactions which contain them. It is capable of handling decoding even across changes to the schema of the effected tables. The output format is controlled by a so-called "output plugin"; an example is included. To make use of this in a real replication system, the output plugin will need to be modified to produce output in the format appropriate to that system, and to perform filtering. Currently, information can be extracted from the logical decoding system only via SQL; future commits will add the ability to stream changes via walsender. Andres Freund, with review and other contributions from many other people, including Álvaro Herrera, Abhijit Menon-Sen, Peter Gheogegan, Kevin Grittner, Robert Haas, Heikki Linnakangas, Fujii Masao, Abhijit Menon-Sen, Michael Paquier, Simon Riggs, Craig Ringer, and Steve Singer.
This commit is contained in:
35
contrib/test_decoding/expected/binary.out
Normal file
35
contrib/test_decoding/expected/binary.out
Normal file
@ -0,0 +1,35 @@
|
||||
-- predictability
|
||||
SET synchronous_commit = on;
|
||||
SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot', 'test_decoding');
|
||||
?column?
|
||||
----------
|
||||
init
|
||||
(1 row)
|
||||
|
||||
-- succeeds, textual plugin, textual consumer
|
||||
SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'force-binary', '0');
|
||||
data
|
||||
------
|
||||
(0 rows)
|
||||
|
||||
-- fails, binary plugin, textual consumer
|
||||
SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'force-binary', '1');
|
||||
ERROR: output plugin cannot produce text output
|
||||
-- succeeds, textual plugin, binary consumer
|
||||
SELECT data FROM pg_logical_slot_get_binary_changes('regression_slot', NULL, NULL, 'force-binary', '0');
|
||||
data
|
||||
------
|
||||
(0 rows)
|
||||
|
||||
-- succeeds, binary plugin, binary consumer
|
||||
SELECT data FROM pg_logical_slot_get_binary_changes('regression_slot', NULL, NULL, 'force-binary', '1');
|
||||
data
|
||||
------
|
||||
(0 rows)
|
||||
|
||||
SELECT 'init' FROM pg_drop_replication_slot('regression_slot');
|
||||
?column?
|
||||
----------
|
||||
init
|
||||
(1 row)
|
||||
|
733
contrib/test_decoding/expected/concurrent_ddl_dml.out
Normal file
733
contrib/test_decoding/expected/concurrent_ddl_dml.out
Normal file
@ -0,0 +1,733 @@
|
||||
Parsed test spec with 2 sessions
|
||||
|
||||
starting permutation: s1_init s1_begin s1_insert_tbl1 s2_alter_tbl2_float s1_insert_tbl2 s1_commit s2_get_changes
|
||||
step s1_init: SELECT 'init' FROM pg_create_logical_replication_slot('isolation_slot', 'test_decoding');
|
||||
?column?
|
||||
|
||||
init
|
||||
step s1_begin: BEGIN;
|
||||
step s1_insert_tbl1: INSERT INTO tbl1 (val1, val2) VALUES (1, 1);
|
||||
step s2_alter_tbl2_float: ALTER TABLE tbl2 ALTER COLUMN val2 TYPE float;
|
||||
step s1_insert_tbl2: INSERT INTO tbl2 (val1, val2) VALUES (1, 1);
|
||||
step s1_commit: COMMIT;
|
||||
step s2_get_changes: SELECT regexp_replace(data, 'temp_\d+', 'temp') AS data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', '0');
|
||||
data
|
||||
|
||||
BEGIN
|
||||
COMMIT
|
||||
BEGIN
|
||||
table public.tbl1: INSERT: val1[integer]:1 val2[integer]:1
|
||||
table public.tbl2: INSERT: val1[integer]:1 val2[double precision]:1
|
||||
COMMIT
|
||||
?column?
|
||||
|
||||
stop
|
||||
|
||||
starting permutation: s1_init s1_begin s1_insert_tbl1 s2_alter_tbl1_float s1_insert_tbl2 s1_commit s2_get_changes
|
||||
step s1_init: SELECT 'init' FROM pg_create_logical_replication_slot('isolation_slot', 'test_decoding');
|
||||
?column?
|
||||
|
||||
init
|
||||
step s1_begin: BEGIN;
|
||||
step s1_insert_tbl1: INSERT INTO tbl1 (val1, val2) VALUES (1, 1);
|
||||
step s2_alter_tbl1_float: ALTER TABLE tbl1 ALTER COLUMN val2 TYPE float; <waiting ...>
|
||||
step s1_insert_tbl2: INSERT INTO tbl2 (val1, val2) VALUES (1, 1);
|
||||
step s1_commit: COMMIT;
|
||||
step s2_alter_tbl1_float: <... completed>
|
||||
step s2_get_changes: SELECT regexp_replace(data, 'temp_\d+', 'temp') AS data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', '0');
|
||||
data
|
||||
|
||||
BEGIN
|
||||
table public.tbl1: INSERT: val1[integer]:1 val2[integer]:1
|
||||
table public.tbl2: INSERT: val1[integer]:1 val2[integer]:1
|
||||
COMMIT
|
||||
BEGIN
|
||||
table public.pg_temp: INSERT: val1[integer]:1 val2[double precision]:1
|
||||
COMMIT
|
||||
?column?
|
||||
|
||||
stop
|
||||
|
||||
starting permutation: s1_init s1_begin s1_insert_tbl1 s2_alter_tbl2_char s1_insert_tbl2 s1_commit s2_get_changes
|
||||
step s1_init: SELECT 'init' FROM pg_create_logical_replication_slot('isolation_slot', 'test_decoding');
|
||||
?column?
|
||||
|
||||
init
|
||||
step s1_begin: BEGIN;
|
||||
step s1_insert_tbl1: INSERT INTO tbl1 (val1, val2) VALUES (1, 1);
|
||||
step s2_alter_tbl2_char: ALTER TABLE tbl2 ALTER COLUMN val2 TYPE character varying;
|
||||
step s1_insert_tbl2: INSERT INTO tbl2 (val1, val2) VALUES (1, 1);
|
||||
step s1_commit: COMMIT;
|
||||
step s2_get_changes: SELECT regexp_replace(data, 'temp_\d+', 'temp') AS data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', '0');
|
||||
data
|
||||
|
||||
BEGIN
|
||||
COMMIT
|
||||
BEGIN
|
||||
table public.tbl1: INSERT: val1[integer]:1 val2[integer]:1
|
||||
table public.tbl2: INSERT: val1[integer]:1 val2[character varying]:'1'
|
||||
COMMIT
|
||||
?column?
|
||||
|
||||
stop
|
||||
|
||||
starting permutation: s1_init s1_begin s1_insert_tbl1 s2_alter_tbl1_char s1_insert_tbl2 s1_commit s2_get_changes
|
||||
step s1_init: SELECT 'init' FROM pg_create_logical_replication_slot('isolation_slot', 'test_decoding');
|
||||
?column?
|
||||
|
||||
init
|
||||
step s1_begin: BEGIN;
|
||||
step s1_insert_tbl1: INSERT INTO tbl1 (val1, val2) VALUES (1, 1);
|
||||
step s2_alter_tbl1_char: ALTER TABLE tbl1 ALTER COLUMN val2 TYPE character varying; <waiting ...>
|
||||
step s1_insert_tbl2: INSERT INTO tbl2 (val1, val2) VALUES (1, 1);
|
||||
step s1_commit: COMMIT;
|
||||
step s2_alter_tbl1_char: <... completed>
|
||||
step s2_get_changes: SELECT regexp_replace(data, 'temp_\d+', 'temp') AS data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', '0');
|
||||
data
|
||||
|
||||
BEGIN
|
||||
table public.tbl1: INSERT: val1[integer]:1 val2[integer]:1
|
||||
table public.tbl2: INSERT: val1[integer]:1 val2[integer]:1
|
||||
COMMIT
|
||||
BEGIN
|
||||
table public.pg_temp: INSERT: val1[integer]:1 val2[character varying]:'1'
|
||||
COMMIT
|
||||
?column?
|
||||
|
||||
stop
|
||||
|
||||
starting permutation: s1_init s1_begin s1_insert_tbl1 s1_insert_tbl2 s2_alter_tbl1_float s1_commit s2_get_changes
|
||||
step s1_init: SELECT 'init' FROM pg_create_logical_replication_slot('isolation_slot', 'test_decoding');
|
||||
?column?
|
||||
|
||||
init
|
||||
step s1_begin: BEGIN;
|
||||
step s1_insert_tbl1: INSERT INTO tbl1 (val1, val2) VALUES (1, 1);
|
||||
step s1_insert_tbl2: INSERT INTO tbl2 (val1, val2) VALUES (1, 1);
|
||||
step s2_alter_tbl1_float: ALTER TABLE tbl1 ALTER COLUMN val2 TYPE float; <waiting ...>
|
||||
step s1_commit: COMMIT;
|
||||
step s2_alter_tbl1_float: <... completed>
|
||||
step s2_get_changes: SELECT regexp_replace(data, 'temp_\d+', 'temp') AS data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', '0');
|
||||
data
|
||||
|
||||
BEGIN
|
||||
table public.tbl1: INSERT: val1[integer]:1 val2[integer]:1
|
||||
table public.tbl2: INSERT: val1[integer]:1 val2[integer]:1
|
||||
COMMIT
|
||||
BEGIN
|
||||
table public.pg_temp: INSERT: val1[integer]:1 val2[double precision]:1
|
||||
COMMIT
|
||||
?column?
|
||||
|
||||
stop
|
||||
|
||||
starting permutation: s1_init s1_begin s1_insert_tbl1 s1_insert_tbl2 s2_alter_tbl1_char s1_commit s2_get_changes
|
||||
step s1_init: SELECT 'init' FROM pg_create_logical_replication_slot('isolation_slot', 'test_decoding');
|
||||
?column?
|
||||
|
||||
init
|
||||
step s1_begin: BEGIN;
|
||||
step s1_insert_tbl1: INSERT INTO tbl1 (val1, val2) VALUES (1, 1);
|
||||
step s1_insert_tbl2: INSERT INTO tbl2 (val1, val2) VALUES (1, 1);
|
||||
step s2_alter_tbl1_char: ALTER TABLE tbl1 ALTER COLUMN val2 TYPE character varying; <waiting ...>
|
||||
step s1_commit: COMMIT;
|
||||
step s2_alter_tbl1_char: <... completed>
|
||||
step s2_get_changes: SELECT regexp_replace(data, 'temp_\d+', 'temp') AS data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', '0');
|
||||
data
|
||||
|
||||
BEGIN
|
||||
table public.tbl1: INSERT: val1[integer]:1 val2[integer]:1
|
||||
table public.tbl2: INSERT: val1[integer]:1 val2[integer]:1
|
||||
COMMIT
|
||||
BEGIN
|
||||
table public.pg_temp: INSERT: val1[integer]:1 val2[character varying]:'1'
|
||||
COMMIT
|
||||
?column?
|
||||
|
||||
stop
|
||||
|
||||
starting permutation: s1_init s1_begin s1_insert_tbl1 s2_alter_tbl2_float s1_insert_tbl2 s2_alter_tbl1_float s1_commit s2_get_changes
|
||||
step s1_init: SELECT 'init' FROM pg_create_logical_replication_slot('isolation_slot', 'test_decoding');
|
||||
?column?
|
||||
|
||||
init
|
||||
step s1_begin: BEGIN;
|
||||
step s1_insert_tbl1: INSERT INTO tbl1 (val1, val2) VALUES (1, 1);
|
||||
step s2_alter_tbl2_float: ALTER TABLE tbl2 ALTER COLUMN val2 TYPE float;
|
||||
step s1_insert_tbl2: INSERT INTO tbl2 (val1, val2) VALUES (1, 1);
|
||||
step s2_alter_tbl1_float: ALTER TABLE tbl1 ALTER COLUMN val2 TYPE float; <waiting ...>
|
||||
step s1_commit: COMMIT;
|
||||
step s2_alter_tbl1_float: <... completed>
|
||||
step s2_get_changes: SELECT regexp_replace(data, 'temp_\d+', 'temp') AS data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', '0');
|
||||
data
|
||||
|
||||
BEGIN
|
||||
COMMIT
|
||||
BEGIN
|
||||
table public.tbl1: INSERT: val1[integer]:1 val2[integer]:1
|
||||
table public.tbl2: INSERT: val1[integer]:1 val2[double precision]:1
|
||||
COMMIT
|
||||
BEGIN
|
||||
table public.pg_temp: INSERT: val1[integer]:1 val2[double precision]:1
|
||||
COMMIT
|
||||
?column?
|
||||
|
||||
stop
|
||||
|
||||
starting permutation: s1_init s1_begin s1_insert_tbl1 s2_alter_tbl2_char s1_insert_tbl2 s2_alter_tbl1_char s1_commit s2_get_changes
|
||||
step s1_init: SELECT 'init' FROM pg_create_logical_replication_slot('isolation_slot', 'test_decoding');
|
||||
?column?
|
||||
|
||||
init
|
||||
step s1_begin: BEGIN;
|
||||
step s1_insert_tbl1: INSERT INTO tbl1 (val1, val2) VALUES (1, 1);
|
||||
step s2_alter_tbl2_char: ALTER TABLE tbl2 ALTER COLUMN val2 TYPE character varying;
|
||||
step s1_insert_tbl2: INSERT INTO tbl2 (val1, val2) VALUES (1, 1);
|
||||
step s2_alter_tbl1_char: ALTER TABLE tbl1 ALTER COLUMN val2 TYPE character varying; <waiting ...>
|
||||
step s1_commit: COMMIT;
|
||||
step s2_alter_tbl1_char: <... completed>
|
||||
step s2_get_changes: SELECT regexp_replace(data, 'temp_\d+', 'temp') AS data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', '0');
|
||||
data
|
||||
|
||||
BEGIN
|
||||
COMMIT
|
||||
BEGIN
|
||||
table public.tbl1: INSERT: val1[integer]:1 val2[integer]:1
|
||||
table public.tbl2: INSERT: val1[integer]:1 val2[character varying]:'1'
|
||||
COMMIT
|
||||
BEGIN
|
||||
table public.pg_temp: INSERT: val1[integer]:1 val2[character varying]:'1'
|
||||
COMMIT
|
||||
?column?
|
||||
|
||||
stop
|
||||
|
||||
starting permutation: s1_init s2_alter_tbl2_char s1_begin s1_insert_tbl1 s2_alter_tbl2_text s1_insert_tbl2 s1_commit s2_get_changes
|
||||
step s1_init: SELECT 'init' FROM pg_create_logical_replication_slot('isolation_slot', 'test_decoding');
|
||||
?column?
|
||||
|
||||
init
|
||||
step s2_alter_tbl2_char: ALTER TABLE tbl2 ALTER COLUMN val2 TYPE character varying;
|
||||
step s1_begin: BEGIN;
|
||||
step s1_insert_tbl1: INSERT INTO tbl1 (val1, val2) VALUES (1, 1);
|
||||
step s2_alter_tbl2_text: ALTER TABLE tbl2 ALTER COLUMN val2 TYPE text;
|
||||
step s1_insert_tbl2: INSERT INTO tbl2 (val1, val2) VALUES (1, 1);
|
||||
step s1_commit: COMMIT;
|
||||
step s2_get_changes: SELECT regexp_replace(data, 'temp_\d+', 'temp') AS data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', '0');
|
||||
data
|
||||
|
||||
BEGIN
|
||||
COMMIT
|
||||
BEGIN
|
||||
COMMIT
|
||||
BEGIN
|
||||
table public.tbl1: INSERT: val1[integer]:1 val2[integer]:1
|
||||
table public.tbl2: INSERT: val1[integer]:1 val2[text]:'1'
|
||||
COMMIT
|
||||
?column?
|
||||
|
||||
stop
|
||||
|
||||
starting permutation: s1_init s2_alter_tbl2_char s1_begin s1_insert_tbl1 s2_alter_tbl2_text s1_insert_tbl2 s2_alter_tbl1_char s1_commit s2_get_changes
|
||||
step s1_init: SELECT 'init' FROM pg_create_logical_replication_slot('isolation_slot', 'test_decoding');
|
||||
?column?
|
||||
|
||||
init
|
||||
step s2_alter_tbl2_char: ALTER TABLE tbl2 ALTER COLUMN val2 TYPE character varying;
|
||||
step s1_begin: BEGIN;
|
||||
step s1_insert_tbl1: INSERT INTO tbl1 (val1, val2) VALUES (1, 1);
|
||||
step s2_alter_tbl2_text: ALTER TABLE tbl2 ALTER COLUMN val2 TYPE text;
|
||||
step s1_insert_tbl2: INSERT INTO tbl2 (val1, val2) VALUES (1, 1);
|
||||
step s2_alter_tbl1_char: ALTER TABLE tbl1 ALTER COLUMN val2 TYPE character varying; <waiting ...>
|
||||
step s1_commit: COMMIT;
|
||||
step s2_alter_tbl1_char: <... completed>
|
||||
step s2_get_changes: SELECT regexp_replace(data, 'temp_\d+', 'temp') AS data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', '0');
|
||||
data
|
||||
|
||||
BEGIN
|
||||
COMMIT
|
||||
BEGIN
|
||||
COMMIT
|
||||
BEGIN
|
||||
table public.tbl1: INSERT: val1[integer]:1 val2[integer]:1
|
||||
table public.tbl2: INSERT: val1[integer]:1 val2[text]:'1'
|
||||
COMMIT
|
||||
BEGIN
|
||||
table public.pg_temp: INSERT: val1[integer]:1 val2[character varying]:'1'
|
||||
COMMIT
|
||||
?column?
|
||||
|
||||
stop
|
||||
|
||||
starting permutation: s1_init s1_begin s1_insert_tbl1 s2_alter_tbl2_boolean s1_insert_tbl2 s1_commit s2_get_changes
|
||||
step s1_init: SELECT 'init' FROM pg_create_logical_replication_slot('isolation_slot', 'test_decoding');
|
||||
?column?
|
||||
|
||||
init
|
||||
step s1_begin: BEGIN;
|
||||
step s1_insert_tbl1: INSERT INTO tbl1 (val1, val2) VALUES (1, 1);
|
||||
step s2_alter_tbl2_boolean: ALTER TABLE tbl2 ALTER COLUMN val2 TYPE boolean;
|
||||
ERROR: column "val2" cannot be cast automatically to type boolean
|
||||
step s1_insert_tbl2: INSERT INTO tbl2 (val1, val2) VALUES (1, 1);
|
||||
step s1_commit: COMMIT;
|
||||
step s2_get_changes: SELECT regexp_replace(data, 'temp_\d+', 'temp') AS data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', '0');
|
||||
data
|
||||
|
||||
BEGIN
|
||||
table public.tbl1: INSERT: val1[integer]:1 val2[integer]:1
|
||||
table public.tbl2: INSERT: val1[integer]:1 val2[integer]:1
|
||||
COMMIT
|
||||
?column?
|
||||
|
||||
stop
|
||||
|
||||
starting permutation: s1_init s1_begin s1_insert_tbl1 s2_alter_tbl2_boolean s1_insert_tbl2 s2_alter_tbl1_boolean s1_commit s2_get_changes
|
||||
step s1_init: SELECT 'init' FROM pg_create_logical_replication_slot('isolation_slot', 'test_decoding');
|
||||
?column?
|
||||
|
||||
init
|
||||
step s1_begin: BEGIN;
|
||||
step s1_insert_tbl1: INSERT INTO tbl1 (val1, val2) VALUES (1, 1);
|
||||
step s2_alter_tbl2_boolean: ALTER TABLE tbl2 ALTER COLUMN val2 TYPE boolean;
|
||||
ERROR: column "val2" cannot be cast automatically to type boolean
|
||||
step s1_insert_tbl2: INSERT INTO tbl2 (val1, val2) VALUES (1, 1);
|
||||
step s2_alter_tbl1_boolean: ALTER TABLE tbl1 ALTER COLUMN val2 TYPE boolean; <waiting ...>
|
||||
step s1_commit: COMMIT;
|
||||
step s2_alter_tbl1_boolean: <... completed>
|
||||
error in steps s1_commit s2_alter_tbl1_boolean: ERROR: column "val2" cannot be cast automatically to type boolean
|
||||
step s2_get_changes: SELECT regexp_replace(data, 'temp_\d+', 'temp') AS data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', '0');
|
||||
data
|
||||
|
||||
BEGIN
|
||||
table public.tbl1: INSERT: val1[integer]:1 val2[integer]:1
|
||||
table public.tbl2: INSERT: val1[integer]:1 val2[integer]:1
|
||||
COMMIT
|
||||
?column?
|
||||
|
||||
stop
|
||||
|
||||
starting permutation: s1_init s1_begin s1_insert_tbl1 s2_alter_tbl2_add_int s1_insert_tbl2_3col s1_commit s2_get_changes
|
||||
step s1_init: SELECT 'init' FROM pg_create_logical_replication_slot('isolation_slot', 'test_decoding');
|
||||
?column?
|
||||
|
||||
init
|
||||
step s1_begin: BEGIN;
|
||||
step s1_insert_tbl1: INSERT INTO tbl1 (val1, val2) VALUES (1, 1);
|
||||
step s2_alter_tbl2_add_int: ALTER TABLE tbl2 ADD COLUMN val3 INTEGER;
|
||||
step s1_insert_tbl2_3col: INSERT INTO tbl2 (val1, val2, val3) VALUES (1, 1, 1);
|
||||
step s1_commit: COMMIT;
|
||||
step s2_get_changes: SELECT regexp_replace(data, 'temp_\d+', 'temp') AS data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', '0');
|
||||
data
|
||||
|
||||
BEGIN
|
||||
COMMIT
|
||||
BEGIN
|
||||
table public.tbl1: INSERT: val1[integer]:1 val2[integer]:1
|
||||
table public.tbl2: INSERT: val1[integer]:1 val2[integer]:1 val3[integer]:1
|
||||
COMMIT
|
||||
?column?
|
||||
|
||||
stop
|
||||
|
||||
starting permutation: s1_init s1_begin s1_insert_tbl1 s1_insert_tbl2 s1_commit s1_begin s2_alter_tbl2_add_int s1_insert_tbl2_3col s1_commit s2_get_changes
|
||||
step s1_init: SELECT 'init' FROM pg_create_logical_replication_slot('isolation_slot', 'test_decoding');
|
||||
?column?
|
||||
|
||||
init
|
||||
step s1_begin: BEGIN;
|
||||
step s1_insert_tbl1: INSERT INTO tbl1 (val1, val2) VALUES (1, 1);
|
||||
step s1_insert_tbl2: INSERT INTO tbl2 (val1, val2) VALUES (1, 1);
|
||||
step s1_commit: COMMIT;
|
||||
step s1_begin: BEGIN;
|
||||
step s2_alter_tbl2_add_int: ALTER TABLE tbl2 ADD COLUMN val3 INTEGER;
|
||||
step s1_insert_tbl2_3col: INSERT INTO tbl2 (val1, val2, val3) VALUES (1, 1, 1);
|
||||
step s1_commit: COMMIT;
|
||||
step s2_get_changes: SELECT regexp_replace(data, 'temp_\d+', 'temp') AS data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', '0');
|
||||
data
|
||||
|
||||
BEGIN
|
||||
table public.tbl1: INSERT: val1[integer]:1 val2[integer]:1
|
||||
table public.tbl2: INSERT: val1[integer]:1 val2[integer]:1
|
||||
COMMIT
|
||||
BEGIN
|
||||
COMMIT
|
||||
BEGIN
|
||||
table public.tbl2: INSERT: val1[integer]:1 val2[integer]:1 val3[integer]:1
|
||||
COMMIT
|
||||
?column?
|
||||
|
||||
stop
|
||||
|
||||
starting permutation: s1_init s1_begin s1_insert_tbl1 s2_alter_tbl2_add_float s1_insert_tbl2_3col s1_commit s2_get_changes
|
||||
step s1_init: SELECT 'init' FROM pg_create_logical_replication_slot('isolation_slot', 'test_decoding');
|
||||
?column?
|
||||
|
||||
init
|
||||
step s1_begin: BEGIN;
|
||||
step s1_insert_tbl1: INSERT INTO tbl1 (val1, val2) VALUES (1, 1);
|
||||
step s2_alter_tbl2_add_float: ALTER TABLE tbl2 ADD COLUMN val3 FLOAT;
|
||||
step s1_insert_tbl2_3col: INSERT INTO tbl2 (val1, val2, val3) VALUES (1, 1, 1);
|
||||
step s1_commit: COMMIT;
|
||||
step s2_get_changes: SELECT regexp_replace(data, 'temp_\d+', 'temp') AS data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', '0');
|
||||
data
|
||||
|
||||
BEGIN
|
||||
COMMIT
|
||||
BEGIN
|
||||
table public.tbl1: INSERT: val1[integer]:1 val2[integer]:1
|
||||
table public.tbl2: INSERT: val1[integer]:1 val2[integer]:1 val3[double precision]:1
|
||||
COMMIT
|
||||
?column?
|
||||
|
||||
stop
|
||||
|
||||
starting permutation: s1_init s1_begin s1_insert_tbl1 s1_insert_tbl2 s1_commit s1_begin s2_alter_tbl2_add_float s1_insert_tbl2_3col s1_commit s2_get_changes
|
||||
step s1_init: SELECT 'init' FROM pg_create_logical_replication_slot('isolation_slot', 'test_decoding');
|
||||
?column?
|
||||
|
||||
init
|
||||
step s1_begin: BEGIN;
|
||||
step s1_insert_tbl1: INSERT INTO tbl1 (val1, val2) VALUES (1, 1);
|
||||
step s1_insert_tbl2: INSERT INTO tbl2 (val1, val2) VALUES (1, 1);
|
||||
step s1_commit: COMMIT;
|
||||
step s1_begin: BEGIN;
|
||||
step s2_alter_tbl2_add_float: ALTER TABLE tbl2 ADD COLUMN val3 FLOAT;
|
||||
step s1_insert_tbl2_3col: INSERT INTO tbl2 (val1, val2, val3) VALUES (1, 1, 1);
|
||||
step s1_commit: COMMIT;
|
||||
step s2_get_changes: SELECT regexp_replace(data, 'temp_\d+', 'temp') AS data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', '0');
|
||||
data
|
||||
|
||||
BEGIN
|
||||
table public.tbl1: INSERT: val1[integer]:1 val2[integer]:1
|
||||
table public.tbl2: INSERT: val1[integer]:1 val2[integer]:1
|
||||
COMMIT
|
||||
BEGIN
|
||||
COMMIT
|
||||
BEGIN
|
||||
table public.tbl2: INSERT: val1[integer]:1 val2[integer]:1 val3[double precision]:1
|
||||
COMMIT
|
||||
?column?
|
||||
|
||||
stop
|
||||
|
||||
starting permutation: s1_init s1_begin s1_insert_tbl1 s2_alter_tbl2_add_char s1_insert_tbl2_3col s1_commit s2_get_changes
|
||||
step s1_init: SELECT 'init' FROM pg_create_logical_replication_slot('isolation_slot', 'test_decoding');
|
||||
?column?
|
||||
|
||||
init
|
||||
step s1_begin: BEGIN;
|
||||
step s1_insert_tbl1: INSERT INTO tbl1 (val1, val2) VALUES (1, 1);
|
||||
step s2_alter_tbl2_add_char: ALTER TABLE tbl2 ADD COLUMN val3 character varying;
|
||||
step s1_insert_tbl2_3col: INSERT INTO tbl2 (val1, val2, val3) VALUES (1, 1, 1);
|
||||
step s1_commit: COMMIT;
|
||||
step s2_get_changes: SELECT regexp_replace(data, 'temp_\d+', 'temp') AS data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', '0');
|
||||
data
|
||||
|
||||
BEGIN
|
||||
COMMIT
|
||||
BEGIN
|
||||
table public.tbl1: INSERT: val1[integer]:1 val2[integer]:1
|
||||
table public.tbl2: INSERT: val1[integer]:1 val2[integer]:1 val3[character varying]:'1'
|
||||
COMMIT
|
||||
?column?
|
||||
|
||||
stop
|
||||
|
||||
starting permutation: s1_init s1_begin s1_insert_tbl1 s1_insert_tbl2 s1_commit s1_begin s2_alter_tbl2_add_char s1_insert_tbl2_3col s1_commit s2_get_changes
|
||||
step s1_init: SELECT 'init' FROM pg_create_logical_replication_slot('isolation_slot', 'test_decoding');
|
||||
?column?
|
||||
|
||||
init
|
||||
step s1_begin: BEGIN;
|
||||
step s1_insert_tbl1: INSERT INTO tbl1 (val1, val2) VALUES (1, 1);
|
||||
step s1_insert_tbl2: INSERT INTO tbl2 (val1, val2) VALUES (1, 1);
|
||||
step s1_commit: COMMIT;
|
||||
step s1_begin: BEGIN;
|
||||
step s2_alter_tbl2_add_char: ALTER TABLE tbl2 ADD COLUMN val3 character varying;
|
||||
step s1_insert_tbl2_3col: INSERT INTO tbl2 (val1, val2, val3) VALUES (1, 1, 1);
|
||||
step s1_commit: COMMIT;
|
||||
step s2_get_changes: SELECT regexp_replace(data, 'temp_\d+', 'temp') AS data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', '0');
|
||||
data
|
||||
|
||||
BEGIN
|
||||
table public.tbl1: INSERT: val1[integer]:1 val2[integer]:1
|
||||
table public.tbl2: INSERT: val1[integer]:1 val2[integer]:1
|
||||
COMMIT
|
||||
BEGIN
|
||||
COMMIT
|
||||
BEGIN
|
||||
table public.tbl2: INSERT: val1[integer]:1 val2[integer]:1 val3[character varying]:'1'
|
||||
COMMIT
|
||||
?column?
|
||||
|
||||
stop
|
||||
|
||||
starting permutation: s1_init s2_alter_tbl2_add_int s1_begin s1_insert_tbl2_3col s2_alter_tbl2_drop_3rd_col s1_commit s2_get_changes
|
||||
step s1_init: SELECT 'init' FROM pg_create_logical_replication_slot('isolation_slot', 'test_decoding');
|
||||
?column?
|
||||
|
||||
init
|
||||
step s2_alter_tbl2_add_int: ALTER TABLE tbl2 ADD COLUMN val3 INTEGER;
|
||||
step s1_begin: BEGIN;
|
||||
step s1_insert_tbl2_3col: INSERT INTO tbl2 (val1, val2, val3) VALUES (1, 1, 1);
|
||||
step s2_alter_tbl2_drop_3rd_col: ALTER TABLE tbl2 DROP COLUMN val3; <waiting ...>
|
||||
step s1_commit: COMMIT;
|
||||
step s2_alter_tbl2_drop_3rd_col: <... completed>
|
||||
step s2_get_changes: SELECT regexp_replace(data, 'temp_\d+', 'temp') AS data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', '0');
|
||||
data
|
||||
|
||||
BEGIN
|
||||
COMMIT
|
||||
BEGIN
|
||||
table public.tbl2: INSERT: val1[integer]:1 val2[integer]:1 val3[integer]:1
|
||||
COMMIT
|
||||
BEGIN
|
||||
COMMIT
|
||||
?column?
|
||||
|
||||
stop
|
||||
|
||||
starting permutation: s1_init s2_alter_tbl2_add_int s1_begin s1_insert_tbl2_3col s2_alter_tbl2_drop_3rd_col s1_insert_tbl2 s1_commit s1_insert_tbl2 s2_get_changes
|
||||
step s1_init: SELECT 'init' FROM pg_create_logical_replication_slot('isolation_slot', 'test_decoding');
|
||||
?column?
|
||||
|
||||
init
|
||||
step s2_alter_tbl2_add_int: ALTER TABLE tbl2 ADD COLUMN val3 INTEGER;
|
||||
step s1_begin: BEGIN;
|
||||
step s1_insert_tbl2_3col: INSERT INTO tbl2 (val1, val2, val3) VALUES (1, 1, 1);
|
||||
step s2_alter_tbl2_drop_3rd_col: ALTER TABLE tbl2 DROP COLUMN val3; <waiting ...>
|
||||
step s1_insert_tbl2: INSERT INTO tbl2 (val1, val2) VALUES (1, 1);
|
||||
step s1_commit: COMMIT;
|
||||
step s2_alter_tbl2_drop_3rd_col: <... completed>
|
||||
step s1_insert_tbl2: INSERT INTO tbl2 (val1, val2) VALUES (1, 1);
|
||||
step s2_get_changes: SELECT regexp_replace(data, 'temp_\d+', 'temp') AS data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', '0');
|
||||
data
|
||||
|
||||
BEGIN
|
||||
COMMIT
|
||||
BEGIN
|
||||
table public.tbl2: INSERT: val1[integer]:1 val2[integer]:1 val3[integer]:1
|
||||
table public.tbl2: INSERT: val1[integer]:1 val2[integer]:1 val3[integer]:null
|
||||
COMMIT
|
||||
BEGIN
|
||||
COMMIT
|
||||
BEGIN
|
||||
table public.tbl2: INSERT: val1[integer]:1 val2[integer]:1
|
||||
COMMIT
|
||||
?column?
|
||||
|
||||
stop
|
||||
|
||||
starting permutation: s1_init s2_alter_tbl2_add_int s1_begin s1_insert_tbl2_3col s2_alter_tbl2_drop_3rd_col s1_commit s2_get_changes s2_alter_tbl2_add_text s1_begin s1_insert_tbl2_3col s2_alter_tbl2_3rd_char s1_insert_tbl2_3col s1_commit s2_get_changes s2_alter_tbl2_3rd_int s1_insert_tbl2_3col s2_get_changes
|
||||
step s1_init: SELECT 'init' FROM pg_create_logical_replication_slot('isolation_slot', 'test_decoding');
|
||||
?column?
|
||||
|
||||
init
|
||||
step s2_alter_tbl2_add_int: ALTER TABLE tbl2 ADD COLUMN val3 INTEGER;
|
||||
step s1_begin: BEGIN;
|
||||
step s1_insert_tbl2_3col: INSERT INTO tbl2 (val1, val2, val3) VALUES (1, 1, 1);
|
||||
step s2_alter_tbl2_drop_3rd_col: ALTER TABLE tbl2 DROP COLUMN val3; <waiting ...>
|
||||
step s1_commit: COMMIT;
|
||||
step s2_alter_tbl2_drop_3rd_col: <... completed>
|
||||
step s2_get_changes: SELECT regexp_replace(data, 'temp_\d+', 'temp') AS data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', '0');
|
||||
data
|
||||
|
||||
BEGIN
|
||||
COMMIT
|
||||
BEGIN
|
||||
table public.tbl2: INSERT: val1[integer]:1 val2[integer]:1 val3[integer]:1
|
||||
COMMIT
|
||||
BEGIN
|
||||
COMMIT
|
||||
step s2_alter_tbl2_add_text: ALTER TABLE tbl2 ADD COLUMN val3 TEXT;
|
||||
step s1_begin: BEGIN;
|
||||
step s1_insert_tbl2_3col: INSERT INTO tbl2 (val1, val2, val3) VALUES (1, 1, 1);
|
||||
step s2_alter_tbl2_3rd_char: ALTER TABLE tbl2 ALTER COLUMN val3 TYPE character varying; <waiting ...>
|
||||
step s1_insert_tbl2_3col: INSERT INTO tbl2 (val1, val2, val3) VALUES (1, 1, 1);
|
||||
step s1_commit: COMMIT;
|
||||
step s2_alter_tbl2_3rd_char: <... completed>
|
||||
step s2_get_changes: SELECT regexp_replace(data, 'temp_\d+', 'temp') AS data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', '0');
|
||||
data
|
||||
|
||||
BEGIN
|
||||
COMMIT
|
||||
BEGIN
|
||||
table public.tbl2: INSERT: val1[integer]:1 val2[integer]:1 val3[text]:'1'
|
||||
table public.tbl2: INSERT: val1[integer]:1 val2[integer]:1 val3[text]:'1'
|
||||
COMMIT
|
||||
BEGIN
|
||||
COMMIT
|
||||
step s2_alter_tbl2_3rd_int: ALTER TABLE tbl2 ALTER COLUMN val3 TYPE int USING val3::integer;
|
||||
step s1_insert_tbl2_3col: INSERT INTO tbl2 (val1, val2, val3) VALUES (1, 1, 1);
|
||||
step s2_get_changes: SELECT regexp_replace(data, 'temp_\d+', 'temp') AS data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', '0');
|
||||
data
|
||||
|
||||
BEGIN
|
||||
table public.pg_temp: INSERT: val1[integer]:1 val2[integer]:1 val3[integer]:null
|
||||
table public.pg_temp: INSERT: val1[integer]:1 val2[integer]:1 val3[integer]:1
|
||||
table public.pg_temp: INSERT: val1[integer]:1 val2[integer]:1 val3[integer]:1
|
||||
COMMIT
|
||||
BEGIN
|
||||
table public.tbl2: INSERT: val1[integer]:1 val2[integer]:1 val3[integer]:1
|
||||
COMMIT
|
||||
?column?
|
||||
|
||||
stop
|
||||
|
||||
starting permutation: s1_init s2_alter_tbl2_add_char s1_begin s1_insert_tbl1 s1_insert_tbl2_3col s2_alter_tbl2_3rd_text s1_insert_tbl2_3col s1_commit s1_insert_tbl2_3col s2_get_changes
|
||||
step s1_init: SELECT 'init' FROM pg_create_logical_replication_slot('isolation_slot', 'test_decoding');
|
||||
?column?
|
||||
|
||||
init
|
||||
step s2_alter_tbl2_add_char: ALTER TABLE tbl2 ADD COLUMN val3 character varying;
|
||||
step s1_begin: BEGIN;
|
||||
step s1_insert_tbl1: INSERT INTO tbl1 (val1, val2) VALUES (1, 1);
|
||||
step s1_insert_tbl2_3col: INSERT INTO tbl2 (val1, val2, val3) VALUES (1, 1, 1);
|
||||
step s2_alter_tbl2_3rd_text: ALTER TABLE tbl2 ALTER COLUMN val3 TYPE text; <waiting ...>
|
||||
step s1_insert_tbl2_3col: INSERT INTO tbl2 (val1, val2, val3) VALUES (1, 1, 1);
|
||||
step s1_commit: COMMIT;
|
||||
step s2_alter_tbl2_3rd_text: <... completed>
|
||||
step s1_insert_tbl2_3col: INSERT INTO tbl2 (val1, val2, val3) VALUES (1, 1, 1);
|
||||
step s2_get_changes: SELECT regexp_replace(data, 'temp_\d+', 'temp') AS data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', '0');
|
||||
data
|
||||
|
||||
BEGIN
|
||||
COMMIT
|
||||
BEGIN
|
||||
table public.tbl1: INSERT: val1[integer]:1 val2[integer]:1
|
||||
table public.tbl2: INSERT: val1[integer]:1 val2[integer]:1 val3[character varying]:'1'
|
||||
table public.tbl2: INSERT: val1[integer]:1 val2[integer]:1 val3[character varying]:'1'
|
||||
COMMIT
|
||||
BEGIN
|
||||
COMMIT
|
||||
BEGIN
|
||||
table public.tbl2: INSERT: val1[integer]:1 val2[integer]:1 val3[text]:'1'
|
||||
COMMIT
|
||||
?column?
|
||||
|
||||
stop
|
||||
|
||||
starting permutation: s1_init s2_alter_tbl2_add_text s1_begin s1_insert_tbl1 s1_insert_tbl2_3col s2_alter_tbl2_3rd_char s1_insert_tbl2_3col s1_commit s1_insert_tbl2_3col s2_get_changes
|
||||
step s1_init: SELECT 'init' FROM pg_create_logical_replication_slot('isolation_slot', 'test_decoding');
|
||||
?column?
|
||||
|
||||
init
|
||||
step s2_alter_tbl2_add_text: ALTER TABLE tbl2 ADD COLUMN val3 TEXT;
|
||||
step s1_begin: BEGIN;
|
||||
step s1_insert_tbl1: INSERT INTO tbl1 (val1, val2) VALUES (1, 1);
|
||||
step s1_insert_tbl2_3col: INSERT INTO tbl2 (val1, val2, val3) VALUES (1, 1, 1);
|
||||
step s2_alter_tbl2_3rd_char: ALTER TABLE tbl2 ALTER COLUMN val3 TYPE character varying; <waiting ...>
|
||||
step s1_insert_tbl2_3col: INSERT INTO tbl2 (val1, val2, val3) VALUES (1, 1, 1);
|
||||
step s1_commit: COMMIT;
|
||||
step s2_alter_tbl2_3rd_char: <... completed>
|
||||
step s1_insert_tbl2_3col: INSERT INTO tbl2 (val1, val2, val3) VALUES (1, 1, 1);
|
||||
step s2_get_changes: SELECT regexp_replace(data, 'temp_\d+', 'temp') AS data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', '0');
|
||||
data
|
||||
|
||||
BEGIN
|
||||
COMMIT
|
||||
BEGIN
|
||||
table public.tbl1: INSERT: val1[integer]:1 val2[integer]:1
|
||||
table public.tbl2: INSERT: val1[integer]:1 val2[integer]:1 val3[text]:'1'
|
||||
table public.tbl2: INSERT: val1[integer]:1 val2[integer]:1 val3[text]:'1'
|
||||
COMMIT
|
||||
BEGIN
|
||||
COMMIT
|
||||
BEGIN
|
||||
table public.tbl2: INSERT: val1[integer]:1 val2[integer]:1 val3[character varying]:'1'
|
||||
COMMIT
|
||||
?column?
|
||||
|
||||
stop
|
||||
|
||||
starting permutation: s1_init s2_alter_tbl2_add_char s1_begin s1_insert_tbl1 s2_alter_tbl2_3rd_text s1_insert_tbl2_3col s1_commit s2_alter_tbl2_drop_3rd_col s1_insert_tbl2 s2_get_changes
|
||||
step s1_init: SELECT 'init' FROM pg_create_logical_replication_slot('isolation_slot', 'test_decoding');
|
||||
?column?
|
||||
|
||||
init
|
||||
step s2_alter_tbl2_add_char: ALTER TABLE tbl2 ADD COLUMN val3 character varying;
|
||||
step s1_begin: BEGIN;
|
||||
step s1_insert_tbl1: INSERT INTO tbl1 (val1, val2) VALUES (1, 1);
|
||||
step s2_alter_tbl2_3rd_text: ALTER TABLE tbl2 ALTER COLUMN val3 TYPE text;
|
||||
step s1_insert_tbl2_3col: INSERT INTO tbl2 (val1, val2, val3) VALUES (1, 1, 1);
|
||||
step s1_commit: COMMIT;
|
||||
step s2_alter_tbl2_drop_3rd_col: ALTER TABLE tbl2 DROP COLUMN val3;
|
||||
step s1_insert_tbl2: INSERT INTO tbl2 (val1, val2) VALUES (1, 1);
|
||||
step s2_get_changes: SELECT regexp_replace(data, 'temp_\d+', 'temp') AS data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', '0');
|
||||
data
|
||||
|
||||
BEGIN
|
||||
COMMIT
|
||||
BEGIN
|
||||
COMMIT
|
||||
BEGIN
|
||||
table public.tbl1: INSERT: val1[integer]:1 val2[integer]:1
|
||||
table public.tbl2: INSERT: val1[integer]:1 val2[integer]:1 val3[text]:'1'
|
||||
COMMIT
|
||||
BEGIN
|
||||
COMMIT
|
||||
BEGIN
|
||||
table public.tbl2: INSERT: val1[integer]:1 val2[integer]:1
|
||||
COMMIT
|
||||
?column?
|
||||
|
||||
stop
|
||||
|
||||
starting permutation: s1_init s2_alter_tbl2_add_text s1_begin s1_insert_tbl1 s2_alter_tbl2_3rd_char s1_insert_tbl2_3col s1_commit s2_alter_tbl2_drop_3rd_col s1_insert_tbl2 s2_get_changes
|
||||
step s1_init: SELECT 'init' FROM pg_create_logical_replication_slot('isolation_slot', 'test_decoding');
|
||||
?column?
|
||||
|
||||
init
|
||||
step s2_alter_tbl2_add_text: ALTER TABLE tbl2 ADD COLUMN val3 TEXT;
|
||||
step s1_begin: BEGIN;
|
||||
step s1_insert_tbl1: INSERT INTO tbl1 (val1, val2) VALUES (1, 1);
|
||||
step s2_alter_tbl2_3rd_char: ALTER TABLE tbl2 ALTER COLUMN val3 TYPE character varying;
|
||||
step s1_insert_tbl2_3col: INSERT INTO tbl2 (val1, val2, val3) VALUES (1, 1, 1);
|
||||
step s1_commit: COMMIT;
|
||||
step s2_alter_tbl2_drop_3rd_col: ALTER TABLE tbl2 DROP COLUMN val3;
|
||||
step s1_insert_tbl2: INSERT INTO tbl2 (val1, val2) VALUES (1, 1);
|
||||
step s2_get_changes: SELECT regexp_replace(data, 'temp_\d+', 'temp') AS data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', '0');
|
||||
data
|
||||
|
||||
BEGIN
|
||||
COMMIT
|
||||
BEGIN
|
||||
COMMIT
|
||||
BEGIN
|
||||
table public.tbl1: INSERT: val1[integer]:1 val2[integer]:1
|
||||
table public.tbl2: INSERT: val1[integer]:1 val2[integer]:1 val3[character varying]:'1'
|
||||
COMMIT
|
||||
BEGIN
|
||||
COMMIT
|
||||
BEGIN
|
||||
table public.tbl2: INSERT: val1[integer]:1 val2[integer]:1
|
||||
COMMIT
|
||||
?column?
|
||||
|
||||
stop
|
||||
|
||||
starting permutation: s1_init s2_alter_tbl2_add_char s1_begin s1_insert_tbl1 s2_alter_tbl2_drop_3rd_col s1_insert_tbl1 s1_commit s2_get_changes
|
||||
step s1_init: SELECT 'init' FROM pg_create_logical_replication_slot('isolation_slot', 'test_decoding');
|
||||
?column?
|
||||
|
||||
init
|
||||
step s2_alter_tbl2_add_char: ALTER TABLE tbl2 ADD COLUMN val3 character varying;
|
||||
step s1_begin: BEGIN;
|
||||
step s1_insert_tbl1: INSERT INTO tbl1 (val1, val2) VALUES (1, 1);
|
||||
step s2_alter_tbl2_drop_3rd_col: ALTER TABLE tbl2 DROP COLUMN val3;
|
||||
step s1_insert_tbl1: INSERT INTO tbl1 (val1, val2) VALUES (1, 1);
|
||||
step s1_commit: COMMIT;
|
||||
step s2_get_changes: SELECT regexp_replace(data, 'temp_\d+', 'temp') AS data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', '0');
|
||||
data
|
||||
|
||||
BEGIN
|
||||
COMMIT
|
||||
BEGIN
|
||||
COMMIT
|
||||
BEGIN
|
||||
table public.tbl1: INSERT: val1[integer]:1 val2[integer]:1
|
||||
table public.tbl1: INSERT: val1[integer]:1 val2[integer]:1
|
||||
COMMIT
|
||||
?column?
|
||||
|
||||
stop
|
651
contrib/test_decoding/expected/ddl.out
Normal file
651
contrib/test_decoding/expected/ddl.out
Normal file
File diff suppressed because one or more lines are too long
89
contrib/test_decoding/expected/decoding_in_xact.out
Normal file
89
contrib/test_decoding/expected/decoding_in_xact.out
Normal file
@ -0,0 +1,89 @@
|
||||
-- predictability
|
||||
SET synchronous_commit = on;
|
||||
-- fail because we're creating a slot while in an xact with xid
|
||||
BEGIN;
|
||||
SELECT txid_current() = 0;
|
||||
?column?
|
||||
----------
|
||||
f
|
||||
(1 row)
|
||||
|
||||
SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot', 'test_decoding');
|
||||
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
|
||||
BEGIN;
|
||||
SELECT txid_current() = 0;
|
||||
?column?
|
||||
----------
|
||||
f
|
||||
(1 row)
|
||||
|
||||
SAVEPOINT barf;
|
||||
SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot', 'test_decoding');
|
||||
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', 'test_decoding');
|
||||
?column?
|
||||
----------
|
||||
init
|
||||
(1 row)
|
||||
|
||||
SELECT 'stop' FROM pg_drop_replication_slot('regression_slot');
|
||||
?column?
|
||||
----------
|
||||
stop
|
||||
(1 row)
|
||||
|
||||
-- succeed, in tx without xid.
|
||||
BEGIN;
|
||||
SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot', 'test_decoding');
|
||||
?column?
|
||||
----------
|
||||
init
|
||||
(1 row)
|
||||
|
||||
COMMIT;
|
||||
CREATE TABLE nobarf(id serial primary key, data text);
|
||||
INSERT INTO nobarf(data) VALUES('1');
|
||||
-- decoding works in transaction with xid
|
||||
BEGIN;
|
||||
SELECT txid_current() = 0;
|
||||
?column?
|
||||
----------
|
||||
f
|
||||
(1 row)
|
||||
|
||||
-- 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');
|
||||
data
|
||||
-----------------------------------------------------------
|
||||
BEGIN
|
||||
COMMIT
|
||||
BEGIN
|
||||
table public.nobarf: INSERT: id[integer]:1 data[text]:'1'
|
||||
COMMIT
|
||||
(5 rows)
|
||||
|
||||
COMMIT;
|
||||
INSERT INTO nobarf(data) VALUES('3');
|
||||
SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0');
|
||||
data
|
||||
-----------------------------------------------------------
|
||||
BEGIN
|
||||
table public.nobarf: INSERT: id[integer]:2 data[text]:'2'
|
||||
COMMIT
|
||||
BEGIN
|
||||
table public.nobarf: INSERT: id[integer]:3 data[text]:'3'
|
||||
COMMIT
|
||||
(6 rows)
|
||||
|
||||
SELECT 'stop' FROM pg_drop_replication_slot('regression_slot');
|
||||
?column?
|
||||
----------
|
||||
stop
|
||||
(1 row)
|
||||
|
38
contrib/test_decoding/expected/delayed_startup.out
Normal file
38
contrib/test_decoding/expected/delayed_startup.out
Normal file
@ -0,0 +1,38 @@
|
||||
Parsed test spec with 2 sessions
|
||||
|
||||
starting permutation: s1b s1w s2init s1c s2start s1b s1w s1c s2start s1b s1w s2start s1c s2start
|
||||
step s1b: BEGIN ISOLATION LEVEL SERIALIZABLE;
|
||||
step s1w: INSERT INTO do_write DEFAULT VALUES;
|
||||
step s2init: SELECT 'init' FROM pg_create_logical_replication_slot('isolation_slot', 'test_decoding'); <waiting ...>
|
||||
step s1c: COMMIT;
|
||||
step s2init: <... completed>
|
||||
?column?
|
||||
|
||||
init
|
||||
step s2start: SELECT data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', 'false');
|
||||
data
|
||||
|
||||
step s1b: BEGIN ISOLATION LEVEL SERIALIZABLE;
|
||||
step s1w: INSERT INTO do_write DEFAULT VALUES;
|
||||
step s1c: COMMIT;
|
||||
step s2start: SELECT data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', 'false');
|
||||
data
|
||||
|
||||
BEGIN
|
||||
table public.do_write: INSERT: id[integer]:2
|
||||
COMMIT
|
||||
step s1b: BEGIN ISOLATION LEVEL SERIALIZABLE;
|
||||
step s1w: INSERT INTO do_write DEFAULT VALUES;
|
||||
step s2start: SELECT data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', 'false');
|
||||
data
|
||||
|
||||
step s1c: COMMIT;
|
||||
step s2start: SELECT data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', 'false');
|
||||
data
|
||||
|
||||
BEGIN
|
||||
table public.do_write: INSERT: id[integer]:3
|
||||
COMMIT
|
||||
?column?
|
||||
|
||||
stop
|
66
contrib/test_decoding/expected/mxact.out
Normal file
66
contrib/test_decoding/expected/mxact.out
Normal file
@ -0,0 +1,66 @@
|
||||
Parsed test spec with 3 sessions
|
||||
|
||||
starting permutation: s0init s0start s1begin s1sharepgclass s2begin s2sharepgclass s0w s0start s2commit s1commit
|
||||
step s0init: SELECT 'init' FROM pg_create_logical_replication_slot('isolation_slot', 'test_decoding');
|
||||
?column?
|
||||
|
||||
init
|
||||
step s0start: SELECT data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', 'false');
|
||||
data
|
||||
|
||||
step s1begin: BEGIN;
|
||||
step s1sharepgclass: SELECT count(*) > 1 FROM (SELECT * FROM pg_class FOR SHARE) s;
|
||||
?column?
|
||||
|
||||
t
|
||||
step s2begin: BEGIN;
|
||||
step s2sharepgclass: SELECT count(*) > 1 FROM (SELECT * FROM pg_class FOR SHARE) s;
|
||||
?column?
|
||||
|
||||
t
|
||||
step s0w: INSERT INTO do_write DEFAULT VALUES;
|
||||
step s0start: SELECT data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', 'false');
|
||||
data
|
||||
|
||||
BEGIN
|
||||
table public.do_write: INSERT: id[integer]:1
|
||||
COMMIT
|
||||
step s2commit: COMMIT;
|
||||
step s1commit: COMMIT;
|
||||
?column?
|
||||
|
||||
stop
|
||||
|
||||
starting permutation: s0init s0start s1begin s1keysharepgclass s2begin s2keysharepgclass s0alter s0w s0start s2commit s1commit
|
||||
step s0init: SELECT 'init' FROM pg_create_logical_replication_slot('isolation_slot', 'test_decoding');
|
||||
?column?
|
||||
|
||||
init
|
||||
step s0start: SELECT data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', 'false');
|
||||
data
|
||||
|
||||
step s1begin: BEGIN;
|
||||
step s1keysharepgclass: SELECT count(*) > 1 FROM (SELECT * FROM pg_class FOR KEY SHARE) s;
|
||||
?column?
|
||||
|
||||
t
|
||||
step s2begin: BEGIN;
|
||||
step s2keysharepgclass: SELECT count(*) > 1 FROM (SELECT * FROM pg_class FOR KEY SHARE) s;
|
||||
?column?
|
||||
|
||||
t
|
||||
step s0alter: ALTER TABLE do_write ADD column ts timestamptz;
|
||||
step s0w: INSERT INTO do_write DEFAULT VALUES;
|
||||
step s0start: SELECT data FROM pg_logical_slot_get_changes('isolation_slot', NULL, NULL, 'include-xids', 'false');
|
||||
data
|
||||
|
||||
BEGIN
|
||||
COMMIT
|
||||
BEGIN
|
||||
table public.do_write: INSERT: id[integer]:1 ts[timestamp with time zone]:null
|
||||
COMMIT
|
||||
step s2commit: COMMIT;
|
||||
step s1commit: COMMIT;
|
||||
?column?
|
||||
|
||||
stop
|
130
contrib/test_decoding/expected/permissions.out
Normal file
130
contrib/test_decoding/expected/permissions.out
Normal file
@ -0,0 +1,130 @@
|
||||
-- predictability
|
||||
SET synchronous_commit = on;
|
||||
-- setup
|
||||
CREATE ROLE lr_normal;
|
||||
CREATE ROLE lr_superuser SUPERUSER;
|
||||
CREATE ROLE lr_replication REPLICATION;
|
||||
CREATE TABLE lr_test(data text);
|
||||
-- superuser can control replication
|
||||
SET ROLE lr_superuser;
|
||||
SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot', 'test_decoding');
|
||||
?column?
|
||||
----------
|
||||
init
|
||||
(1 row)
|
||||
|
||||
INSERT INTO lr_test VALUES('lr_superuser_init');
|
||||
SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0');
|
||||
data
|
||||
--------------------------------------------------------------
|
||||
BEGIN
|
||||
table public.lr_test: INSERT: data[text]:'lr_superuser_init'
|
||||
COMMIT
|
||||
(3 rows)
|
||||
|
||||
SELECT pg_drop_replication_slot('regression_slot');
|
||||
pg_drop_replication_slot
|
||||
--------------------------
|
||||
|
||||
(1 row)
|
||||
|
||||
RESET ROLE;
|
||||
-- replication user can control replication
|
||||
SET ROLE lr_replication;
|
||||
SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot', 'test_decoding');
|
||||
?column?
|
||||
----------
|
||||
init
|
||||
(1 row)
|
||||
|
||||
INSERT INTO lr_test VALUES('lr_superuser_init');
|
||||
ERROR: permission denied for relation lr_test
|
||||
SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0');
|
||||
data
|
||||
------
|
||||
(0 rows)
|
||||
|
||||
SELECT pg_drop_replication_slot('regression_slot');
|
||||
pg_drop_replication_slot
|
||||
--------------------------
|
||||
|
||||
(1 row)
|
||||
|
||||
RESET ROLE;
|
||||
-- plain user *can't* can control replication
|
||||
SET ROLE lr_normal;
|
||||
SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot', 'test_decoding');
|
||||
ERROR: must be superuser or replication role to use replication slots
|
||||
INSERT INTO lr_test VALUES('lr_superuser_init');
|
||||
ERROR: permission denied for relation lr_test
|
||||
SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0');
|
||||
ERROR: must be superuser or replication role to use replication slots
|
||||
SELECT pg_drop_replication_slot('regression_slot');
|
||||
ERROR: must be superuser or replication role to use replication slots
|
||||
RESET ROLE;
|
||||
-- replication users can drop superuser created slots
|
||||
SET ROLE lr_superuser;
|
||||
SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot', 'test_decoding');
|
||||
?column?
|
||||
----------
|
||||
init
|
||||
(1 row)
|
||||
|
||||
RESET ROLE;
|
||||
SET ROLE lr_replication;
|
||||
SELECT pg_drop_replication_slot('regression_slot');
|
||||
pg_drop_replication_slot
|
||||
--------------------------
|
||||
|
||||
(1 row)
|
||||
|
||||
RESET ROLE;
|
||||
-- normal users can't drop existing slots
|
||||
SET ROLE lr_superuser;
|
||||
SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot', 'test_decoding');
|
||||
?column?
|
||||
----------
|
||||
init
|
||||
(1 row)
|
||||
|
||||
RESET ROLE;
|
||||
SET ROLE lr_normal;
|
||||
SELECT pg_drop_replication_slot('regression_slot');
|
||||
ERROR: must be superuser or replication role to use replication slots
|
||||
RESET ROLE;
|
||||
-- all users can see existing slots
|
||||
SET ROLE lr_superuser;
|
||||
SELECT slot_name, plugin FROM pg_replication_slots;
|
||||
slot_name | plugin
|
||||
-----------------+---------------
|
||||
regression_slot | test_decoding
|
||||
(1 row)
|
||||
|
||||
RESET ROLE;
|
||||
SET ROLE lr_replication;
|
||||
SELECT slot_name, plugin FROM pg_replication_slots;
|
||||
slot_name | plugin
|
||||
-----------------+---------------
|
||||
regression_slot | test_decoding
|
||||
(1 row)
|
||||
|
||||
RESET ROLE;
|
||||
SET ROLE lr_normal;
|
||||
SELECT slot_name, plugin FROM pg_replication_slots;
|
||||
slot_name | plugin
|
||||
-----------------+---------------
|
||||
regression_slot | test_decoding
|
||||
(1 row)
|
||||
|
||||
RESET ROLE;
|
||||
-- cleanup
|
||||
SELECT pg_drop_replication_slot('regression_slot');
|
||||
pg_drop_replication_slot
|
||||
--------------------------
|
||||
|
||||
(1 row)
|
||||
|
||||
DROP ROLE lr_normal;
|
||||
DROP ROLE lr_superuser;
|
||||
DROP ROLE lr_replication;
|
||||
DROP TABLE lr_test;
|
107
contrib/test_decoding/expected/rewrite.out
Normal file
107
contrib/test_decoding/expected/rewrite.out
Normal file
@ -0,0 +1,107 @@
|
||||
-- predictability
|
||||
SET synchronous_commit = on;
|
||||
DROP TABLE IF EXISTS replication_example;
|
||||
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');
|
||||
data
|
||||
----------------------------------------------------------------------------------------------------------
|
||||
BEGIN
|
||||
COMMIT
|
||||
BEGIN
|
||||
table public.replication_example: INSERT: id[integer]:1 somedata[integer]:1 text[character varying]:null
|
||||
COMMIT
|
||||
(5 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;
|
||||
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');
|
||||
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
|
||||
COMMIT
|
||||
BEGIN
|
||||
COMMIT
|
||||
BEGIN
|
||||
COMMIT
|
||||
BEGIN
|
||||
COMMIT
|
||||
BEGIN
|
||||
COMMIT
|
||||
BEGIN
|
||||
COMMIT
|
||||
BEGIN
|
||||
COMMIT
|
||||
BEGIN
|
||||
COMMIT
|
||||
BEGIN
|
||||
COMMIT
|
||||
BEGIN
|
||||
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
|
||||
(35 rows)
|
||||
|
||||
SELECT pg_drop_replication_slot('regression_slot');
|
||||
pg_drop_replication_slot
|
||||
--------------------------
|
||||
|
||||
(1 row)
|
||||
|
||||
DROP TABLE IF EXISTS replication_example;
|
90
contrib/test_decoding/expected/toast.out
Normal file
90
contrib/test_decoding/expected/toast.out
Normal file
@ -0,0 +1,90 @@
|
||||
-- predictability
|
||||
SET synchronous_commit = on;
|
||||
DROP TABLE IF EXISTS xpto;
|
||||
NOTICE: table "xpto" does not exist, skipping
|
||||
SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot', 'test_decoding');
|
||||
?column?
|
||||
----------
|
||||
init
|
||||
(1 row)
|
||||
|
||||
CREATE SEQUENCE xpto_rand_seq START 79 INCREMENT 1499; -- portable "random"
|
||||
CREATE TABLE xpto (
|
||||
id serial primary key,
|
||||
toasted_col1 text,
|
||||
rand1 float8 DEFAULT nextval('xpto_rand_seq'),
|
||||
toasted_col2 text,
|
||||
rand2 float8 DEFAULT nextval('xpto_rand_seq')
|
||||
);
|
||||
-- uncompressed external toast data
|
||||
INSERT INTO xpto (toasted_col1, toasted_col2) SELECT string_agg(g.i::text, ''), string_agg((g.i*2)::text, '') FROM generate_series(1, 2000) g(i);
|
||||
-- compressed external toast data
|
||||
INSERT INTO xpto (toasted_col2) SELECT repeat(string_agg(to_char(g.i, 'FM0000'), ''), 50) FROM generate_series(1, 500) g(i);
|
||||
-- update of existing column
|
||||
UPDATE xpto SET toasted_col1 = (SELECT string_agg(g.i::text, '') FROM generate_series(1, 2000) g(i)) WHERE id = 1;
|
||||
UPDATE xpto SET rand1 = 123.456 WHERE id = 1;
|
||||
DELETE FROM xpto WHERE id = 1;
|
||||
DROP TABLE IF EXISTS toasted_key;
|
||||
NOTICE: table "toasted_key" does not exist, skipping
|
||||
CREATE TABLE toasted_key (
|
||||
id serial,
|
||||
toasted_key text PRIMARY KEY,
|
||||
toasted_col1 text,
|
||||
toasted_col2 text
|
||||
);
|
||||
ALTER TABLE toasted_key ALTER COLUMN toasted_key SET STORAGE EXTERNAL;
|
||||
ALTER TABLE toasted_key ALTER COLUMN toasted_col1 SET STORAGE EXTERNAL;
|
||||
INSERT INTO toasted_key(toasted_key, toasted_col1) VALUES(repeat('1234567890', 200), repeat('9876543210', 200));
|
||||
-- test update of a toasted key without changing it
|
||||
UPDATE toasted_key SET toasted_col2 = toasted_col1;
|
||||
-- test update of a toasted key, changing it
|
||||
UPDATE toasted_key SET toasted_key = toasted_key || '1';
|
||||
DELETE FROM toasted_key;
|
||||
SELECT substr(data, 1, 200) FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0');
|
||||
substr
|
||||
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
BEGIN
|
||||
COMMIT
|
||||
BEGIN
|
||||
COMMIT
|
||||
BEGIN
|
||||
table public.xpto: INSERT: id[integer]:1 toasted_col1[text]:'1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
|
||||
COMMIT
|
||||
BEGIN
|
||||
table public.xpto: INSERT: id[integer]:2 toasted_col1[text]:null rand1[double precision]:3077 toasted_col2[text]:'00010002000300040005000600070008000900100011001200130014001500160017001800190020002100
|
||||
COMMIT
|
||||
BEGIN
|
||||
table public.xpto: UPDATE: id[integer]:1 toasted_col1[text]:'1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
|
||||
COMMIT
|
||||
BEGIN
|
||||
table public.xpto: UPDATE: id[integer]:1 toasted_col1[text]:unchanged-toast-datum rand1[double precision]:123.456 toasted_col2[text]:unchanged-toast-datum rand2[double precision]:1578
|
||||
COMMIT
|
||||
BEGIN
|
||||
table public.xpto: DELETE: id[integer]:1
|
||||
COMMIT
|
||||
BEGIN
|
||||
COMMIT
|
||||
BEGIN
|
||||
COMMIT
|
||||
BEGIN
|
||||
COMMIT
|
||||
BEGIN
|
||||
table public.toasted_key: INSERT: id[integer]:1 toasted_key[text]:'1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123
|
||||
COMMIT
|
||||
BEGIN
|
||||
table public.toasted_key: UPDATE: id[integer]:1 toasted_key[text]:unchanged-toast-datum toasted_col1[text]:unchanged-toast-datum toasted_col2[text]:'987654321098765432109876543210987654321098765432109
|
||||
COMMIT
|
||||
BEGIN
|
||||
table public.toasted_key: UPDATE: old-key: toasted_key[text]:'123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678
|
||||
COMMIT
|
||||
BEGIN
|
||||
table public.toasted_key: DELETE: toasted_key[text]:'123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567
|
||||
COMMIT
|
||||
(37 rows)
|
||||
|
||||
SELECT pg_drop_replication_slot('regression_slot');
|
||||
pg_drop_replication_slot
|
||||
--------------------------
|
||||
|
||||
(1 row)
|
||||
|
Reference in New Issue
Block a user