pg.ddx.io  pgsql-committers@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Tom Lane <tgl@sss.pgh.pa.us>
To: pgsql-committers@lists.postgresql.org
Subject: pgsql: Fix behavior of stable functions called from a CALL's argument l
Date: Fri, 07 Jun 2024 17:27:45 +0000
Message-ID: <E1sFdNQ-000Qzq-EE@gemulon.postgresql.org> (raw)

Fix behavior of stable functions called from a CALL's argument list.

If the CALL is within an atomic context (e.g. there's an outer
transaction block), _SPI_execute_plan should acquire a fresh snapshot
to execute any such functions with.  We failed to do that and instead
passed them the Portal snapshot, which had been acquired at the start
of the current SQL command.  This'd lead to seeing stale values of
rows modified since the start of the command.

This is arguably a bug in 84f5c2908: I failed to see that "are we in
non-atomic mode" needs to be defined the same way as it is further
down in _SPI_execute_plan, i.e. check !_SPI_current->atomic not just
options->allow_nonatomic.  Alternatively the blame could be laid on
plpgsql, which is unconditionally passing allow_nonatomic = true
for CALL/DO even when it knows it's in an atomic context.  However,
fixing it in spi.c seems like a better idea since that will also fix
the problem for any extensions that may have copied plpgsql's coding
pattern.

While here, update an obsolete comment about _SPI_execute_plan's
snapshot management.

Per report from Victor Yegorov.  Back-patch to all supported versions.

Discussion: https://postgr.es/m/CAGnEboiRe+fG2QxuBO2390F7P8e2MQ6UyBjZSL_w1Cej+E4=Vw@mail.gmail.com

Branch
------
REL_16_STABLE

Details
-------
https://git.postgresql.org/pg/commitdiff/0d18b8eb409ce5cbc14c61e4883240d4668df655

Modified Files
--------------
doc/src/sgml/spi.sgml                        |  8 +++--
src/backend/executor/spi.c                   | 36 +++++++++++++-------
src/pl/plpgsql/src/expected/plpgsql_call.out | 50 ++++++++++++++++++++++++++++
src/pl/plpgsql/src/sql/plpgsql_call.sql      | 50 ++++++++++++++++++++++++++++
4 files changed, 130 insertions(+), 14 deletions(-)



view thread (6+ messages)  latest in thread

Message-ID: <E1sFdNQ-000Qzq-EE@gemulon.postgresql.org>
Permalink:  ../E1sFdNQ-000Qzq-EE@gemulon.postgresql.org/
Also on:    postgresql.org/message-id/E1sFdNQ-000Qzq-EE@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: tgl@sss.pgh.pa.us, pgsql-committers@lists.postgresql.org
  Subject: Re: pgsql: Fix behavior of stable functions called from a CALL's argument l
  In-Reply-To: <E1sFdNQ-000Qzq-EE@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 DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox