Re: calling procedures is slow and consumes extra much memory against calling function
Michael Paquier <michael@paquier.xyz>
From: Michael Paquier <michael@paquier.xyz>
To: Pavel Stehule <pavel.stehule@gmail.com>
Cc: PostgreSQL Hackers <pgsql-hackers@postgresql.org>, Peter Eisentraut <peter.eisentraut@2ndquadrant.com>
Date: 2020-05-11T06:07:34Z
Lists: pgsql-hackers
On Sun, May 10, 2020 at 10:20:53PM +0200, Pavel Stehule wrote: > When I rewrite same to functions then > > create or replace function p1func2(inout r int, inout v int) as $$ > begin v := random() * r; end > $$ language plpgsql; > > Then execution is about 1 sec, and memory requirements are +/- zero. > > Minimally it looks so CALL statements has a memory issue. Behavior not limited to plpgsql. A plain SQL function shows the same leak patterns: create or replace procedure p1_sql(in r int, in v int) as $$ SELECT r + v; $$ language sql; And I cannot get valgrind to complain about lost references, so this looks like some missing memory context handling. Also, I actually don't quite get why the context created by CreateExprContext() cannot be freed before the procedure returns. A short test shows no problems in calling FreeExprContext() at the end of ExecuteCallStmt(), but that does not address everything. Perhaps a lack of tests with pass-by-reference expressions and procedures? Peter? -- Michael
Commits
-
Fix memory leak in plpgsql's CALL processing.
- c1e044bb30f2 12.5 landed
- 13a1901bad47 11.10 landed
- f0e4ec74e452 13.1 landed
- a6b1f5365d58 14.0 landed