I'd like to propose a new function `pg_is_volatile` that would test and return
the volatility of its argument expression. Example uses of the function would
be:
pg_is_volatile(1) -> false
pg_is_volatile(random()) -> true
The motivation for the proposal is to allow testing of column default
expressions for new columns added with `ALTER TABLE ... ADD COLUMN` before
adding the column. This is to determine whether the column default will be able
to take advantage of the fast-path optimization for non-volatile column
defaults, or whether a full table rewrite will be required.
For a schema migration tool, it's desirable for the tool to assess the
volatility of a column default for a new column before adding it. The tool can
then decide on the most appropriate way to add the column, either doing so
directly for a non-volatile default, or issuing a warning or using some other
method in the case of a volatile default.
The documentation for this function would be as follows:
```
<row>
<entry role="func_table_entry"><para role="func_signature">
<indexterm>
<primary>pg_is_volatile</primary>
</indexterm>
<function>pg_is_volatile</function> ( <type>"any"</type> )
<returnvalue>boolean</returnvalue>
</para>
<para>
Tests whether the argument expression contains volatile functions (see
<xref linkend="xfunc-volatility"/>). This can be useful to determine
whether the expression can be used as a column default without causing
a table rewrite.
</para></entry>
</row>
```
I believe the implementation of this function would be straightforward with a
new function in `src/backend/utils/adt/misc.c` delegating to the existing
`contain_volatile_functions_after_planning` function in
`src/backend/optimizer/util/clauses.c`.