CREATE OR REPLACE FUNCTION public.fx(iter integer) RETURNS void LANGUAGE plpgsql AS $function$ declare c cursor(m bigint) for select distinct i from generate_series(1, m) g(i); t bigint; s bigint; begin for i in 1..iter loop open c(m := i * 10000); s := 0; loop fetch c into t; exit when not found; s := s + t; end loop; close c; raise notice '%=%', i, s; end loop; end; $function$ ;
This script takes for 100 iterations 100MB
but rewritten
CREATE OR REPLACE FUNCTION public.fx(iter integer) RETURNS void LANGUAGE plpgsql AS $function$ declare t bigint; s bigint; begin for i in 1..iter loop s := 0; for t in select ic from generate_series(1, i * 10000) g(ic) loop s := s + t; end loop; raise notice '%=%', i, s; end loop; end; $function$
takes lot of megabytes of memory too.
The megabytes leaks are related to JIT. With JIT off the memory consumption is significantly less although there are some others probably.