Reorder tests in parse_coerce so that ANY/ANYELEMENT/ANYARRAY coercion

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.
This commit is contained in:
Tom Lane 2003-12-17 19:49:39 +00:00
parent b40b3306fa
commit f758097c6d
1 changed files with 20 additions and 20 deletions

View File

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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 */ /* no conversion needed */
return node; 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)) if (inputTypeId == UNKNOWNOID && IsA(node, Const))
{ {
/* /*
@ -260,14 +268,6 @@ coerce_type(ParseState *pstate, Node *node,
param->paramtype = targetTypeId; param->paramtype = targetTypeId;
return (Node *) param; 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, if (find_coercion_pathway(targetTypeId, inputTypeId, ccontext,
&funcId)) &funcId))
{ {
@ -372,17 +372,6 @@ can_coerce_type(int nargs, Oid *input_typeids, Oid *target_typeids,
if (!typeidIsValid(targetTypeId)) if (!typeidIsValid(targetTypeId))
return false; 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 */ /* accept if target is ANY */
if (targetTypeId == ANYOID) if (targetTypeId == ANYOID)
continue; continue;
@ -395,6 +384,17 @@ can_coerce_type(int nargs, Oid *input_typeids, Oid *target_typeids,
continue; 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 * If pg_cast shows that we can coerce, accept. This test now
* covers both binary-compatible and coercion-function cases. * covers both binary-compatible and coercion-function cases.