1
0
mirror of https://github.com/postgres/postgres.git synced 2025-05-11 05:41:32 +03:00
postgres/src/test/regress/expected/jsonb_jsonpath.out
Alexander Korotkov 4dc3f94fae Fix jsonpath existense checking of missing variables
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
2023-01-12 18:17:43 +03:00

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)