diff --git a/src/backend/catalog/aclchk.c b/src/backend/catalog/aclchk.c
index 95b0f8c7b0..67354cea92 100644
--- a/src/backend/catalog/aclchk.c
+++ b/src/backend/catalog/aclchk.c
@@ -160,6 +160,9 @@ static AclMode pg_aclmask(ObjectType objtype, Oid object_oid, AttrNumber attnum,
 						  Oid roleid, AclMode mask, AclMaskHow how);
 static AclMode object_aclmask(Oid classid, Oid objectid, Oid roleid,
 							  AclMode mask, AclMaskHow how);
+static AclMode object_aclmask_ext(Oid classid, Oid objectid, Oid roleid,
+								  AclMode mask, AclMaskHow how,
+								  bool *is_missing);
 static AclMode pg_attribute_aclmask(Oid table_oid, AttrNumber attnum,
 									Oid roleid, AclMode mask, AclMaskHow how);
 static AclMode pg_attribute_aclmask_ext(Oid table_oid, AttrNumber attnum,
@@ -172,10 +175,12 @@ static AclMode pg_parameter_acl_aclmask(Oid acl_oid, Oid roleid,
 										AclMode mask, AclMaskHow how);
 static AclMode pg_largeobject_aclmask_snapshot(Oid lobj_oid, Oid roleid,
 											   AclMode mask, AclMaskHow how, Snapshot snapshot);
-static AclMode pg_namespace_aclmask(Oid nsp_oid, Oid roleid,
-									AclMode mask, AclMaskHow how);
-static AclMode pg_type_aclmask(Oid type_oid, Oid roleid,
-							   AclMode mask, AclMaskHow how);
+static AclMode pg_namespace_aclmask_ext(Oid nsp_oid, Oid roleid,
+										AclMode mask, AclMaskHow how,
+										bool *is_missing);
+static AclMode pg_type_aclmask_ext(Oid type_oid, Oid roleid,
+								   AclMode mask, AclMaskHow how,
+								   bool *is_missing);
 static void recordExtensionInitPriv(Oid objoid, Oid classoid, int objsubid,
 									Acl *new_acl);
 static void recordExtensionInitPrivWorker(Oid objoid, Oid classoid, int objsubid,
@@ -3085,6 +3090,18 @@ pg_aclmask(ObjectType objtype, Oid object_oid, AttrNumber attnum, Oid roleid,
 static AclMode
 object_aclmask(Oid classid, Oid objectid, Oid roleid,
 			   AclMode mask, AclMaskHow how)
+{
+	return object_aclmask_ext(classid, objectid, roleid, mask, how, NULL);
+}
+
+/*
+ * Generic routine for examining a user's privileges for an object,
+ * with is_missing
+ */
+static AclMode
+object_aclmask_ext(Oid classid, Oid objectid, Oid roleid,
+				   AclMode mask, AclMaskHow how,
+				   bool *is_missing)
 {
 	int			cacheid;
 	AclMode		result;
@@ -3098,9 +3115,11 @@ object_aclmask(Oid classid, Oid objectid, Oid roleid,
 	switch (classid)
 	{
 		case NamespaceRelationId:
-			return pg_namespace_aclmask(objectid, roleid, mask, how);
+			return pg_namespace_aclmask_ext(objectid, roleid, mask, how,
+											is_missing);
 		case TypeRelationId:
-			return pg_type_aclmask(objectid, roleid, mask, how);
+			return pg_type_aclmask_ext(objectid, roleid, mask, how,
+									   is_missing);
 	}
 
 	/* Even more special cases */
@@ -3113,16 +3132,26 @@ object_aclmask(Oid classid, Oid objectid, Oid roleid,
 		return mask;
 
 	/*
-	 * Get the objects's ACL from its catalog
+	 * Get the object's ACL from its catalog
 	 */
 
 	cacheid = get_object_catcache_oid(classid);
 
 	tuple = SearchSysCache1(cacheid, ObjectIdGetDatum(objectid));
 	if (!HeapTupleIsValid(tuple))
-		ereport(ERROR,
-				(errcode(ERRCODE_UNDEFINED_DATABASE),
-				 errmsg("%s with OID %u does not exist", get_object_class_descr(classid), objectid)));
+	{
+		if (is_missing != NULL)
+		{
+			/* return "no privileges" instead of throwing an error */
+			*is_missing = true;
+			return 0;
+		}
+		else
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("%s with OID %u does not exist",
+							get_object_class_descr(classid), objectid)));
+	}
 
 	ownerId = DatumGetObjectId(SysCacheGetAttrNotNull(cacheid,
 													  tuple,
@@ -3609,11 +3638,12 @@ pg_largeobject_aclmask_snapshot(Oid lobj_oid, Oid roleid,
 }
 
 /*
- * Routine for examining a user's privileges for a namespace
+ * Routine for examining a user's privileges for a namespace, with is_missing
  */
 static AclMode
-pg_namespace_aclmask(Oid nsp_oid, Oid roleid,
-					 AclMode mask, AclMaskHow how)
+pg_namespace_aclmask_ext(Oid nsp_oid, Oid roleid,
+						 AclMode mask, AclMaskHow how,
+						 bool *is_missing)
 {
 	AclMode		result;
 	HeapTuple	tuple;
@@ -3647,8 +3677,8 @@ pg_namespace_aclmask(Oid nsp_oid, Oid roleid,
 	 */
 	if (isTempNamespace(nsp_oid))
 	{
-		if (object_aclcheck(DatabaseRelationId, MyDatabaseId, roleid,
-							ACL_CREATE_TEMP) == ACLCHECK_OK)
+		if (object_aclcheck_ext(DatabaseRelationId, MyDatabaseId, roleid,
+								ACL_CREATE_TEMP, is_missing) == ACLCHECK_OK)
 			return mask & ACL_ALL_RIGHTS_SCHEMA;
 		else
 			return mask & ACL_USAGE;
@@ -3659,9 +3689,18 @@ pg_namespace_aclmask(Oid nsp_oid, Oid roleid,
 	 */
 	tuple = SearchSysCache1(NAMESPACEOID, ObjectIdGetDatum(nsp_oid));
 	if (!HeapTupleIsValid(tuple))
-		ereport(ERROR,
-				(errcode(ERRCODE_UNDEFINED_SCHEMA),
-				 errmsg("schema with OID %u does not exist", nsp_oid)));
+	{
+		if (is_missing != NULL)
+		{
+			/* return "no privileges" instead of throwing an error */
+			*is_missing = true;
+			return 0;
+		}
+		else
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_SCHEMA),
+					 errmsg("schema with OID %u does not exist", nsp_oid)));
+	}
 
 	ownerId = ((Form_pg_namespace) GETSTRUCT(tuple))->nspowner;
 
@@ -3701,20 +3740,20 @@ pg_namespace_aclmask(Oid nsp_oid, Oid roleid,
 }
 
 /*
- * Routine for examining a user's privileges for a type.
+ * Routine for examining a user's privileges for a type, with is_missing
  */
 static AclMode
-pg_type_aclmask(Oid type_oid, Oid roleid, AclMode mask, AclMaskHow how)
+pg_type_aclmask_ext(Oid type_oid, Oid roleid, AclMode mask, AclMaskHow how,
+					bool *is_missing)
 {
 	AclMode		result;
 	HeapTuple	tuple;
+	Form_pg_type typeForm;
 	Datum		aclDatum;
 	bool		isNull;
 	Acl		   *acl;
 	Oid			ownerId;
 
-	Form_pg_type typeForm;
-
 	/* Bypass permission checks for superusers */
 	if (superuser_arg(roleid))
 		return mask;
@@ -3724,10 +3763,19 @@ pg_type_aclmask(Oid type_oid, Oid roleid, AclMode mask, AclMaskHow how)
 	 */
 	tuple = SearchSysCache1(TYPEOID, ObjectIdGetDatum(type_oid));
 	if (!HeapTupleIsValid(tuple))
-		ereport(ERROR,
-				(errcode(ERRCODE_UNDEFINED_OBJECT),
-				 errmsg("type with OID %u does not exist",
-						type_oid)));
+	{
+		if (is_missing != NULL)
+		{
+			/* return "no privileges" instead of throwing an error */
+			*is_missing = true;
+			return 0;
+		}
+		else
+			ereport(ERROR,
+					(errcode(ERRCODE_UNDEFINED_OBJECT),
+					 errmsg("type with OID %u does not exist",
+							type_oid)));
+	}
 	typeForm = (Form_pg_type) GETSTRUCT(tuple);
 
 	/*
@@ -3741,9 +3789,20 @@ pg_type_aclmask(Oid type_oid, Oid roleid, AclMode mask, AclMaskHow how)
 		ReleaseSysCache(tuple);
 
 		tuple = SearchSysCache1(TYPEOID, ObjectIdGetDatum(elttype_oid));
-		/* this case is not a user-facing error, so elog not ereport */
 		if (!HeapTupleIsValid(tuple))
-			elog(ERROR, "cache lookup failed for type %u", elttype_oid);
+		{
+			if (is_missing != NULL)
+			{
+				/* return "no privileges" instead of throwing an error */
+				*is_missing = true;
+				return 0;
+			}
+			else
+				ereport(ERROR,
+						(errcode(ERRCODE_UNDEFINED_OBJECT),
+						 errmsg("type with OID %u does not exist",
+								elttype_oid)));
+		}
 		typeForm = (Form_pg_type) GETSTRUCT(tuple);
 	}
 
@@ -3783,7 +3842,20 @@ pg_type_aclmask(Oid type_oid, Oid roleid, AclMode mask, AclMaskHow how)
 AclResult
 object_aclcheck(Oid classid, Oid objectid, Oid roleid, AclMode mode)
 {
-	if (object_aclmask(classid, objectid, roleid, mode, ACLMASK_ANY) != 0)
+	return object_aclcheck_ext(classid, objectid, roleid, mode, NULL);
+}
+
+/*
+ * Exported generic routine for checking a user's access privileges to an object
+ * with is_missing
+ */
+AclResult
+object_aclcheck_ext(Oid classid, Oid objectid,
+					Oid roleid, AclMode mode,
+					bool *is_missing)
+{
+	if (object_aclmask_ext(classid, objectid, roleid, mode, ACLMASK_ANY,
+						   is_missing) != 0)
 		return ACLCHECK_OK;
 	else
 		return ACLCHECK_NO_PRIV;
diff --git a/src/backend/utils/adt/acl.c b/src/backend/utils/adt/acl.c
index 809cb6f03f..798833011b 100644
--- a/src/backend/utils/adt/acl.c
+++ b/src/backend/utils/adt/acl.c
@@ -3010,14 +3010,17 @@ has_database_privilege_name_id(PG_FUNCTION_ARGS)
 	Oid			roleid;
 	AclMode		mode;
 	AclResult	aclresult;
+	bool		is_missing = false;
 
 	roleid = get_role_oid_or_public(NameStr(*username));
 	mode = convert_database_priv_string(priv_type_text);
 
-	if (!SearchSysCacheExists1(DATABASEOID, ObjectIdGetDatum(databaseoid)))
-		PG_RETURN_NULL();
+	aclresult = object_aclcheck_ext(DatabaseRelationId, databaseoid,
+									roleid, mode,
+									&is_missing);
 
-	aclresult = object_aclcheck(DatabaseRelationId, databaseoid, roleid, mode);
+	if (is_missing)
+		PG_RETURN_NULL();
 
 	PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
 }
@@ -3036,14 +3039,17 @@ has_database_privilege_id(PG_FUNCTION_ARGS)
 	Oid			roleid;
 	AclMode		mode;
 	AclResult	aclresult;
+	bool		is_missing = false;
 
 	roleid = GetUserId();
 	mode = convert_database_priv_string(priv_type_text);
 
-	if (!SearchSysCacheExists1(DATABASEOID, ObjectIdGetDatum(databaseoid)))
-		PG_RETURN_NULL();
+	aclresult = object_aclcheck_ext(DatabaseRelationId, databaseoid,
+									roleid, mode,
+									&is_missing);
 
-	aclresult = object_aclcheck(DatabaseRelationId, databaseoid, roleid, mode);
+	if (is_missing)
+		PG_RETURN_NULL();
 
 	PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
 }
@@ -3084,13 +3090,16 @@ has_database_privilege_id_id(PG_FUNCTION_ARGS)
 	text	   *priv_type_text = PG_GETARG_TEXT_PP(2);
 	AclMode		mode;
 	AclResult	aclresult;
+	bool		is_missing = false;
 
 	mode = convert_database_priv_string(priv_type_text);
 
-	if (!SearchSysCacheExists1(DATABASEOID, ObjectIdGetDatum(databaseoid)))
-		PG_RETURN_NULL();
+	aclresult = object_aclcheck_ext(DatabaseRelationId, databaseoid,
+									roleid, mode,
+									&is_missing);
 
-	aclresult = object_aclcheck(DatabaseRelationId, databaseoid, roleid, mode);
+	if (is_missing)
+		PG_RETURN_NULL();
 
 	PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
 }
@@ -3207,14 +3216,17 @@ has_foreign_data_wrapper_privilege_name_id(PG_FUNCTION_ARGS)
 	Oid			roleid;
 	AclMode		mode;
 	AclResult	aclresult;
+	bool		is_missing = false;
 
 	roleid = get_role_oid_or_public(NameStr(*username));
 	mode = convert_foreign_data_wrapper_priv_string(priv_type_text);
 
-	if (!SearchSysCacheExists1(FOREIGNDATAWRAPPEROID, ObjectIdGetDatum(fdwid)))
-		PG_RETURN_NULL();
+	aclresult = object_aclcheck_ext(ForeignDataWrapperRelationId, fdwid,
+									roleid, mode,
+									&is_missing);
 
-	aclresult = object_aclcheck(ForeignDataWrapperRelationId, fdwid, roleid, mode);
+	if (is_missing)
+		PG_RETURN_NULL();
 
 	PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
 }
@@ -3233,14 +3245,17 @@ has_foreign_data_wrapper_privilege_id(PG_FUNCTION_ARGS)
 	Oid			roleid;
 	AclMode		mode;
 	AclResult	aclresult;
+	bool		is_missing = false;
 
 	roleid = GetUserId();
 	mode = convert_foreign_data_wrapper_priv_string(priv_type_text);
 
-	if (!SearchSysCacheExists1(FOREIGNDATAWRAPPEROID, ObjectIdGetDatum(fdwid)))
-		PG_RETURN_NULL();
+	aclresult = object_aclcheck_ext(ForeignDataWrapperRelationId, fdwid,
+									roleid, mode,
+									&is_missing);
 
-	aclresult = object_aclcheck(ForeignDataWrapperRelationId, fdwid, roleid, mode);
+	if (is_missing)
+		PG_RETURN_NULL();
 
 	PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
 }
@@ -3281,13 +3296,16 @@ has_foreign_data_wrapper_privilege_id_id(PG_FUNCTION_ARGS)
 	text	   *priv_type_text = PG_GETARG_TEXT_PP(2);
 	AclMode		mode;
 	AclResult	aclresult;
+	bool		is_missing = false;
 
 	mode = convert_foreign_data_wrapper_priv_string(priv_type_text);
 
-	if (!SearchSysCacheExists1(FOREIGNDATAWRAPPEROID, ObjectIdGetDatum(fdwid)))
-		PG_RETURN_NULL();
+	aclresult = object_aclcheck_ext(ForeignDataWrapperRelationId, fdwid,
+									roleid, mode,
+									&is_missing);
 
-	aclresult = object_aclcheck(ForeignDataWrapperRelationId, fdwid, roleid, mode);
+	if (is_missing)
+		PG_RETURN_NULL();
 
 	PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
 }
@@ -3398,14 +3416,17 @@ has_function_privilege_name_id(PG_FUNCTION_ARGS)
 	Oid			roleid;
 	AclMode		mode;
 	AclResult	aclresult;
+	bool		is_missing = false;
 
 	roleid = get_role_oid_or_public(NameStr(*username));
 	mode = convert_function_priv_string(priv_type_text);
 
-	if (!SearchSysCacheExists1(PROCOID, ObjectIdGetDatum(functionoid)))
-		PG_RETURN_NULL();
+	aclresult = object_aclcheck_ext(ProcedureRelationId, functionoid,
+									roleid, mode,
+									&is_missing);
 
-	aclresult = object_aclcheck(ProcedureRelationId, functionoid, roleid, mode);
+	if (is_missing)
+		PG_RETURN_NULL();
 
 	PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
 }
@@ -3424,14 +3445,17 @@ has_function_privilege_id(PG_FUNCTION_ARGS)
 	Oid			roleid;
 	AclMode		mode;
 	AclResult	aclresult;
+	bool		is_missing = false;
 
 	roleid = GetUserId();
 	mode = convert_function_priv_string(priv_type_text);
 
-	if (!SearchSysCacheExists1(PROCOID, ObjectIdGetDatum(functionoid)))
-		PG_RETURN_NULL();
+	aclresult = object_aclcheck_ext(ProcedureRelationId, functionoid,
+									roleid, mode,
+									&is_missing);
 
-	aclresult = object_aclcheck(ProcedureRelationId, functionoid, roleid, mode);
+	if (is_missing)
+		PG_RETURN_NULL();
 
 	PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
 }
