jsonb_jsonpath.sql 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587
  1. select jsonb '{"a": 12}' @? '$';
  2. select jsonb '{"a": 12}' @? '1';
  3. select jsonb '{"a": 12}' @? '$.a.b';
  4. select jsonb '{"a": 12}' @? '$.b';
  5. select jsonb '{"a": 12}' @? '$.a + 2';
  6. select jsonb '{"a": 12}' @? '$.b + 2';
  7. select jsonb '{"a": {"a": 12}}' @? '$.a.a';
  8. select jsonb '{"a": {"a": 12}}' @? '$.*.a';
  9. select jsonb '{"b": {"a": 12}}' @? '$.*.a';
  10. select jsonb '{"b": {"a": 12}}' @? '$.*.b';
  11. select jsonb '{"b": {"a": 12}}' @? 'strict $.*.b';
  12. select jsonb '{}' @? '$.*';
  13. select jsonb '{"a": 1}' @? '$.*';
  14. select jsonb '{"a": {"b": 1}}' @? 'lax $.**{1}';
  15. select jsonb '{"a": {"b": 1}}' @? 'lax $.**{2}';
  16. select jsonb '{"a": {"b": 1}}' @? 'lax $.**{3}';
  17. select jsonb '[]' @? '$[*]';
  18. select jsonb '[1]' @? '$[*]';
  19. select jsonb '[1]' @? '$[1]';
  20. select jsonb '[1]' @? 'strict $[1]';
  21. select jsonb_path_query('[1]', 'strict $[1]');
  22. select jsonb_path_query('[1]', 'strict $[1]', silent => true);
  23. select jsonb '[1]' @? 'lax $[10000000000000000]';
  24. select jsonb '[1]' @? 'strict $[10000000000000000]';
  25. select jsonb_path_query('[1]', 'lax $[10000000000000000]');
  26. select jsonb_path_query('[1]', 'strict $[10000000000000000]');
  27. select jsonb '[1]' @? '$[0]';
  28. select jsonb '[1]' @? '$[0.3]';
  29. select jsonb '[1]' @? '$[0.5]';
  30. select jsonb '[1]' @? '$[0.9]';
  31. select jsonb '[1]' @? '$[1.2]';
  32. select jsonb '[1]' @? 'strict $[1.2]';
  33. select jsonb '{"a": [1,2,3], "b": [3,4,5]}' @? '$ ? (@.a[*] > @.b[*])';
  34. select jsonb '{"a": [1,2,3], "b": [3,4,5]}' @? '$ ? (@.a[*] >= @.b[*])';
  35. select jsonb '{"a": [1,2,3], "b": [3,4,"5"]}' @? '$ ? (@.a[*] >= @.b[*])';
  36. select jsonb '{"a": [1,2,3], "b": [3,4,"5"]}' @? 'strict $ ? (@.a[*] >= @.b[*])';
  37. select jsonb '{"a": [1,2,3], "b": [3,4,null]}' @? '$ ? (@.a[*] >= @.b[*])';
  38. select jsonb '1' @? '$ ? ((@ == "1") is unknown)';
  39. select jsonb '1' @? '$ ? ((@ == 1) is unknown)';
  40. select jsonb '[{"a": 1}, {"a": 2}]' @? '$[0 to 1] ? (@.a > 1)';
  41. select jsonb_path_exists('[{"a": 1}, {"a": 2}, 3]', 'lax $[*].a', silent => false);
  42. select jsonb_path_exists('[{"a": 1}, {"a": 2}, 3]', 'lax $[*].a', silent => true);
  43. select jsonb_path_exists('[{"a": 1}, {"a": 2}, 3]', 'strict $[*].a', silent => false);
  44. select jsonb_path_exists('[{"a": 1}, {"a": 2}, 3]', 'strict $[*].a', silent => true);
  45. select jsonb_path_query('1', 'lax $.a');
  46. select jsonb_path_query('1', 'strict $.a');
  47. select jsonb_path_query('1', 'strict $.*');
  48. select jsonb_path_query('1', 'strict $.a', silent => true);
  49. select jsonb_path_query('1', 'strict $.*', silent => true);
  50. select jsonb_path_query('[]', 'lax $.a');
  51. select jsonb_path_query('[]', 'strict $.a');
  52. select jsonb_path_query('[]', 'strict $.a', silent => true);
  53. select jsonb_path_query('{}', 'lax $.a');
  54. select jsonb_path_query('{}', 'strict $.a');
  55. select jsonb_path_query('{}', 'strict $.a', silent => true);
  56. select jsonb_path_query('1', 'strict $[1]');
  57. select jsonb_path_query('1', 'strict $[*]');
  58. select jsonb_path_query('[]', 'strict $[1]');
  59. select jsonb_path_query('[]', 'strict $["a"]');
  60. select jsonb_path_query('1', 'strict $[1]', silent => true);
  61. select jsonb_path_query('1', 'strict $[*]', silent => true);
  62. select jsonb_path_query('[]', 'strict $[1]', silent => true);
  63. select jsonb_path_query('[]', 'strict $["a"]', silent => true);
  64. select jsonb_path_query('{"a": 12, "b": {"a": 13}}', '$.a');
  65. select jsonb_path_query('{"a": 12, "b": {"a": 13}}', '$.b');
  66. select jsonb_path_query('{"a": 12, "b": {"a": 13}}', '$.*');
  67. select jsonb_path_query('{"a": 12, "b": {"a": 13}}', 'lax $.*.a');
  68. select jsonb_path_query('[12, {"a": 13}, {"b": 14}]', 'lax $[*].a');
  69. select jsonb_path_query('[12, {"a": 13}, {"b": 14}]', 'lax $[*].*');
  70. select jsonb_path_query('[12, {"a": 13}, {"b": 14}]', 'lax $[0].a');
  71. select jsonb_path_query('[12, {"a": 13}, {"b": 14}]', 'lax $[1].a');
  72. select jsonb_path_query('[12, {"a": 13}, {"b": 14}]', 'lax $[2].a');
  73. select jsonb_path_query('[12, {"a": 13}, {"b": 14}]', 'lax $[0,1].a');
  74. select jsonb_path_query('[12, {"a": 13}, {"b": 14}]', 'lax $[0 to 10].a');
  75. select jsonb_path_query('[12, {"a": 13}, {"b": 14}]', 'lax $[0 to 10 / 0].a');
  76. select jsonb_path_query('[12, {"a": 13}, {"b": 14}, "ccc", true]', '$[2.5 - 1 to $.size() - 2]');
  77. select jsonb_path_query('1', 'lax $[0]');
  78. select jsonb_path_query('1', 'lax $[*]');
  79. select jsonb_path_query('[1]', 'lax $[0]');
  80. select jsonb_path_query('[1]', 'lax $[*]');
  81. select jsonb_path_query('[1,2,3]', 'lax $[*]');
  82. select jsonb_path_query('[1,2,3]', 'strict $[*].a');
  83. select jsonb_path_query('[1,2,3]', 'strict $[*].a', silent => true);
  84. select jsonb_path_query('[]', '$[last]');
  85. select jsonb_path_query('[]', '$[last ? (exists(last))]');
  86. select jsonb_path_query('[]', 'strict $[last]');
  87. select jsonb_path_query('[]', 'strict $[last]', silent => true);
  88. select jsonb_path_query('[1]', '$[last]');
  89. select jsonb_path_query('[1,2,3]', '$[last]');
  90. select jsonb_path_query('[1,2,3]', '$[last - 1]');
  91. select jsonb_path_query('[1,2,3]', '$[last ? (@.type() == "number")]');
  92. select jsonb_path_query('[1,2,3]', '$[last ? (@.type() == "string")]');
  93. select jsonb_path_query('[1,2,3]', '$[last ? (@.type() == "string")]', silent => true);
  94. select * from jsonb_path_query('{"a": 10}', '$');
  95. select * from jsonb_path_query('{"a": 10}', '$ ? (@.a < $value)');
  96. select * from jsonb_path_query('{"a": 10}', '$ ? (@.a < $value)', '1');
  97. select * from jsonb_path_query('{"a": 10}', '$ ? (@.a < $value)', '[{"value" : 13}]');
  98. select * from jsonb_path_query('{"a": 10}', '$ ? (@.a < $value)', '{"value" : 13}');
  99. select * from jsonb_path_query('{"a": 10}', '$ ? (@.a < $value)', '{"value" : 8}');
  100. select * from jsonb_path_query('{"a": 10}', '$.a ? (@ < $value)', '{"value" : 13}');
  101. select * from jsonb_path_query('[10,11,12,13,14,15]', '$[*] ? (@ < $value)', '{"value" : 13}');
  102. select * from jsonb_path_query('[10,11,12,13,14,15]', '$[0,1] ? (@ < $x.value)', '{"x": {"value" : 13}}');
  103. select * from jsonb_path_query('[10,11,12,13,14,15]', '$[0 to 2] ? (@ < $value)', '{"value" : 15}');
  104. select * from jsonb_path_query('[1,"1",2,"2",null]', '$[*] ? (@ == "1")');
  105. select * from jsonb_path_query('[1,"1",2,"2",null]', '$[*] ? (@ == $value)', '{"value" : "1"}');
  106. select * from jsonb_path_query('[1,"1",2,"2",null]', '$[*] ? (@ == $value)', '{"value" : null}');
  107. select * from jsonb_path_query('[1, "2", null]', '$[*] ? (@ != null)');
  108. select * from jsonb_path_query('[1, "2", null]', '$[*] ? (@ == null)');
  109. select * from jsonb_path_query('{}', '$ ? (@ == @)');
  110. select * from jsonb_path_query('[]', 'strict $ ? (@ == @)');
  111. select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**');
  112. select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{0}');
  113. select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{0 to last}');
  114. select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{1}');
  115. select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{1 to last}');
  116. select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{2}');
  117. select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{2 to last}');
  118. select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{3 to last}');
  119. select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{last}');
  120. select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**.b ? (@ > 0)');
  121. select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{0}.b ? (@ > 0)');
  122. select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{1}.b ? (@ > 0)');
  123. select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{0 to last}.b ? (@ > 0)');
  124. select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{1 to last}.b ? (@ > 0)');
  125. select jsonb_path_query('{"a": {"b": 1}}', 'lax $.**{1 to 2}.b ? (@ > 0)');
  126. select jsonb_path_query('{"a": {"c": {"b": 1}}}', 'lax $.**.b ? (@ > 0)');
  127. select jsonb_path_query('{"a": {"c": {"b": 1}}}', 'lax $.**{0}.b ? (@ > 0)');
  128. select jsonb_path_query('{"a": {"c": {"b": 1}}}', 'lax $.**{1}.b ? (@ > 0)');
  129. select jsonb_path_query('{"a": {"c": {"b": 1}}}', 'lax $.**{0 to last}.b ? (@ > 0)');
  130. select jsonb_path_query('{"a": {"c": {"b": 1}}}', 'lax $.**{1 to last}.b ? (@ > 0)');
  131. select jsonb_path_query('{"a": {"c": {"b": 1}}}', 'lax $.**{1 to 2}.b ? (@ > 0)');
  132. select jsonb_path_query('{"a": {"c": {"b": 1}}}', 'lax $.**{2 to 3}.b ? (@ > 0)');
  133. select jsonb '{"a": {"b": 1}}' @? '$.**.b ? ( @ > 0)';
  134. select jsonb '{"a": {"b": 1}}' @? '$.**{0}.b ? ( @ > 0)';
  135. select jsonb '{"a": {"b": 1}}' @? '$.**{1}.b ? ( @ > 0)';
  136. select jsonb '{"a": {"b": 1}}' @? '$.**{0 to last}.b ? ( @ > 0)';
  137. select jsonb '{"a": {"b": 1}}' @? '$.**{1 to last}.b ? ( @ > 0)';
  138. select jsonb '{"a": {"b": 1}}' @? '$.**{1 to 2}.b ? ( @ > 0)';
  139. select jsonb '{"a": {"c": {"b": 1}}}' @? '$.**.b ? ( @ > 0)';
  140. select jsonb '{"a": {"c": {"b": 1}}}' @? '$.**{0}.b ? ( @ > 0)';
  141. select jsonb '{"a": {"c": {"b": 1}}}' @? '$.**{1}.b ? ( @ > 0)';
  142. select jsonb '{"a": {"c": {"b": 1}}}' @? '$.**{0 to last}.b ? ( @ > 0)';
  143. select jsonb '{"a": {"c": {"b": 1}}}' @? '$.**{1 to last}.b ? ( @ > 0)';
  144. select jsonb '{"a": {"c": {"b": 1}}}' @? '$.**{1 to 2}.b ? ( @ > 0)';
  145. select jsonb '{"a": {"c": {"b": 1}}}' @? '$.**{2 to 3}.b ? ( @ > 0)';
  146. select jsonb_path_query('{"g": {"x": 2}}', '$.g ? (exists (@.x))');
  147. select jsonb_path_query('{"g": {"x": 2}}', '$.g ? (exists (@.y))');
  148. select jsonb_path_query('{"g": {"x": 2}}', '$.g ? (exists (@.x ? (@ >= 2) ))');
  149. select jsonb_path_query('{"g": [{"x": 2}, {"y": 3}]}', 'lax $.g ? (exists (@.x))');
  150. select jsonb_path_query('{"g": [{"x": 2}, {"y": 3}]}', 'lax $.g ? (exists (@.x + "3"))');
  151. select jsonb_path_query('{"g": [{"x": 2}, {"y": 3}]}', 'lax $.g ? ((exists (@.x + "3")) is unknown)');
  152. select jsonb_path_query('{"g": [{"x": 2}, {"y": 3}]}', 'strict $.g[*] ? (exists (@.x))');
  153. select jsonb_path_query('{"g": [{"x": 2}, {"y": 3}]}', 'strict $.g[*] ? ((exists (@.x)) is unknown)');
  154. select jsonb_path_query('{"g": [{"x": 2}, {"y": 3}]}', 'strict $.g ? (exists (@[*].x))');
  155. select jsonb_path_query('{"g": [{"x": 2}, {"y": 3}]}', 'strict $.g ? ((exists (@[*].x)) is unknown)');
  156. --test ternary logic
  157. select
  158. x, y,
  159. jsonb_path_query(
  160. '[true, false, null]',
  161. '$[*] ? (@ == true && ($x == true && $y == true) ||
  162. @ == false && !($x == true && $y == true) ||
  163. @ == null && ($x == true && $y == true) is unknown)',
  164. jsonb_build_object('x', x, 'y', y)
  165. ) as "x && y"
  166. from
  167. (values (jsonb 'true'), ('false'), ('"null"')) x(x),
  168. (values (jsonb 'true'), ('false'), ('"null"')) y(y);
  169. select
  170. x, y,
  171. jsonb_path_query(
  172. '[true, false, null]',
  173. '$[*] ? (@ == true && ($x == true || $y == true) ||
  174. @ == false && !($x == true || $y == true) ||
  175. @ == null && ($x == true || $y == true) is unknown)',
  176. jsonb_build_object('x', x, 'y', y)
  177. ) as "x || y"
  178. from
  179. (values (jsonb 'true'), ('false'), ('"null"')) x(x),
  180. (values (jsonb 'true'), ('false'), ('"null"')) y(y);
  181. select jsonb '{"a": 1, "b":1}' @? '$ ? (@.a == @.b)';
  182. select jsonb '{"c": {"a": 1, "b":1}}' @? '$ ? (@.a == @.b)';
  183. select jsonb '{"c": {"a": 1, "b":1}}' @? '$.c ? (@.a == @.b)';
  184. select jsonb '{"c": {"a": 1, "b":1}}' @? '$.c ? ($.c.a == @.b)';
  185. select jsonb '{"c": {"a": 1, "b":1}}' @? '$.* ? (@.a == @.b)';
  186. select jsonb '{"a": 1, "b":1}' @? '$.** ? (@.a == @.b)';
  187. select jsonb '{"c": {"a": 1, "b":1}}' @? '$.** ? (@.a == @.b)';
  188. select jsonb_path_query('{"c": {"a": 2, "b":1}}', '$.** ? (@.a == 1 + 1)');
  189. select jsonb_path_query('{"c": {"a": 2, "b":1}}', '$.** ? (@.a == (1 + 1))');
  190. select jsonb_path_query('{"c": {"a": 2, "b":1}}', '$.** ? (@.a == @.b + 1)');
  191. select jsonb_path_query('{"c": {"a": 2, "b":1}}', '$.** ? (@.a == (@.b + 1))');
  192. select jsonb '{"c": {"a": -1, "b":1}}' @? '$.** ? (@.a == - 1)';
  193. select jsonb '{"c": {"a": -1, "b":1}}' @? '$.** ? (@.a == -1)';
  194. select jsonb '{"c": {"a": -1, "b":1}}' @? '$.** ? (@.a == -@.b)';
  195. select jsonb '{"c": {"a": -1, "b":1}}' @? '$.** ? (@.a == - @.b)';
  196. select jsonb '{"c": {"a": 0, "b":1}}' @? '$.** ? (@.a == 1 - @.b)';
  197. select jsonb '{"c": {"a": 2, "b":1}}' @? '$.** ? (@.a == 1 - - @.b)';
  198. select jsonb '{"c": {"a": 0, "b":1}}' @? '$.** ? (@.a == 1 - +@.b)';
  199. select jsonb '[1,2,3]' @? '$ ? (+@[*] > +2)';
  200. select jsonb '[1,2,3]' @? '$ ? (+@[*] > +3)';
  201. select jsonb '[1,2,3]' @? '$ ? (-@[*] < -2)';
  202. select jsonb '[1,2,3]' @? '$ ? (-@[*] < -3)';
  203. select jsonb '1' @? '$ ? ($ > 0)';
  204. -- arithmetic errors
  205. select jsonb_path_query('[1,2,0,3]', '$[*] ? (2 / @ > 0)');
  206. select jsonb_path_query('[1,2,0,3]', '$[*] ? ((2 / @ > 0) is unknown)');
  207. select jsonb_path_query('0', '1 / $');
  208. select jsonb_path_query('0', '1 / $ + 2');
  209. select jsonb_path_query('0', '-(3 + 1 % $)');
  210. select jsonb_path_query('1', '$ + "2"');
  211. select jsonb_path_query('[1, 2]', '3 * $');
  212. select jsonb_path_query('"a"', '-$');
  213. select jsonb_path_query('[1,"2",3]', '+$');
  214. select jsonb_path_query('1', '$ + "2"', silent => true);
  215. select jsonb_path_query('[1, 2]', '3 * $', silent => true);
  216. select jsonb_path_query('"a"', '-$', silent => true);
  217. select jsonb_path_query('[1,"2",3]', '+$', silent => true);
  218. select jsonb '["1",2,0,3]' @? '-$[*]';
  219. select jsonb '[1,"2",0,3]' @? '-$[*]';
  220. select jsonb '["1",2,0,3]' @? 'strict -$[*]';
  221. select jsonb '[1,"2",0,3]' @? 'strict -$[*]';
  222. -- unwrapping of operator arguments in lax mode
  223. select jsonb_path_query('{"a": [2]}', 'lax $.a * 3');
  224. select jsonb_path_query('{"a": [2]}', 'lax $.a + 3');
  225. select jsonb_path_query('{"a": [2, 3, 4]}', 'lax -$.a');
  226. -- should fail
  227. select jsonb_path_query('{"a": [1, 2]}', 'lax $.a * 3');
  228. select jsonb_path_query('{"a": [1, 2]}', 'lax $.a * 3', silent => true);
  229. -- extension: boolean expressions
  230. select jsonb_path_query('2', '$ > 1');
  231. select jsonb_path_query('2', '$ <= 1');
  232. select jsonb_path_query('2', '$ == "2"');
  233. select jsonb '2' @? '$ == "2"';
  234. select jsonb '2' @@ '$ > 1';
  235. select jsonb '2' @@ '$ <= 1';
  236. select jsonb '2' @@ '$ == "2"';
  237. select jsonb '2' @@ '1';
  238. select jsonb '{}' @@ '$';
  239. select jsonb '[]' @@ '$';
  240. select jsonb '[1,2,3]' @@ '$[*]';
  241. select jsonb '[]' @@ '$[*]';
  242. select jsonb_path_match('[[1, true], [2, false]]', 'strict $[*] ? (@[0] > $x) [1]', '{"x": 1}');
  243. select jsonb_path_match('[[1, true], [2, false]]', 'strict $[*] ? (@[0] < $x) [1]', '{"x": 2}');
  244. select jsonb_path_match('[{"a": 1}, {"a": 2}, 3]', 'lax exists($[*].a)', silent => false);
  245. select jsonb_path_match('[{"a": 1}, {"a": 2}, 3]', 'lax exists($[*].a)', silent => true);
  246. select jsonb_path_match('[{"a": 1}, {"a": 2}, 3]', 'strict exists($[*].a)', silent => false);
  247. select jsonb_path_match('[{"a": 1}, {"a": 2}, 3]', 'strict exists($[*].a)', silent => true);
  248. select jsonb_path_query('[null,1,true,"a",[],{}]', '$.type()');
  249. select jsonb_path_query('[null,1,true,"a",[],{}]', 'lax $.type()');
  250. select jsonb_path_query('[null,1,true,"a",[],{}]', '$[*].type()');
  251. select jsonb_path_query('null', 'null.type()');
  252. select jsonb_path_query('null', 'true.type()');
  253. select jsonb_path_query('null', '(123).type()');
  254. select jsonb_path_query('null', '"123".type()');
  255. select jsonb_path_query('{"a": 2}', '($.a - 5).abs() + 10');
  256. select jsonb_path_query('{"a": 2.5}', '-($.a * $.a).floor() % 4.3');
  257. select jsonb_path_query('[1, 2, 3]', '($[*] > 2) ? (@ == true)');
  258. select jsonb_path_query('[1, 2, 3]', '($[*] > 3).type()');
  259. select jsonb_path_query('[1, 2, 3]', '($[*].a > 3).type()');
  260. select jsonb_path_query('[1, 2, 3]', 'strict ($[*].a > 3).type()');
  261. select jsonb_path_query('[1,null,true,"11",[],[1],[1,2,3],{},{"a":1,"b":2}]', 'strict $[*].size()');
  262. select jsonb_path_query('[1,null,true,"11",[],[1],[1,2,3],{},{"a":1,"b":2}]', 'strict $[*].size()', silent => true);
  263. select jsonb_path_query('[1,null,true,"11",[],[1],[1,2,3],{},{"a":1,"b":2}]', 'lax $[*].size()');
  264. select jsonb_path_query('[0, 1, -2, -3.4, 5.6]', '$[*].abs()');
  265. select jsonb_path_query('[0, 1, -2, -3.4, 5.6]', '$[*].floor()');
  266. select jsonb_path_query('[0, 1, -2, -3.4, 5.6]', '$[*].ceiling()');
  267. select jsonb_path_query('[0, 1, -2, -3.4, 5.6]', '$[*].ceiling().abs()');
  268. select jsonb_path_query('[0, 1, -2, -3.4, 5.6]', '$[*].ceiling().abs().type()');
  269. select jsonb_path_query('[{},1]', '$[*].keyvalue()');
  270. select jsonb_path_query('[{},1]', '$[*].keyvalue()', silent => true);
  271. select jsonb_path_query('{}', '$.keyvalue()');
  272. select jsonb_path_query('{"a": 1, "b": [1, 2], "c": {"a": "bbb"}}', '$.keyvalue()');
  273. select jsonb_path_query('[{"a": 1, "b": [1, 2]}, {"c": {"a": "bbb"}}]', '$[*].keyvalue()');
  274. select jsonb_path_query('[{"a": 1, "b": [1, 2]}, {"c": {"a": "bbb"}}]', 'strict $.keyvalue()');
  275. select jsonb_path_query('[{"a": 1, "b": [1, 2]}, {"c": {"a": "bbb"}}]', 'lax $.keyvalue()');
  276. select jsonb_path_query('[{"a": 1, "b": [1, 2]}, {"c": {"a": "bbb"}}]', 'strict $.keyvalue().a');
  277. select jsonb '{"a": 1, "b": [1, 2]}' @? 'lax $.keyvalue()';
  278. select jsonb '{"a": 1, "b": [1, 2]}' @? 'lax $.keyvalue().key';
  279. select jsonb_path_query('null', '$.double()');
  280. select jsonb_path_query('true', '$.double()');
  281. select jsonb_path_query('null', '$.double()', silent => true);
  282. select jsonb_path_query('true', '$.double()', silent => true);
  283. select jsonb_path_query('[]', '$.double()');
  284. select jsonb_path_query('[]', 'strict $.double()');
  285. select jsonb_path_query('{}', '$.double()');
  286. select jsonb_path_query('[]', 'strict $.double()', silent => true);
  287. select jsonb_path_query('{}', '$.double()', silent => true);
  288. select jsonb_path_query('1.23', '$.double()');
  289. select jsonb_path_query('"1.23"', '$.double()');
  290. select jsonb_path_query('"1.23aaa"', '$.double()');
  291. select jsonb_path_query('1e1000', '$.double()');
  292. select jsonb_path_query('"nan"', '$.double()');
  293. select jsonb_path_query('"NaN"', '$.double()');
  294. select jsonb_path_query('"inf"', '$.double()');
  295. select jsonb_path_query('"-inf"', '$.double()');
  296. select jsonb_path_query('"inf"', '$.double()', silent => true);
  297. select jsonb_path_query('"-inf"', '$.double()', silent => true);
  298. select jsonb_path_query('{}', '$.abs()');
  299. select jsonb_path_query('true', '$.floor()');
  300. select jsonb_path_query('"1.2"', '$.ceiling()');
  301. select jsonb_path_query('{}', '$.abs()', silent => true);
  302. select jsonb_path_query('true', '$.floor()', silent => true);
  303. select jsonb_path_query('"1.2"', '$.ceiling()', silent => true);
  304. select jsonb_path_query('["", "a", "abc", "abcabc"]', '$[*] ? (@ starts with "abc")');
  305. select jsonb_path_query('["", "a", "abc", "abcabc"]', 'strict $ ? (@[*] starts with "abc")');
  306. select jsonb_path_query('["", "a", "abd", "abdabc"]', 'strict $ ? (@[*] starts with "abc")');
  307. select jsonb_path_query('["abc", "abcabc", null, 1]', 'strict $ ? (@[*] starts with "abc")');
  308. select jsonb_path_query('["abc", "abcabc", null, 1]', 'strict $ ? ((@[*] starts with "abc") is unknown)');
  309. select jsonb_path_query('[[null, 1, "abc", "abcabc"]]', 'lax $ ? (@[*] starts with "abc")');
  310. select jsonb_path_query('[[null, 1, "abd", "abdabc"]]', 'lax $ ? ((@[*] starts with "abc") is unknown)');
  311. select jsonb_path_query('[null, 1, "abd", "abdabc"]', 'lax $[*] ? ((@ starts with "abc") is unknown)');
  312. select jsonb_path_query('[null, 1, "abc", "abd", "aBdC", "abdacb", "babc", "adc\nabc", "ab\nadc"]', 'lax $[*] ? (@ like_regex "^ab.*c")');
  313. select jsonb_path_query('[null, 1, "abc", "abd", "aBdC", "abdacb", "babc", "adc\nabc", "ab\nadc"]', 'lax $[*] ? (@ like_regex "^ab.*c" flag "i")');
  314. select jsonb_path_query('[null, 1, "abc", "abd", "aBdC", "abdacb", "babc", "adc\nabc", "ab\nadc"]', 'lax $[*] ? (@ like_regex "^ab.*c" flag "m")');
  315. select jsonb_path_query('[null, 1, "abc", "abd", "aBdC", "abdacb", "babc", "adc\nabc", "ab\nadc"]', 'lax $[*] ? (@ like_regex "^ab.*c" flag "s")');
  316. select jsonb_path_query('[null, 1, "a\b", "a\\b", "^a\\b$"]', 'lax $[*] ? (@ like_regex "a\\b" flag "q")');
  317. select jsonb_path_query('[null, 1, "a\b", "a\\b", "^a\\b$"]', 'lax $[*] ? (@ like_regex "a\\b" flag "")');
  318. select jsonb_path_query('[null, 1, "a\b", "a\\b", "^a\\b$"]', 'lax $[*] ? (@ like_regex "^a\\b$" flag "q")');
  319. select jsonb_path_query('[null, 1, "a\b", "a\\b", "^a\\b$"]', 'lax $[*] ? (@ like_regex "^a\\B$" flag "q")');
  320. select jsonb_path_query('[null, 1, "a\b", "a\\b", "^a\\b$"]', 'lax $[*] ? (@ like_regex "^a\\B$" flag "iq")');
  321. select jsonb_path_query('[null, 1, "a\b", "a\\b", "^a\\b$"]', 'lax $[*] ? (@ like_regex "^a\\b$" flag "")');
  322. select jsonb_path_query('null', '$.datetime()');
  323. select jsonb_path_query('true', '$.datetime()');
  324. select jsonb_path_query('1', '$.datetime()');
  325. select jsonb_path_query('[]', '$.datetime()');
  326. select jsonb_path_query('[]', 'strict $.datetime()');
  327. select jsonb_path_query('{}', '$.datetime()');
  328. select jsonb_path_query('"bogus"', '$.datetime()');
  329. select jsonb_path_query('"12:34"', '$.datetime("aaa")');
  330. select jsonb_path_query('"aaaa"', '$.datetime("HH24")');
  331. select jsonb '"10-03-2017"' @? '$.datetime("dd-mm-yyyy")';
  332. select jsonb_path_query('"10-03-2017"', '$.datetime("dd-mm-yyyy")');
  333. select jsonb_path_query('"10-03-2017"', '$.datetime("dd-mm-yyyy").type()');
  334. select jsonb_path_query('"10-03-2017 12:34"', '$.datetime("dd-mm-yyyy")');
  335. select jsonb_path_query('"10-03-2017 12:34"', '$.datetime("dd-mm-yyyy").type()');
  336. select jsonb_path_query('"10-03-2017 12:34"', ' $.datetime("dd-mm-yyyy HH24:MI").type()');
  337. select jsonb_path_query('"10-03-2017 12:34 +05:20"', '$.datetime("dd-mm-yyyy HH24:MI TZH:TZM").type()');
  338. select jsonb_path_query('"12:34:56"', '$.datetime("HH24:MI:SS").type()');
  339. select jsonb_path_query('"12:34:56 +05:20"', '$.datetime("HH24:MI:SS TZH:TZM").type()');
  340. select jsonb_path_query('"10-03-2017T12:34:56"', '$.datetime("dd-mm-yyyy\"T\"HH24:MI:SS")');
  341. select jsonb_path_query('"10-03-2017t12:34:56"', '$.datetime("dd-mm-yyyy\"T\"HH24:MI:SS")');
  342. select jsonb_path_query('"10-03-2017 12:34:56"', '$.datetime("dd-mm-yyyy\"T\"HH24:MI:SS")');
  343. set time zone '+00';
  344. select jsonb_path_query('"10-03-2017 12:34"', '$.datetime("dd-mm-yyyy HH24:MI")');
  345. select jsonb_path_query('"10-03-2017 12:34"', '$.datetime("dd-mm-yyyy HH24:MI TZH")');
  346. select jsonb_path_query('"10-03-2017 12:34 +05"', '$.datetime("dd-mm-yyyy HH24:MI TZH")');
  347. select jsonb_path_query('"10-03-2017 12:34 -05"', '$.datetime("dd-mm-yyyy HH24:MI TZH")');
  348. select jsonb_path_query('"10-03-2017 12:34 +05:20"', '$.datetime("dd-mm-yyyy HH24:MI TZH:TZM")');
  349. select jsonb_path_query('"10-03-2017 12:34 -05:20"', '$.datetime("dd-mm-yyyy HH24:MI TZH:TZM")');
  350. select jsonb_path_query('"12:34"', '$.datetime("HH24:MI")');
  351. select jsonb_path_query('"12:34"', '$.datetime("HH24:MI TZH")');
  352. select jsonb_path_query('"12:34 +05"', '$.datetime("HH24:MI TZH")');
  353. select jsonb_path_query('"12:34 -05"', '$.datetime("HH24:MI TZH")');
  354. select jsonb_path_query('"12:34 +05:20"', '$.datetime("HH24:MI TZH:TZM")');
  355. select jsonb_path_query('"12:34 -05:20"', '$.datetime("HH24:MI TZH:TZM")');
  356. set time zone '+10';
  357. select jsonb_path_query('"10-03-2017 12:34"', '$.datetime("dd-mm-yyyy HH24:MI")');
  358. select jsonb_path_query('"10-03-2017 12:34"', '$.datetime("dd-mm-yyyy HH24:MI TZH")');
  359. select jsonb_path_query('"10-03-2017 12:34 +05"', '$.datetime("dd-mm-yyyy HH24:MI TZH")');
  360. select jsonb_path_query('"10-03-2017 12:34 -05"', '$.datetime("dd-mm-yyyy HH24:MI TZH")');
  361. select jsonb_path_query('"10-03-2017 12:34 +05:20"', '$.datetime("dd-mm-yyyy HH24:MI TZH:TZM")');
  362. select jsonb_path_query('"10-03-2017 12:34 -05:20"', '$.datetime("dd-mm-yyyy HH24:MI TZH:TZM")');
  363. select jsonb_path_query('"12:34"', '$.datetime("HH24:MI")');
  364. select jsonb_path_query('"12:34"', '$.datetime("HH24:MI TZH")');
  365. select jsonb_path_query('"12:34 +05"', '$.datetime("HH24:MI TZH")');
  366. select jsonb_path_query('"12:34 -05"', '$.datetime("HH24:MI TZH")');
  367. select jsonb_path_query('"12:34 +05:20"', '$.datetime("HH24:MI TZH:TZM")');
  368. select jsonb_path_query('"12:34 -05:20"', '$.datetime("HH24:MI TZH:TZM")');
  369. set time zone default;
  370. select jsonb_path_query('"2017-03-10"', '$.datetime().type()');
  371. select jsonb_path_query('"2017-03-10"', '$.datetime()');
  372. select jsonb_path_query('"2017-03-10 12:34:56"', '$.datetime().type()');
  373. select jsonb_path_query('"2017-03-10 12:34:56"', '$.datetime()');
  374. select jsonb_path_query('"2017-03-10 12:34:56+3"', '$.datetime().type()');
  375. select jsonb_path_query('"2017-03-10 12:34:56+3"', '$.datetime()');
  376. select jsonb_path_query('"2017-03-10 12:34:56+3:10"', '$.datetime().type()');
  377. select jsonb_path_query('"2017-03-10 12:34:56+3:10"', '$.datetime()');
  378. select jsonb_path_query('"2017-03-10T12:34:56+3:10"', '$.datetime()');
  379. select jsonb_path_query('"2017-03-10t12:34:56+3:10"', '$.datetime()');
  380. select jsonb_path_query('"12:34:56"', '$.datetime().type()');
  381. select jsonb_path_query('"12:34:56"', '$.datetime()');
  382. select jsonb_path_query('"12:34:56+3"', '$.datetime().type()');
  383. select jsonb_path_query('"12:34:56+3"', '$.datetime()');
  384. select jsonb_path_query('"12:34:56+3:10"', '$.datetime().type()');
  385. select jsonb_path_query('"12:34:56+3:10"', '$.datetime()');
  386. set time zone '+00';
  387. -- date comparison
  388. select jsonb_path_query(
  389. '["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"]',
  390. '$[*].datetime() ? (@ == "10.03.2017".datetime("dd.mm.yyyy"))');
  391. select jsonb_path_query(
  392. '["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"]',
  393. '$[*].datetime() ? (@ >= "10.03.2017".datetime("dd.mm.yyyy"))');
  394. select jsonb_path_query(
  395. '["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"]',
  396. '$[*].datetime() ? (@ < "10.03.2017".datetime("dd.mm.yyyy"))');
  397. select jsonb_path_query_tz(
  398. '["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"]',
  399. '$[*].datetime() ? (@ == "10.03.2017".datetime("dd.mm.yyyy"))');
  400. select jsonb_path_query_tz(
  401. '["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"]',
  402. '$[*].datetime() ? (@ >= "10.03.2017".datetime("dd.mm.yyyy"))');
  403. select jsonb_path_query_tz(
  404. '["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"]',
  405. '$[*].datetime() ? (@ < "10.03.2017".datetime("dd.mm.yyyy"))');
  406. -- time comparison
  407. select jsonb_path_query(
  408. '["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"]',
  409. '$[*].datetime() ? (@ == "12:35".datetime("HH24:MI"))');
  410. select jsonb_path_query(
  411. '["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"]',
  412. '$[*].datetime() ? (@ >= "12:35".datetime("HH24:MI"))');
  413. select jsonb_path_query(
  414. '["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"]',
  415. '$[*].datetime() ? (@ < "12:35".datetime("HH24:MI"))');
  416. select jsonb_path_query_tz(
  417. '["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"]',
  418. '$[*].datetime() ? (@ == "12:35".datetime("HH24:MI"))');
  419. select jsonb_path_query_tz(
  420. '["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"]',
  421. '$[*].datetime() ? (@ >= "12:35".datetime("HH24:MI"))');
  422. select jsonb_path_query_tz(
  423. '["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"]',
  424. '$[*].datetime() ? (@ < "12:35".datetime("HH24:MI"))');
  425. -- timetz comparison
  426. select jsonb_path_query(
  427. '["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"]',
  428. '$[*].datetime() ? (@ == "12:35 +1".datetime("HH24:MI TZH"))');
  429. select jsonb_path_query(
  430. '["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"]',
  431. '$[*].datetime() ? (@ >= "12:35 +1".datetime("HH24:MI TZH"))');
  432. select jsonb_path_query(
  433. '["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"]',
  434. '$[*].datetime() ? (@ < "12:35 +1".datetime("HH24:MI TZH"))');
  435. select jsonb_path_query_tz(
  436. '["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"]',
  437. '$[*].datetime() ? (@ == "12:35 +1".datetime("HH24:MI TZH"))');
  438. select jsonb_path_query_tz(
  439. '["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"]',
  440. '$[*].datetime() ? (@ >= "12:35 +1".datetime("HH24:MI TZH"))');
  441. select jsonb_path_query_tz(
  442. '["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"]',
  443. '$[*].datetime() ? (@ < "12:35 +1".datetime("HH24:MI TZH"))');
  444. -- timestamp comparison
  445. select jsonb_path_query(
  446. '["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"]',
  447. '$[*].datetime() ? (@ == "10.03.2017 12:35".datetime("dd.mm.yyyy HH24:MI"))');
  448. select jsonb_path_query(
  449. '["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"]',
  450. '$[*].datetime() ? (@ >= "10.03.2017 12:35".datetime("dd.mm.yyyy HH24:MI"))');
  451. select jsonb_path_query(
  452. '["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"]',
  453. '$[*].datetime() ? (@ < "10.03.2017 12:35".datetime("dd.mm.yyyy HH24:MI"))');
  454. select jsonb_path_query_tz(
  455. '["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"]',
  456. '$[*].datetime() ? (@ == "10.03.2017 12:35".datetime("dd.mm.yyyy HH24:MI"))');
  457. select jsonb_path_query_tz(
  458. '["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"]',
  459. '$[*].datetime() ? (@ >= "10.03.2017 12:35".datetime("dd.mm.yyyy HH24:MI"))');
  460. select jsonb_path_query_tz(
  461. '["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"]',
  462. '$[*].datetime() ? (@ < "10.03.2017 12:35".datetime("dd.mm.yyyy HH24:MI"))');
  463. -- timestamptz comparison
  464. select jsonb_path_query(
  465. '["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"]',
  466. '$[*].datetime() ? (@ == "10.03.2017 12:35 +1".datetime("dd.mm.yyyy HH24:MI TZH"))');
  467. select jsonb_path_query(
  468. '["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"]',
  469. '$[*].datetime() ? (@ >= "10.03.2017 12:35 +1".datetime("dd.mm.yyyy HH24:MI TZH"))');
  470. select jsonb_path_query(
  471. '["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"]',
  472. '$[*].datetime() ? (@ < "10.03.2017 12:35 +1".datetime("dd.mm.yyyy HH24:MI TZH"))');
  473. select jsonb_path_query_tz(
  474. '["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"]',
  475. '$[*].datetime() ? (@ == "10.03.2017 12:35 +1".datetime("dd.mm.yyyy HH24:MI TZH"))');
  476. select jsonb_path_query_tz(
  477. '["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"]',
  478. '$[*].datetime() ? (@ >= "10.03.2017 12:35 +1".datetime("dd.mm.yyyy HH24:MI TZH"))');
  479. select jsonb_path_query_tz(
  480. '["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"]',
  481. '$[*].datetime() ? (@ < "10.03.2017 12:35 +1".datetime("dd.mm.yyyy HH24:MI TZH"))');
  482. -- overflow during comparison
  483. select jsonb_path_query('"1000000-01-01"', '$.datetime() > "2020-01-01 12:00:00".datetime()'::jsonpath);
  484. set time zone default;
  485. -- jsonpath operators
  486. SELECT jsonb_path_query('[{"a": 1}, {"a": 2}]', '$[*]');
  487. SELECT jsonb_path_query('[{"a": 1}, {"a": 2}]', '$[*] ? (@.a > 10)');
  488. SELECT jsonb_path_query_array('[{"a": 1}, {"a": 2}, {}]', 'strict $[*].a');
  489. SELECT jsonb_path_query_array('[{"a": 1}, {"a": 2}]', '$[*].a');
  490. SELECT jsonb_path_query_array('[{"a": 1}, {"a": 2}]', '$[*].a ? (@ == 1)');
  491. SELECT jsonb_path_query_array('[{"a": 1}, {"a": 2}]', '$[*].a ? (@ > 10)');
  492. SELECT jsonb_path_query_array('[{"a": 1}, {"a": 2}, {"a": 3}, {"a": 5}]', '$[*].a ? (@ > $min && @ < $max)', vars => '{"min": 1, "max": 4}');
  493. SELECT jsonb_path_query_array('[{"a": 1}, {"a": 2}, {"a": 3}, {"a": 5}]', '$[*].a ? (@ > $min && @ < $max)', vars => '{"min": 3, "max": 4}');
  494. SELECT jsonb_path_query_first('[{"a": 1}, {"a": 2}, {}]', 'strict $[*].a');
  495. SELECT jsonb_path_query_first('[{"a": 1}, {"a": 2}, {}]', 'strict $[*].a', silent => true);
  496. SELECT jsonb_path_query_first('[{"a": 1}, {"a": 2}]', '$[*].a');
  497. SELECT jsonb_path_query_first('[{"a": 1}, {"a": 2}]', '$[*].a ? (@ == 1)');
  498. SELECT jsonb_path_query_first('[{"a": 1}, {"a": 2}]', '$[*].a ? (@ > 10)');
  499. SELECT jsonb_path_query_first('[{"a": 1}, {"a": 2}, {"a": 3}, {"a": 5}]', '$[*].a ? (@ > $min && @ < $max)', vars => '{"min": 1, "max": 4}');
  500. SELECT jsonb_path_query_first('[{"a": 1}, {"a": 2}, {"a": 3}, {"a": 5}]', '$[*].a ? (@ > $min && @ < $max)', vars => '{"min": 3, "max": 4}');
  501. SELECT jsonb '[{"a": 1}, {"a": 2}]' @? '$[*].a ? (@ > 1)';
  502. SELECT jsonb '[{"a": 1}, {"a": 2}]' @? '$[*] ? (@.a > 2)';
  503. SELECT jsonb_path_exists('[{"a": 1}, {"a": 2}]', '$[*].a ? (@ > 1)');
  504. SELECT jsonb_path_exists('[{"a": 1}, {"a": 2}, {"a": 3}, {"a": 5}]', '$[*] ? (@.a > $min && @.a < $max)', vars => '{"min": 1, "max": 4}');
  505. SELECT jsonb_path_exists('[{"a": 1}, {"a": 2}, {"a": 3}, {"a": 5}]', '$[*] ? (@.a > $min && @.a < $max)', vars => '{"min": 3, "max": 4}');
  506. SELECT jsonb_path_match('true', '$', silent => false);
  507. SELECT jsonb_path_match('false', '$', silent => false);
  508. SELECT jsonb_path_match('null', '$', silent => false);
  509. SELECT jsonb_path_match('1', '$', silent => true);
  510. SELECT jsonb_path_match('1', '$', silent => false);
  511. SELECT jsonb_path_match('"a"', '$', silent => false);
  512. SELECT jsonb_path_match('{}', '$', silent => false);
  513. SELECT jsonb_path_match('[true]', '$', silent => false);
  514. SELECT jsonb_path_match('{}', 'lax $.a', silent => false);
  515. SELECT jsonb_path_match('{}', 'strict $.a', silent => false);
  516. SELECT jsonb_path_match('{}', 'strict $.a', silent => true);
  517. SELECT jsonb_path_match('[true, true]', '$[*]', silent => false);
  518. SELECT jsonb '[{"a": 1}, {"a": 2}]' @@ '$[*].a > 1';
  519. SELECT jsonb '[{"a": 1}, {"a": 2}]' @@ '$[*].a > 2';
  520. SELECT jsonb_path_match('[{"a": 1}, {"a": 2}]', '$[*].a > 1');
  521. -- test string comparison (Unicode codepoint collation)
  522. WITH str(j, num) AS
  523. (
  524. SELECT jsonb_build_object('s', s), num
  525. FROM unnest('{"", "a", "ab", "abc", "abcd", "b", "A", "AB", "ABC", "ABc", "ABcD", "B"}'::text[]) WITH ORDINALITY AS a(s, num)
  526. )
  527. SELECT
  528. s1.j, s2.j,
  529. jsonb_path_query_first(s1.j, '$.s < $s', vars => s2.j) lt,
  530. jsonb_path_query_first(s1.j, '$.s <= $s', vars => s2.j) le,
  531. jsonb_path_query_first(s1.j, '$.s == $s', vars => s2.j) eq,
  532. jsonb_path_query_first(s1.j, '$.s >= $s', vars => s2.j) ge,
  533. jsonb_path_query_first(s1.j, '$.s > $s', vars => s2.j) gt
  534. FROM str s1, str s2
  535. ORDER BY s1.num, s2.num;