Add more test coverage for jsonpath "$.*" with arrays

There was no coverage for the code path to unwrap an array before
applying ".*" to it, so add tests to provide more coverage for both
objects and arrays.

This shows, for example, that no results are returned for an array of
scalars, and what results are returned when the array contains an
object.  A few more scenarios are covered with the strict/lax modes and
the operator "@?".

Author: David Wheeler
Reported-by: David G. Johnston, Stepan Neretin
Discussion: https://postgr.es/m/A95346F9-6147-46E0-809E-532A485D71D6@justatheory.com
This commit is contained in:
Michael Paquier 2024-07-19 14:17:56 +09:00
parent 5c571a34d0
commit 3a137ab7e5
2 changed files with 61 additions and 0 deletions

View File

@ -1135,6 +1135,56 @@ select jsonb_path_query('{"a": [1, 2]}', 'lax $.a * 3', silent => true);
------------------
(0 rows)
-- any key on arrays with and without unwrapping.
select jsonb_path_query('{"a": [1,2,3], "b": [3,4,5]}', '$.*');
jsonb_path_query
------------------
[1, 2, 3]
[3, 4, 5]
(2 rows)
select jsonb_path_query('[1,2,3]', '$.*');
jsonb_path_query
------------------
(0 rows)
select jsonb_path_query('[1,2,3,{"b": [3,4,5]}]', 'lax $.*');
jsonb_path_query
------------------
[3, 4, 5]
(1 row)
select jsonb_path_query('[1,2,3,{"b": [3,4,5]}]', 'strict $.*');
ERROR: jsonpath wildcard member accessor can only be applied to an object
select jsonb_path_query('[1,2,3,{"b": [3,4,5]}]', 'strict $.*', NULL, true);
jsonb_path_query
------------------
(0 rows)
select jsonb '{"a": [1,2,3], "b": [3,4,5]}' @? '$.*';
?column?
----------
t
(1 row)
select jsonb '[1,2,3]' @? '$.*';
?column?
----------
f
(1 row)
select jsonb '[1,2,3,{"b": [3,4,5]}]' @? 'lax $.*';
?column?
----------
t
(1 row)
select jsonb '[1,2,3,{"b": [3,4,5]}]' @? 'strict $.*';
?column?
----------
(1 row)
-- extension: boolean expressions
select jsonb_path_query('2', '$ > 1');
jsonb_path_query

View File

@ -241,6 +241,17 @@ select jsonb_path_query('{"a": [2, 3, 4]}', 'lax -$.a');
select jsonb_path_query('{"a": [1, 2]}', 'lax $.a * 3');
select jsonb_path_query('{"a": [1, 2]}', 'lax $.a * 3', silent => true);
-- any key on arrays with and without unwrapping.
select jsonb_path_query('{"a": [1,2,3], "b": [3,4,5]}', '$.*');
select jsonb_path_query('[1,2,3]', '$.*');
select jsonb_path_query('[1,2,3,{"b": [3,4,5]}]', 'lax $.*');
select jsonb_path_query('[1,2,3,{"b": [3,4,5]}]', 'strict $.*');
select jsonb_path_query('[1,2,3,{"b": [3,4,5]}]', 'strict $.*', NULL, true);
select jsonb '{"a": [1,2,3], "b": [3,4,5]}' @? '$.*';
select jsonb '[1,2,3]' @? '$.*';
select jsonb '[1,2,3,{"b": [3,4,5]}]' @? 'lax $.*';
select jsonb '[1,2,3,{"b": [3,4,5]}]' @? 'strict $.*';
-- extension: boolean expressions
select jsonb_path_query('2', '$ > 1');
select jsonb_path_query('2', '$ <= 1');