@@ -3472,13 +3496,16 @@ has_function_privilege_id_id(PG_FUNCTION_ARGS)
 	text	   *priv_type_text = PG_GETARG_TEXT_PP(2);
 	AclMode		mode;
 	AclResult	aclresult;
+	bool		is_missing = false;
 
 	mode = convert_function_priv_string(priv_type_text);
 
-	if (!SearchSysCacheExists1(PROCOID, ObjectIdGetDatum(functionoid)))
-		PG_RETURN_NULL();
+	aclresult = object_aclcheck_ext(ProcedureRelationId, functionoid,
+									roleid, mode,
+									&is_missing);
 
-	aclresult = object_aclcheck(ProcedureRelationId, functionoid, roleid, mode);
+	if (is_missing)
+		PG_RETURN_NULL();
 
 	PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
 }
@@ -3598,14 +3625,17 @@ has_language_privilege_name_id(PG_FUNCTION_ARGS)
 	Oid			roleid;
 	AclMode		mode;
 	AclResult	aclresult;
+	bool		is_missing = false;
 
 	roleid = get_role_oid_or_public(NameStr(*username));
 	mode = convert_language_priv_string(priv_type_text);
 
-	if (!SearchSysCacheExists1(LANGOID, ObjectIdGetDatum(languageoid)))
-		PG_RETURN_NULL();
+	aclresult = object_aclcheck_ext(LanguageRelationId, languageoid,
+									roleid, mode,
+									&is_missing);
 
