aboutsummaryrefslogtreecommitdiff
path: root/src/backend/parser
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/parser')
-rw-r--r--src/backend/parser/gram.y15
-rw-r--r--src/backend/parser/parse_coerce.c24
2 files changed, 32 insertions, 7 deletions
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 8b44e5b6ba4..b78d5b302e3 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -11,7 +11,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.632 2008/10/29 11:24:53 petere Exp $
+ * $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.633 2008/10/31 08:39:20 heikki Exp $
*
* HISTORY
* AUTHOR DATE MAJOR EVENT
@@ -4590,6 +4590,7 @@ CreateCastStmt: CREATE CAST '(' Typename AS Typename ')'
n->targettype = $6;
n->func = $10;
n->context = (CoercionContext) $11;
+ n->inout = false;
$$ = (Node *)n;
}
| CREATE CAST '(' Typename AS Typename ')'
@@ -4600,6 +4601,18 @@ CreateCastStmt: CREATE CAST '(' Typename AS Typename ')'
n->targettype = $6;
n->func = NULL;
n->context = (CoercionContext) $10;
+ n->inout = false;
+ $$ = (Node *)n;
+ }
+ | CREATE CAST '(' Typename AS Typename ')'
+ WITH INOUT cast_context
+ {
+ CreateCastStmt *n = makeNode(CreateCastStmt);
+ n->sourcetype = $4;
+ n->targettype = $6;
+ n->func = NULL;
+ n->context = (CoercionContext) $10;
+ n->inout = true;
$$ = (Node *)n;
}
;
diff --git a/src/backend/parser/parse_coerce.c b/src/backend/parser/parse_coerce.c
index 6d703ae5718..112a07beb58 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.170 2008/10/25 17:19:09 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/parser/parse_coerce.c,v 2.171 2008/10/31 08:39:21 heikki Exp $
*
*-------------------------------------------------------------------------
*/
@@ -1909,11 +1909,23 @@ find_coercion_pathway(Oid targetTypeId, Oid sourceTypeId,
/* Rely on ordering of enum for correct behavior here */
if (ccontext >= castcontext)
{
- *funcid = castForm->castfunc;
- if (OidIsValid(*funcid))
- result = COERCION_PATH_FUNC;
- else
- result = COERCION_PATH_RELABELTYPE;
+ switch (castForm->castmethod)
+ {
+ case COERCION_METHOD_FUNCTION:
+ result = COERCION_PATH_FUNC;
+ *funcid = castForm->castfunc;
+ break;
+ case COERCION_METHOD_INOUT:
+ result = COERCION_PATH_COERCEVIAIO;
+ break;
+ case COERCION_METHOD_BINARY:
+ result = COERCION_PATH_RELABELTYPE;
+ break;
+ default:
+ elog(ERROR, "unrecognized castmethod: %d",
+ (int) castForm->castmethod);
+ break;
+ }
}
ReleaseSysCache(tuple);