修复在包的子存储过程中给record子列赋值前后未切换包全局变量上下文导致挂库的问题
This commit is contained in:
@ -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);
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
Reference in New Issue
Block a user