]> granicus.if.org Git - postgresql/commitdiff
Lock all relations referred to in updatable views
authorStephen Frost <sfrost@snowman.net>
Tue, 8 Sep 2015 21:02:49 +0000 (17:02 -0400)
committerStephen Frost <sfrost@snowman.net>
Tue, 8 Sep 2015 21:02:49 +0000 (17:02 -0400)
Even views considered "simple" enough to be automatically updatable may
have mulitple relations involved (eg: in a where clause).  We need to
make sure and lock those relations when rewriting the query.

Back-patch to 9.3 where updatable views were added.

Pointed out by Andres, patch thanks to Dean Rasheed.

src/backend/rewrite/rewriteHandler.c

index 761047ca0829a20b01c4dbfb32a8fe25ca5fea0c..db3c2c7a76e055d325493644f0552a83481871f3 100644 (file)
@@ -2764,6 +2764,21 @@ rewriteTargetView(Query *parsetree, Relation view)
 
        heap_close(base_rel, NoLock);
 
+       /*
+        * If the view query contains any sublink subqueries then we need to also
+        * acquire locks on any relations they refer to.  We know that there won't
+        * be any subqueries in the range table or CTEs, so we can skip those, as
+        * in AcquireRewriteLocks.
+        */
+       if (viewquery->hasSubLinks)
+       {
+               acquireLocksOnSubLinks_context context;
+
+               context.for_execute = true;
+               query_tree_walker(viewquery, acquireLocksOnSubLinks, &context,
+                                                 QTW_IGNORE_RC_SUBQUERIES);
+       }
+
        /*
         * Create a new target RTE describing the base relation, and add it to the
         * outer query's rangetable.  (What's happening in the next few steps is