-	aclresult = object_aclcheck(LanguageRelationId, languageoid, roleid, mode);
+	if (is_missing)
+		PG_RETURN_NULL();
 
 	PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
 }
@@ -3624,14 +3654,17 @@ has_language_privilege_id(PG_FUNCTION_ARGS)
 	Oid			roleid;
 	AclMode		mode;
 	AclResult	aclresult;
+	bool		is_missing = false;
 
 	roleid = GetUserId();
 	mode = convert_language_priv_string(priv_type_text);
 
-	if (!SearchSysCacheExists1(LANGOID, ObjectIdGetDatum(languageoid)))
-		PG_RETURN_NULL();
+	aclresult = object_aclcheck_ext(LanguageRelationId, languageoid,
+									roleid, mode,
+									&is_missing);
 
-	aclresult = object_aclcheck(LanguageRelationId, languageoid, roleid, mode);
+	if (is_missing)
+		PG_RETURN_NULL();
 
 	PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
 }
@@ -3672,13 +3705,16 @@ has_language_privilege_id_id(PG_FUNCTION_ARGS)
 	text	   *priv_type_text = PG_GETARG_TEXT_PP(2);
 	AclMode		mode;
 	AclResult	aclresult;
+	bool		is_missing = false;
 
 	mode = convert_language_priv_string(priv_type_text);
 
