diff --git a/src/backend/executor/spi.c b/src/backend/executor/spi.c index b46b7074d70..e6c8ad3e883 100644 --- a/src/backend/executor/spi.c +++ b/src/backend/executor/spi.c @@ -2180,15 +2180,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 2284e364ebf..9f6795daf67 100644 --- a/src/test/regress/expected/matview.out +++ b/src/test/regress/expected/matview.out @@ -477,3 +477,28 @@ SELECT * FROM mv_v; DROP TABLE v CASCADE; NOTICE: drop cascades to materialized view mv_v +-- 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 280c4bb400e..bc10146a27f 100644 --- a/src/test/regress/sql/matview.sql +++ b/src/test/regress/sql/matview.sql @@ -166,3 +166,17 @@ 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; + +-- 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;