From: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
---|---|
To: | pgsql-committers(at)lists(dot)postgresql(dot)org |
Subject: | pgsql: Fix corner-case planner failure for MERGE. |
Date: | 2023-03-28 15:39:33 |
Message-ID: | E1phBQ3-000Aek-UW@gemulon.postgresql.org |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-committers |
Fix corner-case planner failure for MERGE.
MERGE planning could fail with "variable not found in subplan target
list" if the target table is partitioned and all its partitions are
excluded at plan time, or in the case where it has no partitions but
used to have some. This happened because distribute_row_identity_vars
thought it didn't need to make the target table's reltarget list
fully valid; but if we generate a join plan then that is required
because the dummy Result node's tlist will be made from the reltarget.
The same logic appears in distribute_row_identity_vars in v14,
but AFAICS the problem is unreachable in that branch for lack of
MERGE. In other updating statements, the target table is always
inner-joined to any other tables, so if the target is known dummy
then the whole plan reduces to dummy, so no join nodes are created.
So I'll refrain from back-patching this code change to v14 for now.
Per report from Alvaro Herrera.
Discussion: https://postgr.es/m/20230328112248.6as34mlx5sr4kltg@alvherre.pgsql
Branch
------
REL_15_STABLE
Details
-------
https://git.postgresql.org/pg/commitdiff/bf5c4b3d9da67ab0dd8a5a560804f88370c42866
Modified Files
--------------
src/backend/optimizer/util/appendinfo.c | 10 +++++++---
src/test/regress/expected/merge.out | 25 +++++++++++++++++++++++++
src/test/regress/sql/merge.sql | 12 ++++++++++++
3 files changed, 44 insertions(+), 3 deletions(-)
From | Date | Subject | |
---|---|---|---|
Next Message | Peter Geoghegan | 2023-03-28 17:55:16 | pgsql: Fix recent pg_walinspect fpi_length bug. |
Previous Message | Jeff Davis | 2023-03-28 15:25:11 | pgsql: initdb: emit message when using default ICU locale. |