Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Acquire appropriate locks when rewriting during RMV.
authorKevin Grittner <kgrittn@postgresql.org>
Sun, 3 Nov 2013 00:18:08 +0000 (19:18 -0500)
committerKevin Grittner <kgrittn@postgresql.org>
Sun, 3 Nov 2013 00:18:08 +0000 (19:18 -0500)
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

src/backend/commands/matview.c

index fcfc678813d5ce2f02aacb31bec3b5635825c4c4..d5a10adc6717c4b5487080e6ed1bb86133918c48 100644 (file)
@@ -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)