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;