diff --git a/src/common/backend/catalog/pg_synonym.cpp b/src/common/backend/catalog/pg_synonym.cpp index 28f6e65a506eb38adcce10f267f3c686f688d0cb..77c31bc793b547ab6a405272795891acb8a0b767 100644 --- a/src/common/backend/catalog/pg_synonym.cpp +++ b/src/common/backend/catalog/pg_synonym.cpp @@ -520,6 +520,7 @@ char* CheckReferencedObject(Oid relOid, RangeVar* objVar, const char* synName) case RELKIND_CONTQUERY: case RELKIND_FOREIGN_TABLE: case RELKIND_STREAM: + case RELKIND_MATVIEW: break; case RELKIND_COMPOSITE_TYPE: appendStringInfo( diff --git a/src/gausskernel/optimizer/commands/matview.cpp b/src/gausskernel/optimizer/commands/matview.cpp index 6ec286d33f7ac059529504737b0211ee9dbd6446..25200d9c2febc5ec01ada222a6446cdc8b649fd4 100755 --- a/src/gausskernel/optimizer/commands/matview.cpp +++ b/src/gausskernel/optimizer/commands/matview.cpp @@ -829,7 +829,7 @@ ObjectAddress ExecRefreshMatViewInc(RefreshMatViewStmt *stmt, const char *queryS */ matviewOid = RangeVarGetRelidExtended(stmt->relation, ExclusiveLock, - false, false, false, false, + false, false, false, true, RangeVarCallbackOwnsTable, NULL); Oid mapid = DatumGetObjectId(get_matview_mapid(matviewOid)); @@ -945,7 +945,7 @@ ObjectAddress ExecRefreshIncMatViewAll(RefreshMatViewStmt *stmt, const char *que */ matviewOid = RangeVarGetRelidExtended(stmt->relation, AccessExclusiveLock, - false, false, false, false, + false, false, false, true, RangeVarCallbackOwnsTable, NULL); mapid = DatumGetObjectId(get_matview_mapid(matviewOid)); matviewRel = heap_open(matviewOid, AccessExclusiveLock); @@ -1054,7 +1054,7 @@ ObjectAddress ExecRefreshCtasMatViewAll(RefreshMatViewStmt *stmt, const char *qu * Get a lock until end of transaction. */ matviewOid = RangeVarGetRelidExtended(stmt->relation, - AccessExclusiveLock, false, false, false, false, + AccessExclusiveLock, false, false, false, true, RangeVarCallbackOwnsTable, NULL); matviewRel = heap_open(matviewOid, NoLock); @@ -1167,7 +1167,7 @@ bool isIncMatView(RangeVar *rv) { Oid matviewOid = RangeVarGetRelidExtended(rv, NoLock, - false, false, false, false, + false, false, false, true, RangeVarCallbackOwnsTable, NULL); Relation matviewRel = heap_open(matviewOid, AccessShareLock); diff --git a/src/gausskernel/process/tcop/utility.cpp b/src/gausskernel/process/tcop/utility.cpp index 9b1a60406c416e87df165529d321bb83988f6946..24a8ee3607caff64b5c64237ec98986987a0ccf0 100755 --- a/src/gausskernel/process/tcop/utility.cpp +++ b/src/gausskernel/process/tcop/utility.cpp @@ -6197,7 +6197,9 @@ ProcessUtilitySlow(Node *parse_tree, /* something happen on datanodes */ if (IS_PGXC_DATANODE) #else - Relation matview = heap_openrv(stmt->relation, stmt->incremental ? ExclusiveLock : AccessExclusiveLock); + Relation matview = HeapOpenrvExtended(stmt->relation, + stmt->incremental ? ExclusiveLock : AccessExclusiveLock, + false, true); CheckRefreshMatview(matview, is_incremental_matview(matview->rd_id)); heap_close(matview, NoLock); #endif diff --git a/src/test/regress/expected/matview_single.out b/src/test/regress/expected/matview_single.out index e6347ff807ed020b4a764284a71d6b0d7ddc2915..72131ba65a9f031c68e41787369f999ad71c3433 100644 --- a/src/test/regress/expected/matview_single.out +++ b/src/test/regress/expected/matview_single.out @@ -124,5 +124,22 @@ select oid, relname from pg_class where relname like 'mlog%'; --------+------+------+-------+--------- (0 rows) +create table test_syn(id int unique,a1 varchar(20)); +NOTICE: CREATE TABLE / UNIQUE will create implicit index "test_syn_id_key" for table "test_syn" +create materialized view mv_test_syn as select * from test_syn; +create incremental materialized view imv_test_syn as select * from test_syn; +create synonym s_mv_test_syn for mv_test_syn; +create synonym s_imv_test_syn for imv_test_syn; +REFRESH MATERIALIZED VIEW s_mv_test_syn; +REFRESH MATERIALIZED VIEW s_imv_test_syn; +REFRESH INCREMENTAL MATERIALIZED VIEW s_mv_test_syn; +ERROR: "mv_test_syn" is not an incremental materialized view +REFRESH INCREMENTAL MATERIALIZED VIEW s_imv_test_syn; +drop synonym s_mv_test_syn; +drop synonym s_imv_test_syn; +drop table test_syn cascade; +NOTICE: drop cascades to 2 other objects +DETAIL: drop cascades to materialized view mv_test_syn +drop cascades to materialized view imv_test_syn \c regression drop database test_imv_db; diff --git a/src/test/regress/sql/matview_single.sql b/src/test/regress/sql/matview_single.sql index c70c0087f512522a3be6d74a1162d7d05063a3cb..56eca85d11efa8704eba46babd3a639f7998cfe7 100644 --- a/src/test/regress/sql/matview_single.sql +++ b/src/test/regress/sql/matview_single.sql @@ -57,5 +57,20 @@ drop table imv1_t cascade; select oid, relname from pg_class where relname like 'mlog%'; \d +create table test_syn(id int unique,a1 varchar(20)); +create materialized view mv_test_syn as select * from test_syn; +create incremental materialized view imv_test_syn as select * from test_syn; +create synonym s_mv_test_syn for mv_test_syn; +create synonym s_imv_test_syn for imv_test_syn; + +REFRESH MATERIALIZED VIEW s_mv_test_syn; +REFRESH MATERIALIZED VIEW s_imv_test_syn; +REFRESH INCREMENTAL MATERIALIZED VIEW s_mv_test_syn; +REFRESH INCREMENTAL MATERIALIZED VIEW s_imv_test_syn; + +drop synonym s_mv_test_syn; +drop synonym s_imv_test_syn; +drop table test_syn cascade; + \c regression drop database test_imv_db;