1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-11 10:01:57 +03:00

Don't include outer join relids in lateral_relids bitmapsets.

This avoids an assertion failure when outer joins are rearranged
per identity 3.  Listing only the baserels from a PlaceHolderVar's
ph_lateral set should be enough to ensure that the required values
are available when we need to compute the PHV --- it's what we
did before inventing nullingrel sets, after all.  It's a bit
unsatisfying; but with beta2 hard upon us, there's not time to
look for an aesthetically cleaner fix.

Richard Guo and Tom Lane

Discussion: https://postgr.es/m/CAMbWs48Jcw-NvnxT23WiHP324wG44DvzcH1j4hc0Zn+3sR9cfg@mail.gmail.com
This commit is contained in:
Tom Lane
2023-06-20 10:29:57 -04:00
parent 0655c03ef9
commit efeb12ef0b
3 changed files with 37 additions and 3 deletions

View File

@ -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);
}
}
}