<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>
 
 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;
 }