/ Hex Artifact Content
Login

Artifact 0eacdde66991e9afd3f2a010fa97e9843de55b84297982875a017c3dc8aaec7e:


0000: 23 20 32 30 31 35 2d 30 38 2d 31 32 0a 23 0a 23  # 2015-08-12.#.#
0010: 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 73 63   The author disc
0020: 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74 20  laims copyright 
0030: 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20 63  to this source c
0040: 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f  ode.  In place o
0050: 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69  f.# a legal noti
0060: 63 65 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c  ce, here is a bl
0070: 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20 20 4d  essing:.#.#    M
0080: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
0090: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23 20 20  nd not evil..#  
00a0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00b0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00c0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00d0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20 20 20  ive others..#   
00e0: 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66   May you share f
00f0: 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b  reely, never tak
0100: 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f  ing more than yo
0110: 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a 2a 2a  u give..#.#*****
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 0a 23 20 54 68 69 73 20 66 69 6c 65 20 69  **.# This file i
0170: 6d 70 6c 65 6d 65 6e 74 73 20 74 65 73 74 73 20  mplements tests 
0180: 66 6f 72 20 4a 53 4f 4e 20 53 51 4c 20 66 75 6e  for JSON SQL fun
0190: 63 74 69 6f 6e 73 20 65 78 74 65 6e 73 69 6f 6e  ctions extension
01a0: 20 74 6f 20 74 68 65 0a 23 20 53 51 4c 69 74 65   to the.# SQLite
01b0: 20 6c 69 62 72 61 72 79 2e 0a 23 0a 23 20 54 68   library..#.# Th
01c0: 69 73 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  is file contains
01d0: 20 74 65 73 74 73 20 61 75 74 6f 6d 61 74 69 63   tests automatic
01e0: 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 64 20 66  ally generated f
01f0: 72 6f 6d 20 74 68 65 20 6a 73 6f 6e 31 0a 23 20  rom the json1.# 
0200: 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a 23  documentation..#
0210: 0a 0a 73 65 74 20 74 65 73 74 64 69 72 20 5b 66  ..set testdir [f
0220: 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 61 72 67  ile dirname $arg
0230: 76 30 5d 0a 73 6f 75 72 63 65 20 24 74 65 73 74  v0].source $test
0240: 64 69 72 2f 74 65 73 74 65 72 2e 74 63 6c 0a 0a  dir/tester.tcl..
0250: 69 66 63 61 70 61 62 6c 65 20 21 6a 73 6f 6e 31  ifcapable !json1
0260: 20 7b 0a 20 20 66 69 6e 69 73 68 5f 74 65 73 74   {.  finish_test
0270: 0a 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 64 6f 5f  .  return.}..do_
0280: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 6a 73 6f  execsql_test jso
0290: 6e 31 30 32 2d 31 30 30 20 7b 0a 20 20 53 45 4c  n102-100 {.  SEL
02a0: 45 43 54 20 6a 73 6f 6e 5f 6f 62 6a 65 63 74 28  ECT json_object(
02b0: 27 65 78 27 2c 27 5b 35 32 2c 33 2e 31 34 31 35  'ex','[52,3.1415
02c0: 39 5d 27 29 3b 0a 7d 20 7b 7b 7b 22 65 78 22 3a  9]');.} {{{"ex":
02d0: 22 5b 35 32 2c 33 2e 31 34 31 35 39 5d 22 7d 7d  "[52,3.14159]"}}
02e0: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
02f0: 74 20 6a 73 6f 6e 31 30 32 2d 31 31 30 20 7b 0a  t json102-110 {.
0300: 20 20 53 45 4c 45 43 54 20 6a 73 6f 6e 5f 6f 62    SELECT json_ob
0310: 6a 65 63 74 28 27 65 78 27 2c 6a 73 6f 6e 28 27  ject('ex',json('
0320: 5b 35 32 2c 33 2e 31 34 31 35 39 5d 27 29 29 3b  [52,3.14159]'));
0330: 0a 7d 20 7b 7b 7b 22 65 78 22 3a 5b 35 32 2c 33  .} {{{"ex":[52,3
0340: 2e 31 34 31 35 39 5d 7d 7d 7d 0a 64 6f 5f 65 78  .14159]}}}.do_ex
0350: 65 63 73 71 6c 5f 74 65 73 74 20 6a 73 6f 6e 31  ecsql_test json1
0360: 30 32 2d 31 32 30 20 7b 0a 20 20 53 45 4c 45 43  02-120 {.  SELEC
0370: 54 20 6a 73 6f 6e 5f 6f 62 6a 65 63 74 28 27 65  T json_object('e
0380: 78 27 2c 6a 73 6f 6e 5f 61 72 72 61 79 28 35 32  x',json_array(52
0390: 2c 33 2e 31 34 31 35 39 29 29 3b 0a 7d 20 7b 7b  ,3.14159));.} {{
03a0: 7b 22 65 78 22 3a 5b 35 32 2c 33 2e 31 34 31 35  {"ex":[52,3.1415
03b0: 39 5d 7d 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  9]}}}.do_execsql
03c0: 5f 74 65 73 74 20 6a 73 6f 6e 31 30 32 2d 31 33  _test json102-13
03d0: 30 20 7b 0a 20 20 53 45 4c 45 43 54 20 6a 73 6f  0 {.  SELECT jso
03e0: 6e 28 27 20 7b 20 22 74 68 69 73 22 20 3a 20 22  n(' { "this" : "
03f0: 69 73 22 2c 20 22 61 22 3a 20 5b 20 22 74 65 73  is", "a": [ "tes
0400: 74 22 20 5d 20 7d 20 27 29 3b 0a 7d 20 7b 7b 7b  t" ] } ');.} {{{
0410: 22 74 68 69 73 22 3a 22 69 73 22 2c 22 61 22 3a  "this":"is","a":
0420: 5b 22 74 65 73 74 22 5d 7d 7d 7d 0a 64 6f 5f 65  ["test"]}}}.do_e
0430: 78 65 63 73 71 6c 5f 74 65 73 74 20 6a 73 6f 6e  xecsql_test json
0440: 31 30 32 2d 31 34 30 20 7b 0a 20 20 53 45 4c 45  102-140 {.  SELE
0450: 43 54 20 6a 73 6f 6e 5f 61 72 72 61 79 28 31 2c  CT json_array(1,
0460: 32 2c 27 33 27 2c 34 29 3b 0a 7d 20 7b 7b 5b 31  2,'3',4);.} {{[1
0470: 2c 32 2c 22 33 22 2c 34 5d 7d 7d 0a 64 6f 5f 65  ,2,"3",4]}}.do_e
0480: 78 65 63 73 71 6c 5f 74 65 73 74 20 6a 73 6f 6e  xecsql_test json
0490: 31 30 32 2d 31 35 30 20 7b 0a 20 20 53 45 4c 45  102-150 {.  SELE
04a0: 43 54 20 6a 73 6f 6e 5f 61 72 72 61 79 28 27 5b  CT json_array('[
04b0: 31 2c 32 5d 27 29 3b 0a 7d 20 7b 7b 5b 22 5b 31  1,2]');.} {{["[1
04c0: 2c 32 5d 22 5d 7d 7d 0a 64 6f 5f 65 78 65 63 73  ,2]"]}}.do_execs
04d0: 71 6c 5f 74 65 73 74 20 6a 73 6f 6e 31 30 32 2d  ql_test json102-
04e0: 31 36 30 20 7b 0a 20 20 53 45 4c 45 43 54 20 6a  160 {.  SELECT j
04f0: 73 6f 6e 5f 61 72 72 61 79 28 6a 73 6f 6e 5f 61  son_array(json_a
0500: 72 72 61 79 28 31 2c 32 29 29 3b 0a 7d 20 7b 7b  rray(1,2));.} {{
0510: 5b 5b 31 2c 32 5d 5d 7d 7d 0a 64 6f 5f 65 78 65  [[1,2]]}}.do_exe
0520: 63 73 71 6c 5f 74 65 73 74 20 6a 73 6f 6e 31 30  csql_test json10
0530: 32 2d 31 37 30 20 7b 0a 20 20 53 45 4c 45 43 54  2-170 {.  SELECT
0540: 20 6a 73 6f 6e 5f 61 72 72 61 79 28 31 2c 6e 75   json_array(1,nu
0550: 6c 6c 2c 27 33 27 2c 27 5b 34 2c 35 5d 27 2c 27  ll,'3','[4,5]','
0560: 7b 22 73 69 78 22 3a 37 2e 37 7d 27 29 3b 0a 7d  {"six":7.7}');.}
0570: 20 7b 7b 5b 31 2c 6e 75 6c 6c 2c 22 33 22 2c 22   {{[1,null,"3","
0580: 5b 34 2c 35 5d 22 2c 22 7b 5c 22 73 69 78 5c 22  [4,5]","{\"six\"
0590: 3a 37 2e 37 7d 22 5d 7d 7d 0a 64 6f 5f 65 78 65  :7.7}"]}}.do_exe
05a0: 63 73 71 6c 5f 74 65 73 74 20 6a 73 6f 6e 31 30  csql_test json10
05b0: 32 2d 31 38 30 20 7b 0a 20 20 53 45 4c 45 43 54  2-180 {.  SELECT
05c0: 20 6a 73 6f 6e 5f 61 72 72 61 79 28 31 2c 6e 75   json_array(1,nu
05d0: 6c 6c 2c 27 33 27 2c 6a 73 6f 6e 28 27 5b 34 2c  ll,'3',json('[4,
05e0: 35 5d 27 29 2c 6a 73 6f 6e 28 27 7b 22 73 69 78  5]'),json('{"six
05f0: 22 3a 37 2e 37 7d 27 29 29 3b 0a 7d 20 7b 7b 5b  ":7.7}'));.} {{[
0600: 31 2c 6e 75 6c 6c 2c 22 33 22 2c 5b 34 2c 35 5d  1,null,"3",[4,5]
0610: 2c 7b 22 73 69 78 22 3a 37 2e 37 7d 5d 7d 7d 0a  ,{"six":7.7}]}}.
0620: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
0630: 6a 73 6f 6e 31 30 32 2d 31 39 30 20 7b 0a 20 20  json102-190 {.  
0640: 53 45 4c 45 43 54 20 6a 73 6f 6e 5f 61 72 72 61  SELECT json_arra
0650: 79 5f 6c 65 6e 67 74 68 28 27 5b 31 2c 32 2c 33  y_length('[1,2,3
0660: 2c 34 5d 27 29 3b 0a 7d 20 7b 7b 34 7d 7d 0a 64  ,4]');.} {{4}}.d
0670: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 6a  o_execsql_test j
0680: 73 6f 6e 31 30 32 2d 32 30 30 20 7b 0a 20 20 53  son102-200 {.  S
0690: 45 4c 45 43 54 20 6a 73 6f 6e 5f 61 72 72 61 79  ELECT json_array
06a0: 5f 6c 65 6e 67 74 68 28 27 5b 31 2c 32 2c 33 2c  _length('[1,2,3,
06b0: 34 5d 27 2c 20 27 24 27 29 3b 0a 7d 20 7b 7b 34  4]', '$');.} {{4
06c0: 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }}.do_execsql_te
06d0: 73 74 20 6a 73 6f 6e 31 30 32 2d 32 31 30 20 7b  st json102-210 {
06e0: 0a 20 20 53 45 4c 45 43 54 20 6a 73 6f 6e 5f 61  .  SELECT json_a
06f0: 72 72 61 79 5f 6c 65 6e 67 74 68 28 27 5b 31 2c  rray_length('[1,
0700: 32 2c 33 2c 34 5d 27 2c 20 27 24 5b 32 5d 27 29  2,3,4]', '$[2]')
0710: 3b 0a 7d 20 7b 7b 30 7d 7d 0a 64 6f 5f 65 78 65  ;.} {{0}}.do_exe
0720: 63 73 71 6c 5f 74 65 73 74 20 6a 73 6f 6e 31 30  csql_test json10
0730: 32 2d 32 32 30 20 7b 0a 20 20 53 45 4c 45 43 54  2-220 {.  SELECT
0740: 20 6a 73 6f 6e 5f 61 72 72 61 79 5f 6c 65 6e 67   json_array_leng
0750: 74 68 28 27 7b 22 6f 6e 65 22 3a 5b 31 2c 32 2c  th('{"one":[1,2,
0760: 33 5d 7d 27 29 3b 0a 7d 20 7b 7b 30 7d 7d 0a 64  3]}');.} {{0}}.d
0770: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 6a  o_execsql_test j
0780: 73 6f 6e 31 30 32 2d 32 33 30 20 7b 0a 20 20 53  son102-230 {.  S
0790: 45 4c 45 43 54 20 6a 73 6f 6e 5f 61 72 72 61 79  ELECT json_array
07a0: 5f 6c 65 6e 67 74 68 28 27 7b 22 6f 6e 65 22 3a  _length('{"one":
07b0: 5b 31 2c 32 2c 33 5d 7d 27 2c 20 27 24 2e 6f 6e  [1,2,3]}', '$.on
07c0: 65 27 29 3b 0a 7d 20 7b 7b 33 7d 7d 0a 64 6f 5f  e');.} {{3}}.do_
07d0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 6a 73 6f  execsql_test jso
07e0: 6e 31 30 32 2d 32 34 30 20 7b 0a 20 20 53 45 4c  n102-240 {.  SEL
07f0: 45 43 54 20 6a 73 6f 6e 5f 61 72 72 61 79 5f 6c  ECT json_array_l
0800: 65 6e 67 74 68 28 27 7b 22 6f 6e 65 22 3a 5b 31  ength('{"one":[1
0810: 2c 32 2c 33 5d 7d 27 2c 20 27 24 2e 74 77 6f 27  ,2,3]}', '$.two'
0820: 29 3b 0a 7d 20 7b 7b 7d 7d 0a 64 6f 5f 65 78 65  );.} {{}}.do_exe
0830: 63 73 71 6c 5f 74 65 73 74 20 6a 73 6f 6e 31 30  csql_test json10
0840: 32 2d 32 35 30 20 7b 0a 20 20 53 45 4c 45 43 54  2-250 {.  SELECT
0850: 20 6a 73 6f 6e 5f 65 78 74 72 61 63 74 28 27 7b   json_extract('{
0860: 22 61 22 3a 32 2c 22 63 22 3a 5b 34 2c 35 2c 7b  "a":2,"c":[4,5,{
0870: 22 66 22 3a 37 7d 5d 7d 27 2c 20 27 24 27 29 3b  "f":7}]}', '$');
0880: 0a 7d 20 7b 7b 7b 22 61 22 3a 32 2c 22 63 22 3a  .} {{{"a":2,"c":
0890: 5b 34 2c 35 2c 7b 22 66 22 3a 37 7d 5d 7d 7d 7d  [4,5,{"f":7}]}}}
08a0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
08b0: 20 6a 73 6f 6e 31 30 32 2d 32 36 30 20 7b 0a 20   json102-260 {. 
08c0: 20 53 45 4c 45 43 54 20 6a 73 6f 6e 5f 65 78 74   SELECT json_ext
08d0: 72 61 63 74 28 27 7b 22 61 22 3a 32 2c 22 63 22  ract('{"a":2,"c"
08e0: 3a 5b 34 2c 35 2c 7b 22 66 22 3a 37 7d 5d 7d 27  :[4,5,{"f":7}]}'
08f0: 2c 20 27 24 2e 63 27 29 3b 0a 7d 20 7b 7b 5b 34  , '$.c');.} {{[4
0900: 2c 35 2c 7b 22 66 22 3a 37 7d 5d 7d 7d 0a 64 6f  ,5,{"f":7}]}}.do
0910: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 6a 73  _execsql_test js
0920: 6f 6e 31 30 32 2d 32 37 30 20 7b 0a 20 20 53 45  on102-270 {.  SE
0930: 4c 45 43 54 20 6a 73 6f 6e 5f 65 78 74 72 61 63  LECT json_extrac
0940: 74 28 27 7b 22 61 22 3a 32 2c 22 63 22 3a 5b 34  t('{"a":2,"c":[4
0950: 2c 35 2c 7b 22 66 22 3a 37 7d 5d 7d 27 2c 20 27  ,5,{"f":7}]}', '
0960: 24 2e 63 5b 32 5d 27 29 3b 0a 7d 20 7b 7b 7b 22  $.c[2]');.} {{{"
0970: 66 22 3a 37 7d 7d 7d 0a 64 6f 5f 65 78 65 63 73  f":7}}}.do_execs
0980: 71 6c 5f 74 65 73 74 20 6a 73 6f 6e 31 30 32 2d  ql_test json102-
0990: 32 38 30 20 7b 0a 20 20 53 45 4c 45 43 54 20 6a  280 {.  SELECT j
09a0: 73 6f 6e 5f 65 78 74 72 61 63 74 28 27 7b 22 61  son_extract('{"a
09b0: 22 3a 32 2c 22 63 22 3a 5b 34 2c 35 2c 7b 22 66  ":2,"c":[4,5,{"f
09c0: 22 3a 37 7d 5d 7d 27 2c 20 27 24 2e 63 5b 32 5d  ":7}]}', '$.c[2]
09d0: 2e 66 27 29 3b 0a 7d 20 7b 7b 37 7d 7d 0a 64 6f  .f');.} {{7}}.do
09e0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 6a 73  _execsql_test js
09f0: 6f 6e 31 30 32 2d 32 39 30 20 7b 0a 20 20 53 45  on102-290 {.  SE
0a00: 4c 45 43 54 20 6a 73 6f 6e 5f 65 78 74 72 61 63  LECT json_extrac
0a10: 74 28 27 7b 22 61 22 3a 32 2c 22 63 22 3a 5b 34  t('{"a":2,"c":[4
0a20: 2c 35 5d 2c 22 66 22 3a 37 7d 27 2c 27 24 2e 63  ,5],"f":7}','$.c
0a30: 27 2c 27 24 2e 61 27 29 3b 0a 7d 20 7b 7b 5b 5b  ','$.a');.} {{[[
0a40: 34 2c 35 5d 2c 32 5d 7d 7d 0a 64 6f 5f 65 78 65  4,5],2]}}.do_exe
0a50: 63 73 71 6c 5f 74 65 73 74 20 6a 73 6f 6e 31 30  csql_test json10
0a60: 32 2d 33 30 30 20 7b 0a 20 20 53 45 4c 45 43 54  2-300 {.  SELECT
0a70: 20 6a 73 6f 6e 5f 65 78 74 72 61 63 74 28 27 7b   json_extract('{
0a80: 22 61 22 3a 32 2c 22 63 22 3a 5b 34 2c 35 2c 7b  "a":2,"c":[4,5,{
0a90: 22 66 22 3a 37 7d 5d 7d 27 2c 20 27 24 2e 78 27  "f":7}]}', '$.x'
0aa0: 29 3b 0a 7d 20 7b 7b 7d 7d 0a 64 6f 5f 65 78 65  );.} {{}}.do_exe
0ab0: 63 73 71 6c 5f 74 65 73 74 20 6a 73 6f 6e 31 30  csql_test json10
0ac0: 32 2d 33 31 30 20 7b 0a 20 20 53 45 4c 45 43 54  2-310 {.  SELECT
0ad0: 20 6a 73 6f 6e 5f 65 78 74 72 61 63 74 28 27 7b   json_extract('{
0ae0: 22 61 22 3a 32 2c 22 63 22 3a 5b 34 2c 35 2c 7b  "a":2,"c":[4,5,{
0af0: 22 66 22 3a 37 7d 5d 7d 27 2c 20 27 24 2e 78 27  "f":7}]}', '$.x'
0b00: 2c 20 27 24 2e 61 27 29 3b 0a 7d 20 7b 7b 5b 6e  , '$.a');.} {{[n
0b10: 75 6c 6c 2c 32 5d 7d 7d 0a 64 6f 5f 65 78 65 63  ull,2]}}.do_exec
0b20: 73 71 6c 5f 74 65 73 74 20 6a 73 6f 6e 31 30 32  sql_test json102
0b30: 2d 33 32 30 20 7b 0a 20 20 53 45 4c 45 43 54 20  -320 {.  SELECT 
0b40: 6a 73 6f 6e 5f 69 6e 73 65 72 74 28 27 7b 22 61  json_insert('{"a
0b50: 22 3a 32 2c 22 63 22 3a 34 7d 27 2c 20 27 24 2e  ":2,"c":4}', '$.
0b60: 61 27 2c 20 39 39 29 3b 0a 7d 20 7b 7b 7b 22 61  a', 99);.} {{{"a
0b70: 22 3a 32 2c 22 63 22 3a 34 7d 7d 7d 0a 64 6f 5f  ":2,"c":4}}}.do_
0b80: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 6a 73 6f  execsql_test jso
0b90: 6e 31 30 32 2d 33 33 30 20 7b 0a 20 20 53 45 4c  n102-330 {.  SEL
0ba0: 45 43 54 20 6a 73 6f 6e 5f 69 6e 73 65 72 74 28  ECT json_insert(
0bb0: 27 7b 22 61 22 3a 32 2c 22 63 22 3a 34 7d 27 2c  '{"a":2,"c":4}',
0bc0: 20 27 24 2e 65 27 2c 20 39 39 29 3b 0a 7d 20 7b   '$.e', 99);.} {
0bd0: 7b 7b 22 61 22 3a 32 2c 22 63 22 3a 34 2c 22 65  {{"a":2,"c":4,"e
0be0: 22 3a 39 39 7d 7d 7d 0a 64 6f 5f 65 78 65 63 73  ":99}}}.do_execs
0bf0: 71 6c 5f 74 65 73 74 20 6a 73 6f 6e 31 30 32 2d  ql_test json102-
0c00: 33 34 30 20 7b 0a 20 20 53 45 4c 45 43 54 20 6a  340 {.  SELECT j
0c10: 73 6f 6e 5f 72 65 70 6c 61 63 65 28 27 7b 22 61  son_replace('{"a
0c20: 22 3a 32 2c 22 63 22 3a 34 7d 27 2c 20 27 24 2e  ":2,"c":4}', '$.
0c30: 61 27 2c 20 39 39 29 3b 0a 7d 20 7b 7b 7b 22 61  a', 99);.} {{{"a
0c40: 22 3a 39 39 2c 22 63 22 3a 34 7d 7d 7d 0a 64 6f  ":99,"c":4}}}.do
0c50: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 6a 73  _execsql_test js
0c60: 6f 6e 31 30 32 2d 33 35 30 20 7b 0a 20 20 53 45  on102-350 {.  SE
0c70: 4c 45 43 54 20 6a 73 6f 6e 5f 72 65 70 6c 61 63  LECT json_replac
0c80: 65 28 27 7b 22 61 22 3a 32 2c 22 63 22 3a 34 7d  e('{"a":2,"c":4}
0c90: 27 2c 20 27 24 2e 65 27 2c 20 39 39 29 3b 0a 7d  ', '$.e', 99);.}
0ca0: 20 7b 7b 7b 22 61 22 3a 32 2c 22 63 22 3a 34 7d   {{{"a":2,"c":4}
0cb0: 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }}.do_execsql_te
0cc0: 73 74 20 6a 73 6f 6e 31 30 32 2d 33 36 30 20 7b  st json102-360 {
0cd0: 0a 20 20 53 45 4c 45 43 54 20 6a 73 6f 6e 5f 73  .  SELECT json_s
0ce0: 65 74 28 27 7b 22 61 22 3a 32 2c 22 63 22 3a 34  et('{"a":2,"c":4
0cf0: 7d 27 2c 20 27 24 2e 61 27 2c 20 39 39 29 3b 0a  }', '$.a', 99);.
0d00: 7d 20 7b 7b 7b 22 61 22 3a 39 39 2c 22 63 22 3a  } {{{"a":99,"c":
0d10: 34 7d 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  4}}}.do_execsql_
0d20: 74 65 73 74 20 6a 73 6f 6e 31 30 32 2d 33 37 30  test json102-370
0d30: 20 7b 0a 20 20 53 45 4c 45 43 54 20 6a 73 6f 6e   {.  SELECT json
0d40: 5f 73 65 74 28 27 7b 22 61 22 3a 32 2c 22 63 22  _set('{"a":2,"c"
0d50: 3a 34 7d 27 2c 20 27 24 2e 65 27 2c 20 39 39 29  :4}', '$.e', 99)
0d60: 3b 0a 7d 20 7b 7b 7b 22 61 22 3a 32 2c 22 63 22  ;.} {{{"a":2,"c"
0d70: 3a 34 2c 22 65 22 3a 39 39 7d 7d 7d 0a 64 6f 5f  :4,"e":99}}}.do_
0d80: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 6a 73 6f  execsql_test jso
0d90: 6e 31 30 32 2d 33 38 30 20 7b 0a 20 20 53 45 4c  n102-380 {.  SEL
0da0: 45 43 54 20 6a 73 6f 6e 5f 73 65 74 28 27 7b 22  ECT json_set('{"
0db0: 61 22 3a 32 2c 22 63 22 3a 34 7d 27 2c 20 27 24  a":2,"c":4}', '$
0dc0: 2e 63 27 2c 20 27 5b 39 37 2c 39 36 5d 27 29 3b  .c', '[97,96]');
0dd0: 0a 7d 20 7b 7b 7b 22 61 22 3a 32 2c 22 63 22 3a  .} {{{"a":2,"c":
0de0: 22 5b 39 37 2c 39 36 5d 22 7d 7d 7d 0a 64 6f 5f  "[97,96]"}}}.do_
0df0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 6a 73 6f  execsql_test jso
0e00: 6e 31 30 32 2d 33 39 30 20 7b 0a 20 20 53 45 4c  n102-390 {.  SEL
0e10: 45 43 54 20 6a 73 6f 6e 5f 73 65 74 28 27 7b 22  ECT json_set('{"
0e20: 61 22 3a 32 2c 22 63 22 3a 34 7d 27 2c 20 27 24  a":2,"c":4}', '$
0e30: 2e 63 27 2c 20 6a 73 6f 6e 28 27 5b 39 37 2c 39  .c', json('[97,9
0e40: 36 5d 27 29 29 3b 0a 7d 20 7b 7b 7b 22 61 22 3a  6]'));.} {{{"a":
0e50: 32 2c 22 63 22 3a 5b 39 37 2c 39 36 5d 7d 7d 7d  2,"c":[97,96]}}}
0e60: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
0e70: 20 6a 73 6f 6e 31 30 32 2d 34 30 30 20 7b 0a 20   json102-400 {. 
0e80: 20 53 45 4c 45 43 54 20 6a 73 6f 6e 5f 73 65 74   SELECT json_set
0e90: 28 27 7b 22 61 22 3a 32 2c 22 63 22 3a 34 7d 27  ('{"a":2,"c":4}'
0ea0: 2c 20 27 24 2e 63 27 2c 20 6a 73 6f 6e 5f 61 72  , '$.c', json_ar
0eb0: 72 61 79 28 39 37 2c 39 36 29 29 3b 0a 7d 20 7b  ray(97,96));.} {
0ec0: 7b 7b 22 61 22 3a 32 2c 22 63 22 3a 5b 39 37 2c  {{"a":2,"c":[97,
0ed0: 39 36 5d 7d 7d 7d 0a 64 6f 5f 65 78 65 63 73 71  96]}}}.do_execsq
0ee0: 6c 5f 74 65 73 74 20 6a 73 6f 6e 31 30 32 2d 34  l_test json102-4
0ef0: 31 30 20 7b 0a 20 20 53 45 4c 45 43 54 20 6a 73  10 {.  SELECT js
0f00: 6f 6e 5f 6f 62 6a 65 63 74 28 27 61 27 2c 32 2c  on_object('a',2,
0f10: 27 63 27 2c 34 29 3b 0a 7d 20 7b 7b 7b 22 61 22  'c',4);.} {{{"a"
0f20: 3a 32 2c 22 63 22 3a 34 7d 7d 7d 0a 64 6f 5f 65  :2,"c":4}}}.do_e
0f30: 78 65 63 73 71 6c 5f 74 65 73 74 20 6a 73 6f 6e  xecsql_test json
0f40: 31 30 32 2d 34 32 30 20 7b 0a 20 20 53 45 4c 45  102-420 {.  SELE
0f50: 43 54 20 6a 73 6f 6e 5f 6f 62 6a 65 63 74 28 27  CT json_object('
0f60: 61 27 2c 32 2c 27 63 27 2c 27 7b 65 3a 35 7d 27  a',2,'c','{e:5}'
0f70: 29 3b 0a 7d 20 7b 7b 7b 22 61 22 3a 32 2c 22 63  );.} {{{"a":2,"c
0f80: 22 3a 22 7b 65 3a 35 7d 22 7d 7d 7d 0a 64 6f 5f  ":"{e:5}"}}}.do_
0f90: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 6a 73 6f  execsql_test jso
0fa0: 6e 31 30 32 2d 34 33 30 20 7b 0a 20 20 53 45 4c  n102-430 {.  SEL
0fb0: 45 43 54 20 6a 73 6f 6e 5f 6f 62 6a 65 63 74 28  ECT json_object(
0fc0: 27 61 27 2c 32 2c 27 63 27 2c 6a 73 6f 6e 5f 6f  'a',2,'c',json_o
0fd0: 62 6a 65 63 74 28 27 65 27 2c 35 29 29 3b 0a 7d  bject('e',5));.}
0fe0: 20 7b 7b 7b 22 61 22 3a 32 2c 22 63 22 3a 7b 22   {{{"a":2,"c":{"
0ff0: 65 22 3a 35 7d 7d 7d 7d 0a 64 6f 5f 65 78 65 63  e":5}}}}.do_exec
1000: 73 71 6c 5f 74 65 73 74 20 6a 73 6f 6e 31 30 32  sql_test json102
1010: 2d 34 34 30 20 7b 0a 20 20 53 45 4c 45 43 54 20  -440 {.  SELECT 
1020: 6a 73 6f 6e 5f 72 65 6d 6f 76 65 28 27 5b 30 2c  json_remove('[0,
1030: 31 2c 32 2c 33 2c 34 5d 27 2c 27 24 5b 32 5d 27  1,2,3,4]','$[2]'
1040: 29 3b 0a 7d 20 7b 7b 5b 30 2c 31 2c 33 2c 34 5d  );.} {{[0,1,3,4]
1050: 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }}.do_execsql_te
1060: 73 74 20 6a 73 6f 6e 31 30 32 2d 34 35 30 20 7b  st json102-450 {
1070: 0a 20 20 53 45 4c 45 43 54 20 6a 73 6f 6e 5f 72  .  SELECT json_r
1080: 65 6d 6f 76 65 28 27 5b 30 2c 31 2c 32 2c 33 2c  emove('[0,1,2,3,
1090: 34 5d 27 2c 27 24 5b 32 5d 27 2c 27 24 5b 30 5d  4]','$[2]','$[0]
10a0: 27 29 3b 0a 7d 20 7b 7b 5b 31 2c 33 2c 34 5d 7d  ');.} {{[1,3,4]}
10b0: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
10c0: 74 20 6a 73 6f 6e 31 30 32 2d 34 36 30 20 7b 0a  t json102-460 {.
10d0: 20 20 53 45 4c 45 43 54 20 6a 73 6f 6e 5f 72 65    SELECT json_re
10e0: 6d 6f 76 65 28 27 5b 30 2c 31 2c 32 2c 33 2c 34  move('[0,1,2,3,4
10f0: 5d 27 2c 27 24 5b 30 5d 27 2c 27 24 5b 32 5d 27  ]','$[0]','$[2]'
1100: 29 3b 0a 7d 20 7b 7b 5b 31 2c 32 2c 34 5d 7d 7d  );.} {{[1,2,4]}}
1110: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
1120: 20 6a 73 6f 6e 31 30 32 2d 34 37 30 20 7b 0a 20   json102-470 {. 
1130: 20 53 45 4c 45 43 54 20 6a 73 6f 6e 5f 72 65 6d   SELECT json_rem
1140: 6f 76 65 28 27 7b 22 78 22 3a 32 35 2c 22 79 22  ove('{"x":25,"y"
1150: 3a 34 32 7d 27 29 3b 0a 7d 20 7b 7b 7b 22 78 22  :42}');.} {{{"x"
1160: 3a 32 35 2c 22 79 22 3a 34 32 7d 7d 7d 0a 64 6f  :25,"y":42}}}.do
1170: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 6a 73  _execsql_test js
1180: 6f 6e 31 30 32 2d 34 38 30 20 7b 0a 20 20 53 45  on102-480 {.  SE
1190: 4c 45 43 54 20 6a 73 6f 6e 5f 72 65 6d 6f 76 65  LECT json_remove
11a0: 28 27 7b 22 78 22 3a 32 35 2c 22 79 22 3a 34 32  ('{"x":25,"y":42
11b0: 7d 27 2c 27 24 2e 7a 27 29 3b 0a 7d 20 7b 7b 7b  }','$.z');.} {{{
11c0: 22 78 22 3a 32 35 2c 22 79 22 3a 34 32 7d 7d 7d  "x":25,"y":42}}}
11d0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
11e0: 20 6a 73 6f 6e 31 30 32 2d 34 39 30 20 7b 0a 20   json102-490 {. 
11f0: 20 53 45 4c 45 43 54 20 6a 73 6f 6e 5f 72 65 6d   SELECT json_rem
1200: 6f 76 65 28 27 7b 22 78 22 3a 32 35 2c 22 79 22  ove('{"x":25,"y"
1210: 3a 34 32 7d 27 2c 27 24 2e 79 27 29 3b 0a 7d 20  :42}','$.y');.} 
1220: 7b 7b 7b 22 78 22 3a 32 35 7d 7d 7d 0a 64 6f 5f  {{{"x":25}}}.do_
1230: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 6a 73 6f  execsql_test jso
1240: 6e 31 30 32 2d 35 30 30 20 7b 0a 20 20 53 45 4c  n102-500 {.  SEL
1250: 45 43 54 20 6a 73 6f 6e 5f 72 65 6d 6f 76 65 28  ECT json_remove(
1260: 27 7b 22 78 22 3a 32 35 2c 22 79 22 3a 34 32 7d  '{"x":25,"y":42}
1270: 27 2c 27 24 27 29 3b 0a 7d 20 7b 7b 7d 7d 0a 64  ','$');.} {{}}.d
1280: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 6a  o_execsql_test j
1290: 73 6f 6e 31 30 32 2d 35 31 30 20 7b 0a 20 20 53  son102-510 {.  S
12a0: 45 4c 45 43 54 20 6a 73 6f 6e 5f 74 79 70 65 28  ELECT json_type(
12b0: 27 7b 22 61 22 3a 5b 32 2c 33 2e 35 2c 74 72 75  '{"a":[2,3.5,tru
12c0: 65 2c 66 61 6c 73 65 2c 6e 75 6c 6c 2c 22 78 22  e,false,null,"x"
12d0: 5d 7d 27 29 3b 0a 7d 20 7b 7b 6f 62 6a 65 63 74  ]}');.} {{object
12e0: 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  }}.do_execsql_te
12f0: 73 74 20 6a 73 6f 6e 31 30 32 2d 35 32 30 20 7b  st json102-520 {
1300: 0a 20 20 53 45 4c 45 43 54 20 6a 73 6f 6e 5f 74  .  SELECT json_t
1310: 79 70 65 28 27 7b 22 61 22 3a 5b 32 2c 33 2e 35  ype('{"a":[2,3.5
1320: 2c 74 72 75 65 2c 66 61 6c 73 65 2c 6e 75 6c 6c  ,true,false,null
1330: 2c 22 78 22 5d 7d 27 2c 27 24 27 29 3b 0a 7d 20  ,"x"]}','$');.} 
1340: 7b 7b 6f 62 6a 65 63 74 7d 7d 0a 64 6f 5f 65 78  {{object}}.do_ex
1350: 65 63 73 71 6c 5f 74 65 73 74 20 6a 73 6f 6e 31  ecsql_test json1
1360: 30 32 2d 35 33 30 20 7b 0a 20 20 53 45 4c 45 43  02-530 {.  SELEC
1370: 54 20 6a 73 6f 6e 5f 74 79 70 65 28 27 7b 22 61  T json_type('{"a
1380: 22 3a 5b 32 2c 33 2e 35 2c 74 72 75 65 2c 66 61  ":[2,3.5,true,fa
1390: 6c 73 65 2c 6e 75 6c 6c 2c 22 78 22 5d 7d 27 2c  lse,null,"x"]}',
13a0: 27 24 2e 61 27 29 3b 0a 7d 20 7b 7b 61 72 72 61  '$.a');.} {{arra
13b0: 79 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  y}}.do_execsql_t
13c0: 65 73 74 20 6a 73 6f 6e 31 30 32 2d 35 34 30 20  est json102-540 
13d0: 7b 0a 20 20 53 45 4c 45 43 54 20 6a 73 6f 6e 5f  {.  SELECT json_
13e0: 74 79 70 65 28 27 7b 22 61 22 3a 5b 32 2c 33 2e  type('{"a":[2,3.
13f0: 35 2c 74 72 75 65 2c 66 61 6c 73 65 2c 6e 75 6c  5,true,false,nul
1400: 6c 2c 22 78 22 5d 7d 27 2c 27 24 2e 61 5b 30 5d  l,"x"]}','$.a[0]
1410: 27 29 3b 0a 7d 20 7b 7b 69 6e 74 65 67 65 72 7d  ');.} {{integer}
1420: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
1430: 74 20 6a 73 6f 6e 31 30 32 2d 35 35 30 20 7b 0a  t json102-550 {.
1440: 20 20 53 45 4c 45 43 54 20 6a 73 6f 6e 5f 74 79    SELECT json_ty
1450: 70 65 28 27 7b 22 61 22 3a 5b 32 2c 33 2e 35 2c  pe('{"a":[2,3.5,
1460: 74 72 75 65 2c 66 61 6c 73 65 2c 6e 75 6c 6c 2c  true,false,null,
1470: 22 78 22 5d 7d 27 2c 27 24 2e 61 5b 31 5d 27 29  "x"]}','$.a[1]')
1480: 3b 0a 7d 20 7b 7b 72 65 61 6c 7d 7d 0a 64 6f 5f  ;.} {{real}}.do_
1490: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 6a 73 6f  execsql_test jso
14a0: 6e 31 30 32 2d 35 36 30 20 7b 0a 20 20 53 45 4c  n102-560 {.  SEL
14b0: 45 43 54 20 6a 73 6f 6e 5f 74 79 70 65 28 27 7b  ECT json_type('{
14c0: 22 61 22 3a 5b 32 2c 33 2e 35 2c 74 72 75 65 2c  "a":[2,3.5,true,
14d0: 66 61 6c 73 65 2c 6e 75 6c 6c 2c 22 78 22 5d 7d  false,null,"x"]}
14e0: 27 2c 27 24 2e 61 5b 32 5d 27 29 3b 0a 7d 20 7b  ','$.a[2]');.} {
14f0: 7b 74 72 75 65 7d 7d 0a 64 6f 5f 65 78 65 63 73  {true}}.do_execs
1500: 71 6c 5f 74 65 73 74 20 6a 73 6f 6e 31 30 32 2d  ql_test json102-
1510: 35 37 30 20 7b 0a 20 20 53 45 4c 45 43 54 20 6a  570 {.  SELECT j
1520: 73 6f 6e 5f 74 79 70 65 28 27 7b 22 61 22 3a 5b  son_type('{"a":[
1530: 32 2c 33 2e 35 2c 74 72 75 65 2c 66 61 6c 73 65  2,3.5,true,false
1540: 2c 6e 75 6c 6c 2c 22 78 22 5d 7d 27 2c 27 24 2e  ,null,"x"]}','$.
1550: 61 5b 33 5d 27 29 3b 0a 7d 20 7b 7b 66 61 6c 73  a[3]');.} {{fals
1560: 65 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  e}}.do_execsql_t
1570: 65 73 74 20 6a 73 6f 6e 31 30 32 2d 35 38 30 20  est json102-580 
1580: 7b 0a 20 20 53 45 4c 45 43 54 20 6a 73 6f 6e 5f  {.  SELECT json_
1590: 74 79 70 65 28 27 7b 22 61 22 3a 5b 32 2c 33 2e  type('{"a":[2,3.
15a0: 35 2c 74 72 75 65 2c 66 61 6c 73 65 2c 6e 75 6c  5,true,false,nul
15b0: 6c 2c 22 78 22 5d 7d 27 2c 27 24 2e 61 5b 34 5d  l,"x"]}','$.a[4]
15c0: 27 29 3b 0a 7d 20 7b 7b 6e 75 6c 6c 7d 7d 0a 64  ');.} {{null}}.d
15d0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 6a  o_execsql_test j
15e0: 73 6f 6e 31 30 32 2d 35 39 30 20 7b 0a 20 20 53  son102-590 {.  S
15f0: 45 4c 45 43 54 20 6a 73 6f 6e 5f 74 79 70 65 28  ELECT json_type(
1600: 27 7b 22 61 22 3a 5b 32 2c 33 2e 35 2c 74 72 75  '{"a":[2,3.5,tru
1610: 65 2c 66 61 6c 73 65 2c 6e 75 6c 6c 2c 22 78 22  e,false,null,"x"
1620: 5d 7d 27 2c 27 24 2e 61 5b 35 5d 27 29 3b 0a 7d  ]}','$.a[5]');.}
1630: 20 7b 7b 74 65 78 74 7d 7d 0a 64 6f 5f 65 78 65   {{text}}.do_exe
1640: 63 73 71 6c 5f 74 65 73 74 20 6a 73 6f 6e 31 30  csql_test json10
1650: 32 2d 36 30 30 20 7b 0a 20 20 53 45 4c 45 43 54  2-600 {.  SELECT
1660: 20 6a 73 6f 6e 5f 74 79 70 65 28 27 7b 22 61 22   json_type('{"a"
1670: 3a 5b 32 2c 33 2e 35 2c 74 72 75 65 2c 66 61 6c  :[2,3.5,true,fal
1680: 73 65 2c 6e 75 6c 6c 2c 22 78 22 5d 7d 27 2c 27  se,null,"x"]}','
1690: 24 2e 61 5b 36 5d 27 29 3b 0a 7d 20 7b 7b 7d 7d  $.a[6]');.} {{}}
16a0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
16b0: 20 6a 73 6f 6e 31 30 32 2d 36 31 30 20 7b 0a 20   json102-610 {. 
16c0: 20 53 45 4c 45 43 54 20 6a 73 6f 6e 5f 76 61 6c   SELECT json_val
16d0: 69 64 28 63 68 61 72 28 31 32 33 29 7c 7c 27 22  id(char(123)||'"
16e0: 78 22 3a 33 35 27 7c 7c 63 68 61 72 28 31 32 35  x":35'||char(125
16f0: 29 29 3b 0a 7d 20 7b 7b 31 7d 7d 0a 64 6f 5f 65  ));.} {{1}}.do_e
1700: 78 65 63 73 71 6c 5f 74 65 73 74 20 6a 73 6f 6e  xecsql_test json
1710: 31 30 32 2d 36 32 30 20 7b 0a 20 20 53 45 4c 45  102-620 {.  SELE
1720: 43 54 20 6a 73 6f 6e 5f 76 61 6c 69 64 28 63 68  CT json_valid(ch
1730: 61 72 28 31 32 33 29 7c 7c 27 22 78 22 3a 33 35  ar(123)||'"x":35
1740: 27 29 3b 0a 7d 20 7b 7b 30 7d 7d 0a 0a 69 66 63  ');.} {{0}}..ifc
1750: 61 70 61 62 6c 65 20 76 74 61 62 20 7b 0a 64 6f  apable vtab {.do
1760: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 6a 73  _execsql_test js
1770: 6f 6e 31 30 32 2d 31 30 30 30 20 7b 0a 20 20 43  on102-1000 {.  C
1780: 52 45 41 54 45 20 54 41 42 4c 45 20 75 73 65 72  REATE TABLE user
1790: 28 6e 61 6d 65 2c 70 68 6f 6e 65 29 3b 0a 20 20  (name,phone);.  
17a0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 75 73 65 72  INSERT INTO user
17b0: 28 6e 61 6d 65 2c 70 68 6f 6e 65 29 20 56 41 4c  (name,phone) VAL
17c0: 55 45 53 0a 20 20 20 20 20 28 27 41 6c 69 63 65  UES.     ('Alice
17d0: 27 2c 27 5b 22 39 31 39 2d 35 35 35 2d 32 33 34  ','["919-555-234
17e0: 35 22 2c 22 38 30 34 2d 35 35 35 2d 33 36 32 31  5","804-555-3621
17f0: 22 5d 27 29 2c 0a 20 20 20 20 20 28 27 42 6f 62  "]'),.     ('Bob
1800: 27 2c 27 5b 22 32 30 31 2d 35 35 35 2d 38 38 37  ','["201-555-887
1810: 32 22 5d 27 29 2c 0a 20 20 20 20 20 28 27 43 69  2"]'),.     ('Ci
1820: 6e 64 79 27 2c 27 5b 22 37 30 34 2d 35 35 35 2d  ndy','["704-555-
1830: 39 39 38 33 22 5d 27 29 2c 0a 20 20 20 20 20 28  9983"]'),.     (
1840: 27 44 61 76 65 27 2c 27 5b 22 33 33 36 2d 35 35  'Dave','["336-55
1850: 35 2d 38 34 32 31 22 2c 22 37 30 34 2d 35 35 35  5-8421","704-555
1860: 2d 34 33 32 31 22 2c 22 38 30 33 2d 39 31 31 2d  -4321","803-911-
1870: 34 34 32 31 22 5d 27 29 3b 0a 20 20 53 45 4c 45  4421"]');.  SELE
1880: 43 54 20 44 49 53 54 49 4e 43 54 20 75 73 65 72  CT DISTINCT user
1890: 2e 6e 61 6d 65 0a 20 20 20 20 46 52 4f 4d 20 75  .name.    FROM u
18a0: 73 65 72 2c 20 6a 73 6f 6e 5f 65 61 63 68 28 75  ser, json_each(u
18b0: 73 65 72 2e 70 68 6f 6e 65 29 0a 20 20 20 57 48  ser.phone).   WH
18c0: 45 52 45 20 6a 73 6f 6e 5f 65 61 63 68 2e 76 61  ERE json_each.va
18d0: 6c 75 65 20 4c 49 4b 45 20 27 37 30 34 2d 25 27  lue LIKE '704-%'
18e0: 0a 20 20 20 4f 52 44 45 52 20 42 59 20 31 3b 0a  .   ORDER BY 1;.
18f0: 7d 20 7b 43 69 6e 64 79 20 44 61 76 65 7d 0a 0a  } {Cindy Dave}..
1900: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
1910: 6a 73 6f 6e 31 30 32 2d 31 30 31 30 20 7b 0a 20  json102-1010 {. 
1920: 20 55 50 44 41 54 45 20 75 73 65 72 0a 20 20 20   UPDATE user.   
1930: 20 20 53 45 54 20 70 68 6f 6e 65 3d 6a 73 6f 6e    SET phone=json
1940: 5f 65 78 74 72 61 63 74 28 70 68 6f 6e 65 2c 27  _extract(phone,'
1950: 24 5b 30 5d 27 29 0a 20 20 20 57 48 45 52 45 20  $[0]').   WHERE 
1960: 6a 73 6f 6e 5f 61 72 72 61 79 5f 6c 65 6e 67 74  json_array_lengt
1970: 68 28 70 68 6f 6e 65 29 3c 32 3b 0a 20 20 53 45  h(phone)<2;.  SE
1980: 4c 45 43 54 20 6e 61 6d 65 2c 20 73 75 62 73 74  LECT name, subst
1990: 72 28 70 68 6f 6e 65 2c 31 2c 35 29 20 46 52 4f  r(phone,1,5) FRO
19a0: 4d 20 75 73 65 72 20 4f 52 44 45 52 20 42 59 20  M user ORDER BY 
19b0: 6e 61 6d 65 3b 0a 7d 20 7b 41 6c 69 63 65 20 7b  name;.} {Alice {
19c0: 5b 22 39 31 39 7d 20 42 6f 62 20 32 30 31 2d 35  ["919} Bob 201-5
19d0: 20 43 69 6e 64 79 20 37 30 34 2d 35 20 44 61 76   Cindy 704-5 Dav
19e0: 65 20 7b 5b 22 33 33 36 7d 7d 0a 64 6f 5f 65 78  e {["336}}.do_ex
19f0: 65 63 73 71 6c 5f 74 65 73 74 20 6a 73 6f 6e 31  ecsql_test json1
1a00: 30 32 2d 31 30 31 31 20 7b 0a 20 20 53 45 4c 45  02-1011 {.  SELE
1a10: 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 75 73 65  CT name FROM use
1a20: 72 20 57 48 45 52 45 20 70 68 6f 6e 65 20 4c 49  r WHERE phone LI
1a30: 4b 45 20 27 37 30 34 2d 25 27 0a 20 20 55 4e 49  KE '704-%'.  UNI
1a40: 4f 4e 0a 20 20 53 45 4c 45 43 54 20 75 73 65 72  ON.  SELECT user
1a50: 2e 6e 61 6d 65 0a 20 20 20 20 46 52 4f 4d 20 75  .name.    FROM u
1a60: 73 65 72 2c 20 6a 73 6f 6e 5f 65 61 63 68 28 75  ser, json_each(u
1a70: 73 65 72 2e 70 68 6f 6e 65 29 0a 20 20 20 57 48  ser.phone).   WH
1a80: 45 52 45 20 6a 73 6f 6e 5f 76 61 6c 69 64 28 75  ERE json_valid(u
1a90: 73 65 72 2e 70 68 6f 6e 65 29 0a 20 20 20 20 20  ser.phone).     
1aa0: 41 4e 44 20 6a 73 6f 6e 5f 65 61 63 68 2e 76 61  AND json_each.va
1ab0: 6c 75 65 20 4c 49 4b 45 20 27 37 30 34 2d 25 27  lue LIKE '704-%'
1ac0: 3b 0a 7d 20 7b 43 69 6e 64 79 20 44 61 76 65 7d  ;.} {Cindy Dave}
1ad0: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
1ae0: 74 20 6a 73 6f 6e 31 30 32 2d 31 31 30 30 20 7b  t json102-1100 {
1af0: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
1b00: 62 69 67 28 6a 73 6f 6e 20 4a 53 4f 4e 29 3b 0a  big(json JSON);.
1b10: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 62 69    INSERT INTO bi
1b20: 67 28 6a 73 6f 6e 29 20 56 41 4c 55 45 53 28 27  g(json) VALUES('
1b30: 7b 0a 20 20 20 20 22 69 64 22 3a 31 32 33 2c 0a  {.    "id":123,.
1b40: 20 20 20 20 22 73 74 75 66 66 22 3a 5b 31 2c 32      "stuff":[1,2
1b50: 2c 33 2c 34 5d 2c 0a 20 20 20 20 22 70 61 72 74  ,3,4],.    "part
1b60: 6c 69 73 74 22 3a 5b 0a 20 20 20 20 20 20 20 7b  list":[.       {
1b70: 22 75 75 69 64 22 3a 22 62 62 31 30 38 37 32 32  "uuid":"bb108722
1b80: 2d 35 37 32 65 2d 31 31 65 35 2d 39 33 32 30 2d  -572e-11e5-9320-
1b90: 37 66 33 62 36 33 61 34 63 61 37 34 22 7d 2c 0a  7f3b63a4ca74"},.
1ba0: 20 20 20 20 20 20 20 7b 22 75 75 69 64 22 3a 22         {"uuid":"
1bb0: 63 36 39 30 64 63 31 34 2d 35 37 32 65 2d 31 31  c690dc14-572e-11
1bc0: 65 35 2d 39 35 66 39 2d 64 66 63 38 38 36 31 66  e5-95f9-dfc8861f
1bd0: 64 35 33 35 22 7d 2c 0a 20 20 20 20 20 20 20 7b  d535"},.       {
1be0: 22 73 75 62 61 73 73 65 6d 62 6c 79 22 3a 5b 0a  "subassembly":[.
1bf0: 20 20 20 20 20 20 20 20 20 20 7b 22 75 75 69 64            {"uuid
1c00: 22 3a 22 36 66 61 35 31 38 31 65 2d 35 37 32 31  ":"6fa5181e-5721
1c10: 2d 31 31 65 35 2d 61 30 34 65 2d 35 37 66 33 64  -11e5-a04e-57f3d
1c20: 37 62 33 32 38 30 38 22 7d 0a 20 20 20 20 20 20  7b32808"}.      
1c30: 20 5d 7d 0a 20 20 20 20 5d 0a 20 20 7d 27 29 3b   ]}.    ].  }');
1c40: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 62  .  INSERT INTO b
1c50: 69 67 28 6a 73 6f 6e 29 20 56 41 4c 55 45 53 28  ig(json) VALUES(
1c60: 27 7b 0a 20 20 20 20 22 69 64 22 3a 34 35 36 2c  '{.    "id":456,
1c70: 0a 20 20 20 20 22 73 74 75 66 66 22 3a 5b 22 68  .    "stuff":["h
1c80: 65 6c 6c 6f 22 2c 22 77 6f 72 6c 64 22 2c 22 78  ello","world","x
1c90: 79 7a 7a 79 22 5d 2c 0a 20 20 20 20 22 70 61 72  yzzy"],.    "par
1ca0: 74 6c 69 73 74 22 3a 5b 0a 20 20 20 20 20 20 20  tlist":[.       
1cb0: 7b 22 75 75 69 64 22 3a 66 61 6c 73 65 7d 2c 0a  {"uuid":false},.
1cc0: 20 20 20 20 20 20 20 7b 22 75 75 69 64 22 3a 22         {"uuid":"
1cd0: 63 36 39 30 64 63 31 34 2d 35 37 32 65 2d 31 31  c690dc14-572e-11
1ce0: 65 35 2d 39 35 66 39 2d 64 66 63 38 38 36 31 66  e5-95f9-dfc8861f
1cf0: 64 35 33 35 22 7d 0a 20 20 20 20 5d 0a 20 20 7d  d535"}.    ].  }
1d00: 27 29 3b 0a 7d 20 7b 7d 0a 73 65 74 20 63 6f 72  ');.} {}.set cor
1d10: 72 65 63 74 5f 61 6e 73 77 65 72 20 5b 6c 69 73  rect_answer [lis
1d20: 74 20 5c 0a 20 20 20 20 31 20 7b 24 2e 69 64 7d  t \.    1 {$.id}
1d30: 20 31 32 33 20 5c 0a 20 20 20 20 31 20 7b 24 2e   123 \.    1 {$.
1d40: 73 74 75 66 66 5b 30 5d 7d 20 31 20 5c 0a 20 20  stuff[0]} 1 \.  
1d50: 20 20 31 20 7b 24 2e 73 74 75 66 66 5b 31 5d 7d    1 {$.stuff[1]}
1d60: 20 32 20 5c 0a 20 20 20 20 31 20 7b 24 2e 73 74   2 \.    1 {$.st
1d70: 75 66 66 5b 32 5d 7d 20 33 20 5c 0a 20 20 20 20  uff[2]} 3 \.    
1d80: 31 20 7b 24 2e 73 74 75 66 66 5b 33 5d 7d 20 34  1 {$.stuff[3]} 4
1d90: 20 5c 0a 20 20 20 20 31 20 7b 24 2e 70 61 72 74   \.    1 {$.part
1da0: 6c 69 73 74 5b 30 5d 2e 75 75 69 64 7d 20 62 62  list[0].uuid} bb
1db0: 31 30 38 37 32 32 2d 35 37 32 65 2d 31 31 65 35  108722-572e-11e5
1dc0: 2d 39 33 32 30 2d 37 66 33 62 36 33 61 34 63 61  -9320-7f3b63a4ca
1dd0: 37 34 20 5c 0a 20 20 20 20 31 20 7b 24 2e 70 61  74 \.    1 {$.pa
1de0: 72 74 6c 69 73 74 5b 31 5d 2e 75 75 69 64 7d 20  rtlist[1].uuid} 
1df0: 63 36 39 30 64 63 31 34 2d 35 37 32 65 2d 31 31  c690dc14-572e-11
1e00: 65 35 2d 39 35 66 39 2d 64 66 63 38 38 36 31 66  e5-95f9-dfc8861f
1e10: 64 35 33 35 20 5c 0a 20 20 20 20 31 20 7b 24 2e  d535 \.    1 {$.
1e20: 70 61 72 74 6c 69 73 74 5b 32 5d 2e 73 75 62 61  partlist[2].suba
1e30: 73 73 65 6d 62 6c 79 5b 30 5d 2e 75 75 69 64 7d  ssembly[0].uuid}
1e40: 20 36 66 61 35 31 38 31 65 2d 35 37 32 31 2d 31   6fa5181e-5721-1
1e50: 31 65 35 2d 61 30 34 65 2d 35 37 66 33 64 37 62  1e5-a04e-57f3d7b
1e60: 33 32 38 30 38 20 5c 0a 20 20 20 20 32 20 7b 24  32808 \.    2 {$
1e70: 2e 69 64 7d 20 34 35 36 20 5c 0a 20 20 20 20 32  .id} 456 \.    2
1e80: 20 7b 24 2e 73 74 75 66 66 5b 30 5d 7d 20 68 65   {$.stuff[0]} he
1e90: 6c 6c 6f 20 5c 0a 20 20 20 20 32 20 7b 24 2e 73  llo \.    2 {$.s
1ea0: 74 75 66 66 5b 31 5d 7d 20 77 6f 72 6c 64 20 5c  tuff[1]} world \
1eb0: 0a 20 20 20 20 32 20 7b 24 2e 73 74 75 66 66 5b  .    2 {$.stuff[
1ec0: 32 5d 7d 20 78 79 7a 7a 79 20 5c 0a 20 20 20 20  2]} xyzzy \.    
1ed0: 32 20 7b 24 2e 70 61 72 74 6c 69 73 74 5b 30 5d  2 {$.partlist[0]
1ee0: 2e 75 75 69 64 7d 20 30 20 5c 0a 20 20 20 20 32  .uuid} 0 \.    2
1ef0: 20 7b 24 2e 70 61 72 74 6c 69 73 74 5b 31 5d 2e   {$.partlist[1].
1f00: 75 75 69 64 7d 20 63 36 39 30 64 63 31 34 2d 35  uuid} c690dc14-5
1f10: 37 32 65 2d 31 31 65 35 2d 39 35 66 39 2d 64 66  72e-11e5-95f9-df
1f20: 63 38 38 36 31 66 64 35 33 35 5d 0a 64 6f 5f 65  c8861fd535].do_e
1f30: 78 65 63 73 71 6c 5f 74 65 73 74 20 6a 73 6f 6e  xecsql_test json
1f40: 31 30 32 2d 31 31 31 30 20 7b 0a 20 20 53 45 4c  102-1110 {.  SEL
1f50: 45 43 54 20 62 69 67 2e 72 6f 77 69 64 2c 20 66  ECT big.rowid, f
1f60: 75 6c 6c 6b 65 79 2c 20 76 61 6c 75 65 0a 20 20  ullkey, value.  
1f70: 20 20 46 52 4f 4d 20 62 69 67 2c 20 6a 73 6f 6e    FROM big, json
1f80: 5f 74 72 65 65 28 62 69 67 2e 6a 73 6f 6e 29 0a  _tree(big.json).
1f90: 20 20 20 57 48 45 52 45 20 6a 73 6f 6e 5f 74 72     WHERE json_tr
1fa0: 65 65 2e 74 79 70 65 20 4e 4f 54 20 49 4e 20 28  ee.type NOT IN (
1fb0: 27 6f 62 6a 65 63 74 27 2c 27 61 72 72 61 79 27  'object','array'
1fc0: 29 0a 20 20 20 4f 52 44 45 52 20 42 59 20 2b 62  ).   ORDER BY +b
1fd0: 69 67 2e 72 6f 77 69 64 2c 20 2b 6a 73 6f 6e 5f  ig.rowid, +json_
1fe0: 74 72 65 65 2e 69 64 0a 7d 20 24 63 6f 72 72 65  tree.id.} $corre
1ff0: 63 74 5f 61 6e 73 77 65 72 0a 64 6f 5f 65 78 65  ct_answer.do_exe
2000: 63 73 71 6c 5f 74 65 73 74 20 6a 73 6f 6e 31 30  csql_test json10
2010: 32 2d 31 31 32 30 20 7b 0a 20 20 53 45 4c 45 43  2-1120 {.  SELEC
2020: 54 20 62 69 67 2e 72 6f 77 69 64 2c 20 66 75 6c  T big.rowid, ful
2030: 6c 6b 65 79 2c 20 61 74 6f 6d 0a 20 20 20 20 46  lkey, atom.    F
2040: 52 4f 4d 20 62 69 67 2c 20 6a 73 6f 6e 5f 74 72  ROM big, json_tr
2050: 65 65 28 62 69 67 2e 6a 73 6f 6e 29 0a 20 20 20  ee(big.json).   
2060: 57 48 45 52 45 20 61 74 6f 6d 20 49 53 20 4e 4f  WHERE atom IS NO
2070: 54 20 4e 55 4c 4c 0a 20 20 20 4f 52 44 45 52 20  T NULL.   ORDER 
2080: 42 59 20 2b 62 69 67 2e 72 6f 77 69 64 2c 20 2b  BY +big.rowid, +
2090: 6a 73 6f 6e 5f 74 72 65 65 2e 69 64 0a 7d 20 24  json_tree.id.} $
20a0: 63 6f 72 72 65 63 74 5f 61 6e 73 77 65 72 0a 0a  correct_answer..
20b0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
20c0: 6a 73 6f 6e 31 30 32 2d 31 31 33 30 20 7b 0a 20  json102-1130 {. 
20d0: 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54   SELECT DISTINCT
20e0: 20 6a 73 6f 6e 5f 65 78 74 72 61 63 74 28 62 69   json_extract(bi
20f0: 67 2e 6a 73 6f 6e 2c 27 24 2e 69 64 27 29 0a 20  g.json,'$.id'). 
2100: 20 20 20 46 52 4f 4d 20 62 69 67 2c 20 6a 73 6f     FROM big, jso
2110: 6e 5f 74 72 65 65 28 62 69 67 2e 6a 73 6f 6e 2c  n_tree(big.json,
2120: 27 24 2e 70 61 72 74 6c 69 73 74 27 29 0a 20 20  '$.partlist').  
2130: 20 57 48 45 52 45 20 6a 73 6f 6e 5f 74 72 65 65   WHERE json_tree
2140: 2e 6b 65 79 3d 27 75 75 69 64 27 0a 20 20 20 20  .key='uuid'.    
2150: 20 41 4e 44 20 6a 73 6f 6e 5f 74 72 65 65 2e 76   AND json_tree.v
2160: 61 6c 75 65 3d 27 36 66 61 35 31 38 31 65 2d 35  alue='6fa5181e-5
2170: 37 32 31 2d 31 31 65 35 2d 61 30 34 65 2d 35 37  721-11e5-a04e-57
2180: 66 33 64 37 62 33 32 38 30 38 27 3b 0a 7d 20 7b  f3d7b32808';.} {
2190: 31 32 33 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  123}.do_execsql_
21a0: 74 65 73 74 20 6a 73 6f 6e 31 30 32 2d 31 31 33  test json102-113
21b0: 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 44 49 53  1 {.  SELECT DIS
21c0: 54 49 4e 43 54 20 6a 73 6f 6e 5f 65 78 74 72 61  TINCT json_extra
21d0: 63 74 28 62 69 67 2e 6a 73 6f 6e 2c 27 24 2e 69  ct(big.json,'$.i
21e0: 64 27 29 0a 20 20 20 20 46 52 4f 4d 20 62 69 67  d').    FROM big
21f0: 2c 20 6a 73 6f 6e 5f 74 72 65 65 28 62 69 67 2e  , json_tree(big.
2200: 6a 73 6f 6e 2c 27 24 27 29 0a 20 20 20 57 48 45  json,'$').   WHE
2210: 52 45 20 6a 73 6f 6e 5f 74 72 65 65 2e 6b 65 79  RE json_tree.key
2220: 3d 27 75 75 69 64 27 0a 20 20 20 20 20 41 4e 44  ='uuid'.     AND
2230: 20 6a 73 6f 6e 5f 74 72 65 65 2e 76 61 6c 75 65   json_tree.value
2240: 3d 27 36 66 61 35 31 38 31 65 2d 35 37 32 31 2d  ='6fa5181e-5721-
2250: 31 31 65 35 2d 61 30 34 65 2d 35 37 66 33 64 37  11e5-a04e-57f3d7
2260: 62 33 32 38 30 38 27 3b 0a 7d 20 7b 31 32 33 7d  b32808';.} {123}
2270: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
2280: 20 6a 73 6f 6e 31 30 32 2d 31 31 33 32 20 7b 0a   json102-1132 {.
2290: 20 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43    SELECT DISTINC
22a0: 54 20 6a 73 6f 6e 5f 65 78 74 72 61 63 74 28 62  T json_extract(b
22b0: 69 67 2e 6a 73 6f 6e 2c 27 24 2e 69 64 27 29 0a  ig.json,'$.id').
22c0: 20 20 20 20 46 52 4f 4d 20 62 69 67 2c 20 6a 73      FROM big, js
22d0: 6f 6e 5f 74 72 65 65 28 62 69 67 2e 6a 73 6f 6e  on_tree(big.json
22e0: 29 0a 20 20 20 57 48 45 52 45 20 6a 73 6f 6e 5f  ).   WHERE json_
22f0: 74 72 65 65 2e 6b 65 79 3d 27 75 75 69 64 27 0a  tree.key='uuid'.
2300: 20 20 20 20 20 41 4e 44 20 6a 73 6f 6e 5f 74 72       AND json_tr
2310: 65 65 2e 76 61 6c 75 65 3d 27 36 66 61 35 31 38  ee.value='6fa518
2320: 31 65 2d 35 37 32 31 2d 31 31 65 35 2d 61 30 34  1e-5721-11e5-a04
2330: 65 2d 35 37 66 33 64 37 62 33 32 38 30 38 27 3b  e-57f3d7b32808';
2340: 0a 7d 20 7b 31 32 33 7d 0a 7d 20 3b 23 20 65 6e  .} {123}.} ;# en
2350: 64 20 69 66 63 61 70 61 62 6c 65 20 76 74 61 62  d ifcapable vtab
2360: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
2370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
23b0: 65 73 74 20 74 68 61 74 20 6a 73 6f 6e 5f 76 61  est that json_va
23c0: 6c 69 64 28 29 20 63 6f 72 72 65 63 74 6c 79 20  lid() correctly 
23d0: 69 64 65 6e 74 69 66 69 65 73 20 6e 6f 6e 2d 61  identifies non-a
23e0: 73 63 69 69 20 72 61 6e 67 65 20 0a 23 20 63 68  scii range .# ch
23f0: 61 72 61 63 74 65 72 73 20 61 73 20 6e 6f 6e 2d  aracters as non-
2400: 77 68 69 74 65 73 70 61 63 65 2e 0a 23 0a 64 6f  whitespace..#.do
2410: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 6a 73  _execsql_test js
2420: 6f 6e 31 30 32 2d 31 32 30 31 20 7b 20 53 45 4c  on102-1201 { SEL
2430: 45 43 54 20 6a 73 6f 6e 5f 76 61 6c 69 64 28 63  ECT json_valid(c
2440: 68 61 72 28 33 32 29 20 20 7c 7c 20 27 22 78 79  har(32)  || '"xy
2450: 7a 22 27 29 20 7d 20 31 0a 64 6f 5f 65 78 65 63  z"') } 1.do_exec
2460: 73 71 6c 5f 74 65 73 74 20 6a 73 6f 6e 31 30 32  sql_test json102
2470: 2d 31 32 30 32 20 7b 20 53 45 4c 45 43 54 20 6a  -1202 { SELECT j
2480: 73 6f 6e 5f 76 61 6c 69 64 28 63 68 61 72 28 32  son_valid(char(2
2490: 30 30 29 20 7c 7c 20 27 22 78 79 7a 22 27 29 20  00) || '"xyz"') 
24a0: 7d 20 30 0a 0a 23 20 4f 66 66 2d 62 79 2d 6f 6e  } 0..# Off-by-on
24b0: 65 20 65 72 72 6f 72 20 69 6e 20 6a 73 6f 6e 41  e error in jsonA
24c0: 70 70 65 6e 64 53 74 72 69 6e 67 28 29 0a 23 0a  ppendString().#.
24d0: 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24  for {set i 0} {$
24e0: 69 3c 31 30 30 7d 20 7b 69 6e 63 72 20 69 7d 20  i<100} {incr i} 
24f0: 7b 0a 20 20 73 65 74 20 73 74 72 20 61 62 63 64  {.  set str abcd
2500: 65 66 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74  ef[string repeat
2510: 20 5c 22 20 5b 65 78 70 72 20 7b 24 69 2b 35 30   \" [expr {$i+50
2520: 7d 5d 5d 75 76 77 78 79 7a 0a 20 20 64 6f 5f 74  }]]uvwxyz.  do_t
2530: 65 73 74 20 6a 73 6f 6e 31 30 32 2d 5b 66 6f 72  est json102-[for
2540: 6d 61 74 20 25 64 20 5b 65 78 70 72 20 7b 24 69  mat %d [expr {$i
2550: 2b 31 33 30 30 7d 5d 5d 20 7b 0a 20 20 20 20 64  +1300}]] {.    d
2560: 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 6a  b eval {SELECT j
2570: 73 6f 6e 5f 65 78 74 72 61 63 74 28 6a 73 6f 6e  son_extract(json
2580: 5f 61 72 72 61 79 28 24 3a 3a 73 74 72 29 2c 27  _array($::str),'
2590: 24 5b 30 5d 27 29 3d 3d 24 3a 3a 73 74 72 7d 0a  $[0]')==$::str}.
25a0: 20 20 7d 20 7b 31 7d 0a 7d 0a 0a 23 2d 2d 2d 2d    } {1}.}..#----
25b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
25c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
25d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
25e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
25f0: 2d 2d 2d 2d 2d 0a 23 20 32 30 31 37 2d 30 34 2d  -----.# 2017-04-
2600: 30 38 20 74 69 63 6b 65 74 20 62 39 33 62 65 38  08 ticket b93be8
2610: 37 32 39 61 38 39 35 61 35 32 38 65 32 38 34 39  729a895a528e2849
2620: 66 63 61 39 39 66 37 0a 23 20 4a 53 4f 4e 20 65  fca99f7.# JSON e
2630: 78 74 65 6e 73 69 6f 6e 20 61 63 63 65 70 74 73  xtension accepts
2640: 20 69 6e 76 61 6c 69 64 20 6e 75 6d 65 72 69 63   invalid numeric
2650: 20 76 61 6c 75 65 73 0a 23 0a 23 20 4a 53 4f 4e   values.#.# JSON
2660: 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20   does not allow 
2670: 6c 65 61 64 69 6e 67 20 7a 65 72 6f 73 2e 20 20  leading zeros.  
2680: 42 75 74 20 74 68 65 20 4a 53 4f 4e 20 65 78 74  But the JSON ext
2690: 65 6e 73 69 6f 6e 20 77 61 73 0a 23 20 61 6c 6c  ension was.# all
26a0: 6f 77 69 6e 67 20 74 68 65 6d 2e 20 20 54 68 65  owing them.  The
26b0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73   following tests
26c0: 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
26d0: 20 70 72 6f 62 6c 65 6d 20 69 73 20 6e 6f 77 0a   problem is now.
26e0: 23 20 66 69 78 65 64 2e 0a 23 0a 64 6f 5f 65 78  # fixed..#.do_ex
26f0: 65 63 73 71 6c 5f 74 65 73 74 20 6a 73 6f 6e 31  ecsql_test json1
2700: 30 32 2d 31 34 30 31 20 7b 20 53 45 4c 45 43 54  02-1401 { SELECT
2710: 20 6a 73 6f 6e 5f 76 61 6c 69 64 28 27 7b 22 78   json_valid('{"x
2720: 22 3a 30 31 7d 27 29 20 7d 20 30 0a 64 6f 5f 65  ":01}') } 0.do_e
2730: 78 65 63 73 71 6c 5f 74 65 73 74 20 6a 73 6f 6e  xecsql_test json
2740: 31 30 32 2d 31 34 30 32 20 7b 20 53 45 4c 45 43  102-1402 { SELEC
2750: 54 20 6a 73 6f 6e 5f 76 61 6c 69 64 28 27 7b 22  T json_valid('{"
2760: 78 22 3a 2d 30 31 7d 27 29 20 7d 20 30 0a 64 6f  x":-01}') } 0.do
2770: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 6a 73  _execsql_test js
2780: 6f 6e 31 30 32 2d 31 34 30 33 20 7b 20 53 45 4c  on102-1403 { SEL
2790: 45 43 54 20 6a 73 6f 6e 5f 76 61 6c 69 64 28 27  ECT json_valid('
27a0: 7b 22 78 22 3a 30 7d 27 29 20 7d 20 31 0a 64 6f  {"x":0}') } 1.do
27b0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 6a 73  _execsql_test js
27c0: 6f 6e 31 30 32 2d 31 34 30 34 20 7b 20 53 45 4c  on102-1404 { SEL
27d0: 45 43 54 20 6a 73 6f 6e 5f 76 61 6c 69 64 28 27  ECT json_valid('
27e0: 7b 22 78 22 3a 2d 30 7d 27 29 20 7d 20 31 0a 64  {"x":-0}') } 1.d
27f0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 6a  o_execsql_test j
2800: 73 6f 6e 31 30 32 2d 31 34 30 35 20 7b 20 53 45  son102-1405 { SE
2810: 4c 45 43 54 20 6a 73 6f 6e 5f 76 61 6c 69 64 28  LECT json_valid(
2820: 27 7b 22 78 22 3a 30 2e 31 7d 27 29 20 7d 20 31  '{"x":0.1}') } 1
2830: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
2840: 20 6a 73 6f 6e 31 30 32 2d 31 34 30 36 20 7b 20   json102-1406 { 
2850: 53 45 4c 45 43 54 20 6a 73 6f 6e 5f 76 61 6c 69  SELECT json_vali
2860: 64 28 27 7b 22 78 22 3a 2d 30 2e 31 7d 27 29 20  d('{"x":-0.1}') 
2870: 7d 20 31 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  } 1.do_execsql_t
2880: 65 73 74 20 6a 73 6f 6e 31 30 32 2d 31 34 30 37  est json102-1407
2890: 20 7b 20 53 45 4c 45 43 54 20 6a 73 6f 6e 5f 76   { SELECT json_v
28a0: 61 6c 69 64 28 27 7b 22 78 22 3a 30 2e 30 30 30  alid('{"x":0.000
28b0: 30 7d 27 29 20 7d 20 31 0a 64 6f 5f 65 78 65 63  0}') } 1.do_exec
28c0: 73 71 6c 5f 74 65 73 74 20 6a 73 6f 6e 31 30 32  sql_test json102
28d0: 2d 31 34 30 38 20 7b 20 53 45 4c 45 43 54 20 6a  -1408 { SELECT j
28e0: 73 6f 6e 5f 76 61 6c 69 64 28 27 7b 22 78 22 3a  son_valid('{"x":
28f0: 2d 30 2e 30 30 30 30 7d 27 29 20 7d 20 31 0a 64  -0.0000}') } 1.d
2900: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 6a  o_execsql_test j
2910: 73 6f 6e 31 30 32 2d 31 34 30 39 20 7b 20 53 45  son102-1409 { SE
2920: 4c 45 43 54 20 6a 73 6f 6e 5f 76 61 6c 69 64 28  LECT json_valid(
2930: 27 7b 22 78 22 3a 30 31 2e 35 7d 27 29 20 7d 20  '{"x":01.5}') } 
2940: 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  0.do_execsql_tes
2950: 74 20 6a 73 6f 6e 31 30 32 2d 31 34 31 30 20 7b  t json102-1410 {
2960: 20 53 45 4c 45 43 54 20 6a 73 6f 6e 5f 76 61 6c   SELECT json_val
2970: 69 64 28 27 7b 22 78 22 3a 2d 30 31 2e 35 7d 27  id('{"x":-01.5}'
2980: 29 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71 6c  ) } 0.do_execsql
2990: 5f 74 65 73 74 20 6a 73 6f 6e 31 30 32 2d 31 34  _test json102-14
29a0: 31 31 20 7b 20 53 45 4c 45 43 54 20 6a 73 6f 6e  11 { SELECT json
29b0: 5f 76 61 6c 69 64 28 27 7b 22 78 22 3a 30 30 7d  _valid('{"x":00}
29c0: 27 29 20 7d 20 30 0a 64 6f 5f 65 78 65 63 73 71  ') } 0.do_execsq
29d0: 6c 5f 74 65 73 74 20 6a 73 6f 6e 31 30 32 2d 31  l_test json102-1
29e0: 34 31 32 20 7b 20 53 45 4c 45 43 54 20 6a 73 6f  412 { SELECT jso
29f0: 6e 5f 76 61 6c 69 64 28 27 7b 22 78 22 3a 2d 30  n_valid('{"x":-0
2a00: 30 7d 27 29 20 7d 20 30 0a 0a 23 2d 2d 2d 2d 2d  0}') } 0..#-----
2a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a50: 2d 2d 2d 0a 23 20 32 30 31 37 2d 30 34 2d 31 30  ---.# 2017-04-10
2a60: 20 74 69 63 6b 65 74 20 36 63 39 62 35 35 31 34   ticket 6c9b5514
2a70: 30 37 37 66 65 64 33 34 35 35 31 66 39 38 65 36  077fed34551f98e6
2a80: 34 63 30 39 61 31 30 64 63 32 66 63 38 65 31 36  4c09a10dc2fc8e16
2a90: 0a 23 20 4a 53 4f 4e 20 65 78 74 65 6e 73 69 6f  .# JSON extensio
2aa0: 6e 20 61 63 63 65 70 74 73 20 73 74 72 69 6e 67  n accepts string
2ab0: 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6e  s containing con
2ac0: 74 72 6f 6c 20 63 68 61 72 61 63 74 65 72 73 2e  trol characters.
2ad0: 0a 23 0a 23 20 54 68 65 20 4a 53 4f 4e 20 73 70  .#.# The JSON sp
2ae0: 65 63 20 72 65 71 75 69 72 65 73 20 74 68 61 74  ec requires that
2af0: 20 61 6c 6c 20 63 6f 6e 74 72 6f 6c 20 63 68 61   all control cha
2b00: 72 61 63 74 65 72 73 20 62 65 20 65 73 63 61 70  racters be escap
2b10: 65 64 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c  ed..#.do_execsql
2b20: 5f 74 65 73 74 20 6a 73 6f 6e 31 30 32 2d 31 35  _test json102-15
2b30: 30 30 20 7b 0a 20 20 57 49 54 48 20 52 45 43 55  00 {.  WITH RECU
2b40: 52 53 49 56 45 20 63 28 78 29 20 41 53 20 28 56  RSIVE c(x) AS (V
2b50: 41 4c 55 45 53 28 31 29 20 55 4e 49 4f 4e 20 41  ALUES(1) UNION A
2b60: 4c 4c 20 53 45 4c 45 43 54 20 78 2b 31 20 46 52  LL SELECT x+1 FR
2b70: 4f 4d 20 63 20 57 48 45 52 45 20 78 3c 30 78 32  OM c WHERE x<0x2
2b80: 30 29 0a 20 20 53 45 4c 45 43 54 20 78 20 46 52  0).  SELECT x FR
2b90: 4f 4d 20 63 20 57 48 45 52 45 20 6a 73 6f 6e 5f  OM c WHERE json_
2ba0: 76 61 6c 69 64 28 70 72 69 6e 74 66 28 27 7b 22  valid(printf('{"
2bb0: 61 22 3a 22 78 25 73 7a 22 7d 27 2c 20 63 68 61  a":"x%sz"}', cha
2bc0: 72 28 78 29 29 29 20 4f 52 44 45 52 20 42 59 20  r(x))) ORDER BY 
2bd0: 78 3b 0a 7d 20 7b 33 32 7d 0a 0a 66 69 6e 69 73  x;.} {32}..finis
2be0: 68 5f 74 65 73 74 0a                             h_test.