SQLite

Hex Artifact Content
Login

Artifact 92bb4e5fe2956564d23f933e2140ce8e086d988b:


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 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
0380: 65 33 65 78 74 2e 68 22 0a 53 51 4c 49 54 45 5f  e3ext.h".SQLITE_
0390: 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54 31 0a  EXTENSION_INIT1.
03a0: 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74  #include <assert
03b0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
03c0: 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ring.h>.#include
03d0: 20 3c 63 74 79 70 65 2e 68 3e 0a 23 69 6e 63 6c   <ctype.h>.#incl
03e0: 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23  ude <stdlib.h>.#
03f0: 69 6e 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e  include <stdarg.
0400: 68 3e 0a 0a 2f 2a 20 55 6e 73 69 67 6e 65 64 20  h>../* Unsigned 
0410: 69 6e 74 65 67 65 72 20 74 79 70 65 73 20 2a 2f  integer types */
0420: 0a 74 79 70 65 64 65 66 20 73 71 6c 69 74 65 33  .typedef sqlite3
0430: 5f 75 69 6e 74 36 34 20 75 36 34 3b 0a 74 79 70  _uint64 u64;.typ
0440: 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20 69 6e  edef unsigned in
0450: 74 20 75 33 32 3b 0a 74 79 70 65 64 65 66 20 75  t u32;.typedef u
0460: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 75 38 3b  nsigned char u8;
0470: 0a 0a 2f 2a 20 4f 62 6a 65 63 74 73 20 2a 2f 0a  ../* Objects */.
0480: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 4a  typedef struct J
0490: 73 6f 6e 53 74 72 69 6e 67 20 4a 73 6f 6e 53 74  sonString JsonSt
04a0: 72 69 6e 67 3b 0a 74 79 70 65 64 65 66 20 73 74  ring;.typedef st
04b0: 72 75 63 74 20 4a 73 6f 6e 4e 6f 64 65 20 4a 73  ruct JsonNode Js
04c0: 6f 6e 4e 6f 64 65 3b 0a 74 79 70 65 64 65 66 20  onNode;.typedef 
04d0: 73 74 72 75 63 74 20 4a 73 6f 6e 50 61 72 73 65  struct JsonParse
04e0: 20 4a 73 6f 6e 50 61 72 73 65 3b 0a 0a 2f 2a 20   JsonParse;../* 
04f0: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
0500: 68 69 73 20 6f 62 6a 65 63 74 20 72 65 70 72 65  his object repre
0510: 73 65 6e 74 73 20 61 20 4a 53 4f 4e 20 73 74 72  sents a JSON str
0520: 69 6e 67 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e  ing.** under con
0530: 73 74 72 75 63 74 69 6f 6e 2e 20 20 52 65 61 6c  struction.  Real
0540: 6c 79 2c 20 74 68 69 73 20 69 73 20 61 20 67 65  ly, this is a ge
0550: 6e 65 72 69 63 20 73 74 72 69 6e 67 20 61 63 63  neric string acc
0560: 75 6d 75 6c 61 74 6f 72 0a 2a 2a 20 74 68 61 74  umulator.** that
0570: 20 63 61 6e 20 62 65 20 61 6e 64 20 69 73 20 75   can be and is u
0580: 73 65 64 20 74 6f 20 63 72 65 61 74 65 20 73 74  sed to create st
0590: 72 69 6e 67 73 20 6f 74 68 65 72 20 74 68 61 6e  rings other than
05a0: 20 4a 53 4f 4e 2e 0a 2a 2f 0a 73 74 72 75 63 74   JSON..*/.struct
05b0: 20 4a 73 6f 6e 53 74 72 69 6e 67 20 7b 0a 20 20   JsonString {.  
05c0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
05d0: 2a 70 43 74 78 3b 20 20 20 2f 2a 20 46 75 6e 63  *pCtx;   /* Func
05e0: 74 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2d 20 70  tion context - p
05f0: 75 74 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ut error message
0600: 73 20 68 65 72 65 20 2a 2f 0a 20 20 63 68 61 72  s here */.  char
0610: 20 2a 7a 42 75 66 3b 20 20 20 20 20 20 20 20 20   *zBuf;         
0620: 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 4a       /* Append J
0630: 53 4f 4e 20 63 6f 6e 74 65 6e 74 20 68 65 72 65  SON content here
0640: 20 2a 2f 0a 20 20 75 36 34 20 6e 41 6c 6c 6f 63   */.  u64 nAlloc
0650: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
0660: 2a 20 42 79 74 65 73 20 6f 66 20 73 74 6f 72 61  * Bytes of stora
0670: 67 65 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  ge available in 
0680: 7a 42 75 66 5b 5d 20 2a 2f 0a 20 20 75 36 34 20  zBuf[] */.  u64 
0690: 6e 55 73 65 64 3b 20 20 20 20 20 20 20 20 20 20  nUsed;          
06a0: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
06b0: 20 7a 42 75 66 5b 5d 20 63 75 72 72 65 6e 74 6c   zBuf[] currentl
06c0: 79 20 75 73 65 64 20 2a 2f 0a 20 20 75 38 20 62  y used */.  u8 b
06d0: 53 74 61 74 69 63 3b 20 20 20 20 20 20 20 20 20  Static;         
06e0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
06f0: 7a 42 75 66 20 69 73 20 73 74 61 74 69 63 20 73  zBuf is static s
0700: 70 61 63 65 20 2a 2f 0a 20 20 75 38 20 62 45 72  pace */.  u8 bEr
0710: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
0720: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e     /* True if an
0730: 20 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20   error has been 
0740: 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20  encountered */. 
0750: 20 63 68 61 72 20 7a 53 70 61 63 65 5b 31 30 30   char zSpace[100
0760: 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69  ];        /* Ini
0770: 74 69 61 6c 20 73 74 61 74 69 63 20 73 70 61 63  tial static spac
0780: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 4a 53 4f 4e  e */.};../* JSON
0790: 20 74 79 70 65 20 76 61 6c 75 65 73 0a 2a 2f 0a   type values.*/.
07a0: 23 64 65 66 69 6e 65 20 4a 53 4f 4e 5f 4e 55 4c  #define JSON_NUL
07b0: 4c 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20  L     0.#define 
07c0: 4a 53 4f 4e 5f 54 52 55 45 20 20 20 20 20 31 0a  JSON_TRUE     1.
07d0: 23 64 65 66 69 6e 65 20 4a 53 4f 4e 5f 46 41 4c  #define JSON_FAL
07e0: 53 45 20 20 20 20 32 0a 23 64 65 66 69 6e 65 20  SE    2.#define 
07f0: 4a 53 4f 4e 5f 49 4e 54 20 20 20 20 20 20 33 0a  JSON_INT      3.
0800: 23 64 65 66 69 6e 65 20 4a 53 4f 4e 5f 52 45 41  #define JSON_REA
0810: 4c 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65 20  L     4.#define 
0820: 4a 53 4f 4e 5f 53 54 52 49 4e 47 20 20 20 35 0a  JSON_STRING   5.
0830: 23 64 65 66 69 6e 65 20 4a 53 4f 4e 5f 41 52 52  #define JSON_ARR
0840: 41 59 20 20 20 20 36 0a 23 64 65 66 69 6e 65 20  AY    6.#define 
0850: 4a 53 4f 4e 5f 4f 42 4a 45 43 54 20 20 20 37 0a  JSON_OBJECT   7.
0860: 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 73 20 6f 66 20  ./*.** Names of 
0870: 74 68 65 20 76 61 72 69 6f 75 73 20 4a 53 4f 4e  the various JSON
0880: 20 74 79 70 65 73 3a 0a 2a 2f 0a 73 74 61 74 69   types:.*/.stati
0890: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63  c const char * c
08a0: 6f 6e 73 74 20 6a 73 6f 6e 54 79 70 65 5b 5d 20  onst jsonType[] 
08b0: 3d 20 7b 0a 20 20 22 6e 75 6c 6c 22 2c 20 22 74  = {.  "null", "t
08c0: 72 75 65 22 2c 20 22 66 61 6c 73 65 22 2c 20 22  rue", "false", "
08d0: 69 6e 74 65 67 65 72 22 2c 20 22 72 65 61 6c 22  integer", "real"
08e0: 2c 20 22 74 65 78 74 22 2c 20 22 61 72 72 61 79  , "text", "array
08f0: 22 2c 20 22 6f 62 6a 65 63 74 22 0a 7d 3b 0a 0a  ", "object".};..
0900: 2f 2a 20 42 69 74 20 76 61 6c 75 65 73 20 66 6f  /* Bit values fo
0910: 72 20 74 68 65 20 4a 73 6f 6e 4e 6f 64 65 2e 6a  r the JsonNode.j
0920: 6e 46 6c 61 67 20 66 69 65 6c 64 0a 2a 2f 0a 23  nFlag field.*/.#
0930: 64 65 66 69 6e 65 20 4a 4e 4f 44 45 5f 52 41 57  define JNODE_RAW
0940: 20 20 20 20 20 30 78 30 31 20 20 20 20 20 20 20       0x01       
0950: 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 69 73 20    /* Content is 
0960: 72 61 77 2c 20 6e 6f 74 20 4a 53 4f 4e 20 65 6e  raw, not JSON en
0970: 63 6f 64 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65  coded */.#define
0980: 20 4a 4e 4f 44 45 5f 45 53 43 41 50 45 20 20 30   JNODE_ESCAPE  0
0990: 78 30 32 20 20 20 20 20 20 20 20 20 2f 2a 20 43  x02         /* C
09a0: 6f 6e 74 65 6e 74 20 69 73 20 74 65 78 74 20 77  ontent is text w
09b0: 69 74 68 20 5c 20 65 73 63 61 70 65 73 20 2a 2f  ith \ escapes */
09c0: 0a 23 64 65 66 69 6e 65 20 4a 4e 4f 44 45 5f 52  .#define JNODE_R
09d0: 45 4d 4f 56 45 20 20 30 78 30 34 20 20 20 20 20  EMOVE  0x04     
09e0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6f 75      /* Do not ou
09f0: 74 70 75 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20  tput */.#define 
0a00: 4a 4e 4f 44 45 5f 52 45 50 4c 41 43 45 20 30 78  JNODE_REPLACE 0x
0a10: 30 38 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  08         /* Re
0a20: 70 6c 61 63 65 20 77 69 74 68 20 4a 73 6f 6e 4e  place with JsonN
0a30: 6f 64 65 2e 69 56 61 6c 20 2a 2f 0a 23 64 65 66  ode.iVal */.#def
0a40: 69 6e 65 20 4a 4e 4f 44 45 5f 41 50 50 45 4e 44  ine JNODE_APPEND
0a50: 20 20 30 78 31 30 20 20 20 20 20 20 20 20 20 2f    0x10         /
0a60: 2a 20 4d 6f 72 65 20 41 52 52 41 59 2f 4f 42 4a  * More ARRAY/OBJ
0a70: 45 43 54 20 65 6e 74 72 69 65 73 20 61 74 20 75  ECT entries at u
0a80: 2e 69 41 70 70 65 6e 64 20 2a 2f 0a 0a 0a 2f 2a  .iAppend */.../*
0a90: 20 41 20 73 69 6e 67 6c 65 20 6e 6f 64 65 20 6f   A single node o
0aa0: 66 20 70 61 72 73 65 64 20 4a 53 4f 4e 0a 2a 2f  f parsed JSON.*/
0ab0: 0a 73 74 72 75 63 74 20 4a 73 6f 6e 4e 6f 64 65  .struct JsonNode
0ac0: 20 7b 0a 20 20 75 38 20 65 54 79 70 65 3b 20 20   {.  u8 eType;  
0ad0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
0ae0: 6e 65 20 6f 66 20 74 68 65 20 4a 53 4f 4e 5f 20  ne of the JSON_ 
0af0: 74 79 70 65 20 76 61 6c 75 65 73 20 2a 2f 0a 20  type values */. 
0b00: 20 75 38 20 6a 6e 46 6c 61 67 73 3b 20 20 20 20   u8 jnFlags;    
0b10: 20 20 20 20 20 20 20 20 2f 2a 20 4a 4e 4f 44 45          /* JNODE
0b20: 20 66 6c 61 67 73 20 2a 2f 0a 20 20 75 38 20 69   flags */.  u8 i
0b30: 56 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Val;            
0b40: 20 20 20 2f 2a 20 52 65 70 6c 61 63 65 6d 65 6e     /* Replacemen
0b50: 74 20 76 61 6c 75 65 20 77 68 65 6e 20 4a 4e 4f  t value when JNO
0b60: 44 45 5f 52 45 50 4c 41 43 45 20 2a 2f 0a 20 20  DE_REPLACE */.  
0b70: 75 33 32 20 6e 3b 20 20 20 20 20 20 20 20 20 20  u32 n;          
0b80: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
0b90: 6f 66 20 63 6f 6e 74 65 6e 74 2c 20 6f 72 20 6e  of content, or n
0ba0: 75 6d 62 65 72 20 6f 66 20 73 75 62 2d 6e 6f 64  umber of sub-nod
0bb0: 65 73 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b 0a  es */.  union {.
0bc0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
0bd0: 7a 4a 43 6f 6e 74 65 6e 74 3b 20 2f 2a 20 43 6f  zJContent; /* Co
0be0: 6e 74 65 6e 74 20 66 6f 72 20 49 4e 54 2c 20 52  ntent for INT, R
0bf0: 45 41 4c 2c 20 61 6e 64 20 53 54 52 49 4e 47 20  EAL, and STRING 
0c00: 2a 2f 0a 20 20 20 20 75 33 32 20 69 41 70 70 65  */.    u32 iAppe
0c10: 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  nd;           /*
0c20: 20 4d 6f 72 65 20 74 65 72 6d 73 20 66 6f 72 20   More terms for 
0c30: 41 52 52 41 59 20 61 6e 64 20 4f 42 4a 45 43 54  ARRAY and OBJECT
0c40: 20 2a 2f 0a 20 20 20 20 75 33 32 20 69 4b 65 79   */.    u32 iKey
0c50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
0c60: 2a 20 4b 65 79 20 66 6f 72 20 41 52 52 41 59 20  * Key for ARRAY 
0c70: 6f 62 6a 65 63 74 73 20 69 6e 20 6a 73 6f 6e 5f  objects in json_
0c80: 74 72 65 65 28 29 20 2a 2f 0a 20 20 7d 20 75 3b  tree() */.  } u;
0c90: 0a 7d 3b 0a 0a 2f 2a 20 41 20 63 6f 6d 70 6c 65  .};../* A comple
0ca0: 74 65 6c 79 20 70 61 72 73 65 64 20 4a 53 4f 4e  tely parsed JSON
0cb0: 20 73 74 72 69 6e 67 0a 2a 2f 0a 73 74 72 75 63   string.*/.struc
0cc0: 74 20 4a 73 6f 6e 50 61 72 73 65 20 7b 0a 20 20  t JsonParse {.  
0cd0: 75 33 32 20 6e 4e 6f 64 65 3b 20 20 20 20 20 20  u32 nNode;      
0ce0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
0cf0: 73 6c 6f 74 73 20 6f 66 20 61 4e 6f 64 65 5b 5d  slots of aNode[]
0d00: 20 75 73 65 64 20 2a 2f 0a 20 20 75 33 32 20 6e   used */.  u32 n
0d10: 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 2f 2a  Alloc;        /*
0d20: 20 4e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73   Number of slots
0d30: 20 6f 66 20 61 4e 6f 64 65 5b 5d 20 61 6c 6c 6f   of aNode[] allo
0d40: 63 61 74 65 64 20 2a 2f 0a 20 20 4a 73 6f 6e 4e  cated */.  JsonN
0d50: 6f 64 65 20 2a 61 4e 6f 64 65 3b 20 20 20 2f 2a  ode *aNode;   /*
0d60: 20 41 72 72 61 79 20 6f 66 20 6e 6f 64 65 73 20   Array of nodes 
0d70: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70  containing the p
0d80: 61 72 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  arse */.  const 
0d90: 63 68 61 72 20 2a 7a 4a 73 6f 6e 3b 20 2f 2a 20  char *zJson; /* 
0da0: 4f 72 69 67 69 6e 61 6c 20 4a 53 4f 4e 20 73 74  Original JSON st
0db0: 72 69 6e 67 20 2a 2f 0a 20 20 75 33 32 20 2a 61  ring */.  u32 *a
0dc0: 55 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Up;          /* 
0dd0: 49 6e 64 65 78 20 6f 66 20 70 61 72 65 6e 74 20  Index of parent 
0de0: 6f 66 20 65 61 63 68 20 6e 6f 64 65 20 2a 2f 0a  of each node */.
0df0: 20 20 75 38 20 6f 6f 6d 3b 20 20 20 20 20 20 20    u8 oom;       
0e00: 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74       /* Set to t
0e10: 72 75 65 20 69 66 20 6f 75 74 20 6f 66 20 6d 65  rue if out of me
0e20: 6d 6f 72 79 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a  mory */.};../***
0e30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0e40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0e50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0e60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0e70: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 55 74 69 6c 69  *******.** Utili
0e80: 74 79 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20  ty routines for 
0e90: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 4a 73 6f  dealing with Jso
0ea0: 6e 53 74 72 69 6e 67 20 6f 62 6a 65 63 74 73 0a  nString objects.
0eb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0ec0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0ed0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0ee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0ef0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 20  **********/../* 
0f00: 53 65 74 20 74 68 65 20 4a 73 6f 6e 53 74 72 69  Set the JsonStri
0f10: 6e 67 20 6f 62 6a 65 63 74 20 74 6f 20 61 6e 20  ng object to an 
0f20: 65 6d 70 74 79 20 73 74 72 69 6e 67 0a 2a 2f 0a  empty string.*/.
0f30: 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e  static void json
0f40: 5a 65 72 6f 28 4a 73 6f 6e 53 74 72 69 6e 67 20  Zero(JsonString 
0f50: 2a 70 29 7b 0a 20 20 70 2d 3e 7a 42 75 66 20 3d  *p){.  p->zBuf =
0f60: 20 70 2d 3e 7a 53 70 61 63 65 3b 0a 20 20 70 2d   p->zSpace;.  p-
0f70: 3e 6e 41 6c 6c 6f 63 20 3d 20 73 69 7a 65 6f 66  >nAlloc = sizeof
0f80: 28 70 2d 3e 7a 53 70 61 63 65 29 3b 0a 20 20 70  (p->zSpace);.  p
0f90: 2d 3e 6e 55 73 65 64 20 3d 20 30 3b 0a 20 20 70  ->nUsed = 0;.  p
0fa0: 2d 3e 62 53 74 61 74 69 63 20 3d 20 31 3b 0a 7d  ->bStatic = 1;.}
0fb0: 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  ../* Initialize 
0fc0: 74 68 65 20 4a 73 6f 6e 53 74 72 69 6e 67 20 6f  the JsonString o
0fd0: 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20  bject.*/.static 
0fe0: 76 6f 69 64 20 6a 73 6f 6e 49 6e 69 74 28 4a 73  void jsonInit(Js
0ff0: 6f 6e 53 74 72 69 6e 67 20 2a 70 2c 20 73 71 6c  onString *p, sql
1000: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
1010: 74 78 29 7b 0a 20 20 70 2d 3e 70 43 74 78 20 3d  tx){.  p->pCtx =
1020: 20 70 43 74 78 3b 0a 20 20 70 2d 3e 62 45 72 72   pCtx;.  p->bErr
1030: 20 3d 20 30 3b 0a 20 20 6a 73 6f 6e 5a 65 72 6f   = 0;.  jsonZero
1040: 28 70 29 3b 0a 7d 0a 0a 0a 2f 2a 20 46 72 65 65  (p);.}.../* Free
1050: 20 61 6c 6c 20 61 6c 6c 6f 63 61 74 65 64 20 6d   all allocated m
1060: 65 6d 6f 72 79 20 61 6e 64 20 72 65 73 65 74 20  emory and reset 
1070: 74 68 65 20 4a 73 6f 6e 53 74 72 69 6e 67 20 6f  the JsonString o
1080: 62 6a 65 63 74 20 62 61 63 6b 20 74 6f 20 69 74  bject back to it
1090: 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 73 74 61  s.** initial sta
10a0: 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  te..*/.static vo
10b0: 69 64 20 6a 73 6f 6e 52 65 73 65 74 28 4a 73 6f  id jsonReset(Jso
10c0: 6e 53 74 72 69 6e 67 20 2a 70 29 7b 0a 20 20 69  nString *p){.  i
10d0: 66 28 20 21 70 2d 3e 62 53 74 61 74 69 63 20 29  f( !p->bStatic )
10e0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
10f0: 3e 7a 42 75 66 29 3b 0a 20 20 6a 73 6f 6e 5a 65  >zBuf);.  jsonZe
1100: 72 6f 28 70 29 3b 0a 7d 0a 0a 0a 2f 2a 20 52 65  ro(p);.}.../* Re
1110: 70 6f 72 74 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d  port an out-of-m
1120: 65 6d 6f 72 79 20 28 4f 4f 4d 29 20 63 6f 6e 64  emory (OOM) cond
1130: 69 74 69 6f 6e 20 0a 2a 2f 0a 73 74 61 74 69 63  ition .*/.static
1140: 20 76 6f 69 64 20 6a 73 6f 6e 4f 6f 6d 28 4a 73   void jsonOom(Js
1150: 6f 6e 53 74 72 69 6e 67 20 2a 70 29 7b 0a 20 20  onString *p){.  
1160: 69 66 28 20 21 70 2d 3e 62 45 72 72 20 29 7b 0a  if( !p->bErr ){.
1170: 20 20 20 20 70 2d 3e 62 45 72 72 20 3d 20 31 3b      p->bErr = 1;
1180: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
1190: 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28  ult_error_nomem(
11a0: 70 2d 3e 70 43 74 78 29 3b 0a 20 20 20 20 6a 73  p->pCtx);.    js
11b0: 6f 6e 52 65 73 65 74 28 70 29 3b 0a 20 20 7d 0a  onReset(p);.  }.
11c0: 7d 0a 0a 2f 2a 20 45 6e 6c 61 72 67 65 20 70 4a  }../* Enlarge pJ
11d0: 73 6f 6e 2d 3e 7a 42 75 66 20 73 6f 20 74 68 61  son->zBuf so tha
11e0: 74 20 69 74 20 63 61 6e 20 68 6f 6c 64 20 61 74  t it can hold at
11f0: 20 6c 65 61 73 74 20 4e 20 6d 6f 72 65 20 62 79   least N more by
1200: 74 65 73 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 7a  tes..** Return z
1210: 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ero on success. 
1220: 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
1230: 20 6f 6e 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   on an OOM error
1240: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a  .*/.static int j
1250: 73 6f 6e 47 72 6f 77 28 4a 73 6f 6e 53 74 72 69  sonGrow(JsonStri
1260: 6e 67 20 2a 70 2c 20 75 33 32 20 4e 29 7b 0a 20  ng *p, u32 N){. 
1270: 20 75 36 34 20 6e 54 6f 74 61 6c 20 3d 20 4e 3c   u64 nTotal = N<
1280: 70 2d 3e 6e 41 6c 6c 6f 63 20 3f 20 70 2d 3e 6e  p->nAlloc ? p->n
1290: 41 6c 6c 6f 63 2a 32 20 3a 20 70 2d 3e 6e 41 6c  Alloc*2 : p->nAl
12a0: 6c 6f 63 2b 4e 2b 31 30 3b 0a 20 20 63 68 61 72  loc+N+10;.  char
12b0: 20 2a 7a 4e 65 77 3b 0a 20 20 69 66 28 20 70 2d   *zNew;.  if( p-
12c0: 3e 62 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20  >bStatic ){.    
12d0: 69 66 28 20 70 2d 3e 62 45 72 72 20 29 20 72 65  if( p->bErr ) re
12e0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7a 4e 65 77  turn 1;.    zNew
12f0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
1300: 63 36 34 28 6e 54 6f 74 61 6c 29 3b 0a 20 20 20  c64(nTotal);.   
1310: 20 69 66 28 20 7a 4e 65 77 3d 3d 30 20 29 7b 0a   if( zNew==0 ){.
1320: 20 20 20 20 20 20 6a 73 6f 6e 4f 6f 6d 28 70 29        jsonOom(p)
1330: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1340: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1350: 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 4e   }.    memcpy(zN
1360: 65 77 2c 20 70 2d 3e 7a 42 75 66 2c 20 70 2d 3e  ew, p->zBuf, p->
1370: 6e 55 73 65 64 29 3b 0a 20 20 20 20 70 2d 3e 7a  nUsed);.    p->z
1380: 42 75 66 20 3d 20 7a 4e 65 77 3b 0a 20 20 20 20  Buf = zNew;.    
1390: 70 2d 3e 62 53 74 61 74 69 63 20 3d 20 30 3b 0a  p->bStatic = 0;.
13a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 65    }else{.    zNe
13b0: 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  w = sqlite3_real
13c0: 6c 6f 63 36 34 28 70 2d 3e 7a 42 75 66 2c 20 6e  loc64(p->zBuf, n
13d0: 54 6f 74 61 6c 29 3b 0a 20 20 20 20 69 66 28 20  Total);.    if( 
13e0: 7a 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zNew==0 ){.     
13f0: 20 6a 73 6f 6e 4f 6f 6d 28 70 29 3b 0a 20 20 20   jsonOom(p);.   
1400: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1410: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
1420: 20 20 70 2d 3e 7a 42 75 66 20 3d 20 7a 4e 65 77    p->zBuf = zNew
1430: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 41 6c 6c 6f  ;.  }.  p->nAllo
1440: 63 20 3d 20 6e 54 6f 74 61 6c 3b 0a 20 20 72 65  c = nTotal;.  re
1450: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1460: 7d 0a 0a 2f 2a 20 41 70 70 65 6e 64 20 4e 20 62  }../* Append N b
1470: 79 74 65 73 20 66 72 6f 6d 20 7a 49 6e 20 6f 6e  ytes from zIn on
1480: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
1490: 65 20 4a 73 6f 6e 53 74 72 69 6e 67 20 73 74 72  e JsonString str
14a0: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
14b0: 6f 69 64 20 6a 73 6f 6e 41 70 70 65 6e 64 52 61  oid jsonAppendRa
14c0: 77 28 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70 2c  w(JsonString *p,
14d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e   const char *zIn
14e0: 2c 20 75 33 32 20 4e 29 7b 0a 20 20 69 66 28 20  , u32 N){.  if( 
14f0: 28 4e 2b 70 2d 3e 6e 55 73 65 64 20 3e 3d 20 70  (N+p->nUsed >= p
1500: 2d 3e 6e 41 6c 6c 6f 63 29 20 26 26 20 6a 73 6f  ->nAlloc) && jso
1510: 6e 47 72 6f 77 28 70 2c 4e 29 21 3d 30 20 29 20  nGrow(p,N)!=0 ) 
1520: 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 63 70 79  return;.  memcpy
1530: 28 70 2d 3e 7a 42 75 66 2b 70 2d 3e 6e 55 73 65  (p->zBuf+p->nUse
1540: 64 2c 20 7a 49 6e 2c 20 4e 29 3b 0a 20 20 70 2d  d, zIn, N);.  p-
1550: 3e 6e 55 73 65 64 20 2b 3d 20 4e 3b 0a 7d 0a 0a  >nUsed += N;.}..
1560: 2f 2a 20 41 70 70 65 6e 64 20 66 6f 72 6d 61 74  /* Append format
1570: 74 65 64 20 74 65 78 74 20 28 6e 6f 74 20 74 6f  ted text (not to
1580: 20 65 78 63 65 65 64 20 4e 20 62 79 74 65 73 29   exceed N bytes)
1590: 20 74 6f 20 74 68 65 20 4a 73 6f 6e 53 74 72 69   to the JsonStri
15a0: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ng..*/.static vo
15b0: 69 64 20 6a 73 6f 6e 50 72 69 6e 74 66 28 69 6e  id jsonPrintf(in
15c0: 74 20 4e 2c 20 4a 73 6f 6e 53 74 72 69 6e 67 20  t N, JsonString 
15d0: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
15e0: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
15f0: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
1600: 66 28 20 28 70 2d 3e 6e 55 73 65 64 20 2b 20 4e  f( (p->nUsed + N
1610: 20 3e 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 29 20 26   >= p->nAlloc) &
1620: 26 20 6a 73 6f 6e 47 72 6f 77 28 70 2c 20 4e 29  & jsonGrow(p, N)
1630: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 76 61 5f   ) return;.  va_
1640: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
1650: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 73  t);.  sqlite3_vs
1660: 6e 70 72 69 6e 74 66 28 4e 2c 20 70 2d 3e 7a 42  nprintf(N, p->zB
1670: 75 66 2b 70 2d 3e 6e 55 73 65 64 2c 20 7a 46 6f  uf+p->nUsed, zFo
1680: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f  rmat, ap);.  va_
1690: 65 6e 64 28 61 70 29 3b 0a 20 20 70 2d 3e 6e 55  end(ap);.  p->nU
16a0: 73 65 64 20 2b 3d 20 28 69 6e 74 29 73 74 72 6c  sed += (int)strl
16b0: 65 6e 28 70 2d 3e 7a 42 75 66 2b 70 2d 3e 6e 55  en(p->zBuf+p->nU
16c0: 73 65 64 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  sed);.}..#ifdef 
16d0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20  SQLITE_DEBUG./* 
16e0: 41 70 70 65 6e 64 20 74 68 65 20 7a 65 72 6f 2d  Append the zero-
16f0: 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
1700: 67 20 7a 49 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  g zIn.*/.static 
1710: 76 6f 69 64 20 6a 73 6f 6e 41 70 70 65 6e 64 28  void jsonAppend(
1720: 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70 2c 20 63  JsonString *p, c
1730: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 29 7b  onst char *zIn){
1740: 0a 20 20 6a 73 6f 6e 41 70 70 65 6e 64 52 61 77  .  jsonAppendRaw
1750: 28 70 2c 20 7a 49 6e 2c 20 28 75 33 32 29 73 74  (p, zIn, (u32)st
1760: 72 6c 65 6e 28 7a 49 6e 29 29 3b 0a 7d 0a 23 65  rlen(zIn));.}.#e
1770: 6e 64 69 66 0a 0a 2f 2a 20 41 70 70 65 6e 64 20  ndif../* Append 
1780: 61 20 73 69 6e 67 6c 65 20 63 68 61 72 61 63 74  a single charact
1790: 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  er.*/.static voi
17a0: 64 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61 72  d jsonAppendChar
17b0: 28 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70 2c 20  (JsonString *p, 
17c0: 63 68 61 72 20 63 29 7b 0a 20 20 69 66 28 20 70  char c){.  if( p
17d0: 2d 3e 6e 55 73 65 64 3e 3d 70 2d 3e 6e 41 6c 6c  ->nUsed>=p->nAll
17e0: 6f 63 20 26 26 20 6a 73 6f 6e 47 72 6f 77 28 70  oc && jsonGrow(p
17f0: 2c 31 29 21 3d 30 20 29 20 72 65 74 75 72 6e 3b  ,1)!=0 ) return;
1800: 0a 20 20 70 2d 3e 7a 42 75 66 5b 70 2d 3e 6e 55  .  p->zBuf[p->nU
1810: 73 65 64 2b 2b 5d 20 3d 20 63 3b 0a 7d 0a 0a 2f  sed++] = c;.}../
1820: 2a 20 41 70 70 65 6e 64 20 61 20 63 6f 6d 6d 61  * Append a comma
1830: 20 73 65 70 61 72 61 74 6f 72 20 74 6f 20 74 68   separator to th
1840: 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2c  e output buffer,
1850: 20 69 66 20 74 68 65 20 70 72 65 76 69 6f 75 73   if the previous
1860: 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 20 69 73  .** character is
1870: 20 6e 6f 74 20 27 5b 27 20 6f 72 20 27 7b 27 2e   not '[' or '{'.
1880: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1890: 6a 73 6f 6e 41 70 70 65 6e 64 53 65 70 61 72 61  jsonAppendSepara
18a0: 74 6f 72 28 4a 73 6f 6e 53 74 72 69 6e 67 20 2a  tor(JsonString *
18b0: 70 29 7b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20  p){.  char c;.  
18c0: 69 66 28 20 70 2d 3e 6e 55 73 65 64 3d 3d 30 20  if( p->nUsed==0 
18d0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 63 20 3d 20  ) return;.  c = 
18e0: 70 2d 3e 7a 42 75 66 5b 70 2d 3e 6e 55 73 65 64  p->zBuf[p->nUsed
18f0: 2d 31 5d 3b 0a 20 20 69 66 28 20 63 21 3d 27 5b  -1];.  if( c!='[
1900: 27 20 26 26 20 63 21 3d 27 7b 27 20 29 20 6a 73  ' && c!='{' ) js
1910: 6f 6e 41 70 70 65 6e 64 43 68 61 72 28 70 2c 20  onAppendChar(p, 
1920: 27 2c 27 29 3b 0a 7d 0a 0a 2f 2a 20 41 70 70 65  ',');.}../* Appe
1930: 6e 64 20 74 68 65 20 4e 2d 62 79 74 65 20 73 74  nd the N-byte st
1940: 72 69 6e 67 20 69 6e 20 7a 49 6e 20 74 6f 20 74  ring in zIn to t
1950: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 4a 73  he end of the Js
1960: 6f 6e 53 74 72 69 6e 67 20 73 74 72 69 6e 67 0a  onString string.
1970: 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ** under constru
1980: 63 74 69 6f 6e 2e 20 20 45 6e 63 6c 6f 73 65 20  ction.  Enclose 
1990: 74 68 65 20 73 74 72 69 6e 67 20 69 6e 20 22 2e  the string in ".
19a0: 2e 2e 22 20 61 6e 64 20 65 73 63 61 70 65 0a 2a  .." and escape.*
19b0: 2a 20 61 6e 79 20 64 6f 75 62 6c 65 2d 71 75 6f  * any double-quo
19c0: 74 65 73 20 6f 72 20 62 61 63 6b 73 6c 61 73 68  tes or backslash
19d0: 20 63 68 61 72 61 63 74 65 72 73 20 63 6f 6e 74   characters cont
19e0: 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65  ained within the
19f0: 0a 2a 2a 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73  .** string..*/.s
1a00: 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 41  tatic void jsonA
1a10: 70 70 65 6e 64 53 74 72 69 6e 67 28 4a 73 6f 6e  ppendString(Json
1a20: 53 74 72 69 6e 67 20 2a 70 2c 20 63 6f 6e 73 74  String *p, const
1a30: 20 63 68 61 72 20 2a 7a 49 6e 2c 20 75 33 32 20   char *zIn, u32 
1a40: 4e 29 7b 0a 20 20 75 33 32 20 69 3b 0a 20 20 69  N){.  u32 i;.  i
1a50: 66 28 20 28 4e 2b 70 2d 3e 6e 55 73 65 64 2b 32  f( (N+p->nUsed+2
1a60: 20 3e 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 29 20 26   >= p->nAlloc) &
1a70: 26 20 6a 73 6f 6e 47 72 6f 77 28 70 2c 4e 2b 32  & jsonGrow(p,N+2
1a80: 29 21 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )!=0 ) return;. 
1a90: 20 70 2d 3e 7a 42 75 66 5b 70 2d 3e 6e 55 73 65   p->zBuf[p->nUse
1aa0: 64 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 66 6f  d++] = '"';.  fo
1ab0: 72 28 69 3d 30 3b 20 69 3c 4e 3b 20 69 2b 2b 29  r(i=0; i<N; i++)
1ac0: 7b 0a 20 20 20 20 63 68 61 72 20 63 20 3d 20 7a  {.    char c = z
1ad0: 49 6e 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 63  In[i];.    if( c
1ae0: 3d 3d 27 22 27 20 7c 7c 20 63 3d 3d 27 5c 5c 27  =='"' || c=='\\'
1af0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70   ){.      if( (p
1b00: 2d 3e 6e 55 73 65 64 2b 4e 2b 31 2d 69 20 3e 20  ->nUsed+N+1-i > 
1b10: 70 2d 3e 6e 41 6c 6c 6f 63 29 20 26 26 20 6a 73  p->nAlloc) && js
1b20: 6f 6e 47 72 6f 77 28 70 2c 4e 2b 31 2d 69 29 21  onGrow(p,N+1-i)!
1b30: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
1b40: 20 20 20 70 2d 3e 7a 42 75 66 5b 70 2d 3e 6e 55     p->zBuf[p->nU
1b50: 73 65 64 2b 2b 5d 20 3d 20 27 5c 5c 27 3b 0a 20  sed++] = '\\';. 
1b60: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 7a 42 75 66     }.    p->zBuf
1b70: 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d 20 63  [p->nUsed++] = c
1b80: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 7a 42 75 66 5b  ;.  }.  p->zBuf[
1b90: 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d 20 27 22  p->nUsed++] = '"
1ba0: 27 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  ';.}../*.** Appe
1bb0: 6e 64 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 61  nd a function pa
1bc0: 72 61 6d 65 74 65 72 20 76 61 6c 75 65 20 74 6f  rameter value to
1bd0: 20 74 68 65 20 4a 53 4f 4e 20 73 74 72 69 6e 67   the JSON string
1be0: 20 75 6e 64 65 72 20 0a 2a 2a 20 63 6f 6e 73 74   under .** const
1bf0: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruction..*/.stat
1c00: 69 63 20 76 6f 69 64 20 6a 73 6f 6e 41 70 70 65  ic void jsonAppe
1c10: 6e 64 56 61 6c 75 65 28 0a 20 20 4a 73 6f 6e 53  ndValue(.  JsonS
1c20: 74 72 69 6e 67 20 2a 70 2c 20 20 20 20 20 20 20  tring *p,       
1c30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 70 70            /* App
1c40: 65 6e 64 20 74 6f 20 74 68 69 73 20 4a 53 4f 4e  end to this JSON
1c50: 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 73 71 6c   string */.  sql
1c60: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
1c70: 75 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56  ue          /* V
1c80: 61 6c 75 65 20 74 6f 20 61 70 70 65 6e 64 20 2a  alue to append *
1c90: 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73  /.){.  switch( s
1ca0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
1cb0: 65 28 70 56 61 6c 75 65 29 20 29 7b 0a 20 20 20  e(pValue) ){.   
1cc0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c   case SQLITE_NUL
1cd0: 4c 3a 20 7b 0a 20 20 20 20 20 20 6a 73 6f 6e 41  L: {.      jsonA
1ce0: 70 70 65 6e 64 52 61 77 28 70 2c 20 22 6e 75 6c  ppendRaw(p, "nul
1cf0: 6c 22 2c 20 34 29 3b 0a 20 20 20 20 20 20 62 72  l", 4);.      br
1d00: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1d10: 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  ase SQLITE_INTEG
1d20: 45 52 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ER:.    case SQL
1d30: 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20  ITE_FLOAT: {.   
1d40: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1d50: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
1d60: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
1d70: 78 74 28 70 56 61 6c 75 65 29 3b 0a 20 20 20 20  xt(pValue);.    
1d80: 20 20 75 33 32 20 6e 20 3d 20 28 75 33 32 29 73    u32 n = (u32)s
1d90: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
1da0: 65 73 28 70 56 61 6c 75 65 29 3b 0a 20 20 20 20  es(pValue);.    
1db0: 20 20 6a 73 6f 6e 41 70 70 65 6e 64 52 61 77 28    jsonAppendRaw(
1dc0: 70 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20  p, z, n);.      
1dd0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1de0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58   case SQLITE_TEX
1df0: 54 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  T: {.      const
1e00: 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e 73   char *z = (cons
1e10: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
1e20: 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 75  value_text(pValu
1e30: 65 29 3b 0a 20 20 20 20 20 20 75 33 32 20 6e 20  e);.      u32 n 
1e40: 3d 20 28 75 33 32 29 73 71 6c 69 74 65 33 5f 76  = (u32)sqlite3_v
1e50: 61 6c 75 65 5f 62 79 74 65 73 28 70 56 61 6c 75  alue_bytes(pValu
1e60: 65 29 3b 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70  e);.      jsonAp
1e70: 70 65 6e 64 53 74 72 69 6e 67 28 70 2c 20 7a 2c  pendString(p, z,
1e80: 20 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   n);.      break
1e90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
1ea0: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ult: {.      if(
1eb0: 20 70 2d 3e 62 45 72 72 3d 3d 30 20 29 7b 0a 20   p->bErr==0 ){. 
1ec0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
1ed0: 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 2d 3e 70  esult_error(p->p
1ee0: 43 74 78 2c 20 22 4a 53 4f 4e 20 63 61 6e 6e 6f  Ctx, "JSON canno
1ef0: 74 20 68 6f 6c 64 20 42 4c 4f 42 20 76 61 6c 75  t hold BLOB valu
1f00: 65 73 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  es", -1);.      
1f10: 20 20 70 2d 3e 62 45 72 72 20 3d 20 31 3b 0a 20    p->bErr = 1;. 
1f20: 20 20 20 20 20 20 20 6a 73 6f 6e 52 65 73 65 74         jsonReset
1f30: 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (p);.      }.   
1f40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1f50: 20 20 7d 0a 7d 0a 0a 0a 2f 2a 20 4d 61 6b 65 20    }.}.../* Make 
1f60: 74 68 65 20 4a 53 4f 4e 20 69 6e 20 70 20 74 68  the JSON in p th
1f70: 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
1f80: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  SQL function..*/
1f90: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f  .static void jso
1fa0: 6e 52 65 73 75 6c 74 28 4a 73 6f 6e 53 74 72 69  nResult(JsonStri
1fb0: 6e 67 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  ng *p){.  if( p-
1fc0: 3e 62 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20  >bErr==0 ){.    
1fd0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
1fe0: 65 78 74 36 34 28 70 2d 3e 70 43 74 78 2c 20 70  ext64(p->pCtx, p
1ff0: 2d 3e 7a 42 75 66 2c 20 70 2d 3e 6e 55 73 65 64  ->zBuf, p->nUsed
2000: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
2010: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
2020: 62 53 74 61 74 69 63 20 3f 20 53 51 4c 49 54 45  bStatic ? SQLITE
2030: 5f 54 52 41 4e 53 49 45 4e 54 20 3a 20 73 71 6c  _TRANSIENT : sql
2040: 69 74 65 33 5f 66 72 65 65 2c 0a 20 20 20 20 20  ite3_free,.     
2050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2060: 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38       SQLITE_UTF8
2070: 29 3b 0a 20 20 20 20 6a 73 6f 6e 5a 65 72 6f 28  );.    jsonZero(
2080: 70 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  p);.  }.  assert
2090: 28 20 70 2d 3e 62 53 74 61 74 69 63 20 29 3b 0a  ( p->bStatic );.
20a0: 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }../************
20b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
20f0: 2a 20 55 74 69 6c 69 74 79 20 72 6f 75 74 69 6e  * Utility routin
2100: 65 73 20 66 6f 72 20 64 65 61 6c 69 6e 67 20 77  es for dealing w
2110: 69 74 68 20 4a 73 6f 6e 4e 6f 64 65 20 61 6e 64  ith JsonNode and
2120: 20 4a 73 6f 6e 50 61 72 73 65 20 6f 62 6a 65 63   JsonParse objec
2130: 74 73 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ts.*************
2140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2170: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
2180: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
2190: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73 65   number of conse
21a0: 63 75 74 69 76 65 20 4a 73 6f 6e 4e 6f 64 65 20  cutive JsonNode 
21b0: 73 6c 6f 74 73 20 6e 65 65 64 20 74 6f 20 72 65  slots need to re
21c0: 70 72 65 73 65 6e 74 0a 2a 2a 20 74 68 65 20 70  present.** the p
21d0: 61 72 73 65 64 20 4a 53 4f 4e 20 61 74 20 70 4e  arsed JSON at pN
21e0: 6f 64 65 2e 20 20 54 68 65 20 6d 69 6e 69 6d 75  ode.  The minimu
21f0: 6d 20 61 6e 73 77 65 72 20 69 73 20 31 2e 20 20  m answer is 1.  
2200: 46 6f 72 20 41 52 52 41 59 20 61 6e 64 0a 2a 2a  For ARRAY and.**
2210: 20 4f 42 4a 45 43 54 20 74 79 70 65 73 2c 20 74   OBJECT types, t
2220: 68 65 20 6e 75 6d 62 65 72 20 6d 69 67 68 74 20  he number might 
2230: 62 65 20 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a  be larger..**.**
2240: 20 41 70 70 65 6e 64 65 64 20 65 6c 65 6d 65 6e   Appended elemen
2250: 74 73 20 61 72 65 20 6e 6f 74 20 63 6f 75 6e 74  ts are not count
2260: 65 64 2e 20 20 54 68 65 20 76 61 6c 75 65 20 72  ed.  The value r
2270: 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 6e  eturned is the n
2280: 75 6d 62 65 72 0a 2a 2a 20 62 79 20 77 68 69 63  umber.** by whic
2290: 68 20 74 68 65 20 4a 73 6f 6e 4e 6f 64 65 20 63  h the JsonNode c
22a0: 6f 75 6e 74 65 72 20 73 68 6f 75 6c 64 20 69 6e  ounter should in
22b0: 63 72 65 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72  crement in order
22c0: 20 74 6f 20 67 6f 20 74 6f 20 74 68 65 0a 2a 2a   to go to the.**
22d0: 20 6e 65 78 74 20 70 65 65 72 20 76 61 6c 75 65   next peer value
22e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
22f0: 6a 73 6f 6e 4e 6f 64 65 53 69 7a 65 28 4a 73 6f  jsonNodeSize(Jso
2300: 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 29 7b 0a 20  nNode *pNode){. 
2310: 20 72 65 74 75 72 6e 20 70 4e 6f 64 65 2d 3e 65   return pNode->e
2320: 54 79 70 65 3e 3d 4a 53 4f 4e 5f 41 52 52 41 59  Type>=JSON_ARRAY
2330: 20 3f 20 70 4e 6f 64 65 2d 3e 6e 2b 31 20 3a 20   ? pNode->n+1 : 
2340: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c  1;.}../*.** Recl
2350: 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  aim all memory a
2360: 6c 6c 6f 63 61 74 65 64 20 62 79 20 61 20 4a 73  llocated by a Js
2370: 6f 6e 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 20  onParse object. 
2380: 20 42 75 74 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64   But do not.** d
2390: 65 6c 65 74 65 20 74 68 65 20 4a 73 6f 6e 50 61  elete the JsonPa
23a0: 72 73 65 20 6f 62 6a 65 63 74 20 69 74 73 65 6c  rse object itsel
23b0: 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  f..*/.static voi
23c0: 64 20 6a 73 6f 6e 50 61 72 73 65 52 65 73 65 74  d jsonParseReset
23d0: 28 4a 73 6f 6e 50 61 72 73 65 20 2a 70 50 61 72  (JsonParse *pPar
23e0: 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66  se){.  sqlite3_f
23f0: 72 65 65 28 70 50 61 72 73 65 2d 3e 61 4e 6f 64  ree(pParse->aNod
2400: 65 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 61 4e  e);.  pParse->aN
2410: 6f 64 65 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  ode = 0;.  pPars
2420: 65 2d 3e 6e 4e 6f 64 65 20 3d 20 30 3b 0a 20 20  e->nNode = 0;.  
2430: 70 50 61 72 73 65 2d 3e 6e 41 6c 6c 6f 63 20 3d  pParse->nAlloc =
2440: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   0;.  sqlite3_fr
2450: 65 65 28 70 50 61 72 73 65 2d 3e 61 55 70 29 3b  ee(pParse->aUp);
2460: 0a 20 20 70 50 61 72 73 65 2d 3e 61 55 70 20 3d  .  pParse->aUp =
2470: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e   0;.}../*.** Con
2480: 76 65 72 74 20 74 68 65 20 4a 73 6f 6e 4e 6f 64  vert the JsonNod
2490: 65 20 70 4e 6f 64 65 20 69 6e 74 6f 20 61 20 70  e pNode into a p
24a0: 75 72 65 20 4a 53 4f 4e 20 73 74 72 69 6e 67 20  ure JSON string 
24b0: 61 6e 64 0a 2a 2a 20 61 70 70 65 6e 64 20 74 6f  and.** append to
24c0: 20 70 4f 75 74 2e 20 20 53 75 62 73 75 62 73 74   pOut.  Subsubst
24d0: 72 75 63 74 75 72 65 20 69 73 20 61 6c 73 6f 20  ructure is also 
24e0: 69 6e 63 6c 75 64 65 64 2e 20 20 52 65 74 75 72  included.  Retur
24f0: 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20  n.** the number 
2500: 6f 66 20 4a 73 6f 6e 4e 6f 64 65 20 6f 62 6a 65  of JsonNode obje
2510: 63 74 73 20 74 68 61 74 20 61 72 65 20 65 6e 63  cts that are enc
2520: 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oded..*/.static 
2530: 76 6f 69 64 20 6a 73 6f 6e 52 65 6e 64 65 72 4e  void jsonRenderN
2540: 6f 64 65 28 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20  ode(.  JsonNode 
2550: 2a 70 4e 6f 64 65 2c 20 20 20 20 20 20 20 20 20  *pNode,         
2560: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 6f 64        /* The nod
2570: 65 20 74 6f 20 72 65 6e 64 65 72 20 2a 2f 0a 20  e to render */. 
2580: 20 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70 4f 75   JsonString *pOu
2590: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
25a0: 2f 2a 20 57 72 69 74 65 20 4a 53 4f 4e 20 68 65  /* Write JSON he
25b0: 72 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  re */.  sqlite3_
25c0: 76 61 6c 75 65 20 2a 2a 61 52 65 70 6c 61 63 65  value **aReplace
25d0: 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6c 61 63         /* Replac
25e0: 65 6d 65 6e 74 20 76 61 6c 75 65 73 20 2a 2f 0a  ement values */.
25f0: 29 7b 0a 20 20 73 77 69 74 63 68 28 20 70 4e 6f  ){.  switch( pNo
2600: 64 65 2d 3e 65 54 79 70 65 20 29 7b 0a 20 20 20  de->eType ){.   
2610: 20 63 61 73 65 20 4a 53 4f 4e 5f 4e 55 4c 4c 3a   case JSON_NULL:
2620: 20 7b 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70 70   {.      jsonApp
2630: 65 6e 64 52 61 77 28 70 4f 75 74 2c 20 22 6e 75  endRaw(pOut, "nu
2640: 6c 6c 22 2c 20 34 29 3b 0a 20 20 20 20 20 20 62  ll", 4);.      b
2650: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
2660: 63 61 73 65 20 4a 53 4f 4e 5f 54 52 55 45 3a 20  case JSON_TRUE: 
2670: 7b 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65  {.      jsonAppe
2680: 6e 64 52 61 77 28 70 4f 75 74 2c 20 22 74 72 75  ndRaw(pOut, "tru
2690: 65 22 2c 20 34 29 3b 0a 20 20 20 20 20 20 62 72  e", 4);.      br
26a0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
26b0: 61 73 65 20 4a 53 4f 4e 5f 46 41 4c 53 45 3a 20  ase JSON_FALSE: 
26c0: 7b 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65  {.      jsonAppe
26d0: 6e 64 52 61 77 28 70 4f 75 74 2c 20 22 66 61 6c  ndRaw(pOut, "fal
26e0: 73 65 22 2c 20 35 29 3b 0a 20 20 20 20 20 20 62  se", 5);.      b
26f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
2700: 63 61 73 65 20 4a 53 4f 4e 5f 53 54 52 49 4e 47  case JSON_STRING
2710: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  : {.      if( pN
2720: 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73 20 26 20 4a  ode->jnFlags & J
2730: 4e 4f 44 45 5f 52 41 57 20 29 7b 0a 20 20 20 20  NODE_RAW ){.    
2740: 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 53 74      jsonAppendSt
2750: 72 69 6e 67 28 70 4f 75 74 2c 20 70 4e 6f 64 65  ring(pOut, pNode
2760: 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 2c 20 70  ->u.zJContent, p
2770: 4e 6f 64 65 2d 3e 6e 29 3b 0a 20 20 20 20 20 20  Node->n);.      
2780: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
2790: 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74  .      /* Fall t
27a0: 68 72 6f 75 67 68 20 69 6e 74 6f 20 74 68 65 20  hrough into the 
27b0: 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20 20 20  next case */.   
27c0: 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 53 4f 4e   }.    case JSON
27d0: 5f 52 45 41 4c 3a 0a 20 20 20 20 63 61 73 65 20  _REAL:.    case 
27e0: 4a 53 4f 4e 5f 49 4e 54 3a 20 7b 0a 20 20 20 20  JSON_INT: {.    
27f0: 20 20 6a 73 6f 6e 41 70 70 65 6e 64 52 61 77 28    jsonAppendRaw(
2800: 70 4f 75 74 2c 20 70 4e 6f 64 65 2d 3e 75 2e 7a  pOut, pNode->u.z
2810: 4a 43 6f 6e 74 65 6e 74 2c 20 70 4e 6f 64 65 2d  JContent, pNode-
2820: 3e 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  >n);.      break
2830: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
2840: 20 4a 53 4f 4e 5f 41 52 52 41 59 3a 20 7b 0a 20   JSON_ARRAY: {. 
2850: 20 20 20 20 20 75 33 32 20 6a 20 3d 20 31 3b 0a       u32 j = 1;.
2860: 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64        jsonAppend
2870: 43 68 61 72 28 70 4f 75 74 2c 20 27 5b 27 29 3b  Char(pOut, '[');
2880: 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a  .      for(;;){.
2890: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a          while( j
28a0: 3c 3d 70 4e 6f 64 65 2d 3e 6e 20 29 7b 0a 20 20  <=pNode->n ){.  
28b0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 6f 64          if( pNod
28c0: 65 5b 6a 5d 2e 6a 6e 46 6c 61 67 73 20 26 20 28  e[j].jnFlags & (
28d0: 4a 4e 4f 44 45 5f 52 45 4d 4f 56 45 7c 4a 4e 4f  JNODE_REMOVE|JNO
28e0: 44 45 5f 52 45 50 4c 41 43 45 29 20 29 7b 0a 20  DE_REPLACE) ){. 
28f0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
2900: 4e 6f 64 65 5b 6a 5d 2e 6a 6e 46 6c 61 67 73 20  Node[j].jnFlags 
2910: 26 20 4a 4e 4f 44 45 5f 52 45 50 4c 41 43 45 20  & JNODE_REPLACE 
2920: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2930: 20 6a 73 6f 6e 41 70 70 65 6e 64 53 65 70 61 72   jsonAppendSepar
2940: 61 74 6f 72 28 70 4f 75 74 29 3b 0a 20 20 20 20  ator(pOut);.    
2950: 20 20 20 20 20 20 20 20 20 20 6a 73 6f 6e 41 70            jsonAp
2960: 70 65 6e 64 56 61 6c 75 65 28 70 4f 75 74 2c 20  pendValue(pOut, 
2970: 61 52 65 70 6c 61 63 65 5b 70 4e 6f 64 65 5b 6a  aReplace[pNode[j
2980: 5d 2e 69 56 61 6c 5d 29 3b 0a 20 20 20 20 20 20  ].iVal]);.      
2990: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
29b0: 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 53       jsonAppendS
29c0: 65 70 61 72 61 74 6f 72 28 70 4f 75 74 29 3b 0a  eparator(pOut);.
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 6a 73 6f 6e              json
29e0: 52 65 6e 64 65 72 4e 6f 64 65 28 26 70 4e 6f 64  RenderNode(&pNod
29f0: 65 5b 6a 5d 2c 20 70 4f 75 74 2c 20 61 52 65 70  e[j], pOut, aRep
2a00: 6c 61 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20  lace);.         
2a10: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6a 20 2b   }.          j +
2a20: 3d 20 6a 73 6f 6e 4e 6f 64 65 53 69 7a 65 28 26  = jsonNodeSize(&
2a30: 70 4e 6f 64 65 5b 6a 5d 29 3b 0a 20 20 20 20 20  pNode[j]);.     
2a40: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
2a50: 20 28 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73   (pNode->jnFlags
2a60: 20 26 20 4a 4e 4f 44 45 5f 41 50 50 45 4e 44 29   & JNODE_APPEND)
2a70: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
2a80: 20 20 20 20 20 70 4e 6f 64 65 20 3d 20 26 70 4e       pNode = &pN
2a90: 6f 64 65 5b 70 4e 6f 64 65 2d 3e 75 2e 69 41 70  ode[pNode->u.iAp
2aa0: 70 65 6e 64 5d 3b 0a 20 20 20 20 20 20 20 20 6a  pend];.        j
2ab0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
2ac0: 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68      jsonAppendCh
2ad0: 61 72 28 70 4f 75 74 2c 20 27 5d 27 29 3b 0a 20  ar(pOut, ']');. 
2ae0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2af0: 7d 0a 20 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f  }.    case JSON_
2b00: 4f 42 4a 45 43 54 3a 20 7b 0a 20 20 20 20 20 20  OBJECT: {.      
2b10: 75 33 32 20 6a 20 3d 20 31 3b 0a 20 20 20 20 20  u32 j = 1;.     
2b20: 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61 72 28   jsonAppendChar(
2b30: 70 4f 75 74 2c 20 27 7b 27 29 3b 0a 20 20 20 20  pOut, '{');.    
2b40: 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20    for(;;){.     
2b50: 20 20 20 77 68 69 6c 65 28 20 6a 3c 3d 70 4e 6f     while( j<=pNo
2b60: 64 65 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20 20  de->n ){.       
2b70: 20 20 20 69 66 28 20 28 70 4e 6f 64 65 5b 6a 2b     if( (pNode[j+
2b80: 31 5d 2e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f  1].jnFlags & JNO
2b90: 44 45 5f 52 45 4d 4f 56 45 29 3d 3d 30 20 29 7b  DE_REMOVE)==0 ){
2ba0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 73 6f  .            jso
2bb0: 6e 41 70 70 65 6e 64 53 65 70 61 72 61 74 6f 72  nAppendSeparator
2bc0: 28 70 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  (pOut);.        
2bd0: 20 20 20 20 6a 73 6f 6e 52 65 6e 64 65 72 4e 6f      jsonRenderNo
2be0: 64 65 28 26 70 4e 6f 64 65 5b 6a 5d 2c 20 70 4f  de(&pNode[j], pO
2bf0: 75 74 2c 20 61 52 65 70 6c 61 63 65 29 3b 0a 20  ut, aReplace);. 
2c00: 20 20 20 20 20 20 20 20 20 20 20 6a 73 6f 6e 41             jsonA
2c10: 70 70 65 6e 64 43 68 61 72 28 70 4f 75 74 2c 20  ppendChar(pOut, 
2c20: 27 3a 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ':');.          
2c30: 20 20 69 66 28 20 70 4e 6f 64 65 5b 6a 2b 31 5d    if( pNode[j+1]
2c40: 2e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45  .jnFlags & JNODE
2c50: 5f 52 45 50 4c 41 43 45 20 29 7b 0a 20 20 20 20  _REPLACE ){.    
2c60: 20 20 20 20 20 20 20 20 20 20 6a 73 6f 6e 41 70            jsonAp
2c70: 70 65 6e 64 56 61 6c 75 65 28 70 4f 75 74 2c 20  pendValue(pOut, 
2c80: 61 52 65 70 6c 61 63 65 5b 70 4e 6f 64 65 5b 6a  aReplace[pNode[j
2c90: 2b 31 5d 2e 69 56 61 6c 5d 29 3b 0a 20 20 20 20  +1].iVal]);.    
2ca0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 73 6f               jso
2cc0: 6e 52 65 6e 64 65 72 4e 6f 64 65 28 26 70 4e 6f  nRenderNode(&pNo
2cd0: 64 65 5b 6a 2b 31 5d 2c 20 70 4f 75 74 2c 20 61  de[j+1], pOut, a
2ce0: 52 65 70 6c 61 63 65 29 3b 0a 20 20 20 20 20 20  Replace);.      
2cf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2d00: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6a 20    }.          j 
2d10: 2b 3d 20 31 20 2b 20 6a 73 6f 6e 4e 6f 64 65 53  += 1 + jsonNodeS
2d20: 69 7a 65 28 26 70 4e 6f 64 65 5b 6a 2b 31 5d 29  ize(&pNode[j+1])
2d30: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2d40: 20 20 20 20 69 66 28 20 28 70 4e 6f 64 65 2d 3e      if( (pNode->
2d50: 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f  jnFlags & JNODE_
2d60: 41 50 50 45 4e 44 29 3d 3d 30 20 29 20 62 72 65  APPEND)==0 ) bre
2d70: 61 6b 3b 0a 20 20 20 20 20 20 20 20 70 4e 6f 64  ak;.        pNod
2d80: 65 20 3d 20 26 70 4e 6f 64 65 5b 70 4e 6f 64 65  e = &pNode[pNode
2d90: 2d 3e 75 2e 69 41 70 70 65 6e 64 5d 3b 0a 20 20  ->u.iAppend];.  
2da0: 20 20 20 20 20 20 6a 20 3d 20 31 3b 0a 20 20 20        j = 1;.   
2db0: 20 20 20 7d 0a 20 20 20 20 20 20 6a 73 6f 6e 41     }.      jsonA
2dc0: 70 70 65 6e 64 43 68 61 72 28 70 4f 75 74 2c 20  ppendChar(pOut, 
2dd0: 27 7d 27 29 3b 0a 20 20 20 20 20 20 62 72 65 61  '}');.      brea
2de0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  k;.    }.  }.}..
2df0: 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 74 68 65 20 4a  /*.** Make the J
2e00: 73 6f 6e 4e 6f 64 65 20 74 68 65 20 72 65 74 75  sonNode the retu
2e10: 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  rn value of the 
2e20: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
2e30: 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 52 65 74  tic void jsonRet
2e40: 75 72 6e 28 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20  urn(.  JsonNode 
2e50: 2a 70 4e 6f 64 65 2c 20 20 20 20 20 20 20 20 20  *pNode,         
2e60: 20 20 20 2f 2a 20 4e 6f 64 65 20 74 6f 20 72 65     /* Node to re
2e70: 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  turn */.  sqlite
2e80: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
2e90: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2ea0: 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 66  value for this f
2eb0: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  unction */.  sql
2ec0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 52 65  ite3_value **aRe
2ed0: 70 6c 61 63 65 20 20 20 20 2f 2a 20 41 72 72 61  place    /* Arra
2ee0: 79 20 6f 66 20 72 65 70 6c 61 63 65 6d 65 6e 74  y of replacement
2ef0: 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20   values */.){.  
2f00: 73 77 69 74 63 68 28 20 70 4e 6f 64 65 2d 3e 65  switch( pNode->e
2f10: 54 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  Type ){.    case
2f20: 20 4a 53 4f 4e 5f 4e 55 4c 4c 3a 20 7b 0a 20 20   JSON_NULL: {.  
2f30: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
2f40: 6c 74 5f 6e 75 6c 6c 28 70 43 74 78 29 3b 0a 20  lt_null(pCtx);. 
2f50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2f60: 7d 0a 20 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f  }.    case JSON_
2f70: 54 52 55 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  TRUE: {.      sq
2f80: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
2f90: 28 70 43 74 78 2c 20 31 29 3b 0a 20 20 20 20 20  (pCtx, 1);.     
2fa0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2fb0: 20 20 63 61 73 65 20 4a 53 4f 4e 5f 46 41 4c 53    case JSON_FALS
2fc0: 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
2fd0: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 70 43  e3_result_int(pC
2fe0: 74 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  tx, 0);.      br
2ff0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
3000: 61 73 65 20 4a 53 4f 4e 5f 52 45 41 4c 3a 20 7b  ase JSON_REAL: {
3010: 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 20  .      double r 
3020: 3d 20 73 74 72 74 6f 64 28 70 4e 6f 64 65 2d 3e  = strtod(pNode->
3030: 75 2e 7a 4a 43 6f 6e 74 65 6e 74 2c 20 30 29 3b  u.zJContent, 0);
3040: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
3050: 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 70 43 74  esult_double(pCt
3060: 78 2c 20 72 29 3b 0a 20 20 20 20 20 20 62 72 65  x, r);.      bre
3070: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
3080: 73 65 20 4a 53 4f 4e 5f 49 4e 54 3a 20 7b 0a 20  se JSON_INT: {. 
3090: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
30a0: 36 34 20 69 20 3d 20 30 3b 0a 20 20 20 20 20 20  64 i = 0;.      
30b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
30c0: 70 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74 65  pNode->u.zJConte
30d0: 6e 74 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b  nt;.      if( z[
30e0: 30 5d 3d 3d 27 2d 27 20 29 7b 20 7a 2b 2b 3b 20  0]=='-' ){ z++; 
30f0: 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a  }.      while( z
3100: 5b 30 5d 3e 3d 27 30 27 20 26 26 20 7a 5b 30 5d  [0]>='0' && z[0]
3110: 3c 3d 27 39 27 20 29 7b 20 69 20 3d 20 69 2a 31  <='9' ){ i = i*1
3120: 30 20 2b 20 2a 28 7a 2b 2b 29 20 2d 20 27 30 27  0 + *(z++) - '0'
3130: 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4e  ; }.      if( pN
3140: 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74  ode->u.zJContent
3150: 5b 30 5d 3d 3d 27 2d 27 20 29 7b 20 69 20 3d 20  [0]=='-' ){ i = 
3160: 2d 69 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c 69  -i; }.      sqli
3170: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34  te3_result_int64
3180: 28 70 43 74 78 2c 20 69 29 3b 0a 20 20 20 20 20  (pCtx, i);.     
3190: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
31a0: 20 20 63 61 73 65 20 4a 53 4f 4e 5f 53 54 52 49    case JSON_STRI
31b0: 4e 47 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  NG: {.      if( 
31c0: 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73 20 26  pNode->jnFlags &
31d0: 20 4a 4e 4f 44 45 5f 52 41 57 20 29 7b 0a 20 20   JNODE_RAW ){.  
31e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
31f0: 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20  sult_text(pCtx, 
3200: 70 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74 65  pNode->u.zJConte
3210: 6e 74 2c 20 70 4e 6f 64 65 2d 3e 6e 2c 0a 20 20  nt, pNode->n,.  
3220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3230: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
3240: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
3250: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4e     }else if( (pN
3260: 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73 20 26 20 4a  ode->jnFlags & J
3270: 4e 4f 44 45 5f 45 53 43 41 50 45 29 3d 3d 30 20  NODE_ESCAPE)==0 
3280: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4a 53  ){.        /* JS
3290: 4f 4e 20 66 6f 72 6d 61 74 74 65 64 20 77 69 74  ON formatted wit
32a0: 68 6f 75 74 20 61 6e 79 20 62 61 63 6b 73 6c 61  hout any backsla
32b0: 73 68 2d 65 73 63 61 70 65 73 20 2a 2f 0a 20 20  sh-escapes */.  
32c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
32d0: 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20  sult_text(pCtx, 
32e0: 70 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74 65  pNode->u.zJConte
32f0: 6e 74 2b 31 2c 20 70 4e 6f 64 65 2d 3e 6e 2d 32  nt+1, pNode->n-2
3300: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
3310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
3320: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
3330: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
3340: 20 20 20 20 20 20 2f 2a 20 54 72 61 6e 73 6c 61        /* Transla
3350: 74 65 20 4a 53 4f 4e 20 66 6f 72 6d 61 74 74 65  te JSON formatte
3360: 64 20 73 74 72 69 6e 67 20 69 6e 74 6f 20 72 61  d string into ra
3370: 77 20 74 65 78 74 20 2a 2f 0a 20 20 20 20 20 20  w text */.      
3380: 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20    u32 i;.       
3390: 20 75 33 32 20 6e 20 3d 20 70 4e 6f 64 65 2d 3e   u32 n = pNode->
33a0: 6e 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  n;.        const
33b0: 20 63 68 61 72 20 2a 7a 20 3d 20 70 4e 6f 64 65   char *z = pNode
33c0: 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 3b 0a 20  ->u.zJContent;. 
33d0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4f 75         char *zOu
33e0: 74 3b 0a 20 20 20 20 20 20 20 20 75 33 32 20 6a  t;.        u32 j
33f0: 3b 0a 20 20 20 20 20 20 20 20 7a 4f 75 74 20 3d  ;.        zOut =
3400: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
3410: 20 6e 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20   n+1 );.        
3420: 69 66 28 20 7a 4f 75 74 3d 3d 30 20 29 7b 0a 20  if( zOut==0 ){. 
3430: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
3440: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
3450: 6d 65 6d 28 70 43 74 78 29 3b 0a 20 20 20 20 20  mem(pCtx);.     
3460: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3470: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f      }.        fo
3480: 72 28 69 3d 31 2c 20 6a 3d 30 3b 20 69 3c 6e 2d  r(i=1, j=0; i<n-
3490: 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  1; i++){.       
34a0: 20 20 20 63 68 61 72 20 63 20 3d 20 7a 5b 69 5d     char c = z[i]
34b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
34c0: 63 21 3d 27 5c 5c 27 20 26 26 20 7a 5b 69 2b 31  c!='\\' && z[i+1
34d0: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ] ){.           
34e0: 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a   zOut[j++] = c;.
34f0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
3500: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 20 3d  .            c =
3510: 20 7a 5b 2b 2b 69 5d 3b 0a 20 20 20 20 20 20 20   z[++i];.       
3520: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 75 27 20       if( c=='u' 
3530: 26 26 20 7a 5b 31 5d 20 29 7b 0a 20 20 20 20 20  && z[1] ){.     
3540: 20 20 20 20 20 20 20 20 20 75 33 32 20 76 20 3d           u32 v =
3550: 20 30 2c 20 6b 3b 0a 20 20 20 20 20 20 20 20 20   0, k;.         
3560: 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20       z++;.      
3570: 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b          for(k=0;
3580: 20 6b 3c 34 20 26 26 20 7a 5b 6b 5d 3b 20 6b 2b   k<4 && z[k]; k+
3590: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
35a0: 20 20 20 20 63 20 3d 20 7a 5b 30 5d 3b 0a 20 20      c = z[0];.  
35b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
35c0: 28 20 63 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27  ( c>='0' && c<='
35d0: 39 27 20 29 20 76 20 3d 20 76 2a 31 36 20 2b 20  9' ) v = v*16 + 
35e0: 63 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 20  c - '0';.       
35f0: 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66           else if
3600: 28 20 63 3e 3d 27 41 27 20 26 26 20 63 3c 3d 27  ( c>='A' && c<='
3610: 46 27 20 29 20 76 20 3d 20 76 2a 31 36 20 2b 20  F' ) v = v*16 + 
3620: 63 20 2d 20 27 41 27 20 2b 20 31 30 3b 0a 20 20  c - 'A' + 10;.  
3630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6c                el
3640: 73 65 20 69 66 28 20 63 3e 3d 27 61 27 20 26 26  se if( c>='a' &&
3650: 20 63 3c 3d 27 66 27 20 29 20 76 20 3d 20 76 2a   c<='f' ) v = v*
3660: 31 36 20 2b 20 63 20 2d 20 27 61 27 20 2b 20 31  16 + c - 'a' + 1
3670: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0;.             
3680: 20 20 20 65 6c 73 65 20 62 72 65 61 6b 3b 0a 20     else break;. 
3690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
36a0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
36b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
36c0: 20 20 69 66 28 20 76 3c 3d 30 78 37 66 20 29 7b    if( v<=0x7f ){
36d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
36e0: 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 76 3b 0a   zOut[j++] = v;.
36f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65                }e
3700: 6c 73 65 20 69 66 28 20 76 3c 3d 30 78 37 66 66  lse if( v<=0x7ff
3710: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
3720: 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20      zOut[j++] = 
3730: 30 78 63 30 20 7c 20 28 76 3e 3e 36 29 3b 0a 20  0xc0 | (v>>6);. 
3740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
3750: 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 30 78 38 30 20  Out[j++] = 0x80 
3760: 7c 20 28 76 26 30 78 33 66 29 3b 0a 20 20 20 20  | (v&0x3f);.    
3770: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
3780: 69 66 28 20 76 3c 3d 30 78 66 66 66 66 20 29 7b  if( v<=0xffff ){
3790: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
37a0: 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 30 78 65   zOut[j++] = 0xe
37b0: 30 20 7c 20 28 76 3e 3e 31 32 29 3b 0a 20 20 20  0 | (v>>12);.   
37c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4f 75               zOu
37d0: 74 5b 6a 2b 2b 5d 20 3d 20 30 78 38 30 20 7c 20  t[j++] = 0x80 | 
37e0: 28 28 76 3e 3e 36 29 26 30 78 33 66 29 3b 0a 20  ((v>>6)&0x3f);. 
37f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
3800: 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 30 78 38 30 20  Out[j++] = 0x80 
3810: 7c 20 28 76 26 30 78 33 66 29 3b 0a 20 20 20 20  | (v&0x3f);.    
3820: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
3830: 69 66 28 20 76 3c 3d 30 78 31 30 66 66 66 66 20  if( v<=0x10ffff 
3840: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
3850: 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 30     zOut[j++] = 0
3860: 78 66 30 20 7c 20 28 76 3e 3e 31 38 29 3b 0a 20  xf0 | (v>>18);. 
3870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
3880: 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 30 78 38 30 20  Out[j++] = 0x80 
3890: 7c 20 28 28 76 3e 3e 31 32 29 26 30 78 33 66 29  | ((v>>12)&0x3f)
38a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
38b0: 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 30 78    zOut[j++] = 0x
38c0: 38 30 20 7c 20 28 28 76 3e 3e 36 29 26 30 78 33  80 | ((v>>6)&0x3
38d0: 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  f);.            
38e0: 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20      zOut[j++] = 
38f0: 30 78 38 30 20 7c 20 28 76 26 30 78 33 66 29 3b  0x80 | (v&0x3f);
3900: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
3910: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
3920: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
3930: 20 20 69 66 28 20 63 3d 3d 27 62 27 20 29 7b 0a    if( c=='b' ){.
3940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3950: 63 20 3d 20 27 5c 62 27 3b 0a 20 20 20 20 20 20  c = '\b';.      
3960: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
3970: 28 20 63 3d 3d 27 66 27 20 29 7b 0a 20 20 20 20  ( c=='f' ){.    
3980: 20 20 20 20 20 20 20 20 20 20 20 20 63 20 3d 20              c = 
3990: 27 5c 66 27 3b 0a 20 20 20 20 20 20 20 20 20 20  '\f';.          
39a0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
39b0: 3d 27 6e 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='n' ){.        
39c0: 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 6e 27          c = '\n'
39d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
39e0: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 72 27  }else if( c=='r'
39f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
3a00: 20 20 20 20 63 20 3d 20 27 5c 72 27 3b 0a 20 20      c = '\r';.  
3a10: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
3a20: 65 20 69 66 28 20 63 3d 3d 27 74 27 20 29 7b 0a  e if( c=='t' ){.
3a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a40: 63 20 3d 20 27 5c 74 27 3b 0a 20 20 20 20 20 20  c = '\t';.      
3a50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3a60: 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b          zOut[j++
3a70: 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20  ] = c;.         
3a80: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
3a90: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
3aa0: 20 20 20 7a 4f 75 74 5b 6a 5d 20 3d 20 30 3b 0a     zOut[j] = 0;.
3ab0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
3ac0: 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78  result_text(pCtx
3ad0: 2c 20 7a 4f 75 74 2c 20 6a 2c 20 73 71 6c 69 74  , zOut, j, sqlit
3ae0: 65 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 20 20  e3_free);.      
3af0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
3b00: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 53     }.    case JS
3b10: 4f 4e 5f 41 52 52 41 59 3a 0a 20 20 20 20 63 61  ON_ARRAY:.    ca
3b20: 73 65 20 4a 53 4f 4e 5f 4f 42 4a 45 43 54 3a 20  se JSON_OBJECT: 
3b30: 7b 0a 20 20 20 20 20 20 4a 73 6f 6e 53 74 72 69  {.      JsonStri
3b40: 6e 67 20 73 3b 0a 20 20 20 20 20 20 6a 73 6f 6e  ng s;.      json
3b50: 49 6e 69 74 28 26 73 2c 20 70 43 74 78 29 3b 0a  Init(&s, pCtx);.
3b60: 20 20 20 20 20 20 6a 73 6f 6e 52 65 6e 64 65 72        jsonRender
3b70: 4e 6f 64 65 28 70 4e 6f 64 65 2c 20 26 73 2c 20  Node(pNode, &s, 
3b80: 61 52 65 70 6c 61 63 65 29 3b 0a 20 20 20 20 20  aReplace);.     
3b90: 20 6a 73 6f 6e 52 65 73 75 6c 74 28 26 73 29 3b   jsonResult(&s);
3ba0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3bb0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
3bc0: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 4a 73   Create a new Js
3bd0: 6f 6e 4e 6f 64 65 20 69 6e 73 74 61 6e 63 65 20  onNode instance 
3be0: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 61 72 67  based on the arg
3bf0: 75 6d 65 6e 74 73 20 61 6e 64 20 61 70 70 65 6e  uments and appen
3c00: 64 20 74 68 61 74 0a 2a 2a 20 69 6e 73 74 61 6e  d that.** instan
3c10: 63 65 20 74 6f 20 74 68 65 20 4a 73 6f 6e 50 61  ce to the JsonPa
3c20: 72 73 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  rse.  Return the
3c30: 20 69 6e 64 65 78 20 69 6e 20 70 50 61 72 73 65   index in pParse
3c40: 2d 3e 61 4e 6f 64 65 5b 5d 20 6f 66 20 74 68 65  ->aNode[] of the
3c50: 0a 2a 2a 20 6e 65 77 20 6e 6f 64 65 2c 20 6f 72  .** new node, or
3c60: 20 2d 31 20 69 66 20 61 20 6d 65 6d 6f 72 79 20   -1 if a memory 
3c70: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
3c80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3c90: 6a 73 6f 6e 50 61 72 73 65 41 64 64 4e 6f 64 65  jsonParseAddNode
3ca0: 28 0a 20 20 4a 73 6f 6e 50 61 72 73 65 20 2a 70  (.  JsonParse *p
3cb0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
3cc0: 20 41 70 70 65 6e 64 20 74 68 65 20 6e 6f 64 65   Append the node
3cd0: 20 74 6f 20 74 68 69 73 20 6f 62 6a 65 63 74 20   to this object 
3ce0: 2a 2f 0a 20 20 75 33 32 20 65 54 79 70 65 2c 20  */.  u32 eType, 
3cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3d00: 2a 20 4e 6f 64 65 20 74 79 70 65 20 2a 2f 0a 20  * Node type */. 
3d10: 20 75 33 32 20 6e 2c 20 20 20 20 20 20 20 20 20   u32 n,         
3d20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
3d30: 6e 74 65 6e 74 20 73 69 7a 65 20 6f 72 20 73 75  ntent size or su
3d40: 62 2d 6e 6f 64 65 20 63 6f 75 6e 74 20 2a 2f 0a  b-node count */.
3d50: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
3d60: 6f 6e 74 65 6e 74 20 20 20 20 20 20 2f 2a 20 43  ontent      /* C
3d70: 6f 6e 74 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 4a  ontent */.){.  J
3d80: 73 6f 6e 4e 6f 64 65 20 2a 70 3b 0a 20 20 69 66  sonNode *p;.  if
3d90: 28 20 70 50 61 72 73 65 2d 3e 6e 4e 6f 64 65 3e  ( pParse->nNode>
3da0: 3d 70 50 61 72 73 65 2d 3e 6e 41 6c 6c 6f 63 20  =pParse->nAlloc 
3db0: 29 7b 0a 20 20 20 20 75 33 32 20 6e 4e 65 77 3b  ){.    u32 nNew;
3dc0: 0a 20 20 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70  .    JsonNode *p
3dd0: 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 70 50 61  New;.    if( pPa
3de0: 72 73 65 2d 3e 6f 6f 6d 20 29 20 72 65 74 75 72  rse->oom ) retur
3df0: 6e 20 2d 31 3b 0a 20 20 20 20 6e 4e 65 77 20 3d  n -1;.    nNew =
3e00: 20 70 50 61 72 73 65 2d 3e 6e 41 6c 6c 6f 63 2a   pParse->nAlloc*
3e10: 32 20 2b 20 31 30 3b 0a 20 20 20 20 69 66 28 20  2 + 10;.    if( 
3e20: 6e 4e 65 77 3c 3d 70 50 61 72 73 65 2d 3e 6e 4e  nNew<=pParse->nN
3e30: 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ode ){.      pPa
3e40: 72 73 65 2d 3e 6f 6f 6d 20 3d 20 31 3b 0a 20 20  rse->oom = 1;.  
3e50: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
3e60: 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 20 3d 20     }.    pNew = 
3e70: 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
3e80: 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65 2c 20 73  pParse->aNode, s
3e90: 69 7a 65 6f 66 28 4a 73 6f 6e 4e 6f 64 65 29 2a  izeof(JsonNode)*
3ea0: 6e 4e 65 77 29 3b 0a 20 20 20 20 69 66 28 20 70  nNew);.    if( p
3eb0: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
3ec0: 70 50 61 72 73 65 2d 3e 6f 6f 6d 20 3d 20 31 3b  pParse->oom = 1;
3ed0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
3ee0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
3ef0: 73 65 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 4e 65  se->nAlloc = nNe
3f00: 77 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61  w;.    pParse->a
3f10: 4e 6f 64 65 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  Node = pNew;.  }
3f20: 0a 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e  .  p = &pParse->
3f30: 61 4e 6f 64 65 5b 70 50 61 72 73 65 2d 3e 6e 4e  aNode[pParse->nN
3f40: 6f 64 65 5d 3b 0a 20 20 70 2d 3e 65 54 79 70 65  ode];.  p->eType
3f50: 20 3d 20 28 75 38 29 65 54 79 70 65 3b 0a 20 20   = (u8)eType;.  
3f60: 70 2d 3e 6a 6e 46 6c 61 67 73 20 3d 20 30 3b 0a  p->jnFlags = 0;.
3f70: 20 20 70 2d 3e 69 56 61 6c 20 3d 20 30 3b 0a 20    p->iVal = 0;. 
3f80: 20 70 2d 3e 6e 20 3d 20 6e 3b 0a 20 20 70 2d 3e   p->n = n;.  p->
3f90: 75 2e 7a 4a 43 6f 6e 74 65 6e 74 20 3d 20 7a 43  u.zJContent = zC
3fa0: 6f 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e  ontent;.  return
3fb0: 20 70 50 61 72 73 65 2d 3e 6e 4e 6f 64 65 2b 2b   pParse->nNode++
3fc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65  ;.}../*.** Parse
3fd0: 20 61 20 73 69 6e 67 6c 65 20 4a 53 4f 4e 20 76   a single JSON v
3fe0: 61 6c 75 65 20 77 68 69 63 68 20 62 65 67 69 6e  alue which begin
3ff0: 73 20 61 74 20 70 50 61 72 73 65 2d 3e 7a 4a 73  s at pParse->zJs
4000: 6f 6e 5b 69 5d 2e 20 20 52 65 74 75 72 6e 20 74  on[i].  Return t
4010: 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74  he.** index of t
4020: 68 65 20 66 69 72 73 74 20 63 68 61 72 61 63 74  he first charact
4030: 65 72 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  er past the end 
4040: 6f 66 20 74 68 65 20 76 61 6c 75 65 20 70 61 72  of the value par
4050: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  sed..**.** Retur
4060: 6e 20 6e 65 67 61 74 69 76 65 20 66 6f 72 20 61  n negative for a
4070: 20 73 79 6e 74 61 78 20 65 72 72 6f 72 2e 20 20   syntax error.  
4080: 53 70 65 63 69 61 6c 20 63 61 73 65 73 3a 20 20  Special cases:  
4090: 72 65 74 75 72 6e 20 2d 32 20 69 66 20 74 68 65  return -2 if the
40a0: 0a 2a 2a 20 66 69 72 73 74 20 6e 6f 6e 2d 77 68  .** first non-wh
40b0: 69 74 65 73 70 61 63 65 20 63 68 61 72 61 63 74  itespace charact
40c0: 65 72 20 69 73 20 27 7d 27 20 61 6e 64 20 72 65  er is '}' and re
40d0: 74 75 72 6e 20 2d 33 20 69 66 20 74 68 65 20 66  turn -3 if the f
40e0: 69 72 73 74 0a 2a 2a 20 6e 6f 6e 2d 77 68 69 74  irst.** non-whit
40f0: 65 73 70 61 63 65 20 63 68 61 72 61 63 74 65 72  espace character
4100: 20 69 73 20 27 5d 27 2e 0a 2a 2f 0a 73 74 61 74   is ']'..*/.stat
4110: 69 63 20 69 6e 74 20 6a 73 6f 6e 50 61 72 73 65  ic int jsonParse
4120: 56 61 6c 75 65 28 4a 73 6f 6e 50 61 72 73 65 20  Value(JsonParse 
4130: 2a 70 50 61 72 73 65 2c 20 75 33 32 20 69 29 7b  *pParse, u32 i){
4140: 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 75 33 32  .  char c;.  u32
4150: 20 6a 3b 0a 20 20 75 33 32 20 69 54 68 69 73 3b   j;.  u32 iThis;
4160: 0a 20 20 69 6e 74 20 78 3b 0a 20 20 77 68 69 6c  .  int x;.  whil
4170: 65 28 20 69 73 73 70 61 63 65 28 70 50 61 72 73  e( isspace(pPars
4180: 65 2d 3e 7a 4a 73 6f 6e 5b 69 5d 29 20 29 7b 20  e->zJson[i]) ){ 
4190: 69 2b 2b 3b 20 7d 0a 20 20 69 66 28 20 28 63 20  i++; }.  if( (c 
41a0: 3d 20 70 50 61 72 73 65 2d 3e 7a 4a 73 6f 6e 5b  = pParse->zJson[
41b0: 69 5d 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  i])==0 ) return 
41c0: 30 3b 0a 20 20 69 66 28 20 63 3d 3d 27 7b 27 20  0;.  if( c=='{' 
41d0: 29 7b 0a 20 20 20 20 2f 2a 20 50 61 72 73 65 20  ){.    /* Parse 
41e0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69 54  object */.    iT
41f0: 68 69 73 20 3d 20 6a 73 6f 6e 50 61 72 73 65 41  his = jsonParseA
4200: 64 64 4e 6f 64 65 28 70 50 61 72 73 65 2c 20 4a  ddNode(pParse, J
4210: 53 4f 4e 5f 4f 42 4a 45 43 54 2c 20 30 2c 20 30  SON_OBJECT, 0, 0
4220: 29 3b 0a 20 20 20 20 69 66 28 20 69 54 68 69 73  );.    if( iThis
4230: 3c 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  <0 ) return -1;.
4240: 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 3b 6a      for(j=i+1;;j
4250: 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65  ++){.      while
4260: 28 20 69 73 73 70 61 63 65 28 70 50 61 72 73 65  ( isspace(pParse
4270: 2d 3e 7a 4a 73 6f 6e 5b 6a 5d 29 20 29 7b 20 6a  ->zJson[j]) ){ j
4280: 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 78 20 3d 20  ++; }.      x = 
4290: 6a 73 6f 6e 50 61 72 73 65 56 61 6c 75 65 28 70  jsonParseValue(p
42a0: 50 61 72 73 65 2c 20 6a 29 3b 0a 20 20 20 20 20  Parse, j);.     
42b0: 20 69 66 28 20 78 3c 30 20 29 7b 0a 20 20 20 20   if( x<0 ){.    
42c0: 20 20 20 20 69 66 28 20 78 3d 3d 28 2d 32 29 20      if( x==(-2) 
42d0: 26 26 20 70 50 61 72 73 65 2d 3e 6e 4e 6f 64 65  && pParse->nNode
42e0: 3d 3d 69 54 68 69 73 2b 31 20 29 20 72 65 74 75  ==iThis+1 ) retu
42f0: 72 6e 20 6a 2b 31 3b 0a 20 20 20 20 20 20 20 20  rn j+1;.        
4300: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
4310: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50 61   }.      if( pPa
4320: 72 73 65 2d 3e 61 4e 6f 64 65 5b 70 50 61 72 73  rse->aNode[pPars
4330: 65 2d 3e 6e 4e 6f 64 65 2d 31 5d 2e 65 54 79 70  e->nNode-1].eTyp
4340: 65 21 3d 4a 53 4f 4e 5f 53 54 52 49 4e 47 20 29  e!=JSON_STRING )
4350: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
4360: 20 20 6a 20 3d 20 78 3b 0a 20 20 20 20 20 20 77    j = x;.      w
4370: 68 69 6c 65 28 20 69 73 73 70 61 63 65 28 70 50  hile( isspace(pP
4380: 61 72 73 65 2d 3e 7a 4a 73 6f 6e 5b 6a 5d 29 20  arse->zJson[j]) 
4390: 29 7b 20 6a 2b 2b 3b 20 7d 0a 20 20 20 20 20 20  ){ j++; }.      
43a0: 69 66 28 20 70 50 61 72 73 65 2d 3e 7a 4a 73 6f  if( pParse->zJso
43b0: 6e 5b 6a 5d 21 3d 27 3a 27 20 29 20 72 65 74 75  n[j]!=':' ) retu
43c0: 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 6a 2b 2b  rn -1;.      j++
43d0: 3b 0a 20 20 20 20 20 20 78 20 3d 20 6a 73 6f 6e  ;.      x = json
43e0: 50 61 72 73 65 56 61 6c 75 65 28 70 50 61 72 73  ParseValue(pPars
43f0: 65 2c 20 6a 29 3b 0a 20 20 20 20 20 20 69 66 28  e, j);.      if(
4400: 20 78 3c 30 20 29 20 72 65 74 75 72 6e 20 2d 31   x<0 ) return -1
4410: 3b 0a 20 20 20 20 20 20 6a 20 3d 20 78 3b 0a 20  ;.      j = x;. 
4420: 20 20 20 20 20 77 68 69 6c 65 28 20 69 73 73 70       while( issp
4430: 61 63 65 28 70 50 61 72 73 65 2d 3e 7a 4a 73 6f  ace(pParse->zJso
4440: 6e 5b 6a 5d 29 20 29 7b 20 6a 2b 2b 3b 20 7d 0a  n[j]) ){ j++; }.
4450: 20 20 20 20 20 20 63 20 3d 20 70 50 61 72 73 65        c = pParse
4460: 2d 3e 7a 4a 73 6f 6e 5b 6a 5d 3b 0a 20 20 20 20  ->zJson[j];.    
4470: 20 20 69 66 28 20 63 3d 3d 27 2c 27 20 29 20 63    if( c==',' ) c
4480: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
4490: 66 28 20 63 21 3d 27 7d 27 20 29 20 72 65 74 75  f( c!='}' ) retu
44a0: 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 62 72 65  rn -1;.      bre
44b0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  ak;.    }.    pP
44c0: 61 72 73 65 2d 3e 61 4e 6f 64 65 5b 69 54 68 69  arse->aNode[iThi
44d0: 73 5d 2e 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e  s].n = pParse->n
44e0: 4e 6f 64 65 20 2d 20 69 54 68 69 73 20 2d 20 31  Node - iThis - 1
44f0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6a 2b 31  ;.    return j+1
4500: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d  ;.  }else if( c=
4510: 3d 27 5b 27 20 29 7b 0a 20 20 20 20 2f 2a 20 50  ='[' ){.    /* P
4520: 61 72 73 65 20 61 72 72 61 79 20 2a 2f 0a 20 20  arse array */.  
4530: 20 20 69 54 68 69 73 20 3d 20 6a 73 6f 6e 50 61    iThis = jsonPa
4540: 72 73 65 41 64 64 4e 6f 64 65 28 70 50 61 72 73  rseAddNode(pPars
4550: 65 2c 20 4a 53 4f 4e 5f 41 52 52 41 59 2c 20 30  e, JSON_ARRAY, 0
4560: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 69 54  , 0);.    if( iT
4570: 68 69 73 3c 30 20 29 20 72 65 74 75 72 6e 20 2d  his<0 ) return -
4580: 31 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31  1;.    for(j=i+1
4590: 3b 3b 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68  ;;j++){.      wh
45a0: 69 6c 65 28 20 69 73 73 70 61 63 65 28 70 50 61  ile( isspace(pPa
45b0: 72 73 65 2d 3e 7a 4a 73 6f 6e 5b 6a 5d 29 20 29  rse->zJson[j]) )
45c0: 7b 20 6a 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 78  { j++; }.      x
45d0: 20 3d 20 6a 73 6f 6e 50 61 72 73 65 56 61 6c 75   = jsonParseValu
45e0: 65 28 70 50 61 72 73 65 2c 20 6a 29 3b 0a 20 20  e(pParse, j);.  
45f0: 20 20 20 20 69 66 28 20 78 3c 30 20 29 7b 0a 20      if( x<0 ){. 
4600: 20 20 20 20 20 20 20 69 66 28 20 78 3d 3d 28 2d         if( x==(-
4610: 33 29 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 4e  3) && pParse->nN
4620: 6f 64 65 3d 3d 69 54 68 69 73 2b 31 20 29 20 72  ode==iThis+1 ) r
4630: 65 74 75 72 6e 20 6a 2b 31 3b 0a 20 20 20 20 20  eturn j+1;.     
4640: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
4650: 20 20 20 20 7d 0a 20 20 20 20 20 20 6a 20 3d 20      }.      j = 
4660: 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  x;.      while( 
4670: 69 73 73 70 61 63 65 28 70 50 61 72 73 65 2d 3e  isspace(pParse->
4680: 7a 4a 73 6f 6e 5b 6a 5d 29 20 29 7b 20 6a 2b 2b  zJson[j]) ){ j++
4690: 3b 20 7d 0a 20 20 20 20 20 20 63 20 3d 20 70 50  ; }.      c = pP
46a0: 61 72 73 65 2d 3e 7a 4a 73 6f 6e 5b 6a 5d 3b 0a  arse->zJson[j];.
46b0: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 2c 27        if( c==','
46c0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
46d0: 20 20 20 69 66 28 20 63 21 3d 27 5d 27 20 29 20     if( c!=']' ) 
46e0: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
46f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4700: 20 20 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65 5b    pParse->aNode[
4710: 69 54 68 69 73 5d 2e 6e 20 3d 20 70 50 61 72 73  iThis].n = pPars
4720: 65 2d 3e 6e 4e 6f 64 65 20 2d 20 69 54 68 69 73  e->nNode - iThis
4730: 20 2d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   - 1;.    return
4740: 20 6a 2b 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66   j+1;.  }else if
4750: 28 20 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20  ( c=='"' ){.    
4760: 2f 2a 20 50 61 72 73 65 20 73 74 72 69 6e 67 20  /* Parse string 
4770: 2a 2f 0a 20 20 20 20 75 38 20 6a 6e 46 6c 61 67  */.    u8 jnFlag
4780: 73 20 3d 20 30 3b 0a 20 20 20 20 6a 20 3d 20 69  s = 0;.    j = i
4790: 2b 31 3b 0a 20 20 20 20 66 6f 72 28 3b 3b 29 7b  +1;.    for(;;){
47a0: 0a 20 20 20 20 20 20 63 20 3d 20 70 50 61 72 73  .      c = pPars
47b0: 65 2d 3e 7a 4a 73 6f 6e 5b 6a 5d 3b 0a 20 20 20  e->zJson[j];.   
47c0: 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20 72 65     if( c==0 ) re
47d0: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69  turn -1;.      i
47e0: 66 28 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20  f( c=='\\' ){.  
47f0: 20 20 20 20 20 20 63 20 3d 20 70 50 61 72 73 65        c = pParse
4800: 2d 3e 7a 4a 73 6f 6e 5b 2b 2b 6a 5d 3b 0a 20 20  ->zJson[++j];.  
4810: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29        if( c==0 )
4820: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
4830: 20 20 20 20 6a 6e 46 6c 61 67 73 20 3d 20 4a 4e      jnFlags = JN
4840: 4f 44 45 5f 45 53 43 41 50 45 3b 0a 20 20 20 20  ODE_ESCAPE;.    
4850: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
4860: 22 27 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  "' ){.        br
4870: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
4880: 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     j++;.    }.  
4890: 20 20 6a 73 6f 6e 50 61 72 73 65 41 64 64 4e 6f    jsonParseAddNo
48a0: 64 65 28 70 50 61 72 73 65 2c 20 4a 53 4f 4e 5f  de(pParse, JSON_
48b0: 53 54 52 49 4e 47 2c 20 6a 2b 31 2d 69 2c 20 26  STRING, j+1-i, &
48c0: 70 50 61 72 73 65 2d 3e 7a 4a 73 6f 6e 5b 69 5d  pParse->zJson[i]
48d0: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61  );.    pParse->a
48e0: 4e 6f 64 65 5b 70 50 61 72 73 65 2d 3e 6e 4e 6f  Node[pParse->nNo
48f0: 64 65 2d 31 5d 2e 6a 6e 46 6c 61 67 73 20 3d 20  de-1].jnFlags = 
4900: 6a 6e 46 6c 61 67 73 3b 0a 20 20 20 20 72 65 74  jnFlags;.    ret
4910: 75 72 6e 20 6a 2b 31 3b 0a 20 20 7d 65 6c 73 65  urn j+1;.  }else
4920: 20 69 66 28 20 63 3d 3d 27 6e 27 0a 20 20 20 20   if( c=='n'.    
4930: 20 20 20 20 20 26 26 20 73 74 72 6e 63 6d 70 28       && strncmp(
4940: 70 50 61 72 73 65 2d 3e 7a 4a 73 6f 6e 2b 69 2c  pParse->zJson+i,
4950: 22 6e 75 6c 6c 22 2c 34 29 3d 3d 30 0a 20 20 20  "null",4)==0.   
4960: 20 20 20 20 20 20 26 26 20 21 69 73 61 6c 6e 75        && !isalnu
4970: 6d 28 70 50 61 72 73 65 2d 3e 7a 4a 73 6f 6e 5b  m(pParse->zJson[
4980: 69 2b 34 5d 29 20 29 7b 0a 20 20 20 20 6a 73 6f  i+4]) ){.    jso
4990: 6e 50 61 72 73 65 41 64 64 4e 6f 64 65 28 70 50  nParseAddNode(pP
49a0: 61 72 73 65 2c 20 4a 53 4f 4e 5f 4e 55 4c 4c 2c  arse, JSON_NULL,
49b0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75   0, 0);.    retu
49c0: 72 6e 20 69 2b 34 3b 0a 20 20 7d 65 6c 73 65 20  rn i+4;.  }else 
49d0: 69 66 28 20 63 3d 3d 27 74 27 0a 20 20 20 20 20  if( c=='t'.     
49e0: 20 20 20 20 26 26 20 73 74 72 6e 63 6d 70 28 70      && strncmp(p
49f0: 50 61 72 73 65 2d 3e 7a 4a 73 6f 6e 2b 69 2c 22  Parse->zJson+i,"
4a00: 74 72 75 65 22 2c 34 29 3d 3d 30 0a 20 20 20 20  true",4)==0.    
4a10: 20 20 20 20 20 26 26 20 21 69 73 61 6c 6e 75 6d       && !isalnum
4a20: 28 70 50 61 72 73 65 2d 3e 7a 4a 73 6f 6e 5b 69  (pParse->zJson[i
4a30: 2b 34 5d 29 20 29 7b 0a 20 20 20 20 6a 73 6f 6e  +4]) ){.    json
4a40: 50 61 72 73 65 41 64 64 4e 6f 64 65 28 70 50 61  ParseAddNode(pPa
4a50: 72 73 65 2c 20 4a 53 4f 4e 5f 54 52 55 45 2c 20  rse, JSON_TRUE, 
4a60: 30 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  0, 0);.    retur
4a70: 6e 20 69 2b 34 3b 0a 20 20 7d 65 6c 73 65 20 69  n i+4;.  }else i
4a80: 66 28 20 63 3d 3d 27 66 27 0a 20 20 20 20 20 20  f( c=='f'.      
4a90: 20 20 20 26 26 20 73 74 72 6e 63 6d 70 28 70 50     && strncmp(pP
4aa0: 61 72 73 65 2d 3e 7a 4a 73 6f 6e 2b 69 2c 22 66  arse->zJson+i,"f
4ab0: 61 6c 73 65 22 2c 35 29 3d 3d 30 0a 20 20 20 20  alse",5)==0.    
4ac0: 20 20 20 20 20 26 26 20 21 69 73 61 6c 6e 75 6d       && !isalnum
4ad0: 28 70 50 61 72 73 65 2d 3e 7a 4a 73 6f 6e 5b 69  (pParse->zJson[i
4ae0: 2b 35 5d 29 20 29 7b 0a 20 20 20 20 6a 73 6f 6e  +5]) ){.    json
4af0: 50 61 72 73 65 41 64 64 4e 6f 64 65 28 70 50 61  ParseAddNode(pPa
4b00: 72 73 65 2c 20 4a 53 4f 4e 5f 46 41 4c 53 45 2c  rse, JSON_FALSE,
4b10: 20 30 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75   0, 0);.    retu
4b20: 72 6e 20 69 2b 35 3b 0a 20 20 7d 65 6c 73 65 20  rn i+5;.  }else 
4b30: 69 66 28 20 63 3d 3d 27 2d 27 20 7c 7c 20 28 63  if( c=='-' || (c
4b40: 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27 39 27 29  >='0' && c<='9')
4b50: 20 29 7b 0a 20 20 20 20 2f 2a 20 50 61 72 73 65   ){.    /* Parse
4b60: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 75   number */.    u
4b70: 38 20 73 65 65 6e 44 50 20 3d 20 30 3b 0a 20 20  8 seenDP = 0;.  
4b80: 20 20 75 38 20 73 65 65 6e 45 20 3d 20 30 3b 0a    u8 seenE = 0;.
4b90: 20 20 20 20 6a 20 3d 20 69 2b 31 3b 0a 20 20 20      j = i+1;.   
4ba0: 20 66 6f 72 28 3b 3b 20 6a 2b 2b 29 7b 0a 20 20   for(;; j++){.  
4bb0: 20 20 20 20 63 20 3d 20 70 50 61 72 73 65 2d 3e      c = pParse->
4bc0: 7a 4a 73 6f 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20  zJson[j];.      
4bd0: 69 66 28 20 63 3e 3d 27 30 27 20 26 26 20 63 3c  if( c>='0' && c<
4be0: 3d 27 39 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ='9' ) continue;
4bf0: 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 2e  .      if( c=='.
4c00: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ' ){.        if(
4c10: 20 70 50 61 72 73 65 2d 3e 7a 4a 73 6f 6e 5b 6a   pParse->zJson[j
4c20: 2d 31 5d 3d 3d 27 2d 27 20 29 20 72 65 74 75 72  -1]=='-' ) retur
4c30: 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 66  n -1;.        if
4c40: 28 20 73 65 65 6e 44 50 20 29 20 72 65 74 75 72  ( seenDP ) retur
4c50: 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 73 65  n -1;.        se
4c60: 65 6e 44 50 20 3d 20 31 3b 0a 20 20 20 20 20 20  enDP = 1;.      
4c70: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
4c80: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d    }.      if( c=
4c90: 3d 27 65 27 20 7c 7c 20 63 3d 3d 27 45 27 20 29  ='e' || c=='E' )
4ca0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
4cb0: 61 72 73 65 2d 3e 7a 4a 73 6f 6e 5b 6a 2d 31 5d  arse->zJson[j-1]
4cc0: 3c 27 30 27 20 29 20 72 65 74 75 72 6e 20 2d 31  <'0' ) return -1
4cd0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 65  ;.        if( se
4ce0: 65 6e 45 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  enE ) return -1;
4cf0: 0a 20 20 20 20 20 20 20 20 73 65 65 6e 44 50 20  .        seenDP 
4d00: 3d 20 73 65 65 6e 45 20 3d 20 31 3b 0a 20 20 20  = seenE = 1;.   
4d10: 20 20 20 20 20 63 20 3d 20 70 50 61 72 73 65 2d       c = pParse-
4d20: 3e 7a 4a 73 6f 6e 5b 6a 2b 31 5d 3b 0a 20 20 20  >zJson[j+1];.   
4d30: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 2b 27 20       if( c=='+' 
4d40: 7c 7c 20 63 3d 3d 27 2d 27 20 29 20 6a 2b 2b 3b  || c=='-' ) j++;
4d50: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
4d60: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
4d70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4d80: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 7a 4a    if( pParse->zJ
4d90: 73 6f 6e 5b 6a 2d 31 5d 3c 27 30 27 20 29 20 72  son[j-1]<'0' ) r
4da0: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 6a 73  eturn -1;.    js
4db0: 6f 6e 50 61 72 73 65 41 64 64 4e 6f 64 65 28 70  onParseAddNode(p
4dc0: 50 61 72 73 65 2c 20 73 65 65 6e 44 50 20 3f 20  Parse, seenDP ? 
4dd0: 4a 53 4f 4e 5f 52 45 41 4c 20 3a 20 4a 53 4f 4e  JSON_REAL : JSON
4de0: 5f 49 4e 54 2c 0a 20 20 20 20 20 20 20 20 20 20  _INT,.          
4df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 20                j 
4e00: 2d 20 69 2c 20 26 70 50 61 72 73 65 2d 3e 7a 4a  - i, &pParse->zJ
4e10: 73 6f 6e 5b 69 5d 29 3b 0a 20 20 20 20 72 65 74  son[i]);.    ret
4e20: 75 72 6e 20 6a 3b 0a 20 20 7d 65 6c 73 65 20 69  urn j;.  }else i
4e30: 66 28 20 63 3d 3d 27 7d 27 20 29 7b 0a 20 20 20  f( c=='}' ){.   
4e40: 20 72 65 74 75 72 6e 20 2d 32 3b 20 20 2f 2a 20   return -2;  /* 
4e50: 45 6e 64 20 6f 66 20 7b 2e 2e 2e 7d 20 2a 2f 0a  End of {...} */.
4e60: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
4e70: 5d 27 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ]' ){.    return
4e80: 20 2d 33 3b 20 20 2f 2a 20 45 6e 64 20 6f 66 20   -3;  /* End of 
4e90: 5b 2e 2e 2e 5d 20 2a 2f 0a 20 20 7d 65 6c 73 65  [...] */.  }else
4ea0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  {.    return -1;
4eb0: 20 20 2f 2a 20 53 79 6e 74 61 78 20 65 72 72 6f    /* Syntax erro
4ec0: 72 20 2a 2f 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  r */.  }.}../*.*
4ed0: 2a 20 50 61 72 73 65 20 61 20 63 6f 6d 70 6c 65  * Parse a comple
4ee0: 74 65 20 4a 53 4f 4e 20 73 74 72 69 6e 67 2e 20  te JSON string. 
4ef0: 20 52 65 74 75 72 6e 20 30 20 6f 6e 20 73 75 63   Return 0 on suc
4f00: 63 65 73 73 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  cess or non-zero
4f10: 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   if there.** are
4f20: 20 61 6e 79 20 65 72 72 6f 72 73 2e 20 20 49 66   any errors.  If
4f30: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
4f40: 2c 20 66 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72  , free all memor
4f50: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
4f60: 68 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a 0a  h.** pParse..**.
4f70: 2a 2a 20 70 50 61 72 73 65 20 69 73 20 75 6e 69  ** pParse is uni
4f80: 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20  nitialized when 
4f90: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
4fa0: 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
4fb0: 63 20 69 6e 74 20 6a 73 6f 6e 50 61 72 73 65 28  c int jsonParse(
4fc0: 4a 73 6f 6e 50 61 72 73 65 20 2a 70 50 61 72 73  JsonParse *pPars
4fd0: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
4fe0: 4a 73 6f 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Json){.  int i;.
4ff0: 20 20 69 66 28 20 7a 4a 73 6f 6e 3d 3d 30 20 29    if( zJson==0 )
5000: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d   return 1;.  mem
5010: 73 65 74 28 70 50 61 72 73 65 2c 20 30 2c 20 73  set(pParse, 0, s
5020: 69 7a 65 6f 66 28 2a 70 50 61 72 73 65 29 29 3b  izeof(*pParse));
5030: 0a 20 20 70 50 61 72 73 65 2d 3e 7a 4a 73 6f 6e  .  pParse->zJson
5040: 20 3d 20 7a 4a 73 6f 6e 3b 0a 20 20 69 20 3d 20   = zJson;.  i = 
5050: 6a 73 6f 6e 50 61 72 73 65 56 61 6c 75 65 28 70  jsonParseValue(p
5060: 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 69 66 28  Parse, 0);.  if(
5070: 20 69 3e 30 20 29 7b 0a 20 20 20 20 77 68 69 6c   i>0 ){.    whil
5080: 65 28 20 69 73 73 70 61 63 65 28 7a 4a 73 6f 6e  e( isspace(zJson
5090: 5b 69 5d 29 20 29 20 69 2b 2b 3b 0a 20 20 20 20  [i]) ) i++;.    
50a0: 69 66 28 20 7a 4a 73 6f 6e 5b 69 5d 20 29 20 69  if( zJson[i] ) i
50b0: 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28   = -1;.  }.  if(
50c0: 20 69 3c 30 20 29 7b 0a 20 20 20 20 6a 73 6f 6e   i<0 ){.    json
50d0: 50 61 72 73 65 52 65 73 65 74 28 70 50 61 72 73  ParseReset(pPars
50e0: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  e);.    return 1
50f0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
5100: 3b 0a 7d 0a 0a 2f 2a 20 4d 61 72 6b 20 6e 6f 64  ;.}../* Mark nod
5110: 65 20 69 20 6f 66 20 70 50 61 72 73 65 20 61 73  e i of pParse as
5120: 20 62 65 69 6e 67 20 61 20 63 68 69 6c 64 20 6f   being a child o
5130: 66 20 69 50 61 72 65 6e 74 2e 20 20 43 61 6c 6c  f iParent.  Call
5140: 20 72 65 63 75 72 73 69 76 65 6c 79 0a 2a 2a 20   recursively.** 
5150: 74 6f 20 66 69 6c 6c 20 69 6e 20 61 6c 6c 20 74  to fill in all t
5160: 68 65 20 64 65 73 63 65 6e 64 61 6e 74 73 20 6f  he descendants o
5170: 66 20 6e 6f 64 65 20 69 2e 0a 2a 2f 0a 73 74 61  f node i..*/.sta
5180: 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 50 61 72  tic void jsonPar
5190: 73 65 46 69 6c 6c 49 6e 50 61 72 65 6e 74 61 67  seFillInParentag
51a0: 65 28 4a 73 6f 6e 50 61 72 73 65 20 2a 70 50 61  e(JsonParse *pPa
51b0: 72 73 65 2c 20 75 33 32 20 69 2c 20 75 33 32 20  rse, u32 i, u32 
51c0: 69 50 61 72 65 6e 74 29 7b 0a 20 20 4a 73 6f 6e  iParent){.  Json
51d0: 4e 6f 64 65 20 2a 70 4e 6f 64 65 20 3d 20 26 70  Node *pNode = &p
51e0: 50 61 72 73 65 2d 3e 61 4e 6f 64 65 5b 69 5d 3b  Parse->aNode[i];
51f0: 0a 20 20 75 33 32 20 6a 3b 0a 20 20 70 50 61 72  .  u32 j;.  pPar
5200: 73 65 2d 3e 61 55 70 5b 69 5d 20 3d 20 69 50 61  se->aUp[i] = iPa
5210: 72 65 6e 74 3b 0a 20 20 73 77 69 74 63 68 28 20  rent;.  switch( 
5220: 70 4e 6f 64 65 2d 3e 65 54 79 70 65 20 29 7b 0a  pNode->eType ){.
5230: 20 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f 41 52      case JSON_AR
5240: 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 66 6f 72  RAY: {.      for
5250: 28 6a 3d 31 3b 20 6a 3c 3d 70 4e 6f 64 65 2d 3e  (j=1; j<=pNode->
5260: 6e 3b 20 6a 20 2b 3d 20 6a 73 6f 6e 4e 6f 64 65  n; j += jsonNode
5270: 53 69 7a 65 28 70 4e 6f 64 65 2b 6a 29 29 7b 0a  Size(pNode+j)){.
5280: 20 20 20 20 20 20 20 20 6a 73 6f 6e 50 61 72 73          jsonPars
5290: 65 46 69 6c 6c 49 6e 50 61 72 65 6e 74 61 67 65  eFillInParentage
52a0: 28 70 50 61 72 73 65 2c 20 69 2b 6a 2c 20 69 29  (pParse, i+j, i)
52b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
52c0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
52d0: 20 63 61 73 65 20 4a 53 4f 4e 5f 4f 42 4a 45 43   case JSON_OBJEC
52e0: 54 3a 20 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a  T: {.      for(j
52f0: 3d 31 3b 20 6a 3c 3d 70 4e 6f 64 65 2d 3e 6e 3b  =1; j<=pNode->n;
5300: 20 6a 20 2b 3d 20 6a 73 6f 6e 4e 6f 64 65 53 69   j += jsonNodeSi
5310: 7a 65 28 70 4e 6f 64 65 2b 6a 2b 31 29 2b 31 29  ze(pNode+j+1)+1)
5320: 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  {.        pParse
5330: 2d 3e 61 55 70 5b 69 2b 6a 5d 20 3d 20 69 3b 0a  ->aUp[i+j] = i;.
5340: 20 20 20 20 20 20 20 20 6a 73 6f 6e 50 61 72 73          jsonPars
5350: 65 46 69 6c 6c 49 6e 50 61 72 65 6e 74 61 67 65  eFillInParentage
5360: 28 70 50 61 72 73 65 2c 20 69 2b 6a 2b 31 2c 20  (pParse, i+j+1, 
5370: 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i);.      }.    
5380: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
5390: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
53a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
53b0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
53c0: 6d 70 75 74 65 20 74 68 65 20 70 61 72 65 6e 74  mpute the parent
53d0: 61 67 65 20 6f 66 20 61 6c 6c 20 6e 6f 64 65 73  age of all nodes
53e0: 20 69 6e 20 61 20 63 6f 6d 70 6c 65 74 65 64 20   in a completed 
53f0: 70 61 72 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  parse..*/.static
5400: 20 69 6e 74 20 6a 73 6f 6e 50 61 72 73 65 46 69   int jsonParseFi
5410: 6e 64 50 61 72 65 6e 74 73 28 4a 73 6f 6e 50 61  ndParents(JsonPa
5420: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
5430: 75 33 32 20 2a 61 55 70 3b 0a 20 20 61 73 73 65  u32 *aUp;.  asse
5440: 72 74 28 20 70 50 61 72 73 65 2d 3e 61 55 70 3d  rt( pParse->aUp=
5450: 3d 30 20 29 3b 0a 20 20 61 55 70 20 3d 20 70 50  =0 );.  aUp = pP
5460: 61 72 73 65 2d 3e 61 55 70 20 3d 20 73 71 6c 69  arse->aUp = sqli
5470: 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  te3_malloc( size
5480: 6f 66 28 75 33 32 29 2a 70 50 61 72 73 65 2d 3e  of(u32)*pParse->
5490: 6e 4e 6f 64 65 20 29 3b 0a 20 20 69 66 28 20 61  nNode );.  if( a
54a0: 55 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  Up==0 ) return S
54b0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6a  QLITE_NOMEM;.  j
54c0: 73 6f 6e 50 61 72 73 65 46 69 6c 6c 49 6e 50 61  sonParseFillInPa
54d0: 72 65 6e 74 61 67 65 28 70 50 61 72 73 65 2c 20  rentage(pParse, 
54e0: 30 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  0, 0);.  return 
54f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
5500: 20 66 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   forward declara
5510: 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 4a  tion */.static J
5520: 73 6f 6e 4e 6f 64 65 20 2a 6a 73 6f 6e 4c 6f 6f  sonNode *jsonLoo
5530: 6b 75 70 41 70 70 65 6e 64 28 4a 73 6f 6e 50 61  kupAppend(JsonPa
5540: 72 73 65 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  rse*,const char*
5550: 2c 69 6e 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53  ,int*);../*.** S
5560: 65 61 72 63 68 20 61 6c 6f 6e 67 20 7a 50 61 74  earch along zPat
5570: 68 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 6f  h to find the no
5580: 64 65 20 73 70 65 63 69 66 69 65 64 2e 20 20 52  de specified.  R
5590: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a  eturn a pointer.
55a0: 2a 2a 20 74 6f 20 74 68 61 74 20 6e 6f 64 65 2c  ** to that node,
55b0: 20 6f 72 20 4e 55 4c 4c 20 69 66 20 7a 50 61 74   or NULL if zPat
55c0: 68 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 20 6f  h is malformed o
55d0: 72 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  r if there is no
55e0: 20 73 75 63 68 0a 2a 2a 20 6e 6f 64 65 2e 0a 2a   such.** node..*
55f0: 2a 0a 2a 2a 20 49 66 20 70 41 70 6e 64 21 3d 30  *.** If pApnd!=0
5600: 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20 61 70  , then try to ap
5610: 70 65 6e 64 20 6e 65 77 20 6e 6f 64 65 73 20 74  pend new nodes t
5620: 6f 20 63 6f 6d 70 6c 65 74 65 20 7a 50 61 74 68  o complete zPath
5630: 20 69 66 20 69 74 20 69 73 0a 2a 2a 20 70 6f 73   if it is.** pos
5640: 73 69 62 6c 65 20 74 6f 20 64 6f 20 73 6f 20 61  sible to do so a
5650: 6e 64 20 69 66 20 6e 6f 20 65 78 69 73 74 69 6e  nd if no existin
5660: 67 20 6e 6f 64 65 20 63 6f 72 72 65 73 70 6f 6e  g node correspon
5670: 64 73 20 74 6f 20 7a 50 61 74 68 2e 20 20 49 66  ds to zPath.  If
5680: 0a 2a 2a 20 6e 65 77 20 6e 6f 64 65 73 20 61 72  .** new nodes ar
5690: 65 20 61 70 70 65 6e 64 65 64 20 2a 70 41 70 6e  e appended *pApn
56a0: 64 20 69 73 20 73 65 74 20 74 6f 20 31 2e 0a 2a  d is set to 1..*
56b0: 2f 0a 73 74 61 74 69 63 20 4a 73 6f 6e 4e 6f 64  /.static JsonNod
56c0: 65 20 2a 6a 73 6f 6e 4c 6f 6f 6b 75 70 28 0a 20  e *jsonLookup(. 
56d0: 20 4a 73 6f 6e 50 61 72 73 65 20 2a 70 50 61 72   JsonParse *pPar
56e0: 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  se,      /* The 
56f0: 4a 53 4f 4e 20 74 6f 20 73 65 61 72 63 68 20 2a  JSON to search *
5700: 2f 0a 20 20 75 33 32 20 69 52 6f 6f 74 2c 20 20  /.  u32 iRoot,  
5710: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
5720: 65 67 69 6e 20 74 68 65 20 73 65 61 72 63 68 20  egin the search 
5730: 61 74 20 74 68 69 73 20 6e 6f 64 65 20 2a 2f 0a  at this node */.
5740: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
5750: 61 74 68 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ath,      /* The
5760: 20 70 61 74 68 20 74 6f 20 73 65 61 72 63 68 20   path to search 
5770: 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 70 6e 64 20  */.  int *pApnd 
5780: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5790: 41 70 70 65 6e 64 20 6e 6f 64 65 73 20 74 6f 20  Append nodes to 
57a0: 63 6f 6d 70 6c 65 74 65 20 70 61 74 68 20 69 66  complete path if
57b0: 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a   not NULL */.){.
57c0: 20 20 75 33 32 20 69 2c 20 6a 2c 20 6b 2c 20 6e    u32 i, j, k, n
57d0: 4b 65 79 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  Key;.  const cha
57e0: 72 20 2a 7a 4b 65 79 3b 0a 20 20 4a 73 6f 6e 4e  r *zKey;.  JsonN
57f0: 6f 64 65 20 2a 70 52 6f 6f 74 20 3d 20 26 70 50  ode *pRoot = &pP
5800: 61 72 73 65 2d 3e 61 4e 6f 64 65 5b 69 52 6f 6f  arse->aNode[iRoo
5810: 74 5d 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 5b  t];.  if( zPath[
5820: 30 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 70  0]==0 ) return p
5830: 52 6f 6f 74 3b 0a 20 20 69 66 28 20 7a 50 61 74  Root;.  if( zPat
5840: 68 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20  h[0]=='.' ){.   
5850: 20 69 66 28 20 70 52 6f 6f 74 2d 3e 65 54 79 70   if( pRoot->eTyp
5860: 65 21 3d 4a 53 4f 4e 5f 4f 42 4a 45 43 54 20 29  e!=JSON_OBJECT )
5870: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7a   return 0;.    z
5880: 50 61 74 68 2b 2b 3b 0a 20 20 20 20 69 66 28 20  Path++;.    if( 
5890: 7a 50 61 74 68 5b 30 5d 3d 3d 27 22 27 20 29 7b  zPath[0]=='"' ){
58a0: 0a 20 20 20 20 20 20 7a 4b 65 79 20 3d 20 7a 50  .      zKey = zP
58b0: 61 74 68 20 2b 20 31 3b 0a 20 20 20 20 20 20 66  ath + 1;.      f
58c0: 6f 72 28 69 3d 31 3b 20 7a 50 61 74 68 5b 69 5d  or(i=1; zPath[i]
58d0: 20 26 26 20 7a 50 61 74 68 5b 69 5d 21 3d 27 22   && zPath[i]!='"
58e0: 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  '; i++){}.      
58f0: 6e 4b 65 79 20 3d 20 69 2d 31 3b 0a 20 20 20 20  nKey = i-1;.    
5900: 20 20 69 66 28 20 7a 50 61 74 68 5b 69 5d 20 29    if( zPath[i] )
5910: 20 69 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   i++;.    }else{
5920: 0a 20 20 20 20 20 20 7a 4b 65 79 20 3d 20 7a 50  .      zKey = zP
5930: 61 74 68 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  ath;.      for(i
5940: 3d 30 3b 20 7a 50 61 74 68 5b 69 5d 20 26 26 20  =0; zPath[i] && 
5950: 7a 50 61 74 68 5b 69 5d 21 3d 27 2e 27 20 26 26  zPath[i]!='.' &&
5960: 20 7a 50 61 74 68 5b 69 5d 21 3d 27 5b 27 3b 20   zPath[i]!='['; 
5970: 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 6e 4b 65  i++){}.      nKe
5980: 79 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20  y = i;.    }.   
5990: 20 69 66 28 20 6e 4b 65 79 3d 3d 30 20 29 20 72   if( nKey==0 ) r
59a0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 6a 20 3d  eturn 0;.    j =
59b0: 20 31 3b 0a 20 20 20 20 66 6f 72 28 3b 3b 29 7b   1;.    for(;;){
59c0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3c  .      while( j<
59d0: 3d 70 52 6f 6f 74 2d 3e 6e 20 29 7b 0a 20 20 20  =pRoot->n ){.   
59e0: 20 20 20 20 20 69 66 28 20 70 52 6f 6f 74 5b 6a       if( pRoot[j
59f0: 5d 2e 6e 3d 3d 6e 4b 65 79 2b 32 0a 20 20 20 20  ].n==nKey+2.    
5a00: 20 20 20 20 20 26 26 20 73 74 72 6e 63 6d 70 28       && strncmp(
5a10: 26 70 52 6f 6f 74 5b 6a 5d 2e 75 2e 7a 4a 43 6f  &pRoot[j].u.zJCo
5a20: 6e 74 65 6e 74 5b 31 5d 2c 7a 4b 65 79 2c 6e 4b  ntent[1],zKey,nK
5a30: 65 79 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 29  ey)==0.        )
5a40: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
5a50: 72 6e 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 28 70 50  rn jsonLookup(pP
5a60: 61 72 73 65 2c 20 69 52 6f 6f 74 2b 6a 2b 31 2c  arse, iRoot+j+1,
5a70: 20 26 7a 50 61 74 68 5b 69 5d 2c 20 70 41 70 6e   &zPath[i], pApn
5a80: 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  d);.        }.  
5a90: 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
5aa0: 20 20 20 6a 20 2b 3d 20 6a 73 6f 6e 4e 6f 64 65     j += jsonNode
5ab0: 53 69 7a 65 28 26 70 52 6f 6f 74 5b 6a 5d 29 3b  Size(&pRoot[j]);
5ac0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
5ad0: 66 28 20 28 70 52 6f 6f 74 2d 3e 6a 6e 46 6c 61  f( (pRoot->jnFla
5ae0: 67 73 20 26 20 4a 4e 4f 44 45 5f 41 50 50 45 4e  gs & JNODE_APPEN
5af0: 44 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  D)==0 ) break;. 
5b00: 20 20 20 20 20 69 52 6f 6f 74 20 2b 3d 20 70 52       iRoot += pR
5b10: 6f 6f 74 2d 3e 75 2e 69 41 70 70 65 6e 64 3b 0a  oot->u.iAppend;.
5b20: 20 20 20 20 20 20 70 52 6f 6f 74 20 3d 20 26 70        pRoot = &p
5b30: 50 61 72 73 65 2d 3e 61 4e 6f 64 65 5b 69 52 6f  Parse->aNode[iRo
5b40: 6f 74 5d 3b 0a 20 20 20 20 20 20 6a 20 3d 20 31  ot];.      j = 1
5b50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
5b60: 70 41 70 6e 64 20 29 7b 0a 20 20 20 20 20 20 6b  pApnd ){.      k
5b70: 20 3d 20 6a 73 6f 6e 50 61 72 73 65 41 64 64 4e   = jsonParseAddN
5b80: 6f 64 65 28 70 50 61 72 73 65 2c 20 4a 53 4f 4e  ode(pParse, JSON
5b90: 5f 4f 42 4a 45 43 54 2c 20 32 2c 20 30 29 3b 0a  _OBJECT, 2, 0);.
5ba0: 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 75 2e 69        pRoot->u.i
5bb0: 41 70 70 65 6e 64 20 3d 20 6b 20 2d 20 69 52 6f  Append = k - iRo
5bc0: 6f 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d  ot;.      pRoot-
5bd0: 3e 6a 6e 46 6c 61 67 73 20 7c 3d 20 4a 4e 4f 44  >jnFlags |= JNOD
5be0: 45 5f 41 50 50 45 4e 44 3b 0a 20 20 20 20 20 20  E_APPEND;.      
5bf0: 6b 20 3d 20 6a 73 6f 6e 50 61 72 73 65 41 64 64  k = jsonParseAdd
5c00: 4e 6f 64 65 28 70 50 61 72 73 65 2c 20 4a 53 4f  Node(pParse, JSO
5c10: 4e 5f 53 54 52 49 4e 47 2c 20 69 2c 20 7a 50 61  N_STRING, i, zPa
5c20: 74 68 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  th);.      if( !
5c30: 70 50 61 72 73 65 2d 3e 6f 6f 6d 20 29 20 70 50  pParse->oom ) pP
5c40: 61 72 73 65 2d 3e 61 4e 6f 64 65 5b 6b 5d 2e 6a  arse->aNode[k].j
5c50: 6e 46 6c 61 67 73 20 7c 3d 20 4a 4e 4f 44 45 5f  nFlags |= JNODE_
5c60: 52 41 57 3b 0a 20 20 20 20 20 20 7a 50 61 74 68  RAW;.      zPath
5c70: 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20 72 65 74   += i;.      ret
5c80: 75 72 6e 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 41 70  urn jsonLookupAp
5c90: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 7a 50 61  pend(pParse, zPa
5ca0: 74 68 2c 20 70 41 70 6e 64 29 3b 0a 20 20 20 20  th, pApnd);.    
5cb0: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 50  }.  }else if( zP
5cc0: 61 74 68 5b 30 5d 3d 3d 27 5b 27 20 26 26 20 69  ath[0]=='[' && i
5cd0: 73 64 69 67 69 74 28 7a 50 61 74 68 5b 31 5d 29  sdigit(zPath[1])
5ce0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 52 6f 6f   ){.    if( pRoo
5cf0: 74 2d 3e 65 54 79 70 65 21 3d 4a 53 4f 4e 5f 41  t->eType!=JSON_A
5d00: 52 52 41 59 20 29 20 72 65 74 75 72 6e 20 30 3b  RRAY ) return 0;
5d10: 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 20 20  .    i = 0;.    
5d20: 7a 50 61 74 68 2b 2b 3b 0a 20 20 20 20 77 68 69  zPath++;.    whi
5d30: 6c 65 28 20 69 73 64 69 67 69 74 28 7a 50 61 74  le( isdigit(zPat
5d40: 68 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 69  h[0]) ){.      i
5d50: 20 3d 20 69 20 2b 20 7a 50 61 74 68 5b 30 5d 20   = i + zPath[0] 
5d60: 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 7a 50 61  - '0';.      zPa
5d70: 74 68 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  th++;.    }.    
5d80: 69 66 28 20 7a 50 61 74 68 5b 30 5d 21 3d 27 5d  if( zPath[0]!=']
5d90: 27 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ' ) return 0;.  
5da0: 20 20 7a 50 61 74 68 2b 2b 3b 0a 20 20 20 20 6a    zPath++;.    j
5db0: 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 3b 3b   = 1;.    for(;;
5dc0: 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  ){.      while( 
5dd0: 69 3e 30 20 26 26 20 6a 3c 3d 70 52 6f 6f 74 2d  i>0 && j<=pRoot-
5de0: 3e 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 20  >n ){.        j 
5df0: 2b 3d 20 6a 73 6f 6e 4e 6f 64 65 53 69 7a 65 28  += jsonNodeSize(
5e00: 26 70 52 6f 6f 74 5b 6a 5d 29 3b 0a 20 20 20 20  &pRoot[j]);.    
5e10: 20 20 20 20 69 2d 2d 3b 0a 20 20 20 20 20 20 7d      i--;.      }
5e20: 0a 20 20 20 20 20 20 69 66 28 20 28 70 52 6f 6f  .      if( (pRoo
5e30: 74 2d 3e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f  t->jnFlags & JNO
5e40: 44 45 5f 41 50 50 45 4e 44 29 3d 3d 30 20 29 20  DE_APPEND)==0 ) 
5e50: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 52 6f  break;.      iRo
5e60: 6f 74 20 2b 3d 20 70 52 6f 6f 74 2d 3e 75 2e 69  ot += pRoot->u.i
5e70: 41 70 70 65 6e 64 3b 0a 20 20 20 20 20 20 70 52  Append;.      pR
5e80: 6f 6f 74 20 3d 20 26 70 50 61 72 73 65 2d 3e 61  oot = &pParse->a
5e90: 4e 6f 64 65 5b 69 52 6f 6f 74 5d 3b 0a 20 20 20  Node[iRoot];.   
5ea0: 20 20 20 6a 20 3d 20 31 3b 0a 20 20 20 20 7d 0a     j = 1;.    }.
5eb0: 20 20 20 20 69 66 28 20 6a 3c 3d 70 52 6f 6f 74      if( j<=pRoot
5ec0: 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ->n ){.      ret
5ed0: 75 72 6e 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 28 70  urn jsonLookup(p
5ee0: 50 61 72 73 65 2c 20 69 52 6f 6f 74 2b 6a 2c 20  Parse, iRoot+j, 
5ef0: 7a 50 61 74 68 2c 20 70 41 70 6e 64 29 3b 0a 20  zPath, pApnd);. 
5f00: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d     }.    if( i==
5f10: 30 20 26 26 20 70 41 70 6e 64 20 29 7b 0a 20 20  0 && pApnd ){.  
5f20: 20 20 20 20 6b 20 3d 20 6a 73 6f 6e 50 61 72 73      k = jsonPars
5f30: 65 41 64 64 4e 6f 64 65 28 70 50 61 72 73 65 2c  eAddNode(pParse,
5f40: 20 4a 53 4f 4e 5f 41 52 52 41 59 2c 20 31 2c 20   JSON_ARRAY, 1, 
5f50: 30 29 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d  0);.      pRoot-
5f60: 3e 75 2e 69 41 70 70 65 6e 64 20 3d 20 6b 20 2d  >u.iAppend = k -
5f70: 20 69 52 6f 6f 74 3b 0a 20 20 20 20 20 20 70 52   iRoot;.      pR
5f80: 6f 6f 74 2d 3e 6a 6e 46 6c 61 67 73 20 7c 3d 20  oot->jnFlags |= 
5f90: 4a 4e 4f 44 45 5f 41 50 50 45 4e 44 3b 0a 20 20  JNODE_APPEND;.  
5fa0: 20 20 20 20 72 65 74 75 72 6e 20 6a 73 6f 6e 4c      return jsonL
5fb0: 6f 6f 6b 75 70 41 70 70 65 6e 64 28 70 50 61 72  ookupAppend(pPar
5fc0: 73 65 2c 20 7a 50 61 74 68 2c 20 70 41 70 6e 64  se, zPath, pApnd
5fd0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
5fe0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
5ff0: 2a 20 41 70 70 65 6e 64 20 63 6f 6e 74 65 6e 74  * Append content
6000: 20 74 6f 20 70 50 61 72 73 65 20 74 68 61 74 20   to pParse that 
6010: 77 69 6c 6c 20 63 6f 6d 70 6c 65 74 65 20 7a 50  will complete zP
6020: 61 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4a  ath..*/.static J
6030: 73 6f 6e 4e 6f 64 65 20 2a 6a 73 6f 6e 4c 6f 6f  sonNode *jsonLoo
6040: 6b 75 70 41 70 70 65 6e 64 28 0a 20 20 4a 73 6f  kupAppend(.  Jso
6050: 6e 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  nParse *pParse, 
6060: 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 63 6f      /* Append co
6070: 6e 74 65 6e 74 20 74 6f 20 74 68 65 20 4a 53 4f  ntent to the JSO
6080: 4e 20 70 61 72 73 65 20 2a 2f 0a 20 20 63 6f 6e  N parse */.  con
6090: 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
60a0: 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69      /* Descripti
60b0: 6f 6e 20 6f 66 20 63 6f 6e 74 65 6e 74 20 74 6f  on of content to
60c0: 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 69 6e 74   append */.  int
60d0: 20 2a 70 41 70 6e 64 20 20 20 20 20 20 20 20 20   *pApnd         
60e0: 20 20 20 20 2f 2a 20 53 65 74 20 74 68 69 73 20      /* Set this 
60f0: 66 6c 61 67 20 74 6f 20 31 20 2a 2f 0a 29 7b 0a  flag to 1 */.){.
6100: 20 20 2a 70 41 70 6e 64 20 3d 20 31 3b 0a 20 20    *pApnd = 1;.  
6110: 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 30 20  if( zPath[0]==0 
6120: 29 7b 0a 20 20 20 20 6a 73 6f 6e 50 61 72 73 65  ){.    jsonParse
6130: 41 64 64 4e 6f 64 65 28 70 50 61 72 73 65 2c 20  AddNode(pParse, 
6140: 4a 53 4f 4e 5f 4e 55 4c 4c 2c 20 30 2c 20 30 29  JSON_NULL, 0, 0)
6150: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61  ;.    return pPa
6160: 72 73 65 2d 3e 6f 6f 6d 20 3f 20 30 20 3a 20 26  rse->oom ? 0 : &
6170: 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65 5b 70 50  pParse->aNode[pP
6180: 61 72 73 65 2d 3e 6e 4e 6f 64 65 2d 31 5d 3b 0a  arse->nNode-1];.
6190: 20 20 7d 0a 20 20 69 66 28 20 7a 50 61 74 68 5b    }.  if( zPath[
61a0: 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 6a  0]=='.' ){.    j
61b0: 73 6f 6e 50 61 72 73 65 41 64 64 4e 6f 64 65 28  sonParseAddNode(
61c0: 70 50 61 72 73 65 2c 20 4a 53 4f 4e 5f 4f 42 4a  pParse, JSON_OBJ
61d0: 45 43 54 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 65  ECT, 0, 0);.  }e
61e0: 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28  lse if( strncmp(
61f0: 7a 50 61 74 68 2c 22 5b 30 5d 22 2c 33 29 3d 3d  zPath,"[0]",3)==
6200: 30 20 29 7b 0a 20 20 20 20 6a 73 6f 6e 50 61 72  0 ){.    jsonPar
6210: 73 65 41 64 64 4e 6f 64 65 28 70 50 61 72 73 65  seAddNode(pParse
6220: 2c 20 4a 53 4f 4e 5f 41 52 52 41 59 2c 20 30 2c  , JSON_ARRAY, 0,
6230: 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
6240: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
6250: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6f 6f    if( pParse->oo
6260: 6d 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  m ) return 0;.  
6270: 72 65 74 75 72 6e 20 6a 73 6f 6e 4c 6f 6f 6b 75  return jsonLooku
6280: 70 28 70 50 61 72 73 65 2c 20 70 50 61 72 73 65  p(pParse, pParse
6290: 2d 3e 6e 4e 6f 64 65 2d 31 2c 20 7a 50 61 74 68  ->nNode-1, zPath
62a0: 2c 20 70 41 70 6e 64 29 3b 0a 7d 0a 0a 0a 2f 2a  , pApnd);.}.../*
62b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
62c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
62d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
62e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
62f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 53  ***********.** S
6300: 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65  QL functions use
6310: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
6320: 64 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a 2a 2a  d debugging.****
6330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6370: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66 64 65  ********/..#ifde
6380: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
6390: 2a 0a 2a 2a 20 54 68 65 20 6a 73 6f 6e 5f 70 61  *.** The json_pa
63a0: 72 73 65 28 4a 53 4f 4e 29 20 66 75 6e 63 74 69  rse(JSON) functi
63b0: 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 73 74 72  on returns a str
63c0: 69 6e 67 20 77 68 69 63 68 20 64 65 73 63 72 69  ing which descri
63d0: 62 65 73 0a 2a 2a 20 61 20 70 61 72 73 65 20 6f  bes.** a parse o
63e0: 66 20 74 68 65 20 4a 53 4f 4e 20 70 72 6f 76 69  f the JSON provi
63f0: 64 65 64 2e 20 20 4f 72 20 69 74 20 72 65 74 75  ded.  Or it retu
6400: 72 6e 73 20 4e 55 4c 4c 20 69 66 20 4a 53 4f 4e  rns NULL if JSON
6410: 20 69 73 20 6e 6f 74 0a 2a 2a 20 77 65 6c 6c 2d   is not.** well-
6420: 66 6f 72 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  formed..*/.stati
6430: 63 20 76 6f 69 64 20 6a 73 6f 6e 50 61 72 73 65  c void jsonParse
6440: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
6450: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
6460: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
6470: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
6480: 61 72 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e 53 74  argv.){.  JsonSt
6490: 72 69 6e 67 20 73 3b 20 20 20 20 20 20 20 2f 2a  ring s;       /*
64a0: 20 4f 75 74 70 75 74 20 73 74 72 69 6e 67 20 2d   Output string -
64b0: 20 6e 6f 74 20 72 65 61 6c 20 4a 53 4f 4e 20 2a   not real JSON *
64c0: 2f 0a 20 20 4a 73 6f 6e 50 61 72 73 65 20 78 3b  /.  JsonParse x;
64d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
64e0: 61 72 73 65 20 2a 2f 0a 20 20 75 33 32 20 69 3b  arse */.  u32 i;
64f0: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30  .  char zBuf[100
6500: 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 72  ];..  assert( ar
6510: 67 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 6a  gc==1 );.  if( j
6520: 73 6f 6e 50 61 72 73 65 28 26 78 2c 20 28 63 6f  sonParse(&x, (co
6530: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
6540: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
6550: 76 5b 30 5d 29 29 20 29 20 72 65 74 75 72 6e 3b  v[0])) ) return;
6560: 0a 20 20 6a 73 6f 6e 49 6e 69 74 28 26 73 2c 20  .  jsonInit(&s, 
6570: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 66 6f 72 28  context);.  for(
6580: 69 3d 30 3b 20 69 3c 78 2e 6e 4e 6f 64 65 3b 20  i=0; i<x.nNode; 
6590: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
65a0: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
65b0: 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22  f(zBuf), zBuf, "
65c0: 6e 6f 64 65 20 25 33 75 3a 20 25 37 73 20 6e 3d  node %3u: %7s n=
65d0: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
65e0: 20 20 20 20 20 20 20 20 20 20 20 20 69 2c 20 6a              i, j
65f0: 73 6f 6e 54 79 70 65 5b 78 2e 61 4e 6f 64 65 5b  sonType[x.aNode[
6600: 69 5d 2e 65 54 79 70 65 5d 2c 20 78 2e 61 4e 6f  i].eType], x.aNo
6610: 64 65 5b 69 5d 2e 6e 29 3b 0a 20 20 20 20 6a 73  de[i].n);.    js
6620: 6f 6e 41 70 70 65 6e 64 28 26 73 2c 20 7a 42 75  onAppend(&s, zBu
6630: 66 29 3b 0a 20 20 20 20 69 66 28 20 78 2e 61 4e  f);.    if( x.aN
6640: 6f 64 65 5b 69 5d 2e 75 2e 7a 4a 43 6f 6e 74 65  ode[i].u.zJConte
6650: 6e 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 6a  nt!=0 ){.      j
6660: 73 6f 6e 41 70 70 65 6e 64 52 61 77 28 26 73 2c  sonAppendRaw(&s,
6670: 20 22 20 20 20 20 74 65 78 74 3a 20 22 2c 20 31   "    text: ", 1
6680: 30 29 3b 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70  0);.      jsonAp
6690: 70 65 6e 64 52 61 77 28 26 73 2c 20 78 2e 61 4e  pendRaw(&s, x.aN
66a0: 6f 64 65 5b 69 5d 2e 75 2e 7a 4a 43 6f 6e 74 65  ode[i].u.zJConte
66b0: 6e 74 2c 20 78 2e 61 4e 6f 64 65 5b 69 5d 2e 6e  nt, x.aNode[i].n
66c0: 29 3b 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70 70  );.      jsonApp
66d0: 65 6e 64 52 61 77 28 26 73 2c 20 22 5c 6e 22 2c  endRaw(&s, "\n",
66e0: 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   1);.    }.  }. 
66f0: 20 6a 73 6f 6e 50 61 72 73 65 52 65 73 65 74 28   jsonParseReset(
6700: 26 78 29 3b 0a 20 20 6a 73 6f 6e 52 65 73 75 6c  &x);.  jsonResul
6710: 74 28 26 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t(&s);.}../*.** 
6720: 54 68 65 20 6a 73 6f 6e 5f 74 65 73 74 31 28 4a  The json_test1(J
6730: 53 4f 4e 29 20 66 75 6e 63 74 69 6f 6e 20 70 61  SON) function pa
6740: 72 73 65 73 20 61 6e 64 20 72 65 62 75 69 6c 64  rses and rebuild
6750: 73 20 74 68 65 20 4a 53 4f 4e 20 73 74 72 69 6e  s the JSON strin
6760: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
6770: 64 20 6a 73 6f 6e 54 65 73 74 31 46 75 6e 63 28  d jsonTest1Func(
6780: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
6790: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
67a0: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
67b0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
67c0: 29 7b 0a 20 20 4a 73 6f 6e 50 61 72 73 65 20 78  ){.  JsonParse x
67d0: 3b 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 20  ;  /* The parse 
67e0: 2a 2f 0a 20 20 69 66 28 20 6a 73 6f 6e 50 61 72  */.  if( jsonPar
67f0: 73 65 28 26 78 2c 20 28 63 6f 6e 73 74 20 63 68  se(&x, (const ch
6800: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
6810: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 29  e_text(argv[0]))
6820: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6a 73 6f   ) return;.  jso
6830: 6e 52 65 74 75 72 6e 28 78 2e 61 4e 6f 64 65 2c  nReturn(x.aNode,
6840: 20 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20   context, 0);.  
6850: 6a 73 6f 6e 50 61 72 73 65 52 65 73 65 74 28 26  jsonParseReset(&
6860: 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  x);.}../*.** The
6870: 20 6a 73 6f 6e 5f 6e 6f 64 65 63 6f 75 6e 74 28   json_nodecount(
6880: 4a 53 4f 4e 29 20 66 75 6e 63 74 69 6f 6e 20 72  JSON) function r
6890: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
68a0: 72 20 6f 66 20 6e 6f 64 65 73 20 69 6e 20 74 68  r of nodes in th
68b0: 65 0a 2a 2a 20 69 6e 70 75 74 20 4a 53 4f 4e 20  e.** input JSON 
68c0: 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  string..*/.stati
68d0: 63 20 76 6f 69 64 20 6a 73 6f 6e 4e 6f 64 65 43  c void jsonNodeC
68e0: 6f 75 6e 74 46 75 6e 63 28 0a 20 20 73 71 6c 69  ountFunc(.  sqli
68f0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
6900: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
6910: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
6920: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 4a 73  e **argv.){.  Js
6930: 6f 6e 50 61 72 73 65 20 78 3b 20 20 2f 2a 20 54  onParse x;  /* T
6940: 68 65 20 70 61 72 73 65 20 2a 2f 0a 20 20 69 66  he parse */.  if
6950: 28 20 6a 73 6f 6e 50 61 72 73 65 28 26 78 2c 20  ( jsonParse(&x, 
6960: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
6970: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
6980: 61 72 67 76 5b 30 5d 29 29 20 29 20 72 65 74 75  argv[0])) ) retu
6990: 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  rn;.  sqlite3_re
69a0: 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65  sult_int64(conte
69b0: 78 74 2c 20 78 2e 6e 4e 6f 64 65 29 3b 0a 20 20  xt, x.nNode);.  
69c0: 6a 73 6f 6e 50 61 72 73 65 52 65 73 65 74 28 26  jsonParseReset(&
69d0: 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  x);.}.#endif /* 
69e0: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a  SQLITE_DEBUG */.
69f0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
6a00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
6a40: 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 69  * SQL function i
6a50: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a  mplementations.*
6a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6a70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
6ab0: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
6ac0: 6f 6e 20 6f 66 20 74 68 65 20 6a 73 6f 6e 5f 61  on of the json_a
6ad0: 72 72 61 79 28 56 41 4c 55 45 2c 2e 2e 2e 29 20  rray(VALUE,...) 
6ae0: 66 75 6e 63 74 69 6f 6e 2e 20 20 52 65 74 75 72  function.  Retur
6af0: 6e 20 61 20 4a 53 4f 4e 0a 2a 2a 20 61 72 72 61  n a JSON.** arra
6b00: 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  y that contains 
6b10: 61 6c 6c 20 76 61 6c 75 65 73 20 67 69 76 65 6e  all values given
6b20: 20 69 6e 20 61 72 67 75 6d 65 6e 74 73 2e 20 20   in arguments.  
6b30: 4f 72 20 69 66 20 61 6e 79 20 61 72 67 75 6d 65  Or if any argume
6b40: 6e 74 0a 2a 2a 20 69 73 20 61 20 42 4c 4f 42 2c  nt.** is a BLOB,
6b50: 20 74 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 2e   throw an error.
6b60: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6b70: 6a 73 6f 6e 41 72 72 61 79 46 75 6e 63 28 0a 20  jsonArrayFunc(. 
6b80: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
6b90: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
6ba0: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
6bb0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
6bc0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4a 73 6f 6e  .  int i;.  Json
6bd0: 53 74 72 69 6e 67 20 6a 78 3b 0a 0a 20 20 6a 73  String jx;..  js
6be0: 6f 6e 49 6e 69 74 28 26 6a 78 2c 20 63 6f 6e 74  onInit(&jx, cont
6bf0: 65 78 74 29 3b 0a 20 20 6a 73 6f 6e 41 70 70 65  ext);.  jsonAppe
6c00: 6e 64 43 68 61 72 28 26 6a 78 2c 20 27 5b 27 29  ndChar(&jx, '[')
6c10: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61  ;.  for(i=0; i<a
6c20: 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6a  rgc; i++){.    j
6c30: 73 6f 6e 41 70 70 65 6e 64 53 65 70 61 72 61 74  sonAppendSeparat
6c40: 6f 72 28 26 6a 78 29 3b 0a 20 20 20 20 6a 73 6f  or(&jx);.    jso
6c50: 6e 41 70 70 65 6e 64 56 61 6c 75 65 28 26 6a 78  nAppendValue(&jx
6c60: 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20 7d 0a  , argv[i]);.  }.
6c70: 20 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61 72    jsonAppendChar
6c80: 28 26 6a 78 2c 20 27 5d 27 29 3b 0a 20 20 6a 73  (&jx, ']');.  js
6c90: 6f 6e 52 65 73 75 6c 74 28 26 6a 78 29 3b 0a 7d  onResult(&jx);.}
6ca0: 0a 0a 0a 2f 2a 0a 2a 2a 20 6a 73 6f 6e 5f 61 72  .../*.** json_ar
6cb0: 72 61 79 5f 6c 65 6e 67 74 68 28 4a 53 4f 4e 29  ray_length(JSON)
6cc0: 0a 2a 2a 20 6a 73 6f 6e 5f 61 72 72 61 79 5f 6c  .** json_array_l
6cd0: 65 6e 67 74 68 28 4a 53 4f 4e 2c 20 50 41 54 48  ength(JSON, PATH
6ce0: 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ).**.** Return t
6cf0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  he number of ele
6d00: 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 74 6f 70  ments in the top
6d10: 2d 6c 65 76 65 6c 20 4a 53 4f 4e 20 61 72 72 61  -level JSON arra
6d20: 79 2e 20 20 0a 2a 2a 20 52 65 74 75 72 6e 20 30  y.  .** Return 0
6d30: 20 69 66 20 74 68 65 20 69 6e 70 75 74 20 69 73   if the input is
6d40: 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d   not a well-form
6d50: 65 64 20 4a 53 4f 4e 20 61 72 72 61 79 2e 0a 2a  ed JSON array..*
6d60: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73  /.static void js
6d70: 6f 6e 41 72 72 61 79 4c 65 6e 67 74 68 46 75 6e  onArrayLengthFun
6d80: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
6d90: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
6da0: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
6db0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
6dc0: 76 0a 29 7b 0a 20 20 4a 73 6f 6e 50 61 72 73 65  v.){.  JsonParse
6dd0: 20 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   x;          /* 
6de0: 54 68 65 20 70 61 72 73 65 20 2a 2f 0a 20 20 73  The parse */.  s
6df0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 20 3d  qlite3_int64 n =
6e00: 20 30 3b 0a 20 20 75 33 32 20 69 3b 0a 20 20 63   0;.  u32 i;.  c
6e10: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
6e20: 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 32  ;..  if( argc==2
6e30: 20 29 7b 0a 20 20 20 20 7a 50 61 74 68 20 3d 20   ){.    zPath = 
6e40: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
6e50: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
6e60: 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 69 66  argv[1]);.    if
6e70: 28 20 7a 50 61 74 68 3d 3d 30 20 29 20 72 65 74  ( zPath==0 ) ret
6e80: 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 7a 50 61  urn;.    if( zPa
6e90: 74 68 5b 30 5d 21 3d 27 24 27 20 29 20 72 65 74  th[0]!='$' ) ret
6ea0: 75 72 6e 3b 0a 20 20 20 20 7a 50 61 74 68 2b 2b  urn;.    zPath++
6eb0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
6ec0: 50 61 74 68 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Path = 0;.  }.  
6ed0: 69 66 28 20 6a 73 6f 6e 50 61 72 73 65 28 26 78  if( jsonParse(&x
6ee0: 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  , (const char*)s
6ef0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
6f00: 74 28 61 72 67 76 5b 30 5d 29 29 3d 3d 30 20 29  t(argv[0]))==0 )
6f10: 7b 0a 20 20 20 20 69 66 28 20 78 2e 6e 4e 6f 64  {.    if( x.nNod
6f20: 65 20 29 7b 0a 20 20 20 20 20 20 4a 73 6f 6e 4e  e ){.      JsonN
6f30: 6f 64 65 20 2a 70 4e 6f 64 65 20 3d 20 78 2e 61  ode *pNode = x.a
6f40: 4e 6f 64 65 3b 0a 20 20 20 20 20 20 69 66 28 20  Node;.      if( 
6f50: 7a 50 61 74 68 20 29 20 70 4e 6f 64 65 20 3d 20  zPath ) pNode = 
6f60: 6a 73 6f 6e 4c 6f 6f 6b 75 70 28 26 78 2c 20 30  jsonLookup(&x, 0
6f70: 2c 20 7a 50 61 74 68 2c 20 30 29 3b 0a 20 20 20  , zPath, 0);.   
6f80: 20 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 65 54     if( pNode->eT
6f90: 79 70 65 3d 3d 4a 53 4f 4e 5f 41 52 52 41 59 20  ype==JSON_ARRAY 
6fa0: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
6fb0: 74 28 20 28 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61  t( (pNode->jnFla
6fc0: 67 73 20 26 20 4a 4e 4f 44 45 5f 41 50 50 45 4e  gs & JNODE_APPEN
6fd0: 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  D)==0 );.       
6fe0: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 4e 6f   for(i=1; i<=pNo
6ff0: 64 65 2d 3e 6e 3b 20 6e 2b 2b 29 7b 0a 20 20 20  de->n; n++){.   
7000: 20 20 20 20 20 20 20 69 20 2b 3d 20 6a 73 6f 6e         i += json
7010: 4e 6f 64 65 53 69 7a 65 28 26 70 4e 6f 64 65 5b  NodeSize(&pNode[
7020: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i]);.        }. 
7030: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
7040: 20 6a 73 6f 6e 50 61 72 73 65 52 65 73 65 74 28   jsonParseReset(
7050: 26 78 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  &x);.  }.  sqlit
7060: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28  e3_result_int64(
7070: 63 6f 6e 74 65 78 74 2c 20 6e 29 3b 0a 7d 0a 0a  context, n);.}..
7080: 2f 2a 0a 2a 2a 20 6a 73 6f 6e 5f 65 78 74 72 61  /*.** json_extra
7090: 63 74 28 4a 53 4f 4e 2c 20 50 41 54 48 29 0a 2a  ct(JSON, PATH).*
70a0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
70b0: 65 6c 65 6d 65 6e 74 20 64 65 73 63 72 69 62 65  element describe
70c0: 64 20 62 79 20 50 41 54 48 2e 20 20 52 65 74 75  d by PATH.  Retu
70d0: 72 6e 20 4e 55 4c 4c 20 69 66 20 4a 53 4f 4e 20  rn NULL if JSON 
70e0: 69 73 20 6e 6f 74 0a 2a 2a 20 76 61 6c 69 64 20  is not.** valid 
70f0: 4a 53 4f 4e 20 6f 72 20 69 66 20 74 68 65 72 65  JSON or if there
7100: 20 69 73 20 6e 6f 20 50 41 54 48 20 65 6c 65 6d   is no PATH elem
7110: 65 6e 74 20 6f 72 20 69 66 20 50 41 54 48 20 69  ent or if PATH i
7120: 73 20 6d 61 6c 66 6f 72 6d 65 64 2e 0a 2a 2f 0a  s malformed..*/.
7130: 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e  static void json
7140: 45 78 74 72 61 63 74 46 75 6e 63 28 0a 20 20 73  ExtractFunc(.  s
7150: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
7160: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
7170: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
7180: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
7190: 20 4a 73 6f 6e 50 61 72 73 65 20 78 3b 20 20 20   JsonParse x;   
71a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
71b0: 72 73 65 20 2a 2f 0a 20 20 4a 73 6f 6e 4e 6f 64  rse */.  JsonNod
71c0: 65 20 2a 70 4e 6f 64 65 3b 0a 20 20 63 6f 6e 73  e *pNode;.  cons
71d0: 74 20 63 68 61 72 20 2a 7a 50 61 74 68 3b 0a 20  t char *zPath;. 
71e0: 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 32   assert( argc==2
71f0: 20 29 3b 0a 20 20 7a 50 61 74 68 20 3d 20 28 63   );.  zPath = (c
7200: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
7210: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
7220: 67 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20 7a 50  gv[1]);.  if( zP
7230: 61 74 68 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ath==0 ) return;
7240: 0a 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d 21  .  if( zPath[0]!
7250: 3d 27 24 27 20 29 20 72 65 74 75 72 6e 3b 0a 20  ='$' ) return;. 
7260: 20 7a 50 61 74 68 2b 2b 3b 0a 20 20 69 66 28 20   zPath++;.  if( 
7270: 6a 73 6f 6e 50 61 72 73 65 28 26 78 2c 20 28 63  jsonParse(&x, (c
7280: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
7290: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
72a0: 67 76 5b 30 5d 29 29 20 29 20 72 65 74 75 72 6e  gv[0])) ) return
72b0: 3b 0a 20 20 70 4e 6f 64 65 20 3d 20 6a 73 6f 6e  ;.  pNode = json
72c0: 4c 6f 6f 6b 75 70 28 26 78 2c 20 30 2c 20 7a 50  Lookup(&x, 0, zP
72d0: 61 74 68 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  ath, 0);.  if( p
72e0: 4e 6f 64 65 20 29 7b 0a 20 20 20 20 6a 73 6f 6e  Node ){.    json
72f0: 52 65 74 75 72 6e 28 70 4e 6f 64 65 2c 20 63 6f  Return(pNode, co
7300: 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 7d 0a 20  ntext, 0);.  }. 
7310: 20 6a 73 6f 6e 50 61 72 73 65 52 65 73 65 74 28   jsonParseReset(
7320: 26 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  &x);.}../*.** Im
7330: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
7340: 74 68 65 20 6a 73 6f 6e 5f 6f 62 6a 65 63 74 28  the json_object(
7350: 4e 41 4d 45 2c 56 41 4c 55 45 2c 2e 2e 2e 29 20  NAME,VALUE,...) 
7360: 66 75 6e 63 74 69 6f 6e 2e 20 20 52 65 74 75 72  function.  Retur
7370: 6e 20 61 20 4a 53 4f 4e 0a 2a 2a 20 6f 62 6a 65  n a JSON.** obje
7380: 63 74 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ct that contains
7390: 20 61 6c 6c 20 6e 61 6d 65 2f 76 61 6c 75 65 20   all name/value 
73a0: 67 69 76 65 6e 20 69 6e 20 61 72 67 75 6d 65 6e  given in argumen
73b0: 74 73 2e 20 20 4f 72 20 69 66 20 61 6e 79 20 6e  ts.  Or if any n
73c0: 61 6d 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 20  ame.** is not a 
73d0: 73 74 72 69 6e 67 20 6f 72 20 69 66 20 61 6e 79  string or if any
73e0: 20 76 61 6c 75 65 20 69 73 20 61 20 42 4c 4f 42   value is a BLOB
73f0: 2c 20 74 68 72 6f 77 20 61 6e 20 65 72 72 6f 72  , throw an error
7400: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7410: 20 6a 73 6f 6e 4f 62 6a 65 63 74 46 75 6e 63 28   jsonObjectFunc(
7420: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
7430: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
7440: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
7450: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
7460: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4a 73  ){.  int i;.  Js
7470: 6f 6e 53 74 72 69 6e 67 20 6a 78 3b 0a 20 20 63  onString jx;.  c
7480: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
7490: 75 33 32 20 6e 3b 0a 0a 20 20 69 66 28 20 61 72  u32 n;..  if( ar
74a0: 67 63 26 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  gc&1 ){.    sqli
74b0: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
74c0: 28 63 6f 6e 74 65 78 74 2c 20 22 6a 73 6f 6e 5f  (context, "json_
74d0: 6f 62 6a 65 63 74 28 29 20 72 65 71 75 69 72 65  object() require
74e0: 73 20 61 6e 20 65 76 65 6e 20 6e 75 6d 62 65 72  s an even number
74f0: 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
7500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7510: 20 20 20 20 20 22 6f 66 20 61 72 67 75 6d 65 6e       "of argumen
7520: 74 73 22 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65  ts", -1);.    re
7530: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6a 73 6f 6e  turn;.  }.  json
7540: 49 6e 69 74 28 26 6a 78 2c 20 63 6f 6e 74 65 78  Init(&jx, contex
7550: 74 29 3b 0a 20 20 6a 73 6f 6e 41 70 70 65 6e 64  t);.  jsonAppend
7560: 43 68 61 72 28 26 6a 78 2c 20 27 7b 27 29 3b 0a  Char(&jx, '{');.
7570: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67    for(i=0; i<arg
7580: 63 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 69 66  c; i+=2){.    if
7590: 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
75a0: 74 79 70 65 28 61 72 67 76 5b 69 5d 29 21 3d 53  type(argv[i])!=S
75b0: 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20  QLITE_TEXT ){.  
75c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
75d0: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
75e0: 2c 20 22 6a 73 6f 6e 5f 6f 62 6a 65 63 74 28 29  , "json_object()
75f0: 20 6c 61 62 65 6c 73 20 6d 75 73 74 20 62 65 20   labels must be 
7600: 54 45 58 54 22 2c 20 2d 31 29 3b 0a 20 20 20 20  TEXT", -1);.    
7610: 20 20 6a 73 6f 6e 5a 65 72 6f 28 26 6a 78 29 3b    jsonZero(&jx);
7620: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
7630: 20 20 20 7d 0a 20 20 20 20 6a 73 6f 6e 41 70 70     }.    jsonApp
7640: 65 6e 64 53 65 70 61 72 61 74 6f 72 28 26 6a 78  endSeparator(&jx
7650: 29 3b 0a 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73  );.    z = (cons
7660: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
7670: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
7680: 69 5d 29 3b 0a 20 20 20 20 6e 20 3d 20 28 75 33  i]);.    n = (u3
7690: 32 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  2)sqlite3_value_
76a0: 62 79 74 65 73 28 61 72 67 76 5b 69 5d 29 3b 0a  bytes(argv[i]);.
76b0: 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 53 74      jsonAppendSt
76c0: 72 69 6e 67 28 26 6a 78 2c 20 7a 2c 20 6e 29 3b  ring(&jx, z, n);
76d0: 0a 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 43  .    jsonAppendC
76e0: 68 61 72 28 26 6a 78 2c 20 27 3a 27 29 3b 0a 20  har(&jx, ':');. 
76f0: 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 56 61 6c     jsonAppendVal
7700: 75 65 28 26 6a 78 2c 20 61 72 67 76 5b 69 2b 31  ue(&jx, argv[i+1
7710: 5d 29 3b 0a 20 20 7d 0a 20 20 6a 73 6f 6e 41 70  ]);.  }.  jsonAp
7720: 70 65 6e 64 43 68 61 72 28 26 6a 78 2c 20 27 7d  pendChar(&jx, '}
7730: 27 29 3b 0a 20 20 6a 73 6f 6e 52 65 73 75 6c 74  ');.  jsonResult
7740: 28 26 6a 78 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  (&jx);.}.../*.**
7750: 20 6a 73 6f 6e 5f 72 65 6d 6f 76 65 28 4a 53 4f   json_remove(JSO
7760: 4e 2c 20 50 41 54 48 2c 20 2e 2e 2e 29 0a 2a 2a  N, PATH, ...).**
7770: 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6e  .** Remove the n
7780: 61 6d 65 64 20 65 6c 65 6d 65 6e 74 73 20 66 72  amed elements fr
7790: 6f 6d 20 4a 53 4f 4e 20 61 6e 64 20 72 65 74 75  om JSON and retu
77a0: 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 20 20  rn the result.  
77b0: 49 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 50 41  Ill-formed.** PA
77c0: 54 48 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  TH arguments are
77d0: 20 73 69 6c 65 6e 74 6c 79 20 69 67 6e 6f 72 65   silently ignore
77e0: 64 2e 20 20 49 66 20 4a 53 4f 4e 20 69 73 20 69  d.  If JSON is i
77f0: 6c 6c 2d 66 6f 72 6d 65 64 2c 20 74 68 65 6e 20  ll-formed, then 
7800: 4e 55 4c 4c 0a 2a 2a 20 69 73 20 72 65 74 75 72  NULL.** is retur
7810: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ned..*/.static v
7820: 6f 69 64 20 6a 73 6f 6e 52 65 6d 6f 76 65 46 75  oid jsonRemoveFu
7830: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
7840: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
7850: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
7860: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
7870: 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e 50 61 72 73  gv.){.  JsonPars
7880: 65 20 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  e x;          /*
7890: 20 54 68 65 20 70 61 72 73 65 20 2a 2f 0a 20 20   The parse */.  
78a0: 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 3b  JsonNode *pNode;
78b0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
78c0: 50 61 74 68 3b 0a 20 20 75 33 32 20 69 3b 0a 0a  Path;.  u32 i;..
78d0: 20 20 69 66 28 20 61 72 67 63 3c 31 20 29 20 72    if( argc<1 ) r
78e0: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6a 73 6f  eturn;.  if( jso
78f0: 6e 50 61 72 73 65 28 26 78 2c 20 28 63 6f 6e 73  nParse(&x, (cons
7900: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
7910: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
7920: 30 5d 29 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  0])) ) return;. 
7930: 20 69 66 28 20 78 2e 6e 4e 6f 64 65 20 29 7b 0a   if( x.nNode ){.
7940: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 61      for(i=1; i<a
7950: 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rgc; i++){.     
7960: 20 7a 50 61 74 68 20 3d 20 28 63 6f 6e 73 74 20   zPath = (const 
7970: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
7980: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 69 5d  lue_text(argv[i]
7990: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 61  );.      if( zPa
79a0: 74 68 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  th==0 ) continue
79b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 61 74  ;.      if( zPat
79c0: 68 5b 30 5d 21 3d 27 24 27 20 29 20 63 6f 6e 74  h[0]!='$' ) cont
79d0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4e 6f 64  inue;.      pNod
79e0: 65 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 28 26  e = jsonLookup(&
79f0: 78 2c 20 30 2c 20 26 7a 50 61 74 68 5b 31 5d 2c  x, 0, &zPath[1],
7a00: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
7a10: 4e 6f 64 65 20 29 20 70 4e 6f 64 65 2d 3e 6a 6e  Node ) pNode->jn
7a20: 46 6c 61 67 73 20 7c 3d 20 4a 4e 4f 44 45 5f 52  Flags |= JNODE_R
7a30: 45 4d 4f 56 45 3b 0a 20 20 20 20 7d 0a 20 20 20  EMOVE;.    }.   
7a40: 20 69 66 28 20 28 78 2e 61 4e 6f 64 65 5b 30 5d   if( (x.aNode[0]
7a50: 2e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45  .jnFlags & JNODE
7a60: 5f 52 45 4d 4f 56 45 29 3d 3d 30 20 29 7b 0a 20  _REMOVE)==0 ){. 
7a70: 20 20 20 20 20 6a 73 6f 6e 52 65 74 75 72 6e 28       jsonReturn(
7a80: 78 2e 61 4e 6f 64 65 2c 20 63 6f 6e 74 65 78 74  x.aNode, context
7a90: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
7aa0: 20 20 6a 73 6f 6e 50 61 72 73 65 52 65 73 65 74    jsonParseReset
7ab0: 28 26 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 6a  (&x);.}../*.** j
7ac0: 73 6f 6e 5f 72 65 70 6c 61 63 65 28 4a 53 4f 4e  son_replace(JSON
7ad0: 2c 20 50 41 54 48 2c 20 56 41 4c 55 45 2c 20 2e  , PATH, VALUE, .
7ae0: 2e 2e 29 0a 2a 2a 0a 2a 2a 20 52 65 70 6c 61 63  ..).**.** Replac
7af0: 65 20 74 68 65 20 76 61 6c 75 65 20 61 74 20 50  e the value at P
7b00: 41 54 48 20 77 69 74 68 20 56 41 4c 55 45 2e 20  ATH with VALUE. 
7b10: 20 49 66 20 50 41 54 48 20 64 6f 65 73 20 6e 6f   If PATH does no
7b20: 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 2c  t already exist,
7b30: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
7b40: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66   is a no-op.  If
7b50: 20 4a 53 4f 4e 20 69 73 20 69 6c 6c 2d 66 6f 72   JSON is ill-for
7b60: 6d 65 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  med, return NULL
7b70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7b80: 20 6a 73 6f 6e 52 65 70 6c 61 63 65 46 75 6e 63   jsonReplaceFunc
7b90: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
7ba0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
7bb0: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
7bc0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
7bd0: 0a 29 7b 0a 20 20 4a 73 6f 6e 50 61 72 73 65 20  .){.  JsonParse 
7be0: 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  x;          /* T
7bf0: 68 65 20 70 61 72 73 65 20 2a 2f 0a 20 20 4a 73  he parse */.  Js
7c00: 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 3b 0a 20  onNode *pNode;. 
7c10: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
7c20: 74 68 3b 0a 20 20 75 33 32 20 69 3b 0a 0a 20 20  th;.  u32 i;..  
7c30: 69 66 28 20 61 72 67 63 3c 31 20 29 20 72 65 74  if( argc<1 ) ret
7c40: 75 72 6e 3b 0a 20 20 69 66 28 20 28 61 72 67 63  urn;.  if( (argc
7c50: 26 31 29 3d 3d 30 20 29 20 7b 0a 20 20 20 20 73  &1)==0 ) {.    s
7c60: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
7c70: 72 6f 72 28 63 6f 6e 74 65 78 74 2c 0a 20 20 20  ror(context,.   
7c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c90: 20 20 20 20 20 20 22 6a 73 6f 6e 5f 72 65 70 6c        "json_repl
7ca0: 61 63 65 28 29 20 6e 65 65 64 73 20 61 6e 20 6f  ace() needs an o
7cb0: 64 64 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  dd number of arg
7cc0: 75 6d 65 6e 74 73 22 2c 20 2d 31 29 3b 0a 20 20  uments", -1);.  
7cd0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
7ce0: 69 66 28 20 6a 73 6f 6e 50 61 72 73 65 28 26 78  if( jsonParse(&x
7cf0: 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  , (const char*)s
7d00: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
7d10: 74 28 61 72 67 76 5b 30 5d 29 29 20 29 20 72 65  t(argv[0])) ) re
7d20: 74 75 72 6e 3b 0a 20 20 69 66 28 20 78 2e 6e 4e  turn;.  if( x.nN
7d30: 6f 64 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ode ){.    for(i
7d40: 3d 31 3b 20 69 3c 61 72 67 63 3b 20 69 2b 3d 32  =1; i<argc; i+=2
7d50: 29 7b 0a 20 20 20 20 20 20 7a 50 61 74 68 20 3d  ){.      zPath =
7d60: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
7d70: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
7d80: 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20  (argv[i]);.     
7d90: 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20 29 20   if( zPath==0 ) 
7da0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
7db0: 69 66 28 20 7a 50 61 74 68 5b 30 5d 21 3d 27 24  if( zPath[0]!='$
7dc0: 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ' ) continue;.  
7dd0: 20 20 20 20 70 4e 6f 64 65 20 3d 20 6a 73 6f 6e      pNode = json
7de0: 4c 6f 6f 6b 75 70 28 26 78 2c 20 30 2c 20 26 7a  Lookup(&x, 0, &z
7df0: 50 61 74 68 5b 31 5d 2c 20 30 29 3b 0a 20 20 20  Path[1], 0);.   
7e00: 20 20 20 69 66 28 20 70 4e 6f 64 65 20 29 7b 0a     if( pNode ){.
7e10: 20 20 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 6a          pNode->j
7e20: 6e 46 6c 61 67 73 20 7c 3d 20 4a 4e 4f 44 45 5f  nFlags |= JNODE_
7e30: 52 45 50 4c 41 43 45 3b 0a 20 20 20 20 20 20 20  REPLACE;.       
7e40: 20 70 4e 6f 64 65 2d 3e 69 56 61 6c 20 3d 20 69   pNode->iVal = i
7e50: 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  +1;.      }.    
7e60: 7d 0a 20 20 20 20 69 66 28 20 78 2e 61 4e 6f 64  }.    if( x.aNod
7e70: 65 5b 30 5d 2e 6a 6e 46 6c 61 67 73 20 26 20 4a  e[0].jnFlags & J
7e80: 4e 4f 44 45 5f 52 45 50 4c 41 43 45 20 29 7b 0a  NODE_REPLACE ){.
7e90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
7ea0: 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65  sult_value(conte
7eb0: 78 74 2c 20 61 72 67 76 5b 78 2e 61 4e 6f 64 65  xt, argv[x.aNode
7ec0: 5b 30 5d 2e 69 56 61 6c 5d 29 3b 0a 20 20 20 20  [0].iVal]);.    
7ed0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 73 6f  }else{.      jso
7ee0: 6e 52 65 74 75 72 6e 28 78 2e 61 4e 6f 64 65 2c  nReturn(x.aNode,
7ef0: 20 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 29 3b   context, argv);
7f00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6a 73 6f  .    }.  }.  jso
7f10: 6e 50 61 72 73 65 52 65 73 65 74 28 26 78 29 3b  nParseReset(&x);
7f20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 6a 73 6f 6e 5f 73  .}../*.** json_s
7f30: 65 74 28 4a 53 4f 4e 2c 20 50 41 54 48 2c 20 56  et(JSON, PATH, V
7f40: 41 4c 55 45 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a  ALUE, ...).**.**
7f50: 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 61   Set the value a
7f60: 74 20 50 41 54 48 20 74 6f 20 56 41 4c 55 45 2e  t PATH to VALUE.
7f70: 20 20 43 72 65 61 74 65 20 74 68 65 20 50 41 54    Create the PAT
7f80: 48 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  H if it does not
7f90: 20 61 6c 72 65 61 64 79 0a 2a 2a 20 65 78 69 73   already.** exis
7fa0: 74 2e 20 20 4f 76 65 72 77 72 69 74 65 20 65 78  t.  Overwrite ex
7fb0: 69 73 74 69 6e 67 20 76 61 6c 75 65 73 20 74 68  isting values th
7fc0: 61 74 20 64 6f 20 65 78 69 73 74 2e 0a 2a 2a 20  at do exist..** 
7fd0: 49 66 20 4a 53 4f 4e 20 69 73 20 69 6c 6c 2d 66  If JSON is ill-f
7fe0: 6f 72 6d 65 64 2c 20 72 65 74 75 72 6e 20 4e 55  ormed, return NU
7ff0: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 6a 73 6f 6e 5f 69  LL..**.** json_i
8000: 6e 73 65 72 74 28 4a 53 4f 4e 2c 20 50 41 54 48  nsert(JSON, PATH
8010: 2c 20 56 41 4c 55 45 2c 20 2e 2e 2e 29 0a 2a 2a  , VALUE, ...).**
8020: 0a 2a 2a 20 43 72 65 61 74 65 20 50 41 54 48 20  .** Create PATH 
8030: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69  and initialize i
8040: 74 20 74 6f 20 56 41 4c 55 45 2e 20 20 49 66 20  t to VALUE.  If 
8050: 50 41 54 48 20 61 6c 72 65 61 64 79 20 65 78 69  PATH already exi
8060: 73 74 73 2c 20 74 68 69 73 0a 2a 2a 20 72 6f 75  sts, this.** rou
8070: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
8080: 20 20 49 66 20 4a 53 4f 4e 20 69 73 20 69 6c 6c    If JSON is ill
8090: 2d 66 6f 72 6d 65 64 2c 20 72 65 74 75 72 6e 20  -formed, return 
80a0: 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  NULL..*/.static 
80b0: 76 6f 69 64 20 6a 73 6f 6e 53 65 74 46 75 6e 63  void jsonSetFunc
80c0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
80d0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
80e0: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
80f0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
8100: 0a 29 7b 0a 20 20 4a 73 6f 6e 50 61 72 73 65 20  .){.  JsonParse 
8110: 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  x;          /* T
8120: 68 65 20 70 61 72 73 65 20 2a 2f 0a 20 20 4a 73  he parse */.  Js
8130: 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 3b 0a 20  onNode *pNode;. 
8140: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
8150: 74 68 3b 0a 20 20 75 33 32 20 69 3b 0a 20 20 69  th;.  u32 i;.  i
8160: 6e 74 20 62 41 70 6e 64 3b 0a 20 20 69 6e 74 20  nt bApnd;.  int 
8170: 62 49 73 53 65 74 20 3d 20 2a 28 69 6e 74 2a 29  bIsSet = *(int*)
8180: 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
8190: 61 28 63 6f 6e 74 65 78 74 29 3b 0a 0a 20 20 69  a(context);..  i
81a0: 66 28 20 61 72 67 63 3c 31 20 29 20 72 65 74 75  f( argc<1 ) retu
81b0: 72 6e 3b 0a 20 20 69 66 28 20 28 61 72 67 63 26  rn;.  if( (argc&
81c0: 31 29 3d 3d 30 20 29 20 7b 0a 20 20 20 20 73 71  1)==0 ) {.    sq
81d0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
81e0: 6f 72 28 63 6f 6e 74 65 78 74 2c 0a 20 20 20 20  or(context,.    
81f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8200: 20 20 20 20 20 22 6a 73 6f 6e 5f 73 65 74 28 29       "json_set()
8210: 20 6e 65 65 64 73 20 61 6e 20 6f 64 64 20 6e 75   needs an odd nu
8220: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
8230: 73 22 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74  s", -1);.    ret
8240: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6a  urn;.  }.  if( j
8250: 73 6f 6e 50 61 72 73 65 28 26 78 2c 20 28 63 6f  sonParse(&x, (co
8260: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
8270: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
8280: 76 5b 30 5d 29 29 20 29 20 72 65 74 75 72 6e 3b  v[0])) ) return;
8290: 0a 20 20 69 66 28 20 78 2e 6e 4e 6f 64 65 20 29  .  if( x.nNode )
82a0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69  {.    for(i=1; i
82b0: 3c 61 72 67 63 3b 20 69 2b 3d 32 29 7b 0a 20 20  <argc; i+=2){.  
82c0: 20 20 20 20 7a 50 61 74 68 20 3d 20 28 63 6f 6e      zPath = (con
82d0: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
82e0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
82f0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [i]);.      if( 
8300: 7a 50 61 74 68 3d 3d 30 20 29 20 63 6f 6e 74 69  zPath==0 ) conti
8310: 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  nue;.      if( z
8320: 50 61 74 68 5b 30 5d 21 3d 27 24 27 20 29 20 63  Path[0]!='$' ) c
8330: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 62  ontinue;.      b
8340: 41 70 6e 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  Apnd = 0;.      
8350: 70 4e 6f 64 65 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b  pNode = jsonLook
8360: 75 70 28 26 78 2c 20 30 2c 20 26 7a 50 61 74 68  up(&x, 0, &zPath
8370: 5b 31 5d 2c 20 26 62 41 70 6e 64 29 3b 0a 20 20  [1], &bApnd);.  
8380: 20 20 20 20 69 66 28 20 70 4e 6f 64 65 20 26 26      if( pNode &&
8390: 20 28 62 41 70 6e 64 20 7c 7c 20 62 49 73 53 65   (bApnd || bIsSe
83a0: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e  t) ){.        pN
83b0: 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73 20 7c 3d 20  ode->jnFlags |= 
83c0: 4a 4e 4f 44 45 5f 52 45 50 4c 41 43 45 3b 0a 20  JNODE_REPLACE;. 
83d0: 20 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 69 56         pNode->iV
83e0: 61 6c 20 3d 20 69 2b 31 3b 0a 20 20 20 20 20 20  al = i+1;.      
83f0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
8400: 78 2e 61 4e 6f 64 65 5b 30 5d 2e 6a 6e 46 6c 61  x.aNode[0].jnFla
8410: 67 73 20 26 20 4a 4e 4f 44 45 5f 52 45 50 4c 41  gs & JNODE_REPLA
8420: 43 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  CE ){.      sqli
8430: 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65  te3_result_value
8440: 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 78  (context, argv[x
8450: 2e 61 4e 6f 64 65 5b 30 5d 2e 69 56 61 6c 5d 29  .aNode[0].iVal])
8460: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8470: 20 20 20 6a 73 6f 6e 52 65 74 75 72 6e 28 78 2e     jsonReturn(x.
8480: 61 4e 6f 64 65 2c 20 63 6f 6e 74 65 78 74 2c 20  aNode, context, 
8490: 61 72 67 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  argv);.    }.  }
84a0: 0a 20 20 6a 73 6f 6e 50 61 72 73 65 52 65 73 65  .  jsonParseRese
84b0: 74 28 26 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t(&x);.}../*.** 
84c0: 6a 73 6f 6e 5f 74 79 70 65 28 4a 53 4f 4e 29 0a  json_type(JSON).
84d0: 2a 2a 20 6a 73 6f 6e 5f 74 79 70 65 28 4a 53 4f  ** json_type(JSO
84e0: 4e 2c 20 50 41 54 48 29 0a 2a 2a 0a 2a 2a 20 52  N, PATH).**.** R
84f0: 65 74 75 72 6e 20 74 68 65 20 74 6f 70 2d 6c 65  eturn the top-le
8500: 76 65 6c 20 22 74 79 70 65 22 20 6f 66 20 61 20  vel "type" of a 
8510: 4a 53 4f 4e 20 73 74 72 69 6e 67 2e 20 20 52 65  JSON string.  Re
8520: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65  turn NULL if the
8530: 0a 2a 2a 20 69 6e 70 75 74 20 69 73 20 6e 6f 74  .** input is not
8540: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 4a   a well-formed J
8550: 53 4f 4e 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73  SON string..*/.s
8560: 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 54  tatic void jsonT
8570: 79 70 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  ypeFunc(.  sqlit
8580: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
8590: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
85a0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
85b0: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 4a 73 6f   **argv.){.  Jso
85c0: 6e 50 61 72 73 65 20 78 3b 20 20 20 20 20 20 20  nParse x;       
85d0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 20     /* The parse 
85e0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
85f0: 2a 7a 50 61 74 68 3b 0a 0a 20 20 69 66 28 20 61  *zPath;..  if( a
8600: 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 50  rgc==2 ){.    zP
8610: 61 74 68 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ath = (const cha
8620: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
8630: 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a  _text(argv[1]);.
8640: 20 20 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30      if( zPath==0
8650: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69   ) return;.    i
8660: 66 28 20 7a 50 61 74 68 5b 30 5d 21 3d 27 24 27  f( zPath[0]!='$'
8670: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7a   ) return;.    z
8680: 50 61 74 68 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b  Path++;.  }else{
8690: 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 30 3b 0a  .    zPath = 0;.
86a0: 20 20 7d 0a 20 20 69 66 28 20 6a 73 6f 6e 50 61    }.  if( jsonPa
86b0: 72 73 65 28 26 78 2c 20 28 63 6f 6e 73 74 20 63  rse(&x, (const c
86c0: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
86d0: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
86e0: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  ) ) return;.  if
86f0: 28 20 78 2e 6e 4e 6f 64 65 20 29 7b 0a 20 20 20  ( x.nNode ){.   
8700: 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65   JsonNode *pNode
8710: 20 3d 20 78 2e 61 4e 6f 64 65 3b 0a 20 20 20 20   = x.aNode;.    
8720: 69 66 28 20 7a 50 61 74 68 20 29 20 70 4e 6f 64  if( zPath ) pNod
8730: 65 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 28 26  e = jsonLookup(&
8740: 78 2c 20 30 2c 20 7a 50 61 74 68 2c 20 30 29 3b  x, 0, zPath, 0);
8750: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
8760: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
8770: 2c 20 6a 73 6f 6e 54 79 70 65 5b 70 4e 6f 64 65  , jsonType[pNode
8780: 2d 3e 65 54 79 70 65 5d 2c 20 2d 31 2c 20 53 51  ->eType], -1, SQ
8790: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
87a0: 7d 0a 20 20 6a 73 6f 6e 50 61 72 73 65 52 65 73  }.  jsonParseRes
87b0: 65 74 28 26 78 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a  et(&x);.}../****
87c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
87d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
87e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
87f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8800: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20  ********.** The 
8810: 6a 73 6f 6e 5f 65 61 63 68 20 76 69 72 74 75 61  json_each virtua
8820: 6c 20 74 61 62 6c 65 0a 2a 2a 2a 2a 2a 2a 2a 2a  l table.********
8830: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8840: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8850: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8860: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8870: 2a 2a 2a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  ****/.typedef st
8880: 72 75 63 74 20 4a 73 6f 6e 45 61 63 68 43 75 72  ruct JsonEachCur
8890: 73 6f 72 20 4a 73 6f 6e 45 61 63 68 43 75 72 73  sor JsonEachCurs
88a0: 6f 72 3b 0a 73 74 72 75 63 74 20 4a 73 6f 6e 45  or;.struct JsonE
88b0: 61 63 68 43 75 72 73 6f 72 20 7b 0a 20 20 73 71  achCursor {.  sq
88c0: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
88d0: 72 20 62 61 73 65 3b 20 20 2f 2a 20 42 61 73 65  r base;  /* Base
88e0: 20 63 6c 61 73 73 20 2d 20 6d 75 73 74 20 62 65   class - must be
88f0: 20 66 69 72 73 74 20 2a 2f 0a 20 20 75 33 32 20   first */.  u32 
8900: 69 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20  iRowid;         
8910: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f         /* The ro
8920: 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 69 3b 20  wid */.  u32 i; 
8930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8940: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
8950: 73 50 61 72 73 65 2e 61 4e 6f 64 65 5b 5d 20 6f  sParse.aNode[] o
8960: 66 20 63 75 72 72 65 6e 74 20 72 6f 77 20 2a 2f  f current row */
8970: 0a 20 20 75 33 32 20 69 45 6e 64 3b 20 20 20 20  .  u32 iEnd;    
8980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8990: 20 45 4f 46 20 77 68 65 6e 20 69 20 65 71 75 61   EOF when i equa
89a0: 6c 73 20 6f 72 20 65 78 63 65 65 64 73 20 74 68  ls or exceeds th
89b0: 69 73 20 76 61 6c 75 65 20 2a 2f 0a 20 20 75 38  is value */.  u8
89c0: 20 65 54 79 70 65 3b 20 20 20 20 20 20 20 20 20   eType;         
89d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65           /* Type
89e0: 20 6f 66 20 74 6f 70 2d 6c 65 76 65 6c 20 65 6c   of top-level el
89f0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 38 20 62 52  ement */.  u8 bR
8a00: 65 63 75 72 73 69 76 65 3b 20 20 20 20 20 20 20  ecursive;       
8a10: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
8a20: 72 20 6a 73 6f 6e 5f 74 72 65 65 28 29 2e 20 20  r json_tree().  
8a30: 46 61 6c 73 65 20 66 6f 72 20 6a 73 6f 6e 5f 65  False for json_e
8a40: 61 63 68 28 29 20 2a 2f 0a 20 20 63 68 61 72 20  ach() */.  char 
8a50: 2a 7a 4a 73 6f 6e 3b 20 20 20 20 20 20 20 20 20  *zJson;         
8a60: 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 4a        /* Input J
8a70: 53 4f 4e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  SON */.  char *z
8a80: 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  Path;           
8a90: 20 20 20 20 2f 2a 20 50 61 74 68 20 62 79 20 77      /* Path by w
8aa0: 68 69 63 68 20 74 6f 20 66 69 6c 74 65 72 20 7a  hich to filter z
8ab0: 4a 73 6f 6e 20 2a 2f 0a 20 20 4a 73 6f 6e 50 61  Json */.  JsonPa
8ac0: 72 73 65 20 73 50 61 72 73 65 3b 20 20 20 20 20  rse sParse;     
8ad0: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 6f 66       /* Parse of
8ae0: 20 74 68 65 20 69 6e 70 75 74 20 4a 53 4f 4e 20   the input JSON 
8af0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 43 6f 6e 73 74 72  */.};../* Constr
8b00: 75 63 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 73  uctor for the js
8b10: 6f 6e 5f 65 61 63 68 20 76 69 72 74 75 61 6c 20  on_each virtual 
8b20: 74 61 62 6c 65 20 2a 2f 0a 73 74 61 74 69 63 20  table */.static 
8b30: 69 6e 74 20 6a 73 6f 6e 45 61 63 68 43 6f 6e 6e  int jsonEachConn
8b40: 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ect(.  sqlite3 *
8b50: 64 62 2c 0a 20 20 76 6f 69 64 20 2a 70 41 75 78  db,.  void *pAux
8b60: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 63 6f  ,.  int argc, co
8b70: 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a  nst char *const*
8b80: 61 72 67 76 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argv,.  sqlite3_
8b90: 76 74 61 62 20 2a 2a 70 70 56 74 61 62 2c 0a 20  vtab **ppVtab,. 
8ba0: 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b   char **pzErr.){
8bb0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  .  sqlite3_vtab 
8bc0: 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63 3b  *pNew;.  int rc;
8bd0: 0a 0a 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62  ../* Column numb
8be0: 65 72 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4a  ers */.#define J
8bf0: 45 41 43 48 5f 4b 45 59 20 20 20 20 20 30 0a 23  EACH_KEY     0.#
8c00: 64 65 66 69 6e 65 20 4a 45 41 43 48 5f 56 41 4c  define JEACH_VAL
8c10: 55 45 20 20 20 31 0a 23 64 65 66 69 6e 65 20 4a  UE   1.#define J
8c20: 45 41 43 48 5f 54 59 50 45 20 20 20 20 32 0a 23  EACH_TYPE    2.#
8c30: 64 65 66 69 6e 65 20 4a 45 41 43 48 5f 41 54 4f  define JEACH_ATO
8c40: 4d 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 4a  M    3.#define J
8c50: 45 41 43 48 5f 49 44 20 20 20 20 20 20 34 0a 23  EACH_ID      4.#
8c60: 64 65 66 69 6e 65 20 4a 45 41 43 48 5f 50 41 52  define JEACH_PAR
8c70: 45 4e 54 20 20 35 0a 23 64 65 66 69 6e 65 20 4a  ENT  5.#define J
8c80: 45 41 43 48 5f 46 55 4c 4c 4b 45 59 20 36 0a 23  EACH_FULLKEY 6.#
8c90: 64 65 66 69 6e 65 20 4a 45 41 43 48 5f 4a 53 4f  define JEACH_JSO
8ca0: 4e 20 20 20 20 37 0a 23 64 65 66 69 6e 65 20 4a  N    7.#define J
8cb0: 45 41 43 48 5f 50 41 54 48 20 20 20 20 38 0a 0a  EACH_PATH    8..
8cc0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 64    rc = sqlite3_d
8cd0: 65 63 6c 61 72 65 5f 76 74 61 62 28 64 62 2c 20  eclare_vtab(db, 
8ce0: 0a 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41  .     "CREATE TA
8cf0: 42 4c 45 20 78 28 6b 65 79 2c 76 61 6c 75 65 2c  BLE x(key,value,
8d00: 74 79 70 65 2c 61 74 6f 6d 2c 69 64 2c 70 61 72  type,atom,id,par
8d10: 65 6e 74 2c 66 75 6c 6c 6b 65 79 2c 22 0a 20 20  ent,fullkey,".  
8d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d30: 20 20 22 6a 73 6f 6e 20 48 49 44 44 45 4e 2c 70    "json HIDDEN,p
8d40: 61 74 68 20 48 49 44 44 45 4e 29 22 29 3b 0a 20  ath HIDDEN)");. 
8d50: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
8d60: 4f 4b 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d  OK ){.    pNew =
8d70: 20 2a 70 70 56 74 61 62 20 3d 20 73 71 6c 69 74   *ppVtab = sqlit
8d80: 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
8d90: 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 20 20  f(*pNew) );.    
8da0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
8db0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
8dc0: 4d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4e  M;.    memset(pN
8dd0: 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  ew, 0, sizeof(*p
8de0: 4e 65 77 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74  New));.  }.  ret
8df0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 64 65  urn rc;.}../* de
8e00: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 6a 73 6f  structor for jso
8e10: 6e 5f 65 61 63 68 20 76 69 72 74 75 61 6c 20 74  n_each virtual t
8e20: 61 62 6c 65 20 2a 2f 0a 73 74 61 74 69 63 20 69  able */.static i
8e30: 6e 74 20 6a 73 6f 6e 45 61 63 68 44 69 73 63 6f  nt jsonEachDisco
8e40: 6e 6e 65 63 74 28 73 71 6c 69 74 65 33 5f 76 74  nnect(sqlite3_vt
8e50: 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 73 71  ab *pVtab){.  sq
8e60: 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74 61 62  lite3_free(pVtab
8e70: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
8e80: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 63 6f 6e  TE_OK;.}../* con
8e90: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 61 20 4a  structor for a J
8ea0: 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 20 6f 62  sonEachCursor ob
8eb0: 6a 65 63 74 20 66 6f 72 20 6a 73 6f 6e 5f 65 61  ject for json_ea
8ec0: 63 68 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20  ch(). */.static 
8ed0: 69 6e 74 20 6a 73 6f 6e 45 61 63 68 4f 70 65 6e  int jsonEachOpen
8ee0: 45 61 63 68 28 73 71 6c 69 74 65 33 5f 76 74 61  Each(sqlite3_vta
8ef0: 62 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 74  b *p, sqlite3_vt
8f00: 61 62 5f 63 75 72 73 6f 72 20 2a 2a 70 70 43 75  ab_cursor **ppCu
8f10: 72 73 6f 72 29 7b 0a 20 20 4a 73 6f 6e 45 61 63  rsor){.  JsonEac
8f20: 68 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20  hCursor *pCur;. 
8f30: 20 70 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f   pCur = sqlite3_
8f40: 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  malloc( sizeof(*
8f50: 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70  pCur) );.  if( p
8f60: 43 75 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Cur==0 ) return 
8f70: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
8f80: 6d 65 6d 73 65 74 28 70 43 75 72 2c 20 30 2c 20  memset(pCur, 0, 
8f90: 73 69 7a 65 6f 66 28 2a 70 43 75 72 29 29 3b 0a  sizeof(*pCur));.
8fa0: 20 20 2a 70 70 43 75 72 73 6f 72 20 3d 20 26 70    *ppCursor = &p
8fb0: 43 75 72 2d 3e 62 61 73 65 3b 0a 20 20 72 65 74  Cur->base;.  ret
8fc0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
8fd0: 0a 0a 2f 2a 20 63 6f 6e 73 74 72 75 63 74 6f 72  ../* constructor
8fe0: 20 66 6f 72 20 61 20 4a 73 6f 6e 45 61 63 68 43   for a JsonEachC
8ff0: 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 66 6f 72  ursor object for
9000: 20 6a 73 6f 6e 5f 74 72 65 65 28 29 2e 20 2a 2f   json_tree(). */
9010: 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e  .static int json
9020: 45 61 63 68 4f 70 65 6e 54 72 65 65 28 73 71 6c  EachOpenTree(sql
9030: 69 74 65 33 5f 76 74 61 62 20 2a 70 2c 20 73 71  ite3_vtab *p, sq
9040: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
9050: 72 20 2a 2a 70 70 43 75 72 73 6f 72 29 7b 0a 20  r **ppCursor){. 
9060: 20 69 6e 74 20 72 63 20 3d 20 6a 73 6f 6e 45 61   int rc = jsonEa
9070: 63 68 4f 70 65 6e 45 61 63 68 28 70 2c 20 70 70  chOpenEach(p, pp
9080: 43 75 72 73 6f 72 29 3b 0a 20 20 69 66 28 20 72  Cursor);.  if( r
9090: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
90a0: 20 20 20 20 4a 73 6f 6e 45 61 63 68 43 75 72 73      JsonEachCurs
90b0: 6f 72 20 2a 70 43 75 72 20 3d 20 28 4a 73 6f 6e  or *pCur = (Json
90c0: 45 61 63 68 43 75 72 73 6f 72 2a 29 2a 70 70 43  EachCursor*)*ppC
90d0: 75 72 73 6f 72 3b 0a 20 20 20 20 70 43 75 72 2d  ursor;.    pCur-
90e0: 3e 62 52 65 63 75 72 73 69 76 65 20 3d 20 31 3b  >bRecursive = 1;
90f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
9100: 3b 0a 7d 0a 0a 2f 2a 20 52 65 73 65 74 20 61 20  ;.}../* Reset a 
9110: 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 20 62  JsonEachCursor b
9120: 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ack to its origi
9130: 6e 61 6c 20 73 74 61 74 65 2e 20 20 46 72 65 65  nal state.  Free
9140: 20 61 6e 79 20 6d 65 6d 6f 72 79 0a 2a 2a 20 68   any memory.** h
9150: 65 6c 64 2e 20 2a 2f 0a 73 74 61 74 69 63 20 76  eld. */.static v
9160: 6f 69 64 20 6a 73 6f 6e 45 61 63 68 43 75 72 73  oid jsonEachCurs
9170: 6f 72 52 65 73 65 74 28 4a 73 6f 6e 45 61 63 68  orReset(JsonEach
9180: 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 73 71  Cursor *p){.  sq
9190: 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 4a  lite3_free(p->zJ
91a0: 73 6f 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  son);.  sqlite3_
91b0: 66 72 65 65 28 70 2d 3e 7a 50 61 74 68 29 3b 0a  free(p->zPath);.
91c0: 20 20 6a 73 6f 6e 50 61 72 73 65 52 65 73 65 74    jsonParseReset
91d0: 28 26 70 2d 3e 73 50 61 72 73 65 29 3b 0a 20 20  (&p->sParse);.  
91e0: 70 2d 3e 69 52 6f 77 69 64 20 3d 20 30 3b 0a 20  p->iRowid = 0;. 
91f0: 20 70 2d 3e 69 20 3d 20 30 3b 0a 20 20 70 2d 3e   p->i = 0;.  p->
9200: 69 45 6e 64 20 3d 20 30 3b 0a 20 20 70 2d 3e 65  iEnd = 0;.  p->e
9210: 54 79 70 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 7a  Type = 0;.  p->z
9220: 4a 73 6f 6e 20 3d 20 30 3b 0a 20 20 70 2d 3e 7a  Json = 0;.  p->z
9230: 50 61 74 68 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 20  Path = 0;.}../* 
9240: 44 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 61  Destructor for a
9250: 20 6a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 20   jsonEachCursor 
9260: 6f 62 6a 65 63 74 20 2a 2f 0a 73 74 61 74 69 63  object */.static
9270: 20 69 6e 74 20 6a 73 6f 6e 45 61 63 68 43 6c 6f   int jsonEachClo
9280: 73 65 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  se(sqlite3_vtab_
9290: 63 75 72 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20  cursor *cur){.  
92a0: 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 20 2a  JsonEachCursor *
92b0: 70 20 3d 20 28 4a 73 6f 6e 45 61 63 68 43 75 72  p = (JsonEachCur
92c0: 73 6f 72 2a 29 63 75 72 3b 0a 20 20 6a 73 6f 6e  sor*)cur;.  json
92d0: 45 61 63 68 43 75 72 73 6f 72 52 65 73 65 74 28  EachCursorReset(
92e0: 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  p);.  sqlite3_fr
92f0: 65 65 28 63 75 72 29 3b 0a 20 20 72 65 74 75 72  ee(cur);.  retur
9300: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
9310: 2f 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  /* Return TRUE i
9320: 66 20 74 68 65 20 6a 73 6f 6e 45 61 63 68 43 75  f the jsonEachCu
9330: 72 73 6f 72 20 6f 62 6a 65 63 74 20 68 61 73 20  rsor object has 
9340: 62 65 65 6e 20 61 64 76 61 6e 63 65 64 20 6f 66  been advanced of
9350: 66 20 74 68 65 20 65 6e 64 0a 2a 2a 20 6f 66 20  f the end.** of 
9360: 74 68 65 20 4a 53 4f 4e 20 6f 62 6a 65 63 74 20  the JSON object 
9370: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 73  */.static int js
9380: 6f 6e 45 61 63 68 45 6f 66 28 73 71 6c 69 74 65  onEachEof(sqlite
9390: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63  3_vtab_cursor *c
93a0: 75 72 29 7b 0a 20 20 4a 73 6f 6e 45 61 63 68 43  ur){.  JsonEachC
93b0: 75 72 73 6f 72 20 2a 70 20 3d 20 28 4a 73 6f 6e  ursor *p = (Json
93c0: 45 61 63 68 43 75 72 73 6f 72 2a 29 63 75 72 3b  EachCursor*)cur;
93d0: 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 20 3e  .  return p->i >
93e0: 3d 20 70 2d 3e 69 45 6e 64 3b 0a 7d 0a 0a 2f 2a  = p->iEnd;.}../*
93f0: 20 41 64 76 61 6e 63 65 20 74 68 65 20 63 75 72   Advance the cur
9400: 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20  sor to the next 
9410: 65 6c 65 6d 65 6e 74 20 66 6f 72 20 6a 73 6f 6e  element for json
9420: 5f 74 72 65 65 28 29 20 2a 2f 0a 73 74 61 74 69  _tree() */.stati
9430: 63 20 69 6e 74 20 6a 73 6f 6e 45 61 63 68 4e 65  c int jsonEachNe
9440: 78 74 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  xt(sqlite3_vtab_
9450: 63 75 72 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20  cursor *cur){.  
9460: 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 20 2a  JsonEachCursor *
9470: 70 20 3d 20 28 4a 73 6f 6e 45 61 63 68 43 75 72  p = (JsonEachCur
9480: 73 6f 72 2a 29 63 75 72 3b 0a 20 20 69 66 28 20  sor*)cur;.  if( 
9490: 70 2d 3e 62 52 65 63 75 72 73 69 76 65 20 29 7b  p->bRecursive ){
94a0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 3d 3d 30  .    if( p->i==0
94b0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 20 3d   ){.      p->i =
94c0: 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   1;.    }else if
94d0: 28 20 70 2d 3e 73 50 61 72 73 65 2e 61 4e 6f 64  ( p->sParse.aNod
94e0: 65 5b 70 2d 3e 73 50 61 72 73 65 2e 61 55 70 5b  e[p->sParse.aUp[
94f0: 70 2d 3e 69 5d 5d 2e 65 54 79 70 65 3d 3d 4a 53  p->i]].eType==JS
9500: 4f 4e 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20  ON_OBJECT ){.   
9510: 20 20 20 70 2d 3e 69 20 2b 3d 20 32 3b 0a 20 20     p->i += 2;.  
9520: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
9530: 2d 3e 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  ->i++;.    }.   
9540: 20 70 2d 3e 69 52 6f 77 69 64 2b 2b 3b 0a 20 20   p->iRowid++;.  
9550: 20 20 69 66 28 20 70 2d 3e 69 3c 70 2d 3e 73 50    if( p->i<p->sP
9560: 61 72 73 65 2e 6e 4e 6f 64 65 20 29 7b 0a 20 20  arse.nNode ){.  
9570: 20 20 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 55      JsonNode *pU
9580: 70 20 3d 20 26 70 2d 3e 73 50 61 72 73 65 2e 61  p = &p->sParse.a
9590: 4e 6f 64 65 5b 70 2d 3e 73 50 61 72 73 65 2e 61  Node[p->sParse.a
95a0: 55 70 5b 70 2d 3e 69 5d 5d 3b 0a 20 20 20 20 20  Up[p->i]];.     
95b0: 20 70 2d 3e 65 54 79 70 65 20 3d 20 70 55 70 2d   p->eType = pUp-
95c0: 3e 65 54 79 70 65 3b 0a 20 20 20 20 20 20 69 66  >eType;.      if
95d0: 28 20 70 55 70 2d 3e 65 54 79 70 65 3d 3d 4a 53  ( pUp->eType==JS
95e0: 4f 4e 5f 41 52 52 41 59 20 29 20 70 55 70 2d 3e  ON_ARRAY ) pUp->
95f0: 75 2e 69 4b 65 79 2b 2b 3b 0a 20 20 20 20 20 20  u.iKey++;.      
9600: 69 66 28 20 70 2d 3e 73 50 61 72 73 65 2e 61 4e  if( p->sParse.aN
9610: 6f 64 65 5b 70 2d 3e 69 5d 2e 65 54 79 70 65 3d  ode[p->i].eType=
9620: 3d 4a 53 4f 4e 5f 41 52 52 41 59 20 29 7b 0a 20  =JSON_ARRAY ){. 
9630: 20 20 20 20 20 20 20 70 2d 3e 73 50 61 72 73 65         p->sParse
9640: 2e 61 4e 6f 64 65 5b 70 2d 3e 69 5d 2e 75 2e 69  .aNode[p->i].u.i
9650: 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  Key = 0;.      }
9660: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
9670: 20 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e 65      switch( p->e
9680: 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61  Type ){.      ca
9690: 73 65 20 4a 53 4f 4e 5f 41 52 52 41 59 3a 20 7b  se JSON_ARRAY: {
96a0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 20 2b 3d  .        p->i +=
96b0: 20 6a 73 6f 6e 4e 6f 64 65 53 69 7a 65 28 26 70   jsonNodeSize(&p
96c0: 2d 3e 73 50 61 72 73 65 2e 61 4e 6f 64 65 5b 70  ->sParse.aNode[p
96d0: 2d 3e 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 70  ->i]);.        p
96e0: 2d 3e 69 52 6f 77 69 64 2b 2b 3b 0a 20 20 20 20  ->iRowid++;.    
96f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9700: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4a 53   }.      case JS
9710: 4f 4e 5f 4f 42 4a 45 43 54 3a 20 7b 0a 20 20 20  ON_OBJECT: {.   
9720: 20 20 20 20 20 70 2d 3e 69 20 2b 3d 20 31 20 2b       p->i += 1 +
9730: 20 6a 73 6f 6e 4e 6f 64 65 53 69 7a 65 28 26 70   jsonNodeSize(&p
9740: 2d 3e 73 50 61 72 73 65 2e 61 4e 6f 64 65 5b 70  ->sParse.aNode[p
9750: 2d 3e 69 2b 31 5d 29 3b 0a 20 20 20 20 20 20 20  ->i+1]);.       
9760: 20 70 2d 3e 69 52 6f 77 69 64 2b 2b 3b 0a 20 20   p->iRowid++;.  
9770: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9780: 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66 61 75     }.      defau
9790: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 2d  lt: {.        p-
97a0: 3e 69 20 3d 20 70 2d 3e 69 45 6e 64 3b 0a 20 20  >i = p->iEnd;.  
97b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
97c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
97d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
97e0: 4b 3b 0a 7d 0a 0a 2f 2a 20 41 70 70 65 6e 64 20  K;.}../* Append 
97f0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
9800: 70 61 74 68 20 66 6f 72 20 65 6c 65 6d 65 6e 74  path for element
9810: 20 69 20 74 6f 20 70 53 74 72 0a 2a 2f 0a 73 74   i to pStr.*/.st
9820: 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 45 61  atic void jsonEa
9830: 63 68 43 6f 6d 70 75 74 65 50 61 74 68 28 0a 20  chComputePath(. 
9840: 20 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 20   JsonEachCursor 
9850: 2a 70 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  *p,       /* The
9860: 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 4a 73 6f   cursor */.  Jso
9870: 6e 53 74 72 69 6e 67 20 2a 70 53 74 72 2c 20 20  nString *pStr,  
9880: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
9890: 68 65 20 70 61 74 68 20 68 65 72 65 20 2a 2f 0a  he path here */.
98a0: 20 20 75 33 32 20 69 20 20 20 20 20 20 20 20 20    u32 i         
98b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
98c0: 74 68 20 74 6f 20 74 68 69 73 20 65 6c 65 6d 65  th to this eleme
98d0: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 4a 73 6f 6e 4e  nt */.){.  JsonN
98e0: 6f 64 65 20 2a 70 4e 6f 64 65 2c 20 2a 70 55 70  ode *pNode, *pUp
98f0: 3b 0a 20 20 75 33 32 20 69 55 70 3b 0a 20 20 69  ;.  u32 iUp;.  i
9900: 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 6a  f( i==0 ){.    j
9910: 73 6f 6e 41 70 70 65 6e 64 43 68 61 72 28 70 53  sonAppendChar(pS
9920: 74 72 2c 20 27 24 27 29 3b 0a 20 20 20 20 72 65  tr, '$');.    re
9930: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 55 70 20  turn;.  }.  iUp 
9940: 3d 20 70 2d 3e 73 50 61 72 73 65 2e 61 55 70 5b  = p->sParse.aUp[
9950: 69 5d 3b 0a 20 20 6a 73 6f 6e 45 61 63 68 43 6f  i];.  jsonEachCo
9960: 6d 70 75 74 65 50 61 74 68 28 70 2c 20 70 53 74  mputePath(p, pSt
9970: 72 2c 20 69 55 70 29 3b 0a 20 20 70 4e 6f 64 65  r, iUp);.  pNode
9980: 20 3d 20 26 70 2d 3e 73 50 61 72 73 65 2e 61 4e   = &p->sParse.aN
9990: 6f 64 65 5b 69 5d 3b 0a 20 20 70 55 70 20 3d 20  ode[i];.  pUp = 
99a0: 26 70 2d 3e 73 50 61 72 73 65 2e 61 4e 6f 64 65  &p->sParse.aNode
99b0: 5b 69 55 70 5d 3b 0a 20 20 69 66 28 20 70 55 70  [iUp];.  if( pUp
99c0: 2d 3e 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f 41 52  ->eType==JSON_AR
99d0: 52 41 59 20 29 7b 0a 20 20 20 20 6a 73 6f 6e 50  RAY ){.    jsonP
99e0: 72 69 6e 74 66 28 33 30 2c 20 70 53 74 72 2c 20  rintf(30, pStr, 
99f0: 22 5b 25 64 5d 22 2c 20 70 55 70 2d 3e 75 2e 69  "[%d]", pUp->u.i
9a00: 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Key);.  }else{. 
9a10: 20 20 20 61 73 73 65 72 74 28 20 70 55 70 2d 3e     assert( pUp->
9a20: 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f 4f 42 4a 45  eType==JSON_OBJE
9a30: 43 54 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  CT );.    if( pN
9a40: 6f 64 65 2d 3e 65 54 79 70 65 3e 3d 4a 53 4f 4e  ode->eType>=JSON
9a50: 5f 41 52 52 41 59 20 29 20 70 4e 6f 64 65 2d 2d  _ARRAY ) pNode--
9a60: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
9a70: 6f 64 65 2d 3e 65 54 79 70 65 3d 3d 4a 53 4f 4e  ode->eType==JSON
9a80: 5f 53 54 52 49 4e 47 20 29 3b 0a 20 20 20 20 6a  _STRING );.    j
9a90: 73 6f 6e 50 72 69 6e 74 66 28 70 4e 6f 64 65 2d  sonPrintf(pNode-
9aa0: 3e 6e 2b 31 2c 20 70 53 74 72 2c 20 22 2e 25 2e  >n+1, pStr, ".%.
9ab0: 2a 73 22 2c 20 70 4e 6f 64 65 2d 3e 6e 2d 32 2c  *s", pNode->n-2,
9ac0: 20 70 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74   pNode->u.zJCont
9ad0: 65 6e 74 2b 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ent+1);.  }.}../
9ae0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
9af0: 75 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 2a  ue of a column *
9b00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 73 6f  /.static int jso
9b10: 6e 45 61 63 68 43 6f 6c 75 6d 6e 28 0a 20 20 73  nEachColumn(.  s
9b20: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
9b30: 6f 72 20 2a 63 75 72 2c 20 20 20 2f 2a 20 54 68  or *cur,   /* Th
9b40: 65 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 73 71  e cursor */.  sq
9b50: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
9b60: 74 78 2c 20 20 20 20 20 20 20 2f 2a 20 46 69 72  tx,       /* Fir
9b70: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73  st argument to s
9b80: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 2e 2e  qlite3_result_..
9b90: 2e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 69 20 20  .() */.  int i  
9ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9bb0: 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 63 6f       /* Which co
9bc0: 6c 75 6d 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a  lumn to return *
9bd0: 2f 0a 29 7b 0a 20 20 4a 73 6f 6e 45 61 63 68 43  /.){.  JsonEachC
9be0: 75 72 73 6f 72 20 2a 70 20 3d 20 28 4a 73 6f 6e  ursor *p = (Json
9bf0: 45 61 63 68 43 75 72 73 6f 72 2a 29 63 75 72 3b  EachCursor*)cur;
9c00: 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 54 68  .  JsonNode *pTh
9c10: 69 73 20 3d 20 26 70 2d 3e 73 50 61 72 73 65 2e  is = &p->sParse.
9c20: 61 4e 6f 64 65 5b 70 2d 3e 69 5d 3b 0a 20 20 73  aNode[p->i];.  s
9c30: 77 69 74 63 68 28 20 69 20 29 7b 0a 20 20 20 20  witch( i ){.    
9c40: 63 61 73 65 20 4a 45 41 43 48 5f 4b 45 59 3a 20  case JEACH_KEY: 
9c50: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65  {.      if( p->e
9c60: 54 79 70 65 3d 3d 4a 53 4f 4e 5f 4f 42 4a 45 43  Type==JSON_OBJEC
9c70: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 73 6f  T ){.        jso
9c80: 6e 52 65 74 75 72 6e 28 70 54 68 69 73 2c 20 63  nReturn(pThis, c
9c90: 74 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65  tx, 0);.      }e
9ca0: 6c 73 65 20 69 66 28 20 70 2d 3e 65 54 79 70 65  lse if( p->eType
9cb0: 3d 3d 4a 53 4f 4e 5f 41 52 52 41 59 20 29 7b 0a  ==JSON_ARRAY ){.
9cc0: 20 20 20 20 20 20 20 20 75 33 32 20 69 4b 65 79          u32 iKey
9cd0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
9ce0: 3e 62 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20  >bRecursive ){. 
9cf0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
9d00: 69 52 6f 77 69 64 3d 3d 30 20 29 20 62 72 65 61  iRowid==0 ) brea
9d10: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4b 65  k;.          iKe
9d20: 79 20 3d 20 70 2d 3e 73 50 61 72 73 65 2e 61 4e  y = p->sParse.aN
9d30: 6f 64 65 5b 70 2d 3e 73 50 61 72 73 65 2e 61 55  ode[p->sParse.aU
9d40: 70 5b 70 2d 3e 69 5d 5d 2e 75 2e 69 4b 65 79 20  p[p->i]].u.iKey 
9d50: 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  - 1;.        }el
9d60: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 4b  se{.          iK
9d70: 65 79 20 3d 20 70 2d 3e 69 52 6f 77 69 64 3b 0a  ey = p->iRowid;.
9d80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9d90: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
9da0: 5f 69 6e 74 36 34 28 63 74 78 2c 20 69 4b 65 79  _int64(ctx, iKey
9db0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
9dc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
9dd0: 20 20 63 61 73 65 20 4a 45 41 43 48 5f 56 41 4c    case JEACH_VAL
9de0: 55 45 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  UE: {.      if( 
9df0: 70 2d 3e 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f 4f  p->eType==JSON_O
9e00: 42 4a 45 43 54 20 29 20 70 54 68 69 73 2b 2b 3b  BJECT ) pThis++;
9e10: 0a 20 20 20 20 20 20 6a 73 6f 6e 52 65 74 75 72  .      jsonRetur
9e20: 6e 28 70 54 68 69 73 2c 20 63 74 78 2c 20 30 29  n(pThis, ctx, 0)
9e30: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9e40: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 45     }.    case JE
9e50: 41 43 48 5f 54 59 50 45 3a 20 7b 0a 20 20 20 20  ACH_TYPE: {.    
9e60: 20 20 69 66 28 20 70 2d 3e 65 54 79 70 65 3d 3d    if( p->eType==
9e70: 4a 53 4f 4e 5f 4f 42 4a 45 43 54 20 29 20 70 54  JSON_OBJECT ) pT
9e80: 68 69 73 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c  his++;.      sql
9e90: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
9ea0: 28 63 74 78 2c 20 6a 73 6f 6e 54 79 70 65 5b 70  (ctx, jsonType[p
9eb0: 54 68 69 73 2d 3e 65 54 79 70 65 5d 2c 20 2d 31  This->eType], -1
9ec0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
9ed0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9ee0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 45     }.    case JE
9ef0: 41 43 48 5f 41 54 4f 4d 3a 20 7b 0a 20 20 20 20  ACH_ATOM: {.    
9f00: 20 20 69 66 28 20 70 2d 3e 65 54 79 70 65 3d 3d    if( p->eType==
9f10: 4a 53 4f 4e 5f 4f 42 4a 45 43 54 20 29 20 70 54  JSON_OBJECT ) pT
9f20: 68 69 73 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  his++;.      if(
9f30: 20 70 54 68 69 73 2d 3e 65 54 79 70 65 3e 3d 4a   pThis->eType>=J
9f40: 53 4f 4e 5f 41 52 52 41 59 20 29 20 62 72 65 61  SON_ARRAY ) brea
9f50: 6b 3b 0a 20 20 20 20 20 20 6a 73 6f 6e 52 65 74  k;.      jsonRet
9f60: 75 72 6e 28 70 54 68 69 73 2c 20 63 74 78 2c 20  urn(pThis, ctx, 
9f70: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
9f80: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
9f90: 4a 45 41 43 48 5f 49 44 3a 20 7b 0a 20 20 20 20  JEACH_ID: {.    
9fa0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
9fb0: 5f 69 6e 74 36 34 28 63 74 78 2c 20 70 2d 3e 69  _int64(ctx, p->i
9fc0: 20 2b 20 28 70 2d 3e 65 54 79 70 65 3d 3d 4a 53   + (p->eType==JS
9fd0: 4f 4e 5f 4f 42 4a 45 43 54 29 29 3b 0a 20 20 20  ON_OBJECT));.   
9fe0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9ff0: 20 20 20 20 63 61 73 65 20 4a 45 41 43 48 5f 50      case JEACH_P
a000: 41 52 45 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69  ARENT: {.      i
a010: 66 28 20 70 2d 3e 69 3e 30 20 26 26 20 70 2d 3e  f( p->i>0 && p->
a020: 62 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20  bRecursive ){.  
a030: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
a040: 73 75 6c 74 5f 69 6e 74 36 34 28 63 74 78 2c 20  sult_int64(ctx, 
a050: 70 2d 3e 73 50 61 72 73 65 2e 61 55 70 5b 70 2d  p->sParse.aUp[p-
a060: 3e 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  >i]);.      }.  
a070: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
a080: 0a 20 20 20 20 63 61 73 65 20 4a 45 41 43 48 5f  .    case JEACH_
a090: 46 55 4c 4c 4b 45 59 3a 20 7b 0a 20 20 20 20 20  FULLKEY: {.     
a0a0: 20 4a 73 6f 6e 53 74 72 69 6e 67 20 78 3b 0a 20   JsonString x;. 
a0b0: 20 20 20 20 20 6a 73 6f 6e 49 6e 69 74 28 26 78       jsonInit(&x
a0c0: 2c 20 63 74 78 29 3b 0a 20 20 20 20 20 20 69 66  , ctx);.      if
a0d0: 28 20 70 2d 3e 62 52 65 63 75 72 73 69 76 65 20  ( p->bRecursive 
a0e0: 29 7b 0a 20 20 20 20 20 20 20 20 6a 73 6f 6e 45  ){.        jsonE
a0f0: 61 63 68 43 6f 6d 70 75 74 65 50 61 74 68 28 70  achComputePath(p
a100: 2c 20 26 78 2c 20 70 2d 3e 69 29 3b 0a 20 20 20  , &x, p->i);.   
a110: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a120: 20 20 69 66 28 20 70 2d 3e 7a 50 61 74 68 20 29    if( p->zPath )
a130: 7b 0a 20 20 20 20 20 20 20 20 20 20 6a 73 6f 6e  {.          json
a140: 41 70 70 65 6e 64 52 61 77 28 26 78 2c 20 70 2d  AppendRaw(&x, p-
a150: 3e 7a 50 61 74 68 2c 20 28 69 6e 74 29 73 74 72  >zPath, (int)str
a160: 6c 65 6e 28 70 2d 3e 7a 50 61 74 68 29 29 3b 0a  len(p->zPath));.
a170: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
a180: 20 20 20 20 20 20 20 20 20 6a 73 6f 6e 41 70 70           jsonApp
a190: 65 6e 64 43 68 61 72 28 26 78 2c 20 27 24 27 29  endChar(&x, '$')
a1a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a1b0: 20 20 20 20 69 66 28 20 70 2d 3e 65 54 79 70 65      if( p->eType
a1c0: 3d 3d 4a 53 4f 4e 5f 41 52 52 41 59 20 29 7b 0a  ==JSON_ARRAY ){.
a1d0: 20 20 20 20 20 20 20 20 20 20 6a 73 6f 6e 50 72            jsonPr
a1e0: 69 6e 74 66 28 33 30 2c 20 26 78 2c 20 22 5b 25  intf(30, &x, "[%
a1f0: 64 5d 22 2c 20 70 2d 3e 69 52 6f 77 69 64 29 3b  d]", p->iRowid);
a200: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
a210: 20 20 20 20 20 20 20 20 20 20 6a 73 6f 6e 50 72            jsonPr
a220: 69 6e 74 66 28 70 54 68 69 73 2d 3e 6e 2c 20 26  intf(pThis->n, &
a230: 78 2c 20 22 2e 25 2e 2a 73 22 2c 20 70 54 68 69  x, ".%.*s", pThi
a240: 73 2d 3e 6e 2d 32 2c 20 70 54 68 69 73 2d 3e 75  s->n-2, pThis->u
a250: 2e 7a 4a 43 6f 6e 74 65 6e 74 2b 31 29 3b 0a 20  .zJContent+1);. 
a260: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
a270: 0a 20 20 20 20 20 20 6a 73 6f 6e 52 65 73 75 6c  .      jsonResul
a280: 74 28 26 78 29 3b 0a 20 20 20 20 20 20 62 72 65  t(&x);.      bre
a290: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
a2a0: 73 65 20 4a 45 41 43 48 5f 50 41 54 48 3a 20 7b  se JEACH_PATH: {
a2b0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
a2c0: 72 20 2a 7a 50 61 74 68 20 3d 20 70 2d 3e 7a 50  r *zPath = p->zP
a2d0: 61 74 68 3b 0a 20 20 20 20 20 20 20 69 66 28 20  ath;.       if( 
a2e0: 7a 50 61 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20  zPath==0 ){.    
a2f0: 20 20 20 20 69 66 28 20 70 2d 3e 62 52 65 63 75      if( p->bRecu
a300: 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 20  rsive ){.       
a310: 20 20 20 4a 73 6f 6e 53 74 72 69 6e 67 20 78 3b     JsonString x;
a320: 0a 20 20 20 20 20 20 20 20 20 20 6a 73 6f 6e 49  .          jsonI
a330: 6e 69 74 28 26 78 2c 20 63 74 78 29 3b 0a 20 20  nit(&x, ctx);.  
a340: 20 20 20 20 20 20 20 20 6a 73 6f 6e 45 61 63 68          jsonEach
a350: 43 6f 6d 70 75 74 65 50 61 74 68 28 70 2c 20 26  ComputePath(p, &
a360: 78 2c 20 70 2d 3e 73 50 61 72 73 65 2e 61 55 70  x, p->sParse.aUp
a370: 5b 70 2d 3e 69 5d 29 3b 0a 20 20 20 20 20 20 20  [p->i]);.       
a380: 20 20 20 6a 73 6f 6e 52 65 73 75 6c 74 28 26 78     jsonResult(&x
a390: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
a3a0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
a3b0: 20 20 20 20 20 20 7a 50 61 74 68 20 3d 20 22 24        zPath = "$
a3c0: 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ";.      }.     
a3d0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
a3e0: 74 65 78 74 28 63 74 78 2c 20 7a 50 61 74 68 2c  text(ctx, zPath,
a3f0: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
a400: 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  IC);.      break
a410: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
a420: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ult: {.      ass
a430: 65 72 74 28 20 69 3d 3d 4a 45 41 43 48 5f 4a 53  ert( i==JEACH_JS
a440: 4f 4e 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ON );.      sqli
a450: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
a460: 63 74 78 2c 20 70 2d 3e 73 50 61 72 73 65 2e 7a  ctx, p->sParse.z
a470: 4a 73 6f 6e 2c 20 2d 31 2c 20 53 51 4c 49 54 45  Json, -1, SQLITE
a480: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
a490: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
a4a0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
a4b0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  _OK;.}../* Retur
a4c0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  n the current ro
a4d0: 77 69 64 20 76 61 6c 75 65 20 2a 2f 0a 73 74 61  wid value */.sta
a4e0: 74 69 63 20 69 6e 74 20 6a 73 6f 6e 45 61 63 68  tic int jsonEach
a4f0: 52 6f 77 69 64 28 73 71 6c 69 74 65 33 5f 76 74  Rowid(sqlite3_vt
a500: 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 2c 20  ab_cursor *cur, 
a510: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 52  sqlite_int64 *pR
a520: 6f 77 69 64 29 7b 0a 20 20 4a 73 6f 6e 45 61 63  owid){.  JsonEac
a530: 68 43 75 72 73 6f 72 20 2a 70 20 3d 20 28 4a 73  hCursor *p = (Js
a540: 6f 6e 45 61 63 68 43 75 72 73 6f 72 2a 29 63 75  onEachCursor*)cu
a550: 72 3b 0a 20 20 2a 70 52 6f 77 69 64 20 3d 20 70  r;.  *pRowid = p
a560: 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 72 65 74 75  ->iRowid;.  retu
a570: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
a580: 0a 2f 2a 20 54 68 65 20 71 75 65 72 79 20 73 74  ./* The query st
a590: 72 61 74 65 67 79 20 69 73 20 74 6f 20 6c 6f 6f  rategy is to loo
a5a0: 6b 20 66 6f 72 20 61 6e 20 65 71 75 61 6c 69 74  k for an equalit
a5b0: 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20  y constraint on 
a5c0: 74 68 65 20 6a 73 6f 6e 0a 2a 2a 20 63 6f 6c 75  the json.** colu
a5d0: 6d 6e 2e 20 20 57 69 74 68 6f 75 74 20 73 75 63  mn.  Without suc
a5e0: 68 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20  h a constraint, 
a5f0: 74 68 65 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74  the table cannot
a600: 20 6f 70 65 72 61 74 65 2e 20 20 69 64 78 4e 75   operate.  idxNu
a610: 6d 20 69 73 0a 2a 2a 20 31 20 69 66 20 74 68 65  m is.** 1 if the
a620: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 66   constraint is f
a630: 6f 75 6e 64 2c 20 33 20 69 66 20 74 68 65 20 63  ound, 3 if the c
a640: 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 7a 50  onstraint and zP
a650: 61 74 68 20 61 72 65 20 66 6f 75 6e 64 2c 0a 2a  ath are found,.*
a660: 2a 20 61 6e 64 20 30 20 6f 74 68 65 72 77 69 73  * and 0 otherwis
a670: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
a680: 20 6a 73 6f 6e 45 61 63 68 42 65 73 74 49 6e 64   jsonEachBestInd
a690: 65 78 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  ex(.  sqlite3_vt
a6a0: 61 62 20 2a 74 61 62 2c 0a 20 20 73 71 6c 69 74  ab *tab,.  sqlit
a6b0: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
a6c0: 49 64 78 49 6e 66 6f 0a 29 7b 0a 20 20 69 6e 74  IdxInfo.){.  int
a6d0: 20 69 3b 0a 20 20 69 6e 74 20 6a 73 6f 6e 49 64   i;.  int jsonId
a6e0: 78 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 70 61  x = -1;.  int pa
a6f0: 74 68 49 64 78 20 3d 20 2d 31 3b 0a 20 20 63 6f  thIdx = -1;.  co
a700: 6e 73 74 20 73 74 72 75 63 74 20 73 71 6c 69 74  nst struct sqlit
a710: 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
a720: 69 6e 74 20 2a 70 43 6f 6e 73 74 72 61 69 6e 74  int *pConstraint
a730: 3b 0a 20 20 70 43 6f 6e 73 74 72 61 69 6e 74 20  ;.  pConstraint 
a740: 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  = pIdxInfo->aCon
a750: 73 74 72 61 69 6e 74 3b 0a 20 20 66 6f 72 28 69  straint;.  for(i
a760: 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e  =0; i<pIdxInfo->
a770: 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
a780: 2c 20 70 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 29  , pConstraint++)
a790: 7b 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 73 74  {.    if( pConst
a7a0: 72 61 69 6e 74 2d 3e 75 73 61 62 6c 65 3d 3d 30  raint->usable==0
a7b0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
a7c0: 20 69 66 28 20 70 43 6f 6e 73 74 72 61 69 6e 74   if( pConstraint
a7d0: 2d 3e 6f 70 21 3d 53 51 4c 49 54 45 5f 49 4e 44  ->op!=SQLITE_IND
a7e0: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51  EX_CONSTRAINT_EQ
a7f0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
a800: 20 73 77 69 74 63 68 28 20 70 43 6f 6e 73 74 72   switch( pConstr
a810: 61 69 6e 74 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b  aint->iColumn ){
a820: 0a 20 20 20 20 20 20 63 61 73 65 20 4a 45 41 43  .      case JEAC
a830: 48 5f 4a 53 4f 4e 3a 20 20 20 6a 73 6f 6e 49 64  H_JSON:   jsonId
a840: 78 20 3d 20 69 3b 20 20 20 20 62 72 65 61 6b 3b  x = i;    break;
a850: 0a 20 20 20 20 20 20 63 61 73 65 20 4a 45 41 43  .      case JEAC
a860: 48 5f 50 41 54 48 3a 20 20 20 70 61 74 68 49 64  H_PATH:   pathId
a870: 78 20 3d 20 69 3b 20 20 20 20 62 72 65 61 6b 3b  x = i;    break;
a880: 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20  .      default: 
a890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 2d            /* no-
a8a0: 6f 70 20 2a 2f 20 20 20 20 20 62 72 65 61 6b 3b  op */     break;
a8b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
a8c0: 20 6a 73 6f 6e 49 64 78 3c 30 20 29 7b 0a 20 20   jsonIdx<0 ){.  
a8d0: 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e    pIdxInfo->idxN
a8e0: 75 6d 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78  um = 0;.    pIdx
a8f0: 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
a900: 6f 73 74 20 3d 20 31 65 39 39 3b 0a 20 20 7d 65  ost = 1e99;.  }e
a910: 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 49 6e 66  lse{.    pIdxInf
a920: 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
a930: 20 3d 20 31 2e 30 3b 0a 20 20 20 20 70 49 64 78   = 1.0;.    pIdx
a940: 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
a950: 74 55 73 61 67 65 5b 6a 73 6f 6e 49 64 78 5d 2e  tUsage[jsonIdx].
a960: 61 72 67 76 49 6e 64 65 78 20 3d 20 31 3b 0a 20  argvIndex = 1;. 
a970: 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f     pIdxInfo->aCo
a980: 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 6a 73  nstraintUsage[js
a990: 6f 6e 49 64 78 5d 2e 6f 6d 69 74 20 3d 20 31 3b  onIdx].omit = 1;
a9a0: 0a 20 20 20 20 69 66 28 20 70 61 74 68 49 64 78  .    if( pathIdx
a9b0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78  <0 ){.      pIdx
a9c0: 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 31  Info->idxNum = 1
a9d0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a9e0: 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f     pIdxInfo->aCo
a9f0: 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 70 61  nstraintUsage[pa
aa00: 74 68 49 64 78 5d 2e 61 72 67 76 49 6e 64 65 78  thIdx].argvIndex
aa10: 20 3d 20 32 3b 0a 20 20 20 20 20 20 70 49 64 78   = 2;.      pIdx
aa20: 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
aa30: 74 55 73 61 67 65 5b 70 61 74 68 49 64 78 5d 2e  tUsage[pathIdx].
aa40: 6f 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  omit = 1;.      
aa50: 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d  pIdxInfo->idxNum
aa60: 20 3d 20 33 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 3;.    }.  }.
aa70: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
aa80: 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 53 74 61 72 74 20  OK;.}../* Start 
aa90: 61 20 73 65 61 72 63 68 20 6f 6e 20 61 20 6e 65  a search on a ne
aaa0: 77 20 4a 53 4f 4e 20 73 74 72 69 6e 67 20 2a 2f  w JSON string */
aab0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e  .static int json
aac0: 45 61 63 68 46 69 6c 74 65 72 28 0a 20 20 73 71  EachFilter(.  sq
aad0: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
aae0: 72 20 2a 63 75 72 2c 0a 20 20 69 6e 74 20 69 64  r *cur,.  int id
aaf0: 78 4e 75 6d 2c 20 63 6f 6e 73 74 20 63 68 61 72  xNum, const char
ab00: 20 2a 69 64 78 53 74 72 2c 0a 20 20 69 6e 74 20   *idxStr,.  int 
ab10: 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
ab20: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
ab30: 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 20 2a  JsonEachCursor *
ab40: 70 20 3d 20 28 4a 73 6f 6e 45 61 63 68 43 75 72  p = (JsonEachCur
ab50: 73 6f 72 2a 29 63 75 72 3b 0a 20 20 63 6f 6e 73  sor*)cur;.  cons
ab60: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63 6f 6e  t char *z;.  con
ab70: 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 3b 0a  st char *zPath;.
ab80: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
ab90: 6e 3b 0a 0a 20 20 6a 73 6f 6e 45 61 63 68 43 75  n;..  jsonEachCu
aba0: 72 73 6f 72 52 65 73 65 74 28 70 29 3b 0a 20 20  rsorReset(p);.  
abb0: 69 66 28 20 69 64 78 4e 75 6d 3d 3d 30 20 29 20  if( idxNum==0 ) 
abc0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
abd0: 3b 0a 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 63  ;.  z = (const c
abe0: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
abf0: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
ac00: 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72  ;.  if( z==0 ) r
ac10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
ac20: 0a 20 20 69 66 28 20 69 64 78 4e 75 6d 26 32 20  .  if( idxNum&2 
ac30: 29 7b 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 28  ){.    zPath = (
ac40: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
ac50: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
ac60: 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 69 66 28  rgv[1]);.    if(
ac70: 20 7a 50 61 74 68 3d 3d 30 20 7c 7c 20 7a 50 61   zPath==0 || zPa
ac80: 74 68 5b 30 5d 21 3d 27 24 27 20 29 20 72 65 74  th[0]!='$' ) ret
ac90: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
aca0: 20 7d 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33   }.  n = sqlite3
acb0: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67  _value_bytes(arg
acc0: 76 5b 30 5d 29 3b 0a 20 20 70 2d 3e 7a 4a 73 6f  v[0]);.  p->zJso
acd0: 6e 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  n = sqlite3_mall
ace0: 6f 63 28 20 6e 2b 31 20 29 3b 0a 20 20 69 66 28  oc( n+1 );.  if(
acf0: 20 70 2d 3e 7a 4a 73 6f 6e 3d 3d 30 20 29 20 72   p->zJson==0 ) r
ad00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
ad10: 45 4d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e  EM;.  memcpy(p->
ad20: 7a 4a 73 6f 6e 2c 20 7a 2c 20 6e 2b 31 29 3b 0a  zJson, z, n+1);.
ad30: 20 20 69 66 28 20 6a 73 6f 6e 50 61 72 73 65 28    if( jsonParse(
ad40: 26 70 2d 3e 73 50 61 72 73 65 2c 20 70 2d 3e 7a  &p->sParse, p->z
ad50: 4a 73 6f 6e 29 20 0a 20 20 20 7c 7c 20 28 70 2d  Json) .   || (p-
ad60: 3e 62 52 65 63 75 72 73 69 76 65 20 26 26 20 6a  >bRecursive && j
ad70: 73 6f 6e 50 61 72 73 65 46 69 6e 64 50 61 72 65  sonParseFindPare
ad80: 6e 74 73 28 26 70 2d 3e 73 50 61 72 73 65 29 29  nts(&p->sParse))
ad90: 0a 20 20 29 7b 0a 20 20 20 20 6a 73 6f 6e 45 61  .  ){.    jsonEa
ada0: 63 68 43 75 72 73 6f 72 52 65 73 65 74 28 70 29  chCursorReset(p)
adb0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4a  ;.  }else{.    J
adc0: 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 3b 0a  sonNode *pNode;.
add0: 20 20 20 20 69 66 28 20 69 64 78 4e 75 6d 3d 3d      if( idxNum==
ade0: 33 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 62 52  3 ){.      p->bR
adf0: 65 63 75 72 73 69 76 65 20 3d 20 30 3b 0a 20 20  ecursive = 0;.  
ae00: 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f      n = sqlite3_
ae10: 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76  value_bytes(argv
ae20: 5b 31 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 7a  [1]);.      p->z
ae30: 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Path = sqlite3_m
ae40: 61 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a 20 20  alloc( n+1 );.  
ae50: 20 20 20 20 69 66 28 20 70 2d 3e 7a 50 61 74 68      if( p->zPath
ae60: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
ae70: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
ae80: 20 6d 65 6d 63 70 79 28 70 2d 3e 7a 50 61 74 68   memcpy(p->zPath
ae90: 2c 20 7a 50 61 74 68 2c 20 6e 2b 31 29 3b 0a 20  , zPath, n+1);. 
aea0: 20 20 20 20 20 70 4e 6f 64 65 20 3d 20 6a 73 6f       pNode = jso
aeb0: 6e 4c 6f 6f 6b 75 70 28 26 70 2d 3e 73 50 61 72  nLookup(&p->sPar
aec0: 73 65 2c 20 30 2c 20 70 2d 3e 7a 50 61 74 68 2b  se, 0, p->zPath+
aed0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  1, 0);.      if(
aee0: 20 70 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20   pNode==0 ){.   
aef0: 20 20 20 20 20 6a 73 6f 6e 45 61 63 68 43 75 72       jsonEachCur
af00: 73 6f 72 52 65 73 65 74 28 70 29 3b 0a 20 20 20  sorReset(p);.   
af10: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
af20: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
af30: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
af40: 70 4e 6f 64 65 20 3d 20 70 2d 3e 73 50 61 72 73  pNode = p->sPars
af50: 65 2e 61 4e 6f 64 65 3b 0a 20 20 20 20 7d 0a 20  e.aNode;.    }. 
af60: 20 20 20 70 2d 3e 69 20 3d 20 28 69 6e 74 29 28     p->i = (int)(
af70: 70 4e 6f 64 65 20 2d 20 70 2d 3e 73 50 61 72 73  pNode - p->sPars
af80: 65 2e 61 4e 6f 64 65 29 3b 0a 20 20 20 20 70 2d  e.aNode);.    p-
af90: 3e 65 54 79 70 65 20 3d 20 70 4e 6f 64 65 2d 3e  >eType = pNode->
afa0: 65 54 79 70 65 3b 0a 20 20 20 20 69 66 28 20 70  eType;.    if( p
afb0: 2d 3e 65 54 79 70 65 3e 3d 4a 53 4f 4e 5f 41 52  ->eType>=JSON_AR
afc0: 52 41 59 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  RAY ){.      p->
afd0: 69 2b 2b 3b 0a 20 20 20 20 20 20 70 2d 3e 69 45  i++;.      p->iE
afe0: 6e 64 20 3d 20 70 2d 3e 69 20 2b 20 70 4e 6f 64  nd = p->i + pNod
aff0: 65 2d 3e 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  e->n;.    }else{
b000: 0a 20 20 20 20 20 20 70 2d 3e 69 45 6e 64 20 3d  .      p->iEnd =
b010: 20 70 2d 3e 69 2b 31 3b 0a 20 20 20 20 7d 0a 20   p->i+1;.    }. 
b020: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
b030: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  TE_OK;.}../* The
b040: 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20   methods of the 
b050: 6a 73 6f 6e 5f 65 61 63 68 20 76 69 72 74 75 61  json_each virtua
b060: 6c 20 74 61 62 6c 65 20 2a 2f 0a 73 74 61 74 69  l table */.stati
b070: 63 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65  c sqlite3_module
b080: 20 6a 73 6f 6e 45 61 63 68 4d 6f 64 75 6c 65 20   jsonEachModule 
b090: 3d 20 7b 0a 20 20 30 2c 20 20 20 20 20 20 20 20  = {.  0,        
b0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0b0: 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a   /* iVersion */.
b0c0: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
b0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b0e0: 78 43 72 65 61 74 65 20 2a 2f 0a 20 20 6a 73 6f  xCreate */.  jso
b0f0: 6e 45 61 63 68 43 6f 6e 6e 65 63 74 2c 20 20 20  nEachConnect,   
b100: 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6e 6e          /* xConn
b110: 65 63 74 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63  ect */.  jsonEac
b120: 68 42 65 73 74 49 6e 64 65 78 2c 20 20 20 20 20  hBestIndex,     
b130: 20 20 20 20 2f 2a 20 78 42 65 73 74 49 6e 64 65      /* xBestInde
b140: 78 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 44  x */.  jsonEachD
b150: 69 73 63 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20  isconnect,      
b160: 20 20 2f 2a 20 78 44 69 73 63 6f 6e 6e 65 63 74    /* xDisconnect
b170: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
b180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b190: 20 2f 2a 20 78 44 65 73 74 72 6f 79 20 2a 2f 0a   /* xDestroy */.
b1a0: 20 20 6a 73 6f 6e 45 61 63 68 4f 70 65 6e 45 61    jsonEachOpenEa
b1b0: 63 68 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ch,          /* 
b1c0: 78 4f 70 65 6e 20 2d 20 6f 70 65 6e 20 61 20 63  xOpen - open a c
b1d0: 75 72 73 6f 72 20 2a 2f 0a 20 20 6a 73 6f 6e 45  ursor */.  jsonE
b1e0: 61 63 68 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  achClose,       
b1f0: 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
b200: 2d 20 63 6c 6f 73 65 20 61 20 63 75 72 73 6f 72  - close a cursor
b210: 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 46 69   */.  jsonEachFi
b220: 6c 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  lter,           
b230: 20 2f 2a 20 78 46 69 6c 74 65 72 20 2d 20 63 6f   /* xFilter - co
b240: 6e 66 69 67 75 72 65 20 73 63 61 6e 20 63 6f 6e  nfigure scan con
b250: 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 6a 73  straints */.  js
b260: 6f 6e 45 61 63 68 4e 65 78 74 2c 20 20 20 20 20  onEachNext,     
b270: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4e 65 78           /* xNex
b280: 74 20 2d 20 61 64 76 61 6e 63 65 20 61 20 63 75  t - advance a cu
b290: 72 73 6f 72 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61  rsor */.  jsonEa
b2a0: 63 68 45 6f 66 2c 20 20 20 20 20 20 20 20 20 20  chEof,          
b2b0: 20 20 20 20 20 2f 2a 20 78 45 6f 66 20 2d 20 63       /* xEof - c
b2c0: 68 65 63 6b 20 66 6f 72 20 65 6e 64 20 6f 66 20  heck for end of 
b2d0: 73 63 61 6e 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61  scan */.  jsonEa
b2e0: 63 68 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20  chColumn,       
b2f0: 20 20 20 20 20 2f 2a 20 78 43 6f 6c 75 6d 6e 20       /* xColumn 
b300: 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f 0a 20  - read data */. 
b310: 20 6a 73 6f 6e 45 61 63 68 52 6f 77 69 64 2c 20   jsonEachRowid, 
b320: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
b330: 52 6f 77 69 64 20 2d 20 72 65 61 64 20 64 61 74  Rowid - read dat
b340: 61 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  a */.  0,       
b350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b360: 20 20 2f 2a 20 78 55 70 64 61 74 65 20 2a 2f 0a    /* xUpdate */.
b370: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
b380: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b390: 78 42 65 67 69 6e 20 2a 2f 0a 20 20 30 2c 20 20  xBegin */.  0,  
b3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3b0: 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20         /* xSync 
b3c0: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
b3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3e0: 2f 2a 20 78 43 6f 6d 6d 69 74 20 2a 2f 0a 20 20  /* xCommit */.  
b3f0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
b400: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
b410: 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 30 2c 20  ollback */.  0, 
b420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b430: 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6e 64          /* xFind
b440: 4d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 2c 20 20  Method */.  0,  
b450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b460: 20 20 20 20 20 20 20 2f 2a 20 78 52 65 6e 61 6d         /* xRenam
b470: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 20  e */.};../* The 
b480: 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20 6a  methods of the j
b490: 73 6f 6e 5f 74 72 65 65 20 76 69 72 74 75 61 6c  son_tree virtual
b4a0: 20 74 61 62 6c 65 2e 20 2a 2f 0a 73 74 61 74 69   table. */.stati
b4b0: 63 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65  c sqlite3_module
b4c0: 20 6a 73 6f 6e 54 72 65 65 4d 6f 64 75 6c 65 20   jsonTreeModule 
b4d0: 3d 20 7b 0a 20 20 30 2c 20 20 20 20 20 20 20 20  = {.  0,        
b4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4f0: 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a   /* iVersion */.
b500: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
b510: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b520: 78 43 72 65 61 74 65 20 2a 2f 0a 20 20 6a 73 6f  xCreate */.  jso
b530: 6e 45 61 63 68 43 6f 6e 6e 65 63 74 2c 20 20 20  nEachConnect,   
b540: 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6e 6e          /* xConn
b550: 65 63 74 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63  ect */.  jsonEac
b560: 68 42 65 73 74 49 6e 64 65 78 2c 20 20 20 20 20  hBestIndex,     
b570: 20 20 20 20 2f 2a 20 78 42 65 73 74 49 6e 64 65      /* xBestInde
b580: 78 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 44  x */.  jsonEachD
b590: 69 73 63 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20  isconnect,      
b5a0: 20 20 2f 2a 20 78 44 69 73 63 6f 6e 6e 65 63 74    /* xDisconnect
b5b0: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
b5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5d0: 20 2f 2a 20 78 44 65 73 74 72 6f 79 20 2a 2f 0a   /* xDestroy */.
b5e0: 20 20 6a 73 6f 6e 45 61 63 68 4f 70 65 6e 54 72    jsonEachOpenTr
b5f0: 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ee,          /* 
b600: 78 4f 70 65 6e 20 2d 20 6f 70 65 6e 20 61 20 63  xOpen - open a c
b610: 75 72 73 6f 72 20 2a 2f 0a 20 20 6a 73 6f 6e 45  ursor */.  jsonE
b620: 61 63 68 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  achClose,       
b630: 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
b640: 2d 20 63 6c 6f 73 65 20 61 20 63 75 72 73 6f 72  - close a cursor
b650: 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 46 69   */.  jsonEachFi
b660: 6c 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  lter,           
b670: 20 2f 2a 20 78 46 69 6c 74 65 72 20 2d 20 63 6f   /* xFilter - co
b680: 6e 66 69 67 75 72 65 20 73 63 61 6e 20 63 6f 6e  nfigure scan con
b690: 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 6a 73  straints */.  js
b6a0: 6f 6e 45 61 63 68 4e 65 78 74 2c 20 20 20 20 20  onEachNext,     
b6b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4e 65 78           /* xNex
b6c0: 74 20 2d 20 61 64 76 61 6e 63 65 20 61 20 63 75  t - advance a cu
b6d0: 72 73 6f 72 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61  rsor */.  jsonEa
b6e0: 63 68 45 6f 66 2c 20 20 20 20 20 20 20 20 20 20  chEof,          
b6f0: 20 20 20 20 20 2f 2a 20 78 45 6f 66 20 2d 20 63       /* xEof - c
b700: 68 65 63 6b 20 66 6f 72 20 65 6e 64 20 6f 66 20  heck for end of 
b710: 73 63 61 6e 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61  scan */.  jsonEa
b720: 63 68 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20  chColumn,       
b730: 20 20 20 20 20 2f 2a 20 78 43 6f 6c 75 6d 6e 20       /* xColumn 
b740: 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f 0a 20  - read data */. 
b750: 20 6a 73 6f 6e 45 61 63 68 52 6f 77 69 64 2c 20   jsonEachRowid, 
b760: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
b770: 52 6f 77 69 64 20 2d 20 72 65 61 64 20 64 61 74  Rowid - read dat
b780: 61 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  a */.  0,       
b790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7a0: 20 20 2f 2a 20 78 55 70 64 61 74 65 20 2a 2f 0a    /* xUpdate */.
b7b0: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
b7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b7d0: 78 42 65 67 69 6e 20 2a 2f 0a 20 20 30 2c 20 20  xBegin */.  0,  
b7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7f0: 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20         /* xSync 
b800: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
b810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b820: 2f 2a 20 78 43 6f 6d 6d 69 74 20 2a 2f 0a 20 20  /* xCommit */.  
b830: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
b840: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
b850: 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 30 2c 20  ollback */.  0, 
b860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b870: 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6e 64          /* xFind
b880: 4d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 2c 20 20  Method */.  0,  
b890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8a0: 20 20 20 20 20 20 20 2f 2a 20 78 52 65 6e 61 6d         /* xRenam
b8b0: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a  e */.};../******
b8c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b8d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b8e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b8f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b900: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  ******.** The fo
b910: 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20  llowing routine 
b920: 69 73 20 74 68 65 20 6f 6e 6c 79 20 70 75 62 6c  is the only publ
b930: 69 63 61 6c 6c 79 20 76 69 73 69 62 6c 65 20 69  ically visible i
b940: 64 65 6e 74 69 66 69 65 72 20 69 6e 20 74 68 69  dentifier in thi
b950: 73 0a 2a 2a 20 66 69 6c 65 2e 20 20 43 61 6c 6c  s.** file.  Call
b960: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   the following r
b970: 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20  outine in order 
b980: 74 6f 20 72 65 67 69 73 74 65 72 20 74 68 65 20  to register the 
b990: 76 61 72 69 6f 75 73 20 53 51 4c 0a 2a 2a 20 66  various SQL.** f
b9a0: 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  unctions and the
b9b0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69   virtual table i
b9c0: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 74 68  mplemented by th
b9d0: 69 73 20 66 69 6c 65 2e 0a 2a 2a 2a 2a 2a 2a 2a  is file..*******
b9e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b9f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ba00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ba10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ba20: 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66 64 65 66 20 5f  *****/..#ifdef _
ba30: 57 49 4e 33 32 0a 5f 5f 64 65 63 6c 73 70 65 63  WIN32.__declspec
ba40: 28 64 6c 6c 65 78 70 6f 72 74 29 0a 23 65 6e 64  (dllexport).#end
ba50: 69 66 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6a  if.int sqlite3_j
ba60: 73 6f 6e 5f 69 6e 69 74 28 0a 20 20 73 71 6c 69  son_init(.  sqli
ba70: 74 65 33 20 2a 64 62 2c 20 0a 20 20 63 68 61 72  te3 *db, .  char
ba80: 20 2a 2a 70 7a 45 72 72 4d 73 67 2c 20 0a 20 20   **pzErrMsg, .  
ba90: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70  const sqlite3_ap
baa0: 69 5f 72 6f 75 74 69 6e 65 73 20 2a 70 41 70 69  i_routines *pApi
bab0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
bac0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
bad0: 69 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  i;.  static cons
bae0: 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20  t struct {.     
baf0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
bb00: 65 3b 0a 20 20 20 20 20 69 6e 74 20 6e 41 72 67  e;.     int nArg
bb10: 3b 0a 20 20 20 20 20 69 6e 74 20 66 6c 61 67 3b  ;.     int flag;
bb20: 0a 20 20 20 20 20 76 6f 69 64 20 28 2a 78 46 75  .     void (*xFu
bb30: 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  nc)(sqlite3_cont
bb40: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
bb50: 5f 76 61 6c 75 65 2a 2a 29 3b 0a 20 20 7d 20 61  _value**);.  } a
bb60: 46 75 6e 63 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b  Func[] = {.    {
bb70: 20 22 6a 73 6f 6e 5f 61 72 72 61 79 22 2c 20 20   "json_array",  
bb80: 20 20 20 20 20 20 20 20 2d 31 2c 20 30 2c 20 20          -1, 0,  
bb90: 20 6a 73 6f 6e 41 72 72 61 79 46 75 6e 63 20 20   jsonArrayFunc  
bba0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
bbb0: 22 6a 73 6f 6e 5f 61 72 72 61 79 5f 6c 65 6e 67  "json_array_leng
bbc0: 74 68 22 2c 20 20 20 20 31 2c 20 30 2c 20 20 20  th",    1, 0,   
bbd0: 6a 73 6f 6e 41 72 72 61 79 4c 65 6e 67 74 68 46  jsonArrayLengthF
bbe0: 75 6e 63 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22  unc   },.    { "
bbf0: 6a 73 6f 6e 5f 61 72 72 61 79 5f 6c 65 6e 67 74  json_array_lengt
bc00: 68 22 2c 20 20 20 20 32 2c 20 30 2c 20 20 20 6a  h",    2, 0,   j
bc10: 73 6f 6e 41 72 72 61 79 4c 65 6e 67 74 68 46 75  sonArrayLengthFu
bc20: 6e 63 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a  nc   },.    { "j
bc30: 73 6f 6e 5f 65 78 74 72 61 63 74 22 2c 20 20 20  son_extract",   
bc40: 20 20 20 20 20 20 32 2c 20 30 2c 20 20 20 6a 73        2, 0,   js
bc50: 6f 6e 45 78 74 72 61 63 74 46 75 6e 63 20 20 20  onExtractFunc   
bc60: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73      },.    { "js
bc70: 6f 6e 5f 69 6e 73 65 72 74 22 2c 20 20 20 20 20  on_insert",     
bc80: 20 20 20 20 2d 31 2c 20 30 2c 20 20 20 6a 73 6f      -1, 0,   jso
bc90: 6e 53 65 74 46 75 6e 63 20 20 20 20 20 20 20 20  nSetFunc        
bca0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f     },.    { "jso
bcb0: 6e 5f 6f 62 6a 65 63 74 22 2c 20 20 20 20 20 20  n_object",      
bcc0: 20 20 20 2d 31 2c 20 30 2c 20 20 20 6a 73 6f 6e     -1, 0,   json
bcd0: 4f 62 6a 65 63 74 46 75 6e 63 20 20 20 20 20 20  ObjectFunc      
bce0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e    },.    { "json
bcf0: 5f 72 65 6d 6f 76 65 22 2c 20 20 20 20 20 20 20  _remove",       
bd00: 20 20 2d 31 2c 20 30 2c 20 20 20 6a 73 6f 6e 52    -1, 0,   jsonR
bd10: 65 6d 6f 76 65 46 75 6e 63 20 20 20 20 20 20 20  emoveFunc       
bd20: 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f   },.    { "json_
bd30: 72 65 70 6c 61 63 65 22 2c 20 20 20 20 20 20 20  replace",       
bd40: 20 2d 31 2c 20 30 2c 20 20 20 6a 73 6f 6e 52 65   -1, 0,   jsonRe
bd50: 70 6c 61 63 65 46 75 6e 63 20 20 20 20 20 20 20  placeFunc       
bd60: 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 73  },.    { "json_s
bd70: 65 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  et",            
bd80: 2d 31 2c 20 31 2c 20 20 20 6a 73 6f 6e 53 65 74  -1, 1,   jsonSet
bd90: 46 75 6e 63 20 20 20 20 20 20 20 20 20 20 20 7d  Func           }
bda0: 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 74 79  ,.    { "json_ty
bdb0: 70 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  pe",            
bdc0: 31 2c 20 30 2c 20 20 20 6a 73 6f 6e 54 79 70 65  1, 0,   jsonType
bdd0: 46 75 6e 63 20 20 20 20 20 20 20 20 20 20 7d 2c  Func          },
bde0: 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 74 79 70  .    { "json_typ
bdf0: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 32  e",            2
be00: 2c 20 30 2c 20 20 20 6a 73 6f 6e 54 79 70 65 46  , 0,   jsonTypeF
be10: 75 6e 63 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  unc          },.
be20: 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55  .#if SQLITE_DEBU
be30: 47 0a 20 20 20 20 2f 2a 20 44 45 42 55 47 20 61  G.    /* DEBUG a
be40: 6e 64 20 54 45 53 54 49 4e 47 20 66 75 6e 63 74  nd TESTING funct
be50: 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 7b 20 22 6a  ions */.    { "j
be60: 73 6f 6e 5f 70 61 72 73 65 22 2c 20 20 20 20 20  son_parse",     
be70: 20 20 20 20 20 20 31 2c 20 30 2c 20 20 20 6a 73        1, 0,   js
be80: 6f 6e 50 61 72 73 65 46 75 6e 63 20 20 20 20 20  onParseFunc     
be90: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73      },.    { "js
bea0: 6f 6e 5f 74 65 73 74 31 22 2c 20 20 20 20 20 20  on_test1",      
beb0: 20 20 20 20 20 31 2c 20 30 2c 20 20 20 6a 73 6f       1, 0,   jso
bec0: 6e 54 65 73 74 31 46 75 6e 63 20 20 20 20 20 20  nTest1Func      
bed0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f     },.    { "jso
bee0: 6e 5f 6e 6f 64 65 63 6f 75 6e 74 22 2c 20 20 20  n_nodecount",   
bef0: 20 20 20 20 31 2c 20 30 2c 20 20 20 6a 73 6f 6e      1, 0,   json
bf00: 4e 6f 64 65 43 6f 75 6e 74 46 75 6e 63 20 20 20  NodeCountFunc   
bf10: 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 7d 3b    },.#endif.  };
bf20: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
bf30: 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 63 6f  struct {.     co
bf40: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
bf50: 0a 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 6f  .     sqlite3_mo
bf60: 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 3b 0a 20  dule *pModule;. 
bf70: 20 7d 20 61 4d 6f 64 5b 5d 20 3d 20 7b 0a 20 20   } aMod[] = {.  
bf80: 20 20 7b 20 22 6a 73 6f 6e 5f 65 61 63 68 22 2c    { "json_each",
bf90: 20 20 20 20 20 20 20 20 20 20 20 20 26 6a 73 6f              &jso
bfa0: 6e 45 61 63 68 4d 6f 64 75 6c 65 20 20 20 20 20  nEachModule     
bfb0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
bfc0: 20 7b 20 22 6a 73 6f 6e 5f 74 72 65 65 22 2c 20   { "json_tree", 
bfd0: 20 20 20 20 20 20 20 20 20 20 20 26 6a 73 6f 6e             &json
bfe0: 54 72 65 65 4d 6f 64 75 6c 65 20 20 20 20 20 20  TreeModule      
bff0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b           },.  };
c000: 0a 20 20 53 51 4c 49 54 45 5f 45 58 54 45 4e 53  .  SQLITE_EXTENS
c010: 49 4f 4e 5f 49 4e 49 54 32 28 70 41 70 69 29 3b  ION_INIT2(pApi);
c020: 0a 20 20 28 76 6f 69 64 29 70 7a 45 72 72 4d 73  .  (void)pzErrMs
c030: 67 3b 20 20 2f 2a 20 55 6e 75 73 65 64 20 70 61  g;  /* Unused pa
c040: 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 66 6f 72  rameter */.  for
c050: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
c060: 46 75 6e 63 29 2f 73 69 7a 65 6f 66 28 61 46 75  Func)/sizeof(aFu
c070: 6e 63 5b 30 5d 29 20 26 26 20 72 63 3d 3d 53 51  nc[0]) && rc==SQ
c080: 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20  LITE_OK; i++){. 
c090: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
c0a0: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
c0b0: 64 62 2c 20 61 46 75 6e 63 5b 69 5d 2e 7a 4e 61  db, aFunc[i].zNa
c0c0: 6d 65 2c 20 61 46 75 6e 63 5b 69 5d 2e 6e 41 72  me, aFunc[i].nAr
c0d0: 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  g,.             
c0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0f0: 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20      SQLITE_UTF8 
c100: 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
c110: 4e 49 53 54 49 43 2c 20 0a 20 20 20 20 20 20 20  NISTIC, .       
c120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c130: 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
c140: 29 26 61 46 75 6e 63 5b 69 5d 2e 66 6c 61 67 2c  )&aFunc[i].flag,
c150: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c170: 20 20 61 46 75 6e 63 5b 69 5d 2e 78 46 75 6e 63    aFunc[i].xFunc
c180: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 66  , 0, 0);.  }.  f
c190: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
c1a0: 28 61 4d 6f 64 29 2f 73 69 7a 65 6f 66 28 61 4d  (aMod)/sizeof(aM
c1b0: 6f 64 5b 30 5d 29 20 26 26 20 72 63 3d 3d 53 51  od[0]) && rc==SQ
c1c0: 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20  LITE_OK; i++){. 
c1d0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
c1e0: 63 72 65 61 74 65 5f 6d 6f 64 75 6c 65 28 64 62  create_module(db
c1f0: 2c 20 61 4d 6f 64 5b 69 5d 2e 7a 4e 61 6d 65 2c  , aMod[i].zName,
c200: 20 61 4d 6f 64 5b 69 5d 2e 70 4d 6f 64 75 6c 65   aMod[i].pModule
c210: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
c220: 72 6e 20 72 63 3b 0a 7d 0a                       rn rc;.}.