/ Hex Artifact Content
Login

Artifact 557d6b2d0c3d26625e686a4b4ef8d4a50b8cec94:


0000: 2f 2a 0a 2a 2a 20 32 30 31 35 2d 30 38 2d 31 32  /*.** 2015-08-12
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ****.**.** This 
0180: 53 51 4c 69 74 65 20 65 78 74 65 6e 73 69 6f 6e  SQLite extension
0190: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 4a 53 4f 4e   implements JSON
01a0: 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68 65   functions.  The
01b0: 20 69 6e 74 65 72 66 61 63 65 20 69 73 0a 2a 2a   interface is.**
01c0: 20 6d 6f 64 65 6c 65 64 20 61 66 74 65 72 20 4d   modeled after M
01d0: 79 53 51 4c 20 4a 53 4f 4e 20 66 75 6e 63 74 69  ySQL JSON functi
01e0: 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 68  ons:.**.**     h
01f0: 74 74 70 73 3a 2f 2f 64 65 76 2e 6d 79 73 71 6c  ttps://dev.mysql
0200: 2e 63 6f 6d 2f 64 6f 63 2f 72 65 66 6d 61 6e 2f  .com/doc/refman/
0210: 35 2e 37 2f 65 6e 2f 6a 73 6f 6e 2e 68 74 6d 6c  5.7/en/json.html
0220: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 74  .**.** For the t
0230: 69 6d 65 20 62 65 69 6e 67 2c 20 61 6c 6c 20 4a  ime being, all J
0240: 53 4f 4e 20 69 73 20 73 74 6f 72 65 64 20 61 73  SON is stored as
0250: 20 70 75 72 65 20 74 65 78 74 2e 20 20 28 57 65   pure text.  (We
0260: 20 6d 69 67 68 74 20 61 64 64 0a 2a 2a 20 61 20   might add.** a 
0270: 4a 53 4f 4e 42 20 74 79 70 65 20 69 6e 20 74 68  JSONB type in th
0280: 65 20 66 75 74 75 72 65 20 77 68 69 63 68 20 73  e future which s
0290: 74 6f 72 65 73 20 61 20 62 69 6e 61 72 79 20 65  tores a binary e
02a0: 6e 63 6f 64 69 6e 67 20 6f 66 20 4a 53 4f 4e 20  ncoding of JSON 
02b0: 69 6e 0a 2a 2a 20 61 20 42 4c 4f 42 2c 20 62 75  in.** a BLOB, bu
02c0: 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75  t there is no su
02d0: 70 70 6f 72 74 20 66 6f 72 20 4a 53 4f 4e 42 20  pport for JSONB 
02e0: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  in the current i
02f0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a  mplementation..*
0300: 2a 20 54 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74  * This implement
0310: 61 74 69 6f 6e 20 70 61 72 73 65 73 20 4a 53 4f  ation parses JSO
0320: 4e 20 74 65 78 74 20 61 74 20 32 35 30 20 4d 42  N text at 250 MB
0330: 2f 73 2c 20 73 6f 20 69 74 20 69 73 20 68 61 72  /s, so it is har
0340: 64 20 74 6f 20 73 65 65 0a 2a 2a 20 68 6f 77 20  d to see.** how 
0350: 4a 53 4f 4e 42 20 6d 69 67 68 74 20 69 6d 70 72  JSONB might impr
0360: 6f 76 65 20 6f 6e 20 74 68 61 74 2e 29 0a 2a 2f  ove on that.).*/
0370: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f 53  .#if !defined(_S
0380: 51 4c 49 54 45 49 4e 54 5f 48 5f 29 0a 23 69 6e  QLITEINT_H_).#in
0390: 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33 65 78  clude "sqlite3ex
03a0: 74 2e 68 22 0a 23 65 6e 64 69 66 0a 53 51 4c 49  t.h".#endif.SQLI
03b0: 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49  TE_EXTENSION_INI
03c0: 54 31 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73  T1.#include <ass
03d0: 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ert.h>.#include 
03e0: 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c  <string.h>.#incl
03f0: 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23 69  ude <ctype.h>.#i
0400: 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68  nclude <stdlib.h
0410: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 61  >.#include <stda
0420: 72 67 2e 68 3e 0a 0a 23 64 65 66 69 6e 65 20 55  rg.h>..#define U
0430: 4e 55 53 45 44 5f 50 41 52 41 4d 28 58 29 20 20  NUSED_PARAM(X)  
0440: 28 76 6f 69 64 29 28 58 29 0a 0a 2f 2a 0a 2a 2a  (void)(X)../*.**
0450: 20 56 65 72 73 69 6f 6e 73 20 6f 66 20 69 73 73   Versions of iss
0460: 70 61 63 65 28 29 2c 20 69 73 61 6c 6e 75 6d 28  pace(), isalnum(
0470: 29 20 61 6e 64 20 69 73 64 69 67 69 74 28 29 20  ) and isdigit() 
0480: 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 73  to which it is s
0490: 61 66 65 0a 2a 2a 20 74 6f 20 70 61 73 73 20 73  afe.** to pass s
04a0: 69 67 6e 65 64 20 63 68 61 72 20 76 61 6c 75 65  igned char value
04b0: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 73 61  s..*/.#define sa
04c0: 66 65 5f 69 73 64 69 67 69 74 28 78 29 20 69 73  fe_isdigit(x) is
04d0: 64 69 67 69 74 28 28 75 6e 73 69 67 6e 65 64 20  digit((unsigned 
04e0: 63 68 61 72 29 28 78 29 29 0a 23 64 65 66 69 6e  char)(x)).#defin
04f0: 65 20 73 61 66 65 5f 69 73 61 6c 6e 75 6d 28 78  e safe_isalnum(x
0500: 29 20 69 73 61 6c 6e 75 6d 28 28 75 6e 73 69 67  ) isalnum((unsig
0510: 6e 65 64 20 63 68 61 72 29 28 78 29 29 0a 0a 2f  ned char)(x))../
0520: 2a 0a 2a 2a 20 47 72 6f 77 69 6e 67 20 6f 75 72  *.** Growing our
0530: 20 6f 77 6e 20 69 73 73 70 61 63 65 28 29 20 72   own isspace() r
0540: 6f 75 74 69 6e 65 20 74 68 69 73 20 77 61 79 20  outine this way 
0550: 69 73 20 74 77 69 63 65 20 61 73 20 66 61 73 74  is twice as fast
0560: 20 61 73 0a 2a 2a 20 74 68 65 20 6c 69 62 72 61   as.** the libra
0570: 72 79 20 69 73 73 70 61 63 65 28 29 20 66 75 6e  ry isspace() fun
0580: 63 74 69 6f 6e 2c 20 72 65 73 75 6c 74 69 6e 67  ction, resulting
0590: 20 69 6e 20 61 20 37 25 20 6f 76 65 72 61 6c 6c   in a 7% overall
05a0: 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20   performance.** 
05b0: 69 6e 63 72 65 61 73 65 20 66 6f 72 20 74 68 65  increase for the
05c0: 20 70 61 72 73 65 72 2e 20 20 28 55 62 75 6e 74   parser.  (Ubunt
05d0: 75 31 34 2e 31 30 20 67 63 63 20 34 2e 38 2e 34  u14.10 gcc 4.8.4
05e0: 20 78 36 34 20 77 69 74 68 20 2d 4f 73 29 2e 0a   x64 with -Os)..
05f0: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
0600: 63 68 61 72 20 6a 73 6f 6e 49 73 53 70 61 63 65  char jsonIsSpace
0610: 5b 5d 20 3d 20 7b 0a 20 20 30 2c 20 30 2c 20 30  [] = {.  0, 0, 0
0620: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0630: 20 20 20 20 20 30 2c 20 31 2c 20 31 2c 20 30 2c       0, 1, 1, 0,
0640: 20 31 2c 20 31 2c 20 30 2c 20 30 2c 0a 20 20 30   1, 1, 0, 0,.  0
0650: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0660: 20 30 2c 20 30 2c 20 20 20 20 20 30 2c 20 30 2c   0, 0,     0, 0,
0670: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0680: 30 2c 0a 20 20 31 2c 20 30 2c 20 30 2c 20 30 2c  0,.  1, 0, 0, 0,
0690: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 20   0, 0, 0, 0,    
06a0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
06b0: 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c  0, 0, 0,.  0, 0,
06c0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
06d0: 30 2c 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20  0,     0, 0, 0, 
06e0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  0, 0, 0, 0, 0,. 
06f0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0700: 30 2c 20 30 2c 20 30 2c 20 20 20 20 20 30 2c 20  0, 0, 0,     0, 
0710: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0720: 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20  , 0,.  0, 0, 0, 
0730: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20  0, 0, 0, 0, 0,  
0740: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
0750: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20  , 0, 0, 0,.  0, 
0760: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0770: 2c 20 30 2c 20 20 20 20 20 30 2c 20 30 2c 20 30  , 0,     0, 0, 0
0780: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0790: 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  .  0, 0, 0, 0, 0
07a0: 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 20 20 30  , 0, 0, 0,     0
07b0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
07c0: 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30   0, 0,.  0, 0, 0
07d0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
07e0: 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c       0, 0, 0, 0,
07f0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30   0, 0, 0, 0,.  0
0800: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0810: 20 30 2c 20 30 2c 20 20 20 20 20 30 2c 20 30 2c   0, 0,     0, 0,
0820: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0830: 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  0,.  0, 0, 0, 0,
0840: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 20   0, 0, 0, 0,    
0850: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0860: 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c  0, 0, 0,.  0, 0,
0870: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0880: 30 2c 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20  0,     0, 0, 0, 
0890: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  0, 0, 0, 0, 0,. 
08a0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
08b0: 30 2c 20 30 2c 20 30 2c 20 20 20 20 20 30 2c 20  0, 0, 0,     0, 
08c0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
08d0: 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20  , 0,.  0, 0, 0, 
08e0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20  0, 0, 0, 0, 0,  
08f0: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
0900: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20  , 0, 0, 0,.  0, 
0910: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0920: 2c 20 30 2c 20 20 20 20 20 30 2c 20 30 2c 20 30  , 0,     0, 0, 0
0930: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0940: 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  .  0, 0, 0, 0, 0
0950: 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 20 20 30  , 0, 0, 0,     0
0960: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0970: 20 30 2c 20 30 2c 0a 7d 3b 0a 23 64 65 66 69 6e   0, 0,.};.#defin
0980: 65 20 73 61 66 65 5f 69 73 73 70 61 63 65 28 78  e safe_isspace(x
0990: 29 20 28 6a 73 6f 6e 49 73 53 70 61 63 65 5b 28  ) (jsonIsSpace[(
09a0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 78 5d  unsigned char)x]
09b0: 29 0a 0a 2f 2a 20 55 6e 73 69 67 6e 65 64 20 69  )../* Unsigned i
09c0: 6e 74 65 67 65 72 20 74 79 70 65 73 20 2a 2f 0a  nteger types */.
09d0: 74 79 70 65 64 65 66 20 73 71 6c 69 74 65 33 5f  typedef sqlite3_
09e0: 75 69 6e 74 36 34 20 75 36 34 3b 0a 74 79 70 65  uint64 u64;.type
09f0: 64 65 66 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  def unsigned int
0a00: 20 75 33 32 3b 0a 74 79 70 65 64 65 66 20 75 6e   u32;.typedef un
0a10: 73 69 67 6e 65 64 20 63 68 61 72 20 75 38 3b 0a  signed char u8;.
0a20: 0a 2f 2a 20 4f 62 6a 65 63 74 73 20 2a 2f 0a 74  ./* Objects */.t
0a30: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 4a 73  ypedef struct Js
0a40: 6f 6e 53 74 72 69 6e 67 20 4a 73 6f 6e 53 74 72  onString JsonStr
0a50: 69 6e 67 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ing;.typedef str
0a60: 75 63 74 20 4a 73 6f 6e 4e 6f 64 65 20 4a 73 6f  uct JsonNode Jso
0a70: 6e 4e 6f 64 65 3b 0a 74 79 70 65 64 65 66 20 73  nNode;.typedef s
0a80: 74 72 75 63 74 20 4a 73 6f 6e 50 61 72 73 65 20  truct JsonParse 
0a90: 4a 73 6f 6e 50 61 72 73 65 3b 0a 0a 2f 2a 20 41  JsonParse;../* A
0aa0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
0ab0: 69 73 20 6f 62 6a 65 63 74 20 72 65 70 72 65 73  is object repres
0ac0: 65 6e 74 73 20 61 20 4a 53 4f 4e 20 73 74 72 69  ents a JSON stri
0ad0: 6e 67 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73  ng.** under cons
0ae0: 74 72 75 63 74 69 6f 6e 2e 20 20 52 65 61 6c 6c  truction.  Reall
0af0: 79 2c 20 74 68 69 73 20 69 73 20 61 20 67 65 6e  y, this is a gen
0b00: 65 72 69 63 20 73 74 72 69 6e 67 20 61 63 63 75  eric string accu
0b10: 6d 75 6c 61 74 6f 72 0a 2a 2a 20 74 68 61 74 20  mulator.** that 
0b20: 63 61 6e 20 62 65 20 61 6e 64 20 69 73 20 75 73  can be and is us
0b30: 65 64 20 74 6f 20 63 72 65 61 74 65 20 73 74 72  ed to create str
0b40: 69 6e 67 73 20 6f 74 68 65 72 20 74 68 61 6e 20  ings other than 
0b50: 4a 53 4f 4e 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  JSON..*/.struct 
0b60: 4a 73 6f 6e 53 74 72 69 6e 67 20 7b 0a 20 20 73  JsonString {.  s
0b70: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
0b80: 70 43 74 78 3b 20 20 20 2f 2a 20 46 75 6e 63 74  pCtx;   /* Funct
0b90: 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2d 20 70 75  ion context - pu
0ba0: 74 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  t error messages
0bb0: 20 68 65 72 65 20 2a 2f 0a 20 20 63 68 61 72 20   here */.  char 
0bc0: 2a 7a 42 75 66 3b 20 20 20 20 20 20 20 20 20 20  *zBuf;          
0bd0: 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 4a 53      /* Append JS
0be0: 4f 4e 20 63 6f 6e 74 65 6e 74 20 68 65 72 65 20  ON content here 
0bf0: 2a 2f 0a 20 20 75 36 34 20 6e 41 6c 6c 6f 63 3b  */.  u64 nAlloc;
0c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0c10: 20 42 79 74 65 73 20 6f 66 20 73 74 6f 72 61 67   Bytes of storag
0c20: 65 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 7a  e available in z
0c30: 42 75 66 5b 5d 20 2a 2f 0a 20 20 75 36 34 20 6e  Buf[] */.  u64 n
0c40: 55 73 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  Used;           
0c50: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
0c60: 7a 42 75 66 5b 5d 20 63 75 72 72 65 6e 74 6c 79  zBuf[] currently
0c70: 20 75 73 65 64 20 2a 2f 0a 20 20 75 38 20 62 53   used */.  u8 bS
0c80: 74 61 74 69 63 3b 20 20 20 20 20 20 20 20 20 20  tatic;          
0c90: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 7a      /* True if z
0ca0: 42 75 66 20 69 73 20 73 74 61 74 69 63 20 73 70  Buf is static sp
0cb0: 61 63 65 20 2a 2f 0a 20 20 75 38 20 62 45 72 72  ace */.  u8 bErr
0cc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0cd0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20    /* True if an 
0ce0: 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20 65  error has been e
0cf0: 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20  ncountered */.  
0d00: 63 68 61 72 20 7a 53 70 61 63 65 5b 31 30 30 5d  char zSpace[100]
0d10: 3b 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74  ;        /* Init
0d20: 69 61 6c 20 73 74 61 74 69 63 20 73 70 61 63 65  ial static space
0d30: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 4a 53 4f 4e 20   */.};../* JSON 
0d40: 74 79 70 65 20 76 61 6c 75 65 73 0a 2a 2f 0a 23  type values.*/.#
0d50: 64 65 66 69 6e 65 20 4a 53 4f 4e 5f 4e 55 4c 4c  define JSON_NULL
0d60: 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20 4a       0.#define J
0d70: 53 4f 4e 5f 54 52 55 45 20 20 20 20 20 31 0a 23  SON_TRUE     1.#
0d80: 64 65 66 69 6e 65 20 4a 53 4f 4e 5f 46 41 4c 53  define JSON_FALS
0d90: 45 20 20 20 20 32 0a 23 64 65 66 69 6e 65 20 4a  E    2.#define J
0da0: 53 4f 4e 5f 49 4e 54 20 20 20 20 20 20 33 0a 23  SON_INT      3.#
0db0: 64 65 66 69 6e 65 20 4a 53 4f 4e 5f 52 45 41 4c  define JSON_REAL
0dc0: 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65 20 4a       4.#define J
0dd0: 53 4f 4e 5f 53 54 52 49 4e 47 20 20 20 35 0a 23  SON_STRING   5.#
0de0: 64 65 66 69 6e 65 20 4a 53 4f 4e 5f 41 52 52 41  define JSON_ARRA
0df0: 59 20 20 20 20 36 0a 23 64 65 66 69 6e 65 20 4a  Y    6.#define J
0e00: 53 4f 4e 5f 4f 42 4a 45 43 54 20 20 20 37 0a 0a  SON_OBJECT   7..
0e10: 2f 2a 20 54 68 65 20 22 73 75 62 74 79 70 65 22  /* The "subtype"
0e20: 20 73 65 74 20 66 6f 72 20 4a 53 4f 4e 20 76 61   set for JSON va
0e30: 6c 75 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20  lues */.#define 
0e40: 4a 53 4f 4e 5f 53 55 42 54 59 50 45 20 20 37 34  JSON_SUBTYPE  74
0e50: 20 20 20 20 2f 2a 20 41 73 63 69 69 20 66 6f 72      /* Ascii for
0e60: 20 22 4a 22 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4e   "J" */../*.** N
0e70: 61 6d 65 73 20 6f 66 20 74 68 65 20 76 61 72 69  ames of the vari
0e80: 6f 75 73 20 4a 53 4f 4e 20 74 79 70 65 73 3a 0a  ous JSON types:.
0e90: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
0ea0: 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 6a 73 6f  char * const jso
0eb0: 6e 54 79 70 65 5b 5d 20 3d 20 7b 0a 20 20 22 6e  nType[] = {.  "n
0ec0: 75 6c 6c 22 2c 20 22 74 72 75 65 22 2c 20 22 66  ull", "true", "f
0ed0: 61 6c 73 65 22 2c 20 22 69 6e 74 65 67 65 72 22  alse", "integer"
0ee0: 2c 20 22 72 65 61 6c 22 2c 20 22 74 65 78 74 22  , "real", "text"
0ef0: 2c 20 22 61 72 72 61 79 22 2c 20 22 6f 62 6a 65  , "array", "obje
0f00: 63 74 22 0a 7d 3b 0a 0a 2f 2a 20 42 69 74 20 76  ct".};../* Bit v
0f10: 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20 4a 73  alues for the Js
0f20: 6f 6e 4e 6f 64 65 2e 6a 6e 46 6c 61 67 20 66 69  onNode.jnFlag fi
0f30: 65 6c 64 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a  eld.*/.#define J
0f40: 4e 4f 44 45 5f 52 41 57 20 20 20 20 20 30 78 30  NODE_RAW     0x0
0f50: 31 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  1         /* Con
0f60: 74 65 6e 74 20 69 73 20 72 61 77 2c 20 6e 6f 74  tent is raw, not
0f70: 20 4a 53 4f 4e 20 65 6e 63 6f 64 65 64 20 2a 2f   JSON encoded */
0f80: 0a 23 64 65 66 69 6e 65 20 4a 4e 4f 44 45 5f 45  .#define JNODE_E
0f90: 53 43 41 50 45 20 20 30 78 30 32 20 20 20 20 20  SCAPE  0x02     
0fa0: 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 69      /* Content i
0fb0: 73 20 74 65 78 74 20 77 69 74 68 20 5c 20 65 73  s text with \ es
0fc0: 63 61 70 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65  capes */.#define
0fd0: 20 4a 4e 4f 44 45 5f 52 45 4d 4f 56 45 20 20 30   JNODE_REMOVE  0
0fe0: 78 30 34 20 20 20 20 20 20 20 20 20 2f 2a 20 44  x04         /* D
0ff0: 6f 20 6e 6f 74 20 6f 75 74 70 75 74 20 2a 2f 0a  o not output */.
1000: 23 64 65 66 69 6e 65 20 4a 4e 4f 44 45 5f 52 45  #define JNODE_RE
1010: 50 4c 41 43 45 20 30 78 30 38 20 20 20 20 20 20  PLACE 0x08      
1020: 20 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 77 69     /* Replace wi
1030: 74 68 20 4a 73 6f 6e 4e 6f 64 65 2e 69 56 61 6c  th JsonNode.iVal
1040: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4e 4f 44   */.#define JNOD
1050: 45 5f 41 50 50 45 4e 44 20 20 30 78 31 30 20 20  E_APPEND  0x10  
1060: 20 20 20 20 20 20 20 2f 2a 20 4d 6f 72 65 20 41         /* More A
1070: 52 52 41 59 2f 4f 42 4a 45 43 54 20 65 6e 74 72  RRAY/OBJECT entr
1080: 69 65 73 20 61 74 20 75 2e 69 41 70 70 65 6e 64  ies at u.iAppend
1090: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4e 4f 44   */.#define JNOD
10a0: 45 5f 4c 41 42 45 4c 20 20 20 30 78 32 30 20 20  E_LABEL   0x20  
10b0: 20 20 20 20 20 20 20 2f 2a 20 49 73 20 61 20 6c         /* Is a l
10c0: 61 62 65 6c 20 6f 66 20 61 6e 20 6f 62 6a 65 63  abel of an objec
10d0: 74 20 2a 2f 0a 0a 0a 2f 2a 20 41 20 73 69 6e 67  t */.../* A sing
10e0: 6c 65 20 6e 6f 64 65 20 6f 66 20 70 61 72 73 65  le node of parse
10f0: 64 20 4a 53 4f 4e 0a 2a 2f 0a 73 74 72 75 63 74  d JSON.*/.struct
1100: 20 4a 73 6f 6e 4e 6f 64 65 20 7b 0a 20 20 75 38   JsonNode {.  u8
1110: 20 65 54 79 70 65 3b 20 20 20 20 20 20 20 20 20   eType;         
1120: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
1130: 68 65 20 4a 53 4f 4e 5f 20 74 79 70 65 20 76 61  he JSON_ type va
1140: 6c 75 65 73 20 2a 2f 0a 20 20 75 38 20 6a 6e 46  lues */.  u8 jnF
1150: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
1160: 20 2f 2a 20 4a 4e 4f 44 45 20 66 6c 61 67 73 20   /* JNODE flags 
1170: 2a 2f 0a 20 20 75 38 20 69 56 61 6c 3b 20 20 20  */.  u8 iVal;   
1180: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1190: 65 70 6c 61 63 65 6d 65 6e 74 20 76 61 6c 75 65  eplacement value
11a0: 20 77 68 65 6e 20 4a 4e 4f 44 45 5f 52 45 50 4c   when JNODE_REPL
11b0: 41 43 45 20 2a 2f 0a 20 20 75 33 32 20 6e 3b 20  ACE */.  u32 n; 
11c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d0: 2f 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74  /* Bytes of cont
11e0: 65 6e 74 2c 20 6f 72 20 6e 75 6d 62 65 72 20 6f  ent, or number o
11f0: 66 20 73 75 62 2d 6e 6f 64 65 73 20 2a 2f 0a 20  f sub-nodes */. 
1200: 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 63 6f 6e   union {.    con
1210: 73 74 20 63 68 61 72 20 2a 7a 4a 43 6f 6e 74 65  st char *zJConte
1220: 6e 74 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 66  nt; /* Content f
1230: 6f 72 20 49 4e 54 2c 20 52 45 41 4c 2c 20 61 6e  or INT, REAL, an
1240: 64 20 53 54 52 49 4e 47 20 2a 2f 0a 20 20 20 20  d STRING */.    
1250: 75 33 32 20 69 41 70 70 65 6e 64 3b 20 20 20 20  u32 iAppend;    
1260: 20 20 20 20 20 20 20 2f 2a 20 4d 6f 72 65 20 74         /* More t
1270: 65 72 6d 73 20 66 6f 72 20 41 52 52 41 59 20 61  erms for ARRAY a
1280: 6e 64 20 4f 42 4a 45 43 54 20 2a 2f 0a 20 20 20  nd OBJECT */.   
1290: 20 75 33 32 20 69 4b 65 79 3b 20 20 20 20 20 20   u32 iKey;      
12a0: 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 20 66          /* Key f
12b0: 6f 72 20 41 52 52 41 59 20 6f 62 6a 65 63 74 73  or ARRAY objects
12c0: 20 69 6e 20 6a 73 6f 6e 5f 74 72 65 65 28 29 20   in json_tree() 
12d0: 2a 2f 0a 20 20 7d 20 75 3b 0a 7d 3b 0a 0a 2f 2a  */.  } u;.};../*
12e0: 20 41 20 63 6f 6d 70 6c 65 74 65 6c 79 20 70 61   A completely pa
12f0: 72 73 65 64 20 4a 53 4f 4e 20 73 74 72 69 6e 67  rsed JSON string
1300: 0a 2a 2f 0a 73 74 72 75 63 74 20 4a 73 6f 6e 50  .*/.struct JsonP
1310: 61 72 73 65 20 7b 0a 20 20 75 33 32 20 6e 4e 6f  arse {.  u32 nNo
1320: 64 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  de;         /* N
1330: 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 20 6f  umber of slots o
1340: 66 20 61 4e 6f 64 65 5b 5d 20 75 73 65 64 20 2a  f aNode[] used *
1350: 2f 0a 20 20 75 33 32 20 6e 41 6c 6c 6f 63 3b 20  /.  u32 nAlloc; 
1360: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1370: 20 6f 66 20 73 6c 6f 74 73 20 6f 66 20 61 4e 6f   of slots of aNo
1380: 64 65 5b 5d 20 61 6c 6c 6f 63 61 74 65 64 20 2a  de[] allocated *
1390: 2f 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 61 4e  /.  JsonNode *aN
13a0: 6f 64 65 3b 20 20 20 2f 2a 20 41 72 72 61 79 20  ode;   /* Array 
13b0: 6f 66 20 6e 6f 64 65 73 20 63 6f 6e 74 61 69 6e  of nodes contain
13c0: 69 6e 67 20 74 68 65 20 70 61 72 73 65 20 2a 2f  ing the parse */
13d0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
13e0: 4a 73 6f 6e 3b 20 2f 2a 20 4f 72 69 67 69 6e 61  Json; /* Origina
13f0: 6c 20 4a 53 4f 4e 20 73 74 72 69 6e 67 20 2a 2f  l JSON string */
1400: 0a 20 20 75 33 32 20 2a 61 55 70 3b 20 20 20 20  .  u32 *aUp;    
1410: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
1420: 66 20 70 61 72 65 6e 74 20 6f 66 20 65 61 63 68  f parent of each
1430: 20 6e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 6f 6f   node */.  u8 oo
1440: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  m;            /*
1450: 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   Set to true if 
1460: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f  out of memory */
1470: 0a 20 20 75 38 20 6e 45 72 72 3b 20 20 20 20 20  .  u8 nErr;     
1480: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1490: 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e 20 2a  of errors seen *
14a0: 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  /.};../*********
14b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14f0: 2a 0a 2a 2a 20 55 74 69 6c 69 74 79 20 72 6f 75  *.** Utility rou
1500: 74 69 6e 65 73 20 66 6f 72 20 64 65 61 6c 69 6e  tines for dealin
1510: 67 20 77 69 74 68 20 4a 73 6f 6e 53 74 72 69 6e  g with JsonStrin
1520: 67 20 6f 62 6a 65 63 74 73 0a 2a 2a 2a 2a 2a 2a  g objects.******
1530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1570: 2a 2a 2a 2a 2f 0a 0a 2f 2a 20 53 65 74 20 74 68  ****/../* Set th
1580: 65 20 4a 73 6f 6e 53 74 72 69 6e 67 20 6f 62 6a  e JsonString obj
1590: 65 63 74 20 74 6f 20 61 6e 20 65 6d 70 74 79 20  ect to an empty 
15a0: 73 74 72 69 6e 67 0a 2a 2f 0a 73 74 61 74 69 63  string.*/.static
15b0: 20 76 6f 69 64 20 6a 73 6f 6e 5a 65 72 6f 28 4a   void jsonZero(J
15c0: 73 6f 6e 53 74 72 69 6e 67 20 2a 70 29 7b 0a 20  sonString *p){. 
15d0: 20 70 2d 3e 7a 42 75 66 20 3d 20 70 2d 3e 7a 53   p->zBuf = p->zS
15e0: 70 61 63 65 3b 0a 20 20 70 2d 3e 6e 41 6c 6c 6f  pace;.  p->nAllo
15f0: 63 20 3d 20 73 69 7a 65 6f 66 28 70 2d 3e 7a 53  c = sizeof(p->zS
1600: 70 61 63 65 29 3b 0a 20 20 70 2d 3e 6e 55 73 65  pace);.  p->nUse
1610: 64 20 3d 20 30 3b 0a 20 20 70 2d 3e 62 53 74 61  d = 0;.  p->bSta
1620: 74 69 63 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 20 49  tic = 1;.}../* I
1630: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4a 73  nitialize the Js
1640: 6f 6e 53 74 72 69 6e 67 20 6f 62 6a 65 63 74 0a  onString object.
1650: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a  */.static void j
1660: 73 6f 6e 49 6e 69 74 28 4a 73 6f 6e 53 74 72 69  sonInit(JsonStri
1670: 6e 67 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 63  ng *p, sqlite3_c
1680: 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20  ontext *pCtx){. 
1690: 20 70 2d 3e 70 43 74 78 20 3d 20 70 43 74 78 3b   p->pCtx = pCtx;
16a0: 0a 20 20 70 2d 3e 62 45 72 72 20 3d 20 30 3b 0a  .  p->bErr = 0;.
16b0: 20 20 6a 73 6f 6e 5a 65 72 6f 28 70 29 3b 0a 7d    jsonZero(p);.}
16c0: 0a 0a 0a 2f 2a 20 46 72 65 65 20 61 6c 6c 20 61  .../* Free all a
16d0: 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 20  llocated memory 
16e0: 61 6e 64 20 72 65 73 65 74 20 74 68 65 20 4a 73  and reset the Js
16f0: 6f 6e 53 74 72 69 6e 67 20 6f 62 6a 65 63 74 20  onString object 
1700: 62 61 63 6b 20 74 6f 20 69 74 73 0a 2a 2a 20 69  back to its.** i
1710: 6e 69 74 69 61 6c 20 73 74 61 74 65 2e 0a 2a 2f  nitial state..*/
1720: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f  .static void jso
1730: 6e 52 65 73 65 74 28 4a 73 6f 6e 53 74 72 69 6e  nReset(JsonStrin
1740: 67 20 2a 70 29 7b 0a 20 20 69 66 28 20 21 70 2d  g *p){.  if( !p-
1750: 3e 62 53 74 61 74 69 63 20 29 20 73 71 6c 69 74  >bStatic ) sqlit
1760: 65 33 5f 66 72 65 65 28 70 2d 3e 7a 42 75 66 29  e3_free(p->zBuf)
1770: 3b 0a 20 20 6a 73 6f 6e 5a 65 72 6f 28 70 29 3b  ;.  jsonZero(p);
1780: 0a 7d 0a 0a 0a 2f 2a 20 52 65 70 6f 72 74 20 61  .}.../* Report a
1790: 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20  n out-of-memory 
17a0: 28 4f 4f 4d 29 20 63 6f 6e 64 69 74 69 6f 6e 20  (OOM) condition 
17b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
17c0: 6a 73 6f 6e 4f 6f 6d 28 4a 73 6f 6e 53 74 72 69  jsonOom(JsonStri
17d0: 6e 67 20 2a 70 29 7b 0a 20 20 70 2d 3e 62 45 72  ng *p){.  p->bEr
17e0: 72 20 3d 20 31 3b 0a 20 20 73 71 6c 69 74 65 33  r = 1;.  sqlite3
17f0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
1800: 6d 65 6d 28 70 2d 3e 70 43 74 78 29 3b 0a 20 20  mem(p->pCtx);.  
1810: 6a 73 6f 6e 52 65 73 65 74 28 70 29 3b 0a 7d 0a  jsonReset(p);.}.
1820: 0a 2f 2a 20 45 6e 6c 61 72 67 65 20 70 4a 73 6f  ./* Enlarge pJso
1830: 6e 2d 3e 7a 42 75 66 20 73 6f 20 74 68 61 74 20  n->zBuf so that 
1840: 69 74 20 63 61 6e 20 68 6f 6c 64 20 61 74 20 6c  it can hold at l
1850: 65 61 73 74 20 4e 20 6d 6f 72 65 20 62 79 74 65  east N more byte
1860: 73 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 7a 65 72  s..** Return zer
1870: 6f 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 52  o on success.  R
1880: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f  eturn non-zero o
1890: 6e 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 0a 2a  n an OOM error.*
18a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 73 6f  /.static int jso
18b0: 6e 47 72 6f 77 28 4a 73 6f 6e 53 74 72 69 6e 67  nGrow(JsonString
18c0: 20 2a 70 2c 20 75 33 32 20 4e 29 7b 0a 20 20 75   *p, u32 N){.  u
18d0: 36 34 20 6e 54 6f 74 61 6c 20 3d 20 4e 3c 70 2d  64 nTotal = N<p-
18e0: 3e 6e 41 6c 6c 6f 63 20 3f 20 70 2d 3e 6e 41 6c  >nAlloc ? p->nAl
18f0: 6c 6f 63 2a 32 20 3a 20 70 2d 3e 6e 41 6c 6c 6f  loc*2 : p->nAllo
1900: 63 2b 4e 2b 31 30 3b 0a 20 20 63 68 61 72 20 2a  c+N+10;.  char *
1910: 7a 4e 65 77 3b 0a 20 20 69 66 28 20 70 2d 3e 62  zNew;.  if( p->b
1920: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 69 66  Static ){.    if
1930: 28 20 70 2d 3e 62 45 72 72 20 29 20 72 65 74 75  ( p->bErr ) retu
1940: 72 6e 20 31 3b 0a 20 20 20 20 7a 4e 65 77 20 3d  rn 1;.    zNew =
1950: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
1960: 34 28 6e 54 6f 74 61 6c 29 3b 0a 20 20 20 20 69  4(nTotal);.    i
1970: 66 28 20 7a 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( zNew==0 ){.  
1980: 20 20 20 20 6a 73 6f 6e 4f 6f 6d 28 70 29 3b 0a      jsonOom(p);.
1990: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
19a0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
19b0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 4e 65 77  .    memcpy(zNew
19c0: 2c 20 70 2d 3e 7a 42 75 66 2c 20 28 73 69 7a 65  , p->zBuf, (size
19d0: 5f 74 29 70 2d 3e 6e 55 73 65 64 29 3b 0a 20 20  _t)p->nUsed);.  
19e0: 20 20 70 2d 3e 7a 42 75 66 20 3d 20 7a 4e 65 77    p->zBuf = zNew
19f0: 3b 0a 20 20 20 20 70 2d 3e 62 53 74 61 74 69 63  ;.    p->bStatic
1a00: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
1a10: 20 20 20 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65     zNew = sqlite
1a20: 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 2d 3e 7a  3_realloc64(p->z
1a30: 42 75 66 2c 20 6e 54 6f 74 61 6c 29 3b 0a 20 20  Buf, nTotal);.  
1a40: 20 20 69 66 28 20 7a 4e 65 77 3d 3d 30 20 29 7b    if( zNew==0 ){
1a50: 0a 20 20 20 20 20 20 6a 73 6f 6e 4f 6f 6d 28 70  .      jsonOom(p
1a60: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1a70: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1a80: 20 20 7d 0a 20 20 20 20 70 2d 3e 7a 42 75 66 20    }.    p->zBuf 
1a90: 3d 20 7a 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 2d  = zNew;.  }.  p-
1aa0: 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 54 6f 74 61 6c  >nAlloc = nTotal
1ab0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1ac0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 41 70 70 65  E_OK;.}../* Appe
1ad0: 6e 64 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20  nd N bytes from 
1ae0: 7a 49 6e 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  zIn onto the end
1af0: 20 6f 66 20 74 68 65 20 4a 73 6f 6e 53 74 72 69   of the JsonStri
1b00: 6e 67 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74  ng string..*/.st
1b10: 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 41 70  atic void jsonAp
1b20: 70 65 6e 64 52 61 77 28 4a 73 6f 6e 53 74 72 69  pendRaw(JsonStri
1b30: 6e 67 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  ng *p, const cha
1b40: 72 20 2a 7a 49 6e 2c 20 75 33 32 20 4e 29 7b 0a  r *zIn, u32 N){.
1b50: 20 20 69 66 28 20 28 4e 2b 70 2d 3e 6e 55 73 65    if( (N+p->nUse
1b60: 64 20 3e 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 29 20  d >= p->nAlloc) 
1b70: 26 26 20 6a 73 6f 6e 47 72 6f 77 28 70 2c 4e 29  && jsonGrow(p,N)
1b80: 21 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  !=0 ) return;.  
1b90: 6d 65 6d 63 70 79 28 70 2d 3e 7a 42 75 66 2b 70  memcpy(p->zBuf+p
1ba0: 2d 3e 6e 55 73 65 64 2c 20 7a 49 6e 2c 20 4e 29  ->nUsed, zIn, N)
1bb0: 3b 0a 20 20 70 2d 3e 6e 55 73 65 64 20 2b 3d 20  ;.  p->nUsed += 
1bc0: 4e 3b 0a 7d 0a 0a 2f 2a 20 41 70 70 65 6e 64 20  N;.}../* Append 
1bd0: 66 6f 72 6d 61 74 74 65 64 20 74 65 78 74 20 28  formatted text (
1be0: 6e 6f 74 20 74 6f 20 65 78 63 65 65 64 20 4e 20  not to exceed N 
1bf0: 62 79 74 65 73 29 20 74 6f 20 74 68 65 20 4a 73  bytes) to the Js
1c00: 6f 6e 53 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61  onString..*/.sta
1c10: 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 50 72 69  tic void jsonPri
1c20: 6e 74 66 28 69 6e 74 20 4e 2c 20 4a 73 6f 6e 53  ntf(int N, JsonS
1c30: 74 72 69 6e 67 20 2a 70 2c 20 63 6f 6e 73 74 20  tring *p, const 
1c40: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
1c50: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
1c60: 70 3b 0a 20 20 69 66 28 20 28 70 2d 3e 6e 55 73  p;.  if( (p->nUs
1c70: 65 64 20 2b 20 4e 20 3e 3d 20 70 2d 3e 6e 41 6c  ed + N >= p->nAl
1c80: 6c 6f 63 29 20 26 26 20 6a 73 6f 6e 47 72 6f 77  loc) && jsonGrow
1c90: 28 70 2c 20 4e 29 20 29 20 72 65 74 75 72 6e 3b  (p, N) ) return;
1ca0: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
1cb0: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 73 71 6c 69  zFormat);.  sqli
1cc0: 74 65 33 5f 76 73 6e 70 72 69 6e 74 66 28 4e 2c  te3_vsnprintf(N,
1cd0: 20 70 2d 3e 7a 42 75 66 2b 70 2d 3e 6e 55 73 65   p->zBuf+p->nUse
1ce0: 64 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  d, zFormat, ap);
1cf0: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
1d00: 20 70 2d 3e 6e 55 73 65 64 20 2b 3d 20 28 69 6e   p->nUsed += (in
1d10: 74 29 73 74 72 6c 65 6e 28 70 2d 3e 7a 42 75 66  t)strlen(p->zBuf
1d20: 2b 70 2d 3e 6e 55 73 65 64 29 3b 0a 7d 0a 0a 2f  +p->nUsed);.}../
1d30: 2a 20 41 70 70 65 6e 64 20 61 20 73 69 6e 67 6c  * Append a singl
1d40: 65 20 63 68 61 72 61 63 74 65 72 0a 2a 2f 0a 73  e character.*/.s
1d50: 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 41  tatic void jsonA
1d60: 70 70 65 6e 64 43 68 61 72 28 4a 73 6f 6e 53 74  ppendChar(JsonSt
1d70: 72 69 6e 67 20 2a 70 2c 20 63 68 61 72 20 63 29  ring *p, char c)
1d80: 7b 0a 20 20 69 66 28 20 70 2d 3e 6e 55 73 65 64  {.  if( p->nUsed
1d90: 3e 3d 70 2d 3e 6e 41 6c 6c 6f 63 20 26 26 20 6a  >=p->nAlloc && j
1da0: 73 6f 6e 47 72 6f 77 28 70 2c 31 29 21 3d 30 20  sonGrow(p,1)!=0 
1db0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 2d 3e 7a  ) return;.  p->z
1dc0: 42 75 66 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20  Buf[p->nUsed++] 
1dd0: 3d 20 63 3b 0a 7d 0a 0a 2f 2a 20 41 70 70 65 6e  = c;.}../* Appen
1de0: 64 20 61 20 63 6f 6d 6d 61 20 73 65 70 61 72 61  d a comma separa
1df0: 74 6f 72 20 74 6f 20 74 68 65 20 6f 75 74 70 75  tor to the outpu
1e00: 74 20 62 75 66 66 65 72 2c 20 69 66 20 74 68 65  t buffer, if the
1e10: 20 70 72 65 76 69 6f 75 73 0a 2a 2a 20 63 68 61   previous.** cha
1e20: 72 61 63 74 65 72 20 69 73 20 6e 6f 74 20 27 5b  racter is not '[
1e30: 27 20 6f 72 20 27 7b 27 2e 0a 2a 2f 0a 73 74 61  ' or '{'..*/.sta
1e40: 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 41 70 70  tic void jsonApp
1e50: 65 6e 64 53 65 70 61 72 61 74 6f 72 28 4a 73 6f  endSeparator(Jso
1e60: 6e 53 74 72 69 6e 67 20 2a 70 29 7b 0a 20 20 63  nString *p){.  c
1e70: 68 61 72 20 63 3b 0a 20 20 69 66 28 20 70 2d 3e  har c;.  if( p->
1e80: 6e 55 73 65 64 3d 3d 30 20 29 20 72 65 74 75 72  nUsed==0 ) retur
1e90: 6e 3b 0a 20 20 63 20 3d 20 70 2d 3e 7a 42 75 66  n;.  c = p->zBuf
1ea0: 5b 70 2d 3e 6e 55 73 65 64 2d 31 5d 3b 0a 20 20  [p->nUsed-1];.  
1eb0: 69 66 28 20 63 21 3d 27 5b 27 20 26 26 20 63 21  if( c!='[' && c!
1ec0: 3d 27 7b 27 20 29 20 6a 73 6f 6e 41 70 70 65 6e  ='{' ) jsonAppen
1ed0: 64 43 68 61 72 28 70 2c 20 27 2c 27 29 3b 0a 7d  dChar(p, ',');.}
1ee0: 0a 0a 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20  ../* Append the 
1ef0: 4e 2d 62 79 74 65 20 73 74 72 69 6e 67 20 69 6e  N-byte string in
1f00: 20 7a 49 6e 20 74 6f 20 74 68 65 20 65 6e 64 20   zIn to the end 
1f10: 6f 66 20 74 68 65 20 4a 73 6f 6e 53 74 72 69 6e  of the JsonStrin
1f20: 67 20 73 74 72 69 6e 67 0a 2a 2a 20 75 6e 64 65  g string.** unde
1f30: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
1f40: 20 45 6e 63 6c 6f 73 65 20 74 68 65 20 73 74 72   Enclose the str
1f50: 69 6e 67 20 69 6e 20 22 2e 2e 2e 22 20 61 6e 64  ing in "..." and
1f60: 20 65 73 63 61 70 65 0a 2a 2a 20 61 6e 79 20 64   escape.** any d
1f70: 6f 75 62 6c 65 2d 71 75 6f 74 65 73 20 6f 72 20  ouble-quotes or 
1f80: 62 61 63 6b 73 6c 61 73 68 20 63 68 61 72 61 63  backslash charac
1f90: 74 65 72 73 20 63 6f 6e 74 61 69 6e 65 64 20 77  ters contained w
1fa0: 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20 73 74 72  ithin the.** str
1fb0: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
1fc0: 6f 69 64 20 6a 73 6f 6e 41 70 70 65 6e 64 53 74  oid jsonAppendSt
1fd0: 72 69 6e 67 28 4a 73 6f 6e 53 74 72 69 6e 67 20  ring(JsonString 
1fe0: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
1ff0: 7a 49 6e 2c 20 75 33 32 20 4e 29 7b 0a 20 20 75  zIn, u32 N){.  u
2000: 33 32 20 69 3b 0a 20 20 69 66 28 20 28 4e 2b 70  32 i;.  if( (N+p
2010: 2d 3e 6e 55 73 65 64 2b 32 20 3e 3d 20 70 2d 3e  ->nUsed+2 >= p->
2020: 6e 41 6c 6c 6f 63 29 20 26 26 20 6a 73 6f 6e 47  nAlloc) && jsonG
2030: 72 6f 77 28 70 2c 4e 2b 32 29 21 3d 30 20 29 20  row(p,N+2)!=0 ) 
2040: 72 65 74 75 72 6e 3b 0a 20 20 70 2d 3e 7a 42 75  return;.  p->zBu
2050: 66 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d 20  f[p->nUsed++] = 
2060: 27 22 27 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  '"';.  for(i=0; 
2070: 69 3c 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  i<N; i++){.    c
2080: 68 61 72 20 63 20 3d 20 7a 49 6e 5b 69 5d 3b 0a  har c = zIn[i];.
2090: 20 20 20 20 69 66 28 20 63 3d 3d 27 22 27 20 7c      if( c=='"' |
20a0: 7c 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20  | c=='\\' ){.   
20b0: 20 20 20 69 66 28 20 28 70 2d 3e 6e 55 73 65 64     if( (p->nUsed
20c0: 2b 4e 2b 33 2d 69 20 3e 20 70 2d 3e 6e 41 6c 6c  +N+3-i > p->nAll
20d0: 6f 63 29 20 26 26 20 6a 73 6f 6e 47 72 6f 77 28  oc) && jsonGrow(
20e0: 70 2c 4e 2b 33 2d 69 29 21 3d 30 20 29 20 72 65  p,N+3-i)!=0 ) re
20f0: 74 75 72 6e 3b 0a 20 20 20 20 20 20 70 2d 3e 7a  turn;.      p->z
2100: 42 75 66 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20  Buf[p->nUsed++] 
2110: 3d 20 27 5c 5c 27 3b 0a 20 20 20 20 7d 0a 20 20  = '\\';.    }.  
2120: 20 20 70 2d 3e 7a 42 75 66 5b 70 2d 3e 6e 55 73    p->zBuf[p->nUs
2130: 65 64 2b 2b 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20  ed++] = c;.  }. 
2140: 20 70 2d 3e 7a 42 75 66 5b 70 2d 3e 6e 55 73 65   p->zBuf[p->nUse
2150: 64 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 61 73  d++] = '"';.  as
2160: 73 65 72 74 28 20 70 2d 3e 6e 55 73 65 64 3c 70  sert( p->nUsed<p
2170: 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 7d 0a 0a 2f  ->nAlloc );.}../
2180: 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 66 75  *.** Append a fu
2190: 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72  nction parameter
21a0: 20 76 61 6c 75 65 20 74 6f 20 74 68 65 20 4a 53   value to the JS
21b0: 4f 4e 20 73 74 72 69 6e 67 20 75 6e 64 65 72 20  ON string under 
21c0: 0a 2a 2a 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  .** construction
21d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
21e0: 20 6a 73 6f 6e 41 70 70 65 6e 64 56 61 6c 75 65   jsonAppendValue
21f0: 28 0a 20 20 4a 73 6f 6e 53 74 72 69 6e 67 20 2a  (.  JsonString *
2200: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
2210: 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20     /* Append to 
2220: 74 68 69 73 20 4a 53 4f 4e 20 73 74 72 69 6e 67  this JSON string
2230: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
2240: 6c 75 65 20 2a 70 56 61 6c 75 65 20 20 20 20 20  lue *pValue     
2250: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
2260: 20 61 70 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20   append */.){.  
2270: 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f  switch( sqlite3_
2280: 76 61 6c 75 65 5f 74 79 70 65 28 70 56 61 6c 75  value_type(pValu
2290: 65 29 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  e) ){.    case S
22a0: 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20  QLITE_NULL: {.  
22b0: 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 52 61      jsonAppendRa
22c0: 77 28 70 2c 20 22 6e 75 6c 6c 22 2c 20 34 29 3b  w(p, "null", 4);
22d0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
22e0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
22f0: 49 54 45 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20  ITE_INTEGER:.   
2300: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f   case SQLITE_FLO
2310: 41 54 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73  AT: {.      cons
2320: 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e  t char *z = (con
2330: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
2340: 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c  _value_text(pVal
2350: 75 65 29 3b 0a 20 20 20 20 20 20 75 33 32 20 6e  ue);.      u32 n
2360: 20 3d 20 28 75 33 32 29 73 71 6c 69 74 65 33 5f   = (u32)sqlite3_
2370: 76 61 6c 75 65 5f 62 79 74 65 73 28 70 56 61 6c  value_bytes(pVal
2380: 75 65 29 3b 0a 20 20 20 20 20 20 6a 73 6f 6e 41  ue);.      jsonA
2390: 70 70 65 6e 64 52 61 77 28 70 2c 20 7a 2c 20 6e  ppendRaw(p, z, n
23a0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
23b0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
23c0: 51 4c 49 54 45 5f 54 45 58 54 3a 20 7b 0a 20 20  QLITE_TEXT: {.  
23d0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
23e0: 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  z = (const char*
23f0: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
2400: 65 78 74 28 70 56 61 6c 75 65 29 3b 0a 20 20 20  ext(pValue);.   
2410: 20 20 20 75 33 32 20 6e 20 3d 20 28 75 33 32 29     u32 n = (u32)
2420: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
2430: 74 65 73 28 70 56 61 6c 75 65 29 3b 0a 20 20 20  tes(pValue);.   
2440: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76     if( sqlite3_v
2450: 61 6c 75 65 5f 73 75 62 74 79 70 65 28 70 56 61  alue_subtype(pVa
2460: 6c 75 65 29 3d 3d 4a 53 4f 4e 5f 53 55 42 54 59  lue)==JSON_SUBTY
2470: 50 45 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 73  PE ){.        js
2480: 6f 6e 41 70 70 65 6e 64 52 61 77 28 70 2c 20 7a  onAppendRaw(p, z
2490: 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , n);.      }els
24a0: 65 7b 0a 20 20 20 20 20 20 20 20 6a 73 6f 6e 41  e{.        jsonA
24b0: 70 70 65 6e 64 53 74 72 69 6e 67 28 70 2c 20 7a  ppendString(p, z
24c0: 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , n);.      }.  
24d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
24e0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
24f0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 62 45 72        if( p->bEr
2500: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  r==0 ){.        
2510: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
2520: 72 72 6f 72 28 70 2d 3e 70 43 74 78 2c 20 22 4a  rror(p->pCtx, "J
2530: 53 4f 4e 20 63 61 6e 6e 6f 74 20 68 6f 6c 64 20  SON cannot hold 
2540: 42 4c 4f 42 20 76 61 6c 75 65 73 22 2c 20 2d 31  BLOB values", -1
2550: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 62 45  );.        p->bE
2560: 72 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rr = 1;.        
2570: 6a 73 6f 6e 52 65 73 65 74 28 70 29 3b 0a 20 20  jsonReset(p);.  
2580: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
2590: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  k;.    }.  }.}..
25a0: 0a 2f 2a 20 4d 61 6b 65 20 74 68 65 20 4a 53 4f  ./* Make the JSO
25b0: 4e 20 69 6e 20 70 20 74 68 65 20 72 65 73 75 6c  N in p the resul
25c0: 74 20 6f 66 20 74 68 65 20 53 51 4c 20 66 75 6e  t of the SQL fun
25d0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
25e0: 20 76 6f 69 64 20 6a 73 6f 6e 52 65 73 75 6c 74   void jsonResult
25f0: 28 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70 29 7b  (JsonString *p){
2600: 0a 20 20 69 66 28 20 70 2d 3e 62 45 72 72 3d 3d  .  if( p->bErr==
2610: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
2620: 5f 72 65 73 75 6c 74 5f 74 65 78 74 36 34 28 70  _result_text64(p
2630: 2d 3e 70 43 74 78 2c 20 70 2d 3e 7a 42 75 66 2c  ->pCtx, p->zBuf,
2640: 20 70 2d 3e 6e 55 73 65 64 2c 20 0a 20 20 20 20   p->nUsed, .    
2650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2660: 20 20 20 20 20 20 70 2d 3e 62 53 74 61 74 69 63        p->bStatic
2670: 20 3f 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49   ? SQLITE_TRANSI
2680: 45 4e 54 20 3a 20 73 71 6c 69 74 65 33 5f 66 72  ENT : sqlite3_fr
2690: 65 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ee,.            
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
26b0: 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20  LITE_UTF8);.    
26c0: 6a 73 6f 6e 5a 65 72 6f 28 70 29 3b 0a 20 20 7d  jsonZero(p);.  }
26d0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62 53  .  assert( p->bS
26e0: 74 61 74 69 63 20 29 3b 0a 7d 0a 0a 2f 2a 2a 2a  tatic );.}../***
26f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2730: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 55 74 69 6c 69  *******.** Utili
2740: 74 79 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20  ty routines for 
2750: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 4a 73 6f  dealing with Jso
2760: 6e 4e 6f 64 65 20 61 6e 64 20 4a 73 6f 6e 50 61  nNode and JsonPa
2770: 72 73 65 20 6f 62 6a 65 63 74 73 0a 2a 2a 2a 2a  rse objects.****
2780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27c0: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  ******/../*.** R
27d0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
27e0: 20 6f 66 20 63 6f 6e 73 65 63 75 74 69 76 65 20   of consecutive 
27f0: 4a 73 6f 6e 4e 6f 64 65 20 73 6c 6f 74 73 20 6e  JsonNode slots n
2800: 65 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74  eed to represent
2810: 0a 2a 2a 20 74 68 65 20 70 61 72 73 65 64 20 4a  .** the parsed J
2820: 53 4f 4e 20 61 74 20 70 4e 6f 64 65 2e 20 20 54  SON at pNode.  T
2830: 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6e 73 77 65  he minimum answe
2840: 72 20 69 73 20 31 2e 20 20 46 6f 72 20 41 52 52  r is 1.  For ARR
2850: 41 59 20 61 6e 64 0a 2a 2a 20 4f 42 4a 45 43 54  AY and.** OBJECT
2860: 20 74 79 70 65 73 2c 20 74 68 65 20 6e 75 6d 62   types, the numb
2870: 65 72 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67  er might be larg
2880: 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 70 70 65 6e 64  er..**.** Append
2890: 65 64 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20  ed elements are 
28a0: 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 20 20 54 68  not counted.  Th
28b0: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
28c0: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a   is the number.*
28d0: 2a 20 62 79 20 77 68 69 63 68 20 74 68 65 20 4a  * by which the J
28e0: 73 6f 6e 4e 6f 64 65 20 63 6f 75 6e 74 65 72 20  sonNode counter 
28f0: 73 68 6f 75 6c 64 20 69 6e 63 72 65 6d 65 6e 74  should increment
2900: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 6f 20   in order to go 
2910: 74 6f 20 74 68 65 0a 2a 2a 20 6e 65 78 74 20 70  to the.** next p
2920: 65 65 72 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74  eer value..*/.st
2930: 61 74 69 63 20 75 33 32 20 6a 73 6f 6e 4e 6f 64  atic u32 jsonNod
2940: 65 53 69 7a 65 28 4a 73 6f 6e 4e 6f 64 65 20 2a  eSize(JsonNode *
2950: 70 4e 6f 64 65 29 7b 0a 20 20 72 65 74 75 72 6e  pNode){.  return
2960: 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65 3e 3d 4a   pNode->eType>=J
2970: 53 4f 4e 5f 41 52 52 41 59 20 3f 20 70 4e 6f 64  SON_ARRAY ? pNod
2980: 65 2d 3e 6e 2b 31 20 3a 20 31 3b 0a 7d 0a 0a 2f  e->n+1 : 1;.}../
2990: 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c  *.** Reclaim all
29a0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65   memory allocate
29b0: 64 20 62 79 20 61 20 4a 73 6f 6e 50 61 72 73 65  d by a JsonParse
29c0: 20 6f 62 6a 65 63 74 2e 20 20 42 75 74 20 64 6f   object.  But do
29d0: 20 6e 6f 74 0a 2a 2a 20 64 65 6c 65 74 65 20 74   not.** delete t
29e0: 68 65 20 4a 73 6f 6e 50 61 72 73 65 20 6f 62 6a  he JsonParse obj
29f0: 65 63 74 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 73  ect itself..*/.s
2a00: 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 50  tatic void jsonP
2a10: 61 72 73 65 52 65 73 65 74 28 4a 73 6f 6e 50 61  arseReset(JsonPa
2a20: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
2a30: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
2a40: 72 73 65 2d 3e 61 4e 6f 64 65 29 3b 0a 20 20 70  rse->aNode);.  p
2a50: 50 61 72 73 65 2d 3e 61 4e 6f 64 65 20 3d 20 30  Parse->aNode = 0
2a60: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4e 6f 64  ;.  pParse->nNod
2a70: 65 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  e = 0;.  pParse-
2a80: 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 73  >nAlloc = 0;.  s
2a90: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 72  qlite3_free(pPar
2aa0: 73 65 2d 3e 61 55 70 29 3b 0a 20 20 70 50 61 72  se->aUp);.  pPar
2ab0: 73 65 2d 3e 61 55 70 20 3d 20 30 3b 0a 7d 0a 0a  se->aUp = 0;.}..
2ac0: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68  /*.** Convert th
2ad0: 65 20 4a 73 6f 6e 4e 6f 64 65 20 70 4e 6f 64 65  e JsonNode pNode
2ae0: 20 69 6e 74 6f 20 61 20 70 75 72 65 20 4a 53 4f   into a pure JSO
2af0: 4e 20 73 74 72 69 6e 67 20 61 6e 64 0a 2a 2a 20  N string and.** 
2b00: 61 70 70 65 6e 64 20 74 6f 20 70 4f 75 74 2e 20  append to pOut. 
2b10: 20 53 75 62 73 75 62 73 74 72 75 63 74 75 72 65   Subsubstructure
2b20: 20 69 73 20 61 6c 73 6f 20 69 6e 63 6c 75 64 65   is also include
2b30: 64 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68  d.  Return.** th
2b40: 65 20 6e 75 6d 62 65 72 20 6f 66 20 4a 73 6f 6e  e number of Json
2b50: 4e 6f 64 65 20 6f 62 6a 65 63 74 73 20 74 68 61  Node objects tha
2b60: 74 20 61 72 65 20 65 6e 63 6f 64 65 64 2e 0a 2a  t are encoded..*
2b70: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73  /.static void js
2b80: 6f 6e 52 65 6e 64 65 72 4e 6f 64 65 28 0a 20 20  onRenderNode(.  
2b90: 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c  JsonNode *pNode,
2ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2bb0: 2a 20 54 68 65 20 6e 6f 64 65 20 74 6f 20 72 65  * The node to re
2bc0: 6e 64 65 72 20 2a 2f 0a 20 20 4a 73 6f 6e 53 74  nder */.  JsonSt
2bd0: 72 69 6e 67 20 2a 70 4f 75 74 2c 20 20 20 20 20  ring *pOut,     
2be0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
2bf0: 65 20 4a 53 4f 4e 20 68 65 72 65 20 2a 2f 0a 20  e JSON here */. 
2c00: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
2c10: 2a 61 52 65 70 6c 61 63 65 20 20 20 20 20 20 20  *aReplace       
2c20: 2f 2a 20 52 65 70 6c 61 63 65 6d 65 6e 74 20 76  /* Replacement v
2c30: 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 73 77  alues */.){.  sw
2c40: 69 74 63 68 28 20 70 4e 6f 64 65 2d 3e 65 54 79  itch( pNode->eTy
2c50: 70 65 20 29 7b 0a 20 20 20 20 64 65 66 61 75 6c  pe ){.    defaul
2c60: 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
2c70: 74 28 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65 3d  t( pNode->eType=
2c80: 3d 4a 53 4f 4e 5f 4e 55 4c 4c 20 29 3b 0a 20 20  =JSON_NULL );.  
2c90: 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 52 61      jsonAppendRa
2ca0: 77 28 70 4f 75 74 2c 20 22 6e 75 6c 6c 22 2c 20  w(pOut, "null", 
2cb0: 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  4);.      break;
2cc0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
2cd0: 4a 53 4f 4e 5f 54 52 55 45 3a 20 7b 0a 20 20 20  JSON_TRUE: {.   
2ce0: 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 52 61 77     jsonAppendRaw
2cf0: 28 70 4f 75 74 2c 20 22 74 72 75 65 22 2c 20 34  (pOut, "true", 4
2d00: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
2d10: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a      }.    case J
2d20: 53 4f 4e 5f 46 41 4c 53 45 3a 20 7b 0a 20 20 20  SON_FALSE: {.   
2d30: 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 52 61 77     jsonAppendRaw
2d40: 28 70 4f 75 74 2c 20 22 66 61 6c 73 65 22 2c 20  (pOut, "false", 
2d50: 35 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  5);.      break;
2d60: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
2d70: 4a 53 4f 4e 5f 53 54 52 49 4e 47 3a 20 7b 0a 20  JSON_STRING: {. 
2d80: 20 20 20 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e       if( pNode->
2d90: 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f  jnFlags & JNODE_
2da0: 52 41 57 20 29 7b 0a 20 20 20 20 20 20 20 20 6a  RAW ){.        j
2db0: 73 6f 6e 41 70 70 65 6e 64 53 74 72 69 6e 67 28  sonAppendString(
2dc0: 70 4f 75 74 2c 20 70 4e 6f 64 65 2d 3e 75 2e 7a  pOut, pNode->u.z
2dd0: 4a 43 6f 6e 74 65 6e 74 2c 20 70 4e 6f 64 65 2d  JContent, pNode-
2de0: 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  >n);.        bre
2df0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
2e00: 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67    /* Fall throug
2e10: 68 20 69 6e 74 6f 20 74 68 65 20 6e 65 78 74 20  h into the next 
2e20: 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  case */.    }.  
2e30: 20 20 63 61 73 65 20 4a 53 4f 4e 5f 52 45 41 4c    case JSON_REAL
2e40: 3a 0a 20 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f  :.    case JSON_
2e50: 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20 6a 73 6f  INT: {.      jso
2e60: 6e 41 70 70 65 6e 64 52 61 77 28 70 4f 75 74 2c  nAppendRaw(pOut,
2e70: 20 70 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74   pNode->u.zJCont
2e80: 65 6e 74 2c 20 70 4e 6f 64 65 2d 3e 6e 29 3b 0a  ent, pNode->n);.
2e90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2ea0: 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 53 4f 4e   }.    case JSON
2eb0: 5f 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20  _ARRAY: {.      
2ec0: 75 33 32 20 6a 20 3d 20 31 3b 0a 20 20 20 20 20  u32 j = 1;.     
2ed0: 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61 72 28   jsonAppendChar(
2ee0: 70 4f 75 74 2c 20 27 5b 27 29 3b 0a 20 20 20 20  pOut, '[');.    
2ef0: 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20    for(;;){.     
2f00: 20 20 20 77 68 69 6c 65 28 20 6a 3c 3d 70 4e 6f     while( j<=pNo
2f10: 64 65 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20 20  de->n ){.       
2f20: 20 20 20 69 66 28 20 70 4e 6f 64 65 5b 6a 5d 2e     if( pNode[j].
2f30: 6a 6e 46 6c 61 67 73 20 26 20 28 4a 4e 4f 44 45  jnFlags & (JNODE
2f40: 5f 52 45 4d 4f 56 45 7c 4a 4e 4f 44 45 5f 52 45  _REMOVE|JNODE_RE
2f50: 50 4c 41 43 45 29 20 29 7b 0a 20 20 20 20 20 20  PLACE) ){.      
2f60: 20 20 20 20 20 20 69 66 28 20 70 4e 6f 64 65 5b        if( pNode[
2f70: 6a 5d 2e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f  j].jnFlags & JNO
2f80: 44 45 5f 52 45 50 4c 41 43 45 20 29 7b 0a 20 20  DE_REPLACE ){.  
2f90: 20 20 20 20 20 20 20 20 20 20 20 20 6a 73 6f 6e              json
2fa0: 41 70 70 65 6e 64 53 65 70 61 72 61 74 6f 72 28  AppendSeparator(
2fb0: 70 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20  pOut);.         
2fc0: 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 56       jsonAppendV
2fd0: 61 6c 75 65 28 70 4f 75 74 2c 20 61 52 65 70 6c  alue(pOut, aRepl
2fe0: 61 63 65 5b 70 4e 6f 64 65 5b 6a 5d 2e 69 56 61  ace[pNode[j].iVa
2ff0: 6c 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  l]);.           
3000: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c   }.          }el
3010: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
3020: 6a 73 6f 6e 41 70 70 65 6e 64 53 65 70 61 72 61  jsonAppendSepara
3030: 74 6f 72 28 70 4f 75 74 29 3b 0a 20 20 20 20 20  tor(pOut);.     
3040: 20 20 20 20 20 20 20 6a 73 6f 6e 52 65 6e 64 65         jsonRende
3050: 72 4e 6f 64 65 28 26 70 4e 6f 64 65 5b 6a 5d 2c  rNode(&pNode[j],
3060: 20 70 4f 75 74 2c 20 61 52 65 70 6c 61 63 65 29   pOut, aReplace)
3070: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
3080: 20 20 20 20 20 20 20 20 6a 20 2b 3d 20 6a 73 6f          j += jso
3090: 6e 4e 6f 64 65 53 69 7a 65 28 26 70 4e 6f 64 65  nNodeSize(&pNode
30a0: 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  [j]);.        }.
30b0: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4e 6f          if( (pNo
30c0: 64 65 2d 3e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e  de->jnFlags & JN
30d0: 4f 44 45 5f 41 50 50 45 4e 44 29 3d 3d 30 20 29  ODE_APPEND)==0 )
30e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
30f0: 70 4e 6f 64 65 20 3d 20 26 70 4e 6f 64 65 5b 70  pNode = &pNode[p
3100: 4e 6f 64 65 2d 3e 75 2e 69 41 70 70 65 6e 64 5d  Node->u.iAppend]
3110: 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 31 3b  ;.        j = 1;
3120: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6a  .      }.      j
3130: 73 6f 6e 41 70 70 65 6e 64 43 68 61 72 28 70 4f  sonAppendChar(pO
3140: 75 74 2c 20 27 5d 27 29 3b 0a 20 20 20 20 20 20  ut, ']');.      
3150: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
3160: 20 63 61 73 65 20 4a 53 4f 4e 5f 4f 42 4a 45 43   case JSON_OBJEC
3170: 54 3a 20 7b 0a 20 20 20 20 20 20 75 33 32 20 6a  T: {.      u32 j
3180: 20 3d 20 31 3b 0a 20 20 20 20 20 20 6a 73 6f 6e   = 1;.      json
3190: 41 70 70 65 6e 64 43 68 61 72 28 70 4f 75 74 2c  AppendChar(pOut,
31a0: 20 27 7b 27 29 3b 0a 20 20 20 20 20 20 66 6f 72   '{');.      for
31b0: 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 77 68  (;;){.        wh
31c0: 69 6c 65 28 20 6a 3c 3d 70 4e 6f 64 65 2d 3e 6e  ile( j<=pNode->n
31d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
31e0: 28 20 28 70 4e 6f 64 65 5b 6a 2b 31 5d 2e 6a 6e  ( (pNode[j+1].jn
31f0: 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 52 45  Flags & JNODE_RE
3200: 4d 4f 56 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  MOVE)==0 ){.    
3210: 20 20 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65          jsonAppe
3220: 6e 64 53 65 70 61 72 61 74 6f 72 28 70 4f 75 74  ndSeparator(pOut
3230: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  );.            j
3240: 73 6f 6e 52 65 6e 64 65 72 4e 6f 64 65 28 26 70  sonRenderNode(&p
3250: 4e 6f 64 65 5b 6a 5d 2c 20 70 4f 75 74 2c 20 61  Node[j], pOut, a
3260: 52 65 70 6c 61 63 65 29 3b 0a 20 20 20 20 20 20  Replace);.      
3270: 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64        jsonAppend
3280: 43 68 61 72 28 70 4f 75 74 2c 20 27 3a 27 29 3b  Char(pOut, ':');
3290: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
32a0: 20 70 4e 6f 64 65 5b 6a 2b 31 5d 2e 6a 6e 46 6c   pNode[j+1].jnFl
32b0: 61 67 73 20 26 20 4a 4e 4f 44 45 5f 52 45 50 4c  ags & JNODE_REPL
32c0: 41 43 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ACE ){.         
32d0: 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 56       jsonAppendV
32e0: 61 6c 75 65 28 70 4f 75 74 2c 20 61 52 65 70 6c  alue(pOut, aRepl
32f0: 61 63 65 5b 70 4e 6f 64 65 5b 6a 2b 31 5d 2e 69  ace[pNode[j+1].i
3300: 56 61 6c 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  Val]);.         
3310: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3320: 20 20 20 20 20 20 20 20 6a 73 6f 6e 52 65 6e 64          jsonRend
3330: 65 72 4e 6f 64 65 28 26 70 4e 6f 64 65 5b 6a 2b  erNode(&pNode[j+
3340: 31 5d 2c 20 70 4f 75 74 2c 20 61 52 65 70 6c 61  1], pOut, aRepla
3350: 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ce);.           
3360: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
3370: 20 20 20 20 20 20 20 20 20 6a 20 2b 3d 20 31 20           j += 1 
3380: 2b 20 6a 73 6f 6e 4e 6f 64 65 53 69 7a 65 28 26  + jsonNodeSize(&
3390: 70 4e 6f 64 65 5b 6a 2b 31 5d 29 3b 0a 20 20 20  pNode[j+1]);.   
33a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
33b0: 66 28 20 28 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61  f( (pNode->jnFla
33c0: 67 73 20 26 20 4a 4e 4f 44 45 5f 41 50 50 45 4e  gs & JNODE_APPEN
33d0: 44 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  D)==0 ) break;. 
33e0: 20 20 20 20 20 20 20 70 4e 6f 64 65 20 3d 20 26         pNode = &
33f0: 70 4e 6f 64 65 5b 70 4e 6f 64 65 2d 3e 75 2e 69  pNode[pNode->u.i
3400: 41 70 70 65 6e 64 5d 3b 0a 20 20 20 20 20 20 20  Append];.       
3410: 20 6a 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a   j = 1;.      }.
3420: 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64        jsonAppend
3430: 43 68 61 72 28 70 4f 75 74 2c 20 27 7d 27 29 3b  Char(pOut, '}');
3440: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3450: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
3460: 20 52 65 74 75 72 6e 20 61 20 4a 73 6f 6e 4e 6f   Return a JsonNo
3470: 64 65 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 64  de and all its d
3480: 65 73 63 65 6e 64 65 6e 74 73 20 61 73 20 61 20  escendents as a 
3490: 4a 53 4f 4e 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a  JSON string..*/.
34a0: 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e  static void json
34b0: 52 65 74 75 72 6e 4a 73 6f 6e 28 0a 20 20 4a 73  ReturnJson(.  Js
34c0: 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 20 20  onNode *pNode,  
34d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 64            /* Nod
34e0: 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  e to return */. 
34f0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
3500: 20 2a 70 43 74 78 2c 20 20 20 20 20 20 2f 2a 20   *pCtx,      /* 
3510: 52 65 74 75 72 6e 20 76 61 6c 75 65 20 66 6f 72  Return value for
3520: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
3530: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
3540: 65 20 2a 2a 61 52 65 70 6c 61 63 65 20 20 20 20  e **aReplace    
3550: 2f 2a 20 41 72 72 61 79 20 6f 66 20 72 65 70 6c  /* Array of repl
3560: 61 63 65 6d 65 6e 74 20 76 61 6c 75 65 73 20 2a  acement values *
3570: 2f 0a 29 7b 0a 20 20 4a 73 6f 6e 53 74 72 69 6e  /.){.  JsonStrin
3580: 67 20 73 3b 0a 20 20 6a 73 6f 6e 49 6e 69 74 28  g s;.  jsonInit(
3590: 26 73 2c 20 70 43 74 78 29 3b 0a 20 20 6a 73 6f  &s, pCtx);.  jso
35a0: 6e 52 65 6e 64 65 72 4e 6f 64 65 28 70 4e 6f 64  nRenderNode(pNod
35b0: 65 2c 20 26 73 2c 20 61 52 65 70 6c 61 63 65 29  e, &s, aReplace)
35c0: 3b 0a 20 20 6a 73 6f 6e 52 65 73 75 6c 74 28 26  ;.  jsonResult(&
35d0: 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  s);.  sqlite3_re
35e0: 73 75 6c 74 5f 73 75 62 74 79 70 65 28 70 43 74  sult_subtype(pCt
35f0: 78 2c 20 4a 53 4f 4e 5f 53 55 42 54 59 50 45 29  x, JSON_SUBTYPE)
3600: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
3610: 74 68 65 20 4a 73 6f 6e 4e 6f 64 65 20 74 68 65  the JsonNode the
3620: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
3630: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a   the function..*
3640: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73  /.static void js
3650: 6f 6e 52 65 74 75 72 6e 28 0a 20 20 4a 73 6f 6e  onReturn(.  Json
3660: 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 20 20 20 20  Node *pNode,    
3670: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 64 65 20          /* Node 
3680: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73  to return */.  s
3690: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
36a0: 70 43 74 78 2c 20 20 20 20 20 20 2f 2a 20 52 65  pCtx,      /* Re
36b0: 74 75 72 6e 20 76 61 6c 75 65 20 66 6f 72 20 74  turn value for t
36c0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
36d0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
36e0: 2a 2a 61 52 65 70 6c 61 63 65 20 20 20 20 2f 2a  **aReplace    /*
36f0: 20 41 72 72 61 79 20 6f 66 20 72 65 70 6c 61 63   Array of replac
3700: 65 6d 65 6e 74 20 76 61 6c 75 65 73 20 2a 2f 0a  ement values */.
3710: 29 7b 0a 20 20 73 77 69 74 63 68 28 20 70 4e 6f  ){.  switch( pNo
3720: 64 65 2d 3e 65 54 79 70 65 20 29 7b 0a 20 20 20  de->eType ){.   
3730: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
3740: 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d    assert( pNode-
3750: 3e 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f 4e 55 4c  >eType==JSON_NUL
3760: 4c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  L );.      sqlit
3770: 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 28 70  e3_result_null(p
3780: 43 74 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Ctx);.      brea
3790: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
37a0: 65 20 4a 53 4f 4e 5f 54 52 55 45 3a 20 7b 0a 20  e JSON_TRUE: {. 
37b0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
37c0: 75 6c 74 5f 69 6e 74 28 70 43 74 78 2c 20 31 29  ult_int(pCtx, 1)
37d0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
37e0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 53     }.    case JS
37f0: 4f 4e 5f 46 41 4c 53 45 3a 20 7b 0a 20 20 20 20  ON_FALSE: {.    
3800: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
3810: 5f 69 6e 74 28 70 43 74 78 2c 20 30 29 3b 0a 20  _int(pCtx, 0);. 
3820: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3830: 7d 0a 20 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f  }.    case JSON_
3840: 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20 64 6f  REAL: {.      do
3850: 75 62 6c 65 20 72 20 3d 20 73 74 72 74 6f 64 28  uble r = strtod(
3860: 70 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74 65  pNode->u.zJConte
3870: 6e 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  nt, 0);.      sq
3880: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75  lite3_result_dou
3890: 62 6c 65 28 70 43 74 78 2c 20 72 29 3b 0a 20 20  ble(pCtx, r);.  
38a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
38b0: 0a 20 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f 49  .    case JSON_I
38c0: 4e 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  NT: {.      sqli
38d0: 74 65 33 5f 69 6e 74 36 34 20 69 20 3d 20 30 3b  te3_int64 i = 0;
38e0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
38f0: 72 20 2a 7a 20 3d 20 70 4e 6f 64 65 2d 3e 75 2e  r *z = pNode->u.
3900: 7a 4a 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20  zJContent;.     
3910: 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29   if( z[0]=='-' )
3920: 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 77  { z++; }.      w
3930: 68 69 6c 65 28 20 7a 5b 30 5d 3e 3d 27 30 27 20  hile( z[0]>='0' 
3940: 26 26 20 7a 5b 30 5d 3c 3d 27 39 27 20 29 7b 20  && z[0]<='9' ){ 
3950: 69 20 3d 20 69 2a 31 30 20 2b 20 2a 28 7a 2b 2b  i = i*10 + *(z++
3960: 29 20 2d 20 27 30 27 3b 20 7d 0a 20 20 20 20 20  ) - '0'; }.     
3970: 20 69 66 28 20 70 4e 6f 64 65 2d 3e 75 2e 7a 4a   if( pNode->u.zJ
3980: 43 6f 6e 74 65 6e 74 5b 30 5d 3d 3d 27 2d 27 20  Content[0]=='-' 
3990: 29 7b 20 69 20 3d 20 2d 69 3b 20 7d 0a 20 20 20  ){ i = -i; }.   
39a0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
39b0: 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 69 29  t_int64(pCtx, i)
39c0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
39d0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 53     }.    case JS
39e0: 4f 4e 5f 53 54 52 49 4e 47 3a 20 7b 0a 23 69 66  ON_STRING: {.#if
39f0: 20 30 20 2f 2a 20 4e 65 76 65 72 20 68 61 70 70   0 /* Never happ
3a00: 65 6e 73 20 62 65 63 61 75 73 65 20 4a 4e 4f 44  ens because JNOD
3a10: 45 5f 52 41 57 20 69 73 20 6f 6e 6c 79 20 73 65  E_RAW is only se
3a20: 74 20 62 79 20 6a 73 6f 6e 5f 73 65 74 28 29 2c  t by json_set(),
3a30: 0a 20 20 20 20 20 20 2a 2a 20 6a 73 6f 6e 5f 69  .      ** json_i
3a40: 6e 73 65 72 74 28 29 20 61 6e 64 20 6a 73 6f 6e  nsert() and json
3a50: 5f 72 65 70 6c 61 63 65 28 29 20 61 6e 64 20 74  _replace() and t
3a60: 68 6f 73 65 20 72 6f 75 74 69 6e 65 73 20 64 6f  hose routines do
3a70: 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 63 61   not.      ** ca
3a80: 6c 6c 20 6a 73 6f 6e 52 65 74 75 72 6e 28 29 20  ll jsonReturn() 
3a90: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4e 6f  */.      if( pNo
3aa0: 64 65 2d 3e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e  de->jnFlags & JN
3ab0: 4f 44 45 5f 52 41 57 20 29 7b 0a 20 20 20 20 20  ODE_RAW ){.     
3ac0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
3ad0: 74 5f 74 65 78 74 28 70 43 74 78 2c 20 70 4e 6f  t_text(pCtx, pNo
3ae0: 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 2c  de->u.zJContent,
3af0: 20 70 4e 6f 64 65 2d 3e 6e 2c 0a 20 20 20 20 20   pNode->n,.     
3b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b10: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 52         SQLITE_TR
3b20: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20  ANSIENT);.      
3b30: 7d 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20 20  }else .#endif.  
3b40: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4e 6f      assert( (pNo
3b50: 64 65 2d 3e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e  de->jnFlags & JN
3b60: 4f 44 45 5f 52 41 57 29 3d 3d 30 20 29 3b 0a 20  ODE_RAW)==0 );. 
3b70: 20 20 20 20 20 69 66 28 20 28 70 4e 6f 64 65 2d       if( (pNode-
3b80: 3e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45  >jnFlags & JNODE
3b90: 5f 45 53 43 41 50 45 29 3d 3d 30 20 29 7b 0a 20  _ESCAPE)==0 ){. 
3ba0: 20 20 20 20 20 20 20 2f 2a 20 4a 53 4f 4e 20 66         /* JSON f
3bb0: 6f 72 6d 61 74 74 65 64 20 77 69 74 68 6f 75 74  ormatted without
3bc0: 20 61 6e 79 20 62 61 63 6b 73 6c 61 73 68 2d 65   any backslash-e
3bd0: 73 63 61 70 65 73 20 2a 2f 0a 20 20 20 20 20 20  scapes */.      
3be0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
3bf0: 5f 74 65 78 74 28 70 43 74 78 2c 20 70 4e 6f 64  _text(pCtx, pNod
3c00: 65 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 2b 31  e->u.zJContent+1
3c10: 2c 20 70 4e 6f 64 65 2d 3e 6e 2d 32 2c 0a 20 20  , pNode->n-2,.  
3c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c30: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
3c40: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
3c50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3c60: 20 20 2f 2a 20 54 72 61 6e 73 6c 61 74 65 20 4a    /* Translate J
3c70: 53 4f 4e 20 66 6f 72 6d 61 74 74 65 64 20 73 74  SON formatted st
3c80: 72 69 6e 67 20 69 6e 74 6f 20 72 61 77 20 74 65  ring into raw te
3c90: 78 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33  xt */.        u3
3ca0: 32 20 69 3b 0a 20 20 20 20 20 20 20 20 75 33 32  2 i;.        u32
3cb0: 20 6e 20 3d 20 70 4e 6f 64 65 2d 3e 6e 3b 0a 20   n = pNode->n;. 
3cc0: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
3cd0: 72 20 2a 7a 20 3d 20 70 4e 6f 64 65 2d 3e 75 2e  r *z = pNode->u.
3ce0: 7a 4a 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20  zJContent;.     
3cf0: 20 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 20     char *zOut;. 
3d00: 20 20 20 20 20 20 20 75 33 32 20 6a 3b 0a 20 20         u32 j;.  
3d10: 20 20 20 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c        zOut = sql
3d20: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 2b 31  ite3_malloc( n+1
3d30: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
3d40: 7a 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zOut==0 ){.     
3d50: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
3d60: 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28  ult_error_nomem(
3d70: 70 43 74 78 29 3b 0a 20 20 20 20 20 20 20 20 20  pCtx);.         
3d80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
3d90: 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  }.        for(i=
3da0: 31 2c 20 6a 3d 30 3b 20 69 3c 6e 2d 31 3b 20 69  1, j=0; i<n-1; i
3db0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  ++){.          c
3dc0: 68 61 72 20 63 20 3d 20 7a 5b 69 5d 3b 0a 20 20  har c = z[i];.  
3dd0: 20 20 20 20 20 20 20 20 69 66 28 20 63 21 3d 27          if( c!='
3de0: 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  \\' ){.         
3df0: 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 63     zOut[j++] = c
3e00: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
3e10: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  e{.            c
3e20: 20 3d 20 7a 5b 2b 2b 69 5d 3b 0a 20 20 20 20 20   = z[++i];.     
3e30: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 75         if( c=='u
3e40: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ' ){.           
3e50: 20 20 20 75 33 32 20 76 20 3d 20 30 2c 20 6b 3b     u32 v = 0, k;
3e60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  .              f
3e70: 6f 72 28 6b 3d 30 3b 20 6b 3c 34 20 26 26 20 69  or(k=0; k<4 && i
3e80: 3c 6e 2d 32 3b 20 69 2b 2b 2c 20 6b 2b 2b 29 7b  <n-2; i++, k++){
3e90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3ea0: 20 63 20 3d 20 7a 5b 69 2b 31 5d 3b 0a 20 20 20   c = z[i+1];.   
3eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
3ec0: 20 63 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27 39   c>='0' && c<='9
3ed0: 27 20 29 20 76 20 3d 20 76 2a 31 36 20 2b 20 63  ' ) v = v*16 + c
3ee0: 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20   - '0';.        
3ef0: 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 28          else if(
3f00: 20 63 3e 3d 27 41 27 20 26 26 20 63 3c 3d 27 46   c>='A' && c<='F
3f10: 27 20 29 20 76 20 3d 20 76 2a 31 36 20 2b 20 63  ' ) v = v*16 + c
3f20: 20 2d 20 27 41 27 20 2b 20 31 30 3b 0a 20 20 20   - 'A' + 10;.   
3f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73               els
3f40: 65 20 69 66 28 20 63 3e 3d 27 61 27 20 26 26 20  e if( c>='a' && 
3f50: 63 3c 3d 27 66 27 20 29 20 76 20 3d 20 76 2a 31  c<='f' ) v = v*1
3f60: 36 20 2b 20 63 20 2d 20 27 61 27 20 2b 20 31 30  6 + c - 'a' + 10
3f70: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3f80: 20 20 65 6c 73 65 20 62 72 65 61 6b 3b 0a 20 20    else break;.  
3f90: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
3fa0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
3fb0: 76 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  v==0 ) break;.  
3fc0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
3fd0: 76 3c 3d 30 78 37 66 20 29 7b 0a 20 20 20 20 20  v<=0x7f ){.     
3fe0: 20 20 20 20 20 20 20 20 20 20 20 7a 4f 75 74 5b             zOut[
3ff0: 6a 2b 2b 5d 20 3d 20 28 63 68 61 72 29 76 3b 0a  j++] = (char)v;.
4000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65                }e
4010: 6c 73 65 20 69 66 28 20 76 3c 3d 30 78 37 66 66  lse if( v<=0x7ff
4020: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
4030: 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20      zOut[j++] = 
4040: 28 63 68 61 72 29 28 30 78 63 30 20 7c 20 28 76  (char)(0xc0 | (v
4050: 3e 3e 36 29 29 3b 0a 20 20 20 20 20 20 20 20 20  >>6));.         
4060: 20 20 20 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d         zOut[j++]
4070: 20 3d 20 30 78 38 30 20 7c 20 28 76 26 30 78 33   = 0x80 | (v&0x3
4080: 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  f);.            
4090: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
40a0: 20 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 6a 2b           zOut[j+
40b0: 2b 5d 20 3d 20 28 63 68 61 72 29 28 30 78 65 30  +] = (char)(0xe0
40c0: 20 7c 20 28 76 3e 3e 31 32 29 29 3b 0a 20 20 20   | (v>>12));.   
40d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4f 75               zOu
40e0: 74 5b 6a 2b 2b 5d 20 3d 20 30 78 38 30 20 7c 20  t[j++] = 0x80 | 
40f0: 28 28 76 3e 3e 36 29 26 30 78 33 66 29 3b 0a 20  ((v>>6)&0x3f);. 
4100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
4110: 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 30 78 38 30 20  Out[j++] = 0x80 
4120: 7c 20 28 76 26 30 78 33 66 29 3b 0a 20 20 20 20  | (v&0x3f);.    
4130: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
4140: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
4150: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
4160: 20 63 3d 3d 27 62 27 20 29 7b 0a 20 20 20 20 20   c=='b' ){.     
4170: 20 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 27             c = '
4180: 5c 62 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20  \b';.           
4190: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
41a0: 27 66 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  'f' ){.         
41b0: 20 20 20 20 20 20 20 63 20 3d 20 27 5c 66 27 3b         c = '\f';
41c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
41d0: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 6e 27 20  else if( c=='n' 
41e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
41f0: 20 20 20 63 20 3d 20 27 5c 6e 27 3b 0a 20 20 20     c = '\n';.   
4200: 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
4210: 20 69 66 28 20 63 3d 3d 27 72 27 20 29 7b 0a 20   if( c=='r' ){. 
4220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
4230: 20 3d 20 27 5c 72 27 3b 0a 20 20 20 20 20 20 20   = '\r';.       
4240: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
4250: 20 63 3d 3d 27 74 27 20 29 7b 0a 20 20 20 20 20   c=='t' ){.     
4260: 20 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 27             c = '
4270: 5c 74 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20  \t';.           
4280: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
4290: 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 63     zOut[j++] = c
42a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
42b0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
42c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 4f      }.        zO
42d0: 75 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 20  ut[j] = 0;.     
42e0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
42f0: 74 5f 74 65 78 74 28 70 43 74 78 2c 20 7a 4f 75  t_text(pCtx, zOu
4300: 74 2c 20 6a 2c 20 73 71 6c 69 74 65 33 5f 66 72  t, j, sqlite3_fr
4310: 65 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ee);.      }.   
4320: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4330: 20 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f 41 52      case JSON_AR
4340: 52 41 59 3a 0a 20 20 20 20 63 61 73 65 20 4a 53  RAY:.    case JS
4350: 4f 4e 5f 4f 42 4a 45 43 54 3a 20 7b 0a 20 20 20  ON_OBJECT: {.   
4360: 20 20 20 6a 73 6f 6e 52 65 74 75 72 6e 4a 73 6f     jsonReturnJso
4370: 6e 28 70 4e 6f 64 65 2c 20 70 43 74 78 2c 20 61  n(pNode, pCtx, a
4380: 52 65 70 6c 61 63 65 29 3b 0a 20 20 20 20 20 20  Replace);.      
4390: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
43a0: 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72  .}../* Forward r
43b0: 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74  eference */.stat
43c0: 69 63 20 69 6e 74 20 6a 73 6f 6e 50 61 72 73 65  ic int jsonParse
43d0: 41 64 64 4e 6f 64 65 28 4a 73 6f 6e 50 61 72 73  AddNode(JsonPars
43e0: 65 2a 2c 75 33 32 2c 75 33 32 2c 63 6f 6e 73 74  e*,u32,u32,const
43f0: 20 63 68 61 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20   char*);../*.** 
4400: 41 20 6d 61 63 72 6f 20 74 6f 20 68 69 6e 74 20  A macro to hint 
4410: 74 6f 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  to the compiler 
4420: 74 68 61 74 20 61 20 66 75 6e 63 74 69 6f 6e 20  that a function 
4430: 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a  should not be.**
4440: 20 69 6e 6c 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66   inlined..*/.#if
4450: 20 64 65 66 69 6e 65 64 28 5f 5f 47 4e 55 43 5f   defined(__GNUC_
4460: 5f 29 0a 23 20 20 64 65 66 69 6e 65 20 4a 53 4f  _).#  define JSO
4470: 4e 5f 4e 4f 49 4e 4c 49 4e 45 20 20 5f 5f 61 74  N_NOINLINE  __at
4480: 74 72 69 62 75 74 65 5f 5f 28 28 6e 6f 69 6e 6c  tribute__((noinl
4490: 69 6e 65 29 29 0a 23 65 6c 69 66 20 64 65 66 69  ine)).#elif defi
44a0: 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29 20 26 26  ned(_MSC_VER) &&
44b0: 20 5f 4d 53 43 5f 56 45 52 3e 3d 31 33 31 30 0a   _MSC_VER>=1310.
44c0: 23 20 20 64 65 66 69 6e 65 20 4a 53 4f 4e 5f 4e  #  define JSON_N
44d0: 4f 49 4e 4c 49 4e 45 20 20 5f 5f 64 65 63 6c 73  OINLINE  __decls
44e0: 70 65 63 28 6e 6f 69 6e 6c 69 6e 65 29 0a 23 65  pec(noinline).#e
44f0: 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 4a 53  lse.#  define JS
4500: 4f 4e 5f 4e 4f 49 4e 4c 49 4e 45 0a 23 65 6e 64  ON_NOINLINE.#end
4510: 69 66 0a 0a 0a 73 74 61 74 69 63 20 4a 53 4f 4e  if...static JSON
4520: 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 6a 73  _NOINLINE int js
4530: 6f 6e 50 61 72 73 65 41 64 64 4e 6f 64 65 45 78  onParseAddNodeEx
4540: 70 61 6e 64 28 0a 20 20 4a 73 6f 6e 50 61 72 73  pand(.  JsonPars
4550: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
4560: 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20    /* Append the 
4570: 6e 6f 64 65 20 74 6f 20 74 68 69 73 20 6f 62 6a  node to this obj
4580: 65 63 74 20 2a 2f 0a 20 20 75 33 32 20 65 54 79  ect */.  u32 eTy
4590: 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
45a0: 20 20 20 2f 2a 20 4e 6f 64 65 20 74 79 70 65 20     /* Node type 
45b0: 2a 2f 0a 20 20 75 33 32 20 6e 2c 20 20 20 20 20  */.  u32 n,     
45c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
45d0: 2a 20 43 6f 6e 74 65 6e 74 20 73 69 7a 65 20 6f  * Content size o
45e0: 72 20 73 75 62 2d 6e 6f 64 65 20 63 6f 75 6e 74  r sub-node count
45f0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
4600: 20 2a 7a 43 6f 6e 74 65 6e 74 20 20 20 20 20 20   *zContent      
4610: 2f 2a 20 43 6f 6e 74 65 6e 74 20 2a 2f 0a 29 7b  /* Content */.){
4620: 0a 20 20 75 33 32 20 6e 4e 65 77 3b 0a 20 20 4a  .  u32 nNew;.  J
4630: 73 6f 6e 4e 6f 64 65 20 2a 70 4e 65 77 3b 0a 20  sonNode *pNew;. 
4640: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
4650: 3e 6e 4e 6f 64 65 3e 3d 70 50 61 72 73 65 2d 3e  >nNode>=pParse->
4660: 6e 41 6c 6c 6f 63 20 29 3b 0a 20 20 69 66 28 20  nAlloc );.  if( 
4670: 70 50 61 72 73 65 2d 3e 6f 6f 6d 20 29 20 72 65  pParse->oom ) re
4680: 74 75 72 6e 20 2d 31 3b 0a 20 20 6e 4e 65 77 20  turn -1;.  nNew 
4690: 3d 20 70 50 61 72 73 65 2d 3e 6e 41 6c 6c 6f 63  = pParse->nAlloc
46a0: 2a 32 20 2b 20 31 30 3b 0a 20 20 70 4e 65 77 20  *2 + 10;.  pNew 
46b0: 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  = sqlite3_reallo
46c0: 63 28 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65 2c  c(pParse->aNode,
46d0: 20 73 69 7a 65 6f 66 28 4a 73 6f 6e 4e 6f 64 65   sizeof(JsonNode
46e0: 29 2a 6e 4e 65 77 29 3b 0a 20 20 69 66 28 20 70  )*nNew);.  if( p
46f0: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50  New==0 ){.    pP
4700: 61 72 73 65 2d 3e 6f 6f 6d 20 3d 20 31 3b 0a 20  arse->oom = 1;. 
4710: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
4720: 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 41 6c 6c  }.  pParse->nAll
4730: 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20 20 70 50 61  oc = nNew;.  pPa
4740: 72 73 65 2d 3e 61 4e 6f 64 65 20 3d 20 70 4e 65  rse->aNode = pNe
4750: 77 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  w;.  assert( pPa
4760: 72 73 65 2d 3e 6e 4e 6f 64 65 3c 70 50 61 72 73  rse->nNode<pPars
4770: 65 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 20 20 72  e->nAlloc );.  r
4780: 65 74 75 72 6e 20 6a 73 6f 6e 50 61 72 73 65 41  eturn jsonParseA
4790: 64 64 4e 6f 64 65 28 70 50 61 72 73 65 2c 20 65  ddNode(pParse, e
47a0: 54 79 70 65 2c 20 6e 2c 20 7a 43 6f 6e 74 65 6e  Type, n, zConten
47b0: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  t);.}../*.** Cre
47c0: 61 74 65 20 61 20 6e 65 77 20 4a 73 6f 6e 4e 6f  ate a new JsonNo
47d0: 64 65 20 69 6e 73 74 61 6e 63 65 20 62 61 73 65  de instance base
47e0: 64 20 6f 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  d on the argumen
47f0: 74 73 20 61 6e 64 20 61 70 70 65 6e 64 20 74 68  ts and append th
4800: 61 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 74  at.** instance t
4810: 6f 20 74 68 65 20 4a 73 6f 6e 50 61 72 73 65 2e  o the JsonParse.
4820: 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64    Return the ind
4830: 65 78 20 69 6e 20 70 50 61 72 73 65 2d 3e 61 4e  ex in pParse->aN
4840: 6f 64 65 5b 5d 20 6f 66 20 74 68 65 0a 2a 2a 20  ode[] of the.** 
4850: 6e 65 77 20 6e 6f 64 65 2c 20 6f 72 20 2d 31 20  new node, or -1 
4860: 69 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  if a memory allo
4870: 63 61 74 69 6f 6e 20 66 61 69 6c 73 2e 0a 2a 2f  cation fails..*/
4880: 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e  .static int json
4890: 50 61 72 73 65 41 64 64 4e 6f 64 65 28 0a 20 20  ParseAddNode(.  
48a0: 4a 73 6f 6e 50 61 72 73 65 20 2a 70 50 61 72 73  JsonParse *pPars
48b0: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 41 70 70  e,        /* App
48c0: 65 6e 64 20 74 68 65 20 6e 6f 64 65 20 74 6f 20  end the node to 
48d0: 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  this object */. 
48e0: 20 75 33 32 20 65 54 79 70 65 2c 20 20 20 20 20   u32 eType,     
48f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
4900: 64 65 20 74 79 70 65 20 2a 2f 0a 20 20 75 33 32  de type */.  u32
4910: 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   n,             
4920: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e         /* Conten
4930: 74 20 73 69 7a 65 20 6f 72 20 73 75 62 2d 6e 6f  t size or sub-no
4940: 64 65 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 63 6f  de count */.  co
4950: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65  nst char *zConte
4960: 6e 74 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65  nt      /* Conte
4970: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 4a 73 6f 6e 4e  nt */.){.  JsonN
4980: 6f 64 65 20 2a 70 3b 0a 20 20 69 66 28 20 70 50  ode *p;.  if( pP
4990: 61 72 73 65 2d 3e 6e 4e 6f 64 65 3e 3d 70 50 61  arse->nNode>=pPa
49a0: 72 73 65 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20  rse->nAlloc ){. 
49b0: 20 20 20 72 65 74 75 72 6e 20 6a 73 6f 6e 50 61     return jsonPa
49c0: 72 73 65 41 64 64 4e 6f 64 65 45 78 70 61 6e 64  rseAddNodeExpand
49d0: 28 70 50 61 72 73 65 2c 20 65 54 79 70 65 2c 20  (pParse, eType, 
49e0: 6e 2c 20 7a 43 6f 6e 74 65 6e 74 29 3b 0a 20 20  n, zContent);.  
49f0: 7d 0a 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d  }.  p = &pParse-
4a00: 3e 61 4e 6f 64 65 5b 70 50 61 72 73 65 2d 3e 6e  >aNode[pParse->n
4a10: 4e 6f 64 65 5d 3b 0a 20 20 70 2d 3e 65 54 79 70  Node];.  p->eTyp
4a20: 65 20 3d 20 28 75 38 29 65 54 79 70 65 3b 0a 20  e = (u8)eType;. 
4a30: 20 70 2d 3e 6a 6e 46 6c 61 67 73 20 3d 20 30 3b   p->jnFlags = 0;
4a40: 0a 20 20 70 2d 3e 69 56 61 6c 20 3d 20 30 3b 0a  .  p->iVal = 0;.
4a50: 20 20 70 2d 3e 6e 20 3d 20 6e 3b 0a 20 20 70 2d    p->n = n;.  p-
4a60: 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 20 3d 20 7a  >u.zJContent = z
4a70: 43 6f 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75 72  Content;.  retur
4a80: 6e 20 70 50 61 72 73 65 2d 3e 6e 4e 6f 64 65 2b  n pParse->nNode+
4a90: 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73  +;.}../*.** Pars
4aa0: 65 20 61 20 73 69 6e 67 6c 65 20 4a 53 4f 4e 20  e a single JSON 
4ab0: 76 61 6c 75 65 20 77 68 69 63 68 20 62 65 67 69  value which begi
4ac0: 6e 73 20 61 74 20 70 50 61 72 73 65 2d 3e 7a 4a  ns at pParse->zJ
4ad0: 73 6f 6e 5b 69 5d 2e 20 20 52 65 74 75 72 6e 20  son[i].  Return 
4ae0: 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20  the.** index of 
4af0: 74 68 65 20 66 69 72 73 74 20 63 68 61 72 61 63  the first charac
4b00: 74 65 72 20 70 61 73 74 20 74 68 65 20 65 6e 64  ter past the end
4b10: 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 70 61   of the value pa
4b20: 72 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  rsed..**.** Retu
4b30: 72 6e 20 6e 65 67 61 74 69 76 65 20 66 6f 72 20  rn negative for 
4b40: 61 20 73 79 6e 74 61 78 20 65 72 72 6f 72 2e 20  a syntax error. 
4b50: 20 53 70 65 63 69 61 6c 20 63 61 73 65 73 3a 20   Special cases: 
4b60: 20 72 65 74 75 72 6e 20 2d 32 20 69 66 20 74 68   return -2 if th
4b70: 65 0a 2a 2a 20 66 69 72 73 74 20 6e 6f 6e 2d 77  e.** first non-w
4b80: 68 69 74 65 73 70 61 63 65 20 63 68 61 72 61 63  hitespace charac
4b90: 74 65 72 20 69 73 20 27 7d 27 20 61 6e 64 20 72  ter is '}' and r
4ba0: 65 74 75 72 6e 20 2d 33 20 69 66 20 74 68 65 20  eturn -3 if the 
4bb0: 66 69 72 73 74 0a 2a 2a 20 6e 6f 6e 2d 77 68 69  first.** non-whi
4bc0: 74 65 73 70 61 63 65 20 63 68 61 72 61 63 74 65  tespace characte
4bd0: 72 20 69 73 20 27 5d 27 2e 0a 2a 2f 0a 73 74 61  r is ']'..*/.sta
4be0: 74 69 63 20 69 6e 74 20 6a 73 6f 6e 50 61 72 73  tic int jsonPars
4bf0: 65 56 61 6c 75 65 28 4a 73 6f 6e 50 61 72 73 65  eValue(JsonParse
4c00: 20 2a 70 50 61 72 73 65 2c 20 75 33 32 20 69 29   *pParse, u32 i)
4c10: 7b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 75 33  {.  char c;.  u3
4c20: 32 20 6a 3b 0a 20 20 69 6e 74 20 69 54 68 69 73  2 j;.  int iThis
4c30: 3b 0a 20 20 69 6e 74 20 78 3b 0a 20 20 4a 73 6f  ;.  int x;.  Jso
4c40: 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 3b 0a 20 20  nNode *pNode;.  
4c50: 77 68 69 6c 65 28 20 73 61 66 65 5f 69 73 73 70  while( safe_issp
4c60: 61 63 65 28 70 50 61 72 73 65 2d 3e 7a 4a 73 6f  ace(pParse->zJso
4c70: 6e 5b 69 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d 0a  n[i]) ){ i++; }.
4c80: 20 20 69 66 28 20 28 63 20 3d 20 70 50 61 72 73    if( (c = pPars
4c90: 65 2d 3e 7a 4a 73 6f 6e 5b 69 5d 29 3d 3d 27 7b  e->zJson[i])=='{
4ca0: 27 20 29 7b 0a 20 20 20 20 2f 2a 20 50 61 72 73  ' ){.    /* Pars
4cb0: 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20  e object */.    
4cc0: 69 54 68 69 73 20 3d 20 6a 73 6f 6e 50 61 72 73  iThis = jsonPars
4cd0: 65 41 64 64 4e 6f 64 65 28 70 50 61 72 73 65 2c  eAddNode(pParse,
4ce0: 20 4a 53 4f 4e 5f 4f 42 4a 45 43 54 2c 20 30 2c   JSON_OBJECT, 0,
4cf0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 69 54 68   0);.    if( iTh
4d00: 69 73 3c 30 20 29 20 72 65 74 75 72 6e 20 2d 31  is<0 ) return -1
4d10: 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b  ;.    for(j=i+1;
4d20: 3b 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 69  ;j++){.      whi
4d30: 6c 65 28 20 73 61 66 65 5f 69 73 73 70 61 63 65  le( safe_isspace
4d40: 28 70 50 61 72 73 65 2d 3e 7a 4a 73 6f 6e 5b 6a  (pParse->zJson[j
4d50: 5d 29 20 29 7b 20 6a 2b 2b 3b 20 7d 0a 20 20 20  ]) ){ j++; }.   
4d60: 20 20 20 78 20 3d 20 6a 73 6f 6e 50 61 72 73 65     x = jsonParse
4d70: 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 6a 29  Value(pParse, j)
4d80: 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3c 30 20  ;.      if( x<0 
4d90: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 78  ){.        if( x
4da0: 3d 3d 28 2d 32 29 20 26 26 20 70 50 61 72 73 65  ==(-2) && pParse
4db0: 2d 3e 6e 4e 6f 64 65 3d 3d 28 75 33 32 29 69 54  ->nNode==(u32)iT
4dc0: 68 69 73 2b 31 20 29 20 72 65 74 75 72 6e 20 6a  his+1 ) return j
4dd0: 2b 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  +1;.        retu
4de0: 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20  rn -1;.      }. 
4df0: 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
4e00: 3e 6f 6f 6d 20 29 20 72 65 74 75 72 6e 20 2d 31  >oom ) return -1
4e10: 3b 0a 20 20 20 20 20 20 70 4e 6f 64 65 20 3d 20  ;.      pNode = 
4e20: 26 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65 5b 70  &pParse->aNode[p
4e30: 50 61 72 73 65 2d 3e 6e 4e 6f 64 65 2d 31 5d 3b  Parse->nNode-1];
4e40: 0a 20 20 20 20 20 20 69 66 28 20 70 4e 6f 64 65  .      if( pNode
4e50: 2d 3e 65 54 79 70 65 21 3d 4a 53 4f 4e 5f 53 54  ->eType!=JSON_ST
4e60: 52 49 4e 47 20 29 20 72 65 74 75 72 6e 20 2d 31  RING ) return -1
4e70: 3b 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 6a  ;.      pNode->j
4e80: 6e 46 6c 61 67 73 20 7c 3d 20 4a 4e 4f 44 45 5f  nFlags |= JNODE_
4e90: 4c 41 42 45 4c 3b 0a 20 20 20 20 20 20 6a 20 3d  LABEL;.      j =
4ea0: 20 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   x;.      while(
4eb0: 20 73 61 66 65 5f 69 73 73 70 61 63 65 28 70 50   safe_isspace(pP
4ec0: 61 72 73 65 2d 3e 7a 4a 73 6f 6e 5b 6a 5d 29 20  arse->zJson[j]) 
4ed0: 29 7b 20 6a 2b 2b 3b 20 7d 0a 20 20 20 20 20 20  ){ j++; }.      
4ee0: 69 66 28 20 70 50 61 72 73 65 2d 3e 7a 4a 73 6f  if( pParse->zJso
4ef0: 6e 5b 6a 5d 21 3d 27 3a 27 20 29 20 72 65 74 75  n[j]!=':' ) retu
4f00: 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 6a 2b 2b  rn -1;.      j++
4f10: 3b 0a 20 20 20 20 20 20 78 20 3d 20 6a 73 6f 6e  ;.      x = json
4f20: 50 61 72 73 65 56 61 6c 75 65 28 70 50 61 72 73  ParseValue(pPars
4f30: 65 2c 20 6a 29 3b 0a 20 20 20 20 20 20 69 66 28  e, j);.      if(
4f40: 20 78 3c 30 20 29 20 72 65 74 75 72 6e 20 2d 31   x<0 ) return -1
4f50: 3b 0a 20 20 20 20 20 20 6a 20 3d 20 78 3b 0a 20  ;.      j = x;. 
4f60: 20 20 20 20 20 77 68 69 6c 65 28 20 73 61 66 65       while( safe
4f70: 5f 69 73 73 70 61 63 65 28 70 50 61 72 73 65 2d  _isspace(pParse-
4f80: 3e 7a 4a 73 6f 6e 5b 6a 5d 29 20 29 7b 20 6a 2b  >zJson[j]) ){ j+
4f90: 2b 3b 20 7d 0a 20 20 20 20 20 20 63 20 3d 20 70  +; }.      c = p
4fa0: 50 61 72 73 65 2d 3e 7a 4a 73 6f 6e 5b 6a 5d 3b  Parse->zJson[j];
4fb0: 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 2c  .      if( c==',
4fc0: 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ' ) continue;.  
4fd0: 20 20 20 20 69 66 28 20 63 21 3d 27 7d 27 20 29      if( c!='}' )
4fe0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
4ff0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
5000: 20 20 20 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65     pParse->aNode
5010: 5b 69 54 68 69 73 5d 2e 6e 20 3d 20 70 50 61 72  [iThis].n = pPar
5020: 73 65 2d 3e 6e 4e 6f 64 65 20 2d 20 28 75 33 32  se->nNode - (u32
5030: 29 69 54 68 69 73 20 2d 20 31 3b 0a 20 20 20 20  )iThis - 1;.    
5040: 72 65 74 75 72 6e 20 6a 2b 31 3b 0a 20 20 7d 65  return j+1;.  }e
5050: 6c 73 65 20 69 66 28 20 63 3d 3d 27 5b 27 20 29  lse if( c=='[' )
5060: 7b 0a 20 20 20 20 2f 2a 20 50 61 72 73 65 20 61  {.    /* Parse a
5070: 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 54 68 69  rray */.    iThi
5080: 73 20 3d 20 6a 73 6f 6e 50 61 72 73 65 41 64 64  s = jsonParseAdd
5090: 4e 6f 64 65 28 70 50 61 72 73 65 2c 20 4a 53 4f  Node(pParse, JSO
50a0: 4e 5f 41 52 52 41 59 2c 20 30 2c 20 30 29 3b 0a  N_ARRAY, 0, 0);.
50b0: 20 20 20 20 69 66 28 20 69 54 68 69 73 3c 30 20      if( iThis<0 
50c0: 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
50d0: 20 66 6f 72 28 6a 3d 69 2b 31 3b 3b 6a 2b 2b 29   for(j=i+1;;j++)
50e0: 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 73  {.      while( s
50f0: 61 66 65 5f 69 73 73 70 61 63 65 28 70 50 61 72  afe_isspace(pPar
5100: 73 65 2d 3e 7a 4a 73 6f 6e 5b 6a 5d 29 20 29 7b  se->zJson[j]) ){
5110: 20 6a 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 78 20   j++; }.      x 
5120: 3d 20 6a 73 6f 6e 50 61 72 73 65 56 61 6c 75 65  = jsonParseValue
5130: 28 70 50 61 72 73 65 2c 20 6a 29 3b 0a 20 20 20  (pParse, j);.   
5140: 20 20 20 69 66 28 20 78 3c 30 20 29 7b 0a 20 20     if( x<0 ){.  
5150: 20 20 20 20 20 20 69 66 28 20 78 3d 3d 28 2d 33        if( x==(-3
5160: 29 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 4e 6f  ) && pParse->nNo
5170: 64 65 3d 3d 28 75 33 32 29 69 54 68 69 73 2b 31  de==(u32)iThis+1
5180: 20 29 20 72 65 74 75 72 6e 20 6a 2b 31 3b 0a 20   ) return j+1;. 
5190: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31         return -1
51a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
51b0: 6a 20 3d 20 78 3b 0a 20 20 20 20 20 20 77 68 69  j = x;.      whi
51c0: 6c 65 28 20 73 61 66 65 5f 69 73 73 70 61 63 65  le( safe_isspace
51d0: 28 70 50 61 72 73 65 2d 3e 7a 4a 73 6f 6e 5b 6a  (pParse->zJson[j
51e0: 5d 29 20 29 7b 20 6a 2b 2b 3b 20 7d 0a 20 20 20  ]) ){ j++; }.   
51f0: 20 20 20 63 20 3d 20 70 50 61 72 73 65 2d 3e 7a     c = pParse->z
5200: 4a 73 6f 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 69  Json[j];.      i
5210: 66 28 20 63 3d 3d 27 2c 27 20 29 20 63 6f 6e 74  f( c==',' ) cont
5220: 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
5230: 63 21 3d 27 5d 27 20 29 20 72 65 74 75 72 6e 20  c!=']' ) return 
5240: 2d 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  -1;.      break;
5250: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
5260: 65 2d 3e 61 4e 6f 64 65 5b 69 54 68 69 73 5d 2e  e->aNode[iThis].
5270: 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4e 6f 64  n = pParse->nNod
5280: 65 20 2d 20 28 75 33 32 29 69 54 68 69 73 20 2d  e - (u32)iThis -
5290: 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6a   1;.    return j
52a0: 2b 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  +1;.  }else if( 
52b0: 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 2f 2a  c=='"' ){.    /*
52c0: 20 50 61 72 73 65 20 73 74 72 69 6e 67 20 2a 2f   Parse string */
52d0: 0a 20 20 20 20 75 38 20 6a 6e 46 6c 61 67 73 20  .    u8 jnFlags 
52e0: 3d 20 30 3b 0a 20 20 20 20 6a 20 3d 20 69 2b 31  = 0;.    j = i+1
52f0: 3b 0a 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20  ;.    for(;;){. 
5300: 20 20 20 20 20 63 20 3d 20 70 50 61 72 73 65 2d       c = pParse-
5310: 3e 7a 4a 73 6f 6e 5b 6a 5d 3b 0a 20 20 20 20 20  >zJson[j];.     
5320: 20 69 66 28 20 63 3d 3d 30 20 29 20 72 65 74 75   if( c==0 ) retu
5330: 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28  rn -1;.      if(
5340: 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20   c=='\\' ){.    
5350: 20 20 20 20 63 20 3d 20 70 50 61 72 73 65 2d 3e      c = pParse->
5360: 7a 4a 73 6f 6e 5b 2b 2b 6a 5d 3b 0a 20 20 20 20  zJson[++j];.    
5370: 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20 72      if( c==0 ) r
5380: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
5390: 20 20 6a 6e 46 6c 61 67 73 20 3d 20 4a 4e 4f 44    jnFlags = JNOD
53a0: 45 5f 45 53 43 41 50 45 3b 0a 20 20 20 20 20 20  E_ESCAPE;.      
53b0: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 22 27  }else if( c=='"'
53c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
53d0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
53e0: 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20   j++;.    }.    
53f0: 6a 73 6f 6e 50 61 72 73 65 41 64 64 4e 6f 64 65  jsonParseAddNode
5400: 28 70 50 61 72 73 65 2c 20 4a 53 4f 4e 5f 53 54  (pParse, JSON_ST
5410: 52 49 4e 47 2c 20 6a 2b 31 2d 69 2c 20 26 70 50  RING, j+1-i, &pP
5420: 61 72 73 65 2d 3e 7a 4a 73 6f 6e 5b 69 5d 29 3b  arse->zJson[i]);
5430: 0a 20 20 20 20 69 66 28 20 21 70 50 61 72 73 65  .    if( !pParse
5440: 2d 3e 6f 6f 6d 20 29 20 70 50 61 72 73 65 2d 3e  ->oom ) pParse->
5450: 61 4e 6f 64 65 5b 70 50 61 72 73 65 2d 3e 6e 4e  aNode[pParse->nN
5460: 6f 64 65 2d 31 5d 2e 6a 6e 46 6c 61 67 73 20 3d  ode-1].jnFlags =
5470: 20 6a 6e 46 6c 61 67 73 3b 0a 20 20 20 20 72 65   jnFlags;.    re
5480: 74 75 72 6e 20 6a 2b 31 3b 0a 20 20 7d 65 6c 73  turn j+1;.  }els
5490: 65 20 69 66 28 20 63 3d 3d 27 6e 27 0a 20 20 20  e if( c=='n'.   
54a0: 20 20 20 20 20 20 26 26 20 73 74 72 6e 63 6d 70        && strncmp
54b0: 28 70 50 61 72 73 65 2d 3e 7a 4a 73 6f 6e 2b 69  (pParse->zJson+i
54c0: 2c 22 6e 75 6c 6c 22 2c 34 29 3d 3d 30 0a 20 20  ,"null",4)==0.  
54d0: 20 20 20 20 20 20 20 26 26 20 21 73 61 66 65 5f         && !safe_
54e0: 69 73 61 6c 6e 75 6d 28 70 50 61 72 73 65 2d 3e  isalnum(pParse->
54f0: 7a 4a 73 6f 6e 5b 69 2b 34 5d 29 20 29 7b 0a 20  zJson[i+4]) ){. 
5500: 20 20 20 6a 73 6f 6e 50 61 72 73 65 41 64 64 4e     jsonParseAddN
5510: 6f 64 65 28 70 50 61 72 73 65 2c 20 4a 53 4f 4e  ode(pParse, JSON
5520: 5f 4e 55 4c 4c 2c 20 30 2c 20 30 29 3b 0a 20 20  _NULL, 0, 0);.  
5530: 20 20 72 65 74 75 72 6e 20 69 2b 34 3b 0a 20 20    return i+4;.  
5540: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 74 27  }else if( c=='t'
5550: 0a 20 20 20 20 20 20 20 20 20 26 26 20 73 74 72  .         && str
5560: 6e 63 6d 70 28 70 50 61 72 73 65 2d 3e 7a 4a 73  ncmp(pParse->zJs
5570: 6f 6e 2b 69 2c 22 74 72 75 65 22 2c 34 29 3d 3d  on+i,"true",4)==
5580: 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 21 73  0.         && !s
5590: 61 66 65 5f 69 73 61 6c 6e 75 6d 28 70 50 61 72  afe_isalnum(pPar
55a0: 73 65 2d 3e 7a 4a 73 6f 6e 5b 69 2b 34 5d 29 20  se->zJson[i+4]) 
55b0: 29 7b 0a 20 20 20 20 6a 73 6f 6e 50 61 72 73 65  ){.    jsonParse
55c0: 41 64 64 4e 6f 64 65 28 70 50 61 72 73 65 2c 20  AddNode(pParse, 
55d0: 4a 53 4f 4e 5f 54 52 55 45 2c 20 30 2c 20 30 29  JSON_TRUE, 0, 0)
55e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 69 2b 34  ;.    return i+4
55f0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d  ;.  }else if( c=
5600: 3d 27 66 27 0a 20 20 20 20 20 20 20 20 20 26 26  ='f'.         &&
5610: 20 73 74 72 6e 63 6d 70 28 70 50 61 72 73 65 2d   strncmp(pParse-
5620: 3e 7a 4a 73 6f 6e 2b 69 2c 22 66 61 6c 73 65 22  >zJson+i,"false"
5630: 2c 35 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ,5)==0.         
5640: 26 26 20 21 73 61 66 65 5f 69 73 61 6c 6e 75 6d  && !safe_isalnum
5650: 28 70 50 61 72 73 65 2d 3e 7a 4a 73 6f 6e 5b 69  (pParse->zJson[i
5660: 2b 35 5d 29 20 29 7b 0a 20 20 20 20 6a 73 6f 6e  +5]) ){.    json
5670: 50 61 72 73 65 41 64 64 4e 6f 64 65 28 70 50 61  ParseAddNode(pPa
5680: 72 73 65 2c 20 4a 53 4f 4e 5f 46 41 4c 53 45 2c  rse, JSON_FALSE,
5690: 20 30 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75   0, 0);.    retu
56a0: 72 6e 20 69 2b 35 3b 0a 20 20 7d 65 6c 73 65 20  rn i+5;.  }else 
56b0: 69 66 28 20 63 3d 3d 27 2d 27 20 7c 7c 20 28 63  if( c=='-' || (c
56c0: 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27 39 27 29  >='0' && c<='9')
56d0: 20 29 7b 0a 20 20 20 20 2f 2a 20 50 61 72 73 65   ){.    /* Parse
56e0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 75   number */.    u
56f0: 38 20 73 65 65 6e 44 50 20 3d 20 30 3b 0a 20 20  8 seenDP = 0;.  
5700: 20 20 75 38 20 73 65 65 6e 45 20 3d 20 30 3b 0a    u8 seenE = 0;.
5710: 20 20 20 20 6a 20 3d 20 69 2b 31 3b 0a 20 20 20      j = i+1;.   
5720: 20 66 6f 72 28 3b 3b 20 6a 2b 2b 29 7b 0a 20 20   for(;; j++){.  
5730: 20 20 20 20 63 20 3d 20 70 50 61 72 73 65 2d 3e      c = pParse->
5740: 7a 4a 73 6f 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20  zJson[j];.      
5750: 69 66 28 20 63 3e 3d 27 30 27 20 26 26 20 63 3c  if( c>='0' && c<
5760: 3d 27 39 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ='9' ) continue;
5770: 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 2e  .      if( c=='.
5780: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ' ){.        if(
5790: 20 70 50 61 72 73 65 2d 3e 7a 4a 73 6f 6e 5b 6a   pParse->zJson[j
57a0: 2d 31 5d 3d 3d 27 2d 27 20 29 20 72 65 74 75 72  -1]=='-' ) retur
57b0: 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 66  n -1;.        if
57c0: 28 20 73 65 65 6e 44 50 20 29 20 72 65 74 75 72  ( seenDP ) retur
57d0: 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 73 65  n -1;.        se
57e0: 65 6e 44 50 20 3d 20 31 3b 0a 20 20 20 20 20 20  enDP = 1;.      
57f0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
5800: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d    }.      if( c=
5810: 3d 27 65 27 20 7c 7c 20 63 3d 3d 27 45 27 20 29  ='e' || c=='E' )
5820: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
5830: 61 72 73 65 2d 3e 7a 4a 73 6f 6e 5b 6a 2d 31 5d  arse->zJson[j-1]
5840: 3c 27 30 27 20 29 20 72 65 74 75 72 6e 20 2d 31  <'0' ) return -1
5850: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 65  ;.        if( se
5860: 65 6e 45 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  enE ) return -1;
5870: 0a 20 20 20 20 20 20 20 20 73 65 65 6e 44 50 20  .        seenDP 
5880: 3d 20 73 65 65 6e 45 20 3d 20 31 3b 0a 20 20 20  = seenE = 1;.   
5890: 20 20 20 20 20 63 20 3d 20 70 50 61 72 73 65 2d       c = pParse-
58a0: 3e 7a 4a 73 6f 6e 5b 6a 2b 31 5d 3b 0a 20 20 20  >zJson[j+1];.   
58b0: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 2b 27 20       if( c=='+' 
58c0: 7c 7c 20 63 3d 3d 27 2d 27 20 29 7b 0a 20 20 20  || c=='-' ){.   
58d0: 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20         j++;.    
58e0: 20 20 20 20 20 20 63 20 3d 20 70 50 61 72 73 65        c = pParse
58f0: 2d 3e 7a 4a 73 6f 6e 5b 6a 2b 31 5d 3b 0a 20 20  ->zJson[j+1];.  
5900: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5910: 69 66 28 20 63 3c 27 30 27 20 7c 7c 20 63 3e 27  if( c<'0' || c>'
5920: 39 27 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  9' ) return -1;.
5930: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
5940: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5950: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
5960: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 7a 4a 73   if( pParse->zJs
5970: 6f 6e 5b 6a 2d 31 5d 3c 27 30 27 20 29 20 72 65  on[j-1]<'0' ) re
5980: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 6a 73 6f  turn -1;.    jso
5990: 6e 50 61 72 73 65 41 64 64 4e 6f 64 65 28 70 50  nParseAddNode(pP
59a0: 61 72 73 65 2c 20 73 65 65 6e 44 50 20 3f 20 4a  arse, seenDP ? J
59b0: 53 4f 4e 5f 52 45 41 4c 20 3a 20 4a 53 4f 4e 5f  SON_REAL : JSON_
59c0: 49 4e 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  INT,.           
59d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 20 2d               j -
59e0: 20 69 2c 20 26 70 50 61 72 73 65 2d 3e 7a 4a 73   i, &pParse->zJs
59f0: 6f 6e 5b 69 5d 29 3b 0a 20 20 20 20 72 65 74 75  on[i]);.    retu
5a00: 72 6e 20 6a 3b 0a 20 20 7d 65 6c 73 65 20 69 66  rn j;.  }else if
5a10: 28 20 63 3d 3d 27 7d 27 20 29 7b 0a 20 20 20 20  ( c=='}' ){.    
5a20: 72 65 74 75 72 6e 20 2d 32 3b 20 20 2f 2a 20 45  return -2;  /* E
5a30: 6e 64 20 6f 66 20 7b 2e 2e 2e 7d 20 2a 2f 0a 20  nd of {...} */. 
5a40: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5d   }else if( c==']
5a50: 27 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ' ){.    return 
5a60: 2d 33 3b 20 20 2f 2a 20 45 6e 64 20 6f 66 20 5b  -3;  /* End of [
5a70: 2e 2e 2e 5d 20 2a 2f 0a 20 20 7d 65 6c 73 65 20  ...] */.  }else 
5a80: 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20  if( c==0 ){.    
5a90: 72 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 45  return 0;   /* E
5aa0: 6e 64 20 6f 66 20 66 69 6c 65 20 2a 2f 0a 20 20  nd of file */.  
5ab0: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
5ac0: 6e 20 2d 31 3b 20 20 2f 2a 20 53 79 6e 74 61 78  n -1;  /* Syntax
5ad0: 20 65 72 72 6f 72 20 2a 2f 0a 20 20 7d 0a 7d 0a   error */.  }.}.
5ae0: 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 63  ./*.** Parse a c
5af0: 6f 6d 70 6c 65 74 65 20 4a 53 4f 4e 20 73 74 72  omplete JSON str
5b00: 69 6e 67 2e 20 20 52 65 74 75 72 6e 20 30 20 6f  ing.  Return 0 o
5b10: 6e 20 73 75 63 63 65 73 73 20 6f 72 20 6e 6f 6e  n success or non
5b20: 2d 7a 65 72 6f 20 69 66 20 74 68 65 72 65 0a 2a  -zero if there.*
5b30: 2a 20 61 72 65 20 61 6e 79 20 65 72 72 6f 72 73  * are any errors
5b40: 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  .  If an error o
5b50: 63 63 75 72 73 2c 20 66 72 65 65 20 61 6c 6c 20  ccurs, free all 
5b60: 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
5b70: 64 20 77 69 74 68 0a 2a 2a 20 70 50 61 72 73 65  d with.** pParse
5b80: 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 72 73 65 20 69  ..**.** pParse i
5b90: 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  s uninitialized 
5ba0: 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
5bb0: 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  e is called..*/.
5bc0: 73 74 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e 50  static int jsonP
5bd0: 61 72 73 65 28 0a 20 20 4a 73 6f 6e 50 61 72 73  arse(.  JsonPars
5be0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
5bf0: 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69       /* Initiali
5c00: 7a 65 20 61 6e 64 20 66 69 6c 6c 20 74 68 69 73  ze and fill this
5c10: 20 4a 73 6f 6e 50 61 72 73 65 20 6f 62 6a 65 63   JsonParse objec
5c20: 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 63  t */.  sqlite3_c
5c30: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20  ontext *pCtx,   
5c40: 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 65 72      /* Report er
5c50: 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 63  rors here */.  c
5c60: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4a 73 6f 6e  onst char *zJson
5c70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
5c80: 6e 70 75 74 20 4a 53 4f 4e 20 74 65 78 74 20 74  nput JSON text t
5c90: 6f 20 62 65 20 70 61 72 73 65 64 20 2a 2f 0a 29  o be parsed */.)
5ca0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6d 65 6d  {.  int i;.  mem
5cb0: 73 65 74 28 70 50 61 72 73 65 2c 20 30 2c 20 73  set(pParse, 0, s
5cc0: 69 7a 65 6f 66 28 2a 70 50 61 72 73 65 29 29 3b  izeof(*pParse));
5cd0: 0a 20 20 69 66 28 20 7a 4a 73 6f 6e 3d 3d 30 20  .  if( zJson==0 
5ce0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 70 50  ) return 1;.  pP
5cf0: 61 72 73 65 2d 3e 7a 4a 73 6f 6e 20 3d 20 7a 4a  arse->zJson = zJ
5d00: 73 6f 6e 3b 0a 20 20 69 20 3d 20 6a 73 6f 6e 50  son;.  i = jsonP
5d10: 61 72 73 65 56 61 6c 75 65 28 70 50 61 72 73 65  arseValue(pParse
5d20: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61 72  , 0);.  if( pPar
5d30: 73 65 2d 3e 6f 6f 6d 20 29 20 69 20 3d 20 2d 31  se->oom ) i = -1
5d40: 3b 0a 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20  ;.  if( i>0 ){. 
5d50: 20 20 20 77 68 69 6c 65 28 20 73 61 66 65 5f 69     while( safe_i
5d60: 73 73 70 61 63 65 28 7a 4a 73 6f 6e 5b 69 5d 29  sspace(zJson[i])
5d70: 20 29 20 69 2b 2b 3b 0a 20 20 20 20 69 66 28 20   ) i++;.    if( 
5d80: 7a 4a 73 6f 6e 5b 69 5d 20 29 20 69 20 3d 20 2d  zJson[i] ) i = -
5d90: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c 3d  1;.  }.  if( i<=
5da0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 74  0 ){.    if( pCt
5db0: 78 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  x!=0 ){.      if
5dc0: 28 20 70 50 61 72 73 65 2d 3e 6f 6f 6d 20 29 7b  ( pParse->oom ){
5dd0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5de0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
5df0: 6d 65 6d 28 70 43 74 78 29 3b 0a 20 20 20 20 20  mem(pCtx);.     
5e00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5e10: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
5e20: 72 72 6f 72 28 70 43 74 78 2c 20 22 6d 61 6c 66  rror(pCtx, "malf
5e30: 6f 72 6d 65 64 20 4a 53 4f 4e 22 2c 20 2d 31 29  ormed JSON", -1)
5e40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
5e50: 20 20 20 20 6a 73 6f 6e 50 61 72 73 65 52 65 73      jsonParseRes
5e60: 65 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  et(pParse);.    
5e70: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
5e80: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20  return 0;.}../* 
5e90: 4d 61 72 6b 20 6e 6f 64 65 20 69 20 6f 66 20 70  Mark node i of p
5ea0: 50 61 72 73 65 20 61 73 20 62 65 69 6e 67 20 61  Parse as being a
5eb0: 20 63 68 69 6c 64 20 6f 66 20 69 50 61 72 65 6e   child of iParen
5ec0: 74 2e 20 20 43 61 6c 6c 20 72 65 63 75 72 73 69  t.  Call recursi
5ed0: 76 65 6c 79 0a 2a 2a 20 74 6f 20 66 69 6c 6c 20  vely.** to fill 
5ee0: 69 6e 20 61 6c 6c 20 74 68 65 20 64 65 73 63 65  in all the desce
5ef0: 6e 64 61 6e 74 73 20 6f 66 20 6e 6f 64 65 20 69  ndants of node i
5f00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5f10: 20 6a 73 6f 6e 50 61 72 73 65 46 69 6c 6c 49 6e   jsonParseFillIn
5f20: 50 61 72 65 6e 74 61 67 65 28 4a 73 6f 6e 50 61  Parentage(JsonPa
5f30: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 75 33 32  rse *pParse, u32
5f40: 20 69 2c 20 75 33 32 20 69 50 61 72 65 6e 74 29   i, u32 iParent)
5f50: 7b 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e  {.  JsonNode *pN
5f60: 6f 64 65 20 3d 20 26 70 50 61 72 73 65 2d 3e 61  ode = &pParse->a
5f70: 4e 6f 64 65 5b 69 5d 3b 0a 20 20 75 33 32 20 6a  Node[i];.  u32 j
5f80: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 61 55 70 5b  ;.  pParse->aUp[
5f90: 69 5d 20 3d 20 69 50 61 72 65 6e 74 3b 0a 20 20  i] = iParent;.  
5fa0: 73 77 69 74 63 68 28 20 70 4e 6f 64 65 2d 3e 65  switch( pNode->e
5fb0: 54 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  Type ){.    case
5fc0: 20 4a 53 4f 4e 5f 41 52 52 41 59 3a 20 7b 0a 20   JSON_ARRAY: {. 
5fd0: 20 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c       for(j=1; j<
5fe0: 3d 70 4e 6f 64 65 2d 3e 6e 3b 20 6a 20 2b 3d 20  =pNode->n; j += 
5ff0: 6a 73 6f 6e 4e 6f 64 65 53 69 7a 65 28 70 4e 6f  jsonNodeSize(pNo
6000: 64 65 2b 6a 29 29 7b 0a 20 20 20 20 20 20 20 20  de+j)){.        
6010: 6a 73 6f 6e 50 61 72 73 65 46 69 6c 6c 49 6e 50  jsonParseFillInP
6020: 61 72 65 6e 74 61 67 65 28 70 50 61 72 73 65 2c  arentage(pParse,
6030: 20 69 2b 6a 2c 20 69 29 3b 0a 20 20 20 20 20 20   i+j, i);.      
6040: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
6050: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 53     }.    case JS
6060: 4f 4e 5f 4f 42 4a 45 43 54 3a 20 7b 0a 20 20 20  ON_OBJECT: {.   
6070: 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 3d 70     for(j=1; j<=p
6080: 4e 6f 64 65 2d 3e 6e 3b 20 6a 20 2b 3d 20 6a 73  Node->n; j += js
6090: 6f 6e 4e 6f 64 65 53 69 7a 65 28 70 4e 6f 64 65  onNodeSize(pNode
60a0: 2b 6a 2b 31 29 2b 31 29 7b 0a 20 20 20 20 20 20  +j+1)+1){.      
60b0: 20 20 70 50 61 72 73 65 2d 3e 61 55 70 5b 69 2b    pParse->aUp[i+
60c0: 6a 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  j] = i;.        
60d0: 6a 73 6f 6e 50 61 72 73 65 46 69 6c 6c 49 6e 50  jsonParseFillInP
60e0: 61 72 65 6e 74 61 67 65 28 70 50 61 72 73 65 2c  arentage(pParse,
60f0: 20 69 2b 6a 2b 31 2c 20 69 29 3b 0a 20 20 20 20   i+j+1, i);.    
6100: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
6110: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
6120: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 62 72 65 61  lt: {.      brea
6130: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  k;.    }.  }.}..
6140: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
6150: 65 20 70 61 72 65 6e 74 61 67 65 20 6f 66 20 61  e parentage of a
6160: 6c 6c 20 6e 6f 64 65 73 20 69 6e 20 61 20 63 6f  ll nodes in a co
6170: 6d 70 6c 65 74 65 64 20 70 61 72 73 65 2e 0a 2a  mpleted parse..*
6180: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 73 6f  /.static int jso
6190: 6e 50 61 72 73 65 46 69 6e 64 50 61 72 65 6e 74  nParseFindParent
61a0: 73 28 4a 73 6f 6e 50 61 72 73 65 20 2a 70 50 61  s(JsonParse *pPa
61b0: 72 73 65 29 7b 0a 20 20 75 33 32 20 2a 61 55 70  rse){.  u32 *aUp
61c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
61d0: 73 65 2d 3e 61 55 70 3d 3d 30 20 29 3b 0a 20 20  se->aUp==0 );.  
61e0: 61 55 70 20 3d 20 70 50 61 72 73 65 2d 3e 61 55  aUp = pParse->aU
61f0: 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  p = sqlite3_mall
6200: 6f 63 28 20 73 69 7a 65 6f 66 28 75 33 32 29 2a  oc( sizeof(u32)*
6210: 70 50 61 72 73 65 2d 3e 6e 4e 6f 64 65 20 29 3b  pParse->nNode );
6220: 0a 20 20 69 66 28 20 61 55 70 3d 3d 30 20 29 7b  .  if( aUp==0 ){
6230: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6f 6f 6d  .    pParse->oom
6240: 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
6250: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
6260: 20 7d 0a 20 20 6a 73 6f 6e 50 61 72 73 65 46 69   }.  jsonParseFi
6270: 6c 6c 49 6e 50 61 72 65 6e 74 61 67 65 28 70 50  llInParentage(pP
6280: 61 72 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 72  arse, 0, 0);.  r
6290: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
62a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  .}../*.** Compar
62b0: 65 20 74 68 65 20 4f 42 4a 45 43 54 20 6c 61 62  e the OBJECT lab
62c0: 65 6c 20 61 74 20 70 4e 6f 64 65 20 61 67 61 69  el at pNode agai
62d0: 6e 73 74 20 7a 4b 65 79 2c 6e 4b 65 79 2e 20 20  nst zKey,nKey.  
62e0: 52 65 74 75 72 6e 20 74 72 75 65 20 6f 6e 0a 2a  Return true on.*
62f0: 2a 20 61 20 6d 61 74 63 68 2e 0a 2a 2f 0a 73 74  * a match..*/.st
6300: 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e 4c 61 62  atic int jsonLab
6310: 65 6c 43 6f 6d 70 61 72 65 28 4a 73 6f 6e 4e 6f  elCompare(JsonNo
6320: 64 65 20 2a 70 4e 6f 64 65 2c 20 63 6f 6e 73 74  de *pNode, const
6330: 20 63 68 61 72 20 2a 7a 4b 65 79 2c 20 69 6e 74   char *zKey, int
6340: 20 6e 4b 65 79 29 7b 0a 20 20 69 66 28 20 70 4e   nKey){.  if( pN
6350: 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73 20 26 20 4a  ode->jnFlags & J
6360: 4e 4f 44 45 5f 52 41 57 20 29 7b 0a 20 20 20 20  NODE_RAW ){.    
6370: 69 66 28 20 70 4e 6f 64 65 2d 3e 6e 21 3d 6e 4b  if( pNode->n!=nK
6380: 65 79 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ey ) return 0;. 
6390: 20 20 20 72 65 74 75 72 6e 20 73 74 72 6e 63 6d     return strncm
63a0: 70 28 70 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e  p(pNode->u.zJCon
63b0: 74 65 6e 74 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79  tent, zKey, nKey
63c0: 29 3d 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  )==0;.  }else{. 
63d0: 20 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 6e 21     if( pNode->n!
63e0: 3d 6e 4b 65 79 2b 32 20 29 20 72 65 74 75 72 6e  =nKey+2 ) return
63f0: 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   0;.    return s
6400: 74 72 6e 63 6d 70 28 70 4e 6f 64 65 2d 3e 75 2e  trncmp(pNode->u.
6410: 7a 4a 43 6f 6e 74 65 6e 74 2b 31 2c 20 7a 4b 65  zJContent+1, zKe
6420: 79 2c 20 6e 4b 65 79 29 3d 3d 30 3b 0a 20 20 7d  y, nKey)==0;.  }
6430: 0a 7d 0a 0a 2f 2a 20 66 6f 72 77 61 72 64 20 64  .}../* forward d
6440: 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74  eclaration */.st
6450: 61 74 69 63 20 4a 73 6f 6e 4e 6f 64 65 20 2a 6a  atic JsonNode *j
6460: 73 6f 6e 4c 6f 6f 6b 75 70 41 70 70 65 6e 64 28  sonLookupAppend(
6470: 4a 73 6f 6e 50 61 72 73 65 2a 2c 63 6f 6e 73 74  JsonParse*,const
6480: 20 63 68 61 72 2a 2c 69 6e 74 2a 2c 63 6f 6e 73   char*,int*,cons
6490: 74 20 63 68 61 72 2a 2a 29 3b 0a 0a 2f 2a 0a 2a  t char**);../*.*
64a0: 2a 20 53 65 61 72 63 68 20 61 6c 6f 6e 67 20 7a  * Search along z
64b0: 50 61 74 68 20 74 6f 20 66 69 6e 64 20 74 68 65  Path to find the
64c0: 20 6e 6f 64 65 20 73 70 65 63 69 66 69 65 64 2e   node specified.
64d0: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
64e0: 65 72 0a 2a 2a 20 74 6f 20 74 68 61 74 20 6e 6f  er.** to that no
64f0: 64 65 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 7a  de, or NULL if z
6500: 50 61 74 68 20 69 73 20 6d 61 6c 66 6f 72 6d 65  Path is malforme
6510: 64 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73  d or if there is
6520: 20 6e 6f 20 73 75 63 68 0a 2a 2a 20 6e 6f 64 65   no such.** node
6530: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 41 70 6e 64  ..**.** If pApnd
6540: 21 3d 30 2c 20 74 68 65 6e 20 74 72 79 20 74 6f  !=0, then try to
6550: 20 61 70 70 65 6e 64 20 6e 65 77 20 6e 6f 64 65   append new node
6560: 73 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 7a 50  s to complete zP
6570: 61 74 68 20 69 66 20 69 74 20 69 73 0a 2a 2a 20  ath if it is.** 
6580: 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 6f 20 73  possible to do s
6590: 6f 20 61 6e 64 20 69 66 20 6e 6f 20 65 78 69 73  o and if no exis
65a0: 74 69 6e 67 20 6e 6f 64 65 20 63 6f 72 72 65 73  ting node corres
65b0: 70 6f 6e 64 73 20 74 6f 20 7a 50 61 74 68 2e 20  ponds to zPath. 
65c0: 20 49 66 0a 2a 2a 20 6e 65 77 20 6e 6f 64 65 73   If.** new nodes
65d0: 20 61 72 65 20 61 70 70 65 6e 64 65 64 20 2a 70   are appended *p
65e0: 41 70 6e 64 20 69 73 20 73 65 74 20 74 6f 20 31  Apnd is set to 1
65f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4a 73 6f 6e  ..*/.static Json
6600: 4e 6f 64 65 20 2a 6a 73 6f 6e 4c 6f 6f 6b 75 70  Node *jsonLookup
6610: 53 74 65 70 28 0a 20 20 4a 73 6f 6e 50 61 72 73  Step(.  JsonPars
6620: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
6630: 2f 2a 20 54 68 65 20 4a 53 4f 4e 20 74 6f 20 73  /* The JSON to s
6640: 65 61 72 63 68 20 2a 2f 0a 20 20 75 33 32 20 69  earch */.  u32 i
6650: 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 20  Root,           
6660: 20 20 20 2f 2a 20 42 65 67 69 6e 20 74 68 65 20     /* Begin the 
6670: 73 65 61 72 63 68 20 61 74 20 74 68 69 73 20 6e  search at this n
6680: 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ode */.  const c
6690: 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
66a0: 20 2f 2a 20 54 68 65 20 70 61 74 68 20 74 6f 20   /* The path to 
66b0: 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20  search */.  int 
66c0: 2a 70 41 70 6e 64 2c 20 20 20 20 20 20 20 20 20  *pApnd,         
66d0: 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 6e 6f      /* Append no
66e0: 64 65 73 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20  des to complete 
66f0: 70 61 74 68 20 69 66 20 6e 6f 74 20 4e 55 4c 4c  path if not NULL
6700: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
6710: 20 2a 2a 70 7a 45 72 72 20 20 20 20 20 20 2f 2a   **pzErr      /*
6720: 20 4d 61 6b 65 20 2a 70 7a 45 72 72 20 70 6f 69   Make *pzErr poi
6730: 6e 74 20 74 6f 20 61 6e 79 20 73 79 6e 74 61 78  nt to any syntax
6740: 20 65 72 72 6f 72 20 69 6e 20 7a 50 61 74 68 20   error in zPath 
6750: 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 69 2c 20 6a  */.){.  u32 i, j
6760: 2c 20 6e 4b 65 79 3b 0a 20 20 63 6f 6e 73 74 20  , nKey;.  const 
6770: 63 68 61 72 20 2a 7a 4b 65 79 3b 0a 20 20 4a 73  char *zKey;.  Js
6780: 6f 6e 4e 6f 64 65 20 2a 70 52 6f 6f 74 20 3d 20  onNode *pRoot = 
6790: 26 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65 5b 69  &pParse->aNode[i
67a0: 52 6f 6f 74 5d 3b 0a 20 20 69 66 28 20 7a 50 61  Root];.  if( zPa
67b0: 74 68 5b 30 5d 3d 3d 30 20 29 20 72 65 74 75 72  th[0]==0 ) retur
67c0: 6e 20 70 52 6f 6f 74 3b 0a 20 20 69 66 28 20 7a  n pRoot;.  if( z
67d0: 50 61 74 68 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a  Path[0]=='.' ){.
67e0: 20 20 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 65      if( pRoot->e
67f0: 54 79 70 65 21 3d 4a 53 4f 4e 5f 4f 42 4a 45 43  Type!=JSON_OBJEC
6800: 54 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  T ) return 0;.  
6810: 20 20 7a 50 61 74 68 2b 2b 3b 0a 20 20 20 20 69    zPath++;.    i
6820: 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 22 27  f( zPath[0]=='"'
6830: 20 29 7b 0a 20 20 20 20 20 20 7a 4b 65 79 20 3d   ){.      zKey =
6840: 20 7a 50 61 74 68 20 2b 20 31 3b 0a 20 20 20 20   zPath + 1;.    
6850: 20 20 66 6f 72 28 69 3d 31 3b 20 7a 50 61 74 68    for(i=1; zPath
6860: 5b 69 5d 20 26 26 20 7a 50 61 74 68 5b 69 5d 21  [i] && zPath[i]!
6870: 3d 27 22 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20  ='"'; i++){}.   
6880: 20 20 20 6e 4b 65 79 20 3d 20 69 2d 31 3b 0a 20     nKey = i-1;. 
6890: 20 20 20 20 20 69 66 28 20 7a 50 61 74 68 5b 69       if( zPath[i
68a0: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 2b 2b  ] ){.        i++
68b0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
68c0: 20 20 20 20 20 20 20 2a 70 7a 45 72 72 20 3d 20         *pzErr = 
68d0: 7a 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20 72  zPath;.        r
68e0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
68f0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6900: 20 20 7a 4b 65 79 20 3d 20 7a 50 61 74 68 3b 0a    zKey = zPath;.
6910: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a        for(i=0; z
6920: 50 61 74 68 5b 69 5d 20 26 26 20 7a 50 61 74 68  Path[i] && zPath
6930: 5b 69 5d 21 3d 27 2e 27 20 26 26 20 7a 50 61 74  [i]!='.' && zPat
6940: 68 5b 69 5d 21 3d 27 5b 27 3b 20 69 2b 2b 29 7b  h[i]!='['; i++){
6950: 7d 0a 20 20 20 20 20 20 6e 4b 65 79 20 3d 20 69  }.      nKey = i
6960: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
6970: 6e 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nKey==0 ){.     
6980: 20 2a 70 7a 45 72 72 20 3d 20 7a 50 61 74 68 3b   *pzErr = zPath;
6990: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
69a0: 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 31  .    }.    j = 1
69b0: 3b 0a 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20  ;.    for(;;){. 
69c0: 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3c 3d 70       while( j<=p
69d0: 52 6f 6f 74 2d 3e 6e 20 29 7b 0a 20 20 20 20 20  Root->n ){.     
69e0: 20 20 20 69 66 28 20 6a 73 6f 6e 4c 61 62 65 6c     if( jsonLabel
69f0: 43 6f 6d 70 61 72 65 28 70 52 6f 6f 74 2b 6a 2c  Compare(pRoot+j,
6a00: 20 7a 4b 65 79 2c 20 6e 4b 65 79 29 20 29 7b 0a   zKey, nKey) ){.
6a10: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
6a20: 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 53 74 65 70 28   jsonLookupStep(
6a30: 70 50 61 72 73 65 2c 20 69 52 6f 6f 74 2b 6a 2b  pParse, iRoot+j+
6a40: 31 2c 20 26 7a 50 61 74 68 5b 69 5d 2c 20 70 41  1, &zPath[i], pA
6a50: 70 6e 64 2c 20 70 7a 45 72 72 29 3b 0a 20 20 20  pnd, pzErr);.   
6a60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6a       }.        j
6a70: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6a 20 2b 3d  ++;.        j +=
6a80: 20 6a 73 6f 6e 4e 6f 64 65 53 69 7a 65 28 26 70   jsonNodeSize(&p
6a90: 52 6f 6f 74 5b 6a 5d 29 3b 0a 20 20 20 20 20 20  Root[j]);.      
6aa0: 7d 0a 20 20 20 20 20 20 69 66 28 20 28 70 52 6f  }.      if( (pRo
6ab0: 6f 74 2d 3e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e  ot->jnFlags & JN
6ac0: 4f 44 45 5f 41 50 50 45 4e 44 29 3d 3d 30 20 29  ODE_APPEND)==0 )
6ad0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 52   break;.      iR
6ae0: 6f 6f 74 20 2b 3d 20 70 52 6f 6f 74 2d 3e 75 2e  oot += pRoot->u.
6af0: 69 41 70 70 65 6e 64 3b 0a 20 20 20 20 20 20 70  iAppend;.      p
6b00: 52 6f 6f 74 20 3d 20 26 70 50 61 72 73 65 2d 3e  Root = &pParse->
6b10: 61 4e 6f 64 65 5b 69 52 6f 6f 74 5d 3b 0a 20 20  aNode[iRoot];.  
6b20: 20 20 20 20 6a 20 3d 20 31 3b 0a 20 20 20 20 7d      j = 1;.    }
6b30: 0a 20 20 20 20 69 66 28 20 70 41 70 6e 64 20 29  .    if( pApnd )
6b40: 7b 0a 20 20 20 20 20 20 75 33 32 20 69 53 74 61  {.      u32 iSta
6b50: 72 74 2c 20 69 4c 61 62 65 6c 3b 0a 20 20 20 20  rt, iLabel;.    
6b60: 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64    JsonNode *pNod
6b70: 65 3b 0a 20 20 20 20 20 20 69 53 74 61 72 74 20  e;.      iStart 
6b80: 3d 20 6a 73 6f 6e 50 61 72 73 65 41 64 64 4e 6f  = jsonParseAddNo
6b90: 64 65 28 70 50 61 72 73 65 2c 20 4a 53 4f 4e 5f  de(pParse, JSON_
6ba0: 4f 42 4a 45 43 54 2c 20 32 2c 20 30 29 3b 0a 20  OBJECT, 2, 0);. 
6bb0: 20 20 20 20 20 69 4c 61 62 65 6c 20 3d 20 6a 73       iLabel = js
6bc0: 6f 6e 50 61 72 73 65 41 64 64 4e 6f 64 65 28 70  onParseAddNode(p
6bd0: 50 61 72 73 65 2c 20 4a 53 4f 4e 5f 53 54 52 49  Parse, JSON_STRI
6be0: 4e 47 2c 20 69 2c 20 7a 50 61 74 68 29 3b 0a 20  NG, i, zPath);. 
6bf0: 20 20 20 20 20 7a 50 61 74 68 20 2b 3d 20 69 3b       zPath += i;
6c00: 0a 20 20 20 20 20 20 70 4e 6f 64 65 20 3d 20 6a  .      pNode = j
6c10: 73 6f 6e 4c 6f 6f 6b 75 70 41 70 70 65 6e 64 28  sonLookupAppend(
6c20: 70 50 61 72 73 65 2c 20 7a 50 61 74 68 2c 20 70  pParse, zPath, p
6c30: 41 70 6e 64 2c 20 70 7a 45 72 72 29 3b 0a 20 20  Apnd, pzErr);.  
6c40: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
6c50: 6f 6f 6d 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  oom ) return 0;.
6c60: 20 20 20 20 20 20 69 66 28 20 70 4e 6f 64 65 20        if( pNode 
6c70: 29 7b 0a 20 20 20 20 20 20 20 20 70 52 6f 6f 74  ){.        pRoot
6c80: 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 4e 6f 64   = &pParse->aNod
6c90: 65 5b 69 52 6f 6f 74 5d 3b 0a 20 20 20 20 20 20  e[iRoot];.      
6ca0: 20 20 70 52 6f 6f 74 2d 3e 75 2e 69 41 70 70 65    pRoot->u.iAppe
6cb0: 6e 64 20 3d 20 69 53 74 61 72 74 20 2d 20 69 52  nd = iStart - iR
6cc0: 6f 6f 74 3b 0a 20 20 20 20 20 20 20 20 70 52 6f  oot;.        pRo
6cd0: 6f 74 2d 3e 6a 6e 46 6c 61 67 73 20 7c 3d 20 4a  ot->jnFlags |= J
6ce0: 4e 4f 44 45 5f 41 50 50 45 4e 44 3b 0a 20 20 20  NODE_APPEND;.   
6cf0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 4e 6f       pParse->aNo
6d00: 64 65 5b 69 4c 61 62 65 6c 5d 2e 6a 6e 46 6c 61  de[iLabel].jnFla
6d10: 67 73 20 7c 3d 20 4a 4e 4f 44 45 5f 52 41 57 3b  gs |= JNODE_RAW;
6d20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
6d30: 65 74 75 72 6e 20 70 4e 6f 64 65 3b 0a 20 20 20  eturn pNode;.   
6d40: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a   }.  }else if( z
6d50: 50 61 74 68 5b 30 5d 3d 3d 27 5b 27 20 26 26 20  Path[0]=='[' && 
6d60: 73 61 66 65 5f 69 73 64 69 67 69 74 28 7a 50 61  safe_isdigit(zPa
6d70: 74 68 5b 31 5d 29 20 29 7b 0a 20 20 20 20 69 66  th[1]) ){.    if
6d80: 28 20 70 52 6f 6f 74 2d 3e 65 54 79 70 65 21 3d  ( pRoot->eType!=
6d90: 4a 53 4f 4e 5f 41 52 52 41 59 20 29 20 72 65 74  JSON_ARRAY ) ret
6da0: 75 72 6e 20 30 3b 0a 20 20 20 20 69 20 3d 20 30  urn 0;.    i = 0
6db0: 3b 0a 20 20 20 20 6a 20 3d 20 31 3b 0a 20 20 20  ;.    j = 1;.   
6dc0: 20 77 68 69 6c 65 28 20 73 61 66 65 5f 69 73 64   while( safe_isd
6dd0: 69 67 69 74 28 7a 50 61 74 68 5b 6a 5d 29 20 29  igit(zPath[j]) )
6de0: 7b 0a 20 20 20 20 20 20 69 20 3d 20 69 2a 31 30  {.      i = i*10
6df0: 20 2b 20 7a 50 61 74 68 5b 6a 5d 20 2d 20 27 30   + zPath[j] - '0
6e00: 27 3b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  ';.      j++;.  
6e10: 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 50 61 74    }.    if( zPat
6e20: 68 5b 6a 5d 21 3d 27 5d 27 20 29 7b 0a 20 20 20  h[j]!=']' ){.   
6e30: 20 20 20 2a 70 7a 45 72 72 20 3d 20 7a 50 61 74     *pzErr = zPat
6e40: 68 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  h;.      return 
6e50: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 50 61  0;.    }.    zPa
6e60: 74 68 20 2b 3d 20 6a 20 2b 20 31 3b 0a 20 20 20  th += j + 1;.   
6e70: 20 6a 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28   j = 1;.    for(
6e80: 3b 3b 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65  ;;){.      while
6e90: 28 20 6a 3c 3d 70 52 6f 6f 74 2d 3e 6e 20 26 26  ( j<=pRoot->n &&
6ea0: 20 28 69 3e 30 20 7c 7c 20 28 70 52 6f 6f 74 5b   (i>0 || (pRoot[
6eb0: 6a 5d 2e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f  j].jnFlags & JNO
6ec0: 44 45 5f 52 45 4d 4f 56 45 29 21 3d 30 29 20 29  DE_REMOVE)!=0) )
6ed0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  {.        if( (p
6ee0: 52 6f 6f 74 5b 6a 5d 2e 6a 6e 46 6c 61 67 73 20  Root[j].jnFlags 
6ef0: 26 20 4a 4e 4f 44 45 5f 52 45 4d 4f 56 45 29 3d  & JNODE_REMOVE)=
6f00: 3d 30 20 29 20 69 2d 2d 3b 0a 20 20 20 20 20 20  =0 ) i--;.      
6f10: 20 20 6a 20 2b 3d 20 6a 73 6f 6e 4e 6f 64 65 53    j += jsonNodeS
6f20: 69 7a 65 28 26 70 52 6f 6f 74 5b 6a 5d 29 3b 0a  ize(&pRoot[j]);.
6f30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
6f40: 28 20 28 70 52 6f 6f 74 2d 3e 6a 6e 46 6c 61 67  ( (pRoot->jnFlag
6f50: 73 20 26 20 4a 4e 4f 44 45 5f 41 50 50 45 4e 44  s & JNODE_APPEND
6f60: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
6f70: 20 20 20 20 69 52 6f 6f 74 20 2b 3d 20 70 52 6f      iRoot += pRo
6f80: 6f 74 2d 3e 75 2e 69 41 70 70 65 6e 64 3b 0a 20  ot->u.iAppend;. 
6f90: 20 20 20 20 20 70 52 6f 6f 74 20 3d 20 26 70 50       pRoot = &pP
6fa0: 61 72 73 65 2d 3e 61 4e 6f 64 65 5b 69 52 6f 6f  arse->aNode[iRoo
6fb0: 74 5d 3b 0a 20 20 20 20 20 20 6a 20 3d 20 31 3b  t];.      j = 1;
6fc0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a  .    }.    if( j
6fd0: 3c 3d 70 52 6f 6f 74 2d 3e 6e 20 29 7b 0a 20 20  <=pRoot->n ){.  
6fe0: 20 20 20 20 72 65 74 75 72 6e 20 6a 73 6f 6e 4c      return jsonL
6ff0: 6f 6f 6b 75 70 53 74 65 70 28 70 50 61 72 73 65  ookupStep(pParse
7000: 2c 20 69 52 6f 6f 74 2b 6a 2c 20 7a 50 61 74 68  , iRoot+j, zPath
7010: 2c 20 70 41 70 6e 64 2c 20 70 7a 45 72 72 29 3b  , pApnd, pzErr);
7020: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
7030: 3d 3d 30 20 26 26 20 70 41 70 6e 64 20 29 7b 0a  ==0 && pApnd ){.
7040: 20 20 20 20 20 20 75 33 32 20 69 53 74 61 72 74        u32 iStart
7050: 3b 0a 20 20 20 20 20 20 4a 73 6f 6e 4e 6f 64 65  ;.      JsonNode
7060: 20 2a 70 4e 6f 64 65 3b 0a 20 20 20 20 20 20 69   *pNode;.      i
7070: 53 74 61 72 74 20 3d 20 6a 73 6f 6e 50 61 72 73  Start = jsonPars
7080: 65 41 64 64 4e 6f 64 65 28 70 50 61 72 73 65 2c  eAddNode(pParse,
7090: 20 4a 53 4f 4e 5f 41 52 52 41 59 2c 20 31 2c 20   JSON_ARRAY, 1, 
70a0: 30 29 3b 0a 20 20 20 20 20 20 70 4e 6f 64 65 20  0);.      pNode 
70b0: 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 41 70 70 65  = jsonLookupAppe
70c0: 6e 64 28 70 50 61 72 73 65 2c 20 7a 50 61 74 68  nd(pParse, zPath
70d0: 2c 20 70 41 70 6e 64 2c 20 70 7a 45 72 72 29 3b  , pApnd, pzErr);
70e0: 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73  .      if( pPars
70f0: 65 2d 3e 6f 6f 6d 20 29 20 72 65 74 75 72 6e 20  e->oom ) return 
7100: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 6f  0;.      if( pNo
7110: 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52  de ){.        pR
7120: 6f 6f 74 20 3d 20 26 70 50 61 72 73 65 2d 3e 61  oot = &pParse->a
7130: 4e 6f 64 65 5b 69 52 6f 6f 74 5d 3b 0a 20 20 20  Node[iRoot];.   
7140: 20 20 20 20 20 70 52 6f 6f 74 2d 3e 75 2e 69 41       pRoot->u.iA
7150: 70 70 65 6e 64 20 3d 20 69 53 74 61 72 74 20 2d  ppend = iStart -
7160: 20 69 52 6f 6f 74 3b 0a 20 20 20 20 20 20 20 20   iRoot;.        
7170: 70 52 6f 6f 74 2d 3e 6a 6e 46 6c 61 67 73 20 7c  pRoot->jnFlags |
7180: 3d 20 4a 4e 4f 44 45 5f 41 50 50 45 4e 44 3b 0a  = JNODE_APPEND;.
7190: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
71a0: 74 75 72 6e 20 70 4e 6f 64 65 3b 0a 20 20 20 20  turn pNode;.    
71b0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  }.  }else{.    *
71c0: 70 7a 45 72 72 20 3d 20 7a 50 61 74 68 3b 0a 20  pzErr = zPath;. 
71d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
71e0: 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 63  ../*.** Append c
71f0: 6f 6e 74 65 6e 74 20 74 6f 20 70 50 61 72 73 65  ontent to pParse
7200: 20 74 68 61 74 20 77 69 6c 6c 20 63 6f 6d 70 6c   that will compl
7210: 65 74 65 20 7a 50 61 74 68 2e 20 20 52 65 74 75  ete zPath.  Retu
7220: 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  rn a pointer.** 
7230: 74 6f 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  to the inserted 
7240: 6e 6f 64 65 2c 20 6f 72 20 72 65 74 75 72 6e 20  node, or return 
7250: 4e 55 4c 4c 20 69 66 20 74 68 65 20 61 70 70 65  NULL if the appe
7260: 6e 64 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  nd fails..*/.sta
7270: 74 69 63 20 4a 73 6f 6e 4e 6f 64 65 20 2a 6a 73  tic JsonNode *js
7280: 6f 6e 4c 6f 6f 6b 75 70 41 70 70 65 6e 64 28 0a  onLookupAppend(.
7290: 20 20 4a 73 6f 6e 50 61 72 73 65 20 2a 70 50 61    JsonParse *pPa
72a0: 72 73 65 2c 20 20 20 20 20 2f 2a 20 41 70 70 65  rse,     /* Appe
72b0: 6e 64 20 63 6f 6e 74 65 6e 74 20 74 6f 20 74 68  nd content to th
72c0: 65 20 4a 53 4f 4e 20 70 61 72 73 65 20 2a 2f 0a  e JSON parse */.
72d0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
72e0: 61 74 68 2c 20 20 20 20 20 2f 2a 20 44 65 73 63  ath,     /* Desc
72f0: 72 69 70 74 69 6f 6e 20 6f 66 20 63 6f 6e 74 65  ription of conte
7300: 6e 74 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a  nt to append */.
7310: 20 20 69 6e 74 20 2a 70 41 70 6e 64 2c 20 20 20    int *pApnd,   
7320: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
7330: 74 68 69 73 20 66 6c 61 67 20 74 6f 20 31 20 2a  this flag to 1 *
7340: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
7350: 2a 70 7a 45 72 72 20 20 20 20 20 2f 2a 20 4d 61  *pzErr     /* Ma
7360: 6b 65 20 74 68 69 73 20 70 6f 69 6e 74 20 74 6f  ke this point to
7370: 20 61 6e 79 20 73 79 6e 74 61 78 20 65 72 72 6f   any syntax erro
7380: 72 20 2a 2f 0a 29 7b 0a 20 20 2a 70 41 70 6e 64  r */.){.  *pApnd
7390: 20 3d 20 31 3b 0a 20 20 69 66 28 20 7a 50 61 74   = 1;.  if( zPat
73a0: 68 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 6a  h[0]==0 ){.    j
73b0: 73 6f 6e 50 61 72 73 65 41 64 64 4e 6f 64 65 28  sonParseAddNode(
73c0: 70 50 61 72 73 65 2c 20 4a 53 4f 4e 5f 4e 55 4c  pParse, JSON_NUL
73d0: 4c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 72 65  L, 0, 0);.    re
73e0: 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6f 6f 6d  turn pParse->oom
73f0: 20 3f 20 30 20 3a 20 26 70 50 61 72 73 65 2d 3e   ? 0 : &pParse->
7400: 61 4e 6f 64 65 5b 70 50 61 72 73 65 2d 3e 6e 4e  aNode[pParse->nN
7410: 6f 64 65 2d 31 5d 3b 0a 20 20 7d 0a 20 20 69 66  ode-1];.  }.  if
7420: 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 2e 27 20  ( zPath[0]=='.' 
7430: 29 7b 0a 20 20 20 20 6a 73 6f 6e 50 61 72 73 65  ){.    jsonParse
7440: 41 64 64 4e 6f 64 65 28 70 50 61 72 73 65 2c 20  AddNode(pParse, 
7450: 4a 53 4f 4e 5f 4f 42 4a 45 43 54 2c 20 30 2c 20  JSON_OBJECT, 0, 
7460: 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  0);.  }else if( 
7470: 73 74 72 6e 63 6d 70 28 7a 50 61 74 68 2c 22 5b  strncmp(zPath,"[
7480: 30 5d 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20  0]",3)==0 ){.   
7490: 20 6a 73 6f 6e 50 61 72 73 65 41 64 64 4e 6f 64   jsonParseAddNod
74a0: 65 28 70 50 61 72 73 65 2c 20 4a 53 4f 4e 5f 41  e(pParse, JSON_A
74b0: 52 52 41 59 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  RRAY, 0, 0);.  }
74c0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
74d0: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50   0;.  }.  if( pP
74e0: 61 72 73 65 2d 3e 6f 6f 6d 20 29 20 72 65 74 75  arse->oom ) retu
74f0: 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 6a  rn 0;.  return j
7500: 73 6f 6e 4c 6f 6f 6b 75 70 53 74 65 70 28 70 50  sonLookupStep(pP
7510: 61 72 73 65 2c 20 70 50 61 72 73 65 2d 3e 6e 4e  arse, pParse->nN
7520: 6f 64 65 2d 31 2c 20 7a 50 61 74 68 2c 20 70 41  ode-1, zPath, pA
7530: 70 6e 64 2c 20 70 7a 45 72 72 29 3b 0a 7d 0a 0a  pnd, pzErr);.}..
7540: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
7550: 20 74 65 78 74 20 6f 66 20 61 20 73 79 6e 74 61   text of a synta
7560: 78 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  x error message 
7570: 6f 6e 20 61 20 4a 53 4f 4e 20 70 61 74 68 2e 20  on a JSON path. 
7580: 20 53 70 61 63 65 20 69 73 0a 2a 2a 20 6f 62 74   Space is.** obt
7590: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
75a0: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a  e3_malloc()..*/.
75b0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 6a 73 6f  static char *jso
75c0: 6e 50 61 74 68 53 79 6e 74 61 78 45 72 72 6f 72  nPathSyntaxError
75d0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72  (const char *zEr
75e0: 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  r){.  return sql
75f0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 4a 53  ite3_mprintf("JS
7600: 4f 4e 20 70 61 74 68 20 65 72 72 6f 72 20 6e 65  ON path error ne
7610: 61 72 20 27 25 71 27 22 2c 20 7a 45 72 72 29 3b  ar '%q'", zErr);
7620: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 6e  .}../*.** Do a n
7630: 6f 64 65 20 6c 6f 6f 6b 75 70 20 75 73 69 6e 67  ode lookup using
7640: 20 7a 50 61 74 68 2e 20 20 52 65 74 75 72 6e 20   zPath.  Return 
7650: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
7660: 20 6e 6f 64 65 20 6f 6e 20 73 75 63 63 65 73 73   node on success
7670: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ..** Return NULL
7680: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 20 6f 72   if not found or
7690: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   if there is an 
76a0: 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20  error..**.** On 
76b0: 61 6e 20 65 72 72 6f 72 2c 20 77 72 69 74 65 20  an error, write 
76c0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
76d0: 20 69 6e 74 6f 20 70 43 74 78 20 61 6e 64 20 69   into pCtx and i
76e0: 6e 63 72 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20  ncrement the.** 
76f0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 63 6f 75  pParse->nErr cou
7700: 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  nter..**.** If p
7710: 41 70 6e 64 21 3d 4e 55 4c 4c 20 74 68 65 6e 20  Apnd!=NULL then 
7720: 74 72 79 20 74 6f 20 61 70 70 65 6e 64 20 6d 69  try to append mi
7730: 73 73 69 6e 67 20 6e 6f 64 65 73 20 61 6e 64 20  ssing nodes and 
7740: 73 65 74 20 2a 70 41 70 6e 64 20 3d 20 31 20 69  set *pApnd = 1 i
7750: 66 0a 2a 2a 20 6e 6f 64 65 73 20 61 72 65 20 61  f.** nodes are a
7760: 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a 73 74 61 74  ppended..*/.stat
7770: 69 63 20 4a 73 6f 6e 4e 6f 64 65 20 2a 6a 73 6f  ic JsonNode *jso
7780: 6e 4c 6f 6f 6b 75 70 28 0a 20 20 4a 73 6f 6e 50  nLookup(.  JsonP
7790: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
77a0: 20 20 20 2f 2a 20 54 68 65 20 4a 53 4f 4e 20 74     /* The JSON t
77b0: 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 63 6f  o search */.  co
77c0: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
77d0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 74        /* The pat
77e0: 68 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  h to search */. 
77f0: 20 69 6e 74 20 2a 70 41 70 6e 64 2c 20 20 20 20   int *pApnd,    
7800: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 70 70 65           /* Appe
7810: 6e 64 20 6e 6f 64 65 73 20 74 6f 20 63 6f 6d 70  nd nodes to comp
7820: 6c 65 74 65 20 70 61 74 68 20 69 66 20 6e 6f 74  lete path if not
7830: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 73 71 6c 69 74   NULL */.  sqlit
7840: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
7850: 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 65 72 72     /* Report err
7860: 6f 72 73 20 68 65 72 65 2c 20 69 66 20 6e 6f 74  ors here, if not
7870: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 63 6f   NULL */.){.  co
7880: 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20 3d  nst char *zErr =
7890: 20 30 3b 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a   0;.  JsonNode *
78a0: 70 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 63 68 61  pNode = 0;.  cha
78b0: 72 20 2a 7a 4d 73 67 3b 0a 0a 20 20 69 66 28 20  r *zMsg;..  if( 
78c0: 7a 50 61 74 68 3d 3d 30 20 29 20 72 65 74 75 72  zPath==0 ) retur
78d0: 6e 20 30 3b 0a 20 20 69 66 28 20 7a 50 61 74 68  n 0;.  if( zPath
78e0: 5b 30 5d 21 3d 27 24 27 20 29 7b 0a 20 20 20 20  [0]!='$' ){.    
78f0: 7a 45 72 72 20 3d 20 7a 50 61 74 68 3b 0a 20 20  zErr = zPath;.  
7900: 20 20 67 6f 74 6f 20 6c 6f 6f 6b 75 70 5f 65 72    goto lookup_er
7910: 72 3b 0a 20 20 7d 0a 20 20 7a 50 61 74 68 2b 2b  r;.  }.  zPath++
7920: 3b 0a 20 20 70 4e 6f 64 65 20 3d 20 6a 73 6f 6e  ;.  pNode = json
7930: 4c 6f 6f 6b 75 70 53 74 65 70 28 70 50 61 72 73  LookupStep(pPars
7940: 65 2c 20 30 2c 20 7a 50 61 74 68 2c 20 70 41 70  e, 0, zPath, pAp
7950: 6e 64 2c 20 26 7a 45 72 72 29 3b 0a 20 20 69 66  nd, &zErr);.  if
7960: 28 20 7a 45 72 72 3d 3d 30 20 29 20 72 65 74 75  ( zErr==0 ) retu
7970: 72 6e 20 70 4e 6f 64 65 3b 0a 0a 6c 6f 6f 6b 75  rn pNode;..looku
7980: 70 5f 65 72 72 3a 0a 20 20 70 50 61 72 73 65 2d  p_err:.  pParse-
7990: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 61 73 73 65 72  >nErr++;.  asser
79a0: 74 28 20 7a 45 72 72 21 3d 30 20 26 26 20 70 43  t( zErr!=0 && pC
79b0: 74 78 21 3d 30 20 29 3b 0a 20 20 7a 4d 73 67 20  tx!=0 );.  zMsg 
79c0: 3d 20 6a 73 6f 6e 50 61 74 68 53 79 6e 74 61 78  = jsonPathSyntax
79d0: 45 72 72 6f 72 28 7a 45 72 72 29 3b 0a 20 20 69  Error(zErr);.  i
79e0: 66 28 20 7a 4d 73 67 20 29 7b 0a 20 20 20 20 73  f( zMsg ){.    s
79f0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
7a00: 72 6f 72 28 70 43 74 78 2c 20 7a 4d 73 67 2c 20  ror(pCtx, zMsg, 
7a10: 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  -1);.    sqlite3
7a20: 5f 66 72 65 65 28 7a 4d 73 67 29 3b 0a 20 20 7d  _free(zMsg);.  }
7a30: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
7a40: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e  3_result_error_n
7a50: 6f 6d 65 6d 28 70 43 74 78 29 3b 0a 20 20 7d 0a  omem(pCtx);.  }.
7a60: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a    return 0;.}...
7a70: 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 74 68 65  /*.** Report the
7a80: 20 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66   wrong number of
7a90: 20 61 72 67 75 6d 65 6e 74 73 20 66 6f 72 20 6a   arguments for j
7aa0: 73 6f 6e 5f 69 6e 73 65 72 74 28 29 2c 20 6a 73  son_insert(), js
7ab0: 6f 6e 5f 72 65 70 6c 61 63 65 28 29 0a 2a 2a 20  on_replace().** 
7ac0: 6f 72 20 6a 73 6f 6e 5f 73 65 74 28 29 2e 0a 2a  or json_set()..*
7ad0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73  /.static void js
7ae0: 6f 6e 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 0a  onWrongNumArgs(.
7af0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
7b00: 74 20 2a 70 43 74 78 2c 0a 20 20 63 6f 6e 73 74  t *pCtx,.  const
7b10: 20 63 68 61 72 20 2a 7a 46 75 6e 63 4e 61 6d 65   char *zFuncName
7b20: 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67  .){.  char *zMsg
7b30: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
7b40: 74 66 28 22 6a 73 6f 6e 5f 25 73 28 29 20 6e 65  tf("json_%s() ne
7b50: 65 64 73 20 61 6e 20 6f 64 64 20 6e 75 6d 62 65  eds an odd numbe
7b60: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 22 2c  r of arguments",
7b70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b90: 7a 46 75 6e 63 4e 61 6d 65 29 3b 0a 20 20 73 71  zFuncName);.  sq
7ba0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
7bb0: 6f 72 28 70 43 74 78 2c 20 7a 4d 73 67 2c 20 2d  or(pCtx, zMsg, -
7bc0: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  1);.  sqlite3_fr
7bd0: 65 65 28 7a 4d 73 67 29 3b 20 20 20 20 20 0a 7d  ee(zMsg);     .}
7be0: 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
7bf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7c00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7c10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7c20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7c30: 0a 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  .** SQL function
7c40: 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
7c50: 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ng and debugging
7c60: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
7c70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7c80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7c90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
7cb0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
7cc0: 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 73  BUG./*.** The js
7cd0: 6f 6e 5f 70 61 72 73 65 28 4a 53 4f 4e 29 20 66  on_parse(JSON) f
7ce0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
7cf0: 61 20 73 74 72 69 6e 67 20 77 68 69 63 68 20 64  a string which d
7d00: 65 73 63 72 69 62 65 73 0a 2a 2a 20 61 20 70 61  escribes.** a pa
7d10: 72 73 65 20 6f 66 20 74 68 65 20 4a 53 4f 4e 20  rse of the JSON 
7d20: 70 72 6f 76 69 64 65 64 2e 20 20 4f 72 20 69 74  provided.  Or it
7d30: 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66   returns NULL if
7d40: 20 4a 53 4f 4e 20 69 73 20 6e 6f 74 0a 2a 2a 20   JSON is not.** 
7d50: 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 0a 2a 2f 0a  well-formed..*/.
7d60: 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e  static void json
7d70: 50 61 72 73 65 46 75 6e 63 28 0a 20 20 73 71 6c  ParseFunc(.  sql
7d80: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74  ite3_context *ct
7d90: 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  x,.  int argc,. 
7da0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
7db0: 2a 61 72 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e 53  *argv.){.  JsonS
7dc0: 74 72 69 6e 67 20 73 3b 20 20 20 20 20 20 20 2f  tring s;       /
7dd0: 2a 20 4f 75 74 70 75 74 20 73 74 72 69 6e 67 20  * Output string 
7de0: 2d 20 6e 6f 74 20 72 65 61 6c 20 4a 53 4f 4e 20  - not real JSON 
7df0: 2a 2f 0a 20 20 4a 73 6f 6e 50 61 72 73 65 20 78  */.  JsonParse x
7e00: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
7e10: 70 61 72 73 65 20 2a 2f 0a 20 20 75 33 32 20 69  parse */.  u32 i
7e20: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 72 67  ;..  assert( arg
7e30: 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 6a 73  c==1 );.  if( js
7e40: 6f 6e 50 61 72 73 65 28 26 78 2c 20 63 74 78 2c  onParse(&x, ctx,
7e50: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
7e60: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
7e70: 28 61 72 67 76 5b 30 5d 29 29 20 29 20 72 65 74  (argv[0])) ) ret
7e80: 75 72 6e 3b 0a 20 20 6a 73 6f 6e 50 61 72 73 65  urn;.  jsonParse
7e90: 46 69 6e 64 50 61 72 65 6e 74 73 28 26 78 29 3b  FindParents(&x);
7ea0: 0a 20 20 6a 73 6f 6e 49 6e 69 74 28 26 73 2c 20  .  jsonInit(&s, 
7eb0: 63 74 78 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ctx);.  for(i=0;
7ec0: 20 69 3c 78 2e 6e 4e 6f 64 65 3b 20 69 2b 2b 29   i<x.nNode; i++)
7ed0: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
7ee0: 20 2a 7a 54 79 70 65 3b 0a 20 20 20 20 69 66 28   *zType;.    if(
7ef0: 20 78 2e 61 4e 6f 64 65 5b 69 5d 2e 6a 6e 46 6c   x.aNode[i].jnFl
7f00: 61 67 73 20 26 20 4a 4e 4f 44 45 5f 4c 41 42 45  ags & JNODE_LABE
7f10: 4c 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  L ){.      asser
7f20: 74 28 20 78 2e 61 4e 6f 64 65 5b 69 5d 2e 65 54  t( x.aNode[i].eT
7f30: 79 70 65 3d 3d 4a 53 4f 4e 5f 53 54 52 49 4e 47  ype==JSON_STRING
7f40: 20 29 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20   );.      zType 
7f50: 3d 20 22 6c 61 62 65 6c 22 3b 0a 20 20 20 20 7d  = "label";.    }
7f60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 54 79 70  else{.      zTyp
7f70: 65 20 3d 20 6a 73 6f 6e 54 79 70 65 5b 78 2e 61  e = jsonType[x.a
7f80: 4e 6f 64 65 5b 69 5d 2e 65 54 79 70 65 5d 3b 0a  Node[i].eType];.
7f90: 20 20 20 20 7d 0a 20 20 20 20 6a 73 6f 6e 50 72      }.    jsonPr
7fa0: 69 6e 74 66 28 31 30 30 2c 20 26 73 2c 22 6e 6f  intf(100, &s,"no
7fb0: 64 65 20 25 33 75 3a 20 25 37 73 20 6e 3d 25 2d  de %3u: %7s n=%-
7fc0: 34 64 20 75 70 3d 25 2d 34 64 22 2c 0a 20 20 20  4d up=%-4d",.   
7fd0: 20 20 20 20 20 20 20 20 20 20 20 20 69 2c 20 7a              i, z
7fe0: 54 79 70 65 2c 20 78 2e 61 4e 6f 64 65 5b 69 5d  Type, x.aNode[i]
7ff0: 2e 6e 2c 20 78 2e 61 55 70 5b 69 5d 29 3b 0a 20  .n, x.aUp[i]);. 
8000: 20 20 20 69 66 28 20 78 2e 61 4e 6f 64 65 5b 69     if( x.aNode[i
8010: 5d 2e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 21 3d 30  ].u.zJContent!=0
8020: 20 29 7b 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70   ){.      jsonAp
8030: 70 65 6e 64 52 61 77 28 26 73 2c 20 22 20 22 2c  pendRaw(&s, " ",
8040: 20 31 29 3b 0a 20 20 20 20 20 20 6a 73 6f 6e 41   1);.      jsonA
8050: 70 70 65 6e 64 52 61 77 28 26 73 2c 20 78 2e 61  ppendRaw(&s, x.a
8060: 4e 6f 64 65 5b 69 5d 2e 75 2e 7a 4a 43 6f 6e 74  Node[i].u.zJCont
8070: 65 6e 74 2c 20 78 2e 61 4e 6f 64 65 5b 69 5d 2e  ent, x.aNode[i].
8080: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 73  n);.    }.    js
8090: 6f 6e 41 70 70 65 6e 64 52 61 77 28 26 73 2c 20  onAppendRaw(&s, 
80a0: 22 5c 6e 22 2c 20 31 29 3b 0a 20 20 7d 0a 20 20  "\n", 1);.  }.  
80b0: 6a 73 6f 6e 50 61 72 73 65 52 65 73 65 74 28 26  jsonParseReset(&
80c0: 78 29 3b 0a 20 20 6a 73 6f 6e 52 65 73 75 6c 74  x);.  jsonResult
80d0: 28 26 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  (&s);.}../*.** T
80e0: 68 65 20 6a 73 6f 6e 5f 74 65 73 74 31 28 4a 53  he json_test1(JS
80f0: 4f 4e 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  ON) function ret
8100: 75 72 6e 20 74 72 75 65 20 28 31 29 20 69 66 20  urn true (1) if 
8110: 74 68 65 20 69 6e 70 75 74 20 69 73 20 4a 53 4f  the input is JSO
8120: 4e 0a 2a 2a 20 74 65 78 74 20 67 65 6e 65 72 61  N.** text genera
8130: 74 65 64 20 62 79 20 61 6e 6f 74 68 65 72 20 6a  ted by another j
8140: 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49  son function.  I
8150: 74 20 72 65 74 75 72 6e 73 20 28 30 29 20 69 66  t returns (0) if
8160: 20 74 68 65 20 69 6e 70 75 74 0a 2a 2a 20 69 73   the input.** is
8170: 20 6e 6f 74 20 6b 6e 6f 77 6e 20 74 6f 20 62 65   not known to be
8180: 20 4a 53 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63   JSON..*/.static
8190: 20 76 6f 69 64 20 6a 73 6f 6e 54 65 73 74 31 46   void jsonTest1F
81a0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
81b0: 6f 6e 74 65 78 74 20 2a 63 74 78 2c 0a 20 20 69  ontext *ctx,.  i
81c0: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
81d0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
81e0: 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
81f0: 4d 28 61 72 67 63 29 3b 0a 20 20 73 71 6c 69 74  M(argc);.  sqlit
8200: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 74  e3_result_int(ct
8210: 78 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  x, sqlite3_value
8220: 5f 73 75 62 74 79 70 65 28 61 72 67 76 5b 30 5d  _subtype(argv[0]
8230: 29 3d 3d 4a 53 4f 4e 5f 53 55 42 54 59 50 45 29  )==JSON_SUBTYPE)
8240: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
8250: 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f  LITE_DEBUG */../
8260: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8270: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
82b0: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70  SQL function imp
82c0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 2a  lementations.***
82d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
8320: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
8330: 20 6f 66 20 74 68 65 20 6a 73 6f 6e 5f 61 72 72   of the json_arr
8340: 61 79 28 56 41 4c 55 45 2c 2e 2e 2e 29 20 66 75  ay(VALUE,...) fu
8350: 6e 63 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20  nction.  Return 
8360: 61 20 4a 53 4f 4e 0a 2a 2a 20 61 72 72 61 79 20  a JSON.** array 
8370: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c  that contains al
8380: 6c 20 76 61 6c 75 65 73 20 67 69 76 65 6e 20 69  l values given i
8390: 6e 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 4f 72  n arguments.  Or
83a0: 20 69 66 20 61 6e 79 20 61 72 67 75 6d 65 6e 74   if any argument
83b0: 0a 2a 2a 20 69 73 20 61 20 42 4c 4f 42 2c 20 74  .** is a BLOB, t
83c0: 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  hrow an error..*
83d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73  /.static void js
83e0: 6f 6e 41 72 72 61 79 46 75 6e 63 28 0a 20 20 73  onArrayFunc(.  s
83f0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
8400: 63 74 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ctx,.  int argc,
8410: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
8420: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74   **argv.){.  int
8430: 20 69 3b 0a 20 20 4a 73 6f 6e 53 74 72 69 6e 67   i;.  JsonString
8440: 20 6a 78 3b 0a 0a 20 20 6a 73 6f 6e 49 6e 69 74   jx;..  jsonInit
8450: 28 26 6a 78 2c 20 63 74 78 29 3b 0a 20 20 6a 73  (&jx, ctx);.  js
8460: 6f 6e 41 70 70 65 6e 64 43 68 61 72 28 26 6a 78  onAppendChar(&jx
8470: 2c 20 27 5b 27 29 3b 0a 20 20 66 6f 72 28 69 3d  , '[');.  for(i=
8480: 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b  0; i<argc; i++){
8490: 0a 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 53  .    jsonAppendS
84a0: 65 70 61 72 61 74 6f 72 28 26 6a 78 29 3b 0a 20  eparator(&jx);. 
84b0: 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 56 61 6c     jsonAppendVal
84c0: 75 65 28 26 6a 78 2c 20 61 72 67 76 5b 69 5d 29  ue(&jx, argv[i])
84d0: 3b 0a 20 20 7d 0a 20 20 6a 73 6f 6e 41 70 70 65  ;.  }.  jsonAppe
84e0: 6e 64 43 68 61 72 28 26 6a 78 2c 20 27 5d 27 29  ndChar(&jx, ']')
84f0: 3b 0a 20 20 6a 73 6f 6e 52 65 73 75 6c 74 28 26  ;.  jsonResult(&
8500: 6a 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  jx);.  sqlite3_r
8510: 65 73 75 6c 74 5f 73 75 62 74 79 70 65 28 63 74  esult_subtype(ct
8520: 78 2c 20 4a 53 4f 4e 5f 53 55 42 54 59 50 45 29  x, JSON_SUBTYPE)
8530: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 6a 73 6f 6e  ;.}.../*.** json
8540: 5f 61 72 72 61 79 5f 6c 65 6e 67 74 68 28 4a 53  _array_length(JS
8550: 4f 4e 29 0a 2a 2a 20 6a 73 6f 6e 5f 61 72 72 61  ON).** json_arra
8560: 79 5f 6c 65 6e 67 74 68 28 4a 53 4f 4e 2c 20 50  y_length(JSON, P
8570: 41 54 48 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ATH).**.** Retur
8580: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
8590: 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
85a0: 74 6f 70 2d 6c 65 76 65 6c 20 4a 53 4f 4e 20 61  top-level JSON a
85b0: 72 72 61 79 2e 20 20 0a 2a 2a 20 52 65 74 75 72  rray.  .** Retur
85c0: 6e 20 30 20 69 66 20 74 68 65 20 69 6e 70 75 74  n 0 if the input
85d0: 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66   is not a well-f
85e0: 6f 72 6d 65 64 20 4a 53 4f 4e 20 61 72 72 61 79  ormed JSON array
85f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8600: 20 6a 73 6f 6e 41 72 72 61 79 4c 65 6e 67 74 68   jsonArrayLength
8610: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
8620: 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 0a 20 20  context *ctx,.  
8630: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
8640: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
8650: 0a 29 7b 0a 20 20 4a 73 6f 6e 50 61 72 73 65 20  .){.  JsonParse 
8660: 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  x;          /* T
8670: 68 65 20 70 61 72 73 65 20 2a 2f 0a 20 20 73 71  he parse */.  sq
8680: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 20 3d 20  lite3_int64 n = 
8690: 30 3b 0a 20 20 75 33 32 20 69 3b 0a 20 20 4a 73  0;.  u32 i;.  Js
86a0: 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 3b 0a 0a  onNode *pNode;..
86b0: 20 20 69 66 28 20 6a 73 6f 6e 50 61 72 73 65 28    if( jsonParse(
86c0: 26 78 2c 20 63 74 78 2c 20 28 63 6f 6e 73 74 20  &x, ctx, (const 
86d0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
86e0: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
86f0: 29 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  )) ) return;.  a
8700: 73 73 65 72 74 28 20 78 2e 6e 4e 6f 64 65 20 29  ssert( x.nNode )
8710: 3b 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 32 20  ;.  if( argc==2 
8720: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
8730: 72 20 2a 7a 50 61 74 68 20 3d 20 28 63 6f 6e 73  r *zPath = (cons
8740: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
8750: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
8760: 31 5d 29 3b 0a 20 20 20 20 70 4e 6f 64 65 20 3d  1]);.    pNode =
8770: 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 28 26 78 2c 20   jsonLookup(&x, 
8780: 7a 50 61 74 68 2c 20 30 2c 20 63 74 78 29 3b 0a  zPath, 0, ctx);.
8790: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 6f    }else{.    pNo
87a0: 64 65 20 3d 20 78 2e 61 4e 6f 64 65 3b 0a 20 20  de = x.aNode;.  
87b0: 7d 0a 20 20 69 66 28 20 70 4e 6f 64 65 3d 3d 30  }.  if( pNode==0
87c0: 20 29 7b 0a 20 20 20 20 78 2e 6e 45 72 72 20 3d   ){.    x.nErr =
87d0: 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
87e0: 70 4e 6f 64 65 2d 3e 65 54 79 70 65 3d 3d 4a 53  pNode->eType==JS
87f0: 4f 4e 5f 41 52 52 41 59 20 29 7b 0a 20 20 20 20  ON_ARRAY ){.    
8800: 61 73 73 65 72 74 28 20 28 70 4e 6f 64 65 2d 3e  assert( (pNode->
8810: 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f  jnFlags & JNODE_
8820: 41 50 50 45 4e 44 29 3d 3d 30 20 29 3b 0a 20 20  APPEND)==0 );.  
8830: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 4e    for(i=1; i<=pN
8840: 6f 64 65 2d 3e 6e 3b 20 6e 2b 2b 29 7b 0a 20 20  ode->n; n++){.  
8850: 20 20 20 20 69 20 2b 3d 20 6a 73 6f 6e 4e 6f 64      i += jsonNod
8860: 65 53 69 7a 65 28 26 70 4e 6f 64 65 5b 69 5d 29  eSize(&pNode[i])
8870: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
8880: 28 20 78 2e 6e 45 72 72 3d 3d 30 20 29 20 73 71  ( x.nErr==0 ) sq
8890: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
88a0: 36 34 28 63 74 78 2c 20 6e 29 3b 0a 20 20 6a 73  64(ctx, n);.  js
88b0: 6f 6e 50 61 72 73 65 52 65 73 65 74 28 26 78 29  onParseReset(&x)
88c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 6a 73 6f 6e 5f  ;.}../*.** json_
88d0: 65 78 74 72 61 63 74 28 4a 53 4f 4e 2c 20 50 41  extract(JSON, PA
88e0: 54 48 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 52  TH, ...).**.** R
88f0: 65 74 75 72 6e 20 74 68 65 20 65 6c 65 6d 65 6e  eturn the elemen
8900: 74 20 64 65 73 63 72 69 62 65 64 20 62 79 20 50  t described by P
8910: 41 54 48 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  ATH.  Return NUL
8920: 4c 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  L if there is no
8930: 0a 2a 2a 20 50 41 54 48 20 65 6c 65 6d 65 6e 74  .** PATH element
8940: 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20  .  If there are 
8950: 6d 75 6c 74 69 70 6c 65 20 50 41 54 48 73 2c 20  multiple PATHs, 
8960: 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20 4a 53  then return a JS
8970: 4f 4e 20 61 72 72 61 79 0a 2a 2a 20 77 69 74 68  ON array.** with
8980: 20 74 68 65 20 72 65 73 75 6c 74 20 66 72 6f 6d   the result from
8990: 20 65 61 63 68 20 70 61 74 68 2e 20 20 54 68 72   each path.  Thr
89a0: 6f 77 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74  ow an error if t
89b0: 68 65 20 4a 53 4f 4e 20 6f 72 20 61 6e 79 20 50  he JSON or any P
89c0: 41 54 48 0a 2a 2a 20 69 73 20 6d 61 6c 66 6f 72  ATH.** is malfor
89d0: 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  med..*/.static v
89e0: 6f 69 64 20 6a 73 6f 6e 45 78 74 72 61 63 74 46  oid jsonExtractF
89f0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
8a00: 6f 6e 74 65 78 74 20 2a 63 74 78 2c 0a 20 20 69  ontext *ctx,.  i
8a10: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
8a20: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
8a30: 29 7b 0a 20 20 4a 73 6f 6e 50 61 72 73 65 20 78  ){.  JsonParse x
8a40: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
8a50: 65 20 70 61 72 73 65 20 2a 2f 0a 20 20 4a 73 6f  e parse */.  Jso
8a60: 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 3b 0a 20 20  nNode *pNode;.  
8a70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
8a80: 68 3b 0a 20 20 4a 73 6f 6e 53 74 72 69 6e 67 20  h;.  JsonString 
8a90: 6a 78 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  jx;.  int i;..  
8aa0: 69 66 28 20 61 72 67 63 3c 32 20 29 20 72 65 74  if( argc<2 ) ret
8ab0: 75 72 6e 3b 0a 20 20 69 66 28 20 6a 73 6f 6e 50  urn;.  if( jsonP
8ac0: 61 72 73 65 28 26 78 2c 20 63 74 78 2c 20 28 63  arse(&x, ctx, (c
8ad0: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
8ae0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
8af0: 67 76 5b 30 5d 29 29 20 29 20 72 65 74 75 72 6e  gv[0])) ) return
8b00: 3b 0a 20 20 6a 73 6f 6e 49 6e 69 74 28 26 6a 78  ;.  jsonInit(&jx
8b10: 2c 20 63 74 78 29 3b 0a 20 20 6a 73 6f 6e 41 70  , ctx);.  jsonAp
8b20: 70 65 6e 64 43 68 61 72 28 26 6a 78 2c 20 27 5b  pendChar(&jx, '[
8b30: 27 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69  ');.  for(i=1; i
8b40: 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <argc; i++){.   
8b50: 20 7a 50 61 74 68 20 3d 20 28 63 6f 6e 73 74 20   zPath = (const 
8b60: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
8b70: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 69 5d  lue_text(argv[i]
8b80: 29 3b 0a 20 20 20 20 70 4e 6f 64 65 20 3d 20 6a  );.    pNode = j
8b90: 73 6f 6e 4c 6f 6f 6b 75 70 28 26 78 2c 20 7a 50  sonLookup(&x, zP
8ba0: 61 74 68 2c 20 30 2c 20 63 74 78 29 3b 0a 20 20  ath, 0, ctx);.  
8bb0: 20 20 69 66 28 20 78 2e 6e 45 72 72 20 29 20 62    if( x.nErr ) b
8bc0: 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 61 72  reak;.    if( ar
8bd0: 67 63 3e 32 20 29 7b 0a 20 20 20 20 20 20 6a 73  gc>2 ){.      js
8be0: 6f 6e 41 70 70 65 6e 64 53 65 70 61 72 61 74 6f  onAppendSeparato
8bf0: 72 28 26 6a 78 29 3b 0a 20 20 20 20 20 20 69 66  r(&jx);.      if
8c00: 28 20 70 4e 6f 64 65 20 29 7b 0a 20 20 20 20 20  ( pNode ){.     
8c10: 20 20 20 6a 73 6f 6e 52 65 6e 64 65 72 4e 6f 64     jsonRenderNod
8c20: 65 28 70 4e 6f 64 65 2c 20 26 6a 78 2c 20 30 29  e(pNode, &jx, 0)
8c30: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
8c40: 20 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e         jsonAppen
8c50: 64 52 61 77 28 26 6a 78 2c 20 22 6e 75 6c 6c 22  dRaw(&jx, "null"
8c60: 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 4);.      }.  
8c70: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4e 6f 64    }else if( pNod
8c80: 65 20 29 7b 0a 20 20 20 20 20 20 6a 73 6f 6e 52  e ){.      jsonR
8c90: 65 74 75 72 6e 28 70 4e 6f 64 65 2c 20 63 74 78  eturn(pNode, ctx
8ca0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
8cb0: 20 20 69 66 28 20 61 72 67 63 3e 32 20 26 26 20    if( argc>2 && 
8cc0: 69 3d 3d 61 72 67 63 20 29 7b 0a 20 20 20 20 6a  i==argc ){.    j
8cd0: 73 6f 6e 41 70 70 65 6e 64 43 68 61 72 28 26 6a  sonAppendChar(&j
8ce0: 78 2c 20 27 5d 27 29 3b 0a 20 20 20 20 6a 73 6f  x, ']');.    jso
8cf0: 6e 52 65 73 75 6c 74 28 26 6a 78 29 3b 0a 20 20  nResult(&jx);.  
8d00: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
8d10: 5f 73 75 62 74 79 70 65 28 63 74 78 2c 20 4a 53  _subtype(ctx, JS
8d20: 4f 4e 5f 53 55 42 54 59 50 45 29 3b 0a 20 20 7d  ON_SUBTYPE);.  }
8d30: 0a 20 20 6a 73 6f 6e 52 65 73 65 74 28 26 6a 78  .  jsonReset(&jx
8d40: 29 3b 0a 20 20 6a 73 6f 6e 50 61 72 73 65 52 65  );.  jsonParseRe
8d50: 73 65 74 28 26 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  set(&x);.}../*.*
8d60: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
8d70: 20 6f 66 20 74 68 65 20 6a 73 6f 6e 5f 6f 62 6a   of the json_obj
8d80: 65 63 74 28 4e 41 4d 45 2c 56 41 4c 55 45 2c 2e  ect(NAME,VALUE,.
8d90: 2e 2e 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 52  ..) function.  R
8da0: 65 74 75 72 6e 20 61 20 4a 53 4f 4e 0a 2a 2a 20  eturn a JSON.** 
8db0: 6f 62 6a 65 63 74 20 74 68 61 74 20 63 6f 6e 74  object that cont
8dc0: 61 69 6e 73 20 61 6c 6c 20 6e 61 6d 65 2f 76 61  ains all name/va
8dd0: 6c 75 65 20 67 69 76 65 6e 20 69 6e 20 61 72 67  lue given in arg
8de0: 75 6d 65 6e 74 73 2e 20 20 4f 72 20 69 66 20 61  uments.  Or if a
8df0: 6e 79 20 6e 61 6d 65 0a 2a 2a 20 69 73 20 6e 6f  ny name.** is no
8e00: 74 20 61 20 73 74 72 69 6e 67 20 6f 72 20 69 66  t a string or if
8e10: 20 61 6e 79 20 76 61 6c 75 65 20 69 73 20 61 20   any value is a 
8e20: 42 4c 4f 42 2c 20 74 68 72 6f 77 20 61 6e 20 65  BLOB, throw an e
8e30: 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rror..*/.static 
8e40: 76 6f 69 64 20 6a 73 6f 6e 4f 62 6a 65 63 74 46  void jsonObjectF
8e50: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
8e60: 6f 6e 74 65 78 74 20 2a 63 74 78 2c 0a 20 20 69  ontext *ctx,.  i
8e70: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
8e80: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
8e90: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4a 73  ){.  int i;.  Js
8ea0: 6f 6e 53 74 72 69 6e 67 20 6a 78 3b 0a 20 20 63  onString jx;.  c
8eb0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
8ec0: 75 33 32 20 6e 3b 0a 0a 20 20 69 66 28 20 61 72  u32 n;..  if( ar
8ed0: 67 63 26 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  gc&1 ){.    sqli
8ee0: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
8ef0: 28 63 74 78 2c 20 22 6a 73 6f 6e 5f 6f 62 6a 65  (ctx, "json_obje
8f00: 63 74 28 29 20 72 65 71 75 69 72 65 73 20 61 6e  ct() requires an
8f10: 20 65 76 65 6e 20 6e 75 6d 62 65 72 20 22 0a 20   even number ". 
8f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f40: 20 22 6f 66 20 61 72 67 75 6d 65 6e 74 73 22 2c   "of arguments",
8f50: 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e   -1);.    return
8f60: 3b 0a 20 20 7d 0a 20 20 6a 73 6f 6e 49 6e 69 74  ;.  }.  jsonInit
8f70: 28 26 6a 78 2c 20 63 74 78 29 3b 0a 20 20 6a 73  (&jx, ctx);.  js
8f80: 6f 6e 41 70 70 65 6e 64 43 68 61 72 28 26 6a 78  onAppendChar(&jx
8f90: 2c 20 27 7b 27 29 3b 0a 20 20 66 6f 72 28 69 3d  , '{');.  for(i=
8fa0: 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 3d 32 29  0; i<argc; i+=2)
8fb0: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
8fc0: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
8fd0: 76 5b 69 5d 29 21 3d 53 51 4c 49 54 45 5f 54 45  v[i])!=SQLITE_TE
8fe0: 58 54 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  XT ){.      sqli
8ff0: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
9000: 28 63 74 78 2c 20 22 6a 73 6f 6e 5f 6f 62 6a 65  (ctx, "json_obje
9010: 63 74 28 29 20 6c 61 62 65 6c 73 20 6d 75 73 74  ct() labels must
9020: 20 62 65 20 54 45 58 54 22 2c 20 2d 31 29 3b 0a   be TEXT", -1);.
9030: 20 20 20 20 20 20 6a 73 6f 6e 52 65 73 65 74 28        jsonReset(
9040: 26 6a 78 29 3b 0a 20 20 20 20 20 20 72 65 74 75  &jx);.      retu
9050: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 73  rn;.    }.    js
9060: 6f 6e 41 70 70 65 6e 64 53 65 70 61 72 61 74 6f  onAppendSeparato
9070: 72 28 26 6a 78 29 3b 0a 20 20 20 20 7a 20 3d 20  r(&jx);.    z = 
9080: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
9090: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
90a0: 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 6e 20  argv[i]);.    n 
90b0: 3d 20 28 75 33 32 29 73 71 6c 69 74 65 33 5f 76  = (u32)sqlite3_v
90c0: 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b  alue_bytes(argv[
90d0: 69 5d 29 3b 0a 20 20 20 20 6a 73 6f 6e 41 70 70  i]);.    jsonApp
90e0: 65 6e 64 53 74 72 69 6e 67 28 26 6a 78 2c 20 7a  endString(&jx, z
90f0: 2c 20 6e 29 3b 0a 20 20 20 20 6a 73 6f 6e 41 70  , n);.    jsonAp
9100: 70 65 6e 64 43 68 61 72 28 26 6a 78 2c 20 27 3a  pendChar(&jx, ':
9110: 27 29 3b 0a 20 20 20 20 6a 73 6f 6e 41 70 70 65  ');.    jsonAppe
9120: 6e 64 56 61 6c 75 65 28 26 6a 78 2c 20 61 72 67  ndValue(&jx, arg
9130: 76 5b 69 2b 31 5d 29 3b 0a 20 20 7d 0a 20 20 6a  v[i+1]);.  }.  j
9140: 73 6f 6e 41 70 70 65 6e 64 43 68 61 72 28 26 6a  sonAppendChar(&j
9150: 78 2c 20 27 7d 27 29 3b 0a 20 20 6a 73 6f 6e 52  x, '}');.  jsonR
9160: 65 73 75 6c 74 28 26 6a 78 29 3b 0a 20 20 73 71  esult(&jx);.  sq
9170: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 73 75 62  lite3_result_sub
9180: 74 79 70 65 28 63 74 78 2c 20 4a 53 4f 4e 5f 53  type(ctx, JSON_S
9190: 55 42 54 59 50 45 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  UBTYPE);.}.../*.
91a0: 2a 2a 20 6a 73 6f 6e 5f 72 65 6d 6f 76 65 28 4a  ** json_remove(J
91b0: 53 4f 4e 2c 20 50 41 54 48 2c 20 2e 2e 2e 29 0a  SON, PATH, ...).
91c0: 2a 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65  **.** Remove the
91d0: 20 6e 61 6d 65 64 20 65 6c 65 6d 65 6e 74 73 20   named elements 
91e0: 66 72 6f 6d 20 4a 53 4f 4e 20 61 6e 64 20 72 65  from JSON and re
91f0: 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e  turn the result.
9200: 20 20 6d 61 6c 66 6f 72 6d 65 64 0a 2a 2a 20 4a    malformed.** J
9210: 53 4f 4e 20 6f 72 20 50 41 54 48 20 61 72 67 75  SON or PATH argu
9220: 6d 65 6e 74 73 20 72 65 73 75 6c 74 20 69 6e 20  ments result in 
9230: 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61  an error..*/.sta
9240: 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 52 65 6d  tic void jsonRem
9250: 6f 76 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  oveFunc(.  sqlit
9260: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c  e3_context *ctx,
9270: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
9280: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
9290: 72 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e 50 61 72  rgv.){.  JsonPar
92a0: 73 65 20 78 3b 20 20 20 20 20 20 20 20 20 20 2f  se x;          /
92b0: 2a 20 54 68 65 20 70 61 72 73 65 20 2a 2f 0a 20  * The parse */. 
92c0: 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65   JsonNode *pNode
92d0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
92e0: 7a 50 61 74 68 3b 0a 20 20 75 33 32 20 69 3b 0a  zPath;.  u32 i;.
92f0: 0a 20 20 69 66 28 20 61 72 67 63 3c 31 20 29 20  .  if( argc<1 ) 
9300: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6a 73  return;.  if( js
9310: 6f 6e 50 61 72 73 65 28 26 78 2c 20 63 74 78 2c  onParse(&x, ctx,
9320: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
9330: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
9340: 28 61 72 67 76 5b 30 5d 29 29 20 29 20 72 65 74  (argv[0])) ) ret
9350: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 78  urn;.  assert( x
9360: 2e 6e 4e 6f 64 65 20 29 3b 0a 20 20 66 6f 72 28  .nNode );.  for(
9370: 69 3d 31 3b 20 69 3c 28 75 33 32 29 61 72 67 63  i=1; i<(u32)argc
9380: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a 50 61 74  ; i++){.    zPat
9390: 68 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  h = (const char*
93a0: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
93b0: 65 78 74 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20  ext(argv[i]);.  
93c0: 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20 29    if( zPath==0 )
93d0: 20 67 6f 74 6f 20 72 65 6d 6f 76 65 5f 64 6f 6e   goto remove_don
93e0: 65 3b 0a 20 20 20 20 70 4e 6f 64 65 20 3d 20 6a  e;.    pNode = j
93f0: 73 6f 6e 4c 6f 6f 6b 75 70 28 26 78 2c 20 7a 50  sonLookup(&x, zP
9400: 61 74 68 2c 20 30 2c 20 63 74 78 29 3b 0a 20 20  ath, 0, ctx);.  
9410: 20 20 69 66 28 20 78 2e 6e 45 72 72 20 29 20 67    if( x.nErr ) g
9420: 6f 74 6f 20 72 65 6d 6f 76 65 5f 64 6f 6e 65 3b  oto remove_done;
9430: 0a 20 20 20 20 69 66 28 20 70 4e 6f 64 65 20 29  .    if( pNode )
9440: 20 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73 20   pNode->jnFlags 
9450: 7c 3d 20 4a 4e 4f 44 45 5f 52 45 4d 4f 56 45 3b  |= JNODE_REMOVE;
9460: 0a 20 20 7d 0a 20 20 69 66 28 20 28 78 2e 61 4e  .  }.  if( (x.aN
9470: 6f 64 65 5b 30 5d 2e 6a 6e 46 6c 61 67 73 20 26  ode[0].jnFlags &
9480: 20 4a 4e 4f 44 45 5f 52 45 4d 4f 56 45 29 3d 3d   JNODE_REMOVE)==
9490: 30 20 29 7b 0a 20 20 20 20 6a 73 6f 6e 52 65 74  0 ){.    jsonRet
94a0: 75 72 6e 4a 73 6f 6e 28 78 2e 61 4e 6f 64 65 2c  urnJson(x.aNode,
94b0: 20 63 74 78 2c 20 30 29 3b 0a 20 20 7d 0a 72 65   ctx, 0);.  }.re
94c0: 6d 6f 76 65 5f 64 6f 6e 65 3a 0a 20 20 6a 73 6f  move_done:.  jso
94d0: 6e 50 61 72 73 65 52 65 73 65 74 28 26 78 29 3b  nParseReset(&x);
94e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 6a 73 6f 6e 5f 72  .}../*.** json_r
94f0: 65 70 6c 61 63 65 28 4a 53 4f 4e 2c 20 50 41 54  eplace(JSON, PAT
9500: 48 2c 20 56 41 4c 55 45 2c 20 2e 2e 2e 29 0a 2a  H, VALUE, ...).*
9510: 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74 68 65  *.** Replace the
9520: 20 76 61 6c 75 65 20 61 74 20 50 41 54 48 20 77   value at PATH w
9530: 69 74 68 20 56 41 4c 55 45 2e 20 20 49 66 20 50  ith VALUE.  If P
9540: 41 54 48 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72  ATH does not alr
9550: 65 61 64 79 20 65 78 69 73 74 2c 0a 2a 2a 20 74  eady exist,.** t
9560: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
9570: 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 4a 53 4f 4e   no-op.  If JSON
9580: 20 6f 72 20 50 41 54 48 20 69 73 20 6d 61 6c 66   or PATH is malf
9590: 6f 72 6d 65 64 2c 20 74 68 72 6f 77 20 61 6e 20  ormed, throw an 
95a0: 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  error..*/.static
95b0: 20 76 6f 69 64 20 6a 73 6f 6e 52 65 70 6c 61 63   void jsonReplac
95c0: 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  eFunc(.  sqlite3
95d0: 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 0a 20  _context *ctx,. 
95e0: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
95f0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
9600: 76 0a 29 7b 0a 20 20 4a 73 6f 6e 50 61 72 73 65  v.){.  JsonParse
9610: 20 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   x;          /* 
9620: 54 68 65 20 70 61 72 73 65 20 2a 2f 0a 20 20 4a  The parse */.  J
9630: 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 3b 0a  sonNode *pNode;.
9640: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
9650: 61 74 68 3b 0a 20 20 75 33 32 20 69 3b 0a 0a 20  ath;.  u32 i;.. 
9660: 20 69 66 28 20 61 72 67 63 3c 31 20 29 20 72 65   if( argc<1 ) re
9670: 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 61 72 67  turn;.  if( (arg
9680: 63 26 31 29 3d 3d 30 20 29 20 7b 0a 20 20 20 20  c&1)==0 ) {.    
9690: 6a 73 6f 6e 57 72 6f 6e 67 4e 75 6d 41 72 67 73  jsonWrongNumArgs
96a0: 28 63 74 78 2c 20 22 72 65 70 6c 61 63 65 22 29  (ctx, "replace")
96b0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
96c0: 7d 0a 20 20 69 66 28 20 6a 73 6f 6e 50 61 72 73  }.  if( jsonPars
96d0: 65 28 26 78 2c 20 63 74 78 2c 20 28 63 6f 6e 73  e(&x, ctx, (cons
96e0: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
96f0: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
9700: 30 5d 29 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  0])) ) return;. 
9710: 20 61 73 73 65 72 74 28 20 78 2e 6e 4e 6f 64 65   assert( x.nNode
9720: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69   );.  for(i=1; i
9730: 3c 28 75 33 32 29 61 72 67 63 3b 20 69 2b 3d 32  <(u32)argc; i+=2
9740: 29 7b 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 28  ){.    zPath = (
9750: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
9760: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
9770: 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 70 4e 6f  rgv[i]);.    pNo
9780: 64 65 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 28  de = jsonLookup(
9790: 26 78 2c 20 7a 50 61 74 68 2c 20 30 2c 20 63 74  &x, zPath, 0, ct
97a0: 78 29 3b 0a 20 20 20 20 69 66 28 20 78 2e 6e 45  x);.    if( x.nE
97b0: 72 72 20 29 20 67 6f 74 6f 20 72 65 70 6c 61 63  rr ) goto replac
97c0: 65 5f 65 72 72 3b 0a 20 20 20 20 69 66 28 20 70  e_err;.    if( p
97d0: 4e 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 70 4e  Node ){.      pN
97e0: 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73 20 7c 3d 20  ode->jnFlags |= 
97f0: 28 75 38 29 4a 4e 4f 44 45 5f 52 45 50 4c 41 43  (u8)JNODE_REPLAC
9800: 45 3b 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e  E;.      pNode->
9810: 69 56 61 6c 20 3d 20 28 75 38 29 28 69 2b 31 29  iVal = (u8)(i+1)
9820: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
9830: 28 20 78 2e 61 4e 6f 64 65 5b 30 5d 2e 6a 6e 46  ( x.aNode[0].jnF
9840: 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 52 45 50  lags & JNODE_REP
9850: 4c 41 43 45 20 29 7b 0a 20 20 20 20 73 71 6c 69  LACE ){.    sqli
9860: 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65  te3_result_value
9870: 28 63 74 78 2c 20 61 72 67 76 5b 78 2e 61 4e 6f  (ctx, argv[x.aNo
9880: 64 65 5b 30 5d 2e 69 56 61 6c 5d 29 3b 0a 20 20  de[0].iVal]);.  
9890: 7d 65 6c 73 65 7b 0a 20 20 20 20 6a 73 6f 6e 52  }else{.    jsonR
98a0: 65 74 75 72 6e 4a 73 6f 6e 28 78 2e 61 4e 6f 64  eturnJson(x.aNod
98b0: 65 2c 20 63 74 78 2c 20 61 72 67 76 29 3b 0a 20  e, ctx, argv);. 
98c0: 20 7d 0a 72 65 70 6c 61 63 65 5f 65 72 72 3a 0a   }.replace_err:.
98d0: 20 20 6a 73 6f 6e 50 61 72 73 65 52 65 73 65 74    jsonParseReset
98e0: 28 26 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 6a  (&x);.}../*.** j
98f0: 73 6f 6e 5f 73 65 74 28 4a 53 4f 4e 2c 20 50 41  son_set(JSON, PA
9900: 54 48 2c 20 56 41 4c 55 45 2c 20 2e 2e 2e 29 0a  TH, VALUE, ...).
9910: 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61  **.** Set the va
9920: 6c 75 65 20 61 74 20 50 41 54 48 20 74 6f 20 56  lue at PATH to V
9930: 41 4c 55 45 2e 20 20 43 72 65 61 74 65 20 74 68  ALUE.  Create th
9940: 65 20 50 41 54 48 20 69 66 20 69 74 20 64 6f 65  e PATH if it doe
9950: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a  s not already.**
9960: 20 65 78 69 73 74 2e 20 20 4f 76 65 72 77 72 69   exist.  Overwri
9970: 74 65 20 65 78 69 73 74 69 6e 67 20 76 61 6c 75  te existing valu
9980: 65 73 20 74 68 61 74 20 64 6f 20 65 78 69 73 74  es that do exist
9990: 2e 0a 2a 2a 20 49 66 20 4a 53 4f 4e 20 6f 72 20  ..** If JSON or 
99a0: 50 41 54 48 20 69 73 20 6d 61 6c 66 6f 72 6d 65  PATH is malforme
99b0: 64 2c 20 74 68 72 6f 77 20 61 6e 20 65 72 72 6f  d, throw an erro
99c0: 72 2e 0a 2a 2a 0a 2a 2a 20 6a 73 6f 6e 5f 69 6e  r..**.** json_in
99d0: 73 65 72 74 28 4a 53 4f 4e 2c 20 50 41 54 48 2c  sert(JSON, PATH,
99e0: 20 56 41 4c 55 45 2c 20 2e 2e 2e 29 0a 2a 2a 0a   VALUE, ...).**.
99f0: 2a 2a 20 43 72 65 61 74 65 20 50 41 54 48 20 61  ** Create PATH a
9a00: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74  nd initialize it
9a10: 20 74 6f 20 56 41 4c 55 45 2e 20 20 49 66 20 50   to VALUE.  If P
9a20: 41 54 48 20 61 6c 72 65 61 64 79 20 65 78 69 73  ATH already exis
9a30: 74 73 2c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  ts, this.** rout
9a40: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ine is a no-op. 
9a50: 20 49 66 20 4a 53 4f 4e 20 6f 72 20 50 41 54 48   If JSON or PATH
9a60: 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 2c 20 74   is malformed, t
9a70: 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  hrow an error..*
9a80: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73  /.static void js
9a90: 6f 6e 53 65 74 46 75 6e 63 28 0a 20 20 73 71 6c  onSetFunc(.  sql
9aa0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74  ite3_context *ct
9ab0: 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  x,.  int argc,. 
9ac0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
9ad0: 2a 61 72 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e 50  *argv.){.  JsonP
9ae0: 61 72 73 65 20 78 3b 20 20 20 20 20 20 20 20 20  arse x;         
9af0: 20 2f 2a 20 54 68 65 20 70 61 72 73 65 20 2a 2f   /* The parse */
9b00: 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f  .  JsonNode *pNo
9b10: 64 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  de;.  const char
9b20: 20 2a 7a 50 61 74 68 3b 0a 20 20 75 33 32 20 69   *zPath;.  u32 i
9b30: 3b 0a 20 20 69 6e 74 20 62 41 70 6e 64 3b 0a 20  ;.  int bApnd;. 
9b40: 20 69 6e 74 20 62 49 73 53 65 74 20 3d 20 2a 28   int bIsSet = *(
9b50: 69 6e 74 2a 29 73 71 6c 69 74 65 33 5f 75 73 65  int*)sqlite3_use
9b60: 72 5f 64 61 74 61 28 63 74 78 29 3b 0a 0a 20 20  r_data(ctx);..  
9b70: 69 66 28 20 61 72 67 63 3c 31 20 29 20 72 65 74  if( argc<1 ) ret
9b80: 75 72 6e 3b 0a 20 20 69 66 28 20 28 61 72 67 63  urn;.  if( (argc
9b90: 26 31 29 3d 3d 30 20 29 20 7b 0a 20 20 20 20 6a  &1)==0 ) {.    j
9ba0: 73 6f 6e 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  sonWrongNumArgs(
9bb0: 63 74 78 2c 20 62 49 73 53 65 74 20 3f 20 22 73  ctx, bIsSet ? "s
9bc0: 65 74 22 20 3a 20 22 69 6e 73 65 72 74 22 29 3b  et" : "insert");
9bd0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
9be0: 0a 20 20 69 66 28 20 6a 73 6f 6e 50 61 72 73 65  .  if( jsonParse
9bf0: 28 26 78 2c 20 63 74 78 2c 20 28 63 6f 6e 73 74  (&x, ctx, (const
9c00: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
9c10: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
9c20: 5d 29 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ])) ) return;.  
9c30: 61 73 73 65 72 74 28 20 78 2e 6e 4e 6f 64 65 20  assert( x.nNode 
9c40: 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  );.  for(i=1; i<
9c50: 28 75 33 32 29 61 72 67 63 3b 20 69 2b 3d 32 29  (u32)argc; i+=2)
9c60: 7b 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 28 63  {.    zPath = (c
9c70: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
9c80: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
9c90: 67 76 5b 69 5d 29 3b 0a 20 20 20 20 62 41 70 6e  gv[i]);.    bApn
9ca0: 64 20 3d 20 30 3b 0a 20 20 20 20 70 4e 6f 64 65  d = 0;.    pNode
9cb0: 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 28 26 78   = jsonLookup(&x
9cc0: 2c 20 7a 50 61 74 68 2c 20 26 62 41 70 6e 64 2c  , zPath, &bApnd,
9cd0: 20 63 74 78 29 3b 0a 20 20 20 20 69 66 28 20 78   ctx);.    if( x
9ce0: 2e 6f 6f 6d 20 29 7b 0a 20 20 20 20 20 20 73 71  .oom ){.      sq
9cf0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
9d00: 6f 72 5f 6e 6f 6d 65 6d 28 63 74 78 29 3b 0a 20  or_nomem(ctx);. 
9d10: 20 20 20 20 20 67 6f 74 6f 20 6a 73 6f 6e 53 65       goto jsonSe
9d20: 74 44 6f 6e 65 3b 0a 20 20 20 20 7d 65 6c 73 65  tDone;.    }else
9d30: 20 69 66 28 20 78 2e 6e 45 72 72 20 29 7b 0a 20   if( x.nErr ){. 
9d40: 20 20 20 20 20 67 6f 74 6f 20 6a 73 6f 6e 53 65       goto jsonSe
9d50: 74 44 6f 6e 65 3b 0a 20 20 20 20 7d 65 6c 73 65  tDone;.    }else
9d60: 20 69 66 28 20 70 4e 6f 64 65 20 26 26 20 28 62   if( pNode && (b
9d70: 41 70 6e 64 20 7c 7c 20 62 49 73 53 65 74 29 20  Apnd || bIsSet) 
9d80: 29 7b 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e  ){.      pNode->
9d90: 6a 6e 46 6c 61 67 73 20 7c 3d 20 28 75 38 29 4a  jnFlags |= (u8)J
9da0: 4e 4f 44 45 5f 52 45 50 4c 41 43 45 3b 0a 20 20  NODE_REPLACE;.  
9db0: 20 20 20 20 70 4e 6f 64 65 2d 3e 69 56 61 6c 20      pNode->iVal 
9dc0: 3d 20 28 75 38 29 28 69 2b 31 29 3b 0a 20 20 20  = (u8)(i+1);.   
9dd0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 78 2e 61   }.  }.  if( x.a
9de0: 4e 6f 64 65 5b 30 5d 2e 6a 6e 46 6c 61 67 73 20  Node[0].jnFlags 
9df0: 26 20 4a 4e 4f 44 45 5f 52 45 50 4c 41 43 45 20  & JNODE_REPLACE 
9e00: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
9e10: 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 74 78 2c  esult_value(ctx,
9e20: 20 61 72 67 76 5b 78 2e 61 4e 6f 64 65 5b 30 5d   argv[x.aNode[0]
9e30: 2e 69 56 61 6c 5d 29 3b 0a 20 20 7d 65 6c 73 65  .iVal]);.  }else
9e40: 7b 0a 20 20 20 20 6a 73 6f 6e 52 65 74 75 72 6e  {.    jsonReturn
9e50: 4a 73 6f 6e 28 78 2e 61 4e 6f 64 65 2c 20 63 74  Json(x.aNode, ct
9e60: 78 2c 20 61 72 67 76 29 3b 0a 20 20 7d 0a 6a 73  x, argv);.  }.js
9e70: 6f 6e 53 65 74 44 6f 6e 65 3a 0a 20 20 6a 73 6f  onSetDone:.  jso
9e80: 6e 50 61 72 73 65 52 65 73 65 74 28 26 78 29 3b  nParseReset(&x);
9e90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 6a 73 6f 6e 5f 74  .}../*.** json_t
9ea0: 79 70 65 28 4a 53 4f 4e 29 0a 2a 2a 20 6a 73 6f  ype(JSON).** jso
9eb0: 6e 5f 74 79 70 65 28 4a 53 4f 4e 2c 20 50 41 54  n_type(JSON, PAT
9ec0: 48 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  H).**.** Return 
9ed0: 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 22 74  the top-level "t
9ee0: 79 70 65 22 20 6f 66 20 61 20 4a 53 4f 4e 20 73  ype" of a JSON s
9ef0: 74 72 69 6e 67 2e 20 20 54 68 72 6f 77 20 61 6e  tring.  Throw an
9f00: 20 65 72 72 6f 72 20 69 66 0a 2a 2a 20 65 69 74   error if.** eit
9f10: 68 65 72 20 74 68 65 20 4a 53 4f 4e 20 6f 72 20  her the JSON or 
9f20: 50 41 54 48 20 69 6e 70 75 74 73 20 61 72 65 20  PATH inputs are 
9f30: 6e 6f 74 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e  not well-formed.
9f40: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9f50: 6a 73 6f 6e 54 79 70 65 46 75 6e 63 28 0a 20 20  jsonTypeFunc(.  
9f60: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
9f70: 2a 63 74 78 2c 0a 20 20 69 6e 74 20 61 72 67 63  *ctx,.  int argc
9f80: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
9f90: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 4a 73  e **argv.){.  Js
9fa0: 6f 6e 50 61 72 73 65 20 78 3b 20 20 20 20 20 20  onParse x;      
9fb0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
9fc0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
9fd0: 20 2a 7a 50 61 74 68 3b 0a 20 20 4a 73 6f 6e 4e   *zPath;.  JsonN
9fe0: 6f 64 65 20 2a 70 4e 6f 64 65 3b 0a 0a 20 20 69  ode *pNode;..  i
9ff0: 66 28 20 6a 73 6f 6e 50 61 72 73 65 28 26 78 2c  f( jsonParse(&x,
a000: 20 63 74 78 2c 20 28 63 6f 6e 73 74 20 63 68 61   ctx, (const cha
a010: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
a020: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 29 20  _text(argv[0])) 
a030: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
a040: 72 74 28 20 78 2e 6e 4e 6f 64 65 20 29 3b 0a 20  rt( x.nNode );. 
a050: 20 69 66 28 20 61 72 67 63 3d 3d 32 20 29 7b 0a   if( argc==2 ){.
a060: 20 20 20 20 7a 50 61 74 68 20 3d 20 28 63 6f 6e      zPath = (con
a070: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
a080: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
a090: 5b 31 5d 29 3b 0a 20 20 20 20 70 4e 6f 64 65 20  [1]);.    pNode 
a0a0: 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 28 26 78 2c  = jsonLookup(&x,
a0b0: 20 7a 50 61 74 68 2c 20 30 2c 20 63 74 78 29 3b   zPath, 0, ctx);
a0c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e  .  }else{.    pN
a0d0: 6f 64 65 20 3d 20 78 2e 61 4e 6f 64 65 3b 0a 20  ode = x.aNode;. 
a0e0: 20 7d 0a 20 20 69 66 28 20 70 4e 6f 64 65 20 29   }.  if( pNode )
a0f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
a100: 73 75 6c 74 5f 74 65 78 74 28 63 74 78 2c 20 6a  sult_text(ctx, j
a110: 73 6f 6e 54 79 70 65 5b 70 4e 6f 64 65 2d 3e 65  sonType[pNode->e
a120: 54 79 70 65 5d 2c 20 2d 31 2c 20 53 51 4c 49 54  Type], -1, SQLIT
a130: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 20  E_STATIC);.  }. 
a140: 20 6a 73 6f 6e 50 61 72 73 65 52 65 73 65 74 28   jsonParseReset(
a150: 26 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 6a 73  &x);.}../*.** js
a160: 6f 6e 5f 76 61 6c 69 64 28 4a 53 4f 4e 29 0a 2a  on_valid(JSON).*
a170: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66  *.** Return 1 if
a180: 20 4a 53 4f 4e 20 69 73 20 61 20 77 65 6c 6c 2d   JSON is a well-
a190: 66 6f 72 6d 65 64 20 4a 53 4f 4e 20 73 74 72 69  formed JSON stri
a1a0: 6e 67 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  ng according to 
a1b0: 52 46 43 2d 37 31 35 39 2e 0a 2a 2a 20 52 65 74  RFC-7159..** Ret
a1c0: 75 72 6e 20 30 20 6f 74 68 65 72 77 69 73 65 2e  urn 0 otherwise.
a1d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
a1e0: 6a 73 6f 6e 56 61 6c 69 64 46 75 6e 63 28 0a 20  jsonValidFunc(. 
a1f0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
a200: 20 2a 63 74 78 2c 0a 20 20 69 6e 74 20 61 72 67   *ctx,.  int arg
a210: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
a220: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 4a  ue **argv.){.  J
a230: 73 6f 6e 50 61 72 73 65 20 78 3b 20 20 20 20 20  sonParse x;     
a240: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
a250: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  e */.  int rc = 
a260: 30 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  0;..  UNUSED_PAR
a270: 41 4d 28 61 72 67 63 29 3b 0a 20 20 69 66 28 20  AM(argc);.  if( 
a280: 6a 73 6f 6e 50 61 72 73 65 28 26 78 2c 20 30 2c  jsonParse(&x, 0,
a290: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
a2a0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
a2b0: 28 61 72 67 76 5b 30 5d 29 29 3d 3d 30 20 29 7b  (argv[0]))==0 ){
a2c0: 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d  .    rc = 1;.  }
a2d0: 0a 20 20 6a 73 6f 6e 50 61 72 73 65 52 65 73 65  .  jsonParseRese
a2e0: 74 28 26 78 29 3b 0a 20 20 73 71 6c 69 74 65 33  t(&x);.  sqlite3
a2f0: 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 74 78 2c  _result_int(ctx,
a300: 20 72 63 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66   rc);.}..#ifndef
a310: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
a320: 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 2a 2a 2a 2a  TUALTABLE./*****
a330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a370: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  *******.** The j
a380: 73 6f 6e 5f 65 61 63 68 20 76 69 72 74 75 61 6c  son_each virtual
a390: 20 74 61 62 6c 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a   table.*********
a3a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a3b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a3c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a3d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a3e0: 2a 2a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ***/.typedef str
a3f0: 75 63 74 20 4a 73 6f 6e 45 61 63 68 43 75 72 73  uct JsonEachCurs
a400: 6f 72 20 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f  or JsonEachCurso
a410: 72 3b 0a 73 74 72 75 63 74 20 4a 73 6f 6e 45 61  r;.struct JsonEa
a420: 63 68 43 75 72 73 6f 72 20 7b 0a 20 20 73 71 6c  chCursor {.  sql
a430: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
a440: 20 62 61 73 65 3b 20 20 2f 2a 20 42 61 73 65 20   base;  /* Base 
a450: 63 6c 61 73 73 20 2d 20 6d 75 73 74 20 62 65 20  class - must be 
a460: 66 69 72 73 74 20 2a 2f 0a 20 20 75 33 32 20 69  first */.  u32 i
a470: 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20  Rowid;          
a480: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 77        /* The row
a490: 69 64 20 2a 2f 0a 20 20 75 33 32 20 69 42 65 67  id */.  u32 iBeg
a4a0: 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  in;             
a4b0: 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
a4c0: 6e 6f 64 65 20 6f 66 20 74 68 65 20 73 63 61 6e  node of the scan
a4d0: 20 2a 2f 0a 20 20 75 33 32 20 69 3b 20 20 20 20   */.  u32 i;    
a4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4f0: 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 73 50 61   /* Index in sPa
a500: 72 73 65 2e 61 4e 6f 64 65 5b 5d 20 6f 66 20 63  rse.aNode[] of c
a510: 75 72 72 65 6e 74 20 72 6f 77 20 2a 2f 0a 20 20  urrent row */.  
a520: 75 33 32 20 69 45 6e 64 3b 20 20 20 20 20 20 20  u32 iEnd;       
a530: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 4f             /* EO
a540: 46 20 77 68 65 6e 20 69 20 65 71 75 61 6c 73 20  F when i equals 
a550: 6f 72 20 65 78 63 65 65 64 73 20 74 68 69 73 20  or exceeds this 
a560: 76 61 6c 75 65 20 2a 2f 0a 20 20 75 38 20 65 54  value */.  u8 eT
a570: 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ype;            
a580: 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66        /* Type of
a590: 20 74 6f 70 2d 6c 65 76 65 6c 20 65 6c 65 6d 65   top-level eleme
a5a0: 6e 74 20 2a 2f 0a 20 20 75 38 20 62 52 65 63 75  nt */.  u8 bRecu
a5b0: 72 73 69 76 65 3b 20 20 20 20 20 20 20 20 20 20  rsive;          
a5c0: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 6a     /* True for j
a5d0: 73 6f 6e 5f 74 72 65 65 28 29 2e 20 20 46 61 6c  son_tree().  Fal
a5e0: 73 65 20 66 6f 72 20 6a 73 6f 6e 5f 65 61 63 68  se for json_each
a5f0: 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a  () */.  char *zJ
a600: 73 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  son;            
a610: 20 20 20 2f 2a 20 49 6e 70 75 74 20 4a 53 4f 4e     /* Input JSON
a620: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 52 6f 6f   */.  char *zRoo
a630: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
a640: 20 2f 2a 20 50 61 74 68 20 62 79 20 77 68 69 63   /* Path by whic
a650: 68 20 74 6f 20 66 69 6c 74 65 72 20 7a 4a 73 6f  h to filter zJso
a660: 6e 20 2a 2f 0a 20 20 4a 73 6f 6e 50 61 72 73 65  n */.  JsonParse
a670: 20 73 50 61 72 73 65 3b 20 20 20 20 20 20 20 20   sParse;        
a680: 20 20 2f 2a 20 50 61 72 73 65 20 6f 66 20 74 68    /* Parse of th
a690: 65 20 69 6e 70 75 74 20 4a 53 4f 4e 20 2a 2f 0a  e input JSON */.
a6a0: 7d 3b 0a 0a 2f 2a 20 43 6f 6e 73 74 72 75 63 74  };../* Construct
a6b0: 6f 72 20 66 6f 72 20 74 68 65 20 6a 73 6f 6e 5f  or for the json_
a6c0: 65 61 63 68 20 76 69 72 74 75 61 6c 20 74 61 62  each virtual tab
a6d0: 6c 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  le */.static int
a6e0: 20 6a 73 6f 6e 45 61 63 68 43 6f 6e 6e 65 63 74   jsonEachConnect
a6f0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
a700: 0a 20 20 76 6f 69 64 20 2a 70 41 75 78 2c 0a 20  .  void *pAux,. 
a710: 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74   int argc, const
a720: 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61 72 67   char *const*arg
a730: 76 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  v,.  sqlite3_vta
a740: 62 20 2a 2a 70 70 56 74 61 62 2c 0a 20 20 63 68  b **ppVtab,.  ch
a750: 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20  ar **pzErr.){.  
a760: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 4e  sqlite3_vtab *pN
a770: 65 77 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 2f  ew;.  int rc;../
a780: 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 73  * Column numbers
a790: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 45 41 43   */.#define JEAC
a7a0: 48 5f 4b 45 59 20 20 20 20 20 30 0a 23 64 65 66  H_KEY     0.#def
a7b0: 69 6e 65 20 4a 45 41 43 48 5f 56 41 4c 55 45 20  ine JEACH_VALUE 
a7c0: 20 20 31 0a 23 64 65 66 69 6e 65 20 4a 45 41 43    1.#define JEAC
a7d0: 48 5f 54 59 50 45 20 20 20 20 32 0a 23 64 65 66  H_TYPE    2.#def
a7e0: 69 6e 65 20 4a 45 41 43 48 5f 41 54 4f 4d 20 20  ine JEACH_ATOM  
a7f0: 20 20 33 0a 23 64 65 66 69 6e 65 20 4a 45 41 43    3.#define JEAC
a800: 48 5f 49 44 20 20 20 20 20 20 34 0a 23 64 65 66  H_ID      4.#def
a810: 69 6e 65 20 4a 45 41 43 48 5f 50 41 52 45 4e 54  ine JEACH_PARENT
a820: 20 20 35 0a 23 64 65 66 69 6e 65 20 4a 45 41 43    5.#define JEAC
a830: 48 5f 46 55 4c 4c 4b 45 59 20 36 0a 23 64 65 66  H_FULLKEY 6.#def
a840: 69 6e 65 20 4a 45 41 43 48 5f 50 41 54 48 20 20  ine JEACH_PATH  
a850: 20 20 37 0a 23 64 65 66 69 6e 65 20 4a 45 41 43    7.#define JEAC
a860: 48 5f 4a 53 4f 4e 20 20 20 20 38 0a 23 64 65 66  H_JSON    8.#def
a870: 69 6e 65 20 4a 45 41 43 48 5f 52 4f 4f 54 20 20  ine JEACH_ROOT  
a880: 20 20 39 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41    9..  UNUSED_PA
a890: 52 41 4d 28 70 7a 45 72 72 29 3b 0a 20 20 55 4e  RAM(pzErr);.  UN
a8a0: 55 53 45 44 5f 50 41 52 41 4d 28 61 72 67 76 29  USED_PARAM(argv)
a8b0: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
a8c0: 28 61 72 67 63 29 3b 0a 20 20 55 4e 55 53 45 44  (argc);.  UNUSED
a8d0: 5f 50 41 52 41 4d 28 70 41 75 78 29 3b 0a 20 20  _PARAM(pAux);.  
a8e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 64 65 63  rc = sqlite3_dec
a8f0: 6c 61 72 65 5f 76 74 61 62 28 64 62 2c 20 0a 20  lare_vtab(db, . 
a900: 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c      "CREATE TABL
a910: 45 20 78 28 6b 65 79 2c 76 61 6c 75 65 2c 74 79  E x(key,value,ty
a920: 70 65 2c 61 74 6f 6d 2c 69 64 2c 70 61 72 65 6e  pe,atom,id,paren
a930: 74 2c 66 75 6c 6c 6b 65 79 2c 70 61 74 68 2c 22  t,fullkey,path,"
a940: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a950: 20 20 20 20 20 22 6a 73 6f 6e 20 48 49 44 44 45       "json HIDDE
a960: 4e 2c 72 6f 6f 74 20 48 49 44 44 45 4e 29 22 29  N,root HIDDEN)")
a970: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
a980: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 4e 65  TE_OK ){.    pNe
a990: 77 20 3d 20 2a 70 70 56 74 61 62 20 3d 20 73 71  w = *ppVtab = sq
a9a0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
a9b0: 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20  zeof(*pNew) );. 
a9c0: 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
a9d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
a9e0: 4f 4d 45 4d 3b 0a 20 20 20 20 6d 65 6d 73 65 74  OMEM;.    memset
a9f0: 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66  (pNew, 0, sizeof
aa00: 28 2a 70 4e 65 77 29 29 3b 0a 20 20 7d 0a 20 20  (*pNew));.  }.  
aa10: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
aa20: 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20   destructor for 
aa30: 6a 73 6f 6e 5f 65 61 63 68 20 76 69 72 74 75 61  json_each virtua
aa40: 6c 20 74 61 62 6c 65 20 2a 2f 0a 73 74 61 74 69  l table */.stati
aa50: 63 20 69 6e 74 20 6a 73 6f 6e 45 61 63 68 44 69  c int jsonEachDi
aa60: 73 63 6f 6e 6e 65 63 74 28 73 71 6c 69 74 65 33  sconnect(sqlite3
aa70: 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20  _vtab *pVtab){. 
aa80: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56   sqlite3_free(pV
aa90: 74 61 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tab);.  return S
aaa0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
aab0: 63 6f 6e 73 74 72 75 63 74 6f 72 20 66 6f 72 20  constructor for 
aac0: 61 20 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72  a JsonEachCursor
aad0: 20 6f 62 6a 65 63 74 20 66 6f 72 20 6a 73 6f 6e   object for json
aae0: 5f 65 61 63 68 28 29 2e 20 2a 2f 0a 73 74 61 74  _each(). */.stat
aaf0: 69 63 20 69 6e 74 20 6a 73 6f 6e 45 61 63 68 4f  ic int jsonEachO
ab00: 70 65 6e 45 61 63 68 28 73 71 6c 69 74 65 33 5f  penEach(sqlite3_
ab10: 76 74 61 62 20 2a 70 2c 20 73 71 6c 69 74 65 33  vtab *p, sqlite3
ab20: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 2a 70  _vtab_cursor **p
ab30: 70 43 75 72 73 6f 72 29 7b 0a 20 20 4a 73 6f 6e  pCursor){.  Json
ab40: 45 61 63 68 43 75 72 73 6f 72 20 2a 70 43 75 72  EachCursor *pCur
ab50: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
ab60: 4d 28 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 73  M(p);.  pCur = s
ab70: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73  qlite3_malloc( s
ab80: 69 7a 65 6f 66 28 2a 70 43 75 72 29 20 29 3b 0a  izeof(*pCur) );.
ab90: 20 20 69 66 28 20 70 43 75 72 3d 3d 30 20 29 20    if( pCur==0 ) 
aba0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
abb0: 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43  MEM;.  memset(pC
abc0: 75 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  ur, 0, sizeof(*p
abd0: 43 75 72 29 29 3b 0a 20 20 2a 70 70 43 75 72 73  Cur));.  *ppCurs
abe0: 6f 72 20 3d 20 26 70 43 75 72 2d 3e 62 61 73 65  or = &pCur->base
abf0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
ac00: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 63 6f 6e 73  E_OK;.}../* cons
ac10: 74 72 75 63 74 6f 72 20 66 6f 72 20 61 20 4a 73  tructor for a Js
ac20: 6f 6e 45 61 63 68 43 75 72 73 6f 72 20 6f 62 6a  onEachCursor obj
ac30: 65 63 74 20 66 6f 72 20 6a 73 6f 6e 5f 74 72 65  ect for json_tre
ac40: 65 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69  e(). */.static i
ac50: 6e 74 20 6a 73 6f 6e 45 61 63 68 4f 70 65 6e 54  nt jsonEachOpenT
ac60: 72 65 65 28 73 71 6c 69 74 65 33 5f 76 74 61 62  ree(sqlite3_vtab
ac70: 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 74 61   *p, sqlite3_vta
ac80: 62 5f 63 75 72 73 6f 72 20 2a 2a 70 70 43 75 72  b_cursor **ppCur
ac90: 73 6f 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  sor){.  int rc =
aca0: 20 6a 73 6f 6e 45 61 63 68 4f 70 65 6e 45 61 63   jsonEachOpenEac
acb0: 68 28 70 2c 20 70 70 43 75 72 73 6f 72 29 3b 0a  h(p, ppCursor);.
acc0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
acd0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 4a 73 6f 6e 45  _OK ){.    JsonE
ace0: 61 63 68 43 75 72 73 6f 72 20 2a 70 43 75 72 20  achCursor *pCur 
acf0: 3d 20 28 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f  = (JsonEachCurso
ad00: 72 2a 29 2a 70 70 43 75 72 73 6f 72 3b 0a 20 20  r*)*ppCursor;.  
ad10: 20 20 70 43 75 72 2d 3e 62 52 65 63 75 72 73 69    pCur->bRecursi
ad20: 76 65 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  ve = 1;.  }.  re
ad30: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 52  turn rc;.}../* R
ad40: 65 73 65 74 20 61 20 4a 73 6f 6e 45 61 63 68 43  eset a JsonEachC
ad50: 75 72 73 6f 72 20 62 61 63 6b 20 74 6f 20 69 74  ursor back to it
ad60: 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  s original state
ad70: 2e 20 20 46 72 65 65 20 61 6e 79 20 6d 65 6d 6f  .  Free any memo
ad80: 72 79 0a 2a 2a 20 68 65 6c 64 2e 20 2a 2f 0a 73  ry.** held. */.s
ad90: 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 45  tatic void jsonE
ada0: 61 63 68 43 75 72 73 6f 72 52 65 73 65 74 28 4a  achCursorReset(J
adb0: 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 20 2a 70  sonEachCursor *p
adc0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  ){.  sqlite3_fre
add0: 65 28 70 2d 3e 7a 4a 73 6f 6e 29 3b 0a 20 20 73  e(p->zJson);.  s
ade0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a  qlite3_free(p->z
adf0: 52 6f 6f 74 29 3b 0a 20 20 6a 73 6f 6e 50 61 72  Root);.  jsonPar
ae00: 73 65 52 65 73 65 74 28 26 70 2d 3e 73 50 61 72  seReset(&p->sPar
ae10: 73 65 29 3b 0a 20 20 70 2d 3e 69 52 6f 77 69 64  se);.  p->iRowid
ae20: 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 20 3d 20 30   = 0;.  p->i = 0
ae30: 3b 0a 20 20 70 2d 3e 69 45 6e 64 20 3d 20 30 3b  ;.  p->iEnd = 0;
ae40: 0a 20 20 70 2d 3e 65 54 79 70 65 20 3d 20 30 3b  .  p->eType = 0;
ae50: 0a 20 20 70 2d 3e 7a 4a 73 6f 6e 20 3d 20 30 3b  .  p->zJson = 0;
ae60: 0a 20 20 70 2d 3e 7a 52 6f 6f 74 20 3d 20 30 3b  .  p->zRoot = 0;
ae70: 0a 7d 0a 0a 2f 2a 20 44 65 73 74 72 75 63 74 6f  .}../* Destructo
ae80: 72 20 66 6f 72 20 61 20 6a 73 6f 6e 45 61 63 68  r for a jsonEach
ae90: 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f  Cursor object */
aea0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e  .static int json
aeb0: 45 61 63 68 43 6c 6f 73 65 28 73 71 6c 69 74 65  EachClose(sqlite
aec0: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63  3_vtab_cursor *c
aed0: 75 72 29 7b 0a 20 20 4a 73 6f 6e 45 61 63 68 43  ur){.  JsonEachC
aee0: 75 72 73 6f 72 20 2a 70 20 3d 20 28 4a 73 6f 6e  ursor *p = (Json
aef0: 45 61 63 68 43 75 72 73 6f 72 2a 29 63 75 72 3b  EachCursor*)cur;
af00: 0a 20 20 6a 73 6f 6e 45 61 63 68 43 75 72 73 6f  .  jsonEachCurso
af10: 72 52 65 73 65 74 28 70 29 3b 0a 20 20 73 71 6c  rReset(p);.  sql
af20: 69 74 65 33 5f 66 72 65 65 28 63 75 72 29 3b 0a  ite3_free(cur);.
af30: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
af40: 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e  OK;.}../* Return
af50: 20 54 52 55 45 20 69 66 20 74 68 65 20 6a 73 6f   TRUE if the jso
af60: 6e 45 61 63 68 43 75 72 73 6f 72 20 6f 62 6a 65  nEachCursor obje
af70: 63 74 20 68 61 73 20 62 65 65 6e 20 61 64 76 61  ct has been adva
af80: 6e 63 65 64 20 6f 66 66 20 74 68 65 20 65 6e 64  nced off the end
af90: 0a 2a 2a 20 6f 66 20 74 68 65 20 4a 53 4f 4e 20  .** of the JSON 
afa0: 6f 62 6a 65 63 74 20 2a 2f 0a 73 74 61 74 69 63  object */.static
afb0: 20 69 6e 74 20 6a 73 6f 6e 45 61 63 68 45 6f 66   int jsonEachEof
afc0: 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75  (sqlite3_vtab_cu
afd0: 72 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20 4a 73  rsor *cur){.  Js
afe0: 6f 6e 45 61 63 68 43 75 72 73 6f 72 20 2a 70 20  onEachCursor *p 
aff0: 3d 20 28 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f  = (JsonEachCurso
b000: 72 2a 29 63 75 72 3b 0a 20 20 72 65 74 75 72 6e  r*)cur;.  return
b010: 20 70 2d 3e 69 20 3e 3d 20 70 2d 3e 69 45 6e 64   p->i >= p->iEnd
b020: 3b 0a 7d 0a 0a 2f 2a 20 41 64 76 61 6e 63 65 20  ;.}../* Advance 
b030: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
b040: 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 66  e next element f
b050: 6f 72 20 6a 73 6f 6e 5f 74 72 65 65 28 29 20 2a  or json_tree() *
b060: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 73 6f  /.static int jso
b070: 6e 45 61 63 68 4e 65 78 74 28 73 71 6c 69 74 65  nEachNext(sqlite
b080: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63  3_vtab_cursor *c
b090: 75 72 29 7b 0a 20 20 4a 73 6f 6e 45 61 63 68 43  ur){.  JsonEachC
b0a0: 75 72 73 6f 72 20 2a 70 20 3d 20 28 4a 73 6f 6e  ursor *p = (Json
b0b0: 45 61 63 68 43 75 72 73 6f 72 2a 29 63 75 72 3b  EachCursor*)cur;
b0c0: 0a 20 20 69 66 28 20 70 2d 3e 62 52 65 63 75 72  .  if( p->bRecur
b0d0: 73 69 76 65 20 29 7b 0a 20 20 20 20 69 66 28 20  sive ){.    if( 
b0e0: 70 2d 3e 73 50 61 72 73 65 2e 61 4e 6f 64 65 5b  p->sParse.aNode[
b0f0: 70 2d 3e 69 5d 2e 6a 6e 46 6c 61 67 73 20 26 20  p->i].jnFlags & 
b100: 4a 4e 4f 44 45 5f 4c 41 42 45 4c 20 29 20 70 2d  JNODE_LABEL ) p-
b110: 3e 69 2b 2b 3b 0a 20 20 20 20 70 2d 3e 69 2b 2b  >i++;.    p->i++
b120: 3b 0a 20 20 20 20 70 2d 3e 69 52 6f 77 69 64 2b  ;.    p->iRowid+
b130: 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 3c  +;.    if( p->i<
b140: 70 2d 3e 69 45 6e 64 20 29 7b 0a 20 20 20 20 20  p->iEnd ){.     
b150: 20 75 33 32 20 69 55 70 20 3d 20 70 2d 3e 73 50   u32 iUp = p->sP
b160: 61 72 73 65 2e 61 55 70 5b 70 2d 3e 69 5d 3b 0a  arse.aUp[p->i];.
b170: 20 20 20 20 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a        JsonNode *
b180: 70 55 70 20 3d 20 26 70 2d 3e 73 50 61 72 73 65  pUp = &p->sParse
b190: 2e 61 4e 6f 64 65 5b 69 55 70 5d 3b 0a 20 20 20  .aNode[iUp];.   
b1a0: 20 20 20 70 2d 3e 65 54 79 70 65 20 3d 20 70 55     p->eType = pU
b1b0: 70 2d 3e 65 54 79 70 65 3b 0a 20 20 20 20 20 20  p->eType;.      
b1c0: 69 66 28 20 70 55 70 2d 3e 65 54 79 70 65 3d 3d  if( pUp->eType==
b1d0: 4a 53 4f 4e 5f 41 52 52 41 59 20 29 7b 0a 20 20  JSON_ARRAY ){.  
b1e0: 20 20 20 20 20 20 69 66 28 20 69 55 70 3d 3d 70        if( iUp==p
b1f0: 2d 3e 69 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  ->i-1 ){.       
b200: 20 20 20 70 55 70 2d 3e 75 2e 69 4b 65 79 20 3d     pUp->u.iKey =
b210: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
b220: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 55 70  e{.          pUp
b230: 2d 3e 75 2e 69 4b 65 79 2b 2b 3b 0a 20 20 20 20  ->u.iKey++;.    
b240: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
b250: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
b260: 20 73 77 69 74 63 68 28 20 70 2d 3e 65 54 79 70   switch( p->eTyp
b270: 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
b280: 4a 53 4f 4e 5f 41 52 52 41 59 3a 20 7b 0a 20 20  JSON_ARRAY: {.  
b290: 20 20 20 20 20 20 70 2d 3e 69 20 2b 3d 20 6a 73        p->i += js
b2a0: 6f 6e 4e 6f 64 65 53 69 7a 65 28 26 70 2d 3e 73  onNodeSize(&p->s
b2b0: 50 61 72 73 65 2e 61 4e 6f 64 65 5b 70 2d 3e 69  Parse.aNode[p->i
b2c0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69  ]);.        p->i
b2d0: 52 6f 77 69 64 2b 2b 3b 0a 20 20 20 20 20 20 20  Rowid++;.       
b2e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
b2f0: 20 20 20 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f        case JSON_
b300: 4f 42 4a 45 43 54 3a 20 7b 0a 20 20 20 20 20 20  OBJECT: {.      
b310: 20 20 70 2d 3e 69 20 2b 3d 20 31 20 2b 20 6a 73    p->i += 1 + js
b320: 6f 6e 4e 6f 64 65 53 69 7a 65 28 26 70 2d 3e 73  onNodeSize(&p->s
b330: 50 61 72 73 65 2e 61 4e 6f 64 65 5b 70 2d 3e 69  Parse.aNode[p->i
b340: 2b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  +1]);.        p-
b350: 3e 69 52 6f 77 69 64 2b 2b 3b 0a 20 20 20 20 20  >iRowid++;.     
b360: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b370: 7d 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  }.      default:
b380: 20 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 20   {.        p->i 
b390: 3d 20 70 2d 3e 69 45 6e 64 3b 0a 20 20 20 20 20  = p->iEnd;.     
b3a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b3b0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
b3c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
b3d0: 7d 0a 0a 2f 2a 20 41 70 70 65 6e 64 20 74 68 65  }../* Append the
b3e0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 70 61 74   name of the pat
b3f0: 68 20 66 6f 72 20 65 6c 65 6d 65 6e 74 20 69 20  h for element i 
b400: 74 6f 20 70 53 74 72 0a 2a 2f 0a 73 74 61 74 69  to pStr.*/.stati
b410: 63 20 76 6f 69 64 20 6a 73 6f 6e 45 61 63 68 43  c void jsonEachC
b420: 6f 6d 70 75 74 65 50 61 74 68 28 0a 20 20 4a 73  omputePath(.  Js
b430: 6f 6e 45 61 63 68 43 75 72 73 6f 72 20 2a 70 2c  onEachCursor *p,
b440: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
b450: 72 73 6f 72 20 2a 2f 0a 20 20 4a 73 6f 6e 53 74  rsor */.  JsonSt
b460: 72 69 6e 67 20 2a 70 53 74 72 2c 20 20 20 20 20  ring *pStr,     
b470: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
b480: 70 61 74 68 20 68 65 72 65 20 2a 2f 0a 20 20 75  path here */.  u
b490: 33 32 20 69 20 20 20 20 20 20 20 20 20 20 20 20  32 i            
b4a0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20          /* Path 
b4b0: 74 6f 20 74 68 69 73 20 65 6c 65 6d 65 6e 74 20  to this element 
b4c0: 2a 2f 0a 29 7b 0a 20 20 4a 73 6f 6e 4e 6f 64 65  */.){.  JsonNode
b4d0: 20 2a 70 4e 6f 64 65 2c 20 2a 70 55 70 3b 0a 20   *pNode, *pUp;. 
b4e0: 20 75 33 32 20 69 55 70 3b 0a 20 20 69 66 28 20   u32 iUp;.  if( 
b4f0: 69 3d 3d 30 20 29 7b 0a 20 20 20 20 6a 73 6f 6e  i==0 ){.    json
b500: 41 70 70 65 6e 64 43 68 61 72 28 70 53 74 72 2c  AppendChar(pStr,
b510: 20 27 24 27 29 3b 0a 20 20 20 20 72 65 74 75 72   '$');.    retur
b520: 6e 3b 0a 20 20 7d 0a 20 20 69 55 70 20 3d 20 70  n;.  }.  iUp = p
b530: 2d 3e 73 50 61 72 73 65 2e 61 55 70 5b 69 5d 3b  ->sParse.aUp[i];
b540: 0a 20 20 6a 73 6f 6e 45 61 63 68 43 6f 6d 70 75  .  jsonEachCompu
b550: 74 65 50 61 74 68 28 70 2c 20 70 53 74 72 2c 20  tePath(p, pStr, 
b560: 69 55 70 29 3b 0a 20 20 70 4e 6f 64 65 20 3d 20  iUp);.  pNode = 
b570: 26 70 2d 3e 73 50 61 72 73 65 2e 61 4e 6f 64 65  &p->sParse.aNode
b580: 5b 69 5d 3b 0a 20 20 70 55 70 20 3d 20 26 70 2d  [i];.  pUp = &p-
b590: 3e 73 50 61 72 73 65 2e 61 4e 6f 64 65 5b 69 55  >sParse.aNode[iU
b5a0: 70 5d 3b 0a 20 20 69 66 28 20 70 55 70 2d 3e 65  p];.  if( pUp->e
b5b0: 54 79 70 65 3d 3d 4a 53 4f 4e 5f 41 52 52 41 59  Type==JSON_ARRAY
b5c0: 20 29 7b 0a 20 20 20 20 6a 73 6f 6e 50 72 69 6e   ){.    jsonPrin
b5d0: 74 66 28 33 30 2c 20 70 53 74 72 2c 20 22 5b 25  tf(30, pStr, "[%
b5e0: 64 5d 22 2c 20 70 55 70 2d 3e 75 2e 69 4b 65 79  d]", pUp->u.iKey
b5f0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
b600: 61 73 73 65 72 74 28 20 70 55 70 2d 3e 65 54 79  assert( pUp->eTy
b610: 70 65 3d 3d 4a 53 4f 4e 5f 4f 42 4a 45 43 54 20  pe==JSON_OBJECT 
b620: 29 3b 0a 20 20 20 20 69 66 28 20 28 70 4e 6f 64  );.    if( (pNod
b630: 65 2d 3e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f  e->jnFlags & JNO
b640: 44 45 5f 4c 41 42 45 4c 29 3d 3d 30 20 29 20 70  DE_LABEL)==0 ) p
b650: 4e 6f 64 65 2d 2d 3b 0a 20 20 20 20 61 73 73 65  Node--;.    asse
b660: 72 74 28 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65  rt( pNode->eType
b670: 3d 3d 4a 53 4f 4e 5f 53 54 52 49 4e 47 20 29 3b  ==JSON_STRING );
b680: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 6f  .    assert( pNo
b690: 64 65 2d 3e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e  de->jnFlags & JN
b6a0: 4f 44 45 5f 4c 41 42 45 4c 20 29 3b 0a 20 20 20  ODE_LABEL );.   
b6b0: 20 6a 73 6f 6e 50 72 69 6e 74 66 28 70 4e 6f 64   jsonPrintf(pNod
b6c0: 65 2d 3e 6e 2b 31 2c 20 70 53 74 72 2c 20 22 2e  e->n+1, pStr, ".
b6d0: 25 2e 2a 73 22 2c 20 70 4e 6f 64 65 2d 3e 6e 2d  %.*s", pNode->n-
b6e0: 32 2c 20 70 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f  2, pNode->u.zJCo
b6f0: 6e 74 65 6e 74 2b 31 29 3b 0a 20 20 7d 0a 7d 0a  ntent+1);.  }.}.
b700: 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  ./* Return the v
b710: 61 6c 75 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e  alue of a column
b720: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a   */.static int j
b730: 73 6f 6e 45 61 63 68 43 6f 6c 75 6d 6e 28 0a 20  sonEachColumn(. 
b740: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
b750: 72 73 6f 72 20 2a 63 75 72 2c 20 20 20 2f 2a 20  rsor *cur,   /* 
b760: 54 68 65 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  The cursor */.  
b770: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
b780: 2a 63 74 78 2c 20 20 20 20 20 20 20 2f 2a 20 46  *ctx,       /* F
b790: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
b7a0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
b7b0: 2e 2e 2e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 69  ...() */.  int i
b7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7d0: 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20         /* Which 
b7e0: 63 6f 6c 75 6d 6e 20 74 6f 20 72 65 74 75 72 6e  column to return
b7f0: 20 2a 2f 0a 29 7b 0a 20 20 4a 73 6f 6e 45 61 63   */.){.  JsonEac
b800: 68 43 75 72 73 6f 72 20 2a 70 20 3d 20 28 4a 73  hCursor *p = (Js
b810: 6f 6e 45 61 63 68 43 75 72 73 6f 72 2a 29 63 75  onEachCursor*)cu
b820: 72 3b 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70  r;.  JsonNode *p
b830: 54 68 69 73 20 3d 20 26 70 2d 3e 73 50 61 72 73  This = &p->sPars
b840: 65 2e 61 4e 6f 64 65 5b 70 2d 3e 69 5d 3b 0a 20  e.aNode[p->i];. 
b850: 20 73 77 69 74 63 68 28 20 69 20 29 7b 0a 20 20   switch( i ){.  
b860: 20 20 63 61 73 65 20 4a 45 41 43 48 5f 4b 45 59    case JEACH_KEY
b870: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  : {.      if( p-
b880: 3e 69 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  >i==0 ) break;. 
b890: 20 20 20 20 20 69 66 28 20 70 2d 3e 65 54 79 70       if( p->eTyp
b8a0: 65 3d 3d 4a 53 4f 4e 5f 4f 42 4a 45 43 54 20 29  e==JSON_OBJECT )
b8b0: 7b 0a 20 20 20 20 20 20 20 20 6a 73 6f 6e 52 65  {.        jsonRe
b8c0: 74 75 72 6e 28 70 54 68 69 73 2c 20 63 74 78 2c  turn(pThis, ctx,
b8d0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   0);.      }else
b8e0: 20 69 66 28 20 70 2d 3e 65 54 79 70 65 3d 3d 4a   if( p->eType==J
b8f0: 53 4f 4e 5f 41 52 52 41 59 20 29 7b 0a 20 20 20  SON_ARRAY ){.   
b900: 20 20 20 20 20 75 33 32 20 69 4b 65 79 3b 0a 20       u32 iKey;. 
b910: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 62 52         if( p->bR
b920: 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
b930: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 52 6f        if( p->iRo
b940: 77 69 64 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  wid==0 ) break;.
b950: 20 20 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d            iKey =
b960: 20 70 2d 3e 73 50 61 72 73 65 2e 61 4e 6f 64 65   p->sParse.aNode
b970: 5b 70 2d 3e 73 50 61 72 73 65 2e 61 55 70 5b 70  [p->sParse.aUp[p
b980: 2d 3e 69 5d 5d 2e 75 2e 69 4b 65 79 3b 0a 20 20  ->i]].u.iKey;.  
b990: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
b9a0: 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 70 2d         iKey = p-
b9b0: 3e 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20  >iRowid;.       
b9c0: 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
b9d0: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28  e3_result_int64(
b9e0: 63 74 78 2c 20 28 73 71 6c 69 74 65 33 5f 69 6e  ctx, (sqlite3_in
b9f0: 74 36 34 29 69 4b 65 79 29 3b 0a 20 20 20 20 20  t64)iKey);.     
ba00: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
ba10: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a      }.    case J
ba20: 45 41 43 48 5f 56 41 4c 55 45 3a 20 7b 0a 20 20  EACH_VALUE: {.  
ba30: 20 20 20 20 69 66 28 20 70 54 68 69 73 2d 3e 6a      if( pThis->j
ba40: 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 4c  nFlags & JNODE_L
ba50: 41 42 45 4c 20 29 20 70 54 68 69 73 2b 2b 3b 0a  ABEL ) pThis++;.
ba60: 20 20 20 20 20 20 6a 73 6f 6e 52 65 74 75 72 6e        jsonReturn
ba70: 28 70 54 68 69 73 2c 20 63 74 78 2c 20 30 29 3b  (pThis, ctx, 0);
ba80: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ba90: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 45 41    }.    case JEA
baa0: 43 48 5f 54 59 50 45 3a 20 7b 0a 20 20 20 20 20  CH_TYPE: {.     
bab0: 20 69 66 28 20 70 54 68 69 73 2d 3e 6a 6e 46 6c   if( pThis->jnFl
bac0: 61 67 73 20 26 20 4a 4e 4f 44 45 5f 4c 41 42 45  ags & JNODE_LABE
bad0: 4c 20 29 20 70 54 68 69 73 2b 2b 3b 0a 20 20 20  L ) pThis++;.   
bae0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
baf0: 74 5f 74 65 78 74 28 63 74 78 2c 20 6a 73 6f 6e  t_text(ctx, json
bb00: 54 79 70 65 5b 70 54 68 69 73 2d 3e 65 54 79 70  Type[pThis->eTyp
bb10: 65 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53  e], -1, SQLITE_S
bb20: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 62 72  TATIC);.      br
bb30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
bb40: 61 73 65 20 4a 45 41 43 48 5f 41 54 4f 4d 3a 20  ase JEACH_ATOM: 
bb50: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 68 69  {.      if( pThi
bb60: 73 2d 3e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f  s->jnFlags & JNO
bb70: 44 45 5f 4c 41 42 45 4c 20 29 20 70 54 68 69 73  DE_LABEL ) pThis
bb80: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  ++;.      if( pT
bb90: 68 69 73 2d 3e 65 54 79 70 65 3e 3d 4a 53 4f 4e  his->eType>=JSON
bba0: 5f 41 52 52 41 59 20 29 20 62 72 65 61 6b 3b 0a  _ARRAY ) break;.
bbb0: 20 20 20 20 20 20 6a 73 6f 6e 52 65 74 75 72 6e        jsonReturn
bbc0: 28 70 54 68 69 73 2c 20 63 74 78 2c 20 30 29 3b  (pThis, ctx, 0);
bbd0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
bbe0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 45 41    }.    case JEA
bbf0: 43 48 5f 49 44 3a 20 7b 0a 20 20 20 20 20 20 73  CH_ID: {.      s
bc00: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
bc10: 74 36 34 28 63 74 78 2c 20 0a 20 20 20 20 20 20  t64(ctx, .      
bc20: 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36     (sqlite3_int6
bc30: 34 29 70 2d 3e 69 20 2b 20 28 28 70 54 68 69 73  4)p->i + ((pThis
bc40: 2d 3e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44  ->jnFlags & JNOD
bc50: 45 5f 4c 41 42 45 4c 29 21 3d 30 29 29 3b 0a 20  E_LABEL)!=0));. 
bc60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bc70: 7d 0a 20 20 20 20 63 61 73 65 20 4a 45 41 43 48  }.    case JEACH
bc80: 5f 50 41 52 45 4e 54 3a 20 7b 0a 20 20 20 20 20  _PARENT: {.     
bc90: 20 69 66 28 20 70 2d 3e 69 3e 70 2d 3e 69 42 65   if( p->i>p->iBe
bca0: 67 69 6e 20 26 26 20 70 2d 3e 62 52 65 63 75 72  gin && p->bRecur
bcb0: 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20  sive ){.        
bcc0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
bcd0: 6e 74 36 34 28 63 74 78 2c 20 28 73 71 6c 69 74  nt64(ctx, (sqlit
bce0: 65 33 5f 69 6e 74 36 34 29 70 2d 3e 73 50 61 72  e3_int64)p->sPar
bcf0: 73 65 2e 61 55 70 5b 70 2d 3e 69 5d 29 3b 0a 20  se.aUp[p->i]);. 
bd00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
bd10: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
bd20: 73 65 20 4a 45 41 43 48 5f 46 55 4c 4c 4b 45 59  se JEACH_FULLKEY
bd30: 3a 20 7b 0a 20 20 20 20 20 20 4a 73 6f 6e 53 74  : {.      JsonSt
bd40: 72 69 6e 67 20 78 3b 0a 20 20 20 20 20 20 6a 73  ring x;.      js
bd50: 6f 6e 49 6e 69 74 28 26 78 2c 20 63 74 78 29 3b  onInit(&x, ctx);
bd60: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 62 52  .      if( p->bR
bd70: 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
bd80: 20 20 20 20 6a 73 6f 6e 45 61 63 68 43 6f 6d 70      jsonEachComp
bd90: 75 74 65 50 61 74 68 28 70 2c 20 26 78 2c 20 70  utePath(p, &x, p
bda0: 2d 3e 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ->i);.      }els
bdb0: 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e{.        if( p
bdc0: 2d 3e 7a 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20  ->zRoot ){.     
bdd0: 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 52       jsonAppendR
bde0: 61 77 28 26 78 2c 20 70 2d 3e 7a 52 6f 6f 74 2c  aw(&x, p->zRoot,
bdf0: 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 70 2d 3e   (int)strlen(p->
be00: 7a 52 6f 6f 74 29 29 3b 0a 20 20 20 20 20 20 20  zRoot));.       
be10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
be20: 20 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61 72    jsonAppendChar
be30: 28 26 78 2c 20 27 24 27 29 3b 0a 20 20 20 20 20  (&x, '$');.     
be40: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
be50: 20 70 2d 3e 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f   p->eType==JSON_
be60: 41 52 52 41 59 20 29 7b 0a 20 20 20 20 20 20 20  ARRAY ){.       
be70: 20 20 20 6a 73 6f 6e 50 72 69 6e 74 66 28 33 30     jsonPrintf(30
be80: 2c 20 26 78 2c 20 22 5b 25 64 5d 22 2c 20 70 2d  , &x, "[%d]", p-
be90: 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  >iRowid);.      
bea0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
beb0: 20 20 20 6a 73 6f 6e 50 72 69 6e 74 66 28 70 54     jsonPrintf(pT
bec0: 68 69 73 2d 3e 6e 2c 20 26 78 2c 20 22 2e 25 2e  his->n, &x, ".%.
bed0: 2a 73 22 2c 20 70 54 68 69 73 2d 3e 6e 2d 32 2c  *s", pThis->n-2,
bee0: 20 70 54 68 69 73 2d 3e 75 2e 7a 4a 43 6f 6e 74   pThis->u.zJCont
bef0: 65 6e 74 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  ent+1);.        
bf00: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
bf10: 6a 73 6f 6e 52 65 73 75 6c 74 28 26 78 29 3b 0a  jsonResult(&x);.
bf20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bf30: 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 45 41 43   }.    case JEAC
bf40: 48 5f 50 41 54 48 3a 20 7b 0a 20 20 20 20 20 20  H_PATH: {.      
bf50: 69 66 28 20 70 2d 3e 62 52 65 63 75 72 73 69 76  if( p->bRecursiv
bf60: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 4a 73 6f  e ){.        Jso
bf70: 6e 53 74 72 69 6e 67 20 78 3b 0a 20 20 20 20 20  nString x;.     
bf80: 20 20 20 6a 73 6f 6e 49 6e 69 74 28 26 78 2c 20     jsonInit(&x, 
bf90: 63 74 78 29 3b 0a 20 20 20 20 20 20 20 20 6a 73  ctx);.        js
bfa0: 6f 6e 45 61 63 68 43 6f 6d 70 75 74 65 50 61 74  onEachComputePat
bfb0: 68 28 70 2c 20 26 78 2c 20 70 2d 3e 73 50 61 72  h(p, &x, p->sPar
bfc0: 73 65 2e 61 55 70 5b 70 2d 3e 69 5d 29 3b 0a 20  se.aUp[p->i]);. 
bfd0: 20 20 20 20 20 20 20 6a 73 6f 6e 52 65 73 75 6c         jsonResul
bfe0: 74 28 26 78 29 3b 0a 20 20 20 20 20 20 20 20 62  t(&x);.        b
bff0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
c000: 20 20 20 20 2f 2a 20 46 6f 72 20 6a 73 6f 6e 5f      /* For json_
c010: 65 61 63 68 28 29 20 70 61 74 68 20 61 6e 64 20  each() path and 
c020: 72 6f 6f 74 20 61 72 65 20 74 68 65 20 73 61 6d  root are the sam
c030: 65 20 73 6f 20 66 61 6c 6c 20 74 68 72 6f 75 67  e so fall throug
c040: 68 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20  h.      ** into 
c050: 74 68 65 20 72 6f 6f 74 20 63 61 73 65 20 2a 2f  the root case */
c060: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
c070: 4a 45 41 43 48 5f 52 4f 4f 54 3a 20 7b 0a 20 20  JEACH_ROOT: {.  
c080: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
c090: 7a 52 6f 6f 74 20 3d 20 70 2d 3e 7a 52 6f 6f 74  zRoot = p->zRoot
c0a0: 3b 0a 20 20 20 20 20 20 20 69 66 28 20 7a 52 6f  ;.       if( zRo
c0b0: 6f 74 3d 3d 30 20 29 20 7a 52 6f 6f 74 20 3d 20  ot==0 ) zRoot = 
c0c0: 22 24 22 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "$";.      sqlit
c0d0: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
c0e0: 74 78 2c 20 7a 52 6f 6f 74 2c 20 2d 31 2c 20 53  tx, zRoot, -1, S
c0f0: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
c100: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c110: 7d 0a 20 20 20 20 63 61 73 65 20 4a 45 41 43 48  }.    case JEACH
c120: 5f 4a 53 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 61  _JSON: {.      a
c130: 73 73 65 72 74 28 20 69 3d 3d 4a 45 41 43 48 5f  ssert( i==JEACH_
c140: 4a 53 4f 4e 20 29 3b 0a 20 20 20 20 20 20 73 71  JSON );.      sq
c150: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
c160: 74 28 63 74 78 2c 20 70 2d 3e 73 50 61 72 73 65  t(ctx, p->sParse
c170: 2e 7a 4a 73 6f 6e 2c 20 2d 31 2c 20 53 51 4c 49  .zJson, -1, SQLI
c180: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
c190: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
c1a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
c1b0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  TE_OK;.}../* Ret
c1c0: 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  urn the current 
c1d0: 72 6f 77 69 64 20 76 61 6c 75 65 20 2a 2f 0a 73  rowid value */.s
c1e0: 74 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e 45 61  tatic int jsonEa
c1f0: 63 68 52 6f 77 69 64 28 73 71 6c 69 74 65 33 5f  chRowid(sqlite3_
c200: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72  vtab_cursor *cur
c210: 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a  , sqlite_int64 *
c220: 70 52 6f 77 69 64 29 7b 0a 20 20 4a 73 6f 6e 45  pRowid){.  JsonE
c230: 61 63 68 43 75 72 73 6f 72 20 2a 70 20 3d 20 28  achCursor *p = (
c240: 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 2a 29  JsonEachCursor*)
c250: 63 75 72 3b 0a 20 20 2a 70 52 6f 77 69 64 20 3d  cur;.  *pRowid =
c260: 20 70 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 72 65   p->iRowid;.  re
c270: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
c280: 7d 0a 0a 2f 2a 20 54 68 65 20 71 75 65 72 79 20  }../* The query 
c290: 73 74 72 61 74 65 67 79 20 69 73 20 74 6f 20 6c  strategy is to l
c2a0: 6f 6f 6b 20 66 6f 72 20 61 6e 20 65 71 75 61 6c  ook for an equal
c2b0: 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  ity constraint o
c2c0: 6e 20 74 68 65 20 6a 73 6f 6e 0a 2a 2a 20 63 6f  n the json.** co
c2d0: 6c 75 6d 6e 2e 20 20 57 69 74 68 6f 75 74 20 73  lumn.  Without s
c2e0: 75 63 68 20 61 20 63 6f 6e 73 74 72 61 69 6e 74  uch a constraint
c2f0: 2c 20 74 68 65 20 74 61 62 6c 65 20 63 61 6e 6e  , the table cann
c300: 6f 74 20 6f 70 65 72 61 74 65 2e 20 20 69 64 78  ot operate.  idx
c310: 4e 75 6d 20 69 73 0a 2a 2a 20 31 20 69 66 20 74  Num is.** 1 if t
c320: 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  he constraint is
c330: 20 66 6f 75 6e 64 2c 20 33 20 69 66 20 74 68 65   found, 3 if the
c340: 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20   constraint and 
c350: 7a 52 6f 6f 74 20 61 72 65 20 66 6f 75 6e 64 2c  zRoot are found,
c360: 0a 2a 2a 20 61 6e 64 20 30 20 6f 74 68 65 72 77  .** and 0 otherw
c370: 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
c380: 6e 74 20 6a 73 6f 6e 45 61 63 68 42 65 73 74 49  nt jsonEachBestI
c390: 6e 64 65 78 28 0a 20 20 73 71 6c 69 74 65 33 5f  ndex(.  sqlite3_
c3a0: 76 74 61 62 20 2a 74 61 62 2c 0a 20 20 73 71 6c  vtab *tab,.  sql
c3b0: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
c3c0: 2a 70 49 64 78 49 6e 66 6f 0a 29 7b 0a 20 20 69  *pIdxInfo.){.  i
c3d0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6a 73 6f 6e  nt i;.  int json
c3e0: 49 64 78 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20  Idx = -1;.  int 
c3f0: 72 6f 6f 74 49 64 78 20 3d 20 2d 31 3b 0a 20 20  rootIdx = -1;.  
c400: 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 71 6c  const struct sql
c410: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
c420: 72 61 69 6e 74 20 2a 70 43 6f 6e 73 74 72 61 69  raint *pConstrai
c430: 6e 74 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41  nt;..  UNUSED_PA
c440: 52 41 4d 28 74 61 62 29 3b 0a 20 20 70 43 6f 6e  RAM(tab);.  pCon
c450: 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78 49 6e  straint = pIdxIn
c460: 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->aConstraint;
c470: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49  .  for(i=0; i<pI
c480: 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
c490: 69 6e 74 3b 20 69 2b 2b 2c 20 70 43 6f 6e 73 74  int; i++, pConst
c4a0: 72 61 69 6e 74 2b 2b 29 7b 0a 20 20 20 20 69 66  raint++){.    if
c4b0: 28 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 75  ( pConstraint->u
c4c0: 73 61 62 6c 65 3d 3d 30 20 29 20 63 6f 6e 74 69  sable==0 ) conti
c4d0: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 43 6f  nue;.    if( pCo
c4e0: 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 21 3d 53 51  nstraint->op!=SQ
c4f0: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
c500: 52 41 49 4e 54 5f 45 51 20 29 20 63 6f 6e 74 69  RAINT_EQ ) conti
c510: 6e 75 65 3b 0a 20 20 20 20 73 77 69 74 63 68 28  nue;.    switch(
c520: 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 69 43   pConstraint->iC
c530: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 63  olumn ){.      c
c540: 61 73 65 20 4a 45 41 43 48 5f 4a 53 4f 4e 3a 20  ase JEACH_JSON: 
c550: 20 20 6a 73 6f 6e 49 64 78 20 3d 20 69 3b 20 20    jsonIdx = i;  
c560: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
c570: 61 73 65 20 4a 45 41 43 48 5f 52 4f 4f 54 3a 20  ase JEACH_ROOT: 
c580: 20 20 72 6f 6f 74 49 64 78 20 3d 20 69 3b 20 20    rootIdx = i;  
c590: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 64    break;.      d
c5a0: 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20  efault:         
c5b0: 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 20 20 20    /* no-op */   
c5c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
c5d0: 20 7d 0a 20 20 69 66 28 20 6a 73 6f 6e 49 64 78   }.  if( jsonIdx
c5e0: 3c 30 20 29 7b 0a 20 20 20 20 70 49 64 78 49 6e  <0 ){.    pIdxIn
c5f0: 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a  fo->idxNum = 0;.
c600: 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73      pIdxInfo->es
c610: 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 31 65  timatedCost = 1e
c620: 39 39 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  99;.  }else{.   
c630: 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
c640: 61 74 65 64 43 6f 73 74 20 3d 20 31 2e 30 3b 0a  atedCost = 1.0;.
c650: 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43      pIdxInfo->aC
c660: 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 6a  onstraintUsage[j
c670: 73 6f 6e 49 64 78 5d 2e 61 72 67 76 49 6e 64 65  sonIdx].argvInde
c680: 78 20 3d 20 31 3b 0a 20 20 20 20 70 49 64 78 49  x = 1;.    pIdxI
c690: 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
c6a0: 55 73 61 67 65 5b 6a 73 6f 6e 49 64 78 5d 2e 6f  Usage[jsonIdx].o
c6b0: 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  mit = 1;.    if(
c6c0: 20 72 6f 6f 74 49 64 78 3c 30 20 29 7b 0a 20 20   rootIdx<0 ){.  
c6d0: 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64      pIdxInfo->id
c6e0: 78 4e 75 6d 20 3d 20 31 3b 0a 20 20 20 20 7d 65  xNum = 1;.    }e
c6f0: 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 64 78 49  lse{.      pIdxI
c700: 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
c710: 55 73 61 67 65 5b 72 6f 6f 74 49 64 78 5d 2e 61  Usage[rootIdx].a
c720: 72 67 76 49 6e 64 65 78 20 3d 20 32 3b 0a 20 20  rgvIndex = 2;.  
c730: 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43      pIdxInfo->aC
c740: 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 72  onstraintUsage[r
c750: 6f 6f 74 49 64 78 5d 2e 6f 6d 69 74 20 3d 20 31  ootIdx].omit = 1
c760: 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f  ;.      pIdxInfo
c770: 2d 3e 69 64 78 4e 75 6d 20 3d 20 33 3b 0a 20 20  ->idxNum = 3;.  
c780: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
c790: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
c7a0: 2a 20 53 74 61 72 74 20 61 20 73 65 61 72 63 68  * Start a search
c7b0: 20 6f 6e 20 61 20 6e 65 77 20 4a 53 4f 4e 20 73   on a new JSON s
c7c0: 74 72 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20  tring */.static 
c7d0: 69 6e 74 20 6a 73 6f 6e 45 61 63 68 46 69 6c 74  int jsonEachFilt
c7e0: 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  er(.  sqlite3_vt
c7f0: 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 2c 0a  ab_cursor *cur,.
c800: 20 20 69 6e 74 20 69 64 78 4e 75 6d 2c 20 63 6f    int idxNum, co
c810: 6e 73 74 20 63 68 61 72 20 2a 69 64 78 53 74 72  nst char *idxStr
c820: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 73 71  ,.  int argc, sq
c830: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
c840: 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e 45 61 63 68  gv.){.  JsonEach
c850: 43 75 72 73 6f 72 20 2a 70 20 3d 20 28 4a 73 6f  Cursor *p = (Jso
c860: 6e 45 61 63 68 43 75 72 73 6f 72 2a 29 63 75 72  nEachCursor*)cur
c870: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
c880: 7a 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  z;.  const char 
c890: 2a 7a 52 6f 6f 74 20 3d 20 30 3b 0a 20 20 73 71  *zRoot = 0;.  sq
c8a0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 3b 0a 0a  lite3_int64 n;..
c8b0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 69    UNUSED_PARAM(i
c8c0: 64 78 53 74 72 29 3b 0a 20 20 55 4e 55 53 45 44  dxStr);.  UNUSED
c8d0: 5f 50 41 52 41 4d 28 61 72 67 63 29 3b 0a 20 20  _PARAM(argc);.  
c8e0: 6a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 52 65  jsonEachCursorRe
c8f0: 73 65 74 28 70 29 3b 0a 20 20 69 66 28 20 69 64  set(p);.  if( id
c900: 78 4e 75 6d 3d 3d 30 20 29 20 72 65 74 75 72 6e  xNum==0 ) return
c910: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7a 20   SQLITE_OK;.  z 
c920: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
c930: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
c940: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66  t(argv[0]);.  if
c950: 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( z==0 ) return 
c960: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6e 20 3d  SQLITE_OK;.  n =
c970: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
c980: 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20  ytes(argv[0]);. 
c990: 20 70 2d 3e 7a 4a 73 6f 6e 20 3d 20 73 71 6c 69   p->zJson = sqli
c9a0: 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 6e 2b  te3_malloc64( n+
c9b0: 31 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 4a  1 );.  if( p->zJ
c9c0: 73 6f 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  son==0 ) return 
c9d0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
c9e0: 6d 65 6d 63 70 79 28 70 2d 3e 7a 4a 73 6f 6e 2c  memcpy(p->zJson,
c9f0: 20 7a 2c 20 28 73 69 7a 65 5f 74 29 6e 2b 31 29   z, (size_t)n+1)
ca00: 3b 0a 20 20 69 66 28 20 6a 73 6f 6e 50 61 72 73  ;.  if( jsonPars
ca10: 65 28 26 70 2d 3e 73 50 61 72 73 65 2c 20 30 2c  e(&p->sParse, 0,
ca20: 20 70 2d 3e 7a 4a 73 6f 6e 29 20 29 7b 0a 20 20   p->zJson) ){.  
ca30: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
ca40: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 69 66 28  E_NOMEM;.    if(
ca50: 20 70 2d 3e 73 50 61 72 73 65 2e 6f 6f 6d 3d 3d   p->sParse.oom==
ca60: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
ca70: 65 33 5f 66 72 65 65 28 63 75 72 2d 3e 70 56 74  e3_free(cur->pVt
ca80: 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ab->zErrMsg);.  
ca90: 20 20 20 20 63 75 72 2d 3e 70 56 74 61 62 2d 3e      cur->pVtab->
caa0: 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
cab0: 33 5f 6d 70 72 69 6e 74 66 28 22 6d 61 6c 66 6f  3_mprintf("malfo
cac0: 72 6d 65 64 20 4a 53 4f 4e 22 29 3b 0a 20 20 20  rmed JSON");.   
cad0: 20 20 20 69 66 28 20 63 75 72 2d 3e 70 56 74 61     if( cur->pVta
cae0: 62 2d 3e 7a 45 72 72 4d 73 67 20 29 20 72 63 20  b->zErrMsg ) rc 
caf0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
cb00: 20 20 20 20 7d 0a 20 20 20 20 6a 73 6f 6e 45 61      }.    jsonEa
cb10: 63 68 43 75 72 73 6f 72 52 65 73 65 74 28 70 29  chCursorReset(p)
cb20: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
cb30: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
cb40: 62 52 65 63 75 72 73 69 76 65 20 26 26 20 6a 73  bRecursive && js
cb50: 6f 6e 50 61 72 73 65 46 69 6e 64 50 61 72 65 6e  onParseFindParen
cb60: 74 73 28 26 70 2d 3e 73 50 61 72 73 65 29 20 29  ts(&p->sParse) )
cb70: 7b 0a 20 20 20 20 6a 73 6f 6e 45 61 63 68 43 75  {.    jsonEachCu
cb80: 72 73 6f 72 52 65 73 65 74 28 70 29 3b 0a 20 20  rsorReset(p);.  
cb90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
cba0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NOMEM;.  }else{.
cbb0: 20 20 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e      JsonNode *pN
cbc0: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ode = 0;.    if(
cbd0: 20 69 64 78 4e 75 6d 3d 3d 33 20 29 7b 0a 20 20   idxNum==3 ){.  
cbe0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
cbf0: 7a 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  zErr = 0;.      
cc00: 7a 52 6f 6f 74 20 3d 20 28 63 6f 6e 73 74 20 63  zRoot = (const c
cc10: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
cc20: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29  ue_text(argv[1])
cc30: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52 6f 6f  ;.      if( zRoo
cc40: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  t==0 ) return SQ
cc50: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 6e  LITE_OK;.      n
cc60: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
cc70: 5f 62 79 74 65 73 28 61 72 67 76 5b 31 5d 29 3b  _bytes(argv[1]);
cc80: 0a 20 20 20 20 20 20 70 2d 3e 7a 52 6f 6f 74 20  .      p->zRoot 
cc90: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
cca0: 36 34 28 20 6e 2b 31 20 29 3b 0a 20 20 20 20 20  64( n+1 );.     
ccb0: 20 69 66 28 20 70 2d 3e 7a 52 6f 6f 74 3d 3d 30   if( p->zRoot==0
ccc0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
ccd0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 6d 65  _NOMEM;.      me
cce0: 6d 63 70 79 28 70 2d 3e 7a 52 6f 6f 74 2c 20 7a  mcpy(p->zRoot, z
ccf0: 52 6f 6f 74 2c 20 28 73 69 7a 65 5f 74 29 6e 2b  Root, (size_t)n+
cd00: 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52  1);.      if( zR
cd10: 6f 6f 74 5b 30 5d 21 3d 27 24 27 20 29 7b 0a 20  oot[0]!='$' ){. 
cd20: 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20 7a 52         zErr = zR
cd30: 6f 6f 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  oot;.      }else
cd40: 7b 0a 20 20 20 20 20 20 20 20 70 4e 6f 64 65 20  {.        pNode 
cd50: 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 53 74 65 70  = jsonLookupStep
cd60: 28 26 70 2d 3e 73 50 61 72 73 65 2c 20 30 2c 20  (&p->sParse, 0, 
cd70: 70 2d 3e 7a 52 6f 6f 74 2b 31 2c 20 30 2c 20 26  p->zRoot+1, 0, &
cd80: 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  zErr);.      }. 
cd90: 20 20 20 20 20 69 66 28 20 7a 45 72 72 20 29 7b       if( zErr ){
cda0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
cdb0: 5f 66 72 65 65 28 63 75 72 2d 3e 70 56 74 61 62  _free(cur->pVtab
cdc0: 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
cdd0: 20 20 20 20 63 75 72 2d 3e 70 56 74 61 62 2d 3e      cur->pVtab->
cde0: 7a 45 72 72 4d 73 67 20 3d 20 6a 73 6f 6e 50 61  zErrMsg = jsonPa
cdf0: 74 68 53 79 6e 74 61 78 45 72 72 6f 72 28 7a 45  thSyntaxError(zE
ce00: 72 72 29 3b 0a 20 20 20 20 20 20 20 20 6a 73 6f  rr);.        jso
ce10: 6e 45 61 63 68 43 75 72 73 6f 72 52 65 73 65 74  nEachCursorReset
ce20: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  (p);.        ret
ce30: 75 72 6e 20 63 75 72 2d 3e 70 56 74 61 62 2d 3e  urn cur->pVtab->
ce40: 7a 45 72 72 4d 73 67 20 3f 20 53 51 4c 49 54 45  zErrMsg ? SQLITE
ce50: 5f 45 52 52 4f 52 20 3a 20 53 51 4c 49 54 45 5f  _ERROR : SQLITE_
ce60: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c  NOMEM;.      }el
ce70: 73 65 20 69 66 28 20 70 4e 6f 64 65 3d 3d 30 20  se if( pNode==0 
ce80: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
ce90: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
cea0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
ceb0: 20 20 20 20 20 20 70 4e 6f 64 65 20 3d 20 70 2d        pNode = p-
cec0: 3e 73 50 61 72 73 65 2e 61 4e 6f 64 65 3b 0a 20  >sParse.aNode;. 
ced0: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 42 65 67     }.    p->iBeg
cee0: 69 6e 20 3d 20 70 2d 3e 69 20 3d 20 28 69 6e 74  in = p->i = (int
cef0: 29 28 70 4e 6f 64 65 20 2d 20 70 2d 3e 73 50 61  )(pNode - p->sPa
cf00: 72 73 65 2e 61 4e 6f 64 65 29 3b 0a 20 20 20 20  rse.aNode);.    
cf10: 70 2d 3e 65 54 79 70 65 20 3d 20 70 4e 6f 64 65  p->eType = pNode
cf20: 2d 3e 65 54 79 70 65 3b 0a 20 20 20 20 69 66 28  ->eType;.    if(
cf30: 20 70 2d 3e 65 54 79 70 65 3e 3d 4a 53 4f 4e 5f   p->eType>=JSON_
cf40: 41 52 52 41 59 20 29 7b 0a 20 20 20 20 20 20 70  ARRAY ){.      p
cf50: 4e 6f 64 65 2d 3e 75 2e 69 4b 65 79 20 3d 20 30  Node->u.iKey = 0
cf60: 3b 0a 20 20 20 20 20 20 70 2d 3e 69 45 6e 64 20  ;.      p->iEnd 
cf70: 3d 20 70 2d 3e 69 20 2b 20 70 4e 6f 64 65 2d 3e  = p->i + pNode->
cf80: 6e 20 2b 20 31 3b 0a 20 20 20 20 20 20 69 66 28  n + 1;.      if(
cf90: 20 70 2d 3e 62 52 65 63 75 72 73 69 76 65 20 29   p->bRecursive )
cfa0: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 54 79  {.        p->eTy
cfb0: 70 65 20 3d 20 70 2d 3e 73 50 61 72 73 65 2e 61  pe = p->sParse.a
cfc0: 4e 6f 64 65 5b 70 2d 3e 73 50 61 72 73 65 2e 61  Node[p->sParse.a
cfd0: 55 70 5b 70 2d 3e 69 5d 5d 2e 65 54 79 70 65 3b  Up[p->i]].eType;
cfe0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
cff0: 69 3e 30 20 26 26 20 28 70 2d 3e 73 50 61 72 73  i>0 && (p->sPars
d000: 65 2e 61 4e 6f 64 65 5b 70 2d 3e 69 2d 31 5d 2e  e.aNode[p->i-1].
d010: 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f  jnFlags & JNODE_
d020: 4c 41 42 45 4c 29 21 3d 30 20 29 7b 0a 20 20 20  LABEL)!=0 ){.   
d030: 20 20 20 20 20 20 20 70 2d 3e 69 2d 2d 3b 0a 20         p->i--;. 
d040: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
d050: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 2d  else{.        p-
d060: 3e 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  >i++;.      }.  
d070: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
d080: 2d 3e 69 45 6e 64 20 3d 20 70 2d 3e 69 2b 31 3b  ->iEnd = p->i+1;
d090: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
d0a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
d0b0: 0a 0a 2f 2a 20 54 68 65 20 6d 65 74 68 6f 64 73  ../* The methods
d0c0: 20 6f 66 20 74 68 65 20 6a 73 6f 6e 5f 65 61 63   of the json_eac
d0d0: 68 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  h virtual table 
d0e0: 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
d0f0: 33 5f 6d 6f 64 75 6c 65 20 6a 73 6f 6e 45 61 63  3_module jsonEac
d100: 68 4d 6f 64 75 6c 65 20 3d 20 7b 0a 20 20 30 2c  hModule = {.  0,
d110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d120: 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
d130: 73 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20  sion */.  0,    
d140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d150: 20 20 20 20 20 2f 2a 20 78 43 72 65 61 74 65 20       /* xCreate 
d160: 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 43 6f 6e  */.  jsonEachCon
d170: 6e 65 63 74 2c 20 20 20 20 20 20 20 20 20 20 20  nect,           
d180: 2f 2a 20 78 43 6f 6e 6e 65 63 74 20 2a 2f 0a 20  /* xConnect */. 
d190: 20 6a 73 6f 6e 45 61 63 68 42 65 73 74 49 6e 64   jsonEachBestInd
d1a0: 65 78 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ex,         /* x
d1b0: 42 65 73 74 49 6e 64 65 78 20 2a 2f 0a 20 20 6a  BestIndex */.  j
d1c0: 73 6f 6e 45 61 63 68 44 69 73 63 6f 6e 6e 65 63  sonEachDisconnec
d1d0: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 44 69  t,        /* xDi
d1e0: 73 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 30 2c  sconnect */.  0,
d1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d200: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 73           /* xDes
d210: 74 72 6f 79 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61  troy */.  jsonEa
d220: 63 68 4f 70 65 6e 45 61 63 68 2c 20 20 20 20 20  chOpenEach,     
d230: 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2d 20       /* xOpen - 
d240: 6f 70 65 6e 20 61 20 63 75 72 73 6f 72 20 2a 2f  open a cursor */
d250: 0a 20 20 6a 73 6f 6e 45 61 63 68 43 6c 6f 73 65  .  jsonEachClose
d260: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
d270: 20 78 43 6c 6f 73 65 20 2d 20 63 6c 6f 73 65 20   xClose - close 
d280: 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 6a 73  a cursor */.  js
d290: 6f 6e 45 61 63 68 46 69 6c 74 65 72 2c 20 20 20  onEachFilter,   
d2a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
d2b0: 74 65 72 20 2d 20 63 6f 6e 66 69 67 75 72 65 20  ter - configure 
d2c0: 73 63 61 6e 20 63 6f 6e 73 74 72 61 69 6e 74 73  scan constraints
d2d0: 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 4e 65   */.  jsonEachNe
d2e0: 78 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  xt,             
d2f0: 20 2f 2a 20 78 4e 65 78 74 20 2d 20 61 64 76 61   /* xNext - adva
d300: 6e 63 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a  nce a cursor */.
d310: 20 20 6a 73 6f 6e 45 61 63 68 45 6f 66 2c 20 20    jsonEachEof,  
d320: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d330: 78 45 6f 66 20 2d 20 63 68 65 63 6b 20 66 6f 72  xEof - check for
d340: 20 65 6e 64 20 6f 66 20 73 63 61 6e 20 2a 2f 0a   end of scan */.
d350: 20 20 6a 73 6f 6e 45 61 63 68 43 6f 6c 75 6d 6e    jsonEachColumn
d360: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
d370: 78 43 6f 6c 75 6d 6e 20 2d 20 72 65 61 64 20 64  xColumn - read d
d380: 61 74 61 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63  ata */.  jsonEac
d390: 68 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20  hRowid,         
d3a0: 20 20 20 20 2f 2a 20 78 52 6f 77 69 64 20 2d 20      /* xRowid - 
d3b0: 72 65 61 64 20 64 61 74 61 20 2a 2f 0a 20 20 30  read data */.  0
d3c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
d3d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 70            /* xUp
d3e0: 64 61 74 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20  date */.  0,    
d3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d400: 20 20 20 20 20 2f 2a 20 78 42 65 67 69 6e 20 2a       /* xBegin *
d410: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
d420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d430: 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20 30 2c 20  * xSync */.  0, 
d440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d450: 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6d 6d          /* xComm
d460: 69 74 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  it */.  0,      
d470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d480: 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 20     /* xRollback 
d490: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
d4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4b0: 2f 2a 20 78 46 69 6e 64 4d 65 74 68 6f 64 20 2a  /* xFindMethod *
d4c0: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
d4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d4e0: 2a 20 78 52 65 6e 61 6d 65 20 2a 2f 0a 20 20 30  * xRename */.  0
d4f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
d500: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 61            /* xSa
d510: 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 30 2c 20  vepoint */.  0, 
d520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d530: 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 6c 65          /* xRele
d540: 61 73 65 20 2a 2f 0a 20 20 30 20 20 20 20 20 20  ase */.  0      
d550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d560: 20 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b      /* xRollback
d570: 54 6f 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65  To */.};../* The
d580: 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20   methods of the 
d590: 6a 73 6f 6e 5f 74 72 65 65 20 76 69 72 74 75 61  json_tree virtua
d5a0: 6c 20 74 61 62 6c 65 2e 20 2a 2f 0a 73 74 61 74  l table. */.stat
d5b0: 69 63 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c  ic sqlite3_modul
d5c0: 65 20 6a 73 6f 6e 54 72 65 65 4d 6f 64 75 6c 65  e jsonTreeModule
d5d0: 20 3d 20 7b 0a 20 20 30 2c 20 20 20 20 20 20 20   = {.  0,       
d5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5f0: 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
d600: 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
d610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d620: 20 78 43 72 65 61 74 65 20 2a 2f 0a 20 20 6a 73   xCreate */.  js
d630: 6f 6e 45 61 63 68 43 6f 6e 6e 65 63 74 2c 20 20  onEachConnect,  
d640: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6e           /* xCon
d650: 6e 65 63 74 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61  nect */.  jsonEa
d660: 63 68 42 65 73 74 49 6e 64 65 78 2c 20 20 20 20  chBestIndex,    
d670: 20 20 20 20 20 2f 2a 20 78 42 65 73 74 49 6e 64       /* xBestInd
d680: 65 78 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68  ex */.  jsonEach
d690: 44 69 73 63 6f 6e 6e 65 63 74 2c 20 20 20 20 20  Disconnect,     
d6a0: 20 20 20 2f 2a 20 78 44 69 73 63 6f 6e 6e 65 63     /* xDisconnec
d6b0: 74 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  t */.  0,       
d6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6d0: 20 20 2f 2a 20 78 44 65 73 74 72 6f 79 20 2a 2f    /* xDestroy */
d6e0: 0a 20 20 6a 73 6f 6e 45 61 63 68 4f 70 65 6e 54  .  jsonEachOpenT
d6f0: 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ree,          /*
d700: 20 78 4f 70 65 6e 20 2d 20 6f 70 65 6e 20 61 20   xOpen - open a 
d710: 63 75 72 73 6f 72 20 2a 2f 0a 20 20 6a 73 6f 6e  cursor */.  json
d720: 45 61 63 68 43 6c 6f 73 65 2c 20 20 20 20 20 20  EachClose,      
d730: 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
d740: 20 2d 20 63 6c 6f 73 65 20 61 20 63 75 72 73 6f   - close a curso
d750: 72 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 46  r */.  jsonEachF
d760: 69 6c 74 65 72 2c 20 20 20 20 20 20 20 20 20 20  ilter,          
d770: 20 20 2f 2a 20 78 46 69 6c 74 65 72 20 2d 20 63    /* xFilter - c
d780: 6f 6e 66 69 67 75 72 65 20 73 63 61 6e 20 63 6f  onfigure scan co
d790: 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 6a  nstraints */.  j
d7a0: 73 6f 6e 45 61 63 68 4e 65 78 74 2c 20 20 20 20  sonEachNext,    
d7b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4e 65            /* xNe
d7c0: 78 74 20 2d 20 61 64 76 61 6e 63 65 20 61 20 63  xt - advance a c
d7d0: 75 72 73 6f 72 20 2a 2f 0a 20 20 6a 73 6f 6e 45  ursor */.  jsonE
d7e0: 61 63 68 45 6f 66 2c 20 20 20 20 20 20 20 20 20  achEof,         
d7f0: 20 20 20 20 20 20 2f 2a 20 78 45 6f 66 20 2d 20        /* xEof - 
d800: 63 68 65 63 6b 20 66 6f 72 20 65 6e 64 20 6f 66  check for end of
d810: 20 73 63 61 6e 20 2a 2f 0a 20 20 6a 73 6f 6e 45   scan */.  jsonE
d820: 61 63 68 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20  achColumn,      
d830: 20 20 20 20 20 20 2f 2a 20 78 43 6f 6c 75 6d 6e        /* xColumn
d840: 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f 0a   - read data */.
d850: 20 20 6a 73 6f 6e 45 61 63 68 52 6f 77 69 64 2c    jsonEachRowid,
d860: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d870: 78 52 6f 77 69 64 20 2d 20 72 65 61 64 20 64 61  xRowid - read da
d880: 74 61 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  ta */.  0,      
d890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8a0: 20 20 20 2f 2a 20 78 55 70 64 61 74 65 20 2a 2f     /* xUpdate */
d8b0: 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
d8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d8d0: 20 78 42 65 67 69 6e 20 2a 2f 0a 20 20 30 2c 20   xBegin */.  0, 
d8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8f0: 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63          /* xSync
d900: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
d910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d920: 20 2f 2a 20 78 43 6f 6d 6d 69 74 20 2a 2f 0a 20   /* xCommit */. 
d930: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
d940: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
d950: 52 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 30 2c  Rollback */.  0,
d960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d970: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6e           /* xFin
d980: 64 4d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 2c 20  dMethod */.  0, 
d990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9a0: 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 6e 61          /* xRena
d9b0: 6d 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  me */.  0,      
d9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9d0: 20 20 20 2f 2a 20 78 53 61 76 65 70 6f 69 6e 74     /* xSavepoint
d9e0: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
d9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da00: 20 2f 2a 20 78 52 65 6c 65 61 73 65 20 2a 2f 0a   /* xRelease */.
da10: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
da20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
da30: 78 52 6f 6c 6c 62 61 63 6b 54 6f 20 2a 2f 0a 7d  xRollbackTo */.}
da40: 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
da50: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
da60: 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ABLE */../******
da70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
da80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
da90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
daa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dab0: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  ******.** The fo
dac0: 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20  llowing routine 
dad0: 69 73 20 74 68 65 20 6f 6e 6c 79 20 70 75 62 6c  is the only publ
dae0: 69 63 61 6c 6c 79 20 76 69 73 69 62 6c 65 20 69  ically visible i
daf0: 64 65 6e 74 69 66 69 65 72 20 69 6e 20 74 68 69  dentifier in thi
db00: 73 0a 2a 2a 20 66 69 6c 65 2e 20 20 43 61 6c 6c  s.** file.  Call
db10: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   the following r
db20: 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20  outine in order 
db30: 74 6f 20 72 65 67 69 73 74 65 72 20 74 68 65 20  to register the 
db40: 76 61 72 69 6f 75 73 20 53 51 4c 0a 2a 2a 20 66  various SQL.** f
db50: 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  unctions and the
db60: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69   virtual table i
db70: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 74 68  mplemented by th
db80: 69 73 20 66 69 6c 65 2e 0a 2a 2a 2a 2a 2a 2a 2a  is file..*******
db90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dba0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dbb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dbc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dbd0: 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66 64 65 66 20 5f  *****/..#ifdef _
dbe0: 57 49 4e 33 32 0a 5f 5f 64 65 63 6c 73 70 65 63  WIN32.__declspec
dbf0: 28 64 6c 6c 65 78 70 6f 72 74 29 0a 23 65 6e 64  (dllexport).#end
dc00: 69 66 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6a  if.int sqlite3_j
dc10: 73 6f 6e 5f 69 6e 69 74 28 0a 20 20 73 71 6c 69  son_init(.  sqli
dc20: 74 65 33 20 2a 64 62 2c 20 0a 20 20 63 68 61 72  te3 *db, .  char
dc30: 20 2a 2a 70 7a 45 72 72 4d 73 67 2c 20 0a 20 20   **pzErrMsg, .  
dc40: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70  const sqlite3_ap
dc50: 69 5f 72 6f 75 74 69 6e 65 73 20 2a 70 41 70 69  i_routines *pApi
dc60: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
dc70: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 73 69  QLITE_OK;.  unsi
dc80: 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 73 74  gned int i;.  st
dc90: 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
dca0: 74 20 7b 0a 20 20 20 20 20 63 6f 6e 73 74 20 63  t {.     const c
dcb0: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20  har *zName;.    
dcc0: 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 20   int nArg;.     
dcd0: 69 6e 74 20 66 6c 61 67 3b 0a 20 20 20 20 20 76  int flag;.     v
dce0: 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c  oid (*xFunc)(sql
dcf0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
dd00: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  t,sqlite3_value*
dd10: 2a 29 3b 0a 20 20 7d 20 61 46 75 6e 63 5b 5d 20  *);.  } aFunc[] 
dd20: 3d 20 7b 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 22  = {.    { "json"
dd30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
dd40: 20 20 31 2c 20 30 2c 20 20 20 6a 73 6f 6e 52 65    1, 0,   jsonRe
dd50: 6d 6f 76 65 46 75 6e 63 20 20 20 20 20 20 20 20  moveFunc        
dd60: 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 61  },.    { "json_a
dd70: 72 72 61 79 22 2c 20 20 20 20 20 20 20 20 20 20  rray",          
dd80: 2d 31 2c 20 30 2c 20 20 20 6a 73 6f 6e 41 72 72  -1, 0,   jsonArr
dd90: 61 79 46 75 6e 63 20 20 20 20 20 20 20 20 20 7d  ayFunc         }
dda0: 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 61 72  ,.    { "json_ar
ddb0: 72 61 79 5f 6c 65 6e 67 74 68 22 2c 20 20 20 20  ray_length",    
ddc0: 31 2c 20 30 2c 20 20 20 6a 73 6f 6e 41 72 72 61  1, 0,   jsonArra
ddd0: 79 4c 65 6e 67 74 68 46 75 6e 63 20 20 20 7d 2c  yLengthFunc   },
dde0: 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 61 72 72  .    { "json_arr
ddf0: 61 79 5f 6c 65 6e 67 74 68 22 2c 20 20 20 20 32  ay_length",    2
de00: 2c 20 30 2c 20 20 20 6a 73 6f 6e 41 72 72 61 79  , 0,   jsonArray
de10: 4c 65 6e 67 74 68 46 75 6e 63 20 20 20 7d 2c 0a  LengthFunc   },.
de20: 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 65 78 74 72      { "json_extr
de30: 61 63 74 22 2c 20 20 20 20 20 20 20 20 2d 31 2c  act",        -1,
de40: 20 30 2c 20 20 20 6a 73 6f 6e 45 78 74 72 61 63   0,   jsonExtrac
de50: 74 46 75 6e 63 20 20 20 20 20 20 20 7d 2c 0a 20  tFunc       },. 
de60: 20 20 20 7b 20 22 6a 73 6f 6e 5f 69 6e 73 65 72     { "json_inser
de70: 74 22 2c 20 20 20 20 20 20 20 20 20 2d 31 2c 20  t",         -1, 
de80: 30 2c 20 20 20 6a 73 6f 6e 53 65 74 46 75 6e 63  0,   jsonSetFunc
de90: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
dea0: 20 20 7b 20 22 6a 73 6f 6e 5f 6f 62 6a 65 63 74    { "json_object
deb0: 22 2c 20 20 20 20 20 20 20 20 20 2d 31 2c 20 30  ",         -1, 0
dec0: 2c 20 20 20 6a 73 6f 6e 4f 62 6a 65 63 74 46 75  ,   jsonObjectFu
ded0: 6e 63 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  nc        },.   
dee0: 20 7b 20 22 6a 73 6f 6e 5f 72 65 6d 6f 76 65 22   { "json_remove"
def0: 2c 20 20 20 20 20 20 20 20 20 2d 31 2c 20 30 2c  ,         -1, 0,
df00: 20 20 20 6a 73 6f 6e 52 65 6d 6f 76 65 46 75 6e     jsonRemoveFun
df10: 63 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  c        },.    
df20: 7b 20 22 6a 73 6f 6e 5f 72 65 70 6c 61 63 65 22  { "json_replace"
df30: 2c 20 20 20 20 20 20 20 20 2d 31 2c 20 30 2c 20  ,        -1, 0, 
df40: 20 20 6a 73 6f 6e 52 65 70 6c 61 63 65 46 75 6e    jsonReplaceFun
df50: 63 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b  c       },.    {
df60: 20 22 6a 73 6f 6e 5f 73 65 74 22 2c 20 20 20 20   "json_set",    
df70: 20 20 20 20 20 20 20 20 2d 31 2c 20 31 2c 20 20          -1, 1,  
df80: 20 6a 73 6f 6e 53 65 74 46 75 6e 63 20 20 20 20   jsonSetFunc    
df90: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
dfa0: 22 6a 73 6f 6e 5f 74 79 70 65 22 2c 20 20 20 20  "json_type",    
dfb0: 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 20 20          1, 0,   
dfc0: 6a 73 6f 6e 54 79 70 65 46 75 6e 63 20 20 20 20  jsonTypeFunc    
dfd0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
dfe0: 6a 73 6f 6e 5f 74 79 70 65 22 2c 20 20 20 20 20  json_type",     
dff0: 20 20 20 20 20 20 20 32 2c 20 30 2c 20 20 20 6a         2, 0,   j
e000: 73 6f 6e 54 79 70 65 46 75 6e 63 20 20 20 20 20  sonTypeFunc     
e010: 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a       },.    { "j
e020: 73 6f 6e 5f 76 61 6c 69 64 22 2c 20 20 20 20 20  son_valid",     
e030: 20 20 20 20 20 20 31 2c 20 30 2c 20 20 20 6a 73        1, 0,   js
e040: 6f 6e 56 61 6c 69 64 46 75 6e 63 20 20 20 20 20  onValidFunc     
e050: 20 20 20 20 7d 2c 0a 0a 23 69 66 20 53 51 4c 49      },..#if SQLI
e060: 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  TE_DEBUG.    /* 
e070: 44 45 42 55 47 20 61 6e 64 20 54 45 53 54 49 4e  DEBUG and TESTIN
e080: 47 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  G functions */. 
e090: 20 20 20 7b 20 22 6a 73 6f 6e 5f 70 61 72 73 65     { "json_parse
e0a0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 31 2c 20  ",           1, 
e0b0: 30 2c 20 20 20 6a 73 6f 6e 50 61 72 73 65 46 75  0,   jsonParseFu
e0c0: 6e 63 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  nc         },.  
e0d0: 20 20 7b 20 22 6a 73 6f 6e 5f 74 65 73 74 31 22    { "json_test1"
e0e0: 2c 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30  ,           1, 0
e0f0: 2c 20 20 20 6a 73 6f 6e 54 65 73 74 31 46 75 6e  ,   jsonTest1Fun
e100: 63 20 20 20 20 20 20 20 20 20 7d 2c 0a 23 65 6e  c         },.#en
e110: 64 69 66 0a 20 20 7d 3b 0a 23 69 66 6e 64 65 66  dif.  };.#ifndef
e120: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
e130: 54 55 41 4c 54 41 42 4c 45 0a 20 20 73 74 61 74  TUALTABLE.  stat
e140: 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
e150: 7b 0a 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  {.     const cha
e160: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 73  r *zName;.     s
e170: 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70  qlite3_module *p
e180: 4d 6f 64 75 6c 65 3b 0a 20 20 7d 20 61 4d 6f 64  Module;.  } aMod
e190: 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 6a 73  [] = {.    { "js
e1a0: 6f 6e 5f 65 61 63 68 22 2c 20 20 20 20 20 20 20  on_each",       
e1b0: 20 20 20 20 20 26 6a 73 6f 6e 45 61 63 68 4d 6f       &jsonEachMo
e1c0: 64 75 6c 65 20 20 20 20 20 20 20 20 20 20 20 20  dule            
e1d0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f     },.    { "jso
e1e0: 6e 5f 74 72 65 65 22 2c 20 20 20 20 20 20 20 20  n_tree",        
e1f0: 20 20 20 20 26 6a 73 6f 6e 54 72 65 65 4d 6f 64      &jsonTreeMod
e200: 75 6c 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ule             
e210: 20 20 7d 2c 0a 20 20 7d 3b 0a 23 65 6e 64 69 66    },.  };.#endif
e220: 0a 20 20 53 51 4c 49 54 45 5f 45 58 54 45 4e 53  .  SQLITE_EXTENS
e230: 49 4f 4e 5f 49 4e 49 54 32 28 70 41 70 69 29 3b  ION_INIT2(pApi);
e240: 0a 20 20 28 76 6f 69 64 29 70 7a 45 72 72 4d 73  .  (void)pzErrMs
e250: 67 3b 20 20 2f 2a 20 55 6e 75 73 65 64 20 70 61  g;  /* Unused pa
e260: 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 66 6f 72  rameter */.  for
e270: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
e280: 46 75 6e 63 29 2f 73 69 7a 65 6f 66 28 61 46 75  Func)/sizeof(aFu
e290: 6e 63 5b 30 5d 29 20 26 26 20 72 63 3d 3d 53 51  nc[0]) && rc==SQ
e2a0: 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20  LITE_OK; i++){. 
e2b0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
e2c0: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
e2d0: 64 62 2c 20 61 46 75 6e 63 5b 69 5d 2e 7a 4e 61  db, aFunc[i].zNa
e2e0: 6d 65 2c 20 61 46 75 6e 63 5b 69 5d 2e 6e 41 72  me, aFunc[i].nAr
e2f0: 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  g,.             
e300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e310: 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20      SQLITE_UTF8 
e320: 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
e330: 4e 49 53 54 49 43 2c 20 0a 20 20 20 20 20 20 20  NISTIC, .       
e340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e350: 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
e360: 29 26 61 46 75 6e 63 5b 69 5d 2e 66 6c 61 67 2c  )&aFunc[i].flag,
e370: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e390: 20 20 61 46 75 6e 63 5b 69 5d 2e 78 46 75 6e 63    aFunc[i].xFunc
e3a0: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 69 66  , 0, 0);.  }.#if
e3b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e3c0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
e3d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
e3e0: 66 28 61 4d 6f 64 29 2f 73 69 7a 65 6f 66 28 61  f(aMod)/sizeof(a
e3f0: 4d 6f 64 5b 30 5d 29 20 26 26 20 72 63 3d 3d 53  Mod[0]) && rc==S
e400: 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a  QLITE_OK; i++){.
e410: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e420: 5f 63 72 65 61 74 65 5f 6d 6f 64 75 6c 65 28 64  _create_module(d
e430: 62 2c 20 61 4d 6f 64 5b 69 5d 2e 7a 4e 61 6d 65  b, aMod[i].zName
e440: 2c 20 61 4d 6f 64 5b 69 5d 2e 70 4d 6f 64 75 6c  , aMod[i].pModul
e450: 65 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  e, 0);.  }.#endi
e460: 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  f.  return rc;.}
e470: 0a                                               .