Hi, hackers
I have observed an issue where the CachedPlan corresponding to a function/procedure is not released when we execute the "DROP FUNCTION\PROCEDURE" command. A patch to resolve this problem is attached. A simple test case is as follows: Step 1 ?? create or replace procedure test_pro() as $$declare va int default 100; begin for i in 1 .. 10 loop va := va + i; end loop; raise notice '%', va; va := va; end $$ LANGUAGE plpgsql; Step 2?? call test_pro(); Step 3?? select * from pg_get_backend_memory_contexts() where parent = 'CacheMemoryContext' and name = 'CachedPlan'; Step 4?? drop procedure test_pro; Step 5?? select * from pg_get_backend_memory_contexts() where parent = 'CacheMemoryContext' and name = 'CachedPlan'; Step 6?? create or replace procedure test_pro() as $$declare va int default 100; begin for i in 1 .. 10 loop va := va + i; end loop; raise notice '%', va; va := va; end $$ LANGUAGE plpgsql; Step 7?? call test_pro(); Step 8?? select * from pg_get_backend_memory_contexts() where parent = 'CacheMemoryContext' and name = 'CachedPlan'; result?? postgres@zxm-VMware-Virtual-Platform:/data/16$ psqlpsql (16.10) Type "help" for help. postgres=# create or replace procedure test_pro() as $$ declare va int default 100; begin for i in 1 .. 10 loop va := va + i; end loop; raise notice '%', va; va := va; end $$ LANGUAGE plpgsql; CREATE PROCEDURE postgres=# call test_pro(); NOTICE: 155 CALL postgres=# select * from pg_get_backend_memory_contexts() where parent = 'CacheMemoryContext' and name = 'CachedPlan'; name | ident | parent | level | total_bytes | total_nblocks | free_bytes | free_chunks | used_bytes ------------+--------------+--------------------+-------+-------------+---------------+------------+-------------+------------ CachedPlan | va := va | CacheMemoryContext | 2 | 2048 | 2 | 576 | 0 | 1472 CachedPlan | va | CacheMemoryContext | 2 | 2048 | 2 | 584 | 0 | 1464 CachedPlan | va := va + i | CacheMemoryContext | 2 | 2048 | 2 | 384 | 0 | 1664 CachedPlan | 10 | CacheMemoryContext | 2 | 2048 | 2 | 544 | 0 | 1504 CachedPlan | 1 | CacheMemoryContext | 2 | 2048 | 2 | 544 | 0 | 1504 CachedPlan | 100 | CacheMemoryContext | 2 | 2048 | 2 | 544 | 0 | 1504 (6 rows) postgres=# drop procedure test_pro; DROP PROCEDURE postgres=# select * from pg_get_backend_memory_contexts() where parent = 'CacheMemoryContext' and name = 'CachedPlan'; name | ident | parent | level | total_bytes | total_nblocks | free_bytes | free_chunks | used_bytes ------------+--------------+--------------------+-------+-------------+---------------+------------+-------------+------------ CachedPlan | va := va | CacheMemoryContext | 2 | 2048 | 2 | 576 | 0 | 1472 CachedPlan | va | CacheMemoryContext | 2 | 2048 | 2 | 584 | 0 | 1464 CachedPlan | va := va + i | CacheMemoryContext | 2 | 2048 | 2 | 384 | 0 | 1664 CachedPlan | 10 | CacheMemoryContext | 2 | 2048 | 2 | 544 | 0 | 1504 CachedPlan | 1 | CacheMemoryContext | 2 | 2048 | 2 | 544 | 0 | 1504 CachedPlan | 100 | CacheMemoryContext | 2 | 2048 | 2 | 544 | 0 | 1504 (6 rows) postgres=# create or replace procedure test_pro() as $$ declare va int default 100; begin for i in 1 .. 10 loop va := va + i; end loop; raise notice '%', va; va := va; end $$ LANGUAGE plpgsql; CREATE PROCEDURE postgres=# call test_pro(); NOTICE: 155 CALL postgres=# select * from pg_get_backend_memory_contexts() where parent = 'CacheMemoryContext' and name = 'CachedPlan'; name | ident | parent | level | total_bytes | total_nblocks | free_bytes | free_chunks | used_bytes ------------+--------------+--------------------+-------+-------------+---------------+------------+-------------+------------ CachedPlan | va := va | CacheMemoryContext | 2 | 2048 | 2 | 576 | 0 | 1472 CachedPlan | va | CacheMemoryContext | 2 | 2048 | 2 | 584 | 0 | 1464 CachedPlan | va := va + i | CacheMemoryContext | 2 | 2048 | 2 | 384 | 0 | 1664 CachedPlan | 10 | CacheMemoryContext | 2 | 2048 | 2 | 544 | 0 | 1504 CachedPlan | 1 | CacheMemoryContext | 2 | 2048 | 2 | 544 | 0 | 1504 CachedPlan | 100 | CacheMemoryContext | 2 | 2048 | 2 | 544 | 0 | 1504 CachedPlan | va := va | CacheMemoryContext | 2 | 2048 | 2 | 576 | 0 | 1472 CachedPlan | va | CacheMemoryContext | 2 | 2048 | 2 | 584 | 0 | 1464 CachedPlan | va := va + i | CacheMemoryContext | 2 | 2048 | 2 | 384 | 0 | 1664 CachedPlan | 10 | CacheMemoryContext | 2 | 2048 | 2 | 544 | 0 | 1504 CachedPlan | 1 | CacheMemoryContext | 2 | 2048 | 2 | 544 | 0 | 1504 CachedPlan | 100 | CacheMemoryContext | 2 | 2048 | 2 | 544 | 0 | 1504 (12 rows)
00001_free_function_memory.patch
Description: Binary data
