mirror of
https://github.com/postgres/postgres.git
synced 2025-08-22 21:53:06 +03:00
Add support for user-defined I/O conversion casts.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
;
|
||||
|
@@ -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);
|
||||
|
Reference in New Issue
Block a user