From: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
---|---|
To: | pgsql-committers(at)lists(dot)postgresql(dot)org |
Subject: | pgsql: Prevent join removal from removing the query's result relation. |
Date: | 2023-02-20 20:18:44 |
Message-ID: | E1pUCcV-0028in-A5@gemulon.postgresql.org |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-committers |
Prevent join removal from removing the query's result relation.
This was not something that required consideration before MERGE
was invented; but MERGE builds a join tree that left-joins to the
result relation, meaning that remove_useless_joins will consider
removing it. That should generally be stopped by the query's use
of output variables from the result relation. However, if the
result relation is inherited (e.g. a partitioned table) then
we don't add any row identity variables to the query until
expand_inherited_rtentry, which happens after join removal.
This was exposed as of commit 3c569049b, which made it possible
to deduce that a partitioned table could contain at most one row
matching a join key, enabling removal of the not-yet-expanded
result relation. Ooops.
To fix, let's just teach join_is_removable that the query result
rel is never removable. It's a cheap enough test in any case,
and it'll save some cycles that we'd otherwise expend in proving
that it's not removable, even in the cases we got right.
Back-patch to v15 where MERGE was added. Although I think the
case cannot be reached in v15, this seems like cheap insurance.
Per investigation of a report from Alexander Lakhin.
Discussion: https://postgr.es/m/36bee393-b351-16ac-93b2-d46d83637e45@gmail.com
Branch
------
master
Details
-------
https://git.postgresql.org/pg/commitdiff/f6db76c55509a60cc8c22ced56ff9322ee6f1742
Modified Files
--------------
src/backend/optimizer/plan/analyzejoins.c | 8 +++++++
src/test/regress/expected/merge.out | 35 +++++++++++++++++++++++++++++++
src/test/regress/sql/merge.sql | 20 ++++++++++++++++++
3 files changed, 63 insertions(+)
From | Date | Subject | |
---|---|---|---|
Next Message | Tom Lane | 2023-02-20 21:56:07 | pgsql: Fix parsing of ISO-8601 interval fields with exponential notatio |
Previous Message | Jeff Davis | 2023-02-20 19:29:57 | pgsql: Limit memory usage of pg_walinspect functions. |