summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/executor/spi.c16
-rw-r--r--src/test/regress/expected/matview.out25
-rw-r--r--src/test/regress/sql/matview.sql14
3 files changed, 51 insertions, 4 deletions
diff --git a/src/backend/executor/spi.c b/src/backend/executor/spi.c
index 649040e8fd7..82d5005e872 100644
--- a/src/backend/executor/spi.c
+++ b/src/backend/executor/spi.c
@@ -2186,15 +2186,23 @@ _SPI_execute_plan(SPIPlanPtr plan, ParamListInfo paramLI,
*/
if (IsA(stmt, CreateTableAsStmt))
{
- Assert(strncmp(completionTag, "SELECT ", 7) == 0);
- _SPI_current->processed = strtoul(completionTag + 7,
- NULL, 10);
+ CreateTableAsStmt *ctastmt = (CreateTableAsStmt *) stmt;
+
+ if (strncmp(completionTag, "SELECT ", 7) == 0)
+ _SPI_current->processed =
+ strtoul(completionTag + 7, NULL, 10);
+ else
+ {
+ /* Must be a CREATE ... WITH NO DATA */
+ Assert(ctastmt->into->skipData);
+ _SPI_current->processed = 0;
+ }
/*
* For historical reasons, if CREATE TABLE AS was spelled
* as SELECT INTO, return a special return code.
*/
- if (((CreateTableAsStmt *) stmt)->is_select_into)
+ if (ctastmt->is_select_into)
res = SPI_OK_SELINTO;
}
else if (IsA(stmt, CopyStmt))
diff --git a/src/test/regress/expected/matview.out b/src/test/regress/expected/matview.out
index 716daa2b713..4aa91f41644 100644
--- a/src/test/regress/expected/matview.out
+++ b/src/test/regress/expected/matview.out
@@ -553,3 +553,28 @@ REFRESH MATERIALIZED VIEW mv_foo;
REFRESH MATERIALIZED VIEW CONCURRENTLY mv_foo;
DROP OWNED BY user_dw CASCADE;
DROP ROLE user_dw;
+-- make sure that create WITH NO DATA works via SPI
+BEGIN;
+CREATE FUNCTION mvtest_func()
+ RETURNS void AS $$
+BEGIN
+ CREATE MATERIALIZED VIEW mvtest1 AS SELECT 1 AS x;
+ CREATE MATERIALIZED VIEW mvtest2 AS SELECT 1 AS x WITH NO DATA;
+END;
+$$ LANGUAGE plpgsql;
+SELECT mvtest_func();
+ mvtest_func
+-------------
+
+(1 row)
+
+SELECT * FROM mvtest1;
+ x
+---
+ 1
+(1 row)
+
+SELECT * FROM mvtest2;
+ERROR: materialized view "mvtest2" has not been populated
+HINT: Use the REFRESH MATERIALIZED VIEW command.
+ROLLBACK;
diff --git a/src/test/regress/sql/matview.sql b/src/test/regress/sql/matview.sql
index 7c2a93d5560..20588d189f4 100644
--- a/src/test/regress/sql/matview.sql
+++ b/src/test/regress/sql/matview.sql
@@ -224,3 +224,17 @@ REFRESH MATERIALIZED VIEW mv_foo;
REFRESH MATERIALIZED VIEW CONCURRENTLY mv_foo;
DROP OWNED BY user_dw CASCADE;
DROP ROLE user_dw;
+
+-- make sure that create WITH NO DATA works via SPI
+BEGIN;
+CREATE FUNCTION mvtest_func()
+ RETURNS void AS $$
+BEGIN
+ CREATE MATERIALIZED VIEW mvtest1 AS SELECT 1 AS x;
+ CREATE MATERIALIZED VIEW mvtest2 AS SELECT 1 AS x WITH NO DATA;
+END;
+$$ LANGUAGE plpgsql;
+SELECT mvtest_func();
+SELECT * FROM mvtest1;
+SELECT * FROM mvtest2;
+ROLLBACK;