diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/parser/analyze.c | 12 | ||||
-rw-r--r-- | src/test/regress/expected/matview.out | 57 | ||||
-rw-r--r-- | src/test/regress/sql/matview.sql | 19 |
3 files changed, 15 insertions, 73 deletions
diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c index fb28e471685..8f8da0523c5 100644 --- a/src/backend/parser/analyze.c +++ b/src/backend/parser/analyze.c @@ -2167,6 +2167,18 @@ transformCreateTableAsStmt(ParseState *pstate, CreateTableAsStmt *stmt) errmsg("materialized views may not be defined using bound parameters"))); /* + * For now, we disallow unlogged materialized views, because it + * seems like a bad idea for them to just go to empty after a crash. + * (If we could mark them as unpopulated, that would be better, but + * that requires catalog changes which crash recovery can't presently + * handle.) + */ + if (stmt->into->rel->relpersistence == RELPERSISTENCE_UNLOGGED) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("materialized views cannot be UNLOGGED"))); + + /* * At runtime, we'll need a copy of the parsed-but-not-rewritten Query * for purposes of creating the view's ON SELECT rule. We stash that * in the IntoClause because that's where intorel_startup() can diff --git a/src/test/regress/expected/matview.out b/src/test/regress/expected/matview.out index e87775679ac..06bb2551a83 100644 --- a/src/test/regress/expected/matview.out +++ b/src/test/regress/expected/matview.out @@ -279,59 +279,8 @@ SELECT * FROM tvvm; (1 row) -- test diemv when the mv does not exist -DROP MATERIALIZED VIEW IF EXISTS tum; -NOTICE: materialized view "tum" does not exist, skipping --- make sure that an unlogged materialized view works (in the absence of a crash) -CREATE UNLOGGED MATERIALIZED VIEW tum AS SELECT type, sum(amt) AS totamt FROM t GROUP BY type WITH NO DATA; -SELECT pg_relation_is_scannable('tum'::regclass); - pg_relation_is_scannable --------------------------- - f -(1 row) - -SELECT * FROM tum; -ERROR: materialized view "tum" has not been populated -HINT: Use the REFRESH MATERIALIZED VIEW command. -REFRESH MATERIALIZED VIEW tum; -SELECT pg_relation_is_scannable('tum'::regclass); - pg_relation_is_scannable --------------------------- - t -(1 row) - -SELECT * FROM tum; - type | totamt -------+-------- - y | 12 - z | 24 - x | 5 -(3 rows) - -REFRESH MATERIALIZED VIEW tum WITH NO DATA; -SELECT pg_relation_is_scannable('tum'::regclass); - pg_relation_is_scannable --------------------------- - f -(1 row) - -SELECT * FROM tum; -ERROR: materialized view "tum" has not been populated -HINT: Use the REFRESH MATERIALIZED VIEW command. -REFRESH MATERIALIZED VIEW tum WITH DATA; -SELECT pg_relation_is_scannable('tum'::regclass); - pg_relation_is_scannable --------------------------- - t -(1 row) - -SELECT * FROM tum; - type | totamt -------+-------- - y | 12 - z | 24 - x | 5 -(3 rows) - +DROP MATERIALIZED VIEW IF EXISTS no_such_mv; +NOTICE: materialized view "no_such_mv" does not exist, skipping -- test join of mv and view SELECT type, m.totamt AS mtot, v.totamt AS vtot FROM tm m LEFT JOIN tv v USING (type) ORDER BY type; type | mtot | vtot @@ -341,8 +290,6 @@ SELECT type, m.totamt AS mtot, v.totamt AS vtot FROM tm m LEFT JOIN tv v USING ( z | 24 | 24 (3 rows) --- test diemv when the mv does exist -DROP MATERIALIZED VIEW IF EXISTS tum; -- make sure that dependencies are reported properly when they block the drop DROP TABLE t; ERROR: cannot drop table t because other objects depend on it diff --git a/src/test/regress/sql/matview.sql b/src/test/regress/sql/matview.sql index 9fbaafac6d0..09a7378133c 100644 --- a/src/test/regress/sql/matview.sql +++ b/src/test/regress/sql/matview.sql @@ -87,28 +87,11 @@ SELECT * FROM tvmm; SELECT * FROM tvvm; -- test diemv when the mv does not exist -DROP MATERIALIZED VIEW IF EXISTS tum; - --- make sure that an unlogged materialized view works (in the absence of a crash) -CREATE UNLOGGED MATERIALIZED VIEW tum AS SELECT type, sum(amt) AS totamt FROM t GROUP BY type WITH NO DATA; -SELECT pg_relation_is_scannable('tum'::regclass); -SELECT * FROM tum; -REFRESH MATERIALIZED VIEW tum; -SELECT pg_relation_is_scannable('tum'::regclass); -SELECT * FROM tum; -REFRESH MATERIALIZED VIEW tum WITH NO DATA; -SELECT pg_relation_is_scannable('tum'::regclass); -SELECT * FROM tum; -REFRESH MATERIALIZED VIEW tum WITH DATA; -SELECT pg_relation_is_scannable('tum'::regclass); -SELECT * FROM tum; +DROP MATERIALIZED VIEW IF EXISTS no_such_mv; -- test join of mv and view SELECT type, m.totamt AS mtot, v.totamt AS vtot FROM tm m LEFT JOIN tv v USING (type) ORDER BY type; --- test diemv when the mv does exist -DROP MATERIALIZED VIEW IF EXISTS tum; - -- make sure that dependencies are reported properly when they block the drop DROP TABLE t; |