mirror of
https://github.com/postgres/postgres.git
synced 2025-05-02 11:44:50 +03:00
Fix restriction on specifying KEEP QUOTES in JSON_QUERY()
Currently, transformJsonFuncExpr() enforces some restrictions on the combinations of QUOTES and WRAPPER clauses that can be specified in JSON_QUERY(). The intent was to only prevent the useless combination WITH WRAPPER OMIT QUOTES, but the coding prevented KEEP QUOTES too, which is not helpful. Fix that.
This commit is contained in:
parent
b453a7a16a
commit
561b74ddb8
@ -4300,7 +4300,7 @@ transformJsonFuncExpr(ParseState *pstate, JsonFuncExpr *func)
|
||||
|
||||
/* OMIT QUOTES is meaningless when strings are wrapped. */
|
||||
if (func->op == JSON_QUERY_OP &&
|
||||
func->quotes != JS_QUOTES_UNSPEC &&
|
||||
func->quotes == JS_QUOTES_OMIT &&
|
||||
(func->wrapper == JSW_CONDITIONAL ||
|
||||
func->wrapper == JSW_UNCONDITIONAL))
|
||||
ereport(ERROR,
|
||||
|
@ -591,15 +591,18 @@ SELECT * FROM JSON_TABLE(jsonb '"world"', '$' COLUMNS (item text FORMAT JSON PAT
|
||||
["world"]
|
||||
(1 row)
|
||||
|
||||
-- Error: QUOTES clause meaningless when WITH WRAPPER is present
|
||||
SELECT * FROM JSON_TABLE(jsonb '"world"', '$' COLUMNS (item text FORMAT JSON PATH '$' WITH WRAPPER KEEP QUOTES));
|
||||
ERROR: SQL/JSON QUOTES behavior must not be specified when WITH WRAPPER is used
|
||||
LINE 1: ...T * FROM JSON_TABLE(jsonb '"world"', '$' COLUMNS (item text ...
|
||||
^
|
||||
-- Error: OMIT QUOTES should not be specified when WITH WRAPPER is present
|
||||
SELECT * FROM JSON_TABLE(jsonb '"world"', '$' COLUMNS (item text PATH '$' WITH WRAPPER OMIT QUOTES));
|
||||
ERROR: SQL/JSON QUOTES behavior must not be specified when WITH WRAPPER is used
|
||||
LINE 1: ...T * FROM JSON_TABLE(jsonb '"world"', '$' COLUMNS (item text ...
|
||||
^
|
||||
-- But KEEP QUOTES (the default) is fine
|
||||
SELECT * FROM JSON_TABLE(jsonb '"world"', '$' COLUMNS (item text FORMAT JSON PATH '$' WITH WRAPPER KEEP QUOTES));
|
||||
item
|
||||
-----------
|
||||
["world"]
|
||||
(1 row)
|
||||
|
||||
-- Test PASSING args
|
||||
SELECT *
|
||||
FROM JSON_TABLE(
|
||||
|
@ -656,35 +656,45 @@ SELECT JSON_QUERY(jsonb '"aaa"', '$.a' RETURNING char(2) OMIT QUOTES DEFAULT '"b
|
||||
"b
|
||||
(1 row)
|
||||
|
||||
-- QUOTES behavior should not be specified when WITH WRAPPER used:
|
||||
-- OMIT QUOTES behavior should not be specified when WITH WRAPPER used:
|
||||
-- Should fail
|
||||
SELECT JSON_QUERY(jsonb '[1]', '$' WITH WRAPPER OMIT QUOTES);
|
||||
ERROR: SQL/JSON QUOTES behavior must not be specified when WITH WRAPPER is used
|
||||
LINE 1: SELECT JSON_QUERY(jsonb '[1]', '$' WITH WRAPPER OMIT QUOTES)...
|
||||
^
|
||||
SELECT JSON_QUERY(jsonb '[1]', '$' WITH WRAPPER KEEP QUOTES);
|
||||
ERROR: SQL/JSON QUOTES behavior must not be specified when WITH WRAPPER is used
|
||||
LINE 1: SELECT JSON_QUERY(jsonb '[1]', '$' WITH WRAPPER KEEP QUOTES)...
|
||||
^
|
||||
SELECT JSON_QUERY(jsonb '[1]', '$' WITH CONDITIONAL WRAPPER KEEP QUOTES);
|
||||
ERROR: SQL/JSON QUOTES behavior must not be specified when WITH WRAPPER is used
|
||||
LINE 1: SELECT JSON_QUERY(jsonb '[1]', '$' WITH CONDITIONAL WRAPPER ...
|
||||
^
|
||||
SELECT JSON_QUERY(jsonb '[1]', '$' WITH CONDITIONAL WRAPPER OMIT QUOTES);
|
||||
ERROR: SQL/JSON QUOTES behavior must not be specified when WITH WRAPPER is used
|
||||
LINE 1: SELECT JSON_QUERY(jsonb '[1]', '$' WITH CONDITIONAL WRAPPER ...
|
||||
^
|
||||
-- Should succeed
|
||||
SELECT JSON_QUERY(jsonb '[1]', '$' WITHOUT WRAPPER OMIT QUOTES);
|
||||
SELECT JSON_QUERY(jsonb '["1"]', '$[*]' WITH CONDITIONAL WRAPPER KEEP QUOTES);
|
||||
json_query
|
||||
------------
|
||||
[1]
|
||||
["1"]
|
||||
(1 row)
|
||||
|
||||
SELECT JSON_QUERY(jsonb '[1]', '$' WITHOUT WRAPPER KEEP QUOTES);
|
||||
SELECT JSON_QUERY(jsonb '["1"]', '$[*]' WITH UNCONDITIONAL WRAPPER KEEP QUOTES);
|
||||
json_query
|
||||
------------
|
||||
[1]
|
||||
["1"]
|
||||
(1 row)
|
||||
|
||||
SELECT JSON_QUERY(jsonb '["1"]', '$[*]' WITH WRAPPER KEEP QUOTES);
|
||||
json_query
|
||||
------------
|
||||
["1"]
|
||||
(1 row)
|
||||
|
||||
SELECT JSON_QUERY(jsonb '["1"]', '$[*]' WITHOUT WRAPPER OMIT QUOTES);
|
||||
json_query
|
||||
------------
|
||||
1
|
||||
(1 row)
|
||||
|
||||
SELECT JSON_QUERY(jsonb '["1"]', '$[*]' WITHOUT WRAPPER KEEP QUOTES);
|
||||
json_query
|
||||
------------
|
||||
"1"
|
||||
(1 row)
|
||||
|
||||
-- test QUOTES behavior.
|
||||
|
@ -264,9 +264,10 @@ SELECT * FROM JSON_TABLE(jsonb '"world"', '$' COLUMNS (item text PATH '$' WITHOU
|
||||
|
||||
SELECT * FROM JSON_TABLE(jsonb '"world"', '$' COLUMNS (item text FORMAT JSON PATH '$' WITH WRAPPER));
|
||||
|
||||
-- Error: QUOTES clause meaningless when WITH WRAPPER is present
|
||||
SELECT * FROM JSON_TABLE(jsonb '"world"', '$' COLUMNS (item text FORMAT JSON PATH '$' WITH WRAPPER KEEP QUOTES));
|
||||
-- Error: OMIT QUOTES should not be specified when WITH WRAPPER is present
|
||||
SELECT * FROM JSON_TABLE(jsonb '"world"', '$' COLUMNS (item text PATH '$' WITH WRAPPER OMIT QUOTES));
|
||||
-- But KEEP QUOTES (the default) is fine
|
||||
SELECT * FROM JSON_TABLE(jsonb '"world"', '$' COLUMNS (item text FORMAT JSON PATH '$' WITH WRAPPER KEEP QUOTES));
|
||||
|
||||
-- Test PASSING args
|
||||
SELECT *
|
||||
|
@ -193,15 +193,16 @@ SELECT JSON_QUERY(jsonb '"aaa"', '$' RETURNING char(2) OMIT QUOTES);
|
||||
SELECT JSON_QUERY(jsonb '"aaa"', '$.a' RETURNING char(2) OMIT QUOTES DEFAULT 'bbb' ON EMPTY);
|
||||
SELECT JSON_QUERY(jsonb '"aaa"', '$.a' RETURNING char(2) OMIT QUOTES DEFAULT '"bbb"'::jsonb ON EMPTY);
|
||||
|
||||
-- QUOTES behavior should not be specified when WITH WRAPPER used:
|
||||
-- OMIT QUOTES behavior should not be specified when WITH WRAPPER used:
|
||||
-- Should fail
|
||||
SELECT JSON_QUERY(jsonb '[1]', '$' WITH WRAPPER OMIT QUOTES);
|
||||
SELECT JSON_QUERY(jsonb '[1]', '$' WITH WRAPPER KEEP QUOTES);
|
||||
SELECT JSON_QUERY(jsonb '[1]', '$' WITH CONDITIONAL WRAPPER KEEP QUOTES);
|
||||
SELECT JSON_QUERY(jsonb '[1]', '$' WITH CONDITIONAL WRAPPER OMIT QUOTES);
|
||||
-- Should succeed
|
||||
SELECT JSON_QUERY(jsonb '[1]', '$' WITHOUT WRAPPER OMIT QUOTES);
|
||||
SELECT JSON_QUERY(jsonb '[1]', '$' WITHOUT WRAPPER KEEP QUOTES);
|
||||
SELECT JSON_QUERY(jsonb '["1"]', '$[*]' WITH CONDITIONAL WRAPPER KEEP QUOTES);
|
||||
SELECT JSON_QUERY(jsonb '["1"]', '$[*]' WITH UNCONDITIONAL WRAPPER KEEP QUOTES);
|
||||
SELECT JSON_QUERY(jsonb '["1"]', '$[*]' WITH WRAPPER KEEP QUOTES);
|
||||
SELECT JSON_QUERY(jsonb '["1"]', '$[*]' WITHOUT WRAPPER OMIT QUOTES);
|
||||
SELECT JSON_QUERY(jsonb '["1"]', '$[*]' WITHOUT WRAPPER KEEP QUOTES);
|
||||
|
||||
-- test QUOTES behavior.
|
||||
SELECT JSON_QUERY(jsonb'{"rec": "{1,2,3}"}', '$.rec' returning int[] omit quotes);
|
||||
|
Loading…
x
Reference in New Issue
Block a user