Thread
Commits
-
Simplify creation of built-in functions with default arguments.
- 759b03b24ce9 19 (unreleased) landed
-
Fix the volatility setting of json{b}_strip_nulls
- 2f6ee7b389c2 18.3 landed
-
BUG #19409: Function jsonb_strip_nulls() changed from immutable to stable.
The Post Office <noreply@postgresql.org> — 2026-02-13T19:51:03Z
The following bug has been logged on the website: Bug reference: 19409 Logged by: Lucio Chiessi Email address: lucio.chiessi@trustly.com PostgreSQL version: 18.1 Operating system: MacOS 15.7.3 Description: Hello. We are using, in PostgreSQL 16, the function jsonb_strip_nulls(jsonb) in a calculated table column, as shown below: attributes_hash text generated always as (md5(jsonb_strip_nulls(attributes)::text)) stored, But using PostgreSQL 18 we having this error: [ERROR] SQL State : 42P17 [ERROR] Error Code : 0 [ERROR] Message : ERROR: generation expression is not immutable But this fails in PostgreSQL 18, because the jsonb_strip_nulls ( target jsonb [,strip_in_arrays boolean ] ) function changed from immutable to stable. In PostgreSQL. I used the query below in both versions, with this change: select proname,provolatile,pronargs,proparallel,proargnames from pg_proc where proname in ('jsonb_strip_nulls') and prokind = 'f'; In PostgreSQL 16.6, we have the value of 'provolatile' column as 'i', and in PostgreSQL 18.1 as 's'. I can't find any information about this change in the Release Notes v18. Can we consider this a bug, or is this a normal behavior introduced in v18? Thanks a lot. -
Re: BUG #19409: Function jsonb_strip_nulls() changed from immutable to stable.
Tom Lane <tgl@sss.pgh.pa.us> — 2026-02-13T20:18:19Z
PG Bug reporting form <noreply@postgresql.org> writes: > ... this fails in PostgreSQL 18, because the jsonb_strip_nulls ( target > jsonb [,strip_in_arrays boolean ] ) function changed from immutable to > stable. A bit of git excavation shows that this changed here: Author: Andrew Dunstan <andrew@dunslane.net> Branch: master Release: REL_18_BR [4603903d2] 2025-03-05 10:04:02 -0500 Allow json{b}_strip_nulls to remove null array elements An additional paramater ("strip_in_arrays") is added to these functions. It defaults to false. If true, then null array elements are removed as well as null valued object fields. JSON that just consists of a single null is not affected. Author: Florents Tselai <florents.tselai@gmail.com> Discussion: https://postgr.es/m/4BCECCD5-4F40-4313-9E98-9E16BEB0B01D@gmail.com It looks like a thinko to me, because surely the strip_in_arrays parameter did not make the function more mutable than before. Nor did a quick search find any discussion of the point in the thread. regards, tom lane -
Re: BUG #19409: Function jsonb_strip_nulls() changed from immutable to stable.
Florents Tselai <florents.tselai@gmail.com> — 2026-02-13T21:35:04Z
On Fri, Feb 13, 2026 at 10:18 PM Tom Lane <tgl@sss.pgh.pa.us> wrote: > PG Bug reporting form <noreply@postgresql.org> writes: > > ... this fails in PostgreSQL 18, because the jsonb_strip_nulls ( target > > jsonb [,strip_in_arrays boolean ] ) function changed from immutable to > > stable. > > A bit of git excavation shows that this changed here: > > Author: Andrew Dunstan <andrew@dunslane.net> > Branch: master Release: REL_18_BR [4603903d2] 2025-03-05 10:04:02 -0500 > > Allow json{b}_strip_nulls to remove null array elements > > An additional paramater ("strip_in_arrays") is added to these > functions. > It defaults to false. If true, then null array elements are removed as > well as null valued object fields. JSON that just consists of a single > null is not affected. > > Author: Florents Tselai <florents.tselai@gmail.com> > > Discussion: > https://postgr.es/m/4BCECCD5-4F40-4313-9E98-9E16BEB0B01D@gmail.com > > It looks like a thinko to me, because surely the strip_in_arrays > parameter did not make the function more mutable than before. > The perils of going from pg_proc.dat to manual defs in system_functions.sql -
Re: BUG #19409: Function jsonb_strip_nulls() changed from immutable to stable.
Andrew Dunstan <andrew@dunslane.net> — 2026-02-16T16:18:28Z
On 2026-02-13 Fr 3:18 PM, Tom Lane wrote: > PG Bug reporting form<noreply@postgresql.org> writes: >> ... this fails in PostgreSQL 18, because the jsonb_strip_nulls ( target >> jsonb [,strip_in_arrays boolean ] ) function changed from immutable to >> stable. > A bit of git excavation shows that this changed here: > > Author: Andrew Dunstan<andrew@dunslane.net> > Branch: master Release: REL_18_BR [4603903d2] 2025-03-05 10:04:02 -0500 > > Allow json{b}_strip_nulls to remove null array elements > > An additional paramater ("strip_in_arrays") is added to these functions. > It defaults to false. If true, then null array elements are removed as > well as null valued object fields. JSON that just consists of a single > null is not affected. > > Author: Florents Tselai<florents.tselai@gmail.com> > > Discussion:https://postgr.es/m/4BCECCD5-4F40-4313-9E98-9E16BEB0B01D@gmail.com > > It looks like a thinko to me, because surely the strip_in_arrays > parameter did not make the function more mutable than before. > Nor did a quick search find any discussion of the point in the > thread. > > Yeah. <paperbag> In penance for this I have worked up a mechanism to generate default-setting statements from pg_proc.dat that I will post separately about in -hackers. In the meantime, I guess we should fix it in release 18 and master, with a release note that people might need to do a manual update if affected, along the lines of update pg_proc set provolatile = 'i' where oid in (3261,3262); cheers andrew -- Andrew Dunstan EDB:https://www.enterprisedb.com -
Re: BUG #19409: Function jsonb_strip_nulls() changed from immutable to stable.
Tom Lane <tgl@sss.pgh.pa.us> — 2026-02-16T16:48:19Z
Andrew Dunstan <andrew@dunslane.net> writes: > In penance for this I have worked up a mechanism to generate > default-setting statements from pg_proc.dat that I will post separately > about in -hackers. In the meantime, I guess we should fix it in release > 18 and master, with a release note that people might need to do a manual > update if affected, along the lines of > update pg_proc set provolatile = 'i' where oid in (3261,3262); Yeah, the $64 question is what to do in REL_18_STABLE. In master we can commit this with a catversion bump, but we can't change v18's catversion. I think I agree that we should just change v18's system_functions.sql anyway. That will at least solve it for people upgrading in future. regards, tom lane
-
Re: BUG #19409: Function jsonb_strip_nulls() changed from immutable to stable.
Andrew Dunstan <andrew@dunslane.net> — 2026-02-16T20:19:32Z
On 2026-02-16 Mo 11:48 AM, Tom Lane wrote: > Andrew Dunstan<andrew@dunslane.net> writes: >> In penance for this I have worked up a mechanism to generate >> default-setting statements from pg_proc.dat that I will post separately >> about in -hackers. In the meantime, I guess we should fix it in release >> 18 and master, with a release note that people might need to do a manual >> update if affected, along the lines of >> update pg_proc set provolatile = 'i' where oid in (3261,3262); > Yeah, the $64 question is what to do in REL_18_STABLE. In master > we can commit this with a catversion bump, but we can't change > v18's catversion. I think I agree that we should just change v18's > system_functions.sql anyway. That will at least solve it for people > upgrading in future. OK, barring objections I will make that happen in a day or two. cheers andrew -- Andrew Dunstan EDB:https://www.enterprisedb.com
-
Re: BUG #19409: Function jsonb_strip_nulls() changed from immutable to stable.
Andrew Dunstan <andrew@dunslane.net> — 2026-02-17T21:25:19Z
On 2026-02-16 Mo 3:19 PM, Andrew Dunstan wrote: > > > On 2026-02-16 Mo 11:48 AM, Tom Lane wrote: >> Andrew Dunstan<andrew@dunslane.net> writes: >>> In penance for this I have worked up a mechanism to generate >>> default-setting statements from pg_proc.dat that I will post separately >>> about in -hackers. In the meantime, I guess we should fix it in release >>> 18 and master, with a release note that people might need to do a manual >>> update if affected, along the lines of >>> update pg_proc set provolatile = 'i' where oid in (3261,3262); >> Yeah, the $64 question is what to do in REL_18_STABLE. In master >> we can commit this with a catversion bump, but we can't change >> v18's catversion. I think I agree that we should just change v18's >> system_functions.sql anyway. That will at least solve it for people >> upgrading in future. > > > OK, barring objections I will make that happen in a day or two. > > > In view of later discussions, fixing master seems pointless, as that code is going away. When it does we should do a catversion bump. So I'm just planning to patch v18 now. cheers andrew -- Andrew Dunstan EDB: https://www.enterprisedb.com
-
Re: BUG #19409: Function jsonb_strip_nulls() changed from immutable to stable.
Tom Lane <tgl@sss.pgh.pa.us> — 2026-02-17T21:55:04Z
Andrew Dunstan <andrew@dunslane.net> writes: > In view of later discussions, fixing master seems pointless, as that > code is going away. When it does we should do a catversion bump. > So I'm just planning to patch v18 now. Makes sense. regards, tom lane
-
Re: BUG #19409: Function jsonb_strip_nulls() changed from immutable to stable.
Andrew Dunstan <andrew@dunslane.net> — 2026-02-18T18:05:33Z
On 2026-02-17 Tu 4:55 PM, Tom Lane wrote: > Andrew Dunstan <andrew@dunslane.net> writes: >> In view of later discussions, fixing master seems pointless, as that >> code is going away. When it does we should do a catversion bump. >> So I'm just planning to patch v18 now. > Makes sense. > > Done. cheers andrew -- Andrew Dunstan EDB: https://www.enterprisedb.com
-
Re: BUG #19409: Function jsonb_strip_nulls() changed from immutable to stable.
Tom Lane <tgl@sss.pgh.pa.us> — 2026-02-18T19:18:40Z
Andrew Dunstan <andrew@dunslane.net> writes: > Done. I pushed the patch for master too, so this is closed now. regards, tom lane