aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorStephen Frost <sfrost@snowman.net>2015-09-08 17:02:53 -0400
committerStephen Frost <sfrost@snowman.net>2015-09-08 17:02:53 -0400
commit9801bae217e9d3f72e2d1f3dd780bf0bf9365dae (patch)
treeb07e7e353c11a4da7b6452a709c8ebb15d655bd8 /src
parent97b7b9560f3dbe1c48dfb4630f50444eb7e8adc8 (diff)
downloadpostgresql-9801bae217e9d3f72e2d1f3dd780bf0bf9365dae.tar.gz
postgresql-9801bae217e9d3f72e2d1f3dd780bf0bf9365dae.zip
Lock all relations referred to in updatable views
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.
Diffstat (limited to 'src')
-rw-r--r--src/backend/rewrite/rewriteHandler.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/src/backend/rewrite/rewriteHandler.c b/src/backend/rewrite/rewriteHandler.c
index a238cffa88b..a42579729ce 100644
--- a/src/backend/rewrite/rewriteHandler.c
+++ b/src/backend/rewrite/rewriteHandler.c
@@ -2758,6 +2758,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
* very much like what the planner would do to "pull up" the view into the