interval_out() must be marked STABLE, not IMMUTABLE.

Its results vary depending on the IntervalStyle GUC, so it cannot
be considered immutable.

This is an extremely ancient bug.  AFAICT it was a sloppy mistake
in 6f58115dd, which marked it "cacheable" alongside marking several
other interval functions that way.  At the time, interval_out()
depended on DateStyle not IntervalStyle, but it was still wrong.

Back-patching this change doesn't look very practical, so I won't.
Aside from the usual difficulties of getting catalog changes
applied to existing databases, people might have indexes,
generated columns, etc that depend on interval-to-text casts
being considered immutable.  (This'd not really give them any
problem as long as they never change IntervalStyle.)  They
wouldn't appreciate us breaking such usage in minor releases.

Per bug #17371 from Marcus Gartner.

Discussion: https://postgr.es/m/17371-8f57e6e9ca5e35bf@postgresql.org
This commit is contained in:
Tom Lane 2022-01-19 17:17:55 -05:00
parent 6c4a8903b9
commit a3d6264bbc
2 changed files with 3 additions and 3 deletions

View File

@ -53,6 +53,6 @@
*/ */
/* yyyymmddN */ /* yyyymmddN */
#define CATALOG_VERSION_NO 202201171 #define CATALOG_VERSION_NO 202201191
#endif #endif

View File

@ -2290,8 +2290,8 @@
proname => 'interval_in', provolatile => 's', prorettype => 'interval', proname => 'interval_in', provolatile => 's', prorettype => 'interval',
proargtypes => 'cstring oid int4', prosrc => 'interval_in' }, proargtypes => 'cstring oid int4', prosrc => 'interval_in' },
{ oid => '1161', descr => 'I/O', { oid => '1161', descr => 'I/O',
proname => 'interval_out', prorettype => 'cstring', proargtypes => 'interval', proname => 'interval_out', provolatile => 's', prorettype => 'cstring',
prosrc => 'interval_out' }, proargtypes => 'interval', prosrc => 'interval_out' },
{ oid => '2903', descr => 'I/O typmod', { oid => '2903', descr => 'I/O typmod',
proname => 'intervaltypmodin', prorettype => 'int4', proname => 'intervaltypmodin', prorettype => 'int4',
proargtypes => '_cstring', prosrc => 'intervaltypmodin' }, proargtypes => '_cstring', prosrc => 'intervaltypmodin' },