System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact b359b46caa40212efd9bd7874ea3f5415ae6deef:


0000: 2f 2a 0a 2a 2a 20 32 30 31 35 2d 30 38 2d 31 32  /*.** 2015-08-12
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ****.**.** This 
0180: 53 51 4c 69 74 65 20 65 78 74 65 6e 73 69 6f 6e  SQLite extension
0190: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 4a 53 4f 4e   implements JSON
01a0: 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68 65   functions.  The
01b0: 20 69 6e 74 65 72 66 61 63 65 20 69 73 0a 2a 2a   interface is.**
01c0: 20 6d 6f 64 65 6c 65 64 20 61 66 74 65 72 20 4d   modeled after M
01d0: 79 53 51 4c 20 4a 53 4f 4e 20 66 75 6e 63 74 69  ySQL JSON functi
01e0: 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 68  ons:.**.**     h
01f0: 74 74 70 73 3a 2f 2f 64 65 76 2e 6d 79 73 71 6c  ttps://dev.mysql
0200: 2e 63 6f 6d 2f 64 6f 63 2f 72 65 66 6d 61 6e 2f  .com/doc/refman/
0210: 35 2e 37 2f 65 6e 2f 6a 73 6f 6e 2e 68 74 6d 6c  5.7/en/json.html
0220: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 74  .**.** For the t
0230: 69 6d 65 20 62 65 69 6e 67 2c 20 61 6c 6c 20 4a  ime being, all J
0240: 53 4f 4e 20 69 73 20 73 74 6f 72 65 64 20 61 73  SON is stored as
0250: 20 70 75 72 65 20 74 65 78 74 2e 20 20 28 57 65   pure text.  (We
0260: 20 6d 69 67 68 74 20 61 64 64 0a 2a 2a 20 61 20   might add.** a 
0270: 4a 53 4f 4e 42 20 74 79 70 65 20 69 6e 20 74 68  JSONB type in th
0280: 65 20 66 75 74 75 72 65 20 77 68 69 63 68 20 73  e future which s
0290: 74 6f 72 65 73 20 61 20 62 69 6e 61 72 79 20 65  tores a binary e
02a0: 6e 63 6f 64 69 6e 67 20 6f 66 20 4a 53 4f 4e 20  ncoding of JSON 
02b0: 69 6e 0a 2a 2a 20 61 20 42 4c 4f 42 2c 20 62 75  in.** a BLOB, bu
02c0: 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75  t there is no su
02d0: 70 70 6f 72 74 20 66 6f 72 20 4a 53 4f 4e 42 20  pport for JSONB 
02e0: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  in the current i
02f0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a  mplementation..*
0300: 2a 20 54 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74  * This implement
0310: 61 74 69 6f 6e 20 70 61 72 73 65 73 20 4a 53 4f  ation parses JSO
0320: 4e 20 74 65 78 74 20 61 74 20 32 35 30 20 4d 42  N text at 250 MB
0330: 2f 73 2c 20 73 6f 20 69 74 20 69 73 20 68 61 72  /s, so it is har
0340: 64 20 74 6f 20 73 65 65 0a 2a 2a 20 68 6f 77 20  d to see.** how 
0350: 4a 53 4f 4e 42 20 6d 69 67 68 74 20 69 6d 70 72  JSONB might impr
0360: 6f 76 65 20 6f 6e 20 74 68 61 74 2e 29 0a 2a 2f  ove on that.).*/
0370: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
0380: 4c 49 54 45 5f 43 4f 52 45 29 20 7c 7c 20 64 65  LITE_CORE) || de
0390: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
03a0: 42 4c 45 5f 4a 53 4f 4e 31 29 0a 23 69 66 20 21  BLE_JSON1).#if !
03b0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 49 4e  defined(SQLITEIN
03c0: 54 5f 48 29 0a 23 69 6e 63 6c 75 64 65 20 22 73  T_H).#include "s
03d0: 71 6c 69 74 65 33 65 78 74 2e 68 22 0a 23 65 6e  qlite3ext.h".#en
03e0: 64 69 66 0a 53 51 4c 49 54 45 5f 45 58 54 45 4e  dif.SQLITE_EXTEN
03f0: 53 49 4f 4e 5f 49 4e 49 54 31 0a 23 69 6e 63 6c  SION_INIT1.#incl
0400: 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23  ude <assert.h>.#
0410: 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e  include <string.
0420: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  h>.#include <std
0430: 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  lib.h>.#include 
0440: 3c 73 74 64 61 72 67 2e 68 3e 0a 0a 2f 2a 20 4d  <stdarg.h>../* M
0450: 61 72 6b 20 61 20 66 75 6e 63 74 69 6f 6e 20 70  ark a function p
0460: 61 72 61 6d 65 74 65 72 20 61 73 20 75 6e 75 73  arameter as unus
0470: 65 64 2c 20 74 6f 20 73 75 70 70 72 65 73 73 20  ed, to suppress 
0480: 6e 75 69 73 61 6e 63 65 20 63 6f 6d 70 69 6c 65  nuisance compile
0490: 72 0a 2a 2a 20 77 61 72 6e 69 6e 67 73 2e 20 2a  r.** warnings. *
04a0: 2f 0a 23 69 66 6e 64 65 66 20 55 4e 55 53 45 44  /.#ifndef UNUSED
04b0: 5f 50 41 52 41 4d 0a 23 20 64 65 66 69 6e 65 20  _PARAM.# define 
04c0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 58 29 20  UNUSED_PARAM(X) 
04d0: 20 28 76 6f 69 64 29 28 58 29 0a 23 65 6e 64 69   (void)(X).#endi
04e0: 66 0a 0a 23 69 66 6e 64 65 66 20 4c 41 52 47 45  f..#ifndef LARGE
04f0: 53 54 5f 49 4e 54 36 34 0a 23 20 64 65 66 69 6e  ST_INT64.# defin
0500: 65 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 20  e LARGEST_INT64 
0510: 20 28 30 78 66 66 66 66 66 66 66 66 7c 28 28 28   (0xffffffff|(((
0520: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 30 78  sqlite3_int64)0x
0530: 37 66 66 66 66 66 66 66 29 3c 3c 33 32 29 29 0a  7fffffff)<<32)).
0540: 23 20 64 65 66 69 6e 65 20 53 4d 41 4c 4c 45 53  # define SMALLES
0550: 54 5f 49 4e 54 36 34 20 28 28 28 73 71 6c 69 74  T_INT64 (((sqlit
0560: 65 33 5f 69 6e 74 36 34 29 2d 31 29 20 2d 20 4c  e3_int64)-1) - L
0570: 41 52 47 45 53 54 5f 49 4e 54 36 34 29 0a 23 65  ARGEST_INT64).#e
0580: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 73  ndif../*.** Vers
0590: 69 6f 6e 73 20 6f 66 20 69 73 73 70 61 63 65 28  ions of isspace(
05a0: 29 2c 20 69 73 61 6c 6e 75 6d 28 29 20 61 6e 64  ), isalnum() and
05b0: 20 69 73 64 69 67 69 74 28 29 20 74 6f 20 77 68   isdigit() to wh
05c0: 69 63 68 20 69 74 20 69 73 20 73 61 66 65 0a 2a  ich it is safe.*
05d0: 2a 20 74 6f 20 70 61 73 73 20 73 69 67 6e 65 64  * to pass signed
05e0: 20 63 68 61 72 20 76 61 6c 75 65 73 2e 0a 2a 2f   char values..*/
05f0: 0a 23 69 66 64 65 66 20 73 71 6c 69 74 65 33 49  .#ifdef sqlite3I
0600: 73 64 69 67 69 74 0a 20 20 20 2f 2a 20 55 73 65  sdigit.   /* Use
0610: 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65   the SQLite core
0620: 20 76 65 72 73 69 6f 6e 73 20 69 66 20 74 68 69   versions if thi
0630: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72  s routine is par
0640: 74 20 6f 66 20 74 68 65 0a 20 20 20 2a 2a 20 53  t of the.   ** S
0650: 51 4c 69 74 65 20 61 6d 61 6c 67 61 6d 61 74 69  QLite amalgamati
0660: 6f 6e 20 2a 2f 0a 23 20 20 64 65 66 69 6e 65 20  on */.#  define 
0670: 73 61 66 65 5f 69 73 64 69 67 69 74 28 78 29 20  safe_isdigit(x) 
0680: 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28   sqlite3Isdigit(
0690: 78 29 0a 23 20 20 64 65 66 69 6e 65 20 73 61 66  x).#  define saf
06a0: 65 5f 69 73 61 6c 6e 75 6d 28 78 29 20 20 73 71  e_isalnum(x)  sq
06b0: 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 78 29 0a  lite3Isalnum(x).
06c0: 23 20 20 64 65 66 69 6e 65 20 73 61 66 65 5f 69  #  define safe_i
06d0: 73 78 64 69 67 69 74 28 78 29 20 73 71 6c 69 74  sxdigit(x) sqlit
06e0: 65 33 49 73 78 64 69 67 69 74 28 78 29 0a 23 65  e3Isxdigit(x).#e
06f0: 6c 73 65 0a 20 20 20 2f 2a 20 55 73 65 20 74 68  lse.   /* Use th
0700: 65 20 73 74 61 6e 64 61 72 64 20 6c 69 62 72 61  e standard libra
0710: 72 79 20 66 6f 72 20 73 65 70 61 72 61 74 65 20  ry for separate 
0720: 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 2a 2f 0a 23  compilation */.#
0730: 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68  include <ctype.h
0740: 3e 20 20 2f 2a 20 61 6d 61 6c 67 61 6d 61 74 6f  >  /* amalgamato
0750: 72 3a 20 6b 65 65 70 20 2a 2f 0a 23 20 20 64 65  r: keep */.#  de
0760: 66 69 6e 65 20 73 61 66 65 5f 69 73 64 69 67 69  fine safe_isdigi
0770: 74 28 78 29 20 20 69 73 64 69 67 69 74 28 28 75  t(x)  isdigit((u
0780: 6e 73 69 67 6e 65 64 20 63 68 61 72 29 28 78 29  nsigned char)(x)
0790: 29 0a 23 20 20 64 65 66 69 6e 65 20 73 61 66 65  ).#  define safe
07a0: 5f 69 73 61 6c 6e 75 6d 28 78 29 20 20 69 73 61  _isalnum(x)  isa
07b0: 6c 6e 75 6d 28 28 75 6e 73 69 67 6e 65 64 20 63  lnum((unsigned c
07c0: 68 61 72 29 28 78 29 29 0a 23 20 20 64 65 66 69  har)(x)).#  defi
07d0: 6e 65 20 73 61 66 65 5f 69 73 78 64 69 67 69 74  ne safe_isxdigit
07e0: 28 78 29 20 69 73 78 64 69 67 69 74 28 28 75 6e  (x) isxdigit((un
07f0: 73 69 67 6e 65 64 20 63 68 61 72 29 28 78 29 29  signed char)(x))
0800: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
0810: 72 6f 77 69 6e 67 20 6f 75 72 20 6f 77 6e 20 69  rowing our own i
0820: 73 73 70 61 63 65 28 29 20 72 6f 75 74 69 6e 65  sspace() routine
0830: 20 74 68 69 73 20 77 61 79 20 69 73 20 74 77 69   this way is twi
0840: 63 65 20 61 73 20 66 61 73 74 20 61 73 0a 2a 2a  ce as fast as.**
0850: 20 74 68 65 20 6c 69 62 72 61 72 79 20 69 73 73   the library iss
0860: 70 61 63 65 28 29 20 66 75 6e 63 74 69 6f 6e 2c  pace() function,
0870: 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 20   resulting in a 
0880: 37 25 20 6f 76 65 72 61 6c 6c 20 70 65 72 66 6f  7% overall perfo
0890: 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 63 72 65 61  rmance.** increa
08a0: 73 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65  se for the parse
08b0: 72 2e 20 20 28 55 62 75 6e 74 75 31 34 2e 31 30  r.  (Ubuntu14.10
08c0: 20 67 63 63 20 34 2e 38 2e 34 20 78 36 34 20 77   gcc 4.8.4 x64 w
08d0: 69 74 68 20 2d 4f 73 29 2e 0a 2a 2f 0a 73 74 61  ith -Os)..*/.sta
08e0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6a  tic const char j
08f0: 73 6f 6e 49 73 53 70 61 63 65 5b 5d 20 3d 20 7b  sonIsSpace[] = {
0900: 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  .  0, 0, 0, 0, 0
0910: 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 20 20 30  , 0, 0, 0,     0
0920: 2c 20 31 2c 20 31 2c 20 30 2c 20 30 2c 20 31 2c  , 1, 1, 0, 0, 1,
0930: 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30   0, 0,.  0, 0, 0
0940: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0950: 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c       0, 0, 0, 0,
0960: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 31   0, 0, 0, 0,.  1
0970: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0980: 20 30 2c 20 30 2c 20 20 20 20 20 30 2c 20 30 2c   0, 0,     0, 0,
0990: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
09a0: 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  0,.  0, 0, 0, 0,
09b0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 20   0, 0, 0, 0,    
09c0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
09d0: 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c  0, 0, 0,.  0, 0,
09e0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
09f0: 30 2c 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20  0,     0, 0, 0, 
0a00: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  0, 0, 0, 0, 0,. 
0a10: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0a20: 30 2c 20 30 2c 20 30 2c 20 20 20 20 20 30 2c 20  0, 0, 0,     0, 
0a30: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0a40: 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20  , 0,.  0, 0, 0, 
0a50: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20  0, 0, 0, 0, 0,  
0a60: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
0a70: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20  , 0, 0, 0,.  0, 
0a80: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0a90: 2c 20 30 2c 20 20 20 20 20 30 2c 20 30 2c 20 30  , 0,     0, 0, 0
0aa0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0ab0: 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  .  0, 0, 0, 0, 0
0ac0: 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 20 20 30  , 0, 0, 0,     0
0ad0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0ae0: 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30   0, 0,.  0, 0, 0
0af0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0b00: 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c       0, 0, 0, 0,
0b10: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30   0, 0, 0, 0,.  0
0b20: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0b30: 20 30 2c 20 30 2c 20 20 20 20 20 30 2c 20 30 2c   0, 0,     0, 0,
0b40: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0b50: 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  0,.  0, 0, 0, 0,
0b60: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 20   0, 0, 0, 0,    
0b70: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0b80: 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c  0, 0, 0,.  0, 0,
0b90: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0ba0: 30 2c 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20  0,     0, 0, 0, 
0bb0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  0, 0, 0, 0, 0,. 
0bc0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0bd0: 30 2c 20 30 2c 20 30 2c 20 20 20 20 20 30 2c 20  0, 0, 0,     0, 
0be0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0bf0: 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20  , 0,.  0, 0, 0, 
0c00: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20  0, 0, 0, 0, 0,  
0c10: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
0c20: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20  , 0, 0, 0,.  0, 
0c30: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0c40: 2c 20 30 2c 20 20 20 20 20 30 2c 20 30 2c 20 30  , 0,     0, 0, 0
0c50: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0c60: 0a 7d 3b 0a 23 64 65 66 69 6e 65 20 73 61 66 65  .};.#define safe
0c70: 5f 69 73 73 70 61 63 65 28 78 29 20 28 6a 73 6f  _isspace(x) (jso
0c80: 6e 49 73 53 70 61 63 65 5b 28 75 6e 73 69 67 6e  nIsSpace[(unsign
0c90: 65 64 20 63 68 61 72 29 78 5d 29 0a 0a 23 69 66  ed char)x])..#if
0ca0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d 41 4c  ndef SQLITE_AMAL
0cb0: 47 41 4d 41 54 49 4f 4e 0a 20 20 2f 2a 20 55 6e  GAMATION.  /* Un
0cc0: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 74  signed integer t
0cd0: 79 70 65 73 2e 20 20 54 68 65 73 65 20 61 72 65  ypes.  These are
0ce0: 20 61 6c 72 65 61 64 79 20 64 65 66 69 6e 65 64   already defined
0cf0: 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 49 6e   in the sqliteIn
0d00: 74 2e 68 2c 0a 20 20 2a 2a 20 62 75 74 20 74 68  t.h,.  ** but th
0d10: 65 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6e 65  e definitions ne
0d20: 65 64 20 74 6f 20 62 65 20 72 65 70 65 61 74 65  ed to be repeate
0d30: 64 20 66 6f 72 20 73 65 70 61 72 61 74 65 20 63  d for separate c
0d40: 6f 6d 70 69 6c 61 74 69 6f 6e 2e 20 2a 2f 0a 20  ompilation. */. 
0d50: 20 74 79 70 65 64 65 66 20 73 71 6c 69 74 65 33   typedef sqlite3
0d60: 5f 75 69 6e 74 36 34 20 75 36 34 3b 0a 20 20 74  _uint64 u64;.  t
0d70: 79 70 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20  ypedef unsigned 
0d80: 69 6e 74 20 75 33 32 3b 0a 20 20 74 79 70 65 64  int u32;.  typed
0d90: 65 66 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72  ef unsigned shor
0da0: 74 20 69 6e 74 20 75 31 36 3b 0a 20 20 74 79 70  t int u16;.  typ
0db0: 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20 63 68  edef unsigned ch
0dc0: 61 72 20 75 38 3b 0a 23 65 6e 64 69 66 0a 0a 2f  ar u8;.#endif../
0dd0: 2a 20 4f 62 6a 65 63 74 73 20 2a 2f 0a 74 79 70  * Objects */.typ
0de0: 65 64 65 66 20 73 74 72 75 63 74 20 4a 73 6f 6e  edef struct Json
0df0: 53 74 72 69 6e 67 20 4a 73 6f 6e 53 74 72 69 6e  String JsonStrin
0e00: 67 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  g;.typedef struc
0e10: 74 20 4a 73 6f 6e 4e 6f 64 65 20 4a 73 6f 6e 4e  t JsonNode JsonN
0e20: 6f 64 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ode;.typedef str
0e30: 75 63 74 20 4a 73 6f 6e 50 61 72 73 65 20 4a 73  uct JsonParse Js
0e40: 6f 6e 50 61 72 73 65 3b 0a 0a 2f 2a 20 41 6e 20  onParse;../* An 
0e50: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
0e60: 20 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e   object represen
0e70: 74 73 20 61 20 4a 53 4f 4e 20 73 74 72 69 6e 67  ts a JSON string
0e80: 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  .** under constr
0e90: 75 63 74 69 6f 6e 2e 20 20 52 65 61 6c 6c 79 2c  uction.  Really,
0ea0: 20 74 68 69 73 20 69 73 20 61 20 67 65 6e 65 72   this is a gener
0eb0: 69 63 20 73 74 72 69 6e 67 20 61 63 63 75 6d 75  ic string accumu
0ec0: 6c 61 74 6f 72 0a 2a 2a 20 74 68 61 74 20 63 61  lator.** that ca
0ed0: 6e 20 62 65 20 61 6e 64 20 69 73 20 75 73 65 64  n be and is used
0ee0: 20 74 6f 20 63 72 65 61 74 65 20 73 74 72 69 6e   to create strin
0ef0: 67 73 20 6f 74 68 65 72 20 74 68 61 6e 20 4a 53  gs other than JS
0f00: 4f 4e 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 4a 73  ON..*/.struct Js
0f10: 6f 6e 53 74 72 69 6e 67 20 7b 0a 20 20 73 71 6c  onString {.  sql
0f20: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
0f30: 74 78 3b 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f  tx;   /* Functio
0f40: 6e 20 63 6f 6e 74 65 78 74 20 2d 20 70 75 74 20  n context - put 
0f50: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 68  error messages h
0f60: 65 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ere */.  char *z
0f70: 42 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Buf;            
0f80: 20 20 2f 2a 20 41 70 70 65 6e 64 20 4a 53 4f 4e    /* Append JSON
0f90: 20 63 6f 6e 74 65 6e 74 20 68 65 72 65 20 2a 2f   content here */
0fa0: 0a 20 20 75 36 34 20 6e 41 6c 6c 6f 63 3b 20 20  .  u64 nAlloc;  
0fb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
0fc0: 79 74 65 73 20 6f 66 20 73 74 6f 72 61 67 65 20  ytes of storage 
0fd0: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 7a 42 75  available in zBu
0fe0: 66 5b 5d 20 2a 2f 0a 20 20 75 36 34 20 6e 55 73  f[] */.  u64 nUs
0ff0: 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
1000: 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 7a 42    /* Bytes of zB
1010: 75 66 5b 5d 20 63 75 72 72 65 6e 74 6c 79 20 75  uf[] currently u
1020: 73 65 64 20 2a 2f 0a 20 20 75 38 20 62 53 74 61  sed */.  u8 bSta
1030: 74 69 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  tic;            
1040: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 7a 42 75    /* True if zBu
1050: 66 20 69 73 20 73 74 61 74 69 63 20 73 70 61 63  f is static spac
1060: 65 20 2a 2f 0a 20 20 75 38 20 62 45 72 72 3b 20  e */.  u8 bErr; 
1070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1080: 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 65 72  /* True if an er
1090: 72 6f 72 20 68 61 73 20 62 65 65 6e 20 65 6e 63  ror has been enc
10a0: 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20 63 68  ountered */.  ch
10b0: 61 72 20 7a 53 70 61 63 65 5b 31 30 30 5d 3b 20  ar zSpace[100]; 
10c0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
10d0: 6c 20 73 74 61 74 69 63 20 73 70 61 63 65 20 2a  l static space *
10e0: 2f 0a 7d 3b 0a 0a 2f 2a 20 4a 53 4f 4e 20 74 79  /.};../* JSON ty
10f0: 70 65 20 76 61 6c 75 65 73 0a 2a 2f 0a 23 64 65  pe values.*/.#de
1100: 66 69 6e 65 20 4a 53 4f 4e 5f 4e 55 4c 4c 20 20  fine JSON_NULL  
1110: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 4a 53 4f     0.#define JSO
1120: 4e 5f 54 52 55 45 20 20 20 20 20 31 0a 23 64 65  N_TRUE     1.#de
1130: 66 69 6e 65 20 4a 53 4f 4e 5f 46 41 4c 53 45 20  fine JSON_FALSE 
1140: 20 20 20 32 0a 23 64 65 66 69 6e 65 20 4a 53 4f     2.#define JSO
1150: 4e 5f 49 4e 54 20 20 20 20 20 20 33 0a 23 64 65  N_INT      3.#de
1160: 66 69 6e 65 20 4a 53 4f 4e 5f 52 45 41 4c 20 20  fine JSON_REAL  
1170: 20 20 20 34 0a 23 64 65 66 69 6e 65 20 4a 53 4f     4.#define JSO
1180: 4e 5f 53 54 52 49 4e 47 20 20 20 35 0a 23 64 65  N_STRING   5.#de
1190: 66 69 6e 65 20 4a 53 4f 4e 5f 41 52 52 41 59 20  fine JSON_ARRAY 
11a0: 20 20 20 36 0a 23 64 65 66 69 6e 65 20 4a 53 4f     6.#define JSO
11b0: 4e 5f 4f 42 4a 45 43 54 20 20 20 37 0a 0a 2f 2a  N_OBJECT   7../*
11c0: 20 54 68 65 20 22 73 75 62 74 79 70 65 22 20 73   The "subtype" s
11d0: 65 74 20 66 6f 72 20 4a 53 4f 4e 20 76 61 6c 75  et for JSON valu
11e0: 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 53  es */.#define JS
11f0: 4f 4e 5f 53 55 42 54 59 50 45 20 20 37 34 20 20  ON_SUBTYPE  74  
1200: 20 20 2f 2a 20 41 73 63 69 69 20 66 6f 72 20 22    /* Ascii for "
1210: 4a 22 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d  J" */../*.** Nam
1220: 65 73 20 6f 66 20 74 68 65 20 76 61 72 69 6f 75  es of the variou
1230: 73 20 4a 53 4f 4e 20 74 79 70 65 73 3a 0a 2a 2f  s JSON types:.*/
1240: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
1250: 61 72 20 2a 20 63 6f 6e 73 74 20 6a 73 6f 6e 54  ar * const jsonT
1260: 79 70 65 5b 5d 20 3d 20 7b 0a 20 20 22 6e 75 6c  ype[] = {.  "nul
1270: 6c 22 2c 20 22 74 72 75 65 22 2c 20 22 66 61 6c  l", "true", "fal
1280: 73 65 22 2c 20 22 69 6e 74 65 67 65 72 22 2c 20  se", "integer", 
1290: 22 72 65 61 6c 22 2c 20 22 74 65 78 74 22 2c 20  "real", "text", 
12a0: 22 61 72 72 61 79 22 2c 20 22 6f 62 6a 65 63 74  "array", "object
12b0: 22 0a 7d 3b 0a 0a 2f 2a 20 42 69 74 20 76 61 6c  ".};../* Bit val
12c0: 75 65 73 20 66 6f 72 20 74 68 65 20 4a 73 6f 6e  ues for the Json
12d0: 4e 6f 64 65 2e 6a 6e 46 6c 61 67 20 66 69 65 6c  Node.jnFlag fiel
12e0: 64 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4e 4f  d.*/.#define JNO
12f0: 44 45 5f 52 41 57 20 20 20 20 20 30 78 30 31 20  DE_RAW     0x01 
1300: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
1310: 6e 74 20 69 73 20 72 61 77 2c 20 6e 6f 74 20 4a  nt is raw, not J
1320: 53 4f 4e 20 65 6e 63 6f 64 65 64 20 2a 2f 0a 23  SON encoded */.#
1330: 64 65 66 69 6e 65 20 4a 4e 4f 44 45 5f 45 53 43  define JNODE_ESC
1340: 41 50 45 20 20 30 78 30 32 20 20 20 20 20 20 20  APE  0x02       
1350: 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 69 73 20    /* Content is 
1360: 74 65 78 74 20 77 69 74 68 20 5c 20 65 73 63 61  text with \ esca
1370: 70 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4a  pes */.#define J
1380: 4e 4f 44 45 5f 52 45 4d 4f 56 45 20 20 30 78 30  NODE_REMOVE  0x0
1390: 34 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20  4         /* Do 
13a0: 6e 6f 74 20 6f 75 74 70 75 74 20 2a 2f 0a 23 64  not output */.#d
13b0: 65 66 69 6e 65 20 4a 4e 4f 44 45 5f 52 45 50 4c  efine JNODE_REPL
13c0: 41 43 45 20 30 78 30 38 20 20 20 20 20 20 20 20  ACE 0x08        
13d0: 20 2f 2a 20 52 65 70 6c 61 63 65 20 77 69 74 68   /* Replace with
13e0: 20 4a 73 6f 6e 4e 6f 64 65 2e 75 2e 69 52 65 70   JsonNode.u.iRep
13f0: 6c 61 63 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  lace */.#define 
1400: 4a 4e 4f 44 45 5f 50 41 54 43 48 20 20 20 30 78  JNODE_PATCH   0x
1410: 31 30 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  10         /* Pa
1420: 74 63 68 20 77 69 74 68 20 4a 73 6f 6e 4e 6f 64  tch with JsonNod
1430: 65 2e 75 2e 70 50 61 74 63 68 20 2a 2f 0a 23 64  e.u.pPatch */.#d
1440: 65 66 69 6e 65 20 4a 4e 4f 44 45 5f 41 50 50 45  efine JNODE_APPE
1450: 4e 44 20 20 30 78 32 30 20 20 20 20 20 20 20 20  ND  0x20        
1460: 20 2f 2a 20 4d 6f 72 65 20 41 52 52 41 59 2f 4f   /* More ARRAY/O
1470: 42 4a 45 43 54 20 65 6e 74 72 69 65 73 20 61 74  BJECT entries at
1480: 20 75 2e 69 41 70 70 65 6e 64 20 2a 2f 0a 23 64   u.iAppend */.#d
1490: 65 66 69 6e 65 20 4a 4e 4f 44 45 5f 4c 41 42 45  efine JNODE_LABE
14a0: 4c 20 20 20 30 78 34 30 20 20 20 20 20 20 20 20  L   0x40        
14b0: 20 2f 2a 20 49 73 20 61 20 6c 61 62 65 6c 20 6f   /* Is a label o
14c0: 66 20 61 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a  f an object */..
14d0: 0a 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6e 6f 64  ./* A single nod
14e0: 65 20 6f 66 20 70 61 72 73 65 64 20 4a 53 4f 4e  e of parsed JSON
14f0: 0a 2a 2f 0a 73 74 72 75 63 74 20 4a 73 6f 6e 4e  .*/.struct JsonN
1500: 6f 64 65 20 7b 0a 20 20 75 38 20 65 54 79 70 65  ode {.  u8 eType
1510: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1520: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 4a 53 4f  * One of the JSO
1530: 4e 5f 20 74 79 70 65 20 76 61 6c 75 65 73 20 2a  N_ type values *
1540: 2f 0a 20 20 75 38 20 6a 6e 46 6c 61 67 73 3b 20  /.  u8 jnFlags; 
1550: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 4e             /* JN
1560: 4f 44 45 20 66 6c 61 67 73 20 2a 2f 0a 20 20 75  ODE flags */.  u
1570: 33 32 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  32 n;           
1580: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
1590: 66 20 63 6f 6e 74 65 6e 74 2c 20 6f 72 20 6e 75  f content, or nu
15a0: 6d 62 65 72 20 6f 66 20 73 75 62 2d 6e 6f 64 65  mber of sub-node
15b0: 73 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20  s */.  union {. 
15c0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
15d0: 4a 43 6f 6e 74 65 6e 74 3b 20 2f 2a 20 43 6f 6e  JContent; /* Con
15e0: 74 65 6e 74 20 66 6f 72 20 49 4e 54 2c 20 52 45  tent for INT, RE
15f0: 41 4c 2c 20 61 6e 64 20 53 54 52 49 4e 47 20 2a  AL, and STRING *
1600: 2f 0a 20 20 20 20 75 33 32 20 69 41 70 70 65 6e  /.    u32 iAppen
1610: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
1620: 4d 6f 72 65 20 74 65 72 6d 73 20 66 6f 72 20 41  More terms for A
1630: 52 52 41 59 20 61 6e 64 20 4f 42 4a 45 43 54 20  RRAY and OBJECT 
1640: 2a 2f 0a 20 20 20 20 75 33 32 20 69 4b 65 79 3b  */.    u32 iKey;
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1660: 20 4b 65 79 20 66 6f 72 20 41 52 52 41 59 20 6f   Key for ARRAY o
1670: 62 6a 65 63 74 73 20 69 6e 20 6a 73 6f 6e 5f 74  bjects in json_t
1680: 72 65 65 28 29 20 2a 2f 0a 20 20 20 20 75 33 32  ree() */.    u32
1690: 20 69 52 65 70 6c 61 63 65 3b 20 20 20 20 20 20   iReplace;      
16a0: 20 20 20 20 2f 2a 20 52 65 70 6c 61 63 65 6d 65      /* Replaceme
16b0: 6e 74 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 4a  nt content for J
16c0: 4e 4f 44 45 5f 52 45 50 4c 41 43 45 20 2a 2f 0a  NODE_REPLACE */.
16d0: 20 20 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 50      JsonNode *pP
16e0: 61 74 63 68 3b 20 20 20 20 20 20 2f 2a 20 4e 6f  atch;      /* No
16f0: 64 65 20 63 68 61 69 6e 20 6f 66 20 70 61 74 63  de chain of patc
1700: 68 20 66 6f 72 20 4a 4e 4f 44 45 5f 50 41 54 43  h for JNODE_PATC
1710: 48 20 2a 2f 0a 20 20 7d 20 75 3b 0a 7d 3b 0a 0a  H */.  } u;.};..
1720: 2f 2a 20 41 20 63 6f 6d 70 6c 65 74 65 6c 79 20  /* A completely 
1730: 70 61 72 73 65 64 20 4a 53 4f 4e 20 73 74 72 69  parsed JSON stri
1740: 6e 67 0a 2a 2f 0a 73 74 72 75 63 74 20 4a 73 6f  ng.*/.struct Jso
1750: 6e 50 61 72 73 65 20 7b 0a 20 20 75 33 32 20 6e  nParse {.  u32 n
1760: 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Node;         /*
1770: 20 4e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73   Number of slots
1780: 20 6f 66 20 61 4e 6f 64 65 5b 5d 20 75 73 65 64   of aNode[] used
1790: 20 2a 2f 0a 20 20 75 33 32 20 6e 41 6c 6c 6f 63   */.  u32 nAlloc
17a0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ;        /* Numb
17b0: 65 72 20 6f 66 20 73 6c 6f 74 73 20 6f 66 20 61  er of slots of a
17c0: 4e 6f 64 65 5b 5d 20 61 6c 6c 6f 63 61 74 65 64  Node[] allocated
17d0: 20 2a 2f 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a   */.  JsonNode *
17e0: 61 4e 6f 64 65 3b 20 20 20 2f 2a 20 41 72 72 61  aNode;   /* Arra
17f0: 79 20 6f 66 20 6e 6f 64 65 73 20 63 6f 6e 74 61  y of nodes conta
1800: 69 6e 69 6e 67 20 74 68 65 20 70 61 72 73 65 20  ining the parse 
1810: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1820: 2a 7a 4a 73 6f 6e 3b 20 2f 2a 20 4f 72 69 67 69  *zJson; /* Origi
1830: 6e 61 6c 20 4a 53 4f 4e 20 73 74 72 69 6e 67 20  nal JSON string 
1840: 2a 2f 0a 20 20 75 33 32 20 2a 61 55 70 3b 20 20  */.  u32 *aUp;  
1850: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1860: 20 6f 66 20 70 61 72 65 6e 74 20 6f 66 20 65 61   of parent of ea
1870: 63 68 20 6e 6f 64 65 20 2a 2f 0a 20 20 75 38 20  ch node */.  u8 
1880: 6f 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  oom;            
1890: 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20 69  /* Set to true i
18a0: 66 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20  f out of memory 
18b0: 2a 2f 0a 20 20 75 38 20 6e 45 72 72 3b 20 20 20  */.  u8 nErr;   
18c0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
18d0: 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e  r of errors seen
18e0: 20 2a 2f 0a 20 20 75 31 36 20 69 44 65 70 74 68   */.  u16 iDepth
18f0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 73 74  ;        /* Nest
1900: 69 6e 67 20 64 65 70 74 68 20 2a 2f 0a 20 20 69  ing depth */.  i
1910: 6e 74 20 6e 4a 73 6f 6e 3b 20 20 20 20 20 20 20  nt nJson;       
1920: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74    /* Length of t
1930: 68 65 20 7a 4a 73 6f 6e 20 73 74 72 69 6e 67 20  he zJson string 
1940: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33  in bytes */.  u3
1950: 32 20 69 48 6f 6c 64 3b 20 20 20 20 20 20 20 20  2 iHold;        
1960: 20 2f 2a 20 52 65 70 6c 61 63 65 20 63 61 63 68   /* Replace cach
1970: 65 20 6c 69 6e 65 20 77 69 74 68 20 74 68 65 20  e line with the 
1980: 6c 6f 77 65 73 74 20 69 48 6f 6c 64 20 76 61 6c  lowest iHold val
1990: 75 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ue */.};../*.** 
19a0: 4d 61 78 69 6d 75 6d 20 6e 65 73 74 69 6e 67 20  Maximum nesting 
19b0: 64 65 70 74 68 20 6f 66 20 4a 53 4f 4e 20 66 6f  depth of JSON fo
19c0: 72 20 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74  r this implement
19d0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ation..**.** Thi
19e0: 73 20 6c 69 6d 69 74 20 69 73 20 6e 65 65 64 65  s limit is neede
19f0: 64 20 74 6f 20 61 76 6f 69 64 20 61 20 73 74 61  d to avoid a sta
1a00: 63 6b 20 6f 76 65 72 66 6c 6f 77 20 69 6e 20 74  ck overflow in t
1a10: 68 65 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20  he recursive.** 
1a20: 64 65 73 63 65 6e 74 20 70 61 72 73 65 72 2e 20  descent parser. 
1a30: 20 41 20 64 65 70 74 68 20 6f 66 20 32 30 30 30   A depth of 2000
1a40: 20 69 73 20 66 61 72 20 64 65 65 70 65 72 20 74   is far deeper t
1a50: 68 61 6e 20 61 6e 79 20 73 61 6e 65 20 4a 53 4f  han any sane JSO
1a60: 4e 0a 2a 2a 20 73 68 6f 75 6c 64 20 67 6f 2e 0a  N.** should go..
1a70: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 53 4f 4e 5f  */.#define JSON_
1a80: 4d 41 58 5f 44 45 50 54 48 20 20 32 30 30 30 0a  MAX_DEPTH  2000.
1a90: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
1aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ad0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
1ae0: 55 74 69 6c 69 74 79 20 72 6f 75 74 69 6e 65 73  Utility routines
1af0: 20 66 6f 72 20 64 65 61 6c 69 6e 67 20 77 69 74   for dealing wit
1b00: 68 20 4a 73 6f 6e 53 74 72 69 6e 67 20 6f 62 6a  h JsonString obj
1b10: 65 63 74 73 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ects.***********
1b20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
1b60: 0a 0a 2f 2a 20 53 65 74 20 74 68 65 20 4a 73 6f  ../* Set the Jso
1b70: 6e 53 74 72 69 6e 67 20 6f 62 6a 65 63 74 20 74  nString object t
1b80: 6f 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  o an empty strin
1b90: 67 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  g.*/.static void
1ba0: 20 6a 73 6f 6e 5a 65 72 6f 28 4a 73 6f 6e 53 74   jsonZero(JsonSt
1bb0: 72 69 6e 67 20 2a 70 29 7b 0a 20 20 70 2d 3e 7a  ring *p){.  p->z
1bc0: 42 75 66 20 3d 20 70 2d 3e 7a 53 70 61 63 65 3b  Buf = p->zSpace;
1bd0: 0a 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 73  .  p->nAlloc = s
1be0: 69 7a 65 6f 66 28 70 2d 3e 7a 53 70 61 63 65 29  izeof(p->zSpace)
1bf0: 3b 0a 20 20 70 2d 3e 6e 55 73 65 64 20 3d 20 30  ;.  p->nUsed = 0
1c00: 3b 0a 20 20 70 2d 3e 62 53 74 61 74 69 63 20 3d  ;.  p->bStatic =
1c10: 20 31 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69 74 69 61   1;.}../* Initia
1c20: 6c 69 7a 65 20 74 68 65 20 4a 73 6f 6e 53 74 72  lize the JsonStr
1c30: 69 6e 67 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74  ing object.*/.st
1c40: 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 49 6e  atic void jsonIn
1c50: 69 74 28 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70  it(JsonString *p
1c60: 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  , sqlite3_contex
1c70: 74 20 2a 70 43 74 78 29 7b 0a 20 20 70 2d 3e 70  t *pCtx){.  p->p
1c80: 43 74 78 20 3d 20 70 43 74 78 3b 0a 20 20 70 2d  Ctx = pCtx;.  p-
1c90: 3e 62 45 72 72 20 3d 20 30 3b 0a 20 20 6a 73 6f  >bErr = 0;.  jso
1ca0: 6e 5a 65 72 6f 28 70 29 3b 0a 7d 0a 0a 0a 2f 2a  nZero(p);.}.../*
1cb0: 20 46 72 65 65 20 61 6c 6c 20 61 6c 6c 6f 63 61   Free all alloca
1cc0: 74 65 64 20 6d 65 6d 6f 72 79 20 61 6e 64 20 72  ted memory and r
1cd0: 65 73 65 74 20 74 68 65 20 4a 73 6f 6e 53 74 72  eset the JsonStr
1ce0: 69 6e 67 20 6f 62 6a 65 63 74 20 62 61 63 6b 20  ing object back 
1cf0: 74 6f 20 69 74 73 0a 2a 2a 20 69 6e 69 74 69 61  to its.** initia
1d00: 6c 20 73 74 61 74 65 2e 0a 2a 2f 0a 73 74 61 74  l state..*/.stat
1d10: 69 63 20 76 6f 69 64 20 6a 73 6f 6e 52 65 73 65  ic void jsonRese
1d20: 74 28 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70 29  t(JsonString *p)
1d30: 7b 0a 20 20 69 66 28 20 21 70 2d 3e 62 53 74 61  {.  if( !p->bSta
1d40: 74 69 63 20 29 20 73 71 6c 69 74 65 33 5f 66 72  tic ) sqlite3_fr
1d50: 65 65 28 70 2d 3e 7a 42 75 66 29 3b 0a 20 20 6a  ee(p->zBuf);.  j
1d60: 73 6f 6e 5a 65 72 6f 28 70 29 3b 0a 7d 0a 0a 0a  sonZero(p);.}...
1d70: 2f 2a 20 52 65 70 6f 72 74 20 61 6e 20 6f 75 74  /* Report an out
1d80: 2d 6f 66 2d 6d 65 6d 6f 72 79 20 28 4f 4f 4d 29  -of-memory (OOM)
1d90: 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2f 0a 73   condition .*/.s
1da0: 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 4f  tatic void jsonO
1db0: 6f 6d 28 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70  om(JsonString *p
1dc0: 29 7b 0a 20 20 70 2d 3e 62 45 72 72 20 3d 20 31  ){.  p->bErr = 1
1dd0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
1de0: 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 70  lt_error_nomem(p
1df0: 2d 3e 70 43 74 78 29 3b 0a 20 20 6a 73 6f 6e 52  ->pCtx);.  jsonR
1e00: 65 73 65 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 20 45  eset(p);.}../* E
1e10: 6e 6c 61 72 67 65 20 70 4a 73 6f 6e 2d 3e 7a 42  nlarge pJson->zB
1e20: 75 66 20 73 6f 20 74 68 61 74 20 69 74 20 63 61  uf so that it ca
1e30: 6e 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20  n hold at least 
1e40: 4e 20 6d 6f 72 65 20 62 79 74 65 73 2e 0a 2a 2a  N more bytes..**
1e50: 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 6f 6e 20   Return zero on 
1e60: 73 75 63 63 65 73 73 2e 20 20 52 65 74 75 72 6e  success.  Return
1e70: 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20 61 6e 20   non-zero on an 
1e80: 4f 4f 4d 20 65 72 72 6f 72 0a 2a 2f 0a 73 74 61  OOM error.*/.sta
1e90: 74 69 63 20 69 6e 74 20 6a 73 6f 6e 47 72 6f 77  tic int jsonGrow
1ea0: 28 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70 2c 20  (JsonString *p, 
1eb0: 75 33 32 20 4e 29 7b 0a 20 20 75 36 34 20 6e 54  u32 N){.  u64 nT
1ec0: 6f 74 61 6c 20 3d 20 4e 3c 70 2d 3e 6e 41 6c 6c  otal = N<p->nAll
1ed0: 6f 63 20 3f 20 70 2d 3e 6e 41 6c 6c 6f 63 2a 32  oc ? p->nAlloc*2
1ee0: 20 3a 20 70 2d 3e 6e 41 6c 6c 6f 63 2b 4e 2b 31   : p->nAlloc+N+1
1ef0: 30 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 65 77 3b  0;.  char *zNew;
1f00: 0a 20 20 69 66 28 20 70 2d 3e 62 53 74 61 74 69  .  if( p->bStati
1f10: 63 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  c ){.    if( p->
1f20: 62 45 72 72 20 29 20 72 65 74 75 72 6e 20 31 3b  bErr ) return 1;
1f30: 0a 20 20 20 20 7a 4e 65 77 20 3d 20 73 71 6c 69  .    zNew = sqli
1f40: 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 54 6f  te3_malloc64(nTo
1f50: 74 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e  tal);.    if( zN
1f60: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6a  ew==0 ){.      j
1f70: 73 6f 6e 4f 6f 6d 28 70 29 3b 0a 20 20 20 20 20  sonOom(p);.     
1f80: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
1f90: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
1fa0: 6d 65 6d 63 70 79 28 7a 4e 65 77 2c 20 70 2d 3e  memcpy(zNew, p->
1fb0: 7a 42 75 66 2c 20 28 73 69 7a 65 5f 74 29 70 2d  zBuf, (size_t)p-
1fc0: 3e 6e 55 73 65 64 29 3b 0a 20 20 20 20 70 2d 3e  >nUsed);.    p->
1fd0: 7a 42 75 66 20 3d 20 7a 4e 65 77 3b 0a 20 20 20  zBuf = zNew;.   
1fe0: 20 70 2d 3e 62 53 74 61 74 69 63 20 3d 20 30 3b   p->bStatic = 0;
1ff0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e  .  }else{.    zN
2000: 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61  ew = sqlite3_rea
2010: 6c 6c 6f 63 36 34 28 70 2d 3e 7a 42 75 66 2c 20  lloc64(p->zBuf, 
2020: 6e 54 6f 74 61 6c 29 3b 0a 20 20 20 20 69 66 28  nTotal);.    if(
2030: 20 7a 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   zNew==0 ){.    
2040: 20 20 6a 73 6f 6e 4f 6f 6d 28 70 29 3b 0a 20 20    jsonOom(p);.  
2050: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2060: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
2070: 20 20 20 70 2d 3e 7a 42 75 66 20 3d 20 7a 4e 65     p->zBuf = zNe
2080: 77 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 41 6c 6c  w;.  }.  p->nAll
2090: 6f 63 20 3d 20 6e 54 6f 74 61 6c 3b 0a 20 20 72  oc = nTotal;.  r
20a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
20b0: 0a 7d 0a 0a 2f 2a 20 41 70 70 65 6e 64 20 4e 20  .}../* Append N 
20c0: 62 79 74 65 73 20 66 72 6f 6d 20 7a 49 6e 20 6f  bytes from zIn o
20d0: 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74  nto the end of t
20e0: 68 65 20 4a 73 6f 6e 53 74 72 69 6e 67 20 73 74  he JsonString st
20f0: 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ring..*/.static 
2100: 76 6f 69 64 20 6a 73 6f 6e 41 70 70 65 6e 64 52  void jsonAppendR
2110: 61 77 28 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70  aw(JsonString *p
2120: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49  , const char *zI
2130: 6e 2c 20 75 33 32 20 4e 29 7b 0a 20 20 69 66 28  n, u32 N){.  if(
2140: 20 28 4e 2b 70 2d 3e 6e 55 73 65 64 20 3e 3d 20   (N+p->nUsed >= 
2150: 70 2d 3e 6e 41 6c 6c 6f 63 29 20 26 26 20 6a 73  p->nAlloc) && js
2160: 6f 6e 47 72 6f 77 28 70 2c 4e 29 21 3d 30 20 29  onGrow(p,N)!=0 )
2170: 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 63 70   return;.  memcp
2180: 79 28 70 2d 3e 7a 42 75 66 2b 70 2d 3e 6e 55 73  y(p->zBuf+p->nUs
2190: 65 64 2c 20 7a 49 6e 2c 20 4e 29 3b 0a 20 20 70  ed, zIn, N);.  p
21a0: 2d 3e 6e 55 73 65 64 20 2b 3d 20 4e 3b 0a 7d 0a  ->nUsed += N;.}.
21b0: 0a 2f 2a 20 41 70 70 65 6e 64 20 66 6f 72 6d 61  ./* Append forma
21c0: 74 74 65 64 20 74 65 78 74 20 28 6e 6f 74 20 74  tted text (not t
21d0: 6f 20 65 78 63 65 65 64 20 4e 20 62 79 74 65 73  o exceed N bytes
21e0: 29 20 74 6f 20 74 68 65 20 4a 73 6f 6e 53 74 72  ) to the JsonStr
21f0: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
2200: 6f 69 64 20 6a 73 6f 6e 50 72 69 6e 74 66 28 69  oid jsonPrintf(i
2210: 6e 74 20 4e 2c 20 4a 73 6f 6e 53 74 72 69 6e 67  nt N, JsonString
2220: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
2230: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
2240: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
2250: 69 66 28 20 28 70 2d 3e 6e 55 73 65 64 20 2b 20  if( (p->nUsed + 
2260: 4e 20 3e 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 29 20  N >= p->nAlloc) 
2270: 26 26 20 6a 73 6f 6e 47 72 6f 77 28 70 2c 20 4e  && jsonGrow(p, N
2280: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 76 61  ) ) return;.  va
2290: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
22a0: 61 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  at);.  sqlite3_v
22b0: 73 6e 70 72 69 6e 74 66 28 4e 2c 20 70 2d 3e 7a  snprintf(N, p->z
22c0: 42 75 66 2b 70 2d 3e 6e 55 73 65 64 2c 20 7a 46  Buf+p->nUsed, zF
22d0: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61  ormat, ap);.  va
22e0: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 70 2d 3e 6e  _end(ap);.  p->n
22f0: 55 73 65 64 20 2b 3d 20 28 69 6e 74 29 73 74 72  Used += (int)str
2300: 6c 65 6e 28 70 2d 3e 7a 42 75 66 2b 70 2d 3e 6e  len(p->zBuf+p->n
2310: 55 73 65 64 29 3b 0a 7d 0a 0a 2f 2a 20 41 70 70  Used);.}../* App
2320: 65 6e 64 20 61 20 73 69 6e 67 6c 65 20 63 68 61  end a single cha
2330: 72 61 63 74 65 72 0a 2a 2f 0a 73 74 61 74 69 63  racter.*/.static
2340: 20 76 6f 69 64 20 6a 73 6f 6e 41 70 70 65 6e 64   void jsonAppend
2350: 43 68 61 72 28 4a 73 6f 6e 53 74 72 69 6e 67 20  Char(JsonString 
2360: 2a 70 2c 20 63 68 61 72 20 63 29 7b 0a 20 20 69  *p, char c){.  i
2370: 66 28 20 70 2d 3e 6e 55 73 65 64 3e 3d 70 2d 3e  f( p->nUsed>=p->
2380: 6e 41 6c 6c 6f 63 20 26 26 20 6a 73 6f 6e 47 72  nAlloc && jsonGr
2390: 6f 77 28 70 2c 31 29 21 3d 30 20 29 20 72 65 74  ow(p,1)!=0 ) ret
23a0: 75 72 6e 3b 0a 20 20 70 2d 3e 7a 42 75 66 5b 70  urn;.  p->zBuf[p
23b0: 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d 20 63 3b 0a  ->nUsed++] = c;.
23c0: 7d 0a 0a 2f 2a 20 41 70 70 65 6e 64 20 61 20 63  }../* Append a c
23d0: 6f 6d 6d 61 20 73 65 70 61 72 61 74 6f 72 20 74  omma separator t
23e0: 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  o the output buf
23f0: 66 65 72 2c 20 69 66 20 74 68 65 20 70 72 65 76  fer, if the prev
2400: 69 6f 75 73 0a 2a 2a 20 63 68 61 72 61 63 74 65  ious.** characte
2410: 72 20 69 73 20 6e 6f 74 20 27 5b 27 20 6f 72 20  r is not '[' or 
2420: 27 7b 27 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  '{'..*/.static v
2430: 6f 69 64 20 6a 73 6f 6e 41 70 70 65 6e 64 53 65  oid jsonAppendSe
2440: 70 61 72 61 74 6f 72 28 4a 73 6f 6e 53 74 72 69  parator(JsonStri
2450: 6e 67 20 2a 70 29 7b 0a 20 20 63 68 61 72 20 63  ng *p){.  char c
2460: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 55 73 65 64  ;.  if( p->nUsed
2470: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
2480: 63 20 3d 20 70 2d 3e 7a 42 75 66 5b 70 2d 3e 6e  c = p->zBuf[p->n
2490: 55 73 65 64 2d 31 5d 3b 0a 20 20 69 66 28 20 63  Used-1];.  if( c
24a0: 21 3d 27 5b 27 20 26 26 20 63 21 3d 27 7b 27 20  !='[' && c!='{' 
24b0: 29 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61 72  ) jsonAppendChar
24c0: 28 70 2c 20 27 2c 27 29 3b 0a 7d 0a 0a 2f 2a 20  (p, ',');.}../* 
24d0: 41 70 70 65 6e 64 20 74 68 65 20 4e 2d 62 79 74  Append the N-byt
24e0: 65 20 73 74 72 69 6e 67 20 69 6e 20 7a 49 6e 20  e string in zIn 
24f0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
2500: 65 20 4a 73 6f 6e 53 74 72 69 6e 67 20 73 74 72  e JsonString str
2510: 69 6e 67 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e  ing.** under con
2520: 73 74 72 75 63 74 69 6f 6e 2e 20 20 45 6e 63 6c  struction.  Encl
2530: 6f 73 65 20 74 68 65 20 73 74 72 69 6e 67 20 69  ose the string i
2540: 6e 20 22 2e 2e 2e 22 20 61 6e 64 20 65 73 63 61  n "..." and esca
2550: 70 65 0a 2a 2a 20 61 6e 79 20 64 6f 75 62 6c 65  pe.** any double
2560: 2d 71 75 6f 74 65 73 20 6f 72 20 62 61 63 6b 73  -quotes or backs
2570: 6c 61 73 68 20 63 68 61 72 61 63 74 65 72 73 20  lash characters 
2580: 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
2590: 20 74 68 65 0a 2a 2a 20 73 74 72 69 6e 67 2e 0a   the.** string..
25a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a  */.static void j
25b0: 73 6f 6e 41 70 70 65 6e 64 53 74 72 69 6e 67 28  sonAppendString(
25c0: 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70 2c 20 63  JsonString *p, c
25d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 2c 20  onst char *zIn, 
25e0: 75 33 32 20 4e 29 7b 0a 20 20 75 33 32 20 69 3b  u32 N){.  u32 i;
25f0: 0a 20 20 69 66 28 20 28 4e 2b 70 2d 3e 6e 55 73  .  if( (N+p->nUs
2600: 65 64 2b 32 20 3e 3d 20 70 2d 3e 6e 41 6c 6c 6f  ed+2 >= p->nAllo
2610: 63 29 20 26 26 20 6a 73 6f 6e 47 72 6f 77 28 70  c) && jsonGrow(p
2620: 2c 4e 2b 32 29 21 3d 30 20 29 20 72 65 74 75 72  ,N+2)!=0 ) retur
2630: 6e 3b 0a 20 20 70 2d 3e 7a 42 75 66 5b 70 2d 3e  n;.  p->zBuf[p->
2640: 6e 55 73 65 64 2b 2b 5d 20 3d 20 27 22 27 3b 0a  nUsed++] = '"';.
2650: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b 20    for(i=0; i<N; 
2660: 69 2b 2b 29 7b 0a 20 20 20 20 75 6e 73 69 67 6e  i++){.    unsign
2670: 65 64 20 63 68 61 72 20 63 20 3d 20 28 28 75 6e  ed char c = ((un
2680: 73 69 67 6e 65 64 20 63 6f 6e 73 74 20 63 68 61  signed const cha
2690: 72 2a 29 7a 49 6e 29 5b 69 5d 3b 0a 20 20 20 20  r*)zIn)[i];.    
26a0: 69 66 28 20 63 3d 3d 27 22 27 20 7c 7c 20 63 3d  if( c=='"' || c=
26b0: 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 6a  ='\\' ){.      j
26c0: 73 6f 6e 5f 73 69 6d 70 6c 65 5f 65 73 63 61 70  son_simple_escap
26d0: 65 3a 0a 20 20 20 20 20 20 69 66 28 20 28 70 2d  e:.      if( (p-
26e0: 3e 6e 55 73 65 64 2b 4e 2b 33 2d 69 20 3e 20 70  >nUsed+N+3-i > p
26f0: 2d 3e 6e 41 6c 6c 6f 63 29 20 26 26 20 6a 73 6f  ->nAlloc) && jso
2700: 6e 47 72 6f 77 28 70 2c 4e 2b 33 2d 69 29 21 3d  nGrow(p,N+3-i)!=
2710: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
2720: 20 20 70 2d 3e 7a 42 75 66 5b 70 2d 3e 6e 55 73    p->zBuf[p->nUs
2730: 65 64 2b 2b 5d 20 3d 20 27 5c 5c 27 3b 0a 20 20  ed++] = '\\';.  
2740: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3c 3d 30    }else if( c<=0
2750: 78 31 66 20 29 7b 0a 20 20 20 20 20 20 73 74 61  x1f ){.      sta
2760: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 61  tic const char a
2770: 53 70 65 63 69 61 6c 5b 5d 20 3d 20 7b 0a 20 20  Special[] = {.  
2780: 20 20 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20         0, 0, 0, 
2790: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 27  0, 0, 0, 0, 0, '
27a0: 62 27 2c 20 27 74 27 2c 20 27 6e 27 2c 20 30 2c  b', 't', 'n', 0,
27b0: 20 27 66 27 2c 20 27 72 27 2c 20 30 2c 20 30 2c   'f', 'r', 0, 0,
27c0: 0a 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20  .         0, 0, 
27d0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
27e0: 2c 20 20 20 30 2c 20 20 20 30 2c 20 20 20 30 2c  ,   0,   0,   0,
27f0: 20 30 2c 20 20 20 30 2c 20 20 20 30 2c 20 30 2c   0,   0,   0, 0,
2800: 20 30 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20   0.      };.    
2810: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
2820: 28 61 53 70 65 63 69 61 6c 29 3d 3d 33 32 20 29  (aSpecial)==32 )
2830: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2840: 61 53 70 65 63 69 61 6c 5b 27 5c 62 27 5d 3d 3d  aSpecial['\b']==
2850: 27 62 27 20 29 3b 0a 20 20 20 20 20 20 61 73 73  'b' );.      ass
2860: 65 72 74 28 20 61 53 70 65 63 69 61 6c 5b 27 5c  ert( aSpecial['\
2870: 66 27 5d 3d 3d 27 66 27 20 29 3b 0a 20 20 20 20  f']=='f' );.    
2880: 20 20 61 73 73 65 72 74 28 20 61 53 70 65 63 69    assert( aSpeci
2890: 61 6c 5b 27 5c 6e 27 5d 3d 3d 27 6e 27 20 29 3b  al['\n']=='n' );
28a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61  .      assert( a
28b0: 53 70 65 63 69 61 6c 5b 27 5c 72 27 5d 3d 3d 27  Special['\r']=='
28c0: 72 27 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  r' );.      asse
28d0: 72 74 28 20 61 53 70 65 63 69 61 6c 5b 27 5c 74  rt( aSpecial['\t
28e0: 27 5d 3d 3d 27 74 27 20 29 3b 0a 20 20 20 20 20  ']=='t' );.     
28f0: 20 69 66 28 20 61 53 70 65 63 69 61 6c 5b 63 5d   if( aSpecial[c]
2900: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20   ){.        c = 
2910: 61 53 70 65 63 69 61 6c 5b 63 5d 3b 0a 20 20 20  aSpecial[c];.   
2920: 20 20 20 20 20 67 6f 74 6f 20 6a 73 6f 6e 5f 73       goto json_s
2930: 69 6d 70 6c 65 5f 65 73 63 61 70 65 3b 0a 20 20  imple_escape;.  
2940: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2950: 28 70 2d 3e 6e 55 73 65 64 2b 4e 2b 37 2b 69 20  (p->nUsed+N+7+i 
2960: 3e 20 70 2d 3e 6e 41 6c 6c 6f 63 29 20 26 26 20  > p->nAlloc) && 
2970: 6a 73 6f 6e 47 72 6f 77 28 70 2c 4e 2b 37 2d 69  jsonGrow(p,N+7-i
2980: 29 21 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )!=0 ) return;. 
2990: 20 20 20 20 20 70 2d 3e 7a 42 75 66 5b 70 2d 3e       p->zBuf[p->
29a0: 6e 55 73 65 64 2b 2b 5d 20 3d 20 27 5c 5c 27 3b  nUsed++] = '\\';
29b0: 0a 20 20 20 20 20 20 70 2d 3e 7a 42 75 66 5b 70  .      p->zBuf[p
29c0: 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d 20 27 75 27  ->nUsed++] = 'u'
29d0: 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 42 75 66 5b  ;.      p->zBuf[
29e0: 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d 20 27 30  p->nUsed++] = '0
29f0: 27 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 42 75 66  ';.      p->zBuf
2a00: 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d 20 27  [p->nUsed++] = '
2a10: 30 27 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 42 75  0';.      p->zBu
2a20: 66 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d 20  f[p->nUsed++] = 
2a30: 27 30 27 20 2b 20 28 63 3e 3e 34 29 3b 0a 20 20  '0' + (c>>4);.  
2a40: 20 20 20 20 63 20 3d 20 22 30 31 32 33 34 35 36      c = "0123456
2a50: 37 38 39 61 62 63 64 65 66 22 5b 63 26 30 78 66  789abcdef"[c&0xf
2a60: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  ];.    }.    p->
2a70: 7a 42 75 66 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d  zBuf[p->nUsed++]
2a80: 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 70 2d 3e 7a   = c;.  }.  p->z
2a90: 42 75 66 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20  Buf[p->nUsed++] 
2aa0: 3d 20 27 22 27 3b 0a 20 20 61 73 73 65 72 74 28  = '"';.  assert(
2ab0: 20 70 2d 3e 6e 55 73 65 64 3c 70 2d 3e 6e 41 6c   p->nUsed<p->nAl
2ac0: 6c 6f 63 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  loc );.}../*.** 
2ad0: 41 70 70 65 6e 64 20 61 20 66 75 6e 63 74 69 6f  Append a functio
2ae0: 6e 20 70 61 72 61 6d 65 74 65 72 20 76 61 6c 75  n parameter valu
2af0: 65 20 74 6f 20 74 68 65 20 4a 53 4f 4e 20 73 74  e to the JSON st
2b00: 72 69 6e 67 20 75 6e 64 65 72 20 0a 2a 2a 20 63  ring under .** c
2b10: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  onstruction..*/.
2b20: 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e  static void json
2b30: 41 70 70 65 6e 64 56 61 6c 75 65 28 0a 20 20 4a  AppendValue(.  J
2b40: 73 6f 6e 53 74 72 69 6e 67 20 2a 70 2c 20 20 20  sonString *p,   
2b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b60: 20 41 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20   Append to this 
2b70: 4a 53 4f 4e 20 73 74 72 69 6e 67 20 2a 2f 0a 20  JSON string */. 
2b80: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
2b90: 70 56 61 6c 75 65 20 20 20 20 20 20 20 20 20 20  pValue          
2ba0: 2f 2a 20 56 61 6c 75 65 20 74 6f 20 61 70 70 65  /* Value to appe
2bb0: 6e 64 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63  nd */.){.  switc
2bc0: 68 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  h( sqlite3_value
2bd0: 5f 74 79 70 65 28 70 56 61 6c 75 65 29 20 29 7b  _type(pValue) ){
2be0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
2bf0: 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 6a  _NULL: {.      j
2c00: 73 6f 6e 41 70 70 65 6e 64 52 61 77 28 70 2c 20  sonAppendRaw(p, 
2c10: 22 6e 75 6c 6c 22 2c 20 34 29 3b 0a 20 20 20 20  "null", 4);.    
2c20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
2c30: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
2c40: 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61 73 65  NTEGER:.    case
2c50: 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b   SQLITE_FLOAT: {
2c60: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
2c70: 72 20 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68  r *z = (const ch
2c80: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
2c90: 65 5f 74 65 78 74 28 70 56 61 6c 75 65 29 3b 0a  e_text(pValue);.
2ca0: 20 20 20 20 20 20 75 33 32 20 6e 20 3d 20 28 75        u32 n = (u
2cb0: 33 32 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  32)sqlite3_value
2cc0: 5f 62 79 74 65 73 28 70 56 61 6c 75 65 29 3b 0a  _bytes(pValue);.
2cd0: 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64        jsonAppend
2ce0: 52 61 77 28 70 2c 20 7a 2c 20 6e 29 3b 0a 20 20  Raw(p, z, n);.  
2cf0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2d00: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
2d10: 5f 54 45 58 54 3a 20 7b 0a 20 20 20 20 20 20 63  _TEXT: {.      c
2d20: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28  onst char *z = (
2d30: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
2d40: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70  te3_value_text(p
2d50: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 75 33  Value);.      u3
2d60: 32 20 6e 20 3d 20 28 75 33 32 29 73 71 6c 69 74  2 n = (u32)sqlit
2d70: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70  e3_value_bytes(p
2d80: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 69 66  Value);.      if
2d90: 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
2da0: 73 75 62 74 79 70 65 28 70 56 61 6c 75 65 29 3d  subtype(pValue)=
2db0: 3d 4a 53 4f 4e 5f 53 55 42 54 59 50 45 20 29 7b  =JSON_SUBTYPE ){
2dc0: 0a 20 20 20 20 20 20 20 20 6a 73 6f 6e 41 70 70  .        jsonApp
2dd0: 65 6e 64 52 61 77 28 70 2c 20 7a 2c 20 6e 29 3b  endRaw(p, z, n);
2de0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2df0: 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64        jsonAppend
2e00: 53 74 72 69 6e 67 28 70 2c 20 7a 2c 20 6e 29 3b  String(p, z, n);
2e10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
2e20: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
2e30: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
2e40: 20 69 66 28 20 70 2d 3e 62 45 72 72 3d 3d 30 20   if( p->bErr==0 
2e50: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2e60: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
2e70: 70 2d 3e 70 43 74 78 2c 20 22 4a 53 4f 4e 20 63  p->pCtx, "JSON c
2e80: 61 6e 6e 6f 74 20 68 6f 6c 64 20 42 4c 4f 42 20  annot hold BLOB 
2e90: 76 61 6c 75 65 73 22 2c 20 2d 31 29 3b 0a 20 20  values", -1);.  
2ea0: 20 20 20 20 20 20 70 2d 3e 62 45 72 72 20 3d 20        p->bErr = 
2eb0: 32 3b 0a 20 20 20 20 20 20 20 20 6a 73 6f 6e 52  2;.        jsonR
2ec0: 65 73 65 74 28 70 29 3b 0a 20 20 20 20 20 20 7d  eset(p);.      }
2ed0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2ee0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 20 4d    }.  }.}.../* M
2ef0: 61 6b 65 20 74 68 65 20 4a 53 4f 4e 20 69 6e 20  ake the JSON in 
2f00: 70 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  p the result of 
2f10: 74 68 65 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  the SQL function
2f20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2f30: 20 6a 73 6f 6e 52 65 73 75 6c 74 28 4a 73 6f 6e   jsonResult(Json
2f40: 53 74 72 69 6e 67 20 2a 70 29 7b 0a 20 20 69 66  String *p){.  if
2f50: 28 20 70 2d 3e 62 45 72 72 3d 3d 30 20 29 7b 0a  ( p->bErr==0 ){.
2f60: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
2f70: 6c 74 5f 74 65 78 74 36 34 28 70 2d 3e 70 43 74  lt_text64(p->pCt
2f80: 78 2c 20 70 2d 3e 7a 42 75 66 2c 20 70 2d 3e 6e  x, p->zBuf, p->n
2f90: 55 73 65 64 2c 20 0a 20 20 20 20 20 20 20 20 20  Used, .         
2fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb0: 20 70 2d 3e 62 53 74 61 74 69 63 20 3f 20 53 51   p->bStatic ? SQ
2fc0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 20 3a  LITE_TRANSIENT :
2fd0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 2c 0a 20   sqlite3_free,. 
2fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ff0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
3000: 55 54 46 38 29 3b 0a 20 20 20 20 6a 73 6f 6e 5a  UTF8);.    jsonZ
3010: 65 72 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 61 73  ero(p);.  }.  as
3020: 73 65 72 74 28 20 70 2d 3e 62 53 74 61 74 69 63  sert( p->bStatic
3030: 20 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   );.}../********
3040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3080: 2a 2a 0a 2a 2a 20 55 74 69 6c 69 74 79 20 72 6f  **.** Utility ro
3090: 75 74 69 6e 65 73 20 66 6f 72 20 64 65 61 6c 69  utines for deali
30a0: 6e 67 20 77 69 74 68 20 4a 73 6f 6e 4e 6f 64 65  ng with JsonNode
30b0: 20 61 6e 64 20 4a 73 6f 6e 50 61 72 73 65 20 6f   and JsonParse o
30c0: 62 6a 65 63 74 73 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  bjects.*********
30d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3110: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
3120: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
3130: 6f 6e 73 65 63 75 74 69 76 65 20 4a 73 6f 6e 4e  onsecutive JsonN
3140: 6f 64 65 20 73 6c 6f 74 73 20 6e 65 65 64 20 74  ode slots need t
3150: 6f 20 72 65 70 72 65 73 65 6e 74 0a 2a 2a 20 74  o represent.** t
3160: 68 65 20 70 61 72 73 65 64 20 4a 53 4f 4e 20 61  he parsed JSON a
3170: 74 20 70 4e 6f 64 65 2e 20 20 54 68 65 20 6d 69  t pNode.  The mi
3180: 6e 69 6d 75 6d 20 61 6e 73 77 65 72 20 69 73 20  nimum answer is 
3190: 31 2e 20 20 46 6f 72 20 41 52 52 41 59 20 61 6e  1.  For ARRAY an
31a0: 64 0a 2a 2a 20 4f 42 4a 45 43 54 20 74 79 70 65  d.** OBJECT type
31b0: 73 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6d 69  s, the number mi
31c0: 67 68 74 20 62 65 20 6c 61 72 67 65 72 2e 0a 2a  ght be larger..*
31d0: 2a 0a 2a 2a 20 41 70 70 65 6e 64 65 64 20 65 6c  *.** Appended el
31e0: 65 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74 20 63  ements are not c
31f0: 6f 75 6e 74 65 64 2e 20 20 54 68 65 20 76 61 6c  ounted.  The val
3200: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
3210: 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 62 79 20  he number.** by 
3220: 77 68 69 63 68 20 74 68 65 20 4a 73 6f 6e 4e 6f  which the JsonNo
3230: 64 65 20 63 6f 75 6e 74 65 72 20 73 68 6f 75 6c  de counter shoul
3240: 64 20 69 6e 63 72 65 6d 65 6e 74 20 69 6e 20 6f  d increment in o
3250: 72 64 65 72 20 74 6f 20 67 6f 20 74 6f 20 74 68  rder to go to th
3260: 65 0a 2a 2a 20 6e 65 78 74 20 70 65 65 72 20 76  e.** next peer v
3270: 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
3280: 75 33 32 20 6a 73 6f 6e 4e 6f 64 65 53 69 7a 65  u32 jsonNodeSize
3290: 28 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65  (JsonNode *pNode
32a0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 4e 6f 64  ){.  return pNod
32b0: 65 2d 3e 65 54 79 70 65 3e 3d 4a 53 4f 4e 5f 41  e->eType>=JSON_A
32c0: 52 52 41 59 20 3f 20 70 4e 6f 64 65 2d 3e 6e 2b  RRAY ? pNode->n+
32d0: 31 20 3a 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1 : 1;.}../*.** 
32e0: 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f  Reclaim all memo
32f0: 72 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ry allocated by 
3300: 61 20 4a 73 6f 6e 50 61 72 73 65 20 6f 62 6a 65  a JsonParse obje
3310: 63 74 2e 20 20 42 75 74 20 64 6f 20 6e 6f 74 0a  ct.  But do not.
3320: 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 4a 73  ** delete the Js
3330: 6f 6e 50 61 72 73 65 20 6f 62 6a 65 63 74 20 69  onParse object i
3340: 74 73 65 6c 66 2e 0a 2a 2f 0a 73 74 61 74 69 63  tself..*/.static
3350: 20 76 6f 69 64 20 6a 73 6f 6e 50 61 72 73 65 52   void jsonParseR
3360: 65 73 65 74 28 4a 73 6f 6e 50 61 72 73 65 20 2a  eset(JsonParse *
3370: 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
3380: 65 33 5f 66 72 65 65 28 70 50 61 72 73 65 2d 3e  e3_free(pParse->
3390: 61 4e 6f 64 65 29 3b 0a 20 20 70 50 61 72 73 65  aNode);.  pParse
33a0: 2d 3e 61 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 70  ->aNode = 0;.  p
33b0: 50 61 72 73 65 2d 3e 6e 4e 6f 64 65 20 3d 20 30  Parse->nNode = 0
33c0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 41 6c 6c  ;.  pParse->nAll
33d0: 6f 63 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  oc = 0;.  sqlite
33e0: 33 5f 66 72 65 65 28 70 50 61 72 73 65 2d 3e 61  3_free(pParse->a
33f0: 55 70 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 61  Up);.  pParse->a
3400: 55 70 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Up = 0;.}../*.**
3410: 20 46 72 65 65 20 61 20 4a 73 6f 6e 50 61 72 73   Free a JsonPars
3420: 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 61  e object that wa
3430: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
3440: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
3450: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3460: 20 6a 73 6f 6e 50 61 72 73 65 46 72 65 65 28 4a   jsonParseFree(J
3470: 73 6f 6e 50 61 72 73 65 20 2a 70 50 61 72 73 65  sonParse *pParse
3480: 29 7b 0a 20 20 6a 73 6f 6e 50 61 72 73 65 52 65  ){.  jsonParseRe
3490: 73 65 74 28 70 50 61 72 73 65 29 3b 0a 20 20 73  set(pParse);.  s
34a0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 72  qlite3_free(pPar
34b0: 73 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  se);.}../*.** Co
34c0: 6e 76 65 72 74 20 74 68 65 20 4a 73 6f 6e 4e 6f  nvert the JsonNo
34d0: 64 65 20 70 4e 6f 64 65 20 69 6e 74 6f 20 61 20  de pNode into a 
34e0: 70 75 72 65 20 4a 53 4f 4e 20 73 74 72 69 6e 67  pure JSON string
34f0: 20 61 6e 64 0a 2a 2a 20 61 70 70 65 6e 64 20 74   and.** append t
3500: 6f 20 70 4f 75 74 2e 20 20 53 75 62 73 75 62 73  o pOut.  Subsubs
3510: 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 73 6f  tructure is also
3520: 20 69 6e 63 6c 75 64 65 64 2e 20 20 52 65 74 75   included.  Retu
3530: 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  rn.** the number
3540: 20 6f 66 20 4a 73 6f 6e 4e 6f 64 65 20 6f 62 6a   of JsonNode obj
3550: 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65 6e  ects that are en
3560: 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  coded..*/.static
3570: 20 76 6f 69 64 20 6a 73 6f 6e 52 65 6e 64 65 72   void jsonRender
3580: 4e 6f 64 65 28 0a 20 20 4a 73 6f 6e 4e 6f 64 65  Node(.  JsonNode
3590: 20 2a 70 4e 6f 64 65 2c 20 20 20 20 20 20 20 20   *pNode,        
35a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 6f         /* The no
35b0: 64 65 20 74 6f 20 72 65 6e 64 65 72 20 2a 2f 0a  de to render */.
35c0: 20 20 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70 4f    JsonString *pO
35d0: 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ut,             
35e0: 20 2f 2a 20 57 72 69 74 65 20 4a 53 4f 4e 20 68   /* Write JSON h
35f0: 65 72 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ere */.  sqlite3
3600: 5f 76 61 6c 75 65 20 2a 2a 61 52 65 70 6c 61 63  _value **aReplac
3610: 65 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6c 61  e       /* Repla
3620: 63 65 6d 65 6e 74 20 76 61 6c 75 65 73 20 2a 2f  cement values */
3630: 0a 29 7b 0a 20 20 69 66 28 20 70 4e 6f 64 65 2d  .){.  if( pNode-
3640: 3e 6a 6e 46 6c 61 67 73 20 26 20 28 4a 4e 4f 44  >jnFlags & (JNOD
3650: 45 5f 52 45 50 4c 41 43 45 7c 4a 4e 4f 44 45 5f  E_REPLACE|JNODE_
3660: 50 41 54 43 48 29 20 29 7b 0a 20 20 20 20 69 66  PATCH) ){.    if
3670: 28 20 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73  ( pNode->jnFlags
3680: 20 26 20 4a 4e 4f 44 45 5f 52 45 50 4c 41 43 45   & JNODE_REPLACE
3690: 20 29 7b 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70   ){.      jsonAp
36a0: 70 65 6e 64 56 61 6c 75 65 28 70 4f 75 74 2c 20  pendValue(pOut, 
36b0: 61 52 65 70 6c 61 63 65 5b 70 4e 6f 64 65 2d 3e  aReplace[pNode->
36c0: 75 2e 69 52 65 70 6c 61 63 65 5d 29 3b 0a 20 20  u.iReplace]);.  
36d0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
36e0: 7d 0a 20 20 20 20 70 4e 6f 64 65 20 3d 20 70 4e  }.    pNode = pN
36f0: 6f 64 65 2d 3e 75 2e 70 50 61 74 63 68 3b 0a 20  ode->u.pPatch;. 
3700: 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70 4e 6f   }.  switch( pNo
3710: 64 65 2d 3e 65 54 79 70 65 20 29 7b 0a 20 20 20  de->eType ){.   
3720: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
3730: 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d    assert( pNode-
3740: 3e 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f 4e 55 4c  >eType==JSON_NUL
3750: 4c 20 29 3b 0a 20 20 20 20 20 20 6a 73 6f 6e 41  L );.      jsonA
3760: 70 70 65 6e 64 52 61 77 28 70 4f 75 74 2c 20 22  ppendRaw(pOut, "
3770: 6e 75 6c 6c 22 2c 20 34 29 3b 0a 20 20 20 20 20  null", 4);.     
3780: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
3790: 20 20 63 61 73 65 20 4a 53 4f 4e 5f 54 52 55 45    case JSON_TRUE
37a0: 3a 20 7b 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70  : {.      jsonAp
37b0: 70 65 6e 64 52 61 77 28 70 4f 75 74 2c 20 22 74  pendRaw(pOut, "t
37c0: 72 75 65 22 2c 20 34 29 3b 0a 20 20 20 20 20 20  rue", 4);.      
37d0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
37e0: 20 63 61 73 65 20 4a 53 4f 4e 5f 46 41 4c 53 45   case JSON_FALSE
37f0: 3a 20 7b 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70  : {.      jsonAp
3800: 70 65 6e 64 52 61 77 28 70 4f 75 74 2c 20 22 66  pendRaw(pOut, "f
3810: 61 6c 73 65 22 2c 20 35 29 3b 0a 20 20 20 20 20  alse", 5);.     
3820: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
3830: 20 20 63 61 73 65 20 4a 53 4f 4e 5f 53 54 52 49    case JSON_STRI
3840: 4e 47 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  NG: {.      if( 
3850: 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73 20 26  pNode->jnFlags &
3860: 20 4a 4e 4f 44 45 5f 52 41 57 20 29 7b 0a 20 20   JNODE_RAW ){.  
3870: 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64        jsonAppend
3880: 53 74 72 69 6e 67 28 70 4f 75 74 2c 20 70 4e 6f  String(pOut, pNo
3890: 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 2c  de->u.zJContent,
38a0: 20 70 4e 6f 64 65 2d 3e 6e 29 3b 0a 20 20 20 20   pNode->n);.    
38b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
38c0: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c   }.      /* Fall
38d0: 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20 74 68   through into th
38e0: 65 20 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20  e next case */. 
38f0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 53     }.    case JS
3900: 4f 4e 5f 52 45 41 4c 3a 0a 20 20 20 20 63 61 73  ON_REAL:.    cas
3910: 65 20 4a 53 4f 4e 5f 49 4e 54 3a 20 7b 0a 20 20  e JSON_INT: {.  
3920: 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 52 61      jsonAppendRa
3930: 77 28 70 4f 75 74 2c 20 70 4e 6f 64 65 2d 3e 75  w(pOut, pNode->u
3940: 2e 7a 4a 43 6f 6e 74 65 6e 74 2c 20 70 4e 6f 64  .zJContent, pNod
3950: 65 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  e->n);.      bre
3960: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
3970: 73 65 20 4a 53 4f 4e 5f 41 52 52 41 59 3a 20 7b  se JSON_ARRAY: {
3980: 0a 20 20 20 20 20 20 75 33 32 20 6a 20 3d 20 31  .      u32 j = 1
3990: 3b 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65  ;.      jsonAppe
39a0: 6e 64 43 68 61 72 28 70 4f 75 74 2c 20 27 5b 27  ndChar(pOut, '['
39b0: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29  );.      for(;;)
39c0: 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
39d0: 20 6a 3c 3d 70 4e 6f 64 65 2d 3e 6e 20 29 7b 0a   j<=pNode->n ){.
39e0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
39f0: 4e 6f 64 65 5b 6a 5d 2e 6a 6e 46 6c 61 67 73 20  Node[j].jnFlags 
3a00: 26 20 4a 4e 4f 44 45 5f 52 45 4d 4f 56 45 29 3d  & JNODE_REMOVE)=
3a10: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
3a20: 20 20 6a 73 6f 6e 41 70 70 65 6e 64 53 65 70 61    jsonAppendSepa
3a30: 72 61 74 6f 72 28 70 4f 75 74 29 3b 0a 20 20 20  rator(pOut);.   
3a40: 20 20 20 20 20 20 20 20 20 6a 73 6f 6e 52 65 6e           jsonRen
3a50: 64 65 72 4e 6f 64 65 28 26 70 4e 6f 64 65 5b 6a  derNode(&pNode[j
3a60: 5d 2c 20 70 4f 75 74 2c 20 61 52 65 70 6c 61 63  ], pOut, aReplac
3a70: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
3a80: 20 20 20 20 20 20 20 20 20 20 6a 20 2b 3d 20 6a            j += j
3a90: 73 6f 6e 4e 6f 64 65 53 69 7a 65 28 26 70 4e 6f  sonNodeSize(&pNo
3aa0: 64 65 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20  de[j]);.        
3ab0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  }.        if( (p
3ac0: 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73 20 26 20  Node->jnFlags & 
3ad0: 4a 4e 4f 44 45 5f 41 50 50 45 4e 44 29 3d 3d 30  JNODE_APPEND)==0
3ae0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
3af0: 20 20 70 4e 6f 64 65 20 3d 20 26 70 4e 6f 64 65    pNode = &pNode
3b00: 5b 70 4e 6f 64 65 2d 3e 75 2e 69 41 70 70 65 6e  [pNode->u.iAppen
3b10: 64 5d 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20  d];.        j = 
3b20: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
3b30: 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61 72 28   jsonAppendChar(
3b40: 70 4f 75 74 2c 20 27 5d 27 29 3b 0a 20 20 20 20  pOut, ']');.    
3b50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3b60: 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f 4f 42 4a     case JSON_OBJ
3b70: 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 75 33 32  ECT: {.      u32
3b80: 20 6a 20 3d 20 31 3b 0a 20 20 20 20 20 20 6a 73   j = 1;.      js
3b90: 6f 6e 41 70 70 65 6e 64 43 68 61 72 28 70 4f 75  onAppendChar(pOu
3ba0: 74 2c 20 27 7b 27 29 3b 0a 20 20 20 20 20 20 66  t, '{');.      f
3bb0: 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20  or(;;){.        
3bc0: 77 68 69 6c 65 28 20 6a 3c 3d 70 4e 6f 64 65 2d  while( j<=pNode-
3bd0: 3e 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >n ){.          
3be0: 69 66 28 20 28 70 4e 6f 64 65 5b 6a 2b 31 5d 2e  if( (pNode[j+1].
3bf0: 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f  jnFlags & JNODE_
3c00: 52 45 4d 4f 56 45 29 3d 3d 30 20 29 7b 0a 20 20  REMOVE)==0 ){.  
3c10: 20 20 20 20 20 20 20 20 20 20 6a 73 6f 6e 41 70            jsonAp
3c20: 70 65 6e 64 53 65 70 61 72 61 74 6f 72 28 70 4f  pendSeparator(pO
3c30: 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ut);.           
3c40: 20 6a 73 6f 6e 52 65 6e 64 65 72 4e 6f 64 65 28   jsonRenderNode(
3c50: 26 70 4e 6f 64 65 5b 6a 5d 2c 20 70 4f 75 74 2c  &pNode[j], pOut,
3c60: 20 61 52 65 70 6c 61 63 65 29 3b 0a 20 20 20 20   aReplace);.    
3c70: 20 20 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65          jsonAppe
3c80: 6e 64 43 68 61 72 28 70 4f 75 74 2c 20 27 3a 27  ndChar(pOut, ':'
3c90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  );.            j
3ca0: 73 6f 6e 52 65 6e 64 65 72 4e 6f 64 65 28 26 70  sonRenderNode(&p
3cb0: 4e 6f 64 65 5b 6a 2b 31 5d 2c 20 70 4f 75 74 2c  Node[j+1], pOut,
3cc0: 20 61 52 65 70 6c 61 63 65 29 3b 0a 20 20 20 20   aReplace);.    
3cd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3ce0: 20 20 6a 20 2b 3d 20 31 20 2b 20 6a 73 6f 6e 4e    j += 1 + jsonN
3cf0: 6f 64 65 53 69 7a 65 28 26 70 4e 6f 64 65 5b 6a  odeSize(&pNode[j
3d00: 2b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  +1]);.        }.
3d10: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4e 6f          if( (pNo
3d20: 64 65 2d 3e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e  de->jnFlags & JN
3d30: 4f 44 45 5f 41 50 50 45 4e 44 29 3d 3d 30 20 29  ODE_APPEND)==0 )
3d40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
3d50: 70 4e 6f 64 65 20 3d 20 26 70 4e 6f 64 65 5b 70  pNode = &pNode[p
3d60: 4e 6f 64 65 2d 3e 75 2e 69 41 70 70 65 6e 64 5d  Node->u.iAppend]
3d70: 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 31 3b  ;.        j = 1;
3d80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6a  .      }.      j
3d90: 73 6f 6e 41 70 70 65 6e 64 43 68 61 72 28 70 4f  sonAppendChar(pO
3da0: 75 74 2c 20 27 7d 27 29 3b 0a 20 20 20 20 20 20  ut, '}');.      
3db0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
3dc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
3dd0: 20 61 20 4a 73 6f 6e 4e 6f 64 65 20 61 6e 64 20   a JsonNode and 
3de0: 61 6c 6c 20 69 74 73 20 64 65 73 63 65 6e 64 65  all its descende
3df0: 6e 74 73 20 61 73 20 61 20 4a 53 4f 4e 20 73 74  nts as a JSON st
3e00: 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ring..*/.static 
3e10: 76 6f 69 64 20 6a 73 6f 6e 52 65 74 75 72 6e 4a  void jsonReturnJ
3e20: 73 6f 6e 28 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20  son(.  JsonNode 
3e30: 2a 70 4e 6f 64 65 2c 20 20 20 20 20 20 20 20 20  *pNode,         
3e40: 20 20 20 2f 2a 20 4e 6f 64 65 20 74 6f 20 72 65     /* Node to re
3e50: 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  turn */.  sqlite
3e60: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
3e70: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
3e80: 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 66  value for this f
3e90: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  unction */.  sql
3ea0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 52 65  ite3_value **aRe
3eb0: 70 6c 61 63 65 20 20 20 20 2f 2a 20 41 72 72 61  place    /* Arra
3ec0: 79 20 6f 66 20 72 65 70 6c 61 63 65 6d 65 6e 74  y of replacement
3ed0: 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20   values */.){.  
3ee0: 4a 73 6f 6e 53 74 72 69 6e 67 20 73 3b 0a 20 20  JsonString s;.  
3ef0: 6a 73 6f 6e 49 6e 69 74 28 26 73 2c 20 70 43 74  jsonInit(&s, pCt
3f00: 78 29 3b 0a 20 20 6a 73 6f 6e 52 65 6e 64 65 72  x);.  jsonRender
3f10: 4e 6f 64 65 28 70 4e 6f 64 65 2c 20 26 73 2c 20  Node(pNode, &s, 
3f20: 61 52 65 70 6c 61 63 65 29 3b 0a 20 20 6a 73 6f  aReplace);.  jso
3f30: 6e 52 65 73 75 6c 74 28 26 73 29 3b 0a 20 20 73  nResult(&s);.  s
3f40: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 73 75  qlite3_result_su
3f50: 62 74 79 70 65 28 70 43 74 78 2c 20 4a 53 4f 4e  btype(pCtx, JSON
3f60: 5f 53 55 42 54 59 50 45 29 3b 0a 7d 0a 0a 2f 2a  _SUBTYPE);.}../*
3f70: 0a 2a 2a 20 4d 61 6b 65 20 74 68 65 20 4a 73 6f  .** Make the Jso
3f80: 6e 4e 6f 64 65 20 74 68 65 20 72 65 74 75 72 6e  nNode the return
3f90: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 66 75   value of the fu
3fa0: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
3fb0: 63 20 76 6f 69 64 20 6a 73 6f 6e 52 65 74 75 72  c void jsonRetur
3fc0: 6e 28 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70  n(.  JsonNode *p
3fd0: 4e 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20  Node,           
3fe0: 20 2f 2a 20 4e 6f 64 65 20 74 6f 20 72 65 74 75   /* Node to retu
3ff0: 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  rn */.  sqlite3_
4000: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20  context *pCtx,  
4010: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61      /* Return va
4020: 6c 75 65 20 66 6f 72 20 74 68 69 73 20 66 75 6e  lue for this fun
4030: 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  ction */.  sqlit
4040: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 52 65 70 6c  e3_value **aRepl
4050: 61 63 65 20 20 20 20 2f 2a 20 41 72 72 61 79 20  ace    /* Array 
4060: 6f 66 20 72 65 70 6c 61 63 65 6d 65 6e 74 20 76  of replacement v
4070: 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 73 77  alues */.){.  sw
4080: 69 74 63 68 28 20 70 4e 6f 64 65 2d 3e 65 54 79  itch( pNode->eTy
4090: 70 65 20 29 7b 0a 20 20 20 20 64 65 66 61 75 6c  pe ){.    defaul
40a0: 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
40b0: 74 28 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65 3d  t( pNode->eType=
40c0: 3d 4a 53 4f 4e 5f 4e 55 4c 4c 20 29 3b 0a 20 20  =JSON_NULL );.  
40d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
40e0: 6c 74 5f 6e 75 6c 6c 28 70 43 74 78 29 3b 0a 20  lt_null(pCtx);. 
40f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4100: 7d 0a 20 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f  }.    case JSON_
4110: 54 52 55 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  TRUE: {.      sq
4120: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
4130: 28 70 43 74 78 2c 20 31 29 3b 0a 20 20 20 20 20  (pCtx, 1);.     
4140: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4150: 20 20 63 61 73 65 20 4a 53 4f 4e 5f 46 41 4c 53    case JSON_FALS
4160: 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
4170: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 70 43  e3_result_int(pC
4180: 74 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  tx, 0);.      br
4190: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
41a0: 61 73 65 20 4a 53 4f 4e 5f 49 4e 54 3a 20 7b 0a  ase JSON_INT: {.
41b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
41c0: 74 36 34 20 69 20 3d 20 30 3b 0a 20 20 20 20 20  t64 i = 0;.     
41d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
41e0: 20 70 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74   pNode->u.zJCont
41f0: 65 6e 74 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  ent;.      if( z
4200: 5b 30 5d 3d 3d 27 2d 27 20 29 7b 20 7a 2b 2b 3b  [0]=='-' ){ z++;
4210: 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20   }.      while( 
4220: 7a 5b 30 5d 3e 3d 27 30 27 20 26 26 20 7a 5b 30  z[0]>='0' && z[0
4230: 5d 3c 3d 27 39 27 20 29 7b 0a 20 20 20 20 20 20  ]<='9' ){.      
4240: 20 20 75 6e 73 69 67 6e 65 64 20 76 20 3d 20 2a    unsigned v = *
4250: 28 7a 2b 2b 29 20 2d 20 27 30 27 3b 0a 20 20 20  (z++) - '0';.   
4260: 20 20 20 20 20 69 66 28 20 69 3e 3d 4c 41 52 47       if( i>=LARG
4270: 45 53 54 5f 49 4e 54 36 34 2f 31 30 20 29 7b 0a  EST_INT64/10 ){.
4280: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
4290: 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 2f 31 30  LARGEST_INT64/10
42a0: 20 29 20 67 6f 74 6f 20 69 6e 74 5f 61 73 5f 72   ) goto int_as_r
42b0: 65 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 69  eal;.          i
42c0: 66 28 20 7a 5b 30 5d 3e 3d 27 30 27 20 26 26 20  f( z[0]>='0' && 
42d0: 7a 5b 30 5d 3c 3d 27 39 27 20 29 20 67 6f 74 6f  z[0]<='9' ) goto
42e0: 20 69 6e 74 5f 61 73 5f 72 65 61 6c 3b 0a 20 20   int_as_real;.  
42f0: 20 20 20 20 20 20 20 20 69 66 28 20 76 3d 3d 39          if( v==9
4300: 20 29 20 67 6f 74 6f 20 69 6e 74 5f 61 73 5f 72   ) goto int_as_r
4310: 65 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 69  eal;.          i
4320: 66 28 20 76 3d 3d 38 20 29 7b 0a 20 20 20 20 20  f( v==8 ){.     
4330: 20 20 20 20 20 20 20 69 66 28 20 70 4e 6f 64 65         if( pNode
4340: 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 5b 30 5d  ->u.zJContent[0]
4350: 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20  =='-' ){.       
4360: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
4370: 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74 78  esult_int64(pCtx
4380: 2c 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34  , SMALLEST_INT64
4390: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
43a0: 20 67 6f 74 6f 20 69 6e 74 5f 64 6f 6e 65 3b 0a   goto int_done;.
43b0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
43c0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
43d0: 20 67 6f 74 6f 20 69 6e 74 5f 61 73 5f 72 65 61   goto int_as_rea
43e0: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  l;.            }
43f0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
4400: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
4410: 20 3d 20 69 2a 31 30 20 2b 20 76 3b 0a 20 20 20   = i*10 + v;.   
4420: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
4430: 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e  Node->u.zJConten
4440: 74 5b 30 5d 3d 3d 27 2d 27 20 29 7b 20 69 20 3d  t[0]=='-' ){ i =
4450: 20 2d 69 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c   -i; }.      sql
4460: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
4470: 34 28 70 43 74 78 2c 20 69 29 3b 0a 20 20 20 20  4(pCtx, i);.    
4480: 20 20 69 6e 74 5f 64 6f 6e 65 3a 0a 20 20 20 20    int_done:.    
4490: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69    break;.      i
44a0: 6e 74 5f 61 73 5f 72 65 61 6c 3a 20 2f 2a 20 66  nt_as_real: /* f
44b0: 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 72  all through to r
44c0: 65 61 6c 20 2a 2f 3b 0a 20 20 20 20 7d 0a 20 20  eal */;.    }.  
44d0: 20 20 63 61 73 65 20 4a 53 4f 4e 5f 52 45 41 4c    case JSON_REAL
44e0: 3a 20 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65  : {.      double
44f0: 20 72 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   r;.#ifdef SQLIT
4500: 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a 20  E_AMALGAMATION. 
4510: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
4520: 2a 7a 20 3d 20 70 4e 6f 64 65 2d 3e 75 2e 7a 4a  *z = pNode->u.zJ
4530: 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20 73  Content;.      s
4540: 71 6c 69 74 65 33 41 74 6f 46 28 7a 2c 20 26 72  qlite3AtoF(z, &r
4550: 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  , sqlite3Strlen3
4560: 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54 46  0(z), SQLITE_UTF
4570: 38 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  8);.#else.      
4580: 72 20 3d 20 73 74 72 74 6f 64 28 70 4e 6f 64 65  r = strtod(pNode
4590: 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 2c 20 30  ->u.zJContent, 0
45a0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
45b0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64  sqlite3_result_d
45c0: 6f 75 62 6c 65 28 70 43 74 78 2c 20 72 29 3b 0a  ouble(pCtx, r);.
45d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
45e0: 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 53 4f 4e   }.    case JSON
45f0: 5f 53 54 52 49 4e 47 3a 20 7b 0a 23 69 66 20 30  _STRING: {.#if 0
4600: 20 2f 2a 20 4e 65 76 65 72 20 68 61 70 70 65 6e   /* Never happen
4610: 73 20 62 65 63 61 75 73 65 20 4a 4e 4f 44 45 5f  s because JNODE_
4620: 52 41 57 20 69 73 20 6f 6e 6c 79 20 73 65 74 20  RAW is only set 
4630: 62 79 20 6a 73 6f 6e 5f 73 65 74 28 29 2c 0a 20  by json_set(),. 
4640: 20 20 20 20 20 2a 2a 20 6a 73 6f 6e 5f 69 6e 73       ** json_ins
4650: 65 72 74 28 29 20 61 6e 64 20 6a 73 6f 6e 5f 72  ert() and json_r
4660: 65 70 6c 61 63 65 28 29 20 61 6e 64 20 74 68 6f  eplace() and tho
4670: 73 65 20 72 6f 75 74 69 6e 65 73 20 64 6f 20 6e  se routines do n
4680: 6f 74 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c  ot.      ** call
4690: 20 6a 73 6f 6e 52 65 74 75 72 6e 28 29 20 2a 2f   jsonReturn() */
46a0: 0a 20 20 20 20 20 20 69 66 28 20 70 4e 6f 64 65  .      if( pNode
46b0: 2d 3e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44  ->jnFlags & JNOD
46c0: 45 5f 52 41 57 20 29 7b 0a 20 20 20 20 20 20 20  E_RAW ){.       
46d0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
46e0: 74 65 78 74 28 70 43 74 78 2c 20 70 4e 6f 64 65  text(pCtx, pNode
46f0: 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 2c 20 70  ->u.zJContent, p
4700: 4e 6f 64 65 2d 3e 6e 2c 0a 20 20 20 20 20 20 20  Node->n,.       
4710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4720: 20 20 20 20 20 53 51 4c 49 54 45 5f 54 52 41 4e       SQLITE_TRAN
4730: 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 65  SIENT);.      }e
4740: 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20 20 20 20  lse .#endif.    
4750: 20 20 61 73 73 65 72 74 28 20 28 70 4e 6f 64 65    assert( (pNode
4760: 2d 3e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44  ->jnFlags & JNOD
4770: 45 5f 52 41 57 29 3d 3d 30 20 29 3b 0a 20 20 20  E_RAW)==0 );.   
4780: 20 20 20 69 66 28 20 28 70 4e 6f 64 65 2d 3e 6a     if( (pNode->j
4790: 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 45  nFlags & JNODE_E
47a0: 53 43 41 50 45 29 3d 3d 30 20 29 7b 0a 20 20 20  SCAPE)==0 ){.   
47b0: 20 20 20 20 20 2f 2a 20 4a 53 4f 4e 20 66 6f 72       /* JSON for
47c0: 6d 61 74 74 65 64 20 77 69 74 68 6f 75 74 20 61  matted without a
47d0: 6e 79 20 62 61 63 6b 73 6c 61 73 68 2d 65 73 63  ny backslash-esc
47e0: 61 70 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  apes */.        
47f0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
4800: 65 78 74 28 70 43 74 78 2c 20 70 4e 6f 64 65 2d  ext(pCtx, pNode-
4810: 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 2b 31 2c 20  >u.zJContent+1, 
4820: 70 4e 6f 64 65 2d 3e 6e 2d 32 2c 0a 20 20 20 20  pNode->n-2,.    
4830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4840: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54          SQLITE_T
4850: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20  RANSIENT);.     
4860: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
4870: 2f 2a 20 54 72 61 6e 73 6c 61 74 65 20 4a 53 4f  /* Translate JSO
4880: 4e 20 66 6f 72 6d 61 74 74 65 64 20 73 74 72 69  N formatted stri
4890: 6e 67 20 69 6e 74 6f 20 72 61 77 20 74 65 78 74  ng into raw text
48a0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20   */.        u32 
48b0: 69 3b 0a 20 20 20 20 20 20 20 20 75 33 32 20 6e  i;.        u32 n
48c0: 20 3d 20 70 4e 6f 64 65 2d 3e 6e 3b 0a 20 20 20   = pNode->n;.   
48d0: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
48e0: 2a 7a 20 3d 20 70 4e 6f 64 65 2d 3e 75 2e 7a 4a  *z = pNode->u.zJ
48f0: 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20 20  Content;.       
4900: 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 20 20 20   char *zOut;.   
4910: 20 20 20 20 20 75 33 32 20 6a 3b 0a 20 20 20 20       u32 j;.    
4920: 20 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74      zOut = sqlit
4930: 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 2b 31 20 29  e3_malloc( n+1 )
4940: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4f  ;.        if( zO
4950: 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ut==0 ){.       
4960: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
4970: 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43  t_error_nomem(pC
4980: 74 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  tx);.          b
4990: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
49a0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 2c          for(i=1,
49b0: 20 6a 3d 30 3b 20 69 3c 6e 2d 31 3b 20 69 2b 2b   j=0; i<n-1; i++
49c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  ){.          cha
49d0: 72 20 63 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20  r c = z[i];.    
49e0: 20 20 20 20 20 20 69 66 28 20 63 21 3d 27 5c 5c        if( c!='\\
49f0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ' ){.           
4a00: 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a   zOut[j++] = c;.
4a10: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
4a20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 20 3d  .            c =
4a30: 20 7a 5b 2b 2b 69 5d 3b 0a 20 20 20 20 20 20 20   z[++i];.       
4a40: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 75 27 20       if( c=='u' 
4a50: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
4a60: 20 75 33 32 20 76 20 3d 20 30 2c 20 6b 3b 0a 20   u32 v = 0, k;. 
4a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
4a80: 28 6b 3d 30 3b 20 6b 3c 34 3b 20 69 2b 2b 2c 20  (k=0; k<4; i++, 
4a90: 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  k++){.          
4aa0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3c        assert( i<
4ab0: 6e 2d 32 20 29 3b 0a 20 20 20 20 20 20 20 20 20  n-2 );.         
4ac0: 20 20 20 20 20 20 20 63 20 3d 20 7a 5b 69 2b 31         c = z[i+1
4ad0: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
4ae0: 20 20 20 61 73 73 65 72 74 28 20 73 61 66 65 5f     assert( safe_
4af0: 69 73 78 64 69 67 69 74 28 63 29 20 29 3b 0a 20  isxdigit(c) );. 
4b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
4b10: 66 28 20 63 3c 3d 27 39 27 20 29 20 76 20 3d 20  f( c<='9' ) v = 
4b20: 76 2a 31 36 20 2b 20 63 20 2d 20 27 30 27 3b 0a  v*16 + c - '0';.
4b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b40: 65 6c 73 65 20 69 66 28 20 63 3c 3d 27 46 27 20  else if( c<='F' 
4b50: 29 20 76 20 3d 20 76 2a 31 36 20 2b 20 63 20 2d  ) v = v*16 + c -
4b60: 20 27 41 27 20 2b 20 31 30 3b 0a 20 20 20 20 20   'A' + 10;.     
4b70: 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20             else 
4b80: 76 20 3d 20 76 2a 31 36 20 2b 20 63 20 2d 20 27  v = v*16 + c - '
4b90: 61 27 20 2b 20 31 30 3b 0a 20 20 20 20 20 20 20  a' + 10;.       
4ba0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4bb0: 20 20 20 20 20 20 20 69 66 28 20 76 3d 3d 30 20         if( v==0 
4bc0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
4bd0: 20 20 20 20 20 20 20 69 66 28 20 76 3c 3d 30 78         if( v<=0x
4be0: 37 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  7f ){.          
4bf0: 20 20 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20        zOut[j++] 
4c00: 3d 20 28 63 68 61 72 29 76 3b 0a 20 20 20 20 20  = (char)v;.     
4c10: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
4c20: 66 28 20 76 3c 3d 30 78 37 66 66 20 29 7b 0a 20  f( v<=0x7ff ){. 
4c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
4c40: 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 28 63 68 61 72  Out[j++] = (char
4c50: 29 28 30 78 63 30 20 7c 20 28 76 3e 3e 36 29 29  )(0xc0 | (v>>6))
4c60: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
4c70: 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 30 78    zOut[j++] = 0x
4c80: 38 30 20 7c 20 28 76 26 30 78 33 66 29 3b 0a 20  80 | (v&0x3f);. 
4c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c               }el
4ca0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
4cb0: 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20      zOut[j++] = 
4cc0: 28 63 68 61 72 29 28 30 78 65 30 20 7c 20 28 76  (char)(0xe0 | (v
4cd0: 3e 3e 31 32 29 29 3b 0a 20 20 20 20 20 20 20 20  >>12));.        
4ce0: 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b          zOut[j++
4cf0: 5d 20 3d 20 30 78 38 30 20 7c 20 28 28 76 3e 3e  ] = 0x80 | ((v>>
4d00: 36 29 26 30 78 33 66 29 3b 0a 20 20 20 20 20 20  6)&0x3f);.      
4d10: 20 20 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 6a            zOut[j
4d20: 2b 2b 5d 20 3d 20 30 78 38 30 20 7c 20 28 76 26  ++] = 0x80 | (v&
4d30: 30 78 33 66 29 3b 0a 20 20 20 20 20 20 20 20 20  0x3f);.         
4d40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
4d50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4d60: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
4d70: 62 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b' ){.          
4d80: 20 20 20 20 20 20 63 20 3d 20 27 5c 62 27 3b 0a        c = '\b';.
4d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65                }e
4da0: 6c 73 65 20 69 66 28 20 63 3d 3d 27 66 27 20 29  lse if( c=='f' )
4db0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
4dc0: 20 20 63 20 3d 20 27 5c 66 27 3b 0a 20 20 20 20    c = '\f';.    
4dd0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
4de0: 69 66 28 20 63 3d 3d 27 6e 27 20 29 7b 0a 20 20  if( c=='n' ){.  
4df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 20                c 
4e00: 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20  = '\n';.        
4e10: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
4e20: 63 3d 3d 27 72 27 20 29 7b 0a 20 20 20 20 20 20  c=='r' ){.      
4e30: 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c            c = '\
4e40: 72 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r';.            
4e50: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
4e60: 74 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t' ){.          
4e70: 20 20 20 20 20 20 63 20 3d 20 27 5c 74 27 3b 0a        c = '\t';.
4e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
4e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4f                zO
4ea0: 75 74 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20  ut[j++] = c;.   
4eb0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
4ec0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
4ed0: 0a 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 6a 5d  .        zOut[j]
4ee0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71   = 0;.        sq
4ef0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
4f00: 74 28 70 43 74 78 2c 20 7a 4f 75 74 2c 20 6a 2c  t(pCtx, zOut, j,
4f10: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a   sqlite3_free);.
4f20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
4f30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
4f40: 61 73 65 20 4a 53 4f 4e 5f 41 52 52 41 59 3a 0a  ase JSON_ARRAY:.
4f50: 20 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f 4f 42      case JSON_OB
4f60: 4a 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 6a 73  JECT: {.      js
4f70: 6f 6e 52 65 74 75 72 6e 4a 73 6f 6e 28 70 4e 6f  onReturnJson(pNo
4f80: 64 65 2c 20 70 43 74 78 2c 20 61 52 65 70 6c 61  de, pCtx, aRepla
4f90: 63 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ce);.      break
4fa0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
4fb0: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
4fc0: 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nce */.static in
4fd0: 74 20 6a 73 6f 6e 50 61 72 73 65 41 64 64 4e 6f  t jsonParseAddNo
4fe0: 64 65 28 4a 73 6f 6e 50 61 72 73 65 2a 2c 75 33  de(JsonParse*,u3
4ff0: 32 2c 75 33 32 2c 63 6f 6e 73 74 20 63 68 61 72  2,u32,const char
5000: 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d 61 63  *);../*.** A mac
5010: 72 6f 20 74 6f 20 68 69 6e 74 20 74 6f 20 74 68  ro to hint to th
5020: 65 20 63 6f 6d 70 69 6c 65 72 20 74 68 61 74 20  e compiler that 
5030: 61 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  a function shoul
5040: 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 69 6e 6c 69  d not be.** inli
5050: 6e 65 64 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  ned..*/.#if defi
5060: 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 0a 23 20  ned(__GNUC__).# 
5070: 20 64 65 66 69 6e 65 20 4a 53 4f 4e 5f 4e 4f 49   define JSON_NOI
5080: 4e 4c 49 4e 45 20 20 5f 5f 61 74 74 72 69 62 75  NLINE  __attribu
5090: 74 65 5f 5f 28 28 6e 6f 69 6e 6c 69 6e 65 29 29  te__((noinline))
50a0: 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 5f  .#elif defined(_
50b0: 4d 53 43 5f 56 45 52 29 20 26 26 20 5f 4d 53 43  MSC_VER) && _MSC
50c0: 5f 56 45 52 3e 3d 31 33 31 30 0a 23 20 20 64 65  _VER>=1310.#  de
50d0: 66 69 6e 65 20 4a 53 4f 4e 5f 4e 4f 49 4e 4c 49  fine JSON_NOINLI
50e0: 4e 45 20 20 5f 5f 64 65 63 6c 73 70 65 63 28 6e  NE  __declspec(n
50f0: 6f 69 6e 6c 69 6e 65 29 0a 23 65 6c 73 65 0a 23  oinline).#else.#
5100: 20 20 64 65 66 69 6e 65 20 4a 53 4f 4e 5f 4e 4f    define JSON_NO
5110: 49 4e 4c 49 4e 45 0a 23 65 6e 64 69 66 0a 0a 0a  INLINE.#endif...
5120: 73 74 61 74 69 63 20 4a 53 4f 4e 5f 4e 4f 49 4e  static JSON_NOIN
5130: 4c 49 4e 45 20 69 6e 74 20 6a 73 6f 6e 50 61 72  LINE int jsonPar
5140: 73 65 41 64 64 4e 6f 64 65 45 78 70 61 6e 64 28  seAddNodeExpand(
5150: 0a 20 20 4a 73 6f 6e 50 61 72 73 65 20 2a 70 50  .  JsonParse *pP
5160: 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
5170: 41 70 70 65 6e 64 20 74 68 65 20 6e 6f 64 65 20  Append the node 
5180: 74 6f 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a  to this object *
5190: 2f 0a 20 20 75 33 32 20 65 54 79 70 65 2c 20 20  /.  u32 eType,  
51a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
51b0: 20 4e 6f 64 65 20 74 79 70 65 20 2a 2f 0a 20 20   Node type */.  
51c0: 75 33 32 20 6e 2c 20 20 20 20 20 20 20 20 20 20  u32 n,          
51d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
51e0: 74 65 6e 74 20 73 69 7a 65 20 6f 72 20 73 75 62  tent size or sub
51f0: 2d 6e 6f 64 65 20 63 6f 75 6e 74 20 2a 2f 0a 20  -node count */. 
5200: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
5210: 6e 74 65 6e 74 20 20 20 20 20 20 2f 2a 20 43 6f  ntent      /* Co
5220: 6e 74 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 75 33  ntent */.){.  u3
5230: 32 20 6e 4e 65 77 3b 0a 20 20 4a 73 6f 6e 4e 6f  2 nNew;.  JsonNo
5240: 64 65 20 2a 70 4e 65 77 3b 0a 20 20 61 73 73 65  de *pNew;.  asse
5250: 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 4e 6f 64  rt( pParse->nNod
5260: 65 3e 3d 70 50 61 72 73 65 2d 3e 6e 41 6c 6c 6f  e>=pParse->nAllo
5270: 63 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  c );.  if( pPars
5280: 65 2d 3e 6f 6f 6d 20 29 20 72 65 74 75 72 6e 20  e->oom ) return 
5290: 2d 31 3b 0a 20 20 6e 4e 65 77 20 3d 20 70 50 61  -1;.  nNew = pPa
52a0: 72 73 65 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20  rse->nAlloc*2 + 
52b0: 31 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  10;.  pNew = sql
52c0: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70  ite3_realloc64(p
52d0: 50 61 72 73 65 2d 3e 61 4e 6f 64 65 2c 20 73 69  Parse->aNode, si
52e0: 7a 65 6f 66 28 4a 73 6f 6e 4e 6f 64 65 29 2a 6e  zeof(JsonNode)*n
52f0: 4e 65 77 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  New);.  if( pNew
5300: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 72 73  ==0 ){.    pPars
5310: 65 2d 3e 6f 6f 6d 20 3d 20 31 3b 0a 20 20 20 20  e->oom = 1;.    
5320: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20  return -1;.  }. 
5330: 20 70 50 61 72 73 65 2d 3e 6e 41 6c 6c 6f 63 20   pParse->nAlloc 
5340: 3d 20 6e 4e 65 77 3b 0a 20 20 70 50 61 72 73 65  = nNew;.  pParse
5350: 2d 3e 61 4e 6f 64 65 20 3d 20 70 4e 65 77 3b 0a  ->aNode = pNew;.
5360: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
5370: 2d 3e 6e 4e 6f 64 65 3c 70 50 61 72 73 65 2d 3e  ->nNode<pParse->
5380: 6e 41 6c 6c 6f 63 20 29 3b 0a 20 20 72 65 74 75  nAlloc );.  retu
5390: 72 6e 20 6a 73 6f 6e 50 61 72 73 65 41 64 64 4e  rn jsonParseAddN
53a0: 6f 64 65 28 70 50 61 72 73 65 2c 20 65 54 79 70  ode(pParse, eTyp
53b0: 65 2c 20 6e 2c 20 7a 43 6f 6e 74 65 6e 74 29 3b  e, n, zContent);
53c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
53d0: 20 61 20 6e 65 77 20 4a 73 6f 6e 4e 6f 64 65 20   a new JsonNode 
53e0: 69 6e 73 74 61 6e 63 65 20 62 61 73 65 64 20 6f  instance based o
53f0: 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20  n the arguments 
5400: 61 6e 64 20 61 70 70 65 6e 64 20 74 68 61 74 0a  and append that.
5410: 2a 2a 20 69 6e 73 74 61 6e 63 65 20 74 6f 20 74  ** instance to t
5420: 68 65 20 4a 73 6f 6e 50 61 72 73 65 2e 20 20 52  he JsonParse.  R
5430: 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
5440: 69 6e 20 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65  in pParse->aNode
5450: 5b 5d 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 65 77  [] of the.** new
5460: 20 6e 6f 64 65 2c 20 6f 72 20 2d 31 20 69 66 20   node, or -1 if 
5470: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
5480: 69 6f 6e 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  ion fails..*/.st
5490: 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e 50 61 72  atic int jsonPar
54a0: 73 65 41 64 64 4e 6f 64 65 28 0a 20 20 4a 73 6f  seAddNode(.  Jso
54b0: 6e 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  nParse *pParse, 
54c0: 20 20 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64         /* Append
54d0: 20 74 68 65 20 6e 6f 64 65 20 74 6f 20 74 68 69   the node to thi
54e0: 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 33  s object */.  u3
54f0: 32 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20  2 eType,        
5500: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 64 65 20          /* Node 
5510: 74 79 70 65 20 2a 2f 0a 20 20 75 33 32 20 6e 2c  type */.  u32 n,
5520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5530: 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 73      /* Content s
5540: 69 7a 65 20 6f 72 20 73 75 62 2d 6e 6f 64 65 20  ize or sub-node 
5550: 63 6f 75 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  count */.  const
5560: 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 6e 74 20   char *zContent 
5570: 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20       /* Content 
5580: 2a 2f 0a 29 7b 0a 20 20 4a 73 6f 6e 4e 6f 64 65  */.){.  JsonNode
5590: 20 2a 70 3b 0a 20 20 69 66 28 20 70 50 61 72 73   *p;.  if( pPars
55a0: 65 2d 3e 6e 4e 6f 64 65 3e 3d 70 50 61 72 73 65  e->nNode>=pParse
55b0: 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  ->nAlloc ){.    
55c0: 72 65 74 75 72 6e 20 6a 73 6f 6e 50 61 72 73 65  return jsonParse
55d0: 41 64 64 4e 6f 64 65 45 78 70 61 6e 64 28 70 50  AddNodeExpand(pP
55e0: 61 72 73 65 2c 20 65 54 79 70 65 2c 20 6e 2c 20  arse, eType, n, 
55f0: 7a 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 7d 0a 20  zContent);.  }. 
5600: 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 4e   p = &pParse->aN
5610: 6f 64 65 5b 70 50 61 72 73 65 2d 3e 6e 4e 6f 64  ode[pParse->nNod
5620: 65 5d 3b 0a 20 20 70 2d 3e 65 54 79 70 65 20 3d  e];.  p->eType =
5630: 20 28 75 38 29 65 54 79 70 65 3b 0a 20 20 70 2d   (u8)eType;.  p-
5640: 3e 6a 6e 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20  >jnFlags = 0;.  
5650: 70 2d 3e 6e 20 3d 20 6e 3b 0a 20 20 70 2d 3e 75  p->n = n;.  p->u
5660: 2e 7a 4a 43 6f 6e 74 65 6e 74 20 3d 20 7a 43 6f  .zJContent = zCo
5670: 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20  ntent;.  return 
5680: 70 50 61 72 73 65 2d 3e 6e 4e 6f 64 65 2b 2b 3b  pParse->nNode++;
5690: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
56a0: 20 74 72 75 65 20 69 66 20 7a 5b 5d 20 62 65 67   true if z[] beg
56b0: 69 6e 73 20 77 69 74 68 20 34 20 28 6f 72 20 6d  ins with 4 (or m
56c0: 6f 72 65 29 20 68 65 78 61 64 65 63 69 6d 61 6c  ore) hexadecimal
56d0: 20 64 69 67 69 74 73 0a 2a 2f 0a 73 74 61 74 69   digits.*/.stati
56e0: 63 20 69 6e 74 20 6a 73 6f 6e 49 73 34 48 65 78  c int jsonIs4Hex
56f0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
5700: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
5710: 69 3d 30 3b 20 69 3c 34 3b 20 69 2b 2b 29 20 69  i=0; i<4; i++) i
5720: 66 28 20 21 73 61 66 65 5f 69 73 78 64 69 67 69  f( !safe_isxdigi
5730: 74 28 7a 5b 69 5d 29 20 29 20 72 65 74 75 72 6e  t(z[i]) ) return
5740: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   0;.  return 1;.
5750: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61  }../*.** Parse a
5760: 20 73 69 6e 67 6c 65 20 4a 53 4f 4e 20 76 61 6c   single JSON val
5770: 75 65 20 77 68 69 63 68 20 62 65 67 69 6e 73 20  ue which begins 
5780: 61 74 20 70 50 61 72 73 65 2d 3e 7a 4a 73 6f 6e  at pParse->zJson
5790: 5b 69 5d 2e 20 20 52 65 74 75 72 6e 20 74 68 65  [i].  Return the
57a0: 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65  .** index of the
57b0: 20 66 69 72 73 74 20 63 68 61 72 61 63 74 65 72   first character
57c0: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
57d0: 20 74 68 65 20 76 61 6c 75 65 20 70 61 72 73 65   the value parse
57e0: 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
57f0: 6e 65 67 61 74 69 76 65 20 66 6f 72 20 61 20 73  negative for a s
5800: 79 6e 74 61 78 20 65 72 72 6f 72 2e 20 20 53 70  yntax error.  Sp
5810: 65 63 69 61 6c 20 63 61 73 65 73 3a 20 20 72 65  ecial cases:  re
5820: 74 75 72 6e 20 2d 32 20 69 66 20 74 68 65 0a 2a  turn -2 if the.*
5830: 2a 20 66 69 72 73 74 20 6e 6f 6e 2d 77 68 69 74  * first non-whit
5840: 65 73 70 61 63 65 20 63 68 61 72 61 63 74 65 72  espace character
5850: 20 69 73 20 27 7d 27 20 61 6e 64 20 72 65 74 75   is '}' and retu
5860: 72 6e 20 2d 33 20 69 66 20 74 68 65 20 66 69 72  rn -3 if the fir
5870: 73 74 0a 2a 2a 20 6e 6f 6e 2d 77 68 69 74 65 73  st.** non-whites
5880: 70 61 63 65 20 63 68 61 72 61 63 74 65 72 20 69  pace character i
5890: 73 20 27 5d 27 2e 0a 2a 2f 0a 73 74 61 74 69 63  s ']'..*/.static
58a0: 20 69 6e 74 20 6a 73 6f 6e 50 61 72 73 65 56 61   int jsonParseVa
58b0: 6c 75 65 28 4a 73 6f 6e 50 61 72 73 65 20 2a 70  lue(JsonParse *p
58c0: 50 61 72 73 65 2c 20 75 33 32 20 69 29 7b 0a 20  Parse, u32 i){. 
58d0: 20 63 68 61 72 20 63 3b 0a 20 20 75 33 32 20 6a   char c;.  u32 j
58e0: 3b 0a 20 20 69 6e 74 20 69 54 68 69 73 3b 0a 20  ;.  int iThis;. 
58f0: 20 69 6e 74 20 78 3b 0a 20 20 4a 73 6f 6e 4e 6f   int x;.  JsonNo
5900: 64 65 20 2a 70 4e 6f 64 65 3b 0a 20 20 63 6f 6e  de *pNode;.  con
5910: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 50 61  st char *z = pPa
5920: 72 73 65 2d 3e 7a 4a 73 6f 6e 3b 0a 20 20 77 68  rse->zJson;.  wh
5930: 69 6c 65 28 20 73 61 66 65 5f 69 73 73 70 61 63  ile( safe_isspac
5940: 65 28 7a 5b 69 5d 29 20 29 7b 20 69 2b 2b 3b 20  e(z[i]) ){ i++; 
5950: 7d 0a 20 20 69 66 28 20 28 63 20 3d 20 7a 5b 69  }.  if( (c = z[i
5960: 5d 29 3d 3d 27 7b 27 20 29 7b 0a 20 20 20 20 2f  ])=='{' ){.    /
5970: 2a 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 2a  * Parse object *
5980: 2f 0a 20 20 20 20 69 54 68 69 73 20 3d 20 6a 73  /.    iThis = js
5990: 6f 6e 50 61 72 73 65 41 64 64 4e 6f 64 65 28 70  onParseAddNode(p
59a0: 50 61 72 73 65 2c 20 4a 53 4f 4e 5f 4f 42 4a 45  Parse, JSON_OBJE
59b0: 43 54 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  CT, 0, 0);.    i
59c0: 66 28 20 69 54 68 69 73 3c 30 20 29 20 72 65 74  f( iThis<0 ) ret
59d0: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 66 6f 72 28  urn -1;.    for(
59e0: 6a 3d 69 2b 31 3b 3b 6a 2b 2b 29 7b 0a 20 20 20  j=i+1;;j++){.   
59f0: 20 20 20 77 68 69 6c 65 28 20 73 61 66 65 5f 69     while( safe_i
5a00: 73 73 70 61 63 65 28 7a 5b 6a 5d 29 20 29 7b 20  sspace(z[j]) ){ 
5a10: 6a 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 69 66 28  j++; }.      if(
5a20: 20 2b 2b 70 50 61 72 73 65 2d 3e 69 44 65 70 74   ++pParse->iDept
5a30: 68 20 3e 20 4a 53 4f 4e 5f 4d 41 58 5f 44 45 50  h > JSON_MAX_DEP
5a40: 54 48 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  TH ) return -1;.
5a50: 20 20 20 20 20 20 78 20 3d 20 6a 73 6f 6e 50 61        x = jsonPa
5a60: 72 73 65 56 61 6c 75 65 28 70 50 61 72 73 65 2c  rseValue(pParse,
5a70: 20 6a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 78   j);.      if( x
5a80: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  <0 ){.        pP
5a90: 61 72 73 65 2d 3e 69 44 65 70 74 68 2d 2d 3b 0a  arse->iDepth--;.
5aa0: 20 20 20 20 20 20 20 20 69 66 28 20 78 3d 3d 28          if( x==(
5ab0: 2d 32 29 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  -2) && pParse->n
5ac0: 4e 6f 64 65 3d 3d 28 75 33 32 29 69 54 68 69 73  Node==(u32)iThis
5ad0: 2b 31 20 29 20 72 65 74 75 72 6e 20 6a 2b 31 3b  +1 ) return j+1;
5ae0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
5af0: 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
5b00: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6f 6f    if( pParse->oo
5b10: 6d 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  m ) return -1;. 
5b20: 20 20 20 20 20 70 4e 6f 64 65 20 3d 20 26 70 50       pNode = &pP
5b30: 61 72 73 65 2d 3e 61 4e 6f 64 65 5b 70 50 61 72  arse->aNode[pPar
5b40: 73 65 2d 3e 6e 4e 6f 64 65 2d 31 5d 3b 0a 20 20  se->nNode-1];.  
5b50: 20 20 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 65      if( pNode->e
5b60: 54 79 70 65 21 3d 4a 53 4f 4e 5f 53 54 52 49 4e  Type!=JSON_STRIN
5b70: 47 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  G ) return -1;. 
5b80: 20 20 20 20 20 70 4e 6f 64 65 2d 3e 6a 6e 46 6c       pNode->jnFl
5b90: 61 67 73 20 7c 3d 20 4a 4e 4f 44 45 5f 4c 41 42  ags |= JNODE_LAB
5ba0: 45 4c 3b 0a 20 20 20 20 20 20 6a 20 3d 20 78 3b  EL;.      j = x;
5bb0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 73 61  .      while( sa
5bc0: 66 65 5f 69 73 73 70 61 63 65 28 7a 5b 6a 5d 29  fe_isspace(z[j])
5bd0: 20 29 7b 20 6a 2b 2b 3b 20 7d 0a 20 20 20 20 20   ){ j++; }.     
5be0: 20 69 66 28 20 7a 5b 6a 5d 21 3d 27 3a 27 20 29   if( z[j]!=':' )
5bf0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
5c00: 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 78 20 3d    j++;.      x =
5c10: 20 6a 73 6f 6e 50 61 72 73 65 56 61 6c 75 65 28   jsonParseValue(
5c20: 70 50 61 72 73 65 2c 20 6a 29 3b 0a 20 20 20 20  pParse, j);.    
5c30: 20 20 70 50 61 72 73 65 2d 3e 69 44 65 70 74 68    pParse->iDepth
5c40: 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3c  --;.      if( x<
5c50: 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  0 ) return -1;. 
5c60: 20 20 20 20 20 6a 20 3d 20 78 3b 0a 20 20 20 20       j = x;.    
5c70: 20 20 77 68 69 6c 65 28 20 73 61 66 65 5f 69 73    while( safe_is
5c80: 73 70 61 63 65 28 7a 5b 6a 5d 29 20 29 7b 20 6a  space(z[j]) ){ j
5c90: 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 63 20 3d 20  ++; }.      c = 
5ca0: 7a 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  z[j];.      if( 
5cb0: 63 3d 3d 27 2c 27 20 29 20 63 6f 6e 74 69 6e 75  c==',' ) continu
5cc0: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 63 21 3d  e;.      if( c!=
5cd0: 27 7d 27 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  '}' ) return -1;
5ce0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5cf0: 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
5d00: 61 4e 6f 64 65 5b 69 54 68 69 73 5d 2e 6e 20 3d  aNode[iThis].n =
5d10: 20 70 50 61 72 73 65 2d 3e 6e 4e 6f 64 65 20 2d   pParse->nNode -
5d20: 20 28 75 33 32 29 69 54 68 69 73 20 2d 20 31 3b   (u32)iThis - 1;
5d30: 0a 20 20 20 20 72 65 74 75 72 6e 20 6a 2b 31 3b  .    return j+1;
5d40: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d  .  }else if( c==
5d50: 27 5b 27 20 29 7b 0a 20 20 20 20 2f 2a 20 50 61  '[' ){.    /* Pa
5d60: 72 73 65 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  rse array */.   
5d70: 20 69 54 68 69 73 20 3d 20 6a 73 6f 6e 50 61 72   iThis = jsonPar
5d80: 73 65 41 64 64 4e 6f 64 65 28 70 50 61 72 73 65  seAddNode(pParse
5d90: 2c 20 4a 53 4f 4e 5f 41 52 52 41 59 2c 20 30 2c  , JSON_ARRAY, 0,
5da0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 69 54 68   0);.    if( iTh
5db0: 69 73 3c 30 20 29 20 72 65 74 75 72 6e 20 2d 31  is<0 ) return -1
5dc0: 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b  ;.    for(j=i+1;
5dd0: 3b 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 69  ;j++){.      whi
5de0: 6c 65 28 20 73 61 66 65 5f 69 73 73 70 61 63 65  le( safe_isspace
5df0: 28 7a 5b 6a 5d 29 20 29 7b 20 6a 2b 2b 3b 20 7d  (z[j]) ){ j++; }
5e00: 0a 20 20 20 20 20 20 69 66 28 20 2b 2b 70 50 61  .      if( ++pPa
5e10: 72 73 65 2d 3e 69 44 65 70 74 68 20 3e 20 4a 53  rse->iDepth > JS
5e20: 4f 4e 5f 4d 41 58 5f 44 45 50 54 48 20 29 20 72  ON_MAX_DEPTH ) r
5e30: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
5e40: 78 20 3d 20 6a 73 6f 6e 50 61 72 73 65 56 61 6c  x = jsonParseVal
5e50: 75 65 28 70 50 61 72 73 65 2c 20 6a 29 3b 0a 20  ue(pParse, j);. 
5e60: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 69 44 65       pParse->iDe
5e70: 70 74 68 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28  pth--;.      if(
5e80: 20 78 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20   x<0 ){.        
5e90: 69 66 28 20 78 3d 3d 28 2d 33 29 20 26 26 20 70  if( x==(-3) && p
5ea0: 50 61 72 73 65 2d 3e 6e 4e 6f 64 65 3d 3d 28 75  Parse->nNode==(u
5eb0: 33 32 29 69 54 68 69 73 2b 31 20 29 20 72 65 74  32)iThis+1 ) ret
5ec0: 75 72 6e 20 6a 2b 31 3b 0a 20 20 20 20 20 20 20  urn j+1;.       
5ed0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
5ee0: 20 20 7d 0a 20 20 20 20 20 20 6a 20 3d 20 78 3b    }.      j = x;
5ef0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 73 61  .      while( sa
5f00: 66 65 5f 69 73 73 70 61 63 65 28 7a 5b 6a 5d 29  fe_isspace(z[j])
5f10: 20 29 7b 20 6a 2b 2b 3b 20 7d 0a 20 20 20 20 20   ){ j++; }.     
5f20: 20 63 20 3d 20 7a 5b 6a 5d 3b 0a 20 20 20 20 20   c = z[j];.     
5f30: 20 69 66 28 20 63 3d 3d 27 2c 27 20 29 20 63 6f   if( c==',' ) co
5f40: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
5f50: 28 20 63 21 3d 27 5d 27 20 29 20 72 65 74 75 72  ( c!=']' ) retur
5f60: 6e 20 2d 31 3b 0a 20 20 20 20 20 20 62 72 65 61  n -1;.      brea
5f70: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  k;.    }.    pPa
5f80: 72 73 65 2d 3e 61 4e 6f 64 65 5b 69 54 68 69 73  rse->aNode[iThis
5f90: 5d 2e 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4e  ].n = pParse->nN
5fa0: 6f 64 65 20 2d 20 28 75 33 32 29 69 54 68 69 73  ode - (u32)iThis
5fb0: 20 2d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   - 1;.    return
5fc0: 20 6a 2b 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66   j+1;.  }else if
5fd0: 28 20 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20  ( c=='"' ){.    
5fe0: 2f 2a 20 50 61 72 73 65 20 73 74 72 69 6e 67 20  /* Parse string 
5ff0: 2a 2f 0a 20 20 20 20 75 38 20 6a 6e 46 6c 61 67  */.    u8 jnFlag
6000: 73 20 3d 20 30 3b 0a 20 20 20 20 6a 20 3d 20 69  s = 0;.    j = i
6010: 2b 31 3b 0a 20 20 20 20 66 6f 72 28 3b 3b 29 7b  +1;.    for(;;){
6020: 0a 20 20 20 20 20 20 63 20 3d 20 7a 5b 6a 5d 3b  .      c = z[j];
6030: 0a 20 20 20 20 20 20 69 66 28 20 28 63 20 26 20  .      if( (c & 
6040: 7e 30 78 31 66 29 3d 3d 30 20 29 7b 0a 20 20 20  ~0x1f)==0 ){.   
6050: 20 20 20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20       /* Control 
6060: 63 68 61 72 61 63 74 65 72 73 20 61 72 65 20 6e  characters are n
6070: 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 73 74  ot allowed in st
6080: 72 69 6e 67 73 20 2a 2f 0a 20 20 20 20 20 20 20  rings */.       
6090: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
60a0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d    }.      if( c=
60b0: 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 20  ='\\' ){.       
60c0: 20 63 20 3d 20 7a 5b 2b 2b 6a 5d 3b 0a 20 20 20   c = z[++j];.   
60d0: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 22 27 20       if( c=='"' 
60e0: 7c 7c 20 63 3d 3d 27 5c 5c 27 20 7c 7c 20 63 3d  || c=='\\' || c=
60f0: 3d 27 2f 27 20 7c 7c 20 63 3d 3d 27 62 27 20 7c  ='/' || c=='b' |
6100: 7c 20 63 3d 3d 27 66 27 0a 20 20 20 20 20 20 20  | c=='f'.       
6110: 20 20 20 20 7c 7c 20 63 3d 3d 27 6e 27 20 7c 7c      || c=='n' ||
6120: 20 63 3d 3d 27 72 27 20 7c 7c 20 63 3d 3d 27 74   c=='r' || c=='t
6130: 27 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  '.           || 
6140: 28 63 3d 3d 27 75 27 20 26 26 20 6a 73 6f 6e 49  (c=='u' && jsonI
6150: 73 34 48 65 78 28 7a 2b 6a 2b 31 29 29 20 29 7b  s4Hex(z+j+1)) ){
6160: 0a 20 20 20 20 20 20 20 20 20 20 6a 6e 46 6c 61  .          jnFla
6170: 67 73 20 3d 20 4a 4e 4f 44 45 5f 45 53 43 41 50  gs = JNODE_ESCAP
6180: 45 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  E;.        }else
6190: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
61a0: 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d  rn -1;.        }
61b0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
61c0: 20 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20   c=='"' ){.     
61d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
61e0: 7d 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20  }.      j++;.   
61f0: 20 7d 0a 20 20 20 20 6a 73 6f 6e 50 61 72 73 65   }.    jsonParse
6200: 41 64 64 4e 6f 64 65 28 70 50 61 72 73 65 2c 20  AddNode(pParse, 
6210: 4a 53 4f 4e 5f 53 54 52 49 4e 47 2c 20 6a 2b 31  JSON_STRING, j+1
6220: 2d 69 2c 20 26 7a 5b 69 5d 29 3b 0a 20 20 20 20  -i, &z[i]);.    
6230: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6f 6f 6d  if( !pParse->oom
6240: 20 29 20 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65   ) pParse->aNode
6250: 5b 70 50 61 72 73 65 2d 3e 6e 4e 6f 64 65 2d 31  [pParse->nNode-1
6260: 5d 2e 6a 6e 46 6c 61 67 73 20 3d 20 6a 6e 46 6c  ].jnFlags = jnFl
6270: 61 67 73 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ags;.    return 
6280: 6a 2b 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  j+1;.  }else if(
6290: 20 63 3d 3d 27 6e 27 0a 20 20 20 20 20 20 20 20   c=='n'.        
62a0: 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 2b 69 2c   && strncmp(z+i,
62b0: 22 6e 75 6c 6c 22 2c 34 29 3d 3d 30 0a 20 20 20  "null",4)==0.   
62c0: 20 20 20 20 20 20 26 26 20 21 73 61 66 65 5f 69        && !safe_i
62d0: 73 61 6c 6e 75 6d 28 7a 5b 69 2b 34 5d 29 20 29  salnum(z[i+4]) )
62e0: 7b 0a 20 20 20 20 6a 73 6f 6e 50 61 72 73 65 41  {.    jsonParseA
62f0: 64 64 4e 6f 64 65 28 70 50 61 72 73 65 2c 20 4a  ddNode(pParse, J
6300: 53 4f 4e 5f 4e 55 4c 4c 2c 20 30 2c 20 30 29 3b  SON_NULL, 0, 0);
6310: 0a 20 20 20 20 72 65 74 75 72 6e 20 69 2b 34 3b  .    return i+4;
6320: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d  .  }else if( c==
6330: 27 74 27 0a 20 20 20 20 20 20 20 20 20 26 26 20  't'.         && 
6340: 73 74 72 6e 63 6d 70 28 7a 2b 69 2c 22 74 72 75  strncmp(z+i,"tru
6350: 65 22 2c 34 29 3d 3d 30 0a 20 20 20 20 20 20 20  e",4)==0.       
6360: 20 20 26 26 20 21 73 61 66 65 5f 69 73 61 6c 6e    && !safe_isaln
6370: 75 6d 28 7a 5b 69 2b 34 5d 29 20 29 7b 0a 20 20  um(z[i+4]) ){.  
6380: 20 20 6a 73 6f 6e 50 61 72 73 65 41 64 64 4e 6f    jsonParseAddNo
6390: 64 65 28 70 50 61 72 73 65 2c 20 4a 53 4f 4e 5f  de(pParse, JSON_
63a0: 54 52 55 45 2c 20 30 2c 20 30 29 3b 0a 20 20 20  TRUE, 0, 0);.   
63b0: 20 72 65 74 75 72 6e 20 69 2b 34 3b 0a 20 20 7d   return i+4;.  }
63c0: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 66 27 0a  else if( c=='f'.
63d0: 20 20 20 20 20 20 20 20 20 26 26 20 73 74 72 6e           && strn
63e0: 63 6d 70 28 7a 2b 69 2c 22 66 61 6c 73 65 22 2c  cmp(z+i,"false",
63f0: 35 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  5)==0.         &
6400: 26 20 21 73 61 66 65 5f 69 73 61 6c 6e 75 6d 28  & !safe_isalnum(
6410: 7a 5b 69 2b 35 5d 29 20 29 7b 0a 20 20 20 20 6a  z[i+5]) ){.    j
6420: 73 6f 6e 50 61 72 73 65 41 64 64 4e 6f 64 65 28  sonParseAddNode(
6430: 70 50 61 72 73 65 2c 20 4a 53 4f 4e 5f 46 41 4c  pParse, JSON_FAL
6440: 53 45 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 72  SE, 0, 0);.    r
6450: 65 74 75 72 6e 20 69 2b 35 3b 0a 20 20 7d 65 6c  eturn i+5;.  }el
6460: 73 65 20 69 66 28 20 63 3d 3d 27 2d 27 20 7c 7c  se if( c=='-' ||
6470: 20 28 63 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27   (c>='0' && c<='
6480: 39 27 29 20 29 7b 0a 20 20 20 20 2f 2a 20 50 61  9') ){.    /* Pa
6490: 72 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  rse number */.  
64a0: 20 20 75 38 20 73 65 65 6e 44 50 20 3d 20 30 3b    u8 seenDP = 0;
64b0: 0a 20 20 20 20 75 38 20 73 65 65 6e 45 20 3d 20  .    u8 seenE = 
64c0: 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 27  0;.    assert( '
64d0: 2d 27 20 3c 20 27 30 27 20 29 3b 0a 20 20 20 20  -' < '0' );.    
64e0: 69 66 28 20 63 3c 3d 27 30 27 20 29 7b 0a 20 20  if( c<='0' ){.  
64f0: 20 20 20 20 6a 20 3d 20 63 3d 3d 27 2d 27 20 3f      j = c=='-' ?
6500: 20 69 2b 31 20 3a 20 69 3b 0a 20 20 20 20 20 20   i+1 : i;.      
6510: 69 66 28 20 7a 5b 6a 5d 3d 3d 27 30 27 20 26 26  if( z[j]=='0' &&
6520: 20 7a 5b 6a 2b 31 5d 3e 3d 27 30 27 20 26 26 20   z[j+1]>='0' && 
6530: 7a 5b 6a 2b 31 5d 3c 3d 27 39 27 20 29 20 72 65  z[j+1]<='9' ) re
6540: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  turn -1;.    }. 
6550: 20 20 20 6a 20 3d 20 69 2b 31 3b 0a 20 20 20 20     j = i+1;.    
6560: 66 6f 72 28 3b 3b 20 6a 2b 2b 29 7b 0a 20 20 20  for(;; j++){.   
6570: 20 20 20 63 20 3d 20 7a 5b 6a 5d 3b 0a 20 20 20     c = z[j];.   
6580: 20 20 20 69 66 28 20 63 3e 3d 27 30 27 20 26 26     if( c>='0' &&
6590: 20 63 3c 3d 27 39 27 20 29 20 63 6f 6e 74 69 6e   c<='9' ) contin
65a0: 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d  ue;.      if( c=
65b0: 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='.' ){.        
65c0: 69 66 28 20 7a 5b 6a 2d 31 5d 3d 3d 27 2d 27 20  if( z[j-1]=='-' 
65d0: 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
65e0: 20 20 20 20 20 69 66 28 20 73 65 65 6e 44 50 20       if( seenDP 
65f0: 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
6600: 20 20 20 20 20 73 65 65 6e 44 50 20 3d 20 31 3b       seenDP = 1;
6610: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
6620: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
6630: 20 69 66 28 20 63 3d 3d 27 65 27 20 7c 7c 20 63   if( c=='e' || c
6640: 3d 3d 27 45 27 20 29 7b 0a 20 20 20 20 20 20 20  =='E' ){.       
6650: 20 69 66 28 20 7a 5b 6a 2d 31 5d 3c 27 30 27 20   if( z[j-1]<'0' 
6660: 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
6670: 20 20 20 20 20 69 66 28 20 73 65 65 6e 45 20 29       if( seenE )
6680: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
6690: 20 20 20 20 73 65 65 6e 44 50 20 3d 20 73 65 65      seenDP = see
66a0: 6e 45 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nE = 1;.        
66b0: 63 20 3d 20 7a 5b 6a 2b 31 5d 3b 0a 20 20 20 20  c = z[j+1];.    
66c0: 20 20 20 20 69 66 28 20 63 3d 3d 27 2b 27 20 7c      if( c=='+' |
66d0: 7c 20 63 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20  | c=='-' ){.    
66e0: 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
66f0: 20 20 20 20 20 63 20 3d 20 7a 5b 6a 2b 31 5d 3b       c = z[j+1];
6700: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6710: 20 20 20 69 66 28 20 63 3c 27 30 27 20 7c 7c 20     if( c<'0' || 
6720: 63 3e 27 39 27 20 29 20 72 65 74 75 72 6e 20 2d  c>'9' ) return -
6730: 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  1;.        conti
6740: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
6750: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6760: 20 20 20 20 69 66 28 20 7a 5b 6a 2d 31 5d 3c 27      if( z[j-1]<'
6770: 30 27 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  0' ) return -1;.
6780: 20 20 20 20 6a 73 6f 6e 50 61 72 73 65 41 64 64      jsonParseAdd
6790: 4e 6f 64 65 28 70 50 61 72 73 65 2c 20 73 65 65  Node(pParse, see
67a0: 6e 44 50 20 3f 20 4a 53 4f 4e 5f 52 45 41 4c 20  nDP ? JSON_REAL 
67b0: 3a 20 4a 53 4f 4e 5f 49 4e 54 2c 0a 20 20 20 20  : JSON_INT,.    
67c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67d0: 20 20 20 20 6a 20 2d 20 69 2c 20 26 7a 5b 69 5d      j - i, &z[i]
67e0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6a 3b  );.    return j;
67f0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d  .  }else if( c==
6800: 27 7d 27 20 29 7b 0a 20 20 20 20 72 65 74 75 72  '}' ){.    retur
6810: 6e 20 2d 32 3b 20 20 2f 2a 20 45 6e 64 20 6f 66  n -2;  /* End of
6820: 20 7b 2e 2e 2e 7d 20 2a 2f 0a 20 20 7d 65 6c 73   {...} */.  }els
6830: 65 20 69 66 28 20 63 3d 3d 27 5d 27 20 29 7b 0a  e if( c==']' ){.
6840: 20 20 20 20 72 65 74 75 72 6e 20 2d 33 3b 20 20      return -3;  
6850: 2f 2a 20 45 6e 64 20 6f 66 20 5b 2e 2e 2e 5d 20  /* End of [...] 
6860: 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 63  */.  }else if( c
6870: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
6880: 6e 20 30 3b 20 20 20 2f 2a 20 45 6e 64 20 6f 66  n 0;   /* End of
6890: 20 66 69 6c 65 20 2a 2f 0a 20 20 7d 65 6c 73 65   file */.  }else
68a0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  {.    return -1;
68b0: 20 20 2f 2a 20 53 79 6e 74 61 78 20 65 72 72 6f    /* Syntax erro
68c0: 72 20 2a 2f 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  r */.  }.}../*.*
68d0: 2a 20 50 61 72 73 65 20 61 20 63 6f 6d 70 6c 65  * Parse a comple
68e0: 74 65 20 4a 53 4f 4e 20 73 74 72 69 6e 67 2e 20  te JSON string. 
68f0: 20 52 65 74 75 72 6e 20 30 20 6f 6e 20 73 75 63   Return 0 on suc
6900: 63 65 73 73 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  cess or non-zero
6910: 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   if there.** are
6920: 20 61 6e 79 20 65 72 72 6f 72 73 2e 20 20 49 66   any errors.  If
6930: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
6940: 2c 20 66 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72  , free all memor
6950: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
6960: 68 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a 0a  h.** pParse..**.
6970: 2a 2a 20 70 50 61 72 73 65 20 69 73 20 75 6e 69  ** pParse is uni
6980: 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20  nitialized when 
6990: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
69a0: 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
69b0: 63 20 69 6e 74 20 6a 73 6f 6e 50 61 72 73 65 28  c int jsonParse(
69c0: 0a 20 20 4a 73 6f 6e 50 61 72 73 65 20 2a 70 50  .  JsonParse *pP
69d0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
69e0: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e  /* Initialize an
69f0: 64 20 66 69 6c 6c 20 74 68 69 73 20 4a 73 6f 6e  d fill this Json
6a00: 50 61 72 73 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  Parse object */.
6a10: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
6a20: 74 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20 2f  t *pCtx,       /
6a30: 2a 20 52 65 70 6f 72 74 20 65 72 72 6f 72 73 20  * Report errors 
6a40: 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  here */.  const 
6a50: 63 68 61 72 20 2a 7a 4a 73 6f 6e 20 20 20 20 20  char *zJson     
6a60: 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20         /* Input 
6a70: 4a 53 4f 4e 20 74 65 78 74 20 74 6f 20 62 65 20  JSON text to be 
6a80: 70 61 72 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 69  parsed */.){.  i
6a90: 6e 74 20 69 3b 0a 20 20 6d 65 6d 73 65 74 28 70  nt i;.  memset(p
6aa0: 50 61 72 73 65 2c 20 30 2c 20 73 69 7a 65 6f 66  Parse, 0, sizeof
6ab0: 28 2a 70 50 61 72 73 65 29 29 3b 0a 20 20 69 66  (*pParse));.  if
6ac0: 28 20 7a 4a 73 6f 6e 3d 3d 30 20 29 20 72 65 74  ( zJson==0 ) ret
6ad0: 75 72 6e 20 31 3b 0a 20 20 70 50 61 72 73 65 2d  urn 1;.  pParse-
6ae0: 3e 7a 4a 73 6f 6e 20 3d 20 7a 4a 73 6f 6e 3b 0a  >zJson = zJson;.
6af0: 20 20 69 20 3d 20 6a 73 6f 6e 50 61 72 73 65 56    i = jsonParseV
6b00: 61 6c 75 65 28 70 50 61 72 73 65 2c 20 30 29 3b  alue(pParse, 0);
6b10: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6f  .  if( pParse->o
6b20: 6f 6d 20 29 20 69 20 3d 20 2d 31 3b 0a 20 20 69  om ) i = -1;.  i
6b30: 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 61 73  f( i>0 ){.    as
6b40: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 69 44  sert( pParse->iD
6b50: 65 70 74 68 3d 3d 30 20 29 3b 0a 20 20 20 20 77  epth==0 );.    w
6b60: 68 69 6c 65 28 20 73 61 66 65 5f 69 73 73 70 61  hile( safe_isspa
6b70: 63 65 28 7a 4a 73 6f 6e 5b 69 5d 29 20 29 20 69  ce(zJson[i]) ) i
6b80: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 7a 4a 73 6f  ++;.    if( zJso
6b90: 6e 5b 69 5d 20 29 20 69 20 3d 20 2d 31 3b 0a 20  n[i] ) i = -1;. 
6ba0: 20 7d 0a 20 20 69 66 28 20 69 3c 3d 30 20 29 7b   }.  if( i<=0 ){
6bb0: 0a 20 20 20 20 69 66 28 20 70 43 74 78 21 3d 30  .    if( pCtx!=0
6bc0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50   ){.      if( pP
6bd0: 61 72 73 65 2d 3e 6f 6f 6d 20 29 7b 0a 20 20 20  arse->oom ){.   
6be0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
6bf0: 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28  ult_error_nomem(
6c00: 70 43 74 78 29 3b 0a 20 20 20 20 20 20 7d 65 6c  pCtx);.      }el
6c10: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
6c20: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
6c30: 28 70 43 74 78 2c 20 22 6d 61 6c 66 6f 72 6d 65  (pCtx, "malforme
6c40: 64 20 4a 53 4f 4e 22 2c 20 2d 31 29 3b 0a 20 20  d JSON", -1);.  
6c50: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
6c60: 6a 73 6f 6e 50 61 72 73 65 52 65 73 65 74 28 70  jsonParseReset(p
6c70: 50 61 72 73 65 29 3b 0a 20 20 20 20 72 65 74 75  Parse);.    retu
6c80: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
6c90: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 4d 61 72 6b  rn 0;.}../* Mark
6ca0: 20 6e 6f 64 65 20 69 20 6f 66 20 70 50 61 72 73   node i of pPars
6cb0: 65 20 61 73 20 62 65 69 6e 67 20 61 20 63 68 69  e as being a chi
6cc0: 6c 64 20 6f 66 20 69 50 61 72 65 6e 74 2e 20 20  ld of iParent.  
6cd0: 43 61 6c 6c 20 72 65 63 75 72 73 69 76 65 6c 79  Call recursively
6ce0: 0a 2a 2a 20 74 6f 20 66 69 6c 6c 20 69 6e 20 61  .** to fill in a
6cf0: 6c 6c 20 74 68 65 20 64 65 73 63 65 6e 64 61 6e  ll the descendan
6d00: 74 73 20 6f 66 20 6e 6f 64 65 20 69 2e 0a 2a 2f  ts of node i..*/
6d10: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f  .static void jso
6d20: 6e 50 61 72 73 65 46 69 6c 6c 49 6e 50 61 72 65  nParseFillInPare
6d30: 6e 74 61 67 65 28 4a 73 6f 6e 50 61 72 73 65 20  ntage(JsonParse 
6d40: 2a 70 50 61 72 73 65 2c 20 75 33 32 20 69 2c 20  *pParse, u32 i, 
6d50: 75 33 32 20 69 50 61 72 65 6e 74 29 7b 0a 20 20  u32 iParent){.  
6d60: 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 20  JsonNode *pNode 
6d70: 3d 20 26 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65  = &pParse->aNode
6d80: 5b 69 5d 3b 0a 20 20 75 33 32 20 6a 3b 0a 20 20  [i];.  u32 j;.  
6d90: 70 50 61 72 73 65 2d 3e 61 55 70 5b 69 5d 20 3d  pParse->aUp[i] =
6da0: 20 69 50 61 72 65 6e 74 3b 0a 20 20 73 77 69 74   iParent;.  swit
6db0: 63 68 28 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65  ch( pNode->eType
6dc0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4a 53 4f   ){.    case JSO
6dd0: 4e 5f 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20  N_ARRAY: {.     
6de0: 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 3d 70 4e 6f   for(j=1; j<=pNo
6df0: 64 65 2d 3e 6e 3b 20 6a 20 2b 3d 20 6a 73 6f 6e  de->n; j += json
6e00: 4e 6f 64 65 53 69 7a 65 28 70 4e 6f 64 65 2b 6a  NodeSize(pNode+j
6e10: 29 29 7b 0a 20 20 20 20 20 20 20 20 6a 73 6f 6e  )){.        json
6e20: 50 61 72 73 65 46 69 6c 6c 49 6e 50 61 72 65 6e  ParseFillInParen
6e30: 74 61 67 65 28 70 50 61 72 73 65 2c 20 69 2b 6a  tage(pParse, i+j
6e40: 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , i);.      }.  
6e50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6e60: 0a 20 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f 4f  .    case JSON_O
6e70: 42 4a 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 66  BJECT: {.      f
6e80: 6f 72 28 6a 3d 31 3b 20 6a 3c 3d 70 4e 6f 64 65  or(j=1; j<=pNode
6e90: 2d 3e 6e 3b 20 6a 20 2b 3d 20 6a 73 6f 6e 4e 6f  ->n; j += jsonNo
6ea0: 64 65 53 69 7a 65 28 70 4e 6f 64 65 2b 6a 2b 31  deSize(pNode+j+1
6eb0: 29 2b 31 29 7b 0a 20 20 20 20 20 20 20 20 70 50  )+1){.        pP
6ec0: 61 72 73 65 2d 3e 61 55 70 5b 69 2b 6a 5d 20 3d  arse->aUp[i+j] =
6ed0: 20 69 3b 0a 20 20 20 20 20 20 20 20 6a 73 6f 6e   i;.        json
6ee0: 50 61 72 73 65 46 69 6c 6c 49 6e 50 61 72 65 6e  ParseFillInParen
6ef0: 74 61 67 65 28 70 50 61 72 73 65 2c 20 69 2b 6a  tage(pParse, i+j
6f00: 2b 31 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a  +1, i);.      }.
6f10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6f20: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
6f30: 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
6f40: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
6f50: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 70 61  * Compute the pa
6f60: 72 65 6e 74 61 67 65 20 6f 66 20 61 6c 6c 20 6e  rentage of all n
6f70: 6f 64 65 73 20 69 6e 20 61 20 63 6f 6d 70 6c 65  odes in a comple
6f80: 74 65 64 20 70 61 72 73 65 2e 0a 2a 2f 0a 73 74  ted parse..*/.st
6f90: 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e 50 61 72  atic int jsonPar
6fa0: 73 65 46 69 6e 64 50 61 72 65 6e 74 73 28 4a 73  seFindParents(Js
6fb0: 6f 6e 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  onParse *pParse)
6fc0: 7b 0a 20 20 75 33 32 20 2a 61 55 70 3b 0a 20 20  {.  u32 *aUp;.  
6fd0: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
6fe0: 61 55 70 3d 3d 30 20 29 3b 0a 20 20 61 55 70 20  aUp==0 );.  aUp 
6ff0: 3d 20 70 50 61 72 73 65 2d 3e 61 55 70 20 3d 20  = pParse->aUp = 
7000: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
7010: 28 20 73 69 7a 65 6f 66 28 75 33 32 29 2a 70 50  ( sizeof(u32)*pP
7020: 61 72 73 65 2d 3e 6e 4e 6f 64 65 20 29 3b 0a 20  arse->nNode );. 
7030: 20 69 66 28 20 61 55 70 3d 3d 30 20 29 7b 0a 20   if( aUp==0 ){. 
7040: 20 20 20 70 50 61 72 73 65 2d 3e 6f 6f 6d 20 3d     pParse->oom =
7050: 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
7060: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
7070: 0a 20 20 6a 73 6f 6e 50 61 72 73 65 46 69 6c 6c  .  jsonParseFill
7080: 49 6e 50 61 72 65 6e 74 61 67 65 28 70 50 61 72  InParentage(pPar
7090: 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65 74  se, 0, 0);.  ret
70a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
70b0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 67 69 63 20 6e 75  ../*.** Magic nu
70c0: 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 74 68  mber used for th
70d0: 65 20 4a 53 4f 4e 20 70 61 72 73 65 20 63 61 63  e JSON parse cac
70e0: 68 65 20 69 6e 20 73 71 6c 69 74 65 33 5f 67 65  he in sqlite3_ge
70f0: 74 5f 61 75 78 64 61 74 61 28 29 0a 2a 2f 0a 23  t_auxdata().*/.#
7100: 64 65 66 69 6e 65 20 4a 53 4f 4e 5f 43 41 43 48  define JSON_CACH
7110: 45 5f 49 44 20 20 28 2d 34 32 39 39 33 38 29 20  E_ID  (-429938) 
7120: 20 2f 2a 20 46 69 72 73 74 20 63 61 63 68 65 20   /* First cache 
7130: 65 6e 74 72 79 20 2a 2f 0a 23 64 65 66 69 6e 65  entry */.#define
7140: 20 4a 53 4f 4e 5f 43 41 43 48 45 5f 53 5a 20 20   JSON_CACHE_SZ  
7150: 34 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  4          /* Ma
7160: 78 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68  x number of cach
7170: 65 20 65 6e 74 72 69 65 73 20 2a 2f 0a 0a 2f 2a  e entries */../*
7180: 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 63 6f 6d  .** Obtain a com
7190: 70 6c 65 74 65 20 70 61 72 73 65 20 6f 66 20 74  plete parse of t
71a0: 68 65 20 4a 53 4f 4e 20 66 6f 75 6e 64 20 69 6e  he JSON found in
71b0: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
71c0: 65 6e 74 0a 2a 2a 20 6f 66 20 74 68 65 20 61 72  ent.** of the ar
71d0: 67 76 20 61 72 72 61 79 2e 20 20 55 73 65 20 74  gv array.  Use t
71e0: 68 65 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61  he sqlite3_get_a
71f0: 75 78 64 61 74 61 28 29 20 63 61 63 68 65 20 66  uxdata() cache f
7200: 6f 72 20 74 68 69 73 0a 2a 2a 20 70 61 72 73 65  or this.** parse
7210: 20 69 66 20 69 74 20 69 73 20 61 76 61 69 6c 61   if it is availa
7220: 62 6c 65 2e 20 20 49 66 20 74 68 65 20 63 61 63  ble.  If the cac
7230: 68 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61  he is not availa
7240: 62 6c 65 20 6f 72 20 69 66 20 69 74 0a 2a 2a 20  ble or if it.** 
7250: 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 76 61 6c  is no longer val
7260: 69 64 2c 20 70 61 72 73 65 20 74 68 65 20 4a 53  id, parse the JS
7270: 4f 4e 20 61 67 61 69 6e 20 61 6e 64 20 72 65 74  ON again and ret
7280: 75 72 6e 20 74 68 65 20 6e 65 77 20 70 61 72 73  urn the new pars
7290: 65 2c 0a 2a 2a 20 61 6e 64 20 61 6c 73 6f 20 72  e,.** and also r
72a0: 65 67 69 73 74 65 72 20 74 68 65 20 6e 65 77 20  egister the new 
72b0: 70 61 72 73 65 20 73 6f 20 74 68 61 74 20 69 74  parse so that it
72c0: 20 77 69 6c 6c 20 62 65 20 61 76 61 69 6c 61 62   will be availab
72d0: 6c 65 20 66 6f 72 0a 2a 2a 20 66 75 74 75 72 65  le for.** future
72e0: 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 78   sqlite3_get_aux
72f0: 64 61 74 61 28 29 20 63 61 6c 6c 73 2e 0a 2a 2f  data() calls..*/
7300: 0a 73 74 61 74 69 63 20 4a 73 6f 6e 50 61 72 73  .static JsonPars
7310: 65 20 2a 6a 73 6f 6e 50 61 72 73 65 43 61 63 68  e *jsonParseCach
7320: 65 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  ed(.  sqlite3_co
7330: 6e 74 65 78 74 20 2a 70 43 74 78 2c 0a 20 20 73  ntext *pCtx,.  s
7340: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
7350: 72 67 76 2c 0a 20 20 73 71 6c 69 74 65 33 5f 63  rgv,.  sqlite3_c
7360: 6f 6e 74 65 78 74 20 2a 70 45 72 72 43 74 78 0a  ontext *pErrCtx.
7370: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
7380: 2a 7a 4a 73 6f 6e 20 3d 20 28 63 6f 6e 73 74 20  *zJson = (const 
7390: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
73a0: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
73b0: 29 3b 0a 20 20 69 6e 74 20 6e 4a 73 6f 6e 20 3d  );.  int nJson =
73c0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
73d0: 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20  ytes(argv[0]);. 
73e0: 20 4a 73 6f 6e 50 61 72 73 65 20 2a 70 3b 0a 20   JsonParse *p;. 
73f0: 20 4a 73 6f 6e 50 61 72 73 65 20 2a 70 4d 61 74   JsonParse *pMat
7400: 63 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4b  ch = 0;.  int iK
7410: 65 79 3b 0a 20 20 69 6e 74 20 69 4d 69 6e 4b 65  ey;.  int iMinKe
7420: 79 20 3d 20 30 3b 0a 20 20 75 33 32 20 69 4d 69  y = 0;.  u32 iMi
7430: 6e 48 6f 6c 64 20 3d 20 30 78 66 66 66 66 66 66  nHold = 0xffffff
7440: 66 66 3b 0a 20 20 75 33 32 20 69 4d 61 78 48 6f  ff;.  u32 iMaxHo
7450: 6c 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 4a  ld = 0;.  if( zJ
7460: 73 6f 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  son==0 ) return 
7470: 30 3b 0a 20 20 66 6f 72 28 69 4b 65 79 3d 30 3b  0;.  for(iKey=0;
7480: 20 69 4b 65 79 3c 4a 53 4f 4e 5f 43 41 43 48 45   iKey<JSON_CACHE
7490: 5f 53 5a 3b 20 69 4b 65 79 2b 2b 29 7b 0a 20 20  _SZ; iKey++){.  
74a0: 20 20 70 20 3d 20 28 4a 73 6f 6e 50 61 72 73 65    p = (JsonParse
74b0: 2a 29 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75  *)sqlite3_get_au
74c0: 78 64 61 74 61 28 70 43 74 78 2c 20 4a 53 4f 4e  xdata(pCtx, JSON
74d0: 5f 43 41 43 48 45 5f 49 44 2b 69 4b 65 79 29 3b  _CACHE_ID+iKey);
74e0: 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  .    if( p==0 ){
74f0: 0a 20 20 20 20 20 20 69 4d 69 6e 4b 65 79 20 3d  .      iMinKey =
7500: 20 69 4b 65 79 3b 0a 20 20 20 20 20 20 62 72 65   iKey;.      bre
7510: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
7520: 28 20 70 4d 61 74 63 68 3d 3d 30 0a 20 20 20 20  ( pMatch==0.    
7530: 20 26 26 20 70 2d 3e 6e 4a 73 6f 6e 3d 3d 6e 4a   && p->nJson==nJ
7540: 73 6f 6e 0a 20 20 20 20 20 26 26 20 6d 65 6d 63  son.     && memc
7550: 6d 70 28 70 2d 3e 7a 4a 73 6f 6e 2c 7a 4a 73 6f  mp(p->zJson,zJso
7560: 6e 2c 6e 4a 73 6f 6e 29 3d 3d 30 0a 20 20 20 20  n,nJson)==0.    
7570: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 45 72 72  ){.      p->nErr
7580: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4d 61 74   = 0;.      pMat
7590: 63 68 20 3d 20 70 3b 0a 20 20 20 20 7d 65 6c 73  ch = p;.    }els
75a0: 65 20 69 66 28 20 70 2d 3e 69 48 6f 6c 64 3c 69  e if( p->iHold<i
75b0: 4d 69 6e 48 6f 6c 64 20 29 7b 0a 20 20 20 20 20  MinHold ){.     
75c0: 20 69 4d 69 6e 48 6f 6c 64 20 3d 20 70 2d 3e 69   iMinHold = p->i
75d0: 48 6f 6c 64 3b 0a 20 20 20 20 20 20 69 4d 69 6e  Hold;.      iMin
75e0: 4b 65 79 20 3d 20 69 4b 65 79 3b 0a 20 20 20 20  Key = iKey;.    
75f0: 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 48 6f  }.    if( p->iHo
7600: 6c 64 3e 69 4d 61 78 48 6f 6c 64 20 29 7b 0a 20  ld>iMaxHold ){. 
7610: 20 20 20 20 20 69 4d 61 78 48 6f 6c 64 20 3d 20       iMaxHold = 
7620: 70 2d 3e 69 48 6f 6c 64 3b 0a 20 20 20 20 7d 0a  p->iHold;.    }.
7630: 20 20 7d 0a 20 20 69 66 28 20 70 4d 61 74 63 68    }.  if( pMatch
7640: 20 29 7b 0a 20 20 20 20 70 4d 61 74 63 68 2d 3e   ){.    pMatch->
7650: 6e 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 70 4d  nErr = 0;.    pM
7660: 61 74 63 68 2d 3e 69 48 6f 6c 64 20 3d 20 69 4d  atch->iHold = iM
7670: 61 78 48 6f 6c 64 2b 31 3b 0a 20 20 20 20 72 65  axHold+1;.    re
7680: 74 75 72 6e 20 70 4d 61 74 63 68 3b 0a 20 20 7d  turn pMatch;.  }
7690: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d  .  p = sqlite3_m
76a0: 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28  alloc64( sizeof(
76b0: 2a 70 29 20 2b 20 6e 4a 73 6f 6e 20 2b 20 31 20  *p) + nJson + 1 
76c0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  );.  if( p==0 ){
76d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
76e0: 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28  ult_error_nomem(
76f0: 70 43 74 78 29 3b 0a 20 20 20 20 72 65 74 75 72  pCtx);.    retur
7700: 6e 20 30 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  n 0;.  }.  memse
7710: 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  t(p, 0, sizeof(*
7720: 70 29 29 3b 0a 20 20 70 2d 3e 7a 4a 73 6f 6e 20  p));.  p->zJson 
7730: 3d 20 28 63 68 61 72 2a 29 26 70 5b 31 5d 3b 0a  = (char*)&p[1];.
7740: 20 20 6d 65 6d 63 70 79 28 28 63 68 61 72 2a 29    memcpy((char*)
7750: 70 2d 3e 7a 4a 73 6f 6e 2c 20 7a 4a 73 6f 6e 2c  p->zJson, zJson,
7760: 20 6e 4a 73 6f 6e 2b 31 29 3b 0a 20 20 69 66 28   nJson+1);.  if(
7770: 20 6a 73 6f 6e 50 61 72 73 65 28 70 2c 20 70 45   jsonParse(p, pE
7780: 72 72 43 74 78 2c 20 70 2d 3e 7a 4a 73 6f 6e 29  rrCtx, p->zJson)
7790: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
77a0: 66 72 65 65 28 70 29 3b 0a 20 20 20 20 72 65 74  free(p);.    ret
77b0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e  urn 0;.  }.  p->
77c0: 6e 4a 73 6f 6e 20 3d 20 6e 4a 73 6f 6e 3b 0a 20  nJson = nJson;. 
77d0: 20 70 2d 3e 69 48 6f 6c 64 20 3d 20 69 4d 61 78   p->iHold = iMax
77e0: 48 6f 6c 64 2b 31 3b 0a 20 20 73 71 6c 69 74 65  Hold+1;.  sqlite
77f0: 33 5f 73 65 74 5f 61 75 78 64 61 74 61 28 70 43  3_set_auxdata(pC
7800: 74 78 2c 20 4a 53 4f 4e 5f 43 41 43 48 45 5f 49  tx, JSON_CACHE_I
7810: 44 2b 69 4d 69 6e 4b 65 79 2c 20 70 2c 0a 20 20  D+iMinKey, p,.  
7820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7830: 20 20 20 20 28 76 6f 69 64 28 2a 29 28 76 6f 69      (void(*)(voi
7840: 64 2a 29 29 6a 73 6f 6e 50 61 72 73 65 46 72 65  d*))jsonParseFre
7850: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 4a 73  e);.  return (Js
7860: 6f 6e 50 61 72 73 65 2a 29 73 71 6c 69 74 65 33  onParse*)sqlite3
7870: 5f 67 65 74 5f 61 75 78 64 61 74 61 28 70 43 74  _get_auxdata(pCt
7880: 78 2c 20 4a 53 4f 4e 5f 43 41 43 48 45 5f 49 44  x, JSON_CACHE_ID
7890: 2b 69 4d 69 6e 4b 65 79 29 3b 0a 7d 0a 0a 2f 2a  +iMinKey);.}../*
78a0: 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20  .** Compare the 
78b0: 4f 42 4a 45 43 54 20 6c 61 62 65 6c 20 61 74 20  OBJECT label at 
78c0: 70 4e 6f 64 65 20 61 67 61 69 6e 73 74 20 7a 4b  pNode against zK
78d0: 65 79 2c 6e 4b 65 79 2e 20 20 52 65 74 75 72 6e  ey,nKey.  Return
78e0: 20 74 72 75 65 20 6f 6e 0a 2a 2a 20 61 20 6d 61   true on.** a ma
78f0: 74 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tch..*/.static i
7900: 6e 74 20 6a 73 6f 6e 4c 61 62 65 6c 43 6f 6d 70  nt jsonLabelComp
7910: 61 72 65 28 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e  are(JsonNode *pN
7920: 6f 64 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ode, const char 
7930: 2a 7a 4b 65 79 2c 20 75 33 32 20 6e 4b 65 79 29  *zKey, u32 nKey)
7940: 7b 0a 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 6a  {.  if( pNode->j
7950: 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 52  nFlags & JNODE_R
7960: 41 57 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4e  AW ){.    if( pN
7970: 6f 64 65 2d 3e 6e 21 3d 6e 4b 65 79 20 29 20 72  ode->n!=nKey ) r
7980: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 72 65 74  eturn 0;.    ret
7990: 75 72 6e 20 73 74 72 6e 63 6d 70 28 70 4e 6f 64  urn strncmp(pNod
79a0: 65 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 2c 20  e->u.zJContent, 
79b0: 7a 4b 65 79 2c 20 6e 4b 65 79 29 3d 3d 30 3b 0a  zKey, nKey)==0;.
79c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
79d0: 20 70 4e 6f 64 65 2d 3e 6e 21 3d 6e 4b 65 79 2b   pNode->n!=nKey+
79e0: 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  2 ) return 0;.  
79f0: 20 20 72 65 74 75 72 6e 20 73 74 72 6e 63 6d 70    return strncmp
7a00: 28 70 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74  (pNode->u.zJCont
7a10: 65 6e 74 2b 31 2c 20 7a 4b 65 79 2c 20 6e 4b 65  ent+1, zKey, nKe
7a20: 79 29 3d 3d 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  y)==0;.  }.}../*
7a30: 20 66 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   forward declara
7a40: 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 4a  tion */.static J
7a50: 73 6f 6e 4e 6f 64 65 20 2a 6a 73 6f 6e 4c 6f 6f  sonNode *jsonLoo
7a60: 6b 75 70 41 70 70 65 6e 64 28 4a 73 6f 6e 50 61  kupAppend(JsonPa
7a70: 72 73 65 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  rse*,const char*
7a80: 2c 69 6e 74 2a 2c 63 6f 6e 73 74 20 63 68 61 72  ,int*,const char
7a90: 2a 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72  **);../*.** Sear
7aa0: 63 68 20 61 6c 6f 6e 67 20 7a 50 61 74 68 20 74  ch along zPath t
7ab0: 6f 20 66 69 6e 64 20 74 68 65 20 6e 6f 64 65 20  o find the node 
7ac0: 73 70 65 63 69 66 69 65 64 2e 20 20 52 65 74 75  specified.  Retu
7ad0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  rn a pointer.** 
7ae0: 74 6f 20 74 68 61 74 20 6e 6f 64 65 2c 20 6f 72  to that node, or
7af0: 20 4e 55 4c 4c 20 69 66 20 7a 50 61 74 68 20 69   NULL if zPath i
7b00: 73 20 6d 61 6c 66 6f 72 6d 65 64 20 6f 72 20 69  s malformed or i
7b10: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75  f there is no su
7b20: 63 68 0a 2a 2a 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a  ch.** node..**.*
7b30: 2a 20 49 66 20 70 41 70 6e 64 21 3d 30 2c 20 74  * If pApnd!=0, t
7b40: 68 65 6e 20 74 72 79 20 74 6f 20 61 70 70 65 6e  hen try to appen
7b50: 64 20 6e 65 77 20 6e 6f 64 65 73 20 74 6f 20 63  d new nodes to c
7b60: 6f 6d 70 6c 65 74 65 20 7a 50 61 74 68 20 69 66  omplete zPath if
7b70: 20 69 74 20 69 73 0a 2a 2a 20 70 6f 73 73 69 62   it is.** possib
7b80: 6c 65 20 74 6f 20 64 6f 20 73 6f 20 61 6e 64 20  le to do so and 
7b90: 69 66 20 6e 6f 20 65 78 69 73 74 69 6e 67 20 6e  if no existing n
7ba0: 6f 64 65 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  ode corresponds 
7bb0: 74 6f 20 7a 50 61 74 68 2e 20 20 49 66 0a 2a 2a  to zPath.  If.**
7bc0: 20 6e 65 77 20 6e 6f 64 65 73 20 61 72 65 20 61   new nodes are a
7bd0: 70 70 65 6e 64 65 64 20 2a 70 41 70 6e 64 20 69  ppended *pApnd i
7be0: 73 20 73 65 74 20 74 6f 20 31 2e 0a 2a 2f 0a 73  s set to 1..*/.s
7bf0: 74 61 74 69 63 20 4a 73 6f 6e 4e 6f 64 65 20 2a  tatic JsonNode *
7c00: 6a 73 6f 6e 4c 6f 6f 6b 75 70 53 74 65 70 28 0a  jsonLookupStep(.
7c10: 20 20 4a 73 6f 6e 50 61 72 73 65 20 2a 70 50 61    JsonParse *pPa
7c20: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  rse,      /* The
7c30: 20 4a 53 4f 4e 20 74 6f 20 73 65 61 72 63 68 20   JSON to search 
7c40: 2a 2f 0a 20 20 75 33 32 20 69 52 6f 6f 74 2c 20  */.  u32 iRoot, 
7c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7c60: 42 65 67 69 6e 20 74 68 65 20 73 65 61 72 63 68  Begin the search
7c70: 20 61 74 20 74 68 69 73 20 6e 6f 64 65 20 2a 2f   at this node */
7c80: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7c90: 50 61 74 68 2c 20 20 20 20 20 20 2f 2a 20 54 68  Path,      /* Th
7ca0: 65 20 70 61 74 68 20 74 6f 20 73 65 61 72 63 68  e path to search
7cb0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 70 6e 64   */.  int *pApnd
7cc0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
7cd0: 20 41 70 70 65 6e 64 20 6e 6f 64 65 73 20 74 6f   Append nodes to
7ce0: 20 63 6f 6d 70 6c 65 74 65 20 70 61 74 68 20 69   complete path i
7cf0: 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20  f not NULL */.  
7d00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 45  const char **pzE
7d10: 72 72 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20  rr      /* Make 
7d20: 2a 70 7a 45 72 72 20 70 6f 69 6e 74 20 74 6f 20  *pzErr point to 
7d30: 61 6e 79 20 73 79 6e 74 61 78 20 65 72 72 6f 72  any syntax error
7d40: 20 69 6e 20 7a 50 61 74 68 20 2a 2f 0a 29 7b 0a   in zPath */.){.
7d50: 20 20 75 33 32 20 69 2c 20 6a 2c 20 6e 4b 65 79    u32 i, j, nKey
7d60: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
7d70: 7a 4b 65 79 3b 0a 20 20 4a 73 6f 6e 4e 6f 64 65  zKey;.  JsonNode
7d80: 20 2a 70 52 6f 6f 74 20 3d 20 26 70 50 61 72 73   *pRoot = &pPars
7d90: 65 2d 3e 61 4e 6f 64 65 5b 69 52 6f 6f 74 5d 3b  e->aNode[iRoot];
7da0: 0a 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d  .  if( zPath[0]=
7db0: 3d 30 20 29 20 72 65 74 75 72 6e 20 70 52 6f 6f  =0 ) return pRoo
7dc0: 74 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 5b 30  t;.  if( zPath[0
7dd0: 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 69 66  ]=='.' ){.    if
7de0: 28 20 70 52 6f 6f 74 2d 3e 65 54 79 70 65 21 3d  ( pRoot->eType!=
7df0: 4a 53 4f 4e 5f 4f 42 4a 45 43 54 20 29 20 72 65  JSON_OBJECT ) re
7e00: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7a 50 61 74  turn 0;.    zPat
7e10: 68 2b 2b 3b 0a 20 20 20 20 69 66 28 20 7a 50 61  h++;.    if( zPa
7e20: 74 68 5b 30 5d 3d 3d 27 22 27 20 29 7b 0a 20 20  th[0]=='"' ){.  
7e30: 20 20 20 20 7a 4b 65 79 20 3d 20 7a 50 61 74 68      zKey = zPath
7e40: 20 2b 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28   + 1;.      for(
7e50: 69 3d 31 3b 20 7a 50 61 74 68 5b 69 5d 20 26 26  i=1; zPath[i] &&
7e60: 20 7a 50 61 74 68 5b 69 5d 21 3d 27 22 27 3b 20   zPath[i]!='"'; 
7e70: 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 6e 4b 65  i++){}.      nKe
7e80: 79 20 3d 20 69 2d 31 3b 0a 20 20 20 20 20 20 69  y = i-1;.      i
7e90: 66 28 20 7a 50 61 74 68 5b 69 5d 20 29 7b 0a 20  f( zPath[i] ){. 
7ea0: 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
7eb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7ec0: 20 2a 70 7a 45 72 72 20 3d 20 7a 50 61 74 68 3b   *pzErr = zPath;
7ed0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
7ee0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
7ef0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4b 65 79  else{.      zKey
7f00: 20 3d 20 7a 50 61 74 68 3b 0a 20 20 20 20 20 20   = zPath;.      
7f10: 66 6f 72 28 69 3d 30 3b 20 7a 50 61 74 68 5b 69  for(i=0; zPath[i
7f20: 5d 20 26 26 20 7a 50 61 74 68 5b 69 5d 21 3d 27  ] && zPath[i]!='
7f30: 2e 27 20 26 26 20 7a 50 61 74 68 5b 69 5d 21 3d  .' && zPath[i]!=
7f40: 27 5b 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20  '['; i++){}.    
7f50: 20 20 6e 4b 65 79 20 3d 20 69 3b 0a 20 20 20 20    nKey = i;.    
7f60: 7d 0a 20 20 20 20 69 66 28 20 6e 4b 65 79 3d 3d  }.    if( nKey==
7f70: 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 7a 45 72  0 ){.      *pzEr
7f80: 72 20 3d 20 7a 50 61 74 68 3b 0a 20 20 20 20 20  r = zPath;.     
7f90: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
7fa0: 0a 20 20 20 20 6a 20 3d 20 31 3b 0a 20 20 20 20  .    j = 1;.    
7fb0: 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 77  for(;;){.      w
7fc0: 68 69 6c 65 28 20 6a 3c 3d 70 52 6f 6f 74 2d 3e  hile( j<=pRoot->
7fd0: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  n ){.        if(
7fe0: 20 6a 73 6f 6e 4c 61 62 65 6c 43 6f 6d 70 61 72   jsonLabelCompar
7ff0: 65 28 70 52 6f 6f 74 2b 6a 2c 20 7a 4b 65 79 2c  e(pRoot+j, zKey,
8000: 20 6e 4b 65 79 29 20 29 7b 0a 20 20 20 20 20 20   nKey) ){.      
8010: 20 20 20 20 72 65 74 75 72 6e 20 6a 73 6f 6e 4c      return jsonL
8020: 6f 6f 6b 75 70 53 74 65 70 28 70 50 61 72 73 65  ookupStep(pParse
8030: 2c 20 69 52 6f 6f 74 2b 6a 2b 31 2c 20 26 7a 50  , iRoot+j+1, &zP
8040: 61 74 68 5b 69 5d 2c 20 70 41 70 6e 64 2c 20 70  ath[i], pApnd, p
8050: 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  zErr);.        }
8060: 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  .        j++;.  
8070: 20 20 20 20 20 20 6a 20 2b 3d 20 6a 73 6f 6e 4e        j += jsonN
8080: 6f 64 65 53 69 7a 65 28 26 70 52 6f 6f 74 5b 6a  odeSize(&pRoot[j
8090: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
80a0: 20 20 69 66 28 20 28 70 52 6f 6f 74 2d 3e 6a 6e    if( (pRoot->jn
80b0: 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 41 50  Flags & JNODE_AP
80c0: 50 45 4e 44 29 3d 3d 30 20 29 20 62 72 65 61 6b  PEND)==0 ) break
80d0: 3b 0a 20 20 20 20 20 20 69 52 6f 6f 74 20 2b 3d  ;.      iRoot +=
80e0: 20 70 52 6f 6f 74 2d 3e 75 2e 69 41 70 70 65 6e   pRoot->u.iAppen
80f0: 64 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 20 3d  d;.      pRoot =
8100: 20 26 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65 5b   &pParse->aNode[
8110: 69 52 6f 6f 74 5d 3b 0a 20 20 20 20 20 20 6a 20  iRoot];.      j 
8120: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
8130: 66 28 20 70 41 70 6e 64 20 29 7b 0a 20 20 20 20  f( pApnd ){.    
8140: 20 20 75 33 32 20 69 53 74 61 72 74 2c 20 69 4c    u32 iStart, iL
8150: 61 62 65 6c 3b 0a 20 20 20 20 20 20 4a 73 6f 6e  abel;.      Json
8160: 4e 6f 64 65 20 2a 70 4e 6f 64 65 3b 0a 20 20 20  Node *pNode;.   
8170: 20 20 20 69 53 74 61 72 74 20 3d 20 6a 73 6f 6e     iStart = json
8180: 50 61 72 73 65 41 64 64 4e 6f 64 65 28 70 50 61  ParseAddNode(pPa
8190: 72 73 65 2c 20 4a 53 4f 4e 5f 4f 42 4a 45 43 54  rse, JSON_OBJECT
81a0: 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 2, 0);.      i
81b0: 4c 61 62 65 6c 20 3d 20 6a 73 6f 6e 50 61 72 73  Label = jsonPars
81c0: 65 41 64 64 4e 6f 64 65 28 70 50 61 72 73 65 2c  eAddNode(pParse,
81d0: 20 4a 53 4f 4e 5f 53 54 52 49 4e 47 2c 20 6e 4b   JSON_STRING, nK
81e0: 65 79 2c 20 7a 4b 65 79 29 3b 0a 20 20 20 20 20  ey, zKey);.     
81f0: 20 7a 50 61 74 68 20 2b 3d 20 69 3b 0a 20 20 20   zPath += i;.   
8200: 20 20 20 70 4e 6f 64 65 20 3d 20 6a 73 6f 6e 4c     pNode = jsonL
8210: 6f 6f 6b 75 70 41 70 70 65 6e 64 28 70 50 61 72  ookupAppend(pPar
8220: 73 65 2c 20 7a 50 61 74 68 2c 20 70 41 70 6e 64  se, zPath, pApnd
8230: 2c 20 70 7a 45 72 72 29 3b 0a 20 20 20 20 20 20  , pzErr);.      
8240: 69 66 28 20 70 50 61 72 73 65 2d 3e 6f 6f 6d 20  if( pParse->oom 
8250: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
8260: 20 20 69 66 28 20 70 4e 6f 64 65 20 29 7b 0a 20    if( pNode ){. 
8270: 20 20 20 20 20 20 20 70 52 6f 6f 74 20 3d 20 26         pRoot = &
8280: 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65 5b 69 52  pParse->aNode[iR
8290: 6f 6f 74 5d 3b 0a 20 20 20 20 20 20 20 20 70 52  oot];.        pR
82a0: 6f 6f 74 2d 3e 75 2e 69 41 70 70 65 6e 64 20 3d  oot->u.iAppend =
82b0: 20 69 53 74 61 72 74 20 2d 20 69 52 6f 6f 74 3b   iStart - iRoot;
82c0: 0a 20 20 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e  .        pRoot->
82d0: 6a 6e 46 6c 61 67 73 20 7c 3d 20 4a 4e 4f 44 45  jnFlags |= JNODE
82e0: 5f 41 50 50 45 4e 44 3b 0a 20 20 20 20 20 20 20  _APPEND;.       
82f0: 20 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65 5b 69   pParse->aNode[i
8300: 4c 61 62 65 6c 5d 2e 6a 6e 46 6c 61 67 73 20 7c  Label].jnFlags |
8310: 3d 20 4a 4e 4f 44 45 5f 52 41 57 3b 0a 20 20 20  = JNODE_RAW;.   
8320: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
8330: 6e 20 70 4e 6f 64 65 3b 0a 20 20 20 20 7d 0a 20  n pNode;.    }. 
8340: 20 7d 65 6c 73 65 20 69 66 28 20 7a 50 61 74 68   }else if( zPath
8350: 5b 30 5d 3d 3d 27 5b 27 20 26 26 20 73 61 66 65  [0]=='[' && safe
8360: 5f 69 73 64 69 67 69 74 28 7a 50 61 74 68 5b 31  _isdigit(zPath[1
8370: 5d 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 52  ]) ){.    if( pR
8380: 6f 6f 74 2d 3e 65 54 79 70 65 21 3d 4a 53 4f 4e  oot->eType!=JSON
8390: 5f 41 52 52 41 59 20 29 20 72 65 74 75 72 6e 20  _ARRAY ) return 
83a0: 30 3b 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20 20  0;.    i = 0;.  
83b0: 20 20 6a 20 3d 20 31 3b 0a 20 20 20 20 77 68 69    j = 1;.    whi
83c0: 6c 65 28 20 73 61 66 65 5f 69 73 64 69 67 69 74  le( safe_isdigit
83d0: 28 7a 50 61 74 68 5b 6a 5d 29 20 29 7b 0a 20 20  (zPath[j]) ){.  
83e0: 20 20 20 20 69 20 3d 20 69 2a 31 30 20 2b 20 7a      i = i*10 + z
83f0: 50 61 74 68 5b 6a 5d 20 2d 20 27 30 27 3b 0a 20  Path[j] - '0';. 
8400: 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a       j++;.    }.
8410: 20 20 20 20 69 66 28 20 7a 50 61 74 68 5b 6a 5d      if( zPath[j]
8420: 21 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20 20 2a  !=']' ){.      *
8430: 70 7a 45 72 72 20 3d 20 7a 50 61 74 68 3b 0a 20  pzErr = zPath;. 
8440: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
8450: 20 20 20 7d 0a 20 20 20 20 7a 50 61 74 68 20 2b     }.    zPath +
8460: 3d 20 6a 20 2b 20 31 3b 0a 20 20 20 20 6a 20 3d  = j + 1;.    j =
8470: 20 31 3b 0a 20 20 20 20 66 6f 72 28 3b 3b 29 7b   1;.    for(;;){
8480: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3c  .      while( j<
8490: 3d 70 52 6f 6f 74 2d 3e 6e 20 26 26 20 28 69 3e  =pRoot->n && (i>
84a0: 30 20 7c 7c 20 28 70 52 6f 6f 74 5b 6a 5d 2e 6a  0 || (pRoot[j].j
84b0: 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 52  nFlags & JNODE_R
84c0: 45 4d 4f 56 45 29 21 3d 30 29 20 29 7b 0a 20 20  EMOVE)!=0) ){.  
84d0: 20 20 20 20 20 20 69 66 28 20 28 70 52 6f 6f 74        if( (pRoot
84e0: 5b 6a 5d 2e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e  [j].jnFlags & JN
84f0: 4f 44 45 5f 52 45 4d 4f 56 45 29 3d 3d 30 20 29  ODE_REMOVE)==0 )
8500: 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20 20 6a 20   i--;.        j 
8510: 2b 3d 20 6a 73 6f 6e 4e 6f 64 65 53 69 7a 65 28  += jsonNodeSize(
8520: 26 70 52 6f 6f 74 5b 6a 5d 29 3b 0a 20 20 20 20  &pRoot[j]);.    
8530: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 70    }.      if( (p
8540: 52 6f 6f 74 2d 3e 6a 6e 46 6c 61 67 73 20 26 20  Root->jnFlags & 
8550: 4a 4e 4f 44 45 5f 41 50 50 45 4e 44 29 3d 3d 30  JNODE_APPEND)==0
8560: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
8570: 69 52 6f 6f 74 20 2b 3d 20 70 52 6f 6f 74 2d 3e  iRoot += pRoot->
8580: 75 2e 69 41 70 70 65 6e 64 3b 0a 20 20 20 20 20  u.iAppend;.     
8590: 20 70 52 6f 6f 74 20 3d 20 26 70 50 61 72 73 65   pRoot = &pParse
85a0: 2d 3e 61 4e 6f 64 65 5b 69 52 6f 6f 74 5d 3b 0a  ->aNode[iRoot];.
85b0: 20 20 20 20 20 20 6a 20 3d 20 31 3b 0a 20 20 20        j = 1;.   
85c0: 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 3d 70 52   }.    if( j<=pR
85d0: 6f 6f 74 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20  oot->n ){.      
85e0: 72 65 74 75 72 6e 20 6a 73 6f 6e 4c 6f 6f 6b 75  return jsonLooku
85f0: 70 53 74 65 70 28 70 50 61 72 73 65 2c 20 69 52  pStep(pParse, iR
8600: 6f 6f 74 2b 6a 2c 20 7a 50 61 74 68 2c 20 70 41  oot+j, zPath, pA
8610: 70 6e 64 2c 20 70 7a 45 72 72 29 3b 0a 20 20 20  pnd, pzErr);.   
8620: 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 30 20   }.    if( i==0 
8630: 26 26 20 70 41 70 6e 64 20 29 7b 0a 20 20 20 20  && pApnd ){.    
8640: 20 20 75 33 32 20 69 53 74 61 72 74 3b 0a 20 20    u32 iStart;.  
8650: 20 20 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e      JsonNode *pN
8660: 6f 64 65 3b 0a 20 20 20 20 20 20 69 53 74 61 72  ode;.      iStar
8670: 74 20 3d 20 6a 73 6f 6e 50 61 72 73 65 41 64 64  t = jsonParseAdd
8680: 4e 6f 64 65 28 70 50 61 72 73 65 2c 20 4a 53 4f  Node(pParse, JSO
8690: 4e 5f 41 52 52 41 59 2c 20 31 2c 20 30 29 3b 0a  N_ARRAY, 1, 0);.
86a0: 20 20 20 20 20 20 70 4e 6f 64 65 20 3d 20 6a 73        pNode = js
86b0: 6f 6e 4c 6f 6f 6b 75 70 41 70 70 65 6e 64 28 70  onLookupAppend(p
86c0: 50 61 72 73 65 2c 20 7a 50 61 74 68 2c 20 70 41  Parse, zPath, pA
86d0: 70 6e 64 2c 20 70 7a 45 72 72 29 3b 0a 20 20 20  pnd, pzErr);.   
86e0: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6f     if( pParse->o
86f0: 6f 6d 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  om ) return 0;. 
8700: 20 20 20 20 20 69 66 28 20 70 4e 6f 64 65 20 29       if( pNode )
8710: 7b 0a 20 20 20 20 20 20 20 20 70 52 6f 6f 74 20  {.        pRoot 
8720: 3d 20 26 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65  = &pParse->aNode
8730: 5b 69 52 6f 6f 74 5d 3b 0a 20 20 20 20 20 20 20  [iRoot];.       
8740: 20 70 52 6f 6f 74 2d 3e 75 2e 69 41 70 70 65 6e   pRoot->u.iAppen
8750: 64 20 3d 20 69 53 74 61 72 74 20 2d 20 69 52 6f  d = iStart - iRo
8760: 6f 74 3b 0a 20 20 20 20 20 20 20 20 70 52 6f 6f  ot;.        pRoo
8770: 74 2d 3e 6a 6e 46 6c 61 67 73 20 7c 3d 20 4a 4e  t->jnFlags |= JN
8780: 4f 44 45 5f 41 50 50 45 4e 44 3b 0a 20 20 20 20  ODE_APPEND;.    
8790: 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
87a0: 20 70 4e 6f 64 65 3b 0a 20 20 20 20 7d 0a 20 20   pNode;.    }.  
87b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 7a 45 72  }else{.    *pzEr
87c0: 72 20 3d 20 7a 50 61 74 68 3b 0a 20 20 7d 0a 20  r = zPath;.  }. 
87d0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
87e0: 0a 2a 2a 20 41 70 70 65 6e 64 20 63 6f 6e 74 65  .** Append conte
87f0: 6e 74 20 74 6f 20 70 50 61 72 73 65 20 74 68 61  nt to pParse tha
8800: 74 20 77 69 6c 6c 20 63 6f 6d 70 6c 65 74 65 20  t will complete 
8810: 7a 50 61 74 68 2e 20 20 52 65 74 75 72 6e 20 61  zPath.  Return a
8820: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
8830: 68 65 20 69 6e 73 65 72 74 65 64 20 6e 6f 64 65  he inserted node
8840: 2c 20 6f 72 20 72 65 74 75 72 6e 20 4e 55 4c 4c  , or return NULL
8850: 20 69 66 20 74 68 65 20 61 70 70 65 6e 64 20 66   if the append f
8860: 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ails..*/.static 
8870: 4a 73 6f 6e 4e 6f 64 65 20 2a 6a 73 6f 6e 4c 6f  JsonNode *jsonLo
8880: 6f 6b 75 70 41 70 70 65 6e 64 28 0a 20 20 4a 73  okupAppend(.  Js
8890: 6f 6e 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  onParse *pParse,
88a0: 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 63       /* Append c
88b0: 6f 6e 74 65 6e 74 20 74 6f 20 74 68 65 20 4a 53  ontent to the JS
88c0: 4f 4e 20 70 61 72 73 65 20 2a 2f 0a 20 20 63 6f  ON parse */.  co
88d0: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
88e0: 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74       /* Descript
88f0: 69 6f 6e 20 6f 66 20 63 6f 6e 74 65 6e 74 20 74  ion of content t
8900: 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 69 6e  o append */.  in
8910: 74 20 2a 70 41 70 6e 64 2c 20 20 20 20 20 20 20  t *pApnd,       
8920: 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68 69 73       /* Set this
8930: 20 66 6c 61 67 20 74 6f 20 31 20 2a 2f 0a 20 20   flag to 1 */.  
8940: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 45  const char **pzE
8950: 72 72 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 74  rr     /* Make t
8960: 68 69 73 20 70 6f 69 6e 74 20 74 6f 20 61 6e 79  his point to any
8970: 20 73 79 6e 74 61 78 20 65 72 72 6f 72 20 2a 2f   syntax error */
8980: 0a 29 7b 0a 20 20 2a 70 41 70 6e 64 20 3d 20 31  .){.  *pApnd = 1
8990: 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d  ;.  if( zPath[0]
89a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 6a 73 6f 6e 50  ==0 ){.    jsonP
89b0: 61 72 73 65 41 64 64 4e 6f 64 65 28 70 50 61 72  arseAddNode(pPar
89c0: 73 65 2c 20 4a 53 4f 4e 5f 4e 55 4c 4c 2c 20 30  se, JSON_NULL, 0
89d0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
89e0: 20 70 50 61 72 73 65 2d 3e 6f 6f 6d 20 3f 20 30   pParse->oom ? 0
89f0: 20 3a 20 26 70 50 61 72 73 65 2d 3e 61 4e 6f 64   : &pParse->aNod
8a00: 65 5b 70 50 61 72 73 65 2d 3e 6e 4e 6f 64 65 2d  e[pParse->nNode-
8a10: 31 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 50  1];.  }.  if( zP
8a20: 61 74 68 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20  ath[0]=='.' ){. 
8a30: 20 20 20 6a 73 6f 6e 50 61 72 73 65 41 64 64 4e     jsonParseAddN
8a40: 6f 64 65 28 70 50 61 72 73 65 2c 20 4a 53 4f 4e  ode(pParse, JSON
8a50: 5f 4f 42 4a 45 43 54 2c 20 30 2c 20 30 29 3b 0a  _OBJECT, 0, 0);.
8a60: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e    }else if( strn
8a70: 63 6d 70 28 7a 50 61 74 68 2c 22 5b 30 5d 22 2c  cmp(zPath,"[0]",
8a80: 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6a 73 6f  3)==0 ){.    jso
8a90: 6e 50 61 72 73 65 41 64 64 4e 6f 64 65 28 70 50  nParseAddNode(pP
8aa0: 61 72 73 65 2c 20 4a 53 4f 4e 5f 41 52 52 41 59  arse, JSON_ARRAY
8ab0: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  , 0, 0);.  }else
8ac0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
8ad0: 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65    }.  if( pParse
8ae0: 2d 3e 6f 6f 6d 20 29 20 72 65 74 75 72 6e 20 30  ->oom ) return 0
8af0: 3b 0a 20 20 72 65 74 75 72 6e 20 6a 73 6f 6e 4c  ;.  return jsonL
8b00: 6f 6f 6b 75 70 53 74 65 70 28 70 50 61 72 73 65  ookupStep(pParse
8b10: 2c 20 70 50 61 72 73 65 2d 3e 6e 4e 6f 64 65 2d  , pParse->nNode-
8b20: 31 2c 20 7a 50 61 74 68 2c 20 70 41 70 6e 64 2c  1, zPath, pApnd,
8b30: 20 70 7a 45 72 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pzErr);.}../*.*
8b40: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 65 78  * Return the tex
8b50: 74 20 6f 66 20 61 20 73 79 6e 74 61 78 20 65 72  t of a syntax er
8b60: 72 6f 72 20 6d 65 73 73 61 67 65 20 6f 6e 20 61  ror message on a
8b70: 20 4a 53 4f 4e 20 70 61 74 68 2e 20 20 53 70 61   JSON path.  Spa
8b80: 63 65 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65  ce is.** obtaine
8b90: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
8ba0: 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74  alloc()..*/.stat
8bb0: 69 63 20 63 68 61 72 20 2a 6a 73 6f 6e 50 61 74  ic char *jsonPat
8bc0: 68 53 79 6e 74 61 78 45 72 72 6f 72 28 63 6f 6e  hSyntaxError(con
8bd0: 73 74 20 63 68 61 72 20 2a 7a 45 72 72 29 7b 0a  st char *zErr){.
8be0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
8bf0: 5f 6d 70 72 69 6e 74 66 28 22 4a 53 4f 4e 20 70  _mprintf("JSON p
8c00: 61 74 68 20 65 72 72 6f 72 20 6e 65 61 72 20 27  ath error near '
8c10: 25 71 27 22 2c 20 7a 45 72 72 29 3b 0a 7d 0a 0a  %q'", zErr);.}..
8c20: 2f 2a 0a 2a 2a 20 44 6f 20 61 20 6e 6f 64 65 20  /*.** Do a node 
8c30: 6c 6f 6f 6b 75 70 20 75 73 69 6e 67 20 7a 50 61  lookup using zPa
8c40: 74 68 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  th.  Return a po
8c50: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 6f 64  inter to the nod
8c60: 65 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a  e on success..**
8c70: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
8c80: 6e 6f 74 20 66 6f 75 6e 64 20 6f 72 20 69 66 20  not found or if 
8c90: 74 68 65 72 65 20 69 73 20 61 6e 20 65 72 72 6f  there is an erro
8ca0: 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 61 6e 20 65  r..**.** On an e
8cb0: 72 72 6f 72 2c 20 77 72 69 74 65 20 61 6e 20 65  rror, write an e
8cc0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 74  rror message int
8cd0: 6f 20 70 43 74 78 20 61 6e 64 20 69 6e 63 72 65  o pCtx and incre
8ce0: 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 70 50 61 72  ment the.** pPar
8cf0: 73 65 2d 3e 6e 45 72 72 20 63 6f 75 6e 74 65 72  se->nErr counter
8d00: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 41 70 6e 64  ..**.** If pApnd
8d10: 21 3d 4e 55 4c 4c 20 74 68 65 6e 20 74 72 79 20  !=NULL then try 
8d20: 74 6f 20 61 70 70 65 6e 64 20 6d 69 73 73 69 6e  to append missin
8d30: 67 20 6e 6f 64 65 73 20 61 6e 64 20 73 65 74 20  g nodes and set 
8d40: 2a 70 41 70 6e 64 20 3d 20 31 20 69 66 0a 2a 2a  *pApnd = 1 if.**
8d50: 20 6e 6f 64 65 73 20 61 72 65 20 61 70 70 65 6e   nodes are appen
8d60: 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4a  ded..*/.static J
8d70: 73 6f 6e 4e 6f 64 65 20 2a 6a 73 6f 6e 4c 6f 6f  sonNode *jsonLoo
8d80: 6b 75 70 28 0a 20 20 4a 73 6f 6e 50 61 72 73 65  kup(.  JsonParse
8d90: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
8da0: 2a 20 54 68 65 20 4a 53 4f 4e 20 74 6f 20 73 65  * The JSON to se
8db0: 61 72 63 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  arch */.  const 
8dc0: 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
8dd0: 20 20 2f 2a 20 54 68 65 20 70 61 74 68 20 74 6f    /* The path to
8de0: 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74   search */.  int
8df0: 20 2a 70 41 70 6e 64 2c 20 20 20 20 20 20 20 20   *pApnd,        
8e00: 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 6e       /* Append n
8e10: 6f 64 65 73 20 74 6f 20 63 6f 6d 70 6c 65 74 65  odes to complete
8e20: 20 70 61 74 68 20 69 66 20 6e 6f 74 20 4e 55 4c   path if not NUL
8e30: 4c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 63  L */.  sqlite3_c
8e40: 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 20 20 2f  ontext *pCtx   /
8e50: 2a 20 52 65 70 6f 72 74 20 65 72 72 6f 72 73 20  * Report errors 
8e60: 68 65 72 65 2c 20 69 66 20 6e 6f 74 20 4e 55 4c  here, if not NUL
8e70: 4c 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  L */.){.  const 
8e80: 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a  char *zErr = 0;.
8e90: 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64    JsonNode *pNod
8ea0: 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  e = 0;.  char *z
8eb0: 4d 73 67 3b 0a 0a 20 20 69 66 28 20 7a 50 61 74  Msg;..  if( zPat
8ec0: 68 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  h==0 ) return 0;
8ed0: 0a 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d 21  .  if( zPath[0]!
8ee0: 3d 27 24 27 20 29 7b 0a 20 20 20 20 7a 45 72 72  ='$' ){.    zErr
8ef0: 20 3d 20 7a 50 61 74 68 3b 0a 20 20 20 20 67 6f   = zPath;.    go
8f00: 74 6f 20 6c 6f 6f 6b 75 70 5f 65 72 72 3b 0a 20  to lookup_err;. 
8f10: 20 7d 0a 20 20 7a 50 61 74 68 2b 2b 3b 0a 20 20   }.  zPath++;.  
8f20: 70 4e 6f 64 65 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b  pNode = jsonLook
8f30: 75 70 53 74 65 70 28 70 50 61 72 73 65 2c 20 30  upStep(pParse, 0
8f40: 2c 20 7a 50 61 74 68 2c 20 70 41 70 6e 64 2c 20  , zPath, pApnd, 
8f50: 26 7a 45 72 72 29 3b 0a 20 20 69 66 28 20 7a 45  &zErr);.  if( zE
8f60: 72 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 70  rr==0 ) return p
8f70: 4e 6f 64 65 3b 0a 0a 6c 6f 6f 6b 75 70 5f 65 72  Node;..lookup_er
8f80: 72 3a 0a 20 20 70 50 61 72 73 65 2d 3e 6e 45 72  r:.  pParse->nEr
8f90: 72 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  r++;.  assert( z
8fa0: 45 72 72 21 3d 30 20 26 26 20 70 43 74 78 21 3d  Err!=0 && pCtx!=
8fb0: 30 20 29 3b 0a 20 20 7a 4d 73 67 20 3d 20 6a 73  0 );.  zMsg = js
8fc0: 6f 6e 50 61 74 68 53 79 6e 74 61 78 45 72 72 6f  onPathSyntaxErro
8fd0: 72 28 7a 45 72 72 29 3b 0a 20 20 69 66 28 20 7a  r(zErr);.  if( z
8fe0: 4d 73 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Msg ){.    sqlit
8ff0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
9000: 70 43 74 78 2c 20 7a 4d 73 67 2c 20 2d 31 29 3b  pCtx, zMsg, -1);
9010: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
9020: 65 28 7a 4d 73 67 29 3b 0a 20 20 7d 65 6c 73 65  e(zMsg);.  }else
9030: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
9040: 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d  sult_error_nomem
9050: 28 70 43 74 78 29 3b 0a 20 20 7d 0a 20 20 72 65  (pCtx);.  }.  re
9060: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn 0;.}.../*.*
9070: 2a 20 52 65 70 6f 72 74 20 74 68 65 20 77 72 6f  * Report the wro
9080: 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  ng number of arg
9090: 75 6d 65 6e 74 73 20 66 6f 72 20 6a 73 6f 6e 5f  uments for json_
90a0: 69 6e 73 65 72 74 28 29 2c 20 6a 73 6f 6e 5f 72  insert(), json_r
90b0: 65 70 6c 61 63 65 28 29 0a 2a 2a 20 6f 72 20 6a  eplace().** or j
90c0: 73 6f 6e 5f 73 65 74 28 29 2e 0a 2a 2f 0a 73 74  son_set()..*/.st
90d0: 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 57 72  atic void jsonWr
90e0: 6f 6e 67 4e 75 6d 41 72 67 73 28 0a 20 20 73 71  ongNumArgs(.  sq
90f0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
9100: 43 74 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  Ctx,.  const cha
9110: 72 20 2a 7a 46 75 6e 63 4e 61 6d 65 0a 29 7b 0a  r *zFuncName.){.
9120: 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73    char *zMsg = s
9130: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
9140: 6a 73 6f 6e 5f 25 73 28 29 20 6e 65 65 64 73 20  json_%s() needs 
9150: 61 6e 20 6f 64 64 20 6e 75 6d 62 65 72 20 6f 66  an odd number of
9160: 20 61 72 67 75 6d 65 6e 74 73 22 2c 0a 20 20 20   arguments",.   
9170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9180: 20 20 20 20 20 20 20 20 20 20 20 20 7a 46 75 6e              zFun
9190: 63 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  cName);.  sqlite
91a0: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70  3_result_error(p
91b0: 43 74 78 2c 20 7a 4d 73 67 2c 20 2d 31 29 3b 0a  Ctx, zMsg, -1);.
91c0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
91d0: 4d 73 67 29 3b 20 20 20 20 20 0a 7d 0a 0a 2f 2a  Msg);     .}../*
91e0: 0a 2a 2a 20 4d 61 72 6b 20 61 6c 6c 20 4e 55 4c  .** Mark all NUL
91f0: 4c 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  L entries in the
9200: 20 4f 62 6a 65 63 74 20 70 61 73 73 65 64 20 69   Object passed i
9210: 6e 20 61 73 20 4a 4e 4f 44 45 5f 52 45 4d 4f 56  n as JNODE_REMOV
9220: 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  E..*/.static voi
9230: 64 20 6a 73 6f 6e 52 65 6d 6f 76 65 41 6c 6c 4e  d jsonRemoveAllN
9240: 75 6c 6c 73 28 4a 73 6f 6e 4e 6f 64 65 20 2a 70  ulls(JsonNode *p
9250: 4e 6f 64 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20  Node){.  int i, 
9260: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 6f  n;.  assert( pNo
9270: 64 65 2d 3e 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f  de->eType==JSON_
9280: 4f 42 4a 45 43 54 20 29 3b 0a 20 20 6e 20 3d 20  OBJECT );.  n = 
9290: 70 4e 6f 64 65 2d 3e 6e 3b 0a 20 20 66 6f 72 28  pNode->n;.  for(
92a0: 69 3d 32 3b 20 69 3c 3d 6e 3b 20 69 20 2b 3d 20  i=2; i<=n; i += 
92b0: 6a 73 6f 6e 4e 6f 64 65 53 69 7a 65 28 26 70 4e  jsonNodeSize(&pN
92c0: 6f 64 65 5b 69 5d 29 2b 31 29 7b 0a 20 20 20 20  ode[i])+1){.    
92d0: 73 77 69 74 63 68 28 20 70 4e 6f 64 65 5b 69 5d  switch( pNode[i]
92e0: 2e 65 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20  .eType ){.      
92f0: 63 61 73 65 20 4a 53 4f 4e 5f 4e 55 4c 4c 3a 0a  case JSON_NULL:.
9300: 20 20 20 20 20 20 20 20 70 4e 6f 64 65 5b 69 5d          pNode[i]
9310: 2e 6a 6e 46 6c 61 67 73 20 7c 3d 20 4a 4e 4f 44  .jnFlags |= JNOD
9320: 45 5f 52 45 4d 4f 56 45 3b 0a 20 20 20 20 20 20  E_REMOVE;.      
9330: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
9340: 61 73 65 20 4a 53 4f 4e 5f 4f 42 4a 45 43 54 3a  ase JSON_OBJECT:
9350: 0a 20 20 20 20 20 20 20 20 6a 73 6f 6e 52 65 6d  .        jsonRem
9360: 6f 76 65 41 6c 6c 4e 75 6c 6c 73 28 26 70 4e 6f  oveAllNulls(&pNo
9370: 64 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  de[i]);.        
9380: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
9390: 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}.../**********
93a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
93b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
93c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
93d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
93e0: 2a 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69  **.** SQL functi
93f0: 6f 6e 73 20 75 73 65 64 20 66 6f 72 20 74 65 73  ons used for tes
9400: 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69  ting and debuggi
9410: 6e 67 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng.*************
9420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
9460: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
9470: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 65 20  DEBUG./*.** The 
9480: 6a 73 6f 6e 5f 70 61 72 73 65 28 4a 53 4f 4e 29  json_parse(JSON)
9490: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
94a0: 73 20 61 20 73 74 72 69 6e 67 20 77 68 69 63 68  s a string which
94b0: 20 64 65 73 63 72 69 62 65 73 0a 2a 2a 20 61 20   describes.** a 
94c0: 70 61 72 73 65 20 6f 66 20 74 68 65 20 4a 53 4f  parse of the JSO
94d0: 4e 20 70 72 6f 76 69 64 65 64 2e 20 20 4f 72 20  N provided.  Or 
94e0: 69 74 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20  it returns NULL 
94f0: 69 66 20 4a 53 4f 4e 20 69 73 20 6e 6f 74 0a 2a  if JSON is not.*
9500: 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 0a 2a  * well-formed..*
9510: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73  /.static void js
9520: 6f 6e 50 61 72 73 65 46 75 6e 63 28 0a 20 20 73  onParseFunc(.  s
9530: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
9540: 63 74 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ctx,.  int argc,
9550: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
9560: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 4a 73 6f   **argv.){.  Jso
9570: 6e 53 74 72 69 6e 67 20 73 3b 20 20 20 20 20 20  nString s;      
9580: 20 2f 2a 20 4f 75 74 70 75 74 20 73 74 72 69 6e   /* Output strin
9590: 67 20 2d 20 6e 6f 74 20 72 65 61 6c 20 4a 53 4f  g - not real JSO
95a0: 4e 20 2a 2f 0a 20 20 4a 73 6f 6e 50 61 72 73 65  N */.  JsonParse
95b0: 20 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68   x;        /* Th
95c0: 65 20 70 61 72 73 65 20 2a 2f 0a 20 20 75 33 32  e parse */.  u32
95d0: 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61   i;..  assert( a
95e0: 72 67 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20  rgc==1 );.  if( 
95f0: 6a 73 6f 6e 50 61 72 73 65 28 26 78 2c 20 63 74  jsonParse(&x, ct
9600: 78 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  x, (const char*)
9610: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
9620: 78 74 28 61 72 67 76 5b 30 5d 29 29 20 29 20 72  xt(argv[0])) ) r
9630: 65 74 75 72 6e 3b 0a 20 20 6a 73 6f 6e 50 61 72  eturn;.  jsonPar
9640: 73 65 46 69 6e 64 50 61 72 65 6e 74 73 28 26 78  seFindParents(&x
9650: 29 3b 0a 20 20 6a 73 6f 6e 49 6e 69 74 28 26 73  );.  jsonInit(&s
9660: 2c 20 63 74 78 29 3b 0a 20 20 66 6f 72 28 69 3d  , ctx);.  for(i=
9670: 30 3b 20 69 3c 78 2e 6e 4e 6f 64 65 3b 20 69 2b  0; i<x.nNode; i+
9680: 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  +){.    const ch
9690: 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20 20 20 69  ar *zType;.    i
96a0: 66 28 20 78 2e 61 4e 6f 64 65 5b 69 5d 2e 6a 6e  f( x.aNode[i].jn
96b0: 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 4c 41  Flags & JNODE_LA
96c0: 42 45 4c 20 29 7b 0a 20 20 20 20 20 20 61 73 73  BEL ){.      ass
96d0: 65 72 74 28 20 78 2e 61 4e 6f 64 65 5b 69 5d 2e  ert( x.aNode[i].
96e0: 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f 53 54 52 49  eType==JSON_STRI
96f0: 4e 47 20 29 3b 0a 20 20 20 20 20 20 7a 54 79 70  NG );.      zTyp
9700: 65 20 3d 20 22 6c 61 62 65 6c 22 3b 0a 20 20 20  e = "label";.   
9710: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 54   }else{.      zT
9720: 79 70 65 20 3d 20 6a 73 6f 6e 54 79 70 65 5b 78  ype = jsonType[x
9730: 2e 61 4e 6f 64 65 5b 69 5d 2e 65 54 79 70 65 5d  .aNode[i].eType]
9740: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 73 6f 6e  ;.    }.    json
9750: 50 72 69 6e 74 66 28 31 30 30 2c 20 26 73 2c 22  Printf(100, &s,"
9760: 6e 6f 64 65 20 25 33 75 3a 20 25 37 73 20 6e 3d  node %3u: %7s n=
9770: 25 2d 34 64 20 75 70 3d 25 2d 34 64 22 2c 0a 20  %-4d up=%-4d",. 
9780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 2c                i,
9790: 20 7a 54 79 70 65 2c 20 78 2e 61 4e 6f 64 65 5b   zType, x.aNode[
97a0: 69 5d 2e 6e 2c 20 78 2e 61 55 70 5b 69 5d 29 3b  i].n, x.aUp[i]);
97b0: 0a 20 20 20 20 69 66 28 20 78 2e 61 4e 6f 64 65  .    if( x.aNode
97c0: 5b 69 5d 2e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 21  [i].u.zJContent!
97d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6a 73 6f 6e  =0 ){.      json
97e0: 41 70 70 65 6e 64 52 61 77 28 26 73 2c 20 22 20  AppendRaw(&s, " 
97f0: 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 6a 73 6f  ", 1);.      jso
9800: 6e 41 70 70 65 6e 64 52 61 77 28 26 73 2c 20 78  nAppendRaw(&s, x
9810: 2e 61 4e 6f 64 65 5b 69 5d 2e 75 2e 7a 4a 43 6f  .aNode[i].u.zJCo
9820: 6e 74 65 6e 74 2c 20 78 2e 61 4e 6f 64 65 5b 69  ntent, x.aNode[i
9830: 5d 2e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ].n);.    }.    
9840: 6a 73 6f 6e 41 70 70 65 6e 64 52 61 77 28 26 73  jsonAppendRaw(&s
9850: 2c 20 22 5c 6e 22 2c 20 31 29 3b 0a 20 20 7d 0a  , "\n", 1);.  }.
9860: 20 20 6a 73 6f 6e 50 61 72 73 65 52 65 73 65 74    jsonParseReset
9870: 28 26 78 29 3b 0a 20 20 6a 73 6f 6e 52 65 73 75  (&x);.  jsonResu
9880: 6c 74 28 26 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lt(&s);.}../*.**
9890: 20 54 68 65 20 6a 73 6f 6e 5f 74 65 73 74 31 28   The json_test1(
98a0: 4a 53 4f 4e 29 20 66 75 6e 63 74 69 6f 6e 20 72  JSON) function r
98b0: 65 74 75 72 6e 20 74 72 75 65 20 28 31 29 20 69  eturn true (1) i
98c0: 66 20 74 68 65 20 69 6e 70 75 74 20 69 73 20 4a  f the input is J
98d0: 53 4f 4e 0a 2a 2a 20 74 65 78 74 20 67 65 6e 65  SON.** text gene
98e0: 72 61 74 65 64 20 62 79 20 61 6e 6f 74 68 65 72  rated by another
98f0: 20 6a 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e 20   json function. 
9900: 20 49 74 20 72 65 74 75 72 6e 73 20 28 30 29 20   It returns (0) 
9910: 69 66 20 74 68 65 20 69 6e 70 75 74 0a 2a 2a 20  if the input.** 
9920: 69 73 20 6e 6f 74 20 6b 6e 6f 77 6e 20 74 6f 20  is not known to 
9930: 62 65 20 4a 53 4f 4e 2e 0a 2a 2f 0a 73 74 61 74  be JSON..*/.stat
9940: 69 63 20 76 6f 69 64 20 6a 73 6f 6e 54 65 73 74  ic void jsonTest
9950: 31 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  1Func(.  sqlite3
9960: 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 0a 20  _context *ctx,. 
9970: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
9980: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
9990: 76 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  v.){.  UNUSED_PA
99a0: 52 41 4d 28 61 72 67 63 29 3b 0a 20 20 73 71 6c  RAM(argc);.  sql
99b0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28  ite3_result_int(
99c0: 63 74 78 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  ctx, sqlite3_val
99d0: 75 65 5f 73 75 62 74 79 70 65 28 61 72 67 76 5b  ue_subtype(argv[
99e0: 30 5d 29 3d 3d 4a 53 4f 4e 5f 53 55 42 54 59 50  0])==JSON_SUBTYP
99f0: 45 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  E);.}.#endif /* 
9a00: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a  SQLITE_DEBUG */.
9a10: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
9a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
9a60: 2a 20 53 63 61 6c 61 72 20 53 51 4c 20 66 75 6e  * Scalar SQL fun
9a70: 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 61  ction implementa
9a80: 74 69 6f 6e 73 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tions.**********
9a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9ad0: 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  **/../*.** Imple
9ae0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
9af0: 20 6a 73 6f 6e 5f 51 55 4f 54 45 28 56 41 4c 55   json_QUOTE(VALU
9b00: 45 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 52 65  E) function.  Re
9b10: 74 75 72 6e 20 61 20 4a 53 4f 4e 20 76 61 6c 75  turn a JSON valu
9b20: 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  e.** correspondi
9b30: 6e 67 20 74 6f 20 74 68 65 20 53 51 4c 20 76 61  ng to the SQL va
9b40: 6c 75 65 20 69 6e 70 75 74 2e 20 20 4d 6f 73 74  lue input.  Most
9b50: 6c 79 20 74 68 69 73 20 6d 65 61 6e 73 20 70 75  ly this means pu
9b60: 74 74 69 6e 67 20 0a 2a 2a 20 64 6f 75 62 6c 65  tting .** double
9b70: 2d 71 75 6f 74 65 73 20 61 72 6f 75 6e 64 20 73  -quotes around s
9b80: 74 72 69 6e 67 73 20 61 6e 64 20 72 65 74 75 72  trings and retur
9b90: 6e 69 6e 67 20 74 68 65 20 75 6e 71 75 6f 74 65  ning the unquote
9ba0: 64 20 73 74 72 69 6e 67 20 22 6e 75 6c 6c 22 0a  d string "null".
9bb0: 2a 2a 20 77 68 65 6e 20 67 69 76 65 6e 20 61 20  ** when given a 
9bc0: 4e 55 4c 4c 20 69 6e 70 75 74 2e 0a 2a 2f 0a 73  NULL input..*/.s
9bd0: 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 51  tatic void jsonQ
9be0: 75 6f 74 65 46 75 6e 63 28 0a 20 20 73 71 6c 69  uoteFunc(.  sqli
9bf0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78  te3_context *ctx
9c00: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
9c10: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
9c20: 61 72 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e 53 74  argv.){.  JsonSt
9c30: 72 69 6e 67 20 6a 78 3b 0a 20 20 55 4e 55 53 45  ring jx;.  UNUSE
9c40: 44 5f 50 41 52 41 4d 28 61 72 67 63 29 3b 0a 0a  D_PARAM(argc);..
9c50: 20 20 6a 73 6f 6e 49 6e 69 74 28 26 6a 78 2c 20    jsonInit(&jx, 
9c60: 63 74 78 29 3b 0a 20 20 6a 73 6f 6e 41 70 70 65  ctx);.  jsonAppe
9c70: 6e 64 56 61 6c 75 65 28 26 6a 78 2c 20 61 72 67  ndValue(&jx, arg
9c80: 76 5b 30 5d 29 3b 0a 20 20 6a 73 6f 6e 52 65 73  v[0]);.  jsonRes
9c90: 75 6c 74 28 26 6a 78 29 3b 0a 20 20 73 71 6c 69  ult(&jx);.  sqli
9ca0: 74 65 33 5f 72 65 73 75 6c 74 5f 73 75 62 74 79  te3_result_subty
9cb0: 70 65 28 63 74 78 2c 20 4a 53 4f 4e 5f 53 55 42  pe(ctx, JSON_SUB
9cc0: 54 59 50 45 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TYPE);.}../*.** 
9cd0: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
9ce0: 66 20 74 68 65 20 6a 73 6f 6e 5f 61 72 72 61 79  f the json_array
9cf0: 28 56 41 4c 55 45 2c 2e 2e 2e 29 20 66 75 6e 63  (VALUE,...) func
9d00: 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 20  tion.  Return a 
9d10: 4a 53 4f 4e 0a 2a 2a 20 61 72 72 61 79 20 74 68  JSON.** array th
9d20: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20  at contains all 
9d30: 76 61 6c 75 65 73 20 67 69 76 65 6e 20 69 6e 20  values given in 
9d40: 61 72 67 75 6d 65 6e 74 73 2e 20 20 4f 72 20 69  arguments.  Or i
9d50: 66 20 61 6e 79 20 61 72 67 75 6d 65 6e 74 0a 2a  f any argument.*
9d60: 2a 20 69 73 20 61 20 42 4c 4f 42 2c 20 74 68 72  * is a BLOB, thr
9d70: 6f 77 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a  ow an error..*/.
9d80: 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e  static void json
9d90: 41 72 72 61 79 46 75 6e 63 28 0a 20 20 73 71 6c  ArrayFunc(.  sql
9da0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74  ite3_context *ct
9db0: 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  x,.  int argc,. 
9dc0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
9dd0: 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 69  *argv.){.  int i
9de0: 3b 0a 20 20 4a 73 6f 6e 53 74 72 69 6e 67 20 6a  ;.  JsonString j
9df0: 78 3b 0a 0a 20 20 6a 73 6f 6e 49 6e 69 74 28 26  x;..  jsonInit(&
9e00: 6a 78 2c 20 63 74 78 29 3b 0a 20 20 6a 73 6f 6e  jx, ctx);.  json
9e10: 41 70 70 65 6e 64 43 68 61 72 28 26 6a 78 2c 20  AppendChar(&jx, 
9e20: 27 5b 27 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  '[');.  for(i=0;
9e30: 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20   i<argc; i++){. 
9e40: 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 53 65 70     jsonAppendSep
9e50: 61 72 61 74 6f 72 28 26 6a 78 29 3b 0a 20 20 20  arator(&jx);.   
9e60: 20 6a 73 6f 6e 41 70 70 65 6e 64 56 61 6c 75 65   jsonAppendValue
9e70: 28 26 6a 78 2c 20 61 72 67 76 5b 69 5d 29 3b 0a  (&jx, argv[i]);.
9e80: 20 20 7d 0a 20 20 6a 73 6f 6e 41 70 70 65 6e 64    }.  jsonAppend
9e90: 43 68 61 72 28 26 6a 78 2c 20 27 5d 27 29 3b 0a  Char(&jx, ']');.
9ea0: 20 20 6a 73 6f 6e 52 65 73 75 6c 74 28 26 6a 78    jsonResult(&jx
9eb0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
9ec0: 75 6c 74 5f 73 75 62 74 79 70 65 28 63 74 78 2c  ult_subtype(ctx,
9ed0: 20 4a 53 4f 4e 5f 53 55 42 54 59 50 45 29 3b 0a   JSON_SUBTYPE);.
9ee0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 6a 73 6f 6e 5f 61  }.../*.** json_a
9ef0: 72 72 61 79 5f 6c 65 6e 67 74 68 28 4a 53 4f 4e  rray_length(JSON
9f00: 29 0a 2a 2a 20 6a 73 6f 6e 5f 61 72 72 61 79 5f  ).** json_array_
9f10: 6c 65 6e 67 74 68 28 4a 53 4f 4e 2c 20 50 41 54  length(JSON, PAT
9f20: 48 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  H).**.** Return 
9f30: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
9f40: 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 74 6f  ements in the to
9f50: 70 2d 6c 65 76 65 6c 20 4a 53 4f 4e 20 61 72 72  p-level JSON arr
9f60: 61 79 2e 20 20 0a 2a 2a 20 52 65 74 75 72 6e 20  ay.  .** Return 
9f70: 30 20 69 66 20 74 68 65 20 69 6e 70 75 74 20 69  0 if the input i
9f80: 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72  s not a well-for
9f90: 6d 65 64 20 4a 53 4f 4e 20 61 72 72 61 79 2e 0a  med JSON array..
9fa0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a  */.static void j
9fb0: 73 6f 6e 41 72 72 61 79 4c 65 6e 67 74 68 46 75  sonArrayLengthFu
9fc0: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
9fd0: 6e 74 65 78 74 20 2a 63 74 78 2c 0a 20 20 69 6e  ntext *ctx,.  in
9fe0: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
9ff0: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
a000: 7b 0a 20 20 4a 73 6f 6e 50 61 72 73 65 20 2a 70  {.  JsonParse *p
a010: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
a020: 65 20 70 61 72 73 65 20 2a 2f 0a 20 20 73 71 6c  e parse */.  sql
a030: 69 74 65 33 5f 69 6e 74 36 34 20 6e 20 3d 20 30  ite3_int64 n = 0
a040: 3b 0a 20 20 75 33 32 20 69 3b 0a 20 20 4a 73 6f  ;.  u32 i;.  Jso
a050: 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 3b 0a 0a 20  nNode *pNode;.. 
a060: 20 70 20 3d 20 6a 73 6f 6e 50 61 72 73 65 43 61   p = jsonParseCa
a070: 63 68 65 64 28 63 74 78 2c 20 61 72 67 76 2c 20  ched(ctx, argv, 
a080: 63 74 78 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  ctx);.  if( p==0
a090: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
a0a0: 65 72 74 28 20 70 2d 3e 6e 4e 6f 64 65 20 29 3b  ert( p->nNode );
a0b0: 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 32 20 29  .  if( argc==2 )
a0c0: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
a0d0: 20 2a 7a 50 61 74 68 20 3d 20 28 63 6f 6e 73 74   *zPath = (const
a0e0: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
a0f0: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31  alue_text(argv[1
a100: 5d 29 3b 0a 20 20 20 20 70 4e 6f 64 65 20 3d 20  ]);.    pNode = 
a110: 6a 73 6f 6e 4c 6f 6f 6b 75 70 28 70 2c 20 7a 50  jsonLookup(p, zP
a120: 61 74 68 2c 20 30 2c 20 63 74 78 29 3b 0a 20 20  ath, 0, ctx);.  
a130: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 6f 64 65  }else{.    pNode
a140: 20 3d 20 70 2d 3e 61 4e 6f 64 65 3b 0a 20 20 7d   = p->aNode;.  }
a150: 0a 20 20 69 66 28 20 70 4e 6f 64 65 3d 3d 30 20  .  if( pNode==0 
a160: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
a170: 20 7d 0a 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e   }.  if( pNode->
a180: 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f 41 52 52 41  eType==JSON_ARRA
a190: 59 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  Y ){.    assert(
a1a0: 20 28 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73   (pNode->jnFlags
a1b0: 20 26 20 4a 4e 4f 44 45 5f 41 50 50 45 4e 44 29   & JNODE_APPEND)
a1c0: 3d 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  ==0 );.    for(i
a1d0: 3d 31 3b 20 69 3c 3d 70 4e 6f 64 65 2d 3e 6e 3b  =1; i<=pNode->n;
a1e0: 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69 20 2b   n++){.      i +
a1f0: 3d 20 6a 73 6f 6e 4e 6f 64 65 53 69 7a 65 28 26  = jsonNodeSize(&
a200: 70 4e 6f 64 65 5b 69 5d 29 3b 0a 20 20 20 20 7d  pNode[i]);.    }
a210: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72  .  }.  sqlite3_r
a220: 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 74 78 2c  esult_int64(ctx,
a230: 20 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 6a 73   n);.}../*.** js
a240: 6f 6e 5f 65 78 74 72 61 63 74 28 4a 53 4f 4e 2c  on_extract(JSON,
a250: 20 50 41 54 48 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a   PATH, ...).**.*
a260: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 65 6c 65  * Return the ele
a270: 6d 65 6e 74 20 64 65 73 63 72 69 62 65 64 20 62  ment described b
a280: 79 20 50 41 54 48 2e 20 20 52 65 74 75 72 6e 20  y PATH.  Return 
a290: 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73  NULL if there is
a2a0: 20 6e 6f 0a 2a 2a 20 50 41 54 48 20 65 6c 65 6d   no.** PATH elem
a2b0: 65 6e 74 2e 20 20 49 66 20 74 68 65 72 65 20 61  ent.  If there a
a2c0: 72 65 20 6d 75 6c 74 69 70 6c 65 20 50 41 54 48  re multiple PATH
a2d0: 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61  s, then return a
a2e0: 20 4a 53 4f 4e 20 61 72 72 61 79 0a 2a 2a 20 77   JSON array.** w
a2f0: 69 74 68 20 74 68 65 20 72 65 73 75 6c 74 20 66  ith the result f
a300: 72 6f 6d 20 65 61 63 68 20 70 61 74 68 2e 20 20  rom each path.  
a310: 54 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 20 69  Throw an error i
a320: 66 20 74 68 65 20 4a 53 4f 4e 20 6f 72 20 61 6e  f the JSON or an
a330: 79 20 50 41 54 48 0a 2a 2a 20 69 73 20 6d 61 6c  y PATH.** is mal
a340: 66 6f 72 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  formed..*/.stati
a350: 63 20 76 6f 69 64 20 6a 73 6f 6e 45 78 74 72 61  c void jsonExtra
a360: 63 74 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  ctFunc(.  sqlite
a370: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 0a  3_context *ctx,.
a380: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
a390: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
a3a0: 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e 50 61 72 73  gv.){.  JsonPars
a3b0: 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 2f  e *p;          /
a3c0: 2a 20 54 68 65 20 70 61 72 73 65 20 2a 2f 0a 20  * The parse */. 
a3d0: 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65   JsonNode *pNode
a3e0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
a3f0: 7a 50 61 74 68 3b 0a 20 20 4a 73 6f 6e 53 74 72  zPath;.  JsonStr
a400: 69 6e 67 20 6a 78 3b 0a 20 20 69 6e 74 20 69 3b  ing jx;.  int i;
a410: 0a 0a 20 20 69 66 28 20 61 72 67 63 3c 32 20 29  ..  if( argc<2 )
a420: 20 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20 6a   return;.  p = j
a430: 73 6f 6e 50 61 72 73 65 43 61 63 68 65 64 28 63  sonParseCached(c
a440: 74 78 2c 20 61 72 67 76 2c 20 63 74 78 29 3b 0a  tx, argv, ctx);.
a450: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
a460: 75 72 6e 3b 0a 20 20 6a 73 6f 6e 49 6e 69 74 28  urn;.  jsonInit(
a470: 26 6a 78 2c 20 63 74 78 29 3b 0a 20 20 6a 73 6f  &jx, ctx);.  jso
a480: 6e 41 70 70 65 6e 64 43 68 61 72 28 26 6a 78 2c  nAppendChar(&jx,
a490: 20 27 5b 27 29 3b 0a 20 20 66 6f 72 28 69 3d 31   '[');.  for(i=1
a4a0: 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  ; i<argc; i++){.
a4b0: 20 20 20 20 7a 50 61 74 68 20 3d 20 28 63 6f 6e      zPath = (con
a4c0: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
a4d0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
a4e0: 5b 69 5d 29 3b 0a 20 20 20 20 70 4e 6f 64 65 20  [i]);.    pNode 
a4f0: 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 28 70 2c 20  = jsonLookup(p, 
a500: 7a 50 61 74 68 2c 20 30 2c 20 63 74 78 29 3b 0a  zPath, 0, ctx);.
a510: 20 20 20 20 69 66 28 20 70 2d 3e 6e 45 72 72 20      if( p->nErr 
a520: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
a530: 20 61 72 67 63 3e 32 20 29 7b 0a 20 20 20 20 20   argc>2 ){.     
a540: 20 6a 73 6f 6e 41 70 70 65 6e 64 53 65 70 61 72   jsonAppendSepar
a550: 61 74 6f 72 28 26 6a 78 29 3b 0a 20 20 20 20 20  ator(&jx);.     
a560: 20 69 66 28 20 70 4e 6f 64 65 20 29 7b 0a 20 20   if( pNode ){.  
a570: 20 20 20 20 20 20 6a 73 6f 6e 52 65 6e 64 65 72        jsonRender
a580: 4e 6f 64 65 28 70 4e 6f 64 65 2c 20 26 6a 78 2c  Node(pNode, &jx,
a590: 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   0);.      }else
a5a0: 7b 0a 20 20 20 20 20 20 20 20 6a 73 6f 6e 41 70  {.        jsonAp
a5b0: 70 65 6e 64 52 61 77 28 26 6a 78 2c 20 22 6e 75  pendRaw(&jx, "nu
a5c0: 6c 6c 22 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d  ll", 4);.      }
a5d0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
a5e0: 4e 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 6a 73  Node ){.      js
a5f0: 6f 6e 52 65 74 75 72 6e 28 70 4e 6f 64 65 2c 20  onReturn(pNode, 
a600: 63 74 78 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ctx, 0);.    }. 
a610: 20 7d 0a 20 20 69 66 28 20 61 72 67 63 3e 32 20   }.  if( argc>2 
a620: 26 26 20 69 3d 3d 61 72 67 63 20 29 7b 0a 20 20  && i==argc ){.  
a630: 20 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61 72    jsonAppendChar
a640: 28 26 6a 78 2c 20 27 5d 27 29 3b 0a 20 20 20 20  (&jx, ']');.    
a650: 6a 73 6f 6e 52 65 73 75 6c 74 28 26 6a 78 29 3b  jsonResult(&jx);
a660: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
a670: 75 6c 74 5f 73 75 62 74 79 70 65 28 63 74 78 2c  ult_subtype(ctx,
a680: 20 4a 53 4f 4e 5f 53 55 42 54 59 50 45 29 3b 0a   JSON_SUBTYPE);.
a690: 20 20 7d 0a 20 20 6a 73 6f 6e 52 65 73 65 74 28    }.  jsonReset(
a6a0: 26 6a 78 29 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73  &jx);.}../* This
a6b0: 20 69 73 20 74 68 65 20 52 46 43 20 37 33 39 36   is the RFC 7396
a6c0: 20 4d 65 72 67 65 50 61 74 63 68 20 61 6c 67 6f   MergePatch algo
a6d0: 72 69 74 68 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63  rithm..*/.static
a6e0: 20 4a 73 6f 6e 4e 6f 64 65 20 2a 6a 73 6f 6e 4d   JsonNode *jsonM
a6f0: 65 72 67 65 50 61 74 63 68 28 0a 20 20 4a 73 6f  ergePatch(.  Jso
a700: 6e 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  nParse *pParse, 
a710: 20 20 2f 2a 20 54 68 65 20 4a 53 4f 4e 20 70 61    /* The JSON pa
a720: 72 73 65 72 20 74 68 61 74 20 63 6f 6e 74 61 69  rser that contai
a730: 6e 73 20 74 68 65 20 54 41 52 47 45 54 20 2a 2f  ns the TARGET */
a740: 0a 20 20 75 33 32 20 69 54 61 72 67 65 74 2c 20  .  u32 iTarget, 
a750: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 64 65 20          /* Node 
a760: 6f 66 20 74 68 65 20 54 41 52 47 45 54 20 69 6e  of the TARGET in
a770: 20 70 50 61 72 73 65 20 2a 2f 0a 20 20 4a 73 6f   pParse */.  Jso
a780: 6e 4e 6f 64 65 20 2a 70 50 61 74 63 68 20 20 20  nNode *pPatch   
a790: 20 20 2f 2a 20 54 68 65 20 50 41 54 43 48 20 2a    /* The PATCH *
a7a0: 2f 0a 29 7b 0a 20 20 75 33 32 20 69 2c 20 6a 3b  /.){.  u32 i, j;
a7b0: 0a 20 20 75 33 32 20 69 52 6f 6f 74 3b 0a 20 20  .  u32 iRoot;.  
a7c0: 4a 73 6f 6e 4e 6f 64 65 20 2a 70 54 61 72 67 65  JsonNode *pTarge
a7d0: 74 3b 0a 20 20 69 66 28 20 70 50 61 74 63 68 2d  t;.  if( pPatch-
a7e0: 3e 65 54 79 70 65 21 3d 4a 53 4f 4e 5f 4f 42 4a  >eType!=JSON_OBJ
a7f0: 45 43 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ECT ){.    retur
a800: 6e 20 70 50 61 74 63 68 3b 0a 20 20 7d 0a 20 20  n pPatch;.  }.  
a810: 61 73 73 65 72 74 28 20 69 54 61 72 67 65 74 3e  assert( iTarget>
a820: 3d 30 20 26 26 20 69 54 61 72 67 65 74 3c 70 50  =0 && iTarget<pP
a830: 61 72 73 65 2d 3e 6e 4e 6f 64 65 20 29 3b 0a 20  arse->nNode );. 
a840: 20 70 54 61 72 67 65 74 20 3d 20 26 70 50 61 72   pTarget = &pPar
a850: 73 65 2d 3e 61 4e 6f 64 65 5b 69 54 61 72 67 65  se->aNode[iTarge
a860: 74 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70  t];.  assert( (p
a870: 50 61 74 63 68 2d 3e 6a 6e 46 6c 61 67 73 20 26  Patch->jnFlags &
a880: 20 4a 4e 4f 44 45 5f 41 50 50 45 4e 44 29 3d 3d   JNODE_APPEND)==
a890: 30 20 29 3b 0a 20 20 69 66 28 20 70 54 61 72 67  0 );.  if( pTarg
a8a0: 65 74 2d 3e 65 54 79 70 65 21 3d 4a 53 4f 4e 5f  et->eType!=JSON_
a8b0: 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 6a 73  OBJECT ){.    js
a8c0: 6f 6e 52 65 6d 6f 76 65 41 6c 6c 4e 75 6c 6c 73  onRemoveAllNulls
a8d0: 28 70 50 61 74 63 68 29 3b 0a 20 20 20 20 72 65  (pPatch);.    re
a8e0: 74 75 72 6e 20 70 50 61 74 63 68 3b 0a 20 20 7d  turn pPatch;.  }
a8f0: 0a 20 20 69 52 6f 6f 74 20 3d 20 69 54 61 72 67  .  iRoot = iTarg
a900: 65 74 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69  et;.  for(i=1; i
a910: 3c 70 50 61 74 63 68 2d 3e 6e 3b 20 69 20 2b 3d  <pPatch->n; i +=
a920: 20 6a 73 6f 6e 4e 6f 64 65 53 69 7a 65 28 26 70   jsonNodeSize(&p
a930: 50 61 74 63 68 5b 69 2b 31 5d 29 2b 31 29 7b 0a  Patch[i+1])+1){.
a940: 20 20 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20      u32 nKey;.  
a950: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b    const char *zK
a960: 65 79 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ey;.    assert( 
a970: 70 50 61 74 63 68 5b 69 5d 2e 65 54 79 70 65 3d  pPatch[i].eType=
a980: 3d 4a 53 4f 4e 5f 53 54 52 49 4e 47 20 29 3b 0a  =JSON_STRING );.
a990: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 74      assert( pPat
a9a0: 63 68 5b 69 5d 2e 6a 6e 46 6c 61 67 73 20 26 20  ch[i].jnFlags & 
a9b0: 4a 4e 4f 44 45 5f 4c 41 42 45 4c 20 29 3b 0a 20  JNODE_LABEL );. 
a9c0: 20 20 20 6e 4b 65 79 20 3d 20 70 50 61 74 63 68     nKey = pPatch
a9d0: 5b 69 5d 2e 6e 3b 0a 20 20 20 20 7a 4b 65 79 20  [i].n;.    zKey 
a9e0: 3d 20 70 50 61 74 63 68 5b 69 5d 2e 75 2e 7a 4a  = pPatch[i].u.zJ
a9f0: 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 61 73 73  Content;.    ass
aa00: 65 72 74 28 20 28 70 50 61 74 63 68 5b 69 5d 2e  ert( (pPatch[i].
aa10: 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f  jnFlags & JNODE_
aa20: 52 41 57 29 3d 3d 30 20 29 3b 0a 20 20 20 20 66  RAW)==0 );.    f
aa30: 6f 72 28 6a 3d 31 3b 20 6a 3c 70 54 61 72 67 65  or(j=1; j<pTarge
aa40: 74 2d 3e 6e 3b 20 6a 20 2b 3d 20 6a 73 6f 6e 4e  t->n; j += jsonN
aa50: 6f 64 65 53 69 7a 65 28 26 70 54 61 72 67 65 74  odeSize(&pTarget
aa60: 5b 6a 2b 31 5d 29 2b 31 20 29 7b 0a 20 20 20 20  [j+1])+1 ){.    
aa70: 20 20 61 73 73 65 72 74 28 20 70 54 61 72 67 65    assert( pTarge
aa80: 74 5b 6a 5d 2e 65 54 79 70 65 3d 3d 4a 53 4f 4e  t[j].eType==JSON
aa90: 5f 53 54 52 49 4e 47 20 29 3b 0a 20 20 20 20 20  _STRING );.     
aaa0: 20 61 73 73 65 72 74 28 20 70 54 61 72 67 65 74   assert( pTarget
aab0: 5b 6a 5d 2e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e  [j].jnFlags & JN
aac0: 4f 44 45 5f 4c 41 42 45 4c 20 29 3b 0a 20 20 20  ODE_LABEL );.   
aad0: 20 20 20 61 73 73 65 72 74 28 20 28 70 50 61 74     assert( (pPat
aae0: 63 68 5b 69 5d 2e 6a 6e 46 6c 61 67 73 20 26 20  ch[i].jnFlags & 
aaf0: 4a 4e 4f 44 45 5f 52 41 57 29 3d 3d 30 20 29 3b  JNODE_RAW)==0 );
ab00: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 72 67  .      if( pTarg
ab10: 65 74 5b 6a 5d 2e 6e 3d 3d 6e 4b 65 79 20 26 26  et[j].n==nKey &&
ab20: 20 73 74 72 6e 63 6d 70 28 70 54 61 72 67 65 74   strncmp(pTarget
ab30: 5b 6a 5d 2e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 2c  [j].u.zJContent,
ab40: 7a 4b 65 79 2c 6e 4b 65 79 29 3d 3d 30 20 29 7b  zKey,nKey)==0 ){
ab50: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61  .        if( pTa
ab60: 72 67 65 74 5b 6a 2b 31 5d 2e 6a 6e 46 6c 61 67  rget[j+1].jnFlag
ab70: 73 20 26 20 28 4a 4e 4f 44 45 5f 52 45 4d 4f 56  s & (JNODE_REMOV
ab80: 45 7c 4a 4e 4f 44 45 5f 50 41 54 43 48 29 20 29  E|JNODE_PATCH) )
ab90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
aba0: 69 66 28 20 70 50 61 74 63 68 5b 69 2b 31 5d 2e  if( pPatch[i+1].
abb0: 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f 4e 55 4c 4c  eType==JSON_NULL
abc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54   ){.          pT
abd0: 61 72 67 65 74 5b 6a 2b 31 5d 2e 6a 6e 46 6c 61  arget[j+1].jnFla
abe0: 67 73 20 7c 3d 20 4a 4e 4f 44 45 5f 52 45 4d 4f  gs |= JNODE_REMO
abf0: 56 45 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  VE;.        }els
ac00: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 4a 73 6f  e{.          Jso
ac10: 6e 4e 6f 64 65 20 2a 70 4e 65 77 20 3d 20 6a 73  nNode *pNew = js
ac20: 6f 6e 4d 65 72 67 65 50 61 74 63 68 28 70 50 61  onMergePatch(pPa
ac30: 72 73 65 2c 20 69 54 61 72 67 65 74 2b 6a 2b 31  rse, iTarget+j+1
ac40: 2c 20 26 70 50 61 74 63 68 5b 69 2b 31 5d 29 3b  , &pPatch[i+1]);
ac50: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
ac60: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
ac70: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61  0;.          pTa
ac80: 72 67 65 74 20 3d 20 26 70 50 61 72 73 65 2d 3e  rget = &pParse->
ac90: 61 4e 6f 64 65 5b 69 54 61 72 67 65 74 5d 3b 0a  aNode[iTarget];.
aca0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e            if( pN
acb0: 65 77 21 3d 26 70 54 61 72 67 65 74 5b 6a 2b 31  ew!=&pTarget[j+1
acc0: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ] ){.           
acd0: 20 70 54 61 72 67 65 74 5b 6a 2b 31 5d 2e 75 2e   pTarget[j+1].u.
ace0: 70 50 61 74 63 68 20 3d 20 70 4e 65 77 3b 0a 20  pPatch = pNew;. 
acf0: 20 20 20 20 20 20 20 20 20 20 20 70 54 61 72 67             pTarg
ad00: 65 74 5b 6a 2b 31 5d 2e 6a 6e 46 6c 61 67 73 20  et[j+1].jnFlags 
ad10: 7c 3d 20 4a 4e 4f 44 45 5f 50 41 54 43 48 3b 0a  |= JNODE_PATCH;.
ad20: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
ad30: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
ad40: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
ad50: 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70 54   }.    if( j>=pT
ad60: 61 72 67 65 74 2d 3e 6e 20 26 26 20 70 50 61 74  arget->n && pPat
ad70: 63 68 5b 69 2b 31 5d 2e 65 54 79 70 65 21 3d 4a  ch[i+1].eType!=J
ad80: 53 4f 4e 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  SON_NULL ){.    
ad90: 20 20 69 6e 74 20 69 53 74 61 72 74 2c 20 69 50    int iStart, iP
ada0: 61 74 63 68 3b 0a 20 20 20 20 20 20 69 53 74 61  atch;.      iSta
adb0: 72 74 20 3d 20 6a 73 6f 6e 50 61 72 73 65 41 64  rt = jsonParseAd
adc0: 64 4e 6f 64 65 28 70 50 61 72 73 65 2c 20 4a 53  dNode(pParse, JS
add0: 4f 4e 5f 4f 42 4a 45 43 54 2c 20 32 2c 20 30 29  ON_OBJECT, 2, 0)
ade0: 3b 0a 20 20 20 20 20 20 6a 73 6f 6e 50 61 72 73  ;.      jsonPars
adf0: 65 41 64 64 4e 6f 64 65 28 70 50 61 72 73 65 2c  eAddNode(pParse,
ae00: 20 4a 53 4f 4e 5f 53 54 52 49 4e 47 2c 20 6e 4b   JSON_STRING, nK
ae10: 65 79 2c 20 7a 4b 65 79 29 3b 0a 20 20 20 20 20  ey, zKey);.     
ae20: 20 69 50 61 74 63 68 20 3d 20 6a 73 6f 6e 50 61   iPatch = jsonPa
ae30: 72 73 65 41 64 64 4e 6f 64 65 28 70 50 61 72 73  rseAddNode(pPars
ae40: 65 2c 20 4a 53 4f 4e 5f 54 52 55 45 2c 20 30 2c  e, JSON_TRUE, 0,
ae50: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
ae60: 50 61 72 73 65 2d 3e 6f 6f 6d 20 29 20 72 65 74  Parse->oom ) ret
ae70: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 6a 73 6f  urn 0;.      jso
ae80: 6e 52 65 6d 6f 76 65 41 6c 6c 4e 75 6c 6c 73 28  nRemoveAllNulls(
ae90: 70 50 61 74 63 68 29 3b 0a 20 20 20 20 20 20 70  pPatch);.      p
aea0: 54 61 72 67 65 74 20 3d 20 26 70 50 61 72 73 65  Target = &pParse
aeb0: 2d 3e 61 4e 6f 64 65 5b 69 54 61 72 67 65 74 5d  ->aNode[iTarget]
aec0: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
aed0: 61 4e 6f 64 65 5b 69 52 6f 6f 74 5d 2e 6a 6e 46  aNode[iRoot].jnF
aee0: 6c 61 67 73 20 7c 3d 20 4a 4e 4f 44 45 5f 41 50  lags |= JNODE_AP
aef0: 50 45 4e 44 3b 0a 20 20 20 20 20 20 70 50 61 72  PEND;.      pPar
af00: 73 65 2d 3e 61 4e 6f 64 65 5b 69 52 6f 6f 74 5d  se->aNode[iRoot]
af10: 2e 75 2e 69 41 70 70 65 6e 64 20 3d 20 69 53 74  .u.iAppend = iSt
af20: 61 72 74 20 2d 20 69 52 6f 6f 74 3b 0a 20 20 20  art - iRoot;.   
af30: 20 20 20 69 52 6f 6f 74 20 3d 20 69 53 74 61 72     iRoot = iStar
af40: 74 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  t;.      pParse-
af50: 3e 61 4e 6f 64 65 5b 69 50 61 74 63 68 5d 2e 6a  >aNode[iPatch].j
af60: 6e 46 6c 61 67 73 20 7c 3d 20 4a 4e 4f 44 45 5f  nFlags |= JNODE_
af70: 50 41 54 43 48 3b 0a 20 20 20 20 20 20 70 50 61  PATCH;.      pPa
af80: 72 73 65 2d 3e 61 4e 6f 64 65 5b 69 50 61 74 63  rse->aNode[iPatc
af90: 68 5d 2e 75 2e 70 50 61 74 63 68 20 3d 20 26 70  h].u.pPatch = &p
afa0: 50 61 74 63 68 5b 69 2b 31 5d 3b 0a 20 20 20 20  Patch[i+1];.    
afb0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
afc0: 54 61 72 67 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Target;.}../*.**
afd0: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
afe0: 6f 66 20 74 68 65 20 6a 73 6f 6e 5f 6d 65 72 67  of the json_merg
aff0: 65 70 61 74 63 68 28 4a 53 4f 4e 31 2c 4a 53 4f  epatch(JSON1,JSO
b000: 4e 32 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 52  N2) function.  R
b010: 65 74 75 72 6e 20 61 20 4a 53 4f 4e 0a 2a 2a 20  eturn a JSON.** 
b020: 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73 20 74  object that is t
b030: 68 65 20 72 65 73 75 6c 74 20 6f 66 20 72 75 6e  he result of run
b040: 6e 69 6e 67 20 74 68 65 20 52 46 43 20 37 33 39  ning the RFC 739
b050: 36 20 4d 65 72 67 65 50 61 74 63 68 28 29 20 61  6 MergePatch() a
b060: 6c 67 6f 72 69 74 68 6d 0a 2a 2a 20 6f 6e 20 74  lgorithm.** on t
b070: 68 65 20 74 77 6f 20 61 72 67 75 6d 65 6e 74 73  he two arguments
b080: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
b090: 20 6a 73 6f 6e 50 61 74 63 68 46 75 6e 63 28 0a   jsonPatchFunc(.
b0a0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
b0b0: 74 20 2a 63 74 78 2c 0a 20 20 69 6e 74 20 61 72  t *ctx,.  int ar
b0c0: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
b0d0: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
b0e0: 4a 73 6f 6e 50 61 72 73 65 20 78 3b 20 20 20 20  JsonParse x;    
b0f0: 20 2f 2a 20 54 68 65 20 4a 53 4f 4e 20 74 68 61   /* The JSON tha
b100: 74 20 69 73 20 62 65 69 6e 67 20 70 61 74 63 68  t is being patch
b110: 65 64 20 2a 2f 0a 20 20 4a 73 6f 6e 50 61 72 73  ed */.  JsonPars
b120: 65 20 79 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  e y;     /* The 
b130: 70 61 74 63 68 20 2a 2f 0a 20 20 4a 73 6f 6e 4e  patch */.  JsonN
b140: 6f 64 65 20 2a 70 52 65 73 75 6c 74 3b 20 20 20  ode *pResult;   
b150: 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66  /* The result of
b160: 20 74 68 65 20 6d 65 72 67 65 20 2a 2f 0a 0a 20   the merge */.. 
b170: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 61 72   UNUSED_PARAM(ar
b180: 67 63 29 3b 0a 20 20 69 66 28 20 6a 73 6f 6e 50  gc);.  if( jsonP
b190: 61 72 73 65 28 26 78 2c 20 63 74 78 2c 20 28 63  arse(&x, ctx, (c
b1a0: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
b1b0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
b1c0: 67 76 5b 30 5d 29 29 20 29 20 72 65 74 75 72 6e  gv[0])) ) return
b1d0: 3b 0a 20 20 69 66 28 20 6a 73 6f 6e 50 61 72 73  ;.  if( jsonPars
b1e0: 65 28 26 79 2c 20 63 74 78 2c 20 28 63 6f 6e 73  e(&y, ctx, (cons
b1f0: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
b200: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
b210: 31 5d 29 29 20 29 7b 0a 20 20 20 20 6a 73 6f 6e  1])) ){.    json
b220: 50 61 72 73 65 52 65 73 65 74 28 26 78 29 3b 0a  ParseReset(&x);.
b230: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
b240: 20 20 70 52 65 73 75 6c 74 20 3d 20 6a 73 6f 6e    pResult = json
b250: 4d 65 72 67 65 50 61 74 63 68 28 26 78 2c 20 30  MergePatch(&x, 0
b260: 2c 20 79 2e 61 4e 6f 64 65 29 3b 0a 20 20 61 73  , y.aNode);.  as
b270: 73 65 72 74 28 20 70 52 65 73 75 6c 74 21 3d 30  sert( pResult!=0
b280: 20 7c 7c 20 78 2e 6f 6f 6d 20 29 3b 0a 20 20 69   || x.oom );.  i
b290: 66 28 20 70 52 65 73 75 6c 74 20 29 7b 0a 20 20  f( pResult ){.  
b2a0: 20 20 6a 73 6f 6e 52 65 74 75 72 6e 4a 73 6f 6e    jsonReturnJson
b2b0: 28 70 52 65 73 75 6c 74 2c 20 63 74 78 2c 20 30  (pResult, ctx, 0
b2c0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
b2d0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
b2e0: 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 74 78 29 3b  rror_nomem(ctx);
b2f0: 0a 20 20 7d 0a 20 20 6a 73 6f 6e 50 61 72 73 65  .  }.  jsonParse
b300: 52 65 73 65 74 28 26 78 29 3b 0a 20 20 6a 73 6f  Reset(&x);.  jso
b310: 6e 50 61 72 73 65 52 65 73 65 74 28 26 79 29 3b  nParseReset(&y);
b320: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  .}.../*.** Imple
b330: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
b340: 20 6a 73 6f 6e 5f 6f 62 6a 65 63 74 28 4e 41 4d   json_object(NAM
b350: 45 2c 56 41 4c 55 45 2c 2e 2e 2e 29 20 66 75 6e  E,VALUE,...) fun
b360: 63 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61  ction.  Return a
b370: 20 4a 53 4f 4e 0a 2a 2a 20 6f 62 6a 65 63 74 20   JSON.** object 
b380: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c  that contains al
b390: 6c 20 6e 61 6d 65 2f 76 61 6c 75 65 20 67 69 76  l name/value giv
b3a0: 65 6e 20 69 6e 20 61 72 67 75 6d 65 6e 74 73 2e  en in arguments.
b3b0: 20 20 4f 72 20 69 66 20 61 6e 79 20 6e 61 6d 65    Or if any name
b3c0: 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 20 73 74 72  .** is not a str
b3d0: 69 6e 67 20 6f 72 20 69 66 20 61 6e 79 20 76 61  ing or if any va
b3e0: 6c 75 65 20 69 73 20 61 20 42 4c 4f 42 2c 20 74  lue is a BLOB, t
b3f0: 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  hrow an error..*
b400: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73  /.static void js
b410: 6f 6e 4f 62 6a 65 63 74 46 75 6e 63 28 0a 20 20  onObjectFunc(.  
b420: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
b430: 2a 63 74 78 2c 0a 20 20 69 6e 74 20 61 72 67 63  *ctx,.  int argc
b440: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
b450: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e  e **argv.){.  in
b460: 74 20 69 3b 0a 20 20 4a 73 6f 6e 53 74 72 69 6e  t i;.  JsonStrin
b470: 67 20 6a 78 3b 0a 20 20 63 6f 6e 73 74 20 63 68  g jx;.  const ch
b480: 61 72 20 2a 7a 3b 0a 20 20 75 33 32 20 6e 3b 0a  ar *z;.  u32 n;.
b490: 0a 20 20 69 66 28 20 61 72 67 63 26 31 20 29 7b  .  if( argc&1 ){
b4a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
b4b0: 75 6c 74 5f 65 72 72 6f 72 28 63 74 78 2c 20 22  ult_error(ctx, "
b4c0: 6a 73 6f 6e 5f 6f 62 6a 65 63 74 28 29 20 72 65  json_object() re
b4d0: 71 75 69 72 65 73 20 61 6e 20 65 76 65 6e 20 6e  quires an even n
b4e0: 75 6d 62 65 72 20 22 0a 20 20 20 20 20 20 20 20  umber ".        
b4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b500: 20 20 20 20 20 20 20 20 20 20 22 6f 66 20 61 72            "of ar
b510: 67 75 6d 65 6e 74 73 22 2c 20 2d 31 29 3b 0a 20  guments", -1);. 
b520: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
b530: 20 6a 73 6f 6e 49 6e 69 74 28 26 6a 78 2c 20 63   jsonInit(&jx, c
b540: 74 78 29 3b 0a 20 20 6a 73 6f 6e 41 70 70 65 6e  tx);.  jsonAppen
b550: 64 43 68 61 72 28 26 6a 78 2c 20 27 7b 27 29 3b  dChar(&jx, '{');
b560: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72  .  for(i=0; i<ar
b570: 67 63 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 69  gc; i+=2){.    i
b580: 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  f( sqlite3_value
b590: 5f 74 79 70 65 28 61 72 67 76 5b 69 5d 29 21 3d  _type(argv[i])!=
b5a0: 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20  SQLITE_TEXT ){. 
b5b0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
b5c0: 75 6c 74 5f 65 72 72 6f 72 28 63 74 78 2c 20 22  ult_error(ctx, "
b5d0: 6a 73 6f 6e 5f 6f 62 6a 65 63 74 28 29 20 6c 61  json_object() la
b5e0: 62 65 6c 73 20 6d 75 73 74 20 62 65 20 54 45 58  bels must be TEX
b5f0: 54 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 6a  T", -1);.      j
b600: 73 6f 6e 52 65 73 65 74 28 26 6a 78 29 3b 0a 20  sonReset(&jx);. 
b610: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
b620: 20 7d 0a 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e   }.    jsonAppen
b630: 64 53 65 70 61 72 61 74 6f 72 28 26 6a 78 29 3b  dSeparator(&jx);
b640: 0a 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20  .    z = (const 
b650: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
b660: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 69 5d  lue_text(argv[i]
b670: 29 3b 0a 20 20 20 20 6e 20 3d 20 28 75 33 32 29  );.    n = (u32)
b680: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
b690: 74 65 73 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20  tes(argv[i]);.  
b6a0: 20 20 6a 73 6f 6e 41 70 70 65 6e 64 53 74 72 69    jsonAppendStri
b6b0: 6e 67 28 26 6a 78 2c 20 7a 2c 20 6e 29 3b 0a 20  ng(&jx, z, n);. 
b6c0: 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61     jsonAppendCha
b6d0: 72 28 26 6a 78 2c 20 27 3a 27 29 3b 0a 20 20 20  r(&jx, ':');.   
b6e0: 20 6a 73 6f 6e 41 70 70 65 6e 64 56 61 6c 75 65   jsonAppendValue
b6f0: 28 26 6a 78 2c 20 61 72 67 76 5b 69 2b 31 5d 29  (&jx, argv[i+1])
b700: 3b 0a 20 20 7d 0a 20 20 6a 73 6f 6e 41 70 70 65  ;.  }.  jsonAppe
b710: 6e 64 43 68 61 72 28 26 6a 78 2c 20 27 7d 27 29  ndChar(&jx, '}')
b720: 3b 0a 20 20 6a 73 6f 6e 52 65 73 75 6c 74 28 26  ;.  jsonResult(&
b730: 6a 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  jx);.  sqlite3_r
b740: 65 73 75 6c 74 5f 73 75 62 74 79 70 65 28 63 74  esult_subtype(ct
b750: 78 2c 20 4a 53 4f 4e 5f 53 55 42 54 59 50 45 29  x, JSON_SUBTYPE)
b760: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 6a 73 6f 6e  ;.}.../*.** json
b770: 5f 72 65 6d 6f 76 65 28 4a 53 4f 4e 2c 20 50 41  _remove(JSON, PA
b780: 54 48 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 52  TH, ...).**.** R
b790: 65 6d 6f 76 65 20 74 68 65 20 6e 61 6d 65 64 20  emove the named 
b7a0: 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 20 4a 53  elements from JS
b7b0: 4f 4e 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  ON and return th
b7c0: 65 20 72 65 73 75 6c 74 2e 20 20 6d 61 6c 66 6f  e result.  malfo
b7d0: 72 6d 65 64 0a 2a 2a 20 4a 53 4f 4e 20 6f 72 20  rmed.** JSON or 
b7e0: 50 41 54 48 20 61 72 67 75 6d 65 6e 74 73 20 72  PATH arguments r
b7f0: 65 73 75 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f  esult in an erro
b800: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
b810: 64 20 6a 73 6f 6e 52 65 6d 6f 76 65 46 75 6e 63  d jsonRemoveFunc
b820: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
b830: 65 78 74 20 2a 63 74 78 2c 0a 20 20 69 6e 74 20  ext *ctx,.  int 
b840: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
b850: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
b860: 20 20 4a 73 6f 6e 50 61 72 73 65 20 78 3b 20 20    JsonParse x;  
b870: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
b880: 61 72 73 65 20 2a 2f 0a 20 20 4a 73 6f 6e 4e 6f  arse */.  JsonNo
b890: 64 65 20 2a 70 4e 6f 64 65 3b 0a 20 20 63 6f 6e  de *pNode;.  con
b8a0: 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 3b 0a  st char *zPath;.
b8b0: 20 20 75 33 32 20 69 3b 0a 0a 20 20 69 66 28 20    u32 i;..  if( 
b8c0: 61 72 67 63 3c 31 20 29 20 72 65 74 75 72 6e 3b  argc<1 ) return;
b8d0: 0a 20 20 69 66 28 20 6a 73 6f 6e 50 61 72 73 65  .  if( jsonParse
b8e0: 28 26 78 2c 20 63 74 78 2c 20 28 63 6f 6e 73 74  (&x, ctx, (const
b8f0: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
b900: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
b910: 5d 29 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ])) ) return;.  
b920: 61 73 73 65 72 74 28 20 78 2e 6e 4e 6f 64 65 20  assert( x.nNode 
b930: 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  );.  for(i=1; i<
b940: 28 75 33 32 29 61 72 67 63 3b 20 69 2b 2b 29 7b  (u32)argc; i++){
b950: 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 28 63 6f  .    zPath = (co
b960: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
b970: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
b980: 76 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a  v[i]);.    if( z
b990: 50 61 74 68 3d 3d 30 20 29 20 67 6f 74 6f 20 72  Path==0 ) goto r
b9a0: 65 6d 6f 76 65 5f 64 6f 6e 65 3b 0a 20 20 20 20  emove_done;.    
b9b0: 70 4e 6f 64 65 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b  pNode = jsonLook
b9c0: 75 70 28 26 78 2c 20 7a 50 61 74 68 2c 20 30 2c  up(&x, zPath, 0,
b9d0: 20 63 74 78 29 3b 0a 20 20 20 20 69 66 28 20 78   ctx);.    if( x
b9e0: 2e 6e 45 72 72 20 29 20 67 6f 74 6f 20 72 65 6d  .nErr ) goto rem
b9f0: 6f 76 65 5f 64 6f 6e 65 3b 0a 20 20 20 20 69 66  ove_done;.    if
ba00: 28 20 70 4e 6f 64 65 20 29 20 70 4e 6f 64 65 2d  ( pNode ) pNode-
ba10: 3e 6a 6e 46 6c 61 67 73 20 7c 3d 20 4a 4e 4f 44  >jnFlags |= JNOD
ba20: 45 5f 52 45 4d 4f 56 45 3b 0a 20 20 7d 0a 20 20  E_REMOVE;.  }.  
ba30: 69 66 28 20 28 78 2e 61 4e 6f 64 65 5b 30 5d 2e  if( (x.aNode[0].
ba40: 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f  jnFlags & JNODE_
ba50: 52 45 4d 4f 56 45 29 3d 3d 30 20 29 7b 0a 20 20  REMOVE)==0 ){.  
ba60: 20 20 6a 73 6f 6e 52 65 74 75 72 6e 4a 73 6f 6e    jsonReturnJson
ba70: 28 78 2e 61 4e 6f 64 65 2c 20 63 74 78 2c 20 30  (x.aNode, ctx, 0
ba80: 29 3b 0a 20 20 7d 0a 72 65 6d 6f 76 65 5f 64 6f  );.  }.remove_do
ba90: 6e 65 3a 0a 20 20 6a 73 6f 6e 50 61 72 73 65 52  ne:.  jsonParseR
baa0: 65 73 65 74 28 26 78 29 3b 0a 7d 0a 0a 2f 2a 0a  eset(&x);.}../*.
bab0: 2a 2a 20 6a 73 6f 6e 5f 72 65 70 6c 61 63 65 28  ** json_replace(
bac0: 4a 53 4f 4e 2c 20 50 41 54 48 2c 20 56 41 4c 55  JSON, PATH, VALU
bad0: 45 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 52 65  E, ...).**.** Re
bae0: 70 6c 61 63 65 20 74 68 65 20 76 61 6c 75 65 20  place the value 
baf0: 61 74 20 50 41 54 48 20 77 69 74 68 20 56 41 4c  at PATH with VAL
bb00: 55 45 2e 20 20 49 66 20 50 41 54 48 20 64 6f 65  UE.  If PATH doe
bb10: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78  s not already ex
bb20: 69 73 74 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75  ist,.** this rou
bb30: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
bb40: 20 20 49 66 20 4a 53 4f 4e 20 6f 72 20 50 41 54    If JSON or PAT
bb50: 48 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 2c 20  H is malformed, 
bb60: 74 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 2e 0a  throw an error..
bb70: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a  */.static void j
bb80: 73 6f 6e 52 65 70 6c 61 63 65 46 75 6e 63 28 0a  sonReplaceFunc(.
bb90: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
bba0: 74 20 2a 63 74 78 2c 0a 20 20 69 6e 74 20 61 72  t *ctx,.  int ar
bbb0: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
bbc0: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
bbd0: 4a 73 6f 6e 50 61 72 73 65 20 78 3b 20 20 20 20  JsonParse x;    
bbe0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
bbf0: 73 65 20 2a 2f 0a 20 20 4a 73 6f 6e 4e 6f 64 65  se */.  JsonNode
bc00: 20 2a 70 4e 6f 64 65 3b 0a 20 20 63 6f 6e 73 74   *pNode;.  const
bc10: 20 63 68 61 72 20 2a 7a 50 61 74 68 3b 0a 20 20   char *zPath;.  
bc20: 75 33 32 20 69 3b 0a 0a 20 20 69 66 28 20 61 72  u32 i;..  if( ar
bc30: 67 63 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20  gc<1 ) return;. 
bc40: 20 69 66 28 20 28 61 72 67 63 26 31 29 3d 3d 30   if( (argc&1)==0
bc50: 20 29 20 7b 0a 20 20 20 20 6a 73 6f 6e 57 72 6f   ) {.    jsonWro
bc60: 6e 67 4e 75 6d 41 72 67 73 28 63 74 78 2c 20 22  ngNumArgs(ctx, "
bc70: 72 65 70 6c 61 63 65 22 29 3b 0a 20 20 20 20 72  replace");.    r
bc80: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
bc90: 20 6a 73 6f 6e 50 61 72 73 65 28 26 78 2c 20 63   jsonParse(&x, c
bca0: 74 78 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  tx, (const char*
bcb0: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
bcc0: 65 78 74 28 61 72 67 76 5b 30 5d 29 29 20 29 20  ext(argv[0])) ) 
bcd0: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
bce0: 28 20 78 2e 6e 4e 6f 64 65 20 29 3b 0a 20 20 66  ( x.nNode );.  f
bcf0: 6f 72 28 69 3d 31 3b 20 69 3c 28 75 33 32 29 61  or(i=1; i<(u32)a
bd00: 72 67 63 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20  rgc; i+=2){.    
bd10: 7a 50 61 74 68 20 3d 20 28 63 6f 6e 73 74 20 63  zPath = (const c
bd20: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
bd30: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 69 5d 29  ue_text(argv[i])
bd40: 3b 0a 20 20 20 20 70 4e 6f 64 65 20 3d 20 6a 73  ;.    pNode = js
bd50: 6f 6e 4c 6f 6f 6b 75 70 28 26 78 2c 20 7a 50 61  onLookup(&x, zPa
bd60: 74 68 2c 20 30 2c 20 63 74 78 29 3b 0a 20 20 20  th, 0, ctx);.   
bd70: 20 69 66 28 20 78 2e 6e 45 72 72 20 29 20 67 6f   if( x.nErr ) go
bd80: 74 6f 20 72 65 70 6c 61 63 65 5f 65 72 72 3b 0a  to replace_err;.
bd90: 20 20 20 20 69 66 28 20 70 4e 6f 64 65 20 29 7b      if( pNode ){
bda0: 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 6a 6e  .      pNode->jn
bdb0: 46 6c 61 67 73 20 7c 3d 20 28 75 38 29 4a 4e 4f  Flags |= (u8)JNO
bdc0: 44 45 5f 52 45 50 4c 41 43 45 3b 0a 20 20 20 20  DE_REPLACE;.    
bdd0: 20 20 70 4e 6f 64 65 2d 3e 75 2e 69 52 65 70 6c    pNode->u.iRepl
bde0: 61 63 65 20 3d 20 69 20 2b 20 31 3b 0a 20 20 20  ace = i + 1;.   
bdf0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 78 2e 61   }.  }.  if( x.a
be00: 4e 6f 64 65 5b 30 5d 2e 6a 6e 46 6c 61 67 73 20  Node[0].jnFlags 
be10: 26 20 4a 4e 4f 44 45 5f 52 45 50 4c 41 43 45 20  & JNODE_REPLACE 
be20: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
be30: 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 74 78 2c  esult_value(ctx,
be40: 20 61 72 67 76 5b 78 2e 61 4e 6f 64 65 5b 30 5d   argv[x.aNode[0]
be50: 2e 75 2e 69 52 65 70 6c 61 63 65 5d 29 3b 0a 20  .u.iReplace]);. 
be60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6a 73 6f 6e   }else{.    json
be70: 52 65 74 75 72 6e 4a 73 6f 6e 28 78 2e 61 4e 6f  ReturnJson(x.aNo
be80: 64 65 2c 20 63 74 78 2c 20 61 72 67 76 29 3b 0a  de, ctx, argv);.
be90: 20 20 7d 0a 72 65 70 6c 61 63 65 5f 65 72 72 3a    }.replace_err:
bea0: 0a 20 20 6a 73 6f 6e 50 61 72 73 65 52 65 73 65  .  jsonParseRese
beb0: 74 28 26 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t(&x);.}../*.** 
bec0: 6a 73 6f 6e 5f 73 65 74 28 4a 53 4f 4e 2c 20 50  json_set(JSON, P
bed0: 41 54 48 2c 20 56 41 4c 55 45 2c 20 2e 2e 2e 29  ATH, VALUE, ...)
bee0: 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76  .**.** Set the v
bef0: 61 6c 75 65 20 61 74 20 50 41 54 48 20 74 6f 20  alue at PATH to 
bf00: 56 41 4c 55 45 2e 20 20 43 72 65 61 74 65 20 74  VALUE.  Create t
bf10: 68 65 20 50 41 54 48 20 69 66 20 69 74 20 64 6f  he PATH if it do
bf20: 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a  es not already.*
bf30: 2a 20 65 78 69 73 74 2e 20 20 4f 76 65 72 77 72  * exist.  Overwr
bf40: 69 74 65 20 65 78 69 73 74 69 6e 67 20 76 61 6c  ite existing val
bf50: 75 65 73 20 74 68 61 74 20 64 6f 20 65 78 69 73  ues that do exis
bf60: 74 2e 0a 2a 2a 20 49 66 20 4a 53 4f 4e 20 6f 72  t..** If JSON or
bf70: 20 50 41 54 48 20 69 73 20 6d 61 6c 66 6f 72 6d   PATH is malform
bf80: 65 64 2c 20 74 68 72 6f 77 20 61 6e 20 65 72 72  ed, throw an err
bf90: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 6a 73 6f 6e 5f 69  or..**.** json_i
bfa0: 6e 73 65 72 74 28 4a 53 4f 4e 2c 20 50 41 54 48  nsert(JSON, PATH
bfb0: 2c 20 56 41 4c 55 45 2c 20 2e 2e 2e 29 0a 2a 2a  , VALUE, ...).**
bfc0: 0a 2a 2a 20 43 72 65 61 74 65 20 50 41 54 48 20  .** Create PATH 
bfd0: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69  and initialize i
bfe0: 74 20 74 6f 20 56 41 4c 55 45 2e 20 20 49 66 20  t to VALUE.  If 
bff0: 50 41 54 48 20 61 6c 72 65 61 64 79 20 65 78 69  PATH already exi
c000: 73 74 73 2c 20 74 68 69 73 0a 2a 2a 20 72 6f 75  sts, this.** rou
c010: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
c020: 20 20 49 66 20 4a 53 4f 4e 20 6f 72 20 50 41 54    If JSON or PAT
c030: 48 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 2c 20  H is malformed, 
c040: 74 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 2e 0a  throw an error..
c050: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a  */.static void j
c060: 73 6f 6e 53 65 74 46 75 6e 63 28 0a 20 20 73 71  sonSetFunc(.  sq
c070: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
c080: 74 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  tx,.  int argc,.
c090: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
c0a0: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e  **argv.){.  Json
c0b0: 50 61 72 73 65 20 78 3b 20 20 20 20 20 20 20 20  Parse x;        
c0c0: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 20 2a    /* The parse *
c0d0: 2f 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e  /.  JsonNode *pN
c0e0: 6f 64 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ode;.  const cha
c0f0: 72 20 2a 7a 50 61 74 68 3b 0a 20 20 75 33 32 20  r *zPath;.  u32 
c100: 69 3b 0a 20 20 69 6e 74 20 62 41 70 6e 64 3b 0a  i;.  int bApnd;.
c110: 20 20 69 6e 74 20 62 49 73 53 65 74 20 3d 20 2a    int bIsSet = *
c120: 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 5f 75 73  (int*)sqlite3_us
c130: 65 72 5f 64 61 74 61 28 63 74 78 29 3b 0a 0a 20  er_data(ctx);.. 
c140: 20 69 66 28 20 61 72 67 63 3c 31 20 29 20 72 65   if( argc<1 ) re
c150: 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 61 72 67  turn;.  if( (arg
c160: 63 26 31 29 3d 3d 30 20 29 20 7b 0a 20 20 20 20  c&1)==0 ) {.    
c170: 6a 73 6f 6e 57 72 6f 6e 67 4e 75 6d 41 72 67 73  jsonWrongNumArgs
c180: 28 63 74 78 2c 20 62 49 73 53 65 74 20 3f 20 22  (ctx, bIsSet ? "
c190: 73 65 74 22 20 3a 20 22 69 6e 73 65 72 74 22 29  set" : "insert")
c1a0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
c1b0: 7d 0a 20 20 69 66 28 20 6a 73 6f 6e 50 61 72 73  }.  if( jsonPars
c1c0: 65 28 26 78 2c 20 63 74 78 2c 20 28 63 6f 6e 73  e(&x, ctx, (cons
c1d0: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
c1e0: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
c1f0: 30 5d 29 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  0])) ) return;. 
c200: 20 61 73 73 65 72 74 28 20 78 2e 6e 4e 6f 64 65   assert( x.nNode
c210: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69   );.  for(i=1; i
c220: 3c 28 75 33 32 29 61 72 67 63 3b 20 69 2b 3d 32  <(u32)argc; i+=2
c230: 29 7b 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 28  ){.    zPath = (
c240: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
c250: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
c260: 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 62 41 70  rgv[i]);.    bAp
c270: 6e 64 20 3d 20 30 3b 0a 20 20 20 20 70 4e 6f 64  nd = 0;.    pNod
c280: 65 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 28 26  e = jsonLookup(&
c290: 78 2c 20 7a 50 61 74 68 2c 20 26 62 41 70 6e 64  x, zPath, &bApnd
c2a0: 2c 20 63 74 78 29 3b 0a 20 20 20 20 69 66 28 20  , ctx);.    if( 
c2b0: 78 2e 6f 6f 6d 20 29 7b 0a 20 20 20 20 20 20 73  x.oom ){.      s
c2c0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
c2d0: 72 6f 72 5f 6e 6f 6d 65 6d 28 63 74 78 29 3b 0a  ror_nomem(ctx);.
c2e0: 20 20 20 20 20 20 67 6f 74 6f 20 6a 73 6f 6e 53        goto jsonS
c2f0: 65 74 44 6f 6e 65 3b 0a 20 20 20 20 7d 65 6c 73  etDone;.    }els
c300: 65 20 69 66 28 20 78 2e 6e 45 72 72 20 29 7b 0a  e if( x.nErr ){.
c310: 20 20 20 20 20 20 67 6f 74 6f 20 6a 73 6f 6e 53        goto jsonS
c320: 65 74 44 6f 6e 65 3b 0a 20 20 20 20 7d 65 6c 73  etDone;.    }els
c330: 65 20 69 66 28 20 70 4e 6f 64 65 20 26 26 20 28  e if( pNode && (
c340: 62 41 70 6e 64 20 7c 7c 20 62 49 73 53 65 74 29  bApnd || bIsSet)
c350: 20 29 7b 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d   ){.      pNode-
c360: 3e 6a 6e 46 6c 61 67 73 20 7c 3d 20 28 75 38 29  >jnFlags |= (u8)
c370: 4a 4e 4f 44 45 5f 52 45 50 4c 41 43 45 3b 0a 20  JNODE_REPLACE;. 
c380: 20 20 20 20 20 70 4e 6f 64 65 2d 3e 75 2e 69 52       pNode->u.iR
c390: 65 70 6c 61 63 65 20 3d 20 69 20 2b 20 31 3b 0a  eplace = i + 1;.
c3a0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
c3b0: 78 2e 61 4e 6f 64 65 5b 30 5d 2e 6a 6e 46 6c 61  x.aNode[0].jnFla
c3c0: 67 73 20 26 20 4a 4e 4f 44 45 5f 52 45 50 4c 41  gs & JNODE_REPLA
c3d0: 43 45 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  CE ){.    sqlite
c3e0: 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63  3_result_value(c
c3f0: 74 78 2c 20 61 72 67 76 5b 78 2e 61 4e 6f 64 65  tx, argv[x.aNode
c400: 5b 30 5d 2e 75 2e 69 52 65 70 6c 61 63 65 5d 29  [0].u.iReplace])
c410: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6a  ;.  }else{.    j
c420: 73 6f 6e 52 65 74 75 72 6e 4a 73 6f 6e 28 78 2e  sonReturnJson(x.
c430: 61 4e 6f 64 65 2c 20 63 74 78 2c 20 61 72 67 76  aNode, ctx, argv
c440: 29 3b 0a 20 20 7d 0a 6a 73 6f 6e 53 65 74 44 6f  );.  }.jsonSetDo
c450: 6e 65 3a 0a 20 20 6a 73 6f 6e 50 61 72 73 65 52  ne:.  jsonParseR
c460: 65 73 65 74 28 26 78 29 3b 0a 7d 0a 0a 2f 2a 0a  eset(&x);.}../*.
c470: 2a 2a 20 6a 73 6f 6e 5f 74 79 70 65 28 4a 53 4f  ** json_type(JSO
c480: 4e 29 0a 2a 2a 20 6a 73 6f 6e 5f 74 79 70 65 28  N).** json_type(
c490: 4a 53 4f 4e 2c 20 50 41 54 48 29 0a 2a 2a 0a 2a  JSON, PATH).**.*
c4a0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f 70  * Return the top
c4b0: 2d 6c 65 76 65 6c 20 22 74 79 70 65 22 20 6f 66  -level "type" of
c4c0: 20 61 20 4a 53 4f 4e 20 73 74 72 69 6e 67 2e 20   a JSON string. 
c4d0: 20 54 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 20   Throw an error 
c4e0: 69 66 0a 2a 2a 20 65 69 74 68 65 72 20 74 68 65  if.** either the
c4f0: 20 4a 53 4f 4e 20 6f 72 20 50 41 54 48 20 69 6e   JSON or PATH in
c500: 70 75 74 73 20 61 72 65 20 6e 6f 74 20 77 65 6c  puts are not wel
c510: 6c 2d 66 6f 72 6d 65 64 2e 0a 2a 2f 0a 73 74 61  l-formed..*/.sta
c520: 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 54 79 70  tic void jsonTyp
c530: 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  eFunc(.  sqlite3
c540: 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 0a 20  _context *ctx,. 
c550: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
c560: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
c570: 76 0a 29 7b 0a 20 20 4a 73 6f 6e 50 61 72 73 65  v.){.  JsonParse
c580: 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a   *p;          /*
c590: 20 54 68 65 20 70 61 72 73 65 20 2a 2f 0a 20 20   The parse */.  
c5a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
c5b0: 68 3b 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70  h;.  JsonNode *p
c5c0: 4e 6f 64 65 3b 0a 0a 20 20 70 20 3d 20 6a 73 6f  Node;..  p = jso
c5d0: 6e 50 61 72 73 65 43 61 63 68 65 64 28 63 74 78  nParseCached(ctx
c5e0: 2c 20 61 72 67 76 2c 20 63 74 78 29 3b 0a 20 20  , argv, ctx);.  
c5f0: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
c600: 6e 3b 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 32  n;.  if( argc==2
c610: 20 29 7b 0a 20 20 20 20 7a 50 61 74 68 20 3d 20   ){.    zPath = 
c620: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
c630: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
c640: 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 70 4e  argv[1]);.    pN
c650: 6f 64 65 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75 70  ode = jsonLookup
c660: 28 70 2c 20 7a 50 61 74 68 2c 20 30 2c 20 63 74  (p, zPath, 0, ct
c670: 78 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  x);.  }else{.   
c680: 20 70 4e 6f 64 65 20 3d 20 70 2d 3e 61 4e 6f 64   pNode = p->aNod
c690: 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 6f  e;.  }.  if( pNo
c6a0: 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  de ){.    sqlite
c6b0: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 74  3_result_text(ct
c6c0: 78 2c 20 6a 73 6f 6e 54 79 70 65 5b 70 4e 6f 64  x, jsonType[pNod
c6d0: 65 2d 3e 65 54 79 70 65 5d 2c 20 2d 31 2c 20 53  e->eType], -1, S
c6e0: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
c6f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 6a 73 6f 6e   }.}../*.** json
c700: 5f 76 61 6c 69 64 28 4a 53 4f 4e 29 0a 2a 2a 0a  _valid(JSON).**.
c710: 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20 4a  ** Return 1 if J
c720: 53 4f 4e 20 69 73 20 61 20 77 65 6c 6c 2d 66 6f  SON is a well-fo
c730: 72 6d 65 64 20 4a 53 4f 4e 20 73 74 72 69 6e 67  rmed JSON string
c740: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 52 46   according to RF
c750: 43 2d 37 31 35 39 2e 0a 2a 2a 20 52 65 74 75 72  C-7159..** Retur
c760: 6e 20 30 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  n 0 otherwise..*
c770: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73  /.static void js
c780: 6f 6e 56 61 6c 69 64 46 75 6e 63 28 0a 20 20 73  onValidFunc(.  s
c790: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
c7a0: 63 74 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ctx,.  int argc,
c7b0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
c7c0: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 4a 73 6f   **argv.){.  Jso
c7d0: 6e 50 61 72 73 65 20 2a 70 3b 20 20 20 20 20 20  nParse *p;      
c7e0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
c7f0: 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   */.  UNUSED_PAR
c800: 41 4d 28 61 72 67 63 29 3b 0a 20 20 70 20 3d 20  AM(argc);.  p = 
c810: 6a 73 6f 6e 50 61 72 73 65 43 61 63 68 65 64 28  jsonParseCached(
c820: 63 74 78 2c 20 61 72 67 76 2c 20 30 29 3b 0a 20  ctx, argv, 0);. 
c830: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
c840: 69 6e 74 28 63 74 78 2c 20 70 21 3d 30 29 3b 0a  int(ctx, p!=0);.
c850: 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }.../***********
c860: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c8a0: 2a 0a 2a 2a 20 41 67 67 72 65 67 61 74 65 20 53  *.** Aggregate S
c8b0: 51 4c 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c  QL function impl
c8c0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 2a 2a  ementations.****
c8d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c8e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c8f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c910: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
c920: 6a 73 6f 6e 5f 67 72 6f 75 70 5f 61 72 72 61 79  json_group_array
c930: 28 56 41 4c 55 45 29 0a 2a 2a 0a 2a 2a 20 52 65  (VALUE).**.** Re
c940: 74 75 72 6e 20 61 20 4a 53 4f 4e 20 61 72 72 61  turn a JSON arra
c950: 79 20 63 6f 6d 70 6f 73 65 64 20 6f 66 20 61 6c  y composed of al
c960: 6c 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20  l values in the 
c970: 61 67 67 72 65 67 61 74 65 2e 0a 2a 2f 0a 73 74  aggregate..*/.st
c980: 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 41 72  atic void jsonAr
c990: 72 61 79 53 74 65 70 28 0a 20 20 73 71 6c 69 74  rayStep(.  sqlit
c9a0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c  e3_context *ctx,
c9b0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
c9c0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
c9d0: 72 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e 53 74 72  rgv.){.  JsonStr
c9e0: 69 6e 67 20 2a 70 53 74 72 3b 0a 20 20 55 4e 55  ing *pStr;.  UNU
c9f0: 53 45 44 5f 50 41 52 41 4d 28 61 72 67 63 29 3b  SED_PARAM(argc);
ca00: 0a 20 20 70 53 74 72 20 3d 20 28 4a 73 6f 6e 53  .  pStr = (JsonS
ca10: 74 72 69 6e 67 2a 29 73 71 6c 69 74 65 33 5f 61  tring*)sqlite3_a
ca20: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
ca30: 28 63 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 53  (ctx, sizeof(*pS
ca40: 74 72 29 29 3b 0a 20 20 69 66 28 20 70 53 74 72  tr));.  if( pStr
ca50: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 74 72   ){.    if( pStr
ca60: 2d 3e 7a 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20  ->zBuf==0 ){.   
ca70: 20 20 20 6a 73 6f 6e 49 6e 69 74 28 70 53 74 72     jsonInit(pStr
ca80: 2c 20 63 74 78 29 3b 0a 20 20 20 20 20 20 6a 73  , ctx);.      js
ca90: 6f 6e 41 70 70 65 6e 64 43 68 61 72 28 70 53 74  onAppendChar(pSt
caa0: 72 2c 20 27 5b 27 29 3b 0a 20 20 20 20 7d 65 6c  r, '[');.    }el
cab0: 73 65 7b 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70  se{.      jsonAp
cac0: 70 65 6e 64 43 68 61 72 28 70 53 74 72 2c 20 27  pendChar(pStr, '
cad0: 2c 27 29 3b 0a 20 20 20 20 20 20 70 53 74 72 2d  ,');.      pStr-
cae0: 3e 70 43 74 78 20 3d 20 63 74 78 3b 0a 20 20 20  >pCtx = ctx;.   
caf0: 20 7d 0a 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e   }.    jsonAppen
cb00: 64 56 61 6c 75 65 28 70 53 74 72 2c 20 61 72 67  dValue(pStr, arg
cb10: 76 5b 30 5d 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  v[0]);.  }.}.sta
cb20: 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 41 72 72  tic void jsonArr
cb30: 61 79 43 6f 6d 70 75 74 65 28 73 71 6c 69 74 65  ayCompute(sqlite
cb40: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20  3_context *ctx, 
cb50: 69 6e 74 20 69 73 46 69 6e 61 6c 29 7b 0a 20 20  int isFinal){.  
cb60: 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70 53 74 72  JsonString *pStr
cb70: 3b 0a 20 20 70 53 74 72 20 3d 20 28 4a 73 6f 6e  ;.  pStr = (Json
cb80: 53 74 72 69 6e 67 2a 29 73 71 6c 69 74 65 33 5f  String*)sqlite3_
cb90: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
cba0: 74 28 63 74 78 2c 20 30 29 3b 0a 20 20 69 66 28  t(ctx, 0);.  if(
cbb0: 20 70 53 74 72 20 29 7b 0a 20 20 20 20 70 53 74   pStr ){.    pSt
cbc0: 72 2d 3e 70 43 74 78 20 3d 20 63 74 78 3b 0a 20  r->pCtx = ctx;. 
cbd0: 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61     jsonAppendCha
cbe0: 72 28 70 53 74 72 2c 20 27 5d 27 29 3b 0a 20 20  r(pStr, ']');.  
cbf0: 20 20 69 66 28 20 70 53 74 72 2d 3e 62 45 72 72    if( pStr->bErr
cc00: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 53   ){.      if( pS
cc10: 74 72 2d 3e 62 45 72 72 3d 3d 31 20 29 20 73 71  tr->bErr==1 ) sq
cc20: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
cc30: 6f 72 5f 6e 6f 6d 65 6d 28 63 74 78 29 3b 0a 20  or_nomem(ctx);. 
cc40: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74       assert( pSt
cc50: 72 2d 3e 62 53 74 61 74 69 63 20 29 3b 0a 20 20  r->bStatic );.  
cc60: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 46 69    }else if( isFi
cc70: 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  nal ){.      sql
cc80: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
cc90: 28 63 74 78 2c 20 70 53 74 72 2d 3e 7a 42 75 66  (ctx, pStr->zBuf
cca0: 2c 20 28 69 6e 74 29 70 53 74 72 2d 3e 6e 55 73  , (int)pStr->nUs
ccb0: 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed,.            
ccc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53                pS
ccd0: 74 72 2d 3e 62 53 74 61 74 69 63 20 3f 20 53 51  tr->bStatic ? SQ
cce0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 20 3a  LITE_TRANSIENT :
ccf0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a   sqlite3_free);.
cd00: 20 20 20 20 20 20 70 53 74 72 2d 3e 62 53 74 61        pStr->bSta
cd10: 74 69 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  tic = 1;.    }el
cd20: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
cd30: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 74  3_result_text(ct
cd40: 78 2c 20 70 53 74 72 2d 3e 7a 42 75 66 2c 20 28  x, pStr->zBuf, (
cd50: 69 6e 74 29 70 53 74 72 2d 3e 6e 55 73 65 64 2c  int)pStr->nUsed,
cd60: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
cd70: 54 29 3b 0a 20 20 20 20 20 20 70 53 74 72 2d 3e  T);.      pStr->
cd80: 6e 55 73 65 64 2d 2d 3b 0a 20 20 20 20 7d 0a 20  nUsed--;.    }. 
cd90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
cda0: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
cdb0: 63 74 78 2c 20 22 5b 5d 22 2c 20 32 2c 20 53 51  ctx, "[]", 2, SQ
cdc0: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
cdd0: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  }.  sqlite3_resu
cde0: 6c 74 5f 73 75 62 74 79 70 65 28 63 74 78 2c 20  lt_subtype(ctx, 
cdf0: 4a 53 4f 4e 5f 53 55 42 54 59 50 45 29 3b 0a 7d  JSON_SUBTYPE);.}
ce00: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f  .static void jso
ce10: 6e 41 72 72 61 79 56 61 6c 75 65 28 73 71 6c 69  nArrayValue(sqli
ce20: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78  te3_context *ctx
ce30: 29 7b 0a 20 20 6a 73 6f 6e 41 72 72 61 79 43 6f  ){.  jsonArrayCo
ce40: 6d 70 75 74 65 28 63 74 78 2c 20 30 29 3b 0a 7d  mpute(ctx, 0);.}
ce50: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f  .static void jso
ce60: 6e 41 72 72 61 79 46 69 6e 61 6c 28 73 71 6c 69  nArrayFinal(sqli
ce70: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78  te3_context *ctx
ce80: 29 7b 0a 20 20 6a 73 6f 6e 41 72 72 61 79 43 6f  ){.  jsonArrayCo
ce90: 6d 70 75 74 65 28 63 74 78 2c 20 31 29 3b 0a 7d  mpute(ctx, 1);.}
cea0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
ceb0: 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43  _OMIT_WINDOWFUNC
cec0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 74 68  ./*.** This meth
ced0: 6f 64 20 77 6f 72 6b 73 20 66 6f 72 20 62 6f 74  od works for bot
cee0: 68 20 6a 73 6f 6e 5f 67 72 6f 75 70 5f 61 72 72  h json_group_arr
cef0: 61 79 28 29 20 61 6e 64 20 6a 73 6f 6e 5f 67 72  ay() and json_gr
cf00: 6f 75 70 5f 6f 62 6a 65 63 74 28 29 2e 0a 2a 2a  oup_object()..**
cf10: 20 49 74 20 77 6f 72 6b 73 20 62 79 20 72 65 6d   It works by rem
cf20: 6f 76 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  oving the first 
cf30: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 67  element of the g
cf40: 72 6f 75 70 20 62 79 20 73 65 61 72 63 68 69 6e  roup by searchin
cf50: 67 20 66 6f 72 77 61 72 64 0a 2a 2a 20 74 6f 20  g forward.** to 
cf60: 74 68 65 20 66 69 72 73 74 20 63 6f 6d 6d 61 20  the first comma 
cf70: 28 22 2c 22 29 20 74 68 61 74 20 69 73 20 6e 6f  (",") that is no
cf80: 74 20 77 69 74 68 69 6e 20 61 20 73 74 72 69 6e  t within a strin
cf90: 67 20 61 6e 64 20 64 65 6c 65 74 69 6e 67 20 61  g and deleting a
cfa0: 6c 6c 0a 2a 2a 20 74 65 78 74 20 74 68 72 6f 75  ll.** text throu
cfb0: 67 68 20 74 68 61 74 20 63 6f 6d 6d 61 2e 0a 2a  gh that comma..*
cfc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73  /.static void js
cfd0: 6f 6e 47 72 6f 75 70 49 6e 76 65 72 73 65 28 0a  onGroupInverse(.
cfe0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
cff0: 74 20 2a 63 74 78 2c 0a 20 20 69 6e 74 20 61 72  t *ctx,.  int ar
d000: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
d010: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
d020: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 6e 53  int i;.  int inS
d030: 74 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  tr = 0;.  char *
d040: 7a 3b 0a 20 20 4a 73 6f 6e 53 74 72 69 6e 67 20  z;.  JsonString 
d050: 2a 70 53 74 72 3b 0a 20 20 55 4e 55 53 45 44 5f  *pStr;.  UNUSED_
d060: 50 41 52 41 4d 28 61 72 67 63 29 3b 0a 20 20 55  PARAM(argc);.  U
d070: 4e 55 53 45 44 5f 50 41 52 41 4d 28 61 72 67 76  NUSED_PARAM(argv
d080: 29 3b 0a 20 20 70 53 74 72 20 3d 20 28 4a 73 6f  );.  pStr = (Jso
d090: 6e 53 74 72 69 6e 67 2a 29 73 71 6c 69 74 65 33  nString*)sqlite3
d0a0: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
d0b0: 78 74 28 63 74 78 2c 20 30 29 3b 0a 23 69 66 64  xt(ctx, 0);.#ifd
d0c0: 65 66 20 4e 45 56 45 52 0a 20 20 2f 2a 20 70 53  ef NEVER.  /* pS
d0d0: 74 72 20 69 73 20 61 6c 77 61 79 73 20 6e 6f 6e  tr is always non
d0e0: 2d 4e 55 4c 4c 20 73 69 6e 63 65 20 6a 73 6f 6e  -NULL since json
d0f0: 41 72 72 61 79 53 74 65 70 28 29 20 6f 72 20 6a  ArrayStep() or j
d100: 73 6f 6e 4f 62 6a 65 63 74 53 74 65 70 28 29 20  sonObjectStep() 
d110: 77 69 6c 6c 0a 20 20 2a 2a 20 61 6c 77 61 79 73  will.  ** always
d120: 20 68 61 76 65 20 62 65 65 6e 20 63 61 6c 6c 65   have been calle
d130: 64 20 74 6f 20 69 6e 69 74 61 6c 69 7a 65 20 69  d to initalize i
d140: 74 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52  t */.  if( NEVER
d150: 28 21 70 53 74 72 29 20 29 20 72 65 74 75 72 6e  (!pStr) ) return
d160: 3b 0a 23 65 6e 64 69 66 0a 20 20 7a 20 3d 20 70  ;.#endif.  z = p
d170: 53 74 72 2d 3e 7a 42 75 66 3b 0a 20 20 66 6f 72  Str->zBuf;.  for
d180: 28 69 3d 31 3b 20 7a 5b 69 5d 21 3d 27 2c 27 20  (i=1; z[i]!=',' 
d190: 7c 7c 20 69 6e 53 74 72 3b 20 69 2b 2b 29 7b 0a  || inStr; i++){.
d1a0: 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 70 53      assert( i<pS
d1b0: 74 72 2d 3e 6e 55 73 65 64 20 29 3b 0a 20 20 20  tr->nUsed );.   
d1c0: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 22 27 20 29   if( z[i]=='"' )
d1d0: 7b 0a 20 20 20 20 20 20 69 6e 53 74 72 20 3d 20  {.      inStr = 
d1e0: 21 69 6e 53 74 72 3b 0a 20 20 20 20 7d 65 6c 73  !inStr;.    }els
d1f0: 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 5c 27  e if( z[i]=='\\'
d200: 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20   ){.      i++;. 
d210: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 53 74 72 2d     }.  }.  pStr-
d220: 3e 6e 55 73 65 64 20 2d 3d 20 69 3b 20 20 20 20  >nUsed -= i;    
d230: 20 20 0a 20 20 6d 65 6d 6d 6f 76 65 28 26 7a 5b    .  memmove(&z[
d240: 31 5d 2c 20 26 7a 5b 69 2b 31 5d 2c 20 28 73 69  1], &z[i+1], (si
d250: 7a 65 5f 74 29 70 53 74 72 2d 3e 6e 55 73 65 64  ze_t)pStr->nUsed
d260: 2d 31 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  -1);.}.#else.# d
d270: 65 66 69 6e 65 20 6a 73 6f 6e 47 72 6f 75 70 49  efine jsonGroupI
d280: 6e 76 65 72 73 65 20 30 0a 23 65 6e 64 69 66 0a  nverse 0.#endif.
d290: 0a 0a 2f 2a 0a 2a 2a 20 6a 73 6f 6e 5f 67 72 6f  ../*.** json_gro
d2a0: 75 70 5f 6f 62 6a 28 4e 41 4d 45 2c 56 41 4c 55  up_obj(NAME,VALU
d2b0: 45 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  E).**.** Return 
d2c0: 61 20 4a 53 4f 4e 20 6f 62 6a 65 63 74 20 63 6f  a JSON object co
d2d0: 6d 70 6f 73 65 64 20 6f 66 20 61 6c 6c 20 6e 61  mposed of all na
d2e0: 6d 65 73 20 61 6e 64 20 76 61 6c 75 65 73 20 69  mes and values i
d2f0: 6e 20 74 68 65 20 61 67 67 72 65 67 61 74 65 2e  n the aggregate.
d300: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
d310: 6a 73 6f 6e 4f 62 6a 65 63 74 53 74 65 70 28 0a  jsonObjectStep(.
d320: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
d330: 74 20 2a 63 74 78 2c 0a 20 20 69 6e 74 20 61 72  t *ctx,.  int ar
d340: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
d350: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
d360: 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70 53 74 72  JsonString *pStr
d370: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
d380: 7a 3b 0a 20 20 75 33 32 20 6e 3b 0a 20 20 55 4e  z;.  u32 n;.  UN
d390: 55 53 45 44 5f 50 41 52 41 4d 28 61 72 67 63 29  USED_PARAM(argc)
d3a0: 3b 0a 20 20 70 53 74 72 20 3d 20 28 4a 73 6f 6e  ;.  pStr = (Json
d3b0: 53 74 72 69 6e 67 2a 29 73 71 6c 69 74 65 33 5f  String*)sqlite3_
d3c0: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
d3d0: 74 28 63 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70  t(ctx, sizeof(*p
d3e0: 53 74 72 29 29 3b 0a 20 20 69 66 28 20 70 53 74  Str));.  if( pSt
d3f0: 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 74  r ){.    if( pSt
d400: 72 2d 3e 7a 42 75 66 3d 3d 30 20 29 7b 0a 20 20  r->zBuf==0 ){.  
d410: 20 20 20 20 6a 73 6f 6e 49 6e 69 74 28 70 53 74      jsonInit(pSt
d420: 72 2c 20 63 74 78 29 3b 0a 20 20 20 20 20 20 6a  r, ctx);.      j
d430: 73 6f 6e 41 70 70 65 6e 64 43 68 61 72 28 70 53  sonAppendChar(pS
d440: 74 72 2c 20 27 7b 27 29 3b 0a 20 20 20 20 7d 65  tr, '{');.    }e
d450: 6c 73 65 7b 0a 20 20 20 20 20 20 6a 73 6f 6e 41  lse{.      jsonA
d460: 70 70 65 6e 64 43 68 61 72 28 70 53 74 72 2c 20  ppendChar(pStr, 
d470: 27 2c 27 29 3b 0a 20 20 20 20 20 20 70 53 74 72  ',');.      pStr
d480: 2d 3e 70 43 74 78 20 3d 20 63 74 78 3b 0a 20 20  ->pCtx = ctx;.  
d490: 20 20 7d 0a 20 20 20 20 7a 20 3d 20 28 63 6f 6e    }.    z = (con
d4a0: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
d4b0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
d4c0: 5b 30 5d 29 3b 0a 20 20 20 20 6e 20 3d 20 28 75  [0]);.    n = (u
d4d0: 33 32 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  32)sqlite3_value
d4e0: 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b  _bytes(argv[0]);
d4f0: 0a 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 53  .    jsonAppendS
d500: 74 72 69 6e 67 28 70 53 74 72 2c 20 7a 2c 20 6e  tring(pStr, z, n
d510: 29 3b 0a 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e  );.    jsonAppen
d520: 64 43 68 61 72 28 70 53 74 72 2c 20 27 3a 27 29  dChar(pStr, ':')
d530: 3b 0a 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64  ;.    jsonAppend
d540: 56 61 6c 75 65 28 70 53 74 72 2c 20 61 72 67 76  Value(pStr, argv
d550: 5b 31 5d 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  [1]);.  }.}.stat
d560: 69 63 20 76 6f 69 64 20 6a 73 6f 6e 4f 62 6a 65  ic void jsonObje
d570: 63 74 43 6f 6d 70 75 74 65 28 73 71 6c 69 74 65  ctCompute(sqlite
d580: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20  3_context *ctx, 
d590: 69 6e 74 20 69 73 46 69 6e 61 6c 29 7b 0a 20 20  int isFinal){.  
d5a0: 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70 53 74 72  JsonString *pStr
d5b0: 3b 0a 20 20 70 53 74 72 20 3d 20 28 4a 73 6f 6e  ;.  pStr = (Json
d5c0: 53 74 72 69 6e 67 2a 29 73 71 6c 69 74 65 33 5f  String*)sqlite3_
d5d0: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
d5e0: 74 28 63 74 78 2c 20 30 29 3b 0a 20 20 69 66 28  t(ctx, 0);.  if(
d5f0: 20 70 53 74 72 20 29 7b 0a 20 20 20 20 6a 73 6f   pStr ){.    jso
d600: 6e 41 70 70 65 6e 64 43 68 61 72 28 70 53 74 72  nAppendChar(pStr
d610: 2c 20 27 7d 27 29 3b 0a 20 20 20 20 69 66 28 20  , '}');.    if( 
d620: 70 53 74 72 2d 3e 62 45 72 72 20 29 7b 0a 20 20  pStr->bErr ){.  
d630: 20 20 20 20 69 66 28 20 70 53 74 72 2d 3e 62 45      if( pStr->bE
d640: 72 72 3d 3d 31 20 29 20 73 71 6c 69 74 65 33 5f  rr==1 ) sqlite3_
d650: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d  result_error_nom
d660: 65 6d 28 63 74 78 29 3b 0a 20 20 20 20 20 20 61  em(ctx);.      a
d670: 73 73 65 72 74 28 20 70 53 74 72 2d 3e 62 53 74  ssert( pStr->bSt
d680: 61 74 69 63 20 29 3b 0a 20 20 20 20 7d 65 6c 73  atic );.    }els
d690: 65 20 69 66 28 20 69 73 46 69 6e 61 6c 20 29 7b  e if( isFinal ){
d6a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
d6b0: 65 73 75 6c 74 5f 74 65 78 74 28 63 74 78 2c 20  esult_text(ctx, 
d6c0: 70 53 74 72 2d 3e 7a 42 75 66 2c 20 28 69 6e 74  pStr->zBuf, (int
d6d0: 29 70 53 74 72 2d 3e 6e 55 73 65 64 2c 0a 20 20  )pStr->nUsed,.  
d6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6f0: 20 20 20 20 20 20 20 20 70 53 74 72 2d 3e 62 53          pStr->bS
d700: 74 61 74 69 63 20 3f 20 53 51 4c 49 54 45 5f 54  tatic ? SQLITE_T
d710: 52 41 4e 53 49 45 4e 54 20 3a 20 73 71 6c 69 74  RANSIENT : sqlit
d720: 65 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 20 20  e3_free);.      
d730: 70 53 74 72 2d 3e 62 53 74 61 74 69 63 20 3d 20  pStr->bStatic = 
d740: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
d750: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
d760: 6c 74 5f 74 65 78 74 28 63 74 78 2c 20 70 53 74  lt_text(ctx, pSt
d770: 72 2d 3e 7a 42 75 66 2c 20 28 69 6e 74 29 70 53  r->zBuf, (int)pS
d780: 74 72 2d 3e 6e 55 73 65 64 2c 20 53 51 4c 49 54  tr->nUsed, SQLIT
d790: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
d7a0: 20 20 20 20 70 53 74 72 2d 3e 6e 55 73 65 64 2d      pStr->nUsed-
d7b0: 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  -;.    }.  }else
d7c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
d7d0: 73 75 6c 74 5f 74 65 78 74 28 63 74 78 2c 20 22  sult_text(ctx, "
d7e0: 7b 7d 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 53  {}", 2, SQLITE_S
d7f0: 54 41 54 49 43 29 3b 0a 20 20 7d 0a 20 20 73 71  TATIC);.  }.  sq
d800: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 73 75 62  lite3_result_sub
d810: 74 79 70 65 28 63 74 78 2c 20 4a 53 4f 4e 5f 53  type(ctx, JSON_S
d820: 55 42 54 59 50 45 29 3b 0a 7d 0a 73 74 61 74 69  UBTYPE);.}.stati
d830: 63 20 76 6f 69 64 20 6a 73 6f 6e 4f 62 6a 65 63  c void jsonObjec
d840: 74 56 61 6c 75 65 28 73 71 6c 69 74 65 33 5f 63  tValue(sqlite3_c
d850: 6f 6e 74 65 78 74 20 2a 63 74 78 29 7b 0a 20 20  ontext *ctx){.  
d860: 6a 73 6f 6e 4f 62 6a 65 63 74 43 6f 6d 70 75 74  jsonObjectComput
d870: 65 28 63 74 78 2c 20 30 29 3b 0a 7d 0a 73 74 61  e(ctx, 0);.}.sta
d880: 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 4f 62 6a  tic void jsonObj
d890: 65 63 74 46 69 6e 61 6c 28 73 71 6c 69 74 65 33  ectFinal(sqlite3
d8a0: 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 29 7b 0a  _context *ctx){.
d8b0: 20 20 6a 73 6f 6e 4f 62 6a 65 63 74 43 6f 6d 70    jsonObjectComp
d8c0: 75 74 65 28 63 74 78 2c 20 31 29 3b 0a 7d 0a 0a  ute(ctx, 1);.}..
d8d0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
d8e0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
d8f0: 4c 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  LE./************
d900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d940: 0a 2a 2a 20 54 68 65 20 6a 73 6f 6e 5f 65 61 63  .** The json_eac
d950: 68 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 0a  h virtual table.
d960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d9a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 74 79  ************/.ty
d9b0: 70 65 64 65 66 20 73 74 72 75 63 74 20 4a 73 6f  pedef struct Jso
d9c0: 6e 45 61 63 68 43 75 72 73 6f 72 20 4a 73 6f 6e  nEachCursor Json
d9d0: 45 61 63 68 43 75 72 73 6f 72 3b 0a 73 74 72 75  EachCursor;.stru
d9e0: 63 74 20 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f  ct JsonEachCurso
d9f0: 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  r {.  sqlite3_vt
da00: 61 62 5f 63 75 72 73 6f 72 20 62 61 73 65 3b 20  ab_cursor base; 
da10: 20 2f 2a 20 42 61 73 65 20 63 6c 61 73 73 20 2d   /* Base class -
da20: 20 6d 75 73 74 20 62 65 20 66 69 72 73 74 20 2a   must be first *
da30: 2f 0a 20 20 75 33 32 20 69 52 6f 77 69 64 3b 20  /.  u32 iRowid; 
da40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
da50: 2a 20 54 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20  * The rowid */. 
da60: 20 75 33 32 20 69 42 65 67 69 6e 3b 20 20 20 20   u32 iBegin;    
da70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
da80: 68 65 20 66 69 72 73 74 20 6e 6f 64 65 20 6f 66  he first node of
da90: 20 74 68 65 20 73 63 61 6e 20 2a 2f 0a 20 20 75   the scan */.  u
daa0: 33 32 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  32 i;           
dab0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
dac0: 65 78 20 69 6e 20 73 50 61 72 73 65 2e 61 4e 6f  ex in sParse.aNo
dad0: 64 65 5b 5d 20 6f 66 20 63 75 72 72 65 6e 74 20  de[] of current 
dae0: 72 6f 77 20 2a 2f 0a 20 20 75 33 32 20 69 45 6e  row */.  u32 iEn
daf0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
db00: 20 20 20 20 2f 2a 20 45 4f 46 20 77 68 65 6e 20      /* EOF when 
db10: 69 20 65 71 75 61 6c 73 20 6f 72 20 65 78 63 65  i equals or exce
db20: 65 64 73 20 74 68 69 73 20 76 61 6c 75 65 20 2a  eds this value *
db30: 2f 0a 20 20 75 38 20 65 54 79 70 65 3b 20 20 20  /.  u8 eType;   
db40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
db50: 2a 20 54 79 70 65 20 6f 66 20 74 6f 70 2d 6c 65  * Type of top-le
db60: 76 65 6c 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20  vel element */. 
db70: 20 75 38 20 62 52 65 63 75 72 73 69 76 65 3b 20   u8 bRecursive; 
db80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
db90: 72 75 65 20 66 6f 72 20 6a 73 6f 6e 5f 74 72 65  rue for json_tre
dba0: 65 28 29 2e 20 20 46 61 6c 73 65 20 66 6f 72 20  e().  False for 
dbb0: 6a 73 6f 6e 5f 65 61 63 68 28 29 20 2a 2f 0a 20  json_each() */. 
dbc0: 20 63 68 61 72 20 2a 7a 4a 73 6f 6e 3b 20 20 20   char *zJson;   
dbd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
dbe0: 6e 70 75 74 20 4a 53 4f 4e 20 2a 2f 0a 20 20 63  nput JSON */.  c
dbf0: 68 61 72 20 2a 7a 52 6f 6f 74 3b 20 20 20 20 20  har *zRoot;     
dc00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74            /* Pat
dc10: 68 20 62 79 20 77 68 69 63 68 20 74 6f 20 66 69  h by which to fi
dc20: 6c 74 65 72 20 7a 4a 73 6f 6e 20 2a 2f 0a 20 20  lter zJson */.  
dc30: 4a 73 6f 6e 50 61 72 73 65 20 73 50 61 72 73 65  JsonParse sParse
dc40: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ;          /* Pa
dc50: 72 73 65 20 6f 66 20 74 68 65 20 69 6e 70 75 74  rse of the input
dc60: 20 4a 53 4f 4e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20   JSON */.};../* 
dc70: 43 6f 6e 73 74 72 75 63 74 6f 72 20 66 6f 72 20  Constructor for 
dc80: 74 68 65 20 6a 73 6f 6e 5f 65 61 63 68 20 76 69  the json_each vi
dc90: 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 73  rtual table */.s
dca0: 74 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e 45 61  tatic int jsonEa
dcb0: 63 68 43 6f 6e 6e 65 63 74 28 0a 20 20 73 71 6c  chConnect(.  sql
dcc0: 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64  ite3 *db,.  void
dcd0: 20 2a 70 41 75 78 2c 0a 20 20 69 6e 74 20 61 72   *pAux,.  int ar
dce0: 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  gc, const char *
dcf0: 63 6f 6e 73 74 2a 61 72 67 76 2c 0a 20 20 73 71  const*argv,.  sq
dd00: 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a 70 70 56  lite3_vtab **ppV
dd10: 74 61 62 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a  tab,.  char **pz
dd20: 45 72 72 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  Err.){.  sqlite3
dd30: 5f 76 74 61 62 20 2a 70 4e 65 77 3b 0a 20 20 69  _vtab *pNew;.  i
dd40: 6e 74 20 72 63 3b 0a 0a 2f 2a 20 43 6f 6c 75 6d  nt rc;../* Colum
dd50: 6e 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 23 64 65  n numbers */.#de
dd60: 66 69 6e 65 20 4a 45 41 43 48 5f 4b 45 59 20 20  fine JEACH_KEY  
dd70: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 4a 45 41     0.#define JEA
dd80: 43 48 5f 56 41 4c 55 45 20 20 20 31 0a 23 64 65  CH_VALUE   1.#de
dd90: 66 69 6e 65 20 4a 45 41 43 48 5f 54 59 50 45 20  fine JEACH_TYPE 
dda0: 20 20 20 32 0a 23 64 65 66 69 6e 65 20 4a 45 41     2.#define JEA
ddb0: 43 48 5f 41 54 4f 4d 20 20 20 20 33 0a 23 64 65  CH_ATOM    3.#de
ddc0: 66 69 6e 65 20 4a 45 41 43 48 5f 49 44 20 20 20  fine JEACH_ID   
ddd0: 20 20 20 34 0a 23 64 65 66 69 6e 65 20 4a 45 41     4.#define JEA
dde0: 43 48 5f 50 41 52 45 4e 54 20 20 35 0a 23 64 65  CH_PARENT  5.#de
ddf0: 66 69 6e 65 20 4a 45 41 43 48 5f 46 55 4c 4c 4b  fine JEACH_FULLK
de00: 45 59 20 36 0a 23 64 65 66 69 6e 65 20 4a 45 41  EY 6.#define JEA
de10: 43 48 5f 50 41 54 48 20 20 20 20 37 0a 2f 2a 20  CH_PATH    7./* 
de20: 54 68 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d  The xBestIndex m
de30: 65 74 68 6f 64 20 61 73 73 75 6d 65 73 20 74 68  ethod assumes th
de40: 61 74 20 74 68 65 20 4a 53 4f 4e 20 61 6e 64 20  at the JSON and 
de50: 52 4f 4f 54 20 63 6f 6c 75 6d 6e 73 20 61 72 65  ROOT columns are
de60: 0a 2a 2a 20 74 68 65 20 6c 61 73 74 20 74 77 6f  .** the last two
de70: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
de80: 74 61 62 6c 65 2e 20 20 53 68 6f 75 6c 64 20 74  table.  Should t
de90: 68 69 73 20 65 76 65 72 20 63 68 61 6e 67 65 73  his ever changes
dea0: 2c 20 62 65 0a 2a 2a 20 73 75 72 65 20 74 6f 20  , be.** sure to 
deb0: 75 70 64 61 74 65 20 74 68 65 20 78 42 65 73 74  update the xBest
dec0: 49 6e 64 65 78 20 6d 65 74 68 6f 64 2e 20 2a 2f  Index method. */
ded0: 0a 23 64 65 66 69 6e 65 20 4a 45 41 43 48 5f 4a  .#define JEACH_J
dee0: 53 4f 4e 20 20 20 20 38 0a 23 64 65 66 69 6e 65  SON    8.#define
def0: 20 4a 45 41 43 48 5f 52 4f 4f 54 20 20 20 20 39   JEACH_ROOT    9
df00: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
df10: 28 70 7a 45 72 72 29 3b 0a 20 20 55 4e 55 53 45  (pzErr);.  UNUSE
df20: 44 5f 50 41 52 41 4d 28 61 72 67 76 29 3b 0a 20  D_PARAM(argv);. 
df30: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 61 72   UNUSED_PARAM(ar
df40: 67 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  gc);.  UNUSED_PA
df50: 52 41 4d 28 70 41 75 78 29 3b 0a 20 20 72 63 20  RAM(pAux);.  rc 
df60: 3d 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72  = sqlite3_declar
df70: 65 5f 76 74 61 62 28 64 62 2c 20 0a 20 20 20 20  e_vtab(db, .    
df80: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 78   "CREATE TABLE x
df90: 28 6b 65 79 2c 76 61 6c 75 65 2c 74 79 70 65 2c  (key,value,type,
dfa0: 61 74 6f 6d 2c 69 64 2c 70 61 72 65 6e 74 2c 66  atom,id,parent,f
dfb0: 75 6c 6c 6b 65 79 2c 70 61 74 68 2c 22 0a 20 20  ullkey,path,".  
dfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfd0: 20 20 22 6a 73 6f 6e 20 48 49 44 44 45 4e 2c 72    "json HIDDEN,r
dfe0: 6f 6f 74 20 48 49 44 44 45 4e 29 22 29 3b 0a 20  oot HIDDEN)");. 
dff0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
e000: 4f 4b 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d  OK ){.    pNew =
e010: 20 2a 70 70 56 74 61 62 20 3d 20 73 71 6c 69 74   *ppVtab = sqlit
e020: 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
e030: 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 20 20  f(*pNew) );.    
e040: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
e050: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
e060: 4d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4e  M;.    memset(pN
e070: 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  ew, 0, sizeof(*p
e080: 4e 65 77 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74  New));.  }.  ret
e090: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 64 65  urn rc;.}../* de
e0a0: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 6a 73 6f  structor for jso
e0b0: 6e 5f 65 61 63 68 20 76 69 72 74 75 61 6c 20 74  n_each virtual t
e0c0: 61 62 6c 65 20 2a 2f 0a 73 74 61 74 69 63 20 69  able */.static i
e0d0: 6e 74 20 6a 73 6f 6e 45 61 63 68 44 69 73 63 6f  nt jsonEachDisco
e0e0: 6e 6e 65 63 74 28 73 71 6c 69 74 65 33 5f 76 74  nnect(sqlite3_vt
e0f0: 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 73 71  ab *pVtab){.  sq
e100: 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74 61 62  lite3_free(pVtab
e110: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
e120: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 63 6f 6e  TE_OK;.}../* con
e130: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 61 20 4a  structor for a J
e140: 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 20 6f 62  sonEachCursor ob
e150: 6a 65 63 74 20 66 6f 72 20 6a 73 6f 6e 5f 65 61  ject for json_ea
e160: 63 68 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20  ch(). */.static 
e170: 69 6e 74 20 6a 73 6f 6e 45 61 63 68 4f 70 65 6e  int jsonEachOpen
e180: 45 61 63 68 28 73 71 6c 69 74 65 33 5f 76 74 61  Each(sqlite3_vta
e190: 62 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 74  b *p, sqlite3_vt
e1a0: 61 62 5f 63 75 72 73 6f 72 20 2a 2a 70 70 43 75  ab_cursor **ppCu
e1b0: 72 73 6f 72 29 7b 0a 20 20 4a 73 6f 6e 45 61 63  rsor){.  JsonEac
e1c0: 68 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a  hCursor *pCur;..
e1d0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 70    UNUSED_PARAM(p
e1e0: 29 3b 0a 20 20 70 43 75 72 20 3d 20 73 71 6c 69  );.  pCur = sqli
e1f0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  te3_malloc( size
e200: 6f 66 28 2a 70 43 75 72 29 20 29 3b 0a 20 20 69  of(*pCur) );.  i
e210: 66 28 20 70 43 75 72 3d 3d 30 20 29 20 72 65 74  f( pCur==0 ) ret
e220: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
e230: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 75 72 2c  ;.  memset(pCur,
e240: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43 75 72   0, sizeof(*pCur
e250: 29 29 3b 0a 20 20 2a 70 70 43 75 72 73 6f 72 20  ));.  *ppCursor 
e260: 3d 20 26 70 43 75 72 2d 3e 62 61 73 65 3b 0a 20  = &pCur->base;. 
e270: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e280: 4b 3b 0a 7d 0a 0a 2f 2a 20 63 6f 6e 73 74 72 75  K;.}../* constru
e290: 63 74 6f 72 20 66 6f 72 20 61 20 4a 73 6f 6e 45  ctor for a JsonE
e2a0: 61 63 68 43 75 72 73 6f 72 20 6f 62 6a 65 63 74  achCursor object
e2b0: 20 66 6f 72 20 6a 73 6f 6e 5f 74 72 65 65 28 29   for json_tree()
e2c0: 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
e2d0: 6a 73 6f 6e 45 61 63 68 4f 70 65 6e 54 72 65 65  jsonEachOpenTree
e2e0: 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70  (sqlite3_vtab *p
e2f0: 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63  , sqlite3_vtab_c
e300: 75 72 73 6f 72 20 2a 2a 70 70 43 75 72 73 6f 72  ursor **ppCursor
e310: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 6a 73  ){.  int rc = js
e320: 6f 6e 45 61 63 68 4f 70 65 6e 45 61 63 68 28 70  onEachOpenEach(p
e330: 2c 20 70 70 43 75 72 73 6f 72 29 3b 0a 20 20 69  , ppCursor);.  i
e340: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
e350: 20 29 7b 0a 20 20 20 20 4a 73 6f 6e 45 61 63 68   ){.    JsonEach
e360: 43 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 28  Cursor *pCur = (
e370: 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 2a 29  JsonEachCursor*)
e380: 2a 70 70 43 75 72 73 6f 72 3b 0a 20 20 20 20 70  *ppCursor;.    p
e390: 43 75 72 2d 3e 62 52 65 63 75 72 73 69 76 65 20  Cur->bRecursive 
e3a0: 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
e3b0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 52 65 73 65  n rc;.}../* Rese
e3c0: 74 20 61 20 4a 73 6f 6e 45 61 63 68 43 75 72 73  t a JsonEachCurs
e3d0: 6f 72 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f  or back to its o
e3e0: 72 69 67 69 6e 61 6c 20 73 74 61 74 65 2e 20 20  riginal state.  
e3f0: 46 72 65 65 20 61 6e 79 20 6d 65 6d 6f 72 79 0a  Free any memory.
e400: 2a 2a 20 68 65 6c 64 2e 20 2a 2f 0a 73 74 61 74  ** held. */.stat
e410: 69 63 20 76 6f 69 64 20 6a 73 6f 6e 45 61 63 68  ic void jsonEach
e420: 43 75 72 73 6f 72 52 65 73 65 74 28 4a 73 6f 6e  CursorReset(Json
e430: 45 61 63 68 43 75 72 73 6f 72 20 2a 70 29 7b 0a  EachCursor *p){.
e440: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
e450: 2d 3e 7a 4a 73 6f 6e 29 3b 0a 20 20 73 71 6c 69  ->zJson);.  sqli
e460: 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 52 6f 6f  te3_free(p->zRoo
e470: 74 29 3b 0a 20 20 6a 73 6f 6e 50 61 72 73 65 52  t);.  jsonParseR
e480: 65 73 65 74 28 26 70 2d 3e 73 50 61 72 73 65 29  eset(&p->sParse)
e490: 3b 0a 20 20 70 2d 3e 69 52 6f 77 69 64 20 3d 20  ;.  p->iRowid = 
e4a0: 30 3b 0a 20 20 70 2d 3e 69 20 3d 20 30 3b 0a 20  0;.  p->i = 0;. 
e4b0: 20 70 2d 3e 69 45 6e 64 20 3d 20 30 3b 0a 20 20   p->iEnd = 0;.  
e4c0: 70 2d 3e 65 54 79 70 65 20 3d 20 30 3b 0a 20 20  p->eType = 0;.  
e4d0: 70 2d 3e 7a 4a 73 6f 6e 20 3d 20 30 3b 0a 20 20  p->zJson = 0;.  
e4e0: 70 2d 3e 7a 52 6f 6f 74 20 3d 20 30 3b 0a 7d 0a  p->zRoot = 0;.}.
e4f0: 0a 2f 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66  ./* Destructor f
e500: 6f 72 20 61 20 6a 73 6f 6e 45 61 63 68 43 75 72  or a jsonEachCur
e510: 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 73 74  sor object */.st
e520: 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e 45 61 63  atic int jsonEac
e530: 68 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76  hClose(sqlite3_v
e540: 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 29  tab_cursor *cur)
e550: 7b 0a 20 20 4a 73 6f 6e 45 61 63 68 43 75 72 73  {.  JsonEachCurs
e560: 6f 72 20 2a 70 20 3d 20 28 4a 73 6f 6e 45 61 63  or *p = (JsonEac
e570: 68 43 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20 20  hCursor*)cur;.  
e580: 6a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 52 65  jsonEachCursorRe
e590: 73 65 74 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  set(p);.  sqlite
e5a0: 33 5f 66 72 65 65 28 63 75 72 29 3b 0a 20 20 72  3_free(cur);.  r
e5b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
e5c0: 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 54 52  .}../* Return TR
e5d0: 55 45 20 69 66 20 74 68 65 20 6a 73 6f 6e 45 61  UE if the jsonEa
e5e0: 63 68 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  chCursor object 
e5f0: 68 61 73 20 62 65 65 6e 20 61 64 76 61 6e 63 65  has been advance
e600: 64 20 6f 66 66 20 74 68 65 20 65 6e 64 0a 2a 2a  d off the end.**
e610: 20 6f 66 20 74 68 65 20 4a 53 4f 4e 20 6f 62 6a   of the JSON obj
e620: 65 63 74 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ect */.static in
e630: 74 20 6a 73 6f 6e 45 61 63 68 45 6f 66 28 73 71  t jsonEachEof(sq
e640: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
e650: 72 20 2a 63 75 72 29 7b 0a 20 20 4a 73 6f 6e 45  r *cur){.  JsonE
e660: 61 63 68 43 75 72 73 6f 72 20 2a 70 20 3d 20 28  achCursor *p = (
e670: 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 2a 29  JsonEachCursor*)
e680: 63 75 72 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  cur;.  return p-
e690: 3e 69 20 3e 3d 20 70 2d 3e 69 45 6e 64 3b 0a 7d  >i >= p->iEnd;.}
e6a0: 0a 0a 2f 2a 20 41 64 76 61 6e 63 65 20 74 68 65  ../* Advance the
e6b0: 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e   cursor to the n
e6c0: 65 78 74 20 65 6c 65 6d 65 6e 74 20 66 6f 72 20  ext element for 
e6d0: 6a 73 6f 6e 5f 74 72 65 65 28 29 20 2a 2f 0a 73  json_tree() */.s
e6e0: 74 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e 45 61  tatic int jsonEa
e6f0: 63 68 4e 65 78 74 28 73 71 6c 69 74 65 33 5f 76  chNext(sqlite3_v
e700: 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 29  tab_cursor *cur)
e710: 7b 0a 20 20 4a 73 6f 6e 45 61 63 68 43 75 72 73  {.  JsonEachCurs
e720: 6f 72 20 2a 70 20 3d 20 28 4a 73 6f 6e 45 61 63  or *p = (JsonEac
e730: 68 43 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20 20  hCursor*)cur;.  
e740: 69 66 28 20 70 2d 3e 62 52 65 63 75 72 73 69 76  if( p->bRecursiv
e750: 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  e ){.    if( p->
e760: 73 50 61 72 73 65 2e 61 4e 6f 64 65 5b 70 2d 3e  sParse.aNode[p->
e770: 69 5d 2e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f  i].jnFlags & JNO
e780: 44 45 5f 4c 41 42 45 4c 20 29 20 70 2d 3e 69 2b  DE_LABEL ) p->i+
e790: 2b 3b 0a 20 20 20 20 70 2d 3e 69 2b 2b 3b 0a 20  +;.    p->i++;. 
e7a0: 20 20 20 70 2d 3e 69 52 6f 77 69 64 2b 2b 3b 0a     p->iRowid++;.
e7b0: 20 20 20 20 69 66 28 20 70 2d 3e 69 3c 70 2d 3e      if( p->i<p->
e7c0: 69 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 75 33  iEnd ){.      u3
e7d0: 32 20 69 55 70 20 3d 20 70 2d 3e 73 50 61 72 73  2 iUp = p->sPars
e7e0: 65 2e 61 55 70 5b 70 2d 3e 69 5d 3b 0a 20 20 20  e.aUp[p->i];.   
e7f0: 20 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 55 70     JsonNode *pUp
e800: 20 3d 20 26 70 2d 3e 73 50 61 72 73 65 2e 61 4e   = &p->sParse.aN
e810: 6f 64 65 5b 69 55 70 5d 3b 0a 20 20 20 20 20 20  ode[iUp];.      
e820: 70 2d 3e 65 54 79 70 65 20 3d 20 70 55 70 2d 3e  p->eType = pUp->
e830: 65 54 79 70 65 3b 0a 20 20 20 20 20 20 69 66 28  eType;.      if(
e840: 20 70 55 70 2d 3e 65 54 79 70 65 3d 3d 4a 53 4f   pUp->eType==JSO
e850: 4e 5f 41 52 52 41 59 20 29 7b 0a 20 20 20 20 20  N_ARRAY ){.     
e860: 20 20 20 69 66 28 20 69 55 70 3d 3d 70 2d 3e 69     if( iUp==p->i
e870: 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
e880: 70 55 70 2d 3e 75 2e 69 4b 65 79 20 3d 20 30 3b  pUp->u.iKey = 0;
e890: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
e8a0: 20 20 20 20 20 20 20 20 20 20 70 55 70 2d 3e 75            pUp->u
e8b0: 2e 69 4b 65 79 2b 2b 3b 0a 20 20 20 20 20 20 20  .iKey++;.       
e8c0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
e8d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 77  .  }else{.    sw
e8e0: 69 74 63 68 28 20 70 2d 3e 65 54 79 70 65 20 29  itch( p->eType )
e8f0: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4a 53 4f  {.      case JSO
e900: 4e 5f 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20  N_ARRAY: {.     
e910: 20 20 20 70 2d 3e 69 20 2b 3d 20 6a 73 6f 6e 4e     p->i += jsonN
e920: 6f 64 65 53 69 7a 65 28 26 70 2d 3e 73 50 61 72  odeSize(&p->sPar
e930: 73 65 2e 61 4e 6f 64 65 5b 70 2d 3e 69 5d 29 3b  se.aNode[p->i]);
e940: 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 52 6f 77  .        p->iRow
e950: 69 64 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62 72  id++;.        br
e960: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
e970: 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f 4f 42 4a     case JSON_OBJ
e980: 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 70  ECT: {.        p
e990: 2d 3e 69 20 2b 3d 20 31 20 2b 20 6a 73 6f 6e 4e  ->i += 1 + jsonN
e9a0: 6f 64 65 53 69 7a 65 28 26 70 2d 3e 73 50 61 72  odeSize(&p->sPar
e9b0: 73 65 2e 61 4e 6f 64 65 5b 70 2d 3e 69 2b 31 5d  se.aNode[p->i+1]
e9c0: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 52  );.        p->iR
e9d0: 6f 77 69 64 2b 2b 3b 0a 20 20 20 20 20 20 20 20  owid++;.        
e9e0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
e9f0: 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a       default: {.
ea00: 20 20 20 20 20 20 20 20 70 2d 3e 69 20 3d 20 70          p->i = p
ea10: 2d 3e 69 45 6e 64 3b 0a 20 20 20 20 20 20 20 20  ->iEnd;.        
ea20: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
ea30: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
ea40: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
ea50: 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 6e 61  /* Append the na
ea60: 6d 65 20 6f 66 20 74 68 65 20 70 61 74 68 20 66  me of the path f
ea70: 6f 72 20 65 6c 65 6d 65 6e 74 20 69 20 74 6f 20  or element i to 
ea80: 70 53 74 72 0a 2a 2f 0a 73 74 61 74 69 63 20 76  pStr.*/.static v
ea90: 6f 69 64 20 6a 73 6f 6e 45 61 63 68 43 6f 6d 70  oid jsonEachComp
eaa0: 75 74 65 50 61 74 68 28 0a 20 20 4a 73 6f 6e 45  utePath(.  JsonE
eab0: 61 63 68 43 75 72 73 6f 72 20 2a 70 2c 20 20 20  achCursor *p,   
eac0: 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
ead0: 72 20 2a 2f 0a 20 20 4a 73 6f 6e 53 74 72 69 6e  r */.  JsonStrin
eae0: 67 20 2a 70 53 74 72 2c 20 20 20 20 20 20 20 20  g *pStr,        
eaf0: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 74  /* Write the pat
eb00: 68 20 68 65 72 65 20 2a 2f 0a 20 20 75 33 32 20  h here */.  u32 
eb10: 69 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i               
eb20: 20 20 20 20 20 2f 2a 20 50 61 74 68 20 74 6f 20       /* Path to 
eb30: 74 68 69 73 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  this element */.
eb40: 29 7b 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70  ){.  JsonNode *p
eb50: 4e 6f 64 65 2c 20 2a 70 55 70 3b 0a 20 20 75 33  Node, *pUp;.  u3
eb60: 32 20 69 55 70 3b 0a 20 20 69 66 28 20 69 3d 3d  2 iUp;.  if( i==
eb70: 30 20 29 7b 0a 20 20 20 20 6a 73 6f 6e 41 70 70  0 ){.    jsonApp
eb80: 65 6e 64 43 68 61 72 28 70 53 74 72 2c 20 27 24  endChar(pStr, '$
eb90: 27 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ');.    return;.
eba0: 20 20 7d 0a 20 20 69 55 70 20 3d 20 70 2d 3e 73    }.  iUp = p->s
ebb0: 50 61 72 73 65 2e 61 55 70 5b 69 5d 3b 0a 20 20  Parse.aUp[i];.  
ebc0: 6a 73 6f 6e 45 61 63 68 43 6f 6d 70 75 74 65 50  jsonEachComputeP
ebd0: 61 74 68 28 70 2c 20 70 53 74 72 2c 20 69 55 70  ath(p, pStr, iUp
ebe0: 29 3b 0a 20 20 70 4e 6f 64 65 20 3d 20 26 70 2d  );.  pNode = &p-
ebf0: 3e 73 50 61 72 73 65 2e 61 4e 6f 64 65 5b 69 5d  >sParse.aNode[i]
ec00: 3b 0a 20 20 70 55 70 20 3d 20 26 70 2d 3e 73 50  ;.  pUp = &p->sP
ec10: 61 72 73 65 2e 61 4e 6f 64 65 5b 69 55 70 5d 3b  arse.aNode[iUp];
ec20: 0a 20 20 69 66 28 20 70 55 70 2d 3e 65 54 79 70  .  if( pUp->eTyp
ec30: 65 3d 3d 4a 53 4f 4e 5f 41 52 52 41 59 20 29 7b  e==JSON_ARRAY ){
ec40: 0a 20 20 20 20 6a 73 6f 6e 50 72 69 6e 74 66 28  .    jsonPrintf(
ec50: 33 30 2c 20 70 53 74 72 2c 20 22 5b 25 64 5d 22  30, pStr, "[%d]"
ec60: 2c 20 70 55 70 2d 3e 75 2e 69 4b 65 79 29 3b 0a  , pUp->u.iKey);.
ec70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
ec80: 65 72 74 28 20 70 55 70 2d 3e 65 54 79 70 65 3d  ert( pUp->eType=
ec90: 3d 4a 53 4f 4e 5f 4f 42 4a 45 43 54 20 29 3b 0a  =JSON_OBJECT );.
eca0: 20 20 20 20 69 66 28 20 28 70 4e 6f 64 65 2d 3e      if( (pNode->
ecb0: 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f  jnFlags & JNODE_
ecc0: 4c 41 42 45 4c 29 3d 3d 30 20 29 20 70 4e 6f 64  LABEL)==0 ) pNod
ecd0: 65 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e--;.    assert(
ece0: 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65 3d 3d 4a   pNode->eType==J
ecf0: 53 4f 4e 5f 53 54 52 49 4e 47 20 29 3b 0a 20 20  SON_STRING );.  
ed00: 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d    assert( pNode-
ed10: 3e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45  >jnFlags & JNODE
ed20: 5f 4c 41 42 45 4c 20 29 3b 0a 20 20 20 20 6a 73  _LABEL );.    js
ed30: 6f 6e 50 72 69 6e 74 66 28 70 4e 6f 64 65 2d 3e  onPrintf(pNode->
ed40: 6e 2b 31 2c 20 70 53 74 72 2c 20 22 2e 25 2e 2a  n+1, pStr, ".%.*
ed50: 73 22 2c 20 70 4e 6f 64 65 2d 3e 6e 2d 32 2c 20  s", pNode->n-2, 
ed60: 70 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74 65  pNode->u.zJConte
ed70: 6e 74 2b 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  nt+1);.  }.}../*
ed80: 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
ed90: 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f  e of a column */
eda0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e  .static int json
edb0: 45 61 63 68 43 6f 6c 75 6d 6e 28 0a 20 20 73 71  EachColumn(.  sq
edc0: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
edd0: 72 20 2a 63 75 72 2c 20 20 20 2f 2a 20 54 68 65  r *cur,   /* The
ede0: 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 73 71 6c   cursor */.  sql
edf0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74  ite3_context *ct
ee00: 78 2c 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  x,       /* Firs
ee10: 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 71  t argument to sq
ee20: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 2e 2e 2e  lite3_result_...
ee30: 28 29 20 2a 2f 0a 20 20 69 6e 74 20 69 20 20 20  () */.  int i   
ee40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee50: 20 20 20 20 2f 2a 20 57 68 69 63 68 20 63 6f 6c      /* Which col
ee60: 75 6d 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  umn to return */
ee70: 0a 29 7b 0a 20 20 4a 73 6f 6e 45 61 63 68 43 75  .){.  JsonEachCu
ee80: 72 73 6f 72 20 2a 70 20 3d 20 28 4a 73 6f 6e 45  rsor *p = (JsonE
ee90: 61 63 68 43 75 72 73 6f 72 2a 29 63 75 72 3b 0a  achCursor*)cur;.
eea0: 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 54 68 69    JsonNode *pThi
eeb0: 73 20 3d 20 26 70 2d 3e 73 50 61 72 73 65 2e 61  s = &p->sParse.a
eec0: 4e 6f 64 65 5b 70 2d 3e 69 5d 3b 0a 20 20 73 77  Node[p->i];.  sw
eed0: 69 74 63 68 28 20 69 20 29 7b 0a 20 20 20 20 63  itch( i ){.    c
eee0: 61 73 65 20 4a 45 41 43 48 5f 4b 45 59 3a 20 7b  ase JEACH_KEY: {
eef0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 3d  .      if( p->i=
ef00: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
ef10: 20 20 69 66 28 20 70 2d 3e 65 54 79 70 65 3d 3d    if( p->eType==
ef20: 4a 53 4f 4e 5f 4f 42 4a 45 43 54 20 29 7b 0a 20  JSON_OBJECT ){. 
ef30: 20 20 20 20 20 20 20 6a 73 6f 6e 52 65 74 75 72         jsonRetur
ef40: 6e 28 70 54 68 69 73 2c 20 63 74 78 2c 20 30 29  n(pThis, ctx, 0)
ef50: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
ef60: 28 20 70 2d 3e 65 54 79 70 65 3d 3d 4a 53 4f 4e  ( p->eType==JSON
ef70: 5f 41 52 52 41 59 20 29 7b 0a 20 20 20 20 20 20  _ARRAY ){.      
ef80: 20 20 75 33 32 20 69 4b 65 79 3b 0a 20 20 20 20    u32 iKey;.    
ef90: 20 20 20 20 69 66 28 20 70 2d 3e 62 52 65 63 75      if( p->bRecu
efa0: 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 20  rsive ){.       
efb0: 20 20 20 69 66 28 20 70 2d 3e 69 52 6f 77 69 64     if( p->iRowid
efc0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
efd0: 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 70 2d         iKey = p-
efe0: 3e 73 50 61 72 73 65 2e 61 4e 6f 64 65 5b 70 2d  >sParse.aNode[p-
eff0: 3e 73 50 61 72 73 65 2e 61 55 70 5b 70 2d 3e 69  >sParse.aUp[p->i
f000: 5d 5d 2e 75 2e 69 4b 65 79 3b 0a 20 20 20 20 20  ]].u.iKey;.     
f010: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f020: 20 20 20 20 69 4b 65 79 20 3d 20 70 2d 3e 69 52      iKey = p->iR
f030: 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  owid;.        }.
f040: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
f050: 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 74 78  result_int64(ctx
f060: 2c 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  , (sqlite3_int64
f070: 29 69 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a  )iKey);.      }.
f080: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f090: 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 45 41 43   }.    case JEAC
f0a0: 48 5f 56 41 4c 55 45 3a 20 7b 0a 20 20 20 20 20  H_VALUE: {.     
f0b0: 20 69 66 28 20 70 54 68 69 73 2d 3e 6a 6e 46 6c   if( pThis->jnFl
f0c0: 61 67 73 20 26 20 4a 4e 4f 44 45 5f 4c 41 42 45  ags & JNODE_LABE
f0d0: 4c 20 29 20 70 54 68 69 73 2b 2b 3b 0a 20 20 20  L ) pThis++;.   
f0e0: 20 20 20 6a 73 6f 6e 52 65 74 75 72 6e 28 70 54     jsonReturn(pT
f0f0: 68 69 73 2c 20 63 74 78 2c 20 30 29 3b 0a 20 20  his, ctx, 0);.  
f100: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f110: 0a 20 20 20 20 63 61 73 65 20 4a 45 41 43 48 5f  .    case JEACH_
f120: 54 59 50 45 3a 20 7b 0a 20 20 20 20 20 20 69 66  TYPE: {.      if
f130: 28 20 70 54 68 69 73 2d 3e 6a 6e 46 6c 61 67 73  ( pThis->jnFlags
f140: 20 26 20 4a 4e 4f 44 45 5f 4c 41 42 45 4c 20 29   & JNODE_LABEL )
f150: 20 70 54 68 69 73 2b 2b 3b 0a 20 20 20 20 20 20   pThis++;.      
f160: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
f170: 65 78 74 28 63 74 78 2c 20 6a 73 6f 6e 54 79 70  ext(ctx, jsonTyp
f180: 65 5b 70 54 68 69 73 2d 3e 65 54 79 70 65 5d 2c  e[pThis->eType],
f190: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
f1a0: 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  IC);.      break
f1b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
f1c0: 20 4a 45 41 43 48 5f 41 54 4f 4d 3a 20 7b 0a 20   JEACH_ATOM: {. 
f1d0: 20 20 20 20 20 69 66 28 20 70 54 68 69 73 2d 3e       if( pThis->
f1e0: 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f  jnFlags & JNODE_
f1f0: 4c 41 42 45 4c 20 29 20 70 54 68 69 73 2b 2b 3b  LABEL ) pThis++;
f200: 0a 20 20 20 20 20 20 69 66 28 20 70 54 68 69 73  .      if( pThis
f210: 2d 3e 65 54 79 70 65 3e 3d 4a 53 4f 4e 5f 41 52  ->eType>=JSON_AR
f220: 52 41 59 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  RAY ) break;.   
f230: 20 20 20 6a 73 6f 6e 52 65 74 75 72 6e 28 70 54     jsonReturn(pT
f240: 68 69 73 2c 20 63 74 78 2c 20 30 29 3b 0a 20 20  his, ctx, 0);.  
f250: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f260: 0a 20 20 20 20 63 61 73 65 20 4a 45 41 43 48 5f  .    case JEACH_
f270: 49 44 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ID: {.      sqli
f280: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34  te3_result_int64
f290: 28 63 74 78 2c 20 0a 20 20 20 20 20 20 20 20 20  (ctx, .         
f2a0: 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70  (sqlite3_int64)p
f2b0: 2d 3e 69 20 2b 20 28 28 70 54 68 69 73 2d 3e 6a  ->i + ((pThis->j
f2c0: 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 4c  nFlags & JNODE_L
f2d0: 41 42 45 4c 29 21 3d 30 29 29 3b 0a 20 20 20 20  ABEL)!=0));.    
f2e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
f2f0: 20 20 20 63 61 73 65 20 4a 45 41 43 48 5f 50 41     case JEACH_PA
f300: 52 45 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69 66  RENT: {.      if
f310: 28 20 70 2d 3e 69 3e 70 2d 3e 69 42 65 67 69 6e  ( p->i>p->iBegin
f320: 20 26 26 20 70 2d 3e 62 52 65 63 75 72 73 69 76   && p->bRecursiv
f330: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
f340: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
f350: 34 28 63 74 78 2c 20 28 73 71 6c 69 74 65 33 5f  4(ctx, (sqlite3_
f360: 69 6e 74 36 34 29 70 2d 3e 73 50 61 72 73 65 2e  int64)p->sParse.
f370: 61 55 70 5b 70 2d 3e 69 5d 29 3b 0a 20 20 20 20  aUp[p->i]);.    
f380: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
f390: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
f3a0: 4a 45 41 43 48 5f 46 55 4c 4c 4b 45 59 3a 20 7b  JEACH_FULLKEY: {
f3b0: 0a 20 20 20 20 20 20 4a 73 6f 6e 53 74 72 69 6e  .      JsonStrin
f3c0: 67 20 78 3b 0a 20 20 20 20 20 20 6a 73 6f 6e 49  g x;.      jsonI
f3d0: 6e 69 74 28 26 78 2c 20 63 74 78 29 3b 0a 20 20  nit(&x, ctx);.  
f3e0: 20 20 20 20 69 66 28 20 70 2d 3e 62 52 65 63 75      if( p->bRecu
f3f0: 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 20  rsive ){.       
f400: 20 6a 73 6f 6e 45 61 63 68 43 6f 6d 70 75 74 65   jsonEachCompute
f410: 50 61 74 68 28 70 2c 20 26 78 2c 20 70 2d 3e 69  Path(p, &x, p->i
f420: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
f430: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 7a          if( p->z
f440: 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Root ){.        
f450: 20 20 6a 73 6f 6e 41 70 70 65 6e 64 52 61 77 28    jsonAppendRaw(
f460: 26 78 2c 20 70 2d 3e 7a 52 6f 6f 74 2c 20 28 69  &x, p->zRoot, (i
f470: 6e 74 29 73 74 72 6c 65 6e 28 70 2d 3e 7a 52 6f  nt)strlen(p->zRo
f480: 6f 74 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ot));.        }e
f490: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6a  lse{.          j
f4a0: 73 6f 6e 41 70 70 65 6e 64 43 68 61 72 28 26 78  sonAppendChar(&x
f4b0: 2c 20 27 24 27 29 3b 0a 20 20 20 20 20 20 20 20  , '$');.        
f4c0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  }.        if( p-
f4d0: 3e 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f 41 52 52  >eType==JSON_ARR
f4e0: 41 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AY ){.          
f4f0: 6a 73 6f 6e 50 72 69 6e 74 66 28 33 30 2c 20 26  jsonPrintf(30, &
f500: 78 2c 20 22 5b 25 64 5d 22 2c 20 70 2d 3e 69 52  x, "[%d]", p->iR
f510: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 7d  owid);.        }
f520: 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 54 79 70  else if( p->eTyp
f530: 65 3d 3d 4a 53 4f 4e 5f 4f 42 4a 45 43 54 20 29  e==JSON_OBJECT )
f540: 7b 0a 20 20 20 20 20 20 20 20 20 20 6a 73 6f 6e  {.          json
f550: 50 72 69 6e 74 66 28 70 54 68 69 73 2d 3e 6e 2c  Printf(pThis->n,
f560: 20 26 78 2c 20 22 2e 25 2e 2a 73 22 2c 20 70 54   &x, ".%.*s", pT
f570: 68 69 73 2d 3e 6e 2d 32 2c 20 70 54 68 69 73 2d  his->n-2, pThis-
f580: 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 2b 31 29 3b  >u.zJContent+1);
f590: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f5a0: 20 7d 0a 20 20 20 20 20 20 6a 73 6f 6e 52 65 73   }.      jsonRes
f5b0: 75 6c 74 28 26 78 29 3b 0a 20 20 20 20 20 20 62  ult(&x);.      b
f5c0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
f5d0: 63 61 73 65 20 4a 45 41 43 48 5f 50 41 54 48 3a  case JEACH_PATH:
f5e0: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   {.      if( p->
f5f0: 62 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20  bRecursive ){.  
f600: 20 20 20 20 20 20 4a 73 6f 6e 53 74 72 69 6e 67        JsonString
f610: 20 78 3b 0a 20 20 20 20 20 20 20 20 6a 73 6f 6e   x;.        json
f620: 49 6e 69 74 28 26 78 2c 20 63 74 78 29 3b 0a 20  Init(&x, ctx);. 
f630: 20 20 20 20 20 20 20 6a 73 6f 6e 45 61 63 68 43         jsonEachC
f640: 6f 6d 70 75 74 65 50 61 74 68 28 70 2c 20 26 78  omputePath(p, &x
f650: 2c 20 70 2d 3e 73 50 61 72 73 65 2e 61 55 70 5b  , p->sParse.aUp[
f660: 70 2d 3e 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  p->i]);.        
f670: 6a 73 6f 6e 52 65 73 75 6c 74 28 26 78 29 3b 0a  jsonResult(&x);.
f680: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
f690: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
f6a0: 46 6f 72 20 6a 73 6f 6e 5f 65 61 63 68 28 29 20  For json_each() 
f6b0: 70 61 74 68 20 61 6e 64 20 72 6f 6f 74 20 61 72  path and root ar
f6c0: 65 20 74 68 65 20 73 61 6d 65 20 73 6f 20 66 61  e the same so fa
f6d0: 6c 6c 20 74 68 72 6f 75 67 68 0a 20 20 20 20 20  ll through.     
f6e0: 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 72 6f 6f   ** into the roo
f6f0: 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a  t case */.    }.
f700: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
f710: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
f720: 2a 7a 52 6f 6f 74 20 3d 20 70 2d 3e 7a 52 6f 6f  *zRoot = p->zRoo
f730: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52 6f  t;.      if( zRo
f740: 6f 74 3d 3d 30 20 29 20 7a 52 6f 6f 74 20 3d 20  ot==0 ) zRoot = 
f750: 22 24 22 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "$";.      sqlit
f760: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
f770: 74 78 2c 20 7a 52 6f 6f 74 2c 20 2d 31 2c 20 53  tx, zRoot, -1, S
f780: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
f790: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f7a0: 7d 0a 20 20 20 20 63 61 73 65 20 4a 45 41 43 48  }.    case JEACH
f7b0: 5f 4a 53 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 61  _JSON: {.      a
f7c0: 73 73 65 72 74 28 20 69 3d 3d 4a 45 41 43 48 5f  ssert( i==JEACH_
f7d0: 4a 53 4f 4e 20 29 3b 0a 20 20 20 20 20 20 73 71  JSON );.      sq
f7e0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
f7f0: 74 28 63 74 78 2c 20 70 2d 3e 73 50 61 72 73 65  t(ctx, p->sParse
f800: 2e 7a 4a 73 6f 6e 2c 20 2d 31 2c 20 53 51 4c 49  .zJson, -1, SQLI
f810: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
f820: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
f830: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
f840: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  TE_OK;.}../* Ret
f850: 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  urn the current 
f860: 72 6f 77 69 64 20 76 61 6c 75 65 20 2a 2f 0a 73  rowid value */.s
f870: 74 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e 45 61  tatic int jsonEa
f880: 63 68 52 6f 77 69 64 28 73 71 6c 69 74 65 33 5f  chRowid(sqlite3_
f890: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72  vtab_cursor *cur
f8a0: 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a  , sqlite_int64 *
f8b0: 70 52 6f 77 69 64 29 7b 0a 20 20 4a 73 6f 6e 45  pRowid){.  JsonE
f8c0: 61 63 68 43 75 72 73 6f 72 20 2a 70 20 3d 20 28  achCursor *p = (
f8d0: 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 2a 29  JsonEachCursor*)
f8e0: 63 75 72 3b 0a 20 20 2a 70 52 6f 77 69 64 20 3d  cur;.  *pRowid =
f8f0: 20 70 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 72 65   p->iRowid;.  re
f900: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
f910: 7d 0a 0a 2f 2a 20 54 68 65 20 71 75 65 72 79 20  }../* The query 
f920: 73 74 72 61 74 65 67 79 20 69 73 20 74 6f 20 6c  strategy is to l
f930: 6f 6f 6b 20 66 6f 72 20 61 6e 20 65 71 75 61 6c  ook for an equal
f940: 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  ity constraint o
f950: 6e 20 74 68 65 20 6a 73 6f 6e 0a 2a 2a 20 63 6f  n the json.** co
f960: 6c 75 6d 6e 2e 20 20 57 69 74 68 6f 75 74 20 73  lumn.  Without s
f970: 75 63 68 20 61 20 63 6f 6e 73 74 72 61 69 6e 74  uch a constraint
f980: 2c 20 74 68 65 20 74 61 62 6c 65 20 63 61 6e 6e  , the table cann
f990: 6f 74 20 6f 70 65 72 61 74 65 2e 20 20 69 64 78  ot operate.  idx
f9a0: 4e 75 6d 20 69 73 0a 2a 2a 20 31 20 69 66 20 74  Num is.** 1 if t
f9b0: 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  he constraint is
f9c0: 20 66 6f 75 6e 64 2c 20 33 20 69 66 20 74 68 65   found, 3 if the
f9d0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20   constraint and 
f9e0: 7a 52 6f 6f 74 20 61 72 65 20 66 6f 75 6e 64 2c  zRoot are found,
f9f0: 0a 2a 2a 20 61 6e 64 20 30 20 6f 74 68 65 72 77  .** and 0 otherw
fa00: 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
fa10: 6e 74 20 6a 73 6f 6e 45 61 63 68 42 65 73 74 49  nt jsonEachBestI
fa20: 6e 64 65 78 28 0a 20 20 73 71 6c 69 74 65 33 5f  ndex(.  sqlite3_
fa30: 76 74 61 62 20 2a 74 61 62 2c 0a 20 20 73 71 6c  vtab *tab,.  sql
fa40: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
fa50: 2a 70 49 64 78 49 6e 66 6f 0a 29 7b 0a 20 20 69  *pIdxInfo.){.  i
fa60: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
fa70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
fa80: 70 20 63 6f 75 6e 74 65 72 20 6f 72 20 63 6f 6d  p counter or com
fa90: 70 75 74 65 64 20 61 72 72 61 79 20 69 6e 64 65  puted array inde
faa0: 78 20 2a 2f 0a 20 20 69 6e 74 20 61 49 64 78 5b  x */.  int aIdx[
fab0: 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  2];             
fac0: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
fad0: 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20 4a 53  nstraints for JS
fae0: 4f 4e 20 61 6e 64 20 52 4f 4f 54 20 2a 2f 0a 20  ON and ROOT */. 
faf0: 20 69 6e 74 20 75 6e 75 73 61 62 6c 65 4d 61 73   int unusableMas
fb00: 6b 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4d  k = 0;      /* M
fb10: 61 73 6b 20 6f 66 20 75 6e 75 73 61 62 6c 65 20  ask of unusable 
fb20: 4a 53 4f 4e 20 61 6e 64 20 52 4f 4f 54 20 63 6f  JSON and ROOT co
fb30: 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 69  nstraints */.  i
fb40: 6e 74 20 69 64 78 4d 61 73 6b 20 3d 20 30 3b 20  nt idxMask = 0; 
fb50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
fb60: 6b 20 6f 66 20 75 73 61 62 6c 65 20 3d 3d 20 63  k of usable == c
fb70: 6f 6e 73 74 72 61 69 6e 74 73 20 4a 53 4f 4e 20  onstraints JSON 
fb80: 61 6e 64 20 52 4f 4f 54 20 2a 2f 0a 20 20 63 6f  and ROOT */.  co
fb90: 6e 73 74 20 73 74 72 75 63 74 20 73 71 6c 69 74  nst struct sqlit
fba0: 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
fbb0: 69 6e 74 20 2a 70 43 6f 6e 73 74 72 61 69 6e 74  int *pConstraint
fbc0: 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 69 6d 70  ;..  /* This imp
fbd0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 61 73 73 75  lementation assu
fbe0: 6d 65 73 20 74 68 61 74 20 4a 53 4f 4e 20 61 6e  mes that JSON an
fbf0: 64 20 52 4f 4f 54 20 61 72 65 20 74 68 65 20 6c  d ROOT are the l
fc00: 61 73 74 20 74 77 6f 0a 20 20 2a 2a 20 63 6f 6c  ast two.  ** col
fc10: 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c  umns in the tabl
fc20: 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 4a  e */.  assert( J
fc30: 45 41 43 48 5f 52 4f 4f 54 20 3d 3d 20 4a 45 41  EACH_ROOT == JEA
fc40: 43 48 5f 4a 53 4f 4e 2b 31 20 29 3b 0a 20 20 55  CH_JSON+1 );.  U
fc50: 4e 55 53 45 44 5f 50 41 52 41 4d 28 74 61 62 29  NUSED_PARAM(tab)
fc60: 3b 0a 20 20 61 49 64 78 5b 30 5d 20 3d 20 61 49  ;.  aIdx[0] = aI
fc70: 64 78 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 43  dx[1] = -1;.  pC
fc80: 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78  onstraint = pIdx
fc90: 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
fca0: 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  t;.  for(i=0; i<
fcb0: 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74  pIdxInfo->nConst
fcc0: 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 43 6f 6e  raint; i++, pCon
fcd0: 73 74 72 61 69 6e 74 2b 2b 29 7b 0a 20 20 20 20  straint++){.    
fce0: 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 69 6e  int iCol;.    in
fcf0: 74 20 69 4d 61 73 6b 3b 0a 20 20 20 20 69 66 28  t iMask;.    if(
fd00: 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 69 43   pConstraint->iC
fd10: 6f 6c 75 6d 6e 20 3c 20 4a 45 41 43 48 5f 4a 53  olumn < JEACH_JS
fd20: 4f 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ON ) continue;. 
fd30: 20 20 20 69 43 6f 6c 20 3d 20 70 43 6f 6e 73 74     iCol = pConst
fd40: 72 61 69 6e 74 2d 3e 69 43 6f 6c 75 6d 6e 20 2d  raint->iColumn -
fd50: 20 4a 45 41 43 48 5f 4a 53 4f 4e 3b 0a 20 20 20   JEACH_JSON;.   
fd60: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 30   assert( iCol==0
fd70: 20 7c 7c 20 69 43 6f 6c 3d 3d 31 20 29 3b 0a 20   || iCol==1 );. 
fd80: 20 20 20 69 4d 61 73 6b 20 3d 20 31 20 3c 3c 20     iMask = 1 << 
fd90: 69 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20 70 43  iCol;.    if( pC
fda0: 6f 6e 73 74 72 61 69 6e 74 2d 3e 75 73 61 62 6c  onstraint->usabl
fdb0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 6e  e==0 ){.      un
fdc0: 75 73 61 62 6c 65 4d 61 73 6b 20 7c 3d 20 69 4d  usableMask |= iM
fdd0: 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ask;.    }else i
fde0: 66 28 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e  f( pConstraint->
fdf0: 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  op==SQLITE_INDEX
fe00: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 29  _CONSTRAINT_EQ )
fe10: 7b 0a 20 20 20 20 20 20 61 49 64 78 5b 69 43 6f  {.      aIdx[iCo
fe20: 6c 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 69 64  l] = i;.      id
fe30: 78 4d 61 73 6b 20 7c 3d 20 69 4d 61 73 6b 3b 0a  xMask |= iMask;.
fe40: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
fe50: 28 75 6e 75 73 61 62 6c 65 4d 61 73 6b 20 26 20  (unusableMask & 
fe60: 7e 69 64 78 4d 61 73 6b 29 21 3d 30 20 29 7b 0a  ~idxMask)!=0 ){.
fe70: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
fe80: 61 72 65 20 61 6e 79 20 75 6e 75 73 61 62 6c 65  are any unusable
fe90: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20   constraints on 
fea0: 4a 53 4f 4e 20 6f 72 20 52 4f 4f 54 2c 20 74 68  JSON or ROOT, th
feb0: 65 6e 20 72 65 6a 65 63 74 0a 20 20 20 20 2a 2a  en reject.    **
fec0: 20 74 68 69 73 20 65 6e 74 69 72 65 20 70 6c 61   this entire pla
fed0: 6e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  n */.    return 
fee0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
fef0: 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 49 64  T;.  }.  if( aId
ff00: 78 5b 30 5d 3c 30 20 29 7b 0a 20 20 20 20 2f 2a  x[0]<0 ){.    /*
ff10: 20 4e 6f 20 4a 53 4f 4e 20 69 6e 70 75 74 2e 20   No JSON input. 
ff20: 20 4c 65 61 76 65 20 65 73 74 69 6d 61 74 65 64   Leave estimated
ff30: 43 6f 73 74 20 61 74 20 74 68 65 20 68 75 67 65  Cost at the huge
ff40: 20 76 61 6c 75 65 20 74 68 61 74 20 69 74 20 77   value that it w
ff50: 61 73 0a 20 20 20 20 2a 2a 20 69 6e 69 74 69 61  as.    ** initia
ff60: 6c 69 7a 65 64 20 74 6f 20 74 6f 20 64 69 73 63  lized to to disc
ff70: 6f 75 72 61 67 65 20 74 68 65 20 71 75 65 72 79  ourage the query
ff80: 20 70 6c 61 6e 6e 65 72 20 66 72 6f 6d 20 73 65   planner from se
ff90: 6c 65 63 74 69 6e 67 20 74 68 69 73 0a 20 20 20  lecting this.   
ffa0: 20 2a 2a 20 70 6c 61 6e 2e 20 2a 2f 0a 20 20 20   ** plan. */.   
ffb0: 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75   pIdxInfo->idxNu
ffc0: 6d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  m = 0;.  }else{.
ffd0: 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73      pIdxInfo->es
ffe0: 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 31 2e  timatedCost = 1.
fff0: 30 3b 0a 20 20 20 20 69 20 3d 20 61 49 64 78 5b  0;.    i = aIdx[
10000 30 5d 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f  0];.    pIdxInfo
10010 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
10020 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 20  ge[i].argvIndex 
10030 3d 20 31 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  = 1;.    pIdxInf
10040 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
10050 61 67 65 5b 69 5d 2e 6f 6d 69 74 20 3d 20 31 3b  age[i].omit = 1;
10060 0a 20 20 20 20 69 66 28 20 61 49 64 78 5b 31 5d  .    if( aIdx[1]
10070 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78  <0 ){.      pIdx
10080 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 31  Info->idxNum = 1
10090 3b 20 20 2f 2a 20 4f 6e 6c 79 20 4a 53 4f 4e 20  ;  /* Only JSON 
100a0 73 75 70 70 6c 69 65 64 2e 20 20 50 6c 61 6e 20  supplied.  Plan 
100b0 31 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  1 */.    }else{.
100c0 20 20 20 20 20 20 69 20 3d 20 61 49 64 78 5b 31        i = aIdx[1
100d0 5d 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66  ];.      pIdxInf
100e0 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
100f0 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78  age[i].argvIndex
10100 20 3d 20 32 3b 0a 20 20 20 20 20 20 70 49 64 78   = 2;.      pIdx
10110 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
10120 74 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 20 3d  tUsage[i].omit =
10130 20 31 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e   1;.      pIdxIn
10140 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 33 3b 20  fo->idxNum = 3; 
10150 20 2f 2a 20 42 6f 74 68 20 4a 53 4f 4e 20 61 6e   /* Both JSON an
10160 64 20 52 4f 4f 54 20 61 72 65 20 73 75 70 70 6c  d ROOT are suppl
10170 69 65 64 2e 20 20 50 6c 61 6e 20 33 20 2a 2f 0a  ied.  Plan 3 */.
10180 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
10190 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
101a0 0a 2f 2a 20 53 74 61 72 74 20 61 20 73 65 61 72  ./* Start a sear
101b0 63 68 20 6f 6e 20 61 20 6e 65 77 20 4a 53 4f 4e  ch on a new JSON
101c0 20 73 74 72 69 6e 67 20 2a 2f 0a 73 74 61 74 69   string */.stati
101d0 63 20 69 6e 74 20 6a 73 6f 6e 45 61 63 68 46 69  c int jsonEachFi
101e0 6c 74 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f  lter(.  sqlite3_
101f0 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72  vtab_cursor *cur
10200 2c 0a 20 20 69 6e 74 20 69 64 78 4e 75 6d 2c 20  ,.  int idxNum, 
10210 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 64 78 53  const char *idxS
10220 74 72 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 20  tr,.  int argc, 
10230 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
10240 61 72 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e 45 61  argv.){.  JsonEa
10250 63 68 43 75 72 73 6f 72 20 2a 70 20 3d 20 28 4a  chCursor *p = (J
10260 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 2a 29 63  sonEachCursor*)c
10270 75 72 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ur;.  const char
10280 20 2a 7a 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61   *z;.  const cha
10290 72 20 2a 7a 52 6f 6f 74 20 3d 20 30 3b 0a 20 20  r *zRoot = 0;.  
102a0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 3b  sqlite3_int64 n;
102b0 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
102c0 28 69 64 78 53 74 72 29 3b 0a 20 20 55 4e 55 53  (idxStr);.  UNUS
102d0 45 44 5f 50 41 52 41 4d 28 61 72 67 63 29 3b 0a  ED_PARAM(argc);.
102e0 20 20 6a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72    jsonEachCursor
102f0 52 65 73 65 74 28 70 29 3b 0a 20 20 69 66 28 20  Reset(p);.  if( 
10300 69 64 78 4e 75 6d 3d 3d 30 20 29 20 72 65 74 75  idxNum==0 ) retu
10310 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
10320 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  z = (const char*
10330 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
10340 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ext(argv[0]);.  
10350 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
10360 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6e  n SQLITE_OK;.  n
10370 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
10380 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b  _bytes(argv[0]);
10390 0a 20 20 70 2d 3e 7a 4a 73 6f 6e 20 3d 20 73 71  .  p->zJson = sq
103a0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20  lite3_malloc64( 
103b0 6e 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  n+1 );.  if( p->
103c0 7a 4a 73 6f 6e 3d 3d 30 20 29 20 72 65 74 75 72  zJson==0 ) retur
103d0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
103e0 20 20 6d 65 6d 63 70 79 28 70 2d 3e 7a 4a 73 6f    memcpy(p->zJso
103f0 6e 2c 20 7a 2c 20 28 73 69 7a 65 5f 74 29 6e 2b  n, z, (size_t)n+
10400 31 29 3b 0a 20 20 69 66 28 20 6a 73 6f 6e 50 61  1);.  if( jsonPa
10410 72 73 65 28 26 70 2d 3e 73 50 61 72 73 65 2c 20  rse(&p->sParse, 
10420 30 2c 20 70 2d 3e 7a 4a 73 6f 6e 29 20 29 7b 0a  0, p->zJson) ){.
10430 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c      int rc = SQL
10440 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 69  ITE_NOMEM;.    i
10450 66 28 20 70 2d 3e 73 50 61 72 73 65 2e 6f 6f 6d  f( p->sParse.oom
10460 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
10470 69 74 65 33 5f 66 72 65 65 28 63 75 72 2d 3e 70  ite3_free(cur->p
10480 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  Vtab->zErrMsg);.
10490 20 20 20 20 20 20 63 75 72 2d 3e 70 56 74 61 62        cur->pVtab
104a0 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69  ->zErrMsg = sqli
104b0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6d 61 6c  te3_mprintf("mal
104c0 66 6f 72 6d 65 64 20 4a 53 4f 4e 22 29 3b 0a 20  formed JSON");. 
104d0 20 20 20 20 20 69 66 28 20 63 75 72 2d 3e 70 56       if( cur->pV
104e0 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 20 72  tab->zErrMsg ) r
104f0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
10500 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 73 6f 6e  ;.    }.    json
10510 45 61 63 68 43 75 72 73 6f 72 52 65 73 65 74 28  EachCursorReset(
10520 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  p);.    return r
10530 63 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  c;.  }else if( p
10540 2d 3e 62 52 65 63 75 72 73 69 76 65 20 26 26 20  ->bRecursive && 
10550 6a 73 6f 6e 50 61 72 73 65 46 69 6e 64 50 61 72  jsonParseFindPar
10560 65 6e 74 73 28 26 70 2d 3e 73 50 61 72 73 65 29  ents(&p->sParse)
10570 20 29 7b 0a 20 20 20 20 6a 73 6f 6e 45 61 63 68   ){.    jsonEach
10580 43 75 72 73 6f 72 52 65 73 65 74 28 70 29 3b 0a  CursorReset(p);.
10590 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
105a0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65  E_NOMEM;.  }else
105b0 7b 0a 20 20 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a  {.    JsonNode *
105c0 70 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 69  pNode = 0;.    i
105d0 66 28 20 69 64 78 4e 75 6d 3d 3d 33 20 29 7b 0a  f( idxNum==3 ){.
105e0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
105f0 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 20 20   *zErr = 0;.    
10600 20 20 7a 52 6f 6f 74 20 3d 20 28 63 6f 6e 73 74    zRoot = (const
10610 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
10620 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31  alue_text(argv[1
10630 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52  ]);.      if( zR
10640 6f 6f 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  oot==0 ) return 
10650 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
10660 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   n = sqlite3_val
10670 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 31 5d  ue_bytes(argv[1]
10680 29 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 52 6f 6f  );.      p->zRoo
10690 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  t = sqlite3_mall
106a0 6f 63 36 34 28 20 6e 2b 31 20 29 3b 0a 20 20 20  oc64( n+1 );.   
106b0 20 20 20 69 66 28 20 70 2d 3e 7a 52 6f 6f 74 3d     if( p->zRoot=
106c0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
106d0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
106e0 6d 65 6d 63 70 79 28 70 2d 3e 7a 52 6f 6f 74 2c  memcpy(p->zRoot,
106f0 20 7a 52 6f 6f 74 2c 20 28 73 69 7a 65 5f 74 29   zRoot, (size_t)
10700 6e 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  n+1);.      if( 
10710 7a 52 6f 6f 74 5b 30 5d 21 3d 27 24 27 20 29 7b  zRoot[0]!='$' ){
10720 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20  .        zErr = 
10730 7a 52 6f 6f 74 3b 0a 20 20 20 20 20 20 7d 65 6c  zRoot;.      }el
10740 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 6f 64  se{.        pNod
10750 65 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 53 74  e = jsonLookupSt
10760 65 70 28 26 70 2d 3e 73 50 61 72 73 65 2c 20 30  ep(&p->sParse, 0
10770 2c 20 70 2d 3e 7a 52 6f 6f 74 2b 31 2c 20 30 2c  , p->zRoot+1, 0,
10780 20 26 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 7d   &zErr);.      }
10790 0a 20 20 20 20 20 20 69 66 28 20 7a 45 72 72 20  .      if( zErr 
107a0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
107b0 65 33 5f 66 72 65 65 28 63 75 72 2d 3e 70 56 74  e3_free(cur->pVt
107c0 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ab->zErrMsg);.  
107d0 20 20 20 20 20 20 63 75 72 2d 3e 70 56 74 61 62        cur->pVtab
107e0 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 6a 73 6f 6e  ->zErrMsg = json
107f0 50 61 74 68 53 79 6e 74 61 78 45 72 72 6f 72 28  PathSyntaxError(
10800 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 20 20 6a  zErr);.        j
10810 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 52 65 73  sonEachCursorRes
10820 65 74 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72  et(p);.        r
10830 65 74 75 72 6e 20 63 75 72 2d 3e 70 56 74 61 62  eturn cur->pVtab
10840 2d 3e 7a 45 72 72 4d 73 67 20 3f 20 53 51 4c 49  ->zErrMsg ? SQLI
10850 54 45 5f 45 52 52 4f 52 20 3a 20 53 51 4c 49 54  TE_ERROR : SQLIT
10860 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
10870 65 6c 73 65 20 69 66 28 20 70 4e 6f 64 65 3d 3d  else if( pNode==
10880 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
10890 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
108a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
108b0 7b 0a 20 20 20 20 20 20 70 4e 6f 64 65 20 3d 20  {.      pNode = 
108c0 70 2d 3e 73 50 61 72 73 65 2e 61 4e 6f 64 65 3b  p->sParse.aNode;
108d0 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 42  .    }.    p->iB
108e0 65 67 69 6e 20 3d 20 70 2d 3e 69 20 3d 20 28 69  egin = p->i = (i
108f0 6e 74 29 28 70 4e 6f 64 65 20 2d 20 70 2d 3e 73  nt)(pNode - p->s
10900 50 61 72 73 65 2e 61 4e 6f 64 65 29 3b 0a 20 20  Parse.aNode);.  
10910 20 20 70 2d 3e 65 54 79 70 65 20 3d 20 70 4e 6f    p->eType = pNo
10920 64 65 2d 3e 65 54 79 70 65 3b 0a 20 20 20 20 69  de->eType;.    i
10930 66 28 20 70 2d 3e 65 54 79 70 65 3e 3d 4a 53 4f  f( p->eType>=JSO
10940 4e 5f 41 52 52 41 59 20 29 7b 0a 20 20 20 20 20  N_ARRAY ){.     
10950 20 70 4e 6f 64 65 2d 3e 75 2e 69 4b 65 79 20 3d   pNode->u.iKey =
10960 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 45 6e   0;.      p->iEn
10970 64 20 3d 20 70 2d 3e 69 20 2b 20 70 4e 6f 64 65  d = p->i + pNode
10980 2d 3e 6e 20 2b 20 31 3b 0a 20 20 20 20 20 20 69  ->n + 1;.      i
10990 66 28 20 70 2d 3e 62 52 65 63 75 72 73 69 76 65  f( p->bRecursive
109a0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65   ){.        p->e
109b0 54 79 70 65 20 3d 20 70 2d 3e 73 50 61 72 73 65  Type = p->sParse
109c0 2e 61 4e 6f 64 65 5b 70 2d 3e 73 50 61 72 73 65  .aNode[p->sParse
109d0 2e 61 55 70 5b 70 2d 3e 69 5d 5d 2e 65 54 79 70  .aUp[p->i]].eTyp
109e0 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
109f0 2d 3e 69 3e 30 20 26 26 20 28 70 2d 3e 73 50 61  ->i>0 && (p->sPa
10a00 72 73 65 2e 61 4e 6f 64 65 5b 70 2d 3e 69 2d 31  rse.aNode[p->i-1
10a10 5d 2e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44  ].jnFlags & JNOD
10a20 45 5f 4c 41 42 45 4c 29 21 3d 30 20 29 7b 0a 20  E_LABEL)!=0 ){. 
10a30 20 20 20 20 20 20 20 20 20 70 2d 3e 69 2d 2d 3b           p->i--;
10a40 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10a50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
10a60 70 2d 3e 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  p->i++;.      }.
10a70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10a80 20 70 2d 3e 69 45 6e 64 20 3d 20 70 2d 3e 69 2b   p->iEnd = p->i+
10a90 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
10aa0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10ab0 0a 7d 0a 0a 2f 2a 20 54 68 65 20 6d 65 74 68 6f  .}../* The metho
10ac0 64 73 20 6f 66 20 74 68 65 20 6a 73 6f 6e 5f 65  ds of the json_e
10ad0 61 63 68 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ach virtual tabl
10ae0 65 20 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69  e */.static sqli
10af0 74 65 33 5f 6d 6f 64 75 6c 65 20 6a 73 6f 6e 45  te3_module jsonE
10b00 61 63 68 4d 6f 64 75 6c 65 20 3d 20 7b 0a 20 20  achModule = {.  
10b10 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
10b20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56             /* iV
10b30 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20  ersion */.  0,  
10b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b50 20 20 20 20 20 20 20 2f 2a 20 78 43 72 65 61 74         /* xCreat
10b60 65 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 43  e */.  jsonEachC
10b70 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20 20  onnect,         
10b80 20 20 2f 2a 20 78 43 6f 6e 6e 65 63 74 20 2a 2f    /* xConnect */
10b90 0a 20 20 6a 73 6f 6e 45 61 63 68 42 65 73 74 49  .  jsonEachBestI
10ba0 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 2f 2a  ndex,         /*
10bb0 20 78 42 65 73 74 49 6e 64 65 78 20 2a 2f 0a 20   xBestIndex */. 
10bc0 20 6a 73 6f 6e 45 61 63 68 44 69 73 63 6f 6e 6e   jsonEachDisconn
10bd0 65 63 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 78  ect,        /* x
10be0 44 69 73 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20  Disconnect */.  
10bf0 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
10c00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
10c10 65 73 74 72 6f 79 20 2a 2f 0a 20 20 6a 73 6f 6e  estroy */.  json
10c20 45 61 63 68 4f 70 65 6e 45 61 63 68 2c 20 20 20  EachOpenEach,   
10c30 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20         /* xOpen 
10c40 2d 20 6f 70 65 6e 20 61 20 63 75 72 73 6f 72 20  - open a cursor 
10c50 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 43 6c 6f  */.  jsonEachClo
10c60 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
10c70 2f 2a 20 78 43 6c 6f 73 65 20 2d 20 63 6c 6f 73  /* xClose - clos
10c80 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  e a cursor */.  
10c90 6a 73 6f 6e 45 61 63 68 46 69 6c 74 65 72 2c 20  jsonEachFilter, 
10ca0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
10cb0 69 6c 74 65 72 20 2d 20 63 6f 6e 66 69 67 75 72  ilter - configur
10cc0 65 20 73 63 61 6e 20 63 6f 6e 73 74 72 61 69 6e  e scan constrain
10cd0 74 73 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68  ts */.  jsonEach
10ce0 4e 65 78 74 2c 20 20 20 20 20 20 20 20 20 20 20  Next,           
10cf0 20 20 20 2f 2a 20 78 4e 65 78 74 20 2d 20 61 64     /* xNext - ad
10d00 76 61 6e 63 65 20 61 20 63 75 72 73 6f 72 20 2a  vance a cursor *
10d10 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 45 6f 66 2c  /.  jsonEachEof,
10d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10d30 2a 20 78 45 6f 66 20 2d 20 63 68 65 63 6b 20 66  * xEof - check f
10d40 6f 72 20 65 6e 64 20 6f 66 20 73 63 61 6e 20 2a  or end of scan *
10d50 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 43 6f 6c 75  /.  jsonEachColu
10d60 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  mn,            /
10d70 2a 20 78 43 6f 6c 75 6d 6e 20 2d 20 72 65 61 64  * xColumn - read
10d80 20 64 61 74 61 20 2a 2f 0a 20 20 6a 73 6f 6e 45   data */.  jsonE
10d90 61 63 68 52 6f 77 69 64 2c 20 20 20 20 20 20 20  achRowid,       
10da0 20 20 20 20 20 20 2f 2a 20 78 52 6f 77 69 64 20        /* xRowid 
10db0 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f 0a 20  - read data */. 
10dc0 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
10dd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
10de0 55 70 64 61 74 65 20 2a 2f 0a 20 20 30 2c 20 20  Update */.  0,  
10df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e00 20 20 20 20 20 20 20 2f 2a 20 78 42 65 67 69 6e         /* xBegin
10e10 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
10e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e30 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20 30   /* xSync */.  0
10e40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10e50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f            /* xCo
10e60 6d 6d 69 74 20 2a 2f 0a 20 20 30 2c 20 20 20 20  mmit */.  0,    
10e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e80 20 20 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63       /* xRollbac
10e90 6b 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  k */.  0,       
10ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10eb0 20 20 2f 2a 20 78 46 69 6e 64 4d 65 74 68 6f 64    /* xFindMethod
10ec0 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
10ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ee0 20 2f 2a 20 78 52 65 6e 61 6d 65 20 2a 2f 0a 20   /* xRename */. 
10ef0 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
10f00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
10f10 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 30  Savepoint */.  0
10f20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10f30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65            /* xRe
10f40 6c 65 61 73 65 20 2a 2f 0a 20 20 30 2c 20 20 20  lease */.  0,   
10f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f60 20 20 20 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61        /* xRollba
10f70 63 6b 54 6f 20 2a 2f 0a 20 20 30 20 20 20 20 20  ckTo */.  0     
10f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f90 20 20 20 20 20 2f 2a 20 78 53 68 61 64 6f 77 4e       /* xShadowN
10fa0 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68  ame */.};../* Th
10fb0 65 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65  e methods of the
10fc0 20 6a 73 6f 6e 5f 74 72 65 65 20 76 69 72 74 75   json_tree virtu
10fd0 61 6c 20 74 61 62 6c 65 2e 20 2a 2f 0a 73 74 61  al table. */.sta
10fe0 74 69 63 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75  tic sqlite3_modu
10ff0 6c 65 20 6a 73 6f 6e 54 72 65 65 4d 6f 64 75 6c  le jsonTreeModul
11000 65 20 3d 20 7b 0a 20 20 30 2c 20 20 20 20 20 20  e = {.  0,      
11010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11020 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
11030 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
11040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11050 2a 20 78 43 72 65 61 74 65 20 2a 2f 0a 20 20 6a  * xCreate */.  j
11060 73 6f 6e 45 61 63 68 43 6f 6e 6e 65 63 74 2c 20  sonEachConnect, 
11070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f            /* xCo
11080 6e 6e 65 63 74 20 2a 2f 0a 20 20 6a 73 6f 6e 45  nnect */.  jsonE
11090 61 63 68 42 65 73 74 49 6e 64 65 78 2c 20 20 20  achBestIndex,   
110a0 20 20 20 20 20 20 2f 2a 20 78 42 65 73 74 49 6e        /* xBestIn
110b0 64 65 78 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63  dex */.  jsonEac
110c0 68 44 69 73 63 6f 6e 6e 65 63 74 2c 20 20 20 20  hDisconnect,    
110d0 20 20 20 20 2f 2a 20 78 44 69 73 63 6f 6e 6e 65      /* xDisconne
110e0 63 74 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  ct */.  0,      
110f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11100 20 20 20 2f 2a 20 78 44 65 73 74 72 6f 79 20 2a     /* xDestroy *
11110 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 4f 70 65 6e  /.  jsonEachOpen
11120 54 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f  Tree,          /
11130 2a 20 78 4f 70 65 6e 20 2d 20 6f 70 65 6e 20 61  * xOpen - open a
11140 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 6a 73 6f   cursor */.  jso
11150 6e 45 61 63 68 43 6c 6f 73 65 2c 20 20 20 20 20  nEachClose,     
11160 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
11170 65 20 2d 20 63 6c 6f 73 65 20 61 20 63 75 72 73  e - close a curs
11180 6f 72 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68  or */.  jsonEach
11190 46 69 6c 74 65 72 2c 20 20 20 20 20 20 20 20 20  Filter,         
111a0 20 20 20 2f 2a 20 78 46 69 6c 74 65 72 20 2d 20     /* xFilter - 
111b0 63 6f 6e 66 69 67 75 72 65 20 73 63 61 6e 20 63  configure scan c
111c0 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
111d0 6a 73 6f 6e 45 61 63 68 4e 65 78 74 2c 20 20 20  jsonEachNext,   
111e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4e             /* xN
111f0 65 78 74 20 2d 20 61 64 76 61 6e 63 65 20 61 20  ext - advance a 
11200 63 75 72 73 6f 72 20 2a 2f 0a 20 20 6a 73 6f 6e  cursor */.  json
11210 45 61 63 68 45 6f 66 2c 20 20 20 20 20 20 20 20  EachEof,        
11220 20 20 20 20 20 20 20 2f 2a 20 78 45 6f 66 20 2d         /* xEof -
11230 20 63 68 65 63 6b 20 66 6f 72 20 65 6e 64 20 6f   check for end o
11240 66 20 73 63 61 6e 20 2a 2f 0a 20 20 6a 73 6f 6e  f scan */.  json
11250 45 61 63 68 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  EachColumn,     
11260 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6c 75 6d         /* xColum
11270 6e 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f  n - read data */
11280 0a 20 20 6a 73 6f 6e 45 61 63 68 52 6f 77 69 64  .  jsonEachRowid
11290 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
112a0 20 78 52 6f 77 69 64 20 2d 20 72 65 61 64 20 64   xRowid - read d
112b0 61 74 61 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  ata */.  0,     
112c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112d0 20 20 20 20 2f 2a 20 78 55 70 64 61 74 65 20 2a      /* xUpdate *
112e0 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
112f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11300 2a 20 78 42 65 67 69 6e 20 2a 2f 0a 20 20 30 2c  * xBegin */.  0,
11310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11320 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e           /* xSyn
11330 63 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  c */.  0,       
11340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11350 20 20 2f 2a 20 78 43 6f 6d 6d 69 74 20 2a 2f 0a    /* xCommit */.
11360 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
11370 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11380 78 52 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 30  xRollback */.  0
11390 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
113a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
113b0 6e 64 4d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 2c  ndMethod */.  0,
113c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113d0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 6e           /* xRen
113e0 61 6d 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  ame */.  0,     
113f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11400 20 20 20 20 2f 2a 20 78 53 61 76 65 70 6f 69 6e      /* xSavepoin
11410 74 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  t */.  0,       
11420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11430 20 20 2f 2a 20 78 52 65 6c 65 61 73 65 20 2a 2f    /* xRelease */
11440 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
11450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11460 20 78 52 6f 6c 6c 62 61 63 6b 54 6f 20 2a 2f 0a   xRollbackTo */.
11470 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
11480 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11490 78 53 68 61 64 6f 77 4e 61 6d 65 20 2a 2f 0a 7d  xShadowName */.}
114a0 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
114b0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
114c0 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ABLE */../******
114d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
114e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
114f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11510 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  ******.** The fo
11520 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73  llowing routines
11530 20 61 72 65 20 74 68 65 20 6f 6e 6c 79 20 70 75   are the only pu
11540 62 6c 69 63 61 6c 6c 79 20 76 69 73 69 62 6c 65  blically visible
11550 20 69 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20   identifiers in 
11560 74 68 69 73 0a 2a 2a 20 66 69 6c 65 2e 20 20 43  this.** file.  C
11570 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  all the followin
11580 67 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 6f 72  g routines in or
11590 64 65 72 20 74 6f 20 72 65 67 69 73 74 65 72 20  der to register 
115a0 74 68 65 20 76 61 72 69 6f 75 73 20 53 51 4c 0a  the various SQL.
115b0 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64  ** functions and
115c0 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
115d0 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  le implemented b
115e0 79 20 74 68 69 73 20 66 69 6c 65 2e 0a 2a 2a 2a  y this file..***
115f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 69 6e 74 20  *********/..int 
11640 73 71 6c 69 74 65 33 4a 73 6f 6e 31 49 6e 69 74  sqlite3Json1Init
11650 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
11660 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
11670 5f 4f 4b 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  _OK;.  unsigned 
11680 69 6e 74 20 69 3b 0a 20 20 73 74 61 74 69 63 20  int i;.  static 
11690 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20  const struct {. 
116a0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
116b0 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 69 6e 74 20  zName;.     int 
116c0 6e 41 72 67 3b 0a 20 20 20 20 20 69 6e 74 20 66  nArg;.     int f
116d0 6c 61 67 3b 0a 20 20 20 20 20 76 6f 69 64 20 28  lag;.     void (
116e0 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f  *xFunc)(sqlite3_
116f0 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
11700 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 3b 0a 20  ite3_value**);. 
11710 20 7d 20 61 46 75 6e 63 5b 5d 20 3d 20 7b 0a 20   } aFunc[] = {. 
11720 20 20 20 7b 20 22 6a 73 6f 6e 22 2c 20 20 20 20     { "json",    
11730 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20               1, 
11740 30 2c 20 20 20 6a 73 6f 6e 52 65 6d 6f 76 65 46  0,   jsonRemoveF
11750 75 6e 63 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  unc        },.  
11760 20 20 7b 20 22 6a 73 6f 6e 5f 61 72 72 61 79 22    { "json_array"
11770 2c 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 30  ,          -1, 0
11780 2c 20 20 20 6a 73 6f 6e 41 72 72 61 79 46 75 6e  ,   jsonArrayFun
11790 63 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  c         },.   
117a0 20 7b 20 22 6a 73 6f 6e 5f 61 72 72 61 79 5f 6c   { "json_array_l
117b0 65 6e 67 74 68 22 2c 20 20 20 20 31 2c 20 30 2c  ength",    1, 0,
117c0 20 20 20 6a 73 6f 6e 41 72 72 61 79 4c 65 6e 67     jsonArrayLeng
117d0 74 68 46 75 6e 63 20 20 20 7d 2c 0a 20 20 20 20  thFunc   },.    
117e0 7b 20 22 6a 73 6f 6e 5f 61 72 72 61 79 5f 6c 65  { "json_array_le
117f0 6e 67 74 68 22 2c 20 20 20 20 32 2c 20 30 2c 20  ngth",    2, 0, 
11800 20 20 6a 73 6f 6e 41 72 72 61 79 4c 65 6e 67 74    jsonArrayLengt
11810 68 46 75 6e 63 20 20 20 7d 2c 0a 20 20 20 20 7b  hFunc   },.    {
11820 20 22 6a 73 6f 6e 5f 65 78 74 72 61 63 74 22 2c   "json_extract",
11830 20 20 20 20 20 20 20 20 2d 31 2c 20 30 2c 20 20          -1, 0,  
11840 20 6a 73 6f 6e 45 78 74 72 61 63 74 46 75 6e 63   jsonExtractFunc
11850 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
11860 22 6a 73 6f 6e 5f 69 6e 73 65 72 74 22 2c 20 20  "json_insert",  
11870 20 20 20 20 20 20 20 2d 31 2c 20 30 2c 20 20 20         -1, 0,   
11880 6a 73 6f 6e 53 65 74 46 75 6e 63 20 20 20 20 20  jsonSetFunc     
11890 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
118a0 6a 73 6f 6e 5f 6f 62 6a 65 63 74 22 2c 20 20 20  json_object",   
118b0 20 20 20 20 20 20 2d 31 2c 20 30 2c 20 20 20 6a        -1, 0,   j
118c0 73 6f 6e 4f 62 6a 65 63 74 46 75 6e 63 20 20 20  sonObjectFunc   
118d0 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a       },.    { "j
118e0 73 6f 6e 5f 70 61 74 63 68 22 2c 20 20 20 20 20  son_patch",     
118f0 20 20 20 20 20 20 32 2c 20 30 2c 20 20 20 6a 73        2, 0,   js
11900 6f 6e 50 61 74 63 68 46 75 6e 63 20 20 20 20 20  onPatchFunc     
11910 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73      },.    { "js
11920 6f 6e 5f 71 75 6f 74 65 22 2c 20 20 20 20 20 20  on_quote",      
11930 20 20 20 20 20 31 2c 20 30 2c 20 20 20 6a 73 6f       1, 0,   jso
11940 6e 51 75 6f 74 65 46 75 6e 63 20 20 20 20 20 20  nQuoteFunc      
11950 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f     },.    { "jso
11960 6e 5f 72 65 6d 6f 76 65 22 2c 20 20 20 20 20 20  n_remove",      
11970 20 20 20 2d 31 2c 20 30 2c 20 20 20 6a 73 6f 6e     -1, 0,   json
11980 52 65 6d 6f 76 65 46 75 6e 63 20 20 20 20 20 20  RemoveFunc      
11990 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e    },.    { "json
119a0 5f 72 65 70 6c 61 63 65 22 2c 20 20 20 20 20 20  _replace",      
119b0 20 20 2d 31 2c 20 30 2c 20 20 20 6a 73 6f 6e 52    -1, 0,   jsonR
119c0 65 70 6c 61 63 65 46 75 6e 63 20 20 20 20 20 20  eplaceFunc      
119d0 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f   },.    { "json_
119e0 73 65 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  set",           
119f0 20 2d 31 2c 20 31 2c 20 20 20 6a 73 6f 6e 53 65   -1, 1,   jsonSe
11a00 74 46 75 6e 63 20 20 20 20 20 20 20 20 20 20 20  tFunc           
11a10 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 74  },.    { "json_t
11a20 79 70 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ype",           
11a30 20 31 2c 20 30 2c 20 20 20 6a 73 6f 6e 54 79 70   1, 0,   jsonTyp
11a40 65 46 75 6e 63 20 20 20 20 20 20 20 20 20 20 7d  eFunc          }
11a50 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 74 79  ,.    { "json_ty
11a60 70 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  pe",            
11a70 32 2c 20 30 2c 20 20 20 6a 73 6f 6e 54 79 70 65  2, 0,   jsonType
11a80 46 75 6e 63 20 20 20 20 20 20 20 20 20 20 7d 2c  Func          },
11a90 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 76 61 6c  .    { "json_val
11aa0 69 64 22 2c 20 20 20 20 20 20 20 20 20 20 20 31  id",           1
11ab0 2c 20 30 2c 20 20 20 6a 73 6f 6e 56 61 6c 69 64  , 0,   jsonValid
11ac0 46 75 6e 63 20 20 20 20 20 20 20 20 20 7d 2c 0a  Func         },.
11ad0 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55  .#if SQLITE_DEBU
11ae0 47 0a 20 20 20 20 2f 2a 20 44 45 42 55 47 20 61  G.    /* DEBUG a
11af0 6e 64 20 54 45 53 54 49 4e 47 20 66 75 6e 63 74  nd TESTING funct
11b00 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 7b 20 22 6a  ions */.    { "j
11b10 73 6f 6e 5f 70 61 72 73 65 22 2c 20 20 20 20 20  son_parse",     
11b20 20 20 20 20 20 20 31 2c 20 30 2c 20 20 20 6a 73        1, 0,   js
11b30 6f 6e 50 61 72 73 65 46 75 6e 63 20 20 20 20 20  onParseFunc     
11b40 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73      },.    { "js
11b50 6f 6e 5f 74 65 73 74 31 22 2c 20 20 20 20 20 20  on_test1",      
11b60 20 20 20 20 20 31 2c 20 30 2c 20 20 20 6a 73 6f       1, 0,   jso
11b70 6e 54 65 73 74 31 46 75 6e 63 20 20 20 20 20 20  nTest1Func      
11b80 20 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 7d     },.#endif.  }
11b90 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
11ba0 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 63   struct {.     c
11bb0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
11bc0 3b 0a 20 20 20 20 20 69 6e 74 20 6e 41 72 67 3b  ;.     int nArg;
11bd0 0a 20 20 20 20 20 76 6f 69 64 20 28 2a 78 53 74  .     void (*xSt
11be0 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ep)(sqlite3_cont
11bf0 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
11c00 5f 76 61 6c 75 65 2a 2a 29 3b 0a 20 20 20 20 20  _value**);.     
11c10 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73  void (*xFinal)(s
11c20 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29  qlite3_context*)
11c30 3b 0a 20 20 20 20 20 76 6f 69 64 20 28 2a 78 56  ;.     void (*xV
11c40 61 6c 75 65 29 28 73 71 6c 69 74 65 33 5f 63 6f  alue)(sqlite3_co
11c50 6e 74 65 78 74 2a 29 3b 0a 20 20 7d 20 61 41 67  ntext*);.  } aAg
11c60 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 6a  g[] = {.    { "j
11c70 73 6f 6e 5f 67 72 6f 75 70 5f 61 72 72 61 79 22  son_group_array"
11c80 2c 20 20 20 20 20 31 2c 0a 20 20 20 20 20 20 6a  ,     1,.      j
11c90 73 6f 6e 41 72 72 61 79 53 74 65 70 2c 20 20 20  sonArrayStep,   
11ca0 6a 73 6f 6e 41 72 72 61 79 46 69 6e 61 6c 2c 20  jsonArrayFinal, 
11cb0 20 6a 73 6f 6e 41 72 72 61 79 56 61 6c 75 65 20   jsonArrayValue 
11cc0 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f   },.    { "json_
11cd0 67 72 6f 75 70 5f 6f 62 6a 65 63 74 22 2c 20 20  group_object",  
11ce0 20 20 32 2c 0a 20 20 20 20 20 20 6a 73 6f 6e 4f    2,.      jsonO
11cf0 62 6a 65 63 74 53 74 65 70 2c 20 20 6a 73 6f 6e  bjectStep,  json
11d00 4f 62 6a 65 63 74 46 69 6e 61 6c 2c 20 6a 73 6f  ObjectFinal, jso
11d10 6e 4f 62 6a 65 63 74 56 61 6c 75 65 20 7d 2c 0a  nObjectValue },.
11d20 20 20 7d 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c    };.#ifndef SQL
11d30 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
11d40 54 41 42 4c 45 0a 20 20 73 74 61 74 69 63 20 63  TABLE.  static c
11d50 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20  onst struct {.  
11d60 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
11d70 4e 61 6d 65 3b 0a 20 20 20 20 20 73 71 6c 69 74  Name;.     sqlit
11d80 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75  e3_module *pModu
11d90 6c 65 3b 0a 20 20 7d 20 61 4d 6f 64 5b 5d 20 3d  le;.  } aMod[] =
11da0 20 7b 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 65   {.    { "json_e
11db0 61 63 68 22 2c 20 20 20 20 20 20 20 20 20 20 20  ach",           
11dc0 20 26 6a 73 6f 6e 45 61 63 68 4d 6f 64 75 6c 65   &jsonEachModule
11dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
11de0 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 74 72  ,.    { "json_tr
11df0 65 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ee",            
11e00 26 6a 73 6f 6e 54 72 65 65 4d 6f 64 75 6c 65 20  &jsonTreeModule 
11e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
11e20 0a 20 20 7d 3b 0a 23 65 6e 64 69 66 0a 20 20 66  .  };.#endif.  f
11e30 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
11e40 28 61 46 75 6e 63 29 2f 73 69 7a 65 6f 66 28 61  (aFunc)/sizeof(a
11e50 46 75 6e 63 5b 30 5d 29 20 26 26 20 72 63 3d 3d  Func[0]) && rc==
11e60 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b  SQLITE_OK; i++){
11e70 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
11e80 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
11e90 6e 28 64 62 2c 20 61 46 75 6e 63 5b 69 5d 2e 7a  n(db, aFunc[i].z
11ea0 4e 61 6d 65 2c 20 61 46 75 6e 63 5b 69 5d 2e 6e  Name, aFunc[i].n
11eb0 41 72 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Arg,.           
11ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ed0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46        SQLITE_UTF
11ee0 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
11ef0 4d 49 4e 49 53 54 49 43 2c 20 0a 20 20 20 20 20  MINISTIC, .     
11f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f10 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
11f20 64 2a 29 26 61 46 75 6e 63 5b 69 5d 2e 66 6c 61  d*)&aFunc[i].fla
11f30 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  g,.             
11f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f50 20 20 20 20 61 46 75 6e 63 5b 69 5d 2e 78 46 75      aFunc[i].xFu
11f60 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23  nc, 0, 0);.  }.#
11f70 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11f80 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20  IT_WINDOWFUNC.  
11f90 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
11fa0 66 28 61 41 67 67 29 2f 73 69 7a 65 6f 66 28 61  f(aAgg)/sizeof(a
11fb0 41 67 67 5b 30 5d 29 20 26 26 20 72 63 3d 3d 53  Agg[0]) && rc==S
11fc0 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a  QLITE_OK; i++){.
11fd0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11fe0 5f 63 72 65 61 74 65 5f 77 69 6e 64 6f 77 5f 66  _create_window_f
11ff0 75 6e 63 74 69 6f 6e 28 64 62 2c 20 61 41 67 67  unction(db, aAgg
12000 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 61 41 67 67 5b  [i].zName, aAgg[
12010 69 5d 2e 6e 41 72 67 2c 0a 20 20 20 20 20 20 20  i].nArg,.       
12020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12030 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
12040 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
12050 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c  ETERMINISTIC, 0,
12060 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12080 20 20 61 41 67 67 5b 69 5d 2e 78 53 74 65 70 2c    aAgg[i].xStep,
12090 20 61 41 67 67 5b 69 5d 2e 78 46 69 6e 61 6c 2c   aAgg[i].xFinal,
120a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
120b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120c0 20 20 61 41 67 67 5b 69 5d 2e 78 56 61 6c 75 65    aAgg[i].xValue
120d0 2c 20 6a 73 6f 6e 47 72 6f 75 70 49 6e 76 65 72  , jsonGroupInver
120e0 73 65 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64  se, 0);.  }.#end
120f0 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  if.#ifndef SQLIT
12100 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
12110 42 4c 45 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  BLE.  for(i=0; i
12120 3c 73 69 7a 65 6f 66 28 61 4d 6f 64 29 2f 73 69  <sizeof(aMod)/si
12130 7a 65 6f 66 28 61 4d 6f 64 5b 30 5d 29 20 26 26  zeof(aMod[0]) &&
12140 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
12150 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  i++){.    rc = s
12160 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 6d 6f  qlite3_create_mo
12170 64 75 6c 65 28 64 62 2c 20 61 4d 6f 64 5b 69 5d  dule(db, aMod[i]
12180 2e 7a 4e 61 6d 65 2c 20 61 4d 6f 64 5b 69 5d 2e  .zName, aMod[i].
12190 70 4d 6f 64 75 6c 65 2c 20 30 29 3b 0a 20 20 7d  pModule, 0);.  }
121a0 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
121b0 20 72 63 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66   rc;.}...#ifndef
121c0 20 53 51 4c 49 54 45 5f 43 4f 52 45 0a 23 69 66   SQLITE_CORE.#if
121d0 64 65 66 20 5f 57 49 4e 33 32 0a 5f 5f 64 65 63  def _WIN32.__dec
121e0 6c 73 70 65 63 28 64 6c 6c 65 78 70 6f 72 74 29  lspec(dllexport)
121f0 0a 23 65 6e 64 69 66 0a 69 6e 74 20 73 71 6c 69  .#endif.int sqli
12200 74 65 33 5f 6a 73 6f 6e 5f 69 6e 69 74 28 0a 20  te3_json_init(. 
12210 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20   sqlite3 *db, . 
12220 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67   char **pzErrMsg
12230 2c 20 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  , .  const sqlit
12240 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 20  e3_api_routines 
12250 2a 70 41 70 69 0a 29 7b 0a 20 20 53 51 4c 49 54  *pApi.){.  SQLIT
12260 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54  E_EXTENSION_INIT
12270 32 28 70 41 70 69 29 3b 0a 20 20 28 76 6f 69 64  2(pApi);.  (void
12280 29 70 7a 45 72 72 4d 73 67 3b 20 20 2f 2a 20 55  )pzErrMsg;  /* U
12290 6e 75 73 65 64 20 70 61 72 61 6d 65 74 65 72 20  nused parameter 
122a0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  */.  return sqli
122b0 74 65 33 4a 73 6f 6e 31 49 6e 69 74 28 64 62 29  te3Json1Init(db)
122c0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69  ;.}.#endif.#endi
122d0 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
122e0 4c 49 54 45 5f 43 4f 52 45 29 20 7c 7c 20 64 65  LITE_CORE) || de
122f0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
12300 42 4c 45 5f 4a 53 4f 4e 31 29 20 2a 2f 0a        BLE_JSON1) */.