*** a/src/backend/executor/execMain.c --- b/src/backend/executor/execMain.c *************** *** 1102,1112 **** CheckValidRowMarkRel(Relation rel, RowMarkType markType) RelationGetRelationName(rel)))); break; case RELKIND_MATVIEW: ! /* Should not get here */ ! ereport(ERROR, ! (errcode(ERRCODE_WRONG_OBJECT_TYPE), ! errmsg("cannot lock rows in materialized view \"%s\"", ! RelationGetRelationName(rel)))); break; case RELKIND_FOREIGN_TABLE: /* Should not get here */ --- 1102,1117 ---- RelationGetRelationName(rel)))); break; case RELKIND_MATVIEW: ! /* ! * Allow referencing rows from materialized views as long as no ! * locking clause is involved. ! */ ! if (markType != ROW_MARK_REFERENCE && ! markType != ROW_MARK_COPY) ! ereport(ERROR, ! (errcode(ERRCODE_WRONG_OBJECT_TYPE), ! errmsg("cannot lock rows in materialized view \"%s\"", ! RelationGetRelationName(rel)))); break; case RELKIND_FOREIGN_TABLE: /* Should not get here */ *** a/src/test/regress/expected/matview.out --- b/src/test/regress/expected/matview.out *************** *** 476,478 **** SELECT * FROM mv_v; --- 476,489 ---- DROP TABLE v CASCADE; NOTICE: drop cascades to materialized view mv_v + -- make sure that matview rows can be referenced as source rows + CREATE TABLE base_table AS SELECT generate_series(1,10) AS a; + CREATE MATERIALIZED VIEW base_matview AS SELECT a FROM base_table; + DELETE FROM base_table USING base_matview WHERE base_matview.a = base_table.a; + SELECT * FROM base_table; + a + --- + (0 rows) + + DROP TABLE base_table CASCADE; + NOTICE: drop cascades to materialized view base_matview *** a/src/test/regress/sql/matview.sql --- b/src/test/regress/sql/matview.sql *************** *** 186,188 **** REFRESH MATERIALIZED VIEW CONCURRENTLY mv_v; --- 186,195 ---- SELECT * FROM v; SELECT * FROM mv_v; DROP TABLE v CASCADE; + + -- make sure that matview rows can be referenced as source rows + CREATE TABLE base_table AS SELECT generate_series(1,10) AS a; + CREATE MATERIALIZED VIEW base_matview AS SELECT a FROM base_table; + DELETE FROM base_table USING base_matview WHERE base_matview.a = base_table.a; + SELECT * FROM base_table; + DROP TABLE base_table CASCADE;