aboutsummaryrefslogtreecommitdiff
path: root/src/backend/commands/lockcmds.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/commands/lockcmds.c')
-rw-r--r--src/backend/commands/lockcmds.c28
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)