pgsql: Change mechanism to set up source targetlist in MERGE

From: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
To: pgsql-committers(at)lists(dot)postgresql(dot)org
Subject: pgsql: Change mechanism to set up source targetlist in MERGE
Date: 2022-04-12 07:48:11
Message-ID: E1neBFz-0008qw-76@gemulon.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-committers

Change mechanism to set up source targetlist in MERGE

We were setting MERGE source subplan's targetlist by expanding the
individual attributes of the source relation completely, early in the
parse analysis phase. This failed to work when the condition of an
action included a whole-row reference, causing setrefs.c to error out
with
ERROR: variable not found in subplan target lists
because at that point there is nothing to resolve the whole-row
reference with. We can fix this by having preprocess_targetlist expand
the source targetlist for Vars required from the source rel by all
actions. Moreover, by using this expansion mechanism we can do away
with the targetlist expansion in transformMergeStmt, which is good
because then we no longer pull in columns that aren't needed for
anything.

Add a test case for the problem.

While at it, remove some redundant code in preprocess_targetlist():
MERGE was doing separately what is already being done for UPDATE/DELETE,
so we can just rely on the latter and remove the former. (The handling
of inherited rels was different for MERGE, but that was a no-longer-
necessary hack.)

Fix outdated, related comments for fix_join_expr also.

Author: Richard Guo <guofenglinux(at)gmail(dot)com>
Author: Álvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
Reported-by: Joe Wildish <joe(at)lateraljoin(dot)com>
Discussion: https://postgr.es/m/fab3b90a-914d-46a9-beb0-df011ee39ee5@www.fastmail.com

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/ce4f46fdc814eb1b704d81640f6d8f03625d0f53

Modified Files
--------------
src/backend/optimizer/plan/setrefs.c | 7 +++-
src/backend/optimizer/prep/preptlist.c | 63 ++++++++++++++++++++++++----------
src/backend/parser/parse_merge.c | 9 ++---
src/test/regress/expected/merge.out | 13 +++++++
src/test/regress/expected/with.out | 6 ++--
src/test/regress/sql/merge.sql | 9 +++++
6 files changed, 80 insertions(+), 27 deletions(-)

Browse pgsql-committers by date

  From Date Subject
Next Message Michael Paquier 2022-04-12 08:35:08 pgsql: Remove WalCompressionMethod in favor of pg_compress_algorithm
Previous Message Michael Paquier 2022-04-12 04:39:23 pgsql: Rename backup_compression.{c,h} to compression.{c,h}