mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	This reverts a sequence of commits, implementing features related to logical decoding and replication of sequences: -0da92dc530-80901b3291-b779d7d8fd-d5ed9da41d-a180c2b34d-75b1521dae-2d2232933b-002c9dd97a-05843b1aa4The implementation has issues, mostly due to combining transactional and non-transactional behavior of sequences. It's not clear how this could be fixed, but it'll require reworking significant part of the patch. Discussion: https://postgr.es/m/95345a19-d508-63d1-860a-f5c2f41e8d40@enterprisedb.com
		
			
				
	
	
		
			328 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			PL/PgSQL
		
	
	
	
	
	
			
		
		
	
	
			328 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			PL/PgSQL
		
	
	
	
	
	
-- predictability
 | 
						|
SET synchronous_commit = on;
 | 
						|
 | 
						|
DROP TABLE IF EXISTS xpto;
 | 
						|
 | 
						|
SELECT 'init' FROM pg_create_logical_replication_slot('regression_slot', 'test_decoding');
 | 
						|
 | 
						|
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;
 | 
						|
 | 
						|
-- updating external via INSERT ... ON CONFLICT DO UPDATE
 | 
						|
INSERT INTO xpto(id, toasted_col2) VALUES (2, 'toasted2-upsert')
 | 
						|
ON CONFLICT (id)
 | 
						|
DO UPDATE SET toasted_col2 = EXCLUDED.toasted_col2 || xpto.toasted_col2;
 | 
						|
 | 
						|
DELETE FROM xpto WHERE id = 1;
 | 
						|
 | 
						|
DROP TABLE IF EXISTS toasted_key;
 | 
						|
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;
 | 
						|
 | 
						|
-- Test that HEAP2_MULTI_INSERT insertions with and without toasted
 | 
						|
-- columns are handled correctly
 | 
						|
CREATE TABLE toasted_copy (
 | 
						|
    id int primary key, -- no default, copy didn't use to handle that with multi inserts
 | 
						|
    data text
 | 
						|
);
 | 
						|
ALTER TABLE toasted_copy ALTER COLUMN data SET STORAGE EXTERNAL;
 | 
						|
\copy toasted_copy FROM STDIN
 | 
						|
1	untoasted1
 | 
						|
2	toasted1-12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
 | 
						|
3	untoasted2
 | 
						|
4	toasted2-12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
 | 
						|
5	untoasted3
 | 
						|
6	untoasted4
 | 
						|
7	untoasted5
 | 
						|
8	untoasted6
 | 
						|
9	untoasted7
 | 
						|
10	untoasted8
 | 
						|
11	untoasted9
 | 
						|
12	untoasted10
 | 
						|
13	untoasted11
 | 
						|
14	untoasted12
 | 
						|
15	untoasted13
 | 
						|
16	untoasted14
 | 
						|
17	untoasted15
 | 
						|
18	untoasted16
 | 
						|
19	untoasted17
 | 
						|
20	untoasted18
 | 
						|
21	untoasted19
 | 
						|
22	untoasted20
 | 
						|
23	untoasted21
 | 
						|
24	untoasted22
 | 
						|
25	untoasted23
 | 
						|
26	untoasted24
 | 
						|
27	untoasted25
 | 
						|
28	untoasted26
 | 
						|
29	untoasted27
 | 
						|
30	untoasted28
 | 
						|
31	untoasted29
 | 
						|
32	untoasted30
 | 
						|
33	untoasted31
 | 
						|
34	untoasted32
 | 
						|
35	untoasted33
 | 
						|
36	untoasted34
 | 
						|
37	untoasted35
 | 
						|
38	untoasted36
 | 
						|
39	untoasted37
 | 
						|
40	untoasted38
 | 
						|
41	untoasted39
 | 
						|
42	untoasted40
 | 
						|
43	untoasted41
 | 
						|
44	untoasted42
 | 
						|
45	untoasted43
 | 
						|
46	untoasted44
 | 
						|
47	untoasted45
 | 
						|
48	untoasted46
 | 
						|
49	untoasted47
 | 
						|
50	untoasted48
 | 
						|
51	untoasted49
 | 
						|
52	untoasted50
 | 
						|
53	untoasted51
 | 
						|
54	untoasted52
 | 
						|
55	untoasted53
 | 
						|
56	untoasted54
 | 
						|
57	untoasted55
 | 
						|
58	untoasted56
 | 
						|
59	untoasted57
 | 
						|
60	untoasted58
 | 
						|
61	untoasted59
 | 
						|
62	untoasted60
 | 
						|
63	untoasted61
 | 
						|
64	untoasted62
 | 
						|
65	untoasted63
 | 
						|
