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));
 }

Reply via email to