-	if (!SearchSysCacheExists1(LANGOID, ObjectIdGetDatum(languageoid)))
-		PG_RETURN_NULL();
+	aclresult = object_aclcheck_ext(LanguageRelationId, languageoid,
+									roleid, mode,
+									&is_missing);
 
-	aclresult = object_aclcheck(LanguageRelationId, languageoid, roleid, mode);
+	if (is_missing)
+		PG_RETURN_NULL();
 
 	PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
 }
@@ -3789,14 +3825,17 @@ has_schema_privilege_name_id(PG_FUNCTION_ARGS)
 	Oid			roleid;
 	AclMode		mode;
 	AclResult	aclresult;
+	bool		is_missing = false;
 
 	roleid = get_role_oid_or_public(NameStr(*username));
 	mode = convert_schema_priv_string(priv_type_text);
 
-	if (!SearchSysCacheExists1(NAMESPACEOID, ObjectIdGetDatum(schemaoid)))
-		PG_RETURN_NULL();
+	aclresult = object_aclcheck_ext(NamespaceRelationId, schemaoid,
+									roleid, mode,
+									&is_missing);
 
-	aclresult = object_aclcheck(NamespaceRelationId, schemaoid, roleid, mode);
+	if (is_missing)
+		PG_RETURN_NULL();
 
 	PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
 }
