@@ -12309,6 +12309,78 @@ SELECT count(*) FROM remote_application_name
12309
12309
DROP FOREIGN TABLE remote_application_name;
12310
12310
DROP VIEW my_application_name;
12311
12311
-- ===================================================================
12312
+ -- test read-only and/or deferrable transactions
12313
+ -- ===================================================================
12314
+ CREATE TABLE loct (f1 int, f2 text);
12315
+ CREATE FUNCTION locf() RETURNS SETOF loct LANGUAGE SQL AS
12316
+ 'UPDATE public.loct SET f2 = f2 || f2 RETURNING *';
12317
+ CREATE VIEW locv AS SELECT t.* FROM locf() t;
12318
+ CREATE FOREIGN TABLE remt (f1 int, f2 text)
12319
+ SERVER loopback OPTIONS (table_name 'locv');
12320
+ INSERT INTO loct VALUES (1, 'foo'), (2, 'bar');
12321
+ SELECT * FROM loct;
12322
+ f1 | f2
12323
+ ----+-----
12324
+ 1 | foo
12325
+ 2 | bar
12326
+ (2 rows)
12327
+
12328
+ SELECT * FROM remt; -- should work
12329
+ f1 | f2
12330
+ ----+--------
12331
+ 1 | foofoo
12332
+ 2 | barbar
12333
+ (2 rows)
12334
+
12335
+ SELECT * FROM loct;
12336
+ f1 | f2
12337
+ ----+--------
12338
+ 1 | foofoo
12339
+ 2 | barbar
12340
+ (2 rows)
12341
+
12342
+ START TRANSACTION READ ONLY;
12343
+ SELECT * FROM remt; -- should fail
12344
+ ERROR: cannot execute UPDATE in a read-only transaction
12345
+ CONTEXT: SQL function "locf" statement 1
12346
+ remote SQL command: SELECT f1, f2 FROM public.locv
12347
+ ROLLBACK;
12348
+ DROP FOREIGN TABLE remt;
12349
+ CREATE FOREIGN TABLE remt (f1 int, f2 text)
12350
+ SERVER loopback OPTIONS (table_name 'loct');
12351
+ START TRANSACTION ISOLATION LEVEL SERIALIZABLE READ ONLY;
12352
+ SELECT * FROM remt;
12353
+ f1 | f2
12354
+ ----+--------
12355
+ 1 | foofoo
12356
+ 2 | barbar
12357
+ (2 rows)
12358
+
12359
+ COMMIT;
12360
+ START TRANSACTION ISOLATION LEVEL SERIALIZABLE DEFERRABLE;
12361
+ SELECT * FROM remt;
12362
+ f1 | f2
12363
+ ----+--------
12364
+ 1 | foofoo
12365
+ 2 | barbar
12366
+ (2 rows)
12367
+
12368
+ COMMIT;
12369
+ START TRANSACTION ISOLATION LEVEL SERIALIZABLE READ ONLY DEFERRABLE;
12370
+ SELECT * FROM remt;
12371
+ f1 | f2
12372
+ ----+--------
12373
+ 1 | foofoo
12374
+ 2 | barbar
12375
+ (2 rows)
12376
+
12377
+ COMMIT;
12378
+ -- Clean up
12379
+ DROP FOREIGN TABLE remt;
12380
+ DROP VIEW locv;
12381
+ DROP FUNCTION locf();
12382
+ DROP TABLE loct;
12383
+ -- ===================================================================
12312
12384
-- test parallel commit and parallel abort
12313
12385
-- ===================================================================
12314
12386
ALTER SERVER loopback OPTIONS (ADD parallel_commit 'true');
0 commit comments