I said:
> [EMAIL PROTECTED] (Edwin S. Ramirez) writes:
> [ "select count('x') from some_table" fails ]

> The most direct fix is probably to make any_in() return some random
> value (may as well be ((Datum) 0)) instead of producing an error.

After further investigation I have decided that this is really just an
issue of incorrect ordering of tests in parse_coerce.c.  The attached
proposed patch arranges for the ANY/ANYELEMENT/ANYARRAY short-circuit
path to be taken before we check for UNKNOWN-type literals and Params.
The net effect is that coercion to ANY/ANYELEMENT/ANYARRAY will have
*no effect* on an UNKNOWN literal.  This seems reasonable, since in
these contexts we don't really know any more than we did before about
the type of the literal; it's really still UNKNOWN.

One side effect besides fixing Edwin's gripe is that where before,

regression=# select 'x'::unknown::anyelement;
ERROR:  cannot accept a value of type anyelement

now you get a result:

regression=# select 'x'::unknown::anyelement;
 anyelement
------------
 x
(1 row)

I think this is reasonable, since coercion of other objects besides
unknown literals to anyelement is a no-op:

regression=# select 'x'::text::anyelement;
 anyelement
------------
 x
(1 row)

regression=# select 2::anyelement;
 anyelement
------------
          2
(1 row)

Comments?  Any objections to the patch?

                        regards, tom lane


*** src/backend/parser/parse_coerce.c~  Mon Dec  8 15:37:30 2003
--- src/backend/parser/parse_coerce.c   Sat Dec 13 13:21:41 2003
***************
*** 153,158 ****
--- 153,166 ----
                /* 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,273 ****
                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))
        {
--- 268,273 ----
***************
*** 372,388 ****
                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;
--- 372,377 ----
***************
*** 396,401 ****
--- 385,401 ----
                }
  
                /*
+                * 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.
                 */

---------------------------(end of broadcast)---------------------------
TIP 3: if posting/reading through Usenet, please send an appropriate
      subscribe-nomail command to [EMAIL PROTECTED] so that your
      message can get through to the mailing list cleanly

Reply via email to