pgsql: Fix mis-handling of outer join quals generated by EquivalenceCla

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: pgsql-committers(at)lists(dot)postgresql(dot)org
Subject: pgsql: Fix mis-handling of outer join quals generated by EquivalenceCla
Date: 2023-02-23 16:06:04
Message-ID: E1pVE6d-000KA3-VS@gemulon.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-committers

Fix mis-handling of outer join quals generated by EquivalenceClasses.

It's possible, in admittedly-rather-contrived cases, for an eclass
to generate a derived "join" qual that constrains the post-outer-join
value(s) of some RHS variable(s) without mentioning the LHS at all.
While the mechanisms were set up to work for this, we fell foul of
the "get_common_eclass_indexes" filter installed by commit 3373c7155:
it could decide that such an eclass wasn't relevant to the join, so
that the required qual clause wouldn't get emitted there or anywhere
else.

To fix, apply get_common_eclass_indexes only at inner joins, where
its rule is still valid. At an outer join, fall back to examining all
eclasses that mention either input (or the OJ relid, though it should
be impossible for an eclass to mention that without mentioning either
input). Perhaps we can improve on that later, but the cost/benefit of
adding more complexity to skip some irrelevant eclasses is dubious.

To allow cheaply distinguishing outer from inner joins, pass the
ojrelid to generate_join_implied_equalities as a separate argument.
This also allows cleaning up some sloppiness that had crept into
the definition of its join_relids argument, and it allows accurate
calculation of nominal_join_relids for a child outer join. (The
latter oversight seems not to have been a live bug, but it certainly
could have caused problems in future.)

Also fix what might be a live bug in check_index_predicates: it was
being sloppy about what it passed to generate_join_implied_equalities.

Per report from Richard Guo.

Discussion: https://postgr.es/m/CAMbWs4-DsTBfOvXuw64GdFss2=M5cwtEhY=0DCS7t2gT7P6hSA@mail.gmail.com

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/739f1d6218f5ce1e0243127ab23f431a7d07977c

Modified Files
--------------
src/backend/optimizer/path/equivclass.c | 50 ++++++++++++++++++++++++++-----
src/backend/optimizer/path/indxpath.c | 6 +++-
src/backend/optimizer/plan/analyzejoins.c | 3 +-
src/backend/optimizer/util/relnode.c | 22 +++++++++-----
src/include/optimizer/paths.h | 3 +-
src/test/regress/expected/join.out | 32 ++++++++++++++++++++
src/test/regress/sql/join.sql | 9 ++++++
7 files changed, 107 insertions(+), 18 deletions(-)

Browse pgsql-committers by date

  From Date Subject
Next Message Tomas Vondra 2023-02-23 17:34:25 pgsql: Introduce a generic pg_dump compression API
Previous Message Tomas Vondra 2023-02-23 15:23:15 pgsql: Prepare pg_dump internals for additional compression methods