@@ -35,6 +35,9 @@ CREATE TABLE "S 1"."T 1" (
35
35
c8 user_enum,
36
36
CONSTRAINT t1_pkey PRIMARY KEY ("C 1")
37
37
);
38
+ -- "S 1"."T 1" will be heavily updated below, so disable autovacuum for
39
+ -- the table to avoid unexpected effects of that
40
+ ALTER TABLE "S 1"."T 1" SET (autovacuum_enabled = 'false');
38
41
CREATE TABLE "S 1"."T 2" (
39
42
c1 int NOT NULL,
40
43
c2 text,
@@ -4244,10 +4247,6 @@ explain (verbose, costs off) select * from ft3 f, loct3 l
4244
4247
-- ===================================================================
4245
4248
-- test writable foreign table stuff
4246
4249
-- ===================================================================
4247
- -- Autovacuum on the remote side might affect remote estimates,
4248
- -- so use local stats on ft2 as well
4249
- ALTER FOREIGN TABLE ft2 OPTIONS (SET use_remote_estimate 'false');
4250
- ANALYZE ft2;
4251
4250
EXPLAIN (verbose, costs off)
4252
4251
INSERT INTO ft2 (c1,c2,c3) SELECT c1+1000,c2+100, c3 || c3 FROM ft2 LIMIT 20;
4253
4252
QUERY PLAN
@@ -5524,32 +5523,32 @@ UPDATE ft2 SET c3 = 'baz'
5524
5523
FROM ft4 INNER JOIN ft5 ON (ft4.c1 = ft5.c1)
5525
5524
WHERE ft2.c1 > 2000 AND ft2.c2 === ft4.c1
5526
5525
RETURNING ft2.*, ft4.*, ft5.*; -- can't be pushed down
5527
- QUERY PLAN
5528
- -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
5526
+ QUERY PLAN
5527
+ ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
5529
5528
Update on public.ft2
5530
5529
Output: ft2.c1, ft2.c2, ft2.c3, ft2.c4, ft2.c5, ft2.c6, ft2.c7, ft2.c8, ft4.c1, ft4.c2, ft4.c3, ft5.c1, ft5.c2, ft5.c3
5531
5530
Remote SQL: UPDATE "S 1"."T 1" SET c3 = $2 WHERE ctid = $1 RETURNING "C 1", c2, c3, c4, c5, c6, c7, c8
5532
- -> Hash Join
5531
+ -> Nested Loop
5533
5532
Output: ft2.c1, ft2.c2, NULL::integer, 'baz'::text, ft2.c4, ft2.c5, ft2.c6, ft2.c7, ft2.c8, ft2.ctid, ft4.*, ft5.*, ft4.c1, ft4.c2, ft4.c3, ft5.c1, ft5.c2, ft5.c3
5534
- Hash Cond: (ft4.c1 = ft5.c1)
5533
+ Join Filter: (ft2.c2 === ft4.c1)
5534
+ -> Foreign Scan on public.ft2
5535
+ Output: ft2.c1, ft2.c2, ft2.c4, ft2.c5, ft2.c6, ft2.c7, ft2.c8, ft2.ctid
5536
+ Remote SQL: SELECT "C 1", c2, c4, c5, c6, c7, c8, ctid FROM "S 1"."T 1" WHERE (("C 1" > 2000)) FOR UPDATE
5535
5537
-> Foreign Scan
5536
- Output: ft2.c1, ft2.c2, ft2.c4, ft2.c5, ft2.c6, ft2.c7, ft2.c8, ft2.ctid, ft4.*, ft4.c1, ft4.c2, ft4.c3
5537
- Filter: (ft2.c2 === ft4.c1)
5538
- Relations: (public.ft2) INNER JOIN (public.ft4)
5539
- Remote SQL: SELECT r1."C 1", r1.c2, r1.c4, r1.c5, r1.c6, r1.c7, r1.c8, r1.ctid, CASE WHEN (r2.*)::text IS NOT NULL THEN ROW(r2.c1, r2.c2, r2.c3) END, r2.c1, r2.c2, r2.c3 FROM ("S 1"."T 1" r1 INNER JOIN "S 1"."T 3" r2 ON (((r1."C 1" > 2000)))) FOR UPDATE OF r1
5540
- -> Nested Loop
5541
- Output: ft2.c1, ft2.c2, ft2.c4, ft2.c5, ft2.c6, ft2.c7, ft2.c8, ft2.ctid, ft4.*, ft4.c1, ft4.c2, ft4.c3
5542
- -> Foreign Scan on public.ft2
5543
- Output: ft2.c1, ft2.c2, ft2.c4, ft2.c5, ft2.c6, ft2.c7, ft2.c8, ft2.ctid
5544
- Remote SQL: SELECT "C 1", c2, c4, c5, c6, c7, c8, ctid FROM "S 1"."T 1" WHERE (("C 1" > 2000)) FOR UPDATE
5538
+ Output: ft4.*, ft4.c1, ft4.c2, ft4.c3, ft5.*, ft5.c1, ft5.c2, ft5.c3
5539
+ Relations: (public.ft4) INNER JOIN (public.ft5)
5540
+ Remote SQL: SELECT CASE WHEN (r2.*)::text IS NOT NULL THEN ROW(r2.c1, r2.c2, r2.c3) END, r2.c1, r2.c2, r2.c3, CASE WHEN (r3.*)::text IS NOT NULL THEN ROW(r3.c1, r3.c2, r3.c3) END, r3.c1, r3.c2, r3.c3 FROM ("S 1"."T 3" r2 INNER JOIN "S 1"."T 4" r3 ON (((r2.c1 = r3.c1))))
5541
+ -> Hash Join
5542
+ Output: ft4.*, ft4.c1, ft4.c2, ft4.c3, ft5.*, ft5.c1, ft5.c2, ft5.c3
5543
+ Hash Cond: (ft4.c1 = ft5.c1)
5545
5544
-> Foreign Scan on public.ft4
5546
5545
Output: ft4.*, ft4.c1, ft4.c2, ft4.c3
5547
5546
Remote SQL: SELECT c1, c2, c3 FROM "S 1"."T 3"
5548
- -> Hash
5549
- Output: ft5.*, ft5.c1, ft5.c2, ft5.c3
5550
- -> Foreign Scan on public.ft5
5551
- Output: ft5.*, ft5.c1, ft5.c2, ft5.c3
5552
- Remote SQL: SELECT c1, c2, c3 FROM "S 1"."T 4"
5547
+ -> Hash
5548
+ Output: ft5.*, ft5.c1, ft5.c2, ft5.c3
5549
+ -> Foreign Scan on public.ft5
5550
+ Output: ft5.*, ft5.c1, ft5.c2, ft5.c3
5551
+ Remote SQL: SELECT c1, c2, c3 FROM "S 1"."T 4"
5553
5552
(24 rows)
5554
5553
5555
5554
UPDATE ft2 SET c3 = 'baz'
@@ -6003,9 +6002,7 @@ select c2, count(*) from "S 1"."T 1" where c2 < 500 group by 1 order by 1;
6003
6002
407 | 100
6004
6003
(13 rows)
6005
6004
6006
- -- Go back to use remote-estimate mode on ft2
6007
6005
VACUUM ANALYZE "S 1"."T 1";
6008
- ALTER FOREIGN TABLE ft2 OPTIONS (SET use_remote_estimate 'true');
6009
6006
-- Above DMLs add data with c6 as NULL in ft1, so test ORDER BY NULLS LAST and NULLs
6010
6007
-- FIRST behavior here.
6011
6008
-- ORDER BY DESC NULLS LAST options
0 commit comments