From fbf6cbadc790dcdaa530a35fec8d7be51ec0cd06 Mon Sep 17 00:00:00 2001 From: lukeman Date: Wed, 26 Jun 2024 20:51:30 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=84=E7=90=86issue=EF=BC=9A=E8=A7=86?= =?UTF-8?q?=E5=9B=BE=E5=85=B3=E8=81=94=E5=9F=BA=E8=A1=A8=E5=90=8E=EF=BC=8C?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=9F=BA=E8=A1=A8=E5=88=97=E7=9A=84=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=EF=BC=8C=E6=9F=A5=E8=AF=A2=E8=A7=86=E5=9B=BE=E6=97=B6?= =?UTF-8?q?core=20dump?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/backend/parser/parse_relation.cpp | 12 ++++++++++ .../optimizer/commands/tablecmds.cpp | 6 +++++ src/test/regress/expected/dependent_view.out | 22 ++++++++++++++++++- src/test/regress/sql/dependent_view.sql | 12 ++++++++++ 4 files changed, 51 insertions(+), 1 deletion(-) diff --git a/src/common/backend/parser/parse_relation.cpp b/src/common/backend/parser/parse_relation.cpp index 98d9678d2..6a0a2bdbf 100755 --- a/src/common/backend/parser/parse_relation.cpp +++ b/src/common/backend/parser/parse_relation.cpp @@ -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; } diff --git a/src/gausskernel/optimizer/commands/tablecmds.cpp b/src/gausskernel/optimizer/commands/tablecmds.cpp index 723f42ef3..3f5d9db49 100755 --- a/src/gausskernel/optimizer/commands/tablecmds.cpp +++ b/src/gausskernel/optimizer/commands/tablecmds.cpp @@ -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; } diff --git a/src/test/regress/expected/dependent_view.out b/src/test/regress/expected/dependent_view.out index 8b9f2082a..7dd74b90d 100644 --- a/src/test/regress/expected/dependent_view.out +++ b/src/test/regress/expected/dependent_view.out @@ -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 diff --git a/src/test/regress/sql/dependent_view.sql b/src/test/regress/sql/dependent_view.sql index 58e7392f3..523939015 100644 --- a/src/test/regress/sql/dependent_view.sql +++ b/src/test/regress/sql/dependent_view.sql @@ -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;