json.slt 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747
  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/json
  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. simple conn=mz_system,user=mz_system
  21. ALTER SYSTEM SET unsafe_enable_table_keys = true
  22. ----
  23. COMPLETE 0
  24. ## Basic creation
  25. query TT
  26. SELECT '1'::JSONB, '2'::JSON
  27. ----
  28. 1 2
  29. query T
  30. SELECT pg_typeof(JSON '1')
  31. ----
  32. jsonb
  33. query T
  34. SELECT pg_typeof(JSONB '1')
  35. ----
  36. jsonb
  37. query T
  38. SELECT '1.00'::JSON
  39. ----
  40. 1.00
  41. statement error unexpected EOF
  42. SELECT '{'::JSON
  43. query T
  44. SELECT '"hello"'::JSON
  45. ----
  46. "hello"
  47. query T
  48. SELECT '"abc\n123"'::JSON
  49. ----
  50. "abc\n123"
  51. query TTT
  52. SELECT 'true'::JSON, 'false'::JSON, 'null'::JSON
  53. ----
  54. true false null
  55. query T
  56. SELECT '[]'::JSON
  57. ----
  58. []
  59. query T
  60. SELECT '[1,2,3]'::JSON
  61. ----
  62. [1,2,3]
  63. query T
  64. SELECT '[1,"hello",[[[true,false]]]]'::JSON
  65. ----
  66. [1,"hello",[[[true,false]]]]
  67. query T
  68. SELECT '[1,"hello",{"a": ["foo",{"b": 3}]}]'::JSON
  69. ----
  70. [1,"hello",{"a":["foo",{"b":3}]}]
  71. query T
  72. SELECT '{}'::JSON
  73. ----
  74. {}
  75. query T
  76. SELECT '{"a":"b","c":"d"}'::JSON
  77. ----
  78. {"a":"b","c":"d"}
  79. query T
  80. SELECT '{"a":1,"c":{"foo":"bar"}}'::JSON
  81. ----
  82. {"a":1,"c":{"foo":"bar"}}
  83. # Only the final occurrence of a key in an object is kept.
  84. query T
  85. SELECT '{"a":1,"a":2}'::JSON
  86. ----
  87. {"a":2}
  88. query T
  89. SELECT NULL::JSON
  90. ----
  91. NULL
  92. statement error arrays of jsonb not allowed.*\nHINT:.*23468
  93. SELECT ARRAY['"hello"'::JSON]
  94. statement error arrays of jsonb not allowed.*\nHINT:.*23468
  95. SELECT '{}'::JSONB[]
  96. statement error arrays of jsonb not allowed.*\nHINT:.*23468
  97. CREATE TABLE x (y JSONB[])
  98. statement ok
  99. CREATE TABLE foo (bar JSON)
  100. statement ok
  101. INSERT INTO foo VALUES
  102. ('{"a":"b"}'),
  103. ('[1,2,3]'),
  104. ('"hello"'),
  105. ('1.000'),
  106. ('true'),
  107. ('false'),
  108. (NULL),
  109. ('{"x":[1,2,3]}'),
  110. ('{"x":{"y":"z"}}')
  111. query T rowsort
  112. SELECT bar FROM foo
  113. ----
  114. {"a":"b"}
  115. [1,2,3]
  116. "hello"
  117. 1.000
  118. true
  119. false
  120. NULL
  121. {"x":[1,2,3]}
  122. {"x":{"y":"z"}}
  123. query T
  124. SELECT bar FROM foo WHERE bar->>'a' = 'b'
  125. ----
  126. {"a":"b"}
  127. query T
  128. SELECT bar FROM foo WHERE bar ? 'a'
  129. ----
  130. {"a":"b"}
  131. query BBBBBBB
  132. VALUES (
  133. '"hello"'::JSONB ? 'hello',
  134. '"hello"'::JSONB ? 'goodbye',
  135. '"hello"'::JSONB ? 'ello',
  136. '"hello"'::JSONB ? 'h',
  137. 'true'::JSONB ? 'true',
  138. '1'::JSONB ? '1',
  139. 'null'::JSONB ? 'null'
  140. )
  141. ----
  142. true false false false false false false
  143. query T
  144. SELECT bar FROM foo WHERE bar ? 'hello'
  145. ----
  146. "hello"
  147. query T
  148. SELECT bar FROM foo WHERE bar ? 'goodbye'
  149. ----
  150. query T
  151. SELECT bar FROM foo WHERE bar ?| ARRAY['a','b']
  152. ----
  153. {"a":"b"}
  154. query T
  155. SELECT bar FROM foo WHERE bar ?& ARRAY['a','b']
  156. ----
  157. # ?| and ?& ignore NULLs.
  158. query T
  159. SELECT bar FROM foo WHERE bar ?| ARRAY['a',null]
  160. ----
  161. {"a":"b"}
  162. # TODO(justin):cockroach#29355
  163. # query T
  164. # SELECT bar FROM foo WHERE bar ?| ARRAY[null,null]::STRING[]
  165. # ----
  166. query T
  167. SELECT bar FROM foo WHERE bar ?& ARRAY['a',null]
  168. ----
  169. {"a":"b"}
  170. query T
  171. SELECT bar FROM foo WHERE bar->'a' = '"b"'::JSON
  172. ----
  173. {"a":"b"}
  174. statement error pgcode 0A000 can't order by column type jsonb.*\nHINT.*32706
  175. SELECT bar FROM foo ORDER BY bar
  176. statement error pgcode 0A000 column k is of type jsonb and thus is not indexable
  177. CREATE TABLE pk (k JSON PRIMARY KEY)
  178. query T rowsort
  179. SELECT bar->'a' FROM foo
  180. ----
  181. "b"
  182. NULL
  183. NULL
  184. NULL
  185. NULL
  186. NULL
  187. NULL
  188. NULL
  189. NULL
  190. query T
  191. SELECT * from foo where bar->'x' = '[1]'
  192. ----
  193. query T
  194. SELECT * from foo where bar->'x' = '{}'
  195. ----
  196. statement ok
  197. DELETE FROM foo
  198. statement ok
  199. INSERT INTO foo VALUES ('{"a":{"c":"d"}}');
  200. query TT
  201. SELECT bar->'a'->'c',bar->'a'->>'c' FROM foo
  202. ----
  203. "d" d
  204. statement ok
  205. CREATE TABLE multiple (a JSON,b JSON)
  206. statement ok
  207. INSERT INTO multiple VALUES ('{"a":"b"}','[1,2,3,4,"foo"]')
  208. query T
  209. SELECT a FROM multiple
  210. ----
  211. {"a":"b"}
  212. query T
  213. SELECT b FROM multiple
  214. ----
  215. [1,2,3,4,"foo"]
  216. ## Comparisons
  217. # We opt to not expose <,>,<=,>= at this time,to avoid having to commit to
  218. # an ordering.
  219. query B
  220. SELECT '1'::JSON = '1'::JSON
  221. ----
  222. true
  223. query B
  224. SELECT '1'::JSON = '1'
  225. ----
  226. true
  227. query B
  228. SELECT '1'::JSON = '2'::JSON
  229. ----
  230. false
  231. query B
  232. SELECT '1.00'::JSON = '1'::JSON
  233. ----
  234. true
  235. query BB
  236. SELECT '"hello"'::JSON = '"hello"'::JSON,'"hello"'::JSON = '"goodbye"'::JSON
  237. ----
  238. true false
  239. query B
  240. SELECT '"hello"'::JSON IN ('"hello"'::JSON,'1'::JSON,'[]'::JSON)
  241. ----
  242. true
  243. query B
  244. SELECT 'false'::JSON IN ('"hello"'::JSON,'1'::JSON,'[]'::JSON)
  245. ----
  246. false
  247. ## Operators
  248. query T
  249. SELECT '{"a":1}'::JSONB->'a'
  250. ----
  251. 1
  252. query T
  253. SELECT pg_typeof('{"a":1}'::JSONB->'a')
  254. ----
  255. jsonb
  256. query T
  257. SELECT '{"a":1,"b":2}'::JSONB->'b'
  258. ----
  259. 2
  260. query T
  261. SELECT '{"a":1,"b":{"c":3}}'::JSONB->'b'->'c'
  262. ----
  263. 3
  264. query TT
  265. SELECT '{"a":1,"b":2}'::JSONB->'c','{"c":1}'::JSONB->'a'
  266. ----
  267. NULL NULL
  268. query TT
  269. SELECT '2'::JSONB->'b','[1,2,3]'::JSONB->'0'
  270. ----
  271. NULL NULL
  272. query T
  273. SELECT '[1,2,3]'::JSONB->0
  274. ----
  275. 1
  276. query T
  277. SELECT '[1,2,3]'::JSONB->3
  278. ----
  279. NULL
  280. query T
  281. SELECT '{"a":"b"}'::JSONB->>'a'
  282. ----
  283. b
  284. query T
  285. SELECT '[null]'::JSONB->>0
  286. ----
  287. NULL
  288. query T
  289. SELECT '{"a":null}'::JSONB->>'a'
  290. ----
  291. NULL
  292. query T
  293. SELECT pg_typeof('{"a":1}'::JSONB->>'a')
  294. ----
  295. string
  296. query T
  297. SELECT '{"a":1,"b":2}'::JSONB->>'b'
  298. ----
  299. 2
  300. query TT
  301. SELECT '{"a":1,"b":2}'::JSONB->>'c','{"c":1}'::JSONB->>'a'
  302. ----
  303. NULL NULL
  304. query TT
  305. SELECT '2'::JSONB->>'b','[1,2,3]'::JSONB->>'0'
  306. ----
  307. NULL NULL
  308. query T
  309. SELECT '[1,2,3]'::JSONB->>0
  310. ----
  311. 1
  312. query T
  313. SELECT '[1,2,3]'::JSONB->>3
  314. ----
  315. NULL
  316. query T
  317. SELECT '{"a":1}'::JSONB#>'{a}'::STRING[]
  318. ----
  319. 1
  320. query T
  321. SELECT '{"a":{"b":"c"}}'::JSONB#>'{a,b}'::STRING[]
  322. ----
  323. "c"
  324. query T
  325. SELECT '{"a":["b"]}'::JSONB#>'{a,b}'::STRING[]
  326. ----
  327. NULL
  328. query T
  329. SELECT '{"a":["b"]}'::JSONB#>'{a,0}'::STRING[]
  330. ----
  331. "b"
  332. query T
  333. SELECT '{"a":1}'::JSONB#>>ARRAY['foo',null]
  334. ----
  335. NULL
  336. query T
  337. SELECT '{"a":1}'::JSONB#>>'{a}'::STRING[]
  338. ----
  339. 1
  340. query T
  341. SELECT '{"a":{"b":"c"}}'::JSONB#>>'{a,b}'::STRING[]
  342. ----
  343. c
  344. query T
  345. SELECT '{"a":["b"]}'::JSONB#>>'{a,b}'::STRING[]
  346. ----
  347. NULL
  348. query T
  349. SELECT '{"a":["b"]}'::JSONB#>>'{a,0}'::STRING[]
  350. ----
  351. b
  352. query T
  353. SELECT '{"a":[null]}'::JSONB#>>'{a,0}'::STRING[]
  354. ----
  355. NULL
  356. query BB
  357. SELECT '{"a":1}'::JSONB ? 'a','{"a":1}'::JSONB ? 'b'
  358. ----
  359. true false
  360. query BB
  361. SELECT '{"a":1,"b":1}'::JSONB ? 'a','{"a":1,"b":1}'::JSONB ? 'b'
  362. ----
  363. true true
  364. query BB
  365. SELECT '{"a":1}'::JSONB ?| ARRAY['a','b'],'{"b":1}'::JSONB ?| ARRAY['a','b']
  366. ----
  367. true true
  368. query B
  369. SELECT '{"c":1}'::JSONB ?| ARRAY['a','b']
  370. ----
  371. false
  372. query BB
  373. SELECT '{"a":1}'::JSONB ?& ARRAY['a','b'],'{"b":1}'::JSONB ?& ARRAY['a','b']
  374. ----
  375. false false
  376. query B
  377. SELECT '{"a":1,"b":1,"c":1}'::JSONB ?& ARRAY['a','b']
  378. ----
  379. true
  380. ## Arrays do not `?` their stringified indices.
  381. query B
  382. SELECT '[1,2,3]'::JSONB ? '0'
  383. ----
  384. false
  385. ## Arrays `?` string elements.
  386. query B
  387. SELECT '["foo","bar","baz"]'::JSONB ? 'foo'
  388. ----
  389. true
  390. query B
  391. SELECT '["foo","bar","baz"]'::JSONB ? 'baz'
  392. ----
  393. true
  394. query B
  395. SELECT '["foo","bar","baz"]'::JSONB ? 'gup'
  396. ----
  397. false
  398. query B
  399. SELECT '["foo","bar","baz"]'::JSONB ?| ARRAY['foo','gup']
  400. ----
  401. true
  402. query B
  403. SELECT '["foo","bar","baz"]'::JSONB ?| ARRAY['buh','gup']
  404. ----
  405. false
  406. query B
  407. SELECT '["foo","bar","baz"]'::JSONB ?& ARRAY['foo','bar']
  408. ----
  409. true
  410. query B
  411. SELECT '["foo","bar","baz"]'::JSONB ?& ARRAY['foo','buh']
  412. ----
  413. false
  414. query T
  415. SELECT '{"a":1}'::JSONB - 'a'
  416. ----
  417. {}
  418. query T
  419. SELECT '{"a":1}'::JSONB - 'b'
  420. ----
  421. {"a":1}
  422. # `-` is one of the very few cases that PG errors in a JSON type mismatch with operators.
  423. query T
  424. SELECT '[1,2,3]'::JSONB - 0
  425. ----
  426. [2,3]
  427. query T
  428. SELECT '[1,2,3]'::JSONB - 1
  429. ----
  430. [1,3]
  431. statement error pgcode 22023 cannot delete from scalar
  432. SELECT '3'::JSONB - 'b'
  433. statement error pgcode 22023 cannot delete from object using integer index
  434. SELECT '{}'::JSONB - 1
  435. query B
  436. SELECT '[1,2,3]'::JSONB <@ '[1,2]'::JSONB
  437. ----
  438. false
  439. query B
  440. SELECT '[1,2]'::JSONB <@ '[1,2,3]'::JSONB
  441. ----
  442. true
  443. query B
  444. SELECT '[1,2]'::JSONB @> '[1,2,3]'::JSONB
  445. ----
  446. false
  447. query B
  448. SELECT '[1,2,3]'::JSONB @> '[1,2]'::JSONB
  449. ----
  450. true
  451. query B
  452. SELECT '{"a":[1,2,3]}'::JSONB->'a' @> '2'::JSONB
  453. ----
  454. true
  455. statement ok
  456. CREATE TABLE x (j JSONB)
  457. statement ok
  458. INSERT INTO x VALUES ('{"a":[1,2,3]}')
  459. query B
  460. SELECT true FROM x WHERE j->'a' @> '2'::JSONB
  461. ----
  462. true
  463. statement ok
  464. CREATE INVERTED INDEX ON x (j)
  465. query B
  466. SELECT true FROM x WHERE j->'a' @> '2'::JSONB
  467. ----
  468. true
  469. query T
  470. SELECT '{"foo":{"bar":1}}'::JSONB #- ARRAY['foo','bar']
  471. ----
  472. {"foo":{}}
  473. statement error path element at position 1 is null
  474. SELECT '{"foo":{"bar":1}}'::JSONB #- ARRAY[null,'foo']
  475. statement error path element at position 2 is null
  476. SELECT '{"foo":{"bar":1}}'::JSONB #- ARRAY['foo',null]
  477. query T
  478. SELECT '{"foo":{"bar":1}}'::JSONB #- ARRAY['foo']
  479. ----
  480. {}
  481. query T
  482. SELECT '{"foo":{"bar":1}}'::JSONB #- ARRAY['bar']
  483. ----
  484. {"foo":{"bar":1}}
  485. query T
  486. SELECT '{"foo":{"bar":1},"one":1,"two":2}'::JSONB #- ARRAY['one']
  487. ----
  488. {"foo":{"bar":1},"two":2}
  489. query T
  490. SELECT '{}'::JSONB #- ARRAY['foo']
  491. ----
  492. {}
  493. query T
  494. SELECT '{"foo":{"bar":1}}'::JSONB #- ARRAY['']
  495. ----
  496. {"foo":{"bar":1}}
  497. query T
  498. SELECT '{"a":"b"}'::JSONB::STRING
  499. ----
  500. {"a":"b"}
  501. query T
  502. SELECT CAST('{"a":"b"}'::JSONB AS STRING)
  503. ----
  504. {"a":"b"}
  505. query T
  506. SELECT '["1","2","3"]'::JSONB - '1'
  507. ----
  508. ["2","3"]
  509. query T
  510. SELECT '["1","2","1","2","3"]'::JSONB - '2'
  511. ----
  512. ["1","1","3"]
  513. query T
  514. SELECT '["1","2","3"]'::JSONB - '4'
  515. ----
  516. ["1","2","3"]
  517. query T
  518. SELECT '[]'::JSONB - '1'
  519. ----
  520. []
  521. query T
  522. SELECT '["1","2","3"]'::JSONB - ''
  523. ----
  524. ["1","2","3"]
  525. query T
  526. SELECT '[1,"1",1.0]'::JSONB - '1'
  527. ----
  528. [1,1.0]
  529. query T
  530. SELECT '[1,2,3]'::JSONB #- ARRAY['0']
  531. ----
  532. [2,3]
  533. query T
  534. SELECT '[1,2,3]'::JSONB #- ARRAY['3']
  535. ----
  536. [1,2,3]
  537. query T
  538. SELECT '[]'::JSONB #- ARRAY['0']
  539. ----
  540. []
  541. statement error pgcode 22P02 a path element is not an integer:foo
  542. SELECT '["foo"]'::JSONB #- ARRAY['foo']
  543. query T
  544. SELECT '{"a":["foo"]}'::JSONB #- ARRAY['a','0']
  545. ----
  546. {"a":[]}
  547. query T
  548. SELECT '{"a":["foo","bar"]}'::JSONB #- ARRAY['a','1']
  549. ----
  550. {"a":["foo"]}
  551. query T
  552. SELECT '{"a":[]}'::JSONB #- ARRAY['a','0']
  553. ----
  554. {"a":[]}
  555. query T
  556. SELECT '{"a":123,"b":456,"c":567}'::JSONB - array[]:::text[];
  557. ----
  558. {"a":123,"b":456,"c":567}
  559. query T
  560. SELECT '{"a":123,"b":456,"c":567}'::JSONB - array['a','c'];
  561. ----
  562. {"b":456}
  563. query T
  564. SELECT '{"a":123,"c":"asdf"}'::JSONB - array['a','c'];
  565. ----
  566. {}
  567. query T
  568. SELECT '{}'::JSONB - array['a','c'];
  569. ----
  570. {}
  571. query T
  572. SELECT '{"b":[],"c":{"a":"b"}}'::JSONB - array['a'];
  573. ----
  574. {"b":[],"c":{"a":"b"}}
  575. # Regression test for cockroach#34756.
  576. query T
  577. SELECT '{"b":[],"c":{"a":"b"}}'::JSONB - array['foo',NULL]
  578. ----
  579. {"b":[],"c":{"a":"b"}}
  580. statement error pgcode 22P02 a path element is not an integer:foo
  581. SELECT '{"a":{"b":["foo"]}}'::JSONB #- ARRAY['a','b','foo']
  582. subtest single_family_jsonb
  583. statement ok
  584. CREATE TABLE json_family (a INT PRIMARY KEY,b JSONB,FAMILY fam0(a),FAMILY fam1(b))
  585. statement ok
  586. INSERT INTO json_family VALUES(0,'{}')
  587. statement ok
  588. INSERT INTO json_family VALUES(1,'{"a":123,"c":"asdf"}')
  589. query IT colnames
  590. SELECT a,b FROM json_family ORDER BY a
  591. ----
  592. a b
  593. 0 {}
  594. 1 {"a":123,"c":"asdf"}
  595. statement ok
  596. DROP TABLE json_family