make immutability tests in to_json and to_jsonb complete
Andrew Dunstan <andrew@dunslane.net>
make immutability tests in to_json and to_jsonb complete Complete the TODOs in to_json_is_immutable() and to_jsonb_is_immutable() by recursing into container types (arrays, composites, ranges, multiranges, domains) to check element/sub-type mutability, rather than conservatively returning "mutable" for all arrays and composites. The shared logic is factored into a single json_check_mutability() function in jsonfuncs.c, with the existing exported functions as thin wrappers. Composite type inspection uses lookup_rowtype_tupdesc() (typcache) instead of relation_open() to avoid unnecessary lock acquisition in the optimizer. Range and multirange types are now also checked recursively: if the subtype's conversion is immutable, the range is considered immutable for JSON purposes, even though range_out is generically marked STABLE. This is a behavioral change: range types with immutable subtypes (e.g., int4range) can now appear in expression indexes via JSON_ARRAY/JSON_OBJECT, whereas previously they were conservatively rejected. Add regression tests for JSON_ARRAY and JSON_OBJECT mutability with expression indexes and generated columns, covering arrays, composites, domains, ranges, multiranges and combinations thereof. Author: Jian He <jian.universality@gmail.com> Reviewed-by: Andrew Dunstan <andrew@dunslane.net> Discussion: https://postgr.es/m/CACJufxFz=OsXQdsMJ-cqoqspD9aJrwntsQP-U2A-UaV_M+-S9g@mail.gmail.com Commitfest: https://commitfest.postgresql.org/patch/5759
Files
| Path | Change | +/− |
|---|---|---|
| src/backend/utils/adt/jsonb.c | modified | +3 −35 |
| src/backend/utils/adt/json.c | modified | +3 −35 |
| src/backend/utils/adt/jsonfuncs.c | modified | +105 −0 |
| src/include/utils/jsonfuncs.h | modified | +2 −0 |
| src/test/regress/expected/sqljson.out | modified | +165 −0 |
| src/test/regress/sql/sqljson.sql | modified | +89 −0 |
Discussion
- finish TODOs in to_json_is_immutable, to_jsonb_is_immutable also add tests on it 12 messages · 2025-05-19 → 2026-03-17