mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-08-29 02:07:19 +02:00
Commit 0da92dc530
improved the logical decoding infrastructure to handle
sequences, and did various changes to related parts (WAL logging etc.).
But it did not include any implementation of the new callbacks added to
OutputPluginCallbacks.
This extends test_decoding with two callbacks to decode sequences. The
decoding of sequences may be disabled using 'include-sequences', a new
option of the output plugin.
Author: Tomas Vondra, Cary Huang
Reviewed-by: Peter Eisentraut, Hannu Krosing, Andres Freund
Discussion: https://postgr.es/m/d045f3c2-6cfb-06d3-5540-e63c320df8bc@enterprisedb.com
Discussion: https://postgr.es/m/1710ed7e13b.cd7177461430746.3372264562543607781@highgo.ca
112 lines
6.7 KiB
Plaintext
112 lines
6.7 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', 'include-sequences', '0');
|
|
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', 'include-sequences', '0');
|
|
INSERT INTO changeresult
|
|
SELECT data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0');
|
|
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;
|
|
-- check calling logical decoding from pl/pgsql
|
|
CREATE FUNCTION slot_changes_wrapper(slot_name name) RETURNS SETOF TEXT AS $$
|
|
BEGIN
|
|
RETURN QUERY
|
|
SELECT data FROM pg_logical_slot_peek_changes(slot_name, NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0');
|
|
END$$ LANGUAGE plpgsql;
|
|
SELECT * FROM slot_changes_wrapper('regression_slot');
|
|
slot_changes_wrapper
|
|
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
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 data FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1', 'include-sequences', '0');
|
|
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)
|
|
|