Andrew Dunstan <andrew@dunslane.net> writes:
> Stable expressions are quite ok for fast defaults. The expression is
> evaluated once when the ALTER TABLE is done and the result (not the
> expression) is stored in the catalog. The reason we check for volatile
> expressions is precisely because we don't want all the existing rows to
> get a single value in that case. This was discussed during the Postgres
> 11 development cycle.
Hmm.
The issue here is that if the table is empty, the old behavior evaluated
the expression zero times during ALTER TABLE. Now we evaluate it once,
and if that throws an error, that's a user-visible behavior change.
Perhaps it's okay to decide that that's an acceptable behavioral change,
but it makes this feature less transparent than it was supposed to be.
regards, tom lane