!5675 处理issue:视图关联基表后,修改基表列的类型,查询视图时core dump
Merge pull request !5675 from lukeman/core_pr
This commit is contained in:
@ -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;
|
||||
}
|
||||
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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;
|
||||
|
||||
Reference in New Issue
Block a user