diff options
author | Stephen Frost <sfrost@snowman.net> | 2015-09-08 17:02:56 -0400 |
---|---|---|
committer | Stephen Frost <sfrost@snowman.net> | 2015-09-08 17:02:56 -0400 |
commit | 83d004904d82759118635dc1a6a7503d4da785e9 (patch) | |
tree | 83007930ecb5c172f5d7414f86b635eb0a929e23 /src/backend/rewrite/rewriteHandler.c | |
parent | b74af40bb2945d44842434a2480d8b3f053bcf58 (diff) |
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/backend/rewrite/rewriteHandler.c')
-rw-r--r-- | src/backend/rewrite/rewriteHandler.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/src/backend/rewrite/rewriteHandler.c b/src/backend/rewrite/rewriteHandler.c index cb65c0502ef..1c70557d315 100644 --- a/src/backend/rewrite/rewriteHandler.c +++ b/src/backend/rewrite/rewriteHandler.c @@ -2627,6 +2627,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 |