aboutsummaryrefslogtreecommitdiff
path: root/src/backend/commands/lockcmds.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2020-11-06 16:17:57 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2020-11-06 16:17:57 -0500
commit549fd3d3bc24d40d8c577231eb82ebc7b93c1201 (patch)
tree9ae0c0059338cc69dc0de8ba420cca4448a3da5e /src/backend/commands/lockcmds.c
parent802c460a27cc1d01f8c8b9542488bbdfde60dc58 (diff)
downloadpostgresql-549fd3d3bc24d40d8c577231eb82ebc7b93c1201.tar.gz
postgresql-549fd3d3bc24d40d8c577231eb82ebc7b93c1201.zip
Revert "Accept relations of any kind in LOCK TABLE".
Revert 59ab4ac32, as well as the followup fix 33862cb9c, in all branches. We need to think a bit harder about what the behavior of LOCK TABLE on views should be, and there's no time for that before next week's releases. We'll take another crack at this later. Discussion: https://postgr.es/m/16703-e348f58aab3cf6cc@postgresql.org
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 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)