
This was broken in commit 9c7d06d60680, which inadvertently gave the wrong value to fast_forward in one StartupDecodingContext call. Fix by flipping the value. Add a test for the obvious error, namely trying to initialize a replication slot with an nonexistent output plugin. While at it, move the CreateDecodingContext call earlier, so that any errors are reported before sending the CopyBoth message. Author: Dave Cramer <davecramer@gmail.com> Reviewed-by: Andres Freund <andres@anarazel.de> Discussion: https://postgr.es/m/CADK3HHLVkeRe1v4P02-5hj55H3_yJg3AEtpXyEY5T3wuzO2jSg@mail.gmail.com
79 lines
3.3 KiB
PL/PgSQL
79 lines
3.3 KiB
PL/PgSQL
-- predictability
|
|
SET synchronous_commit = on;
|
|
|
|
SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot_p', 'test_decoding');
|
|
SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot_t', 'test_decoding', true);
|
|
|
|
SELECT pg_drop_replication_slot('regression_slot_p');
|
|
SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot_p', 'test_decoding', false);
|
|
|
|
SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot_t2', 'test_decoding', true);
|
|
|
|
SELECT pg_create_logical_replication_slot('foo', 'nonexistent');
|
|
|
|
-- here we want to start a new session and wait till old one is gone
|
|
select pg_backend_pid() as oldpid \gset
|
|
\c -
|
|
SET synchronous_commit = on;
|
|
|
|
do 'declare c int = 0;
|
|
begin
|
|
while (select count(*) from pg_replication_slots where active_pid = '
|
|
:'oldpid'
|
|
') > 0 loop c := c + 1; perform pg_sleep(0.01); end loop;
|
|
raise log ''slot test looped % times'', c;
|
|
end';
|
|
|
|
-- should fail because the temporary slots were dropped automatically
|
|
SELECT pg_drop_replication_slot('regression_slot_t');
|
|
SELECT pg_drop_replication_slot('regression_slot_t2');
|
|
|
|
-- permanent slot has survived
|
|
SELECT pg_drop_replication_slot('regression_slot_p');
|
|
|
|
-- test switching between slots in a session
|
|
SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot1', 'test_decoding', true);
|
|
|
|
CREATE TABLE replication_example(id SERIAL PRIMARY KEY, somedata int, text varchar(120));
|
|
BEGIN;
|
|
INSERT INTO replication_example(somedata, text) VALUES (1, 1);
|
|
INSERT INTO replication_example(somedata, text) VALUES (1, 2);
|
|
COMMIT;
|
|
|
|
SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot2', 'test_decoding', true);
|
|
|
|
INSERT INTO replication_example(somedata, text) VALUES (1, 3);
|
|
|
|
SELECT data FROM pg_logical_slot_get_changes('regression_slot1', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1');
|
|
SELECT data FROM pg_logical_slot_get_changes('regression_slot2', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1');
|
|
|
|
INSERT INTO replication_example(somedata, text) VALUES (1, 4);
|
|
INSERT INTO replication_example(somedata, text) VALUES (1, 5);
|
|
|
|
SELECT pg_current_wal_lsn() AS wal_lsn \gset
|
|
|
|
INSERT INTO replication_example(somedata, text) VALUES (1, 6);
|
|
|
|
SELECT end_lsn FROM pg_replication_slot_advance('regression_slot1', :'wal_lsn') \gset
|
|
SELECT slot_name FROM pg_replication_slot_advance('regression_slot2', pg_current_wal_lsn());
|
|
|
|
SELECT :'wal_lsn' = :'end_lsn';
|
|
|
|
SELECT data FROM pg_logical_slot_get_changes('regression_slot1', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1');
|
|
SELECT data FROM pg_logical_slot_get_changes('regression_slot2', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1');
|
|
|
|
DROP TABLE replication_example;
|
|
|
|
-- error
|
|
SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot1', 'test_decoding', true);
|
|
|
|
-- both should error as they should be dropped on error
|
|
SELECT pg_drop_replication_slot('regression_slot1');
|
|
SELECT pg_drop_replication_slot('regression_slot2');
|
|
|
|
-- slot advance with physical slot, error with non-reserved slot
|
|
SELECT slot_name FROM pg_create_physical_replication_slot('regression_slot3');
|
|
SELECT pg_replication_slot_advance('regression_slot3', '0/0'); -- invalid LSN
|
|
SELECT pg_replication_slot_advance('regression_slot3', '0/1'); -- error
|
|
SELECT pg_drop_replication_slot('regression_slot3');
|