]> granicus.if.org Git - postgresql/commitdiff
WAL-log the extension of a new empty MV heap which is being populated.
authorKevin Grittner <kgrittn@postgresql.org>
Wed, 6 Mar 2013 23:15:34 +0000 (17:15 -0600)
committerKevin Grittner <kgrittn@postgresql.org>
Wed, 6 Mar 2013 23:15:34 +0000 (17:15 -0600)
This page with no tuples is used to distinguish an MV containing a
zero-row resultset of its backing query from an MV which has not
been populated by its backing query.  Unless WAL-logged, recovery
and hot standby don't work correctly with what should be an empty
but scannable materialized view.

Fixes bugs reported by Fujii Masao in testing MVs on hot standby.

src/backend/commands/matview.c

index e040bedb7e5c717ce962dd78aad99da5e9604270..6a0643828a4f728689c9c3057cb10a459b372823 100644 (file)
@@ -14,6 +14,7 @@
  */
 #include "postgres.h"
 
+#include "access/heapam_xlog.h"
 #include "access/multixact.h"
 #include "access/relscan.h"
 #include "access/xact.h"
@@ -68,10 +69,15 @@ SetRelationIsScannable(Relation relation)
        Assert(relation->rd_rel->relkind == RELKIND_MATVIEW);
        Assert(relation->rd_isscannable == false);
 
-       RelationOpenSmgr(relation);
        page = (Page) palloc(BLCKSZ);
        PageInit(page, BLCKSZ, 0);
+
+       if (RelationNeedsWAL(relation))
+               log_newpage(&(relation->rd_node), MAIN_FORKNUM, 0, page);
+
+       RelationOpenSmgr(relation);
        smgrextend(relation->rd_smgr, MAIN_FORKNUM, 0, (char *) page, true);
+
        pfree(page);
 
        smgrimmedsync(relation->rd_smgr, MAIN_FORKNUM);