@@ -3815,14 +3854,17 @@ has_schema_privilege_id(PG_FUNCTION_ARGS)
 	Oid			roleid;
 	AclMode		mode;
 	AclResult	aclresult;
+	bool		is_missing = false;
 
 	roleid = GetUserId();
 	mode = convert_schema_priv_string(priv_type_text);
 
-	if (!SearchSysCacheExists1(NAMESPACEOID, ObjectIdGetDatum(schemaoid)))
-		PG_RETURN_NULL();
+	aclresult = object_aclcheck_ext(NamespaceRelationId, schemaoid,
+									roleid, mode,
+									&is_missing);
 
-	aclresult = object_aclcheck(NamespaceRelationId, schemaoid, roleid, mode);
+	if (is_missing)
+		PG_RETURN_NULL();
 
 	PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
 }
@@ -3863,13 +3905,16 @@ has_schema_privilege_id_id(PG_FUNCTION_ARGS)
 	text	   *priv_type_text = PG_GETARG_TEXT_PP(2);
 	AclMode		mode;
 	AclResult	aclresult;
+	bool		is_missing = false;
 
 	mode = convert_schema_priv_string(priv_type_text);
 
-	if (!SearchSysCacheExists1(NAMESPACEOID, ObjectIdGetDatum(schemaoid)))
-		PG_RETURN_NULL();
+	aclresult = object_aclcheck_ext(NamespaceRelationId, schemaoid,
+									roleid, mode,
+									&is_missing);
 
