Commit a26116c6cbf4117e8efaa7cfc5bacc887f01517f changed the behaviour for format_type.
Prior to commit, format_type() used to set typemod_given to false for typemode = NULL. format_type() .. if (PG_ARGISNULL(1)) result = format_type_internal(type_oid, -1, false, true, false); else { typemod = PG_GETARG_INT32(1); result = format_type_internal(type_oid, typemod, true, true, false); } .. With the commit format_type() always set the FORMAT_TYPE_TYPEMOD_GIVEN flag even when typemode is NULL (-1). Below are the difference it's making to the query output: Before commit: postgres@95320=#select format_type('bpchar'::regtype, null); format_type ------------- character (1 row) postgres@95320=#select format_type('bit'::regtype, null); format_type ------------- bit (1 row) After commit: postgres@90169=#select format_type('bpchar'::regtype, null); format_type ------------- bpchar (1 row) postgres@90169=#select format_type('bit'::regtype, null); format_type ------------- "bit" (1 row) Is this expected behaviour? attaching patch to get back the older behaviour. Thanks, Regards, Rushabh Lathia www.EnterpriseDB.com
diff --git a/src/backend/utils/adt/format_type.c b/src/backend/utils/adt/format_type.c index 872574f..86ef127 100644 --- a/src/backend/utils/adt/format_type.c +++ b/src/backend/utils/adt/format_type.c @@ -63,6 +63,7 @@ format_type(PG_FUNCTION_ARGS) Oid type_oid; int32 typemod; char *result; + bits16 flags = FORMAT_TYPE_ALLOW_INVALID; /* Since this function is not strict, we must test for null args */ if (PG_ARGISNULL(0)) @@ -71,9 +72,10 @@ format_type(PG_FUNCTION_ARGS) type_oid = PG_GETARG_OID(0); typemod = PG_ARGISNULL(1) ? -1 : PG_GETARG_INT32(1); - result = format_type_extended(type_oid, typemod, - FORMAT_TYPE_TYPEMOD_GIVEN | - FORMAT_TYPE_ALLOW_INVALID); + if (typemod != -1) + flags |= FORMAT_TYPE_TYPEMOD_GIVEN; + + result = format_type_extended(type_oid, typemod, flags); PG_RETURN_TEXT_P(cstring_to_text(result)); }