!4386 解决不设置参数plpgsql_dependency时修改自定义类型调用存储过程报错的问题

Merge pull request !4386 from lukeman/issue
This commit is contained in:
opengauss_bot
2023-11-06 01:57:19 +00:00
committed by Gitee
3 changed files with 101 additions and 11 deletions

View File

@ -2650,15 +2650,17 @@ PLpgSQL_datum* copy_plpgsql_datum(PLpgSQL_datum* datum)
result = (PLpgSQL_datum*)newm;
} break;
case PLPGSQL_DTYPE_ROW: {
PLpgSQL_row* row = (PLpgSQL_row*)datum;
if (row->rowtupdesc && row->rowtupdesc->tdtypeid != RECORDOID) {
TupleDesc tup_desc = lookup_rowtype_tupdesc(row->rowtupdesc->tdtypeid, row->rowtupdesc->tdtypmod);
if (check_rowtype_has_been_changed(row->rowtupdesc, tup_desc)) {
Oid type_oid = tup_desc->tdtypeid;
if (enable_plpgsql_gsdependency_guc()) {
PLpgSQL_row* row = (PLpgSQL_row*)datum;
if (row->rowtupdesc && row->rowtupdesc->tdtypeid != RECORDOID) {
TupleDesc tup_desc = lookup_rowtype_tupdesc(row->rowtupdesc->tdtypeid, row->rowtupdesc->tdtypmod);
if (check_rowtype_has_been_changed(row->rowtupdesc, tup_desc)) {
Oid type_oid = tup_desc->tdtypeid;
ReleaseTupleDesc(tup_desc);
gsplsql_report_row_var_check_err(type_oid);
}
ReleaseTupleDesc(tup_desc);
gsplsql_report_row_var_check_err(type_oid);
}
ReleaseTupleDesc(tup_desc);
}
result = datum;
} break;

View File

@ -2,13 +2,74 @@ drop schema if exists plpgsql_recompile cascade;
NOTICE: schema "plpgsql_recompile" does not exist, skipping
create schema plpgsql_recompile;
set current_schema = plpgsql_recompile;
set behavior_compat_options = 'plpgsql_dependency';
---test 1
create type s_type as (
id integer,
name varchar,
addr text
);
--- 不设置 plpgsql_dependency
set behavior_compat_options = '';
--- test 0
create or replace procedure proc_no_guc(a s_type)
is
begin
RAISE INFO 'call a: %', a;
end;
/
call proc_no_guc(((1,'zhang','shanghai')));
INFO: call a: (1,zhang,shanghai)
proc_no_guc
-------------
(1 row)
alter type s_type ADD attribute a int;
--- 修改后,预期新增的参数值不打印
select valid from pg_object where object_type='P' and object_oid in (select Oid from pg_proc where propackageid = 0 and proname='proc_no_guc' and pronamespace = (select Oid from pg_namespace where nspname = 'plpgsql_recompile'));
valid
-------
t
(1 row)
call proc_no_guc((1,'zhang','shanghai',100));
INFO: call a: (1,zhang,shanghai,)
proc_no_guc
-------------
(1 row)
select valid from pg_object where object_type='P' and object_oid in (select Oid from pg_proc where propackageid = 0 and proname='proc_no_guc' and pronamespace = (select Oid from pg_namespace where nspname = 'plpgsql_recompile'));
valid
-------
t
(1 row)
alter type s_type DROP attribute a;
--- 修改后,预期valid字段无变化
select valid from pg_object where object_type='P' and object_oid in (select Oid from pg_proc where propackageid = 0 and proname='proc_no_guc' and pronamespace = (select Oid from pg_namespace where nspname = 'plpgsql_recompile'));
valid
-------
t
(1 row)
call proc_no_guc((1,'zhang','shanghai'));
INFO: call a: (1,zhang,shanghai)
proc_no_guc
-------------
(1 row)
select valid from pg_object where object_type='P' and object_oid in (select Oid from pg_proc where propackageid = 0 and proname='proc_no_guc' and pronamespace = (select Oid from pg_namespace where nspname = 'plpgsql_recompile'));
valid
-------
t
(1 row)
--- drop procedure
drop procedure proc_no_guc;
--- 设置 plpgsql_dependency
set behavior_compat_options = 'plpgsql_dependency';
--- test 1
create or replace procedure type_alter(a s_type)
is
begin

View File

@ -1,14 +1,41 @@
drop schema if exists plpgsql_recompile cascade;
create schema plpgsql_recompile;
set current_schema = plpgsql_recompile;
set behavior_compat_options = 'plpgsql_dependency';
---test 1
create type s_type as (
id integer,
name varchar,
addr text
);
--- 不设置 plpgsql_dependency
set behavior_compat_options = '';
--- test 0
create or replace procedure proc_no_guc(a s_type)
is
begin
RAISE INFO 'call a: %', a;
end;
/
call proc_no_guc(((1,'zhang','shanghai')));
alter type s_type ADD attribute a int;
--- 修改后,预期新增的参数值不打印
select valid from pg_object where object_type='P' and object_oid in (select Oid from pg_proc where propackageid = 0 and proname='proc_no_guc' and pronamespace = (select Oid from pg_namespace where nspname = 'plpgsql_recompile'));
call proc_no_guc((1,'zhang','shanghai',100));
select valid from pg_object where object_type='P' and object_oid in (select Oid from pg_proc where propackageid = 0 and proname='proc_no_guc' and pronamespace = (select Oid from pg_namespace where nspname = 'plpgsql_recompile'));
alter type s_type DROP attribute a;
--- 修改后,预期valid字段无变化
select valid from pg_object where object_type='P' and object_oid in (select Oid from pg_proc where propackageid = 0 and proname='proc_no_guc' and pronamespace = (select Oid from pg_namespace where nspname = 'plpgsql_recompile'));
call proc_no_guc((1,'zhang','shanghai'));
select valid from pg_object where object_type='P' and object_oid in (select Oid from pg_proc where propackageid = 0 and proname='proc_no_guc' and pronamespace = (select Oid from pg_namespace where nspname = 'plpgsql_recompile'));
--- drop procedure
drop procedure proc_no_guc;
--- 设置 plpgsql_dependency
set behavior_compat_options = 'plpgsql_dependency';
--- test 1
create or replace procedure type_alter(a s_type)
is
begin