summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane2016-06-13 17:53:10 +0000
committerTom Lane2016-06-13 17:53:10 +0000
commitcd05539ec7f5eba2c1370447f27d2343c96bbeee (patch)
tree3f95776b4a15c8bbefc4ebc4a537b2982c933103 /src
parenta36c8219df2b3b93916bc5256df03e076c3615c6 (diff)
Fix multiple minor infelicities in aclchk.c error reports.
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>
Diffstat (limited to 'src')
-rw-r--r--src/backend/catalog/aclchk.c23
1 files changed, 14 insertions, 9 deletions
diff --git a/src/backend/catalog/aclchk.c b/src/backend/catalog/aclchk.c
index 7697ac3b8fc..60458006f07 100644
--- a/src/backend/catalog/aclchk.c
+++ b/src/backend/catalog/aclchk.c
@@ -4072,7 +4072,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);
@@ -4133,7 +4134,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);
@@ -4192,27 +4194,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;