jsonb.slt 38 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191
  1. # Copyright Materialize, Inc. and contributors. All rights reserved.
  2. #
  3. # Use of this software is governed by the Business Source License
  4. # included in the LICENSE file at the root of this repository.
  5. #
  6. # As of the Change Date specified in that file, in accordance with
  7. # the Business Source License, use of this software will be governed
  8. # by the Apache License, Version 2.0.
  9. #
  10. # This file is derived from the logic test suite in CockroachDB. The
  11. # original file was retrieved on June 10, 2019 from:
  12. #
  13. # https://github.com/cockroachdb/cockroach/blob/d2f7fbf5dd1fc1a099bbad790a2e1f7c60a66cc3/pkg/sql/logictest/testdata/logic_test/json_builtins
  14. #
  15. # The original source code is subject to the terms of the Apache
  16. # 2.0 license, a copy of which can be found in the LICENSE file at the
  17. # root of this repository.
  18. # These tests came from cockroack/postgres_jsonb.slt, cockroach/json.slt and cockroach/json_builtins.slt
  19. # but are modified for the subset of json we support
  20. mode cockroach
  21. query T
  22. SELECT '[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]'::jsonb
  23. ----
  24. [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
  25. query T
  26. SELECT '{"a": 1, "a": 2, "a": 3}'::jsonb
  27. ----
  28. {"a":3}
  29. # Regression test for database-issues#1824, in which 64-bit integers could not be represented
  30. # in the jsonb type.
  31. query T
  32. SELECT '1614259308542846100'::jsonb
  33. ----
  34. 1614259308542846100
  35. query T
  36. SELECT '9223372036854775807'::jsonb
  37. ----
  38. 9223372036854775807
  39. query T
  40. SELECT '999999999999999999999999999999999999999'::jsonb
  41. ----
  42. 999999999999999999999999999999999999999
  43. query error invalid input syntax for type jsonb: "1000000000000000000000000000000000000000" is out of range for type numeric: exceeds maximum precision 39 at line 1
  44. SELECT '1000000000000000000000000000000000000000'::jsonb
  45. # "NaN" is not a valid JSON number, but it is a valid numeric value. Validate
  46. # that the conversion to JSON converts NaN-valued numerics to strings.
  47. query T
  48. SELECT jsonb_typeof(to_jsonb('NaN'::numeric))
  49. ----
  50. string
  51. statement ok
  52. CREATE TABLE test_jsonb (
  53. json_type text,
  54. test_json jsonb
  55. )
  56. statement ok
  57. INSERT INTO test_jsonb VALUES
  58. ('scalar','"a scalar"'),
  59. ('array','["zero", "one","two",null,"four","five", [1,2,3],{"f1":9}]'),
  60. ('object','{"field1":"val1","field2":"val2","field3":null, "field4": 4, "field5": [1,2,3], "field6": {"f1":9}}')
  61. query T
  62. SELECT test_json -> 'x' FROM test_jsonb WHERE json_type = 'scalar'
  63. ----
  64. NULL
  65. query T
  66. SELECT test_json -> 'x' FROM test_jsonb WHERE json_type = 'array'
  67. ----
  68. NULL
  69. query T
  70. SELECT test_json -> 'x' FROM test_jsonb WHERE json_type = 'object'
  71. ----
  72. NULL
  73. query T
  74. SELECT test_json -> 'field2' FROM test_jsonb WHERE json_type = 'object'
  75. ----
  76. "val2"
  77. query T
  78. SELECT test_json ->> 'field2' FROM test_jsonb WHERE json_type = 'scalar'
  79. ----
  80. NULL
  81. query T
  82. SELECT test_json ->> 'field2' FROM test_jsonb WHERE json_type = 'array'
  83. ----
  84. NULL
  85. query T
  86. SELECT test_json ->> 'field2' FROM test_jsonb WHERE json_type = 'object'
  87. ----
  88. val2
  89. query T
  90. SELECT test_json -> 2 FROM test_jsonb WHERE json_type = 'scalar'
  91. ----
  92. NULL
  93. query T
  94. SELECT test_json -> 2 FROM test_jsonb WHERE json_type = 'array'
  95. ----
  96. "two"
  97. query T
  98. SELECT test_json -> 9 FROM test_jsonb WHERE json_type = 'array'
  99. ----
  100. NULL
  101. query T
  102. SELECT test_json -> 2 FROM test_jsonb WHERE json_type = 'object'
  103. ----
  104. NULL
  105. query T
  106. SELECT test_json ->> 6 FROM test_jsonb WHERE json_type = 'array'
  107. ----
  108. [1,2,3]
  109. query T
  110. SELECT test_json ->> 7 FROM test_jsonb WHERE json_type = 'array'
  111. ----
  112. {"f1":9}
  113. query T
  114. SELECT test_json ->> 'field4' FROM test_jsonb WHERE json_type = 'object'
  115. ----
  116. 4
  117. query T
  118. SELECT test_json ->> 'field5' FROM test_jsonb WHERE json_type = 'object'
  119. ----
  120. [1,2,3]
  121. query T
  122. SELECT test_json ->> 'field6' FROM test_jsonb WHERE json_type = 'object'
  123. ----
  124. {"f1":9}
  125. query T
  126. SELECT test_json ->> 2 FROM test_jsonb WHERE json_type = 'scalar'
  127. ----
  128. NULL
  129. query T
  130. SELECT test_json ->> 2 FROM test_jsonb WHERE json_type = 'array'
  131. ----
  132. two
  133. query T
  134. SELECT test_json ->> 2 FROM test_jsonb WHERE json_type = 'object'
  135. ----
  136. NULL
  137. # nulls
  138. query B
  139. SELECT (test_json->'field3') IS NULL AS expect_false FROM test_jsonb WHERE json_type = 'object'
  140. ----
  141. false
  142. query T
  143. SELECT (test_json->>'field3') FROM test_jsonb WHERE json_type = 'object';
  144. ----
  145. NULL
  146. query B
  147. SELECT (test_json->>'field3') IS NULL AS expect_true FROM test_jsonb WHERE json_type = 'object';
  148. ----
  149. true
  150. query B
  151. SELECT (test_json->3) IS NULL AS expect_false FROM test_jsonb WHERE json_type = 'array';
  152. ----
  153. false
  154. query B
  155. SELECT (test_json->>3) IS NULL AS expect_true FROM test_jsonb WHERE json_type = 'array';
  156. ----
  157. true
  158. # corner cases
  159. query T
  160. SELECT '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb -> null::text;
  161. ----
  162. NULL
  163. query T
  164. SELECT '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb -> null::int;
  165. ----
  166. NULL
  167. query T
  168. SELECT '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb -> 1;
  169. ----
  170. NULL
  171. query T
  172. SELECT '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb -> 'z';
  173. ----
  174. NULL
  175. query T
  176. SELECT '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb -> '';
  177. ----
  178. NULL
  179. query T
  180. SELECT '[{"b": "c"}, {"b": "cc"}]'::jsonb -> 1;
  181. ----
  182. {"b":"cc"}
  183. query T
  184. SELECT '[{"b": "c"}, {"b": "cc"}]'::jsonb -> 3;
  185. ----
  186. NULL
  187. query T
  188. SELECT '[{"b": "c"}, {"b": "cc"}]'::jsonb -> 'z';
  189. ----
  190. NULL
  191. query T
  192. SELECT '{"a": "c", "b": null}'::jsonb -> 'b';
  193. ----
  194. null
  195. query T
  196. SELECT '"foo"'::jsonb -> 1;
  197. ----
  198. NULL
  199. query T
  200. SELECT '"foo"'::jsonb -> 'z';
  201. ----
  202. NULL
  203. query T
  204. SELECT '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb ->> null::text;
  205. ----
  206. NULL
  207. query T
  208. SELECT '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb ->> null::int;
  209. ----
  210. NULL
  211. query T
  212. SELECT '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb ->> 1;
  213. ----
  214. NULL
  215. query T
  216. SELECT '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb ->> 'z';
  217. ----
  218. NULL
  219. query T
  220. SELECT '{"a": [{"b": "c"}, {"b": "cc"}]}'::jsonb ->> '';
  221. ----
  222. NULL
  223. query T
  224. SELECT '[{"b": "c"}, {"b": "cc"}]'::jsonb ->> 1;
  225. ----
  226. {"b":"cc"}
  227. query T
  228. SELECT '[{"b": "c"}, {"b": "cc"}]'::jsonb ->> 3;
  229. ----
  230. NULL
  231. query T
  232. SELECT '[{"b": "c"}, {"b": "cc"}]'::jsonb ->> 'z';
  233. ----
  234. NULL
  235. query T
  236. SELECT '{"a": "c", "b": null}'::jsonb ->> 'b';
  237. ----
  238. NULL
  239. query T
  240. SELECT '"foo"'::jsonb ->> 1;
  241. ----
  242. NULL
  243. query T
  244. SELECT '"foo"'::jsonb ->> 'z';
  245. ----
  246. NULL
  247. # equality and inequality
  248. query B
  249. SELECT '{"x":"y"}'::jsonb = '{"x":"y"}'::jsonb;
  250. ----
  251. true
  252. query B
  253. SELECT '{"x":"y"}'::jsonb = '{"x":"z"}'::jsonb;
  254. ----
  255. false
  256. query B
  257. SELECT '{"x":"y"}'::jsonb <> '{"x":"y"}'::jsonb;
  258. ----
  259. false
  260. query B
  261. SELECT '{"x":"y"}'::jsonb <> '{"x":"z"}'::jsonb;
  262. ----
  263. true
  264. # containment
  265. query B
  266. SELECT '{"a":"b", "b":1, "c":null}'::JSONB @> '{"a":"b"}'
  267. ----
  268. true
  269. query B
  270. SELECT '{"a":"b", "b":1, "c":null}'::JSONB @> '{"a":"b", "c":null}'
  271. ----
  272. true
  273. query B
  274. SELECT '{"a":"b", "b":1, "c":null}'::JSONB @> '{"a":"b", "g":null}'
  275. ----
  276. false
  277. query B
  278. SELECT '{"a":"b", "b":1, "c":null}'::JSONB @> '{"g":null}'
  279. ----
  280. false
  281. query B
  282. SELECT '{"a":"b", "b":1, "c":null}'::JSONB @> '{"a":"c"}'
  283. ----
  284. false
  285. query B
  286. SELECT '{"a":"b", "b":1, "c":null}'::JSONB @> '{"a":"b"}'
  287. ----
  288. true
  289. query B
  290. SELECT '{"a":"b", "b":1, "c":null}'::JSONB @> '{"a":"b", "c":"q"}'
  291. ----
  292. false
  293. query B
  294. SELECT '{"a":"b", "b":1, "c":null}'::JSONB @> '{"a":"b"}'
  295. ----
  296. true
  297. query B
  298. SELECT '{"a":"b", "b":1, "c":null}'::JSONB @> '{"a":"b", "c":null}'
  299. ----
  300. true
  301. query B
  302. SELECT '{"a":"b", "b":1, "c":null}'::JSONB @> '{"a":"b", "g":null}'
  303. ----
  304. false
  305. query B
  306. SELECT '{"a":"b", "b":1, "c":null}'::JSONB @> '{"g":null}'
  307. ----
  308. false
  309. query B
  310. SELECT '{"a":"b", "b":1, "c":null}'::JSONB @> '{"a":"c"}'
  311. ----
  312. false
  313. query B
  314. SELECT '{"a":"b", "b":1, "c":null}'::JSONB @> '{"a":"b"}'
  315. ----
  316. true
  317. query B
  318. SELECT '{"a":"b", "b":1, "c":null}'::JSONB @> '{"a":"b", "c":"q"}'
  319. ----
  320. false
  321. query B
  322. SELECT '[1,2]'::JSONB @> '[1,2,2]'::jsonb
  323. ----
  324. true
  325. query B
  326. SELECT '[1,1,2]'::JSONB @> '[1,2,2]'::jsonb
  327. ----
  328. true
  329. query B
  330. SELECT '[[1,2]]'::JSONB @> '[[1,2,2]]'::jsonb
  331. ----
  332. true
  333. query B
  334. SELECT '[1,2,2]'::JSONB <@ '[1,2]'::jsonb
  335. ----
  336. true
  337. query B
  338. SELECT '[1,2,2]'::JSONB <@ '[1,1,2]'::jsonb
  339. ----
  340. true
  341. query B
  342. SELECT '[[1,2,2]]'::JSONB <@ '[[1,2]]'::jsonb
  343. ----
  344. true
  345. query B
  346. SELECT '{"a":"b"}'::JSONB <@ '{"a":"b", "b":1, "c":null}'
  347. ----
  348. true
  349. query B
  350. SELECT '{"a":"b", "c":null}'::JSONB <@ '{"a":"b", "b":1, "c":null}'
  351. ----
  352. true
  353. query B
  354. SELECT '{"a":"b", "g":null}'::JSONB <@ '{"a":"b", "b":1, "c":null}'
  355. ----
  356. false
  357. query B
  358. SELECT '{"g":null}'::JSONB <@ '{"a":"b", "b":1, "c":null}'
  359. ----
  360. false
  361. query B
  362. SELECT '{"a":"c"}'::JSONB <@ '{"a":"b", "b":1, "c":null}'
  363. ----
  364. false
  365. query B
  366. SELECT '{"a":"b"}'::JSONB <@ '{"a":"b", "b":1, "c":null}'
  367. ----
  368. true
  369. query B
  370. SELECT '{"a":"b", "c":"q"}'::JSONB <@ '{"a":"b", "b":1, "c":null}'
  371. ----
  372. false
  373. # Raw scalar may contain another raw scalar, array may contain a raw scalar
  374. query B
  375. SELECT '[5]'::JSONB @> '[5]'
  376. ----
  377. true
  378. query B
  379. SELECT '5'::JSONB @> '5'
  380. ----
  381. true
  382. query B
  383. SELECT '[5]'::JSONB @> '5'
  384. ----
  385. true
  386. # -- But a raw scalar cannot contain an array
  387. query B
  388. SELECT '5'::JSONB @> '[5]'
  389. ----
  390. false
  391. # -- In general, one thing should always contain itself. Test array containment:
  392. query B
  393. SELECT '["9", ["7", "3"], 1]'::JSONB @> '["9", ["7", "3"], 1]'::jsonb
  394. ----
  395. true
  396. query B
  397. SELECT '["9", ["7", "3"], ["1"]]'::JSONB @> '["9", ["7", "3"], ["1"]]'::jsonb
  398. ----
  399. true
  400. # -- array containment string matching confusion bug
  401. query B
  402. SELECT '{ "name": "Bob", "tags": [ "enim", "qui"]}'::JSONB @> '{"tags":["qu"]}'
  403. ----
  404. false
  405. query T
  406. SELECT '1'::JSONB
  407. ----
  408. 1
  409. query T
  410. SELECT pg_typeof('1'::JSONB)
  411. ----
  412. jsonb
  413. query error EOF while parsing an object at line 1
  414. SELECT '{'::JSONB
  415. query T
  416. SELECT '{"a":1}'::JSONB->'a'
  417. ----
  418. 1
  419. query T
  420. SELECT pg_typeof('{"a":1}'::JSONB->'a')
  421. ----
  422. jsonb
  423. query T
  424. SELECT '{"a":1,"b":2}'::JSONB->'b'
  425. ----
  426. 2
  427. query T
  428. SELECT '{"a":1,"b":{"c":3}}'::JSONB->'b'->'c'
  429. ----
  430. 3
  431. query TT
  432. SELECT '{"a":1,"b":2}'::JSONB->'c','{"c":1}'::JSONB->'a'
  433. ----
  434. NULL NULL
  435. query TT
  436. SELECT '2'::JSONB->'b','[1,2,3]'::JSONB->'0'
  437. ----
  438. NULL NULL
  439. query T
  440. SELECT '[1,2,3]'::JSONB->0
  441. ----
  442. 1
  443. query T
  444. SELECT '[1,2,3]'::JSONB->3
  445. ----
  446. NULL
  447. query T
  448. SELECT '{"a":"b"}'::JSONB->>'a'
  449. ----
  450. b
  451. query T
  452. SELECT '[null]'::JSONB->>0
  453. ----
  454. NULL
  455. query T
  456. SELECT '{"a":null}'::JSONB->>'a'
  457. ----
  458. NULL
  459. query T
  460. SELECT pg_typeof('{"a":1}'::JSONB->>'a')
  461. ----
  462. text
  463. query T
  464. SELECT '{"a":1,"b":2}'::JSONB->>'b'
  465. ----
  466. 2
  467. query TT
  468. SELECT '{"a":1,"b":2}'::JSONB->>'c','{"c":1}'::JSONB->>'a'
  469. ----
  470. NULL NULL
  471. query TT
  472. SELECT '2'::JSONB->>'b','[1,2,3]'::JSONB->>'0'
  473. ----
  474. NULL NULL
  475. query T
  476. SELECT '[1,2,3]'::JSONB->>0
  477. ----
  478. 1
  479. query T
  480. SELECT '[1,2,3]'::JSONB->>3
  481. ----
  482. NULL
  483. query T
  484. SELECT '{"a":1}'::JSONB#>'{a}'::STRING[]
  485. ----
  486. 1
  487. query T
  488. SELECT '{"a":{"b":"c"}}'::JSONB#>'{a,b}'::STRING[]
  489. ----
  490. "c"
  491. query T
  492. SELECT '{"a":["b"]}'::JSONB#>'{a,b}'::STRING[]
  493. ----
  494. NULL
  495. query T
  496. SELECT '{"a":["b"]}'::JSONB#>'{a,0}'::STRING[]
  497. ----
  498. "b"
  499. query T
  500. SELECT '{"a":1}'::JSONB#>>ARRAY['foo',null]
  501. ----
  502. NULL
  503. query T
  504. SELECT '{"a":1}'::JSONB#>>'{a}'::STRING[]
  505. ----
  506. 1
  507. query T
  508. SELECT '{"a":{"b":"c"}}'::JSONB#>>'{a,b}'::STRING[]
  509. ----
  510. c
  511. query T
  512. SELECT '{"a":["b"]}'::JSONB#>>'{a,b}'::STRING[]
  513. ----
  514. NULL
  515. query T
  516. SELECT '{"a":["b"]}'::JSONB#>>'{a,0}'::STRING[]
  517. ----
  518. b
  519. query T
  520. SELECT '{"a":[null]}'::JSONB#>>'{a,0}'::STRING[]
  521. ----
  522. NULL
  523. query T
  524. SELECT '{"a": [1]}'::jsonb #>> '{a,1}';
  525. ----
  526. NULL
  527. query BB
  528. SELECT '{"a":1}'::JSONB ? 'a','{"a":1}'::JSONB ? 'b'
  529. ----
  530. true false
  531. query BB
  532. SELECT '{"a":1,"b":1}'::JSONB ? 'a','{"a":1,"b":1}'::JSONB ? 'b'
  533. ----
  534. true true
  535. # query BB
  536. # SELECT '{"a":1}'::JSONB ?| ARRAY['a','b'],'{"b":1}'::JSONB ?| ARRAY['a','b']
  537. # ----
  538. # true true
  539. # query B
  540. # SELECT '{"c":1}'::JSONB ?| ARRAY['a','b']
  541. # ----
  542. # false
  543. # query BB
  544. # SELECT '{"a":1}'::JSONB ?& ARRAY['a','b'],'{"b":1}'::JSONB ?& ARRAY['a','b']
  545. # ----
  546. # false false
  547. # query B
  548. # SELECT '{"a":1,"b":1,"c":1}'::JSONB ?& ARRAY['a','b']
  549. # ----
  550. # true
  551. ## Arrays do not `?` their stringified indices.
  552. query B
  553. SELECT '[1,2,3]'::JSONB ? '0'
  554. ----
  555. false
  556. ## Arrays `?` string elements.
  557. query B
  558. SELECT '["foo","bar","baz"]'::JSONB ? 'foo'
  559. ----
  560. true
  561. query B
  562. SELECT '["foo","bar","baz"]'::JSONB ? 'baz'
  563. ----
  564. true
  565. query B
  566. SELECT '["foo","bar","baz"]'::JSONB ? 'gup'
  567. ----
  568. false
  569. # query B
  570. # SELECT '["foo","bar","baz"]'::JSONB ?| ARRAY['foo','gup']
  571. # ----
  572. # true
  573. # query B
  574. # SELECT '["foo","bar","baz"]'::JSONB ?| ARRAY['buh','gup']
  575. # ----
  576. # false
  577. # query B
  578. # SELECT '["foo","bar","baz"]'::JSONB ?& ARRAY['foo','bar']
  579. # ----
  580. # true
  581. # query B
  582. # SELECT '["foo","bar","baz"]'::JSONB ?& ARRAY['foo','buh']
  583. # ----
  584. # false
  585. query T
  586. SELECT '{"a":1}'::JSONB - 'a'
  587. ----
  588. {}
  589. query T
  590. SELECT '{"a":1}'::JSONB - 'b'
  591. ----
  592. {"a":1}
  593. # `-` is one of the very few cases that PG errors in a JSON type mismatch with operators.
  594. query T
  595. SELECT '[1,2,3]'::JSONB - 0
  596. ----
  597. [2,3]
  598. query T
  599. SELECT '[1,2,3]'::JSONB - 1
  600. ----
  601. [1,3]
  602. query T
  603. SELECT '3'::JSONB - 'b'
  604. ----
  605. NULL
  606. query T
  607. SELECT '{}'::JSONB - 1
  608. ----
  609. NULL
  610. query B
  611. SELECT '[1,2,3]'::JSONB <@ '[1,2]'::JSONB
  612. ----
  613. false
  614. query B
  615. SELECT '[1,2]'::JSONB <@ '[1,2,3]'::JSONB
  616. ----
  617. true
  618. query B
  619. SELECT '[1,2]'::JSONB @> '[1,2,3]'::JSONB
  620. ----
  621. false
  622. query B
  623. SELECT '[1,2,3]'::JSONB @> '[1,2]'::JSONB
  624. ----
  625. true
  626. query B
  627. SELECT '{"a":[1,2,3]}'::JSONB->'a' @> '2'::JSONB
  628. ----
  629. true
  630. statement ok
  631. CREATE TABLE x (j JSONB)
  632. statement ok
  633. INSERT INTO x VALUES ('{"a":[1,2,3]}')
  634. query B
  635. SELECT true FROM x WHERE j->'a' @> '2'::JSONB
  636. ----
  637. true
  638. query B
  639. SELECT true FROM x WHERE j->'a' @> '2'::JSONB
  640. ----
  641. true
  642. # query T
  643. # SELECT '{"foo":{"bar":1}}'::JSONB #- ARRAY['foo','bar']
  644. # ----
  645. # {"foo":{}}
  646. # statement error path element at position 1 is null
  647. # SELECT '{"foo":{"bar":1}}'::JSONB #- ARRAY[null,'foo']
  648. # statement error path element at position 2 is null
  649. # SELECT '{"foo":{"bar":1}}'::JSONB #- ARRAY['foo',null]
  650. # query T
  651. # SELECT '{"foo":{"bar":1}}'::JSONB #- ARRAY['foo']
  652. # ----
  653. # {}
  654. # query T
  655. # SELECT '{"foo":{"bar":1}}'::JSONB #- ARRAY['bar']
  656. # ----
  657. # {"foo":{"bar":1.0}}
  658. # query T
  659. # SELECT '{"foo":{"bar":1},"one":1,"two":2}'::JSONB #- ARRAY['one']
  660. # ----
  661. # {"foo":{"bar":1.0},"two":2.0}
  662. # query T
  663. # SELECT '{}'::JSONB #- ARRAY['foo']
  664. # ----
  665. # {}
  666. # query T
  667. # SELECT '{"foo":{"bar":1}}'::JSONB #- ARRAY['']
  668. # ----
  669. # {"foo":{"bar":1.0}}
  670. query T
  671. SELECT '{"a":"b"}'::JSONB::STRING
  672. ----
  673. {"a":"b"}
  674. query T
  675. SELECT CAST('{"a":"b"}'::JSONB AS STRING)
  676. ----
  677. {"a":"b"}
  678. query T
  679. SELECT '["1","2","3"]'::JSONB - '1'
  680. ----
  681. ["2","3"]
  682. query T
  683. SELECT '["1","2","1","2","3"]'::JSONB - '2'
  684. ----
  685. ["1","1","3"]
  686. query T
  687. SELECT '["1","2","3"]'::JSONB - '4'
  688. ----
  689. ["1","2","3"]
  690. query T
  691. SELECT '[]'::JSONB - '1'
  692. ----
  693. []
  694. query T
  695. SELECT '["1","2","3"]'::JSONB - ''
  696. ----
  697. ["1","2","3"]
  698. query T
  699. SELECT '[1,"1",1.0]'::JSONB - '1'
  700. ----
  701. [1,1]
  702. # query T
  703. # SELECT '[1,2,3]'::JSONB #- ARRAY['0']
  704. # ----
  705. # [2.0,3.0]
  706. # query T
  707. # SELECT '[1,2,3]'::JSONB #- ARRAY['3']
  708. # ----
  709. # [1.0,2.0,3.0]
  710. # query T
  711. # SELECT '[]'::JSONB #- ARRAY['0']
  712. # ----
  713. # []
  714. # statement error pgcode 22P02 a path element is not an integer:foo
  715. # SELECT '["foo"]'::JSONB #- ARRAY['foo']
  716. # query T
  717. # SELECT '{"a":["foo"]}'::JSONB #- ARRAY['a','0']
  718. # ----
  719. # {"a":[]}
  720. # query T
  721. # SELECT '{"a":["foo","bar"]}'::JSONB #- ARRAY['a','1']
  722. # ----
  723. # {"a":["foo"]}
  724. # query T
  725. # SELECT '{"a":[]}'::JSONB #- ARRAY['a','0']
  726. # ----
  727. # {"a":[]}
  728. # query T
  729. # SELECT '{"a":123,"b":456,"c":567}'::JSONB - array[]:::text[];
  730. # ----
  731. # {"a":123.0,"b":456.0,"c":567.0}
  732. # query T
  733. # SELECT '{"a":123,"b":456,"c":567}'::JSONB - array['a','c'];
  734. # ----
  735. # {"b":456.0}
  736. # query T
  737. # SELECT '{"a":123,"c":"asdf"}'::JSONB - array['a','c'];
  738. # ----
  739. # {}
  740. # query T
  741. # SELECT '{}'::JSONB - array['a','c'];
  742. # ----
  743. # {}
  744. # query T
  745. # SELECT '{"b":[],"c":{"a":"b"}}'::JSONB - array['a'];
  746. # ----
  747. # {"b":[],"c":{"a":"b"}}
  748. # # Regression test for cockroach#34756.
  749. # query T
  750. # SELECT '{"b":[],"c":{"a":"b"}}'::JSONB - array['foo',NULL]
  751. # ----
  752. # {"b":[],"c":{"a":"b"}}
  753. # statement error pgcode 22P02 a path element is not an integer:foo
  754. # SELECT '{"a":{"b":["foo"]}}'::JSONB #- ARRAY['a','b','foo']
  755. statement ok
  756. CREATE TABLE json_family (a INT,b JSONB)
  757. statement ok
  758. INSERT INTO json_family VALUES(0,'{}')
  759. statement ok
  760. INSERT INTO json_family VALUES(1,'{"a":123,"c":"asdf"}')
  761. query IT colnames
  762. SELECT a,b FROM json_family ORDER BY a
  763. ----
  764. a b
  765. 0 {}
  766. 1 {"a":123,"c":"asdf"}
  767. statement ok
  768. DROP TABLE json_family
  769. query T
  770. SELECT jsonb_typeof('-123'::JSON)
  771. ----
  772. number
  773. query T
  774. SELECT jsonb_typeof('-123.4'::JSON)
  775. ----
  776. number
  777. query T
  778. SELECT jsonb_typeof('"-123.4"'::JSON)
  779. ----
  780. string
  781. query T
  782. SELECT jsonb_typeof('{"1":{"2":3}}'::JSON)
  783. ----
  784. object
  785. query T
  786. SELECT jsonb_typeof('[1, 2, [3]]'::JSON)
  787. ----
  788. array
  789. query T
  790. SELECT jsonb_typeof('true'::JSON)
  791. ----
  792. boolean
  793. query T
  794. SELECT jsonb_typeof('false'::JSON)
  795. ----
  796. boolean
  797. query T
  798. SELECT jsonb_typeof('null'::JSON)
  799. ----
  800. null
  801. ## to_jsonb
  802. query T
  803. SELECT to_jsonb(123::INT)
  804. ----
  805. 123
  806. query T
  807. SELECT to_jsonb('\a'::TEXT)
  808. ----
  809. "\\a"
  810. # query T
  811. # SELECT to_jsonb('\a'::TEXT COLLATE "fr_FR")
  812. # ----
  813. # "\\a"
  814. # query T
  815. # SELECT to_jsonb(3::OID::INT::OID)
  816. # ----
  817. # "3"
  818. # query T
  819. # SELECT to_jsonb('a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11'::UUID);
  820. # ----
  821. # "a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11"
  822. query T
  823. SELECT to_jsonb('\x0001'::BYTEA)
  824. ----
  825. "\\x0001"
  826. query T
  827. SELECT to_jsonb(true::BOOL)
  828. ----
  829. true
  830. query T
  831. SELECT to_jsonb(false::BOOL)
  832. ----
  833. false
  834. query T
  835. SELECT to_jsonb('"a"'::JSON)
  836. ----
  837. "a"
  838. query T
  839. SELECT to_jsonb(1.234::FLOAT)
  840. ----
  841. 1.234
  842. query T
  843. SELECT to_jsonb(null::int)
  844. ----
  845. NULL
  846. query T
  847. SELECT to_jsonb(null::int[])
  848. ----
  849. NULL
  850. query T
  851. SELECT to_jsonb(array[1]::int[])
  852. ----
  853. [1]
  854. query T
  855. SELECT to_jsonb(array[1, 2]::int[])
  856. ----
  857. [1,2]
  858. query T
  859. SELECT to_jsonb(array[1, null]::int[])
  860. ----
  861. [1,null]
  862. query T
  863. SELECT to_jsonb(array[null]::int[])
  864. ----
  865. [null]
  866. query T
  867. SELECT to_jsonb(array[array[1, 2], array[3, 4]]::int[])
  868. ----
  869. [[1,2],[3,4]]
  870. query T
  871. SELECT to_jsonb(array[array[array[1, 2], array[3, 4]], array[array[5, 6], array[7, 8]]]::int[])
  872. ----
  873. [[[1,2],[3,4]],[[5,6],[7,8]]]
  874. query T
  875. SELECT to_jsonb(array[1.2, .3]::float[])
  876. ----
  877. [1.2,0.3]
  878. query T
  879. SELECT to_jsonb(array[row(1, 2), row(3, 4)])
  880. ----
  881. [{"f1":1,"f2":2},{"f1":3,"f2":4}]
  882. query T
  883. SELECT to_jsonb(null::int list)
  884. ----
  885. NULL
  886. query T
  887. SELECT to_jsonb(list[1]::int list)
  888. ----
  889. [1]
  890. query T
  891. SELECT to_jsonb(list[1, 2]::int list)
  892. ----
  893. [1,2]
  894. query T
  895. SELECT to_jsonb(list[list[1], list[3, 4]]::int list list)
  896. ----
  897. [[1],[3,4]]
  898. query T
  899. SELECT to_jsonb(list[list[list[1, 2], list[3]], list[list[7, 8]]]::int list list list)
  900. ----
  901. [[[1,2],[3]],[[7,8]]]
  902. query T
  903. SELECT to_jsonb(list[1.2, .3]::float list)
  904. ----
  905. [1.2,0.3]
  906. query T
  907. SELECT to_jsonb(list[row(1, 2), row(3, 4)])
  908. ----
  909. [{"f1":1,"f2":2},{"f1":3,"f2":4}]
  910. query T
  911. SELECT to_jsonb(1.234::DECIMAL)
  912. ----
  913. 1.234
  914. # query T
  915. # SELECT to_jsonb('10.1.0.0/16'::INET)
  916. # ----
  917. # "10.1.0.0/16"
  918. # query T
  919. # SELECT to_jsonb(ARRAY[[1,2],[3,4]])
  920. # ----
  921. # [[1.0,2.0],[3.0,4.0]]
  922. query T
  923. SELECT to_jsonb('2014-05-28 12:22:35.614298'::TIMESTAMP)
  924. ----
  925. "2014-05-28 12:22:35.614298"
  926. query T
  927. SELECT to_jsonb('2014-05-28 12:22:35.614298-04'::TIMESTAMPTZ)
  928. ----
  929. "2014-05-28 16:22:35.614298+00"
  930. query T
  931. SELECT to_jsonb('2014-05-28 12:22:35.614298-04'::TIMESTAMP)
  932. ----
  933. "2014-05-28 12:22:35.614298"
  934. query T
  935. SELECT to_jsonb('2014-05-28'::DATE)
  936. ----
  937. "2014-05-28"
  938. query T
  939. SELECT to_jsonb('00:00:00'::TIME)
  940. ----
  941. "00:00:00"
  942. query T
  943. SELECT to_jsonb('02:45:02.234'::INTERVAL)
  944. ----
  945. "02:45:02.234"
  946. query T
  947. SELECT to_jsonb((1,2,'hello',NULL,NULL))
  948. ----
  949. {"f1":1,"f2":2,"f3":"hello","f4":null,"f5":null}
  950. ## jsonb_array_elements
  951. query T rowsort
  952. SELECT * FROM jsonb_array_elements('[1,2,3]')
  953. ----
  954. 1
  955. 2
  956. 3
  957. query T rowsort
  958. SELECT * FROM jsonb_array_elements('[1,true,null,"text",-1.234,{"2":3,"4":"5"},[1,2,3]]')
  959. ----
  960. "text"
  961. -1.234
  962. 1
  963. [1,2,3]
  964. null
  965. true
  966. {"2":3,"4":"5"}
  967. query T rowsort
  968. SELECT js.value->>'a' FROM jsonb_array_elements('[{"a":1},{"a":2},{"a":3}]') js
  969. ----
  970. 1
  971. 2
  972. 3
  973. query T
  974. SELECT * FROM jsonb_array_elements('[]')
  975. ----
  976. query T
  977. SELECT * FROM jsonb_array_elements('{"1":2}')
  978. ----
  979. ## jsonb_array_elements_text
  980. query T rowsort
  981. SELECT * FROM jsonb_array_elements_text('[1,2,3]')
  982. ----
  983. 1
  984. 2
  985. 3
  986. query T rowsort
  987. SELECT * FROM jsonb_array_elements_text('[1,2,3]')
  988. ----
  989. 1
  990. 2
  991. 3
  992. query T rowsort
  993. SELECT * FROM jsonb_array_elements_text('[1,true,null,"text",-1.234,{"2":3,"4":"5"},[1,2,3]]')
  994. ----
  995. -1.234
  996. 1
  997. NULL
  998. [1,2,3]
  999. text
  1000. true
  1001. {"2":3,"4":"5"}
  1002. query T
  1003. SELECT * FROM jsonb_array_elements('[]')
  1004. ----
  1005. query T
  1006. SELECT * FROM jsonb_array_elements_text('{"1":2}')
  1007. ----
  1008. query T
  1009. SELECT * FROM jsonb_array_elements_text('{"1":2}')
  1010. ----
  1011. ## jsonb_object_keys
  1012. query T
  1013. SELECT * FROM jsonb_object_keys('{"1":2,"3":4}')
  1014. ----
  1015. 1
  1016. 3
  1017. query T
  1018. SELECT * FROM jsonb_object_keys('{"1":2,"3":4}')
  1019. ----
  1020. 1
  1021. 3
  1022. query T
  1023. SELECT * FROM jsonb_object_keys('{}')
  1024. ----
  1025. query T
  1026. SELECT * FROM jsonb_object_keys('{"\"1\"":2}')
  1027. ----
  1028. "1"
  1029. # Keys are sorted.
  1030. query T
  1031. SELECT * FROM jsonb_object_keys('{"a":1,"1":2,"3":{"4":5,"6":7}}')
  1032. ----
  1033. 1
  1034. 3
  1035. a
  1036. query T
  1037. SELECT * FROM jsonb_object_keys('null')
  1038. ----
  1039. query T
  1040. SELECT * FROM jsonb_object_keys('[1,2,3]')
  1041. ----
  1042. ## jsonb_build_object
  1043. query T
  1044. SELECT jsonb_build_object()
  1045. ----
  1046. {}
  1047. query T
  1048. SELECT jsonb_build_object('a',2,'b',4)
  1049. ----
  1050. {"a":2,"b":4}
  1051. query T
  1052. SELECT jsonb_build_object('a',null,'b',4)
  1053. ----
  1054. {"a":null,"b":4}
  1055. query error key cannot be null
  1056. SELECT jsonb_build_object(null, null)
  1057. query error key cannot be null
  1058. SELECT jsonb_build_object(null, 1)
  1059. query T
  1060. SELECT jsonb_build_object(true,'val',1,0,1.3,2,date '2019-02-03' - date '2019-01-01',4)
  1061. ----
  1062. {"1":0,"1.3":2,"33":4,"true":"val"}
  1063. query T
  1064. SELECT jsonb_build_object('a',1,'b',1.2::float,'c',true,'d',null,'e','{"x":3,"y":[1,2,3]}'::JSONB)
  1065. ----
  1066. {"a":1,"b":1.2,"c":true,"d":null,"e":{"x":3,"y":[1,2,3]}}
  1067. query T
  1068. SELECT jsonb_build_object(
  1069. 'a',jsonb_build_object('b',false,'c',99),
  1070. 'd',jsonb_build_object('e',jsonb_build_array(9,8,7))
  1071. )
  1072. ----
  1073. {"a":{"b":false,"c":99},"d":{"e":[9,8,7]}}
  1074. query T
  1075. SELECT jsonb_build_object(a,3) FROM (SELECT 1 AS a,2 AS b) r
  1076. ----
  1077. {"1":3}
  1078. # query T
  1079. # SELECT jsonb_build_object('\a'::TEXT COLLATE "fr_FR",1)
  1080. # ----
  1081. # {"\\a":1.0}
  1082. query T
  1083. SELECT jsonb_build_object('\a',1)
  1084. ----
  1085. {"\\a":1}
  1086. # query T
  1087. # SELECT jsonb_build_object(jsonb_object_keys('{"x":3,"y":4}'::JSONB),2)
  1088. # ----
  1089. # {"x":2.0}
  1090. # {"y":2.0}
  1091. # # Regression for panic when bit array is passed as argument.
  1092. # query T
  1093. # SELECT jsonb_build_object('a','0100110'::varbit)
  1094. # ----
  1095. # {"a":"0100110"}
  1096. # even number of arguments
  1097. query error
  1098. SELECT jsonb_build_object(1,2,3)
  1099. # # keys must be scalar and not null
  1100. # query error
  1101. # SELECT jsonb_build_object(null,2)
  1102. # query error
  1103. # SELECT jsonb_build_object((1,2),3)
  1104. # query error
  1105. # SELECT jsonb_build_object('{"a":1,"b":2}'::JSON,3)
  1106. # query T
  1107. # SELECT jsonb_build_object('{1,2,3}'::int[],3)
  1108. # query T
  1109. # SELECT json_extract_path('{"a":1}','a')
  1110. # ----
  1111. # 1
  1112. # query T
  1113. # SELECT json_extract_path('{"a":1}','a',NULL)
  1114. # ----
  1115. # NULL
  1116. # query T
  1117. # SELECT json_extract_path('{"a":1}')
  1118. # ----
  1119. # {"a":1}
  1120. # query T
  1121. # SELECT json_extract_path('{"a":{"b":2}}','a')
  1122. # ----
  1123. # {"b":2}
  1124. # query T
  1125. # SELECT json_extract_path('{"a":{"b":2}}','a','b')
  1126. # ----
  1127. # 2
  1128. # query T
  1129. # SELECT jsonb_extract_path('{"a":{"b":2}}','a','b')
  1130. # ----
  1131. # 2
  1132. # query T
  1133. # SELECT json_extract_path('{"a":{"b":2}}','a','b','c')
  1134. # ----
  1135. # NULL
  1136. # query T
  1137. # SELECT jsonb_pretty('{"a":1}'::JSONB)
  1138. # ----
  1139. # {
  1140. # "a":1.0
  1141. # }
  1142. query T
  1143. SELECT '[1,2,3]'::JSONB || '[4,5,6]'::JSONB
  1144. ----
  1145. [1,2,3,4,5,6]
  1146. query T
  1147. SELECT '{"a":1,"b":2}'::JSONB || '{"b":3,"c":4}'::JSONB
  1148. ----
  1149. {"a":1,"b":3,"c":4}
  1150. query T
  1151. SELECT '{"a":1,"b":2}'::JSONB || '"c"'::JSONB
  1152. ----
  1153. NULL
  1154. # Test that concatenating a jsonb value with a string literal uses
  1155. # jsonb-specific concatenation.
  1156. query T
  1157. SELECT '[1,2,3]'::jsonb || '[4,5,6]'
  1158. ----
  1159. [1,2,3,4,5,6]
  1160. query T
  1161. SELECT jsonb_build_array()
  1162. ----
  1163. []
  1164. query T
  1165. SELECT jsonb_build_array(1, 2, 3)
  1166. ----
  1167. [1,2,3]
  1168. query T
  1169. SELECT jsonb_build_array(1, 2, NULL)
  1170. ----
  1171. [1,2,null]
  1172. query T
  1173. SELECT jsonb_build_array(NULL)
  1174. ----
  1175. [null]
  1176. query T
  1177. SELECT jsonb_build_array('\x0001'::BYTEA)
  1178. ----
  1179. ["\\x0001"]
  1180. # query T
  1181. # SELECT jsonb_build_array(1,'1'::JSON,1.2::FLOAT,NULL,ARRAY['x','y'])
  1182. # ----
  1183. # [1,1,1.2,null,["x","y"]]
  1184. # # Regression for cockroach#37318
  1185. # query T
  1186. # SELECT jsonb_build_array('+Inf'::FLOAT,'-Inf'::FLOAT,'NaN'::FLOAT)::STRING::JSONB
  1187. # ----
  1188. # ["Infinity","-Infinity","NaN"]
  1189. # query error pq:json_object\(\):array must have even number of elements
  1190. # SELECT json_object('{a,b,c}'::TEXT[])
  1191. # query error pq:json_object\(\):null value not allowed for object key
  1192. # SELECT json_object('{NULL,a}'::TEXT[])
  1193. # query error pq:json_object\(\):null value not allowed for object key
  1194. # SELECT json_object('{a,b,NULL,"d e f"}'::TEXT[],'{1,2,3,"a b c"}'::TEXT[])
  1195. # query error pq:json_object\(\):mismatched array dimensions
  1196. # SELECT json_object('{a,b,c,"d e f",g}'::TEXT[],'{1,2,3,"a b c"}'::TEXT[])
  1197. # query error pq:json_object\(\):mismatched array dimensions
  1198. # SELECT json_object('{a,b,c,"d e f"}'::TEXT[],'{1,2,3,"a b c",g}'::TEXT[])
  1199. # query error pq:unknown signature:json_object\(collatedstring\{fr_FR\}\[\]\)
  1200. # SELECT json_object(ARRAY['a'::TEXT COLLATE "fr_FR"])
  1201. # query T
  1202. # SELECT json_object('{}'::TEXT[])
  1203. # ----
  1204. # {}
  1205. # query T
  1206. # SELECT json_object('{}'::TEXT[],'{}'::TEXT[])
  1207. # ----
  1208. # {}
  1209. # query T
  1210. # SELECT json_object('{b,3,a,1,b,4,a,2}'::TEXT[])
  1211. # ----
  1212. # {"a":"2","b":"4"}
  1213. # query T
  1214. # SELECT json_object('{b,b,a,a}'::TEXT[],'{1,2,3,4}'::TEXT[])
  1215. # ----
  1216. # {"a":"4","b":"2"}
  1217. # query T
  1218. # SELECT json_object('{a,1,b,2,3,NULL,"d e f","a b c"}'::TEXT[])
  1219. # ----
  1220. # {"3":null,"a":"1","b":"2","d e f":"a b c"}
  1221. # query T
  1222. # SELECT json_object('{a,b,"","d e f"}'::TEXT[],'{1,2,3,"a b c"}'::TEXT[])
  1223. # ----
  1224. # {"":"3","a":"1","b":"2","d e f":"a b c"}
  1225. # query T
  1226. # SELECT json_object('{a,b,c,"d e f"}'::TEXT[],'{1,2,3,"a b c"}'::TEXT[])
  1227. # ----
  1228. # {"a":"1","b":"2","c":"3","d e f":"a b c"}
  1229. # query error pq:jsonb_object\(\):array must have even number of elements
  1230. # SELECT jsonb_object('{a,b,c}'::TEXT[])
  1231. # query error pq:jsonb_object\(\):null value not allowed for object key
  1232. # SELECT jsonb_object('{NULL,a}'::TEXT[])
  1233. # query error pq:jsonb_object\(\):null value not allowed for object key
  1234. # SELECT jsonb_object('{a,b,NULL,"d e f"}'::TEXT[],'{1,2,3,"a b c"}'::TEXT[])
  1235. # query error pq:jsonb_object\(\):mismatched array dimensions
  1236. # SELECT jsonb_object('{a,b,c,"d e f",g}'::TEXT[],'{1,2,3,"a b c"}'::TEXT[])
  1237. # query error pq:jsonb_object\(\):mismatched array dimensions
  1238. # SELECT jsonb_object('{a,b,c,"d e f"}'::TEXT[],'{1,2,3,"a b c",g}'::TEXT[])
  1239. # query error pq:unknown signature:jsonb_object\(collatedstring\{fr_FR\}\[\]\)
  1240. # SELECT jsonb_object(ARRAY['a'::TEXT COLLATE "fr_FR"])
  1241. # query T
  1242. # SELECT jsonb_object('{}'::TEXT[])
  1243. # ----
  1244. # {}
  1245. # query T
  1246. # SELECT jsonb_object('{}'::TEXT[],'{}'::TEXT[])
  1247. # ----
  1248. # {}
  1249. # query T
  1250. # SELECT jsonb_object('{b,3,a,1,b,4,a,2}'::TEXT[])
  1251. # ----
  1252. # {"a":"2","b":"4"}
  1253. # query T
  1254. # SELECT jsonb_object('{b,b,a,a}'::TEXT[],'{1,2,3,4}'::TEXT[])
  1255. # ----
  1256. # {"a":"4","b":"2"}
  1257. # query T
  1258. # SELECT jsonb_object('{a,1,b,2,3,NULL,"d e f","a b c"}'::TEXT[])
  1259. # ----
  1260. # {"3":null,"a":"1","b":"2","d e f":"a b c"}
  1261. # query T
  1262. # SELECT jsonb_object('{a,b,"","d e f"}'::TEXT[],'{1,2,3,"a b c"}'::TEXT[])
  1263. # ----
  1264. # {"":"3","a":"1","b":"2","d e f":"a b c"}
  1265. # query T
  1266. # SELECT jsonb_object('{a,b,c,"d e f"}'::TEXT[],'{1,2,3,"a b c"}'::TEXT[])
  1267. # ----
  1268. # {"a":"1","b":"2","c":"3","d e f":"a b c"}
  1269. query TT
  1270. SELECT * FROM jsonb_each('[1]'::JSONB)
  1271. ----
  1272. query TT
  1273. SELECT * FROM jsonb_each('null'::JSONB)
  1274. ----
  1275. query TT
  1276. SELECT * from jsonb_each('{}'::JSONB) q
  1277. ----
  1278. query TT colnames,rowsort
  1279. SELECT * from jsonb_each('{"f1":[1,2,3],"f2":{"f3":1},"f4":null,"f5":99,"f6":"stringy"}'::JSONB) q
  1280. ----
  1281. key value
  1282. f1 [1,2,3]
  1283. f2 {"f3":1}
  1284. f4 null
  1285. f5 99
  1286. f6 "stringy"
  1287. query TT
  1288. SELECT * FROM jsonb_each('[1]')
  1289. ----
  1290. query TT
  1291. SELECT * FROM jsonb_each('null')
  1292. ----
  1293. query TT
  1294. SELECT * from jsonb_each('{}') q
  1295. ----
  1296. query TT colnames,rowsort
  1297. SELECT * from jsonb_each('{"f1":[1,2,3],"f2":{"f3":1},"f4":null,"f5":99,"f6":"stringy"}'::JSONB) q
  1298. ----
  1299. key value
  1300. f1 [1,2,3]
  1301. f2 {"f3":1}
  1302. f4 null
  1303. f5 99
  1304. f6 "stringy"
  1305. query TT
  1306. SELECT * FROM jsonb_each_text('[1]')
  1307. ----
  1308. query TT
  1309. SELECT * FROM jsonb_each_text('null')
  1310. ----
  1311. query TT
  1312. SELECT * from jsonb_each_text('{}') q
  1313. ----
  1314. query TT
  1315. SELECT * from jsonb_each_text('{}') q
  1316. ----
  1317. query TT colnames,rowsort
  1318. SELECT * from jsonb_each_text('{"f1":[1,2,3],"f2":{"f3":1},"f4":null,"f5":99,"f6":"stringy"}') q
  1319. ----
  1320. key value
  1321. f1 [1,2,3]
  1322. f2 {"f3":1}
  1323. f4 NULL
  1324. f5 99
  1325. f6 stringy
  1326. query TT
  1327. SELECT * FROM jsonb_each_text('[1]')
  1328. ----
  1329. query TT
  1330. SELECT * FROM jsonb_each_text('null')
  1331. ----
  1332. query TT
  1333. SELECT * from jsonb_each_text('{}') q
  1334. ----
  1335. query TT
  1336. SELECT * from jsonb_each_text('{}') q
  1337. ----
  1338. query TT colnames,rowsort
  1339. SELECT * from jsonb_each_text('{"f1":[1,2,3],"f2":{"f3":1},"f4":null,"f5":99,"f6":"stringy"}') q
  1340. ----
  1341. key value
  1342. f1 [1,2,3]
  1343. f2 {"f3":1}
  1344. f4 NULL
  1345. f5 99
  1346. f6 stringy
  1347. # query T
  1348. # SELECT json_set('{"a":1}','{a}'::STRING[],'2')
  1349. # ----
  1350. # {"a":2}
  1351. # query T
  1352. # SELECT jsonb_set('{"a":1}','{b}'::STRING[],'2')
  1353. # ----
  1354. # {"a":1,"b":2}
  1355. # statement error path element at position 1 is null
  1356. # SELECT jsonb_set('{"a":1}',ARRAY[null,'foo']::STRING[],'2')
  1357. # statement error path element at position 1 is null
  1358. # SELECT jsonb_set('{"a":1}','{null,foo}'::STRING[],'2',true)
  1359. # statement error path element at position 2 is null
  1360. # SELECT jsonb_set('{"a":1}','{foo,null}'::STRING[],'2',true)
  1361. # query T
  1362. # SELECT jsonb_set('{"a":1}','{b}'::STRING[],'2',true)
  1363. # ----
  1364. # {"a":1,"b":2}
  1365. # query T
  1366. # SELECT jsonb_set('{"a":1}','{b}'::STRING[],'2',false)
  1367. # ----
  1368. # {"a":1}
  1369. # query T
  1370. # SELECT jsonb_set('[{"f1":1,"f2":null},2,null,3]','{0,f1}'::STRING[],'[2,3,4]',false)
  1371. # ----
  1372. # [{"f1":[2,3,4],"f2":null},2,null,3]
  1373. # query T
  1374. # SELECT jsonb_set('[{"f1":1,"f2":null},2]','{0,f3}'::STRING[],'[2,3,4]')
  1375. # ----
  1376. # [{"f1":1,"f2":null,"f3":[2,3,4]},2]
  1377. # query T
  1378. # SELECT jsonb_insert('{"a":[0,1,2]}','{a,1}'::STRING[],'"new_value"');
  1379. # ----
  1380. # {"a":[0,"new_value",1,2]}
  1381. # query T
  1382. # SELECT jsonb_insert('[0,1,2,{"a":["a","b","d"]},4]','{3,a,2}'::STRING[],'"c"')
  1383. # ----
  1384. # [0,1,2,{"a":["a","b","c","d"]},4]
  1385. # query T
  1386. # SELECT jsonb_insert('{"a":"foo"}','{b}'::STRING[],'"bar"')
  1387. # ----
  1388. # {"a":"foo","b":"bar"}
  1389. # query T
  1390. # SELECT jsonb_insert(NULL,'{a}',NULL,false)
  1391. # ----
  1392. # NULL
  1393. # query T
  1394. # SELECT jsonb_insert('{"a":[0,1,2]}','{a,1}'::STRING[],'"new_value"',true)
  1395. # ----
  1396. # {"a":[0,1,"new_value",2]}
  1397. # query T
  1398. # SELECT jsonb_insert('{"a":[0,1,2]}','{a,-1}'::STRING[],'"new_value"',true)
  1399. # ----
  1400. # {"a":[0,1,2,"new_value"]}
  1401. # query error pq:jsonb_insert\(\):cannot replace existing key
  1402. # SELECT jsonb_insert('{"a":"foo"}','{a}'::STRING[],'"new_value"',false)
  1403. # query T
  1404. # SELECT jsonb_insert('{"a":"foo"}','{a,0}'::STRING[],'"new_value"',false)
  1405. # ----
  1406. # {"a":"foo"}
  1407. # query T
  1408. # SELECT jsonb_insert('[0,1,2,3]','{3}'::STRING[],'10',true)
  1409. # ----
  1410. # [0,1,2,3,10]
  1411. # statement error cannot set path in scalar
  1412. # SELECT jsonb_insert('1','{a}'::STRING[],'10',true)
  1413. # query T
  1414. # SELECT jsonb_insert('1',NULL,'10')
  1415. # ----
  1416. # NULL
  1417. # statement error path element at position 1 is null
  1418. # SELECT jsonb_insert('{"a":[0,1,2],"b":"hello","c":"world"}','{NULL,a,0}'::STRING[],'"new_val"')
  1419. # statement error path element at position 2 is null
  1420. # SELECT jsonb_insert('{"a":[0,1,2],"b":"hello","c":"world"}','{a,NULL,0}'::STRING[],'"new_val"')
  1421. query T
  1422. SELECT jsonb_strip_nulls(NULL)
  1423. ----
  1424. NULL
  1425. query T
  1426. SELECT jsonb_strip_nulls('1'::JSONB)
  1427. ----
  1428. 1
  1429. query T
  1430. SELECT jsonb_strip_nulls('"a string"'::JSONB)
  1431. ----
  1432. "a string"
  1433. query T
  1434. SELECT jsonb_strip_nulls('null'::JSONB)
  1435. ----
  1436. null
  1437. query T
  1438. SELECT jsonb_strip_nulls('[1,2,null,3,4]'::JSONB)
  1439. ----
  1440. [1,2,null,3,4]
  1441. query T
  1442. SELECT jsonb_strip_nulls('{"a":1,"b":null,"c":[2,null,3],"d":{"e":4,"f":null}}'::JSONB)
  1443. ----
  1444. {"a":1,"c":[2,null,3],"d":{"e":4}}
  1445. query T
  1446. SELECT jsonb_strip_nulls('[1,{"a":1,"b":null,"c":2},3]'::JSONB)
  1447. ----
  1448. [1,{"a":1,"c":2},3]
  1449. query T
  1450. SELECT jsonb_strip_nulls('{"a":{"b":null,"c":null},"d":{}}'::JSONB)
  1451. ----
  1452. {"a":{},"d":{}}
  1453. query T
  1454. SELECT jsonb_strip_nulls(NULL)
  1455. ----
  1456. NULL
  1457. query T
  1458. SELECT jsonb_strip_nulls('1'::JSONB)
  1459. ----
  1460. 1
  1461. query T
  1462. SELECT jsonb_strip_nulls('"a string"'::JSONB)
  1463. ----
  1464. "a string"
  1465. query T
  1466. SELECT jsonb_strip_nulls('null'::JSONB)
  1467. ----
  1468. null
  1469. query T
  1470. SELECT jsonb_strip_nulls('[1,2,null,3,4]'::JSONB)
  1471. ----
  1472. [1,2,null,3,4]
  1473. query T
  1474. SELECT jsonb_strip_nulls('{"a":1,"b":null,"c":[2,null,3],"d":{"e":4,"f":null}}'::JSONB)
  1475. ----
  1476. {"a":1,"c":[2,null,3],"d":{"e":4}}
  1477. query T
  1478. SELECT jsonb_strip_nulls('[1,{"a":1,"b":null,"c":2},3]'::JSONB)
  1479. ----
  1480. [1,{"a":1,"c":2},3]
  1481. query T
  1482. SELECT jsonb_strip_nulls('{"a":{"b":null,"c":null},"d":{}}'::JSONB)
  1483. ----
  1484. {"a":{},"d":{}}
  1485. query T
  1486. SELECT jsonb_array_length('{"f1":1,"f2":[5,6]}'::JSONB)
  1487. ----
  1488. NULL
  1489. query T
  1490. SELECT jsonb_array_length('4'::JSONB)
  1491. ----
  1492. NULL
  1493. query I
  1494. SELECT jsonb_array_length('[1,2,3,{"f1":1,"f2":[5,6]},4]'::JSONB)
  1495. ----
  1496. 5
  1497. query I
  1498. SELECT jsonb_array_length('[]'::JSONB)
  1499. ----
  1500. 0
  1501. query T
  1502. SELECT jsonb_array_length('{"f1":1,"f2":[5,6]}'::JSONB)
  1503. ----
  1504. NULL
  1505. query T
  1506. SELECT jsonb_array_length('4'::JSONB)
  1507. ----
  1508. NULL
  1509. query I
  1510. SELECT jsonb_array_length('[1,2,3,{"f1":1,"f2":[5,6]},4]'::JSONB)
  1511. ----
  1512. 5
  1513. # implicit conversion from string to JSONB
  1514. query I
  1515. SELECT jsonb_array_length('[]')
  1516. ----
  1517. 0
  1518. # Casts
  1519. query T
  1520. SELECT ('1'::jsonb)::float;
  1521. ----
  1522. 1.000
  1523. query error cannot cast jsonb string to type double precision
  1524. SELECT ('"Infinity"'::jsonb)::float;
  1525. query error cannot cast jsonb string to type double precision
  1526. SELECT ('"-Infinity"'::jsonb)::float;
  1527. query error cannot cast jsonb string to type double precision
  1528. SELECT ('"NaN"'::jsonb)::float;
  1529. # not a number
  1530. query error cannot cast jsonb array to type double precision
  1531. SELECT ('[1]'::jsonb)::float;
  1532. # not a number
  1533. query error cannot cast jsonb string to type double precision
  1534. SELECT ('"1"'::jsonb)::float;
  1535. query T
  1536. SELECT ('1'::jsonb)::int;
  1537. ----
  1538. 1
  1539. query error "9999999999999999999" integer out of range
  1540. SELECT ('9999999999999999999'::jsonb)::int;
  1541. # not a number
  1542. query error cannot cast jsonb array to type integer
  1543. SELECT ('[1]'::jsonb)::int;
  1544. query error CAST does not support casting from jsonb to timestamp
  1545. SELECT ('"1969-06-01 10:10:10.410"'::jsonb)::timestamp;
  1546. query error CAST does not support casting from jsonb to interval
  1547. SELECT ('"1-2 3 4:5:6.7"'::jsonb)::interval;
  1548. query error CAST does not support casting from jsonb to date
  1549. SELECT ('["2019-12-31"]'::jsonb)::date;
  1550. query T
  1551. SELECT (null::jsonb)::text;
  1552. ----
  1553. NULL
  1554. query T
  1555. SELECT (null::jsonb)->>0;
  1556. ----
  1557. NULL
  1558. query T
  1559. SELECT ('null'::jsonb)::text;
  1560. ----
  1561. null
  1562. query T
  1563. SELECT ('null'::jsonb)->>0;
  1564. ----
  1565. NULL
  1566. query T
  1567. SELECT to_jsonb(DATE '2019-12-31');
  1568. ----
  1569. "2019-12-31"
  1570. query T
  1571. SELECT to_jsonb(TIMESTAMP '1969-06-01 10:10:10.41');
  1572. ----
  1573. "1969-06-01 10:10:10.41"
  1574. query T
  1575. SELECT to_jsonb(LIST[null]::int[] list)
  1576. ----
  1577. [null]
  1578. query T
  1579. SELECT to_jsonb(LIST[ARRAY[]::int[]]::int[] list)
  1580. ----
  1581. [[]]
  1582. query T
  1583. SELECT to_jsonb(LIST[ARRAY[]::int[], NULL]::int[] list)
  1584. ----
  1585. [[],null]
  1586. query T
  1587. SELECT to_jsonb(LIST[ARRAY[]::int[], NULL, ARRAY[2, 3]]::int[] list)
  1588. ----
  1589. [[],null,[2,3]]
  1590. query T
  1591. SELECT to_jsonb(LIST[ARRAY[ARRAY[1, 2], ARRAY[3, 4]]]::int[] list)
  1592. ----
  1593. [[[1,2],[3,4]]]
  1594. # jsonb_agg
  1595. query T
  1596. SELECT jsonb_agg(js) FROM (SELECT '1'::jsonb AS js WHERE false)
  1597. ----
  1598. NULL
  1599. query T
  1600. SELECT jsonb_agg(1)
  1601. ----
  1602. [1]
  1603. statement ok
  1604. CREATE TABLE t1 (a int)
  1605. statement ok
  1606. INSERT INTO t1 VALUES (1), (2), (3), (NULL)
  1607. query T
  1608. SELECT jsonb_agg(a) FROM (select a from t1 where a IS NOT NULL)
  1609. ----
  1610. [1,2,3]
  1611. query T
  1612. SELECT jsonb_agg(a) FROM t1
  1613. ----
  1614. [1,2,3,null]
  1615. query T
  1616. SELECT jsonb_agg(a::text::jsonb) FROM t1
  1617. ----
  1618. [1,2,3,null]
  1619. query T
  1620. SELECT jsonb_agg(a) FILTER (WHERE a IS NOT NULL) FROM t1
  1621. ----
  1622. [1,2,3]
  1623. query error db error: ERROR: function jsonb_agg\(integer, integer\) does not exist
  1624. SELECT jsonb_agg(1, 2)
  1625. statement ok
  1626. CREATE TABLE t2 (a int, b date)
  1627. statement ok
  1628. INSERT INTO t2 VALUES (1, date '2020-01-01'), (NULL, date '2020-01-02')
  1629. query T
  1630. SELECT jsonb_agg((a, b)) FROM t2
  1631. ----
  1632. [{"f1":null,"f2":"2020-01-02"},{"f1":1,"f2":"2020-01-01"}]
  1633. query TTT
  1634. SELECT jsonb_agg((a, b)), jsonb_agg(a), jsonb_agg(b) FROM t2
  1635. ----
  1636. [{"f1":null,"f2":"2020-01-02"},{"f1":1,"f2":"2020-01-01"}] [1,null] ["2020-01-01","2020-01-02"]
  1637. # jsonb_object_agg
  1638. query T
  1639. SELECT jsonb_object_agg(k, v) FROM (SELECT 1 AS k, 2 AS V WHERE false)
  1640. ----
  1641. NULL
  1642. query T
  1643. SELECT jsonb_object_agg('one', 2)
  1644. ----
  1645. {"one":2}
  1646. query T
  1647. SELECT jsonb_object_agg(1, 2)
  1648. ----
  1649. {"1":2}
  1650. query T
  1651. SELECT jsonb_object_agg(k, v) FROM (SELECT a - 1 AS k, a AS v from t1 where a IS NOT NULL)
  1652. ----
  1653. {"0":1,"1":2,"2":3}
  1654. query T
  1655. SELECT jsonb_object_agg(column1, column2) FROM (VALUES ('a', null), ('b', 1))
  1656. ----
  1657. {"a":null,"b":1}
  1658. query T
  1659. SELECT jsonb_object_agg(column1, column2) FROM (VALUES ('b', 2), ('a', 1))
  1660. ----
  1661. {"a":1,"b":2}
  1662. query T
  1663. SELECT jsonb_object_agg(column1, column2) FROM (VALUES ('a', 1), ('a', 2))
  1664. ----
  1665. {"a":2}
  1666. query T
  1667. SELECT jsonb_object_agg(null, null)
  1668. ----
  1669. {}
  1670. query T
  1671. SELECT jsonb_object_agg(a, a) FILTER (WHERE a IS NOT NULL) FROM t1
  1672. ----
  1673. {"1":1,"2":2,"3":3}
  1674. # Null casts. Protects against database-issues#2244.
  1675. query TTTTTTT
  1676. SELECT
  1677. NULL::jsonb::text,
  1678. NULL::jsonb::int4,
  1679. NULL::jsonb::int8,
  1680. NULL::jsonb::float4,
  1681. NULL::jsonb::float8,
  1682. NULL::jsonb::decimal,
  1683. NULL::jsonb::bool
  1684. ----
  1685. NULL NULL NULL NULL NULL NULL NULL
  1686. query T
  1687. SELECT '{}'::JSONB ->> -9223372036854775808;
  1688. ----
  1689. NULL
  1690. query T
  1691. SELECT '{}'::JSONB - -9223372036854775808;
  1692. ----
  1693. NULL
  1694. query T
  1695. SELECT '{}'::JSONB #> '{-9223372036854775808}';
  1696. ----
  1697. NULL
  1698. ## Regression test for https://github.com/MaterializeInc/database-issues/issues/9182
  1699. statement ok
  1700. CREATE TABLE t3(x int, y text, z bool);
  1701. # Give inputs with different types to `to_jsonb` in different branches. In this case, the optimization where we pull out
  1702. # `to_jsonb` from the CASE should not happen.
  1703. query T multiline
  1704. EXPLAIN OPTIMIZED PLAN AS VERBOSE TEXT FOR
  1705. SELECT
  1706. CASE x
  1707. WHEN 1 THEN to_jsonb(x)
  1708. WHEN 2 THEN to_jsonb(y)
  1709. WHEN 3 THEN to_jsonb(z)
  1710. ELSE to_jsonb(x+x)
  1711. END
  1712. FROM t3;
  1713. ----
  1714. Explained Query:
  1715. Project (#3)
  1716. Map (case when (#0{x} = 1) then jsonbable_to_jsonb(integer_to_numeric(#0{x})) else case when (#0{x} = 2) then jsonbable_to_jsonb(#1{y}) else case when (#0{x} = 3) then jsonbable_to_jsonb(#2{z}) else jsonbable_to_jsonb(integer_to_numeric((#0{x} + #0{x}))) end end end)
  1717. ReadStorage materialize.public.t3
  1718. Source materialize.public.t3
  1719. Target cluster: quickstart
  1720. EOF
  1721. # Check that we are still doing the optimization when the types do match.
  1722. query T multiline
  1723. EXPLAIN OPTIMIZED PLAN AS VERBOSE TEXT FOR
  1724. SELECT
  1725. CASE x
  1726. WHEN 1 THEN to_jsonb(1*x)
  1727. WHEN 2 THEN to_jsonb(2*x)
  1728. WHEN 3 THEN to_jsonb(3*x)
  1729. ELSE to_jsonb(x+x)
  1730. END
  1731. FROM t3;
  1732. ----
  1733. Explained Query:
  1734. Project (#3)
  1735. Map (jsonbable_to_jsonb(integer_to_numeric(case when (#0{x} = 1) then (1 * #0{x}) else case when (#0{x} = 2) then (2 * #0{x}) else case when (#0{x} = 3) then (3 * #0{x}) else (#0{x} + #0{x}) end end end)))
  1736. ReadStorage materialize.public.t3
  1737. Source materialize.public.t3
  1738. Target cluster: quickstart
  1739. EOF