Fix memory leak in plpgsql's CALL processing.
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 29 Sep 2020 15:18:30 +0000 (11:18 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 29 Sep 2020 15:18:30 +0000 (11:18 -0400)
commitf0e4ec74e452f55922b52f50da4ba4834771a268
tree758fa9bd9eb298922f66cc7a61712e0f84558b4f
parent651bdbc811652638e1205440c3181a18feb8f967
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
src/pl/plpgsql/src/pl_exec.c