11-- 'Test multi-db roundtrip with concurrent updates'
22
33\set testid ' 03'
4+ \ir helper_test_init .sql
45
56\connect postgres
67\ir helper_psql_conn_setup .sql
7- DROP DATABASE IF EXISTS cloudsync_test_a ;
8- DROP DATABASE IF EXISTS cloudsync_test_b ;
9- DROP DATABASE IF EXISTS cloudsync_test_c ;
10- CREATE DATABASE cloudsync_test_a ;
11- CREATE DATABASE cloudsync_test_b ;
12- CREATE DATABASE cloudsync_test_c ;
8+ DROP DATABASE IF EXISTS cloudsync_test_03_a ;
9+ DROP DATABASE IF EXISTS cloudsync_test_03_b ;
10+ DROP DATABASE IF EXISTS cloudsync_test_03_c ;
11+ CREATE DATABASE cloudsync_test_03_a ;
12+ CREATE DATABASE cloudsync_test_03_b ;
13+ CREATE DATABASE cloudsync_test_03_c ;
1314
14- \connect cloudsync_test_a
15+ \connect cloudsync_test_03_a
1516\ir helper_psql_conn_setup .sql
1617CREATE EXTENSION IF NOT EXISTS cloudsync;
1718DROP TABLE IF EXISTS smoke_tbl;
1819CREATE TABLE smoke_tbl (id TEXT PRIMARY KEY , val TEXT );
1920SELECT cloudsync_init(' smoke_tbl' , ' CLS' , true) AS _init_site_id_a \gset
2021
21- \connect cloudsync_test_b
22+ \connect cloudsync_test_03_b
2223\ir helper_psql_conn_setup .sql
2324CREATE EXTENSION IF NOT EXISTS cloudsync;
2425DROP TABLE IF EXISTS smoke_tbl;
2526CREATE TABLE smoke_tbl (id TEXT PRIMARY KEY , val TEXT );
2627SELECT cloudsync_init(' smoke_tbl' , ' CLS' , true) AS _init_site_id_b \gset
2728
28- \connect cloudsync_test_c
29+ \connect cloudsync_test_03_c
2930\ir helper_psql_conn_setup .sql
3031CREATE EXTENSION IF NOT EXISTS cloudsync;
3132DROP TABLE IF EXISTS smoke_tbl;
3233CREATE TABLE smoke_tbl (id TEXT PRIMARY KEY , val TEXT );
3334SELECT cloudsync_init(' smoke_tbl' , ' CLS' , true) AS _init_site_id_c \gset
3435
3536-- Round 1: independent inserts on each database
36- \connect cloudsync_test_a
37+ \connect cloudsync_test_03_a
3738INSERT INTO smoke_tbl VALUES (' id1' , ' a1' );
3839INSERT INTO smoke_tbl VALUES (' id2' , ' a2' );
3940SELECT CASE WHEN payload IS NULL OR octet_length(payload) = 0
4748 WHERE site_id = cloudsync_siteid()
4849) AS p \gset
4950
50- \connect cloudsync_test_b
51+ \connect cloudsync_test_03_b
5152INSERT INTO smoke_tbl VALUES (' id3' , ' b3' );
5253SELECT CASE WHEN payload IS NULL OR octet_length(payload) = 0
5354 THEN ' '
6061 WHERE site_id = cloudsync_siteid()
6162) AS p \gset
6263
63- \connect cloudsync_test_c
64+ \connect cloudsync_test_03_c
6465INSERT INTO smoke_tbl VALUES (' id4' , ' c4' );
6566SELECT CASE WHEN payload IS NULL OR octet_length(payload) = 0
6667 THEN ' '
7475) AS p \gset
7576
7677-- Round 1 apply: fan-out changes
77- \connect cloudsync_test_a
78+ \connect cloudsync_test_03_a
7879\if :payload_b_r1_ok
7980SELECT cloudsync_payload_apply(decode(substr(:' payload_b_r1' , 3 ), ' hex' )) AS _apply_a_r1_b \gset
8081\else
@@ -86,7 +87,7 @@ SELECT cloudsync_payload_apply(decode(substr(:'payload_c_r1', 3), 'hex')) AS _ap
8687SELECT 0 AS _apply_a_r1_c \gset
8788\endif
8889
89- \connect cloudsync_test_b
90+ \connect cloudsync_test_03_b
9091\if :payload_a_r1_ok
9192SELECT cloudsync_payload_apply(decode(substr(:' payload_a_r1' , 3 ), ' hex' )) AS _apply_b_r1_a \gset
9293\else
@@ -98,7 +99,7 @@ SELECT cloudsync_payload_apply(decode(substr(:'payload_c_r1', 3), 'hex')) AS _ap
9899SELECT 0 AS _apply_b_r1_c \gset
99100\endif
100101
101- \connect cloudsync_test_c
102+ \connect cloudsync_test_03_c
102103\if :payload_a_r1_ok
103104SELECT cloudsync_payload_apply(decode(substr(:' payload_a_r1' , 3 ), ' hex' )) AS _apply_c_r1_a \gset
104105\else
@@ -111,7 +112,7 @@ SELECT 0 AS _apply_c_r1_b \gset
111112\endif
112113
113114-- Round 2: concurrent updates on the same row + mixed operations
114- \connect cloudsync_test_a
115+ \connect cloudsync_test_03_a
115116UPDATE smoke_tbl SET val = ' a1_a' WHERE id = ' id1' ;
116117DELETE FROM smoke_tbl WHERE id = ' id2' ;
117118INSERT INTO smoke_tbl VALUES (' id5' , ' a5' );
@@ -126,7 +127,7 @@ FROM (
126127 WHERE site_id = cloudsync_siteid()
127128) AS p \gset
128129
129- \connect cloudsync_test_b
130+ \connect cloudsync_test_03_b
130131UPDATE smoke_tbl SET val = ' a1_b' WHERE id = ' id1' ;
131132UPDATE smoke_tbl SET val = ' b3_b' WHERE id = ' id3' ;
132133INSERT INTO smoke_tbl VALUES (' id6' , ' b6' );
@@ -141,7 +142,7 @@ FROM (
141142 WHERE site_id = cloudsync_siteid()
142143) AS p \gset
143144
144- \connect cloudsync_test_c
145+ \connect cloudsync_test_03_c
145146UPDATE smoke_tbl SET val = ' a1_c' WHERE id = ' id1' ;
146147DELETE FROM smoke_tbl WHERE id = ' id4' ;
147148INSERT INTO smoke_tbl VALUES (' id7' , ' c7' );
@@ -157,7 +158,7 @@ FROM (
157158) AS p \gset
158159
159160-- Round 2 apply: fan-out changes
160- \connect cloudsync_test_a
161+ \connect cloudsync_test_03_a
161162\if :payload_b_r2_ok
162163SELECT cloudsync_payload_apply(decode(substr(:' payload_b_r2' , 3 ), ' hex' )) AS _apply_a_r2_b \gset
163164\else
@@ -169,7 +170,7 @@ SELECT cloudsync_payload_apply(decode(substr(:'payload_c_r2', 3), 'hex')) AS _ap
169170SELECT 0 AS _apply_a_r2_c \gset
170171\endif
171172
172- \connect cloudsync_test_b
173+ \connect cloudsync_test_03_b
173174\if :payload_a_r2_ok
174175SELECT cloudsync_payload_apply(decode(substr(:' payload_a_r2' , 3 ), ' hex' )) AS _apply_b_r2_a \gset
175176\else
@@ -181,7 +182,7 @@ SELECT cloudsync_payload_apply(decode(substr(:'payload_c_r2', 3), 'hex')) AS _ap
181182SELECT 0 AS _apply_b_r2_c \gset
182183\endif
183184
184- \connect cloudsync_test_c
185+ \connect cloudsync_test_03_c
185186\if :payload_a_r2_ok
186187SELECT cloudsync_payload_apply(decode(substr(:' payload_a_r2' , 3 ), ' hex' )) AS _apply_c_r2_a \gset
187188\else
@@ -194,7 +195,7 @@ SELECT 0 AS _apply_c_r2_b \gset
194195\endif
195196
196197-- Round 3: additional operations to force another sync cycle
197- \connect cloudsync_test_a
198+ \connect cloudsync_test_03_a
198199UPDATE smoke_tbl SET val = ' b3_a' WHERE id = ' id3' ;
199200SELECT CASE WHEN payload IS NULL OR octet_length(payload) = 0
200201 THEN ' '
@@ -207,7 +208,7 @@ FROM (
207208 WHERE site_id = cloudsync_siteid()
208209) AS p \gset
209210
210- \connect cloudsync_test_b
211+ \connect cloudsync_test_03_b
211212DELETE FROM smoke_tbl WHERE id = ' id5' ;
212213SELECT CASE WHEN payload IS NULL OR octet_length(payload) = 0
213214 THEN ' '
@@ -220,7 +221,7 @@ FROM (
220221 WHERE site_id = cloudsync_siteid()
221222) AS p \gset
222223
223- \connect cloudsync_test_c
224+ \connect cloudsync_test_03_c
224225UPDATE smoke_tbl SET val = ' b6_c' WHERE id = ' id6' ;
225226INSERT INTO smoke_tbl VALUES (' id8' , ' c8' );
226227SELECT CASE WHEN payload IS NULL OR octet_length(payload) = 0
@@ -235,7 +236,7 @@ FROM (
235236) AS p \gset
236237
237238-- Round 3 apply: final fan-out
238- \connect cloudsync_test_a
239+ \connect cloudsync_test_03_a
239240\if :payload_b_r3_ok
240241SELECT cloudsync_payload_apply(decode(substr(:' payload_b_r3' , 3 ), ' hex' )) AS _apply_a_r3_b \gset
241242\else
@@ -247,7 +248,7 @@ SELECT cloudsync_payload_apply(decode(substr(:'payload_c_r3', 3), 'hex')) AS _ap
247248SELECT 0 AS _apply_a_r3_c \gset
248249\endif
249250
250- \connect cloudsync_test_b
251+ \connect cloudsync_test_03_b
251252\if :payload_a_r3_ok
252253SELECT cloudsync_payload_apply(decode(substr(:' payload_a_r3' , 3 ), ' hex' )) AS _apply_b_r3_a \gset
253254\else
@@ -259,7 +260,7 @@ SELECT cloudsync_payload_apply(decode(substr(:'payload_c_r3', 3), 'hex')) AS _ap
259260SELECT 0 AS _apply_b_r3_c \gset
260261\endif
261262
262- \connect cloudsync_test_c
263+ \connect cloudsync_test_03_c
263264\if :payload_a_r3_ok
264265SELECT cloudsync_payload_apply(decode(substr(:' payload_a_r3' , 3 ), ' hex' )) AS _apply_c_r3_a \gset
265266\else
@@ -272,15 +273,15 @@ SELECT 0 AS _apply_c_r3_b \gset
272273\endif
273274
274275-- Final consistency check across all three databases
275- \connect cloudsync_test_a
276+ \connect cloudsync_test_03_a
276277SELECT md5(COALESCE(string_agg(id || ' :' || COALESCE(val, ' ' ), ' ,' ORDER BY id), ' ' )) AS smoke_hash_a
277278FROM smoke_tbl \gset
278279
279- \connect cloudsync_test_b
280+ \connect cloudsync_test_03_b
280281SELECT md5(COALESCE(string_agg(id || ' :' || COALESCE(val, ' ' ), ' ,' ORDER BY id), ' ' )) AS smoke_hash_b
281282FROM smoke_tbl \gset
282283
283- \connect cloudsync_test_c
284+ \connect cloudsync_test_03_c
284285SELECT md5(COALESCE(string_agg(id || ' :' || COALESCE(val, ' ' ), ' ,' ORDER BY id), ' ' )) AS smoke_hash_c
285286FROM smoke_tbl \gset
286287
@@ -291,3 +292,11 @@ SELECT (:'smoke_hash_a' = :'smoke_hash_b' AND :'smoke_hash_a' = :'smoke_hash_c')
291292\echo [FAIL] (:testid) Test multi- db roundtrip with concurrent updates
292293SELECT (:fail::int + 1 ) AS fail \gset
293294\endif
295+
296+ -- Cleanup: Drop test databases if not in DEBUG mode and no failures
297+ \ir helper_test_cleanup .sql
298+ \if :should_cleanup
299+ DROP DATABASE IF EXISTS cloudsync_test_03_a;
300+ DROP DATABASE IF EXISTS cloudsync_test_03_b;
301+ DROP DATABASE IF EXISTS cloudsync_test_03_c;
302+ \endif
0 commit comments