mirror of
https://github.com/postgres/postgres.git
synced 2025-06-11 20:28:21 +03:00
postgres_fdw: Fix the fix for crash when pushing down multiple joins.
Commit 3151f16e18
was intended to be
a commit of a patch from Ashutosh Bapat, but instead I mistakenly
committed an earlier version from Michael Paquier (because both
patches were submitted with the same filename, and I confused them).
Michael's patch fixes the crash but doesn't actually implement the
correct test.
Repair the incorrect logic, and also expand the comments considerably
so that this is all more clear.
Ashutosh Bapat and Robert Haas
This commit is contained in:
@ -478,6 +478,74 @@ SELECT t1."C 1" FROM "S 1"."T 1" t1 left join ft1 t2 join ft2 t3 on (t2.c1 = t3.
|
||||
110
|
||||
(10 rows)
|
||||
|
||||
-- Test similar to above, except that the full join prevents any equivalence
|
||||
-- classes from being merged. This produces single relation equivalence classes
|
||||
-- included in join restrictions.
|
||||
EXPLAIN (COSTS false, VERBOSE)
|
||||
SELECT t1."C 1", t2.c1, t3.c1 FROM "S 1"."T 1" t1 left join ft1 t2 full join ft2 t3 on (t2.c1 = t3.c1) on (t3.c1 = t1."C 1") OFFSET 100 LIMIT 10;
|
||||
QUERY PLAN
|
||||
------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
Limit
|
||||
Output: t1."C 1", t2.c1, t3.c1
|
||||
-> Merge Right Join
|
||||
Output: t1."C 1", t2.c1, t3.c1
|
||||
Merge Cond: (t3.c1 = t1."C 1")
|
||||
-> Foreign Scan
|
||||
Output: t3.c1, t2.c1
|
||||
Relations: (public.ft2 t3) LEFT JOIN (public.ft1 t2)
|
||||
Remote SQL: SELECT r3."C 1", r2."C 1" FROM ("S 1"."T 1" r3 LEFT JOIN "S 1"."T 1" r2 ON (((r2."C 1" = r3."C 1")))) ORDER BY r3."C 1" ASC NULLS LAST
|
||||
-> Index Only Scan using t1_pkey on "S 1"."T 1" t1
|
||||
Output: t1."C 1"
|
||||
(11 rows)
|
||||
|
||||
SELECT t1."C 1", t2.c1, t3.c1 FROM "S 1"."T 1" t1 left join ft1 t2 full join ft2 t3 on (t2.c1 = t3.c1) on (t3.c1 = t1."C 1") OFFSET 100 LIMIT 10;
|
||||
C 1 | c1 | c1
|
||||
-----+-----+-----
|
||||
101 | 101 | 101
|
||||
102 | 102 | 102
|
||||
103 | 103 | 103
|
||||
104 | 104 | 104
|
||||
105 | 105 | 105
|
||||
106 | 106 | 106
|
||||
107 | 107 | 107
|
||||
108 | 108 | 108
|
||||
109 | 109 | 109
|
||||
110 | 110 | 110
|
||||
(10 rows)
|
||||
|
||||
-- Test similar to above with all full outer joins
|
||||
EXPLAIN (COSTS false, VERBOSE)
|
||||
SELECT t1."C 1", t2.c1, t3.c1 FROM "S 1"."T 1" t1 full join ft1 t2 full join ft2 t3 on (t2.c1 = t3.c1) on (t3.c1 = t1."C 1") OFFSET 100 LIMIT 10;
|
||||
QUERY PLAN
|
||||
------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
Limit
|
||||
Output: t1."C 1", t2.c1, t3.c1
|
||||
-> Merge Full Join
|
||||
Output: t1."C 1", t2.c1, t3.c1
|
||||
Merge Cond: (t3.c1 = t1."C 1")
|
||||
-> Foreign Scan
|
||||
Output: t2.c1, t3.c1
|
||||
Relations: (public.ft1 t2) FULL JOIN (public.ft2 t3)
|
||||
Remote SQL: SELECT r2."C 1", r3."C 1" FROM ("S 1"."T 1" r2 FULL JOIN "S 1"."T 1" r3 ON (((r2."C 1" = r3."C 1")))) ORDER BY r3."C 1" ASC NULLS LAST
|
||||
-> Index Only Scan using t1_pkey on "S 1"."T 1" t1
|
||||
Output: t1."C 1"
|
||||
(11 rows)
|
||||
|
||||
SELECT t1."C 1", t2.c1, t3.c1 FROM "S 1"."T 1" t1 full join ft1 t2 full join ft2 t3 on (t2.c1 = t3.c1) on (t3.c1 = t1."C 1") OFFSET 100 LIMIT 10;
|
||||
C 1 | c1 | c1
|
||||
-----+-----+-----
|
||||
101 | 101 | 101
|
||||
102 | 102 | 102
|
||||
103 | 103 | 103
|
||||
104 | 104 | 104
|
||||
105 | 105 | 105
|
||||
106 | 106 | 106
|
||||
107 | 107 | 107
|
||||
108 | 108 | 108
|
||||
109 | 109 | 109
|
||||
110 | 110 | 110
|
||||
(10 rows)
|
||||
|
||||
RESET enable_hashjoin;
|
||||
RESET enable_nestloop;
|
||||
-- ===================================================================
|
||||
|
Reference in New Issue
Block a user