/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 92b9e404bd79cc76d3ef2b3a9e37bf775700f7d645466fd41d2e8742e3fa16fb:


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 63 68 61 72  ef unsigned char
0da0: 20 75 38 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20   u8;.#endif../* 
0db0: 4f 62 6a 65 63 74 73 20 2a 2f 0a 74 79 70 65 64  Objects */.typed
0dc0: 65 66 20 73 74 72 75 63 74 20 4a 73 6f 6e 53 74  ef struct JsonSt
0dd0: 72 69 6e 67 20 4a 73 6f 6e 53 74 72 69 6e 67 3b  ring JsonString;
0de0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0df0: 4a 73 6f 6e 4e 6f 64 65 20 4a 73 6f 6e 4e 6f 64  JsonNode JsonNod
0e00: 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  e;.typedef struc
0e10: 74 20 4a 73 6f 6e 50 61 72 73 65 20 4a 73 6f 6e  t JsonParse Json
0e20: 50 61 72 73 65 3b 0a 0a 2f 2a 20 41 6e 20 69 6e  Parse;../* An in
0e30: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f  stance of this o
0e40: 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74 73  bject represents
0e50: 20 61 20 4a 53 4f 4e 20 73 74 72 69 6e 67 0a 2a   a JSON string.*
0e60: 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  * under construc
0e70: 74 69 6f 6e 2e 20 20 52 65 61 6c 6c 79 2c 20 74  tion.  Really, t
0e80: 68 69 73 20 69 73 20 61 20 67 65 6e 65 72 69 63  his is a generic
0e90: 20 73 74 72 69 6e 67 20 61 63 63 75 6d 75 6c 61   string accumula
0ea0: 74 6f 72 0a 2a 2a 20 74 68 61 74 20 63 61 6e 20  tor.** that can 
0eb0: 62 65 20 61 6e 64 20 69 73 20 75 73 65 64 20 74  be and is used t
0ec0: 6f 20 63 72 65 61 74 65 20 73 74 72 69 6e 67 73  o create strings
0ed0: 20 6f 74 68 65 72 20 74 68 61 6e 20 4a 53 4f 4e   other than JSON
0ee0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 4a 73 6f 6e  ..*/.struct Json
0ef0: 53 74 72 69 6e 67 20 7b 0a 20 20 73 71 6c 69 74  String {.  sqlit
0f00: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
0f10: 3b 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20  ;   /* Function 
0f20: 63 6f 6e 74 65 78 74 20 2d 20 70 75 74 20 65 72  context - put er
0f30: 72 6f 72 20 6d 65 73 73 61 67 65 73 20 68 65 72  ror messages her
0f40: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 42 75  e */.  char *zBu
0f50: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
0f60: 2f 2a 20 41 70 70 65 6e 64 20 4a 53 4f 4e 20 63  /* Append JSON c
0f70: 6f 6e 74 65 6e 74 20 68 65 72 65 20 2a 2f 0a 20  ontent here */. 
0f80: 20 75 36 34 20 6e 41 6c 6c 6f 63 3b 20 20 20 20   u64 nAlloc;    
0f90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
0fa0: 65 73 20 6f 66 20 73 74 6f 72 61 67 65 20 61 76  es of storage av
0fb0: 61 69 6c 61 62 6c 65 20 69 6e 20 7a 42 75 66 5b  ailable in zBuf[
0fc0: 5d 20 2a 2f 0a 20 20 75 36 34 20 6e 55 73 65 64  ] */.  u64 nUsed
0fd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0fe0: 2f 2a 20 42 79 74 65 73 20 6f 66 20 7a 42 75 66  /* Bytes of zBuf
0ff0: 5b 5d 20 63 75 72 72 65 6e 74 6c 79 20 75 73 65  [] currently use
1000: 64 20 2a 2f 0a 20 20 75 38 20 62 53 74 61 74 69  d */.  u8 bStati
1010: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1020: 2f 2a 20 54 72 75 65 20 69 66 20 7a 42 75 66 20  /* True if zBuf 
1030: 69 73 20 73 74 61 74 69 63 20 73 70 61 63 65 20  is static space 
1040: 2a 2f 0a 20 20 75 38 20 62 45 72 72 3b 20 20 20  */.  u8 bErr;   
1050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1060: 20 54 72 75 65 20 69 66 20 61 6e 20 65 72 72 6f   True if an erro
1070: 72 20 68 61 73 20 62 65 65 6e 20 65 6e 63 6f 75  r has been encou
1080: 6e 74 65 72 65 64 20 2a 2f 0a 20 20 63 68 61 72  ntered */.  char
1090: 20 7a 53 70 61 63 65 5b 31 30 30 5d 3b 20 20 20   zSpace[100];   
10a0: 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20       /* Initial 
10b0: 73 74 61 74 69 63 20 73 70 61 63 65 20 2a 2f 0a  static space */.
10c0: 7d 3b 0a 0a 2f 2a 20 4a 53 4f 4e 20 74 79 70 65  };../* JSON type
10d0: 20 76 61 6c 75 65 73 0a 2a 2f 0a 23 64 65 66 69   values.*/.#defi
10e0: 6e 65 20 4a 53 4f 4e 5f 4e 55 4c 4c 20 20 20 20  ne JSON_NULL    
10f0: 20 30 0a 23 64 65 66 69 6e 65 20 4a 53 4f 4e 5f   0.#define JSON_
1100: 54 52 55 45 20 20 20 20 20 31 0a 23 64 65 66 69  TRUE     1.#defi
1110: 6e 65 20 4a 53 4f 4e 5f 46 41 4c 53 45 20 20 20  ne JSON_FALSE   
1120: 20 32 0a 23 64 65 66 69 6e 65 20 4a 53 4f 4e 5f   2.#define JSON_
1130: 49 4e 54 20 20 20 20 20 20 33 0a 23 64 65 66 69  INT      3.#defi
1140: 6e 65 20 4a 53 4f 4e 5f 52 45 41 4c 20 20 20 20  ne JSON_REAL    
1150: 20 34 0a 23 64 65 66 69 6e 65 20 4a 53 4f 4e 5f   4.#define JSON_
1160: 53 54 52 49 4e 47 20 20 20 35 0a 23 64 65 66 69  STRING   5.#defi
1170: 6e 65 20 4a 53 4f 4e 5f 41 52 52 41 59 20 20 20  ne JSON_ARRAY   
1180: 20 36 0a 23 64 65 66 69 6e 65 20 4a 53 4f 4e 5f   6.#define JSON_
1190: 4f 42 4a 45 43 54 20 20 20 37 0a 0a 2f 2a 20 54  OBJECT   7../* T
11a0: 68 65 20 22 73 75 62 74 79 70 65 22 20 73 65 74  he "subtype" set
11b0: 20 66 6f 72 20 4a 53 4f 4e 20 76 61 6c 75 65 73   for JSON values
11c0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 53 4f 4e   */.#define JSON
11d0: 5f 53 55 42 54 59 50 45 20 20 37 34 20 20 20 20  _SUBTYPE  74    
11e0: 2f 2a 20 41 73 63 69 69 20 66 6f 72 20 22 4a 22  /* Ascii for "J"
11f0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 73   */../*.** Names
1200: 20 6f 66 20 74 68 65 20 76 61 72 69 6f 75 73 20   of the various 
1210: 4a 53 4f 4e 20 74 79 70 65 73 3a 0a 2a 2f 0a 73  JSON types:.*/.s
1220: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
1230: 20 2a 20 63 6f 6e 73 74 20 6a 73 6f 6e 54 79 70   * const jsonTyp
1240: 65 5b 5d 20 3d 20 7b 0a 20 20 22 6e 75 6c 6c 22  e[] = {.  "null"
1250: 2c 20 22 74 72 75 65 22 2c 20 22 66 61 6c 73 65  , "true", "false
1260: 22 2c 20 22 69 6e 74 65 67 65 72 22 2c 20 22 72  ", "integer", "r
1270: 65 61 6c 22 2c 20 22 74 65 78 74 22 2c 20 22 61  eal", "text", "a
1280: 72 72 61 79 22 2c 20 22 6f 62 6a 65 63 74 22 0a  rray", "object".
1290: 7d 3b 0a 0a 2f 2a 20 42 69 74 20 76 61 6c 75 65  };../* Bit value
12a0: 73 20 66 6f 72 20 74 68 65 20 4a 73 6f 6e 4e 6f  s for the JsonNo
12b0: 64 65 2e 6a 6e 46 6c 61 67 20 66 69 65 6c 64 0a  de.jnFlag field.
12c0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4e 4f 44 45  */.#define JNODE
12d0: 5f 52 41 57 20 20 20 20 20 30 78 30 31 20 20 20  _RAW     0x01   
12e0: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74        /* Content
12f0: 20 69 73 20 72 61 77 2c 20 6e 6f 74 20 4a 53 4f   is raw, not JSO
1300: 4e 20 65 6e 63 6f 64 65 64 20 2a 2f 0a 23 64 65  N encoded */.#de
1310: 66 69 6e 65 20 4a 4e 4f 44 45 5f 45 53 43 41 50  fine JNODE_ESCAP
1320: 45 20 20 30 78 30 32 20 20 20 20 20 20 20 20 20  E  0x02         
1330: 2f 2a 20 43 6f 6e 74 65 6e 74 20 69 73 20 74 65  /* Content is te
1340: 78 74 20 77 69 74 68 20 5c 20 65 73 63 61 70 65  xt with \ escape
1350: 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4e 4f  s */.#define JNO
1360: 44 45 5f 52 45 4d 4f 56 45 20 20 30 78 30 34 20  DE_REMOVE  0x04 
1370: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
1380: 74 20 6f 75 74 70 75 74 20 2a 2f 0a 23 64 65 66  t output */.#def
1390: 69 6e 65 20 4a 4e 4f 44 45 5f 52 45 50 4c 41 43  ine JNODE_REPLAC
13a0: 45 20 30 78 30 38 20 20 20 20 20 20 20 20 20 2f  E 0x08         /
13b0: 2a 20 52 65 70 6c 61 63 65 20 77 69 74 68 20 4a  * Replace with J
13c0: 73 6f 6e 4e 6f 64 65 2e 75 2e 69 52 65 70 6c 61  sonNode.u.iRepla
13d0: 63 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4e  ce */.#define JN
13e0: 4f 44 45 5f 50 41 54 43 48 20 20 20 30 78 31 30  ODE_PATCH   0x10
13f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74 63           /* Patc
1400: 68 20 77 69 74 68 20 4a 73 6f 6e 4e 6f 64 65 2e  h with JsonNode.
1410: 75 2e 70 50 61 74 63 68 20 2a 2f 0a 23 64 65 66  u.pPatch */.#def
1420: 69 6e 65 20 4a 4e 4f 44 45 5f 41 50 50 45 4e 44  ine JNODE_APPEND
1430: 20 20 30 78 32 30 20 20 20 20 20 20 20 20 20 2f    0x20         /
1440: 2a 20 4d 6f 72 65 20 41 52 52 41 59 2f 4f 42 4a  * More ARRAY/OBJ
1450: 45 43 54 20 65 6e 74 72 69 65 73 20 61 74 20 75  ECT entries at u
1460: 2e 69 41 70 70 65 6e 64 20 2a 2f 0a 23 64 65 66  .iAppend */.#def
1470: 69 6e 65 20 4a 4e 4f 44 45 5f 4c 41 42 45 4c 20  ine JNODE_LABEL 
1480: 20 20 30 78 34 30 20 20 20 20 20 20 20 20 20 2f    0x40         /
1490: 2a 20 49 73 20 61 20 6c 61 62 65 6c 20 6f 66 20  * Is a label of 
14a0: 61 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 0a 2f  an object */.../
14b0: 2a 20 41 20 73 69 6e 67 6c 65 20 6e 6f 64 65 20  * A single node 
14c0: 6f 66 20 70 61 72 73 65 64 20 4a 53 4f 4e 0a 2a  of parsed JSON.*
14d0: 2f 0a 73 74 72 75 63 74 20 4a 73 6f 6e 4e 6f 64  /.struct JsonNod
14e0: 65 20 7b 0a 20 20 75 38 20 65 54 79 70 65 3b 20  e {.  u8 eType; 
14f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1500: 4f 6e 65 20 6f 66 20 74 68 65 20 4a 53 4f 4e 5f  One of the JSON_
1510: 20 74 79 70 65 20 76 61 6c 75 65 73 20 2a 2f 0a   type values */.
1520: 20 20 75 38 20 6a 6e 46 6c 61 67 73 3b 20 20 20    u8 jnFlags;   
1530: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 4e 4f 44           /* JNOD
1540: 45 20 66 6c 61 67 73 20 2a 2f 0a 20 20 75 33 32  E flags */.  u32
1550: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
1560: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
1570: 63 6f 6e 74 65 6e 74 2c 20 6f 72 20 6e 75 6d 62  content, or numb
1580: 65 72 20 6f 66 20 73 75 62 2d 6e 6f 64 65 73 20  er of sub-nodes 
1590: 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20  */.  union {.   
15a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4a 43   const char *zJC
15b0: 6f 6e 74 65 6e 74 3b 20 2f 2a 20 43 6f 6e 74 65  ontent; /* Conte
15c0: 6e 74 20 66 6f 72 20 49 4e 54 2c 20 52 45 41 4c  nt for INT, REAL
15d0: 2c 20 61 6e 64 20 53 54 52 49 4e 47 20 2a 2f 0a  , and STRING */.
15e0: 20 20 20 20 75 33 32 20 69 41 70 70 65 6e 64 3b      u32 iAppend;
15f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f             /* Mo
1600: 72 65 20 74 65 72 6d 73 20 66 6f 72 20 41 52 52  re terms for ARR
1610: 41 59 20 61 6e 64 20 4f 42 4a 45 43 54 20 2a 2f  AY and OBJECT */
1620: 0a 20 20 20 20 75 33 32 20 69 4b 65 79 3b 20 20  .    u32 iKey;  
1630: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b              /* K
1640: 65 79 20 66 6f 72 20 41 52 52 41 59 20 6f 62 6a  ey for ARRAY obj
1650: 65 63 74 73 20 69 6e 20 6a 73 6f 6e 5f 74 72 65  ects in json_tre
1660: 65 28 29 20 2a 2f 0a 20 20 20 20 75 33 32 20 69  e() */.    u32 i
1670: 52 65 70 6c 61 63 65 3b 20 20 20 20 20 20 20 20  Replace;        
1680: 20 20 2f 2a 20 52 65 70 6c 61 63 65 6d 65 6e 74    /* Replacement
1690: 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 4a 4e 4f   content for JNO
16a0: 44 45 5f 52 45 50 4c 41 43 45 20 2a 2f 0a 20 20  DE_REPLACE */.  
16b0: 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 50 61 74    JsonNode *pPat
16c0: 63 68 3b 20 20 20 20 20 20 2f 2a 20 4e 6f 64 65  ch;      /* Node
16d0: 20 63 68 61 69 6e 20 6f 66 20 70 61 74 63 68 20   chain of patch 
16e0: 66 6f 72 20 4a 4e 4f 44 45 5f 50 41 54 43 48 20  for JNODE_PATCH 
16f0: 2a 2f 0a 20 20 7d 20 75 3b 0a 7d 3b 0a 0a 2f 2a  */.  } u;.};../*
1700: 20 41 20 63 6f 6d 70 6c 65 74 65 6c 79 20 70 61   A completely pa
1710: 72 73 65 64 20 4a 53 4f 4e 20 73 74 72 69 6e 67  rsed JSON string
1720: 0a 2a 2f 0a 73 74 72 75 63 74 20 4a 73 6f 6e 50  .*/.struct JsonP
1730: 61 72 73 65 20 7b 0a 20 20 75 33 32 20 6e 4e 6f  arse {.  u32 nNo
1740: 64 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  de;         /* N
1750: 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 20 6f  umber of slots o
1760: 66 20 61 4e 6f 64 65 5b 5d 20 75 73 65 64 20 2a  f aNode[] used *
1770: 2f 0a 20 20 75 33 32 20 6e 41 6c 6c 6f 63 3b 20  /.  u32 nAlloc; 
1780: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1790: 20 6f 66 20 73 6c 6f 74 73 20 6f 66 20 61 4e 6f   of slots of aNo
17a0: 64 65 5b 5d 20 61 6c 6c 6f 63 61 74 65 64 20 2a  de[] allocated *
17b0: 2f 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 61 4e  /.  JsonNode *aN
17c0: 6f 64 65 3b 20 20 20 2f 2a 20 41 72 72 61 79 20  ode;   /* Array 
17d0: 6f 66 20 6e 6f 64 65 73 20 63 6f 6e 74 61 69 6e  of nodes contain
17e0: 69 6e 67 20 74 68 65 20 70 61 72 73 65 20 2a 2f  ing the parse */
17f0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1800: 4a 73 6f 6e 3b 20 2f 2a 20 4f 72 69 67 69 6e 61  Json; /* Origina
1810: 6c 20 4a 53 4f 4e 20 73 74 72 69 6e 67 20 2a 2f  l JSON string */
1820: 0a 20 20 75 33 32 20 2a 61 55 70 3b 20 20 20 20  .  u32 *aUp;    
1830: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
1840: 66 20 70 61 72 65 6e 74 20 6f 66 20 65 61 63 68  f parent of each
1850: 20 6e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 6f 6f   node */.  u8 oo
1860: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  m;            /*
1870: 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   Set to true if 
1880: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f  out of memory */
1890: 0a 20 20 75 38 20 6e 45 72 72 3b 20 20 20 20 20  .  u8 nErr;     
18a0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
18b0: 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e 20 2a  of errors seen *
18c0: 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  /.};../*********
18d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1910: 2a 0a 2a 2a 20 55 74 69 6c 69 74 79 20 72 6f 75  *.** Utility rou
1920: 74 69 6e 65 73 20 66 6f 72 20 64 65 61 6c 69 6e  tines for dealin
1930: 67 20 77 69 74 68 20 4a 73 6f 6e 53 74 72 69 6e  g with JsonStrin
1940: 67 20 6f 62 6a 65 63 74 73 0a 2a 2a 2a 2a 2a 2a  g objects.******
1950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1990: 2a 2a 2a 2a 2f 0a 0a 2f 2a 20 53 65 74 20 74 68  ****/../* Set th
19a0: 65 20 4a 73 6f 6e 53 74 72 69 6e 67 20 6f 62 6a  e JsonString obj
19b0: 65 63 74 20 74 6f 20 61 6e 20 65 6d 70 74 79 20  ect to an empty 
19c0: 73 74 72 69 6e 67 0a 2a 2f 0a 73 74 61 74 69 63  string.*/.static
19d0: 20 76 6f 69 64 20 6a 73 6f 6e 5a 65 72 6f 28 4a   void jsonZero(J
19e0: 73 6f 6e 53 74 72 69 6e 67 20 2a 70 29 7b 0a 20  sonString *p){. 
19f0: 20 70 2d 3e 7a 42 75 66 20 3d 20 70 2d 3e 7a 53   p->zBuf = p->zS
1a00: 70 61 63 65 3b 0a 20 20 70 2d 3e 6e 41 6c 6c 6f  pace;.  p->nAllo
1a10: 63 20 3d 20 73 69 7a 65 6f 66 28 70 2d 3e 7a 53  c = sizeof(p->zS
1a20: 70 61 63 65 29 3b 0a 20 20 70 2d 3e 6e 55 73 65  pace);.  p->nUse
1a30: 64 20 3d 20 30 3b 0a 20 20 70 2d 3e 62 53 74 61  d = 0;.  p->bSta
1a40: 74 69 63 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 20 49  tic = 1;.}../* I
1a50: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4a 73  nitialize the Js
1a60: 6f 6e 53 74 72 69 6e 67 20 6f 62 6a 65 63 74 0a  onString object.
1a70: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a  */.static void j
1a80: 73 6f 6e 49 6e 69 74 28 4a 73 6f 6e 53 74 72 69  sonInit(JsonStri
1a90: 6e 67 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 63  ng *p, sqlite3_c
1aa0: 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a 20  ontext *pCtx){. 
1ab0: 20 70 2d 3e 70 43 74 78 20 3d 20 70 43 74 78 3b   p->pCtx = pCtx;
1ac0: 0a 20 20 70 2d 3e 62 45 72 72 20 3d 20 30 3b 0a  .  p->bErr = 0;.
1ad0: 20 20 6a 73 6f 6e 5a 65 72 6f 28 70 29 3b 0a 7d    jsonZero(p);.}
1ae0: 0a 0a 0a 2f 2a 20 46 72 65 65 20 61 6c 6c 20 61  .../* Free all a
1af0: 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 20  llocated memory 
1b00: 61 6e 64 20 72 65 73 65 74 20 74 68 65 20 4a 73  and reset the Js
1b10: 6f 6e 53 74 72 69 6e 67 20 6f 62 6a 65 63 74 20  onString object 
1b20: 62 61 63 6b 20 74 6f 20 69 74 73 0a 2a 2a 20 69  back to its.** i
1b30: 6e 69 74 69 61 6c 20 73 74 61 74 65 2e 0a 2a 2f  nitial state..*/
1b40: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f  .static void jso
1b50: 6e 52 65 73 65 74 28 4a 73 6f 6e 53 74 72 69 6e  nReset(JsonStrin
1b60: 67 20 2a 70 29 7b 0a 20 20 69 66 28 20 21 70 2d  g *p){.  if( !p-
1b70: 3e 62 53 74 61 74 69 63 20 29 20 73 71 6c 69 74  >bStatic ) sqlit
1b80: 65 33 5f 66 72 65 65 28 70 2d 3e 7a 42 75 66 29  e3_free(p->zBuf)
1b90: 3b 0a 20 20 6a 73 6f 6e 5a 65 72 6f 28 70 29 3b  ;.  jsonZero(p);
1ba0: 0a 7d 0a 0a 0a 2f 2a 20 52 65 70 6f 72 74 20 61  .}.../* Report a
1bb0: 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20  n out-of-memory 
1bc0: 28 4f 4f 4d 29 20 63 6f 6e 64 69 74 69 6f 6e 20  (OOM) condition 
1bd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1be0: 6a 73 6f 6e 4f 6f 6d 28 4a 73 6f 6e 53 74 72 69  jsonOom(JsonStri
1bf0: 6e 67 20 2a 70 29 7b 0a 20 20 70 2d 3e 62 45 72  ng *p){.  p->bEr
1c00: 72 20 3d 20 31 3b 0a 20 20 73 71 6c 69 74 65 33  r = 1;.  sqlite3
1c10: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
1c20: 6d 65 6d 28 70 2d 3e 70 43 74 78 29 3b 0a 20 20  mem(p->pCtx);.  
1c30: 6a 73 6f 6e 52 65 73 65 74 28 70 29 3b 0a 7d 0a  jsonReset(p);.}.
1c40: 0a 2f 2a 20 45 6e 6c 61 72 67 65 20 70 4a 73 6f  ./* Enlarge pJso
1c50: 6e 2d 3e 7a 42 75 66 20 73 6f 20 74 68 61 74 20  n->zBuf so that 
1c60: 69 74 20 63 61 6e 20 68 6f 6c 64 20 61 74 20 6c  it can hold at l
1c70: 65 61 73 74 20 4e 20 6d 6f 72 65 20 62 79 74 65  east N more byte
1c80: 73 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 7a 65 72  s..** Return zer
1c90: 6f 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 52  o on success.  R
1ca0: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f  eturn non-zero o
1cb0: 6e 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 0a 2a  n an OOM error.*
1cc0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 73 6f  /.static int jso
1cd0: 6e 47 72 6f 77 28 4a 73 6f 6e 53 74 72 69 6e 67  nGrow(JsonString
1ce0: 20 2a 70 2c 20 75 33 32 20 4e 29 7b 0a 20 20 75   *p, u32 N){.  u
1cf0: 36 34 20 6e 54 6f 74 61 6c 20 3d 20 4e 3c 70 2d  64 nTotal = N<p-
1d00: 3e 6e 41 6c 6c 6f 63 20 3f 20 70 2d 3e 6e 41 6c  >nAlloc ? p->nAl
1d10: 6c 6f 63 2a 32 20 3a 20 70 2d 3e 6e 41 6c 6c 6f  loc*2 : p->nAllo
1d20: 63 2b 4e 2b 31 30 3b 0a 20 20 63 68 61 72 20 2a  c+N+10;.  char *
1d30: 7a 4e 65 77 3b 0a 20 20 69 66 28 20 70 2d 3e 62  zNew;.  if( p->b
1d40: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 69 66  Static ){.    if
1d50: 28 20 70 2d 3e 62 45 72 72 20 29 20 72 65 74 75  ( p->bErr ) retu
1d60: 72 6e 20 31 3b 0a 20 20 20 20 7a 4e 65 77 20 3d  rn 1;.    zNew =
1d70: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
1d80: 34 28 6e 54 6f 74 61 6c 29 3b 0a 20 20 20 20 69  4(nTotal);.    i
1d90: 66 28 20 7a 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( zNew==0 ){.  
1da0: 20 20 20 20 6a 73 6f 6e 4f 6f 6d 28 70 29 3b 0a      jsonOom(p);.
1db0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1dc0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
1dd0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 4e 65 77  .    memcpy(zNew
1de0: 2c 20 70 2d 3e 7a 42 75 66 2c 20 28 73 69 7a 65  , p->zBuf, (size
1df0: 5f 74 29 70 2d 3e 6e 55 73 65 64 29 3b 0a 20 20  _t)p->nUsed);.  
1e00: 20 20 70 2d 3e 7a 42 75 66 20 3d 20 7a 4e 65 77    p->zBuf = zNew
1e10: 3b 0a 20 20 20 20 70 2d 3e 62 53 74 61 74 69 63  ;.    p->bStatic
1e20: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
1e30: 20 20 20 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65     zNew = sqlite
1e40: 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 2d 3e 7a  3_realloc64(p->z
1e50: 42 75 66 2c 20 6e 54 6f 74 61 6c 29 3b 0a 20 20  Buf, nTotal);.  
1e60: 20 20 69 66 28 20 7a 4e 65 77 3d 3d 30 20 29 7b    if( zNew==0 ){
1e70: 0a 20 20 20 20 20 20 6a 73 6f 6e 4f 6f 6d 28 70  .      jsonOom(p
1e80: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1e90: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1ea0: 20 20 7d 0a 20 20 20 20 70 2d 3e 7a 42 75 66 20    }.    p->zBuf 
1eb0: 3d 20 7a 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 2d  = zNew;.  }.  p-
1ec0: 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 54 6f 74 61 6c  >nAlloc = nTotal
1ed0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1ee0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 41 70 70 65  E_OK;.}../* Appe
1ef0: 6e 64 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20  nd N bytes from 
1f00: 7a 49 6e 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  zIn onto the end
1f10: 20 6f 66 20 74 68 65 20 4a 73 6f 6e 53 74 72 69   of the JsonStri
1f20: 6e 67 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74  ng string..*/.st
1f30: 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 41 70  atic void jsonAp
1f40: 70 65 6e 64 52 61 77 28 4a 73 6f 6e 53 74 72 69  pendRaw(JsonStri
1f50: 6e 67 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  ng *p, const cha
1f60: 72 20 2a 7a 49 6e 2c 20 75 33 32 20 4e 29 7b 0a  r *zIn, u32 N){.
1f70: 20 20 69 66 28 20 28 4e 2b 70 2d 3e 6e 55 73 65    if( (N+p->nUse
1f80: 64 20 3e 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 29 20  d >= p->nAlloc) 
1f90: 26 26 20 6a 73 6f 6e 47 72 6f 77 28 70 2c 4e 29  && jsonGrow(p,N)
1fa0: 21 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  !=0 ) return;.  
1fb0: 6d 65 6d 63 70 79 28 70 2d 3e 7a 42 75 66 2b 70  memcpy(p->zBuf+p
1fc0: 2d 3e 6e 55 73 65 64 2c 20 7a 49 6e 2c 20 4e 29  ->nUsed, zIn, N)
1fd0: 3b 0a 20 20 70 2d 3e 6e 55 73 65 64 20 2b 3d 20  ;.  p->nUsed += 
1fe0: 4e 3b 0a 7d 0a 0a 2f 2a 20 41 70 70 65 6e 64 20  N;.}../* Append 
1ff0: 66 6f 72 6d 61 74 74 65 64 20 74 65 78 74 20 28  formatted text (
2000: 6e 6f 74 20 74 6f 20 65 78 63 65 65 64 20 4e 20  not to exceed N 
2010: 62 79 74 65 73 29 20 74 6f 20 74 68 65 20 4a 73  bytes) to the Js
2020: 6f 6e 53 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61  onString..*/.sta
2030: 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 50 72 69  tic void jsonPri
2040: 6e 74 66 28 69 6e 74 20 4e 2c 20 4a 73 6f 6e 53  ntf(int N, JsonS
2050: 74 72 69 6e 67 20 2a 70 2c 20 63 6f 6e 73 74 20  tring *p, const 
2060: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
2070: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
2080: 70 3b 0a 20 20 69 66 28 20 28 70 2d 3e 6e 55 73  p;.  if( (p->nUs
2090: 65 64 20 2b 20 4e 20 3e 3d 20 70 2d 3e 6e 41 6c  ed + N >= p->nAl
20a0: 6c 6f 63 29 20 26 26 20 6a 73 6f 6e 47 72 6f 77  loc) && jsonGrow
20b0: 28 70 2c 20 4e 29 20 29 20 72 65 74 75 72 6e 3b  (p, N) ) return;
20c0: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
20d0: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 73 71 6c 69  zFormat);.  sqli
20e0: 74 65 33 5f 76 73 6e 70 72 69 6e 74 66 28 4e 2c  te3_vsnprintf(N,
20f0: 20 70 2d 3e 7a 42 75 66 2b 70 2d 3e 6e 55 73 65   p->zBuf+p->nUse
2100: 64 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  d, zFormat, ap);
2110: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
2120: 20 70 2d 3e 6e 55 73 65 64 20 2b 3d 20 28 69 6e   p->nUsed += (in
2130: 74 29 73 74 72 6c 65 6e 28 70 2d 3e 7a 42 75 66  t)strlen(p->zBuf
2140: 2b 70 2d 3e 6e 55 73 65 64 29 3b 0a 7d 0a 0a 2f  +p->nUsed);.}../
2150: 2a 20 41 70 70 65 6e 64 20 61 20 73 69 6e 67 6c  * Append a singl
2160: 65 20 63 68 61 72 61 63 74 65 72 0a 2a 2f 0a 73  e character.*/.s
2170: 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 41  tatic void jsonA
2180: 70 70 65 6e 64 43 68 61 72 28 4a 73 6f 6e 53 74  ppendChar(JsonSt
2190: 72 69 6e 67 20 2a 70 2c 20 63 68 61 72 20 63 29  ring *p, char c)
21a0: 7b 0a 20 20 69 66 28 20 70 2d 3e 6e 55 73 65 64  {.  if( p->nUsed
21b0: 3e 3d 70 2d 3e 6e 41 6c 6c 6f 63 20 26 26 20 6a  >=p->nAlloc && j
21c0: 73 6f 6e 47 72 6f 77 28 70 2c 31 29 21 3d 30 20  sonGrow(p,1)!=0 
21d0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 2d 3e 7a  ) return;.  p->z
21e0: 42 75 66 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20  Buf[p->nUsed++] 
21f0: 3d 20 63 3b 0a 7d 0a 0a 2f 2a 20 41 70 70 65 6e  = c;.}../* Appen
2200: 64 20 61 20 63 6f 6d 6d 61 20 73 65 70 61 72 61  d a comma separa
2210: 74 6f 72 20 74 6f 20 74 68 65 20 6f 75 74 70 75  tor to the outpu
2220: 74 20 62 75 66 66 65 72 2c 20 69 66 20 74 68 65  t buffer, if the
2230: 20 70 72 65 76 69 6f 75 73 0a 2a 2a 20 63 68 61   previous.** cha
2240: 72 61 63 74 65 72 20 69 73 20 6e 6f 74 20 27 5b  racter is not '[
2250: 27 20 6f 72 20 27 7b 27 2e 0a 2a 2f 0a 73 74 61  ' or '{'..*/.sta
2260: 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 41 70 70  tic void jsonApp
2270: 65 6e 64 53 65 70 61 72 61 74 6f 72 28 4a 73 6f  endSeparator(Jso
2280: 6e 53 74 72 69 6e 67 20 2a 70 29 7b 0a 20 20 63  nString *p){.  c
2290: 68 61 72 20 63 3b 0a 20 20 69 66 28 20 70 2d 3e  har c;.  if( p->
22a0: 6e 55 73 65 64 3d 3d 30 20 29 20 72 65 74 75 72  nUsed==0 ) retur
22b0: 6e 3b 0a 20 20 63 20 3d 20 70 2d 3e 7a 42 75 66  n;.  c = p->zBuf
22c0: 5b 70 2d 3e 6e 55 73 65 64 2d 31 5d 3b 0a 20 20  [p->nUsed-1];.  
22d0: 69 66 28 20 63 21 3d 27 5b 27 20 26 26 20 63 21  if( c!='[' && c!
22e0: 3d 27 7b 27 20 29 20 6a 73 6f 6e 41 70 70 65 6e  ='{' ) jsonAppen
22f0: 64 43 68 61 72 28 70 2c 20 27 2c 27 29 3b 0a 7d  dChar(p, ',');.}
2300: 0a 0a 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20  ../* Append the 
2310: 4e 2d 62 79 74 65 20 73 74 72 69 6e 67 20 69 6e  N-byte string in
2320: 20 7a 49 6e 20 74 6f 20 74 68 65 20 65 6e 64 20   zIn to the end 
2330: 6f 66 20 74 68 65 20 4a 73 6f 6e 53 74 72 69 6e  of the JsonStrin
2340: 67 20 73 74 72 69 6e 67 0a 2a 2a 20 75 6e 64 65  g string.** unde
2350: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
2360: 20 45 6e 63 6c 6f 73 65 20 74 68 65 20 73 74 72   Enclose the str
2370: 69 6e 67 20 69 6e 20 22 2e 2e 2e 22 20 61 6e 64  ing in "..." and
2380: 20 65 73 63 61 70 65 0a 2a 2a 20 61 6e 79 20 64   escape.** any d
2390: 6f 75 62 6c 65 2d 71 75 6f 74 65 73 20 6f 72 20  ouble-quotes or 
23a0: 62 61 63 6b 73 6c 61 73 68 20 63 68 61 72 61 63  backslash charac
23b0: 74 65 72 73 20 63 6f 6e 74 61 69 6e 65 64 20 77  ters contained w
23c0: 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20 73 74 72  ithin the.** str
23d0: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
23e0: 6f 69 64 20 6a 73 6f 6e 41 70 70 65 6e 64 53 74  oid jsonAppendSt
23f0: 72 69 6e 67 28 4a 73 6f 6e 53 74 72 69 6e 67 20  ring(JsonString 
2400: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
2410: 7a 49 6e 2c 20 75 33 32 20 4e 29 7b 0a 20 20 75  zIn, u32 N){.  u
2420: 33 32 20 69 3b 0a 20 20 69 66 28 20 28 4e 2b 70  32 i;.  if( (N+p
2430: 2d 3e 6e 55 73 65 64 2b 32 20 3e 3d 20 70 2d 3e  ->nUsed+2 >= p->
2440: 6e 41 6c 6c 6f 63 29 20 26 26 20 6a 73 6f 6e 47  nAlloc) && jsonG
2450: 72 6f 77 28 70 2c 4e 2b 32 29 21 3d 30 20 29 20  row(p,N+2)!=0 ) 
2460: 72 65 74 75 72 6e 3b 0a 20 20 70 2d 3e 7a 42 75  return;.  p->zBu
2470: 66 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d 20  f[p->nUsed++] = 
2480: 27 22 27 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  '"';.  for(i=0; 
2490: 69 3c 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  i<N; i++){.    u
24a0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 20 3d  nsigned char c =
24b0: 20 28 28 75 6e 73 69 67 6e 65 64 20 63 6f 6e 73   ((unsigned cons
24c0: 74 20 63 68 61 72 2a 29 7a 49 6e 29 5b 69 5d 3b  t char*)zIn)[i];
24d0: 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 22 27 20  .    if( c=='"' 
24e0: 7c 7c 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20  || c=='\\' ){.  
24f0: 20 20 20 20 6a 73 6f 6e 5f 73 69 6d 70 6c 65 5f      json_simple_
2500: 65 73 63 61 70 65 3a 0a 20 20 20 20 20 20 69 66  escape:.      if
2510: 28 20 28 70 2d 3e 6e 55 73 65 64 2b 4e 2b 33 2d  ( (p->nUsed+N+3-
2520: 69 20 3e 20 70 2d 3e 6e 41 6c 6c 6f 63 29 20 26  i > p->nAlloc) &
2530: 26 20 6a 73 6f 6e 47 72 6f 77 28 70 2c 4e 2b 33  & jsonGrow(p,N+3
2540: 2d 69 29 21 3d 30 20 29 20 72 65 74 75 72 6e 3b  -i)!=0 ) return;
2550: 0a 20 20 20 20 20 20 70 2d 3e 7a 42 75 66 5b 70  .      p->zBuf[p
2560: 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d 20 27 5c 5c  ->nUsed++] = '\\
2570: 27 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  ';.    }else if(
2580: 20 63 3c 3d 30 78 31 66 20 29 7b 0a 20 20 20 20   c<=0x1f ){.    
2590: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
25a0: 68 61 72 20 61 53 70 65 63 69 61 6c 5b 5d 20 3d  har aSpecial[] =
25b0: 20 7b 0a 20 20 20 20 20 20 20 20 20 30 2c 20 30   {.         0, 0
25c0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
25d0: 20 30 2c 20 27 62 27 2c 20 27 74 27 2c 20 27 6e   0, 'b', 't', 'n
25e0: 27 2c 20 30 2c 20 27 66 27 2c 20 27 72 27 2c 20  ', 0, 'f', 'r', 
25f0: 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 30  0, 0,.         0
2600: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
2610: 20 30 2c 20 30 2c 20 20 20 30 2c 20 20 20 30 2c   0, 0,   0,   0,
2620: 20 20 20 30 2c 20 30 2c 20 20 20 30 2c 20 20 20     0, 0,   0,   
2630: 30 2c 20 30 2c 20 30 0a 20 20 20 20 20 20 7d 3b  0, 0, 0.      };
2640: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
2650: 69 7a 65 6f 66 28 61 53 70 65 63 69 61 6c 29 3d  izeof(aSpecial)=
2660: 3d 33 32 20 29 3b 0a 20 20 20 20 20 20 61 73 73  =32 );.      ass
2670: 65 72 74 28 20 61 53 70 65 63 69 61 6c 5b 27 5c  ert( aSpecial['\
2680: 62 27 5d 3d 3d 27 62 27 20 29 3b 0a 20 20 20 20  b']=='b' );.    
2690: 20 20 61 73 73 65 72 74 28 20 61 53 70 65 63 69    assert( aSpeci
26a0: 61 6c 5b 27 5c 66 27 5d 3d 3d 27 66 27 20 29 3b  al['\f']=='f' );
26b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61  .      assert( a
26c0: 53 70 65 63 69 61 6c 5b 27 5c 6e 27 5d 3d 3d 27  Special['\n']=='
26d0: 6e 27 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  n' );.      asse
26e0: 72 74 28 20 61 53 70 65 63 69 61 6c 5b 27 5c 72  rt( aSpecial['\r
26f0: 27 5d 3d 3d 27 72 27 20 29 3b 0a 20 20 20 20 20  ']=='r' );.     
2700: 20 61 73 73 65 72 74 28 20 61 53 70 65 63 69 61   assert( aSpecia
2710: 6c 5b 27 5c 74 27 5d 3d 3d 27 74 27 20 29 3b 0a  l['\t']=='t' );.
2720: 20 20 20 20 20 20 69 66 28 20 61 53 70 65 63 69        if( aSpeci
2730: 61 6c 5b 63 5d 20 29 7b 0a 20 20 20 20 20 20 20  al[c] ){.       
2740: 20 63 20 3d 20 61 53 70 65 63 69 61 6c 5b 63 5d   c = aSpecial[c]
2750: 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6a  ;.        goto j
2760: 73 6f 6e 5f 73 69 6d 70 6c 65 5f 65 73 63 61 70  son_simple_escap
2770: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
2780: 20 69 66 28 20 28 70 2d 3e 6e 55 73 65 64 2b 4e   if( (p->nUsed+N
2790: 2b 37 2b 69 20 3e 20 70 2d 3e 6e 41 6c 6c 6f 63  +7+i > p->nAlloc
27a0: 29 20 26 26 20 6a 73 6f 6e 47 72 6f 77 28 70 2c  ) && jsonGrow(p,
27b0: 4e 2b 37 2d 69 29 21 3d 30 20 29 20 72 65 74 75  N+7-i)!=0 ) retu
27c0: 72 6e 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 42 75  rn;.      p->zBu
27d0: 66 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d 20  f[p->nUsed++] = 
27e0: 27 5c 5c 27 3b 0a 20 20 20 20 20 20 70 2d 3e 7a  '\\';.      p->z
27f0: 42 75 66 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20  Buf[p->nUsed++] 
2800: 3d 20 27 75 27 3b 0a 20 20 20 20 20 20 70 2d 3e  = 'u';.      p->
2810: 7a 42 75 66 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d  zBuf[p->nUsed++]
2820: 20 3d 20 27 30 27 3b 0a 20 20 20 20 20 20 70 2d   = '0';.      p-
2830: 3e 7a 42 75 66 5b 70 2d 3e 6e 55 73 65 64 2b 2b  >zBuf[p->nUsed++
2840: 5d 20 3d 20 27 30 27 3b 0a 20 20 20 20 20 20 70  ] = '0';.      p
2850: 2d 3e 7a 42 75 66 5b 70 2d 3e 6e 55 73 65 64 2b  ->zBuf[p->nUsed+
2860: 2b 5d 20 3d 20 27 30 27 20 2b 20 28 63 3e 3e 34  +] = '0' + (c>>4
2870: 29 3b 0a 20 20 20 20 20 20 63 20 3d 20 22 30 31  );.      c = "01
2880: 32 33 34 35 36 37 38 39 61 62 63 64 65 66 22 5b  23456789abcdef"[
2890: 63 26 30 78 66 5d 3b 0a 20 20 20 20 7d 0a 20 20  c&0xf];.    }.  
28a0: 20 20 70 2d 3e 7a 42 75 66 5b 70 2d 3e 6e 55 73    p->zBuf[p->nUs
28b0: 65 64 2b 2b 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20  ed++] = c;.  }. 
28c0: 20 70 2d 3e 7a 42 75 66 5b 70 2d 3e 6e 55 73 65   p->zBuf[p->nUse
28d0: 64 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 61 73  d++] = '"';.  as
28e0: 73 65 72 74 28 20 70 2d 3e 6e 55 73 65 64 3c 70  sert( p->nUsed<p
28f0: 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 7d 0a 0a 2f  ->nAlloc );.}../
2900: 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 66 75  *.** Append a fu
2910: 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72  nction parameter
2920: 20 76 61 6c 75 65 20 74 6f 20 74 68 65 20 4a 53   value to the JS
2930: 4f 4e 20 73 74 72 69 6e 67 20 75 6e 64 65 72 20  ON string under 
2940: 0a 2a 2a 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  .** construction
2950: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2960: 20 6a 73 6f 6e 41 70 70 65 6e 64 56 61 6c 75 65   jsonAppendValue
2970: 28 0a 20 20 4a 73 6f 6e 53 74 72 69 6e 67 20 2a  (.  JsonString *
2980: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
2990: 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20     /* Append to 
29a0: 74 68 69 73 20 4a 53 4f 4e 20 73 74 72 69 6e 67  this JSON string
29b0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
29c0: 6c 75 65 20 2a 70 56 61 6c 75 65 20 20 20 20 20  lue *pValue     
29d0: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
29e0: 20 61 70 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20   append */.){.  
29f0: 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33 5f  switch( sqlite3_
2a00: 76 61 6c 75 65 5f 74 79 70 65 28 70 56 61 6c 75  value_type(pValu
2a10: 65 29 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  e) ){.    case S
2a20: 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20  QLITE_NULL: {.  
2a30: 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 52 61      jsonAppendRa
2a40: 77 28 70 2c 20 22 6e 75 6c 6c 22 2c 20 34 29 3b  w(p, "null", 4);
2a50: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2a60: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
2a70: 49 54 45 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20  ITE_INTEGER:.   
2a80: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f   case SQLITE_FLO
2a90: 41 54 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73  AT: {.      cons
2aa0: 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e  t char *z = (con
2ab0: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
2ac0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c  _value_text(pVal
2ad0: 75 65 29 3b 0a 20 20 20 20 20 20 75 33 32 20 6e  ue);.      u32 n
2ae0: 20 3d 20 28 75 33 32 29 73 71 6c 69 74 65 33 5f   = (u32)sqlite3_
2af0: 76 61 6c 75 65 5f 62 79 74 65 73 28 70 56 61 6c  value_bytes(pVal
2b00: 75 65 29 3b 0a 20 20 20 20 20 20 6a 73 6f 6e 41  ue);.      jsonA
2b10: 70 70 65 6e 64 52 61 77 28 70 2c 20 7a 2c 20 6e  ppendRaw(p, z, n
2b20: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
2b30: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
2b40: 51 4c 49 54 45 5f 54 45 58 54 3a 20 7b 0a 20 20  QLITE_TEXT: {.  
2b50: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2b60: 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  z = (const char*
2b70: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
2b80: 65 78 74 28 70 56 61 6c 75 65 29 3b 0a 20 20 20  ext(pValue);.   
2b90: 20 20 20 75 33 32 20 6e 20 3d 20 28 75 33 32 29     u32 n = (u32)
2ba0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
2bb0: 74 65 73 28 70 56 61 6c 75 65 29 3b 0a 20 20 20  tes(pValue);.   
2bc0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76     if( sqlite3_v
2bd0: 61 6c 75 65 5f 73 75 62 74 79 70 65 28 70 56 61  alue_subtype(pVa
2be0: 6c 75 65 29 3d 3d 4a 53 4f 4e 5f 53 55 42 54 59  lue)==JSON_SUBTY
2bf0: 50 45 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 73  PE ){.        js
2c00: 6f 6e 41 70 70 65 6e 64 52 61 77 28 70 2c 20 7a  onAppendRaw(p, z
2c10: 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , n);.      }els
2c20: 65 7b 0a 20 20 20 20 20 20 20 20 6a 73 6f 6e 41  e{.        jsonA
2c30: 70 70 65 6e 64 53 74 72 69 6e 67 28 70 2c 20 7a  ppendString(p, z
2c40: 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , n);.      }.  
2c50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2c60: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
2c70: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 62 45 72        if( p->bEr
2c80: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  r==0 ){.        
2c90: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
2ca0: 72 72 6f 72 28 70 2d 3e 70 43 74 78 2c 20 22 4a  rror(p->pCtx, "J
2cb0: 53 4f 4e 20 63 61 6e 6e 6f 74 20 68 6f 6c 64 20  SON cannot hold 
2cc0: 42 4c 4f 42 20 76 61 6c 75 65 73 22 2c 20 2d 31  BLOB values", -1
2cd0: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 62 45  );.        p->bE
2ce0: 72 72 20 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  rr = 2;.        
2cf0: 6a 73 6f 6e 52 65 73 65 74 28 70 29 3b 0a 20 20  jsonReset(p);.  
2d00: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
2d10: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  k;.    }.  }.}..
2d20: 0a 2f 2a 20 4d 61 6b 65 20 74 68 65 20 4a 53 4f  ./* Make the JSO
2d30: 4e 20 69 6e 20 70 20 74 68 65 20 72 65 73 75 6c  N in p the resul
2d40: 74 20 6f 66 20 74 68 65 20 53 51 4c 20 66 75 6e  t of the SQL fun
2d50: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
2d60: 20 76 6f 69 64 20 6a 73 6f 6e 52 65 73 75 6c 74   void jsonResult
2d70: 28 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70 29 7b  (JsonString *p){
2d80: 0a 20 20 69 66 28 20 70 2d 3e 62 45 72 72 3d 3d  .  if( p->bErr==
2d90: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
2da0: 5f 72 65 73 75 6c 74 5f 74 65 78 74 36 34 28 70  _result_text64(p
2db0: 2d 3e 70 43 74 78 2c 20 70 2d 3e 7a 42 75 66 2c  ->pCtx, p->zBuf,
2dc0: 20 70 2d 3e 6e 55 73 65 64 2c 20 0a 20 20 20 20   p->nUsed, .    
2dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de0: 20 20 20 20 20 20 70 2d 3e 62 53 74 61 74 69 63        p->bStatic
2df0: 20 3f 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49   ? SQLITE_TRANSI
2e00: 45 4e 54 20 3a 20 73 71 6c 69 74 65 33 5f 66 72  ENT : sqlite3_fr
2e10: 65 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ee,.            
2e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
2e30: 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20  LITE_UTF8);.    
2e40: 6a 73 6f 6e 5a 65 72 6f 28 70 29 3b 0a 20 20 7d  jsonZero(p);.  }
2e50: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62 53  .  assert( p->bS
2e60: 74 61 74 69 63 20 29 3b 0a 7d 0a 0a 2f 2a 2a 2a  tatic );.}../***
2e70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ea0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2eb0: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 55 74 69 6c 69  *******.** Utili
2ec0: 74 79 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20  ty routines for 
2ed0: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 4a 73 6f  dealing with Jso
2ee0: 6e 4e 6f 64 65 20 61 6e 64 20 4a 73 6f 6e 50 61  nNode and JsonPa
2ef0: 72 73 65 20 6f 62 6a 65 63 74 73 0a 2a 2a 2a 2a  rse objects.****
2f00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f40: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  ******/../*.** R
2f50: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
2f60: 20 6f 66 20 63 6f 6e 73 65 63 75 74 69 76 65 20   of consecutive 
2f70: 4a 73 6f 6e 4e 6f 64 65 20 73 6c 6f 74 73 20 6e  JsonNode slots n
2f80: 65 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74  eed to represent
2f90: 0a 2a 2a 20 74 68 65 20 70 61 72 73 65 64 20 4a  .** the parsed J
2fa0: 53 4f 4e 20 61 74 20 70 4e 6f 64 65 2e 20 20 54  SON at pNode.  T
2fb0: 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6e 73 77 65  he minimum answe
2fc0: 72 20 69 73 20 31 2e 20 20 46 6f 72 20 41 52 52  r is 1.  For ARR
2fd0: 41 59 20 61 6e 64 0a 2a 2a 20 4f 42 4a 45 43 54  AY and.** OBJECT
2fe0: 20 74 79 70 65 73 2c 20 74 68 65 20 6e 75 6d 62   types, the numb
2ff0: 65 72 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67  er might be larg
3000: 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 70 70 65 6e 64  er..**.** Append
3010: 65 64 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20  ed elements are 
3020: 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 20 20 54 68  not counted.  Th
3030: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
3040: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a   is the number.*
3050: 2a 20 62 79 20 77 68 69 63 68 20 74 68 65 20 4a  * by which the J
3060: 73 6f 6e 4e 6f 64 65 20 63 6f 75 6e 74 65 72 20  sonNode counter 
3070: 73 68 6f 75 6c 64 20 69 6e 63 72 65 6d 65 6e 74  should increment
3080: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 6f 20   in order to go 
3090: 74 6f 20 74 68 65 0a 2a 2a 20 6e 65 78 74 20 70  to the.** next p
30a0: 65 65 72 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74  eer value..*/.st
30b0: 61 74 69 63 20 75 33 32 20 6a 73 6f 6e 4e 6f 64  atic u32 jsonNod
30c0: 65 53 69 7a 65 28 4a 73 6f 6e 4e 6f 64 65 20 2a  eSize(JsonNode *
30d0: 70 4e 6f 64 65 29 7b 0a 20 20 72 65 74 75 72 6e  pNode){.  return
30e0: 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65 3e 3d 4a   pNode->eType>=J
30f0: 53 4f 4e 5f 41 52 52 41 59 20 3f 20 70 4e 6f 64  SON_ARRAY ? pNod
3100: 65 2d 3e 6e 2b 31 20 3a 20 31 3b 0a 7d 0a 0a 2f  e->n+1 : 1;.}../
3110: 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c  *.** Reclaim all
3120: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65   memory allocate
3130: 64 20 62 79 20 61 20 4a 73 6f 6e 50 61 72 73 65  d by a JsonParse
3140: 20 6f 62 6a 65 63 74 2e 20 20 42 75 74 20 64 6f   object.  But do
3150: 20 6e 6f 74 0a 2a 2a 20 64 65 6c 65 74 65 20 74   not.** delete t
3160: 68 65 20 4a 73 6f 6e 50 61 72 73 65 20 6f 62 6a  he JsonParse obj
3170: 65 63 74 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 73  ect itself..*/.s
3180: 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 50  tatic void jsonP
3190: 61 72 73 65 52 65 73 65 74 28 4a 73 6f 6e 50 61  arseReset(JsonPa
31a0: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
31b0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
31c0: 72 73 65 2d 3e 61 4e 6f 64 65 29 3b 0a 20 20 70  rse->aNode);.  p
31d0: 50 61 72 73 65 2d 3e 61 4e 6f 64 65 20 3d 20 30  Parse->aNode = 0
31e0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4e 6f 64  ;.  pParse->nNod
31f0: 65 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  e = 0;.  pParse-
3200: 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 73  >nAlloc = 0;.  s
3210: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 72  qlite3_free(pPar
3220: 73 65 2d 3e 61 55 70 29 3b 0a 20 20 70 50 61 72  se->aUp);.  pPar
3230: 73 65 2d 3e 61 55 70 20 3d 20 30 3b 0a 7d 0a 0a  se->aUp = 0;.}..
3240: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68  /*.** Convert th
3250: 65 20 4a 73 6f 6e 4e 6f 64 65 20 70 4e 6f 64 65  e JsonNode pNode
3260: 20 69 6e 74 6f 20 61 20 70 75 72 65 20 4a 53 4f   into a pure JSO
3270: 4e 20 73 74 72 69 6e 67 20 61 6e 64 0a 2a 2a 20  N string and.** 
3280: 61 70 70 65 6e 64 20 74 6f 20 70 4f 75 74 2e 20  append to pOut. 
3290: 20 53 75 62 73 75 62 73 74 72 75 63 74 75 72 65   Subsubstructure
32a0: 20 69 73 20 61 6c 73 6f 20 69 6e 63 6c 75 64 65   is also include
32b0: 64 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68  d.  Return.** th
32c0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 4a 73 6f 6e  e number of Json
32d0: 4e 6f 64 65 20 6f 62 6a 65 63 74 73 20 74 68 61  Node objects tha
32e0: 74 20 61 72 65 20 65 6e 63 6f 64 65 64 2e 0a 2a  t are encoded..*
32f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73  /.static void js
3300: 6f 6e 52 65 6e 64 65 72 4e 6f 64 65 28 0a 20 20  onRenderNode(.  
3310: 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c  JsonNode *pNode,
3320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3330: 2a 20 54 68 65 20 6e 6f 64 65 20 74 6f 20 72 65  * The node to re
3340: 6e 64 65 72 20 2a 2f 0a 20 20 4a 73 6f 6e 53 74  nder */.  JsonSt
3350: 72 69 6e 67 20 2a 70 4f 75 74 2c 20 20 20 20 20  ring *pOut,     
3360: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
3370: 65 20 4a 53 4f 4e 20 68 65 72 65 20 2a 2f 0a 20  e JSON here */. 
3380: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
3390: 2a 61 52 65 70 6c 61 63 65 20 20 20 20 20 20 20  *aReplace       
33a0: 2f 2a 20 52 65 70 6c 61 63 65 6d 65 6e 74 20 76  /* Replacement v
33b0: 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 66  alues */.){.  if
33c0: 28 20 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73  ( pNode->jnFlags
33d0: 20 26 20 28 4a 4e 4f 44 45 5f 52 45 50 4c 41 43   & (JNODE_REPLAC
33e0: 45 7c 4a 4e 4f 44 45 5f 50 41 54 43 48 29 20 29  E|JNODE_PATCH) )
33f0: 7b 0a 20 20 20 20 69 66 28 20 70 4e 6f 64 65 2d  {.    if( pNode-
3400: 3e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45  >jnFlags & JNODE
3410: 5f 52 45 50 4c 41 43 45 20 29 7b 0a 20 20 20 20  _REPLACE ){.    
3420: 20 20 6a 73 6f 6e 41 70 70 65 6e 64 56 61 6c 75    jsonAppendValu
3430: 65 28 70 4f 75 74 2c 20 61 52 65 70 6c 61 63 65  e(pOut, aReplace
3440: 5b 70 4e 6f 64 65 2d 3e 75 2e 69 52 65 70 6c 61  [pNode->u.iRepla
3450: 63 65 5d 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ce]);.      retu
3460: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  rn;.    }.    pN
3470: 6f 64 65 20 3d 20 70 4e 6f 64 65 2d 3e 75 2e 70  ode = pNode->u.p
3480: 50 61 74 63 68 3b 0a 20 20 7d 0a 20 20 73 77 69  Patch;.  }.  swi
3490: 74 63 68 28 20 70 4e 6f 64 65 2d 3e 65 54 79 70  tch( pNode->eTyp
34a0: 65 20 29 7b 0a 20 20 20 20 64 65 66 61 75 6c 74  e ){.    default
34b0: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
34c0: 28 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65 3d 3d  ( pNode->eType==
34d0: 4a 53 4f 4e 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20  JSON_NULL );.   
34e0: 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 52 61 77     jsonAppendRaw
34f0: 28 70 4f 75 74 2c 20 22 6e 75 6c 6c 22 2c 20 34  (pOut, "null", 4
3500: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
3510: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a      }.    case J
3520: 53 4f 4e 5f 54 52 55 45 3a 20 7b 0a 20 20 20 20  SON_TRUE: {.    
3530: 20 20 6a 73 6f 6e 41 70 70 65 6e 64 52 61 77 28    jsonAppendRaw(
3540: 70 4f 75 74 2c 20 22 74 72 75 65 22 2c 20 34 29  pOut, "true", 4)
3550: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3560: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 53     }.    case JS
3570: 4f 4e 5f 46 41 4c 53 45 3a 20 7b 0a 20 20 20 20  ON_FALSE: {.    
3580: 20 20 6a 73 6f 6e 41 70 70 65 6e 64 52 61 77 28    jsonAppendRaw(
3590: 70 4f 75 74 2c 20 22 66 61 6c 73 65 22 2c 20 35  pOut, "false", 5
35a0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
35b0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a      }.    case J
35c0: 53 4f 4e 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20  SON_STRING: {.  
35d0: 20 20 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 6a      if( pNode->j
35e0: 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 52  nFlags & JNODE_R
35f0: 41 57 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 73  AW ){.        js
3600: 6f 6e 41 70 70 65 6e 64 53 74 72 69 6e 67 28 70  onAppendString(p
3610: 4f 75 74 2c 20 70 4e 6f 64 65 2d 3e 75 2e 7a 4a  Out, pNode->u.zJ
3620: 43 6f 6e 74 65 6e 74 2c 20 70 4e 6f 64 65 2d 3e  Content, pNode->
3630: 6e 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  n);.        brea
3640: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
3650: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   /* Fall through
3660: 20 69 6e 74 6f 20 74 68 65 20 6e 65 78 74 20 63   into the next c
3670: 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ase */.    }.   
3680: 20 63 61 73 65 20 4a 53 4f 4e 5f 52 45 41 4c 3a   case JSON_REAL:
3690: 0a 20 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f 49  .    case JSON_I
36a0: 4e 54 3a 20 7b 0a 20 20 20 20 20 20 6a 73 6f 6e  NT: {.      json
36b0: 41 70 70 65 6e 64 52 61 77 28 70 4f 75 74 2c 20  AppendRaw(pOut, 
36c0: 70 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74 65  pNode->u.zJConte
36d0: 6e 74 2c 20 70 4e 6f 64 65 2d 3e 6e 29 3b 0a 20  nt, pNode->n);. 
36e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
36f0: 7d 0a 20 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f  }.    case JSON_
3700: 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 75  ARRAY: {.      u
3710: 33 32 20 6a 20 3d 20 31 3b 0a 20 20 20 20 20 20  32 j = 1;.      
3720: 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61 72 28 70  jsonAppendChar(p
3730: 4f 75 74 2c 20 27 5b 27 29 3b 0a 20 20 20 20 20  Out, '[');.     
3740: 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20   for(;;){.      
3750: 20 20 77 68 69 6c 65 28 20 6a 3c 3d 70 4e 6f 64    while( j<=pNod
3760: 65 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  e->n ){.        
3770: 20 20 69 66 28 20 28 70 4e 6f 64 65 5b 6a 5d 2e    if( (pNode[j].
3780: 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f  jnFlags & JNODE_
3790: 52 45 4d 4f 56 45 29 3d 3d 30 20 29 7b 0a 20 20  REMOVE)==0 ){.  
37a0: 20 20 20 20 20 20 20 20 20 20 6a 73 6f 6e 41 70            jsonAp
37b0: 70 65 6e 64 53 65 70 61 72 61 74 6f 72 28 70 4f  pendSeparator(pO
37c0: 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ut);.           
37d0: 20 6a 73 6f 6e 52 65 6e 64 65 72 4e 6f 64 65 28   jsonRenderNode(
37e0: 26 70 4e 6f 64 65 5b 6a 5d 2c 20 70 4f 75 74 2c  &pNode[j], pOut,
37f0: 20 61 52 65 70 6c 61 63 65 29 3b 0a 20 20 20 20   aReplace);.    
3800: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3810: 20 20 6a 20 2b 3d 20 6a 73 6f 6e 4e 6f 64 65 53    j += jsonNodeS
3820: 69 7a 65 28 26 70 4e 6f 64 65 5b 6a 5d 29 3b 0a  ize(&pNode[j]);.
3830: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3840: 20 20 69 66 28 20 28 70 4e 6f 64 65 2d 3e 6a 6e    if( (pNode->jn
3850: 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 41 50  Flags & JNODE_AP
3860: 50 45 4e 44 29 3d 3d 30 20 29 20 62 72 65 61 6b  PEND)==0 ) break
3870: 3b 0a 20 20 20 20 20 20 20 20 70 4e 6f 64 65 20  ;.        pNode 
3880: 3d 20 26 70 4e 6f 64 65 5b 70 4e 6f 64 65 2d 3e  = &pNode[pNode->
3890: 75 2e 69 41 70 70 65 6e 64 5d 3b 0a 20 20 20 20  u.iAppend];.    
38a0: 20 20 20 20 6a 20 3d 20 31 3b 0a 20 20 20 20 20      j = 1;.     
38b0: 20 7d 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70 70   }.      jsonApp
38c0: 65 6e 64 43 68 61 72 28 70 4f 75 74 2c 20 27 5d  endChar(pOut, ']
38d0: 27 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ');.      break;
38e0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
38f0: 4a 53 4f 4e 5f 4f 42 4a 45 43 54 3a 20 7b 0a 20  JSON_OBJECT: {. 
3900: 20 20 20 20 20 75 33 32 20 6a 20 3d 20 31 3b 0a       u32 j = 1;.
3910: 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64        jsonAppend
3920: 43 68 61 72 28 70 4f 75 74 2c 20 27 7b 27 29 3b  Char(pOut, '{');
3930: 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a  .      for(;;){.
3940: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a          while( j
3950: 3c 3d 70 4e 6f 64 65 2d 3e 6e 20 29 7b 0a 20 20  <=pNode->n ){.  
3960: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4e 6f          if( (pNo
3970: 64 65 5b 6a 2b 31 5d 2e 6a 6e 46 6c 61 67 73 20  de[j+1].jnFlags 
3980: 26 20 4a 4e 4f 44 45 5f 52 45 4d 4f 56 45 29 3d  & JNODE_REMOVE)=
3990: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
39a0: 20 20 6a 73 6f 6e 41 70 70 65 6e 64 53 65 70 61    jsonAppendSepa
39b0: 72 61 74 6f 72 28 70 4f 75 74 29 3b 0a 20 20 20  rator(pOut);.   
39c0: 20 20 20 20 20 20 20 20 20 6a 73 6f 6e 52 65 6e           jsonRen
39d0: 64 65 72 4e 6f 64 65 28 26 70 4e 6f 64 65 5b 6a  derNode(&pNode[j
39e0: 5d 2c 20 70 4f 75 74 2c 20 61 52 65 70 6c 61 63  ], pOut, aReplac
39f0: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
3a00: 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61 72 28 70  jsonAppendChar(p
3a10: 4f 75 74 2c 20 27 3a 27 29 3b 0a 20 20 20 20 20  Out, ':');.     
3a20: 20 20 20 20 20 20 20 6a 73 6f 6e 52 65 6e 64 65         jsonRende
3a30: 72 4e 6f 64 65 28 26 70 4e 6f 64 65 5b 6a 2b 31  rNode(&pNode[j+1
3a40: 5d 2c 20 70 4f 75 74 2c 20 61 52 65 70 6c 61 63  ], pOut, aReplac
3a50: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
3a60: 20 20 20 20 20 20 20 20 20 20 6a 20 2b 3d 20 31            j += 1
3a70: 20 2b 20 6a 73 6f 6e 4e 6f 64 65 53 69 7a 65 28   + jsonNodeSize(
3a80: 26 70 4e 6f 64 65 5b 6a 2b 31 5d 29 3b 0a 20 20  &pNode[j+1]);.  
3a90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3aa0: 69 66 28 20 28 70 4e 6f 64 65 2d 3e 6a 6e 46 6c  if( (pNode->jnFl
3ab0: 61 67 73 20 26 20 4a 4e 4f 44 45 5f 41 50 50 45  ags & JNODE_APPE
3ac0: 4e 44 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ND)==0 ) break;.
3ad0: 20 20 20 20 20 20 20 20 70 4e 6f 64 65 20 3d 20          pNode = 
3ae0: 26 70 4e 6f 64 65 5b 70 4e 6f 64 65 2d 3e 75 2e  &pNode[pNode->u.
3af0: 69 41 70 70 65 6e 64 5d 3b 0a 20 20 20 20 20 20  iAppend];.      
3b00: 20 20 6a 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d    j = 1;.      }
3b10: 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e  .      jsonAppen
3b20: 64 43 68 61 72 28 70 4f 75 74 2c 20 27 7d 27 29  dChar(pOut, '}')
3b30: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3b40: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
3b50: 2a 20 52 65 74 75 72 6e 20 61 20 4a 73 6f 6e 4e  * Return a JsonN
3b60: 6f 64 65 20 61 6e 64 20 61 6c 6c 20 69 74 73 20  ode and all its 
3b70: 64 65 73 63 65 6e 64 65 6e 74 73 20 61 73 20 61  descendents as a
3b80: 20 4a 53 4f 4e 20 73 74 72 69 6e 67 2e 0a 2a 2f   JSON string..*/
3b90: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f  .static void jso
3ba0: 6e 52 65 74 75 72 6e 4a 73 6f 6e 28 0a 20 20 4a  nReturnJson(.  J
3bb0: 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 20  sonNode *pNode, 
3bc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
3bd0: 64 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  de to return */.
3be0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
3bf0: 74 20 2a 70 43 74 78 2c 20 20 20 20 20 20 2f 2a  t *pCtx,      /*
3c00: 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 66 6f   Return value fo
3c10: 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
3c20: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
3c30: 75 65 20 2a 2a 61 52 65 70 6c 61 63 65 20 20 20  ue **aReplace   
3c40: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 72 65 70   /* Array of rep
3c50: 6c 61 63 65 6d 65 6e 74 20 76 61 6c 75 65 73 20  lacement values 
3c60: 2a 2f 0a 29 7b 0a 20 20 4a 73 6f 6e 53 74 72 69  */.){.  JsonStri
3c70: 6e 67 20 73 3b 0a 20 20 6a 73 6f 6e 49 6e 69 74  ng s;.  jsonInit
3c80: 28 26 73 2c 20 70 43 74 78 29 3b 0a 20 20 6a 73  (&s, pCtx);.  js
3c90: 6f 6e 52 65 6e 64 65 72 4e 6f 64 65 28 70 4e 6f  onRenderNode(pNo
3ca0: 64 65 2c 20 26 73 2c 20 61 52 65 70 6c 61 63 65  de, &s, aReplace
3cb0: 29 3b 0a 20 20 6a 73 6f 6e 52 65 73 75 6c 74 28  );.  jsonResult(
3cc0: 26 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  &s);.  sqlite3_r
3cd0: 65 73 75 6c 74 5f 73 75 62 74 79 70 65 28 70 43  esult_subtype(pC
3ce0: 74 78 2c 20 4a 53 4f 4e 5f 53 55 42 54 59 50 45  tx, JSON_SUBTYPE
3cf0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  );.}../*.** Make
3d00: 20 74 68 65 20 4a 73 6f 6e 4e 6f 64 65 20 74 68   the JsonNode th
3d10: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
3d20: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a  f the function..
3d30: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a  */.static void j
3d40: 73 6f 6e 52 65 74 75 72 6e 28 0a 20 20 4a 73 6f  sonReturn(.  Jso
3d50: 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 20 20 20  nNode *pNode,   
3d60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 64 65           /* Node
3d70: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
3d80: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
3d90: 2a 70 43 74 78 2c 20 20 20 20 20 20 2f 2a 20 52  *pCtx,      /* R
3da0: 65 74 75 72 6e 20 76 61 6c 75 65 20 66 6f 72 20  eturn value for 
3db0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
3dc0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
3dd0: 20 2a 2a 61 52 65 70 6c 61 63 65 20 20 20 20 2f   **aReplace    /
3de0: 2a 20 41 72 72 61 79 20 6f 66 20 72 65 70 6c 61  * Array of repla
3df0: 63 65 6d 65 6e 74 20 76 61 6c 75 65 73 20 2a 2f  cement values */
3e00: 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20 70 4e  .){.  switch( pN
3e10: 6f 64 65 2d 3e 65 54 79 70 65 20 29 7b 0a 20 20  ode->eType ){.  
3e20: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
3e30: 20 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65     assert( pNode
3e40: 2d 3e 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f 4e 55  ->eType==JSON_NU
3e50: 4c 4c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  LL );.      sqli
3e60: 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 28  te3_result_null(
3e70: 70 43 74 78 29 3b 0a 20 20 20 20 20 20 62 72 65  pCtx);.      bre
3e80: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
3e90: 73 65 20 4a 53 4f 4e 5f 54 52 55 45 3a 20 7b 0a  se JSON_TRUE: {.
3ea0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
3eb0: 73 75 6c 74 5f 69 6e 74 28 70 43 74 78 2c 20 31  sult_int(pCtx, 1
3ec0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
3ed0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a      }.    case J
3ee0: 53 4f 4e 5f 46 41 4c 53 45 3a 20 7b 0a 20 20 20  SON_FALSE: {.   
3ef0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
3f00: 74 5f 69 6e 74 28 70 43 74 78 2c 20 30 29 3b 0a  t_int(pCtx, 0);.
3f10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3f20: 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 53 4f 4e   }.    case JSON
3f30: 5f 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  _INT: {.      sq
3f40: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 20 3d 20  lite3_int64 i = 
3f50: 30 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  0;.      const c
3f60: 68 61 72 20 2a 7a 20 3d 20 70 4e 6f 64 65 2d 3e  har *z = pNode->
3f70: 75 2e 7a 4a 43 6f 6e 74 65 6e 74 3b 0a 20 20 20  u.zJContent;.   
3f80: 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27     if( z[0]=='-'
3f90: 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 20   ){ z++; }.     
3fa0: 20 77 68 69 6c 65 28 20 7a 5b 30 5d 3e 3d 27 30   while( z[0]>='0
3fb0: 27 20 26 26 20 7a 5b 30 5d 3c 3d 27 39 27 20 29  ' && z[0]<='9' )
3fc0: 7b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e  {.        unsign
3fd0: 65 64 20 76 20 3d 20 2a 28 7a 2b 2b 29 20 2d 20  ed v = *(z++) - 
3fe0: 27 30 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28  '0';.        if(
3ff0: 20 69 3e 3d 4c 41 52 47 45 53 54 5f 49 4e 54 36   i>=LARGEST_INT6
4000: 34 2f 31 30 20 29 7b 0a 20 20 20 20 20 20 20 20  4/10 ){.        
4010: 20 20 69 66 28 20 69 3e 4c 41 52 47 45 53 54 5f    if( i>LARGEST_
4020: 49 4e 54 36 34 2f 31 30 20 29 20 67 6f 74 6f 20  INT64/10 ) goto 
4030: 69 6e 74 5f 61 73 5f 72 65 61 6c 3b 0a 20 20 20  int_as_real;.   
4040: 20 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3e         if( z[0]>
4050: 3d 27 30 27 20 26 26 20 7a 5b 30 5d 3c 3d 27 39  ='0' && z[0]<='9
4060: 27 20 29 20 67 6f 74 6f 20 69 6e 74 5f 61 73 5f  ' ) goto int_as_
4070: 72 65 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  real;.          
4080: 69 66 28 20 76 3d 3d 39 20 29 20 67 6f 74 6f 20  if( v==9 ) goto 
4090: 69 6e 74 5f 61 73 5f 72 65 61 6c 3b 0a 20 20 20  int_as_real;.   
40a0: 20 20 20 20 20 20 20 69 66 28 20 76 3d 3d 38 20         if( v==8 
40b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
40c0: 66 28 20 70 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f  f( pNode->u.zJCo
40d0: 6e 74 65 6e 74 5b 30 5d 3d 3d 27 2d 27 20 29 7b  ntent[0]=='-' ){
40e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
40f0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
4100: 74 36 34 28 70 43 74 78 2c 20 53 4d 41 4c 4c 45  t64(pCtx, SMALLE
4110: 53 54 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 20  ST_INT64);.     
4120: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 69 6e           goto in
4130: 74 5f 64 6f 6e 65 3b 0a 20 20 20 20 20 20 20 20  t_done;.        
4140: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4150: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 69 6e           goto in
4160: 74 5f 61 73 5f 72 65 61 6c 3b 0a 20 20 20 20 20  t_as_real;.     
4170: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4180: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
4190: 20 20 20 20 20 20 20 69 20 3d 20 69 2a 31 30 20         i = i*10 
41a0: 2b 20 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  + v;.      }.   
41b0: 20 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 75 2e     if( pNode->u.
41c0: 7a 4a 43 6f 6e 74 65 6e 74 5b 30 5d 3d 3d 27 2d  zJContent[0]=='-
41d0: 27 20 29 7b 20 69 20 3d 20 2d 69 3b 20 7d 0a 20  ' ){ i = -i; }. 
41e0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
41f0: 75 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20  ult_int64(pCtx, 
4200: 69 29 3b 0a 20 20 20 20 20 20 69 6e 74 5f 64 6f  i);.      int_do
4210: 6e 65 3a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ne:.      break;
4220: 0a 20 20 20 20 20 20 69 6e 74 5f 61 73 5f 72 65  .      int_as_re
4230: 61 6c 3a 20 2f 2a 20 66 61 6c 6c 20 74 68 72 6f  al: /* fall thro
4240: 75 67 68 20 74 6f 20 72 65 61 6c 20 2a 2f 3b 0a  ugh to real */;.
4250: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a      }.    case J
4260: 53 4f 4e 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 20  SON_REAL: {.    
4270: 20 20 64 6f 75 62 6c 65 20 72 3b 0a 23 69 66 64    double r;.#ifd
4280: 65 66 20 53 51 4c 49 54 45 5f 41 4d 41 4c 47 41  ef SQLITE_AMALGA
4290: 4d 41 54 49 4f 4e 0a 20 20 20 20 20 20 63 6f 6e  MATION.      con
42a0: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 4e 6f  st char *z = pNo
42b0: 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 3b  de->u.zJContent;
42c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 74  .      sqlite3At
42d0: 6f 46 28 7a 2c 20 26 72 2c 20 73 71 6c 69 74 65  oF(z, &r, sqlite
42e0: 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51  3Strlen30(z), SQ
42f0: 4c 49 54 45 5f 55 54 46 38 29 3b 0a 23 65 6c 73  LITE_UTF8);.#els
4300: 65 0a 20 20 20 20 20 20 72 20 3d 20 73 74 72 74  e.      r = strt
4310: 6f 64 28 70 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f  od(pNode->u.zJCo
4320: 6e 74 65 6e 74 2c 20 30 29 3b 0a 23 65 6e 64 69  ntent, 0);.#endi
4330: 66 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  f.      sqlite3_
4340: 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 70 43  result_double(pC
4350: 74 78 2c 20 72 29 3b 0a 20 20 20 20 20 20 62 72  tx, r);.      br
4360: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
4370: 61 73 65 20 4a 53 4f 4e 5f 53 54 52 49 4e 47 3a  ase JSON_STRING:
4380: 20 7b 0a 23 69 66 20 30 20 2f 2a 20 4e 65 76 65   {.#if 0 /* Neve
4390: 72 20 68 61 70 70 65 6e 73 20 62 65 63 61 75 73  r happens becaus
43a0: 65 20 4a 4e 4f 44 45 5f 52 41 57 20 69 73 20 6f  e JNODE_RAW is o
43b0: 6e 6c 79 20 73 65 74 20 62 79 20 6a 73 6f 6e 5f  nly set by json_
43c0: 73 65 74 28 29 2c 0a 20 20 20 20 20 20 2a 2a 20  set(),.      ** 
43d0: 6a 73 6f 6e 5f 69 6e 73 65 72 74 28 29 20 61 6e  json_insert() an
43e0: 64 20 6a 73 6f 6e 5f 72 65 70 6c 61 63 65 28 29  d json_replace()
43f0: 20 61 6e 64 20 74 68 6f 73 65 20 72 6f 75 74 69   and those routi
4400: 6e 65 73 20 64 6f 20 6e 6f 74 0a 20 20 20 20 20  nes do not.     
4410: 20 2a 2a 20 63 61 6c 6c 20 6a 73 6f 6e 52 65 74   ** call jsonRet
4420: 75 72 6e 28 29 20 2a 2f 0a 20 20 20 20 20 20 69  urn() */.      i
4430: 66 28 20 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67  f( pNode->jnFlag
4440: 73 20 26 20 4a 4e 4f 44 45 5f 52 41 57 20 29 7b  s & JNODE_RAW ){
4450: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4460: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74  _result_text(pCt
4470: 78 2c 20 70 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f  x, pNode->u.zJCo
4480: 6e 74 65 6e 74 2c 20 70 4e 6f 64 65 2d 3e 6e 2c  ntent, pNode->n,
4490: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
44a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
44b0: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
44c0: 20 20 20 20 20 20 7d 65 6c 73 65 20 0a 23 65 6e        }else .#en
44d0: 64 69 66 0a 20 20 20 20 20 20 61 73 73 65 72 74  dif.      assert
44e0: 28 20 28 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67  ( (pNode->jnFlag
44f0: 73 20 26 20 4a 4e 4f 44 45 5f 52 41 57 29 3d 3d  s & JNODE_RAW)==
4500: 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  0 );.      if( (
4510: 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73 20 26  pNode->jnFlags &
4520: 20 4a 4e 4f 44 45 5f 45 53 43 41 50 45 29 3d 3d   JNODE_ESCAPE)==
4530: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
4540: 4a 53 4f 4e 20 66 6f 72 6d 61 74 74 65 64 20 77  JSON formatted w
4550: 69 74 68 6f 75 74 20 61 6e 79 20 62 61 63 6b 73  ithout any backs
4560: 6c 61 73 68 2d 65 73 63 61 70 65 73 20 2a 2f 0a  lash-escapes */.
4570: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
4580: 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78  result_text(pCtx
4590: 2c 20 70 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e  , pNode->u.zJCon
45a0: 74 65 6e 74 2b 31 2c 20 70 4e 6f 64 65 2d 3e 6e  tent+1, pNode->n
45b0: 2d 32 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  -2,.            
45c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45d0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
45e0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
45f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 61 6e 73          /* Trans
4600: 6c 61 74 65 20 4a 53 4f 4e 20 66 6f 72 6d 61 74  late JSON format
4610: 74 65 64 20 73 74 72 69 6e 67 20 69 6e 74 6f 20  ted string into 
4620: 72 61 77 20 74 65 78 74 20 2a 2f 0a 20 20 20 20  raw text */.    
4630: 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20      u32 i;.     
4640: 20 20 20 75 33 32 20 6e 20 3d 20 70 4e 6f 64 65     u32 n = pNode
4650: 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  ->n;.        con
4660: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 4e 6f  st char *z = pNo
4670: 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 3b  de->u.zJContent;
4680: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
4690: 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 75 33 32  Out;.        u32
46a0: 20 6a 3b 0a 20 20 20 20 20 20 20 20 7a 4f 75 74   j;.        zOut
46b0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
46c0: 63 28 20 6e 2b 31 20 29 3b 0a 20 20 20 20 20 20  c( n+1 );.      
46d0: 20 20 69 66 28 20 7a 4f 75 74 3d 3d 30 20 29 7b    if( zOut==0 ){
46e0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
46f0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
4700: 6e 6f 6d 65 6d 28 70 43 74 78 29 3b 0a 20 20 20  nomem(pCtx);.   
4710: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4720: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4730: 66 6f 72 28 69 3d 31 2c 20 6a 3d 30 3b 20 69 3c  for(i=1, j=0; i<
4740: 6e 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  n-1; i++){.     
4750: 20 20 20 20 20 63 68 61 72 20 63 20 3d 20 7a 5b       char c = z[
4760: 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  i];.          if
4770: 28 20 63 21 3d 27 5c 5c 27 20 29 7b 0a 20 20 20  ( c!='\\' ){.   
4780: 20 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 6a 2b           zOut[j+
4790: 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20  +] = c;.        
47a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
47b0: 20 20 20 20 20 63 20 3d 20 7a 5b 2b 2b 69 5d 3b       c = z[++i];
47c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
47d0: 20 63 3d 3d 27 75 27 20 29 7b 0a 20 20 20 20 20   c=='u' ){.     
47e0: 20 20 20 20 20 20 20 20 20 75 33 32 20 76 20 3d           u32 v =
47f0: 20 30 2c 20 6b 3b 0a 20 20 20 20 20 20 20 20 20   0, k;.         
4800: 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c       for(k=0; k<
4810: 34 3b 20 69 2b 2b 2c 20 6b 2b 2b 29 7b 0a 20 20  4; i++, k++){.  
4820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
4830: 73 65 72 74 28 20 69 3c 6e 2d 32 20 29 3b 0a 20  sert( i<n-2 );. 
4840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
4850: 20 3d 20 7a 5b 69 2b 31 5d 3b 0a 20 20 20 20 20   = z[i+1];.     
4860: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
4870: 74 28 20 73 61 66 65 5f 69 73 78 64 69 67 69 74  t( safe_isxdigit
4880: 28 63 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  (c) );.         
4890: 20 20 20 20 20 20 20 69 66 28 20 63 3c 3d 27 39         if( c<='9
48a0: 27 20 29 20 76 20 3d 20 76 2a 31 36 20 2b 20 63  ' ) v = v*16 + c
48b0: 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20   - '0';.        
48c0: 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 28          else if(
48d0: 20 63 3c 3d 27 46 27 20 29 20 76 20 3d 20 76 2a   c<='F' ) v = v*
48e0: 31 36 20 2b 20 63 20 2d 20 27 41 27 20 2b 20 31  16 + c - 'A' + 1
48f0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0;.             
4900: 20 20 20 65 6c 73 65 20 76 20 3d 20 76 2a 31 36     else v = v*16
4910: 20 2b 20 63 20 2d 20 27 61 27 20 2b 20 31 30 3b   + c - 'a' + 10;
4920: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
4930: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
4940: 66 28 20 76 3d 3d 30 20 29 20 62 72 65 61 6b 3b  f( v==0 ) break;
4950: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
4960: 66 28 20 76 3c 3d 30 78 37 66 20 29 7b 0a 20 20  f( v<=0x7f ){.  
4970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4f                zO
4980: 75 74 5b 6a 2b 2b 5d 20 3d 20 28 63 68 61 72 29  ut[j++] = (char)
4990: 76 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  v;.             
49a0: 20 7d 65 6c 73 65 20 69 66 28 20 76 3c 3d 30 78   }else if( v<=0x
49b0: 37 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  7ff ){.         
49c0: 20 20 20 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d         zOut[j++]
49d0: 20 3d 20 28 63 68 61 72 29 28 30 78 63 30 20 7c   = (char)(0xc0 |
49e0: 20 28 76 3e 3e 36 29 29 3b 0a 20 20 20 20 20 20   (v>>6));.      
49f0: 20 20 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 6a            zOut[j
4a00: 2b 2b 5d 20 3d 20 30 78 38 30 20 7c 20 28 76 26  ++] = 0x80 | (v&
4a10: 30 78 33 66 29 3b 0a 20 20 20 20 20 20 20 20 20  0x3f);.         
4a20: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4a30: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4f 75 74              zOut
4a40: 5b 6a 2b 2b 5d 20 3d 20 28 63 68 61 72 29 28 30  [j++] = (char)(0
4a50: 78 65 30 20 7c 20 28 76 3e 3e 31 32 29 29 3b 0a  xe0 | (v>>12));.
4a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a70: 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 30 78 38 30  zOut[j++] = 0x80
4a80: 20 7c 20 28 28 76 3e 3e 36 29 26 30 78 33 66 29   | ((v>>6)&0x3f)
4a90: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
4aa0: 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 30 78    zOut[j++] = 0x
4ab0: 38 30 20 7c 20 28 76 26 30 78 33 66 29 3b 0a 20  80 | (v&0x3f);. 
4ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
4ad0: 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
4ae0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
4af0: 69 66 28 20 63 3d 3d 27 62 27 20 29 7b 0a 20 20  if( c=='b' ){.  
4b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 20                c 
4b10: 3d 20 27 5c 62 27 3b 0a 20 20 20 20 20 20 20 20  = '\b';.        
4b20: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
4b30: 63 3d 3d 27 66 27 20 29 7b 0a 20 20 20 20 20 20  c=='f' ){.      
4b40: 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c            c = '\
4b50: 66 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  f';.            
4b60: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
4b70: 6e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  n' ){.          
4b80: 20 20 20 20 20 20 63 20 3d 20 27 5c 6e 27 3b 0a        c = '\n';.
4b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65                }e
4ba0: 6c 73 65 20 69 66 28 20 63 3d 3d 27 72 27 20 29  lse if( c=='r' )
4bb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
4bc0: 20 20 63 20 3d 20 27 5c 72 27 3b 0a 20 20 20 20    c = '\r';.    
4bd0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
4be0: 69 66 28 20 63 3d 3d 27 74 27 20 29 7b 0a 20 20  if( c=='t' ){.  
4bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 20                c 
4c00: 3d 20 27 5c 74 27 3b 0a 20 20 20 20 20 20 20 20  = '\t';.        
4c10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4c20: 20 20 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20        zOut[j++] 
4c30: 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = c;.           
4c40: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
4c50: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4c60: 20 7a 4f 75 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20   zOut[j] = 0;.  
4c70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
4c80: 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20  sult_text(pCtx, 
4c90: 7a 4f 75 74 2c 20 6a 2c 20 73 71 6c 69 74 65 33  zOut, j, sqlite3
4ca0: 5f 66 72 65 65 29 3b 0a 20 20 20 20 20 20 7d 0a  _free);.      }.
4cb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4cc0: 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 53 4f 4e   }.    case JSON
4cd0: 5f 41 52 52 41 59 3a 0a 20 20 20 20 63 61 73 65  _ARRAY:.    case
4ce0: 20 4a 53 4f 4e 5f 4f 42 4a 45 43 54 3a 20 7b 0a   JSON_OBJECT: {.
4cf0: 20 20 20 20 20 20 6a 73 6f 6e 52 65 74 75 72 6e        jsonReturn
4d00: 4a 73 6f 6e 28 70 4e 6f 64 65 2c 20 70 43 74 78  Json(pNode, pCtx
4d10: 2c 20 61 52 65 70 6c 61 63 65 29 3b 0a 20 20 20  , aReplace);.   
4d20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4d30: 20 20 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72    }.}../* Forwar
4d40: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
4d50: 74 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e 50 61  tatic int jsonPa
4d60: 72 73 65 41 64 64 4e 6f 64 65 28 4a 73 6f 6e 50  rseAddNode(JsonP
4d70: 61 72 73 65 2a 2c 75 33 32 2c 75 33 32 2c 63 6f  arse*,u32,u32,co
4d80: 6e 73 74 20 63 68 61 72 2a 29 3b 0a 0a 2f 2a 0a  nst char*);../*.
4d90: 2a 2a 20 41 20 6d 61 63 72 6f 20 74 6f 20 68 69  ** A macro to hi
4da0: 6e 74 20 74 6f 20 74 68 65 20 63 6f 6d 70 69 6c  nt to the compil
4db0: 65 72 20 74 68 61 74 20 61 20 66 75 6e 63 74 69  er that a functi
4dc0: 6f 6e 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  on should not be
4dd0: 0a 2a 2a 20 69 6e 6c 69 6e 65 64 2e 0a 2a 2f 0a  .** inlined..*/.
4de0: 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 47 4e  #if defined(__GN
4df0: 55 43 5f 5f 29 0a 23 20 20 64 65 66 69 6e 65 20  UC__).#  define 
4e00: 4a 53 4f 4e 5f 4e 4f 49 4e 4c 49 4e 45 20 20 5f  JSON_NOINLINE  _
4e10: 5f 61 74 74 72 69 62 75 74 65 5f 5f 28 28 6e 6f  _attribute__((no
4e20: 69 6e 6c 69 6e 65 29 29 0a 23 65 6c 69 66 20 64  inline)).#elif d
4e30: 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29  efined(_MSC_VER)
4e40: 20 26 26 20 5f 4d 53 43 5f 56 45 52 3e 3d 31 33   && _MSC_VER>=13
4e50: 31 30 0a 23 20 20 64 65 66 69 6e 65 20 4a 53 4f  10.#  define JSO
4e60: 4e 5f 4e 4f 49 4e 4c 49 4e 45 20 20 5f 5f 64 65  N_NOINLINE  __de
4e70: 63 6c 73 70 65 63 28 6e 6f 69 6e 6c 69 6e 65 29  clspec(noinline)
4e80: 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65  .#else.#  define
4e90: 20 4a 53 4f 4e 5f 4e 4f 49 4e 4c 49 4e 45 0a 23   JSON_NOINLINE.#
4ea0: 65 6e 64 69 66 0a 0a 0a 73 74 61 74 69 63 20 4a  endif...static J
4eb0: 53 4f 4e 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74  SON_NOINLINE int
4ec0: 20 6a 73 6f 6e 50 61 72 73 65 41 64 64 4e 6f 64   jsonParseAddNod
4ed0: 65 45 78 70 61 6e 64 28 0a 20 20 4a 73 6f 6e 50  eExpand(.  JsonP
4ee0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
4ef0: 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74       /* Append t
4f00: 68 65 20 6e 6f 64 65 20 74 6f 20 74 68 69 73 20  he node to this 
4f10: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 33 32 20  object */.  u32 
4f20: 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  eType,          
4f30: 20 20 20 20 20 20 2f 2a 20 4e 6f 64 65 20 74 79        /* Node ty
4f40: 70 65 20 2a 2f 0a 20 20 75 33 32 20 6e 2c 20 20  pe */.  u32 n,  
4f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f60: 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 73 69 7a    /* Content siz
4f70: 65 20 6f 72 20 73 75 62 2d 6e 6f 64 65 20 63 6f  e or sub-node co
4f80: 75 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  unt */.  const c
4f90: 68 61 72 20 2a 7a 43 6f 6e 74 65 6e 74 20 20 20  har *zContent   
4fa0: 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 2a 2f     /* Content */
4fb0: 0a 29 7b 0a 20 20 75 33 32 20 6e 4e 65 77 3b 0a  .){.  u32 nNew;.
4fc0: 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e 65 77    JsonNode *pNew
4fd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
4fe0: 73 65 2d 3e 6e 4e 6f 64 65 3e 3d 70 50 61 72 73  se->nNode>=pPars
4ff0: 65 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 20 20 69  e->nAlloc );.  i
5000: 66 28 20 70 50 61 72 73 65 2d 3e 6f 6f 6d 20 29  f( pParse->oom )
5010: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 6e 4e   return -1;.  nN
5020: 65 77 20 3d 20 70 50 61 72 73 65 2d 3e 6e 41 6c  ew = pParse->nAl
5030: 6c 6f 63 2a 32 20 2b 20 31 30 3b 0a 20 20 70 4e  loc*2 + 10;.  pN
5040: 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61  ew = sqlite3_rea
5050: 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 61 4e 6f  lloc(pParse->aNo
5060: 64 65 2c 20 73 69 7a 65 6f 66 28 4a 73 6f 6e 4e  de, sizeof(JsonN
5070: 6f 64 65 29 2a 6e 4e 65 77 29 3b 0a 20 20 69 66  ode)*nNew);.  if
5080: 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
5090: 20 70 50 61 72 73 65 2d 3e 6f 6f 6d 20 3d 20 31   pParse->oom = 1
50a0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  ;.    return -1;
50b0: 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e  .  }.  pParse->n
50c0: 41 6c 6c 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20 20  Alloc = nNew;.  
50d0: 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65 20 3d 20  pParse->aNode = 
50e0: 70 4e 65 77 3b 0a 20 20 61 73 73 65 72 74 28 20  pNew;.  assert( 
50f0: 70 50 61 72 73 65 2d 3e 6e 4e 6f 64 65 3c 70 50  pParse->nNode<pP
5100: 61 72 73 65 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a  arse->nAlloc );.
5110: 20 20 72 65 74 75 72 6e 20 6a 73 6f 6e 50 61 72    return jsonPar
5120: 73 65 41 64 64 4e 6f 64 65 28 70 50 61 72 73 65  seAddNode(pParse
5130: 2c 20 65 54 79 70 65 2c 20 6e 2c 20 7a 43 6f 6e  , eType, n, zCon
5140: 74 65 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tent);.}../*.** 
5150: 43 72 65 61 74 65 20 61 20 6e 65 77 20 4a 73 6f  Create a new Jso
5160: 6e 4e 6f 64 65 20 69 6e 73 74 61 6e 63 65 20 62  nNode instance b
5170: 61 73 65 64 20 6f 6e 20 74 68 65 20 61 72 67 75  ased on the argu
5180: 6d 65 6e 74 73 20 61 6e 64 20 61 70 70 65 6e 64  ments and append
5190: 20 74 68 61 74 0a 2a 2a 20 69 6e 73 74 61 6e 63   that.** instanc
51a0: 65 20 74 6f 20 74 68 65 20 4a 73 6f 6e 50 61 72  e to the JsonPar
51b0: 73 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  se.  Return the 
51c0: 69 6e 64 65 78 20 69 6e 20 70 50 61 72 73 65 2d  index in pParse-
51d0: 3e 61 4e 6f 64 65 5b 5d 20 6f 66 20 74 68 65 0a  >aNode[] of the.
51e0: 2a 2a 20 6e 65 77 20 6e 6f 64 65 2c 20 6f 72 20  ** new node, or 
51f0: 2d 31 20 69 66 20 61 20 6d 65 6d 6f 72 79 20 61  -1 if a memory a
5200: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2e  llocation fails.
5210: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a  .*/.static int j
5220: 73 6f 6e 50 61 72 73 65 41 64 64 4e 6f 64 65 28  sonParseAddNode(
5230: 0a 20 20 4a 73 6f 6e 50 61 72 73 65 20 2a 70 50  .  JsonParse *pP
5240: 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
5250: 41 70 70 65 6e 64 20 74 68 65 20 6e 6f 64 65 20  Append the node 
5260: 74 6f 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a  to this object *
5270: 2f 0a 20 20 75 33 32 20 65 54 79 70 65 2c 20 20  /.  u32 eType,  
5280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5290: 20 4e 6f 64 65 20 74 79 70 65 20 2a 2f 0a 20 20   Node type */.  
52a0: 75 33 32 20 6e 2c 20 20 20 20 20 20 20 20 20 20  u32 n,          
52b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
52c0: 74 65 6e 74 20 73 69 7a 65 20 6f 72 20 73 75 62  tent size or sub
52d0: 2d 6e 6f 64 65 20 63 6f 75 6e 74 20 2a 2f 0a 20  -node count */. 
52e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
52f0: 6e 74 65 6e 74 20 20 20 20 20 20 2f 2a 20 43 6f  ntent      /* Co
5300: 6e 74 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 4a 73  ntent */.){.  Js
5310: 6f 6e 4e 6f 64 65 20 2a 70 3b 0a 20 20 69 66 28  onNode *p;.  if(
5320: 20 70 50 61 72 73 65 2d 3e 6e 4e 6f 64 65 3e 3d   pParse->nNode>=
5330: 70 50 61 72 73 65 2d 3e 6e 41 6c 6c 6f 63 20 29  pParse->nAlloc )
5340: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6a 73 6f  {.    return jso
5350: 6e 50 61 72 73 65 41 64 64 4e 6f 64 65 45 78 70  nParseAddNodeExp
5360: 61 6e 64 28 70 50 61 72 73 65 2c 20 65 54 79 70  and(pParse, eTyp
5370: 65 2c 20 6e 2c 20 7a 43 6f 6e 74 65 6e 74 29 3b  e, n, zContent);
5380: 0a 20 20 7d 0a 20 20 70 20 3d 20 26 70 50 61 72  .  }.  p = &pPar
5390: 73 65 2d 3e 61 4e 6f 64 65 5b 70 50 61 72 73 65  se->aNode[pParse
53a0: 2d 3e 6e 4e 6f 64 65 5d 3b 0a 20 20 70 2d 3e 65  ->nNode];.  p->e
53b0: 54 79 70 65 20 3d 20 28 75 38 29 65 54 79 70 65  Type = (u8)eType
53c0: 3b 0a 20 20 70 2d 3e 6a 6e 46 6c 61 67 73 20 3d  ;.  p->jnFlags =
53d0: 20 30 3b 0a 20 20 70 2d 3e 6e 20 3d 20 6e 3b 0a   0;.  p->n = n;.
53e0: 20 20 70 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74    p->u.zJContent
53f0: 20 3d 20 7a 43 6f 6e 74 65 6e 74 3b 0a 20 20 72   = zContent;.  r
5400: 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 4e  eturn pParse->nN
5410: 6f 64 65 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ode++;.}../*.** 
5420: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 7a  Return true if z
5430: 5b 5d 20 62 65 67 69 6e 73 20 77 69 74 68 20 34  [] begins with 4
5440: 20 28 6f 72 20 6d 6f 72 65 29 20 68 65 78 61 64   (or more) hexad
5450: 65 63 69 6d 61 6c 20 64 69 67 69 74 73 0a 2a 2f  ecimal digits.*/
5460: 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e  .static int json
5470: 49 73 34 48 65 78 28 63 6f 6e 73 74 20 63 68 61  Is4Hex(const cha
5480: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  r *z){.  int i;.
5490: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 34 3b 20    for(i=0; i<4; 
54a0: 69 2b 2b 29 20 69 66 28 20 21 73 61 66 65 5f 69  i++) if( !safe_i
54b0: 73 78 64 69 67 69 74 28 7a 5b 69 5d 29 20 29 20  sxdigit(z[i]) ) 
54c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
54d0: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  rn 1;.}../*.** P
54e0: 61 72 73 65 20 61 20 73 69 6e 67 6c 65 20 4a 53  arse a single JS
54f0: 4f 4e 20 76 61 6c 75 65 20 77 68 69 63 68 20 62  ON value which b
5500: 65 67 69 6e 73 20 61 74 20 70 50 61 72 73 65 2d  egins at pParse-
5510: 3e 7a 4a 73 6f 6e 5b 69 5d 2e 20 20 52 65 74 75  >zJson[i].  Retu
5520: 72 6e 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20  rn the.** index 
5530: 6f 66 20 74 68 65 20 66 69 72 73 74 20 63 68 61  of the first cha
5540: 72 61 63 74 65 72 20 70 61 73 74 20 74 68 65 20  racter past the 
5550: 65 6e 64 20 6f 66 20 74 68 65 20 76 61 6c 75 65  end of the value
5560: 20 70 61 72 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 52   parsed..**.** R
5570: 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65 20 66  eturn negative f
5580: 6f 72 20 61 20 73 79 6e 74 61 78 20 65 72 72 6f  or a syntax erro
5590: 72 2e 20 20 53 70 65 63 69 61 6c 20 63 61 73 65  r.  Special case
55a0: 73 3a 20 20 72 65 74 75 72 6e 20 2d 32 20 69 66  s:  return -2 if
55b0: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 6f   the.** first no
55c0: 6e 2d 77 68 69 74 65 73 70 61 63 65 20 63 68 61  n-whitespace cha
55d0: 72 61 63 74 65 72 20 69 73 20 27 7d 27 20 61 6e  racter is '}' an
55e0: 64 20 72 65 74 75 72 6e 20 2d 33 20 69 66 20 74  d return -3 if t
55f0: 68 65 20 66 69 72 73 74 0a 2a 2a 20 6e 6f 6e 2d  he first.** non-
5600: 77 68 69 74 65 73 70 61 63 65 20 63 68 61 72 61  whitespace chara
5610: 63 74 65 72 20 69 73 20 27 5d 27 2e 0a 2a 2f 0a  cter is ']'..*/.
5620: 73 74 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e 50  static int jsonP
5630: 61 72 73 65 56 61 6c 75 65 28 4a 73 6f 6e 50 61  arseValue(JsonPa
5640: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 75 33 32  rse *pParse, u32
5650: 20 69 29 7b 0a 20 20 63 68 61 72 20 63 3b 0a 20   i){.  char c;. 
5660: 20 75 33 32 20 6a 3b 0a 20 20 69 6e 74 20 69 54   u32 j;.  int iT
5670: 68 69 73 3b 0a 20 20 69 6e 74 20 78 3b 0a 20 20  his;.  int x;.  
5680: 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 3b  JsonNode *pNode;
5690: 0a 20 20 77 68 69 6c 65 28 20 73 61 66 65 5f 69  .  while( safe_i
56a0: 73 73 70 61 63 65 28 70 50 61 72 73 65 2d 3e 7a  sspace(pParse->z
56b0: 4a 73 6f 6e 5b 69 5d 29 20 29 7b 20 69 2b 2b 3b  Json[i]) ){ i++;
56c0: 20 7d 0a 20 20 69 66 28 20 28 63 20 3d 20 70 50   }.  if( (c = pP
56d0: 61 72 73 65 2d 3e 7a 4a 73 6f 6e 5b 69 5d 29 3d  arse->zJson[i])=
56e0: 3d 27 7b 27 20 29 7b 0a 20 20 20 20 2f 2a 20 50  ='{' ){.    /* P
56f0: 61 72 73 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  arse object */. 
5700: 20 20 20 69 54 68 69 73 20 3d 20 6a 73 6f 6e 50     iThis = jsonP
5710: 61 72 73 65 41 64 64 4e 6f 64 65 28 70 50 61 72  arseAddNode(pPar
5720: 73 65 2c 20 4a 53 4f 4e 5f 4f 42 4a 45 43 54 2c  se, JSON_OBJECT,
5730: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
5740: 69 54 68 69 73 3c 30 20 29 20 72 65 74 75 72 6e  iThis<0 ) return
5750: 20 2d 31 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69   -1;.    for(j=i
5760: 2b 31 3b 3b 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  +1;;j++){.      
5770: 77 68 69 6c 65 28 20 73 61 66 65 5f 69 73 73 70  while( safe_issp
5780: 61 63 65 28 70 50 61 72 73 65 2d 3e 7a 4a 73 6f  ace(pParse->zJso
5790: 6e 5b 6a 5d 29 20 29 7b 20 6a 2b 2b 3b 20 7d 0a  n[j]) ){ j++; }.
57a0: 20 20 20 20 20 20 78 20 3d 20 6a 73 6f 6e 50 61        x = jsonPa
57b0: 72 73 65 56 61 6c 75 65 28 70 50 61 72 73 65 2c  rseValue(pParse,
57c0: 20 6a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 78   j);.      if( x
57d0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  <0 ){.        if
57e0: 28 20 78 3d 3d 28 2d 32 29 20 26 26 20 70 50 61  ( x==(-2) && pPa
57f0: 72 73 65 2d 3e 6e 4e 6f 64 65 3d 3d 28 75 33 32  rse->nNode==(u32
5800: 29 69 54 68 69 73 2b 31 20 29 20 72 65 74 75 72  )iThis+1 ) retur
5810: 6e 20 6a 2b 31 3b 0a 20 20 20 20 20 20 20 20 72  n j+1;.        r
5820: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
5830: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72  }.      if( pPar
5840: 73 65 2d 3e 6f 6f 6d 20 29 20 72 65 74 75 72 6e  se->oom ) return
5850: 20 2d 31 3b 0a 20 20 20 20 20 20 70 4e 6f 64 65   -1;.      pNode
5860: 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 4e 6f 64   = &pParse->aNod
5870: 65 5b 70 50 61 72 73 65 2d 3e 6e 4e 6f 64 65 2d  e[pParse->nNode-
5880: 31 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  1];.      if( pN
5890: 6f 64 65 2d 3e 65 54 79 70 65 21 3d 4a 53 4f 4e  ode->eType!=JSON
58a0: 5f 53 54 52 49 4e 47 20 29 20 72 65 74 75 72 6e  _STRING ) return
58b0: 20 2d 31 3b 0a 20 20 20 20 20 20 70 4e 6f 64 65   -1;.      pNode
58c0: 2d 3e 6a 6e 46 6c 61 67 73 20 7c 3d 20 4a 4e 4f  ->jnFlags |= JNO
58d0: 44 45 5f 4c 41 42 45 4c 3b 0a 20 20 20 20 20 20  DE_LABEL;.      
58e0: 6a 20 3d 20 78 3b 0a 20 20 20 20 20 20 77 68 69  j = x;.      whi
58f0: 6c 65 28 20 73 61 66 65 5f 69 73 73 70 61 63 65  le( safe_isspace
5900: 28 70 50 61 72 73 65 2d 3e 7a 4a 73 6f 6e 5b 6a  (pParse->zJson[j
5910: 5d 29 20 29 7b 20 6a 2b 2b 3b 20 7d 0a 20 20 20  ]) ){ j++; }.   
5920: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 7a     if( pParse->z
5930: 4a 73 6f 6e 5b 6a 5d 21 3d 27 3a 27 20 29 20 72  Json[j]!=':' ) r
5940: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
5950: 6a 2b 2b 3b 0a 20 20 20 20 20 20 78 20 3d 20 6a  j++;.      x = j
5960: 73 6f 6e 50 61 72 73 65 56 61 6c 75 65 28 70 50  sonParseValue(pP
5970: 61 72 73 65 2c 20 6a 29 3b 0a 20 20 20 20 20 20  arse, j);.      
5980: 69 66 28 20 78 3c 30 20 29 20 72 65 74 75 72 6e  if( x<0 ) return
5990: 20 2d 31 3b 0a 20 20 20 20 20 20 6a 20 3d 20 78   -1;.      j = x
59a0: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 73  ;.      while( s
59b0: 61 66 65 5f 69 73 73 70 61 63 65 28 70 50 61 72  afe_isspace(pPar
59c0: 73 65 2d 3e 7a 4a 73 6f 6e 5b 6a 5d 29 20 29 7b  se->zJson[j]) ){
59d0: 20 6a 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 63 20   j++; }.      c 
59e0: 3d 20 70 50 61 72 73 65 2d 3e 7a 4a 73 6f 6e 5b  = pParse->zJson[
59f0: 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d  j];.      if( c=
5a00: 3d 27 2c 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b  =',' ) continue;
5a10: 0a 20 20 20 20 20 20 69 66 28 20 63 21 3d 27 7d  .      if( c!='}
5a20: 27 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  ' ) return -1;. 
5a30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5a40: 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61 4e  }.    pParse->aN
5a50: 6f 64 65 5b 69 54 68 69 73 5d 2e 6e 20 3d 20 70  ode[iThis].n = p
5a60: 50 61 72 73 65 2d 3e 6e 4e 6f 64 65 20 2d 20 28  Parse->nNode - (
5a70: 75 33 32 29 69 54 68 69 73 20 2d 20 31 3b 0a 20  u32)iThis - 1;. 
5a80: 20 20 20 72 65 74 75 72 6e 20 6a 2b 31 3b 0a 20     return j+1;. 
5a90: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5b   }else if( c=='[
5aa0: 27 20 29 7b 0a 20 20 20 20 2f 2a 20 50 61 72 73  ' ){.    /* Pars
5ab0: 65 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69  e array */.    i
5ac0: 54 68 69 73 20 3d 20 6a 73 6f 6e 50 61 72 73 65  This = jsonParse
5ad0: 41 64 64 4e 6f 64 65 28 70 50 61 72 73 65 2c 20  AddNode(pParse, 
5ae0: 4a 53 4f 4e 5f 41 52 52 41 59 2c 20 30 2c 20 30  JSON_ARRAY, 0, 0
5af0: 29 3b 0a 20 20 20 20 69 66 28 20 69 54 68 69 73  );.    if( iThis
5b00: 3c 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  <0 ) return -1;.
5b10: 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 3b 6a      for(j=i+1;;j
5b20: 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65  ++){.      while
5b30: 28 20 73 61 66 65 5f 69 73 73 70 61 63 65 28 70  ( safe_isspace(p
5b40: 50 61 72 73 65 2d 3e 7a 4a 73 6f 6e 5b 6a 5d 29  Parse->zJson[j])
5b50: 20 29 7b 20 6a 2b 2b 3b 20 7d 0a 20 20 20 20 20   ){ j++; }.     
5b60: 20 78 20 3d 20 6a 73 6f 6e 50 61 72 73 65 56 61   x = jsonParseVa
5b70: 6c 75 65 28 70 50 61 72 73 65 2c 20 6a 29 3b 0a  lue(pParse, j);.
5b80: 20 20 20 20 20 20 69 66 28 20 78 3c 30 20 29 7b        if( x<0 ){
5b90: 0a 20 20 20 20 20 20 20 20 69 66 28 20 78 3d 3d  .        if( x==
5ba0: 28 2d 33 29 20 26 26 20 70 50 61 72 73 65 2d 3e  (-3) && pParse->
5bb0: 6e 4e 6f 64 65 3d 3d 28 75 33 32 29 69 54 68 69  nNode==(u32)iThi
5bc0: 73 2b 31 20 29 20 72 65 74 75 72 6e 20 6a 2b 31  s+1 ) return j+1
5bd0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
5be0: 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   -1;.      }.   
5bf0: 20 20 20 6a 20 3d 20 78 3b 0a 20 20 20 20 20 20     j = x;.      
5c00: 77 68 69 6c 65 28 20 73 61 66 65 5f 69 73 73 70  while( safe_issp
5c10: 61 63 65 28 70 50 61 72 73 65 2d 3e 7a 4a 73 6f  ace(pParse->zJso
5c20: 6e 5b 6a 5d 29 20 29 7b 20 6a 2b 2b 3b 20 7d 0a  n[j]) ){ j++; }.
5c30: 20 20 20 20 20 20 63 20 3d 20 70 50 61 72 73 65        c = pParse
5c40: 2d 3e 7a 4a 73 6f 6e 5b 6a 5d 3b 0a 20 20 20 20  ->zJson[j];.    
5c50: 20 20 69 66 28 20 63 3d 3d 27 2c 27 20 29 20 63    if( c==',' ) c
5c60: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
5c70: 66 28 20 63 21 3d 27 5d 27 20 29 20 72 65 74 75  f( c!=']' ) retu
5c80: 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 62 72 65  rn -1;.      bre
5c90: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  ak;.    }.    pP
5ca0: 61 72 73 65 2d 3e 61 4e 6f 64 65 5b 69 54 68 69  arse->aNode[iThi
5cb0: 73 5d 2e 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e  s].n = pParse->n
5cc0: 4e 6f 64 65 20 2d 20 28 75 33 32 29 69 54 68 69  Node - (u32)iThi
5cd0: 73 20 2d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  s - 1;.    retur
5ce0: 6e 20 6a 2b 31 3b 0a 20 20 7d 65 6c 73 65 20 69  n j+1;.  }else i
5cf0: 66 28 20 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20  f( c=='"' ){.   
5d00: 20 2f 2a 20 50 61 72 73 65 20 73 74 72 69 6e 67   /* Parse string
5d10: 20 2a 2f 0a 20 20 20 20 75 38 20 6a 6e 46 6c 61   */.    u8 jnFla
5d20: 67 73 20 3d 20 30 3b 0a 20 20 20 20 6a 20 3d 20  gs = 0;.    j = 
5d30: 69 2b 31 3b 0a 20 20 20 20 66 6f 72 28 3b 3b 29  i+1;.    for(;;)
5d40: 7b 0a 20 20 20 20 20 20 63 20 3d 20 70 50 61 72  {.      c = pPar
5d50: 73 65 2d 3e 7a 4a 73 6f 6e 5b 6a 5d 3b 0a 20 20  se->zJson[j];.  
5d60: 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20 72      if( c==0 ) r
5d70: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
5d80: 69 66 28 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20  if( c=='\\' ){. 
5d90: 20 20 20 20 20 20 20 63 20 3d 20 70 50 61 72 73         c = pPars
5da0: 65 2d 3e 7a 4a 73 6f 6e 5b 2b 2b 6a 5d 3b 0a 20  e->zJson[++j];. 
5db0: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 22         if( c=='"
5dc0: 27 20 7c 7c 20 63 3d 3d 27 5c 5c 27 20 7c 7c 20  ' || c=='\\' || 
5dd0: 63 3d 3d 27 2f 27 20 7c 7c 20 63 3d 3d 27 62 27  c=='/' || c=='b'
5de0: 20 7c 7c 20 63 3d 3d 27 66 27 0a 20 20 20 20 20   || c=='f'.     
5df0: 20 20 20 20 20 20 7c 7c 20 63 3d 3d 27 6e 27 20        || c=='n' 
5e00: 7c 7c 20 63 3d 3d 27 72 27 20 7c 7c 20 63 3d 3d  || c=='r' || c==
5e10: 27 74 27 0a 20 20 20 20 20 20 20 20 20 20 20 7c  't'.           |
5e20: 7c 20 28 63 3d 3d 27 75 27 20 26 26 20 6a 73 6f  | (c=='u' && jso
5e30: 6e 49 73 34 48 65 78 28 70 50 61 72 73 65 2d 3e  nIs4Hex(pParse->
5e40: 7a 4a 73 6f 6e 2b 6a 2b 31 29 29 20 29 7b 0a 20  zJson+j+1)) ){. 
5e50: 20 20 20 20 20 20 20 20 20 6a 6e 46 6c 61 67 73           jnFlags
5e60: 20 3d 20 4a 4e 4f 44 45 5f 45 53 43 41 50 45 3b   = JNODE_ESCAPE;
5e70: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
5e80: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
5e90: 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   -1;.        }. 
5ea0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
5eb0: 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20 20  =='"' ){.       
5ec0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
5ed0: 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d        j++;.    }
5ee0: 0a 20 20 20 20 6a 73 6f 6e 50 61 72 73 65 41 64  .    jsonParseAd
5ef0: 64 4e 6f 64 65 28 70 50 61 72 73 65 2c 20 4a 53  dNode(pParse, JS
5f00: 4f 4e 5f 53 54 52 49 4e 47 2c 20 6a 2b 31 2d 69  ON_STRING, j+1-i
5f10: 2c 20 26 70 50 61 72 73 65 2d 3e 7a 4a 73 6f 6e  , &pParse->zJson
5f20: 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 21 70  [i]);.    if( !p
5f30: 50 61 72 73 65 2d 3e 6f 6f 6d 20 29 20 70 50 61  Parse->oom ) pPa
5f40: 72 73 65 2d 3e 61 4e 6f 64 65 5b 70 50 61 72 73  rse->aNode[pPars
5f50: 65 2d 3e 6e 4e 6f 64 65 2d 31 5d 2e 6a 6e 46 6c  e->nNode-1].jnFl
5f60: 61 67 73 20 3d 20 6a 6e 46 6c 61 67 73 3b 0a 20  ags = jnFlags;. 
5f70: 20 20 20 72 65 74 75 72 6e 20 6a 2b 31 3b 0a 20     return j+1;. 
5f80: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 6e   }else if( c=='n
5f90: 27 0a 20 20 20 20 20 20 20 20 20 26 26 20 73 74  '.         && st
5fa0: 72 6e 63 6d 70 28 70 50 61 72 73 65 2d 3e 7a 4a  rncmp(pParse->zJ
5fb0: 73 6f 6e 2b 69 2c 22 6e 75 6c 6c 22 2c 34 29 3d  son+i,"null",4)=
5fc0: 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 21  =0.         && !
5fd0: 73 61 66 65 5f 69 73 61 6c 6e 75 6d 28 70 50 61  safe_isalnum(pPa
5fe0: 72 73 65 2d 3e 7a 4a 73 6f 6e 5b 69 2b 34 5d 29  rse->zJson[i+4])
5ff0: 20 29 7b 0a 20 20 20 20 6a 73 6f 6e 50 61 72 73   ){.    jsonPars
6000: 65 41 64 64 4e 6f 64 65 28 70 50 61 72 73 65 2c  eAddNode(pParse,
6010: 20 4a 53 4f 4e 5f 4e 55 4c 4c 2c 20 30 2c 20 30   JSON_NULL, 0, 0
6020: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 69 2b  );.    return i+
6030: 34 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 63  4;.  }else if( c
6040: 3d 3d 27 74 27 0a 20 20 20 20 20 20 20 20 20 26  =='t'.         &
6050: 26 20 73 74 72 6e 63 6d 70 28 70 50 61 72 73 65  & strncmp(pParse
6060: 2d 3e 7a 4a 73 6f 6e 2b 69 2c 22 74 72 75 65 22  ->zJson+i,"true"
6070: 2c 34 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ,4)==0.         
6080: 26 26 20 21 73 61 66 65 5f 69 73 61 6c 6e 75 6d  && !safe_isalnum
6090: 28 70 50 61 72 73 65 2d 3e 7a 4a 73 6f 6e 5b 69  (pParse->zJson[i
60a0: 2b 34 5d 29 20 29 7b 0a 20 20 20 20 6a 73 6f 6e  +4]) ){.    json
60b0: 50 61 72 73 65 41 64 64 4e 6f 64 65 28 70 50 61  ParseAddNode(pPa
60c0: 72 73 65 2c 20 4a 53 4f 4e 5f 54 52 55 45 2c 20  rse, JSON_TRUE, 
60d0: 30 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  0, 0);.    retur
60e0: 6e 20 69 2b 34 3b 0a 20 20 7d 65 6c 73 65 20 69  n i+4;.  }else i
60f0: 66 28 20 63 3d 3d 27 66 27 0a 20 20 20 20 20 20  f( c=='f'.      
6100: 20 20 20 26 26 20 73 74 72 6e 63 6d 70 28 70 50     && strncmp(pP
6110: 61 72 73 65 2d 3e 7a 4a 73 6f 6e 2b 69 2c 22 66  arse->zJson+i,"f
6120: 61 6c 73 65 22 2c 35 29 3d 3d 30 0a 20 20 20 20  alse",5)==0.    
6130: 20 20 20 20 20 26 26 20 21 73 61 66 65 5f 69 73       && !safe_is
6140: 61 6c 6e 75 6d 28 70 50 61 72 73 65 2d 3e 7a 4a  alnum(pParse->zJ
6150: 73 6f 6e 5b 69 2b 35 5d 29 20 29 7b 0a 20 20 20  son[i+5]) ){.   
6160: 20 6a 73 6f 6e 50 61 72 73 65 41 64 64 4e 6f 64   jsonParseAddNod
6170: 65 28 70 50 61 72 73 65 2c 20 4a 53 4f 4e 5f 46  e(pParse, JSON_F
6180: 41 4c 53 45 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ALSE, 0, 0);.   
6190: 20 72 65 74 75 72 6e 20 69 2b 35 3b 0a 20 20 7d   return i+5;.  }
61a0: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 2d 27 20  else if( c=='-' 
61b0: 7c 7c 20 28 63 3e 3d 27 30 27 20 26 26 20 63 3c  || (c>='0' && c<
61c0: 3d 27 39 27 29 20 29 7b 0a 20 20 20 20 2f 2a 20  ='9') ){.    /* 
61d0: 50 61 72 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  Parse number */.
61e0: 20 20 20 20 75 38 20 73 65 65 6e 44 50 20 3d 20      u8 seenDP = 
61f0: 30 3b 0a 20 20 20 20 75 38 20 73 65 65 6e 45 20  0;.    u8 seenE 
6200: 3d 20 30 3b 0a 20 20 20 20 6a 20 3d 20 69 2b 31  = 0;.    j = i+1
6210: 3b 0a 20 20 20 20 66 6f 72 28 3b 3b 20 6a 2b 2b  ;.    for(;; j++
6220: 29 7b 0a 20 20 20 20 20 20 63 20 3d 20 70 50 61  ){.      c = pPa
6230: 72 73 65 2d 3e 7a 4a 73 6f 6e 5b 6a 5d 3b 0a 20  rse->zJson[j];. 
6240: 20 20 20 20 20 69 66 28 20 63 3e 3d 27 30 27 20       if( c>='0' 
6250: 26 26 20 63 3c 3d 27 39 27 20 29 20 63 6f 6e 74  && c<='9' ) cont
6260: 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
6270: 63 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20  c=='.' ){.      
6280: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 7a 4a    if( pParse->zJ
6290: 73 6f 6e 5b 6a 2d 31 5d 3d 3d 27 2d 27 20 29 20  son[j-1]=='-' ) 
62a0: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
62b0: 20 20 20 69 66 28 20 73 65 65 6e 44 50 20 29 20     if( seenDP ) 
62c0: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
62d0: 20 20 20 73 65 65 6e 44 50 20 3d 20 31 3b 0a 20     seenDP = 1;. 
62e0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
62f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
6300: 66 28 20 63 3d 3d 27 65 27 20 7c 7c 20 63 3d 3d  f( c=='e' || c==
6310: 27 45 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69  'E' ){.        i
6320: 66 28 20 70 50 61 72 73 65 2d 3e 7a 4a 73 6f 6e  f( pParse->zJson
6330: 5b 6a 2d 31 5d 3c 27 30 27 20 29 20 72 65 74 75  [j-1]<'0' ) retu
6340: 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69  rn -1;.        i
6350: 66 28 20 73 65 65 6e 45 20 29 20 72 65 74 75 72  f( seenE ) retur
6360: 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 73 65  n -1;.        se
6370: 65 6e 44 50 20 3d 20 73 65 65 6e 45 20 3d 20 31  enDP = seenE = 1
6380: 3b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 70 50  ;.        c = pP
6390: 61 72 73 65 2d 3e 7a 4a 73 6f 6e 5b 6a 2b 31 5d  arse->zJson[j+1]
63a0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d  ;.        if( c=
63b0: 3d 27 2b 27 20 7c 7c 20 63 3d 3d 27 2d 27 20 29  ='+' || c=='-' )
63c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b  {.          j++;
63d0: 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 70  .          c = p
63e0: 50 61 72 73 65 2d 3e 7a 4a 73 6f 6e 5b 6a 2b 31  Parse->zJson[j+1
63f0: 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ];.        }.   
6400: 20 20 20 20 20 69 66 28 20 63 3c 27 30 27 20 7c       if( c<'0' |
6410: 7c 20 63 3e 27 39 27 20 29 20 72 65 74 75 72 6e  | c>'9' ) return
6420: 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e   -1;.        con
6430: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
6440: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6450: 7d 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  }.    if( pParse
6460: 2d 3e 7a 4a 73 6f 6e 5b 6a 2d 31 5d 3c 27 30 27  ->zJson[j-1]<'0'
6470: 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
6480: 20 20 6a 73 6f 6e 50 61 72 73 65 41 64 64 4e 6f    jsonParseAddNo
6490: 64 65 28 70 50 61 72 73 65 2c 20 73 65 65 6e 44  de(pParse, seenD
64a0: 50 20 3f 20 4a 53 4f 4e 5f 52 45 41 4c 20 3a 20  P ? JSON_REAL : 
64b0: 4a 53 4f 4e 5f 49 4e 54 2c 0a 20 20 20 20 20 20  JSON_INT,.      
64c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64d0: 20 20 6a 20 2d 20 69 2c 20 26 70 50 61 72 73 65    j - i, &pParse
64e0: 2d 3e 7a 4a 73 6f 6e 5b 69 5d 29 3b 0a 20 20 20  ->zJson[i]);.   
64f0: 20 72 65 74 75 72 6e 20 6a 3b 0a 20 20 7d 65 6c   return j;.  }el
6500: 73 65 20 69 66 28 20 63 3d 3d 27 7d 27 20 29 7b  se if( c=='}' ){
6510: 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 32 3b 20  .    return -2; 
6520: 20 2f 2a 20 45 6e 64 20 6f 66 20 7b 2e 2e 2e 7d   /* End of {...}
6530: 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   */.  }else if( 
6540: 63 3d 3d 27 5d 27 20 29 7b 0a 20 20 20 20 72 65  c==']' ){.    re
6550: 74 75 72 6e 20 2d 33 3b 20 20 2f 2a 20 45 6e 64  turn -3;  /* End
6560: 20 6f 66 20 5b 2e 2e 2e 5d 20 2a 2f 0a 20 20 7d   of [...] */.  }
6570: 65 6c 73 65 20 69 66 28 20 63 3d 3d 30 20 29 7b  else if( c==0 ){
6580: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
6590: 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69 6c 65 20   /* End of file 
65a0: 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
65b0: 72 65 74 75 72 6e 20 2d 31 3b 20 20 2f 2a 20 53  return -1;  /* S
65c0: 79 6e 74 61 78 20 65 72 72 6f 72 20 2a 2f 0a 20  yntax error */. 
65d0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73   }.}../*.** Pars
65e0: 65 20 61 20 63 6f 6d 70 6c 65 74 65 20 4a 53 4f  e a complete JSO
65f0: 4e 20 73 74 72 69 6e 67 2e 20 20 52 65 74 75 72  N string.  Retur
6600: 6e 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  n 0 on success o
6610: 72 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  r non-zero if th
6620: 65 72 65 0a 2a 2a 20 61 72 65 20 61 6e 79 20 65  ere.** are any e
6630: 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65 72  rrors.  If an er
6640: 72 6f 72 20 6f 63 63 75 72 73 2c 20 66 72 65 65  ror occurs, free
6650: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f   all memory asso
6660: 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 70  ciated with.** p
6670: 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61  Parse..**.** pPa
6680: 72 73 65 20 69 73 20 75 6e 69 6e 69 74 69 61 6c  rse is uninitial
6690: 69 7a 65 64 20 77 68 65 6e 20 74 68 69 73 20 72  ized when this r
66a0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
66b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
66c0: 6a 73 6f 6e 50 61 72 73 65 28 0a 20 20 4a 73 6f  jsonParse(.  Jso
66d0: 6e 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  nParse *pParse, 
66e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
66f0: 74 69 61 6c 69 7a 65 20 61 6e 64 20 66 69 6c 6c  tialize and fill
6700: 20 74 68 69 73 20 4a 73 6f 6e 50 61 72 73 65 20   this JsonParse 
6710: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69  object */.  sqli
6720: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
6730: 78 2c 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f  x,       /* Repo
6740: 72 74 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a  rt errors here *
6750: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
6760: 7a 4a 73 6f 6e 20 20 20 20 20 20 20 20 20 20 20  zJson           
6770: 20 2f 2a 20 49 6e 70 75 74 20 4a 53 4f 4e 20 74   /* Input JSON t
6780: 65 78 74 20 74 6f 20 62 65 20 70 61 72 73 65 64  ext to be parsed
6790: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
67a0: 20 20 6d 65 6d 73 65 74 28 70 50 61 72 73 65 2c    memset(pParse,
67b0: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 50 61 72   0, sizeof(*pPar
67c0: 73 65 29 29 3b 0a 20 20 69 66 28 20 7a 4a 73 6f  se));.  if( zJso
67d0: 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  n==0 ) return 1;
67e0: 0a 20 20 70 50 61 72 73 65 2d 3e 7a 4a 73 6f 6e  .  pParse->zJson
67f0: 20 3d 20 7a 4a 73 6f 6e 3b 0a 20 20 69 20 3d 20   = zJson;.  i = 
6800: 6a 73 6f 6e 50 61 72 73 65 56 61 6c 75 65 28 70  jsonParseValue(p
6810: 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 69 66 28  Parse, 0);.  if(
6820: 20 70 50 61 72 73 65 2d 3e 6f 6f 6d 20 29 20 69   pParse->oom ) i
6830: 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 69 3e 30   = -1;.  if( i>0
6840: 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 73   ){.    while( s
6850: 61 66 65 5f 69 73 73 70 61 63 65 28 7a 4a 73 6f  afe_isspace(zJso
6860: 6e 5b 69 5d 29 20 29 20 69 2b 2b 3b 0a 20 20 20  n[i]) ) i++;.   
6870: 20 69 66 28 20 7a 4a 73 6f 6e 5b 69 5d 20 29 20   if( zJson[i] ) 
6880: 69 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66  i = -1;.  }.  if
6890: 28 20 69 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66  ( i<=0 ){.    if
68a0: 28 20 70 43 74 78 21 3d 30 20 29 7b 0a 20 20 20  ( pCtx!=0 ){.   
68b0: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6f     if( pParse->o
68c0: 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  om ){.        sq
68d0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
68e0: 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78 29 3b 0a  or_nomem(pCtx);.
68f0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6900: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
6910: 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20  ult_error(pCtx, 
6920: 22 6d 61 6c 66 6f 72 6d 65 64 20 4a 53 4f 4e 22  "malformed JSON"
6930: 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , -1);.      }. 
6940: 20 20 20 7d 0a 20 20 20 20 6a 73 6f 6e 50 61 72     }.    jsonPar
6950: 73 65 52 65 73 65 74 28 70 50 61 72 73 65 29 3b  seReset(pParse);
6960: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
6970: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
6980: 0a 0a 2f 2a 20 4d 61 72 6b 20 6e 6f 64 65 20 69  ../* Mark node i
6990: 20 6f 66 20 70 50 61 72 73 65 20 61 73 20 62 65   of pParse as be
69a0: 69 6e 67 20 61 20 63 68 69 6c 64 20 6f 66 20 69  ing a child of i
69b0: 50 61 72 65 6e 74 2e 20 20 43 61 6c 6c 20 72 65  Parent.  Call re
69c0: 63 75 72 73 69 76 65 6c 79 0a 2a 2a 20 74 6f 20  cursively.** to 
69d0: 66 69 6c 6c 20 69 6e 20 61 6c 6c 20 74 68 65 20  fill in all the 
69e0: 64 65 73 63 65 6e 64 61 6e 74 73 20 6f 66 20 6e  descendants of n
69f0: 6f 64 65 20 69 2e 0a 2a 2f 0a 73 74 61 74 69 63  ode i..*/.static
6a00: 20 76 6f 69 64 20 6a 73 6f 6e 50 61 72 73 65 46   void jsonParseF
6a10: 69 6c 6c 49 6e 50 61 72 65 6e 74 61 67 65 28 4a  illInParentage(J
6a20: 73 6f 6e 50 61 72 73 65 20 2a 70 50 61 72 73 65  sonParse *pParse
6a30: 2c 20 75 33 32 20 69 2c 20 75 33 32 20 69 50 61  , u32 i, u32 iPa
6a40: 72 65 6e 74 29 7b 0a 20 20 4a 73 6f 6e 4e 6f 64  rent){.  JsonNod
6a50: 65 20 2a 70 4e 6f 64 65 20 3d 20 26 70 50 61 72  e *pNode = &pPar
6a60: 73 65 2d 3e 61 4e 6f 64 65 5b 69 5d 3b 0a 20 20  se->aNode[i];.  
6a70: 75 33 32 20 6a 3b 0a 20 20 70 50 61 72 73 65 2d  u32 j;.  pParse-
6a80: 3e 61 55 70 5b 69 5d 20 3d 20 69 50 61 72 65 6e  >aUp[i] = iParen
6a90: 74 3b 0a 20 20 73 77 69 74 63 68 28 20 70 4e 6f  t;.  switch( pNo
6aa0: 64 65 2d 3e 65 54 79 70 65 20 29 7b 0a 20 20 20  de->eType ){.   
6ab0: 20 63 61 73 65 20 4a 53 4f 4e 5f 41 52 52 41 59   case JSON_ARRAY
6ac0: 3a 20 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  : {.      for(j=
6ad0: 31 3b 20 6a 3c 3d 70 4e 6f 64 65 2d 3e 6e 3b 20  1; j<=pNode->n; 
6ae0: 6a 20 2b 3d 20 6a 73 6f 6e 4e 6f 64 65 53 69 7a  j += jsonNodeSiz
6af0: 65 28 70 4e 6f 64 65 2b 6a 29 29 7b 0a 20 20 20  e(pNode+j)){.   
6b00: 20 20 20 20 20 6a 73 6f 6e 50 61 72 73 65 46 69       jsonParseFi
6b10: 6c 6c 49 6e 50 61 72 65 6e 74 61 67 65 28 70 50  llInParentage(pP
6b20: 61 72 73 65 2c 20 69 2b 6a 2c 20 69 29 3b 0a 20  arse, i+j, i);. 
6b30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
6b40: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
6b50: 73 65 20 4a 53 4f 4e 5f 4f 42 4a 45 43 54 3a 20  se JSON_OBJECT: 
6b60: 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 31 3b  {.      for(j=1;
6b70: 20 6a 3c 3d 70 4e 6f 64 65 2d 3e 6e 3b 20 6a 20   j<=pNode->n; j 
6b80: 2b 3d 20 6a 73 6f 6e 4e 6f 64 65 53 69 7a 65 28  += jsonNodeSize(
6b90: 70 4e 6f 64 65 2b 6a 2b 31 29 2b 31 29 7b 0a 20  pNode+j+1)+1){. 
6ba0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
6bb0: 55 70 5b 69 2b 6a 5d 20 3d 20 69 3b 0a 20 20 20  Up[i+j] = i;.   
6bc0: 20 20 20 20 20 6a 73 6f 6e 50 61 72 73 65 46 69       jsonParseFi
6bd0: 6c 6c 49 6e 50 61 72 65 6e 74 61 67 65 28 70 50  llInParentage(pP
6be0: 61 72 73 65 2c 20 69 2b 6a 2b 31 2c 20 69 29 3b  arse, i+j+1, i);
6bf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
6c00: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
6c10: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
6c20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6c30: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  }.}../*.** Compu
6c40: 74 65 20 74 68 65 20 70 61 72 65 6e 74 61 67 65  te the parentage
6c50: 20 6f 66 20 61 6c 6c 20 6e 6f 64 65 73 20 69 6e   of all nodes in
6c60: 20 61 20 63 6f 6d 70 6c 65 74 65 64 20 70 61 72   a completed par
6c70: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
6c80: 74 20 6a 73 6f 6e 50 61 72 73 65 46 69 6e 64 50  t jsonParseFindP
6c90: 61 72 65 6e 74 73 28 4a 73 6f 6e 50 61 72 73 65  arents(JsonParse
6ca0: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 75 33 32   *pParse){.  u32
6cb0: 20 2a 61 55 70 3b 0a 20 20 61 73 73 65 72 74 28   *aUp;.  assert(
6cc0: 20 70 50 61 72 73 65 2d 3e 61 55 70 3d 3d 30 20   pParse->aUp==0 
6cd0: 29 3b 0a 20 20 61 55 70 20 3d 20 70 50 61 72 73  );.  aUp = pPars
6ce0: 65 2d 3e 61 55 70 20 3d 20 73 71 6c 69 74 65 33  e->aUp = sqlite3
6cf0: 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  _malloc( sizeof(
6d00: 75 33 32 29 2a 70 50 61 72 73 65 2d 3e 6e 4e 6f  u32)*pParse->nNo
6d10: 64 65 20 29 3b 0a 20 20 69 66 28 20 61 55 70 3d  de );.  if( aUp=
6d20: 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  =0 ){.    pParse
6d30: 2d 3e 6f 6f 6d 20 3d 20 31 3b 0a 20 20 20 20 72  ->oom = 1;.    r
6d40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
6d50: 45 4d 3b 0a 20 20 7d 0a 20 20 6a 73 6f 6e 50 61  EM;.  }.  jsonPa
6d60: 72 73 65 46 69 6c 6c 49 6e 50 61 72 65 6e 74 61  rseFillInParenta
6d70: 67 65 28 70 50 61 72 73 65 2c 20 30 2c 20 30 29  ge(pParse, 0, 0)
6d80: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
6d90: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
6da0: 6f 6d 70 61 72 65 20 74 68 65 20 4f 42 4a 45 43  ompare the OBJEC
6db0: 54 20 6c 61 62 65 6c 20 61 74 20 70 4e 6f 64 65  T label at pNode
6dc0: 20 61 67 61 69 6e 73 74 20 7a 4b 65 79 2c 6e 4b   against zKey,nK
6dd0: 65 79 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65  ey.  Return true
6de0: 20 6f 6e 0a 2a 2a 20 61 20 6d 61 74 63 68 2e 0a   on.** a match..
6df0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 73  */.static int js
6e00: 6f 6e 4c 61 62 65 6c 43 6f 6d 70 61 72 65 28 4a  onLabelCompare(J
6e10: 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 20  sonNode *pNode, 
6e20: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65 79  const char *zKey
6e30: 2c 20 75 33 32 20 6e 4b 65 79 29 7b 0a 20 20 69  , u32 nKey){.  i
6e40: 66 28 20 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67  f( pNode->jnFlag
6e50: 73 20 26 20 4a 4e 4f 44 45 5f 52 41 57 20 29 7b  s & JNODE_RAW ){
6e60: 0a 20 20 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e  .    if( pNode->
6e70: 6e 21 3d 6e 4b 65 79 20 29 20 72 65 74 75 72 6e  n!=nKey ) return
6e80: 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   0;.    return s
6e90: 74 72 6e 63 6d 70 28 70 4e 6f 64 65 2d 3e 75 2e  trncmp(pNode->u.
6ea0: 7a 4a 43 6f 6e 74 65 6e 74 2c 20 7a 4b 65 79 2c  zJContent, zKey,
6eb0: 20 6e 4b 65 79 29 3d 3d 30 3b 0a 20 20 7d 65 6c   nKey)==0;.  }el
6ec0: 73 65 7b 0a 20 20 20 20 69 66 28 20 70 4e 6f 64  se{.    if( pNod
6ed0: 65 2d 3e 6e 21 3d 6e 4b 65 79 2b 32 20 29 20 72  e->n!=nKey+2 ) r
6ee0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 72 65 74  eturn 0;.    ret
6ef0: 75 72 6e 20 73 74 72 6e 63 6d 70 28 70 4e 6f 64  urn strncmp(pNod
6f00: 65 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 2b 31  e->u.zJContent+1
6f10: 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79 29 3d 3d 30  , zKey, nKey)==0
6f20: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 66 6f 72 77  ;.  }.}../* forw
6f30: 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  ard declaration 
6f40: 2a 2f 0a 73 74 61 74 69 63 20 4a 73 6f 6e 4e 6f  */.static JsonNo
6f50: 64 65 20 2a 6a 73 6f 6e 4c 6f 6f 6b 75 70 41 70  de *jsonLookupAp
6f60: 70 65 6e 64 28 4a 73 6f 6e 50 61 72 73 65 2a 2c  pend(JsonParse*,
6f70: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2a  const char*,int*
6f80: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 3b 0a  ,const char**);.
6f90: 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 61 6c  ./*.** Search al
6fa0: 6f 6e 67 20 7a 50 61 74 68 20 74 6f 20 66 69 6e  ong zPath to fin
6fb0: 64 20 74 68 65 20 6e 6f 64 65 20 73 70 65 63 69  d the node speci
6fc0: 66 69 65 64 2e 20 20 52 65 74 75 72 6e 20 61 20  fied.  Return a 
6fd0: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
6fe0: 61 74 20 6e 6f 64 65 2c 20 6f 72 20 4e 55 4c 4c  at node, or NULL
6ff0: 20 69 66 20 7a 50 61 74 68 20 69 73 20 6d 61 6c   if zPath is mal
7000: 66 6f 72 6d 65 64 20 6f 72 20 69 66 20 74 68 65  formed or if the
7010: 72 65 20 69 73 20 6e 6f 20 73 75 63 68 0a 2a 2a  re is no such.**
7020: 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   node..**.** If 
7030: 70 41 70 6e 64 21 3d 30 2c 20 74 68 65 6e 20 74  pApnd!=0, then t
7040: 72 79 20 74 6f 20 61 70 70 65 6e 64 20 6e 65 77  ry to append new
7050: 20 6e 6f 64 65 73 20 74 6f 20 63 6f 6d 70 6c 65   nodes to comple
7060: 74 65 20 7a 50 61 74 68 20 69 66 20 69 74 20 69  te zPath if it i
7070: 73 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74 6f  s.** possible to
7080: 20 64 6f 20 73 6f 20 61 6e 64 20 69 66 20 6e 6f   do so and if no
7090: 20 65 78 69 73 74 69 6e 67 20 6e 6f 64 65 20 63   existing node c
70a0: 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 7a 50  orresponds to zP
70b0: 61 74 68 2e 20 20 49 66 0a 2a 2a 20 6e 65 77 20  ath.  If.** new 
70c0: 6e 6f 64 65 73 20 61 72 65 20 61 70 70 65 6e 64  nodes are append
70d0: 65 64 20 2a 70 41 70 6e 64 20 69 73 20 73 65 74  ed *pApnd is set
70e0: 20 74 6f 20 31 2e 0a 2a 2f 0a 73 74 61 74 69 63   to 1..*/.static
70f0: 20 4a 73 6f 6e 4e 6f 64 65 20 2a 6a 73 6f 6e 4c   JsonNode *jsonL
7100: 6f 6f 6b 75 70 53 74 65 70 28 0a 20 20 4a 73 6f  ookupStep(.  Jso
7110: 6e 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  nParse *pParse, 
7120: 20 20 20 20 20 2f 2a 20 54 68 65 20 4a 53 4f 4e       /* The JSON
7130: 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
7140: 75 33 32 20 69 52 6f 6f 74 2c 20 20 20 20 20 20  u32 iRoot,      
7150: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
7160: 20 74 68 65 20 73 65 61 72 63 68 20 61 74 20 74   the search at t
7170: 68 69 73 20 6e 6f 64 65 20 2a 2f 0a 20 20 63 6f  his node */.  co
7180: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
7190: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 74        /* The pat
71a0: 68 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  h to search */. 
71b0: 20 69 6e 74 20 2a 70 41 70 6e 64 2c 20 20 20 20   int *pApnd,    
71c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 70 70 65           /* Appe
71d0: 6e 64 20 6e 6f 64 65 73 20 74 6f 20 63 6f 6d 70  nd nodes to comp
71e0: 6c 65 74 65 20 70 61 74 68 20 69 66 20 6e 6f 74  lete path if not
71f0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74   NULL */.  const
7200: 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 20 20 20   char **pzErr   
7210: 20 20 20 2f 2a 20 4d 61 6b 65 20 2a 70 7a 45 72     /* Make *pzEr
7220: 72 20 70 6f 69 6e 74 20 74 6f 20 61 6e 79 20 73  r point to any s
7230: 79 6e 74 61 78 20 65 72 72 6f 72 20 69 6e 20 7a  yntax error in z
7240: 50 61 74 68 20 2a 2f 0a 29 7b 0a 20 20 75 33 32  Path */.){.  u32
7250: 20 69 2c 20 6a 2c 20 6e 4b 65 79 3b 0a 20 20 63   i, j, nKey;.  c
7260: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65 79 3b  onst char *zKey;
7270: 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 52 6f  .  JsonNode *pRo
7280: 6f 74 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 4e  ot = &pParse->aN
7290: 6f 64 65 5b 69 52 6f 6f 74 5d 3b 0a 20 20 69 66  ode[iRoot];.  if
72a0: 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 30 20 29 20  ( zPath[0]==0 ) 
72b0: 72 65 74 75 72 6e 20 70 52 6f 6f 74 3b 0a 20 20  return pRoot;.  
72c0: 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 2e  if( zPath[0]=='.
72d0: 27 20 29 7b 0a 20 20 20 20 69 66 28 20 70 52 6f  ' ){.    if( pRo
72e0: 6f 74 2d 3e 65 54 79 70 65 21 3d 4a 53 4f 4e 5f  ot->eType!=JSON_
72f0: 4f 42 4a 45 43 54 20 29 20 72 65 74 75 72 6e 20  OBJECT ) return 
7300: 30 3b 0a 20 20 20 20 7a 50 61 74 68 2b 2b 3b 0a  0;.    zPath++;.
7310: 20 20 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d      if( zPath[0]
7320: 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20 7a  =='"' ){.      z
7330: 4b 65 79 20 3d 20 7a 50 61 74 68 20 2b 20 31 3b  Key = zPath + 1;
7340: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  .      for(i=1; 
7350: 7a 50 61 74 68 5b 69 5d 20 26 26 20 7a 50 61 74  zPath[i] && zPat
7360: 68 5b 69 5d 21 3d 27 22 27 3b 20 69 2b 2b 29 7b  h[i]!='"'; i++){
7370: 7d 0a 20 20 20 20 20 20 6e 4b 65 79 20 3d 20 69  }.      nKey = i
7380: 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50  -1;.      if( zP
7390: 61 74 68 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  ath[i] ){.      
73a0: 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c    i++;.      }el
73b0: 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45  se{.        *pzE
73c0: 72 72 20 3d 20 7a 50 61 74 68 3b 0a 20 20 20 20  rr = zPath;.    
73d0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
73e0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
73f0: 0a 20 20 20 20 20 20 7a 4b 65 79 20 3d 20 7a 50  .      zKey = zP
7400: 61 74 68 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  ath;.      for(i
7410: 3d 30 3b 20 7a 50 61 74 68 5b 69 5d 20 26 26 20  =0; zPath[i] && 
7420: 7a 50 61 74 68 5b 69 5d 21 3d 27 2e 27 20 26 26  zPath[i]!='.' &&
7430: 20 7a 50 61 74 68 5b 69 5d 21 3d 27 5b 27 3b 20   zPath[i]!='['; 
7440: 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 6e 4b 65  i++){}.      nKe
7450: 79 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20  y = i;.    }.   
7460: 20 69 66 28 20 6e 4b 65 79 3d 3d 30 20 29 7b 0a   if( nKey==0 ){.
7470: 20 20 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 7a        *pzErr = z
7480: 50 61 74 68 3b 0a 20 20 20 20 20 20 72 65 74 75  Path;.      retu
7490: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
74a0: 6a 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 3b  j = 1;.    for(;
74b0: 3b 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  ;){.      while(
74c0: 20 6a 3c 3d 70 52 6f 6f 74 2d 3e 6e 20 29 7b 0a   j<=pRoot->n ){.
74d0: 20 20 20 20 20 20 20 20 69 66 28 20 6a 73 6f 6e          if( json
74e0: 4c 61 62 65 6c 43 6f 6d 70 61 72 65 28 70 52 6f  LabelCompare(pRo
74f0: 6f 74 2b 6a 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79  ot+j, zKey, nKey
7500: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ) ){.          r
7510: 65 74 75 72 6e 20 6a 73 6f 6e 4c 6f 6f 6b 75 70  eturn jsonLookup
7520: 53 74 65 70 28 70 50 61 72 73 65 2c 20 69 52 6f  Step(pParse, iRo
7530: 6f 74 2b 6a 2b 31 2c 20 26 7a 50 61 74 68 5b 69  ot+j+1, &zPath[i
7540: 5d 2c 20 70 41 70 6e 64 2c 20 70 7a 45 72 72 29  ], pApnd, pzErr)
7550: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
7560: 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20      j++;.       
7570: 20 6a 20 2b 3d 20 6a 73 6f 6e 4e 6f 64 65 53 69   j += jsonNodeSi
7580: 7a 65 28 26 70 52 6f 6f 74 5b 6a 5d 29 3b 0a 20  ze(&pRoot[j]);. 
7590: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
75a0: 20 28 70 52 6f 6f 74 2d 3e 6a 6e 46 6c 61 67 73   (pRoot->jnFlags
75b0: 20 26 20 4a 4e 4f 44 45 5f 41 50 50 45 4e 44 29   & JNODE_APPEND)
75c0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
75d0: 20 20 20 69 52 6f 6f 74 20 2b 3d 20 70 52 6f 6f     iRoot += pRoo
75e0: 74 2d 3e 75 2e 69 41 70 70 65 6e 64 3b 0a 20 20  t->u.iAppend;.  
75f0: 20 20 20 20 70 52 6f 6f 74 20 3d 20 26 70 50 61      pRoot = &pPa
7600: 72 73 65 2d 3e 61 4e 6f 64 65 5b 69 52 6f 6f 74  rse->aNode[iRoot
7610: 5d 3b 0a 20 20 20 20 20 20 6a 20 3d 20 31 3b 0a  ];.      j = 1;.
7620: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 41      }.    if( pA
7630: 70 6e 64 20 29 7b 0a 20 20 20 20 20 20 75 33 32  pnd ){.      u32
7640: 20 69 53 74 61 72 74 2c 20 69 4c 61 62 65 6c 3b   iStart, iLabel;
7650: 0a 20 20 20 20 20 20 4a 73 6f 6e 4e 6f 64 65 20  .      JsonNode 
7660: 2a 70 4e 6f 64 65 3b 0a 20 20 20 20 20 20 69 53  *pNode;.      iS
7670: 74 61 72 74 20 3d 20 6a 73 6f 6e 50 61 72 73 65  tart = jsonParse
7680: 41 64 64 4e 6f 64 65 28 70 50 61 72 73 65 2c 20  AddNode(pParse, 
7690: 4a 53 4f 4e 5f 4f 42 4a 45 43 54 2c 20 32 2c 20  JSON_OBJECT, 2, 
76a0: 30 29 3b 0a 20 20 20 20 20 20 69 4c 61 62 65 6c  0);.      iLabel
76b0: 20 3d 20 6a 73 6f 6e 50 61 72 73 65 41 64 64 4e   = jsonParseAddN
76c0: 6f 64 65 28 70 50 61 72 73 65 2c 20 4a 53 4f 4e  ode(pParse, JSON
76d0: 5f 53 54 52 49 4e 47 2c 20 69 2c 20 7a 50 61 74  _STRING, i, zPat
76e0: 68 29 3b 0a 20 20 20 20 20 20 7a 50 61 74 68 20  h);.      zPath 
76f0: 2b 3d 20 69 3b 0a 20 20 20 20 20 20 70 4e 6f 64  += i;.      pNod
7700: 65 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 41 70  e = jsonLookupAp
7710: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 7a 50 61  pend(pParse, zPa
7720: 74 68 2c 20 70 41 70 6e 64 2c 20 70 7a 45 72 72  th, pApnd, pzErr
7730: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
7740: 72 73 65 2d 3e 6f 6f 6d 20 29 20 72 65 74 75 72  rse->oom ) retur
7750: 6e 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  n 0;.      if( p
7760: 4e 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Node ){.        
7770: 70 52 6f 6f 74 20 3d 20 26 70 50 61 72 73 65 2d  pRoot = &pParse-
7780: 3e 61 4e 6f 64 65 5b 69 52 6f 6f 74 5d 3b 0a 20  >aNode[iRoot];. 
7790: 20 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 75 2e         pRoot->u.
77a0: 69 41 70 70 65 6e 64 20 3d 20 69 53 74 61 72 74  iAppend = iStart
77b0: 20 2d 20 69 52 6f 6f 74 3b 0a 20 20 20 20 20 20   - iRoot;.      
77c0: 20 20 70 52 6f 6f 74 2d 3e 6a 6e 46 6c 61 67 73    pRoot->jnFlags
77d0: 20 7c 3d 20 4a 4e 4f 44 45 5f 41 50 50 45 4e 44   |= JNODE_APPEND
77e0: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
77f0: 2d 3e 61 4e 6f 64 65 5b 69 4c 61 62 65 6c 5d 2e  ->aNode[iLabel].
7800: 6a 6e 46 6c 61 67 73 20 7c 3d 20 4a 4e 4f 44 45  jnFlags |= JNODE
7810: 5f 52 41 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _RAW;.      }.  
7820: 20 20 20 20 72 65 74 75 72 6e 20 70 4e 6f 64 65      return pNode
7830: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
7840: 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 5b  if( zPath[0]=='[
7850: 27 20 26 26 20 73 61 66 65 5f 69 73 64 69 67 69  ' && safe_isdigi
7860: 74 28 7a 50 61 74 68 5b 31 5d 29 20 29 7b 0a 20  t(zPath[1]) ){. 
7870: 20 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 65 54     if( pRoot->eT
7880: 79 70 65 21 3d 4a 53 4f 4e 5f 41 52 52 41 59 20  ype!=JSON_ARRAY 
7890: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
78a0: 69 20 3d 20 30 3b 0a 20 20 20 20 6a 20 3d 20 31  i = 0;.    j = 1
78b0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 61 66  ;.    while( saf
78c0: 65 5f 69 73 64 69 67 69 74 28 7a 50 61 74 68 5b  e_isdigit(zPath[
78d0: 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20 69 20 3d  j]) ){.      i =
78e0: 20 69 2a 31 30 20 2b 20 7a 50 61 74 68 5b 6a 5d   i*10 + zPath[j]
78f0: 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 6a 2b   - '0';.      j+
7900: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  +;.    }.    if(
7910: 20 7a 50 61 74 68 5b 6a 5d 21 3d 27 5d 27 20 29   zPath[j]!=']' )
7920: 7b 0a 20 20 20 20 20 20 2a 70 7a 45 72 72 20 3d  {.      *pzErr =
7930: 20 7a 50 61 74 68 3b 0a 20 20 20 20 20 20 72 65   zPath;.      re
7940: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
7950: 20 20 7a 50 61 74 68 20 2b 3d 20 6a 20 2b 20 31    zPath += j + 1
7960: 3b 0a 20 20 20 20 6a 20 3d 20 31 3b 0a 20 20 20  ;.    j = 1;.   
7970: 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20   for(;;){.      
7980: 77 68 69 6c 65 28 20 6a 3c 3d 70 52 6f 6f 74 2d  while( j<=pRoot-
7990: 3e 6e 20 26 26 20 28 69 3e 30 20 7c 7c 20 28 70  >n && (i>0 || (p
79a0: 52 6f 6f 74 5b 6a 5d 2e 6a 6e 46 6c 61 67 73 20  Root[j].jnFlags 
79b0: 26 20 4a 4e 4f 44 45 5f 52 45 4d 4f 56 45 29 21  & JNODE_REMOVE)!
79c0: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  =0) ){.        i
79d0: 66 28 20 28 70 52 6f 6f 74 5b 6a 5d 2e 6a 6e 46  f( (pRoot[j].jnF
79e0: 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 52 45 4d  lags & JNODE_REM
79f0: 4f 56 45 29 3d 3d 30 20 29 20 69 2d 2d 3b 0a 20  OVE)==0 ) i--;. 
7a00: 20 20 20 20 20 20 20 6a 20 2b 3d 20 6a 73 6f 6e         j += json
7a10: 4e 6f 64 65 53 69 7a 65 28 26 70 52 6f 6f 74 5b  NodeSize(&pRoot[
7a20: 6a 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  j]);.      }.   
7a30: 20 20 20 69 66 28 20 28 70 52 6f 6f 74 2d 3e 6a     if( (pRoot->j
7a40: 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 41  nFlags & JNODE_A
7a50: 50 50 45 4e 44 29 3d 3d 30 20 29 20 62 72 65 61  PPEND)==0 ) brea
7a60: 6b 3b 0a 20 20 20 20 20 20 69 52 6f 6f 74 20 2b  k;.      iRoot +
7a70: 3d 20 70 52 6f 6f 74 2d 3e 75 2e 69 41 70 70 65  = pRoot->u.iAppe
7a80: 6e 64 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 20  nd;.      pRoot 
7a90: 3d 20 26 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65  = &pParse->aNode
7aa0: 5b 69 52 6f 6f 74 5d 3b 0a 20 20 20 20 20 20 6a  [iRoot];.      j
7ab0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
7ac0: 69 66 28 20 6a 3c 3d 70 52 6f 6f 74 2d 3e 6e 20  if( j<=pRoot->n 
7ad0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
7ae0: 6a 73 6f 6e 4c 6f 6f 6b 75 70 53 74 65 70 28 70  jsonLookupStep(p
7af0: 50 61 72 73 65 2c 20 69 52 6f 6f 74 2b 6a 2c 20  Parse, iRoot+j, 
7b00: 7a 50 61 74 68 2c 20 70 41 70 6e 64 2c 20 70 7a  zPath, pApnd, pz
7b10: 45 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Err);.    }.    
7b20: 69 66 28 20 69 3d 3d 30 20 26 26 20 70 41 70 6e  if( i==0 && pApn
7b30: 64 20 29 7b 0a 20 20 20 20 20 20 75 33 32 20 69  d ){.      u32 i
7b40: 53 74 61 72 74 3b 0a 20 20 20 20 20 20 4a 73 6f  Start;.      Jso
7b50: 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 3b 0a 20 20  nNode *pNode;.  
7b60: 20 20 20 20 69 53 74 61 72 74 20 3d 20 6a 73 6f      iStart = jso
7b70: 6e 50 61 72 73 65 41 64 64 4e 6f 64 65 28 70 50  nParseAddNode(pP
7b80: 61 72 73 65 2c 20 4a 53 4f 4e 5f 41 52 52 41 59  arse, JSON_ARRAY
7b90: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  , 1, 0);.      p
7ba0: 4e 6f 64 65 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75  Node = jsonLooku
7bb0: 70 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  pAppend(pParse, 
7bc0: 7a 50 61 74 68 2c 20 70 41 70 6e 64 2c 20 70 7a  zPath, pApnd, pz
7bd0: 45 72 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Err);.      if( 
7be0: 70 50 61 72 73 65 2d 3e 6f 6f 6d 20 29 20 72 65  pParse->oom ) re
7bf0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 69 66  turn 0;.      if
7c00: 28 20 70 4e 6f 64 65 20 29 7b 0a 20 20 20 20 20  ( pNode ){.     
7c10: 20 20 20 70 52 6f 6f 74 20 3d 20 26 70 50 61 72     pRoot = &pPar
7c20: 73 65 2d 3e 61 4e 6f 64 65 5b 69 52 6f 6f 74 5d  se->aNode[iRoot]
7c30: 3b 0a 20 20 20 20 20 20 20 20 70 52 6f 6f 74 2d  ;.        pRoot-
7c40: 3e 75 2e 69 41 70 70 65 6e 64 20 3d 20 69 53 74  >u.iAppend = iSt
7c50: 61 72 74 20 2d 20 69 52 6f 6f 74 3b 0a 20 20 20  art - iRoot;.   
7c60: 20 20 20 20 20 70 52 6f 6f 74 2d 3e 6a 6e 46 6c       pRoot->jnFl
7c70: 61 67 73 20 7c 3d 20 4a 4e 4f 44 45 5f 41 50 50  ags |= JNODE_APP
7c80: 45 4e 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  END;.      }.   
7c90: 20 20 20 72 65 74 75 72 6e 20 70 4e 6f 64 65 3b     return pNode;
7ca0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
7cb0: 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 7a 50 61      *pzErr = zPa
7cc0: 74 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  th;.  }.  return
7cd0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70   0;.}../*.** App
7ce0: 65 6e 64 20 63 6f 6e 74 65 6e 74 20 74 6f 20 70  end content to p
7cf0: 50 61 72 73 65 20 74 68 61 74 20 77 69 6c 6c 20  Parse that will 
7d00: 63 6f 6d 70 6c 65 74 65 20 7a 50 61 74 68 2e 20  complete zPath. 
7d10: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
7d20: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 69 6e 73 65  r.** to the inse
7d30: 72 74 65 64 20 6e 6f 64 65 2c 20 6f 72 20 72 65  rted node, or re
7d40: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65  turn NULL if the
7d50: 20 61 70 70 65 6e 64 20 66 61 69 6c 73 2e 0a 2a   append fails..*
7d60: 2f 0a 73 74 61 74 69 63 20 4a 73 6f 6e 4e 6f 64  /.static JsonNod
7d70: 65 20 2a 6a 73 6f 6e 4c 6f 6f 6b 75 70 41 70 70  e *jsonLookupApp
7d80: 65 6e 64 28 0a 20 20 4a 73 6f 6e 50 61 72 73 65  end(.  JsonParse
7d90: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
7da0: 20 41 70 70 65 6e 64 20 63 6f 6e 74 65 6e 74 20   Append content 
7db0: 74 6f 20 74 68 65 20 4a 53 4f 4e 20 70 61 72 73  to the JSON pars
7dc0: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
7dd0: 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 2f 2a  r *zPath,     /*
7de0: 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
7df0: 63 6f 6e 74 65 6e 74 20 74 6f 20 61 70 70 65 6e  content to appen
7e00: 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 70 6e  d */.  int *pApn
7e10: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d,            /*
7e20: 20 53 65 74 20 74 68 69 73 20 66 6c 61 67 20 74   Set this flag t
7e30: 6f 20 31 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  o 1 */.  const c
7e40: 68 61 72 20 2a 2a 70 7a 45 72 72 20 20 20 20 20  har **pzErr     
7e50: 2f 2a 20 4d 61 6b 65 20 74 68 69 73 20 70 6f 69  /* Make this poi
7e60: 6e 74 20 74 6f 20 61 6e 79 20 73 79 6e 74 61 78  nt to any syntax
7e70: 20 65 72 72 6f 72 20 2a 2f 0a 29 7b 0a 20 20 2a   error */.){.  *
7e80: 70 41 70 6e 64 20 3d 20 31 3b 0a 20 20 69 66 28  pApnd = 1;.  if(
7e90: 20 7a 50 61 74 68 5b 30 5d 3d 3d 30 20 29 7b 0a   zPath[0]==0 ){.
7ea0: 20 20 20 20 6a 73 6f 6e 50 61 72 73 65 41 64 64      jsonParseAdd
7eb0: 4e 6f 64 65 28 70 50 61 72 73 65 2c 20 4a 53 4f  Node(pParse, JSO
7ec0: 4e 5f 4e 55 4c 4c 2c 20 30 2c 20 30 29 3b 0a 20  N_NULL, 0, 0);. 
7ed0: 20 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65     return pParse
7ee0: 2d 3e 6f 6f 6d 20 3f 20 30 20 3a 20 26 70 50 61  ->oom ? 0 : &pPa
7ef0: 72 73 65 2d 3e 61 4e 6f 64 65 5b 70 50 61 72 73  rse->aNode[pPars
7f00: 65 2d 3e 6e 4e 6f 64 65 2d 31 5d 3b 0a 20 20 7d  e->nNode-1];.  }
7f10: 0a 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d  .  if( zPath[0]=
7f20: 3d 27 2e 27 20 29 7b 0a 20 20 20 20 6a 73 6f 6e  ='.' ){.    json
7f30: 50 61 72 73 65 41 64 64 4e 6f 64 65 28 70 50 61  ParseAddNode(pPa
7f40: 72 73 65 2c 20 4a 53 4f 4e 5f 4f 42 4a 45 43 54  rse, JSON_OBJECT
7f50: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  , 0, 0);.  }else
7f60: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 50 61   if( strncmp(zPa
7f70: 74 68 2c 22 5b 30 5d 22 2c 33 29 3d 3d 30 20 29  th,"[0]",3)==0 )
7f80: 7b 0a 20 20 20 20 6a 73 6f 6e 50 61 72 73 65 41  {.    jsonParseA
7f90: 64 64 4e 6f 64 65 28 70 50 61 72 73 65 2c 20 4a  ddNode(pParse, J
7fa0: 53 4f 4e 5f 41 52 52 41 59 2c 20 30 2c 20 30 29  SON_ARRAY, 0, 0)
7fb0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
7fc0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
7fd0: 66 28 20 70 50 61 72 73 65 2d 3e 6f 6f 6d 20 29  f( pParse->oom )
7fe0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74   return 0;.  ret
7ff0: 75 72 6e 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 53 74  urn jsonLookupSt
8000: 65 70 28 70 50 61 72 73 65 2c 20 70 50 61 72 73  ep(pParse, pPars
8010: 65 2d 3e 6e 4e 6f 64 65 2d 31 2c 20 7a 50 61 74  e->nNode-1, zPat
8020: 68 2c 20 70 41 70 6e 64 2c 20 70 7a 45 72 72 29  h, pApnd, pzErr)
8030: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
8040: 6e 20 74 68 65 20 74 65 78 74 20 6f 66 20 61 20  n the text of a 
8050: 73 79 6e 74 61 78 20 65 72 72 6f 72 20 6d 65 73  syntax error mes
8060: 73 61 67 65 20 6f 6e 20 61 20 4a 53 4f 4e 20 70  sage on a JSON p
8070: 61 74 68 2e 20 20 53 70 61 63 65 20 69 73 0a 2a  ath.  Space is.*
8080: 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  * obtained from 
8090: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
80a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
80b0: 20 2a 6a 73 6f 6e 50 61 74 68 53 79 6e 74 61 78   *jsonPathSyntax
80c0: 45 72 72 6f 72 28 63 6f 6e 73 74 20 63 68 61 72  Error(const char
80d0: 20 2a 7a 45 72 72 29 7b 0a 20 20 72 65 74 75 72   *zErr){.  retur
80e0: 6e 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  n sqlite3_mprint
80f0: 66 28 22 4a 53 4f 4e 20 70 61 74 68 20 65 72 72  f("JSON path err
8100: 6f 72 20 6e 65 61 72 20 27 25 71 27 22 2c 20 7a  or near '%q'", z
8110: 45 72 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  Err);.}../*.** D
8120: 6f 20 61 20 6e 6f 64 65 20 6c 6f 6f 6b 75 70 20  o a node lookup 
8130: 75 73 69 6e 67 20 7a 50 61 74 68 2e 20 20 52 65  using zPath.  Re
8140: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
8150: 6f 20 74 68 65 20 6e 6f 64 65 20 6f 6e 20 73 75  o the node on su
8160: 63 63 65 73 73 2e 0a 2a 2a 20 52 65 74 75 72 6e  ccess..** Return
8170: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
8180: 6e 64 20 6f 72 20 69 66 20 74 68 65 72 65 20 69  nd or if there i
8190: 73 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  s an error..**.*
81a0: 2a 20 4f 6e 20 61 6e 20 65 72 72 6f 72 2c 20 77  * On an error, w
81b0: 72 69 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  rite an error me
81c0: 73 73 61 67 65 20 69 6e 74 6f 20 70 43 74 78 20  ssage into pCtx 
81d0: 61 6e 64 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  and increment th
81e0: 65 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 6e 45 72  e.** pParse->nEr
81f0: 72 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  r counter..**.**
8200: 20 49 66 20 70 41 70 6e 64 21 3d 4e 55 4c 4c 20   If pApnd!=NULL 
8210: 74 68 65 6e 20 74 72 79 20 74 6f 20 61 70 70 65  then try to appe
8220: 6e 64 20 6d 69 73 73 69 6e 67 20 6e 6f 64 65 73  nd missing nodes
8230: 20 61 6e 64 20 73 65 74 20 2a 70 41 70 6e 64 20   and set *pApnd 
8240: 3d 20 31 20 69 66 0a 2a 2a 20 6e 6f 64 65 73 20  = 1 if.** nodes 
8250: 61 72 65 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f  are appended..*/
8260: 0a 73 74 61 74 69 63 20 4a 73 6f 6e 4e 6f 64 65  .static JsonNode
8270: 20 2a 6a 73 6f 6e 4c 6f 6f 6b 75 70 28 0a 20 20   *jsonLookup(.  
8280: 4a 73 6f 6e 50 61 72 73 65 20 2a 70 50 61 72 73  JsonParse *pPars
8290: 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4a  e,      /* The J
82a0: 53 4f 4e 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  SON to search */
82b0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
82c0: 50 61 74 68 2c 20 20 20 20 20 20 2f 2a 20 54 68  Path,      /* Th
82d0: 65 20 70 61 74 68 20 74 6f 20 73 65 61 72 63 68  e path to search
82e0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 70 6e 64   */.  int *pApnd
82f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
8300: 20 41 70 70 65 6e 64 20 6e 6f 64 65 73 20 74 6f   Append nodes to
8310: 20 63 6f 6d 70 6c 65 74 65 20 70 61 74 68 20 69   complete path i
8320: 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20  f not NULL */.  
8330: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
8340: 2a 70 43 74 78 20 20 20 2f 2a 20 52 65 70 6f 72  *pCtx   /* Repor
8350: 74 20 65 72 72 6f 72 73 20 68 65 72 65 2c 20 69  t errors here, i
8360: 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  f not NULL */.){
8370: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
8380: 45 72 72 20 3d 20 30 3b 0a 20 20 4a 73 6f 6e 4e  Err = 0;.  JsonN
8390: 6f 64 65 20 2a 70 4e 6f 64 65 20 3d 20 30 3b 0a  ode *pNode = 0;.
83a0: 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 0a 20    char *zMsg;.. 
83b0: 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20 29 20   if( zPath==0 ) 
83c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
83d0: 7a 50 61 74 68 5b 30 5d 21 3d 27 24 27 20 29 7b  zPath[0]!='$' ){
83e0: 0a 20 20 20 20 7a 45 72 72 20 3d 20 7a 50 61 74  .    zErr = zPat
83f0: 68 3b 0a 20 20 20 20 67 6f 74 6f 20 6c 6f 6f 6b  h;.    goto look
8400: 75 70 5f 65 72 72 3b 0a 20 20 7d 0a 20 20 7a 50  up_err;.  }.  zP
8410: 61 74 68 2b 2b 3b 0a 20 20 70 4e 6f 64 65 20 3d  ath++;.  pNode =
8420: 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 53 74 65 70 28   jsonLookupStep(
8430: 70 50 61 72 73 65 2c 20 30 2c 20 7a 50 61 74 68  pParse, 0, zPath
8440: 2c 20 70 41 70 6e 64 2c 20 26 7a 45 72 72 29 3b  , pApnd, &zErr);
8450: 0a 20 20 69 66 28 20 7a 45 72 72 3d 3d 30 20 29  .  if( zErr==0 )
8460: 20 72 65 74 75 72 6e 20 70 4e 6f 64 65 3b 0a 0a   return pNode;..
8470: 6c 6f 6f 6b 75 70 5f 65 72 72 3a 0a 20 20 70 50  lookup_err:.  pP
8480: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
8490: 61 73 73 65 72 74 28 20 7a 45 72 72 21 3d 30 20  assert( zErr!=0 
84a0: 26 26 20 70 43 74 78 21 3d 30 20 29 3b 0a 20 20  && pCtx!=0 );.  
84b0: 7a 4d 73 67 20 3d 20 6a 73 6f 6e 50 61 74 68 53  zMsg = jsonPathS
84c0: 79 6e 74 61 78 45 72 72 6f 72 28 7a 45 72 72 29  yntaxError(zErr)
84d0: 3b 0a 20 20 69 66 28 20 7a 4d 73 67 20 29 7b 0a  ;.  if( zMsg ){.
84e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
84f0: 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 7a  lt_error(pCtx, z
8500: 4d 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71  Msg, -1);.    sq
8510: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 73 67 29  lite3_free(zMsg)
8520: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
8530: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
8540: 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78 29 3b  ror_nomem(pCtx);
8550: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
8560: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72  .}.../*.** Repor
8570: 74 20 74 68 65 20 77 72 6f 6e 67 20 6e 75 6d 62  t the wrong numb
8580: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
8590: 66 6f 72 20 6a 73 6f 6e 5f 69 6e 73 65 72 74 28  for json_insert(
85a0: 29 2c 20 6a 73 6f 6e 5f 72 65 70 6c 61 63 65 28  ), json_replace(
85b0: 29 0a 2a 2a 20 6f 72 20 6a 73 6f 6e 5f 73 65 74  ).** or json_set
85c0: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
85d0: 69 64 20 6a 73 6f 6e 57 72 6f 6e 67 4e 75 6d 41  id jsonWrongNumA
85e0: 72 67 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  rgs(.  sqlite3_c
85f0: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 0a 20 20  ontext *pCtx,.  
8600: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
8610: 63 4e 61 6d 65 0a 29 7b 0a 20 20 63 68 61 72 20  cName.){.  char 
8620: 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  *zMsg = sqlite3_
8630: 6d 70 72 69 6e 74 66 28 22 6a 73 6f 6e 5f 25 73  mprintf("json_%s
8640: 28 29 20 6e 65 65 64 73 20 61 6e 20 6f 64 64 20  () needs an odd 
8650: 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
8660: 6e 74 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  nts",.          
8670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8680: 20 20 20 20 20 7a 46 75 6e 63 4e 61 6d 65 29 3b       zFuncName);
8690: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
86a0: 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 7a 4d  t_error(pCtx, zM
86b0: 73 67 2c 20 2d 31 29 3b 0a 20 20 73 71 6c 69 74  sg, -1);.  sqlit
86c0: 65 33 5f 66 72 65 65 28 7a 4d 73 67 29 3b 20 20  e3_free(zMsg);  
86d0: 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72     .}../*.** Mar
86e0: 6b 20 61 6c 6c 20 4e 55 4c 4c 20 65 6e 74 72 69  k all NULL entri
86f0: 65 73 20 69 6e 20 74 68 65 20 4f 62 6a 65 63 74  es in the Object
8700: 20 70 61 73 73 65 64 20 69 6e 20 61 73 20 4a 4e   passed in as JN
8710: 4f 44 45 5f 52 45 4d 4f 56 45 2e 0a 2a 2f 0a 73  ODE_REMOVE..*/.s
8720: 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 52  tatic void jsonR
8730: 65 6d 6f 76 65 41 6c 6c 4e 75 6c 6c 73 28 4a 73  emoveAllNulls(Js
8740: 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 29 7b 0a  onNode *pNode){.
8750: 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 61 73    int i, n;.  as
8760: 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e 65 54 79  sert( pNode->eTy
8770: 70 65 3d 3d 4a 53 4f 4e 5f 4f 42 4a 45 43 54 20  pe==JSON_OBJECT 
8780: 29 3b 0a 20 20 6e 20 3d 20 70 4e 6f 64 65 2d 3e  );.  n = pNode->
8790: 6e 3b 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c  n;.  for(i=2; i<
87a0: 3d 6e 3b 20 69 20 2b 3d 20 6a 73 6f 6e 4e 6f 64  =n; i += jsonNod
87b0: 65 53 69 7a 65 28 26 70 4e 6f 64 65 5b 69 5d 29  eSize(&pNode[i])
87c0: 2b 31 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28  +1){.    switch(
87d0: 20 70 4e 6f 64 65 5b 69 5d 2e 65 54 79 70 65 20   pNode[i].eType 
87e0: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4a 53  ){.      case JS
87f0: 4f 4e 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20 20 20  ON_NULL:.       
8800: 20 70 4e 6f 64 65 5b 69 5d 2e 6a 6e 46 6c 61 67   pNode[i].jnFlag
8810: 73 20 7c 3d 20 4a 4e 4f 44 45 5f 52 45 4d 4f 56  s |= JNODE_REMOV
8820: 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  E;.        break
8830: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4a 53 4f  ;.      case JSO
8840: 4e 5f 4f 42 4a 45 43 54 3a 0a 20 20 20 20 20 20  N_OBJECT:.      
8850: 20 20 6a 73 6f 6e 52 65 6d 6f 76 65 41 6c 6c 4e    jsonRemoveAllN
8860: 75 6c 6c 73 28 26 70 4e 6f 64 65 5b 69 5d 29 3b  ulls(&pNode[i]);
8870: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
8880: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a      }.  }.}.../*
8890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
88a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
88b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
88c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
88d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 53  ***********.** S
88e0: 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65  QL functions use
88f0: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
8900: 64 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a 2a 2a  d debugging.****
8910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8950: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66 64 65  ********/..#ifde
8960: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
8970: 2a 0a 2a 2a 20 54 68 65 20 6a 73 6f 6e 5f 70 61  *.** The json_pa
8980: 72 73 65 28 4a 53 4f 4e 29 20 66 75 6e 63 74 69  rse(JSON) functi
8990: 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 73 74 72  on returns a str
89a0: 69 6e 67 20 77 68 69 63 68 20 64 65 73 63 72 69  ing which descri
89b0: 62 65 73 0a 2a 2a 20 61 20 70 61 72 73 65 20 6f  bes.** a parse o
89c0: 66 20 74 68 65 20 4a 53 4f 4e 20 70 72 6f 76 69  f the JSON provi
89d0: 64 65 64 2e 20 20 4f 72 20 69 74 20 72 65 74 75  ded.  Or it retu
89e0: 72 6e 73 20 4e 55 4c 4c 20 69 66 20 4a 53 4f 4e  rns NULL if JSON
89f0: 20 69 73 20 6e 6f 74 0a 2a 2a 20 77 65 6c 6c 2d   is not.** well-
8a00: 66 6f 72 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  formed..*/.stati
8a10: 63 20 76 6f 69 64 20 6a 73 6f 6e 50 61 72 73 65  c void jsonParse
8a20: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
8a30: 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 0a 20 20  context *ctx,.  
8a40: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
8a50: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
8a60: 0a 29 7b 0a 20 20 4a 73 6f 6e 53 74 72 69 6e 67  .){.  JsonString
8a70: 20 73 3b 20 20 20 20 20 20 20 2f 2a 20 4f 75 74   s;       /* Out
8a80: 70 75 74 20 73 74 72 69 6e 67 20 2d 20 6e 6f 74  put string - not
8a90: 20 72 65 61 6c 20 4a 53 4f 4e 20 2a 2f 0a 20 20   real JSON */.  
8aa0: 4a 73 6f 6e 50 61 72 73 65 20 78 3b 20 20 20 20  JsonParse x;    
8ab0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
8ac0: 20 2a 2f 0a 20 20 75 33 32 20 69 3b 0a 0a 20 20   */.  u32 i;..  
8ad0: 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20  assert( argc==1 
8ae0: 29 3b 0a 20 20 69 66 28 20 6a 73 6f 6e 50 61 72  );.  if( jsonPar
8af0: 73 65 28 26 78 2c 20 63 74 78 2c 20 28 63 6f 6e  se(&x, ctx, (con
8b00: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
8b10: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
8b20: 5b 30 5d 29 29 20 29 20 72 65 74 75 72 6e 3b 0a  [0])) ) return;.
8b30: 20 20 6a 73 6f 6e 50 61 72 73 65 46 69 6e 64 50    jsonParseFindP
8b40: 61 72 65 6e 74 73 28 26 78 29 3b 0a 20 20 6a 73  arents(&x);.  js
8b50: 6f 6e 49 6e 69 74 28 26 73 2c 20 63 74 78 29 3b  onInit(&s, ctx);
8b60: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 2e  .  for(i=0; i<x.
8b70: 6e 4e 6f 64 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  nNode; i++){.   
8b80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
8b90: 70 65 3b 0a 20 20 20 20 69 66 28 20 78 2e 61 4e  pe;.    if( x.aN
8ba0: 6f 64 65 5b 69 5d 2e 6a 6e 46 6c 61 67 73 20 26  ode[i].jnFlags &
8bb0: 20 4a 4e 4f 44 45 5f 4c 41 42 45 4c 20 29 7b 0a   JNODE_LABEL ){.
8bc0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 78 2e        assert( x.
8bd0: 61 4e 6f 64 65 5b 69 5d 2e 65 54 79 70 65 3d 3d  aNode[i].eType==
8be0: 4a 53 4f 4e 5f 53 54 52 49 4e 47 20 29 3b 0a 20  JSON_STRING );. 
8bf0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 6c 61       zType = "la
8c00: 62 65 6c 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  bel";.    }else{
8c10: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 6a  .      zType = j
8c20: 73 6f 6e 54 79 70 65 5b 78 2e 61 4e 6f 64 65 5b  sonType[x.aNode[
8c30: 69 5d 2e 65 54 79 70 65 5d 3b 0a 20 20 20 20 7d  i].eType];.    }
8c40: 0a 20 20 20 20 6a 73 6f 6e 50 72 69 6e 74 66 28  .    jsonPrintf(
8c50: 31 30 30 2c 20 26 73 2c 22 6e 6f 64 65 20 25 33  100, &s,"node %3
8c60: 75 3a 20 25 37 73 20 6e 3d 25 2d 34 64 20 75 70  u: %7s n=%-4d up
8c70: 3d 25 2d 34 64 22 2c 0a 20 20 20 20 20 20 20 20  =%-4d",.        
8c80: 20 20 20 20 20 20 20 69 2c 20 7a 54 79 70 65 2c         i, zType,
8c90: 20 78 2e 61 4e 6f 64 65 5b 69 5d 2e 6e 2c 20 78   x.aNode[i].n, x
8ca0: 2e 61 55 70 5b 69 5d 29 3b 0a 20 20 20 20 69 66  .aUp[i]);.    if
8cb0: 28 20 78 2e 61 4e 6f 64 65 5b 69 5d 2e 75 2e 7a  ( x.aNode[i].u.z
8cc0: 4a 43 6f 6e 74 65 6e 74 21 3d 30 20 29 7b 0a 20  JContent!=0 ){. 
8cd0: 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 52       jsonAppendR
8ce0: 61 77 28 26 73 2c 20 22 20 22 2c 20 31 29 3b 0a  aw(&s, " ", 1);.
8cf0: 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64        jsonAppend
8d00: 52 61 77 28 26 73 2c 20 78 2e 61 4e 6f 64 65 5b  Raw(&s, x.aNode[
8d10: 69 5d 2e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 2c 20  i].u.zJContent, 
8d20: 78 2e 61 4e 6f 64 65 5b 69 5d 2e 6e 29 3b 0a 20  x.aNode[i].n);. 
8d30: 20 20 20 7d 0a 20 20 20 20 6a 73 6f 6e 41 70 70     }.    jsonApp
8d40: 65 6e 64 52 61 77 28 26 73 2c 20 22 5c 6e 22 2c  endRaw(&s, "\n",
8d50: 20 31 29 3b 0a 20 20 7d 0a 20 20 6a 73 6f 6e 50   1);.  }.  jsonP
8d60: 61 72 73 65 52 65 73 65 74 28 26 78 29 3b 0a 20  arseReset(&x);. 
8d70: 20 6a 73 6f 6e 52 65 73 75 6c 74 28 26 73 29 3b   jsonResult(&s);
8d80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 73  .}../*.** The js
8d90: 6f 6e 5f 74 65 73 74 31 28 4a 53 4f 4e 29 20 66  on_test1(JSON) f
8da0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 74  unction return t
8db0: 72 75 65 20 28 31 29 20 69 66 20 74 68 65 20 69  rue (1) if the i
8dc0: 6e 70 75 74 20 69 73 20 4a 53 4f 4e 0a 2a 2a 20  nput is JSON.** 
8dd0: 74 65 78 74 20 67 65 6e 65 72 61 74 65 64 20 62  text generated b
8de0: 79 20 61 6e 6f 74 68 65 72 20 6a 73 6f 6e 20 66  y another json f
8df0: 75 6e 63 74 69 6f 6e 2e 20 20 49 74 20 72 65 74  unction.  It ret
8e00: 75 72 6e 73 20 28 30 29 20 69 66 20 74 68 65 20  urns (0) if the 
8e10: 69 6e 70 75 74 0a 2a 2a 20 69 73 20 6e 6f 74 20  input.** is not 
8e20: 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 4a 53 4f 4e  known to be JSON
8e30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8e40: 20 6a 73 6f 6e 54 65 73 74 31 46 75 6e 63 28 0a   jsonTest1Func(.
8e50: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
8e60: 74 20 2a 63 74 78 2c 0a 20 20 69 6e 74 20 61 72  t *ctx,.  int ar
8e70: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
8e80: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
8e90: 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 61 72 67  UNUSED_PARAM(arg
8ea0: 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  c);.  sqlite3_re
8eb0: 73 75 6c 74 5f 69 6e 74 28 63 74 78 2c 20 73 71  sult_int(ctx, sq
8ec0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 73 75 62 74  lite3_value_subt
8ed0: 79 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d 4a 53  ype(argv[0])==JS
8ee0: 4f 4e 5f 53 55 42 54 59 50 45 29 3b 0a 7d 0a 23  ON_SUBTYPE);.}.#
8ef0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
8f00: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  DEBUG */../*****
8f10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8f20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8f30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8f40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8f50: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 53 63 61 6c 61  *******.** Scala
8f60: 72 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 69  r SQL function i
8f70: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a  mplementations.*
8f80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8f90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8fa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8fb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8fc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
8fd0: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
8fe0: 6f 6e 20 6f 66 20 74 68 65 20 6a 73 6f 6e 5f 51  on of the json_Q
8ff0: 55 4f 54 45 28 56 41 4c 55 45 29 20 66 75 6e 63  UOTE(VALUE) func
9000: 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 20  tion.  Return a 
9010: 4a 53 4f 4e 20 76 61 6c 75 65 0a 2a 2a 20 63 6f  JSON value.** co
9020: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
9030: 68 65 20 53 51 4c 20 76 61 6c 75 65 20 69 6e 70  he SQL value inp
9040: 75 74 2e 20 20 4d 6f 73 74 6c 79 20 74 68 69 73  ut.  Mostly this
9050: 20 6d 65 61 6e 73 20 70 75 74 74 69 6e 67 20 0a   means putting .
9060: 2a 2a 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73  ** double-quotes
9070: 20 61 72 6f 75 6e 64 20 73 74 72 69 6e 67 73 20   around strings 
9080: 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 74 68  and returning th
9090: 65 20 75 6e 71 75 6f 74 65 64 20 73 74 72 69 6e  e unquoted strin
90a0: 67 20 22 6e 75 6c 6c 22 0a 2a 2a 20 77 68 65 6e  g "null".** when
90b0: 20 67 69 76 65 6e 20 61 20 4e 55 4c 4c 20 69 6e   given a NULL in
90c0: 70 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  put..*/.static v
90d0: 6f 69 64 20 6a 73 6f 6e 51 75 6f 74 65 46 75 6e  oid jsonQuoteFun
90e0: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
90f0: 74 65 78 74 20 2a 63 74 78 2c 0a 20 20 69 6e 74  text *ctx,.  int
9100: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
9110: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
9120: 0a 20 20 4a 73 6f 6e 53 74 72 69 6e 67 20 6a 78  .  JsonString jx
9130: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
9140: 28 61 72 67 63 29 3b 0a 0a 20 20 6a 73 6f 6e 49  (argc);..  jsonI
9150: 6e 69 74 28 26 6a 78 2c 20 63 74 78 29 3b 0a 20  nit(&jx, ctx);. 
9160: 20 6a 73 6f 6e 41 70 70 65 6e 64 56 61 6c 75 65   jsonAppendValue
9170: 28 26 6a 78 2c 20 61 72 67 76 5b 30 5d 29 3b 0a  (&jx, argv[0]);.
9180: 20 20 6a 73 6f 6e 52 65 73 75 6c 74 28 26 6a 78    jsonResult(&jx
9190: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
91a0: 75 6c 74 5f 73 75 62 74 79 70 65 28 63 74 78 2c  ult_subtype(ctx,
91b0: 20 4a 53 4f 4e 5f 53 55 42 54 59 50 45 29 3b 0a   JSON_SUBTYPE);.
91c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
91d0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a  ntation of the j
91e0: 73 6f 6e 5f 61 72 72 61 79 28 56 41 4c 55 45 2c  son_array(VALUE,
91f0: 2e 2e 2e 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  ...) function.  
9200: 52 65 74 75 72 6e 20 61 20 4a 53 4f 4e 0a 2a 2a  Return a JSON.**
9210: 20 61 72 72 61 79 20 74 68 61 74 20 63 6f 6e 74   array that cont
9220: 61 69 6e 73 20 61 6c 6c 20 76 61 6c 75 65 73 20  ains all values 
9230: 67 69 76 65 6e 20 69 6e 20 61 72 67 75 6d 65 6e  given in argumen
9240: 74 73 2e 20 20 4f 72 20 69 66 20 61 6e 79 20 61  ts.  Or if any a
9250: 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 61 20  rgument.** is a 
9260: 42 4c 4f 42 2c 20 74 68 72 6f 77 20 61 6e 20 65  BLOB, throw an e
9270: 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rror..*/.static 
9280: 76 6f 69 64 20 6a 73 6f 6e 41 72 72 61 79 46 75  void jsonArrayFu
9290: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
92a0: 6e 74 65 78 74 20 2a 63 74 78 2c 0a 20 20 69 6e  ntext *ctx,.  in
92b0: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
92c0: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
92d0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4a 73 6f  {.  int i;.  Jso
92e0: 6e 53 74 72 69 6e 67 20 6a 78 3b 0a 0a 20 20 6a  nString jx;..  j
92f0: 73 6f 6e 49 6e 69 74 28 26 6a 78 2c 20 63 74 78  sonInit(&jx, ctx
9300: 29 3b 0a 20 20 6a 73 6f 6e 41 70 70 65 6e 64 43  );.  jsonAppendC
9310: 68 61 72 28 26 6a 78 2c 20 27 5b 27 29 3b 0a 20  har(&jx, '[');. 
9320: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63   for(i=0; i<argc
9330: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6a 73 6f 6e  ; i++){.    json
9340: 41 70 70 65 6e 64 53 65 70 61 72 61 74 6f 72 28  AppendSeparator(
9350: 26 6a 78 29 3b 0a 20 20 20 20 6a 73 6f 6e 41 70  &jx);.    jsonAp
9360: 70 65 6e 64 56 61 6c 75 65 28 26 6a 78 2c 20 61  pendValue(&jx, a
9370: 72 67 76 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 6a  rgv[i]);.  }.  j
9380: 73 6f 6e 41 70 70 65 6e 64 43 68 61 72 28 26 6a  sonAppendChar(&j
9390: 78 2c 20 27 5d 27 29 3b 0a 20 20 6a 73 6f 6e 52  x, ']');.  jsonR
93a0: 65 73 75 6c 74 28 26 6a 78 29 3b 0a 20 20 73 71  esult(&jx);.  sq
93b0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 73 75 62  lite3_result_sub
93c0: 74 79 70 65 28 63 74 78 2c 20 4a 53 4f 4e 5f 53  type(ctx, JSON_S
93d0: 55 42 54 59 50 45 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  UBTYPE);.}.../*.
93e0: 2a 2a 20 6a 73 6f 6e 5f 61 72 72 61 79 5f 6c 65  ** json_array_le
93f0: 6e 67 74 68 28 4a 53 4f 4e 29 0a 2a 2a 20 6a 73  ngth(JSON).** js
9400: 6f 6e 5f 61 72 72 61 79 5f 6c 65 6e 67 74 68 28  on_array_length(
9410: 4a 53 4f 4e 2c 20 50 41 54 48 29 0a 2a 2a 0a 2a  JSON, PATH).**.*
9420: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
9430: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
9440: 69 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c  in the top-level
9450: 20 4a 53 4f 4e 20 61 72 72 61 79 2e 20 20 0a 2a   JSON array.  .*
9460: 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68  * Return 0 if th
9470: 65 20 69 6e 70 75 74 20 69 73 20 6e 6f 74 20 61  e input is not a
9480: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 4a 53 4f   well-formed JSO
9490: 4e 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74  N array..*/.stat
94a0: 69 63 20 76 6f 69 64 20 6a 73 6f 6e 41 72 72 61  ic void jsonArra
94b0: 79 4c 65 6e 67 74 68 46 75 6e 63 28 0a 20 20 73  yLengthFunc(.  s
94c0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
94d0: 63 74 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ctx,.  int argc,
94e0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
94f0: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 4a 73 6f   **argv.){.  Jso
9500: 6e 50 61 72 73 65 20 78 3b 20 20 20 20 20 20 20  nParse x;       
9510: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 20     /* The parse 
9520: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
9530: 36 34 20 6e 20 3d 20 30 3b 0a 20 20 75 33 32 20  64 n = 0;.  u32 
9540: 69 3b 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70  i;.  JsonNode *p
9550: 4e 6f 64 65 3b 0a 0a 20 20 69 66 28 20 6a 73 6f  Node;..  if( jso
9560: 6e 50 61 72 73 65 28 26 78 2c 20 63 74 78 2c 20  nParse(&x, ctx, 
9570: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
9580: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
9590: 61 72 67 76 5b 30 5d 29 29 20 29 20 72 65 74 75  argv[0])) ) retu
95a0: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 78 2e  rn;.  assert( x.
95b0: 6e 4e 6f 64 65 20 29 3b 0a 20 20 69 66 28 20 61  nNode );.  if( a
95c0: 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 63 6f  rgc==2 ){.    co
95d0: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 20  nst char *zPath 
95e0: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
95f0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
9600: 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20  t(argv[1]);.    
9610: 70 4e 6f 64 65 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b  pNode = jsonLook
9620: 75 70 28 26 78 2c 20 7a 50 61 74 68 2c 20 30 2c  up(&x, zPath, 0,
9630: 20 63 74 78 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a   ctx);.  }else{.
9640: 20 20 20 20 70 4e 6f 64 65 20 3d 20 78 2e 61 4e      pNode = x.aN
9650: 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ode;.  }.  if( p
9660: 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 78  Node==0 ){.    x
9670: 2e 6e 45 72 72 20 3d 20 31 3b 0a 20 20 7d 65 6c  .nErr = 1;.  }el
9680: 73 65 20 69 66 28 20 70 4e 6f 64 65 2d 3e 65 54  se if( pNode->eT
9690: 79 70 65 3d 3d 4a 53 4f 4e 5f 41 52 52 41 59 20  ype==JSON_ARRAY 
96a0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  ){.    assert( (
96b0: 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73 20 26  pNode->jnFlags &
96c0: 20 4a 4e 4f 44 45 5f 41 50 50 45 4e 44 29 3d 3d   JNODE_APPEND)==
96d0: 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31  0 );.    for(i=1
96e0: 3b 20 69 3c 3d 70 4e 6f 64 65 2d 3e 6e 3b 20 6e  ; i<=pNode->n; n
96f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 20 2b 3d 20  ++){.      i += 
9700: 6a 73 6f 6e 4e 6f 64 65 53 69 7a 65 28 26 70 4e  jsonNodeSize(&pN
9710: 6f 64 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  ode[i]);.    }. 
9720: 20 7d 0a 20 20 69 66 28 20 78 2e 6e 45 72 72 3d   }.  if( x.nErr=
9730: 3d 30 20 29 20 73 71 6c 69 74 65 33 5f 72 65 73  =0 ) sqlite3_res
9740: 75 6c 74 5f 69 6e 74 36 34 28 63 74 78 2c 20 6e  ult_int64(ctx, n
9750: 29 3b 0a 20 20 6a 73 6f 6e 50 61 72 73 65 52 65  );.  jsonParseRe
9760: 73 65 74 28 26 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  set(&x);.}../*.*
9770: 2a 20 6a 73 6f 6e 5f 65 78 74 72 61 63 74 28 4a  * json_extract(J
9780: 53 4f 4e 2c 20 50 41 54 48 2c 20 2e 2e 2e 29 0a  SON, PATH, ...).
9790: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
97a0: 20 65 6c 65 6d 65 6e 74 20 64 65 73 63 72 69 62   element describ
97b0: 65 64 20 62 79 20 50 41 54 48 2e 20 20 52 65 74  ed by PATH.  Ret
97c0: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72  urn NULL if ther
97d0: 65 20 69 73 20 6e 6f 0a 2a 2a 20 50 41 54 48 20  e is no.** PATH 
97e0: 65 6c 65 6d 65 6e 74 2e 20 20 49 66 20 74 68 65  element.  If the
97f0: 72 65 20 61 72 65 20 6d 75 6c 74 69 70 6c 65 20  re are multiple 
9800: 50 41 54 48 73 2c 20 74 68 65 6e 20 72 65 74 75  PATHs, then retu
9810: 72 6e 20 61 20 4a 53 4f 4e 20 61 72 72 61 79 0a  rn a JSON array.
9820: 2a 2a 20 77 69 74 68 20 74 68 65 20 72 65 73 75  ** with the resu
9830: 6c 74 20 66 72 6f 6d 20 65 61 63 68 20 70 61 74  lt from each pat
9840: 68 2e 20 20 54 68 72 6f 77 20 61 6e 20 65 72 72  h.  Throw an err
9850: 6f 72 20 69 66 20 74 68 65 20 4a 53 4f 4e 20 6f  or if the JSON o
9860: 72 20 61 6e 79 20 50 41 54 48 0a 2a 2a 20 69 73  r any PATH.** is
9870: 20 6d 61 6c 66 6f 72 6d 65 64 2e 0a 2a 2f 0a 73   malformed..*/.s
9880: 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 45  tatic void jsonE
9890: 78 74 72 61 63 74 46 75 6e 63 28 0a 20 20 73 71  xtractFunc(.  sq
98a0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
98b0: 74 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  tx,.  int argc,.
98c0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
98d0: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e  **argv.){.  Json
98e0: 50 61 72 73 65 20 78 3b 20 20 20 20 20 20 20 20  Parse x;        
98f0: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 20 2a    /* The parse *
9900: 2f 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e  /.  JsonNode *pN
9910: 6f 64 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ode;.  const cha
9920: 72 20 2a 7a 50 61 74 68 3b 0a 20 20 4a 73 6f 6e  r *zPath;.  Json
9930: 53 74 72 69 6e 67 20 6a 78 3b 0a 20 20 69 6e 74  String jx;.  int
9940: 20 69 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 3c   i;..  if( argc<
9950: 32 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  2 ) return;.  if
9960: 28 20 6a 73 6f 6e 50 61 72 73 65 28 26 78 2c 20  ( jsonParse(&x, 
9970: 63 74 78 2c 20 28 63 6f 6e 73 74 20 63 68 61 72  ctx, (const char
9980: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
9990: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 29 20 29  text(argv[0])) )
99a0: 20 72 65 74 75 72 6e 3b 0a 20 20 6a 73 6f 6e 49   return;.  jsonI
99b0: 6e 69 74 28 26 6a 78 2c 20 63 74 78 29 3b 0a 20  nit(&jx, ctx);. 
99c0: 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61 72 28   jsonAppendChar(
99d0: 26 6a 78 2c 20 27 5b 27 29 3b 0a 20 20 66 6f 72  &jx, '[');.  for
99e0: 28 69 3d 31 3b 20 69 3c 61 72 67 63 3b 20 69 2b  (i=1; i<argc; i+
99f0: 2b 29 7b 0a 20 20 20 20 7a 50 61 74 68 20 3d 20  +){.    zPath = 
9a00: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
9a10: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
9a20: 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 70 4e  argv[i]);.    pN
9a30: 6f 64 65 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75 70  ode = jsonLookup
9a40: 28 26 78 2c 20 7a 50 61 74 68 2c 20 30 2c 20 63  (&x, zPath, 0, c
9a50: 74 78 29 3b 0a 20 20 20 20 69 66 28 20 78 2e 6e  tx);.    if( x.n
9a60: 45 72 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  Err ) break;.   
9a70: 20 69 66 28 20 61 72 67 63 3e 32 20 29 7b 0a 20   if( argc>2 ){. 
9a80: 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 53       jsonAppendS
9a90: 65 70 61 72 61 74 6f 72 28 26 6a 78 29 3b 0a 20  eparator(&jx);. 
9aa0: 20 20 20 20 20 69 66 28 20 70 4e 6f 64 65 20 29       if( pNode )
9ab0: 7b 0a 20 20 20 20 20 20 20 20 6a 73 6f 6e 52 65  {.        jsonRe
9ac0: 6e 64 65 72 4e 6f 64 65 28 70 4e 6f 64 65 2c 20  nderNode(pNode, 
9ad0: 26 6a 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  &jx, 0);.      }
9ae0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6a 73  else{.        js
9af0: 6f 6e 41 70 70 65 6e 64 52 61 77 28 26 6a 78 2c  onAppendRaw(&jx,
9b00: 20 22 6e 75 6c 6c 22 2c 20 34 29 3b 0a 20 20 20   "null", 4);.   
9b10: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
9b20: 66 28 20 70 4e 6f 64 65 20 29 7b 0a 20 20 20 20  f( pNode ){.    
9b30: 20 20 6a 73 6f 6e 52 65 74 75 72 6e 28 70 4e 6f    jsonReturn(pNo
9b40: 64 65 2c 20 63 74 78 2c 20 30 29 3b 0a 20 20 20  de, ctx, 0);.   
9b50: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 61 72 67   }.  }.  if( arg
9b60: 63 3e 32 20 26 26 20 69 3d 3d 61 72 67 63 20 29  c>2 && i==argc )
9b70: 7b 0a 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64  {.    jsonAppend
9b80: 43 68 61 72 28 26 6a 78 2c 20 27 5d 27 29 3b 0a  Char(&jx, ']');.
9b90: 20 20 20 20 6a 73 6f 6e 52 65 73 75 6c 74 28 26      jsonResult(&
9ba0: 6a 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  jx);.    sqlite3
9bb0: 5f 72 65 73 75 6c 74 5f 73 75 62 74 79 70 65 28  _result_subtype(
9bc0: 63 74 78 2c 20 4a 53 4f 4e 5f 53 55 42 54 59 50  ctx, JSON_SUBTYP
9bd0: 45 29 3b 0a 20 20 7d 0a 20 20 6a 73 6f 6e 52 65  E);.  }.  jsonRe
9be0: 73 65 74 28 26 6a 78 29 3b 0a 20 20 6a 73 6f 6e  set(&jx);.  json
9bf0: 50 61 72 73 65 52 65 73 65 74 28 26 78 29 3b 0a  ParseReset(&x);.
9c00: 7d 0a 0a 2f 2a 20 54 68 69 73 20 69 73 20 74 68  }../* This is th
9c10: 65 20 52 46 43 20 37 33 39 36 20 4d 65 72 67 65  e RFC 7396 Merge
9c20: 50 61 74 63 68 20 61 6c 67 6f 72 69 74 68 6d 2e  Patch algorithm.
9c30: 0a 2a 2f 0a 73 74 61 74 69 63 20 4a 73 6f 6e 4e  .*/.static JsonN
9c40: 6f 64 65 20 2a 6a 73 6f 6e 4d 65 72 67 65 50 61  ode *jsonMergePa
9c50: 74 63 68 28 0a 20 20 4a 73 6f 6e 50 61 72 73 65  tch(.  JsonParse
9c60: 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 54   *pParse,   /* T
9c70: 68 65 20 4a 53 4f 4e 20 70 61 72 73 65 72 20 74  he JSON parser t
9c80: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
9c90: 20 54 41 52 47 45 54 20 2a 2f 0a 20 20 69 6e 74   TARGET */.  int
9ca0: 20 69 54 61 72 67 65 74 2c 20 20 20 20 20 20 20   iTarget,       
9cb0: 20 20 2f 2a 20 4e 6f 64 65 20 6f 66 20 74 68 65    /* Node of the
9cc0: 20 54 41 52 47 45 54 20 69 6e 20 70 50 61 72 73   TARGET in pPars
9cd0: 65 20 2a 2f 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20  e */.  JsonNode 
9ce0: 2a 70 50 61 74 63 68 20 20 20 20 20 2f 2a 20 54  *pPatch     /* T
9cf0: 68 65 20 50 41 54 43 48 20 2a 2f 0a 29 7b 0a 20  he PATCH */.){. 
9d00: 20 75 33 32 20 69 2c 20 6a 3b 0a 20 20 75 33 32   u32 i, j;.  u32
9d10: 20 69 52 6f 6f 74 3b 0a 20 20 4a 73 6f 6e 4e 6f   iRoot;.  JsonNo
9d20: 64 65 20 2a 70 54 61 72 67 65 74 3b 0a 20 20 69  de *pTarget;.  i
9d30: 66 28 20 70 50 61 74 63 68 2d 3e 65 54 79 70 65  f( pPatch->eType
9d40: 21 3d 4a 53 4f 4e 5f 4f 42 4a 45 43 54 20 29 7b  !=JSON_OBJECT ){
9d50: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 74  .    return pPat
9d60: 63 68 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ch;.  }.  assert
9d70: 28 20 69 54 61 72 67 65 74 3e 3d 30 20 26 26 20  ( iTarget>=0 && 
9d80: 69 54 61 72 67 65 74 3c 70 50 61 72 73 65 2d 3e  iTarget<pParse->
9d90: 6e 4e 6f 64 65 20 29 3b 0a 20 20 70 54 61 72 67  nNode );.  pTarg
9da0: 65 74 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 4e  et = &pParse->aN
9db0: 6f 64 65 5b 69 54 61 72 67 65 74 5d 3b 0a 20 20  ode[iTarget];.  
9dc0: 61 73 73 65 72 74 28 20 28 70 50 61 74 63 68 2d  assert( (pPatch-
9dd0: 3e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45  >jnFlags & JNODE
9de0: 5f 41 50 50 45 4e 44 29 3d 3d 30 20 29 3b 0a 20  _APPEND)==0 );. 
9df0: 20 69 66 28 20 70 54 61 72 67 65 74 2d 3e 65 54   if( pTarget->eT
9e00: 79 70 65 21 3d 4a 53 4f 4e 5f 4f 42 4a 45 43 54  ype!=JSON_OBJECT
9e10: 20 29 7b 0a 20 20 20 20 6a 73 6f 6e 52 65 6d 6f   ){.    jsonRemo
9e20: 76 65 41 6c 6c 4e 75 6c 6c 73 28 70 50 61 74 63  veAllNulls(pPatc
9e30: 68 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70  h);.    return p
9e40: 50 61 74 63 68 3b 0a 20 20 7d 0a 20 20 69 52 6f  Patch;.  }.  iRo
9e50: 6f 74 20 3d 20 69 54 61 72 67 65 74 3b 0a 20 20  ot = iTarget;.  
9e60: 66 6f 72 28 69 3d 31 3b 20 69 3c 70 50 61 74 63  for(i=1; i<pPatc
9e70: 68 2d 3e 6e 3b 20 69 20 2b 3d 20 6a 73 6f 6e 4e  h->n; i += jsonN
9e80: 6f 64 65 53 69 7a 65 28 26 70 50 61 74 63 68 5b  odeSize(&pPatch[
9e90: 69 2b 31 5d 29 2b 31 29 7b 0a 20 20 20 20 75 33  i+1])+1){.    u3
9ea0: 32 20 6e 4b 65 79 3b 0a 20 20 20 20 63 6f 6e 73  2 nKey;.    cons
9eb0: 74 20 63 68 61 72 20 2a 7a 4b 65 79 3b 0a 20 20  t char *zKey;.  
9ec0: 20 20 61 73 73 65 72 74 28 20 70 50 61 74 63 68    assert( pPatch
9ed0: 5b 69 5d 2e 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f  [i].eType==JSON_
9ee0: 53 54 52 49 4e 47 20 29 3b 0a 20 20 20 20 61 73  STRING );.    as
9ef0: 73 65 72 74 28 20 70 50 61 74 63 68 5b 69 5d 2e  sert( pPatch[i].
9f00: 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f  jnFlags & JNODE_
9f10: 4c 41 42 45 4c 20 29 3b 0a 20 20 20 20 6e 4b 65  LABEL );.    nKe
9f20: 79 20 3d 20 70 50 61 74 63 68 5b 69 5d 2e 6e 3b  y = pPatch[i].n;
9f30: 0a 20 20 20 20 7a 4b 65 79 20 3d 20 70 50 61 74  .    zKey = pPat
9f40: 63 68 5b 69 5d 2e 75 2e 7a 4a 43 6f 6e 74 65 6e  ch[i].u.zJConten
9f50: 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  t;.    assert( (
9f60: 70 50 61 74 63 68 5b 69 5d 2e 6a 6e 46 6c 61 67  pPatch[i].jnFlag
9f70: 73 20 26 20 4a 4e 4f 44 45 5f 52 41 57 29 3d 3d  s & JNODE_RAW)==
9f80: 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 31  0 );.    for(j=1
9f90: 3b 20 6a 3c 70 54 61 72 67 65 74 2d 3e 6e 3b 20  ; j<pTarget->n; 
9fa0: 6a 20 2b 3d 20 6a 73 6f 6e 4e 6f 64 65 53 69 7a  j += jsonNodeSiz
9fb0: 65 28 26 70 54 61 72 67 65 74 5b 6a 2b 31 5d 29  e(&pTarget[j+1])
9fc0: 2b 31 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  +1 ){.      asse
9fd0: 72 74 28 20 70 54 61 72 67 65 74 5b 6a 5d 2e 65  rt( pTarget[j].e
9fe0: 54 79 70 65 3d 3d 4a 53 4f 4e 5f 53 54 52 49 4e  Type==JSON_STRIN
9ff0: 47 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  G );.      asser
a000: 74 28 20 70 54 61 72 67 65 74 5b 6a 5d 2e 6a 6e  t( pTarget[j].jn
a010: 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 4c 41  Flags & JNODE_LA
a020: 42 45 4c 20 29 3b 0a 20 20 20 20 20 20 61 73 73  BEL );.      ass
a030: 65 72 74 28 20 28 70 50 61 74 63 68 5b 69 5d 2e  ert( (pPatch[i].
a040: 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f  jnFlags & JNODE_
a050: 52 41 57 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  RAW)==0 );.     
a060: 20 69 66 28 20 70 54 61 72 67 65 74 5b 6a 5d 2e   if( pTarget[j].
a070: 6e 3d 3d 6e 4b 65 79 20 26 26 20 73 74 72 6e 63  n==nKey && strnc
a080: 6d 70 28 70 54 61 72 67 65 74 5b 6a 5d 2e 75 2e  mp(pTarget[j].u.
a090: 7a 4a 43 6f 6e 74 65 6e 74 2c 7a 4b 65 79 2c 6e  zJContent,zKey,n
a0a0: 4b 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Key)==0 ){.     
a0b0: 20 20 20 69 66 28 20 70 54 61 72 67 65 74 5b 6a     if( pTarget[j
a0c0: 2b 31 5d 2e 6a 6e 46 6c 61 67 73 20 26 20 28 4a  +1].jnFlags & (J
a0d0: 4e 4f 44 45 5f 52 45 4d 4f 56 45 7c 4a 4e 4f 44  NODE_REMOVE|JNOD
a0e0: 45 5f 50 41 54 43 48 29 20 29 20 62 72 65 61 6b  E_PATCH) ) break
a0f0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
a100: 61 74 63 68 5b 69 2b 31 5d 2e 65 54 79 70 65 3d  atch[i+1].eType=
a110: 3d 4a 53 4f 4e 5f 4e 55 4c 4c 20 29 7b 0a 20 20  =JSON_NULL ){.  
a120: 20 20 20 20 20 20 20 20 70 54 61 72 67 65 74 5b          pTarget[
a130: 6a 2b 31 5d 2e 6a 6e 46 6c 61 67 73 20 7c 3d 20  j+1].jnFlags |= 
a140: 4a 4e 4f 44 45 5f 52 45 4d 4f 56 45 3b 0a 20 20  JNODE_REMOVE;.  
a150: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a160: 20 20 20 20 20 20 20 4a 73 6f 6e 4e 6f 64 65 20         JsonNode 
a170: 2a 70 4e 65 77 20 3d 20 6a 73 6f 6e 4d 65 72 67  *pNew = jsonMerg
a180: 65 50 61 74 63 68 28 70 50 61 72 73 65 2c 20 69  ePatch(pParse, i
a190: 54 61 72 67 65 74 2b 6a 2b 31 2c 20 26 70 50 61  Target+j+1, &pPa
a1a0: 74 63 68 5b 69 2b 31 5d 29 3b 0a 20 20 20 20 20  tch[i+1]);.     
a1b0: 20 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30       if( pNew==0
a1c0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
a1d0: 20 20 20 20 20 20 20 70 54 61 72 67 65 74 20 3d         pTarget =
a1e0: 20 26 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65 5b   &pParse->aNode[
a1f0: 69 54 61 72 67 65 74 5d 3b 0a 20 20 20 20 20 20  iTarget];.      
a200: 20 20 20 20 69 66 28 20 70 4e 65 77 21 3d 26 70      if( pNew!=&p
a210: 54 61 72 67 65 74 5b 6a 2b 31 5d 20 29 7b 0a 20  Target[j+1] ){. 
a220: 20 20 20 20 20 20 20 20 20 20 20 70 54 61 72 67             pTarg
a230: 65 74 5b 6a 2b 31 5d 2e 75 2e 70 50 61 74 63 68  et[j+1].u.pPatch
a240: 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20   = pNew;.       
a250: 20 20 20 20 20 70 54 61 72 67 65 74 5b 6a 2b 31       pTarget[j+1
a260: 5d 2e 6a 6e 46 6c 61 67 73 20 7c 3d 20 4a 4e 4f  ].jnFlags |= JNO
a270: 44 45 5f 50 41 54 43 48 3b 0a 20 20 20 20 20 20  DE_PATCH;.      
a280: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
a290: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
a2a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
a2b0: 20 69 66 28 20 6a 3e 3d 70 54 61 72 67 65 74 2d   if( j>=pTarget-
a2c0: 3e 6e 20 26 26 20 70 50 61 74 63 68 5b 69 2b 31  >n && pPatch[i+1
a2d0: 5d 2e 65 54 79 70 65 21 3d 4a 53 4f 4e 5f 4e 55  ].eType!=JSON_NU
a2e0: 4c 4c 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  LL ){.      int 
a2f0: 69 53 74 61 72 74 2c 20 69 50 61 74 63 68 3b 0a  iStart, iPatch;.
a300: 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 6a        iStart = j
a310: 73 6f 6e 50 61 72 73 65 41 64 64 4e 6f 64 65 28  sonParseAddNode(
a320: 70 50 61 72 73 65 2c 20 4a 53 4f 4e 5f 4f 42 4a  pParse, JSON_OBJ
a330: 45 43 54 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20  ECT, 2, 0);.    
a340: 20 20 6a 73 6f 6e 50 61 72 73 65 41 64 64 4e 6f    jsonParseAddNo
a350: 64 65 28 70 50 61 72 73 65 2c 20 4a 53 4f 4e 5f  de(pParse, JSON_
a360: 53 54 52 49 4e 47 2c 20 6e 4b 65 79 2c 20 7a 4b  STRING, nKey, zK
a370: 65 79 29 3b 0a 20 20 20 20 20 20 69 50 61 74 63  ey);.      iPatc
a380: 68 20 3d 20 6a 73 6f 6e 50 61 72 73 65 41 64 64  h = jsonParseAdd
a390: 4e 6f 64 65 28 70 50 61 72 73 65 2c 20 4a 53 4f  Node(pParse, JSO
a3a0: 4e 5f 54 52 55 45 2c 20 30 2c 20 30 29 3b 0a 20  N_TRUE, 0, 0);. 
a3b0: 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
a3c0: 3e 6f 6f 6d 20 29 20 72 65 74 75 72 6e 20 30 3b  >oom ) return 0;
a3d0: 0a 20 20 20 20 20 20 6a 73 6f 6e 52 65 6d 6f 76  .      jsonRemov
a3e0: 65 41 6c 6c 4e 75 6c 6c 73 28 70 50 61 74 63 68  eAllNulls(pPatch
a3f0: 29 3b 0a 20 20 20 20 20 20 70 54 61 72 67 65 74  );.      pTarget
a400: 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 4e 6f 64   = &pParse->aNod
a410: 65 5b 69 54 61 72 67 65 74 5d 3b 0a 20 20 20 20  e[iTarget];.    
a420: 20 20 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65 5b    pParse->aNode[
a430: 69 52 6f 6f 74 5d 2e 6a 6e 46 6c 61 67 73 20 7c  iRoot].jnFlags |
a440: 3d 20 4a 4e 4f 44 45 5f 41 50 50 45 4e 44 3b 0a  = JNODE_APPEND;.
a450: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 4e        pParse->aN
a460: 6f 64 65 5b 69 52 6f 6f 74 5d 2e 75 2e 69 41 70  ode[iRoot].u.iAp
a470: 70 65 6e 64 20 3d 20 69 53 74 61 72 74 20 2d 20  pend = iStart - 
a480: 69 52 6f 6f 74 3b 0a 20 20 20 20 20 20 69 52 6f  iRoot;.      iRo
a490: 6f 74 20 3d 20 69 53 74 61 72 74 3b 0a 20 20 20  ot = iStart;.   
a4a0: 20 20 20 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65     pParse->aNode
a4b0: 5b 69 50 61 74 63 68 5d 2e 6a 6e 46 6c 61 67 73  [iPatch].jnFlags
a4c0: 20 7c 3d 20 4a 4e 4f 44 45 5f 50 41 54 43 48 3b   |= JNODE_PATCH;
a4d0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61  .      pParse->a
a4e0: 4e 6f 64 65 5b 69 50 61 74 63 68 5d 2e 75 2e 70  Node[iPatch].u.p
a4f0: 50 61 74 63 68 20 3d 20 26 70 50 61 74 63 68 5b  Patch = &pPatch[
a500: 69 2b 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  i+1];.    }.  }.
a510: 20 20 72 65 74 75 72 6e 20 70 54 61 72 67 65 74    return pTarget
a520: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
a530: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
a540: 20 6a 73 6f 6e 5f 6d 65 72 67 65 70 61 74 63 68   json_mergepatch
a550: 28 4a 53 4f 4e 31 2c 4a 53 4f 4e 32 29 20 66 75  (JSON1,JSON2) fu
a560: 6e 63 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20  nction.  Return 
a570: 61 20 4a 53 4f 4e 0a 2a 2a 20 6f 62 6a 65 63 74  a JSON.** object
a580: 20 74 68 61 74 20 69 73 20 74 68 65 20 72 65 73   that is the res
a590: 75 6c 74 20 6f 66 20 72 75 6e 6e 69 6e 67 20 74  ult of running t
a5a0: 68 65 20 52 46 43 20 37 33 39 36 20 4d 65 72 67  he RFC 7396 Merg
a5b0: 65 50 61 74 63 68 28 29 20 61 6c 67 6f 72 69 74  ePatch() algorit
a5c0: 68 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 74 77 6f  hm.** on the two
a5d0: 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 73   arguments..*/.s
a5e0: 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 50  tatic void jsonP
a5f0: 61 74 63 68 46 75 6e 63 28 0a 20 20 73 71 6c 69  atchFunc(.  sqli
a600: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78  te3_context *ctx
a610: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
a620: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
a630: 61 72 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e 50 61  argv.){.  JsonPa
a640: 72 73 65 20 78 3b 20 20 20 20 20 2f 2a 20 54 68  rse x;     /* Th
a650: 65 20 4a 53 4f 4e 20 74 68 61 74 20 69 73 20 62  e JSON that is b
a660: 65 69 6e 67 20 70 61 74 63 68 65 64 20 2a 2f 0a  eing patched */.
a670: 20 20 4a 73 6f 6e 50 61 72 73 65 20 79 3b 20 20    JsonParse y;  
a680: 20 20 20 2f 2a 20 54 68 65 20 70 61 74 63 68 20     /* The patch 
a690: 2a 2f 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70  */.  JsonNode *p
a6a0: 52 65 73 75 6c 74 3b 20 20 20 2f 2a 20 54 68 65  Result;   /* The
a6b0: 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6d   result of the m
a6c0: 65 72 67 65 20 2a 2f 0a 0a 20 20 55 4e 55 53 45  erge */..  UNUSE
a6d0: 44 5f 50 41 52 41 4d 28 61 72 67 63 29 3b 0a 20  D_PARAM(argc);. 
a6e0: 20 69 66 28 20 6a 73 6f 6e 50 61 72 73 65 28 26   if( jsonParse(&
a6f0: 78 2c 20 63 74 78 2c 20 28 63 6f 6e 73 74 20 63  x, ctx, (const c
a700: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
a710: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
a720: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  ) ) return;.  if
a730: 28 20 6a 73 6f 6e 50 61 72 73 65 28 26 79 2c 20  ( jsonParse(&y, 
a740: 63 74 78 2c 20 28 63 6f 6e 73 74 20 63 68 61 72  ctx, (const char
a750: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
a760: 74 65 78 74 28 61 72 67 76 5b 31 5d 29 29 20 29  text(argv[1])) )
a770: 7b 0a 20 20 20 20 6a 73 6f 6e 50 61 72 73 65 52  {.    jsonParseR
a780: 65 73 65 74 28 26 78 29 3b 0a 20 20 20 20 72 65  eset(&x);.    re
a790: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 52 65 73  turn;.  }.  pRes
a7a0: 75 6c 74 20 3d 20 6a 73 6f 6e 4d 65 72 67 65 50  ult = jsonMergeP
a7b0: 61 74 63 68 28 26 78 2c 20 30 2c 20 79 2e 61 4e  atch(&x, 0, y.aN
a7c0: 6f 64 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ode);.  assert( 
a7d0: 70 52 65 73 75 6c 74 21 3d 30 20 7c 7c 20 78 2e  pResult!=0 || x.
a7e0: 6f 6f 6d 20 29 3b 0a 20 20 69 66 28 20 70 52 65  oom );.  if( pRe
a7f0: 73 75 6c 74 20 29 7b 0a 20 20 20 20 6a 73 6f 6e  sult ){.    json
a800: 52 65 74 75 72 6e 4a 73 6f 6e 28 70 52 65 73 75  ReturnJson(pResu
a810: 6c 74 2c 20 63 74 78 2c 20 30 29 3b 0a 20 20 7d  lt, ctx, 0);.  }
a820: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
a830: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e  3_result_error_n
a840: 6f 6d 65 6d 28 63 74 78 29 3b 0a 20 20 7d 0a 20  omem(ctx);.  }. 
a850: 20 6a 73 6f 6e 50 61 72 73 65 52 65 73 65 74 28   jsonParseReset(
a860: 26 78 29 3b 0a 20 20 6a 73 6f 6e 50 61 72 73 65  &x);.  jsonParse
a870: 52 65 73 65 74 28 26 79 29 3b 0a 7d 0a 0a 0a 2f  Reset(&y);.}.../
a880: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
a890: 69 6f 6e 20 6f 66 20 74 68 65 20 6a 73 6f 6e 5f  ion of the json_
a8a0: 6f 62 6a 65 63 74 28 4e 41 4d 45 2c 56 41 4c 55  object(NAME,VALU
a8b0: 45 2c 2e 2e 2e 29 20 66 75 6e 63 74 69 6f 6e 2e  E,...) function.
a8c0: 20 20 52 65 74 75 72 6e 20 61 20 4a 53 4f 4e 0a    Return a JSON.
a8d0: 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 63  ** object that c
a8e0: 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 6e 61 6d 65  ontains all name
a8f0: 2f 76 61 6c 75 65 20 67 69 76 65 6e 20 69 6e 20  /value given in 
a900: 61 72 67 75 6d 65 6e 74 73 2e 20 20 4f 72 20 69  arguments.  Or i
a910: 66 20 61 6e 79 20 6e 61 6d 65 0a 2a 2a 20 69 73  f any name.** is
a920: 20 6e 6f 74 20 61 20 73 74 72 69 6e 67 20 6f 72   not a string or
a930: 20 69 66 20 61 6e 79 20 76 61 6c 75 65 20 69 73   if any value is
a940: 20 61 20 42 4c 4f 42 2c 20 74 68 72 6f 77 20 61   a BLOB, throw a
a950: 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74  n error..*/.stat
a960: 69 63 20 76 6f 69 64 20 6a 73 6f 6e 4f 62 6a 65  ic void jsonObje
a970: 63 74 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  ctFunc(.  sqlite
a980: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 0a  3_context *ctx,.
a990: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
a9a0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
a9b0: 67 76 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  gv.){.  int i;. 
a9c0: 20 4a 73 6f 6e 53 74 72 69 6e 67 20 6a 78 3b 0a   JsonString jx;.
a9d0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
a9e0: 0a 20 20 75 33 32 20 6e 3b 0a 0a 20 20 69 66 28  .  u32 n;..  if(
a9f0: 20 61 72 67 63 26 31 20 29 7b 0a 20 20 20 20 73   argc&1 ){.    s
aa00: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
aa10: 72 6f 72 28 63 74 78 2c 20 22 6a 73 6f 6e 5f 6f  ror(ctx, "json_o
aa20: 62 6a 65 63 74 28 29 20 72 65 71 75 69 72 65 73  bject() requires
aa30: 20 61 6e 20 65 76 65 6e 20 6e 75 6d 62 65 72 20   an even number 
aa40: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
aa50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa60: 20 20 20 20 22 6f 66 20 61 72 67 75 6d 65 6e 74      "of argument
aa70: 73 22 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74  s", -1);.    ret
aa80: 75 72 6e 3b 0a 20 20 7d 0a 20 20 6a 73 6f 6e 49  urn;.  }.  jsonI
aa90: 6e 69 74 28 26 6a 78 2c 20 63 74 78 29 3b 0a 20  nit(&jx, ctx);. 
aaa0: 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61 72 28   jsonAppendChar(
aab0: 26 6a 78 2c 20 27 7b 27 29 3b 0a 20 20 66 6f 72  &jx, '{');.  for
aac0: 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b  (i=0; i<argc; i+
aad0: 3d 32 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  =2){.    if( sql
aae0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
aaf0: 61 72 67 76 5b 69 5d 29 21 3d 53 51 4c 49 54 45  argv[i])!=SQLITE
ab00: 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20 73  _TEXT ){.      s
ab10: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
ab20: 72 6f 72 28 63 74 78 2c 20 22 6a 73 6f 6e 5f 6f  ror(ctx, "json_o
ab30: 62 6a 65 63 74 28 29 20 6c 61 62 65 6c 73 20 6d  bject() labels m
ab40: 75 73 74 20 62 65 20 54 45 58 54 22 2c 20 2d 31  ust be TEXT", -1
ab50: 29 3b 0a 20 20 20 20 20 20 6a 73 6f 6e 52 65 73  );.      jsonRes
ab60: 65 74 28 26 6a 78 29 3b 0a 20 20 20 20 20 20 72  et(&jx);.      r
ab70: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
ab80: 20 6a 73 6f 6e 41 70 70 65 6e 64 53 65 70 61 72   jsonAppendSepar
ab90: 61 74 6f 72 28 26 6a 78 29 3b 0a 20 20 20 20 7a  ator(&jx);.    z
aba0: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
abb0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
abc0: 78 74 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20  xt(argv[i]);.   
abd0: 20 6e 20 3d 20 28 75 33 32 29 73 71 6c 69 74 65   n = (u32)sqlite
abe0: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72  3_value_bytes(ar
abf0: 67 76 5b 69 5d 29 3b 0a 20 20 20 20 6a 73 6f 6e  gv[i]);.    json
ac00: 41 70 70 65 6e 64 53 74 72 69 6e 67 28 26 6a 78  AppendString(&jx
ac10: 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 6a 73 6f  , z, n);.    jso
ac20: 6e 41 70 70 65 6e 64 43 68 61 72 28 26 6a 78 2c  nAppendChar(&jx,
ac30: 20 27 3a 27 29 3b 0a 20 20 20 20 6a 73 6f 6e 41   ':');.    jsonA
ac40: 70 70 65 6e 64 56 61 6c 75 65 28 26 6a 78 2c 20  ppendValue(&jx, 
ac50: 61 72 67 76 5b 69 2b 31 5d 29 3b 0a 20 20 7d 0a  argv[i+1]);.  }.
ac60: 20 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61 72    jsonAppendChar
ac70: 28 26 6a 78 2c 20 27 7d 27 29 3b 0a 20 20 6a 73  (&jx, '}');.  js
ac80: 6f 6e 52 65 73 75 6c 74 28 26 6a 78 29 3b 0a 20  onResult(&jx);. 
ac90: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
aca0: 73 75 62 74 79 70 65 28 63 74 78 2c 20 4a 53 4f  subtype(ctx, JSO
acb0: 4e 5f 53 55 42 54 59 50 45 29 3b 0a 7d 0a 0a 0a  N_SUBTYPE);.}...
acc0: 2f 2a 0a 2a 2a 20 6a 73 6f 6e 5f 72 65 6d 6f 76  /*.** json_remov
acd0: 65 28 4a 53 4f 4e 2c 20 50 41 54 48 2c 20 2e 2e  e(JSON, PATH, ..
ace0: 2e 29 0a 2a 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  .).**.** Remove 
acf0: 74 68 65 20 6e 61 6d 65 64 20 65 6c 65 6d 65 6e  the named elemen
ad00: 74 73 20 66 72 6f 6d 20 4a 53 4f 4e 20 61 6e 64  ts from JSON and
ad10: 20 72 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   return the resu
ad20: 6c 74 2e 20 20 6d 61 6c 66 6f 72 6d 65 64 0a 2a  lt.  malformed.*
ad30: 2a 20 4a 53 4f 4e 20 6f 72 20 50 41 54 48 20 61  * JSON or PATH a
ad40: 72 67 75 6d 65 6e 74 73 20 72 65 73 75 6c 74 20  rguments result 
ad50: 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a  in an error..*/.
ad60: 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e  static void json
ad70: 52 65 6d 6f 76 65 46 75 6e 63 28 0a 20 20 73 71  RemoveFunc(.  sq
ad80: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
ad90: 74 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  tx,.  int argc,.
ada0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
adb0: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e  **argv.){.  Json
adc0: 50 61 72 73 65 20 78 3b 20 20 20 20 20 20 20 20  Parse x;        
add0: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 20 2a    /* The parse *
ade0: 2f 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e  /.  JsonNode *pN
adf0: 6f 64 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ode;.  const cha
ae00: 72 20 2a 7a 50 61 74 68 3b 0a 20 20 75 33 32 20  r *zPath;.  u32 
ae10: 69 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 3c 31  i;..  if( argc<1
ae20: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
ae30: 20 6a 73 6f 6e 50 61 72 73 65 28 26 78 2c 20 63   jsonParse(&x, c
ae40: 74 78 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  tx, (const char*
ae50: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
ae60: 65 78 74 28 61 72 67 76 5b 30 5d 29 29 20 29 20  ext(argv[0])) ) 
ae70: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
ae80: 28 20 78 2e 6e 4e 6f 64 65 20 29 3b 0a 20 20 66  ( x.nNode );.  f
ae90: 6f 72 28 69 3d 31 3b 20 69 3c 28 75 33 32 29 61  or(i=1; i<(u32)a
aea0: 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a  rgc; i++){.    z
aeb0: 50 61 74 68 20 3d 20 28 63 6f 6e 73 74 20 63 68  Path = (const ch
aec0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
aed0: 65 5f 74 65 78 74 28 61 72 67 76 5b 69 5d 29 3b  e_text(argv[i]);
aee0: 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68 3d 3d  .    if( zPath==
aef0: 30 20 29 20 67 6f 74 6f 20 72 65 6d 6f 76 65 5f  0 ) goto remove_
af00: 64 6f 6e 65 3b 0a 20 20 20 20 70 4e 6f 64 65 20  done;.    pNode 
af10: 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 28 26 78 2c  = jsonLookup(&x,
af20: 20 7a 50 61 74 68 2c 20 30 2c 20 63 74 78 29 3b   zPath, 0, ctx);
af30: 0a 20 20 20 20 69 66 28 20 78 2e 6e 45 72 72 20  .    if( x.nErr 
af40: 29 20 67 6f 74 6f 20 72 65 6d 6f 76 65 5f 64 6f  ) goto remove_do
af50: 6e 65 3b 0a 20 20 20 20 69 66 28 20 70 4e 6f 64  ne;.    if( pNod
af60: 65 20 29 20 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61  e ) pNode->jnFla
af70: 67 73 20 7c 3d 20 4a 4e 4f 44 45 5f 52 45 4d 4f  gs |= JNODE_REMO
af80: 56 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 78  VE;.  }.  if( (x
af90: 2e 61 4e 6f 64 65 5b 30 5d 2e 6a 6e 46 6c 61 67  .aNode[0].jnFlag
afa0: 73 20 26 20 4a 4e 4f 44 45 5f 52 45 4d 4f 56 45  s & JNODE_REMOVE
afb0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6a 73 6f 6e  )==0 ){.    json
afc0: 52 65 74 75 72 6e 4a 73 6f 6e 28 78 2e 61 4e 6f  ReturnJson(x.aNo
afd0: 64 65 2c 20 63 74 78 2c 20 30 29 3b 0a 20 20 7d  de, ctx, 0);.  }
afe0: 0a 72 65 6d 6f 76 65 5f 64 6f 6e 65 3a 0a 20 20  .remove_done:.  
aff0: 6a 73 6f 6e 50 61 72 73 65 52 65 73 65 74 28 26  jsonParseReset(&
b000: 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 6a 73 6f  x);.}../*.** jso
b010: 6e 5f 72 65 70 6c 61 63 65 28 4a 53 4f 4e 2c 20  n_replace(JSON, 
b020: 50 41 54 48 2c 20 56 41 4c 55 45 2c 20 2e 2e 2e  PATH, VALUE, ...
b030: 29 0a 2a 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20  ).**.** Replace 
b040: 74 68 65 20 76 61 6c 75 65 20 61 74 20 50 41 54  the value at PAT
b050: 48 20 77 69 74 68 20 56 41 4c 55 45 2e 20 20 49  H with VALUE.  I
b060: 66 20 50 41 54 48 20 64 6f 65 73 20 6e 6f 74 20  f PATH does not 
b070: 61 6c 72 65 61 64 79 20 65 78 69 73 74 2c 0a 2a  already exist,.*
b080: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * this routine i
b090: 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 4a  s a no-op.  If J
b0a0: 53 4f 4e 20 6f 72 20 50 41 54 48 20 69 73 20 6d  SON or PATH is m
b0b0: 61 6c 66 6f 72 6d 65 64 2c 20 74 68 72 6f 77 20  alformed, throw 
b0c0: 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61  an error..*/.sta
b0d0: 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 52 65 70  tic void jsonRep
b0e0: 6c 61 63 65 46 75 6e 63 28 0a 20 20 73 71 6c 69  laceFunc(.  sqli
b0f0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78  te3_context *ctx
b100: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
b110: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
b120: 61 72 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e 50 61  argv.){.  JsonPa
b130: 72 73 65 20 78 3b 20 20 20 20 20 20 20 20 20 20  rse x;          
b140: 2f 2a 20 54 68 65 20 70 61 72 73 65 20 2a 2f 0a  /* The parse */.
b150: 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64    JsonNode *pNod
b160: 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e;.  const char 
b170: 2a 7a 50 61 74 68 3b 0a 20 20 75 33 32 20 69 3b  *zPath;.  u32 i;
b180: 0a 0a 20 20 69 66 28 20 61 72 67 63 3c 31 20 29  ..  if( argc<1 )
b190: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28   return;.  if( (
b1a0: 61 72 67 63 26 31 29 3d 3d 30 20 29 20 7b 0a 20  argc&1)==0 ) {. 
b1b0: 20 20 20 6a 73 6f 6e 57 72 6f 6e 67 4e 75 6d 41     jsonWrongNumA
b1c0: 72 67 73 28 63 74 78 2c 20 22 72 65 70 6c 61 63  rgs(ctx, "replac
b1d0: 65 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  e");.    return;
b1e0: 0a 20 20 7d 0a 20 20 69 66 28 20 6a 73 6f 6e 50  .  }.  if( jsonP
b1f0: 61 72 73 65 28 26 78 2c 20 63 74 78 2c 20 28 63  arse(&x, ctx, (c
b200: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
b210: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
b220: 67 76 5b 30 5d 29 29 20 29 20 72 65 74 75 72 6e  gv[0])) ) return
b230: 3b 0a 20 20 61 73 73 65 72 74 28 20 78 2e 6e 4e  ;.  assert( x.nN
b240: 6f 64 65 20 29 3b 0a 20 20 66 6f 72 28 69 3d 31  ode );.  for(i=1
b250: 3b 20 69 3c 28 75 33 32 29 61 72 67 63 3b 20 69  ; i<(u32)argc; i
b260: 2b 3d 32 29 7b 0a 20 20 20 20 7a 50 61 74 68 20  +=2){.    zPath 
b270: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
b280: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
b290: 74 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20  t(argv[i]);.    
b2a0: 70 4e 6f 64 65 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b  pNode = jsonLook
b2b0: 75 70 28 26 78 2c 20 7a 50 61 74 68 2c 20 30 2c  up(&x, zPath, 0,
b2c0: 20 63 74 78 29 3b 0a 20 20 20 20 69 66 28 20 78   ctx);.    if( x
b2d0: 2e 6e 45 72 72 20 29 20 67 6f 74 6f 20 72 65 70  .nErr ) goto rep
b2e0: 6c 61 63 65 5f 65 72 72 3b 0a 20 20 20 20 69 66  lace_err;.    if
b2f0: 28 20 70 4e 6f 64 65 20 29 7b 0a 20 20 20 20 20  ( pNode ){.     
b300: 20 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73 20   pNode->jnFlags 
b310: 7c 3d 20 28 75 38 29 4a 4e 4f 44 45 5f 52 45 50  |= (u8)JNODE_REP
b320: 4c 41 43 45 3b 0a 20 20 20 20 20 20 70 4e 6f 64  LACE;.      pNod
b330: 65 2d 3e 75 2e 69 52 65 70 6c 61 63 65 20 3d 20  e->u.iReplace = 
b340: 69 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  i + 1;.    }.  }
b350: 0a 20 20 69 66 28 20 78 2e 61 4e 6f 64 65 5b 30  .  if( x.aNode[0
b360: 5d 2e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44  ].jnFlags & JNOD
b370: 45 5f 52 45 50 4c 41 43 45 20 29 7b 0a 20 20 20  E_REPLACE ){.   
b380: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
b390: 76 61 6c 75 65 28 63 74 78 2c 20 61 72 67 76 5b  value(ctx, argv[
b3a0: 78 2e 61 4e 6f 64 65 5b 30 5d 2e 75 2e 69 52 65  x.aNode[0].u.iRe
b3b0: 70 6c 61 63 65 5d 29 3b 0a 20 20 7d 65 6c 73 65  place]);.  }else
b3c0: 7b 0a 20 20 20 20 6a 73 6f 6e 52 65 74 75 72 6e  {.    jsonReturn
b3d0: 4a 73 6f 6e 28 78 2e 61 4e 6f 64 65 2c 20 63 74  Json(x.aNode, ct
b3e0: 78 2c 20 61 72 67 76 29 3b 0a 20 20 7d 0a 72 65  x, argv);.  }.re
b3f0: 70 6c 61 63 65 5f 65 72 72 3a 0a 20 20 6a 73 6f  place_err:.  jso
b400: 6e 50 61 72 73 65 52 65 73 65 74 28 26 78 29 3b  nParseReset(&x);
b410: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 6a 73 6f 6e 5f 73  .}../*.** json_s
b420: 65 74 28 4a 53 4f 4e 2c 20 50 41 54 48 2c 20 56  et(JSON, PATH, V
b430: 41 4c 55 45 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a  ALUE, ...).**.**
b440: 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 61   Set the value a
b450: 74 20 50 41 54 48 20 74 6f 20 56 41 4c 55 45 2e  t PATH to VALUE.
b460: 20 20 43 72 65 61 74 65 20 74 68 65 20 50 41 54    Create the PAT
b470: 48 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  H if it does not
b480: 20 61 6c 72 65 61 64 79 0a 2a 2a 20 65 78 69 73   already.** exis
b490: 74 2e 20 20 4f 76 65 72 77 72 69 74 65 20 65 78  t.  Overwrite ex
b4a0: 69 73 74 69 6e 67 20 76 61 6c 75 65 73 20 74 68  isting values th
b4b0: 61 74 20 64 6f 20 65 78 69 73 74 2e 0a 2a 2a 20  at do exist..** 
b4c0: 49 66 20 4a 53 4f 4e 20 6f 72 20 50 41 54 48 20  If JSON or PATH 
b4d0: 69 73 20 6d 61 6c 66 6f 72 6d 65 64 2c 20 74 68  is malformed, th
b4e0: 72 6f 77 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a  row an error..**
b4f0: 0a 2a 2a 20 6a 73 6f 6e 5f 69 6e 73 65 72 74 28  .** json_insert(
b500: 4a 53 4f 4e 2c 20 50 41 54 48 2c 20 56 41 4c 55  JSON, PATH, VALU
b510: 45 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 43 72  E, ...).**.** Cr
b520: 65 61 74 65 20 50 41 54 48 20 61 6e 64 20 69 6e  eate PATH and in
b530: 69 74 69 61 6c 69 7a 65 20 69 74 20 74 6f 20 56  itialize it to V
b540: 41 4c 55 45 2e 20 20 49 66 20 50 41 54 48 20 61  ALUE.  If PATH a
b550: 6c 72 65 61 64 79 20 65 78 69 73 74 73 2c 20 74  lready exists, t
b560: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  his.** routine i
b570: 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 4a  s a no-op.  If J
b580: 53 4f 4e 20 6f 72 20 50 41 54 48 20 69 73 20 6d  SON or PATH is m
b590: 61 6c 66 6f 72 6d 65 64 2c 20 74 68 72 6f 77 20  alformed, throw 
b5a0: 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61  an error..*/.sta
b5b0: 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 53 65 74  tic void jsonSet
b5c0: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
b5d0: 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 0a 20 20  context *ctx,.  
b5e0: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
b5f0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
b600: 0a 29 7b 0a 20 20 4a 73 6f 6e 50 61 72 73 65 20  .){.  JsonParse 
b610: 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  x;          /* T
b620: 68 65 20 70 61 72 73 65 20 2a 2f 0a 20 20 4a 73  he parse */.  Js
b630: 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 3b 0a 20  onNode *pNode;. 
b640: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
b650: 74 68 3b 0a 20 20 75 33 32 20 69 3b 0a 20 20 69  th;.  u32 i;.  i
b660: 6e 74 20 62 41 70 6e 64 3b 0a 20 20 69 6e 74 20  nt bApnd;.  int 
b670: 62 49 73 53 65 74 20 3d 20 2a 28 69 6e 74 2a 29  bIsSet = *(int*)
b680: 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
b690: 61 28 63 74 78 29 3b 0a 0a 20 20 69 66 28 20 61  a(ctx);..  if( a
b6a0: 72 67 63 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a  rgc<1 ) return;.
b6b0: 20 20 69 66 28 20 28 61 72 67 63 26 31 29 3d 3d    if( (argc&1)==
b6c0: 30 20 29 20 7b 0a 20 20 20 20 6a 73 6f 6e 57 72  0 ) {.    jsonWr
b6d0: 6f 6e 67 4e 75 6d 41 72 67 73 28 63 74 78 2c 20  ongNumArgs(ctx, 
b6e0: 62 49 73 53 65 74 20 3f 20 22 73 65 74 22 20 3a  bIsSet ? "set" :
b6f0: 20 22 69 6e 73 65 72 74 22 29 3b 0a 20 20 20 20   "insert");.    
b700: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
b710: 28 20 6a 73 6f 6e 50 61 72 73 65 28 26 78 2c 20  ( jsonParse(&x, 
b720: 63 74 78 2c 20 28 63 6f 6e 73 74 20 63 68 61 72  ctx, (const char
b730: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
b740: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 29 20 29  text(argv[0])) )
b750: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
b760: 74 28 20 78 2e 6e 4e 6f 64 65 20 29 3b 0a 20 20  t( x.nNode );.  
b770: 66 6f 72 28 69 3d 31 3b 20 69 3c 28 75 33 32 29  for(i=1; i<(u32)
b780: 61 72 67 63 3b 20 69 2b 3d 32 29 7b 0a 20 20 20  argc; i+=2){.   
b790: 20 7a 50 61 74 68 20 3d 20 28 63 6f 6e 73 74 20   zPath = (const 
b7a0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
b7b0: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 69 5d  lue_text(argv[i]
b7c0: 29 3b 0a 20 20 20 20 62 41 70 6e 64 20 3d 20 30  );.    bApnd = 0
b7d0: 3b 0a 20 20 20 20 70 4e 6f 64 65 20 3d 20 6a 73  ;.    pNode = js
b7e0: 6f 6e 4c 6f 6f 6b 75 70 28 26 78 2c 20 7a 50 61  onLookup(&x, zPa
b7f0: 74 68 2c 20 26 62 41 70 6e 64 2c 20 63 74 78 29  th, &bApnd, ctx)
b800: 3b 0a 20 20 20 20 69 66 28 20 78 2e 6f 6f 6d 20  ;.    if( x.oom 
b810: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
b820: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
b830: 6d 65 6d 28 63 74 78 29 3b 0a 20 20 20 20 20 20  mem(ctx);.      
b840: 67 6f 74 6f 20 6a 73 6f 6e 53 65 74 44 6f 6e 65  goto jsonSetDone
b850: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
b860: 78 2e 6e 45 72 72 20 29 7b 0a 20 20 20 20 20 20  x.nErr ){.      
b870: 67 6f 74 6f 20 6a 73 6f 6e 53 65 74 44 6f 6e 65  goto jsonSetDone
b880: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
b890: 70 4e 6f 64 65 20 26 26 20 28 62 41 70 6e 64 20  pNode && (bApnd 
b8a0: 7c 7c 20 62 49 73 53 65 74 29 20 29 7b 0a 20 20  || bIsSet) ){.  
b8b0: 20 20 20 20 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61      pNode->jnFla
b8c0: 67 73 20 7c 3d 20 28 75 38 29 4a 4e 4f 44 45 5f  gs |= (u8)JNODE_
b8d0: 52 45 50 4c 41 43 45 3b 0a 20 20 20 20 20 20 70  REPLACE;.      p
b8e0: 4e 6f 64 65 2d 3e 75 2e 69 52 65 70 6c 61 63 65  Node->u.iReplace
b8f0: 20 3d 20 69 20 2b 20 31 3b 0a 20 20 20 20 7d 0a   = i + 1;.    }.
b900: 20 20 7d 0a 20 20 69 66 28 20 78 2e 61 4e 6f 64    }.  if( x.aNod
b910: 65 5b 30 5d 2e 6a 6e 46 6c 61 67 73 20 26 20 4a  e[0].jnFlags & J
b920: 4e 4f 44 45 5f 52 45 50 4c 41 43 45 20 29 7b 0a  NODE_REPLACE ){.
b930: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
b940: 6c 74 5f 76 61 6c 75 65 28 63 74 78 2c 20 61 72  lt_value(ctx, ar
b950: 67 76 5b 78 2e 61 4e 6f 64 65 5b 30 5d 2e 75 2e  gv[x.aNode[0].u.
b960: 69 52 65 70 6c 61 63 65 5d 29 3b 0a 20 20 7d 65  iReplace]);.  }e
b970: 6c 73 65 7b 0a 20 20 20 20 6a 73 6f 6e 52 65 74  lse{.    jsonRet
b980: 75 72 6e 4a 73 6f 6e 28 78 2e 61 4e 6f 64 65 2c  urnJson(x.aNode,
b990: 20 63 74 78 2c 20 61 72 67 76 29 3b 0a 20 20 7d   ctx, argv);.  }
b9a0: 0a 6a 73 6f 6e 53 65 74 44 6f 6e 65 3a 0a 20 20  .jsonSetDone:.  
b9b0: 6a 73 6f 6e 50 61 72 73 65 52 65 73 65 74 28 26  jsonParseReset(&
b9c0: 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 6a 73 6f  x);.}../*.** jso
b9d0: 6e 5f 74 79 70 65 28 4a 53 4f 4e 29 0a 2a 2a 20  n_type(JSON).** 
b9e0: 6a 73 6f 6e 5f 74 79 70 65 28 4a 53 4f 4e 2c 20  json_type(JSON, 
b9f0: 50 41 54 48 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75  PATH).**.** Retu
ba00: 72 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c  rn the top-level
ba10: 20 22 74 79 70 65 22 20 6f 66 20 61 20 4a 53 4f   "type" of a JSO
ba20: 4e 20 73 74 72 69 6e 67 2e 20 20 54 68 72 6f 77  N string.  Throw
ba30: 20 61 6e 20 65 72 72 6f 72 20 69 66 0a 2a 2a 20   an error if.** 
ba40: 65 69 74 68 65 72 20 74 68 65 20 4a 53 4f 4e 20  either the JSON 
ba50: 6f 72 20 50 41 54 48 20 69 6e 70 75 74 73 20 61  or PATH inputs a
ba60: 72 65 20 6e 6f 74 20 77 65 6c 6c 2d 66 6f 72 6d  re not well-form
ba70: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
ba80: 69 64 20 6a 73 6f 6e 54 79 70 65 46 75 6e 63 28  id jsonTypeFunc(
ba90: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
baa0: 78 74 20 2a 63 74 78 2c 0a 20 20 69 6e 74 20 61  xt *ctx,.  int a
bab0: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
bac0: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
bad0: 20 4a 73 6f 6e 50 61 72 73 65 20 78 3b 20 20 20   JsonParse x;   
bae0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
baf0: 72 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  rse */.  const c
bb00: 68 61 72 20 2a 7a 50 61 74 68 3b 0a 20 20 4a 73  har *zPath;.  Js
bb10: 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 3b 0a 0a  onNode *pNode;..
bb20: 20 20 69 66 28 20 6a 73 6f 6e 50 61 72 73 65 28    if( jsonParse(
bb30: 26 78 2c 20 63 74 78 2c 20 28 63 6f 6e 73 74 20  &x, ctx, (const 
bb40: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
bb50: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
bb60: 29 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  )) ) return;.  a
bb70: 73 73 65 72 74 28 20 78 2e 6e 4e 6f 64 65 20 29  ssert( x.nNode )
bb80: 3b 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 32 20  ;.  if( argc==2 
bb90: 29 7b 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 28  ){.    zPath = (
bba0: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
bbb0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
bbc0: 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 70 4e 6f  rgv[1]);.    pNo
bbd0: 64 65 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 28  de = jsonLookup(
bbe0: 26 78 2c 20 7a 50 61 74 68 2c 20 30 2c 20 63 74  &x, zPath, 0, ct
bbf0: 78 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  x);.  }else{.   
bc00: 20 70 4e 6f 64 65 20 3d 20 78 2e 61 4e 6f 64 65   pNode = x.aNode
bc10: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 6f 64  ;.  }.  if( pNod
bc20: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
bc30: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 74 78  _result_text(ctx
bc40: 2c 20 6a 73 6f 6e 54 79 70 65 5b 70 4e 6f 64 65  , jsonType[pNode
bc50: 2d 3e 65 54 79 70 65 5d 2c 20 2d 31 2c 20 53 51  ->eType], -1, SQ
bc60: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
bc70: 7d 0a 20 20 6a 73 6f 6e 50 61 72 73 65 52 65 73  }.  jsonParseRes
bc80: 65 74 28 26 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  et(&x);.}../*.**
bc90: 20 6a 73 6f 6e 5f 76 61 6c 69 64 28 4a 53 4f 4e   json_valid(JSON
bca0: 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31  ).**.** Return 1
bcb0: 20 69 66 20 4a 53 4f 4e 20 69 73 20 61 20 77 65   if JSON is a we
bcc0: 6c 6c 2d 66 6f 72 6d 65 64 20 4a 53 4f 4e 20 73  ll-formed JSON s
bcd0: 74 72 69 6e 67 20 61 63 63 6f 72 64 69 6e 67 20  tring according 
bce0: 74 6f 20 52 46 43 2d 37 31 35 39 2e 0a 2a 2a 20  to RFC-7159..** 
bcf0: 52 65 74 75 72 6e 20 30 20 6f 74 68 65 72 77 69  Return 0 otherwi
bd00: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  se..*/.static vo
bd10: 69 64 20 6a 73 6f 6e 56 61 6c 69 64 46 75 6e 63  id jsonValidFunc
bd20: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
bd30: 65 78 74 20 2a 63 74 78 2c 0a 20 20 69 6e 74 20  ext *ctx,.  int 
bd40: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
bd50: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
bd60: 20 20 4a 73 6f 6e 50 61 72 73 65 20 78 3b 20 20    JsonParse x;  
bd70: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
bd80: 61 72 73 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  arse */.  int rc
bd90: 20 3d 20 30 3b 0a 0a 20 20 55 4e 55 53 45 44 5f   = 0;..  UNUSED_
bda0: 50 41 52 41 4d 28 61 72 67 63 29 3b 0a 20 20 69  PARAM(argc);.  i
bdb0: 66 28 20 6a 73 6f 6e 50 61 72 73 65 28 26 78 2c  f( jsonParse(&x,
bdc0: 20 30 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a   0, (const char*
bdd0: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
bde0: 65 78 74 28 61 72 67 76 5b 30 5d 29 29 3d 3d 30  ext(argv[0]))==0
bdf0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a   ){.    rc = 1;.
be00: 20 20 7d 0a 20 20 6a 73 6f 6e 50 61 72 73 65 52    }.  jsonParseR
be10: 65 73 65 74 28 26 78 29 3b 0a 20 20 73 71 6c 69  eset(&x);.  sqli
be20: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63  te3_result_int(c
be30: 74 78 2c 20 72 63 29 3b 0a 7d 0a 0a 0a 2f 2a 2a  tx, rc);.}.../**
be40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 41 67  **********.** Ag
be90: 67 72 65 67 61 74 65 20 53 51 4c 20 66 75 6e 63  gregate SQL func
bea0: 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tion implementat
beb0: 69 6f 6e 73 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ions.***********
bec0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bed0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bef0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bf00: 2a 2f 0a 2f 2a 0a 2a 2a 20 6a 73 6f 6e 5f 67 72  */./*.** json_gr
bf10: 6f 75 70 5f 61 72 72 61 79 28 56 41 4c 55 45 29  oup_array(VALUE)
bf20: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  .**.** Return a 
bf30: 4a 53 4f 4e 20 61 72 72 61 79 20 63 6f 6d 70 6f  JSON array compo
bf40: 73 65 64 20 6f 66 20 61 6c 6c 20 76 61 6c 75 65  sed of all value
bf50: 73 20 69 6e 20 74 68 65 20 61 67 67 72 65 67 61  s in the aggrega
bf60: 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  te..*/.static vo
bf70: 69 64 20 6a 73 6f 6e 41 72 72 61 79 53 74 65 70  id jsonArrayStep
bf80: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
bf90: 65 78 74 20 2a 63 74 78 2c 0a 20 20 69 6e 74 20  ext *ctx,.  int 
bfa0: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
bfb0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
bfc0: 20 20 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70 53    JsonString *pS
bfd0: 74 72 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  tr;.  UNUSED_PAR
bfe0: 41 4d 28 61 72 67 63 29 3b 0a 20 20 70 53 74 72  AM(argc);.  pStr
bff0: 20 3d 20 28 4a 73 6f 6e 53 74 72 69 6e 67 2a 29   = (JsonString*)
c000: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
c010: 65 5f 63 6f 6e 74 65 78 74 28 63 74 78 2c 20 73  e_context(ctx, s
c020: 69 7a 65 6f 66 28 2a 70 53 74 72 29 29 3b 0a 20  izeof(*pStr));. 
c030: 20 69 66 28 20 70 53 74 72 20 29 7b 0a 20 20 20   if( pStr ){.   
c040: 20 69 66 28 20 70 53 74 72 2d 3e 7a 42 75 66 3d   if( pStr->zBuf=
c050: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6a 73 6f 6e  =0 ){.      json
c060: 49 6e 69 74 28 70 53 74 72 2c 20 63 74 78 29 3b  Init(pStr, ctx);
c070: 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e  .      jsonAppen
c080: 64 43 68 61 72 28 70 53 74 72 2c 20 27 5b 27 29  dChar(pStr, '[')
c090: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c0a0: 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61     jsonAppendCha
c0b0: 72 28 70 53 74 72 2c 20 27 2c 27 29 3b 0a 20 20  r(pStr, ',');.  
c0c0: 20 20 20 20 70 53 74 72 2d 3e 70 43 74 78 20 3d      pStr->pCtx =
c0d0: 20 63 74 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20   ctx;.    }.    
c0e0: 6a 73 6f 6e 41 70 70 65 6e 64 56 61 6c 75 65 28  jsonAppendValue(
c0f0: 70 53 74 72 2c 20 61 72 67 76 5b 30 5d 29 3b 0a  pStr, argv[0]);.
c100: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
c110: 64 20 6a 73 6f 6e 41 72 72 61 79 46 69 6e 61 6c  d jsonArrayFinal
c120: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
c130: 20 2a 63 74 78 29 7b 0a 20 20 4a 73 6f 6e 53 74   *ctx){.  JsonSt
c140: 72 69 6e 67 20 2a 70 53 74 72 3b 0a 20 20 70 53  ring *pStr;.  pS
c150: 74 72 20 3d 20 28 4a 73 6f 6e 53 74 72 69 6e 67  tr = (JsonString
c160: 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  *)sqlite3_aggreg
c170: 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 74 78 2c  ate_context(ctx,
c180: 20 30 29 3b 0a 20 20 69 66 28 20 70 53 74 72 20   0);.  if( pStr 
c190: 29 7b 0a 20 20 20 20 70 53 74 72 2d 3e 70 43 74  ){.    pStr->pCt
c1a0: 78 20 3d 20 63 74 78 3b 0a 20 20 20 20 6a 73 6f  x = ctx;.    jso
c1b0: 6e 41 70 70 65 6e 64 43 68 61 72 28 70 53 74 72  nAppendChar(pStr
c1c0: 2c 20 27 5d 27 29 3b 0a 20 20 20 20 69 66 28 20  , ']');.    if( 
c1d0: 70 53 74 72 2d 3e 62 45 72 72 20 29 7b 0a 20 20  pStr->bErr ){.  
c1e0: 20 20 20 20 69 66 28 20 70 53 74 72 2d 3e 62 45      if( pStr->bE
c1f0: 72 72 3d 3d 31 20 29 20 73 71 6c 69 74 65 33 5f  rr==1 ) sqlite3_
c200: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d  result_error_nom
c210: 65 6d 28 63 74 78 29 3b 0a 20 20 20 20 20 20 61  em(ctx);.      a
c220: 73 73 65 72 74 28 20 70 53 74 72 2d 3e 62 53 74  ssert( pStr->bSt
c230: 61 74 69 63 20 29 3b 0a 20 20 20 20 7d 65 6c 73  atic );.    }els
c240: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
c250: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 74 78  _result_text(ctx
c260: 2c 20 70 53 74 72 2d 3e 7a 42 75 66 2c 20 70 53  , pStr->zBuf, pS
c270: 74 72 2d 3e 6e 55 73 65 64 2c 0a 20 20 20 20 20  tr->nUsed,.     
c280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c290: 20 20 20 20 20 70 53 74 72 2d 3e 62 53 74 61 74       pStr->bStat
c2a0: 69 63 20 3f 20 53 51 4c 49 54 45 5f 54 52 41 4e  ic ? SQLITE_TRAN
c2b0: 53 49 45 4e 54 20 3a 20 73 71 6c 69 74 65 33 5f  SIENT : sqlite3_
c2c0: 66 72 65 65 29 3b 0a 20 20 20 20 20 20 70 53 74  free);.      pSt
c2d0: 72 2d 3e 62 53 74 61 74 69 63 20 3d 20 31 3b 0a  r->bStatic = 1;.
c2e0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
c2f0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
c300: 74 5f 74 65 78 74 28 63 74 78 2c 20 22 5b 5d 22  t_text(ctx, "[]"
c310: 2c 20 32 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  , 2, SQLITE_STAT
c320: 49 43 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  IC);.  }.  sqlit
c330: 65 33 5f 72 65 73 75 6c 74 5f 73 75 62 74 79 70  e3_result_subtyp
c340: 65 28 63 74 78 2c 20 4a 53 4f 4e 5f 53 55 42 54  e(ctx, JSON_SUBT
c350: 59 50 45 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 6a  YPE);.}../*.** j
c360: 73 6f 6e 5f 67 72 6f 75 70 5f 6f 62 6a 28 4e 41  son_group_obj(NA
c370: 4d 45 2c 56 41 4c 55 45 29 0a 2a 2a 0a 2a 2a 20  ME,VALUE).**.** 
c380: 52 65 74 75 72 6e 20 61 20 4a 53 4f 4e 20 6f 62  Return a JSON ob
c390: 6a 65 63 74 20 63 6f 6d 70 6f 73 65 64 20 6f 66  ject composed of
c3a0: 20 61 6c 6c 20 6e 61 6d 65 73 20 61 6e 64 20 76   all names and v
c3b0: 61 6c 75 65 73 20 69 6e 20 74 68 65 20 61 67 67  alues in the agg
c3c0: 72 65 67 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  regate..*/.stati
c3d0: 63 20 76 6f 69 64 20 6a 73 6f 6e 4f 62 6a 65 63  c void jsonObjec
c3e0: 74 53 74 65 70 28 0a 20 20 73 71 6c 69 74 65 33  tStep(.  sqlite3
c3f0: 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 0a 20  _context *ctx,. 
c400: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
c410: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
c420: 76 0a 29 7b 0a 20 20 4a 73 6f 6e 53 74 72 69 6e  v.){.  JsonStrin
c430: 67 20 2a 70 53 74 72 3b 0a 20 20 63 6f 6e 73 74  g *pStr;.  const
c440: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 75 33 32 20   char *z;.  u32 
c450: 6e 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  n;.  UNUSED_PARA
c460: 4d 28 61 72 67 63 29 3b 0a 20 20 70 53 74 72 20  M(argc);.  pStr 
c470: 3d 20 28 4a 73 6f 6e 53 74 72 69 6e 67 2a 29 73  = (JsonString*)s
c480: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
c490: 5f 63 6f 6e 74 65 78 74 28 63 74 78 2c 20 73 69  _context(ctx, si
c4a0: 7a 65 6f 66 28 2a 70 53 74 72 29 29 3b 0a 20 20  zeof(*pStr));.  
c4b0: 69 66 28 20 70 53 74 72 20 29 7b 0a 20 20 20 20  if( pStr ){.    
c4c0: 69 66 28 20 70 53 74 72 2d 3e 7a 42 75 66 3d 3d  if( pStr->zBuf==
c4d0: 30 20 29 7b 0a 20 20 20 20 20 20 6a 73 6f 6e 49  0 ){.      jsonI
c4e0: 6e 69 74 28 70 53 74 72 2c 20 63 74 78 29 3b 0a  nit(pStr, ctx);.
c4f0: 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64        jsonAppend
c500: 43 68 61 72 28 70 53 74 72 2c 20 27 7b 27 29 3b  Char(pStr, '{');
c510: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
c520: 20 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61 72    jsonAppendChar
c530: 28 70 53 74 72 2c 20 27 2c 27 29 3b 0a 20 20 20  (pStr, ',');.   
c540: 20 20 20 70 53 74 72 2d 3e 70 43 74 78 20 3d 20     pStr->pCtx = 
c550: 63 74 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  ctx;.    }.    z
c560: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
c570: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
c580: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  xt(argv[0]);.   
c590: 20 6e 20 3d 20 28 75 33 32 29 73 71 6c 69 74 65   n = (u32)sqlite
c5a0: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72  3_value_bytes(ar
c5b0: 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6a 73 6f 6e  gv[0]);.    json
c5c0: 41 70 70 65 6e 64 53 74 72 69 6e 67 28 70 53 74  AppendString(pSt
c5d0: 72 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 6a 73  r, z, n);.    js
c5e0: 6f 6e 41 70 70 65 6e 64 43 68 61 72 28 70 53 74  onAppendChar(pSt
c5f0: 72 2c 20 27 3a 27 29 3b 0a 20 20 20 20 6a 73 6f  r, ':');.    jso
c600: 6e 41 70 70 65 6e 64 56 61 6c 75 65 28 70 53 74  nAppendValue(pSt
c610: 72 2c 20 61 72 67 76 5b 31 5d 29 3b 0a 20 20 7d  r, argv[1]);.  }
c620: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a  .}.static void j
c630: 73 6f 6e 4f 62 6a 65 63 74 46 69 6e 61 6c 28 73  sonObjectFinal(s
c640: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
c650: 63 74 78 29 7b 0a 20 20 4a 73 6f 6e 53 74 72 69  ctx){.  JsonStri
c660: 6e 67 20 2a 70 53 74 72 3b 0a 20 20 70 53 74 72  ng *pStr;.  pStr
c670: 20 3d 20 28 4a 73 6f 6e 53 74 72 69 6e 67 2a 29   = (JsonString*)
c680: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
c690: 65 5f 63 6f 6e 74 65 78 74 28 63 74 78 2c 20 30  e_context(ctx, 0
c6a0: 29 3b 0a 20 20 69 66 28 20 70 53 74 72 20 29 7b  );.  if( pStr ){
c6b0: 0a 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 43  .    jsonAppendC
c6c0: 68 61 72 28 70 53 74 72 2c 20 27 7d 27 29 3b 0a  har(pStr, '}');.
c6d0: 20 20 20 20 69 66 28 20 70 53 74 72 2d 3e 62 45      if( pStr->bE
c6e0: 72 72 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  rr ){.      if( 
c6f0: 70 53 74 72 2d 3e 62 45 72 72 3d 3d 31 20 29 20  pStr->bErr==1 ) 
c700: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
c710: 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 74 78 29 3b  rror_nomem(ctx);
c720: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
c730: 53 74 72 2d 3e 62 53 74 61 74 69 63 20 29 3b 0a  Str->bStatic );.
c740: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c750: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
c760: 74 65 78 74 28 63 74 78 2c 20 70 53 74 72 2d 3e  text(ctx, pStr->
c770: 7a 42 75 66 2c 20 70 53 74 72 2d 3e 6e 55 73 65  zBuf, pStr->nUse
c780: 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
c790: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53 74               pSt
c7a0: 72 2d 3e 62 53 74 61 74 69 63 20 3f 20 53 51 4c  r->bStatic ? SQL
c7b0: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 20 3a 20  ITE_TRANSIENT : 
c7c0: 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20  sqlite3_free);. 
c7d0: 20 20 20 20 20 70 53 74 72 2d 3e 62 53 74 61 74       pStr->bStat
c7e0: 69 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ic = 1;.    }.  
c7f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
c800: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
c810: 74 78 2c 20 22 7b 7d 22 2c 20 32 2c 20 53 51 4c  tx, "{}", 2, SQL
c820: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d  ITE_STATIC);.  }
c830: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
c840: 74 5f 73 75 62 74 79 70 65 28 63 74 78 2c 20 4a  t_subtype(ctx, J
c850: 53 4f 4e 5f 53 55 42 54 59 50 45 29 3b 0a 7d 0a  SON_SUBTYPE);.}.
c860: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
c870: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
c880: 4c 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  LE./************
c890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c8a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c8b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c8c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c8d0: 0a 2a 2a 20 54 68 65 20 6a 73 6f 6e 5f 65 61 63  .** The json_eac
c8e0: 68 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 0a  h virtual table.
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 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 74 79  ************/.ty
c940: 70 65 64 65 66 20 73 74 72 75 63 74 20 4a 73 6f  pedef struct Jso
c950: 6e 45 61 63 68 43 75 72 73 6f 72 20 4a 73 6f 6e  nEachCursor Json
c960: 45 61 63 68 43 75 72 73 6f 72 3b 0a 73 74 72 75  EachCursor;.stru
c970: 63 74 20 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f  ct JsonEachCurso
c980: 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  r {.  sqlite3_vt
c990: 61 62 5f 63 75 72 73 6f 72 20 62 61 73 65 3b 20  ab_cursor base; 
c9a0: 20 2f 2a 20 42 61 73 65 20 63 6c 61 73 73 20 2d   /* Base class -
c9b0: 20 6d 75 73 74 20 62 65 20 66 69 72 73 74 20 2a   must be first *
c9c0: 2f 0a 20 20 75 33 32 20 69 52 6f 77 69 64 3b 20  /.  u32 iRowid; 
c9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c9e0: 2a 20 54 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20  * The rowid */. 
c9f0: 20 75 33 32 20 69 42 65 67 69 6e 3b 20 20 20 20   u32 iBegin;    
ca00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
ca10: 68 65 20 66 69 72 73 74 20 6e 6f 64 65 20 6f 66  he first node of
ca20: 20 74 68 65 20 73 63 61 6e 20 2a 2f 0a 20 20 75   the scan */.  u
ca30: 33 32 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  32 i;           
ca40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
ca50: 65 78 20 69 6e 20 73 50 61 72 73 65 2e 61 4e 6f  ex in sParse.aNo
ca60: 64 65 5b 5d 20 6f 66 20 63 75 72 72 65 6e 74 20  de[] of current 
ca70: 72 6f 77 20 2a 2f 0a 20 20 75 33 32 20 69 45 6e  row */.  u32 iEn
ca80: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
ca90: 20 20 20 20 2f 2a 20 45 4f 46 20 77 68 65 6e 20      /* EOF when 
caa0: 69 20 65 71 75 61 6c 73 20 6f 72 20 65 78 63 65  i equals or exce
cab0: 65 64 73 20 74 68 69 73 20 76 61 6c 75 65 20 2a  eds this value *
cac0: 2f 0a 20 20 75 38 20 65 54 79 70 65 3b 20 20 20  /.  u8 eType;   
cad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cae0: 2a 20 54 79 70 65 20 6f 66 20 74 6f 70 2d 6c 65  * Type of top-le
caf0: 76 65 6c 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20  vel element */. 
cb00: 20 75 38 20 62 52 65 63 75 72 73 69 76 65 3b 20   u8 bRecursive; 
cb10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
cb20: 72 75 65 20 66 6f 72 20 6a 73 6f 6e 5f 74 72 65  rue for json_tre
cb30: 65 28 29 2e 20 20 46 61 6c 73 65 20 66 6f 72 20  e().  False for 
cb40: 6a 73 6f 6e 5f 65 61 63 68 28 29 20 2a 2f 0a 20  json_each() */. 
cb50: 20 63 68 61 72 20 2a 7a 4a 73 6f 6e 3b 20 20 20   char *zJson;   
cb60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
cb70: 6e 70 75 74 20 4a 53 4f 4e 20 2a 2f 0a 20 20 63  nput JSON */.  c
cb80: 68 61 72 20 2a 7a 52 6f 6f 74 3b 20 20 20 20 20  har *zRoot;     
cb90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74            /* Pat
cba0: 68 20 62 79 20 77 68 69 63 68 20 74 6f 20 66 69  h by which to fi
cbb0: 6c 74 65 72 20 7a 4a 73 6f 6e 20 2a 2f 0a 20 20  lter zJson */.  
cbc0: 4a 73 6f 6e 50 61 72 73 65 20 73 50 61 72 73 65  JsonParse sParse
cbd0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ;          /* Pa
cbe0: 72 73 65 20 6f 66 20 74 68 65 20 69 6e 70 75 74  rse of the input
cbf0: 20 4a 53 4f 4e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20   JSON */.};../* 
cc00: 43 6f 6e 73 74 72 75 63 74 6f 72 20 66 6f 72 20  Constructor for 
cc10: 74 68 65 20 6a 73 6f 6e 5f 65 61 63 68 20 76 69  the json_each vi
cc20: 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 73  rtual table */.s
cc30: 74 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e 45 61  tatic int jsonEa
cc40: 63 68 43 6f 6e 6e 65 63 74 28 0a 20 20 73 71 6c  chConnect(.  sql
cc50: 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64  ite3 *db,.  void
cc60: 20 2a 70 41 75 78 2c 0a 20 20 69 6e 74 20 61 72   *pAux,.  int ar
cc70: 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  gc, const char *
cc80: 63 6f 6e 73 74 2a 61 72 67 76 2c 0a 20 20 73 71  const*argv,.  sq
cc90: 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a 70 70 56  lite3_vtab **ppV
cca0: 74 61 62 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a  tab,.  char **pz
ccb0: 45 72 72 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  Err.){.  sqlite3
ccc0: 5f 76 74 61 62 20 2a 70 4e 65 77 3b 0a 20 20 69  _vtab *pNew;.  i
ccd0: 6e 74 20 72 63 3b 0a 0a 2f 2a 20 43 6f 6c 75 6d  nt rc;../* Colum
cce0: 6e 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 23 64 65  n numbers */.#de
ccf0: 66 69 6e 65 20 4a 45 41 43 48 5f 4b 45 59 20 20  fine JEACH_KEY  
cd00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 4a 45 41     0.#define JEA
cd10: 43 48 5f 56 41 4c 55 45 20 20 20 31 0a 23 64 65  CH_VALUE   1.#de
cd20: 66 69 6e 65 20 4a 45 41 43 48 5f 54 59 50 45 20  fine JEACH_TYPE 
cd30: 20 20 20 32 0a 23 64 65 66 69 6e 65 20 4a 45 41     2.#define JEA
cd40: 43 48 5f 41 54 4f 4d 20 20 20 20 33 0a 23 64 65  CH_ATOM    3.#de
cd50: 66 69 6e 65 20 4a 45 41 43 48 5f 49 44 20 20 20  fine JEACH_ID   
cd60: 20 20 20 34 0a 23 64 65 66 69 6e 65 20 4a 45 41     4.#define JEA
cd70: 43 48 5f 50 41 52 45 4e 54 20 20 35 0a 23 64 65  CH_PARENT  5.#de
cd80: 66 69 6e 65 20 4a 45 41 43 48 5f 46 55 4c 4c 4b  fine JEACH_FULLK
cd90: 45 59 20 36 0a 23 64 65 66 69 6e 65 20 4a 45 41  EY 6.#define JEA
cda0: 43 48 5f 50 41 54 48 20 20 20 20 37 0a 23 64 65  CH_PATH    7.#de
cdb0: 66 69 6e 65 20 4a 45 41 43 48 5f 4a 53 4f 4e 20  fine JEACH_JSON 
cdc0: 20 20 20 38 0a 23 64 65 66 69 6e 65 20 4a 45 41     8.#define JEA
cdd0: 43 48 5f 52 4f 4f 54 20 20 20 20 39 0a 0a 20 20  CH_ROOT    9..  
cde0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 70 7a 45  UNUSED_PARAM(pzE
cdf0: 72 72 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  rr);.  UNUSED_PA
ce00: 52 41 4d 28 61 72 67 76 29 3b 0a 20 20 55 4e 55  RAM(argv);.  UNU
ce10: 53 45 44 5f 50 41 52 41 4d 28 61 72 67 63 29 3b  SED_PARAM(argc);
ce20: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28  .  UNUSED_PARAM(
ce30: 70 41 75 78 29 3b 0a 20 20 72 63 20 3d 20 73 71  pAux);.  rc = sq
ce40: 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74  lite3_declare_vt
ce50: 61 62 28 64 62 2c 20 0a 20 20 20 20 20 22 43 52  ab(db, .     "CR
ce60: 45 41 54 45 20 54 41 42 4c 45 20 78 28 6b 65 79  EATE TABLE x(key
ce70: 2c 76 61 6c 75 65 2c 74 79 70 65 2c 61 74 6f 6d  ,value,type,atom
ce80: 2c 69 64 2c 70 61 72 65 6e 74 2c 66 75 6c 6c 6b  ,id,parent,fullk
ce90: 65 79 2c 70 61 74 68 2c 22 0a 20 20 20 20 20 20  ey,path,".      
cea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 6a                "j
ceb0: 73 6f 6e 20 48 49 44 44 45 4e 2c 72 6f 6f 74 20  son HIDDEN,root 
cec0: 48 49 44 44 45 4e 29 22 29 3b 0a 20 20 69 66 28  HIDDEN)");.  if(
ced0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
cee0: 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 2a 70 70  {.    pNew = *pp
cef0: 56 74 61 62 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Vtab = sqlite3_m
cf00: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
cf10: 4e 65 77 29 20 29 3b 0a 20 20 20 20 69 66 28 20  New) );.    if( 
cf20: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
cf30: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
cf40: 20 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20     memset(pNew, 
cf50: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  0, sizeof(*pNew)
cf60: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
cf70: 72 63 3b 0a 7d 0a 0a 2f 2a 20 64 65 73 74 72 75  rc;.}../* destru
cf80: 63 74 6f 72 20 66 6f 72 20 6a 73 6f 6e 5f 65 61  ctor for json_ea
cf90: 63 68 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ch virtual table
cfa0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a   */.static int j
cfb0: 73 6f 6e 45 61 63 68 44 69 73 63 6f 6e 6e 65 63  sonEachDisconnec
cfc0: 74 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a  t(sqlite3_vtab *
cfd0: 70 56 74 61 62 29 7b 0a 20 20 73 71 6c 69 74 65  pVtab){.  sqlite
cfe0: 33 5f 66 72 65 65 28 70 56 74 61 62 29 3b 0a 20  3_free(pVtab);. 
cff0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d000: 4b 3b 0a 7d 0a 0a 2f 2a 20 63 6f 6e 73 74 72 75  K;.}../* constru
d010: 63 74 6f 72 20 66 6f 72 20 61 20 4a 73 6f 6e 45  ctor for a JsonE
d020: 61 63 68 43 75 72 73 6f 72 20 6f 62 6a 65 63 74  achCursor object
d030: 20 66 6f 72 20 6a 73 6f 6e 5f 65 61 63 68 28 29   for json_each()
d040: 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
d050: 6a 73 6f 6e 45 61 63 68 4f 70 65 6e 45 61 63 68  jsonEachOpenEach
d060: 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70  (sqlite3_vtab *p
d070: 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63  , sqlite3_vtab_c
d080: 75 72 73 6f 72 20 2a 2a 70 70 43 75 72 73 6f 72  ursor **ppCursor
d090: 29 7b 0a 20 20 4a 73 6f 6e 45 61 63 68 43 75 72  ){.  JsonEachCur
d0a0: 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 55 4e  sor *pCur;..  UN
d0b0: 55 53 45 44 5f 50 41 52 41 4d 28 70 29 3b 0a 20  USED_PARAM(p);. 
d0c0: 20 70 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f   pCur = sqlite3_
d0d0: 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  malloc( sizeof(*
d0e0: 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70  pCur) );.  if( p
d0f0: 43 75 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Cur==0 ) return 
d100: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
d110: 6d 65 6d 73 65 74 28 70 43 75 72 2c 20 30 2c 20  memset(pCur, 0, 
d120: 73 69 7a 65 6f 66 28 2a 70 43 75 72 29 29 3b 0a  sizeof(*pCur));.
d130: 20 20 2a 70 70 43 75 72 73 6f 72 20 3d 20 26 70    *ppCursor = &p
d140: 43 75 72 2d 3e 62 61 73 65 3b 0a 20 20 72 65 74  Cur->base;.  ret
d150: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
d160: 0a 0a 2f 2a 20 63 6f 6e 73 74 72 75 63 74 6f 72  ../* constructor
d170: 20 66 6f 72 20 61 20 4a 73 6f 6e 45 61 63 68 43   for a JsonEachC
d180: 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 66 6f 72  ursor object for
d190: 20 6a 73 6f 6e 5f 74 72 65 65 28 29 2e 20 2a 2f   json_tree(). */
d1a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e  .static int json
d1b0: 45 61 63 68 4f 70 65 6e 54 72 65 65 28 73 71 6c  EachOpenTree(sql
d1c0: 69 74 65 33 5f 76 74 61 62 20 2a 70 2c 20 73 71  ite3_vtab *p, sq
d1d0: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
d1e0: 72 20 2a 2a 70 70 43 75 72 73 6f 72 29 7b 0a 20  r **ppCursor){. 
d1f0: 20 69 6e 74 20 72 63 20 3d 20 6a 73 6f 6e 45 61   int rc = jsonEa
d200: 63 68 4f 70 65 6e 45 61 63 68 28 70 2c 20 70 70  chOpenEach(p, pp
d210: 43 75 72 73 6f 72 29 3b 0a 20 20 69 66 28 20 72  Cursor);.  if( r
d220: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
d230: 20 20 20 20 4a 73 6f 6e 45 61 63 68 43 75 72 73      JsonEachCurs
d240: 6f 72 20 2a 70 43 75 72 20 3d 20 28 4a 73 6f 6e  or *pCur = (Json
d250: 45 61 63 68 43 75 72 73 6f 72 2a 29 2a 70 70 43  EachCursor*)*ppC
d260: 75 72 73 6f 72 3b 0a 20 20 20 20 70 43 75 72 2d  ursor;.    pCur-
d270: 3e 62 52 65 63 75 72 73 69 76 65 20 3d 20 31 3b  >bRecursive = 1;
d280: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
d290: 3b 0a 7d 0a 0a 2f 2a 20 52 65 73 65 74 20 61 20  ;.}../* Reset a 
d2a0: 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 20 62  JsonEachCursor b
d2b0: 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ack to its origi
d2c0: 6e 61 6c 20 73 74 61 74 65 2e 20 20 46 72 65 65  nal state.  Free
d2d0: 20 61 6e 79 20 6d 65 6d 6f 72 79 0a 2a 2a 20 68   any memory.** h
d2e0: 65 6c 64 2e 20 2a 2f 0a 73 74 61 74 69 63 20 76  eld. */.static v
d2f0: 6f 69 64 20 6a 73 6f 6e 45 61 63 68 43 75 72 73  oid jsonEachCurs
d300: 6f 72 52 65 73 65 74 28 4a 73 6f 6e 45 61 63 68  orReset(JsonEach
d310: 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 73 71  Cursor *p){.  sq
d320: 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 4a  lite3_free(p->zJ
d330: 73 6f 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  son);.  sqlite3_
d340: 66 72 65 65 28 70 2d 3e 7a 52 6f 6f 74 29 3b 0a  free(p->zRoot);.
d350: 20 20 6a 73 6f 6e 50 61 72 73 65 52 65 73 65 74    jsonParseReset
d360: 28 26 70 2d 3e 73 50 61 72 73 65 29 3b 0a 20 20  (&p->sParse);.  
d370: 70 2d 3e 69 52 6f 77 69 64 20 3d 20 30 3b 0a 20  p->iRowid = 0;. 
d380: 20 70 2d 3e 69 20 3d 20 30 3b 0a 20 20 70 2d 3e   p->i = 0;.  p->
d390: 69 45 6e 64 20 3d 20 30 3b 0a 20 20 70 2d 3e 65  iEnd = 0;.  p->e
d3a0: 54 79 70 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 7a  Type = 0;.  p->z
d3b0: 4a 73 6f 6e 20 3d 20 30 3b 0a 20 20 70 2d 3e 7a  Json = 0;.  p->z
d3c0: 52 6f 6f 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 20  Root = 0;.}../* 
d3d0: 44 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 61  Destructor for a
d3e0: 20 6a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 20   jsonEachCursor 
d3f0: 6f 62 6a 65 63 74 20 2a 2f 0a 73 74 61 74 69 63  object */.static
d400: 20 69 6e 74 20 6a 73 6f 6e 45 61 63 68 43 6c 6f   int jsonEachClo
d410: 73 65 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  se(sqlite3_vtab_
d420: 63 75 72 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20  cursor *cur){.  
d430: 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 20 2a  JsonEachCursor *
d440: 70 20 3d 20 28 4a 73 6f 6e 45 61 63 68 43 75 72  p = (JsonEachCur
d450: 73 6f 72 2a 29 63 75 72 3b 0a 20 20 6a 73 6f 6e  sor*)cur;.  json
d460: 45 61 63 68 43 75 72 73 6f 72 52 65 73 65 74 28  EachCursorReset(
d470: 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  p);.  sqlite3_fr
d480: 65 65 28 63 75 72 29 3b 0a 20 20 72 65 74 75 72  ee(cur);.  retur
d490: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
d4a0: 2f 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  /* Return TRUE i
d4b0: 66 20 74 68 65 20 6a 73 6f 6e 45 61 63 68 43 75  f the jsonEachCu
d4c0: 72 73 6f 72 20 6f 62 6a 65 63 74 20 68 61 73 20  rsor object has 
d4d0: 62 65 65 6e 20 61 64 76 61 6e 63 65 64 20 6f 66  been advanced of
d4e0: 66 20 74 68 65 20 65 6e 64 0a 2a 2a 20 6f 66 20  f the end.** of 
d4f0: 74 68 65 20 4a 53 4f 4e 20 6f 62 6a 65 63 74 20  the JSON object 
d500: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 73  */.static int js
d510: 6f 6e 45 61 63 68 45 6f 66 28 73 71 6c 69 74 65  onEachEof(sqlite
d520: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63  3_vtab_cursor *c
d530: 75 72 29 7b 0a 20 20 4a 73 6f 6e 45 61 63 68 43  ur){.  JsonEachC
d540: 75 72 73 6f 72 20 2a 70 20 3d 20 28 4a 73 6f 6e  ursor *p = (Json
d550: 45 61 63 68 43 75 72 73 6f 72 2a 29 63 75 72 3b  EachCursor*)cur;
d560: 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 20 3e  .  return p->i >
d570: 3d 20 70 2d 3e 69 45 6e 64 3b 0a 7d 0a 0a 2f 2a  = p->iEnd;.}../*
d580: 20 41 64 76 61 6e 63 65 20 74 68 65 20 63 75 72   Advance the cur
d590: 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20  sor to the next 
d5a0: 65 6c 65 6d 65 6e 74 20 66 6f 72 20 6a 73 6f 6e  element for json
d5b0: 5f 74 72 65 65 28 29 20 2a 2f 0a 73 74 61 74 69  _tree() */.stati
d5c0: 63 20 69 6e 74 20 6a 73 6f 6e 45 61 63 68 4e 65  c int jsonEachNe
d5d0: 78 74 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  xt(sqlite3_vtab_
d5e0: 63 75 72 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20  cursor *cur){.  
d5f0: 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 20 2a  JsonEachCursor *
d600: 70 20 3d 20 28 4a 73 6f 6e 45 61 63 68 43 75 72  p = (JsonEachCur
d610: 73 6f 72 2a 29 63 75 72 3b 0a 20 20 69 66 28 20  sor*)cur;.  if( 
d620: 70 2d 3e 62 52 65 63 75 72 73 69 76 65 20 29 7b  p->bRecursive ){
d630: 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 50 61 72  .    if( p->sPar
d640: 73 65 2e 61 4e 6f 64 65 5b 70 2d 3e 69 5d 2e 6a  se.aNode[p->i].j
d650: 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 4c  nFlags & JNODE_L
d660: 41 42 45 4c 20 29 20 70 2d 3e 69 2b 2b 3b 0a 20  ABEL ) p->i++;. 
d670: 20 20 20 70 2d 3e 69 2b 2b 3b 0a 20 20 20 20 70     p->i++;.    p
d680: 2d 3e 69 52 6f 77 69 64 2b 2b 3b 0a 20 20 20 20  ->iRowid++;.    
d690: 69 66 28 20 70 2d 3e 69 3c 70 2d 3e 69 45 6e 64  if( p->i<p->iEnd
d6a0: 20 29 7b 0a 20 20 20 20 20 20 75 33 32 20 69 55   ){.      u32 iU
d6b0: 70 20 3d 20 70 2d 3e 73 50 61 72 73 65 2e 61 55  p = p->sParse.aU
d6c0: 70 5b 70 2d 3e 69 5d 3b 0a 20 20 20 20 20 20 4a  p[p->i];.      J
d6d0: 73 6f 6e 4e 6f 64 65 20 2a 70 55 70 20 3d 20 26  sonNode *pUp = &
d6e0: 70 2d 3e 73 50 61 72 73 65 2e 61 4e 6f 64 65 5b  p->sParse.aNode[
d6f0: 69 55 70 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 65  iUp];.      p->e
d700: 54 79 70 65 20 3d 20 70 55 70 2d 3e 65 54 79 70  Type = pUp->eTyp
d710: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 55 70  e;.      if( pUp
d720: 2d 3e 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f 41 52  ->eType==JSON_AR
d730: 52 41 59 20 29 7b 0a 20 20 20 20 20 20 20 20 69  RAY ){.        i
d740: 66 28 20 69 55 70 3d 3d 70 2d 3e 69 2d 31 20 29  f( iUp==p->i-1 )
d750: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 55 70 2d  {.          pUp-
d760: 3e 75 2e 69 4b 65 79 20 3d 20 30 3b 0a 20 20 20  >u.iKey = 0;.   
d770: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d780: 20 20 20 20 20 20 70 55 70 2d 3e 75 2e 69 4b 65        pUp->u.iKe
d790: 79 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  y++;.        }. 
d7a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
d7b0: 65 6c 73 65 7b 0a 20 20 20 20 73 77 69 74 63 68  else{.    switch
d7c0: 28 20 70 2d 3e 65 54 79 70 65 20 29 7b 0a 20 20  ( p->eType ){.  
d7d0: 20 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f 41 52      case JSON_AR
d7e0: 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 20 20 70  RAY: {.        p
d7f0: 2d 3e 69 20 2b 3d 20 6a 73 6f 6e 4e 6f 64 65 53  ->i += jsonNodeS
d800: 69 7a 65 28 26 70 2d 3e 73 50 61 72 73 65 2e 61  ize(&p->sParse.a
d810: 4e 6f 64 65 5b 70 2d 3e 69 5d 29 3b 0a 20 20 20  Node[p->i]);.   
d820: 20 20 20 20 20 70 2d 3e 69 52 6f 77 69 64 2b 2b       p->iRowid++
d830: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
d840: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
d850: 61 73 65 20 4a 53 4f 4e 5f 4f 42 4a 45 43 54 3a  ase JSON_OBJECT:
d860: 20 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 20   {.        p->i 
d870: 2b 3d 20 31 20 2b 20 6a 73 6f 6e 4e 6f 64 65 53  += 1 + jsonNodeS
d880: 69 7a 65 28 26 70 2d 3e 73 50 61 72 73 65 2e 61  ize(&p->sParse.a
d890: 4e 6f 64 65 5b 70 2d 3e 69 2b 31 5d 29 3b 0a 20  Node[p->i+1]);. 
d8a0: 20 20 20 20 20 20 20 70 2d 3e 69 52 6f 77 69 64         p->iRowid
d8b0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ++;.        brea
d8c0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
d8d0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
d8e0: 20 20 20 20 70 2d 3e 69 20 3d 20 70 2d 3e 69 45      p->i = p->iE
d8f0: 6e 64 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  nd;.        brea
d900: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
d910: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
d920: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 41  LITE_OK;.}../* A
d930: 70 70 65 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f  ppend the name o
d940: 66 20 74 68 65 20 70 61 74 68 20 66 6f 72 20 65  f the path for e
d950: 6c 65 6d 65 6e 74 20 69 20 74 6f 20 70 53 74 72  lement i to pStr
d960: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
d970: 6a 73 6f 6e 45 61 63 68 43 6f 6d 70 75 74 65 50  jsonEachComputeP
d980: 61 74 68 28 0a 20 20 4a 73 6f 6e 45 61 63 68 43  ath(.  JsonEachC
d990: 75 72 73 6f 72 20 2a 70 2c 20 20 20 20 20 20 20  ursor *p,       
d9a0: 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 2a 2f  /* The cursor */
d9b0: 0a 20 20 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70  .  JsonString *p
d9c0: 53 74 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 57  Str,        /* W
d9d0: 72 69 74 65 20 74 68 65 20 70 61 74 68 20 68 65  rite the path he
d9e0: 72 65 20 2a 2f 0a 20 20 75 33 32 20 69 20 20 20  re */.  u32 i   
d9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da00: 20 2f 2a 20 50 61 74 68 20 74 6f 20 74 68 69 73   /* Path to this
da10: 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20   element */.){. 
da20: 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65   JsonNode *pNode
da30: 2c 20 2a 70 55 70 3b 0a 20 20 75 33 32 20 69 55  , *pUp;.  u32 iU
da40: 70 3b 0a 20 20 69 66 28 20 69 3d 3d 30 20 29 7b  p;.  if( i==0 ){
da50: 0a 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 43  .    jsonAppendC
da60: 68 61 72 28 70 53 74 72 2c 20 27 24 27 29 3b 0a  har(pStr, '$');.
da70: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
da80: 20 20 69 55 70 20 3d 20 70 2d 3e 73 50 61 72 73    iUp = p->sPars
da90: 65 2e 61 55 70 5b 69 5d 3b 0a 20 20 6a 73 6f 6e  e.aUp[i];.  json
daa0: 45 61 63 68 43 6f 6d 70 75 74 65 50 61 74 68 28  EachComputePath(
dab0: 70 2c 20 70 53 74 72 2c 20 69 55 70 29 3b 0a 20  p, pStr, iUp);. 
dac0: 20 70 4e 6f 64 65 20 3d 20 26 70 2d 3e 73 50 61   pNode = &p->sPa
dad0: 72 73 65 2e 61 4e 6f 64 65 5b 69 5d 3b 0a 20 20  rse.aNode[i];.  
dae0: 70 55 70 20 3d 20 26 70 2d 3e 73 50 61 72 73 65  pUp = &p->sParse
daf0: 2e 61 4e 6f 64 65 5b 69 55 70 5d 3b 0a 20 20 69  .aNode[iUp];.  i
db00: 66 28 20 70 55 70 2d 3e 65 54 79 70 65 3d 3d 4a  f( pUp->eType==J
db10: 53 4f 4e 5f 41 52 52 41 59 20 29 7b 0a 20 20 20  SON_ARRAY ){.   
db20: 20 6a 73 6f 6e 50 72 69 6e 74 66 28 33 30 2c 20   jsonPrintf(30, 
db30: 70 53 74 72 2c 20 22 5b 25 64 5d 22 2c 20 70 55  pStr, "[%d]", pU
db40: 70 2d 3e 75 2e 69 4b 65 79 29 3b 0a 20 20 7d 65  p->u.iKey);.  }e
db50: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
db60: 20 70 55 70 2d 3e 65 54 79 70 65 3d 3d 4a 53 4f   pUp->eType==JSO
db70: 4e 5f 4f 42 4a 45 43 54 20 29 3b 0a 20 20 20 20  N_OBJECT );.    
db80: 69 66 28 20 28 70 4e 6f 64 65 2d 3e 6a 6e 46 6c  if( (pNode->jnFl
db90: 61 67 73 20 26 20 4a 4e 4f 44 45 5f 4c 41 42 45  ags & JNODE_LABE
dba0: 4c 29 3d 3d 30 20 29 20 70 4e 6f 64 65 2d 2d 3b  L)==0 ) pNode--;
dbb0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 6f  .    assert( pNo
dbc0: 64 65 2d 3e 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f  de->eType==JSON_
dbd0: 53 54 52 49 4e 47 20 29 3b 0a 20 20 20 20 61 73  STRING );.    as
dbe0: 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e 6a 6e 46  sert( pNode->jnF
dbf0: 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 4c 41 42  lags & JNODE_LAB
dc00: 45 4c 20 29 3b 0a 20 20 20 20 6a 73 6f 6e 50 72  EL );.    jsonPr
dc10: 69 6e 74 66 28 70 4e 6f 64 65 2d 3e 6e 2b 31 2c  intf(pNode->n+1,
dc20: 20 70 53 74 72 2c 20 22 2e 25 2e 2a 73 22 2c 20   pStr, ".%.*s", 
dc30: 70 4e 6f 64 65 2d 3e 6e 2d 32 2c 20 70 4e 6f 64  pNode->n-2, pNod
dc40: 65 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 2b 31  e->u.zJContent+1
dc50: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 65 74  );.  }.}../* Ret
dc60: 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  urn the value of
dc70: 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 73 74 61   a column */.sta
dc80: 74 69 63 20 69 6e 74 20 6a 73 6f 6e 45 61 63 68  tic int jsonEach
dc90: 43 6f 6c 75 6d 6e 28 0a 20 20 73 71 6c 69 74 65  Column(.  sqlite
dca0: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63  3_vtab_cursor *c
dcb0: 75 72 2c 20 20 20 2f 2a 20 54 68 65 20 63 75 72  ur,   /* The cur
dcc0: 73 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  sor */.  sqlite3
dcd0: 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20 20  _context *ctx,  
dce0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
dcf0: 67 75 6d 65 6e 74 20 74 6f 20 73 71 6c 69 74 65  gument to sqlite
dd00: 33 5f 72 65 73 75 6c 74 5f 2e 2e 2e 28 29 20 2a  3_result_...() *
dd10: 2f 0a 20 20 69 6e 74 20 69 20 20 20 20 20 20 20  /.  int i       
dd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd30: 2f 2a 20 57 68 69 63 68 20 63 6f 6c 75 6d 6e 20  /* Which column 
dd40: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 29 7b 0a  to return */.){.
dd50: 20 20 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72    JsonEachCursor
dd60: 20 2a 70 20 3d 20 28 4a 73 6f 6e 45 61 63 68 43   *p = (JsonEachC
dd70: 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20 20 4a 73  ursor*)cur;.  Js
dd80: 6f 6e 4e 6f 64 65 20 2a 70 54 68 69 73 20 3d 20  onNode *pThis = 
dd90: 26 70 2d 3e 73 50 61 72 73 65 2e 61 4e 6f 64 65  &p->sParse.aNode
dda0: 5b 70 2d 3e 69 5d 3b 0a 20 20 73 77 69 74 63 68  [p->i];.  switch
ddb0: 28 20 69 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ( i ){.    case 
ddc0: 4a 45 41 43 48 5f 4b 45 59 3a 20 7b 0a 20 20 20  JEACH_KEY: {.   
ddd0: 20 20 20 69 66 28 20 70 2d 3e 69 3d 3d 30 20 29     if( p->i==0 )
dde0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
ddf0: 28 20 70 2d 3e 65 54 79 70 65 3d 3d 4a 53 4f 4e  ( p->eType==JSON
de00: 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 20  _OBJECT ){.     
de10: 20 20 20 6a 73 6f 6e 52 65 74 75 72 6e 28 70 54     jsonReturn(pT
de20: 68 69 73 2c 20 63 74 78 2c 20 30 29 3b 0a 20 20  his, ctx, 0);.  
de30: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
de40: 3e 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f 41 52 52  >eType==JSON_ARR
de50: 41 59 20 29 7b 0a 20 20 20 20 20 20 20 20 75 33  AY ){.        u3
de60: 32 20 69 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  2 iKey;.        
de70: 69 66 28 20 70 2d 3e 62 52 65 63 75 72 73 69 76  if( p->bRecursiv
de80: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  e ){.          i
de90: 66 28 20 70 2d 3e 69 52 6f 77 69 64 3d 3d 30 20  f( p->iRowid==0 
dea0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
deb0: 20 20 20 69 4b 65 79 20 3d 20 70 2d 3e 73 50 61     iKey = p->sPa
dec0: 72 73 65 2e 61 4e 6f 64 65 5b 70 2d 3e 73 50 61  rse.aNode[p->sPa
ded0: 72 73 65 2e 61 55 70 5b 70 2d 3e 69 5d 5d 2e 75  rse.aUp[p->i]].u
dee0: 2e 69 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 7d  .iKey;.        }
def0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
df00: 69 4b 65 79 20 3d 20 70 2d 3e 69 52 6f 77 69 64  iKey = p->iRowid
df10: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
df20: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
df30: 6c 74 5f 69 6e 74 36 34 28 63 74 78 2c 20 28 73  lt_int64(ctx, (s
df40: 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 69 4b 65  qlite3_int64)iKe
df50: 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  y);.      }.    
df60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
df70: 20 20 20 63 61 73 65 20 4a 45 41 43 48 5f 56 41     case JEACH_VA
df80: 4c 55 45 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  LUE: {.      if(
df90: 20 70 54 68 69 73 2d 3e 6a 6e 46 6c 61 67 73 20   pThis->jnFlags 
dfa0: 26 20 4a 4e 4f 44 45 5f 4c 41 42 45 4c 20 29 20  & JNODE_LABEL ) 
dfb0: 70 54 68 69 73 2b 2b 3b 0a 20 20 20 20 20 20 6a  pThis++;.      j
dfc0: 73 6f 6e 52 65 74 75 72 6e 28 70 54 68 69 73 2c  sonReturn(pThis,
dfd0: 20 63 74 78 2c 20 30 29 3b 0a 20 20 20 20 20 20   ctx, 0);.      
dfe0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
dff0: 20 63 61 73 65 20 4a 45 41 43 48 5f 54 59 50 45   case JEACH_TYPE
e000: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54  : {.      if( pT
e010: 68 69 73 2d 3e 6a 6e 46 6c 61 67 73 20 26 20 4a  his->jnFlags & J
e020: 4e 4f 44 45 5f 4c 41 42 45 4c 20 29 20 70 54 68  NODE_LABEL ) pTh
e030: 69 73 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69  is++;.      sqli
e040: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
e050: 63 74 78 2c 20 6a 73 6f 6e 54 79 70 65 5b 70 54  ctx, jsonType[pT
e060: 68 69 73 2d 3e 65 54 79 70 65 5d 2c 20 2d 31 2c  his->eType], -1,
e070: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
e080: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
e090: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 45 41    }.    case JEA
e0a0: 43 48 5f 41 54 4f 4d 3a 20 7b 0a 20 20 20 20 20  CH_ATOM: {.     
e0b0: 20 69 66 28 20 70 54 68 69 73 2d 3e 6a 6e 46 6c   if( pThis->jnFl
e0c0: 61 67 73 20 26 20 4a 4e 4f 44 45 5f 4c 41 42 45  ags & JNODE_LABE
e0d0: 4c 20 29 20 70 54 68 69 73 2b 2b 3b 0a 20 20 20  L ) pThis++;.   
e0e0: 20 20 20 69 66 28 20 70 54 68 69 73 2d 3e 65 54     if( pThis->eT
e0f0: 79 70 65 3e 3d 4a 53 4f 4e 5f 41 52 52 41 59 20  ype>=JSON_ARRAY 
e100: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 6a  ) break;.      j
e110: 73 6f 6e 52 65 74 75 72 6e 28 70 54 68 69 73 2c  sonReturn(pThis,
e120: 20 63 74 78 2c 20 30 29 3b 0a 20 20 20 20 20 20   ctx, 0);.      
e130: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
e140: 20 63 61 73 65 20 4a 45 41 43 48 5f 49 44 3a 20   case JEACH_ID: 
e150: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
e160: 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 74 78  result_int64(ctx
e170: 2c 20 0a 20 20 20 20 20 20 20 20 20 28 73 71 6c  , .         (sql
e180: 69 74 65 33 5f 69 6e 74 36 34 29 70 2d 3e 69 20  ite3_int64)p->i 
e190: 2b 20 28 28 70 54 68 69 73 2d 3e 6a 6e 46 6c 61  + ((pThis->jnFla
e1a0: 67 73 20 26 20 4a 4e 4f 44 45 5f 4c 41 42 45 4c  gs & JNODE_LABEL
e1b0: 29 21 3d 30 29 29 3b 0a 20 20 20 20 20 20 62 72  )!=0));.      br
e1c0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
e1d0: 61 73 65 20 4a 45 41 43 48 5f 50 41 52 45 4e 54  ase JEACH_PARENT
e1e0: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  : {.      if( p-
e1f0: 3e 69 3e 70 2d 3e 69 42 65 67 69 6e 20 26 26 20  >i>p->iBegin && 
e200: 70 2d 3e 62 52 65 63 75 72 73 69 76 65 20 29 7b  p->bRecursive ){
e210: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e220: 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 74  _result_int64(ct
e230: 78 2c 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  x, (sqlite3_int6
e240: 34 29 70 2d 3e 73 50 61 72 73 65 2e 61 55 70 5b  4)p->sParse.aUp[
e250: 70 2d 3e 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  p->i]);.      }.
e260: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e270: 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 45 41 43   }.    case JEAC
e280: 48 5f 46 55 4c 4c 4b 45 59 3a 20 7b 0a 20 20 20  H_FULLKEY: {.   
e290: 20 20 20 4a 73 6f 6e 53 74 72 69 6e 67 20 78 3b     JsonString x;
e2a0: 0a 20 20 20 20 20 20 6a 73 6f 6e 49 6e 69 74 28  .      jsonInit(
e2b0: 26 78 2c 20 63 74 78 29 3b 0a 20 20 20 20 20 20  &x, ctx);.      
e2c0: 69 66 28 20 70 2d 3e 62 52 65 63 75 72 73 69 76  if( p->bRecursiv
e2d0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 73 6f  e ){.        jso
e2e0: 6e 45 61 63 68 43 6f 6d 70 75 74 65 50 61 74 68  nEachComputePath
e2f0: 28 70 2c 20 26 78 2c 20 70 2d 3e 69 29 3b 0a 20  (p, &x, p->i);. 
e300: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e310: 20 20 20 20 69 66 28 20 70 2d 3e 7a 52 6f 6f 74      if( p->zRoot
e320: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6a 73   ){.          js
e330: 6f 6e 41 70 70 65 6e 64 52 61 77 28 26 78 2c 20  onAppendRaw(&x, 
e340: 70 2d 3e 7a 52 6f 6f 74 2c 20 28 69 6e 74 29 73  p->zRoot, (int)s
e350: 74 72 6c 65 6e 28 70 2d 3e 7a 52 6f 6f 74 29 29  trlen(p->zRoot))
e360: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
e370: 0a 20 20 20 20 20 20 20 20 20 20 6a 73 6f 6e 41  .          jsonA
e380: 70 70 65 6e 64 43 68 61 72 28 26 78 2c 20 27 24  ppendChar(&x, '$
e390: 27 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ');.        }.  
e3a0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 54 79        if( p->eTy
e3b0: 70 65 3d 3d 4a 53 4f 4e 5f 41 52 52 41 59 20 29  pe==JSON_ARRAY )
e3c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6a 73 6f 6e  {.          json
e3d0: 50 72 69 6e 74 66 28 33 30 2c 20 26 78 2c 20 22  Printf(30, &x, "
e3e0: 5b 25 64 5d 22 2c 20 70 2d 3e 69 52 6f 77 69 64  [%d]", p->iRowid
e3f0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
e400: 7b 0a 20 20 20 20 20 20 20 20 20 20 6a 73 6f 6e  {.          json
e410: 50 72 69 6e 74 66 28 70 54 68 69 73 2d 3e 6e 2c  Printf(pThis->n,
e420: 20 26 78 2c 20 22 2e 25 2e 2a 73 22 2c 20 70 54   &x, ".%.*s", pT
e430: 68 69 73 2d 3e 6e 2d 32 2c 20 70 54 68 69 73 2d  his->n-2, pThis-
e440: 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 2b 31 29 3b  >u.zJContent+1);
e450: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e460: 20 7d 0a 20 20 20 20 20 20 6a 73 6f 6e 52 65 73   }.      jsonRes
e470: 75 6c 74 28 26 78 29 3b 0a 20 20 20 20 20 20 62  ult(&x);.      b
e480: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
e490: 63 61 73 65 20 4a 45 41 43 48 5f 50 41 54 48 3a  case JEACH_PATH:
e4a0: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   {.      if( p->
e4b0: 62 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20  bRecursive ){.  
e4c0: 20 20 20 20 20 20 4a 73 6f 6e 53 74 72 69 6e 67        JsonString
e4d0: 20 78 3b 0a 20 20 20 20 20 20 20 20 6a 73 6f 6e   x;.        json
e4e0: 49 6e 69 74 28 26 78 2c 20 63 74 78 29 3b 0a 20  Init(&x, ctx);. 
e4f0: 20 20 20 20 20 20 20 6a 73 6f 6e 45 61 63 68 43         jsonEachC
e500: 6f 6d 70 75 74 65 50 61 74 68 28 70 2c 20 26 78  omputePath(p, &x
e510: 2c 20 70 2d 3e 73 50 61 72 73 65 2e 61 55 70 5b  , p->sParse.aUp[
e520: 70 2d 3e 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  p->i]);.        
e530: 6a 73 6f 6e 52 65 73 75 6c 74 28 26 78 29 3b 0a  jsonResult(&x);.
e540: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
e550: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
e560: 46 6f 72 20 6a 73 6f 6e 5f 65 61 63 68 28 29 20  For json_each() 
e570: 70 61 74 68 20 61 6e 64 20 72 6f 6f 74 20 61 72  path and root ar
e580: 65 20 74 68 65 20 73 61 6d 65 20 73 6f 20 66 61  e the same so fa
e590: 6c 6c 20 74 68 72 6f 75 67 68 0a 20 20 20 20 20  ll through.     
e5a0: 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 72 6f 6f   ** into the roo
e5b0: 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a  t case */.    }.
e5c0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
e5d0: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
e5e0: 2a 7a 52 6f 6f 74 20 3d 20 70 2d 3e 7a 52 6f 6f  *zRoot = p->zRoo
e5f0: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52 6f  t;.      if( zRo
e600: 6f 74 3d 3d 30 20 29 20 7a 52 6f 6f 74 20 3d 20  ot==0 ) zRoot = 
e610: 22 24 22 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "$";.      sqlit
e620: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
e630: 74 78 2c 20 7a 52 6f 6f 74 2c 20 2d 31 2c 20 53  tx, zRoot, -1, S
e640: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
e650: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e660: 7d 0a 20 20 20 20 63 61 73 65 20 4a 45 41 43 48  }.    case JEACH
e670: 5f 4a 53 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 61  _JSON: {.      a
e680: 73 73 65 72 74 28 20 69 3d 3d 4a 45 41 43 48 5f  ssert( i==JEACH_
e690: 4a 53 4f 4e 20 29 3b 0a 20 20 20 20 20 20 73 71  JSON );.      sq
e6a0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
e6b0: 74 28 63 74 78 2c 20 70 2d 3e 73 50 61 72 73 65  t(ctx, p->sParse
e6c0: 2e 7a 4a 73 6f 6e 2c 20 2d 31 2c 20 53 51 4c 49  .zJson, -1, SQLI
e6d0: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
e6e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
e6f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
e700: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  TE_OK;.}../* Ret
e710: 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  urn the current 
e720: 72 6f 77 69 64 20 76 61 6c 75 65 20 2a 2f 0a 73  rowid value */.s
e730: 74 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e 45 61  tatic int jsonEa
e740: 63 68 52 6f 77 69 64 28 73 71 6c 69 74 65 33 5f  chRowid(sqlite3_
e750: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72  vtab_cursor *cur
e760: 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a  , sqlite_int64 *
e770: 70 52 6f 77 69 64 29 7b 0a 20 20 4a 73 6f 6e 45  pRowid){.  JsonE
e780: 61 63 68 43 75 72 73 6f 72 20 2a 70 20 3d 20 28  achCursor *p = (
e790: 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 2a 29  JsonEachCursor*)
e7a0: 63 75 72 3b 0a 20 20 2a 70 52 6f 77 69 64 20 3d  cur;.  *pRowid =
e7b0: 20 70 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 72 65   p->iRowid;.  re
e7c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
e7d0: 7d 0a 0a 2f 2a 20 54 68 65 20 71 75 65 72 79 20  }../* The query 
e7e0: 73 74 72 61 74 65 67 79 20 69 73 20 74 6f 20 6c  strategy is to l
e7f0: 6f 6f 6b 20 66 6f 72 20 61 6e 20 65 71 75 61 6c  ook for an equal
e800: 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  ity constraint o
e810: 6e 20 74 68 65 20 6a 73 6f 6e 0a 2a 2a 20 63 6f  n the json.** co
e820: 6c 75 6d 6e 2e 20 20 57 69 74 68 6f 75 74 20 73  lumn.  Without s
e830: 75 63 68 20 61 20 63 6f 6e 73 74 72 61 69 6e 74  uch a constraint
e840: 2c 20 74 68 65 20 74 61 62 6c 65 20 63 61 6e 6e  , the table cann
e850: 6f 74 20 6f 70 65 72 61 74 65 2e 20 20 69 64 78  ot operate.  idx
e860: 4e 75 6d 20 69 73 0a 2a 2a 20 31 20 69 66 20 74  Num is.** 1 if t
e870: 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73  he constraint is
e880: 20 66 6f 75 6e 64 2c 20 33 20 69 66 20 74 68 65   found, 3 if the
e890: 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20   constraint and 
e8a0: 7a 52 6f 6f 74 20 61 72 65 20 66 6f 75 6e 64 2c  zRoot are found,
e8b0: 0a 2a 2a 20 61 6e 64 20 30 20 6f 74 68 65 72 77  .** and 0 otherw
e8c0: 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
e8d0: 6e 74 20 6a 73 6f 6e 45 61 63 68 42 65 73 74 49  nt jsonEachBestI
e8e0: 6e 64 65 78 28 0a 20 20 73 71 6c 69 74 65 33 5f  ndex(.  sqlite3_
e8f0: 76 74 61 62 20 2a 74 61 62 2c 0a 20 20 73 71 6c  vtab *tab,.  sql
e900: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
e910: 2a 70 49 64 78 49 6e 66 6f 0a 29 7b 0a 20 20 69  *pIdxInfo.){.  i
e920: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6a 73 6f 6e  nt i;.  int json
e930: 49 64 78 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20  Idx = -1;.  int 
e940: 72 6f 6f 74 49 64 78 20 3d 20 2d 31 3b 0a 20 20  rootIdx = -1;.  
e950: 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 71 6c  const struct sql
e960: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
e970: 72 61 69 6e 74 20 2a 70 43 6f 6e 73 74 72 61 69  raint *pConstrai
e980: 6e 74 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41  nt;..  UNUSED_PA
e990: 52 41 4d 28 74 61 62 29 3b 0a 20 20 70 43 6f 6e  RAM(tab);.  pCon
e9a0: 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78 49 6e  straint = pIdxIn
e9b0: 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->aConstraint;
e9c0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49  .  for(i=0; i<pI
e9d0: 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
e9e0: 69 6e 74 3b 20 69 2b 2b 2c 20 70 43 6f 6e 73 74  int; i++, pConst
e9f0: 72 61 69 6e 74 2b 2b 29 7b 0a 20 20 20 20 69 66  raint++){.    if
ea00: 28 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 75  ( pConstraint->u
ea10: 73 61 62 6c 65 3d 3d 30 20 29 20 63 6f 6e 74 69  sable==0 ) conti
ea20: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 43 6f  nue;.    if( pCo
ea30: 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 21 3d 53 51  nstraint->op!=SQ
ea40: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
ea50: 52 41 49 4e 54 5f 45 51 20 29 20 63 6f 6e 74 69  RAINT_EQ ) conti
ea60: 6e 75 65 3b 0a 20 20 20 20 73 77 69 74 63 68 28  nue;.    switch(
ea70: 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 69 43   pConstraint->iC
ea80: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 63  olumn ){.      c
ea90: 61 73 65 20 4a 45 41 43 48 5f 4a 53 4f 4e 3a 20  ase JEACH_JSON: 
eaa0: 20 20 6a 73 6f 6e 49 64 78 20 3d 20 69 3b 20 20    jsonIdx = i;  
eab0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
eac0: 61 73 65 20 4a 45 41 43 48 5f 52 4f 4f 54 3a 20  ase JEACH_ROOT: 
ead0: 20 20 72 6f 6f 74 49 64 78 20 3d 20 69 3b 20 20    rootIdx = i;  
eae0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 64    break;.      d
eaf0: 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20  efault:         
eb00: 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 20 20 20    /* no-op */   
eb10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
eb20: 20 7d 0a 20 20 69 66 28 20 6a 73 6f 6e 49 64 78   }.  if( jsonIdx
eb30: 3c 30 20 29 7b 0a 20 20 20 20 70 49 64 78 49 6e  <0 ){.    pIdxIn
eb40: 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a  fo->idxNum = 0;.
eb50: 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73      pIdxInfo->es
eb60: 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 31 65  timatedCost = 1e
eb70: 39 39 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  99;.  }else{.   
eb80: 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
eb90: 61 74 65 64 43 6f 73 74 20 3d 20 31 2e 30 3b 0a  atedCost = 1.0;.
eba0: 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43      pIdxInfo->aC
ebb0: 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 6a  onstraintUsage[j
ebc0: 73 6f 6e 49 64 78 5d 2e 61 72 67 76 49 6e 64 65  sonIdx].argvInde
ebd0: 78 20 3d 20 31 3b 0a 20 20 20 20 70 49 64 78 49  x = 1;.    pIdxI
ebe0: 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
ebf0: 55 73 61 67 65 5b 6a 73 6f 6e 49 64 78 5d 2e 6f  Usage[jsonIdx].o
ec00: 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  mit = 1;.    if(
ec10: 20 72 6f 6f 74 49 64 78 3c 30 20 29 7b 0a 20 20   rootIdx<0 ){.  
ec20: 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64      pIdxInfo->id
ec30: 78 4e 75 6d 20 3d 20 31 3b 0a 20 20 20 20 7d 65  xNum = 1;.    }e
ec40: 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 64 78 49  lse{.      pIdxI
ec50: 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
ec60: 55 73 61 67 65 5b 72 6f 6f 74 49 64 78 5d 2e 61  Usage[rootIdx].a
ec70: 72 67 76 49 6e 64 65 78 20 3d 20 32 3b 0a 20 20  rgvIndex = 2;.  
ec80: 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43      pIdxInfo->aC
ec90: 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 72  onstraintUsage[r
eca0: 6f 6f 74 49 64 78 5d 2e 6f 6d 69 74 20 3d 20 31  ootIdx].omit = 1
ecb0: 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f  ;.      pIdxInfo
ecc0: 2d 3e 69 64 78 4e 75 6d 20 3d 20 33 3b 0a 20 20  ->idxNum = 3;.  
ecd0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
ece0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
ecf0: 2a 20 53 74 61 72 74 20 61 20 73 65 61 72 63 68  * Start a search
ed00: 20 6f 6e 20 61 20 6e 65 77 20 4a 53 4f 4e 20 73   on a new JSON s
ed10: 74 72 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20  tring */.static 
ed20: 69 6e 74 20 6a 73 6f 6e 45 61 63 68 46 69 6c 74  int jsonEachFilt
ed30: 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  er(.  sqlite3_vt
ed40: 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 2c 0a  ab_cursor *cur,.
ed50: 20 20 69 6e 74 20 69 64 78 4e 75 6d 2c 20 63 6f    int idxNum, co
ed60: 6e 73 74 20 63 68 61 72 20 2a 69 64 78 53 74 72  nst char *idxStr
ed70: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 73 71  ,.  int argc, sq
ed80: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
ed90: 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e 45 61 63 68  gv.){.  JsonEach
eda0: 43 75 72 73 6f 72 20 2a 70 20 3d 20 28 4a 73 6f  Cursor *p = (Jso
edb0: 6e 45 61 63 68 43 75 72 73 6f 72 2a 29 63 75 72  nEachCursor*)cur
edc0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
edd0: 7a 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  z;.  const char 
ede0: 2a 7a 52 6f 6f 74 20 3d 20 30 3b 0a 20 20 73 71  *zRoot = 0;.  sq
edf0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 3b 0a 0a  lite3_int64 n;..
ee00: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 69    UNUSED_PARAM(i
ee10: 64 78 53 74 72 29 3b 0a 20 20 55 4e 55 53 45 44  dxStr);.  UNUSED
ee20: 5f 50 41 52 41 4d 28 61 72 67 63 29 3b 0a 20 20  _PARAM(argc);.  
ee30: 6a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 52 65  jsonEachCursorRe
ee40: 73 65 74 28 70 29 3b 0a 20 20 69 66 28 20 69 64  set(p);.  if( id
ee50: 78 4e 75 6d 3d 3d 30 20 29 20 72 65 74 75 72 6e  xNum==0 ) return
ee60: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7a 20   SQLITE_OK;.  z 
ee70: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
ee80: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
ee90: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66  t(argv[0]);.  if
eea0: 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( z==0 ) return 
eeb0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6e 20 3d  SQLITE_OK;.  n =
eec0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
eed0: 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20  ytes(argv[0]);. 
eee0: 20 70 2d 3e 7a 4a 73 6f 6e 20 3d 20 73 71 6c 69   p->zJson = sqli
eef0: 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 6e 2b  te3_malloc64( n+
ef00: 31 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 4a  1 );.  if( p->zJ
ef10: 73 6f 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  son==0 ) return 
ef20: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
ef30: 6d 65 6d 63 70 79 28 70 2d 3e 7a 4a 73 6f 6e 2c  memcpy(p->zJson,
ef40: 20 7a 2c 20 28 73 69 7a 65 5f 74 29 6e 2b 31 29   z, (size_t)n+1)
ef50: 3b 0a 20 20 69 66 28 20 6a 73 6f 6e 50 61 72 73  ;.  if( jsonPars
ef60: 65 28 26 70 2d 3e 73 50 61 72 73 65 2c 20 30 2c  e(&p->sParse, 0,
ef70: 20 70 2d 3e 7a 4a 73 6f 6e 29 20 29 7b 0a 20 20   p->zJson) ){.  
ef80: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
ef90: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 69 66 28  E_NOMEM;.    if(
efa0: 20 70 2d 3e 73 50 61 72 73 65 2e 6f 6f 6d 3d 3d   p->sParse.oom==
efb0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
efc0: 65 33 5f 66 72 65 65 28 63 75 72 2d 3e 70 56 74  e3_free(cur->pVt
efd0: 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ab->zErrMsg);.  
efe0: 20 20 20 20 63 75 72 2d 3e 70 56 74 61 62 2d 3e      cur->pVtab->
eff0: 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
f000: 33 5f 6d 70 72 69 6e 74 66 28 22 6d 61 6c 66 6f  3_mprintf("malfo
f010: 72 6d 65 64 20 4a 53 4f 4e 22 29 3b 0a 20 20 20  rmed JSON");.   
f020: 20 20 20 69 66 28 20 63 75 72 2d 3e 70 56 74 61     if( cur->pVta
f030: 62 2d 3e 7a 45 72 72 4d 73 67 20 29 20 72 63 20  b->zErrMsg ) rc 
f040: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
f050: 20 20 20 20 7d 0a 20 20 20 20 6a 73 6f 6e 45 61      }.    jsonEa
f060: 63 68 43 75 72 73 6f 72 52 65 73 65 74 28 70 29  chCursorReset(p)
f070: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
f080: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
f090: 62 52 65 63 75 72 73 69 76 65 20 26 26 20 6a 73  bRecursive && js
f0a0: 6f 6e 50 61 72 73 65 46 69 6e 64 50 61 72 65 6e  onParseFindParen
f0b0: 74 73 28 26 70 2d 3e 73 50 61 72 73 65 29 20 29  ts(&p->sParse) )
f0c0: 7b 0a 20 20 20 20 6a 73 6f 6e 45 61 63 68 43 75  {.    jsonEachCu
f0d0: 72 73 6f 72 52 65 73 65 74 28 70 29 3b 0a 20 20  rsorReset(p);.  
f0e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f0f0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NOMEM;.  }else{.
f100: 20 20 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e      JsonNode *pN
f110: 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ode = 0;.    if(
f120: 20 69 64 78 4e 75 6d 3d 3d 33 20 29 7b 0a 20 20   idxNum==3 ){.  
f130: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
f140: 7a 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  zErr = 0;.      
f150: 7a 52 6f 6f 74 20 3d 20 28 63 6f 6e 73 74 20 63  zRoot = (const c
f160: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
f170: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29  ue_text(argv[1])
f180: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52 6f 6f  ;.      if( zRoo
f190: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  t==0 ) return SQ
f1a0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 6e  LITE_OK;.      n
f1b0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
f1c0: 5f 62 79 74 65 73 28 61 72 67 76 5b 31 5d 29 3b  _bytes(argv[1]);
f1d0: 0a 20 20 20 20 20 20 70 2d 3e 7a 52 6f 6f 74 20  .      p->zRoot 
f1e0: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
f1f0: 36 34 28 20 6e 2b 31 20 29 3b 0a 20 20 20 20 20  64( n+1 );.     
f200: 20 69 66 28 20 70 2d 3e 7a 52 6f 6f 74 3d 3d 30   if( p->zRoot==0
f210: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
f220: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 6d 65  _NOMEM;.      me
f230: 6d 63 70 79 28 70 2d 3e 7a 52 6f 6f 74 2c 20 7a  mcpy(p->zRoot, z
f240: 52 6f 6f 74 2c 20 28 73 69 7a 65 5f 74 29 6e 2b  Root, (size_t)n+
f250: 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52  1);.      if( zR
f260: 6f 6f 74 5b 30 5d 21 3d 27 24 27 20 29 7b 0a 20  oot[0]!='$' ){. 
f270: 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20 7a 52         zErr = zR
f280: 6f 6f 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  oot;.      }else
f290: 7b 0a 20 20 20 20 20 20 20 20 70 4e 6f 64 65 20  {.        pNode 
f2a0: 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 53 74 65 70  = jsonLookupStep
f2b0: 28 26 70 2d 3e 73 50 61 72 73 65 2c 20 30 2c 20  (&p->sParse, 0, 
f2c0: 70 2d 3e 7a 52 6f 6f 74 2b 31 2c 20 30 2c 20 26  p->zRoot+1, 0, &
f2d0: 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  zErr);.      }. 
f2e0: 20 20 20 20 20 69 66 28 20 7a 45 72 72 20 29 7b       if( zErr ){
f2f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f300: 5f 66 72 65 65 28 63 75 72 2d 3e 70 56 74 61 62  _free(cur->pVtab
f310: 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
f320: 20 20 20 20 63 75 72 2d 3e 70 56 74 61 62 2d 3e      cur->pVtab->
f330: 7a 45 72 72 4d 73 67 20 3d 20 6a 73 6f 6e 50 61  zErrMsg = jsonPa
f340: 74 68 53 79 6e 74 61 78 45 72 72 6f 72 28 7a 45  thSyntaxError(zE
f350: 72 72 29 3b 0a 20 20 20 20 20 20 20 20 6a 73 6f  rr);.        jso
f360: 6e 45 61 63 68 43 75 72 73 6f 72 52 65 73 65 74  nEachCursorReset
f370: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  (p);.        ret
f380: 75 72 6e 20 63 75 72 2d 3e 70 56 74 61 62 2d 3e  urn cur->pVtab->
f390: 7a 45 72 72 4d 73 67 20 3f 20 53 51 4c 49 54 45  zErrMsg ? SQLITE
f3a0: 5f 45 52 52 4f 52 20 3a 20 53 51 4c 49 54 45 5f  _ERROR : SQLITE_
f3b0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c  NOMEM;.      }el
f3c0: 73 65 20 69 66 28 20 70 4e 6f 64 65 3d 3d 30 20  se if( pNode==0 
f3d0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
f3e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
f3f0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
f400: 20 20 20 20 20 20 70 4e 6f 64 65 20 3d 20 70 2d        pNode = p-
f410: 3e 73 50 61 72 73 65 2e 61 4e 6f 64 65 3b 0a 20  >sParse.aNode;. 
f420: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 42 65 67     }.    p->iBeg
f430: 69 6e 20 3d 20 70 2d 3e 69 20 3d 20 28 69 6e 74  in = p->i = (int
f440: 29 28 70 4e 6f 64 65 20 2d 20 70 2d 3e 73 50 61  )(pNode - p->sPa
f450: 72 73 65 2e 61 4e 6f 64 65 29 3b 0a 20 20 20 20  rse.aNode);.    
f460: 70 2d 3e 65 54 79 70 65 20 3d 20 70 4e 6f 64 65  p->eType = pNode
f470: 2d 3e 65 54 79 70 65 3b 0a 20 20 20 20 69 66 28  ->eType;.    if(
f480: 20 70 2d 3e 65 54 79 70 65 3e 3d 4a 53 4f 4e 5f   p->eType>=JSON_
f490: 41 52 52 41 59 20 29 7b 0a 20 20 20 20 20 20 70  ARRAY ){.      p
f4a0: 4e 6f 64 65 2d 3e 75 2e 69 4b 65 79 20 3d 20 30  Node->u.iKey = 0
f4b0: 3b 0a 20 20 20 20 20 20 70 2d 3e 69 45 6e 64 20  ;.      p->iEnd 
f4c0: 3d 20 70 2d 3e 69 20 2b 20 70 4e 6f 64 65 2d 3e  = p->i + pNode->
f4d0: 6e 20 2b 20 31 3b 0a 20 20 20 20 20 20 69 66 28  n + 1;.      if(
f4e0: 20 70 2d 3e 62 52 65 63 75 72 73 69 76 65 20 29   p->bRecursive )
f4f0: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 54 79  {.        p->eTy
f500: 70 65 20 3d 20 70 2d 3e 73 50 61 72 73 65 2e 61  pe = p->sParse.a
f510: 4e 6f 64 65 5b 70 2d 3e 73 50 61 72 73 65 2e 61  Node[p->sParse.a
f520: 55 70 5b 70 2d 3e 69 5d 5d 2e 65 54 79 70 65 3b  Up[p->i]].eType;
f530: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
f540: 69 3e 30 20 26 26 20 28 70 2d 3e 73 50 61 72 73  i>0 && (p->sPars
f550: 65 2e 61 4e 6f 64 65 5b 70 2d 3e 69 2d 31 5d 2e  e.aNode[p->i-1].
f560: 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f  jnFlags & JNODE_
f570: 4c 41 42 45 4c 29 21 3d 30 20 29 7b 0a 20 20 20  LABEL)!=0 ){.   
f580: 20 20 20 20 20 20 20 70 2d 3e 69 2d 2d 3b 0a 20         p->i--;. 
f590: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
f5a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 2d  else{.        p-
f5b0: 3e 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  >i++;.      }.  
f5c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
f5d0: 2d 3e 69 45 6e 64 20 3d 20 70 2d 3e 69 2b 31 3b  ->iEnd = p->i+1;
f5e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
f5f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
f600: 0a 0a 2f 2a 20 54 68 65 20 6d 65 74 68 6f 64 73  ../* The methods
f610: 20 6f 66 20 74 68 65 20 6a 73 6f 6e 5f 65 61 63   of the json_eac
f620: 68 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  h virtual table 
f630: 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
f640: 33 5f 6d 6f 64 75 6c 65 20 6a 73 6f 6e 45 61 63  3_module jsonEac
f650: 68 4d 6f 64 75 6c 65 20 3d 20 7b 0a 20 20 30 2c  hModule = {.  0,
f660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f670: 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
f680: 73 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20  sion */.  0,    
f690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6a0: 20 20 20 20 20 2f 2a 20 78 43 72 65 61 74 65 20       /* xCreate 
f6b0: 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 43 6f 6e  */.  jsonEachCon
f6c0: 6e 65 63 74 2c 20 20 20 20 20 20 20 20 20 20 20  nect,           
f6d0: 2f 2a 20 78 43 6f 6e 6e 65 63 74 20 2a 2f 0a 20  /* xConnect */. 
f6e0: 20 6a 73 6f 6e 45 61 63 68 42 65 73 74 49 6e 64   jsonEachBestInd
f6f0: 65 78 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ex,         /* x
f700: 42 65 73 74 49 6e 64 65 78 20 2a 2f 0a 20 20 6a  BestIndex */.  j
f710: 73 6f 6e 45 61 63 68 44 69 73 63 6f 6e 6e 65 63  sonEachDisconnec
f720: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 44 69  t,        /* xDi
f730: 73 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 30 2c  sconnect */.  0,
f740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f750: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 73           /* xDes
f760: 74 72 6f 79 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61  troy */.  jsonEa
f770: 63 68 4f 70 65 6e 45 61 63 68 2c 20 20 20 20 20  chOpenEach,     
f780: 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2d 20       /* xOpen - 
f790: 6f 70 65 6e 20 61 20 63 75 72 73 6f 72 20 2a 2f  open a cursor */
f7a0: 0a 20 20 6a 73 6f 6e 45 61 63 68 43 6c 6f 73 65  .  jsonEachClose
f7b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
f7c0: 20 78 43 6c 6f 73 65 20 2d 20 63 6c 6f 73 65 20   xClose - close 
f7d0: 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 6a 73  a cursor */.  js
f7e0: 6f 6e 45 61 63 68 46 69 6c 74 65 72 2c 20 20 20  onEachFilter,   
f7f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
f800: 74 65 72 20 2d 20 63 6f 6e 66 69 67 75 72 65 20  ter - configure 
f810: 73 63 61 6e 20 63 6f 6e 73 74 72 61 69 6e 74 73  scan constraints
f820: 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 4e 65   */.  jsonEachNe
f830: 78 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  xt,             
f840: 20 2f 2a 20 78 4e 65 78 74 20 2d 20 61 64 76 61   /* xNext - adva
f850: 6e 63 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a  nce a cursor */.
f860: 20 20 6a 73 6f 6e 45 61 63 68 45 6f 66 2c 20 20    jsonEachEof,  
f870: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f880: 78 45 6f 66 20 2d 20 63 68 65 63 6b 20 66 6f 72  xEof - check for
f890: 20 65 6e 64 20 6f 66 20 73 63 61 6e 20 2a 2f 0a   end of scan */.
f8a0: 20 20 6a 73 6f 6e 45 61 63 68 43 6f 6c 75 6d 6e    jsonEachColumn
f8b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
f8c0: 78 43 6f 6c 75 6d 6e 20 2d 20 72 65 61 64 20 64  xColumn - read d
f8d0: 61 74 61 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63  ata */.  jsonEac
f8e0: 68 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20  hRowid,         
f8f0: 20 20 20 20 2f 2a 20 78 52 6f 77 69 64 20 2d 20      /* xRowid - 
f900: 72 65 61 64 20 64 61 74 61 20 2a 2f 0a 20 20 30  read data */.  0
f910: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f920: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 70            /* xUp
f930: 64 61 74 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20  date */.  0,    
f940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f950: 20 20 20 20 20 2f 2a 20 78 42 65 67 69 6e 20 2a       /* xBegin *
f960: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
f970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f980: 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20 30 2c 20  * xSync */.  0, 
f990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9a0: 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6d 6d          /* xComm
f9b0: 69 74 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  it */.  0,      
f9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9d0: 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 20     /* xRollback 
f9e0: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
f9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa00: 2f 2a 20 78 46 69 6e 64 4d 65 74 68 6f 64 20 2a  /* xFindMethod *
fa10: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
fa20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fa30: 2a 20 78 52 65 6e 61 6d 65 20 2a 2f 0a 20 20 30  * xRename */.  0
fa40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
fa50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 61            /* xSa
fa60: 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 30 2c 20  vepoint */.  0, 
fa70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa80: 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 6c 65          /* xRele
fa90: 61 73 65 20 2a 2f 0a 20 20 30 20 20 20 20 20 20  ase */.  0      
faa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fab0: 20 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b      /* xRollback
fac0: 54 6f 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65  To */.};../* The
fad0: 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20   methods of the 
fae0: 6a 73 6f 6e 5f 74 72 65 65 20 76 69 72 74 75 61  json_tree virtua
faf0: 6c 20 74 61 62 6c 65 2e 20 2a 2f 0a 73 74 61 74  l table. */.stat
fb00: 69 63 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c  ic sqlite3_modul
fb10: 65 20 6a 73 6f 6e 54 72 65 65 4d 6f 64 75 6c 65  e jsonTreeModule
fb20: 20 3d 20 7b 0a 20 20 30 2c 20 20 20 20 20 20 20   = {.  0,       
fb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb40: 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
fb50: 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
fb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fb70: 20 78 43 72 65 61 74 65 20 2a 2f 0a 20 20 6a 73   xCreate */.  js
fb80: 6f 6e 45 61 63 68 43 6f 6e 6e 65 63 74 2c 20 20  onEachConnect,  
fb90: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6e           /* xCon
fba0: 6e 65 63 74 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61  nect */.  jsonEa
fbb0: 63 68 42 65 73 74 49 6e 64 65 78 2c 20 20 20 20  chBestIndex,    
fbc0: 20 20 20 20 20 2f 2a 20 78 42 65 73 74 49 6e 64       /* xBestInd
fbd0: 65 78 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68  ex */.  jsonEach
fbe0: 44 69 73 63 6f 6e 6e 65 63 74 2c 20 20 20 20 20  Disconnect,     
fbf0: 20 20 20 2f 2a 20 78 44 69 73 63 6f 6e 6e 65 63     /* xDisconnec
fc00: 74 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  t */.  0,       
fc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc20: 20 20 2f 2a 20 78 44 65 73 74 72 6f 79 20 2a 2f    /* xDestroy */
fc30: 0a 20 20 6a 73 6f 6e 45 61 63 68 4f 70 65 6e 54  .  jsonEachOpenT
fc40: 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ree,          /*
fc50: 20 78 4f 70 65 6e 20 2d 20 6f 70 65 6e 20 61 20   xOpen - open a 
fc60: 63 75 72 73 6f 72 20 2a 2f 0a 20 20 6a 73 6f 6e  cursor */.  json
fc70: 45 61 63 68 43 6c 6f 73 65 2c 20 20 20 20 20 20  EachClose,      
fc80: 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
fc90: 20 2d 20 63 6c 6f 73 65 20 61 20 63 75 72 73 6f   - close a curso
fca0: 72 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 46  r */.  jsonEachF
fcb0: 69 6c 74 65 72 2c 20 20 20 20 20 20 20 20 20 20  ilter,          
fcc0: 20 20 2f 2a 20 78 46 69 6c 74 65 72 20 2d 20 63    /* xFilter - c
fcd0: 6f 6e 66 69 67 75 72 65 20 73 63 61 6e 20 63 6f  onfigure scan co
fce0: 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 6a  nstraints */.  j
fcf0: 73 6f 6e 45 61 63 68 4e 65 78 74 2c 20 20 20 20  sonEachNext,    
fd00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4e 65            /* xNe
fd10: 78 74 20 2d 20 61 64 76 61 6e 63 65 20 61 20 63  xt - advance a c
fd20: 75 72 73 6f 72 20 2a 2f 0a 20 20 6a 73 6f 6e 45  ursor */.  jsonE
fd30: 61 63 68 45 6f 66 2c 20 20 20 20 20 20 20 20 20  achEof,         
fd40: 20 20 20 20 20 20 2f 2a 20 78 45 6f 66 20 2d 20        /* xEof - 
fd50: 63 68 65 63 6b 20 66 6f 72 20 65 6e 64 20 6f 66  check for end of
fd60: 20 73 63 61 6e 20 2a 2f 0a 20 20 6a 73 6f 6e 45   scan */.  jsonE
fd70: 61 63 68 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20  achColumn,      
fd80: 20 20 20 20 20 20 2f 2a 20 78 43 6f 6c 75 6d 6e        /* xColumn
fd90: 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f 0a   - read data */.
fda0: 20 20 6a 73 6f 6e 45 61 63 68 52 6f 77 69 64 2c    jsonEachRowid,
fdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fdc0: 78 52 6f 77 69 64 20 2d 20 72 65 61 64 20 64 61  xRowid - read da
fdd0: 74 61 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  ta */.  0,      
fde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fdf0: 20 20 20 2f 2a 20 78 55 70 64 61 74 65 20 2a 2f     /* xUpdate */
fe00: 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
fe10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fe20: 20 78 42 65 67 69 6e 20 2a 2f 0a 20 20 30 2c 20   xBegin */.  0, 
fe30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe40: 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63          /* xSync
fe50: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
fe60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe70: 20 2f 2a 20 78 43 6f 6d 6d 69 74 20 2a 2f 0a 20   /* xCommit */. 
fe80: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
fe90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
fea0: 52 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 30 2c  Rollback */.  0,
feb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fec0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6e           /* xFin
fed0: 64 4d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 2c 20  dMethod */.  0, 
fee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fef0: 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 6e 61          /* xRena
ff00: 6d 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  me */.  0,      
ff10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff20: 20 20 20 2f 2a 20 78 53 61 76 65 70 6f 69 6e 74     /* xSavepoint
ff30: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
ff40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff50: 20 2f 2a 20 78 52 65 6c 65 61 73 65 20 2a 2f 0a   /* xRelease */.
ff60: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
ff70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ff80: 78 52 6f 6c 6c 62 61 63 6b 54 6f 20 2a 2f 0a 7d  xRollbackTo */.}
ff90: 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
ffa0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
ffb0: 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ABLE */../******
ffc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ffd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ffe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10000 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  ******.** The fo
10010 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73  llowing routines
10020 20 61 72 65 20 74 68 65 20 6f 6e 6c 79 20 70 75   are the only pu
10030 62 6c 69 63 61 6c 6c 79 20 76 69 73 69 62 6c 65  blically visible
10040 20 69 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20   identifiers in 
10050 74 68 69 73 0a 2a 2a 20 66 69 6c 65 2e 20 20 43  this.** file.  C
10060 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  all the followin
10070 67 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 6f 72  g routines in or
10080 64 65 72 20 74 6f 20 72 65 67 69 73 74 65 72 20  der to register 
10090 74 68 65 20 76 61 72 69 6f 75 73 20 53 51 4c 0a  the various SQL.
100a0 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64  ** functions and
100b0 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
100c0 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  le implemented b
100d0 79 20 74 68 69 73 20 66 69 6c 65 2e 0a 2a 2a 2a  y this file..***
100e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
100f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 69 6e 74 20  *********/..int 
10130 73 71 6c 69 74 65 33 4a 73 6f 6e 31 49 6e 69 74  sqlite3Json1Init
10140 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
10150 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
10160 5f 4f 4b 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  _OK;.  unsigned 
10170 69 6e 74 20 69 3b 0a 20 20 73 74 61 74 69 63 20  int i;.  static 
10180 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20  const struct {. 
10190 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
101a0 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 69 6e 74 20  zName;.     int 
101b0 6e 41 72 67 3b 0a 20 20 20 20 20 69 6e 74 20 66  nArg;.     int f
101c0 6c 61 67 3b 0a 20 20 20 20 20 76 6f 69 64 20 28  lag;.     void (
101d0 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f  *xFunc)(sqlite3_
101e0 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
101f0 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 3b 0a 20  ite3_value**);. 
10200 20 7d 20 61 46 75 6e 63 5b 5d 20 3d 20 7b 0a 20   } aFunc[] = {. 
10210 20 20 20 7b 20 22 6a 73 6f 6e 22 2c 20 20 20 20     { "json",    
10220 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20               1, 
10230 30 2c 20 20 20 6a 73 6f 6e 52 65 6d 6f 76 65 46  0,   jsonRemoveF
10240 75 6e 63 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  unc        },.  
10250 20 20 7b 20 22 6a 73 6f 6e 5f 61 72 72 61 79 22    { "json_array"
10260 2c 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 30  ,          -1, 0
10270 2c 20 20 20 6a 73 6f 6e 41 72 72 61 79 46 75 6e  ,   jsonArrayFun
10280 63 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  c         },.   
10290 20 7b 20 22 6a 73 6f 6e 5f 61 72 72 61 79 5f 6c   { "json_array_l
102a0 65 6e 67 74 68 22 2c 20 20 20 20 31 2c 20 30 2c  ength",    1, 0,
102b0 20 20 20 6a 73 6f 6e 41 72 72 61 79 4c 65 6e 67     jsonArrayLeng
102c0 74 68 46 75 6e 63 20 20 20 7d 2c 0a 20 20 20 20  thFunc   },.    
102d0 7b 20 22 6a 73 6f 6e 5f 61 72 72 61 79 5f 6c 65  { "json_array_le
102e0 6e 67 74 68 22 2c 20 20 20 20 32 2c 20 30 2c 20  ngth",    2, 0, 
102f0 20 20 6a 73 6f 6e 41 72 72 61 79 4c 65 6e 67 74    jsonArrayLengt
10300 68 46 75 6e 63 20 20 20 7d 2c 0a 20 20 20 20 7b  hFunc   },.    {
10310 20 22 6a 73 6f 6e 5f 65 78 74 72 61 63 74 22 2c   "json_extract",
10320 20 20 20 20 20 20 20 20 2d 31 2c 20 30 2c 20 20          -1, 0,  
10330 20 6a 73 6f 6e 45 78 74 72 61 63 74 46 75 6e 63   jsonExtractFunc
10340 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
10350 22 6a 73 6f 6e 5f 69 6e 73 65 72 74 22 2c 20 20  "json_insert",  
10360 20 20 20 20 20 20 20 2d 31 2c 20 30 2c 20 20 20         -1, 0,   
10370 6a 73 6f 6e 53 65 74 46 75 6e 63 20 20 20 20 20  jsonSetFunc     
10380 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
10390 6a 73 6f 6e 5f 6f 62 6a 65 63 74 22 2c 20 20 20  json_object",   
103a0 20 20 20 20 20 20 2d 31 2c 20 30 2c 20 20 20 6a        -1, 0,   j
103b0 73 6f 6e 4f 62 6a 65 63 74 46 75 6e 63 20 20 20  sonObjectFunc   
103c0 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a       },.    { "j
103d0 73 6f 6e 5f 70 61 74 63 68 22 2c 20 20 20 20 20  son_patch",     
103e0 20 20 20 20 20 20 32 2c 20 30 2c 20 20 20 6a 73        2, 0,   js
103f0 6f 6e 50 61 74 63 68 46 75 6e 63 20 20 20 20 20  onPatchFunc     
10400 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73      },.    { "js
10410 6f 6e 5f 71 75 6f 74 65 22 2c 20 20 20 20 20 20  on_quote",      
10420 20 20 20 20 20 31 2c 20 30 2c 20 20 20 6a 73 6f       1, 0,   jso
10430 6e 51 75 6f 74 65 46 75 6e 63 20 20 20 20 20 20  nQuoteFunc      
10440 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f     },.    { "jso
10450 6e 5f 72 65 6d 6f 76 65 22 2c 20 20 20 20 20 20  n_remove",      
10460 20 20 20 2d 31 2c 20 30 2c 20 20 20 6a 73 6f 6e     -1, 0,   json
10470 52 65 6d 6f 76 65 46 75 6e 63 20 20 20 20 20 20  RemoveFunc      
10480 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e    },.    { "json
10490 5f 72 65 70 6c 61 63 65 22 2c 20 20 20 20 20 20  _replace",      
104a0 20 20 2d 31 2c 20 30 2c 20 20 20 6a 73 6f 6e 52    -1, 0,   jsonR
104b0 65 70 6c 61 63 65 46 75 6e 63 20 20 20 20 20 20  eplaceFunc      
104c0 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f   },.    { "json_
104d0 73 65 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  set",           
104e0 20 2d 31 2c 20 31 2c 20 20 20 6a 73 6f 6e 53 65   -1, 1,   jsonSe
104f0 74 46 75 6e 63 20 20 20 20 20 20 20 20 20 20 20  tFunc           
10500 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 74  },.    { "json_t
10510 79 70 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ype",           
10520 20 31 2c 20 30 2c 20 20 20 6a 73 6f 6e 54 79 70   1, 0,   jsonTyp
10530 65 46 75 6e 63 20 20 20 20 20 20 20 20 20 20 7d  eFunc          }
10540 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 74 79  ,.    { "json_ty
10550 70 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  pe",            
10560 32 2c 20 30 2c 20 20 20 6a 73 6f 6e 54 79 70 65  2, 0,   jsonType
10570 46 75 6e 63 20 20 20 20 20 20 20 20 20 20 7d 2c  Func          },
10580 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 76 61 6c  .    { "json_val
10590 69 64 22 2c 20 20 20 20 20 20 20 20 20 20 20 31  id",           1
105a0 2c 20 30 2c 20 20 20 6a 73 6f 6e 56 61 6c 69 64  , 0,   jsonValid
105b0 46 75 6e 63 20 20 20 20 20 20 20 20 20 7d 2c 0a  Func         },.
105c0 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55  .#if SQLITE_DEBU
105d0 47 0a 20 20 20 20 2f 2a 20 44 45 42 55 47 20 61  G.    /* DEBUG a
105e0 6e 64 20 54 45 53 54 49 4e 47 20 66 75 6e 63 74  nd TESTING funct
105f0 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 7b 20 22 6a  ions */.    { "j
10600 73 6f 6e 5f 70 61 72 73 65 22 2c 20 20 20 20 20  son_parse",     
10610 20 20 20 20 20 20 31 2c 20 30 2c 20 20 20 6a 73        1, 0,   js
10620 6f 6e 50 61 72 73 65 46 75 6e 63 20 20 20 20 20  onParseFunc     
10630 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73      },.    { "js
10640 6f 6e 5f 74 65 73 74 31 22 2c 20 20 20 20 20 20  on_test1",      
10650 20 20 20 20 20 31 2c 20 30 2c 20 20 20 6a 73 6f       1, 0,   jso
10660 6e 54 65 73 74 31 46 75 6e 63 20 20 20 20 20 20  nTest1Func      
10670 20 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 7d     },.#endif.  }
10680 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
10690 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 63   struct {.     c
106a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
106b0 3b 0a 20 20 20 20 20 69 6e 74 20 6e 41 72 67 3b  ;.     int nArg;
106c0 0a 20 20 20 20 20 76 6f 69 64 20 28 2a 78 53 74  .     void (*xSt
106d0 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ep)(sqlite3_cont
106e0 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
106f0 5f 76 61 6c 75 65 2a 2a 29 3b 0a 20 20 20 20 20  _value**);.     
10700 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73  void (*xFinal)(s
10710 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29  qlite3_context*)
10720 3b 0a 20 20 7d 20 61 41 67 67 5b 5d 20 3d 20 7b  ;.  } aAgg[] = {
10730 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 67 72 6f  .    { "json_gro
10740 75 70 5f 61 72 72 61 79 22 2c 20 20 20 20 20 31  up_array",     1
10750 2c 20 20 20 6a 73 6f 6e 41 72 72 61 79 53 74 65  ,   jsonArraySte
10760 70 2c 20 20 20 6a 73 6f 6e 41 72 72 61 79 46 69  p,   jsonArrayFi
10770 6e 61 6c 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a  nal  },.    { "j
10780 73 6f 6e 5f 67 72 6f 75 70 5f 6f 62 6a 65 63 74  son_group_object
10790 22 2c 20 20 20 20 32 2c 20 20 20 6a 73 6f 6e 4f  ",    2,   jsonO
107a0 62 6a 65 63 74 53 74 65 70 2c 20 20 6a 73 6f 6e  bjectStep,  json
107b0 4f 62 6a 65 63 74 46 69 6e 61 6c 20 7d 2c 0a 20  ObjectFinal },. 
107c0 20 7d 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   };.#ifndef SQLI
107d0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
107e0 41 42 4c 45 0a 20 20 73 74 61 74 69 63 20 63 6f  ABLE.  static co
107f0 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20  nst struct {.   
10800 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
10810 61 6d 65 3b 0a 20 20 20 20 20 73 71 6c 69 74 65  ame;.     sqlite
10820 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c  3_module *pModul
10830 65 3b 0a 20 20 7d 20 61 4d 6f 64 5b 5d 20 3d 20  e;.  } aMod[] = 
10840 7b 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 65 61  {.    { "json_ea
10850 63 68 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ch",            
10860 26 6a 73 6f 6e 45 61 63 68 4d 6f 64 75 6c 65 20  &jsonEachModule 
10870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
10880 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 74 72 65  .    { "json_tre
10890 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 26  e",            &
108a0 6a 73 6f 6e 54 72 65 65 4d 6f 64 75 6c 65 20 20  jsonTreeModule  
108b0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
108c0 20 20 7d 3b 0a 23 65 6e 64 69 66 0a 20 20 66 6f    };.#endif.  fo
108d0 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
108e0 61 46 75 6e 63 29 2f 73 69 7a 65 6f 66 28 61 46  aFunc)/sizeof(aF
108f0 75 6e 63 5b 30 5d 29 20 26 26 20 72 63 3d 3d 53  unc[0]) && rc==S
10900 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a  QLITE_OK; i++){.
10910 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10920 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
10930 28 64 62 2c 20 61 46 75 6e 63 5b 69 5d 2e 7a 4e  (db, aFunc[i].zN
10940 61 6d 65 2c 20 61 46 75 6e 63 5b 69 5d 2e 6e 41  ame, aFunc[i].nA
10950 72 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rg,.            
10960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10970 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38       SQLITE_UTF8
10980 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
10990 49 4e 49 53 54 49 43 2c 20 0a 20 20 20 20 20 20  INISTIC, .      
109a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109b0 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
109c0 2a 29 26 61 46 75 6e 63 5b 69 5d 2e 66 6c 61 67  *)&aFunc[i].flag
109d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
109e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109f0 20 20 20 61 46 75 6e 63 5b 69 5d 2e 78 46 75 6e     aFunc[i].xFun
10a00 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  c, 0, 0);.  }.  
10a10 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
10a20 66 28 61 41 67 67 29 2f 73 69 7a 65 6f 66 28 61  f(aAgg)/sizeof(a
10a30 41 67 67 5b 30 5d 29 20 26 26 20 72 63 3d 3d 53  Agg[0]) && rc==S
10a40 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a  QLITE_OK; i++){.
10a50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10a60 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
10a70 28 64 62 2c 20 61 41 67 67 5b 69 5d 2e 7a 4e 61  (db, aAgg[i].zNa
10a80 6d 65 2c 20 61 41 67 67 5b 69 5d 2e 6e 41 72 67  me, aAgg[i].nArg
10a90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
10aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ab0 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20 7c     SQLITE_UTF8 |
10ac0 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
10ad0 49 53 54 49 43 2c 20 30 2c 0a 20 20 20 20 20 20  ISTIC, 0,.      
10ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10af0 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 61 41             0, aA
10b00 67 67 5b 69 5d 2e 78 53 74 65 70 2c 20 61 41 67  gg[i].xStep, aAg
10b10 67 5b 69 5d 2e 78 46 69 6e 61 6c 29 3b 0a 20 20  g[i].xFinal);.  
10b20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
10b30 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
10b40 4c 45 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  LE.  for(i=0; i<
10b50 73 69 7a 65 6f 66 28 61 4d 6f 64 29 2f 73 69 7a  sizeof(aMod)/siz
10b60 65 6f 66 28 61 4d 6f 64 5b 30 5d 29 20 26 26 20  eof(aMod[0]) && 
10b70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
10b80 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ++){.    rc = sq
10b90 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 6d 6f 64  lite3_create_mod
10ba0 75 6c 65 28 64 62 2c 20 61 4d 6f 64 5b 69 5d 2e  ule(db, aMod[i].
10bb0 7a 4e 61 6d 65 2c 20 61 4d 6f 64 5b 69 5d 2e 70  zName, aMod[i].p
10bc0 4d 6f 64 75 6c 65 2c 20 30 29 3b 0a 20 20 7d 0a  Module, 0);.  }.
10bd0 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
10be0 72 63 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20  rc;.}...#ifndef 
10bf0 53 51 4c 49 54 45 5f 43 4f 52 45 0a 23 69 66 64  SQLITE_CORE.#ifd
10c00 65 66 20 5f 57 49 4e 33 32 0a 5f 5f 64 65 63 6c  ef _WIN32.__decl
10c10 73 70 65 63 28 64 6c 6c 65 78 70 6f 72 74 29 0a  spec(dllexport).
10c20 23 65 6e 64 69 66 0a 69 6e 74 20 73 71 6c 69 74  #endif.int sqlit
10c30 65 33 5f 6a 73 6f 6e 5f 69 6e 69 74 28 0a 20 20  e3_json_init(.  
10c40 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
10c50 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 2c  char **pzErrMsg,
10c60 20 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65   .  const sqlite
10c70 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 20 2a  3_api_routines *
10c80 70 41 70 69 0a 29 7b 0a 20 20 53 51 4c 49 54 45  pApi.){.  SQLITE
10c90 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54 32  _EXTENSION_INIT2
10ca0 28 70 41 70 69 29 3b 0a 20 20 28 76 6f 69 64 29  (pApi);.  (void)
10cb0 70 7a 45 72 72 4d 73 67 3b 20 20 2f 2a 20 55 6e  pzErrMsg;  /* Un
10cc0 75 73 65 64 20 70 61 72 61 6d 65 74 65 72 20 2a  used parameter *
10cd0 2f 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  /.  return sqlit
10ce0 65 33 4a 73 6f 6e 31 49 6e 69 74 28 64 62 29 3b  e3Json1Init(db);
10cf0 0a 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66  .}.#endif.#endif
10d00 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
10d10 49 54 45 5f 43 4f 52 45 29 20 7c 7c 20 64 65 66  ITE_CORE) || def
10d20 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
10d30 4c 45 5f 4a 53 4f 4e 31 29 20 2a 2f 0a           LE_JSON1) */.