diff --git a/src/backend/utils/adt/format_type.c b/src/backend/utils/adt/format_type.c index df0bdeb610..f2816e4f37 100644 --- a/src/backend/utils/adt/format_type.c +++ b/src/backend/utils/adt/format_type.c @@ -96,13 +96,16 @@ 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_INVALID_AS_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 * * Note that TYPEMOD_GIVEN is not interchangeable with "typemod == -1"; * see the comments above for format_type(). * - * Returns a palloc'd string. + * Returns a palloc'd string, or NULL. */ char * format_type_extended(Oid type_oid, int32 typemod, bits16 flags) @@ -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_INVALID_AS_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_INVALID_AS_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); @@ -144,7 +154,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_INVALID_AS_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 f8595642da..3ca5e938f8 100644 --- a/src/include/utils/builtins.h +++ b/src/include/utils/builtins.h @@ -113,6 +113,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_INVALID_AS_NULL 0x08 /* NULL if undefined */ extern char *format_type_extended(Oid type_oid, int32 typemod, bits16 flags); extern char *format_type_be(Oid type_oid);