pg.ddx.io  pgsql-committers@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Peter Eisentraut <peter.eisentraut@enterprisedb.com>
To: Tom Lane <tgl@sss.pgh.pa.us>
To: pgsql-hackers <pgsql-hackers@postgresql.org>
Subject: Re: pgsql: Fix memory leak in plpgsql's CALL processing.
Date: Mon, 28 Dec 2020 10:47:38 +0100
Message-ID: <f075f7be-c654-9aa8-3ffc-e9214622f02a@enterprisedb.com> (raw)
In-Reply-To: <E1kNHOx-0003xj-TX@gemulon.postgresql.org>
References: <E1kNHOx-0003xj-TX@gemulon.postgresql.org>

This change has broken the following test case (reduced from actual 
production code):

CREATE OR REPLACE PROCEDURE prc_inout_test_inner(INOUT x integer)
LANGUAGE plpgsql
AS
$procedure$
BEGIN
   COMMIT;
   x := 2;
END;
$procedure$;

CREATE OR REPLACE PROCEDURE prc_inout_test_main()
LANGUAGE plpgsql
AS
$procedure$
DECLARE
   y INTEGER := 1;
BEGIN
   CALL prc_inout_test_inner(y);
END;
$procedure$;

CALL prc_inout_test_main();

With the patch, it fails like this:

ERROR:  XX000: unsupported target type: 0
CONTEXT:  PL/pgSQL function prc_inout_test_main() line 5 at CALL
LOCATION:  exec_move_row_from_fields, pl_exec.c:7196


On 2020-09-29 17:18, Tom Lane wrote:
> Fix memory leak in plpgsql's CALL processing.
> 
> When executing a CALL or DO in a non-atomic context (i.e., not inside
> a function or query), plpgsql creates a new plan each time through,
> as a rather hacky solution to some resource management issues.  But
> it failed to free this plan until exit of the current procedure or DO
> block, resulting in serious memory bloat in procedures that called
> other procedures many times.  Fix by remembering to free the plan,
> and by being more honest about restoring the previous state (otherwise,
> recursive procedure calls have a problem).
> 
> There was also a smaller leak associated with recalculation of the
> "target" list of output variables.  Fix that by using the statement-
> lifespan context to hold non-permanent values.
> 
> Back-patch to v11 where procedures were introduced.
> 
> Pavel Stehule and Tom Lane
> 
> Discussion: https://postgr.es/m/CAFj8pRDiiU1dqym+_P4_GuTWm76knJu7z9opWayBJTC0nQGUUA@mail.gmail.com
> 
> Branch
> ------
> master
> 
> Details
> -------
> https://git.postgresql.org/pg/commitdiff/a6b1f5365d58356b5d42829e9cd89a6c725d7a0a
> 
> Modified Files
> --------------
> src/pl/plpgsql/src/pl_exec.c | 91 ++++++++++++++++++++++++++++++++++----------
> 1 file changed, 70 insertions(+), 21 deletions(-)
> 






view thread (7+ messages)  latest in thread

Message-ID: <f075f7be-c654-9aa8-3ffc-e9214622f02a@enterprisedb.com>
Permalink:  ../f075f7be-c654-9aa8-3ffc-e9214622f02a@enterprisedb.com/
Also on:    postgresql.org/message-id/f075f7be-c654-9aa8-3ffc-e9214622f02a@enterprisedb.com

 · 

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: peter.eisentraut@enterprisedb.com, tgl@sss.pgh.pa.us, pgsql-hackers@postgresql.org
  Subject: Re: pgsql: Fix memory leak in plpgsql's CALL processing.
  In-Reply-To: <f075f7be-c654-9aa8-3ffc-e9214622f02a@enterprisedb.com>

* 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