1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-05 07:21:24 +03:00

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
This commit is contained in:
Tom Lane
2020-11-06 16:17:56 -05:00
parent d3adaabaf7
commit eeda7f6338
4 changed files with 25 additions and 42 deletions

View File

@ -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)