Reorder tests in parse_coerce so that ANY/ANYELEMENT/ANYARRAY coercion
authorTom Lane
Wed, 17 Dec 2003 19:49:39 +0000 (19:49 +0000)
committerTom Lane
Wed, 17 Dec 2003 19:49:39 +0000 (19:49 +0000)
does not affect UNKNOWN-type literals or Params.  This fixes the recent
complaint about count('x') being broken, and improves consistency in
a few other respects too.

src/backend/parser/parse_coerce.c

index e5b0df311d13a8a22958f28f7cba17811b77b78e..7ed028512da176341331b0ee11ff980adddb696b 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/parser/parse_coerce.c,v 2.112 2003/11/29 19:51:52 pgsql Exp $
+ *   $PostgreSQL: pgsql/src/backend/parser/parse_coerce.c,v 2.113 2003/12/17 19:49:39 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -153,6 +153,14 @@ coerce_type(ParseState *pstate, Node *node,
        /* no conversion needed */
        return node;
    }
+   if (targetTypeId == ANYOID ||
+       targetTypeId == ANYARRAYOID ||
+       targetTypeId == ANYELEMENTOID)
+   {
+       /* assume can_coerce_type verified that implicit coercion is okay */
+       /* NB: we do NOT want a RelabelType here */
+       return node;
+   }
    if (inputTypeId == UNKNOWNOID && IsA(node, Const))
    {
        /*
@@ -260,14 +268,6 @@ coerce_type(ParseState *pstate, Node *node,
        param->paramtype = targetTypeId;
        return (Node *) param;
    }
-   if (targetTypeId == ANYOID ||
-       targetTypeId == ANYARRAYOID ||
-       targetTypeId == ANYELEMENTOID)
-   {
-       /* assume can_coerce_type verified that implicit coercion is okay */
-       /* NB: we do NOT want a RelabelType here */
-       return node;
-   }
    if (find_coercion_pathway(targetTypeId, inputTypeId, ccontext,
                              &funcId))
    {
@@ -372,17 +372,6 @@ can_coerce_type(int nargs, Oid *input_typeids, Oid *target_typeids,
        if (!typeidIsValid(targetTypeId))
            return false;
 
-       /*
-        * If input is an untyped string constant, assume we can convert
-        * it to anything except a class type.
-        */
-       if (inputTypeId == UNKNOWNOID)
-       {
-           if (ISCOMPLEX(targetTypeId))
-               return false;
-           continue;
-       }
-
        /* accept if target is ANY */
        if (targetTypeId == ANYOID)
            continue;
@@ -395,6 +384,17 @@ can_coerce_type(int nargs, Oid *input_typeids, Oid *target_typeids,
            continue;
        }
 
+       /*
+        * If input is an untyped string constant, assume we can convert
+        * it to anything except a class type.
+        */
+       if (inputTypeId == UNKNOWNOID)
+       {
+           if (ISCOMPLEX(targetTypeId))
+               return false;
+           continue;
+       }
+
        /*
         * If pg_cast shows that we can coerce, accept.  This test now
         * covers both binary-compatible and coercion-function cases.