mirror of
https://github.com/postgres/postgres.git
synced 2025-07-26 01:22:12 +03:00
Fix possible crash in partition-wise join.
The previous code assumed that we'd always succeed in creating child-joins for a joinrel for which partition-wise join was considered, but that's not guaranteed, at least in the case where dummy rels are involved. Ashutosh Bapat, with some wordsmithing by me. Discussion: http://postgr.es/m/CAFjFpRf8=uyMYYfeTBjWDMs1tR5t--FgOe2vKZPULxxdYQ4RNw@mail.gmail.com
This commit is contained in:
@ -1217,24 +1217,31 @@ SELECT t1.a, t1.c, t2.b, t2.c FROM (SELECT * FROM prt1 WHERE a = 1 AND a = 2) t1
|
||||
(2 rows)
|
||||
|
||||
EXPLAIN (COSTS OFF)
|
||||
SELECT t1.a, t1.c, t2.b, t2.c FROM (SELECT * FROM prt1 WHERE a = 1 AND a = 2) t1 RIGHT JOIN prt2 t2 ON t1.a = t2.b WHERE t2.a = 0 ORDER BY t1.a, t2.b;
|
||||
QUERY PLAN
|
||||
--------------------------------------------
|
||||
Sort
|
||||
Sort Key: a, t2.b
|
||||
-> Hash Left Join
|
||||
Hash Cond: (t2.b = a)
|
||||
-> Append
|
||||
-> Seq Scan on prt2_p1 t2
|
||||
Filter: (a = 0)
|
||||
-> Seq Scan on prt2_p2 t2_1
|
||||
Filter: (a = 0)
|
||||
-> Seq Scan on prt2_p3 t2_2
|
||||
Filter: (a = 0)
|
||||
-> Hash
|
||||
-> Result
|
||||
One-Time Filter: false
|
||||
(14 rows)
|
||||
SELECT t1.a, t1.c, t2.b, t2.c FROM (SELECT * FROM prt1 WHERE a = 1 AND a = 2) t1 RIGHT JOIN prt2 t2 ON t1.a = t2.b, prt1 t3 WHERE t2.b = t3.a;
|
||||
QUERY PLAN
|
||||
--------------------------------------------------
|
||||
Hash Left Join
|
||||
Hash Cond: (t2.b = a)
|
||||
-> Append
|
||||
-> Hash Join
|
||||
Hash Cond: (t3.a = t2.b)
|
||||
-> Seq Scan on prt1_p1 t3
|
||||
-> Hash
|
||||
-> Seq Scan on prt2_p1 t2
|
||||
-> Hash Join
|
||||
Hash Cond: (t3_1.a = t2_1.b)
|
||||
-> Seq Scan on prt1_p2 t3_1
|
||||
-> Hash
|
||||
-> Seq Scan on prt2_p2 t2_1
|
||||
-> Hash Join
|
||||
Hash Cond: (t3_2.a = t2_2.b)
|
||||
-> Seq Scan on prt1_p3 t3_2
|
||||
-> Hash
|
||||
-> Seq Scan on prt2_p3 t2_2
|
||||
-> Hash
|
||||
-> Result
|
||||
One-Time Filter: false
|
||||
(21 rows)
|
||||
|
||||
EXPLAIN (COSTS OFF)
|
||||
SELECT t1.a, t1.c, t2.b, t2.c FROM (SELECT * FROM prt1 WHERE a = 1 AND a = 2) t1 FULL JOIN prt2 t2 ON t1.a = t2.b WHERE t2.a = 0 ORDER BY t1.a, t2.b;
|
||||
|
@ -224,7 +224,7 @@ EXPLAIN (COSTS OFF)
|
||||
SELECT t1.a, t1.c, t2.b, t2.c FROM (SELECT * FROM prt1 WHERE a = 1 AND a = 2) t1 LEFT JOIN prt2 t2 ON t1.a = t2.b;
|
||||
|
||||
EXPLAIN (COSTS OFF)
|
||||
SELECT t1.a, t1.c, t2.b, t2.c FROM (SELECT * FROM prt1 WHERE a = 1 AND a = 2) t1 RIGHT JOIN prt2 t2 ON t1.a = t2.b WHERE t2.a = 0 ORDER BY t1.a, t2.b;
|
||||
SELECT t1.a, t1.c, t2.b, t2.c FROM (SELECT * FROM prt1 WHERE a = 1 AND a = 2) t1 RIGHT JOIN prt2 t2 ON t1.a = t2.b, prt1 t3 WHERE t2.b = t3.a;
|
||||
|
||||
EXPLAIN (COSTS OFF)
|
||||
SELECT t1.a, t1.c, t2.b, t2.c FROM (SELECT * FROM prt1 WHERE a = 1 AND a = 2) t1 FULL JOIN prt2 t2 ON t1.a = t2.b WHERE t2.a = 0 ORDER BY t1.a, t2.b;
|
||||
|
Reference in New Issue
Block a user