!4386 解决不设置参数plpgsql_dependency时修改自定义类型调用存储过程报错的问题
Merge pull request !4386 from lukeman/issue
This commit is contained in:
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Reference in New Issue
Block a user