agora inbox for pgsql-committers@postgresql.org  
help / color / mirror / Atom feed
From: Amit Langote <amitlan@postgresql.org>
To: pgsql-committers@lists.postgresql.org
Subject: pgsql: Re-index ModifyTable FDW arrays when pruning result relations
Date: Tue, 23 Jun 2026 23:59:57 +0000
Message-ID: <E1wcB25-001b3f-1B@gemulon.postgresql.org> (raw)

Re-index ModifyTable FDW arrays when pruning result relations

ExecInitModifyTable() rebuilds the per-result-relation lists after
dropping result relations removed by initial runtime pruning.  The
re-indexing was done for withCheckOptionLists, returningLists,
updateColnosLists, mergeActionLists and mergeJoinConditions, but
fdwPrivLists and fdwDirectModifyPlans were missed.  As a result, a
kept foreign result relation could be handed the wrong fdw_private,
or ri_usesFdwDirectModify could be set from the wrong plan index,
leading to wrong behavior or a crash in BeginForeignModify() and in
the direct-modify path.

show_modifytable_info() had the same problem: it indexed the
plan-ordered node->fdwPrivLists with the post-pruning executor
position, so once initial pruning removed a result relation it
could read a different relation's fdw_private (often a NIL entry),
producing wrong EXPLAIN output or a crash.

Fix by re-indexing fdwPrivLists and fdwDirectModifyPlans alongside
the other lists, saving the re-indexed private lists in
ModifyTableState.mt_fdwPrivLists and reading from there in both
nodeModifyTable.c and explain.c.

Reported-by: Chi Zhang <798604270@qq.com>
Author: Ayush Tiwari <ayushtiwari.slg01@gmail.com>
Author: Rafia Sabih <rafia.pghackers@gmail.com>
Reviewed-by: Matheus Alcantara <matheusssilv97@gmail.com>
Reviewed-by: Etsuro Fujita <etsuro.fujita@gmail.com>
Discussion: https://postgr.es/m/19484-a3cb82c8cde3c8fa%40postgresql.org
Backpatch-through: 18

Branch
------
REL_18_STABLE

Details
-------
https://git.postgresql.org/pg/commitdiff/1ef917e3a61a26a264fe65012d951ac36aa03732

Modified Files
--------------
contrib/postgres_fdw/expected/postgres_fdw.out | 64 ++++++++++++++++++++++++++
contrib/postgres_fdw/sql/postgres_fdw.sql      | 34 ++++++++++++++
src/backend/commands/explain.c                 |  2 +-
src/backend/executor/nodeModifyTable.c         | 22 ++++++++-
src/include/nodes/execnodes.h                  |  8 ++--
5 files changed, 124 insertions(+), 6 deletions(-)



view thread (3+ messages)  latest in thread

Message-ID: <E1wcB25-001b3f-1B@gemulon.postgresql.org>
Permalink:  ../E1wcB25-001b3f-1B@gemulon.postgresql.org/
Also on:    postgresql.org/message-id/E1wcB25-001b3f-1B@gemulon.postgresql.org

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-committers@postgresql.org
  Cc: amitlan@postgresql.org, pgsql-committers@lists.postgresql.org
  Subject: Re: pgsql: Re-index ModifyTable FDW arrays when pruning result relations
  In-Reply-To: <E1wcB25-001b3f-1B@gemulon.postgresql.org>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox