LOCK TABLE ... IN ACCESS SHARE MODE> requires SELECT>
- privileges on the target table. All other forms of LOCK>
- require table-level UPDATE>, DELETE>, or
- TRUNCATE> privileges.
+ privileges on the target table. LOCK TABLE ... IN ROW EXCLUSIVE
+ MODE> requires INSERT>, UPDATE>, DELETE>,
+ or TRUNCATE> privileges on the target table. All other forms of
+ LOCK> require table-level UPDATE>, DELETE>,
+ or TRUNCATE> privileges.
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;
}