From d0b166c35cc3aeb620cc6ffb30b3d7335be82b96 Mon Sep 17 00:00:00 2001 From: leiziwei Date: Mon, 8 Apr 2024 06:03:40 +0000 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=9C=A8=E5=8C=85=E7=9A=84?= =?UTF-8?q?=E5=AD=90=E5=AD=98=E5=82=A8=E8=BF=87=E7=A8=8B=E4=B8=AD=E7=BB=99?= =?UTF-8?q?record=E5=AD=90=E5=88=97=E8=B5=8B=E5=80=BC=E5=89=8D=E5=90=8E?= =?UTF-8?q?=E6=9C=AA=E5=88=87=E6=8D=A2=E5=8C=85=E5=85=A8=E5=B1=80=E5=8F=98?= =?UTF-8?q?=E9=87=8F=E4=B8=8A=E4=B8=8B=E6=96=87=E5=AF=BC=E8=87=B4=E6=8C=82?= =?UTF-8?q?=E5=BA=93=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/pl/plpgsql/src/pl_exec.cpp | 6 ++- .../regress/expected/plpgsql_package_type.out | 48 +++++++++++++++++++ src/test/regress/sql/plpgsql_package_type.sql | 36 +++++++++++++- 3 files changed, 88 insertions(+), 2 deletions(-) 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;