agora inbox for pgsql-committers@postgresql.org
help / color / mirror / Atom feedFrom: Tom Lane <tgl@sss.pgh.pa.us>
To: pgsql-committers@lists.postgresql.org
Subject: pgsql: Fix edge case in remove_useless_result_rtes() with outer joins.
Date: Sat, 18 Jul 2026 18:09:27 +0000
Message-ID: <E1wl9Ta-000o2h-27@gemulon.postgresql.org> (raw)
Fix edge case in remove_useless_result_rtes() with outer joins.
find_dependent_phvs() and find_dependent_phvs_in_jointree() decide
whether a PlaceHolderVar depends on the RTE_RESULT rel we're
considering removing by comparing the PHV's phrels to a singleton set
containing that rel's RT index, reasoning that if phrels contains any
other relid bits then those define an appropriate place where we can
evaluate the PHV. But since this code was originally written, we've
redefined phrels to include outer-join relids, and that breaks this
logic, potentially allowing us to remove an RTE_RESULT that leaves no
valid place to evaluate the PHV. The planner doesn't throw an error
when that happens, but it does produce an incorrect plan that will not
replace the PHV's value with NULL when needed.
In the known test case for this bug, the "extra" OJ relid is one that
we've actually decided to remove but haven't yet cleaned out of the
query's PHVs. It's not entirely clear though that that would always
be the case. Let's restore this code to the way it was designed to
work, by considering only base relids within the PHV's phrels.
Bug: #19553
Reported-by: Viktor Leis <leis@in.tum.de>
Author: Matheus Alcantara <matheusssilv97@gmail.com>
Co-authored-by: Richard Guo <guofenglinux@gmail.com>
Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us>
Discussion: https://postgr.es/m/19553-4561747f93f368a7@postgresql.org
Backpatch-through: 16
Branch
------
REL_16_STABLE
Details
-------
https://git.postgresql.org/pg/commitdiff/3e1fe25e686d788a32c926e2aa79bc8d9312841b
Modified Files
--------------
src/backend/optimizer/prep/prepjointree.c | 64 ++++++++++++++++++++++++-------
src/test/regress/expected/join.out | 27 +++++++++++++
src/test/regress/sql/join.sql | 10 +++++
3 files changed, 88 insertions(+), 13 deletions(-)
view thread (5+ messages) latest in thread
Message-ID: <E1wl9Ta-000o2h-27@gemulon.postgresql.org>
Permalink: ../E1wl9Ta-000o2h-27@gemulon.postgresql.org/
Also on: postgresql.org/message-id/E1wl9Ta-000o2h-27@gemulon.postgresql.org
reply
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: pgsql-committers@postgresql.org
Cc: tgl@sss.pgh.pa.us, pgsql-committers@lists.postgresql.org
Subject: Re: pgsql: Fix edge case in remove_useless_result_rtes() with outer joins.
In-Reply-To: <E1wl9Ta-000o2h-27@gemulon.postgresql.org>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox