]> granicus.if.org Git - postgresql/commitdiff
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)