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

Artifact 71ce4e39793b743fc7e4790bc3bab15598e95cab57ad8da4326fa640ae5e5310:


0000: 2f 2a 0a 2a 2a 20 32 30 31 35 2d 30 38 2d 31 32  /*.** 2015-08-12
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ****.**.** This 
0180: 53 51 4c 69 74 65 20 65 78 74 65 6e 73 69 6f 6e  SQLite extension
0190: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 4a 53 4f 4e   implements JSON
01a0: 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68 65   functions.  The
01b0: 20 69 6e 74 65 72 66 61 63 65 20 69 73 0a 2a 2a   interface is.**
01c0: 20 6d 6f 64 65 6c 65 64 20 61 66 74 65 72 20 4d   modeled after M
01d0: 79 53 51 4c 20 4a 53 4f 4e 20 66 75 6e 63 74 69  ySQL JSON functi
01e0: 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 68  ons:.**.**     h
01f0: 74 74 70 73 3a 2f 2f 64 65 76 2e 6d 79 73 71 6c  ttps://dev.mysql
0200: 2e 63 6f 6d 2f 64 6f 63 2f 72 65 66 6d 61 6e 2f  .com/doc/refman/
0210: 35 2e 37 2f 65 6e 2f 6a 73 6f 6e 2e 68 74 6d 6c  5.7/en/json.html
0220: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 74  .**.** For the t
0230: 69 6d 65 20 62 65 69 6e 67 2c 20 61 6c 6c 20 4a  ime being, all J
0240: 53 4f 4e 20 69 73 20 73 74 6f 72 65 64 20 61 73  SON is stored as
0250: 20 70 75 72 65 20 74 65 78 74 2e 20 20 28 57 65   pure text.  (We
0260: 20 6d 69 67 68 74 20 61 64 64 0a 2a 2a 20 61 20   might add.** a 
0270: 4a 53 4f 4e 42 20 74 79 70 65 20 69 6e 20 74 68  JSONB type in th
0280: 65 20 66 75 74 75 72 65 20 77 68 69 63 68 20 73  e future which s
0290: 74 6f 72 65 73 20 61 20 62 69 6e 61 72 79 20 65  tores a binary e
02a0: 6e 63 6f 64 69 6e 67 20 6f 66 20 4a 53 4f 4e 20  ncoding of JSON 
02b0: 69 6e 0a 2a 2a 20 61 20 42 4c 4f 42 2c 20 62 75  in.** a BLOB, bu
02c0: 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75  t there is no su
02d0: 70 70 6f 72 74 20 66 6f 72 20 4a 53 4f 4e 42 20  pport for JSONB 
02e0: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  in the current i
02f0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a  mplementation..*
0300: 2a 20 54 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74  * This implement
0310: 61 74 69 6f 6e 20 70 61 72 73 65 73 20 4a 53 4f  ation parses JSO
0320: 4e 20 74 65 78 74 20 61 74 20 32 35 30 20 4d 42  N text at 250 MB
0330: 2f 73 2c 20 73 6f 20 69 74 20 69 73 20 68 61 72  /s, so it is har
0340: 64 20 74 6f 20 73 65 65 0a 2a 2a 20 68 6f 77 20  d to see.** how 
0350: 4a 53 4f 4e 42 20 6d 69 67 68 74 20 69 6d 70 72  JSONB might impr
0360: 6f 76 65 20 6f 6e 20 74 68 61 74 2e 29 0a 2a 2f  ove on that.).*/
0370: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
0380: 4c 49 54 45 5f 43 4f 52 45 29 20 7c 7c 20 64 65  LITE_CORE) || de
0390: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
03a0: 42 4c 45 5f 4a 53 4f 4e 31 29 0a 23 69 66 20 21  BLE_JSON1).#if !
03b0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 49 4e  defined(SQLITEIN
03c0: 54 5f 48 29 0a 23 69 6e 63 6c 75 64 65 20 22 73  T_H).#include "s
03d0: 71 6c 69 74 65 33 65 78 74 2e 68 22 0a 23 65 6e  qlite3ext.h".#en
03e0: 64 69 66 0a 53 51 4c 49 54 45 5f 45 58 54 45 4e  dif.SQLITE_EXTEN
03f0: 53 49 4f 4e 5f 49 4e 49 54 31 0a 23 69 6e 63 6c  SION_INIT1.#incl
0400: 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23  ude <assert.h>.#
0410: 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e  include <string.
0420: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  h>.#include <std
0430: 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  lib.h>.#include 
0440: 3c 73 74 64 61 72 67 2e 68 3e 0a 0a 2f 2a 20 4d  <stdarg.h>../* M
0450: 61 72 6b 20 61 20 66 75 6e 63 74 69 6f 6e 20 70  ark a function p
0460: 61 72 61 6d 65 74 65 72 20 61 73 20 75 6e 75 73  arameter as unus
0470: 65 64 2c 20 74 6f 20 73 75 70 70 72 65 73 73 20  ed, to suppress 
0480: 6e 75 69 73 61 6e 63 65 20 63 6f 6d 70 69 6c 65  nuisance compile
0490: 72 0a 2a 2a 20 77 61 72 6e 69 6e 67 73 2e 20 2a  r.** warnings. *
04a0: 2f 0a 23 69 66 6e 64 65 66 20 55 4e 55 53 45 44  /.#ifndef UNUSED
04b0: 5f 50 41 52 41 4d 0a 23 20 64 65 66 69 6e 65 20  _PARAM.# define 
04c0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 58 29 20  UNUSED_PARAM(X) 
04d0: 20 28 76 6f 69 64 29 28 58 29 0a 23 65 6e 64 69   (void)(X).#endi
04e0: 66 0a 0a 23 69 66 6e 64 65 66 20 4c 41 52 47 45  f..#ifndef LARGE
04f0: 53 54 5f 49 4e 54 36 34 0a 23 20 64 65 66 69 6e  ST_INT64.# defin
0500: 65 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 20  e LARGEST_INT64 
0510: 20 28 30 78 66 66 66 66 66 66 66 66 7c 28 28 28   (0xffffffff|(((
0520: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 30 78  sqlite3_int64)0x
0530: 37 66 66 66 66 66 66 66 29 3c 3c 33 32 29 29 0a  7fffffff)<<32)).
0540: 23 20 64 65 66 69 6e 65 20 53 4d 41 4c 4c 45 53  # define SMALLES
0550: 54 5f 49 4e 54 36 34 20 28 28 28 73 71 6c 69 74  T_INT64 (((sqlit
0560: 65 33 5f 69 6e 74 36 34 29 2d 31 29 20 2d 20 4c  e3_int64)-1) - L
0570: 41 52 47 45 53 54 5f 49 4e 54 36 34 29 0a 23 65  ARGEST_INT64).#e
0580: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 73  ndif../*.** Vers
0590: 69 6f 6e 73 20 6f 66 20 69 73 73 70 61 63 65 28  ions of isspace(
05a0: 29 2c 20 69 73 61 6c 6e 75 6d 28 29 20 61 6e 64  ), isalnum() and
05b0: 20 69 73 64 69 67 69 74 28 29 20 74 6f 20 77 68   isdigit() to wh
05c0: 69 63 68 20 69 74 20 69 73 20 73 61 66 65 0a 2a  ich it is safe.*
05d0: 2a 20 74 6f 20 70 61 73 73 20 73 69 67 6e 65 64  * to pass signed
05e0: 20 63 68 61 72 20 76 61 6c 75 65 73 2e 0a 2a 2f   char values..*/
05f0: 0a 23 69 66 64 65 66 20 73 71 6c 69 74 65 33 49  .#ifdef sqlite3I
0600: 73 64 69 67 69 74 0a 20 20 20 2f 2a 20 55 73 65  sdigit.   /* Use
0610: 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65   the SQLite core
0620: 20 76 65 72 73 69 6f 6e 73 20 69 66 20 74 68 69   versions if thi
0630: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72  s routine is par
0640: 74 20 6f 66 20 74 68 65 0a 20 20 20 2a 2a 20 53  t of the.   ** S
0650: 51 4c 69 74 65 20 61 6d 61 6c 67 61 6d 61 74 69  QLite amalgamati
0660: 6f 6e 20 2a 2f 0a 23 20 20 64 65 66 69 6e 65 20  on */.#  define 
0670: 73 61 66 65 5f 69 73 64 69 67 69 74 28 78 29 20  safe_isdigit(x) 
0680: 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28   sqlite3Isdigit(
0690: 78 29 0a 23 20 20 64 65 66 69 6e 65 20 73 61 66  x).#  define saf
06a0: 65 5f 69 73 61 6c 6e 75 6d 28 78 29 20 20 73 71  e_isalnum(x)  sq
06b0: 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 78 29 0a  lite3Isalnum(x).
06c0: 23 20 20 64 65 66 69 6e 65 20 73 61 66 65 5f 69  #  define safe_i
06d0: 73 78 64 69 67 69 74 28 78 29 20 73 71 6c 69 74  sxdigit(x) sqlit
06e0: 65 33 49 73 78 64 69 67 69 74 28 78 29 0a 23 65  e3Isxdigit(x).#e
06f0: 6c 73 65 0a 20 20 20 2f 2a 20 55 73 65 20 74 68  lse.   /* Use th
0700: 65 20 73 74 61 6e 64 61 72 64 20 6c 69 62 72 61  e standard libra
0710: 72 79 20 66 6f 72 20 73 65 70 61 72 61 74 65 20  ry for separate 
0720: 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 2a 2f 0a 23  compilation */.#
0730: 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68  include <ctype.h
0740: 3e 20 20 2f 2a 20 61 6d 61 6c 67 61 6d 61 74 6f  >  /* amalgamato
0750: 72 3a 20 6b 65 65 70 20 2a 2f 0a 23 20 20 64 65  r: keep */.#  de
0760: 66 69 6e 65 20 73 61 66 65 5f 69 73 64 69 67 69  fine safe_isdigi
0770: 74 28 78 29 20 20 69 73 64 69 67 69 74 28 28 75  t(x)  isdigit((u
0780: 6e 73 69 67 6e 65 64 20 63 68 61 72 29 28 78 29  nsigned char)(x)
0790: 29 0a 23 20 20 64 65 66 69 6e 65 20 73 61 66 65  ).#  define safe
07a0: 5f 69 73 61 6c 6e 75 6d 28 78 29 20 20 69 73 61  _isalnum(x)  isa
07b0: 6c 6e 75 6d 28 28 75 6e 73 69 67 6e 65 64 20 63  lnum((unsigned c
07c0: 68 61 72 29 28 78 29 29 0a 23 20 20 64 65 66 69  har)(x)).#  defi
07d0: 6e 65 20 73 61 66 65 5f 69 73 78 64 69 67 69 74  ne safe_isxdigit
07e0: 28 78 29 20 69 73 78 64 69 67 69 74 28 28 75 6e  (x) isxdigit((un
07f0: 73 69 67 6e 65 64 20 63 68 61 72 29 28 78 29 29  signed char)(x))
0800: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
0810: 72 6f 77 69 6e 67 20 6f 75 72 20 6f 77 6e 20 69  rowing our own i
0820: 73 73 70 61 63 65 28 29 20 72 6f 75 74 69 6e 65  sspace() routine
0830: 20 74 68 69 73 20 77 61 79 20 69 73 20 74 77 69   this way is twi
0840: 63 65 20 61 73 20 66 61 73 74 20 61 73 0a 2a 2a  ce as fast as.**
0850: 20 74 68 65 20 6c 69 62 72 61 72 79 20 69 73 73   the library iss
0860: 70 61 63 65 28 29 20 66 75 6e 63 74 69 6f 6e 2c  pace() function,
0870: 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 20   resulting in a 
0880: 37 25 20 6f 76 65 72 61 6c 6c 20 70 65 72 66 6f  7% overall perfo
0890: 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 63 72 65 61  rmance.** increa
08a0: 73 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65  se for the parse
08b0: 72 2e 20 20 28 55 62 75 6e 74 75 31 34 2e 31 30  r.  (Ubuntu14.10
08c0: 20 67 63 63 20 34 2e 38 2e 34 20 78 36 34 20 77   gcc 4.8.4 x64 w
08d0: 69 74 68 20 2d 4f 73 29 2e 0a 2a 2f 0a 73 74 61  ith -Os)..*/.sta
08e0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6a  tic const char j
08f0: 73 6f 6e 49 73 53 70 61 63 65 5b 5d 20 3d 20 7b  sonIsSpace[] = {
0900: 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  .  0, 0, 0, 0, 0
0910: 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 20 20 30  , 0, 0, 0,     0
0920: 2c 20 31 2c 20 31 2c 20 30 2c 20 30 2c 20 31 2c  , 1, 1, 0, 0, 1,
0930: 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30   0, 0,.  0, 0, 0
0940: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0950: 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c       0, 0, 0, 0,
0960: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 31   0, 0, 0, 0,.  1
0970: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0980: 20 30 2c 20 30 2c 20 20 20 20 20 30 2c 20 30 2c   0, 0,     0, 0,
0990: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
09a0: 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  0,.  0, 0, 0, 0,
09b0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 20   0, 0, 0, 0,    
09c0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
09d0: 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c  0, 0, 0,.  0, 0,
09e0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
09f0: 30 2c 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20  0,     0, 0, 0, 
0a00: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  0, 0, 0, 0, 0,. 
0a10: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0a20: 30 2c 20 30 2c 20 30 2c 20 20 20 20 20 30 2c 20  0, 0, 0,     0, 
0a30: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0a40: 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20  , 0,.  0, 0, 0, 
0a50: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20  0, 0, 0, 0, 0,  
0a60: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
0a70: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20  , 0, 0, 0,.  0, 
0a80: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0a90: 2c 20 30 2c 20 20 20 20 20 30 2c 20 30 2c 20 30  , 0,     0, 0, 0
0aa0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0ab0: 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  .  0, 0, 0, 0, 0
0ac0: 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 20 20 30  , 0, 0, 0,     0
0ad0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0ae0: 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30   0, 0,.  0, 0, 0
0af0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0b00: 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c       0, 0, 0, 0,
0b10: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30   0, 0, 0, 0,.  0
0b20: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0b30: 20 30 2c 20 30 2c 20 20 20 20 20 30 2c 20 30 2c   0, 0,     0, 0,
0b40: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0b50: 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  0,.  0, 0, 0, 0,
0b60: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 20   0, 0, 0, 0,    
0b70: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0b80: 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c  0, 0, 0,.  0, 0,
0b90: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0ba0: 30 2c 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20  0,     0, 0, 0, 
0bb0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  0, 0, 0, 0, 0,. 
0bc0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0bd0: 30 2c 20 30 2c 20 30 2c 20 20 20 20 20 30 2c 20  0, 0, 0,     0, 
0be0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0bf0: 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20  , 0,.  0, 0, 0, 
0c00: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20  0, 0, 0, 0, 0,  
0c10: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
0c20: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20  , 0, 0, 0,.  0, 
0c30: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0c40: 2c 20 30 2c 20 20 20 20 20 30 2c 20 30 2c 20 30  , 0,     0, 0, 0
0c50: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0c60: 0a 7d 3b 0a 23 64 65 66 69 6e 65 20 73 61 66 65  .};.#define safe
0c70: 5f 69 73 73 70 61 63 65 28 78 29 20 28 6a 73 6f  _isspace(x) (jso
0c80: 6e 49 73 53 70 61 63 65 5b 28 75 6e 73 69 67 6e  nIsSpace[(unsign
0c90: 65 64 20 63 68 61 72 29 78 5d 29 0a 0a 23 69 66  ed char)x])..#if
0ca0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d 41 4c  ndef SQLITE_AMAL
0cb0: 47 41 4d 41 54 49 4f 4e 0a 20 20 2f 2a 20 55 6e  GAMATION.  /* Un
0cc0: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 74  signed integer t
0cd0: 79 70 65 73 2e 20 20 54 68 65 73 65 20 61 72 65  ypes.  These are
0ce0: 20 61 6c 72 65 61 64 79 20 64 65 66 69 6e 65 64   already defined
0cf0: 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 49 6e   in the sqliteIn
0d00: 74 2e 68 2c 0a 20 20 2a 2a 20 62 75 74 20 74 68  t.h,.  ** but th
0d10: 65 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6e 65  e definitions ne
0d20: 65 64 20 74 6f 20 62 65 20 72 65 70 65 61 74 65  ed to be repeate
0d30: 64 20 66 6f 72 20 73 65 70 61 72 61 74 65 20 63  d for separate c
0d40: 6f 6d 70 69 6c 61 74 69 6f 6e 2e 20 2a 2f 0a 20  ompilation. */. 
0d50: 20 74 79 70 65 64 65 66 20 73 71 6c 69 74 65 33   typedef sqlite3
0d60: 5f 75 69 6e 74 36 34 20 75 36 34 3b 0a 20 20 74  _uint64 u64;.  t
0d70: 79 70 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20  ypedef unsigned 
0d80: 69 6e 74 20 75 33 32 3b 0a 20 20 74 79 70 65 64  int u32;.  typed
0d90: 65 66 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72  ef unsigned shor
0da0: 74 20 69 6e 74 20 75 31 36 3b 0a 20 20 74 79 70  t int u16;.  typ
0db0: 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20 63 68  edef unsigned ch
0dc0: 61 72 20 75 38 3b 0a 23 65 6e 64 69 66 0a 0a 2f  ar u8;.#endif../
0dd0: 2a 20 4f 62 6a 65 63 74 73 20 2a 2f 0a 74 79 70  * Objects */.typ
0de0: 65 64 65 66 20 73 74 72 75 63 74 20 4a 73 6f 6e  edef struct Json
0df0: 53 74 72 69 6e 67 20 4a 73 6f 6e 53 74 72 69 6e  String JsonStrin
0e00: 67 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  g;.typedef struc
0e10: 74 20 4a 73 6f 6e 4e 6f 64 65 20 4a 73 6f 6e 4e  t JsonNode JsonN
0e20: 6f 64 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ode;.typedef str
0e30: 75 63 74 20 4a 73 6f 6e 50 61 72 73 65 20 4a 73  uct JsonParse Js
0e40: 6f 6e 50 61 72 73 65 3b 0a 0a 2f 2a 20 41 6e 20  onParse;../* An 
0e50: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
0e60: 20 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e   object represen
0e70: 74 73 20 61 20 4a 53 4f 4e 20 73 74 72 69 6e 67  ts a JSON string
0e80: 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  .** under constr
0e90: 75 63 74 69 6f 6e 2e 20 20 52 65 61 6c 6c 79 2c  uction.  Really,
0ea0: 20 74 68 69 73 20 69 73 20 61 20 67 65 6e 65 72   this is a gener
0eb0: 69 63 20 73 74 72 69 6e 67 20 61 63 63 75 6d 75  ic string accumu
0ec0: 6c 61 74 6f 72 0a 2a 2a 20 74 68 61 74 20 63 61  lator.** that ca
0ed0: 6e 20 62 65 20 61 6e 64 20 69 73 20 75 73 65 64  n be and is used
0ee0: 20 74 6f 20 63 72 65 61 74 65 20 73 74 72 69 6e   to create strin
0ef0: 67 73 20 6f 74 68 65 72 20 74 68 61 6e 20 4a 53  gs other than JS
0f00: 4f 4e 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 4a 73  ON..*/.struct Js
0f10: 6f 6e 53 74 72 69 6e 67 20 7b 0a 20 20 73 71 6c  onString {.  sql
0f20: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
0f30: 74 78 3b 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f  tx;   /* Functio
0f40: 6e 20 63 6f 6e 74 65 78 74 20 2d 20 70 75 74 20  n context - put 
0f50: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 68  error messages h
0f60: 65 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ere */.  char *z
0f70: 42 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Buf;            
0f80: 20 20 2f 2a 20 41 70 70 65 6e 64 20 4a 53 4f 4e    /* Append JSON
0f90: 20 63 6f 6e 74 65 6e 74 20 68 65 72 65 20 2a 2f   content here */
0fa0: 0a 20 20 75 36 34 20 6e 41 6c 6c 6f 63 3b 20 20  .  u64 nAlloc;  
0fb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
0fc0: 79 74 65 73 20 6f 66 20 73 74 6f 72 61 67 65 20  ytes of storage 
0fd0: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 7a 42 75  available in zBu
0fe0: 66 5b 5d 20 2a 2f 0a 20 20 75 36 34 20 6e 55 73  f[] */.  u64 nUs
0ff0: 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
1000: 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 7a 42    /* Bytes of zB
1010: 75 66 5b 5d 20 63 75 72 72 65 6e 74 6c 79 20 75  uf[] currently u
1020: 73 65 64 20 2a 2f 0a 20 20 75 38 20 62 53 74 61  sed */.  u8 bSta
1030: 74 69 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  tic;            
1040: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 7a 42 75    /* True if zBu
1050: 66 20 69 73 20 73 74 61 74 69 63 20 73 70 61 63  f is static spac
1060: 65 20 2a 2f 0a 20 20 75 38 20 62 45 72 72 3b 20  e */.  u8 bErr; 
1070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1080: 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 65 72  /* True if an er
1090: 72 6f 72 20 68 61 73 20 62 65 65 6e 20 65 6e 63  ror has been enc
10a0: 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20 63 68  ountered */.  ch
10b0: 61 72 20 7a 53 70 61 63 65 5b 31 30 30 5d 3b 20  ar zSpace[100]; 
10c0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
10d0: 6c 20 73 74 61 74 69 63 20 73 70 61 63 65 20 2a  l static space *
10e0: 2f 0a 7d 3b 0a 0a 2f 2a 20 4a 53 4f 4e 20 74 79  /.};../* JSON ty
10f0: 70 65 20 76 61 6c 75 65 73 0a 2a 2f 0a 23 64 65  pe values.*/.#de
1100: 66 69 6e 65 20 4a 53 4f 4e 5f 4e 55 4c 4c 20 20  fine JSON_NULL  
1110: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 4a 53 4f     0.#define JSO
1120: 4e 5f 54 52 55 45 20 20 20 20 20 31 0a 23 64 65  N_TRUE     1.#de
1130: 66 69 6e 65 20 4a 53 4f 4e 5f 46 41 4c 53 45 20  fine JSON_FALSE 
1140: 20 20 20 32 0a 23 64 65 66 69 6e 65 20 4a 53 4f     2.#define JSO
1150: 4e 5f 49 4e 54 20 20 20 20 20 20 33 0a 23 64 65  N_INT      3.#de
1160: 66 69 6e 65 20 4a 53 4f 4e 5f 52 45 41 4c 20 20  fine JSON_REAL  
1170: 20 20 20 34 0a 23 64 65 66 69 6e 65 20 4a 53 4f     4.#define JSO
1180: 4e 5f 53 54 52 49 4e 47 20 20 20 35 0a 23 64 65  N_STRING   5.#de
1190: 66 69 6e 65 20 4a 53 4f 4e 5f 41 52 52 41 59 20  fine JSON_ARRAY 
11a0: 20 20 20 36 0a 23 64 65 66 69 6e 65 20 4a 53 4f     6.#define JSO
11b0: 4e 5f 4f 42 4a 45 43 54 20 20 20 37 0a 0a 2f 2a  N_OBJECT   7../*
11c0: 20 54 68 65 20 22 73 75 62 74 79 70 65 22 20 73   The "subtype" s
11d0: 65 74 20 66 6f 72 20 4a 53 4f 4e 20 76 61 6c 75  et for JSON valu
11e0: 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 53  es */.#define JS
11f0: 4f 4e 5f 53 55 42 54 59 50 45 20 20 37 34 20 20  ON_SUBTYPE  74  
1200: 20 20 2f 2a 20 41 73 63 69 69 20 66 6f 72 20 22    /* Ascii for "
1210: 4a 22 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d  J" */../*.** Nam
1220: 65 73 20 6f 66 20 74 68 65 20 76 61 72 69 6f 75  es of the variou
1230: 73 20 4a 53 4f 4e 20 74 79 70 65 73 3a 0a 2a 2f  s JSON types:.*/
1240: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
1250: 61 72 20 2a 20 63 6f 6e 73 74 20 6a 73 6f 6e 54  ar * const jsonT
1260: 79 70 65 5b 5d 20 3d 20 7b 0a 20 20 22 6e 75 6c  ype[] = {.  "nul
1270: 6c 22 2c 20 22 74 72 75 65 22 2c 20 22 66 61 6c  l", "true", "fal
1280: 73 65 22 2c 20 22 69 6e 74 65 67 65 72 22 2c 20  se", "integer", 
1290: 22 72 65 61 6c 22 2c 20 22 74 65 78 74 22 2c 20  "real", "text", 
12a0: 22 61 72 72 61 79 22 2c 20 22 6f 62 6a 65 63 74  "array", "object
12b0: 22 0a 7d 3b 0a 0a 2f 2a 20 42 69 74 20 76 61 6c  ".};../* Bit val
12c0: 75 65 73 20 66 6f 72 20 74 68 65 20 4a 73 6f 6e  ues for the Json
12d0: 4e 6f 64 65 2e 6a 6e 46 6c 61 67 20 66 69 65 6c  Node.jnFlag fiel
12e0: 64 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4e 4f  d.*/.#define JNO
12f0: 44 45 5f 52 41 57 20 20 20 20 20 30 78 30 31 20  DE_RAW     0x01 
1300: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
1310: 6e 74 20 69 73 20 72 61 77 2c 20 6e 6f 74 20 4a  nt is raw, not J
1320: 53 4f 4e 20 65 6e 63 6f 64 65 64 20 2a 2f 0a 23  SON encoded */.#
1330: 64 65 66 69 6e 65 20 4a 4e 4f 44 45 5f 45 53 43  define JNODE_ESC
1340: 41 50 45 20 20 30 78 30 32 20 20 20 20 20 20 20  APE  0x02       
1350: 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 69 73 20    /* Content is 
1360: 74 65 78 74 20 77 69 74 68 20 5c 20 65 73 63 61  text with \ esca
1370: 70 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4a  pes */.#define J
1380: 4e 4f 44 45 5f 52 45 4d 4f 56 45 20 20 30 78 30  NODE_REMOVE  0x0
1390: 34 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20  4         /* Do 
13a0: 6e 6f 74 20 6f 75 74 70 75 74 20 2a 2f 0a 23 64  not output */.#d
13b0: 65 66 69 6e 65 20 4a 4e 4f 44 45 5f 52 45 50 4c  efine JNODE_REPL
13c0: 41 43 45 20 30 78 30 38 20 20 20 20 20 20 20 20  ACE 0x08        
13d0: 20 2f 2a 20 52 65 70 6c 61 63 65 20 77 69 74 68   /* Replace with
13e0: 20 4a 73 6f 6e 4e 6f 64 65 2e 75 2e 69 52 65 70   JsonNode.u.iRep
13f0: 6c 61 63 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  lace */.#define 
1400: 4a 4e 4f 44 45 5f 50 41 54 43 48 20 20 20 30 78  JNODE_PATCH   0x
1410: 31 30 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  10         /* Pa
1420: 74 63 68 20 77 69 74 68 20 4a 73 6f 6e 4e 6f 64  tch with JsonNod
1430: 65 2e 75 2e 70 50 61 74 63 68 20 2a 2f 0a 23 64  e.u.pPatch */.#d
1440: 65 66 69 6e 65 20 4a 4e 4f 44 45 5f 41 50 50 45  efine JNODE_APPE
1450: 4e 44 20 20 30 78 32 30 20 20 20 20 20 20 20 20  ND  0x20        
1460: 20 2f 2a 20 4d 6f 72 65 20 41 52 52 41 59 2f 4f   /* More ARRAY/O
1470: 42 4a 45 43 54 20 65 6e 74 72 69 65 73 20 61 74  BJECT entries at
1480: 20 75 2e 69 41 70 70 65 6e 64 20 2a 2f 0a 23 64   u.iAppend */.#d
1490: 65 66 69 6e 65 20 4a 4e 4f 44 45 5f 4c 41 42 45  efine JNODE_LABE
14a0: 4c 20 20 20 30 78 34 30 20 20 20 20 20 20 20 20  L   0x40        
14b0: 20 2f 2a 20 49 73 20 61 20 6c 61 62 65 6c 20 6f   /* Is a label o
14c0: 66 20 61 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a  f an object */..
14d0: 0a 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6e 6f 64  ./* A single nod
14e0: 65 20 6f 66 20 70 61 72 73 65 64 20 4a 53 4f 4e  e of parsed JSON
14f0: 0a 2a 2f 0a 73 74 72 75 63 74 20 4a 73 6f 6e 4e  .*/.struct JsonN
1500: 6f 64 65 20 7b 0a 20 20 75 38 20 65 54 79 70 65  ode {.  u8 eType
1510: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1520: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 4a 53 4f  * One of the JSO
1530: 4e 5f 20 74 79 70 65 20 76 61 6c 75 65 73 20 2a  N_ type values *
1540: 2f 0a 20 20 75 38 20 6a 6e 46 6c 61 67 73 3b 20  /.  u8 jnFlags; 
1550: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 4e             /* JN
1560: 4f 44 45 20 66 6c 61 67 73 20 2a 2f 0a 20 20 75  ODE flags */.  u
1570: 33 32 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  32 n;           
1580: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
1590: 66 20 63 6f 6e 74 65 6e 74 2c 20 6f 72 20 6e 75  f content, or nu
15a0: 6d 62 65 72 20 6f 66 20 73 75 62 2d 6e 6f 64 65  mber of sub-node
15b0: 73 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20  s */.  union {. 
15c0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
15d0: 4a 43 6f 6e 74 65 6e 74 3b 20 2f 2a 20 43 6f 6e  JContent; /* Con
15e0: 74 65 6e 74 20 66 6f 72 20 49 4e 54 2c 20 52 45  tent for INT, RE
15f0: 41 4c 2c 20 61 6e 64 20 53 54 52 49 4e 47 20 2a  AL, and STRING *
1600: 2f 0a 20 20 20 20 75 33 32 20 69 41 70 70 65 6e  /.    u32 iAppen
1610: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
1620: 4d 6f 72 65 20 74 65 72 6d 73 20 66 6f 72 20 41  More terms for A
1630: 52 52 41 59 20 61 6e 64 20 4f 42 4a 45 43 54 20  RRAY and OBJECT 
1640: 2a 2f 0a 20 20 20 20 75 33 32 20 69 4b 65 79 3b  */.    u32 iKey;
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1660: 20 4b 65 79 20 66 6f 72 20 41 52 52 41 59 20 6f   Key for ARRAY o
1670: 62 6a 65 63 74 73 20 69 6e 20 6a 73 6f 6e 5f 74  bjects in json_t
1680: 72 65 65 28 29 20 2a 2f 0a 20 20 20 20 75 33 32  ree() */.    u32
1690: 20 69 52 65 70 6c 61 63 65 3b 20 20 20 20 20 20   iReplace;      
16a0: 20 20 20 20 2f 2a 20 52 65 70 6c 61 63 65 6d 65      /* Replaceme
16b0: 6e 74 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 4a  nt content for J
16c0: 4e 4f 44 45 5f 52 45 50 4c 41 43 45 20 2a 2f 0a  NODE_REPLACE */.
16d0: 20 20 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 50      JsonNode *pP
16e0: 61 74 63 68 3b 20 20 20 20 20 20 2f 2a 20 4e 6f  atch;      /* No
16f0: 64 65 20 63 68 61 69 6e 20 6f 66 20 70 61 74 63  de chain of patc
1700: 68 20 66 6f 72 20 4a 4e 4f 44 45 5f 50 41 54 43  h for JNODE_PATC
1710: 48 20 2a 2f 0a 20 20 7d 20 75 3b 0a 7d 3b 0a 0a  H */.  } u;.};..
1720: 2f 2a 20 41 20 63 6f 6d 70 6c 65 74 65 6c 79 20  /* A completely 
1730: 70 61 72 73 65 64 20 4a 53 4f 4e 20 73 74 72 69  parsed JSON stri
1740: 6e 67 0a 2a 2f 0a 73 74 72 75 63 74 20 4a 73 6f  ng.*/.struct Jso
1750: 6e 50 61 72 73 65 20 7b 0a 20 20 75 33 32 20 6e  nParse {.  u32 n
1760: 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Node;         /*
1770: 20 4e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73   Number of slots
1780: 20 6f 66 20 61 4e 6f 64 65 5b 5d 20 75 73 65 64   of aNode[] used
1790: 20 2a 2f 0a 20 20 75 33 32 20 6e 41 6c 6c 6f 63   */.  u32 nAlloc
17a0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ;        /* Numb
17b0: 65 72 20 6f 66 20 73 6c 6f 74 73 20 6f 66 20 61  er of slots of a
17c0: 4e 6f 64 65 5b 5d 20 61 6c 6c 6f 63 61 74 65 64  Node[] allocated
17d0: 20 2a 2f 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a   */.  JsonNode *
17e0: 61 4e 6f 64 65 3b 20 20 20 2f 2a 20 41 72 72 61  aNode;   /* Arra
17f0: 79 20 6f 66 20 6e 6f 64 65 73 20 63 6f 6e 74 61  y of nodes conta
1800: 69 6e 69 6e 67 20 74 68 65 20 70 61 72 73 65 20  ining the parse 
1810: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1820: 2a 7a 4a 73 6f 6e 3b 20 2f 2a 20 4f 72 69 67 69  *zJson; /* Origi
1830: 6e 61 6c 20 4a 53 4f 4e 20 73 74 72 69 6e 67 20  nal JSON string 
1840: 2a 2f 0a 20 20 75 33 32 20 2a 61 55 70 3b 20 20  */.  u32 *aUp;  
1850: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1860: 20 6f 66 20 70 61 72 65 6e 74 20 6f 66 20 65 61   of parent of ea
1870: 63 68 20 6e 6f 64 65 20 2a 2f 0a 20 20 75 38 20  ch node */.  u8 
1880: 6f 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  oom;            
1890: 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20 69  /* Set to true i
18a0: 66 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20  f out of memory 
18b0: 2a 2f 0a 20 20 75 38 20 6e 45 72 72 3b 20 20 20  */.  u8 nErr;   
18c0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
18d0: 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e  r of errors seen
18e0: 20 2a 2f 0a 20 20 75 31 36 20 69 44 65 70 74 68   */.  u16 iDepth
18f0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 73 74  ;        /* Nest
1900: 69 6e 67 20 64 65 70 74 68 20 2a 2f 0a 20 20 69  ing depth */.  i
1910: 6e 74 20 6e 4a 73 6f 6e 3b 20 20 20 20 20 20 20  nt nJson;       
1920: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74    /* Length of t
1930: 68 65 20 7a 4a 73 6f 6e 20 73 74 72 69 6e 67 20  he zJson string 
1940: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33  in bytes */.  u3
1950: 32 20 69 48 6f 6c 64 3b 20 20 20 20 20 20 20 20  2 iHold;        
1960: 20 2f 2a 20 52 65 70 6c 61 63 65 20 63 61 63 68   /* Replace cach
1970: 65 20 6c 69 6e 65 20 77 69 74 68 20 74 68 65 20  e line with the 
1980: 6c 6f 77 65 73 74 20 69 48 6f 6c 64 20 76 61 6c  lowest iHold val
1990: 75 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ue */.};../*.** 
19a0: 4d 61 78 69 6d 75 6d 20 6e 65 73 74 69 6e 67 20  Maximum nesting 
19b0: 64 65 70 74 68 20 6f 66 20 4a 53 4f 4e 20 66 6f  depth of JSON fo
19c0: 72 20 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74  r this implement
19d0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ation..**.** Thi
19e0: 73 20 6c 69 6d 69 74 20 69 73 20 6e 65 65 64 65  s limit is neede
19f0: 64 20 74 6f 20 61 76 6f 69 64 20 61 20 73 74 61  d to avoid a sta
1a00: 63 6b 20 6f 76 65 72 66 6c 6f 77 20 69 6e 20 74  ck overflow in t
1a10: 68 65 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20  he recursive.** 
1a20: 64 65 73 63 65 6e 74 20 70 61 72 73 65 72 2e 20  descent parser. 
1a30: 20 41 20 64 65 70 74 68 20 6f 66 20 32 30 30 30   A depth of 2000
1a40: 20 69 73 20 66 61 72 20 64 65 65 70 65 72 20 74   is far deeper t
1a50: 68 61 6e 20 61 6e 79 20 73 61 6e 65 20 4a 53 4f  han any sane JSO
1a60: 4e 0a 2a 2a 20 73 68 6f 75 6c 64 20 67 6f 2e 0a  N.** should go..
1a70: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 53 4f 4e 5f  */.#define JSON_
1a80: 4d 41 58 5f 44 45 50 54 48 20 20 32 30 30 30 0a  MAX_DEPTH  2000.
1a90: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
1aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ad0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
1ae0: 55 74 69 6c 69 74 79 20 72 6f 75 74 69 6e 65 73  Utility routines
1af0: 20 66 6f 72 20 64 65 61 6c 69 6e 67 20 77 69 74   for dealing wit
1b00: 68 20 4a 73 6f 6e 53 74 72 69 6e 67 20 6f 62 6a  h JsonString obj
1b10: 65 63 74 73 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ects.***********
1b20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
1b60: 0a 0a 2f 2a 20 53 65 74 20 74 68 65 20 4a 73 6f  ../* Set the Jso
1b70: 6e 53 74 72 69 6e 67 20 6f 62 6a 65 63 74 20 74  nString object t
1b80: 6f 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  o an empty strin
1b90: 67 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  g.*/.static void
1ba0: 20 6a 73 6f 6e 5a 65 72 6f 28 4a 73 6f 6e 53 74   jsonZero(JsonSt
1bb0: 72 69 6e 67 20 2a 70 29 7b 0a 20 20 70 2d 3e 7a  ring *p){.  p->z
1bc0: 42 75 66 20 3d 20 70 2d 3e 7a 53 70 61 63 65 3b  Buf = p->zSpace;
1bd0: 0a 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 73  .  p->nAlloc = s
1be0: 69 7a 65 6f 66 28 70 2d 3e 7a 53 70 61 63 65 29  izeof(p->zSpace)
1bf0: 3b 0a 20 20 70 2d 3e 6e 55 73 65 64 20 3d 20 30  ;.  p->nUsed = 0
1c00: 3b 0a 20 20 70 2d 3e 62 53 74 61 74 69 63 20 3d  ;.  p->bStatic =
1c10: 20 31 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69 74 69 61   1;.}../* Initia
1c20: 6c 69 7a 65 20 74 68 65 20 4a 73 6f 6e 53 74 72  lize the JsonStr
1c30: 69 6e 67 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74  ing object.*/.st
1c40: 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 49 6e  atic void jsonIn
1c50: 69 74 28 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70  it(JsonString *p
1c60: 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  , sqlite3_contex
1c70: 74 20 2a 70 43 74 78 29 7b 0a 20 20 70 2d 3e 70  t *pCtx){.  p->p
1c80: 43 74 78 20 3d 20 70 43 74 78 3b 0a 20 20 70 2d  Ctx = pCtx;.  p-
1c90: 3e 62 45 72 72 20 3d 20 30 3b 0a 20 20 6a 73 6f  >bErr = 0;.  jso
1ca0: 6e 5a 65 72 6f 28 70 29 3b 0a 7d 0a 0a 0a 2f 2a  nZero(p);.}.../*
1cb0: 20 46 72 65 65 20 61 6c 6c 20 61 6c 6c 6f 63 61   Free all alloca
1cc0: 74 65 64 20 6d 65 6d 6f 72 79 20 61 6e 64 20 72  ted memory and r
1cd0: 65 73 65 74 20 74 68 65 20 4a 73 6f 6e 53 74 72  eset the JsonStr
1ce0: 69 6e 67 20 6f 62 6a 65 63 74 20 62 61 63 6b 20  ing object back 
1cf0: 74 6f 20 69 74 73 0a 2a 2a 20 69 6e 69 74 69 61  to its.** initia
1d00: 6c 20 73 74 61 74 65 2e 0a 2a 2f 0a 73 74 61 74  l state..*/.stat
1d10: 69 63 20 76 6f 69 64 20 6a 73 6f 6e 52 65 73 65  ic void jsonRese
1d20: 74 28 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70 29  t(JsonString *p)
1d30: 7b 0a 20 20 69 66 28 20 21 70 2d 3e 62 53 74 61  {.  if( !p->bSta
1d40: 74 69 63 20 29 20 73 71 6c 69 74 65 33 5f 66 72  tic ) sqlite3_fr
1d50: 65 65 28 70 2d 3e 7a 42 75 66 29 3b 0a 20 20 6a  ee(p->zBuf);.  j
1d60: 73 6f 6e 5a 65 72 6f 28 70 29 3b 0a 7d 0a 0a 0a  sonZero(p);.}...
1d70: 2f 2a 20 52 65 70 6f 72 74 20 61 6e 20 6f 75 74  /* Report an out
1d80: 2d 6f 66 2d 6d 65 6d 6f 72 79 20 28 4f 4f 4d 29  -of-memory (OOM)
1d90: 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2f 0a 73   condition .*/.s
1da0: 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 4f  tatic void jsonO
1db0: 6f 6d 28 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70  om(JsonString *p
1dc0: 29 7b 0a 20 20 70 2d 3e 62 45 72 72 20 3d 20 31  ){.  p->bErr = 1
1dd0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
1de0: 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 70  lt_error_nomem(p
1df0: 2d 3e 70 43 74 78 29 3b 0a 20 20 6a 73 6f 6e 52  ->pCtx);.  jsonR
1e00: 65 73 65 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 20 45  eset(p);.}../* E
1e10: 6e 6c 61 72 67 65 20 70 4a 73 6f 6e 2d 3e 7a 42  nlarge pJson->zB
1e20: 75 66 20 73 6f 20 74 68 61 74 20 69 74 20 63 61  uf so that it ca
1e30: 6e 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20  n hold at least 
1e40: 4e 20 6d 6f 72 65 20 62 79 74 65 73 2e 0a 2a 2a  N more bytes..**
1e50: 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 6f 6e 20   Return zero on 
1e60: 73 75 63 63 65 73 73 2e 20 20 52 65 74 75 72 6e  success.  Return
1e70: 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20 61 6e 20   non-zero on an 
1e80: 4f 4f 4d 20 65 72 72 6f 72 0a 2a 2f 0a 73 74 61  OOM error.*/.sta
1e90: 74 69 63 20 69 6e 74 20 6a 73 6f 6e 47 72 6f 77  tic int jsonGrow
1ea0: 28 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70 2c 20  (JsonString *p, 
1eb0: 75 33 32 20 4e 29 7b 0a 20 20 75 36 34 20 6e 54  u32 N){.  u64 nT
1ec0: 6f 74 61 6c 20 3d 20 4e 3c 70 2d 3e 6e 41 6c 6c  otal = N<p->nAll
1ed0: 6f 63 20 3f 20 70 2d 3e 6e 41 6c 6c 6f 63 2a 32  oc ? p->nAlloc*2
1ee0: 20 3a 20 70 2d 3e 6e 41 6c 6c 6f 63 2b 4e 2b 31   : p->nAlloc+N+1
1ef0: 30 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 65 77 3b  0;.  char *zNew;
1f00: 0a 20 20 69 66 28 20 70 2d 3e 62 53 74 61 74 69  .  if( p->bStati
1f10: 63 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  c ){.    if( p->
1f20: 62 45 72 72 20 29 20 72 65 74 75 72 6e 20 31 3b  bErr ) return 1;
1f30: 0a 20 20 20 20 7a 4e 65 77 20 3d 20 73 71 6c 69  .    zNew = sqli
1f40: 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 54 6f  te3_malloc64(nTo
1f50: 74 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e  tal);.    if( zN
1f60: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6a  ew==0 ){.      j
1f70: 73 6f 6e 4f 6f 6d 28 70 29 3b 0a 20 20 20 20 20  sonOom(p);.     
1f80: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
1f90: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
1fa0: 6d 65 6d 63 70 79 28 7a 4e 65 77 2c 20 70 2d 3e  memcpy(zNew, p->
1fb0: 7a 42 75 66 2c 20 28 73 69 7a 65 5f 74 29 70 2d  zBuf, (size_t)p-
1fc0: 3e 6e 55 73 65 64 29 3b 0a 20 20 20 20 70 2d 3e  >nUsed);.    p->
1fd0: 7a 42 75 66 20 3d 20 7a 4e 65 77 3b 0a 20 20 20  zBuf = zNew;.   
1fe0: 20 70 2d 3e 62 53 74 61 74 69 63 20 3d 20 30 3b   p->bStatic = 0;
1ff0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e  .  }else{.    zN
2000: 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61  ew = sqlite3_rea
2010: 6c 6c 6f 63 36 34 28 70 2d 3e 7a 42 75 66 2c 20  lloc64(p->zBuf, 
2020: 6e 54 6f 74 61 6c 29 3b 0a 20 20 20 20 69 66 28  nTotal);.    if(
2030: 20 7a 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   zNew==0 ){.    
2040: 20 20 6a 73 6f 6e 4f 6f 6d 28 70 29 3b 0a 20 20    jsonOom(p);.  
2050: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2060: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
2070: 20 20 20 70 2d 3e 7a 42 75 66 20 3d 20 7a 4e 65     p->zBuf = zNe
2080: 77 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 41 6c 6c  w;.  }.  p->nAll
2090: 6f 63 20 3d 20 6e 54 6f 74 61 6c 3b 0a 20 20 72  oc = nTotal;.  r
20a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
20b0: 0a 7d 0a 0a 2f 2a 20 41 70 70 65 6e 64 20 4e 20  .}../* Append N 
20c0: 62 79 74 65 73 20 66 72 6f 6d 20 7a 49 6e 20 6f  bytes from zIn o
20d0: 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74  nto the end of t
20e0: 68 65 20 4a 73 6f 6e 53 74 72 69 6e 67 20 73 74  he JsonString st
20f0: 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ring..*/.static 
2100: 76 6f 69 64 20 6a 73 6f 6e 41 70 70 65 6e 64 52  void jsonAppendR
2110: 61 77 28 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70  aw(JsonString *p
2120: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49  , const char *zI
2130: 6e 2c 20 75 33 32 20 4e 29 7b 0a 20 20 69 66 28  n, u32 N){.  if(
2140: 20 28 4e 2b 70 2d 3e 6e 55 73 65 64 20 3e 3d 20   (N+p->nUsed >= 
2150: 70 2d 3e 6e 41 6c 6c 6f 63 29 20 26 26 20 6a 73  p->nAlloc) && js
2160: 6f 6e 47 72 6f 77 28 70 2c 4e 29 21 3d 30 20 29  onGrow(p,N)!=0 )
2170: 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 63 70   return;.  memcp
2180: 79 28 70 2d 3e 7a 42 75 66 2b 70 2d 3e 6e 55 73  y(p->zBuf+p->nUs
2190: 65 64 2c 20 7a 49 6e 2c 20 4e 29 3b 0a 20 20 70  ed, zIn, N);.  p
21a0: 2d 3e 6e 55 73 65 64 20 2b 3d 20 4e 3b 0a 7d 0a  ->nUsed += N;.}.
21b0: 0a 2f 2a 20 41 70 70 65 6e 64 20 66 6f 72 6d 61  ./* Append forma
21c0: 74 74 65 64 20 74 65 78 74 20 28 6e 6f 74 20 74  tted text (not t
21d0: 6f 20 65 78 63 65 65 64 20 4e 20 62 79 74 65 73  o exceed N bytes
21e0: 29 20 74 6f 20 74 68 65 20 4a 73 6f 6e 53 74 72  ) to the JsonStr
21f0: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
2200: 6f 69 64 20 6a 73 6f 6e 50 72 69 6e 74 66 28 69  oid jsonPrintf(i
2210: 6e 74 20 4e 2c 20 4a 73 6f 6e 53 74 72 69 6e 67  nt N, JsonString
2220: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
2230: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
2240: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
2250: 69 66 28 20 28 70 2d 3e 6e 55 73 65 64 20 2b 20  if( (p->nUsed + 
2260: 4e 20 3e 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 29 20  N >= p->nAlloc) 
2270: 26 26 20 6a 73 6f 6e 47 72 6f 77 28 70 2c 20 4e  && jsonGrow(p, N
2280: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 76 61  ) ) return;.  va
2290: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
22a0: 61 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  at);.  sqlite3_v
22b0: 73 6e 70 72 69 6e 74 66 28 4e 2c 20 70 2d 3e 7a  snprintf(N, p->z
22c0: 42 75 66 2b 70 2d 3e 6e 55 73 65 64 2c 20 7a 46  Buf+p->nUsed, zF
22d0: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61  ormat, ap);.  va
22e0: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 70 2d 3e 6e  _end(ap);.  p->n
22f0: 55 73 65 64 20 2b 3d 20 28 69 6e 74 29 73 74 72  Used += (int)str
2300: 6c 65 6e 28 70 2d 3e 7a 42 75 66 2b 70 2d 3e 6e  len(p->zBuf+p->n
2310: 55 73 65 64 29 3b 0a 7d 0a 0a 2f 2a 20 41 70 70  Used);.}../* App
2320: 65 6e 64 20 61 20 73 69 6e 67 6c 65 20 63 68 61  end a single cha
2330: 72 61 63 74 65 72 0a 2a 2f 0a 73 74 61 74 69 63  racter.*/.static
2340: 20 76 6f 69 64 20 6a 73 6f 6e 41 70 70 65 6e 64   void jsonAppend
2350: 43 68 61 72 28 4a 73 6f 6e 53 74 72 69 6e 67 20  Char(JsonString 
2360: 2a 70 2c 20 63 68 61 72 20 63 29 7b 0a 20 20 69  *p, char c){.  i
2370: 66 28 20 70 2d 3e 6e 55 73 65 64 3e 3d 70 2d 3e  f( p->nUsed>=p->
2380: 6e 41 6c 6c 6f 63 20 26 26 20 6a 73 6f 6e 47 72  nAlloc && jsonGr
2390: 6f 77 28 70 2c 31 29 21 3d 30 20 29 20 72 65 74  ow(p,1)!=0 ) ret
23a0: 75 72 6e 3b 0a 20 20 70 2d 3e 7a 42 75 66 5b 70  urn;.  p->zBuf[p
23b0: 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d 20 63 3b 0a  ->nUsed++] = c;.
23c0: 7d 0a 0a 2f 2a 20 41 70 70 65 6e 64 20 61 20 63  }../* Append a c
23d0: 6f 6d 6d 61 20 73 65 70 61 72 61 74 6f 72 20 74  omma separator t
23e0: 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  o the output buf
23f0: 66 65 72 2c 20 69 66 20 74 68 65 20 70 72 65 76  fer, if the prev
2400: 69 6f 75 73 0a 2a 2a 20 63 68 61 72 61 63 74 65  ious.** characte
2410: 72 20 69 73 20 6e 6f 74 20 27 5b 27 20 6f 72 20  r is not '[' or 
2420: 27 7b 27 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  '{'..*/.static v
2430: 6f 69 64 20 6a 73 6f 6e 41 70 70 65 6e 64 53 65  oid jsonAppendSe
2440: 70 61 72 61 74 6f 72 28 4a 73 6f 6e 53 74 72 69  parator(JsonStri
2450: 6e 67 20 2a 70 29 7b 0a 20 20 63 68 61 72 20 63  ng *p){.  char c
2460: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 55 73 65 64  ;.  if( p->nUsed
2470: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
2480: 63 20 3d 20 70 2d 3e 7a 42 75 66 5b 70 2d 3e 6e  c = p->zBuf[p->n
2490: 55 73 65 64 2d 31 5d 3b 0a 20 20 69 66 28 20 63  Used-1];.  if( c
24a0: 21 3d 27 5b 27 20 26 26 20 63 21 3d 27 7b 27 20  !='[' && c!='{' 
24b0: 29 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61 72  ) jsonAppendChar
24c0: 28 70 2c 20 27 2c 27 29 3b 0a 7d 0a 0a 2f 2a 20  (p, ',');.}../* 
24d0: 41 70 70 65 6e 64 20 74 68 65 20 4e 2d 62 79 74  Append the N-byt
24e0: 65 20 73 74 72 69 6e 67 20 69 6e 20 7a 49 6e 20  e string in zIn 
24f0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
2500: 65 20 4a 73 6f 6e 53 74 72 69 6e 67 20 73 74 72  e JsonString str
2510: 69 6e 67 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e  ing.** under con
2520: 73 74 72 75 63 74 69 6f 6e 2e 20 20 45 6e 63 6c  struction.  Encl
2530: 6f 73 65 20 74 68 65 20 73 74 72 69 6e 67 20 69  ose the string i
2540: 6e 20 22 2e 2e 2e 22 20 61 6e 64 20 65 73 63 61  n "..." and esca
2550: 70 65 0a 2a 2a 20 61 6e 79 20 64 6f 75 62 6c 65  pe.** any double
2560: 2d 71 75 6f 74 65 73 20 6f 72 20 62 61 63 6b 73  -quotes or backs
2570: 6c 61 73 68 20 63 68 61 72 61 63 74 65 72 73 20  lash characters 
2580: 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
2590: 20 74 68 65 0a 2a 2a 20 73 74 72 69 6e 67 2e 0a   the.** string..
25a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a  */.static void j
25b0: 73 6f 6e 41 70 70 65 6e 64 53 74 72 69 6e 67 28  sonAppendString(
25c0: 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70 2c 20 63  JsonString *p, c
25d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 2c 20  onst char *zIn, 
25e0: 75 33 32 20 4e 29 7b 0a 20 20 75 33 32 20 69 3b  u32 N){.  u32 i;
25f0: 0a 20 20 69 66 28 20 28 4e 2b 70 2d 3e 6e 55 73  .  if( (N+p->nUs
2600: 65 64 2b 32 20 3e 3d 20 70 2d 3e 6e 41 6c 6c 6f  ed+2 >= p->nAllo
2610: 63 29 20 26 26 20 6a 73 6f 6e 47 72 6f 77 28 70  c) && jsonGrow(p
2620: 2c 4e 2b 32 29 21 3d 30 20 29 20 72 65 74 75 72  ,N+2)!=0 ) retur
2630: 6e 3b 0a 20 20 70 2d 3e 7a 42 75 66 5b 70 2d 3e  n;.  p->zBuf[p->
2640: 6e 55 73 65 64 2b 2b 5d 20 3d 20 27 22 27 3b 0a  nUsed++] = '"';.
2650: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b 20    for(i=0; i<N; 
2660: 69 2b 2b 29 7b 0a 20 20 20 20 75 6e 73 69 67 6e  i++){.    unsign
2670: 65 64 20 63 68 61 72 20 63 20 3d 20 28 28 75 6e  ed char c = ((un
2680: 73 69 67 6e 65 64 20 63 6f 6e 73 74 20 63 68 61  signed const cha
2690: 72 2a 29 7a 49 6e 29 5b 69 5d 3b 0a 20 20 20 20  r*)zIn)[i];.    
26a0: 69 66 28 20 63 3d 3d 27 22 27 20 7c 7c 20 63 3d  if( c=='"' || c=
26b0: 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 6a  ='\\' ){.      j
26c0: 73 6f 6e 5f 73 69 6d 70 6c 65 5f 65 73 63 61 70  son_simple_escap
26d0: 65 3a 0a 20 20 20 20 20 20 69 66 28 20 28 70 2d  e:.      if( (p-
26e0: 3e 6e 55 73 65 64 2b 4e 2b 33 2d 69 20 3e 20 70  >nUsed+N+3-i > p
26f0: 2d 3e 6e 41 6c 6c 6f 63 29 20 26 26 20 6a 73 6f  ->nAlloc) && jso
2700: 6e 47 72 6f 77 28 70 2c 4e 2b 33 2d 69 29 21 3d  nGrow(p,N+3-i)!=
2710: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
2720: 20 20 70 2d 3e 7a 42 75 66 5b 70 2d 3e 6e 55 73    p->zBuf[p->nUs
2730: 65 64 2b 2b 5d 20 3d 20 27 5c 5c 27 3b 0a 20 20  ed++] = '\\';.  
2740: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3c 3d 30    }else if( c<=0
2750: 78 31 66 20 29 7b 0a 20 20 20 20 20 20 73 74 61  x1f ){.      sta
2760: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 61  tic const char a
2770: 53 70 65 63 69 61 6c 5b 5d 20 3d 20 7b 0a 20 20  Special[] = {.  
2780: 20 20 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20         0, 0, 0, 
2790: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 27  0, 0, 0, 0, 0, '
27a0: 62 27 2c 20 27 74 27 2c 20 27 6e 27 2c 20 30 2c  b', 't', 'n', 0,
27b0: 20 27 66 27 2c 20 27 72 27 2c 20 30 2c 20 30 2c   'f', 'r', 0, 0,
27c0: 0a 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20  .         0, 0, 
27d0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
27e0: 2c 20 20 20 30 2c 20 20 20 30 2c 20 20 20 30 2c  ,   0,   0,   0,
27f0: 20 30 2c 20 20 20 30 2c 20 20 20 30 2c 20 30 2c   0,   0,   0, 0,
2800: 20 30 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20   0.      };.    
2810: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
2820: 28 61 53 70 65 63 69 61 6c 29 3d 3d 33 32 20 29  (aSpecial)==32 )
2830: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2840: 61 53 70 65 63 69 61 6c 5b 27 5c 62 27 5d 3d 3d  aSpecial['\b']==
2850: 27 62 27 20 29 3b 0a 20 20 20 20 20 20 61 73 73  'b' );.      ass
2860: 65 72 74 28 20 61 53 70 65 63 69 61 6c 5b 27 5c  ert( aSpecial['\
2870: 66 27 5d 3d 3d 27 66 27 20 29 3b 0a 20 20 20 20  f']=='f' );.    
2880: 20 20 61 73 73 65 72 74 28 20 61 53 70 65 63 69    assert( aSpeci
2890: 61 6c 5b 27 5c 6e 27 5d 3d 3d 27 6e 27 20 29 3b  al['\n']=='n' );
28a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61  .      assert( a
28b0: 53 70 65 63 69 61 6c 5b 27 5c 72 27 5d 3d 3d 27  Special['\r']=='
28c0: 72 27 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  r' );.      asse
28d0: 72 74 28 20 61 53 70 65 63 69 61 6c 5b 27 5c 74  rt( aSpecial['\t
28e0: 27 5d 3d 3d 27 74 27 20 29 3b 0a 20 20 20 20 20  ']=='t' );.     
28f0: 20 69 66 28 20 61 53 70 65 63 69 61 6c 5b 63 5d   if( aSpecial[c]
2900: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20   ){.        c = 
2910: 61 53 70 65 63 69 61 6c 5b 63 5d 3b 0a 20 20 20  aSpecial[c];.   
2920: 20 20 20 20 20 67 6f 74 6f 20 6a 73 6f 6e 5f 73       goto json_s
2930: 69 6d 70 6c 65 5f 65 73 63 61 70 65 3b 0a 20 20  imple_escape;.  
2940: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2950: 28 70 2d 3e 6e 55 73 65 64 2b 4e 2b 37 2b 69 20  (p->nUsed+N+7+i 
2960: 3e 20 70 2d 3e 6e 41 6c 6c 6f 63 29 20 26 26 20  > p->nAlloc) && 
2970: 6a 73 6f 6e 47 72 6f 77 28 70 2c 4e 2b 37 2d 69  jsonGrow(p,N+7-i
2980: 29 21 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )!=0 ) return;. 
2990: 20 20 20 20 20 70 2d 3e 7a 42 75 66 5b 70 2d 3e       p->zBuf[p->
29a0: 6e 55 73 65 64 2b 2b 5d 20 3d 20 27 5c 5c 27 3b  nUsed++] = '\\';
29b0: 0a 20 20 20 20 20 20 70 2d 3e 7a 42 75 66 5b 70  .      p->zBuf[p
29c0: 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d 20 27 75 27  ->nUsed++] = 'u'
29d0: 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 42 75 66 5b  ;.      p->zBuf[
29e0: 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d 20 27 30  p->nUsed++] = '0
29f0: 27 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 42 75 66  ';.      p->zBuf
2a00: 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d 20 27  [p->nUsed++] = '
2a10: 30 27 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 42 75  0';.      p->zBu
2a20: 66 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d 20  f[p->nUsed++] = 
2a30: 27 30 27 20 2b 20 28 63 3e 3e 34 29 3b 0a 20 20  '0' + (c>>4);.  
2a40: 20 20 20 20 63 20 3d 20 22 30 31 32 33 34 35 36      c = "0123456
2a50: 37 38 39 61 62 63 64 65 66 22 5b 63 26 30 78 66  789abcdef"[c&0xf
2a60: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  ];.    }.    p->
2a70: 7a 42 75 66 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d  zBuf[p->nUsed++]
2a80: 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 70 2d 3e 7a   = c;.  }.  p->z
2a90: 42 75 66 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20  Buf[p->nUsed++] 
2aa0: 3d 20 27 22 27 3b 0a 20 20 61 73 73 65 72 74 28  = '"';.  assert(
2ab0: 20 70 2d 3e 6e 55 73 65 64 3c 70 2d 3e 6e 41 6c   p->nUsed<p->nAl
2ac0: 6c 6f 63 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  loc );.}../*.** 
2ad0: 41 70 70 65 6e 64 20 61 20 66 75 6e 63 74 69 6f  Append a functio
2ae0: 6e 20 70 61 72 61 6d 65 74 65 72 20 76 61 6c 75  n parameter valu
2af0: 65 20 74 6f 20 74 68 65 20 4a 53 4f 4e 20 73 74  e to the JSON st
2b00: 72 69 6e 67 20 75 6e 64 65 72 20 0a 2a 2a 20 63  ring under .** c
2b10: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  onstruction..*/.
2b20: 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e  static void json
2b30: 41 70 70 65 6e 64 56 61 6c 75 65 28 0a 20 20 4a  AppendValue(.  J
2b40: 73 6f 6e 53 74 72 69 6e 67 20 2a 70 2c 20 20 20  sonString *p,   
2b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b60: 20 41 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20   Append to this 
2b70: 4a 53 4f 4e 20 73 74 72 69 6e 67 20 2a 2f 0a 20  JSON string */. 
2b80: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
2b90: 70 56 61 6c 75 65 20 20 20 20 20 20 20 20 20 20  pValue          
2ba0: 2f 2a 20 56 61 6c 75 65 20 74 6f 20 61 70 70 65  /* Value to appe
2bb0: 6e 64 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63  nd */.){.  switc
2bc0: 68 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  h( sqlite3_value
2bd0: 5f 74 79 70 65 28 70 56 61 6c 75 65 29 20 29 7b  _type(pValue) ){
2be0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
2bf0: 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 6a  _NULL: {.      j
2c00: 73 6f 6e 41 70 70 65 6e 64 52 61 77 28 70 2c 20  sonAppendRaw(p, 
2c10: 22 6e 75 6c 6c 22 2c 20 34 29 3b 0a 20 20 20 20  "null", 4);.    
2c20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
2c30: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
2c40: 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61 73 65  NTEGER:.    case
2c50: 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b   SQLITE_FLOAT: {
2c60: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
2c70: 72 20 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68  r *z = (const ch
2c80: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
2c90: 65 5f 74 65 78 74 28 70 56 61 6c 75 65 29 3b 0a  e_text(pValue);.
2ca0: 20 20 20 20 20 20 75 33 32 20 6e 20 3d 20 28 75        u32 n = (u
2cb0: 33 32 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  32)sqlite3_value
2cc0: 5f 62 79 74 65 73 28 70 56 61 6c 75 65 29 3b 0a  _bytes(pValue);.
2cd0: 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64        jsonAppend
2ce0: 52 61 77 28 70 2c 20 7a 2c 20 6e 29 3b 0a 20 20  Raw(p, z, n);.  
2cf0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2d00: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
2d10: 5f 54 45 58 54 3a 20 7b 0a 20 20 20 20 20 20 63  _TEXT: {.      c
2d20: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28  onst char *z = (
2d30: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
2d40: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70  te3_value_text(p
2d50: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 75 33  Value);.      u3
2d60: 32 20 6e 20 3d 20 28 75 33 32 29 73 71 6c 69 74  2 n = (u32)sqlit
2d70: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70  e3_value_bytes(p
2d80: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 69 66  Value);.      if
2d90: 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
2da0: 73 75 62 74 79 70 65 28 70 56 61 6c 75 65 29 3d  subtype(pValue)=
2db0: 3d 4a 53 4f 4e 5f 53 55 42 54 59 50 45 20 29 7b  =JSON_SUBTYPE ){
2dc0: 0a 20 20 20 20 20 20 20 20 6a 73 6f 6e 41 70 70  .        jsonApp
2dd0: 65 6e 64 52 61 77 28 70 2c 20 7a 2c 20 6e 29 3b  endRaw(p, z, n);
2de0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2df0: 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64        jsonAppend
2e00: 53 74 72 69 6e 67 28 70 2c 20 7a 2c 20 6e 29 3b  String(p, z, n);
2e10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
2e20: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
2e30: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
2e40: 20 69 66 28 20 70 2d 3e 62 45 72 72 3d 3d 30 20   if( p->bErr==0 
2e50: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2e60: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
2e70: 70 2d 3e 70 43 74 78 2c 20 22 4a 53 4f 4e 20 63  p->pCtx, "JSON c
2e80: 61 6e 6e 6f 74 20 68 6f 6c 64 20 42 4c 4f 42 20  annot hold BLOB 
2e90: 76 61 6c 75 65 73 22 2c 20 2d 31 29 3b 0a 20 20  values", -1);.  
2ea0: 20 20 20 20 20 20 70 2d 3e 62 45 72 72 20 3d 20        p->bErr = 
2eb0: 32 3b 0a 20 20 20 20 20 20 20 20 6a 73 6f 6e 52  2;.        jsonR
2ec0: 65 73 65 74 28 70 29 3b 0a 20 20 20 20 20 20 7d  eset(p);.      }
2ed0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2ee0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 20 4d    }.  }.}.../* M
2ef0: 61 6b 65 20 74 68 65 20 4a 53 4f 4e 20 69 6e 20  ake the JSON in 
2f00: 70 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  p the result of 
2f10: 74 68 65 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  the SQL function
2f20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2f30: 20 6a 73 6f 6e 52 65 73 75 6c 74 28 4a 73 6f 6e   jsonResult(Json
2f40: 53 74 72 69 6e 67 20 2a 70 29 7b 0a 20 20 69 66  String *p){.  if
2f50: 28 20 70 2d 3e 62 45 72 72 3d 3d 30 20 29 7b 0a  ( p->bErr==0 ){.
2f60: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
2f70: 6c 74 5f 74 65 78 74 36 34 28 70 2d 3e 70 43 74  lt_text64(p->pCt
2f80: 78 2c 20 70 2d 3e 7a 42 75 66 2c 20 70 2d 3e 6e  x, p->zBuf, p->n
2f90: 55 73 65 64 2c 20 0a 20 20 20 20 20 20 20 20 20  Used, .         
2fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb0: 20 70 2d 3e 62 53 74 61 74 69 63 20 3f 20 53 51   p->bStatic ? SQ
2fc0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 20 3a  LITE_TRANSIENT :
2fd0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 2c 0a 20   sqlite3_free,. 
2fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ff0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
3000: 55 54 46 38 29 3b 0a 20 20 20 20 6a 73 6f 6e 5a  UTF8);.    jsonZ
3010: 65 72 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 61 73  ero(p);.  }.  as
3020: 73 65 72 74 28 20 70 2d 3e 62 53 74 61 74 69 63  sert( p->bStatic
3030: 20 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   );.}../********
3040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3080: 2a 2a 0a 2a 2a 20 55 74 69 6c 69 74 79 20 72 6f  **.** Utility ro
3090: 75 74 69 6e 65 73 20 66 6f 72 20 64 65 61 6c 69  utines for deali
30a0: 6e 67 20 77 69 74 68 20 4a 73 6f 6e 4e 6f 64 65  ng with JsonNode
30b0: 20 61 6e 64 20 4a 73 6f 6e 50 61 72 73 65 20 6f   and JsonParse o
30c0: 62 6a 65 63 74 73 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  bjects.*********
30d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3110: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
3120: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
3130: 6f 6e 73 65 63 75 74 69 76 65 20 4a 73 6f 6e 4e  onsecutive JsonN
3140: 6f 64 65 20 73 6c 6f 74 73 20 6e 65 65 64 20 74  ode slots need t
3150: 6f 20 72 65 70 72 65 73 65 6e 74 0a 2a 2a 20 74  o represent.** t
3160: 68 65 20 70 61 72 73 65 64 20 4a 53 4f 4e 20 61  he parsed JSON a
3170: 74 20 70 4e 6f 64 65 2e 20 20 54 68 65 20 6d 69  t pNode.  The mi
3180: 6e 69 6d 75 6d 20 61 6e 73 77 65 72 20 69 73 20  nimum answer is 
3190: 31 2e 20 20 46 6f 72 20 41 52 52 41 59 20 61 6e  1.  For ARRAY an
31a0: 64 0a 2a 2a 20 4f 42 4a 45 43 54 20 74 79 70 65  d.** OBJECT type
31b0: 73 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6d 69  s, the number mi
31c0: 67 68 74 20 62 65 20 6c 61 72 67 65 72 2e 0a 2a  ght be larger..*
31d0: 2a 0a 2a 2a 20 41 70 70 65 6e 64 65 64 20 65 6c  *.** Appended el
31e0: 65 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74 20 63  ements are not c
31f0: 6f 75 6e 74 65 64 2e 20 20 54 68 65 20 76 61 6c  ounted.  The val
3200: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
3210: 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 62 79 20  he number.** by 
3220: 77 68 69 63 68 20 74 68 65 20 4a 73 6f 6e 4e 6f  which the JsonNo
3230: 64 65 20 63 6f 75 6e 74 65 72 20 73 68 6f 75 6c  de counter shoul
3240: 64 20 69 6e 63 72 65 6d 65 6e 74 20 69 6e 20 6f  d increment in o
3250: 72 64 65 72 20 74 6f 20 67 6f 20 74 6f 20 74 68  rder to go to th
3260: 65 0a 2a 2a 20 6e 65 78 74 20 70 65 65 72 20 76  e.** next peer v
3270: 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
3280: 75 33 32 20 6a 73 6f 6e 4e 6f 64 65 53 69 7a 65  u32 jsonNodeSize
3290: 28 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65  (JsonNode *pNode
32a0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 4e 6f 64  ){.  return pNod
32b0: 65 2d 3e 65 54 79 70 65 3e 3d 4a 53 4f 4e 5f 41  e->eType>=JSON_A
32c0: 52 52 41 59 20 3f 20 70 4e 6f 64 65 2d 3e 6e 2b  RRAY ? pNode->n+
32d0: 31 20 3a 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1 : 1;.}../*.** 
32e0: 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f  Reclaim all memo
32f0: 72 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ry allocated by 
3300: 61 20 4a 73 6f 6e 50 61 72 73 65 20 6f 62 6a 65  a JsonParse obje
3310: 63 74 2e 20 20 42 75 74 20 64 6f 20 6e 6f 74 0a  ct.  But do not.
3320: 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 4a 73  ** delete the Js
3330: 6f 6e 50 61 72 73 65 20 6f 62 6a 65 63 74 20 69  onParse object i
3340: 74 73 65 6c 66 2e 0a 2a 2f 0a 73 74 61 74 69 63  tself..*/.static
3350: 20 76 6f 69 64 20 6a 73 6f 6e 50 61 72 73 65 52   void jsonParseR
3360: 65 73 65 74 28 4a 73 6f 6e 50 61 72 73 65 20 2a  eset(JsonParse *
3370: 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
3380: 65 33 5f 66 72 65 65 28 70 50 61 72 73 65 2d 3e  e3_free(pParse->
3390: 61 4e 6f 64 65 29 3b 0a 20 20 70 50 61 72 73 65  aNode);.  pParse
33a0: 2d 3e 61 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 70  ->aNode = 0;.  p
33b0: 50 61 72 73 65 2d 3e 6e 4e 6f 64 65 20 3d 20 30  Parse->nNode = 0
33c0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 41 6c 6c  ;.  pParse->nAll
33d0: 6f 63 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  oc = 0;.  sqlite
33e0: 33 5f 66 72 65 65 28 70 50 61 72 73 65 2d 3e 61  3_free(pParse->a
33f0: 55 70 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 61  Up);.  pParse->a
3400: 55 70 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Up = 0;.}../*.**
3410: 20 46 72 65 65 20 61 20 4a 73 6f 6e 50 61 72 73   Free a JsonPars
3420: 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 61  e object that wa
3430: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
3440: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
3450: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3460: 20 6a 73 6f 6e 50 61 72 73 65 46 72 65 65 28 4a   jsonParseFree(J
3470: 73 6f 6e 50 61 72 73 65 20 2a 70 50 61 72 73 65  sonParse *pParse
3480: 29 7b 0a 20 20 6a 73 6f 6e 50 61 72 73 65 52 65  ){.  jsonParseRe
3490: 73 65 74 28 70 50 61 72 73 65 29 3b 0a 20 20 73  set(pParse);.  s
34a0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 72  qlite3_free(pPar
34b0: 73 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  se);.}../*.** Co
34c0: 6e 76 65 72 74 20 74 68 65 20 4a 73 6f 6e 4e 6f  nvert the JsonNo
34d0: 64 65 20 70 4e 6f 64 65 20 69 6e 74 6f 20 61 20  de pNode into a 
34e0: 70 75 72 65 20 4a 53 4f 4e 20 73 74 72 69 6e 67  pure JSON string
34f0: 20 61 6e 64 0a 2a 2a 20 61 70 70 65 6e 64 20 74   and.** append t
3500: 6f 20 70 4f 75 74 2e 20 20 53 75 62 73 75 62 73  o pOut.  Subsubs
3510: 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 73 6f  tructure is also
3520: 20 69 6e 63 6c 75 64 65 64 2e 20 20 52 65 74 75   included.  Retu
3530: 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  rn.** the number
3540: 20 6f 66 20 4a 73 6f 6e 4e 6f 64 65 20 6f 62 6a   of JsonNode obj
3550: 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65 6e  ects that are en
3560: 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  coded..*/.static
3570: 20 76 6f 69 64 20 6a 73 6f 6e 52 65 6e 64 65 72   void jsonRender
3580: 4e 6f 64 65 28 0a 20 20 4a 73 6f 6e 4e 6f 64 65  Node(.  JsonNode
3590: 20 2a 70 4e 6f 64 65 2c 20 20 20 20 20 20 20 20   *pNode,        
35a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 6f         /* The no
35b0: 64 65 20 74 6f 20 72 65 6e 64 65 72 20 2a 2f 0a  de to render */.
35c0: 20 20 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70 4f    JsonString *pO
35d0: 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ut,             
35e0: 20 2f 2a 20 57 72 69 74 65 20 4a 53 4f 4e 20 68   /* Write JSON h
35f0: 65 72 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ere */.  sqlite3
3600: 5f 76 61 6c 75 65 20 2a 2a 61 52 65 70 6c 61 63  _value **aReplac
3610: 65 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6c 61  e       /* Repla
3620: 63 65 6d 65 6e 74 20 76 61 6c 75 65 73 20 2a 2f  cement values */
3630: 0a 29 7b 0a 20 20 69 66 28 20 70 4e 6f 64 65 2d  .){.  if( pNode-
3640: 3e 6a 6e 46 6c 61 67 73 20 26 20 28 4a 4e 4f 44  >jnFlags & (JNOD
3650: 45 5f 52 45 50 4c 41 43 45 7c 4a 4e 4f 44 45 5f  E_REPLACE|JNODE_
3660: 50 41 54 43 48 29 20 29 7b 0a 20 20 20 20 69 66  PATCH) ){.    if
3670: 28 20 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73  ( pNode->jnFlags
3680: 20 26 20 4a 4e 4f 44 45 5f 52 45 50 4c 41 43 45   & JNODE_REPLACE
3690: 20 29 7b 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70   ){.      jsonAp
36a0: 70 65 6e 64 56 61 6c 75 65 28 70 4f 75 74 2c 20  pendValue(pOut, 
36b0: 61 52 65 70 6c 61 63 65 5b 70 4e 6f 64 65 2d 3e  aReplace[pNode->
36c0: 75 2e 69 52 65 70 6c 61 63 65 5d 29 3b 0a 20 20  u.iReplace]);.  
36d0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
36e0: 7d 0a 20 20 20 20 70 4e 6f 64 65 20 3d 20 70 4e  }.    pNode = pN
36f0: 6f 64 65 2d 3e 75 2e 70 50 61 74 63 68 3b 0a 20  ode->u.pPatch;. 
3700: 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70 4e 6f   }.  switch( pNo
3710: 64 65 2d 3e 65 54 79 70 65 20 29 7b 0a 20 20 20  de->eType ){.   
3720: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
3730: 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d    assert( pNode-
3740: 3e 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f 4e 55 4c  >eType==JSON_NUL
3750: 4c 20 29 3b 0a 20 20 20 20 20 20 6a 73 6f 6e 41  L );.      jsonA
3760: 70 70 65 6e 64 52 61 77 28 70 4f 75 74 2c 20 22  ppendRaw(pOut, "
3770: 6e 75 6c 6c 22 2c 20 34 29 3b 0a 20 20 20 20 20  null", 4);.     
3780: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
3790: 20 20 63 61 73 65 20 4a 53 4f 4e 5f 54 52 55 45    case JSON_TRUE
37a0: 3a 20 7b 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70  : {.      jsonAp
37b0: 70 65 6e 64 52 61 77 28 70 4f 75 74 2c 20 22 74  pendRaw(pOut, "t
37c0: 72 75 65 22 2c 20 34 29 3b 0a 20 20 20 20 20 20  rue", 4);.      
37d0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
37e0: 20 63 61 73 65 20 4a 53 4f 4e 5f 46 41 4c 53 45   case JSON_FALSE
37f0: 3a 20 7b 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70  : {.      jsonAp
3800: 70 65 6e 64 52 61 77 28 70 4f 75 74 2c 20 22 66  pendRaw(pOut, "f
3810: 61 6c 73 65 22 2c 20 35 29 3b 0a 20 20 20 20 20  alse", 5);.     
3820: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
3830: 20 20 63 61 73 65 20 4a 53 4f 4e 5f 53 54 52 49    case JSON_STRI
3840: 4e 47 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  NG: {.      if( 
3850: 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73 20 26  pNode->jnFlags &
3860: 20 4a 4e 4f 44 45 5f 52 41 57 20 29 7b 0a 20 20   JNODE_RAW ){.  
3870: 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64        jsonAppend
3880: 53 74 72 69 6e 67 28 70 4f 75 74 2c 20 70 4e 6f  String(pOut, pNo
3890: 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 2c  de->u.zJContent,
38a0: 20 70 4e 6f 64 65 2d 3e 6e 29 3b 0a 20 20 20 20   pNode->n);.    
38b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
38c0: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c   }.      /* Fall
38d0: 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20 74 68   through into th
38e0: 65 20 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20  e next case */. 
38f0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 53     }.    case JS
3900: 4f 4e 5f 52 45 41 4c 3a 0a 20 20 20 20 63 61 73  ON_REAL:.    cas
3910: 65 20 4a 53 4f 4e 5f 49 4e 54 3a 20 7b 0a 20 20  e JSON_INT: {.  
3920: 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 52 61      jsonAppendRa
3930: 77 28 70 4f 75 74 2c 20 70 4e 6f 64 65 2d 3e 75  w(pOut, pNode->u
3940: 2e 7a 4a 43 6f 6e 74 65 6e 74 2c 20 70 4e 6f 64  .zJContent, pNod
3950: 65 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  e->n);.      bre
3960: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
3970: 73 65 20 4a 53 4f 4e 5f 41 52 52 41 59 3a 20 7b  se JSON_ARRAY: {
3980: 0a 20 20 20 20 20 20 75 33 32 20 6a 20 3d 20 31  .      u32 j = 1
3990: 3b 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65  ;.      jsonAppe
39a0: 6e 64 43 68 61 72 28 70 4f 75 74 2c 20 27 5b 27  ndChar(pOut, '['
39b0: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29  );.      for(;;)
39c0: 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
39d0: 20 6a 3c 3d 70 4e 6f 64 65 2d 3e 6e 20 29 7b 0a   j<=pNode->n ){.
39e0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
39f0: 4e 6f 64 65 5b 6a 5d 2e 6a 6e 46 6c 61 67 73 20  Node[j].jnFlags 
3a00: 26 20 4a 4e 4f 44 45 5f 52 45 4d 4f 56 45 29 3d  & JNODE_REMOVE)=
3a10: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
3a20: 20 20 6a 73 6f 6e 41 70 70 65 6e 64 53 65 70 61    jsonAppendSepa
3a30: 72 61 74 6f 72 28 70 4f 75 74 29 3b 0a 20 20 20  rator(pOut);.   
3a40: 20 20 20 20 20 20 20 20 20 6a 73 6f 6e 52 65 6e           jsonRen
3a50: 64 65 72 4e 6f 64 65 28 26 70 4e 6f 64 65 5b 6a  derNode(&pNode[j
3a60: 5d 2c 20 70 4f 75 74 2c 20 61 52 65 70 6c 61 63  ], pOut, aReplac
3a70: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
3a80: 20 20 20 20 20 20 20 20 20 20 6a 20 2b 3d 20 6a            j += j
3a90: 73 6f 6e 4e 6f 64 65 53 69 7a 65 28 26 70 4e 6f  sonNodeSize(&pNo
3aa0: 64 65 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20  de[j]);.        
3ab0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  }.        if( (p
3ac0: 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73 20 26 20  Node->jnFlags & 
3ad0: 4a 4e 4f 44 45 5f 41 50 50 45 4e 44 29 3d 3d 30  JNODE_APPEND)==0
3ae0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
3af0: 20 20 70 4e 6f 64 65 20 3d 20 26 70 4e 6f 64 65    pNode = &pNode
3b00: 5b 70 4e 6f 64 65 2d 3e 75 2e 69 41 70 70 65 6e  [pNode->u.iAppen
3b10: 64 5d 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20  d];.        j = 
3b20: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
3b30: 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61 72 28   jsonAppendChar(
3b40: 70 4f 75 74 2c 20 27 5d 27 29 3b 0a 20 20 20 20  pOut, ']');.    
3b50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3b60: 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f 4f 42 4a     case JSON_OBJ
3b70: 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 75 33 32  ECT: {.      u32
3b80: 20 6a 20 3d 20 31 3b 0a 20 20 20 20 20 20 6a 73   j = 1;.      js
3b90: 6f 6e 41 70 70 65 6e 64 43 68 61 72 28 70 4f 75  onAppendChar(pOu
3ba0: 74 2c 20 27 7b 27 29 3b 0a 20 20 20 20 20 20 66  t, '{');.      f
3bb0: 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20  or(;;){.        
3bc0: 77 68 69 6c 65 28 20 6a 3c 3d 70 4e 6f 64 65 2d  while( j<=pNode-
3bd0: 3e 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >n ){.          
3be0: 69 66 28 20 28 70 4e 6f 64 65 5b 6a 2b 31 5d 2e  if( (pNode[j+1].
3bf0: 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f  jnFlags & JNODE_
3c00: 52 45 4d 4f 56 45 29 3d 3d 30 20 29 7b 0a 20 20  REMOVE)==0 ){.  
3c10: 20 20 20 20 20 20 20 20 20 20 6a 73 6f 6e 41 70            jsonAp
3c20: 70 65 6e 64 53 65 70 61 72 61 74 6f 72 28 70 4f  pendSeparator(pO
3c30: 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ut);.           
3c40: 20 6a 73 6f 6e 52 65 6e 64 65 72 4e 6f 64 65 28   jsonRenderNode(
3c50: 26 70 4e 6f 64 65 5b 6a 5d 2c 20 70 4f 75 74 2c  &pNode[j], pOut,
3c60: 20 61 52 65 70 6c 61 63 65 29 3b 0a 20 20 20 20   aReplace);.    
3c70: 20 20 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65          jsonAppe
3c80: 6e 64 43 68 61 72 28 70 4f 75 74 2c 20 27 3a 27  ndChar(pOut, ':'
3c90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  );.            j
3ca0: 73 6f 6e 52 65 6e 64 65 72 4e 6f 64 65 28 26 70  sonRenderNode(&p
3cb0: 4e 6f 64 65 5b 6a 2b 31 5d 2c 20 70 4f 75 74 2c  Node[j+1], pOut,
3cc0: 20 61 52 65 70 6c 61 63 65 29 3b 0a 20 20 20 20   aReplace);.    
3cd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3ce0: 20 20 6a 20 2b 3d 20 31 20 2b 20 6a 73 6f 6e 4e    j += 1 + jsonN
3cf0: 6f 64 65 53 69 7a 65 28 26 70 4e 6f 64 65 5b 6a  odeSize(&pNode[j
3d00: 2b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  +1]);.        }.
3d10: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4e 6f          if( (pNo
3d20: 64 65 2d 3e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e  de->jnFlags & JN
3d30: 4f 44 45 5f 41 50 50 45 4e 44 29 3d 3d 30 20 29  ODE_APPEND)==0 )
3d40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
3d50: 70 4e 6f 64 65 20 3d 20 26 70 4e 6f 64 65 5b 70  pNode = &pNode[p
3d60: 4e 6f 64 65 2d 3e 75 2e 69 41 70 70 65 6e 64 5d  Node->u.iAppend]
3d70: 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 31 3b  ;.        j = 1;
3d80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6a  .      }.      j
3d90: 73 6f 6e 41 70 70 65 6e 64 43 68 61 72 28 70 4f  sonAppendChar(pO
3da0: 75 74 2c 20 27 7d 27 29 3b 0a 20 20 20 20 20 20  ut, '}');.      
3db0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
3dc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
3dd0: 20 61 20 4a 73 6f 6e 4e 6f 64 65 20 61 6e 64 20   a JsonNode and 
3de0: 61 6c 6c 20 69 74 73 20 64 65 73 63 65 6e 64 65  all its descende
3df0: 6e 74 73 20 61 73 20 61 20 4a 53 4f 4e 20 73 74  nts as a JSON st
3e00: 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ring..*/.static 
3e10: 76 6f 69 64 20 6a 73 6f 6e 52 65 74 75 72 6e 4a  void jsonReturnJ
3e20: 73 6f 6e 28 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20  son(.  JsonNode 
3e30: 2a 70 4e 6f 64 65 2c 20 20 20 20 20 20 20 20 20  *pNode,         
3e40: 20 20 20 2f 2a 20 4e 6f 64 65 20 74 6f 20 72 65     /* Node to re
3e50: 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  turn */.  sqlite
3e60: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
3e70: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
3e80: 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 66  value for this f
3e90: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  unction */.  sql
3ea0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 52 65  ite3_value **aRe
3eb0: 70 6c 61 63 65 20 20 20 20 2f 2a 20 41 72 72 61  place    /* Arra
3ec0: 79 20 6f 66 20 72 65 70 6c 61 63 65 6d 65 6e 74  y of replacement
3ed0: 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20   values */.){.  
3ee0: 4a 73 6f 6e 53 74 72 69 6e 67 20 73 3b 0a 20 20  JsonString s;.  
3ef0: 6a 73 6f 6e 49 6e 69 74 28 26 73 2c 20 70 43 74  jsonInit(&s, pCt
3f00: 78 29 3b 0a 20 20 6a 73 6f 6e 52 65 6e 64 65 72  x);.  jsonRender
3f10: 4e 6f 64 65 28 70 4e 6f 64 65 2c 20 26 73 2c 20  Node(pNode, &s, 
3f20: 61 52 65 70 6c 61 63 65 29 3b 0a 20 20 6a 73 6f  aReplace);.  jso
3f30: 6e 52 65 73 75 6c 74 28 26 73 29 3b 0a 20 20 73  nResult(&s);.  s
3f40: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 73 75  qlite3_result_su
3f50: 62 74 79 70 65 28 70 43 74 78 2c 20 4a 53 4f 4e  btype(pCtx, JSON
3f60: 5f 53 55 42 54 59 50 45 29 3b 0a 7d 0a 0a 2f 2a  _SUBTYPE);.}../*
3f70: 0a 2a 2a 20 4d 61 6b 65 20 74 68 65 20 4a 73 6f  .** Make the Jso
3f80: 6e 4e 6f 64 65 20 74 68 65 20 72 65 74 75 72 6e  nNode the return
3f90: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 66 75   value of the fu
3fa0: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
3fb0: 63 20 76 6f 69 64 20 6a 73 6f 6e 52 65 74 75 72  c void jsonRetur
3fc0: 6e 28 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70  n(.  JsonNode *p
3fd0: 4e 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20  Node,           
3fe0: 20 2f 2a 20 4e 6f 64 65 20 74 6f 20 72 65 74 75   /* Node to retu
3ff0: 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  rn */.  sqlite3_
4000: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20  context *pCtx,  
4010: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61      /* Return va
4020: 6c 75 65 20 66 6f 72 20 74 68 69 73 20 66 75 6e  lue for this fun
4030: 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  ction */.  sqlit
4040: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 52 65 70 6c  e3_value **aRepl
4050: 61 63 65 20 20 20 20 2f 2a 20 41 72 72 61 79 20  ace    /* Array 
4060: 6f 66 20 72 65 70 6c 61 63 65 6d 65 6e 74 20 76  of replacement v
4070: 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 73 77  alues */.){.  sw
4080: 69 74 63 68 28 20 70 4e 6f 64 65 2d 3e 65 54 79  itch( pNode->eTy
4090: 70 65 20 29 7b 0a 20 20 20 20 64 65 66 61 75 6c  pe ){.    defaul
40a0: 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
40b0: 74 28 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65 3d  t( pNode->eType=
40c0: 3d 4a 53 4f 4e 5f 4e 55 4c 4c 20 29 3b 0a 20 20  =JSON_NULL );.  
40d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
40e0: 6c 74 5f 6e 75 6c 6c 28 70 43 74 78 29 3b 0a 20  lt_null(pCtx);. 
40f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4100: 7d 0a 20 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f  }.    case JSON_
4110: 54 52 55 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  TRUE: {.      sq
4120: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
4130: 28 70 43 74 78 2c 20 31 29 3b 0a 20 20 20 20 20  (pCtx, 1);.     
4140: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4150: 20 20 63 61 73 65 20 4a 53 4f 4e 5f 46 41 4c 53    case JSON_FALS
4160: 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
4170: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 70 43  e3_result_int(pC
4180: 74 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  tx, 0);.      br
4190: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
41a0: 61 73 65 20 4a 53 4f 4e 5f 49 4e 54 3a 20 7b 0a  ase JSON_INT: {.
41b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
41c0: 74 36 34 20 69 20 3d 20 30 3b 0a 20 20 20 20 20  t64 i = 0;.     
41d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
41e0: 20 70 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74   pNode->u.zJCont
41f0: 65 6e 74 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  ent;.      if( z
4200: 5b 30 5d 3d 3d 27 2d 27 20 29 7b 20 7a 2b 2b 3b  [0]=='-' ){ z++;
4210: 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20   }.      while( 
4220: 7a 5b 30 5d 3e 3d 27 30 27 20 26 26 20 7a 5b 30  z[0]>='0' && z[0
4230: 5d 3c 3d 27 39 27 20 29 7b 0a 20 20 20 20 20 20  ]<='9' ){.      
4240: 20 20 75 6e 73 69 67 6e 65 64 20 76 20 3d 20 2a    unsigned v = *
4250: 28 7a 2b 2b 29 20 2d 20 27 30 27 3b 0a 20 20 20  (z++) - '0';.   
4260: 20 20 20 20 20 69 66 28 20 69 3e 3d 4c 41 52 47       if( i>=LARG
4270: 45 53 54 5f 49 4e 54 36 34 2f 31 30 20 29 7b 0a  EST_INT64/10 ){.
4280: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
4290: 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 2f 31 30  LARGEST_INT64/10
42a0: 20 29 20 67 6f 74 6f 20 69 6e 74 5f 61 73 5f 72   ) goto int_as_r
42b0: 65 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 69  eal;.          i
42c0: 66 28 20 7a 5b 30 5d 3e 3d 27 30 27 20 26 26 20  f( z[0]>='0' && 
42d0: 7a 5b 30 5d 3c 3d 27 39 27 20 29 20 67 6f 74 6f  z[0]<='9' ) goto
42e0: 20 69 6e 74 5f 61 73 5f 72 65 61 6c 3b 0a 20 20   int_as_real;.  
42f0: 20 20 20 20 20 20 20 20 69 66 28 20 76 3d 3d 39          if( v==9
4300: 20 29 20 67 6f 74 6f 20 69 6e 74 5f 61 73 5f 72   ) goto int_as_r
4310: 65 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 69  eal;.          i
4320: 66 28 20 76 3d 3d 38 20 29 7b 0a 20 20 20 20 20  f( v==8 ){.     
4330: 20 20 20 20 20 20 20 69 66 28 20 70 4e 6f 64 65         if( pNode
4340: 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 5b 30 5d  ->u.zJContent[0]
4350: 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20  =='-' ){.       
4360: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
4370: 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74 78  esult_int64(pCtx
4380: 2c 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34  , SMALLEST_INT64
4390: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
43a0: 20 67 6f 74 6f 20 69 6e 74 5f 64 6f 6e 65 3b 0a   goto int_done;.
43b0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
43c0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
43d0: 20 67 6f 74 6f 20 69 6e 74 5f 61 73 5f 72 65 61   goto int_as_rea
43e0: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  l;.            }
43f0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
4400: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
4410: 20 3d 20 69 2a 31 30 20 2b 20 76 3b 0a 20 20 20   = i*10 + v;.   
4420: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
4430: 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e  Node->u.zJConten
4440: 74 5b 30 5d 3d 3d 27 2d 27 20 29 7b 20 69 20 3d  t[0]=='-' ){ i =
4450: 20 2d 69 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c   -i; }.      sql
4460: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
4470: 34 28 70 43 74 78 2c 20 69 29 3b 0a 20 20 20 20  4(pCtx, i);.    
4480: 20 20 69 6e 74 5f 64 6f 6e 65 3a 0a 20 20 20 20    int_done:.    
4490: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69    break;.      i
44a0: 6e 74 5f 61 73 5f 72 65 61 6c 3a 20 2f 2a 20 66  nt_as_real: /* f
44b0: 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 72  all through to r
44c0: 65 61 6c 20 2a 2f 3b 0a 20 20 20 20 7d 0a 20 20  eal */;.    }.  
44d0: 20 20 63 61 73 65 20 4a 53 4f 4e 5f 52 45 41 4c    case JSON_REAL
44e0: 3a 20 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65  : {.      double
44f0: 20 72 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   r;.#ifdef SQLIT
4500: 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a 20  E_AMALGAMATION. 
4510: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
4520: 2a 7a 20 3d 20 70 4e 6f 64 65 2d 3e 75 2e 7a 4a  *z = pNode->u.zJ
4530: 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20 73  Content;.      s
4540: 71 6c 69 74 65 33 41 74 6f 46 28 7a 2c 20 26 72  qlite3AtoF(z, &r
4550: 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  , sqlite3Strlen3
4560: 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54 46  0(z), SQLITE_UTF
4570: 38 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  8);.#else.      
4580: 72 20 3d 20 73 74 72 74 6f 64 28 70 4e 6f 64 65  r = strtod(pNode
4590: 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 2c 20 30  ->u.zJContent, 0
45a0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
45b0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64  sqlite3_result_d
45c0: 6f 75 62 6c 65 28 70 43 74 78 2c 20 72 29 3b 0a  ouble(pCtx, r);.
45d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
45e0: 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 53 4f 4e   }.    case JSON
45f0: 5f 53 54 52 49 4e 47 3a 20 7b 0a 23 69 66 20 30  _STRING: {.#if 0
4600: 20 2f 2a 20 4e 65 76 65 72 20 68 61 70 70 65 6e   /* Never happen
4610: 73 20 62 65 63 61 75 73 65 20 4a 4e 4f 44 45 5f  s because JNODE_
4620: 52 41 57 20 69 73 20 6f 6e 6c 79 20 73 65 74 20  RAW is only set 
4630: 62 79 20 6a 73 6f 6e 5f 73 65 74 28 29 2c 0a 20  by json_set(),. 
4640: 20 20 20 20 20 2a 2a 20 6a 73 6f 6e 5f 69 6e 73       ** json_ins
4650: 65 72 74 28 29 20 61 6e 64 20 6a 73 6f 6e 5f 72  ert() and json_r
4660: 65 70 6c 61 63 65 28 29 20 61 6e 64 20 74 68 6f  eplace() and tho
4670: 73 65 20 72 6f 75 74 69 6e 65 73 20 64 6f 20 6e  se routines do n
4680: 6f 74 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c  ot.      ** call
4690: 20 6a 73 6f 6e 52 65 74 75 72 6e 28 29 20 2a 2f   jsonReturn() */
46a0: 0a 20 20 20 20 20 20 69 66 28 20 70 4e 6f 64 65  .      if( pNode
46b0: 2d 3e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44  ->jnFlags & JNOD
46c0: 45 5f 52 41 57 20 29 7b 0a 20 20 20 20 20 20 20  E_RAW ){.       
46d0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
46e0: 74 65 78 74 28 70 43 74 78 2c 20 70 4e 6f 64 65  text(pCtx, pNode
46f0: 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 2c 20 70  ->u.zJContent, p
4700: 4e 6f 64 65 2d 3e 6e 2c 0a 20 20 20 20 20 20 20  Node->n,.       
4710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4720: 20 20 20 20 20 53 51 4c 49 54 45 5f 54 52 41 4e       SQLITE_TRAN
4730: 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 65  SIENT);.      }e
4740: 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20 20 20 20  lse .#endif.    
4750: 20 20 61 73 73 65 72 74 28 20 28 70 4e 6f 64 65    assert( (pNode
4760: 2d 3e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44  ->jnFlags & JNOD
4770: 45 5f 52 41 57 29 3d 3d 30 20 29 3b 0a 20 20 20  E_RAW)==0 );.   
4780: 20 20 20 69 66 28 20 28 70 4e 6f 64 65 2d 3e 6a     if( (pNode->j
4790: 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 45  nFlags & JNODE_E
47a0: 53 43 41 50 45 29 3d 3d 30 20 29 7b 0a 20 20 20  SCAPE)==0 ){.   
47b0: 20 20 20 20 20 2f 2a 20 4a 53 4f 4e 20 66 6f 72       /* JSON for
47c0: 6d 61 74 74 65 64 20 77 69 74 68 6f 75 74 20 61  matted without a
47d0: 6e 79 20 62 61 63 6b 73 6c 61 73 68 2d 65 73 63  ny backslash-esc
47e0: 61 70 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  apes */.        
47f0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
4800: 65 78 74 28 70 43 74 78 2c 20 70 4e 6f 64 65 2d  ext(pCtx, pNode-
4810: 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 2b 31 2c 20  >u.zJContent+1, 
4820: 70 4e 6f 64 65 2d 3e 6e 2d 32 2c 0a 20 20 20 20  pNode->n-2,.    
4830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4840: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54          SQLITE_T
4850: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20  RANSIENT);.     
4860: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
4870: 2f 2a 20 54 72 61 6e 73 6c 61 74 65 20 4a 53 4f  /* Translate JSO
4880: 4e 20 66 6f 72 6d 61 74 74 65 64 20 73 74 72 69  N formatted stri
4890: 6e 67 20 69 6e 74 6f 20 72 61 77 20 74 65 78 74  ng into raw text
48a0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20   */.        u32 
48b0: 69 3b 0a 20 20 20 20 20 20 20 20 75 33 32 20 6e  i;.        u32 n
48c0: 20 3d 20 70 4e 6f 64 65 2d 3e 6e 3b 0a 20 20 20   = pNode->n;.   
48d0: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
48e0: 2a 7a 20 3d 20 70 4e 6f 64 65 2d 3e 75 2e 7a 4a  *z = pNode->u.zJ
48f0: 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20 20  Content;.       
4900: 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 20 20 20   char *zOut;.   
4910: 20 20 20 20 20 75 33 32 20 6a 3b 0a 20 20 20 20       u32 j;.    
4920: 20 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74      zOut = sqlit
4930: 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 2b 31 20 29  e3_malloc( n+1 )
4940: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4f  ;.        if( zO
4950: 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ut==0 ){.       
4960: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
4970: 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43  t_error_nomem(pC
4980: 74 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  tx);.          b
4990: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
49a0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 2c          for(i=1,
49b0: 20 6a 3d 30 3b 20 69 3c 6e 2d 31 3b 20 69 2b 2b   j=0; i<n-1; i++
49c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  ){.          cha
49d0: 72 20 63 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20  r c = z[i];.    
49e0: 20 20 20 20 20 20 69 66 28 20 63 21 3d 27 5c 5c        if( c!='\\
49f0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ' ){.           
4a00: 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a   zOut[j++] = c;.
4a10: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
4a20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 20 3d  .            c =
4a30: 20 7a 5b 2b 2b 69 5d 3b 0a 20 20 20 20 20 20 20   z[++i];.       
4a40: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 75 27 20       if( c=='u' 
4a50: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
4a60: 20 75 33 32 20 76 20 3d 20 30 2c 20 6b 3b 0a 20   u32 v = 0, k;. 
4a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
4a80: 28 6b 3d 30 3b 20 6b 3c 34 3b 20 69 2b 2b 2c 20  (k=0; k<4; i++, 
4a90: 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  k++){.          
4aa0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3c        assert( i<
4ab0: 6e 2d 32 20 29 3b 0a 20 20 20 20 20 20 20 20 20  n-2 );.         
4ac0: 20 20 20 20 20 20 20 63 20 3d 20 7a 5b 69 2b 31         c = z[i+1
4ad0: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
4ae0: 20 20 20 61 73 73 65 72 74 28 20 73 61 66 65 5f     assert( safe_
4af0: 69 73 78 64 69 67 69 74 28 63 29 20 29 3b 0a 20  isxdigit(c) );. 
4b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
4b10: 66 28 20 63 3c 3d 27 39 27 20 29 20 76 20 3d 20  f( c<='9' ) v = 
4b20: 76 2a 31 36 20 2b 20 63 20 2d 20 27 30 27 3b 0a  v*16 + c - '0';.
4b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b40: 65 6c 73 65 20 69 66 28 20 63 3c 3d 27 46 27 20  else if( c<='F' 
4b50: 29 20 76 20 3d 20 76 2a 31 36 20 2b 20 63 20 2d  ) v = v*16 + c -
4b60: 20 27 41 27 20 2b 20 31 30 3b 0a 20 20 20 20 20   'A' + 10;.     
4b70: 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20             else 
4b80: 76 20 3d 20 76 2a 31 36 20 2b 20 63 20 2d 20 27  v = v*16 + c - '
4b90: 61 27 20 2b 20 31 30 3b 0a 20 20 20 20 20 20 20  a' + 10;.       
4ba0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4bb0: 20 20 20 20 20 20 20 69 66 28 20 76 3d 3d 30 20         if( v==0 
4bc0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
4bd0: 20 20 20 20 20 20 20 69 66 28 20 76 3c 3d 30 78         if( v<=0x
4be0: 37 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  7f ){.          
4bf0: 20 20 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20        zOut[j++] 
4c00: 3d 20 28 63 68 61 72 29 76 3b 0a 20 20 20 20 20  = (char)v;.     
4c10: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
4c20: 66 28 20 76 3c 3d 30 78 37 66 66 20 29 7b 0a 20  f( v<=0x7ff ){. 
4c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
4c40: 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 28 63 68 61 72  Out[j++] = (char
4c50: 29 28 30 78 63 30 20 7c 20 28 76 3e 3e 36 29 29  )(0xc0 | (v>>6))
4c60: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
4c70: 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 30 78    zOut[j++] = 0x
4c80: 38 30 20 7c 20 28 76 26 30 78 33 66 29 3b 0a 20  80 | (v&0x3f);. 
4c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c               }el
4ca0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
4cb0: 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20      zOut[j++] = 
4cc0: 28 63 68 61 72 29 28 30 78 65 30 20 7c 20 28 76  (char)(0xe0 | (v
4cd0: 3e 3e 31 32 29 29 3b 0a 20 20 20 20 20 20 20 20  >>12));.        
4ce0: 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b          zOut[j++
4cf0: 5d 20 3d 20 30 78 38 30 20 7c 20 28 28 76 3e 3e  ] = 0x80 | ((v>>
4d00: 36 29 26 30 78 33 66 29 3b 0a 20 20 20 20 20 20  6)&0x3f);.      
4d10: 20 20 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 6a            zOut[j
4d20: 2b 2b 5d 20 3d 20 30 78 38 30 20 7c 20 28 76 26  ++] = 0x80 | (v&
4d30: 30 78 33 66 29 3b 0a 20 20 20 20 20 20 20 20 20  0x3f);.         
4d40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
4d50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4d60: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
4d70: 62 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b' ){.          
4d80: 20 20 20 20 20 20 63 20 3d 20 27 5c 62 27 3b 0a        c = '\b';.
4d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65                }e
4da0: 6c 73 65 20 69 66 28 20 63 3d 3d 27 66 27 20 29  lse if( c=='f' )
4db0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
4dc0: 20 20 63 20 3d 20 27 5c 66 27 3b 0a 20 20 20 20    c = '\f';.    
4dd0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
4de0: 69 66 28 20 63 3d 3d 27 6e 27 20 29 7b 0a 20 20  if( c=='n' ){.  
4df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 20                c 
4e00: 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20  = '\n';.        
4e10: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
4e20: 63 3d 3d 27 72 27 20 29 7b 0a 20 20 20 20 20 20  c=='r' ){.      
4e30: 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c            c = '\
4e40: 72 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r';.            
4e50: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
4e60: 74 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t' ){.          
4e70: 20 20 20 20 20 20 63 20 3d 20 27 5c 74 27 3b 0a        c = '\t';.
4e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
4e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4f                zO
4ea0: 75 74 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20  ut[j++] = c;.   
4eb0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
4ec0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
4ed0: 0a 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 6a 5d  .        zOut[j]
4ee0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71   = 0;.        sq
4ef0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
4f00: 74 28 70 43 74 78 2c 20 7a 4f 75 74 2c 20 6a 2c  t(pCtx, zOut, j,
4f10: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a   sqlite3_free);.
4f20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
4f30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
4f40: 61 73 65 20 4a 53 4f 4e 5f 41 52 52 41 59 3a 0a  ase JSON_ARRAY:.
4f50: 20 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f 4f 42      case JSON_OB
4f60: 4a 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 6a 73  JECT: {.      js
4f70: 6f 6e 52 65 74 75 72 6e 4a 73 6f 6e 28 70 4e 6f  onReturnJson(pNo
4f80: 64 65 2c 20 70 43 74 78 2c 20 61 52 65 70 6c 61  de, pCtx, aRepla
4f90: 63 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ce);.      break
4fa0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
4fb0: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
4fc0: 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nce */.static in
4fd0: 74 20 6a 73 6f 6e 50 61 72 73 65 41 64 64 4e 6f  t jsonParseAddNo
4fe0: 64 65 28 4a 73 6f 6e 50 61 72 73 65 2a 2c 75 33  de(JsonParse*,u3
4ff0: 32 2c 75 33 32 2c 63 6f 6e 73 74 20 63 68 61 72  2,u32,const char
5000: 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d 61 63  *);../*.** A mac
5010: 72 6f 20 74 6f 20 68 69 6e 74 20 74 6f 20 74 68  ro to hint to th
5020: 65 20 63 6f 6d 70 69 6c 65 72 20 74 68 61 74 20  e compiler that 
5030: 61 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  a function shoul
5040: 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 69 6e 6c 69  d not be.** inli
5050: 6e 65 64 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  ned..*/.#if defi
5060: 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 0a 23 20  ned(__GNUC__).# 
5070: 20 64 65 66 69 6e 65 20 4a 53 4f 4e 5f 4e 4f 49   define JSON_NOI
5080: 4e 4c 49 4e 45 20 20 5f 5f 61 74 74 72 69 62 75  NLINE  __attribu
5090: 74 65 5f 5f 28 28 6e 6f 69 6e 6c 69 6e 65 29 29  te__((noinline))
50a0: 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 5f  .#elif defined(_
50b0: 4d 53 43 5f 56 45 52 29 20 26 26 20 5f 4d 53 43  MSC_VER) && _MSC
50c0: 5f 56 45 52 3e 3d 31 33 31 30 0a 23 20 20 64 65  _VER>=1310.#  de
50d0: 66 69 6e 65 20 4a 53 4f 4e 5f 4e 4f 49 4e 4c 49  fine JSON_NOINLI
50e0: 4e 45 20 20 5f 5f 64 65 63 6c 73 70 65 63 28 6e  NE  __declspec(n
50f0: 6f 69 6e 6c 69 6e 65 29 0a 23 65 6c 73 65 0a 23  oinline).#else.#
5100: 20 20 64 65 66 69 6e 65 20 4a 53 4f 4e 5f 4e 4f    define JSON_NO
5110: 49 4e 4c 49 4e 45 0a 23 65 6e 64 69 66 0a 0a 0a  INLINE.#endif...
5120: 73 74 61 74 69 63 20 4a 53 4f 4e 5f 4e 4f 49 4e  static JSON_NOIN
5130: 4c 49 4e 45 20 69 6e 74 20 6a 73 6f 6e 50 61 72  LINE int jsonPar
5140: 73 65 41 64 64 4e 6f 64 65 45 78 70 61 6e 64 28  seAddNodeExpand(
5150: 0a 20 20 4a 73 6f 6e 50 61 72 73 65 20 2a 70 50  .  JsonParse *pP
5160: 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
5170: 41 70 70 65 6e 64 20 74 68 65 20 6e 6f 64 65 20  Append the node 
5180: 74 6f 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a  to this object *
5190: 2f 0a 20 20 75 33 32 20 65 54 79 70 65 2c 20 20  /.  u32 eType,  
51a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
51b0: 20 4e 6f 64 65 20 74 79 70 65 20 2a 2f 0a 20 20   Node type */.  
51c0: 75 33 32 20 6e 2c 20 20 20 20 20 20 20 20 20 20  u32 n,          
51d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
51e0: 74 65 6e 74 20 73 69 7a 65 20 6f 72 20 73 75 62  tent size or sub
51f0: 2d 6e 6f 64 65 20 63 6f 75 6e 74 20 2a 2f 0a 20  -node count */. 
5200: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
5210: 6e 74 65 6e 74 20 20 20 20 20 20 2f 2a 20 43 6f  ntent      /* Co
5220: 6e 74 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 75 33  ntent */.){.  u3
5230: 32 20 6e 4e 65 77 3b 0a 20 20 4a 73 6f 6e 4e 6f  2 nNew;.  JsonNo
5240: 64 65 20 2a 70 4e 65 77 3b 0a 20 20 61 73 73 65  de *pNew;.  asse
5250: 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 4e 6f 64  rt( pParse->nNod
5260: 65 3e 3d 70 50 61 72 73 65 2d 3e 6e 41 6c 6c 6f  e>=pParse->nAllo
5270: 63 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  c );.  if( pPars
5280: 65 2d 3e 6f 6f 6d 20 29 20 72 65 74 75 72 6e 20  e->oom ) return 
5290: 2d 31 3b 0a 20 20 6e 4e 65 77 20 3d 20 70 50 61  -1;.  nNew = pPa
52a0: 72 73 65 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20  rse->nAlloc*2 + 
52b0: 31 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  10;.  pNew = sql
52c0: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70  ite3_realloc64(p
52d0: 50 61 72 73 65 2d 3e 61 4e 6f 64 65 2c 20 73 69  Parse->aNode, si
52e0: 7a 65 6f 66 28 4a 73 6f 6e 4e 6f 64 65 29 2a 6e  zeof(JsonNode)*n
52f0: 4e 65 77 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  New);.  if( pNew
5300: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 72 73  ==0 ){.    pPars
5310: 65 2d 3e 6f 6f 6d 20 3d 20 31 3b 0a 20 20 20 20  e->oom = 1;.    
5320: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20  return -1;.  }. 
5330: 20 70 50 61 72 73 65 2d 3e 6e 41 6c 6c 6f 63 20   pParse->nAlloc 
5340: 3d 20 6e 4e 65 77 3b 0a 20 20 70 50 61 72 73 65  = nNew;.  pParse
5350: 2d 3e 61 4e 6f 64 65 20 3d 20 70 4e 65 77 3b 0a  ->aNode = pNew;.
5360: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
5370: 2d 3e 6e 4e 6f 64 65 3c 70 50 61 72 73 65 2d 3e  ->nNode<pParse->
5380: 6e 41 6c 6c 6f 63 20 29 3b 0a 20 20 72 65 74 75  nAlloc );.  retu
5390: 72 6e 20 6a 73 6f 6e 50 61 72 73 65 41 64 64 4e  rn jsonParseAddN
53a0: 6f 64 65 28 70 50 61 72 73 65 2c 20 65 54 79 70  ode(pParse, eTyp
53b0: 65 2c 20 6e 2c 20 7a 43 6f 6e 74 65 6e 74 29 3b  e, n, zContent);
53c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
53d0: 20 61 20 6e 65 77 20 4a 73 6f 6e 4e 6f 64 65 20   a new JsonNode 
53e0: 69 6e 73 74 61 6e 63 65 20 62 61 73 65 64 20 6f  instance based o
53f0: 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20  n the arguments 
5400: 61 6e 64 20 61 70 70 65 6e 64 20 74 68 61 74 0a  and append that.
5410: 2a 2a 20 69 6e 73 74 61 6e 63 65 20 74 6f 20 74  ** instance to t
5420: 68 65 20 4a 73 6f 6e 50 61 72 73 65 2e 20 20 52  he JsonParse.  R
5430: 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
5440: 69 6e 20 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65  in pParse->aNode
5450: 5b 5d 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 65 77  [] of the.** new
5460: 20 6e 6f 64 65 2c 20 6f 72 20 2d 31 20 69 66 20   node, or -1 if 
5470: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
5480: 69 6f 6e 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  ion fails..*/.st
5490: 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e 50 61 72  atic int jsonPar
54a0: 73 65 41 64 64 4e 6f 64 65 28 0a 20 20 4a 73 6f  seAddNode(.  Jso
54b0: 6e 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  nParse *pParse, 
54c0: 20 20 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64         /* Append
54d0: 20 74 68 65 20 6e 6f 64 65 20 74 6f 20 74 68 69   the node to thi
54e0: 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 33  s object */.  u3
54f0: 32 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20  2 eType,        
5500: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 64 65 20          /* Node 
5510: 74 79 70 65 20 2a 2f 0a 20 20 75 33 32 20 6e 2c  type */.  u32 n,
5520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5530: 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 73      /* Content s
5540: 69 7a 65 20 6f 72 20 73 75 62 2d 6e 6f 64 65 20  ize or sub-node 
5550: 63 6f 75 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  count */.  const
5560: 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 6e 74 20   char *zContent 
5570: 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20       /* Content 
5580: 2a 2f 0a 29 7b 0a 20 20 4a 73 6f 6e 4e 6f 64 65  */.){.  JsonNode
5590: 20 2a 70 3b 0a 20 20 69 66 28 20 70 50 61 72 73   *p;.  if( pPars
55a0: 65 2d 3e 6e 4e 6f 64 65 3e 3d 70 50 61 72 73 65  e->nNode>=pParse
55b0: 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  ->nAlloc ){.    
55c0: 72 65 74 75 72 6e 20 6a 73 6f 6e 50 61 72 73 65  return jsonParse
55d0: 41 64 64 4e 6f 64 65 45 78 70 61 6e 64 28 70 50  AddNodeExpand(pP
55e0: 61 72 73 65 2c 20 65 54 79 70 65 2c 20 6e 2c 20  arse, eType, n, 
55f0: 7a 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 7d 0a 20  zContent);.  }. 
5600: 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 4e   p = &pParse->aN
5610: 6f 64 65 5b 70 50 61 72 73 65 2d 3e 6e 4e 6f 64  ode[pParse->nNod
5620: 65 5d 3b 0a 20 20 70 2d 3e 65 54 79 70 65 20 3d  e];.  p->eType =
5630: 20 28 75 38 29 65 54 79 70 65 3b 0a 20 20 70 2d   (u8)eType;.  p-
5640: 3e 6a 6e 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20  >jnFlags = 0;.  
5650: 70 2d 3e 6e 20 3d 20 6e 3b 0a 20 20 70 2d 3e 75  p->n = n;.  p->u
5660: 2e 7a 4a 43 6f 6e 74 65 6e 74 20 3d 20 7a 43 6f  .zJContent = zCo
5670: 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20  ntent;.  return 
5680: 70 50 61 72 73 65 2d 3e 6e 4e 6f 64 65 2b 2b 3b  pParse->nNode++;
5690: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
56a0: 20 74 72 75 65 20 69 66 20 7a 5b 5d 20 62 65 67   true if z[] beg
56b0: 69 6e 73 20 77 69 74 68 20 34 20 28 6f 72 20 6d  ins with 4 (or m
56c0: 6f 72 65 29 20 68 65 78 61 64 65 63 69 6d 61 6c  ore) hexadecimal
56d0: 20 64 69 67 69 74 73 0a 2a 2f 0a 73 74 61 74 69   digits.*/.stati
56e0: 63 20 69 6e 74 20 6a 73 6f 6e 49 73 34 48 65 78  c int jsonIs4Hex
56f0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
5700: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
5710: 69 3d 30 3b 20 69 3c 34 3b 20 69 2b 2b 29 20 69  i=0; i<4; i++) i
5720: 66 28 20 21 73 61 66 65 5f 69 73 78 64 69 67 69  f( !safe_isxdigi
5730: 74 28 7a 5b 69 5d 29 20 29 20 72 65 74 75 72 6e  t(z[i]) ) return
5740: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   0;.  return 1;.
5750: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61  }../*.** Parse a
5760: 20 73 69 6e 67 6c 65 20 4a 53 4f 4e 20 76 61 6c   single JSON val
5770: 75 65 20 77 68 69 63 68 20 62 65 67 69 6e 73 20  ue which begins 
5780: 61 74 20 70 50 61 72 73 65 2d 3e 7a 4a 73 6f 6e  at pParse->zJson
5790: 5b 69 5d 2e 20 20 52 65 74 75 72 6e 20 74 68 65  [i].  Return the
57a0: 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65  .** index of the
57b0: 20 66 69 72 73 74 20 63 68 61 72 61 63 74 65 72   first character
57c0: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
57d0: 20 74 68 65 20 76 61 6c 75 65 20 70 61 72 73 65   the value parse
57e0: 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
57f0: 6e 65 67 61 74 69 76 65 20 66 6f 72 20 61 20 73  negative for a s
5800: 79 6e 74 61 78 20 65 72 72 6f 72 2e 20 20 53 70  yntax error.  Sp
5810: 65 63 69 61 6c 20 63 61 73 65 73 3a 20 20 72 65  ecial cases:  re
5820: 74 75 72 6e 20 2d 32 20 69 66 20 74 68 65 0a 2a  turn -2 if the.*
5830: 2a 20 66 69 72 73 74 20 6e 6f 6e 2d 77 68 69 74  * first non-whit
5840: 65 73 70 61 63 65 20 63 68 61 72 61 63 74 65 72  espace character
5850: 20 69 73 20 27 7d 27 20 61 6e 64 20 72 65 74 75   is '}' and retu
5860: 72 6e 20 2d 33 20 69 66 20 74 68 65 20 66 69 72  rn -3 if the fir
5870: 73 74 0a 2a 2a 20 6e 6f 6e 2d 77 68 69 74 65 73  st.** non-whites
5880: 70 61 63 65 20 63 68 61 72 61 63 74 65 72 20 69  pace character i
5890: 73 20 27 5d 27 2e 0a 2a 2f 0a 73 74 61 74 69 63  s ']'..*/.static
58a0: 20 69 6e 74 20 6a 73 6f 6e 50 61 72 73 65 56 61   int jsonParseVa
58b0: 6c 75 65 28 4a 73 6f 6e 50 61 72 73 65 20 2a 70  lue(JsonParse *p
58c0: 50 61 72 73 65 2c 20 75 33 32 20 69 29 7b 0a 20  Parse, u32 i){. 
58d0: 20 63 68 61 72 20 63 3b 0a 20 20 75 33 32 20 6a   char c;.  u32 j
58e0: 3b 0a 20 20 69 6e 74 20 69 54 68 69 73 3b 0a 20  ;.  int iThis;. 
58f0: 20 69 6e 74 20 78 3b 0a 20 20 4a 73 6f 6e 4e 6f   int x;.  JsonNo
5900: 64 65 20 2a 70 4e 6f 64 65 3b 0a 20 20 63 6f 6e  de *pNode;.  con
5910: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 50 61  st char *z = pPa
5920: 72 73 65 2d 3e 7a 4a 73 6f 6e 3b 0a 20 20 77 68  rse->zJson;.  wh
5930: 69 6c 65 28 20 73 61 66 65 5f 69 73 73 70 61 63  ile( safe_isspac
5940: 65 28 7a 5b 69 5d 29 20 29 7b 20 69 2b 2b 3b 20  e(z[i]) ){ i++; 
5950: 7d 0a 20 20 69 66 28 20 28 63 20 3d 20 7a 5b 69  }.  if( (c = z[i
5960: 5d 29 3d 3d 27 7b 27 20 29 7b 0a 20 20 20 20 2f  ])=='{' ){.    /
5970: 2a 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 2a  * Parse object *
5980: 2f 0a 20 20 20 20 69 54 68 69 73 20 3d 20 6a 73  /.    iThis = js
5990: 6f 6e 50 61 72 73 65 41 64 64 4e 6f 64 65 28 70  onParseAddNode(p
59a0: 50 61 72 73 65 2c 20 4a 53 4f 4e 5f 4f 42 4a 45  Parse, JSON_OBJE
59b0: 43 54 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  CT, 0, 0);.    i
59c0: 66 28 20 69 54 68 69 73 3c 30 20 29 20 72 65 74  f( iThis<0 ) ret
59d0: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 66 6f 72 28  urn -1;.    for(
59e0: 6a 3d 69 2b 31 3b 3b 6a 2b 2b 29 7b 0a 20 20 20  j=i+1;;j++){.   
59f0: 20 20 20 77 68 69 6c 65 28 20 73 61 66 65 5f 69     while( safe_i
5a00: 73 73 70 61 63 65 28 7a 5b 6a 5d 29 20 29 7b 20  sspace(z[j]) ){ 
5a10: 6a 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 69 66 28  j++; }.      if(
5a20: 20 2b 2b 70 50 61 72 73 65 2d 3e 69 44 65 70 74   ++pParse->iDept
5a30: 68 20 3e 20 4a 53 4f 4e 5f 4d 41 58 5f 44 45 50  h > JSON_MAX_DEP
5a40: 54 48 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  TH ) return -1;.
5a50: 20 20 20 20 20 20 78 20 3d 20 6a 73 6f 6e 50 61        x = jsonPa
5a60: 72 73 65 56 61 6c 75 65 28 70 50 61 72 73 65 2c  rseValue(pParse,
5a70: 20 6a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 78   j);.      if( x
5a80: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  <0 ){.        pP
5a90: 61 72 73 65 2d 3e 69 44 65 70 74 68 2d 2d 3b 0a  arse->iDepth--;.
5aa0: 20 20 20 20 20 20 20 20 69 66 28 20 78 3d 3d 28          if( x==(
5ab0: 2d 32 29 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  -2) && pParse->n
5ac0: 4e 6f 64 65 3d 3d 28 75 33 32 29 69 54 68 69 73  Node==(u32)iThis
5ad0: 2b 31 20 29 20 72 65 74 75 72 6e 20 6a 2b 31 3b  +1 ) return j+1;
5ae0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
5af0: 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
5b00: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6f 6f    if( pParse->oo
5b10: 6d 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  m ) return -1;. 
5b20: 20 20 20 20 20 70 4e 6f 64 65 20 3d 20 26 70 50       pNode = &pP
5b30: 61 72 73 65 2d 3e 61 4e 6f 64 65 5b 70 50 61 72  arse->aNode[pPar
5b40: 73 65 2d 3e 6e 4e 6f 64 65 2d 31 5d 3b 0a 20 20  se->nNode-1];.  
5b50: 20 20 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 65      if( pNode->e
5b60: 54 79 70 65 21 3d 4a 53 4f 4e 5f 53 54 52 49 4e  Type!=JSON_STRIN
5b70: 47 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  G ) return -1;. 
5b80: 20 20 20 20 20 70 4e 6f 64 65 2d 3e 6a 6e 46 6c       pNode->jnFl
5b90: 61 67 73 20 7c 3d 20 4a 4e 4f 44 45 5f 4c 41 42  ags |= JNODE_LAB
5ba0: 45 4c 3b 0a 20 20 20 20 20 20 6a 20 3d 20 78 3b  EL;.      j = x;
5bb0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 73 61  .      while( sa
5bc0: 66 65 5f 69 73 73 70 61 63 65 28 7a 5b 6a 5d 29  fe_isspace(z[j])
5bd0: 20 29 7b 20 6a 2b 2b 3b 20 7d 0a 20 20 20 20 20   ){ j++; }.     
5be0: 20 69 66 28 20 7a 5b 6a 5d 21 3d 27 3a 27 20 29   if( z[j]!=':' )
5bf0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
5c00: 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 78 20 3d    j++;.      x =
5c10: 20 6a 73 6f 6e 50 61 72 73 65 56 61 6c 75 65 28   jsonParseValue(
5c20: 70 50 61 72 73 65 2c 20 6a 29 3b 0a 20 20 20 20  pParse, j);.    
5c30: 20 20 70 50 61 72 73 65 2d 3e 69 44 65 70 74 68    pParse->iDepth
5c40: 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3c  --;.      if( x<
5c50: 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  0 ) return -1;. 
5c60: 20 20 20 20 20 6a 20 3d 20 78 3b 0a 20 20 20 20       j = x;.    
5c70: 20 20 77 68 69 6c 65 28 20 73 61 66 65 5f 69 73    while( safe_is
5c80: 73 70 61 63 65 28 7a 5b 6a 5d 29 20 29 7b 20 6a  space(z[j]) ){ j
5c90: 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 63 20 3d 20  ++; }.      c = 
5ca0: 7a 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  z[j];.      if( 
5cb0: 63 3d 3d 27 2c 27 20 29 20 63 6f 6e 74 69 6e 75  c==',' ) continu
5cc0: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 63 21 3d  e;.      if( c!=
5cd0: 27 7d 27 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  '}' ) return -1;
5ce0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5cf0: 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
5d00: 61 4e 6f 64 65 5b 69 54 68 69 73 5d 2e 6e 20 3d  aNode[iThis].n =
5d10: 20 70 50 61 72 73 65 2d 3e 6e 4e 6f 64 65 20 2d   pParse->nNode -
5d20: 20 28 75 33 32 29 69 54 68 69 73 20 2d 20 31 3b   (u32)iThis - 1;
5d30: 0a 20 20 20 20 72 65 74 75 72 6e 20 6a 2b 31 3b  .    return j+1;
5d40: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d  .  }else if( c==
5d50: 27 5b 27 20 29 7b 0a 20 20 20 20 2f 2a 20 50 61  '[' ){.    /* Pa
5d60: 72 73 65 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  rse array */.   
5d70: 20 69 54 68 69 73 20 3d 20 6a 73 6f 6e 50 61 72   iThis = jsonPar
5d80: 73 65 41 64 64 4e 6f 64 65 28 70 50 61 72 73 65  seAddNode(pParse
5d90: 2c 20 4a 53 4f 4e 5f 41 52 52 41 59 2c 20 30 2c  , JSON_ARRAY, 0,
5da0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 69 54 68   0);.    if( iTh
5db0: 69 73 3c 30 20 29 20 72 65 74 75 72 6e 20 2d 31  is<0 ) return -1
5dc0: 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b  ;.    for(j=i+1;
5dd0: 3b 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 69  ;j++){.      whi
5de0: 6c 65 28 20 73 61 66 65 5f 69 73 73 70 61 63 65  le( safe_isspace
5df0: 28 7a 5b 6a 5d 29 20 29 7b 20 6a 2b 2b 3b 20 7d  (z[j]) ){ j++; }
5e00: 0a 20 20 20 20 20 20 69 66 28 20 2b 2b 70 50 61  .      if( ++pPa
5e10: 72 73 65 2d 3e 69 44 65 70 74 68 20 3e 20 4a 53  rse->iDepth > JS
5e20: 4f 4e 5f 4d 41 58 5f 44 45 50 54 48 20 29 20 72  ON_MAX_DEPTH ) r
5e30: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
5e40: 78 20 3d 20 6a 73 6f 6e 50 61 72 73 65 56 61 6c  x = jsonParseVal
5e50: 75 65 28 70 50 61 72 73 65 2c 20 6a 29 3b 0a 20  ue(pParse, j);. 
5e60: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 69 44 65       pParse->iDe
5e70: 70 74 68 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28  pth--;.      if(
5e80: 20 78 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20   x<0 ){.        
5e90: 69 66 28 20 78 3d 3d 28 2d 33 29 20 26 26 20 70  if( x==(-3) && p
5ea0: 50 61 72 73 65 2d 3e 6e 4e 6f 64 65 3d 3d 28 75  Parse->nNode==(u
5eb0: 33 32 29 69 54 68 69 73 2b 31 20 29 20 72 65 74  32)iThis+1 ) ret
5ec0: 75 72 6e 20 6a 2b 31 3b 0a 20 20 20 20 20 20 20  urn j+1;.       
5ed0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
5ee0: 20 20 7d 0a 20 20 20 20 20 20 6a 20 3d 20 78 3b    }.      j = x;
5ef0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 73 61  .      while( sa
5f00: 66 65 5f 69 73 73 70 61 63 65 28 7a 5b 6a 5d 29  fe_isspace(z[j])
5f10: 20 29 7b 20 6a 2b 2b 3b 20 7d 0a 20 20 20 20 20   ){ j++; }.     
5f20: 20 63 20 3d 20 7a 5b 6a 5d 3b 0a 20 20 20 20 20   c = z[j];.     
5f30: 20 69 66 28 20 63 3d 3d 27 2c 27 20 29 20 63 6f   if( c==',' ) co
5f40: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
5f50: 28 20 63 21 3d 27 5d 27 20 29 20 72 65 74 75 72  ( c!=']' ) retur
5f60: 6e 20 2d 31 3b 0a 20 20 20 20 20 20 62 72 65 61  n -1;.      brea
5f70: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  k;.    }.    pPa
5f80: 72 73 65 2d 3e 61 4e 6f 64 65 5b 69 54 68 69 73  rse->aNode[iThis
5f90: 5d 2e 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4e  ].n = pParse->nN
5fa0: 6f 64 65 20 2d 20 28 75 33 32 29 69 54 68 69 73  ode - (u32)iThis
5fb0: 20 2d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   - 1;.    return
5fc0: 20 6a 2b 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66   j+1;.  }else if
5fd0: 28 20 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20  ( c=='"' ){.    
5fe0: 2f 2a 20 50 61 72 73 65 20 73 74 72 69 6e 67 20  /* Parse string 
5ff0: 2a 2f 0a 20 20 20 20 75 38 20 6a 6e 46 6c 61 67  */.    u8 jnFlag
6000: 73 20 3d 20 30 3b 0a 20 20 20 20 6a 20 3d 20 69  s = 0;.    j = i
6010: 2b 31 3b 0a 20 20 20 20 66 6f 72 28 3b 3b 29 7b  +1;.    for(;;){
6020: 0a 20 20 20 20 20 20 63 20 3d 20 7a 5b 6a 5d 3b  .      c = z[j];
6030: 0a 20 20 20 20 20 20 69 66 28 20 28 63 20 26 20  .      if( (c & 
6040: 7e 30 78 31 66 29 3d 3d 30 20 29 7b 0a 20 20 20  ~0x1f)==0 ){.   
6050: 20 20 20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20       /* Control 
6060: 63 68 61 72 61 63 74 65 72 73 20 61 72 65 20 6e  characters are n
6070: 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 73 74  ot allowed in st
6080: 72 69 6e 67 73 20 2a 2f 0a 20 20 20 20 20 20 20  rings */.       
6090: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
60a0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d    }.      if( c=
60b0: 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 20  ='\\' ){.       
60c0: 20 63 20 3d 20 7a 5b 2b 2b 6a 5d 3b 0a 20 20 20   c = z[++j];.   
60d0: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 22 27 20       if( c=='"' 
60e0: 7c 7c 20 63 3d 3d 27 5c 5c 27 20 7c 7c 20 63 3d  || c=='\\' || c=
60f0: 3d 27 2f 27 20 7c 7c 20 63 3d 3d 27 62 27 20 7c  ='/' || c=='b' |
6100: 7c 20 63 3d 3d 27 66 27 0a 20 20 20 20 20 20 20  | c=='f'.       
6110: 20 20 20 20 7c 7c 20 63 3d 3d 27 6e 27 20 7c 7c      || c=='n' ||
6120: 20 63 3d 3d 27 72 27 20 7c 7c 20 63 3d 3d 27 74   c=='r' || c=='t
6130: 27 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  '.           || 
6140: 28 63 3d 3d 27 75 27 20 26 26 20 6a 73 6f 6e 49  (c=='u' && jsonI
6150: 73 34 48 65 78 28 7a 2b 6a 2b 31 29 29 20 29 7b  s4Hex(z+j+1)) ){
6160: 0a 20 20 20 20 20 20 20 20 20 20 6a 6e 46 6c 61  .          jnFla
6170: 67 73 20 3d 20 4a 4e 4f 44 45 5f 45 53 43 41 50  gs = JNODE_ESCAP
6180: 45 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  E;.        }else
6190: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
61a0: 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d  rn -1;.        }
61b0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
61c0: 20 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20   c=='"' ){.     
61d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
61e0: 7d 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20  }.      j++;.   
61f0: 20 7d 0a 20 20 20 20 6a 73 6f 6e 50 61 72 73 65   }.    jsonParse
6200: 41 64 64 4e 6f 64 65 28 70 50 61 72 73 65 2c 20  AddNode(pParse, 
6210: 4a 53 4f 4e 5f 53 54 52 49 4e 47 2c 20 6a 2b 31  JSON_STRING, j+1
6220: 2d 69 2c 20 26 7a 5b 69 5d 29 3b 0a 20 20 20 20  -i, &z[i]);.    
6230: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6f 6f 6d  if( !pParse->oom
6240: 20 29 20 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65   ) pParse->aNode
6250: 5b 70 50 61 72 73 65 2d 3e 6e 4e 6f 64 65 2d 31  [pParse->nNode-1
6260: 5d 2e 6a 6e 46 6c 61 67 73 20 3d 20 6a 6e 46 6c  ].jnFlags = jnFl
6270: 61 67 73 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ags;.    return 
6280: 6a 2b 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  j+1;.  }else if(
6290: 20 63 3d 3d 27 6e 27 0a 20 20 20 20 20 20 20 20   c=='n'.        
62a0: 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 2b 69 2c   && strncmp(z+i,
62b0: 22 6e 75 6c 6c 22 2c 34 29 3d 3d 30 0a 20 20 20  "null",4)==0.   
62c0: 20 20 20 20 20 20 26 26 20 21 73 61 66 65 5f 69        && !safe_i
62d0: 73 61 6c 6e 75 6d 28 7a 5b 69 2b 34 5d 29 20 29  salnum(z[i+4]) )
62e0: 7b 0a 20 20 20 20 6a 73 6f 6e 50 61 72 73 65 41  {.    jsonParseA
62f0: 64 64 4e 6f 64 65 28 70 50 61 72 73 65 2c 20 4a  ddNode(pParse, J
6300: 53 4f 4e 5f 4e 55 4c 4c 2c 20 30 2c 20 30 29 3b  SON_NULL, 0, 0);
6310: 0a 20 20 20 20 72 65 74 75 72 6e 20 69 2b 34 3b  .    return i+4;
6320: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d  .  }else if( c==
6330: 27 74 27 0a 20 20 20 20 20 20 20 20 20 26 26 20  't'.         && 
6340: 73 74 72 6e 63 6d 70 28 7a 2b 69 2c 22 74 72 75  strncmp(z+i,"tru
6350: 65 22 2c 34 29 3d 3d 30 0a 20 20 20 20 20 20 20  e",4)==0.       
6360: 20 20 26 26 20 21 73 61 66 65 5f 69 73 61 6c 6e    && !safe_isaln
6370: 75 6d 28 7a 5b 69 2b 34 5d 29 20 29 7b 0a 20 20  um(z[i+4]) ){.  
6380: 20 20 6a 73 6f 6e 50 61 72 73 65 41 64 64 4e 6f    jsonParseAddNo
6390: 64 65 28 70 50 61 72 73 65 2c 20 4a 53 4f 4e 5f  de(pParse, JSON_
63a0: 54 52 55 45 2c 20 30 2c 20 30 29 3b 0a 20 20 20  TRUE, 0, 0);.   
63b0: 20 72 65 74 75 72 6e 20 69 2b 34 3b 0a 20 20 7d   return i+4;.  }
63c0: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 66 27 0a  else if( c=='f'.
63d0: 20 20 20 20 20 20 20 20 20 26 26 20 73 74 72 6e           && strn
63e0: 63 6d 70 28 7a 2b 69 2c 22 66 61 6c 73 65 22 2c  cmp(z+i,"false",
63f0: 35 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  5)==0.         &
6400: 26 20 21 73 61 66 65 5f 69 73 61 6c 6e 75 6d 28  & !safe_isalnum(
6410: 7a 5b 69 2b 35 5d 29 20 29 7b 0a 20 20 20 20 6a  z[i+5]) ){.    j
6420: 73 6f 6e 50 61 72 73 65 41 64 64 4e 6f 64 65 28  sonParseAddNode(
6430: 70 50 61 72 73 65 2c 20 4a 53 4f 4e 5f 46 41 4c  pParse, JSON_FAL
6440: 53 45 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 72  SE, 0, 0);.    r
6450: 65 74 75 72 6e 20 69 2b 35 3b 0a 20 20 7d 65 6c  eturn i+5;.  }el
6460: 73 65 20 69 66 28 20 63 3d 3d 27 2d 27 20 7c 7c  se if( c=='-' ||
6470: 20 28 63 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27   (c>='0' && c<='
6480: 39 27 29 20 29 7b 0a 20 20 20 20 2f 2a 20 50 61  9') ){.    /* Pa
6490: 72 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  rse number */.  
64a0: 20 20 75 38 20 73 65 65 6e 44 50 20 3d 20 30 3b    u8 seenDP = 0;
64b0: 0a 20 20 20 20 75 38 20 73 65 65 6e 45 20 3d 20  .    u8 seenE = 
64c0: 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 27  0;.    assert( '
64d0: 2d 27 20 3c 20 27 30 27 20 29 3b 0a 20 20 20 20  -' < '0' );.    
64e0: 69 66 28 20 63 3c 3d 27 30 27 20 29 7b 0a 20 20  if( c<='0' ){.  
64f0: 20 20 20 20 6a 20 3d 20 63 3d 3d 27 2d 27 20 3f      j = c=='-' ?
6500: 20 69 2b 31 20 3a 20 69 3b 0a 20 20 20 20 20 20   i+1 : i;.      
6510: 69 66 28 20 7a 5b 6a 5d 3d 3d 27 30 27 20 26 26  if( z[j]=='0' &&
6520: 20 7a 5b 6a 2b 31 5d 3e 3d 27 30 27 20 26 26 20   z[j+1]>='0' && 
6530: 7a 5b 6a 2b 31 5d 3c 3d 27 39 27 20 29 20 72 65  z[j+1]<='9' ) re
6540: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  turn -1;.    }. 
6550: 20 20 20 6a 20 3d 20 69 2b 31 3b 0a 20 20 20 20     j = i+1;.    
6560: 66 6f 72 28 3b 3b 20 6a 2b 2b 29 7b 0a 20 20 20  for(;; j++){.   
6570: 20 20 20 63 20 3d 20 7a 5b 6a 5d 3b 0a 20 20 20     c = z[j];.   
6580: 20 20 20 69 66 28 20 63 3e 3d 27 30 27 20 26 26     if( c>='0' &&
6590: 20 63 3c 3d 27 39 27 20 29 20 63 6f 6e 74 69 6e   c<='9' ) contin
65a0: 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d  ue;.      if( c=
65b0: 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='.' ){.        
65c0: 69 66 28 20 7a 5b 6a 2d 31 5d 3d 3d 27 2d 27 20  if( z[j-1]=='-' 
65d0: 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
65e0: 20 20 20 20 20 69 66 28 20 73 65 65 6e 44 50 20       if( seenDP 
65f0: 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
6600: 20 20 20 20 20 73 65 65 6e 44 50 20 3d 20 31 3b       seenDP = 1;
6610: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
6620: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
6630: 20 69 66 28 20 63 3d 3d 27 65 27 20 7c 7c 20 63   if( c=='e' || c
6640: 3d 3d 27 45 27 20 29 7b 0a 20 20 20 20 20 20 20  =='E' ){.       
6650: 20 69 66 28 20 7a 5b 6a 2d 31 5d 3c 27 30 27 20   if( z[j-1]<'0' 
6660: 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
6670: 20 20 20 20 20 69 66 28 20 73 65 65 6e 45 20 29       if( seenE )
6680: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
6690: 20 20 20 20 73 65 65 6e 44 50 20 3d 20 73 65 65      seenDP = see
66a0: 6e 45 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nE = 1;.        
66b0: 63 20 3d 20 7a 5b 6a 2b 31 5d 3b 0a 20 20 20 20  c = z[j+1];.    
66c0: 20 20 20 20 69 66 28 20 63 3d 3d 27 2b 27 20 7c      if( c=='+' |
66d0: 7c 20 63 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20  | c=='-' ){.    
66e0: 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
66f0: 20 20 20 20 20 63 20 3d 20 7a 5b 6a 2b 31 5d 3b       c = z[j+1];
6700: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6710: 20 20 20 69 66 28 20 63 3c 27 30 27 20 7c 7c 20     if( c<'0' || 
6720: 63 3e 27 39 27 20 29 20 72 65 74 75 72 6e 20 2d  c>'9' ) return -
6730: 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  1;.        conti
6740: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
6750: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6760: 20 20 20 20 69 66 28 20 7a 5b 6a 2d 31 5d 3c 27      if( z[j-1]<'
6770: 30 27 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  0' ) return -1;.
6780: 20 20 20 20 6a 73 6f 6e 50 61 72 73 65 41 64 64      jsonParseAdd
6790: 4e 6f 64 65 28 70 50 61 72 73 65 2c 20 73 65 65  Node(pParse, see
67a0: 6e 44 50 20 3f 20 4a 53 4f 4e 5f 52 45 41 4c 20  nDP ? JSON_REAL 
67b0: 3a 20 4a 53 4f 4e 5f 49 4e 54 2c 0a 20 20 20 20  : JSON_INT,.    
67c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67d0: 20 20 20 20 6a 20 2d 20 69 2c 20 26 7a 5b 69 5d      j - i, &z[i]
67e0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6a 3b  );.    return j;
67f0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d  .  }else if( c==
6800: 27 7d 27 20 29 7b 0a 20 20 20 20 72 65 74 75 72  '}' ){.    retur
6810: 6e 20 2d 32 3b 20 20 2f 2a 20 45 6e 64 20 6f 66  n -2;  /* End of
6820: 20 7b 2e 2e 2e 7d 20 2a 2f 0a 20 20 7d 65 6c 73   {...} */.  }els
6830: 65 20 69 66 28 20 63 3d 3d 27 5d 27 20 29 7b 0a  e if( c==']' ){.
6840: 20 20 20 20 72 65 74 75 72 6e 20 2d 33 3b 20 20      return -3;  
6850: 2f 2a 20 45 6e 64 20 6f 66 20 5b 2e 2e 2e 5d 20  /* End of [...] 
6860: 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 63  */.  }else if( c
6870: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
6880: 6e 20 30 3b 20 20 20 2f 2a 20 45 6e 64 20 6f 66  n 0;   /* End of
6890: 20 66 69 6c 65 20 2a 2f 0a 20 20 7d 65 6c 73 65   file */.  }else
68a0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  {.    return -1;
68b0: 20 20 2f 2a 20 53 79 6e 74 61 78 20 65 72 72 6f    /* Syntax erro
68c0: 72 20 2a 2f 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  r */.  }.}../*.*
68d0: 2a 20 50 61 72 73 65 20 61 20 63 6f 6d 70 6c 65  * Parse a comple
68e0: 74 65 20 4a 53 4f 4e 20 73 74 72 69 6e 67 2e 20  te JSON string. 
68f0: 20 52 65 74 75 72 6e 20 30 20 6f 6e 20 73 75 63   Return 0 on suc
6900: 63 65 73 73 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  cess or non-zero
6910: 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   if there.** are
6920: 20 61 6e 79 20 65 72 72 6f 72 73 2e 20 20 49 66   any errors.  If
6930: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
6940: 2c 20 66 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72  , free all memor
6950: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
6960: 68 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a 0a  h.** pParse..**.
6970: 2a 2a 20 70 50 61 72 73 65 20 69 73 20 75 6e 69  ** pParse is uni
6980: 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20  nitialized when 
6990: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
69a0: 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
69b0: 63 20 69 6e 74 20 6a 73 6f 6e 50 61 72 73 65 28  c int jsonParse(
69c0: 0a 20 20 4a 73 6f 6e 50 61 72 73 65 20 2a 70 50  .  JsonParse *pP
69d0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
69e0: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e  /* Initialize an
69f0: 64 20 66 69 6c 6c 20 74 68 69 73 20 4a 73 6f 6e  d fill this Json
6a00: 50 61 72 73 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  Parse object */.
6a10: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
6a20: 74 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20 2f  t *pCtx,       /
6a30: 2a 20 52 65 70 6f 72 74 20 65 72 72 6f 72 73 20  * Report errors 
6a40: 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  here */.  const 
6a50: 63 68 61 72 20 2a 7a 4a 73 6f 6e 20 20 20 20 20  char *zJson     
6a60: 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20         /* Input 
6a70: 4a 53 4f 4e 20 74 65 78 74 20 74 6f 20 62 65 20  JSON text to be 
6a80: 70 61 72 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 69  parsed */.){.  i
6a90: 6e 74 20 69 3b 0a 20 20 6d 65 6d 73 65 74 28 70  nt i;.  memset(p
6aa0: 50 61 72 73 65 2c 20 30 2c 20 73 69 7a 65 6f 66  Parse, 0, sizeof
6ab0: 28 2a 70 50 61 72 73 65 29 29 3b 0a 20 20 69 66  (*pParse));.  if
6ac0: 28 20 7a 4a 73 6f 6e 3d 3d 30 20 29 20 72 65 74  ( zJson==0 ) ret
6ad0: 75 72 6e 20 31 3b 0a 20 20 70 50 61 72 73 65 2d  urn 1;.  pParse-
6ae0: 3e 7a 4a 73 6f 6e 20 3d 20 7a 4a 73 6f 6e 3b 0a  >zJson = zJson;.
6af0: 20 20 69 20 3d 20 6a 73 6f 6e 50 61 72 73 65 56    i = jsonParseV
6b00: 61 6c 75 65 28 70 50 61 72 73 65 2c 20 30 29 3b  alue(pParse, 0);
6b10: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6f  .  if( pParse->o
6b20: 6f 6d 20 29 20 69 20 3d 20 2d 31 3b 0a 20 20 69  om ) i = -1;.  i
6b30: 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 61 73  f( i>0 ){.    as
6b40: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 69 44  sert( pParse->iD
6b50: 65 70 74 68 3d 3d 30 20 29 3b 0a 20 20 20 20 77  epth==0 );.    w
6b60: 68 69 6c 65 28 20 73 61 66 65 5f 69 73 73 70 61  hile( safe_isspa
6b70: 63 65 28 7a 4a 73 6f 6e 5b 69 5d 29 20 29 20 69  ce(zJson[i]) ) i
6b80: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 7a 4a 73 6f  ++;.    if( zJso
6b90: 6e 5b 69 5d 20 29 20 69 20 3d 20 2d 31 3b 0a 20  n[i] ) i = -1;. 
6ba0: 20 7d 0a 20 20 69 66 28 20 69 3c 3d 30 20 29 7b   }.  if( i<=0 ){
6bb0: 0a 20 20 20 20 69 66 28 20 70 43 74 78 21 3d 30  .    if( pCtx!=0
6bc0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50   ){.      if( pP
6bd0: 61 72 73 65 2d 3e 6f 6f 6d 20 29 7b 0a 20 20 20  arse->oom ){.   
6be0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
6bf0: 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28  ult_error_nomem(
6c00: 70 43 74 78 29 3b 0a 20 20 20 20 20 20 7d 65 6c  pCtx);.      }el
6c10: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
6c20: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
6c30: 28 70 43 74 78 2c 20 22 6d 61 6c 66 6f 72 6d 65  (pCtx, "malforme
6c40: 64 20 4a 53 4f 4e 22 2c 20 2d 31 29 3b 0a 20 20  d JSON", -1);.  
6c50: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
6c60: 6a 73 6f 6e 50 61 72 73 65 52 65 73 65 74 28 70  jsonParseReset(p
6c70: 50 61 72 73 65 29 3b 0a 20 20 20 20 72 65 74 75  Parse);.    retu
6c80: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
6c90: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 4d 61 72 6b  rn 0;.}../* Mark
6ca0: 20 6e 6f 64 65 20 69 20 6f 66 20 70 50 61 72 73   node i of pPars
6cb0: 65 20 61 73 20 62 65 69 6e 67 20 61 20 63 68 69  e as being a chi
6cc0: 6c 64 20 6f 66 20 69 50 61 72 65 6e 74 2e 20 20  ld of iParent.  
6cd0: 43 61 6c 6c 20 72 65 63 75 72 73 69 76 65 6c 79  Call recursively
6ce0: 0a 2a 2a 20 74 6f 20 66 69 6c 6c 20 69 6e 20 61  .** to fill in a
6cf0: 6c 6c 20 74 68 65 20 64 65 73 63 65 6e 64 61 6e  ll the descendan
6d00: 74 73 20 6f 66 20 6e 6f 64 65 20 69 2e 0a 2a 2f  ts of node i..*/
6d10: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f  .static void jso
6d20: 6e 50 61 72 73 65 46 69 6c 6c 49 6e 50 61 72 65  nParseFillInPare
6d30: 6e 74 61 67 65 28 4a 73 6f 6e 50 61 72 73 65 20  ntage(JsonParse 
6d40: 2a 70 50 61 72 73 65 2c 20 75 33 32 20 69 2c 20  *pParse, u32 i, 
6d50: 75 33 32 20 69 50 61 72 65 6e 74 29 7b 0a 20 20  u32 iParent){.  
6d60: 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 20  JsonNode *pNode 
6d70: 3d 20 26 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65  = &pParse->aNode
6d80: 5b 69 5d 3b 0a 20 20 75 33 32 20 6a 3b 0a 20 20  [i];.  u32 j;.  
6d90: 70 50 61 72 73 65 2d 3e 61 55 70 5b 69 5d 20 3d  pParse->aUp[i] =
6da0: 20 69 50 61 72 65 6e 74 3b 0a 20 20 73 77 69 74   iParent;.  swit
6db0: 63 68 28 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65  ch( pNode->eType
6dc0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4a 53 4f   ){.    case JSO
6dd0: 4e 5f 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20  N_ARRAY: {.     
6de0: 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 3d 70 4e 6f   for(j=1; j<=pNo
6df0: 64 65 2d 3e 6e 3b 20 6a 20 2b 3d 20 6a 73 6f 6e  de->n; j += json
6e00: 4e 6f 64 65 53 69 7a 65 28 70 4e 6f 64 65 2b 6a  NodeSize(pNode+j
6e10: 29 29 7b 0a 20 20 20 20 20 20 20 20 6a 73 6f 6e  )){.        json
6e20: 50 61 72 73 65 46 69 6c 6c 49 6e 50 61 72 65 6e  ParseFillInParen
6e30: 74 61 67 65 28 70 50 61 72 73 65 2c 20 69 2b 6a  tage(pParse, i+j
6e40: 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , i);.      }.  
6e50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6e60: 0a 20 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f 4f  .    case JSON_O
6e70: 42 4a 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 66  BJECT: {.      f
6e80: 6f 72 28 6a 3d 31 3b 20 6a 3c 3d 70 4e 6f 64 65  or(j=1; j<=pNode
6e90: 2d 3e 6e 3b 20 6a 20 2b 3d 20 6a 73 6f 6e 4e 6f  ->n; j += jsonNo
6ea0: 64 65 53 69 7a 65 28 70 4e 6f 64 65 2b 6a 2b 31  deSize(pNode+j+1
6eb0: 29 2b 31 29 7b 0a 20 20 20 20 20 20 20 20 70 50  )+1){.        pP
6ec0: 61 72 73 65 2d 3e 61 55 70 5b 69 2b 6a 5d 20 3d  arse->aUp[i+j] =
6ed0: 20 69 3b 0a 20 20 20 20 20 20 20 20 6a 73 6f 6e   i;.        json
6ee0: 50 61 72 73 65 46 69 6c 6c 49 6e 50 61 72 65 6e  ParseFillInParen
6ef0: 74 61 67 65 28 70 50 61 72 73 65 2c 20 69 2b 6a  tage(pParse, i+j
6f00: 2b 31 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a  +1, i);.      }.
6f10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6f20: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
6f30: 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
6f40: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
6f50: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 70 61  * Compute the pa
6f60: 72 65 6e 74 61 67 65 20 6f 66 20 61 6c 6c 20 6e  rentage of all n
6f70: 6f 64 65 73 20 69 6e 20 61 20 63 6f 6d 70 6c 65  odes in a comple
6f80: 74 65 64 20 70 61 72 73 65 2e 0a 2a 2f 0a 73 74  ted parse..*/.st
6f90: 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e 50 61 72  atic int jsonPar
6fa0: 73 65 46 69 6e 64 50 61 72 65 6e 74 73 28 4a 73  seFindParents(Js
6fb0: 6f 6e 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  onParse *pParse)
6fc0: 7b 0a 20 20 75 33 32 20 2a 61 55 70 3b 0a 20 20  {.  u32 *aUp;.  
6fd0: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
6fe0: 61 55 70 3d 3d 30 20 29 3b 0a 20 20 61 55 70 20  aUp==0 );.  aUp 
6ff0: 3d 20 70 50 61 72 73 65 2d 3e 61 55 70 20 3d 20  = pParse->aUp = 
7000: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
7010: 28 20 73 69 7a 65 6f 66 28 75 33 32 29 2a 70 50  ( sizeof(u32)*pP
7020: 61 72 73 65 2d 3e 6e 4e 6f 64 65 20 29 3b 0a 20  arse->nNode );. 
7030: 20 69 66 28 20 61 55 70 3d 3d 30 20 29 7b 0a 20   if( aUp==0 ){. 
7040: 20 20 20 70 50 61 72 73 65 2d 3e 6f 6f 6d 20 3d     pParse->oom =
7050: 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
7060: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
7070: 0a 20 20 6a 73 6f 6e 50 61 72 73 65 46 69 6c 6c  .  jsonParseFill
7080: 49 6e 50 61 72 65 6e 74 61 67 65 28 70 50 61 72  InParentage(pPar
7090: 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65 74  se, 0, 0);.  ret
70a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
70b0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 67 69 63 20 6e 75  ../*.** Magic nu
70c0: 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 74 68  mber used for th
70d0: 65 20 4a 53 4f 4e 20 70 61 72 73 65 20 63 61 63  e JSON parse cac
70e0: 68 65 20 69 6e 20 73 71 6c 69 74 65 33 5f 67 65  he in sqlite3_ge
70f0: 74 5f 61 75 78 64 61 74 61 28 29 0a 2a 2f 0a 23  t_auxdata().*/.#
7100: 64 65 66 69 6e 65 20 4a 53 4f 4e 5f 43 41 43 48  define JSON_CACH
7110: 45 5f 49 44 20 20 28 2d 34 32 39 39 33 38 29 20  E_ID  (-429938) 
7120: 20 2f 2a 20 46 69 72 73 74 20 63 61 63 68 65 20   /* First cache 
7130: 65 6e 74 72 79 20 2a 2f 0a 23 64 65 66 69 6e 65  entry */.#define
7140: 20 4a 53 4f 4e 5f 43 41 43 48 45 5f 53 5a 20 20   JSON_CACHE_SZ  
7150: 34 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  4          /* Ma
7160: 78 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68  x number of cach
7170: 65 20 65 6e 74 72 69 65 73 20 2a 2f 0a 0a 2f 2a  e entries */../*
7180: 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 63 6f 6d  .** Obtain a com
7190: 70 6c 65 74 65 20 70 61 72 73 65 20 6f 66 20 74  plete parse of t
71a0: 68 65 20 4a 53 4f 4e 20 66 6f 75 6e 64 20 69 6e  he JSON found in
71b0: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
71c0: 65 6e 74 0a 2a 2a 20 6f 66 20 74 68 65 20 61 72  ent.** of the ar
71d0: 67 76 20 61 72 72 61 79 2e 20 20 55 73 65 20 74  gv array.  Use t
71e0: 68 65 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61  he sqlite3_get_a
71f0: 75 78 64 61 74 61 28 29 20 63 61 63 68 65 20 66  uxdata() cache f
7200: 6f 72 20 74 68 69 73 0a 2a 2a 20 70 61 72 73 65  or this.** parse
7210: 20 69 66 20 69 74 20 69 73 20 61 76 61 69 6c 61   if it is availa
7220: 62 6c 65 2e 20 20 49 66 20 74 68 65 20 63 61 63  ble.  If the cac
7230: 68 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61  he is not availa
7240: 62 6c 65 20 6f 72 20 69 66 20 69 74 0a 2a 2a 20  ble or if it.** 
7250: 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 76 61 6c  is no longer val
7260: 69 64 2c 20 70 61 72 73 65 20 74 68 65 20 4a 53  id, parse the JS
7270: 4f 4e 20 61 67 61 69 6e 20 61 6e 64 20 72 65 74  ON again and ret
7280: 75 72 6e 20 74 68 65 20 6e 65 77 20 70 61 72 73  urn the new pars
7290: 65 2c 0a 2a 2a 20 61 6e 64 20 61 6c 73 6f 20 72  e,.** and also r
72a0: 65 67 69 73 74 65 72 20 74 68 65 20 6e 65 77 20  egister the new 
72b0: 70 61 72 73 65 20 73 6f 20 74 68 61 74 20 69 74  parse so that it
72c0: 20 77 69 6c 6c 20 62 65 20 61 76 61 69 6c 61 62   will be availab
72d0: 6c 65 20 66 6f 72 0a 2a 2a 20 66 75 74 75 72 65  le for.** future
72e0: 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 78   sqlite3_get_aux
72f0: 64 61 74 61 28 29 20 63 61 6c 6c 73 2e 0a 2a 2f  data() calls..*/
7300: 0a 73 74 61 74 69 63 20 4a 73 6f 6e 50 61 72 73  .static JsonPars
7310: 65 20 2a 6a 73 6f 6e 50 61 72 73 65 43 61 63 68  e *jsonParseCach
7320: 65 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  ed(.  sqlite3_co
7330: 6e 74 65 78 74 20 2a 70 43 74 78 2c 0a 20 20 73  ntext *pCtx,.  s
7340: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
7350: 72 67 76 2c 0a 20 20 73 71 6c 69 74 65 33 5f 63  rgv,.  sqlite3_c
7360: 6f 6e 74 65 78 74 20 2a 70 45 72 72 43 74 78 0a  ontext *pErrCtx.
7370: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
7380: 2a 7a 4a 73 6f 6e 20 3d 20 28 63 6f 6e 73 74 20  *zJson = (const 
7390: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
73a0: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
73b0: 29 3b 0a 20 20 69 6e 74 20 6e 4a 73 6f 6e 20 3d  );.  int nJson =
73c0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
73d0: 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20  ytes(argv[0]);. 
73e0: 20 4a 73 6f 6e 50 61 72 73 65 20 2a 70 3b 0a 20   JsonParse *p;. 
73f0: 20 4a 73 6f 6e 50 61 72 73 65 20 2a 70 4d 61 74   JsonParse *pMat
7400: 63 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4b  ch = 0;.  int iK
7410: 65 79 3b 0a 20 20 69 6e 74 20 69 4d 69 6e 4b 65  ey;.  int iMinKe
7420: 79 20 3d 20 30 3b 0a 20 20 75 33 32 20 69 4d 69  y = 0;.  u32 iMi
7430: 6e 48 6f 6c 64 20 3d 20 30 78 66 66 66 66 66 66  nHold = 0xffffff
7440: 66 66 3b 0a 20 20 75 33 32 20 69 4d 61 78 48 6f  ff;.  u32 iMaxHo
7450: 6c 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 4a  ld = 0;.  if( zJ
7460: 73 6f 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  son==0 ) return 
7470: 30 3b 0a 20 20 66 6f 72 28 69 4b 65 79 3d 30 3b  0;.  for(iKey=0;
7480: 20 69 4b 65 79 3c 4a 53 4f 4e 5f 43 41 43 48 45   iKey<JSON_CACHE
7490: 5f 53 5a 3b 20 69 4b 65 79 2b 2b 29 7b 0a 20 20  _SZ; iKey++){.  
74a0: 20 20 70 20 3d 20 28 4a 73 6f 6e 50 61 72 73 65    p = (JsonParse
74b0: 2a 29 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75  *)sqlite3_get_au
74c0: 78 64 61 74 61 28 70 43 74 78 2c 20 4a 53 4f 4e  xdata(pCtx, JSON
74d0: 5f 43 41 43 48 45 5f 49 44 2b 69 4b 65 79 29 3b  _CACHE_ID+iKey);
74e0: 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  .    if( p==0 ){
74f0: 0a 20 20 20 20 20 20 69 4d 69 6e 4b 65 79 20 3d  .      iMinKey =
7500: 20 69 4b 65 79 3b 0a 20 20 20 20 20 20 62 72 65   iKey;.      bre
7510: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
7520: 28 20 70 4d 61 74 63 68 3d 3d 30 0a 20 20 20 20  ( pMatch==0.    
7530: 20 26 26 20 70 2d 3e 6e 4a 73 6f 6e 3d 3d 6e 4a   && p->nJson==nJ
7540: 73 6f 6e 0a 20 20 20 20 20 26 26 20 6d 65 6d 63  son.     && memc
7550: 6d 70 28 70 2d 3e 7a 4a 73 6f 6e 2c 7a 4a 73 6f  mp(p->zJson,zJso
7560: 6e 2c 6e 4a 73 6f 6e 29 3d 3d 30 0a 20 20 20 20  n,nJson)==0.    
7570: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 45 72 72  ){.      p->nErr
7580: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4d 61 74   = 0;.      pMat
7590: 63 68 20 3d 20 70 3b 0a 20 20 20 20 7d 65 6c 73  ch = p;.    }els
75a0: 65 20 69 66 28 20 70 2d 3e 69 48 6f 6c 64 3c 69  e if( p->iHold<i
75b0: 4d 69 6e 48 6f 6c 64 20 29 7b 0a 20 20 20 20 20  MinHold ){.     
75c0: 20 69 4d 69 6e 48 6f 6c 64 20 3d 20 70 2d 3e 69   iMinHold = p->i
75d0: 48 6f 6c 64 3b 0a 20 20 20 20 20 20 69 4d 69 6e  Hold;.      iMin
75e0: 4b 65 79 20 3d 20 69 4b 65 79 3b 0a 20 20 20 20  Key = iKey;.    
75f0: 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 48 6f  }.    if( p->iHo
7600: 6c 64 3e 69 4d 61 78 48 6f 6c 64 20 29 7b 0a 20  ld>iMaxHold ){. 
7610: 20 20 20 20 20 69 4d 61 78 48 6f 6c 64 20 3d 20       iMaxHold = 
7620: 70 2d 3e 69 48 6f 6c 64 3b 0a 20 20 20 20 7d 0a  p->iHold;.    }.
7630: 20 20 7d 0a 20 20 69 66 28 20 70 4d 61 74 63 68    }.  if( pMatch
7640: 20 29 7b 0a 20 20 20 20 70 4d 61 74 63 68 2d 3e   ){.    pMatch->
7650: 6e 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 70 4d  nErr = 0;.    pM
7660: 61 74 63 68 2d 3e 69 48 6f 6c 64 20 3d 20 69 4d  atch->iHold = iM
7670: 61 78 48 6f 6c 64 2b 31 3b 0a 20 20 20 20 72 65  axHold+1;.    re
7680: 74 75 72 6e 20 70 4d 61 74 63 68 3b 0a 20 20 7d  turn pMatch;.  }
7690: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d  .  p = sqlite3_m
76a0: 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28  alloc64( sizeof(
76b0: 2a 70 29 20 2b 20 6e 4a 73 6f 6e 20 2b 20 31 20  *p) + nJson + 1 
76c0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  );.  if( p==0 ){
76d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
76e0: 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28  ult_error_nomem(
76f0: 70 43 74 78 29 3b 0a 20 20 20 20 72 65 74 75 72  pCtx);.    retur
7700: 6e 20 30 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  n 0;.  }.  memse
7710: 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  t(p, 0, sizeof(*
7720: 70 29 29 3b 0a 20 20 70 2d 3e 7a 4a 73 6f 6e 20  p));.  p->zJson 
7730: 3d 20 28 63 68 61 72 2a 29 26 70 5b 31 5d 3b 0a  = (char*)&p[1];.
7740: 20 20 6d 65 6d 63 70 79 28 28 63 68 61 72 2a 29    memcpy((char*)
7750: 70 2d 3e 7a 4a 73 6f 6e 2c 20 7a 4a 73 6f 6e 2c  p->zJson, zJson,
7760: 20 6e 4a 73 6f 6e 2b 31 29 3b 0a 20 20 69 66 28   nJson+1);.  if(
7770: 20 6a 73 6f 6e 50 61 72 73 65 28 70 2c 20 70 45   jsonParse(p, pE
7780: 72 72 43 74 78 2c 20 70 2d 3e 7a 4a 73 6f 6e 29  rrCtx, p->zJson)
7790: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
77a0: 66 72 65 65 28 70 29 3b 0a 20 20 20 20 72 65 74  free(p);.    ret
77b0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e  urn 0;.  }.  p->
77c0: 6e 4a 73 6f 6e 20 3d 20 6e 4a 73 6f 6e 3b 0a 20  nJson = nJson;. 
77d0: 20 70 2d 3e 69 48 6f 6c 64 20 3d 20 69 4d 61 78   p->iHold = iMax
77e0: 48 6f 6c 64 2b 31 3b 0a 20 20 73 71 6c 69 74 65  Hold+1;.  sqlite
77f0: 33 5f 73 65 74 5f 61 75 78 64 61 74 61 28 70 43  3_set_auxdata(pC
7800: 74 78 2c 20 4a 53 4f 4e 5f 43 41 43 48 45 5f 49  tx, JSON_CACHE_I
7810: 44 2b 69 4d 69 6e 4b 65 79 2c 20 70 2c 0a 20 20  D+iMinKey, p,.  
7820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7830: 20 20 20 20 28 76 6f 69 64 28 2a 29 28 76 6f 69      (void(*)(voi
7840: 64 2a 29 29 6a 73 6f 6e 50 61 72 73 65 46 72 65  d*))jsonParseFre
7850: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 4a 73  e);.  return (Js
7860: 6f 6e 50 61 72 73 65 2a 29 73 71 6c 69 74 65 33  onParse*)sqlite3
7870: 5f 67 65 74 5f 61 75 78 64 61 74 61 28 70 43 74  _get_auxdata(pCt
7880: 78 2c 20 4a 53 4f 4e 5f 43 41 43 48 45 5f 49 44  x, JSON_CACHE_ID
7890: 2b 69 4d 69 6e 4b 65 79 29 3b 0a 7d 0a 0a 2f 2a  +iMinKey);.}../*
78a0: 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20  .** Compare the 
78b0: 4f 42 4a 45 43 54 20 6c 61 62 65 6c 20 61 74 20  OBJECT label at 
78c0: 70 4e 6f 64 65 20 61 67 61 69 6e 73 74 20 7a 4b  pNode against zK
78d0: 65 79 2c 6e 4b 65 79 2e 20 20 52 65 74 75 72 6e  ey,nKey.  Return
78e0: 20 74 72 75 65 20 6f 6e 0a 2a 2a 20 61 20 6d 61   true on.** a ma
78f0: 74 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tch..*/.static i
7900: 6e 74 20 6a 73 6f 6e 4c 61 62 65 6c 43 6f 6d 70  nt jsonLabelComp
7910: 61 72 65 28 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e  are(JsonNode *pN
7920: 6f 64 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ode, const char 
7930: 2a 7a 4b 65 79 2c 20 75 33 32 20 6e 4b 65 79 29  *zKey, u32 nKey)
7940: 7b 0a 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 6a  {.  if( pNode->j
7950: 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 52  nFlags & JNODE_R
7960: 41 57 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4e  AW ){.    if( pN
7970: 6f 64 65 2d 3e 6e 21 3d 6e 4b 65 79 20 29 20 72  ode->n!=nKey ) r
7980: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 72 65 74  eturn 0;.    ret
7990: 75 72 6e 20 73 74 72 6e 63 6d 70 28 70 4e 6f 64  urn strncmp(pNod
79a0: 65 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 2c 20  e->u.zJContent, 
79b0: 7a 4b 65 79 2c 20 6e 4b 65 79 29 3d 3d 30 3b 0a  zKey, nKey)==0;.
79c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
79d0: 20 70 4e 6f 64 65 2d 3e 6e 21 3d 6e 4b 65 79 2b   pNode->n!=nKey+
79e0: 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  2 ) return 0;.  
79f0: 20 20 72 65 74 75 72 6e 20 73 74 72 6e 63 6d 70    return strncmp
7a00: 28 70 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74  (pNode->u.zJCont
7a10: 65 6e 74 2b 31 2c 20 7a 4b 65 79 2c 20 6e 4b 65  ent+1, zKey, nKe
7a20: 79 29 3d 3d 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  y)==0;.  }.}../*
7a30: 20 66 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   forward declara
7a40: 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 4a  tion */.static J
7a50: 73 6f 6e 4e 6f 64 65 20 2a 6a 73 6f 6e 4c 6f 6f  sonNode *jsonLoo
7a60: 6b 75 70 41 70 70 65 6e 64 28 4a 73 6f 6e 50 61  kupAppend(JsonPa
7a70: 72 73 65 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  rse*,const char*
7a80: 2c 69 6e 74 2a 2c 63 6f 6e 73 74 20 63 68 61 72  ,int*,const char
7a90: 2a 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72  **);../*.** Sear
7aa0: 63 68 20 61 6c 6f 6e 67 20 7a 50 61 74 68 20 74  ch along zPath t
7ab0: 6f 20 66 69 6e 64 20 74 68 65 20 6e 6f 64 65 20  o find the node 
7ac0: 73 70 65 63 69 66 69 65 64 2e 20 20 52 65 74 75  specified.  Retu
7ad0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  rn a pointer.** 
7ae0: 74 6f 20 74 68 61 74 20 6e 6f 64 65 2c 20 6f 72  to that node, or
7af0: 20 4e 55 4c 4c 20 69 66 20 7a 50 61 74 68 20 69   NULL if zPath i
7b00: 73 20 6d 61 6c 66 6f 72 6d 65 64 20 6f 72 20 69  s malformed or i
7b10: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75  f there is no su
7b20: 63 68 0a 2a 2a 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a  ch.** node..**.*
7b30: 2a 20 49 66 20 70 41 70 6e 64 21 3d 30 2c 20 74  * If pApnd!=0, t
7b40: 68 65 6e 20 74 72 79 20 74 6f 20 61 70 70 65 6e  hen try to appen
7b50: 64 20 6e 65 77 20 6e 6f 64 65 73 20 74 6f 20 63  d new nodes to c
7b60: 6f 6d 70 6c 65 74 65 20 7a 50 61 74 68 20 69 66  omplete zPath if
7b70: 20 69 74 20 69 73 0a 2a 2a 20 70 6f 73 73 69 62   it is.** possib
7b80: 6c 65 20 74 6f 20 64 6f 20 73 6f 20 61 6e 64 20  le to do so and 
7b90: 69 66 20 6e 6f 20 65 78 69 73 74 69 6e 67 20 6e  if no existing n
7ba0: 6f 64 65 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  ode corresponds 
7bb0: 74 6f 20 7a 50 61 74 68 2e 20 20 49 66 0a 2a 2a  to zPath.  If.**
7bc0: 20 6e 65 77 20 6e 6f 64 65 73 20 61 72 65 20 61   new nodes are a
7bd0: 70 70 65 6e 64 65 64 20 2a 70 41 70 6e 64 20 69  ppended *pApnd i
7be0: 73 20 73 65 74 20 74 6f 20 31 2e 0a 2a 2f 0a 73  s set to 1..*/.s
7bf0: 74 61 74 69 63 20 4a 73 6f 6e 4e 6f 64 65 20 2a  tatic JsonNode *
7c00: 6a 73 6f 6e 4c 6f 6f 6b 75 70 53 74 65 70 28 0a  jsonLookupStep(.
7c10: 20 20 4a 73 6f 6e 50 61 72 73 65 20 2a 70 50 61    JsonParse *pPa
7c20: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  rse,      /* The
7c30: 20 4a 53 4f 4e 20 74 6f 20 73 65 61 72 63 68 20   JSON to search 
7c40: 2a 2f 0a 20 20 75 33 32 20 69 52 6f 6f 74 2c 20  */.  u32 iRoot, 
7c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7c60: 42 65 67 69 6e 20 74 68 65 20 73 65 61 72 63 68  Begin the search
7c70: 20 61 74 20 74 68 69 73 20 6e 6f 64 65 20 2a 2f   at this node */
7c80: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7c90: 50 61 74 68 2c 20 20 20 20 20 20 2f 2a 20 54 68  Path,      /* Th
7ca0: 65 20 70 61 74 68 20 74 6f 20 73 65 61 72 63 68  e path to search
7cb0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 70 6e 64   */.  int *pApnd
7cc0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
7cd0: 20 41 70 70 65 6e 64 20 6e 6f 64 65 73 20 74 6f   Append nodes to
7ce0: 20 63 6f 6d 70 6c 65 74 65 20 70 61 74 68 20 69   complete path i
7cf0: 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20  f not NULL */.  
7d00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 45  const char **pzE
7d10: 72 72 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20  rr      /* Make 
7d20: 2a 70 7a 45 72 72 20 70 6f 69 6e 74 20 74 6f 20  *pzErr point to 
7d30: 61 6e 79 20 73 79 6e 74 61 78 20 65 72 72 6f 72  any syntax error
7d40: 20 69 6e 20 7a 50 61 74 68 20 2a 2f 0a 29 7b 0a   in zPath */.){.
7d50: 20 20 75 33 32 20 69 2c 20 6a 2c 20 6e 4b 65 79    u32 i, j, nKey
7d60: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
7d70: 7a 4b 65 79 3b 0a 20 20 4a 73 6f 6e 4e 6f 64 65  zKey;.  JsonNode
7d80: 20 2a 70 52 6f 6f 74 20 3d 20 26 70 50 61 72 73   *pRoot = &pPars
7d90: 65 2d 3e 61 4e 6f 64 65 5b 69 52 6f 6f 74 5d 3b  e->aNode[iRoot];
7da0: 0a 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d  .  if( zPath[0]=
7db0: 3d 30 20 29 20 72 65 74 75 72 6e 20 70 52 6f 6f  =0 ) return pRoo
7dc0: 74 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  t;.  if( pRoot->
7dd0: 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f  jnFlags & JNODE_
7de0: 52 45 50 4c 41 43 45 20 29 20 72 65 74 75 72 6e  REPLACE ) return
7df0: 20 30 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 5b   0;.  if( zPath[
7e00: 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 69  0]=='.' ){.    i
7e10: 66 28 20 70 52 6f 6f 74 2d 3e 65 54 79 70 65 21  f( pRoot->eType!
7e20: 3d 4a 53 4f 4e 5f 4f 42 4a 45 43 54 20 29 20 72  =JSON_OBJECT ) r
7e30: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7a 50 61  eturn 0;.    zPa
7e40: 74 68 2b 2b 3b 0a 20 20 20 20 69 66 28 20 7a 50  th++;.    if( zP
7e50: 61 74 68 5b 30 5d 3d 3d 27 22 27 20 29 7b 0a 20  ath[0]=='"' ){. 
7e60: 20 20 20 20 20 7a 4b 65 79 20 3d 20 7a 50 61 74       zKey = zPat
7e70: 68 20 2b 20 31 3b 0a 20 20 20 20 20 20 66 6f 72  h + 1;.      for
7e80: 28 69 3d 31 3b 20 7a 50 61 74 68 5b 69 5d 20 26  (i=1; zPath[i] &
7e90: 26 20 7a 50 61 74 68 5b 69 5d 21 3d 27 22 27 3b  & zPath[i]!='"';
7ea0: 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 6e 4b   i++){}.      nK
7eb0: 65 79 20 3d 20 69 2d 31 3b 0a 20 20 20 20 20 20  ey = i-1;.      
7ec0: 69 66 28 20 7a 50 61 74 68 5b 69 5d 20 29 7b 0a  if( zPath[i] ){.
7ed0: 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20          i++;.   
7ee0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7ef0: 20 20 2a 70 7a 45 72 72 20 3d 20 7a 50 61 74 68    *pzErr = zPath
7f00: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
7f10: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
7f20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4b 65  }else{.      zKe
7f30: 79 20 3d 20 7a 50 61 74 68 3b 0a 20 20 20 20 20  y = zPath;.     
7f40: 20 66 6f 72 28 69 3d 30 3b 20 7a 50 61 74 68 5b   for(i=0; zPath[
7f50: 69 5d 20 26 26 20 7a 50 61 74 68 5b 69 5d 21 3d  i] && zPath[i]!=
7f60: 27 2e 27 20 26 26 20 7a 50 61 74 68 5b 69 5d 21  '.' && zPath[i]!
7f70: 3d 27 5b 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20  ='['; i++){}.   
7f80: 20 20 20 6e 4b 65 79 20 3d 20 69 3b 0a 20 20 20     nKey = i;.   
7f90: 20 7d 0a 20 20 20 20 69 66 28 20 6e 4b 65 79 3d   }.    if( nKey=
7fa0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 7a 45  =0 ){.      *pzE
7fb0: 72 72 20 3d 20 7a 50 61 74 68 3b 0a 20 20 20 20  rr = zPath;.    
7fc0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
7fd0: 7d 0a 20 20 20 20 6a 20 3d 20 31 3b 0a 20 20 20  }.    j = 1;.   
7fe0: 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20   for(;;){.      
7ff0: 77 68 69 6c 65 28 20 6a 3c 3d 70 52 6f 6f 74 2d  while( j<=pRoot-
8000: 3e 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  >n ){.        if
8010: 28 20 6a 73 6f 6e 4c 61 62 65 6c 43 6f 6d 70 61  ( jsonLabelCompa
8020: 72 65 28 70 52 6f 6f 74 2b 6a 2c 20 7a 4b 65 79  re(pRoot+j, zKey
8030: 2c 20 6e 4b 65 79 29 20 29 7b 0a 20 20 20 20 20  , nKey) ){.     
8040: 20 20 20 20 20 72 65 74 75 72 6e 20 6a 73 6f 6e       return json
8050: 4c 6f 6f 6b 75 70 53 74 65 70 28 70 50 61 72 73  LookupStep(pPars
8060: 65 2c 20 69 52 6f 6f 74 2b 6a 2b 31 2c 20 26 7a  e, iRoot+j+1, &z
8070: 50 61 74 68 5b 69 5d 2c 20 70 41 70 6e 64 2c 20  Path[i], pApnd, 
8080: 70 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 20 20  pzErr);.        
8090: 7d 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20  }.        j++;. 
80a0: 20 20 20 20 20 20 20 6a 20 2b 3d 20 6a 73 6f 6e         j += json
80b0: 4e 6f 64 65 53 69 7a 65 28 26 70 52 6f 6f 74 5b  NodeSize(&pRoot[
80c0: 6a 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  j]);.      }.   
80d0: 20 20 20 69 66 28 20 28 70 52 6f 6f 74 2d 3e 6a     if( (pRoot->j
80e0: 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 41  nFlags & JNODE_A
80f0: 50 50 45 4e 44 29 3d 3d 30 20 29 20 62 72 65 61  PPEND)==0 ) brea
8100: 6b 3b 0a 20 20 20 20 20 20 69 52 6f 6f 74 20 2b  k;.      iRoot +
8110: 3d 20 70 52 6f 6f 74 2d 3e 75 2e 69 41 70 70 65  = pRoot->u.iAppe
8120: 6e 64 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 20  nd;.      pRoot 
8130: 3d 20 26 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65  = &pParse->aNode
8140: 5b 69 52 6f 6f 74 5d 3b 0a 20 20 20 20 20 20 6a  [iRoot];.      j
8150: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
8160: 69 66 28 20 70 41 70 6e 64 20 29 7b 0a 20 20 20  if( pApnd ){.   
8170: 20 20 20 75 33 32 20 69 53 74 61 72 74 2c 20 69     u32 iStart, i
8180: 4c 61 62 65 6c 3b 0a 20 20 20 20 20 20 4a 73 6f  Label;.      Jso
8190: 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 3b 0a 20 20  nNode *pNode;.  
81a0: 20 20 20 20 69 53 74 61 72 74 20 3d 20 6a 73 6f      iStart = jso
81b0: 6e 50 61 72 73 65 41 64 64 4e 6f 64 65 28 70 50  nParseAddNode(pP
81c0: 61 72 73 65 2c 20 4a 53 4f 4e 5f 4f 42 4a 45 43  arse, JSON_OBJEC
81d0: 54 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20  T, 2, 0);.      
81e0: 69 4c 61 62 65 6c 20 3d 20 6a 73 6f 6e 50 61 72  iLabel = jsonPar
81f0: 73 65 41 64 64 4e 6f 64 65 28 70 50 61 72 73 65  seAddNode(pParse
8200: 2c 20 4a 53 4f 4e 5f 53 54 52 49 4e 47 2c 20 6e  , JSON_STRING, n
8210: 4b 65 79 2c 20 7a 4b 65 79 29 3b 0a 20 20 20 20  Key, zKey);.    
8220: 20 20 7a 50 61 74 68 20 2b 3d 20 69 3b 0a 20 20    zPath += i;.  
8230: 20 20 20 20 70 4e 6f 64 65 20 3d 20 6a 73 6f 6e      pNode = json
8240: 4c 6f 6f 6b 75 70 41 70 70 65 6e 64 28 70 50 61  LookupAppend(pPa
8250: 72 73 65 2c 20 7a 50 61 74 68 2c 20 70 41 70 6e  rse, zPath, pApn
8260: 64 2c 20 70 7a 45 72 72 29 3b 0a 20 20 20 20 20  d, pzErr);.     
8270: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6f 6f 6d   if( pParse->oom
8280: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
8290: 20 20 20 69 66 28 20 70 4e 6f 64 65 20 29 7b 0a     if( pNode ){.
82a0: 20 20 20 20 20 20 20 20 70 52 6f 6f 74 20 3d 20          pRoot = 
82b0: 26 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65 5b 69  &pParse->aNode[i
82c0: 52 6f 6f 74 5d 3b 0a 20 20 20 20 20 20 20 20 70  Root];.        p
82d0: 52 6f 6f 74 2d 3e 75 2e 69 41 70 70 65 6e 64 20  Root->u.iAppend 
82e0: 3d 20 69 53 74 61 72 74 20 2d 20 69 52 6f 6f 74  = iStart - iRoot
82f0: 3b 0a 20 20 20 20 20 20 20 20 70 52 6f 6f 74 2d  ;.        pRoot-
8300: 3e 6a 6e 46 6c 61 67 73 20 7c 3d 20 4a 4e 4f 44  >jnFlags |= JNOD
8310: 45 5f 41 50 50 45 4e 44 3b 0a 20 20 20 20 20 20  E_APPEND;.      
8320: 20 20 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65 5b    pParse->aNode[
8330: 69 4c 61 62 65 6c 5d 2e 6a 6e 46 6c 61 67 73 20  iLabel].jnFlags 
8340: 7c 3d 20 4a 4e 4f 44 45 5f 52 41 57 3b 0a 20 20  |= JNODE_RAW;.  
8350: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
8360: 72 6e 20 70 4e 6f 64 65 3b 0a 20 20 20 20 7d 0a  rn pNode;.    }.
8370: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 50 61 74    }else if( zPat
8380: 68 5b 30 5d 3d 3d 27 5b 27 20 26 26 20 73 61 66  h[0]=='[' && saf
8390: 65 5f 69 73 64 69 67 69 74 28 7a 50 61 74 68 5b  e_isdigit(zPath[
83a0: 31 5d 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70  1]) ){.    if( p
83b0: 52 6f 6f 74 2d 3e 65 54 79 70 65 21 3d 4a 53 4f  Root->eType!=JSO
83c0: 4e 5f 41 52 52 41 59 20 29 20 72 65 74 75 72 6e  N_ARRAY ) return
83d0: 20 30 3b 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20   0;.    i = 0;. 
83e0: 20 20 20 6a 20 3d 20 31 3b 0a 20 20 20 20 77 68     j = 1;.    wh
83f0: 69 6c 65 28 20 73 61 66 65 5f 69 73 64 69 67 69  ile( safe_isdigi
8400: 74 28 7a 50 61 74 68 5b 6a 5d 29 20 29 7b 0a 20  t(zPath[j]) ){. 
8410: 20 20 20 20 20 69 20 3d 20 69 2a 31 30 20 2b 20       i = i*10 + 
8420: 7a 50 61 74 68 5b 6a 5d 20 2d 20 27 30 27 3b 0a  zPath[j] - '0';.
8430: 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d        j++;.    }
8440: 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68 5b 6a  .    if( zPath[j
8450: 5d 21 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20 20  ]!=']' ){.      
8460: 2a 70 7a 45 72 72 20 3d 20 7a 50 61 74 68 3b 0a  *pzErr = zPath;.
8470: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
8480: 20 20 20 20 7d 0a 20 20 20 20 7a 50 61 74 68 20      }.    zPath 
8490: 2b 3d 20 6a 20 2b 20 31 3b 0a 20 20 20 20 6a 20  += j + 1;.    j 
84a0: 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 3b 3b 29  = 1;.    for(;;)
84b0: 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a  {.      while( j
84c0: 3c 3d 70 52 6f 6f 74 2d 3e 6e 20 26 26 20 28 69  <=pRoot->n && (i
84d0: 3e 30 20 7c 7c 20 28 70 52 6f 6f 74 5b 6a 5d 2e  >0 || (pRoot[j].
84e0: 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f  jnFlags & JNODE_
84f0: 52 45 4d 4f 56 45 29 21 3d 30 29 20 29 7b 0a 20  REMOVE)!=0) ){. 
8500: 20 20 20 20 20 20 20 69 66 28 20 28 70 52 6f 6f         if( (pRoo
8510: 74 5b 6a 5d 2e 6a 6e 46 6c 61 67 73 20 26 20 4a  t[j].jnFlags & J
8520: 4e 4f 44 45 5f 52 45 4d 4f 56 45 29 3d 3d 30 20  NODE_REMOVE)==0 
8530: 29 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20 20 6a  ) i--;.        j
8540: 20 2b 3d 20 6a 73 6f 6e 4e 6f 64 65 53 69 7a 65   += jsonNodeSize
8550: 28 26 70 52 6f 6f 74 5b 6a 5d 29 3b 0a 20 20 20  (&pRoot[j]);.   
8560: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
8570: 70 52 6f 6f 74 2d 3e 6a 6e 46 6c 61 67 73 20 26  pRoot->jnFlags &
8580: 20 4a 4e 4f 44 45 5f 41 50 50 45 4e 44 29 3d 3d   JNODE_APPEND)==
8590: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
85a0: 20 69 52 6f 6f 74 20 2b 3d 20 70 52 6f 6f 74 2d   iRoot += pRoot-
85b0: 3e 75 2e 69 41 70 70 65 6e 64 3b 0a 20 20 20 20  >u.iAppend;.    
85c0: 20 20 70 52 6f 6f 74 20 3d 20 26 70 50 61 72 73    pRoot = &pPars
85d0: 65 2d 3e 61 4e 6f 64 65 5b 69 52 6f 6f 74 5d 3b  e->aNode[iRoot];
85e0: 0a 20 20 20 20 20 20 6a 20 3d 20 31 3b 0a 20 20  .      j = 1;.  
85f0: 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 3d 70    }.    if( j<=p
8600: 52 6f 6f 74 2d 3e 6e 20 29 7b 0a 20 20 20 20 20  Root->n ){.     
8610: 20 72 65 74 75 72 6e 20 6a 73 6f 6e 4c 6f 6f 6b   return jsonLook
8620: 75 70 53 74 65 70 28 70 50 61 72 73 65 2c 20 69  upStep(pParse, i
8630: 52 6f 6f 74 2b 6a 2c 20 7a 50 61 74 68 2c 20 70  Root+j, zPath, p
8640: 41 70 6e 64 2c 20 70 7a 45 72 72 29 3b 0a 20 20  Apnd, pzErr);.  
8650: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 30    }.    if( i==0
8660: 20 26 26 20 70 41 70 6e 64 20 29 7b 0a 20 20 20   && pApnd ){.   
8670: 20 20 20 75 33 32 20 69 53 74 61 72 74 3b 0a 20     u32 iStart;. 
8680: 20 20 20 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70       JsonNode *p
8690: 4e 6f 64 65 3b 0a 20 20 20 20 20 20 69 53 74 61  Node;.      iSta
86a0: 72 74 20 3d 20 6a 73 6f 6e 50 61 72 73 65 41 64  rt = jsonParseAd
86b0: 64 4e 6f 64 65 28 70 50 61 72 73 65 2c 20 4a 53  dNode(pParse, JS
86c0: 4f 4e 5f 41 52 52 41 59 2c 20 31 2c 20 30 29 3b  ON_ARRAY, 1, 0);
86d0: 0a 20 20 20 20 20 20 70 4e 6f 64 65 20 3d 20 6a  .      pNode = j
86e0: 73 6f 6e 4c 6f 6f 6b 75 70 41 70 70 65 6e 64 28  sonLookupAppend(
86f0: 70 50 61 72 73 65 2c 20 7a 50 61 74 68 2c 20 70  pParse, zPath, p
8700: 41 70 6e 64 2c 20 70 7a 45 72 72 29 3b 0a 20 20  Apnd, pzErr);.  
8710: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
8720: 6f 6f 6d 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  oom ) return 0;.
8730: 20 20 20 20 20 20 69 66 28 20 70 4e 6f 64 65 20        if( pNode 
8740: 29 7b 0a 20 20 20 20 20 20 20 20 70 52 6f 6f 74  ){.        pRoot
8750: 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 4e 6f 64   = &pParse->aNod
8760: 65 5b 69 52 6f 6f 74 5d 3b 0a 20 20 20 20 20 20  e[iRoot];.      
8770: 20 20 70 52 6f 6f 74 2d 3e 75 2e 69 41 70 70 65    pRoot->u.iAppe
8780: 6e 64 20 3d 20 69 53 74 61 72 74 20 2d 20 69 52  nd = iStart - iR
8790: 6f 6f 74 3b 0a 20 20 20 20 20 20 20 20 70 52 6f  oot;.        pRo
87a0: 6f 74 2d 3e 6a 6e 46 6c 61 67 73 20 7c 3d 20 4a  ot->jnFlags |= J
87b0: 4e 4f 44 45 5f 41 50 50 45 4e 44 3b 0a 20 20 20  NODE_APPEND;.   
87c0: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
87d0: 6e 20 70 4e 6f 64 65 3b 0a 20 20 20 20 7d 0a 20  n pNode;.    }. 
87e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 7a 45   }else{.    *pzE
87f0: 72 72 20 3d 20 7a 50 61 74 68 3b 0a 20 20 7d 0a  rr = zPath;.  }.
8800: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
8810: 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 63 6f 6e 74  *.** Append cont
8820: 65 6e 74 20 74 6f 20 70 50 61 72 73 65 20 74 68  ent to pParse th
8830: 61 74 20 77 69 6c 6c 20 63 6f 6d 70 6c 65 74 65  at will complete
8840: 20 7a 50 61 74 68 2e 20 20 52 65 74 75 72 6e 20   zPath.  Return 
8850: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
8860: 74 68 65 20 69 6e 73 65 72 74 65 64 20 6e 6f 64  the inserted nod
8870: 65 2c 20 6f 72 20 72 65 74 75 72 6e 20 4e 55 4c  e, or return NUL
8880: 4c 20 69 66 20 74 68 65 20 61 70 70 65 6e 64 20  L if the append 
8890: 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fails..*/.static
88a0: 20 4a 73 6f 6e 4e 6f 64 65 20 2a 6a 73 6f 6e 4c   JsonNode *jsonL
88b0: 6f 6f 6b 75 70 41 70 70 65 6e 64 28 0a 20 20 4a  ookupAppend(.  J
88c0: 73 6f 6e 50 61 72 73 65 20 2a 70 50 61 72 73 65  sonParse *pParse
88d0: 2c 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20  ,     /* Append 
88e0: 63 6f 6e 74 65 6e 74 20 74 6f 20 74 68 65 20 4a  content to the J
88f0: 53 4f 4e 20 70 61 72 73 65 20 2a 2f 0a 20 20 63  SON parse */.  c
8900: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
8910: 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70  ,     /* Descrip
8920: 74 69 6f 6e 20 6f 66 20 63 6f 6e 74 65 6e 74 20  tion of content 
8930: 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 69  to append */.  i
8940: 6e 74 20 2a 70 41 70 6e 64 2c 20 20 20 20 20 20  nt *pApnd,      
8950: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68 69        /* Set thi
8960: 73 20 66 6c 61 67 20 74 6f 20 31 20 2a 2f 0a 20  s flag to 1 */. 
8970: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
8980: 45 72 72 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20  Err     /* Make 
8990: 74 68 69 73 20 70 6f 69 6e 74 20 74 6f 20 61 6e  this point to an
89a0: 79 20 73 79 6e 74 61 78 20 65 72 72 6f 72 20 2a  y syntax error *
89b0: 2f 0a 29 7b 0a 20 20 2a 70 41 70 6e 64 20 3d 20  /.){.  *pApnd = 
89c0: 31 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 5b 30  1;.  if( zPath[0
89d0: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 6a 73 6f 6e  ]==0 ){.    json
89e0: 50 61 72 73 65 41 64 64 4e 6f 64 65 28 70 50 61  ParseAddNode(pPa
89f0: 72 73 65 2c 20 4a 53 4f 4e 5f 4e 55 4c 4c 2c 20  rse, JSON_NULL, 
8a00: 30 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  0, 0);.    retur
8a10: 6e 20 70 50 61 72 73 65 2d 3e 6f 6f 6d 20 3f 20  n pParse->oom ? 
8a20: 30 20 3a 20 26 70 50 61 72 73 65 2d 3e 61 4e 6f  0 : &pParse->aNo
8a30: 64 65 5b 70 50 61 72 73 65 2d 3e 6e 4e 6f 64 65  de[pParse->nNode
8a40: 2d 31 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  -1];.  }.  if( z
8a50: 50 61 74 68 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a  Path[0]=='.' ){.
8a60: 20 20 20 20 6a 73 6f 6e 50 61 72 73 65 41 64 64      jsonParseAdd
8a70: 4e 6f 64 65 28 70 50 61 72 73 65 2c 20 4a 53 4f  Node(pParse, JSO
8a80: 4e 5f 4f 42 4a 45 43 54 2c 20 30 2c 20 30 29 3b  N_OBJECT, 0, 0);
8a90: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
8aa0: 6e 63 6d 70 28 7a 50 61 74 68 2c 22 5b 30 5d 22  ncmp(zPath,"[0]"
8ab0: 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6a 73  ,3)==0 ){.    js
8ac0: 6f 6e 50 61 72 73 65 41 64 64 4e 6f 64 65 28 70  onParseAddNode(p
8ad0: 50 61 72 73 65 2c 20 4a 53 4f 4e 5f 41 52 52 41  Parse, JSON_ARRA
8ae0: 59 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  Y, 0, 0);.  }els
8af0: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  e{.    return 0;
8b00: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73  .  }.  if( pPars
8b10: 65 2d 3e 6f 6f 6d 20 29 20 72 65 74 75 72 6e 20  e->oom ) return 
8b20: 30 3b 0a 20 20 72 65 74 75 72 6e 20 6a 73 6f 6e  0;.  return json
8b30: 4c 6f 6f 6b 75 70 53 74 65 70 28 70 50 61 72 73  LookupStep(pPars
8b40: 65 2c 20 70 50 61 72 73 65 2d 3e 6e 4e 6f 64 65  e, pParse->nNode
8b50: 2d 31 2c 20 7a 50 61 74 68 2c 20 70 41 70 6e 64  -1, zPath, pApnd
8b60: 2c 20 70 7a 45 72 72 29 3b 0a 7d 0a 0a 2f 2a 0a  , pzErr);.}../*.
8b70: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 65  ** Return the te
8b80: 78 74 20 6f 66 20 61 20 73 79 6e 74 61 78 20 65  xt of a syntax e
8b90: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6f 6e 20  rror message on 
8ba0: 61 20 4a 53 4f 4e 20 70 61 74 68 2e 20 20 53 70  a JSON path.  Sp
8bb0: 61 63 65 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e  ace is.** obtain
8bc0: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
8bd0: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61  malloc()..*/.sta
8be0: 74 69 63 20 63 68 61 72 20 2a 6a 73 6f 6e 50 61  tic char *jsonPa
8bf0: 74 68 53 79 6e 74 61 78 45 72 72 6f 72 28 63 6f  thSyntaxError(co
8c00: 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 29 7b  nst char *zErr){
8c10: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
8c20: 33 5f 6d 70 72 69 6e 74 66 28 22 4a 53 4f 4e 20  3_mprintf("JSON 
8c30: 70 61 74 68 20 65 72 72 6f 72 20 6e 65 61 72 20  path error near 
8c40: 27 25 71 27 22 2c 20 7a 45 72 72 29 3b 0a 7d 0a  '%q'", zErr);.}.
8c50: 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 6e 6f 64 65  ./*.** Do a node
8c60: 20 6c 6f 6f 6b 75 70 20 75 73 69 6e 67 20 7a 50   lookup using zP
8c70: 61 74 68 2e 20 20 52 65 74 75 72 6e 20 61 20 70  ath.  Return a p
8c80: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 6f  ointer to the no
8c90: 64 65 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a  de on success..*
8ca0: 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  * Return NULL if
8cb0: 20 6e 6f 74 20 66 6f 75 6e 64 20 6f 72 20 69 66   not found or if
8cc0: 20 74 68 65 72 65 20 69 73 20 61 6e 20 65 72 72   there is an err
8cd0: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 61 6e 20  or..**.** On an 
8ce0: 65 72 72 6f 72 2c 20 77 72 69 74 65 20 61 6e 20  error, write an 
8cf0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
8d00: 74 6f 20 70 43 74 78 20 61 6e 64 20 69 6e 63 72  to pCtx and incr
8d10: 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 70 50 61  ement the.** pPa
8d20: 72 73 65 2d 3e 6e 45 72 72 20 63 6f 75 6e 74 65  rse->nErr counte
8d30: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 41 70 6e  r..**.** If pApn
8d40: 64 21 3d 4e 55 4c 4c 20 74 68 65 6e 20 74 72 79  d!=NULL then try
8d50: 20 74 6f 20 61 70 70 65 6e 64 20 6d 69 73 73 69   to append missi
8d60: 6e 67 20 6e 6f 64 65 73 20 61 6e 64 20 73 65 74  ng nodes and set
8d70: 20 2a 70 41 70 6e 64 20 3d 20 31 20 69 66 0a 2a   *pApnd = 1 if.*
8d80: 2a 20 6e 6f 64 65 73 20 61 72 65 20 61 70 70 65  * nodes are appe
8d90: 6e 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nded..*/.static 
8da0: 4a 73 6f 6e 4e 6f 64 65 20 2a 6a 73 6f 6e 4c 6f  JsonNode *jsonLo
8db0: 6f 6b 75 70 28 0a 20 20 4a 73 6f 6e 50 61 72 73  okup(.  JsonPars
8dc0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
8dd0: 2f 2a 20 54 68 65 20 4a 53 4f 4e 20 74 6f 20 73  /* The JSON to s
8de0: 65 61 72 63 68 20 2a 2f 0a 20 20 63 6f 6e 73 74  earch */.  const
8df0: 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
8e00: 20 20 20 2f 2a 20 54 68 65 20 70 61 74 68 20 74     /* The path t
8e10: 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e  o search */.  in
8e20: 74 20 2a 70 41 70 6e 64 2c 20 20 20 20 20 20 20  t *pApnd,       
8e30: 20 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20        /* Append 
8e40: 6e 6f 64 65 73 20 74 6f 20 63 6f 6d 70 6c 65 74  nodes to complet
8e50: 65 20 70 61 74 68 20 69 66 20 6e 6f 74 20 4e 55  e path if not NU
8e60: 4c 4c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  LL */.  sqlite3_
8e70: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 20 20  context *pCtx   
8e80: 2f 2a 20 52 65 70 6f 72 74 20 65 72 72 6f 72 73  /* Report errors
8e90: 20 68 65 72 65 2c 20 69 66 20 6e 6f 74 20 4e 55   here, if not NU
8ea0: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  LL */.){.  const
8eb0: 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b   char *zErr = 0;
8ec0: 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f  .  JsonNode *pNo
8ed0: 64 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  de = 0;.  char *
8ee0: 7a 4d 73 67 3b 0a 0a 20 20 69 66 28 20 7a 50 61  zMsg;..  if( zPa
8ef0: 74 68 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  th==0 ) return 0
8f00: 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d  ;.  if( zPath[0]
8f10: 21 3d 27 24 27 20 29 7b 0a 20 20 20 20 7a 45 72  !='$' ){.    zEr
8f20: 72 20 3d 20 7a 50 61 74 68 3b 0a 20 20 20 20 67  r = zPath;.    g
8f30: 6f 74 6f 20 6c 6f 6f 6b 75 70 5f 65 72 72 3b 0a  oto lookup_err;.
8f40: 20 20 7d 0a 20 20 7a 50 61 74 68 2b 2b 3b 0a 20    }.  zPath++;. 
8f50: 20 70 4e 6f 64 65 20 3d 20 6a 73 6f 6e 4c 6f 6f   pNode = jsonLoo
8f60: 6b 75 70 53 74 65 70 28 70 50 61 72 73 65 2c 20  kupStep(pParse, 
8f70: 30 2c 20 7a 50 61 74 68 2c 20 70 41 70 6e 64 2c  0, zPath, pApnd,
8f80: 20 26 7a 45 72 72 29 3b 0a 20 20 69 66 28 20 7a   &zErr);.  if( z
8f90: 45 72 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Err==0 ) return 
8fa0: 70 4e 6f 64 65 3b 0a 0a 6c 6f 6f 6b 75 70 5f 65  pNode;..lookup_e
8fb0: 72 72 3a 0a 20 20 70 50 61 72 73 65 2d 3e 6e 45  rr:.  pParse->nE
8fc0: 72 72 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20  rr++;.  assert( 
8fd0: 7a 45 72 72 21 3d 30 20 26 26 20 70 43 74 78 21  zErr!=0 && pCtx!
8fe0: 3d 30 20 29 3b 0a 20 20 7a 4d 73 67 20 3d 20 6a  =0 );.  zMsg = j
8ff0: 73 6f 6e 50 61 74 68 53 79 6e 74 61 78 45 72 72  sonPathSyntaxErr
9000: 6f 72 28 7a 45 72 72 29 3b 0a 20 20 69 66 28 20  or(zErr);.  if( 
9010: 7a 4d 73 67 20 29 7b 0a 20 20 20 20 73 71 6c 69  zMsg ){.    sqli
9020: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
9030: 28 70 43 74 78 2c 20 7a 4d 73 67 2c 20 2d 31 29  (pCtx, zMsg, -1)
9040: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
9050: 65 65 28 7a 4d 73 67 29 3b 0a 20 20 7d 65 6c 73  ee(zMsg);.  }els
9060: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  e{.    sqlite3_r
9070: 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65  esult_error_nome
9080: 6d 28 70 43 74 78 29 3b 0a 20 20 7d 0a 20 20 72  m(pCtx);.  }.  r
9090: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn 0;.}.../*.
90a0: 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20 77 72  ** Report the wr
90b0: 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  ong number of ar
90c0: 67 75 6d 65 6e 74 73 20 66 6f 72 20 6a 73 6f 6e  guments for json
90d0: 5f 69 6e 73 65 72 74 28 29 2c 20 6a 73 6f 6e 5f  _insert(), json_
90e0: 72 65 70 6c 61 63 65 28 29 0a 2a 2a 20 6f 72 20  replace().** or 
90f0: 6a 73 6f 6e 5f 73 65 74 28 29 2e 0a 2a 2f 0a 73  json_set()..*/.s
9100: 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 57  tatic void jsonW
9110: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 0a 20 20 73  rongNumArgs(.  s
9120: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
9130: 70 43 74 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68  pCtx,.  const ch
9140: 61 72 20 2a 7a 46 75 6e 63 4e 61 6d 65 0a 29 7b  ar *zFuncName.){
9150: 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20  .  char *zMsg = 
9160: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
9170: 22 6a 73 6f 6e 5f 25 73 28 29 20 6e 65 65 64 73  "json_%s() needs
9180: 20 61 6e 20 6f 64 64 20 6e 75 6d 62 65 72 20 6f   an odd number o
9190: 66 20 61 72 67 75 6d 65 6e 74 73 22 2c 0a 20 20  f arguments",.  
91a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 46 75               zFu
91c0: 6e 63 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  ncName);.  sqlit
91d0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
91e0: 70 43 74 78 2c 20 7a 4d 73 67 2c 20 2d 31 29 3b  pCtx, zMsg, -1);
91f0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
9200: 7a 4d 73 67 29 3b 20 20 20 20 20 0a 7d 0a 0a 2f  zMsg);     .}../
9210: 2a 0a 2a 2a 20 4d 61 72 6b 20 61 6c 6c 20 4e 55  *.** Mark all NU
9220: 4c 4c 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  LL entries in th
9230: 65 20 4f 62 6a 65 63 74 20 70 61 73 73 65 64 20  e Object passed 
9240: 69 6e 20 61 73 20 4a 4e 4f 44 45 5f 52 45 4d 4f  in as JNODE_REMO
9250: 56 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  VE..*/.static vo
9260: 69 64 20 6a 73 6f 6e 52 65 6d 6f 76 65 41 6c 6c  id jsonRemoveAll
9270: 4e 75 6c 6c 73 28 4a 73 6f 6e 4e 6f 64 65 20 2a  Nulls(JsonNode *
9280: 70 4e 6f 64 65 29 7b 0a 20 20 69 6e 74 20 69 2c  pNode){.  int i,
9290: 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e   n;.  assert( pN
92a0: 6f 64 65 2d 3e 65 54 79 70 65 3d 3d 4a 53 4f 4e  ode->eType==JSON
92b0: 5f 4f 42 4a 45 43 54 20 29 3b 0a 20 20 6e 20 3d  _OBJECT );.  n =
92c0: 20 70 4e 6f 64 65 2d 3e 6e 3b 0a 20 20 66 6f 72   pNode->n;.  for
92d0: 28 69 3d 32 3b 20 69 3c 3d 6e 3b 20 69 20 2b 3d  (i=2; i<=n; i +=
92e0: 20 6a 73 6f 6e 4e 6f 64 65 53 69 7a 65 28 26 70   jsonNodeSize(&p
92f0: 4e 6f 64 65 5b 69 5d 29 2b 31 29 7b 0a 20 20 20  Node[i])+1){.   
9300: 20 73 77 69 74 63 68 28 20 70 4e 6f 64 65 5b 69   switch( pNode[i
9310: 5d 2e 65 54 79 70 65 20 29 7b 0a 20 20 20 20 20  ].eType ){.     
9320: 20 63 61 73 65 20 4a 53 4f 4e 5f 4e 55 4c 4c 3a   case JSON_NULL:
9330: 0a 20 20 20 20 20 20 20 20 70 4e 6f 64 65 5b 69  .        pNode[i
9340: 5d 2e 6a 6e 46 6c 61 67 73 20 7c 3d 20 4a 4e 4f  ].jnFlags |= JNO
9350: 44 45 5f 52 45 4d 4f 56 45 3b 0a 20 20 20 20 20  DE_REMOVE;.     
9360: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9370: 63 61 73 65 20 4a 53 4f 4e 5f 4f 42 4a 45 43 54  case JSON_OBJECT
9380: 3a 0a 20 20 20 20 20 20 20 20 6a 73 6f 6e 52 65  :.        jsonRe
9390: 6d 6f 76 65 41 6c 6c 4e 75 6c 6c 73 28 26 70 4e  moveAllNulls(&pN
93a0: 6f 64 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  ode[i]);.       
93b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
93c0: 7d 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  }.}.../*********
93d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
93e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
93f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9400: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9410: 2a 2a 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e 63 74  ***.** SQL funct
9420: 69 6f 6e 73 20 75 73 65 64 20 66 6f 72 20 74 65  ions used for te
9430: 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67  sting and debugg
9440: 69 6e 67 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing.************
9450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9480: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9490: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
94a0: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 65  _DEBUG./*.** The
94b0: 20 6a 73 6f 6e 5f 70 61 72 73 65 28 4a 53 4f 4e   json_parse(JSON
94c0: 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ) function retur
94d0: 6e 73 20 61 20 73 74 72 69 6e 67 20 77 68 69 63  ns a string whic
94e0: 68 20 64 65 73 63 72 69 62 65 73 0a 2a 2a 20 61  h describes.** a
94f0: 20 70 61 72 73 65 20 6f 66 20 74 68 65 20 4a 53   parse of the JS
9500: 4f 4e 20 70 72 6f 76 69 64 65 64 2e 20 20 4f 72  ON provided.  Or
9510: 20 69 74 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c   it returns NULL
9520: 20 69 66 20 4a 53 4f 4e 20 69 73 20 6e 6f 74 0a   if JSON is not.
9530: 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 0a  ** well-formed..
9540: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a  */.static void j
9550: 73 6f 6e 50 61 72 73 65 46 75 6e 63 28 0a 20 20  sonParseFunc(.  
9560: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
9570: 2a 63 74 78 2c 0a 20 20 69 6e 74 20 61 72 67 63  *ctx,.  int argc
9580: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
9590: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 4a 73  e **argv.){.  Js
95a0: 6f 6e 53 74 72 69 6e 67 20 73 3b 20 20 20 20 20  onString s;     
95b0: 20 20 2f 2a 20 4f 75 74 70 75 74 20 73 74 72 69    /* Output stri
95c0: 6e 67 20 2d 20 6e 6f 74 20 72 65 61 6c 20 4a 53  ng - not real JS
95d0: 4f 4e 20 2a 2f 0a 20 20 4a 73 6f 6e 50 61 72 73  ON */.  JsonPars
95e0: 65 20 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  e x;        /* T
95f0: 68 65 20 70 61 72 73 65 20 2a 2f 0a 20 20 75 33  he parse */.  u3
9600: 32 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  2 i;..  assert( 
9610: 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28  argc==1 );.  if(
9620: 20 6a 73 6f 6e 50 61 72 73 65 28 26 78 2c 20 63   jsonParse(&x, c
9630: 74 78 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  tx, (const char*
9640: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
9650: 65 78 74 28 61 72 67 76 5b 30 5d 29 29 20 29 20  ext(argv[0])) ) 
9660: 72 65 74 75 72 6e 3b 0a 20 20 6a 73 6f 6e 50 61  return;.  jsonPa
9670: 72 73 65 46 69 6e 64 50 61 72 65 6e 74 73 28 26  rseFindParents(&
9680: 78 29 3b 0a 20 20 6a 73 6f 6e 49 6e 69 74 28 26  x);.  jsonInit(&
9690: 73 2c 20 63 74 78 29 3b 0a 20 20 66 6f 72 28 69  s, ctx);.  for(i
96a0: 3d 30 3b 20 69 3c 78 2e 6e 4e 6f 64 65 3b 20 69  =0; i<x.nNode; i
96b0: 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ++){.    const c
96c0: 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20 20 20  har *zType;.    
96d0: 69 66 28 20 78 2e 61 4e 6f 64 65 5b 69 5d 2e 6a  if( x.aNode[i].j
96e0: 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 4c  nFlags & JNODE_L
96f0: 41 42 45 4c 20 29 7b 0a 20 20 20 20 20 20 61 73  ABEL ){.      as
9700: 73 65 72 74 28 20 78 2e 61 4e 6f 64 65 5b 69 5d  sert( x.aNode[i]
9710: 2e 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f 53 54 52  .eType==JSON_STR
9720: 49 4e 47 20 29 3b 0a 20 20 20 20 20 20 7a 54 79  ING );.      zTy
9730: 70 65 20 3d 20 22 6c 61 62 65 6c 22 3b 0a 20 20  pe = "label";.  
9740: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
9750: 54 79 70 65 20 3d 20 6a 73 6f 6e 54 79 70 65 5b  Type = jsonType[
9760: 78 2e 61 4e 6f 64 65 5b 69 5d 2e 65 54 79 70 65  x.aNode[i].eType
9770: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 73 6f  ];.    }.    jso
9780: 6e 50 72 69 6e 74 66 28 31 30 30 2c 20 26 73 2c  nPrintf(100, &s,
9790: 22 6e 6f 64 65 20 25 33 75 3a 20 25 37 73 20 6e  "node %3u: %7s n
97a0: 3d 25 2d 34 64 20 75 70 3d 25 2d 34 64 22 2c 0a  =%-4d up=%-4d",.
97b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
97c0: 2c 20 7a 54 79 70 65 2c 20 78 2e 61 4e 6f 64 65  , zType, x.aNode
97d0: 5b 69 5d 2e 6e 2c 20 78 2e 61 55 70 5b 69 5d 29  [i].n, x.aUp[i])
97e0: 3b 0a 20 20 20 20 69 66 28 20 78 2e 61 4e 6f 64  ;.    if( x.aNod
97f0: 65 5b 69 5d 2e 75 2e 7a 4a 43 6f 6e 74 65 6e 74  e[i].u.zJContent
9800: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 6a 73 6f  !=0 ){.      jso
9810: 6e 41 70 70 65 6e 64 52 61 77 28 26 73 2c 20 22  nAppendRaw(&s, "
9820: 20 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 6a 73   ", 1);.      js
9830: 6f 6e 41 70 70 65 6e 64 52 61 77 28 26 73 2c 20  onAppendRaw(&s, 
9840: 78 2e 61 4e 6f 64 65 5b 69 5d 2e 75 2e 7a 4a 43  x.aNode[i].u.zJC
9850: 6f 6e 74 65 6e 74 2c 20 78 2e 61 4e 6f 64 65 5b  ontent, x.aNode[
9860: 69 5d 2e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  i].n);.    }.   
9870: 20 6a 73 6f 6e 41 70 70 65 6e 64 52 61 77 28 26   jsonAppendRaw(&
9880: 73 2c 20 22 5c 6e 22 2c 20 31 29 3b 0a 20 20 7d  s, "\n", 1);.  }
9890: 0a 20 20 6a 73 6f 6e 50 61 72 73 65 52 65 73 65  .  jsonParseRese
98a0: 74 28 26 78 29 3b 0a 20 20 6a 73 6f 6e 52 65 73  t(&x);.  jsonRes
98b0: 75 6c 74 28 26 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ult(&s);.}../*.*
98c0: 2a 20 54 68 65 20 6a 73 6f 6e 5f 74 65 73 74 31  * The json_test1
98d0: 28 4a 53 4f 4e 29 20 66 75 6e 63 74 69 6f 6e 20  (JSON) function 
98e0: 72 65 74 75 72 6e 20 74 72 75 65 20 28 31 29 20  return true (1) 
98f0: 69 66 20 74 68 65 20 69 6e 70 75 74 20 69 73 20  if the input is 
9900: 4a 53 4f 4e 0a 2a 2a 20 74 65 78 74 20 67 65 6e  JSON.** text gen
9910: 65 72 61 74 65 64 20 62 79 20 61 6e 6f 74 68 65  erated by anothe
9920: 72 20 6a 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e  r json function.
9930: 20 20 49 74 20 72 65 74 75 72 6e 73 20 28 30 29    It returns (0)
9940: 20 69 66 20 74 68 65 20 69 6e 70 75 74 0a 2a 2a   if the input.**
9950: 20 69 73 20 6e 6f 74 20 6b 6e 6f 77 6e 20 74 6f   is not known to
9960: 20 62 65 20 4a 53 4f 4e 2e 0a 2a 2f 0a 73 74 61   be JSON..*/.sta
9970: 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 54 65 73  tic void jsonTes
9980: 74 31 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  t1Func(.  sqlite
9990: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 0a  3_context *ctx,.
99a0: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
99b0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
99c0: 67 76 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  gv.){.  UNUSED_P
99d0: 41 52 41 4d 28 61 72 67 63 29 3b 0a 20 20 73 71  ARAM(argc);.  sq
99e0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
99f0: 28 63 74 78 2c 20 73 71 6c 69 74 65 33 5f 76 61  (ctx, sqlite3_va
9a00: 6c 75 65 5f 73 75 62 74 79 70 65 28 61 72 67 76  lue_subtype(argv
9a10: 5b 30 5d 29 3d 3d 4a 53 4f 4e 5f 53 55 42 54 59  [0])==JSON_SUBTY
9a20: 50 45 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  PE);.}.#endif /*
9a30: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
9a40: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
9a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9a70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
9a90: 2a 2a 20 53 63 61 6c 61 72 20 53 51 4c 20 66 75  ** Scalar SQL fu
9aa0: 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74  nction implement
9ab0: 61 74 69 6f 6e 73 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ations.*********
9ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9ad0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9ae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9af0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9b00: 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  ***/../*.** Impl
9b10: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
9b20: 65 20 6a 73 6f 6e 5f 51 55 4f 54 45 28 56 41 4c  e json_QUOTE(VAL
9b30: 55 45 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 52  UE) function.  R
9b40: 65 74 75 72 6e 20 61 20 4a 53 4f 4e 20 76 61 6c  eturn a JSON val
9b50: 75 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  ue.** correspond
9b60: 69 6e 67 20 74 6f 20 74 68 65 20 53 51 4c 20 76  ing to the SQL v
9b70: 61 6c 75 65 20 69 6e 70 75 74 2e 20 20 4d 6f 73  alue input.  Mos
9b80: 74 6c 79 20 74 68 69 73 20 6d 65 61 6e 73 20 70  tly this means p
9b90: 75 74 74 69 6e 67 20 0a 2a 2a 20 64 6f 75 62 6c  utting .** doubl
9ba0: 65 2d 71 75 6f 74 65 73 20 61 72 6f 75 6e 64 20  e-quotes around 
9bb0: 73 74 72 69 6e 67 73 20 61 6e 64 20 72 65 74 75  strings and retu
9bc0: 72 6e 69 6e 67 20 74 68 65 20 75 6e 71 75 6f 74  rning the unquot
9bd0: 65 64 20 73 74 72 69 6e 67 20 22 6e 75 6c 6c 22  ed string "null"
9be0: 0a 2a 2a 20 77 68 65 6e 20 67 69 76 65 6e 20 61  .** when given a
9bf0: 20 4e 55 4c 4c 20 69 6e 70 75 74 2e 0a 2a 2f 0a   NULL input..*/.
9c00: 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e  static void json
9c10: 51 75 6f 74 65 46 75 6e 63 28 0a 20 20 73 71 6c  QuoteFunc(.  sql
9c20: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74  ite3_context *ct
9c30: 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  x,.  int argc,. 
9c40: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
9c50: 2a 61 72 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e 53  *argv.){.  JsonS
9c60: 74 72 69 6e 67 20 6a 78 3b 0a 20 20 55 4e 55 53  tring jx;.  UNUS
9c70: 45 44 5f 50 41 52 41 4d 28 61 72 67 63 29 3b 0a  ED_PARAM(argc);.
9c80: 0a 20 20 6a 73 6f 6e 49 6e 69 74 28 26 6a 78 2c  .  jsonInit(&jx,
9c90: 20 63 74 78 29 3b 0a 20 20 6a 73 6f 6e 41 70 70   ctx);.  jsonApp
9ca0: 65 6e 64 56 61 6c 75 65 28 26 6a 78 2c 20 61 72  endValue(&jx, ar
9cb0: 67 76 5b 30 5d 29 3b 0a 20 20 6a 73 6f 6e 52 65  gv[0]);.  jsonRe
9cc0: 73 75 6c 74 28 26 6a 78 29 3b 0a 20 20 73 71 6c  sult(&jx);.  sql
9cd0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 73 75 62 74  ite3_result_subt
9ce0: 79 70 65 28 63 74 78 2c 20 4a 53 4f 4e 5f 53 55  ype(ctx, JSON_SU
9cf0: 42 54 59 50 45 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  BTYPE);.}../*.**
9d00: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
9d10: 6f 66 20 74 68 65 20 6a 73 6f 6e 5f 61 72 72 61  of the json_arra
9d20: 79 28 56 41 4c 55 45 2c 2e 2e 2e 29 20 66 75 6e  y(VALUE,...) fun
9d30: 63 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61  ction.  Return a
9d40: 20 4a 53 4f 4e 0a 2a 2a 20 61 72 72 61 79 20 74   JSON.** array t
9d50: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  hat contains all
9d60: 20 76 61 6c 75 65 73 20 67 69 76 65 6e 20 69 6e   values given in
9d70: 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 4f 72 20   arguments.  Or 
9d80: 69 66 20 61 6e 79 20 61 72 67 75 6d 65 6e 74 0a  if any argument.
9d90: 2a 2a 20 69 73 20 61 20 42 4c 4f 42 2c 20 74 68  ** is a BLOB, th
9da0: 72 6f 77 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f  row an error..*/
9db0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f  .static void jso
9dc0: 6e 41 72 72 61 79 46 75 6e 63 28 0a 20 20 73 71  nArrayFunc(.  sq
9dd0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
9de0: 74 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  tx,.  int argc,.
9df0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
9e00: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20  **argv.){.  int 
9e10: 69 3b 0a 20 20 4a 73 6f 6e 53 74 72 69 6e 67 20  i;.  JsonString 
9e20: 6a 78 3b 0a 0a 20 20 6a 73 6f 6e 49 6e 69 74 28  jx;..  jsonInit(
9e30: 26 6a 78 2c 20 63 74 78 29 3b 0a 20 20 6a 73 6f  &jx, ctx);.  jso
9e40: 6e 41 70 70 65 6e 64 43 68 61 72 28 26 6a 78 2c  nAppendChar(&jx,
9e50: 20 27 5b 27 29 3b 0a 20 20 66 6f 72 28 69 3d 30   '[');.  for(i=0
9e60: 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  ; i<argc; i++){.
9e70: 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 53 65      jsonAppendSe
9e80: 70 61 72 61 74 6f 72 28 26 6a 78 29 3b 0a 20 20  parator(&jx);.  
9e90: 20 20 6a 73 6f 6e 41 70 70 65 6e 64 56 61 6c 75    jsonAppendValu
9ea0: 65 28 26 6a 78 2c 20 61 72 67 76 5b 69 5d 29 3b  e(&jx, argv[i]);
9eb0: 0a 20 20 7d 0a 20 20 6a 73 6f 6e 41 70 70 65 6e  .  }.  jsonAppen
9ec0: 64 43 68 61 72 28 26 6a 78 2c 20 27 5d 27 29 3b  dChar(&jx, ']');
9ed0: 0a 20 20 6a 73 6f 6e 52 65 73 75 6c 74 28 26 6a  .  jsonResult(&j
9ee0: 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  x);.  sqlite3_re
9ef0: 73 75 6c 74 5f 73 75 62 74 79 70 65 28 63 74 78  sult_subtype(ctx
9f00: 2c 20 4a 53 4f 4e 5f 53 55 42 54 59 50 45 29 3b  , JSON_SUBTYPE);
9f10: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 6a 73 6f 6e 5f  .}.../*.** json_
9f20: 61 72 72 61 79 5f 6c 65 6e 67 74 68 28 4a 53 4f  array_length(JSO
9f30: 4e 29 0a 2a 2a 20 6a 73 6f 6e 5f 61 72 72 61 79  N).** json_array
9f40: 5f 6c 65 6e 67 74 68 28 4a 53 4f 4e 2c 20 50 41  _length(JSON, PA
9f50: 54 48 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  TH).**.** Return
9f60: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
9f70: 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 74  lements in the t
9f80: 6f 70 2d 6c 65 76 65 6c 20 4a 53 4f 4e 20 61 72  op-level JSON ar
9f90: 72 61 79 2e 20 20 0a 2a 2a 20 52 65 74 75 72 6e  ray.  .** Return
9fa0: 20 30 20 69 66 20 74 68 65 20 69 6e 70 75 74 20   0 if the input 
9fb0: 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f  is not a well-fo
9fc0: 72 6d 65 64 20 4a 53 4f 4e 20 61 72 72 61 79 2e  rmed JSON array.
9fd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9fe0: 6a 73 6f 6e 41 72 72 61 79 4c 65 6e 67 74 68 46  jsonArrayLengthF
9ff0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
a000: 6f 6e 74 65 78 74 20 2a 63 74 78 2c 0a 20 20 69  ontext *ctx,.  i
a010: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
a020: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
a030: 29 7b 0a 20 20 4a 73 6f 6e 50 61 72 73 65 20 2a  ){.  JsonParse *
a040: 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  p;          /* T
a050: 68 65 20 70 61 72 73 65 20 2a 2f 0a 20 20 73 71  he parse */.  sq
a060: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 20 3d 20  lite3_int64 n = 
a070: 30 3b 0a 20 20 75 33 32 20 69 3b 0a 20 20 4a 73  0;.  u32 i;.  Js
a080: 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 3b 0a 0a  onNode *pNode;..
a090: 20 20 70 20 3d 20 6a 73 6f 6e 50 61 72 73 65 43    p = jsonParseC
a0a0: 61 63 68 65 64 28 63 74 78 2c 20 61 72 67 76 2c  ached(ctx, argv,
a0b0: 20 63 74 78 29 3b 0a 20 20 69 66 28 20 70 3d 3d   ctx);.  if( p==
a0c0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  0 ) return;.  as
a0d0: 73 65 72 74 28 20 70 2d 3e 6e 4e 6f 64 65 20 29  sert( p->nNode )
a0e0: 3b 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 32 20  ;.  if( argc==2 
a0f0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
a100: 72 20 2a 7a 50 61 74 68 20 3d 20 28 63 6f 6e 73  r *zPath = (cons
a110: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
a120: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
a130: 31 5d 29 3b 0a 20 20 20 20 70 4e 6f 64 65 20 3d  1]);.    pNode =
a140: 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 28 70 2c 20 7a   jsonLookup(p, z
a150: 50 61 74 68 2c 20 30 2c 20 63 74 78 29 3b 0a 20  Path, 0, ctx);. 
a160: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 6f 64   }else{.    pNod
a170: 65 20 3d 20 70 2d 3e 61 4e 6f 64 65 3b 0a 20 20  e = p->aNode;.  
a180: 7d 0a 20 20 69 66 28 20 70 4e 6f 64 65 3d 3d 30  }.  if( pNode==0
a190: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
a1a0: 20 20 7d 0a 20 20 69 66 28 20 70 4e 6f 64 65 2d    }.  if( pNode-
a1b0: 3e 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f 41 52 52  >eType==JSON_ARR
a1c0: 41 59 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  AY ){.    assert
a1d0: 28 20 28 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67  ( (pNode->jnFlag
a1e0: 73 20 26 20 4a 4e 4f 44 45 5f 41 50 50 45 4e 44  s & JNODE_APPEND
a1f0: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28  )==0 );.    for(
a200: 69 3d 31 3b 20 69 3c 3d 70 4e 6f 64 65 2d 3e 6e  i=1; i<=pNode->n
a210: 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69 20  ; n++){.      i 
a220: 2b 3d 20 6a 73 6f 6e 4e 6f 64 65 53 69 7a 65 28  += jsonNodeSize(
a230: 26 70 4e 6f 64 65 5b 69 5d 29 3b 0a 20 20 20 20  &pNode[i]);.    
a240: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
a250: 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 74 78  result_int64(ctx
a260: 2c 20 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 6a  , n);.}../*.** j
a270: 73 6f 6e 5f 65 78 74 72 61 63 74 28 4a 53 4f 4e  son_extract(JSON
a280: 2c 20 50 41 54 48 2c 20 2e 2e 2e 29 0a 2a 2a 0a  , PATH, ...).**.
a290: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 65 6c  ** Return the el
a2a0: 65 6d 65 6e 74 20 64 65 73 63 72 69 62 65 64 20  ement described 
a2b0: 62 79 20 50 41 54 48 2e 20 20 52 65 74 75 72 6e  by PATH.  Return
a2c0: 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 69   NULL if there i
a2d0: 73 20 6e 6f 0a 2a 2a 20 50 41 54 48 20 65 6c 65  s no.** PATH ele
a2e0: 6d 65 6e 74 2e 20 20 49 66 20 74 68 65 72 65 20  ment.  If there 
a2f0: 61 72 65 20 6d 75 6c 74 69 70 6c 65 20 50 41 54  are multiple PAT
a300: 48 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  Hs, then return 
a310: 61 20 4a 53 4f 4e 20 61 72 72 61 79 0a 2a 2a 20  a JSON array.** 
a320: 77 69 74 68 20 74 68 65 20 72 65 73 75 6c 74 20  with the result 
a330: 66 72 6f 6d 20 65 61 63 68 20 70 61 74 68 2e 20  from each path. 
a340: 20 54 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 20   Throw an error 
a350: 69 66 20 74 68 65 20 4a 53 4f 4e 20 6f 72 20 61  if the JSON or a
a360: 6e 79 20 50 41 54 48 0a 2a 2a 20 69 73 20 6d 61  ny PATH.** is ma
a370: 6c 66 6f 72 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74  lformed..*/.stat
a380: 69 63 20 76 6f 69 64 20 6a 73 6f 6e 45 78 74 72  ic void jsonExtr
a390: 61 63 74 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  actFunc(.  sqlit
a3a0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c  e3_context *ctx,
a3b0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
a3c0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
a3d0: 72 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e 50 61 72  rgv.){.  JsonPar
a3e0: 73 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  se *p;          
a3f0: 2f 2a 20 54 68 65 20 70 61 72 73 65 20 2a 2f 0a  /* The parse */.
a400: 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64    JsonNode *pNod
a410: 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e;.  const char 
a420: 2a 7a 50 61 74 68 3b 0a 20 20 4a 73 6f 6e 53 74  *zPath;.  JsonSt
a430: 72 69 6e 67 20 6a 78 3b 0a 20 20 69 6e 74 20 69  ring jx;.  int i
a440: 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 3c 32 20  ;..  if( argc<2 
a450: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20  ) return;.  p = 
a460: 6a 73 6f 6e 50 61 72 73 65 43 61 63 68 65 64 28  jsonParseCached(
a470: 63 74 78 2c 20 61 72 67 76 2c 20 63 74 78 29 3b  ctx, argv, ctx);
a480: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
a490: 74 75 72 6e 3b 0a 20 20 6a 73 6f 6e 49 6e 69 74  turn;.  jsonInit
a4a0: 28 26 6a 78 2c 20 63 74 78 29 3b 0a 20 20 6a 73  (&jx, ctx);.  js
a4b0: 6f 6e 41 70 70 65 6e 64 43 68 61 72 28 26 6a 78  onAppendChar(&jx
a4c0: 2c 20 27 5b 27 29 3b 0a 20 20 66 6f 72 28 69 3d  , '[');.  for(i=
a4d0: 31 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b  1; i<argc; i++){
a4e0: 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 28 63 6f  .    zPath = (co
a4f0: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
a500: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
a510: 76 5b 69 5d 29 3b 0a 20 20 20 20 70 4e 6f 64 65  v[i]);.    pNode
a520: 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 28 70 2c   = jsonLookup(p,
a530: 20 7a 50 61 74 68 2c 20 30 2c 20 63 74 78 29 3b   zPath, 0, ctx);
a540: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 45 72 72  .    if( p->nErr
a550: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
a560: 28 20 61 72 67 63 3e 32 20 29 7b 0a 20 20 20 20  ( argc>2 ){.    
a570: 20 20 6a 73 6f 6e 41 70 70 65 6e 64 53 65 70 61    jsonAppendSepa
a580: 72 61 74 6f 72 28 26 6a 78 29 3b 0a 20 20 20 20  rator(&jx);.    
a590: 20 20 69 66 28 20 70 4e 6f 64 65 20 29 7b 0a 20    if( pNode ){. 
a5a0: 20 20 20 20 20 20 20 6a 73 6f 6e 52 65 6e 64 65         jsonRende
a5b0: 72 4e 6f 64 65 28 70 4e 6f 64 65 2c 20 26 6a 78  rNode(pNode, &jx
a5c0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 0);.      }els
a5d0: 65 7b 0a 20 20 20 20 20 20 20 20 6a 73 6f 6e 41  e{.        jsonA
a5e0: 70 70 65 6e 64 52 61 77 28 26 6a 78 2c 20 22 6e  ppendRaw(&jx, "n
a5f0: 75 6c 6c 22 2c 20 34 29 3b 0a 20 20 20 20 20 20  ull", 4);.      
a600: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
a610: 70 4e 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 6a  pNode ){.      j
a620: 73 6f 6e 52 65 74 75 72 6e 28 70 4e 6f 64 65 2c  sonReturn(pNode,
a630: 20 63 74 78 2c 20 30 29 3b 0a 20 20 20 20 7d 0a   ctx, 0);.    }.
a640: 20 20 7d 0a 20 20 69 66 28 20 61 72 67 63 3e 32    }.  if( argc>2
a650: 20 26 26 20 69 3d 3d 61 72 67 63 20 29 7b 0a 20   && i==argc ){. 
a660: 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61     jsonAppendCha
a670: 72 28 26 6a 78 2c 20 27 5d 27 29 3b 0a 20 20 20  r(&jx, ']');.   
a680: 20 6a 73 6f 6e 52 65 73 75 6c 74 28 26 6a 78 29   jsonResult(&jx)
a690: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  ;.    sqlite3_re
a6a0: 73 75 6c 74 5f 73 75 62 74 79 70 65 28 63 74 78  sult_subtype(ctx
a6b0: 2c 20 4a 53 4f 4e 5f 53 55 42 54 59 50 45 29 3b  , JSON_SUBTYPE);
a6c0: 0a 20 20 7d 0a 20 20 6a 73 6f 6e 52 65 73 65 74  .  }.  jsonReset
a6d0: 28 26 6a 78 29 3b 0a 7d 0a 0a 2f 2a 20 54 68 69  (&jx);.}../* Thi
a6e0: 73 20 69 73 20 74 68 65 20 52 46 43 20 37 33 39  s is the RFC 739
a6f0: 36 20 4d 65 72 67 65 50 61 74 63 68 20 61 6c 67  6 MergePatch alg
a700: 6f 72 69 74 68 6d 2e 0a 2a 2f 0a 73 74 61 74 69  orithm..*/.stati
a710: 63 20 4a 73 6f 6e 4e 6f 64 65 20 2a 6a 73 6f 6e  c JsonNode *json
a720: 4d 65 72 67 65 50 61 74 63 68 28 0a 20 20 4a 73  MergePatch(.  Js
a730: 6f 6e 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  onParse *pParse,
a740: 20 20 20 2f 2a 20 54 68 65 20 4a 53 4f 4e 20 70     /* The JSON p
a750: 61 72 73 65 72 20 74 68 61 74 20 63 6f 6e 74 61  arser that conta
a760: 69 6e 73 20 74 68 65 20 54 41 52 47 45 54 20 2a  ins the TARGET *
a770: 2f 0a 20 20 75 33 32 20 69 54 61 72 67 65 74 2c  /.  u32 iTarget,
a780: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 64 65           /* Node
a790: 20 6f 66 20 74 68 65 20 54 41 52 47 45 54 20 69   of the TARGET i
a7a0: 6e 20 70 50 61 72 73 65 20 2a 2f 0a 20 20 4a 73  n pParse */.  Js
a7b0: 6f 6e 4e 6f 64 65 20 2a 70 50 61 74 63 68 20 20  onNode *pPatch  
a7c0: 20 20 20 2f 2a 20 54 68 65 20 50 41 54 43 48 20     /* The PATCH 
a7d0: 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 69 2c 20 6a  */.){.  u32 i, j
a7e0: 3b 0a 20 20 75 33 32 20 69 52 6f 6f 74 3b 0a 20  ;.  u32 iRoot;. 
a7f0: 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 54 61 72 67   JsonNode *pTarg
a800: 65 74 3b 0a 20 20 69 66 28 20 70 50 61 74 63 68  et;.  if( pPatch
a810: 2d 3e 65 54 79 70 65 21 3d 4a 53 4f 4e 5f 4f 42  ->eType!=JSON_OB
a820: 4a 45 43 54 20 29 7b 0a 20 20 20 20 72 65 74 75  JECT ){.    retu
a830: 72 6e 20 70 50 61 74 63 68 3b 0a 20 20 7d 0a 20  rn pPatch;.  }. 
a840: 20 61 73 73 65 72 74 28 20 69 54 61 72 67 65 74   assert( iTarget
a850: 3e 3d 30 20 26 26 20 69 54 61 72 67 65 74 3c 70  >=0 && iTarget<p
a860: 50 61 72 73 65 2d 3e 6e 4e 6f 64 65 20 29 3b 0a  Parse->nNode );.
a870: 20 20 70 54 61 72 67 65 74 20 3d 20 26 70 50 61    pTarget = &pPa
a880: 72 73 65 2d 3e 61 4e 6f 64 65 5b 69 54 61 72 67  rse->aNode[iTarg
a890: 65 74 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28  et];.  assert( (
a8a0: 70 50 61 74 63 68 2d 3e 6a 6e 46 6c 61 67 73 20  pPatch->jnFlags 
a8b0: 26 20 4a 4e 4f 44 45 5f 41 50 50 45 4e 44 29 3d  & JNODE_APPEND)=
a8c0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 54 61 72  =0 );.  if( pTar
a8d0: 67 65 74 2d 3e 65 54 79 70 65 21 3d 4a 53 4f 4e  get->eType!=JSON
a8e0: 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 6a  _OBJECT ){.    j
a8f0: 73 6f 6e 52 65 6d 6f 76 65 41 6c 6c 4e 75 6c 6c  sonRemoveAllNull
a900: 73 28 70 50 61 74 63 68 29 3b 0a 20 20 20 20 72  s(pPatch);.    r
a910: 65 74 75 72 6e 20 70 50 61 74 63 68 3b 0a 20 20  eturn pPatch;.  
a920: 7d 0a 20 20 69 52 6f 6f 74 20 3d 20 69 54 61 72  }.  iRoot = iTar
a930: 67 65 74 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20  get;.  for(i=1; 
a940: 69 3c 70 50 61 74 63 68 2d 3e 6e 3b 20 69 20 2b  i<pPatch->n; i +
a950: 3d 20 6a 73 6f 6e 4e 6f 64 65 53 69 7a 65 28 26  = jsonNodeSize(&
a960: 70 50 61 74 63 68 5b 69 2b 31 5d 29 2b 31 29 7b  pPatch[i+1])+1){
a970: 0a 20 20 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20  .    u32 nKey;. 
a980: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
a990: 4b 65 79 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Key;.    assert(
a9a0: 20 70 50 61 74 63 68 5b 69 5d 2e 65 54 79 70 65   pPatch[i].eType
a9b0: 3d 3d 4a 53 4f 4e 5f 53 54 52 49 4e 47 20 29 3b  ==JSON_STRING );
a9c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
a9d0: 74 63 68 5b 69 5d 2e 6a 6e 46 6c 61 67 73 20 26  tch[i].jnFlags &
a9e0: 20 4a 4e 4f 44 45 5f 4c 41 42 45 4c 20 29 3b 0a   JNODE_LABEL );.
a9f0: 20 20 20 20 6e 4b 65 79 20 3d 20 70 50 61 74 63      nKey = pPatc
aa00: 68 5b 69 5d 2e 6e 3b 0a 20 20 20 20 7a 4b 65 79  h[i].n;.    zKey
aa10: 20 3d 20 70 50 61 74 63 68 5b 69 5d 2e 75 2e 7a   = pPatch[i].u.z
aa20: 4a 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 61 73  JContent;.    as
aa30: 73 65 72 74 28 20 28 70 50 61 74 63 68 5b 69 5d  sert( (pPatch[i]
aa40: 2e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45  .jnFlags & JNODE
aa50: 5f 52 41 57 29 3d 3d 30 20 29 3b 0a 20 20 20 20  _RAW)==0 );.    
aa60: 66 6f 72 28 6a 3d 31 3b 20 6a 3c 70 54 61 72 67  for(j=1; j<pTarg
aa70: 65 74 2d 3e 6e 3b 20 6a 20 2b 3d 20 6a 73 6f 6e  et->n; j += json
aa80: 4e 6f 64 65 53 69 7a 65 28 26 70 54 61 72 67 65  NodeSize(&pTarge
aa90: 74 5b 6a 2b 31 5d 29 2b 31 20 29 7b 0a 20 20 20  t[j+1])+1 ){.   
aaa0: 20 20 20 61 73 73 65 72 74 28 20 70 54 61 72 67     assert( pTarg
aab0: 65 74 5b 6a 5d 2e 65 54 79 70 65 3d 3d 4a 53 4f  et[j].eType==JSO
aac0: 4e 5f 53 54 52 49 4e 47 20 29 3b 0a 20 20 20 20  N_STRING );.    
aad0: 20 20 61 73 73 65 72 74 28 20 70 54 61 72 67 65    assert( pTarge
aae0: 74 5b 6a 5d 2e 6a 6e 46 6c 61 67 73 20 26 20 4a  t[j].jnFlags & J
aaf0: 4e 4f 44 45 5f 4c 41 42 45 4c 20 29 3b 0a 20 20  NODE_LABEL );.  
ab00: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50 61      assert( (pPa
ab10: 74 63 68 5b 69 5d 2e 6a 6e 46 6c 61 67 73 20 26  tch[i].jnFlags &
ab20: 20 4a 4e 4f 44 45 5f 52 41 57 29 3d 3d 30 20 29   JNODE_RAW)==0 )
ab30: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 72  ;.      if( pTar
ab40: 67 65 74 5b 6a 5d 2e 6e 3d 3d 6e 4b 65 79 20 26  get[j].n==nKey &
ab50: 26 20 73 74 72 6e 63 6d 70 28 70 54 61 72 67 65  & strncmp(pTarge
ab60: 74 5b 6a 5d 2e 75 2e 7a 4a 43 6f 6e 74 65 6e 74  t[j].u.zJContent
ab70: 2c 7a 4b 65 79 2c 6e 4b 65 79 29 3d 3d 30 20 29  ,zKey,nKey)==0 )
ab80: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  {.        if( pT
ab90: 61 72 67 65 74 5b 6a 2b 31 5d 2e 6a 6e 46 6c 61  arget[j+1].jnFla
aba0: 67 73 20 26 20 28 4a 4e 4f 44 45 5f 52 45 4d 4f  gs & (JNODE_REMO
abb0: 56 45 7c 4a 4e 4f 44 45 5f 50 41 54 43 48 29 20  VE|JNODE_PATCH) 
abc0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
abd0: 20 69 66 28 20 70 50 61 74 63 68 5b 69 2b 31 5d   if( pPatch[i+1]
abe0: 2e 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f 4e 55 4c  .eType==JSON_NUL
abf0: 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  L ){.          p
ac00: 54 61 72 67 65 74 5b 6a 2b 31 5d 2e 6a 6e 46 6c  Target[j+1].jnFl
ac10: 61 67 73 20 7c 3d 20 4a 4e 4f 44 45 5f 52 45 4d  ags |= JNODE_REM
ac20: 4f 56 45 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  OVE;.        }el
ac30: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 4a 73  se{.          Js
ac40: 6f 6e 4e 6f 64 65 20 2a 70 4e 65 77 20 3d 20 6a  onNode *pNew = j
ac50: 73 6f 6e 4d 65 72 67 65 50 61 74 63 68 28 70 50  sonMergePatch(pP
ac60: 61 72 73 65 2c 20 69 54 61 72 67 65 74 2b 6a 2b  arse, iTarget+j+
ac70: 31 2c 20 26 70 50 61 74 63 68 5b 69 2b 31 5d 29  1, &pPatch[i+1])
ac80: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
ac90: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
aca0: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54   0;.          pT
acb0: 61 72 67 65 74 20 3d 20 26 70 50 61 72 73 65 2d  arget = &pParse-
acc0: 3e 61 4e 6f 64 65 5b 69 54 61 72 67 65 74 5d 3b  >aNode[iTarget];
acd0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
ace0: 4e 65 77 21 3d 26 70 54 61 72 67 65 74 5b 6a 2b  New!=&pTarget[j+
acf0: 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1] ){.          
ad00: 20 20 70 54 61 72 67 65 74 5b 6a 2b 31 5d 2e 75    pTarget[j+1].u
ad10: 2e 70 50 61 74 63 68 20 3d 20 70 4e 65 77 3b 0a  .pPatch = pNew;.
ad20: 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61 72              pTar
ad30: 67 65 74 5b 6a 2b 31 5d 2e 6a 6e 46 6c 61 67 73  get[j+1].jnFlags
ad40: 20 7c 3d 20 4a 4e 4f 44 45 5f 50 41 54 43 48 3b   |= JNODE_PATCH;
ad50: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
ad60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
ad70: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
ad80: 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70    }.    if( j>=p
ad90: 54 61 72 67 65 74 2d 3e 6e 20 26 26 20 70 50 61  Target->n && pPa
ada0: 74 63 68 5b 69 2b 31 5d 2e 65 54 79 70 65 21 3d  tch[i+1].eType!=
adb0: 4a 53 4f 4e 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20  JSON_NULL ){.   
adc0: 20 20 20 69 6e 74 20 69 53 74 61 72 74 2c 20 69     int iStart, i
add0: 50 61 74 63 68 3b 0a 20 20 20 20 20 20 69 53 74  Patch;.      iSt
ade0: 61 72 74 20 3d 20 6a 73 6f 6e 50 61 72 73 65 41  art = jsonParseA
adf0: 64 64 4e 6f 64 65 28 70 50 61 72 73 65 2c 20 4a  ddNode(pParse, J
ae00: 53 4f 4e 5f 4f 42 4a 45 43 54 2c 20 32 2c 20 30  SON_OBJECT, 2, 0
ae10: 29 3b 0a 20 20 20 20 20 20 6a 73 6f 6e 50 61 72  );.      jsonPar
ae20: 73 65 41 64 64 4e 6f 64 65 28 70 50 61 72 73 65  seAddNode(pParse
ae30: 2c 20 4a 53 4f 4e 5f 53 54 52 49 4e 47 2c 20 6e  , JSON_STRING, n
ae40: 4b 65 79 2c 20 7a 4b 65 79 29 3b 0a 20 20 20 20  Key, zKey);.    
ae50: 20 20 69 50 61 74 63 68 20 3d 20 6a 73 6f 6e 50    iPatch = jsonP
ae60: 61 72 73 65 41 64 64 4e 6f 64 65 28 70 50 61 72  arseAddNode(pPar
ae70: 73 65 2c 20 4a 53 4f 4e 5f 54 52 55 45 2c 20 30  se, JSON_TRUE, 0
ae80: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
ae90: 70 50 61 72 73 65 2d 3e 6f 6f 6d 20 29 20 72 65  pParse->oom ) re
aea0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 6a 73  turn 0;.      js
aeb0: 6f 6e 52 65 6d 6f 76 65 41 6c 6c 4e 75 6c 6c 73  onRemoveAllNulls
aec0: 28 70 50 61 74 63 68 29 3b 0a 20 20 20 20 20 20  (pPatch);.      
aed0: 70 54 61 72 67 65 74 20 3d 20 26 70 50 61 72 73  pTarget = &pPars
aee0: 65 2d 3e 61 4e 6f 64 65 5b 69 54 61 72 67 65 74  e->aNode[iTarget
aef0: 5d 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ];.      pParse-
af00: 3e 61 4e 6f 64 65 5b 69 52 6f 6f 74 5d 2e 6a 6e  >aNode[iRoot].jn
af10: 46 6c 61 67 73 20 7c 3d 20 4a 4e 4f 44 45 5f 41  Flags |= JNODE_A
af20: 50 50 45 4e 44 3b 0a 20 20 20 20 20 20 70 50 61  PPEND;.      pPa
af30: 72 73 65 2d 3e 61 4e 6f 64 65 5b 69 52 6f 6f 74  rse->aNode[iRoot
af40: 5d 2e 75 2e 69 41 70 70 65 6e 64 20 3d 20 69 53  ].u.iAppend = iS
af50: 74 61 72 74 20 2d 20 69 52 6f 6f 74 3b 0a 20 20  tart - iRoot;.  
af60: 20 20 20 20 69 52 6f 6f 74 20 3d 20 69 53 74 61      iRoot = iSta
af70: 72 74 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  rt;.      pParse
af80: 2d 3e 61 4e 6f 64 65 5b 69 50 61 74 63 68 5d 2e  ->aNode[iPatch].
af90: 6a 6e 46 6c 61 67 73 20 7c 3d 20 4a 4e 4f 44 45  jnFlags |= JNODE
afa0: 5f 50 41 54 43 48 3b 0a 20 20 20 20 20 20 70 50  _PATCH;.      pP
afb0: 61 72 73 65 2d 3e 61 4e 6f 64 65 5b 69 50 61 74  arse->aNode[iPat
afc0: 63 68 5d 2e 75 2e 70 50 61 74 63 68 20 3d 20 26  ch].u.pPatch = &
afd0: 70 50 61 74 63 68 5b 69 2b 31 5d 3b 0a 20 20 20  pPatch[i+1];.   
afe0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
aff0: 70 54 61 72 67 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  pTarget;.}../*.*
b000: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
b010: 20 6f 66 20 74 68 65 20 6a 73 6f 6e 5f 6d 65 72   of the json_mer
b020: 67 65 70 61 74 63 68 28 4a 53 4f 4e 31 2c 4a 53  gepatch(JSON1,JS
b030: 4f 4e 32 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  ON2) function.  
b040: 52 65 74 75 72 6e 20 61 20 4a 53 4f 4e 0a 2a 2a  Return a JSON.**
b050: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73 20   object that is 
b060: 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 72 75  the result of ru
b070: 6e 6e 69 6e 67 20 74 68 65 20 52 46 43 20 37 33  nning the RFC 73
b080: 39 36 20 4d 65 72 67 65 50 61 74 63 68 28 29 20  96 MergePatch() 
b090: 61 6c 67 6f 72 69 74 68 6d 0a 2a 2a 20 6f 6e 20  algorithm.** on 
b0a0: 74 68 65 20 74 77 6f 20 61 72 67 75 6d 65 6e 74  the two argument
b0b0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
b0c0: 64 20 6a 73 6f 6e 50 61 74 63 68 46 75 6e 63 28  d jsonPatchFunc(
b0d0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
b0e0: 78 74 20 2a 63 74 78 2c 0a 20 20 69 6e 74 20 61  xt *ctx,.  int a
b0f0: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
b100: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
b110: 20 4a 73 6f 6e 50 61 72 73 65 20 78 3b 20 20 20   JsonParse x;   
b120: 20 20 2f 2a 20 54 68 65 20 4a 53 4f 4e 20 74 68    /* The JSON th
b130: 61 74 20 69 73 20 62 65 69 6e 67 20 70 61 74 63  at is being patc
b140: 68 65 64 20 2a 2f 0a 20 20 4a 73 6f 6e 50 61 72  hed */.  JsonPar
b150: 73 65 20 79 3b 20 20 20 20 20 2f 2a 20 54 68 65  se y;     /* The
b160: 20 70 61 74 63 68 20 2a 2f 0a 20 20 4a 73 6f 6e   patch */.  Json
b170: 4e 6f 64 65 20 2a 70 52 65 73 75 6c 74 3b 20 20  Node *pResult;  
b180: 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 6f   /* The result o
b190: 66 20 74 68 65 20 6d 65 72 67 65 20 2a 2f 0a 0a  f the merge */..
b1a0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 61    UNUSED_PARAM(a
b1b0: 72 67 63 29 3b 0a 20 20 69 66 28 20 6a 73 6f 6e  rgc);.  if( json
b1c0: 50 61 72 73 65 28 26 78 2c 20 63 74 78 2c 20 28  Parse(&x, ctx, (
b1d0: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
b1e0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
b1f0: 72 67 76 5b 30 5d 29 29 20 29 20 72 65 74 75 72  rgv[0])) ) retur
b200: 6e 3b 0a 20 20 69 66 28 20 6a 73 6f 6e 50 61 72  n;.  if( jsonPar
b210: 73 65 28 26 79 2c 20 63 74 78 2c 20 28 63 6f 6e  se(&y, ctx, (con
b220: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
b230: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
b240: 5b 31 5d 29 29 20 29 7b 0a 20 20 20 20 6a 73 6f  [1])) ){.    jso
b250: 6e 50 61 72 73 65 52 65 73 65 74 28 26 78 29 3b  nParseReset(&x);
b260: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
b270: 0a 20 20 70 52 65 73 75 6c 74 20 3d 20 6a 73 6f  .  pResult = jso
b280: 6e 4d 65 72 67 65 50 61 74 63 68 28 26 78 2c 20  nMergePatch(&x, 
b290: 30 2c 20 79 2e 61 4e 6f 64 65 29 3b 0a 20 20 61  0, y.aNode);.  a
b2a0: 73 73 65 72 74 28 20 70 52 65 73 75 6c 74 21 3d  ssert( pResult!=
b2b0: 30 20 7c 7c 20 78 2e 6f 6f 6d 20 29 3b 0a 20 20  0 || x.oom );.  
b2c0: 69 66 28 20 70 52 65 73 75 6c 74 20 29 7b 0a 20  if( pResult ){. 
b2d0: 20 20 20 6a 73 6f 6e 52 65 74 75 72 6e 4a 73 6f     jsonReturnJso
b2e0: 6e 28 70 52 65 73 75 6c 74 2c 20 63 74 78 2c 20  n(pResult, ctx, 
b2f0: 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
b300: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
b310: 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 74 78 29  error_nomem(ctx)
b320: 3b 0a 20 20 7d 0a 20 20 6a 73 6f 6e 50 61 72 73  ;.  }.  jsonPars
b330: 65 52 65 73 65 74 28 26 78 29 3b 0a 20 20 6a 73  eReset(&x);.  js
b340: 6f 6e 50 61 72 73 65 52 65 73 65 74 28 26 79 29  onParseReset(&y)
b350: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  ;.}.../*.** Impl
b360: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
b370: 65 20 6a 73 6f 6e 5f 6f 62 6a 65 63 74 28 4e 41  e json_object(NA
b380: 4d 45 2c 56 41 4c 55 45 2c 2e 2e 2e 29 20 66 75  ME,VALUE,...) fu
b390: 6e 63 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20  nction.  Return 
b3a0: 61 20 4a 53 4f 4e 0a 2a 2a 20 6f 62 6a 65 63 74  a JSON.** object
b3b0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61   that contains a
b3c0: 6c 6c 20 6e 61 6d 65 2f 76 61 6c 75 65 20 67 69  ll name/value gi
b3d0: 76 65 6e 20 69 6e 20 61 72 67 75 6d 65 6e 74 73  ven in arguments
b3e0: 2e 20 20 4f 72 20 69 66 20 61 6e 79 20 6e 61 6d  .  Or if any nam
b3f0: 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 20 73 74  e.** is not a st
b400: 72 69 6e 67 20 6f 72 20 69 66 20 61 6e 79 20 76  ring or if any v
b410: 61 6c 75 65 20 69 73 20 61 20 42 4c 4f 42 2c 20  alue is a BLOB, 
b420: 74 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 2e 0a  throw an error..
b430: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a  */.static void j
b440: 73 6f 6e 4f 62 6a 65 63 74 46 75 6e 63 28 0a 20  sonObjectFunc(. 
b450: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
b460: 20 2a 63 74 78 2c 0a 20 20 69 6e 74 20 61 72 67   *ctx,.  int arg
b470: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
b480: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69  ue **argv.){.  i
b490: 6e 74 20 69 3b 0a 20 20 4a 73 6f 6e 53 74 72 69  nt i;.  JsonStri
b4a0: 6e 67 20 6a 78 3b 0a 20 20 63 6f 6e 73 74 20 63  ng jx;.  const c
b4b0: 68 61 72 20 2a 7a 3b 0a 20 20 75 33 32 20 6e 3b  har *z;.  u32 n;
b4c0: 0a 0a 20 20 69 66 28 20 61 72 67 63 26 31 20 29  ..  if( argc&1 )
b4d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
b4e0: 73 75 6c 74 5f 65 72 72 6f 72 28 63 74 78 2c 20  sult_error(ctx, 
b4f0: 22 6a 73 6f 6e 5f 6f 62 6a 65 63 74 28 29 20 72  "json_object() r
b500: 65 71 75 69 72 65 73 20 61 6e 20 65 76 65 6e 20  equires an even 
b510: 6e 75 6d 62 65 72 20 22 0a 20 20 20 20 20 20 20  number ".       
b520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b530: 20 20 20 20 20 20 20 20 20 20 20 22 6f 66 20 61             "of a
b540: 72 67 75 6d 65 6e 74 73 22 2c 20 2d 31 29 3b 0a  rguments", -1);.
b550: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
b560: 20 20 6a 73 6f 6e 49 6e 69 74 28 26 6a 78 2c 20    jsonInit(&jx, 
b570: 63 74 78 29 3b 0a 20 20 6a 73 6f 6e 41 70 70 65  ctx);.  jsonAppe
b580: 6e 64 43 68 61 72 28 26 6a 78 2c 20 27 7b 27 29  ndChar(&jx, '{')
b590: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61  ;.  for(i=0; i<a
b5a0: 72 67 63 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20  rgc; i+=2){.    
b5b0: 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  if( sqlite3_valu
b5c0: 65 5f 74 79 70 65 28 61 72 67 76 5b 69 5d 29 21  e_type(argv[i])!
b5d0: 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a  =SQLITE_TEXT ){.
b5e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
b5f0: 73 75 6c 74 5f 65 72 72 6f 72 28 63 74 78 2c 20  sult_error(ctx, 
b600: 22 6a 73 6f 6e 5f 6f 62 6a 65 63 74 28 29 20 6c  "json_object() l
b610: 61 62 65 6c 73 20 6d 75 73 74 20 62 65 20 54 45  abels must be TE
b620: 58 54 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  XT", -1);.      
b630: 6a 73 6f 6e 52 65 73 65 74 28 26 6a 78 29 3b 0a  jsonReset(&jx);.
b640: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
b650: 20 20 7d 0a 20 20 20 20 6a 73 6f 6e 41 70 70 65    }.    jsonAppe
b660: 6e 64 53 65 70 61 72 61 74 6f 72 28 26 6a 78 29  ndSeparator(&jx)
b670: 3b 0a 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74  ;.    z = (const
b680: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
b690: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 69  alue_text(argv[i
b6a0: 5d 29 3b 0a 20 20 20 20 6e 20 3d 20 28 75 33 32  ]);.    n = (u32
b6b0: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62  )sqlite3_value_b
b6c0: 79 74 65 73 28 61 72 67 76 5b 69 5d 29 3b 0a 20  ytes(argv[i]);. 
b6d0: 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 53 74 72     jsonAppendStr
b6e0: 69 6e 67 28 26 6a 78 2c 20 7a 2c 20 6e 29 3b 0a  ing(&jx, z, n);.
b6f0: 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68      jsonAppendCh
b700: 61 72 28 26 6a 78 2c 20 27 3a 27 29 3b 0a 20 20  ar(&jx, ':');.  
b710: 20 20 6a 73 6f 6e 41 70 70 65 6e 64 56 61 6c 75    jsonAppendValu
b720: 65 28 26 6a 78 2c 20 61 72 67 76 5b 69 2b 31 5d  e(&jx, argv[i+1]
b730: 29 3b 0a 20 20 7d 0a 20 20 6a 73 6f 6e 41 70 70  );.  }.  jsonApp
b740: 65 6e 64 43 68 61 72 28 26 6a 78 2c 20 27 7d 27  endChar(&jx, '}'
b750: 29 3b 0a 20 20 6a 73 6f 6e 52 65 73 75 6c 74 28  );.  jsonResult(
b760: 26 6a 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  &jx);.  sqlite3_
b770: 72 65 73 75 6c 74 5f 73 75 62 74 79 70 65 28 63  result_subtype(c
b780: 74 78 2c 20 4a 53 4f 4e 5f 53 55 42 54 59 50 45  tx, JSON_SUBTYPE
b790: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 6a 73 6f  );.}.../*.** jso
b7a0: 6e 5f 72 65 6d 6f 76 65 28 4a 53 4f 4e 2c 20 50  n_remove(JSON, P
b7b0: 41 54 48 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20  ATH, ...).**.** 
b7c0: 52 65 6d 6f 76 65 20 74 68 65 20 6e 61 6d 65 64  Remove the named
b7d0: 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 20 4a   elements from J
b7e0: 53 4f 4e 20 61 6e 64 20 72 65 74 75 72 6e 20 74  SON and return t
b7f0: 68 65 20 72 65 73 75 6c 74 2e 20 20 6d 61 6c 66  he result.  malf
b800: 6f 72 6d 65 64 0a 2a 2a 20 4a 53 4f 4e 20 6f 72  ormed.** JSON or
b810: 20 50 41 54 48 20 61 72 67 75 6d 65 6e 74 73 20   PATH arguments 
b820: 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 65 72 72  result in an err
b830: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  or..*/.static vo
b840: 69 64 20 6a 73 6f 6e 52 65 6d 6f 76 65 46 75 6e  id jsonRemoveFun
b850: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
b860: 74 65 78 74 20 2a 63 74 78 2c 0a 20 20 69 6e 74  text *ctx,.  int
b870: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
b880: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
b890: 0a 20 20 4a 73 6f 6e 50 61 72 73 65 20 78 3b 20  .  JsonParse x; 
b8a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
b8b0: 70 61 72 73 65 20 2a 2f 0a 20 20 4a 73 6f 6e 4e  parse */.  JsonN
b8c0: 6f 64 65 20 2a 70 4e 6f 64 65 3b 0a 20 20 63 6f  ode *pNode;.  co
b8d0: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 3b  nst char *zPath;
b8e0: 0a 20 20 75 33 32 20 69 3b 0a 0a 20 20 69 66 28  .  u32 i;..  if(
b8f0: 20 61 72 67 63 3c 31 20 29 20 72 65 74 75 72 6e   argc<1 ) return
b900: 3b 0a 20 20 69 66 28 20 6a 73 6f 6e 50 61 72 73  ;.  if( jsonPars
b910: 65 28 26 78 2c 20 63 74 78 2c 20 28 63 6f 6e 73  e(&x, ctx, (cons
b920: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
b930: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
b940: 30 5d 29 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  0])) ) return;. 
b950: 20 61 73 73 65 72 74 28 20 78 2e 6e 4e 6f 64 65   assert( x.nNode
b960: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69   );.  for(i=1; i
b970: 3c 28 75 33 32 29 61 72 67 63 3b 20 69 2b 2b 29  <(u32)argc; i++)
b980: 7b 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 28 63  {.    zPath = (c
b990: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
b9a0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
b9b0: 67 76 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20  gv[i]);.    if( 
b9c0: 7a 50 61 74 68 3d 3d 30 20 29 20 67 6f 74 6f 20  zPath==0 ) goto 
b9d0: 72 65 6d 6f 76 65 5f 64 6f 6e 65 3b 0a 20 20 20  remove_done;.   
b9e0: 20 70 4e 6f 64 65 20 3d 20 6a 73 6f 6e 4c 6f 6f   pNode = jsonLoo
b9f0: 6b 75 70 28 26 78 2c 20 7a 50 61 74 68 2c 20 30  kup(&x, zPath, 0
ba00: 2c 20 63 74 78 29 3b 0a 20 20 20 20 69 66 28 20  , ctx);.    if( 
ba10: 78 2e 6e 45 72 72 20 29 20 67 6f 74 6f 20 72 65  x.nErr ) goto re
ba20: 6d 6f 76 65 5f 64 6f 6e 65 3b 0a 20 20 20 20 69  move_done;.    i
ba30: 66 28 20 70 4e 6f 64 65 20 29 20 70 4e 6f 64 65  f( pNode ) pNode
ba40: 2d 3e 6a 6e 46 6c 61 67 73 20 7c 3d 20 4a 4e 4f  ->jnFlags |= JNO
ba50: 44 45 5f 52 45 4d 4f 56 45 3b 0a 20 20 7d 0a 20  DE_REMOVE;.  }. 
ba60: 20 69 66 28 20 28 78 2e 61 4e 6f 64 65 5b 30 5d   if( (x.aNode[0]
ba70: 2e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45  .jnFlags & JNODE
ba80: 5f 52 45 4d 4f 56 45 29 3d 3d 30 20 29 7b 0a 20  _REMOVE)==0 ){. 
ba90: 20 20 20 6a 73 6f 6e 52 65 74 75 72 6e 4a 73 6f     jsonReturnJso
baa0: 6e 28 78 2e 61 4e 6f 64 65 2c 20 63 74 78 2c 20  n(x.aNode, ctx, 
bab0: 30 29 3b 0a 20 20 7d 0a 72 65 6d 6f 76 65 5f 64  0);.  }.remove_d
bac0: 6f 6e 65 3a 0a 20 20 6a 73 6f 6e 50 61 72 73 65  one:.  jsonParse
bad0: 52 65 73 65 74 28 26 78 29 3b 0a 7d 0a 0a 2f 2a  Reset(&x);.}../*
bae0: 0a 2a 2a 20 6a 73 6f 6e 5f 72 65 70 6c 61 63 65  .** json_replace
baf0: 28 4a 53 4f 4e 2c 20 50 41 54 48 2c 20 56 41 4c  (JSON, PATH, VAL
bb00: 55 45 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 52  UE, ...).**.** R
bb10: 65 70 6c 61 63 65 20 74 68 65 20 76 61 6c 75 65  eplace the value
bb20: 20 61 74 20 50 41 54 48 20 77 69 74 68 20 56 41   at PATH with VA
bb30: 4c 55 45 2e 20 20 49 66 20 50 41 54 48 20 64 6f  LUE.  If PATH do
bb40: 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  es not already e
bb50: 78 69 73 74 2c 0a 2a 2a 20 74 68 69 73 20 72 6f  xist,.** this ro
bb60: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
bb70: 2e 20 20 49 66 20 4a 53 4f 4e 20 6f 72 20 50 41  .  If JSON or PA
bb80: 54 48 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 2c  TH is malformed,
bb90: 20 74 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 2e   throw an error.
bba0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
bbb0: 6a 73 6f 6e 52 65 70 6c 61 63 65 46 75 6e 63 28  jsonReplaceFunc(
bbc0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
bbd0: 78 74 20 2a 63 74 78 2c 0a 20 20 69 6e 74 20 61  xt *ctx,.  int a
bbe0: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
bbf0: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
bc00: 20 4a 73 6f 6e 50 61 72 73 65 20 78 3b 20 20 20   JsonParse x;   
bc10: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
bc20: 72 73 65 20 2a 2f 0a 20 20 4a 73 6f 6e 4e 6f 64  rse */.  JsonNod
bc30: 65 20 2a 70 4e 6f 64 65 3b 0a 20 20 63 6f 6e 73  e *pNode;.  cons
bc40: 74 20 63 68 61 72 20 2a 7a 50 61 74 68 3b 0a 20  t char *zPath;. 
bc50: 20 75 33 32 20 69 3b 0a 0a 20 20 69 66 28 20 61   u32 i;..  if( a
bc60: 72 67 63 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a  rgc<1 ) return;.
bc70: 20 20 69 66 28 20 28 61 72 67 63 26 31 29 3d 3d    if( (argc&1)==
bc80: 30 20 29 20 7b 0a 20 20 20 20 6a 73 6f 6e 57 72  0 ) {.    jsonWr
bc90: 6f 6e 67 4e 75 6d 41 72 67 73 28 63 74 78 2c 20  ongNumArgs(ctx, 
bca0: 22 72 65 70 6c 61 63 65 22 29 3b 0a 20 20 20 20  "replace");.    
bcb0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
bcc0: 28 20 6a 73 6f 6e 50 61 72 73 65 28 26 78 2c 20  ( jsonParse(&x, 
bcd0: 63 74 78 2c 20 28 63 6f 6e 73 74 20 63 68 61 72  ctx, (const char
bce0: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
bcf0: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 29 20 29  text(argv[0])) )
bd00: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
bd10: 74 28 20 78 2e 6e 4e 6f 64 65 20 29 3b 0a 20 20  t( x.nNode );.  
bd20: 66 6f 72 28 69 3d 31 3b 20 69 3c 28 75 33 32 29  for(i=1; i<(u32)
bd30: 61 72 67 63 3b 20 69 2b 3d 32 29 7b 0a 20 20 20  argc; i+=2){.   
bd40: 20 7a 50 61 74 68 20 3d 20 28 63 6f 6e 73 74 20   zPath = (const 
bd50: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
bd60: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 69 5d  lue_text(argv[i]
bd70: 29 3b 0a 20 20 20 20 70 4e 6f 64 65 20 3d 20 6a  );.    pNode = j
bd80: 73 6f 6e 4c 6f 6f 6b 75 70 28 26 78 2c 20 7a 50  sonLookup(&x, zP
bd90: 61 74 68 2c 20 30 2c 20 63 74 78 29 3b 0a 20 20  ath, 0, ctx);.  
bda0: 20 20 69 66 28 20 78 2e 6e 45 72 72 20 29 20 67    if( x.nErr ) g
bdb0: 6f 74 6f 20 72 65 70 6c 61 63 65 5f 65 72 72 3b  oto replace_err;
bdc0: 0a 20 20 20 20 69 66 28 20 70 4e 6f 64 65 20 29  .    if( pNode )
bdd0: 7b 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 6a  {.      pNode->j
bde0: 6e 46 6c 61 67 73 20 7c 3d 20 28 75 38 29 4a 4e  nFlags |= (u8)JN
bdf0: 4f 44 45 5f 52 45 50 4c 41 43 45 3b 0a 20 20 20  ODE_REPLACE;.   
be00: 20 20 20 70 4e 6f 64 65 2d 3e 75 2e 69 52 65 70     pNode->u.iRep
be10: 6c 61 63 65 20 3d 20 69 20 2b 20 31 3b 0a 20 20  lace = i + 1;.  
be20: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 78 2e    }.  }.  if( x.
be30: 61 4e 6f 64 65 5b 30 5d 2e 6a 6e 46 6c 61 67 73  aNode[0].jnFlags
be40: 20 26 20 4a 4e 4f 44 45 5f 52 45 50 4c 41 43 45   & JNODE_REPLACE
be50: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
be60: 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 74 78  result_value(ctx
be70: 2c 20 61 72 67 76 5b 78 2e 61 4e 6f 64 65 5b 30  , argv[x.aNode[0
be80: 5d 2e 75 2e 69 52 65 70 6c 61 63 65 5d 29 3b 0a  ].u.iReplace]);.
be90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6a 73 6f    }else{.    jso
bea0: 6e 52 65 74 75 72 6e 4a 73 6f 6e 28 78 2e 61 4e  nReturnJson(x.aN
beb0: 6f 64 65 2c 20 63 74 78 2c 20 61 72 67 76 29 3b  ode, ctx, argv);
bec0: 0a 20 20 7d 0a 72 65 70 6c 61 63 65 5f 65 72 72  .  }.replace_err
bed0: 3a 0a 20 20 6a 73 6f 6e 50 61 72 73 65 52 65 73  :.  jsonParseRes
bee0: 65 74 28 26 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  et(&x);.}../*.**
bef0: 20 6a 73 6f 6e 5f 73 65 74 28 4a 53 4f 4e 2c 20   json_set(JSON, 
bf00: 50 41 54 48 2c 20 56 41 4c 55 45 2c 20 2e 2e 2e  PATH, VALUE, ...
bf10: 29 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ).**.** Set the 
bf20: 76 61 6c 75 65 20 61 74 20 50 41 54 48 20 74 6f  value at PATH to
bf30: 20 56 41 4c 55 45 2e 20 20 43 72 65 61 74 65 20   VALUE.  Create 
bf40: 74 68 65 20 50 41 54 48 20 69 66 20 69 74 20 64  the PATH if it d
bf50: 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a  oes not already.
bf60: 2a 2a 20 65 78 69 73 74 2e 20 20 4f 76 65 72 77  ** exist.  Overw
bf70: 72 69 74 65 20 65 78 69 73 74 69 6e 67 20 76 61  rite existing va
bf80: 6c 75 65 73 20 74 68 61 74 20 64 6f 20 65 78 69  lues that do exi
bf90: 73 74 2e 0a 2a 2a 20 49 66 20 4a 53 4f 4e 20 6f  st..** If JSON o
bfa0: 72 20 50 41 54 48 20 69 73 20 6d 61 6c 66 6f 72  r PATH is malfor
bfb0: 6d 65 64 2c 20 74 68 72 6f 77 20 61 6e 20 65 72  med, throw an er
bfc0: 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 6a 73 6f 6e 5f  ror..**.** json_
bfd0: 69 6e 73 65 72 74 28 4a 53 4f 4e 2c 20 50 41 54  insert(JSON, PAT
bfe0: 48 2c 20 56 41 4c 55 45 2c 20 2e 2e 2e 29 0a 2a  H, VALUE, ...).*
bff0: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 50 41 54 48  *.** Create PATH
c000: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
c010: 69 74 20 74 6f 20 56 41 4c 55 45 2e 20 20 49 66  it to VALUE.  If
c020: 20 50 41 54 48 20 61 6c 72 65 61 64 79 20 65 78   PATH already ex
c030: 69 73 74 73 2c 20 74 68 69 73 0a 2a 2a 20 72 6f  ists, this.** ro
c040: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
c050: 2e 20 20 49 66 20 4a 53 4f 4e 20 6f 72 20 50 41  .  If JSON or PA
c060: 54 48 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 2c  TH is malformed,
c070: 20 74 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 2e   throw an error.
c080: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c090: 6a 73 6f 6e 53 65 74 46 75 6e 63 28 0a 20 20 73  jsonSetFunc(.  s
c0a0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
c0b0: 63 74 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ctx,.  int argc,
c0c0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
c0d0: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 4a 73 6f   **argv.){.  Jso
c0e0: 6e 50 61 72 73 65 20 78 3b 20 20 20 20 20 20 20  nParse x;       
c0f0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 20     /* The parse 
c100: 2a 2f 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70  */.  JsonNode *p
c110: 4e 6f 64 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68  Node;.  const ch
c120: 61 72 20 2a 7a 50 61 74 68 3b 0a 20 20 75 33 32  ar *zPath;.  u32
c130: 20 69 3b 0a 20 20 69 6e 74 20 62 41 70 6e 64 3b   i;.  int bApnd;
c140: 0a 20 20 69 6e 74 20 62 49 73 53 65 74 20 3d 20  .  int bIsSet = 
c150: 2a 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 5f 75  *(int*)sqlite3_u
c160: 73 65 72 5f 64 61 74 61 28 63 74 78 29 3b 0a 0a  ser_data(ctx);..
c170: 20 20 69 66 28 20 61 72 67 63 3c 31 20 29 20 72    if( argc<1 ) r
c180: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 61 72  eturn;.  if( (ar
c190: 67 63 26 31 29 3d 3d 30 20 29 20 7b 0a 20 20 20  gc&1)==0 ) {.   
c1a0: 20 6a 73 6f 6e 57 72 6f 6e 67 4e 75 6d 41 72 67   jsonWrongNumArg
c1b0: 73 28 63 74 78 2c 20 62 49 73 53 65 74 20 3f 20  s(ctx, bIsSet ? 
c1c0: 22 73 65 74 22 20 3a 20 22 69 6e 73 65 72 74 22  "set" : "insert"
c1d0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
c1e0: 20 7d 0a 20 20 69 66 28 20 6a 73 6f 6e 50 61 72   }.  if( jsonPar
c1f0: 73 65 28 26 78 2c 20 63 74 78 2c 20 28 63 6f 6e  se(&x, ctx, (con
c200: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
c210: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
c220: 5b 30 5d 29 29 20 29 20 72 65 74 75 72 6e 3b 0a  [0])) ) return;.
c230: 20 20 61 73 73 65 72 74 28 20 78 2e 6e 4e 6f 64    assert( x.nNod
c240: 65 20 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20  e );.  for(i=1; 
c250: 69 3c 28 75 33 32 29 61 72 67 63 3b 20 69 2b 3d  i<(u32)argc; i+=
c260: 32 29 7b 0a 20 20 20 20 7a 50 61 74 68 20 3d 20  2){.    zPath = 
c270: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
c280: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
c290: 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 62 41  argv[i]);.    bA
c2a0: 70 6e 64 20 3d 20 30 3b 0a 20 20 20 20 70 4e 6f  pnd = 0;.    pNo
c2b0: 64 65 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 28  de = jsonLookup(
c2c0: 26 78 2c 20 7a 50 61 74 68 2c 20 26 62 41 70 6e  &x, zPath, &bApn
c2d0: 64 2c 20 63 74 78 29 3b 0a 20 20 20 20 69 66 28  d, ctx);.    if(
c2e0: 20 78 2e 6f 6f 6d 20 29 7b 0a 20 20 20 20 20 20   x.oom ){.      
c2f0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
c300: 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 74 78 29 3b  rror_nomem(ctx);
c310: 0a 20 20 20 20 20 20 67 6f 74 6f 20 6a 73 6f 6e  .      goto json
c320: 53 65 74 44 6f 6e 65 3b 0a 20 20 20 20 7d 65 6c  SetDone;.    }el
c330: 73 65 20 69 66 28 20 78 2e 6e 45 72 72 20 29 7b  se if( x.nErr ){
c340: 0a 20 20 20 20 20 20 67 6f 74 6f 20 6a 73 6f 6e  .      goto json
c350: 53 65 74 44 6f 6e 65 3b 0a 20 20 20 20 7d 65 6c  SetDone;.    }el
c360: 73 65 20 69 66 28 20 70 4e 6f 64 65 20 26 26 20  se if( pNode && 
c370: 28 62 41 70 6e 64 20 7c 7c 20 62 49 73 53 65 74  (bApnd || bIsSet
c380: 29 20 29 7b 0a 20 20 20 20 20 20 70 4e 6f 64 65  ) ){.      pNode
c390: 2d 3e 6a 6e 46 6c 61 67 73 20 7c 3d 20 28 75 38  ->jnFlags |= (u8
c3a0: 29 4a 4e 4f 44 45 5f 52 45 50 4c 41 43 45 3b 0a  )JNODE_REPLACE;.
c3b0: 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 75 2e 69        pNode->u.i
c3c0: 52 65 70 6c 61 63 65 20 3d 20 69 20 2b 20 31 3b  Replace = i + 1;
c3d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
c3e0: 20 78 2e 61 4e 6f 64 65 5b 30 5d 2e 6a 6e 46 6c   x.aNode[0].jnFl
c3f0: 61 67 73 20 26 20 4a 4e 4f 44 45 5f 52 45 50 4c  ags & JNODE_REPL
c400: 41 43 45 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ACE ){.    sqlit
c410: 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28  e3_result_value(
c420: 63 74 78 2c 20 61 72 67 76 5b 78 2e 61 4e 6f 64  ctx, argv[x.aNod
c430: 65 5b 30 5d 2e 75 2e 69 52 65 70 6c 61 63 65 5d  e[0].u.iReplace]
c440: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
c450: 6a 73 6f 6e 52 65 74 75 72 6e 4a 73 6f 6e 28 78  jsonReturnJson(x
c460: 2e 61 4e 6f 64 65 2c 20 63 74 78 2c 20 61 72 67  .aNode, ctx, arg
c470: 76 29 3b 0a 20 20 7d 0a 6a 73 6f 6e 53 65 74 44  v);.  }.jsonSetD
c480: 6f 6e 65 3a 0a 20 20 6a 73 6f 6e 50 61 72 73 65  one:.  jsonParse
c490: 52 65 73 65 74 28 26 78 29 3b 0a 7d 0a 0a 2f 2a  Reset(&x);.}../*
c4a0: 0a 2a 2a 20 6a 73 6f 6e 5f 74 79 70 65 28 4a 53  .** json_type(JS
c4b0: 4f 4e 29 0a 2a 2a 20 6a 73 6f 6e 5f 74 79 70 65  ON).** json_type
c4c0: 28 4a 53 4f 4e 2c 20 50 41 54 48 29 0a 2a 2a 0a  (JSON, PATH).**.
c4d0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f  ** Return the to
c4e0: 70 2d 6c 65 76 65 6c 20 22 74 79 70 65 22 20 6f  p-level "type" o
c4f0: 66 20 61 20 4a 53 4f 4e 20 73 74 72 69 6e 67 2e  f a JSON string.
c500: 20 20 54 68 72 6f 77 20 61 6e 20 65 72 72 6f 72    Throw an error
c510: 20 69 66 0a 2a 2a 20 65 69 74 68 65 72 20 74 68   if.** either th
c520: 65 20 4a 53 4f 4e 20 6f 72 20 50 41 54 48 20 69  e JSON or PATH i
c530: 6e 70 75 74 73 20 61 72 65 20 6e 6f 74 20 77 65  nputs are not we
c540: 6c 6c 2d 66 6f 72 6d 65 64 2e 0a 2a 2f 0a 73 74  ll-formed..*/.st
c550: 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 54 79  atic void jsonTy
c560: 70 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  peFunc(.  sqlite
c570: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 0a  3_context *ctx,.
c580: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
c590: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
c5a0: 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e 50 61 72 73  gv.){.  JsonPars
c5b0: 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 2f  e *p;          /
c5c0: 2a 20 54 68 65 20 70 61 72 73 65 20 2a 2f 0a 20  * The parse */. 
c5d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
c5e0: 74 68 3b 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a  th;.  JsonNode *
c5f0: 70 4e 6f 64 65 3b 0a 0a 20 20 70 20 3d 20 6a 73  pNode;..  p = js
c600: 6f 6e 50 61 72 73 65 43 61 63 68 65 64 28 63 74  onParseCached(ct
c610: 78 2c 20 61 72 67 76 2c 20 63 74 78 29 3b 0a 20  x, argv, ctx);. 
c620: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
c630: 72 6e 3b 0a 20 20 69 66 28 20 61 72 67 63 3d 3d  rn;.  if( argc==
c640: 32 20 29 7b 0a 20 20 20 20 7a 50 61 74 68 20 3d  2 ){.    zPath =
c650: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
c660: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
c670: 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 70  (argv[1]);.    p
c680: 4e 6f 64 65 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75  Node = jsonLooku
c690: 70 28 70 2c 20 7a 50 61 74 68 2c 20 30 2c 20 63  p(p, zPath, 0, c
c6a0: 74 78 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  tx);.  }else{.  
c6b0: 20 20 70 4e 6f 64 65 20 3d 20 70 2d 3e 61 4e 6f    pNode = p->aNo
c6c0: 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e  de;.  }.  if( pN
c6d0: 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ode ){.    sqlit
c6e0: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
c6f0: 74 78 2c 20 6a 73 6f 6e 54 79 70 65 5b 70 4e 6f  tx, jsonType[pNo
c700: 64 65 2d 3e 65 54 79 70 65 5d 2c 20 2d 31 2c 20  de->eType], -1, 
c710: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
c720: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 6a 73 6f    }.}../*.** jso
c730: 6e 5f 76 61 6c 69 64 28 4a 53 4f 4e 29 0a 2a 2a  n_valid(JSON).**
c740: 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20  .** Return 1 if 
c750: 4a 53 4f 4e 20 69 73 20 61 20 77 65 6c 6c 2d 66  JSON is a well-f
c760: 6f 72 6d 65 64 20 4a 53 4f 4e 20 73 74 72 69 6e  ormed JSON strin
c770: 67 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 52  g according to R
c780: 46 43 2d 37 31 35 39 2e 0a 2a 2a 20 52 65 74 75  FC-7159..** Retu
c790: 72 6e 20 30 20 6f 74 68 65 72 77 69 73 65 2e 0a  rn 0 otherwise..
c7a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a  */.static void j
c7b0: 73 6f 6e 56 61 6c 69 64 46 75 6e 63 28 0a 20 20  sonValidFunc(.  
c7c0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
c7d0: 2a 63 74 78 2c 0a 20 20 69 6e 74 20 61 72 67 63  *ctx,.  int argc
c7e0: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
c7f0: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 4a 73  e **argv.){.  Js
c800: 6f 6e 50 61 72 73 65 20 2a 70 3b 20 20 20 20 20  onParse *p;     
c810: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
c820: 65 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41  e */.  UNUSED_PA
c830: 52 41 4d 28 61 72 67 63 29 3b 0a 20 20 70 20 3d  RAM(argc);.  p =
c840: 20 6a 73 6f 6e 50 61 72 73 65 43 61 63 68 65 64   jsonParseCached
c850: 28 63 74 78 2c 20 61 72 67 76 2c 20 30 29 3b 0a  (ctx, argv, 0);.
c860: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
c870: 5f 69 6e 74 28 63 74 78 2c 20 70 21 3d 30 29 3b  _int(ctx, p!=0);
c880: 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}.../**********
c890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c8a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c8b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c8c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c8d0: 2a 2a 0a 2a 2a 20 41 67 67 72 65 67 61 74 65 20  **.** Aggregate 
c8e0: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70  SQL function imp
c8f0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 2a  lementations.***
c900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
c950: 20 6a 73 6f 6e 5f 67 72 6f 75 70 5f 61 72 72 61   json_group_arra
c960: 79 28 56 41 4c 55 45 29 0a 2a 2a 0a 2a 2a 20 52  y(VALUE).**.** R
c970: 65 74 75 72 6e 20 61 20 4a 53 4f 4e 20 61 72 72  eturn a JSON arr
c980: 61 79 20 63 6f 6d 70 6f 73 65 64 20 6f 66 20 61  ay composed of a
c990: 6c 6c 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65  ll values in the
c9a0: 20 61 67 67 72 65 67 61 74 65 2e 0a 2a 2f 0a 73   aggregate..*/.s
c9b0: 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 41  tatic void jsonA
c9c0: 72 72 61 79 53 74 65 70 28 0a 20 20 73 71 6c 69  rrayStep(.  sqli
c9d0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78  te3_context *ctx
c9e0: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
c9f0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
ca00: 61 72 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e 53 74  argv.){.  JsonSt
ca10: 72 69 6e 67 20 2a 70 53 74 72 3b 0a 20 20 55 4e  ring *pStr;.  UN
ca20: 55 53 45 44 5f 50 41 52 41 4d 28 61 72 67 63 29  USED_PARAM(argc)
ca30: 3b 0a 20 20 70 53 74 72 20 3d 20 28 4a 73 6f 6e  ;.  pStr = (Json
ca40: 53 74 72 69 6e 67 2a 29 73 71 6c 69 74 65 33 5f  String*)sqlite3_
ca50: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
ca60: 74 28 63 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70  t(ctx, sizeof(*p
ca70: 53 74 72 29 29 3b 0a 20 20 69 66 28 20 70 53 74  Str));.  if( pSt
ca80: 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 74  r ){.    if( pSt
ca90: 72 2d 3e 7a 42 75 66 3d 3d 30 20 29 7b 0a 20 20  r->zBuf==0 ){.  
caa0: 20 20 20 20 6a 73 6f 6e 49 6e 69 74 28 70 53 74      jsonInit(pSt
cab0: 72 2c 20 63 74 78 29 3b 0a 20 20 20 20 20 20 6a  r, ctx);.      j
cac0: 73 6f 6e 41 70 70 65 6e 64 43 68 61 72 28 70 53  sonAppendChar(pS
cad0: 74 72 2c 20 27 5b 27 29 3b 0a 20 20 20 20 7d 65  tr, '[');.    }e
cae0: 6c 73 65 7b 0a 20 20 20 20 20 20 6a 73 6f 6e 41  lse{.      jsonA
caf0: 70 70 65 6e 64 43 68 61 72 28 70 53 74 72 2c 20  ppendChar(pStr, 
cb00: 27 2c 27 29 3b 0a 20 20 20 20 20 20 70 53 74 72  ',');.      pStr
cb10: 2d 3e 70 43 74 78 20 3d 20 63 74 78 3b 0a 20 20  ->pCtx = ctx;.  
cb20: 20 20 7d 0a 20 20 20 20 6a 73 6f 6e 41 70 70 65    }.    jsonAppe
cb30: 6e 64 56 61 6c 75 65 28 70 53 74 72 2c 20 61 72  ndValue(pStr, ar
cb40: 67 76 5b 30 5d 29 3b 0a 20 20 7d 0a 7d 0a 73 74  gv[0]);.  }.}.st
cb50: 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 41 72  atic void jsonAr
cb60: 72 61 79 43 6f 6d 70 75 74 65 28 73 71 6c 69 74  rayCompute(sqlit
cb70: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c  e3_context *ctx,
cb80: 20 69 6e 74 20 69 73 46 69 6e 61 6c 29 7b 0a 20   int isFinal){. 
cb90: 20 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70 53 74   JsonString *pSt
cba0: 72 3b 0a 20 20 70 53 74 72 20 3d 20 28 4a 73 6f  r;.  pStr = (Jso
cbb0: 6e 53 74 72 69 6e 67 2a 29 73 71 6c 69 74 65 33  nString*)sqlite3
cbc0: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
cbd0: 78 74 28 63 74 78 2c 20 30 29 3b 0a 20 20 69 66  xt(ctx, 0);.  if
cbe0: 28 20 70 53 74 72 20 29 7b 0a 20 20 20 20 70 53  ( pStr ){.    pS
cbf0: 74 72 2d 3e 70 43 74 78 20 3d 20 63 74 78 3b 0a  tr->pCtx = ctx;.
cc00: 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68      jsonAppendCh
cc10: 61 72 28 70 53 74 72 2c 20 27 5d 27 29 3b 0a 20  ar(pStr, ']');. 
cc20: 20 20 20 69 66 28 20 70 53 74 72 2d 3e 62 45 72     if( pStr->bEr
cc30: 72 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  r ){.      if( p
cc40: 53 74 72 2d 3e 62 45 72 72 3d 3d 31 20 29 20 73  Str->bErr==1 ) s
cc50: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
cc60: 72 6f 72 5f 6e 6f 6d 65 6d 28 63 74 78 29 3b 0a  ror_nomem(ctx);.
cc70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
cc80: 74 72 2d 3e 62 53 74 61 74 69 63 20 29 3b 0a 20  tr->bStatic );. 
cc90: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 46     }else if( isF
cca0: 69 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  inal ){.      sq
ccb0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
ccc0: 74 28 63 74 78 2c 20 70 53 74 72 2d 3e 7a 42 75  t(ctx, pStr->zBu
ccd0: 66 2c 20 28 69 6e 74 29 70 53 74 72 2d 3e 6e 55  f, (int)pStr->nU
cce0: 73 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  sed,.           
ccf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
cd00: 53 74 72 2d 3e 62 53 74 61 74 69 63 20 3f 20 53  Str->bStatic ? S
cd10: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 20  QLITE_TRANSIENT 
cd20: 3a 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b  : sqlite3_free);
cd30: 0a 20 20 20 20 20 20 70 53 74 72 2d 3e 62 53 74  .      pStr->bSt
cd40: 61 74 69 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65  atic = 1;.    }e
cd50: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
cd60: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
cd70: 74 78 2c 20 70 53 74 72 2d 3e 7a 42 75 66 2c 20  tx, pStr->zBuf, 
cd80: 28 69 6e 74 29 70 53 74 72 2d 3e 6e 55 73 65 64  (int)pStr->nUsed
cd90: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
cda0: 4e 54 29 3b 0a 20 20 20 20 20 20 70 53 74 72 2d  NT);.      pStr-
cdb0: 3e 6e 55 73 65 64 2d 2d 3b 0a 20 20 20 20 7d 0a  >nUsed--;.    }.
cdc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
cdd0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
cde0: 28 63 74 78 2c 20 22 5b 5d 22 2c 20 32 2c 20 53  (ctx, "[]", 2, S
cdf0: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
ce00: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73   }.  sqlite3_res
ce10: 75 6c 74 5f 73 75 62 74 79 70 65 28 63 74 78 2c  ult_subtype(ctx,
ce20: 20 4a 53 4f 4e 5f 53 55 42 54 59 50 45 29 3b 0a   JSON_SUBTYPE);.
ce30: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73  }.static void js
ce40: 6f 6e 41 72 72 61 79 56 61 6c 75 65 28 73 71 6c  onArrayValue(sql
ce50: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74  ite3_context *ct
ce60: 78 29 7b 0a 20 20 6a 73 6f 6e 41 72 72 61 79 43  x){.  jsonArrayC
ce70: 6f 6d 70 75 74 65 28 63 74 78 2c 20 30 29 3b 0a  ompute(ctx, 0);.
ce80: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73  }.static void js
ce90: 6f 6e 41 72 72 61 79 46 69 6e 61 6c 28 73 71 6c  onArrayFinal(sql
cea0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74  ite3_context *ct
ceb0: 78 29 7b 0a 20 20 6a 73 6f 6e 41 72 72 61 79 43  x){.  jsonArrayC
cec0: 6f 6d 70 75 74 65 28 63 74 78 2c 20 31 29 3b 0a  ompute(ctx, 1);.
ced0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
cee0: 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e  E_OMIT_WINDOWFUN
cef0: 43 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 74  C./*.** This met
cf00: 68 6f 64 20 77 6f 72 6b 73 20 66 6f 72 20 62 6f  hod works for bo
cf10: 74 68 20 6a 73 6f 6e 5f 67 72 6f 75 70 5f 61 72  th json_group_ar
cf20: 72 61 79 28 29 20 61 6e 64 20 6a 73 6f 6e 5f 67  ray() and json_g
cf30: 72 6f 75 70 5f 6f 62 6a 65 63 74 28 29 2e 0a 2a  roup_object()..*
cf40: 2a 20 49 74 20 77 6f 72 6b 73 20 62 79 20 72 65  * It works by re
cf50: 6d 6f 76 69 6e 67 20 74 68 65 20 66 69 72 73 74  moving the first
cf60: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
cf70: 67 72 6f 75 70 20 62 79 20 73 65 61 72 63 68 69  group by searchi
cf80: 6e 67 20 66 6f 72 77 61 72 64 0a 2a 2a 20 74 6f  ng forward.** to
cf90: 20 74 68 65 20 66 69 72 73 74 20 63 6f 6d 6d 61   the first comma
cfa0: 20 28 22 2c 22 29 20 74 68 61 74 20 69 73 20 6e   (",") that is n
cfb0: 6f 74 20 77 69 74 68 69 6e 20 61 20 73 74 72 69  ot within a stri
cfc0: 6e 67 20 61 6e 64 20 64 65 6c 65 74 69 6e 67 20  ng and deleting 
cfd0: 61 6c 6c 0a 2a 2a 20 74 65 78 74 20 74 68 72 6f  all.** text thro
cfe0: 75 67 68 20 74 68 61 74 20 63 6f 6d 6d 61 2e 0a  ugh that comma..
cff0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a  */.static void j
d000: 73 6f 6e 47 72 6f 75 70 49 6e 76 65 72 73 65 28  sonGroupInverse(
d010: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
d020: 78 74 20 2a 63 74 78 2c 0a 20 20 69 6e 74 20 61  xt *ctx,.  int a
d030: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
d040: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
d050: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 6e   int i;.  int in
d060: 53 74 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  Str = 0;.  char 
d070: 2a 7a 3b 0a 20 20 4a 73 6f 6e 53 74 72 69 6e 67  *z;.  JsonString
d080: 20 2a 70 53 74 72 3b 0a 20 20 55 4e 55 53 45 44   *pStr;.  UNUSED
d090: 5f 50 41 52 41 4d 28 61 72 67 63 29 3b 0a 20 20  _PARAM(argc);.  
d0a0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 61 72 67  UNUSED_PARAM(arg
d0b0: 76 29 3b 0a 20 20 70 53 74 72 20 3d 20 28 4a 73  v);.  pStr = (Js
d0c0: 6f 6e 53 74 72 69 6e 67 2a 29 73 71 6c 69 74 65  onString*)sqlite
d0d0: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
d0e0: 65 78 74 28 63 74 78 2c 20 30 29 3b 0a 23 69 66  ext(ctx, 0);.#if
d0f0: 64 65 66 20 4e 45 56 45 52 0a 20 20 2f 2a 20 70  def NEVER.  /* p
d100: 53 74 72 20 69 73 20 61 6c 77 61 79 73 20 6e 6f  Str is always no
d110: 6e 2d 4e 55 4c 4c 20 73 69 6e 63 65 20 6a 73 6f  n-NULL since jso
d120: 6e 41 72 72 61 79 53 74 65 70 28 29 20 6f 72 20  nArrayStep() or 
d130: 6a 73 6f 6e 4f 62 6a 65 63 74 53 74 65 70 28 29  jsonObjectStep()
d140: 20 77 69 6c 6c 0a 20 20 2a 2a 20 61 6c 77 61 79   will.  ** alway
d150: 73 20 68 61 76 65 20 62 65 65 6e 20 63 61 6c 6c  s have been call
d160: 65 64 20 74 6f 20 69 6e 69 74 61 6c 69 7a 65 20  ed to initalize 
d170: 69 74 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  it */.  if( NEVE
d180: 52 28 21 70 53 74 72 29 20 29 20 72 65 74 75 72  R(!pStr) ) retur
d190: 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 7a 20 3d 20  n;.#endif.  z = 
d1a0: 70 53 74 72 2d 3e 7a 42 75 66 3b 0a 20 20 66 6f  pStr->zBuf;.  fo
d1b0: 72 28 69 3d 31 3b 20 7a 5b 69 5d 21 3d 27 2c 27  r(i=1; z[i]!=','
d1c0: 20 7c 7c 20 69 6e 53 74 72 3b 20 69 2b 2b 29 7b   || inStr; i++){
d1d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 70  .    assert( i<p
d1e0: 53 74 72 2d 3e 6e 55 73 65 64 20 29 3b 0a 20 20  Str->nUsed );.  
d1f0: 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 22 27 20    if( z[i]=='"' 
d200: 29 7b 0a 20 20 20 20 20 20 69 6e 53 74 72 20 3d  ){.      inStr =
d210: 20 21 69 6e 53 74 72 3b 0a 20 20 20 20 7d 65 6c   !inStr;.    }el
d220: 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 5c  se if( z[i]=='\\
d230: 27 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a  ' ){.      i++;.
d240: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 53 74 72      }.  }.  pStr
d250: 2d 3e 6e 55 73 65 64 20 2d 3d 20 69 3b 20 20 20  ->nUsed -= i;   
d260: 20 20 20 0a 20 20 6d 65 6d 6d 6f 76 65 28 26 7a     .  memmove(&z
d270: 5b 31 5d 2c 20 26 7a 5b 69 2b 31 5d 2c 20 28 73  [1], &z[i+1], (s
d280: 69 7a 65 5f 74 29 70 53 74 72 2d 3e 6e 55 73 65  ize_t)pStr->nUse
d290: 64 2d 31 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  d-1);.}.#else.# 
d2a0: 64 65 66 69 6e 65 20 6a 73 6f 6e 47 72 6f 75 70  define jsonGroup
d2b0: 49 6e 76 65 72 73 65 20 30 0a 23 65 6e 64 69 66  Inverse 0.#endif
d2c0: 0a 0a 0a 2f 2a 0a 2a 2a 20 6a 73 6f 6e 5f 67 72  .../*.** json_gr
d2d0: 6f 75 70 5f 6f 62 6a 28 4e 41 4d 45 2c 56 41 4c  oup_obj(NAME,VAL
d2e0: 55 45 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  UE).**.** Return
d2f0: 20 61 20 4a 53 4f 4e 20 6f 62 6a 65 63 74 20 63   a JSON object c
d300: 6f 6d 70 6f 73 65 64 20 6f 66 20 61 6c 6c 20 6e  omposed of all n
d310: 61 6d 65 73 20 61 6e 64 20 76 61 6c 75 65 73 20  ames and values 
d320: 69 6e 20 74 68 65 20 61 67 67 72 65 67 61 74 65  in the aggregate
d330: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
d340: 20 6a 73 6f 6e 4f 62 6a 65 63 74 53 74 65 70 28   jsonObjectStep(
d350: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
d360: 78 74 20 2a 63 74 78 2c 0a 20 20 69 6e 74 20 61  xt *ctx,.  int a
d370: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
d380: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
d390: 20 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70 53 74   JsonString *pSt
d3a0: 72 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  r;.  const char 
d3b0: 2a 7a 3b 0a 20 20 75 33 32 20 6e 3b 0a 20 20 55  *z;.  u32 n;.  U
d3c0: 4e 55 53 45 44 5f 50 41 52 41 4d 28 61 72 67 63  NUSED_PARAM(argc
d3d0: 29 3b 0a 20 20 70 53 74 72 20 3d 20 28 4a 73 6f  );.  pStr = (Jso
d3e0: 6e 53 74 72 69 6e 67 2a 29 73 71 6c 69 74 65 33  nString*)sqlite3
d3f0: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
d400: 78 74 28 63 74 78 2c 20 73 69 7a 65 6f 66 28 2a  xt(ctx, sizeof(*
d410: 70 53 74 72 29 29 3b 0a 20 20 69 66 28 20 70 53  pStr));.  if( pS
d420: 74 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53  tr ){.    if( pS
d430: 74 72 2d 3e 7a 42 75 66 3d 3d 30 20 29 7b 0a 20  tr->zBuf==0 ){. 
d440: 20 20 20 20 20 6a 73 6f 6e 49 6e 69 74 28 70 53       jsonInit(pS
d450: 74 72 2c 20 63 74 78 29 3b 0a 20 20 20 20 20 20  tr, ctx);.      
d460: 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61 72 28 70  jsonAppendChar(p
d470: 53 74 72 2c 20 27 7b 27 29 3b 0a 20 20 20 20 7d  Str, '{');.    }
d480: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 73 6f 6e  else{.      json
d490: 41 70 70 65 6e 64 43 68 61 72 28 70 53 74 72 2c  AppendChar(pStr,
d4a0: 20 27 2c 27 29 3b 0a 20 20 20 20 20 20 70 53 74   ',');.      pSt
d4b0: 72 2d 3e 70 43 74 78 20 3d 20 63 74 78 3b 0a 20  r->pCtx = ctx;. 
d4c0: 20 20 20 7d 0a 20 20 20 20 7a 20 3d 20 28 63 6f     }.    z = (co
d4d0: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
d4e0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
d4f0: 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 20 3d 20 28  v[0]);.    n = (
d500: 75 33 32 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  u32)sqlite3_valu
d510: 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29  e_bytes(argv[0])
d520: 3b 0a 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64  ;.    jsonAppend
d530: 53 74 72 69 6e 67 28 70 53 74 72 2c 20 7a 2c 20  String(pStr, z, 
d540: 6e 29 3b 0a 20 20 20 20 6a 73 6f 6e 41 70 70 65  n);.    jsonAppe
d550: 6e 64 43 68 61 72 28 70 53 74 72 2c 20 27 3a 27  ndChar(pStr, ':'
d560: 29 3b 0a 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e  );.    jsonAppen
d570: 64 56 61 6c 75 65 28 70 53 74 72 2c 20 61 72 67  dValue(pStr, arg
d580: 76 5b 31 5d 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  v[1]);.  }.}.sta
d590: 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 4f 62 6a  tic void jsonObj
d5a0: 65 63 74 43 6f 6d 70 75 74 65 28 73 71 6c 69 74  ectCompute(sqlit
d5b0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c  e3_context *ctx,
d5c0: 20 69 6e 74 20 69 73 46 69 6e 61 6c 29 7b 0a 20   int isFinal){. 
d5d0: 20 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70 53 74   JsonString *pSt
d5e0: 72 3b 0a 20 20 70 53 74 72 20 3d 20 28 4a 73 6f  r;.  pStr = (Jso
d5f0: 6e 53 74 72 69 6e 67 2a 29 73 71 6c 69 74 65 33  nString*)sqlite3
d600: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
d610: 78 74 28 63 74 78 2c 20 30 29 3b 0a 20 20 69 66  xt(ctx, 0);.  if
d620: 28 20 70 53 74 72 20 29 7b 0a 20 20 20 20 6a 73  ( pStr ){.    js
d630: 6f 6e 41 70 70 65 6e 64 43 68 61 72 28 70 53 74  onAppendChar(pSt
d640: 72 2c 20 27 7d 27 29 3b 0a 20 20 20 20 69 66 28  r, '}');.    if(
d650: 20 70 53 74 72 2d 3e 62 45 72 72 20 29 7b 0a 20   pStr->bErr ){. 
d660: 20 20 20 20 20 69 66 28 20 70 53 74 72 2d 3e 62       if( pStr->b
d670: 45 72 72 3d 3d 31 20 29 20 73 71 6c 69 74 65 33  Err==1 ) sqlite3
d680: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
d690: 6d 65 6d 28 63 74 78 29 3b 0a 20 20 20 20 20 20  mem(ctx);.      
d6a0: 61 73 73 65 72 74 28 20 70 53 74 72 2d 3e 62 53  assert( pStr->bS
d6b0: 74 61 74 69 63 20 29 3b 0a 20 20 20 20 7d 65 6c  tatic );.    }el
d6c0: 73 65 20 69 66 28 20 69 73 46 69 6e 61 6c 20 29  se if( isFinal )
d6d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
d6e0: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 74 78 2c  result_text(ctx,
d6f0: 20 70 53 74 72 2d 3e 7a 42 75 66 2c 20 28 69 6e   pStr->zBuf, (in
d700: 74 29 70 53 74 72 2d 3e 6e 55 73 65 64 2c 0a 20  t)pStr->nUsed,. 
d710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d720: 20 20 20 20 20 20 20 20 20 70 53 74 72 2d 3e 62           pStr->b
d730: 53 74 61 74 69 63 20 3f 20 53 51 4c 49 54 45 5f  Static ? SQLITE_
d740: 54 52 41 4e 53 49 45 4e 54 20 3a 20 73 71 6c 69  TRANSIENT : sqli
d750: 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 20  te3_free);.     
d760: 20 70 53 74 72 2d 3e 62 53 74 61 74 69 63 20 3d   pStr->bStatic =
d770: 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
d780: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
d790: 75 6c 74 5f 74 65 78 74 28 63 74 78 2c 20 70 53  ult_text(ctx, pS
d7a0: 74 72 2d 3e 7a 42 75 66 2c 20 28 69 6e 74 29 70  tr->zBuf, (int)p
d7b0: 53 74 72 2d 3e 6e 55 73 65 64 2c 20 53 51 4c 49  Str->nUsed, SQLI
d7c0: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
d7d0: 20 20 20 20 20 70 53 74 72 2d 3e 6e 55 73 65 64       pStr->nUsed
d7e0: 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  --;.    }.  }els
d7f0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  e{.    sqlite3_r
d800: 65 73 75 6c 74 5f 74 65 78 74 28 63 74 78 2c 20  esult_text(ctx, 
d810: 22 7b 7d 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f  "{}", 2, SQLITE_
d820: 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 20 20 73  STATIC);.  }.  s
d830: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 73 75  qlite3_result_su
d840: 62 74 79 70 65 28 63 74 78 2c 20 4a 53 4f 4e 5f  btype(ctx, JSON_
d850: 53 55 42 54 59 50 45 29 3b 0a 7d 0a 73 74 61 74  SUBTYPE);.}.stat
d860: 69 63 20 76 6f 69 64 20 6a 73 6f 6e 4f 62 6a 65  ic void jsonObje
d870: 63 74 56 61 6c 75 65 28 73 71 6c 69 74 65 33 5f  ctValue(sqlite3_
d880: 63 6f 6e 74 65 78 74 20 2a 63 74 78 29 7b 0a 20  context *ctx){. 
d890: 20 6a 73 6f 6e 4f 62 6a 65 63 74 43 6f 6d 70 75   jsonObjectCompu
d8a0: 74 65 28 63 74 78 2c 20 30 29 3b 0a 7d 0a 73 74  te(ctx, 0);.}.st
d8b0: 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 4f 62  atic void jsonOb
d8c0: 6a 65 63 74 46 69 6e 61 6c 28 73 71 6c 69 74 65  jectFinal(sqlite
d8d0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 29 7b  3_context *ctx){
d8e0: 0a 20 20 6a 73 6f 6e 4f 62 6a 65 63 74 43 6f 6d  .  jsonObjectCom
d8f0: 70 75 74 65 28 63 74 78 2c 20 31 29 3b 0a 7d 0a  pute(ctx, 1);.}.
d900: 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
d910: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
d920: 42 4c 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  BLE./***********
d930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d970: 2a 0a 2a 2a 20 54 68 65 20 6a 73 6f 6e 5f 65 61  *.** The json_ea
d980: 63 68 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ch virtual table
d990: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
d9a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d9b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d9c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d9d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 74  *************/.t
d9e0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 4a 73  ypedef struct Js
d9f0: 6f 6e 45 61 63 68 43 75 72 73 6f 72 20 4a 73 6f  onEachCursor Jso
da00: 6e 45 61 63 68 43 75 72 73 6f 72 3b 0a 73 74 72  nEachCursor;.str
da10: 75 63 74 20 4a 73 6f 6e 45 61 63 68 43 75 72 73  uct JsonEachCurs
da20: 6f 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  or {.  sqlite3_v
da30: 74 61 62 5f 63 75 72 73 6f 72 20 62 61 73 65 3b  tab_cursor base;
da40: 20 20 2f 2a 20 42 61 73 65 20 63 6c 61 73 73 20    /* Base class 
da50: 2d 20 6d 75 73 74 20 62 65 20 66 69 72 73 74 20  - must be first 
da60: 2a 2f 0a 20 20 75 33 32 20 69 52 6f 77 69 64 3b  */.  u32 iRowid;
da70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da80: 2f 2a 20 54 68 65 20 72 6f 77 69 64 20 2a 2f 0a  /* The rowid */.
da90: 20 20 75 33 32 20 69 42 65 67 69 6e 3b 20 20 20    u32 iBegin;   
daa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dab0: 54 68 65 20 66 69 72 73 74 20 6e 6f 64 65 20 6f  The first node o
dac0: 66 20 74 68 65 20 73 63 61 6e 20 2a 2f 0a 20 20  f the scan */.  
dad0: 75 33 32 20 69 3b 20 20 20 20 20 20 20 20 20 20  u32 i;          
dae0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
daf0: 64 65 78 20 69 6e 20 73 50 61 72 73 65 2e 61 4e  dex in sParse.aN
db00: 6f 64 65 5b 5d 20 6f 66 20 63 75 72 72 65 6e 74  ode[] of current
db10: 20 72 6f 77 20 2a 2f 0a 20 20 75 33 32 20 69 45   row */.  u32 iE
db20: 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nd;             
db30: 20 20 20 20 20 2f 2a 20 45 4f 46 20 77 68 65 6e       /* EOF when
db40: 20 69 20 65 71 75 61 6c 73 20 6f 72 20 65 78 63   i equals or exc
db50: 65 65 64 73 20 74 68 69 73 20 76 61 6c 75 65 20  eeds this value 
db60: 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 3b 20 20  */.  u8 eType;  
db70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db80: 2f 2a 20 54 79 70 65 20 6f 66 20 74 6f 70 2d 6c  /* Type of top-l
db90: 65 76 65 6c 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  evel element */.
dba0: 20 20 75 38 20 62 52 65 63 75 72 73 69 76 65 3b    u8 bRecursive;
dbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dbc0: 54 72 75 65 20 66 6f 72 20 6a 73 6f 6e 5f 74 72  True for json_tr
dbd0: 65 65 28 29 2e 20 20 46 61 6c 73 65 20 66 6f 72  ee().  False for
dbe0: 20 6a 73 6f 6e 5f 65 61 63 68 28 29 20 2a 2f 0a   json_each() */.
dbf0: 20 20 63 68 61 72 20 2a 7a 4a 73 6f 6e 3b 20 20    char *zJson;  
dc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dc10: 49 6e 70 75 74 20 4a 53 4f 4e 20 2a 2f 0a 20 20  Input JSON */.  
dc20: 63 68 61 72 20 2a 7a 52 6f 6f 74 3b 20 20 20 20  char *zRoot;    
dc30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
dc40: 74 68 20 62 79 20 77 68 69 63 68 20 74 6f 20 66  th by which to f
dc50: 69 6c 74 65 72 20 7a 4a 73 6f 6e 20 2a 2f 0a 20  ilter zJson */. 
dc60: 20 4a 73 6f 6e 50 61 72 73 65 20 73 50 61 72 73   JsonParse sPars
dc70: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e;          /* P
dc80: 61 72 73 65 20 6f 66 20 74 68 65 20 69 6e 70 75  arse of the inpu
dc90: 74 20 4a 53 4f 4e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  t JSON */.};../*
dca0: 20 43 6f 6e 73 74 72 75 63 74 6f 72 20 66 6f 72   Constructor for
dcb0: 20 74 68 65 20 6a 73 6f 6e 5f 65 61 63 68 20 76   the json_each v
dcc0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
dcd0: 73 74 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e 45  static int jsonE
dce0: 61 63 68 43 6f 6e 6e 65 63 74 28 0a 20 20 73 71  achConnect(.  sq
dcf0: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69  lite3 *db,.  voi
dd00: 64 20 2a 70 41 75 78 2c 0a 20 20 69 6e 74 20 61  d *pAux,.  int a
dd10: 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rgc, const char 
dd20: 2a 63 6f 6e 73 74 2a 61 72 67 76 2c 0a 20 20 73  *const*argv,.  s
dd30: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a 70 70  qlite3_vtab **pp
dd40: 56 74 61 62 2c 0a 20 20 63 68 61 72 20 2a 2a 70  Vtab,.  char **p
dd50: 7a 45 72 72 0a 29 7b 0a 20 20 73 71 6c 69 74 65  zErr.){.  sqlite
dd60: 33 5f 76 74 61 62 20 2a 70 4e 65 77 3b 0a 20 20  3_vtab *pNew;.  
dd70: 69 6e 74 20 72 63 3b 0a 0a 2f 2a 20 43 6f 6c 75  int rc;../* Colu
dd80: 6d 6e 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 23 64  mn numbers */.#d
dd90: 65 66 69 6e 65 20 4a 45 41 43 48 5f 4b 45 59 20  efine JEACH_KEY 
dda0: 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20 4a 45      0.#define JE
ddb0: 41 43 48 5f 56 41 4c 55 45 20 20 20 31 0a 23 64  ACH_VALUE   1.#d
ddc0: 65 66 69 6e 65 20 4a 45 41 43 48 5f 54 59 50 45  efine JEACH_TYPE
ddd0: 20 20 20 20 32 0a 23 64 65 66 69 6e 65 20 4a 45      2.#define JE
dde0: 41 43 48 5f 41 54 4f 4d 20 20 20 20 33 0a 23 64  ACH_ATOM    3.#d
ddf0: 65 66 69 6e 65 20 4a 45 41 43 48 5f 49 44 20 20  efine JEACH_ID  
de00: 20 20 20 20 34 0a 23 64 65 66 69 6e 65 20 4a 45      4.#define JE
de10: 41 43 48 5f 50 41 52 45 4e 54 20 20 35 0a 23 64  ACH_PARENT  5.#d
de20: 65 66 69 6e 65 20 4a 45 41 43 48 5f 46 55 4c 4c  efine JEACH_FULL
de30: 4b 45 59 20 36 0a 23 64 65 66 69 6e 65 20 4a 45  KEY 6.#define JE
de40: 41 43 48 5f 50 41 54 48 20 20 20 20 37 0a 2f 2a  ACH_PATH    7./*
de50: 20 54 68 65 20 78 42 65 73 74 49 6e 64 65 78 20   The xBestIndex 
de60: 6d 65 74 68 6f 64 20 61 73 73 75 6d 65 73 20 74  method assumes t
de70: 68 61 74 20 74 68 65 20 4a 53 4f 4e 20 61 6e 64  hat the JSON and
de80: 20 52 4f 4f 54 20 63 6f 6c 75 6d 6e 73 20 61 72   ROOT columns ar
de90: 65 0a 2a 2a 20 74 68 65 20 6c 61 73 74 20 74 77  e.** the last tw
dea0: 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  o columns in the
deb0: 20 74 61 62 6c 65 2e 20 20 53 68 6f 75 6c 64 20   table.  Should 
dec0: 74 68 69 73 20 65 76 65 72 20 63 68 61 6e 67 65  this ever change
ded0: 73 2c 20 62 65 0a 2a 2a 20 73 75 72 65 20 74 6f  s, be.** sure to
dee0: 20 75 70 64 61 74 65 20 74 68 65 20 78 42 65 73   update the xBes
def0: 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 2e 20 2a  tIndex method. *
df00: 2f 0a 23 64 65 66 69 6e 65 20 4a 45 41 43 48 5f  /.#define JEACH_
df10: 4a 53 4f 4e 20 20 20 20 38 0a 23 64 65 66 69 6e  JSON    8.#defin
df20: 65 20 4a 45 41 43 48 5f 52 4f 4f 54 20 20 20 20  e JEACH_ROOT    
df30: 39 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  9..  UNUSED_PARA
df40: 4d 28 70 7a 45 72 72 29 3b 0a 20 20 55 4e 55 53  M(pzErr);.  UNUS
df50: 45 44 5f 50 41 52 41 4d 28 61 72 67 76 29 3b 0a  ED_PARAM(argv);.
df60: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 61    UNUSED_PARAM(a
df70: 72 67 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  rgc);.  UNUSED_P
df80: 41 52 41 4d 28 70 41 75 78 29 3b 0a 20 20 72 63  ARAM(pAux);.  rc
df90: 20 3d 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61   = sqlite3_decla
dfa0: 72 65 5f 76 74 61 62 28 64 62 2c 20 0a 20 20 20  re_vtab(db, .   
dfb0: 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
dfc0: 78 28 6b 65 79 2c 76 61 6c 75 65 2c 74 79 70 65  x(key,value,type
dfd0: 2c 61 74 6f 6d 2c 69 64 2c 70 61 72 65 6e 74 2c  ,atom,id,parent,
dfe0: 66 75 6c 6c 6b 65 79 2c 70 61 74 68 2c 22 0a 20  fullkey,path,". 
dff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e000: 20 20 20 22 6a 73 6f 6e 20 48 49 44 44 45 4e 2c     "json HIDDEN,
e010: 72 6f 6f 74 20 48 49 44 44 45 4e 29 22 29 3b 0a  root HIDDEN)");.
e020: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
e030: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 4e 65 77 20  _OK ){.    pNew 
e040: 3d 20 2a 70 70 56 74 61 62 20 3d 20 73 71 6c 69  = *ppVtab = sqli
e050: 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  te3_malloc( size
e060: 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 20  of(*pNew) );.   
e070: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
e080: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
e090: 45 4d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  EM;.    memset(p
e0a0: 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  New, 0, sizeof(*
e0b0: 70 4e 65 77 29 29 3b 0a 20 20 7d 0a 20 20 72 65  pNew));.  }.  re
e0c0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 64  turn rc;.}../* d
e0d0: 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 6a 73  estructor for js
e0e0: 6f 6e 5f 65 61 63 68 20 76 69 72 74 75 61 6c 20  on_each virtual 
e0f0: 74 61 62 6c 65 20 2a 2f 0a 73 74 61 74 69 63 20  table */.static 
e100: 69 6e 74 20 6a 73 6f 6e 45 61 63 68 44 69 73 63  int jsonEachDisc
e110: 6f 6e 6e 65 63 74 28 73 71 6c 69 74 65 33 5f 76  onnect(sqlite3_v
e120: 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 73  tab *pVtab){.  s
e130: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74 61  qlite3_free(pVta
e140: 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  b);.  return SQL
e150: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 63 6f  ITE_OK;.}../* co
e160: 6e 73 74 72 75 63 74 6f 72 20 66 6f 72 20 61 20  nstructor for a 
e170: 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 20 6f  JsonEachCursor o
e180: 62 6a 65 63 74 20 66 6f 72 20 6a 73 6f 6e 5f 65  bject for json_e
e190: 61 63 68 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63  ach(). */.static
e1a0: 20 69 6e 74 20 6a 73 6f 6e 45 61 63 68 4f 70 65   int jsonEachOpe
e1b0: 6e 45 61 63 68 28 73 71 6c 69 74 65 33 5f 76 74  nEach(sqlite3_vt
e1c0: 61 62 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76  ab *p, sqlite3_v
e1d0: 74 61 62 5f 63 75 72 73 6f 72 20 2a 2a 70 70 43  tab_cursor **ppC
e1e0: 75 72 73 6f 72 29 7b 0a 20 20 4a 73 6f 6e 45 61  ursor){.  JsonEa
e1f0: 63 68 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  chCursor *pCur;.
e200: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28  .  UNUSED_PARAM(
e210: 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 73 71 6c  p);.  pCur = sql
e220: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
e230: 65 6f 66 28 2a 70 43 75 72 29 20 29 3b 0a 20 20  eof(*pCur) );.  
e240: 69 66 28 20 70 43 75 72 3d 3d 30 20 29 20 72 65  if( pCur==0 ) re
e250: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
e260: 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 75 72  M;.  memset(pCur
e270: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43 75  , 0, sizeof(*pCu
e280: 72 29 29 3b 0a 20 20 2a 70 70 43 75 72 73 6f 72  r));.  *ppCursor
e290: 20 3d 20 26 70 43 75 72 2d 3e 62 61 73 65 3b 0a   = &pCur->base;.
e2a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e2b0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 63 6f 6e 73 74 72  OK;.}../* constr
e2c0: 75 63 74 6f 72 20 66 6f 72 20 61 20 4a 73 6f 6e  uctor for a Json
e2d0: 45 61 63 68 43 75 72 73 6f 72 20 6f 62 6a 65 63  EachCursor objec
e2e0: 74 20 66 6f 72 20 6a 73 6f 6e 5f 74 72 65 65 28  t for json_tree(
e2f0: 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ). */.static int
e300: 20 6a 73 6f 6e 45 61 63 68 4f 70 65 6e 54 72 65   jsonEachOpenTre
e310: 65 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a  e(sqlite3_vtab *
e320: 70 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  p, sqlite3_vtab_
e330: 63 75 72 73 6f 72 20 2a 2a 70 70 43 75 72 73 6f  cursor **ppCurso
e340: 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 6a  r){.  int rc = j
e350: 73 6f 6e 45 61 63 68 4f 70 65 6e 45 61 63 68 28  sonEachOpenEach(
e360: 70 2c 20 70 70 43 75 72 73 6f 72 29 3b 0a 20 20  p, ppCursor);.  
e370: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
e380: 4b 20 29 7b 0a 20 20 20 20 4a 73 6f 6e 45 61 63  K ){.    JsonEac
e390: 68 43 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20  hCursor *pCur = 
e3a0: 28 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 2a  (JsonEachCursor*
e3b0: 29 2a 70 70 43 75 72 73 6f 72 3b 0a 20 20 20 20  )*ppCursor;.    
e3c0: 70 43 75 72 2d 3e 62 52 65 63 75 72 73 69 76 65  pCur->bRecursive
e3d0: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
e3e0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 52 65 73  rn rc;.}../* Res
e3f0: 65 74 20 61 20 4a 73 6f 6e 45 61 63 68 43 75 72  et a JsonEachCur
e400: 73 6f 72 20 62 61 63 6b 20 74 6f 20 69 74 73 20  sor back to its 
e410: 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 2e 20  original state. 
e420: 20 46 72 65 65 20 61 6e 79 20 6d 65 6d 6f 72 79   Free any memory
e430: 0a 2a 2a 20 68 65 6c 64 2e 20 2a 2f 0a 73 74 61  .** held. */.sta
e440: 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 45 61 63  tic void jsonEac
e450: 68 43 75 72 73 6f 72 52 65 73 65 74 28 4a 73 6f  hCursorReset(Jso
e460: 6e 45 61 63 68 43 75 72 73 6f 72 20 2a 70 29 7b  nEachCursor *p){
e470: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
e480: 70 2d 3e 7a 4a 73 6f 6e 29 3b 0a 20 20 73 71 6c  p->zJson);.  sql
e490: 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 52 6f  ite3_free(p->zRo
e4a0: 6f 74 29 3b 0a 20 20 6a 73 6f 6e 50 61 72 73 65  ot);.  jsonParse
e4b0: 52 65 73 65 74 28 26 70 2d 3e 73 50 61 72 73 65  Reset(&p->sParse
e4c0: 29 3b 0a 20 20 70 2d 3e 69 52 6f 77 69 64 20 3d  );.  p->iRowid =
e4d0: 20 30 3b 0a 20 20 70 2d 3e 69 20 3d 20 30 3b 0a   0;.  p->i = 0;.
e4e0: 20 20 70 2d 3e 69 45 6e 64 20 3d 20 30 3b 0a 20    p->iEnd = 0;. 
e4f0: 20 70 2d 3e 65 54 79 70 65 20 3d 20 30 3b 0a 20   p->eType = 0;. 
e500: 20 70 2d 3e 7a 4a 73 6f 6e 20 3d 20 30 3b 0a 20   p->zJson = 0;. 
e510: 20 70 2d 3e 7a 52 6f 6f 74 20 3d 20 30 3b 0a 7d   p->zRoot = 0;.}
e520: 0a 0a 2f 2a 20 44 65 73 74 72 75 63 74 6f 72 20  ../* Destructor 
e530: 66 6f 72 20 61 20 6a 73 6f 6e 45 61 63 68 43 75  for a jsonEachCu
e540: 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 73  rsor object */.s
e550: 74 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e 45 61  tatic int jsonEa
e560: 63 68 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  chClose(sqlite3_
e570: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72  vtab_cursor *cur
e580: 29 7b 0a 20 20 4a 73 6f 6e 45 61 63 68 43 75 72  ){.  JsonEachCur
e590: 73 6f 72 20 2a 70 20 3d 20 28 4a 73 6f 6e 45 61  sor *p = (JsonEa
e5a0: 63 68 43 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20  chCursor*)cur;. 
e5b0: 20 6a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 52   jsonEachCursorR
e5c0: 65 73 65 74 28 70 29 3b 0a 20 20 73 71 6c 69 74  eset(p);.  sqlit
e5d0: 65 33 5f 66 72 65 65 28 63 75 72 29 3b 0a 20 20  e3_free(cur);.  
e5e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e5f0: 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 54  ;.}../* Return T
e600: 52 55 45 20 69 66 20 74 68 65 20 6a 73 6f 6e 45  RUE if the jsonE
e610: 61 63 68 43 75 72 73 6f 72 20 6f 62 6a 65 63 74  achCursor object
e620: 20 68 61 73 20 62 65 65 6e 20 61 64 76 61 6e 63   has been advanc
e630: 65 64 20 6f 66 66 20 74 68 65 20 65 6e 64 0a 2a  ed off the end.*
e640: 2a 20 6f 66 20 74 68 65 20 4a 53 4f 4e 20 6f 62  * of the JSON ob
e650: 6a 65 63 74 20 2a 2f 0a 73 74 61 74 69 63 20 69  ject */.static i
e660: 6e 74 20 6a 73 6f 6e 45 61 63 68 45 6f 66 28 73  nt jsonEachEof(s
e670: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
e680: 6f 72 20 2a 63 75 72 29 7b 0a 20 20 4a 73 6f 6e  or *cur){.  Json
e690: 45 61 63 68 43 75 72 73 6f 72 20 2a 70 20 3d 20  EachCursor *p = 
e6a0: 28 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 2a  (JsonEachCursor*
e6b0: 29 63 75 72 3b 0a 20 20 72 65 74 75 72 6e 20 70  )cur;.  return p
e6c0: 2d 3e 69 20 3e 3d 20 70 2d 3e 69 45 6e 64 3b 0a  ->i >= p->iEnd;.
e6d0: 7d 0a 0a 2f 2a 20 41 64 76 61 6e 63 65 20 74 68  }../* Advance th
e6e0: 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
e6f0: 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 66 6f 72  next element for
e700: 20 6a 73 6f 6e 5f 74 72 65 65 28 29 20 2a 2f 0a   json_tree() */.
e710: 73 74 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e 45  static int jsonE
e720: 61 63 68 4e 65 78 74 28 73 71 6c 69 74 65 33 5f  achNext(sqlite3_
e730: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72  vtab_cursor *cur
e740: 29 7b 0a 20 20 4a 73 6f 6e 45 61 63 68 43 75 72  ){.  JsonEachCur
e750: 73 6f 72 20 2a 70 20 3d 20 28 4a 73 6f 6e 45 61  sor *p = (JsonEa
e760: 63 68 43 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20  chCursor*)cur;. 
e770: 20 69 66 28 20 70 2d 3e 62 52 65 63 75 72 73 69   if( p->bRecursi
e780: 76 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  ve ){.    if( p-
e790: 3e 73 50 61 72 73 65 2e 61 4e 6f 64 65 5b 70 2d  >sParse.aNode[p-
e7a0: 3e 69 5d 2e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e  >i].jnFlags & JN
e7b0: 4f 44 45 5f 4c 41 42 45 4c 20 29 20 70 2d 3e 69  ODE_LABEL ) p->i
e7c0: 2b 2b 3b 0a 20 20 20 20 70 2d 3e 69 2b 2b 3b 0a  ++;.    p->i++;.
e7d0: 20 20 20 20 70 2d 3e 69 52 6f 77 69 64 2b 2b 3b      p->iRowid++;
e7e0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 3c 70 2d  .    if( p->i<p-
e7f0: 3e 69 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 75  >iEnd ){.      u
e800: 33 32 20 69 55 70 20 3d 20 70 2d 3e 73 50 61 72  32 iUp = p->sPar
e810: 73 65 2e 61 55 70 5b 70 2d 3e 69 5d 3b 0a 20 20  se.aUp[p->i];.  
e820: 20 20 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 55      JsonNode *pU
e830: 70 20 3d 20 26 70 2d 3e 73 50 61 72 73 65 2e 61  p = &p->sParse.a
e840: 4e 6f 64 65 5b 69 55 70 5d 3b 0a 20 20 20 20 20  Node[iUp];.     
e850: 20 70 2d 3e 65 54 79 70 65 20 3d 20 70 55 70 2d   p->eType = pUp-
e860: 3e 65 54 79 70 65 3b 0a 20 20 20 20 20 20 69 66  >eType;.      if
e870: 28 20 70 55 70 2d 3e 65 54 79 70 65 3d 3d 4a 53  ( pUp->eType==JS
e880: 4f 4e 5f 41 52 52 41 59 20 29 7b 0a 20 20 20 20  ON_ARRAY ){.    
e890: 20 20 20 20 69 66 28 20 69 55 70 3d 3d 70 2d 3e      if( iUp==p->
e8a0: 69 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  i-1 ){.         
e8b0: 20 70 55 70 2d 3e 75 2e 69 4b 65 79 20 3d 20 30   pUp->u.iKey = 0
e8c0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
e8d0: 0a 20 20 20 20 20 20 20 20 20 20 70 55 70 2d 3e  .          pUp->
e8e0: 75 2e 69 4b 65 79 2b 2b 3b 0a 20 20 20 20 20 20  u.iKey++;.      
e8f0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
e900: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  }.  }else{.    s
e910: 77 69 74 63 68 28 20 70 2d 3e 65 54 79 70 65 20  witch( p->eType 
e920: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4a 53  ){.      case JS
e930: 4f 4e 5f 41 52 52 41 59 3a 20 7b 0a 20 20 20 20  ON_ARRAY: {.    
e940: 20 20 20 20 70 2d 3e 69 20 2b 3d 20 6a 73 6f 6e      p->i += json
e950: 4e 6f 64 65 53 69 7a 65 28 26 70 2d 3e 73 50 61  NodeSize(&p->sPa
e960: 72 73 65 2e 61 4e 6f 64 65 5b 70 2d 3e 69 5d 29  rse.aNode[p->i])
e970: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 52 6f  ;.        p->iRo
e980: 77 69 64 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62  wid++;.        b
e990: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
e9a0: 20 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f 4f 42      case JSON_OB
e9b0: 4a 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 20 20  JECT: {.        
e9c0: 70 2d 3e 69 20 2b 3d 20 31 20 2b 20 6a 73 6f 6e  p->i += 1 + json
e9d0: 4e 6f 64 65 53 69 7a 65 28 26 70 2d 3e 73 50 61  NodeSize(&p->sPa
e9e0: 72 73 65 2e 61 4e 6f 64 65 5b 70 2d 3e 69 2b 31  rse.aNode[p->i+1
e9f0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69  ]);.        p->i
ea00: 52 6f 77 69 64 2b 2b 3b 0a 20 20 20 20 20 20 20  Rowid++;.       
ea10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
ea20: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b        default: {
ea30: 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 20 3d 20  .        p->i = 
ea40: 70 2d 3e 69 45 6e 64 3b 0a 20 20 20 20 20 20 20  p->iEnd;.       
ea50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
ea60: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
ea70: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
ea80: 0a 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 6e  ./* Append the n
ea90: 61 6d 65 20 6f 66 20 74 68 65 20 70 61 74 68 20  ame of the path 
eaa0: 66 6f 72 20 65 6c 65 6d 65 6e 74 20 69 20 74 6f  for element i to
eab0: 20 70 53 74 72 0a 2a 2f 0a 73 74 61 74 69 63 20   pStr.*/.static 
eac0: 76 6f 69 64 20 6a 73 6f 6e 45 61 63 68 43 6f 6d  void jsonEachCom
ead0: 70 75 74 65 50 61 74 68 28 0a 20 20 4a 73 6f 6e  putePath(.  Json
eae0: 45 61 63 68 43 75 72 73 6f 72 20 2a 70 2c 20 20  EachCursor *p,  
eaf0: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
eb00: 6f 72 20 2a 2f 0a 20 20 4a 73 6f 6e 53 74 72 69  or */.  JsonStri
eb10: 6e 67 20 2a 70 53 74 72 2c 20 20 20 20 20 20 20  ng *pStr,       
eb20: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61   /* Write the pa
eb30: 74 68 20 68 65 72 65 20 2a 2f 0a 20 20 75 33 32  th here */.  u32
eb40: 20 69 20 20 20 20 20 20 20 20 20 20 20 20 20 20   i              
eb50: 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20 74 6f        /* Path to
eb60: 20 74 68 69 73 20 65 6c 65 6d 65 6e 74 20 2a 2f   this element */
eb70: 0a 29 7b 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a  .){.  JsonNode *
eb80: 70 4e 6f 64 65 2c 20 2a 70 55 70 3b 0a 20 20 75  pNode, *pUp;.  u
eb90: 33 32 20 69 55 70 3b 0a 20 20 69 66 28 20 69 3d  32 iUp;.  if( i=
eba0: 3d 30 20 29 7b 0a 20 20 20 20 6a 73 6f 6e 41 70  =0 ){.    jsonAp
ebb0: 70 65 6e 64 43 68 61 72 28 70 53 74 72 2c 20 27  pendChar(pStr, '
ebc0: 24 27 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  $');.    return;
ebd0: 0a 20 20 7d 0a 20 20 69 55 70 20 3d 20 70 2d 3e  .  }.  iUp = p->
ebe0: 73 50 61 72 73 65 2e 61 55 70 5b 69 5d 3b 0a 20  sParse.aUp[i];. 
ebf0: 20 6a 73 6f 6e 45 61 63 68 43 6f 6d 70 75 74 65   jsonEachCompute
ec00: 50 61 74 68 28 70 2c 20 70 53 74 72 2c 20 69 55  Path(p, pStr, iU
ec10: 70 29 3b 0a 20 20 70 4e 6f 64 65 20 3d 20 26 70  p);.  pNode = &p
ec20: 2d 3e 73 50 61 72 73 65 2e 61 4e 6f 64 65 5b 69  ->sParse.aNode[i
ec30: 5d 3b 0a 20 20 70 55 70 20 3d 20 26 70 2d 3e 73  ];.  pUp = &p->s
ec40: 50 61 72 73 65 2e 61 4e 6f 64 65 5b 69 55 70 5d  Parse.aNode[iUp]
ec50: 3b 0a 20 20 69 66 28 20 70 55 70 2d 3e 65 54 79  ;.  if( pUp->eTy
ec60: 70 65 3d 3d 4a 53 4f 4e 5f 41 52 52 41 59 20 29  pe==JSON_ARRAY )
ec70: 7b 0a 20 20 20 20 6a 73 6f 6e 50 72 69 6e 74 66  {.    jsonPrintf
ec80: 28 33 30 2c 20 70 53 74 72 2c 20 22 5b 25 64 5d  (30, pStr, "[%d]
ec90: 22 2c 20 70 55 70 2d 3e 75 2e 69 4b 65 79 29 3b  ", pUp->u.iKey);
eca0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
ecb0: 73 65 72 74 28 20 70 55 70 2d 3e 65 54 79 70 65  sert( pUp->eType
ecc0: 3d 3d 4a 53 4f 4e 5f 4f 42 4a 45 43 54 20 29 3b  ==JSON_OBJECT );
ecd0: 0a 20 20 20 20 69 66 28 20 28 70 4e 6f 64 65 2d  .    if( (pNode-
ece0: 3e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45  >jnFlags & JNODE
ecf0: 5f 4c 41 42 45 4c 29 3d 3d 30 20 29 20 70 4e 6f  _LABEL)==0 ) pNo
ed00: 64 65 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74  de--;.    assert
ed10: 28 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65 3d 3d  ( pNode->eType==
ed20: 4a 53 4f 4e 5f 53 54 52 49 4e 47 20 29 3b 0a 20  JSON_STRING );. 
ed30: 20 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65     assert( pNode
ed40: 2d 3e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44  ->jnFlags & JNOD
ed50: 45 5f 4c 41 42 45 4c 20 29 3b 0a 20 20 20 20 6a  E_LABEL );.    j
ed60: 73 6f 6e 50 72 69 6e 74 66 28 70 4e 6f 64 65 2d  sonPrintf(pNode-
ed70: 3e 6e 2b 31 2c 20 70 53 74 72 2c 20 22 2e 25 2e  >n+1, pStr, ".%.
ed80: 2a 73 22 2c 20 70 4e 6f 64 65 2d 3e 6e 2d 32 2c  *s", pNode->n-2,
ed90: 20 70 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74   pNode->u.zJCont
eda0: 65 6e 74 2b 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ent+1);.  }.}../
edb0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
edc0: 75 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 2a  ue of a column *
edd0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 73 6f  /.static int jso
ede0: 6e 45 61 63 68 43 6f 6c 75 6d 6e 28 0a 20 20 73  nEachColumn(.  s
edf0: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
ee00: 6f 72 20 2a 63 75 72 2c 20 20 20 2f 2a 20 54 68  or *cur,   /* Th
ee10: 65 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 73 71  e cursor */.  sq
ee20: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
ee30: 74 78 2c 20 20 20 20 20 20 20 2f 2a 20 46 69 72  tx,       /* Fir
ee40: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73  st argument to s
ee50: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 2e 2e  qlite3_result_..
ee60: 2e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 69 20 20  .() */.  int i  
ee70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee80: 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 63 6f       /* Which co
ee90: 6c 75 6d 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a  lumn to return *
eea0: 2f 0a 29 7b 0a 20 20 4a 73 6f 6e 45 61 63 68 43  /.){.  JsonEachC
eeb0: 75 72 73 6f 72 20 2a 70 20 3d 20 28 4a 73 6f 6e  ursor *p = (Json
eec0: 45 61 63 68 43 75 72 73 6f 72 2a 29 63 75 72 3b  EachCursor*)cur;
eed0: 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 54 68  .  JsonNode *pTh
eee0: 69 73 20 3d 20 26 70 2d 3e 73 50 61 72 73 65 2e  is = &p->sParse.
eef0: 61 4e 6f 64 65 5b 70 2d 3e 69 5d 3b 0a 20 20 73  aNode[p->i];.  s
ef00: 77 69 74 63 68 28 20 69 20 29 7b 0a 20 20 20 20  witch( i ){.    
ef10: 63 61 73 65 20 4a 45 41 43 48 5f 4b 45 59 3a 20  case JEACH_KEY: 
ef20: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69  {.      if( p->i
ef30: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
ef40: 20 20 20 69 66 28 20 70 2d 3e 65 54 79 70 65 3d     if( p->eType=
ef50: 3d 4a 53 4f 4e 5f 4f 42 4a 45 43 54 20 29 7b 0a  =JSON_OBJECT ){.
ef60: 20 20 20 20 20 20 20 20 6a 73 6f 6e 52 65 74 75          jsonRetu
ef70: 72 6e 28 70 54 68 69 73 2c 20 63 74 78 2c 20 30  rn(pThis, ctx, 0
ef80: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
ef90: 66 28 20 70 2d 3e 65 54 79 70 65 3d 3d 4a 53 4f  f( p->eType==JSO
efa0: 4e 5f 41 52 52 41 59 20 29 7b 0a 20 20 20 20 20  N_ARRAY ){.     
efb0: 20 20 20 75 33 32 20 69 4b 65 79 3b 0a 20 20 20     u32 iKey;.   
efc0: 20 20 20 20 20 69 66 28 20 70 2d 3e 62 52 65 63       if( p->bRec
efd0: 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  ursive ){.      
efe0: 20 20 20 20 69 66 28 20 70 2d 3e 69 52 6f 77 69      if( p->iRowi
eff0: 64 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  d==0 ) break;.  
f000: 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 70          iKey = p
f010: 2d 3e 73 50 61 72 73 65 2e 61 4e 6f 64 65 5b 70  ->sParse.aNode[p
f020: 2d 3e 73 50 61 72 73 65 2e 61 55 70 5b 70 2d 3e  ->sParse.aUp[p->
f030: 69 5d 5d 2e 75 2e 69 4b 65 79 3b 0a 20 20 20 20  i]].u.iKey;.    
f040: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f050: 20 20 20 20 20 69 4b 65 79 20 3d 20 70 2d 3e 69       iKey = p->i
f060: 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 7d  Rowid;.        }
f070: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f080: 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 74  _result_int64(ct
f090: 78 2c 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  x, (sqlite3_int6
f0a0: 34 29 69 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d  4)iKey);.      }
f0b0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f0c0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 45 41    }.    case JEA
f0d0: 43 48 5f 56 41 4c 55 45 3a 20 7b 0a 20 20 20 20  CH_VALUE: {.    
f0e0: 20 20 69 66 28 20 70 54 68 69 73 2d 3e 6a 6e 46    if( pThis->jnF
f0f0: 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 4c 41 42  lags & JNODE_LAB
f100: 45 4c 20 29 20 70 54 68 69 73 2b 2b 3b 0a 20 20  EL ) pThis++;.  
f110: 20 20 20 20 6a 73 6f 6e 52 65 74 75 72 6e 28 70      jsonReturn(p
f120: 54 68 69 73 2c 20 63 74 78 2c 20 30 29 3b 0a 20  This, ctx, 0);. 
f130: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f140: 7d 0a 20 20 20 20 63 61 73 65 20 4a 45 41 43 48  }.    case JEACH
f150: 5f 54 59 50 45 3a 20 7b 0a 20 20 20 20 20 20 69  _TYPE: {.      i
f160: 66 28 20 70 54 68 69 73 2d 3e 6a 6e 46 6c 61 67  f( pThis->jnFlag
f170: 73 20 26 20 4a 4e 4f 44 45 5f 4c 41 42 45 4c 20  s & JNODE_LABEL 
f180: 29 20 70 54 68 69 73 2b 2b 3b 0a 20 20 20 20 20  ) pThis++;.     
f190: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
f1a0: 74 65 78 74 28 63 74 78 2c 20 6a 73 6f 6e 54 79  text(ctx, jsonTy
f1b0: 70 65 5b 70 54 68 69 73 2d 3e 65 54 79 70 65 5d  pe[pThis->eType]
f1c0: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41  , -1, SQLITE_STA
f1d0: 54 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65 61  TIC);.      brea
f1e0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
f1f0: 65 20 4a 45 41 43 48 5f 41 54 4f 4d 3a 20 7b 0a  e JEACH_ATOM: {.
f200: 20 20 20 20 20 20 69 66 28 20 70 54 68 69 73 2d        if( pThis-
f210: 3e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45  >jnFlags & JNODE
f220: 5f 4c 41 42 45 4c 20 29 20 70 54 68 69 73 2b 2b  _LABEL ) pThis++
f230: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 68 69  ;.      if( pThi
f240: 73 2d 3e 65 54 79 70 65 3e 3d 4a 53 4f 4e 5f 41  s->eType>=JSON_A
f250: 52 52 41 59 20 29 20 62 72 65 61 6b 3b 0a 20 20  RRAY ) break;.  
f260: 20 20 20 20 6a 73 6f 6e 52 65 74 75 72 6e 28 70      jsonReturn(p
f270: 54 68 69 73 2c 20 63 74 78 2c 20 30 29 3b 0a 20  This, ctx, 0);. 
f280: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f290: 7d 0a 20 20 20 20 63 61 73 65 20 4a 45 41 43 48  }.    case JEACH
f2a0: 5f 49 44 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  _ID: {.      sql
f2b0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
f2c0: 34 28 63 74 78 2c 20 0a 20 20 20 20 20 20 20 20  4(ctx, .        
f2d0: 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
f2e0: 70 2d 3e 69 20 2b 20 28 28 70 54 68 69 73 2d 3e  p->i + ((pThis->
f2f0: 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f  jnFlags & JNODE_
f300: 4c 41 42 45 4c 29 21 3d 30 29 29 3b 0a 20 20 20  LABEL)!=0));.   
f310: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
f320: 20 20 20 20 63 61 73 65 20 4a 45 41 43 48 5f 50      case JEACH_P
f330: 41 52 45 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69  ARENT: {.      i
f340: 66 28 20 70 2d 3e 69 3e 70 2d 3e 69 42 65 67 69  f( p->i>p->iBegi
f350: 6e 20 26 26 20 70 2d 3e 62 52 65 63 75 72 73 69  n && p->bRecursi
f360: 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ve ){.        sq
f370: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
f380: 36 34 28 63 74 78 2c 20 28 73 71 6c 69 74 65 33  64(ctx, (sqlite3
f390: 5f 69 6e 74 36 34 29 70 2d 3e 73 50 61 72 73 65  _int64)p->sParse
f3a0: 2e 61 55 70 5b 70 2d 3e 69 5d 29 3b 0a 20 20 20  .aUp[p->i]);.   
f3b0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
f3c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
f3d0: 20 4a 45 41 43 48 5f 46 55 4c 4c 4b 45 59 3a 20   JEACH_FULLKEY: 
f3e0: 7b 0a 20 20 20 20 20 20 4a 73 6f 6e 53 74 72 69  {.      JsonStri
f3f0: 6e 67 20 78 3b 0a 20 20 20 20 20 20 6a 73 6f 6e  ng x;.      json
f400: 49 6e 69 74 28 26 78 2c 20 63 74 78 29 3b 0a 20  Init(&x, ctx);. 
f410: 20 20 20 20 20 69 66 28 20 70 2d 3e 62 52 65 63       if( p->bRec
f420: 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  ursive ){.      
f430: 20 20 6a 73 6f 6e 45 61 63 68 43 6f 6d 70 75 74    jsonEachComput
f440: 65 50 61 74 68 28 70 2c 20 26 78 2c 20 70 2d 3e  ePath(p, &x, p->
f450: 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  i);.      }else{
f460: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
f470: 7a 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20 20  zRoot ){.       
f480: 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 52 61 77     jsonAppendRaw
f490: 28 26 78 2c 20 70 2d 3e 7a 52 6f 6f 74 2c 20 28  (&x, p->zRoot, (
f4a0: 69 6e 74 29 73 74 72 6c 65 6e 28 70 2d 3e 7a 52  int)strlen(p->zR
f4b0: 6f 6f 74 29 29 3b 0a 20 20 20 20 20 20 20 20 7d  oot));.        }
f4c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
f4d0: 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61 72 28 26  jsonAppendChar(&
f4e0: 78 2c 20 27 24 27 29 3b 0a 20 20 20 20 20 20 20  x, '$');.       
f4f0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
f500: 2d 3e 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f 41 52  ->eType==JSON_AR
f510: 52 41 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20  RAY ){.         
f520: 20 6a 73 6f 6e 50 72 69 6e 74 66 28 33 30 2c 20   jsonPrintf(30, 
f530: 26 78 2c 20 22 5b 25 64 5d 22 2c 20 70 2d 3e 69  &x, "[%d]", p->i
f540: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
f550: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 54 79  }else if( p->eTy
f560: 70 65 3d 3d 4a 53 4f 4e 5f 4f 42 4a 45 43 54 20  pe==JSON_OBJECT 
f570: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6a 73 6f  ){.          jso
f580: 6e 50 72 69 6e 74 66 28 70 54 68 69 73 2d 3e 6e  nPrintf(pThis->n
f590: 2c 20 26 78 2c 20 22 2e 25 2e 2a 73 22 2c 20 70  , &x, ".%.*s", p
f5a0: 54 68 69 73 2d 3e 6e 2d 32 2c 20 70 54 68 69 73  This->n-2, pThis
f5b0: 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 2b 31 29  ->u.zJContent+1)
f5c0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f5d0: 20 20 7d 0a 20 20 20 20 20 20 6a 73 6f 6e 52 65    }.      jsonRe
f5e0: 73 75 6c 74 28 26 78 29 3b 0a 20 20 20 20 20 20  sult(&x);.      
f5f0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
f600: 20 63 61 73 65 20 4a 45 41 43 48 5f 50 41 54 48   case JEACH_PATH
f610: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  : {.      if( p-
f620: 3e 62 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20  >bRecursive ){. 
f630: 20 20 20 20 20 20 20 4a 73 6f 6e 53 74 72 69 6e         JsonStrin
f640: 67 20 78 3b 0a 20 20 20 20 20 20 20 20 6a 73 6f  g x;.        jso
f650: 6e 49 6e 69 74 28 26 78 2c 20 63 74 78 29 3b 0a  nInit(&x, ctx);.
f660: 20 20 20 20 20 20 20 20 6a 73 6f 6e 45 61 63 68          jsonEach
f670: 43 6f 6d 70 75 74 65 50 61 74 68 28 70 2c 20 26  ComputePath(p, &
f680: 78 2c 20 70 2d 3e 73 50 61 72 73 65 2e 61 55 70  x, p->sParse.aUp
f690: 5b 70 2d 3e 69 5d 29 3b 0a 20 20 20 20 20 20 20  [p->i]);.       
f6a0: 20 6a 73 6f 6e 52 65 73 75 6c 74 28 26 78 29 3b   jsonResult(&x);
f6b0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
f6c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
f6d0: 20 46 6f 72 20 6a 73 6f 6e 5f 65 61 63 68 28 29   For json_each()
f6e0: 20 70 61 74 68 20 61 6e 64 20 72 6f 6f 74 20 61   path and root a
f6f0: 72 65 20 74 68 65 20 73 61 6d 65 20 73 6f 20 66  re the same so f
f700: 61 6c 6c 20 74 68 72 6f 75 67 68 0a 20 20 20 20  all through.    
f710: 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 72 6f    ** into the ro
f720: 6f 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d  ot case */.    }
f730: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
f740: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
f750: 20 2a 7a 52 6f 6f 74 20 3d 20 70 2d 3e 7a 52 6f   *zRoot = p->zRo
f760: 6f 74 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52  ot;.      if( zR
f770: 6f 6f 74 3d 3d 30 20 29 20 7a 52 6f 6f 74 20 3d  oot==0 ) zRoot =
f780: 20 22 24 22 3b 0a 20 20 20 20 20 20 73 71 6c 69   "$";.      sqli
f790: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
f7a0: 63 74 78 2c 20 7a 52 6f 6f 74 2c 20 2d 31 2c 20  ctx, zRoot, -1, 
f7b0: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
f7c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f7d0: 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 45 41 43   }.    case JEAC
f7e0: 48 5f 4a 53 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  H_JSON: {.      
f7f0: 61 73 73 65 72 74 28 20 69 3d 3d 4a 45 41 43 48  assert( i==JEACH
f800: 5f 4a 53 4f 4e 20 29 3b 0a 20 20 20 20 20 20 73  _JSON );.      s
f810: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
f820: 78 74 28 63 74 78 2c 20 70 2d 3e 73 50 61 72 73  xt(ctx, p->sPars
f830: 65 2e 7a 4a 73 6f 6e 2c 20 2d 31 2c 20 53 51 4c  e.zJson, -1, SQL
f840: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
f850: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
f860: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
f870: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 52 65  ITE_OK;.}../* Re
f880: 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
f890: 20 72 6f 77 69 64 20 76 61 6c 75 65 20 2a 2f 0a   rowid value */.
f8a0: 73 74 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e 45  static int jsonE
f8b0: 61 63 68 52 6f 77 69 64 28 73 71 6c 69 74 65 33  achRowid(sqlite3
f8c0: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75  _vtab_cursor *cu
f8d0: 72 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  r, sqlite_int64 
f8e0: 2a 70 52 6f 77 69 64 29 7b 0a 20 20 4a 73 6f 6e  *pRowid){.  Json
f8f0: 45 61 63 68 43 75 72 73 6f 72 20 2a 70 20 3d 20  EachCursor *p = 
f900: 28 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 2a  (JsonEachCursor*
f910: 29 63 75 72 3b 0a 20 20 2a 70 52 6f 77 69 64 20  )cur;.  *pRowid 
f920: 3d 20 70 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 72  = p->iRowid;.  r
f930: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
f940: 0a 7d 0a 0a 2f 2a 20 54 68 65 20 71 75 65 72 79  .}../* The query
f950: 20 73 74 72 61 74 65 67 79 20 69 73 20 74 6f 20   strategy is to 
f960: 6c 6f 6f 6b 20 66 6f 72 20 61 6e 20 65 71 75 61  look for an equa
f970: 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
f980: 6f 6e 20 74 68 65 20 6a 73 6f 6e 0a 2a 2a 20 63  on the json.** c
f990: 6f 6c 75 6d 6e 2e 20 20 57 69 74 68 6f 75 74 20  olumn.  Without 
f9a0: 73 75 63 68 20 61 20 63 6f 6e 73 74 72 61 69 6e  such a constrain
f9b0: 74 2c 20 74 68 65 20 74 61 62 6c 65 20 63 61 6e  t, the table can
f9c0: 6e 6f 74 20 6f 70 65 72 61 74 65 2e 20 20 69 64  not operate.  id
f9d0: 78 4e 75 6d 20 69 73 0a 2a 2a 20 31 20 69 66 20  xNum is.** 1 if 
f9e0: 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  the constraint i
f9f0: 73 20 66 6f 75 6e 64 2c 20 33 20 69 66 20 74 68  s found, 3 if th
fa00: 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64  e constraint and
fa10: 20 7a 52 6f 6f 74 20 61 72 65 20 66 6f 75 6e 64   zRoot are found
fa20: 2c 0a 2a 2a 20 61 6e 64 20 30 20 6f 74 68 65 72  ,.** and 0 other
fa30: 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
fa40: 69 6e 74 20 6a 73 6f 6e 45 61 63 68 42 65 73 74  int jsonEachBest
fa50: 49 6e 64 65 78 28 0a 20 20 73 71 6c 69 74 65 33  Index(.  sqlite3
fa60: 5f 76 74 61 62 20 2a 74 61 62 2c 0a 20 20 73 71  _vtab *tab,.  sq
fa70: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
fa80: 20 2a 70 49 64 78 49 6e 66 6f 0a 29 7b 0a 20 20   *pIdxInfo.){.  
fa90: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
faa0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
fab0: 6f 70 20 63 6f 75 6e 74 65 72 20 6f 72 20 63 6f  op counter or co
fac0: 6d 70 75 74 65 64 20 61 72 72 61 79 20 69 6e 64  mputed array ind
fad0: 65 78 20 2a 2f 0a 20 20 69 6e 74 20 61 49 64 78  ex */.  int aIdx
fae0: 5b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  [2];            
faf0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
fb00: 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20 4a  onstraints for J
fb10: 53 4f 4e 20 61 6e 64 20 52 4f 4f 54 20 2a 2f 0a  SON and ROOT */.
fb20: 20 20 69 6e 74 20 75 6e 75 73 61 62 6c 65 4d 61    int unusableMa
fb30: 73 6b 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  sk = 0;      /* 
fb40: 4d 61 73 6b 20 6f 66 20 75 6e 75 73 61 62 6c 65  Mask of unusable
fb50: 20 4a 53 4f 4e 20 61 6e 64 20 52 4f 4f 54 20 63   JSON and ROOT c
fb60: 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
fb70: 69 6e 74 20 69 64 78 4d 61 73 6b 20 3d 20 30 3b  int idxMask = 0;
fb80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
fb90: 73 6b 20 6f 66 20 75 73 61 62 6c 65 20 3d 3d 20  sk of usable == 
fba0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 4a 53 4f 4e  constraints JSON
fbb0: 20 61 6e 64 20 52 4f 4f 54 20 2a 2f 0a 20 20 63   and ROOT */.  c
fbc0: 6f 6e 73 74 20 73 74 72 75 63 74 20 73 71 6c 69  onst struct sqli
fbd0: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
fbe0: 61 69 6e 74 20 2a 70 43 6f 6e 73 74 72 61 69 6e  aint *pConstrain
fbf0: 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 69 6d  t;..  /* This im
fc00: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 61 73 73  plementation ass
fc10: 75 6d 65 73 20 74 68 61 74 20 4a 53 4f 4e 20 61  umes that JSON a
fc20: 6e 64 20 52 4f 4f 54 20 61 72 65 20 74 68 65 20  nd ROOT are the 
fc30: 6c 61 73 74 20 74 77 6f 0a 20 20 2a 2a 20 63 6f  last two.  ** co
fc40: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62  lumns in the tab
fc50: 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  le */.  assert( 
fc60: 4a 45 41 43 48 5f 52 4f 4f 54 20 3d 3d 20 4a 45  JEACH_ROOT == JE
fc70: 41 43 48 5f 4a 53 4f 4e 2b 31 20 29 3b 0a 20 20  ACH_JSON+1 );.  
fc80: 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 74 61 62  UNUSED_PARAM(tab
fc90: 29 3b 0a 20 20 61 49 64 78 5b 30 5d 20 3d 20 61  );.  aIdx[0] = a
fca0: 49 64 78 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70  Idx[1] = -1;.  p
fcb0: 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64  Constraint = pId
fcc0: 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
fcd0: 6e 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  nt;.  for(i=0; i
fce0: 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73  <pIdxInfo->nCons
fcf0: 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 43 6f  traint; i++, pCo
fd00: 6e 73 74 72 61 69 6e 74 2b 2b 29 7b 0a 20 20 20  nstraint++){.   
fd10: 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 69   int iCol;.    i
fd20: 6e 74 20 69 4d 61 73 6b 3b 0a 20 20 20 20 69 66  nt iMask;.    if
fd30: 28 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 69  ( pConstraint->i
fd40: 43 6f 6c 75 6d 6e 20 3c 20 4a 45 41 43 48 5f 4a  Column < JEACH_J
fd50: 53 4f 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  SON ) continue;.
fd60: 20 20 20 20 69 43 6f 6c 20 3d 20 70 43 6f 6e 73      iCol = pCons
fd70: 74 72 61 69 6e 74 2d 3e 69 43 6f 6c 75 6d 6e 20  traint->iColumn 
fd80: 2d 20 4a 45 41 43 48 5f 4a 53 4f 4e 3b 0a 20 20  - JEACH_JSON;.  
fd90: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d    assert( iCol==
fda0: 30 20 7c 7c 20 69 43 6f 6c 3d 3d 31 20 29 3b 0a  0 || iCol==1 );.
fdb0: 20 20 20 20 69 4d 61 73 6b 20 3d 20 31 20 3c 3c      iMask = 1 <<
fdc0: 20 69 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20 70   iCol;.    if( p
fdd0: 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 75 73 61 62  Constraint->usab
fde0: 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75  le==0 ){.      u
fdf0: 6e 75 73 61 62 6c 65 4d 61 73 6b 20 7c 3d 20 69  nusableMask |= i
fe00: 4d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Mask;.    }else 
fe10: 69 66 28 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d  if( pConstraint-
fe20: 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  >op==SQLITE_INDE
fe30: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20  X_CONSTRAINT_EQ 
fe40: 29 7b 0a 20 20 20 20 20 20 61 49 64 78 5b 69 43  ){.      aIdx[iC
fe50: 6f 6c 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 69  ol] = i;.      i
fe60: 64 78 4d 61 73 6b 20 7c 3d 20 69 4d 61 73 6b 3b  dxMask |= iMask;
fe70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
fe80: 20 28 75 6e 75 73 61 62 6c 65 4d 61 73 6b 20 26   (unusableMask &
fe90: 20 7e 69 64 78 4d 61 73 6b 29 21 3d 30 20 29 7b   ~idxMask)!=0 ){
fea0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
feb0: 20 61 72 65 20 61 6e 79 20 75 6e 75 73 61 62 6c   are any unusabl
fec0: 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e  e constraints on
fed0: 20 4a 53 4f 4e 20 6f 72 20 52 4f 4f 54 2c 20 74   JSON or ROOT, t
fee0: 68 65 6e 20 72 65 6a 65 63 74 0a 20 20 20 20 2a  hen reject.    *
fef0: 2a 20 74 68 69 73 20 65 6e 74 69 72 65 20 70 6c  * this entire pl
ff00: 61 6e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  an */.    return
ff10: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
ff20: 4e 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 49  NT;.  }.  if( aI
ff30: 64 78 5b 30 5d 3c 30 20 29 7b 0a 20 20 20 20 2f  dx[0]<0 ){.    /
ff40: 2a 20 4e 6f 20 4a 53 4f 4e 20 69 6e 70 75 74 2e  * No JSON input.
ff50: 20 20 4c 65 61 76 65 20 65 73 74 69 6d 61 74 65    Leave estimate
ff60: 64 43 6f 73 74 20 61 74 20 74 68 65 20 68 75 67  dCost at the hug
ff70: 65 20 76 61 6c 75 65 20 74 68 61 74 20 69 74 20  e value that it 
ff80: 77 61 73 0a 20 20 20 20 2a 2a 20 69 6e 69 74 69  was.    ** initi
ff90: 61 6c 69 7a 65 64 20 74 6f 20 74 6f 20 64 69 73  alized to to dis
ffa0: 63 6f 75 72 61 67 65 20 74 68 65 20 71 75 65 72  courage the quer
ffb0: 79 20 70 6c 61 6e 6e 65 72 20 66 72 6f 6d 20 73  y planner from s
ffc0: 65 6c 65 63 74 69 6e 67 20 74 68 69 73 0a 20 20  electing this.  
ffd0: 20 20 2a 2a 20 70 6c 61 6e 2e 20 2a 2f 0a 20 20    ** plan. */.  
ffe0: 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e    pIdxInfo->idxN
fff0: 75 6d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  um = 0;.  }else{
10000 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65  .    pIdxInfo->e
10010 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 31  stimatedCost = 1
10020 2e 30 3b 0a 20 20 20 20 69 20 3d 20 61 49 64 78  .0;.    i = aIdx
10030 5b 30 5d 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  [0];.    pIdxInf
10040 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
10050 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78  age[i].argvIndex
10060 20 3d 20 31 3b 0a 20 20 20 20 70 49 64 78 49 6e   = 1;.    pIdxIn
10070 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
10080 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 20 3d 20 31  sage[i].omit = 1
10090 3b 0a 20 20 20 20 69 66 28 20 61 49 64 78 5b 31  ;.    if( aIdx[1
100a0 5d 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 49 64  ]<0 ){.      pId
100b0 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20  xInfo->idxNum = 
100c0 31 3b 20 20 2f 2a 20 4f 6e 6c 79 20 4a 53 4f 4e  1;  /* Only JSON
100d0 20 73 75 70 70 6c 69 65 64 2e 20 20 50 6c 61 6e   supplied.  Plan
100e0 20 31 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b   1 */.    }else{
100f0 0a 20 20 20 20 20 20 69 20 3d 20 61 49 64 78 5b  .      i = aIdx[
10100 31 5d 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e  1];.      pIdxIn
10110 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
10120 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65  sage[i].argvInde
10130 78 20 3d 20 32 3b 0a 20 20 20 20 20 20 70 49 64  x = 2;.      pId
10140 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
10150 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 20  ntUsage[i].omit 
10160 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 64 78 49  = 1;.      pIdxI
10170 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 33 3b  nfo->idxNum = 3;
10180 20 20 2f 2a 20 42 6f 74 68 20 4a 53 4f 4e 20 61    /* Both JSON a
10190 6e 64 20 52 4f 4f 54 20 61 72 65 20 73 75 70 70  nd ROOT are supp
101a0 6c 69 65 64 2e 20 20 50 6c 61 6e 20 33 20 2a 2f  lied.  Plan 3 */
101b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
101c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
101d0 0a 0a 2f 2a 20 53 74 61 72 74 20 61 20 73 65 61  ../* Start a sea
101e0 72 63 68 20 6f 6e 20 61 20 6e 65 77 20 4a 53 4f  rch on a new JSO
101f0 4e 20 73 74 72 69 6e 67 20 2a 2f 0a 73 74 61 74  N string */.stat
10200 69 63 20 69 6e 74 20 6a 73 6f 6e 45 61 63 68 46  ic int jsonEachF
10210 69 6c 74 65 72 28 0a 20 20 73 71 6c 69 74 65 33  ilter(.  sqlite3
10220 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75  _vtab_cursor *cu
10230 72 2c 0a 20 20 69 6e 74 20 69 64 78 4e 75 6d 2c  r,.  int idxNum,
10240 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 64 78   const char *idx
10250 53 74 72 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  Str,.  int argc,
10260 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
10270 2a 61 72 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e 45  *argv.){.  JsonE
10280 61 63 68 43 75 72 73 6f 72 20 2a 70 20 3d 20 28  achCursor *p = (
10290 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 2a 29  JsonEachCursor*)
102a0 63 75 72 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  cur;.  const cha
102b0 72 20 2a 7a 3b 0a 20 20 63 6f 6e 73 74 20 63 68  r *z;.  const ch
102c0 61 72 20 2a 7a 52 6f 6f 74 20 3d 20 30 3b 0a 20  ar *zRoot = 0;. 
102d0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
102e0 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
102f0 4d 28 69 64 78 53 74 72 29 3b 0a 20 20 55 4e 55  M(idxStr);.  UNU
10300 53 45 44 5f 50 41 52 41 4d 28 61 72 67 63 29 3b  SED_PARAM(argc);
10310 0a 20 20 6a 73 6f 6e 45 61 63 68 43 75 72 73 6f  .  jsonEachCurso
10320 72 52 65 73 65 74 28 70 29 3b 0a 20 20 69 66 28  rReset(p);.  if(
10330 20 69 64 78 4e 75 6d 3d 3d 30 20 29 20 72 65 74   idxNum==0 ) ret
10340 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
10350 20 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72   z = (const char
10360 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
10370 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  text(argv[0]);. 
10380 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75   if( z==0 ) retu
10390 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
103a0 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  n = sqlite3_valu
103b0 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29  e_bytes(argv[0])
103c0 3b 0a 20 20 70 2d 3e 7a 4a 73 6f 6e 20 3d 20 73  ;.  p->zJson = s
103d0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
103e0 20 6e 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 2d   n+1 );.  if( p-
103f0 3e 7a 4a 73 6f 6e 3d 3d 30 20 29 20 72 65 74 75  >zJson==0 ) retu
10400 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
10410 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e 7a 4a 73  .  memcpy(p->zJs
10420 6f 6e 2c 20 7a 2c 20 28 73 69 7a 65 5f 74 29 6e  on, z, (size_t)n
10430 2b 31 29 3b 0a 20 20 69 66 28 20 6a 73 6f 6e 50  +1);.  if( jsonP
10440 61 72 73 65 28 26 70 2d 3e 73 50 61 72 73 65 2c  arse(&p->sParse,
10450 20 30 2c 20 70 2d 3e 7a 4a 73 6f 6e 29 20 29 7b   0, p->zJson) ){
10460 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51  .    int rc = SQ
10470 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
10480 69 66 28 20 70 2d 3e 73 50 61 72 73 65 2e 6f 6f  if( p->sParse.oo
10490 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  m==0 ){.      sq
104a0 6c 69 74 65 33 5f 66 72 65 65 28 63 75 72 2d 3e  lite3_free(cur->
104b0 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b  pVtab->zErrMsg);
104c0 0a 20 20 20 20 20 20 63 75 72 2d 3e 70 56 74 61  .      cur->pVta
104d0 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c  b->zErrMsg = sql
104e0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6d 61  ite3_mprintf("ma
104f0 6c 66 6f 72 6d 65 64 20 4a 53 4f 4e 22 29 3b 0a  lformed JSON");.
10500 20 20 20 20 20 20 69 66 28 20 63 75 72 2d 3e 70        if( cur->p
10510 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 20  Vtab->zErrMsg ) 
10520 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
10530 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 73 6f  R;.    }.    jso
10540 6e 45 61 63 68 43 75 72 73 6f 72 52 65 73 65 74  nEachCursorReset
10550 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  (p);.    return 
10560 72 63 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  rc;.  }else if( 
10570 70 2d 3e 62 52 65 63 75 72 73 69 76 65 20 26 26  p->bRecursive &&
10580 20 6a 73 6f 6e 50 61 72 73 65 46 69 6e 64 50 61   jsonParseFindPa
10590 72 65 6e 74 73 28 26 70 2d 3e 73 50 61 72 73 65  rents(&p->sParse
105a0 29 20 29 7b 0a 20 20 20 20 6a 73 6f 6e 45 61 63  ) ){.    jsonEac
105b0 68 43 75 72 73 6f 72 52 65 73 65 74 28 70 29 3b  hCursorReset(p);
105c0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
105d0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73  TE_NOMEM;.  }els
105e0 65 7b 0a 20 20 20 20 4a 73 6f 6e 4e 6f 64 65 20  e{.    JsonNode 
105f0 2a 70 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  *pNode = 0;.    
10600 69 66 28 20 69 64 78 4e 75 6d 3d 3d 33 20 29 7b  if( idxNum==3 ){
10610 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
10620 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 20  r *zErr = 0;.   
10630 20 20 20 7a 52 6f 6f 74 20 3d 20 28 63 6f 6e 73     zRoot = (cons
10640 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
10650 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
10660 31 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  1]);.      if( z
10670 52 6f 6f 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  Root==0 ) return
10680 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
10690 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    n = sqlite3_va
106a0 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 31  lue_bytes(argv[1
106b0 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 52 6f  ]);.      p->zRo
106c0 6f 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ot = sqlite3_mal
106d0 6c 6f 63 36 34 28 20 6e 2b 31 20 29 3b 0a 20 20  loc64( n+1 );.  
106e0 20 20 20 20 69 66 28 20 70 2d 3e 7a 52 6f 6f 74      if( p->zRoot
106f0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
10700 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
10710 20 6d 65 6d 63 70 79 28 70 2d 3e 7a 52 6f 6f 74   memcpy(p->zRoot
10720 2c 20 7a 52 6f 6f 74 2c 20 28 73 69 7a 65 5f 74  , zRoot, (size_t
10730 29 6e 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28  )n+1);.      if(
10740 20 7a 52 6f 6f 74 5b 30 5d 21 3d 27 24 27 20 29   zRoot[0]!='$' )
10750 7b 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d  {.        zErr =
10760 20 7a 52 6f 6f 74 3b 0a 20 20 20 20 20 20 7d 65   zRoot;.      }e
10770 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 6f  lse{.        pNo
10780 64 65 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 53  de = jsonLookupS
10790 74 65 70 28 26 70 2d 3e 73 50 61 72 73 65 2c 20  tep(&p->sParse, 
107a0 30 2c 20 70 2d 3e 7a 52 6f 6f 74 2b 31 2c 20 30  0, p->zRoot+1, 0
107b0 2c 20 26 7a 45 72 72 29 3b 0a 20 20 20 20 20 20  , &zErr);.      
107c0 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 45 72 72  }.      if( zErr
107d0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
107e0 74 65 33 5f 66 72 65 65 28 63 75 72 2d 3e 70 56  te3_free(cur->pV
107f0 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  tab->zErrMsg);. 
10800 20 20 20 20 20 20 20 63 75 72 2d 3e 70 56 74 61         cur->pVta
10810 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 6a 73 6f  b->zErrMsg = jso
10820 6e 50 61 74 68 53 79 6e 74 61 78 45 72 72 6f 72  nPathSyntaxError
10830 28 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 20 20  (zErr);.        
10840 6a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 52 65  jsonEachCursorRe
10850 73 65 74 28 70 29 3b 0a 20 20 20 20 20 20 20 20  set(p);.        
10860 72 65 74 75 72 6e 20 63 75 72 2d 3e 70 56 74 61  return cur->pVta
10870 62 2d 3e 7a 45 72 72 4d 73 67 20 3f 20 53 51 4c  b->zErrMsg ? SQL
10880 49 54 45 5f 45 52 52 4f 52 20 3a 20 53 51 4c 49  ITE_ERROR : SQLI
10890 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
108a0 7d 65 6c 73 65 20 69 66 28 20 70 4e 6f 64 65 3d  }else if( pNode=
108b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
108c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
108d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
108e0 65 7b 0a 20 20 20 20 20 20 70 4e 6f 64 65 20 3d  e{.      pNode =
108f0 20 70 2d 3e 73 50 61 72 73 65 2e 61 4e 6f 64 65   p->sParse.aNode
10900 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69  ;.    }.    p->i
10910 42 65 67 69 6e 20 3d 20 70 2d 3e 69 20 3d 20 28  Begin = p->i = (
10920 69 6e 74 29 28 70 4e 6f 64 65 20 2d 20 70 2d 3e  int)(pNode - p->
10930 73 50 61 72 73 65 2e 61 4e 6f 64 65 29 3b 0a 20  sParse.aNode);. 
10940 20 20 20 70 2d 3e 65 54 79 70 65 20 3d 20 70 4e     p->eType = pN
10950 6f 64 65 2d 3e 65 54 79 70 65 3b 0a 20 20 20 20  ode->eType;.    
10960 69 66 28 20 70 2d 3e 65 54 79 70 65 3e 3d 4a 53  if( p->eType>=JS
10970 4f 4e 5f 41 52 52 41 59 20 29 7b 0a 20 20 20 20  ON_ARRAY ){.    
10980 20 20 70 4e 6f 64 65 2d 3e 75 2e 69 4b 65 79 20    pNode->u.iKey 
10990 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 45  = 0;.      p->iE
109a0 6e 64 20 3d 20 70 2d 3e 69 20 2b 20 70 4e 6f 64  nd = p->i + pNod
109b0 65 2d 3e 6e 20 2b 20 31 3b 0a 20 20 20 20 20 20  e->n + 1;.      
109c0 69 66 28 20 70 2d 3e 62 52 65 63 75 72 73 69 76  if( p->bRecursiv
109d0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  e ){.        p->
109e0 65 54 79 70 65 20 3d 20 70 2d 3e 73 50 61 72 73  eType = p->sPars
109f0 65 2e 61 4e 6f 64 65 5b 70 2d 3e 73 50 61 72 73  e.aNode[p->sPars
10a00 65 2e 61 55 70 5b 70 2d 3e 69 5d 5d 2e 65 54 79  e.aUp[p->i]].eTy
10a10 70 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  pe;.        if( 
10a20 70 2d 3e 69 3e 30 20 26 26 20 28 70 2d 3e 73 50  p->i>0 && (p->sP
10a30 61 72 73 65 2e 61 4e 6f 64 65 5b 70 2d 3e 69 2d  arse.aNode[p->i-
10a40 31 5d 2e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f  1].jnFlags & JNO
10a50 44 45 5f 4c 41 42 45 4c 29 21 3d 30 20 29 7b 0a  DE_LABEL)!=0 ){.
10a60 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 2d 2d            p->i--
10a70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10a80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10a90 20 70 2d 3e 69 2b 2b 3b 0a 20 20 20 20 20 20 7d   p->i++;.      }
10aa0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10ab0 20 20 70 2d 3e 69 45 6e 64 20 3d 20 70 2d 3e 69    p->iEnd = p->i
10ac0 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  +1;.    }.  }.  
10ad0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10ae0 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 6d 65 74 68  ;.}../* The meth
10af0 6f 64 73 20 6f 66 20 74 68 65 20 6a 73 6f 6e 5f  ods of the json_
10b00 65 61 63 68 20 76 69 72 74 75 61 6c 20 74 61 62  each virtual tab
10b10 6c 65 20 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c  le */.static sql
10b20 69 74 65 33 5f 6d 6f 64 75 6c 65 20 6a 73 6f 6e  ite3_module json
10b30 45 61 63 68 4d 6f 64 75 6c 65 20 3d 20 7b 0a 20  EachModule = {. 
10b40 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
10b50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
10b60 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20  Version */.  0, 
10b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b80 20 20 20 20 20 20 20 20 2f 2a 20 78 43 72 65 61          /* xCrea
10b90 74 65 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68  te */.  jsonEach
10ba0 43 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20  Connect,        
10bb0 20 20 20 2f 2a 20 78 43 6f 6e 6e 65 63 74 20 2a     /* xConnect *
10bc0 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 42 65 73 74  /.  jsonEachBest
10bd0 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 2f  Index,         /
10be0 2a 20 78 42 65 73 74 49 6e 64 65 78 20 2a 2f 0a  * xBestIndex */.
10bf0 20 20 6a 73 6f 6e 45 61 63 68 44 69 73 63 6f 6e    jsonEachDiscon
10c00 6e 65 63 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  nect,        /* 
10c10 78 44 69 73 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20  xDisconnect */. 
10c20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
10c30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
10c40 44 65 73 74 72 6f 79 20 2a 2f 0a 20 20 6a 73 6f  Destroy */.  jso
10c50 6e 45 61 63 68 4f 70 65 6e 45 61 63 68 2c 20 20  nEachOpenEach,  
10c60 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e          /* xOpen
10c70 20 2d 20 6f 70 65 6e 20 61 20 63 75 72 73 6f 72   - open a cursor
10c80 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 43 6c   */.  jsonEachCl
10c90 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
10ca0 20 2f 2a 20 78 43 6c 6f 73 65 20 2d 20 63 6c 6f   /* xClose - clo
10cb0 73 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20  se a cursor */. 
10cc0 20 6a 73 6f 6e 45 61 63 68 46 69 6c 74 65 72 2c   jsonEachFilter,
10cd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
10ce0 46 69 6c 74 65 72 20 2d 20 63 6f 6e 66 69 67 75  Filter - configu
10cf0 72 65 20 73 63 61 6e 20 63 6f 6e 73 74 72 61 69  re scan constrai
10d00 6e 74 73 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63  nts */.  jsonEac
10d10 68 4e 65 78 74 2c 20 20 20 20 20 20 20 20 20 20  hNext,          
10d20 20 20 20 20 2f 2a 20 78 4e 65 78 74 20 2d 20 61      /* xNext - a
10d30 64 76 61 6e 63 65 20 61 20 63 75 72 73 6f 72 20  dvance a cursor 
10d40 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 45 6f 66  */.  jsonEachEof
10d50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10d60 2f 2a 20 78 45 6f 66 20 2d 20 63 68 65 63 6b 20  /* xEof - check 
10d70 66 6f 72 20 65 6e 64 20 6f 66 20 73 63 61 6e 20  for end of scan 
10d80 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 43 6f 6c  */.  jsonEachCol
10d90 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  umn,            
10da0 2f 2a 20 78 43 6f 6c 75 6d 6e 20 2d 20 72 65 61  /* xColumn - rea
10db0 64 20 64 61 74 61 20 2a 2f 0a 20 20 6a 73 6f 6e  d data */.  json
10dc0 45 61 63 68 52 6f 77 69 64 2c 20 20 20 20 20 20  EachRowid,      
10dd0 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 77 69 64         /* xRowid
10de0 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f 0a   - read data */.
10df0 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
10e00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10e10 78 55 70 64 61 74 65 20 2a 2f 0a 20 20 30 2c 20  xUpdate */.  0, 
10e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e30 20 20 20 20 20 20 20 20 2f 2a 20 78 42 65 67 69          /* xBegi
10e40 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  n */.  0,       
10e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e60 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20    /* xSync */.  
10e70 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
10e80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
10e90 6f 6d 6d 69 74 20 2a 2f 0a 20 20 30 2c 20 20 20  ommit */.  0,   
10ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10eb0 20 20 20 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61        /* xRollba
10ec0 63 6b 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  ck */.  0,      
10ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ee0 20 20 20 2f 2a 20 78 46 69 6e 64 4d 65 74 68 6f     /* xFindMetho
10ef0 64 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  d */.  0,       
10f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f10 20 20 2f 2a 20 78 52 65 6e 61 6d 65 20 2a 2f 0a    /* xRename */.
10f20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
10f30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10f40 78 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20  xSavepoint */.  
10f50 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
10f60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
10f70 65 6c 65 61 73 65 20 2a 2f 0a 20 20 30 2c 20 20  elease */.  0,  
10f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f90 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 6c 6c 62         /* xRollb
10fa0 61 63 6b 54 6f 20 2a 2f 0a 20 20 30 20 20 20 20  ackTo */.  0    
10fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fc0 20 20 20 20 20 20 2f 2a 20 78 53 68 61 64 6f 77        /* xShadow
10fd0 4e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54  Name */.};../* T
10fe0 68 65 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68  he methods of th
10ff0 65 20 6a 73 6f 6e 5f 74 72 65 65 20 76 69 72 74  e json_tree virt
11000 75 61 6c 20 74 61 62 6c 65 2e 20 2a 2f 0a 73 74  ual table. */.st
11010 61 74 69 63 20 73 71 6c 69 74 65 33 5f 6d 6f 64  atic sqlite3_mod
11020 75 6c 65 20 6a 73 6f 6e 54 72 65 65 4d 6f 64 75  ule jsonTreeModu
11030 6c 65 20 3d 20 7b 0a 20 20 30 2c 20 20 20 20 20  le = {.  0,     
11040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11050 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
11060 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
11070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11080 2f 2a 20 78 43 72 65 61 74 65 20 2a 2f 0a 20 20  /* xCreate */.  
11090 6a 73 6f 6e 45 61 63 68 43 6f 6e 6e 65 63 74 2c  jsonEachConnect,
110a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
110b0 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 6a 73 6f 6e  onnect */.  json
110c0 45 61 63 68 42 65 73 74 49 6e 64 65 78 2c 20 20  EachBestIndex,  
110d0 20 20 20 20 20 20 20 2f 2a 20 78 42 65 73 74 49         /* xBestI
110e0 6e 64 65 78 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61  ndex */.  jsonEa
110f0 63 68 44 69 73 63 6f 6e 6e 65 63 74 2c 20 20 20  chDisconnect,   
11100 20 20 20 20 20 2f 2a 20 78 44 69 73 63 6f 6e 6e       /* xDisconn
11110 65 63 74 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  ect */.  0,     
11120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11130 20 20 20 20 2f 2a 20 78 44 65 73 74 72 6f 79 20      /* xDestroy 
11140 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 4f 70 65  */.  jsonEachOpe
11150 6e 54 72 65 65 2c 20 20 20 20 20 20 20 20 20 20  nTree,          
11160 2f 2a 20 78 4f 70 65 6e 20 2d 20 6f 70 65 6e 20  /* xOpen - open 
11170 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 6a 73  a cursor */.  js
11180 6f 6e 45 61 63 68 43 6c 6f 73 65 2c 20 20 20 20  onEachClose,    
11190 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
111a0 73 65 20 2d 20 63 6c 6f 73 65 20 61 20 63 75 72  se - close a cur
111b0 73 6f 72 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63  sor */.  jsonEac
111c0 68 46 69 6c 74 65 72 2c 20 20 20 20 20 20 20 20  hFilter,        
111d0 20 20 20 20 2f 2a 20 78 46 69 6c 74 65 72 20 2d      /* xFilter -
111e0 20 63 6f 6e 66 69 67 75 72 65 20 73 63 61 6e 20   configure scan 
111f0 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
11200 20 6a 73 6f 6e 45 61 63 68 4e 65 78 74 2c 20 20   jsonEachNext,  
11210 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
11220 4e 65 78 74 20 2d 20 61 64 76 61 6e 63 65 20 61  Next - advance a
11230 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 6a 73 6f   cursor */.  jso
11240 6e 45 61 63 68 45 6f 66 2c 20 20 20 20 20 20 20  nEachEof,       
11250 20 20 20 20 20 20 20 20 2f 2a 20 78 45 6f 66 20          /* xEof 
11260 2d 20 63 68 65 63 6b 20 66 6f 72 20 65 6e 64 20  - check for end 
11270 6f 66 20 73 63 61 6e 20 2a 2f 0a 20 20 6a 73 6f  of scan */.  jso
11280 6e 45 61 63 68 43 6f 6c 75 6d 6e 2c 20 20 20 20  nEachColumn,    
11290 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6c 75          /* xColu
112a0 6d 6e 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a  mn - read data *
112b0 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 52 6f 77 69  /.  jsonEachRowi
112c0 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  d,             /
112d0 2a 20 78 52 6f 77 69 64 20 2d 20 72 65 61 64 20  * xRowid - read 
112e0 64 61 74 61 20 2a 2f 0a 20 20 30 2c 20 20 20 20  data */.  0,    
112f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11300 20 20 20 20 20 2f 2a 20 78 55 70 64 61 74 65 20       /* xUpdate 
11310 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
11320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11330 2f 2a 20 78 42 65 67 69 6e 20 2a 2f 0a 20 20 30  /* xBegin */.  0
11340 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11350 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79            /* xSy
11360 6e 63 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  nc */.  0,      
11370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11380 20 20 20 2f 2a 20 78 43 6f 6d 6d 69 74 20 2a 2f     /* xCommit */
11390 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
113a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
113b0 20 78 52 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20   xRollback */.  
113c0 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
113d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
113e0 69 6e 64 4d 65 74 68 6f 64 20 2a 2f 0a 20 20 30  indMethod */.  0
113f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11400 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65            /* xRe
11410 6e 61 6d 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20  name */.  0,    
11420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11430 20 20 20 20 20 2f 2a 20 78 53 61 76 65 70 6f 69       /* xSavepoi
11440 6e 74 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  nt */.  0,      
11450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11460 20 20 20 2f 2a 20 78 52 65 6c 65 61 73 65 20 2a     /* xRelease *
11470 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
11480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11490 2a 20 78 52 6f 6c 6c 62 61 63 6b 54 6f 20 2a 2f  * xRollbackTo */
114a0 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20  .  0            
114b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
114c0 20 78 53 68 61 64 6f 77 4e 61 6d 65 20 2a 2f 0a   xShadowName */.
114d0 7d 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  };.#endif /* SQL
114e0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
114f0 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  TABLE */../*****
11500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11540 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 66  *******.** The f
11550 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
11560 73 20 61 72 65 20 74 68 65 20 6f 6e 6c 79 20 70  s are the only p
11570 75 62 6c 69 63 61 6c 6c 79 20 76 69 73 69 62 6c  ublically visibl
11580 65 20 69 64 65 6e 74 69 66 69 65 72 73 20 69 6e  e identifiers in
11590 20 74 68 69 73 0a 2a 2a 20 66 69 6c 65 2e 20 20   this.** file.  
115a0 43 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  Call the followi
115b0 6e 67 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 6f  ng routines in o
115c0 72 64 65 72 20 74 6f 20 72 65 67 69 73 74 65 72  rder to register
115d0 20 74 68 65 20 76 61 72 69 6f 75 73 20 53 51 4c   the various SQL
115e0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e  .** functions an
115f0 64 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  d the virtual ta
11600 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  ble implemented 
11610 62 79 20 74 68 69 73 20 66 69 6c 65 2e 0a 2a 2a  by this file..**
11620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 69 6e 74  **********/..int
11670 20 73 71 6c 69 74 65 33 4a 73 6f 6e 31 49 6e 69   sqlite3Json1Ini
11680 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
11690 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
116a0 45 5f 4f 4b 3b 0a 20 20 75 6e 73 69 67 6e 65 64  E_OK;.  unsigned
116b0 20 69 6e 74 20 69 3b 0a 20 20 73 74 61 74 69 63   int i;.  static
116c0 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a   const struct {.
116d0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
116e0 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 69 6e 74  *zName;.     int
116f0 20 6e 41 72 67 3b 0a 20 20 20 20 20 69 6e 74 20   nArg;.     int 
11700 66 6c 61 67 3b 0a 20 20 20 20 20 76 6f 69 64 20  flag;.     void 
11710 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33  (*xFunc)(sqlite3
11720 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
11730 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 3b 0a  lite3_value**);.
11740 20 20 7d 20 61 46 75 6e 63 5b 5d 20 3d 20 7b 0a    } aFunc[] = {.
11750 20 20 20 20 7b 20 22 6a 73 6f 6e 22 2c 20 20 20      { "json",   
11760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c                1,
11770 20 30 2c 20 20 20 6a 73 6f 6e 52 65 6d 6f 76 65   0,   jsonRemove
11780 46 75 6e 63 20 20 20 20 20 20 20 20 7d 2c 0a 20  Func        },. 
11790 20 20 20 7b 20 22 6a 73 6f 6e 5f 61 72 72 61 79     { "json_array
117a0 22 2c 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20  ",          -1, 
117b0 30 2c 20 20 20 6a 73 6f 6e 41 72 72 61 79 46 75  0,   jsonArrayFu
117c0 6e 63 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  nc         },.  
117d0 20 20 7b 20 22 6a 73 6f 6e 5f 61 72 72 61 79 5f    { "json_array_
117e0 6c 65 6e 67 74 68 22 2c 20 20 20 20 31 2c 20 30  length",    1, 0
117f0 2c 20 20 20 6a 73 6f 6e 41 72 72 61 79 4c 65 6e  ,   jsonArrayLen
11800 67 74 68 46 75 6e 63 20 20 20 7d 2c 0a 20 20 20  gthFunc   },.   
11810 20 7b 20 22 6a 73 6f 6e 5f 61 72 72 61 79 5f 6c   { "json_array_l
11820 65 6e 67 74 68 22 2c 20 20 20 20 32 2c 20 30 2c  ength",    2, 0,
11830 20 20 20 6a 73 6f 6e 41 72 72 61 79 4c 65 6e 67     jsonArrayLeng
11840 74 68 46 75 6e 63 20 20 20 7d 2c 0a 20 20 20 20  thFunc   },.    
11850 7b 20 22 6a 73 6f 6e 5f 65 78 74 72 61 63 74 22  { "json_extract"
11860 2c 20 20 20 20 20 20 20 20 2d 31 2c 20 30 2c 20  ,        -1, 0, 
11870 20 20 6a 73 6f 6e 45 78 74 72 61 63 74 46 75 6e    jsonExtractFun
11880 63 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b  c       },.    {
11890 20 22 6a 73 6f 6e 5f 69 6e 73 65 72 74 22 2c 20   "json_insert", 
118a0 20 20 20 20 20 20 20 20 2d 31 2c 20 30 2c 20 20          -1, 0,  
118b0 20 6a 73 6f 6e 53 65 74 46 75 6e 63 20 20 20 20   jsonSetFunc    
118c0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
118d0 22 6a 73 6f 6e 5f 6f 62 6a 65 63 74 22 2c 20 20  "json_object",  
118e0 20 20 20 20 20 20 20 2d 31 2c 20 30 2c 20 20 20         -1, 0,   
118f0 6a 73 6f 6e 4f 62 6a 65 63 74 46 75 6e 63 20 20  jsonObjectFunc  
11900 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
11910 6a 73 6f 6e 5f 70 61 74 63 68 22 2c 20 20 20 20  json_patch",    
11920 20 20 20 20 20 20 20 32 2c 20 30 2c 20 20 20 6a         2, 0,   j
11930 73 6f 6e 50 61 74 63 68 46 75 6e 63 20 20 20 20  sonPatchFunc    
11940 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a       },.    { "j
11950 73 6f 6e 5f 71 75 6f 74 65 22 2c 20 20 20 20 20  son_quote",     
11960 20 20 20 20 20 20 31 2c 20 30 2c 20 20 20 6a 73        1, 0,   js
11970 6f 6e 51 75 6f 74 65 46 75 6e 63 20 20 20 20 20  onQuoteFunc     
11980 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73      },.    { "js
11990 6f 6e 5f 72 65 6d 6f 76 65 22 2c 20 20 20 20 20  on_remove",     
119a0 20 20 20 20 2d 31 2c 20 30 2c 20 20 20 6a 73 6f      -1, 0,   jso
119b0 6e 52 65 6d 6f 76 65 46 75 6e 63 20 20 20 20 20  nRemoveFunc     
119c0 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f     },.    { "jso
119d0 6e 5f 72 65 70 6c 61 63 65 22 2c 20 20 20 20 20  n_replace",     
119e0 20 20 20 2d 31 2c 20 30 2c 20 20 20 6a 73 6f 6e     -1, 0,   json
119f0 52 65 70 6c 61 63 65 46 75 6e 63 20 20 20 20 20  ReplaceFunc     
11a00 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e    },.    { "json
11a10 5f 73 65 74 22 2c 20 20 20 20 20 20 20 20 20 20  _set",          
11a20 20 20 2d 31 2c 20 31 2c 20 20 20 6a 73 6f 6e 53    -1, 1,   jsonS
11a30 65 74 46 75 6e 63 20 20 20 20 20 20 20 20 20 20  etFunc          
11a40 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f   },.    { "json_
11a50 74 79 70 65 22 2c 20 20 20 20 20 20 20 20 20 20  type",          
11a60 20 20 31 2c 20 30 2c 20 20 20 6a 73 6f 6e 54 79    1, 0,   jsonTy
11a70 70 65 46 75 6e 63 20 20 20 20 20 20 20 20 20 20  peFunc          
11a80 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 74  },.    { "json_t
11a90 79 70 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ype",           
11aa0 20 32 2c 20 30 2c 20 20 20 6a 73 6f 6e 54 79 70   2, 0,   jsonTyp
11ab0 65 46 75 6e 63 20 20 20 20 20 20 20 20 20 20 7d  eFunc          }
11ac0 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 76 61  ,.    { "json_va
11ad0 6c 69 64 22 2c 20 20 20 20 20 20 20 20 20 20 20  lid",           
11ae0 31 2c 20 30 2c 20 20 20 6a 73 6f 6e 56 61 6c 69  1, 0,   jsonVali
11af0 64 46 75 6e 63 20 20 20 20 20 20 20 20 20 7d 2c  dFunc         },
11b00 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42  ..#if SQLITE_DEB
11b10 55 47 0a 20 20 20 20 2f 2a 20 44 45 42 55 47 20  UG.    /* DEBUG 
11b20 61 6e 64 20 54 45 53 54 49 4e 47 20 66 75 6e 63  and TESTING func
11b30 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 7b 20 22  tions */.    { "
11b40 6a 73 6f 6e 5f 70 61 72 73 65 22 2c 20 20 20 20  json_parse",    
11b50 20 20 20 20 20 20 20 31 2c 20 30 2c 20 20 20 6a         1, 0,   j
11b60 73 6f 6e 50 61 72 73 65 46 75 6e 63 20 20 20 20  sonParseFunc    
11b70 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a       },.    { "j
11b80 73 6f 6e 5f 74 65 73 74 31 22 2c 20 20 20 20 20  son_test1",     
11b90 20 20 20 20 20 20 31 2c 20 30 2c 20 20 20 6a 73        1, 0,   js
11ba0 6f 6e 54 65 73 74 31 46 75 6e 63 20 20 20 20 20  onTest1Func     
11bb0 20 20 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20      },.#endif.  
11bc0 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  };.  static cons
11bd0 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20  t struct {.     
11be0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
11bf0 65 3b 0a 20 20 20 20 20 69 6e 74 20 6e 41 72 67  e;.     int nArg
11c00 3b 0a 20 20 20 20 20 76 6f 69 64 20 28 2a 78 53  ;.     void (*xS
11c10 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  tep)(sqlite3_con
11c20 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
11c30 33 5f 76 61 6c 75 65 2a 2a 29 3b 0a 20 20 20 20  3_value**);.    
11c40 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28   void (*xFinal)(
11c50 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
11c60 29 3b 0a 20 20 20 20 20 76 6f 69 64 20 28 2a 78  );.     void (*x
11c70 56 61 6c 75 65 29 28 73 71 6c 69 74 65 33 5f 63  Value)(sqlite3_c
11c80 6f 6e 74 65 78 74 2a 29 3b 0a 20 20 7d 20 61 41  ontext*);.  } aA
11c90 67 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22  gg[] = {.    { "
11ca0 6a 73 6f 6e 5f 67 72 6f 75 70 5f 61 72 72 61 79  json_group_array
11cb0 22 2c 20 20 20 20 20 31 2c 0a 20 20 20 20 20 20  ",     1,.      
11cc0 6a 73 6f 6e 41 72 72 61 79 53 74 65 70 2c 20 20  jsonArrayStep,  
11cd0 20 6a 73 6f 6e 41 72 72 61 79 46 69 6e 61 6c 2c   jsonArrayFinal,
11ce0 20 20 6a 73 6f 6e 41 72 72 61 79 56 61 6c 75 65    jsonArrayValue
11cf0 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e    },.    { "json
11d00 5f 67 72 6f 75 70 5f 6f 62 6a 65 63 74 22 2c 20  _group_object", 
11d10 20 20 20 32 2c 0a 20 20 20 20 20 20 6a 73 6f 6e     2,.      json
11d20 4f 62 6a 65 63 74 53 74 65 70 2c 20 20 6a 73 6f  ObjectStep,  jso
11d30 6e 4f 62 6a 65 63 74 46 69 6e 61 6c 2c 20 6a 73  nObjectFinal, js
11d40 6f 6e 4f 62 6a 65 63 74 56 61 6c 75 65 20 7d 2c  onObjectValue },
11d50 0a 20 20 7d 3b 0a 23 69 66 6e 64 65 66 20 53 51  .  };.#ifndef SQ
11d60 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
11d70 4c 54 41 42 4c 45 0a 20 20 73 74 61 74 69 63 20  LTABLE.  static 
11d80 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20  const struct {. 
11d90 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
11da0 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 73 71 6c 69  zName;.     sqli
11db0 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64  te3_module *pMod
11dc0 75 6c 65 3b 0a 20 20 7d 20 61 4d 6f 64 5b 5d 20  ule;.  } aMod[] 
11dd0 3d 20 7b 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f  = {.    { "json_
11de0 65 61 63 68 22 2c 20 20 20 20 20 20 20 20 20 20  each",          
11df0 20 20 26 6a 73 6f 6e 45 61 63 68 4d 6f 64 75 6c    &jsonEachModul
11e00 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
11e10 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 74  },.    { "json_t
11e20 72 65 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ree",           
11e30 20 26 6a 73 6f 6e 54 72 65 65 4d 6f 64 75 6c 65   &jsonTreeModule
11e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
11e50 2c 0a 20 20 7d 3b 0a 23 65 6e 64 69 66 0a 20 20  ,.  };.#endif.  
11e60 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
11e70 66 28 61 46 75 6e 63 29 2f 73 69 7a 65 6f 66 28  f(aFunc)/sizeof(
11e80 61 46 75 6e 63 5b 30 5d 29 20 26 26 20 72 63 3d  aFunc[0]) && rc=
11e90 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29  =SQLITE_OK; i++)
11ea0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
11eb0 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
11ec0 6f 6e 28 64 62 2c 20 61 46 75 6e 63 5b 69 5d 2e  on(db, aFunc[i].
11ed0 7a 4e 61 6d 65 2c 20 61 46 75 6e 63 5b 69 5d 2e  zName, aFunc[i].
11ee0 6e 41 72 67 2c 0a 20 20 20 20 20 20 20 20 20 20  nArg,.          
11ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f00 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54         SQLITE_UT
11f10 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45  F8 | SQLITE_DETE
11f20 52 4d 49 4e 49 53 54 49 43 2c 20 0a 20 20 20 20  RMINISTIC, .    
11f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f40 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
11f50 69 64 2a 29 26 61 46 75 6e 63 5b 69 5d 2e 66 6c  id*)&aFunc[i].fl
11f60 61 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ag,.            
11f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f80 20 20 20 20 20 61 46 75 6e 63 5b 69 5d 2e 78 46       aFunc[i].xF
11f90 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  unc, 0, 0);.  }.
11fa0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11fb0 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20  MIT_WINDOWFUNC. 
11fc0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
11fd0 6f 66 28 61 41 67 67 29 2f 73 69 7a 65 6f 66 28  of(aAgg)/sizeof(
11fe0 61 41 67 67 5b 30 5d 29 20 26 26 20 72 63 3d 3d  aAgg[0]) && rc==
11ff0 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b  SQLITE_OK; i++){
12000 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
12010 33 5f 63 72 65 61 74 65 5f 77 69 6e 64 6f 77 5f  3_create_window_
12020 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 61 41 67  function(db, aAg
12030 67 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 61 41 67 67  g[i].zName, aAgg
12040 5b 69 5d 2e 6e 41 72 67 2c 0a 20 20 20 20 20 20  [i].nArg,.      
12050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12060 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
12070 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
12080 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30  DETERMINISTIC, 0
12090 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
120a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120b0 20 20 20 61 41 67 67 5b 69 5d 2e 78 53 74 65 70     aAgg[i].xStep
120c0 2c 20 61 41 67 67 5b 69 5d 2e 78 46 69 6e 61 6c  , aAgg[i].xFinal
120d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
120e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120f0 20 20 20 61 41 67 67 5b 69 5d 2e 78 56 61 6c 75     aAgg[i].xValu
12100 65 2c 20 6a 73 6f 6e 47 72 6f 75 70 49 6e 76 65  e, jsonGroupInve
12110 72 73 65 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  rse, 0);.  }.#en
12120 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
12130 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
12140 41 42 4c 45 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ABLE.  for(i=0; 
12150 69 3c 73 69 7a 65 6f 66 28 61 4d 6f 64 29 2f 73  i<sizeof(aMod)/s
12160 69 7a 65 6f 66 28 61 4d 6f 64 5b 30 5d 29 20 26  izeof(aMod[0]) &
12170 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
12180 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20   i++){.    rc = 
12190 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 6d  sqlite3_create_m
121a0 6f 64 75 6c 65 28 64 62 2c 20 61 4d 6f 64 5b 69  odule(db, aMod[i
121b0 5d 2e 7a 4e 61 6d 65 2c 20 61 4d 6f 64 5b 69 5d  ].zName, aMod[i]
121c0 2e 70 4d 6f 64 75 6c 65 2c 20 30 29 3b 0a 20 20  .pModule, 0);.  
121d0 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
121e0 6e 20 72 63 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65  n rc;.}...#ifnde
121f0 66 20 53 51 4c 49 54 45 5f 43 4f 52 45 0a 23 69  f SQLITE_CORE.#i
12200 66 64 65 66 20 5f 57 49 4e 33 32 0a 5f 5f 64 65  fdef _WIN32.__de
12210 63 6c 73 70 65 63 28 64 6c 6c 65 78 70 6f 72 74  clspec(dllexport
12220 29 0a 23 65 6e 64 69 66 0a 69 6e 74 20 73 71 6c  ).#endif.int sql
12230 69 74 65 33 5f 6a 73 6f 6e 5f 69 6e 69 74 28 0a  ite3_json_init(.
12240 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a    sqlite3 *db, .
12250 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73    char **pzErrMs
12260 67 2c 20 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69  g, .  const sqli
12270 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73  te3_api_routines
12280 20 2a 70 41 70 69 0a 29 7b 0a 20 20 53 51 4c 49   *pApi.){.  SQLI
12290 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49  TE_EXTENSION_INI
122a0 54 32 28 70 41 70 69 29 3b 0a 20 20 28 76 6f 69  T2(pApi);.  (voi
122b0 64 29 70 7a 45 72 72 4d 73 67 3b 20 20 2f 2a 20  d)pzErrMsg;  /* 
122c0 55 6e 75 73 65 64 20 70 61 72 61 6d 65 74 65 72  Unused parameter
122d0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   */.  return sql
122e0 69 74 65 33 4a 73 6f 6e 31 49 6e 69 74 28 64 62  ite3Json1Init(db
122f0 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64  );.}.#endif.#end
12300 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
12310 51 4c 49 54 45 5f 43 4f 52 45 29 20 7c 7c 20 64  QLITE_CORE) || d
12320 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
12330 41 42 4c 45 5f 4a 53 4f 4e 31 29 20 2a 2f 0a     ABLE_JSON1) */.