From: Tom Lane <tgl@sss.pgh.pa.us>
To: pgsql-committers@lists.postgresql.org
Subject: pgsql: Fix handling of polymorphic output arguments for procedures.
Date: Wed, 15 May 2024 00:19:37 +0000
Message-ID: <E1s72Mr-000F4l-Ks@gemulon.postgresql.org> (raw)
Fix handling of polymorphic output arguments for procedures.
Most of the infrastructure for procedure arguments was already
okay with polymorphic output arguments, but it turns out that
CallStmtResultDesc() was a few bricks shy of a load here. It thought
all it needed to do was call build_function_result_tupdesc_t, but
that function specifically disclaims responsibility for resolving
polymorphic arguments. Failing to handle that doesn't seem to be
a problem for CALL in plpgsql, but CALL from plain SQL would get
errors like "cannot display a value of type anyelement", or even
crash outright.
In v14 and later we can simply examine the exposed types of the
CallStmt.outargs nodes to get the right type OIDs. But it's a lot
more complicated to fix in v12/v13, because those versions don't
have CallStmt.outargs, nor do they do expand_function_arguments
until ExecuteCallStmt runs. We have to duplicatively run
expand_function_arguments, and then re-determine which elements
of the args list are output arguments.
Per bug #18463 from Drew Kimball. Back-patch to all supported
versions, since it's busted in all of them.
Discussion: https://postgr.es/m/18463-f8cd77e12564d8a2@postgresql.org
Branch
------
REL_14_STABLE
Details
-------
https://git.postgresql.org/pg/commitdiff/525bd1620e9ba6b9327cc8ad420ad0352965b2c7
Modified Files
--------------
src/backend/commands/functioncmds.c | 28 +++++++++++++++++++++
src/pl/plpgsql/src/expected/plpgsql_call.out | 34 ++++++++++++++++++++++++++
src/pl/plpgsql/src/sql/plpgsql_call.sql | 30 +++++++++++++++++++++++
src/test/regress/expected/create_procedure.out | 34 ++++++++++++++++++++++++++
src/test/regress/sql/create_procedure.sql | 18 ++++++++++++++
5 files changed, 144 insertions(+)
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 handling of polymorphic output arguments for procedures.
In-Reply-To: <E1s72Mr-000F4l-Ks@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