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.
This commit is contained in:
Stephen Frost 2015-09-08 17:02:49 -04:00
parent 3ae16798f0
commit c3e0ddd403
1 changed files with 15 additions and 0 deletions

View 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