]> granicus.if.org Git - postgresql/commitdiff
Fix subquery reference to non-populated MV in CMV.
authorKevin Grittner <kgrittn@postgresql.org>
Sat, 2 Nov 2013 23:31:41 +0000 (18:31 -0500)
committerKevin Grittner <kgrittn@postgresql.org>
Sat, 2 Nov 2013 23:31:41 +0000 (18:31 -0500)
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.

src/backend/executor/execMain.c
src/test/regress/expected/matview.out
src/test/regress/sql/matview.sql

index ee228b6dee8fa68aa935e224d32b460cc54cd368..fe0321ea06ae71d6f93f8b1ab72ba35176ea7ea8 100644 (file)
@@ -864,7 +864,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;
 
index a98de4f58d332d93e2088be5716d817e4f5ac713..b0a1b48a3ca5a6094cbd8824b0452aeb8c66892c 100644 (file)
@@ -385,3 +385,9 @@ SELECT * FROM hogeview WHERE i < 10;
 
 DROP TABLE hoge CASCADE;
 NOTICE:  drop cascades to materialized view hogeview
+-- 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
index 975f8dd57506e533ffd01364b57f17a830dd2304..501cd7d6a73f1f8ed76c17e378d6ceffe8460217 100644 (file)
@@ -124,3 +124,9 @@ SELECT * FROM hogeview WHERE i < 10;
 VACUUM ANALYZE;
 SELECT * FROM hogeview WHERE i < 10;
 DROP TABLE hoge 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;