Commit 0f249fe5 authored by Tom Lane's avatar Tom Lane

Fix busted Assert for CREATE MATVIEW ... WITH NO DATA.

Commit 874fe3ae changed the command tag returned for CREATE MATVIEW/CREATE
TABLE AS ... WITH NO DATA, but missed that there was code in spi.c that
expected the command tag to always be "SELECT".  Fortunately, the
consequence was only an Assert failure, so this oversight should have no
impact in production builds.

Since this code path was evidently un-exercised, add a regression test.

Per report from Shivam Saxena. Back-patch to 9.3, like the previous commit.

Michael Paquier

Report: <97218716-480B-4527-B5CD-D08D798A0C7B@dresources.com>
parent fd5a2db7
...@@ -2226,8 +2226,12 @@ _SPI_execute_plan(SPIPlanPtr plan, ParamListInfo paramLI, ...@@ -2226,8 +2226,12 @@ _SPI_execute_plan(SPIPlanPtr plan, ParamListInfo paramLI,
pg_strtouint64(completionTag + 7, NULL, 10); pg_strtouint64(completionTag + 7, NULL, 10);
else else
{ {
/* Must be an IF NOT EXISTS that did nothing */ /*
Assert(ctastmt->if_not_exists); * Must be an IF NOT EXISTS that did nothing, or a
* CREATE ... WITH NO DATA.
*/
Assert(ctastmt->if_not_exists ||
ctastmt->into->skipData);
_SPI_current->processed = 0; _SPI_current->processed = 0;
} }
......
...@@ -557,3 +557,28 @@ REFRESH MATERIALIZED VIEW mvtest_mv_foo; ...@@ -557,3 +557,28 @@ REFRESH MATERIALIZED VIEW mvtest_mv_foo;
REFRESH MATERIALIZED VIEW CONCURRENTLY mvtest_mv_foo; REFRESH MATERIALIZED VIEW CONCURRENTLY mvtest_mv_foo;
DROP OWNED BY regress_user_mvtest CASCADE; DROP OWNED BY regress_user_mvtest CASCADE;
DROP ROLE regress_user_mvtest; DROP ROLE regress_user_mvtest;
-- 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;
...@@ -226,3 +226,17 @@ REFRESH MATERIALIZED VIEW mvtest_mv_foo; ...@@ -226,3 +226,17 @@ REFRESH MATERIALIZED VIEW mvtest_mv_foo;
REFRESH MATERIALIZED VIEW CONCURRENTLY mvtest_mv_foo; REFRESH MATERIALIZED VIEW CONCURRENTLY mvtest_mv_foo;
DROP OWNED BY regress_user_mvtest CASCADE; DROP OWNED BY regress_user_mvtest CASCADE;
DROP ROLE regress_user_mvtest; DROP ROLE regress_user_mvtest;
-- 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;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment