aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKevin Grittner <kgrittn@postgresql.org>2013-11-02 18:38:17 -0500
committerKevin Grittner <kgrittn@postgresql.org>2013-11-02 18:38:17 -0500
commitbe420fa02e69f084a0eeac6d2cb5424551aad495 (patch)
tree9b8a5ba9ac079a89461faf6f8415b7139f15a5fd /src
parent24ace4053d42e2c48af8c15d598622e488fb9502 (diff)
downloadpostgresql-be420fa02e69f084a0eeac6d2cb5424551aad495.tar.gz
postgresql-be420fa02e69f084a0eeac6d2cb5424551aad495.zip
Fix subquery reference to non-populated MV in CMV.
A subquery reference to a matview should be allowed by CREATE MATERIALIZED VIEW WITH NO DATA, just like a direct reference is. Per bug report from Laurent Sartran. Backpatch to 9.3.
Diffstat (limited to 'src')
-rw-r--r--src/backend/executor/execMain.c3
-rw-r--r--src/test/regress/expected/matview.out6
-rw-r--r--src/test/regress/sql/matview.sql6
3 files changed, 14 insertions, 1 deletions
diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c
index 791f3361d72..0b4710646aa 100644
--- a/src/backend/executor/execMain.c
+++ b/src/backend/executor/execMain.c
@@ -865,7 +865,8 @@ InitPlan(QueryDesc *queryDesc, int eflags)
* it is a parameterless subplan (not initplan), we suggest that it be
* prepared to handle REWIND efficiently; otherwise there is no need.
*/
- sp_eflags = eflags & EXEC_FLAG_EXPLAIN_ONLY;
+ sp_eflags = eflags
+ & (EXEC_FLAG_EXPLAIN_ONLY | EXEC_FLAG_WITH_NO_DATA);
if (bms_is_member(i, plannedstmt->rewindPlanIDs))
sp_eflags |= EXEC_FLAG_REWIND;
diff --git a/src/test/regress/expected/matview.out b/src/test/regress/expected/matview.out
index c2bb9b0c5ef..24f8b796dfb 100644
--- a/src/test/regress/expected/matview.out
+++ b/src/test/regress/expected/matview.out
@@ -424,6 +424,12 @@ REFRESH MATERIALIZED VIEW mv;
REFRESH MATERIALIZED VIEW CONCURRENTLY mv;
DROP TABLE foo CASCADE;
NOTICE: drop cascades to materialized view mv
+-- allow subquery to reference unpopulated matview if WITH NO DATA is specified
+CREATE MATERIALIZED VIEW mv1 AS SELECT 1 AS col1 WITH NO DATA;
+CREATE MATERIALIZED VIEW mv2 AS SELECT * FROM mv1
+ WHERE col1 = (SELECT LEAST(col1) FROM mv1) WITH NO DATA;
+DROP MATERIALIZED VIEW mv1 CASCADE;
+NOTICE: drop cascades to materialized view mv2
-- make sure that types with unusual equality tests work
CREATE TABLE boxes (id serial primary key, b box);
INSERT INTO boxes (b) VALUES
diff --git a/src/test/regress/sql/matview.sql b/src/test/regress/sql/matview.sql
index 3ba6109d0b0..93e7a42480e 100644
--- a/src/test/regress/sql/matview.sql
+++ b/src/test/regress/sql/matview.sql
@@ -155,6 +155,12 @@ REFRESH MATERIALIZED VIEW mv;
REFRESH MATERIALIZED VIEW CONCURRENTLY mv;
DROP TABLE foo CASCADE;
+-- allow subquery to reference unpopulated matview if WITH NO DATA is specified
+CREATE MATERIALIZED VIEW mv1 AS SELECT 1 AS col1 WITH NO DATA;
+CREATE MATERIALIZED VIEW mv2 AS SELECT * FROM mv1
+ WHERE col1 = (SELECT LEAST(col1) FROM mv1) WITH NO DATA;
+DROP MATERIALIZED VIEW mv1 CASCADE;
+
-- make sure that types with unusual equality tests work
CREATE TABLE boxes (id serial primary key, b box);
INSERT INTO boxes (b) VALUES