@@ -10070,6 +10070,60 @@ SELECT t1.a, t2.b FROM fprt1 t1 INNER JOIN fprt2 t2 ON (t1.a = t2.b) WHERE t1.a
10070
10070
400 | 400
10071
10071
(4 rows)
10072
10072
10073
+ -- Apply AJ to foreign tables
10074
+ EXPLAIN (COSTS OFF)
10075
+ SELECT t1.a,t2.b FROM fprt1 t1 , ftprt2_p1 t2 WHERE (t1.a = t2.b) AND t2.c like '%0004' ORDER BY 1,2;
10076
+ QUERY PLAN
10077
+ ---------------------------------------------------------------
10078
+ Merge Append
10079
+ Sort Key: t1.a
10080
+ -> Foreign Scan
10081
+ Relations: (ftprt1_p1 t1_1) INNER JOIN (ftprt2_p1 t2)
10082
+ -> Foreign Scan
10083
+ Relations: (ftprt1_p2 t1_2) INNER JOIN (ftprt2_p1 t2)
10084
+ (6 rows)
10085
+
10086
+ SELECT t1.a,t2.b FROM fprt1 t1 , ftprt2_p1 t2 WHERE (t1.a = t2.b) AND t2.c like '%0004' ORDER BY 1,2;
10087
+ a | b
10088
+ -----+-----
10089
+ 204 | 204
10090
+ 210 | 210
10091
+ 216 | 216
10092
+ 222 | 222
10093
+ 228 | 228
10094
+ 234 | 234
10095
+ 240 | 240
10096
+ 246 | 246
10097
+ (8 rows)
10098
+
10099
+ -- FOR UPDATE requires whole-row reference, and so asymmetric join doesn't apply
10100
+ EXPLAIN (COSTS OFF)
10101
+ SELECT t1.a,t2.b FROM fprt1 t1 , ftprt2_p1 t2 WHERE (t1.a = t2.b) AND t2.c like '%0004' ORDER BY 1,2 FOR UPDATE OF t2;
10102
+ QUERY PLAN
10103
+ --------------------------------------------------
10104
+ LockRows
10105
+ -> Merge Join
10106
+ Merge Cond: (t1.a = t2.b)
10107
+ -> Append
10108
+ -> Foreign Scan on ftprt1_p1 t1_1
10109
+ -> Foreign Scan on ftprt1_p2 t1_2
10110
+ -> Materialize
10111
+ -> Foreign Scan on ftprt2_p1 t2
10112
+ (8 rows)
10113
+
10114
+ SELECT t1.a,t2.b FROM fprt1 t1 , ftprt2_p1 t2 WHERE (t1.a = t2.b) AND t2.c like '%0004' ORDER BY 1,2 FOR UPDATE OF t2;
10115
+ a | b
10116
+ -----+-----
10117
+ 204 | 204
10118
+ 210 | 210
10119
+ 216 | 216
10120
+ 222 | 222
10121
+ 228 | 228
10122
+ 234 | 234
10123
+ 240 | 240
10124
+ 246 | 246
10125
+ (8 rows)
10126
+
10073
10127
RESET enable_partitionwise_join;
10074
10128
-- ===================================================================
10075
10129
-- test partitionwise aggregates
@@ -11338,25 +11392,32 @@ RESET enable_partitionwise_join;
11338
11392
SET enable_hashjoin TO false;
11339
11393
EXPLAIN (VERBOSE, COSTS OFF)
11340
11394
INSERT INTO join_tbl SELECT * FROM async_p1 t1, async_pt t2 WHERE t1.a = t2.a AND t1.b = t2.b AND t1.b % 100 = 0;
11341
- QUERY PLAN
11342
- ----------------------------------------------------------------------------------------
11395
+ QUERY PLAN
11396
+ -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
11343
11397
Insert on public.join_tbl
11344
- -> Nested Loop
11345
- Output: t1.a, t1.b, t1.c, t2.a, t2.b, t2.c
11346
- Join Filter: ((t1.a = t2.a) AND (t1.b = t2.b))
11347
- -> Foreign Scan on public.async_p1 t1
11348
- Output: t1.a, t1.b, t1.c
11349
- Remote SQL: SELECT a, b, c FROM public.base_tbl1 WHERE (((b % 100) = 0))
11350
- -> Append
11351
- -> Async Foreign Scan on public.async_p1 t2_1
11352
- Output: t2_1.a, t2_1.b, t2_1.c
11353
- Remote SQL: SELECT a, b, c FROM public.base_tbl1
11354
- -> Async Foreign Scan on public.async_p2 t2_2
11398
+ -> Append
11399
+ -> Async Foreign Scan
11400
+ Output: t1.a, t1.b, t1.c, t2_1.a, t2_1.b, t2_1.c
11401
+ Relations: (public.async_p1 t2_1) INNER JOIN (public.async_p1 t1)
11402
+ Remote SQL: SELECT r3.a, r3.b, r3.c, r5.a, r5.b, r5.c FROM (public.base_tbl1 r5 INNER JOIN public.base_tbl1 r3 ON (((r3.a = r5.a)) AND ((r3.b = r5.b)) AND (((r3.b % 100) = 0))))
11403
+ -> Nested Loop
11404
+ Output: t1.a, t1.b, t1.c, t2_2.a, t2_2.b, t2_2.c
11405
+ Join Filter: ((t1.a = t2_2.a) AND (t1.b = t2_2.b))
11406
+ -> Foreign Scan on public.async_p1 t1
11407
+ Output: t1.a, t1.b, t1.c
11408
+ Remote SQL: SELECT a, b, c FROM public.base_tbl1 WHERE (((b % 100) = 0))
11409
+ -> Foreign Scan on public.async_p2 t2_2
11355
11410
Output: t2_2.a, t2_2.b, t2_2.c
11356
11411
Remote SQL: SELECT a, b, c FROM public.base_tbl2
11412
+ -> Nested Loop
11413
+ Output: t1.a, t1.b, t1.c, t2_3.a, t2_3.b, t2_3.c
11414
+ Join Filter: ((t1.a = t2_3.a) AND (t1.b = t2_3.b))
11415
+ -> Foreign Scan on public.async_p1 t1
11416
+ Output: t1.a, t1.b, t1.c
11417
+ Remote SQL: SELECT a, b, c FROM public.base_tbl1 WHERE (((b % 100) = 0))
11357
11418
-> Seq Scan on public.async_p3 t2_3
11358
11419
Output: t2_3.a, t2_3.b, t2_3.c
11359
- (16 rows)
11420
+ (23 rows)
11360
11421
11361
11422
INSERT INTO join_tbl SELECT * FROM async_p1 t1, async_pt t2 WHERE t1.a = t2.a AND t1.b = t2.b AND t1.b % 100 = 0;
11362
11423
SELECT * FROM join_tbl ORDER BY a1;
@@ -11464,39 +11525,61 @@ ALTER FOREIGN TABLE async_p1 OPTIONS (use_remote_estimate 'true');
11464
11525
ALTER FOREIGN TABLE async_p2 OPTIONS (use_remote_estimate 'true');
11465
11526
EXPLAIN (VERBOSE, COSTS OFF)
11466
11527
SELECT * FROM local_tbl, async_pt WHERE local_tbl.a = async_pt.a AND local_tbl.c = 'bar';
11467
- QUERY PLAN
11468
- ------------------------------------------------------------------------------------------
11469
- Nested Loop
11470
- Output: local_tbl.a, local_tbl.b, local_tbl.c, async_pt.a, async_pt.b, async_pt.c
11471
- -> Seq Scan on public. local_tbl
11472
- Output: local_tbl.a, local_tbl.b, local_tbl.c
11473
- Filter: ( local_tbl.c = 'bar'::text)
11474
- -> Append
11475
- -> Async Foreign Scan on public.async_p1 async_pt_1
11528
+ QUERY PLAN
11529
+ -------------------------------------------------------------------------------------------------
11530
+ Append
11531
+ -> Nested Loop
11532
+ Output: local_tbl.a, local_tbl.b, local_tbl.c, async_pt_1.a, async_pt_1.b, async_pt_1.c
11533
+ -> Seq Scan on public.local_tbl
11534
+ Output: local_tbl.a, local_tbl.b, local_tbl.c
11535
+ Filter: (local_tbl.c = 'bar'::text)
11536
+ -> Foreign Scan on public.async_p1 async_pt_1
11476
11537
Output: async_pt_1.a, async_pt_1.b, async_pt_1.c
11477
11538
Remote SQL: SELECT a, b, c FROM public.base_tbl1 WHERE ((a = $1::integer))
11478
- -> Async Foreign Scan on public.async_p2 async_pt_2
11539
+ -> Nested Loop
11540
+ Output: local_tbl.a, local_tbl.b, local_tbl.c, async_pt_2.a, async_pt_2.b, async_pt_2.c
11541
+ -> Seq Scan on public.local_tbl
11542
+ Output: local_tbl.a, local_tbl.b, local_tbl.c
11543
+ Filter: (local_tbl.c = 'bar'::text)
11544
+ -> Foreign Scan on public.async_p2 async_pt_2
11479
11545
Output: async_pt_2.a, async_pt_2.b, async_pt_2.c
11480
11546
Remote SQL: SELECT a, b, c FROM public.base_tbl2 WHERE ((a = $1::integer))
11547
+ -> Hash Join
11548
+ Output: local_tbl.a, local_tbl.b, local_tbl.c, async_pt_3.a, async_pt_3.b, async_pt_3.c
11549
+ Hash Cond: (async_pt_3.a = local_tbl.a)
11481
11550
-> Seq Scan on public.async_p3 async_pt_3
11482
11551
Output: async_pt_3.a, async_pt_3.b, async_pt_3.c
11483
- Filter: (async_pt_3.a = local_tbl.a)
11484
- (15 rows)
11552
+ -> Hash
11553
+ Output: local_tbl.a, local_tbl.b, local_tbl.c
11554
+ -> Seq Scan on public.local_tbl
11555
+ Output: local_tbl.a, local_tbl.b, local_tbl.c
11556
+ Filter: (local_tbl.c = 'bar'::text)
11557
+ (27 rows)
11485
11558
11486
11559
EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
11487
11560
SELECT * FROM local_tbl, async_pt WHERE local_tbl.a = async_pt.a AND local_tbl.c = 'bar';
11488
- QUERY PLAN
11489
- -------------------------------------------------------------------------------
11490
- Nested Loop (actual rows=1 loops=1)
11491
- -> Seq Scan on local_tbl (actual rows=1 loops=1)
11492
- Filter: (c = 'bar'::text)
11493
- Rows Removed by Filter: 1
11494
- -> Append (actual rows=1 loops=1)
11495
- -> Async Foreign Scan on async_p1 async_pt_1 (never executed)
11496
- -> Async Foreign Scan on async_p2 async_pt_2 (actual rows=1 loops=1)
11497
- -> Seq Scan on async_p3 async_pt_3 (never executed)
11498
- Filter: (a = local_tbl.a)
11499
- (9 rows)
11561
+ QUERY PLAN
11562
+ -------------------------------------------------------------------------
11563
+ Append (actual rows=1 loops=1)
11564
+ -> Nested Loop (actual rows=0 loops=1)
11565
+ -> Seq Scan on local_tbl (actual rows=1 loops=1)
11566
+ Filter: (c = 'bar'::text)
11567
+ Rows Removed by Filter: 1
11568
+ -> Foreign Scan on async_p1 async_pt_1 (actual rows=0 loops=1)
11569
+ -> Nested Loop (actual rows=1 loops=1)
11570
+ -> Seq Scan on local_tbl (actual rows=1 loops=1)
11571
+ Filter: (c = 'bar'::text)
11572
+ Rows Removed by Filter: 1
11573
+ -> Foreign Scan on async_p2 async_pt_2 (actual rows=1 loops=1)
11574
+ -> Hash Join (actual rows=0 loops=1)
11575
+ Hash Cond: (async_pt_3.a = local_tbl.a)
11576
+ -> Seq Scan on async_p3 async_pt_3 (actual rows=200 loops=1)
11577
+ -> Hash (actual rows=1 loops=1)
11578
+ Buckets: 1024 Batches: 1 Memory Usage: 9kB
11579
+ -> Seq Scan on local_tbl (actual rows=1 loops=1)
11580
+ Filter: (c = 'bar'::text)
11581
+ Rows Removed by Filter: 1
11582
+ (19 rows)
11500
11583
11501
11584
SELECT * FROM local_tbl, async_pt WHERE local_tbl.a = async_pt.a AND local_tbl.c = 'bar';
11502
11585
a | b | c | a | b | c
@@ -11670,29 +11753,45 @@ SET enable_mergejoin TO false;
11670
11753
SET enable_hashjoin TO false;
11671
11754
EXPLAIN (VERBOSE, COSTS OFF)
11672
11755
SELECT * FROM async_pt t1, async_p2 t2 WHERE t1.a = t2.a AND t1.b === 505;
11673
- QUERY PLAN
11674
- ----------------------------------------------------------------
11675
- Nested Loop
11676
- Output: t1.a, t1.b, t1.c, t2.a, t2.b, t2.c
11677
- Join Filter: (t1.a = t2.a)
11678
- -> Append
11679
- -> Async Foreign Scan on public.async_p1 t1_1
11756
+ QUERY PLAN
11757
+ ----------------------------------------------------------------------
11758
+ Append
11759
+ -> Nested Loop
11760
+ Output: t1_1.a, t1_1.b, t1_1.c, t2.a, t2.b, t2.c
11761
+ Join Filter: (t1_1.a = t2.a)
11762
+ -> Foreign Scan on public.async_p2 t2
11763
+ Output: t2.a, t2.b, t2.c
11764
+ Remote SQL: SELECT a, b, c FROM public.base_tbl2
11765
+ -> Materialize
11680
11766
Output: t1_1.a, t1_1.b, t1_1.c
11681
- Filter: (t1_1.b === 505)
11682
- Remote SQL: SELECT a, b, c FROM public.base_tbl1
11683
- -> Async Foreign Scan on public.async_p2 t1_2
11684
- Output: t1_2.a, t1_2.b, t1_2.c
11685
- Filter: (t1_2.b === 505)
11767
+ -> Foreign Scan on public.async_p1 t1_1
11768
+ Output: t1_1.a, t1_1.b, t1_1.c
11769
+ Filter: (t1_1.b === 505)
11770
+ Remote SQL: SELECT a, b, c FROM public.base_tbl1
11771
+ -> Nested Loop
11772
+ Output: t1_2.a, t1_2.b, t1_2.c, t2.a, t2.b, t2.c
11773
+ Join Filter: (t1_2.a = t2.a)
11774
+ -> Foreign Scan on public.async_p2 t2
11775
+ Output: t2.a, t2.b, t2.c
11686
11776
Remote SQL: SELECT a, b, c FROM public.base_tbl2
11687
- -> Seq Scan on public.async_p3 t1_3
11688
- Output: t1_3.a, t1_3.b, t1_3.c
11689
- Filter: (t1_3.b === 505)
11690
- -> Materialize
11691
- Output: t2.a, t2.b, t2.c
11777
+ -> Materialize
11778
+ Output: t1_2.a, t1_2.b, t1_2.c
11779
+ -> Foreign Scan on public.async_p2 t1_2
11780
+ Output: t1_2.a, t1_2.b, t1_2.c
11781
+ Filter: (t1_2.b === 505)
11782
+ Remote SQL: SELECT a, b, c FROM public.base_tbl2
11783
+ -> Nested Loop
11784
+ Output: t1_3.a, t1_3.b, t1_3.c, t2.a, t2.b, t2.c
11785
+ Join Filter: (t1_3.a = t2.a)
11692
11786
-> Foreign Scan on public.async_p2 t2
11693
11787
Output: t2.a, t2.b, t2.c
11694
11788
Remote SQL: SELECT a, b, c FROM public.base_tbl2
11695
- (20 rows)
11789
+ -> Materialize
11790
+ Output: t1_3.a, t1_3.b, t1_3.c
11791
+ -> Seq Scan on public.async_p3 t1_3
11792
+ Output: t1_3.a, t1_3.b, t1_3.c
11793
+ Filter: (t1_3.b === 505)
11794
+ (36 rows)
11696
11795
11697
11796
SELECT * FROM async_pt t1, async_p2 t2 WHERE t1.a = t2.a AND t1.b === 505;
11698
11797
a | b | c | a | b | c
0 commit comments