-	aclresult = object_aclcheck(NamespaceRelationId, schemaoid, roleid, mode);
+	if (is_missing)
+		PG_RETURN_NULL();
 
 	PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
 }
@@ -3982,14 +4027,17 @@ has_server_privilege_name_id(PG_FUNCTION_ARGS)
 	Oid			roleid;
 	AclMode		mode;
 	AclResult	aclresult;
+	bool		is_missing = false;
 
 	roleid = get_role_oid_or_public(NameStr(*username));
 	mode = convert_server_priv_string(priv_type_text);
 
-	if (!SearchSysCacheExists1(FOREIGNSERVEROID, ObjectIdGetDatum(serverid)))
-		PG_RETURN_NULL();
+	aclresult = object_aclcheck_ext(ForeignServerRelationId, serverid,
+									roleid, mode,
+									&is_missing);
 
-	aclresult = object_aclcheck(ForeignServerRelationId, serverid, roleid, mode);
+	if (is_missing)
+		PG_RETURN_NULL();
 
 	PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
 }
@@ -4008,14 +4056,17 @@ has_server_privilege_id(PG_FUNCTION_ARGS)
 	Oid			roleid;
 	AclMode		mode;
 	AclResult	aclresult;
+	bool		is_missing = false;
 
 	roleid = GetUserId();
 	mode = convert_server_priv_string(priv_type_text);
 
