mirror of
https://github.com/postgres/postgres.git
synced 2025-08-24 09:27:52 +03:00
Fix thinko in join removal.
In commit 9df8f903e
I (tgl) switched join_is_removable() from
using the min relid sets of the join under consideration to
using its full syntactic relid sets. This was a mistake,
as it allowed join removal in cases where a reference to the
join output would survive in some syntactically-lower join
condition. Revert to the former coding.
Richard Guo
Discussion: https://postgr.es/m/CAMbWs4-EU9uBGSP7G-iTwLBhRQ=rnZKvFDhD+n+xhajokyPCKg@mail.gmail.com
This commit is contained in:
@@ -88,11 +88,8 @@ restart:
|
||||
*/
|
||||
innerrelid = bms_singleton_member(sjinfo->min_righthand);
|
||||
|
||||
/*
|
||||
* Compute the relid set for the join we are considering. We can
|
||||
* assume things are done in syntactic order.
|
||||
*/
|
||||
joinrelids = bms_union(sjinfo->syn_lefthand, sjinfo->syn_righthand);
|
||||
/* Compute the relid set for the join we are considering */
|
||||
joinrelids = bms_union(sjinfo->min_lefthand, sjinfo->min_righthand);
|
||||
if (sjinfo->ojrelid != 0)
|
||||
joinrelids = bms_add_member(joinrelids, sjinfo->ojrelid);
|
||||
|
||||
@@ -204,8 +201,8 @@ join_is_removable(PlannerInfo *root, SpecialJoinInfo *sjinfo)
|
||||
if (!rel_supports_distinctness(root, innerrel))
|
||||
return false;
|
||||
|
||||
/* Compute the syntactic relid set for the join we are considering */
|
||||
inputrelids = bms_union(sjinfo->syn_lefthand, sjinfo->syn_righthand);
|
||||
/* Compute the relid set for the join we are considering */
|
||||
inputrelids = bms_union(sjinfo->min_lefthand, sjinfo->min_righthand);
|
||||
Assert(sjinfo->ojrelid != 0);
|
||||
joinrelids = bms_copy(inputrelids);
|
||||
joinrelids = bms_add_member(joinrelids, sjinfo->ojrelid);
|
||||
|
Reference in New Issue
Block a user