Fix internal error from CollateExpr in SQL/JSON DEFAULT expressions
authorAmit Langote <[email protected]>
Thu, 9 Oct 2025 05:07:59 +0000 (01:07 -0400)
committerAmit Langote <[email protected]>
Thu, 9 Oct 2025 05:07:59 +0000 (01:07 -0400)
commitef5e60a9d352a97791af632e0d26a572bc88e921
treea2c9b42eea27c5ce76c1cf0923f321d818f4773d
parenta5a68dd6d5159626360f75ffde96eca879e6cc30
Fix internal error from CollateExpr in SQL/JSON DEFAULT expressions

SQL/JSON functions such as JSON_VALUE could fail with "unrecognized
node type" errors when a DEFAULT clause contained an explicit COLLATE
expression. That happened because assign_collations_walker() could
invoke exprSetCollation() on a JsonBehavior expression whose DEFAULT
still contained a CollateExpr, which exprSetCollation() does not
handle.

For example:

  SELECT JSON_VALUE('{"a":1}', '$.c' RETURNING text
                    DEFAULT 'A' COLLATE "C" ON EMPTY);

Fix by validating in transformJsonBehavior() that the DEFAULT
expression's collation matches the enclosing JSON expression’s
collation. In exprSetCollation(), replace the recursive call on the
JsonBehavior expression with an assertion that its collation already
matches the target, since the parser now enforces that condition.

Reported-by: Jian He <[email protected]>
Author: Jian He <[email protected]>
Reviewed-by: Amit Langote <[email protected]>
Discussion: https://postgr.es/m/CACJufxHVwYYSyiVQ6o+PsRX6zQ7rAFinh_fv1kCfTsT1xG4Zeg@mail.gmail.com
Backpatch-through: 17
src/backend/nodes/nodeFuncs.c
src/backend/parser/parse_expr.c
src/test/regress/expected/collate.icu.utf8.out
src/test/regress/sql/collate.icu.utf8.sql