处理issue:视图关联基表后,修改基表列的类型,查询视图时core dump

This commit is contained in:
lukeman
2024-06-26 20:51:30 +08:00
committed by lukeman
parent 0b8b1c060a
commit fbf6cbadc7
4 changed files with 51 additions and 1 deletions

View File

@ -1172,6 +1172,12 @@ static ValidateDependResult ValidateDependView(Oid view_oid, char objType, List*
} else if (relkind == RELKIND_VIEW || relkind == RELKIND_MATVIEW) {
char type = relkind == RELKIND_VIEW ? OBJECT_TYPE_VIEW : OBJECT_TYPE_MATVIEW;
ValidateDependResult result = ValidateDependView(dep_objid, type, list);
if (result == ValidateDependCircularDepend) {
ereport(ERROR,
(errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
errmsg(
"infinite recursion detected in rules for relation: \"%s\"", get_rel_name(view_oid))));
}
isValid &= (result != ValidateDependInvalid);
if (isValid) {
// here means dep_objid is valid, we should keep the same view_oid.attr with dep_objid.dep_objsubid
@ -1214,6 +1220,12 @@ bool ValidateDependView(Oid view_oid, char objType) {
List * list = NIL;
ValidateDependResult result = ValidateDependView(view_oid, objType, &list);
list_free_ext(list);
if (result == ValidateDependCircularDepend) {
ereport(ERROR,
(errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
errmsg(
"infinite recursion detected in rules for relation: \"%s\"", get_rel_name(view_oid))));
}
return result != ValidateDependInvalid;
}

View File

@ -16904,6 +16904,12 @@ bool InvalidateDependView(Oid viewOid, char objType)
continue;
}
char relkind = get_rel_relkind(dep_view_oid);
if (relkind == objType && dep_view_oid == viewOid) {
ereport(ERROR,
(errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
errmsg(
"infinite recursion detected in rules for relation: \"%s\"", get_rel_name(viewOid))));
}
if (relkind != RELKIND_VIEW && relkind != RELKIND_MATVIEW) {
continue;
}

View File

@ -634,10 +634,30 @@ select * from circular_dependency_t; -- failed
ERROR: infinite recursion detected in rules for relation "circular_dependency_t"
select * from circular_dependency_v; -- failed
ERROR: infinite recursion detected in rules for relation "circular_dependency_t"
create table circular_dependency_t1 (id int, name text);
create view circular_dependency_v1 as select * from circular_dependency_t1;
create view circular_dependency_v2 as select * from circular_dependency_v1;
create or replace view circular_dependency_v2 as select * from circular_dependency_v1 union all select * from circular_dependency_v2;
alter table circular_dependency_t1 modify id int8;
select * from circular_dependency_v2; -- failed
ERROR: infinite recursion detected in rules for relation: "circular_dependency_v2"
create table circular_dependency_t2 (id int, name text);
create view circular_dependency_v3 as select * from circular_dependency_t2;
create view circular_dependency_v4 as select * from circular_dependency_v3;
create or replace view circular_dependency_v3 as select * from circular_dependency_t2 union all select * from circular_dependency_v4;
alter table circular_dependency_t2 modify id int8; -- failed
ERROR: infinite recursion detected in rules for relation: "circular_dependency_v3"
--- clean
drop schema dependent_view cascade;
NOTICE: drop cascades to 4 other objects
--?.*
DETAIL: drop cascades to table base_table
drop cascades to materialized view master_view1
drop cascades to view circular_dependency_t
drop cascades to view circular_dependency_v
drop cascades to table circular_dependency_t1
drop cascades to view circular_dependency_v1
drop cascades to view circular_dependency_v2
drop cascades to table circular_dependency_t2
drop cascades to view circular_dependency_v4
drop cascades to view circular_dependency_v3

View File

@ -222,6 +222,18 @@ create or replace view circular_dependency_v as select * from circular_dependenc
select * from circular_dependency_t; -- failed
select * from circular_dependency_v; -- failed
create table circular_dependency_t1 (id int, name text);
create view circular_dependency_v1 as select * from circular_dependency_t1;
create view circular_dependency_v2 as select * from circular_dependency_v1;
create or replace view circular_dependency_v2 as select * from circular_dependency_v1 union all select * from circular_dependency_v2;
alter table circular_dependency_t1 modify id int8;
select * from circular_dependency_v2; -- failed
create table circular_dependency_t2 (id int, name text);
create view circular_dependency_v3 as select * from circular_dependency_t2;
create view circular_dependency_v4 as select * from circular_dependency_v3;
create or replace view circular_dependency_v3 as select * from circular_dependency_t2 union all select * from circular_dependency_v4;
alter table circular_dependency_t2 modify id int8; -- failed
--- clean
drop schema dependent_view cascade;