diff options
Diffstat (limited to 'src/backend')
-rw-r--r-- | src/backend/optimizer/plan/analyzejoins.c | 18 |
1 files changed, 4 insertions, 14 deletions
diff --git a/src/backend/optimizer/plan/analyzejoins.c b/src/backend/optimizer/plan/analyzejoins.c index 00404a8beb0..c328cbdb8d3 100644 --- a/src/backend/optimizer/plan/analyzejoins.c +++ b/src/backend/optimizer/plan/analyzejoins.c @@ -453,7 +453,7 @@ remove_rel_from_query(PlannerInfo *root, RelOptInfo *rel, { PlaceHolderInfo *phinfo = (PlaceHolderInfo *) lfirst(l); - Assert(!bms_is_member(relid, phinfo->ph_lateral)); + Assert(sjinfo == NULL || !bms_is_member(relid, phinfo->ph_lateral)); if (bms_is_subset(phinfo->ph_needed, joinrelids) && bms_is_member(relid, phinfo->ph_eval_at) && !bms_is_member(ojrelid, phinfo->ph_eval_at)) @@ -472,6 +472,8 @@ remove_rel_from_query(PlannerInfo *root, RelOptInfo *rel, phinfo->ph_needed = replace_relid(phinfo->ph_needed, relid, subst); phinfo->ph_needed = replace_relid(phinfo->ph_needed, ojrelid, subst); /* ph_needed might or might not become empty */ + phinfo->ph_lateral = replace_relid(phinfo->ph_lateral, relid, subst); + /* ph_lateral might or might not be empty */ phv->phrels = replace_relid(phv->phrels, relid, subst); phv->phrels = replace_relid(phv->phrels, ojrelid, subst); Assert(!bms_is_empty(phv->phrels)); @@ -2115,20 +2117,8 @@ remove_self_joins_one_group(PlannerInfo *root, Relids relids) joinrelids = bms_add_member(joinrelids, k); /* - * Be safe to do not remove tables participated in complicated PH + * PHVs should not impose any constraints on removing self joins. */ - foreach(lc, root->placeholder_list) - { - PlaceHolderInfo *phinfo = (PlaceHolderInfo *) lfirst(lc); - - /* there isn't any other place to eval PHV */ - if (bms_is_subset(phinfo->ph_eval_at, joinrelids) || - bms_is_subset(phinfo->ph_needed, joinrelids) || - bms_is_member(r, phinfo->ph_lateral)) - break; - } - if (lc) - continue; /* * At this stage, joininfo lists of inner and outer can contain |