pgsql: Ensure first ModifyTable rel initialized if all are pruned

From: Amit Langote <amitlan(at)postgresql(dot)org>
To: pgsql-committers(at)lists(dot)postgresql(dot)org
Subject: pgsql: Ensure first ModifyTable rel initialized if all are pruned
Date: 2025-03-19 03:14:56
Message-ID: E1tujtQ-003CM6-2o@gemulon.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-committers

Ensure first ModifyTable rel initialized if all are pruned

Commit cbc127917e introduced tracking of unpruned relids to avoid
processing pruned relations, and changed ExecInitModifyTable() to
initialize only unpruned result relations. As a result, MERGE
statements that prune all target partitions can now lead to crashes
or incorrect behavior during execution.

The crash occurs because some executor code paths rely on
ModifyTableState.resultRelInfo[0] being present and initialized,
even when no result relations remain after pruning. For example,
ExecMerge() and ExecMergeNotMatched() use the first resultRelInfo
to determine the appropriate action. Similarly,
ExecInitPartitionInfo() assumes that at least one result relation
exists.

To preserve these assumptions, ExecInitModifyTable() now includes the
first result relation in the initialized result relation list if all
result relations for that ModifyTable were pruned. To enable that,
ExecDoInitialPruning() ensures the first relation is locked if it was
pruned and locking is necessary.

To support this exception to the pruning logic, PlannedStmt now
includes a list of RT indexes identifying the first result relation
of each ModifyTable node in the plan. This allows
ExecDoInitialPruning() to check whether each such relation was
pruned and, if so, lock it if necessary.

Bug: #18830
Reported-by: Robins Tharakan <tharakan(at)gmail(dot)com>
Diagnozed-by: Tender Wang <tndrwang(at)gmail(dot)com>
Diagnozed-by: Dean Rasheed <dean(dot)a(dot)rasheed(at)gmail(dot)com>
Co-authored-by: Dean Rasheed <dean(dot)a(dot)rasheed(at)gmail(dot)com>
Reviewed-by: Tender Wang <tndrwang(at)gmail(dot)com>
Reviewed-by: Dean Rasheed <dean(dot)a(dot)rasheed(at)gmail(dot)com>
Discussion: https://postgr.es/m/18830-1f31ea1dc930d444%40postgresql.org

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/28317de723b60b61c40e7de4341a3029f698ddaf

Modified Files
--------------
src/backend/commands/explain.c | 14 ++++-
src/backend/executor/execMain.c | 2 +-
src/backend/executor/execPartition.c | 31 +++++++++-
src/backend/executor/execUtils.c | 18 +++---
src/backend/executor/nodeModifyTable.c | 32 +++++++++--
src/backend/optimizer/plan/planner.c | 1 +
src/backend/optimizer/plan/setrefs.c | 3 +
src/include/executor/execPartition.h | 4 +-
src/include/executor/executor.h | 3 +-
src/include/nodes/pathnodes.h | 3 +
src/include/nodes/plannodes.h | 7 +++
src/test/regress/expected/partition_prune.out | 82 +++++++++++++++++++++++++++
src/test/regress/sql/partition_prune.sql | 32 +++++++++++
13 files changed, 214 insertions(+), 18 deletions(-)

Browse pgsql-committers by date

  From Date Subject
Next Message Thomas Munro 2025-03-19 03:46:08 pgsql: oauth: Use IPv4-only issuer in oauth_validator tests
Previous Message Thomas Munro 2025-03-19 02:42:41 pgsql: Introduce io_max_combine_limit.