Fix multiple minor infelicities in aclchk.c error reports.
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 13 Jun 2016 17:53:10 +0000 (13:53 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 13 Jun 2016 17:53:10 +0000 (13:53 -0400)
pg_type_aclmask reported the wrong type's OID when complaining that
it could not find a type's typelem.  It also failed to provide a
suitable errcode when the initially given OID doesn't exist (which
is a user-facing error, since that OID can be user-specified).
pg_foreign_data_wrapper_aclmask and pg_foreign_server_aclmask likewise
lacked errcode specifications.  Trivial cosmetic adjustments too.

The wrong-type-OID problem was reported by Petru-Florin Mihancea in
bug #14186; the other issues noted by me while reading the code.
These errors all seem to be aboriginal in the respective routines, so
back-patch as necessary.

Report: <20160613163159.5798.52928@wrigleys.postgresql.org>

src/backend/catalog/aclchk.c

index 50a00cf8c8a38808fcc3546e988cd869b0877a2d..fa49ac44f6c1ee5a405b3eb0c773616ef0c8b631 100644 (file)
@@ -4068,7 +4068,8 @@ pg_foreign_data_wrapper_aclmask(Oid fdw_oid, Oid roleid,
    tuple = SearchSysCache1(FOREIGNDATAWRAPPEROID, ObjectIdGetDatum(fdw_oid));
    if (!HeapTupleIsValid(tuple))
        ereport(ERROR,
-               (errmsg("foreign-data wrapper with OID %u does not exist",
+               (errcode(ERRCODE_UNDEFINED_OBJECT),
+                errmsg("foreign-data wrapper with OID %u does not exist",
                        fdw_oid)));
    fdwForm = (Form_pg_foreign_data_wrapper) GETSTRUCT(tuple);
 
@@ -4129,7 +4130,8 @@ pg_foreign_server_aclmask(Oid srv_oid, Oid roleid,
    tuple = SearchSysCache1(FOREIGNSERVEROID, ObjectIdGetDatum(srv_oid));
    if (!HeapTupleIsValid(tuple))
        ereport(ERROR,
-               (errmsg("foreign server with OID %u does not exist",
+               (errcode(ERRCODE_UNDEFINED_OBJECT),
+                errmsg("foreign server with OID %u does not exist",
                        srv_oid)));
    srvForm = (Form_pg_foreign_server) GETSTRUCT(tuple);
 
@@ -4188,27 +4190,30 @@ pg_type_aclmask(Oid type_oid, Oid roleid, AclMode mask, AclMaskHow how)
    tuple = SearchSysCache1(TYPEOID, ObjectIdGetDatum(type_oid));
    if (!HeapTupleIsValid(tuple))
        ereport(ERROR,
-               (errmsg("type with OID %u does not exist",
+               (errcode(ERRCODE_UNDEFINED_OBJECT),
+                errmsg("type with OID %u does not exist",
                        type_oid)));
    typeForm = (Form_pg_type) GETSTRUCT(tuple);
 
-   /* "True" array types don't manage permissions of their own */
-   if (typeForm->typelem != 0 && typeForm->typlen == -1)
+   /*
+    * "True" array types don't manage permissions of their own; consult the
+    * element type instead.
+    */
+   if (OidIsValid(typeForm->typelem) && typeForm->typlen == -1)
    {
        Oid         elttype_oid = typeForm->typelem;
 
        ReleaseSysCache(tuple);
 
        tuple = SearchSysCache1(TYPEOID, ObjectIdGetDatum(elttype_oid));
+       /* this case is not a user-facing error, so elog not ereport */
        if (!HeapTupleIsValid(tuple))
-           ereport(ERROR,
-                   (errmsg("type with OID %u does not exist",
-                           type_oid)));
+           elog(ERROR, "cache lookup failed for type %u", elttype_oid);
        typeForm = (Form_pg_type) GETSTRUCT(tuple);
    }
 
    /*
-    * Normal case: get the type's ACL from pg_type
+    * Now get the type's owner and ACL from the tuple
     */
    ownerId = typeForm->typowner;