diff --git a/src/backend/parser/parse_coerce.c b/src/backend/parser/parse_coerce.c
index c0081133eb3a5116650ffa0421e4ffcabec263d1..4870b24de07fe892e91f8a1a8d0bcba021fed836 100644
--- a/src/backend/parser/parse_coerce.c
+++ b/src/backend/parser/parse_coerce.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/parser/parse_coerce.c,v 2.84 2002/09/18 21:35:22 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/parser/parse_coerce.c,v 2.85 2002/10/24 22:09:00 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -32,9 +32,6 @@ static Node *coerce_type_typmod(Node *node,
 								Oid targetTypeId, int32 targetTypMod,
 								CoercionForm cformat);
 static Oid	PreferredType(CATEGORY category, Oid type);
-static bool find_coercion_pathway(Oid targetTypeId, Oid sourceTypeId,
-								  CoercionContext ccontext,
-								  Oid *funcid);
 static Node *build_func_call(Oid funcid, Oid rettype, List *args,
 							 CoercionForm fformat);
 
@@ -910,7 +907,7 @@ IsBinaryCoercible(Oid srctype, Oid targettype)
  * to the castfunc value (which may be InvalidOid for a binary-compatible
  * coercion).
  */
-static bool
+bool
 find_coercion_pathway(Oid targetTypeId, Oid sourceTypeId,
 					  CoercionContext ccontext,
 					  Oid *funcid)
diff --git a/src/backend/parser/parse_func.c b/src/backend/parser/parse_func.c
index 6c194f06c5b410d76ca8ab3d38a222487920bbf0..9bd0e2f814b151975ab671bcec958d4c7e95b626 100644
--- a/src/backend/parser/parse_func.c
+++ b/src/backend/parser/parse_func.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/parser/parse_func.c,v 1.138 2002/10/19 21:23:20 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/parser/parse_func.c,v 1.139 2002/10/24 22:09:00 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -770,6 +770,11 @@ func_get_detail(List *funcname,
 		 * and ones that are coercing a previously-unknown-type literal
 		 * constant to a specific type.
 		 *
+		 * The reason we can restrict our check to binary-compatible
+		 * coercions here is that we expect non-binary-compatible coercions
+		 * to have an implementation function named after the target type.
+		 * That function will be found by normal lookup if appropriate.
+		 *
 		 * NB: it's important that this code stays in sync with what
 		 * coerce_type can do, because the caller will try to apply
 		 * coerce_type if we return FUNCDETAIL_COERCION.  If we return
@@ -791,7 +796,9 @@ func_get_detail(List *funcname,
 				Node	   *arg1 = lfirst(fargs);
 
 				if ((sourceType == UNKNOWNOID && IsA(arg1, Const)) ||
-					IsBinaryCoercible(sourceType, targetType))
+					(find_coercion_pathway(targetType, sourceType,
+										   COERCION_EXPLICIT, funcid) &&
+					 *funcid == InvalidOid))
 				{
 					/* Yup, it's a type coercion */
 					*funcid = InvalidOid;
diff --git a/src/include/parser/parse_coerce.h b/src/include/parser/parse_coerce.h
index 61a63cafeb49f414757d8c20bede7bb6694a1086..ecc61ea716af99c0e621a9421fd7c671ec887dea 100644
--- a/src/include/parser/parse_coerce.h
+++ b/src/include/parser/parse_coerce.h
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: parse_coerce.h,v 1.47 2002/09/18 21:35:24 tgl Exp $
+ * $Id: parse_coerce.h,v 1.48 2002/10/24 22:09:00 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -54,6 +54,9 @@ extern Oid	select_common_type(List *typeids, const char *context);
 extern Node *coerce_to_common_type(Node *node, Oid targetTypeId,
 					  const char *context);
 
+extern bool find_coercion_pathway(Oid targetTypeId, Oid sourceTypeId,
+								  CoercionContext ccontext,
+								  Oid *funcid);
 extern Oid	find_typmod_coercion_function(Oid typeId, int *nargs);
 
 #endif   /* PARSE_COERCE_H */