diff --git a/src/common/pl/plpgsql/src/pl_exec.cpp b/src/common/pl/plpgsql/src/pl_exec.cpp index 7f1aeaa05..d9e50a701 100644 --- a/src/common/pl/plpgsql/src/pl_exec.cpp +++ b/src/common/pl/plpgsql/src/pl_exec.cpp @@ -9080,6 +9080,8 @@ void exec_assign_value(PLpgSQL_execstate* estate, PLpgSQL_datum* target, Datum v bool* nulls = NULL; bool* replaces = NULL; bool attisnull = false; + MemoryContext temp = NULL; + MemoryContext target_cxt = NULL; Oid atttype; int32 atttypmod; errno_t rc = EOK; @@ -9141,8 +9143,10 @@ void exec_assign_value(PLpgSQL_execstate* estate, PLpgSQL_datum* target, Datum v * Now call heap_modify_tuple() to create a new tuple that * replaces the old one in the record. */ + target_cxt = rec->ispkg ? rec->pkg->pkg_cxt : CurrentMemoryContext; + temp = MemoryContextSwitchTo(target_cxt); newtup = heap_modify_tuple(rec->tup, rec->tupdesc, values, nulls, replaces); - + temp = MemoryContextSwitchTo(temp); if (rec->freetup) { heap_freetuple_ext(rec->tup); } diff --git a/src/test/regress/expected/plpgsql_package_type.out b/src/test/regress/expected/plpgsql_package_type.out index cbf06877f..ed631fcff 100644 --- a/src/test/regress/expected/plpgsql_package_type.out +++ b/src/test/regress/expected/plpgsql_package_type.out @@ -1434,6 +1434,50 @@ varray1 tp_varray; procedure p1; end pak1 ; / +set behavior_compat_options='allow_procedure_compile_check'; +create table int_4(a NUMBER, b VARCHAR2(5)); +insert into int_4(a, b) values(3,'johan'); +create or replace package pck3_1 is +var1 RECORD; +procedure ppp1; +procedure ppp2(a int); +end pck3_1; +/ +create or replace package body pck3_1 is +procedure ppp1() is +query_str text; +begin +ppp2(9); +raise info '(ppp1)var1: %', var1.a; +end; + +procedure ppp2(a int) is +query_str text; +begin + query_str := 'select a,b from int_4'; + FOR var1 IN EXECUTE(query_str) LOOP + raise info '[ppp2]var1: %', var1.a; + END LOOP; + var1.a:=8+var1.a; + raise info '[ppp2]var1: %', var1.a; +end; +end pck3_1; +/ +call pck3_1.ppp1(); +INFO: [ppp2]var1: 3 +CONTEXT: SQL statement "CALL ppp2(9)" +PL/pgSQL function ppp1() line 3 at PERFORM +INFO: [ppp2]var1: 11 +CONTEXT: SQL statement "CALL ppp2(9)" +PL/pgSQL function ppp1() line 3 at PERFORM +INFO: (ppp1)var1: 11 + ppp1 +------ + +(1 row) + +drop table int_4 cascade; +set behavior_compat_options=''; -------------------------------------------------- ------------------ END OF TESTS ------------------ -------------------------------------------------- @@ -1445,6 +1489,10 @@ drop package plpgsql_packagetype1.p_test2; ERROR: package plpgsql_packagetype1.p_test2 does not exist drop package plpgsql_packagetype1.p_test1; ERROR: package plpgsql_packagetype1.p_test1 does not exist +drop package pck3_1; +NOTICE: drop cascades to 2 other objects +DETAIL: drop cascades to function plpgsql_packagetype1.ppp1() +drop cascades to function plpgsql_packagetype1.ppp2(integer) -- clean up -- drop schema if exists plpgsql_packagetype2 cascade; drop schema if exists plpgsql_packagetype1 cascade; diff --git a/src/test/regress/sql/plpgsql_package_type.sql b/src/test/regress/sql/plpgsql_package_type.sql index 38b22eba2..83c4af4ff 100644 --- a/src/test/regress/sql/plpgsql_package_type.sql +++ b/src/test/regress/sql/plpgsql_package_type.sql @@ -1122,6 +1122,40 @@ procedure p1; end pak1 ; / +set behavior_compat_options='allow_procedure_compile_check'; +create table int_4(a NUMBER, b VARCHAR2(5)); +insert into int_4(a, b) values(3,'johan'); +create or replace package pck3_1 is +var1 RECORD; +procedure ppp1; +procedure ppp2(a int); +end pck3_1; +/ + +create or replace package body pck3_1 is +procedure ppp1() is +query_str text; +begin +ppp2(9); +raise info '(ppp1)var1: %', var1.a; +end; + +procedure ppp2(a int) is +query_str text; +begin + query_str := 'select a,b from int_4'; + FOR var1 IN EXECUTE(query_str) LOOP + raise info '[ppp2]var1: %', var1.a; + END LOOP; + var1.a:=8+var1.a; + raise info '[ppp2]var1: %', var1.a; +end; +end pck3_1; +/ +call pck3_1.ppp1(); +drop table int_4 cascade; +set behavior_compat_options=''; + -------------------------------------------------- ------------------ END OF TESTS ------------------ -------------------------------------------------- @@ -1129,7 +1163,7 @@ drop package pak1; drop package p_test2; drop package plpgsql_packagetype1.p_test2; drop package plpgsql_packagetype1.p_test1; - +drop package pck3_1; -- clean up -- drop schema if exists plpgsql_packagetype2 cascade; drop schema if exists plpgsql_packagetype1 cascade;