mirror of
https://github.com/postgres/postgres.git
synced 2025-11-07 19:06:32 +03:00
SQL/JSON: Fix issues with DEFAULT .. ON ERROR / EMPTY
SQL/JSON query functions allow specifying an expression to return when either of ON ERROR or ON EMPTY condition occurs when evaluating the JSON path expression. The parser (transformJsonBehavior()) checks that the specified expression is one of the supported expressions, but there are two issues with how the check is done that are fixed in this commit: * No check for some expressions related to coercion, such as CoerceViaIO, that may appear in the transformed user-specified expressions that include cast(s) * An unsupported expression may be masked by a coercion-related expression, which must be flagged by checking the latter's argument expression recursively Author: Jian He <jian.universality@gmail.com> Author: Amit Langote <amitlangote09@gmail.com> Reported-by: Jian He <jian.universality@gmail.com> Discussion: https://postgr.es/m/CACJufxEqhqsfrg_p7EMyo5zak3d767iFDL8vz_4%3DZBHpOtrghw@mail.gmail.com Discussion: https://postgr.es/m/CACJufxGOerH1QJknm1noh-Kz5FqU4p7QfeZSeVT2tN_4SLXYNg@mail.gmail.com
This commit is contained in:
@@ -411,6 +411,33 @@ SELECT JSON_QUERY(js, '$' RETURNING int DEFAULT (SELECT 1) ON ERROR) FROM test_
|
||||
DROP TABLE test_jsonb_mutability;
|
||||
DROP FUNCTION ret_setint;
|
||||
|
||||
CREATE DOMAIN jsonb_test_domain AS text CHECK (value <> 'foo');
|
||||
SELECT JSON_VALUE(jsonb '{"d1": "H"}', '$.a2' RETURNING jsonb_test_domain DEFAULT 'foo'::jsonb_test_domain ON ERROR);
|
||||
SELECT JSON_VALUE(jsonb '{"d1": "H"}', '$.a2' RETURNING jsonb_test_domain DEFAULT 'foo1'::jsonb_test_domain ON ERROR);
|
||||
SELECT JSON_VALUE(jsonb '{"d1": "H"}', '$.a2' RETURNING jsonb_test_domain DEFAULT '"foo1"'::jsonb::text ON ERROR);
|
||||
SELECT JSON_VALUE(jsonb '{"d1": "foo"}', '$.a2' RETURNING jsonb_test_domain DEFAULT 'foo1'::jsonb_test_domain ON ERROR);
|
||||
|
||||
-- Check the cases where a coercion-related expression is masking an
|
||||
-- unsupported expressions
|
||||
|
||||
-- CoerceViaIO
|
||||
SELECT JSON_QUERY('"a"', '$.a' RETURNING int DEFAULT (SELECT '"1"')::jsonb ON ERROR);
|
||||
-- CoerceToDomain
|
||||
SELECT JSON_QUERY('"a"', '$.a' RETURNING jsonb_test_domain DEFAULT (select '"1"')::jsonb_test_domain ON ERROR);
|
||||
-- RelabelType
|
||||
SELECT JSON_QUERY('"a"', '$.a' RETURNING int DEFAULT (SELECT 1)::oid::int ON ERROR);
|
||||
-- ArrayCoerceExpr
|
||||
SELECT JSON_QUERY('"a"', '$.a' RETURNING int[] DEFAULT (SELECT '{1}')::oid[]::int[] ON ERROR);
|
||||
-- CollateExpr
|
||||
SELECT JSON_QUERY('"a"', '$.a' RETURNING int[] DEFAULT (SELECT '{1}')::text COLLATE "C" ON ERROR);
|
||||
-- ConvertRowtypeExpr
|
||||
CREATE TABLE someparent (a int);
|
||||
CREATE TABLE somechild () INHERITS (someparent);
|
||||
SELECT JSON_QUERY('"a"', '$.a' RETURNING someparent DEFAULT (SELECT '(1)')::somechild::someparent ON ERROR);
|
||||
|
||||
DROP DOMAIN jsonb_test_domain;
|
||||
DROP TABLE someparent, somechild;
|
||||
|
||||
-- Extension: non-constant JSON path
|
||||
SELECT JSON_EXISTS(jsonb '{"a": 123}', '$' || '.' || 'a');
|
||||
SELECT JSON_VALUE(jsonb '{"a": 123}', '$' || '.' || 'a');
|
||||
|
||||
Reference in New Issue
Block a user