From be420fa02e69f084a0eeac6d2cb5424551aad495 Mon Sep 17 00:00:00 2001 From: Kevin Grittner Date: Sat, 2 Nov 2013 18:38:17 -0500 Subject: [PATCH] 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. --- src/backend/executor/execMain.c | 3 ++- src/test/regress/expected/matview.out | 6 ++++++ src/test/regress/sql/matview.sql | 6 ++++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c index 791f3361d7..0b4710646a 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 c2bb9b0c5e..24f8b796df 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 3ba6109d0b..93e7a42480 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