From c5bf7a2052c8e7ebbd1ca3986525c3629d7345d1 Mon Sep 17 00:00:00 2001
From: Kevin Grittner <kgrittn@postgresql.org>
Date: Wed, 6 Mar 2013 17:15:34 -0600
Subject: [PATCH] WAL-log the extension of a new empty MV heap which is being
 populated.

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 | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/src/backend/commands/matview.c b/src/backend/commands/matview.c
index e040bedb7e5..6a0643828a4 100644
--- a/src/backend/commands/matview.c
+++ b/src/backend/commands/matview.c
@@ -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);
-- 
GitLab