diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2023-06-08 17:10:04 -0400 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2023-06-08 17:10:04 -0400 |
commit | 9a2dbc614e6e47da3c49daacec106da32eba9467 (patch) | |
tree | 74be715c7b0d9a98d12390ba5a98d4591bfd4a8d /src/backend/optimizer/plan/analyzejoins.c | |
parent | fbf80421ead55deaafbefa808960a2695de492c9 (diff) | |
download | postgresql-9a2dbc614e6e47da3c49daacec106da32eba9467.tar.gz postgresql-9a2dbc614e6e47da3c49daacec106da32eba9467.zip |
Fix oversight in outer join removal.
A placeholder that references the outer join's relid in ph_eval_at
is logically "above" the join, and therefore we can't remove its
PlaceHolderInfo: it might still be used somewhere in the query.
This was not an issue pre-v16 because we failed to remove the join
at all in such cases. The new outer-join-aware-Var infrastructure
permits deducing that it's okay to remove the join, but then we
have to clean up correctly afterwards.
Report and fix by Richard Guo
Discussion: https://postgr.es/m/CAMbWs4_tuVn9EwwMcggGiZJWWstdXX_ci8FeEU17vs+4nLgw3w@mail.gmail.com
Diffstat (limited to 'src/backend/optimizer/plan/analyzejoins.c')
-rw-r--r-- | src/backend/optimizer/plan/analyzejoins.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/src/backend/optimizer/plan/analyzejoins.c b/src/backend/optimizer/plan/analyzejoins.c index 6f7e657f056..6476e55e568 100644 --- a/src/backend/optimizer/plan/analyzejoins.c +++ b/src/backend/optimizer/plan/analyzejoins.c @@ -425,7 +425,8 @@ remove_rel_from_query(PlannerInfo *root, int relid, SpecialJoinInfo *sjinfo) Assert(!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(relid, phinfo->ph_eval_at) && + !bms_is_member(ojrelid, phinfo->ph_eval_at)) { root->placeholder_list = foreach_delete_current(root->placeholder_list, l); |