66	untoasted64
 | 
						|
67	untoasted65
 | 
						|
68	untoasted66
 | 
						|
69	untoasted67
 | 
						|
70	untoasted68
 | 
						|
71	untoasted69
 | 
						|
72	untoasted70
 | 
						|
73	untoasted71
 | 
						|
74	untoasted72
 | 
						|
75	untoasted73
 | 
						|
76	untoasted74
 | 
						|
77	untoasted75
 | 
						|
78	untoasted76
 | 
						|
79	untoasted77
 | 
						|
80	untoasted78
 | 
						|
81	untoasted79
 | 
						|
82	untoasted80
 | 
						|
83	untoasted81
 | 
						|
84	untoasted82
 | 
						|
85	untoasted83
 | 
						|
86	untoasted84
 | 
						|
87	untoasted85
 | 
						|
88	untoasted86
 | 
						|
89	untoasted87
 | 
						|
90	untoasted88
 | 
						|
91	untoasted89
 | 
						|
92	untoasted90
 | 
						|
93	untoasted91
 | 
						|
94	untoasted92
 | 
						|
95	untoasted93
 | 
						|
96	untoasted94
 | 
						|
97	untoasted95
 | 
						|
98	untoasted96
 | 
						|
99	untoasted97
 | 
						|
100	untoasted98
 | 
						|
101	untoasted99
 | 
						|
102	untoasted100
 | 
						|
103	untoasted101
 | 
						|
104	untoasted102
 | 
						|
105	untoasted103
 | 
						|
106	untoasted104
 | 
						|
107	untoasted105
 | 
						|
108	untoasted106
 | 
						|
109	untoasted107
 | 
						|
110	untoasted108
 | 
						|
111	untoasted109
 | 
						|
112	untoasted110
 | 
						|
113	untoasted111
 | 
						|
114	untoasted112
 | 
						|
115	untoasted113
 | 
						|
116	untoasted114
 | 
						|
117	untoasted115
 | 
						|
118	untoasted116
 | 
						|
119	untoasted117
 | 
						|
120	untoasted118
 | 
						|
121	untoasted119
 | 
						|
122	untoasted120
 | 
						|
123	untoasted121
 | 
						|
124	untoasted122
 | 
						|
125	untoasted123
 | 
						|
126	untoasted124
 | 
						|
127	untoasted125
 | 
						|
128	untoasted126
 | 
						|
129	untoasted127
 | 
						|
130	untoasted128
 | 
						|
131	untoasted129
 | 
						|
132	untoasted130
 | 
						|
133	untoasted131
 | 
						|
134	untoasted132
 | 
						|
135	untoasted133
 | 
						|
136	untoasted134
 | 
						|
137	untoasted135
 | 
						|
138	untoasted136
 | 
						|
139	untoasted137
 | 
						|
140	untoasted138
 | 
						|
141	untoasted139
 | 
						|
142	untoasted140
 | 
						|
143	untoasted141
 | 
						|
144	untoasted142
 | 
						|
145	untoasted143
 | 
						|
146	untoasted144
 | 
						|
147	untoasted145
 | 
						|
148	untoasted146
 | 
						|
149	untoasted147
 | 
						|
150	untoasted148
 | 
						|
151	untoasted149
 | 
						|
152	untoasted150
 | 
						|
153	untoasted151
 | 
						|
154	untoasted152
 | 
						|
155	untoasted153
 | 
						|
156	untoasted154
 | 
						|
157	untoasted155
 | 
						|
158	untoasted156
 | 
						|
159	untoasted157
 | 
						|
160	untoasted158
 | 
						|
161	untoasted159
 | 
						|
162	untoasted160
 | 
						|
163	untoasted161
 | 
						|
164	untoasted162
 | 
						|
165	untoasted163
 | 
						|
166	untoasted164
 | 
						|
167	untoasted165
 | 
						|
168	untoasted166
 | 
						|
169	untoasted167
 | 
						|
170	untoasted168
 | 
						|
171	untoasted169
 | 
						|
172	untoasted170
 | 
						|
173	untoasted171
 | 
						|
174	untoasted172
 | 
						|
175	untoasted173
 | 
						|
176	untoasted174
 | 
						|
177	untoasted175
 | 
						|
178	untoasted176
 | 
						|
179	untoasted177
 | 
						|
180	untoasted178
 | 
						|
181	untoasted179
 | 
						|
182	untoasted180
 | 
						|
183	untoasted181
 | 
						|
184	untoasted182
 | 
						|
185	untoasted183
 | 
						|
186	untoasted184
 | 
						|
187	untoasted185
 | 
						|
188	untoasted186
 | 
						|
189	untoasted187
 | 
						|
