Remove restriction that cast functions cannot be volatile. This

restriction was debatable to begin with, but it has now become obvious
that it breaks forward-porting of user-defined types; contrib/lo being
the most salient example.
This commit is contained in:
Tom Lane 2003-02-01 22:09:26 +00:00
parent e0a1ee2053
commit 6ba8af9d5d
2 changed files with 10 additions and 3 deletions

View File

@ -1,4 +1,4 @@
<!-- $Header: /cvsroot/pgsql/doc/src/sgml/ref/create_cast.sgml,v 1.8 2003/01/19 00:13:29 momjian Exp $ --> <!-- $Header: /cvsroot/pgsql/doc/src/sgml/ref/create_cast.sgml,v 1.9 2003/02/01 22:09:25 tgl Exp $ -->
<refentry id="SQL-CREATECAST"> <refentry id="SQL-CREATECAST">
<refmeta> <refmeta>
@ -143,7 +143,7 @@ SELECT 'The time is ' || CAST(now() AS text);
be schema-qualified. If it is not, the function will be looked be schema-qualified. If it is not, the function will be looked
up in the path. The argument type must be identical to the up in the path. The argument type must be identical to the
source type, the result data type must match the target type of source type, the result data type must match the target type of
the cast. Cast functions must be marked immutable or stable. the cast.
</para> </para>
</listitem> </listitem>
</varlistentry> </varlistentry>

View File

@ -9,7 +9,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/commands/functioncmds.c,v 1.24 2002/11/01 19:19:58 tgl Exp $ * $Header: /cvsroot/pgsql/src/backend/commands/functioncmds.c,v 1.25 2003/02/01 22:09:26 tgl Exp $
* *
* DESCRIPTION * DESCRIPTION
* These routines take the parse tree and pick out the * These routines take the parse tree and pick out the
@ -745,8 +745,15 @@ CreateCast(CreateCastStmt *stmt)
elog(ERROR, "argument of cast function must match source data type"); elog(ERROR, "argument of cast function must match source data type");
if (procstruct->prorettype != targettypeid) if (procstruct->prorettype != targettypeid)
elog(ERROR, "return data type of cast function must match target data type"); elog(ERROR, "return data type of cast function must match target data type");
/*
* Restricting the volatility of a cast function may or may not be
* a good idea in the abstract, but it definitely breaks many old
* user-defined types. Disable this check --- tgl 2/1/03
*/
#ifdef NOT_USED
if (procstruct->provolatile == PROVOLATILE_VOLATILE) if (procstruct->provolatile == PROVOLATILE_VOLATILE)
elog(ERROR, "cast function must not be volatile"); elog(ERROR, "cast function must not be volatile");
#endif
if (procstruct->proisagg) if (procstruct->proisagg)
elog(ERROR, "cast function must not be an aggregate function"); elog(ERROR, "cast function must not be an aggregate function");
if (procstruct->proretset) if (procstruct->proretset)