fix bug 修复触发器内调用pkg公有变量无法获取正确pkgb变量值的问题

This commit is contained in:
xu.han01
2024-04-23 03:38:07 +00:00
committed by yaoxin
parent 9334edb278
commit 47d0eb1c7a
3 changed files with 96 additions and 1 deletions

View File

@ -1929,7 +1929,11 @@ HeapTuple plpgsql_exec_trigger(PLpgSQL_function* func, TriggerData* trigdata)
*/
estate.err_text = gettext_noop("during initialization of execution state");
for (i = 0; i < estate.ndatums; i++) {
estate.datums[i] = copy_plpgsql_datum(func->datums[i]);
if (!func->datums[i]->ispkg) {
estate.datums[i] = copy_plpgsql_datum(func->datums[i]);
} else {
estate.datums[i] = func->datums[i];
}
}
/*

View File

@ -1756,3 +1756,49 @@ drop table t1;
drop table t2;
drop function t1_tri_func;
drop schema part_bri_warnning;
create schema test_schema_for_trigger;
set current_schema to test_schema_for_trigger;
--触发器测试
--测试时用到的package
CREATE OR REPLACE PACKAGE func_test_pkg1 AS
-- integer 类型的变量
int_val INTEGER := 0;
-- record 类型的定义
TYPE rec_type IS RECORD (
msg VARCHAR2(100)
);
PROCEDURE proc1;
END func_test_pkg1;
/
CREATE OR REPLACE PACKAGE BODY func_test_pkg1 AS
PROCEDURE proc1 AS
BEGIN
RAISE NOTICE 'In func_test_pkg1.proc1()';
END proc1;
END func_test_pkg1;
/
CREATE TABLE trg_test(id int, name text);
create or replace function global_cache_trigger_test()
return TRIGGER as
begin
func_test_pkg1.int_val = func_test_pkg1.int_val + 1;
raise notice 'func_test_pkg1.int_val=%',func_test_pkg1.int_val;
return new;
end;
/
CREATE TRIGGER trigger_global_cache_trigger_test
AFTER INSERT ON trg_test
FOR EACH ROW
EXECUTE PROCEDURE global_cache_trigger_test();
insert into trg_test values(1,'引用package中的变量');
NOTICE: func_test_pkg1.int_val=1
insert into trg_test values(1,'引用package中的变量');
NOTICE: func_test_pkg1.int_val=2
drop package func_test_pkg1;
NOTICE: drop cascades to function test_schema_for_trigger.proc1()
drop schema test_schema_for_trigger cascade;
NOTICE: drop cascades to 2 other objects
DETAIL: drop cascades to table trg_test
drop cascades to function global_cache_trigger_test()

View File

@ -1198,3 +1198,48 @@ drop table t1;
drop table t2;
drop function t1_tri_func;
drop schema part_bri_warnning;
create schema test_schema_for_trigger;
set current_schema to test_schema_for_trigger;
--
--package
CREATE OR REPLACE PACKAGE func_test_pkg1 AS
-- integer 类型的变量
int_val INTEGER := 0;
-- record 类型的定义
TYPE rec_type IS RECORD (
msg VARCHAR2(100)
);
PROCEDURE proc1;
END func_test_pkg1;
/
CREATE OR REPLACE PACKAGE BODY func_test_pkg1 AS
PROCEDURE proc1 AS
BEGIN
RAISE NOTICE 'In func_test_pkg1.proc1()';
END proc1;
END func_test_pkg1;
/
CREATE TABLE trg_test(id int, name text);
create or replace function global_cache_trigger_test()
return TRIGGER as
begin
func_test_pkg1.int_val = func_test_pkg1.int_val + 1;
raise notice 'func_test_pkg1.int_val=%',func_test_pkg1.int_val;
return new;
end;
/
CREATE TRIGGER trigger_global_cache_trigger_test
AFTER INSERT ON trg_test
FOR EACH ROW
EXECUTE PROCEDURE global_cache_trigger_test();
insert into trg_test values(1,'引用package中的变量');
insert into trg_test values(1,'引用package中的变量');
drop package func_test_pkg1;
drop schema test_schema_for_trigger cascade;