Skip to content

Commit 7df4cf7

Browse files
committed
Fix oversight in join removal patch: we have to delete the removed relation
from SpecialJoinInfo relid sets as well. Per example from Vaclav Novotny.
1 parent c851884 commit 7df4cf7

File tree

3 files changed

+39
-1
lines changed

3 files changed

+39
-1
lines changed

src/backend/optimizer/plan/analyzejoins.c

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
*
1717
*
1818
* IDENTIFICATION
19-
* $PostgreSQL: pgsql/src/backend/optimizer/plan/analyzejoins.c,v 1.1 2010/03/28 22:59:32 tgl Exp $
19+
* $PostgreSQL: pgsql/src/backend/optimizer/plan/analyzejoins.c,v 1.2 2010/05/23 16:34:38 tgl Exp $
2020
*
2121
*-------------------------------------------------------------------------
2222
*/
@@ -343,6 +343,24 @@ remove_rel_from_query(PlannerInfo *root, int relid)
343343
}
344344
}
345345

346+
/*
347+
* Likewise remove references from SpecialJoinInfo data structures.
348+
*
349+
* This is relevant in case the outer join we're deleting is nested
350+
* inside other outer joins: the upper joins' relid sets have to be
351+
* adjusted. The RHS of the target outer join will be made empty here,
352+
* but that's OK since caller will delete that SpecialJoinInfo entirely.
353+
*/
354+
foreach(l, root->join_info_list)
355+
{
356+
SpecialJoinInfo *sjinfo = (SpecialJoinInfo *) lfirst(l);
357+
358+
sjinfo->min_lefthand = bms_del_member(sjinfo->min_lefthand, relid);
359+
sjinfo->min_righthand = bms_del_member(sjinfo->min_righthand, relid);
360+
sjinfo->syn_lefthand = bms_del_member(sjinfo->syn_lefthand, relid);
361+
sjinfo->syn_righthand = bms_del_member(sjinfo->syn_righthand, relid);
362+
}
363+
346364
/*
347365
* Likewise remove references from PlaceHolderVar data structures.
348366
*

src/test/regress/expected/join.out

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2525,6 +2525,20 @@ explain (costs off)
25252525
Seq Scan on a
25262526
(1 row)
25272527

2528+
-- check optimization of outer join within another special join
2529+
explain (costs off)
2530+
select id from a where id in (
2531+
select b.id from b left join c on b.id = c.id
2532+
);
2533+
QUERY PLAN
2534+
----------------------------
2535+
Hash Semi Join
2536+
Hash Cond: (a.id = b.id)
2537+
-> Seq Scan on a
2538+
-> Hash
2539+
-> Seq Scan on b
2540+
(5 rows)
2541+
25282542
rollback;
25292543
create temp table parent (k int primary key, pd int);
25302544
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "parent_pkey" for table "parent"

src/test/regress/sql/join.sql

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -588,6 +588,12 @@ explain (costs off)
588588
SELECT a.* FROM a LEFT JOIN (b left join c on b.c_id = c.id)
589589
ON (a.b_id = b.id);
590590

591+
-- check optimization of outer join within another special join
592+
explain (costs off)
593+
select id from a where id in (
594+
select b.id from b left join c on b.id = c.id
595+
);
596+
591597
rollback;
592598

593599
create temp table parent (k int primary key, pd int);

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy