]> granicus.if.org Git - postgresql/commitdiff
Function-call-style type coercions should be treated as explicit
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 24 Oct 2002 22:09:00 +0000 (22:09 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 24 Oct 2002 22:09:00 +0000 (22:09 +0000)
coercions, not implicit ones.  For example, 'select abstime(1035497293)'
should succeed because there is an explicit binary coercion from int4
to abstime.

src/backend/parser/parse_coerce.c
src/backend/parser/parse_func.c
src/include/parser/parse_coerce.h

index c0081133eb3a5116650ffa0421e4ffcabec263d1..4870b24de07fe892e91f8a1a8d0bcba021fed836 100644 (file)
@@ -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)
index 6c194f06c5b410d76ca8ab3d38a222487920bbf0..9bd0e2f814b151975ab671bcec958d4c7e95b626 100644 (file)
@@ -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;
index 61a63cafeb49f414757d8c20bede7bb6694a1086..ecc61ea716af99c0e621a9421fd7c671ec887dea 100644 (file)
@@ -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 */