diff options
-rw-r--r-- | doc/src/sgml/ref/lock.sgml | 8 | ||||
-rw-r--r-- | src/backend/commands/lockcmds.c | 12 |
2 files changed, 13 insertions, 7 deletions
diff --git a/doc/src/sgml/ref/lock.sgml b/doc/src/sgml/ref/lock.sgml index 913afe76dd4..b946eab3039 100644 --- a/doc/src/sgml/ref/lock.sgml +++ b/doc/src/sgml/ref/lock.sgml @@ -161,9 +161,11 @@ LOCK [ TABLE ] [ ONLY ] <replaceable class="PARAMETER">name</replaceable> [ * ] <para> <literal>LOCK TABLE ... IN ACCESS SHARE MODE</> requires <literal>SELECT</> - privileges on the target table. All other forms of <command>LOCK</> - require table-level <literal>UPDATE</>, <literal>DELETE</>, or - <literal>TRUNCATE</> privileges. + privileges on the target table. <literal>LOCK TABLE ... IN ROW EXCLUSIVE + MODE</> requires <literal>INSERT</>, <literal>UPDATE</>, <literal>DELETE</>, + or <literal>TRUNCATE</> privileges on the target table. All other forms of + <command>LOCK</> require table-level <literal>UPDATE</>, <literal>DELETE</>, + or <literal>TRUNCATE</> privileges. </para> <para> diff --git a/src/backend/commands/lockcmds.c b/src/backend/commands/lockcmds.c index bdec2ff545c..a1670821aa4 100644 --- a/src/backend/commands/lockcmds.c +++ b/src/backend/commands/lockcmds.c @@ -169,13 +169,17 @@ static AclResult LockTableAclCheck(Oid reloid, LOCKMODE lockmode) { AclResult aclresult; + AclMode aclmask; /* Verify adequate privilege */ if (lockmode == AccessShareLock) - aclresult = pg_class_aclcheck(reloid, GetUserId(), - ACL_SELECT); + aclmask = ACL_SELECT; + else if (lockmode == RowExclusiveLock) + aclmask = ACL_INSERT | ACL_UPDATE | ACL_DELETE | ACL_TRUNCATE; else - aclresult = pg_class_aclcheck(reloid, GetUserId(), - ACL_UPDATE | ACL_DELETE | ACL_TRUNCATE); + aclmask = ACL_UPDATE | ACL_DELETE | ACL_TRUNCATE; + + aclresult = pg_class_aclcheck(reloid, GetUserId(), aclmask); + return aclresult; } |