-	if (!SearchSysCacheExists1(FOREIGNSERVEROID, ObjectIdGetDatum(serverid)))
-		PG_RETURN_NULL();
+	aclresult = object_aclcheck_ext(ForeignServerRelationId, serverid,
+									roleid, mode,
+									&is_missing);
 
-	aclresult = object_aclcheck(ForeignServerRelationId, serverid, roleid, mode);
+	if (is_missing)
+		PG_RETURN_NULL();
 
 	PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
 }
@@ -4056,13 +4107,16 @@ has_server_privilege_id_id(PG_FUNCTION_ARGS)
 	text	   *priv_type_text = PG_GETARG_TEXT_PP(2);
 	AclMode		mode;
 	AclResult	aclresult;
+	bool		is_missing = false;
 
 	mode = convert_server_priv_string(priv_type_text);
 
-	if (!SearchSysCacheExists1(FOREIGNSERVEROID, ObjectIdGetDatum(serverid)))
-		PG_RETURN_NULL();
+	aclresult = object_aclcheck_ext(ForeignServerRelationId, serverid,
+									roleid, mode,
+									&is_missing);
 
-	aclresult = object_aclcheck(ForeignServerRelationId, serverid, roleid, mode);
+	if (is_missing)
+		PG_RETURN_NULL();
 
 	PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
 }
@@ -4173,14 +4227,17 @@ has_tablespace_privilege_name_id(PG_FUNCTION_ARGS)
 	Oid			roleid;
 	AclMode		mode;
 	AclResult	aclresult;
+	bool		is_missing = false;
 
 	roleid = get_role_oid_or_public(NameStr(*username));
 	mode = convert_tablespace_priv_string(priv_type_text);
 
-	if (!SearchSysCacheExists1(TABLESPACEOID, ObjectIdGetDatum(tablespaceoid)))
-		PG_RETURN_NULL();
+	aclresult = object_aclcheck_ext(TableSpaceRelationId, tablespaceoid,
+									roleid, mode,
+									&is_missing);
 
-	aclresult = object_aclcheck(TableSpaceRelationId, tablespaceoid, roleid, mode);
+	if (is_missing)
+		PG_RETURN_NULL();
 
 	PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
 }
@@ -4199,14 +4256,17 @@ has_tablespace_privilege_id(PG_FUNCTION_ARGS)
 	Oid			roleid;
 	AclMode		mode;
 	AclResult	aclresult;
+	bool		is_missing = false;
 
 	roleid = GetUserId();
 	mode = convert_tablespace_priv_string(priv_type_text);
 
-	if (!SearchSysCacheExists1(TABLESPACEOID, ObjectIdGetDatum(tablespaceoid)))
-		PG_RETURN_NULL();
+	aclresult = object_aclcheck_ext(TableSpaceRelationId, tablespaceoid,
+									roleid, mode,
+									&is_missing);
 
-	aclresult = object_aclcheck(TableSpaceRelationId, tablespaceoid, roleid, mode);
+	if (is_missing)
+		PG_RETURN_NULL();
 
 	PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
 }
@@ -4247,13 +4307,16 @@ has_tablespace_privilege_id_id(PG_FUNCTION_ARGS)
 	text	   *priv_type_text = PG_GETARG_TEXT_PP(2);
 	AclMode		mode;
 	AclResult	aclresult;
+	bool		is_missing = false;
 
 	mode = convert_tablespace_priv_string(priv_type_text);
 
