/ Hex Artifact Content
Login

Artifact f0178422b3a2418f423fd0d3caf3571c8d1b9863:


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 0a 73 65 74   library..#..set
01c0: 20 74 65 73 74 64 69 72 20 5b 66 69 6c 65 20 64   testdir [file d
01d0: 69 72 6e 61 6d 65 20 24 61 72 67 76 30 5d 0a 73  irname $argv0].s
01e0: 6f 75 72 63 65 20 24 74 65 73 74 64 69 72 2f 74  ource $testdir/t
01f0: 65 73 74 65 72 2e 74 63 6c 0a 0a 69 66 63 61 70  ester.tcl..ifcap
0200: 61 62 6c 65 20 21 6a 73 6f 6e 31 20 7b 0a 20 20  able !json1 {.  
0210: 66 69 6e 69 73 68 5f 74 65 73 74 0a 20 20 72 65  finish_test.  re
0220: 74 75 72 6e 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73  turn.}..do_execs
0230: 71 6c 5f 74 65 73 74 20 6a 73 6f 6e 31 30 31 2d  ql_test json101-
0240: 31 2e 31 2e 30 30 20 7b 0a 20 20 53 45 4c 45 43  1.1.00 {.  SELEC
0250: 54 20 6a 73 6f 6e 5f 61 72 72 61 79 28 31 2c 32  T json_array(1,2
0260: 2e 35 2c 6e 75 6c 6c 2c 27 68 65 6c 6c 6f 27 29  .5,null,'hello')
0270: 3b 0a 7d 20 7b 5b 31 2c 32 2e 35 2c 6e 75 6c 6c  ;.} {[1,2.5,null
0280: 2c 22 68 65 6c 6c 6f 22 5d 7d 0a 64 6f 5f 65 78  ,"hello"]}.do_ex
0290: 65 63 73 71 6c 5f 74 65 73 74 20 6a 73 6f 6e 31  ecsql_test json1
02a0: 30 31 2d 31 2e 31 2e 30 31 20 7b 0a 20 20 53 45  01-1.1.01 {.  SE
02b0: 4c 45 43 54 20 6a 73 6f 6e 5f 61 72 72 61 79 28  LECT json_array(
02c0: 31 2c 27 7b 22 61 62 63 22 3a 32 2e 35 2c 22 64  1,'{"abc":2.5,"d
02d0: 65 66 22 3a 6e 75 6c 6c 2c 22 67 68 69 22 3a 68  ef":null,"ghi":h
02e0: 65 6c 6c 6f 7d 27 2c 39 39 29 3b 0a 20 20 2d 2d  ello}',99);.  --
02f0: 20 74 68 65 20 73 65 63 6f 6e 64 20 74 65 72 6d   the second term
0300: 20 67 6f 65 73 20 69 6e 20 61 73 20 61 20 73 74   goes in as a st
0310: 72 69 6e 67 3a 0a 7d 20 7b 5b 31 2c 22 7b 5c 5c  ring:.} {[1,"{\\
0320: 22 61 62 63 5c 5c 22 3a 32 2e 35 2c 5c 5c 22 64  "abc\\":2.5,\\"d
0330: 65 66 5c 5c 22 3a 6e 75 6c 6c 2c 5c 5c 22 67 68  ef\\":null,\\"gh
0340: 69 5c 5c 22 3a 68 65 6c 6c 6f 7d 22 2c 39 39 5d  i\\":hello}",99]
0350: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
0360: 74 20 6a 73 6f 6e 31 30 31 2d 31 2e 31 2e 30 32  t json101-1.1.02
0370: 20 7b 0a 20 20 53 45 4c 45 43 54 20 6a 73 6f 6e   {.  SELECT json
0380: 5f 61 72 72 61 79 28 31 2c 6a 73 6f 6e 28 27 7b  _array(1,json('{
0390: 22 61 62 63 22 3a 32 2e 35 2c 22 64 65 66 22 3a  "abc":2.5,"def":
03a0: 6e 75 6c 6c 2c 22 67 68 69 22 3a 22 68 65 6c 6c  null,"ghi":"hell
03b0: 6f 22 7d 27 29 2c 39 39 29 3b 0a 20 20 2d 2d 20  o"}'),99);.  -- 
03c0: 74 68 65 20 73 65 63 6f 6e 64 20 74 65 72 6d 20  the second term 
03d0: 67 6f 65 73 20 69 6e 20 61 73 20 4a 53 4f 4e 0a  goes in as JSON.
03e0: 7d 20 7b 5b 31 2c 7b 22 61 62 63 22 3a 32 2e 35  } {[1,{"abc":2.5
03f0: 2c 22 64 65 66 22 3a 6e 75 6c 6c 2c 22 67 68 69  ,"def":null,"ghi
0400: 22 3a 22 68 65 6c 6c 6f 22 7d 2c 39 39 5d 7d 0a  ":"hello"},99]}.
0410: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
0420: 6a 73 6f 6e 31 30 31 2d 31 2e 31 2e 30 33 20 7b  json101-1.1.03 {
0430: 0a 20 20 53 45 4c 45 43 54 20 6a 73 6f 6e 5f 61  .  SELECT json_a
0440: 72 72 61 79 28 31 2c 6a 73 6f 6e 5f 6f 62 6a 65  rray(1,json_obje
0450: 63 74 28 27 61 62 63 27 2c 32 2e 35 2c 27 64 65  ct('abc',2.5,'de
0460: 66 27 2c 6e 75 6c 6c 2c 27 67 68 69 27 2c 27 68  f',null,'ghi','h
0470: 65 6c 6c 6f 27 29 2c 39 39 29 3b 0a 20 20 2d 2d  ello'),99);.  --
0480: 20 74 68 65 20 73 65 63 6f 6e 64 20 74 65 72 6d   the second term
0490: 20 67 6f 65 73 20 69 6e 20 61 73 20 4a 53 4f 4e   goes in as JSON
04a0: 0a 7d 20 7b 5b 31 2c 7b 22 61 62 63 22 3a 32 2e  .} {[1,{"abc":2.
04b0: 35 2c 22 64 65 66 22 3a 6e 75 6c 6c 2c 22 67 68  5,"def":null,"gh
04c0: 69 22 3a 22 68 65 6c 6c 6f 22 7d 2c 39 39 5d 7d  i":"hello"},99]}
04d0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
04e0: 20 6a 73 6f 6e 31 30 31 2d 31 2e 32 20 7b 0a 20   json101-1.2 {. 
04f0: 20 53 45 4c 45 43 54 20 68 65 78 28 6a 73 6f 6e   SELECT hex(json
0500: 5f 61 72 72 61 79 28 27 53 74 72 69 6e 67 20 22  _array('String "
0510: 5c 20 54 65 73 74 27 29 29 3b 0a 7d 20 7b 35 42  \ Test'));.} {5B
0520: 32 32 35 33 37 34 37 32 36 39 36 45 36 37 32 30  22537472696E6720
0530: 35 43 32 32 35 43 35 43 32 30 35 34 36 35 37 33  5C225C5C20546573
0540: 37 34 32 32 35 44 7d 0a 64 6f 5f 63 61 74 63 68  74225D}.do_catch
0550: 73 71 6c 5f 74 65 73 74 20 6a 73 6f 6e 31 30 31  sql_test json101
0560: 2d 31 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54 20  -1.3 {.  SELECT 
0570: 6a 73 6f 6e 5f 61 72 72 61 79 28 31 2c 70 72 69  json_array(1,pri
0580: 6e 74 66 28 27 25 2e 31 30 30 30 63 27 2c 27 78  ntf('%.1000c','x
0590: 27 29 2c 78 27 61 62 63 64 27 2c 33 29 3b 0a 7d  '),x'abcd',3);.}
05a0: 20 7b 31 20 7b 4a 53 4f 4e 20 63 61 6e 6e 6f 74   {1 {JSON cannot
05b0: 20 68 6f 6c 64 20 42 4c 4f 42 20 76 61 6c 75 65   hold BLOB value
05c0: 73 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  s}}.do_execsql_t
05d0: 65 73 74 20 6a 73 6f 6e 31 30 31 2d 31 2e 34 20  est json101-1.4 
05e0: 7b 0a 20 20 53 45 4c 45 43 54 20 6a 73 6f 6e 5f  {.  SELECT json_
05f0: 61 72 72 61 79 28 2d 39 32 32 33 33 37 32 30 33  array(-922337203
0600: 36 38 35 34 37 37 35 38 30 38 2c 39 32 32 33 33  6854775808,92233
0610: 37 32 30 33 36 38 35 34 37 37 35 38 30 37 2c 30  72036854775807,0
0620: 2c 31 2c 2d 31 2c 0a 20 20 20 20 20 20 20 20 20  ,1,-1,.         
0630: 20 20 20 20 20 20 20 20 20 20 20 30 2e 30 2c 20             0.0, 
0640: 31 2e 30 2c 20 2d 31 2e 30 2c 20 2d 31 65 39 39  1.0, -1.0, -1e99
0650: 2c 20 2b 32 65 31 30 30 2c 0a 20 20 20 20 20 20  , +2e100,.      
0660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 27 6f                'o
0670: 6e 65 27 2c 27 74 77 6f 27 2c 27 74 68 72 65 65  ne','two','three
0680: 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ',.             
0690: 20 20 20 20 20 20 20 34 2c 20 35 2c 20 36 2c 20         4, 5, 6, 
06a0: 37 2c 20 38 2c 20 39 2c 20 31 30 2c 20 31 31 2c  7, 8, 9, 10, 11,
06b0: 20 31 32 2c 20 31 33 2c 20 31 34 2c 20 31 35 2c   12, 13, 14, 15,
06c0: 20 31 36 2c 20 31 37 2c 20 31 38 2c 0a 20 20 20   16, 17, 18,.   
06d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06e0: 20 31 39 2c 20 4e 55 4c 4c 2c 20 32 31 2c 20 32   19, NULL, 21, 2
06f0: 32 2c 20 32 33 2c 20 32 34 2c 20 32 35 2c 20 32  2, 23, 24, 25, 2
0700: 36 2c 20 32 37 2c 20 32 38 2c 20 32 39 2c 20 33  6, 27, 28, 29, 3
0710: 30 2c 20 33 31 2c 0a 20 20 20 20 20 20 20 20 20  0, 31,.         
0720: 20 20 20 20 20 20 20 20 20 20 20 27 61 62 63 64             'abcd
0730: 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74  efghijklmnopqrst
0740: 75 76 77 79 78 7a 41 42 43 44 45 46 47 48 49 4a  uvwyxzABCDEFGHIJ
0750: 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a  KLMNOPQRSTUVWXYZ
0760: 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ',.             
0770: 20 20 20 20 20 20 20 27 61 62 63 64 65 66 67 68         'abcdefgh
0780: 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 79  ijklmnopqrstuvwy
0790: 78 7a 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e  xzABCDEFGHIJKLMN
07a0: 4f 50 51 52 53 54 55 56 57 58 59 5a 27 2c 0a 20  OPQRSTUVWXYZ',. 
07b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07c0: 20 20 20 27 61 62 63 64 65 66 67 68 69 6a 6b 6c     'abcdefghijkl
07d0: 6d 6e 6f 70 71 72 73 74 75 76 77 79 78 7a 41 42  mnopqrstuvwyxzAB
07e0: 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52  CDEFGHIJKLMNOPQR
07f0: 53 54 55 56 57 58 59 5a 27 2c 0a 20 20 20 20 20  STUVWXYZ',.     
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 39                 9
0810: 39 29 3b 0a 7d 20 7b 5b 2d 39 32 32 33 33 37 32  9);.} {[-9223372
0820: 30 33 36 38 35 34 37 37 35 38 30 38 2c 39 32 32  036854775808,922
0830: 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30 37  3372036854775807
0840: 2c 30 2c 31 2c 2d 31 2c 30 2e 30 2c 31 2e 30 2c  ,0,1,-1,0.0,1.0,
0850: 2d 31 2e 30 2c 2d 31 2e 30 65 2b 39 39 2c 32 2e  -1.0,-1.0e+99,2.
0860: 30 65 2b 31 30 30 2c 22 6f 6e 65 22 2c 22 74 77  0e+100,"one","tw
0870: 6f 22 2c 22 74 68 72 65 65 22 2c 34 2c 35 2c 36  o","three",4,5,6
0880: 2c 37 2c 38 2c 39 2c 31 30 2c 31 31 2c 31 32 2c  ,7,8,9,10,11,12,
0890: 31 33 2c 31 34 2c 31 35 2c 31 36 2c 31 37 2c 31  13,14,15,16,17,1
08a0: 38 2c 31 39 2c 6e 75 6c 6c 2c 32 31 2c 32 32 2c  8,19,null,21,22,
08b0: 32 33 2c 32 34 2c 32 35 2c 32 36 2c 32 37 2c 32  23,24,25,26,27,2
08c0: 38 2c 32 39 2c 33 30 2c 33 31 2c 22 61 62 63 64  8,29,30,31,"abcd
08d0: 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74  efghijklmnopqrst
08e0: 75 76 77 79 78 7a 41 42 43 44 45 46 47 48 49 4a  uvwyxzABCDEFGHIJ
08f0: 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a  KLMNOPQRSTUVWXYZ
0900: 22 2c 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d  ","abcdefghijklm
0910: 6e 6f 70 71 72 73 74 75 76 77 79 78 7a 41 42 43  nopqrstuvwyxzABC
0920: 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53  DEFGHIJKLMNOPQRS
0930: 54 55 56 57 58 59 5a 22 2c 22 61 62 63 64 65 66  TUVWXYZ","abcdef
0940: 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76  ghijklmnopqrstuv
0950: 77 79 78 7a 41 42 43 44 45 46 47 48 49 4a 4b 4c  wyxzABCDEFGHIJKL
0960: 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22 2c  MNOPQRSTUVWXYZ",
0970: 39 39 5d 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c  99]}..do_execsql
0980: 5f 74 65 73 74 20 6a 73 6f 6e 31 30 31 2d 32 2e  _test json101-2.
0990: 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 6a 73 6f  1 {.  SELECT jso
09a0: 6e 5f 6f 62 6a 65 63 74 28 27 61 27 2c 31 2c 27  n_object('a',1,'
09b0: 62 27 2c 32 2e 35 2c 27 63 27 2c 6e 75 6c 6c 2c  b',2.5,'c',null,
09c0: 27 64 27 2c 27 53 74 72 69 6e 67 20 54 65 73 74  'd','String Test
09d0: 27 29 3b 0a 7d 20 7b 7b 7b 22 61 22 3a 31 2c 22  ');.} {{{"a":1,"
09e0: 62 22 3a 32 2e 35 2c 22 63 22 3a 6e 75 6c 6c 2c  b":2.5,"c":null,
09f0: 22 64 22 3a 22 53 74 72 69 6e 67 20 54 65 73 74  "d":"String Test
0a00: 22 7d 7d 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c  "}}}.do_catchsql
0a10: 5f 74 65 73 74 20 6a 73 6f 6e 31 30 31 2d 32 2e  _test json101-2.
0a20: 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 6a 73 6f  2 {.  SELECT jso
0a30: 6e 5f 6f 62 6a 65 63 74 28 27 61 27 2c 70 72 69  n_object('a',pri
0a40: 6e 74 66 28 27 25 2e 31 30 30 30 63 27 2c 27 78  ntf('%.1000c','x
0a50: 27 29 2c 32 2c 32 2e 35 29 3b 0a 7d 20 7b 31 20  '),2,2.5);.} {1 
0a60: 7b 6a 73 6f 6e 5f 6f 62 6a 65 63 74 28 29 20 6c  {json_object() l
0a70: 61 62 65 6c 73 20 6d 75 73 74 20 62 65 20 54 45  abels must be TE
0a80: 58 54 7d 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c  XT}}.do_catchsql
0a90: 5f 74 65 73 74 20 6a 73 6f 6e 31 30 31 2d 32 2e  _test json101-2.
0aa0: 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 6a 73 6f  3 {.  SELECT jso
0ab0: 6e 5f 6f 62 6a 65 63 74 28 27 61 27 2c 31 2c 27  n_object('a',1,'
0ac0: 62 27 29 3b 0a 7d 20 7b 31 20 7b 6a 73 6f 6e 5f  b');.} {1 {json_
0ad0: 6f 62 6a 65 63 74 28 29 20 72 65 71 75 69 72 65  object() require
0ae0: 73 20 61 6e 20 65 76 65 6e 20 6e 75 6d 62 65 72  s an even number
0af0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 7d 7d 0a   of arguments}}.
0b00: 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74  do_catchsql_test
0b10: 20 6a 73 6f 6e 31 30 31 2d 32 2e 34 20 7b 0a 20   json101-2.4 {. 
0b20: 20 53 45 4c 45 43 54 20 6a 73 6f 6e 5f 6f 62 6a   SELECT json_obj
0b30: 65 63 74 28 27 61 27 2c 70 72 69 6e 74 66 28 27  ect('a',printf('
0b40: 25 2e 31 30 30 30 63 27 2c 27 78 27 29 2c 27 62  %.1000c','x'),'b
0b50: 27 2c 78 27 61 62 63 64 27 29 3b 0a 7d 20 7b 31  ',x'abcd');.} {1
0b60: 20 7b 4a 53 4f 4e 20 63 61 6e 6e 6f 74 20 68 6f   {JSON cannot ho
0b70: 6c 64 20 42 4c 4f 42 20 76 61 6c 75 65 73 7d 7d  ld BLOB values}}
0b80: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
0b90: 74 20 6a 73 6f 6e 31 30 31 2d 33 2e 31 20 7b 0a  t json101-3.1 {.
0ba0: 20 20 53 45 4c 45 43 54 20 6a 73 6f 6e 5f 72 65    SELECT json_re
0bb0: 70 6c 61 63 65 28 27 7b 22 61 22 3a 31 2c 22 62  place('{"a":1,"b
0bc0: 22 3a 32 7d 27 2c 27 24 2e 61 27 2c 27 5b 33 2c  ":2}','$.a','[3,
0bd0: 34 2c 35 5d 27 29 3b 0a 7d 20 7b 7b 7b 22 61 22  4,5]');.} {{{"a"
0be0: 3a 22 5b 33 2c 34 2c 35 5d 22 2c 22 62 22 3a 32  :"[3,4,5]","b":2
0bf0: 7d 7d 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  }}}.do_execsql_t
0c00: 65 73 74 20 6a 73 6f 6e 31 30 31 2d 33 2e 32 20  est json101-3.2 
0c10: 7b 0a 20 20 53 45 4c 45 43 54 20 6a 73 6f 6e 5f  {.  SELECT json_
0c20: 72 65 70 6c 61 63 65 28 27 7b 22 61 22 3a 31 2c  replace('{"a":1,
0c30: 22 62 22 3a 32 7d 27 2c 27 24 2e 61 27 2c 6a 73  "b":2}','$.a',js
0c40: 6f 6e 28 27 5b 33 2c 34 2c 35 5d 27 29 29 3b 0a  on('[3,4,5]'));.
0c50: 7d 20 7b 7b 7b 22 61 22 3a 5b 33 2c 34 2c 35 5d  } {{{"a":[3,4,5]
0c60: 2c 22 62 22 3a 32 7d 7d 7d 0a 64 6f 5f 65 78 65  ,"b":2}}}.do_exe
0c70: 63 73 71 6c 5f 74 65 73 74 20 6a 73 6f 6e 31 30  csql_test json10
0c80: 31 2d 33 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54  1-3.3 {.  SELECT
0c90: 20 6a 73 6f 6e 5f 74 79 70 65 28 6a 73 6f 6e 5f   json_type(json_
0ca0: 73 65 74 28 27 7b 22 61 22 3a 31 2c 22 62 22 3a  set('{"a":1,"b":
0cb0: 32 7d 27 2c 27 24 2e 62 27 2c 27 7b 22 78 22 3a  2}','$.b','{"x":
0cc0: 33 2c 22 79 22 3a 34 7d 27 29 2c 27 24 2e 62 27  3,"y":4}'),'$.b'
0cd0: 29 3b 0a 7d 20 7b 74 65 78 74 7d 0a 64 6f 5f 65  );.} {text}.do_e
0ce0: 78 65 63 73 71 6c 5f 74 65 73 74 20 6a 73 6f 6e  xecsql_test json
0cf0: 31 30 31 2d 33 2e 34 20 7b 0a 20 20 53 45 4c 45  101-3.4 {.  SELE
0d00: 43 54 20 6a 73 6f 6e 5f 74 79 70 65 28 6a 73 6f  CT json_type(jso
0d10: 6e 5f 73 65 74 28 27 7b 22 61 22 3a 31 2c 22 62  n_set('{"a":1,"b
0d20: 22 3a 32 7d 27 2c 27 24 2e 62 27 2c 6a 73 6f 6e  ":2}','$.b',json
0d30: 28 27 7b 22 78 22 3a 33 2c 22 79 22 3a 34 7d 27  ('{"x":3,"y":4}'
0d40: 29 29 2c 27 24 2e 62 27 29 3b 0a 7d 20 7b 6f 62  )),'$.b');.} {ob
0d50: 6a 65 63 74 7d 0a 69 66 63 61 70 61 62 6c 65 20  ject}.ifcapable 
0d60: 76 74 61 62 20 7b 0a 64 6f 5f 65 78 65 63 73 71  vtab {.do_execsq
0d70: 6c 5f 74 65 73 74 20 6a 73 6f 6e 31 30 31 2d 33  l_test json101-3
0d80: 2e 35 20 7b 0a 20 20 53 45 4c 45 43 54 20 66 75  .5 {.  SELECT fu
0d90: 6c 6c 6b 65 79 2c 20 61 74 6f 6d 2c 20 27 7c 27  llkey, atom, '|'
0da0: 20 46 52 4f 4d 20 6a 73 6f 6e 5f 74 72 65 65 28   FROM json_tree(
0db0: 6a 73 6f 6e 5f 73 65 74 28 27 7b 7d 27 2c 27 24  json_set('{}','$
0dc0: 2e 78 27 2c 31 32 33 2c 27 24 2e 78 27 2c 34 35  .x',123,'$.x',45
0dd0: 36 29 29 3b 0a 7d 20 7b 7b 24 7d 20 7b 7d 20 7c  6));.} {{$} {} |
0de0: 20 7b 24 2e 78 7d 20 34 35 36 20 7c 7d 0a 7d 0a   {$.x} 456 |}.}.
0df0: 0a 23 20 50 65 72 20 72 66 63 37 31 35 39 2c 20  .# Per rfc7159, 
0e00: 61 6e 79 20 4a 53 4f 4e 20 76 61 6c 75 65 20 69  any JSON value i
0e10: 73 20 61 6c 6c 6f 77 65 64 20 61 74 20 74 68 65  s allowed at the
0e20: 20 74 6f 70 20 6c 65 76 65 6c 2c 20 61 6e 64 20   top level, and 
0e30: 77 68 69 74 65 73 70 61 63 65 0a 23 20 69 73 20  whitespace.# is 
0e40: 70 65 72 6d 69 74 74 69 6e 67 20 62 65 66 6f 72  permitting befor
0e50: 65 20 61 6e 64 2f 6f 72 20 61 66 74 65 72 20 74  e and/or after t
0e60: 68 61 74 20 76 61 6c 75 65 2e 0a 23 0a 64 6f 5f  hat value..#.do_
0e70: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 6a 73 6f  execsql_test jso
0e80: 6e 31 30 31 2d 34 2e 31 20 7b 0a 20 20 43 52 45  n101-4.1 {.  CRE
0e90: 41 54 45 20 54 41 42 4c 45 20 6a 31 28 78 29 3b  ATE TABLE j1(x);
0ea0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6a  .  INSERT INTO j
0eb0: 31 28 78 29 0a 20 20 20 56 41 4c 55 45 53 28 27  1(x).   VALUES('
0ec0: 74 72 75 65 27 29 2c 28 27 66 61 6c 73 65 27 29  true'),('false')
0ed0: 2c 28 27 6e 75 6c 6c 27 29 2c 28 27 31 32 33 27  ,('null'),('123'
0ee0: 29 2c 28 27 2d 32 33 34 27 29 2c 28 27 33 34 2e  ),('-234'),('34.
0ef0: 35 65 2b 36 27 29 2c 0a 20 20 20 20 20 20 20 20  5e+6'),.        
0f00: 20 28 27 22 22 27 29 2c 28 27 22 5c 22 22 27 29   ('""'),('"\""')
0f10: 2c 28 27 22 5c 5c 22 27 29 2c 28 27 22 61 62 63  ,('"\\"'),('"abc
0f20: 64 65 66 67 68 69 6a 6c 6d 6e 6f 70 71 72 73 74  defghijlmnopqrst
0f30: 75 76 77 78 79 7a 22 27 29 2c 0a 20 20 20 20 20  uvwxyz"'),.     
0f40: 20 20 20 20 28 27 5b 5d 27 29 2c 28 27 7b 7d 27      ('[]'),('{}'
0f50: 29 2c 28 27 5b 74 72 75 65 2c 66 61 6c 73 65 2c  ),('[true,false,
0f60: 6e 75 6c 6c 2c 31 32 33 2c 2d 32 33 34 2c 33 34  null,123,-234,34
0f70: 2e 35 65 2b 36 2c 7b 7d 2c 5b 5d 5d 27 29 2c 0a  .5e+6,{},[]]'),.
0f80: 20 20 20 20 20 20 20 20 20 28 27 7b 22 61 22 3a           ('{"a":
0f90: 74 72 75 65 2c 22 62 22 3a 7b 22 63 22 3a 66 61  true,"b":{"c":fa
0fa0: 6c 73 65 7d 7d 27 29 3b 0a 20 20 53 45 4c 45 43  lse}}');.  SELEC
0fb0: 54 20 2a 20 46 52 4f 4d 20 6a 31 20 57 48 45 52  T * FROM j1 WHER
0fc0: 45 20 4e 4f 54 20 6a 73 6f 6e 5f 76 61 6c 69 64  E NOT json_valid
0fd0: 28 78 29 3b 0a 7d 20 7b 7d 0a 64 6f 5f 65 78 65  (x);.} {}.do_exe
0fe0: 63 73 71 6c 5f 74 65 73 74 20 6a 73 6f 6e 31 30  csql_test json10
0ff0: 31 2d 34 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54  1-4.2 {.  SELECT
1000: 20 2a 20 46 52 4f 4d 20 6a 31 20 57 48 45 52 45   * FROM j1 WHERE
1010: 20 4e 4f 54 20 6a 73 6f 6e 5f 76 61 6c 69 64 28   NOT json_valid(
1020: 63 68 61 72 28 30 78 32 30 2c 30 78 30 39 2c 30  char(0x20,0x09,0
1030: 78 30 61 2c 30 78 30 64 29 7c 7c 78 29 3b 0a 7d  x0a,0x0d)||x);.}
1040: 20 7b 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74   {}.do_execsql_t
1050: 65 73 74 20 6a 73 6f 6e 31 30 31 2d 34 2e 33 20  est json101-4.3 
1060: 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  {.  SELECT * FRO
1070: 4d 20 6a 31 20 57 48 45 52 45 20 4e 4f 54 20 6a  M j1 WHERE NOT j
1080: 73 6f 6e 5f 76 61 6c 69 64 28 78 7c 7c 63 68 61  son_valid(x||cha
1090: 72 28 30 78 32 30 2c 30 78 30 39 2c 30 78 30 61  r(0x20,0x09,0x0a
10a0: 2c 30 78 30 64 29 29 3b 0a 7d 20 7b 7d 0a 0a 23  ,0x0d));.} {}..#
10b0: 20 42 75 74 20 61 6e 20 65 6d 70 74 79 20 73 74   But an empty st
10c0: 72 69 6e 67 2c 20 6f 72 20 61 20 73 74 72 69 6e  ring, or a strin
10d0: 67 20 6f 66 20 70 75 72 65 20 77 68 69 74 65 73  g of pure whites
10e0: 70 61 63 65 20 69 73 20 6e 6f 74 20 76 61 6c 69  pace is not vali
10f0: 64 20 4a 53 4f 4e 2e 0a 23 0a 64 6f 5f 65 78 65  d JSON..#.do_exe
1100: 63 73 71 6c 5f 74 65 73 74 20 6a 73 6f 6e 31 30  csql_test json10
1110: 31 2d 34 2e 34 20 7b 0a 20 20 53 45 4c 45 43 54  1-4.4 {.  SELECT
1120: 20 6a 73 6f 6e 5f 76 61 6c 69 64 28 27 27 29 2c   json_valid(''),
1130: 20 6a 73 6f 6e 5f 76 61 6c 69 64 28 63 68 61 72   json_valid(char
1140: 28 30 78 32 30 2c 30 78 30 39 2c 30 78 30 61 2c  (0x20,0x09,0x0a,
1150: 30 78 30 64 29 29 3b 0a 7d 20 7b 30 20 30 7d 0a  0x0d));.} {0 0}.
1160: 0a 23 20 6a 73 6f 6e 5f 72 65 6d 6f 76 65 28 29  .# json_remove()
1170: 20 61 6e 64 20 73 69 6d 69 6c 61 72 20 66 75 6e   and similar fun
1180: 63 74 69 6f 6e 73 20 77 69 74 68 20 6e 6f 20 65  ctions with no e
1190: 64 69 74 20 6f 70 65 72 61 74 69 6f 6e 73 20 72  dit operations r
11a0: 65 74 75 72 6e 20 74 68 65 69 72 0a 23 20 69 6e  eturn their.# in
11b0: 70 75 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 23  put unchanged..#
11c0: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
11d0: 20 6a 73 6f 6e 31 30 31 2d 34 2e 35 20 7b 0a 20   json101-4.5 {. 
11e0: 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 6a   SELECT x FROM j
11f0: 31 20 57 48 45 52 45 20 6a 73 6f 6e 5f 72 65 6d  1 WHERE json_rem
1200: 6f 76 65 28 78 29 3c 3e 78 3b 0a 7d 20 7b 7d 0a  ove(x)<>x;.} {}.
1210: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
1220: 6a 73 6f 6e 31 30 31 2d 34 2e 36 20 7b 0a 20 20  json101-4.6 {.  
1230: 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 6a 31  SELECT x FROM j1
1240: 20 57 48 45 52 45 20 6a 73 6f 6e 5f 72 65 70 6c   WHERE json_repl
1250: 61 63 65 28 78 29 3c 3e 78 3b 0a 7d 20 7b 7d 0a  ace(x)<>x;.} {}.
1260: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
1270: 6a 73 6f 6e 31 30 31 2d 34 2e 37 20 7b 0a 20 20  json101-4.7 {.  
1280: 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 6a 31  SELECT x FROM j1
1290: 20 57 48 45 52 45 20 6a 73 6f 6e 5f 73 65 74 28   WHERE json_set(
12a0: 78 29 3c 3e 78 3b 0a 7d 20 7b 7d 0a 64 6f 5f 65  x)<>x;.} {}.do_e
12b0: 78 65 63 73 71 6c 5f 74 65 73 74 20 6a 73 6f 6e  xecsql_test json
12c0: 31 30 31 2d 34 2e 38 20 7b 0a 20 20 53 45 4c 45  101-4.8 {.  SELE
12d0: 43 54 20 78 20 46 52 4f 4d 20 6a 31 20 57 48 45  CT x FROM j1 WHE
12e0: 52 45 20 6a 73 6f 6e 5f 69 6e 73 65 72 74 28 78  RE json_insert(x
12f0: 29 3c 3e 78 3b 0a 7d 20 7b 7d 0a 0a 23 20 6a 73  )<>x;.} {}..# js
1300: 6f 6e 5f 65 78 74 72 61 63 74 28 4a 53 4f 4e 2c  on_extract(JSON,
1310: 27 24 27 29 20 77 69 6c 6c 20 72 65 74 75 72 6e  '$') will return
1320: 20 6f 62 6a 65 63 74 73 20 61 6e 64 20 61 72 72   objects and arr
1330: 61 79 73 20 77 69 74 68 6f 75 74 20 63 68 61 6e  ays without chan
1340: 67 65 2e 0a 23 0a 64 6f 5f 65 78 65 63 73 71 6c  ge..#.do_execsql
1350: 5f 74 65 73 74 20 6a 73 6f 6e 2d 34 2e 31 30 20  _test json-4.10 
1360: 7b 0a 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  {.  SELECT count
1370: 28 2a 29 20 46 52 4f 4d 20 6a 31 20 57 48 45 52  (*) FROM j1 WHER
1380: 45 20 6a 73 6f 6e 5f 74 79 70 65 28 78 29 20 49  E json_type(x) I
1390: 4e 20 28 27 6f 62 6a 65 63 74 27 2c 27 61 72 72  N ('object','arr
13a0: 61 79 27 29 3b 0a 20 20 53 45 4c 45 43 54 20 78  ay');.  SELECT x
13b0: 20 46 52 4f 4d 20 6a 31 0a 20 20 20 57 48 45 52   FROM j1.   WHER
13c0: 45 20 6a 73 6f 6e 5f 65 78 74 72 61 63 74 28 78  E json_extract(x
13d0: 2c 27 24 27 29 3c 3e 78 0a 20 20 20 20 20 41 4e  ,'$')<>x.     AN
13e0: 44 20 6a 73 6f 6e 5f 74 79 70 65 28 78 29 20 49  D json_type(x) I
13f0: 4e 20 28 27 6f 62 6a 65 63 74 27 2c 27 61 72 72  N ('object','arr
1400: 61 79 27 29 3b 0a 7d 20 7b 34 7d 0a 0a 64 6f 5f  ay');.} {4}..do_
1410: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 6a 73 6f  execsql_test jso
1420: 6e 2d 35 2e 31 20 7b 0a 20 20 43 52 45 41 54 45  n-5.1 {.  CREATE
1430: 20 54 41 42 4c 45 20 6a 32 28 69 64 20 49 4e 54   TABLE j2(id INT
1440: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
1450: 2c 20 6a 73 6f 6e 2c 20 73 72 63 29 3b 0a 20 20  , json, src);.  
1460: 49 4e 53 45 52 54 20 49 4e 54 4f 20 6a 32 28 69  INSERT INTO j2(i
1470: 64 2c 6a 73 6f 6e 2c 73 72 63 29 0a 20 20 56 41  d,json,src).  VA
1480: 4c 55 45 53 28 31 2c 27 7b 0a 20 20 20 20 22 66  LUES(1,'{.    "f
1490: 69 72 73 74 4e 61 6d 65 22 3a 20 22 4a 6f 68 6e  irstName": "John
14a0: 22 2c 0a 20 20 20 20 22 6c 61 73 74 4e 61 6d 65  ",.    "lastName
14b0: 22 3a 20 22 53 6d 69 74 68 22 2c 0a 20 20 20 20  ": "Smith",.    
14c0: 22 69 73 41 6c 69 76 65 22 3a 20 74 72 75 65 2c  "isAlive": true,
14d0: 0a 20 20 20 20 22 61 67 65 22 3a 20 32 35 2c 0a  .    "age": 25,.
14e0: 20 20 20 20 22 61 64 64 72 65 73 73 22 3a 20 7b      "address": {
14f0: 0a 20 20 20 20 20 20 22 73 74 72 65 65 74 41 64  .      "streetAd
1500: 64 72 65 73 73 22 3a 20 22 32 31 20 32 6e 64 20  dress": "21 2nd 
1510: 53 74 72 65 65 74 22 2c 0a 20 20 20 20 20 20 22  Street",.      "
1520: 63 69 74 79 22 3a 20 22 4e 65 77 20 59 6f 72 6b  city": "New York
1530: 22 2c 0a 20 20 20 20 20 20 22 73 74 61 74 65 22  ",.      "state"
1540: 3a 20 22 4e 59 22 2c 0a 20 20 20 20 20 20 22 70  : "NY",.      "p
1550: 6f 73 74 61 6c 43 6f 64 65 22 3a 20 22 31 30 30  ostalCode": "100
1560: 32 31 2d 33 31 30 30 22 0a 20 20 20 20 7d 2c 0a  21-3100".    },.
1570: 20 20 20 20 22 70 68 6f 6e 65 4e 75 6d 62 65 72      "phoneNumber
1580: 73 22 3a 20 5b 0a 20 20 20 20 20 20 7b 0a 20 20  s": [.      {.  
1590: 20 20 20 20 20 20 22 74 79 70 65 22 3a 20 22 68        "type": "h
15a0: 6f 6d 65 22 2c 0a 20 20 20 20 20 20 20 20 22 6e  ome",.        "n
15b0: 75 6d 62 65 72 22 3a 20 22 32 31 32 20 35 35 35  umber": "212 555
15c0: 2d 31 32 33 34 22 0a 20 20 20 20 20 20 7d 2c 0a  -1234".      },.
15d0: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
15e0: 22 74 79 70 65 22 3a 20 22 6f 66 66 69 63 65 22  "type": "office"
15f0: 2c 0a 20 20 20 20 20 20 20 20 22 6e 75 6d 62 65  ,.        "numbe
1600: 72 22 3a 20 22 36 34 36 20 35 35 35 2d 34 35 36  r": "646 555-456
1610: 37 22 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 5d  7".      }.    ]
1620: 2c 0a 20 20 20 20 22 63 68 69 6c 64 72 65 6e 22  ,.    "children"
1630: 3a 20 5b 5d 2c 0a 20 20 20 20 22 73 70 6f 75 73  : [],.    "spous
1640: 65 22 3a 20 6e 75 6c 6c 0a 20 20 7d 27 2c 27 68  e": null.  }','h
1650: 74 74 70 73 3a 2f 2f 65 6e 2e 77 69 6b 69 70 65  ttps://en.wikipe
1660: 64 69 61 2e 6f 72 67 2f 77 69 6b 69 2f 4a 53 4f  dia.org/wiki/JSO
1670: 4e 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  N');.  INSERT IN
1680: 54 4f 20 6a 32 28 69 64 2c 6a 73 6f 6e 2c 73 72  TO j2(id,json,sr
1690: 63 29 0a 20 20 56 41 4c 55 45 53 28 32 2c 20 27  c).  VALUES(2, '
16a0: 7b 0a 09 22 69 64 22 3a 20 22 30 30 30 31 22 2c  {.."id": "0001",
16b0: 0a 09 22 74 79 70 65 22 3a 20 22 64 6f 6e 75 74  .."type": "donut
16c0: 22 2c 0a 09 22 6e 61 6d 65 22 3a 20 22 43 61 6b  ",.."name": "Cak
16d0: 65 22 2c 0a 09 22 70 70 75 22 3a 20 30 2e 35 35  e",.."ppu": 0.55
16e0: 2c 0a 09 22 62 61 74 74 65 72 73 22 3a 0a 09 09  ,.."batters":...
16f0: 7b 0a 09 09 09 22 62 61 74 74 65 72 22 3a 0a 09  {...."batter":..
1700: 09 09 09 5b 0a 09 09 09 09 09 7b 20 22 69 64 22  ...[......{ "id"
1710: 3a 20 22 31 30 30 31 22 2c 20 22 74 79 70 65 22  : "1001", "type"
1720: 3a 20 22 52 65 67 75 6c 61 72 22 20 7d 2c 0a 09  : "Regular" },..
1730: 09 09 09 09 7b 20 22 69 64 22 3a 20 22 31 30 30  ....{ "id": "100
1740: 32 22 2c 20 22 74 79 70 65 22 3a 20 22 43 68 6f  2", "type": "Cho
1750: 63 6f 6c 61 74 65 22 20 7d 2c 0a 09 09 09 09 09  colate" },......
1760: 7b 20 22 69 64 22 3a 20 22 31 30 30 33 22 2c 20  { "id": "1003", 
1770: 22 74 79 70 65 22 3a 20 22 42 6c 75 65 62 65 72  "type": "Blueber
1780: 72 79 22 20 7d 2c 0a 09 09 09 09 09 7b 20 22 69  ry" },......{ "i
1790: 64 22 3a 20 22 31 30 30 34 22 2c 20 22 74 79 70  d": "1004", "typ
17a0: 65 22 3a 20 22 44 65 76 69 6c 27 27 73 20 46 6f  e": "Devil''s Fo
17b0: 6f 64 22 20 7d 0a 09 09 09 09 5d 0a 09 09 7d 2c  od" }.....]...},
17c0: 0a 09 22 74 6f 70 70 69 6e 67 22 3a 0a 09 09 5b  .."topping":...[
17d0: 0a 09 09 09 7b 20 22 69 64 22 3a 20 22 35 30 30  ....{ "id": "500
17e0: 31 22 2c 20 22 74 79 70 65 22 3a 20 22 4e 6f 6e  1", "type": "Non
17f0: 65 22 20 7d 2c 0a 09 09 09 7b 20 22 69 64 22 3a  e" },....{ "id":
1800: 20 22 35 30 30 32 22 2c 20 22 74 79 70 65 22 3a   "5002", "type":
1810: 20 22 47 6c 61 7a 65 64 22 20 7d 2c 0a 09 09 09   "Glazed" },....
1820: 7b 20 22 69 64 22 3a 20 22 35 30 30 35 22 2c 20  { "id": "5005", 
1830: 22 74 79 70 65 22 3a 20 22 53 75 67 61 72 22 20  "type": "Sugar" 
1840: 7d 2c 0a 09 09 09 7b 20 22 69 64 22 3a 20 22 35  },....{ "id": "5
1850: 30 30 37 22 2c 20 22 74 79 70 65 22 3a 20 22 50  007", "type": "P
1860: 6f 77 64 65 72 65 64 20 53 75 67 61 72 22 20 7d  owdered Sugar" }
1870: 2c 0a 09 09 09 7b 20 22 69 64 22 3a 20 22 35 30  ,....{ "id": "50
1880: 30 36 22 2c 20 22 74 79 70 65 22 3a 20 22 43 68  06", "type": "Ch
1890: 6f 63 6f 6c 61 74 65 20 77 69 74 68 20 53 70 72  ocolate with Spr
18a0: 69 6e 6b 6c 65 73 22 20 7d 2c 0a 09 09 09 7b 20  inkles" },....{ 
18b0: 22 69 64 22 3a 20 22 35 30 30 33 22 2c 20 22 74  "id": "5003", "t
18c0: 79 70 65 22 3a 20 22 43 68 6f 63 6f 6c 61 74 65  ype": "Chocolate
18d0: 22 20 7d 2c 0a 09 09 09 7b 20 22 69 64 22 3a 20  " },....{ "id": 
18e0: 22 35 30 30 34 22 2c 20 22 74 79 70 65 22 3a 20  "5004", "type": 
18f0: 22 4d 61 70 6c 65 22 20 7d 0a 09 09 5d 0a 20 20  "Maple" }...].  
1900: 20 7d 27 2c 27 68 74 74 70 73 3a 2f 2f 61 64 6f   }','https://ado
1910: 62 65 2e 67 69 74 68 75 62 2e 69 6f 2f 53 70 72  be.github.io/Spr
1920: 79 2f 73 61 6d 70 6c 65 73 2f 64 61 74 61 5f 72  y/samples/data_r
1930: 65 67 69 6f 6e 2f 4a 53 4f 4e 44 61 74 61 53 65  egion/JSONDataSe
1940: 74 53 61 6d 70 6c 65 2e 68 74 6d 6c 27 29 3b 0a  tSample.html');.
1950: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6a     INSERT INTO j
1960: 32 28 69 64 2c 6a 73 6f 6e 2c 73 72 63 29 0a 20  2(id,json,src). 
1970: 20 20 56 41 4c 55 45 53 28 33 2c 27 5b 0a 09 7b    VALUES(3,'[..{
1980: 0a 09 09 22 69 64 22 3a 20 22 30 30 30 31 22 2c  ..."id": "0001",
1990: 0a 09 09 22 74 79 70 65 22 3a 20 22 64 6f 6e 75  ..."type": "donu
19a0: 74 22 2c 0a 09 09 22 6e 61 6d 65 22 3a 20 22 43  t",..."name": "C
19b0: 61 6b 65 22 2c 0a 09 09 22 70 70 75 22 3a 20 30  ake",..."ppu": 0
19c0: 2e 35 35 2c 0a 09 09 22 62 61 74 74 65 72 73 22  .55,..."batters"
19d0: 3a 0a 09 09 09 7b 0a 09 09 09 09 22 62 61 74 74  :....{....."batt
19e0: 65 72 22 3a 0a 09 09 09 09 09 5b 0a 09 09 09 09  er":......[.....
19f0: 09 09 7b 20 22 69 64 22 3a 20 22 31 30 30 31 22  ..{ "id": "1001"
1a00: 2c 20 22 74 79 70 65 22 3a 20 22 52 65 67 75 6c  , "type": "Regul
1a10: 61 72 22 20 7d 2c 0a 09 09 09 09 09 09 7b 20 22  ar" },.......{ "
1a20: 69 64 22 3a 20 22 31 30 30 32 22 2c 20 22 74 79  id": "1002", "ty
1a30: 70 65 22 3a 20 22 43 68 6f 63 6f 6c 61 74 65 22  pe": "Chocolate"
1a40: 20 7d 2c 0a 09 09 09 09 09 09 7b 20 22 69 64 22   },.......{ "id"
1a50: 3a 20 22 31 30 30 33 22 2c 20 22 74 79 70 65 22  : "1003", "type"
1a60: 3a 20 22 42 6c 75 65 62 65 72 72 79 22 20 7d 2c  : "Blueberry" },
1a70: 0a 09 09 09 09 09 09 7b 20 22 69 64 22 3a 20 22  .......{ "id": "
1a80: 31 30 30 34 22 2c 20 22 74 79 70 65 22 3a 20 22  1004", "type": "
1a90: 44 65 76 69 6c 27 27 73 20 46 6f 6f 64 22 20 7d  Devil''s Food" }
1aa0: 0a 09 09 09 09 09 5d 0a 09 09 09 7d 2c 0a 09 09  ......]....},...
1ab0: 22 74 6f 70 70 69 6e 67 22 3a 0a 09 09 09 5b 0a  "topping":....[.
1ac0: 09 09 09 09 7b 20 22 69 64 22 3a 20 22 35 30 30  ....{ "id": "500
1ad0: 31 22 2c 20 22 74 79 70 65 22 3a 20 22 4e 6f 6e  1", "type": "Non
1ae0: 65 22 20 7d 2c 0a 09 09 09 09 7b 20 22 69 64 22  e" },.....{ "id"
1af0: 3a 20 22 35 30 30 32 22 2c 20 22 74 79 70 65 22  : "5002", "type"
1b00: 3a 20 22 47 6c 61 7a 65 64 22 20 7d 2c 0a 09 09  : "Glazed" },...
1b10: 09 09 7b 20 22 69 64 22 3a 20 22 35 30 30 35 22  ..{ "id": "5005"
1b20: 2c 20 22 74 79 70 65 22 3a 20 22 53 75 67 61 72  , "type": "Sugar
1b30: 22 20 7d 2c 0a 09 09 09 09 7b 20 22 69 64 22 3a  " },.....{ "id":
1b40: 20 22 35 30 30 37 22 2c 20 22 74 79 70 65 22 3a   "5007", "type":
1b50: 20 22 50 6f 77 64 65 72 65 64 20 53 75 67 61 72   "Powdered Sugar
1b60: 22 20 7d 2c 0a 09 09 09 09 7b 20 22 69 64 22 3a  " },.....{ "id":
1b70: 20 22 35 30 30 36 22 2c 20 22 74 79 70 65 22 3a   "5006", "type":
1b80: 20 22 43 68 6f 63 6f 6c 61 74 65 20 77 69 74 68   "Chocolate with
1b90: 20 53 70 72 69 6e 6b 6c 65 73 22 20 7d 2c 0a 09   Sprinkles" },..
1ba0: 09 09 09 7b 20 22 69 64 22 3a 20 22 35 30 30 33  ...{ "id": "5003
1bb0: 22 2c 20 22 74 79 70 65 22 3a 20 22 43 68 6f 63  ", "type": "Choc
1bc0: 6f 6c 61 74 65 22 20 7d 2c 0a 09 09 09 09 7b 20  olate" },.....{ 
1bd0: 22 69 64 22 3a 20 22 35 30 30 34 22 2c 20 22 74  "id": "5004", "t
1be0: 79 70 65 22 3a 20 22 4d 61 70 6c 65 22 20 7d 0a  ype": "Maple" }.
1bf0: 09 09 09 5d 0a 09 7d 2c 0a 09 7b 0a 09 09 22 69  ...]..},..{..."i
1c00: 64 22 3a 20 22 30 30 30 32 22 2c 0a 09 09 22 74  d": "0002",..."t
1c10: 79 70 65 22 3a 20 22 64 6f 6e 75 74 22 2c 0a 09  ype": "donut",..
1c20: 09 22 6e 61 6d 65 22 3a 20 22 52 61 69 73 65 64  ."name": "Raised
1c30: 22 2c 0a 09 09 22 70 70 75 22 3a 20 30 2e 35 35  ",..."ppu": 0.55
1c40: 2c 0a 09 09 22 62 61 74 74 65 72 73 22 3a 0a 09  ,..."batters":..
1c50: 09 09 7b 0a 09 09 09 09 22 62 61 74 74 65 72 22  ..{....."batter"
1c60: 3a 0a 09 09 09 09 09 5b 0a 09 09 09 09 09 09 7b  :......[.......{
1c70: 20 22 69 64 22 3a 20 22 31 30 30 31 22 2c 20 22   "id": "1001", "
1c80: 74 79 70 65 22 3a 20 22 52 65 67 75 6c 61 72 22  type": "Regular"
1c90: 20 7d 0a 09 09 09 09 09 5d 0a 09 09 09 7d 2c 0a   }......]....},.
1ca0: 09 09 22 74 6f 70 70 69 6e 67 22 3a 0a 09 09 09  .."topping":....
1cb0: 5b 0a 09 09 09 09 7b 20 22 69 64 22 3a 20 22 35  [.....{ "id": "5
1cc0: 30 30 31 22 2c 20 22 74 79 70 65 22 3a 20 22 4e  001", "type": "N
1cd0: 6f 6e 65 22 20 7d 2c 0a 09 09 09 09 7b 20 22 69  one" },.....{ "i
1ce0: 64 22 3a 20 22 35 30 30 32 22 2c 20 22 74 79 70  d": "5002", "typ
1cf0: 65 22 3a 20 22 47 6c 61 7a 65 64 22 20 7d 2c 0a  e": "Glazed" },.
1d00: 09 09 09 09 7b 20 22 69 64 22 3a 20 22 35 30 30  ....{ "id": "500
1d10: 35 22 2c 20 22 74 79 70 65 22 3a 20 22 53 75 67  5", "type": "Sug
1d20: 61 72 22 20 7d 2c 0a 09 09 09 09 7b 20 22 69 64  ar" },.....{ "id
1d30: 22 3a 20 22 35 30 30 33 22 2c 20 22 74 79 70 65  ": "5003", "type
1d40: 22 3a 20 22 43 68 6f 63 6f 6c 61 74 65 22 20 7d  ": "Chocolate" }
1d50: 2c 0a 09 09 09 09 7b 20 22 69 64 22 3a 20 22 35  ,.....{ "id": "5
1d60: 30 30 34 22 2c 20 22 74 79 70 65 22 3a 20 22 4d  004", "type": "M
1d70: 61 70 6c 65 22 20 7d 0a 09 09 09 5d 0a 09 7d 2c  aple" }....]..},
1d80: 0a 09 7b 0a 09 09 22 69 64 22 3a 20 22 30 30 30  ..{..."id": "000
1d90: 33 22 2c 0a 09 09 22 74 79 70 65 22 3a 20 22 64  3",..."type": "d
1da0: 6f 6e 75 74 22 2c 0a 09 09 22 6e 61 6d 65 22 3a  onut",..."name":
1db0: 20 22 4f 6c 64 20 46 61 73 68 69 6f 6e 65 64 22   "Old Fashioned"
1dc0: 2c 0a 09 09 22 70 70 75 22 3a 20 30 2e 35 35 2c  ,..."ppu": 0.55,
1dd0: 0a 09 09 22 62 61 74 74 65 72 73 22 3a 0a 09 09  ..."batters":...
1de0: 09 7b 0a 09 09 09 09 22 62 61 74 74 65 72 22 3a  .{....."batter":
1df0: 0a 09 09 09 09 09 5b 0a 09 09 09 09 09 09 7b 20  ......[.......{ 
1e00: 22 69 64 22 3a 20 22 31 30 30 31 22 2c 20 22 74  "id": "1001", "t
1e10: 79 70 65 22 3a 20 22 52 65 67 75 6c 61 72 22 20  ype": "Regular" 
1e20: 7d 2c 0a 09 09 09 09 09 09 7b 20 22 69 64 22 3a  },.......{ "id":
1e30: 20 22 31 30 30 32 22 2c 20 22 74 79 70 65 22 3a   "1002", "type":
1e40: 20 22 43 68 6f 63 6f 6c 61 74 65 22 20 7d 0a 09   "Chocolate" }..
1e50: 09 09 09 09 5d 0a 09 09 09 7d 2c 0a 09 09 22 74  ....]....},..."t
1e60: 6f 70 70 69 6e 67 22 3a 0a 09 09 09 5b 0a 09 09  opping":....[...
1e70: 09 09 7b 20 22 69 64 22 3a 20 22 35 30 30 31 22  ..{ "id": "5001"
1e80: 2c 20 22 74 79 70 65 22 3a 20 22 4e 6f 6e 65 22  , "type": "None"
1e90: 20 7d 2c 0a 09 09 09 09 7b 20 22 69 64 22 3a 20   },.....{ "id": 
1ea0: 22 35 30 30 32 22 2c 20 22 74 79 70 65 22 3a 20  "5002", "type": 
1eb0: 22 47 6c 61 7a 65 64 22 20 7d 2c 0a 09 09 09 09  "Glazed" },.....
1ec0: 7b 20 22 69 64 22 3a 20 22 35 30 30 33 22 2c 20  { "id": "5003", 
1ed0: 22 74 79 70 65 22 3a 20 22 43 68 6f 63 6f 6c 61  "type": "Chocola
1ee0: 74 65 22 20 7d 2c 0a 09 09 09 09 7b 20 22 69 64  te" },.....{ "id
1ef0: 22 3a 20 22 35 30 30 34 22 2c 20 22 74 79 70 65  ": "5004", "type
1f00: 22 3a 20 22 4d 61 70 6c 65 22 20 7d 0a 09 09 09  ": "Maple" }....
1f10: 5d 0a 09 7d 0a 20 20 20 5d 27 2c 27 68 74 74 70  ]..}.   ]','http
1f20: 73 3a 2f 2f 61 64 6f 62 65 2e 67 69 74 68 75 62  s://adobe.github
1f30: 2e 69 6f 2f 53 70 72 79 2f 73 61 6d 70 6c 65 73  .io/Spry/samples
1f40: 2f 64 61 74 61 5f 72 65 67 69 6f 6e 2f 4a 53 4f  /data_region/JSO
1f50: 4e 44 61 74 61 53 65 74 53 61 6d 70 6c 65 2e 68  NDataSetSample.h
1f60: 74 6d 6c 27 29 3b 0a 20 20 20 53 45 4c 45 43 54  tml');.   SELECT
1f70: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 6a   count(*) FROM j
1f80: 32 3b 0a 7d 20 7b 33 7d 0a 0a 64 6f 5f 65 78 65  2;.} {3}..do_exe
1f90: 63 73 71 6c 5f 74 65 73 74 20 6a 73 6f 6e 2d 35  csql_test json-5
1fa0: 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 69 64  .2 {.  SELECT id
1fb0: 2c 20 6a 73 6f 6e 5f 76 61 6c 69 64 28 6a 73 6f  , json_valid(jso
1fc0: 6e 29 2c 20 6a 73 6f 6e 5f 74 79 70 65 28 6a 73  n), json_type(js
1fd0: 6f 6e 29 2c 20 27 7c 27 20 46 52 4f 4d 20 6a 32  on), '|' FROM j2
1fe0: 20 4f 52 44 45 52 20 42 59 20 69 64 3b 0a 7d 20   ORDER BY id;.} 
1ff0: 7b 31 20 31 20 6f 62 6a 65 63 74 20 7c 20 32 20  {1 1 object | 2 
2000: 31 20 6f 62 6a 65 63 74 20 7c 20 33 20 31 20 61  1 object | 3 1 a
2010: 72 72 61 79 20 7c 7d 0a 0a 69 66 63 61 70 61 62  rray |}..ifcapab
2020: 6c 65 20 21 76 74 61 62 20 7b 0a 20 20 66 69 6e  le !vtab {.  fin
2030: 69 73 68 5f 74 65 73 74 0a 20 20 72 65 74 75 72  ish_test.  retur
2040: 6e 0a 7d 0a 0a 23 20 66 75 6c 6c 6b 65 79 20 69  n.}..# fullkey i
2050: 73 20 61 6c 77 61 79 73 20 74 68 65 20 73 61 6d  s always the sam
2060: 65 20 61 73 20 70 61 74 68 2b 6b 65 79 20 28 77  e as path+key (w
2070: 69 74 68 20 61 70 70 72 6f 70 72 69 61 74 65 20  ith appropriate 
2080: 66 6f 72 6d 61 74 74 69 6e 67 29 0a 23 0a 64 6f  formatting).#.do
2090: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 6a 73  _execsql_test js
20a0: 6f 6e 2d 35 2e 33 20 7b 0a 20 20 53 45 4c 45 43  on-5.3 {.  SELEC
20b0: 54 20 6a 32 2e 72 6f 77 69 64 2c 20 6a 78 2e 72  T j2.rowid, jx.r
20c0: 6f 77 69 64 2c 20 66 75 6c 6c 6b 65 79 2c 20 70  owid, fullkey, p
20d0: 61 74 68 2c 20 6b 65 79 0a 20 20 20 20 46 52 4f  ath, key.    FRO
20e0: 4d 20 6a 32 2c 20 6a 73 6f 6e 5f 74 72 65 65 28  M j2, json_tree(
20f0: 6a 32 2e 6a 73 6f 6e 29 20 41 53 20 6a 78 0a 20  j2.json) AS jx. 
2100: 20 20 57 48 45 52 45 20 66 75 6c 6c 6b 65 79 21    WHERE fullkey!
2110: 3d 28 70 61 74 68 20 7c 7c 20 43 41 53 45 20 57  =(path || CASE W
2120: 48 45 4e 20 74 79 70 65 6f 66 28 6b 65 79 29 3d  HEN typeof(key)=
2130: 3d 27 69 6e 74 65 67 65 72 27 20 54 48 45 4e 20  ='integer' THEN 
2140: 27 5b 27 7c 7c 6b 65 79 7c 7c 27 5d 27 0a 20 20  '['||key||']'.  
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 4c                EL
2170: 53 45 20 27 2e 27 7c 7c 6b 65 79 20 45 4e 44 29  SE '.'||key END)
2180: 3b 0a 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63 73 71  ;.} {}.do_execsq
2190: 6c 5f 74 65 73 74 20 6a 73 6f 6e 2d 35 2e 34 20  l_test json-5.4 
21a0: 7b 0a 20 20 53 45 4c 45 43 54 20 6a 32 2e 72 6f  {.  SELECT j2.ro
21b0: 77 69 64 2c 20 6a 78 2e 72 6f 77 69 64 2c 20 66  wid, jx.rowid, f
21c0: 75 6c 6c 6b 65 79 2c 20 70 61 74 68 2c 20 6b 65  ullkey, path, ke
21d0: 79 0a 20 20 20 20 46 52 4f 4d 20 6a 32 2c 20 6a  y.    FROM j2, j
21e0: 73 6f 6e 5f 65 61 63 68 28 6a 32 2e 6a 73 6f 6e  son_each(j2.json
21f0: 29 20 41 53 20 6a 78 0a 20 20 20 57 48 45 52 45  ) AS jx.   WHERE
2200: 20 66 75 6c 6c 6b 65 79 21 3d 28 70 61 74 68 20   fullkey!=(path 
2210: 7c 7c 20 43 41 53 45 20 57 48 45 4e 20 74 79 70  || CASE WHEN typ
2220: 65 6f 66 28 6b 65 79 29 3d 3d 27 69 6e 74 65 67  eof(key)=='integ
2230: 65 72 27 20 54 48 45 4e 20 27 5b 27 7c 7c 6b 65  er' THEN '['||ke
2240: 79 7c 7c 27 5d 27 0a 20 20 20 20 20 20 20 20 20  y||']'.         
2250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2260: 20 20 20 20 20 20 20 45 4c 53 45 20 27 2e 27 7c         ELSE '.'|
2270: 7c 6b 65 79 20 45 4e 44 29 3b 0a 7d 20 7b 7d 0a  |key END);.} {}.
2280: 0a 0a 23 20 56 65 72 69 66 79 20 74 68 61 74 20  ..# Verify that 
2290: 74 68 65 20 6a 73 6f 6e 5f 65 61 63 68 2e 6a 73  the json_each.js
22a0: 6f 6e 20 61 6e 64 20 6a 73 6f 6e 5f 74 72 65 65  on and json_tree
22b0: 2e 6a 73 6f 6e 20 6f 75 74 70 75 74 20 69 73 20  .json output is 
22c0: 61 6c 77 61 79 73 20 74 68 65 0a 23 20 73 61 6d  always the.# sam
22d0: 65 20 61 73 20 69 6e 70 75 74 2e 0a 23 0a 64 6f  e as input..#.do
22e0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 6a 73  _execsql_test js
22f0: 6f 6e 2d 35 2e 35 20 7b 0a 20 20 53 45 4c 45 43  on-5.5 {.  SELEC
2300: 54 20 6a 32 2e 72 6f 77 69 64 2c 20 6a 78 2e 72  T j2.rowid, jx.r
2310: 6f 77 69 64 2c 20 66 75 6c 6c 6b 65 79 2c 20 70  owid, fullkey, p
2320: 61 74 68 2c 20 6b 65 79 0a 20 20 20 20 46 52 4f  ath, key.    FRO
2330: 4d 20 6a 32 2c 20 6a 73 6f 6e 5f 65 61 63 68 28  M j2, json_each(
2340: 6a 32 2e 6a 73 6f 6e 29 20 41 53 20 6a 78 0a 20  j2.json) AS jx. 
2350: 20 20 57 48 45 52 45 20 6a 78 2e 6a 73 6f 6e 3c    WHERE jx.json<
2360: 3e 6a 32 2e 6a 73 6f 6e 3b 0a 7d 20 7b 7d 0a 64  >j2.json;.} {}.d
2370: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 6a  o_execsql_test j
2380: 73 6f 6e 2d 35 2e 36 20 7b 0a 20 20 53 45 4c 45  son-5.6 {.  SELE
2390: 43 54 20 6a 32 2e 72 6f 77 69 64 2c 20 6a 78 2e  CT j2.rowid, jx.
23a0: 72 6f 77 69 64 2c 20 66 75 6c 6c 6b 65 79 2c 20  rowid, fullkey, 
23b0: 70 61 74 68 2c 20 6b 65 79 0a 20 20 20 20 46 52  path, key.    FR
23c0: 4f 4d 20 6a 32 2c 20 6a 73 6f 6e 5f 74 72 65 65  OM j2, json_tree
23d0: 28 6a 32 2e 6a 73 6f 6e 29 20 41 53 20 6a 78 0a  (j2.json) AS jx.
23e0: 20 20 20 57 48 45 52 45 20 6a 78 2e 6a 73 6f 6e     WHERE jx.json
23f0: 3c 3e 6a 32 2e 6a 73 6f 6e 3b 0a 7d 20 7b 7d 0a  <>j2.json;.} {}.
2400: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
2410: 6a 73 6f 6e 2d 35 2e 37 20 7b 0a 20 20 53 45 4c  json-5.7 {.  SEL
2420: 45 43 54 20 6a 32 2e 72 6f 77 69 64 2c 20 6a 78  ECT j2.rowid, jx
2430: 2e 72 6f 77 69 64 2c 20 66 75 6c 6c 6b 65 79 2c  .rowid, fullkey,
2440: 20 70 61 74 68 2c 20 6b 65 79 0a 20 20 20 20 46   path, key.    F
2450: 52 4f 4d 20 6a 32 2c 20 6a 73 6f 6e 5f 65 61 63  ROM j2, json_eac
2460: 68 28 6a 32 2e 6a 73 6f 6e 29 20 41 53 20 6a 78  h(j2.json) AS jx
2470: 0a 20 20 20 57 48 45 52 45 20 6a 78 2e 76 61 6c  .   WHERE jx.val
2480: 75 65 3c 3e 6a 78 2e 61 74 6f 6d 20 41 4e 44 20  ue<>jx.atom AND 
2490: 74 79 70 65 20 4e 4f 54 20 49 4e 20 28 27 61 72  type NOT IN ('ar
24a0: 72 61 79 27 2c 27 6f 62 6a 65 63 74 27 29 3b 0a  ray','object');.
24b0: 7d 20 7b 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  } {}.do_execsql_
24c0: 74 65 73 74 20 6a 73 6f 6e 2d 35 2e 38 20 7b 0a  test json-5.8 {.
24d0: 20 20 53 45 4c 45 43 54 20 6a 32 2e 72 6f 77 69    SELECT j2.rowi
24e0: 64 2c 20 6a 78 2e 72 6f 77 69 64 2c 20 66 75 6c  d, jx.rowid, ful
24f0: 6c 6b 65 79 2c 20 70 61 74 68 2c 20 6b 65 79 0a  lkey, path, key.
2500: 20 20 20 20 46 52 4f 4d 20 6a 32 2c 20 6a 73 6f      FROM j2, jso
2510: 6e 5f 74 72 65 65 28 6a 32 2e 6a 73 6f 6e 29 20  n_tree(j2.json) 
2520: 41 53 20 6a 78 0a 20 20 20 57 48 45 52 45 20 6a  AS jx.   WHERE j
2530: 78 2e 76 61 6c 75 65 3c 3e 6a 78 2e 61 74 6f 6d  x.value<>jx.atom
2540: 20 41 4e 44 20 74 79 70 65 20 4e 4f 54 20 49 4e   AND type NOT IN
2550: 20 28 27 61 72 72 61 79 27 2c 27 6f 62 6a 65 63   ('array','objec
2560: 74 27 29 3b 0a 7d 20 7b 7d 0a 0a 64 6f 5f 65 78  t');.} {}..do_ex
2570: 65 63 73 71 6c 5f 74 65 73 74 20 6a 73 6f 6e 2d  ecsql_test json-
2580: 36 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 6a  6.1 {.  SELECT j
2590: 73 6f 6e 5f 76 61 6c 69 64 28 27 7b 22 61 22 3a  son_valid('{"a":
25a0: 35 35 2c 22 62 22 3a 37 32 2c 7d 27 29 3b 0a 7d  55,"b":72,}');.}
25b0: 20 7b 30 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f   {0}.do_execsql_
25c0: 74 65 73 74 20 6a 73 6f 6e 2d 36 2e 32 20 7b 0a  test json-6.2 {.
25d0: 20 20 53 45 4c 45 43 54 20 6a 73 6f 6e 5f 76 61    SELECT json_va
25e0: 6c 69 64 28 27 7b 22 61 22 3a 35 35 2c 22 62 22  lid('{"a":55,"b"
25f0: 3a 37 32 7d 27 29 3b 0a 7d 20 7b 31 7d 0a 64 6f  :72}');.} {1}.do
2600: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 6a 73  _execsql_test js
2610: 6f 6e 2d 36 2e 33 20 7b 0a 20 20 53 45 4c 45 43  on-6.3 {.  SELEC
2620: 54 20 6a 73 6f 6e 5f 76 61 6c 69 64 28 27 5b 22  T json_valid('["
2630: 61 22 2c 35 35 2c 22 62 22 2c 37 32 2c 5d 27 29  a",55,"b",72,]')
2640: 3b 0a 7d 20 7b 30 7d 0a 64 6f 5f 65 78 65 63 73  ;.} {0}.do_execs
2650: 71 6c 5f 74 65 73 74 20 6a 73 6f 6e 2d 36 2e 34  ql_test json-6.4
2660: 20 7b 0a 20 20 53 45 4c 45 43 54 20 6a 73 6f 6e   {.  SELECT json
2670: 5f 76 61 6c 69 64 28 27 5b 22 61 22 2c 35 35 2c  _valid('["a",55,
2680: 22 62 22 2c 37 32 5d 27 29 3b 0a 7d 20 7b 31 7d  "b",72]');.} {1}
2690: 0a 0a 23 20 57 68 69 74 65 2d 73 70 61 63 65 20  ..# White-space 
26a0: 74 65 73 74 73 2e 20 20 4e 6f 74 65 20 74 68 61  tests.  Note tha
26b0: 74 20 66 6f 72 6d 2d 66 65 65 64 20 69 73 20 6e  t form-feed is n
26c0: 6f 74 20 77 68 69 74 65 2d 73 70 61 63 65 20 69  ot white-space i
26d0: 6e 20 4a 53 4f 4e 2e 0a 23 20 74 69 63 6b 65 74  n JSON..# ticket
26e0: 20 5b 35 37 65 65 63 33 37 34 61 65 31 64 30 61   [57eec374ae1d0a
26f0: 31 64 34 61 32 33 30 37 37 61 39 35 66 34 65 31  1d4a23077a95f4e1
2700: 37 33 66 65 32 36 39 31 31 33 5d 0a 23 20 0a 66  73fe269113].# .f
2710: 6f 72 65 61 63 68 20 7b 74 6e 20 69 73 76 61 6c  oreach {tn isval
2720: 69 64 20 77 73 7d 20 7b 0a 20 20 37 2e 31 20 20  id ws} {.  7.1  
2730: 31 20 20 63 68 61 72 28 30 78 32 30 29 0a 20 20  1  char(0x20).  
2740: 37 2e 32 20 20 31 20 20 63 68 61 72 28 30 78 30  7.2  1  char(0x0
2750: 39 29 0a 20 20 37 2e 33 20 20 31 20 20 63 68 61  9).  7.3  1  cha
2760: 72 28 30 78 30 41 29 0a 20 20 37 2e 34 20 20 31  r(0x0A).  7.4  1
2770: 20 20 63 68 61 72 28 30 78 30 44 29 0a 20 20 37    char(0x0D).  7
2780: 2e 35 20 20 30 20 20 63 68 61 72 28 30 78 30 43  .5  0  char(0x0C
2790: 29 0a 20 20 37 2e 36 20 20 31 20 20 63 68 61 72  ).  7.6  1  char
27a0: 28 30 78 32 30 2c 30 78 30 39 2c 30 78 30 61 2c  (0x20,0x09,0x0a,
27b0: 30 78 30 64 2c 30 78 32 30 29 0a 20 20 37 2e 37  0x0d,0x20).  7.7
27c0: 20 20 30 20 20 63 68 61 72 28 30 78 32 30 2c 30    0  char(0x20,0
27d0: 78 30 39 2c 30 78 30 61 2c 30 78 30 63 2c 30 78  x09,0x0a,0x0c,0x
27e0: 30 64 2c 30 78 32 30 29 0a 7d 20 7b 0a 20 20 64  0d,0x20).} {.  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 2d 24 74 6e 2e 31 20 5c 0a 20 20 20 20  son-$tn.1 \.    
2810: 22 53 45 4c 45 43 54 20 6a 73 6f 6e 5f 76 61 6c  "SELECT json_val
2820: 69 64 28 70 72 69 6e 74 66 28 27 25 73 7b 25 73  id(printf('%s{%s
2830: 5c 22 78 5c 22 25 73 3a 25 73 39 25 73 7d 25 73  \"x\"%s:%s9%s}%s
2840: 27 2c 0a 20 20 20 20 20 20 20 20 20 24 3a 3a 77  ',.         $::w
2850: 73 2c 24 3a 3a 77 73 2c 24 3a 3a 77 73 2c 24 3a  s,$::ws,$::ws,$:
2860: 3a 77 73 2c 24 3a 3a 77 73 2c 24 3a 3a 77 73 29  :ws,$::ws,$::ws)
2870: 29 3b 22 20 5c 0a 20 20 24 69 73 76 61 6c 69 64  );" \.  $isvalid
2880: 0a 7d 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a  .}..finish_test.