190	untoasted188
 | 
						|
191	untoasted189
 | 
						|
192	untoasted190
 | 
						|
193	untoasted191
 | 
						|
194	untoasted192
 | 
						|
195	untoasted193
 | 
						|
196	untoasted194
 | 
						|
197	untoasted195
 | 
						|
198	untoasted196
 | 
						|
199	untoasted197
 | 
						|
200	untoasted198
 | 
						|
201	toasted3-12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
 | 
						|
202	untoasted199
 | 
						|
203	untoasted200
 | 
						|
\.
 | 
						|
SELECT substr(data, 1, 200) FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1');
 | 
						|
 | 
						|
-- test we can decode "old" tuples bigger than the max heap tuple size correctly
 | 
						|
DROP TABLE IF EXISTS toasted_several;
 | 
						|
CREATE TABLE toasted_several (
 | 
						|
    id serial unique not null,
 | 
						|
    toasted_key text primary key,
 | 
						|
    toasted_col1 text,
 | 
						|
    toasted_col2 text
 | 
						|
);
 | 
						|
ALTER TABLE toasted_several REPLICA IDENTITY FULL;
 | 
						|
ALTER TABLE toasted_several ALTER COLUMN toasted_key SET STORAGE EXTERNAL;
 | 
						|
ALTER TABLE toasted_several ALTER COLUMN toasted_col1 SET STORAGE EXTERNAL;
 | 
						|
ALTER TABLE toasted_several ALTER COLUMN toasted_col2 SET STORAGE EXTERNAL;
 | 
						|
 | 
						|
-- Change the storage of the index back to EXTENDED, separately from
 | 
						|
-- the table.  This is currently not doable via DDL, but it is
 | 
						|
-- supported internally.
 | 
						|
UPDATE pg_attribute SET attstorage = 'x' WHERE attrelid = 'toasted_several_pkey'::regclass AND attname = 'toasted_key';
 | 
						|
 | 
						|
INSERT INTO toasted_several(toasted_key) VALUES(repeat('9876543210', 10000));
 | 
						|
SELECT pg_column_size(toasted_key) > 2^16 FROM toasted_several;
 | 
						|
 | 
						|
SELECT regexp_replace(data, '^(.{100}).*(.{100})$', '\1..\2') FROM pg_logical_slot_peek_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1');
 | 
						|
 | 
						|
-- test update of a toasted key without changing it
 | 
						|
UPDATE toasted_several SET toasted_col1 = toasted_key;
 | 
						|
UPDATE toasted_several SET toasted_col2 = toasted_col1;
 | 
						|
 | 
						|
SELECT regexp_replace(data, '^(.{100}).*(.{100})$', '\1..\2') FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1');
 | 
						|
 | 
						|
/*
 | 
						|
 * update with large tuplebuf, in a transaction large enough to force to spool to disk
 | 
						|
 */
 | 
						|
BEGIN;
 | 
						|
INSERT INTO toasted_several(toasted_key) SELECT * FROM generate_series(1, 10234);
 | 
						|
UPDATE toasted_several SET toasted_col1 = toasted_col2 WHERE id = 1;
 | 
						|
DELETE FROM toasted_several WHERE id = 1;
 | 
						|
COMMIT;
 | 
						|
 | 
						|
DROP TABLE toasted_several;
 | 
						|
 | 
						|
SELECT regexp_replace(data, '^(.{100}).*(.{100})$', '\1..\2') FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1')
 | 
						|
WHERE data NOT LIKE '%INSERT: %';
 | 
						|
 | 
						|
/*
 | 
						|
 * Test decoding relation rewrite with toast. The insert into tbl2 within the
 | 
						|
 * same transaction is there to check that there is no remaining toast_hash not
 | 
						|
 * being reset.
 | 
						|
 */
 | 
						|
CREATE TABLE tbl1 (a INT, b TEXT);
 | 
						|
CREATE TABLE tbl2 (a INT);
 | 
						|
ALTER TABLE tbl1 ALTER COLUMN b SET STORAGE EXTERNAL;
 | 
						|
BEGIN;
 | 
						|
INSERT INTO tbl1 VALUES(1, repeat('a', 4000)) ;
 | 
						|
ALTER TABLE tbl1 ADD COLUMN id serial primary key;
 | 
						|
INSERT INTO tbl2 VALUES(1);
 | 
						|
commit;
 | 
						|
SELECT substr(data, 1, 200) FROM pg_logical_slot_get_changes('regression_slot', NULL, NULL, 'include-xids', '0', 'skip-empty-xacts', '1');
 | 
						|
 | 
						|
SELECT pg_drop_replication_slot('regression_slot');
 |