summaryrefslogtreecommitdiff
path: root/src/backend/parser/parse_coerce.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/parser/parse_coerce.c')
-rw-r--r--src/backend/parser/parse_coerce.c61
1 files changed, 42 insertions, 19 deletions
diff --git a/src/backend/parser/parse_coerce.c b/src/backend/parser/parse_coerce.c
index b472505588..1016c782d2 100644
--- a/src/backend/parser/parse_coerce.c
+++ b/src/backend/parser/parse_coerce.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/parser/parse_coerce.c,v 2.79 2002/07/20 05:29:01 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/parser/parse_coerce.c,v 2.80 2002/08/22 00:01:42 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -47,7 +47,6 @@ coerce_type(ParseState *pstate, Node *node, Oid inputTypeId,
Node *result;
if (targetTypeId == inputTypeId ||
- targetTypeId == InvalidOid ||
node == NULL)
{
/* no conversion needed, but constraints may need to be applied */
@@ -97,6 +96,12 @@ coerce_type(ParseState *pstate, Node *node, Oid inputTypeId,
if (targetTypeId != baseTypeId)
result = (Node *) TypeConstraints(result, targetTypeId);
}
+ else if (targetTypeId == ANYOID ||
+ targetTypeId == ANYARRAYOID)
+ {
+ /* assume can_coerce_type verified that implicit coercion is okay */
+ result = node;
+ }
else if (IsBinaryCompatible(inputTypeId, targetTypeId))
{
/*
@@ -213,18 +218,10 @@ can_coerce_type(int nargs, Oid *input_typeids, Oid *func_typeids,
if (inputTypeId == targetTypeId)
continue;
- /*
- * one of the known-good transparent conversions? then drop
- * through...
- */
- if (IsBinaryCompatible(inputTypeId, targetTypeId))
- continue;
-
- /* don't know what to do for the output type? then quit... */
- if (targetTypeId == InvalidOid)
+ /* don't choke on references to no-longer-existing types */
+ if (!typeidIsValid(inputTypeId))
return false;
- /* don't know what to do for the input type? then quit... */
- if (inputTypeId == InvalidOid)
+ if (!typeidIsValid(targetTypeId))
return false;
/*
@@ -238,18 +235,44 @@ can_coerce_type(int nargs, Oid *input_typeids, Oid *func_typeids,
continue;
}
+ /* accept if target is ANY */
+ if (targetTypeId == ANYOID)
+ continue;
+
+ /* if target is ANYARRAY and source is a varlena array type, accept */
+ if (targetTypeId == ANYARRAYOID)
+ {
+ Oid typOutput;
+ Oid typElem;
+ bool typIsVarlena;
+
+ if (getTypeOutputInfo(inputTypeId, &typOutput, &typElem,
+ &typIsVarlena))
+ {
+ if (OidIsValid(typElem) && typIsVarlena)
+ continue;
+ }
+ /*
+ * Otherwise reject; this assumes there are no explicit coercions
+ * to ANYARRAY. If we don't reject then parse_coerce would have
+ * to repeat the above test.
+ */
+ return false;
+ }
+
+ /*
+ * one of the known-good transparent conversions? then drop
+ * through...
+ */
+ if (IsBinaryCompatible(inputTypeId, targetTypeId))
+ continue;
+
/*
* If input is a class type that inherits from target, no problem
*/
if (typeInheritsFrom(inputTypeId, targetTypeId))
continue;
- /* don't choke on references to no-longer-existing types */
- if (!typeidIsValid(inputTypeId))
- return false;
- if (!typeidIsValid(targetTypeId))
- return false;
-
/*
* Else, try for run-time conversion using functions: look for a
* single-argument function named with the target type name and