]> 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:38:17 +0000 (18:38 -0500)
committerKevin Grittner <kgrittn@postgresql.org>
Sat, 2 Nov 2013 23:38:17 +0000 (18:38 -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 791f3361d72ca3c7d489b04700c98196ed1ec342..0b4710646aa64c2f74bb569bcca195c2393107bf 100644 (file)
@@ -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;
 
index c2bb9b0c5ef390cc252f2fa7b28b364695e58d0c..24f8b796dfb2c882861805d037fe4b0cdc038b44 100644 (file)
@@ -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
index 3ba6109d0b0d762b17097b169e9b2ed5cff243f6..93e7a42480e7b55f98e6da3ded70330a027595f3 100644 (file)
@@ -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