Defend against bogus parameterization of join input paths.
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 29 Jun 2023 16:12:52 +0000 (12:12 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 29 Jun 2023 16:12:52 +0000 (12:12 -0400)
commita798660ebe3ff1feb310db13b957c5cda4c8c50d
tree3061c9172724f41cac19a273341f583d932f5656
parent43af714defa00145981eb542cb71647836b3efa4
Defend against bogus parameterization of join input paths.

An outer join cannot be formed using an input path that is parameterized
by a value that is supposed to be nulled by the outer join.  This is
obviously nonsensical, and it could lead to a bad plan being selected;
although currently it seems that we'll hit various sanity-check
assertions first.

I think that such cases were formerly prevented by the delay_upper_joins
mechanism, but now that that's gone we need an explicit check.

(Perhaps we should avoid generating baserel paths that could
lead to this situation in the first place; but it seems like
having a defense at the join level would be a good idea anyway.)

Richard Guo and Tom Lane, per report from Jaime Casanova

Discussion: https://postgr.es/m/CAJKUy5g2uZRrUDZJ8p-=giwcSHVUn0c9nmdxPSY0jF0Ov8VoEA@mail.gmail.com
src/backend/optimizer/path/joinpath.c
src/test/regress/expected/join.out
src/test/regress/sql/join.sql