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))
PG_RETURN_NULL();
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 (PG_ARGISNULL(1))
+ typemod = -1;
+ else
+ {
+ typemod = PG_GETARG_INT32(1);
+ flags |= FORMAT_TYPE_TYPEMOD_GIVEN;
+ }
+
+ result = format_type_extended(type_oid, typemod, flags);
PG_RETURN_TEXT_P(cstring_to_text(result));
}
* format_type_extended
* Generate a possibly-qualified type name.
*
- * The default is to only qualify if the type is not in the search path, to
- * ignore the given typmod, and to raise an error if a non-existent type_oid is
- * given.
+ * The default behavior is to only qualify if the type is not in the search
+ * path, to ignore the given typmod, and to raise an error if a non-existent
+ * type_oid is given.
*
* The following bits in 'flags' modify the behavior:
* - FORMAT_TYPE_TYPEMOD_GIVEN
- * consider the given typmod in the output (may be -1 to request
- * the default behavior)
- *
+ * include the typmod in the output (typmod could still be -1 though)
* - FORMAT_TYPE_ALLOW_INVALID
* if the type OID is invalid or unknown, return ??? or such instead
* of failing
- *
* - 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.
*/
char *
format_type_extended(Oid type_oid, int32 typemod, bits16 flags)
(-44,5.5,12)
(2 rows)
+-- and test format_type() a bit more, too
+select format_type('varchar'::regtype, 42);
+ format_type
+-----------------------
+ character varying(38)
+(1 row)
+
+select format_type('bpchar'::regtype, null);
+ format_type
+-------------
+ character
+(1 row)
+
+-- this behavior difference is intentional
+select format_type('bpchar'::regtype, -1);
+ format_type
+-------------
+ bpchar
+(1 row)
+
-- might as well exercise the widget type while we're here
INSERT INTO mytab VALUES ('(1,2,3)'), ('(-44,5.5,12)');
TABLE mytab;
+
+-- and test format_type() a bit more, too
+select format_type('varchar'::regtype, 42);
+select format_type('bpchar'::regtype, null);
+-- this behavior difference is intentional
+select format_type('bpchar'::regtype, -1);