mirror of
https://github.com/postgres/postgres.git
synced 2025-06-07 11:02:12 +03:00
Don't reject ROW_MARK_REFERENCE rowmarks for materialized views.
We should allow this so that matviews can be referenced in UPDATE/DELETE statements in READ COMMITTED isolation level. The requirement for that is that a re-fetch by TID will see the same row version the query saw earlier, which is true of matviews, so there's no reason for the restriction. Per bug #9398. Michael Paquier, after a suggestion by me
This commit is contained in:
parent
13ea43ab83
commit
3973034e6d
@ -1100,14 +1100,15 @@ CheckValidRowMarkRel(Relation rel, RowMarkType markType)
|
||||
RelationGetRelationName(rel))));
|
||||
break;
|
||||
case RELKIND_MATVIEW:
|
||||
/* Should not get here */
|
||||
/* Allow referencing a matview, but not actual locking clauses */
|
||||
if (markType != ROW_MARK_REFERENCE)
|
||||
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 */
|
||||
/* Should not get here; planner should have used ROW_MARK_COPY */
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_WRONG_OBJECT_TYPE),
|
||||
errmsg("cannot lock rows in foreign table \"%s\"",
|
||||
|
@ -412,3 +412,29 @@ SELECT * FROM mv_v;
|
||||
|
||||
DROP TABLE v CASCADE;
|
||||
NOTICE: drop cascades to materialized view mv_v
|
||||
-- make sure that matview rows can be referenced as source rows (bug #9398)
|
||||
CREATE TABLE v AS SELECT generate_series(1,10) AS a;
|
||||
CREATE MATERIALIZED VIEW mv_v AS SELECT a FROM v WHERE a <= 5;
|
||||
DELETE FROM v WHERE EXISTS ( SELECT * FROM mv_v WHERE mv_v.a = v.a );
|
||||
SELECT * FROM v;
|
||||
a
|
||||
----
|
||||
6
|
||||
7
|
||||
8
|
||||
9
|
||||
10
|
||||
(5 rows)
|
||||
|
||||
SELECT * FROM mv_v;
|
||||
a
|
||||
---
|
||||
1
|
||||
2
|
||||
3
|
||||
4
|
||||
5
|
||||
(5 rows)
|
||||
|
||||
DROP TABLE v CASCADE;
|
||||
NOTICE: drop cascades to materialized view mv_v
|
||||
|
@ -141,3 +141,11 @@ REFRESH MATERIALIZED VIEW mv_v;
|
||||
SELECT * FROM v;
|
||||
SELECT * FROM mv_v;
|
||||
DROP TABLE v CASCADE;
|
||||
|
||||
-- make sure that matview rows can be referenced as source rows (bug #9398)
|
||||
CREATE TABLE v AS SELECT generate_series(1,10) AS a;
|
||||
CREATE MATERIALIZED VIEW mv_v AS SELECT a FROM v WHERE a <= 5;
|
||||
DELETE FROM v WHERE EXISTS ( SELECT * FROM mv_v WHERE mv_v.a = v.a );
|
||||
SELECT * FROM v;
|
||||
SELECT * FROM mv_v;
|
||||
DROP TABLE v CASCADE;
|
||||
|
Loading…
x
Reference in New Issue
Block a user