Am Mittwoch, 9. Juli 2008 schrieb Peter Eisentraut:
> I propose that we relax these two checks to test for binary-coercibility
> instead, which is effectively what is expected and required here anyway.

Here is the corresponding patch.
diff -ur ../cvs-pgsql/doc/src/sgml/ref/create_cast.sgml ./doc/src/sgml/ref/create_cast.sgml
--- ../cvs-pgsql/doc/src/sgml/ref/create_cast.sgml	2007-07-10 14:57:00.000000000 +0200
+++ ./doc/src/sgml/ref/create_cast.sgml	2008-07-10 14:07:27.000000000 +0200
@@ -205,7 +205,7 @@
 
   <para>
    Cast implementation functions can have one to three arguments.
-   The first argument type must be identical to the cast's source type.
+   The first argument type must be identical to or binary-compatible with the cast's source type.
    The second argument,
    if present, must be type <type>integer</>; it receives the type
    modifier associated with the destination type, or <literal>-1</>
diff -ur ../cvs-pgsql/src/backend/commands/functioncmds.c ./src/backend/commands/functioncmds.c
--- ../cvs-pgsql/src/backend/commands/functioncmds.c	2008-07-03 16:53:04.000000000 +0200
+++ ./src/backend/commands/functioncmds.c	2008-07-10 13:42:26.000000000 +0200
@@ -48,6 +48,7 @@
 #include "commands/defrem.h"
 #include "commands/proclang.h"
 #include "miscadmin.h"
+#include "parser/parse_coerce.h"
 #include "parser/parse_func.h"
 #include "parser/parse_type.h"
 #include "utils/acl.h"
@@ -1403,10 +1404,10 @@
 			ereport(ERROR,
 					(errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
 				  errmsg("cast function must take one to three arguments")));
-		if (procstruct->proargtypes.values[0] != sourcetypeid)
+		if (!IsBinaryCoercible(sourcetypeid, procstruct->proargtypes.values[0]))
 			ereport(ERROR,
 					(errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
-			errmsg("argument of cast function must match source data type")));
+			errmsg("argument of cast function must match or be binary-compatible with source data type")));
 		if (nargs > 1 && procstruct->proargtypes.values[1] != INT4OID)
 			ereport(ERROR,
 					(errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
@@ -1415,10 +1416,10 @@
 			ereport(ERROR,
 					(errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
 			errmsg("third argument of cast function must be type boolean")));
-		if (procstruct->prorettype != targettypeid)
+		if (!IsBinaryCoercible(procstruct->prorettype, targettypeid))
 			ereport(ERROR,
 					(errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
-					 errmsg("return data type of cast function must match target data type")));
+					 errmsg("return data type of cast function must match or be binary-compatible with target data type")));
 
 		/*
 		 * Restricting the volatility of a cast function may or may not be a
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to