Remove restriction that cast functions cannot be volatile. This
authorTom Lane
Sat, 1 Feb 2003 22:09:26 +0000 (22:09 +0000)
committerTom Lane
Sat, 1 Feb 2003 22:09:26 +0000 (22:09 +0000)
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.

doc/src/sgml/ref/create_cast.sgml
src/backend/commands/functioncmds.c

index 74c45328289b8bd1ea0891cf85457ce1d9720f36..bc3894ab1c40b59c35518a95c4be0b66aeae80a7 100644 (file)
@@ -1,4 +1,4 @@
-
+
 
 
  
@@ -143,7 +143,7 @@ SELECT 'The time is ' || CAST(now() AS text);
        be schema-qualified.  If it is not, the function will be looked
        up in the path.  The argument type must be identical to the
        source type, the result data type must match the target type of
-       the cast.  Cast functions must be marked immutable or stable.
+       the cast.
       
      
     
index 2e660d7f61a58f6f064d915e8497b9f5da146e7d..a0943993c1630c464c458b3981241239b90c091e 100644 (file)
@@ -9,7 +9,7 @@
  *
  *
  * 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
  *   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");
        if (procstruct->prorettype != targettypeid)
            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)
            elog(ERROR, "cast function must not be volatile");
+#endif
        if (procstruct->proisagg)
            elog(ERROR, "cast function must not be an aggregate function");
        if (procstruct->proretset)