aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Grittner <kgrittn@postgresql.org>2013-11-02 19:18:08 -0500
committerKevin Grittner <kgrittn@postgresql.org>2013-11-02 19:18:08 -0500
commit2a781d57dcd027df32d15ee2378b84d0c4d005d1 (patch)
treef1641b649abfbd6fc8e927b658bbef01e50c6fe0
parentbe420fa02e69f084a0eeac6d2cb5424551aad495 (diff)
downloadpostgresql-2a781d57dcd027df32d15ee2378b84d0c4d005d1.tar.gz
postgresql-2a781d57dcd027df32d15ee2378b84d0c4d005d1.zip
Acquire appropriate locks when rewriting during RMV.
Since the query has not been freshly parsed when executing REFRESH MATERIALIZED VIEW, locks must be explicitly taken before rewrite. Backpatch to 9.3. Andres Freund
-rw-r--r--src/backend/commands/matview.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/src/backend/commands/matview.c b/src/backend/commands/matview.c
index fcfc678813d..d5a10adc671 100644
--- a/src/backend/commands/matview.c
+++ b/src/backend/commands/matview.c
@@ -283,6 +283,7 @@ refresh_matview_datafill(DestReceiver *dest, Query *query,
Oid save_userid;
int save_sec_context;
int save_nestlevel;
+ Query *copied_query;
/*
* Switch to the owner's userid, so that any functions are run as that
@@ -294,8 +295,10 @@ refresh_matview_datafill(DestReceiver *dest, Query *query,
save_sec_context | SECURITY_RESTRICTED_OPERATION);
save_nestlevel = NewGUCNestLevel();
- /* Rewrite, copying the given Query to make sure it's not changed */
- rewritten = QueryRewrite((Query *) copyObject(query));
+ /* Lock and rewrite, using a copy to preserve the original query. */
+ copied_query = copyObject(query);
+ AcquireRewriteLocks(copied_query, false);
+ rewritten = QueryRewrite(copied_query);
/* SELECT should never rewrite to more or less than one SELECT query */
if (list_length(rewritten) != 1)