From 76ef961e02e0276af5516bdce6e0e543526db5b2 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Tue, 2 Jul 2019 16:07:06 +0900 Subject: [PATCH v16 1/3] Add flag to format_type_extended to enforce NULL-ness If a type scanned is undefined, type format routines have two behaviors depending on if FORMAT_TYPE_ALLOW_INVALID is defined by the caller: - Generate an error - Return undefined type name "???" or "-". The current interface is unhelpful for callers willing to format properly a type name, but still make sure that the type is defined as there could be types matching the undefined strings. In order to counter that, add a new flag called FORMAT_TYPE_FORCE_NULL which returns a NULL result instead of "??? or "-" which does not generate an error. They will be used for future patches to improve the SQL interface for object addresses. --- src/backend/utils/adt/format_type.c | 20 ++++++++++++++++---- src/include/utils/builtins.h | 1 + 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/backend/utils/adt/format_type.c b/src/backend/utils/adt/format_type.c index 6ae2a31345..8ee0e10c29 100644 --- a/src/backend/utils/adt/format_type.c +++ b/src/backend/utils/adt/format_type.c @@ -96,6 +96,9 @@ format_type(PG_FUNCTION_ARGS) * - FORMAT_TYPE_ALLOW_INVALID * if the type OID is invalid or unknown, return ??? or such instead * of failing + * - FORMAT_TYPE_FORCE_NULL + * if the type OID is invalid or unknown, return NULL instead of ??? + * or such * - FORMAT_TYPE_FORCE_QUALIFY * always schema-qualify type names, regardless of search_path * @@ -114,13 +117,20 @@ format_type_extended(Oid type_oid, int32 typemod, bits16 flags) char *buf; bool with_typemod; - if (type_oid == InvalidOid && (flags & FORMAT_TYPE_ALLOW_INVALID) != 0) - return pstrdup("-"); + if (type_oid == InvalidOid) + { + if ((flags & FORMAT_TYPE_FORCE_NULL) != 0) + return NULL; + else if ((flags & FORMAT_TYPE_ALLOW_INVALID) != 0) + return pstrdup("-"); + } tuple = SearchSysCache1(TYPEOID, ObjectIdGetDatum(type_oid)); if (!HeapTupleIsValid(tuple)) { - if ((flags & FORMAT_TYPE_ALLOW_INVALID) != 0) + if ((flags & FORMAT_TYPE_FORCE_NULL) != 0) + return NULL; + else if ((flags & FORMAT_TYPE_ALLOW_INVALID) != 0) return pstrdup("???"); else elog(ERROR, "cache lookup failed for type %u", type_oid); @@ -143,7 +153,9 @@ format_type_extended(Oid type_oid, int32 typemod, bits16 flags) tuple = SearchSysCache1(TYPEOID, ObjectIdGetDatum(array_base_type)); if (!HeapTupleIsValid(tuple)) { - if ((flags & FORMAT_TYPE_ALLOW_INVALID) != 0) + if ((flags & FORMAT_TYPE_FORCE_NULL) != 0) + return NULL; + else if ((flags & FORMAT_TYPE_ALLOW_INVALID) != 0) return pstrdup("???[]"); else elog(ERROR, "cache lookup failed for type %u", type_oid); diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h index a3cd7d26fa..a1e418cee7 100644 --- a/src/include/utils/builtins.h +++ b/src/include/utils/builtins.h @@ -109,6 +109,7 @@ extern Datum numeric_float8_no_overflow(PG_FUNCTION_ARGS); #define FORMAT_TYPE_TYPEMOD_GIVEN 0x01 /* typemod defined by caller */ #define FORMAT_TYPE_ALLOW_INVALID 0x02 /* allow invalid types */ #define FORMAT_TYPE_FORCE_QUALIFY 0x04 /* force qualification of type */ +#define FORMAT_TYPE_FORCE_NULL 0x08 /* force NULL if undefined */ extern char *format_type_extended(Oid type_oid, int32 typemod, bits16 flags); extern char *format_type_be(Oid type_oid); -- 2.20.1