From f758097c6de1bc0f288302985377fed49e707958 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Wed, 17 Dec 2003 19:49:39 +0000 Subject: [PATCH] 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. --- src/backend/parser/parse_coerce.c | 40 +++++++++++++++---------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/src/backend/parser/parse_coerce.c b/src/backend/parser/parse_coerce.c index e5b0df311d..7ed028512d 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; @@ -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.