修复在包的子存储过程中给record子列赋值前后未切换包全局变量上下文导致挂库的问题

This commit is contained in:
leiziwei
2024-04-08 06:03:40 +00:00
committed by yaoxin
parent 4024b02ebb
commit d0b166c35c
3 changed files with 88 additions and 2 deletions

View File

@ -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);
}

View File

@ -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;

View File

@ -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;