pgsql: Fix multi-row DEFAULT handling for INSERT ... SELECT rules.

From: Dean Rasheed <dean(dot)a(dot)rasheed(at)gmail(dot)com>
To: pgsql-committers(at)lists(dot)postgresql(dot)org
Subject: pgsql: Fix multi-row DEFAULT handling for INSERT ... SELECT rules.
Date: 2023-02-23 11:01:17
Message-ID: E1pV9Lg-000Hnv-HK@gemulon.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-committers

Fix multi-row DEFAULT handling for INSERT ... SELECT rules.

Given an updatable view with a DO ALSO INSERT ... SELECT rule, a
multi-row INSERT ... VALUES query on the view fails if the VALUES list
contains any DEFAULTs that are not replaced by view defaults. This
manifests as an "unrecognized node type" error, or an Assert failure,
in an assert-enabled build.

The reason is that when RewriteQuery() attempts to replace the
remaining DEFAULT items with NULLs in any product queries, using
rewriteValuesRTEToNulls(), it assumes that the VALUES RTE is located
at the same rangetable index in each product query. However, if the
product query is an INSERT ... SELECT, then the VALUES RTE is actually
in the SELECT part of that query (at the same index), rather than the
top-level product query itself.

Fix, by descending to the SELECT in such cases. Note that we can't
simply use getInsertSelectQuery() for this, since that expects to be
given a raw rule action with OLD and NEW placeholder entries, so we
duplicate its logic instead.

While at it, beef up the checks in getInsertSelectQuery() by checking
that the jointree->fromlist node is indeed a RangeTblRef, and that the
RTE it points to has rtekind == RTE_SUBQUERY.

Per bug #17803, from Alexander Lakhin. Back-patch to all supported
branches.

Dean Rasheed, reviewed by Tom Lane.

Discussion: https://postgr.es/m/17803-53c63ed4ecb4eac6%40postgresql.org

Branch
------
REL_11_STABLE

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

Modified Files
--------------
src/backend/rewrite/rewriteHandler.c | 32 ++++++++++++++++++++++++---
src/backend/rewrite/rewriteManip.c | 11 +++++----
src/test/regress/expected/updatable_views.out | 19 ++++++++++++++++
src/test/regress/sql/updatable_views.sql | 10 +++++++++
4 files changed, 65 insertions(+), 7 deletions(-)

Browse pgsql-committers by date

  From Date Subject
Next Message Heikki Linnakangas 2023-02-23 13:40:38 pgsql: pg_rewind: Fix determining TLI when server was just promoted.
Previous Message Dean Rasheed 2023-02-23 11:01:16 pgsql: Fix multi-row DEFAULT handling for INSERT ... SELECT rules.