From 2636ecf78b608f7faf1a0a7ff9b56fa54b7710db Mon Sep 17 00:00:00 2001 From: Kevin Grittner Date: Tue, 5 Nov 2013 15:36:33 -0600 Subject: [PATCH] Lock relation used to generate fresh data for RMV. The relation should not be accessible to any other process, but it should be locked for consistency. Since this is not known to cause any bug, it will not be back-patch, at least for now. Per report from Andres Freund --- 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 d5a10adc67..e3b0cbb708 100644 --- a/src/backend/commands/matview.c +++ b/src/backend/commands/matview.c @@ -30,6 +30,7 @@ #include "miscadmin.h" #include "parser/parse_relation.h" #include "rewrite/rewriteHandler.h" +#include "storage/lmgr.h" #include "storage/smgr.h" #include "tcop/tcopprot.h" #include "utils/builtins.h" @@ -240,9 +241,14 @@ ExecRefreshMatView(RefreshMatViewStmt *stmt, const char *queryString, heap_close(matviewRel, NoLock); - /* Create the transient table that will receive the regenerated data. */ + /* + * Create the transient table that will receive the regenerated data. + * Lock it against access by any other process until commit (by which time + * it will be gone). + */ OIDNewHeap = make_new_heap(matviewOid, tableSpace, concurrent, ExclusiveLock); + LockRelationOid(OIDNewHeap, AccessExclusiveLock); dest = CreateTransientRelDestReceiver(OIDNewHeap); /* Generate the data, if wanted. */