/ Hex Artifact Content
Login

Artifact 933ace99a1880e014f35fbf6444fb24e3cf9920c3a6a75e9aa70f0caf683e3fe:


0000: 2f 2a 0a 2a 2a 20 32 30 31 35 2d 30 38 2d 31 32  /*.** 2015-08-12
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ****.**.** This 
0180: 53 51 4c 69 74 65 20 65 78 74 65 6e 73 69 6f 6e  SQLite extension
0190: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 4a 53 4f 4e   implements JSON
01a0: 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68 65   functions.  The
01b0: 20 69 6e 74 65 72 66 61 63 65 20 69 73 0a 2a 2a   interface is.**
01c0: 20 6d 6f 64 65 6c 65 64 20 61 66 74 65 72 20 4d   modeled after M
01d0: 79 53 51 4c 20 4a 53 4f 4e 20 66 75 6e 63 74 69  ySQL JSON functi
01e0: 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 68  ons:.**.**     h
01f0: 74 74 70 73 3a 2f 2f 64 65 76 2e 6d 79 73 71 6c  ttps://dev.mysql
0200: 2e 63 6f 6d 2f 64 6f 63 2f 72 65 66 6d 61 6e 2f  .com/doc/refman/
0210: 35 2e 37 2f 65 6e 2f 6a 73 6f 6e 2e 68 74 6d 6c  5.7/en/json.html
0220: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 74  .**.** For the t
0230: 69 6d 65 20 62 65 69 6e 67 2c 20 61 6c 6c 20 4a  ime being, all J
0240: 53 4f 4e 20 69 73 20 73 74 6f 72 65 64 20 61 73  SON is stored as
0250: 20 70 75 72 65 20 74 65 78 74 2e 20 20 28 57 65   pure text.  (We
0260: 20 6d 69 67 68 74 20 61 64 64 0a 2a 2a 20 61 20   might add.** a 
0270: 4a 53 4f 4e 42 20 74 79 70 65 20 69 6e 20 74 68  JSONB type in th
0280: 65 20 66 75 74 75 72 65 20 77 68 69 63 68 20 73  e future which s
0290: 74 6f 72 65 73 20 61 20 62 69 6e 61 72 79 20 65  tores a binary e
02a0: 6e 63 6f 64 69 6e 67 20 6f 66 20 4a 53 4f 4e 20  ncoding of JSON 
02b0: 69 6e 0a 2a 2a 20 61 20 42 4c 4f 42 2c 20 62 75  in.** a BLOB, bu
02c0: 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75  t there is no su
02d0: 70 70 6f 72 74 20 66 6f 72 20 4a 53 4f 4e 42 20  pport for JSONB 
02e0: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  in the current i
02f0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a  mplementation..*
0300: 2a 20 54 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74  * This implement
0310: 61 74 69 6f 6e 20 70 61 72 73 65 73 20 4a 53 4f  ation parses JSO
0320: 4e 20 74 65 78 74 20 61 74 20 32 35 30 20 4d 42  N text at 250 MB
0330: 2f 73 2c 20 73 6f 20 69 74 20 69 73 20 68 61 72  /s, so it is har
0340: 64 20 74 6f 20 73 65 65 0a 2a 2a 20 68 6f 77 20  d to see.** how 
0350: 4a 53 4f 4e 42 20 6d 69 67 68 74 20 69 6d 70 72  JSONB might impr
0360: 6f 76 65 20 6f 6e 20 74 68 61 74 2e 29 0a 2a 2f  ove on that.).*/
0370: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
0380: 4c 49 54 45 5f 43 4f 52 45 29 20 7c 7c 20 64 65  LITE_CORE) || de
0390: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
03a0: 42 4c 45 5f 4a 53 4f 4e 31 29 0a 23 69 66 20 21  BLE_JSON1).#if !
03b0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 49 4e  defined(SQLITEIN
03c0: 54 5f 48 29 0a 23 69 6e 63 6c 75 64 65 20 22 73  T_H).#include "s
03d0: 71 6c 69 74 65 33 65 78 74 2e 68 22 0a 23 65 6e  qlite3ext.h".#en
03e0: 64 69 66 0a 53 51 4c 49 54 45 5f 45 58 54 45 4e  dif.SQLITE_EXTEN
03f0: 53 49 4f 4e 5f 49 4e 49 54 31 0a 23 69 6e 63 6c  SION_INIT1.#incl
0400: 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23  ude <assert.h>.#
0410: 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e  include <string.
0420: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  h>.#include <std
0430: 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  lib.h>.#include 
0440: 3c 73 74 64 61 72 67 2e 68 3e 0a 0a 2f 2a 20 4d  <stdarg.h>../* M
0450: 61 72 6b 20 61 20 66 75 6e 63 74 69 6f 6e 20 70  ark a function p
0460: 61 72 61 6d 65 74 65 72 20 61 73 20 75 6e 75 73  arameter as unus
0470: 65 64 2c 20 74 6f 20 73 75 70 70 72 65 73 73 20  ed, to suppress 
0480: 6e 75 69 73 61 6e 63 65 20 63 6f 6d 70 69 6c 65  nuisance compile
0490: 72 0a 2a 2a 20 77 61 72 6e 69 6e 67 73 2e 20 2a  r.** warnings. *
04a0: 2f 0a 23 69 66 6e 64 65 66 20 55 4e 55 53 45 44  /.#ifndef UNUSED
04b0: 5f 50 41 52 41 4d 0a 23 20 64 65 66 69 6e 65 20  _PARAM.# define 
04c0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 58 29 20  UNUSED_PARAM(X) 
04d0: 20 28 76 6f 69 64 29 28 58 29 0a 23 65 6e 64 69   (void)(X).#endi
04e0: 66 0a 0a 23 69 66 6e 64 65 66 20 4c 41 52 47 45  f..#ifndef LARGE
04f0: 53 54 5f 49 4e 54 36 34 0a 23 20 64 65 66 69 6e  ST_INT64.# defin
0500: 65 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 20  e LARGEST_INT64 
0510: 20 28 30 78 66 66 66 66 66 66 66 66 7c 28 28 28   (0xffffffff|(((
0520: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 30 78  sqlite3_int64)0x
0530: 37 66 66 66 66 66 66 66 29 3c 3c 33 32 29 29 0a  7fffffff)<<32)).
0540: 23 20 64 65 66 69 6e 65 20 53 4d 41 4c 4c 45 53  # define SMALLES
0550: 54 5f 49 4e 54 36 34 20 28 28 28 73 71 6c 69 74  T_INT64 (((sqlit
0560: 65 33 5f 69 6e 74 36 34 29 2d 31 29 20 2d 20 4c  e3_int64)-1) - L
0570: 41 52 47 45 53 54 5f 49 4e 54 36 34 29 0a 23 65  ARGEST_INT64).#e
0580: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 73  ndif../*.** Vers
0590: 69 6f 6e 73 20 6f 66 20 69 73 73 70 61 63 65 28  ions of isspace(
05a0: 29 2c 20 69 73 61 6c 6e 75 6d 28 29 20 61 6e 64  ), isalnum() and
05b0: 20 69 73 64 69 67 69 74 28 29 20 74 6f 20 77 68   isdigit() to wh
05c0: 69 63 68 20 69 74 20 69 73 20 73 61 66 65 0a 2a  ich it is safe.*
05d0: 2a 20 74 6f 20 70 61 73 73 20 73 69 67 6e 65 64  * to pass signed
05e0: 20 63 68 61 72 20 76 61 6c 75 65 73 2e 0a 2a 2f   char values..*/
05f0: 0a 23 69 66 64 65 66 20 73 71 6c 69 74 65 33 49  .#ifdef sqlite3I
0600: 73 64 69 67 69 74 0a 20 20 20 2f 2a 20 55 73 65  sdigit.   /* Use
0610: 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65   the SQLite core
0620: 20 76 65 72 73 69 6f 6e 73 20 69 66 20 74 68 69   versions if thi
0630: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72  s routine is par
0640: 74 20 6f 66 20 74 68 65 0a 20 20 20 2a 2a 20 53  t of the.   ** S
0650: 51 4c 69 74 65 20 61 6d 61 6c 67 61 6d 61 74 69  QLite amalgamati
0660: 6f 6e 20 2a 2f 0a 23 20 20 64 65 66 69 6e 65 20  on */.#  define 
0670: 73 61 66 65 5f 69 73 64 69 67 69 74 28 78 29 20  safe_isdigit(x) 
0680: 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28   sqlite3Isdigit(
0690: 78 29 0a 23 20 20 64 65 66 69 6e 65 20 73 61 66  x).#  define saf
06a0: 65 5f 69 73 61 6c 6e 75 6d 28 78 29 20 20 73 71  e_isalnum(x)  sq
06b0: 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 78 29 0a  lite3Isalnum(x).
06c0: 23 20 20 64 65 66 69 6e 65 20 73 61 66 65 5f 69  #  define safe_i
06d0: 73 78 64 69 67 69 74 28 78 29 20 73 71 6c 69 74  sxdigit(x) sqlit
06e0: 65 33 49 73 78 64 69 67 69 74 28 78 29 0a 23 65  e3Isxdigit(x).#e
06f0: 6c 73 65 0a 20 20 20 2f 2a 20 55 73 65 20 74 68  lse.   /* Use th
0700: 65 20 73 74 61 6e 64 61 72 64 20 6c 69 62 72 61  e standard libra
0710: 72 79 20 66 6f 72 20 73 65 70 61 72 61 74 65 20  ry for separate 
0720: 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 2a 2f 0a 23  compilation */.#
0730: 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68  include <ctype.h
0740: 3e 20 20 2f 2a 20 61 6d 61 6c 67 61 6d 61 74 6f  >  /* amalgamato
0750: 72 3a 20 6b 65 65 70 20 2a 2f 0a 23 20 20 64 65  r: keep */.#  de
0760: 66 69 6e 65 20 73 61 66 65 5f 69 73 64 69 67 69  fine safe_isdigi
0770: 74 28 78 29 20 20 69 73 64 69 67 69 74 28 28 75  t(x)  isdigit((u
0780: 6e 73 69 67 6e 65 64 20 63 68 61 72 29 28 78 29  nsigned char)(x)
0790: 29 0a 23 20 20 64 65 66 69 6e 65 20 73 61 66 65  ).#  define safe
07a0: 5f 69 73 61 6c 6e 75 6d 28 78 29 20 20 69 73 61  _isalnum(x)  isa
07b0: 6c 6e 75 6d 28 28 75 6e 73 69 67 6e 65 64 20 63  lnum((unsigned c
07c0: 68 61 72 29 28 78 29 29 0a 23 20 20 64 65 66 69  har)(x)).#  defi
07d0: 6e 65 20 73 61 66 65 5f 69 73 78 64 69 67 69 74  ne safe_isxdigit
07e0: 28 78 29 20 69 73 78 64 69 67 69 74 28 28 75 6e  (x) isxdigit((un
07f0: 73 69 67 6e 65 64 20 63 68 61 72 29 28 78 29 29  signed char)(x))
0800: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
0810: 72 6f 77 69 6e 67 20 6f 75 72 20 6f 77 6e 20 69  rowing our own i
0820: 73 73 70 61 63 65 28 29 20 72 6f 75 74 69 6e 65  sspace() routine
0830: 20 74 68 69 73 20 77 61 79 20 69 73 20 74 77 69   this way is twi
0840: 63 65 20 61 73 20 66 61 73 74 20 61 73 0a 2a 2a  ce as fast as.**
0850: 20 74 68 65 20 6c 69 62 72 61 72 79 20 69 73 73   the library iss
0860: 70 61 63 65 28 29 20 66 75 6e 63 74 69 6f 6e 2c  pace() function,
0870: 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 20   resulting in a 
0880: 37 25 20 6f 76 65 72 61 6c 6c 20 70 65 72 66 6f  7% overall perfo
0890: 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 63 72 65 61  rmance.** increa
08a0: 73 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65  se for the parse
08b0: 72 2e 20 20 28 55 62 75 6e 74 75 31 34 2e 31 30  r.  (Ubuntu14.10
08c0: 20 67 63 63 20 34 2e 38 2e 34 20 78 36 34 20 77   gcc 4.8.4 x64 w
08d0: 69 74 68 20 2d 4f 73 29 2e 0a 2a 2f 0a 73 74 61  ith -Os)..*/.sta
08e0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6a  tic const char j
08f0: 73 6f 6e 49 73 53 70 61 63 65 5b 5d 20 3d 20 7b  sonIsSpace[] = {
0900: 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  .  0, 0, 0, 0, 0
0910: 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 20 20 30  , 0, 0, 0,     0
0920: 2c 20 31 2c 20 31 2c 20 30 2c 20 30 2c 20 31 2c  , 1, 1, 0, 0, 1,
0930: 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30   0, 0,.  0, 0, 0
0940: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0950: 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c       0, 0, 0, 0,
0960: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 31   0, 0, 0, 0,.  1
0970: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0980: 20 30 2c 20 30 2c 20 20 20 20 20 30 2c 20 30 2c   0, 0,     0, 0,
0990: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
09a0: 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  0,.  0, 0, 0, 0,
09b0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 20   0, 0, 0, 0,    
09c0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
09d0: 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c  0, 0, 0,.  0, 0,
09e0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
09f0: 30 2c 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20  0,     0, 0, 0, 
0a00: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  0, 0, 0, 0, 0,. 
0a10: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0a20: 30 2c 20 30 2c 20 30 2c 20 20 20 20 20 30 2c 20  0, 0, 0,     0, 
0a30: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0a40: 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20  , 0,.  0, 0, 0, 
0a50: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20  0, 0, 0, 0, 0,  
0a60: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
0a70: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20  , 0, 0, 0,.  0, 
0a80: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0a90: 2c 20 30 2c 20 20 20 20 20 30 2c 20 30 2c 20 30  , 0,     0, 0, 0
0aa0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0ab0: 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  .  0, 0, 0, 0, 0
0ac0: 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 20 20 30  , 0, 0, 0,     0
0ad0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0ae0: 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30   0, 0,.  0, 0, 0
0af0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0b00: 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c       0, 0, 0, 0,
0b10: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30   0, 0, 0, 0,.  0
0b20: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0b30: 20 30 2c 20 30 2c 20 20 20 20 20 30 2c 20 30 2c   0, 0,     0, 0,
0b40: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0b50: 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  0,.  0, 0, 0, 0,
0b60: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 20   0, 0, 0, 0,    
0b70: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0b80: 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c  0, 0, 0,.  0, 0,
0b90: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0ba0: 30 2c 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20  0,     0, 0, 0, 
0bb0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  0, 0, 0, 0, 0,. 
0bc0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0bd0: 30 2c 20 30 2c 20 30 2c 20 20 20 20 20 30 2c 20  0, 0, 0,     0, 
0be0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0bf0: 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20  , 0,.  0, 0, 0, 
0c00: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20  0, 0, 0, 0, 0,  
0c10: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
0c20: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20  , 0, 0, 0,.  0, 
0c30: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0c40: 2c 20 30 2c 20 20 20 20 20 30 2c 20 30 2c 20 30  , 0,     0, 0, 0
0c50: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0c60: 0a 7d 3b 0a 23 64 65 66 69 6e 65 20 73 61 66 65  .};.#define safe
0c70: 5f 69 73 73 70 61 63 65 28 78 29 20 28 6a 73 6f  _isspace(x) (jso
0c80: 6e 49 73 53 70 61 63 65 5b 28 75 6e 73 69 67 6e  nIsSpace[(unsign
0c90: 65 64 20 63 68 61 72 29 78 5d 29 0a 0a 23 69 66  ed char)x])..#if
0ca0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d 41 4c  ndef SQLITE_AMAL
0cb0: 47 41 4d 41 54 49 4f 4e 0a 20 20 2f 2a 20 55 6e  GAMATION.  /* Un
0cc0: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 74  signed integer t
0cd0: 79 70 65 73 2e 20 20 54 68 65 73 65 20 61 72 65  ypes.  These are
0ce0: 20 61 6c 72 65 61 64 79 20 64 65 66 69 6e 65 64   already defined
0cf0: 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 49 6e   in the sqliteIn
0d00: 74 2e 68 2c 0a 20 20 2a 2a 20 62 75 74 20 74 68  t.h,.  ** but th
0d10: 65 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6e 65  e definitions ne
0d20: 65 64 20 74 6f 20 62 65 20 72 65 70 65 61 74 65  ed to be repeate
0d30: 64 20 66 6f 72 20 73 65 70 61 72 61 74 65 20 63  d for separate c
0d40: 6f 6d 70 69 6c 61 74 69 6f 6e 2e 20 2a 2f 0a 20  ompilation. */. 
0d50: 20 74 79 70 65 64 65 66 20 73 71 6c 69 74 65 33   typedef sqlite3
0d60: 5f 75 69 6e 74 36 34 20 75 36 34 3b 0a 20 20 74  _uint64 u64;.  t
0d70: 79 70 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20  ypedef unsigned 
0d80: 69 6e 74 20 75 33 32 3b 0a 20 20 74 79 70 65 64  int u32;.  typed
0d90: 65 66 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72  ef unsigned shor
0da0: 74 20 69 6e 74 20 75 31 36 3b 0a 20 20 74 79 70  t int u16;.  typ
0db0: 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20 63 68  edef unsigned ch
0dc0: 61 72 20 75 38 3b 0a 23 65 6e 64 69 66 0a 0a 2f  ar u8;.#endif../
0dd0: 2a 20 4f 62 6a 65 63 74 73 20 2a 2f 0a 74 79 70  * Objects */.typ
0de0: 65 64 65 66 20 73 74 72 75 63 74 20 4a 73 6f 6e  edef struct Json
0df0: 53 74 72 69 6e 67 20 4a 73 6f 6e 53 74 72 69 6e  String JsonStrin
0e00: 67 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  g;.typedef struc
0e10: 74 20 4a 73 6f 6e 4e 6f 64 65 20 4a 73 6f 6e 4e  t JsonNode JsonN
0e20: 6f 64 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ode;.typedef str
0e30: 75 63 74 20 4a 73 6f 6e 50 61 72 73 65 20 4a 73  uct JsonParse Js
0e40: 6f 6e 50 61 72 73 65 3b 0a 0a 2f 2a 20 41 6e 20  onParse;../* An 
0e50: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
0e60: 20 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e   object represen
0e70: 74 73 20 61 20 4a 53 4f 4e 20 73 74 72 69 6e 67  ts a JSON string
0e80: 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  .** under constr
0e90: 75 63 74 69 6f 6e 2e 20 20 52 65 61 6c 6c 79 2c  uction.  Really,
0ea0: 20 74 68 69 73 20 69 73 20 61 20 67 65 6e 65 72   this is a gener
0eb0: 69 63 20 73 74 72 69 6e 67 20 61 63 63 75 6d 75  ic string accumu
0ec0: 6c 61 74 6f 72 0a 2a 2a 20 74 68 61 74 20 63 61  lator.** that ca
0ed0: 6e 20 62 65 20 61 6e 64 20 69 73 20 75 73 65 64  n be and is used
0ee0: 20 74 6f 20 63 72 65 61 74 65 20 73 74 72 69 6e   to create strin
0ef0: 67 73 20 6f 74 68 65 72 20 74 68 61 6e 20 4a 53  gs other than JS
0f00: 4f 4e 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 4a 73  ON..*/.struct Js
0f10: 6f 6e 53 74 72 69 6e 67 20 7b 0a 20 20 73 71 6c  onString {.  sql
0f20: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
0f30: 74 78 3b 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f  tx;   /* Functio
0f40: 6e 20 63 6f 6e 74 65 78 74 20 2d 20 70 75 74 20  n context - put 
0f50: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 68  error messages h
0f60: 65 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ere */.  char *z
0f70: 42 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Buf;            
0f80: 20 20 2f 2a 20 41 70 70 65 6e 64 20 4a 53 4f 4e    /* Append JSON
0f90: 20 63 6f 6e 74 65 6e 74 20 68 65 72 65 20 2a 2f   content here */
0fa0: 0a 20 20 75 36 34 20 6e 41 6c 6c 6f 63 3b 20 20  .  u64 nAlloc;  
0fb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
0fc0: 79 74 65 73 20 6f 66 20 73 74 6f 72 61 67 65 20  ytes of storage 
0fd0: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 7a 42 75  available in zBu
0fe0: 66 5b 5d 20 2a 2f 0a 20 20 75 36 34 20 6e 55 73  f[] */.  u64 nUs
0ff0: 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
1000: 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 7a 42    /* Bytes of zB
1010: 75 66 5b 5d 20 63 75 72 72 65 6e 74 6c 79 20 75  uf[] currently u
1020: 73 65 64 20 2a 2f 0a 20 20 75 38 20 62 53 74 61  sed */.  u8 bSta
1030: 74 69 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  tic;            
1040: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 7a 42 75    /* True if zBu
1050: 66 20 69 73 20 73 74 61 74 69 63 20 73 70 61 63  f is static spac
1060: 65 20 2a 2f 0a 20 20 75 38 20 62 45 72 72 3b 20  e */.  u8 bErr; 
1070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1080: 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 65 72  /* True if an er
1090: 72 6f 72 20 68 61 73 20 62 65 65 6e 20 65 6e 63  ror has been enc
10a0: 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20 63 68  ountered */.  ch
10b0: 61 72 20 7a 53 70 61 63 65 5b 31 30 30 5d 3b 20  ar zSpace[100]; 
10c0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
10d0: 6c 20 73 74 61 74 69 63 20 73 70 61 63 65 20 2a  l static space *
10e0: 2f 0a 7d 3b 0a 0a 2f 2a 20 4a 53 4f 4e 20 74 79  /.};../* JSON ty
10f0: 70 65 20 76 61 6c 75 65 73 0a 2a 2f 0a 23 64 65  pe values.*/.#de
1100: 66 69 6e 65 20 4a 53 4f 4e 5f 4e 55 4c 4c 20 20  fine JSON_NULL  
1110: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 4a 53 4f     0.#define JSO
1120: 4e 5f 54 52 55 45 20 20 20 20 20 31 0a 23 64 65  N_TRUE     1.#de
1130: 66 69 6e 65 20 4a 53 4f 4e 5f 46 41 4c 53 45 20  fine JSON_FALSE 
1140: 20 20 20 32 0a 23 64 65 66 69 6e 65 20 4a 53 4f     2.#define JSO
1150: 4e 5f 49 4e 54 20 20 20 20 20 20 33 0a 23 64 65  N_INT      3.#de
1160: 66 69 6e 65 20 4a 53 4f 4e 5f 52 45 41 4c 20 20  fine JSON_REAL  
1170: 20 20 20 34 0a 23 64 65 66 69 6e 65 20 4a 53 4f     4.#define JSO
1180: 4e 5f 53 54 52 49 4e 47 20 20 20 35 0a 23 64 65  N_STRING   5.#de
1190: 66 69 6e 65 20 4a 53 4f 4e 5f 41 52 52 41 59 20  fine JSON_ARRAY 
11a0: 20 20 20 36 0a 23 64 65 66 69 6e 65 20 4a 53 4f     6.#define JSO
11b0: 4e 5f 4f 42 4a 45 43 54 20 20 20 37 0a 0a 2f 2a  N_OBJECT   7../*
11c0: 20 54 68 65 20 22 73 75 62 74 79 70 65 22 20 73   The "subtype" s
11d0: 65 74 20 66 6f 72 20 4a 53 4f 4e 20 76 61 6c 75  et for JSON valu
11e0: 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 53  es */.#define JS
11f0: 4f 4e 5f 53 55 42 54 59 50 45 20 20 37 34 20 20  ON_SUBTYPE  74  
1200: 20 20 2f 2a 20 41 73 63 69 69 20 66 6f 72 20 22    /* Ascii for "
1210: 4a 22 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d  J" */../*.** Nam
1220: 65 73 20 6f 66 20 74 68 65 20 76 61 72 69 6f 75  es of the variou
1230: 73 20 4a 53 4f 4e 20 74 79 70 65 73 3a 0a 2a 2f  s JSON types:.*/
1240: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
1250: 61 72 20 2a 20 63 6f 6e 73 74 20 6a 73 6f 6e 54  ar * const jsonT
1260: 79 70 65 5b 5d 20 3d 20 7b 0a 20 20 22 6e 75 6c  ype[] = {.  "nul
1270: 6c 22 2c 20 22 74 72 75 65 22 2c 20 22 66 61 6c  l", "true", "fal
1280: 73 65 22 2c 20 22 69 6e 74 65 67 65 72 22 2c 20  se", "integer", 
1290: 22 72 65 61 6c 22 2c 20 22 74 65 78 74 22 2c 20  "real", "text", 
12a0: 22 61 72 72 61 79 22 2c 20 22 6f 62 6a 65 63 74  "array", "object
12b0: 22 0a 7d 3b 0a 0a 2f 2a 20 42 69 74 20 76 61 6c  ".};../* Bit val
12c0: 75 65 73 20 66 6f 72 20 74 68 65 20 4a 73 6f 6e  ues for the Json
12d0: 4e 6f 64 65 2e 6a 6e 46 6c 61 67 20 66 69 65 6c  Node.jnFlag fiel
12e0: 64 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4e 4f  d.*/.#define JNO
12f0: 44 45 5f 52 41 57 20 20 20 20 20 30 78 30 31 20  DE_RAW     0x01 
1300: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
1310: 6e 74 20 69 73 20 72 61 77 2c 20 6e 6f 74 20 4a  nt is raw, not J
1320: 53 4f 4e 20 65 6e 63 6f 64 65 64 20 2a 2f 0a 23  SON encoded */.#
1330: 64 65 66 69 6e 65 20 4a 4e 4f 44 45 5f 45 53 43  define JNODE_ESC
1340: 41 50 45 20 20 30 78 30 32 20 20 20 20 20 20 20  APE  0x02       
1350: 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 69 73 20    /* Content is 
1360: 74 65 78 74 20 77 69 74 68 20 5c 20 65 73 63 61  text with \ esca
1370: 70 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4a  pes */.#define J
1380: 4e 4f 44 45 5f 52 45 4d 4f 56 45 20 20 30 78 30  NODE_REMOVE  0x0
1390: 34 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20  4         /* Do 
13a0: 6e 6f 74 20 6f 75 74 70 75 74 20 2a 2f 0a 23 64  not output */.#d
13b0: 65 66 69 6e 65 20 4a 4e 4f 44 45 5f 52 45 50 4c  efine JNODE_REPL
13c0: 41 43 45 20 30 78 30 38 20 20 20 20 20 20 20 20  ACE 0x08        
13d0: 20 2f 2a 20 52 65 70 6c 61 63 65 20 77 69 74 68   /* Replace with
13e0: 20 4a 73 6f 6e 4e 6f 64 65 2e 75 2e 69 52 65 70   JsonNode.u.iRep
13f0: 6c 61 63 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  lace */.#define 
1400: 4a 4e 4f 44 45 5f 50 41 54 43 48 20 20 20 30 78  JNODE_PATCH   0x
1410: 31 30 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  10         /* Pa
1420: 74 63 68 20 77 69 74 68 20 4a 73 6f 6e 4e 6f 64  tch with JsonNod
1430: 65 2e 75 2e 70 50 61 74 63 68 20 2a 2f 0a 23 64  e.u.pPatch */.#d
1440: 65 66 69 6e 65 20 4a 4e 4f 44 45 5f 41 50 50 45  efine JNODE_APPE
1450: 4e 44 20 20 30 78 32 30 20 20 20 20 20 20 20 20  ND  0x20        
1460: 20 2f 2a 20 4d 6f 72 65 20 41 52 52 41 59 2f 4f   /* More ARRAY/O
1470: 42 4a 45 43 54 20 65 6e 74 72 69 65 73 20 61 74  BJECT entries at
1480: 20 75 2e 69 41 70 70 65 6e 64 20 2a 2f 0a 23 64   u.iAppend */.#d
1490: 65 66 69 6e 65 20 4a 4e 4f 44 45 5f 4c 41 42 45  efine JNODE_LABE
14a0: 4c 20 20 20 30 78 34 30 20 20 20 20 20 20 20 20  L   0x40        
14b0: 20 2f 2a 20 49 73 20 61 20 6c 61 62 65 6c 20 6f   /* Is a label o
14c0: 66 20 61 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a  f an object */..
14d0: 0a 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6e 6f 64  ./* A single nod
14e0: 65 20 6f 66 20 70 61 72 73 65 64 20 4a 53 4f 4e  e of parsed JSON
14f0: 0a 2a 2f 0a 73 74 72 75 63 74 20 4a 73 6f 6e 4e  .*/.struct JsonN
1500: 6f 64 65 20 7b 0a 20 20 75 38 20 65 54 79 70 65  ode {.  u8 eType
1510: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1520: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 4a 53 4f  * One of the JSO
1530: 4e 5f 20 74 79 70 65 20 76 61 6c 75 65 73 20 2a  N_ type values *
1540: 2f 0a 20 20 75 38 20 6a 6e 46 6c 61 67 73 3b 20  /.  u8 jnFlags; 
1550: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 4e             /* JN
1560: 4f 44 45 20 66 6c 61 67 73 20 2a 2f 0a 20 20 75  ODE flags */.  u
1570: 33 32 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  32 n;           
1580: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
1590: 66 20 63 6f 6e 74 65 6e 74 2c 20 6f 72 20 6e 75  f content, or nu
15a0: 6d 62 65 72 20 6f 66 20 73 75 62 2d 6e 6f 64 65  mber of sub-node
15b0: 73 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20  s */.  union {. 
15c0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
15d0: 4a 43 6f 6e 74 65 6e 74 3b 20 2f 2a 20 43 6f 6e  JContent; /* Con
15e0: 74 65 6e 74 20 66 6f 72 20 49 4e 54 2c 20 52 45  tent for INT, RE
15f0: 41 4c 2c 20 61 6e 64 20 53 54 52 49 4e 47 20 2a  AL, and STRING *
1600: 2f 0a 20 20 20 20 75 33 32 20 69 41 70 70 65 6e  /.    u32 iAppen
1610: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
1620: 4d 6f 72 65 20 74 65 72 6d 73 20 66 6f 72 20 41  More terms for A
1630: 52 52 41 59 20 61 6e 64 20 4f 42 4a 45 43 54 20  RRAY and OBJECT 
1640: 2a 2f 0a 20 20 20 20 75 33 32 20 69 4b 65 79 3b  */.    u32 iKey;
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1660: 20 4b 65 79 20 66 6f 72 20 41 52 52 41 59 20 6f   Key for ARRAY o
1670: 62 6a 65 63 74 73 20 69 6e 20 6a 73 6f 6e 5f 74  bjects in json_t
1680: 72 65 65 28 29 20 2a 2f 0a 20 20 20 20 75 33 32  ree() */.    u32
1690: 20 69 52 65 70 6c 61 63 65 3b 20 20 20 20 20 20   iReplace;      
16a0: 20 20 20 20 2f 2a 20 52 65 70 6c 61 63 65 6d 65      /* Replaceme
16b0: 6e 74 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 4a  nt content for J
16c0: 4e 4f 44 45 5f 52 45 50 4c 41 43 45 20 2a 2f 0a  NODE_REPLACE */.
16d0: 20 20 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 50      JsonNode *pP
16e0: 61 74 63 68 3b 20 20 20 20 20 20 2f 2a 20 4e 6f  atch;      /* No
16f0: 64 65 20 63 68 61 69 6e 20 6f 66 20 70 61 74 63  de chain of patc
1700: 68 20 66 6f 72 20 4a 4e 4f 44 45 5f 50 41 54 43  h for JNODE_PATC
1710: 48 20 2a 2f 0a 20 20 7d 20 75 3b 0a 7d 3b 0a 0a  H */.  } u;.};..
1720: 2f 2a 20 41 20 63 6f 6d 70 6c 65 74 65 6c 79 20  /* A completely 
1730: 70 61 72 73 65 64 20 4a 53 4f 4e 20 73 74 72 69  parsed JSON stri
1740: 6e 67 0a 2a 2f 0a 73 74 72 75 63 74 20 4a 73 6f  ng.*/.struct Jso
1750: 6e 50 61 72 73 65 20 7b 0a 20 20 75 33 32 20 6e  nParse {.  u32 n
1760: 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Node;         /*
1770: 20 4e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73   Number of slots
1780: 20 6f 66 20 61 4e 6f 64 65 5b 5d 20 75 73 65 64   of aNode[] used
1790: 20 2a 2f 0a 20 20 75 33 32 20 6e 41 6c 6c 6f 63   */.  u32 nAlloc
17a0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ;        /* Numb
17b0: 65 72 20 6f 66 20 73 6c 6f 74 73 20 6f 66 20 61  er of slots of a
17c0: 4e 6f 64 65 5b 5d 20 61 6c 6c 6f 63 61 74 65 64  Node[] allocated
17d0: 20 2a 2f 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a   */.  JsonNode *
17e0: 61 4e 6f 64 65 3b 20 20 20 2f 2a 20 41 72 72 61  aNode;   /* Arra
17f0: 79 20 6f 66 20 6e 6f 64 65 73 20 63 6f 6e 74 61  y of nodes conta
1800: 69 6e 69 6e 67 20 74 68 65 20 70 61 72 73 65 20  ining the parse 
1810: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1820: 2a 7a 4a 73 6f 6e 3b 20 2f 2a 20 4f 72 69 67 69  *zJson; /* Origi
1830: 6e 61 6c 20 4a 53 4f 4e 20 73 74 72 69 6e 67 20  nal JSON string 
1840: 2a 2f 0a 20 20 75 33 32 20 2a 61 55 70 3b 20 20  */.  u32 *aUp;  
1850: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1860: 20 6f 66 20 70 61 72 65 6e 74 20 6f 66 20 65 61   of parent of ea
1870: 63 68 20 6e 6f 64 65 20 2a 2f 0a 20 20 75 38 20  ch node */.  u8 
1880: 6f 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  oom;            
1890: 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20 69  /* Set to true i
18a0: 66 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20  f out of memory 
18b0: 2a 2f 0a 20 20 75 38 20 6e 45 72 72 3b 20 20 20  */.  u8 nErr;   
18c0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
18d0: 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e  r of errors seen
18e0: 20 2a 2f 0a 20 20 75 31 36 20 69 44 65 70 74 68   */.  u16 iDepth
18f0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 73 74  ;        /* Nest
1900: 69 6e 67 20 64 65 70 74 68 20 2a 2f 0a 20 20 69  ing depth */.  i
1910: 6e 74 20 6e 4a 73 6f 6e 3b 20 20 20 20 20 20 20  nt nJson;       
1920: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74    /* Length of t
1930: 68 65 20 7a 4a 73 6f 6e 20 73 74 72 69 6e 67 20  he zJson string 
1940: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 7d 3b 0a 0a  in bytes */.};..
1950: 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 6e 65  /*.** Maximum ne
1960: 73 74 69 6e 67 20 64 65 70 74 68 20 6f 66 20 4a  sting depth of J
1970: 53 4f 4e 20 66 6f 72 20 74 68 69 73 20 69 6d 70  SON for this imp
1980: 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2a 0a  lementation..**.
1990: 2a 2a 20 54 68 69 73 20 6c 69 6d 69 74 20 69 73  ** This limit is
19a0: 20 6e 65 65 64 65 64 20 74 6f 20 61 76 6f 69 64   needed to avoid
19b0: 20 61 20 73 74 61 63 6b 20 6f 76 65 72 66 6c 6f   a stack overflo
19c0: 77 20 69 6e 20 74 68 65 20 72 65 63 75 72 73 69  w in the recursi
19d0: 76 65 0a 2a 2a 20 64 65 73 63 65 6e 74 20 70 61  ve.** descent pa
19e0: 72 73 65 72 2e 20 20 41 20 64 65 70 74 68 20 6f  rser.  A depth o
19f0: 66 20 32 30 30 30 20 69 73 20 66 61 72 20 64 65  f 2000 is far de
1a00: 65 70 65 72 20 74 68 61 6e 20 61 6e 79 20 73 61  eper than any sa
1a10: 6e 65 20 4a 53 4f 4e 0a 2a 2a 20 73 68 6f 75 6c  ne JSON.** shoul
1a20: 64 20 67 6f 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  d go..*/.#define
1a30: 20 4a 53 4f 4e 5f 4d 41 58 5f 44 45 50 54 48 20   JSON_MAX_DEPTH 
1a40: 20 32 30 30 30 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   2000../********
1a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a90: 2a 2a 0a 2a 2a 20 55 74 69 6c 69 74 79 20 72 6f  **.** Utility ro
1aa0: 75 74 69 6e 65 73 20 66 6f 72 20 64 65 61 6c 69  utines for deali
1ab0: 6e 67 20 77 69 74 68 20 4a 73 6f 6e 53 74 72 69  ng with JsonStri
1ac0: 6e 67 20 6f 62 6a 65 63 74 73 0a 2a 2a 2a 2a 2a  ng objects.*****
1ad0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1af0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b10: 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 20 53 65 74 20 74  *****/../* Set t
1b20: 68 65 20 4a 73 6f 6e 53 74 72 69 6e 67 20 6f 62  he JsonString ob
1b30: 6a 65 63 74 20 74 6f 20 61 6e 20 65 6d 70 74 79  ject to an empty
1b40: 20 73 74 72 69 6e 67 0a 2a 2f 0a 73 74 61 74 69   string.*/.stati
1b50: 63 20 76 6f 69 64 20 6a 73 6f 6e 5a 65 72 6f 28  c void jsonZero(
1b60: 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70 29 7b 0a  JsonString *p){.
1b70: 20 20 70 2d 3e 7a 42 75 66 20 3d 20 70 2d 3e 7a    p->zBuf = p->z
1b80: 53 70 61 63 65 3b 0a 20 20 70 2d 3e 6e 41 6c 6c  Space;.  p->nAll
1b90: 6f 63 20 3d 20 73 69 7a 65 6f 66 28 70 2d 3e 7a  oc = sizeof(p->z
1ba0: 53 70 61 63 65 29 3b 0a 20 20 70 2d 3e 6e 55 73  Space);.  p->nUs
1bb0: 65 64 20 3d 20 30 3b 0a 20 20 70 2d 3e 62 53 74  ed = 0;.  p->bSt
1bc0: 61 74 69 63 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 20  atic = 1;.}../* 
1bd0: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4a  Initialize the J
1be0: 73 6f 6e 53 74 72 69 6e 67 20 6f 62 6a 65 63 74  sonString object
1bf0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1c00: 6a 73 6f 6e 49 6e 69 74 28 4a 73 6f 6e 53 74 72  jsonInit(JsonStr
1c10: 69 6e 67 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f  ing *p, sqlite3_
1c20: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a  context *pCtx){.
1c30: 20 20 70 2d 3e 70 43 74 78 20 3d 20 70 43 74 78    p->pCtx = pCtx
1c40: 3b 0a 20 20 70 2d 3e 62 45 72 72 20 3d 20 30 3b  ;.  p->bErr = 0;
1c50: 0a 20 20 6a 73 6f 6e 5a 65 72 6f 28 70 29 3b 0a  .  jsonZero(p);.
1c60: 7d 0a 0a 0a 2f 2a 20 46 72 65 65 20 61 6c 6c 20  }.../* Free all 
1c70: 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79  allocated memory
1c80: 20 61 6e 64 20 72 65 73 65 74 20 74 68 65 20 4a   and reset the J
1c90: 73 6f 6e 53 74 72 69 6e 67 20 6f 62 6a 65 63 74  sonString object
1ca0: 20 62 61 63 6b 20 74 6f 20 69 74 73 0a 2a 2a 20   back to its.** 
1cb0: 69 6e 69 74 69 61 6c 20 73 74 61 74 65 2e 0a 2a  initial state..*
1cc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73  /.static void js
1cd0: 6f 6e 52 65 73 65 74 28 4a 73 6f 6e 53 74 72 69  onReset(JsonStri
1ce0: 6e 67 20 2a 70 29 7b 0a 20 20 69 66 28 20 21 70  ng *p){.  if( !p
1cf0: 2d 3e 62 53 74 61 74 69 63 20 29 20 73 71 6c 69  ->bStatic ) sqli
1d00: 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 42 75 66  te3_free(p->zBuf
1d10: 29 3b 0a 20 20 6a 73 6f 6e 5a 65 72 6f 28 70 29  );.  jsonZero(p)
1d20: 3b 0a 7d 0a 0a 0a 2f 2a 20 52 65 70 6f 72 74 20  ;.}.../* Report 
1d30: 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79  an out-of-memory
1d40: 20 28 4f 4f 4d 29 20 63 6f 6e 64 69 74 69 6f 6e   (OOM) condition
1d50: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64   .*/.static void
1d60: 20 6a 73 6f 6e 4f 6f 6d 28 4a 73 6f 6e 53 74 72   jsonOom(JsonStr
1d70: 69 6e 67 20 2a 70 29 7b 0a 20 20 70 2d 3e 62 45  ing *p){.  p->bE
1d80: 72 72 20 3d 20 31 3b 0a 20 20 73 71 6c 69 74 65  rr = 1;.  sqlite
1d90: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e  3_result_error_n
1da0: 6f 6d 65 6d 28 70 2d 3e 70 43 74 78 29 3b 0a 20  omem(p->pCtx);. 
1db0: 20 6a 73 6f 6e 52 65 73 65 74 28 70 29 3b 0a 7d   jsonReset(p);.}
1dc0: 0a 0a 2f 2a 20 45 6e 6c 61 72 67 65 20 70 4a 73  ../* Enlarge pJs
1dd0: 6f 6e 2d 3e 7a 42 75 66 20 73 6f 20 74 68 61 74  on->zBuf so that
1de0: 20 69 74 20 63 61 6e 20 68 6f 6c 64 20 61 74 20   it can hold at 
1df0: 6c 65 61 73 74 20 4e 20 6d 6f 72 65 20 62 79 74  least N more byt
1e00: 65 73 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 7a 65  es..** Return ze
1e10: 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ro on success.  
1e20: 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
1e30: 6f 6e 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 0a  on an OOM error.
1e40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 73  */.static int js
1e50: 6f 6e 47 72 6f 77 28 4a 73 6f 6e 53 74 72 69 6e  onGrow(JsonStrin
1e60: 67 20 2a 70 2c 20 75 33 32 20 4e 29 7b 0a 20 20  g *p, u32 N){.  
1e70: 75 36 34 20 6e 54 6f 74 61 6c 20 3d 20 4e 3c 70  u64 nTotal = N<p
1e80: 2d 3e 6e 41 6c 6c 6f 63 20 3f 20 70 2d 3e 6e 41  ->nAlloc ? p->nA
1e90: 6c 6c 6f 63 2a 32 20 3a 20 70 2d 3e 6e 41 6c 6c  lloc*2 : p->nAll
1ea0: 6f 63 2b 4e 2b 31 30 3b 0a 20 20 63 68 61 72 20  oc+N+10;.  char 
1eb0: 2a 7a 4e 65 77 3b 0a 20 20 69 66 28 20 70 2d 3e  *zNew;.  if( p->
1ec0: 62 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 69  bStatic ){.    i
1ed0: 66 28 20 70 2d 3e 62 45 72 72 20 29 20 72 65 74  f( p->bErr ) ret
1ee0: 75 72 6e 20 31 3b 0a 20 20 20 20 7a 4e 65 77 20  urn 1;.    zNew 
1ef0: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
1f00: 36 34 28 6e 54 6f 74 61 6c 29 3b 0a 20 20 20 20  64(nTotal);.    
1f10: 69 66 28 20 7a 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( zNew==0 ){. 
1f20: 20 20 20 20 20 6a 73 6f 6e 4f 6f 6d 28 70 29 3b       jsonOom(p);
1f30: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1f40: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1f50: 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 4e 65  }.    memcpy(zNe
1f60: 77 2c 20 70 2d 3e 7a 42 75 66 2c 20 28 73 69 7a  w, p->zBuf, (siz
1f70: 65 5f 74 29 70 2d 3e 6e 55 73 65 64 29 3b 0a 20  e_t)p->nUsed);. 
1f80: 20 20 20 70 2d 3e 7a 42 75 66 20 3d 20 7a 4e 65     p->zBuf = zNe
1f90: 77 3b 0a 20 20 20 20 70 2d 3e 62 53 74 61 74 69  w;.    p->bStati
1fa0: 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  c = 0;.  }else{.
1fb0: 20 20 20 20 7a 4e 65 77 20 3d 20 73 71 6c 69 74      zNew = sqlit
1fc0: 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 2d 3e  e3_realloc64(p->
1fd0: 7a 42 75 66 2c 20 6e 54 6f 74 61 6c 29 3b 0a 20  zBuf, nTotal);. 
1fe0: 20 20 20 69 66 28 20 7a 4e 65 77 3d 3d 30 20 29     if( zNew==0 )
1ff0: 7b 0a 20 20 20 20 20 20 6a 73 6f 6e 4f 6f 6d 28  {.      jsonOom(
2000: 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  p);.      return
2010: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2020: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 7a 42 75 66     }.    p->zBuf
2030: 20 3d 20 7a 4e 65 77 3b 0a 20 20 7d 0a 20 20 70   = zNew;.  }.  p
2040: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 54 6f 74 61  ->nAlloc = nTota
2050: 6c 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  l;.  return SQLI
2060: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 41 70 70  TE_OK;.}../* App
2070: 65 6e 64 20 4e 20 62 79 74 65 73 20 66 72 6f 6d  end N bytes from
2080: 20 7a 49 6e 20 6f 6e 74 6f 20 74 68 65 20 65 6e   zIn onto the en
2090: 64 20 6f 66 20 74 68 65 20 4a 73 6f 6e 53 74 72  d of the JsonStr
20a0: 69 6e 67 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73  ing string..*/.s
20b0: 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 41  tatic void jsonA
20c0: 70 70 65 6e 64 52 61 77 28 4a 73 6f 6e 53 74 72  ppendRaw(JsonStr
20d0: 69 6e 67 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  ing *p, const ch
20e0: 61 72 20 2a 7a 49 6e 2c 20 75 33 32 20 4e 29 7b  ar *zIn, u32 N){
20f0: 0a 20 20 69 66 28 20 28 4e 2b 70 2d 3e 6e 55 73  .  if( (N+p->nUs
2100: 65 64 20 3e 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 29  ed >= p->nAlloc)
2110: 20 26 26 20 6a 73 6f 6e 47 72 6f 77 28 70 2c 4e   && jsonGrow(p,N
2120: 29 21 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )!=0 ) return;. 
2130: 20 6d 65 6d 63 70 79 28 70 2d 3e 7a 42 75 66 2b   memcpy(p->zBuf+
2140: 70 2d 3e 6e 55 73 65 64 2c 20 7a 49 6e 2c 20 4e  p->nUsed, zIn, N
2150: 29 3b 0a 20 20 70 2d 3e 6e 55 73 65 64 20 2b 3d  );.  p->nUsed +=
2160: 20 4e 3b 0a 7d 0a 0a 2f 2a 20 41 70 70 65 6e 64   N;.}../* Append
2170: 20 66 6f 72 6d 61 74 74 65 64 20 74 65 78 74 20   formatted text 
2180: 28 6e 6f 74 20 74 6f 20 65 78 63 65 65 64 20 4e  (not to exceed N
2190: 20 62 79 74 65 73 29 20 74 6f 20 74 68 65 20 4a   bytes) to the J
21a0: 73 6f 6e 53 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74  sonString..*/.st
21b0: 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 50 72  atic void jsonPr
21c0: 69 6e 74 66 28 69 6e 74 20 4e 2c 20 4a 73 6f 6e  intf(int N, Json
21d0: 53 74 72 69 6e 67 20 2a 70 2c 20 63 6f 6e 73 74  String *p, const
21e0: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
21f0: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
2200: 61 70 3b 0a 20 20 69 66 28 20 28 70 2d 3e 6e 55  ap;.  if( (p->nU
2210: 73 65 64 20 2b 20 4e 20 3e 3d 20 70 2d 3e 6e 41  sed + N >= p->nA
2220: 6c 6c 6f 63 29 20 26 26 20 6a 73 6f 6e 47 72 6f  lloc) && jsonGro
2230: 77 28 70 2c 20 4e 29 20 29 20 72 65 74 75 72 6e  w(p, N) ) return
2240: 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ;.  va_start(ap,
2250: 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 73 71 6c   zFormat);.  sql
2260: 69 74 65 33 5f 76 73 6e 70 72 69 6e 74 66 28 4e  ite3_vsnprintf(N
2270: 2c 20 70 2d 3e 7a 42 75 66 2b 70 2d 3e 6e 55 73  , p->zBuf+p->nUs
2280: 65 64 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  ed, zFormat, ap)
2290: 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  ;.  va_end(ap);.
22a0: 20 20 70 2d 3e 6e 55 73 65 64 20 2b 3d 20 28 69    p->nUsed += (i
22b0: 6e 74 29 73 74 72 6c 65 6e 28 70 2d 3e 7a 42 75  nt)strlen(p->zBu
22c0: 66 2b 70 2d 3e 6e 55 73 65 64 29 3b 0a 7d 0a 0a  f+p->nUsed);.}..
22d0: 2f 2a 20 41 70 70 65 6e 64 20 61 20 73 69 6e 67  /* Append a sing
22e0: 6c 65 20 63 68 61 72 61 63 74 65 72 0a 2a 2f 0a  le character.*/.
22f0: 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e  static void json
2300: 41 70 70 65 6e 64 43 68 61 72 28 4a 73 6f 6e 53  AppendChar(JsonS
2310: 74 72 69 6e 67 20 2a 70 2c 20 63 68 61 72 20 63  tring *p, char c
2320: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6e 55 73 65  ){.  if( p->nUse
2330: 64 3e 3d 70 2d 3e 6e 41 6c 6c 6f 63 20 26 26 20  d>=p->nAlloc && 
2340: 6a 73 6f 6e 47 72 6f 77 28 70 2c 31 29 21 3d 30  jsonGrow(p,1)!=0
2350: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 2d 3e   ) return;.  p->
2360: 7a 42 75 66 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d  zBuf[p->nUsed++]
2370: 20 3d 20 63 3b 0a 7d 0a 0a 2f 2a 20 41 70 70 65   = c;.}../* Appe
2380: 6e 64 20 61 20 63 6f 6d 6d 61 20 73 65 70 61 72  nd a comma separ
2390: 61 74 6f 72 20 74 6f 20 74 68 65 20 6f 75 74 70  ator to the outp
23a0: 75 74 20 62 75 66 66 65 72 2c 20 69 66 20 74 68  ut buffer, if th
23b0: 65 20 70 72 65 76 69 6f 75 73 0a 2a 2a 20 63 68  e previous.** ch
23c0: 61 72 61 63 74 65 72 20 69 73 20 6e 6f 74 20 27  aracter is not '
23d0: 5b 27 20 6f 72 20 27 7b 27 2e 0a 2a 2f 0a 73 74  [' or '{'..*/.st
23e0: 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 41 70  atic void jsonAp
23f0: 70 65 6e 64 53 65 70 61 72 61 74 6f 72 28 4a 73  pendSeparator(Js
2400: 6f 6e 53 74 72 69 6e 67 20 2a 70 29 7b 0a 20 20  onString *p){.  
2410: 63 68 61 72 20 63 3b 0a 20 20 69 66 28 20 70 2d  char c;.  if( p-
2420: 3e 6e 55 73 65 64 3d 3d 30 20 29 20 72 65 74 75  >nUsed==0 ) retu
2430: 72 6e 3b 0a 20 20 63 20 3d 20 70 2d 3e 7a 42 75  rn;.  c = p->zBu
2440: 66 5b 70 2d 3e 6e 55 73 65 64 2d 31 5d 3b 0a 20  f[p->nUsed-1];. 
2450: 20 69 66 28 20 63 21 3d 27 5b 27 20 26 26 20 63   if( c!='[' && c
2460: 21 3d 27 7b 27 20 29 20 6a 73 6f 6e 41 70 70 65  !='{' ) jsonAppe
2470: 6e 64 43 68 61 72 28 70 2c 20 27 2c 27 29 3b 0a  ndChar(p, ',');.
2480: 7d 0a 0a 2f 2a 20 41 70 70 65 6e 64 20 74 68 65  }../* Append the
2490: 20 4e 2d 62 79 74 65 20 73 74 72 69 6e 67 20 69   N-byte string i
24a0: 6e 20 7a 49 6e 20 74 6f 20 74 68 65 20 65 6e 64  n zIn to the end
24b0: 20 6f 66 20 74 68 65 20 4a 73 6f 6e 53 74 72 69   of the JsonStri
24c0: 6e 67 20 73 74 72 69 6e 67 0a 2a 2a 20 75 6e 64  ng string.** und
24d0: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
24e0: 20 20 45 6e 63 6c 6f 73 65 20 74 68 65 20 73 74    Enclose the st
24f0: 72 69 6e 67 20 69 6e 20 22 2e 2e 2e 22 20 61 6e  ring in "..." an
2500: 64 20 65 73 63 61 70 65 0a 2a 2a 20 61 6e 79 20  d escape.** any 
2510: 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 20 6f 72  double-quotes or
2520: 20 62 61 63 6b 73 6c 61 73 68 20 63 68 61 72 61   backslash chara
2530: 63 74 65 72 73 20 63 6f 6e 74 61 69 6e 65 64 20  cters contained 
2540: 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20 73 74  within the.** st
2550: 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ring..*/.static 
2560: 76 6f 69 64 20 6a 73 6f 6e 41 70 70 65 6e 64 53  void jsonAppendS
2570: 74 72 69 6e 67 28 4a 73 6f 6e 53 74 72 69 6e 67  tring(JsonString
2580: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
2590: 2a 7a 49 6e 2c 20 75 33 32 20 4e 29 7b 0a 20 20  *zIn, u32 N){.  
25a0: 75 33 32 20 69 3b 0a 20 20 69 66 28 20 28 4e 2b  u32 i;.  if( (N+
25b0: 70 2d 3e 6e 55 73 65 64 2b 32 20 3e 3d 20 70 2d  p->nUsed+2 >= p-
25c0: 3e 6e 41 6c 6c 6f 63 29 20 26 26 20 6a 73 6f 6e  >nAlloc) && json
25d0: 47 72 6f 77 28 70 2c 4e 2b 32 29 21 3d 30 20 29  Grow(p,N+2)!=0 )
25e0: 20 72 65 74 75 72 6e 3b 0a 20 20 70 2d 3e 7a 42   return;.  p->zB
25f0: 75 66 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d  uf[p->nUsed++] =
2600: 20 27 22 27 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   '"';.  for(i=0;
2610: 20 69 3c 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<N; i++){.    
2620: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 20  unsigned char c 
2630: 3d 20 28 28 75 6e 73 69 67 6e 65 64 20 63 6f 6e  = ((unsigned con
2640: 73 74 20 63 68 61 72 2a 29 7a 49 6e 29 5b 69 5d  st char*)zIn)[i]
2650: 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 22 27  ;.    if( c=='"'
2660: 20 7c 7c 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20   || c=='\\' ){. 
2670: 20 20 20 20 20 6a 73 6f 6e 5f 73 69 6d 70 6c 65       json_simple
2680: 5f 65 73 63 61 70 65 3a 0a 20 20 20 20 20 20 69  _escape:.      i
2690: 66 28 20 28 70 2d 3e 6e 55 73 65 64 2b 4e 2b 33  f( (p->nUsed+N+3
26a0: 2d 69 20 3e 20 70 2d 3e 6e 41 6c 6c 6f 63 29 20  -i > p->nAlloc) 
26b0: 26 26 20 6a 73 6f 6e 47 72 6f 77 28 70 2c 4e 2b  && jsonGrow(p,N+
26c0: 33 2d 69 29 21 3d 30 20 29 20 72 65 74 75 72 6e  3-i)!=0 ) return
26d0: 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 42 75 66 5b  ;.      p->zBuf[
26e0: 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d 20 27 5c  p->nUsed++] = '\
26f0: 5c 27 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  \';.    }else if
2700: 28 20 63 3c 3d 30 78 31 66 20 29 7b 0a 20 20 20  ( c<=0x1f ){.   
2710: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
2720: 63 68 61 72 20 61 53 70 65 63 69 61 6c 5b 5d 20  char aSpecial[] 
2730: 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 30 2c 20  = {.         0, 
2740: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
2750: 2c 20 30 2c 20 27 62 27 2c 20 27 74 27 2c 20 27  , 0, 'b', 't', '
2760: 6e 27 2c 20 30 2c 20 27 66 27 2c 20 27 72 27 2c  n', 0, 'f', 'r',
2770: 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
2780: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
2790: 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 20 20 30  , 0, 0,   0,   0
27a0: 2c 20 20 20 30 2c 20 30 2c 20 20 20 30 2c 20 20  ,   0, 0,   0,  
27b0: 20 30 2c 20 30 2c 20 30 0a 20 20 20 20 20 20 7d   0, 0, 0.      }
27c0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
27d0: 73 69 7a 65 6f 66 28 61 53 70 65 63 69 61 6c 29  sizeof(aSpecial)
27e0: 3d 3d 33 32 20 29 3b 0a 20 20 20 20 20 20 61 73  ==32 );.      as
27f0: 73 65 72 74 28 20 61 53 70 65 63 69 61 6c 5b 27  sert( aSpecial['
2800: 5c 62 27 5d 3d 3d 27 62 27 20 29 3b 0a 20 20 20  \b']=='b' );.   
2810: 20 20 20 61 73 73 65 72 74 28 20 61 53 70 65 63     assert( aSpec
2820: 69 61 6c 5b 27 5c 66 27 5d 3d 3d 27 66 27 20 29  ial['\f']=='f' )
2830: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2840: 61 53 70 65 63 69 61 6c 5b 27 5c 6e 27 5d 3d 3d  aSpecial['\n']==
2850: 27 6e 27 20 29 3b 0a 20 20 20 20 20 20 61 73 73  'n' );.      ass
2860: 65 72 74 28 20 61 53 70 65 63 69 61 6c 5b 27 5c  ert( aSpecial['\
2870: 72 27 5d 3d 3d 27 72 27 20 29 3b 0a 20 20 20 20  r']=='r' );.    
2880: 20 20 61 73 73 65 72 74 28 20 61 53 70 65 63 69    assert( aSpeci
2890: 61 6c 5b 27 5c 74 27 5d 3d 3d 27 74 27 20 29 3b  al['\t']=='t' );
28a0: 0a 20 20 20 20 20 20 69 66 28 20 61 53 70 65 63  .      if( aSpec
28b0: 69 61 6c 5b 63 5d 20 29 7b 0a 20 20 20 20 20 20  ial[c] ){.      
28c0: 20 20 63 20 3d 20 61 53 70 65 63 69 61 6c 5b 63    c = aSpecial[c
28d0: 5d 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ];.        goto 
28e0: 6a 73 6f 6e 5f 73 69 6d 70 6c 65 5f 65 73 63 61  json_simple_esca
28f0: 70 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  pe;.      }.    
2900: 20 20 69 66 28 20 28 70 2d 3e 6e 55 73 65 64 2b    if( (p->nUsed+
2910: 4e 2b 37 2b 69 20 3e 20 70 2d 3e 6e 41 6c 6c 6f  N+7+i > p->nAllo
2920: 63 29 20 26 26 20 6a 73 6f 6e 47 72 6f 77 28 70  c) && jsonGrow(p
2930: 2c 4e 2b 37 2d 69 29 21 3d 30 20 29 20 72 65 74  ,N+7-i)!=0 ) ret
2940: 75 72 6e 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 42  urn;.      p->zB
2950: 75 66 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d  uf[p->nUsed++] =
2960: 20 27 5c 5c 27 3b 0a 20 20 20 20 20 20 70 2d 3e   '\\';.      p->
2970: 7a 42 75 66 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d  zBuf[p->nUsed++]
2980: 20 3d 20 27 75 27 3b 0a 20 20 20 20 20 20 70 2d   = 'u';.      p-
2990: 3e 7a 42 75 66 5b 70 2d 3e 6e 55 73 65 64 2b 2b  >zBuf[p->nUsed++
29a0: 5d 20 3d 20 27 30 27 3b 0a 20 20 20 20 20 20 70  ] = '0';.      p
29b0: 2d 3e 7a 42 75 66 5b 70 2d 3e 6e 55 73 65 64 2b  ->zBuf[p->nUsed+
29c0: 2b 5d 20 3d 20 27 30 27 3b 0a 20 20 20 20 20 20  +] = '0';.      
29d0: 70 2d 3e 7a 42 75 66 5b 70 2d 3e 6e 55 73 65 64  p->zBuf[p->nUsed
29e0: 2b 2b 5d 20 3d 20 27 30 27 20 2b 20 28 63 3e 3e  ++] = '0' + (c>>
29f0: 34 29 3b 0a 20 20 20 20 20 20 63 20 3d 20 22 30  4);.      c = "0
2a00: 31 32 33 34 35 36 37 38 39 61 62 63 64 65 66 22  123456789abcdef"
2a10: 5b 63 26 30 78 66 5d 3b 0a 20 20 20 20 7d 0a 20  [c&0xf];.    }. 
2a20: 20 20 20 70 2d 3e 7a 42 75 66 5b 70 2d 3e 6e 55     p->zBuf[p->nU
2a30: 73 65 64 2b 2b 5d 20 3d 20 63 3b 0a 20 20 7d 0a  sed++] = c;.  }.
2a40: 20 20 70 2d 3e 7a 42 75 66 5b 70 2d 3e 6e 55 73    p->zBuf[p->nUs
2a50: 65 64 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 61  ed++] = '"';.  a
2a60: 73 73 65 72 74 28 20 70 2d 3e 6e 55 73 65 64 3c  ssert( p->nUsed<
2a70: 70 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 7d 0a 0a  p->nAlloc );.}..
2a80: 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 66  /*.** Append a f
2a90: 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65  unction paramete
2aa0: 72 20 76 61 6c 75 65 20 74 6f 20 74 68 65 20 4a  r value to the J
2ab0: 53 4f 4e 20 73 74 72 69 6e 67 20 75 6e 64 65 72  SON string under
2ac0: 20 0a 2a 2a 20 63 6f 6e 73 74 72 75 63 74 69 6f   .** constructio
2ad0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
2ae0: 64 20 6a 73 6f 6e 41 70 70 65 6e 64 56 61 6c 75  d jsonAppendValu
2af0: 65 28 0a 20 20 4a 73 6f 6e 53 74 72 69 6e 67 20  e(.  JsonString 
2b00: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
2b10: 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f      /* Append to
2b20: 20 74 68 69 73 20 4a 53 4f 4e 20 73 74 72 69 6e   this JSON strin
2b30: 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  g */.  sqlite3_v
2b40: 61 6c 75 65 20 2a 70 56 61 6c 75 65 20 20 20 20  alue *pValue    
2b50: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74        /* Value t
2b60: 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20  o append */.){. 
2b70: 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33   switch( sqlite3
2b80: 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 56 61 6c  _value_type(pVal
2b90: 75 65 29 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ue) ){.    case 
2ba0: 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20  SQLITE_NULL: {. 
2bb0: 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 52       jsonAppendR
2bc0: 61 77 28 70 2c 20 22 6e 75 6c 6c 22 2c 20 34 29  aw(p, "null", 4)
2bd0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2be0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
2bf0: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 0a 20 20  LITE_INTEGER:.  
2c00: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c    case SQLITE_FL
2c10: 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e  OAT: {.      con
2c20: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f  st char *z = (co
2c30: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
2c40: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61  3_value_text(pVa
2c50: 6c 75 65 29 3b 0a 20 20 20 20 20 20 75 33 32 20  lue);.      u32 
2c60: 6e 20 3d 20 28 75 33 32 29 73 71 6c 69 74 65 33  n = (u32)sqlite3
2c70: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 56 61  _value_bytes(pVa
2c80: 6c 75 65 29 3b 0a 20 20 20 20 20 20 6a 73 6f 6e  lue);.      json
2c90: 41 70 70 65 6e 64 52 61 77 28 70 2c 20 7a 2c 20  AppendRaw(p, z, 
2ca0: 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
2cb0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
2cc0: 53 51 4c 49 54 45 5f 54 45 58 54 3a 20 7b 0a 20  SQLITE_TEXT: {. 
2cd0: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
2ce0: 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  *z = (const char
2cf0: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
2d00: 74 65 78 74 28 70 56 61 6c 75 65 29 3b 0a 20 20  text(pValue);.  
2d10: 20 20 20 20 75 33 32 20 6e 20 3d 20 28 75 33 32      u32 n = (u32
2d20: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62  )sqlite3_value_b
2d30: 79 74 65 73 28 70 56 61 6c 75 65 29 3b 0a 20 20  ytes(pValue);.  
2d40: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
2d50: 76 61 6c 75 65 5f 73 75 62 74 79 70 65 28 70 56  value_subtype(pV
2d60: 61 6c 75 65 29 3d 3d 4a 53 4f 4e 5f 53 55 42 54  alue)==JSON_SUBT
2d70: 59 50 45 20 29 7b 0a 20 20 20 20 20 20 20 20 6a  YPE ){.        j
2d80: 73 6f 6e 41 70 70 65 6e 64 52 61 77 28 70 2c 20  sonAppendRaw(p, 
2d90: 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  z, n);.      }el
2da0: 73 65 7b 0a 20 20 20 20 20 20 20 20 6a 73 6f 6e  se{.        json
2db0: 41 70 70 65 6e 64 53 74 72 69 6e 67 28 70 2c 20  AppendString(p, 
2dc0: 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  z, n);.      }. 
2dd0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2de0: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
2df0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 62 45  .      if( p->bE
2e00: 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rr==0 ){.       
2e10: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
2e20: 65 72 72 6f 72 28 70 2d 3e 70 43 74 78 2c 20 22  error(p->pCtx, "
2e30: 4a 53 4f 4e 20 63 61 6e 6e 6f 74 20 68 6f 6c 64  JSON cannot hold
2e40: 20 42 4c 4f 42 20 76 61 6c 75 65 73 22 2c 20 2d   BLOB values", -
2e50: 31 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 62  1);.        p->b
2e60: 45 72 72 20 3d 20 32 3b 0a 20 20 20 20 20 20 20  Err = 2;.       
2e70: 20 6a 73 6f 6e 52 65 73 65 74 28 70 29 3b 0a 20   jsonReset(p);. 
2e80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
2e90: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ak;.    }.  }.}.
2ea0: 0a 0a 2f 2a 20 4d 61 6b 65 20 74 68 65 20 4a 53  ../* Make the JS
2eb0: 4f 4e 20 69 6e 20 70 20 74 68 65 20 72 65 73 75  ON in p the resu
2ec0: 6c 74 20 6f 66 20 74 68 65 20 53 51 4c 20 66 75  lt of the SQL fu
2ed0: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
2ee0: 63 20 76 6f 69 64 20 6a 73 6f 6e 52 65 73 75 6c  c void jsonResul
2ef0: 74 28 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70 29  t(JsonString *p)
2f00: 7b 0a 20 20 69 66 28 20 70 2d 3e 62 45 72 72 3d  {.  if( p->bErr=
2f10: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
2f20: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 36 34 28  3_result_text64(
2f30: 70 2d 3e 70 43 74 78 2c 20 70 2d 3e 7a 42 75 66  p->pCtx, p->zBuf
2f40: 2c 20 70 2d 3e 6e 55 73 65 64 2c 20 0a 20 20 20  , p->nUsed, .   
2f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f60: 20 20 20 20 20 20 20 70 2d 3e 62 53 74 61 74 69         p->bStati
2f70: 63 20 3f 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  c ? SQLITE_TRANS
2f80: 49 45 4e 54 20 3a 20 73 71 6c 69 74 65 33 5f 66  IENT : sqlite3_f
2f90: 72 65 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ree,.           
2fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
2fb0: 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20  QLITE_UTF8);.   
2fc0: 20 6a 73 6f 6e 5a 65 72 6f 28 70 29 3b 0a 20 20   jsonZero(p);.  
2fd0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62  }.  assert( p->b
2fe0: 53 74 61 74 69 63 20 29 3b 0a 7d 0a 0a 2f 2a 2a  Static );.}../**
2ff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3030: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 55 74 69 6c  ********.** Util
3040: 69 74 79 20 72 6f 75 74 69 6e 65 73 20 66 6f 72  ity routines for
3050: 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 4a 73   dealing with Js
3060: 6f 6e 4e 6f 64 65 20 61 6e 64 20 4a 73 6f 6e 50  onNode and JsonP
3070: 61 72 73 65 20 6f 62 6a 65 63 74 73 0a 2a 2a 2a  arse objects.***
3080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30c0: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
30d0: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
30e0: 72 20 6f 66 20 63 6f 6e 73 65 63 75 74 69 76 65  r of consecutive
30f0: 20 4a 73 6f 6e 4e 6f 64 65 20 73 6c 6f 74 73 20   JsonNode slots 
3100: 6e 65 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e  need to represen
3110: 74 0a 2a 2a 20 74 68 65 20 70 61 72 73 65 64 20  t.** the parsed 
3120: 4a 53 4f 4e 20 61 74 20 70 4e 6f 64 65 2e 20 20  JSON at pNode.  
3130: 54 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6e 73 77  The minimum answ
3140: 65 72 20 69 73 20 31 2e 20 20 46 6f 72 20 41 52  er is 1.  For AR
3150: 52 41 59 20 61 6e 64 0a 2a 2a 20 4f 42 4a 45 43  RAY and.** OBJEC
3160: 54 20 74 79 70 65 73 2c 20 74 68 65 20 6e 75 6d  T types, the num
3170: 62 65 72 20 6d 69 67 68 74 20 62 65 20 6c 61 72  ber might be lar
3180: 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 70 70 65 6e  ger..**.** Appen
3190: 64 65 64 20 65 6c 65 6d 65 6e 74 73 20 61 72 65  ded elements are
31a0: 20 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 20 20 54   not counted.  T
31b0: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
31c0: 64 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 0a  d is the number.
31d0: 2a 2a 20 62 79 20 77 68 69 63 68 20 74 68 65 20  ** by which the 
31e0: 4a 73 6f 6e 4e 6f 64 65 20 63 6f 75 6e 74 65 72  JsonNode counter
31f0: 20 73 68 6f 75 6c 64 20 69 6e 63 72 65 6d 65 6e   should incremen
3200: 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 6f  t in order to go
3210: 20 74 6f 20 74 68 65 0a 2a 2a 20 6e 65 78 74 20   to the.** next 
3220: 70 65 65 72 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73  peer value..*/.s
3230: 74 61 74 69 63 20 75 33 32 20 6a 73 6f 6e 4e 6f  tatic u32 jsonNo
3240: 64 65 53 69 7a 65 28 4a 73 6f 6e 4e 6f 64 65 20  deSize(JsonNode 
3250: 2a 70 4e 6f 64 65 29 7b 0a 20 20 72 65 74 75 72  *pNode){.  retur
3260: 6e 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65 3e 3d  n pNode->eType>=
3270: 4a 53 4f 4e 5f 41 52 52 41 59 20 3f 20 70 4e 6f  JSON_ARRAY ? pNo
3280: 64 65 2d 3e 6e 2b 31 20 3a 20 31 3b 0a 7d 0a 0a  de->n+1 : 1;.}..
3290: 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d 20 61 6c  /*.** Reclaim al
32a0: 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  l memory allocat
32b0: 65 64 20 62 79 20 61 20 4a 73 6f 6e 50 61 72 73  ed by a JsonPars
32c0: 65 20 6f 62 6a 65 63 74 2e 20 20 42 75 74 20 64  e object.  But d
32d0: 6f 20 6e 6f 74 0a 2a 2a 20 64 65 6c 65 74 65 20  o not.** delete 
32e0: 74 68 65 20 4a 73 6f 6e 50 61 72 73 65 20 6f 62  the JsonParse ob
32f0: 6a 65 63 74 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a  ject itself..*/.
3300: 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e  static void json
3310: 50 61 72 73 65 52 65 73 65 74 28 4a 73 6f 6e 50  ParseReset(JsonP
3320: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
3330: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
3340: 61 72 73 65 2d 3e 61 4e 6f 64 65 29 3b 0a 20 20  arse->aNode);.  
3350: 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65 20 3d 20  pParse->aNode = 
3360: 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4e 6f  0;.  pParse->nNo
3370: 64 65 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  de = 0;.  pParse
3380: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  ->nAlloc = 0;.  
3390: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
33a0: 72 73 65 2d 3e 61 55 70 29 3b 0a 20 20 70 50 61  rse->aUp);.  pPa
33b0: 72 73 65 2d 3e 61 55 70 20 3d 20 30 3b 0a 7d 0a  rse->aUp = 0;.}.
33c0: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 4a 73  ./*.** Free a Js
33d0: 6f 6e 50 61 72 73 65 20 6f 62 6a 65 63 74 20 74  onParse object t
33e0: 68 61 74 20 77 61 73 20 6f 62 74 61 69 6e 65 64  hat was obtained
33f0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
3400: 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  lloc()..*/.stati
3410: 63 20 76 6f 69 64 20 6a 73 6f 6e 50 61 72 73 65  c void jsonParse
3420: 46 72 65 65 28 4a 73 6f 6e 50 61 72 73 65 20 2a  Free(JsonParse *
3430: 70 50 61 72 73 65 29 7b 0a 20 20 6a 73 6f 6e 50  pParse){.  jsonP
3440: 61 72 73 65 52 65 73 65 74 28 70 50 61 72 73 65  arseReset(pParse
3450: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
3460: 65 28 70 50 61 72 73 65 29 3b 0a 7d 0a 0a 2f 2a  e(pParse);.}../*
3470: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20  .** Convert the 
3480: 4a 73 6f 6e 4e 6f 64 65 20 70 4e 6f 64 65 20 69  JsonNode pNode i
3490: 6e 74 6f 20 61 20 70 75 72 65 20 4a 53 4f 4e 20  nto a pure JSON 
34a0: 73 74 72 69 6e 67 20 61 6e 64 0a 2a 2a 20 61 70  string and.** ap
34b0: 70 65 6e 64 20 74 6f 20 70 4f 75 74 2e 20 20 53  pend to pOut.  S
34c0: 75 62 73 75 62 73 74 72 75 63 74 75 72 65 20 69  ubsubstructure i
34d0: 73 20 61 6c 73 6f 20 69 6e 63 6c 75 64 65 64 2e  s also included.
34e0: 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20    Return.** the 
34f0: 6e 75 6d 62 65 72 20 6f 66 20 4a 73 6f 6e 4e 6f  number of JsonNo
3500: 64 65 20 6f 62 6a 65 63 74 73 20 74 68 61 74 20  de objects that 
3510: 61 72 65 20 65 6e 63 6f 64 65 64 2e 0a 2a 2f 0a  are encoded..*/.
3520: 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e  static void json
3530: 52 65 6e 64 65 72 4e 6f 64 65 28 0a 20 20 4a 73  RenderNode(.  Js
3540: 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 20 20  onNode *pNode,  
3550: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3560: 54 68 65 20 6e 6f 64 65 20 74 6f 20 72 65 6e 64  The node to rend
3570: 65 72 20 2a 2f 0a 20 20 4a 73 6f 6e 53 74 72 69  er */.  JsonStri
3580: 6e 67 20 2a 70 4f 75 74 2c 20 20 20 20 20 20 20  ng *pOut,       
3590: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
35a0: 4a 53 4f 4e 20 68 65 72 65 20 2a 2f 0a 20 20 73  JSON here */.  s
35b0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
35c0: 52 65 70 6c 61 63 65 20 20 20 20 20 20 20 2f 2a  Replace       /*
35d0: 20 52 65 70 6c 61 63 65 6d 65 6e 74 20 76 61 6c   Replacement val
35e0: 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ues */.){.  if( 
35f0: 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73 20 26  pNode->jnFlags &
3600: 20 28 4a 4e 4f 44 45 5f 52 45 50 4c 41 43 45 7c   (JNODE_REPLACE|
3610: 4a 4e 4f 44 45 5f 50 41 54 43 48 29 20 29 7b 0a  JNODE_PATCH) ){.
3620: 20 20 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 6a      if( pNode->j
3630: 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 52  nFlags & JNODE_R
3640: 45 50 4c 41 43 45 20 29 7b 0a 20 20 20 20 20 20  EPLACE ){.      
3650: 6a 73 6f 6e 41 70 70 65 6e 64 56 61 6c 75 65 28  jsonAppendValue(
3660: 70 4f 75 74 2c 20 61 52 65 70 6c 61 63 65 5b 70  pOut, aReplace[p
3670: 4e 6f 64 65 2d 3e 75 2e 69 52 65 70 6c 61 63 65  Node->u.iReplace
3680: 5d 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ]);.      return
3690: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 6f 64  ;.    }.    pNod
36a0: 65 20 3d 20 70 4e 6f 64 65 2d 3e 75 2e 70 50 61  e = pNode->u.pPa
36b0: 74 63 68 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  tch;.  }.  switc
36c0: 68 28 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65 20  h( pNode->eType 
36d0: 29 7b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  ){.    default: 
36e0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
36f0: 70 4e 6f 64 65 2d 3e 65 54 79 70 65 3d 3d 4a 53  pNode->eType==JS
3700: 4f 4e 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  ON_NULL );.     
3710: 20 6a 73 6f 6e 41 70 70 65 6e 64 52 61 77 28 70   jsonAppendRaw(p
3720: 4f 75 74 2c 20 22 6e 75 6c 6c 22 2c 20 34 29 3b  Out, "null", 4);
3730: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3740: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 53 4f    }.    case JSO
3750: 4e 5f 54 52 55 45 3a 20 7b 0a 20 20 20 20 20 20  N_TRUE: {.      
3760: 6a 73 6f 6e 41 70 70 65 6e 64 52 61 77 28 70 4f  jsonAppendRaw(pO
3770: 75 74 2c 20 22 74 72 75 65 22 2c 20 34 29 3b 0a  ut, "true", 4);.
3780: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3790: 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 53 4f 4e   }.    case JSON
37a0: 5f 46 41 4c 53 45 3a 20 7b 0a 20 20 20 20 20 20  _FALSE: {.      
37b0: 6a 73 6f 6e 41 70 70 65 6e 64 52 61 77 28 70 4f  jsonAppendRaw(pO
37c0: 75 74 2c 20 22 66 61 6c 73 65 22 2c 20 35 29 3b  ut, "false", 5);
37d0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
37e0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 53 4f    }.    case JSO
37f0: 4e 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20  N_STRING: {.    
3800: 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 6a 6e 46    if( pNode->jnF
3810: 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 52 41 57  lags & JNODE_RAW
3820: 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 73 6f 6e   ){.        json
3830: 41 70 70 65 6e 64 53 74 72 69 6e 67 28 70 4f 75  AppendString(pOu
3840: 74 2c 20 70 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f  t, pNode->u.zJCo
3850: 6e 74 65 6e 74 2c 20 70 4e 6f 64 65 2d 3e 6e 29  ntent, pNode->n)
3860: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
3870: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
3880: 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 69  * Fall through i
3890: 6e 74 6f 20 74 68 65 20 6e 65 78 74 20 63 61 73  nto the next cas
38a0: 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63  e */.    }.    c
38b0: 61 73 65 20 4a 53 4f 4e 5f 52 45 41 4c 3a 0a 20  ase JSON_REAL:. 
38c0: 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f 49 4e 54     case JSON_INT
38d0: 3a 20 7b 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70  : {.      jsonAp
38e0: 70 65 6e 64 52 61 77 28 70 4f 75 74 2c 20 70 4e  pendRaw(pOut, pN
38f0: 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74  ode->u.zJContent
3900: 2c 20 70 4e 6f 64 65 2d 3e 6e 29 3b 0a 20 20 20  , pNode->n);.   
3910: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3920: 20 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f 41 52      case JSON_AR
3930: 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 75 33 32  RAY: {.      u32
3940: 20 6a 20 3d 20 31 3b 0a 20 20 20 20 20 20 6a 73   j = 1;.      js
3950: 6f 6e 41 70 70 65 6e 64 43 68 61 72 28 70 4f 75  onAppendChar(pOu
3960: 74 2c 20 27 5b 27 29 3b 0a 20 20 20 20 20 20 66  t, '[');.      f
3970: 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20  or(;;){.        
3980: 77 68 69 6c 65 28 20 6a 3c 3d 70 4e 6f 64 65 2d  while( j<=pNode-
3990: 3e 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >n ){.          
39a0: 69 66 28 20 28 70 4e 6f 64 65 5b 6a 5d 2e 6a 6e  if( (pNode[j].jn
39b0: 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 52 45  Flags & JNODE_RE
39c0: 4d 4f 56 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  MOVE)==0 ){.    
39d0: 20 20 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65          jsonAppe
39e0: 6e 64 53 65 70 61 72 61 74 6f 72 28 70 4f 75 74  ndSeparator(pOut
39f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  );.            j
3a00: 73 6f 6e 52 65 6e 64 65 72 4e 6f 64 65 28 26 70  sonRenderNode(&p
3a10: 4e 6f 64 65 5b 6a 5d 2c 20 70 4f 75 74 2c 20 61  Node[j], pOut, a
3a20: 52 65 70 6c 61 63 65 29 3b 0a 20 20 20 20 20 20  Replace);.      
3a30: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
3a40: 6a 20 2b 3d 20 6a 73 6f 6e 4e 6f 64 65 53 69 7a  j += jsonNodeSiz
3a50: 65 28 26 70 4e 6f 64 65 5b 6a 5d 29 3b 0a 20 20  e(&pNode[j]);.  
3a60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3a70: 69 66 28 20 28 70 4e 6f 64 65 2d 3e 6a 6e 46 6c  if( (pNode->jnFl
3a80: 61 67 73 20 26 20 4a 4e 4f 44 45 5f 41 50 50 45  ags & JNODE_APPE
3a90: 4e 44 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ND)==0 ) break;.
3aa0: 20 20 20 20 20 20 20 20 70 4e 6f 64 65 20 3d 20          pNode = 
3ab0: 26 70 4e 6f 64 65 5b 70 4e 6f 64 65 2d 3e 75 2e  &pNode[pNode->u.
3ac0: 69 41 70 70 65 6e 64 5d 3b 0a 20 20 20 20 20 20  iAppend];.      
3ad0: 20 20 6a 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d    j = 1;.      }
3ae0: 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e  .      jsonAppen
3af0: 64 43 68 61 72 28 70 4f 75 74 2c 20 27 5d 27 29  dChar(pOut, ']')
3b00: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3b10: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 53     }.    case JS
3b20: 4f 4e 5f 4f 42 4a 45 43 54 3a 20 7b 0a 20 20 20  ON_OBJECT: {.   
3b30: 20 20 20 75 33 32 20 6a 20 3d 20 31 3b 0a 20 20     u32 j = 1;.  
3b40: 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68      jsonAppendCh
3b50: 61 72 28 70 4f 75 74 2c 20 27 7b 27 29 3b 0a 20  ar(pOut, '{');. 
3b60: 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20       for(;;){.  
3b70: 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3c 3d        while( j<=
3b80: 70 4e 6f 64 65 2d 3e 6e 20 29 7b 0a 20 20 20 20  pNode->n ){.    
3b90: 20 20 20 20 20 20 69 66 28 20 28 70 4e 6f 64 65        if( (pNode
3ba0: 5b 6a 2b 31 5d 2e 6a 6e 46 6c 61 67 73 20 26 20  [j+1].jnFlags & 
3bb0: 4a 4e 4f 44 45 5f 52 45 4d 4f 56 45 29 3d 3d 30  JNODE_REMOVE)==0
3bc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
3bd0: 6a 73 6f 6e 41 70 70 65 6e 64 53 65 70 61 72 61  jsonAppendSepara
3be0: 74 6f 72 28 70 4f 75 74 29 3b 0a 20 20 20 20 20  tor(pOut);.     
3bf0: 20 20 20 20 20 20 20 6a 73 6f 6e 52 65 6e 64 65         jsonRende
3c00: 72 4e 6f 64 65 28 26 70 4e 6f 64 65 5b 6a 5d 2c  rNode(&pNode[j],
3c10: 20 70 4f 75 74 2c 20 61 52 65 70 6c 61 63 65 29   pOut, aReplace)
3c20: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 73  ;.            js
3c30: 6f 6e 41 70 70 65 6e 64 43 68 61 72 28 70 4f 75  onAppendChar(pOu
3c40: 74 2c 20 27 3a 27 29 3b 0a 20 20 20 20 20 20 20  t, ':');.       
3c50: 20 20 20 20 20 6a 73 6f 6e 52 65 6e 64 65 72 4e       jsonRenderN
3c60: 6f 64 65 28 26 70 4e 6f 64 65 5b 6a 2b 31 5d 2c  ode(&pNode[j+1],
3c70: 20 70 4f 75 74 2c 20 61 52 65 70 6c 61 63 65 29   pOut, aReplace)
3c80: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
3c90: 20 20 20 20 20 20 20 20 6a 20 2b 3d 20 31 20 2b          j += 1 +
3ca0: 20 6a 73 6f 6e 4e 6f 64 65 53 69 7a 65 28 26 70   jsonNodeSize(&p
3cb0: 4e 6f 64 65 5b 6a 2b 31 5d 29 3b 0a 20 20 20 20  Node[j+1]);.    
3cc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
3cd0: 28 20 28 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67  ( (pNode->jnFlag
3ce0: 73 20 26 20 4a 4e 4f 44 45 5f 41 50 50 45 4e 44  s & JNODE_APPEND
3cf0: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
3d00: 20 20 20 20 20 20 70 4e 6f 64 65 20 3d 20 26 70        pNode = &p
3d10: 4e 6f 64 65 5b 70 4e 6f 64 65 2d 3e 75 2e 69 41  Node[pNode->u.iA
3d20: 70 70 65 6e 64 5d 3b 0a 20 20 20 20 20 20 20 20  ppend];.        
3d30: 6a 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  j = 1;.      }. 
3d40: 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 43       jsonAppendC
3d50: 68 61 72 28 70 4f 75 74 2c 20 27 7d 27 29 3b 0a  har(pOut, '}');.
3d60: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3d70: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
3d80: 52 65 74 75 72 6e 20 61 20 4a 73 6f 6e 4e 6f 64  Return a JsonNod
3d90: 65 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 64 65  e and all its de
3da0: 73 63 65 6e 64 65 6e 74 73 20 61 73 20 61 20 4a  scendents as a J
3db0: 53 4f 4e 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73  SON string..*/.s
3dc0: 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 52  tatic void jsonR
3dd0: 65 74 75 72 6e 4a 73 6f 6e 28 0a 20 20 4a 73 6f  eturnJson(.  Jso
3de0: 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 20 20 20  nNode *pNode,   
3df0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 64 65           /* Node
3e00: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
3e10: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
3e20: 2a 70 43 74 78 2c 20 20 20 20 20 20 2f 2a 20 52  *pCtx,      /* R
3e30: 65 74 75 72 6e 20 76 61 6c 75 65 20 66 6f 72 20  eturn value for 
3e40: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
3e50: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
3e60: 20 2a 2a 61 52 65 70 6c 61 63 65 20 20 20 20 2f   **aReplace    /
3e70: 2a 20 41 72 72 61 79 20 6f 66 20 72 65 70 6c 61  * Array of repla
3e80: 63 65 6d 65 6e 74 20 76 61 6c 75 65 73 20 2a 2f  cement values */
3e90: 0a 29 7b 0a 20 20 4a 73 6f 6e 53 74 72 69 6e 67  .){.  JsonString
3ea0: 20 73 3b 0a 20 20 6a 73 6f 6e 49 6e 69 74 28 26   s;.  jsonInit(&
3eb0: 73 2c 20 70 43 74 78 29 3b 0a 20 20 6a 73 6f 6e  s, pCtx);.  json
3ec0: 52 65 6e 64 65 72 4e 6f 64 65 28 70 4e 6f 64 65  RenderNode(pNode
3ed0: 2c 20 26 73 2c 20 61 52 65 70 6c 61 63 65 29 3b  , &s, aReplace);
3ee0: 0a 20 20 6a 73 6f 6e 52 65 73 75 6c 74 28 26 73  .  jsonResult(&s
3ef0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
3f00: 75 6c 74 5f 73 75 62 74 79 70 65 28 70 43 74 78  ult_subtype(pCtx
3f10: 2c 20 4a 53 4f 4e 5f 53 55 42 54 59 50 45 29 3b  , JSON_SUBTYPE);
3f20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 74  .}../*.** Make t
3f30: 68 65 20 4a 73 6f 6e 4e 6f 64 65 20 74 68 65 20  he JsonNode the 
3f40: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
3f50: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  the function..*/
3f60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f  .static void jso
3f70: 6e 52 65 74 75 72 6e 28 0a 20 20 4a 73 6f 6e 4e  nReturn(.  JsonN
3f80: 6f 64 65 20 2a 70 4e 6f 64 65 2c 20 20 20 20 20  ode *pNode,     
3f90: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 64 65 20 74         /* Node t
3fa0: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71  o return */.  sq
3fb0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
3fc0: 43 74 78 2c 20 20 20 20 20 20 2f 2a 20 52 65 74  Ctx,      /* Ret
3fd0: 75 72 6e 20 76 61 6c 75 65 20 66 6f 72 20 74 68  urn value for th
3fe0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
3ff0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
4000: 2a 61 52 65 70 6c 61 63 65 20 20 20 20 2f 2a 20  *aReplace    /* 
4010: 41 72 72 61 79 20 6f 66 20 72 65 70 6c 61 63 65  Array of replace
4020: 6d 65 6e 74 20 76 61 6c 75 65 73 20 2a 2f 0a 29  ment values */.)
4030: 7b 0a 20 20 73 77 69 74 63 68 28 20 70 4e 6f 64  {.  switch( pNod
4040: 65 2d 3e 65 54 79 70 65 20 29 7b 0a 20 20 20 20  e->eType ){.    
4050: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
4060: 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e   assert( pNode->
4070: 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f 4e 55 4c 4c  eType==JSON_NULL
4080: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
4090: 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 28 70 43  3_result_null(pC
40a0: 74 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  tx);.      break
40b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
40c0: 20 4a 53 4f 4e 5f 54 52 55 45 3a 20 7b 0a 20 20   JSON_TRUE: {.  
40d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
40e0: 6c 74 5f 69 6e 74 28 70 43 74 78 2c 20 31 29 3b  lt_int(pCtx, 1);
40f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4100: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 53 4f    }.    case JSO
4110: 4e 5f 46 41 4c 53 45 3a 20 7b 0a 20 20 20 20 20  N_FALSE: {.     
4120: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
4130: 69 6e 74 28 70 43 74 78 2c 20 30 29 3b 0a 20 20  int(pCtx, 0);.  
4140: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4150: 0a 20 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f 49  .    case JSON_I
4160: 4e 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  NT: {.      sqli
4170: 74 65 33 5f 69 6e 74 36 34 20 69 20 3d 20 30 3b  te3_int64 i = 0;
4180: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
4190: 72 20 2a 7a 20 3d 20 70 4e 6f 64 65 2d 3e 75 2e  r *z = pNode->u.
41a0: 7a 4a 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20  zJContent;.     
41b0: 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29   if( z[0]=='-' )
41c0: 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 77  { z++; }.      w
41d0: 68 69 6c 65 28 20 7a 5b 30 5d 3e 3d 27 30 27 20  hile( z[0]>='0' 
41e0: 26 26 20 7a 5b 30 5d 3c 3d 27 39 27 20 29 7b 0a  && z[0]<='9' ){.
41f0: 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64          unsigned
4200: 20 76 20 3d 20 2a 28 7a 2b 2b 29 20 2d 20 27 30   v = *(z++) - '0
4210: 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ';.        if( i
4220: 3e 3d 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 2f  >=LARGEST_INT64/
4230: 31 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  10 ){.          
4240: 69 66 28 20 69 3e 4c 41 52 47 45 53 54 5f 49 4e  if( i>LARGEST_IN
4250: 54 36 34 2f 31 30 20 29 20 67 6f 74 6f 20 69 6e  T64/10 ) goto in
4260: 74 5f 61 73 5f 72 65 61 6c 3b 0a 20 20 20 20 20  t_as_real;.     
4270: 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3e 3d 27       if( z[0]>='
4280: 30 27 20 26 26 20 7a 5b 30 5d 3c 3d 27 39 27 20  0' && z[0]<='9' 
4290: 29 20 67 6f 74 6f 20 69 6e 74 5f 61 73 5f 72 65  ) goto int_as_re
42a0: 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  al;.          if
42b0: 28 20 76 3d 3d 39 20 29 20 67 6f 74 6f 20 69 6e  ( v==9 ) goto in
42c0: 74 5f 61 73 5f 72 65 61 6c 3b 0a 20 20 20 20 20  t_as_real;.     
42d0: 20 20 20 20 20 69 66 28 20 76 3d 3d 38 20 29 7b       if( v==8 ){
42e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
42f0: 20 70 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74   pNode->u.zJCont
4300: 65 6e 74 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20  ent[0]=='-' ){. 
4310: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
4320: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
4330: 34 28 70 43 74 78 2c 20 53 4d 41 4c 4c 45 53 54  4(pCtx, SMALLEST
4340: 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 20 20 20  _INT64);.       
4350: 20 20 20 20 20 20 20 67 6f 74 6f 20 69 6e 74 5f         goto int_
4360: 64 6f 6e 65 3b 0a 20 20 20 20 20 20 20 20 20 20  done;.          
4370: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
4380: 20 20 20 20 20 20 20 67 6f 74 6f 20 69 6e 74 5f         goto int_
4390: 61 73 5f 72 65 61 6c 3b 0a 20 20 20 20 20 20 20  as_real;.       
43a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
43b0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
43c0: 20 20 20 20 20 69 20 3d 20 69 2a 31 30 20 2b 20       i = i*10 + 
43d0: 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  v;.      }.     
43e0: 20 69 66 28 20 70 4e 6f 64 65 2d 3e 75 2e 7a 4a   if( pNode->u.zJ
43f0: 43 6f 6e 74 65 6e 74 5b 30 5d 3d 3d 27 2d 27 20  Content[0]=='-' 
4400: 29 7b 20 69 20 3d 20 2d 69 3b 20 7d 0a 20 20 20  ){ i = -i; }.   
4410: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
4420: 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 69 29  t_int64(pCtx, i)
4430: 3b 0a 20 20 20 20 20 20 69 6e 74 5f 64 6f 6e 65  ;.      int_done
4440: 3a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  :.      break;. 
4450: 20 20 20 20 20 69 6e 74 5f 61 73 5f 72 65 61 6c       int_as_real
4460: 3a 20 2f 2a 20 66 61 6c 6c 20 74 68 72 6f 75 67  : /* fall throug
4470: 68 20 74 6f 20 72 65 61 6c 20 2a 2f 3b 0a 20 20  h to real */;.  
4480: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 53 4f    }.    case JSO
4490: 4e 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20  N_REAL: {.      
44a0: 64 6f 75 62 6c 65 20 72 3b 0a 23 69 66 64 65 66  double r;.#ifdef
44b0: 20 53 51 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41   SQLITE_AMALGAMA
44c0: 54 49 4f 4e 0a 20 20 20 20 20 20 63 6f 6e 73 74  TION.      const
44d0: 20 63 68 61 72 20 2a 7a 20 3d 20 70 4e 6f 64 65   char *z = pNode
44e0: 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 3b 0a 20  ->u.zJContent;. 
44f0: 20 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f 46       sqlite3AtoF
4500: 28 7a 2c 20 26 72 2c 20 73 71 6c 69 74 65 33 53  (z, &r, sqlite3S
4510: 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51 4c 49  trlen30(z), SQLI
4520: 54 45 5f 55 54 46 38 29 3b 0a 23 65 6c 73 65 0a  TE_UTF8);.#else.
4530: 20 20 20 20 20 20 72 20 3d 20 73 74 72 74 6f 64        r = strtod
4540: 28 70 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74  (pNode->u.zJCont
4550: 65 6e 74 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  ent, 0);.#endif.
4560: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
4570: 73 75 6c 74 5f 64 6f 75 62 6c 65 28 70 43 74 78  sult_double(pCtx
4580: 2c 20 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , r);.      brea
4590: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
45a0: 65 20 4a 53 4f 4e 5f 53 54 52 49 4e 47 3a 20 7b  e JSON_STRING: {
45b0: 0a 23 69 66 20 30 20 2f 2a 20 4e 65 76 65 72 20  .#if 0 /* Never 
45c0: 68 61 70 70 65 6e 73 20 62 65 63 61 75 73 65 20  happens because 
45d0: 4a 4e 4f 44 45 5f 52 41 57 20 69 73 20 6f 6e 6c  JNODE_RAW is onl
45e0: 79 20 73 65 74 20 62 79 20 6a 73 6f 6e 5f 73 65  y set by json_se
45f0: 74 28 29 2c 0a 20 20 20 20 20 20 2a 2a 20 6a 73  t(),.      ** js
4600: 6f 6e 5f 69 6e 73 65 72 74 28 29 20 61 6e 64 20  on_insert() and 
4610: 6a 73 6f 6e 5f 72 65 70 6c 61 63 65 28 29 20 61  json_replace() a
4620: 6e 64 20 74 68 6f 73 65 20 72 6f 75 74 69 6e 65  nd those routine
4630: 73 20 64 6f 20 6e 6f 74 0a 20 20 20 20 20 20 2a  s do not.      *
4640: 2a 20 63 61 6c 6c 20 6a 73 6f 6e 52 65 74 75 72  * call jsonRetur
4650: 6e 28 29 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  n() */.      if(
4660: 20 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73 20   pNode->jnFlags 
4670: 26 20 4a 4e 4f 44 45 5f 52 41 57 20 29 7b 0a 20  & JNODE_RAW ){. 
4680: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
4690: 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c  esult_text(pCtx,
46a0: 20 70 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74   pNode->u.zJCont
46b0: 65 6e 74 2c 20 70 4e 6f 64 65 2d 3e 6e 2c 0a 20  ent, pNode->n,. 
46c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46d0: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
46e0: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
46f0: 20 20 20 20 7d 65 6c 73 65 20 0a 23 65 6e 64 69      }else .#endi
4700: 66 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  f.      assert( 
4710: 28 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73 20  (pNode->jnFlags 
4720: 26 20 4a 4e 4f 44 45 5f 52 41 57 29 3d 3d 30 20  & JNODE_RAW)==0 
4730: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4e  );.      if( (pN
4740: 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73 20 26 20 4a  ode->jnFlags & J
4750: 4e 4f 44 45 5f 45 53 43 41 50 45 29 3d 3d 30 20  NODE_ESCAPE)==0 
4760: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4a 53  ){.        /* JS
4770: 4f 4e 20 66 6f 72 6d 61 74 74 65 64 20 77 69 74  ON formatted wit
4780: 68 6f 75 74 20 61 6e 79 20 62 61 63 6b 73 6c 61  hout any backsla
4790: 73 68 2d 65 73 63 61 70 65 73 20 2a 2f 0a 20 20  sh-escapes */.  
47a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
47b0: 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20  sult_text(pCtx, 
47c0: 70 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74 65  pNode->u.zJConte
47d0: 6e 74 2b 31 2c 20 70 4e 6f 64 65 2d 3e 6e 2d 32  nt+1, pNode->n-2
47e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
47f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
4800: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
4810: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
4820: 20 20 20 20 20 20 2f 2a 20 54 72 61 6e 73 6c 61        /* Transla
4830: 74 65 20 4a 53 4f 4e 20 66 6f 72 6d 61 74 74 65  te JSON formatte
4840: 64 20 73 74 72 69 6e 67 20 69 6e 74 6f 20 72 61  d string into ra
4850: 77 20 74 65 78 74 20 2a 2f 0a 20 20 20 20 20 20  w text */.      
4860: 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20    u32 i;.       
4870: 20 75 33 32 20 6e 20 3d 20 70 4e 6f 64 65 2d 3e   u32 n = pNode->
4880: 6e 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  n;.        const
4890: 20 63 68 61 72 20 2a 7a 20 3d 20 70 4e 6f 64 65   char *z = pNode
48a0: 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 3b 0a 20  ->u.zJContent;. 
48b0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4f 75         char *zOu
48c0: 74 3b 0a 20 20 20 20 20 20 20 20 75 33 32 20 6a  t;.        u32 j
48d0: 3b 0a 20 20 20 20 20 20 20 20 7a 4f 75 74 20 3d  ;.        zOut =
48e0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
48f0: 20 6e 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20   n+1 );.        
4900: 69 66 28 20 7a 4f 75 74 3d 3d 30 20 29 7b 0a 20  if( zOut==0 ){. 
4910: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
4920: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
4930: 6d 65 6d 28 70 43 74 78 29 3b 0a 20 20 20 20 20  mem(pCtx);.     
4940: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4950: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f      }.        fo
4960: 72 28 69 3d 31 2c 20 6a 3d 30 3b 20 69 3c 6e 2d  r(i=1, j=0; i<n-
4970: 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  1; i++){.       
4980: 20 20 20 63 68 61 72 20 63 20 3d 20 7a 5b 69 5d     char c = z[i]
4990: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
49a0: 63 21 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20  c!='\\' ){.     
49b0: 20 20 20 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d         zOut[j++]
49c0: 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20 20   = c;.          
49d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
49e0: 20 20 20 63 20 3d 20 7a 5b 2b 2b 69 5d 3b 0a 20     c = z[++i];. 
49f0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63             if( c
4a00: 3d 3d 27 75 27 20 29 7b 0a 20 20 20 20 20 20 20  =='u' ){.       
4a10: 20 20 20 20 20 20 20 75 33 32 20 76 20 3d 20 30         u32 v = 0
4a20: 2c 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  , k;.           
4a30: 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 34 3b     for(k=0; k<4;
4a40: 20 69 2b 2b 2c 20 6b 2b 2b 29 7b 0a 20 20 20 20   i++, k++){.    
4a50: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
4a60: 72 74 28 20 69 3c 6e 2d 32 20 29 3b 0a 20 20 20  rt( i<n-2 );.   
4a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 20 3d               c =
4a80: 20 7a 5b 69 2b 31 5d 3b 0a 20 20 20 20 20 20 20   z[i+1];.       
4a90: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
4aa0: 20 73 61 66 65 5f 69 73 78 64 69 67 69 74 28 63   safe_isxdigit(c
4ab0: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
4ac0: 20 20 20 20 20 69 66 28 20 63 3c 3d 27 39 27 20       if( c<='9' 
4ad0: 29 20 76 20 3d 20 76 2a 31 36 20 2b 20 63 20 2d  ) v = v*16 + c -
4ae0: 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20   '0';.          
4af0: 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 63        else if( c
4b00: 3c 3d 27 46 27 20 29 20 76 20 3d 20 76 2a 31 36  <='F' ) v = v*16
4b10: 20 2b 20 63 20 2d 20 27 41 27 20 2b 20 31 30 3b   + c - 'A' + 10;
4b20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4b30: 20 65 6c 73 65 20 76 20 3d 20 76 2a 31 36 20 2b   else v = v*16 +
4b40: 20 63 20 2d 20 27 61 27 20 2b 20 31 30 3b 0a 20   c - 'a' + 10;. 
4b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
4b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
4b70: 20 76 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20   v==0 ) break;. 
4b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
4b90: 20 76 3c 3d 30 78 37 66 20 29 7b 0a 20 20 20 20   v<=0x7f ){.    
4ba0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4f 75 74              zOut
4bb0: 5b 6a 2b 2b 5d 20 3d 20 28 63 68 61 72 29 76 3b  [j++] = (char)v;
4bc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
4bd0: 65 6c 73 65 20 69 66 28 20 76 3c 3d 30 78 37 66  else if( v<=0x7f
4be0: 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  f ){.           
4bf0: 20 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d       zOut[j++] =
4c00: 20 28 63 68 61 72 29 28 30 78 63 30 20 7c 20 28   (char)(0xc0 | (
4c10: 76 3e 3e 36 29 29 3b 0a 20 20 20 20 20 20 20 20  v>>6));.        
4c20: 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b          zOut[j++
4c30: 5d 20 3d 20 30 78 38 30 20 7c 20 28 76 26 30 78  ] = 0x80 | (v&0x
4c40: 33 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  3f);.           
4c50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4c60: 20 20 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 6a            zOut[j
4c70: 2b 2b 5d 20 3d 20 28 63 68 61 72 29 28 30 78 65  ++] = (char)(0xe
4c80: 30 20 7c 20 28 76 3e 3e 31 32 29 29 3b 0a 20 20  0 | (v>>12));.  
4c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4f                zO
4ca0: 75 74 5b 6a 2b 2b 5d 20 3d 20 30 78 38 30 20 7c  ut[j++] = 0x80 |
4cb0: 20 28 28 76 3e 3e 36 29 26 30 78 33 66 29 3b 0a   ((v>>6)&0x3f);.
4cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cd0: 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 30 78 38 30  zOut[j++] = 0x80
4ce0: 20 7c 20 28 76 26 30 78 33 66 29 3b 0a 20 20 20   | (v&0x3f);.   
4cf0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
4d00: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
4d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
4d20: 28 20 63 3d 3d 27 62 27 20 29 7b 0a 20 20 20 20  ( c=='b' ){.    
4d30: 20 20 20 20 20 20 20 20 20 20 20 20 63 20 3d 20              c = 
4d40: 27 5c 62 27 3b 0a 20 20 20 20 20 20 20 20 20 20  '\b';.          
4d50: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
4d60: 3d 27 66 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='f' ){.        
4d70: 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 66 27          c = '\f'
4d80: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
4d90: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 6e 27  }else if( c=='n'
4da0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
4db0: 20 20 20 20 63 20 3d 20 27 5c 6e 27 3b 0a 20 20      c = '\n';.  
4dc0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
4dd0: 65 20 69 66 28 20 63 3d 3d 27 72 27 20 29 7b 0a  e if( c=='r' ){.
4de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4df0: 63 20 3d 20 27 5c 72 27 3b 0a 20 20 20 20 20 20  c = '\r';.      
4e00: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
4e10: 28 20 63 3d 3d 27 74 27 20 29 7b 0a 20 20 20 20  ( c=='t' ){.    
4e20: 20 20 20 20 20 20 20 20 20 20 20 20 63 20 3d 20              c = 
4e30: 27 5c 74 27 3b 0a 20 20 20 20 20 20 20 20 20 20  '\t';.          
4e40: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
4e50: 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20      zOut[j++] = 
4e60: 63 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  c;.            }
4e70: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
4e80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
4e90: 4f 75 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20  Out[j] = 0;.    
4ea0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
4eb0: 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20 7a 4f  lt_text(pCtx, zO
4ec0: 75 74 2c 20 6a 2c 20 73 71 6c 69 74 65 33 5f 66  ut, j, sqlite3_f
4ed0: 72 65 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ree);.      }.  
4ee0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4ef0: 0a 20 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f 41  .    case JSON_A
4f00: 52 52 41 59 3a 0a 20 20 20 20 63 61 73 65 20 4a  RRAY:.    case J
4f10: 53 4f 4e 5f 4f 42 4a 45 43 54 3a 20 7b 0a 20 20  SON_OBJECT: {.  
4f20: 20 20 20 20 6a 73 6f 6e 52 65 74 75 72 6e 4a 73      jsonReturnJs
4f30: 6f 6e 28 70 4e 6f 64 65 2c 20 70 43 74 78 2c 20  on(pNode, pCtx, 
4f40: 61 52 65 70 6c 61 63 65 29 3b 0a 20 20 20 20 20  aReplace);.     
4f50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4f60: 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  }.}../* Forward 
4f70: 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61  reference */.sta
4f80: 74 69 63 20 69 6e 74 20 6a 73 6f 6e 50 61 72 73  tic int jsonPars
4f90: 65 41 64 64 4e 6f 64 65 28 4a 73 6f 6e 50 61 72  eAddNode(JsonPar
4fa0: 73 65 2a 2c 75 33 32 2c 75 33 32 2c 63 6f 6e 73  se*,u32,u32,cons
4fb0: 74 20 63 68 61 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  t char*);../*.**
4fc0: 20 41 20 6d 61 63 72 6f 20 74 6f 20 68 69 6e 74   A macro to hint
4fd0: 20 74 6f 20 74 68 65 20 63 6f 6d 70 69 6c 65 72   to the compiler
4fe0: 20 74 68 61 74 20 61 20 66 75 6e 63 74 69 6f 6e   that a function
4ff0: 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 0a 2a   should not be.*
5000: 2a 20 69 6e 6c 69 6e 65 64 2e 0a 2a 2f 0a 23 69  * inlined..*/.#i
5010: 66 20 64 65 66 69 6e 65 64 28 5f 5f 47 4e 55 43  f defined(__GNUC
5020: 5f 5f 29 0a 23 20 20 64 65 66 69 6e 65 20 4a 53  __).#  define JS
5030: 4f 4e 5f 4e 4f 49 4e 4c 49 4e 45 20 20 5f 5f 61  ON_NOINLINE  __a
5040: 74 74 72 69 62 75 74 65 5f 5f 28 28 6e 6f 69 6e  ttribute__((noin
5050: 6c 69 6e 65 29 29 0a 23 65 6c 69 66 20 64 65 66  line)).#elif def
5060: 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29 20 26  ined(_MSC_VER) &
5070: 26 20 5f 4d 53 43 5f 56 45 52 3e 3d 31 33 31 30  & _MSC_VER>=1310
5080: 0a 23 20 20 64 65 66 69 6e 65 20 4a 53 4f 4e 5f  .#  define JSON_
5090: 4e 4f 49 4e 4c 49 4e 45 20 20 5f 5f 64 65 63 6c  NOINLINE  __decl
50a0: 73 70 65 63 28 6e 6f 69 6e 6c 69 6e 65 29 0a 23  spec(noinline).#
50b0: 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 4a  else.#  define J
50c0: 53 4f 4e 5f 4e 4f 49 4e 4c 49 4e 45 0a 23 65 6e  SON_NOINLINE.#en
50d0: 64 69 66 0a 0a 0a 73 74 61 74 69 63 20 4a 53 4f  dif...static JSO
50e0: 4e 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 6a  N_NOINLINE int j
50f0: 73 6f 6e 50 61 72 73 65 41 64 64 4e 6f 64 65 45  sonParseAddNodeE
5100: 78 70 61 6e 64 28 0a 20 20 4a 73 6f 6e 50 61 72  xpand(.  JsonPar
5110: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
5120: 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65     /* Append the
5130: 20 6e 6f 64 65 20 74 6f 20 74 68 69 73 20 6f 62   node to this ob
5140: 6a 65 63 74 20 2a 2f 0a 20 20 75 33 32 20 65 54  ject */.  u32 eT
5150: 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
5160: 20 20 20 20 2f 2a 20 4e 6f 64 65 20 74 79 70 65      /* Node type
5170: 20 2a 2f 0a 20 20 75 33 32 20 6e 2c 20 20 20 20   */.  u32 n,    
5180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5190: 2f 2a 20 43 6f 6e 74 65 6e 74 20 73 69 7a 65 20  /* Content size 
51a0: 6f 72 20 73 75 62 2d 6e 6f 64 65 20 63 6f 75 6e  or sub-node coun
51b0: 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
51c0: 72 20 2a 7a 43 6f 6e 74 65 6e 74 20 20 20 20 20  r *zContent     
51d0: 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 2a 2f 0a 29   /* Content */.)
51e0: 7b 0a 20 20 75 33 32 20 6e 4e 65 77 3b 0a 20 20  {.  u32 nNew;.  
51f0: 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e 65 77 3b 0a  JsonNode *pNew;.
5200: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
5210: 2d 3e 6e 4e 6f 64 65 3e 3d 70 50 61 72 73 65 2d  ->nNode>=pParse-
5220: 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 20 20 69 66 28  >nAlloc );.  if(
5230: 20 70 50 61 72 73 65 2d 3e 6f 6f 6d 20 29 20 72   pParse->oom ) r
5240: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 6e 4e 65 77  eturn -1;.  nNew
5250: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 41 6c 6c 6f   = pParse->nAllo
5260: 63 2a 32 20 2b 20 31 30 3b 0a 20 20 70 4e 65 77  c*2 + 10;.  pNew
5270: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   = sqlite3_reall
5280: 6f 63 28 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65  oc(pParse->aNode
5290: 2c 20 73 69 7a 65 6f 66 28 4a 73 6f 6e 4e 6f 64  , sizeof(JsonNod
52a0: 65 29 2a 6e 4e 65 77 29 3b 0a 20 20 69 66 28 20  e)*nNew);.  if( 
52b0: 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 70  pNew==0 ){.    p
52c0: 50 61 72 73 65 2d 3e 6f 6f 6d 20 3d 20 31 3b 0a  Parse->oom = 1;.
52d0: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
52e0: 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 41 6c   }.  pParse->nAl
52f0: 6c 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20 20 70 50  loc = nNew;.  pP
5300: 61 72 73 65 2d 3e 61 4e 6f 64 65 20 3d 20 70 4e  arse->aNode = pN
5310: 65 77 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ew;.  assert( pP
5320: 61 72 73 65 2d 3e 6e 4e 6f 64 65 3c 70 50 61 72  arse->nNode<pPar
5330: 73 65 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 20 20  se->nAlloc );.  
5340: 72 65 74 75 72 6e 20 6a 73 6f 6e 50 61 72 73 65  return jsonParse
5350: 41 64 64 4e 6f 64 65 28 70 50 61 72 73 65 2c 20  AddNode(pParse, 
5360: 65 54 79 70 65 2c 20 6e 2c 20 7a 43 6f 6e 74 65  eType, n, zConte
5370: 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  nt);.}../*.** Cr
5380: 65 61 74 65 20 61 20 6e 65 77 20 4a 73 6f 6e 4e  eate a new JsonN
5390: 6f 64 65 20 69 6e 73 74 61 6e 63 65 20 62 61 73  ode instance bas
53a0: 65 64 20 6f 6e 20 74 68 65 20 61 72 67 75 6d 65  ed on the argume
53b0: 6e 74 73 20 61 6e 64 20 61 70 70 65 6e 64 20 74  nts and append t
53c0: 68 61 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20  hat.** instance 
53d0: 74 6f 20 74 68 65 20 4a 73 6f 6e 50 61 72 73 65  to the JsonParse
53e0: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  .  Return the in
53f0: 64 65 78 20 69 6e 20 70 50 61 72 73 65 2d 3e 61  dex in pParse->a
5400: 4e 6f 64 65 5b 5d 20 6f 66 20 74 68 65 0a 2a 2a  Node[] of the.**
5410: 20 6e 65 77 20 6e 6f 64 65 2c 20 6f 72 20 2d 31   new node, or -1
5420: 20 69 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   if a memory all
5430: 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2e 0a 2a  ocation fails..*
5440: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 73 6f  /.static int jso
5450: 6e 50 61 72 73 65 41 64 64 4e 6f 64 65 28 0a 20  nParseAddNode(. 
5460: 20 4a 73 6f 6e 50 61 72 73 65 20 2a 70 50 61 72   JsonParse *pPar
5470: 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 41 70  se,        /* Ap
5480: 70 65 6e 64 20 74 68 65 20 6e 6f 64 65 20 74 6f  pend the node to
5490: 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a   this object */.
54a0: 20 20 75 33 32 20 65 54 79 70 65 2c 20 20 20 20    u32 eType,    
54b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
54c0: 6f 64 65 20 74 79 70 65 20 2a 2f 0a 20 20 75 33  ode type */.  u3
54d0: 32 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  2 n,            
54e0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
54f0: 6e 74 20 73 69 7a 65 20 6f 72 20 73 75 62 2d 6e  nt size or sub-n
5500: 6f 64 65 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 63  ode count */.  c
5510: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6e 74  onst char *zCont
5520: 65 6e 74 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74  ent      /* Cont
5530: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 4a 73 6f 6e  ent */.){.  Json
5540: 4e 6f 64 65 20 2a 70 3b 0a 20 20 69 66 28 20 70  Node *p;.  if( p
5550: 50 61 72 73 65 2d 3e 6e 4e 6f 64 65 3e 3d 70 50  Parse->nNode>=pP
5560: 61 72 73 65 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a  arse->nAlloc ){.
5570: 20 20 20 20 72 65 74 75 72 6e 20 6a 73 6f 6e 50      return jsonP
5580: 61 72 73 65 41 64 64 4e 6f 64 65 45 78 70 61 6e  arseAddNodeExpan
5590: 64 28 70 50 61 72 73 65 2c 20 65 54 79 70 65 2c  d(pParse, eType,
55a0: 20 6e 2c 20 7a 43 6f 6e 74 65 6e 74 29 3b 0a 20   n, zContent);. 
55b0: 20 7d 0a 20 20 70 20 3d 20 26 70 50 61 72 73 65   }.  p = &pParse
55c0: 2d 3e 61 4e 6f 64 65 5b 70 50 61 72 73 65 2d 3e  ->aNode[pParse->
55d0: 6e 4e 6f 64 65 5d 3b 0a 20 20 70 2d 3e 65 54 79  nNode];.  p->eTy
55e0: 70 65 20 3d 20 28 75 38 29 65 54 79 70 65 3b 0a  pe = (u8)eType;.
55f0: 20 20 70 2d 3e 6a 6e 46 6c 61 67 73 20 3d 20 30    p->jnFlags = 0
5600: 3b 0a 20 20 70 2d 3e 6e 20 3d 20 6e 3b 0a 20 20  ;.  p->n = n;.  
5610: 70 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 20 3d  p->u.zJContent =
5620: 20 7a 43 6f 6e 74 65 6e 74 3b 0a 20 20 72 65 74   zContent;.  ret
5630: 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 4e 6f 64  urn pParse->nNod
5640: 65 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  e++;.}../*.** Re
5650: 74 75 72 6e 20 74 72 75 65 20 69 66 20 7a 5b 5d  turn true if z[]
5660: 20 62 65 67 69 6e 73 20 77 69 74 68 20 34 20 28   begins with 4 (
5670: 6f 72 20 6d 6f 72 65 29 20 68 65 78 61 64 65 63  or more) hexadec
5680: 69 6d 61 6c 20 64 69 67 69 74 73 0a 2a 2f 0a 73  imal digits.*/.s
5690: 74 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e 49 73  tatic int jsonIs
56a0: 34 48 65 78 28 63 6f 6e 73 74 20 63 68 61 72 20  4Hex(const char 
56b0: 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *z){.  int i;.  
56c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 34 3b 20 69 2b  for(i=0; i<4; i+
56d0: 2b 29 20 69 66 28 20 21 73 61 66 65 5f 69 73 78  +) if( !safe_isx
56e0: 64 69 67 69 74 28 7a 5b 69 5d 29 20 29 20 72 65  digit(z[i]) ) re
56f0: 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e  turn 0;.  return
5700: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72   1;.}../*.** Par
5710: 73 65 20 61 20 73 69 6e 67 6c 65 20 4a 53 4f 4e  se a single JSON
5720: 20 76 61 6c 75 65 20 77 68 69 63 68 20 62 65 67   value which beg
5730: 69 6e 73 20 61 74 20 70 50 61 72 73 65 2d 3e 7a  ins at pParse->z
5740: 4a 73 6f 6e 5b 69 5d 2e 20 20 52 65 74 75 72 6e  Json[i].  Return
5750: 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66   the.** index of
5760: 20 74 68 65 20 66 69 72 73 74 20 63 68 61 72 61   the first chara
5770: 63 74 65 72 20 70 61 73 74 20 74 68 65 20 65 6e  cter past the en
5780: 64 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 70  d of the value p
5790: 61 72 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  arsed..**.** Ret
57a0: 75 72 6e 20 6e 65 67 61 74 69 76 65 20 66 6f 72  urn negative for
57b0: 20 61 20 73 79 6e 74 61 78 20 65 72 72 6f 72 2e   a syntax error.
57c0: 20 20 53 70 65 63 69 61 6c 20 63 61 73 65 73 3a    Special cases:
57d0: 20 20 72 65 74 75 72 6e 20 2d 32 20 69 66 20 74    return -2 if t
57e0: 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 6f 6e 2d  he.** first non-
57f0: 77 68 69 74 65 73 70 61 63 65 20 63 68 61 72 61  whitespace chara
5800: 63 74 65 72 20 69 73 20 27 7d 27 20 61 6e 64 20  cter is '}' and 
5810: 72 65 74 75 72 6e 20 2d 33 20 69 66 20 74 68 65  return -3 if the
5820: 20 66 69 72 73 74 0a 2a 2a 20 6e 6f 6e 2d 77 68   first.** non-wh
5830: 69 74 65 73 70 61 63 65 20 63 68 61 72 61 63 74  itespace charact
5840: 65 72 20 69 73 20 27 5d 27 2e 0a 2a 2f 0a 73 74  er is ']'..*/.st
5850: 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e 50 61 72  atic int jsonPar
5860: 73 65 56 61 6c 75 65 28 4a 73 6f 6e 50 61 72 73  seValue(JsonPars
5870: 65 20 2a 70 50 61 72 73 65 2c 20 75 33 32 20 69  e *pParse, u32 i
5880: 29 7b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 75  ){.  char c;.  u
5890: 33 32 20 6a 3b 0a 20 20 69 6e 74 20 69 54 68 69  32 j;.  int iThi
58a0: 73 3b 0a 20 20 69 6e 74 20 78 3b 0a 20 20 4a 73  s;.  int x;.  Js
58b0: 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 3b 0a 20  onNode *pNode;. 
58c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
58d0: 20 70 50 61 72 73 65 2d 3e 7a 4a 73 6f 6e 3b 0a   pParse->zJson;.
58e0: 20 20 77 68 69 6c 65 28 20 73 61 66 65 5f 69 73    while( safe_is
58f0: 73 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b 20 69  space(z[i]) ){ i
5900: 2b 2b 3b 20 7d 0a 20 20 69 66 28 20 28 63 20 3d  ++; }.  if( (c =
5910: 20 7a 5b 69 5d 29 3d 3d 27 7b 27 20 29 7b 0a 20   z[i])=='{' ){. 
5920: 20 20 20 2f 2a 20 50 61 72 73 65 20 6f 62 6a 65     /* Parse obje
5930: 63 74 20 2a 2f 0a 20 20 20 20 69 54 68 69 73 20  ct */.    iThis 
5940: 3d 20 6a 73 6f 6e 50 61 72 73 65 41 64 64 4e 6f  = jsonParseAddNo
5950: 64 65 28 70 50 61 72 73 65 2c 20 4a 53 4f 4e 5f  de(pParse, JSON_
5960: 4f 42 4a 45 43 54 2c 20 30 2c 20 30 29 3b 0a 20  OBJECT, 0, 0);. 
5970: 20 20 20 69 66 28 20 69 54 68 69 73 3c 30 20 29     if( iThis<0 )
5980: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
5990: 66 6f 72 28 6a 3d 69 2b 31 3b 3b 6a 2b 2b 29 7b  for(j=i+1;;j++){
59a0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 73 61  .      while( sa
59b0: 66 65 5f 69 73 73 70 61 63 65 28 7a 5b 6a 5d 29  fe_isspace(z[j])
59c0: 20 29 7b 20 6a 2b 2b 3b 20 7d 0a 20 20 20 20 20   ){ j++; }.     
59d0: 20 69 66 28 20 2b 2b 70 50 61 72 73 65 2d 3e 69   if( ++pParse->i
59e0: 44 65 70 74 68 20 3e 20 4a 53 4f 4e 5f 4d 41 58  Depth > JSON_MAX
59f0: 5f 44 45 50 54 48 20 29 20 72 65 74 75 72 6e 20  _DEPTH ) return 
5a00: 2d 31 3b 0a 20 20 20 20 20 20 78 20 3d 20 6a 73  -1;.      x = js
5a10: 6f 6e 50 61 72 73 65 56 61 6c 75 65 28 70 50 61  onParseValue(pPa
5a20: 72 73 65 2c 20 6a 29 3b 0a 20 20 20 20 20 20 69  rse, j);.      i
5a30: 66 28 20 78 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( x<0 ){.      
5a40: 20 20 70 50 61 72 73 65 2d 3e 69 44 65 70 74 68    pParse->iDepth
5a50: 2d 2d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  --;.        if( 
5a60: 78 3d 3d 28 2d 32 29 20 26 26 20 70 50 61 72 73  x==(-2) && pPars
5a70: 65 2d 3e 6e 4e 6f 64 65 3d 3d 28 75 33 32 29 69  e->nNode==(u32)i
5a80: 54 68 69 73 2b 31 20 29 20 72 65 74 75 72 6e 20  This+1 ) return 
5a90: 6a 2b 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74  j+1;.        ret
5aa0: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  urn -1;.      }.
5ab0: 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
5ac0: 2d 3e 6f 6f 6d 20 29 20 72 65 74 75 72 6e 20 2d  ->oom ) return -
5ad0: 31 3b 0a 20 20 20 20 20 20 70 4e 6f 64 65 20 3d  1;.      pNode =
5ae0: 20 26 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65 5b   &pParse->aNode[
5af0: 70 50 61 72 73 65 2d 3e 6e 4e 6f 64 65 2d 31 5d  pParse->nNode-1]
5b00: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 6f 64  ;.      if( pNod
5b10: 65 2d 3e 65 54 79 70 65 21 3d 4a 53 4f 4e 5f 53  e->eType!=JSON_S
5b20: 54 52 49 4e 47 20 29 20 72 65 74 75 72 6e 20 2d  TRING ) return -
5b30: 31 3b 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e  1;.      pNode->
5b40: 6a 6e 46 6c 61 67 73 20 7c 3d 20 4a 4e 4f 44 45  jnFlags |= JNODE
5b50: 5f 4c 41 42 45 4c 3b 0a 20 20 20 20 20 20 6a 20  _LABEL;.      j 
5b60: 3d 20 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  = x;.      while
5b70: 28 20 73 61 66 65 5f 69 73 73 70 61 63 65 28 7a  ( safe_isspace(z
5b80: 5b 6a 5d 29 20 29 7b 20 6a 2b 2b 3b 20 7d 0a 20  [j]) ){ j++; }. 
5b90: 20 20 20 20 20 69 66 28 20 7a 5b 6a 5d 21 3d 27       if( z[j]!='
5ba0: 3a 27 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  :' ) return -1;.
5bb0: 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
5bc0: 20 78 20 3d 20 6a 73 6f 6e 50 61 72 73 65 56 61   x = jsonParseVa
5bd0: 6c 75 65 28 70 50 61 72 73 65 2c 20 6a 29 3b 0a  lue(pParse, j);.
5be0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 69 44        pParse->iD
5bf0: 65 70 74 68 2d 2d 3b 0a 20 20 20 20 20 20 69 66  epth--;.      if
5c00: 28 20 78 3c 30 20 29 20 72 65 74 75 72 6e 20 2d  ( x<0 ) return -
5c10: 31 3b 0a 20 20 20 20 20 20 6a 20 3d 20 78 3b 0a  1;.      j = x;.
5c20: 20 20 20 20 20 20 77 68 69 6c 65 28 20 73 61 66        while( saf
5c30: 65 5f 69 73 73 70 61 63 65 28 7a 5b 6a 5d 29 20  e_isspace(z[j]) 
5c40: 29 7b 20 6a 2b 2b 3b 20 7d 0a 20 20 20 20 20 20  ){ j++; }.      
5c50: 63 20 3d 20 7a 5b 6a 5d 3b 0a 20 20 20 20 20 20  c = z[j];.      
5c60: 69 66 28 20 63 3d 3d 27 2c 27 20 29 20 63 6f 6e  if( c==',' ) con
5c70: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
5c80: 20 63 21 3d 27 7d 27 20 29 20 72 65 74 75 72 6e   c!='}' ) return
5c90: 20 2d 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   -1;.      break
5ca0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
5cb0: 73 65 2d 3e 61 4e 6f 64 65 5b 69 54 68 69 73 5d  se->aNode[iThis]
5cc0: 2e 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4e 6f  .n = pParse->nNo
5cd0: 64 65 20 2d 20 28 75 33 32 29 69 54 68 69 73 20  de - (u32)iThis 
5ce0: 2d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  - 1;.    return 
5cf0: 6a 2b 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  j+1;.  }else if(
5d00: 20 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 2f   c=='[' ){.    /
5d10: 2a 20 50 61 72 73 65 20 61 72 72 61 79 20 2a 2f  * Parse array */
5d20: 0a 20 20 20 20 69 54 68 69 73 20 3d 20 6a 73 6f  .    iThis = jso
5d30: 6e 50 61 72 73 65 41 64 64 4e 6f 64 65 28 70 50  nParseAddNode(pP
5d40: 61 72 73 65 2c 20 4a 53 4f 4e 5f 41 52 52 41 59  arse, JSON_ARRAY
5d50: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
5d60: 20 69 54 68 69 73 3c 30 20 29 20 72 65 74 75 72   iThis<0 ) retur
5d70: 6e 20 2d 31 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  n -1;.    for(j=
5d80: 69 2b 31 3b 3b 6a 2b 2b 29 7b 0a 20 20 20 20 20  i+1;;j++){.     
5d90: 20 77 68 69 6c 65 28 20 73 61 66 65 5f 69 73 73   while( safe_iss
5da0: 70 61 63 65 28 7a 5b 6a 5d 29 20 29 7b 20 6a 2b  pace(z[j]) ){ j+
5db0: 2b 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20 2b  +; }.      if( +
5dc0: 2b 70 50 61 72 73 65 2d 3e 69 44 65 70 74 68 20  +pParse->iDepth 
5dd0: 3e 20 4a 53 4f 4e 5f 4d 41 58 5f 44 45 50 54 48  > JSON_MAX_DEPTH
5de0: 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
5df0: 20 20 20 20 78 20 3d 20 6a 73 6f 6e 50 61 72 73      x = jsonPars
5e00: 65 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 6a  eValue(pParse, j
5e10: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
5e20: 3e 69 44 65 70 74 68 2d 2d 3b 0a 20 20 20 20 20  >iDepth--;.     
5e30: 20 69 66 28 20 78 3c 30 20 29 7b 0a 20 20 20 20   if( x<0 ){.    
5e40: 20 20 20 20 69 66 28 20 78 3d 3d 28 2d 33 29 20      if( x==(-3) 
5e50: 26 26 20 70 50 61 72 73 65 2d 3e 6e 4e 6f 64 65  && pParse->nNode
5e60: 3d 3d 28 75 33 32 29 69 54 68 69 73 2b 31 20 29  ==(u32)iThis+1 )
5e70: 20 72 65 74 75 72 6e 20 6a 2b 31 3b 0a 20 20 20   return j+1;.   
5e80: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
5e90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6a 20        }.      j 
5ea0: 3d 20 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  = x;.      while
5eb0: 28 20 73 61 66 65 5f 69 73 73 70 61 63 65 28 7a  ( safe_isspace(z
5ec0: 5b 6a 5d 29 20 29 7b 20 6a 2b 2b 3b 20 7d 0a 20  [j]) ){ j++; }. 
5ed0: 20 20 20 20 20 63 20 3d 20 7a 5b 6a 5d 3b 0a 20       c = z[j];. 
5ee0: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 2c 27 20       if( c==',' 
5ef0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
5f00: 20 20 69 66 28 20 63 21 3d 27 5d 27 20 29 20 72    if( c!=']' ) r
5f10: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
5f20: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
5f30: 20 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65 5b 69   pParse->aNode[i
5f40: 54 68 69 73 5d 2e 6e 20 3d 20 70 50 61 72 73 65  This].n = pParse
5f50: 2d 3e 6e 4e 6f 64 65 20 2d 20 28 75 33 32 29 69  ->nNode - (u32)i
5f60: 54 68 69 73 20 2d 20 31 3b 0a 20 20 20 20 72 65  This - 1;.    re
5f70: 74 75 72 6e 20 6a 2b 31 3b 0a 20 20 7d 65 6c 73  turn j+1;.  }els
5f80: 65 20 69 66 28 20 63 3d 3d 27 22 27 20 29 7b 0a  e if( c=='"' ){.
5f90: 20 20 20 20 2f 2a 20 50 61 72 73 65 20 73 74 72      /* Parse str
5fa0: 69 6e 67 20 2a 2f 0a 20 20 20 20 75 38 20 6a 6e  ing */.    u8 jn
5fb0: 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 6a  Flags = 0;.    j
5fc0: 20 3d 20 69 2b 31 3b 0a 20 20 20 20 66 6f 72 28   = i+1;.    for(
5fd0: 3b 3b 29 7b 0a 20 20 20 20 20 20 63 20 3d 20 7a  ;;){.      c = z
5fe0: 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 28  [j];.      if( (
5ff0: 63 20 26 20 7e 30 78 31 66 29 3d 3d 30 20 29 7b  c & ~0x1f)==0 ){
6000: 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74  .        /* Cont
6010: 72 6f 6c 20 63 68 61 72 61 63 74 65 72 73 20 61  rol characters a
6020: 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69  re not allowed i
6030: 6e 20 73 74 72 69 6e 67 73 20 2a 2f 0a 20 20 20  n strings */.   
6040: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
6050: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
6060: 28 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20  ( c=='\\' ){.   
6070: 20 20 20 20 20 63 20 3d 20 7a 5b 2b 2b 6a 5d 3b       c = z[++j];
6080: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d  .        if( c==
6090: 27 22 27 20 7c 7c 20 63 3d 3d 27 5c 5c 27 20 7c  '"' || c=='\\' |
60a0: 7c 20 63 3d 3d 27 2f 27 20 7c 7c 20 63 3d 3d 27  | c=='/' || c=='
60b0: 62 27 20 7c 7c 20 63 3d 3d 27 66 27 0a 20 20 20  b' || c=='f'.   
60c0: 20 20 20 20 20 20 20 20 7c 7c 20 63 3d 3d 27 6e          || c=='n
60d0: 27 20 7c 7c 20 63 3d 3d 27 72 27 20 7c 7c 20 63  ' || c=='r' || c
60e0: 3d 3d 27 74 27 0a 20 20 20 20 20 20 20 20 20 20  =='t'.          
60f0: 20 7c 7c 20 28 63 3d 3d 27 75 27 20 26 26 20 6a   || (c=='u' && j
6100: 73 6f 6e 49 73 34 48 65 78 28 7a 2b 6a 2b 31 29  sonIs4Hex(z+j+1)
6110: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6a  ) ){.          j
6120: 6e 46 6c 61 67 73 20 3d 20 4a 4e 4f 44 45 5f 45  nFlags = JNODE_E
6130: 53 43 41 50 45 3b 0a 20 20 20 20 20 20 20 20 7d  SCAPE;.        }
6140: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
6150: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
6160: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
6170: 20 69 66 28 20 63 3d 3d 27 22 27 20 29 7b 0a 20   if( c=='"' ){. 
6180: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
6190: 20 20 20 20 7d 0a 20 20 20 20 20 20 6a 2b 2b 3b      }.      j++;
61a0: 0a 20 20 20 20 7d 0a 20 20 20 20 6a 73 6f 6e 50  .    }.    jsonP
61b0: 61 72 73 65 41 64 64 4e 6f 64 65 28 70 50 61 72  arseAddNode(pPar
61c0: 73 65 2c 20 4a 53 4f 4e 5f 53 54 52 49 4e 47 2c  se, JSON_STRING,
61d0: 20 6a 2b 31 2d 69 2c 20 26 7a 5b 69 5d 29 3b 0a   j+1-i, &z[i]);.
61e0: 20 20 20 20 69 66 28 20 21 70 50 61 72 73 65 2d      if( !pParse-
61f0: 3e 6f 6f 6d 20 29 20 70 50 61 72 73 65 2d 3e 61  >oom ) pParse->a
6200: 4e 6f 64 65 5b 70 50 61 72 73 65 2d 3e 6e 4e 6f  Node[pParse->nNo
6210: 64 65 2d 31 5d 2e 6a 6e 46 6c 61 67 73 20 3d 20  de-1].jnFlags = 
6220: 6a 6e 46 6c 61 67 73 3b 0a 20 20 20 20 72 65 74  jnFlags;.    ret
6230: 75 72 6e 20 6a 2b 31 3b 0a 20 20 7d 65 6c 73 65  urn j+1;.  }else
6240: 20 69 66 28 20 63 3d 3d 27 6e 27 0a 20 20 20 20   if( c=='n'.    
6250: 20 20 20 20 20 26 26 20 73 74 72 6e 63 6d 70 28       && strncmp(
6260: 7a 2b 69 2c 22 6e 75 6c 6c 22 2c 34 29 3d 3d 30  z+i,"null",4)==0
6270: 0a 20 20 20 20 20 20 20 20 20 26 26 20 21 73 61  .         && !sa
6280: 66 65 5f 69 73 61 6c 6e 75 6d 28 7a 5b 69 2b 34  fe_isalnum(z[i+4
6290: 5d 29 20 29 7b 0a 20 20 20 20 6a 73 6f 6e 50 61  ]) ){.    jsonPa
62a0: 72 73 65 41 64 64 4e 6f 64 65 28 70 50 61 72 73  rseAddNode(pPars
62b0: 65 2c 20 4a 53 4f 4e 5f 4e 55 4c 4c 2c 20 30 2c  e, JSON_NULL, 0,
62c0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
62d0: 69 2b 34 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  i+4;.  }else if(
62e0: 20 63 3d 3d 27 74 27 0a 20 20 20 20 20 20 20 20   c=='t'.        
62f0: 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 2b 69 2c   && strncmp(z+i,
6300: 22 74 72 75 65 22 2c 34 29 3d 3d 30 0a 20 20 20  "true",4)==0.   
6310: 20 20 20 20 20 20 26 26 20 21 73 61 66 65 5f 69        && !safe_i
6320: 73 61 6c 6e 75 6d 28 7a 5b 69 2b 34 5d 29 20 29  salnum(z[i+4]) )
6330: 7b 0a 20 20 20 20 6a 73 6f 6e 50 61 72 73 65 41  {.    jsonParseA
6340: 64 64 4e 6f 64 65 28 70 50 61 72 73 65 2c 20 4a  ddNode(pParse, J
6350: 53 4f 4e 5f 54 52 55 45 2c 20 30 2c 20 30 29 3b  SON_TRUE, 0, 0);
6360: 0a 20 20 20 20 72 65 74 75 72 6e 20 69 2b 34 3b  .    return i+4;
6370: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d  .  }else if( c==
6380: 27 66 27 0a 20 20 20 20 20 20 20 20 20 26 26 20  'f'.         && 
6390: 73 74 72 6e 63 6d 70 28 7a 2b 69 2c 22 66 61 6c  strncmp(z+i,"fal
63a0: 73 65 22 2c 35 29 3d 3d 30 0a 20 20 20 20 20 20  se",5)==0.      
63b0: 20 20 20 26 26 20 21 73 61 66 65 5f 69 73 61 6c     && !safe_isal
63c0: 6e 75 6d 28 7a 5b 69 2b 35 5d 29 20 29 7b 0a 20  num(z[i+5]) ){. 
63d0: 20 20 20 6a 73 6f 6e 50 61 72 73 65 41 64 64 4e     jsonParseAddN
63e0: 6f 64 65 28 70 50 61 72 73 65 2c 20 4a 53 4f 4e  ode(pParse, JSON
63f0: 5f 46 41 4c 53 45 2c 20 30 2c 20 30 29 3b 0a 20  _FALSE, 0, 0);. 
6400: 20 20 20 72 65 74 75 72 6e 20 69 2b 35 3b 0a 20     return i+5;. 
6410: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 2d   }else if( c=='-
6420: 27 20 7c 7c 20 28 63 3e 3d 27 30 27 20 26 26 20  ' || (c>='0' && 
6430: 63 3c 3d 27 39 27 29 20 29 7b 0a 20 20 20 20 2f  c<='9') ){.    /
6440: 2a 20 50 61 72 73 65 20 6e 75 6d 62 65 72 20 2a  * Parse number *
6450: 2f 0a 20 20 20 20 75 38 20 73 65 65 6e 44 50 20  /.    u8 seenDP 
6460: 3d 20 30 3b 0a 20 20 20 20 75 38 20 73 65 65 6e  = 0;.    u8 seen
6470: 45 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  E = 0;.    asser
6480: 74 28 20 27 2d 27 20 3c 20 27 30 27 20 29 3b 0a  t( '-' < '0' );.
6490: 20 20 20 20 69 66 28 20 63 3c 3d 27 30 27 20 29      if( c<='0' )
64a0: 7b 0a 20 20 20 20 20 20 6a 20 3d 20 63 3d 3d 27  {.      j = c=='
64b0: 2d 27 20 3f 20 69 2b 31 20 3a 20 69 3b 0a 20 20  -' ? i+1 : i;.  
64c0: 20 20 20 20 69 66 28 20 7a 5b 6a 5d 3d 3d 27 30      if( z[j]=='0
64d0: 27 20 26 26 20 7a 5b 6a 2b 31 5d 3e 3d 27 30 27  ' && z[j+1]>='0'
64e0: 20 26 26 20 7a 5b 6a 2b 31 5d 3c 3d 27 39 27 20   && z[j+1]<='9' 
64f0: 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
6500: 20 7d 0a 20 20 20 20 6a 20 3d 20 69 2b 31 3b 0a   }.    j = i+1;.
6510: 20 20 20 20 66 6f 72 28 3b 3b 20 6a 2b 2b 29 7b      for(;; j++){
6520: 0a 20 20 20 20 20 20 63 20 3d 20 7a 5b 6a 5d 3b  .      c = z[j];
6530: 0a 20 20 20 20 20 20 69 66 28 20 63 3e 3d 27 30  .      if( c>='0
6540: 27 20 26 26 20 63 3c 3d 27 39 27 20 29 20 63 6f  ' && c<='9' ) co
6550: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
6560: 28 20 63 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20  ( c=='.' ){.    
6570: 20 20 20 20 69 66 28 20 7a 5b 6a 2d 31 5d 3d 3d      if( z[j-1]==
6580: 27 2d 27 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  '-' ) return -1;
6590: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 65 65  .        if( see
65a0: 6e 44 50 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  nDP ) return -1;
65b0: 0a 20 20 20 20 20 20 20 20 73 65 65 6e 44 50 20  .        seenDP 
65c0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  = 1;.        con
65d0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
65e0: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 65 27 20       if( c=='e' 
65f0: 7c 7c 20 63 3d 3d 27 45 27 20 29 7b 0a 20 20 20  || c=='E' ){.   
6600: 20 20 20 20 20 69 66 28 20 7a 5b 6a 2d 31 5d 3c       if( z[j-1]<
6610: 27 30 27 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  '0' ) return -1;
6620: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 65 65  .        if( see
6630: 6e 45 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  nE ) return -1;.
6640: 20 20 20 20 20 20 20 20 73 65 65 6e 44 50 20 3d          seenDP =
6650: 20 73 65 65 6e 45 20 3d 20 31 3b 0a 20 20 20 20   seenE = 1;.    
6660: 20 20 20 20 63 20 3d 20 7a 5b 6a 2b 31 5d 3b 0a      c = z[j+1];.
6670: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
6680: 2b 27 20 7c 7c 20 63 3d 3d 27 2d 27 20 29 7b 0a  +' || c=='-' ){.
6690: 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20            j++;. 
66a0: 20 20 20 20 20 20 20 20 20 63 20 3d 20 7a 5b 6a           c = z[j
66b0: 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  +1];.        }. 
66c0: 20 20 20 20 20 20 20 69 66 28 20 63 3c 27 30 27         if( c<'0'
66d0: 20 7c 7c 20 63 3e 27 39 27 20 29 20 72 65 74 75   || c>'9' ) retu
66e0: 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 63  rn -1;.        c
66f0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
6700: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6710: 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 5b 6a 2d    }.    if( z[j-
6720: 31 5d 3c 27 30 27 20 29 20 72 65 74 75 72 6e 20  1]<'0' ) return 
6730: 2d 31 3b 0a 20 20 20 20 6a 73 6f 6e 50 61 72 73  -1;.    jsonPars
6740: 65 41 64 64 4e 6f 64 65 28 70 50 61 72 73 65 2c  eAddNode(pParse,
6750: 20 73 65 65 6e 44 50 20 3f 20 4a 53 4f 4e 5f 52   seenDP ? JSON_R
6760: 45 41 4c 20 3a 20 4a 53 4f 4e 5f 49 4e 54 2c 0a  EAL : JSON_INT,.
6770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6780: 20 20 20 20 20 20 20 20 6a 20 2d 20 69 2c 20 26          j - i, &
6790: 7a 5b 69 5d 29 3b 0a 20 20 20 20 72 65 74 75 72  z[i]);.    retur
67a0: 6e 20 6a 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  n j;.  }else if(
67b0: 20 63 3d 3d 27 7d 27 20 29 7b 0a 20 20 20 20 72   c=='}' ){.    r
67c0: 65 74 75 72 6e 20 2d 32 3b 20 20 2f 2a 20 45 6e  eturn -2;  /* En
67d0: 64 20 6f 66 20 7b 2e 2e 2e 7d 20 2a 2f 0a 20 20  d of {...} */.  
67e0: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5d 27  }else if( c==']'
67f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d   ){.    return -
6800: 33 3b 20 20 2f 2a 20 45 6e 64 20 6f 66 20 5b 2e  3;  /* End of [.
6810: 2e 2e 5d 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69  ..] */.  }else i
6820: 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72  f( c==0 ){.    r
6830: 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 45 6e  eturn 0;   /* En
6840: 64 20 6f 66 20 66 69 6c 65 20 2a 2f 0a 20 20 7d  d of file */.  }
6850: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
6860: 20 2d 31 3b 20 20 2f 2a 20 53 79 6e 74 61 78 20   -1;  /* Syntax 
6870: 65 72 72 6f 72 20 2a 2f 0a 20 20 7d 0a 7d 0a 0a  error */.  }.}..
6880: 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 63 6f  /*.** Parse a co
6890: 6d 70 6c 65 74 65 20 4a 53 4f 4e 20 73 74 72 69  mplete JSON stri
68a0: 6e 67 2e 20 20 52 65 74 75 72 6e 20 30 20 6f 6e  ng.  Return 0 on
68b0: 20 73 75 63 63 65 73 73 20 6f 72 20 6e 6f 6e 2d   success or non-
68c0: 7a 65 72 6f 20 69 66 20 74 68 65 72 65 0a 2a 2a  zero if there.**
68d0: 20 61 72 65 20 61 6e 79 20 65 72 72 6f 72 73 2e   are any errors.
68e0: 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63    If an error oc
68f0: 63 75 72 73 2c 20 66 72 65 65 20 61 6c 6c 20 6d  curs, free all m
6900: 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
6910: 20 77 69 74 68 0a 2a 2a 20 70 50 61 72 73 65 2e   with.** pParse.
6920: 0a 2a 2a 0a 2a 2a 20 70 50 61 72 73 65 20 69 73  .**.** pParse is
6930: 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 77   uninitialized w
6940: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
6950: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73   is called..*/.s
6960: 74 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e 50 61  tatic int jsonPa
6970: 72 73 65 28 0a 20 20 4a 73 6f 6e 50 61 72 73 65  rse(.  JsonParse
6980: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
6990: 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
69a0: 65 20 61 6e 64 20 66 69 6c 6c 20 74 68 69 73 20  e and fill this 
69b0: 4a 73 6f 6e 50 61 72 73 65 20 6f 62 6a 65 63 74  JsonParse object
69c0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f   */.  sqlite3_co
69d0: 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20 20  ntext *pCtx,    
69e0: 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 65 72 72     /* Report err
69f0: 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f  ors here */.  co
6a00: 6e 73 74 20 63 68 61 72 20 2a 7a 4a 73 6f 6e 20  nst char *zJson 
6a10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
6a20: 70 75 74 20 4a 53 4f 4e 20 74 65 78 74 20 74 6f  put JSON text to
6a30: 20 62 65 20 70 61 72 73 65 64 20 2a 2f 0a 29 7b   be parsed */.){
6a40: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6d 65 6d 73  .  int i;.  mems
6a50: 65 74 28 70 50 61 72 73 65 2c 20 30 2c 20 73 69  et(pParse, 0, si
6a60: 7a 65 6f 66 28 2a 70 50 61 72 73 65 29 29 3b 0a  zeof(*pParse));.
6a70: 20 20 69 66 28 20 7a 4a 73 6f 6e 3d 3d 30 20 29    if( zJson==0 )
6a80: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 70 50 61   return 1;.  pPa
6a90: 72 73 65 2d 3e 7a 4a 73 6f 6e 20 3d 20 7a 4a 73  rse->zJson = zJs
6aa0: 6f 6e 3b 0a 20 20 69 20 3d 20 6a 73 6f 6e 50 61  on;.  i = jsonPa
6ab0: 72 73 65 56 61 6c 75 65 28 70 50 61 72 73 65 2c  rseValue(pParse,
6ac0: 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73   0);.  if( pPars
6ad0: 65 2d 3e 6f 6f 6d 20 29 20 69 20 3d 20 2d 31 3b  e->oom ) i = -1;
6ae0: 0a 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20  .  if( i>0 ){.  
6af0: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
6b00: 2d 3e 69 44 65 70 74 68 3d 3d 30 20 29 3b 0a 20  ->iDepth==0 );. 
6b10: 20 20 20 77 68 69 6c 65 28 20 73 61 66 65 5f 69     while( safe_i
6b20: 73 73 70 61 63 65 28 7a 4a 73 6f 6e 5b 69 5d 29  sspace(zJson[i])
6b30: 20 29 20 69 2b 2b 3b 0a 20 20 20 20 69 66 28 20   ) i++;.    if( 
6b40: 7a 4a 73 6f 6e 5b 69 5d 20 29 20 69 20 3d 20 2d  zJson[i] ) i = -
6b50: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c 3d  1;.  }.  if( i<=
6b60: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 74  0 ){.    if( pCt
6b70: 78 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  x!=0 ){.      if
6b80: 28 20 70 50 61 72 73 65 2d 3e 6f 6f 6d 20 29 7b  ( pParse->oom ){
6b90: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6ba0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
6bb0: 6d 65 6d 28 70 43 74 78 29 3b 0a 20 20 20 20 20  mem(pCtx);.     
6bc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6bd0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
6be0: 72 72 6f 72 28 70 43 74 78 2c 20 22 6d 61 6c 66  rror(pCtx, "malf
6bf0: 6f 72 6d 65 64 20 4a 53 4f 4e 22 2c 20 2d 31 29  ormed JSON", -1)
6c00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6c10: 20 20 20 20 6a 73 6f 6e 50 61 72 73 65 52 65 73      jsonParseRes
6c20: 65 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  et(pParse);.    
6c30: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
6c40: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20  return 0;.}../* 
6c50: 4d 61 72 6b 20 6e 6f 64 65 20 69 20 6f 66 20 70  Mark node i of p
6c60: 50 61 72 73 65 20 61 73 20 62 65 69 6e 67 20 61  Parse as being a
6c70: 20 63 68 69 6c 64 20 6f 66 20 69 50 61 72 65 6e   child of iParen
6c80: 74 2e 20 20 43 61 6c 6c 20 72 65 63 75 72 73 69  t.  Call recursi
6c90: 76 65 6c 79 0a 2a 2a 20 74 6f 20 66 69 6c 6c 20  vely.** to fill 
6ca0: 69 6e 20 61 6c 6c 20 74 68 65 20 64 65 73 63 65  in all the desce
6cb0: 6e 64 61 6e 74 73 20 6f 66 20 6e 6f 64 65 20 69  ndants of node i
6cc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6cd0: 20 6a 73 6f 6e 50 61 72 73 65 46 69 6c 6c 49 6e   jsonParseFillIn
6ce0: 50 61 72 65 6e 74 61 67 65 28 4a 73 6f 6e 50 61  Parentage(JsonPa
6cf0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 75 33 32  rse *pParse, u32
6d00: 20 69 2c 20 75 33 32 20 69 50 61 72 65 6e 74 29   i, u32 iParent)
6d10: 7b 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e  {.  JsonNode *pN
6d20: 6f 64 65 20 3d 20 26 70 50 61 72 73 65 2d 3e 61  ode = &pParse->a
6d30: 4e 6f 64 65 5b 69 5d 3b 0a 20 20 75 33 32 20 6a  Node[i];.  u32 j
6d40: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 61 55 70 5b  ;.  pParse->aUp[
6d50: 69 5d 20 3d 20 69 50 61 72 65 6e 74 3b 0a 20 20  i] = iParent;.  
6d60: 73 77 69 74 63 68 28 20 70 4e 6f 64 65 2d 3e 65  switch( pNode->e
6d70: 54 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  Type ){.    case
6d80: 20 4a 53 4f 4e 5f 41 52 52 41 59 3a 20 7b 0a 20   JSON_ARRAY: {. 
6d90: 20 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c       for(j=1; j<
6da0: 3d 70 4e 6f 64 65 2d 3e 6e 3b 20 6a 20 2b 3d 20  =pNode->n; j += 
6db0: 6a 73 6f 6e 4e 6f 64 65 53 69 7a 65 28 70 4e 6f  jsonNodeSize(pNo
6dc0: 64 65 2b 6a 29 29 7b 0a 20 20 20 20 20 20 20 20  de+j)){.        
6dd0: 6a 73 6f 6e 50 61 72 73 65 46 69 6c 6c 49 6e 50  jsonParseFillInP
6de0: 61 72 65 6e 74 61 67 65 28 70 50 61 72 73 65 2c  arentage(pParse,
6df0: 20 69 2b 6a 2c 20 69 29 3b 0a 20 20 20 20 20 20   i+j, i);.      
6e00: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
6e10: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 53     }.    case JS
6e20: 4f 4e 5f 4f 42 4a 45 43 54 3a 20 7b 0a 20 20 20  ON_OBJECT: {.   
6e30: 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 3d 70     for(j=1; j<=p
6e40: 4e 6f 64 65 2d 3e 6e 3b 20 6a 20 2b 3d 20 6a 73  Node->n; j += js
6e50: 6f 6e 4e 6f 64 65 53 69 7a 65 28 70 4e 6f 64 65  onNodeSize(pNode
6e60: 2b 6a 2b 31 29 2b 31 29 7b 0a 20 20 20 20 20 20  +j+1)+1){.      
6e70: 20 20 70 50 61 72 73 65 2d 3e 61 55 70 5b 69 2b    pParse->aUp[i+
6e80: 6a 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  j] = i;.        
6e90: 6a 73 6f 6e 50 61 72 73 65 46 69 6c 6c 49 6e 50  jsonParseFillInP
6ea0: 61 72 65 6e 74 61 67 65 28 70 50 61 72 73 65 2c  arentage(pParse,
6eb0: 20 69 2b 6a 2b 31 2c 20 69 29 3b 0a 20 20 20 20   i+j+1, i);.    
6ec0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
6ed0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
6ee0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 62 72 65 61  lt: {.      brea
6ef0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  k;.    }.  }.}..
6f00: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
6f10: 65 20 70 61 72 65 6e 74 61 67 65 20 6f 66 20 61  e parentage of a
6f20: 6c 6c 20 6e 6f 64 65 73 20 69 6e 20 61 20 63 6f  ll nodes in a co
6f30: 6d 70 6c 65 74 65 64 20 70 61 72 73 65 2e 0a 2a  mpleted parse..*
6f40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 73 6f  /.static int jso
6f50: 6e 50 61 72 73 65 46 69 6e 64 50 61 72 65 6e 74  nParseFindParent
6f60: 73 28 4a 73 6f 6e 50 61 72 73 65 20 2a 70 50 61  s(JsonParse *pPa
6f70: 72 73 65 29 7b 0a 20 20 75 33 32 20 2a 61 55 70  rse){.  u32 *aUp
6f80: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
6f90: 73 65 2d 3e 61 55 70 3d 3d 30 20 29 3b 0a 20 20  se->aUp==0 );.  
6fa0: 61 55 70 20 3d 20 70 50 61 72 73 65 2d 3e 61 55  aUp = pParse->aU
6fb0: 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  p = sqlite3_mall
6fc0: 6f 63 28 20 73 69 7a 65 6f 66 28 75 33 32 29 2a  oc( sizeof(u32)*
6fd0: 70 50 61 72 73 65 2d 3e 6e 4e 6f 64 65 20 29 3b  pParse->nNode );
6fe0: 0a 20 20 69 66 28 20 61 55 70 3d 3d 30 20 29 7b  .  if( aUp==0 ){
6ff0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6f 6f 6d  .    pParse->oom
7000: 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
7010: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
7020: 20 7d 0a 20 20 6a 73 6f 6e 50 61 72 73 65 46 69   }.  jsonParseFi
7030: 6c 6c 49 6e 50 61 72 65 6e 74 61 67 65 28 70 50  llInParentage(pP
7040: 61 72 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 72  arse, 0, 0);.  r
7050: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
7060: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 67 69 63 20  .}../*.** Magic 
7070: 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20  number used for 
7080: 74 68 65 20 4a 53 4f 4e 20 70 61 72 73 65 20 63  the JSON parse c
7090: 61 63 68 65 20 69 6e 20 73 71 6c 69 74 65 33 5f  ache in sqlite3_
70a0: 67 65 74 5f 61 75 78 64 61 74 61 28 29 0a 2a 2f  get_auxdata().*/
70b0: 0a 23 64 65 66 69 6e 65 20 4a 53 4f 4e 5f 43 41  .#define JSON_CA
70c0: 43 48 45 5f 49 44 20 20 28 2d 34 32 39 39 33 38  CHE_ID  (-429938
70d0: 29 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20  )../*.** Obtain 
70e0: 61 20 63 6f 6d 70 6c 65 74 65 20 70 61 72 73 65  a complete parse
70f0: 20 6f 66 20 74 68 65 20 4a 53 4f 4e 20 66 6f 75   of the JSON fou
7100: 6e 64 20 69 6e 20 74 68 65 20 66 69 72 73 74 20  nd in the first 
7110: 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 6f 66 20 74  argument.** of t
7120: 68 65 20 61 72 67 76 20 61 72 72 61 79 2e 20 20  he argv array.  
7130: 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  Use the sqlite3_
7140: 67 65 74 5f 61 75 78 64 61 74 61 28 29 20 63 61  get_auxdata() ca
7150: 63 68 65 20 66 6f 72 20 74 68 69 73 0a 2a 2a 20  che for this.** 
7160: 70 61 72 73 65 20 69 66 20 69 74 20 69 73 20 61  parse if it is a
7170: 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20 74 68  vailable.  If th
7180: 65 20 63 61 63 68 65 20 69 73 20 6e 6f 74 20 61  e cache is not a
7190: 76 61 69 6c 61 62 6c 65 20 6f 72 20 69 66 20 69  vailable or if i
71a0: 74 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  t.** is no longe
71b0: 72 20 76 61 6c 69 64 2c 20 70 61 72 73 65 20 74  r valid, parse t
71c0: 68 65 20 4a 53 4f 4e 20 61 67 61 69 6e 20 61 6e  he JSON again an
71d0: 64 20 72 65 74 75 72 6e 20 74 68 65 20 6e 65 77  d return the new
71e0: 20 70 61 72 73 65 2c 0a 2a 2a 20 61 6e 64 20 61   parse,.** and a
71f0: 6c 73 6f 20 72 65 67 69 73 74 65 72 20 74 68 65  lso register the
7200: 20 6e 65 77 20 70 61 72 73 65 20 73 6f 20 74 68   new parse so th
7210: 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20 61 76  at it will be av
7220: 61 69 6c 61 62 6c 65 20 66 6f 72 0a 2a 2a 20 66  ailable for.** f
7230: 75 74 75 72 65 20 73 71 6c 69 74 65 33 5f 67 65  uture sqlite3_ge
7240: 74 5f 61 75 78 64 61 74 61 28 29 20 63 61 6c 6c  t_auxdata() call
7250: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4a 73 6f  s..*/.static Jso
7260: 6e 50 61 72 73 65 20 2a 6a 73 6f 6e 50 61 72 73  nParse *jsonPars
7270: 65 43 61 63 68 65 64 28 0a 20 20 73 71 6c 69 74  eCached(.  sqlit
7280: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
7290: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
72a0: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f  e **argv.){.  co
72b0: 6e 73 74 20 63 68 61 72 20 2a 7a 4a 73 6f 6e 20  nst char *zJson 
72c0: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
72d0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
72e0: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 6e  t(argv[0]);.  in
72f0: 74 20 6e 4a 73 6f 6e 20 3d 20 73 71 6c 69 74 65  t nJson = sqlite
7300: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72  3_value_bytes(ar
7310: 67 76 5b 30 5d 29 3b 0a 20 20 4a 73 6f 6e 50 61  gv[0]);.  JsonPa
7320: 72 73 65 20 2a 70 3b 0a 20 20 69 66 28 20 7a 4a  rse *p;.  if( zJ
7330: 73 6f 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  son==0 ) return 
7340: 30 3b 0a 20 20 70 20 3d 20 28 4a 73 6f 6e 50 61  0;.  p = (JsonPa
7350: 72 73 65 2a 29 73 71 6c 69 74 65 33 5f 67 65 74  rse*)sqlite3_get
7360: 5f 61 75 78 64 61 74 61 28 70 43 74 78 2c 20 4a  _auxdata(pCtx, J
7370: 53 4f 4e 5f 43 41 43 48 45 5f 49 44 29 3b 0a 20  SON_CACHE_ID);. 
7380: 20 69 66 28 20 70 20 26 26 20 70 2d 3e 6e 4a 73   if( p && p->nJs
7390: 6f 6e 3d 3d 6e 4a 73 6f 6e 20 26 26 20 6d 65 6d  on==nJson && mem
73a0: 63 6d 70 28 70 2d 3e 7a 4a 73 6f 6e 2c 7a 4a 73  cmp(p->zJson,zJs
73b0: 6f 6e 2c 6e 4a 73 6f 6e 29 3d 3d 30 20 29 7b 0a  on,nJson)==0 ){.
73c0: 20 20 20 20 70 2d 3e 6e 45 72 72 20 3d 20 30 3b      p->nErr = 0;
73d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 3b 20 2f  .    return p; /
73e0: 2a 20 54 68 65 20 63 61 63 68 65 64 20 65 6e 74  * The cached ent
73f0: 72 79 20 6d 61 74 63 68 65 73 2c 20 73 6f 20 72  ry matches, so r
7400: 65 74 75 72 6e 20 69 74 20 2a 2f 0a 20 20 7d 0a  eturn it */.  }.
7410: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61    p = sqlite3_ma
7420: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29  lloc( sizeof(*p)
7430: 20 2b 20 6e 4a 73 6f 6e 20 2b 20 31 20 29 3b 0a   + nJson + 1 );.
7440: 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
7450: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
7460: 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74  _error_nomem(pCt
7470: 78 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  x);.    return 0
7480: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70  ;.  }.  memset(p
7490: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  , 0, sizeof(*p))
74a0: 3b 0a 20 20 70 2d 3e 7a 4a 73 6f 6e 20 3d 20 28  ;.  p->zJson = (
74b0: 63 68 61 72 2a 29 26 70 5b 31 5d 3b 0a 20 20 6d  char*)&p[1];.  m
74c0: 65 6d 63 70 79 28 28 63 68 61 72 2a 29 70 2d 3e  emcpy((char*)p->
74d0: 7a 4a 73 6f 6e 2c 20 7a 4a 73 6f 6e 2c 20 6e 4a  zJson, zJson, nJ
74e0: 73 6f 6e 2b 31 29 3b 0a 20 20 69 66 28 20 6a 73  son+1);.  if( js
74f0: 6f 6e 50 61 72 73 65 28 70 2c 20 70 43 74 78 2c  onParse(p, pCtx,
7500: 20 70 2d 3e 7a 4a 73 6f 6e 29 20 29 7b 0a 20 20   p->zJson) ){.  
7510: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
7520: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
7530: 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4a 73 6f 6e 20  .  }.  p->nJson 
7540: 3d 20 6e 4a 73 6f 6e 3b 0a 20 20 73 71 6c 69 74  = nJson;.  sqlit
7550: 65 33 5f 73 65 74 5f 61 75 78 64 61 74 61 28 70  e3_set_auxdata(p
7560: 43 74 78 2c 20 4a 53 4f 4e 5f 43 41 43 48 45 5f  Ctx, JSON_CACHE_
7570: 49 44 2c 20 70 2c 20 28 76 6f 69 64 28 2a 29 28  ID, p, (void(*)(
7580: 76 6f 69 64 2a 29 29 6a 73 6f 6e 50 61 72 73 65  void*))jsonParse
7590: 46 72 65 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Free);.  return 
75a0: 28 4a 73 6f 6e 50 61 72 73 65 2a 29 73 71 6c 69  (JsonParse*)sqli
75b0: 74 65 33 5f 67 65 74 5f 61 75 78 64 61 74 61 28  te3_get_auxdata(
75c0: 70 43 74 78 2c 20 4a 53 4f 4e 5f 43 41 43 48 45  pCtx, JSON_CACHE
75d0: 5f 49 44 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  _ID);.}../*.** C
75e0: 6f 6d 70 61 72 65 20 74 68 65 20 4f 42 4a 45 43  ompare the OBJEC
75f0: 54 20 6c 61 62 65 6c 20 61 74 20 70 4e 6f 64 65  T label at pNode
7600: 20 61 67 61 69 6e 73 74 20 7a 4b 65 79 2c 6e 4b   against zKey,nK
7610: 65 79 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65  ey.  Return true
7620: 20 6f 6e 0a 2a 2a 20 61 20 6d 61 74 63 68 2e 0a   on.** a match..
7630: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 73  */.static int js
7640: 6f 6e 4c 61 62 65 6c 43 6f 6d 70 61 72 65 28 4a  onLabelCompare(J
7650: 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 20  sonNode *pNode, 
7660: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65 79  const char *zKey
7670: 2c 20 75 33 32 20 6e 4b 65 79 29 7b 0a 20 20 69  , u32 nKey){.  i
7680: 66 28 20 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67  f( pNode->jnFlag
7690: 73 20 26 20 4a 4e 4f 44 45 5f 52 41 57 20 29 7b  s & JNODE_RAW ){
76a0: 0a 20 20 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e  .    if( pNode->
76b0: 6e 21 3d 6e 4b 65 79 20 29 20 72 65 74 75 72 6e  n!=nKey ) return
76c0: 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   0;.    return s
76d0: 74 72 6e 63 6d 70 28 70 4e 6f 64 65 2d 3e 75 2e  trncmp(pNode->u.
76e0: 7a 4a 43 6f 6e 74 65 6e 74 2c 20 7a 4b 65 79 2c  zJContent, zKey,
76f0: 20 6e 4b 65 79 29 3d 3d 30 3b 0a 20 20 7d 65 6c   nKey)==0;.  }el
7700: 73 65 7b 0a 20 20 20 20 69 66 28 20 70 4e 6f 64  se{.    if( pNod
7710: 65 2d 3e 6e 21 3d 6e 4b 65 79 2b 32 20 29 20 72  e->n!=nKey+2 ) r
7720: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 72 65 74  eturn 0;.    ret
7730: 75 72 6e 20 73 74 72 6e 63 6d 70 28 70 4e 6f 64  urn strncmp(pNod
7740: 65 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 2b 31  e->u.zJContent+1
7750: 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79 29 3d 3d 30  , zKey, nKey)==0
7760: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 66 6f 72 77  ;.  }.}../* forw
7770: 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  ard declaration 
7780: 2a 2f 0a 73 74 61 74 69 63 20 4a 73 6f 6e 4e 6f  */.static JsonNo
7790: 64 65 20 2a 6a 73 6f 6e 4c 6f 6f 6b 75 70 41 70  de *jsonLookupAp
77a0: 70 65 6e 64 28 4a 73 6f 6e 50 61 72 73 65 2a 2c  pend(JsonParse*,
77b0: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2a  const char*,int*
77c0: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 3b 0a  ,const char**);.
77d0: 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 61 6c  ./*.** Search al
77e0: 6f 6e 67 20 7a 50 61 74 68 20 74 6f 20 66 69 6e  ong zPath to fin
77f0: 64 20 74 68 65 20 6e 6f 64 65 20 73 70 65 63 69  d the node speci
7800: 66 69 65 64 2e 20 20 52 65 74 75 72 6e 20 61 20  fied.  Return a 
7810: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
7820: 61 74 20 6e 6f 64 65 2c 20 6f 72 20 4e 55 4c 4c  at node, or NULL
7830: 20 69 66 20 7a 50 61 74 68 20 69 73 20 6d 61 6c   if zPath is mal
7840: 66 6f 72 6d 65 64 20 6f 72 20 69 66 20 74 68 65  formed or if the
7850: 72 65 20 69 73 20 6e 6f 20 73 75 63 68 0a 2a 2a  re is no such.**
7860: 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   node..**.** If 
7870: 70 41 70 6e 64 21 3d 30 2c 20 74 68 65 6e 20 74  pApnd!=0, then t
7880: 72 79 20 74 6f 20 61 70 70 65 6e 64 20 6e 65 77  ry to append new
7890: 20 6e 6f 64 65 73 20 74 6f 20 63 6f 6d 70 6c 65   nodes to comple
78a0: 74 65 20 7a 50 61 74 68 20 69 66 20 69 74 20 69  te zPath if it i
78b0: 73 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74 6f  s.** possible to
78c0: 20 64 6f 20 73 6f 20 61 6e 64 20 69 66 20 6e 6f   do so and if no
78d0: 20 65 78 69 73 74 69 6e 67 20 6e 6f 64 65 20 63   existing node c
78e0: 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 7a 50  orresponds to zP
78f0: 61 74 68 2e 20 20 49 66 0a 2a 2a 20 6e 65 77 20  ath.  If.** new 
7900: 6e 6f 64 65 73 20 61 72 65 20 61 70 70 65 6e 64  nodes are append
7910: 65 64 20 2a 70 41 70 6e 64 20 69 73 20 73 65 74  ed *pApnd is set
7920: 20 74 6f 20 31 2e 0a 2a 2f 0a 73 74 61 74 69 63   to 1..*/.static
7930: 20 4a 73 6f 6e 4e 6f 64 65 20 2a 6a 73 6f 6e 4c   JsonNode *jsonL
7940: 6f 6f 6b 75 70 53 74 65 70 28 0a 20 20 4a 73 6f  ookupStep(.  Jso
7950: 6e 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  nParse *pParse, 
7960: 20 20 20 20 20 2f 2a 20 54 68 65 20 4a 53 4f 4e       /* The JSON
7970: 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
7980: 75 33 32 20 69 52 6f 6f 74 2c 20 20 20 20 20 20  u32 iRoot,      
7990: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
79a0: 20 74 68 65 20 73 65 61 72 63 68 20 61 74 20 74   the search at t
79b0: 68 69 73 20 6e 6f 64 65 20 2a 2f 0a 20 20 63 6f  his node */.  co
79c0: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
79d0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 74        /* The pat
79e0: 68 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  h to search */. 
79f0: 20 69 6e 74 20 2a 70 41 70 6e 64 2c 20 20 20 20   int *pApnd,    
7a00: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 70 70 65           /* Appe
7a10: 6e 64 20 6e 6f 64 65 73 20 74 6f 20 63 6f 6d 70  nd nodes to comp
7a20: 6c 65 74 65 20 70 61 74 68 20 69 66 20 6e 6f 74  lete path if not
7a30: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74   NULL */.  const
7a40: 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 20 20 20   char **pzErr   
7a50: 20 20 20 2f 2a 20 4d 61 6b 65 20 2a 70 7a 45 72     /* Make *pzEr
7a60: 72 20 70 6f 69 6e 74 20 74 6f 20 61 6e 79 20 73  r point to any s
7a70: 79 6e 74 61 78 20 65 72 72 6f 72 20 69 6e 20 7a  yntax error in z
7a80: 50 61 74 68 20 2a 2f 0a 29 7b 0a 20 20 75 33 32  Path */.){.  u32
7a90: 20 69 2c 20 6a 2c 20 6e 4b 65 79 3b 0a 20 20 63   i, j, nKey;.  c
7aa0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65 79 3b  onst char *zKey;
7ab0: 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 52 6f  .  JsonNode *pRo
7ac0: 6f 74 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 4e  ot = &pParse->aN
7ad0: 6f 64 65 5b 69 52 6f 6f 74 5d 3b 0a 20 20 69 66  ode[iRoot];.  if
7ae0: 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 30 20 29 20  ( zPath[0]==0 ) 
7af0: 72 65 74 75 72 6e 20 70 52 6f 6f 74 3b 0a 20 20  return pRoot;.  
7b00: 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 2e  if( zPath[0]=='.
7b10: 27 20 29 7b 0a 20 20 20 20 69 66 28 20 70 52 6f  ' ){.    if( pRo
7b20: 6f 74 2d 3e 65 54 79 70 65 21 3d 4a 53 4f 4e 5f  ot->eType!=JSON_
7b30: 4f 42 4a 45 43 54 20 29 20 72 65 74 75 72 6e 20  OBJECT ) return 
7b40: 30 3b 0a 20 20 20 20 7a 50 61 74 68 2b 2b 3b 0a  0;.    zPath++;.
7b50: 20 20 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d      if( zPath[0]
7b60: 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20 7a  =='"' ){.      z
7b70: 4b 65 79 20 3d 20 7a 50 61 74 68 20 2b 20 31 3b  Key = zPath + 1;
7b80: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  .      for(i=1; 
7b90: 7a 50 61 74 68 5b 69 5d 20 26 26 20 7a 50 61 74  zPath[i] && zPat
7ba0: 68 5b 69 5d 21 3d 27 22 27 3b 20 69 2b 2b 29 7b  h[i]!='"'; i++){
7bb0: 7d 0a 20 20 20 20 20 20 6e 4b 65 79 20 3d 20 69  }.      nKey = i
7bc0: 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50  -1;.      if( zP
7bd0: 61 74 68 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  ath[i] ){.      
7be0: 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c    i++;.      }el
7bf0: 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45  se{.        *pzE
7c00: 72 72 20 3d 20 7a 50 61 74 68 3b 0a 20 20 20 20  rr = zPath;.    
7c10: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
7c20: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
7c30: 0a 20 20 20 20 20 20 7a 4b 65 79 20 3d 20 7a 50  .      zKey = zP
7c40: 61 74 68 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  ath;.      for(i
7c50: 3d 30 3b 20 7a 50 61 74 68 5b 69 5d 20 26 26 20  =0; zPath[i] && 
7c60: 7a 50 61 74 68 5b 69 5d 21 3d 27 2e 27 20 26 26  zPath[i]!='.' &&
7c70: 20 7a 50 61 74 68 5b 69 5d 21 3d 27 5b 27 3b 20   zPath[i]!='['; 
7c80: 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 6e 4b 65  i++){}.      nKe
7c90: 79 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20  y = i;.    }.   
7ca0: 20 69 66 28 20 6e 4b 65 79 3d 3d 30 20 29 7b 0a   if( nKey==0 ){.
7cb0: 20 20 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 7a        *pzErr = z
7cc0: 50 61 74 68 3b 0a 20 20 20 20 20 20 72 65 74 75  Path;.      retu
7cd0: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
7ce0: 6a 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 3b  j = 1;.    for(;
7cf0: 3b 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  ;){.      while(
7d00: 20 6a 3c 3d 70 52 6f 6f 74 2d 3e 6e 20 29 7b 0a   j<=pRoot->n ){.
7d10: 20 20 20 20 20 20 20 20 69 66 28 20 6a 73 6f 6e          if( json
7d20: 4c 61 62 65 6c 43 6f 6d 70 61 72 65 28 70 52 6f  LabelCompare(pRo
7d30: 6f 74 2b 6a 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79  ot+j, zKey, nKey
7d40: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ) ){.          r
7d50: 65 74 75 72 6e 20 6a 73 6f 6e 4c 6f 6f 6b 75 70  eturn jsonLookup
7d60: 53 74 65 70 28 70 50 61 72 73 65 2c 20 69 52 6f  Step(pParse, iRo
7d70: 6f 74 2b 6a 2b 31 2c 20 26 7a 50 61 74 68 5b 69  ot+j+1, &zPath[i
7d80: 5d 2c 20 70 41 70 6e 64 2c 20 70 7a 45 72 72 29  ], pApnd, pzErr)
7d90: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
7da0: 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20      j++;.       
7db0: 20 6a 20 2b 3d 20 6a 73 6f 6e 4e 6f 64 65 53 69   j += jsonNodeSi
7dc0: 7a 65 28 26 70 52 6f 6f 74 5b 6a 5d 29 3b 0a 20  ze(&pRoot[j]);. 
7dd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
7de0: 20 28 70 52 6f 6f 74 2d 3e 6a 6e 46 6c 61 67 73   (pRoot->jnFlags
7df0: 20 26 20 4a 4e 4f 44 45 5f 41 50 50 45 4e 44 29   & JNODE_APPEND)
7e00: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
7e10: 20 20 20 69 52 6f 6f 74 20 2b 3d 20 70 52 6f 6f     iRoot += pRoo
7e20: 74 2d 3e 75 2e 69 41 70 70 65 6e 64 3b 0a 20 20  t->u.iAppend;.  
7e30: 20 20 20 20 70 52 6f 6f 74 20 3d 20 26 70 50 61      pRoot = &pPa
7e40: 72 73 65 2d 3e 61 4e 6f 64 65 5b 69 52 6f 6f 74  rse->aNode[iRoot
7e50: 5d 3b 0a 20 20 20 20 20 20 6a 20 3d 20 31 3b 0a  ];.      j = 1;.
7e60: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 41      }.    if( pA
7e70: 70 6e 64 20 29 7b 0a 20 20 20 20 20 20 75 33 32  pnd ){.      u32
7e80: 20 69 53 74 61 72 74 2c 20 69 4c 61 62 65 6c 3b   iStart, iLabel;
7e90: 0a 20 20 20 20 20 20 4a 73 6f 6e 4e 6f 64 65 20  .      JsonNode 
7ea0: 2a 70 4e 6f 64 65 3b 0a 20 20 20 20 20 20 69 53  *pNode;.      iS
7eb0: 74 61 72 74 20 3d 20 6a 73 6f 6e 50 61 72 73 65  tart = jsonParse
7ec0: 41 64 64 4e 6f 64 65 28 70 50 61 72 73 65 2c 20  AddNode(pParse, 
7ed0: 4a 53 4f 4e 5f 4f 42 4a 45 43 54 2c 20 32 2c 20  JSON_OBJECT, 2, 
7ee0: 30 29 3b 0a 20 20 20 20 20 20 69 4c 61 62 65 6c  0);.      iLabel
7ef0: 20 3d 20 6a 73 6f 6e 50 61 72 73 65 41 64 64 4e   = jsonParseAddN
7f00: 6f 64 65 28 70 50 61 72 73 65 2c 20 4a 53 4f 4e  ode(pParse, JSON
7f10: 5f 53 54 52 49 4e 47 2c 20 69 2c 20 7a 50 61 74  _STRING, i, zPat
7f20: 68 29 3b 0a 20 20 20 20 20 20 7a 50 61 74 68 20  h);.      zPath 
7f30: 2b 3d 20 69 3b 0a 20 20 20 20 20 20 70 4e 6f 64  += i;.      pNod
7f40: 65 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 41 70  e = jsonLookupAp
7f50: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 7a 50 61  pend(pParse, zPa
7f60: 74 68 2c 20 70 41 70 6e 64 2c 20 70 7a 45 72 72  th, pApnd, pzErr
7f70: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
7f80: 72 73 65 2d 3e 6f 6f 6d 20 29 20 72 65 74 75 72  rse->oom ) retur
7f90: 6e 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  n 0;.      if( p
7fa0: 4e 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Node ){.        
7fb0: 70 52 6f 6f 74 20 3d 20 26 70 50 61 72 73 65 2d  pRoot = &pParse-
7fc0: 3e 61 4e 6f 64 65 5b 69 52 6f 6f 74 5d 3b 0a 20  >aNode[iRoot];. 
7fd0: 20 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 75 2e         pRoot->u.
7fe0: 69 41 70 70 65 6e 64 20 3d 20 69 53 74 61 72 74  iAppend = iStart
7ff0: 20 2d 20 69 52 6f 6f 74 3b 0a 20 20 20 20 20 20   - iRoot;.      
8000: 20 20 70 52 6f 6f 74 2d 3e 6a 6e 46 6c 61 67 73    pRoot->jnFlags
8010: 20 7c 3d 20 4a 4e 4f 44 45 5f 41 50 50 45 4e 44   |= JNODE_APPEND
8020: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
8030: 2d 3e 61 4e 6f 64 65 5b 69 4c 61 62 65 6c 5d 2e  ->aNode[iLabel].
8040: 6a 6e 46 6c 61 67 73 20 7c 3d 20 4a 4e 4f 44 45  jnFlags |= JNODE
8050: 5f 52 41 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _RAW;.      }.  
8060: 20 20 20 20 72 65 74 75 72 6e 20 70 4e 6f 64 65      return pNode
8070: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
8080: 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 5b  if( zPath[0]=='[
8090: 27 20 26 26 20 73 61 66 65 5f 69 73 64 69 67 69  ' && safe_isdigi
80a0: 74 28 7a 50 61 74 68 5b 31 5d 29 20 29 7b 0a 20  t(zPath[1]) ){. 
80b0: 20 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 65 54     if( pRoot->eT
80c0: 79 70 65 21 3d 4a 53 4f 4e 5f 41 52 52 41 59 20  ype!=JSON_ARRAY 
80d0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
80e0: 69 20 3d 20 30 3b 0a 20 20 20 20 6a 20 3d 20 31  i = 0;.    j = 1
80f0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 61 66  ;.    while( saf
8100: 65 5f 69 73 64 69 67 69 74 28 7a 50 61 74 68 5b  e_isdigit(zPath[
8110: 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20 69 20 3d  j]) ){.      i =
8120: 20 69 2a 31 30 20 2b 20 7a 50 61 74 68 5b 6a 5d   i*10 + zPath[j]
8130: 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 6a 2b   - '0';.      j+
8140: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  +;.    }.    if(
8150: 20 7a 50 61 74 68 5b 6a 5d 21 3d 27 5d 27 20 29   zPath[j]!=']' )
8160: 7b 0a 20 20 20 20 20 20 2a 70 7a 45 72 72 20 3d  {.      *pzErr =
8170: 20 7a 50 61 74 68 3b 0a 20 20 20 20 20 20 72 65   zPath;.      re
8180: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
8190: 20 20 7a 50 61 74 68 20 2b 3d 20 6a 20 2b 20 31    zPath += j + 1
81a0: 3b 0a 20 20 20 20 6a 20 3d 20 31 3b 0a 20 20 20  ;.    j = 1;.   
81b0: 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20   for(;;){.      
81c0: 77 68 69 6c 65 28 20 6a 3c 3d 70 52 6f 6f 74 2d  while( j<=pRoot-
81d0: 3e 6e 20 26 26 20 28 69 3e 30 20 7c 7c 20 28 70  >n && (i>0 || (p
81e0: 52 6f 6f 74 5b 6a 5d 2e 6a 6e 46 6c 61 67 73 20  Root[j].jnFlags 
81f0: 26 20 4a 4e 4f 44 45 5f 52 45 4d 4f 56 45 29 21  & JNODE_REMOVE)!
8200: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  =0) ){.        i
8210: 66 28 20 28 70 52 6f 6f 74 5b 6a 5d 2e 6a 6e 46  f( (pRoot[j].jnF
8220: 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 52 45 4d  lags & JNODE_REM
8230: 4f 56 45 29 3d 3d 30 20 29 20 69 2d 2d 3b 0a 20  OVE)==0 ) i--;. 
8240: 20 20 20 20 20 20 20 6a 20 2b 3d 20 6a 73 6f 6e         j += json
8250: 4e 6f 64 65 53 69 7a 65 28 26 70 52 6f 6f 74 5b  NodeSize(&pRoot[
8260: 6a 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  j]);.      }.   
8270: 20 20 20 69 66 28 20 28 70 52 6f 6f 74 2d 3e 6a     if( (pRoot->j
8280: 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 41  nFlags & JNODE_A
8290: 50 50 45 4e 44 29 3d 3d 30 20 29 20 62 72 65 61  PPEND)==0 ) brea
82a0: 6b 3b 0a 20 20 20 20 20 20 69 52 6f 6f 74 20 2b  k;.      iRoot +
82b0: 3d 20 70 52 6f 6f 74 2d 3e 75 2e 69 41 70 70 65  = pRoot->u.iAppe
82c0: 6e 64 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 20  nd;.      pRoot 
82d0: 3d 20 26 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65  = &pParse->aNode
82e0: 5b 69 52 6f 6f 74 5d 3b 0a 20 20 20 20 20 20 6a  [iRoot];.      j
82f0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
8300: 69 66 28 20 6a 3c 3d 70 52 6f 6f 74 2d 3e 6e 20  if( j<=pRoot->n 
8310: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
8320: 6a 73 6f 6e 4c 6f 6f 6b 75 70 53 74 65 70 28 70  jsonLookupStep(p
8330: 50 61 72 73 65 2c 20 69 52 6f 6f 74 2b 6a 2c 20  Parse, iRoot+j, 
8340: 7a 50 61 74 68 2c 20 70 41 70 6e 64 2c 20 70 7a  zPath, pApnd, pz
8350: 45 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Err);.    }.    
8360: 69 66 28 20 69 3d 3d 30 20 26 26 20 70 41 70 6e  if( i==0 && pApn
8370: 64 20 29 7b 0a 20 20 20 20 20 20 75 33 32 20 69  d ){.      u32 i
8380: 53 74 61 72 74 3b 0a 20 20 20 20 20 20 4a 73 6f  Start;.      Jso
8390: 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 3b 0a 20 20  nNode *pNode;.  
83a0: 20 20 20 20 69 53 74 61 72 74 20 3d 20 6a 73 6f      iStart = jso
83b0: 6e 50 61 72 73 65 41 64 64 4e 6f 64 65 28 70 50  nParseAddNode(pP
83c0: 61 72 73 65 2c 20 4a 53 4f 4e 5f 41 52 52 41 59  arse, JSON_ARRAY
83d0: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  , 1, 0);.      p
83e0: 4e 6f 64 65 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75  Node = jsonLooku
83f0: 70 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  pAppend(pParse, 
8400: 7a 50 61 74 68 2c 20 70 41 70 6e 64 2c 20 70 7a  zPath, pApnd, pz
8410: 45 72 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Err);.      if( 
8420: 70 50 61 72 73 65 2d 3e 6f 6f 6d 20 29 20 72 65  pParse->oom ) re
8430: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 69 66  turn 0;.      if
8440: 28 20 70 4e 6f 64 65 20 29 7b 0a 20 20 20 20 20  ( pNode ){.     
8450: 20 20 20 70 52 6f 6f 74 20 3d 20 26 70 50 61 72     pRoot = &pPar
8460: 73 65 2d 3e 61 4e 6f 64 65 5b 69 52 6f 6f 74 5d  se->aNode[iRoot]
8470: 3b 0a 20 20 20 20 20 20 20 20 70 52 6f 6f 74 2d  ;.        pRoot-
8480: 3e 75 2e 69 41 70 70 65 6e 64 20 3d 20 69 53 74  >u.iAppend = iSt
8490: 61 72 74 20 2d 20 69 52 6f 6f 74 3b 0a 20 20 20  art - iRoot;.   
84a0: 20 20 20 20 20 70 52 6f 6f 74 2d 3e 6a 6e 46 6c       pRoot->jnFl
84b0: 61 67 73 20 7c 3d 20 4a 4e 4f 44 45 5f 41 50 50  ags |= JNODE_APP
84c0: 45 4e 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  END;.      }.   
84d0: 20 20 20 72 65 74 75 72 6e 20 70 4e 6f 64 65 3b     return pNode;
84e0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
84f0: 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 7a 50 61      *pzErr = zPa
8500: 74 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  th;.  }.  return
8510: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70   0;.}../*.** App
8520: 65 6e 64 20 63 6f 6e 74 65 6e 74 20 74 6f 20 70  end content to p
8530: 50 61 72 73 65 20 74 68 61 74 20 77 69 6c 6c 20  Parse that will 
8540: 63 6f 6d 70 6c 65 74 65 20 7a 50 61 74 68 2e 20  complete zPath. 
8550: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
8560: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 69 6e 73 65  r.** to the inse
8570: 72 74 65 64 20 6e 6f 64 65 2c 20 6f 72 20 72 65  rted node, or re
8580: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65  turn NULL if the
8590: 20 61 70 70 65 6e 64 20 66 61 69 6c 73 2e 0a 2a   append fails..*
85a0: 2f 0a 73 74 61 74 69 63 20 4a 73 6f 6e 4e 6f 64  /.static JsonNod
85b0: 65 20 2a 6a 73 6f 6e 4c 6f 6f 6b 75 70 41 70 70  e *jsonLookupApp
85c0: 65 6e 64 28 0a 20 20 4a 73 6f 6e 50 61 72 73 65  end(.  JsonParse
85d0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
85e0: 20 41 70 70 65 6e 64 20 63 6f 6e 74 65 6e 74 20   Append content 
85f0: 74 6f 20 74 68 65 20 4a 53 4f 4e 20 70 61 72 73  to the JSON pars
8600: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
8610: 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 2f 2a  r *zPath,     /*
8620: 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
8630: 63 6f 6e 74 65 6e 74 20 74 6f 20 61 70 70 65 6e  content to appen
8640: 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 70 6e  d */.  int *pApn
8650: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d,            /*
8660: 20 53 65 74 20 74 68 69 73 20 66 6c 61 67 20 74   Set this flag t
8670: 6f 20 31 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  o 1 */.  const c
8680: 68 61 72 20 2a 2a 70 7a 45 72 72 20 20 20 20 20  har **pzErr     
8690: 2f 2a 20 4d 61 6b 65 20 74 68 69 73 20 70 6f 69  /* Make this poi
86a0: 6e 74 20 74 6f 20 61 6e 79 20 73 79 6e 74 61 78  nt to any syntax
86b0: 20 65 72 72 6f 72 20 2a 2f 0a 29 7b 0a 20 20 2a   error */.){.  *
86c0: 70 41 70 6e 64 20 3d 20 31 3b 0a 20 20 69 66 28  pApnd = 1;.  if(
86d0: 20 7a 50 61 74 68 5b 30 5d 3d 3d 30 20 29 7b 0a   zPath[0]==0 ){.
86e0: 20 20 20 20 6a 73 6f 6e 50 61 72 73 65 41 64 64      jsonParseAdd
86f0: 4e 6f 64 65 28 70 50 61 72 73 65 2c 20 4a 53 4f  Node(pParse, JSO
8700: 4e 5f 4e 55 4c 4c 2c 20 30 2c 20 30 29 3b 0a 20  N_NULL, 0, 0);. 
8710: 20 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65     return pParse
8720: 2d 3e 6f 6f 6d 20 3f 20 30 20 3a 20 26 70 50 61  ->oom ? 0 : &pPa
8730: 72 73 65 2d 3e 61 4e 6f 64 65 5b 70 50 61 72 73  rse->aNode[pPars
8740: 65 2d 3e 6e 4e 6f 64 65 2d 31 5d 3b 0a 20 20 7d  e->nNode-1];.  }
8750: 0a 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d  .  if( zPath[0]=
8760: 3d 27 2e 27 20 29 7b 0a 20 20 20 20 6a 73 6f 6e  ='.' ){.    json
8770: 50 61 72 73 65 41 64 64 4e 6f 64 65 28 70 50 61  ParseAddNode(pPa
8780: 72 73 65 2c 20 4a 53 4f 4e 5f 4f 42 4a 45 43 54  rse, JSON_OBJECT
8790: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  , 0, 0);.  }else
87a0: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 50 61   if( strncmp(zPa
87b0: 74 68 2c 22 5b 30 5d 22 2c 33 29 3d 3d 30 20 29  th,"[0]",3)==0 )
87c0: 7b 0a 20 20 20 20 6a 73 6f 6e 50 61 72 73 65 41  {.    jsonParseA
87d0: 64 64 4e 6f 64 65 28 70 50 61 72 73 65 2c 20 4a  ddNode(pParse, J
87e0: 53 4f 4e 5f 41 52 52 41 59 2c 20 30 2c 20 30 29  SON_ARRAY, 0, 0)
87f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
8800: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
8810: 66 28 20 70 50 61 72 73 65 2d 3e 6f 6f 6d 20 29  f( pParse->oom )
8820: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74   return 0;.  ret
8830: 75 72 6e 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 53 74  urn jsonLookupSt
8840: 65 70 28 70 50 61 72 73 65 2c 20 70 50 61 72 73  ep(pParse, pPars
8850: 65 2d 3e 6e 4e 6f 64 65 2d 31 2c 20 7a 50 61 74  e->nNode-1, zPat
8860: 68 2c 20 70 41 70 6e 64 2c 20 70 7a 45 72 72 29  h, pApnd, pzErr)
8870: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
8880: 6e 20 74 68 65 20 74 65 78 74 20 6f 66 20 61 20  n the text of a 
8890: 73 79 6e 74 61 78 20 65 72 72 6f 72 20 6d 65 73  syntax error mes
88a0: 73 61 67 65 20 6f 6e 20 61 20 4a 53 4f 4e 20 70  sage on a JSON p
88b0: 61 74 68 2e 20 20 53 70 61 63 65 20 69 73 0a 2a  ath.  Space is.*
88c0: 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  * obtained from 
88d0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
88e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
88f0: 20 2a 6a 73 6f 6e 50 61 74 68 53 79 6e 74 61 78   *jsonPathSyntax
8900: 45 72 72 6f 72 28 63 6f 6e 73 74 20 63 68 61 72  Error(const char
8910: 20 2a 7a 45 72 72 29 7b 0a 20 20 72 65 74 75 72   *zErr){.  retur
8920: 6e 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  n sqlite3_mprint
8930: 66 28 22 4a 53 4f 4e 20 70 61 74 68 20 65 72 72  f("JSON path err
8940: 6f 72 20 6e 65 61 72 20 27 25 71 27 22 2c 20 7a  or near '%q'", z
8950: 45 72 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  Err);.}../*.** D
8960: 6f 20 61 20 6e 6f 64 65 20 6c 6f 6f 6b 75 70 20  o a node lookup 
8970: 75 73 69 6e 67 20 7a 50 61 74 68 2e 20 20 52 65  using zPath.  Re
8980: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
8990: 6f 20 74 68 65 20 6e 6f 64 65 20 6f 6e 20 73 75  o the node on su
89a0: 63 63 65 73 73 2e 0a 2a 2a 20 52 65 74 75 72 6e  ccess..** Return
89b0: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
89c0: 6e 64 20 6f 72 20 69 66 20 74 68 65 72 65 20 69  nd or if there i
89d0: 73 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  s an error..**.*
89e0: 2a 20 4f 6e 20 61 6e 20 65 72 72 6f 72 2c 20 77  * On an error, w
89f0: 72 69 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  rite an error me
8a00: 73 73 61 67 65 20 69 6e 74 6f 20 70 43 74 78 20  ssage into pCtx 
8a10: 61 6e 64 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  and increment th
8a20: 65 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 6e 45 72  e.** pParse->nEr
8a30: 72 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  r counter..**.**
8a40: 20 49 66 20 70 41 70 6e 64 21 3d 4e 55 4c 4c 20   If pApnd!=NULL 
8a50: 74 68 65 6e 20 74 72 79 20 74 6f 20 61 70 70 65  then try to appe
8a60: 6e 64 20 6d 69 73 73 69 6e 67 20 6e 6f 64 65 73  nd missing nodes
8a70: 20 61 6e 64 20 73 65 74 20 2a 70 41 70 6e 64 20   and set *pApnd 
8a80: 3d 20 31 20 69 66 0a 2a 2a 20 6e 6f 64 65 73 20  = 1 if.** nodes 
8a90: 61 72 65 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f  are appended..*/
8aa0: 0a 73 74 61 74 69 63 20 4a 73 6f 6e 4e 6f 64 65  .static JsonNode
8ab0: 20 2a 6a 73 6f 6e 4c 6f 6f 6b 75 70 28 0a 20 20   *jsonLookup(.  
8ac0: 4a 73 6f 6e 50 61 72 73 65 20 2a 70 50 61 72 73  JsonParse *pPars
8ad0: 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4a  e,      /* The J
8ae0: 53 4f 4e 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  SON to search */
8af0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
8b00: 50 61 74 68 2c 20 20 20 20 20 20 2f 2a 20 54 68  Path,      /* Th
8b10: 65 20 70 61 74 68 20 74 6f 20 73 65 61 72 63 68  e path to search
8b20: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 70 6e 64   */.  int *pApnd
8b30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
8b40: 20 41 70 70 65 6e 64 20 6e 6f 64 65 73 20 74 6f   Append nodes to
8b50: 20 63 6f 6d 70 6c 65 74 65 20 70 61 74 68 20 69   complete path i
8b60: 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20  f not NULL */.  
8b70: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
8b80: 2a 70 43 74 78 20 20 20 2f 2a 20 52 65 70 6f 72  *pCtx   /* Repor
8b90: 74 20 65 72 72 6f 72 73 20 68 65 72 65 2c 20 69  t errors here, i
8ba0: 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  f not NULL */.){
8bb0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
8bc0: 45 72 72 20 3d 20 30 3b 0a 20 20 4a 73 6f 6e 4e  Err = 0;.  JsonN
8bd0: 6f 64 65 20 2a 70 4e 6f 64 65 20 3d 20 30 3b 0a  ode *pNode = 0;.
8be0: 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 0a 20    char *zMsg;.. 
8bf0: 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20 29 20   if( zPath==0 ) 
8c00: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
8c10: 7a 50 61 74 68 5b 30 5d 21 3d 27 24 27 20 29 7b  zPath[0]!='$' ){
8c20: 0a 20 20 20 20 7a 45 72 72 20 3d 20 7a 50 61 74  .    zErr = zPat
8c30: 68 3b 0a 20 20 20 20 67 6f 74 6f 20 6c 6f 6f 6b  h;.    goto look
8c40: 75 70 5f 65 72 72 3b 0a 20 20 7d 0a 20 20 7a 50  up_err;.  }.  zP
8c50: 61 74 68 2b 2b 3b 0a 20 20 70 4e 6f 64 65 20 3d  ath++;.  pNode =
8c60: 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 53 74 65 70 28   jsonLookupStep(
8c70: 70 50 61 72 73 65 2c 20 30 2c 20 7a 50 61 74 68  pParse, 0, zPath
8c80: 2c 20 70 41 70 6e 64 2c 20 26 7a 45 72 72 29 3b  , pApnd, &zErr);
8c90: 0a 20 20 69 66 28 20 7a 45 72 72 3d 3d 30 20 29  .  if( zErr==0 )
8ca0: 20 72 65 74 75 72 6e 20 70 4e 6f 64 65 3b 0a 0a   return pNode;..
8cb0: 6c 6f 6f 6b 75 70 5f 65 72 72 3a 0a 20 20 70 50  lookup_err:.  pP
8cc0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
8cd0: 61 73 73 65 72 74 28 20 7a 45 72 72 21 3d 30 20  assert( zErr!=0 
8ce0: 26 26 20 70 43 74 78 21 3d 30 20 29 3b 0a 20 20  && pCtx!=0 );.  
8cf0: 7a 4d 73 67 20 3d 20 6a 73 6f 6e 50 61 74 68 53  zMsg = jsonPathS
8d00: 79 6e 74 61 78 45 72 72 6f 72 28 7a 45 72 72 29  yntaxError(zErr)
8d10: 3b 0a 20 20 69 66 28 20 7a 4d 73 67 20 29 7b 0a  ;.  if( zMsg ){.
8d20: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
8d30: 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 7a  lt_error(pCtx, z
8d40: 4d 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71  Msg, -1);.    sq
8d50: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 73 67 29  lite3_free(zMsg)
8d60: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
8d70: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
8d80: 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78 29 3b  ror_nomem(pCtx);
8d90: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
8da0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72  .}.../*.** Repor
8db0: 74 20 74 68 65 20 77 72 6f 6e 67 20 6e 75 6d 62  t the wrong numb
8dc0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
8dd0: 66 6f 72 20 6a 73 6f 6e 5f 69 6e 73 65 72 74 28  for json_insert(
8de0: 29 2c 20 6a 73 6f 6e 5f 72 65 70 6c 61 63 65 28  ), json_replace(
8df0: 29 0a 2a 2a 20 6f 72 20 6a 73 6f 6e 5f 73 65 74  ).** or json_set
8e00: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
8e10: 69 64 20 6a 73 6f 6e 57 72 6f 6e 67 4e 75 6d 41  id jsonWrongNumA
8e20: 72 67 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  rgs(.  sqlite3_c
8e30: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 0a 20 20  ontext *pCtx,.  
8e40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
8e50: 63 4e 61 6d 65 0a 29 7b 0a 20 20 63 68 61 72 20  cName.){.  char 
8e60: 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  *zMsg = sqlite3_
8e70: 6d 70 72 69 6e 74 66 28 22 6a 73 6f 6e 5f 25 73  mprintf("json_%s
8e80: 28 29 20 6e 65 65 64 73 20 61 6e 20 6f 64 64 20  () needs an odd 
8e90: 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
8ea0: 6e 74 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  nts",.          
8eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ec0: 20 20 20 20 20 7a 46 75 6e 63 4e 61 6d 65 29 3b       zFuncName);
8ed0: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
8ee0: 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 7a 4d  t_error(pCtx, zM
8ef0: 73 67 2c 20 2d 31 29 3b 0a 20 20 73 71 6c 69 74  sg, -1);.  sqlit
8f00: 65 33 5f 66 72 65 65 28 7a 4d 73 67 29 3b 20 20  e3_free(zMsg);  
8f10: 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72     .}../*.** Mar
8f20: 6b 20 61 6c 6c 20 4e 55 4c 4c 20 65 6e 74 72 69  k all NULL entri
8f30: 65 73 20 69 6e 20 74 68 65 20 4f 62 6a 65 63 74  es in the Object
8f40: 20 70 61 73 73 65 64 20 69 6e 20 61 73 20 4a 4e   passed in as JN
8f50: 4f 44 45 5f 52 45 4d 4f 56 45 2e 0a 2a 2f 0a 73  ODE_REMOVE..*/.s
8f60: 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 52  tatic void jsonR
8f70: 65 6d 6f 76 65 41 6c 6c 4e 75 6c 6c 73 28 4a 73  emoveAllNulls(Js
8f80: 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 29 7b 0a  onNode *pNode){.
8f90: 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 61 73    int i, n;.  as
8fa0: 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e 65 54 79  sert( pNode->eTy
8fb0: 70 65 3d 3d 4a 53 4f 4e 5f 4f 42 4a 45 43 54 20  pe==JSON_OBJECT 
8fc0: 29 3b 0a 20 20 6e 20 3d 20 70 4e 6f 64 65 2d 3e  );.  n = pNode->
8fd0: 6e 3b 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c  n;.  for(i=2; i<
8fe0: 3d 6e 3b 20 69 20 2b 3d 20 6a 73 6f 6e 4e 6f 64  =n; i += jsonNod
8ff0: 65 53 69 7a 65 28 26 70 4e 6f 64 65 5b 69 5d 29  eSize(&pNode[i])
9000: 2b 31 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28  +1){.    switch(
9010: 20 70 4e 6f 64 65 5b 69 5d 2e 65 54 79 70 65 20   pNode[i].eType 
9020: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4a 53  ){.      case JS
9030: 4f 4e 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20 20 20  ON_NULL:.       
9040: 20 70 4e 6f 64 65 5b 69 5d 2e 6a 6e 46 6c 61 67   pNode[i].jnFlag
9050: 73 20 7c 3d 20 4a 4e 4f 44 45 5f 52 45 4d 4f 56  s |= JNODE_REMOV
9060: 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  E;.        break
9070: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4a 53 4f  ;.      case JSO
9080: 4e 5f 4f 42 4a 45 43 54 3a 0a 20 20 20 20 20 20  N_OBJECT:.      
9090: 20 20 6a 73 6f 6e 52 65 6d 6f 76 65 41 6c 6c 4e    jsonRemoveAllN
90a0: 75 6c 6c 73 28 26 70 4e 6f 64 65 5b 69 5d 29 3b  ulls(&pNode[i]);
90b0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
90c0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a      }.  }.}.../*
90d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
90e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
90f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 53  ***********.** S
9120: 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65  QL functions use
9130: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
9140: 64 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a 2a 2a  d debugging.****
9150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9170: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9180: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9190: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66 64 65  ********/..#ifde
91a0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
91b0: 2a 0a 2a 2a 20 54 68 65 20 6a 73 6f 6e 5f 70 61  *.** The json_pa
91c0: 72 73 65 28 4a 53 4f 4e 29 20 66 75 6e 63 74 69  rse(JSON) functi
91d0: 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 73 74 72  on returns a str
91e0: 69 6e 67 20 77 68 69 63 68 20 64 65 73 63 72 69  ing which descri
91f0: 62 65 73 0a 2a 2a 20 61 20 70 61 72 73 65 20 6f  bes.** a parse o
9200: 66 20 74 68 65 20 4a 53 4f 4e 20 70 72 6f 76 69  f the JSON provi
9210: 64 65 64 2e 20 20 4f 72 20 69 74 20 72 65 74 75  ded.  Or it retu
9220: 72 6e 73 20 4e 55 4c 4c 20 69 66 20 4a 53 4f 4e  rns NULL if JSON
9230: 20 69 73 20 6e 6f 74 0a 2a 2a 20 77 65 6c 6c 2d   is not.** well-
9240: 66 6f 72 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  formed..*/.stati
9250: 63 20 76 6f 69 64 20 6a 73 6f 6e 50 61 72 73 65  c void jsonParse
9260: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
9270: 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 0a 20 20  context *ctx,.  
9280: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
9290: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
92a0: 0a 29 7b 0a 20 20 4a 73 6f 6e 53 74 72 69 6e 67  .){.  JsonString
92b0: 20 73 3b 20 20 20 20 20 20 20 2f 2a 20 4f 75 74   s;       /* Out
92c0: 70 75 74 20 73 74 72 69 6e 67 20 2d 20 6e 6f 74  put string - not
92d0: 20 72 65 61 6c 20 4a 53 4f 4e 20 2a 2f 0a 20 20   real JSON */.  
92e0: 4a 73 6f 6e 50 61 72 73 65 20 78 3b 20 20 20 20  JsonParse x;    
92f0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
9300: 20 2a 2f 0a 20 20 75 33 32 20 69 3b 0a 0a 20 20   */.  u32 i;..  
9310: 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20  assert( argc==1 
9320: 29 3b 0a 20 20 69 66 28 20 6a 73 6f 6e 50 61 72  );.  if( jsonPar
9330: 73 65 28 26 78 2c 20 63 74 78 2c 20 28 63 6f 6e  se(&x, ctx, (con
9340: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
9350: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
9360: 5b 30 5d 29 29 20 29 20 72 65 74 75 72 6e 3b 0a  [0])) ) return;.
9370: 20 20 6a 73 6f 6e 50 61 72 73 65 46 69 6e 64 50    jsonParseFindP
9380: 61 72 65 6e 74 73 28 26 78 29 3b 0a 20 20 6a 73  arents(&x);.  js
9390: 6f 6e 49 6e 69 74 28 26 73 2c 20 63 74 78 29 3b  onInit(&s, ctx);
93a0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 2e  .  for(i=0; i<x.
93b0: 6e 4e 6f 64 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  nNode; i++){.   
93c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
93d0: 70 65 3b 0a 20 20 20 20 69 66 28 20 78 2e 61 4e  pe;.    if( x.aN
93e0: 6f 64 65 5b 69 5d 2e 6a 6e 46 6c 61 67 73 20 26  ode[i].jnFlags &
93f0: 20 4a 4e 4f 44 45 5f 4c 41 42 45 4c 20 29 7b 0a   JNODE_LABEL ){.
9400: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 78 2e        assert( x.
9410: 61 4e 6f 64 65 5b 69 5d 2e 65 54 79 70 65 3d 3d  aNode[i].eType==
9420: 4a 53 4f 4e 5f 53 54 52 49 4e 47 20 29 3b 0a 20  JSON_STRING );. 
9430: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 6c 61       zType = "la
9440: 62 65 6c 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  bel";.    }else{
9450: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 6a  .      zType = j
9460: 73 6f 6e 54 79 70 65 5b 78 2e 61 4e 6f 64 65 5b  sonType[x.aNode[
9470: 69 5d 2e 65 54 79 70 65 5d 3b 0a 20 20 20 20 7d  i].eType];.    }
9480: 0a 20 20 20 20 6a 73 6f 6e 50 72 69 6e 74 66 28  .    jsonPrintf(
9490: 31 30 30 2c 20 26 73 2c 22 6e 6f 64 65 20 25 33  100, &s,"node %3
94a0: 75 3a 20 25 37 73 20 6e 3d 25 2d 34 64 20 75 70  u: %7s n=%-4d up
94b0: 3d 25 2d 34 64 22 2c 0a 20 20 20 20 20 20 20 20  =%-4d",.        
94c0: 20 20 20 20 20 20 20 69 2c 20 7a 54 79 70 65 2c         i, zType,
94d0: 20 78 2e 61 4e 6f 64 65 5b 69 5d 2e 6e 2c 20 78   x.aNode[i].n, x
94e0: 2e 61 55 70 5b 69 5d 29 3b 0a 20 20 20 20 69 66  .aUp[i]);.    if
94f0: 28 20 78 2e 61 4e 6f 64 65 5b 69 5d 2e 75 2e 7a  ( x.aNode[i].u.z
9500: 4a 43 6f 6e 74 65 6e 74 21 3d 30 20 29 7b 0a 20  JContent!=0 ){. 
9510: 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 52       jsonAppendR
9520: 61 77 28 26 73 2c 20 22 20 22 2c 20 31 29 3b 0a  aw(&s, " ", 1);.
9530: 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64        jsonAppend
9540: 52 61 77 28 26 73 2c 20 78 2e 61 4e 6f 64 65 5b  Raw(&s, x.aNode[
9550: 69 5d 2e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 2c 20  i].u.zJContent, 
9560: 78 2e 61 4e 6f 64 65 5b 69 5d 2e 6e 29 3b 0a 20  x.aNode[i].n);. 
9570: 20 20 20 7d 0a 20 20 20 20 6a 73 6f 6e 41 70 70     }.    jsonApp
9580: 65 6e 64 52 61 77 28 26 73 2c 20 22 5c 6e 22 2c  endRaw(&s, "\n",
9590: 20 31 29 3b 0a 20 20 7d 0a 20 20 6a 73 6f 6e 50   1);.  }.  jsonP
95a0: 61 72 73 65 52 65 73 65 74 28 26 78 29 3b 0a 20  arseReset(&x);. 
95b0: 20 6a 73 6f 6e 52 65 73 75 6c 74 28 26 73 29 3b   jsonResult(&s);
95c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 73  .}../*.** The js
95d0: 6f 6e 5f 74 65 73 74 31 28 4a 53 4f 4e 29 20 66  on_test1(JSON) f
95e0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 74  unction return t
95f0: 72 75 65 20 28 31 29 20 69 66 20 74 68 65 20 69  rue (1) if the i
9600: 6e 70 75 74 20 69 73 20 4a 53 4f 4e 0a 2a 2a 20  nput is JSON.** 
9610: 74 65 78 74 20 67 65 6e 65 72 61 74 65 64 20 62  text generated b
9620: 79 20 61 6e 6f 74 68 65 72 20 6a 73 6f 6e 20 66  y another json f
9630: 75 6e 63 74 69 6f 6e 2e 20 20 49 74 20 72 65 74  unction.  It ret
9640: 75 72 6e 73 20 28 30 29 20 69 66 20 74 68 65 20  urns (0) if the 
9650: 69 6e 70 75 74 0a 2a 2a 20 69 73 20 6e 6f 74 20  input.** is not 
9660: 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 4a 53 4f 4e  known to be JSON
9670: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
9680: 20 6a 73 6f 6e 54 65 73 74 31 46 75 6e 63 28 0a   jsonTest1Func(.
9690: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
96a0: 74 20 2a 63 74 78 2c 0a 20 20 69 6e 74 20 61 72  t *ctx,.  int ar
96b0: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
96c0: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
96d0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 61 72 67  UNUSED_PARAM(arg
96e0: 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  c);.  sqlite3_re
96f0: 73 75 6c 74 5f 69 6e 74 28 63 74 78 2c 20 73 71  sult_int(ctx, sq
9700: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 73 75 62 74  lite3_value_subt
9710: 79 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d 4a 53  ype(argv[0])==JS
9720: 4f 4e 5f 53 55 42 54 59 50 45 29 3b 0a 7d 0a 23  ON_SUBTYPE);.}.#
9730: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
9740: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  DEBUG */../*****
9750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9760: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9790: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 53 63 61 6c 61  *******.** Scala
97a0: 72 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 69  r SQL function i
97b0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a  mplementations.*
97c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
97d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
97e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
97f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
9810: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
9820: 6f 6e 20 6f 66 20 74 68 65 20 6a 73 6f 6e 5f 51  on of the json_Q
9830: 55 4f 54 45 28 56 41 4c 55 45 29 20 66 75 6e 63  UOTE(VALUE) func
9840: 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 20  tion.  Return a 
9850: 4a 53 4f 4e 20 76 61 6c 75 65 0a 2a 2a 20 63 6f  JSON value.** co
9860: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
9870: 68 65 20 53 51 4c 20 76 61 6c 75 65 20 69 6e 70  he SQL value inp
9880: 75 74 2e 20 20 4d 6f 73 74 6c 79 20 74 68 69 73  ut.  Mostly this
9890: 20 6d 65 61 6e 73 20 70 75 74 74 69 6e 67 20 0a   means putting .
98a0: 2a 2a 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73  ** double-quotes
98b0: 20 61 72 6f 75 6e 64 20 73 74 72 69 6e 67 73 20   around strings 
98c0: 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 74 68  and returning th
98d0: 65 20 75 6e 71 75 6f 74 65 64 20 73 74 72 69 6e  e unquoted strin
98e0: 67 20 22 6e 75 6c 6c 22 0a 2a 2a 20 77 68 65 6e  g "null".** when
98f0: 20 67 69 76 65 6e 20 61 20 4e 55 4c 4c 20 69 6e   given a NULL in
9900: 70 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  put..*/.static v
9910: 6f 69 64 20 6a 73 6f 6e 51 75 6f 74 65 46 75 6e  oid jsonQuoteFun
9920: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
9930: 74 65 78 74 20 2a 63 74 78 2c 0a 20 20 69 6e 74  text *ctx,.  int
9940: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
9950: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
9960: 0a 20 20 4a 73 6f 6e 53 74 72 69 6e 67 20 6a 78  .  JsonString jx
9970: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
9980: 28 61 72 67 63 29 3b 0a 0a 20 20 6a 73 6f 6e 49  (argc);..  jsonI
9990: 6e 69 74 28 26 6a 78 2c 20 63 74 78 29 3b 0a 20  nit(&jx, ctx);. 
99a0: 20 6a 73 6f 6e 41 70 70 65 6e 64 56 61 6c 75 65   jsonAppendValue
99b0: 28 26 6a 78 2c 20 61 72 67 76 5b 30 5d 29 3b 0a  (&jx, argv[0]);.
99c0: 20 20 6a 73 6f 6e 52 65 73 75 6c 74 28 26 6a 78    jsonResult(&jx
99d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
99e0: 75 6c 74 5f 73 75 62 74 79 70 65 28 63 74 78 2c  ult_subtype(ctx,
99f0: 20 4a 53 4f 4e 5f 53 55 42 54 59 50 45 29 3b 0a   JSON_SUBTYPE);.
9a00: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
9a10: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a  ntation of the j
9a20: 73 6f 6e 5f 61 72 72 61 79 28 56 41 4c 55 45 2c  son_array(VALUE,
9a30: 2e 2e 2e 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  ...) function.  
9a40: 52 65 74 75 72 6e 20 61 20 4a 53 4f 4e 0a 2a 2a  Return a JSON.**
9a50: 20 61 72 72 61 79 20 74 68 61 74 20 63 6f 6e 74   array that cont
9a60: 61 69 6e 73 20 61 6c 6c 20 76 61 6c 75 65 73 20  ains all values 
9a70: 67 69 76 65 6e 20 69 6e 20 61 72 67 75 6d 65 6e  given in argumen
9a80: 74 73 2e 20 20 4f 72 20 69 66 20 61 6e 79 20 61  ts.  Or if any a
9a90: 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 61 20  rgument.** is a 
9aa0: 42 4c 4f 42 2c 20 74 68 72 6f 77 20 61 6e 20 65  BLOB, throw an e
9ab0: 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rror..*/.static 
9ac0: 76 6f 69 64 20 6a 73 6f 6e 41 72 72 61 79 46 75  void jsonArrayFu
9ad0: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
9ae0: 6e 74 65 78 74 20 2a 63 74 78 2c 0a 20 20 69 6e  ntext *ctx,.  in
9af0: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
9b00: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
9b10: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4a 73 6f  {.  int i;.  Jso
9b20: 6e 53 74 72 69 6e 67 20 6a 78 3b 0a 0a 20 20 6a  nString jx;..  j
9b30: 73 6f 6e 49 6e 69 74 28 26 6a 78 2c 20 63 74 78  sonInit(&jx, ctx
9b40: 29 3b 0a 20 20 6a 73 6f 6e 41 70 70 65 6e 64 43  );.  jsonAppendC
9b50: 68 61 72 28 26 6a 78 2c 20 27 5b 27 29 3b 0a 20  har(&jx, '[');. 
9b60: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63   for(i=0; i<argc
9b70: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6a 73 6f 6e  ; i++){.    json
9b80: 41 70 70 65 6e 64 53 65 70 61 72 61 74 6f 72 28  AppendSeparator(
9b90: 26 6a 78 29 3b 0a 20 20 20 20 6a 73 6f 6e 41 70  &jx);.    jsonAp
9ba0: 70 65 6e 64 56 61 6c 75 65 28 26 6a 78 2c 20 61  pendValue(&jx, a
9bb0: 72 67 76 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 6a  rgv[i]);.  }.  j
9bc0: 73 6f 6e 41 70 70 65 6e 64 43 68 61 72 28 26 6a  sonAppendChar(&j
9bd0: 78 2c 20 27 5d 27 29 3b 0a 20 20 6a 73 6f 6e 52  x, ']');.  jsonR
9be0: 65 73 75 6c 74 28 26 6a 78 29 3b 0a 20 20 73 71  esult(&jx);.  sq
9bf0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 73 75 62  lite3_result_sub
9c00: 74 79 70 65 28 63 74 78 2c 20 4a 53 4f 4e 5f 53  type(ctx, JSON_S
9c10: 55 42 54 59 50 45 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  UBTYPE);.}.../*.
9c20: 2a 2a 20 6a 73 6f 6e 5f 61 72 72 61 79 5f 6c 65  ** json_array_le
9c30: 6e 67 74 68 28 4a 53 4f 4e 29 0a 2a 2a 20 6a 73  ngth(JSON).** js
9c40: 6f 6e 5f 61 72 72 61 79 5f 6c 65 6e 67 74 68 28  on_array_length(
9c50: 4a 53 4f 4e 2c 20 50 41 54 48 29 0a 2a 2a 0a 2a  JSON, PATH).**.*
9c60: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
9c70: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
9c80: 69 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c  in the top-level
9c90: 20 4a 53 4f 4e 20 61 72 72 61 79 2e 20 20 0a 2a   JSON array.  .*
9ca0: 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68  * Return 0 if th
9cb0: 65 20 69 6e 70 75 74 20 69 73 20 6e 6f 74 20 61  e input is not a
9cc0: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 4a 53 4f   well-formed JSO
9cd0: 4e 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74  N array..*/.stat
9ce0: 69 63 20 76 6f 69 64 20 6a 73 6f 6e 41 72 72 61  ic void jsonArra
9cf0: 79 4c 65 6e 67 74 68 46 75 6e 63 28 0a 20 20 73  yLengthFunc(.  s
9d00: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
9d10: 63 74 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ctx,.  int argc,
9d20: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
9d30: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 4a 73 6f   **argv.){.  Jso
9d40: 6e 50 61 72 73 65 20 2a 70 3b 20 20 20 20 20 20  nParse *p;      
9d50: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
9d60: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
9d70: 74 36 34 20 6e 20 3d 20 30 3b 0a 20 20 75 33 32  t64 n = 0;.  u32
9d80: 20 69 3b 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a   i;.  JsonNode *
9d90: 70 4e 6f 64 65 3b 0a 0a 20 20 70 20 3d 20 6a 73  pNode;..  p = js
9da0: 6f 6e 50 61 72 73 65 43 61 63 68 65 64 28 63 74  onParseCached(ct
9db0: 78 2c 20 61 72 67 76 29 3b 0a 20 20 69 66 28 20  x, argv);.  if( 
9dc0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
9dd0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4e 6f 64   assert( p->nNod
9de0: 65 20 29 3b 0a 20 20 69 66 28 20 61 72 67 63 3d  e );.  if( argc=
9df0: 3d 32 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =2 ){.    const 
9e00: 63 68 61 72 20 2a 7a 50 61 74 68 20 3d 20 28 63  char *zPath = (c
9e10: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
9e20: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
9e30: 67 76 5b 31 5d 29 3b 0a 20 20 20 20 70 4e 6f 64  gv[1]);.    pNod
9e40: 65 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 28 70  e = jsonLookup(p
9e50: 2c 20 7a 50 61 74 68 2c 20 30 2c 20 63 74 78 29  , zPath, 0, ctx)
9e60: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
9e70: 4e 6f 64 65 20 3d 20 70 2d 3e 61 4e 6f 64 65 3b  Node = p->aNode;
9e80: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 6f 64 65  .  }.  if( pNode
9e90: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
9ea0: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 6f  n;.  }.  if( pNo
9eb0: 64 65 2d 3e 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f  de->eType==JSON_
9ec0: 41 52 52 41 59 20 29 7b 0a 20 20 20 20 61 73 73  ARRAY ){.    ass
9ed0: 65 72 74 28 20 28 70 4e 6f 64 65 2d 3e 6a 6e 46  ert( (pNode->jnF
9ee0: 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 41 50 50  lags & JNODE_APP
9ef0: 45 4e 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20 66  END)==0 );.    f
9f00: 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 4e 6f 64 65  or(i=1; i<=pNode
9f10: 2d 3e 6e 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20  ->n; n++){.     
9f20: 20 69 20 2b 3d 20 6a 73 6f 6e 4e 6f 64 65 53 69   i += jsonNodeSi
9f30: 7a 65 28 26 70 4e 6f 64 65 5b 69 5d 29 3b 0a 20  ze(&pNode[i]);. 
9f40: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
9f50: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28  e3_result_int64(
9f60: 63 74 78 2c 20 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ctx, n);.}../*.*
9f70: 2a 20 6a 73 6f 6e 5f 65 78 74 72 61 63 74 28 4a  * json_extract(J
9f80: 53 4f 4e 2c 20 50 41 54 48 2c 20 2e 2e 2e 29 0a  SON, PATH, ...).
9f90: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
9fa0: 20 65 6c 65 6d 65 6e 74 20 64 65 73 63 72 69 62   element describ
9fb0: 65 64 20 62 79 20 50 41 54 48 2e 20 20 52 65 74  ed by PATH.  Ret
9fc0: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72  urn NULL if ther
9fd0: 65 20 69 73 20 6e 6f 0a 2a 2a 20 50 41 54 48 20  e is no.** PATH 
9fe0: 65 6c 65 6d 65 6e 74 2e 20 20 49 66 20 74 68 65  element.  If the
9ff0: 72 65 20 61 72 65 20 6d 75 6c 74 69 70 6c 65 20  re are multiple 
a000: 50 41 54 48 73 2c 20 74 68 65 6e 20 72 65 74 75  PATHs, then retu
a010: 72 6e 20 61 20 4a 53 4f 4e 20 61 72 72 61 79 0a  rn a JSON array.
a020: 2a 2a 20 77 69 74 68 20 74 68 65 20 72 65 73 75  ** with the resu
a030: 6c 74 20 66 72 6f 6d 20 65 61 63 68 20 70 61 74  lt from each pat
a040: 68 2e 20 20 54 68 72 6f 77 20 61 6e 20 65 72 72  h.  Throw an err
a050: 6f 72 20 69 66 20 74 68 65 20 4a 53 4f 4e 20 6f  or if the JSON o
a060: 72 20 61 6e 79 20 50 41 54 48 0a 2a 2a 20 69 73  r any PATH.** is
a070: 20 6d 61 6c 66 6f 72 6d 65 64 2e 0a 2a 2f 0a 73   malformed..*/.s
a080: 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 45  tatic void jsonE
a090: 78 74 72 61 63 74 46 75 6e 63 28 0a 20 20 73 71  xtractFunc(.  sq
a0a0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
a0b0: 74 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  tx,.  int argc,.
a0c0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
a0d0: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e  **argv.){.  Json
a0e0: 50 61 72 73 65 20 2a 70 3b 20 20 20 20 20 20 20  Parse *p;       
a0f0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 20     /* The parse 
a100: 2a 2f 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70  */.  JsonNode *p
a110: 4e 6f 64 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68  Node;.  const ch
a120: 61 72 20 2a 7a 50 61 74 68 3b 0a 20 20 4a 73 6f  ar *zPath;.  Jso
a130: 6e 53 74 72 69 6e 67 20 6a 78 3b 0a 20 20 69 6e  nString jx;.  in
a140: 74 20 69 3b 0a 0a 20 20 69 66 28 20 61 72 67 63  t i;..  if( argc
a150: 3c 32 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  <2 ) return;.  p
a160: 20 3d 20 6a 73 6f 6e 50 61 72 73 65 43 61 63 68   = jsonParseCach
a170: 65 64 28 63 74 78 2c 20 61 72 67 76 29 3b 0a 20  ed(ctx, argv);. 
a180: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
a190: 72 6e 3b 0a 20 20 6a 73 6f 6e 49 6e 69 74 28 26  rn;.  jsonInit(&
a1a0: 6a 78 2c 20 63 74 78 29 3b 0a 20 20 6a 73 6f 6e  jx, ctx);.  json
a1b0: 41 70 70 65 6e 64 43 68 61 72 28 26 6a 78 2c 20  AppendChar(&jx, 
a1c0: 27 5b 27 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b  '[');.  for(i=1;
a1d0: 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20   i<argc; i++){. 
a1e0: 20 20 20 7a 50 61 74 68 20 3d 20 28 63 6f 6e 73     zPath = (cons
a1f0: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
a200: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
a210: 69 5d 29 3b 0a 20 20 20 20 70 4e 6f 64 65 20 3d  i]);.    pNode =
a220: 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 28 70 2c 20 7a   jsonLookup(p, z
a230: 50 61 74 68 2c 20 30 2c 20 63 74 78 29 3b 0a 20  Path, 0, ctx);. 
a240: 20 20 20 69 66 28 20 70 2d 3e 6e 45 72 72 20 29     if( p->nErr )
a250: 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
a260: 61 72 67 63 3e 32 20 29 7b 0a 20 20 20 20 20 20  argc>2 ){.      
a270: 6a 73 6f 6e 41 70 70 65 6e 64 53 65 70 61 72 61  jsonAppendSepara
a280: 74 6f 72 28 26 6a 78 29 3b 0a 20 20 20 20 20 20  tor(&jx);.      
a290: 69 66 28 20 70 4e 6f 64 65 20 29 7b 0a 20 20 20  if( pNode ){.   
a2a0: 20 20 20 20 20 6a 73 6f 6e 52 65 6e 64 65 72 4e       jsonRenderN
a2b0: 6f 64 65 28 70 4e 6f 64 65 2c 20 26 6a 78 2c 20  ode(pNode, &jx, 
a2c0: 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  0);.      }else{
a2d0: 0a 20 20 20 20 20 20 20 20 6a 73 6f 6e 41 70 70  .        jsonApp
a2e0: 65 6e 64 52 61 77 28 26 6a 78 2c 20 22 6e 75 6c  endRaw(&jx, "nul
a2f0: 6c 22 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d 0a  l", 4);.      }.
a300: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4e      }else if( pN
a310: 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 6a 73 6f  ode ){.      jso
a320: 6e 52 65 74 75 72 6e 28 70 4e 6f 64 65 2c 20 63  nReturn(pNode, c
a330: 74 78 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  tx, 0);.    }.  
a340: 7d 0a 20 20 69 66 28 20 61 72 67 63 3e 32 20 26  }.  if( argc>2 &
a350: 26 20 69 3d 3d 61 72 67 63 20 29 7b 0a 20 20 20  & i==argc ){.   
a360: 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61 72 28   jsonAppendChar(
a370: 26 6a 78 2c 20 27 5d 27 29 3b 0a 20 20 20 20 6a  &jx, ']');.    j
a380: 73 6f 6e 52 65 73 75 6c 74 28 26 6a 78 29 3b 0a  sonResult(&jx);.
a390: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
a3a0: 6c 74 5f 73 75 62 74 79 70 65 28 63 74 78 2c 20  lt_subtype(ctx, 
a3b0: 4a 53 4f 4e 5f 53 55 42 54 59 50 45 29 3b 0a 20  JSON_SUBTYPE);. 
a3c0: 20 7d 0a 20 20 6a 73 6f 6e 52 65 73 65 74 28 26   }.  jsonReset(&
a3d0: 6a 78 29 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73 20  jx);.}../* This 
a3e0: 69 73 20 74 68 65 20 52 46 43 20 37 33 39 36 20  is the RFC 7396 
a3f0: 4d 65 72 67 65 50 61 74 63 68 20 61 6c 67 6f 72  MergePatch algor
a400: 69 74 68 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ithm..*/.static 
a410: 4a 73 6f 6e 4e 6f 64 65 20 2a 6a 73 6f 6e 4d 65  JsonNode *jsonMe
a420: 72 67 65 50 61 74 63 68 28 0a 20 20 4a 73 6f 6e  rgePatch(.  Json
a430: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
a440: 20 2f 2a 20 54 68 65 20 4a 53 4f 4e 20 70 61 72   /* The JSON par
a450: 73 65 72 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ser that contain
a460: 73 20 74 68 65 20 54 41 52 47 45 54 20 2a 2f 0a  s the TARGET */.
a470: 20 20 75 33 32 20 69 54 61 72 67 65 74 2c 20 20    u32 iTarget,  
a480: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 64 65 20 6f         /* Node o
a490: 66 20 74 68 65 20 54 41 52 47 45 54 20 69 6e 20  f the TARGET in 
a4a0: 70 50 61 72 73 65 20 2a 2f 0a 20 20 4a 73 6f 6e  pParse */.  Json
a4b0: 4e 6f 64 65 20 2a 70 50 61 74 63 68 20 20 20 20  Node *pPatch    
a4c0: 20 2f 2a 20 54 68 65 20 50 41 54 43 48 20 2a 2f   /* The PATCH */
a4d0: 0a 29 7b 0a 20 20 75 33 32 20 69 2c 20 6a 3b 0a  .){.  u32 i, j;.
a4e0: 20 20 75 33 32 20 69 52 6f 6f 74 3b 0a 20 20 4a    u32 iRoot;.  J
a4f0: 73 6f 6e 4e 6f 64 65 20 2a 70 54 61 72 67 65 74  sonNode *pTarget
a500: 3b 0a 20 20 69 66 28 20 70 50 61 74 63 68 2d 3e  ;.  if( pPatch->
a510: 65 54 79 70 65 21 3d 4a 53 4f 4e 5f 4f 42 4a 45  eType!=JSON_OBJE
a520: 43 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  CT ){.    return
a530: 20 70 50 61 74 63 68 3b 0a 20 20 7d 0a 20 20 61   pPatch;.  }.  a
a540: 73 73 65 72 74 28 20 69 54 61 72 67 65 74 3e 3d  ssert( iTarget>=
a550: 30 20 26 26 20 69 54 61 72 67 65 74 3c 70 50 61  0 && iTarget<pPa
a560: 72 73 65 2d 3e 6e 4e 6f 64 65 20 29 3b 0a 20 20  rse->nNode );.  
a570: 70 54 61 72 67 65 74 20 3d 20 26 70 50 61 72 73  pTarget = &pPars
a580: 65 2d 3e 61 4e 6f 64 65 5b 69 54 61 72 67 65 74  e->aNode[iTarget
a590: 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 50  ];.  assert( (pP
a5a0: 61 74 63 68 2d 3e 6a 6e 46 6c 61 67 73 20 26 20  atch->jnFlags & 
a5b0: 4a 4e 4f 44 45 5f 41 50 50 45 4e 44 29 3d 3d 30  JNODE_APPEND)==0
a5c0: 20 29 3b 0a 20 20 69 66 28 20 70 54 61 72 67 65   );.  if( pTarge
a5d0: 74 2d 3e 65 54 79 70 65 21 3d 4a 53 4f 4e 5f 4f  t->eType!=JSON_O
a5e0: 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 6a 73 6f  BJECT ){.    jso
a5f0: 6e 52 65 6d 6f 76 65 41 6c 6c 4e 75 6c 6c 73 28  nRemoveAllNulls(
a600: 70 50 61 74 63 68 29 3b 0a 20 20 20 20 72 65 74  pPatch);.    ret
a610: 75 72 6e 20 70 50 61 74 63 68 3b 0a 20 20 7d 0a  urn pPatch;.  }.
a620: 20 20 69 52 6f 6f 74 20 3d 20 69 54 61 72 67 65    iRoot = iTarge
a630: 74 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  t;.  for(i=1; i<
a640: 70 50 61 74 63 68 2d 3e 6e 3b 20 69 20 2b 3d 20  pPatch->n; i += 
a650: 6a 73 6f 6e 4e 6f 64 65 53 69 7a 65 28 26 70 50  jsonNodeSize(&pP
a660: 61 74 63 68 5b 69 2b 31 5d 29 2b 31 29 7b 0a 20  atch[i+1])+1){. 
a670: 20 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 20     u32 nKey;.   
a680: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65   const char *zKe
a690: 79 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  y;.    assert( p
a6a0: 50 61 74 63 68 5b 69 5d 2e 65 54 79 70 65 3d 3d  Patch[i].eType==
a6b0: 4a 53 4f 4e 5f 53 54 52 49 4e 47 20 29 3b 0a 20  JSON_STRING );. 
a6c0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 74 63     assert( pPatc
a6d0: 68 5b 69 5d 2e 6a 6e 46 6c 61 67 73 20 26 20 4a  h[i].jnFlags & J
a6e0: 4e 4f 44 45 5f 4c 41 42 45 4c 20 29 3b 0a 20 20  NODE_LABEL );.  
a6f0: 20 20 6e 4b 65 79 20 3d 20 70 50 61 74 63 68 5b    nKey = pPatch[
a700: 69 5d 2e 6e 3b 0a 20 20 20 20 7a 4b 65 79 20 3d  i].n;.    zKey =
a710: 20 70 50 61 74 63 68 5b 69 5d 2e 75 2e 7a 4a 43   pPatch[i].u.zJC
a720: 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 61 73 73 65  ontent;.    asse
a730: 72 74 28 20 28 70 50 61 74 63 68 5b 69 5d 2e 6a  rt( (pPatch[i].j
a740: 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 52  nFlags & JNODE_R
a750: 41 57 29 3d 3d 30 20 29 3b 0a 20 20 20 20 66 6f  AW)==0 );.    fo
a760: 72 28 6a 3d 31 3b 20 6a 3c 70 54 61 72 67 65 74  r(j=1; j<pTarget
a770: 2d 3e 6e 3b 20 6a 20 2b 3d 20 6a 73 6f 6e 4e 6f  ->n; j += jsonNo
a780: 64 65 53 69 7a 65 28 26 70 54 61 72 67 65 74 5b  deSize(&pTarget[
a790: 6a 2b 31 5d 29 2b 31 20 29 7b 0a 20 20 20 20 20  j+1])+1 ){.     
a7a0: 20 61 73 73 65 72 74 28 20 70 54 61 72 67 65 74   assert( pTarget
a7b0: 5b 6a 5d 2e 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f  [j].eType==JSON_
a7c0: 53 54 52 49 4e 47 20 29 3b 0a 20 20 20 20 20 20  STRING );.      
a7d0: 61 73 73 65 72 74 28 20 70 54 61 72 67 65 74 5b  assert( pTarget[
a7e0: 6a 5d 2e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f  j].jnFlags & JNO
a7f0: 44 45 5f 4c 41 42 45 4c 20 29 3b 0a 20 20 20 20  DE_LABEL );.    
a800: 20 20 61 73 73 65 72 74 28 20 28 70 50 61 74 63    assert( (pPatc
a810: 68 5b 69 5d 2e 6a 6e 46 6c 61 67 73 20 26 20 4a  h[i].jnFlags & J
a820: 4e 4f 44 45 5f 52 41 57 29 3d 3d 30 20 29 3b 0a  NODE_RAW)==0 );.
a830: 20 20 20 20 20 20 69 66 28 20 70 54 61 72 67 65        if( pTarge
a840: 74 5b 6a 5d 2e 6e 3d 3d 6e 4b 65 79 20 26 26 20  t[j].n==nKey && 
a850: 73 74 72 6e 63 6d 70 28 70 54 61 72 67 65 74 5b  strncmp(pTarget[
a860: 6a 5d 2e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 2c 7a  j].u.zJContent,z
a870: 4b 65 79 2c 6e 4b 65 79 29 3d 3d 30 20 29 7b 0a  Key,nKey)==0 ){.
a880: 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61 72          if( pTar
a890: 67 65 74 5b 6a 2b 31 5d 2e 6a 6e 46 6c 61 67 73  get[j+1].jnFlags
a8a0: 20 26 20 28 4a 4e 4f 44 45 5f 52 45 4d 4f 56 45   & (JNODE_REMOVE
a8b0: 7c 4a 4e 4f 44 45 5f 50 41 54 43 48 29 20 29 20  |JNODE_PATCH) ) 
a8c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69  break;.        i
a8d0: 66 28 20 70 50 61 74 63 68 5b 69 2b 31 5d 2e 65  f( pPatch[i+1].e
a8e0: 54 79 70 65 3d 3d 4a 53 4f 4e 5f 4e 55 4c 4c 20  Type==JSON_NULL 
a8f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61  ){.          pTa
a900: 72 67 65 74 5b 6a 2b 31 5d 2e 6a 6e 46 6c 61 67  rget[j+1].jnFlag
a910: 73 20 7c 3d 20 4a 4e 4f 44 45 5f 52 45 4d 4f 56  s |= JNODE_REMOV
a920: 45 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  E;.        }else
a930: 7b 0a 20 20 20 20 20 20 20 20 20 20 4a 73 6f 6e  {.          Json
a940: 4e 6f 64 65 20 2a 70 4e 65 77 20 3d 20 6a 73 6f  Node *pNew = jso
a950: 6e 4d 65 72 67 65 50 61 74 63 68 28 70 50 61 72  nMergePatch(pPar
a960: 73 65 2c 20 69 54 61 72 67 65 74 2b 6a 2b 31 2c  se, iTarget+j+1,
a970: 20 26 70 50 61 74 63 68 5b 69 2b 31 5d 29 3b 0a   &pPatch[i+1]);.
a980: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e            if( pN
a990: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
a9a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 72  ;.          pTar
a9b0: 67 65 74 20 3d 20 26 70 50 61 72 73 65 2d 3e 61  get = &pParse->a
a9c0: 4e 6f 64 65 5b 69 54 61 72 67 65 74 5d 3b 0a 20  Node[iTarget];. 
a9d0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65           if( pNe
a9e0: 77 21 3d 26 70 54 61 72 67 65 74 5b 6a 2b 31 5d  w!=&pTarget[j+1]
a9f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
aa00: 70 54 61 72 67 65 74 5b 6a 2b 31 5d 2e 75 2e 70  pTarget[j+1].u.p
aa10: 50 61 74 63 68 20 3d 20 70 4e 65 77 3b 0a 20 20  Patch = pNew;.  
aa20: 20 20 20 20 20 20 20 20 20 20 70 54 61 72 67 65            pTarge
aa30: 74 5b 6a 2b 31 5d 2e 6a 6e 46 6c 61 67 73 20 7c  t[j+1].jnFlags |
aa40: 3d 20 4a 4e 4f 44 45 5f 50 41 54 43 48 3b 0a 20  = JNODE_PATCH;. 
aa50: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
aa60: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
aa70: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
aa80: 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70 54 61  }.    if( j>=pTa
aa90: 72 67 65 74 2d 3e 6e 20 26 26 20 70 50 61 74 63  rget->n && pPatc
aaa0: 68 5b 69 2b 31 5d 2e 65 54 79 70 65 21 3d 4a 53  h[i+1].eType!=JS
aab0: 4f 4e 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  ON_NULL ){.     
aac0: 20 69 6e 74 20 69 53 74 61 72 74 2c 20 69 50 61   int iStart, iPa
aad0: 74 63 68 3b 0a 20 20 20 20 20 20 69 53 74 61 72  tch;.      iStar
aae0: 74 20 3d 20 6a 73 6f 6e 50 61 72 73 65 41 64 64  t = jsonParseAdd
aaf0: 4e 6f 64 65 28 70 50 61 72 73 65 2c 20 4a 53 4f  Node(pParse, JSO
ab00: 4e 5f 4f 42 4a 45 43 54 2c 20 32 2c 20 30 29 3b  N_OBJECT, 2, 0);
ab10: 0a 20 20 20 20 20 20 6a 73 6f 6e 50 61 72 73 65  .      jsonParse
ab20: 41 64 64 4e 6f 64 65 28 70 50 61 72 73 65 2c 20  AddNode(pParse, 
ab30: 4a 53 4f 4e 5f 53 54 52 49 4e 47 2c 20 6e 4b 65  JSON_STRING, nKe
ab40: 79 2c 20 7a 4b 65 79 29 3b 0a 20 20 20 20 20 20  y, zKey);.      
ab50: 69 50 61 74 63 68 20 3d 20 6a 73 6f 6e 50 61 72  iPatch = jsonPar
ab60: 73 65 41 64 64 4e 6f 64 65 28 70 50 61 72 73 65  seAddNode(pParse
ab70: 2c 20 4a 53 4f 4e 5f 54 52 55 45 2c 20 30 2c 20  , JSON_TRUE, 0, 
ab80: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  0);.      if( pP
ab90: 61 72 73 65 2d 3e 6f 6f 6d 20 29 20 72 65 74 75  arse->oom ) retu
aba0: 72 6e 20 30 3b 0a 20 20 20 20 20 20 6a 73 6f 6e  rn 0;.      json
abb0: 52 65 6d 6f 76 65 41 6c 6c 4e 75 6c 6c 73 28 70  RemoveAllNulls(p
abc0: 50 61 74 63 68 29 3b 0a 20 20 20 20 20 20 70 54  Patch);.      pT
abd0: 61 72 67 65 74 20 3d 20 26 70 50 61 72 73 65 2d  arget = &pParse-
abe0: 3e 61 4e 6f 64 65 5b 69 54 61 72 67 65 74 5d 3b  >aNode[iTarget];
abf0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61  .      pParse->a
ac00: 4e 6f 64 65 5b 69 52 6f 6f 74 5d 2e 6a 6e 46 6c  Node[iRoot].jnFl
ac10: 61 67 73 20 7c 3d 20 4a 4e 4f 44 45 5f 41 50 50  ags |= JNODE_APP
ac20: 45 4e 44 3b 0a 20 20 20 20 20 20 70 50 61 72 73  END;.      pPars
ac30: 65 2d 3e 61 4e 6f 64 65 5b 69 52 6f 6f 74 5d 2e  e->aNode[iRoot].
ac40: 75 2e 69 41 70 70 65 6e 64 20 3d 20 69 53 74 61  u.iAppend = iSta
ac50: 72 74 20 2d 20 69 52 6f 6f 74 3b 0a 20 20 20 20  rt - iRoot;.    
ac60: 20 20 69 52 6f 6f 74 20 3d 20 69 53 74 61 72 74    iRoot = iStart
ac70: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
ac80: 61 4e 6f 64 65 5b 69 50 61 74 63 68 5d 2e 6a 6e  aNode[iPatch].jn
ac90: 46 6c 61 67 73 20 7c 3d 20 4a 4e 4f 44 45 5f 50  Flags |= JNODE_P
aca0: 41 54 43 48 3b 0a 20 20 20 20 20 20 70 50 61 72  ATCH;.      pPar
acb0: 73 65 2d 3e 61 4e 6f 64 65 5b 69 50 61 74 63 68  se->aNode[iPatch
acc0: 5d 2e 75 2e 70 50 61 74 63 68 20 3d 20 26 70 50  ].u.pPatch = &pP
acd0: 61 74 63 68 5b 69 2b 31 5d 3b 0a 20 20 20 20 7d  atch[i+1];.    }
ace0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54  .  }.  return pT
acf0: 61 72 67 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  arget;.}../*.** 
ad00: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
ad10: 66 20 74 68 65 20 6a 73 6f 6e 5f 6d 65 72 67 65  f the json_merge
ad20: 70 61 74 63 68 28 4a 53 4f 4e 31 2c 4a 53 4f 4e  patch(JSON1,JSON
ad30: 32 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 52 65  2) function.  Re
ad40: 74 75 72 6e 20 61 20 4a 53 4f 4e 0a 2a 2a 20 6f  turn a JSON.** o
ad50: 62 6a 65 63 74 20 74 68 61 74 20 69 73 20 74 68  bject that is th
ad60: 65 20 72 65 73 75 6c 74 20 6f 66 20 72 75 6e 6e  e result of runn
ad70: 69 6e 67 20 74 68 65 20 52 46 43 20 37 33 39 36  ing the RFC 7396
ad80: 20 4d 65 72 67 65 50 61 74 63 68 28 29 20 61 6c   MergePatch() al
ad90: 67 6f 72 69 74 68 6d 0a 2a 2a 20 6f 6e 20 74 68  gorithm.** on th
ada0: 65 20 74 77 6f 20 61 72 67 75 6d 65 6e 74 73 2e  e two arguments.
adb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
adc0: 6a 73 6f 6e 50 61 74 63 68 46 75 6e 63 28 0a 20  jsonPatchFunc(. 
add0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
ade0: 20 2a 63 74 78 2c 0a 20 20 69 6e 74 20 61 72 67   *ctx,.  int arg
adf0: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
ae00: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 4a  ue **argv.){.  J
ae10: 73 6f 6e 50 61 72 73 65 20 78 3b 20 20 20 20 20  sonParse x;     
ae20: 2f 2a 20 54 68 65 20 4a 53 4f 4e 20 74 68 61 74  /* The JSON that
ae30: 20 69 73 20 62 65 69 6e 67 20 70 61 74 63 68 65   is being patche
ae40: 64 20 2a 2f 0a 20 20 4a 73 6f 6e 50 61 72 73 65  d */.  JsonParse
ae50: 20 79 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70   y;     /* The p
ae60: 61 74 63 68 20 2a 2f 0a 20 20 4a 73 6f 6e 4e 6f  atch */.  JsonNo
ae70: 64 65 20 2a 70 52 65 73 75 6c 74 3b 20 20 20 2f  de *pResult;   /
ae80: 2a 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20  * The result of 
ae90: 74 68 65 20 6d 65 72 67 65 20 2a 2f 0a 0a 20 20  the merge */..  
aea0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 61 72 67  UNUSED_PARAM(arg
aeb0: 63 29 3b 0a 20 20 69 66 28 20 6a 73 6f 6e 50 61  c);.  if( jsonPa
aec0: 72 73 65 28 26 78 2c 20 63 74 78 2c 20 28 63 6f  rse(&x, ctx, (co
aed0: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
aee0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
aef0: 76 5b 30 5d 29 29 20 29 20 72 65 74 75 72 6e 3b  v[0])) ) return;
af00: 0a 20 20 69 66 28 20 6a 73 6f 6e 50 61 72 73 65  .  if( jsonParse
af10: 28 26 79 2c 20 63 74 78 2c 20 28 63 6f 6e 73 74  (&y, ctx, (const
af20: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
af30: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31  alue_text(argv[1
af40: 5d 29 29 20 29 7b 0a 20 20 20 20 6a 73 6f 6e 50  ])) ){.    jsonP
af50: 61 72 73 65 52 65 73 65 74 28 26 78 29 3b 0a 20  arseReset(&x);. 
af60: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
af70: 20 70 52 65 73 75 6c 74 20 3d 20 6a 73 6f 6e 4d   pResult = jsonM
af80: 65 72 67 65 50 61 74 63 68 28 26 78 2c 20 30 2c  ergePatch(&x, 0,
af90: 20 79 2e 61 4e 6f 64 65 29 3b 0a 20 20 61 73 73   y.aNode);.  ass
afa0: 65 72 74 28 20 70 52 65 73 75 6c 74 21 3d 30 20  ert( pResult!=0 
afb0: 7c 7c 20 78 2e 6f 6f 6d 20 29 3b 0a 20 20 69 66  || x.oom );.  if
afc0: 28 20 70 52 65 73 75 6c 74 20 29 7b 0a 20 20 20  ( pResult ){.   
afd0: 20 6a 73 6f 6e 52 65 74 75 72 6e 4a 73 6f 6e 28   jsonReturnJson(
afe0: 70 52 65 73 75 6c 74 2c 20 63 74 78 2c 20 30 29  pResult, ctx, 0)
aff0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
b000: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
b010: 72 6f 72 5f 6e 6f 6d 65 6d 28 63 74 78 29 3b 0a  ror_nomem(ctx);.
b020: 20 20 7d 0a 20 20 6a 73 6f 6e 50 61 72 73 65 52    }.  jsonParseR
b030: 65 73 65 74 28 26 78 29 3b 0a 20 20 6a 73 6f 6e  eset(&x);.  json
b040: 50 61 72 73 65 52 65 73 65 74 28 26 79 29 3b 0a  ParseReset(&y);.
b050: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  }.../*.** Implem
b060: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
b070: 6a 73 6f 6e 5f 6f 62 6a 65 63 74 28 4e 41 4d 45  json_object(NAME
b080: 2c 56 41 4c 55 45 2c 2e 2e 2e 29 20 66 75 6e 63  ,VALUE,...) func
b090: 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 20  tion.  Return a 
b0a0: 4a 53 4f 4e 0a 2a 2a 20 6f 62 6a 65 63 74 20 74  JSON.** object t
b0b0: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  hat contains all
b0c0: 20 6e 61 6d 65 2f 76 61 6c 75 65 20 67 69 76 65   name/value give
b0d0: 6e 20 69 6e 20 61 72 67 75 6d 65 6e 74 73 2e 20  n in arguments. 
b0e0: 20 4f 72 20 69 66 20 61 6e 79 20 6e 61 6d 65 0a   Or if any name.
b0f0: 2a 2a 20 69 73 20 6e 6f 74 20 61 20 73 74 72 69  ** is not a stri
b100: 6e 67 20 6f 72 20 69 66 20 61 6e 79 20 76 61 6c  ng or if any val
b110: 75 65 20 69 73 20 61 20 42 4c 4f 42 2c 20 74 68  ue is a BLOB, th
b120: 72 6f 77 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f  row an error..*/
b130: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f  .static void jso
b140: 6e 4f 62 6a 65 63 74 46 75 6e 63 28 0a 20 20 73  nObjectFunc(.  s
b150: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
b160: 63 74 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ctx,.  int argc,
b170: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
b180: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74   **argv.){.  int
b190: 20 69 3b 0a 20 20 4a 73 6f 6e 53 74 72 69 6e 67   i;.  JsonString
b1a0: 20 6a 78 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61   jx;.  const cha
b1b0: 72 20 2a 7a 3b 0a 20 20 75 33 32 20 6e 3b 0a 0a  r *z;.  u32 n;..
b1c0: 20 20 69 66 28 20 61 72 67 63 26 31 20 29 7b 0a    if( argc&1 ){.
b1d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
b1e0: 6c 74 5f 65 72 72 6f 72 28 63 74 78 2c 20 22 6a  lt_error(ctx, "j
b1f0: 73 6f 6e 5f 6f 62 6a 65 63 74 28 29 20 72 65 71  son_object() req
b200: 75 69 72 65 73 20 61 6e 20 65 76 65 6e 20 6e 75  uires an even nu
b210: 6d 62 65 72 20 22 0a 20 20 20 20 20 20 20 20 20  mber ".         
b220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b230: 20 20 20 20 20 20 20 20 20 22 6f 66 20 61 72 67           "of arg
b240: 75 6d 65 6e 74 73 22 2c 20 2d 31 29 3b 0a 20 20  uments", -1);.  
b250: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
b260: 6a 73 6f 6e 49 6e 69 74 28 26 6a 78 2c 20 63 74  jsonInit(&jx, ct
b270: 78 29 3b 0a 20 20 6a 73 6f 6e 41 70 70 65 6e 64  x);.  jsonAppend
b280: 43 68 61 72 28 26 6a 78 2c 20 27 7b 27 29 3b 0a  Char(&jx, '{');.
b290: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67    for(i=0; i<arg
b2a0: 63 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 69 66  c; i+=2){.    if
b2b0: 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
b2c0: 74 79 70 65 28 61 72 67 76 5b 69 5d 29 21 3d 53  type(argv[i])!=S
b2d0: 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20  QLITE_TEXT ){.  
b2e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
b2f0: 6c 74 5f 65 72 72 6f 72 28 63 74 78 2c 20 22 6a  lt_error(ctx, "j
b300: 73 6f 6e 5f 6f 62 6a 65 63 74 28 29 20 6c 61 62  son_object() lab
b310: 65 6c 73 20 6d 75 73 74 20 62 65 20 54 45 58 54  els must be TEXT
b320: 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 6a 73  ", -1);.      js
b330: 6f 6e 52 65 73 65 74 28 26 6a 78 29 3b 0a 20 20  onReset(&jx);.  
b340: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
b350: 7d 0a 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64  }.    jsonAppend
b360: 53 65 70 61 72 61 74 6f 72 28 26 6a 78 29 3b 0a  Separator(&jx);.
b370: 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 63      z = (const c
b380: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
b390: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 69 5d 29  ue_text(argv[i])
b3a0: 3b 0a 20 20 20 20 6e 20 3d 20 28 75 33 32 29 73  ;.    n = (u32)s
b3b0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
b3c0: 65 73 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20  es(argv[i]);.   
b3d0: 20 6a 73 6f 6e 41 70 70 65 6e 64 53 74 72 69 6e   jsonAppendStrin
b3e0: 67 28 26 6a 78 2c 20 7a 2c 20 6e 29 3b 0a 20 20  g(&jx, z, n);.  
b3f0: 20 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61 72    jsonAppendChar
b400: 28 26 6a 78 2c 20 27 3a 27 29 3b 0a 20 20 20 20  (&jx, ':');.    
b410: 6a 73 6f 6e 41 70 70 65 6e 64 56 61 6c 75 65 28  jsonAppendValue(
b420: 26 6a 78 2c 20 61 72 67 76 5b 69 2b 31 5d 29 3b  &jx, argv[i+1]);
b430: 0a 20 20 7d 0a 20 20 6a 73 6f 6e 41 70 70 65 6e  .  }.  jsonAppen
b440: 64 43 68 61 72 28 26 6a 78 2c 20 27 7d 27 29 3b  dChar(&jx, '}');
b450: 0a 20 20 6a 73 6f 6e 52 65 73 75 6c 74 28 26 6a  .  jsonResult(&j
b460: 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  x);.  sqlite3_re
b470: 73 75 6c 74 5f 73 75 62 74 79 70 65 28 63 74 78  sult_subtype(ctx
b480: 2c 20 4a 53 4f 4e 5f 53 55 42 54 59 50 45 29 3b  , JSON_SUBTYPE);
b490: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 6a 73 6f 6e 5f  .}.../*.** json_
b4a0: 72 65 6d 6f 76 65 28 4a 53 4f 4e 2c 20 50 41 54  remove(JSON, PAT
b4b0: 48 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 52 65  H, ...).**.** Re
b4c0: 6d 6f 76 65 20 74 68 65 20 6e 61 6d 65 64 20 65  move the named e
b4d0: 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 20 4a 53 4f  lements from JSO
b4e0: 4e 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  N and return the
b4f0: 20 72 65 73 75 6c 74 2e 20 20 6d 61 6c 66 6f 72   result.  malfor
b500: 6d 65 64 0a 2a 2a 20 4a 53 4f 4e 20 6f 72 20 50  med.** JSON or P
b510: 41 54 48 20 61 72 67 75 6d 65 6e 74 73 20 72 65  ATH arguments re
b520: 73 75 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f 72  sult in an error
b530: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
b540: 20 6a 73 6f 6e 52 65 6d 6f 76 65 46 75 6e 63 28   jsonRemoveFunc(
b550: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
b560: 78 74 20 2a 63 74 78 2c 0a 20 20 69 6e 74 20 61  xt *ctx,.  int a
b570: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
b580: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
b590: 20 4a 73 6f 6e 50 61 72 73 65 20 78 3b 20 20 20   JsonParse x;   
b5a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
b5b0: 72 73 65 20 2a 2f 0a 20 20 4a 73 6f 6e 4e 6f 64  rse */.  JsonNod
b5c0: 65 20 2a 70 4e 6f 64 65 3b 0a 20 20 63 6f 6e 73  e *pNode;.  cons
b5d0: 74 20 63 68 61 72 20 2a 7a 50 61 74 68 3b 0a 20  t char *zPath;. 
b5e0: 20 75 33 32 20 69 3b 0a 0a 20 20 69 66 28 20 61   u32 i;..  if( a
b5f0: 72 67 63 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a  rgc<1 ) return;.
b600: 20 20 69 66 28 20 6a 73 6f 6e 50 61 72 73 65 28    if( jsonParse(
b610: 26 78 2c 20 63 74 78 2c 20 28 63 6f 6e 73 74 20  &x, ctx, (const 
b620: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
b630: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
b640: 29 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  )) ) return;.  a
b650: 73 73 65 72 74 28 20 78 2e 6e 4e 6f 64 65 20 29  ssert( x.nNode )
b660: 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 28  ;.  for(i=1; i<(
b670: 75 33 32 29 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  u32)argc; i++){.
b680: 20 20 20 20 7a 50 61 74 68 20 3d 20 28 63 6f 6e      zPath = (con
b690: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
b6a0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
b6b0: 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a 50  [i]);.    if( zP
b6c0: 61 74 68 3d 3d 30 20 29 20 67 6f 74 6f 20 72 65  ath==0 ) goto re
b6d0: 6d 6f 76 65 5f 64 6f 6e 65 3b 0a 20 20 20 20 70  move_done;.    p
b6e0: 4e 6f 64 65 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75  Node = jsonLooku
b6f0: 70 28 26 78 2c 20 7a 50 61 74 68 2c 20 30 2c 20  p(&x, zPath, 0, 
b700: 63 74 78 29 3b 0a 20 20 20 20 69 66 28 20 78 2e  ctx);.    if( x.
b710: 6e 45 72 72 20 29 20 67 6f 74 6f 20 72 65 6d 6f  nErr ) goto remo
b720: 76 65 5f 64 6f 6e 65 3b 0a 20 20 20 20 69 66 28  ve_done;.    if(
b730: 20 70 4e 6f 64 65 20 29 20 70 4e 6f 64 65 2d 3e   pNode ) pNode->
b740: 6a 6e 46 6c 61 67 73 20 7c 3d 20 4a 4e 4f 44 45  jnFlags |= JNODE
b750: 5f 52 45 4d 4f 56 45 3b 0a 20 20 7d 0a 20 20 69  _REMOVE;.  }.  i
b760: 66 28 20 28 78 2e 61 4e 6f 64 65 5b 30 5d 2e 6a  f( (x.aNode[0].j
b770: 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 52  nFlags & JNODE_R
b780: 45 4d 4f 56 45 29 3d 3d 30 20 29 7b 0a 20 20 20  EMOVE)==0 ){.   
b790: 20 6a 73 6f 6e 52 65 74 75 72 6e 4a 73 6f 6e 28   jsonReturnJson(
b7a0: 78 2e 61 4e 6f 64 65 2c 20 63 74 78 2c 20 30 29  x.aNode, ctx, 0)
b7b0: 3b 0a 20 20 7d 0a 72 65 6d 6f 76 65 5f 64 6f 6e  ;.  }.remove_don
b7c0: 65 3a 0a 20 20 6a 73 6f 6e 50 61 72 73 65 52 65  e:.  jsonParseRe
b7d0: 73 65 74 28 26 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  set(&x);.}../*.*
b7e0: 2a 20 6a 73 6f 6e 5f 72 65 70 6c 61 63 65 28 4a  * json_replace(J
b7f0: 53 4f 4e 2c 20 50 41 54 48 2c 20 56 41 4c 55 45  SON, PATH, VALUE
b800: 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 52 65 70  , ...).**.** Rep
b810: 6c 61 63 65 20 74 68 65 20 76 61 6c 75 65 20 61  lace the value a
b820: 74 20 50 41 54 48 20 77 69 74 68 20 56 41 4c 55  t PATH with VALU
b830: 45 2e 20 20 49 66 20 50 41 54 48 20 64 6f 65 73  E.  If PATH does
b840: 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69   not already exi
b850: 73 74 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  st,.** this rout
b860: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ine is a no-op. 
b870: 20 49 66 20 4a 53 4f 4e 20 6f 72 20 50 41 54 48   If JSON or PATH
b880: 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 2c 20 74   is malformed, t
b890: 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  hrow an error..*
b8a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73  /.static void js
b8b0: 6f 6e 52 65 70 6c 61 63 65 46 75 6e 63 28 0a 20  onReplaceFunc(. 
b8c0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
b8d0: 20 2a 63 74 78 2c 0a 20 20 69 6e 74 20 61 72 67   *ctx,.  int arg
b8e0: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
b8f0: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 4a  ue **argv.){.  J
b900: 73 6f 6e 50 61 72 73 65 20 78 3b 20 20 20 20 20  sonParse x;     
b910: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
b920: 65 20 2a 2f 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20  e */.  JsonNode 
b930: 2a 70 4e 6f 64 65 3b 0a 20 20 63 6f 6e 73 74 20  *pNode;.  const 
b940: 63 68 61 72 20 2a 7a 50 61 74 68 3b 0a 20 20 75  char *zPath;.  u
b950: 33 32 20 69 3b 0a 0a 20 20 69 66 28 20 61 72 67  32 i;..  if( arg
b960: 63 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  c<1 ) return;.  
b970: 69 66 28 20 28 61 72 67 63 26 31 29 3d 3d 30 20  if( (argc&1)==0 
b980: 29 20 7b 0a 20 20 20 20 6a 73 6f 6e 57 72 6f 6e  ) {.    jsonWron
b990: 67 4e 75 6d 41 72 67 73 28 63 74 78 2c 20 22 72  gNumArgs(ctx, "r
b9a0: 65 70 6c 61 63 65 22 29 3b 0a 20 20 20 20 72 65  eplace");.    re
b9b0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
b9c0: 6a 73 6f 6e 50 61 72 73 65 28 26 78 2c 20 63 74  jsonParse(&x, ct
b9d0: 78 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  x, (const char*)
b9e0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
b9f0: 78 74 28 61 72 67 76 5b 30 5d 29 29 20 29 20 72  xt(argv[0])) ) r
ba00: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
ba10: 20 78 2e 6e 4e 6f 64 65 20 29 3b 0a 20 20 66 6f   x.nNode );.  fo
ba20: 72 28 69 3d 31 3b 20 69 3c 28 75 33 32 29 61 72  r(i=1; i<(u32)ar
ba30: 67 63 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 7a  gc; i+=2){.    z
ba40: 50 61 74 68 20 3d 20 28 63 6f 6e 73 74 20 63 68  Path = (const ch
ba50: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
ba60: 65 5f 74 65 78 74 28 61 72 67 76 5b 69 5d 29 3b  e_text(argv[i]);
ba70: 0a 20 20 20 20 70 4e 6f 64 65 20 3d 20 6a 73 6f  .    pNode = jso
ba80: 6e 4c 6f 6f 6b 75 70 28 26 78 2c 20 7a 50 61 74  nLookup(&x, zPat
ba90: 68 2c 20 30 2c 20 63 74 78 29 3b 0a 20 20 20 20  h, 0, ctx);.    
baa0: 69 66 28 20 78 2e 6e 45 72 72 20 29 20 67 6f 74  if( x.nErr ) got
bab0: 6f 20 72 65 70 6c 61 63 65 5f 65 72 72 3b 0a 20  o replace_err;. 
bac0: 20 20 20 69 66 28 20 70 4e 6f 64 65 20 29 7b 0a     if( pNode ){.
bad0: 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 6a 6e 46        pNode->jnF
bae0: 6c 61 67 73 20 7c 3d 20 28 75 38 29 4a 4e 4f 44  lags |= (u8)JNOD
baf0: 45 5f 52 45 50 4c 41 43 45 3b 0a 20 20 20 20 20  E_REPLACE;.     
bb00: 20 70 4e 6f 64 65 2d 3e 75 2e 69 52 65 70 6c 61   pNode->u.iRepla
bb10: 63 65 20 3d 20 69 20 2b 20 31 3b 0a 20 20 20 20  ce = i + 1;.    
bb20: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 78 2e 61 4e  }.  }.  if( x.aN
bb30: 6f 64 65 5b 30 5d 2e 6a 6e 46 6c 61 67 73 20 26  ode[0].jnFlags &
bb40: 20 4a 4e 4f 44 45 5f 52 45 50 4c 41 43 45 20 29   JNODE_REPLACE )
bb50: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
bb60: 73 75 6c 74 5f 76 61 6c 75 65 28 63 74 78 2c 20  sult_value(ctx, 
bb70: 61 72 67 76 5b 78 2e 61 4e 6f 64 65 5b 30 5d 2e  argv[x.aNode[0].
bb80: 75 2e 69 52 65 70 6c 61 63 65 5d 29 3b 0a 20 20  u.iReplace]);.  
bb90: 7d 65 6c 73 65 7b 0a 20 20 20 20 6a 73 6f 6e 52  }else{.    jsonR
bba0: 65 74 75 72 6e 4a 73 6f 6e 28 78 2e 61 4e 6f 64  eturnJson(x.aNod
bbb0: 65 2c 20 63 74 78 2c 20 61 72 67 76 29 3b 0a 20  e, ctx, argv);. 
bbc0: 20 7d 0a 72 65 70 6c 61 63 65 5f 65 72 72 3a 0a   }.replace_err:.
bbd0: 20 20 6a 73 6f 6e 50 61 72 73 65 52 65 73 65 74    jsonParseReset
bbe0: 28 26 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 6a  (&x);.}../*.** j
bbf0: 73 6f 6e 5f 73 65 74 28 4a 53 4f 4e 2c 20 50 41  son_set(JSON, PA
bc00: 54 48 2c 20 56 41 4c 55 45 2c 20 2e 2e 2e 29 0a  TH, VALUE, ...).
bc10: 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61  **.** Set the va
bc20: 6c 75 65 20 61 74 20 50 41 54 48 20 74 6f 20 56  lue at PATH to V
bc30: 41 4c 55 45 2e 20 20 43 72 65 61 74 65 20 74 68  ALUE.  Create th
bc40: 65 20 50 41 54 48 20 69 66 20 69 74 20 64 6f 65  e PATH if it doe
bc50: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a  s not already.**
bc60: 20 65 78 69 73 74 2e 20 20 4f 76 65 72 77 72 69   exist.  Overwri
bc70: 74 65 20 65 78 69 73 74 69 6e 67 20 76 61 6c 75  te existing valu
bc80: 65 73 20 74 68 61 74 20 64 6f 20 65 78 69 73 74  es that do exist
bc90: 2e 0a 2a 2a 20 49 66 20 4a 53 4f 4e 20 6f 72 20  ..** If JSON or 
bca0: 50 41 54 48 20 69 73 20 6d 61 6c 66 6f 72 6d 65  PATH is malforme
bcb0: 64 2c 20 74 68 72 6f 77 20 61 6e 20 65 72 72 6f  d, throw an erro
bcc0: 72 2e 0a 2a 2a 0a 2a 2a 20 6a 73 6f 6e 5f 69 6e  r..**.** json_in
bcd0: 73 65 72 74 28 4a 53 4f 4e 2c 20 50 41 54 48 2c  sert(JSON, PATH,
bce0: 20 56 41 4c 55 45 2c 20 2e 2e 2e 29 0a 2a 2a 0a   VALUE, ...).**.
bcf0: 2a 2a 20 43 72 65 61 74 65 20 50 41 54 48 20 61  ** Create PATH a
bd00: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74  nd initialize it
bd10: 20 74 6f 20 56 41 4c 55 45 2e 20 20 49 66 20 50   to VALUE.  If P
bd20: 41 54 48 20 61 6c 72 65 61 64 79 20 65 78 69 73  ATH already exis
bd30: 74 73 2c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  ts, this.** rout
bd40: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ine is a no-op. 
bd50: 20 49 66 20 4a 53 4f 4e 20 6f 72 20 50 41 54 48   If JSON or PATH
bd60: 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 2c 20 74   is malformed, t
bd70: 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  hrow an error..*
bd80: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73  /.static void js
bd90: 6f 6e 53 65 74 46 75 6e 63 28 0a 20 20 73 71 6c  onSetFunc(.  sql
bda0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74  ite3_context *ct
bdb0: 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  x,.  int argc,. 
bdc0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
bdd0: 2a 61 72 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e 50  *argv.){.  JsonP
bde0: 61 72 73 65 20 78 3b 20 20 20 20 20 20 20 20 20  arse x;         
bdf0: 20 2f 2a 20 54 68 65 20 70 61 72 73 65 20 2a 2f   /* The parse */
be00: 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f  .  JsonNode *pNo
be10: 64 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  de;.  const char
be20: 20 2a 7a 50 61 74 68 3b 0a 20 20 75 33 32 20 69   *zPath;.  u32 i
be30: 3b 0a 20 20 69 6e 74 20 62 41 70 6e 64 3b 0a 20  ;.  int bApnd;. 
be40: 20 69 6e 74 20 62 49 73 53 65 74 20 3d 20 2a 28   int bIsSet = *(
be50: 69 6e 74 2a 29 73 71 6c 69 74 65 33 5f 75 73 65  int*)sqlite3_use
be60: 72 5f 64 61 74 61 28 63 74 78 29 3b 0a 0a 20 20  r_data(ctx);..  
be70: 69 66 28 20 61 72 67 63 3c 31 20 29 20 72 65 74  if( argc<1 ) ret
be80: 75 72 6e 3b 0a 20 20 69 66 28 20 28 61 72 67 63  urn;.  if( (argc
be90: 26 31 29 3d 3d 30 20 29 20 7b 0a 20 20 20 20 6a  &1)==0 ) {.    j
bea0: 73 6f 6e 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  sonWrongNumArgs(
beb0: 63 74 78 2c 20 62 49 73 53 65 74 20 3f 20 22 73  ctx, bIsSet ? "s
bec0: 65 74 22 20 3a 20 22 69 6e 73 65 72 74 22 29 3b  et" : "insert");
bed0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
bee0: 0a 20 20 69 66 28 20 6a 73 6f 6e 50 61 72 73 65  .  if( jsonParse
bef0: 28 26 78 2c 20 63 74 78 2c 20 28 63 6f 6e 73 74  (&x, ctx, (const
bf00: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
bf10: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
bf20: 5d 29 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ])) ) return;.  
bf30: 61 73 73 65 72 74 28 20 78 2e 6e 4e 6f 64 65 20  assert( x.nNode 
bf40: 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  );.  for(i=1; i<
bf50: 28 75 33 32 29 61 72 67 63 3b 20 69 2b 3d 32 29  (u32)argc; i+=2)
bf60: 7b 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 28 63  {.    zPath = (c
bf70: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
bf80: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
bf90: 67 76 5b 69 5d 29 3b 0a 20 20 20 20 62 41 70 6e  gv[i]);.    bApn
bfa0: 64 20 3d 20 30 3b 0a 20 20 20 20 70 4e 6f 64 65  d = 0;.    pNode
bfb0: 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 28 26 78   = jsonLookup(&x
bfc0: 2c 20 7a 50 61 74 68 2c 20 26 62 41 70 6e 64 2c  , zPath, &bApnd,
bfd0: 20 63 74 78 29 3b 0a 20 20 20 20 69 66 28 20 78   ctx);.    if( x
bfe0: 2e 6f 6f 6d 20 29 7b 0a 20 20 20 20 20 20 73 71  .oom ){.      sq
bff0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
c000: 6f 72 5f 6e 6f 6d 65 6d 28 63 74 78 29 3b 0a 20  or_nomem(ctx);. 
c010: 20 20 20 20 20 67 6f 74 6f 20 6a 73 6f 6e 53 65       goto jsonSe
c020: 74 44 6f 6e 65 3b 0a 20 20 20 20 7d 65 6c 73 65  tDone;.    }else
c030: 20 69 66 28 20 78 2e 6e 45 72 72 20 29 7b 0a 20   if( x.nErr ){. 
c040: 20 20 20 20 20 67 6f 74 6f 20 6a 73 6f 6e 53 65       goto jsonSe
c050: 74 44 6f 6e 65 3b 0a 20 20 20 20 7d 65 6c 73 65  tDone;.    }else
c060: 20 69 66 28 20 70 4e 6f 64 65 20 26 26 20 28 62   if( pNode && (b
c070: 41 70 6e 64 20 7c 7c 20 62 49 73 53 65 74 29 20  Apnd || bIsSet) 
c080: 29 7b 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e  ){.      pNode->
c090: 6a 6e 46 6c 61 67 73 20 7c 3d 20 28 75 38 29 4a  jnFlags |= (u8)J
c0a0: 4e 4f 44 45 5f 52 45 50 4c 41 43 45 3b 0a 20 20  NODE_REPLACE;.  
c0b0: 20 20 20 20 70 4e 6f 64 65 2d 3e 75 2e 69 52 65      pNode->u.iRe
c0c0: 70 6c 61 63 65 20 3d 20 69 20 2b 20 31 3b 0a 20  place = i + 1;. 
c0d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 78     }.  }.  if( x
c0e0: 2e 61 4e 6f 64 65 5b 30 5d 2e 6a 6e 46 6c 61 67  .aNode[0].jnFlag
c0f0: 73 20 26 20 4a 4e 4f 44 45 5f 52 45 50 4c 41 43  s & JNODE_REPLAC
c100: 45 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  E ){.    sqlite3
c110: 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 74  _result_value(ct
c120: 78 2c 20 61 72 67 76 5b 78 2e 61 4e 6f 64 65 5b  x, argv[x.aNode[
c130: 30 5d 2e 75 2e 69 52 65 70 6c 61 63 65 5d 29 3b  0].u.iReplace]);
c140: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6a 73  .  }else{.    js
c150: 6f 6e 52 65 74 75 72 6e 4a 73 6f 6e 28 78 2e 61  onReturnJson(x.a
c160: 4e 6f 64 65 2c 20 63 74 78 2c 20 61 72 67 76 29  Node, ctx, argv)
c170: 3b 0a 20 20 7d 0a 6a 73 6f 6e 53 65 74 44 6f 6e  ;.  }.jsonSetDon
c180: 65 3a 0a 20 20 6a 73 6f 6e 50 61 72 73 65 52 65  e:.  jsonParseRe
c190: 73 65 74 28 26 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  set(&x);.}../*.*
c1a0: 2a 20 6a 73 6f 6e 5f 74 79 70 65 28 4a 53 4f 4e  * json_type(JSON
c1b0: 29 0a 2a 2a 20 6a 73 6f 6e 5f 74 79 70 65 28 4a  ).** json_type(J
c1c0: 53 4f 4e 2c 20 50 41 54 48 29 0a 2a 2a 0a 2a 2a  SON, PATH).**.**
c1d0: 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f 70 2d   Return the top-
c1e0: 6c 65 76 65 6c 20 22 74 79 70 65 22 20 6f 66 20  level "type" of 
c1f0: 61 20 4a 53 4f 4e 20 73 74 72 69 6e 67 2e 20 20  a JSON string.  
c200: 54 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 20 69  Throw an error i
c210: 66 0a 2a 2a 20 65 69 74 68 65 72 20 74 68 65 20  f.** either the 
c220: 4a 53 4f 4e 20 6f 72 20 50 41 54 48 20 69 6e 70  JSON or PATH inp
c230: 75 74 73 20 61 72 65 20 6e 6f 74 20 77 65 6c 6c  uts are not well
c240: 2d 66 6f 72 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74  -formed..*/.stat
c250: 69 63 20 76 6f 69 64 20 6a 73 6f 6e 54 79 70 65  ic void jsonType
c260: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
c270: 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 0a 20 20  context *ctx,.  
c280: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
c290: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
c2a0: 0a 29 7b 0a 20 20 4a 73 6f 6e 50 61 72 73 65 20  .){.  JsonParse 
c2b0: 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  x;          /* T
c2c0: 68 65 20 70 61 72 73 65 20 2a 2f 0a 20 20 63 6f  he parse */.  co
c2d0: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 3b  nst char *zPath;
c2e0: 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f  .  JsonNode *pNo
c2f0: 64 65 3b 0a 0a 20 20 69 66 28 20 6a 73 6f 6e 50  de;..  if( jsonP
c300: 61 72 73 65 28 26 78 2c 20 63 74 78 2c 20 28 63  arse(&x, ctx, (c
c310: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
c320: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
c330: 67 76 5b 30 5d 29 29 20 29 20 72 65 74 75 72 6e  gv[0])) ) return
c340: 3b 0a 20 20 61 73 73 65 72 74 28 20 78 2e 6e 4e  ;.  assert( x.nN
c350: 6f 64 65 20 29 3b 0a 20 20 69 66 28 20 61 72 67  ode );.  if( arg
c360: 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 50 61 74  c==2 ){.    zPat
c370: 68 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  h = (const char*
c380: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
c390: 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  ext(argv[1]);.  
c3a0: 20 20 70 4e 6f 64 65 20 3d 20 6a 73 6f 6e 4c 6f    pNode = jsonLo
c3b0: 6f 6b 75 70 28 26 78 2c 20 7a 50 61 74 68 2c 20  okup(&x, zPath, 
c3c0: 30 2c 20 63 74 78 29 3b 0a 20 20 7d 65 6c 73 65  0, ctx);.  }else
c3d0: 7b 0a 20 20 20 20 70 4e 6f 64 65 20 3d 20 78 2e  {.    pNode = x.
c3e0: 61 4e 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28  aNode;.  }.  if(
c3f0: 20 70 4e 6f 64 65 20 29 7b 0a 20 20 20 20 73 71   pNode ){.    sq
c400: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
c410: 74 28 63 74 78 2c 20 6a 73 6f 6e 54 79 70 65 5b  t(ctx, jsonType[
c420: 70 4e 6f 64 65 2d 3e 65 54 79 70 65 5d 2c 20 2d  pNode->eType], -
c430: 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
c440: 29 3b 0a 20 20 7d 0a 20 20 6a 73 6f 6e 50 61 72  );.  }.  jsonPar
c450: 73 65 52 65 73 65 74 28 26 78 29 3b 0a 7d 0a 0a  seReset(&x);.}..
c460: 2f 2a 0a 2a 2a 20 6a 73 6f 6e 5f 76 61 6c 69 64  /*.** json_valid
c470: 28 4a 53 4f 4e 29 0a 2a 2a 0a 2a 2a 20 52 65 74  (JSON).**.** Ret
c480: 75 72 6e 20 31 20 69 66 20 4a 53 4f 4e 20 69 73  urn 1 if JSON is
c490: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 4a   a well-formed J
c4a0: 53 4f 4e 20 73 74 72 69 6e 67 20 61 63 63 6f 72  SON string accor
c4b0: 64 69 6e 67 20 74 6f 20 52 46 43 2d 37 31 35 39  ding to RFC-7159
c4c0: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 6f 74  ..** Return 0 ot
c4d0: 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
c4e0: 69 63 20 76 6f 69 64 20 6a 73 6f 6e 56 61 6c 69  ic void jsonVali
c4f0: 64 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  dFunc(.  sqlite3
c500: 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 0a 20  _context *ctx,. 
c510: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
c520: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
c530: 76 0a 29 7b 0a 20 20 4a 73 6f 6e 50 61 72 73 65  v.){.  JsonParse
c540: 20 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   x;          /* 
c550: 54 68 65 20 70 61 72 73 65 20 2a 2f 0a 20 20 69  The parse */.  i
c560: 6e 74 20 72 63 20 3d 20 30 3b 0a 0a 20 20 55 4e  nt rc = 0;..  UN
c570: 55 53 45 44 5f 50 41 52 41 4d 28 61 72 67 63 29  USED_PARAM(argc)
c580: 3b 0a 20 20 69 66 28 20 6a 73 6f 6e 50 61 72 73  ;.  if( jsonPars
c590: 65 28 26 78 2c 20 30 2c 20 28 63 6f 6e 73 74 20  e(&x, 0, (const 
c5a0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
c5b0: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
c5c0: 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ))==0 ){.    rc 
c5d0: 3d 20 31 3b 0a 20 20 7d 0a 20 20 6a 73 6f 6e 50  = 1;.  }.  jsonP
c5e0: 61 72 73 65 52 65 73 65 74 28 26 78 29 3b 0a 20  arseReset(&x);. 
c5f0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
c600: 69 6e 74 28 63 74 78 2c 20 72 63 29 3b 0a 7d 0a  int(ctx, rc);.}.
c610: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
c620: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c630: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
c660: 2a 2a 20 41 67 67 72 65 67 61 74 65 20 53 51 4c  ** Aggregate SQL
c670: 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d   function implem
c680: 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 2a 2a 2a 2a  entations.******
c690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c6a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c6b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c6c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c6d0: 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 6a 73  ******/./*.** js
c6e0: 6f 6e 5f 67 72 6f 75 70 5f 61 72 72 61 79 28 56  on_group_array(V
c6f0: 41 4c 55 45 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ALUE).**.** Retu
c700: 72 6e 20 61 20 4a 53 4f 4e 20 61 72 72 61 79 20  rn a JSON array 
c710: 63 6f 6d 70 6f 73 65 64 20 6f 66 20 61 6c 6c 20  composed of all 
c720: 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 61 67  values in the ag
c730: 67 72 65 67 61 74 65 2e 0a 2a 2f 0a 73 74 61 74  gregate..*/.stat
c740: 69 63 20 76 6f 69 64 20 6a 73 6f 6e 41 72 72 61  ic void jsonArra
c750: 79 53 74 65 70 28 0a 20 20 73 71 6c 69 74 65 33  yStep(.  sqlite3
c760: 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 0a 20  _context *ctx,. 
c770: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
c780: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
c790: 76 0a 29 7b 0a 20 20 4a 73 6f 6e 53 74 72 69 6e  v.){.  JsonStrin
c7a0: 67 20 2a 70 53 74 72 3b 0a 20 20 55 4e 55 53 45  g *pStr;.  UNUSE
c7b0: 44 5f 50 41 52 41 4d 28 61 72 67 63 29 3b 0a 20  D_PARAM(argc);. 
c7c0: 20 70 53 74 72 20 3d 20 28 4a 73 6f 6e 53 74 72   pStr = (JsonStr
c7d0: 69 6e 67 2a 29 73 71 6c 69 74 65 33 5f 61 67 67  ing*)sqlite3_agg
c7e0: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63  regate_context(c
c7f0: 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 53 74 72  tx, sizeof(*pStr
c800: 29 29 3b 0a 20 20 69 66 28 20 70 53 74 72 20 29  ));.  if( pStr )
c810: 7b 0a 20 20 20 20 69 66 28 20 70 53 74 72 2d 3e  {.    if( pStr->
c820: 7a 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zBuf==0 ){.     
c830: 20 6a 73 6f 6e 49 6e 69 74 28 70 53 74 72 2c 20   jsonInit(pStr, 
c840: 63 74 78 29 3b 0a 20 20 20 20 20 20 6a 73 6f 6e  ctx);.      json
c850: 41 70 70 65 6e 64 43 68 61 72 28 70 53 74 72 2c  AppendChar(pStr,
c860: 20 27 5b 27 29 3b 0a 20 20 20 20 7d 65 6c 73 65   '[');.    }else
c870: 7b 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65  {.      jsonAppe
c880: 6e 64 43 68 61 72 28 70 53 74 72 2c 20 27 2c 27  ndChar(pStr, ','
c890: 29 3b 0a 20 20 20 20 20 20 70 53 74 72 2d 3e 70  );.      pStr->p
c8a0: 43 74 78 20 3d 20 63 74 78 3b 0a 20 20 20 20 7d  Ctx = ctx;.    }
c8b0: 0a 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 56  .    jsonAppendV
c8c0: 61 6c 75 65 28 70 53 74 72 2c 20 61 72 67 76 5b  alue(pStr, argv[
c8d0: 30 5d 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  0]);.  }.}.stati
c8e0: 63 20 76 6f 69 64 20 6a 73 6f 6e 41 72 72 61 79  c void jsonArray
c8f0: 43 6f 6d 70 75 74 65 28 73 71 6c 69 74 65 33 5f  Compute(sqlite3_
c900: 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20 69 6e  context *ctx, in
c910: 74 20 69 73 46 69 6e 61 6c 29 7b 0a 20 20 4a 73  t isFinal){.  Js
c920: 6f 6e 53 74 72 69 6e 67 20 2a 70 53 74 72 3b 0a  onString *pStr;.
c930: 20 20 70 53 74 72 20 3d 20 28 4a 73 6f 6e 53 74    pStr = (JsonSt
c940: 72 69 6e 67 2a 29 73 71 6c 69 74 65 33 5f 61 67  ring*)sqlite3_ag
c950: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
c960: 63 74 78 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  ctx, 0);.  if( p
c970: 53 74 72 20 29 7b 0a 20 20 20 20 70 53 74 72 2d  Str ){.    pStr-
c980: 3e 70 43 74 78 20 3d 20 63 74 78 3b 0a 20 20 20  >pCtx = ctx;.   
c990: 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61 72 28   jsonAppendChar(
c9a0: 70 53 74 72 2c 20 27 5d 27 29 3b 0a 20 20 20 20  pStr, ']');.    
c9b0: 69 66 28 20 70 53 74 72 2d 3e 62 45 72 72 20 29  if( pStr->bErr )
c9c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 53 74 72  {.      if( pStr
c9d0: 2d 3e 62 45 72 72 3d 3d 31 20 29 20 73 71 6c 69  ->bErr==1 ) sqli
c9e0: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
c9f0: 5f 6e 6f 6d 65 6d 28 63 74 78 29 3b 0a 20 20 20  _nomem(ctx);.   
ca00: 20 20 20 61 73 73 65 72 74 28 20 70 53 74 72 2d     assert( pStr-
ca10: 3e 62 53 74 61 74 69 63 20 29 3b 0a 20 20 20 20  >bStatic );.    
ca20: 7d 65 6c 73 65 20 69 66 28 20 69 73 46 69 6e 61  }else if( isFina
ca30: 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
ca40: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
ca50: 74 78 2c 20 70 53 74 72 2d 3e 7a 42 75 66 2c 20  tx, pStr->zBuf, 
ca60: 70 53 74 72 2d 3e 6e 55 73 65 64 2c 0a 20 20 20  pStr->nUsed,.   
ca70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca80: 20 20 20 20 20 20 20 70 53 74 72 2d 3e 62 53 74         pStr->bSt
ca90: 61 74 69 63 20 3f 20 53 51 4c 49 54 45 5f 54 52  atic ? SQLITE_TR
caa0: 41 4e 53 49 45 4e 54 20 3a 20 73 71 6c 69 74 65  ANSIENT : sqlite
cab0: 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 20 20 70  3_free);.      p
cac0: 53 74 72 2d 3e 62 53 74 61 74 69 63 20 3d 20 31  Str->bStatic = 1
cad0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
cae0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
caf0: 74 5f 74 65 78 74 28 63 74 78 2c 20 70 53 74 72  t_text(ctx, pStr
cb00: 2d 3e 7a 42 75 66 2c 20 70 53 74 72 2d 3e 6e 55  ->zBuf, pStr->nU
cb10: 73 65 64 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  sed, SQLITE_TRAN
cb20: 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 70 53  SIENT);.      pS
cb30: 74 72 2d 3e 6e 55 73 65 64 2d 2d 3b 0a 20 20 20  tr->nUsed--;.   
cb40: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
cb50: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
cb60: 65 78 74 28 63 74 78 2c 20 22 5b 5d 22 2c 20 32  ext(ctx, "[]", 2
cb70: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
cb80: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
cb90: 72 65 73 75 6c 74 5f 73 75 62 74 79 70 65 28 63  result_subtype(c
cba0: 74 78 2c 20 4a 53 4f 4e 5f 53 55 42 54 59 50 45  tx, JSON_SUBTYPE
cbb0: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
cbc0: 20 6a 73 6f 6e 41 72 72 61 79 56 61 6c 75 65 28   jsonArrayValue(
cbd0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
cbe0: 2a 63 74 78 29 7b 0a 20 20 6a 73 6f 6e 41 72 72  *ctx){.  jsonArr
cbf0: 61 79 43 6f 6d 70 75 74 65 28 63 74 78 2c 20 30  ayCompute(ctx, 0
cc00: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
cc10: 20 6a 73 6f 6e 41 72 72 61 79 46 69 6e 61 6c 28   jsonArrayFinal(
cc20: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
cc30: 2a 63 74 78 29 7b 0a 20 20 6a 73 6f 6e 41 72 72  *ctx){.  jsonArr
cc40: 61 79 43 6f 6d 70 75 74 65 28 63 74 78 2c 20 31  ayCompute(ctx, 1
cc50: 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
cc60: 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
cc70: 46 55 4e 43 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  FUNC./*.** This 
cc80: 6d 65 74 68 6f 64 20 77 6f 72 6b 73 20 66 6f 72  method works for
cc90: 20 62 6f 74 68 20 6a 73 6f 6e 5f 67 72 6f 75 70   both json_group
cca0: 5f 61 72 72 61 79 28 29 20 61 6e 64 20 6a 73 6f  _array() and jso
ccb0: 6e 5f 67 72 6f 75 70 5f 6f 62 6a 65 63 74 28 29  n_group_object()
ccc0: 2e 0a 2a 2a 20 49 74 20 77 6f 72 6b 73 20 62 79  ..** It works by
ccd0: 20 72 65 6d 6f 76 69 6e 67 20 74 68 65 20 66 69   removing the fi
cce0: 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  rst element of t
ccf0: 68 65 20 67 72 6f 75 70 20 62 79 20 73 65 61 72  he group by sear
cd00: 63 68 69 6e 67 20 66 6f 72 77 61 72 64 0a 2a 2a  ching forward.**
cd10: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f   to the first co
cd20: 6d 6d 61 20 28 22 2c 22 29 20 74 68 61 74 20 69  mma (",") that i
cd30: 73 20 6e 6f 74 20 77 69 74 68 69 6e 20 61 20 73  s not within a s
cd40: 74 72 69 6e 67 20 61 6e 64 20 64 65 6c 65 74 69  tring and deleti
cd50: 6e 67 20 61 6c 6c 0a 2a 2a 20 74 65 78 74 20 74  ng all.** text t
cd60: 68 72 6f 75 67 68 20 74 68 61 74 20 63 6f 6d 6d  hrough that comm
cd70: 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  a..*/.static voi
cd80: 64 20 6a 73 6f 6e 47 72 6f 75 70 49 6e 76 65 72  d jsonGroupInver
cd90: 73 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  se(.  sqlite3_co
cda0: 6e 74 65 78 74 20 2a 63 74 78 2c 0a 20 20 69 6e  ntext *ctx,.  in
cdb0: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
cdc0: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
cdd0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
cde0: 20 69 6e 53 74 72 20 3d 20 30 3b 0a 20 20 63 68   inStr = 0;.  ch
cdf0: 61 72 20 2a 7a 3b 0a 20 20 4a 73 6f 6e 53 74 72  ar *z;.  JsonStr
ce00: 69 6e 67 20 2a 70 53 74 72 3b 0a 20 20 55 4e 55  ing *pStr;.  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: 61 72 67 76 29 3b 0a 20 20 70 53 74 72 20 3d 20  argv);.  pStr = 
ce40: 28 4a 73 6f 6e 53 74 72 69 6e 67 2a 29 73 71 6c  (JsonString*)sql
ce50: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
ce60: 6f 6e 74 65 78 74 28 63 74 78 2c 20 30 29 3b 0a  ontext(ctx, 0);.
ce70: 23 69 66 64 65 66 20 4e 45 56 45 52 0a 20 20 2f  #ifdef NEVER.  /
ce80: 2a 20 70 53 74 72 20 69 73 20 61 6c 77 61 79 73  * pStr is always
ce90: 20 6e 6f 6e 2d 4e 55 4c 4c 20 73 69 6e 63 65 20   non-NULL since 
cea0: 6a 73 6f 6e 41 72 72 61 79 53 74 65 70 28 29 20  jsonArrayStep() 
ceb0: 6f 72 20 6a 73 6f 6e 4f 62 6a 65 63 74 53 74 65  or jsonObjectSte
cec0: 70 28 29 20 77 69 6c 6c 0a 20 20 2a 2a 20 61 6c  p() will.  ** al
ced0: 77 61 79 73 20 68 61 76 65 20 62 65 65 6e 20 63  ways have been c
cee0: 61 6c 6c 65 64 20 74 6f 20 69 6e 69 74 61 6c 69  alled to initali
cef0: 7a 65 20 69 74 20 2a 2f 0a 20 20 69 66 28 20 4e  ze it */.  if( N
cf00: 45 56 45 52 28 21 70 53 74 72 29 20 29 20 72 65  EVER(!pStr) ) re
cf10: 74 75 72 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 7a  turn;.#endif.  z
cf20: 20 3d 20 70 53 74 72 2d 3e 7a 42 75 66 3b 0a 20   = pStr->zBuf;. 
cf30: 20 66 6f 72 28 69 3d 31 3b 20 7a 5b 69 5d 21 3d   for(i=1; z[i]!=
cf40: 27 2c 27 20 7c 7c 20 69 6e 53 74 72 3b 20 69 2b  ',' || inStr; i+
cf50: 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
cf60: 69 3c 70 53 74 72 2d 3e 6e 55 73 65 64 20 29 3b  i<pStr->nUsed );
cf70: 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27  .    if( z[i]=='
cf80: 22 27 20 29 7b 0a 20 20 20 20 20 20 69 6e 53 74  "' ){.      inSt
cf90: 72 20 3d 20 21 69 6e 53 74 72 3b 0a 20 20 20 20  r = !inStr;.    
cfa0: 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d  }else if( z[i]==
cfb0: 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 69 2b  '\\' ){.      i+
cfc0: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  +;.    }.  }.  p
cfd0: 53 74 72 2d 3e 6e 55 73 65 64 20 2d 3d 20 69 3b  Str->nUsed -= i;
cfe0: 20 20 20 20 20 20 0a 20 20 6d 65 6d 6d 6f 76 65        .  memmove
cff0: 28 26 7a 5b 31 5d 2c 20 26 7a 5b 69 2b 31 5d 2c  (&z[1], &z[i+1],
d000: 20 70 53 74 72 2d 3e 6e 55 73 65 64 2d 31 29 3b   pStr->nUsed-1);
d010: 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
d020: 65 20 6a 73 6f 6e 47 72 6f 75 70 49 6e 76 65 72  e jsonGroupInver
d030: 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  se 0.#endif.../*
d040: 0a 2a 2a 20 6a 73 6f 6e 5f 67 72 6f 75 70 5f 6f  .** json_group_o
d050: 62 6a 28 4e 41 4d 45 2c 56 41 4c 55 45 29 0a 2a  bj(NAME,VALUE).*
d060: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 4a 53  *.** Return a JS
d070: 4f 4e 20 6f 62 6a 65 63 74 20 63 6f 6d 70 6f 73  ON object compos
d080: 65 64 20 6f 66 20 61 6c 6c 20 6e 61 6d 65 73 20  ed of all names 
d090: 61 6e 64 20 76 61 6c 75 65 73 20 69 6e 20 74 68  and values in th
d0a0: 65 20 61 67 67 72 65 67 61 74 65 2e 0a 2a 2f 0a  e aggregate..*/.
d0b0: 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e  static void json
d0c0: 4f 62 6a 65 63 74 53 74 65 70 28 0a 20 20 73 71  ObjectStep(.  sq
d0d0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
d0e0: 74 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  tx,.  int argc,.
d0f0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
d100: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e  **argv.){.  Json
d110: 53 74 72 69 6e 67 20 2a 70 53 74 72 3b 0a 20 20  String *pStr;.  
d120: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
d130: 20 75 33 32 20 6e 3b 0a 20 20 55 4e 55 53 45 44   u32 n;.  UNUSED
d140: 5f 50 41 52 41 4d 28 61 72 67 63 29 3b 0a 20 20  _PARAM(argc);.  
d150: 70 53 74 72 20 3d 20 28 4a 73 6f 6e 53 74 72 69  pStr = (JsonStri
d160: 6e 67 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72  ng*)sqlite3_aggr
d170: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 74  egate_context(ct
d180: 78 2c 20 73 69 7a 65 6f 66 28 2a 70 53 74 72 29  x, sizeof(*pStr)
d190: 29 3b 0a 20 20 69 66 28 20 70 53 74 72 20 29 7b  );.  if( pStr ){
d1a0: 0a 20 20 20 20 69 66 28 20 70 53 74 72 2d 3e 7a  .    if( pStr->z
d1b0: 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Buf==0 ){.      
d1c0: 6a 73 6f 6e 49 6e 69 74 28 70 53 74 72 2c 20 63  jsonInit(pStr, c
d1d0: 74 78 29 3b 0a 20 20 20 20 20 20 6a 73 6f 6e 41  tx);.      jsonA
d1e0: 70 70 65 6e 64 43 68 61 72 28 70 53 74 72 2c 20  ppendChar(pStr, 
d1f0: 27 7b 27 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  '{');.    }else{
d200: 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e  .      jsonAppen
d210: 64 43 68 61 72 28 70 53 74 72 2c 20 27 2c 27 29  dChar(pStr, ',')
d220: 3b 0a 20 20 20 20 20 20 70 53 74 72 2d 3e 70 43  ;.      pStr->pC
d230: 74 78 20 3d 20 63 74 78 3b 0a 20 20 20 20 7d 0a  tx = ctx;.    }.
d240: 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 63      z = (const c
d250: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
d260: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
d270: 3b 0a 20 20 20 20 6e 20 3d 20 28 75 33 32 29 73  ;.    n = (u32)s
d280: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
d290: 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  es(argv[0]);.   
d2a0: 20 6a 73 6f 6e 41 70 70 65 6e 64 53 74 72 69 6e   jsonAppendStrin
d2b0: 67 28 70 53 74 72 2c 20 7a 2c 20 6e 29 3b 0a 20  g(pStr, z, n);. 
d2c0: 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61     jsonAppendCha
d2d0: 72 28 70 53 74 72 2c 20 27 3a 27 29 3b 0a 20 20  r(pStr, ':');.  
d2e0: 20 20 6a 73 6f 6e 41 70 70 65 6e 64 56 61 6c 75    jsonAppendValu
d2f0: 65 28 70 53 74 72 2c 20 61 72 67 76 5b 31 5d 29  e(pStr, argv[1])
d300: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
d310: 6f 69 64 20 6a 73 6f 6e 4f 62 6a 65 63 74 43 6f  oid jsonObjectCo
d320: 6d 70 75 74 65 28 73 71 6c 69 74 65 33 5f 63 6f  mpute(sqlite3_co
d330: 6e 74 65 78 74 20 2a 63 74 78 2c 20 69 6e 74 20  ntext *ctx, int 
d340: 69 73 46 69 6e 61 6c 29 7b 0a 20 20 4a 73 6f 6e  isFinal){.  Json
d350: 53 74 72 69 6e 67 20 2a 70 53 74 72 3b 0a 20 20  String *pStr;.  
d360: 70 53 74 72 20 3d 20 28 4a 73 6f 6e 53 74 72 69  pStr = (JsonStri
d370: 6e 67 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72  ng*)sqlite3_aggr
d380: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 74  egate_context(ct
d390: 78 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53 74  x, 0);.  if( pSt
d3a0: 72 20 29 7b 0a 20 20 20 20 6a 73 6f 6e 41 70 70  r ){.    jsonApp
d3b0: 65 6e 64 43 68 61 72 28 70 53 74 72 2c 20 27 7d  endChar(pStr, '}
d3c0: 27 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74 72  ');.    if( pStr
d3d0: 2d 3e 62 45 72 72 20 29 7b 0a 20 20 20 20 20 20  ->bErr ){.      
d3e0: 69 66 28 20 70 53 74 72 2d 3e 62 45 72 72 3d 3d  if( pStr->bErr==
d3f0: 31 20 29 20 73 71 6c 69 74 65 33 5f 72 65 73 75  1 ) sqlite3_resu
d400: 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63  lt_error_nomem(c
d410: 74 78 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  tx);.      asser
d420: 74 28 20 70 53 74 72 2d 3e 62 53 74 61 74 69 63  t( pStr->bStatic
d430: 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   );.    }else if
d440: 28 20 69 73 46 69 6e 61 6c 20 29 7b 0a 20 20 20  ( isFinal ){.   
d450: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
d460: 74 5f 74 65 78 74 28 63 74 78 2c 20 70 53 74 72  t_text(ctx, pStr
d470: 2d 3e 7a 42 75 66 2c 20 70 53 74 72 2d 3e 6e 55  ->zBuf, pStr->nU
d480: 73 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  sed,.           
d490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
d4a0: 53 74 72 2d 3e 62 53 74 61 74 69 63 20 3f 20 53  Str->bStatic ? S
d4b0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 20  QLITE_TRANSIENT 
d4c0: 3a 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b  : sqlite3_free);
d4d0: 0a 20 20 20 20 20 20 70 53 74 72 2d 3e 62 53 74  .      pStr->bSt
d4e0: 61 74 69 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65  atic = 1;.    }e
d4f0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
d500: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
d510: 74 78 2c 20 70 53 74 72 2d 3e 7a 42 75 66 2c 20  tx, pStr->zBuf, 
d520: 70 53 74 72 2d 3e 6e 55 73 65 64 2c 20 53 51 4c  pStr->nUsed, SQL
d530: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
d540: 20 20 20 20 20 20 70 53 74 72 2d 3e 6e 55 73 65        pStr->nUse
d550: 64 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  d--;.    }.  }el
d560: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
d570: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 74 78 2c  result_text(ctx,
d580: 20 22 7b 7d 22 2c 20 32 2c 20 53 51 4c 49 54 45   "{}", 2, SQLITE
d590: 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 20 20  _STATIC);.  }.  
d5a0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 73  sqlite3_result_s
d5b0: 75 62 74 79 70 65 28 63 74 78 2c 20 4a 53 4f 4e  ubtype(ctx, JSON
d5c0: 5f 53 55 42 54 59 50 45 29 3b 0a 7d 0a 73 74 61  _SUBTYPE);.}.sta
d5d0: 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 4f 62 6a  tic void jsonObj
d5e0: 65 63 74 56 61 6c 75 65 28 73 71 6c 69 74 65 33  ectValue(sqlite3
d5f0: 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 29 7b 0a  _context *ctx){.
d600: 20 20 6a 73 6f 6e 4f 62 6a 65 63 74 43 6f 6d 70    jsonObjectComp
d610: 75 74 65 28 63 74 78 2c 20 30 29 3b 0a 7d 0a 73  ute(ctx, 0);.}.s
d620: 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 4f  tatic void jsonO
d630: 62 6a 65 63 74 46 69 6e 61 6c 28 73 71 6c 69 74  bjectFinal(sqlit
d640: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 29  e3_context *ctx)
d650: 7b 0a 20 20 6a 73 6f 6e 4f 62 6a 65 63 74 43 6f  {.  jsonObjectCo
d660: 6d 70 75 74 65 28 63 74 78 2c 20 31 29 3b 0a 7d  mpute(ctx, 1);.}
d670: 0a 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ....#ifndef SQLI
d680: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
d690: 41 42 4c 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ABLE./**********
d6a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d6b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d6c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d6d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d6e0: 2a 2a 0a 2a 2a 20 54 68 65 20 6a 73 6f 6e 5f 65  **.** The json_e
d6f0: 61 63 68 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ach virtual tabl
d700: 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e.**************
d710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
d750: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 4a  typedef struct J
d760: 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 20 4a 73  sonEachCursor Js
d770: 6f 6e 45 61 63 68 43 75 72 73 6f 72 3b 0a 73 74  onEachCursor;.st
d780: 72 75 63 74 20 4a 73 6f 6e 45 61 63 68 43 75 72  ruct JsonEachCur
d790: 73 6f 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  sor {.  sqlite3_
d7a0: 76 74 61 62 5f 63 75 72 73 6f 72 20 62 61 73 65  vtab_cursor base
d7b0: 3b 20 20 2f 2a 20 42 61 73 65 20 63 6c 61 73 73  ;  /* Base class
d7c0: 20 2d 20 6d 75 73 74 20 62 65 20 66 69 72 73 74   - must be first
d7d0: 20 2a 2f 0a 20 20 75 33 32 20 69 52 6f 77 69 64   */.  u32 iRowid
d7e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d7f0: 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20 2a 2f   /* The rowid */
d800: 0a 20 20 75 33 32 20 69 42 65 67 69 6e 3b 20 20  .  u32 iBegin;  
d810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d820: 20 54 68 65 20 66 69 72 73 74 20 6e 6f 64 65 20   The first node 
d830: 6f 66 20 74 68 65 20 73 63 61 6e 20 2a 2f 0a 20  of the scan */. 
d840: 20 75 33 32 20 69 3b 20 20 20 20 20 20 20 20 20   u32 i;         
d850: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
d860: 6e 64 65 78 20 69 6e 20 73 50 61 72 73 65 2e 61  ndex in sParse.a
d870: 4e 6f 64 65 5b 5d 20 6f 66 20 63 75 72 72 65 6e  Node[] of curren
d880: 74 20 72 6f 77 20 2a 2f 0a 20 20 75 33 32 20 69  t row */.  u32 i
d890: 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  End;            
d8a0: 20 20 20 20 20 20 2f 2a 20 45 4f 46 20 77 68 65        /* EOF whe
d8b0: 6e 20 69 20 65 71 75 61 6c 73 20 6f 72 20 65 78  n i equals or ex
d8c0: 63 65 65 64 73 20 74 68 69 73 20 76 61 6c 75 65  ceeds this value
d8d0: 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 3b 20   */.  u8 eType; 
d8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8f0: 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 6f 70 2d   /* Type of top-
d900: 6c 65 76 65 6c 20 65 6c 65 6d 65 6e 74 20 2a 2f  level element */
d910: 0a 20 20 75 38 20 62 52 65 63 75 72 73 69 76 65  .  u8 bRecursive
d920: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
d930: 20 54 72 75 65 20 66 6f 72 20 6a 73 6f 6e 5f 74   True for json_t
d940: 72 65 65 28 29 2e 20 20 46 61 6c 73 65 20 66 6f  ree().  False fo
d950: 72 20 6a 73 6f 6e 5f 65 61 63 68 28 29 20 2a 2f  r json_each() */
d960: 0a 20 20 63 68 61 72 20 2a 7a 4a 73 6f 6e 3b 20  .  char *zJson; 
d970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d980: 20 49 6e 70 75 74 20 4a 53 4f 4e 20 2a 2f 0a 20   Input JSON */. 
d990: 20 63 68 61 72 20 2a 7a 52 6f 6f 74 3b 20 20 20   char *zRoot;   
d9a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
d9b0: 61 74 68 20 62 79 20 77 68 69 63 68 20 74 6f 20  ath by which to 
d9c0: 66 69 6c 74 65 72 20 7a 4a 73 6f 6e 20 2a 2f 0a  filter zJson */.
d9d0: 20 20 4a 73 6f 6e 50 61 72 73 65 20 73 50 61 72    JsonParse sPar
d9e0: 73 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se;          /* 
d9f0: 50 61 72 73 65 20 6f 66 20 74 68 65 20 69 6e 70  Parse of the inp
da00: 75 74 20 4a 53 4f 4e 20 2a 2f 0a 7d 3b 0a 0a 2f  ut JSON */.};../
da10: 2a 20 43 6f 6e 73 74 72 75 63 74 6f 72 20 66 6f  * Constructor fo
da20: 72 20 74 68 65 20 6a 73 6f 6e 5f 65 61 63 68 20  r the json_each 
da30: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f  virtual table */
da40: 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e  .static int json
da50: 45 61 63 68 43 6f 6e 6e 65 63 74 28 0a 20 20 73  EachConnect(.  s
da60: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f  qlite3 *db,.  vo
da70: 69 64 20 2a 70 41 75 78 2c 0a 20 20 69 6e 74 20  id *pAux,.  int 
da80: 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72  argc, const char
da90: 20 2a 63 6f 6e 73 74 2a 61 72 67 76 2c 0a 20 20   *const*argv,.  
daa0: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a 70  sqlite3_vtab **p
dab0: 70 56 74 61 62 2c 0a 20 20 63 68 61 72 20 2a 2a  pVtab,.  char **
dac0: 70 7a 45 72 72 0a 29 7b 0a 20 20 73 71 6c 69 74  pzErr.){.  sqlit
dad0: 65 33 5f 76 74 61 62 20 2a 70 4e 65 77 3b 0a 20  e3_vtab *pNew;. 
dae0: 20 69 6e 74 20 72 63 3b 0a 0a 2f 2a 20 43 6f 6c   int rc;../* Col
daf0: 75 6d 6e 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 23  umn numbers */.#
db00: 64 65 66 69 6e 65 20 4a 45 41 43 48 5f 4b 45 59  define JEACH_KEY
db10: 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20 4a       0.#define J
db20: 45 41 43 48 5f 56 41 4c 55 45 20 20 20 31 0a 23  EACH_VALUE   1.#
db30: 64 65 66 69 6e 65 20 4a 45 41 43 48 5f 54 59 50  define JEACH_TYP
db40: 45 20 20 20 20 32 0a 23 64 65 66 69 6e 65 20 4a  E    2.#define J
db50: 45 41 43 48 5f 41 54 4f 4d 20 20 20 20 33 0a 23  EACH_ATOM    3.#
db60: 64 65 66 69 6e 65 20 4a 45 41 43 48 5f 49 44 20  define JEACH_ID 
db70: 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65 20 4a       4.#define J
db80: 45 41 43 48 5f 50 41 52 45 4e 54 20 20 35 0a 23  EACH_PARENT  5.#
db90: 64 65 66 69 6e 65 20 4a 45 41 43 48 5f 46 55 4c  define JEACH_FUL
dba0: 4c 4b 45 59 20 36 0a 23 64 65 66 69 6e 65 20 4a  LKEY 6.#define J
dbb0: 45 41 43 48 5f 50 41 54 48 20 20 20 20 37 0a 23  EACH_PATH    7.#
dbc0: 64 65 66 69 6e 65 20 4a 45 41 43 48 5f 4a 53 4f  define JEACH_JSO
dbd0: 4e 20 20 20 20 38 0a 23 64 65 66 69 6e 65 20 4a  N    8.#define J
dbe0: 45 41 43 48 5f 52 4f 4f 54 20 20 20 20 39 0a 0a  EACH_ROOT    9..
dbf0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 70    UNUSED_PARAM(p
dc00: 7a 45 72 72 29 3b 0a 20 20 55 4e 55 53 45 44 5f  zErr);.  UNUSED_
dc10: 50 41 52 41 4d 28 61 72 67 76 29 3b 0a 20 20 55  PARAM(argv);.  U
dc20: 4e 55 53 45 44 5f 50 41 52 41 4d 28 61 72 67 63  NUSED_PARAM(argc
dc30: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
dc40: 4d 28 70 41 75 78 29 3b 0a 20 20 72 63 20 3d 20  M(pAux);.  rc = 
dc50: 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f  sqlite3_declare_
dc60: 76 74 61 62 28 64 62 2c 20 0a 20 20 20 20 20 22  vtab(db, .     "
dc70: 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 28 6b  CREATE TABLE x(k
dc80: 65 79 2c 76 61 6c 75 65 2c 74 79 70 65 2c 61 74  ey,value,type,at
dc90: 6f 6d 2c 69 64 2c 70 61 72 65 6e 74 2c 66 75 6c  om,id,parent,ful
dca0: 6c 6b 65 79 2c 70 61 74 68 2c 22 0a 20 20 20 20  lkey,path,".    
dcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcc0: 22 6a 73 6f 6e 20 48 49 44 44 45 4e 2c 72 6f 6f  "json HIDDEN,roo
dcd0: 74 20 48 49 44 44 45 4e 29 22 29 3b 0a 20 20 69  t HIDDEN)");.  i
dce0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
dcf0: 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 2a   ){.    pNew = *
dd00: 70 70 56 74 61 62 20 3d 20 73 71 6c 69 74 65 33  ppVtab = sqlite3
dd10: 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  _malloc( sizeof(
dd20: 2a 70 4e 65 77 29 20 29 3b 0a 20 20 20 20 69 66  *pNew) );.    if
dd30: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
dd40: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
dd50: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65 77  .    memset(pNew
dd60: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  , 0, sizeof(*pNe
dd70: 77 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  w));.  }.  retur
dd80: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 64 65 73 74  n rc;.}../* dest
dd90: 72 75 63 74 6f 72 20 66 6f 72 20 6a 73 6f 6e 5f  ructor for json_
dda0: 65 61 63 68 20 76 69 72 74 75 61 6c 20 74 61 62  each virtual tab
ddb0: 6c 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  le */.static int
ddc0: 20 6a 73 6f 6e 45 61 63 68 44 69 73 63 6f 6e 6e   jsonEachDisconn
ddd0: 65 63 74 28 73 71 6c 69 74 65 33 5f 76 74 61 62  ect(sqlite3_vtab
dde0: 20 2a 70 56 74 61 62 29 7b 0a 20 20 73 71 6c 69   *pVtab){.  sqli
ddf0: 74 65 33 5f 66 72 65 65 28 70 56 74 61 62 29 3b  te3_free(pVtab);
de00: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
de10: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 63 6f 6e 73 74  _OK;.}../* const
de20: 72 75 63 74 6f 72 20 66 6f 72 20 61 20 4a 73 6f  ructor for a Jso
de30: 6e 45 61 63 68 43 75 72 73 6f 72 20 6f 62 6a 65  nEachCursor obje
de40: 63 74 20 66 6f 72 20 6a 73 6f 6e 5f 65 61 63 68  ct for json_each
de50: 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  (). */.static in
de60: 74 20 6a 73 6f 6e 45 61 63 68 4f 70 65 6e 45 61  t jsonEachOpenEa
de70: 63 68 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  ch(sqlite3_vtab 
de80: 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62  *p, sqlite3_vtab
de90: 5f 63 75 72 73 6f 72 20 2a 2a 70 70 43 75 72 73  _cursor **ppCurs
dea0: 6f 72 29 7b 0a 20 20 4a 73 6f 6e 45 61 63 68 43  or){.  JsonEachC
deb0: 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20  ursor *pCur;..  
dec0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 70 29 3b  UNUSED_PARAM(p);
ded0: 0a 20 20 70 43 75 72 20 3d 20 73 71 6c 69 74 65  .  pCur = sqlite
dee0: 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
def0: 28 2a 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28  (*pCur) );.  if(
df00: 20 70 43 75 72 3d 3d 30 20 29 20 72 65 74 75 72   pCur==0 ) retur
df10: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
df20: 20 20 6d 65 6d 73 65 74 28 70 43 75 72 2c 20 30    memset(pCur, 0
df30: 2c 20 73 69 7a 65 6f 66 28 2a 70 43 75 72 29 29  , sizeof(*pCur))
df40: 3b 0a 20 20 2a 70 70 43 75 72 73 6f 72 20 3d 20  ;.  *ppCursor = 
df50: 26 70 43 75 72 2d 3e 62 61 73 65 3b 0a 20 20 72  &pCur->base;.  r
df60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
df70: 0a 7d 0a 0a 2f 2a 20 63 6f 6e 73 74 72 75 63 74  .}../* construct
df80: 6f 72 20 66 6f 72 20 61 20 4a 73 6f 6e 45 61 63  or for a JsonEac
df90: 68 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 66  hCursor object f
dfa0: 6f 72 20 6a 73 6f 6e 5f 74 72 65 65 28 29 2e 20  or json_tree(). 
dfb0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 73  */.static int js
dfc0: 6f 6e 45 61 63 68 4f 70 65 6e 54 72 65 65 28 73  onEachOpenTree(s
dfd0: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 2c 20  qlite3_vtab *p, 
dfe0: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
dff0: 73 6f 72 20 2a 2a 70 70 43 75 72 73 6f 72 29 7b  sor **ppCursor){
e000: 0a 20 20 69 6e 74 20 72 63 20 3d 20 6a 73 6f 6e  .  int rc = json
e010: 45 61 63 68 4f 70 65 6e 45 61 63 68 28 70 2c 20  EachOpenEach(p, 
e020: 70 70 43 75 72 73 6f 72 29 3b 0a 20 20 69 66 28  ppCursor);.  if(
e030: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
e040: 7b 0a 20 20 20 20 4a 73 6f 6e 45 61 63 68 43 75  {.    JsonEachCu
e050: 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 4a 73  rsor *pCur = (Js
e060: 6f 6e 45 61 63 68 43 75 72 73 6f 72 2a 29 2a 70  onEachCursor*)*p
e070: 70 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 43 75  pCursor;.    pCu
e080: 72 2d 3e 62 52 65 63 75 72 73 69 76 65 20 3d 20  r->bRecursive = 
e090: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
e0a0: 72 63 3b 0a 7d 0a 0a 2f 2a 20 52 65 73 65 74 20  rc;.}../* Reset 
e0b0: 61 20 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72  a JsonEachCursor
e0c0: 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69   back to its ori
e0d0: 67 69 6e 61 6c 20 73 74 61 74 65 2e 20 20 46 72  ginal state.  Fr
e0e0: 65 65 20 61 6e 79 20 6d 65 6d 6f 72 79 0a 2a 2a  ee any memory.**
e0f0: 20 68 65 6c 64 2e 20 2a 2f 0a 73 74 61 74 69 63   held. */.static
e100: 20 76 6f 69 64 20 6a 73 6f 6e 45 61 63 68 43 75   void jsonEachCu
e110: 72 73 6f 72 52 65 73 65 74 28 4a 73 6f 6e 45 61  rsorReset(JsonEa
e120: 63 68 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  chCursor *p){.  
e130: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
e140: 7a 4a 73 6f 6e 29 3b 0a 20 20 73 71 6c 69 74 65  zJson);.  sqlite
e150: 33 5f 66 72 65 65 28 70 2d 3e 7a 52 6f 6f 74 29  3_free(p->zRoot)
e160: 3b 0a 20 20 6a 73 6f 6e 50 61 72 73 65 52 65 73  ;.  jsonParseRes
e170: 65 74 28 26 70 2d 3e 73 50 61 72 73 65 29 3b 0a  et(&p->sParse);.
e180: 20 20 70 2d 3e 69 52 6f 77 69 64 20 3d 20 30 3b    p->iRowid = 0;
e190: 0a 20 20 70 2d 3e 69 20 3d 20 30 3b 0a 20 20 70  .  p->i = 0;.  p
e1a0: 2d 3e 69 45 6e 64 20 3d 20 30 3b 0a 20 20 70 2d  ->iEnd = 0;.  p-
e1b0: 3e 65 54 79 70 65 20 3d 20 30 3b 0a 20 20 70 2d  >eType = 0;.  p-
e1c0: 3e 7a 4a 73 6f 6e 20 3d 20 30 3b 0a 20 20 70 2d  >zJson = 0;.  p-
e1d0: 3e 7a 52 6f 6f 74 20 3d 20 30 3b 0a 7d 0a 0a 2f  >zRoot = 0;.}../
e1e0: 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66 6f 72  * Destructor for
e1f0: 20 61 20 6a 73 6f 6e 45 61 63 68 43 75 72 73 6f   a jsonEachCurso
e200: 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 73 74 61 74  r object */.stat
e210: 69 63 20 69 6e 74 20 6a 73 6f 6e 45 61 63 68 43  ic int jsonEachC
e220: 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 74 61  lose(sqlite3_vta
e230: 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 29 7b 0a  b_cursor *cur){.
e240: 20 20 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72    JsonEachCursor
e250: 20 2a 70 20 3d 20 28 4a 73 6f 6e 45 61 63 68 43   *p = (JsonEachC
e260: 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20 20 6a 73  ursor*)cur;.  js
e270: 6f 6e 45 61 63 68 43 75 72 73 6f 72 52 65 73 65  onEachCursorRese
e280: 74 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t(p);.  sqlite3_
e290: 66 72 65 65 28 63 75 72 29 3b 0a 20 20 72 65 74  free(cur);.  ret
e2a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
e2b0: 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 54 52 55 45  ../* Return TRUE
e2c0: 20 69 66 20 74 68 65 20 6a 73 6f 6e 45 61 63 68   if the jsonEach
e2d0: 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 68 61  Cursor object ha
e2e0: 73 20 62 65 65 6e 20 61 64 76 61 6e 63 65 64 20  s been advanced 
e2f0: 6f 66 66 20 74 68 65 20 65 6e 64 0a 2a 2a 20 6f  off the end.** o
e300: 66 20 74 68 65 20 4a 53 4f 4e 20 6f 62 6a 65 63  f the JSON objec
e310: 74 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  t */.static int 
e320: 6a 73 6f 6e 45 61 63 68 45 6f 66 28 73 71 6c 69  jsonEachEof(sqli
e330: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
e340: 2a 63 75 72 29 7b 0a 20 20 4a 73 6f 6e 45 61 63  *cur){.  JsonEac
e350: 68 43 75 72 73 6f 72 20 2a 70 20 3d 20 28 4a 73  hCursor *p = (Js
e360: 6f 6e 45 61 63 68 43 75 72 73 6f 72 2a 29 63 75  onEachCursor*)cu
e370: 72 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 69  r;.  return p->i
e380: 20 3e 3d 20 70 2d 3e 69 45 6e 64 3b 0a 7d 0a 0a   >= p->iEnd;.}..
e390: 2f 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 63  /* Advance the c
e3a0: 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78  ursor to the nex
e3b0: 74 20 65 6c 65 6d 65 6e 74 20 66 6f 72 20 6a 73  t element for js
e3c0: 6f 6e 5f 74 72 65 65 28 29 20 2a 2f 0a 73 74 61  on_tree() */.sta
e3d0: 74 69 63 20 69 6e 74 20 6a 73 6f 6e 45 61 63 68  tic int jsonEach
e3e0: 4e 65 78 74 28 73 71 6c 69 74 65 33 5f 76 74 61  Next(sqlite3_vta
e3f0: 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 29 7b 0a  b_cursor *cur){.
e400: 20 20 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72    JsonEachCursor
e410: 20 2a 70 20 3d 20 28 4a 73 6f 6e 45 61 63 68 43   *p = (JsonEachC
e420: 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20 20 69 66  ursor*)cur;.  if
e430: 28 20 70 2d 3e 62 52 65 63 75 72 73 69 76 65 20  ( p->bRecursive 
e440: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 50  ){.    if( p->sP
e450: 61 72 73 65 2e 61 4e 6f 64 65 5b 70 2d 3e 69 5d  arse.aNode[p->i]
e460: 2e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45  .jnFlags & JNODE
e470: 5f 4c 41 42 45 4c 20 29 20 70 2d 3e 69 2b 2b 3b  _LABEL ) p->i++;
e480: 0a 20 20 20 20 70 2d 3e 69 2b 2b 3b 0a 20 20 20  .    p->i++;.   
e490: 20 70 2d 3e 69 52 6f 77 69 64 2b 2b 3b 0a 20 20   p->iRowid++;.  
e4a0: 20 20 69 66 28 20 70 2d 3e 69 3c 70 2d 3e 69 45    if( p->i<p->iE
e4b0: 6e 64 20 29 7b 0a 20 20 20 20 20 20 75 33 32 20  nd ){.      u32 
e4c0: 69 55 70 20 3d 20 70 2d 3e 73 50 61 72 73 65 2e  iUp = p->sParse.
e4d0: 61 55 70 5b 70 2d 3e 69 5d 3b 0a 20 20 20 20 20  aUp[p->i];.     
e4e0: 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 55 70 20 3d   JsonNode *pUp =
e4f0: 20 26 70 2d 3e 73 50 61 72 73 65 2e 61 4e 6f 64   &p->sParse.aNod
e500: 65 5b 69 55 70 5d 3b 0a 20 20 20 20 20 20 70 2d  e[iUp];.      p-
e510: 3e 65 54 79 70 65 20 3d 20 70 55 70 2d 3e 65 54  >eType = pUp->eT
e520: 79 70 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ype;.      if( p
e530: 55 70 2d 3e 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f  Up->eType==JSON_
e540: 41 52 52 41 59 20 29 7b 0a 20 20 20 20 20 20 20  ARRAY ){.       
e550: 20 69 66 28 20 69 55 70 3d 3d 70 2d 3e 69 2d 31   if( iUp==p->i-1
e560: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 55   ){.          pU
e570: 70 2d 3e 75 2e 69 4b 65 79 20 3d 20 30 3b 0a 20  p->u.iKey = 0;. 
e580: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
e590: 20 20 20 20 20 20 20 20 70 55 70 2d 3e 75 2e 69          pUp->u.i
e5a0: 4b 65 79 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  Key++;.        }
e5b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
e5c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 77 69 74   }else{.    swit
e5d0: 63 68 28 20 70 2d 3e 65 54 79 70 65 20 29 7b 0a  ch( p->eType ){.
e5e0: 20 20 20 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f        case JSON_
e5f0: 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 20  ARRAY: {.       
e600: 20 70 2d 3e 69 20 2b 3d 20 6a 73 6f 6e 4e 6f 64   p->i += jsonNod
e610: 65 53 69 7a 65 28 26 70 2d 3e 73 50 61 72 73 65  eSize(&p->sParse
e620: 2e 61 4e 6f 64 65 5b 70 2d 3e 69 5d 29 3b 0a 20  .aNode[p->i]);. 
e630: 20 20 20 20 20 20 20 70 2d 3e 69 52 6f 77 69 64         p->iRowid
e640: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ++;.        brea
e650: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
e660: 20 63 61 73 65 20 4a 53 4f 4e 5f 4f 42 4a 45 43   case JSON_OBJEC
e670: 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  T: {.        p->
e680: 69 20 2b 3d 20 31 20 2b 20 6a 73 6f 6e 4e 6f 64  i += 1 + jsonNod
e690: 65 53 69 7a 65 28 26 70 2d 3e 73 50 61 72 73 65  eSize(&p->sParse
e6a0: 2e 61 4e 6f 64 65 5b 70 2d 3e 69 2b 31 5d 29 3b  .aNode[p->i+1]);
e6b0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 52 6f 77  .        p->iRow
e6c0: 69 64 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62 72  id++;.        br
e6d0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
e6e0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
e6f0: 20 20 20 20 20 20 70 2d 3e 69 20 3d 20 70 2d 3e        p->i = p->
e700: 69 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 62 72  iEnd;.        br
e710: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
e720: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
e730: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
e740: 20 41 70 70 65 6e 64 20 74 68 65 20 6e 61 6d 65   Append the name
e750: 20 6f 66 20 74 68 65 20 70 61 74 68 20 66 6f 72   of the path for
e760: 20 65 6c 65 6d 65 6e 74 20 69 20 74 6f 20 70 53   element i to pS
e770: 74 72 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  tr.*/.static voi
e780: 64 20 6a 73 6f 6e 45 61 63 68 43 6f 6d 70 75 74  d jsonEachComput
e790: 65 50 61 74 68 28 0a 20 20 4a 73 6f 6e 45 61 63  ePath(.  JsonEac
e7a0: 68 43 75 72 73 6f 72 20 2a 70 2c 20 20 20 20 20  hCursor *p,     
e7b0: 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
e7c0: 2a 2f 0a 20 20 4a 73 6f 6e 53 74 72 69 6e 67 20  */.  JsonString 
e7d0: 2a 70 53 74 72 2c 20 20 20 20 20 20 20 20 2f 2a  *pStr,        /*
e7e0: 20 57 72 69 74 65 20 74 68 65 20 70 61 74 68 20   Write the path 
e7f0: 68 65 72 65 20 2a 2f 0a 20 20 75 33 32 20 69 20  here */.  u32 i 
e800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e810: 20 20 20 2f 2a 20 50 61 74 68 20 74 6f 20 74 68     /* Path to th
e820: 69 73 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b  is element */.){
e830: 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f  .  JsonNode *pNo
e840: 64 65 2c 20 2a 70 55 70 3b 0a 20 20 75 33 32 20  de, *pUp;.  u32 
e850: 69 55 70 3b 0a 20 20 69 66 28 20 69 3d 3d 30 20  iUp;.  if( i==0 
e860: 29 7b 0a 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e  ){.    jsonAppen
e870: 64 43 68 61 72 28 70 53 74 72 2c 20 27 24 27 29  dChar(pStr, '$')
e880: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
e890: 7d 0a 20 20 69 55 70 20 3d 20 70 2d 3e 73 50 61  }.  iUp = p->sPa
e8a0: 72 73 65 2e 61 55 70 5b 69 5d 3b 0a 20 20 6a 73  rse.aUp[i];.  js
e8b0: 6f 6e 45 61 63 68 43 6f 6d 70 75 74 65 50 61 74  onEachComputePat
e8c0: 68 28 70 2c 20 70 53 74 72 2c 20 69 55 70 29 3b  h(p, pStr, iUp);
e8d0: 0a 20 20 70 4e 6f 64 65 20 3d 20 26 70 2d 3e 73  .  pNode = &p->s
e8e0: 50 61 72 73 65 2e 61 4e 6f 64 65 5b 69 5d 3b 0a  Parse.aNode[i];.
e8f0: 20 20 70 55 70 20 3d 20 26 70 2d 3e 73 50 61 72    pUp = &p->sPar
e900: 73 65 2e 61 4e 6f 64 65 5b 69 55 70 5d 3b 0a 20  se.aNode[iUp];. 
e910: 20 69 66 28 20 70 55 70 2d 3e 65 54 79 70 65 3d   if( pUp->eType=
e920: 3d 4a 53 4f 4e 5f 41 52 52 41 59 20 29 7b 0a 20  =JSON_ARRAY ){. 
e930: 20 20 20 6a 73 6f 6e 50 72 69 6e 74 66 28 33 30     jsonPrintf(30
e940: 2c 20 70 53 74 72 2c 20 22 5b 25 64 5d 22 2c 20  , pStr, "[%d]", 
e950: 70 55 70 2d 3e 75 2e 69 4b 65 79 29 3b 0a 20 20  pUp->u.iKey);.  
e960: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
e970: 74 28 20 70 55 70 2d 3e 65 54 79 70 65 3d 3d 4a  t( pUp->eType==J
e980: 53 4f 4e 5f 4f 42 4a 45 43 54 20 29 3b 0a 20 20  SON_OBJECT );.  
e990: 20 20 69 66 28 20 28 70 4e 6f 64 65 2d 3e 6a 6e    if( (pNode->jn
e9a0: 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 4c 41  Flags & JNODE_LA
e9b0: 42 45 4c 29 3d 3d 30 20 29 20 70 4e 6f 64 65 2d  BEL)==0 ) pNode-
e9c0: 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  -;.    assert( p
e9d0: 4e 6f 64 65 2d 3e 65 54 79 70 65 3d 3d 4a 53 4f  Node->eType==JSO
e9e0: 4e 5f 53 54 52 49 4e 47 20 29 3b 0a 20 20 20 20  N_STRING );.    
e9f0: 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e 6a  assert( pNode->j
ea00: 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 4c  nFlags & JNODE_L
ea10: 41 42 45 4c 20 29 3b 0a 20 20 20 20 6a 73 6f 6e  ABEL );.    json
ea20: 50 72 69 6e 74 66 28 70 4e 6f 64 65 2d 3e 6e 2b  Printf(pNode->n+
ea30: 31 2c 20 70 53 74 72 2c 20 22 2e 25 2e 2a 73 22  1, pStr, ".%.*s"
ea40: 2c 20 70 4e 6f 64 65 2d 3e 6e 2d 32 2c 20 70 4e  , pNode->n-2, pN
ea50: 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74  ode->u.zJContent
ea60: 2b 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52  +1);.  }.}../* R
ea70: 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
ea80: 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 73  of a column */.s
ea90: 74 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e 45 61  tatic int jsonEa
eaa0: 63 68 43 6f 6c 75 6d 6e 28 0a 20 20 73 71 6c 69  chColumn(.  sqli
eab0: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
eac0: 2a 63 75 72 2c 20 20 20 2f 2a 20 54 68 65 20 63  *cur,   /* The c
ead0: 75 72 73 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74  ursor */.  sqlit
eae0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c  e3_context *ctx,
eaf0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
eb00: 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 71 6c 69  argument to sqli
eb10: 74 65 33 5f 72 65 73 75 6c 74 5f 2e 2e 2e 28 29  te3_result_...()
eb20: 20 2a 2f 0a 20 20 69 6e 74 20 69 20 20 20 20 20   */.  int i     
eb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb40: 20 20 2f 2a 20 57 68 69 63 68 20 63 6f 6c 75 6d    /* Which colum
eb50: 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 29  n to return */.)
eb60: 7b 0a 20 20 4a 73 6f 6e 45 61 63 68 43 75 72 73  {.  JsonEachCurs
eb70: 6f 72 20 2a 70 20 3d 20 28 4a 73 6f 6e 45 61 63  or *p = (JsonEac
eb80: 68 43 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20 20  hCursor*)cur;.  
eb90: 4a 73 6f 6e 4e 6f 64 65 20 2a 70 54 68 69 73 20  JsonNode *pThis 
eba0: 3d 20 26 70 2d 3e 73 50 61 72 73 65 2e 61 4e 6f  = &p->sParse.aNo
ebb0: 64 65 5b 70 2d 3e 69 5d 3b 0a 20 20 73 77 69 74  de[p->i];.  swit
ebc0: 63 68 28 20 69 20 29 7b 0a 20 20 20 20 63 61 73  ch( i ){.    cas
ebd0: 65 20 4a 45 41 43 48 5f 4b 45 59 3a 20 7b 0a 20  e JEACH_KEY: {. 
ebe0: 20 20 20 20 20 69 66 28 20 70 2d 3e 69 3d 3d 30       if( p->i==0
ebf0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
ec00: 69 66 28 20 70 2d 3e 65 54 79 70 65 3d 3d 4a 53  if( p->eType==JS
ec10: 4f 4e 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20  ON_OBJECT ){.   
ec20: 20 20 20 20 20 6a 73 6f 6e 52 65 74 75 72 6e 28       jsonReturn(
ec30: 70 54 68 69 73 2c 20 63 74 78 2c 20 30 29 3b 0a  pThis, ctx, 0);.
ec40: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
ec50: 70 2d 3e 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f 41  p->eType==JSON_A
ec60: 52 52 41 59 20 29 7b 0a 20 20 20 20 20 20 20 20  RRAY ){.        
ec70: 75 33 32 20 69 4b 65 79 3b 0a 20 20 20 20 20 20  u32 iKey;.      
ec80: 20 20 69 66 28 20 70 2d 3e 62 52 65 63 75 72 73    if( p->bRecurs
ec90: 69 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ive ){.         
eca0: 20 69 66 28 20 70 2d 3e 69 52 6f 77 69 64 3d 3d   if( p->iRowid==
ecb0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
ecc0: 20 20 20 20 20 69 4b 65 79 20 3d 20 70 2d 3e 73       iKey = p->s
ecd0: 50 61 72 73 65 2e 61 4e 6f 64 65 5b 70 2d 3e 73  Parse.aNode[p->s
ece0: 50 61 72 73 65 2e 61 55 70 5b 70 2d 3e 69 5d 5d  Parse.aUp[p->i]]
ecf0: 2e 75 2e 69 4b 65 79 3b 0a 20 20 20 20 20 20 20  .u.iKey;.       
ed00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ed10: 20 20 69 4b 65 79 20 3d 20 70 2d 3e 69 52 6f 77    iKey = p->iRow
ed20: 69 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  id;.        }.  
ed30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
ed40: 73 75 6c 74 5f 69 6e 74 36 34 28 63 74 78 2c 20  sult_int64(ctx, 
ed50: 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 69  (sqlite3_int64)i
ed60: 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Key);.      }.  
ed70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
ed80: 0a 20 20 20 20 63 61 73 65 20 4a 45 41 43 48 5f  .    case JEACH_
ed90: 56 41 4c 55 45 3a 20 7b 0a 20 20 20 20 20 20 69  VALUE: {.      i
eda0: 66 28 20 70 54 68 69 73 2d 3e 6a 6e 46 6c 61 67  f( pThis->jnFlag
edb0: 73 20 26 20 4a 4e 4f 44 45 5f 4c 41 42 45 4c 20  s & JNODE_LABEL 
edc0: 29 20 70 54 68 69 73 2b 2b 3b 0a 20 20 20 20 20  ) pThis++;.     
edd0: 20 6a 73 6f 6e 52 65 74 75 72 6e 28 70 54 68 69   jsonReturn(pThi
ede0: 73 2c 20 63 74 78 2c 20 30 29 3b 0a 20 20 20 20  s, ctx, 0);.    
edf0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
ee00: 20 20 20 63 61 73 65 20 4a 45 41 43 48 5f 54 59     case JEACH_TY
ee10: 50 45 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  PE: {.      if( 
ee20: 70 54 68 69 73 2d 3e 6a 6e 46 6c 61 67 73 20 26  pThis->jnFlags &
ee30: 20 4a 4e 4f 44 45 5f 4c 41 42 45 4c 20 29 20 70   JNODE_LABEL ) p
ee40: 54 68 69 73 2b 2b 3b 0a 20 20 20 20 20 20 73 71  This++;.      sq
ee50: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
ee60: 74 28 63 74 78 2c 20 6a 73 6f 6e 54 79 70 65 5b  t(ctx, jsonType[
ee70: 70 54 68 69 73 2d 3e 65 54 79 70 65 5d 2c 20 2d  pThis->eType], -
ee80: 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
ee90: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
eea0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a      }.    case J
eeb0: 45 41 43 48 5f 41 54 4f 4d 3a 20 7b 0a 20 20 20  EACH_ATOM: {.   
eec0: 20 20 20 69 66 28 20 70 54 68 69 73 2d 3e 6a 6e     if( pThis->jn
eed0: 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 4c 41  Flags & JNODE_LA
eee0: 42 45 4c 20 29 20 70 54 68 69 73 2b 2b 3b 0a 20  BEL ) pThis++;. 
eef0: 20 20 20 20 20 69 66 28 20 70 54 68 69 73 2d 3e       if( pThis->
ef00: 65 54 79 70 65 3e 3d 4a 53 4f 4e 5f 41 52 52 41  eType>=JSON_ARRA
ef10: 59 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  Y ) break;.     
ef20: 20 6a 73 6f 6e 52 65 74 75 72 6e 28 70 54 68 69   jsonReturn(pThi
ef30: 73 2c 20 63 74 78 2c 20 30 29 3b 0a 20 20 20 20  s, ctx, 0);.    
ef40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
ef50: 20 20 20 63 61 73 65 20 4a 45 41 43 48 5f 49 44     case JEACH_ID
ef60: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
ef70: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63  3_result_int64(c
ef80: 74 78 2c 20 0a 20 20 20 20 20 20 20 20 20 28 73  tx, .         (s
ef90: 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 2d 3e  qlite3_int64)p->
efa0: 69 20 2b 20 28 28 70 54 68 69 73 2d 3e 6a 6e 46  i + ((pThis->jnF
efb0: 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 4c 41 42  lags & JNODE_LAB
efc0: 45 4c 29 21 3d 30 29 29 3b 0a 20 20 20 20 20 20  EL)!=0));.      
efd0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
efe0: 20 63 61 73 65 20 4a 45 41 43 48 5f 50 41 52 45   case JEACH_PARE
eff0: 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  NT: {.      if( 
f000: 70 2d 3e 69 3e 70 2d 3e 69 42 65 67 69 6e 20 26  p->i>p->iBegin &
f010: 26 20 70 2d 3e 62 52 65 63 75 72 73 69 76 65 20  & p->bRecursive 
f020: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
f030: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28  e3_result_int64(
f040: 63 74 78 2c 20 28 73 71 6c 69 74 65 33 5f 69 6e  ctx, (sqlite3_in
f050: 74 36 34 29 70 2d 3e 73 50 61 72 73 65 2e 61 55  t64)p->sParse.aU
f060: 70 5b 70 2d 3e 69 5d 29 3b 0a 20 20 20 20 20 20  p[p->i]);.      
f070: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
f080: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 45     }.    case JE
f090: 41 43 48 5f 46 55 4c 4c 4b 45 59 3a 20 7b 0a 20  ACH_FULLKEY: {. 
f0a0: 20 20 20 20 20 4a 73 6f 6e 53 74 72 69 6e 67 20       JsonString 
f0b0: 78 3b 0a 20 20 20 20 20 20 6a 73 6f 6e 49 6e 69  x;.      jsonIni
f0c0: 74 28 26 78 2c 20 63 74 78 29 3b 0a 20 20 20 20  t(&x, ctx);.    
f0d0: 20 20 69 66 28 20 70 2d 3e 62 52 65 63 75 72 73    if( p->bRecurs
f0e0: 69 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20 6a  ive ){.        j
f0f0: 73 6f 6e 45 61 63 68 43 6f 6d 70 75 74 65 50 61  sonEachComputePa
f100: 74 68 28 70 2c 20 26 78 2c 20 70 2d 3e 69 29 3b  th(p, &x, p->i);
f110: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
f120: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 7a 52 6f        if( p->zRo
f130: 6f 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ot ){.          
f140: 6a 73 6f 6e 41 70 70 65 6e 64 52 61 77 28 26 78  jsonAppendRaw(&x
f150: 2c 20 70 2d 3e 7a 52 6f 6f 74 2c 20 28 69 6e 74  , p->zRoot, (int
f160: 29 73 74 72 6c 65 6e 28 70 2d 3e 7a 52 6f 6f 74  )strlen(p->zRoot
f170: 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ));.        }els
f180: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6a 73 6f  e{.          jso
f190: 6e 41 70 70 65 6e 64 43 68 61 72 28 26 78 2c 20  nAppendChar(&x, 
f1a0: 27 24 27 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  '$');.        }.
f1b0: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65          if( p->e
f1c0: 54 79 70 65 3d 3d 4a 53 4f 4e 5f 41 52 52 41 59  Type==JSON_ARRAY
f1d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6a 73   ){.          js
f1e0: 6f 6e 50 72 69 6e 74 66 28 33 30 2c 20 26 78 2c  onPrintf(30, &x,
f1f0: 20 22 5b 25 64 5d 22 2c 20 70 2d 3e 69 52 6f 77   "[%d]", p->iRow
f200: 69 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  id);.        }el
f210: 73 65 20 69 66 28 20 70 2d 3e 65 54 79 70 65 3d  se if( p->eType=
f220: 3d 4a 53 4f 4e 5f 4f 42 4a 45 43 54 20 29 7b 0a  =JSON_OBJECT ){.
f230: 20 20 20 20 20 20 20 20 20 20 6a 73 6f 6e 50 72            jsonPr
f240: 69 6e 74 66 28 70 54 68 69 73 2d 3e 6e 2c 20 26  intf(pThis->n, &
f250: 78 2c 20 22 2e 25 2e 2a 73 22 2c 20 70 54 68 69  x, ".%.*s", pThi
f260: 73 2d 3e 6e 2d 32 2c 20 70 54 68 69 73 2d 3e 75  s->n-2, pThis->u
f270: 2e 7a 4a 43 6f 6e 74 65 6e 74 2b 31 29 3b 0a 20  .zJContent+1);. 
f280: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
f290: 0a 20 20 20 20 20 20 6a 73 6f 6e 52 65 73 75 6c  .      jsonResul
f2a0: 74 28 26 78 29 3b 0a 20 20 20 20 20 20 62 72 65  t(&x);.      bre
f2b0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
f2c0: 73 65 20 4a 45 41 43 48 5f 50 41 54 48 3a 20 7b  se JEACH_PATH: {
f2d0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 62 52  .      if( p->bR
f2e0: 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
f2f0: 20 20 20 20 4a 73 6f 6e 53 74 72 69 6e 67 20 78      JsonString x
f300: 3b 0a 20 20 20 20 20 20 20 20 6a 73 6f 6e 49 6e  ;.        jsonIn
f310: 69 74 28 26 78 2c 20 63 74 78 29 3b 0a 20 20 20  it(&x, ctx);.   
f320: 20 20 20 20 20 6a 73 6f 6e 45 61 63 68 43 6f 6d       jsonEachCom
f330: 70 75 74 65 50 61 74 68 28 70 2c 20 26 78 2c 20  putePath(p, &x, 
f340: 70 2d 3e 73 50 61 72 73 65 2e 61 55 70 5b 70 2d  p->sParse.aUp[p-
f350: 3e 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 6a 73  >i]);.        js
f360: 6f 6e 52 65 73 75 6c 74 28 26 78 29 3b 0a 20 20  onResult(&x);.  
f370: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f380: 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 6f     }.      /* Fo
f390: 72 20 6a 73 6f 6e 5f 65 61 63 68 28 29 20 70 61  r json_each() pa
f3a0: 74 68 20 61 6e 64 20 72 6f 6f 74 20 61 72 65 20  th and root are 
f3b0: 74 68 65 20 73 61 6d 65 20 73 6f 20 66 61 6c 6c  the same so fall
f3c0: 20 74 68 72 6f 75 67 68 0a 20 20 20 20 20 20 2a   through.      *
f3d0: 2a 20 69 6e 74 6f 20 74 68 65 20 72 6f 6f 74 20  * into the root 
f3e0: 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  case */.    }.  
f3f0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
f400: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
f410: 52 6f 6f 74 20 3d 20 70 2d 3e 7a 52 6f 6f 74 3b  Root = p->zRoot;
f420: 0a 20 20 20 20 20 20 69 66 28 20 7a 52 6f 6f 74  .      if( zRoot
f430: 3d 3d 30 20 29 20 7a 52 6f 6f 74 20 3d 20 22 24  ==0 ) zRoot = "$
f440: 22 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ";.      sqlite3
f450: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 74 78  _result_text(ctx
f460: 2c 20 7a 52 6f 6f 74 2c 20 2d 31 2c 20 53 51 4c  , zRoot, -1, SQL
f470: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
f480: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
f490: 20 20 20 20 63 61 73 65 20 4a 45 41 43 48 5f 4a      case JEACH_J
f4a0: 53 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  SON: {.      ass
f4b0: 65 72 74 28 20 69 3d 3d 4a 45 41 43 48 5f 4a 53  ert( i==JEACH_JS
f4c0: 4f 4e 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ON );.      sqli
f4d0: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
f4e0: 63 74 78 2c 20 70 2d 3e 73 50 61 72 73 65 2e 7a  ctx, p->sParse.z
f4f0: 4a 73 6f 6e 2c 20 2d 31 2c 20 53 51 4c 49 54 45  Json, -1, SQLITE
f500: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
f510: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
f520: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
f530: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  _OK;.}../* Retur
f540: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  n the current ro
f550: 77 69 64 20 76 61 6c 75 65 20 2a 2f 0a 73 74 61  wid value */.sta
f560: 74 69 63 20 69 6e 74 20 6a 73 6f 6e 45 61 63 68  tic int jsonEach
f570: 52 6f 77 69 64 28 73 71 6c 69 74 65 33 5f 76 74  Rowid(sqlite3_vt
f580: 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 2c 20  ab_cursor *cur, 
f590: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 52  sqlite_int64 *pR
f5a0: 6f 77 69 64 29 7b 0a 20 20 4a 73 6f 6e 45 61 63  owid){.  JsonEac
f5b0: 68 43 75 72 73 6f 72 20 2a 70 20 3d 20 28 4a 73  hCursor *p = (Js
f5c0: 6f 6e 45 61 63 68 43 75 72 73 6f 72 2a 29 63 75  onEachCursor*)cu
f5d0: 72 3b 0a 20 20 2a 70 52 6f 77 69 64 20 3d 20 70  r;.  *pRowid = p
f5e0: 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 72 65 74 75  ->iRowid;.  retu
f5f0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
f600: 0a 2f 2a 20 54 68 65 20 71 75 65 72 79 20 73 74  ./* The query st
f610: 72 61 74 65 67 79 20 69 73 20 74 6f 20 6c 6f 6f  rategy is to loo
f620: 6b 20 66 6f 72 20 61 6e 20 65 71 75 61 6c 69 74  k for an equalit
f630: 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20  y constraint on 
f640: 74 68 65 20 6a 73 6f 6e 0a 2a 2a 20 63 6f 6c 75  the json.** colu
f650: 6d 6e 2e 20 20 57 69 74 68 6f 75 74 20 73 75 63  mn.  Without suc
f660: 68 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20  h a constraint, 
f670: 74 68 65 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74  the table cannot
f680: 20 6f 70 65 72 61 74 65 2e 20 20 69 64 78 4e 75   operate.  idxNu
f690: 6d 20 69 73 0a 2a 2a 20 31 20 69 66 20 74 68 65  m is.** 1 if the
f6a0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 66   constraint is f
f6b0: 6f 75 6e 64 2c 20 33 20 69 66 20 74 68 65 20 63  ound, 3 if the c
f6c0: 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 7a 52  onstraint and zR
f6d0: 6f 6f 74 20 61 72 65 20 66 6f 75 6e 64 2c 0a 2a  oot are found,.*
f6e0: 2a 20 61 6e 64 20 30 20 6f 74 68 65 72 77 69 73  * and 0 otherwis
f6f0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
f700: 20 6a 73 6f 6e 45 61 63 68 42 65 73 74 49 6e 64   jsonEachBestInd
f710: 65 78 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  ex(.  sqlite3_vt
f720: 61 62 20 2a 74 61 62 2c 0a 20 20 73 71 6c 69 74  ab *tab,.  sqlit
f730: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
f740: 49 64 78 49 6e 66 6f 0a 29 7b 0a 20 20 69 6e 74  IdxInfo.){.  int
f750: 20 69 3b 0a 20 20 69 6e 74 20 6a 73 6f 6e 49 64   i;.  int jsonId
f760: 78 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 72 6f  x = -1;.  int ro
f770: 6f 74 49 64 78 20 3d 20 2d 31 3b 0a 20 20 63 6f  otIdx = -1;.  co
f780: 6e 73 74 20 73 74 72 75 63 74 20 73 71 6c 69 74  nst struct sqlit
f790: 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
f7a0: 69 6e 74 20 2a 70 43 6f 6e 73 74 72 61 69 6e 74  int *pConstraint
f7b0: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
f7c0: 4d 28 74 61 62 29 3b 0a 20 20 70 43 6f 6e 73 74  M(tab);.  pConst
f7d0: 72 61 69 6e 74 20 3d 20 70 49 64 78 49 6e 66 6f  raint = pIdxInfo
f7e0: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20  ->aConstraint;. 
f7f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
f800: 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
f810: 74 3b 20 69 2b 2b 2c 20 70 43 6f 6e 73 74 72 61  t; i++, pConstra
f820: 69 6e 74 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  int++){.    if( 
f830: 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 75 73 61  pConstraint->usa
f840: 62 6c 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ble==0 ) continu
f850: 65 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 73  e;.    if( pCons
f860: 74 72 61 69 6e 74 2d 3e 6f 70 21 3d 53 51 4c 49  traint->op!=SQLI
f870: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
f880: 49 4e 54 5f 45 51 20 29 20 63 6f 6e 74 69 6e 75  INT_EQ ) continu
f890: 65 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70  e;.    switch( p
f8a0: 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 69 43 6f 6c  Constraint->iCol
f8b0: 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 63 61 73  umn ){.      cas
f8c0: 65 20 4a 45 41 43 48 5f 4a 53 4f 4e 3a 20 20 20  e JEACH_JSON:   
f8d0: 6a 73 6f 6e 49 64 78 20 3d 20 69 3b 20 20 20 20  jsonIdx = i;    
f8e0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
f8f0: 65 20 4a 45 41 43 48 5f 52 4f 4f 54 3a 20 20 20  e JEACH_ROOT:   
f900: 72 6f 6f 74 49 64 78 20 3d 20 69 3b 20 20 20 20  rootIdx = i;    
f910: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 64 65 66  break;.      def
f920: 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20  ault:           
f930: 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 20 20 20 20 20  /* no-op */     
f940: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
f950: 0a 20 20 69 66 28 20 6a 73 6f 6e 49 64 78 3c 30  .  if( jsonIdx<0
f960: 20 29 7b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   ){.    pIdxInfo
f970: 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20  ->idxNum = 0;.  
f980: 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69    pIdxInfo->esti
f990: 6d 61 74 65 64 43 6f 73 74 20 3d 20 31 65 39 39  matedCost = 1e99
f9a0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
f9b0: 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
f9c0: 65 64 43 6f 73 74 20 3d 20 31 2e 30 3b 0a 20 20  edCost = 1.0;.  
f9d0: 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e    pIdxInfo->aCon
f9e0: 73 74 72 61 69 6e 74 55 73 61 67 65 5b 6a 73 6f  straintUsage[jso
f9f0: 6e 49 64 78 5d 2e 61 72 67 76 49 6e 64 65 78 20  nIdx].argvIndex 
fa00: 3d 20 31 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  = 1;.    pIdxInf
fa10: 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
fa20: 61 67 65 5b 6a 73 6f 6e 49 64 78 5d 2e 6f 6d 69  age[jsonIdx].omi
fa30: 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 72  t = 1;.    if( r
fa40: 6f 6f 74 49 64 78 3c 30 20 29 7b 0a 20 20 20 20  ootIdx<0 ){.    
fa50: 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e    pIdxInfo->idxN
fa60: 75 6d 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  um = 1;.    }els
fa70: 65 7b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66  e{.      pIdxInf
fa80: 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
fa90: 61 67 65 5b 72 6f 6f 74 49 64 78 5d 2e 61 72 67  age[rootIdx].arg
faa0: 76 49 6e 64 65 78 20 3d 20 32 3b 0a 20 20 20 20  vIndex = 2;.    
fab0: 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e    pIdxInfo->aCon
fac0: 73 74 72 61 69 6e 74 55 73 61 67 65 5b 72 6f 6f  straintUsage[roo
fad0: 74 49 64 78 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a  tIdx].omit = 1;.
fae0: 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e        pIdxInfo->
faf0: 69 64 78 4e 75 6d 20 3d 20 33 3b 0a 20 20 20 20  idxNum = 3;.    
fb00: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
fb10: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
fb20: 53 74 61 72 74 20 61 20 73 65 61 72 63 68 20 6f  Start a search o
fb30: 6e 20 61 20 6e 65 77 20 4a 53 4f 4e 20 73 74 72  n a new JSON str
fb40: 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ing */.static in
fb50: 74 20 6a 73 6f 6e 45 61 63 68 46 69 6c 74 65 72  t jsonEachFilter
fb60: 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  (.  sqlite3_vtab
fb70: 5f 63 75 72 73 6f 72 20 2a 63 75 72 2c 0a 20 20  _cursor *cur,.  
fb80: 69 6e 74 20 69 64 78 4e 75 6d 2c 20 63 6f 6e 73  int idxNum, cons
fb90: 74 20 63 68 61 72 20 2a 69 64 78 53 74 72 2c 0a  t char *idxStr,.
fba0: 20 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69    int argc, sqli
fbb0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
fbc0: 0a 29 7b 0a 20 20 4a 73 6f 6e 45 61 63 68 43 75  .){.  JsonEachCu
fbd0: 72 73 6f 72 20 2a 70 20 3d 20 28 4a 73 6f 6e 45  rsor *p = (JsonE
fbe0: 61 63 68 43 75 72 73 6f 72 2a 29 63 75 72 3b 0a  achCursor*)cur;.
fbf0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
fc00: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
fc10: 52 6f 6f 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Root = 0;.  sqli
fc20: 74 65 33 5f 69 6e 74 36 34 20 6e 3b 0a 0a 20 20  te3_int64 n;..  
fc30: 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 69 64 78  UNUSED_PARAM(idx
fc40: 53 74 72 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  Str);.  UNUSED_P
fc50: 41 52 41 4d 28 61 72 67 63 29 3b 0a 20 20 6a 73  ARAM(argc);.  js
fc60: 6f 6e 45 61 63 68 43 75 72 73 6f 72 52 65 73 65  onEachCursorRese
fc70: 74 28 70 29 3b 0a 20 20 69 66 28 20 69 64 78 4e  t(p);.  if( idxN
fc80: 75 6d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  um==0 ) return S
fc90: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7a 20 3d 20  QLITE_OK;.  z = 
fca0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
fcb0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
fcc0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20  argv[0]);.  if( 
fcd0: 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  z==0 ) return SQ
fce0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6e 20 3d 20 73  LITE_OK;.  n = s
fcf0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
fd00: 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 70  es(argv[0]);.  p
fd10: 2d 3e 7a 4a 73 6f 6e 20 3d 20 73 71 6c 69 74 65  ->zJson = sqlite
fd20: 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 6e 2b 31 20  3_malloc64( n+1 
fd30: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 4a 73 6f  );.  if( p->zJso
fd40: 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  n==0 ) return SQ
fd50: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65  LITE_NOMEM;.  me
fd60: 6d 63 70 79 28 70 2d 3e 7a 4a 73 6f 6e 2c 20 7a  mcpy(p->zJson, z
fd70: 2c 20 28 73 69 7a 65 5f 74 29 6e 2b 31 29 3b 0a  , (size_t)n+1);.
fd80: 20 20 69 66 28 20 6a 73 6f 6e 50 61 72 73 65 28    if( jsonParse(
fd90: 26 70 2d 3e 73 50 61 72 73 65 2c 20 30 2c 20 70  &p->sParse, 0, p
fda0: 2d 3e 7a 4a 73 6f 6e 29 20 29 7b 0a 20 20 20 20  ->zJson) ){.    
fdb0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
fdc0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 69 66 28 20 70  NOMEM;.    if( p
fdd0: 2d 3e 73 50 61 72 73 65 2e 6f 6f 6d 3d 3d 30 20  ->sParse.oom==0 
fde0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
fdf0: 5f 66 72 65 65 28 63 75 72 2d 3e 70 56 74 61 62  _free(cur->pVtab
fe00: 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
fe10: 20 20 63 75 72 2d 3e 70 56 74 61 62 2d 3e 7a 45    cur->pVtab->zE
fe20: 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
fe30: 6d 70 72 69 6e 74 66 28 22 6d 61 6c 66 6f 72 6d  mprintf("malform
fe40: 65 64 20 4a 53 4f 4e 22 29 3b 0a 20 20 20 20 20  ed JSON");.     
fe50: 20 69 66 28 20 63 75 72 2d 3e 70 56 74 61 62 2d   if( cur->pVtab-
fe60: 3e 7a 45 72 72 4d 73 67 20 29 20 72 63 20 3d 20  >zErrMsg ) rc = 
fe70: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
fe80: 20 20 7d 0a 20 20 20 20 6a 73 6f 6e 45 61 63 68    }.    jsonEach
fe90: 43 75 72 73 6f 72 52 65 73 65 74 28 70 29 3b 0a  CursorReset(p);.
fea0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
feb0: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 62 52   }else if( p->bR
fec0: 65 63 75 72 73 69 76 65 20 26 26 20 6a 73 6f 6e  ecursive && json
fed0: 50 61 72 73 65 46 69 6e 64 50 61 72 65 6e 74 73  ParseFindParents
fee0: 28 26 70 2d 3e 73 50 61 72 73 65 29 20 29 7b 0a  (&p->sParse) ){.
fef0: 20 20 20 20 6a 73 6f 6e 45 61 63 68 43 75 72 73      jsonEachCurs
ff00: 6f 72 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20  orReset(p);.    
ff10: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
ff20: 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  MEM;.  }else{.  
ff30: 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64    JsonNode *pNod
ff40: 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 69  e = 0;.    if( i
ff50: 64 78 4e 75 6d 3d 3d 33 20 29 7b 0a 20 20 20 20  dxNum==3 ){.    
ff60: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
ff70: 72 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 52  rr = 0;.      zR
ff80: 6f 6f 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  oot = (const cha
ff90: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
ffa0: 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a  _text(argv[1]);.
ffb0: 20 20 20 20 20 20 69 66 28 20 7a 52 6f 6f 74 3d        if( zRoot=
ffc0: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
ffd0: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 6e 20 3d  TE_OK;.      n =
ffe0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
fff0: 79 74 65 73 28 61 72 67 76 5b 31 5d 29 3b 0a 20  ytes(argv[1]);. 
10000 20 20 20 20 20 70 2d 3e 7a 52 6f 6f 74 20 3d 20       p->zRoot = 
10010 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
10020 28 20 6e 2b 31 20 29 3b 0a 20 20 20 20 20 20 69  ( n+1 );.      i
10030 66 28 20 70 2d 3e 7a 52 6f 6f 74 3d 3d 30 20 29  f( p->zRoot==0 )
10040 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
10050 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 6d 65 6d 63  OMEM;.      memc
10060 70 79 28 70 2d 3e 7a 52 6f 6f 74 2c 20 7a 52 6f  py(p->zRoot, zRo
10070 6f 74 2c 20 28 73 69 7a 65 5f 74 29 6e 2b 31 29  ot, (size_t)n+1)
10080 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52 6f 6f  ;.      if( zRoo
10090 74 5b 30 5d 21 3d 27 24 27 20 29 7b 0a 20 20 20  t[0]!='$' ){.   
100a0 20 20 20 20 20 7a 45 72 72 20 3d 20 7a 52 6f 6f       zErr = zRoo
100b0 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
100c0 20 20 20 20 20 20 20 20 70 4e 6f 64 65 20 3d 20          pNode = 
100d0 6a 73 6f 6e 4c 6f 6f 6b 75 70 53 74 65 70 28 26  jsonLookupStep(&
100e0 70 2d 3e 73 50 61 72 73 65 2c 20 30 2c 20 70 2d  p->sParse, 0, p-
100f0 3e 7a 52 6f 6f 74 2b 31 2c 20 30 2c 20 26 7a 45  >zRoot+1, 0, &zE
10100 72 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rr);.      }.   
10110 20 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20     if( zErr ){. 
10120 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
10130 72 65 65 28 63 75 72 2d 3e 70 56 74 61 62 2d 3e  ree(cur->pVtab->
10140 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
10150 20 20 63 75 72 2d 3e 70 56 74 61 62 2d 3e 7a 45    cur->pVtab->zE
10160 72 72 4d 73 67 20 3d 20 6a 73 6f 6e 50 61 74 68  rrMsg = jsonPath
10170 53 79 6e 74 61 78 45 72 72 6f 72 28 7a 45 72 72  SyntaxError(zErr
10180 29 3b 0a 20 20 20 20 20 20 20 20 6a 73 6f 6e 45  );.        jsonE
10190 61 63 68 43 75 72 73 6f 72 52 65 73 65 74 28 70  achCursorReset(p
101a0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
101b0 6e 20 63 75 72 2d 3e 70 56 74 61 62 2d 3e 7a 45  n cur->pVtab->zE
101c0 72 72 4d 73 67 20 3f 20 53 51 4c 49 54 45 5f 45  rrMsg ? SQLITE_E
101d0 52 52 4f 52 20 3a 20 53 51 4c 49 54 45 5f 4e 4f  RROR : SQLITE_NO
101e0 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  MEM;.      }else
101f0 20 69 66 28 20 70 4e 6f 64 65 3d 3d 30 20 29 7b   if( pNode==0 ){
10200 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
10210 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
10220 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
10230 20 20 20 20 70 4e 6f 64 65 20 3d 20 70 2d 3e 73      pNode = p->s
10240 50 61 72 73 65 2e 61 4e 6f 64 65 3b 0a 20 20 20  Parse.aNode;.   
10250 20 7d 0a 20 20 20 20 70 2d 3e 69 42 65 67 69 6e   }.    p->iBegin
10260 20 3d 20 70 2d 3e 69 20 3d 20 28 69 6e 74 29 28   = p->i = (int)(
10270 70 4e 6f 64 65 20 2d 20 70 2d 3e 73 50 61 72 73  pNode - p->sPars
10280 65 2e 61 4e 6f 64 65 29 3b 0a 20 20 20 20 70 2d  e.aNode);.    p-
10290 3e 65 54 79 70 65 20 3d 20 70 4e 6f 64 65 2d 3e  >eType = pNode->
102a0 65 54 79 70 65 3b 0a 20 20 20 20 69 66 28 20 70  eType;.    if( p
102b0 2d 3e 65 54 79 70 65 3e 3d 4a 53 4f 4e 5f 41 52  ->eType>=JSON_AR
102c0 52 41 59 20 29 7b 0a 20 20 20 20 20 20 70 4e 6f  RAY ){.      pNo
102d0 64 65 2d 3e 75 2e 69 4b 65 79 20 3d 20 30 3b 0a  de->u.iKey = 0;.
102e0 20 20 20 20 20 20 70 2d 3e 69 45 6e 64 20 3d 20        p->iEnd = 
102f0 70 2d 3e 69 20 2b 20 70 4e 6f 64 65 2d 3e 6e 20  p->i + pNode->n 
10300 2b 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70  + 1;.      if( p
10310 2d 3e 62 52 65 63 75 72 73 69 76 65 20 29 7b 0a  ->bRecursive ){.
10320 20 20 20 20 20 20 20 20 70 2d 3e 65 54 79 70 65          p->eType
10330 20 3d 20 70 2d 3e 73 50 61 72 73 65 2e 61 4e 6f   = p->sParse.aNo
10340 64 65 5b 70 2d 3e 73 50 61 72 73 65 2e 61 55 70  de[p->sParse.aUp
10350 5b 70 2d 3e 69 5d 5d 2e 65 54 79 70 65 3b 0a 20  [p->i]].eType;. 
10360 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 3e         if( p->i>
10370 30 20 26 26 20 28 70 2d 3e 73 50 61 72 73 65 2e  0 && (p->sParse.
10380 61 4e 6f 64 65 5b 70 2d 3e 69 2d 31 5d 2e 6a 6e  aNode[p->i-1].jn
10390 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 4c 41  Flags & JNODE_LA
103a0 42 45 4c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  BEL)!=0 ){.     
103b0 20 20 20 20 20 70 2d 3e 69 2d 2d 3b 0a 20 20 20       p->i--;.   
103c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
103d0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69  se{.        p->i
103e0 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
103f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e  }else{.      p->
10400 69 45 6e 64 20 3d 20 70 2d 3e 69 2b 31 3b 0a 20  iEnd = p->i+1;. 
10410 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
10420 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
10430 2f 2a 20 54 68 65 20 6d 65 74 68 6f 64 73 20 6f  /* The methods o
10440 66 20 74 68 65 20 6a 73 6f 6e 5f 65 61 63 68 20  f the json_each 
10450 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f  virtual table */
10460 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f  .static sqlite3_
10470 6d 6f 64 75 6c 65 20 6a 73 6f 6e 45 61 63 68 4d  module jsonEachM
10480 6f 64 75 6c 65 20 3d 20 7b 0a 20 20 30 2c 20 20  odule = {.  0,  
10490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104a0 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
104b0 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  on */.  0,      
104c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104d0 20 20 20 2f 2a 20 78 43 72 65 61 74 65 20 2a 2f     /* xCreate */
104e0 0a 20 20 6a 73 6f 6e 45 61 63 68 43 6f 6e 6e 65  .  jsonEachConne
104f0 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ct,           /*
10500 20 78 43 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 6a   xConnect */.  j
10510 73 6f 6e 45 61 63 68 42 65 73 74 49 6e 64 65 78  sonEachBestIndex
10520 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78 42 65  ,         /* xBe
10530 73 74 49 6e 64 65 78 20 2a 2f 0a 20 20 6a 73 6f  stIndex */.  jso
10540 6e 45 61 63 68 44 69 73 63 6f 6e 6e 65 63 74 2c  nEachDisconnect,
10550 20 20 20 20 20 20 20 20 2f 2a 20 78 44 69 73 63          /* xDisc
10560 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 30 2c 20 20  onnect */.  0,  
10570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10580 20 20 20 20 20 20 20 2f 2a 20 78 44 65 73 74 72         /* xDestr
10590 6f 79 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68  oy */.  jsonEach
105a0 4f 70 65 6e 45 61 63 68 2c 20 20 20 20 20 20 20  OpenEach,       
105b0 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2d 20 6f 70     /* xOpen - op
105c0 65 6e 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20  en a cursor */. 
105d0 20 6a 73 6f 6e 45 61 63 68 43 6c 6f 73 65 2c 20   jsonEachClose, 
105e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
105f0 43 6c 6f 73 65 20 2d 20 63 6c 6f 73 65 20 61 20  Close - close a 
10600 63 75 72 73 6f 72 20 2a 2f 0a 20 20 6a 73 6f 6e  cursor */.  json
10610 45 61 63 68 46 69 6c 74 65 72 2c 20 20 20 20 20  EachFilter,     
10620 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 74 65         /* xFilte
10630 72 20 2d 20 63 6f 6e 66 69 67 75 72 65 20 73 63  r - configure sc
10640 61 6e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  an constraints *
10650 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 4e 65 78 74  /.  jsonEachNext
10660 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
10670 2a 20 78 4e 65 78 74 20 2d 20 61 64 76 61 6e 63  * xNext - advanc
10680 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  e a cursor */.  
10690 6a 73 6f 6e 45 61 63 68 45 6f 66 2c 20 20 20 20  jsonEachEof,    
106a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 45             /* xE
106b0 6f 66 20 2d 20 63 68 65 63 6b 20 66 6f 72 20 65  of - check for e
106c0 6e 64 20 6f 66 20 73 63 61 6e 20 2a 2f 0a 20 20  nd of scan */.  
106d0 6a 73 6f 6e 45 61 63 68 43 6f 6c 75 6d 6e 2c 20  jsonEachColumn, 
106e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
106f0 6f 6c 75 6d 6e 20 2d 20 72 65 61 64 20 64 61 74  olumn - read dat
10700 61 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 52  a */.  jsonEachR
10710 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20 20 20  owid,           
10720 20 20 2f 2a 20 78 52 6f 77 69 64 20 2d 20 72 65    /* xRowid - re
10730 61 64 20 64 61 74 61 20 2a 2f 0a 20 20 30 2c 20  ad data */.  0, 
10740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10750 20 20 20 20 20 20 20 20 2f 2a 20 78 55 70 64 61          /* xUpda
10760 74 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  te */.  0,      
10770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10780 20 20 20 2f 2a 20 78 42 65 67 69 6e 20 2a 2f 0a     /* xBegin */.
10790 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
107a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
107b0 78 53 79 6e 63 20 2a 2f 0a 20 20 30 2c 20 20 20  xSync */.  0,   
107c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107d0 20 20 20 20 20 20 2f 2a 20 78 43 6f 6d 6d 69 74        /* xCommit
107e0 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
107f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10800 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 20 2a 2f   /* xRollback */
10810 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
10820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10830 20 78 46 69 6e 64 4d 65 74 68 6f 64 20 2a 2f 0a   xFindMethod */.
10840 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
10850 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10860 78 52 65 6e 61 6d 65 20 2a 2f 0a 20 20 30 2c 20  xRename */.  0, 
10870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10880 20 20 20 20 20 20 20 20 2f 2a 20 78 53 61 76 65          /* xSave
10890 70 6f 69 6e 74 20 2a 2f 0a 20 20 30 2c 20 20 20  point */.  0,   
108a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
108b0 20 20 20 20 20 20 2f 2a 20 78 52 65 6c 65 61 73        /* xReleas
108c0 65 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20  e */.  0        
108d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
108e0 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 54 6f    /* xRollbackTo
108f0 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 20 6d   */.};../* The m
10900 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20 6a 73  ethods of the js
10910 6f 6e 5f 74 72 65 65 20 76 69 72 74 75 61 6c 20  on_tree virtual 
10920 74 61 62 6c 65 2e 20 2a 2f 0a 73 74 61 74 69 63  table. */.static
10930 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20   sqlite3_module 
10940 6a 73 6f 6e 54 72 65 65 4d 6f 64 75 6c 65 20 3d  jsonTreeModule =
10950 20 7b 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20   {.  0,         
10960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10970 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20  /* iVersion */. 
10980 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
10990 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
109a0 43 72 65 61 74 65 20 2a 2f 0a 20 20 6a 73 6f 6e  Create */.  json
109b0 45 61 63 68 43 6f 6e 6e 65 63 74 2c 20 20 20 20  EachConnect,    
109c0 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6e 6e 65         /* xConne
109d0 63 74 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68  ct */.  jsonEach
109e0 42 65 73 74 49 6e 64 65 78 2c 20 20 20 20 20 20  BestIndex,      
109f0 20 20 20 2f 2a 20 78 42 65 73 74 49 6e 64 65 78     /* xBestIndex
10a00 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 44 69   */.  jsonEachDi
10a10 73 63 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20 20  sconnect,       
10a20 20 2f 2a 20 78 44 69 73 63 6f 6e 6e 65 63 74 20   /* xDisconnect 
10a30 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
10a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a50 2f 2a 20 78 44 65 73 74 72 6f 79 20 2a 2f 0a 20  /* xDestroy */. 
10a60 20 6a 73 6f 6e 45 61 63 68 4f 70 65 6e 54 72 65   jsonEachOpenTre
10a70 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  e,          /* x
10a80 4f 70 65 6e 20 2d 20 6f 70 65 6e 20 61 20 63 75  Open - open a cu
10a90 72 73 6f 72 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61  rsor */.  jsonEa
10aa0 63 68 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  chClose,        
10ab0 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2d       /* xClose -
10ac0 20 63 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 20   close a cursor 
10ad0 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 46 69 6c  */.  jsonEachFil
10ae0 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ter,            
10af0 2f 2a 20 78 46 69 6c 74 65 72 20 2d 20 63 6f 6e  /* xFilter - con
10b00 66 69 67 75 72 65 20 73 63 61 6e 20 63 6f 6e 73  figure scan cons
10b10 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 6a 73 6f  traints */.  jso
10b20 6e 45 61 63 68 4e 65 78 74 2c 20 20 20 20 20 20  nEachNext,      
10b30 20 20 20 20 20 20 20 20 2f 2a 20 78 4e 65 78 74          /* xNext
10b40 20 2d 20 61 64 76 61 6e 63 65 20 61 20 63 75 72   - advance a cur
10b50 73 6f 72 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63  sor */.  jsonEac
10b60 68 45 6f 66 2c 20 20 20 20 20 20 20 20 20 20 20  hEof,           
10b70 20 20 20 20 2f 2a 20 78 45 6f 66 20 2d 20 63 68      /* xEof - ch
10b80 65 63 6b 20 66 6f 72 20 65 6e 64 20 6f 66 20 73  eck for end of s
10b90 63 61 6e 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63  can */.  jsonEac
10ba0 68 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20  hColumn,        
10bb0 20 20 20 20 2f 2a 20 78 43 6f 6c 75 6d 6e 20 2d      /* xColumn -
10bc0 20 72 65 61 64 20 64 61 74 61 20 2a 2f 0a 20 20   read data */.  
10bd0 6a 73 6f 6e 45 61 63 68 52 6f 77 69 64 2c 20 20  jsonEachRowid,  
10be0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
10bf0 6f 77 69 64 20 2d 20 72 65 61 64 20 64 61 74 61  owid - read data
10c00 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
10c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c20 20 2f 2a 20 78 55 70 64 61 74 65 20 2a 2f 0a 20   /* xUpdate */. 
10c30 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
10c40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
10c50 42 65 67 69 6e 20 2a 2f 0a 20 20 30 2c 20 20 20  Begin */.  0,   
10c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c70 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a        /* xSync *
10c80 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
10c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10ca0 2a 20 78 43 6f 6d 6d 69 74 20 2a 2f 0a 20 20 30  * xCommit */.  0
10cb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10cc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f            /* xRo
10cd0 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 30 2c 20 20  llback */.  0,  
10ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cf0 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6e 64 4d         /* xFindM
10d00 65 74 68 6f 64 20 2a 2f 0a 20 20 30 2c 20 20 20  ethod */.  0,   
10d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d20 20 20 20 20 20 20 2f 2a 20 78 52 65 6e 61 6d 65        /* xRename
10d30 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
10d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d50 20 2f 2a 20 78 53 61 76 65 70 6f 69 6e 74 20 2a   /* xSavepoint *
10d60 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
10d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10d80 2a 20 78 52 65 6c 65 61 73 65 20 2a 2f 0a 20 20  * xRelease */.  
10d90 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
10da0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
10db0 6f 6c 6c 62 61 63 6b 54 6f 20 2a 2f 0a 7d 3b 0a  ollbackTo */.};.
10dc0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
10dd0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
10de0 4c 45 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  LE */../********
10df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e30 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ****.** The foll
10e40 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61  owing routines a
10e50 72 65 20 74 68 65 20 6f 6e 6c 79 20 70 75 62 6c  re the only publ
10e60 69 63 61 6c 6c 79 20 76 69 73 69 62 6c 65 20 69  ically visible i
10e70 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20 74 68  dentifiers in th
10e80 69 73 0a 2a 2a 20 66 69 6c 65 2e 20 20 43 61 6c  is.** file.  Cal
10e90 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  l the following 
10ea0 72 6f 75 74 69 6e 65 73 20 69 6e 20 6f 72 64 65  routines in orde
10eb0 72 20 74 6f 20 72 65 67 69 73 74 65 72 20 74 68  r to register th
10ec0 65 20 76 61 72 69 6f 75 73 20 53 51 4c 0a 2a 2a  e various SQL.**
10ed0 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 74   functions and t
10ee0 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
10ef0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
10f00 74 68 69 73 20 66 69 6c 65 2e 0a 2a 2a 2a 2a 2a  this file..*****
10f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f50 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 69 6e 74 20 73 71  *******/..int sq
10f60 6c 69 74 65 33 4a 73 6f 6e 31 49 6e 69 74 28 73  lite3Json1Init(s
10f70 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
10f80 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
10f90 4b 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  K;.  unsigned in
10fa0 74 20 69 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  t i;.  static co
10fb0 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20  nst struct {.   
10fc0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
10fd0 61 6d 65 3b 0a 20 20 20 20 20 69 6e 74 20 6e 41  ame;.     int nA
10fe0 72 67 3b 0a 20 20 20 20 20 69 6e 74 20 66 6c 61  rg;.     int fla
10ff0 67 3b 0a 20 20 20 20 20 76 6f 69 64 20 28 2a 78  g;.     void (*x
11000 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f  Func)(sqlite3_co
11010 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
11020 65 33 5f 76 61 6c 75 65 2a 2a 29 3b 0a 20 20 7d  e3_value**);.  }
11030 20 61 46 75 6e 63 5b 5d 20 3d 20 7b 0a 20 20 20   aFunc[] = {.   
11040 20 7b 20 22 6a 73 6f 6e 22 2c 20 20 20 20 20 20   { "json",      
11050 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c             1, 0,
11060 20 20 20 6a 73 6f 6e 52 65 6d 6f 76 65 46 75 6e     jsonRemoveFun
11070 63 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  c        },.    
11080 7b 20 22 6a 73 6f 6e 5f 61 72 72 61 79 22 2c 20  { "json_array", 
11090 20 20 20 20 20 20 20 20 20 2d 31 2c 20 30 2c 20           -1, 0, 
110a0 20 20 6a 73 6f 6e 41 72 72 61 79 46 75 6e 63 20    jsonArrayFunc 
110b0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
110c0 20 22 6a 73 6f 6e 5f 61 72 72 61 79 5f 6c 65 6e   "json_array_len
110d0 67 74 68 22 2c 20 20 20 20 31 2c 20 30 2c 20 20  gth",    1, 0,  
110e0 20 6a 73 6f 6e 41 72 72 61 79 4c 65 6e 67 74 68   jsonArrayLength
110f0 46 75 6e 63 20 20 20 7d 2c 0a 20 20 20 20 7b 20  Func   },.    { 
11100 22 6a 73 6f 6e 5f 61 72 72 61 79 5f 6c 65 6e 67  "json_array_leng
11110 74 68 22 2c 20 20 20 20 32 2c 20 30 2c 20 20 20  th",    2, 0,   
11120 6a 73 6f 6e 41 72 72 61 79 4c 65 6e 67 74 68 46  jsonArrayLengthF
11130 75 6e 63 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22  unc   },.    { "
11140 6a 73 6f 6e 5f 65 78 74 72 61 63 74 22 2c 20 20  json_extract",  
11150 20 20 20 20 20 20 2d 31 2c 20 30 2c 20 20 20 6a        -1, 0,   j
11160 73 6f 6e 45 78 74 72 61 63 74 46 75 6e 63 20 20  sonExtractFunc  
11170 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a       },.    { "j
11180 73 6f 6e 5f 69 6e 73 65 72 74 22 2c 20 20 20 20  son_insert",    
11190 20 20 20 20 20 2d 31 2c 20 30 2c 20 20 20 6a 73       -1, 0,   js
111a0 6f 6e 53 65 74 46 75 6e 63 20 20 20 20 20 20 20  onSetFunc       
111b0 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73      },.    { "js
111c0 6f 6e 5f 6f 62 6a 65 63 74 22 2c 20 20 20 20 20  on_object",     
111d0 20 20 20 20 2d 31 2c 20 30 2c 20 20 20 6a 73 6f      -1, 0,   jso
111e0 6e 4f 62 6a 65 63 74 46 75 6e 63 20 20 20 20 20  nObjectFunc     
111f0 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f     },.    { "jso
11200 6e 5f 70 61 74 63 68 22 2c 20 20 20 20 20 20 20  n_patch",       
11210 20 20 20 20 32 2c 20 30 2c 20 20 20 6a 73 6f 6e      2, 0,   json
11220 50 61 74 63 68 46 75 6e 63 20 20 20 20 20 20 20  PatchFunc       
11230 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e    },.    { "json
11240 5f 71 75 6f 74 65 22 2c 20 20 20 20 20 20 20 20  _quote",        
11250 20 20 20 31 2c 20 30 2c 20 20 20 6a 73 6f 6e 51     1, 0,   jsonQ
11260 75 6f 74 65 46 75 6e 63 20 20 20 20 20 20 20 20  uoteFunc        
11270 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f   },.    { "json_
11280 72 65 6d 6f 76 65 22 2c 20 20 20 20 20 20 20 20  remove",        
11290 20 2d 31 2c 20 30 2c 20 20 20 6a 73 6f 6e 52 65   -1, 0,   jsonRe
112a0 6d 6f 76 65 46 75 6e 63 20 20 20 20 20 20 20 20  moveFunc        
112b0 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 72  },.    { "json_r
112c0 65 70 6c 61 63 65 22 2c 20 20 20 20 20 20 20 20  eplace",        
112d0 2d 31 2c 20 30 2c 20 20 20 6a 73 6f 6e 52 65 70  -1, 0,   jsonRep
112e0 6c 61 63 65 46 75 6e 63 20 20 20 20 20 20 20 7d  laceFunc       }
112f0 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 73 65  ,.    { "json_se
11300 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 2d  t",            -
11310 31 2c 20 31 2c 20 20 20 6a 73 6f 6e 53 65 74 46  1, 1,   jsonSetF
11320 75 6e 63 20 20 20 20 20 20 20 20 20 20 20 7d 2c  unc           },
11330 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 74 79 70  .    { "json_typ
11340 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 31  e",            1
11350 2c 20 30 2c 20 20 20 6a 73 6f 6e 54 79 70 65 46  , 0,   jsonTypeF
11360 75 6e 63 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  unc          },.
11370 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 74 79 70 65      { "json_type
11380 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 32 2c  ",            2,
11390 20 30 2c 20 20 20 6a 73 6f 6e 54 79 70 65 46 75   0,   jsonTypeFu
113a0 6e 63 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  nc          },. 
113b0 20 20 20 7b 20 22 6a 73 6f 6e 5f 76 61 6c 69 64     { "json_valid
113c0 22 2c 20 20 20 20 20 20 20 20 20 20 20 31 2c 20  ",           1, 
113d0 30 2c 20 20 20 6a 73 6f 6e 56 61 6c 69 64 46 75  0,   jsonValidFu
113e0 6e 63 20 20 20 20 20 20 20 20 20 7d 2c 0a 0a 23  nc         },..#
113f0 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  if SQLITE_DEBUG.
11400 20 20 20 20 2f 2a 20 44 45 42 55 47 20 61 6e 64      /* DEBUG and
11410 20 54 45 53 54 49 4e 47 20 66 75 6e 63 74 69 6f   TESTING functio
11420 6e 73 20 2a 2f 0a 20 20 20 20 7b 20 22 6a 73 6f  ns */.    { "jso
11430 6e 5f 70 61 72 73 65 22 2c 20 20 20 20 20 20 20  n_parse",       
11440 20 20 20 20 31 2c 20 30 2c 20 20 20 6a 73 6f 6e      1, 0,   json
11450 50 61 72 73 65 46 75 6e 63 20 20 20 20 20 20 20  ParseFunc       
11460 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e    },.    { "json
11470 5f 74 65 73 74 31 22 2c 20 20 20 20 20 20 20 20  _test1",        
11480 20 20 20 31 2c 20 30 2c 20 20 20 6a 73 6f 6e 54     1, 0,   jsonT
11490 65 73 74 31 46 75 6e 63 20 20 20 20 20 20 20 20  est1Func        
114a0 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 7d 3b 0a   },.#endif.  };.
114b0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
114c0 74 72 75 63 74 20 7b 0a 20 20 20 20 20 63 6f 6e  truct {.     con
114d0 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  st char *zName;.
114e0 20 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20       int nArg;. 
114f0 20 20 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70      void (*xStep
11500 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
11510 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
11520 61 6c 75 65 2a 2a 29 3b 0a 20 20 20 20 20 76 6f  alue**);.     vo
11530 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c  id (*xFinal)(sql
11540 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 3b 0a  ite3_context*);.
11550 20 20 20 20 20 76 6f 69 64 20 28 2a 78 56 61 6c       void (*xVal
11560 75 65 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ue)(sqlite3_cont
11570 65 78 74 2a 29 3b 0a 20 20 7d 20 61 41 67 67 5b  ext*);.  } aAgg[
11580 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 6a 73 6f  ] = {.    { "jso
11590 6e 5f 67 72 6f 75 70 5f 61 72 72 61 79 22 2c 20  n_group_array", 
115a0 20 20 20 20 31 2c 0a 20 20 20 20 20 20 6a 73 6f      1,.      jso
115b0 6e 41 72 72 61 79 53 74 65 70 2c 20 20 20 6a 73  nArrayStep,   js
115c0 6f 6e 41 72 72 61 79 46 69 6e 61 6c 2c 20 20 6a  onArrayFinal,  j
115d0 73 6f 6e 41 72 72 61 79 56 61 6c 75 65 20 20 7d  sonArrayValue  }
115e0 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 67 72  ,.    { "json_gr
115f0 6f 75 70 5f 6f 62 6a 65 63 74 22 2c 20 20 20 20  oup_object",    
11600 32 2c 0a 20 20 20 20 20 20 6a 73 6f 6e 4f 62 6a  2,.      jsonObj
11610 65 63 74 53 74 65 70 2c 20 20 6a 73 6f 6e 4f 62  ectStep,  jsonOb
11620 6a 65 63 74 46 69 6e 61 6c 2c 20 6a 73 6f 6e 4f  jectFinal, jsonO
11630 62 6a 65 63 74 56 61 6c 75 65 20 7d 2c 0a 20 20  bjectValue },.  
11640 7d 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  };.#ifndef SQLIT
11650 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
11660 42 4c 45 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  BLE.  static con
11670 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
11680 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
11690 6d 65 3b 0a 20 20 20 20 20 73 71 6c 69 74 65 33  me;.     sqlite3
116a0 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65  _module *pModule
116b0 3b 0a 20 20 7d 20 61 4d 6f 64 5b 5d 20 3d 20 7b  ;.  } aMod[] = {
116c0 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 65 61 63  .    { "json_eac
116d0 68 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 26  h",            &
116e0 6a 73 6f 6e 45 61 63 68 4d 6f 64 75 6c 65 20 20  jsonEachModule  
116f0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
11700 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 74 72 65 65      { "json_tree
11710 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 26 6a  ",            &j
11720 73 6f 6e 54 72 65 65 4d 6f 64 75 6c 65 20 20 20  sonTreeModule   
11730 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
11740 20 7d 3b 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72   };.#endif.  for
11750 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
11760 46 75 6e 63 29 2f 73 69 7a 65 6f 66 28 61 46 75  Func)/sizeof(aFu
11770 6e 63 5b 30 5d 29 20 26 26 20 72 63 3d 3d 53 51  nc[0]) && rc==SQ
11780 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20  LITE_OK; i++){. 
11790 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
117a0 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
117b0 64 62 2c 20 61 46 75 6e 63 5b 69 5d 2e 7a 4e 61  db, aFunc[i].zNa
117c0 6d 65 2c 20 61 46 75 6e 63 5b 69 5d 2e 6e 41 72  me, aFunc[i].nAr
117d0 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  g,.             
117e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117f0 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20      SQLITE_UTF8 
11800 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
11810 4e 49 53 54 49 43 2c 20 0a 20 20 20 20 20 20 20  NISTIC, .       
11820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11830 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
11840 29 26 61 46 75 6e 63 5b 69 5d 2e 66 6c 61 67 2c  )&aFunc[i].flag,
11850 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11870 20 20 61 46 75 6e 63 5b 69 5d 2e 78 46 75 6e 63    aFunc[i].xFunc
11880 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 66  , 0, 0);.  }.  f
11890 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
118a0 28 61 41 67 67 29 2f 73 69 7a 65 6f 66 28 61 41  (aAgg)/sizeof(aA
118b0 67 67 5b 30 5d 29 20 26 26 20 72 63 3d 3d 53 51  gg[0]) && rc==SQ
118c0 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20  LITE_OK; i++){. 
118d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
118e0 63 72 65 61 74 65 5f 77 69 6e 64 6f 77 5f 66 75  create_window_fu
118f0 6e 63 74 69 6f 6e 28 64 62 2c 20 61 41 67 67 5b  nction(db, aAgg[
11900 69 5d 2e 7a 4e 61 6d 65 2c 20 61 41 67 67 5b 69  i].zName, aAgg[i
11910 5d 2e 6e 41 72 67 2c 0a 20 20 20 20 20 20 20 20  ].nArg,.        
11920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11930 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
11940 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45  UTF8 | SQLITE_DE
11950 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a  TERMINISTIC, 0,.
11960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11980 20 61 41 67 67 5b 69 5d 2e 78 53 74 65 70 2c 20   aAgg[i].xStep, 
11990 61 41 67 67 5b 69 5d 2e 78 46 69 6e 61 6c 2c 0a  aAgg[i].xFinal,.
119a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119c0 20 61 41 67 67 5b 69 5d 2e 78 56 61 6c 75 65 2c   aAgg[i].xValue,
119d0 20 6a 73 6f 6e 47 72 6f 75 70 49 6e 76 65 72 73   jsonGroupInvers
119e0 65 2c 20 30 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  e, 0);.  }.#ifnd
119f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
11a00 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 66 6f  IRTUALTABLE.  fo
11a10 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
11a20 61 4d 6f 64 29 2f 73 69 7a 65 6f 66 28 61 4d 6f  aMod)/sizeof(aMo
11a30 64 5b 30 5d 29 20 26 26 20 72 63 3d 3d 53 51 4c  d[0]) && rc==SQL
11a40 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20  ITE_OK; i++){.  
11a50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
11a60 72 65 61 74 65 5f 6d 6f 64 75 6c 65 28 64 62 2c  reate_module(db,
11a70 20 61 4d 6f 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20   aMod[i].zName, 
11a80 61 4d 6f 64 5b 69 5d 2e 70 4d 6f 64 75 6c 65 2c  aMod[i].pModule,
11a90 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
11aa0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
11ab0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11ac0 43 4f 52 45 0a 23 69 66 64 65 66 20 5f 57 49 4e  CORE.#ifdef _WIN
11ad0 33 32 0a 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c  32.__declspec(dl
11ae0 6c 65 78 70 6f 72 74 29 0a 23 65 6e 64 69 66 0a  lexport).#endif.
11af0 69 6e 74 20 73 71 6c 69 74 65 33 5f 6a 73 6f 6e  int sqlite3_json
11b00 5f 69 6e 69 74 28 0a 20 20 73 71 6c 69 74 65 33  _init(.  sqlite3
11b10 20 2a 64 62 2c 20 0a 20 20 63 68 61 72 20 2a 2a   *db, .  char **
11b20 70 7a 45 72 72 4d 73 67 2c 20 0a 20 20 63 6f 6e  pzErrMsg, .  con
11b30 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72  st sqlite3_api_r
11b40 6f 75 74 69 6e 65 73 20 2a 70 41 70 69 0a 29 7b  outines *pApi.){
11b50 0a 20 20 53 51 4c 49 54 45 5f 45 58 54 45 4e 53  .  SQLITE_EXTENS
11b60 49 4f 4e 5f 49 4e 49 54 32 28 70 41 70 69 29 3b  ION_INIT2(pApi);
11b70 0a 20 20 28 76 6f 69 64 29 70 7a 45 72 72 4d 73  .  (void)pzErrMs
11b80 67 3b 20 20 2f 2a 20 55 6e 75 73 65 64 20 70 61  g;  /* Unused pa
11b90 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 72 65 74  rameter */.  ret
11ba0 75 72 6e 20 73 71 6c 69 74 65 33 4a 73 6f 6e 31  urn sqlite3Json1
11bb0 49 6e 69 74 28 64 62 29 3b 0a 7d 0a 23 65 6e 64  Init(db);.}.#end
11bc0 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  if.#endif /* !de
11bd0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 52  fined(SQLITE_COR
11be0 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  E) || defined(SQ
11bf0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4a 53 4f 4e  LITE_ENABLE_JSON
11c00 31 29 20 2a 2f 0a                                1) */.