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 <[email protected]> Reviewed-by: Andrew Dunstan <[email protected]> Discussion: https://postgr.es/m/CACJufxFz=osxqdsmj-cqoqspd9ajrwntsqp-u2a-uav_m+-...@mail.gmail.com Commitfest: https://commitfest.postgresql.org/patch/5759 Branch ------ master Details ------- https://git.postgresql.org/pg/commitdiff/ecd9288624a1582a732cf86ac5a01475a1ce7815 Modified Files -------------- src/backend/utils/adt/json.c | 38 +------- src/backend/utils/adt/jsonb.c | 38 +------- src/backend/utils/adt/jsonfuncs.c | 105 ++++++++++++++++++++++ src/include/utils/jsonfuncs.h | 2 + src/test/regress/expected/sqljson.out | 165 ++++++++++++++++++++++++++++++++++ src/test/regress/sql/sqljson.sql | 89 ++++++++++++++++++ 6 files changed, 367 insertions(+), 70 deletions(-)
