aboutsummaryrefslogtreecommitdiff
path: root/src/backend/parser
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2003-12-17 19:49:39 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2003-12-17 19:49:39 +0000
commitf758097c6de1bc0f288302985377fed49e707958 (patch)
tree2e040099899507bc35830ac16f587aa3a338a791 /src/backend/parser
parentb40b3306faa36e469d52a5fa86e8cbcbd6fdbff2 (diff)
downloadpostgresql-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.c40
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.
*/