Remove restriction that cast functions cannot be volatile. This
authorTom Lane <[email protected]>
Sat, 1 Feb 2003 22:09:41 +0000 (22:09 +0000)
committerTom Lane <[email protected]>
Sat, 1 Feb 2003 22:09:41 +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 02657bc33687ea81494ca79bba2e70d14c1e3834..4c0b83517b200c1ebe25c01c8d1f1f5b64aee200 100644 (file)
@@ -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.
       </para>
      </listitem>
     </varlistentry>
index 0acd6166495239a6aa396f4df4d8f9e2cc8bb1ad..51d9617dfb3a952e54d470dad555e1d8046c43a9 100644 (file)
@@ -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)