diff options
Diffstat (limited to 'src/backend/optimizer/plan/initsplan.c')
-rw-r--r-- | src/backend/optimizer/plan/initsplan.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/src/backend/optimizer/plan/initsplan.c b/src/backend/optimizer/plan/initsplan.c index 69ef483d283..b31d8921211 100644 --- a/src/backend/optimizer/plan/initsplan.c +++ b/src/backend/optimizer/plan/initsplan.c @@ -580,6 +580,7 @@ create_lateral_join_info(PlannerInfo *root) { PlaceHolderInfo *phinfo = (PlaceHolderInfo *) lfirst(lc); Relids eval_at = phinfo->ph_eval_at; + Relids lateral_refs; int varno; if (phinfo->ph_lateral == NULL) @@ -587,6 +588,15 @@ create_lateral_join_info(PlannerInfo *root) found_laterals = true; + /* + * Include only baserels not outer joins in the evaluation sites' + * lateral relids. This avoids problems when outer join order gets + * rearranged, and it should still ensure that the lateral values are + * available when needed. + */ + lateral_refs = bms_intersect(phinfo->ph_lateral, root->all_baserels); + Assert(!bms_is_empty(lateral_refs)); + if (bms_get_singleton_member(eval_at, &varno)) { /* Evaluation site is a baserel */ @@ -594,10 +604,10 @@ create_lateral_join_info(PlannerInfo *root) brel->direct_lateral_relids = bms_add_members(brel->direct_lateral_relids, - phinfo->ph_lateral); + lateral_refs); brel->lateral_relids = bms_add_members(brel->lateral_relids, - phinfo->ph_lateral); + lateral_refs); } else { @@ -610,7 +620,7 @@ create_lateral_join_info(PlannerInfo *root) if (brel == NULL) continue; /* ignore outer joins in eval_at */ brel->lateral_relids = bms_add_members(brel->lateral_relids, - phinfo->ph_lateral); + lateral_refs); } } } |