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 0cd762ea5b4..2846ef3b7bd 100644 --- a/src/backend/commands/lockcmds.c +++ b/src/backend/commands/lockcmds.c @@ -84,6 +84,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 view", + rv->relname))); + /* * Make note if a temporary relation has been accessed in this * transaction. @@ -179,13 +187,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 @@ -196,6 +202,11 @@ LockViewRecurse_walker(Node *node, LockViewRecurse_context *context) strcmp(rte->eref->aliasname, "new") == 0)) 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. @@ -206,8 +217,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) @@ -216,9 +226,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) |