aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/parser/analyze.c12
-rw-r--r--src/test/regress/expected/matview.out57
-rw-r--r--src/test/regress/sql/matview.sql19
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;