Remove quals made redundant by reducing outer joins to antijoins When reduce_outer_joins reduces an outer join to an antijoin, any IS NULL qual on a Var from the antijoin's nullable side is necessarily true. Previously, such quals were discarded later in distribute_qual_to_rels, mainly to avoid bogus selectivity estimates. But that discard was incomplete: the qual remained in the jointree, while its Vars were not counted in attr_needed. Since commit 2ebf25e7d, join removal edits the jointree and expects it to contain no other references to a removed rel, so it could remove a rel that such a discarded qual still references, and then trip an assertion on the qual's stale Var.
To fix, move this processing to an earlier phase: such quals are now removed from the jointree by reduce_outer_joins itself. This way later phases see a consistent query tree, and check_redundant_nullability_qual is no longer needed, so remove it. Back-patch to v16, as with commit 2ebf25e7d. Reported-by: Tender Wang <[email protected]> Author: Richard Guo <[email protected]> Reviewed-by: Tom Lane <[email protected]> Discussion: https://postgr.es/m/CAHewXNk8b0TsSy4dL=co7fxl2w3wbm0bcdp-zwnjepa-qj4...@mail.gmail.com Backpatch-through: 16 Branch ------ REL_19_STABLE Details ------- https://git.postgresql.org/pg/commitdiff/763d563eaec82528fdd49c07830a2dae00567778 Modified Files -------------- src/backend/optimizer/plan/initsplan.c | 61 --------------------- src/backend/optimizer/prep/prepjointree.c | 89 ++++++++++++++++++++++++++++--- src/backend/optimizer/util/clauses.c | 11 ++-- src/test/regress/expected/join.out | 36 +++++++++++++ src/test/regress/sql/join.sql | 18 +++++++ 5 files changed, 143 insertions(+), 72 deletions(-)
