/ Hex Artifact Content
Login

Artifact 4387d091c0ec0f4d9ed05560960f03d366db4fe0:


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 20 55 6e  (void)(X)../* Un
0450: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 74  signed integer t
0460: 79 70 65 73 20 2a 2f 0a 74 79 70 65 64 65 66 20  ypes */.typedef 
0470: 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 75  sqlite3_uint64 u
0480: 36 34 3b 0a 74 79 70 65 64 65 66 20 75 6e 73 69  64;.typedef unsi
0490: 67 6e 65 64 20 69 6e 74 20 75 33 32 3b 0a 74 79  gned int u32;.ty
04a0: 70 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20 63  pedef unsigned c
04b0: 68 61 72 20 75 38 3b 0a 0a 2f 2a 20 4f 62 6a 65  har u8;../* Obje
04c0: 63 74 73 20 2a 2f 0a 74 79 70 65 64 65 66 20 73  cts */.typedef s
04d0: 74 72 75 63 74 20 4a 73 6f 6e 53 74 72 69 6e 67  truct JsonString
04e0: 20 4a 73 6f 6e 53 74 72 69 6e 67 3b 0a 74 79 70   JsonString;.typ
04f0: 65 64 65 66 20 73 74 72 75 63 74 20 4a 73 6f 6e  edef struct Json
0500: 4e 6f 64 65 20 4a 73 6f 6e 4e 6f 64 65 3b 0a 74  Node JsonNode;.t
0510: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 4a 73  ypedef struct Js
0520: 6f 6e 50 61 72 73 65 20 4a 73 6f 6e 50 61 72 73  onParse JsonPars
0530: 65 3b 0a 0a 2f 2a 20 41 6e 20 69 6e 73 74 61 6e  e;../* An instan
0540: 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63  ce of this objec
0550: 74 20 72 65 70 72 65 73 65 6e 74 73 20 61 20 4a  t represents a J
0560: 53 4f 4e 20 73 74 72 69 6e 67 0a 2a 2a 20 75 6e  SON string.** un
0570: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
0580: 2e 20 20 52 65 61 6c 6c 79 2c 20 74 68 69 73 20  .  Really, this 
0590: 69 73 20 61 20 67 65 6e 65 72 69 63 20 73 74 72  is a generic str
05a0: 69 6e 67 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a  ing accumulator.
05b0: 2a 2a 20 74 68 61 74 20 63 61 6e 20 62 65 20 61  ** that can be a
05c0: 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 63 72  nd is used to cr
05d0: 65 61 74 65 20 73 74 72 69 6e 67 73 20 6f 74 68  eate strings oth
05e0: 65 72 20 74 68 61 6e 20 4a 53 4f 4e 2e 0a 2a 2f  er than JSON..*/
05f0: 0a 73 74 72 75 63 74 20 4a 73 6f 6e 53 74 72 69  .struct JsonStri
0600: 6e 67 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 63  ng {.  sqlite3_c
0610: 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 20 20 20  ontext *pCtx;   
0620: 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 63 6f 6e 74  /* Function cont
0630: 65 78 74 20 2d 20 70 75 74 20 65 72 72 6f 72 20  ext - put error 
0640: 6d 65 73 73 61 67 65 73 20 68 65 72 65 20 2a 2f  messages here */
0650: 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 3b 20 20  .  char *zBuf;  
0660: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
0670: 70 70 65 6e 64 20 4a 53 4f 4e 20 63 6f 6e 74 65  ppend JSON conte
0680: 6e 74 20 68 65 72 65 20 2a 2f 0a 20 20 75 36 34  nt here */.  u64
0690: 20 6e 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20   nAlloc;        
06a0: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
06b0: 66 20 73 74 6f 72 61 67 65 20 61 76 61 69 6c 61  f storage availa
06c0: 62 6c 65 20 69 6e 20 7a 42 75 66 5b 5d 20 2a 2f  ble in zBuf[] */
06d0: 0a 20 20 75 36 34 20 6e 55 73 65 64 3b 20 20 20  .  u64 nUsed;   
06e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
06f0: 79 74 65 73 20 6f 66 20 7a 42 75 66 5b 5d 20 63  ytes of zBuf[] c
0700: 75 72 72 65 6e 74 6c 79 20 75 73 65 64 20 2a 2f  urrently used */
0710: 0a 20 20 75 38 20 62 53 74 61 74 69 63 3b 20 20  .  u8 bStatic;  
0720: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
0730: 72 75 65 20 69 66 20 7a 42 75 66 20 69 73 20 73  rue if zBuf is s
0740: 74 61 74 69 63 20 73 70 61 63 65 20 2a 2f 0a 20  tatic space */. 
0750: 20 75 38 20 62 45 72 72 3b 20 20 20 20 20 20 20   u8 bErr;       
0760: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
0770: 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 68 61  e if an error ha
0780: 73 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72  s been encounter
0790: 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 7a 53 70  ed */.  char zSp
07a0: 61 63 65 5b 31 30 30 5d 3b 20 20 20 20 20 20 20  ace[100];       
07b0: 20 2f 2a 20 49 6e 69 74 69 61 6c 20 73 74 61 74   /* Initial stat
07c0: 69 63 20 73 70 61 63 65 20 2a 2f 0a 7d 3b 0a 0a  ic space */.};..
07d0: 2f 2a 20 4a 53 4f 4e 20 74 79 70 65 20 76 61 6c  /* JSON type val
07e0: 75 65 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a  ues.*/.#define J
07f0: 53 4f 4e 5f 4e 55 4c 4c 20 20 20 20 20 30 0a 23  SON_NULL     0.#
0800: 64 65 66 69 6e 65 20 4a 53 4f 4e 5f 54 52 55 45  define JSON_TRUE
0810: 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20 4a       1.#define J
0820: 53 4f 4e 5f 46 41 4c 53 45 20 20 20 20 32 0a 23  SON_FALSE    2.#
0830: 64 65 66 69 6e 65 20 4a 53 4f 4e 5f 49 4e 54 20  define JSON_INT 
0840: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 4a       3.#define J
0850: 53 4f 4e 5f 52 45 41 4c 20 20 20 20 20 34 0a 23  SON_REAL     4.#
0860: 64 65 66 69 6e 65 20 4a 53 4f 4e 5f 53 54 52 49  define JSON_STRI
0870: 4e 47 20 20 20 35 0a 23 64 65 66 69 6e 65 20 4a  NG   5.#define J
0880: 53 4f 4e 5f 41 52 52 41 59 20 20 20 20 36 0a 23  SON_ARRAY    6.#
0890: 64 65 66 69 6e 65 20 4a 53 4f 4e 5f 4f 42 4a 45  define JSON_OBJE
08a0: 43 54 20 20 20 37 0a 0a 2f 2a 0a 2a 2a 20 4e 61  CT   7../*.** Na
08b0: 6d 65 73 20 6f 66 20 74 68 65 20 76 61 72 69 6f  mes of the vario
08c0: 75 73 20 4a 53 4f 4e 20 74 79 70 65 73 3a 0a 2a  us JSON types:.*
08d0: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
08e0: 68 61 72 20 2a 20 63 6f 6e 73 74 20 6a 73 6f 6e  har * const json
08f0: 54 79 70 65 5b 5d 20 3d 20 7b 0a 20 20 22 6e 75  Type[] = {.  "nu
0900: 6c 6c 22 2c 20 22 74 72 75 65 22 2c 20 22 66 61  ll", "true", "fa
0910: 6c 73 65 22 2c 20 22 69 6e 74 65 67 65 72 22 2c  lse", "integer",
0920: 20 22 72 65 61 6c 22 2c 20 22 74 65 78 74 22 2c   "real", "text",
0930: 20 22 61 72 72 61 79 22 2c 20 22 6f 62 6a 65 63   "array", "objec
0940: 74 22 0a 7d 3b 0a 0a 2f 2a 20 42 69 74 20 76 61  t".};../* Bit va
0950: 6c 75 65 73 20 66 6f 72 20 74 68 65 20 4a 73 6f  lues for the Jso
0960: 6e 4e 6f 64 65 2e 6a 6e 46 6c 61 67 20 66 69 65  nNode.jnFlag fie
0970: 6c 64 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4e  ld.*/.#define JN
0980: 4f 44 45 5f 52 41 57 20 20 20 20 20 30 78 30 31  ODE_RAW     0x01
0990: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74           /* Cont
09a0: 65 6e 74 20 69 73 20 72 61 77 2c 20 6e 6f 74 20  ent is raw, not 
09b0: 4a 53 4f 4e 20 65 6e 63 6f 64 65 64 20 2a 2f 0a  JSON encoded */.
09c0: 23 64 65 66 69 6e 65 20 4a 4e 4f 44 45 5f 45 53  #define JNODE_ES
09d0: 43 41 50 45 20 20 30 78 30 32 20 20 20 20 20 20  CAPE  0x02      
09e0: 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 69 73     /* Content is
09f0: 20 74 65 78 74 20 77 69 74 68 20 5c 20 65 73 63   text with \ esc
0a00: 61 70 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20  apes */.#define 
0a10: 4a 4e 4f 44 45 5f 52 45 4d 4f 56 45 20 20 30 78  JNODE_REMOVE  0x
0a20: 30 34 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f  04         /* Do
0a30: 20 6e 6f 74 20 6f 75 74 70 75 74 20 2a 2f 0a 23   not output */.#
0a40: 64 65 66 69 6e 65 20 4a 4e 4f 44 45 5f 52 45 50  define JNODE_REP
0a50: 4c 41 43 45 20 30 78 30 38 20 20 20 20 20 20 20  LACE 0x08       
0a60: 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 77 69 74    /* Replace wit
0a70: 68 20 4a 73 6f 6e 4e 6f 64 65 2e 69 56 61 6c 20  h JsonNode.iVal 
0a80: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4e 4f 44 45  */.#define JNODE
0a90: 5f 41 50 50 45 4e 44 20 20 30 78 31 30 20 20 20  _APPEND  0x10   
0aa0: 20 20 20 20 20 20 2f 2a 20 4d 6f 72 65 20 41 52        /* More AR
0ab0: 52 41 59 2f 4f 42 4a 45 43 54 20 65 6e 74 72 69  RAY/OBJECT entri
0ac0: 65 73 20 61 74 20 75 2e 69 41 70 70 65 6e 64 20  es at u.iAppend 
0ad0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4e 4f 44 45  */.#define JNODE
0ae0: 5f 4a 53 4f 4e 20 20 20 20 30 78 32 30 20 20 20  _JSON    0x20   
0af0: 20 20 20 20 20 20 2f 2a 20 54 72 65 61 74 20 52        /* Treat R
0b00: 45 50 4c 41 43 45 20 61 73 20 4a 53 4f 4e 20 74  EPLACE as JSON t
0b10: 65 78 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4a  ext */.#define J
0b20: 4e 4f 44 45 5f 4c 41 42 45 4c 20 20 20 30 78 34  NODE_LABEL   0x4
0b30: 30 20 20 20 20 20 20 20 20 20 2f 2a 20 49 73 20  0         /* Is 
0b40: 61 20 6c 61 62 65 6c 20 6f 66 20 61 6e 20 6f 62  a label of an ob
0b50: 6a 65 63 74 20 2a 2f 0a 0a 0a 2f 2a 20 41 20 73  ject */.../* A s
0b60: 69 6e 67 6c 65 20 6e 6f 64 65 20 6f 66 20 70 61  ingle node of pa
0b70: 72 73 65 64 20 4a 53 4f 4e 0a 2a 2f 0a 73 74 72  rsed JSON.*/.str
0b80: 75 63 74 20 4a 73 6f 6e 4e 6f 64 65 20 7b 0a 20  uct JsonNode {. 
0b90: 20 75 38 20 65 54 79 70 65 3b 20 20 20 20 20 20   u8 eType;      
0ba0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
0bb0: 66 20 74 68 65 20 4a 53 4f 4e 5f 20 74 79 70 65  f the JSON_ type
0bc0: 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 75 38 20   values */.  u8 
0bd0: 6a 6e 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  jnFlags;        
0be0: 20 20 20 20 2f 2a 20 4a 4e 4f 44 45 20 66 6c 61      /* JNODE fla
0bf0: 67 73 20 2a 2f 0a 20 20 75 38 20 69 56 61 6c 3b  gs */.  u8 iVal;
0c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0c10: 2a 20 52 65 70 6c 61 63 65 6d 65 6e 74 20 76 61  * Replacement va
0c20: 6c 75 65 20 77 68 65 6e 20 4a 4e 4f 44 45 5f 52  lue when JNODE_R
0c30: 45 50 4c 41 43 45 20 2a 2f 0a 20 20 75 33 32 20  EPLACE */.  u32 
0c40: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
0c50: 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 63     /* Bytes of c
0c60: 6f 6e 74 65 6e 74 2c 20 6f 72 20 6e 75 6d 62 65  ontent, or numbe
0c70: 72 20 6f 66 20 73 75 62 2d 6e 6f 64 65 73 20 2a  r of sub-nodes *
0c80: 2f 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20  /.  union {.    
0c90: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4a 43 6f  const char *zJCo
0ca0: 6e 74 65 6e 74 3b 20 2f 2a 20 43 6f 6e 74 65 6e  ntent; /* Conten
0cb0: 74 20 66 6f 72 20 49 4e 54 2c 20 52 45 41 4c 2c  t for INT, REAL,
0cc0: 20 61 6e 64 20 53 54 52 49 4e 47 20 2a 2f 0a 20   and STRING */. 
0cd0: 20 20 20 75 33 32 20 69 41 70 70 65 6e 64 3b 20     u32 iAppend; 
0ce0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 72            /* Mor
0cf0: 65 20 74 65 72 6d 73 20 66 6f 72 20 41 52 52 41  e terms for ARRA
0d00: 59 20 61 6e 64 20 4f 42 4a 45 43 54 20 2a 2f 0a  Y and OBJECT */.
0d10: 20 20 20 20 75 33 32 20 69 4b 65 79 3b 20 20 20      u32 iKey;   
0d20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65             /* Ke
0d30: 79 20 66 6f 72 20 41 52 52 41 59 20 6f 62 6a 65  y for ARRAY obje
0d40: 63 74 73 20 69 6e 20 6a 73 6f 6e 5f 74 72 65 65  cts in json_tree
0d50: 28 29 20 2a 2f 0a 20 20 7d 20 75 3b 0a 7d 3b 0a  () */.  } u;.};.
0d60: 0a 2f 2a 20 41 20 63 6f 6d 70 6c 65 74 65 6c 79  ./* A completely
0d70: 20 70 61 72 73 65 64 20 4a 53 4f 4e 20 73 74 72   parsed JSON str
0d80: 69 6e 67 0a 2a 2f 0a 73 74 72 75 63 74 20 4a 73  ing.*/.struct Js
0d90: 6f 6e 50 61 72 73 65 20 7b 0a 20 20 75 33 32 20  onParse {.  u32 
0da0: 6e 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 2f  nNode;         /
0db0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74  * Number of slot
0dc0: 73 20 6f 66 20 61 4e 6f 64 65 5b 5d 20 75 73 65  s of aNode[] use
0dd0: 64 20 2a 2f 0a 20 20 75 33 32 20 6e 41 6c 6c 6f  d */.  u32 nAllo
0de0: 63 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  c;        /* Num
0df0: 62 65 72 20 6f 66 20 73 6c 6f 74 73 20 6f 66 20  ber of slots of 
0e00: 61 4e 6f 64 65 5b 5d 20 61 6c 6c 6f 63 61 74 65  aNode[] allocate
0e10: 64 20 2a 2f 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20  d */.  JsonNode 
0e20: 2a 61 4e 6f 64 65 3b 20 20 20 2f 2a 20 41 72 72  *aNode;   /* Arr
0e30: 61 79 20 6f 66 20 6e 6f 64 65 73 20 63 6f 6e 74  ay of nodes cont
0e40: 61 69 6e 69 6e 67 20 74 68 65 20 70 61 72 73 65  aining the parse
0e50: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
0e60: 20 2a 7a 4a 73 6f 6e 3b 20 2f 2a 20 4f 72 69 67   *zJson; /* Orig
0e70: 69 6e 61 6c 20 4a 53 4f 4e 20 73 74 72 69 6e 67  inal JSON string
0e80: 20 2a 2f 0a 20 20 75 33 32 20 2a 61 55 70 3b 20   */.  u32 *aUp; 
0e90: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
0ea0: 78 20 6f 66 20 70 61 72 65 6e 74 20 6f 66 20 65  x of parent of e
0eb0: 61 63 68 20 6e 6f 64 65 20 2a 2f 0a 20 20 75 38  ach node */.  u8
0ec0: 20 6f 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20   oom;           
0ed0: 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20   /* Set to true 
0ee0: 69 66 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  if out of memory
0ef0: 20 2a 2f 0a 20 20 75 38 20 6e 45 72 72 3b 20 20   */.  u8 nErr;  
0f00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
0f10: 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65  er of errors see
0f20: 6e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a  n */.};../******
0f30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0f40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0f50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0f60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0f70: 2a 2a 2a 2a 0a 2a 2a 20 55 74 69 6c 69 74 79 20  ****.** Utility 
0f80: 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 64 65 61  routines for dea
0f90: 6c 69 6e 67 20 77 69 74 68 20 4a 73 6f 6e 53 74  ling with JsonSt
0fa0: 72 69 6e 67 20 6f 62 6a 65 63 74 73 0a 2a 2a 2a  ring objects.***
0fb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0fc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0fd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0fe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0ff0: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 20 53 65 74  *******/../* Set
1000: 20 74 68 65 20 4a 73 6f 6e 53 74 72 69 6e 67 20   the JsonString 
1010: 6f 62 6a 65 63 74 20 74 6f 20 61 6e 20 65 6d 70  object to an emp
1020: 74 79 20 73 74 72 69 6e 67 0a 2a 2f 0a 73 74 61  ty string.*/.sta
1030: 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 5a 65 72  tic void jsonZer
1040: 6f 28 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70 29  o(JsonString *p)
1050: 7b 0a 20 20 70 2d 3e 7a 42 75 66 20 3d 20 70 2d  {.  p->zBuf = p-
1060: 3e 7a 53 70 61 63 65 3b 0a 20 20 70 2d 3e 6e 41  >zSpace;.  p->nA
1070: 6c 6c 6f 63 20 3d 20 73 69 7a 65 6f 66 28 70 2d  lloc = sizeof(p-
1080: 3e 7a 53 70 61 63 65 29 3b 0a 20 20 70 2d 3e 6e  >zSpace);.  p->n
1090: 55 73 65 64 20 3d 20 30 3b 0a 20 20 70 2d 3e 62  Used = 0;.  p->b
10a0: 53 74 61 74 69 63 20 3d 20 31 3b 0a 7d 0a 0a 2f  Static = 1;.}../
10b0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
10c0: 20 4a 73 6f 6e 53 74 72 69 6e 67 20 6f 62 6a 65   JsonString obje
10d0: 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ct.*/.static voi
10e0: 64 20 6a 73 6f 6e 49 6e 69 74 28 4a 73 6f 6e 53  d jsonInit(JsonS
10f0: 74 72 69 6e 67 20 2a 70 2c 20 73 71 6c 69 74 65  tring *p, sqlite
1100: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29  3_context *pCtx)
1110: 7b 0a 20 20 70 2d 3e 70 43 74 78 20 3d 20 70 43  {.  p->pCtx = pC
1120: 74 78 3b 0a 20 20 70 2d 3e 62 45 72 72 20 3d 20  tx;.  p->bErr = 
1130: 30 3b 0a 20 20 6a 73 6f 6e 5a 65 72 6f 28 70 29  0;.  jsonZero(p)
1140: 3b 0a 7d 0a 0a 0a 2f 2a 20 46 72 65 65 20 61 6c  ;.}.../* Free al
1150: 6c 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f  l allocated memo
1160: 72 79 20 61 6e 64 20 72 65 73 65 74 20 74 68 65  ry and reset the
1170: 20 4a 73 6f 6e 53 74 72 69 6e 67 20 6f 62 6a 65   JsonString obje
1180: 63 74 20 62 61 63 6b 20 74 6f 20 69 74 73 0a 2a  ct back to its.*
1190: 2a 20 69 6e 69 74 69 61 6c 20 73 74 61 74 65 2e  * initial state.
11a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11b0: 6a 73 6f 6e 52 65 73 65 74 28 4a 73 6f 6e 53 74  jsonReset(JsonSt
11c0: 72 69 6e 67 20 2a 70 29 7b 0a 20 20 69 66 28 20  ring *p){.  if( 
11d0: 21 70 2d 3e 62 53 74 61 74 69 63 20 29 20 73 71  !p->bStatic ) sq
11e0: 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 42  lite3_free(p->zB
11f0: 75 66 29 3b 0a 20 20 6a 73 6f 6e 5a 65 72 6f 28  uf);.  jsonZero(
1200: 70 29 3b 0a 7d 0a 0a 0a 2f 2a 20 52 65 70 6f 72  p);.}.../* Repor
1210: 74 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f  t an out-of-memo
1220: 72 79 20 28 4f 4f 4d 29 20 63 6f 6e 64 69 74 69  ry (OOM) conditi
1230: 6f 6e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on .*/.static vo
1240: 69 64 20 6a 73 6f 6e 4f 6f 6d 28 4a 73 6f 6e 53  id jsonOom(JsonS
1250: 74 72 69 6e 67 20 2a 70 29 7b 0a 20 20 69 66 28  tring *p){.  if(
1260: 20 21 70 2d 3e 62 45 72 72 20 29 7b 0a 20 20 20   !p->bErr ){.   
1270: 20 70 2d 3e 62 45 72 72 20 3d 20 31 3b 0a 20 20   p->bErr = 1;.  
1280: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
1290: 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 70 2d 3e  _error_nomem(p->
12a0: 70 43 74 78 29 3b 0a 20 20 20 20 6a 73 6f 6e 52  pCtx);.    jsonR
12b0: 65 73 65 74 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  eset(p);.  }.}..
12c0: 2f 2a 20 45 6e 6c 61 72 67 65 20 70 4a 73 6f 6e  /* Enlarge pJson
12d0: 2d 3e 7a 42 75 66 20 73 6f 20 74 68 61 74 20 69  ->zBuf so that i
12e0: 74 20 63 61 6e 20 68 6f 6c 64 20 61 74 20 6c 65  t can hold at le
12f0: 61 73 74 20 4e 20 6d 6f 72 65 20 62 79 74 65 73  ast N more bytes
1300: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 7a 65 72 6f  ..** Return zero
1310: 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 52 65   on success.  Re
1320: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e  turn non-zero on
1330: 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 0a 2a 2f   an OOM error.*/
1340: 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e  .static int json
1350: 47 72 6f 77 28 4a 73 6f 6e 53 74 72 69 6e 67 20  Grow(JsonString 
1360: 2a 70 2c 20 75 33 32 20 4e 29 7b 0a 20 20 75 36  *p, u32 N){.  u6
1370: 34 20 6e 54 6f 74 61 6c 20 3d 20 4e 3c 70 2d 3e  4 nTotal = N<p->
1380: 6e 41 6c 6c 6f 63 20 3f 20 70 2d 3e 6e 41 6c 6c  nAlloc ? p->nAll
1390: 6f 63 2a 32 20 3a 20 70 2d 3e 6e 41 6c 6c 6f 63  oc*2 : p->nAlloc
13a0: 2b 4e 2b 31 30 3b 0a 20 20 63 68 61 72 20 2a 7a  +N+10;.  char *z
13b0: 4e 65 77 3b 0a 20 20 69 66 28 20 70 2d 3e 62 53  New;.  if( p->bS
13c0: 74 61 74 69 63 20 29 7b 0a 20 20 20 20 69 66 28  tatic ){.    if(
13d0: 20 70 2d 3e 62 45 72 72 20 29 20 72 65 74 75 72   p->bErr ) retur
13e0: 6e 20 31 3b 0a 20 20 20 20 7a 4e 65 77 20 3d 20  n 1;.    zNew = 
13f0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
1400: 28 6e 54 6f 74 61 6c 29 3b 0a 20 20 20 20 69 66  (nTotal);.    if
1410: 28 20 7a 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( zNew==0 ){.   
1420: 20 20 20 6a 73 6f 6e 4f 6f 6d 28 70 29 3b 0a 20     jsonOom(p);. 
1430: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1440: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
1450: 20 20 20 20 6d 65 6d 63 70 79 28 7a 4e 65 77 2c      memcpy(zNew,
1460: 20 70 2d 3e 7a 42 75 66 2c 20 28 73 69 7a 65 5f   p->zBuf, (size_
1470: 74 29 70 2d 3e 6e 55 73 65 64 29 3b 0a 20 20 20  t)p->nUsed);.   
1480: 20 70 2d 3e 7a 42 75 66 20 3d 20 7a 4e 65 77 3b   p->zBuf = zNew;
1490: 0a 20 20 20 20 70 2d 3e 62 53 74 61 74 69 63 20  .    p->bStatic 
14a0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
14b0: 20 20 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    zNew = sqlite3
14c0: 5f 72 65 61 6c 6c 6f 63 36 34 28 70 2d 3e 7a 42  _realloc64(p->zB
14d0: 75 66 2c 20 6e 54 6f 74 61 6c 29 3b 0a 20 20 20  uf, nTotal);.   
14e0: 20 69 66 28 20 7a 4e 65 77 3d 3d 30 20 29 7b 0a   if( zNew==0 ){.
14f0: 20 20 20 20 20 20 6a 73 6f 6e 4f 6f 6d 28 70 29        jsonOom(p)
1500: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1510: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1520: 20 7d 0a 20 20 20 20 70 2d 3e 7a 42 75 66 20 3d   }.    p->zBuf =
1530: 20 7a 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 2d 3e   zNew;.  }.  p->
1540: 6e 41 6c 6c 6f 63 20 3d 20 6e 54 6f 74 61 6c 3b  nAlloc = nTotal;
1550: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1560: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 41 70 70 65 6e  _OK;.}../* Appen
1570: 64 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 7a  d N bytes from z
1580: 49 6e 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  In onto the end 
1590: 6f 66 20 74 68 65 20 4a 73 6f 6e 53 74 72 69 6e  of the JsonStrin
15a0: 67 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61  g string..*/.sta
15b0: 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 41 70 70  tic void jsonApp
15c0: 65 6e 64 52 61 77 28 4a 73 6f 6e 53 74 72 69 6e  endRaw(JsonStrin
15d0: 67 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  g *p, const char
15e0: 20 2a 7a 49 6e 2c 20 75 33 32 20 4e 29 7b 0a 20   *zIn, u32 N){. 
15f0: 20 69 66 28 20 28 4e 2b 70 2d 3e 6e 55 73 65 64   if( (N+p->nUsed
1600: 20 3e 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 29 20 26   >= p->nAlloc) &
1610: 26 20 6a 73 6f 6e 47 72 6f 77 28 70 2c 4e 29 21  & jsonGrow(p,N)!
1620: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d  =0 ) return;.  m
1630: 65 6d 63 70 79 28 70 2d 3e 7a 42 75 66 2b 70 2d  emcpy(p->zBuf+p-
1640: 3e 6e 55 73 65 64 2c 20 7a 49 6e 2c 20 4e 29 3b  >nUsed, zIn, N);
1650: 0a 20 20 70 2d 3e 6e 55 73 65 64 20 2b 3d 20 4e  .  p->nUsed += N
1660: 3b 0a 7d 0a 0a 2f 2a 20 41 70 70 65 6e 64 20 66  ;.}../* Append f
1670: 6f 72 6d 61 74 74 65 64 20 74 65 78 74 20 28 6e  ormatted text (n
1680: 6f 74 20 74 6f 20 65 78 63 65 65 64 20 4e 20 62  ot to exceed N b
1690: 79 74 65 73 29 20 74 6f 20 74 68 65 20 4a 73 6f  ytes) to the Jso
16a0: 6e 53 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  nString..*/.stat
16b0: 69 63 20 76 6f 69 64 20 6a 73 6f 6e 50 72 69 6e  ic void jsonPrin
16c0: 74 66 28 69 6e 74 20 4e 2c 20 4a 73 6f 6e 53 74  tf(int N, JsonSt
16d0: 72 69 6e 67 20 2a 70 2c 20 63 6f 6e 73 74 20 63  ring *p, const c
16e0: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
16f0: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
1700: 3b 0a 20 20 69 66 28 20 28 70 2d 3e 6e 55 73 65  ;.  if( (p->nUse
1710: 64 20 2b 20 4e 20 3e 3d 20 70 2d 3e 6e 41 6c 6c  d + N >= p->nAll
1720: 6f 63 29 20 26 26 20 6a 73 6f 6e 47 72 6f 77 28  oc) && jsonGrow(
1730: 70 2c 20 4e 29 20 29 20 72 65 74 75 72 6e 3b 0a  p, N) ) return;.
1740: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
1750: 46 6f 72 6d 61 74 29 3b 0a 20 20 73 71 6c 69 74  Format);.  sqlit
1760: 65 33 5f 76 73 6e 70 72 69 6e 74 66 28 4e 2c 20  e3_vsnprintf(N, 
1770: 70 2d 3e 7a 42 75 66 2b 70 2d 3e 6e 55 73 65 64  p->zBuf+p->nUsed
1780: 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  , zFormat, ap);.
1790: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
17a0: 70 2d 3e 6e 55 73 65 64 20 2b 3d 20 28 69 6e 74  p->nUsed += (int
17b0: 29 73 74 72 6c 65 6e 28 70 2d 3e 7a 42 75 66 2b  )strlen(p->zBuf+
17c0: 70 2d 3e 6e 55 73 65 64 29 3b 0a 7d 0a 0a 2f 2a  p->nUsed);.}../*
17d0: 20 41 70 70 65 6e 64 20 61 20 73 69 6e 67 6c 65   Append a single
17e0: 20 63 68 61 72 61 63 74 65 72 0a 2a 2f 0a 73 74   character.*/.st
17f0: 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 41 70  atic void jsonAp
1800: 70 65 6e 64 43 68 61 72 28 4a 73 6f 6e 53 74 72  pendChar(JsonStr
1810: 69 6e 67 20 2a 70 2c 20 63 68 61 72 20 63 29 7b  ing *p, char c){
1820: 0a 20 20 69 66 28 20 70 2d 3e 6e 55 73 65 64 3e  .  if( p->nUsed>
1830: 3d 70 2d 3e 6e 41 6c 6c 6f 63 20 26 26 20 6a 73  =p->nAlloc && js
1840: 6f 6e 47 72 6f 77 28 70 2c 31 29 21 3d 30 20 29  onGrow(p,1)!=0 )
1850: 20 72 65 74 75 72 6e 3b 0a 20 20 70 2d 3e 7a 42   return;.  p->zB
1860: 75 66 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d  uf[p->nUsed++] =
1870: 20 63 3b 0a 7d 0a 0a 2f 2a 20 41 70 70 65 6e 64   c;.}../* Append
1880: 20 61 20 63 6f 6d 6d 61 20 73 65 70 61 72 61 74   a comma separat
1890: 6f 72 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  or to the output
18a0: 20 62 75 66 66 65 72 2c 20 69 66 20 74 68 65 20   buffer, if the 
18b0: 70 72 65 76 69 6f 75 73 0a 2a 2a 20 63 68 61 72  previous.** char
18c0: 61 63 74 65 72 20 69 73 20 6e 6f 74 20 27 5b 27  acter is not '['
18d0: 20 6f 72 20 27 7b 27 2e 0a 2a 2f 0a 73 74 61 74   or '{'..*/.stat
18e0: 69 63 20 76 6f 69 64 20 6a 73 6f 6e 41 70 70 65  ic void jsonAppe
18f0: 6e 64 53 65 70 61 72 61 74 6f 72 28 4a 73 6f 6e  ndSeparator(Json
1900: 53 74 72 69 6e 67 20 2a 70 29 7b 0a 20 20 63 68  String *p){.  ch
1910: 61 72 20 63 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  ar c;.  if( p->n
1920: 55 73 65 64 3d 3d 30 20 29 20 72 65 74 75 72 6e  Used==0 ) return
1930: 3b 0a 20 20 63 20 3d 20 70 2d 3e 7a 42 75 66 5b  ;.  c = p->zBuf[
1940: 70 2d 3e 6e 55 73 65 64 2d 31 5d 3b 0a 20 20 69  p->nUsed-1];.  i
1950: 66 28 20 63 21 3d 27 5b 27 20 26 26 20 63 21 3d  f( c!='[' && c!=
1960: 27 7b 27 20 29 20 6a 73 6f 6e 41 70 70 65 6e 64  '{' ) jsonAppend
1970: 43 68 61 72 28 70 2c 20 27 2c 27 29 3b 0a 7d 0a  Char(p, ',');.}.
1980: 0a 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 4e  ./* Append the N
1990: 2d 62 79 74 65 20 73 74 72 69 6e 67 20 69 6e 20  -byte string in 
19a0: 7a 49 6e 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  zIn to the end o
19b0: 66 20 74 68 65 20 4a 73 6f 6e 53 74 72 69 6e 67  f the JsonString
19c0: 20 73 74 72 69 6e 67 0a 2a 2a 20 75 6e 64 65 72   string.** under
19d0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
19e0: 45 6e 63 6c 6f 73 65 20 74 68 65 20 73 74 72 69  Enclose the stri
19f0: 6e 67 20 69 6e 20 22 2e 2e 2e 22 20 61 6e 64 20  ng in "..." and 
1a00: 65 73 63 61 70 65 0a 2a 2a 20 61 6e 79 20 64 6f  escape.** any do
1a10: 75 62 6c 65 2d 71 75 6f 74 65 73 20 6f 72 20 62  uble-quotes or b
1a20: 61 63 6b 73 6c 61 73 68 20 63 68 61 72 61 63 74  ackslash charact
1a30: 65 72 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 69  ers contained wi
1a40: 74 68 69 6e 20 74 68 65 0a 2a 2a 20 73 74 72 69  thin the.** stri
1a50: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ng..*/.static vo
1a60: 69 64 20 6a 73 6f 6e 41 70 70 65 6e 64 53 74 72  id jsonAppendStr
1a70: 69 6e 67 28 4a 73 6f 6e 53 74 72 69 6e 67 20 2a  ing(JsonString *
1a80: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
1a90: 49 6e 2c 20 75 33 32 20 4e 29 7b 0a 20 20 75 33  In, u32 N){.  u3
1aa0: 32 20 69 3b 0a 20 20 69 66 28 20 28 4e 2b 70 2d  2 i;.  if( (N+p-
1ab0: 3e 6e 55 73 65 64 2b 32 20 3e 3d 20 70 2d 3e 6e  >nUsed+2 >= p->n
1ac0: 41 6c 6c 6f 63 29 20 26 26 20 6a 73 6f 6e 47 72  Alloc) && jsonGr
1ad0: 6f 77 28 70 2c 4e 2b 32 29 21 3d 30 20 29 20 72  ow(p,N+2)!=0 ) r
1ae0: 65 74 75 72 6e 3b 0a 20 20 70 2d 3e 7a 42 75 66  eturn;.  p->zBuf
1af0: 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d 20 27  [p->nUsed++] = '
1b00: 22 27 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  "';.  for(i=0; i
1b10: 3c 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68  <N; i++){.    ch
1b20: 61 72 20 63 20 3d 20 7a 49 6e 5b 69 5d 3b 0a 20  ar c = zIn[i];. 
1b30: 20 20 20 69 66 28 20 63 3d 3d 27 22 27 20 7c 7c     if( c=='"' ||
1b40: 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20   c=='\\' ){.    
1b50: 20 20 69 66 28 20 28 70 2d 3e 6e 55 73 65 64 2b    if( (p->nUsed+
1b60: 4e 2b 31 2d 69 20 3e 20 70 2d 3e 6e 41 6c 6c 6f  N+1-i > p->nAllo
1b70: 63 29 20 26 26 20 6a 73 6f 6e 47 72 6f 77 28 70  c) && jsonGrow(p
1b80: 2c 4e 2b 31 2d 69 29 21 3d 30 20 29 20 72 65 74  ,N+1-i)!=0 ) ret
1b90: 75 72 6e 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 42  urn;.      p->zB
1ba0: 75 66 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d  uf[p->nUsed++] =
1bb0: 20 27 5c 5c 27 3b 0a 20 20 20 20 7d 0a 20 20 20   '\\';.    }.   
1bc0: 20 70 2d 3e 7a 42 75 66 5b 70 2d 3e 6e 55 73 65   p->zBuf[p->nUse
1bd0: 64 2b 2b 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20  d++] = c;.  }.  
1be0: 70 2d 3e 7a 42 75 66 5b 70 2d 3e 6e 55 73 65 64  p->zBuf[p->nUsed
1bf0: 2b 2b 5d 20 3d 20 27 22 27 3b 0a 7d 0a 0a 2f 2a  ++] = '"';.}../*
1c00: 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 66 75 6e  .** Append a fun
1c10: 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20  ction parameter 
1c20: 76 61 6c 75 65 20 74 6f 20 74 68 65 20 4a 53 4f  value to the JSO
1c30: 4e 20 73 74 72 69 6e 67 20 75 6e 64 65 72 20 0a  N string under .
1c40: 2a 2a 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  ** construction.
1c50: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1c60: 6a 73 6f 6e 41 70 70 65 6e 64 56 61 6c 75 65 28  jsonAppendValue(
1c70: 0a 20 20 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70  .  JsonString *p
1c80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1c90: 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20 74    /* Append to t
1ca0: 68 69 73 20 4a 53 4f 4e 20 73 74 72 69 6e 67 20  his JSON string 
1cb0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
1cc0: 75 65 20 2a 70 56 61 6c 75 65 2c 20 20 20 20 20  ue *pValue,     
1cd0: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
1ce0: 61 70 70 65 6e 64 20 2a 2f 0a 20 20 75 38 20 74  append */.  u8 t
1cf0: 65 78 74 49 73 4a 73 6f 6e 20 20 20 20 20 20 20  extIsJson       
1d00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1d10: 79 20 74 6f 20 74 72 65 61 74 20 74 65 78 74 20  y to treat text 
1d20: 76 61 6c 75 65 73 20 61 73 20 4a 53 4f 4e 20 2a  values as JSON *
1d30: 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73  /.){.  switch( s
1d40: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
1d50: 65 28 70 56 61 6c 75 65 29 20 29 7b 0a 20 20 20  e(pValue) ){.   
1d60: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c   case SQLITE_NUL
1d70: 4c 3a 20 7b 0a 20 20 20 20 20 20 6a 73 6f 6e 41  L: {.      jsonA
1d80: 70 70 65 6e 64 52 61 77 28 70 2c 20 22 6e 75 6c  ppendRaw(p, "nul
1d90: 6c 22 2c 20 34 29 3b 0a 20 20 20 20 20 20 62 72  l", 4);.      br
1da0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1db0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  ase SQLITE_INTEG
1dc0: 45 52 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ER:.    case SQL
1dd0: 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20  ITE_FLOAT: {.   
1de0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1df0: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
1e00: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
1e10: 78 74 28 70 56 61 6c 75 65 29 3b 0a 20 20 20 20  xt(pValue);.    
1e20: 20 20 75 33 32 20 6e 20 3d 20 28 75 33 32 29 73    u32 n = (u32)s
1e30: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
1e40: 65 73 28 70 56 61 6c 75 65 29 3b 0a 20 20 20 20  es(pValue);.    
1e50: 20 20 6a 73 6f 6e 41 70 70 65 6e 64 52 61 77 28    jsonAppendRaw(
1e60: 70 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20  p, z, n);.      
1e70: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1e80: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58   case SQLITE_TEX
1e90: 54 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  T: {.      const
1ea0: 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e 73   char *z = (cons
1eb0: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
1ec0: 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 75  value_text(pValu
1ed0: 65 29 3b 0a 20 20 20 20 20 20 75 33 32 20 6e 20  e);.      u32 n 
1ee0: 3d 20 28 75 33 32 29 73 71 6c 69 74 65 33 5f 76  = (u32)sqlite3_v
1ef0: 61 6c 75 65 5f 62 79 74 65 73 28 70 56 61 6c 75  alue_bytes(pValu
1f00: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65  e);.      if( te
1f10: 78 74 49 73 4a 73 6f 6e 20 29 7b 0a 20 20 20 20  xtIsJson ){.    
1f20: 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 52 61      jsonAppendRa
1f30: 77 28 70 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20  w(p, z, n);.    
1f40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1f50: 20 6a 73 6f 6e 41 70 70 65 6e 64 53 74 72 69 6e   jsonAppendStrin
1f60: 67 28 70 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20  g(p, z, n);.    
1f70: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
1f80: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
1f90: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  lt: {.      if( 
1fa0: 70 2d 3e 62 45 72 72 3d 3d 30 20 29 7b 0a 20 20  p->bErr==0 ){.  
1fb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
1fc0: 73 75 6c 74 5f 65 72 72 6f 72 28 70 2d 3e 70 43  sult_error(p->pC
1fd0: 74 78 2c 20 22 4a 53 4f 4e 20 63 61 6e 6e 6f 74  tx, "JSON cannot
1fe0: 20 68 6f 6c 64 20 42 4c 4f 42 20 76 61 6c 75 65   hold BLOB value
1ff0: 73 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20  s", -1);.       
2000: 20 70 2d 3e 62 45 72 72 20 3d 20 31 3b 0a 20 20   p->bErr = 1;.  
2010: 20 20 20 20 20 20 6a 73 6f 6e 52 65 73 65 74 28        jsonReset(
2020: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
2030: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
2040: 20 7d 0a 7d 0a 0a 0a 2f 2a 20 4d 61 6b 65 20 74   }.}.../* Make t
2050: 68 65 20 4a 53 4f 4e 20 69 6e 20 70 20 74 68 65  he JSON in p the
2060: 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 53   result of the S
2070: 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  QL function..*/.
2080: 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e  static void json
2090: 52 65 73 75 6c 74 28 4a 73 6f 6e 53 74 72 69 6e  Result(JsonStrin
20a0: 67 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  g *p){.  if( p->
20b0: 62 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73  bErr==0 ){.    s
20c0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
20d0: 78 74 36 34 28 70 2d 3e 70 43 74 78 2c 20 70 2d  xt64(p->pCtx, p-
20e0: 3e 7a 42 75 66 2c 20 70 2d 3e 6e 55 73 65 64 2c  >zBuf, p->nUsed,
20f0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
2100: 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 62              p->b
2110: 53 74 61 74 69 63 20 3f 20 53 51 4c 49 54 45 5f  Static ? SQLITE_
2120: 54 52 41 4e 53 49 45 4e 54 20 3a 20 73 71 6c 69  TRANSIENT : sqli
2130: 74 65 33 5f 66 72 65 65 2c 0a 20 20 20 20 20 20  te3_free,.      
2140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2150: 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 29      SQLITE_UTF8)
2160: 3b 0a 20 20 20 20 6a 73 6f 6e 5a 65 72 6f 28 70  ;.    jsonZero(p
2170: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
2180: 20 70 2d 3e 62 53 74 61 74 69 63 20 29 3b 0a 7d   p->bStatic );.}
2190: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
21a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
21e0: 20 55 74 69 6c 69 74 79 20 72 6f 75 74 69 6e 65   Utility routine
21f0: 73 20 66 6f 72 20 64 65 61 6c 69 6e 67 20 77 69  s for dealing wi
2200: 74 68 20 4a 73 6f 6e 4e 6f 64 65 20 61 6e 64 20  th JsonNode and 
2210: 4a 73 6f 6e 50 61 72 73 65 20 6f 62 6a 65 63 74  JsonParse object
2220: 73 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s.**************
2230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2250: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2260: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
2270: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2280: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73 65 63  number of consec
2290: 75 74 69 76 65 20 4a 73 6f 6e 4e 6f 64 65 20 73  utive JsonNode s
22a0: 6c 6f 74 73 20 6e 65 65 64 20 74 6f 20 72 65 70  lots need to rep
22b0: 72 65 73 65 6e 74 0a 2a 2a 20 74 68 65 20 70 61  resent.** the pa
22c0: 72 73 65 64 20 4a 53 4f 4e 20 61 74 20 70 4e 6f  rsed JSON at pNo
22d0: 64 65 2e 20 20 54 68 65 20 6d 69 6e 69 6d 75 6d  de.  The minimum
22e0: 20 61 6e 73 77 65 72 20 69 73 20 31 2e 20 20 46   answer is 1.  F
22f0: 6f 72 20 41 52 52 41 59 20 61 6e 64 0a 2a 2a 20  or ARRAY and.** 
2300: 4f 42 4a 45 43 54 20 74 79 70 65 73 2c 20 74 68  OBJECT types, th
2310: 65 20 6e 75 6d 62 65 72 20 6d 69 67 68 74 20 62  e number might b
2320: 65 20 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20  e larger..**.** 
2330: 41 70 70 65 6e 64 65 64 20 65 6c 65 6d 65 6e 74  Appended element
2340: 73 20 61 72 65 20 6e 6f 74 20 63 6f 75 6e 74 65  s are not counte
2350: 64 2e 20 20 54 68 65 20 76 61 6c 75 65 20 72 65  d.  The value re
2360: 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 6e 75  turned is the nu
2370: 6d 62 65 72 0a 2a 2a 20 62 79 20 77 68 69 63 68  mber.** by which
2380: 20 74 68 65 20 4a 73 6f 6e 4e 6f 64 65 20 63 6f   the JsonNode co
2390: 75 6e 74 65 72 20 73 68 6f 75 6c 64 20 69 6e 63  unter should inc
23a0: 72 65 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72 20  rement in order 
23b0: 74 6f 20 67 6f 20 74 6f 20 74 68 65 0a 2a 2a 20  to go to the.** 
23c0: 6e 65 78 74 20 70 65 65 72 20 76 61 6c 75 65 2e  next peer value.
23d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 6a  .*/.static u32 j
23e0: 73 6f 6e 4e 6f 64 65 53 69 7a 65 28 4a 73 6f 6e  sonNodeSize(Json
23f0: 4e 6f 64 65 20 2a 70 4e 6f 64 65 29 7b 0a 20 20  Node *pNode){.  
2400: 72 65 74 75 72 6e 20 70 4e 6f 64 65 2d 3e 65 54  return pNode->eT
2410: 79 70 65 3e 3d 4a 53 4f 4e 5f 41 52 52 41 59 20  ype>=JSON_ARRAY 
2420: 3f 20 70 4e 6f 64 65 2d 3e 6e 2b 31 20 3a 20 31  ? pNode->n+1 : 1
2430: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61  ;.}../*.** Recla
2440: 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6c  im all memory al
2450: 6c 6f 63 61 74 65 64 20 62 79 20 61 20 4a 73 6f  located by a Jso
2460: 6e 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 20 20  nParse object.  
2470: 42 75 74 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65  But do not.** de
2480: 6c 65 74 65 20 74 68 65 20 4a 73 6f 6e 50 61 72  lete the JsonPar
2490: 73 65 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66  se object itself
24a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
24b0: 20 6a 73 6f 6e 50 61 72 73 65 52 65 73 65 74 28   jsonParseReset(
24c0: 4a 73 6f 6e 50 61 72 73 65 20 2a 70 50 61 72 73  JsonParse *pPars
24d0: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  e){.  sqlite3_fr
24e0: 65 65 28 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65  ee(pParse->aNode
24f0: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 61 4e 6f  );.  pParse->aNo
2500: 64 65 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  de = 0;.  pParse
2510: 2d 3e 6e 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 70  ->nNode = 0;.  p
2520: 50 61 72 73 65 2d 3e 6e 41 6c 6c 6f 63 20 3d 20  Parse->nAlloc = 
2530: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  0;.  sqlite3_fre
2540: 65 28 70 50 61 72 73 65 2d 3e 61 55 70 29 3b 0a  e(pParse->aUp);.
2550: 20 20 70 50 61 72 73 65 2d 3e 61 55 70 20 3d 20    pParse->aUp = 
2560: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  0;.}../*.** Conv
2570: 65 72 74 20 74 68 65 20 4a 73 6f 6e 4e 6f 64 65  ert the JsonNode
2580: 20 70 4e 6f 64 65 20 69 6e 74 6f 20 61 20 70 75   pNode into a pu
2590: 72 65 20 4a 53 4f 4e 20 73 74 72 69 6e 67 20 61  re JSON string a
25a0: 6e 64 0a 2a 2a 20 61 70 70 65 6e 64 20 74 6f 20  nd.** append to 
25b0: 70 4f 75 74 2e 20 20 53 75 62 73 75 62 73 74 72  pOut.  Subsubstr
25c0: 75 63 74 75 72 65 20 69 73 20 61 6c 73 6f 20 69  ucture is also i
25d0: 6e 63 6c 75 64 65 64 2e 20 20 52 65 74 75 72 6e  ncluded.  Return
25e0: 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
25f0: 66 20 4a 73 6f 6e 4e 6f 64 65 20 6f 62 6a 65 63  f JsonNode objec
2600: 74 73 20 74 68 61 74 20 61 72 65 20 65 6e 63 6f  ts that are enco
2610: 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ded..*/.static v
2620: 6f 69 64 20 6a 73 6f 6e 52 65 6e 64 65 72 4e 6f  oid jsonRenderNo
2630: 64 65 28 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a  de(.  JsonNode *
2640: 70 4e 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20  pNode,          
2650: 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 6f 64 65       /* The node
2660: 20 74 6f 20 72 65 6e 64 65 72 20 2a 2f 0a 20 20   to render */.  
2670: 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70 4f 75 74  JsonString *pOut
2680: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2690: 2a 20 57 72 69 74 65 20 4a 53 4f 4e 20 68 65 72  * Write JSON her
26a0: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  e */.  sqlite3_v
26b0: 61 6c 75 65 20 2a 2a 61 52 65 70 6c 61 63 65 20  alue **aReplace 
26c0: 20 20 20 20 20 20 2f 2a 20 52 65 70 6c 61 63 65        /* Replace
26d0: 6d 65 6e 74 20 76 61 6c 75 65 73 20 2a 2f 0a 29  ment values */.)
26e0: 7b 0a 20 20 73 77 69 74 63 68 28 20 70 4e 6f 64  {.  switch( pNod
26f0: 65 2d 3e 65 54 79 70 65 20 29 7b 0a 20 20 20 20  e->eType ){.    
2700: 63 61 73 65 20 4a 53 4f 4e 5f 4e 55 4c 4c 3a 20  case JSON_NULL: 
2710: 7b 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65  {.      jsonAppe
2720: 6e 64 52 61 77 28 70 4f 75 74 2c 20 22 6e 75 6c  ndRaw(pOut, "nul
2730: 6c 22 2c 20 34 29 3b 0a 20 20 20 20 20 20 62 72  l", 4);.      br
2740: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
2750: 61 73 65 20 4a 53 4f 4e 5f 54 52 55 45 3a 20 7b  ase JSON_TRUE: {
2760: 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e  .      jsonAppen
2770: 64 52 61 77 28 70 4f 75 74 2c 20 22 74 72 75 65  dRaw(pOut, "true
2780: 22 2c 20 34 29 3b 0a 20 20 20 20 20 20 62 72 65  ", 4);.      bre
2790: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
27a0: 73 65 20 4a 53 4f 4e 5f 46 41 4c 53 45 3a 20 7b  se JSON_FALSE: {
27b0: 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e  .      jsonAppen
27c0: 64 52 61 77 28 70 4f 75 74 2c 20 22 66 61 6c 73  dRaw(pOut, "fals
27d0: 65 22 2c 20 35 29 3b 0a 20 20 20 20 20 20 62 72  e", 5);.      br
27e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
27f0: 61 73 65 20 4a 53 4f 4e 5f 53 54 52 49 4e 47 3a  ase JSON_STRING:
2800: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 6f   {.      if( pNo
2810: 64 65 2d 3e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e  de->jnFlags & JN
2820: 4f 44 45 5f 52 41 57 20 29 7b 0a 20 20 20 20 20  ODE_RAW ){.     
2830: 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 53 74 72     jsonAppendStr
2840: 69 6e 67 28 70 4f 75 74 2c 20 70 4e 6f 64 65 2d  ing(pOut, pNode-
2850: 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 2c 20 70 4e  >u.zJContent, pN
2860: 6f 64 65 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20  ode->n);.       
2870: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
2880: 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
2890: 72 6f 75 67 68 20 69 6e 74 6f 20 74 68 65 20 6e  rough into the n
28a0: 65 78 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  ext case */.    
28b0: 7d 0a 20 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f  }.    case JSON_
28c0: 52 45 41 4c 3a 0a 20 20 20 20 63 61 73 65 20 4a  REAL:.    case J
28d0: 53 4f 4e 5f 49 4e 54 3a 20 7b 0a 20 20 20 20 20  SON_INT: {.     
28e0: 20 6a 73 6f 6e 41 70 70 65 6e 64 52 61 77 28 70   jsonAppendRaw(p
28f0: 4f 75 74 2c 20 70 4e 6f 64 65 2d 3e 75 2e 7a 4a  Out, pNode->u.zJ
2900: 43 6f 6e 74 65 6e 74 2c 20 70 4e 6f 64 65 2d 3e  Content, pNode->
2910: 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
2920: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
2930: 4a 53 4f 4e 5f 41 52 52 41 59 3a 20 7b 0a 20 20  JSON_ARRAY: {.  
2940: 20 20 20 20 75 33 32 20 6a 20 3d 20 31 3b 0a 20      u32 j = 1;. 
2950: 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 43       jsonAppendC
2960: 68 61 72 28 70 4f 75 74 2c 20 27 5b 27 29 3b 0a  har(pOut, '[');.
2970: 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20        for(;;){. 
2980: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3c         while( j<
2990: 3d 70 4e 6f 64 65 2d 3e 6e 20 29 7b 0a 20 20 20  =pNode->n ){.   
29a0: 20 20 20 20 20 20 20 69 66 28 20 70 4e 6f 64 65         if( pNode
29b0: 5b 6a 5d 2e 6a 6e 46 6c 61 67 73 20 26 20 28 4a  [j].jnFlags & (J
29c0: 4e 4f 44 45 5f 52 45 4d 4f 56 45 7c 4a 4e 4f 44  NODE_REMOVE|JNOD
29d0: 45 5f 52 45 50 4c 41 43 45 29 20 29 7b 0a 20 20  E_REPLACE) ){.  
29e0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e            if( pN
29f0: 6f 64 65 5b 6a 5d 2e 6a 6e 46 6c 61 67 73 20 26  ode[j].jnFlags &
2a00: 20 4a 4e 4f 44 45 5f 52 45 50 4c 41 43 45 20 29   JNODE_REPLACE )
2a10: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2a20: 6a 73 6f 6e 41 70 70 65 6e 64 53 65 70 61 72 61  jsonAppendSepara
2a30: 74 6f 72 28 70 4f 75 74 29 3b 0a 20 20 20 20 20  tor(pOut);.     
2a40: 20 20 20 20 20 20 20 20 20 6a 73 6f 6e 41 70 70           jsonApp
2a50: 65 6e 64 56 61 6c 75 65 28 70 4f 75 74 2c 20 61  endValue(pOut, a
2a60: 52 65 70 6c 61 63 65 5b 70 4e 6f 64 65 5b 6a 5d  Replace[pNode[j]
2a70: 2e 69 56 61 6c 5d 2c 0a 20 20 20 20 20 20 20 20  .iVal],.        
2a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a90: 20 20 20 20 20 20 28 70 4e 6f 64 65 5b 6a 5d 2e        (pNode[j].
2aa0: 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f  jnFlags & JNODE_
2ab0: 4a 53 4f 4e 29 21 3d 30 29 3b 0a 20 20 20 20 20  JSON)!=0);.     
2ac0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ad0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2ae0: 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64        jsonAppend
2af0: 53 65 70 61 72 61 74 6f 72 28 70 4f 75 74 29 3b  Separator(pOut);
2b00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 73 6f  .            jso
2b10: 6e 52 65 6e 64 65 72 4e 6f 64 65 28 26 70 4e 6f  nRenderNode(&pNo
2b20: 64 65 5b 6a 5d 2c 20 70 4f 75 74 2c 20 61 52 65  de[j], pOut, aRe
2b30: 70 6c 61 63 65 29 3b 0a 20 20 20 20 20 20 20 20  place);.        
2b40: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6a 20    }.          j 
2b50: 2b 3d 20 6a 73 6f 6e 4e 6f 64 65 53 69 7a 65 28  += jsonNodeSize(
2b60: 26 70 4e 6f 64 65 5b 6a 5d 29 3b 0a 20 20 20 20  &pNode[j]);.    
2b70: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
2b80: 28 20 28 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67  ( (pNode->jnFlag
2b90: 73 20 26 20 4a 4e 4f 44 45 5f 41 50 50 45 4e 44  s & JNODE_APPEND
2ba0: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
2bb0: 20 20 20 20 20 20 70 4e 6f 64 65 20 3d 20 26 70        pNode = &p
2bc0: 4e 6f 64 65 5b 70 4e 6f 64 65 2d 3e 75 2e 69 41  Node[pNode->u.iA
2bd0: 70 70 65 6e 64 5d 3b 0a 20 20 20 20 20 20 20 20  ppend];.        
2be0: 6a 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  j = 1;.      }. 
2bf0: 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 43       jsonAppendC
2c00: 68 61 72 28 70 4f 75 74 2c 20 27 5d 27 29 3b 0a  har(pOut, ']');.
2c10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2c20: 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 53 4f 4e   }.    case JSON
2c30: 5f 4f 42 4a 45 43 54 3a 20 7b 0a 20 20 20 20 20  _OBJECT: {.     
2c40: 20 75 33 32 20 6a 20 3d 20 31 3b 0a 20 20 20 20   u32 j = 1;.    
2c50: 20 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61 72    jsonAppendChar
2c60: 28 70 4f 75 74 2c 20 27 7b 27 29 3b 0a 20 20 20  (pOut, '{');.   
2c70: 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20     for(;;){.    
2c80: 20 20 20 20 77 68 69 6c 65 28 20 6a 3c 3d 70 4e      while( j<=pN
2c90: 6f 64 65 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20  ode->n ){.      
2ca0: 20 20 20 20 69 66 28 20 28 70 4e 6f 64 65 5b 6a      if( (pNode[j
2cb0: 2b 31 5d 2e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e  +1].jnFlags & JN
2cc0: 4f 44 45 5f 52 45 4d 4f 56 45 29 3d 3d 30 20 29  ODE_REMOVE)==0 )
2cd0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 73  {.            js
2ce0: 6f 6e 41 70 70 65 6e 64 53 65 70 61 72 61 74 6f  onAppendSeparato
2cf0: 72 28 70 4f 75 74 29 3b 0a 20 20 20 20 20 20 20  r(pOut);.       
2d00: 20 20 20 20 20 6a 73 6f 6e 52 65 6e 64 65 72 4e       jsonRenderN
2d10: 6f 64 65 28 26 70 4e 6f 64 65 5b 6a 5d 2c 20 70  ode(&pNode[j], p
2d20: 4f 75 74 2c 20 61 52 65 70 6c 61 63 65 29 3b 0a  Out, aReplace);.
2d30: 20 20 20 20 20 20 20 20 20 20 20 20 6a 73 6f 6e              json
2d40: 41 70 70 65 6e 64 43 68 61 72 28 70 4f 75 74 2c  AppendChar(pOut,
2d50: 20 27 3a 27 29 3b 0a 20 20 20 20 20 20 20 20 20   ':');.         
2d60: 20 20 20 69 66 28 20 70 4e 6f 64 65 5b 6a 2b 31     if( pNode[j+1
2d70: 5d 2e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44  ].jnFlags & JNOD
2d80: 45 5f 52 45 50 4c 41 43 45 20 29 7b 0a 20 20 20  E_REPLACE ){.   
2d90: 20 20 20 20 20 20 20 20 20 20 20 6a 73 6f 6e 41             jsonA
2da0: 70 70 65 6e 64 56 61 6c 75 65 28 70 4f 75 74 2c  ppendValue(pOut,
2db0: 20 61 52 65 70 6c 61 63 65 5b 70 4e 6f 64 65 5b   aReplace[pNode[
2dc0: 6a 2b 31 5d 2e 69 56 61 6c 5d 2c 0a 20 20 20 20  j+1].iVal],.    
2dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de0: 20 20 20 20 20 20 20 20 20 20 28 70 4e 6f 64 65            (pNode
2df0: 5b 6a 2b 31 5d 2e 6a 6e 46 6c 61 67 73 20 26 20  [j+1].jnFlags & 
2e00: 4a 4e 4f 44 45 5f 4a 53 4f 4e 29 21 3d 30 29 3b  JNODE_JSON)!=0);
2e10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
2e20: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2e30: 20 20 6a 73 6f 6e 52 65 6e 64 65 72 4e 6f 64 65    jsonRenderNode
2e40: 28 26 70 4e 6f 64 65 5b 6a 2b 31 5d 2c 20 70 4f  (&pNode[j+1], pO
2e50: 75 74 2c 20 61 52 65 70 6c 61 63 65 29 3b 0a 20  ut, aReplace);. 
2e60: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2e70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e80: 20 20 20 6a 20 2b 3d 20 31 20 2b 20 6a 73 6f 6e     j += 1 + json
2e90: 4e 6f 64 65 53 69 7a 65 28 26 70 4e 6f 64 65 5b  NodeSize(&pNode[
2ea0: 6a 2b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  j+1]);.        }
2eb0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4e  .        if( (pN
2ec0: 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73 20 26 20 4a  ode->jnFlags & J
2ed0: 4e 4f 44 45 5f 41 50 50 45 4e 44 29 3d 3d 30 20  NODE_APPEND)==0 
2ee0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
2ef0: 20 70 4e 6f 64 65 20 3d 20 26 70 4e 6f 64 65 5b   pNode = &pNode[
2f00: 70 4e 6f 64 65 2d 3e 75 2e 69 41 70 70 65 6e 64  pNode->u.iAppend
2f10: 5d 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 31  ];.        j = 1
2f20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2f30: 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61 72 28 70  jsonAppendChar(p
2f40: 4f 75 74 2c 20 27 7d 27 29 3b 0a 20 20 20 20 20  Out, '}');.     
2f50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2f60: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
2f70: 6e 20 61 20 4a 73 6f 6e 4e 6f 64 65 20 61 6e 64  n a JsonNode and
2f80: 20 61 6c 6c 20 69 74 73 20 64 65 73 63 65 6e 64   all its descend
2f90: 65 6e 74 73 20 61 73 20 61 20 4a 53 4f 4e 20 73  ents as a JSON s
2fa0: 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  tring..*/.static
2fb0: 20 76 6f 69 64 20 6a 73 6f 6e 52 65 74 75 72 6e   void jsonReturn
2fc0: 4a 73 6f 6e 28 0a 20 20 4a 73 6f 6e 4e 6f 64 65  Json(.  JsonNode
2fd0: 20 2a 70 4e 6f 64 65 2c 20 20 20 20 20 20 20 20   *pNode,        
2fe0: 20 20 20 20 2f 2a 20 4e 6f 64 65 20 74 6f 20 72      /* Node to r
2ff0: 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  eturn */.  sqlit
3000: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
3010: 2c 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ,      /* Return
3020: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20   value for this 
3030: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 71  function */.  sq
3040: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 52  lite3_value **aR
3050: 65 70 6c 61 63 65 20 20 20 20 2f 2a 20 41 72 72  eplace    /* Arr
3060: 61 79 20 6f 66 20 72 65 70 6c 61 63 65 6d 65 6e  ay of replacemen
3070: 74 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20  t values */.){. 
3080: 20 4a 73 6f 6e 53 74 72 69 6e 67 20 73 3b 0a 20   JsonString s;. 
3090: 20 6a 73 6f 6e 49 6e 69 74 28 26 73 2c 20 70 43   jsonInit(&s, pC
30a0: 74 78 29 3b 0a 20 20 6a 73 6f 6e 52 65 6e 64 65  tx);.  jsonRende
30b0: 72 4e 6f 64 65 28 70 4e 6f 64 65 2c 20 26 73 2c  rNode(pNode, &s,
30c0: 20 61 52 65 70 6c 61 63 65 29 3b 0a 20 20 6a 73   aReplace);.  js
30d0: 6f 6e 52 65 73 75 6c 74 28 26 73 29 3b 0a 7d 0a  onResult(&s);.}.
30e0: 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 74 68 65 20  ./*.** Make the 
30f0: 4a 73 6f 6e 4e 6f 64 65 20 74 68 65 20 72 65 74  JsonNode the ret
3100: 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 65  urn value of the
3110: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
3120: 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 52 65  atic void jsonRe
3130: 74 75 72 6e 28 0a 20 20 4a 73 6f 6e 4e 6f 64 65  turn(.  JsonNode
3140: 20 2a 70 4e 6f 64 65 2c 20 20 20 20 20 20 20 20   *pNode,        
3150: 20 20 20 20 2f 2a 20 4e 6f 64 65 20 74 6f 20 72      /* Node to r
3160: 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  eturn */.  sqlit
3170: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
3180: 2c 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ,      /* Return
3190: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20   value for this 
31a0: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 71  function */.  sq
31b0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 52  lite3_value **aR
31c0: 65 70 6c 61 63 65 20 20 20 20 2f 2a 20 41 72 72  eplace    /* Arr
31d0: 61 79 20 6f 66 20 72 65 70 6c 61 63 65 6d 65 6e  ay of replacemen
31e0: 74 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20  t values */.){. 
31f0: 20 73 77 69 74 63 68 28 20 70 4e 6f 64 65 2d 3e   switch( pNode->
3200: 65 54 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  eType ){.    cas
3210: 65 20 4a 53 4f 4e 5f 4e 55 4c 4c 3a 20 7b 0a 20  e JSON_NULL: {. 
3220: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
3230: 75 6c 74 5f 6e 75 6c 6c 28 70 43 74 78 29 3b 0a  ult_null(pCtx);.
3240: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3250: 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 53 4f 4e   }.    case JSON
3260: 5f 54 52 55 45 3a 20 7b 0a 20 20 20 20 20 20 73  _TRUE: {.      s
3270: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
3280: 74 28 70 43 74 78 2c 20 31 29 3b 0a 20 20 20 20  t(pCtx, 1);.    
3290: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
32a0: 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f 46 41 4c     case JSON_FAL
32b0: 53 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  SE: {.      sqli
32c0: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 70  te3_result_int(p
32d0: 43 74 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  Ctx, 0);.      b
32e0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
32f0: 63 61 73 65 20 4a 53 4f 4e 5f 52 45 41 4c 3a 20  case JSON_REAL: 
3300: 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72  {.      double r
3310: 20 3d 20 73 74 72 74 6f 64 28 70 4e 6f 64 65 2d   = strtod(pNode-
3320: 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 2c 20 30 29  >u.zJContent, 0)
3330: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
3340: 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 70 43  result_double(pC
3350: 74 78 2c 20 72 29 3b 0a 20 20 20 20 20 20 62 72  tx, r);.      br
3360: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
3370: 61 73 65 20 4a 53 4f 4e 5f 49 4e 54 3a 20 7b 0a  ase JSON_INT: {.
3380: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
3390: 74 36 34 20 69 20 3d 20 30 3b 0a 20 20 20 20 20  t64 i = 0;.     
33a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
33b0: 20 70 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74   pNode->u.zJCont
33c0: 65 6e 74 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  ent;.      if( z
33d0: 5b 30 5d 3d 3d 27 2d 27 20 29 7b 20 7a 2b 2b 3b  [0]=='-' ){ z++;
33e0: 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20   }.      while( 
33f0: 7a 5b 30 5d 3e 3d 27 30 27 20 26 26 20 7a 5b 30  z[0]>='0' && z[0
3400: 5d 3c 3d 27 39 27 20 29 7b 20 69 20 3d 20 69 2a  ]<='9' ){ i = i*
3410: 31 30 20 2b 20 2a 28 7a 2b 2b 29 20 2d 20 27 30  10 + *(z++) - '0
3420: 27 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70  '; }.      if( p
3430: 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e  Node->u.zJConten
3440: 74 5b 30 5d 3d 3d 27 2d 27 20 29 7b 20 69 20 3d  t[0]=='-' ){ i =
3450: 20 2d 69 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c   -i; }.      sql
3460: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
3470: 34 28 70 43 74 78 2c 20 69 29 3b 0a 20 20 20 20  4(pCtx, i);.    
3480: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3490: 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f 53 54 52     case JSON_STR
34a0: 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ING: {.      if(
34b0: 20 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73 20   pNode->jnFlags 
34c0: 26 20 4a 4e 4f 44 45 5f 52 41 57 20 29 7b 0a 20  & JNODE_RAW ){. 
34d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
34e0: 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c  esult_text(pCtx,
34f0: 20 70 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74   pNode->u.zJCont
3500: 65 6e 74 2c 20 70 4e 6f 64 65 2d 3e 6e 2c 0a 20  ent, pNode->n,. 
3510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3520: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
3530: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
3540: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
3550: 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73 20 26 20  Node->jnFlags & 
3560: 4a 4e 4f 44 45 5f 45 53 43 41 50 45 29 3d 3d 30  JNODE_ESCAPE)==0
3570: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4a   ){.        /* J
3580: 53 4f 4e 20 66 6f 72 6d 61 74 74 65 64 20 77 69  SON formatted wi
3590: 74 68 6f 75 74 20 61 6e 79 20 62 61 63 6b 73 6c  thout any backsl
35a0: 61 73 68 2d 65 73 63 61 70 65 73 20 2a 2f 0a 20  ash-escapes */. 
35b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
35c0: 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c  esult_text(pCtx,
35d0: 20 70 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74   pNode->u.zJCont
35e0: 65 6e 74 2b 31 2c 20 70 4e 6f 64 65 2d 3e 6e 2d  ent+1, pNode->n-
35f0: 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2,.             
3600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
3610: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
3620: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
3630: 20 20 20 20 20 20 20 2f 2a 20 54 72 61 6e 73 6c         /* Transl
3640: 61 74 65 20 4a 53 4f 4e 20 66 6f 72 6d 61 74 74  ate JSON formatt
3650: 65 64 20 73 74 72 69 6e 67 20 69 6e 74 6f 20 72  ed string into r
3660: 61 77 20 74 65 78 74 20 2a 2f 0a 20 20 20 20 20  aw text */.     
3670: 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20     u32 i;.      
3680: 20 20 75 33 32 20 6e 20 3d 20 70 4e 6f 64 65 2d    u32 n = pNode-
3690: 3e 6e 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  >n;.        cons
36a0: 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 4e 6f 64  t char *z = pNod
36b0: 65 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 3b 0a  e->u.zJContent;.
36c0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4f          char *zO
36d0: 75 74 3b 0a 20 20 20 20 20 20 20 20 75 33 32 20  ut;.        u32 
36e0: 6a 3b 0a 20 20 20 20 20 20 20 20 7a 4f 75 74 20  j;.        zOut 
36f0: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
3700: 28 20 6e 2b 31 20 29 3b 0a 20 20 20 20 20 20 20  ( n+1 );.       
3710: 20 69 66 28 20 7a 4f 75 74 3d 3d 30 20 29 7b 0a   if( zOut==0 ){.
3720: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
3730: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e  3_result_error_n
3740: 6f 6d 65 6d 28 70 43 74 78 29 3b 0a 20 20 20 20  omem(pCtx);.    
3750: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3760: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
3770: 6f 72 28 69 3d 31 2c 20 6a 3d 30 3b 20 69 3c 6e  or(i=1, j=0; i<n
3780: 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  -1; i++){.      
3790: 20 20 20 20 63 68 61 72 20 63 20 3d 20 7a 5b 69      char c = z[i
37a0: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
37b0: 20 63 21 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20   c!='\\' ){.    
37c0: 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b          zOut[j++
37d0: 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20  ] = c;.         
37e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
37f0: 20 20 20 20 63 20 3d 20 7a 5b 2b 2b 69 5d 3b 0a      c = z[++i];.
3800: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
3810: 63 3d 3d 27 75 27 20 29 7b 0a 20 20 20 20 20 20  c=='u' ){.      
3820: 20 20 20 20 20 20 20 20 75 33 32 20 76 20 3d 20          u32 v = 
3830: 30 2c 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  0, k;.          
3840: 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 34      for(k=0; k<4
3850: 20 26 26 20 69 3c 6e 2d 32 3b 20 69 2b 2b 2c 20   && i<n-2; i++, 
3860: 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  k++){.          
3870: 20 20 20 20 20 20 63 20 3d 20 7a 5b 69 2b 31 5d        c = z[i+1]
3880: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3890: 20 20 69 66 28 20 63 3e 3d 27 30 27 20 26 26 20    if( c>='0' && 
38a0: 63 3c 3d 27 39 27 20 29 20 76 20 3d 20 76 2a 31  c<='9' ) v = v*1
38b0: 36 20 2b 20 63 20 2d 20 27 30 27 3b 0a 20 20 20  6 + c - '0';.   
38c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73               els
38d0: 65 20 69 66 28 20 63 3e 3d 27 41 27 20 26 26 20  e if( c>='A' && 
38e0: 63 3c 3d 27 46 27 20 29 20 76 20 3d 20 76 2a 31  c<='F' ) v = v*1
38f0: 36 20 2b 20 63 20 2d 20 27 41 27 20 2b 20 31 30  6 + c - 'A' + 10
3900: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3910: 20 20 65 6c 73 65 20 69 66 28 20 63 3e 3d 27 61    else if( c>='a
3920: 27 20 26 26 20 63 3c 3d 27 66 27 20 29 20 76 20  ' && c<='f' ) v 
3930: 3d 20 76 2a 31 36 20 2b 20 63 20 2d 20 27 61 27  = v*16 + c - 'a'
3940: 20 2b 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20   + 10;.         
3950: 20 20 20 20 20 20 20 65 6c 73 65 20 62 72 65 61         else brea
3960: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
3970: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
3980: 20 69 66 28 20 76 3d 3d 30 20 29 20 62 72 65 61   if( v==0 ) brea
3990: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
39a0: 20 69 66 28 20 76 3c 3d 30 78 37 66 20 29 7b 0a   if( v<=0x7f ){.
39b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39c0: 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 76 3b 0a 20  zOut[j++] = v;. 
39d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c               }el
39e0: 73 65 20 69 66 28 20 76 3c 3d 30 78 37 66 66 20  se if( v<=0x7ff 
39f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
3a00: 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 30     zOut[j++] = 0
3a10: 78 63 30 20 7c 20 28 76 3e 3e 36 29 3b 0a 20 20  xc0 | (v>>6);.  
3a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4f                zO
3a30: 75 74 5b 6a 2b 2b 5d 20 3d 20 30 78 38 30 20 7c  ut[j++] = 0x80 |
3a40: 20 28 76 26 30 78 33 66 29 3b 0a 20 20 20 20 20   (v&0x3f);.     
3a50: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
3a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a70: 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 30 78 65 30  zOut[j++] = 0xe0
3a80: 20 7c 20 28 76 3e 3e 31 32 29 3b 0a 20 20 20 20   | (v>>12);.    
3a90: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4f 75 74              zOut
3aa0: 5b 6a 2b 2b 5d 20 3d 20 30 78 38 30 20 7c 20 28  [j++] = 0x80 | (
3ab0: 28 76 3e 3e 36 29 26 30 78 33 66 29 3b 0a 20 20  (v>>6)&0x3f);.  
3ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4f                zO
3ad0: 75 74 5b 6a 2b 2b 5d 20 3d 20 30 78 38 30 20 7c  ut[j++] = 0x80 |
3ae0: 20 28 76 26 30 78 33 66 29 3b 0a 20 20 20 20 20   (v&0x3f);.     
3af0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
3b00: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
3b10: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
3b20: 63 3d 3d 27 62 27 20 29 7b 0a 20 20 20 20 20 20  c=='b' ){.      
3b30: 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c            c = '\
3b40: 62 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  b';.            
3b50: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
3b60: 66 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  f' ){.          
3b70: 20 20 20 20 20 20 63 20 3d 20 27 5c 66 27 3b 0a        c = '\f';.
3b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65                }e
3b90: 6c 73 65 20 69 66 28 20 63 3d 3d 27 6e 27 20 29  lse if( c=='n' )
3ba0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
3bb0: 20 20 63 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20    c = '\n';.    
3bc0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
3bd0: 69 66 28 20 63 3d 3d 27 72 27 20 29 7b 0a 20 20  if( c=='r' ){.  
3be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 20                c 
3bf0: 3d 20 27 5c 72 27 3b 0a 20 20 20 20 20 20 20 20  = '\r';.        
3c00: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
3c10: 63 3d 3d 27 74 27 20 29 7b 0a 20 20 20 20 20 20  c=='t' ){.      
3c20: 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c            c = '\
3c30: 74 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t';.            
3c40: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
3c50: 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 63 3b    zOut[j++] = c;
3c60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
3c70: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
3c80: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 4f 75     }.        zOu
3c90: 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  t[j] = 0;.      
3ca0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
3cb0: 5f 74 65 78 74 28 70 43 74 78 2c 20 7a 4f 75 74  _text(pCtx, zOut
3cc0: 2c 20 6a 2c 20 73 71 6c 69 74 65 33 5f 66 72 65  , j, sqlite3_fre
3cd0: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
3ce0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3cf0: 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f 41 52 52     case JSON_ARR
3d00: 41 59 3a 0a 20 20 20 20 63 61 73 65 20 4a 53 4f  AY:.    case JSO
3d10: 4e 5f 4f 42 4a 45 43 54 3a 20 7b 0a 20 20 20 20  N_OBJECT: {.    
3d20: 20 20 6a 73 6f 6e 52 65 74 75 72 6e 4a 73 6f 6e    jsonReturnJson
3d30: 28 70 4e 6f 64 65 2c 20 70 43 74 78 2c 20 61 52  (pNode, pCtx, aR
3d40: 65 70 6c 61 63 65 29 3b 0a 20 20 20 20 20 20 62  eplace);.      b
3d50: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
3d60: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
3d70: 61 20 6e 65 77 20 4a 73 6f 6e 4e 6f 64 65 20 69  a new JsonNode i
3d80: 6e 73 74 61 6e 63 65 20 62 61 73 65 64 20 6f 6e  nstance based on
3d90: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 61   the arguments a
3da0: 6e 64 20 61 70 70 65 6e 64 20 74 68 61 74 0a 2a  nd append that.*
3db0: 2a 20 69 6e 73 74 61 6e 63 65 20 74 6f 20 74 68  * instance to th
3dc0: 65 20 4a 73 6f 6e 50 61 72 73 65 2e 20 20 52 65  e JsonParse.  Re
3dd0: 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69  turn the index i
3de0: 6e 20 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65 5b  n pParse->aNode[
3df0: 5d 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20  ] of the.** new 
3e00: 6e 6f 64 65 2c 20 6f 72 20 2d 31 20 69 66 20 61  node, or -1 if a
3e10: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
3e20: 6f 6e 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  on fails..*/.sta
3e30: 74 69 63 20 69 6e 74 20 6a 73 6f 6e 50 61 72 73  tic int jsonPars
3e40: 65 41 64 64 4e 6f 64 65 28 0a 20 20 4a 73 6f 6e  eAddNode(.  Json
3e50: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
3e60: 20 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20        /* Append 
3e70: 74 68 65 20 6e 6f 64 65 20 74 6f 20 74 68 69 73  the node to this
3e80: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 33 32   object */.  u32
3e90: 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20   eType,         
3ea0: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 64 65 20 74         /* Node t
3eb0: 79 70 65 20 2a 2f 0a 20 20 75 33 32 20 6e 2c 20  ype */.  u32 n, 
3ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ed0: 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 73 69     /* Content si
3ee0: 7a 65 20 6f 72 20 73 75 62 2d 6e 6f 64 65 20 63  ze or sub-node c
3ef0: 6f 75 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ount */.  const 
3f00: 63 68 61 72 20 2a 7a 43 6f 6e 74 65 6e 74 20 20  char *zContent  
3f10: 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 2a      /* Content *
3f20: 2f 0a 29 7b 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20  /.){.  JsonNode 
3f30: 2a 70 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  *p;.  if( pParse
3f40: 2d 3e 6e 4e 6f 64 65 3e 3d 70 50 61 72 73 65 2d  ->nNode>=pParse-
3f50: 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 75  >nAlloc ){.    u
3f60: 33 32 20 6e 4e 65 77 3b 0a 20 20 20 20 4a 73 6f  32 nNew;.    Jso
3f70: 6e 4e 6f 64 65 20 2a 70 4e 65 77 3b 0a 20 20 20  nNode *pNew;.   
3f80: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6f 6f 6d   if( pParse->oom
3f90: 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
3fa0: 20 20 6e 4e 65 77 20 3d 20 70 50 61 72 73 65 2d    nNew = pParse-
3fb0: 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 31 30 3b 0a  >nAlloc*2 + 10;.
3fc0: 20 20 20 20 69 66 28 20 6e 4e 65 77 3c 3d 70 50      if( nNew<=pP
3fd0: 61 72 73 65 2d 3e 6e 4e 6f 64 65 20 29 7b 0a 20  arse->nNode ){. 
3fe0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6f 6f 6d       pParse->oom
3ff0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75   = 1;.      retu
4000: 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20  rn -1;.    }.   
4010: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f   pNew = sqlite3_
4020: 72 65 61 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e  realloc(pParse->
4030: 61 4e 6f 64 65 2c 20 73 69 7a 65 6f 66 28 4a 73  aNode, sizeof(Js
4040: 6f 6e 4e 6f 64 65 29 2a 6e 4e 65 77 29 3b 0a 20  onNode)*nNew);. 
4050: 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
4060: 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
4070: 6f 6f 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 72  oom = 1;.      r
4080: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
4090: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 41 6c 6c      pParse->nAll
40a0: 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 70  oc = nNew;.    p
40b0: 50 61 72 73 65 2d 3e 61 4e 6f 64 65 20 3d 20 70  Parse->aNode = p
40c0: 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 26  New;.  }.  p = &
40d0: 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65 5b 70 50  pParse->aNode[pP
40e0: 61 72 73 65 2d 3e 6e 4e 6f 64 65 5d 3b 0a 20 20  arse->nNode];.  
40f0: 70 2d 3e 65 54 79 70 65 20 3d 20 28 75 38 29 65  p->eType = (u8)e
4100: 54 79 70 65 3b 0a 20 20 70 2d 3e 6a 6e 46 6c 61  Type;.  p->jnFla
4110: 67 73 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 56 61  gs = 0;.  p->iVa
4120: 6c 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 20 3d 20  l = 0;.  p->n = 
4130: 6e 3b 0a 20 20 70 2d 3e 75 2e 7a 4a 43 6f 6e 74  n;.  p->u.zJCont
4140: 65 6e 74 20 3d 20 7a 43 6f 6e 74 65 6e 74 3b 0a  ent = zContent;.
4150: 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d    return pParse-
4160: 3e 6e 4e 6f 64 65 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a  >nNode++;.}../*.
4170: 2a 2a 20 50 61 72 73 65 20 61 20 73 69 6e 67 6c  ** Parse a singl
4180: 65 20 4a 53 4f 4e 20 76 61 6c 75 65 20 77 68 69  e JSON value whi
4190: 63 68 20 62 65 67 69 6e 73 20 61 74 20 70 50 61  ch begins at pPa
41a0: 72 73 65 2d 3e 7a 4a 73 6f 6e 5b 69 5d 2e 20 20  rse->zJson[i].  
41b0: 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 69 6e  Return the.** in
41c0: 64 65 78 20 6f 66 20 74 68 65 20 66 69 72 73 74  dex of the first
41d0: 20 63 68 61 72 61 63 74 65 72 20 70 61 73 74 20   character past 
41e0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 76  the end of the v
41f0: 61 6c 75 65 20 70 61 72 73 65 64 2e 0a 2a 2a 0a  alue parsed..**.
4200: 2a 2a 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69  ** Return negati
4210: 76 65 20 66 6f 72 20 61 20 73 79 6e 74 61 78 20  ve for a syntax 
4220: 65 72 72 6f 72 2e 20 20 53 70 65 63 69 61 6c 20  error.  Special 
4230: 63 61 73 65 73 3a 20 20 72 65 74 75 72 6e 20 2d  cases:  return -
4240: 32 20 69 66 20 74 68 65 0a 2a 2a 20 66 69 72 73  2 if the.** firs
4250: 74 20 6e 6f 6e 2d 77 68 69 74 65 73 70 61 63 65  t non-whitespace
4260: 20 63 68 61 72 61 63 74 65 72 20 69 73 20 27 7d   character is '}
4270: 27 20 61 6e 64 20 72 65 74 75 72 6e 20 2d 33 20  ' and return -3 
4280: 69 66 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  if the first.** 
4290: 6e 6f 6e 2d 77 68 69 74 65 73 70 61 63 65 20 63  non-whitespace c
42a0: 68 61 72 61 63 74 65 72 20 69 73 20 27 5d 27 2e  haracter is ']'.
42b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a  .*/.static int j
42c0: 73 6f 6e 50 61 72 73 65 56 61 6c 75 65 28 4a 73  sonParseValue(Js
42d0: 6f 6e 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  onParse *pParse,
42e0: 20 75 33 32 20 69 29 7b 0a 20 20 63 68 61 72 20   u32 i){.  char 
42f0: 63 3b 0a 20 20 75 33 32 20 6a 3b 0a 20 20 69 6e  c;.  u32 j;.  in
4300: 74 20 69 54 68 69 73 3b 0a 20 20 69 6e 74 20 78  t iThis;.  int x
4310: 3b 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e  ;.  JsonNode *pN
4320: 6f 64 65 3b 0a 20 20 77 68 69 6c 65 28 20 69 73  ode;.  while( is
4330: 73 70 61 63 65 28 70 50 61 72 73 65 2d 3e 7a 4a  space(pParse->zJ
4340: 73 6f 6e 5b 69 5d 29 20 29 7b 20 69 2b 2b 3b 20  son[i]) ){ i++; 
4350: 7d 0a 20 20 69 66 28 20 28 63 20 3d 20 70 50 61  }.  if( (c = pPa
4360: 72 73 65 2d 3e 7a 4a 73 6f 6e 5b 69 5d 29 3d 3d  rse->zJson[i])==
4370: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
4380: 69 66 28 20 63 3d 3d 27 7b 27 20 29 7b 0a 20 20  if( c=='{' ){.  
4390: 20 20 2f 2a 20 50 61 72 73 65 20 6f 62 6a 65 63    /* Parse objec
43a0: 74 20 2a 2f 0a 20 20 20 20 69 54 68 69 73 20 3d  t */.    iThis =
43b0: 20 6a 73 6f 6e 50 61 72 73 65 41 64 64 4e 6f 64   jsonParseAddNod
43c0: 65 28 70 50 61 72 73 65 2c 20 4a 53 4f 4e 5f 4f  e(pParse, JSON_O
43d0: 42 4a 45 43 54 2c 20 30 2c 20 30 29 3b 0a 20 20  BJECT, 0, 0);.  
43e0: 20 20 69 66 28 20 69 54 68 69 73 3c 30 20 29 20    if( iThis<0 ) 
43f0: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 66  return -1;.    f
4400: 6f 72 28 6a 3d 69 2b 31 3b 3b 6a 2b 2b 29 7b 0a  or(j=i+1;;j++){.
4410: 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 73 73        while( iss
4420: 70 61 63 65 28 70 50 61 72 73 65 2d 3e 7a 4a 73  pace(pParse->zJs
4430: 6f 6e 5b 6a 5d 29 20 29 7b 20 6a 2b 2b 3b 20 7d  on[j]) ){ j++; }
4440: 0a 20 20 20 20 20 20 78 20 3d 20 6a 73 6f 6e 50  .      x = jsonP
4450: 61 72 73 65 56 61 6c 75 65 28 70 50 61 72 73 65  arseValue(pParse
4460: 2c 20 6a 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , j);.      if( 
4470: 78 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  x<0 ){.        i
4480: 66 28 20 78 3d 3d 28 2d 32 29 20 26 26 20 70 50  f( x==(-2) && pP
4490: 61 72 73 65 2d 3e 6e 4e 6f 64 65 3d 3d 28 75 33  arse->nNode==(u3
44a0: 32 29 69 54 68 69 73 2b 31 20 29 20 72 65 74 75  2)iThis+1 ) retu
44b0: 72 6e 20 6a 2b 31 3b 0a 20 20 20 20 20 20 20 20  rn j+1;.        
44c0: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
44d0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50 61   }.      if( pPa
44e0: 72 73 65 2d 3e 6f 6f 6d 20 29 20 72 65 74 75 72  rse->oom ) retur
44f0: 6e 20 2d 31 3b 0a 20 20 20 20 20 20 70 4e 6f 64  n -1;.      pNod
4500: 65 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 4e 6f  e = &pParse->aNo
4510: 64 65 5b 70 50 61 72 73 65 2d 3e 6e 4e 6f 64 65  de[pParse->nNode
4520: 2d 31 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  -1];.      if( p
4530: 4e 6f 64 65 2d 3e 65 54 79 70 65 21 3d 4a 53 4f  Node->eType!=JSO
4540: 4e 5f 53 54 52 49 4e 47 20 29 20 72 65 74 75 72  N_STRING ) retur
4550: 6e 20 2d 31 3b 0a 20 20 20 20 20 20 70 4e 6f 64  n -1;.      pNod
4560: 65 2d 3e 6a 6e 46 6c 61 67 73 20 7c 3d 20 4a 4e  e->jnFlags |= JN
4570: 4f 44 45 5f 4c 41 42 45 4c 3b 0a 20 20 20 20 20  ODE_LABEL;.     
4580: 20 6a 20 3d 20 78 3b 0a 20 20 20 20 20 20 77 68   j = x;.      wh
4590: 69 6c 65 28 20 69 73 73 70 61 63 65 28 70 50 61  ile( isspace(pPa
45a0: 72 73 65 2d 3e 7a 4a 73 6f 6e 5b 6a 5d 29 20 29  rse->zJson[j]) )
45b0: 7b 20 6a 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 69  { j++; }.      i
45c0: 66 28 20 70 50 61 72 73 65 2d 3e 7a 4a 73 6f 6e  f( pParse->zJson
45d0: 5b 6a 5d 21 3d 27 3a 27 20 29 20 72 65 74 75 72  [j]!=':' ) retur
45e0: 6e 20 2d 31 3b 0a 20 20 20 20 20 20 6a 2b 2b 3b  n -1;.      j++;
45f0: 0a 20 20 20 20 20 20 78 20 3d 20 6a 73 6f 6e 50  .      x = jsonP
4600: 61 72 73 65 56 61 6c 75 65 28 70 50 61 72 73 65  arseValue(pParse
4610: 2c 20 6a 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , j);.      if( 
4620: 78 3c 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  x<0 ) return -1;
4630: 0a 20 20 20 20 20 20 6a 20 3d 20 78 3b 0a 20 20  .      j = x;.  
4640: 20 20 20 20 77 68 69 6c 65 28 20 69 73 73 70 61      while( isspa
4650: 63 65 28 70 50 61 72 73 65 2d 3e 7a 4a 73 6f 6e  ce(pParse->zJson
4660: 5b 6a 5d 29 20 29 7b 20 6a 2b 2b 3b 20 7d 0a 20  [j]) ){ j++; }. 
4670: 20 20 20 20 20 63 20 3d 20 70 50 61 72 73 65 2d       c = pParse-
4680: 3e 7a 4a 73 6f 6e 5b 6a 5d 3b 0a 20 20 20 20 20  >zJson[j];.     
4690: 20 69 66 28 20 63 3d 3d 27 2c 27 20 29 20 63 6f   if( c==',' ) co
46a0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
46b0: 28 20 63 21 3d 27 7d 27 20 29 20 72 65 74 75 72  ( c!='}' ) retur
46c0: 6e 20 2d 31 3b 0a 20 20 20 20 20 20 62 72 65 61  n -1;.      brea
46d0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  k;.    }.    pPa
46e0: 72 73 65 2d 3e 61 4e 6f 64 65 5b 69 54 68 69 73  rse->aNode[iThis
46f0: 5d 2e 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4e  ].n = pParse->nN
4700: 6f 64 65 20 2d 20 28 75 33 32 29 69 54 68 69 73  ode - (u32)iThis
4710: 20 2d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   - 1;.    return
4720: 20 6a 2b 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66   j+1;.  }else if
4730: 28 20 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20  ( c=='[' ){.    
4740: 2f 2a 20 50 61 72 73 65 20 61 72 72 61 79 20 2a  /* Parse array *
4750: 2f 0a 20 20 20 20 69 54 68 69 73 20 3d 20 6a 73  /.    iThis = js
4760: 6f 6e 50 61 72 73 65 41 64 64 4e 6f 64 65 28 70  onParseAddNode(p
4770: 50 61 72 73 65 2c 20 4a 53 4f 4e 5f 41 52 52 41  Parse, JSON_ARRA
4780: 59 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  Y, 0, 0);.    if
4790: 28 20 69 54 68 69 73 3c 30 20 29 20 72 65 74 75  ( iThis<0 ) retu
47a0: 72 6e 20 2d 31 3b 0a 20 20 20 20 66 6f 72 28 6a  rn -1;.    for(j
47b0: 3d 69 2b 31 3b 3b 6a 2b 2b 29 7b 0a 20 20 20 20  =i+1;;j++){.    
47c0: 20 20 77 68 69 6c 65 28 20 69 73 73 70 61 63 65    while( isspace
47d0: 28 70 50 61 72 73 65 2d 3e 7a 4a 73 6f 6e 5b 6a  (pParse->zJson[j
47e0: 5d 29 20 29 7b 20 6a 2b 2b 3b 20 7d 0a 20 20 20  ]) ){ j++; }.   
47f0: 20 20 20 78 20 3d 20 6a 73 6f 6e 50 61 72 73 65     x = jsonParse
4800: 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 6a 29  Value(pParse, j)
4810: 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3c 30 20  ;.      if( x<0 
4820: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 78  ){.        if( x
4830: 3d 3d 28 2d 33 29 20 26 26 20 70 50 61 72 73 65  ==(-3) && pParse
4840: 2d 3e 6e 4e 6f 64 65 3d 3d 28 75 33 32 29 69 54  ->nNode==(u32)iT
4850: 68 69 73 2b 31 20 29 20 72 65 74 75 72 6e 20 6a  his+1 ) return j
4860: 2b 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  +1;.        retu
4870: 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20  rn -1;.      }. 
4880: 20 20 20 20 20 6a 20 3d 20 78 3b 0a 20 20 20 20       j = x;.    
4890: 20 20 77 68 69 6c 65 28 20 69 73 73 70 61 63 65    while( isspace
48a0: 28 70 50 61 72 73 65 2d 3e 7a 4a 73 6f 6e 5b 6a  (pParse->zJson[j
48b0: 5d 29 20 29 7b 20 6a 2b 2b 3b 20 7d 0a 20 20 20  ]) ){ j++; }.   
48c0: 20 20 20 63 20 3d 20 70 50 61 72 73 65 2d 3e 7a     c = pParse->z
48d0: 4a 73 6f 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 69  Json[j];.      i
48e0: 66 28 20 63 3d 3d 27 2c 27 20 29 20 63 6f 6e 74  f( c==',' ) cont
48f0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
4900: 63 21 3d 27 5d 27 20 29 20 72 65 74 75 72 6e 20  c!=']' ) return 
4910: 2d 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  -1;.      break;
4920: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
4930: 65 2d 3e 61 4e 6f 64 65 5b 69 54 68 69 73 5d 2e  e->aNode[iThis].
4940: 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4e 6f 64  n = pParse->nNod
4950: 65 20 2d 20 28 75 33 32 29 69 54 68 69 73 20 2d  e - (u32)iThis -
4960: 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6a   1;.    return j
4970: 2b 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  +1;.  }else if( 
4980: 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 2f 2a  c=='"' ){.    /*
4990: 20 50 61 72 73 65 20 73 74 72 69 6e 67 20 2a 2f   Parse string */
49a0: 0a 20 20 20 20 75 38 20 6a 6e 46 6c 61 67 73 20  .    u8 jnFlags 
49b0: 3d 20 30 3b 0a 20 20 20 20 6a 20 3d 20 69 2b 31  = 0;.    j = i+1
49c0: 3b 0a 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20  ;.    for(;;){. 
49d0: 20 20 20 20 20 63 20 3d 20 70 50 61 72 73 65 2d       c = pParse-
49e0: 3e 7a 4a 73 6f 6e 5b 6a 5d 3b 0a 20 20 20 20 20  >zJson[j];.     
49f0: 20 69 66 28 20 63 3d 3d 30 20 29 20 72 65 74 75   if( c==0 ) retu
4a00: 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28  rn -1;.      if(
4a10: 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20   c=='\\' ){.    
4a20: 20 20 20 20 63 20 3d 20 70 50 61 72 73 65 2d 3e      c = pParse->
4a30: 7a 4a 73 6f 6e 5b 2b 2b 6a 5d 3b 0a 20 20 20 20  zJson[++j];.    
4a40: 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20 72      if( c==0 ) r
4a50: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
4a60: 20 20 6a 6e 46 6c 61 67 73 20 3d 20 4a 4e 4f 44    jnFlags = JNOD
4a70: 45 5f 45 53 43 41 50 45 3b 0a 20 20 20 20 20 20  E_ESCAPE;.      
4a80: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 22 27  }else if( c=='"'
4a90: 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
4aa0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
4ab0: 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20   j++;.    }.    
4ac0: 6a 73 6f 6e 50 61 72 73 65 41 64 64 4e 6f 64 65  jsonParseAddNode
4ad0: 28 70 50 61 72 73 65 2c 20 4a 53 4f 4e 5f 53 54  (pParse, JSON_ST
4ae0: 52 49 4e 47 2c 20 6a 2b 31 2d 69 2c 20 26 70 50  RING, j+1-i, &pP
4af0: 61 72 73 65 2d 3e 7a 4a 73 6f 6e 5b 69 5d 29 3b  arse->zJson[i]);
4b00: 0a 20 20 20 20 69 66 28 20 21 70 50 61 72 73 65  .    if( !pParse
4b10: 2d 3e 6f 6f 6d 20 29 20 70 50 61 72 73 65 2d 3e  ->oom ) pParse->
4b20: 61 4e 6f 64 65 5b 70 50 61 72 73 65 2d 3e 6e 4e  aNode[pParse->nN
4b30: 6f 64 65 2d 31 5d 2e 6a 6e 46 6c 61 67 73 20 3d  ode-1].jnFlags =
4b40: 20 6a 6e 46 6c 61 67 73 3b 0a 20 20 20 20 72 65   jnFlags;.    re
4b50: 74 75 72 6e 20 6a 2b 31 3b 0a 20 20 7d 65 6c 73  turn j+1;.  }els
4b60: 65 20 69 66 28 20 63 3d 3d 27 6e 27 0a 20 20 20  e if( c=='n'.   
4b70: 20 20 20 20 20 20 26 26 20 73 74 72 6e 63 6d 70        && strncmp
4b80: 28 70 50 61 72 73 65 2d 3e 7a 4a 73 6f 6e 2b 69  (pParse->zJson+i
4b90: 2c 22 6e 75 6c 6c 22 2c 34 29 3d 3d 30 0a 20 20  ,"null",4)==0.  
4ba0: 20 20 20 20 20 20 20 26 26 20 21 69 73 61 6c 6e         && !isaln
4bb0: 75 6d 28 70 50 61 72 73 65 2d 3e 7a 4a 73 6f 6e  um(pParse->zJson
4bc0: 5b 69 2b 34 5d 29 20 29 7b 0a 20 20 20 20 6a 73  [i+4]) ){.    js
4bd0: 6f 6e 50 61 72 73 65 41 64 64 4e 6f 64 65 28 70  onParseAddNode(p
4be0: 50 61 72 73 65 2c 20 4a 53 4f 4e 5f 4e 55 4c 4c  Parse, JSON_NULL
4bf0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  , 0, 0);.    ret
4c00: 75 72 6e 20 69 2b 34 3b 0a 20 20 7d 65 6c 73 65  urn i+4;.  }else
4c10: 20 69 66 28 20 63 3d 3d 27 74 27 0a 20 20 20 20   if( c=='t'.    
4c20: 20 20 20 20 20 26 26 20 73 74 72 6e 63 6d 70 28       && strncmp(
4c30: 70 50 61 72 73 65 2d 3e 7a 4a 73 6f 6e 2b 69 2c  pParse->zJson+i,
4c40: 22 74 72 75 65 22 2c 34 29 3d 3d 30 0a 20 20 20  "true",4)==0.   
4c50: 20 20 20 20 20 20 26 26 20 21 69 73 61 6c 6e 75        && !isalnu
4c60: 6d 28 70 50 61 72 73 65 2d 3e 7a 4a 73 6f 6e 5b  m(pParse->zJson[
4c70: 69 2b 34 5d 29 20 29 7b 0a 20 20 20 20 6a 73 6f  i+4]) ){.    jso
4c80: 6e 50 61 72 73 65 41 64 64 4e 6f 64 65 28 70 50  nParseAddNode(pP
4c90: 61 72 73 65 2c 20 4a 53 4f 4e 5f 54 52 55 45 2c  arse, JSON_TRUE,
4ca0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75   0, 0);.    retu
4cb0: 72 6e 20 69 2b 34 3b 0a 20 20 7d 65 6c 73 65 20  rn i+4;.  }else 
4cc0: 69 66 28 20 63 3d 3d 27 66 27 0a 20 20 20 20 20  if( c=='f'.     
4cd0: 20 20 20 20 26 26 20 73 74 72 6e 63 6d 70 28 70      && strncmp(p
4ce0: 50 61 72 73 65 2d 3e 7a 4a 73 6f 6e 2b 69 2c 22  Parse->zJson+i,"
4cf0: 66 61 6c 73 65 22 2c 35 29 3d 3d 30 0a 20 20 20  false",5)==0.   
4d00: 20 20 20 20 20 20 26 26 20 21 69 73 61 6c 6e 75        && !isalnu
4d10: 6d 28 70 50 61 72 73 65 2d 3e 7a 4a 73 6f 6e 5b  m(pParse->zJson[
4d20: 69 2b 35 5d 29 20 29 7b 0a 20 20 20 20 6a 73 6f  i+5]) ){.    jso
4d30: 6e 50 61 72 73 65 41 64 64 4e 6f 64 65 28 70 50  nParseAddNode(pP
4d40: 61 72 73 65 2c 20 4a 53 4f 4e 5f 46 41 4c 53 45  arse, JSON_FALSE
4d50: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  , 0, 0);.    ret
4d60: 75 72 6e 20 69 2b 35 3b 0a 20 20 7d 65 6c 73 65  urn i+5;.  }else
4d70: 20 69 66 28 20 63 3d 3d 27 2d 27 20 7c 7c 20 28   if( c=='-' || (
4d80: 63 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27 39 27  c>='0' && c<='9'
4d90: 29 20 29 7b 0a 20 20 20 20 2f 2a 20 50 61 72 73  ) ){.    /* Pars
4da0: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20  e number */.    
4db0: 75 38 20 73 65 65 6e 44 50 20 3d 20 30 3b 0a 20  u8 seenDP = 0;. 
4dc0: 20 20 20 75 38 20 73 65 65 6e 45 20 3d 20 30 3b     u8 seenE = 0;
4dd0: 0a 20 20 20 20 6a 20 3d 20 69 2b 31 3b 0a 20 20  .    j = i+1;.  
4de0: 20 20 66 6f 72 28 3b 3b 20 6a 2b 2b 29 7b 0a 20    for(;; j++){. 
4df0: 20 20 20 20 20 63 20 3d 20 70 50 61 72 73 65 2d       c = pParse-
4e00: 3e 7a 4a 73 6f 6e 5b 6a 5d 3b 0a 20 20 20 20 20  >zJson[j];.     
4e10: 20 69 66 28 20 63 3e 3d 27 30 27 20 26 26 20 63   if( c>='0' && c
4e20: 3c 3d 27 39 27 20 29 20 63 6f 6e 74 69 6e 75 65  <='9' ) continue
4e30: 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27  ;.      if( c=='
4e40: 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  .' ){.        if
4e50: 28 20 70 50 61 72 73 65 2d 3e 7a 4a 73 6f 6e 5b  ( pParse->zJson[
4e60: 6a 2d 31 5d 3d 3d 27 2d 27 20 29 20 72 65 74 75  j-1]=='-' ) retu
4e70: 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69  rn -1;.        i
4e80: 66 28 20 73 65 65 6e 44 50 20 29 20 72 65 74 75  f( seenDP ) retu
4e90: 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 73  rn -1;.        s
4ea0: 65 65 6e 44 50 20 3d 20 31 3b 0a 20 20 20 20 20  eenDP = 1;.     
4eb0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
4ec0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
4ed0: 3d 3d 27 65 27 20 7c 7c 20 63 3d 3d 27 45 27 20  =='e' || c=='E' 
4ee0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
4ef0: 50 61 72 73 65 2d 3e 7a 4a 73 6f 6e 5b 6a 2d 31  Parse->zJson[j-1
4f00: 5d 3c 27 30 27 20 29 20 72 65 74 75 72 6e 20 2d  ]<'0' ) return -
4f10: 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  1;.        if( s
4f20: 65 65 6e 45 20 29 20 72 65 74 75 72 6e 20 2d 31  eenE ) return -1
4f30: 3b 0a 20 20 20 20 20 20 20 20 73 65 65 6e 44 50  ;.        seenDP
4f40: 20 3d 20 73 65 65 6e 45 20 3d 20 31 3b 0a 20 20   = seenE = 1;.  
4f50: 20 20 20 20 20 20 63 20 3d 20 70 50 61 72 73 65        c = pParse
4f60: 2d 3e 7a 4a 73 6f 6e 5b 6a 2b 31 5d 3b 0a 20 20  ->zJson[j+1];.  
4f70: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 2b 27        if( c=='+'
4f80: 20 7c 7c 20 63 3d 3d 27 2d 27 20 29 7b 0a 20 20   || c=='-' ){.  
4f90: 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20          j++;.   
4fa0: 20 20 20 20 20 20 20 63 20 3d 20 70 50 61 72 73         c = pPars
4fb0: 65 2d 3e 7a 4a 73 6f 6e 5b 6a 2b 31 5d 3b 0a 20  e->zJson[j+1];. 
4fc0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4fd0: 20 69 66 28 20 63 3c 27 30 27 20 7c 7c 20 63 3e   if( c<'0' || c>
4fe0: 27 39 27 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  '9' ) return -1;
4ff0: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
5000: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
5010: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
5020: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 7a 4a    if( pParse->zJ
5030: 73 6f 6e 5b 6a 2d 31 5d 3c 27 30 27 20 29 20 72  son[j-1]<'0' ) r
5040: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 6a 73  eturn -1;.    js
5050: 6f 6e 50 61 72 73 65 41 64 64 4e 6f 64 65 28 70  onParseAddNode(p
5060: 50 61 72 73 65 2c 20 73 65 65 6e 44 50 20 3f 20  Parse, seenDP ? 
5070: 4a 53 4f 4e 5f 52 45 41 4c 20 3a 20 4a 53 4f 4e  JSON_REAL : JSON
5080: 5f 49 4e 54 2c 0a 20 20 20 20 20 20 20 20 20 20  _INT,.          
5090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 20                j 
50a0: 2d 20 69 2c 20 26 70 50 61 72 73 65 2d 3e 7a 4a  - i, &pParse->zJ
50b0: 73 6f 6e 5b 69 5d 29 3b 0a 20 20 20 20 72 65 74  son[i]);.    ret
50c0: 75 72 6e 20 6a 3b 0a 20 20 7d 65 6c 73 65 20 69  urn j;.  }else i
50d0: 66 28 20 63 3d 3d 27 7d 27 20 29 7b 0a 20 20 20  f( c=='}' ){.   
50e0: 20 72 65 74 75 72 6e 20 2d 32 3b 20 20 2f 2a 20   return -2;  /* 
50f0: 45 6e 64 20 6f 66 20 7b 2e 2e 2e 7d 20 2a 2f 0a  End of {...} */.
5100: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
5110: 5d 27 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ]' ){.    return
5120: 20 2d 33 3b 20 20 2f 2a 20 45 6e 64 20 6f 66 20   -3;  /* End of 
5130: 5b 2e 2e 2e 5d 20 2a 2f 0a 20 20 7d 65 6c 73 65  [...] */.  }else
5140: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  {.    return -1;
5150: 20 20 2f 2a 20 53 79 6e 74 61 78 20 65 72 72 6f    /* Syntax erro
5160: 72 20 2a 2f 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  r */.  }.}../*.*
5170: 2a 20 50 61 72 73 65 20 61 20 63 6f 6d 70 6c 65  * Parse a comple
5180: 74 65 20 4a 53 4f 4e 20 73 74 72 69 6e 67 2e 20  te JSON string. 
5190: 20 52 65 74 75 72 6e 20 30 20 6f 6e 20 73 75 63   Return 0 on suc
51a0: 63 65 73 73 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  cess or non-zero
51b0: 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   if there.** are
51c0: 20 61 6e 79 20 65 72 72 6f 72 73 2e 20 20 49 66   any errors.  If
51d0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
51e0: 2c 20 66 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72  , free all memor
51f0: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
5200: 68 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a 0a  h.** pParse..**.
5210: 2a 2a 20 70 50 61 72 73 65 20 69 73 20 75 6e 69  ** pParse is uni
5220: 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20  nitialized when 
5230: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
5240: 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
5250: 63 20 69 6e 74 20 6a 73 6f 6e 50 61 72 73 65 28  c int jsonParse(
5260: 0a 20 20 4a 73 6f 6e 50 61 72 73 65 20 2a 70 50  .  JsonParse *pP
5270: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
5280: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e  /* Initialize an
5290: 64 20 66 69 6c 6c 20 74 68 69 73 20 4a 73 6f 6e  d fill this Json
52a0: 50 61 72 73 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  Parse object */.
52b0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
52c0: 74 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20 2f  t *pCtx,       /
52d0: 2a 20 52 65 70 6f 72 74 20 65 72 72 6f 72 73 20  * Report errors 
52e0: 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  here */.  const 
52f0: 63 68 61 72 20 2a 7a 4a 73 6f 6e 20 20 20 20 20  char *zJson     
5300: 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20         /* Input 
5310: 4a 53 4f 4e 20 74 65 78 74 20 74 6f 20 62 65 20  JSON text to be 
5320: 70 61 72 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 69  parsed */.){.  i
5330: 6e 74 20 69 3b 0a 20 20 6d 65 6d 73 65 74 28 70  nt i;.  memset(p
5340: 50 61 72 73 65 2c 20 30 2c 20 73 69 7a 65 6f 66  Parse, 0, sizeof
5350: 28 2a 70 50 61 72 73 65 29 29 3b 0a 20 20 69 66  (*pParse));.  if
5360: 28 20 7a 4a 73 6f 6e 3d 3d 30 20 29 20 72 65 74  ( zJson==0 ) ret
5370: 75 72 6e 20 31 3b 0a 20 20 70 50 61 72 73 65 2d  urn 1;.  pParse-
5380: 3e 7a 4a 73 6f 6e 20 3d 20 7a 4a 73 6f 6e 3b 0a  >zJson = zJson;.
5390: 20 20 69 20 3d 20 6a 73 6f 6e 50 61 72 73 65 56    i = jsonParseV
53a0: 61 6c 75 65 28 70 50 61 72 73 65 2c 20 30 29 3b  alue(pParse, 0);
53b0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6f  .  if( pParse->o
53c0: 6f 6d 20 29 20 69 20 3d 20 2d 31 3b 0a 20 20 69  om ) i = -1;.  i
53d0: 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 77 68  f( i>0 ){.    wh
53e0: 69 6c 65 28 20 69 73 73 70 61 63 65 28 7a 4a 73  ile( isspace(zJs
53f0: 6f 6e 5b 69 5d 29 20 29 20 69 2b 2b 3b 0a 20 20  on[i]) ) i++;.  
5400: 20 20 69 66 28 20 7a 4a 73 6f 6e 5b 69 5d 20 29    if( zJson[i] )
5410: 20 69 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 69   i = -1;.  }.  i
5420: 66 28 20 69 3c 3d 30 20 29 7b 0a 20 20 20 20 69  f( i<=0 ){.    i
5430: 66 28 20 70 43 74 78 21 3d 30 20 29 7b 0a 20 20  f( pCtx!=0 ){.  
5440: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
5450: 6f 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 73  oom ){.        s
5460: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
5470: 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78 29 3b  ror_nomem(pCtx);
5480: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5490: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
54a0: 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c  sult_error(pCtx,
54b0: 20 22 6d 61 6c 66 6f 72 6d 65 64 20 4a 53 4f 4e   "malformed JSON
54c0: 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a  ", -1);.      }.
54d0: 20 20 20 20 7d 0a 20 20 20 20 6a 73 6f 6e 50 61      }.    jsonPa
54e0: 72 73 65 52 65 73 65 74 28 70 50 61 72 73 65 29  rseReset(pParse)
54f0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
5500: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
5510: 7d 0a 0a 2f 2a 20 4d 61 72 6b 20 6e 6f 64 65 20  }../* Mark node 
5520: 69 20 6f 66 20 70 50 61 72 73 65 20 61 73 20 62  i of pParse as b
5530: 65 69 6e 67 20 61 20 63 68 69 6c 64 20 6f 66 20  eing a child of 
5540: 69 50 61 72 65 6e 74 2e 20 20 43 61 6c 6c 20 72  iParent.  Call r
5550: 65 63 75 72 73 69 76 65 6c 79 0a 2a 2a 20 74 6f  ecursively.** to
5560: 20 66 69 6c 6c 20 69 6e 20 61 6c 6c 20 74 68 65   fill in all the
5570: 20 64 65 73 63 65 6e 64 61 6e 74 73 20 6f 66 20   descendants of 
5580: 6e 6f 64 65 20 69 2e 0a 2a 2f 0a 73 74 61 74 69  node i..*/.stati
5590: 63 20 76 6f 69 64 20 6a 73 6f 6e 50 61 72 73 65  c void jsonParse
55a0: 46 69 6c 6c 49 6e 50 61 72 65 6e 74 61 67 65 28  FillInParentage(
55b0: 4a 73 6f 6e 50 61 72 73 65 20 2a 70 50 61 72 73  JsonParse *pPars
55c0: 65 2c 20 75 33 32 20 69 2c 20 75 33 32 20 69 50  e, u32 i, u32 iP
55d0: 61 72 65 6e 74 29 7b 0a 20 20 4a 73 6f 6e 4e 6f  arent){.  JsonNo
55e0: 64 65 20 2a 70 4e 6f 64 65 20 3d 20 26 70 50 61  de *pNode = &pPa
55f0: 72 73 65 2d 3e 61 4e 6f 64 65 5b 69 5d 3b 0a 20  rse->aNode[i];. 
5600: 20 75 33 32 20 6a 3b 0a 20 20 70 50 61 72 73 65   u32 j;.  pParse
5610: 2d 3e 61 55 70 5b 69 5d 20 3d 20 69 50 61 72 65  ->aUp[i] = iPare
5620: 6e 74 3b 0a 20 20 73 77 69 74 63 68 28 20 70 4e  nt;.  switch( pN
5630: 6f 64 65 2d 3e 65 54 79 70 65 20 29 7b 0a 20 20  ode->eType ){.  
5640: 20 20 63 61 73 65 20 4a 53 4f 4e 5f 41 52 52 41    case JSON_ARRA
5650: 59 3a 20 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a  Y: {.      for(j
5660: 3d 31 3b 20 6a 3c 3d 70 4e 6f 64 65 2d 3e 6e 3b  =1; j<=pNode->n;
5670: 20 6a 20 2b 3d 20 6a 73 6f 6e 4e 6f 64 65 53 69   j += jsonNodeSi
5680: 7a 65 28 70 4e 6f 64 65 2b 6a 29 29 7b 0a 20 20  ze(pNode+j)){.  
5690: 20 20 20 20 20 20 6a 73 6f 6e 50 61 72 73 65 46        jsonParseF
56a0: 69 6c 6c 49 6e 50 61 72 65 6e 74 61 67 65 28 70  illInParentage(p
56b0: 50 61 72 73 65 2c 20 69 2b 6a 2c 20 69 29 3b 0a  Parse, i+j, i);.
56c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
56d0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
56e0: 61 73 65 20 4a 53 4f 4e 5f 4f 42 4a 45 43 54 3a  ase JSON_OBJECT:
56f0: 20 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 31   {.      for(j=1
5700: 3b 20 6a 3c 3d 70 4e 6f 64 65 2d 3e 6e 3b 20 6a  ; j<=pNode->n; j
5710: 20 2b 3d 20 6a 73 6f 6e 4e 6f 64 65 53 69 7a 65   += jsonNodeSize
5720: 28 70 4e 6f 64 65 2b 6a 2b 31 29 2b 31 29 7b 0a  (pNode+j+1)+1){.
5730: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
5740: 61 55 70 5b 69 2b 6a 5d 20 3d 20 69 3b 0a 20 20  aUp[i+j] = i;.  
5750: 20 20 20 20 20 20 6a 73 6f 6e 50 61 72 73 65 46        jsonParseF
5760: 69 6c 6c 49 6e 50 61 72 65 6e 74 61 67 65 28 70  illInParentage(p
5770: 50 61 72 73 65 2c 20 69 2b 6a 2b 31 2c 20 69 29  Parse, i+j+1, i)
5780: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5790: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
57a0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
57b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
57c0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70   }.}../*.** Comp
57d0: 75 74 65 20 74 68 65 20 70 61 72 65 6e 74 61 67  ute the parentag
57e0: 65 20 6f 66 20 61 6c 6c 20 6e 6f 64 65 73 20 69  e of all nodes i
57f0: 6e 20 61 20 63 6f 6d 70 6c 65 74 65 64 20 70 61  n a completed pa
5800: 72 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rse..*/.static i
5810: 6e 74 20 6a 73 6f 6e 50 61 72 73 65 46 69 6e 64  nt jsonParseFind
5820: 50 61 72 65 6e 74 73 28 4a 73 6f 6e 50 61 72 73  Parents(JsonPars
5830: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 75 33  e *pParse){.  u3
5840: 32 20 2a 61 55 70 3b 0a 20 20 61 73 73 65 72 74  2 *aUp;.  assert
5850: 28 20 70 50 61 72 73 65 2d 3e 61 55 70 3d 3d 30  ( pParse->aUp==0
5860: 20 29 3b 0a 20 20 61 55 70 20 3d 20 70 50 61 72   );.  aUp = pPar
5870: 73 65 2d 3e 61 55 70 20 3d 20 73 71 6c 69 74 65  se->aUp = sqlite
5880: 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
5890: 28 75 33 32 29 2a 70 50 61 72 73 65 2d 3e 6e 4e  (u32)*pParse->nN
58a0: 6f 64 65 20 29 3b 0a 20 20 69 66 28 20 61 55 70  ode );.  if( aUp
58b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 72 73  ==0 ){.    pPars
58c0: 65 2d 3e 6f 6f 6d 20 3d 20 31 3b 0a 20 20 20 20  e->oom = 1;.    
58d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
58e0: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6a 73 6f 6e 50  MEM;.  }.  jsonP
58f0: 61 72 73 65 46 69 6c 6c 49 6e 50 61 72 65 6e 74  arseFillInParent
5900: 61 67 65 28 70 50 61 72 73 65 2c 20 30 2c 20 30  age(pParse, 0, 0
5910: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
5920: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 66 6f 72  TE_OK;.}../* for
5930: 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
5940: 20 2a 2f 0a 73 74 61 74 69 63 20 4a 73 6f 6e 4e   */.static JsonN
5950: 6f 64 65 20 2a 6a 73 6f 6e 4c 6f 6f 6b 75 70 41  ode *jsonLookupA
5960: 70 70 65 6e 64 28 4a 73 6f 6e 50 61 72 73 65 2a  ppend(JsonParse*
5970: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74  ,const char*,int
5980: 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 3b  *,const char**);
5990: 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 61  ../*.** Search a
59a0: 6c 6f 6e 67 20 7a 50 61 74 68 20 74 6f 20 66 69  long zPath to fi
59b0: 6e 64 20 74 68 65 20 6e 6f 64 65 20 73 70 65 63  nd the node spec
59c0: 69 66 69 65 64 2e 20 20 52 65 74 75 72 6e 20 61  ified.  Return a
59d0: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
59e0: 68 61 74 20 6e 6f 64 65 2c 20 6f 72 20 4e 55 4c  hat node, or NUL
59f0: 4c 20 69 66 20 7a 50 61 74 68 20 69 73 20 6d 61  L if zPath is ma
5a00: 6c 66 6f 72 6d 65 64 20 6f 72 20 69 66 20 74 68  lformed or if th
5a10: 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68 0a 2a  ere is no such.*
5a20: 2a 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  * node..**.** If
5a30: 20 70 41 70 6e 64 21 3d 30 2c 20 74 68 65 6e 20   pApnd!=0, then 
5a40: 74 72 79 20 74 6f 20 61 70 70 65 6e 64 20 6e 65  try to append ne
5a50: 77 20 6e 6f 64 65 73 20 74 6f 20 63 6f 6d 70 6c  w nodes to compl
5a60: 65 74 65 20 7a 50 61 74 68 20 69 66 20 69 74 20  ete zPath if it 
5a70: 69 73 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74  is.** possible t
5a80: 6f 20 64 6f 20 73 6f 20 61 6e 64 20 69 66 20 6e  o do so and if n
5a90: 6f 20 65 78 69 73 74 69 6e 67 20 6e 6f 64 65 20  o existing node 
5aa0: 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 7a  corresponds to z
5ab0: 50 61 74 68 2e 20 20 49 66 0a 2a 2a 20 6e 65 77  Path.  If.** new
5ac0: 20 6e 6f 64 65 73 20 61 72 65 20 61 70 70 65 6e   nodes are appen
5ad0: 64 65 64 20 2a 70 41 70 6e 64 20 69 73 20 73 65  ded *pApnd is se
5ae0: 74 20 74 6f 20 31 2e 0a 2a 2f 0a 73 74 61 74 69  t to 1..*/.stati
5af0: 63 20 4a 73 6f 6e 4e 6f 64 65 20 2a 6a 73 6f 6e  c JsonNode *json
5b00: 4c 6f 6f 6b 75 70 53 74 65 70 28 0a 20 20 4a 73  LookupStep(.  Js
5b10: 6f 6e 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  onParse *pParse,
5b20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4a 53 4f        /* The JSO
5b30: 4e 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  N to search */. 
5b40: 20 75 33 32 20 69 52 6f 6f 74 2c 20 20 20 20 20   u32 iRoot,     
5b50: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69           /* Begi
5b60: 6e 20 74 68 65 20 73 65 61 72 63 68 20 61 74 20  n the search at 
5b70: 74 68 69 73 20 6e 6f 64 65 20 2a 2f 0a 20 20 63  this node */.  c
5b80: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
5b90: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
5ba0: 74 68 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a  th to search */.
5bb0: 20 20 69 6e 74 20 2a 70 41 70 6e 64 2c 20 20 20    int *pApnd,   
5bc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 70 70            /* App
5bd0: 65 6e 64 20 6e 6f 64 65 73 20 74 6f 20 63 6f 6d  end nodes to com
5be0: 70 6c 65 74 65 20 70 61 74 68 20 69 66 20 6e 6f  plete path if no
5bf0: 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73  t NULL */.  cons
5c00: 74 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 20 20  t char **pzErr  
5c10: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 2a 70 7a 45      /* Make *pzE
5c20: 72 72 20 70 6f 69 6e 74 20 74 6f 20 61 6e 79 20  rr point to any 
5c30: 73 79 6e 74 61 78 20 65 72 72 6f 72 20 69 6e 20  syntax error in 
5c40: 7a 50 61 74 68 20 2a 2f 0a 29 7b 0a 20 20 75 33  zPath */.){.  u3
5c50: 32 20 69 2c 20 6a 2c 20 6e 4b 65 79 3b 0a 20 20  2 i, j, nKey;.  
5c60: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65 79  const char *zKey
5c70: 3b 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 52  ;.  JsonNode *pR
5c80: 6f 6f 74 20 3d 20 26 70 50 61 72 73 65 2d 3e 61  oot = &pParse->a
5c90: 4e 6f 64 65 5b 69 52 6f 6f 74 5d 3b 0a 20 20 69  Node[iRoot];.  i
5ca0: 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 30 20 29  f( zPath[0]==0 )
5cb0: 20 72 65 74 75 72 6e 20 70 52 6f 6f 74 3b 0a 20   return pRoot;. 
5cc0: 20 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 27   if( zPath[0]=='
5cd0: 2e 27 20 29 7b 0a 20 20 20 20 69 66 28 20 70 52  .' ){.    if( pR
5ce0: 6f 6f 74 2d 3e 65 54 79 70 65 21 3d 4a 53 4f 4e  oot->eType!=JSON
5cf0: 5f 4f 42 4a 45 43 54 20 29 20 72 65 74 75 72 6e  _OBJECT ) return
5d00: 20 30 3b 0a 20 20 20 20 7a 50 61 74 68 2b 2b 3b   0;.    zPath++;
5d10: 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68 5b 30  .    if( zPath[0
5d20: 5d 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20  ]=='"' ){.      
5d30: 7a 4b 65 79 20 3d 20 7a 50 61 74 68 20 2b 20 31  zKey = zPath + 1
5d40: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b  ;.      for(i=1;
5d50: 20 7a 50 61 74 68 5b 69 5d 20 26 26 20 7a 50 61   zPath[i] && zPa
5d60: 74 68 5b 69 5d 21 3d 27 22 27 3b 20 69 2b 2b 29  th[i]!='"'; i++)
5d70: 7b 7d 0a 20 20 20 20 20 20 6e 4b 65 79 20 3d 20  {}.      nKey = 
5d80: 69 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  i-1;.      if( z
5d90: 50 61 74 68 5b 69 5d 20 29 20 69 2b 2b 3b 0a 20  Path[i] ) i++;. 
5da0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5db0: 7a 4b 65 79 20 3d 20 7a 50 61 74 68 3b 0a 20 20  zKey = zPath;.  
5dc0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 50 61      for(i=0; zPa
5dd0: 74 68 5b 69 5d 20 26 26 20 7a 50 61 74 68 5b 69  th[i] && zPath[i
5de0: 5d 21 3d 27 2e 27 20 26 26 20 7a 50 61 74 68 5b  ]!='.' && zPath[
5df0: 69 5d 21 3d 27 5b 27 3b 20 69 2b 2b 29 7b 7d 0a  i]!='['; i++){}.
5e00: 20 20 20 20 20 20 6e 4b 65 79 20 3d 20 69 3b 0a        nKey = i;.
5e10: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4b      }.    if( nK
5e20: 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a  ey==0 ){.      *
5e30: 70 7a 45 72 72 20 3d 20 7a 50 61 74 68 3b 0a 20  pzErr = zPath;. 
5e40: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
5e50: 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 31 3b 0a     }.    j = 1;.
5e60: 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20      for(;;){.   
5e70: 20 20 20 77 68 69 6c 65 28 20 6a 3c 3d 70 52 6f     while( j<=pRo
5e80: 6f 74 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20 20  ot->n ){.       
5e90: 20 69 66 28 20 70 52 6f 6f 74 5b 6a 5d 2e 6e 3d   if( pRoot[j].n=
5ea0: 3d 6e 4b 65 79 2b 32 0a 20 20 20 20 20 20 20 20  =nKey+2.        
5eb0: 20 26 26 20 73 74 72 6e 63 6d 70 28 26 70 52 6f   && strncmp(&pRo
5ec0: 6f 74 5b 6a 5d 2e 75 2e 7a 4a 43 6f 6e 74 65 6e  ot[j].u.zJConten
5ed0: 74 5b 31 5d 2c 7a 4b 65 79 2c 6e 4b 65 79 29 3d  t[1],zKey,nKey)=
5ee0: 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  =0.        ){.  
5ef0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6a          return j
5f00: 73 6f 6e 4c 6f 6f 6b 75 70 53 74 65 70 28 70 50  sonLookupStep(pP
5f10: 61 72 73 65 2c 20 69 52 6f 6f 74 2b 6a 2b 31 2c  arse, iRoot+j+1,
5f20: 20 26 7a 50 61 74 68 5b 69 5d 2c 20 70 41 70 6e   &zPath[i], pApn
5f30: 64 2c 20 70 7a 45 72 72 29 3b 0a 20 20 20 20 20  d, pzErr);.     
5f40: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6a 2b 2b     }.        j++
5f50: 3b 0a 20 20 20 20 20 20 20 20 6a 20 2b 3d 20 6a  ;.        j += j
5f60: 73 6f 6e 4e 6f 64 65 53 69 7a 65 28 26 70 52 6f  sonNodeSize(&pRo
5f70: 6f 74 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  ot[j]);.      }.
5f80: 20 20 20 20 20 20 69 66 28 20 28 70 52 6f 6f 74        if( (pRoot
5f90: 2d 3e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44  ->jnFlags & JNOD
5fa0: 45 5f 41 50 50 45 4e 44 29 3d 3d 30 20 29 20 62  E_APPEND)==0 ) b
5fb0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 52 6f 6f  reak;.      iRoo
5fc0: 74 20 2b 3d 20 70 52 6f 6f 74 2d 3e 75 2e 69 41  t += pRoot->u.iA
5fd0: 70 70 65 6e 64 3b 0a 20 20 20 20 20 20 70 52 6f  ppend;.      pRo
5fe0: 6f 74 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 4e  ot = &pParse->aN
5ff0: 6f 64 65 5b 69 52 6f 6f 74 5d 3b 0a 20 20 20 20  ode[iRoot];.    
6000: 20 20 6a 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20    j = 1;.    }. 
6010: 20 20 20 69 66 28 20 70 41 70 6e 64 20 29 7b 0a     if( pApnd ){.
6020: 20 20 20 20 20 20 75 33 32 20 69 53 74 61 72 74        u32 iStart
6030: 2c 20 69 4c 61 62 65 6c 3b 0a 20 20 20 20 20 20  , iLabel;.      
6040: 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 3b  JsonNode *pNode;
6050: 0a 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20  .      iStart = 
6060: 6a 73 6f 6e 50 61 72 73 65 41 64 64 4e 6f 64 65  jsonParseAddNode
6070: 28 70 50 61 72 73 65 2c 20 4a 53 4f 4e 5f 4f 42  (pParse, JSON_OB
6080: 4a 45 43 54 2c 20 32 2c 20 30 29 3b 0a 20 20 20  JECT, 2, 0);.   
6090: 20 20 20 69 4c 61 62 65 6c 20 3d 20 6a 73 6f 6e     iLabel = json
60a0: 50 61 72 73 65 41 64 64 4e 6f 64 65 28 70 50 61  ParseAddNode(pPa
60b0: 72 73 65 2c 20 4a 53 4f 4e 5f 53 54 52 49 4e 47  rse, JSON_STRING
60c0: 2c 20 69 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20  , i, zPath);.   
60d0: 20 20 20 7a 50 61 74 68 20 2b 3d 20 69 3b 0a 20     zPath += i;. 
60e0: 20 20 20 20 20 70 4e 6f 64 65 20 3d 20 6a 73 6f       pNode = jso
60f0: 6e 4c 6f 6f 6b 75 70 41 70 70 65 6e 64 28 70 50  nLookupAppend(pP
6100: 61 72 73 65 2c 20 7a 50 61 74 68 2c 20 70 41 70  arse, zPath, pAp
6110: 6e 64 2c 20 70 7a 45 72 72 29 3b 0a 20 20 20 20  nd, pzErr);.    
6120: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6f 6f    if( pParse->oo
6130: 6d 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  m ) return 0;.  
6140: 20 20 20 20 69 66 28 20 70 4e 6f 64 65 20 29 7b      if( pNode ){
6150: 0a 20 20 20 20 20 20 20 20 70 52 6f 6f 74 20 3d  .        pRoot =
6160: 20 26 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65 5b   &pParse->aNode[
6170: 69 52 6f 6f 74 5d 3b 0a 20 20 20 20 20 20 20 20  iRoot];.        
6180: 70 52 6f 6f 74 2d 3e 75 2e 69 41 70 70 65 6e 64  pRoot->u.iAppend
6190: 20 3d 20 69 53 74 61 72 74 20 2d 20 69 52 6f 6f   = iStart - iRoo
61a0: 74 3b 0a 20 20 20 20 20 20 20 20 70 52 6f 6f 74  t;.        pRoot
61b0: 2d 3e 6a 6e 46 6c 61 67 73 20 7c 3d 20 4a 4e 4f  ->jnFlags |= JNO
61c0: 44 45 5f 41 50 50 45 4e 44 3b 0a 20 20 20 20 20  DE_APPEND;.     
61d0: 20 20 20 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65     pParse->aNode
61e0: 5b 69 4c 61 62 65 6c 5d 2e 6a 6e 46 6c 61 67 73  [iLabel].jnFlags
61f0: 20 7c 3d 20 4a 4e 4f 44 45 5f 52 41 57 3b 0a 20   |= JNODE_RAW;. 
6200: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
6210: 75 72 6e 20 70 4e 6f 64 65 3b 0a 20 20 20 20 7d  urn pNode;.    }
6220: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 50 61  .  }else if( zPa
6230: 74 68 5b 30 5d 3d 3d 27 5b 27 20 26 26 20 69 73  th[0]=='[' && is
6240: 64 69 67 69 74 28 7a 50 61 74 68 5b 31 5d 29 20  digit(zPath[1]) 
6250: 29 7b 0a 20 20 20 20 69 66 28 20 70 52 6f 6f 74  ){.    if( pRoot
6260: 2d 3e 65 54 79 70 65 21 3d 4a 53 4f 4e 5f 41 52  ->eType!=JSON_AR
6270: 52 41 59 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  RAY ) return 0;.
6280: 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 20 20 7a      i = 0;.    z
6290: 50 61 74 68 2b 2b 3b 0a 20 20 20 20 77 68 69 6c  Path++;.    whil
62a0: 65 28 20 69 73 64 69 67 69 74 28 7a 50 61 74 68  e( isdigit(zPath
62b0: 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 69 20  [0]) ){.      i 
62c0: 3d 20 69 2a 31 30 20 2b 20 7a 50 61 74 68 5b 30  = i*10 + zPath[0
62d0: 5d 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 7a  ] - '0';.      z
62e0: 50 61 74 68 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Path++;.    }.  
62f0: 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d 21 3d    if( zPath[0]!=
6300: 27 5d 27 20 29 7b 0a 20 20 20 20 20 20 2a 70 7a  ']' ){.      *pz
6310: 45 72 72 20 3d 20 7a 50 61 74 68 3b 0a 20 20 20  Err = zPath;.   
6320: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
6330: 20 7d 0a 20 20 20 20 7a 50 61 74 68 2b 2b 3b 0a   }.    zPath++;.
6340: 20 20 20 20 6a 20 3d 20 31 3b 0a 20 20 20 20 66      j = 1;.    f
6350: 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 77 68  or(;;){.      wh
6360: 69 6c 65 28 20 6a 3c 3d 70 52 6f 6f 74 2d 3e 6e  ile( j<=pRoot->n
6370: 20 26 26 20 28 69 3e 30 20 7c 7c 20 28 70 52 6f   && (i>0 || (pRo
6380: 6f 74 5b 6a 5d 2e 6a 6e 46 6c 61 67 73 20 26 20  ot[j].jnFlags & 
6390: 4a 4e 4f 44 45 5f 52 45 4d 4f 56 45 29 21 3d 30  JNODE_REMOVE)!=0
63a0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
63b0: 20 28 70 52 6f 6f 74 5b 6a 5d 2e 6a 6e 46 6c 61   (pRoot[j].jnFla
63c0: 67 73 20 26 20 4a 4e 4f 44 45 5f 52 45 4d 4f 56  gs & JNODE_REMOV
63d0: 45 29 3d 3d 30 20 29 20 69 2d 2d 3b 0a 20 20 20  E)==0 ) i--;.   
63e0: 20 20 20 20 20 6a 20 2b 3d 20 6a 73 6f 6e 4e 6f       j += jsonNo
63f0: 64 65 53 69 7a 65 28 26 70 52 6f 6f 74 5b 6a 5d  deSize(&pRoot[j]
6400: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
6410: 20 69 66 28 20 28 70 52 6f 6f 74 2d 3e 6a 6e 46   if( (pRoot->jnF
6420: 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 41 50 50  lags & JNODE_APP
6430: 45 4e 44 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  END)==0 ) break;
6440: 0a 20 20 20 20 20 20 69 52 6f 6f 74 20 2b 3d 20  .      iRoot += 
6450: 70 52 6f 6f 74 2d 3e 75 2e 69 41 70 70 65 6e 64  pRoot->u.iAppend
6460: 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 20 3d 20  ;.      pRoot = 
6470: 26 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65 5b 69  &pParse->aNode[i
6480: 52 6f 6f 74 5d 3b 0a 20 20 20 20 20 20 6a 20 3d  Root];.      j =
6490: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
64a0: 28 20 6a 3c 3d 70 52 6f 6f 74 2d 3e 6e 20 29 7b  ( j<=pRoot->n ){
64b0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6a 73  .      return js
64c0: 6f 6e 4c 6f 6f 6b 75 70 53 74 65 70 28 70 50 61  onLookupStep(pPa
64d0: 72 73 65 2c 20 69 52 6f 6f 74 2b 6a 2c 20 7a 50  rse, iRoot+j, zP
64e0: 61 74 68 2c 20 70 41 70 6e 64 2c 20 70 7a 45 72  ath, pApnd, pzEr
64f0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  r);.    }.    if
6500: 28 20 69 3d 3d 30 20 26 26 20 70 41 70 6e 64 20  ( i==0 && pApnd 
6510: 29 7b 0a 20 20 20 20 20 20 75 33 32 20 69 53 74  ){.      u32 iSt
6520: 61 72 74 3b 0a 20 20 20 20 20 20 4a 73 6f 6e 4e  art;.      JsonN
6530: 6f 64 65 20 2a 70 4e 6f 64 65 3b 0a 20 20 20 20  ode *pNode;.    
6540: 20 20 69 53 74 61 72 74 20 3d 20 6a 73 6f 6e 50    iStart = jsonP
6550: 61 72 73 65 41 64 64 4e 6f 64 65 28 70 50 61 72  arseAddNode(pPar
6560: 73 65 2c 20 4a 53 4f 4e 5f 41 52 52 41 59 2c 20  se, JSON_ARRAY, 
6570: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 6f  1, 0);.      pNo
6580: 64 65 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 41  de = jsonLookupA
6590: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 7a 50  ppend(pParse, zP
65a0: 61 74 68 2c 20 70 41 70 6e 64 2c 20 70 7a 45 72  ath, pApnd, pzEr
65b0: 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  r);.      if( pP
65c0: 61 72 73 65 2d 3e 6f 6f 6d 20 29 20 72 65 74 75  arse->oom ) retu
65d0: 72 6e 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20  rn 0;.      if( 
65e0: 70 4e 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  pNode ){.       
65f0: 20 70 52 6f 6f 74 20 3d 20 26 70 50 61 72 73 65   pRoot = &pParse
6600: 2d 3e 61 4e 6f 64 65 5b 69 52 6f 6f 74 5d 3b 0a  ->aNode[iRoot];.
6610: 20 20 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 75          pRoot->u
6620: 2e 69 41 70 70 65 6e 64 20 3d 20 69 53 74 61 72  .iAppend = iStar
6630: 74 20 2d 20 69 52 6f 6f 74 3b 0a 20 20 20 20 20  t - iRoot;.     
6640: 20 20 20 70 52 6f 6f 74 2d 3e 6a 6e 46 6c 61 67     pRoot->jnFlag
6650: 73 20 7c 3d 20 4a 4e 4f 44 45 5f 41 50 50 45 4e  s |= JNODE_APPEN
6660: 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  D;.      }.     
6670: 20 72 65 74 75 72 6e 20 70 4e 6f 64 65 3b 0a 20   return pNode;. 
6680: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
6690: 20 7a 50 61 74 68 5b 30 5d 21 3d 30 20 29 7b 0a   zPath[0]!=0 ){.
66a0: 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 7a 50 61      *pzErr = zPa
66b0: 74 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  th;.  }.  return
66c0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70   0;.}../*.** App
66d0: 65 6e 64 20 63 6f 6e 74 65 6e 74 20 74 6f 20 70  end content to p
66e0: 50 61 72 73 65 20 74 68 61 74 20 77 69 6c 6c 20  Parse that will 
66f0: 63 6f 6d 70 6c 65 74 65 20 7a 50 61 74 68 2e 20  complete zPath. 
6700: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
6710: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 69 6e 73 65  r.** to the inse
6720: 72 74 65 64 20 6e 6f 64 65 2c 20 6f 72 20 72 65  rted node, or re
6730: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65  turn NULL if the
6740: 20 61 70 70 65 6e 64 20 66 61 69 6c 73 2e 0a 2a   append fails..*
6750: 2f 0a 73 74 61 74 69 63 20 4a 73 6f 6e 4e 6f 64  /.static JsonNod
6760: 65 20 2a 6a 73 6f 6e 4c 6f 6f 6b 75 70 41 70 70  e *jsonLookupApp
6770: 65 6e 64 28 0a 20 20 4a 73 6f 6e 50 61 72 73 65  end(.  JsonParse
6780: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
6790: 20 41 70 70 65 6e 64 20 63 6f 6e 74 65 6e 74 20   Append content 
67a0: 74 6f 20 74 68 65 20 4a 53 4f 4e 20 70 61 72 73  to the JSON pars
67b0: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
67c0: 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 2f 2a  r *zPath,     /*
67d0: 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
67e0: 63 6f 6e 74 65 6e 74 20 74 6f 20 61 70 70 65 6e  content to appen
67f0: 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 70 6e  d */.  int *pApn
6800: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d,            /*
6810: 20 53 65 74 20 74 68 69 73 20 66 6c 61 67 20 74   Set this flag t
6820: 6f 20 31 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  o 1 */.  const c
6830: 68 61 72 20 2a 2a 70 7a 45 72 72 20 20 20 20 20  har **pzErr     
6840: 2f 2a 20 4d 61 6b 65 20 74 68 69 73 20 70 6f 69  /* Make this poi
6850: 6e 74 20 74 6f 20 61 6e 79 20 73 79 6e 74 61 78  nt to any syntax
6860: 20 65 72 72 6f 72 20 2a 2f 0a 29 7b 0a 20 20 2a   error */.){.  *
6870: 70 41 70 6e 64 20 3d 20 31 3b 0a 20 20 69 66 28  pApnd = 1;.  if(
6880: 20 7a 50 61 74 68 5b 30 5d 3d 3d 30 20 29 7b 0a   zPath[0]==0 ){.
6890: 20 20 20 20 6a 73 6f 6e 50 61 72 73 65 41 64 64      jsonParseAdd
68a0: 4e 6f 64 65 28 70 50 61 72 73 65 2c 20 4a 53 4f  Node(pParse, JSO
68b0: 4e 5f 4e 55 4c 4c 2c 20 30 2c 20 30 29 3b 0a 20  N_NULL, 0, 0);. 
68c0: 20 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65     return pParse
68d0: 2d 3e 6f 6f 6d 20 3f 20 30 20 3a 20 26 70 50 61  ->oom ? 0 : &pPa
68e0: 72 73 65 2d 3e 61 4e 6f 64 65 5b 70 50 61 72 73  rse->aNode[pPars
68f0: 65 2d 3e 6e 4e 6f 64 65 2d 31 5d 3b 0a 20 20 7d  e->nNode-1];.  }
6900: 0a 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d  .  if( zPath[0]=
6910: 3d 27 2e 27 20 29 7b 0a 20 20 20 20 6a 73 6f 6e  ='.' ){.    json
6920: 50 61 72 73 65 41 64 64 4e 6f 64 65 28 70 50 61  ParseAddNode(pPa
6930: 72 73 65 2c 20 4a 53 4f 4e 5f 4f 42 4a 45 43 54  rse, JSON_OBJECT
6940: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  , 0, 0);.  }else
6950: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 50 61   if( strncmp(zPa
6960: 74 68 2c 22 5b 30 5d 22 2c 33 29 3d 3d 30 20 29  th,"[0]",3)==0 )
6970: 7b 0a 20 20 20 20 6a 73 6f 6e 50 61 72 73 65 41  {.    jsonParseA
6980: 64 64 4e 6f 64 65 28 70 50 61 72 73 65 2c 20 4a  ddNode(pParse, J
6990: 53 4f 4e 5f 41 52 52 41 59 2c 20 30 2c 20 30 29  SON_ARRAY, 0, 0)
69a0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
69b0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
69c0: 66 28 20 70 50 61 72 73 65 2d 3e 6f 6f 6d 20 29  f( pParse->oom )
69d0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74   return 0;.  ret
69e0: 75 72 6e 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 53 74  urn jsonLookupSt
69f0: 65 70 28 70 50 61 72 73 65 2c 20 70 50 61 72 73  ep(pParse, pPars
6a00: 65 2d 3e 6e 4e 6f 64 65 2d 31 2c 20 7a 50 61 74  e->nNode-1, zPat
6a10: 68 2c 20 70 41 70 6e 64 2c 20 70 7a 45 72 72 29  h, pApnd, pzErr)
6a20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
6a30: 6e 20 74 68 65 20 74 65 78 74 20 6f 66 20 61 20  n the text of a 
6a40: 73 79 6e 74 61 78 20 65 72 72 6f 72 20 6d 65 73  syntax error mes
6a50: 73 61 67 65 20 6f 6e 20 61 20 4a 53 4f 4e 20 70  sage on a JSON p
6a60: 61 74 68 2e 20 20 53 70 61 63 65 20 69 73 0a 2a  ath.  Space is.*
6a70: 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  * obtained from 
6a80: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
6a90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
6aa0: 20 2a 6a 73 6f 6e 50 61 74 68 53 79 6e 74 61 78   *jsonPathSyntax
6ab0: 45 72 72 6f 72 28 63 6f 6e 73 74 20 63 68 61 72  Error(const char
6ac0: 20 2a 7a 45 72 72 29 7b 0a 20 20 72 65 74 75 72   *zErr){.  retur
6ad0: 6e 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  n sqlite3_mprint
6ae0: 66 28 22 4a 53 4f 4e 20 70 61 74 68 20 65 72 72  f("JSON path err
6af0: 6f 72 20 6e 65 61 72 20 27 25 71 27 22 2c 20 7a  or near '%q'", z
6b00: 45 72 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  Err);.}../*.** D
6b10: 6f 20 61 20 6e 6f 64 65 20 6c 6f 6f 6b 75 70 20  o a node lookup 
6b20: 75 73 69 6e 67 20 7a 50 61 74 68 2e 20 20 52 65  using zPath.  Re
6b30: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
6b40: 6f 20 74 68 65 20 6e 6f 64 65 20 6f 6e 20 73 75  o the node on su
6b50: 63 63 65 73 73 2e 0a 2a 2a 20 52 65 74 75 72 6e  ccess..** Return
6b60: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
6b70: 6e 64 20 6f 72 20 69 66 20 74 68 65 72 65 20 69  nd or if there i
6b80: 73 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  s an error..**.*
6b90: 2a 20 4f 6e 20 61 6e 20 65 72 72 6f 72 2c 20 77  * On an error, w
6ba0: 72 69 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  rite an error me
6bb0: 73 73 61 67 65 20 69 6e 74 6f 20 70 43 74 78 20  ssage into pCtx 
6bc0: 61 6e 64 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  and increment th
6bd0: 65 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 6e 45 72  e.** pParse->nEr
6be0: 72 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  r counter..**.**
6bf0: 20 49 66 20 70 41 70 6e 64 21 3d 4e 55 4c 4c 20   If pApnd!=NULL 
6c00: 74 68 65 6e 20 74 72 79 20 74 6f 20 61 70 70 65  then try to appe
6c10: 6e 64 20 6d 69 73 73 69 6e 67 20 6e 6f 64 65 73  nd missing nodes
6c20: 20 61 6e 64 20 73 65 74 20 2a 70 41 70 6e 64 20   and set *pApnd 
6c30: 3d 20 31 20 69 66 0a 2a 2a 20 6e 6f 64 65 73 20  = 1 if.** nodes 
6c40: 61 72 65 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2a  are appended..**
6c50: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 74 68 20  .** If the path 
6c60: 73 74 61 72 74 73 20 77 69 74 68 20 24 24 20 74  starts with $$ t
6c70: 68 65 6e 20 73 65 74 20 2a 70 46 6c 61 67 73 20  hen set *pFlags 
6c80: 74 6f 20 4a 4e 4f 44 45 5f 52 45 50 4c 41 43 45  to JNODE_REPLACE
6c90: 7c 4a 4e 4f 44 45 5f 4a 53 4f 4e 0a 2a 2a 20 61  |JNODE_JSON.** a
6ca0: 73 20 61 20 73 69 6e 67 6c 65 20 74 6f 20 74 68  s a single to th
6cb0: 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20 74 68  e caller that th
6cc0: 65 20 69 6e 70 75 74 20 74 65 78 74 20 74 6f 20  e input text to 
6cd0: 62 65 20 69 6e 73 65 72 74 65 64 20 73 68 6f 75  be inserted shou
6ce0: 6c 64 20 62 65 20 0a 2a 2a 20 69 6e 74 65 72 70  ld be .** interp
6cf0: 72 65 74 65 64 20 61 73 20 4a 53 4f 4e 20 72 61  reted as JSON ra
6d00: 74 68 65 72 20 74 68 61 6e 20 61 73 20 6f 72 64  ther than as ord
6d10: 69 6e 61 72 79 20 74 65 78 74 2e 0a 2a 2f 0a 73  inary text..*/.s
6d20: 74 61 74 69 63 20 4a 73 6f 6e 4e 6f 64 65 20 2a  tatic JsonNode *
6d30: 6a 73 6f 6e 4c 6f 6f 6b 75 70 28 0a 20 20 4a 73  jsonLookup(.  Js
6d40: 6f 6e 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  onParse *pParse,
6d50: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4a 53 4f        /* The JSO
6d60: 4e 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  N to search */. 
6d70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
6d80: 74 68 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  th,      /* The 
6d90: 70 61 74 68 20 74 6f 20 73 65 61 72 63 68 20 2a  path to search *
6da0: 2f 0a 20 20 69 6e 74 20 2a 70 41 70 6e 64 2c 20  /.  int *pApnd, 
6db0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
6dc0: 70 70 65 6e 64 20 6e 6f 64 65 73 20 74 6f 20 63  ppend nodes to c
6dd0: 6f 6d 70 6c 65 74 65 20 70 61 74 68 20 69 66 20  omplete path if 
6de0: 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20 73 71  not NULL */.  sq
6df0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
6e00: 43 74 78 2c 20 20 2f 2a 20 52 65 70 6f 72 74 20  Ctx,  /* Report 
6e10: 65 72 72 6f 72 73 20 68 65 72 65 2c 20 69 66 20  errors here, if 
6e20: 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20 75 38  not NULL */.  u8
6e30: 20 2a 70 46 6c 61 67 73 20 20 20 20 20 20 20 20   *pFlags        
6e40: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 4a        /* Write J
6e50: 4e 4f 44 45 5f 52 45 50 4c 41 43 45 20 6f 72 20  NODE_REPLACE or 
6e60: 5f 52 45 50 4c 41 43 45 7c 5f 4a 53 4f 4e 20 68  _REPLACE|_JSON h
6e70: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ere */.){.  cons
6e80: 74 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30  t char *zErr = 0
6e90: 3b 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e  ;.  JsonNode *pN
6ea0: 6f 64 65 20 3d 20 30 3b 0a 20 20 75 38 20 66 67  ode = 0;.  u8 fg
6eb0: 20 3d 20 4a 4e 4f 44 45 5f 52 45 50 4c 41 43 45   = JNODE_REPLACE
6ec0: 3b 0a 0a 20 20 69 66 28 20 7a 50 61 74 68 3d 3d  ;..  if( zPath==
6ed0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
6ee0: 69 66 28 20 7a 50 61 74 68 5b 30 5d 21 3d 27 24  if( zPath[0]!='$
6ef0: 27 20 29 7b 0a 20 20 20 20 7a 45 72 72 20 3d 20  ' ){.    zErr = 
6f00: 7a 50 61 74 68 3b 0a 20 20 20 20 67 6f 74 6f 20  zPath;.    goto 
6f10: 6c 6f 6f 6b 75 70 5f 65 72 72 3b 0a 20 20 7d 0a  lookup_err;.  }.
6f20: 20 20 7a 50 61 74 68 2b 2b 3b 0a 20 20 69 66 28    zPath++;.  if(
6f30: 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 24 27 20 29   zPath[0]=='$' )
6f40: 7b 0a 20 20 20 20 69 66 28 20 70 46 6c 61 67 73  {.    if( pFlags
6f50: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 45 72  ==0 ){.      zEr
6f60: 72 20 3d 20 7a 50 61 74 68 3b 0a 20 20 20 20 20  r = zPath;.     
6f70: 20 67 6f 74 6f 20 6c 6f 6f 6b 75 70 5f 65 72 72   goto lookup_err
6f80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 50 61 74  ;.    }.    zPat
6f90: 68 2b 2b 3b 0a 20 20 20 20 66 67 20 3d 20 4a 4e  h++;.    fg = JN
6fa0: 4f 44 45 5f 52 45 50 4c 41 43 45 7c 4a 4e 4f 44  ODE_REPLACE|JNOD
6fb0: 45 5f 4a 53 4f 4e 3b 0a 20 20 7d 0a 20 20 69 66  E_JSON;.  }.  if
6fc0: 28 20 70 46 6c 61 67 73 20 29 20 2a 70 46 6c 61  ( pFlags ) *pFla
6fd0: 67 73 20 3d 20 66 67 3b 0a 20 20 70 4e 6f 64 65  gs = fg;.  pNode
6fe0: 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 53 74 65   = jsonLookupSte
6ff0: 70 28 70 50 61 72 73 65 2c 20 30 2c 20 7a 50 61  p(pParse, 0, zPa
7000: 74 68 2c 20 70 41 70 6e 64 2c 20 26 7a 45 72 72  th, pApnd, &zErr
7010: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 6f 64  );.  return pNod
7020: 65 3b 0a 0a 6c 6f 6f 6b 75 70 5f 65 72 72 3a 0a  e;..lookup_err:.
7030: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
7040: 3b 0a 20 20 69 66 28 20 7a 45 72 72 21 3d 30 20  ;.  if( zErr!=0 
7050: 26 26 20 70 43 74 78 21 3d 30 20 29 7b 0a 20 20  && pCtx!=0 ){.  
7060: 20 20 63 68 61 72 20 2a 7a 20 3d 20 6a 73 6f 6e    char *z = json
7070: 50 61 74 68 53 79 6e 74 61 78 45 72 72 6f 72 28  PathSyntaxError(
7080: 7a 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20 7a  zErr);.    if( z
7090: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
70a0: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70  3_result_error(p
70b0: 43 74 78 2c 20 7a 2c 20 2d 31 29 3b 0a 20 20 20  Ctx, z, -1);.   
70c0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
70d0: 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  z);.    }else{. 
70e0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
70f0: 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28  ult_error_nomem(
7100: 70 43 74 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pCtx);.    }.  }
7110: 0a 20 20 69 66 28 20 70 46 6c 61 67 73 20 29 20  .  if( pFlags ) 
7120: 2a 70 46 6c 61 67 73 20 3d 20 66 67 3b 0a 20 20  *pFlags = fg;.  
7130: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a  return 0;.}.../*
7140: 0a 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20 77  .** Report the w
7150: 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61  rong number of a
7160: 72 67 75 6d 65 6e 74 73 20 66 6f 72 20 6a 73 6f  rguments for jso
7170: 6e 5f 69 6e 73 65 72 74 28 29 2c 20 6a 73 6f 6e  n_insert(), json
7180: 5f 72 65 70 6c 61 63 65 28 29 0a 2a 2a 20 6f 72  _replace().** or
7190: 20 6a 73 6f 6e 5f 73 65 74 28 29 2e 0a 2a 2f 0a   json_set()..*/.
71a0: 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e  static void json
71b0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 0a 20 20  WrongNumArgs(.  
71c0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
71d0: 2a 70 43 74 78 2c 0a 20 20 63 6f 6e 73 74 20 63  *pCtx,.  const c
71e0: 68 61 72 20 2a 7a 46 75 6e 63 4e 61 6d 65 0a 29  har *zFuncName.)
71f0: 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d  {.  char *zMsg =
7200: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
7210: 28 22 6a 73 6f 6e 5f 25 73 28 29 20 6e 65 65 64  ("json_%s() need
7220: 73 20 61 6e 20 6f 64 64 20 6e 75 6d 62 65 72 20  s an odd number 
7230: 6f 66 20 61 72 67 75 6d 65 6e 74 73 22 2c 0a 20  of arguments",. 
7240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 46                zF
7260: 75 6e 63 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  uncName);.  sqli
7270: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
7280: 28 70 43 74 78 2c 20 7a 4d 73 67 2c 20 2d 31 29  (pCtx, zMsg, -1)
7290: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
72a0: 28 7a 4d 73 67 29 3b 20 20 20 20 20 0a 7d 0a 0a  (zMsg);     .}..
72b0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
72c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
72d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
72e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
72f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
7300: 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20  * SQL functions 
7310: 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
7320: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 0a 2a   and debugging.*
7330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69  ***********/..#i
7380: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
7390: 47 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 73 6f 6e  G./*.** The json
73a0: 5f 70 61 72 73 65 28 4a 53 4f 4e 29 20 66 75 6e  _parse(JSON) fun
73b0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20  ction returns a 
73c0: 73 74 72 69 6e 67 20 77 68 69 63 68 20 64 65 73  string which des
73d0: 63 72 69 62 65 73 0a 2a 2a 20 61 20 70 61 72 73  cribes.** a pars
73e0: 65 20 6f 66 20 74 68 65 20 4a 53 4f 4e 20 70 72  e of the JSON pr
73f0: 6f 76 69 64 65 64 2e 20 20 4f 72 20 69 74 20 72  ovided.  Or it r
7400: 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 4a  eturns NULL if J
7410: 53 4f 4e 20 69 73 20 6e 6f 74 0a 2a 2a 20 77 65  SON is not.** we
7420: 6c 6c 2d 66 6f 72 6d 65 64 2e 0a 2a 2f 0a 73 74  ll-formed..*/.st
7430: 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 50 61  atic void jsonPa
7440: 72 73 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  rseFunc(.  sqlit
7450: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c  e3_context *ctx,
7460: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
7470: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
7480: 72 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e 53 74 72  rgv.){.  JsonStr
7490: 69 6e 67 20 73 3b 20 20 20 20 20 20 20 2f 2a 20  ing s;       /* 
74a0: 4f 75 74 70 75 74 20 73 74 72 69 6e 67 20 2d 20  Output string - 
74b0: 6e 6f 74 20 72 65 61 6c 20 4a 53 4f 4e 20 2a 2f  not real JSON */
74c0: 0a 20 20 4a 73 6f 6e 50 61 72 73 65 20 78 3b 20  .  JsonParse x; 
74d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
74e0: 72 73 65 20 2a 2f 0a 20 20 75 33 32 20 69 3b 0a  rse */.  u32 i;.
74f0: 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63 3d  .  assert( argc=
7500: 3d 31 20 29 3b 0a 20 20 69 66 28 20 6a 73 6f 6e  =1 );.  if( json
7510: 50 61 72 73 65 28 26 78 2c 20 63 74 78 2c 20 28  Parse(&x, ctx, (
7520: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
7530: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
7540: 72 67 76 5b 30 5d 29 29 20 29 20 72 65 74 75 72  rgv[0])) ) retur
7550: 6e 3b 0a 20 20 6a 73 6f 6e 50 61 72 73 65 46 69  n;.  jsonParseFi
7560: 6e 64 50 61 72 65 6e 74 73 28 26 78 29 3b 0a 20  ndParents(&x);. 
7570: 20 6a 73 6f 6e 49 6e 69 74 28 26 73 2c 20 63 74   jsonInit(&s, ct
7580: 78 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  x);.  for(i=0; i
7590: 3c 78 2e 6e 4e 6f 64 65 3b 20 69 2b 2b 29 7b 0a  <x.nNode; i++){.
75a0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
75b0: 7a 54 79 70 65 3b 0a 20 20 20 20 69 66 28 20 78  zType;.    if( x
75c0: 2e 61 4e 6f 64 65 5b 69 5d 2e 6a 6e 46 6c 61 67  .aNode[i].jnFlag
75d0: 73 20 26 20 4a 4e 4f 44 45 5f 4c 41 42 45 4c 20  s & JNODE_LABEL 
75e0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
75f0: 20 78 2e 61 4e 6f 64 65 5b 69 5d 2e 65 54 79 70   x.aNode[i].eTyp
7600: 65 3d 3d 4a 53 4f 4e 5f 53 54 52 49 4e 47 20 29  e==JSON_STRING )
7610: 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  ;.      zType = 
7620: 22 6c 61 62 65 6c 22 3b 0a 20 20 20 20 7d 65 6c  "label";.    }el
7630: 73 65 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20  se{.      zType 
7640: 3d 20 6a 73 6f 6e 54 79 70 65 5b 78 2e 61 4e 6f  = jsonType[x.aNo
7650: 64 65 5b 69 5d 2e 65 54 79 70 65 5d 3b 0a 20 20  de[i].eType];.  
7660: 20 20 7d 0a 20 20 20 20 6a 73 6f 6e 50 72 69 6e    }.    jsonPrin
7670: 74 66 28 31 30 30 2c 20 26 73 2c 22 6e 6f 64 65  tf(100, &s,"node
7680: 20 25 33 75 3a 20 25 37 73 20 6e 3d 25 2d 34 64   %3u: %7s n=%-4d
7690: 20 75 70 3d 25 2d 34 64 22 2c 0a 20 20 20 20 20   up=%-4d",.     
76a0: 20 20 20 20 20 20 20 20 20 20 69 2c 20 7a 54 79            i, zTy
76b0: 70 65 2c 20 78 2e 61 4e 6f 64 65 5b 69 5d 2e 6e  pe, x.aNode[i].n
76c0: 2c 20 78 2e 61 55 70 5b 69 5d 29 3b 0a 20 20 20  , x.aUp[i]);.   
76d0: 20 69 66 28 20 78 2e 61 4e 6f 64 65 5b 69 5d 2e   if( x.aNode[i].
76e0: 75 2e 7a 4a 43 6f 6e 74 65 6e 74 21 3d 30 20 29  u.zJContent!=0 )
76f0: 7b 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65  {.      jsonAppe
7700: 6e 64 52 61 77 28 26 73 2c 20 22 20 22 2c 20 31  ndRaw(&s, " ", 1
7710: 29 3b 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70 70  );.      jsonApp
7720: 65 6e 64 52 61 77 28 26 73 2c 20 78 2e 61 4e 6f  endRaw(&s, x.aNo
7730: 64 65 5b 69 5d 2e 75 2e 7a 4a 43 6f 6e 74 65 6e  de[i].u.zJConten
7740: 74 2c 20 78 2e 61 4e 6f 64 65 5b 69 5d 2e 6e 29  t, x.aNode[i].n)
7750: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 73 6f 6e  ;.    }.    json
7760: 41 70 70 65 6e 64 52 61 77 28 26 73 2c 20 22 5c  AppendRaw(&s, "\
7770: 6e 22 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 6a 73  n", 1);.  }.  js
7780: 6f 6e 50 61 72 73 65 52 65 73 65 74 28 26 78 29  onParseReset(&x)
7790: 3b 0a 20 20 6a 73 6f 6e 52 65 73 75 6c 74 28 26  ;.  jsonResult(&
77a0: 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  s);.}../*.** The
77b0: 20 6a 73 6f 6e 5f 74 65 73 74 31 28 4a 53 4f 4e   json_test1(JSON
77c0: 29 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 73 65  ) function parse
77d0: 73 20 61 6e 64 20 72 65 62 75 69 6c 64 73 20 74  s and rebuilds t
77e0: 68 65 20 4a 53 4f 4e 20 73 74 72 69 6e 67 2e 0a  he JSON string..
77f0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a  */.static void j
7800: 73 6f 6e 54 65 73 74 31 46 75 6e 63 28 0a 20 20  sonTest1Func(.  
7810: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
7820: 2a 63 74 78 2c 0a 20 20 69 6e 74 20 61 72 67 63  *ctx,.  int argc
7830: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
7840: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 4a 73  e **argv.){.  Js
7850: 6f 6e 50 61 72 73 65 20 78 3b 20 20 2f 2a 20 54  onParse x;  /* T
7860: 68 65 20 70 61 72 73 65 20 2a 2f 0a 20 20 69 66  he parse */.  if
7870: 28 20 6a 73 6f 6e 50 61 72 73 65 28 26 78 2c 20  ( jsonParse(&x, 
7880: 63 74 78 2c 20 28 63 6f 6e 73 74 20 63 68 61 72  ctx, (const char
7890: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
78a0: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 29 20 29  text(argv[0])) )
78b0: 20 72 65 74 75 72 6e 3b 0a 20 20 6a 73 6f 6e 52   return;.  jsonR
78c0: 65 74 75 72 6e 4a 73 6f 6e 28 78 2e 61 4e 6f 64  eturnJson(x.aNod
78d0: 65 2c 20 63 74 78 2c 20 30 29 3b 0a 20 20 6a 73  e, ctx, 0);.  js
78e0: 6f 6e 50 61 72 73 65 52 65 73 65 74 28 26 78 29  onParseReset(&x)
78f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
7900: 73 6f 6e 5f 6e 6f 64 65 63 6f 75 6e 74 28 4a 53  son_nodecount(JS
7910: 4f 4e 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  ON) function ret
7920: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
7930: 6f 66 20 6e 6f 64 65 73 20 69 6e 20 74 68 65 0a  of nodes in the.
7940: 2a 2a 20 69 6e 70 75 74 20 4a 53 4f 4e 20 73 74  ** input JSON st
7950: 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ring..*/.static 
7960: 76 6f 69 64 20 6a 73 6f 6e 4e 6f 64 65 43 6f 75  void jsonNodeCou
7970: 6e 74 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  ntFunc(.  sqlite
7980: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 0a  3_context *ctx,.
7990: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
79a0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
79b0: 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e 50 61 72 73  gv.){.  JsonPars
79c0: 65 20 78 3b 20 20 2f 2a 20 54 68 65 20 70 61 72  e x;  /* The par
79d0: 73 65 20 2a 2f 0a 20 20 69 66 28 20 6a 73 6f 6e  se */.  if( json
79e0: 50 61 72 73 65 28 26 78 2c 20 63 74 78 2c 20 28  Parse(&x, ctx, (
79f0: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
7a00: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
7a10: 72 67 76 5b 30 5d 29 29 20 29 20 72 65 74 75 72  rgv[0])) ) retur
7a20: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  n;.  sqlite3_res
7a30: 75 6c 74 5f 69 6e 74 36 34 28 63 74 78 2c 20 28  ult_int64(ctx, (
7a40: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 78 2e  sqlite3_int64)x.
7a50: 6e 4e 6f 64 65 29 3b 0a 20 20 6a 73 6f 6e 50 61  nNode);.  jsonPa
7a60: 72 73 65 52 65 73 65 74 28 26 78 29 3b 0a 7d 0a  rseReset(&x);.}.
7a70: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
7a80: 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 2a 2a 2a  _DEBUG */../****
7a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ad0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 53 51 4c 20  ********.** SQL 
7ae0: 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65  function impleme
7af0: 6e 74 61 74 69 6f 6e 73 0a 2a 2a 2a 2a 2a 2a 2a  ntations.*******
7b00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7b10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7b20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7b30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7b40: 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d  *****/../*.** Im
7b50: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
7b60: 74 68 65 20 6a 73 6f 6e 5f 61 72 72 61 79 28 56  the json_array(V
7b70: 41 4c 55 45 2c 2e 2e 2e 29 20 66 75 6e 63 74 69  ALUE,...) functi
7b80: 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 20 4a 53  on.  Return a JS
7b90: 4f 4e 0a 2a 2a 20 61 72 72 61 79 20 74 68 61 74  ON.** array that
7ba0: 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 76 61   contains all va
7bb0: 6c 75 65 73 20 67 69 76 65 6e 20 69 6e 20 61 72  lues given in ar
7bc0: 67 75 6d 65 6e 74 73 2e 20 20 4f 72 20 69 66 20  guments.  Or if 
7bd0: 61 6e 79 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  any argument.** 
7be0: 69 73 20 61 20 42 4c 4f 42 2c 20 74 68 72 6f 77  is a BLOB, throw
7bf0: 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74   an error..*/.st
7c00: 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 41 72  atic void jsonAr
7c10: 72 61 79 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  rayFunc(.  sqlit
7c20: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c  e3_context *ctx,
7c30: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
7c40: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
7c50: 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  rgv.){.  int i;.
7c60: 20 20 4a 73 6f 6e 53 74 72 69 6e 67 20 6a 78 3b    JsonString jx;
7c70: 0a 0a 20 20 6a 73 6f 6e 49 6e 69 74 28 26 6a 78  ..  jsonInit(&jx
7c80: 2c 20 63 74 78 29 3b 0a 20 20 6a 73 6f 6e 41 70  , ctx);.  jsonAp
7c90: 70 65 6e 64 43 68 61 72 28 26 6a 78 2c 20 27 5b  pendChar(&jx, '[
7ca0: 27 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ');.  for(i=0; i
7cb0: 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <argc; i++){.   
7cc0: 20 6a 73 6f 6e 41 70 70 65 6e 64 53 65 70 61 72   jsonAppendSepar
7cd0: 61 74 6f 72 28 26 6a 78 29 3b 0a 20 20 20 20 6a  ator(&jx);.    j
7ce0: 73 6f 6e 41 70 70 65 6e 64 56 61 6c 75 65 28 26  sonAppendValue(&
7cf0: 6a 78 2c 20 61 72 67 76 5b 69 5d 2c 20 30 29 3b  jx, argv[i], 0);
7d00: 0a 20 20 7d 0a 20 20 6a 73 6f 6e 41 70 70 65 6e  .  }.  jsonAppen
7d10: 64 43 68 61 72 28 26 6a 78 2c 20 27 5d 27 29 3b  dChar(&jx, ']');
7d20: 0a 20 20 6a 73 6f 6e 52 65 73 75 6c 74 28 26 6a  .  jsonResult(&j
7d30: 78 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 6a 73  x);.}.../*.** js
7d40: 6f 6e 5f 61 72 72 61 79 5f 6c 65 6e 67 74 68 28  on_array_length(
7d50: 4a 53 4f 4e 29 0a 2a 2a 20 6a 73 6f 6e 5f 61 72  JSON).** json_ar
7d60: 72 61 79 5f 6c 65 6e 67 74 68 28 4a 53 4f 4e 2c  ray_length(JSON,
7d70: 20 50 41 54 48 29 0a 2a 2a 0a 2a 2a 20 52 65 74   PATH).**.** Ret
7d80: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
7d90: 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  f elements in th
7da0: 65 20 74 6f 70 2d 6c 65 76 65 6c 20 4a 53 4f 4e  e top-level JSON
7db0: 20 61 72 72 61 79 2e 20 20 0a 2a 2a 20 52 65 74   array.  .** Ret
7dc0: 75 72 6e 20 30 20 69 66 20 74 68 65 20 69 6e 70  urn 0 if the inp
7dd0: 75 74 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c  ut is not a well
7de0: 2d 66 6f 72 6d 65 64 20 4a 53 4f 4e 20 61 72 72  -formed JSON arr
7df0: 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ay..*/.static vo
7e00: 69 64 20 6a 73 6f 6e 41 72 72 61 79 4c 65 6e 67  id jsonArrayLeng
7e10: 74 68 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  thFunc(.  sqlite
7e20: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 0a  3_context *ctx,.
7e30: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
7e40: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
7e50: 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e 50 61 72 73  gv.){.  JsonPars
7e60: 65 20 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  e x;          /*
7e70: 20 54 68 65 20 70 61 72 73 65 20 2a 2f 0a 20 20   The parse */.  
7e80: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 20  sqlite3_int64 n 
7e90: 3d 20 30 3b 0a 20 20 75 33 32 20 69 3b 0a 0a 20  = 0;.  u32 i;.. 
7ea0: 20 69 66 28 20 6a 73 6f 6e 50 61 72 73 65 28 26   if( jsonParse(&
7eb0: 78 2c 20 63 74 78 2c 20 28 63 6f 6e 73 74 20 63  x, ctx, (const c
7ec0: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
7ed0: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
7ee0: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  ) ) return;.  if
7ef0: 28 20 78 2e 6e 4e 6f 64 65 20 29 7b 0a 20 20 20  ( x.nNode ){.   
7f00: 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65   JsonNode *pNode
7f10: 3b 0a 20 20 20 20 69 66 28 20 61 72 67 63 3d 3d  ;.    if( argc==
7f20: 32 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  2 ){.      const
7f30: 20 63 68 61 72 20 2a 7a 50 61 74 68 20 3d 20 28   char *zPath = (
7f40: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
7f50: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
7f60: 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 20 20 70  rgv[1]);.      p
7f70: 4e 6f 64 65 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75  Node = jsonLooku
7f80: 70 28 26 78 2c 20 7a 50 61 74 68 2c 20 30 2c 20  p(&x, zPath, 0, 
7f90: 63 74 78 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  ctx, 0);.    }el
7fa0: 73 65 7b 0a 20 20 20 20 20 20 70 4e 6f 64 65 20  se{.      pNode 
7fb0: 3d 20 78 2e 61 4e 6f 64 65 3b 0a 20 20 20 20 7d  = x.aNode;.    }
7fc0: 0a 20 20 20 20 69 66 28 20 70 4e 6f 64 65 3d 3d  .    if( pNode==
7fd0: 30 20 29 7b 0a 20 20 20 20 20 20 78 2e 6e 45 72  0 ){.      x.nEr
7fe0: 72 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  r = 1;.    }else
7ff0: 20 69 66 28 20 70 4e 6f 64 65 2d 3e 65 54 79 70   if( pNode->eTyp
8000: 65 3d 3d 4a 53 4f 4e 5f 41 52 52 41 59 20 29 7b  e==JSON_ARRAY ){
8010: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
8020: 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73 20 26  pNode->jnFlags &
8030: 20 4a 4e 4f 44 45 5f 41 50 50 45 4e 44 29 3d 3d   JNODE_APPEND)==
8040: 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  0 );.      for(i
8050: 3d 31 3b 20 69 3c 3d 70 4e 6f 64 65 2d 3e 6e 3b  =1; i<=pNode->n;
8060: 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   n++){.        i
8070: 20 2b 3d 20 6a 73 6f 6e 4e 6f 64 65 53 69 7a 65   += jsonNodeSize
8080: 28 26 70 4e 6f 64 65 5b 69 5d 29 3b 0a 20 20 20  (&pNode[i]);.   
8090: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
80a0: 20 69 66 28 20 78 2e 6e 45 72 72 3d 3d 30 20 29   if( x.nErr==0 )
80b0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
80c0: 69 6e 74 36 34 28 63 74 78 2c 20 6e 29 3b 0a 20  int64(ctx, n);. 
80d0: 20 6a 73 6f 6e 50 61 72 73 65 52 65 73 65 74 28   jsonParseReset(
80e0: 26 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 6a 73  &x);.}../*.** js
80f0: 6f 6e 5f 65 78 74 72 61 63 74 28 4a 53 4f 4e 2c  on_extract(JSON,
8100: 20 50 41 54 48 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a   PATH, ...).**.*
8110: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 65 6c 65  * Return the ele
8120: 6d 65 6e 74 20 64 65 73 63 72 69 62 65 64 20 62  ment described b
8130: 79 20 50 41 54 48 2e 20 20 52 65 74 75 72 6e 20  y PATH.  Return 
8140: 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73  NULL if there is
8150: 20 6e 6f 0a 2a 2a 20 50 41 54 48 20 65 6c 65 6d   no.** PATH elem
8160: 65 6e 74 2e 20 20 49 66 20 74 68 65 72 65 20 61  ent.  If there a
8170: 72 65 20 6d 75 6c 74 69 70 6c 65 20 50 41 54 48  re multiple PATH
8180: 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61  s, then return a
8190: 20 4a 53 4f 4e 20 61 72 72 61 79 0a 2a 2a 20 77   JSON array.** w
81a0: 69 74 68 20 74 68 65 20 72 65 73 75 6c 74 20 66  ith the result f
81b0: 72 6f 6d 20 65 61 63 68 20 70 61 74 68 2e 20 20  rom each path.  
81c0: 54 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 20 69  Throw an error i
81d0: 66 20 74 68 65 20 4a 53 4f 4e 20 6f 72 20 61 6e  f the JSON or an
81e0: 79 20 50 41 54 48 0a 2a 2a 20 69 73 20 6d 61 6c  y PATH.** is mal
81f0: 66 6f 72 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  formed..*/.stati
8200: 63 20 76 6f 69 64 20 6a 73 6f 6e 45 78 74 72 61  c void jsonExtra
8210: 63 74 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  ctFunc(.  sqlite
8220: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 0a  3_context *ctx,.
8230: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
8240: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
8250: 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e 50 61 72 73  gv.){.  JsonPars
8260: 65 20 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  e x;          /*
8270: 20 54 68 65 20 70 61 72 73 65 20 2a 2f 0a 20 20   The parse */.  
8280: 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 3b  JsonNode *pNode;
8290: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
82a0: 50 61 74 68 3b 0a 20 20 4a 73 6f 6e 53 74 72 69  Path;.  JsonStri
82b0: 6e 67 20 6a 78 3b 0a 20 20 69 6e 74 20 69 3b 0a  ng jx;.  int i;.
82c0: 0a 20 20 69 66 28 20 61 72 67 63 3c 32 20 29 20  .  if( argc<2 ) 
82d0: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6a 73  return;.  if( js
82e0: 6f 6e 50 61 72 73 65 28 26 78 2c 20 63 74 78 2c  onParse(&x, ctx,
82f0: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
8300: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
8310: 28 61 72 67 76 5b 30 5d 29 29 20 29 20 72 65 74  (argv[0])) ) ret
8320: 75 72 6e 3b 0a 20 20 6a 73 6f 6e 49 6e 69 74 28  urn;.  jsonInit(
8330: 26 6a 78 2c 20 63 74 78 29 3b 0a 20 20 6a 73 6f  &jx, ctx);.  jso
8340: 6e 41 70 70 65 6e 64 43 68 61 72 28 26 6a 78 2c  nAppendChar(&jx,
8350: 20 27 5b 27 29 3b 0a 20 20 66 6f 72 28 69 3d 31   '[');.  for(i=1
8360: 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  ; i<argc; i++){.
8370: 20 20 20 20 7a 50 61 74 68 20 3d 20 28 63 6f 6e      zPath = (con
8380: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
8390: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
83a0: 5b 69 5d 29 3b 0a 20 20 20 20 70 4e 6f 64 65 20  [i]);.    pNode 
83b0: 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 28 26 78 2c  = jsonLookup(&x,
83c0: 20 7a 50 61 74 68 2c 20 30 2c 20 63 74 78 2c 20   zPath, 0, ctx, 
83d0: 30 29 3b 0a 20 20 20 20 69 66 28 20 78 2e 6e 45  0);.    if( x.nE
83e0: 72 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rr ) break;.    
83f0: 69 66 28 20 61 72 67 63 3e 32 20 29 7b 0a 20 20  if( argc>2 ){.  
8400: 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 53 65      jsonAppendSe
8410: 70 61 72 61 74 6f 72 28 26 6a 78 29 3b 0a 20 20  parator(&jx);.  
8420: 20 20 20 20 69 66 28 20 70 4e 6f 64 65 20 29 7b      if( pNode ){
8430: 0a 20 20 20 20 20 20 20 20 6a 73 6f 6e 52 65 6e  .        jsonRen
8440: 64 65 72 4e 6f 64 65 28 70 4e 6f 64 65 2c 20 26  derNode(pNode, &
8450: 6a 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65  jx, 0);.      }e
8460: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6a 73 6f  lse{.        jso
8470: 6e 41 70 70 65 6e 64 52 61 77 28 26 6a 78 2c 20  nAppendRaw(&jx, 
8480: 22 6e 75 6c 6c 22 2c 20 34 29 3b 0a 20 20 20 20  "null", 4);.    
8490: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
84a0: 28 20 70 4e 6f 64 65 20 29 7b 0a 20 20 20 20 20  ( pNode ){.     
84b0: 20 6a 73 6f 6e 52 65 74 75 72 6e 28 70 4e 6f 64   jsonReturn(pNod
84c0: 65 2c 20 63 74 78 2c 20 30 29 3b 0a 20 20 20 20  e, ctx, 0);.    
84d0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 61 72 67 63  }.  }.  if( argc
84e0: 3e 32 20 26 26 20 69 3d 3d 61 72 67 63 20 29 7b  >2 && i==argc ){
84f0: 0a 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 43  .    jsonAppendC
8500: 68 61 72 28 26 6a 78 2c 20 27 5d 27 29 3b 0a 20  har(&jx, ']');. 
8510: 20 20 20 6a 73 6f 6e 52 65 73 75 6c 74 28 26 6a     jsonResult(&j
8520: 78 29 3b 0a 20 20 7d 0a 20 20 6a 73 6f 6e 52 65  x);.  }.  jsonRe
8530: 73 65 74 28 26 6a 78 29 3b 0a 20 20 6a 73 6f 6e  set(&jx);.  json
8540: 50 61 72 73 65 52 65 73 65 74 28 26 78 29 3b 0a  ParseReset(&x);.
8550: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
8560: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a  ntation of the j
8570: 73 6f 6e 5f 6f 62 6a 65 63 74 28 4e 41 4d 45 2c  son_object(NAME,
8580: 56 41 4c 55 45 2c 2e 2e 2e 29 20 66 75 6e 63 74  VALUE,...) funct
8590: 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 20 4a  ion.  Return a J
85a0: 53 4f 4e 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68  SON.** object th
85b0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20  at contains all 
85c0: 6e 61 6d 65 2f 76 61 6c 75 65 20 67 69 76 65 6e  name/value given
85d0: 20 69 6e 20 61 72 67 75 6d 65 6e 74 73 2e 20 20   in arguments.  
85e0: 4f 72 20 69 66 20 61 6e 79 20 6e 61 6d 65 0a 2a  Or if any name.*
85f0: 2a 20 69 73 20 6e 6f 74 20 61 20 73 74 72 69 6e  * is not a strin
8600: 67 20 6f 72 20 69 66 20 61 6e 79 20 76 61 6c 75  g or if any valu
8610: 65 20 69 73 20 61 20 42 4c 4f 42 2c 20 74 68 72  e is a BLOB, thr
8620: 6f 77 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a  ow an error..*/.
8630: 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e  static void json
8640: 4f 62 6a 65 63 74 46 75 6e 63 28 0a 20 20 73 71  ObjectFunc(.  sq
8650: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
8660: 74 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  tx,.  int argc,.
8670: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
8680: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20  **argv.){.  int 
8690: 69 3b 0a 20 20 4a 73 6f 6e 53 74 72 69 6e 67 20  i;.  JsonString 
86a0: 6a 78 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  jx;.  const char
86b0: 20 2a 7a 3b 0a 20 20 75 33 32 20 6e 3b 0a 0a 20   *z;.  u32 n;.. 
86c0: 20 69 66 28 20 61 72 67 63 26 31 20 29 7b 0a 20   if( argc&1 ){. 
86d0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
86e0: 74 5f 65 72 72 6f 72 28 63 74 78 2c 20 22 6a 73  t_error(ctx, "js
86f0: 6f 6e 5f 6f 62 6a 65 63 74 28 29 20 72 65 71 75  on_object() requ
8700: 69 72 65 73 20 61 6e 20 65 76 65 6e 20 6e 75 6d  ires an even num
8710: 62 65 72 20 22 0a 20 20 20 20 20 20 20 20 20 20  ber ".          
8720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8730: 20 20 20 20 20 20 20 20 22 6f 66 20 61 72 67 75          "of argu
8740: 6d 65 6e 74 73 22 2c 20 2d 31 29 3b 0a 20 20 20  ments", -1);.   
8750: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6a   return;.  }.  j
8760: 73 6f 6e 49 6e 69 74 28 26 6a 78 2c 20 63 74 78  sonInit(&jx, ctx
8770: 29 3b 0a 20 20 6a 73 6f 6e 41 70 70 65 6e 64 43  );.  jsonAppendC
8780: 68 61 72 28 26 6a 78 2c 20 27 7b 27 29 3b 0a 20  har(&jx, '{');. 
8790: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63   for(i=0; i<argc
87a0: 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 69 66 28  ; i+=2){.    if(
87b0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
87c0: 79 70 65 28 61 72 67 76 5b 69 5d 29 21 3d 53 51  ype(argv[i])!=SQ
87d0: 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20  LITE_TEXT ){.   
87e0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
87f0: 74 5f 65 72 72 6f 72 28 63 74 78 2c 20 22 6a 73  t_error(ctx, "js
8800: 6f 6e 5f 6f 62 6a 65 63 74 28 29 20 6c 61 62 65  on_object() labe
8810: 6c 73 20 6d 75 73 74 20 62 65 20 54 45 58 54 22  ls must be TEXT"
8820: 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 6a 73 6f  , -1);.      jso
8830: 6e 5a 65 72 6f 28 26 6a 78 29 3b 0a 20 20 20 20  nZero(&jx);.    
8840: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
8850: 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 53 65      jsonAppendSe
8860: 70 61 72 61 74 6f 72 28 26 6a 78 29 3b 0a 20 20  parator(&jx);.  
8870: 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68 61    z = (const cha
8880: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
8890: 5f 74 65 78 74 28 61 72 67 76 5b 69 5d 29 3b 0a  _text(argv[i]);.
88a0: 20 20 20 20 6e 20 3d 20 28 75 33 32 29 73 71 6c      n = (u32)sql
88b0: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
88c0: 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 6a  (argv[i]);.    j
88d0: 73 6f 6e 41 70 70 65 6e 64 53 74 72 69 6e 67 28  sonAppendString(
88e0: 26 6a 78 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20  &jx, z, n);.    
88f0: 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61 72 28 26  jsonAppendChar(&
8900: 6a 78 2c 20 27 3a 27 29 3b 0a 20 20 20 20 6a 73  jx, ':');.    js
8910: 6f 6e 41 70 70 65 6e 64 56 61 6c 75 65 28 26 6a  onAppendValue(&j
8920: 78 2c 20 61 72 67 76 5b 69 2b 31 5d 2c 20 30 29  x, argv[i+1], 0)
8930: 3b 0a 20 20 7d 0a 20 20 6a 73 6f 6e 41 70 70 65  ;.  }.  jsonAppe
8940: 6e 64 43 68 61 72 28 26 6a 78 2c 20 27 7d 27 29  ndChar(&jx, '}')
8950: 3b 0a 20 20 6a 73 6f 6e 52 65 73 75 6c 74 28 26  ;.  jsonResult(&
8960: 6a 78 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 6a  jx);.}.../*.** j
8970: 73 6f 6e 5f 72 65 6d 6f 76 65 28 4a 53 4f 4e 2c  son_remove(JSON,
8980: 20 50 41 54 48 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a   PATH, ...).**.*
8990: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6e 61 6d  * Remove the nam
89a0: 65 64 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d  ed elements from
89b0: 20 4a 53 4f 4e 20 61 6e 64 20 72 65 74 75 72 6e   JSON and return
89c0: 20 74 68 65 20 72 65 73 75 6c 74 2e 20 20 6d 61   the result.  ma
89d0: 6c 66 6f 72 6d 65 64 0a 2a 2a 20 4a 53 4f 4e 20  lformed.** JSON 
89e0: 6f 72 20 50 41 54 48 20 61 72 67 75 6d 65 6e 74  or PATH argument
89f0: 73 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 65  s result in an e
8a00: 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rror..*/.static 
8a10: 76 6f 69 64 20 6a 73 6f 6e 52 65 6d 6f 76 65 46  void jsonRemoveF
8a20: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
8a30: 6f 6e 74 65 78 74 20 2a 63 74 78 2c 0a 20 20 69  ontext *ctx,.  i
8a40: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
8a50: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
8a60: 29 7b 0a 20 20 4a 73 6f 6e 50 61 72 73 65 20 78  ){.  JsonParse x
8a70: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
8a80: 65 20 70 61 72 73 65 20 2a 2f 0a 20 20 4a 73 6f  e parse */.  Jso
8a90: 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 3b 0a 20 20  nNode *pNode;.  
8aa0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
8ab0: 68 3b 0a 20 20 75 33 32 20 69 3b 0a 0a 20 20 69  h;.  u32 i;..  i
8ac0: 66 28 20 61 72 67 63 3c 31 20 29 20 72 65 74 75  f( argc<1 ) retu
8ad0: 72 6e 3b 0a 20 20 69 66 28 20 6a 73 6f 6e 50 61  rn;.  if( jsonPa
8ae0: 72 73 65 28 26 78 2c 20 63 74 78 2c 20 28 63 6f  rse(&x, ctx, (co
8af0: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
8b00: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
8b10: 76 5b 30 5d 29 29 20 29 20 72 65 74 75 72 6e 3b  v[0])) ) return;
8b20: 0a 20 20 69 66 28 20 78 2e 6e 4e 6f 64 65 20 29  .  if( x.nNode )
8b30: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69  {.    for(i=1; i
8b40: 3c 28 75 33 32 29 61 72 67 63 3b 20 69 2b 2b 29  <(u32)argc; i++)
8b50: 7b 0a 20 20 20 20 20 20 7a 50 61 74 68 20 3d 20  {.      zPath = 
8b60: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
8b70: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
8b80: 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20  argv[i]);.      
8b90: 69 66 28 20 7a 50 61 74 68 3d 3d 30 20 29 20 67  if( zPath==0 ) g
8ba0: 6f 74 6f 20 72 65 6d 6f 76 65 5f 64 6f 6e 65 3b  oto remove_done;
8bb0: 0a 20 20 20 20 20 20 70 4e 6f 64 65 20 3d 20 6a  .      pNode = j
8bc0: 73 6f 6e 4c 6f 6f 6b 75 70 28 26 78 2c 20 7a 50  sonLookup(&x, zP
8bd0: 61 74 68 2c 20 30 2c 20 63 74 78 2c 20 30 29 3b  ath, 0, ctx, 0);
8be0: 0a 20 20 20 20 20 20 69 66 28 20 78 2e 6e 45 72  .      if( x.nEr
8bf0: 72 20 29 20 67 6f 74 6f 20 72 65 6d 6f 76 65 5f  r ) goto remove_
8c00: 64 6f 6e 65 3b 0a 20 20 20 20 20 20 69 66 28 20  done;.      if( 
8c10: 70 4e 6f 64 65 20 29 20 70 4e 6f 64 65 2d 3e 6a  pNode ) pNode->j
8c20: 6e 46 6c 61 67 73 20 7c 3d 20 4a 4e 4f 44 45 5f  nFlags |= JNODE_
8c30: 52 45 4d 4f 56 45 3b 0a 20 20 20 20 7d 0a 20 20  REMOVE;.    }.  
8c40: 20 20 69 66 28 20 28 78 2e 61 4e 6f 64 65 5b 30    if( (x.aNode[0
8c50: 5d 2e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44  ].jnFlags & JNOD
8c60: 45 5f 52 45 4d 4f 56 45 29 3d 3d 30 20 29 7b 0a  E_REMOVE)==0 ){.
8c70: 20 20 20 20 20 20 6a 73 6f 6e 52 65 74 75 72 6e        jsonReturn
8c80: 4a 73 6f 6e 28 78 2e 61 4e 6f 64 65 2c 20 63 74  Json(x.aNode, ct
8c90: 78 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  x, 0);.    }.  }
8ca0: 0a 72 65 6d 6f 76 65 5f 64 6f 6e 65 3a 0a 20 20  .remove_done:.  
8cb0: 6a 73 6f 6e 50 61 72 73 65 52 65 73 65 74 28 26  jsonParseReset(&
8cc0: 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 6a 73 6f  x);.}../*.** jso
8cd0: 6e 5f 72 65 70 6c 61 63 65 28 4a 53 4f 4e 2c 20  n_replace(JSON, 
8ce0: 50 41 54 48 2c 20 56 41 4c 55 45 2c 20 2e 2e 2e  PATH, VALUE, ...
8cf0: 29 0a 2a 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20  ).**.** Replace 
8d00: 74 68 65 20 76 61 6c 75 65 20 61 74 20 50 41 54  the value at PAT
8d10: 48 20 77 69 74 68 20 56 41 4c 55 45 2e 20 20 49  H with VALUE.  I
8d20: 66 20 50 41 54 48 20 64 6f 65 73 20 6e 6f 74 20  f PATH does not 
8d30: 61 6c 72 65 61 64 79 20 65 78 69 73 74 2c 0a 2a  already exist,.*
8d40: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * this routine i
8d50: 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 4a  s a no-op.  If J
8d60: 53 4f 4e 20 6f 72 20 50 41 54 48 20 69 73 20 6d  SON or PATH is m
8d70: 61 6c 66 6f 72 6d 65 64 2c 20 74 68 72 6f 77 20  alformed, throw 
8d80: 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61  an error..*/.sta
8d90: 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 52 65 70  tic void jsonRep
8da0: 6c 61 63 65 46 75 6e 63 28 0a 20 20 73 71 6c 69  laceFunc(.  sqli
8db0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78  te3_context *ctx
8dc0: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
8dd0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
8de0: 61 72 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e 50 61  argv.){.  JsonPa
8df0: 72 73 65 20 78 3b 20 20 20 20 20 20 20 20 20 20  rse x;          
8e00: 2f 2a 20 54 68 65 20 70 61 72 73 65 20 2a 2f 0a  /* The parse */.
8e10: 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64    JsonNode *pNod
8e20: 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e;.  const char 
8e30: 2a 7a 50 61 74 68 3b 0a 20 20 75 33 32 20 69 3b  *zPath;.  u32 i;
8e40: 0a 0a 20 20 69 66 28 20 61 72 67 63 3c 31 20 29  ..  if( argc<1 )
8e50: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28   return;.  if( (
8e60: 61 72 67 63 26 31 29 3d 3d 30 20 29 20 7b 0a 20  argc&1)==0 ) {. 
8e70: 20 20 20 6a 73 6f 6e 57 72 6f 6e 67 4e 75 6d 41     jsonWrongNumA
8e80: 72 67 73 28 63 74 78 2c 20 22 72 65 70 6c 61 63  rgs(ctx, "replac
8e90: 65 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  e");.    return;
8ea0: 0a 20 20 7d 0a 20 20 69 66 28 20 6a 73 6f 6e 50  .  }.  if( jsonP
8eb0: 61 72 73 65 28 26 78 2c 20 63 74 78 2c 20 28 63  arse(&x, ctx, (c
8ec0: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
8ed0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
8ee0: 67 76 5b 30 5d 29 29 20 29 20 72 65 74 75 72 6e  gv[0])) ) return
8ef0: 3b 0a 20 20 69 66 28 20 78 2e 6e 4e 6f 64 65 20  ;.  if( x.nNode 
8f00: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  ){.    for(i=1; 
8f10: 69 3c 28 75 33 32 29 61 72 67 63 3b 20 69 2b 3d  i<(u32)argc; i+=
8f20: 32 29 7b 0a 20 20 20 20 20 20 75 38 20 6a 6e 46  2){.      u8 jnF
8f30: 6c 61 67 73 20 3d 20 4a 4e 4f 44 45 5f 52 45 50  lags = JNODE_REP
8f40: 4c 41 43 45 3b 0a 20 20 20 20 20 20 7a 50 61 74  LACE;.      zPat
8f50: 68 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  h = (const char*
8f60: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
8f70: 65 78 74 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20  ext(argv[i]);.  
8f80: 20 20 20 20 70 4e 6f 64 65 20 3d 20 6a 73 6f 6e      pNode = json
8f90: 4c 6f 6f 6b 75 70 28 26 78 2c 20 7a 50 61 74 68  Lookup(&x, zPath
8fa0: 2c 20 30 2c 20 63 74 78 2c 20 26 6a 6e 46 6c 61  , 0, ctx, &jnFla
8fb0: 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 78  gs);.      if( x
8fc0: 2e 6e 45 72 72 20 29 20 67 6f 74 6f 20 72 65 70  .nErr ) goto rep
8fd0: 6c 61 63 65 5f 65 72 72 3b 0a 20 20 20 20 20 20  lace_err;.      
8fe0: 69 66 28 20 70 4e 6f 64 65 20 29 7b 0a 20 20 20  if( pNode ){.   
8ff0: 20 20 20 20 20 70 4e 6f 64 65 2d 3e 6a 6e 46 6c       pNode->jnFl
9000: 61 67 73 20 26 3d 20 7e 4a 4e 4f 44 45 5f 4a 53  ags &= ~JNODE_JS
9010: 4f 4e 3b 0a 20 20 20 20 20 20 20 20 70 4e 6f 64  ON;.        pNod
9020: 65 2d 3e 6a 6e 46 6c 61 67 73 20 7c 3d 20 6a 6e  e->jnFlags |= jn
9030: 46 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 70  Flags;.        p
9040: 4e 6f 64 65 2d 3e 69 56 61 6c 20 3d 20 69 2b 31  Node->iVal = i+1
9050: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9060: 20 20 20 20 69 66 28 20 78 2e 61 4e 6f 64 65 5b      if( x.aNode[
9070: 30 5d 2e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f  0].jnFlags & JNO
9080: 44 45 5f 52 45 50 4c 41 43 45 20 29 7b 0a 20 20  DE_REPLACE ){.  
9090: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
90a0: 6c 74 5f 76 61 6c 75 65 28 63 74 78 2c 20 61 72  lt_value(ctx, ar
90b0: 67 76 5b 78 2e 61 4e 6f 64 65 5b 30 5d 2e 69 56  gv[x.aNode[0].iV
90c0: 61 6c 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  al]);.    }else{
90d0: 0a 20 20 20 20 20 20 6a 73 6f 6e 52 65 74 75 72  .      jsonRetur
90e0: 6e 4a 73 6f 6e 28 78 2e 61 4e 6f 64 65 2c 20 63  nJson(x.aNode, c
90f0: 74 78 2c 20 61 72 67 76 29 3b 0a 20 20 20 20 7d  tx, argv);.    }
9100: 0a 20 20 7d 0a 72 65 70 6c 61 63 65 5f 65 72 72  .  }.replace_err
9110: 3a 0a 20 20 6a 73 6f 6e 50 61 72 73 65 52 65 73  :.  jsonParseRes
9120: 65 74 28 26 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  et(&x);.}../*.**
9130: 20 6a 73 6f 6e 5f 73 65 74 28 4a 53 4f 4e 2c 20   json_set(JSON, 
9140: 50 41 54 48 2c 20 56 41 4c 55 45 2c 20 2e 2e 2e  PATH, VALUE, ...
9150: 29 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ).**.** Set the 
9160: 76 61 6c 75 65 20 61 74 20 50 41 54 48 20 74 6f  value at PATH to
9170: 20 56 41 4c 55 45 2e 20 20 43 72 65 61 74 65 20   VALUE.  Create 
9180: 74 68 65 20 50 41 54 48 20 69 66 20 69 74 20 64  the PATH if it d
9190: 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a  oes not already.
91a0: 2a 2a 20 65 78 69 73 74 2e 20 20 4f 76 65 72 77  ** exist.  Overw
91b0: 72 69 74 65 20 65 78 69 73 74 69 6e 67 20 76 61  rite existing va
91c0: 6c 75 65 73 20 74 68 61 74 20 64 6f 20 65 78 69  lues that do exi
91d0: 73 74 2e 0a 2a 2a 20 49 66 20 4a 53 4f 4e 20 6f  st..** If JSON o
91e0: 72 20 50 41 54 48 20 69 73 20 6d 61 6c 66 6f 72  r PATH is malfor
91f0: 6d 65 64 2c 20 74 68 72 6f 77 20 61 6e 20 65 72  med, throw an er
9200: 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 6a 73 6f 6e 5f  ror..**.** json_
9210: 69 6e 73 65 72 74 28 4a 53 4f 4e 2c 20 50 41 54  insert(JSON, PAT
9220: 48 2c 20 56 41 4c 55 45 2c 20 2e 2e 2e 29 0a 2a  H, VALUE, ...).*
9230: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 50 41 54 48  *.** Create PATH
9240: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
9250: 69 74 20 74 6f 20 56 41 4c 55 45 2e 20 20 49 66  it to VALUE.  If
9260: 20 50 41 54 48 20 61 6c 72 65 61 64 79 20 65 78   PATH already ex
9270: 69 73 74 73 2c 20 74 68 69 73 0a 2a 2a 20 72 6f  ists, this.** ro
9280: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
9290: 2e 20 20 49 66 20 4a 53 4f 4e 20 6f 72 20 50 41  .  If JSON or PA
92a0: 54 48 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 2c  TH is malformed,
92b0: 20 74 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 2e   throw an error.
92c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
92d0: 6a 73 6f 6e 53 65 74 46 75 6e 63 28 0a 20 20 73  jsonSetFunc(.  s
92e0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
92f0: 63 74 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ctx,.  int argc,
9300: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
9310: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 4a 73 6f   **argv.){.  Jso
9320: 6e 50 61 72 73 65 20 78 3b 20 20 20 20 20 20 20  nParse x;       
9330: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 20     /* The parse 
9340: 2a 2f 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70  */.  JsonNode *p
9350: 4e 6f 64 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68  Node;.  const ch
9360: 61 72 20 2a 7a 50 61 74 68 3b 0a 20 20 75 33 32  ar *zPath;.  u32
9370: 20 69 3b 0a 20 20 69 6e 74 20 62 41 70 6e 64 3b   i;.  int bApnd;
9380: 0a 20 20 69 6e 74 20 62 49 73 53 65 74 20 3d 20  .  int bIsSet = 
9390: 2a 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 5f 75  *(int*)sqlite3_u
93a0: 73 65 72 5f 64 61 74 61 28 63 74 78 29 3b 0a 0a  ser_data(ctx);..
93b0: 20 20 69 66 28 20 61 72 67 63 3c 31 20 29 20 72    if( argc<1 ) r
93c0: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 61 72  eturn;.  if( (ar
93d0: 67 63 26 31 29 3d 3d 30 20 29 20 7b 0a 20 20 20  gc&1)==0 ) {.   
93e0: 20 6a 73 6f 6e 57 72 6f 6e 67 4e 75 6d 41 72 67   jsonWrongNumArg
93f0: 73 28 63 74 78 2c 20 62 49 73 53 65 74 20 3f 20  s(ctx, bIsSet ? 
9400: 22 73 65 74 22 20 3a 20 22 69 6e 73 65 72 74 22  "set" : "insert"
9410: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
9420: 20 7d 0a 20 20 69 66 28 20 6a 73 6f 6e 50 61 72   }.  if( jsonPar
9430: 73 65 28 26 78 2c 20 63 74 78 2c 20 28 63 6f 6e  se(&x, ctx, (con
9440: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
9450: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
9460: 5b 30 5d 29 29 20 29 20 72 65 74 75 72 6e 3b 0a  [0])) ) return;.
9470: 20 20 69 66 28 20 78 2e 6e 4e 6f 64 65 20 29 7b    if( x.nNode ){
9480: 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
9490: 28 75 33 32 29 61 72 67 63 3b 20 69 2b 3d 32 29  (u32)argc; i+=2)
94a0: 7b 0a 20 20 20 20 20 20 75 38 20 6a 6e 46 6c 61  {.      u8 jnFla
94b0: 67 73 20 3d 20 4a 4e 4f 44 45 5f 52 45 50 4c 41  gs = JNODE_REPLA
94c0: 43 45 3b 0a 20 20 20 20 20 20 7a 50 61 74 68 20  CE;.      zPath 
94d0: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
94e0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
94f0: 74 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20  t(argv[i]);.    
9500: 20 20 62 41 70 6e 64 20 3d 20 30 3b 0a 20 20 20    bApnd = 0;.   
9510: 20 20 20 70 4e 6f 64 65 20 3d 20 6a 73 6f 6e 4c     pNode = jsonL
9520: 6f 6f 6b 75 70 28 26 78 2c 20 7a 50 61 74 68 2c  ookup(&x, zPath,
9530: 20 26 62 41 70 6e 64 2c 20 63 74 78 2c 20 26 6a   &bApnd, ctx, &j
9540: 6e 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69  nFlags);.      i
9550: 66 28 20 78 2e 6f 6f 6d 20 29 7b 0a 20 20 20 20  f( x.oom ){.    
9560: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
9570: 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63  lt_error_nomem(c
9580: 74 78 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  tx);.        got
9590: 6f 20 6a 73 6f 6e 53 65 74 44 6f 6e 65 3b 0a 20  o jsonSetDone;. 
95a0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78       }else if( x
95b0: 2e 6e 45 72 72 20 29 7b 0a 20 20 20 20 20 20 20  .nErr ){.       
95c0: 20 67 6f 74 6f 20 6a 73 6f 6e 53 65 74 44 6f 6e   goto jsonSetDon
95d0: 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  e;.      }else i
95e0: 66 28 20 70 4e 6f 64 65 20 26 26 20 28 62 41 70  f( pNode && (bAp
95f0: 6e 64 20 7c 7c 20 62 49 73 53 65 74 29 20 29 7b  nd || bIsSet) ){
9600: 0a 20 20 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e  .        pNode->
9610: 6a 6e 46 6c 61 67 73 20 26 3d 20 7e 4a 4e 4f 44  jnFlags &= ~JNOD
9620: 45 5f 4a 53 4f 4e 3b 0a 20 20 20 20 20 20 20 20  E_JSON;.        
9630: 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73 20 7c  pNode->jnFlags |
9640: 3d 20 6a 6e 46 6c 61 67 73 3b 0a 20 20 20 20 20  = jnFlags;.     
9650: 20 20 20 70 4e 6f 64 65 2d 3e 69 56 61 6c 20 3d     pNode->iVal =
9660: 20 69 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   i+1;.      }.  
9670: 20 20 7d 0a 20 20 20 20 69 66 28 20 78 2e 61 4e    }.    if( x.aN
9680: 6f 64 65 5b 30 5d 2e 6a 6e 46 6c 61 67 73 20 26  ode[0].jnFlags &
9690: 20 4a 4e 4f 44 45 5f 52 45 50 4c 41 43 45 20 29   JNODE_REPLACE )
96a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
96b0: 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 74 78  result_value(ctx
96c0: 2c 20 61 72 67 76 5b 78 2e 61 4e 6f 64 65 5b 30  , argv[x.aNode[0
96d0: 5d 2e 69 56 61 6c 5d 29 3b 0a 20 20 20 20 7d 65  ].iVal]);.    }e
96e0: 6c 73 65 7b 0a 20 20 20 20 20 20 6a 73 6f 6e 52  lse{.      jsonR
96f0: 65 74 75 72 6e 4a 73 6f 6e 28 78 2e 61 4e 6f 64  eturnJson(x.aNod
9700: 65 2c 20 63 74 78 2c 20 61 72 67 76 29 3b 0a 20  e, ctx, argv);. 
9710: 20 20 20 7d 0a 20 20 7d 0a 6a 73 6f 6e 53 65 74     }.  }.jsonSet
9720: 44 6f 6e 65 3a 0a 20 20 6a 73 6f 6e 50 61 72 73  Done:.  jsonPars
9730: 65 52 65 73 65 74 28 26 78 29 3b 0a 7d 0a 0a 2f  eReset(&x);.}../
9740: 2a 0a 2a 2a 20 6a 73 6f 6e 5f 74 79 70 65 28 4a  *.** json_type(J
9750: 53 4f 4e 29 0a 2a 2a 20 6a 73 6f 6e 5f 74 79 70  SON).** json_typ
9760: 65 28 4a 53 4f 4e 2c 20 50 41 54 48 29 0a 2a 2a  e(JSON, PATH).**
9770: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74  .** Return the t
9780: 6f 70 2d 6c 65 76 65 6c 20 22 74 79 70 65 22 20  op-level "type" 
9790: 6f 66 20 61 20 4a 53 4f 4e 20 73 74 72 69 6e 67  of a JSON string
97a0: 2e 20 20 54 68 72 6f 77 20 61 6e 20 65 72 72 6f  .  Throw an erro
97b0: 72 20 69 66 0a 2a 2a 20 65 69 74 68 65 72 20 74  r if.** either t
97c0: 68 65 20 4a 53 4f 4e 20 6f 72 20 50 41 54 48 20  he JSON or PATH 
97d0: 69 6e 70 75 74 73 20 61 72 65 20 6e 6f 74 20 77  inputs are not w
97e0: 65 6c 6c 2d 66 6f 72 6d 65 64 2e 0a 2a 2f 0a 73  ell-formed..*/.s
97f0: 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 54  tatic void jsonT
9800: 79 70 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  ypeFunc(.  sqlit
9810: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c  e3_context *ctx,
9820: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
9830: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
9840: 72 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e 50 61 72  rgv.){.  JsonPar
9850: 73 65 20 78 3b 20 20 20 20 20 20 20 20 20 20 2f  se x;          /
9860: 2a 20 54 68 65 20 70 61 72 73 65 20 2a 2f 0a 20  * The parse */. 
9870: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
9880: 74 68 3b 0a 0a 20 20 69 66 28 20 6a 73 6f 6e 50  th;..  if( jsonP
9890: 61 72 73 65 28 26 78 2c 20 63 74 78 2c 20 28 63  arse(&x, ctx, (c
98a0: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
98b0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
98c0: 67 76 5b 30 5d 29 29 20 29 20 72 65 74 75 72 6e  gv[0])) ) return
98d0: 3b 0a 20 20 69 66 28 20 78 2e 6e 4e 6f 64 65 20  ;.  if( x.nNode 
98e0: 29 7b 0a 20 20 20 20 4a 73 6f 6e 4e 6f 64 65 20  ){.    JsonNode 
98f0: 2a 70 4e 6f 64 65 3b 0a 20 20 20 20 69 66 28 20  *pNode;.    if( 
9900: 61 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20  argc==2 ){.     
9910: 20 7a 50 61 74 68 20 3d 20 28 63 6f 6e 73 74 20   zPath = (const 
9920: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
9930: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d  lue_text(argv[1]
9940: 29 3b 0a 20 20 20 20 20 20 70 4e 6f 64 65 20 3d  );.      pNode =
9950: 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 28 26 78 2c 20   jsonLookup(&x, 
9960: 7a 50 61 74 68 2c 20 30 2c 20 63 74 78 2c 20 30  zPath, 0, ctx, 0
9970: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
9980: 20 20 20 20 70 4e 6f 64 65 20 3d 20 78 2e 61 4e      pNode = x.aN
9990: 6f 64 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ode;.    }.    i
99a0: 66 28 20 70 4e 6f 64 65 20 29 7b 0a 20 20 20 20  f( pNode ){.    
99b0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
99c0: 5f 74 65 78 74 28 63 74 78 2c 20 6a 73 6f 6e 54  _text(ctx, jsonT
99d0: 79 70 65 5b 70 4e 6f 64 65 2d 3e 65 54 79 70 65  ype[pNode->eType
99e0: 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54  ], -1, SQLITE_ST
99f0: 41 54 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ATIC);.    }.  }
9a00: 0a 20 20 6a 73 6f 6e 50 61 72 73 65 52 65 73 65  .  jsonParseRese
9a10: 74 28 26 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t(&x);.}../*.** 
9a20: 6a 73 6f 6e 5f 76 61 6c 69 64 28 4a 53 4f 4e 29  json_valid(JSON)
9a30: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20  .**.** Return 1 
9a40: 69 66 20 4a 53 4f 4e 20 69 73 20 61 20 77 65 6c  if JSON is a wel
9a50: 6c 2d 66 6f 72 6d 65 64 20 4a 53 4f 4e 20 73 74  l-formed JSON st
9a60: 72 69 6e 67 20 61 63 63 6f 72 64 69 6e 67 20 74  ring according t
9a70: 6f 20 52 46 43 2d 37 31 35 39 2e 0a 2a 2a 20 52  o RFC-7159..** R
9a80: 65 74 75 72 6e 20 30 20 6f 74 68 65 72 77 69 73  eturn 0 otherwis
9a90: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
9aa0: 64 20 6a 73 6f 6e 56 61 6c 69 64 46 75 6e 63 28  d jsonValidFunc(
9ab0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
9ac0: 78 74 20 2a 63 74 78 2c 0a 20 20 69 6e 74 20 61  xt *ctx,.  int a
9ad0: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
9ae0: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
9af0: 20 4a 73 6f 6e 50 61 72 73 65 20 78 3b 20 20 20   JsonParse x;   
9b00: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
9b10: 72 73 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  rse */.  int rc 
9b20: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6a 73 6f 6e  = 0;..  if( json
9b30: 50 61 72 73 65 28 26 78 2c 20 30 2c 20 28 63 6f  Parse(&x, 0, (co
9b40: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
9b50: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
9b60: 76 5b 30 5d 29 29 3d 3d 30 20 0a 20 20 20 26 26  v[0]))==0 .   &&
9b70: 20 78 2e 6e 4e 6f 64 65 3e 30 0a 20 20 29 7b 0a   x.nNode>0.  ){.
9b80: 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a      rc = 1;.  }.
9b90: 20 20 6a 73 6f 6e 50 61 72 73 65 52 65 73 65 74    jsonParseReset
9ba0: 28 26 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  (&x);.  sqlite3_
9bb0: 72 65 73 75 6c 74 5f 69 6e 74 28 63 74 78 2c 20  result_int(ctx, 
9bc0: 72 63 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  rc);.}..#ifndef 
9bd0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
9be0: 55 41 4c 54 41 42 4c 45 0a 2f 2a 2a 2a 2a 2a 2a  UALTABLE./******
9bf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9c00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9c10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9c20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9c30: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 73  ******.** The js
9c40: 6f 6e 5f 65 61 63 68 20 76 69 72 74 75 61 6c 20  on_each virtual 
9c50: 74 61 62 6c 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  table.**********
9c60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9c70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9c80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9c90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9ca0: 2a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  **/.typedef stru
9cb0: 63 74 20 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f  ct JsonEachCurso
9cc0: 72 20 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72  r JsonEachCursor
9cd0: 3b 0a 73 74 72 75 63 74 20 4a 73 6f 6e 45 61 63  ;.struct JsonEac
9ce0: 68 43 75 72 73 6f 72 20 7b 0a 20 20 73 71 6c 69  hCursor {.  sqli
9cf0: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
9d00: 62 61 73 65 3b 20 20 2f 2a 20 42 61 73 65 20 63  base;  /* Base c
9d10: 6c 61 73 73 20 2d 20 6d 75 73 74 20 62 65 20 66  lass - must be f
9d20: 69 72 73 74 20 2a 2f 0a 20 20 75 33 32 20 69 52  irst */.  u32 iR
9d30: 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  owid;           
9d40: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 69       /* The rowi
9d50: 64 20 2a 2f 0a 20 20 75 33 32 20 69 42 65 67 69  d */.  u32 iBegi
9d60: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
9d70: 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 6e    /* The first n
9d80: 6f 64 65 20 6f 66 20 74 68 65 20 73 63 61 6e 20  ode of the scan 
9d90: 2a 2f 0a 20 20 75 33 32 20 69 3b 20 20 20 20 20  */.  u32 i;     
9da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9db0: 2f 2a 20 49 6e 64 65 78 20 69 6e 20 73 50 61 72  /* Index in sPar
9dc0: 73 65 2e 61 4e 6f 64 65 5b 5d 20 6f 66 20 63 75  se.aNode[] of cu
9dd0: 72 72 65 6e 74 20 72 6f 77 20 2a 2f 0a 20 20 75  rrent row */.  u
9de0: 33 32 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20  32 iEnd;        
9df0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 4f 46            /* EOF
9e00: 20 77 68 65 6e 20 69 20 65 71 75 61 6c 73 20 6f   when i equals o
9e10: 72 20 65 78 63 65 65 64 73 20 74 68 69 73 20 76  r exceeds this v
9e20: 61 6c 75 65 20 2a 2f 0a 20 20 75 38 20 65 54 79  alue */.  u8 eTy
9e30: 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pe;             
9e40: 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20       /* Type of 
9e50: 74 6f 70 2d 6c 65 76 65 6c 20 65 6c 65 6d 65 6e  top-level elemen
9e60: 74 20 2a 2f 0a 20 20 75 38 20 62 52 65 63 75 72  t */.  u8 bRecur
9e70: 73 69 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  sive;           
9e80: 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 6a 73    /* True for js
9e90: 6f 6e 5f 74 72 65 65 28 29 2e 20 20 46 61 6c 73  on_tree().  Fals
9ea0: 65 20 66 6f 72 20 6a 73 6f 6e 5f 65 61 63 68 28  e for json_each(
9eb0: 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 73  ) */.  char *zJs
9ec0: 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  on;             
9ed0: 20 20 2f 2a 20 49 6e 70 75 74 20 4a 53 4f 4e 20    /* Input JSON 
9ee0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 52 6f 6f 74  */.  char *zRoot
9ef0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9f00: 2f 2a 20 50 61 74 68 20 62 79 20 77 68 69 63 68  /* Path by which
9f10: 20 74 6f 20 66 69 6c 74 65 72 20 7a 4a 73 6f 6e   to filter zJson
9f20: 20 2a 2f 0a 20 20 4a 73 6f 6e 50 61 72 73 65 20   */.  JsonParse 
9f30: 73 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  sParse;         
9f40: 20 2f 2a 20 50 61 72 73 65 20 6f 66 20 74 68 65   /* Parse of the
9f50: 20 69 6e 70 75 74 20 4a 53 4f 4e 20 2a 2f 0a 7d   input JSON */.}
9f60: 3b 0a 0a 2f 2a 20 43 6f 6e 73 74 72 75 63 74 6f  ;../* Constructo
9f70: 72 20 66 6f 72 20 74 68 65 20 6a 73 6f 6e 5f 65  r for the json_e
9f80: 61 63 68 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ach virtual tabl
9f90: 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e */.static int 
9fa0: 6a 73 6f 6e 45 61 63 68 43 6f 6e 6e 65 63 74 28  jsonEachConnect(
9fb0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
9fc0: 20 20 76 6f 69 64 20 2a 70 41 75 78 2c 0a 20 20    void *pAux,.  
9fd0: 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20  int argc, const 
9fe0: 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61 72 67 76  char *const*argv
9ff0: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  ,.  sqlite3_vtab
a000: 20 2a 2a 70 70 56 74 61 62 2c 0a 20 20 63 68 61   **ppVtab,.  cha
a010: 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 73  r **pzErr.){.  s
a020: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 4e 65  qlite3_vtab *pNe
a030: 77 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 2f 2a  w;.  int rc;../*
a040: 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 73 20   Column numbers 
a050: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 45 41 43 48  */.#define JEACH
a060: 5f 4b 45 59 20 20 20 20 20 30 0a 23 64 65 66 69  _KEY     0.#defi
a070: 6e 65 20 4a 45 41 43 48 5f 56 41 4c 55 45 20 20  ne JEACH_VALUE  
a080: 20 31 0a 23 64 65 66 69 6e 65 20 4a 45 41 43 48   1.#define JEACH
a090: 5f 54 59 50 45 20 20 20 20 32 0a 23 64 65 66 69  _TYPE    2.#defi
a0a0: 6e 65 20 4a 45 41 43 48 5f 41 54 4f 4d 20 20 20  ne JEACH_ATOM   
a0b0: 20 33 0a 23 64 65 66 69 6e 65 20 4a 45 41 43 48   3.#define JEACH
a0c0: 5f 49 44 20 20 20 20 20 20 34 0a 23 64 65 66 69  _ID      4.#defi
a0d0: 6e 65 20 4a 45 41 43 48 5f 50 41 52 45 4e 54 20  ne JEACH_PARENT 
a0e0: 20 35 0a 23 64 65 66 69 6e 65 20 4a 45 41 43 48   5.#define JEACH
a0f0: 5f 46 55 4c 4c 4b 45 59 20 36 0a 23 64 65 66 69  _FULLKEY 6.#defi
a100: 6e 65 20 4a 45 41 43 48 5f 50 41 54 48 20 20 20  ne JEACH_PATH   
a110: 20 37 0a 23 64 65 66 69 6e 65 20 4a 45 41 43 48   7.#define JEACH
a120: 5f 4a 53 4f 4e 20 20 20 20 38 0a 23 64 65 66 69  _JSON    8.#defi
a130: 6e 65 20 4a 45 41 43 48 5f 52 4f 4f 54 20 20 20  ne JEACH_ROOT   
a140: 20 39 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   9..  UNUSED_PAR
a150: 41 4d 28 70 7a 45 72 72 29 3b 0a 20 20 55 4e 55  AM(pzErr);.  UNU
a160: 53 45 44 5f 50 41 52 41 4d 28 61 72 67 76 29 3b  SED_PARAM(argv);
a170: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28  .  UNUSED_PARAM(
a180: 61 72 67 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f  argc);.  UNUSED_
a190: 50 41 52 41 4d 28 70 41 75 78 29 3b 0a 20 20 72  PARAM(pAux);.  r
a1a0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 64 65 63 6c  c = sqlite3_decl
a1b0: 61 72 65 5f 76 74 61 62 28 64 62 2c 20 0a 20 20  are_vtab(db, .  
a1c0: 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
a1d0: 20 78 28 6b 65 79 2c 76 61 6c 75 65 2c 74 79 70   x(key,value,typ
a1e0: 65 2c 61 74 6f 6d 2c 69 64 2c 70 61 72 65 6e 74  e,atom,id,parent
a1f0: 2c 66 75 6c 6c 6b 65 79 2c 70 61 74 68 2c 22 0a  ,fullkey,path,".
a200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a210: 20 20 20 20 22 6a 73 6f 6e 20 48 49 44 44 45 4e      "json HIDDEN
a220: 2c 72 6f 6f 74 20 48 49 44 44 45 4e 29 22 29 3b  ,root HIDDEN)");
a230: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
a240: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 4e 65 77  E_OK ){.    pNew
a250: 20 3d 20 2a 70 70 56 74 61 62 20 3d 20 73 71 6c   = *ppVtab = sql
a260: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
a270: 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20  eof(*pNew) );.  
a280: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
a290: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
a2a0: 4d 45 4d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  MEM;.    memset(
a2b0: 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pNew, 0, sizeof(
a2c0: 2a 70 4e 65 77 29 29 3b 0a 20 20 7d 0a 20 20 72  *pNew));.  }.  r
a2d0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
a2e0: 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 6a  destructor for j
a2f0: 73 6f 6e 5f 65 61 63 68 20 76 69 72 74 75 61 6c  son_each virtual
a300: 20 74 61 62 6c 65 20 2a 2f 0a 73 74 61 74 69 63   table */.static
a310: 20 69 6e 74 20 6a 73 6f 6e 45 61 63 68 44 69 73   int jsonEachDis
a320: 63 6f 6e 6e 65 63 74 28 73 71 6c 69 74 65 33 5f  connect(sqlite3_
a330: 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20  vtab *pVtab){.  
a340: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74  sqlite3_free(pVt
a350: 61 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ab);.  return SQ
a360: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 63  LITE_OK;.}../* c
a370: 6f 6e 73 74 72 75 63 74 6f 72 20 66 6f 72 20 61  onstructor for a
a380: 20 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 20   JsonEachCursor 
a390: 6f 62 6a 65 63 74 20 66 6f 72 20 6a 73 6f 6e 5f  object for json_
a3a0: 65 61 63 68 28 29 2e 20 2a 2f 0a 73 74 61 74 69  each(). */.stati
a3b0: 63 20 69 6e 74 20 6a 73 6f 6e 45 61 63 68 4f 70  c int jsonEachOp
a3c0: 65 6e 45 61 63 68 28 73 71 6c 69 74 65 33 5f 76  enEach(sqlite3_v
a3d0: 74 61 62 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f  tab *p, sqlite3_
a3e0: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 2a 70 70  vtab_cursor **pp
a3f0: 43 75 72 73 6f 72 29 7b 0a 20 20 4a 73 6f 6e 45  Cursor){.  JsonE
a400: 61 63 68 43 75 72 73 6f 72 20 2a 70 43 75 72 3b  achCursor *pCur;
a410: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
a420: 28 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 73 71  (p);.  pCur = sq
a430: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
a440: 7a 65 6f 66 28 2a 70 43 75 72 29 20 29 3b 0a 20  zeof(*pCur) );. 
a450: 20 69 66 28 20 70 43 75 72 3d 3d 30 20 29 20 72   if( pCur==0 ) r
a460: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
a470: 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 75  EM;.  memset(pCu
a480: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43  r, 0, sizeof(*pC
a490: 75 72 29 29 3b 0a 20 20 2a 70 70 43 75 72 73 6f  ur));.  *ppCurso
a4a0: 72 20 3d 20 26 70 43 75 72 2d 3e 62 61 73 65 3b  r = &pCur->base;
a4b0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
a4c0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 63 6f 6e 73 74  _OK;.}../* const
a4d0: 72 75 63 74 6f 72 20 66 6f 72 20 61 20 4a 73 6f  ructor for a Jso
a4e0: 6e 45 61 63 68 43 75 72 73 6f 72 20 6f 62 6a 65  nEachCursor obje
a4f0: 63 74 20 66 6f 72 20 6a 73 6f 6e 5f 74 72 65 65  ct for json_tree
a500: 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  (). */.static in
a510: 74 20 6a 73 6f 6e 45 61 63 68 4f 70 65 6e 54 72  t jsonEachOpenTr
a520: 65 65 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  ee(sqlite3_vtab 
a530: 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62  *p, sqlite3_vtab
a540: 5f 63 75 72 73 6f 72 20 2a 2a 70 70 43 75 72 73  _cursor **ppCurs
a550: 6f 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  or){.  int rc = 
a560: 6a 73 6f 6e 45 61 63 68 4f 70 65 6e 45 61 63 68  jsonEachOpenEach
a570: 28 70 2c 20 70 70 43 75 72 73 6f 72 29 3b 0a 20  (p, ppCursor);. 
a580: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
a590: 4f 4b 20 29 7b 0a 20 20 20 20 4a 73 6f 6e 45 61  OK ){.    JsonEa
a5a0: 63 68 43 75 72 73 6f 72 20 2a 70 43 75 72 20 3d  chCursor *pCur =
a5b0: 20 28 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72   (JsonEachCursor
a5c0: 2a 29 2a 70 70 43 75 72 73 6f 72 3b 0a 20 20 20  *)*ppCursor;.   
a5d0: 20 70 43 75 72 2d 3e 62 52 65 63 75 72 73 69 76   pCur->bRecursiv
a5e0: 65 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 1;.  }.  ret
a5f0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 52 65  urn rc;.}../* Re
a600: 73 65 74 20 61 20 4a 73 6f 6e 45 61 63 68 43 75  set a JsonEachCu
a610: 72 73 6f 72 20 62 61 63 6b 20 74 6f 20 69 74 73  rsor back to its
a620: 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 2e   original state.
a630: 20 20 46 72 65 65 20 61 6e 79 20 6d 65 6d 6f 72    Free any memor
a640: 79 0a 2a 2a 20 68 65 6c 64 2e 20 2a 2f 0a 73 74  y.** held. */.st
a650: 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 45 61  atic void jsonEa
a660: 63 68 43 75 72 73 6f 72 52 65 73 65 74 28 4a 73  chCursorReset(Js
a670: 6f 6e 45 61 63 68 43 75 72 73 6f 72 20 2a 70 29  onEachCursor *p)
a680: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  {.  sqlite3_free
a690: 28 70 2d 3e 7a 4a 73 6f 6e 29 3b 0a 20 20 73 71  (p->zJson);.  sq
a6a0: 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 52  lite3_free(p->zR
a6b0: 6f 6f 74 29 3b 0a 20 20 6a 73 6f 6e 50 61 72 73  oot);.  jsonPars
a6c0: 65 52 65 73 65 74 28 26 70 2d 3e 73 50 61 72 73  eReset(&p->sPars
a6d0: 65 29 3b 0a 20 20 70 2d 3e 69 52 6f 77 69 64 20  e);.  p->iRowid 
a6e0: 3d 20 30 3b 0a 20 20 70 2d 3e 69 20 3d 20 30 3b  = 0;.  p->i = 0;
a6f0: 0a 20 20 70 2d 3e 69 45 6e 64 20 3d 20 30 3b 0a  .  p->iEnd = 0;.
a700: 20 20 70 2d 3e 65 54 79 70 65 20 3d 20 30 3b 0a    p->eType = 0;.
a710: 20 20 70 2d 3e 7a 4a 73 6f 6e 20 3d 20 30 3b 0a    p->zJson = 0;.
a720: 20 20 70 2d 3e 7a 52 6f 6f 74 20 3d 20 30 3b 0a    p->zRoot = 0;.
a730: 7d 0a 0a 2f 2a 20 44 65 73 74 72 75 63 74 6f 72  }../* Destructor
a740: 20 66 6f 72 20 61 20 6a 73 6f 6e 45 61 63 68 43   for a jsonEachC
a750: 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  ursor object */.
a760: 73 74 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e 45  static int jsonE
a770: 61 63 68 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  achClose(sqlite3
a780: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75  _vtab_cursor *cu
a790: 72 29 7b 0a 20 20 4a 73 6f 6e 45 61 63 68 43 75  r){.  JsonEachCu
a7a0: 72 73 6f 72 20 2a 70 20 3d 20 28 4a 73 6f 6e 45  rsor *p = (JsonE
a7b0: 61 63 68 43 75 72 73 6f 72 2a 29 63 75 72 3b 0a  achCursor*)cur;.
a7c0: 20 20 6a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72    jsonEachCursor
a7d0: 52 65 73 65 74 28 70 29 3b 0a 20 20 73 71 6c 69  Reset(p);.  sqli
a7e0: 74 65 33 5f 66 72 65 65 28 63 75 72 29 3b 0a 20  te3_free(cur);. 
a7f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
a800: 4b 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  K;.}../* Return 
a810: 54 52 55 45 20 69 66 20 74 68 65 20 6a 73 6f 6e  TRUE if the json
a820: 45 61 63 68 43 75 72 73 6f 72 20 6f 62 6a 65 63  EachCursor objec
a830: 74 20 68 61 73 20 62 65 65 6e 20 61 64 76 61 6e  t has been advan
a840: 63 65 64 20 6f 66 66 20 74 68 65 20 65 6e 64 0a  ced off the end.
a850: 2a 2a 20 6f 66 20 74 68 65 20 4a 53 4f 4e 20 6f  ** of the JSON o
a860: 62 6a 65 63 74 20 2a 2f 0a 73 74 61 74 69 63 20  bject */.static 
a870: 69 6e 74 20 6a 73 6f 6e 45 61 63 68 45 6f 66 28  int jsonEachEof(
a880: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
a890: 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20 4a 73 6f  sor *cur){.  Jso
a8a0: 6e 45 61 63 68 43 75 72 73 6f 72 20 2a 70 20 3d  nEachCursor *p =
a8b0: 20 28 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72   (JsonEachCursor
a8c0: 2a 29 63 75 72 3b 0a 20 20 72 65 74 75 72 6e 20  *)cur;.  return 
a8d0: 70 2d 3e 69 20 3e 3d 20 70 2d 3e 69 45 6e 64 3b  p->i >= p->iEnd;
a8e0: 0a 7d 0a 0a 2f 2a 20 41 64 76 61 6e 63 65 20 74  .}../* Advance t
a8f0: 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
a900: 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 66 6f   next element fo
a910: 72 20 6a 73 6f 6e 5f 74 72 65 65 28 29 20 2a 2f  r json_tree() */
a920: 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e  .static int json
a930: 45 61 63 68 4e 65 78 74 28 73 71 6c 69 74 65 33  EachNext(sqlite3
a940: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75  _vtab_cursor *cu
a950: 72 29 7b 0a 20 20 4a 73 6f 6e 45 61 63 68 43 75  r){.  JsonEachCu
a960: 72 73 6f 72 20 2a 70 20 3d 20 28 4a 73 6f 6e 45  rsor *p = (JsonE
a970: 61 63 68 43 75 72 73 6f 72 2a 29 63 75 72 3b 0a  achCursor*)cur;.
a980: 20 20 69 66 28 20 70 2d 3e 62 52 65 63 75 72 73    if( p->bRecurs
a990: 69 76 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ive ){.    if( p
a9a0: 2d 3e 73 50 61 72 73 65 2e 61 4e 6f 64 65 5b 70  ->sParse.aNode[p
a9b0: 2d 3e 69 5d 2e 6a 6e 46 6c 61 67 73 20 26 20 4a  ->i].jnFlags & J
a9c0: 4e 4f 44 45 5f 4c 41 42 45 4c 20 29 20 70 2d 3e  NODE_LABEL ) p->
a9d0: 69 2b 2b 3b 0a 20 20 20 20 70 2d 3e 69 2b 2b 3b  i++;.    p->i++;
a9e0: 0a 20 20 20 20 70 2d 3e 69 52 6f 77 69 64 2b 2b  .    p->iRowid++
a9f0: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 3c 70  ;.    if( p->i<p
aa00: 2d 3e 69 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  ->iEnd ){.      
aa10: 75 33 32 20 69 55 70 20 3d 20 70 2d 3e 73 50 61  u32 iUp = p->sPa
aa20: 72 73 65 2e 61 55 70 5b 70 2d 3e 69 5d 3b 0a 20  rse.aUp[p->i];. 
aa30: 20 20 20 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70       JsonNode *p
aa40: 55 70 20 3d 20 26 70 2d 3e 73 50 61 72 73 65 2e  Up = &p->sParse.
aa50: 61 4e 6f 64 65 5b 69 55 70 5d 3b 0a 20 20 20 20  aNode[iUp];.    
aa60: 20 20 70 2d 3e 65 54 79 70 65 20 3d 20 70 55 70    p->eType = pUp
aa70: 2d 3e 65 54 79 70 65 3b 0a 20 20 20 20 20 20 69  ->eType;.      i
aa80: 66 28 20 70 55 70 2d 3e 65 54 79 70 65 3d 3d 4a  f( pUp->eType==J
aa90: 53 4f 4e 5f 41 52 52 41 59 20 29 7b 0a 20 20 20  SON_ARRAY ){.   
aaa0: 20 20 20 20 20 69 66 28 20 69 55 70 3d 3d 70 2d       if( iUp==p-
aab0: 3e 69 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  >i-1 ){.        
aac0: 20 20 70 55 70 2d 3e 75 2e 69 4b 65 79 20 3d 20    pUp->u.iKey = 
aad0: 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
aae0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 55 70 2d  {.          pUp-
aaf0: 3e 75 2e 69 4b 65 79 2b 2b 3b 0a 20 20 20 20 20  >u.iKey++;.     
ab00: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
ab10: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
ab20: 73 77 69 74 63 68 28 20 70 2d 3e 65 54 79 70 65  switch( p->eType
ab30: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4a   ){.      case J
ab40: 53 4f 4e 5f 41 52 52 41 59 3a 20 7b 0a 20 20 20  SON_ARRAY: {.   
ab50: 20 20 20 20 20 70 2d 3e 69 20 2b 3d 20 6a 73 6f       p->i += jso
ab60: 6e 4e 6f 64 65 53 69 7a 65 28 26 70 2d 3e 73 50  nNodeSize(&p->sP
ab70: 61 72 73 65 2e 61 4e 6f 64 65 5b 70 2d 3e 69 5d  arse.aNode[p->i]
ab80: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 52  );.        p->iR
ab90: 6f 77 69 64 2b 2b 3b 0a 20 20 20 20 20 20 20 20  owid++;.        
aba0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
abb0: 20 20 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f 4f       case JSON_O
abc0: 42 4a 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 20  BJECT: {.       
abd0: 20 70 2d 3e 69 20 2b 3d 20 31 20 2b 20 6a 73 6f   p->i += 1 + jso
abe0: 6e 4e 6f 64 65 53 69 7a 65 28 26 70 2d 3e 73 50  nNodeSize(&p->sP
abf0: 61 72 73 65 2e 61 4e 6f 64 65 5b 70 2d 3e 69 2b  arse.aNode[p->i+
ac00: 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  1]);.        p->
ac10: 69 52 6f 77 69 64 2b 2b 3b 0a 20 20 20 20 20 20  iRowid++;.      
ac20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
ac30: 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20  .      default: 
ac40: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 20 3d  {.        p->i =
ac50: 20 70 2d 3e 69 45 6e 64 3b 0a 20 20 20 20 20 20   p->iEnd;.      
ac60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
ac70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
ac80: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
ac90: 0a 0a 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20  ../* Append the 
aca0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 70 61 74 68  name of the path
acb0: 20 66 6f 72 20 65 6c 65 6d 65 6e 74 20 69 20 74   for element i t
acc0: 6f 20 70 53 74 72 0a 2a 2f 0a 73 74 61 74 69 63  o pStr.*/.static
acd0: 20 76 6f 69 64 20 6a 73 6f 6e 45 61 63 68 43 6f   void jsonEachCo
ace0: 6d 70 75 74 65 50 61 74 68 28 0a 20 20 4a 73 6f  mputePath(.  Jso
acf0: 6e 45 61 63 68 43 75 72 73 6f 72 20 2a 70 2c 20  nEachCursor *p, 
ad00: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
ad10: 73 6f 72 20 2a 2f 0a 20 20 4a 73 6f 6e 53 74 72  sor */.  JsonStr
ad20: 69 6e 67 20 2a 70 53 74 72 2c 20 20 20 20 20 20  ing *pStr,      
ad30: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70    /* Write the p
ad40: 61 74 68 20 68 65 72 65 20 2a 2f 0a 20 20 75 33  ath here */.  u3
ad50: 32 20 69 20 20 20 20 20 20 20 20 20 20 20 20 20  2 i             
ad60: 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20 74         /* Path t
ad70: 6f 20 74 68 69 73 20 65 6c 65 6d 65 6e 74 20 2a  o this element *
ad80: 2f 0a 29 7b 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20  /.){.  JsonNode 
ad90: 2a 70 4e 6f 64 65 2c 20 2a 70 55 70 3b 0a 20 20  *pNode, *pUp;.  
ada0: 75 33 32 20 69 55 70 3b 0a 20 20 69 66 28 20 69  u32 iUp;.  if( i
adb0: 3d 3d 30 20 29 7b 0a 20 20 20 20 6a 73 6f 6e 41  ==0 ){.    jsonA
adc0: 70 70 65 6e 64 43 68 61 72 28 70 53 74 72 2c 20  ppendChar(pStr, 
add0: 27 24 27 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  '$');.    return
ade0: 3b 0a 20 20 7d 0a 20 20 69 55 70 20 3d 20 70 2d  ;.  }.  iUp = p-
adf0: 3e 73 50 61 72 73 65 2e 61 55 70 5b 69 5d 3b 0a  >sParse.aUp[i];.
ae00: 20 20 6a 73 6f 6e 45 61 63 68 43 6f 6d 70 75 74    jsonEachComput
ae10: 65 50 61 74 68 28 70 2c 20 70 53 74 72 2c 20 69  ePath(p, pStr, i
ae20: 55 70 29 3b 0a 20 20 70 4e 6f 64 65 20 3d 20 26  Up);.  pNode = &
ae30: 70 2d 3e 73 50 61 72 73 65 2e 61 4e 6f 64 65 5b  p->sParse.aNode[
ae40: 69 5d 3b 0a 20 20 70 55 70 20 3d 20 26 70 2d 3e  i];.  pUp = &p->
ae50: 73 50 61 72 73 65 2e 61 4e 6f 64 65 5b 69 55 70  sParse.aNode[iUp
ae60: 5d 3b 0a 20 20 69 66 28 20 70 55 70 2d 3e 65 54  ];.  if( pUp->eT
ae70: 79 70 65 3d 3d 4a 53 4f 4e 5f 41 52 52 41 59 20  ype==JSON_ARRAY 
ae80: 29 7b 0a 20 20 20 20 6a 73 6f 6e 50 72 69 6e 74  ){.    jsonPrint
ae90: 66 28 33 30 2c 20 70 53 74 72 2c 20 22 5b 25 64  f(30, pStr, "[%d
aea0: 5d 22 2c 20 70 55 70 2d 3e 75 2e 69 4b 65 79 29  ]", pUp->u.iKey)
aeb0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
aec0: 73 73 65 72 74 28 20 70 55 70 2d 3e 65 54 79 70  ssert( pUp->eTyp
aed0: 65 3d 3d 4a 53 4f 4e 5f 4f 42 4a 45 43 54 20 29  e==JSON_OBJECT )
aee0: 3b 0a 20 20 20 20 69 66 28 20 28 70 4e 6f 64 65  ;.    if( (pNode
aef0: 2d 3e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44  ->jnFlags & JNOD
af00: 45 5f 4c 41 42 45 4c 29 3d 3d 30 20 29 20 70 4e  E_LABEL)==0 ) pN
af10: 6f 64 65 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72  ode--;.    asser
af20: 74 28 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65 3d  t( pNode->eType=
af30: 3d 4a 53 4f 4e 5f 53 54 52 49 4e 47 20 29 3b 0a  =JSON_STRING );.
af40: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64      assert( pNod
af50: 65 2d 3e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f  e->jnFlags & JNO
af60: 44 45 5f 4c 41 42 45 4c 20 29 3b 0a 20 20 20 20  DE_LABEL );.    
af70: 6a 73 6f 6e 50 72 69 6e 74 66 28 70 4e 6f 64 65  jsonPrintf(pNode
af80: 2d 3e 6e 2b 31 2c 20 70 53 74 72 2c 20 22 2e 25  ->n+1, pStr, ".%
af90: 2e 2a 73 22 2c 20 70 4e 6f 64 65 2d 3e 6e 2d 32  .*s", pNode->n-2
afa0: 2c 20 70 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e  , pNode->u.zJCon
afb0: 74 65 6e 74 2b 31 29 3b 0a 20 20 7d 0a 7d 0a 0a  tent+1);.  }.}..
afc0: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61  /* Return the va
afd0: 6c 75 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20  lue of a column 
afe0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 73  */.static int js
aff0: 6f 6e 45 61 63 68 43 6f 6c 75 6d 6e 28 0a 20 20  onEachColumn(.  
b000: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
b010: 73 6f 72 20 2a 63 75 72 2c 20 20 20 2f 2a 20 54  sor *cur,   /* T
b020: 68 65 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 73  he cursor */.  s
b030: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
b040: 63 74 78 2c 20 20 20 20 20 20 20 2f 2a 20 46 69  ctx,       /* Fi
b050: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
b060: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 2e  sqlite3_result_.
b070: 2e 2e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 69 20  ..() */.  int i 
b080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b090: 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 63        /* Which c
b0a0: 6f 6c 75 6d 6e 20 74 6f 20 72 65 74 75 72 6e 20  olumn to return 
b0b0: 2a 2f 0a 29 7b 0a 20 20 4a 73 6f 6e 45 61 63 68  */.){.  JsonEach
b0c0: 43 75 72 73 6f 72 20 2a 70 20 3d 20 28 4a 73 6f  Cursor *p = (Jso
b0d0: 6e 45 61 63 68 43 75 72 73 6f 72 2a 29 63 75 72  nEachCursor*)cur
b0e0: 3b 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 54  ;.  JsonNode *pT
b0f0: 68 69 73 20 3d 20 26 70 2d 3e 73 50 61 72 73 65  his = &p->sParse
b100: 2e 61 4e 6f 64 65 5b 70 2d 3e 69 5d 3b 0a 20 20  .aNode[p->i];.  
b110: 73 77 69 74 63 68 28 20 69 20 29 7b 0a 20 20 20  switch( i ){.   
b120: 20 63 61 73 65 20 4a 45 41 43 48 5f 4b 45 59 3a   case JEACH_KEY:
b130: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   {.      if( p->
b140: 69 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  i==0 ) break;.  
b150: 20 20 20 20 69 66 28 20 70 2d 3e 65 54 79 70 65      if( p->eType
b160: 3d 3d 4a 53 4f 4e 5f 4f 42 4a 45 43 54 20 29 7b  ==JSON_OBJECT ){
b170: 0a 20 20 20 20 20 20 20 20 6a 73 6f 6e 52 65 74  .        jsonRet
b180: 75 72 6e 28 70 54 68 69 73 2c 20 63 74 78 2c 20  urn(pThis, ctx, 
b190: 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  0);.      }else 
b1a0: 69 66 28 20 70 2d 3e 65 54 79 70 65 3d 3d 4a 53  if( p->eType==JS
b1b0: 4f 4e 5f 41 52 52 41 59 20 29 7b 0a 20 20 20 20  ON_ARRAY ){.    
b1c0: 20 20 20 20 75 33 32 20 69 4b 65 79 3b 0a 20 20      u32 iKey;.  
b1d0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 62 52 65        if( p->bRe
b1e0: 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20  cursive ){.     
b1f0: 20 20 20 20 20 69 66 28 20 70 2d 3e 69 52 6f 77       if( p->iRow
b200: 69 64 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  id==0 ) break;. 
b210: 20 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20           iKey = 
b220: 70 2d 3e 73 50 61 72 73 65 2e 61 4e 6f 64 65 5b  p->sParse.aNode[
b230: 70 2d 3e 73 50 61 72 73 65 2e 61 55 70 5b 70 2d  p->sParse.aUp[p-
b240: 3e 69 5d 5d 2e 75 2e 69 4b 65 79 3b 0a 20 20 20  >i]].u.iKey;.   
b250: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b260: 20 20 20 20 20 20 69 4b 65 79 20 3d 20 70 2d 3e        iKey = p->
b270: 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20  iRowid;.        
b280: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
b290: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63  3_result_int64(c
b2a0: 74 78 2c 20 28 73 71 6c 69 74 65 33 5f 69 6e 74  tx, (sqlite3_int
b2b0: 36 34 29 69 4b 65 79 29 3b 0a 20 20 20 20 20 20  64)iKey);.      
b2c0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
b2d0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 45     }.    case JE
b2e0: 41 43 48 5f 56 41 4c 55 45 3a 20 7b 0a 20 20 20  ACH_VALUE: {.   
b2f0: 20 20 20 69 66 28 20 70 54 68 69 73 2d 3e 6a 6e     if( pThis->jn
b300: 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 4c 41  Flags & JNODE_LA
b310: 42 45 4c 20 29 20 70 54 68 69 73 2b 2b 3b 0a 20  BEL ) pThis++;. 
b320: 20 20 20 20 20 6a 73 6f 6e 52 65 74 75 72 6e 28       jsonReturn(
b330: 70 54 68 69 73 2c 20 63 74 78 2c 20 30 29 3b 0a  pThis, ctx, 0);.
b340: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b350: 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 45 41 43   }.    case JEAC
b360: 48 5f 54 59 50 45 3a 20 7b 0a 20 20 20 20 20 20  H_TYPE: {.      
b370: 69 66 28 20 70 54 68 69 73 2d 3e 6a 6e 46 6c 61  if( pThis->jnFla
b380: 67 73 20 26 20 4a 4e 4f 44 45 5f 4c 41 42 45 4c  gs & JNODE_LABEL
b390: 20 29 20 70 54 68 69 73 2b 2b 3b 0a 20 20 20 20   ) pThis++;.    
b3a0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
b3b0: 5f 74 65 78 74 28 63 74 78 2c 20 6a 73 6f 6e 54  _text(ctx, jsonT
b3c0: 79 70 65 5b 70 54 68 69 73 2d 3e 65 54 79 70 65  ype[pThis->eType
b3d0: 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54  ], -1, SQLITE_ST
b3e0: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65  ATIC);.      bre
b3f0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
b400: 73 65 20 4a 45 41 43 48 5f 41 54 4f 4d 3a 20 7b  se JEACH_ATOM: {
b410: 0a 20 20 20 20 20 20 69 66 28 20 70 54 68 69 73  .      if( pThis
b420: 2d 3e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44  ->jnFlags & JNOD
b430: 45 5f 4c 41 42 45 4c 20 29 20 70 54 68 69 73 2b  E_LABEL ) pThis+
b440: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 68  +;.      if( pTh
b450: 69 73 2d 3e 65 54 79 70 65 3e 3d 4a 53 4f 4e 5f  is->eType>=JSON_
b460: 41 52 52 41 59 20 29 20 62 72 65 61 6b 3b 0a 20  ARRAY ) break;. 
b470: 20 20 20 20 20 6a 73 6f 6e 52 65 74 75 72 6e 28       jsonReturn(
b480: 70 54 68 69 73 2c 20 63 74 78 2c 20 30 29 3b 0a  pThis, ctx, 0);.
b490: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b4a0: 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 45 41 43   }.    case JEAC
b4b0: 48 5f 49 44 3a 20 7b 0a 20 20 20 20 20 20 73 71  H_ID: {.      sq
b4c0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
b4d0: 36 34 28 63 74 78 2c 20 0a 20 20 20 20 20 20 20  64(ctx, .       
b4e0: 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34    (sqlite3_int64
b4f0: 29 70 2d 3e 69 20 2b 20 28 28 70 54 68 69 73 2d  )p->i + ((pThis-
b500: 3e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45  >jnFlags & JNODE
b510: 5f 4c 41 42 45 4c 29 21 3d 30 29 29 3b 0a 20 20  _LABEL)!=0));.  
b520: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
b530: 0a 20 20 20 20 63 61 73 65 20 4a 45 41 43 48 5f  .    case JEACH_
b540: 50 41 52 45 4e 54 3a 20 7b 0a 20 20 20 20 20 20  PARENT: {.      
b550: 69 66 28 20 70 2d 3e 69 3e 70 2d 3e 69 42 65 67  if( p->i>p->iBeg
b560: 69 6e 20 26 26 20 70 2d 3e 62 52 65 63 75 72 73  in && p->bRecurs
b570: 69 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ive ){.        s
b580: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
b590: 74 36 34 28 63 74 78 2c 20 28 73 71 6c 69 74 65  t64(ctx, (sqlite
b5a0: 33 5f 69 6e 74 36 34 29 70 2d 3e 73 50 61 72 73  3_int64)p->sPars
b5b0: 65 2e 61 55 70 5b 70 2d 3e 69 5d 29 3b 0a 20 20  e.aUp[p->i]);.  
b5c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
b5d0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
b5e0: 65 20 4a 45 41 43 48 5f 46 55 4c 4c 4b 45 59 3a  e JEACH_FULLKEY:
b5f0: 20 7b 0a 20 20 20 20 20 20 4a 73 6f 6e 53 74 72   {.      JsonStr
b600: 69 6e 67 20 78 3b 0a 20 20 20 20 20 20 6a 73 6f  ing x;.      jso
b610: 6e 49 6e 69 74 28 26 78 2c 20 63 74 78 29 3b 0a  nInit(&x, ctx);.
b620: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 62 52 65        if( p->bRe
b630: 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20  cursive ){.     
b640: 20 20 20 6a 73 6f 6e 45 61 63 68 43 6f 6d 70 75     jsonEachCompu
b650: 74 65 50 61 74 68 28 70 2c 20 26 78 2c 20 70 2d  tePath(p, &x, p-
b660: 3e 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  >i);.      }else
b670: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
b680: 3e 7a 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20  >zRoot ){.      
b690: 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 52 61      jsonAppendRa
b6a0: 77 28 26 78 2c 20 70 2d 3e 7a 52 6f 6f 74 2c 20  w(&x, p->zRoot, 
b6b0: 28 69 6e 74 29 73 74 72 6c 65 6e 28 70 2d 3e 7a  (int)strlen(p->z
b6c0: 52 6f 6f 74 29 29 3b 0a 20 20 20 20 20 20 20 20  Root));.        
b6d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
b6e0: 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61 72 28   jsonAppendChar(
b6f0: 26 78 2c 20 27 24 27 29 3b 0a 20 20 20 20 20 20  &x, '$');.      
b700: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
b710: 70 2d 3e 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f 41  p->eType==JSON_A
b720: 52 52 41 59 20 29 7b 0a 20 20 20 20 20 20 20 20  RRAY ){.        
b730: 20 20 6a 73 6f 6e 50 72 69 6e 74 66 28 33 30 2c    jsonPrintf(30,
b740: 20 26 78 2c 20 22 5b 25 64 5d 22 2c 20 70 2d 3e   &x, "[%d]", p->
b750: 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  iRowid);.       
b760: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
b770: 20 20 6a 73 6f 6e 50 72 69 6e 74 66 28 70 54 68    jsonPrintf(pTh
b780: 69 73 2d 3e 6e 2c 20 26 78 2c 20 22 2e 25 2e 2a  is->n, &x, ".%.*
b790: 73 22 2c 20 70 54 68 69 73 2d 3e 6e 2d 32 2c 20  s", pThis->n-2, 
b7a0: 70 54 68 69 73 2d 3e 75 2e 7a 4a 43 6f 6e 74 65  pThis->u.zJConte
b7b0: 6e 74 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  nt+1);.        }
b7c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6a  .      }.      j
b7d0: 73 6f 6e 52 65 73 75 6c 74 28 26 78 29 3b 0a 20  sonResult(&x);. 
b7e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b7f0: 7d 0a 20 20 20 20 63 61 73 65 20 4a 45 41 43 48  }.    case JEACH
b800: 5f 50 41 54 48 3a 20 7b 0a 20 20 20 20 20 20 69  _PATH: {.      i
b810: 66 28 20 70 2d 3e 62 52 65 63 75 72 73 69 76 65  f( p->bRecursive
b820: 20 29 7b 0a 20 20 20 20 20 20 20 20 4a 73 6f 6e   ){.        Json
b830: 53 74 72 69 6e 67 20 78 3b 0a 20 20 20 20 20 20  String x;.      
b840: 20 20 6a 73 6f 6e 49 6e 69 74 28 26 78 2c 20 63    jsonInit(&x, c
b850: 74 78 29 3b 0a 20 20 20 20 20 20 20 20 6a 73 6f  tx);.        jso
b860: 6e 45 61 63 68 43 6f 6d 70 75 74 65 50 61 74 68  nEachComputePath
b870: 28 70 2c 20 26 78 2c 20 70 2d 3e 73 50 61 72 73  (p, &x, p->sPars
b880: 65 2e 61 55 70 5b 70 2d 3e 69 5d 29 3b 0a 20 20  e.aUp[p->i]);.  
b890: 20 20 20 20 20 20 6a 73 6f 6e 52 65 73 75 6c 74        jsonResult
b8a0: 28 26 78 29 3b 0a 20 20 20 20 20 20 20 20 62 72  (&x);.        br
b8b0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
b8c0: 20 20 20 2f 2a 20 46 6f 72 20 6a 73 6f 6e 5f 65     /* For json_e
b8d0: 61 63 68 28 29 20 70 61 74 68 20 61 6e 64 20 72  ach() path and r
b8e0: 6f 6f 74 20 61 72 65 20 74 68 65 20 73 61 6d 65  oot are the same
b8f0: 20 73 6f 20 66 61 6c 6c 20 74 68 72 6f 75 67 68   so fall through
b900: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74  .      ** into t
b910: 68 65 20 72 6f 6f 74 20 63 61 73 65 20 2a 2f 0a  he root case */.
b920: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a      }.    case J
b930: 45 41 43 48 5f 52 4f 4f 54 3a 20 7b 0a 20 20 20  EACH_ROOT: {.   
b940: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
b950: 52 6f 6f 74 20 3d 20 70 2d 3e 7a 52 6f 6f 74 3b  Root = p->zRoot;
b960: 0a 20 20 20 20 20 20 20 69 66 28 20 7a 52 6f 6f  .       if( zRoo
b970: 74 3d 3d 30 20 29 20 7a 52 6f 6f 74 20 3d 20 22  t==0 ) zRoot = "
b980: 24 22 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  $";.      sqlite
b990: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 74  3_result_text(ct
b9a0: 78 2c 20 7a 52 6f 6f 74 2c 20 2d 31 2c 20 53 51  x, zRoot, -1, SQ
b9b0: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
b9c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
b9d0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
b9e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3d        assert( i=
b9f0: 3d 4a 45 41 43 48 5f 4a 53 4f 4e 20 29 3b 0a 20  =JEACH_JSON );. 
ba00: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
ba10: 75 6c 74 5f 74 65 78 74 28 63 74 78 2c 20 70 2d  ult_text(ctx, p-
ba20: 3e 73 50 61 72 73 65 2e 7a 4a 73 6f 6e 2c 20 2d  >sParse.zJson, -
ba30: 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
ba40: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
ba50: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
ba60: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
ba70: 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  ./* Return the c
ba80: 75 72 72 65 6e 74 20 72 6f 77 69 64 20 76 61 6c  urrent rowid val
ba90: 75 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ue */.static int
baa0: 20 6a 73 6f 6e 45 61 63 68 52 6f 77 69 64 28 73   jsonEachRowid(s
bab0: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
bac0: 6f 72 20 2a 63 75 72 2c 20 73 71 6c 69 74 65 5f  or *cur, sqlite_
bad0: 69 6e 74 36 34 20 2a 70 52 6f 77 69 64 29 7b 0a  int64 *pRowid){.
bae0: 20 20 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72    JsonEachCursor
baf0: 20 2a 70 20 3d 20 28 4a 73 6f 6e 45 61 63 68 43   *p = (JsonEachC
bb00: 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20 20 2a 70  ursor*)cur;.  *p
bb10: 52 6f 77 69 64 20 3d 20 70 2d 3e 69 52 6f 77 69  Rowid = p->iRowi
bb20: 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  d;.  return SQLI
bb30: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  TE_OK;.}../* The
bb40: 20 71 75 65 72 79 20 73 74 72 61 74 65 67 79 20   query strategy 
bb50: 69 73 20 74 6f 20 6c 6f 6f 6b 20 66 6f 72 20 61  is to look for a
bb60: 6e 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  n equality const
bb70: 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6a 73 6f  raint on the jso
bb80: 6e 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 20 20 57 69  n.** column.  Wi
bb90: 74 68 6f 75 74 20 73 75 63 68 20 61 20 63 6f 6e  thout such a con
bba0: 73 74 72 61 69 6e 74 2c 20 74 68 65 20 74 61 62  straint, the tab
bbb0: 6c 65 20 63 61 6e 6e 6f 74 20 6f 70 65 72 61 74  le cannot operat
bbc0: 65 2e 20 20 69 64 78 4e 75 6d 20 69 73 0a 2a 2a  e.  idxNum is.**
bbd0: 20 31 20 69 66 20 74 68 65 20 63 6f 6e 73 74 72   1 if the constr
bbe0: 61 69 6e 74 20 69 73 20 66 6f 75 6e 64 2c 20 33  aint is found, 3
bbf0: 20 69 66 20 74 68 65 20 63 6f 6e 73 74 72 61 69   if the constrai
bc00: 6e 74 20 61 6e 64 20 7a 52 6f 6f 74 20 61 72 65  nt and zRoot are
bc10: 20 66 6f 75 6e 64 2c 0a 2a 2a 20 61 6e 64 20 30   found,.** and 0
bc20: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
bc30: 74 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e 45 61  tatic int jsonEa
bc40: 63 68 42 65 73 74 49 6e 64 65 78 28 0a 20 20 73  chBestIndex(.  s
bc50: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 74 61 62  qlite3_vtab *tab
bc60: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ,.  sqlite3_inde
bc70: 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f  x_info *pIdxInfo
bc80: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  .){.  int i;.  i
bc90: 6e 74 20 6a 73 6f 6e 49 64 78 20 3d 20 2d 31 3b  nt jsonIdx = -1;
bca0: 0a 20 20 69 6e 74 20 72 6f 6f 74 49 64 78 20 3d  .  int rootIdx =
bcb0: 20 2d 31 3b 0a 20 20 63 6f 6e 73 74 20 73 74 72   -1;.  const str
bcc0: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
bcd0: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 43  x_constraint *pC
bce0: 6f 6e 73 74 72 61 69 6e 74 3b 0a 0a 20 20 55 4e  onstraint;..  UN
bcf0: 55 53 45 44 5f 50 41 52 41 4d 28 74 61 62 29 3b  USED_PARAM(tab);
bd00: 0a 20 20 70 43 6f 6e 73 74 72 61 69 6e 74 20 3d  .  pConstraint =
bd10: 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73   pIdxInfo->aCons
bd20: 74 72 61 69 6e 74 3b 0a 20 20 66 6f 72 28 69 3d  traint;.  for(i=
bd30: 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e  0; i<pIdxInfo->n
bd40: 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c  Constraint; i++,
bd50: 20 70 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 29 7b   pConstraint++){
bd60: 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 73 74 72  .    if( pConstr
bd70: 61 69 6e 74 2d 3e 75 73 61 62 6c 65 3d 3d 30 20  aint->usable==0 
bd80: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
bd90: 69 66 28 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d  if( pConstraint-
bda0: 3e 6f 70 21 3d 53 51 4c 49 54 45 5f 49 4e 44 45  >op!=SQLITE_INDE
bdb0: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20  X_CONSTRAINT_EQ 
bdc0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
bdd0: 73 77 69 74 63 68 28 20 70 43 6f 6e 73 74 72 61  switch( pConstra
bde0: 69 6e 74 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a  int->iColumn ){.
bdf0: 20 20 20 20 20 20 63 61 73 65 20 4a 45 41 43 48        case JEACH
be00: 5f 4a 53 4f 4e 3a 20 20 20 6a 73 6f 6e 49 64 78  _JSON:   jsonIdx
be10: 20 3d 20 69 3b 20 20 20 20 62 72 65 61 6b 3b 0a   = i;    break;.
be20: 20 20 20 20 20 20 63 61 73 65 20 4a 45 41 43 48        case JEACH
be30: 5f 52 4f 4f 54 3a 20 20 20 72 6f 6f 74 49 64 78  _ROOT:   rootIdx
be40: 20 3d 20 69 3b 20 20 20 20 62 72 65 61 6b 3b 0a   = i;    break;.
be50: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20        default:  
be60: 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f           /* no-o
be70: 70 20 2a 2f 20 20 20 20 20 62 72 65 61 6b 3b 0a  p */     break;.
be80: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
be90: 6a 73 6f 6e 49 64 78 3c 30 20 29 7b 0a 20 20 20  jsonIdx<0 ){.   
bea0: 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75   pIdxInfo->idxNu
beb0: 6d 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49  m = 0;.    pIdxI
bec0: 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  nfo->estimatedCo
bed0: 73 74 20 3d 20 31 65 39 39 3b 0a 20 20 7d 65 6c  st = 1e99;.  }el
bee0: 73 65 7b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f  se{.    pIdxInfo
bef0: 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20  ->estimatedCost 
bf00: 3d 20 31 2e 30 3b 0a 20 20 20 20 70 49 64 78 49  = 1.0;.    pIdxI
bf10: 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
bf20: 55 73 61 67 65 5b 6a 73 6f 6e 49 64 78 5d 2e 61  Usage[jsonIdx].a
bf30: 72 67 76 49 6e 64 65 78 20 3d 20 31 3b 0a 20 20  rgvIndex = 1;.  
bf40: 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e    pIdxInfo->aCon
bf50: 73 74 72 61 69 6e 74 55 73 61 67 65 5b 6a 73 6f  straintUsage[jso
bf60: 6e 49 64 78 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a  nIdx].omit = 1;.
bf70: 20 20 20 20 69 66 28 20 72 6f 6f 74 49 64 78 3c      if( rootIdx<
bf80: 30 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 49  0 ){.      pIdxI
bf90: 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 31 3b  nfo->idxNum = 1;
bfa0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
bfb0: 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e    pIdxInfo->aCon
bfc0: 73 74 72 61 69 6e 74 55 73 61 67 65 5b 72 6f 6f  straintUsage[roo
bfd0: 74 49 64 78 5d 2e 61 72 67 76 49 6e 64 65 78 20  tIdx].argvIndex 
bfe0: 3d 20 32 3b 0a 20 20 20 20 20 20 70 49 64 78 49  = 2;.      pIdxI
bff0: 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
c000: 55 73 61 67 65 5b 72 6f 6f 74 49 64 78 5d 2e 6f  Usage[rootIdx].o
c010: 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  mit = 1;.      p
c020: 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20  IdxInfo->idxNum 
c030: 3d 20 33 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 3;.    }.  }. 
c040: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
c050: 4b 3b 0a 7d 0a 0a 2f 2a 20 53 74 61 72 74 20 61  K;.}../* Start a
c060: 20 73 65 61 72 63 68 20 6f 6e 20 61 20 6e 65 77   search on a new
c070: 20 4a 53 4f 4e 20 73 74 72 69 6e 67 20 2a 2f 0a   JSON string */.
c080: 73 74 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e 45  static int jsonE
c090: 61 63 68 46 69 6c 74 65 72 28 0a 20 20 73 71 6c  achFilter(.  sql
c0a0: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
c0b0: 20 2a 63 75 72 2c 0a 20 20 69 6e 74 20 69 64 78   *cur,.  int idx
c0c0: 4e 75 6d 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Num, const char 
c0d0: 2a 69 64 78 53 74 72 2c 0a 20 20 69 6e 74 20 61  *idxStr,.  int a
c0e0: 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
c0f0: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 4a  ue **argv.){.  J
c100: 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 20 2a 70  sonEachCursor *p
c110: 20 3d 20 28 4a 73 6f 6e 45 61 63 68 43 75 72 73   = (JsonEachCurs
c120: 6f 72 2a 29 63 75 72 3b 0a 20 20 63 6f 6e 73 74  or*)cur;.  const
c130: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63 6f 6e 73   char *z;.  cons
c140: 74 20 63 68 61 72 20 2a 7a 52 6f 6f 74 3b 0a 20  t char *zRoot;. 
c150: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
c160: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
c170: 4d 28 69 64 78 53 74 72 29 3b 0a 20 20 55 4e 55  M(idxStr);.  UNU
c180: 53 45 44 5f 50 41 52 41 4d 28 61 72 67 63 29 3b  SED_PARAM(argc);
c190: 0a 20 20 6a 73 6f 6e 45 61 63 68 43 75 72 73 6f  .  jsonEachCurso
c1a0: 72 52 65 73 65 74 28 70 29 3b 0a 20 20 69 66 28  rReset(p);.  if(
c1b0: 20 69 64 78 4e 75 6d 3d 3d 30 20 29 20 72 65 74   idxNum==0 ) ret
c1c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
c1d0: 20 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72   z = (const char
c1e0: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
c1f0: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  text(argv[0]);. 
c200: 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75   if( z==0 ) retu
c210: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
c220: 69 66 28 20 69 64 78 4e 75 6d 26 32 20 29 7b 0a  if( idxNum&2 ){.
c230: 20 20 20 20 7a 52 6f 6f 74 20 3d 20 28 63 6f 6e      zRoot = (con
c240: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
c250: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
c260: 5b 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a 52  [1]);.    if( zR
c270: 6f 6f 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  oot==0 ) return 
c280: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69  SQLITE_OK;.    i
c290: 66 28 20 7a 52 6f 6f 74 5b 30 5d 21 3d 27 24 27  f( zRoot[0]!='$'
c2a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
c2b0: 33 5f 66 72 65 65 28 63 75 72 2d 3e 70 56 74 61  3_free(cur->pVta
c2c0: 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  b->zErrMsg);.   
c2d0: 20 20 20 63 75 72 2d 3e 70 56 74 61 62 2d 3e 7a     cur->pVtab->z
c2e0: 45 72 72 4d 73 67 20 3d 20 6a 73 6f 6e 50 61 74  ErrMsg = jsonPat
c2f0: 68 53 79 6e 74 61 78 45 72 72 6f 72 28 7a 52 6f  hSyntaxError(zRo
c300: 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ot);.      retur
c310: 6e 20 63 75 72 2d 3e 70 56 74 61 62 2d 3e 7a 45  n cur->pVtab->zE
c320: 72 72 4d 73 67 20 3f 20 53 51 4c 49 54 45 5f 45  rrMsg ? SQLITE_E
c330: 52 52 4f 52 20 3a 20 53 51 4c 49 54 45 5f 4e 4f  RROR : SQLITE_NO
c340: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
c350: 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   n = sqlite3_val
c360: 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d  ue_bytes(argv[0]
c370: 29 3b 0a 20 20 70 2d 3e 7a 4a 73 6f 6e 20 3d 20  );.  p->zJson = 
c380: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
c390: 28 20 6e 2b 31 20 29 3b 0a 20 20 69 66 28 20 70  ( n+1 );.  if( p
c3a0: 2d 3e 7a 4a 73 6f 6e 3d 3d 30 20 29 20 72 65 74  ->zJson==0 ) ret
c3b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
c3c0: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e 7a 4a  ;.  memcpy(p->zJ
c3d0: 73 6f 6e 2c 20 7a 2c 20 28 73 69 7a 65 5f 74 29  son, z, (size_t)
c3e0: 6e 2b 31 29 3b 0a 20 20 69 66 28 20 6a 73 6f 6e  n+1);.  if( json
c3f0: 50 61 72 73 65 28 26 70 2d 3e 73 50 61 72 73 65  Parse(&p->sParse
c400: 2c 20 30 2c 20 70 2d 3e 7a 4a 73 6f 6e 29 20 29  , 0, p->zJson) )
c410: 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53  {.    int rc = S
c420: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
c430: 20 69 66 28 20 70 2d 3e 73 50 61 72 73 65 2e 6f   if( p->sParse.o
c440: 6f 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  om==0 ){.      s
c450: 71 6c 69 74 65 33 5f 66 72 65 65 28 63 75 72 2d  qlite3_free(cur-
c460: 3e 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29  >pVtab->zErrMsg)
c470: 3b 0a 20 20 20 20 20 20 63 75 72 2d 3e 70 56 74  ;.      cur->pVt
c480: 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71  ab->zErrMsg = sq
c490: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6d  lite3_mprintf("m
c4a0: 61 6c 66 6f 72 6d 65 64 20 4a 53 4f 4e 22 29 3b  alformed JSON");
c4b0: 0a 20 20 20 20 20 20 69 66 28 20 63 75 72 2d 3e  .      if( cur->
c4c0: 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29  pVtab->zErrMsg )
c4d0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
c4e0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 73  OR;.    }.    js
c4f0: 6f 6e 45 61 63 68 43 75 72 73 6f 72 52 65 73 65  onEachCursorRese
c500: 74 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  t(p);.    return
c510: 20 72 63 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28   rc;.  }else if(
c520: 20 70 2d 3e 62 52 65 63 75 72 73 69 76 65 20 26   p->bRecursive &
c530: 26 20 6a 73 6f 6e 50 61 72 73 65 46 69 6e 64 50  & jsonParseFindP
c540: 61 72 65 6e 74 73 28 26 70 2d 3e 73 50 61 72 73  arents(&p->sPars
c550: 65 29 20 29 7b 0a 20 20 20 20 6a 73 6f 6e 45 61  e) ){.    jsonEa
c560: 63 68 43 75 72 73 6f 72 52 65 73 65 74 28 70 29  chCursorReset(p)
c570: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
c580: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c  ITE_NOMEM;.  }el
c590: 73 65 7b 0a 20 20 20 20 4a 73 6f 6e 4e 6f 64 65  se{.    JsonNode
c5a0: 20 2a 70 4e 6f 64 65 3b 0a 20 20 20 20 69 66 28   *pNode;.    if(
c5b0: 20 69 64 78 4e 75 6d 3d 3d 33 20 29 7b 0a 20 20   idxNum==3 ){.  
c5c0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
c5d0: 7a 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  zErr = 0;.      
c5e0: 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  n = sqlite3_valu
c5f0: 65 5f 62 79 74 65 73 28 61 72 67 76 5b 31 5d 29  e_bytes(argv[1])
c600: 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 52 6f 6f 74  ;.      p->zRoot
c610: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
c620: 63 36 34 28 20 6e 2b 31 20 29 3b 0a 20 20 20 20  c64( n+1 );.    
c630: 20 20 69 66 28 20 70 2d 3e 7a 52 6f 6f 74 3d 3d    if( p->zRoot==
c640: 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
c650: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 6d  E_NOMEM;.      m
c660: 65 6d 63 70 79 28 70 2d 3e 7a 52 6f 6f 74 2c 20  emcpy(p->zRoot, 
c670: 7a 52 6f 6f 74 2c 20 28 73 69 7a 65 5f 74 29 6e  zRoot, (size_t)n
c680: 2b 31 29 3b 0a 20 20 20 20 20 20 70 4e 6f 64 65  +1);.      pNode
c690: 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 53 74 65   = jsonLookupSte
c6a0: 70 28 26 70 2d 3e 73 50 61 72 73 65 2c 20 30 2c  p(&p->sParse, 0,
c6b0: 20 70 2d 3e 7a 52 6f 6f 74 2b 31 2c 20 30 2c 20   p->zRoot+1, 0, 
c6c0: 26 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 69 66  &zErr);.      if
c6d0: 28 20 70 2d 3e 73 50 61 72 73 65 2e 6e 45 72 72  ( p->sParse.nErr
c6e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
c6f0: 74 65 33 5f 66 72 65 65 28 63 75 72 2d 3e 70 56  te3_free(cur->pV
c700: 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  tab->zErrMsg);. 
c710: 20 20 20 20 20 20 20 63 75 72 2d 3e 70 56 74 61         cur->pVta
c720: 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 6a 73 6f  b->zErrMsg = jso
c730: 6e 50 61 74 68 53 79 6e 74 61 78 45 72 72 6f 72  nPathSyntaxError
c740: 28 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 20 20  (zErr);.        
c750: 6a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 52 65  jsonEachCursorRe
c760: 73 65 74 28 70 29 3b 0a 20 20 20 20 20 20 20 20  set(p);.        
c770: 72 65 74 75 72 6e 20 63 75 72 2d 3e 70 56 74 61  return cur->pVta
c780: 62 2d 3e 7a 45 72 72 4d 73 67 20 3f 20 53 51 4c  b->zErrMsg ? SQL
c790: 49 54 45 5f 45 52 52 4f 52 20 3a 20 53 51 4c 49  ITE_ERROR : SQLI
c7a0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
c7b0: 7d 65 6c 73 65 20 69 66 28 20 70 4e 6f 64 65 3d  }else if( pNode=
c7c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
c7d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
c7e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
c7f0: 65 7b 0a 20 20 20 20 20 20 70 4e 6f 64 65 20 3d  e{.      pNode =
c800: 20 70 2d 3e 73 50 61 72 73 65 2e 61 4e 6f 64 65   p->sParse.aNode
c810: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69  ;.    }.    p->i
c820: 42 65 67 69 6e 20 3d 20 70 2d 3e 69 20 3d 20 28  Begin = p->i = (
c830: 69 6e 74 29 28 70 4e 6f 64 65 20 2d 20 70 2d 3e  int)(pNode - p->
c840: 73 50 61 72 73 65 2e 61 4e 6f 64 65 29 3b 0a 20  sParse.aNode);. 
c850: 20 20 20 70 2d 3e 65 54 79 70 65 20 3d 20 70 4e     p->eType = pN
c860: 6f 64 65 2d 3e 65 54 79 70 65 3b 0a 20 20 20 20  ode->eType;.    
c870: 69 66 28 20 70 2d 3e 65 54 79 70 65 3e 3d 4a 53  if( p->eType>=JS
c880: 4f 4e 5f 41 52 52 41 59 20 29 7b 0a 20 20 20 20  ON_ARRAY ){.    
c890: 20 20 70 4e 6f 64 65 2d 3e 75 2e 69 4b 65 79 20    pNode->u.iKey 
c8a0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 45  = 0;.      p->iE
c8b0: 6e 64 20 3d 20 70 2d 3e 69 20 2b 20 70 4e 6f 64  nd = p->i + pNod
c8c0: 65 2d 3e 6e 20 2b 20 31 3b 0a 20 20 20 20 20 20  e->n + 1;.      
c8d0: 69 66 28 20 70 2d 3e 62 52 65 63 75 72 73 69 76  if( p->bRecursiv
c8e0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  e ){.        if(
c8f0: 20 70 2d 3e 69 3e 30 20 26 26 20 28 70 2d 3e 73   p->i>0 && (p->s
c900: 50 61 72 73 65 2e 61 4e 6f 64 65 5b 70 2d 3e 69  Parse.aNode[p->i
c910: 2d 31 5d 2e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e  -1].jnFlags & JN
c920: 4f 44 45 5f 4c 41 42 45 4c 29 21 3d 30 20 29 7b  ODE_LABEL)!=0 ){
c930: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 2d  .          p->i-
c940: 2d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  -;.        }.   
c950: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c960: 20 20 70 2d 3e 69 2b 2b 3b 0a 20 20 20 20 20 20    p->i++;.      
c970: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
c980: 20 20 20 70 2d 3e 69 45 6e 64 20 3d 20 70 2d 3e     p->iEnd = p->
c990: 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  i+1;.    }.  }. 
c9a0: 20 72 65 74 75 72 6e 20 70 2d 3e 73 50 61 72 73   return p->sPars
c9b0: 65 2e 6f 6f 6d 20 3f 20 53 51 4c 49 54 45 5f 4e  e.oom ? SQLITE_N
c9c0: 4f 4d 45 4d 20 3a 20 53 51 4c 49 54 45 5f 4f 4b  OMEM : SQLITE_OK
c9d0: 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 6d 65 74 68  ;.}../* The meth
c9e0: 6f 64 73 20 6f 66 20 74 68 65 20 6a 73 6f 6e 5f  ods of the json_
c9f0: 65 61 63 68 20 76 69 72 74 75 61 6c 20 74 61 62  each virtual tab
ca00: 6c 65 20 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c  le */.static sql
ca10: 69 74 65 33 5f 6d 6f 64 75 6c 65 20 6a 73 6f 6e  ite3_module json
ca20: 45 61 63 68 4d 6f 64 75 6c 65 20 3d 20 7b 0a 20  EachModule = {. 
ca30: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
ca40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
ca50: 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20  Version */.  0, 
ca60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca70: 20 20 20 20 20 20 20 20 2f 2a 20 78 43 72 65 61          /* xCrea
ca80: 74 65 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68  te */.  jsonEach
ca90: 43 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20  Connect,        
caa0: 20 20 20 2f 2a 20 78 43 6f 6e 6e 65 63 74 20 2a     /* xConnect *
cab0: 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 42 65 73 74  /.  jsonEachBest
cac0: 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 2f  Index,         /
cad0: 2a 20 78 42 65 73 74 49 6e 64 65 78 20 2a 2f 0a  * xBestIndex */.
cae0: 20 20 6a 73 6f 6e 45 61 63 68 44 69 73 63 6f 6e    jsonEachDiscon
caf0: 6e 65 63 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  nect,        /* 
cb00: 78 44 69 73 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20  xDisconnect */. 
cb10: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
cb20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
cb30: 44 65 73 74 72 6f 79 20 2a 2f 0a 20 20 6a 73 6f  Destroy */.  jso
cb40: 6e 45 61 63 68 4f 70 65 6e 45 61 63 68 2c 20 20  nEachOpenEach,  
cb50: 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e          /* xOpen
cb60: 20 2d 20 6f 70 65 6e 20 61 20 63 75 72 73 6f 72   - open a cursor
cb70: 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 43 6c   */.  jsonEachCl
cb80: 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
cb90: 20 2f 2a 20 78 43 6c 6f 73 65 20 2d 20 63 6c 6f   /* xClose - clo
cba0: 73 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20  se a cursor */. 
cbb0: 20 6a 73 6f 6e 45 61 63 68 46 69 6c 74 65 72 2c   jsonEachFilter,
cbc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
cbd0: 46 69 6c 74 65 72 20 2d 20 63 6f 6e 66 69 67 75  Filter - configu
cbe0: 72 65 20 73 63 61 6e 20 63 6f 6e 73 74 72 61 69  re scan constrai
cbf0: 6e 74 73 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63  nts */.  jsonEac
cc00: 68 4e 65 78 74 2c 20 20 20 20 20 20 20 20 20 20  hNext,          
cc10: 20 20 20 20 2f 2a 20 78 4e 65 78 74 20 2d 20 61      /* xNext - a
cc20: 64 76 61 6e 63 65 20 61 20 63 75 72 73 6f 72 20  dvance a cursor 
cc30: 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 45 6f 66  */.  jsonEachEof
cc40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
cc50: 2f 2a 20 78 45 6f 66 20 2d 20 63 68 65 63 6b 20  /* xEof - check 
cc60: 66 6f 72 20 65 6e 64 20 6f 66 20 73 63 61 6e 20  for end of scan 
cc70: 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 43 6f 6c  */.  jsonEachCol
cc80: 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  umn,            
cc90: 2f 2a 20 78 43 6f 6c 75 6d 6e 20 2d 20 72 65 61  /* xColumn - rea
cca0: 64 20 64 61 74 61 20 2a 2f 0a 20 20 6a 73 6f 6e  d data */.  json
ccb0: 45 61 63 68 52 6f 77 69 64 2c 20 20 20 20 20 20  EachRowid,      
ccc0: 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 77 69 64         /* xRowid
ccd0: 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f 0a   - read data */.
cce0: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
ccf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cd00: 78 55 70 64 61 74 65 20 2a 2f 0a 20 20 30 2c 20  xUpdate */.  0, 
cd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd20: 20 20 20 20 20 20 20 20 2f 2a 20 78 42 65 67 69          /* xBegi
cd30: 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  n */.  0,       
cd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd50: 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20    /* xSync */.  
cd60: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
cd70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
cd80: 6f 6d 6d 69 74 20 2a 2f 0a 20 20 30 2c 20 20 20  ommit */.  0,   
cd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cda0: 20 20 20 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61        /* xRollba
cdb0: 63 6b 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  ck */.  0,      
cdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cdd0: 20 20 20 2f 2a 20 78 46 69 6e 64 4d 65 74 68 6f     /* xFindMetho
cde0: 64 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  d */.  0,       
cdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce00: 20 20 2f 2a 20 78 52 65 6e 61 6d 65 20 2a 2f 0a    /* xRename */.
ce10: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
ce20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ce30: 78 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20  xSavepoint */.  
ce40: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
ce50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
ce60: 65 6c 65 61 73 65 20 2a 2f 0a 20 20 30 20 20 20  elease */.  0   
ce70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce80: 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 6c 6c 62         /* xRollb
ce90: 61 63 6b 54 6f 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  ackTo */.};../* 
cea0: 54 68 65 20 6d 65 74 68 6f 64 73 20 6f 66 20 74  The methods of t
ceb0: 68 65 20 6a 73 6f 6e 5f 74 72 65 65 20 76 69 72  he json_tree vir
cec0: 74 75 61 6c 20 74 61 62 6c 65 2e 20 2a 2f 0a 73  tual table. */.s
ced0: 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 6d 6f  tatic sqlite3_mo
cee0: 64 75 6c 65 20 6a 73 6f 6e 54 72 65 65 4d 6f 64  dule jsonTreeMod
cef0: 75 6c 65 20 3d 20 7b 0a 20 20 30 2c 20 20 20 20  ule = {.  0,    
cf00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf10: 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
cf20: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
cf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf40: 20 2f 2a 20 78 43 72 65 61 74 65 20 2a 2f 0a 20   /* xCreate */. 
cf50: 20 6a 73 6f 6e 45 61 63 68 43 6f 6e 6e 65 63 74   jsonEachConnect
cf60: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
cf70: 43 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 6a 73 6f  Connect */.  jso
cf80: 6e 45 61 63 68 42 65 73 74 49 6e 64 65 78 2c 20  nEachBestIndex, 
cf90: 20 20 20 20 20 20 20 20 2f 2a 20 78 42 65 73 74          /* xBest
cfa0: 49 6e 64 65 78 20 2a 2f 0a 20 20 6a 73 6f 6e 45  Index */.  jsonE
cfb0: 61 63 68 44 69 73 63 6f 6e 6e 65 63 74 2c 20 20  achDisconnect,  
cfc0: 20 20 20 20 20 20 2f 2a 20 78 44 69 73 63 6f 6e        /* xDiscon
cfd0: 6e 65 63 74 20 2a 2f 0a 20 20 30 2c 20 20 20 20  nect */.  0,    
cfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cff0: 20 20 20 20 20 2f 2a 20 78 44 65 73 74 72 6f 79       /* xDestroy
d000: 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 4f 70   */.  jsonEachOp
d010: 65 6e 54 72 65 65 2c 20 20 20 20 20 20 20 20 20  enTree,         
d020: 20 2f 2a 20 78 4f 70 65 6e 20 2d 20 6f 70 65 6e   /* xOpen - open
d030: 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 6a   a cursor */.  j
d040: 73 6f 6e 45 61 63 68 43 6c 6f 73 65 2c 20 20 20  sonEachClose,   
d050: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
d060: 6f 73 65 20 2d 20 63 6c 6f 73 65 20 61 20 63 75  ose - close a cu
d070: 72 73 6f 72 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61  rsor */.  jsonEa
d080: 63 68 46 69 6c 74 65 72 2c 20 20 20 20 20 20 20  chFilter,       
d090: 20 20 20 20 20 2f 2a 20 78 46 69 6c 74 65 72 20       /* xFilter 
d0a0: 2d 20 63 6f 6e 66 69 67 75 72 65 20 73 63 61 6e  - configure scan
d0b0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
d0c0: 20 20 6a 73 6f 6e 45 61 63 68 4e 65 78 74 2c 20    jsonEachNext, 
d0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d0e0: 78 4e 65 78 74 20 2d 20 61 64 76 61 6e 63 65 20  xNext - advance 
d0f0: 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 6a 73  a cursor */.  js
d100: 6f 6e 45 61 63 68 45 6f 66 2c 20 20 20 20 20 20  onEachEof,      
d110: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 45 6f 66           /* xEof
d120: 20 2d 20 63 68 65 63 6b 20 66 6f 72 20 65 6e 64   - check for end
d130: 20 6f 66 20 73 63 61 6e 20 2a 2f 0a 20 20 6a 73   of scan */.  js
d140: 6f 6e 45 61 63 68 43 6f 6c 75 6d 6e 2c 20 20 20  onEachColumn,   
d150: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6c           /* xCol
d160: 75 6d 6e 20 2d 20 72 65 61 64 20 64 61 74 61 20  umn - read data 
d170: 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 52 6f 77  */.  jsonEachRow
d180: 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
d190: 2f 2a 20 78 52 6f 77 69 64 20 2d 20 72 65 61 64  /* xRowid - read
d1a0: 20 64 61 74 61 20 2a 2f 0a 20 20 30 2c 20 20 20   data */.  0,   
d1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1c0: 20 20 20 20 20 20 2f 2a 20 78 55 70 64 61 74 65        /* xUpdate
d1d0: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
d1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1f0: 20 2f 2a 20 78 42 65 67 69 6e 20 2a 2f 0a 20 20   /* xBegin */.  
d200: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
d210: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
d220: 79 6e 63 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  ync */.  0,     
d230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d240: 20 20 20 20 2f 2a 20 78 43 6f 6d 6d 69 74 20 2a      /* xCommit *
d250: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
d260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d270: 2a 20 78 52 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  * xRollback */. 
d280: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
d290: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
d2a0: 46 69 6e 64 4d 65 74 68 6f 64 20 2a 2f 0a 20 20  FindMethod */.  
d2b0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
d2c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
d2d0: 65 6e 61 6d 65 20 2a 2f 0a 20 20 30 2c 20 20 20  ename */.  0,   
d2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2f0: 20 20 20 20 20 20 2f 2a 20 78 53 61 76 65 70 6f        /* xSavepo
d300: 69 6e 74 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  int */.  0,     
d310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d320: 20 20 20 20 2f 2a 20 78 52 65 6c 65 61 73 65 20      /* xRelease 
d330: 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20  */.  0          
d340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d350: 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 54 6f 20 2a  /* xRollbackTo *
d360: 2f 0a 7d 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  /.};.#endif /* S
d370: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
d380: 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 2a 2a  ALTABLE */../***
d390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d3a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d3b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d3c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d3d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65  *********.** The
d3e0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
d3f0: 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 70  ne is the only p
d400: 75 62 6c 69 63 61 6c 6c 79 20 76 69 73 69 62 6c  ublically visibl
d410: 65 20 69 64 65 6e 74 69 66 69 65 72 20 69 6e 20  e identifier in 
d420: 74 68 69 73 0a 2a 2a 20 66 69 6c 65 2e 20 20 43  this.** file.  C
d430: 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  all the followin
d440: 67 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64  g routine in ord
d450: 65 72 20 74 6f 20 72 65 67 69 73 74 65 72 20 74  er to register t
d460: 68 65 20 76 61 72 69 6f 75 73 20 53 51 4c 0a 2a  he various SQL.*
d470: 2a 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20  * functions and 
d480: 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
d490: 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79  e implemented by
d4a0: 20 74 68 69 73 20 66 69 6c 65 2e 0a 2a 2a 2a 2a   this file..****
d4b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d4c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d4d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d4e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d4f0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66 64 65  ********/..#ifde
d500: 66 20 5f 57 49 4e 33 32 0a 5f 5f 64 65 63 6c 73  f _WIN32.__decls
d510: 70 65 63 28 64 6c 6c 65 78 70 6f 72 74 29 0a 23  pec(dllexport).#
d520: 65 6e 64 69 66 0a 69 6e 74 20 73 71 6c 69 74 65  endif.int sqlite
d530: 33 5f 6a 73 6f 6e 5f 69 6e 69 74 28 0a 20 20 73  3_json_init(.  s
d540: 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 63  qlite3 *db, .  c
d550: 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 2c 20  har **pzErrMsg, 
d560: 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  .  const sqlite3
d570: 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 20 2a 70  _api_routines *p
d580: 41 70 69 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  Api.){.  int rc 
d590: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
d5a0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20  nsigned int i;. 
d5b0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
d5c0: 72 75 63 74 20 7b 0a 20 20 20 20 20 63 6f 6e 73  ruct {.     cons
d5d0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20  t char *zName;. 
d5e0: 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20      int nArg;.  
d5f0: 20 20 20 69 6e 74 20 66 6c 61 67 3b 0a 20 20 20     int flag;.   
d600: 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28    void (*xFunc)(
d610: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
d620: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
d630: 75 65 2a 2a 29 3b 0a 20 20 7d 20 61 46 75 6e 63  ue**);.  } aFunc
d640: 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 6a 73  [] = {.    { "js
d650: 6f 6e 5f 61 72 72 61 79 22 2c 20 20 20 20 20 20  on_array",      
d660: 20 20 20 20 2d 31 2c 20 30 2c 20 20 20 6a 73 6f      -1, 0,   jso
d670: 6e 41 72 72 61 79 46 75 6e 63 20 20 20 20 20 20  nArrayFunc      
d680: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f     },.    { "jso
d690: 6e 5f 61 72 72 61 79 5f 6c 65 6e 67 74 68 22 2c  n_array_length",
d6a0: 20 20 20 20 31 2c 20 30 2c 20 20 20 6a 73 6f 6e      1, 0,   json
d6b0: 41 72 72 61 79 4c 65 6e 67 74 68 46 75 6e 63 20  ArrayLengthFunc 
d6c0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e    },.    { "json
d6d0: 5f 61 72 72 61 79 5f 6c 65 6e 67 74 68 22 2c 20  _array_length", 
d6e0: 20 20 20 32 2c 20 30 2c 20 20 20 6a 73 6f 6e 41     2, 0,   jsonA
d6f0: 72 72 61 79 4c 65 6e 67 74 68 46 75 6e 63 20 20  rrayLengthFunc  
d700: 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f   },.    { "json_
d710: 65 78 74 72 61 63 74 22 2c 20 20 20 20 20 20 20  extract",       
d720: 20 2d 31 2c 20 30 2c 20 20 20 6a 73 6f 6e 45 78   -1, 0,   jsonEx
d730: 74 72 61 63 74 46 75 6e 63 20 20 20 20 20 20 20  tractFunc       
d740: 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 69  },.    { "json_i
d750: 6e 73 65 72 74 22 2c 20 20 20 20 20 20 20 20 20  nsert",         
d760: 2d 31 2c 20 30 2c 20 20 20 6a 73 6f 6e 53 65 74  -1, 0,   jsonSet
d770: 46 75 6e 63 20 20 20 20 20 20 20 20 20 20 20 7d  Func           }
d780: 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 6f 62  ,.    { "json_ob
d790: 6a 65 63 74 22 2c 20 20 20 20 20 20 20 20 20 2d  ject",         -
d7a0: 31 2c 20 30 2c 20 20 20 6a 73 6f 6e 4f 62 6a 65  1, 0,   jsonObje
d7b0: 63 74 46 75 6e 63 20 20 20 20 20 20 20 20 7d 2c  ctFunc        },
d7c0: 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 72 65 6d  .    { "json_rem
d7d0: 6f 76 65 22 2c 20 20 20 20 20 20 20 20 20 2d 31  ove",         -1
d7e0: 2c 20 30 2c 20 20 20 6a 73 6f 6e 52 65 6d 6f 76  , 0,   jsonRemov
d7f0: 65 46 75 6e 63 20 20 20 20 20 20 20 20 7d 2c 0a  eFunc        },.
d800: 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 72 65 70 6c      { "json_repl
d810: 61 63 65 22 2c 20 20 20 20 20 20 20 20 2d 31 2c  ace",        -1,
d820: 20 30 2c 20 20 20 6a 73 6f 6e 52 65 70 6c 61 63   0,   jsonReplac
d830: 65 46 75 6e 63 20 20 20 20 20 20 20 7d 2c 0a 20  eFunc       },. 
d840: 20 20 20 7b 20 22 6a 73 6f 6e 5f 73 65 74 22 2c     { "json_set",
d850: 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20              -1, 
d860: 31 2c 20 20 20 6a 73 6f 6e 53 65 74 46 75 6e 63  1,   jsonSetFunc
d870: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
d880: 20 20 7b 20 22 6a 73 6f 6e 5f 74 79 70 65 22 2c    { "json_type",
d890: 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30              1, 0
d8a0: 2c 20 20 20 6a 73 6f 6e 54 79 70 65 46 75 6e 63  ,   jsonTypeFunc
d8b0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
d8c0: 20 7b 20 22 6a 73 6f 6e 5f 74 79 70 65 22 2c 20   { "json_type", 
d8d0: 20 20 20 20 20 20 20 20 20 20 20 32 2c 20 30 2c             2, 0,
d8e0: 20 20 20 6a 73 6f 6e 54 79 70 65 46 75 6e 63 20     jsonTypeFunc 
d8f0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
d900: 7b 20 22 6a 73 6f 6e 5f 76 61 6c 69 64 22 2c 20  { "json_valid", 
d910: 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20            1, 0, 
d920: 20 20 6a 73 6f 6e 56 61 6c 69 64 46 75 6e 63 20    jsonValidFunc 
d930: 20 20 20 20 20 20 20 20 7d 2c 0a 0a 23 69 66 20          },..#if 
d940: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
d950: 20 2f 2a 20 44 45 42 55 47 20 61 6e 64 20 54 45   /* DEBUG and TE
d960: 53 54 49 4e 47 20 66 75 6e 63 74 69 6f 6e 73 20  STING functions 
d970: 2a 2f 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 70  */.    { "json_p
d980: 61 72 73 65 22 2c 20 20 20 20 20 20 20 20 20 20  arse",          
d990: 20 31 2c 20 30 2c 20 20 20 6a 73 6f 6e 50 61 72   1, 0,   jsonPar
d9a0: 73 65 46 75 6e 63 20 20 20 20 20 20 20 20 20 7d  seFunc         }
d9b0: 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 74 65  ,.    { "json_te
d9c0: 73 74 31 22 2c 20 20 20 20 20 20 20 20 20 20 20  st1",           
d9d0: 31 2c 20 30 2c 20 20 20 6a 73 6f 6e 54 65 73 74  1, 0,   jsonTest
d9e0: 31 46 75 6e 63 20 20 20 20 20 20 20 20 20 7d 2c  1Func         },
d9f0: 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 6e 6f 64  .    { "json_nod
da00: 65 63 6f 75 6e 74 22 2c 20 20 20 20 20 20 20 31  ecount",       1
da10: 2c 20 30 2c 20 20 20 6a 73 6f 6e 4e 6f 64 65 43  , 0,   jsonNodeC
da20: 6f 75 6e 74 46 75 6e 63 20 20 20 20 20 7d 2c 0a  ountFunc     },.
da30: 23 65 6e 64 69 66 0a 20 20 7d 3b 0a 23 69 66 6e  #endif.  };.#ifn
da40: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
da50: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 73  VIRTUALTABLE.  s
da60: 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
da70: 63 74 20 7b 0a 20 20 20 20 20 63 6f 6e 73 74 20  ct {.     const 
da80: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
da90: 20 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65    sqlite3_module
daa0: 20 2a 70 4d 6f 64 75 6c 65 3b 0a 20 20 7d 20 61   *pModule;.  } a
dab0: 4d 6f 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20  Mod[] = {.    { 
dac0: 22 6a 73 6f 6e 5f 65 61 63 68 22 2c 20 20 20 20  "json_each",    
dad0: 20 20 20 20 20 20 20 20 26 6a 73 6f 6e 45 61 63          &jsonEac
dae0: 68 4d 6f 64 75 6c 65 20 20 20 20 20 20 20 20 20  hModule         
daf0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
db00: 6a 73 6f 6e 5f 74 72 65 65 22 2c 20 20 20 20 20  json_tree",     
db10: 20 20 20 20 20 20 20 26 6a 73 6f 6e 54 72 65 65         &jsonTree
db20: 4d 6f 64 75 6c 65 20 20 20 20 20 20 20 20 20 20  Module          
db30: 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 23 65 6e       },.  };.#en
db40: 64 69 66 0a 20 20 53 51 4c 49 54 45 5f 45 58 54  dif.  SQLITE_EXT
db50: 45 4e 53 49 4f 4e 5f 49 4e 49 54 32 28 70 41 70  ENSION_INIT2(pAp
db60: 69 29 3b 0a 20 20 28 76 6f 69 64 29 70 7a 45 72  i);.  (void)pzEr
db70: 72 4d 73 67 3b 20 20 2f 2a 20 55 6e 75 73 65 64  rMsg;  /* Unused
db80: 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20   parameter */.  
db90: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
dba0: 66 28 61 46 75 6e 63 29 2f 73 69 7a 65 6f 66 28  f(aFunc)/sizeof(
dbb0: 61 46 75 6e 63 5b 30 5d 29 20 26 26 20 72 63 3d  aFunc[0]) && rc=
dbc0: 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29  =SQLITE_OK; i++)
dbd0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
dbe0: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
dbf0: 6f 6e 28 64 62 2c 20 61 46 75 6e 63 5b 69 5d 2e  on(db, aFunc[i].
dc00: 7a 4e 61 6d 65 2c 20 61 46 75 6e 63 5b 69 5d 2e  zName, aFunc[i].
dc10: 6e 41 72 67 2c 0a 20 20 20 20 20 20 20 20 20 20  nArg,.          
dc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc30: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54         SQLITE_UT
dc40: 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
dc50: 52 4d 49 4e 49 53 54 49 43 2c 20 0a 20 20 20 20  RMINISTIC, .    
dc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
dc80: 69 64 2a 29 26 61 46 75 6e 63 5b 69 5d 2e 66 6c  id*)&aFunc[i].fl
dc90: 61 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ag,.            
dca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcb0: 20 20 20 20 20 61 46 75 6e 63 5b 69 5d 2e 78 46       aFunc[i].xF
dcc0: 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  unc, 0, 0);.  }.
dcd0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
dce0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
dcf0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
dd00: 7a 65 6f 66 28 61 4d 6f 64 29 2f 73 69 7a 65 6f  zeof(aMod)/sizeo
dd10: 66 28 61 4d 6f 64 5b 30 5d 29 20 26 26 20 72 63  f(aMod[0]) && rc
dd20: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b  ==SQLITE_OK; i++
dd30: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
dd40: 74 65 33 5f 63 72 65 61 74 65 5f 6d 6f 64 75 6c  te3_create_modul
dd50: 65 28 64 62 2c 20 61 4d 6f 64 5b 69 5d 2e 7a 4e  e(db, aMod[i].zN
dd60: 61 6d 65 2c 20 61 4d 6f 64 5b 69 5d 2e 70 4d 6f  ame, aMod[i].pMo
dd70: 64 75 6c 65 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  dule, 0);.  }.#e
dd80: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63  ndif.  return rc
dd90: 3b 0a 7d 0a                                      ;.}.