]> granicus.if.org Git - postgresql/commitdiff
Prevent (auto)vacuum from truncating first page of populated matview.
authorKevin Grittner <kgrittn@postgresql.org>
Thu, 2 May 2013 22:33:03 +0000 (17:33 -0500)
committerKevin Grittner <kgrittn@postgresql.org>
Thu, 2 May 2013 22:33:03 +0000 (17:33 -0500)
Per report from Fujii Masao, with regression test using his example.

src/backend/commands/vacuumlazy.c
src/test/regress/expected/matview.out
src/test/regress/sql/matview.sql

index 9d304153b8bee4a4cd02701dc70173cdc06a60e1..02f3cf3c205483678e1637ac612134c99fd786d6 100644 (file)
@@ -230,7 +230,13 @@ lazy_vacuum_rel(Relation onerel, VacuumStmt *vacstmt,
         *
         * Don't even think about it unless we have a shot at releasing a goodly
         * number of pages.  Otherwise, the time taken isn't worth it.
+        *
+        * Leave a populated materialized view with at least one page.
         */
+       if (onerel->rd_rel->relkind == RELKIND_MATVIEW &&
+               vacrelstats->nonempty_pages == 0)
+               vacrelstats->nonempty_pages = 1;
+
        possibly_freeable = vacrelstats->rel_pages - vacrelstats->nonempty_pages;
        if (possibly_freeable > 0 &&
                (possibly_freeable >= REL_TRUNCATE_MINIMUM ||
index 5a53f84c5b8dfe3b3e71b7c5c437adfb49e7eb2e..e87775679ac9eb059af776e6e4c20e3bed7360da 100644 (file)
@@ -418,3 +418,23 @@ NOTICE:  drop cascades to 3 other objects
 DETAIL:  drop cascades to view v_test2
 drop cascades to materialized view mv_test2
 drop cascades to materialized view mv_test3
+-- test that vacuum does not make empty matview look unpopulated
+CREATE TABLE hoge (i int);
+INSERT INTO hoge VALUES (generate_series(1,100000));
+CREATE MATERIALIZED VIEW hogeview AS SELECT * FROM hoge WHERE i % 2 = 0;
+CREATE INDEX hogeviewidx ON hogeview (i);
+DELETE FROM hoge;
+REFRESH MATERIALIZED VIEW hogeview;
+SELECT * FROM hogeview WHERE i < 10;
+ i 
+---
+(0 rows)
+
+VACUUM ANALYZE;
+SELECT * FROM hogeview WHERE i < 10;
+ i 
+---
+(0 rows)
+
+DROP TABLE hoge CASCADE;
+NOTICE:  drop cascades to materialized view hogeview
index 08b48188c3c1d9e93d650cd111234750bd704426..9fbaafac6d0ae609e80f777754d6f71189cc4af0 100644 (file)
@@ -129,3 +129,15 @@ CREATE MATERIALIZED VIEW mv_test3 AS SELECT * FROM mv_test2 WHERE moo = 12345;
 SELECT pg_relation_is_scannable('mv_test3'::regclass);
 
 DROP VIEW v_test1 CASCADE;
+
+-- test that vacuum does not make empty matview look unpopulated
+CREATE TABLE hoge (i int);
+INSERT INTO hoge VALUES (generate_series(1,100000));
+CREATE MATERIALIZED VIEW hogeview AS SELECT * FROM hoge WHERE i % 2 = 0;
+CREATE INDEX hogeviewidx ON hogeview (i);
+DELETE FROM hoge;
+REFRESH MATERIALIZED VIEW hogeview;
+SELECT * FROM hogeview WHERE i < 10;
+VACUUM ANALYZE;
+SELECT * FROM hogeview WHERE i < 10;
+DROP TABLE hoge CASCADE;