Am Montag, 2. April 2007 18:41 schrieb Tom Lane:
> >> The scheme that was in the back of my mind was to do this at the same
> >> time as providing a general facility for casting *every* type to and
> >> from text, by means of their I/O functions if no specialized cast is
> >> provided in pg_cast.

> http://archives.postgresql.org/pgsql-admin/2004-06/msg00390.php
> http://archives.postgresql.org/pgsql-hackers/2004-10/msg00303.php

FWIW, is the attached patch about what you had in mind?  (It probably only 
covers "normal" types at the moment.)

-- 
Peter Eisentraut
http://developer.postgresql.org/~petere/
diff -ur ../cvs-pgsql/src/backend/parser/parse_coerce.c ./src/backend/parser/parse_coerce.c
--- ../cvs-pgsql/src/backend/parser/parse_coerce.c	2007-04-02 08:52:16.000000000 +0200
+++ ./src/backend/parser/parse_coerce.c	2007-04-03 18:05:12.000000000 +0200
@@ -371,6 +371,28 @@
 		r->convertformat = cformat;
 		return (Node *) r;
 	}
+	if ((inputTypeId == TEXTOID || targetTypeId == TEXTOID) && ccontext == COERCION_EXPLICIT)
+	{
+		/* Explicit coercion through I/O functions */
+		Oid inputTypeOutput;
+		Oid targetTypeInput;
+		bool isVarlena;
+		Oid typeIOParam;
+
+		getTypeInputInfo(targetTypeId, &targetTypeInput, &typeIOParam);
+		getTypeOutputInfo(inputTypeId, &inputTypeOutput, &isVarlena);
+
+		result = build_coercion_expression(build_coercion_expression(node, inputTypeOutput, arrayCoerce,
+																	 CSTRINGOID, -1,
+																	 cformat,
+																	 (cformat != COERCE_IMPLICIT_CAST)),
+										   targetTypeInput, arrayCoerce,
+										   targetTypeId, -1,
+										   cformat,
+										   (cformat != COERCE_IMPLICIT_CAST));
+
+		return result;
+	}
 	/* If we get here, caller blew it */
 	elog(ERROR, "failed to find conversion function from %s to %s",
 		 format_type_be(inputTypeId), format_type_be(targetTypeId));
@@ -451,6 +473,10 @@
 		if (typeInheritsFrom(inputTypeId, targetTypeId))
 			continue;
 
+		/* Else only explicit coercion from/to text is possible through I/O functions */
+		if ((inputTypeId == TEXTOID || targetTypeId == TEXTOID) && ccontext == COERCION_EXPLICIT)
+			continue;
+
 		/*
 		 * Else, cannot coerce at this argument position
 		 */
---------------------------(end of broadcast)---------------------------
TIP 6: explain analyze is your friend

Reply via email to