mirror of
https://github.com/postgres/postgres.git
synced 2025-05-11 05:41:32 +03:00
The current jsonpath code assumes that the referenced variable always exists. It could only throw an error at the value valuation time. At the same time existence checking assumes variable is present without valuation, and error suppression doesn't work for missing variables. This commit makes existense checking trigger an error for missing variables. This makes the overall behavior consistent. Backpatch to 12 where jsonpath was introduced. Reported-by: David G. Johnston Discussion: https://postgr.es/m/CAKFQuwbeytffJkVnEqDyLZ%3DrQsznoTh1OgDoOF3VmOMkxcTMjA%40mail.gmail.com Author: Alexander Korotkov, David G. Johnston Backpatch-through: 12
2572 lines
73 KiB
Plaintext
2572 lines
73 KiB
Plaintext
select jsonb '{"a": 12}' @? '$';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb '{"a": 12}' @? '1';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb '{"a": 12}' @? '$.a.b';
|
|
?column?
|
|
----------
|
|
f
|
|
(1 row)
|
|
|
|
select jsonb '{"a": 12}' @? '$.b';
|
|
?column?
|
|
----------
|
|
f
|
|
(1 row)
|
|
|
|
select jsonb '{"a": 12}' @? '$.a + 2';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb '{"a": 12}' @? '$.b + 2';
|
|
?column?
|
|
----------
|
|
|
|
(1 row)
|
|
|
|
select jsonb '{"a": {"a": 12}}' @? '$.a.a';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb '{"a": {"a": 12}}' @? '$.*.a';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb '{"b": {"a": 12}}' @? '$.*.a';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb '{"b": {"a": 12}}' @? '$.*.b';
|
|
?column?
|
|
----------
|
|
f
|
|
(1 row)
|
|
|
|
select jsonb '{"b": {"a": 12}}' @? 'strict $.*.b';
|
|
?column?
|
|
----------
|
|
|
|
(1 row)
|
|
|
|
select jsonb '{}' @? '$.*';
|
|
?column?
|
|
----------
|
|
f
|
|
(1 row)
|
|
|
|
select jsonb '{"a": 1}' @? '$.*';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb '{"a": {"b": 1}}' @? 'lax $.**{1}';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb '{"a": {"b": 1}}' @? 'lax $.**{2}';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb '{"a": {"b": 1}}' @? 'lax $.**{3}';
|
|
?column?
|
|
----------
|
|
f
|
|
(1 row)
|
|
|
|
select jsonb '[]' @? '$[*]';
|
|
?column?
|
|
----------
|
|
f
|
|
(1 row)
|
|
|
|
select jsonb '[1]' @? '$[*]';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb '[1]' @? '$[1]';
|
|
?column?
|
|
----------
|
|
f
|
|
(1 row)
|
|
|
|
select jsonb '[1]' @? 'strict $[1]';
|
|
?column?
|
|
----------
|
|
|
|
(1 row)
|
|
|
|
select jsonb_path_query('[1]', 'strict $[1]');
|
|
ERROR: jsonpath array subscript is out of bounds
|
|
select jsonb_path_query('[1]', 'strict $[1]', silent => true);
|
|
jsonb_path_query
|
|
------------------
|
|
(0 rows)
|
|
|
|
select jsonb '[1]' @? 'lax $[10000000000000000]';
|
|
?column?
|
|
----------
|
|
|
|
(1 row)
|
|
|
|
select jsonb '[1]' @? 'strict $[10000000000000000]';
|
|
?column?
|
|
----------
|
|
|
|
(1 row)
|
|
|
|
select jsonb_path_query('[1]', 'lax $[10000000000000000]');
|
|
ERROR: jsonpath array subscript is out of integer range
|
|
select jsonb_path_query('[1]', 'strict $[10000000000000000]');
|
|
ERROR: jsonpath array subscript is out of integer range
|
|
select jsonb '[1]' @? '$[0]';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb '[1]' @? '$[0.3]';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb '[1]' @? '$[0.5]';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb '[1]' @? '$[0.9]';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb '[1]' @? '$[1.2]';
|
|
?column?
|
|
----------
|
|
f
|
|
(1 row)
|
|
|
|
select jsonb '[1]' @? 'strict $[1.2]';
|
|
?column?
|
|
----------
|
|
|
|
(1 row)
|
|
|
|
select jsonb '{"a": [1,2,3], "b": [3,4,5]}' @? '$ ? (@.a[*] > @.b[*])';
|
|
?column?
|
|
----------
|
|
f
|
|
(1 row)
|
|
|
|
select jsonb '{"a": [1,2,3], "b": [3,4,5]}' @? '$ ? (@.a[*] >= @.b[*])';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb '{"a": [1,2,3], "b": [3,4,"5"]}' @? '$ ? (@.a[*] >= @.b[*])';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb '{"a": [1,2,3], "b": [3,4,"5"]}' @? 'strict $ ? (@.a[*] >= @.b[*])';
|
|
?column?
|
|
----------
|
|
f
|
|
(1 row)
|
|
|
|
select jsonb '{"a": [1,2,3], "b": [3,4,null]}' @? '$ ? (@.a[*] >= @.b[*])';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb '1' @? '$ ? ((@ == "1") is unknown)';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb '1' @? '$ ? ((@ == 1) is unknown)';
|
|
?column?
|
|
----------
|
|
f
|
|
(1 row)
|
|
|
|
select jsonb '[{"a": 1}, {"a": 2}]' @? '$[0 to 1] ? (@.a > 1)';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb_path_exists('[{"a": 1}, {"a": 2}, 3]', 'lax $[*].a', silent => false);
|
|
jsonb_path_exists
|
|
-------------------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb_path_exists('[{"a": 1}, {"a": 2}, 3]', 'lax $[*].a', silent => true);
|
|
jsonb_path_exists
|
|
-------------------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb_path_exists('[{"a": 1}, {"a": 2}, 3]', 'strict $[*].a', silent => false);
|
|
ERROR: jsonpath member accessor can only be applied to an object
|
|
select jsonb_path_exists('[{"a": 1}, {"a": 2}, 3]', 'strict $[*].a', silent => true);
|
|
jsonb_path_exists
|
|
-------------------
|
|
|
|
(1 row)
|
|
|
|
select jsonb_path_query('1', 'lax $.a');
|
|
jsonb_path_query
|
|
------------------
|
|
(0 rows)
|
|
|
|
select jsonb_path_query('1', 'strict $.a');
|
|
ERROR: jsonpath member accessor can only be applied to an object
|
|
select jsonb_path_query('1', 'strict $.*');
|
|
ERROR: jsonpath wildcard member accessor can only be applied to an object
|
|
select jsonb_path_query('1', 'strict $.a', silent => true);
|
|
jsonb_path_query
|
|
------------------
|
|
(0 rows)
|
|
|
|
select jsonb_path_query('1', 'strict $.*', silent => true);
|
|
jsonb_path_query
|
|
------------------
|
|
(0 rows)
|
|
|
|
select jsonb_path_query('[]', 'lax $.a');
|
|
jsonb_path_query
|
|
------------------
|
|
(0 rows)
|
|
|
|
select jsonb_path_query('[]', 'strict $.a');
|
|
ERROR: jsonpath member accessor can only be applied to an object
|
|
select jsonb_path_query('[]', 'strict $.a', silent => true);
|
|
jsonb_path_query
|
|
------------------
|
|
(0 rows)
|
|
|
|
select jsonb_path_query('{}', 'lax $.a');
|
|
jsonb_path_query
|
|
------------------
|
|
(0 rows)
|
|
|
|
select jsonb_path_query('{}', 'strict $.a');
|
|
ERROR: JSON object does not contain key "a"
|
|
select jsonb_path_query('{}', 'strict $.a', silent => true);
|
|
jsonb_path_query
|
|
------------------
|
|
(0 rows)
|
|
|
|
select jsonb_path_query('1', 'strict $[1]');
|
|
ERROR: jsonpath array accessor can only be applied to an array
|
|
select jsonb_path_query('1', 'strict $[*]');
|
|
ERROR: jsonpath wildcard array accessor can only be applied to an array
|
|
select jsonb_path_query('[]', 'strict $[1]');
|
|
ERROR: jsonpath array subscript is out of bounds
|
|
select jsonb_path_query('[]', 'strict $["a"]');
|
|
ERROR: jsonpath array subscript is not a single numeric value
|
|
select jsonb_path_query('1', 'strict $[1]', silent => true);
|
|
jsonb_path_query
|
|
------------------
|
|
(0 rows)
|
|
|
|
select jsonb_path_query('1', 'strict $[*]', silent => true);
|
|
jsonb_path_query
|
|
------------------
|
|
(0 rows)
|
|
|
|
select jsonb_path_query('[]', 'strict $[1]', silent => true);
|
|
jsonb_path_query
|
|
------------------
|
|
(0 rows)
|
|
|
|
select jsonb_path_query('[]', 'strict $["a"]', silent => true);
|
|
jsonb_path_query
|
|
------------------
|
|
(0 rows)
|
|
|
|
select jsonb_path_query('{"a": 12, "b": {"a": 13}}', '$.a');
|
|
jsonb_path_query
|
|
------------------
|
|
12
|
|
(1 row)
|
|
|
|
select jsonb_path_query('{"a": 12, "b": {"a": 13}}', '$.b');
|
|
jsonb_path_query
|
|
------------------
|
|
{"a": 13}
|
|
(1 row)
|
|
|
|
select jsonb_path_query('{"a": 12, "b": {"a": 13}}', '$.*');
|
|
jsonb_path_query
|
|
------------------
|
|
12
|
|
{"a": 13}
|
|
(2 rows)
|
|
|
|
select jsonb_path_query('{"a": 12, "b": {"a": 13}}', 'lax $.*.a');
|
|
jsonb_path_query
|
|
------------------
|
|
13
|
|
(1 row)
|
|
|
|
select jsonb_path_query('[12, {"a": 13}, {"b": 14}]', 'lax $[*].a');
|
|
jsonb_path_query
|
|
------------------
|
|
13
|
|
(1 row)
|
|
|
|
select jsonb_path_query('[12, {"a": 13}, {"b": 14}]', 'lax $[*].*');
|
|
jsonb_path_query
|
|
------------------
|
|
13
|
|
14
|
|
(2 rows)
|
|
|
|
select jsonb_path_query('[12, {"a": 13}, {"b": 14}]', 'lax $[0].a');
|
|
jsonb_path_query
|
|
------------------
|
|
(0 rows)
|
|
|
|
select jsonb_path_query('[12, {"a": 13}, {"b": 14}]', 'lax $[1].a');
|
|
jsonb_path_query
|
|
------------------
|
|
13
|
|
(1 row)
|
|
|
|
select jsonb_path_query('[12, {"a": 13}, {"b": 14}]', 'lax $[2].a');
|
|
jsonb_path_query
|
|
------------------
|
|
(0 rows)
|
|
|
|
select jsonb_path_query('[12, {"a": 13}, {"b": 14}]', 'lax $[0,1].a');
|
|
jsonb_path_query
|
|
------------------
|
|
13
|
|
(1 row)
|
|
|
|
select jsonb_path_query('[12, {"a": 13}, {"b": 14}]', 'lax $[0 to 10].a');
|
|
jsonb_path_query
|
|
------------------
|
|
13
|
|
(1 row)
|
|
|
|
select jsonb_path_query('[12, {"a": 13}, {"b": 14}]', 'lax $[0 to 10 / 0].a');
|
|
ERROR: division by zero
|
|
select jsonb_path_query('[12, {"a": 13}, {"b": 14}, "ccc", true]', '$[2.5 - 1 to $.size() - 2]');
|
|
jsonb_path_query
|
|
------------------
|
|
{"a": 13}
|
|
{"b": 14}
|
|
"ccc"
|
|
(3 rows)
|
|
|
|
select jsonb_path_query('1', 'lax $[0]');
|
|
jsonb_path_query
|
|
------------------
|
|
1
|
|
(1 row)
|
|
|
|
select jsonb_path_query('1', 'lax $[*]');
|
|
jsonb_path_query
|
|
------------------
|
|
1
|
|
(1 row)
|
|
|
|
select jsonb_path_query('[1]', 'lax $[0]');
|
|
jsonb_path_query
|
|
------------------
|
|
1
|
|
(1 row)
|
|
|
|
select jsonb_path_query('[1]', 'lax $[*]');
|
|
jsonb_path_query
|
|
------------------
|
|
1
|
|
(1 row)
|
|
|
|
select jsonb_path_query('[1,2,3]', 'lax $[*]');
|
|
jsonb_path_query
|
|
------------------
|
|
1
|
|
2
|
|
3
|
|
(3 rows)
|
|
|
|
select jsonb_path_query('[1,2,3]', 'strict $[*].a');
|
|
ERROR: jsonpath member accessor can only be applied to an object
|
|
select jsonb_path_query('[1,2,3]', 'strict $[*].a', silent => true);
|
|
jsonb_path_query
|
|
------------------
|
|
(0 rows)
|
|
|
|
select jsonb_path_query('[]', '$[last]');
|
|
jsonb_path_query
|
|
------------------
|
|
(0 rows)
|
|
|
|
select jsonb_path_query('[]', '$[last ? (exists(last))]');
|
|
jsonb_path_query
|
|
------------------
|
|
(0 rows)
|
|
|
|
select jsonb_path_query('[]', 'strict $[last]');
|
|
ERROR: jsonpath array subscript is out of bounds
|
|
select jsonb_path_query('[]', 'strict $[last]', silent => true);
|
|
jsonb_path_query
|
|
------------------
|
|
(0 rows)
|
|
|
|
select jsonb_path_query('[1]', '$[last]');
|
|
jsonb_path_query
|
|
------------------
|
|
1
|
|
(1 row)
|
|
|
|
select jsonb_path_query('[1,2,3]', '$[last]');
|
|
jsonb_path_query
|
|
------------------
|
|
3
|
|
(1 row)
|
|
|
|
select jsonb_path_query('[1,2,3]', '$[last - 1]');
|
|
jsonb_path_query
|
|
------------------
|
|
2
|
|
(1 row)
|
|
|
|
select jsonb_path_query('[1,2,3]', '$[last ? (@.type() == "number")]');
|
|
jsonb_path_query
|
|
------------------
|
|
3
|
|
(1 row)
|
|
|
|
select jsonb_path_query('[1,2,3]', '$[last ? (@.type() == "string")]');
|
|
ERROR: jsonpath array subscript is not a single numeric value
|
|
select jsonb_path_query('[1,2,3]', '$[last ? (@.type() == "string")]', silent => true);
|
|
jsonb_path_query
|
|
------------------
|
|
(0 rows)
|
|
|
|
select * from jsonb_path_query('{"a": 10}', '$');
|
|
jsonb_path_query
|
|
------------------
|
|
{"a": 10}
|
|
(1 row)
|
|
|
|
select * from jsonb_path_query('{"a": 10}', '$ ? (@.a < $value)');
|
|
ERROR: could not find jsonpath variable "value"
|
|
select * from jsonb_path_query('{"a": 10}', '$ ? (@.a < $value)', '1');
|
|
ERROR: "vars" argument is not an object
|
|
DETAIL: Jsonpath parameters should be encoded as key-value pairs of "vars" object.
|
|
select * from jsonb_path_query('{"a": 10}', '$ ? (@.a < $value)', '[{"value" : 13}]');
|
|
ERROR: "vars" argument is not an object
|
|
DETAIL: Jsonpath parameters should be encoded as key-value pairs of "vars" object.
|
|
select * from jsonb_path_query('{"a": 10}', '$ ? (@.a < $value)', '{"value" : 13}');
|
|
jsonb_path_query
|
|
------------------
|
|
{"a": 10}
|
|
(1 row)
|
|
|
|
select * from jsonb_path_query('{"a": 10}', '$ ? (@.a < $value)', '{"value" : 8}');
|
|
jsonb_path_query
|
|
------------------
|
|
(0 rows)
|
|
|
|
select * from jsonb_path_query('{"a": 10}', '$.a ? (@ < $value)', '{"value" : 13}');
|
|
jsonb_path_query
|
|
------------------
|
|
10
|
|
(1 row)
|
|
|
|
select * from jsonb_path_query('[10,11,12,13,14,15]', '$[*] ? (@ < $value)', '{"value" : 13}');
|
|
jsonb_path_query
|
|
------------------
|
|
10
|
|
11
|
|
12
|
|
(3 rows)
|
|
|
|
select * from jsonb_path_query('[10,11,12,13,14,15]', '$[0,1] ? (@ < $x.value)', '{"x": {"value" : 13}}');
|
|
jsonb_path_query
|
|
------------------
|
|
10
|
|
11
|
|
(2 rows)
|
|
|
|
select * from jsonb_path_query('[10,11,12,13,14,15]', '$[0 to 2] ? (@ < $value)', '{"value" : 15}');
|
|
jsonb_path_query
|
|
------------------
|
|
10
|
|
11
|
|
12
|
|
(3 rows)
|
|
|
|
select * from jsonb_path_query('[1,"1",2,"2",null]', '$[*] ? (@ == "1")');
|
|
jsonb_path_query
|
|
------------------
|
|
"1"
|
|
(1 row)
|
|
|
|
select * from jsonb_path_query('[1,"1",2,"2",null]', '$[*] ? (@ == $value)', '{"value" : "1"}');
|
|
jsonb_path_query
|
|
------------------
|
|
"1"
|
|
(1 row)
|
|
|
|
select * from jsonb_path_query('[1,"1",2,"2",null]', '$[*] ? (@ == $value)', '{"value" : null}');
|
|
jsonb_path_query
|
|
------------------
|
|
null
|
|
(1 row)
|
|
|
|
select * from jsonb_path_query('[1, "2", null]', '$[*] ? (@ != null)');
|
|
jsonb_path_query
|
|
------------------
|
|
1
|
|
"2"
|
|
(2 rows)
|
|
|
|
select * from jsonb_path_query('[1, "2", null]', '$[*] ? (@ == null)');
|
|
jsonb_path_query
|
|
------------------
|
|
null
|
|
(1 row)
|
|
|
|
select * from jsonb_path_query('{}', '$ ? (@ == @)');
|
|
jsonb_path_query
|
|
------------------
|
|
(0 rows)
|
|
|
|
select * from jsonb_path_query('[]', 'strict $ ? (@ == @)');
|
|
jsonb_path_query
|
|
------------------
|
|
(0 rows)
|
|
|
|
select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**');
|
|
jsonb_path_query
|
|
------------------
|
|
{"a": {"b": 1}}
|
|
{"b": 1}
|
|
1
|
|
(3 rows)
|
|
|
|
select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{0}');
|
|
jsonb_path_query
|
|
------------------
|
|
{"a": {"b": 1}}
|
|
(1 row)
|
|
|
|
select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{0 to last}');
|
|
jsonb_path_query
|
|
------------------
|
|
{"a": {"b": 1}}
|
|
{"b": 1}
|
|
1
|
|
(3 rows)
|
|
|
|
select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{1}');
|
|
jsonb_path_query
|
|
------------------
|
|
{"b": 1}
|
|
(1 row)
|
|
|
|
select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{1 to last}');
|
|
jsonb_path_query
|
|
------------------
|
|
{"b": 1}
|
|
1
|
|
(2 rows)
|
|
|
|
select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{2}');
|
|
jsonb_path_query
|
|
------------------
|
|
1
|
|
(1 row)
|
|
|
|
select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{2 to last}');
|
|
jsonb_path_query
|
|
------------------
|
|
1
|
|
(1 row)
|
|
|
|
select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{3 to last}');
|
|
jsonb_path_query
|
|
------------------
|
|
(0 rows)
|
|
|
|
select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{last}');
|
|
jsonb_path_query
|
|
------------------
|
|
1
|
|
(1 row)
|
|
|
|
select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**.b ? (@ > 0)');
|
|
jsonb_path_query
|
|
------------------
|
|
1
|
|
(1 row)
|
|
|
|
select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{0}.b ? (@ > 0)');
|
|
jsonb_path_query
|
|
------------------
|
|
(0 rows)
|
|
|
|
select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{1}.b ? (@ > 0)');
|
|
jsonb_path_query
|
|
------------------
|
|
1
|
|
(1 row)
|
|
|
|
select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{0 to last}.b ? (@ > 0)');
|
|
jsonb_path_query
|
|
------------------
|
|
1
|
|
(1 row)
|
|
|
|
select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{1 to last}.b ? (@ > 0)');
|
|
jsonb_path_query
|
|
------------------
|
|
1
|
|
(1 row)
|
|
|
|
select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{1 to 2}.b ? (@ > 0)');
|
|
jsonb_path_query
|
|
------------------
|
|
1
|
|
(1 row)
|
|
|
|
select jsonb_path_query('{"a": {"c": {"b": 1}}}', 'lax $.**.b ? (@ > 0)');
|
|
jsonb_path_query
|
|
------------------
|
|
1
|
|
(1 row)
|
|
|
|
select jsonb_path_query('{"a": {"c": {"b": 1}}}', 'lax $.**{0}.b ? (@ > 0)');
|
|
jsonb_path_query
|
|
------------------
|
|
(0 rows)
|
|
|
|
select jsonb_path_query('{"a": {"c": {"b": 1}}}', 'lax $.**{1}.b ? (@ > 0)');
|
|
jsonb_path_query
|
|
------------------
|
|
(0 rows)
|
|
|
|
select jsonb_path_query('{"a": {"c": {"b": 1}}}', 'lax $.**{0 to last}.b ? (@ > 0)');
|
|
jsonb_path_query
|
|
------------------
|
|
1
|
|
(1 row)
|
|
|
|
select jsonb_path_query('{"a": {"c": {"b": 1}}}', 'lax $.**{1 to last}.b ? (@ > 0)');
|
|
jsonb_path_query
|
|
------------------
|
|
1
|
|
(1 row)
|
|
|
|
select jsonb_path_query('{"a": {"c": {"b": 1}}}', 'lax $.**{1 to 2}.b ? (@ > 0)');
|
|
jsonb_path_query
|
|
------------------
|
|
1
|
|
(1 row)
|
|
|
|
select jsonb_path_query('{"a": {"c": {"b": 1}}}', 'lax $.**{2 to 3}.b ? (@ > 0)');
|
|
jsonb_path_query
|
|
------------------
|
|
1
|
|
(1 row)
|
|
|
|
select jsonb '{"a": {"b": 1}}' @? '$.**.b ? ( @ > 0)';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb '{"a": {"b": 1}}' @? '$.**{0}.b ? ( @ > 0)';
|
|
?column?
|
|
----------
|
|
f
|
|
(1 row)
|
|
|
|
select jsonb '{"a": {"b": 1}}' @? '$.**{1}.b ? ( @ > 0)';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb '{"a": {"b": 1}}' @? '$.**{0 to last}.b ? ( @ > 0)';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb '{"a": {"b": 1}}' @? '$.**{1 to last}.b ? ( @ > 0)';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb '{"a": {"b": 1}}' @? '$.**{1 to 2}.b ? ( @ > 0)';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb '{"a": {"c": {"b": 1}}}' @? '$.**.b ? ( @ > 0)';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb '{"a": {"c": {"b": 1}}}' @? '$.**{0}.b ? ( @ > 0)';
|
|
?column?
|
|
----------
|
|
f
|
|
(1 row)
|
|
|
|
select jsonb '{"a": {"c": {"b": 1}}}' @? '$.**{1}.b ? ( @ > 0)';
|
|
?column?
|
|
----------
|
|
f
|
|
(1 row)
|
|
|
|
select jsonb '{"a": {"c": {"b": 1}}}' @? '$.**{0 to last}.b ? ( @ > 0)';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb '{"a": {"c": {"b": 1}}}' @? '$.**{1 to last}.b ? ( @ > 0)';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb '{"a": {"c": {"b": 1}}}' @? '$.**{1 to 2}.b ? ( @ > 0)';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb '{"a": {"c": {"b": 1}}}' @? '$.**{2 to 3}.b ? ( @ > 0)';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb_path_query('{"g": {"x": 2}}', '$.g ? (exists (@.x))');
|
|
jsonb_path_query
|
|
------------------
|
|
{"x": 2}
|
|
(1 row)
|
|
|
|
select jsonb_path_query('{"g": {"x": 2}}', '$.g ? (exists (@.y))');
|
|
jsonb_path_query
|
|
------------------
|
|
(0 rows)
|
|
|
|
select jsonb_path_query('{"g": {"x": 2}}', '$.g ? (exists (@.x ? (@ >= 2) ))');
|
|
jsonb_path_query
|
|
------------------
|
|
{"x": 2}
|
|
(1 row)
|
|
|
|
select jsonb_path_query('{"g": [{"x": 2}, {"y": 3}]}', 'lax $.g ? (exists (@.x))');
|
|
jsonb_path_query
|
|
------------------
|
|
{"x": 2}
|
|
(1 row)
|
|
|
|
select jsonb_path_query('{"g": [{"x": 2}, {"y": 3}]}', 'lax $.g ? (exists (@.x + "3"))');
|
|
jsonb_path_query
|
|
------------------
|
|
(0 rows)
|
|
|
|
select jsonb_path_query('{"g": [{"x": 2}, {"y": 3}]}', 'lax $.g ? ((exists (@.x + "3")) is unknown)');
|
|
jsonb_path_query
|
|
------------------
|
|
{"x": 2}
|
|
{"y": 3}
|
|
(2 rows)
|
|
|
|
select jsonb_path_query('{"g": [{"x": 2}, {"y": 3}]}', 'strict $.g[*] ? (exists (@.x))');
|
|
jsonb_path_query
|
|
------------------
|
|
{"x": 2}
|
|
(1 row)
|
|
|
|
select jsonb_path_query('{"g": [{"x": 2}, {"y": 3}]}', 'strict $.g[*] ? ((exists (@.x)) is unknown)');
|
|
jsonb_path_query
|
|
------------------
|
|
{"y": 3}
|
|
(1 row)
|
|
|
|
select jsonb_path_query('{"g": [{"x": 2}, {"y": 3}]}', 'strict $.g ? (exists (@[*].x))');
|
|
jsonb_path_query
|
|
------------------
|
|
(0 rows)
|
|
|
|
select jsonb_path_query('{"g": [{"x": 2}, {"y": 3}]}', 'strict $.g ? ((exists (@[*].x)) is unknown)');
|
|
jsonb_path_query
|
|
----------------------
|
|
[{"x": 2}, {"y": 3}]
|
|
(1 row)
|
|
|
|
--test ternary logic
|
|
select
|
|
x, y,
|
|
jsonb_path_query(
|
|
'[true, false, null]',
|
|
'$[*] ? (@ == true && ($x == true && $y == true) ||
|
|
@ == false && !($x == true && $y == true) ||
|
|
@ == null && ($x == true && $y == true) is unknown)',
|
|
jsonb_build_object('x', x, 'y', y)
|
|
) as "x && y"
|
|
from
|
|
(values (jsonb 'true'), ('false'), ('"null"')) x(x),
|
|
(values (jsonb 'true'), ('false'), ('"null"')) y(y);
|
|
x | y | x && y
|
|
--------+--------+--------
|
|
true | true | true
|
|
true | false | false
|
|
true | "null" | null
|
|
false | true | false
|
|
false | false | false
|
|
false | "null" | false
|
|
"null" | true | null
|
|
"null" | false | false
|
|
"null" | "null" | null
|
|
(9 rows)
|
|
|
|
select
|
|
x, y,
|
|
jsonb_path_query(
|
|
'[true, false, null]',
|
|
'$[*] ? (@ == true && ($x == true || $y == true) ||
|
|
@ == false && !($x == true || $y == true) ||
|
|
@ == null && ($x == true || $y == true) is unknown)',
|
|
jsonb_build_object('x', x, 'y', y)
|
|
) as "x || y"
|
|
from
|
|
(values (jsonb 'true'), ('false'), ('"null"')) x(x),
|
|
(values (jsonb 'true'), ('false'), ('"null"')) y(y);
|
|
x | y | x || y
|
|
--------+--------+--------
|
|
true | true | true
|
|
true | false | true
|
|
true | "null" | true
|
|
false | true | true
|
|
false | false | false
|
|
false | "null" | null
|
|
"null" | true | true
|
|
"null" | false | null
|
|
"null" | "null" | null
|
|
(9 rows)
|
|
|
|
select jsonb '{"a": 1, "b":1}' @? '$ ? (@.a == @.b)';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb '{"c": {"a": 1, "b":1}}' @? '$ ? (@.a == @.b)';
|
|
?column?
|
|
----------
|
|
f
|
|
(1 row)
|
|
|
|
select jsonb '{"c": {"a": 1, "b":1}}' @? '$.c ? (@.a == @.b)';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb '{"c": {"a": 1, "b":1}}' @? '$.c ? ($.c.a == @.b)';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb '{"c": {"a": 1, "b":1}}' @? '$.* ? (@.a == @.b)';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb '{"a": 1, "b":1}' @? '$.** ? (@.a == @.b)';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb '{"c": {"a": 1, "b":1}}' @? '$.** ? (@.a == @.b)';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb_path_query('{"c": {"a": 2, "b":1}}', '$.** ? (@.a == 1 + 1)');
|
|
jsonb_path_query
|
|
------------------
|
|
{"a": 2, "b": 1}
|
|
(1 row)
|
|
|
|
select jsonb_path_query('{"c": {"a": 2, "b":1}}', '$.** ? (@.a == (1 + 1))');
|
|
jsonb_path_query
|
|
------------------
|
|
{"a": 2, "b": 1}
|
|
(1 row)
|
|
|
|
select jsonb_path_query('{"c": {"a": 2, "b":1}}', '$.** ? (@.a == @.b + 1)');
|
|
jsonb_path_query
|
|
------------------
|
|
{"a": 2, "b": 1}
|
|
(1 row)
|
|
|
|
select jsonb_path_query('{"c": {"a": 2, "b":1}}', '$.** ? (@.a == (@.b + 1))');
|
|
jsonb_path_query
|
|
------------------
|
|
{"a": 2, "b": 1}
|
|
(1 row)
|
|
|
|
select jsonb '{"c": {"a": -1, "b":1}}' @? '$.** ? (@.a == - 1)';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb '{"c": {"a": -1, "b":1}}' @? '$.** ? (@.a == -1)';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb '{"c": {"a": -1, "b":1}}' @? '$.** ? (@.a == -@.b)';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb '{"c": {"a": -1, "b":1}}' @? '$.** ? (@.a == - @.b)';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb '{"c": {"a": 0, "b":1}}' @? '$.** ? (@.a == 1 - @.b)';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb '{"c": {"a": 2, "b":1}}' @? '$.** ? (@.a == 1 - - @.b)';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb '{"c": {"a": 0, "b":1}}' @? '$.** ? (@.a == 1 - +@.b)';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb '[1,2,3]' @? '$ ? (+@[*] > +2)';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb '[1,2,3]' @? '$ ? (+@[*] > +3)';
|
|
?column?
|
|
----------
|
|
f
|
|
(1 row)
|
|
|
|
select jsonb '[1,2,3]' @? '$ ? (-@[*] < -2)';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb '[1,2,3]' @? '$ ? (-@[*] < -3)';
|
|
?column?
|
|
----------
|
|
f
|
|
(1 row)
|
|
|
|
select jsonb '1' @? '$ ? ($ > 0)';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
-- arithmetic errors
|
|
select jsonb_path_query('[1,2,0,3]', '$[*] ? (2 / @ > 0)');
|
|
jsonb_path_query
|
|
------------------
|
|
1
|
|
2
|
|
3
|
|
(3 rows)
|
|
|
|
select jsonb_path_query('[1,2,0,3]', '$[*] ? ((2 / @ > 0) is unknown)');
|
|
jsonb_path_query
|
|
------------------
|
|
0
|
|
(1 row)
|
|
|
|
select jsonb_path_query('0', '1 / $');
|
|
ERROR: division by zero
|
|
select jsonb_path_query('0', '1 / $ + 2');
|
|
ERROR: division by zero
|
|
select jsonb_path_query('0', '-(3 + 1 % $)');
|
|
ERROR: division by zero
|
|
select jsonb_path_query('1', '$ + "2"');
|
|
ERROR: right operand of jsonpath operator + is not a single numeric value
|
|
select jsonb_path_query('[1, 2]', '3 * $');
|
|
ERROR: right operand of jsonpath operator * is not a single numeric value
|
|
select jsonb_path_query('"a"', '-$');
|
|
ERROR: operand of unary jsonpath operator - is not a numeric value
|
|
select jsonb_path_query('[1,"2",3]', '+$');
|
|
ERROR: operand of unary jsonpath operator + is not a numeric value
|
|
select jsonb_path_query('1', '$ + "2"', silent => true);
|
|
jsonb_path_query
|
|
------------------
|
|
(0 rows)
|
|
|
|
select jsonb_path_query('[1, 2]', '3 * $', silent => true);
|
|
jsonb_path_query
|
|
------------------
|
|
(0 rows)
|
|
|
|
select jsonb_path_query('"a"', '-$', silent => true);
|
|
jsonb_path_query
|
|
------------------
|
|
(0 rows)
|
|
|
|
select jsonb_path_query('[1,"2",3]', '+$', silent => true);
|
|
jsonb_path_query
|
|
------------------
|
|
1
|
|
(1 row)
|
|
|
|
select jsonb '["1",2,0,3]' @? '-$[*]';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb '[1,"2",0,3]' @? '-$[*]';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb '["1",2,0,3]' @? 'strict -$[*]';
|
|
?column?
|
|
----------
|
|
|
|
(1 row)
|
|
|
|
select jsonb '[1,"2",0,3]' @? 'strict -$[*]';
|
|
?column?
|
|
----------
|
|
|
|
(1 row)
|
|
|
|
-- unwrapping of operator arguments in lax mode
|
|
select jsonb_path_query('{"a": [2]}', 'lax $.a * 3');
|
|
jsonb_path_query
|
|
------------------
|
|
6
|
|
(1 row)
|
|
|
|
select jsonb_path_query('{"a": [2]}', 'lax $.a + 3');
|
|
jsonb_path_query
|
|
------------------
|
|
5
|
|
(1 row)
|
|
|
|
select jsonb_path_query('{"a": [2, 3, 4]}', 'lax -$.a');
|
|
jsonb_path_query
|
|
------------------
|
|
-2
|
|
-3
|
|
-4
|
|
(3 rows)
|
|
|
|
-- should fail
|
|
select jsonb_path_query('{"a": [1, 2]}', 'lax $.a * 3');
|
|
ERROR: left operand of jsonpath operator * is not a single numeric value
|
|
select jsonb_path_query('{"a": [1, 2]}', 'lax $.a * 3', silent => true);
|
|
jsonb_path_query
|
|
------------------
|
|
(0 rows)
|
|
|
|
-- extension: boolean expressions
|
|
select jsonb_path_query('2', '$ > 1');
|
|
jsonb_path_query
|
|
------------------
|
|
true
|
|
(1 row)
|
|
|
|
select jsonb_path_query('2', '$ <= 1');
|
|
jsonb_path_query
|
|
------------------
|
|
false
|
|
(1 row)
|
|
|
|
select jsonb_path_query('2', '$ == "2"');
|
|
jsonb_path_query
|
|
------------------
|
|
null
|
|
(1 row)
|
|
|
|
select jsonb '2' @? '$ == "2"';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb '2' @@ '$ > 1';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb '2' @@ '$ <= 1';
|
|
?column?
|
|
----------
|
|
f
|
|
(1 row)
|
|
|
|
select jsonb '2' @@ '$ == "2"';
|
|
?column?
|
|
----------
|
|
|
|
(1 row)
|
|
|
|
select jsonb '2' @@ '1';
|
|
?column?
|
|
----------
|
|
|
|
(1 row)
|
|
|
|
select jsonb '{}' @@ '$';
|
|
?column?
|
|
----------
|
|
|
|
(1 row)
|
|
|
|
select jsonb '[]' @@ '$';
|
|
?column?
|
|
----------
|
|
|
|
(1 row)
|
|
|
|
select jsonb '[1,2,3]' @@ '$[*]';
|
|
?column?
|
|
----------
|
|
|
|
(1 row)
|
|
|
|
select jsonb '[]' @@ '$[*]';
|
|
?column?
|
|
----------
|
|
|
|
(1 row)
|
|
|
|
select jsonb_path_match('[[1, true], [2, false]]', 'strict $[*] ? (@[0] > $x) [1]', '{"x": 1}');
|
|
jsonb_path_match
|
|
------------------
|
|
f
|
|
(1 row)
|
|
|
|
select jsonb_path_match('[[1, true], [2, false]]', 'strict $[*] ? (@[0] < $x) [1]', '{"x": 2}');
|
|
jsonb_path_match
|
|
------------------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb_path_match('[{"a": 1}, {"a": 2}, 3]', 'lax exists($[*].a)', silent => false);
|
|
jsonb_path_match
|
|
------------------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb_path_match('[{"a": 1}, {"a": 2}, 3]', 'lax exists($[*].a)', silent => true);
|
|
jsonb_path_match
|
|
------------------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb_path_match('[{"a": 1}, {"a": 2}, 3]', 'strict exists($[*].a)', silent => false);
|
|
jsonb_path_match
|
|
------------------
|
|
|
|
(1 row)
|
|
|
|
select jsonb_path_match('[{"a": 1}, {"a": 2}, 3]', 'strict exists($[*].a)', silent => true);
|
|
jsonb_path_match
|
|
------------------
|
|
|
|
(1 row)
|
|
|
|
select jsonb_path_query('[null,1,true,"a",[],{}]', '$.type()');
|
|
jsonb_path_query
|
|
------------------
|
|
"array"
|
|
(1 row)
|
|
|
|
select jsonb_path_query('[null,1,true,"a",[],{}]', 'lax $.type()');
|
|
jsonb_path_query
|
|
------------------
|
|
"array"
|
|
(1 row)
|
|
|
|
select jsonb_path_query('[null,1,true,"a",[],{}]', '$[*].type()');
|
|
jsonb_path_query
|
|
------------------
|
|
"null"
|
|
"number"
|
|
"boolean"
|
|
"string"
|
|
"array"
|
|
"object"
|
|
(6 rows)
|
|
|
|
select jsonb_path_query('null', 'null.type()');
|
|
jsonb_path_query
|
|
------------------
|
|
"null"
|
|
(1 row)
|
|
|
|
select jsonb_path_query('null', 'true.type()');
|
|
jsonb_path_query
|
|
------------------
|
|
"boolean"
|
|
(1 row)
|
|
|
|
select jsonb_path_query('null', '(123).type()');
|
|
jsonb_path_query
|
|
------------------
|
|
"number"
|
|
(1 row)
|
|
|
|
select jsonb_path_query('null', '"123".type()');
|
|
jsonb_path_query
|
|
------------------
|
|
"string"
|
|
(1 row)
|
|
|
|
select jsonb_path_query('{"a": 2}', '($.a - 5).abs() + 10');
|
|
jsonb_path_query
|
|
------------------
|
|
13
|
|
(1 row)
|
|
|
|
select jsonb_path_query('{"a": 2.5}', '-($.a * $.a).floor() % 4.3');
|
|
jsonb_path_query
|
|
------------------
|
|
-1.7
|
|
(1 row)
|
|
|
|
select jsonb_path_query('[1, 2, 3]', '($[*] > 2) ? (@ == true)');
|
|
jsonb_path_query
|
|
------------------
|
|
true
|
|
(1 row)
|
|
|
|
select jsonb_path_query('[1, 2, 3]', '($[*] > 3).type()');
|
|
jsonb_path_query
|
|
------------------
|
|
"boolean"
|
|
(1 row)
|
|
|
|
select jsonb_path_query('[1, 2, 3]', '($[*].a > 3).type()');
|
|
jsonb_path_query
|
|
------------------
|
|
"boolean"
|
|
(1 row)
|
|
|
|
select jsonb_path_query('[1, 2, 3]', 'strict ($[*].a > 3).type()');
|
|
jsonb_path_query
|
|
------------------
|
|
"null"
|
|
(1 row)
|
|
|
|
select jsonb_path_query('[1,null,true,"11",[],[1],[1,2,3],{},{"a":1,"b":2}]', 'strict $[*].size()');
|
|
ERROR: jsonpath item method .size() can only be applied to an array
|
|
select jsonb_path_query('[1,null,true,"11",[],[1],[1,2,3],{},{"a":1,"b":2}]', 'strict $[*].size()', silent => true);
|
|
jsonb_path_query
|
|
------------------
|
|
(0 rows)
|
|
|
|
select jsonb_path_query('[1,null,true,"11",[],[1],[1,2,3],{},{"a":1,"b":2}]', 'lax $[*].size()');
|
|
jsonb_path_query
|
|
------------------
|
|
1
|
|
1
|
|
1
|
|
1
|
|
0
|
|
1
|
|
3
|
|
1
|
|
1
|
|
(9 rows)
|
|
|
|
select jsonb_path_query('[0, 1, -2, -3.4, 5.6]', '$[*].abs()');
|
|
jsonb_path_query
|
|
------------------
|
|
0
|
|
1
|
|
2
|
|
3.4
|
|
5.6
|
|
(5 rows)
|
|
|
|
select jsonb_path_query('[0, 1, -2, -3.4, 5.6]', '$[*].floor()');
|
|
jsonb_path_query
|
|
------------------
|
|
0
|
|
1
|
|
-2
|
|
-4
|
|
5
|
|
(5 rows)
|
|
|
|
select jsonb_path_query('[0, 1, -2, -3.4, 5.6]', '$[*].ceiling()');
|
|
jsonb_path_query
|
|
------------------
|
|
0
|
|
1
|
|
-2
|
|
-3
|
|
6
|
|
(5 rows)
|
|
|
|
select jsonb_path_query('[0, 1, -2, -3.4, 5.6]', '$[*].ceiling().abs()');
|
|
jsonb_path_query
|
|
------------------
|
|
0
|
|
1
|
|
2
|
|
3
|
|
6
|
|
(5 rows)
|
|
|
|
select jsonb_path_query('[0, 1, -2, -3.4, 5.6]', '$[*].ceiling().abs().type()');
|
|
jsonb_path_query
|
|
------------------
|
|
"number"
|
|
"number"
|
|
"number"
|
|
"number"
|
|
"number"
|
|
(5 rows)
|
|
|
|
select jsonb_path_query('[{},1]', '$[*].keyvalue()');
|
|
ERROR: jsonpath item method .keyvalue() can only be applied to an object
|
|
select jsonb_path_query('[{},1]', '$[*].keyvalue()', silent => true);
|
|
jsonb_path_query
|
|
------------------
|
|
(0 rows)
|
|
|
|
select jsonb_path_query('{}', '$.keyvalue()');
|
|
jsonb_path_query
|
|
------------------
|
|
(0 rows)
|
|
|
|
select jsonb_path_query('{"a": 1, "b": [1, 2], "c": {"a": "bbb"}}', '$.keyvalue()');
|
|
jsonb_path_query
|
|
----------------------------------------------
|
|
{"id": 0, "key": "a", "value": 1}
|
|
{"id": 0, "key": "b", "value": [1, 2]}
|
|
{"id": 0, "key": "c", "value": {"a": "bbb"}}
|
|
(3 rows)
|
|
|
|
select jsonb_path_query('[{"a": 1, "b": [1, 2]}, {"c": {"a": "bbb"}}]', '$[*].keyvalue()');
|
|
jsonb_path_query
|
|
-----------------------------------------------
|
|
{"id": 12, "key": "a", "value": 1}
|
|
{"id": 12, "key": "b", "value": [1, 2]}
|
|
{"id": 72, "key": "c", "value": {"a": "bbb"}}
|
|
(3 rows)
|
|
|
|
select jsonb_path_query('[{"a": 1, "b": [1, 2]}, {"c": {"a": "bbb"}}]', 'strict $.keyvalue()');
|
|
ERROR: jsonpath item method .keyvalue() can only be applied to an object
|
|
select jsonb_path_query('[{"a": 1, "b": [1, 2]}, {"c": {"a": "bbb"}}]', 'lax $.keyvalue()');
|
|
jsonb_path_query
|
|
-----------------------------------------------
|
|
{"id": 12, "key": "a", "value": 1}
|
|
{"id": 12, "key": "b", "value": [1, 2]}
|
|
{"id": 72, "key": "c", "value": {"a": "bbb"}}
|
|
(3 rows)
|
|
|
|
select jsonb_path_query('[{"a": 1, "b": [1, 2]}, {"c": {"a": "bbb"}}]', 'strict $.keyvalue().a');
|
|
ERROR: jsonpath item method .keyvalue() can only be applied to an object
|
|
select jsonb '{"a": 1, "b": [1, 2]}' @? 'lax $.keyvalue()';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb '{"a": 1, "b": [1, 2]}' @? 'lax $.keyvalue().key';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb_path_query('null', '$.double()');
|
|
ERROR: jsonpath item method .double() can only be applied to a string or numeric value
|
|
select jsonb_path_query('true', '$.double()');
|
|
ERROR: jsonpath item method .double() can only be applied to a string or numeric value
|
|
select jsonb_path_query('null', '$.double()', silent => true);
|
|
jsonb_path_query
|
|
------------------
|
|
(0 rows)
|
|
|
|
select jsonb_path_query('true', '$.double()', silent => true);
|
|
jsonb_path_query
|
|
------------------
|
|
(0 rows)
|
|
|
|
select jsonb_path_query('[]', '$.double()');
|
|
jsonb_path_query
|
|
------------------
|
|
(0 rows)
|
|
|
|
select jsonb_path_query('[]', 'strict $.double()');
|
|
ERROR: jsonpath item method .double() can only be applied to a string or numeric value
|
|
select jsonb_path_query('{}', '$.double()');
|
|
ERROR: jsonpath item method .double() can only be applied to a string or numeric value
|
|
select jsonb_path_query('[]', 'strict $.double()', silent => true);
|
|
jsonb_path_query
|
|
------------------
|
|
(0 rows)
|
|
|
|
select jsonb_path_query('{}', '$.double()', silent => true);
|
|
jsonb_path_query
|
|
------------------
|
|
(0 rows)
|
|
|
|
select jsonb_path_query('1.23', '$.double()');
|
|
jsonb_path_query
|
|
------------------
|
|
1.23
|
|
(1 row)
|
|
|
|
select jsonb_path_query('"1.23"', '$.double()');
|
|
jsonb_path_query
|
|
------------------
|
|
1.23
|
|
(1 row)
|
|
|
|
select jsonb_path_query('"1.23aaa"', '$.double()');
|
|
ERROR: string argument of jsonpath item method .double() is not a valid representation of a double precision number
|
|
select jsonb_path_query('1e1000', '$.double()');
|
|
ERROR: numeric argument of jsonpath item method .double() is out of range for type double precision
|
|
select jsonb_path_query('"nan"', '$.double()');
|
|
ERROR: string argument of jsonpath item method .double() is not a valid representation of a double precision number
|
|
select jsonb_path_query('"NaN"', '$.double()');
|
|
ERROR: string argument of jsonpath item method .double() is not a valid representation of a double precision number
|
|
select jsonb_path_query('"inf"', '$.double()');
|
|
ERROR: string argument of jsonpath item method .double() is not a valid representation of a double precision number
|
|
select jsonb_path_query('"-inf"', '$.double()');
|
|
ERROR: string argument of jsonpath item method .double() is not a valid representation of a double precision number
|
|
select jsonb_path_query('"inf"', '$.double()', silent => true);
|
|
jsonb_path_query
|
|
------------------
|
|
(0 rows)
|
|
|
|
select jsonb_path_query('"-inf"', '$.double()', silent => true);
|
|
jsonb_path_query
|
|
------------------
|
|
(0 rows)
|
|
|
|
select jsonb_path_query('{}', '$.abs()');
|
|
ERROR: jsonpath item method .abs() can only be applied to a numeric value
|
|
select jsonb_path_query('true', '$.floor()');
|
|
ERROR: jsonpath item method .floor() can only be applied to a numeric value
|
|
select jsonb_path_query('"1.2"', '$.ceiling()');
|
|
ERROR: jsonpath item method .ceiling() can only be applied to a numeric value
|
|
select jsonb_path_query('{}', '$.abs()', silent => true);
|
|
jsonb_path_query
|
|
------------------
|
|
(0 rows)
|
|
|
|
select jsonb_path_query('true', '$.floor()', silent => true);
|
|
jsonb_path_query
|
|
------------------
|
|
(0 rows)
|
|
|
|
select jsonb_path_query('"1.2"', '$.ceiling()', silent => true);
|
|
jsonb_path_query
|
|
------------------
|
|
(0 rows)
|
|
|
|
select jsonb_path_query('["", "a", "abc", "abcabc"]', '$[*] ? (@ starts with "abc")');
|
|
jsonb_path_query
|
|
------------------
|
|
"abc"
|
|
"abcabc"
|
|
(2 rows)
|
|
|
|
select jsonb_path_query('["", "a", "abc", "abcabc"]', 'strict $ ? (@[*] starts with "abc")');
|
|
jsonb_path_query
|
|
----------------------------
|
|
["", "a", "abc", "abcabc"]
|
|
(1 row)
|
|
|
|
select jsonb_path_query('["", "a", "abd", "abdabc"]', 'strict $ ? (@[*] starts with "abc")');
|
|
jsonb_path_query
|
|
------------------
|
|
(0 rows)
|
|
|
|
select jsonb_path_query('["abc", "abcabc", null, 1]', 'strict $ ? (@[*] starts with "abc")');
|
|
jsonb_path_query
|
|
------------------
|
|
(0 rows)
|
|
|
|
select jsonb_path_query('["abc", "abcabc", null, 1]', 'strict $ ? ((@[*] starts with "abc") is unknown)');
|
|
jsonb_path_query
|
|
----------------------------
|
|
["abc", "abcabc", null, 1]
|
|
(1 row)
|
|
|
|
select jsonb_path_query('[[null, 1, "abc", "abcabc"]]', 'lax $ ? (@[*] starts with "abc")');
|
|
jsonb_path_query
|
|
----------------------------
|
|
[null, 1, "abc", "abcabc"]
|
|
(1 row)
|
|
|
|
select jsonb_path_query('[[null, 1, "abd", "abdabc"]]', 'lax $ ? ((@[*] starts with "abc") is unknown)');
|
|
jsonb_path_query
|
|
----------------------------
|
|
[null, 1, "abd", "abdabc"]
|
|
(1 row)
|
|
|
|
select jsonb_path_query('[null, 1, "abd", "abdabc"]', 'lax $[*] ? ((@ starts with "abc") is unknown)');
|
|
jsonb_path_query
|
|
------------------
|
|
null
|
|
1
|
|
(2 rows)
|
|
|
|
select jsonb_path_query('[null, 1, "abc", "abd", "aBdC", "abdacb", "babc", "adc\nabc", "ab\nadc"]', 'lax $[*] ? (@ like_regex "^ab.*c")');
|
|
jsonb_path_query
|
|
------------------
|
|
"abc"
|
|
"abdacb"
|
|
(2 rows)
|
|
|
|
select jsonb_path_query('[null, 1, "abc", "abd", "aBdC", "abdacb", "babc", "adc\nabc", "ab\nadc"]', 'lax $[*] ? (@ like_regex "^ab.*c" flag "i")');
|
|
jsonb_path_query
|
|
------------------
|
|
"abc"
|
|
"aBdC"
|
|
"abdacb"
|
|
(3 rows)
|
|
|
|
select jsonb_path_query('[null, 1, "abc", "abd", "aBdC", "abdacb", "babc", "adc\nabc", "ab\nadc"]', 'lax $[*] ? (@ like_regex "^ab.*c" flag "m")');
|
|
jsonb_path_query
|
|
------------------
|
|
"abc"
|
|
"abdacb"
|
|
"adc\nabc"
|
|
(3 rows)
|
|
|
|
select jsonb_path_query('[null, 1, "abc", "abd", "aBdC", "abdacb", "babc", "adc\nabc", "ab\nadc"]', 'lax $[*] ? (@ like_regex "^ab.*c" flag "s")');
|
|
jsonb_path_query
|
|
------------------
|
|
"abc"
|
|
"abdacb"
|
|
"ab\nadc"
|
|
(3 rows)
|
|
|
|
select jsonb_path_query('[null, 1, "a\b", "a\\b", "^a\\b$"]', 'lax $[*] ? (@ like_regex "a\\b" flag "q")');
|
|
jsonb_path_query
|
|
------------------
|
|
"a\\b"
|
|
"^a\\b$"
|
|
(2 rows)
|
|
|
|
select jsonb_path_query('[null, 1, "a\b", "a\\b", "^a\\b$"]', 'lax $[*] ? (@ like_regex "a\\b" flag "")');
|
|
jsonb_path_query
|
|
------------------
|
|
"a\b"
|
|
(1 row)
|
|
|
|
select jsonb_path_query('[null, 1, "a\b", "a\\b", "^a\\b$"]', 'lax $[*] ? (@ like_regex "^a\\b$" flag "q")');
|
|
jsonb_path_query
|
|
------------------
|
|
"^a\\b$"
|
|
(1 row)
|
|
|
|
select jsonb_path_query('[null, 1, "a\b", "a\\b", "^a\\b$"]', 'lax $[*] ? (@ like_regex "^a\\B$" flag "q")');
|
|
jsonb_path_query
|
|
------------------
|
|
(0 rows)
|
|
|
|
select jsonb_path_query('[null, 1, "a\b", "a\\b", "^a\\b$"]', 'lax $[*] ? (@ like_regex "^a\\B$" flag "iq")');
|
|
jsonb_path_query
|
|
------------------
|
|
"^a\\b$"
|
|
(1 row)
|
|
|
|
select jsonb_path_query('[null, 1, "a\b", "a\\b", "^a\\b$"]', 'lax $[*] ? (@ like_regex "^a\\b$" flag "")');
|
|
jsonb_path_query
|
|
------------------
|
|
"a\b"
|
|
(1 row)
|
|
|
|
select jsonb_path_query('null', '$.datetime()');
|
|
ERROR: jsonpath item method .datetime() can only be applied to a string
|
|
select jsonb_path_query('true', '$.datetime()');
|
|
ERROR: jsonpath item method .datetime() can only be applied to a string
|
|
select jsonb_path_query('1', '$.datetime()');
|
|
ERROR: jsonpath item method .datetime() can only be applied to a string
|
|
select jsonb_path_query('[]', '$.datetime()');
|
|
jsonb_path_query
|
|
------------------
|
|
(0 rows)
|
|
|
|
select jsonb_path_query('[]', 'strict $.datetime()');
|
|
ERROR: jsonpath item method .datetime() can only be applied to a string
|
|
select jsonb_path_query('{}', '$.datetime()');
|
|
ERROR: jsonpath item method .datetime() can only be applied to a string
|
|
select jsonb_path_query('"bogus"', '$.datetime()');
|
|
ERROR: datetime format is not recognized: "bogus"
|
|
HINT: Use a datetime template argument to specify the input data format.
|
|
select jsonb_path_query('"12:34"', '$.datetime("aaa")');
|
|
ERROR: invalid datetime format separator: "a"
|
|
select jsonb_path_query('"aaaa"', '$.datetime("HH24")');
|
|
ERROR: invalid value "aa" for "HH24"
|
|
DETAIL: Value must be an integer.
|
|
select jsonb '"10-03-2017"' @? '$.datetime("dd-mm-yyyy")';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
select jsonb_path_query('"10-03-2017"', '$.datetime("dd-mm-yyyy")');
|
|
jsonb_path_query
|
|
------------------
|
|
"2017-03-10"
|
|
(1 row)
|
|
|
|
select jsonb_path_query('"10-03-2017"', '$.datetime("dd-mm-yyyy").type()');
|
|
jsonb_path_query
|
|
------------------
|
|
"date"
|
|
(1 row)
|
|
|
|
select jsonb_path_query('"10-03-2017 12:34"', '$.datetime("dd-mm-yyyy")');
|
|
ERROR: trailing characters remain in input string after datetime format
|
|
select jsonb_path_query('"10-03-2017 12:34"', '$.datetime("dd-mm-yyyy").type()');
|
|
ERROR: trailing characters remain in input string after datetime format
|
|
select jsonb_path_query('"10-03-2017 12:34"', ' $.datetime("dd-mm-yyyy HH24:MI").type()');
|
|
jsonb_path_query
|
|
-------------------------------
|
|
"timestamp without time zone"
|
|
(1 row)
|
|
|
|
select jsonb_path_query('"10-03-2017 12:34 +05:20"', '$.datetime("dd-mm-yyyy HH24:MI TZH:TZM").type()');
|
|
jsonb_path_query
|
|
----------------------------
|
|
"timestamp with time zone"
|
|
(1 row)
|
|
|
|
select jsonb_path_query('"12:34:56"', '$.datetime("HH24:MI:SS").type()');
|
|
jsonb_path_query
|
|
--------------------------
|
|
"time without time zone"
|
|
(1 row)
|
|
|
|
select jsonb_path_query('"12:34:56 +05:20"', '$.datetime("HH24:MI:SS TZH:TZM").type()');
|
|
jsonb_path_query
|
|
-----------------------
|
|
"time with time zone"
|
|
(1 row)
|
|
|
|
select jsonb_path_query('"10-03-2017T12:34:56"', '$.datetime("dd-mm-yyyy\"T\"HH24:MI:SS")');
|
|
jsonb_path_query
|
|
-----------------------
|
|
"2017-03-10T12:34:56"
|
|
(1 row)
|
|
|
|
select jsonb_path_query('"10-03-2017t12:34:56"', '$.datetime("dd-mm-yyyy\"T\"HH24:MI:SS")');
|
|
ERROR: unmatched format character "T"
|
|
select jsonb_path_query('"10-03-2017 12:34:56"', '$.datetime("dd-mm-yyyy\"T\"HH24:MI:SS")');
|
|
ERROR: unmatched format character "T"
|
|
set time zone '+00';
|
|
select jsonb_path_query('"10-03-2017 12:34"', '$.datetime("dd-mm-yyyy HH24:MI")');
|
|
jsonb_path_query
|
|
-----------------------
|
|
"2017-03-10T12:34:00"
|
|
(1 row)
|
|
|
|
select jsonb_path_query('"10-03-2017 12:34"', '$.datetime("dd-mm-yyyy HH24:MI TZH")');
|
|
ERROR: input string is too short for datetime format
|
|
select jsonb_path_query('"10-03-2017 12:34 +05"', '$.datetime("dd-mm-yyyy HH24:MI TZH")');
|
|
jsonb_path_query
|
|
-----------------------------
|
|
"2017-03-10T12:34:00+05:00"
|
|
(1 row)
|
|
|
|
select jsonb_path_query('"10-03-2017 12:34 -05"', '$.datetime("dd-mm-yyyy HH24:MI TZH")');
|
|
jsonb_path_query
|
|
-----------------------------
|
|
"2017-03-10T12:34:00-05:00"
|
|
(1 row)
|
|
|
|
select jsonb_path_query('"10-03-2017 12:34 +05:20"', '$.datetime("dd-mm-yyyy HH24:MI TZH:TZM")');
|
|
jsonb_path_query
|
|
-----------------------------
|
|
"2017-03-10T12:34:00+05:20"
|
|
(1 row)
|
|
|
|
select jsonb_path_query('"10-03-2017 12:34 -05:20"', '$.datetime("dd-mm-yyyy HH24:MI TZH:TZM")');
|
|
jsonb_path_query
|
|
-----------------------------
|
|
"2017-03-10T12:34:00-05:20"
|
|
(1 row)
|
|
|
|
select jsonb_path_query('"12:34"', '$.datetime("HH24:MI")');
|
|
jsonb_path_query
|
|
------------------
|
|
"12:34:00"
|
|
(1 row)
|
|
|
|
select jsonb_path_query('"12:34"', '$.datetime("HH24:MI TZH")');
|
|
ERROR: input string is too short for datetime format
|
|
select jsonb_path_query('"12:34 +05"', '$.datetime("HH24:MI TZH")');
|
|
jsonb_path_query
|
|
------------------
|
|
"12:34:00+05:00"
|
|
(1 row)
|
|
|
|
select jsonb_path_query('"12:34 -05"', '$.datetime("HH24:MI TZH")');
|
|
jsonb_path_query
|
|
------------------
|
|
"12:34:00-05:00"
|
|
(1 row)
|
|
|
|
select jsonb_path_query('"12:34 +05:20"', '$.datetime("HH24:MI TZH:TZM")');
|
|
jsonb_path_query
|
|
------------------
|
|
"12:34:00+05:20"
|
|
(1 row)
|
|
|
|
select jsonb_path_query('"12:34 -05:20"', '$.datetime("HH24:MI TZH:TZM")');
|
|
jsonb_path_query
|
|
------------------
|
|
"12:34:00-05:20"
|
|
(1 row)
|
|
|
|
set time zone '+10';
|
|
select jsonb_path_query('"10-03-2017 12:34"', '$.datetime("dd-mm-yyyy HH24:MI")');
|
|
jsonb_path_query
|
|
-----------------------
|
|
"2017-03-10T12:34:00"
|
|
(1 row)
|
|
|
|
select jsonb_path_query('"10-03-2017 12:34"', '$.datetime("dd-mm-yyyy HH24:MI TZH")');
|
|
ERROR: input string is too short for datetime format
|
|
select jsonb_path_query('"10-03-2017 12:34 +05"', '$.datetime("dd-mm-yyyy HH24:MI TZH")');
|
|
jsonb_path_query
|
|
-----------------------------
|
|
"2017-03-10T12:34:00+05:00"
|
|
(1 row)
|
|
|
|
select jsonb_path_query('"10-03-2017 12:34 -05"', '$.datetime("dd-mm-yyyy HH24:MI TZH")');
|
|
jsonb_path_query
|
|
-----------------------------
|
|
"2017-03-10T12:34:00-05:00"
|
|
(1 row)
|
|
|
|
select jsonb_path_query('"10-03-2017 12:34 +05:20"', '$.datetime("dd-mm-yyyy HH24:MI TZH:TZM")');
|
|
jsonb_path_query
|
|
-----------------------------
|
|
"2017-03-10T12:34:00+05:20"
|
|
(1 row)
|
|
|
|
select jsonb_path_query('"10-03-2017 12:34 -05:20"', '$.datetime("dd-mm-yyyy HH24:MI TZH:TZM")');
|
|
jsonb_path_query
|
|
-----------------------------
|
|
"2017-03-10T12:34:00-05:20"
|
|
(1 row)
|
|
|
|
select jsonb_path_query('"12:34"', '$.datetime("HH24:MI")');
|
|
jsonb_path_query
|
|
------------------
|
|
"12:34:00"
|
|
(1 row)
|
|
|
|
select jsonb_path_query('"12:34"', '$.datetime("HH24:MI TZH")');
|
|
ERROR: input string is too short for datetime format
|
|
select jsonb_path_query('"12:34 +05"', '$.datetime("HH24:MI TZH")');
|
|
jsonb_path_query
|
|
------------------
|
|
"12:34:00+05:00"
|
|
(1 row)
|
|
|
|
select jsonb_path_query('"12:34 -05"', '$.datetime("HH24:MI TZH")');
|
|
jsonb_path_query
|
|
------------------
|
|
"12:34:00-05:00"
|
|
(1 row)
|
|
|
|
select jsonb_path_query('"12:34 +05:20"', '$.datetime("HH24:MI TZH:TZM")');
|
|
jsonb_path_query
|
|
------------------
|
|
"12:34:00+05:20"
|
|
(1 row)
|
|
|
|
select jsonb_path_query('"12:34 -05:20"', '$.datetime("HH24:MI TZH:TZM")');
|
|
jsonb_path_query
|
|
------------------
|
|
"12:34:00-05:20"
|
|
(1 row)
|
|
|
|
set time zone default;
|
|
select jsonb_path_query('"2017-03-10"', '$.datetime().type()');
|
|
jsonb_path_query
|
|
------------------
|
|
"date"
|
|
(1 row)
|
|
|
|
select jsonb_path_query('"2017-03-10"', '$.datetime()');
|
|
jsonb_path_query
|
|
------------------
|
|
"2017-03-10"
|
|
(1 row)
|
|
|
|
select jsonb_path_query('"2017-03-10 12:34:56"', '$.datetime().type()');
|
|
jsonb_path_query
|
|
-------------------------------
|
|
"timestamp without time zone"
|
|
(1 row)
|
|
|
|
select jsonb_path_query('"2017-03-10 12:34:56"', '$.datetime()');
|
|
jsonb_path_query
|
|
-----------------------
|
|
"2017-03-10T12:34:56"
|
|
(1 row)
|
|
|
|
select jsonb_path_query('"2017-03-10 12:34:56+3"', '$.datetime().type()');
|
|
jsonb_path_query
|
|
----------------------------
|
|
"timestamp with time zone"
|
|
(1 row)
|
|
|
|
select jsonb_path_query('"2017-03-10 12:34:56+3"', '$.datetime()');
|
|
jsonb_path_query
|
|
-----------------------------
|
|
"2017-03-10T12:34:56+03:00"
|
|
(1 row)
|
|
|
|
select jsonb_path_query('"2017-03-10 12:34:56+3:10"', '$.datetime().type()');
|
|
jsonb_path_query
|
|
----------------------------
|
|
"timestamp with time zone"
|
|
(1 row)
|
|
|
|
select jsonb_path_query('"2017-03-10 12:34:56+3:10"', '$.datetime()');
|
|
jsonb_path_query
|
|
-----------------------------
|
|
"2017-03-10T12:34:56+03:10"
|
|
(1 row)
|
|
|
|
select jsonb_path_query('"2017-03-10T12:34:56+3:10"', '$.datetime()');
|
|
jsonb_path_query
|
|
-----------------------------
|
|
"2017-03-10T12:34:56+03:10"
|
|
(1 row)
|
|
|
|
select jsonb_path_query('"2017-03-10t12:34:56+3:10"', '$.datetime()');
|
|
ERROR: datetime format is not recognized: "2017-03-10t12:34:56+3:10"
|
|
HINT: Use a datetime template argument to specify the input data format.
|
|
select jsonb_path_query('"12:34:56"', '$.datetime().type()');
|
|
jsonb_path_query
|
|
--------------------------
|
|
"time without time zone"
|
|
(1 row)
|
|
|
|
select jsonb_path_query('"12:34:56"', '$.datetime()');
|
|
jsonb_path_query
|
|
------------------
|
|
"12:34:56"
|
|
(1 row)
|
|
|
|
select jsonb_path_query('"12:34:56+3"', '$.datetime().type()');
|
|
jsonb_path_query
|
|
-----------------------
|
|
"time with time zone"
|
|
(1 row)
|
|
|
|
select jsonb_path_query('"12:34:56+3"', '$.datetime()');
|
|
jsonb_path_query
|
|
------------------
|
|
"12:34:56+03:00"
|
|
(1 row)
|
|
|
|
select jsonb_path_query('"12:34:56+3:10"', '$.datetime().type()');
|
|
jsonb_path_query
|
|
-----------------------
|
|
"time with time zone"
|
|
(1 row)
|
|
|
|
select jsonb_path_query('"12:34:56+3:10"', '$.datetime()');
|
|
jsonb_path_query
|
|
------------------
|
|
"12:34:56+03:10"
|
|
(1 row)
|
|
|
|
set time zone '+00';
|
|
-- date comparison
|
|
select jsonb_path_query(
|
|
'["2017-03-10", "2017-03-11", "2017-03-09", "12:34:56", "01:02:03+04", "2017-03-10 00:00:00", "2017-03-10 12:34:56", "2017-03-10 01:02:03+04", "2017-03-10 03:00:00+03"]',
|
|
'$[*].datetime() ? (@ == "10.03.2017".datetime("dd.mm.yyyy"))');
|
|
ERROR: cannot convert value from date to timestamptz without time zone usage
|
|
HINT: Use *_tz() function for time zone support.
|
|
select jsonb_path_query(
|
|
'["2017-03-10", "2017-03-11", "2017-03-09", "12:34:56", "01:02:03+04", "2017-03-10 00:00:00", "2017-03-10 12:34:56", "2017-03-10 01:02:03+04", "2017-03-10 03:00:00+03"]',
|
|
'$[*].datetime() ? (@ >= "10.03.2017".datetime("dd.mm.yyyy"))');
|
|
ERROR: cannot convert value from date to timestamptz without time zone usage
|
|
HINT: Use *_tz() function for time zone support.
|
|
select jsonb_path_query(
|
|
'["2017-03-10", "2017-03-11", "2017-03-09", "12:34:56", "01:02:03+04", "2017-03-10 00:00:00", "2017-03-10 12:34:56", "2017-03-10 01:02:03+04", "2017-03-10 03:00:00+03"]',
|
|
'$[*].datetime() ? (@ < "10.03.2017".datetime("dd.mm.yyyy"))');
|
|
ERROR: cannot convert value from date to timestamptz without time zone usage
|
|
HINT: Use *_tz() function for time zone support.
|
|
select jsonb_path_query_tz(
|
|
'["2017-03-10", "2017-03-11", "2017-03-09", "12:34:56", "01:02:03+04", "2017-03-10 00:00:00", "2017-03-10 12:34:56", "2017-03-10 01:02:03+04", "2017-03-10 03:00:00+03"]',
|
|
'$[*].datetime() ? (@ == "10.03.2017".datetime("dd.mm.yyyy"))');
|
|
jsonb_path_query_tz
|
|
-----------------------------
|
|
"2017-03-10"
|
|
"2017-03-10T00:00:00"
|
|
"2017-03-10T03:00:00+03:00"
|
|
(3 rows)
|
|
|
|
select jsonb_path_query_tz(
|
|
'["2017-03-10", "2017-03-11", "2017-03-09", "12:34:56", "01:02:03+04", "2017-03-10 00:00:00", "2017-03-10 12:34:56", "2017-03-10 01:02:03+04", "2017-03-10 03:00:00+03"]',
|
|
'$[*].datetime() ? (@ >= "10.03.2017".datetime("dd.mm.yyyy"))');
|
|
jsonb_path_query_tz
|
|
-----------------------------
|
|
"2017-03-10"
|
|
"2017-03-11"
|
|
"2017-03-10T00:00:00"
|
|
"2017-03-10T12:34:56"
|
|
"2017-03-10T03:00:00+03:00"
|
|
(5 rows)
|
|
|
|
select jsonb_path_query_tz(
|
|
'["2017-03-10", "2017-03-11", "2017-03-09", "12:34:56", "01:02:03+04", "2017-03-10 00:00:00", "2017-03-10 12:34:56", "2017-03-10 01:02:03+04", "2017-03-10 03:00:00+03"]',
|
|
'$[*].datetime() ? (@ < "10.03.2017".datetime("dd.mm.yyyy"))');
|
|
jsonb_path_query_tz
|
|
-----------------------------
|
|
"2017-03-09"
|
|
"2017-03-10T01:02:03+04:00"
|
|
(2 rows)
|
|
|
|
-- time comparison
|
|
select jsonb_path_query(
|
|
'["12:34:00", "12:35:00", "12:36:00", "12:35:00+00", "12:35:00+01", "13:35:00+01", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00+01"]',
|
|
'$[*].datetime() ? (@ == "12:35".datetime("HH24:MI"))');
|
|
ERROR: cannot convert value from time to timetz without time zone usage
|
|
HINT: Use *_tz() function for time zone support.
|
|
select jsonb_path_query(
|
|
'["12:34:00", "12:35:00", "12:36:00", "12:35:00+00", "12:35:00+01", "13:35:00+01", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00+01"]',
|
|
'$[*].datetime() ? (@ >= "12:35".datetime("HH24:MI"))');
|
|
ERROR: cannot convert value from time to timetz without time zone usage
|
|
HINT: Use *_tz() function for time zone support.
|
|
select jsonb_path_query(
|
|
'["12:34:00", "12:35:00", "12:36:00", "12:35:00+00", "12:35:00+01", "13:35:00+01", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00+01"]',
|
|
'$[*].datetime() ? (@ < "12:35".datetime("HH24:MI"))');
|
|
ERROR: cannot convert value from time to timetz without time zone usage
|
|
HINT: Use *_tz() function for time zone support.
|
|
select jsonb_path_query_tz(
|
|
'["12:34:00", "12:35:00", "12:36:00", "12:35:00+00", "12:35:00+01", "13:35:00+01", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00+01"]',
|
|
'$[*].datetime() ? (@ == "12:35".datetime("HH24:MI"))');
|
|
jsonb_path_query_tz
|
|
---------------------
|
|
"12:35:00"
|
|
"12:35:00+00:00"
|
|
(2 rows)
|
|
|
|
select jsonb_path_query_tz(
|
|
'["12:34:00", "12:35:00", "12:36:00", "12:35:00+00", "12:35:00+01", "13:35:00+01", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00+01"]',
|
|
'$[*].datetime() ? (@ >= "12:35".datetime("HH24:MI"))');
|
|
jsonb_path_query_tz
|
|
---------------------
|
|
"12:35:00"
|
|
"12:36:00"
|
|
"12:35:00+00:00"
|
|
(3 rows)
|
|
|
|
select jsonb_path_query_tz(
|
|
'["12:34:00", "12:35:00", "12:36:00", "12:35:00+00", "12:35:00+01", "13:35:00+01", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00+01"]',
|
|
'$[*].datetime() ? (@ < "12:35".datetime("HH24:MI"))');
|
|
jsonb_path_query_tz
|
|
---------------------
|
|
"12:34:00"
|
|
"12:35:00+01:00"
|
|
"13:35:00+01:00"
|
|
(3 rows)
|
|
|
|
-- timetz comparison
|
|
select jsonb_path_query(
|
|
'["12:34:00+01", "12:35:00+01", "12:36:00+01", "12:35:00+02", "12:35:00-02", "10:35:00", "11:35:00", "12:35:00", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00 +1"]',
|
|
'$[*].datetime() ? (@ == "12:35 +1".datetime("HH24:MI TZH"))');
|
|
ERROR: cannot convert value from time to timetz without time zone usage
|
|
HINT: Use *_tz() function for time zone support.
|
|
select jsonb_path_query(
|
|
'["12:34:00+01", "12:35:00+01", "12:36:00+01", "12:35:00+02", "12:35:00-02", "10:35:00", "11:35:00", "12:35:00", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00 +1"]',
|
|
'$[*].datetime() ? (@ >= "12:35 +1".datetime("HH24:MI TZH"))');
|
|
ERROR: cannot convert value from time to timetz without time zone usage
|
|
HINT: Use *_tz() function for time zone support.
|
|
select jsonb_path_query(
|
|
'["12:34:00+01", "12:35:00+01", "12:36:00+01", "12:35:00+02", "12:35:00-02", "10:35:00", "11:35:00", "12:35:00", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00 +1"]',
|
|
'$[*].datetime() ? (@ < "12:35 +1".datetime("HH24:MI TZH"))');
|
|
ERROR: cannot convert value from time to timetz without time zone usage
|
|
HINT: Use *_tz() function for time zone support.
|
|
select jsonb_path_query_tz(
|
|
'["12:34:00+01", "12:35:00+01", "12:36:00+01", "12:35:00+02", "12:35:00-02", "10:35:00", "11:35:00", "12:35:00", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00 +1"]',
|
|
'$[*].datetime() ? (@ == "12:35 +1".datetime("HH24:MI TZH"))');
|
|
jsonb_path_query_tz
|
|
---------------------
|
|
"12:35:00+01:00"
|
|
(1 row)
|
|
|
|
select jsonb_path_query_tz(
|
|
'["12:34:00+01", "12:35:00+01", "12:36:00+01", "12:35:00+02", "12:35:00-02", "10:35:00", "11:35:00", "12:35:00", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00 +1"]',
|
|
'$[*].datetime() ? (@ >= "12:35 +1".datetime("HH24:MI TZH"))');
|
|
jsonb_path_query_tz
|
|
---------------------
|
|
"12:35:00+01:00"
|
|
"12:36:00+01:00"
|
|
"12:35:00-02:00"
|
|
"11:35:00"
|
|
"12:35:00"
|
|
(5 rows)
|
|
|
|
select jsonb_path_query_tz(
|
|
'["12:34:00+01", "12:35:00+01", "12:36:00+01", "12:35:00+02", "12:35:00-02", "10:35:00", "11:35:00", "12:35:00", "2017-03-10", "2017-03-10 12:35:00", "2017-03-10 12:35:00 +1"]',
|
|
'$[*].datetime() ? (@ < "12:35 +1".datetime("HH24:MI TZH"))');
|
|
jsonb_path_query_tz
|
|
---------------------
|
|
"12:34:00+01:00"
|
|
"12:35:00+02:00"
|
|
"10:35:00"
|
|
(3 rows)
|
|
|
|
-- timestamp comparison
|
|
select jsonb_path_query(
|
|
'["2017-03-10 12:34:00", "2017-03-10 12:35:00", "2017-03-10 12:36:00", "2017-03-10 12:35:00+01", "2017-03-10 13:35:00+01", "2017-03-10 12:35:00-01", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]',
|
|
'$[*].datetime() ? (@ == "10.03.2017 12:35".datetime("dd.mm.yyyy HH24:MI"))');
|
|
ERROR: cannot convert value from timestamp to timestamptz without time zone usage
|
|
HINT: Use *_tz() function for time zone support.
|
|
select jsonb_path_query(
|
|
'["2017-03-10 12:34:00", "2017-03-10 12:35:00", "2017-03-10 12:36:00", "2017-03-10 12:35:00+01", "2017-03-10 13:35:00+01", "2017-03-10 12:35:00-01", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]',
|
|
'$[*].datetime() ? (@ >= "10.03.2017 12:35".datetime("dd.mm.yyyy HH24:MI"))');
|
|
ERROR: cannot convert value from timestamp to timestamptz without time zone usage
|
|
HINT: Use *_tz() function for time zone support.
|
|
select jsonb_path_query(
|
|
'["2017-03-10 12:34:00", "2017-03-10 12:35:00", "2017-03-10 12:36:00", "2017-03-10 12:35:00+01", "2017-03-10 13:35:00+01", "2017-03-10 12:35:00-01", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]',
|
|
'$[*].datetime() ? (@ < "10.03.2017 12:35".datetime("dd.mm.yyyy HH24:MI"))');
|
|
ERROR: cannot convert value from timestamp to timestamptz without time zone usage
|
|
HINT: Use *_tz() function for time zone support.
|
|
select jsonb_path_query_tz(
|
|
'["2017-03-10 12:34:00", "2017-03-10 12:35:00", "2017-03-10 12:36:00", "2017-03-10 12:35:00+01", "2017-03-10 13:35:00+01", "2017-03-10 12:35:00-01", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]',
|
|
'$[*].datetime() ? (@ == "10.03.2017 12:35".datetime("dd.mm.yyyy HH24:MI"))');
|
|
jsonb_path_query_tz
|
|
-----------------------------
|
|
"2017-03-10T12:35:00"
|
|
"2017-03-10T13:35:00+01:00"
|
|
(2 rows)
|
|
|
|
select jsonb_path_query_tz(
|
|
'["2017-03-10 12:34:00", "2017-03-10 12:35:00", "2017-03-10 12:36:00", "2017-03-10 12:35:00+01", "2017-03-10 13:35:00+01", "2017-03-10 12:35:00-01", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]',
|
|
'$[*].datetime() ? (@ >= "10.03.2017 12:35".datetime("dd.mm.yyyy HH24:MI"))');
|
|
jsonb_path_query_tz
|
|
-----------------------------
|
|
"2017-03-10T12:35:00"
|
|
"2017-03-10T12:36:00"
|
|
"2017-03-10T13:35:00+01:00"
|
|
"2017-03-10T12:35:00-01:00"
|
|
"2017-03-11"
|
|
(5 rows)
|
|
|
|
select jsonb_path_query_tz(
|
|
'["2017-03-10 12:34:00", "2017-03-10 12:35:00", "2017-03-10 12:36:00", "2017-03-10 12:35:00+01", "2017-03-10 13:35:00+01", "2017-03-10 12:35:00-01", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]',
|
|
'$[*].datetime() ? (@ < "10.03.2017 12:35".datetime("dd.mm.yyyy HH24:MI"))');
|
|
jsonb_path_query_tz
|
|
-----------------------------
|
|
"2017-03-10T12:34:00"
|
|
"2017-03-10T12:35:00+01:00"
|
|
"2017-03-10"
|
|
(3 rows)
|
|
|
|
-- timestamptz comparison
|
|
select jsonb_path_query(
|
|
'["2017-03-10 12:34:00+01", "2017-03-10 12:35:00+01", "2017-03-10 12:36:00+01", "2017-03-10 12:35:00+02", "2017-03-10 12:35:00-02", "2017-03-10 10:35:00", "2017-03-10 11:35:00", "2017-03-10 12:35:00", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]',
|
|
'$[*].datetime() ? (@ == "10.03.2017 12:35 +1".datetime("dd.mm.yyyy HH24:MI TZH"))');
|
|
ERROR: cannot convert value from timestamp to timestamptz without time zone usage
|
|
HINT: Use *_tz() function for time zone support.
|
|
select jsonb_path_query(
|
|
'["2017-03-10 12:34:00+01", "2017-03-10 12:35:00+01", "2017-03-10 12:36:00+01", "2017-03-10 12:35:00+02", "2017-03-10 12:35:00-02", "2017-03-10 10:35:00", "2017-03-10 11:35:00", "2017-03-10 12:35:00", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]',
|
|
'$[*].datetime() ? (@ >= "10.03.2017 12:35 +1".datetime("dd.mm.yyyy HH24:MI TZH"))');
|
|
ERROR: cannot convert value from timestamp to timestamptz without time zone usage
|
|
HINT: Use *_tz() function for time zone support.
|
|
select jsonb_path_query(
|
|
'["2017-03-10 12:34:00+01", "2017-03-10 12:35:00+01", "2017-03-10 12:36:00+01", "2017-03-10 12:35:00+02", "2017-03-10 12:35:00-02", "2017-03-10 10:35:00", "2017-03-10 11:35:00", "2017-03-10 12:35:00", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]',
|
|
'$[*].datetime() ? (@ < "10.03.2017 12:35 +1".datetime("dd.mm.yyyy HH24:MI TZH"))');
|
|
ERROR: cannot convert value from timestamp to timestamptz without time zone usage
|
|
HINT: Use *_tz() function for time zone support.
|
|
select jsonb_path_query_tz(
|
|
'["2017-03-10 12:34:00+01", "2017-03-10 12:35:00+01", "2017-03-10 12:36:00+01", "2017-03-10 12:35:00+02", "2017-03-10 12:35:00-02", "2017-03-10 10:35:00", "2017-03-10 11:35:00", "2017-03-10 12:35:00", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]',
|
|
'$[*].datetime() ? (@ == "10.03.2017 12:35 +1".datetime("dd.mm.yyyy HH24:MI TZH"))');
|
|
jsonb_path_query_tz
|
|
-----------------------------
|
|
"2017-03-10T12:35:00+01:00"
|
|
"2017-03-10T11:35:00"
|
|
(2 rows)
|
|
|
|
select jsonb_path_query_tz(
|
|
'["2017-03-10 12:34:00+01", "2017-03-10 12:35:00+01", "2017-03-10 12:36:00+01", "2017-03-10 12:35:00+02", "2017-03-10 12:35:00-02", "2017-03-10 10:35:00", "2017-03-10 11:35:00", "2017-03-10 12:35:00", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]',
|
|
'$[*].datetime() ? (@ >= "10.03.2017 12:35 +1".datetime("dd.mm.yyyy HH24:MI TZH"))');
|
|
jsonb_path_query_tz
|
|
-----------------------------
|
|
"2017-03-10T12:35:00+01:00"
|
|
"2017-03-10T12:36:00+01:00"
|
|
"2017-03-10T12:35:00-02:00"
|
|
"2017-03-10T11:35:00"
|
|
"2017-03-10T12:35:00"
|
|
"2017-03-11"
|
|
(6 rows)
|
|
|
|
select jsonb_path_query_tz(
|
|
'["2017-03-10 12:34:00+01", "2017-03-10 12:35:00+01", "2017-03-10 12:36:00+01", "2017-03-10 12:35:00+02", "2017-03-10 12:35:00-02", "2017-03-10 10:35:00", "2017-03-10 11:35:00", "2017-03-10 12:35:00", "2017-03-10", "2017-03-11", "12:34:56", "12:34:56+01"]',
|
|
'$[*].datetime() ? (@ < "10.03.2017 12:35 +1".datetime("dd.mm.yyyy HH24:MI TZH"))');
|
|
jsonb_path_query_tz
|
|
-----------------------------
|
|
"2017-03-10T12:34:00+01:00"
|
|
"2017-03-10T12:35:00+02:00"
|
|
"2017-03-10T10:35:00"
|
|
"2017-03-10"
|
|
(4 rows)
|
|
|
|
-- overflow during comparison
|
|
select jsonb_path_query('"1000000-01-01"', '$.datetime() > "2020-01-01 12:00:00".datetime()'::jsonpath);
|
|
jsonb_path_query
|
|
------------------
|
|
true
|
|
(1 row)
|
|
|
|
set time zone default;
|
|
-- jsonpath operators
|
|
SELECT jsonb_path_query('[{"a": 1}, {"a": 2}]', '$[*]');
|
|
jsonb_path_query
|
|
------------------
|
|
{"a": 1}
|
|
{"a": 2}
|
|
(2 rows)
|
|
|
|
SELECT jsonb_path_query('[{"a": 1}, {"a": 2}]', '$[*] ? (@.a > 10)');
|
|
jsonb_path_query
|
|
------------------
|
|
(0 rows)
|
|
|
|
SELECT jsonb_path_query('[{"a": 1}]', '$undefined_var');
|
|
ERROR: could not find jsonpath variable "undefined_var"
|
|
SELECT jsonb_path_query('[{"a": 1}]', 'false');
|
|
jsonb_path_query
|
|
------------------
|
|
false
|
|
(1 row)
|
|
|
|
SELECT jsonb_path_query_array('[{"a": 1}, {"a": 2}, {}]', 'strict $[*].a');
|
|
ERROR: JSON object does not contain key "a"
|
|
SELECT jsonb_path_query_array('[{"a": 1}, {"a": 2}]', '$[*].a');
|
|
jsonb_path_query_array
|
|
------------------------
|
|
[1, 2]
|
|
(1 row)
|
|
|
|
SELECT jsonb_path_query_array('[{"a": 1}, {"a": 2}]', '$[*].a ? (@ == 1)');
|
|
jsonb_path_query_array
|
|
------------------------
|
|
[1]
|
|
(1 row)
|
|
|
|
SELECT jsonb_path_query_array('[{"a": 1}, {"a": 2}]', '$[*].a ? (@ > 10)');
|
|
jsonb_path_query_array
|
|
------------------------
|
|
[]
|
|
(1 row)
|
|
|
|
SELECT jsonb_path_query_array('[{"a": 1}, {"a": 2}, {"a": 3}, {"a": 5}]', '$[*].a ? (@ > $min && @ < $max)', vars => '{"min": 1, "max": 4}');
|
|
jsonb_path_query_array
|
|
------------------------
|
|
[2, 3]
|
|
(1 row)
|
|
|
|
SELECT jsonb_path_query_array('[{"a": 1}, {"a": 2}, {"a": 3}, {"a": 5}]', '$[*].a ? (@ > $min && @ < $max)', vars => '{"min": 3, "max": 4}');
|
|
jsonb_path_query_array
|
|
------------------------
|
|
[]
|
|
(1 row)
|
|
|
|
SELECT jsonb_path_query_first('[{"a": 1}, {"a": 2}, {}]', 'strict $[*].a');
|
|
ERROR: JSON object does not contain key "a"
|
|
SELECT jsonb_path_query_first('[{"a": 1}, {"a": 2}, {}]', 'strict $[*].a', silent => true);
|
|
jsonb_path_query_first
|
|
------------------------
|
|
1
|
|
(1 row)
|
|
|
|
SELECT jsonb_path_query_first('[{"a": 1}, {"a": 2}]', '$[*].a');
|
|
jsonb_path_query_first
|
|
------------------------
|
|
1
|
|
(1 row)
|
|
|
|
SELECT jsonb_path_query_first('[{"a": 1}, {"a": 2}]', '$[*].a ? (@ == 1)');
|
|
jsonb_path_query_first
|
|
------------------------
|
|
1
|
|
(1 row)
|
|
|
|
SELECT jsonb_path_query_first('[{"a": 1}, {"a": 2}]', '$[*].a ? (@ > 10)');
|
|
jsonb_path_query_first
|
|
------------------------
|
|
|
|
(1 row)
|
|
|
|
SELECT jsonb_path_query_first('[{"a": 1}, {"a": 2}, {"a": 3}, {"a": 5}]', '$[*].a ? (@ > $min && @ < $max)', vars => '{"min": 1, "max": 4}');
|
|
jsonb_path_query_first
|
|
------------------------
|
|
2
|
|
(1 row)
|
|
|
|
SELECT jsonb_path_query_first('[{"a": 1}, {"a": 2}, {"a": 3}, {"a": 5}]', '$[*].a ? (@ > $min && @ < $max)', vars => '{"min": 3, "max": 4}');
|
|
jsonb_path_query_first
|
|
------------------------
|
|
|
|
(1 row)
|
|
|
|
SELECT jsonb_path_query_first('[{"a": 1}]', '$undefined_var');
|
|
ERROR: could not find jsonpath variable "undefined_var"
|
|
SELECT jsonb_path_query_first('[{"a": 1}]', 'false');
|
|
jsonb_path_query_first
|
|
------------------------
|
|
false
|
|
(1 row)
|
|
|
|
SELECT jsonb '[{"a": 1}, {"a": 2}]' @? '$[*].a ? (@ > 1)';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
SELECT jsonb '[{"a": 1}, {"a": 2}]' @? '$[*] ? (@.a > 2)';
|
|
?column?
|
|
----------
|
|
f
|
|
(1 row)
|
|
|
|
SELECT jsonb_path_exists('[{"a": 1}, {"a": 2}]', '$[*].a ? (@ > 1)');
|
|
jsonb_path_exists
|
|
-------------------
|
|
t
|
|
(1 row)
|
|
|
|
SELECT jsonb_path_exists('[{"a": 1}, {"a": 2}, {"a": 3}, {"a": 5}]', '$[*] ? (@.a > $min && @.a < $max)', vars => '{"min": 1, "max": 4}');
|
|
jsonb_path_exists
|
|
-------------------
|
|
t
|
|
(1 row)
|
|
|
|
SELECT jsonb_path_exists('[{"a": 1}, {"a": 2}, {"a": 3}, {"a": 5}]', '$[*] ? (@.a > $min && @.a < $max)', vars => '{"min": 3, "max": 4}');
|
|
jsonb_path_exists
|
|
-------------------
|
|
f
|
|
(1 row)
|
|
|
|
SELECT jsonb_path_exists('[{"a": 1}]', '$undefined_var');
|
|
ERROR: could not find jsonpath variable "undefined_var"
|
|
SELECT jsonb_path_exists('[{"a": 1}]', 'false');
|
|
jsonb_path_exists
|
|
-------------------
|
|
t
|
|
(1 row)
|
|
|
|
SELECT jsonb_path_match('true', '$', silent => false);
|
|
jsonb_path_match
|
|
------------------
|
|
t
|
|
(1 row)
|
|
|
|
SELECT jsonb_path_match('false', '$', silent => false);
|
|
jsonb_path_match
|
|
------------------
|
|
f
|
|
(1 row)
|
|
|
|
SELECT jsonb_path_match('null', '$', silent => false);
|
|
jsonb_path_match
|
|
------------------
|
|
|
|
(1 row)
|
|
|
|
SELECT jsonb_path_match('1', '$', silent => true);
|
|
jsonb_path_match
|
|
------------------
|
|
|
|
(1 row)
|
|
|
|
SELECT jsonb_path_match('1', '$', silent => false);
|
|
ERROR: single boolean result is expected
|
|
SELECT jsonb_path_match('"a"', '$', silent => false);
|
|
ERROR: single boolean result is expected
|
|
SELECT jsonb_path_match('{}', '$', silent => false);
|
|
ERROR: single boolean result is expected
|
|
SELECT jsonb_path_match('[true]', '$', silent => false);
|
|
ERROR: single boolean result is expected
|
|
SELECT jsonb_path_match('{}', 'lax $.a', silent => false);
|
|
ERROR: single boolean result is expected
|
|
SELECT jsonb_path_match('{}', 'strict $.a', silent => false);
|
|
ERROR: JSON object does not contain key "a"
|
|
SELECT jsonb_path_match('{}', 'strict $.a', silent => true);
|
|
jsonb_path_match
|
|
------------------
|
|
|
|
(1 row)
|
|
|
|
SELECT jsonb_path_match('[true, true]', '$[*]', silent => false);
|
|
ERROR: single boolean result is expected
|
|
SELECT jsonb '[{"a": 1}, {"a": 2}]' @@ '$[*].a > 1';
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
SELECT jsonb '[{"a": 1}, {"a": 2}]' @@ '$[*].a > 2';
|
|
?column?
|
|
----------
|
|
f
|
|
(1 row)
|
|
|
|
SELECT jsonb_path_match('[{"a": 1}, {"a": 2}]', '$[*].a > 1');
|
|
jsonb_path_match
|
|
------------------
|
|
t
|
|
(1 row)
|
|
|
|
SELECT jsonb_path_match('[{"a": 1}]', '$undefined_var');
|
|
ERROR: could not find jsonpath variable "undefined_var"
|
|
SELECT jsonb_path_match('[{"a": 1}]', 'false');
|
|
jsonb_path_match
|
|
------------------
|
|
f
|
|
(1 row)
|
|
|
|
-- test string comparison (Unicode codepoint collation)
|
|
WITH str(j, num) AS
|
|
(
|
|
SELECT jsonb_build_object('s', s), num
|
|
FROM unnest('{"", "a", "ab", "abc", "abcd", "b", "A", "AB", "ABC", "ABc", "ABcD", "B"}'::text[]) WITH ORDINALITY AS a(s, num)
|
|
)
|
|
SELECT
|
|
s1.j, s2.j,
|
|
jsonb_path_query_first(s1.j, '$.s < $s', vars => s2.j) lt,
|
|
jsonb_path_query_first(s1.j, '$.s <= $s', vars => s2.j) le,
|
|
jsonb_path_query_first(s1.j, '$.s == $s', vars => s2.j) eq,
|
|
jsonb_path_query_first(s1.j, '$.s >= $s', vars => s2.j) ge,
|
|
jsonb_path_query_first(s1.j, '$.s > $s', vars => s2.j) gt
|
|
FROM str s1, str s2
|
|
ORDER BY s1.num, s2.num;
|
|
j | j | lt | le | eq | ge | gt
|
|
---------------+---------------+-------+-------+-------+-------+-------
|
|
{"s": ""} | {"s": ""} | false | true | true | true | false
|
|
{"s": ""} | {"s": "a"} | true | true | false | false | false
|
|
{"s": ""} | {"s": "ab"} | true | true | false | false | false
|
|
{"s": ""} | {"s": "abc"} | true | true | false | false | false
|
|
{"s": ""} | {"s": "abcd"} | true | true | false | false | false
|
|
{"s": ""} | {"s": "b"} | true | true | false | false | false
|
|
{"s": ""} | {"s": "A"} | true | true | false | false | false
|
|
{"s": ""} | {"s": "AB"} | true | true | false | false | false
|
|
{"s": ""} | {"s": "ABC"} | true | true | false | false | false
|
|
{"s": ""} | {"s": "ABc"} | true | true | false | false | false
|
|
{"s": ""} | {"s": "ABcD"} | true | true | false | false | false
|
|
{"s": ""} | {"s": "B"} | true | true | false | false | false
|
|
{"s": "a"} | {"s": ""} | false | false | false | true | true
|
|
{"s": "a"} | {"s": "a"} | false | true | true | true | false
|
|
{"s": "a"} | {"s": "ab"} | true | true | false | false | false
|
|
{"s": "a"} | {"s": "abc"} | true | true | false | false | false
|
|
{"s": "a"} | {"s": "abcd"} | true | true | false | false | false
|
|
{"s": "a"} | {"s": "b"} | true | true | false | false | false
|
|
{"s": "a"} | {"s": "A"} | false | false | false | true | true
|
|
{"s": "a"} | {"s": "AB"} | false | false | false | true | true
|
|
{"s": "a"} | {"s": "ABC"} | false | false | false | true | true
|
|
{"s": "a"} | {"s": "ABc"} | false | false | false | true | true
|
|
{"s": "a"} | {"s": "ABcD"} | false | false | false | true | true
|
|
{"s": "a"} | {"s": "B"} | false | false | false | true | true
|
|
{"s": "ab"} | {"s": ""} | false | false | false | true | true
|
|
{"s": "ab"} | {"s": "a"} | false | false | false | true | true
|
|
{"s": "ab"} | {"s": "ab"} | false | true | true | true | false
|
|
{"s": "ab"} | {"s": "abc"} | true | true | false | false | false
|
|
{"s": "ab"} | {"s": "abcd"} | true | true | false | false | false
|
|
{"s": "ab"} | {"s": "b"} | true | true | false | false | false
|
|
{"s": "ab"} | {"s": "A"} | false | false | false | true | true
|
|
{"s": "ab"} | {"s": "AB"} | false | false | false | true | true
|
|
{"s": "ab"} | {"s": "ABC"} | false | false | false | true | true
|
|
{"s": "ab"} | {"s": "ABc"} | false | false | false | true | true
|
|
{"s": "ab"} | {"s": "ABcD"} | false | false | false | true | true
|
|
{"s": "ab"} | {"s": "B"} | false | false | false | true | true
|
|
{"s": "abc"} | {"s": ""} | false | false | false | true | true
|
|
{"s": "abc"} | {"s": "a"} | false | false | false | true | true
|
|
{"s": "abc"} | {"s": "ab"} | false | false | false | true | true
|
|
{"s": "abc"} | {"s": "abc"} | false | true | true | true | false
|
|
{"s": "abc"} | {"s": "abcd"} | true | true | false | false | false
|
|
{"s": "abc"} | {"s": "b"} | true | true | false | false | false
|
|
{"s": "abc"} | {"s": "A"} | false | false | false | true | true
|
|
{"s": "abc"} | {"s": "AB"} | false | false | false | true | true
|
|
{"s": "abc"} | {"s": "ABC"} | false | false | false | true | true
|
|
{"s": "abc"} | {"s": "ABc"} | false | false | false | true | true
|
|
{"s": "abc"} | {"s": "ABcD"} | false | false | false | true | true
|
|
{"s": "abc"} | {"s": "B"} | false | false | false | true | true
|
|
{"s": "abcd"} | {"s": ""} | false | false | false | true | true
|
|
{"s": "abcd"} | {"s": "a"} | false | false | false | true | true
|
|
{"s": "abcd"} | {"s": "ab"} | false | false | false | true | true
|
|
{"s": "abcd"} | {"s": "abc"} | false | false | false | true | true
|
|
{"s": "abcd"} | {"s": "abcd"} | false | true | true | true | false
|
|
{"s": "abcd"} | {"s": "b"} | true | true | false | false | false
|
|
{"s": "abcd"} | {"s": "A"} | false | false | false | true | true
|
|
{"s": "abcd"} | {"s": "AB"} | false | false | false | true | true
|
|
{"s": "abcd"} | {"s": "ABC"} | false | false | false | true | true
|
|
{"s": "abcd"} | {"s": "ABc"} | false | false | false | true | true
|
|
{"s": "abcd"} | {"s": "ABcD"} | false | false | false | true | true
|
|
{"s": "abcd"} | {"s": "B"} | false | false | false | true | true
|
|
{"s": "b"} | {"s": ""} | false | false | false | true | true
|
|
{"s": "b"} | {"s": "a"} | false | false | false | true | true
|
|
{"s": "b"} | {"s": "ab"} | false | false | false | true | true
|
|
{"s": "b"} | {"s": "abc"} | false | false | false | true | true
|
|
{"s": "b"} | {"s": "abcd"} | false | false | false | true | true
|
|
{"s": "b"} | {"s": "b"} | false | true | true | true | false
|
|
{"s": "b"} | {"s": "A"} | false | false | false | true | true
|
|
{"s": "b"} | {"s": "AB"} | false | false | false | true | true
|
|
{"s": "b"} | {"s": "ABC"} | false | false | false | true | true
|
|
{"s": "b"} | {"s": "ABc"} | false | false | false | true | true
|
|
{"s": "b"} | {"s": "ABcD"} | false | false | false | true | true
|
|
{"s": "b"} | {"s": "B"} | false | false | false | true | true
|
|
{"s": "A"} | {"s": ""} | false | false | false | true | true
|
|
{"s": "A"} | {"s": "a"} | true | true | false | false | false
|
|
{"s": "A"} | {"s": "ab"} | true | true | false | false | false
|
|
{"s": "A"} | {"s": "abc"} | true | true | false | false | false
|
|
{"s": "A"} | {"s": "abcd"} | true | true | false | false | false
|
|
{"s": "A"} | {"s": "b"} | true | true | false | false | false
|
|
{"s": "A"} | {"s": "A"} | false | true | true | true | false
|
|
{"s": "A"} | {"s": "AB"} | true | true | false | false | false
|
|
{"s": "A"} | {"s": "ABC"} | true | true | false | false | false
|
|
{"s": "A"} | {"s": "ABc"} | true | true | false | false | false
|
|
{"s": "A"} | {"s": "ABcD"} | true | true | false | false | false
|
|
{"s": "A"} | {"s": "B"} | true | true | false | false | false
|
|
{"s": "AB"} | {"s": ""} | false | false | false | true | true
|
|
{"s": "AB"} | {"s": "a"} | true | true | false | false | false
|
|
{"s": "AB"} | {"s": "ab"} | true | true | false | false | false
|
|
{"s": "AB"} | {"s": "abc"} | true | true | false | false | false
|
|
{"s": "AB"} | {"s": "abcd"} | true | true | false | false | false
|
|
{"s": "AB"} | {"s": "b"} | true | true | false | false | false
|
|
{"s": "AB"} | {"s": "A"} | false | false | false | true | true
|
|
{"s": "AB"} | {"s": "AB"} | false | true | true | true | false
|
|
{"s": "AB"} | {"s": "ABC"} | true | true | false | false | false
|
|
{"s": "AB"} | {"s": "ABc"} | true | true | false | false | false
|
|
{"s": "AB"} | {"s": "ABcD"} | true | true | false | false | false
|
|
{"s": "AB"} | {"s": "B"} | true | true | false | false | false
|
|
{"s": "ABC"} | {"s": ""} | false | false | false | true | true
|
|
{"s": "ABC"} | {"s": "a"} | true | true | false | false | false
|
|
{"s": "ABC"} | {"s": "ab"} | true | true | false | false | false
|
|
{"s": "ABC"} | {"s": "abc"} | true | true | false | false | false
|
|
{"s": "ABC"} | {"s": "abcd"} | true | true | false | false | false
|
|
{"s": "ABC"} | {"s": "b"} | true | true | false | false | false
|
|
{"s": "ABC"} | {"s": "A"} | false | false | false | true | true
|
|
{"s": "ABC"} | {"s": "AB"} | false | false | false | true | true
|
|
{"s": "ABC"} | {"s": "ABC"} | false | true | true | true | false
|
|
{"s": "ABC"} | {"s": "ABc"} | true | true | false | false | false
|
|
{"s": "ABC"} | {"s": "ABcD"} | true | true | false | false | false
|
|
{"s": "ABC"} | {"s": "B"} | true | true | false | false | false
|
|
{"s": "ABc"} | {"s": ""} | false | false | false | true | true
|
|
{"s": "ABc"} | {"s": "a"} | true | true | false | false | false
|
|
{"s": "ABc"} | {"s": "ab"} | true | true | false | false | false
|
|
{"s": "ABc"} | {"s": "abc"} | true | true | false | false | false
|
|
{"s": "ABc"} | {"s": "abcd"} | true | true | false | false | false
|
|
{"s": "ABc"} | {"s": "b"} | true | true | false | false | false
|
|
{"s": "ABc"} | {"s": "A"} | false | false | false | true | true
|
|
{"s": "ABc"} | {"s": "AB"} | false | false | false | true | true
|
|
{"s": "ABc"} | {"s": "ABC"} | false | false | false | true | true
|
|
{"s": "ABc"} | {"s": "ABc"} | false | true | true | true | false
|
|
{"s": "ABc"} | {"s": "ABcD"} | true | true | false | false | false
|
|
{"s": "ABc"} | {"s": "B"} | true | true | false | false | false
|
|
{"s": "ABcD"} | {"s": ""} | false | false | false | true | true
|
|
{"s": "ABcD"} | {"s": "a"} | true | true | false | false | false
|
|
{"s": "ABcD"} | {"s": "ab"} | true | true | false | false | false
|
|
{"s": "ABcD"} | {"s": "abc"} | true | true | false | false | false
|
|
{"s": "ABcD"} | {"s": "abcd"} | true | true | false | false | false
|
|
{"s": "ABcD"} | {"s": "b"} | true | true | false | false | false
|
|
{"s": "ABcD"} | {"s": "A"} | false | false | false | true | true
|
|
{"s": "ABcD"} | {"s": "AB"} | false | false | false | true | true
|
|
{"s": "ABcD"} | {"s": "ABC"} | false | false | false | true | true
|
|
{"s": "ABcD"} | {"s": "ABc"} | false | false | false | true | true
|
|
{"s": "ABcD"} | {"s": "ABcD"} | false | true | true | true | false
|
|
{"s": "ABcD"} | {"s": "B"} | true | true | false | false | false
|
|
{"s": "B"} | {"s": ""} | false | false | false | true | true
|
|
{"s": "B"} | {"s": "a"} | true | true | false | false | false
|
|
{"s": "B"} | {"s": "ab"} | true | true | false | false | false
|
|
{"s": "B"} | {"s": "abc"} | true | true | false | false | false
|
|
{"s": "B"} | {"s": "abcd"} | true | true | false | false | false
|
|
{"s": "B"} | {"s": "b"} | true | true | false | false | false
|
|
{"s": "B"} | {"s": "A"} | false | false | false | true | true
|
|
{"s": "B"} | {"s": "AB"} | false | false | false | true | true
|
|
{"s": "B"} | {"s": "ABC"} | false | false | false | true | true
|
|
{"s": "B"} | {"s": "ABc"} | false | false | false | true | true
|
|
{"s": "B"} | {"s": "ABcD"} | false | false | false | true | true
|
|
{"s": "B"} | {"s": "B"} | false | true | true | true | false
|
|
(144 rows)
|
|
|