diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2003-12-17 19:49:39 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2003-12-17 19:49:39 +0000 |
commit | f758097c6de1bc0f288302985377fed49e707958 (patch) | |
tree | 2e040099899507bc35830ac16f587aa3a338a791 /src/backend/parser | |
parent | b40b3306faa36e469d52a5fa86e8cbcbd6fdbff2 (diff) | |
download | postgresql-f758097c6de1bc0f288302985377fed49e707958.tar.gz postgresql-f758097c6de1bc0f288302985377fed49e707958.zip |
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.
Diffstat (limited to 'src/backend/parser')
-rw-r--r-- | src/backend/parser/parse_coerce.c | 40 |
1 files changed, 20 insertions, 20 deletions
diff --git a/src/backend/parser/parse_coerce.c b/src/backend/parser/parse_coerce.c index e5b0df311d1..7ed028512da 100644 --- a/src/backend/parser/parse_coerce.c +++ b/src/backend/parser/parse_coerce.c @@ -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; @@ -396,6 +385,17 @@ can_coerce_type(int nargs, Oid *input_typeids, Oid *target_typeids, } /* + * 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. */ |