mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-02-23 19:39:53 +08:00
The logical decoding patchset introduced PROC_IN_LOGICAL_DECODING flag PGXACT flag, that allows such backends to be skipped when computing the xmin horizon/snapshots. That's fine and sensible for walsenders streaming out logical changes, but not at all fine for SQL backends doing logical decoding. If the latter set that flag any change they have performed outside of logical decoding will not be regarded as visible - which e.g. can lead to that change being vacuumed away. Note that not setting the flag for SQL backends isn't particularly bothersome - the SQL backend doesn't do streaming, so it only runs for a limited amount of time. Per buildfarm member 'tick' and Alvaro. Backpatch to 9.4, where logical decoding was introduced.
87 lines
4.5 KiB
Plaintext
87 lines
4.5 KiB
Plaintext
-- test that we can insert the result of a get_changes call into a
|
|
-- logged relation. That's really not a good idea in practical terms,
|
|
-- but provides a nice test.
|
|
-- predictability
|
|
SET synchronous_commit = on;
|
|
SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot', 'test_decoding');
|
|
?column?
|
|
----------
|
|
init
|
|
(1 row)
|
|
|
|
-- slot works
|
|
SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1');
|
|
data
|
|
------
|
|
(0 rows)
|
|
|
|
-- create some changes
|
|
CREATE TABLE somechange(id serial primary key);
|
|
INSERT INTO somechange DEFAULT VALUES;
|
|
CREATE TABLE changeresult AS
|
|
SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1');
|
|
SELECT * FROM changeresult;
|
|
data
|
|
------------------------------------------------
|
|
BEGIN
|
|
table public.somechange: INSERT: id[integer]:1
|
|
COMMIT
|
|
(3 rows)
|
|
|
|
INSERT INTO changeresult
|
|
SELECT data FROM pg_logical_slot_peek_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1');
|
|
INSERT INTO changeresult
|
|
SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1');
|
|
SELECT * FROM changeresult;
|
|
data
|
|
--------------------------------------------------------------------------------------------------------------------------------------------------
|
|
BEGIN
|
|
table public.somechange: INSERT: id[integer]:1
|
|
COMMIT
|
|
BEGIN
|
|
table public.changeresult: INSERT: data[text]:'BEGIN'
|
|
table public.changeresult: INSERT: data[text]:'table public.somechange: INSERT: id[integer]:1'
|
|
table public.changeresult: INSERT: data[text]:'COMMIT'
|
|
COMMIT
|
|
BEGIN
|
|
table public.changeresult: INSERT: data[text]:'BEGIN'
|
|
table public.changeresult: INSERT: data[text]:'table public.somechange: INSERT: id[integer]:1'
|
|
table public.changeresult: INSERT: data[text]:'COMMIT'
|
|
COMMIT
|
|
BEGIN
|
|
table public.changeresult: INSERT: data[text]:'BEGIN'
|
|
table public.changeresult: INSERT: data[text]:'table public.changeresult: INSERT: data[text]:''BEGIN'''
|
|
table public.changeresult: INSERT: data[text]:'table public.changeresult: INSERT: data[text]:''table public.somechange: INSERT: id[integer]:1'''
|
|
table public.changeresult: INSERT: data[text]:'table public.changeresult: INSERT: data[text]:''COMMIT'''
|
|
table public.changeresult: INSERT: data[text]:'COMMIT'
|
|
COMMIT
|
|
(20 rows)
|
|
|
|
DROP TABLE changeresult;
|
|
DROP TABLE somechange;
|
|
SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1');
|
|
data
|
|
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
BEGIN
|
|
table public.changeresult: INSERT: data[text]:'BEGIN'
|
|
table public.changeresult: INSERT: data[text]:'table public.changeresult: INSERT: data[text]:''BEGIN'''
|
|
table public.changeresult: INSERT: data[text]:'table public.changeresult: INSERT: data[text]:''table public.somechange: INSERT: id[integer]:1'''
|
|
table public.changeresult: INSERT: data[text]:'table public.changeresult: INSERT: data[text]:''COMMIT'''
|
|
table public.changeresult: INSERT: data[text]:'COMMIT'
|
|
table public.changeresult: INSERT: data[text]:'BEGIN'
|
|
table public.changeresult: INSERT: data[text]:'table public.changeresult: INSERT: data[text]:''BEGIN'''
|
|
table public.changeresult: INSERT: data[text]:'table public.changeresult: INSERT: data[text]:''table public.changeresult: INSERT: data[text]:''''BEGIN'''''''
|
|
table public.changeresult: INSERT: data[text]:'table public.changeresult: INSERT: data[text]:''table public.changeresult: INSERT: data[text]:''''table public.somechange: INSERT: id[integer]:1'''''''
|
|
table public.changeresult: INSERT: data[text]:'table public.changeresult: INSERT: data[text]:''table public.changeresult: INSERT: data[text]:''''COMMIT'''''''
|
|
table public.changeresult: INSERT: data[text]:'table public.changeresult: INSERT: data[text]:''COMMIT'''
|
|
table public.changeresult: INSERT: data[text]:'COMMIT'
|
|
COMMIT
|
|
(14 rows)
|
|
|
|
SELECT 'stop' FROM pg_drop_replication_slot('regression_slot');
|
|
?column?
|
|
----------
|
|
stop
|
|
(1 row)
|
|
|