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

Merge pull request !5675 from lukeman/core_pr
This commit is contained in:
opengauss_bot
2024-07-02 01:57:49 +00:00
committed by Gitee
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

@ -16898,6 +16898,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;