!3333 修复通过同义词refresh物化视图失败的问题

Merge pull request !3333 from chenxiaobin/fixMatViewSyn
This commit is contained in:
opengauss-bot
2023-04-13 06:35:44 +00:00
committed by Gitee
5 changed files with 40 additions and 5 deletions

View File

@ -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(

View File

@ -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);

View File

@ -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

View File

@ -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;

View File

@ -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;