postgres_jsonb.slt 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472
  1. # Copyright 2015 - 2019 The Cockroach Authors. All rights reserved.
  2. # Copyright Materialize, Inc. and contributors. All rights reserved.
  3. #
  4. # Use of this software is governed by the Business Source License
  5. # included in the LICENSE file at the root of this repository.
  6. #
  7. # As of the Change Date specified in that file, in accordance with
  8. # the Business Source License, use of this software will be governed
  9. # by the Apache License, Version 2.0.
  10. #
  11. # This file is derived from the logic test suite in CockroachDB. The
  12. # original file was retrieved on June 10, 2019 from:
  13. #
  14. # https://github.com/cockroachdb/cockroach/blob/d2f7fbf5dd1fc1a099bbad790a2e1f7c60a66cc3/pkg/sql/logictest/testdata/logic_test/postgres_jsonb
  15. #
  16. # The original source code is subject to the terms of the Apache
  17. # 2.0 license, a copy of which can be found in the LICENSE file at the
  18. # root of this repository.
  19. mode cockroach
  20. # This file is an incomplete porting of
  21. # https://github.com/postgres/postgres/blob/11e264517dff7a911d9e6494de86049cab42cde3/src/test/regress/sql/jsonb.sql
  22. # to CockroachDB logic tests.
  23. query T
  24. SELECT '[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]'::jsonb
  25. ----
  26. [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
  27. statement ok
  28. CREATE TABLE test_jsonb (
  29. json_type text,
  30. test_json jsonb
  31. )
  32. statement ok
  33. INSERT INTO test_jsonb VALUES
  34. ('scalar','"a scalar"'),
  35. ('array','["zero", "one","two",null,"four","five", [1,2,3],{"f1":9}]'),
  36. ('object','{"field1":"val1","field2":"val2","field3":null, "field4": 4, "field5": [1,2,3], "field6": {"f1":9}}')
  37. query T
  38. SELECT test_json -> 'x' FROM test_jsonb WHERE json_type = 'scalar'
  39. ----
  40. NULL
  41. query T
  42. SELECT test_json -> 'x' FROM test_jsonb WHERE json_type = 'array'
  43. ----
  44. NULL
  45. query T
  46. SELECT test_json -> 'x' FROM test_jsonb WHERE json_type = 'object'
  47. ----
  48. NULL
  49. query T
  50. SELECT test_json -> 'field2' FROM test_jsonb WHERE json_type = 'object'
  51. ----
  52. "val2"
  53. query T
  54. SELECT test_json ->> 'field2' FROM test_jsonb WHERE json_type = 'scalar'
  55. ----
  56. NULL
  57. query T
  58. SELECT test_json ->> 'field2' FROM test_jsonb WHERE json_type = 'array'
  59. ----
  60. NULL
  61. query T
  62. SELECT test_json ->> 'field2' FROM test_jsonb WHERE json_type = 'object'
  63. ----
  64. val2
  65. query T
  66. SELECT test_json -> 2 FROM test_jsonb WHERE json_type = 'scalar'
  67. ----
  68. NULL
  69. query T
  70. SELECT test_json -> 2 FROM test_jsonb WHERE json_type = 'array'
  71. ----
  72. "two"
  73. query T
  74. SELECT test_json -> 9 FROM test_jsonb WHERE json_type = 'array'
  75. ----
  76. NULL
  77. query T
  78. SELECT test_json -> 2 FROM test_jsonb WHERE json_type = 'object'
  79. ----
  80. NULL
  81. query T
  82. SELECT test_json ->> 6 FROM test_jsonb WHERE json_type = 'array'
  83. ----
  84. [1,2,3]
  85. query T
  86. SELECT test_json ->> 7 FROM test_jsonb WHERE json_type = 'array'
  87. ----
  88. {"f1":9}
  89. query T
  90. SELECT test_json ->> 'field4' FROM test_jsonb WHERE json_type = 'object'
  91. ----
  92. 4
  93. query T
  94. SELECT test_json ->> 'field5' FROM test_jsonb WHERE json_type = 'object'
  95. ----
  96. [1,2,3]
  97. query T
  98. SELECT test_json ->> 'field6' FROM test_jsonb WHERE json_type = 'object'
  99. ----
  100. {"f1":9}
  101. query T
  102. SELECT test_json ->> 2 FROM test_jsonb WHERE json_type = 'scalar'
  103. ----
  104. NULL
  105. query T
  106. SELECT test_json ->> 2 FROM test_jsonb WHERE json_type = 'array'
  107. ----
  108. two
  109. query T
  110. SELECT test_json ->> 2 FROM test_jsonb WHERE json_type = 'object'
  111. ----
  112. NULL
  113. # nulls
  114. query B
  115. SELECT (test_json->'field3') IS NULL AS expect_false FROM test_jsonb WHERE json_type = 'object'
  116. ----
  117. false
  118. query T
  119. SELECT (test_json->>'field3') FROM test_jsonb WHERE json_type = 'object';
  120. ----
  121. NULL
  122. query B
  123. SELECT (test_json->>'field3') IS NULL AS expect_true FROM test_jsonb WHERE json_type = 'object';
  124. ----
  125. true
  126. query B
  127. SELECT (test_json->3) IS NULL AS expect_false FROM test_jsonb WHERE json_type = 'array';
  128. ----
  129. false
  130. query B
  131. SELECT (test_json->>3) IS NULL AS expect_true FROM test_jsonb WHERE json_type = 'array';
  132. ----
  133. true
  134. # corner cases
  135. query T
  136. SELECT '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb -> null::text;
  137. ----
  138. NULL
  139. query T
  140. SELECT '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb -> null::int;
  141. ----
  142. NULL
  143. query T
  144. SELECT '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb -> 1;
  145. ----
  146. NULL
  147. query T
  148. SELECT '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb -> 'z';
  149. ----
  150. NULL
  151. query T
  152. SELECT '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb -> '';
  153. ----
  154. NULL
  155. query T
  156. SELECT '[{"b": "c"}, {"b": "cc"}]'::jsonb -> 1;
  157. ----
  158. {"b":"cc"}
  159. query T
  160. SELECT '[{"b": "c"}, {"b": "cc"}]'::jsonb -> 3;
  161. ----
  162. NULL
  163. query T
  164. SELECT '[{"b": "c"}, {"b": "cc"}]'::jsonb -> 'z';
  165. ----
  166. NULL
  167. query T
  168. SELECT '{"a": "c", "b": null}'::jsonb -> 'b';
  169. ----
  170. null
  171. query T
  172. SELECT '"foo"'::jsonb -> 1;
  173. ----
  174. NULL
  175. query T
  176. SELECT '"foo"'::jsonb -> 'z';
  177. ----
  178. NULL
  179. query T
  180. SELECT '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb ->> null::text;
  181. ----
  182. NULL
  183. query T
  184. SELECT '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb ->> null::int;
  185. ----
  186. NULL
  187. query T
  188. SELECT '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb ->> 1;
  189. ----
  190. NULL
  191. query T
  192. SELECT '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb ->> 'z';
  193. ----
  194. NULL
  195. query T
  196. SELECT '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb ->> '';
  197. ----
  198. NULL
  199. query T
  200. SELECT '[{"b": "c"}, {"b": "cc"}]'::jsonb ->> 1;
  201. ----
  202. {"b":"cc"}
  203. query T
  204. SELECT '[{"b": "c"}, {"b": "cc"}]'::jsonb ->> 3;
  205. ----
  206. NULL
  207. query T
  208. SELECT '[{"b": "c"}, {"b": "cc"}]'::jsonb ->> 'z';
  209. ----
  210. NULL
  211. query T
  212. SELECT '{"a": "c", "b": null}'::jsonb ->> 'b';
  213. ----
  214. NULL
  215. query T
  216. SELECT '"foo"'::jsonb ->> 1;
  217. ----
  218. NULL
  219. query T
  220. SELECT '"foo"'::jsonb ->> 'z';
  221. ----
  222. NULL
  223. # equality and inequality
  224. query B
  225. SELECT '{"x":"y"}'::jsonb = '{"x":"y"}'::jsonb;
  226. ----
  227. true
  228. query B
  229. SELECT '{"x":"y"}'::jsonb = '{"x":"z"}'::jsonb;
  230. ----
  231. false
  232. query B
  233. SELECT '{"x":"y"}'::jsonb <> '{"x":"y"}'::jsonb;
  234. ----
  235. false
  236. query B
  237. SELECT '{"x":"y"}'::jsonb <> '{"x":"z"}'::jsonb;
  238. ----
  239. true
  240. # containment
  241. query B
  242. SELECT '{"a":"b", "b":1, "c":null}'::JSONB @> '{"a":"b"}'
  243. ----
  244. true
  245. query B
  246. SELECT '{"a":"b", "b":1, "c":null}'::JSONB @> '{"a":"b", "c":null}'
  247. ----
  248. true
  249. query B
  250. SELECT '{"a":"b", "b":1, "c":null}'::JSONB @> '{"a":"b", "g":null}'
  251. ----
  252. false
  253. query B
  254. SELECT '{"a":"b", "b":1, "c":null}'::JSONB @> '{"g":null}'
  255. ----
  256. false
  257. query B
  258. SELECT '{"a":"b", "b":1, "c":null}'::JSONB @> '{"a":"c"}'
  259. ----
  260. false
  261. query B
  262. SELECT '{"a":"b", "b":1, "c":null}'::JSONB @> '{"a":"b"}'
  263. ----
  264. true
  265. query B
  266. SELECT '{"a":"b", "b":1, "c":null}'::JSONB @> '{"a":"b", "c":"q"}'
  267. ----
  268. false
  269. query B
  270. SELECT '{"a":"b", "b":1, "c":null}'::JSONB @> '{"a":"b"}'
  271. ----
  272. true
  273. query B
  274. SELECT '{"a":"b", "b":1, "c":null}'::JSONB @> '{"a":"b", "c":null}'
  275. ----
  276. true
  277. query B
  278. SELECT '{"a":"b", "b":1, "c":null}'::JSONB @> '{"a":"b", "g":null}'
  279. ----
  280. false
  281. query B
  282. SELECT '{"a":"b", "b":1, "c":null}'::JSONB @> '{"g":null}'
  283. ----
  284. false
  285. query B
  286. SELECT '{"a":"b", "b":1, "c":null}'::JSONB @> '{"a":"c"}'
  287. ----
  288. false
  289. query B
  290. SELECT '{"a":"b", "b":1, "c":null}'::JSONB @> '{"a":"b"}'
  291. ----
  292. true
  293. query B
  294. SELECT '{"a":"b", "b":1, "c":null}'::JSONB @> '{"a":"b", "c":"q"}'
  295. ----
  296. false
  297. query B
  298. SELECT '[1,2]'::JSONB @> '[1,2,2]'::jsonb
  299. ----
  300. true
  301. query B
  302. SELECT '[1,1,2]'::JSONB @> '[1,2,2]'::jsonb
  303. ----
  304. true
  305. query B
  306. SELECT '[[1,2]]'::JSONB @> '[[1,2,2]]'::jsonb
  307. ----
  308. true
  309. query B
  310. SELECT '[1,2,2]'::JSONB <@ '[1,2]'::jsonb
  311. ----
  312. true
  313. query B
  314. SELECT '[1,2,2]'::JSONB <@ '[1,1,2]'::jsonb
  315. ----
  316. true
  317. query B
  318. SELECT '[[1,2,2]]'::JSONB <@ '[[1,2]]'::jsonb
  319. ----
  320. true
  321. query B
  322. SELECT '{"a":"b"}'::JSONB <@ '{"a":"b", "b":1, "c":null}'
  323. ----
  324. true
  325. query B
  326. SELECT '{"a":"b", "c":null}'::JSONB <@ '{"a":"b", "b":1, "c":null}'
  327. ----
  328. true
  329. query B
  330. SELECT '{"a":"b", "g":null}'::JSONB <@ '{"a":"b", "b":1, "c":null}'
  331. ----
  332. false
  333. query B
  334. SELECT '{"g":null}'::JSONB <@ '{"a":"b", "b":1, "c":null}'
  335. ----
  336. false
  337. query B
  338. SELECT '{"a":"c"}'::JSONB <@ '{"a":"b", "b":1, "c":null}'
  339. ----
  340. false
  341. query B
  342. SELECT '{"a":"b"}'::JSONB <@ '{"a":"b", "b":1, "c":null}'
  343. ----
  344. true
  345. query B
  346. SELECT '{"a":"b", "c":"q"}'::JSONB <@ '{"a":"b", "b":1, "c":null}'
  347. ----
  348. false
  349. # Raw scalar may contain another raw scalar, array may contain a raw scalar
  350. query B
  351. SELECT '[5]'::JSONB @> '[5]'
  352. ----
  353. true
  354. query B
  355. SELECT '5'::JSONB @> '5'
  356. ----
  357. true
  358. query B
  359. SELECT '[5]'::JSONB @> '5'
  360. ----
  361. true
  362. # -- But a raw scalar cannot contain an array
  363. query B
  364. SELECT '5'::JSONB @> '[5]'
  365. ----
  366. false
  367. # -- In general, one thing should always contain itself. Test array containment:
  368. query B
  369. SELECT '["9", ["7", "3"], 1]'::JSONB @> '["9", ["7", "3"], 1]'::jsonb
  370. ----
  371. true
  372. query B
  373. SELECT '["9", ["7", "3"], ["1"]]'::JSONB @> '["9", ["7", "3"], ["1"]]'::jsonb
  374. ----
  375. true
  376. # -- array containment string matching confusion bug
  377. query B
  378. SELECT '{ "name": "Bob", "tags": [ "enim", "qui"]}'::JSONB @> '{"tags":["qu"]}'
  379. ----
  380. false