diff options
Diffstat (limited to 'src/backend/commands/lockcmds.c')
-rw-r--r-- | src/backend/commands/lockcmds.c | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/src/backend/commands/lockcmds.c b/src/backend/commands/lockcmds.c index dbd8cf47068..46ada49f4b6 100644 --- a/src/backend/commands/lockcmds.c +++ b/src/backend/commands/lockcmds.c @@ -95,6 +95,14 @@ RangeVarCallbackForLockTable(const RangeVar *rv, Oid relid, Oid oldrelid, return; /* woops, concurrently dropped; no permissions * check */ + /* Currently, we only allow plain tables or views to be locked */ + if (relkind != RELKIND_RELATION && relkind != RELKIND_PARTITIONED_TABLE && + relkind != RELKIND_VIEW) + ereport(ERROR, + (errcode(ERRCODE_WRONG_OBJECT_TYPE), + errmsg("\"%s\" is not a table or a view", + rv->relname))); + /* * Make note if a temporary relation has been accessed in this * transaction. @@ -201,13 +209,11 @@ LockViewRecurse_walker(Node *node, LockViewRecurse_context *context) foreach(rtable, query->rtable) { RangeTblEntry *rte = lfirst(rtable); - Oid relid; AclResult aclresult; - /* ignore all non-relation RTEs */ - if (rte->rtekind != RTE_RELATION) - continue; - relid = rte->relid; + Oid relid = rte->relid; + char relkind = rte->relkind; + char *relname = get_rel_name(relid); /* * The OLD and NEW placeholder entries in the view's rtable are @@ -217,6 +223,11 @@ LockViewRecurse_walker(Node *node, LockViewRecurse_context *context) (!strcmp(rte->eref->aliasname, "old") || !strcmp(rte->eref->aliasname, "new"))) continue; + /* Currently, we only allow plain tables or views to be locked. */ + if (relkind != RELKIND_RELATION && relkind != RELKIND_PARTITIONED_TABLE && + relkind != RELKIND_VIEW) + continue; + /* * We might be dealing with a self-referential view. If so, we * can just stop recursing, since we already locked it. @@ -227,8 +238,7 @@ LockViewRecurse_walker(Node *node, LockViewRecurse_context *context) /* Check permissions with the view owner's privilege. */ aclresult = LockTableAclCheck(relid, context->lockmode, context->viewowner); if (aclresult != ACLCHECK_OK) - aclcheck_error(aclresult, get_relkind_objtype(rte->relkind), - get_rel_name(relid)); + aclcheck_error(aclresult, get_relkind_objtype(relkind), relname); /* We have enough rights to lock the relation; do so. */ if (!context->nowait) @@ -237,9 +247,9 @@ LockViewRecurse_walker(Node *node, LockViewRecurse_context *context) ereport(ERROR, (errcode(ERRCODE_LOCK_NOT_AVAILABLE), errmsg("could not obtain lock on relation \"%s\"", - get_rel_name(relid)))); + relname))); - if (rte->relkind == RELKIND_VIEW) + if (relkind == RELKIND_VIEW) LockViewRecurse(relid, context->lockmode, context->nowait, context->ancestor_views); else if (rte->inh) |