4 -- Create a replication slot
5 SELECT slot_name FROM pg_create_logical_replication_slot('custom_slot', 'wal2sql');
11 -- Install the wal2sql extension to enable automatic DDL capture
12 CREATE EXTENSION wal2sql;
13 -- DEFAULT case with PRIMARY KEY
14 CREATE TABLE aa (a int primary key, b text NOT NULL);
15 INSERT INTO aa VALUES (1, 'aa'), (2, 'bb');
16 -- Update of Non-selective column
17 UPDATE aa SET b = 'cc' WHERE a = 1;
18 -- Update of only selective column
19 UPDATE aa SET a = 3 WHERE a = 1;
20 -- Update of both columns
21 UPDATE aa SET a = 4, b = 'dd' WHERE a = 2;
22 DELETE FROM aa WHERE a = 4;
23 -- Have a look at changes with different modes.
24 -- In the second call changes are consumed to not impact the next cases.
25 SELECT data FROM pg_logical_slot_peek_changes('custom_slot', NULL, NULL, 'include_transaction', 'off');
27 -------------------------------------------------------
28 CREATE TABLE aa (a int primary key, b text NOT NULL);
29 INSERT INTO public.aa (a, b) VALUES (1, 'aa');
30 INSERT INTO public.aa (a, b) VALUES (2, 'bb');
31 UPDATE public.aa SET a = 1, b = 'cc' WHERE a = 1;
32 UPDATE public.aa SET a = 3, b = 'cc' WHERE a = 1;
33 UPDATE public.aa SET a = 4, b = 'dd' WHERE a = 2;
34 DELETE FROM public.aa WHERE a = 4;
37 SELECT data FROM pg_logical_slot_get_changes('custom_slot', NULL, NULL, 'include_transaction', 'on');
39 -------------------------------------------------------
43 CREATE TABLE aa (a int primary key, b text NOT NULL);
46 INSERT INTO public.aa (a, b) VALUES (1, 'aa');
47 INSERT INTO public.aa (a, b) VALUES (2, 'bb');
50 UPDATE public.aa SET a = 1, b = 'cc' WHERE a = 1;
53 UPDATE public.aa SET a = 3, b = 'cc' WHERE a = 1;
56 UPDATE public.aa SET a = 4, b = 'dd' WHERE a = 2;
59 DELETE FROM public.aa WHERE a = 4;
64 -- DEFAULT case without PRIMARY KEY
65 CREATE TABLE aa (a int, b text NOT NULL);
66 INSERT INTO aa VALUES (1, 'aa'), (2, 'bb');
67 -- Update of Non-selective column
68 UPDATE aa SET b = 'cc' WHERE a = 1;
69 -- Update of only selective column
70 UPDATE aa SET a = 3 WHERE a = 1;
71 -- Update of both columns
72 UPDATE aa SET a = 4, b = 'dd' WHERE a = 2;
73 DELETE FROM aa WHERE a = 4;
74 -- Have a look at changes with different modes.
75 -- In the second call changes are consumed to not impact the next cases.
76 SELECT data FROM pg_logical_slot_peek_changes('custom_slot', NULL, NULL, 'include_transaction', 'off');
78 ------------------------------------------------
80 CREATE TABLE aa (a int, b text NOT NULL);
81 INSERT INTO public.aa (a, b) VALUES (1, 'aa');
82 INSERT INTO public.aa (a, b) VALUES (2, 'bb');
85 SELECT data FROM pg_logical_slot_get_changes('custom_slot', NULL, NULL, 'include_transaction', 'on');
87 ------------------------------------------------
92 CREATE TABLE aa (a int, b text NOT NULL);
95 INSERT INTO public.aa (a, b) VALUES (1, 'aa');
96 INSERT INTO public.aa (a, b) VALUES (2, 'bb');
110 CREATE TABLE aa (a int NOT NULL, b text);
111 CREATE UNIQUE INDEX aai ON aa(a);
112 ALTER TABLE aa REPLICA IDENTITY USING INDEX aai;
113 INSERT INTO aa VALUES (1, 'aa'), (2, 'bb');
114 -- Update of Non-selective column
115 UPDATE aa SET b = 'cc' WHERE a = 1;
116 -- Update of only selective column
117 UPDATE aa SET a = 3 WHERE a = 1;
118 -- Update of both columns
119 UPDATE aa SET a = 4, b = 'dd' WHERE a = 2;
120 DELETE FROM aa WHERE a = 4;
121 -- Have a look at changes with different modes
122 SELECT data FROM pg_logical_slot_peek_changes('custom_slot', NULL, NULL, 'include_transaction', 'off');
124 ---------------------------------------------------
126 CREATE TABLE aa (a int NOT NULL, b text);
127 CREATE UNIQUE INDEX aai ON aa(a);
128 ALTER TABLE aa REPLICA IDENTITY USING INDEX aai;
129 INSERT INTO public.aa (a, b) VALUES (1, 'aa');
130 INSERT INTO public.aa (a, b) VALUES (2, 'bb');
131 UPDATE public.aa SET a = 1, b = 'cc' WHERE a = 1;
132 UPDATE public.aa SET a = 3, b = 'cc' WHERE a = 1;
133 UPDATE public.aa SET a = 4, b = 'dd' WHERE a = 2;
134 DELETE FROM public.aa WHERE a = 4;
137 SELECT data FROM pg_logical_slot_get_changes('custom_slot', NULL, NULL, 'include_transaction', 'on');
139 ---------------------------------------------------
144 CREATE TABLE aa (a int NOT NULL, b text);
147 CREATE UNIQUE INDEX aai ON aa(a);
150 ALTER TABLE aa REPLICA IDENTITY USING INDEX aai;
153 INSERT INTO public.aa (a, b) VALUES (1, 'aa');
154 INSERT INTO public.aa (a, b) VALUES (2, 'bb');
157 UPDATE public.aa SET a = 1, b = 'cc' WHERE a = 1;
160 UPDATE public.aa SET a = 3, b = 'cc' WHERE a = 1;
163 UPDATE public.aa SET a = 4, b = 'dd' WHERE a = 2;
166 DELETE FROM public.aa WHERE a = 4;
171 -- INDEX case using a second column
172 CREATE TABLE aa (b text, a int NOT NULL);
173 CREATE UNIQUE INDEX aai ON aa(a);
174 ALTER TABLE aa REPLICA IDENTITY USING INDEX aai;
175 INSERT INTO aa VALUES ('aa', 1), ('bb', 2);
176 -- Update of Non-selective column
177 UPDATE aa SET b = 'cc' WHERE a = 1;
178 -- Update of only selective column
179 UPDATE aa SET a = 3 WHERE a = 1;
180 -- Update of both columns
181 UPDATE aa SET a = 4, b = 'dd' WHERE a = 2;
182 DELETE FROM aa WHERE a = 4;
183 -- Have a look at changes with different modes
184 SELECT data FROM pg_logical_slot_peek_changes('custom_slot', NULL, NULL, 'include_transaction', 'off');
186 ---------------------------------------------------
188 CREATE TABLE aa (b text, a int NOT NULL);
189 CREATE UNIQUE INDEX aai ON aa(a);
190 ALTER TABLE aa REPLICA IDENTITY USING INDEX aai;
191 INSERT INTO public.aa (b, a) VALUES ('aa', 1);
192 INSERT INTO public.aa (b, a) VALUES ('bb', 2);
193 UPDATE public.aa SET b = 'cc', a = 1 WHERE a = 1;
194 UPDATE public.aa SET b = 'cc', a = 3 WHERE a = 1;
195 UPDATE public.aa SET b = 'dd', a = 4 WHERE a = 2;
196 DELETE FROM public.aa WHERE a = 4;
199 SELECT data FROM pg_logical_slot_get_changes('custom_slot', NULL, NULL, 'include_transaction', 'on');
201 ---------------------------------------------------
206 CREATE TABLE aa (b text, a int NOT NULL);
209 CREATE UNIQUE INDEX aai ON aa(a);
212 ALTER TABLE aa REPLICA IDENTITY USING INDEX aai;
215 INSERT INTO public.aa (b, a) VALUES ('aa', 1);
216 INSERT INTO public.aa (b, a) VALUES ('bb', 2);
219 UPDATE public.aa SET b = 'cc', a = 1 WHERE a = 1;
222 UPDATE public.aa SET b = 'cc', a = 3 WHERE a = 1;
225 UPDATE public.aa SET b = 'dd', a = 4 WHERE a = 2;
228 DELETE FROM public.aa WHERE a = 4;
234 CREATE TABLE aa (a int primary key, b text NOT NULL);
235 ALTER TABLE aa REPLICA IDENTITY FULL;
236 INSERT INTO aa VALUES (1, 'aa'), (2, 'bb');
237 -- Update of Non-selective column
238 UPDATE aa SET b = 'cc' WHERE a = 1;
239 -- Update of only selective column
240 UPDATE aa SET a = 3 WHERE a = 1;
241 -- Update of both columns
242 UPDATE aa SET a = 4, b = 'dd' WHERE a = 2;
243 DELETE FROM aa WHERE a = 4;
244 -- Have a look at changes with different modes
245 SELECT data FROM pg_logical_slot_peek_changes('custom_slot', NULL, NULL, 'include_transaction', 'off');
247 ----------------------------------------------------------------
249 CREATE TABLE aa (a int primary key, b text NOT NULL);
250 ALTER TABLE aa REPLICA IDENTITY FULL;
251 INSERT INTO public.aa (a, b) VALUES (1, 'aa');
252 INSERT INTO public.aa (a, b) VALUES (2, 'bb');
253 UPDATE public.aa SET a = 1, b = 'cc' WHERE a = 1 AND b = 'aa';
254 UPDATE public.aa SET a = 3, b = 'cc' WHERE a = 1 AND b = 'cc';
255 UPDATE public.aa SET a = 4, b = 'dd' WHERE a = 2 AND b = 'bb';
256 DELETE FROM public.aa WHERE a = 4 AND b = 'dd';
259 SELECT data FROM pg_logical_slot_get_changes('custom_slot', NULL, NULL, 'include_transaction', 'on');
261 ----------------------------------------------------------------
266 CREATE TABLE aa (a int primary key, b text NOT NULL);
269 ALTER TABLE aa REPLICA IDENTITY FULL;
272 INSERT INTO public.aa (a, b) VALUES (1, 'aa');
273 INSERT INTO public.aa (a, b) VALUES (2, 'bb');
276 UPDATE public.aa SET a = 1, b = 'cc' WHERE a = 1 AND b = 'aa';
279 UPDATE public.aa SET a = 3, b = 'cc' WHERE a = 1 AND b = 'cc';
282 UPDATE public.aa SET a = 4, b = 'dd' WHERE a = 2 AND b = 'bb';
285 DELETE FROM public.aa WHERE a = 4 AND b = 'dd';
291 CREATE TABLE aa (a int primary key, b text NOT NULL);
292 ALTER TABLE aa REPLICA IDENTITY NOTHING;
293 INSERT INTO aa VALUES (1, 'aa'), (2, 'bb');
294 UPDATE aa SET b = 'cc' WHERE a = 1;
295 UPDATE aa SET a = 3 WHERE a = 1;
296 DELETE FROM aa WHERE a = 4;
297 -- Have a look at changes with different modes
298 SELECT data FROM pg_logical_slot_peek_changes('custom_slot', NULL, NULL, 'include_transaction', 'off');
300 -------------------------------------------------------
302 CREATE TABLE aa (a int primary key, b text NOT NULL);
303 ALTER TABLE aa REPLICA IDENTITY NOTHING;
304 INSERT INTO public.aa (a, b) VALUES (1, 'aa');
305 INSERT INTO public.aa (a, b) VALUES (2, 'bb');
308 SELECT data FROM pg_logical_slot_get_changes('custom_slot', NULL, NULL, 'include_transaction', 'on');
310 -------------------------------------------------------
315 CREATE TABLE aa (a int primary key, b text NOT NULL);
318 ALTER TABLE aa REPLICA IDENTITY NOTHING;
321 INSERT INTO public.aa (a, b) VALUES (1, 'aa');
322 INSERT INTO public.aa (a, b) VALUES (2, 'bb');
331 -- Special value handling for various data types
332 -- boolean, with true and false values correctly shaped
333 CREATE TABLE aa (a boolean);
334 INSERT INTO aa VALUES (true);
335 INSERT INTO aa VALUES (false);
336 SELECT data FROM pg_logical_slot_get_changes('custom_slot', NULL, NULL, 'include_transaction', 'off');
338 -------------------------------------------
340 CREATE TABLE aa (a boolean);
341 INSERT INTO public.aa (a) VALUES (true);
342 INSERT INTO public.aa (a) VALUES (false);
346 -- numeric and flost with Nan and infinity - quotes should be correctly placed
347 CREATE TABLE aa (a numeric, b float4, c float8);
348 INSERT INTO aa VALUES ('Nan'::numeric, 'Nan'::float4, 'Nan'::float8);
349 INSERT INTO aa VALUES (1.0, '+Infinity'::float4, '+Infinity'::float8);
350 INSERT INTO aa VALUES (2.0, '-Infinity'::float4, '-Infinity'::float8);
351 INSERT INTO aa VALUES (3.0, 4.0, 5.0);
352 SELECT data FROM pg_logical_slot_get_changes('custom_slot', NULL, NULL, 'include_transaction', 'off');
354 -------------------------------------------------------------------------
356 CREATE TABLE aa (a numeric, b float4, c float8);
357 INSERT INTO public.aa (a, b, c) VALUES ('NaN', 'NaN', 'NaN');
358 INSERT INTO public.aa (a, b, c) VALUES (1.0, 'Infinity', 'Infinity');
359 INSERT INTO public.aa (a, b, c) VALUES (2.0, '-Infinity', '-Infinity');
360 INSERT INTO public.aa (a, b, c) VALUES (3.0, 4, 5);
364 -- Unchanged toast datum
365 CREATE TABLE tt (a int primary key, t text);
366 ALTER TABLE tt ALTER COLUMN t SET STORAGE EXTERNAL;
367 INSERT INTO tt VALUES (1, 'foo');
368 INSERT INTO tt VALUES (2, repeat('x', 3000));
369 UPDATE tt SET t=t WHERE a=1;
370 UPDATE tt SET t=t WHERE a=2;
371 SELECT substr(data, 1, 50), substr(data, 3000, 45)
372 FROM pg_logical_slot_get_changes('custom_slot', NULL, NULL, 'include_transaction', 'off');
374 ----------------------------------------------------+-----------------------------------------------
376 CREATE TABLE tt (a int primary key, t text); |
377 ALTER TABLE tt ALTER COLUMN t SET STORAGE EXTERNAL |
378 INSERT INTO public.tt (a, t) VALUES (1, 'foo'); |
379 INSERT INTO public.tt (a, t) VALUES (2, 'xxxxxxxxx | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
380 UPDATE public.tt SET a = 1, t = 'foo' WHERE a = 1; |
381 UPDATE public.tt SET a = 2 WHERE a = 2; |
385 -- Drop replication slot
386 DROP EXTENSION wal2sql;
387 SELECT pg_drop_replication_slot('custom_slot');
388 pg_drop_replication_slot
389 --------------------------