-	if (!SearchSysCacheExists1(TABLESPACEOID, ObjectIdGetDatum(tablespaceoid)))
-		PG_RETURN_NULL();
+	aclresult = object_aclcheck_ext(TableSpaceRelationId, tablespaceoid,
+									roleid, mode,
+									&is_missing);
 
-	aclresult = object_aclcheck(TableSpaceRelationId, tablespaceoid, roleid, mode);
+	if (is_missing)
+		PG_RETURN_NULL();
 
 	PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
 }
@@ -4363,14 +4426,17 @@ has_type_privilege_name_id(PG_FUNCTION_ARGS)
 	Oid			roleid;
 	AclMode		mode;
 	AclResult	aclresult;
+	bool		is_missing = false;
 
 	roleid = get_role_oid_or_public(NameStr(*username));
 	mode = convert_type_priv_string(priv_type_text);
 
-	if (!SearchSysCacheExists1(TYPEOID, ObjectIdGetDatum(typeoid)))
-		PG_RETURN_NULL();
+	aclresult = object_aclcheck_ext(TypeRelationId, typeoid,
+									roleid, mode,
+									&is_missing);
 
-	aclresult = object_aclcheck(TypeRelationId, typeoid, roleid, mode);
+	if (is_missing)
+		PG_RETURN_NULL();
 
 	PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
 }
@@ -4389,14 +4455,17 @@ has_type_privilege_id(PG_FUNCTION_ARGS)
 	Oid			roleid;
 	AclMode		mode;
 	AclResult	aclresult;
+	bool		is_missing = false;
 
 	roleid = GetUserId();
 	mode = convert_type_priv_string(priv_type_text);
 
-	if (!SearchSysCacheExists1(TYPEOID, ObjectIdGetDatum(typeoid)))
-		PG_RETURN_NULL();
+	aclresult = object_aclcheck_ext(TypeRelationId, typeoid,
+									roleid, mode,
+									&is_missing);
 
-	aclresult = object_aclcheck(TypeRelationId, typeoid, roleid, mode);
+	if (is_missing)
+		PG_RETURN_NULL();
 
 	PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
 }
@@ -4437,13 +4506,16 @@ has_type_privilege_id_id(PG_FUNCTION_ARGS)
 	text	   *priv_type_text = PG_GETARG_TEXT_PP(2);
 	AclMode		mode;
 	AclResult	aclresult;
+	bool		is_missing = false;
 
 	mode = convert_type_priv_string(priv_type_text);
 
-	if (!SearchSysCacheExists1(TYPEOID, ObjectIdGetDatum(typeoid)))
-		PG_RETURN_NULL();
+	aclresult = object_aclcheck_ext(TypeRelationId, typeoid,
+									roleid, mode,
+									&is_missing);
 
-	aclresult = object_aclcheck(TypeRelationId, typeoid, roleid, mode);
+	if (is_missing)
+		PG_RETURN_NULL();
 
 	PG_RETURN_BOOL(aclresult == ACLCHECK_OK);
 }
diff --git a/src/include/utils/acl.h b/src/include/utils/acl.h
index 331a87d0e6..02bc4d08d6 100644
--- a/src/include/utils/acl.h
+++ b/src/include/utils/acl.h
@@ -239,8 +239,12 @@ extern void RemoveRoleFromObjectACL(Oid roleid, Oid classid, Oid objid);
 extern AclMode pg_class_aclmask(Oid table_oid, Oid roleid,
 								AclMode mask, AclMaskHow how);
 
-/* generic function */
-extern AclResult object_aclcheck(Oid classid, Oid objectid, Oid roleid, AclMode mode);
+/* generic functions */
+extern AclResult object_aclcheck(Oid classid, Oid objectid,
+								 Oid roleid, AclMode mode);
+extern AclResult object_aclcheck_ext(Oid classid, Oid objectid,
+									 Oid roleid, AclMode mode,
+									 bool *is_missing);
 
 /* special cases */
 extern AclResult pg_attribute_aclcheck(Oid table_oid, AttrNumber attnum,
