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

Поиск
Список
Период
Сортировка
От Tom Lane
Тема pgsql: Fix mis-handling of outer join quals generated by EquivalenceCla
Дата
Msg-id E1pVE6d-000KA3-VS@gemulon.postgresql.org
обсуждение исходный текст
Список 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(-)


В списке pgsql-committers по дате отправления:

Предыдущее
От: Tomas Vondra
Дата:
Сообщение: pgsql: Prepare pg_dump internals for additional compression methods
Следующее
От: Tomas Vondra
Дата:
Сообщение: pgsql: Introduce a generic pg_dump compression API