System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact ac42c047834f413589768ac85faa8f0d5908eaee:


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 28 70 50 61  ite3_realloc(pPa
52d0: 72 73 65 2d 3e 61 4e 6f 64 65 2c 20 73 69 7a 65  rse->aNode, size
52e0: 6f 66 28 4a 73 6f 6e 4e 6f 64 65 29 2a 6e 4e 65  of(JsonNode)*nNe
52f0: 77 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d  w);.  if( pNew==
5300: 30 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  0 ){.    pParse-
5310: 3e 6f 6f 6d 20 3d 20 31 3b 0a 20 20 20 20 72 65  >oom = 1;.    re
5320: 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 70  turn -1;.  }.  p
5330: 50 61 72 73 65 2d 3e 6e 41 6c 6c 6f 63 20 3d 20  Parse->nAlloc = 
5340: 6e 4e 65 77 3b 0a 20 20 70 50 61 72 73 65 2d 3e  nNew;.  pParse->
5350: 61 4e 6f 64 65 20 3d 20 70 4e 65 77 3b 0a 20 20  aNode = pNew;.  
5360: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
5370: 6e 4e 6f 64 65 3c 70 50 61 72 73 65 2d 3e 6e 41  nNode<pParse->nA
5380: 6c 6c 6f 63 20 29 3b 0a 20 20 72 65 74 75 72 6e  lloc );.  return
5390: 20 6a 73 6f 6e 50 61 72 73 65 41 64 64 4e 6f 64   jsonParseAddNod
53a0: 65 28 70 50 61 72 73 65 2c 20 65 54 79 70 65 2c  e(pParse, eType,
53b0: 20 6e 2c 20 7a 43 6f 6e 74 65 6e 74 29 3b 0a 7d   n, zContent);.}
53c0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
53d0: 20 6e 65 77 20 4a 73 6f 6e 4e 6f 64 65 20 69 6e   new JsonNode in
53e0: 73 74 61 6e 63 65 20 62 61 73 65 64 20 6f 6e 20  stance based on 
53f0: 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 61 6e  the arguments an
5400: 64 20 61 70 70 65 6e 64 20 74 68 61 74 0a 2a 2a  d append that.**
5410: 20 69 6e 73 74 61 6e 63 65 20 74 6f 20 74 68 65   instance to the
5420: 20 4a 73 6f 6e 50 61 72 73 65 2e 20 20 52 65 74   JsonParse.  Ret
5430: 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e  urn the index in
5440: 20 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65 5b 5d   pParse->aNode[]
5450: 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20 6e   of the.** new n
5460: 6f 64 65 2c 20 6f 72 20 2d 31 20 69 66 20 61 20  ode, or -1 if a 
5470: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
5480: 6e 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  n fails..*/.stat
5490: 69 63 20 69 6e 74 20 6a 73 6f 6e 50 61 72 73 65  ic int jsonParse
54a0: 41 64 64 4e 6f 64 65 28 0a 20 20 4a 73 6f 6e 50  AddNode(.  JsonP
54b0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
54c0: 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74       /* Append t
54d0: 68 65 20 6e 6f 64 65 20 74 6f 20 74 68 69 73 20  he node to this 
54e0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 33 32 20  object */.  u32 
54f0: 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  eType,          
5500: 20 20 20 20 20 20 2f 2a 20 4e 6f 64 65 20 74 79        /* Node ty
5510: 70 65 20 2a 2f 0a 20 20 75 33 32 20 6e 2c 20 20  pe */.  u32 n,  
5520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5530: 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 73 69 7a    /* Content siz
5540: 65 20 6f 72 20 73 75 62 2d 6e 6f 64 65 20 63 6f  e or sub-node co
5550: 75 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  unt */.  const c
5560: 68 61 72 20 2a 7a 43 6f 6e 74 65 6e 74 20 20 20  har *zContent   
5570: 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 2a 2f     /* Content */
5580: 0a 29 7b 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a  .){.  JsonNode *
5590: 70 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  p;.  if( pParse-
55a0: 3e 6e 4e 6f 64 65 3e 3d 70 50 61 72 73 65 2d 3e  >nNode>=pParse->
55b0: 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 72 65  nAlloc ){.    re
55c0: 74 75 72 6e 20 6a 73 6f 6e 50 61 72 73 65 41 64  turn jsonParseAd
55d0: 64 4e 6f 64 65 45 78 70 61 6e 64 28 70 50 61 72  dNodeExpand(pPar
55e0: 73 65 2c 20 65 54 79 70 65 2c 20 6e 2c 20 7a 43  se, eType, n, zC
55f0: 6f 6e 74 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 70  ontent);.  }.  p
5600: 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 4e 6f 64   = &pParse->aNod
5610: 65 5b 70 50 61 72 73 65 2d 3e 6e 4e 6f 64 65 5d  e[pParse->nNode]
5620: 3b 0a 20 20 70 2d 3e 65 54 79 70 65 20 3d 20 28  ;.  p->eType = (
5630: 75 38 29 65 54 79 70 65 3b 0a 20 20 70 2d 3e 6a  u8)eType;.  p->j
5640: 6e 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70 2d  nFlags = 0;.  p-
5650: 3e 6e 20 3d 20 6e 3b 0a 20 20 70 2d 3e 75 2e 7a  >n = n;.  p->u.z
5660: 4a 43 6f 6e 74 65 6e 74 20 3d 20 7a 43 6f 6e 74  JContent = zCont
5670: 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  ent;.  return pP
5680: 61 72 73 65 2d 3e 6e 4e 6f 64 65 2b 2b 3b 0a 7d  arse->nNode++;.}
5690: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
56a0: 72 75 65 20 69 66 20 7a 5b 5d 20 62 65 67 69 6e  rue if z[] begin
56b0: 73 20 77 69 74 68 20 34 20 28 6f 72 20 6d 6f 72  s with 4 (or mor
56c0: 65 29 20 68 65 78 61 64 65 63 69 6d 61 6c 20 64  e) hexadecimal d
56d0: 69 67 69 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20  igits.*/.static 
56e0: 69 6e 74 20 6a 73 6f 6e 49 73 34 48 65 78 28 63  int jsonIs4Hex(c
56f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
5700: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
5710: 30 3b 20 69 3c 34 3b 20 69 2b 2b 29 20 69 66 28  0; i<4; i++) if(
5720: 20 21 73 61 66 65 5f 69 73 78 64 69 67 69 74 28   !safe_isxdigit(
5730: 7a 5b 69 5d 29 20 29 20 72 65 74 75 72 6e 20 30  z[i]) ) return 0
5740: 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
5750: 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 73  ./*.** Parse a s
5760: 69 6e 67 6c 65 20 4a 53 4f 4e 20 76 61 6c 75 65  ingle JSON value
5770: 20 77 68 69 63 68 20 62 65 67 69 6e 73 20 61 74   which begins at
5780: 20 70 50 61 72 73 65 2d 3e 7a 4a 73 6f 6e 5b 69   pParse->zJson[i
5790: 5d 2e 20 20 52 65 74 75 72 6e 20 74 68 65 0a 2a  ].  Return the.*
57a0: 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 66  * index of the f
57b0: 69 72 73 74 20 63 68 61 72 61 63 74 65 72 20 70  irst character p
57c0: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
57d0: 68 65 20 76 61 6c 75 65 20 70 61 72 73 65 64 2e  he value parsed.
57e0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 65  .**.** Return ne
57f0: 67 61 74 69 76 65 20 66 6f 72 20 61 20 73 79 6e  gative for a syn
5800: 74 61 78 20 65 72 72 6f 72 2e 20 20 53 70 65 63  tax error.  Spec
5810: 69 61 6c 20 63 61 73 65 73 3a 20 20 72 65 74 75  ial cases:  retu
5820: 72 6e 20 2d 32 20 69 66 20 74 68 65 0a 2a 2a 20  rn -2 if the.** 
5830: 66 69 72 73 74 20 6e 6f 6e 2d 77 68 69 74 65 73  first non-whites
5840: 70 61 63 65 20 63 68 61 72 61 63 74 65 72 20 69  pace character i
5850: 73 20 27 7d 27 20 61 6e 64 20 72 65 74 75 72 6e  s '}' and return
5860: 20 2d 33 20 69 66 20 74 68 65 20 66 69 72 73 74   -3 if the first
5870: 0a 2a 2a 20 6e 6f 6e 2d 77 68 69 74 65 73 70 61  .** non-whitespa
5880: 63 65 20 63 68 61 72 61 63 74 65 72 20 69 73 20  ce character is 
5890: 27 5d 27 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ']'..*/.static i
58a0: 6e 74 20 6a 73 6f 6e 50 61 72 73 65 56 61 6c 75  nt jsonParseValu
58b0: 65 28 4a 73 6f 6e 50 61 72 73 65 20 2a 70 50 61  e(JsonParse *pPa
58c0: 72 73 65 2c 20 75 33 32 20 69 29 7b 0a 20 20 63  rse, u32 i){.  c
58d0: 68 61 72 20 63 3b 0a 20 20 75 33 32 20 6a 3b 0a  har c;.  u32 j;.
58e0: 20 20 69 6e 74 20 69 54 68 69 73 3b 0a 20 20 69    int iThis;.  i
58f0: 6e 74 20 78 3b 0a 20 20 4a 73 6f 6e 4e 6f 64 65  nt x;.  JsonNode
5900: 20 2a 70 4e 6f 64 65 3b 0a 20 20 63 6f 6e 73 74   *pNode;.  const
5910: 20 63 68 61 72 20 2a 7a 20 3d 20 70 50 61 72 73   char *z = pPars
5920: 65 2d 3e 7a 4a 73 6f 6e 3b 0a 20 20 77 68 69 6c  e->zJson;.  whil
5930: 65 28 20 73 61 66 65 5f 69 73 73 70 61 63 65 28  e( safe_isspace(
5940: 7a 5b 69 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d 0a  z[i]) ){ i++; }.
5950: 20 20 69 66 28 20 28 63 20 3d 20 7a 5b 69 5d 29    if( (c = z[i])
5960: 3d 3d 27 7b 27 20 29 7b 0a 20 20 20 20 2f 2a 20  =='{' ){.    /* 
5970: 50 61 72 73 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  Parse object */.
5980: 20 20 20 20 69 54 68 69 73 20 3d 20 6a 73 6f 6e      iThis = json
5990: 50 61 72 73 65 41 64 64 4e 6f 64 65 28 70 50 61  ParseAddNode(pPa
59a0: 72 73 65 2c 20 4a 53 4f 4e 5f 4f 42 4a 45 43 54  rse, JSON_OBJECT
59b0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
59c0: 20 69 54 68 69 73 3c 30 20 29 20 72 65 74 75 72   iThis<0 ) retur
59d0: 6e 20 2d 31 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  n -1;.    for(j=
59e0: 69 2b 31 3b 3b 6a 2b 2b 29 7b 0a 20 20 20 20 20  i+1;;j++){.     
59f0: 20 77 68 69 6c 65 28 20 73 61 66 65 5f 69 73 73   while( safe_iss
5a00: 70 61 63 65 28 7a 5b 6a 5d 29 20 29 7b 20 6a 2b  pace(z[j]) ){ j+
5a10: 2b 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20 2b  +; }.      if( +
5a20: 2b 70 50 61 72 73 65 2d 3e 69 44 65 70 74 68 20  +pParse->iDepth 
5a30: 3e 20 4a 53 4f 4e 5f 4d 41 58 5f 44 45 50 54 48  > JSON_MAX_DEPTH
5a40: 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
5a50: 20 20 20 20 78 20 3d 20 6a 73 6f 6e 50 61 72 73      x = jsonPars
5a60: 65 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 6a  eValue(pParse, j
5a70: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3c 30  );.      if( x<0
5a80: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72   ){.        pPar
5a90: 73 65 2d 3e 69 44 65 70 74 68 2d 2d 3b 0a 20 20  se->iDepth--;.  
5aa0: 20 20 20 20 20 20 69 66 28 20 78 3d 3d 28 2d 32        if( x==(-2
5ab0: 29 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 4e 6f  ) && pParse->nNo
5ac0: 64 65 3d 3d 28 75 33 32 29 69 54 68 69 73 2b 31  de==(u32)iThis+1
5ad0: 20 29 20 72 65 74 75 72 6e 20 6a 2b 31 3b 0a 20   ) return j+1;. 
5ae0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31         return -1
5af0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5b00: 69 66 28 20 70 50 61 72 73 65 2d 3e 6f 6f 6d 20  if( pParse->oom 
5b10: 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
5b20: 20 20 20 70 4e 6f 64 65 20 3d 20 26 70 50 61 72     pNode = &pPar
5b30: 73 65 2d 3e 61 4e 6f 64 65 5b 70 50 61 72 73 65  se->aNode[pParse
5b40: 2d 3e 6e 4e 6f 64 65 2d 31 5d 3b 0a 20 20 20 20  ->nNode-1];.    
5b50: 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 65 54 79    if( pNode->eTy
5b60: 70 65 21 3d 4a 53 4f 4e 5f 53 54 52 49 4e 47 20  pe!=JSON_STRING 
5b70: 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
5b80: 20 20 20 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67     pNode->jnFlag
5b90: 73 20 7c 3d 20 4a 4e 4f 44 45 5f 4c 41 42 45 4c  s |= JNODE_LABEL
5ba0: 3b 0a 20 20 20 20 20 20 6a 20 3d 20 78 3b 0a 20  ;.      j = x;. 
5bb0: 20 20 20 20 20 77 68 69 6c 65 28 20 73 61 66 65       while( safe
5bc0: 5f 69 73 73 70 61 63 65 28 7a 5b 6a 5d 29 20 29  _isspace(z[j]) )
5bd0: 7b 20 6a 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 69  { j++; }.      i
5be0: 66 28 20 7a 5b 6a 5d 21 3d 27 3a 27 20 29 20 72  f( z[j]!=':' ) r
5bf0: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
5c00: 6a 2b 2b 3b 0a 20 20 20 20 20 20 78 20 3d 20 6a  j++;.      x = j
5c10: 73 6f 6e 50 61 72 73 65 56 61 6c 75 65 28 70 50  sonParseValue(pP
5c20: 61 72 73 65 2c 20 6a 29 3b 0a 20 20 20 20 20 20  arse, j);.      
5c30: 70 50 61 72 73 65 2d 3e 69 44 65 70 74 68 2d 2d  pParse->iDepth--
5c40: 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3c 30 20  ;.      if( x<0 
5c50: 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
5c60: 20 20 20 6a 20 3d 20 78 3b 0a 20 20 20 20 20 20     j = x;.      
5c70: 77 68 69 6c 65 28 20 73 61 66 65 5f 69 73 73 70  while( safe_issp
5c80: 61 63 65 28 7a 5b 6a 5d 29 20 29 7b 20 6a 2b 2b  ace(z[j]) ){ j++
5c90: 3b 20 7d 0a 20 20 20 20 20 20 63 20 3d 20 7a 5b  ; }.      c = z[
5ca0: 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d  j];.      if( c=
5cb0: 3d 27 2c 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b  =',' ) continue;
5cc0: 0a 20 20 20 20 20 20 69 66 28 20 63 21 3d 27 7d  .      if( c!='}
5cd0: 27 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  ' ) return -1;. 
5ce0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5cf0: 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61 4e  }.    pParse->aN
5d00: 6f 64 65 5b 69 54 68 69 73 5d 2e 6e 20 3d 20 70  ode[iThis].n = p
5d10: 50 61 72 73 65 2d 3e 6e 4e 6f 64 65 20 2d 20 28  Parse->nNode - (
5d20: 75 33 32 29 69 54 68 69 73 20 2d 20 31 3b 0a 20  u32)iThis - 1;. 
5d30: 20 20 20 72 65 74 75 72 6e 20 6a 2b 31 3b 0a 20     return j+1;. 
5d40: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5b   }else if( c=='[
5d50: 27 20 29 7b 0a 20 20 20 20 2f 2a 20 50 61 72 73  ' ){.    /* Pars
5d60: 65 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69  e array */.    i
5d70: 54 68 69 73 20 3d 20 6a 73 6f 6e 50 61 72 73 65  This = jsonParse
5d80: 41 64 64 4e 6f 64 65 28 70 50 61 72 73 65 2c 20  AddNode(pParse, 
5d90: 4a 53 4f 4e 5f 41 52 52 41 59 2c 20 30 2c 20 30  JSON_ARRAY, 0, 0
5da0: 29 3b 0a 20 20 20 20 69 66 28 20 69 54 68 69 73  );.    if( iThis
5db0: 3c 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  <0 ) return -1;.
5dc0: 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 3b 6a      for(j=i+1;;j
5dd0: 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65  ++){.      while
5de0: 28 20 73 61 66 65 5f 69 73 73 70 61 63 65 28 7a  ( safe_isspace(z
5df0: 5b 6a 5d 29 20 29 7b 20 6a 2b 2b 3b 20 7d 0a 20  [j]) ){ j++; }. 
5e00: 20 20 20 20 20 69 66 28 20 2b 2b 70 50 61 72 73       if( ++pPars
5e10: 65 2d 3e 69 44 65 70 74 68 20 3e 20 4a 53 4f 4e  e->iDepth > JSON
5e20: 5f 4d 41 58 5f 44 45 50 54 48 20 29 20 72 65 74  _MAX_DEPTH ) ret
5e30: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 78 20  urn -1;.      x 
5e40: 3d 20 6a 73 6f 6e 50 61 72 73 65 56 61 6c 75 65  = jsonParseValue
5e50: 28 70 50 61 72 73 65 2c 20 6a 29 3b 0a 20 20 20  (pParse, j);.   
5e60: 20 20 20 70 50 61 72 73 65 2d 3e 69 44 65 70 74     pParse->iDept
5e70: 68 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 78  h--;.      if( x
5e80: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  <0 ){.        if
5e90: 28 20 78 3d 3d 28 2d 33 29 20 26 26 20 70 50 61  ( x==(-3) && pPa
5ea0: 72 73 65 2d 3e 6e 4e 6f 64 65 3d 3d 28 75 33 32  rse->nNode==(u32
5eb0: 29 69 54 68 69 73 2b 31 20 29 20 72 65 74 75 72  )iThis+1 ) retur
5ec0: 6e 20 6a 2b 31 3b 0a 20 20 20 20 20 20 20 20 72  n j+1;.        r
5ed0: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
5ee0: 7d 0a 20 20 20 20 20 20 6a 20 3d 20 78 3b 0a 20  }.      j = x;. 
5ef0: 20 20 20 20 20 77 68 69 6c 65 28 20 73 61 66 65       while( safe
5f00: 5f 69 73 73 70 61 63 65 28 7a 5b 6a 5d 29 20 29  _isspace(z[j]) )
5f10: 7b 20 6a 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 63  { j++; }.      c
5f20: 20 3d 20 7a 5b 6a 5d 3b 0a 20 20 20 20 20 20 69   = z[j];.      i
5f30: 66 28 20 63 3d 3d 27 2c 27 20 29 20 63 6f 6e 74  f( c==',' ) cont
5f40: 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
5f50: 63 21 3d 27 5d 27 20 29 20 72 65 74 75 72 6e 20  c!=']' ) return 
5f60: 2d 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  -1;.      break;
5f70: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
5f80: 65 2d 3e 61 4e 6f 64 65 5b 69 54 68 69 73 5d 2e  e->aNode[iThis].
5f90: 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4e 6f 64  n = pParse->nNod
5fa0: 65 20 2d 20 28 75 33 32 29 69 54 68 69 73 20 2d  e - (u32)iThis -
5fb0: 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6a   1;.    return j
5fc0: 2b 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  +1;.  }else if( 
5fd0: 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 2f 2a  c=='"' ){.    /*
5fe0: 20 50 61 72 73 65 20 73 74 72 69 6e 67 20 2a 2f   Parse string */
5ff0: 0a 20 20 20 20 75 38 20 6a 6e 46 6c 61 67 73 20  .    u8 jnFlags 
6000: 3d 20 30 3b 0a 20 20 20 20 6a 20 3d 20 69 2b 31  = 0;.    j = i+1
6010: 3b 0a 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20  ;.    for(;;){. 
6020: 20 20 20 20 20 63 20 3d 20 7a 5b 6a 5d 3b 0a 20       c = z[j];. 
6030: 20 20 20 20 20 69 66 28 20 28 63 20 26 20 7e 30       if( (c & ~0
6040: 78 31 66 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  x1f)==0 ){.     
6050: 20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 63 68     /* Control ch
6060: 61 72 61 63 74 65 72 73 20 61 72 65 20 6e 6f 74  aracters are not
6070: 20 61 6c 6c 6f 77 65 64 20 69 6e 20 73 74 72 69   allowed in stri
6080: 6e 67 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  ngs */.        r
6090: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
60a0: 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27  }.      if( c=='
60b0: 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63  \\' ){.        c
60c0: 20 3d 20 7a 5b 2b 2b 6a 5d 3b 0a 20 20 20 20 20   = z[++j];.     
60d0: 20 20 20 69 66 28 20 63 3d 3d 27 22 27 20 7c 7c     if( c=='"' ||
60e0: 20 63 3d 3d 27 5c 5c 27 20 7c 7c 20 63 3d 3d 27   c=='\\' || c=='
60f0: 2f 27 20 7c 7c 20 63 3d 3d 27 62 27 20 7c 7c 20  /' || c=='b' || 
6100: 63 3d 3d 27 66 27 0a 20 20 20 20 20 20 20 20 20  c=='f'.         
6110: 20 20 7c 7c 20 63 3d 3d 27 6e 27 20 7c 7c 20 63    || c=='n' || c
6120: 3d 3d 27 72 27 20 7c 7c 20 63 3d 3d 27 74 27 0a  =='r' || c=='t'.
6130: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 63             || (c
6140: 3d 3d 27 75 27 20 26 26 20 6a 73 6f 6e 49 73 34  =='u' && jsonIs4
6150: 48 65 78 28 7a 2b 6a 2b 31 29 29 20 29 7b 0a 20  Hex(z+j+1)) ){. 
6160: 20 20 20 20 20 20 20 20 20 6a 6e 46 6c 61 67 73           jnFlags
6170: 20 3d 20 4a 4e 4f 44 45 5f 45 53 43 41 50 45 3b   = JNODE_ESCAPE;
6180: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
6190: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
61a0: 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   -1;.        }. 
61b0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
61c0: 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20 20  =='"' ){.       
61d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
61e0: 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d        j++;.    }
61f0: 0a 20 20 20 20 6a 73 6f 6e 50 61 72 73 65 41 64  .    jsonParseAd
6200: 64 4e 6f 64 65 28 70 50 61 72 73 65 2c 20 4a 53  dNode(pParse, JS
6210: 4f 4e 5f 53 54 52 49 4e 47 2c 20 6a 2b 31 2d 69  ON_STRING, j+1-i
6220: 2c 20 26 7a 5b 69 5d 29 3b 0a 20 20 20 20 69 66  , &z[i]);.    if
6230: 28 20 21 70 50 61 72 73 65 2d 3e 6f 6f 6d 20 29  ( !pParse->oom )
6240: 20 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65 5b 70   pParse->aNode[p
6250: 50 61 72 73 65 2d 3e 6e 4e 6f 64 65 2d 31 5d 2e  Parse->nNode-1].
6260: 6a 6e 46 6c 61 67 73 20 3d 20 6a 6e 46 6c 61 67  jnFlags = jnFlag
6270: 73 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6a 2b  s;.    return j+
6280: 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 63  1;.  }else if( c
6290: 3d 3d 27 6e 27 0a 20 20 20 20 20 20 20 20 20 26  =='n'.         &
62a0: 26 20 73 74 72 6e 63 6d 70 28 7a 2b 69 2c 22 6e  & strncmp(z+i,"n
62b0: 75 6c 6c 22 2c 34 29 3d 3d 30 0a 20 20 20 20 20  ull",4)==0.     
62c0: 20 20 20 20 26 26 20 21 73 61 66 65 5f 69 73 61      && !safe_isa
62d0: 6c 6e 75 6d 28 7a 5b 69 2b 34 5d 29 20 29 7b 0a  lnum(z[i+4]) ){.
62e0: 20 20 20 20 6a 73 6f 6e 50 61 72 73 65 41 64 64      jsonParseAdd
62f0: 4e 6f 64 65 28 70 50 61 72 73 65 2c 20 4a 53 4f  Node(pParse, JSO
6300: 4e 5f 4e 55 4c 4c 2c 20 30 2c 20 30 29 3b 0a 20  N_NULL, 0, 0);. 
6310: 20 20 20 72 65 74 75 72 6e 20 69 2b 34 3b 0a 20     return i+4;. 
6320: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 74   }else if( c=='t
6330: 27 0a 20 20 20 20 20 20 20 20 20 26 26 20 73 74  '.         && st
6340: 72 6e 63 6d 70 28 7a 2b 69 2c 22 74 72 75 65 22  rncmp(z+i,"true"
6350: 2c 34 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ,4)==0.         
6360: 26 26 20 21 73 61 66 65 5f 69 73 61 6c 6e 75 6d  && !safe_isalnum
6370: 28 7a 5b 69 2b 34 5d 29 20 29 7b 0a 20 20 20 20  (z[i+4]) ){.    
6380: 6a 73 6f 6e 50 61 72 73 65 41 64 64 4e 6f 64 65  jsonParseAddNode
6390: 28 70 50 61 72 73 65 2c 20 4a 53 4f 4e 5f 54 52  (pParse, JSON_TR
63a0: 55 45 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 72  UE, 0, 0);.    r
63b0: 65 74 75 72 6e 20 69 2b 34 3b 0a 20 20 7d 65 6c  eturn i+4;.  }el
63c0: 73 65 20 69 66 28 20 63 3d 3d 27 66 27 0a 20 20  se if( c=='f'.  
63d0: 20 20 20 20 20 20 20 26 26 20 73 74 72 6e 63 6d         && strncm
63e0: 70 28 7a 2b 69 2c 22 66 61 6c 73 65 22 2c 35 29  p(z+i,"false",5)
63f0: 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
6400: 21 73 61 66 65 5f 69 73 61 6c 6e 75 6d 28 7a 5b  !safe_isalnum(z[
6410: 69 2b 35 5d 29 20 29 7b 0a 20 20 20 20 6a 73 6f  i+5]) ){.    jso
6420: 6e 50 61 72 73 65 41 64 64 4e 6f 64 65 28 70 50  nParseAddNode(pP
6430: 61 72 73 65 2c 20 4a 53 4f 4e 5f 46 41 4c 53 45  arse, JSON_FALSE
6440: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  , 0, 0);.    ret
6450: 75 72 6e 20 69 2b 35 3b 0a 20 20 7d 65 6c 73 65  urn i+5;.  }else
6460: 20 69 66 28 20 63 3d 3d 27 2d 27 20 7c 7c 20 28   if( c=='-' || (
6470: 63 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27 39 27  c>='0' && c<='9'
6480: 29 20 29 7b 0a 20 20 20 20 2f 2a 20 50 61 72 73  ) ){.    /* Pars
6490: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20  e number */.    
64a0: 75 38 20 73 65 65 6e 44 50 20 3d 20 30 3b 0a 20  u8 seenDP = 0;. 
64b0: 20 20 20 75 38 20 73 65 65 6e 45 20 3d 20 30 3b     u8 seenE = 0;
64c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 27 2d 27  .    assert( '-'
64d0: 20 3c 20 27 30 27 20 29 3b 0a 20 20 20 20 69 66   < '0' );.    if
64e0: 28 20 63 3c 3d 27 30 27 20 29 7b 0a 20 20 20 20  ( c<='0' ){.    
64f0: 20 20 6a 20 3d 20 63 3d 3d 27 2d 27 20 3f 20 69    j = c=='-' ? i
6500: 2b 31 20 3a 20 69 3b 0a 20 20 20 20 20 20 69 66  +1 : i;.      if
6510: 28 20 7a 5b 6a 5d 3d 3d 27 30 27 20 26 26 20 7a  ( z[j]=='0' && z
6520: 5b 6a 2b 31 5d 3e 3d 27 30 27 20 26 26 20 7a 5b  [j+1]>='0' && z[
6530: 6a 2b 31 5d 3c 3d 27 39 27 20 29 20 72 65 74 75  j+1]<='9' ) retu
6540: 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20  rn -1;.    }.   
6550: 20 6a 20 3d 20 69 2b 31 3b 0a 20 20 20 20 66 6f   j = i+1;.    fo
6560: 72 28 3b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  r(;; j++){.     
6570: 20 63 20 3d 20 7a 5b 6a 5d 3b 0a 20 20 20 20 20   c = z[j];.     
6580: 20 69 66 28 20 63 3e 3d 27 30 27 20 26 26 20 63   if( c>='0' && c
6590: 3c 3d 27 39 27 20 29 20 63 6f 6e 74 69 6e 75 65  <='9' ) continue
65a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27  ;.      if( c=='
65b0: 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  .' ){.        if
65c0: 28 20 7a 5b 6a 2d 31 5d 3d 3d 27 2d 27 20 29 20  ( z[j-1]=='-' ) 
65d0: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
65e0: 20 20 20 69 66 28 20 73 65 65 6e 44 50 20 29 20     if( seenDP ) 
65f0: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
6600: 20 20 20 73 65 65 6e 44 50 20 3d 20 31 3b 0a 20     seenDP = 1;. 
6610: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
6620: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
6630: 66 28 20 63 3d 3d 27 65 27 20 7c 7c 20 63 3d 3d  f( c=='e' || c==
6640: 27 45 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69  'E' ){.        i
6650: 66 28 20 7a 5b 6a 2d 31 5d 3c 27 30 27 20 29 20  f( z[j-1]<'0' ) 
6660: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
6670: 20 20 20 69 66 28 20 73 65 65 6e 45 20 29 20 72     if( seenE ) r
6680: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
6690: 20 20 73 65 65 6e 44 50 20 3d 20 73 65 65 6e 45    seenDP = seenE
66a0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63 20   = 1;.        c 
66b0: 3d 20 7a 5b 6a 2b 31 5d 3b 0a 20 20 20 20 20 20  = z[j+1];.      
66c0: 20 20 69 66 28 20 63 3d 3d 27 2b 27 20 7c 7c 20    if( c=='+' || 
66d0: 63 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20  c=='-' ){.      
66e0: 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20      j++;.       
66f0: 20 20 20 63 20 3d 20 7a 5b 6a 2b 31 5d 3b 0a 20     c = z[j+1];. 
6700: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6710: 20 69 66 28 20 63 3c 27 30 27 20 7c 7c 20 63 3e   if( c<'0' || c>
6720: 27 39 27 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  '9' ) return -1;
6730: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
6740: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
6750: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6760: 20 20 69 66 28 20 7a 5b 6a 2d 31 5d 3c 27 30 27    if( z[j-1]<'0'
6770: 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
6780: 20 20 6a 73 6f 6e 50 61 72 73 65 41 64 64 4e 6f    jsonParseAddNo
6790: 64 65 28 70 50 61 72 73 65 2c 20 73 65 65 6e 44  de(pParse, seenD
67a0: 50 20 3f 20 4a 53 4f 4e 5f 52 45 41 4c 20 3a 20  P ? JSON_REAL : 
67b0: 4a 53 4f 4e 5f 49 4e 54 2c 0a 20 20 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 6a 20 2d 20 69 2c 20 26 7a 5b 69 5d 29 3b    j - i, &z[i]);
67e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 6a 3b 0a 20  .    return j;. 
67f0: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 7d   }else if( c=='}
6800: 27 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ' ){.    return 
6810: 2d 32 3b 20 20 2f 2a 20 45 6e 64 20 6f 66 20 7b  -2;  /* End of {
6820: 2e 2e 2e 7d 20 2a 2f 0a 20 20 7d 65 6c 73 65 20  ...} */.  }else 
6830: 69 66 28 20 63 3d 3d 27 5d 27 20 29 7b 0a 20 20  if( c==']' ){.  
6840: 20 20 72 65 74 75 72 6e 20 2d 33 3b 20 20 2f 2a    return -3;  /*
6850: 20 45 6e 64 20 6f 66 20 5b 2e 2e 2e 5d 20 2a 2f   End of [...] */
6860: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d  .  }else if( c==
6870: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
6880: 30 3b 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66  0;   /* End of f
6890: 69 6c 65 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a  ile */.  }else{.
68a0: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 20 20      return -1;  
68b0: 2f 2a 20 53 79 6e 74 61 78 20 65 72 72 6f 72 20  /* Syntax error 
68c0: 2a 2f 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  */.  }.}../*.** 
68d0: 50 61 72 73 65 20 61 20 63 6f 6d 70 6c 65 74 65  Parse a complete
68e0: 20 4a 53 4f 4e 20 73 74 72 69 6e 67 2e 20 20 52   JSON string.  R
68f0: 65 74 75 72 6e 20 30 20 6f 6e 20 73 75 63 63 65  eturn 0 on succe
6900: 73 73 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 69  ss or non-zero i
6910: 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 61  f there.** are a
6920: 6e 79 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61  ny errors.  If a
6930: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
6940: 66 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  free all memory 
6950: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
6960: 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a  ** pParse..**.**
6970: 20 70 50 61 72 73 65 20 69 73 20 75 6e 69 6e 69   pParse is unini
6980: 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68  tialized when th
6990: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
69a0: 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lled..*/.static 
69b0: 69 6e 74 20 6a 73 6f 6e 50 61 72 73 65 28 0a 20  int jsonParse(. 
69c0: 20 4a 73 6f 6e 50 61 72 73 65 20 2a 70 50 61 72   JsonParse *pPar
69d0: 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  se,           /*
69e0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64 20   Initialize and 
69f0: 66 69 6c 6c 20 74 68 69 73 20 4a 73 6f 6e 50 61  fill this JsonPa
6a00: 72 73 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  rse object */.  
6a10: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
6a20: 2a 70 43 74 78 2c 20 20 20 20 20 20 20 2f 2a 20  *pCtx,       /* 
6a30: 52 65 70 6f 72 74 20 65 72 72 6f 72 73 20 68 65  Report errors he
6a40: 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  re */.  const ch
6a50: 61 72 20 2a 7a 4a 73 6f 6e 20 20 20 20 20 20 20  ar *zJson       
6a60: 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 4a 53       /* Input JS
6a70: 4f 4e 20 74 65 78 74 20 74 6f 20 62 65 20 70 61  ON text to be pa
6a80: 72 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  rsed */.){.  int
6a90: 20 69 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61   i;.  memset(pPa
6aa0: 72 73 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  rse, 0, sizeof(*
6ab0: 70 50 61 72 73 65 29 29 3b 0a 20 20 69 66 28 20  pParse));.  if( 
6ac0: 7a 4a 73 6f 6e 3d 3d 30 20 29 20 72 65 74 75 72  zJson==0 ) retur
6ad0: 6e 20 31 3b 0a 20 20 70 50 61 72 73 65 2d 3e 7a  n 1;.  pParse->z
6ae0: 4a 73 6f 6e 20 3d 20 7a 4a 73 6f 6e 3b 0a 20 20  Json = zJson;.  
6af0: 69 20 3d 20 6a 73 6f 6e 50 61 72 73 65 56 61 6c  i = jsonParseVal
6b00: 75 65 28 70 50 61 72 73 65 2c 20 30 29 3b 0a 20  ue(pParse, 0);. 
6b10: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6f 6f 6d   if( pParse->oom
6b20: 20 29 20 69 20 3d 20 2d 31 3b 0a 20 20 69 66 28   ) i = -1;.  if(
6b30: 20 69 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65   i>0 ){.    asse
6b40: 72 74 28 20 70 50 61 72 73 65 2d 3e 69 44 65 70  rt( pParse->iDep
6b50: 74 68 3d 3d 30 20 29 3b 0a 20 20 20 20 77 68 69  th==0 );.    whi
6b60: 6c 65 28 20 73 61 66 65 5f 69 73 73 70 61 63 65  le( safe_isspace
6b70: 28 7a 4a 73 6f 6e 5b 69 5d 29 20 29 20 69 2b 2b  (zJson[i]) ) i++
6b80: 3b 0a 20 20 20 20 69 66 28 20 7a 4a 73 6f 6e 5b  ;.    if( zJson[
6b90: 69 5d 20 29 20 69 20 3d 20 2d 31 3b 0a 20 20 7d  i] ) i = -1;.  }
6ba0: 0a 20 20 69 66 28 20 69 3c 3d 30 20 29 7b 0a 20  .  if( i<=0 ){. 
6bb0: 20 20 20 69 66 28 20 70 43 74 78 21 3d 30 20 29     if( pCtx!=0 )
6bc0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72  {.      if( pPar
6bd0: 73 65 2d 3e 6f 6f 6d 20 29 7b 0a 20 20 20 20 20  se->oom ){.     
6be0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
6bf0: 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43  t_error_nomem(pC
6c00: 74 78 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  tx);.      }else
6c10: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
6c20: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70  3_result_error(p
6c30: 43 74 78 2c 20 22 6d 61 6c 66 6f 72 6d 65 64 20  Ctx, "malformed 
6c40: 4a 53 4f 4e 22 2c 20 2d 31 29 3b 0a 20 20 20 20  JSON", -1);.    
6c50: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6a 73    }.    }.    js
6c60: 6f 6e 50 61 72 73 65 52 65 73 65 74 28 70 50 61  onParseReset(pPa
6c70: 72 73 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  rse);.    return
6c80: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
6c90: 20 30 3b 0a 7d 0a 0a 2f 2a 20 4d 61 72 6b 20 6e   0;.}../* Mark n
6ca0: 6f 64 65 20 69 20 6f 66 20 70 50 61 72 73 65 20  ode i of pParse 
6cb0: 61 73 20 62 65 69 6e 67 20 61 20 63 68 69 6c 64  as being a child
6cc0: 20 6f 66 20 69 50 61 72 65 6e 74 2e 20 20 43 61   of iParent.  Ca
6cd0: 6c 6c 20 72 65 63 75 72 73 69 76 65 6c 79 0a 2a  ll recursively.*
6ce0: 2a 20 74 6f 20 66 69 6c 6c 20 69 6e 20 61 6c 6c  * to fill in all
6cf0: 20 74 68 65 20 64 65 73 63 65 6e 64 61 6e 74 73   the descendants
6d00: 20 6f 66 20 6e 6f 64 65 20 69 2e 0a 2a 2f 0a 73   of node i..*/.s
6d10: 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 50  tatic void jsonP
6d20: 61 72 73 65 46 69 6c 6c 49 6e 50 61 72 65 6e 74  arseFillInParent
6d30: 61 67 65 28 4a 73 6f 6e 50 61 72 73 65 20 2a 70  age(JsonParse *p
6d40: 50 61 72 73 65 2c 20 75 33 32 20 69 2c 20 75 33  Parse, u32 i, u3
6d50: 32 20 69 50 61 72 65 6e 74 29 7b 0a 20 20 4a 73  2 iParent){.  Js
6d60: 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 20 3d 20  onNode *pNode = 
6d70: 26 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65 5b 69  &pParse->aNode[i
6d80: 5d 3b 0a 20 20 75 33 32 20 6a 3b 0a 20 20 70 50  ];.  u32 j;.  pP
6d90: 61 72 73 65 2d 3e 61 55 70 5b 69 5d 20 3d 20 69  arse->aUp[i] = i
6da0: 50 61 72 65 6e 74 3b 0a 20 20 73 77 69 74 63 68  Parent;.  switch
6db0: 28 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65 20 29  ( pNode->eType )
6dc0: 7b 0a 20 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f  {.    case JSON_
6dd0: 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 66  ARRAY: {.      f
6de0: 6f 72 28 6a 3d 31 3b 20 6a 3c 3d 70 4e 6f 64 65  or(j=1; j<=pNode
6df0: 2d 3e 6e 3b 20 6a 20 2b 3d 20 6a 73 6f 6e 4e 6f  ->n; j += jsonNo
6e00: 64 65 53 69 7a 65 28 70 4e 6f 64 65 2b 6a 29 29  deSize(pNode+j))
6e10: 7b 0a 20 20 20 20 20 20 20 20 6a 73 6f 6e 50 61  {.        jsonPa
6e20: 72 73 65 46 69 6c 6c 49 6e 50 61 72 65 6e 74 61  rseFillInParenta
6e30: 67 65 28 70 50 61 72 73 65 2c 20 69 2b 6a 2c 20  ge(pParse, i+j, 
6e40: 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i);.      }.    
6e50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
6e60: 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f 4f 42 4a     case JSON_OBJ
6e70: 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 66 6f 72  ECT: {.      for
6e80: 28 6a 3d 31 3b 20 6a 3c 3d 70 4e 6f 64 65 2d 3e  (j=1; j<=pNode->
6e90: 6e 3b 20 6a 20 2b 3d 20 6a 73 6f 6e 4e 6f 64 65  n; j += jsonNode
6ea0: 53 69 7a 65 28 70 4e 6f 64 65 2b 6a 2b 31 29 2b  Size(pNode+j+1)+
6eb0: 31 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72  1){.        pPar
6ec0: 73 65 2d 3e 61 55 70 5b 69 2b 6a 5d 20 3d 20 69  se->aUp[i+j] = i
6ed0: 3b 0a 20 20 20 20 20 20 20 20 6a 73 6f 6e 50 61  ;.        jsonPa
6ee0: 72 73 65 46 69 6c 6c 49 6e 50 61 72 65 6e 74 61  rseFillInParenta
6ef0: 67 65 28 70 50 61 72 73 65 2c 20 69 2b 6a 2b 31  ge(pParse, i+j+1
6f00: 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , i);.      }.  
6f10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6f20: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
6f30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6f40: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
6f50: 43 6f 6d 70 75 74 65 20 74 68 65 20 70 61 72 65  Compute the pare
6f60: 6e 74 61 67 65 20 6f 66 20 61 6c 6c 20 6e 6f 64  ntage of all nod
6f70: 65 73 20 69 6e 20 61 20 63 6f 6d 70 6c 65 74 65  es in a complete
6f80: 64 20 70 61 72 73 65 2e 0a 2a 2f 0a 73 74 61 74  d parse..*/.stat
6f90: 69 63 20 69 6e 74 20 6a 73 6f 6e 50 61 72 73 65  ic int jsonParse
6fa0: 46 69 6e 64 50 61 72 65 6e 74 73 28 4a 73 6f 6e  FindParents(Json
6fb0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
6fc0: 20 20 75 33 32 20 2a 61 55 70 3b 0a 20 20 61 73    u32 *aUp;.  as
6fd0: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 61 55  sert( pParse->aU
6fe0: 70 3d 3d 30 20 29 3b 0a 20 20 61 55 70 20 3d 20  p==0 );.  aUp = 
6ff0: 70 50 61 72 73 65 2d 3e 61 55 70 20 3d 20 73 71  pParse->aUp = sq
7000: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
7010: 7a 65 6f 66 28 75 33 32 29 2a 70 50 61 72 73 65  zeof(u32)*pParse
7020: 2d 3e 6e 4e 6f 64 65 20 29 3b 0a 20 20 69 66 28  ->nNode );.  if(
7030: 20 61 55 70 3d 3d 30 20 29 7b 0a 20 20 20 20 70   aUp==0 ){.    p
7040: 50 61 72 73 65 2d 3e 6f 6f 6d 20 3d 20 31 3b 0a  Parse->oom = 1;.
7050: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7060: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6a  E_NOMEM;.  }.  j
7070: 73 6f 6e 50 61 72 73 65 46 69 6c 6c 49 6e 50 61  sonParseFillInPa
7080: 72 65 6e 74 61 67 65 28 70 50 61 72 73 65 2c 20  rentage(pParse, 
7090: 30 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  0, 0);.  return 
70a0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
70b0: 0a 2a 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65 72  .** Magic number
70c0: 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 4a 53   used for the JS
70d0: 4f 4e 20 70 61 72 73 65 20 63 61 63 68 65 20 69  ON parse cache i
70e0: 6e 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75  n sqlite3_get_au
70f0: 78 64 61 74 61 28 29 0a 2a 2f 0a 23 64 65 66 69  xdata().*/.#defi
7100: 6e 65 20 4a 53 4f 4e 5f 43 41 43 48 45 5f 49 44  ne JSON_CACHE_ID
7110: 20 20 28 2d 34 32 39 39 33 38 29 20 20 2f 2a 20    (-429938)  /* 
7120: 46 69 72 73 74 20 63 61 63 68 65 20 65 6e 74 72  First cache entr
7130: 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 53 4f  y */.#define JSO
7140: 4e 5f 43 41 43 48 45 5f 53 5a 20 20 34 20 20 20  N_CACHE_SZ  4   
7150: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 20 6e 75         /* Max nu
7160: 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20 65 6e  mber of cache en
7170: 74 72 69 65 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  tries */../*.** 
7180: 4f 62 74 61 69 6e 20 61 20 63 6f 6d 70 6c 65 74  Obtain a complet
7190: 65 20 70 61 72 73 65 20 6f 66 20 74 68 65 20 4a  e parse of the J
71a0: 53 4f 4e 20 66 6f 75 6e 64 20 69 6e 20 74 68 65  SON found in the
71b0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 0a   first argument.
71c0: 2a 2a 20 6f 66 20 74 68 65 20 61 72 67 76 20 61  ** of the argv a
71d0: 72 72 61 79 2e 20 20 55 73 65 20 74 68 65 20 73  rray.  Use the s
71e0: 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 78 64 61  qlite3_get_auxda
71f0: 74 61 28 29 20 63 61 63 68 65 20 66 6f 72 20 74  ta() cache for t
7200: 68 69 73 0a 2a 2a 20 70 61 72 73 65 20 69 66 20  his.** parse if 
7210: 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e  it is available.
7220: 20 20 49 66 20 74 68 65 20 63 61 63 68 65 20 69    If the cache i
7230: 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  s not available 
7240: 6f 72 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 6e  or if it.** is n
7250: 6f 20 6c 6f 6e 67 65 72 20 76 61 6c 69 64 2c 20  o longer valid, 
7260: 70 61 72 73 65 20 74 68 65 20 4a 53 4f 4e 20 61  parse the JSON a
7270: 67 61 69 6e 20 61 6e 64 20 72 65 74 75 72 6e 20  gain and return 
7280: 74 68 65 20 6e 65 77 20 70 61 72 73 65 2c 0a 2a  the new parse,.*
7290: 2a 20 61 6e 64 20 61 6c 73 6f 20 72 65 67 69 73  * and also regis
72a0: 74 65 72 20 74 68 65 20 6e 65 77 20 70 61 72 73  ter the new pars
72b0: 65 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c  e so that it wil
72c0: 6c 20 62 65 20 61 76 61 69 6c 61 62 6c 65 20 66  l be available f
72d0: 6f 72 0a 2a 2a 20 66 75 74 75 72 65 20 73 71 6c  or.** future sql
72e0: 69 74 65 33 5f 67 65 74 5f 61 75 78 64 61 74 61  ite3_get_auxdata
72f0: 28 29 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61  () calls..*/.sta
7300: 74 69 63 20 4a 73 6f 6e 50 61 72 73 65 20 2a 6a  tic JsonParse *j
7310: 73 6f 6e 50 61 72 73 65 43 61 63 68 65 64 28 0a  sonParseCached(.
7320: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
7330: 74 20 2a 70 43 74 78 2c 0a 20 20 73 71 6c 69 74  t *pCtx,.  sqlit
7340: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 2c  e3_value **argv,
7350: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
7360: 78 74 20 2a 70 45 72 72 43 74 78 0a 29 7b 0a 20  xt *pErrCtx.){. 
7370: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4a 73   const char *zJs
7380: 6f 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  on = (const char
7390: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
73a0: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  text(argv[0]);. 
73b0: 20 69 6e 74 20 6e 4a 73 6f 6e 20 3d 20 73 71 6c   int nJson = sql
73c0: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
73d0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 4a 73 6f  (argv[0]);.  Jso
73e0: 6e 50 61 72 73 65 20 2a 70 3b 0a 20 20 4a 73 6f  nParse *p;.  Jso
73f0: 6e 50 61 72 73 65 20 2a 70 4d 61 74 63 68 20 3d  nParse *pMatch =
7400: 20 30 3b 0a 20 20 69 6e 74 20 69 4b 65 79 3b 0a   0;.  int iKey;.
7410: 20 20 69 6e 74 20 69 4d 69 6e 4b 65 79 20 3d 20    int iMinKey = 
7420: 30 3b 0a 20 20 75 33 32 20 69 4d 69 6e 48 6f 6c  0;.  u32 iMinHol
7430: 64 20 3d 20 30 78 66 66 66 66 66 66 66 66 3b 0a  d = 0xffffffff;.
7440: 20 20 75 33 32 20 69 4d 61 78 48 6f 6c 64 20 3d    u32 iMaxHold =
7450: 20 30 3b 0a 20 20 69 66 28 20 7a 4a 73 6f 6e 3d   0;.  if( zJson=
7460: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
7470: 20 66 6f 72 28 69 4b 65 79 3d 30 3b 20 69 4b 65   for(iKey=0; iKe
7480: 79 3c 4a 53 4f 4e 5f 43 41 43 48 45 5f 53 5a 3b  y<JSON_CACHE_SZ;
7490: 20 69 4b 65 79 2b 2b 29 7b 0a 20 20 20 20 70 20   iKey++){.    p 
74a0: 3d 20 28 4a 73 6f 6e 50 61 72 73 65 2a 29 73 71  = (JsonParse*)sq
74b0: 6c 69 74 65 33 5f 67 65 74 5f 61 75 78 64 61 74  lite3_get_auxdat
74c0: 61 28 70 43 74 78 2c 20 4a 53 4f 4e 5f 43 41 43  a(pCtx, JSON_CAC
74d0: 48 45 5f 49 44 2b 69 4b 65 79 29 3b 0a 20 20 20  HE_ID+iKey);.   
74e0: 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20   if( p==0 ){.   
74f0: 20 20 20 69 4d 69 6e 4b 65 79 20 3d 20 69 4b 65     iMinKey = iKe
7500: 79 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  y;.      break;.
7510: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4d      }.    if( pM
7520: 61 74 63 68 3d 3d 30 0a 20 20 20 20 20 26 26 20  atch==0.     && 
7530: 70 2d 3e 6e 4a 73 6f 6e 3d 3d 6e 4a 73 6f 6e 0a  p->nJson==nJson.
7540: 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70       && memcmp(p
7550: 2d 3e 7a 4a 73 6f 6e 2c 7a 4a 73 6f 6e 2c 6e 4a  ->zJson,zJson,nJ
7560: 73 6f 6e 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20  son)==0.    ){. 
7570: 20 20 20 20 20 70 2d 3e 6e 45 72 72 20 3d 20 30       p->nErr = 0
7580: 3b 0a 20 20 20 20 20 20 70 4d 61 74 63 68 20 3d  ;.      pMatch =
7590: 20 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   p;.    }else if
75a0: 28 20 70 2d 3e 69 48 6f 6c 64 3c 69 4d 69 6e 48  ( p->iHold<iMinH
75b0: 6f 6c 64 20 29 7b 0a 20 20 20 20 20 20 69 4d 69  old ){.      iMi
75c0: 6e 48 6f 6c 64 20 3d 20 70 2d 3e 69 48 6f 6c 64  nHold = p->iHold
75d0: 3b 0a 20 20 20 20 20 20 69 4d 69 6e 4b 65 79 20  ;.      iMinKey 
75e0: 3d 20 69 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20  = iKey;.    }.  
75f0: 20 20 69 66 28 20 70 2d 3e 69 48 6f 6c 64 3e 69    if( p->iHold>i
7600: 4d 61 78 48 6f 6c 64 20 29 7b 0a 20 20 20 20 20  MaxHold ){.     
7610: 20 69 4d 61 78 48 6f 6c 64 20 3d 20 70 2d 3e 69   iMaxHold = p->i
7620: 48 6f 6c 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Hold;.    }.  }.
7630: 20 20 69 66 28 20 70 4d 61 74 63 68 20 29 7b 0a    if( pMatch ){.
7640: 20 20 20 20 70 4d 61 74 63 68 2d 3e 6e 45 72 72      pMatch->nErr
7650: 20 3d 20 30 3b 0a 20 20 20 20 70 4d 61 74 63 68   = 0;.    pMatch
7660: 2d 3e 69 48 6f 6c 64 20 3d 20 69 4d 61 78 48 6f  ->iHold = iMaxHo
7670: 6c 64 2b 31 3b 0a 20 20 20 20 72 65 74 75 72 6e  ld+1;.    return
7680: 20 70 4d 61 74 63 68 3b 0a 20 20 7d 0a 20 20 70   pMatch;.  }.  p
7690: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
76a0: 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20  c( sizeof(*p) + 
76b0: 6e 4a 73 6f 6e 20 2b 20 31 20 29 3b 0a 20 20 69  nJson + 1 );.  i
76c0: 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73  f( p==0 ){.    s
76d0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
76e0: 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78 29 3b  ror_nomem(pCtx);
76f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
7700: 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30   }.  memset(p, 0
7710: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
7720: 20 70 2d 3e 7a 4a 73 6f 6e 20 3d 20 28 63 68 61   p->zJson = (cha
7730: 72 2a 29 26 70 5b 31 5d 3b 0a 20 20 6d 65 6d 63  r*)&p[1];.  memc
7740: 70 79 28 28 63 68 61 72 2a 29 70 2d 3e 7a 4a 73  py((char*)p->zJs
7750: 6f 6e 2c 20 7a 4a 73 6f 6e 2c 20 6e 4a 73 6f 6e  on, zJson, nJson
7760: 2b 31 29 3b 0a 20 20 69 66 28 20 6a 73 6f 6e 50  +1);.  if( jsonP
7770: 61 72 73 65 28 70 2c 20 70 45 72 72 43 74 78 2c  arse(p, pErrCtx,
7780: 20 70 2d 3e 7a 4a 73 6f 6e 29 20 29 7b 0a 20 20   p->zJson) ){.  
7790: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
77a0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
77b0: 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4a 73 6f 6e 20  .  }.  p->nJson 
77c0: 3d 20 6e 4a 73 6f 6e 3b 0a 20 20 70 2d 3e 69 48  = nJson;.  p->iH
77d0: 6f 6c 64 20 3d 20 69 4d 61 78 48 6f 6c 64 2b 31  old = iMaxHold+1
77e0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f  ;.  sqlite3_set_
77f0: 61 75 78 64 61 74 61 28 70 43 74 78 2c 20 4a 53  auxdata(pCtx, JS
7800: 4f 4e 5f 43 41 43 48 45 5f 49 44 2b 69 4d 69 6e  ON_CACHE_ID+iMin
7810: 4b 65 79 2c 20 70 2c 0a 20 20 20 20 20 20 20 20  Key, p,.        
7820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
7830: 6f 69 64 28 2a 29 28 76 6f 69 64 2a 29 29 6a 73  oid(*)(void*))js
7840: 6f 6e 50 61 72 73 65 46 72 65 65 29 3b 0a 20 20  onParseFree);.  
7850: 72 65 74 75 72 6e 20 28 4a 73 6f 6e 50 61 72 73  return (JsonPars
7860: 65 2a 29 73 71 6c 69 74 65 33 5f 67 65 74 5f 61  e*)sqlite3_get_a
7870: 75 78 64 61 74 61 28 70 43 74 78 2c 20 4a 53 4f  uxdata(pCtx, JSO
7880: 4e 5f 43 41 43 48 45 5f 49 44 2b 69 4d 69 6e 4b  N_CACHE_ID+iMinK
7890: 65 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ey);.}../*.** Co
78a0: 6d 70 61 72 65 20 74 68 65 20 4f 42 4a 45 43 54  mpare the OBJECT
78b0: 20 6c 61 62 65 6c 20 61 74 20 70 4e 6f 64 65 20   label at pNode 
78c0: 61 67 61 69 6e 73 74 20 7a 4b 65 79 2c 6e 4b 65  against zKey,nKe
78d0: 79 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20  y.  Return true 
78e0: 6f 6e 0a 2a 2a 20 61 20 6d 61 74 63 68 2e 0a 2a  on.** a match..*
78f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 73 6f  /.static int jso
7900: 6e 4c 61 62 65 6c 43 6f 6d 70 61 72 65 28 4a 73  nLabelCompare(Js
7910: 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 20 63  onNode *pNode, c
7920: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65 79 2c  onst char *zKey,
7930: 20 75 33 32 20 6e 4b 65 79 29 7b 0a 20 20 69 66   u32 nKey){.  if
7940: 28 20 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73  ( pNode->jnFlags
7950: 20 26 20 4a 4e 4f 44 45 5f 52 41 57 20 29 7b 0a   & JNODE_RAW ){.
7960: 20 20 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 6e      if( pNode->n
7970: 21 3d 6e 4b 65 79 20 29 20 72 65 74 75 72 6e 20  !=nKey ) return 
7980: 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 74  0;.    return st
7990: 72 6e 63 6d 70 28 70 4e 6f 64 65 2d 3e 75 2e 7a  rncmp(pNode->u.z
79a0: 4a 43 6f 6e 74 65 6e 74 2c 20 7a 4b 65 79 2c 20  JContent, zKey, 
79b0: 6e 4b 65 79 29 3d 3d 30 3b 0a 20 20 7d 65 6c 73  nKey)==0;.  }els
79c0: 65 7b 0a 20 20 20 20 69 66 28 20 70 4e 6f 64 65  e{.    if( pNode
79d0: 2d 3e 6e 21 3d 6e 4b 65 79 2b 32 20 29 20 72 65  ->n!=nKey+2 ) re
79e0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 72 65 74 75  turn 0;.    retu
79f0: 72 6e 20 73 74 72 6e 63 6d 70 28 70 4e 6f 64 65  rn strncmp(pNode
7a00: 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 2b 31 2c  ->u.zJContent+1,
7a10: 20 7a 4b 65 79 2c 20 6e 4b 65 79 29 3d 3d 30 3b   zKey, nKey)==0;
7a20: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 66 6f 72 77 61  .  }.}../* forwa
7a30: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a  rd declaration *
7a40: 2f 0a 73 74 61 74 69 63 20 4a 73 6f 6e 4e 6f 64  /.static JsonNod
7a50: 65 20 2a 6a 73 6f 6e 4c 6f 6f 6b 75 70 41 70 70  e *jsonLookupApp
7a60: 65 6e 64 28 4a 73 6f 6e 50 61 72 73 65 2a 2c 63  end(JsonParse*,c
7a70: 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2a 2c  onst char*,int*,
7a80: 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 3b 0a 0a  const char**);..
7a90: 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 61 6c 6f  /*.** Search alo
7aa0: 6e 67 20 7a 50 61 74 68 20 74 6f 20 66 69 6e 64  ng zPath to find
7ab0: 20 74 68 65 20 6e 6f 64 65 20 73 70 65 63 69 66   the node specif
7ac0: 69 65 64 2e 20 20 52 65 74 75 72 6e 20 61 20 70  ied.  Return a p
7ad0: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 61  ointer.** to tha
7ae0: 74 20 6e 6f 64 65 2c 20 6f 72 20 4e 55 4c 4c 20  t node, or NULL 
7af0: 69 66 20 7a 50 61 74 68 20 69 73 20 6d 61 6c 66  if zPath is malf
7b00: 6f 72 6d 65 64 20 6f 72 20 69 66 20 74 68 65 72  ormed or if ther
7b10: 65 20 69 73 20 6e 6f 20 73 75 63 68 0a 2a 2a 20  e is no such.** 
7b20: 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  node..**.** If p
7b30: 41 70 6e 64 21 3d 30 2c 20 74 68 65 6e 20 74 72  Apnd!=0, then tr
7b40: 79 20 74 6f 20 61 70 70 65 6e 64 20 6e 65 77 20  y to append new 
7b50: 6e 6f 64 65 73 20 74 6f 20 63 6f 6d 70 6c 65 74  nodes to complet
7b60: 65 20 7a 50 61 74 68 20 69 66 20 69 74 20 69 73  e zPath if it is
7b70: 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  .** possible to 
7b80: 64 6f 20 73 6f 20 61 6e 64 20 69 66 20 6e 6f 20  do so and if no 
7b90: 65 78 69 73 74 69 6e 67 20 6e 6f 64 65 20 63 6f  existing node co
7ba0: 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 7a 50 61  rresponds to zPa
7bb0: 74 68 2e 20 20 49 66 0a 2a 2a 20 6e 65 77 20 6e  th.  If.** new n
7bc0: 6f 64 65 73 20 61 72 65 20 61 70 70 65 6e 64 65  odes are appende
7bd0: 64 20 2a 70 41 70 6e 64 20 69 73 20 73 65 74 20  d *pApnd is set 
7be0: 74 6f 20 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  to 1..*/.static 
7bf0: 4a 73 6f 6e 4e 6f 64 65 20 2a 6a 73 6f 6e 4c 6f  JsonNode *jsonLo
7c00: 6f 6b 75 70 53 74 65 70 28 0a 20 20 4a 73 6f 6e  okupStep(.  Json
7c10: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
7c20: 20 20 20 20 2f 2a 20 54 68 65 20 4a 53 4f 4e 20      /* The JSON 
7c30: 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 75  to search */.  u
7c40: 33 32 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  32 iRoot,       
7c50: 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20         /* Begin 
7c60: 74 68 65 20 73 65 61 72 63 68 20 61 74 20 74 68  the search at th
7c70: 69 73 20 6e 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e  is node */.  con
7c80: 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
7c90: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 74 68       /* The path
7ca0: 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
7cb0: 69 6e 74 20 2a 70 41 70 6e 64 2c 20 20 20 20 20  int *pApnd,     
7cc0: 20 20 20 20 20 20 20 20 2f 2a 20 41 70 70 65 6e          /* Appen
7cd0: 64 20 6e 6f 64 65 73 20 74 6f 20 63 6f 6d 70 6c  d nodes to compl
7ce0: 65 74 65 20 70 61 74 68 20 69 66 20 6e 6f 74 20  ete path if not 
7cf0: 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  NULL */.  const 
7d00: 63 68 61 72 20 2a 2a 70 7a 45 72 72 20 20 20 20  char **pzErr    
7d10: 20 20 2f 2a 20 4d 61 6b 65 20 2a 70 7a 45 72 72    /* Make *pzErr
7d20: 20 70 6f 69 6e 74 20 74 6f 20 61 6e 79 20 73 79   point to any sy
7d30: 6e 74 61 78 20 65 72 72 6f 72 20 69 6e 20 7a 50  ntax error in zP
7d40: 61 74 68 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20  ath */.){.  u32 
7d50: 69 2c 20 6a 2c 20 6e 4b 65 79 3b 0a 20 20 63 6f  i, j, nKey;.  co
7d60: 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65 79 3b 0a  nst char *zKey;.
7d70: 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 52 6f 6f    JsonNode *pRoo
7d80: 74 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 4e 6f  t = &pParse->aNo
7d90: 64 65 5b 69 52 6f 6f 74 5d 3b 0a 20 20 69 66 28  de[iRoot];.  if(
7da0: 20 7a 50 61 74 68 5b 30 5d 3d 3d 30 20 29 20 72   zPath[0]==0 ) r
7db0: 65 74 75 72 6e 20 70 52 6f 6f 74 3b 0a 20 20 69  eturn pRoot;.  i
7dc0: 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 2e 27  f( zPath[0]=='.'
7dd0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 52 6f 6f   ){.    if( pRoo
7de0: 74 2d 3e 65 54 79 70 65 21 3d 4a 53 4f 4e 5f 4f  t->eType!=JSON_O
7df0: 42 4a 45 43 54 20 29 20 72 65 74 75 72 6e 20 30  BJECT ) return 0
7e00: 3b 0a 20 20 20 20 7a 50 61 74 68 2b 2b 3b 0a 20  ;.    zPath++;. 
7e10: 20 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d     if( zPath[0]=
7e20: 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20 7a 4b  ='"' ){.      zK
7e30: 65 79 20 3d 20 7a 50 61 74 68 20 2b 20 31 3b 0a  ey = zPath + 1;.
7e40: 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 7a        for(i=1; z
7e50: 50 61 74 68 5b 69 5d 20 26 26 20 7a 50 61 74 68  Path[i] && zPath
7e60: 5b 69 5d 21 3d 27 22 27 3b 20 69 2b 2b 29 7b 7d  [i]!='"'; i++){}
7e70: 0a 20 20 20 20 20 20 6e 4b 65 79 20 3d 20 69 2d  .      nKey = i-
7e80: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 61  1;.      if( zPa
7e90: 74 68 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20  th[i] ){.       
7ea0: 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73   i++;.      }els
7eb0: 65 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45 72  e{.        *pzEr
7ec0: 72 20 3d 20 7a 50 61 74 68 3b 0a 20 20 20 20 20  r = zPath;.     
7ed0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
7ee0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
7ef0: 20 20 20 20 20 20 7a 4b 65 79 20 3d 20 7a 50 61        zKey = zPa
7f00: 74 68 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  th;.      for(i=
7f10: 30 3b 20 7a 50 61 74 68 5b 69 5d 20 26 26 20 7a  0; zPath[i] && z
7f20: 50 61 74 68 5b 69 5d 21 3d 27 2e 27 20 26 26 20  Path[i]!='.' && 
7f30: 7a 50 61 74 68 5b 69 5d 21 3d 27 5b 27 3b 20 69  zPath[i]!='['; i
7f40: 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 6e 4b 65 79  ++){}.      nKey
7f50: 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = i;.    }.    
7f60: 69 66 28 20 6e 4b 65 79 3d 3d 30 20 29 7b 0a 20  if( nKey==0 ){. 
7f70: 20 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 7a 50       *pzErr = zP
7f80: 61 74 68 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ath;.      retur
7f90: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a  n 0;.    }.    j
7fa0: 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 3b 3b   = 1;.    for(;;
7fb0: 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  ){.      while( 
7fc0: 6a 3c 3d 70 52 6f 6f 74 2d 3e 6e 20 29 7b 0a 20  j<=pRoot->n ){. 
7fd0: 20 20 20 20 20 20 20 69 66 28 20 6a 73 6f 6e 4c         if( jsonL
7fe0: 61 62 65 6c 43 6f 6d 70 61 72 65 28 70 52 6f 6f  abelCompare(pRoo
7ff0: 74 2b 6a 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79 29  t+j, zKey, nKey)
8000: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
8010: 74 75 72 6e 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 53  turn jsonLookupS
8020: 74 65 70 28 70 50 61 72 73 65 2c 20 69 52 6f 6f  tep(pParse, iRoo
8030: 74 2b 6a 2b 31 2c 20 26 7a 50 61 74 68 5b 69 5d  t+j+1, &zPath[i]
8040: 2c 20 70 41 70 6e 64 2c 20 70 7a 45 72 72 29 3b  , pApnd, pzErr);
8050: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8060: 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20     j++;.        
8070: 6a 20 2b 3d 20 6a 73 6f 6e 4e 6f 64 65 53 69 7a  j += jsonNodeSiz
8080: 65 28 26 70 52 6f 6f 74 5b 6a 5d 29 3b 0a 20 20  e(&pRoot[j]);.  
8090: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
80a0: 28 70 52 6f 6f 74 2d 3e 6a 6e 46 6c 61 67 73 20  (pRoot->jnFlags 
80b0: 26 20 4a 4e 4f 44 45 5f 41 50 50 45 4e 44 29 3d  & JNODE_APPEND)=
80c0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
80d0: 20 20 69 52 6f 6f 74 20 2b 3d 20 70 52 6f 6f 74    iRoot += pRoot
80e0: 2d 3e 75 2e 69 41 70 70 65 6e 64 3b 0a 20 20 20  ->u.iAppend;.   
80f0: 20 20 20 70 52 6f 6f 74 20 3d 20 26 70 50 61 72     pRoot = &pPar
8100: 73 65 2d 3e 61 4e 6f 64 65 5b 69 52 6f 6f 74 5d  se->aNode[iRoot]
8110: 3b 0a 20 20 20 20 20 20 6a 20 3d 20 31 3b 0a 20  ;.      j = 1;. 
8120: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 41 70     }.    if( pAp
8130: 6e 64 20 29 7b 0a 20 20 20 20 20 20 75 33 32 20  nd ){.      u32 
8140: 69 53 74 61 72 74 2c 20 69 4c 61 62 65 6c 3b 0a  iStart, iLabel;.
8150: 20 20 20 20 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a        JsonNode *
8160: 70 4e 6f 64 65 3b 0a 20 20 20 20 20 20 69 53 74  pNode;.      iSt
8170: 61 72 74 20 3d 20 6a 73 6f 6e 50 61 72 73 65 41  art = jsonParseA
8180: 64 64 4e 6f 64 65 28 70 50 61 72 73 65 2c 20 4a  ddNode(pParse, J
8190: 53 4f 4e 5f 4f 42 4a 45 43 54 2c 20 32 2c 20 30  SON_OBJECT, 2, 0
81a0: 29 3b 0a 20 20 20 20 20 20 69 4c 61 62 65 6c 20  );.      iLabel 
81b0: 3d 20 6a 73 6f 6e 50 61 72 73 65 41 64 64 4e 6f  = jsonParseAddNo
81c0: 64 65 28 70 50 61 72 73 65 2c 20 4a 53 4f 4e 5f  de(pParse, JSON_
81d0: 53 54 52 49 4e 47 2c 20 69 2c 20 7a 50 61 74 68  STRING, i, zPath
81e0: 29 3b 0a 20 20 20 20 20 20 7a 50 61 74 68 20 2b  );.      zPath +
81f0: 3d 20 69 3b 0a 20 20 20 20 20 20 70 4e 6f 64 65  = i;.      pNode
8200: 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 41 70 70   = jsonLookupApp
8210: 65 6e 64 28 70 50 61 72 73 65 2c 20 7a 50 61 74  end(pParse, zPat
8220: 68 2c 20 70 41 70 6e 64 2c 20 70 7a 45 72 72 29  h, pApnd, pzErr)
8230: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72  ;.      if( pPar
8240: 73 65 2d 3e 6f 6f 6d 20 29 20 72 65 74 75 72 6e  se->oom ) return
8250: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e   0;.      if( pN
8260: 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ode ){.        p
8270: 52 6f 6f 74 20 3d 20 26 70 50 61 72 73 65 2d 3e  Root = &pParse->
8280: 61 4e 6f 64 65 5b 69 52 6f 6f 74 5d 3b 0a 20 20  aNode[iRoot];.  
8290: 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 75 2e 69        pRoot->u.i
82a0: 41 70 70 65 6e 64 20 3d 20 69 53 74 61 72 74 20  Append = iStart 
82b0: 2d 20 69 52 6f 6f 74 3b 0a 20 20 20 20 20 20 20  - iRoot;.       
82c0: 20 70 52 6f 6f 74 2d 3e 6a 6e 46 6c 61 67 73 20   pRoot->jnFlags 
82d0: 7c 3d 20 4a 4e 4f 44 45 5f 41 50 50 45 4e 44 3b  |= JNODE_APPEND;
82e0: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
82f0: 3e 61 4e 6f 64 65 5b 69 4c 61 62 65 6c 5d 2e 6a  >aNode[iLabel].j
8300: 6e 46 6c 61 67 73 20 7c 3d 20 4a 4e 4f 44 45 5f  nFlags |= JNODE_
8310: 52 41 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  RAW;.      }.   
8320: 20 20 20 72 65 74 75 72 6e 20 70 4e 6f 64 65 3b     return pNode;
8330: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
8340: 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 5b 27  f( zPath[0]=='['
8350: 20 26 26 20 73 61 66 65 5f 69 73 64 69 67 69 74   && safe_isdigit
8360: 28 7a 50 61 74 68 5b 31 5d 29 20 29 7b 0a 20 20  (zPath[1]) ){.  
8370: 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 65 54 79    if( pRoot->eTy
8380: 70 65 21 3d 4a 53 4f 4e 5f 41 52 52 41 59 20 29  pe!=JSON_ARRAY )
8390: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69   return 0;.    i
83a0: 20 3d 20 30 3b 0a 20 20 20 20 6a 20 3d 20 31 3b   = 0;.    j = 1;
83b0: 0a 20 20 20 20 77 68 69 6c 65 28 20 73 61 66 65  .    while( safe
83c0: 5f 69 73 64 69 67 69 74 28 7a 50 61 74 68 5b 6a  _isdigit(zPath[j
83d0: 5d 29 20 29 7b 0a 20 20 20 20 20 20 69 20 3d 20  ]) ){.      i = 
83e0: 69 2a 31 30 20 2b 20 7a 50 61 74 68 5b 6a 5d 20  i*10 + zPath[j] 
83f0: 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 6a 2b 2b  - '0';.      j++
8400: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
8410: 7a 50 61 74 68 5b 6a 5d 21 3d 27 5d 27 20 29 7b  zPath[j]!=']' ){
8420: 0a 20 20 20 20 20 20 2a 70 7a 45 72 72 20 3d 20  .      *pzErr = 
8430: 7a 50 61 74 68 3b 0a 20 20 20 20 20 20 72 65 74  zPath;.      ret
8440: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
8450: 20 7a 50 61 74 68 20 2b 3d 20 6a 20 2b 20 31 3b   zPath += j + 1;
8460: 0a 20 20 20 20 6a 20 3d 20 31 3b 0a 20 20 20 20  .    j = 1;.    
8470: 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 77  for(;;){.      w
8480: 68 69 6c 65 28 20 6a 3c 3d 70 52 6f 6f 74 2d 3e  hile( j<=pRoot->
8490: 6e 20 26 26 20 28 69 3e 30 20 7c 7c 20 28 70 52  n && (i>0 || (pR
84a0: 6f 6f 74 5b 6a 5d 2e 6a 6e 46 6c 61 67 73 20 26  oot[j].jnFlags &
84b0: 20 4a 4e 4f 44 45 5f 52 45 4d 4f 56 45 29 21 3d   JNODE_REMOVE)!=
84c0: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  0) ){.        if
84d0: 28 20 28 70 52 6f 6f 74 5b 6a 5d 2e 6a 6e 46 6c  ( (pRoot[j].jnFl
84e0: 61 67 73 20 26 20 4a 4e 4f 44 45 5f 52 45 4d 4f  ags & JNODE_REMO
84f0: 56 45 29 3d 3d 30 20 29 20 69 2d 2d 3b 0a 20 20  VE)==0 ) i--;.  
8500: 20 20 20 20 20 20 6a 20 2b 3d 20 6a 73 6f 6e 4e        j += jsonN
8510: 6f 64 65 53 69 7a 65 28 26 70 52 6f 6f 74 5b 6a  odeSize(&pRoot[j
8520: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
8530: 20 20 69 66 28 20 28 70 52 6f 6f 74 2d 3e 6a 6e    if( (pRoot->jn
8540: 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 41 50  Flags & JNODE_AP
8550: 50 45 4e 44 29 3d 3d 30 20 29 20 62 72 65 61 6b  PEND)==0 ) break
8560: 3b 0a 20 20 20 20 20 20 69 52 6f 6f 74 20 2b 3d  ;.      iRoot +=
8570: 20 70 52 6f 6f 74 2d 3e 75 2e 69 41 70 70 65 6e   pRoot->u.iAppen
8580: 64 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 20 3d  d;.      pRoot =
8590: 20 26 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65 5b   &pParse->aNode[
85a0: 69 52 6f 6f 74 5d 3b 0a 20 20 20 20 20 20 6a 20  iRoot];.      j 
85b0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
85c0: 66 28 20 6a 3c 3d 70 52 6f 6f 74 2d 3e 6e 20 29  f( j<=pRoot->n )
85d0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6a  {.      return j
85e0: 73 6f 6e 4c 6f 6f 6b 75 70 53 74 65 70 28 70 50  sonLookupStep(pP
85f0: 61 72 73 65 2c 20 69 52 6f 6f 74 2b 6a 2c 20 7a  arse, iRoot+j, z
8600: 50 61 74 68 2c 20 70 41 70 6e 64 2c 20 70 7a 45  Path, pApnd, pzE
8610: 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  rr);.    }.    i
8620: 66 28 20 69 3d 3d 30 20 26 26 20 70 41 70 6e 64  f( i==0 && pApnd
8630: 20 29 7b 0a 20 20 20 20 20 20 75 33 32 20 69 53   ){.      u32 iS
8640: 74 61 72 74 3b 0a 20 20 20 20 20 20 4a 73 6f 6e  tart;.      Json
8650: 4e 6f 64 65 20 2a 70 4e 6f 64 65 3b 0a 20 20 20  Node *pNode;.   
8660: 20 20 20 69 53 74 61 72 74 20 3d 20 6a 73 6f 6e     iStart = json
8670: 50 61 72 73 65 41 64 64 4e 6f 64 65 28 70 50 61  ParseAddNode(pPa
8680: 72 73 65 2c 20 4a 53 4f 4e 5f 41 52 52 41 59 2c  rse, JSON_ARRAY,
8690: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e   1, 0);.      pN
86a0: 6f 64 65 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75 70  ode = jsonLookup
86b0: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 7a  Append(pParse, z
86c0: 50 61 74 68 2c 20 70 41 70 6e 64 2c 20 70 7a 45  Path, pApnd, pzE
86d0: 72 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  rr);.      if( p
86e0: 50 61 72 73 65 2d 3e 6f 6f 6d 20 29 20 72 65 74  Parse->oom ) ret
86f0: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 69 66 28  urn 0;.      if(
8700: 20 70 4e 6f 64 65 20 29 7b 0a 20 20 20 20 20 20   pNode ){.      
8710: 20 20 70 52 6f 6f 74 20 3d 20 26 70 50 61 72 73    pRoot = &pPars
8720: 65 2d 3e 61 4e 6f 64 65 5b 69 52 6f 6f 74 5d 3b  e->aNode[iRoot];
8730: 0a 20 20 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e  .        pRoot->
8740: 75 2e 69 41 70 70 65 6e 64 20 3d 20 69 53 74 61  u.iAppend = iSta
8750: 72 74 20 2d 20 69 52 6f 6f 74 3b 0a 20 20 20 20  rt - iRoot;.    
8760: 20 20 20 20 70 52 6f 6f 74 2d 3e 6a 6e 46 6c 61      pRoot->jnFla
8770: 67 73 20 7c 3d 20 4a 4e 4f 44 45 5f 41 50 50 45  gs |= JNODE_APPE
8780: 4e 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ND;.      }.    
8790: 20 20 72 65 74 75 72 6e 20 70 4e 6f 64 65 3b 0a    return pNode;.
87a0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
87b0: 20 20 20 2a 70 7a 45 72 72 20 3d 20 7a 50 61 74     *pzErr = zPat
87c0: 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  h;.  }.  return 
87d0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  0;.}../*.** Appe
87e0: 6e 64 20 63 6f 6e 74 65 6e 74 20 74 6f 20 70 50  nd content to pP
87f0: 61 72 73 65 20 74 68 61 74 20 77 69 6c 6c 20 63  arse that will c
8800: 6f 6d 70 6c 65 74 65 20 7a 50 61 74 68 2e 20 20  omplete zPath.  
8810: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
8820: 0a 2a 2a 20 74 6f 20 74 68 65 20 69 6e 73 65 72  .** to the inser
8830: 74 65 64 20 6e 6f 64 65 2c 20 6f 72 20 72 65 74  ted node, or ret
8840: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 20  urn NULL if the 
8850: 61 70 70 65 6e 64 20 66 61 69 6c 73 2e 0a 2a 2f  append fails..*/
8860: 0a 73 74 61 74 69 63 20 4a 73 6f 6e 4e 6f 64 65  .static JsonNode
8870: 20 2a 6a 73 6f 6e 4c 6f 6f 6b 75 70 41 70 70 65   *jsonLookupAppe
8880: 6e 64 28 0a 20 20 4a 73 6f 6e 50 61 72 73 65 20  nd(.  JsonParse 
8890: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20  *pParse,     /* 
88a0: 41 70 70 65 6e 64 20 63 6f 6e 74 65 6e 74 20 74  Append content t
88b0: 6f 20 74 68 65 20 4a 53 4f 4e 20 70 61 72 73 65  o the JSON parse
88c0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
88d0: 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 2f 2a 20   *zPath,     /* 
88e0: 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 63  Description of c
88f0: 6f 6e 74 65 6e 74 20 74 6f 20 61 70 70 65 6e 64  ontent to append
8900: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 70 6e 64   */.  int *pApnd
8910: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
8920: 53 65 74 20 74 68 69 73 20 66 6c 61 67 20 74 6f  Set this flag to
8930: 20 31 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68   1 */.  const ch
8940: 61 72 20 2a 2a 70 7a 45 72 72 20 20 20 20 20 2f  ar **pzErr     /
8950: 2a 20 4d 61 6b 65 20 74 68 69 73 20 70 6f 69 6e  * Make this poin
8960: 74 20 74 6f 20 61 6e 79 20 73 79 6e 74 61 78 20  t to any syntax 
8970: 65 72 72 6f 72 20 2a 2f 0a 29 7b 0a 20 20 2a 70  error */.){.  *p
8980: 41 70 6e 64 20 3d 20 31 3b 0a 20 20 69 66 28 20  Apnd = 1;.  if( 
8990: 7a 50 61 74 68 5b 30 5d 3d 3d 30 20 29 7b 0a 20  zPath[0]==0 ){. 
89a0: 20 20 20 6a 73 6f 6e 50 61 72 73 65 41 64 64 4e     jsonParseAddN
89b0: 6f 64 65 28 70 50 61 72 73 65 2c 20 4a 53 4f 4e  ode(pParse, JSON
89c0: 5f 4e 55 4c 4c 2c 20 30 2c 20 30 29 3b 0a 20 20  _NULL, 0, 0);.  
89d0: 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d    return pParse-
89e0: 3e 6f 6f 6d 20 3f 20 30 20 3a 20 26 70 50 61 72  >oom ? 0 : &pPar
89f0: 73 65 2d 3e 61 4e 6f 64 65 5b 70 50 61 72 73 65  se->aNode[pParse
8a00: 2d 3e 6e 4e 6f 64 65 2d 31 5d 3b 0a 20 20 7d 0a  ->nNode-1];.  }.
8a10: 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d    if( zPath[0]==
8a20: 27 2e 27 20 29 7b 0a 20 20 20 20 6a 73 6f 6e 50  '.' ){.    jsonP
8a30: 61 72 73 65 41 64 64 4e 6f 64 65 28 70 50 61 72  arseAddNode(pPar
8a40: 73 65 2c 20 4a 53 4f 4e 5f 4f 42 4a 45 43 54 2c  se, JSON_OBJECT,
8a50: 20 30 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20   0, 0);.  }else 
8a60: 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 50 61 74  if( strncmp(zPat
8a70: 68 2c 22 5b 30 5d 22 2c 33 29 3d 3d 30 20 29 7b  h,"[0]",3)==0 ){
8a80: 0a 20 20 20 20 6a 73 6f 6e 50 61 72 73 65 41 64  .    jsonParseAd
8a90: 64 4e 6f 64 65 28 70 50 61 72 73 65 2c 20 4a 53  dNode(pParse, JS
8aa0: 4f 4e 5f 41 52 52 41 59 2c 20 30 2c 20 30 29 3b  ON_ARRAY, 0, 0);
8ab0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
8ac0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
8ad0: 28 20 70 50 61 72 73 65 2d 3e 6f 6f 6d 20 29 20  ( pParse->oom ) 
8ae0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
8af0: 72 6e 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 53 74 65  rn jsonLookupSte
8b00: 70 28 70 50 61 72 73 65 2c 20 70 50 61 72 73 65  p(pParse, pParse
8b10: 2d 3e 6e 4e 6f 64 65 2d 31 2c 20 7a 50 61 74 68  ->nNode-1, zPath
8b20: 2c 20 70 41 70 6e 64 2c 20 70 7a 45 72 72 29 3b  , pApnd, pzErr);
8b30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
8b40: 20 74 68 65 20 74 65 78 74 20 6f 66 20 61 20 73   the text of a s
8b50: 79 6e 74 61 78 20 65 72 72 6f 72 20 6d 65 73 73  yntax error mess
8b60: 61 67 65 20 6f 6e 20 61 20 4a 53 4f 4e 20 70 61  age on a JSON pa
8b70: 74 68 2e 20 20 53 70 61 63 65 20 69 73 0a 2a 2a  th.  Space is.**
8b80: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
8b90: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
8ba0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
8bb0: 2a 6a 73 6f 6e 50 61 74 68 53 79 6e 74 61 78 45  *jsonPathSyntaxE
8bc0: 72 72 6f 72 28 63 6f 6e 73 74 20 63 68 61 72 20  rror(const char 
8bd0: 2a 7a 45 72 72 29 7b 0a 20 20 72 65 74 75 72 6e  *zErr){.  return
8be0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
8bf0: 28 22 4a 53 4f 4e 20 70 61 74 68 20 65 72 72 6f  ("JSON path erro
8c00: 72 20 6e 65 61 72 20 27 25 71 27 22 2c 20 7a 45  r near '%q'", zE
8c10: 72 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f  rr);.}../*.** Do
8c20: 20 61 20 6e 6f 64 65 20 6c 6f 6f 6b 75 70 20 75   a node lookup u
8c30: 73 69 6e 67 20 7a 50 61 74 68 2e 20 20 52 65 74  sing zPath.  Ret
8c40: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
8c50: 20 74 68 65 20 6e 6f 64 65 20 6f 6e 20 73 75 63   the node on suc
8c60: 63 65 73 73 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  cess..** Return 
8c70: 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
8c80: 64 20 6f 72 20 69 66 20 74 68 65 72 65 20 69 73  d or if there is
8c90: 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a   an error..**.**
8ca0: 20 4f 6e 20 61 6e 20 65 72 72 6f 72 2c 20 77 72   On an error, wr
8cb0: 69 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ite an error mes
8cc0: 73 61 67 65 20 69 6e 74 6f 20 70 43 74 78 20 61  sage into pCtx a
8cd0: 6e 64 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  nd increment the
8ce0: 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  .** pParse->nErr
8cf0: 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20   counter..**.** 
8d00: 49 66 20 70 41 70 6e 64 21 3d 4e 55 4c 4c 20 74  If pApnd!=NULL t
8d10: 68 65 6e 20 74 72 79 20 74 6f 20 61 70 70 65 6e  hen try to appen
8d20: 64 20 6d 69 73 73 69 6e 67 20 6e 6f 64 65 73 20  d missing nodes 
8d30: 61 6e 64 20 73 65 74 20 2a 70 41 70 6e 64 20 3d  and set *pApnd =
8d40: 20 31 20 69 66 0a 2a 2a 20 6e 6f 64 65 73 20 61   1 if.** nodes a
8d50: 72 65 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a  re appended..*/.
8d60: 73 74 61 74 69 63 20 4a 73 6f 6e 4e 6f 64 65 20  static JsonNode 
8d70: 2a 6a 73 6f 6e 4c 6f 6f 6b 75 70 28 0a 20 20 4a  *jsonLookup(.  J
8d80: 73 6f 6e 50 61 72 73 65 20 2a 70 50 61 72 73 65  sonParse *pParse
8d90: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4a 53  ,      /* The JS
8da0: 4f 4e 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a  ON to search */.
8db0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
8dc0: 61 74 68 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ath,      /* The
8dd0: 20 70 61 74 68 20 74 6f 20 73 65 61 72 63 68 20   path to search 
8de0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 70 6e 64 2c  */.  int *pApnd,
8df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8e00: 41 70 70 65 6e 64 20 6e 6f 64 65 73 20 74 6f 20  Append nodes to 
8e10: 63 6f 6d 70 6c 65 74 65 20 70 61 74 68 20 69 66  complete path if
8e20: 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20 73   not NULL */.  s
8e30: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
8e40: 70 43 74 78 20 20 20 2f 2a 20 52 65 70 6f 72 74  pCtx   /* Report
8e50: 20 65 72 72 6f 72 73 20 68 65 72 65 2c 20 69 66   errors here, if
8e60: 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a   not NULL */.){.
8e70: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
8e80: 72 72 20 3d 20 30 3b 0a 20 20 4a 73 6f 6e 4e 6f  rr = 0;.  JsonNo
8e90: 64 65 20 2a 70 4e 6f 64 65 20 3d 20 30 3b 0a 20  de *pNode = 0;. 
8ea0: 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 0a 20 20   char *zMsg;..  
8eb0: 69 66 28 20 7a 50 61 74 68 3d 3d 30 20 29 20 72  if( zPath==0 ) r
8ec0: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 7a  eturn 0;.  if( z
8ed0: 50 61 74 68 5b 30 5d 21 3d 27 24 27 20 29 7b 0a  Path[0]!='$' ){.
8ee0: 20 20 20 20 7a 45 72 72 20 3d 20 7a 50 61 74 68      zErr = zPath
8ef0: 3b 0a 20 20 20 20 67 6f 74 6f 20 6c 6f 6f 6b 75  ;.    goto looku
8f00: 70 5f 65 72 72 3b 0a 20 20 7d 0a 20 20 7a 50 61  p_err;.  }.  zPa
8f10: 74 68 2b 2b 3b 0a 20 20 70 4e 6f 64 65 20 3d 20  th++;.  pNode = 
8f20: 6a 73 6f 6e 4c 6f 6f 6b 75 70 53 74 65 70 28 70  jsonLookupStep(p
8f30: 50 61 72 73 65 2c 20 30 2c 20 7a 50 61 74 68 2c  Parse, 0, zPath,
8f40: 20 70 41 70 6e 64 2c 20 26 7a 45 72 72 29 3b 0a   pApnd, &zErr);.
8f50: 20 20 69 66 28 20 7a 45 72 72 3d 3d 30 20 29 20    if( zErr==0 ) 
8f60: 72 65 74 75 72 6e 20 70 4e 6f 64 65 3b 0a 0a 6c  return pNode;..l
8f70: 6f 6f 6b 75 70 5f 65 72 72 3a 0a 20 20 70 50 61  ookup_err:.  pPa
8f80: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 61  rse->nErr++;.  a
8f90: 73 73 65 72 74 28 20 7a 45 72 72 21 3d 30 20 26  ssert( zErr!=0 &
8fa0: 26 20 70 43 74 78 21 3d 30 20 29 3b 0a 20 20 7a  & pCtx!=0 );.  z
8fb0: 4d 73 67 20 3d 20 6a 73 6f 6e 50 61 74 68 53 79  Msg = jsonPathSy
8fc0: 6e 74 61 78 45 72 72 6f 72 28 7a 45 72 72 29 3b  ntaxError(zErr);
8fd0: 0a 20 20 69 66 28 20 7a 4d 73 67 20 29 7b 0a 20  .  if( zMsg ){. 
8fe0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
8ff0: 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 7a 4d  t_error(pCtx, zM
9000: 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71 6c  sg, -1);.    sql
9010: 69 74 65 33 5f 66 72 65 65 28 7a 4d 73 67 29 3b  ite3_free(zMsg);
9020: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
9030: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
9040: 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78 29 3b 0a  or_nomem(pCtx);.
9050: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
9060: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74  }.../*.** Report
9070: 20 74 68 65 20 77 72 6f 6e 67 20 6e 75 6d 62 65   the wrong numbe
9080: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 66  r of arguments f
9090: 6f 72 20 6a 73 6f 6e 5f 69 6e 73 65 72 74 28 29  or json_insert()
90a0: 2c 20 6a 73 6f 6e 5f 72 65 70 6c 61 63 65 28 29  , json_replace()
90b0: 0a 2a 2a 20 6f 72 20 6a 73 6f 6e 5f 73 65 74 28  .** or json_set(
90c0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
90d0: 64 20 6a 73 6f 6e 57 72 6f 6e 67 4e 75 6d 41 72  d jsonWrongNumAr
90e0: 67 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  gs(.  sqlite3_co
90f0: 6e 74 65 78 74 20 2a 70 43 74 78 2c 0a 20 20 63  ntext *pCtx,.  c
9100: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
9110: 4e 61 6d 65 0a 29 7b 0a 20 20 63 68 61 72 20 2a  Name.){.  char *
9120: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zMsg = sqlite3_m
9130: 70 72 69 6e 74 66 28 22 6a 73 6f 6e 5f 25 73 28  printf("json_%s(
9140: 29 20 6e 65 65 64 73 20 61 6e 20 6f 64 64 20 6e  ) needs an odd n
9150: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
9160: 74 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ts",.           
9170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9180: 20 20 20 20 7a 46 75 6e 63 4e 61 6d 65 29 3b 0a      zFuncName);.
9190: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
91a0: 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 7a 4d 73  _error(pCtx, zMs
91b0: 67 2c 20 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65  g, -1);.  sqlite
91c0: 33 5f 66 72 65 65 28 7a 4d 73 67 29 3b 20 20 20  3_free(zMsg);   
91d0: 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b    .}../*.** Mark
91e0: 20 61 6c 6c 20 4e 55 4c 4c 20 65 6e 74 72 69 65   all NULL entrie
91f0: 73 20 69 6e 20 74 68 65 20 4f 62 6a 65 63 74 20  s in the Object 
9200: 70 61 73 73 65 64 20 69 6e 20 61 73 20 4a 4e 4f  passed in as JNO
9210: 44 45 5f 52 45 4d 4f 56 45 2e 0a 2a 2f 0a 73 74  DE_REMOVE..*/.st
9220: 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 52 65  atic void jsonRe
9230: 6d 6f 76 65 41 6c 6c 4e 75 6c 6c 73 28 4a 73 6f  moveAllNulls(Jso
9240: 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 29 7b 0a 20  nNode *pNode){. 
9250: 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 61 73 73   int i, n;.  ass
9260: 65 72 74 28 20 70 4e 6f 64 65 2d 3e 65 54 79 70  ert( pNode->eTyp
9270: 65 3d 3d 4a 53 4f 4e 5f 4f 42 4a 45 43 54 20 29  e==JSON_OBJECT )
9280: 3b 0a 20 20 6e 20 3d 20 70 4e 6f 64 65 2d 3e 6e  ;.  n = pNode->n
9290: 3b 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 3d  ;.  for(i=2; i<=
92a0: 6e 3b 20 69 20 2b 3d 20 6a 73 6f 6e 4e 6f 64 65  n; i += jsonNode
92b0: 53 69 7a 65 28 26 70 4e 6f 64 65 5b 69 5d 29 2b  Size(&pNode[i])+
92c0: 31 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20  1){.    switch( 
92d0: 70 4e 6f 64 65 5b 69 5d 2e 65 54 79 70 65 20 29  pNode[i].eType )
92e0: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4a 53 4f  {.      case JSO
92f0: 4e 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20 20 20 20  N_NULL:.        
9300: 70 4e 6f 64 65 5b 69 5d 2e 6a 6e 46 6c 61 67 73  pNode[i].jnFlags
9310: 20 7c 3d 20 4a 4e 4f 44 45 5f 52 45 4d 4f 56 45   |= JNODE_REMOVE
9320: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
9330: 0a 20 20 20 20 20 20 63 61 73 65 20 4a 53 4f 4e  .      case JSON
9340: 5f 4f 42 4a 45 43 54 3a 0a 20 20 20 20 20 20 20  _OBJECT:.       
9350: 20 6a 73 6f 6e 52 65 6d 6f 76 65 41 6c 6c 4e 75   jsonRemoveAllNu
9360: 6c 6c 73 28 26 70 4e 6f 64 65 5b 69 5d 29 3b 0a  lls(&pNode[i]);.
9370: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9380: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 2a     }.  }.}.../**
9390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
93a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
93b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
93c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
93d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 53 51  **********.** SQ
93e0: 4c 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65 64  L functions used
93f0: 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
9400: 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a 2a 2a 2a   debugging.*****
9410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9450: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66 64 65 66  *******/..#ifdef
9460: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
9470: 0a 2a 2a 20 54 68 65 20 6a 73 6f 6e 5f 70 61 72  .** The json_par
9480: 73 65 28 4a 53 4f 4e 29 20 66 75 6e 63 74 69 6f  se(JSON) functio
9490: 6e 20 72 65 74 75 72 6e 73 20 61 20 73 74 72 69  n returns a stri
94a0: 6e 67 20 77 68 69 63 68 20 64 65 73 63 72 69 62  ng which describ
94b0: 65 73 0a 2a 2a 20 61 20 70 61 72 73 65 20 6f 66  es.** a parse of
94c0: 20 74 68 65 20 4a 53 4f 4e 20 70 72 6f 76 69 64   the JSON provid
94d0: 65 64 2e 20 20 4f 72 20 69 74 20 72 65 74 75 72  ed.  Or it retur
94e0: 6e 73 20 4e 55 4c 4c 20 69 66 20 4a 53 4f 4e 20  ns NULL if JSON 
94f0: 69 73 20 6e 6f 74 0a 2a 2a 20 77 65 6c 6c 2d 66  is not.** well-f
9500: 6f 72 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ormed..*/.static
9510: 20 76 6f 69 64 20 6a 73 6f 6e 50 61 72 73 65 46   void jsonParseF
9520: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
9530: 6f 6e 74 65 78 74 20 2a 63 74 78 2c 0a 20 20 69  ontext *ctx,.  i
9540: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
9550: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
9560: 29 7b 0a 20 20 4a 73 6f 6e 53 74 72 69 6e 67 20  ){.  JsonString 
9570: 73 3b 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70  s;       /* Outp
9580: 75 74 20 73 74 72 69 6e 67 20 2d 20 6e 6f 74 20  ut string - not 
9590: 72 65 61 6c 20 4a 53 4f 4e 20 2a 2f 0a 20 20 4a  real JSON */.  J
95a0: 73 6f 6e 50 61 72 73 65 20 78 3b 20 20 20 20 20  sonParse x;     
95b0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 20     /* The parse 
95c0: 2a 2f 0a 20 20 75 33 32 20 69 3b 0a 0a 20 20 61  */.  u32 i;..  a
95d0: 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 29  ssert( argc==1 )
95e0: 3b 0a 20 20 69 66 28 20 6a 73 6f 6e 50 61 72 73  ;.  if( jsonPars
95f0: 65 28 26 78 2c 20 63 74 78 2c 20 28 63 6f 6e 73  e(&x, ctx, (cons
9600: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
9610: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
9620: 30 5d 29 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  0])) ) return;. 
9630: 20 6a 73 6f 6e 50 61 72 73 65 46 69 6e 64 50 61   jsonParseFindPa
9640: 72 65 6e 74 73 28 26 78 29 3b 0a 20 20 6a 73 6f  rents(&x);.  jso
9650: 6e 49 6e 69 74 28 26 73 2c 20 63 74 78 29 3b 0a  nInit(&s, ctx);.
9660: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 2e 6e    for(i=0; i<x.n
9670: 4e 6f 64 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Node; i++){.    
9680: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
9690: 65 3b 0a 20 20 20 20 69 66 28 20 78 2e 61 4e 6f  e;.    if( x.aNo
96a0: 64 65 5b 69 5d 2e 6a 6e 46 6c 61 67 73 20 26 20  de[i].jnFlags & 
96b0: 4a 4e 4f 44 45 5f 4c 41 42 45 4c 20 29 7b 0a 20  JNODE_LABEL ){. 
96c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 78 2e 61       assert( x.a
96d0: 4e 6f 64 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 4a  Node[i].eType==J
96e0: 53 4f 4e 5f 53 54 52 49 4e 47 20 29 3b 0a 20 20  SON_STRING );.  
96f0: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 6c 61 62      zType = "lab
9700: 65 6c 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  el";.    }else{.
9710: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 6a 73        zType = js
9720: 6f 6e 54 79 70 65 5b 78 2e 61 4e 6f 64 65 5b 69  onType[x.aNode[i
9730: 5d 2e 65 54 79 70 65 5d 3b 0a 20 20 20 20 7d 0a  ].eType];.    }.
9740: 20 20 20 20 6a 73 6f 6e 50 72 69 6e 74 66 28 31      jsonPrintf(1
9750: 30 30 2c 20 26 73 2c 22 6e 6f 64 65 20 25 33 75  00, &s,"node %3u
9760: 3a 20 25 37 73 20 6e 3d 25 2d 34 64 20 75 70 3d  : %7s n=%-4d up=
9770: 25 2d 34 64 22 2c 0a 20 20 20 20 20 20 20 20 20  %-4d",.         
9780: 20 20 20 20 20 20 69 2c 20 7a 54 79 70 65 2c 20        i, zType, 
9790: 78 2e 61 4e 6f 64 65 5b 69 5d 2e 6e 2c 20 78 2e  x.aNode[i].n, x.
97a0: 61 55 70 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28  aUp[i]);.    if(
97b0: 20 78 2e 61 4e 6f 64 65 5b 69 5d 2e 75 2e 7a 4a   x.aNode[i].u.zJ
97c0: 43 6f 6e 74 65 6e 74 21 3d 30 20 29 7b 0a 20 20  Content!=0 ){.  
97d0: 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 52 61      jsonAppendRa
97e0: 77 28 26 73 2c 20 22 20 22 2c 20 31 29 3b 0a 20  w(&s, " ", 1);. 
97f0: 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 52       jsonAppendR
9800: 61 77 28 26 73 2c 20 78 2e 61 4e 6f 64 65 5b 69  aw(&s, x.aNode[i
9810: 5d 2e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 2c 20 78  ].u.zJContent, x
9820: 2e 61 4e 6f 64 65 5b 69 5d 2e 6e 29 3b 0a 20 20  .aNode[i].n);.  
9830: 20 20 7d 0a 20 20 20 20 6a 73 6f 6e 41 70 70 65    }.    jsonAppe
9840: 6e 64 52 61 77 28 26 73 2c 20 22 5c 6e 22 2c 20  ndRaw(&s, "\n", 
9850: 31 29 3b 0a 20 20 7d 0a 20 20 6a 73 6f 6e 50 61  1);.  }.  jsonPa
9860: 72 73 65 52 65 73 65 74 28 26 78 29 3b 0a 20 20  rseReset(&x);.  
9870: 6a 73 6f 6e 52 65 73 75 6c 74 28 26 73 29 3b 0a  jsonResult(&s);.
9880: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 73 6f  }../*.** The jso
9890: 6e 5f 74 65 73 74 31 28 4a 53 4f 4e 29 20 66 75  n_test1(JSON) fu
98a0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 74 72  nction return tr
98b0: 75 65 20 28 31 29 20 69 66 20 74 68 65 20 69 6e  ue (1) if the in
98c0: 70 75 74 20 69 73 20 4a 53 4f 4e 0a 2a 2a 20 74  put is JSON.** t
98d0: 65 78 74 20 67 65 6e 65 72 61 74 65 64 20 62 79  ext generated by
98e0: 20 61 6e 6f 74 68 65 72 20 6a 73 6f 6e 20 66 75   another json fu
98f0: 6e 63 74 69 6f 6e 2e 20 20 49 74 20 72 65 74 75  nction.  It retu
9900: 72 6e 73 20 28 30 29 20 69 66 20 74 68 65 20 69  rns (0) if the i
9910: 6e 70 75 74 0a 2a 2a 20 69 73 20 6e 6f 74 20 6b  nput.** is not k
9920: 6e 6f 77 6e 20 74 6f 20 62 65 20 4a 53 4f 4e 2e  nown to be JSON.
9930: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9940: 6a 73 6f 6e 54 65 73 74 31 46 75 6e 63 28 0a 20  jsonTest1Func(. 
9950: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
9960: 20 2a 63 74 78 2c 0a 20 20 69 6e 74 20 61 72 67   *ctx,.  int arg
9970: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
9980: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 55  ue **argv.){.  U
9990: 4e 55 53 45 44 5f 50 41 52 41 4d 28 61 72 67 63  NUSED_PARAM(argc
99a0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
99b0: 75 6c 74 5f 69 6e 74 28 63 74 78 2c 20 73 71 6c  ult_int(ctx, sql
99c0: 69 74 65 33 5f 76 61 6c 75 65 5f 73 75 62 74 79  ite3_value_subty
99d0: 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d 4a 53 4f  pe(argv[0])==JSO
99e0: 4e 5f 53 55 42 54 59 50 45 29 3b 0a 7d 0a 23 65  N_SUBTYPE);.}.#e
99f0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44  ndif /* SQLITE_D
9a00: 45 42 55 47 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  EBUG */../******
9a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9a50: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 53 63 61 6c 61 72  ******.** Scalar
9a60: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 69 6d   SQL function im
9a70: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a  plementations.**
9a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
9ad0: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
9ae0: 6e 20 6f 66 20 74 68 65 20 6a 73 6f 6e 5f 51 55  n of the json_QU
9af0: 4f 54 45 28 56 41 4c 55 45 29 20 66 75 6e 63 74  OTE(VALUE) funct
9b00: 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 20 4a  ion.  Return a J
9b10: 53 4f 4e 20 76 61 6c 75 65 0a 2a 2a 20 63 6f 72  SON value.** cor
9b20: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
9b30: 65 20 53 51 4c 20 76 61 6c 75 65 20 69 6e 70 75  e SQL value inpu
9b40: 74 2e 20 20 4d 6f 73 74 6c 79 20 74 68 69 73 20  t.  Mostly this 
9b50: 6d 65 61 6e 73 20 70 75 74 74 69 6e 67 20 0a 2a  means putting .*
9b60: 2a 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 20  * double-quotes 
9b70: 61 72 6f 75 6e 64 20 73 74 72 69 6e 67 73 20 61  around strings a
9b80: 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 74 68 65  nd returning the
9b90: 20 75 6e 71 75 6f 74 65 64 20 73 74 72 69 6e 67   unquoted string
9ba0: 20 22 6e 75 6c 6c 22 0a 2a 2a 20 77 68 65 6e 20   "null".** when 
9bb0: 67 69 76 65 6e 20 61 20 4e 55 4c 4c 20 69 6e 70  given a NULL inp
9bc0: 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ut..*/.static vo
9bd0: 69 64 20 6a 73 6f 6e 51 75 6f 74 65 46 75 6e 63  id jsonQuoteFunc
9be0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
9bf0: 65 78 74 20 2a 63 74 78 2c 0a 20 20 69 6e 74 20  ext *ctx,.  int 
9c00: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
9c10: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
9c20: 20 20 4a 73 6f 6e 53 74 72 69 6e 67 20 6a 78 3b    JsonString jx;
9c30: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28  .  UNUSED_PARAM(
9c40: 61 72 67 63 29 3b 0a 0a 20 20 6a 73 6f 6e 49 6e  argc);..  jsonIn
9c50: 69 74 28 26 6a 78 2c 20 63 74 78 29 3b 0a 20 20  it(&jx, ctx);.  
9c60: 6a 73 6f 6e 41 70 70 65 6e 64 56 61 6c 75 65 28  jsonAppendValue(
9c70: 26 6a 78 2c 20 61 72 67 76 5b 30 5d 29 3b 0a 20  &jx, argv[0]);. 
9c80: 20 6a 73 6f 6e 52 65 73 75 6c 74 28 26 6a 78 29   jsonResult(&jx)
9c90: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
9ca0: 6c 74 5f 73 75 62 74 79 70 65 28 63 74 78 2c 20  lt_subtype(ctx, 
9cb0: 4a 53 4f 4e 5f 53 55 42 54 59 50 45 29 3b 0a 7d  JSON_SUBTYPE);.}
9cc0: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
9cd0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 73  tation of the js
9ce0: 6f 6e 5f 61 72 72 61 79 28 56 41 4c 55 45 2c 2e  on_array(VALUE,.
9cf0: 2e 2e 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 52  ..) function.  R
9d00: 65 74 75 72 6e 20 61 20 4a 53 4f 4e 0a 2a 2a 20  eturn a JSON.** 
9d10: 61 72 72 61 79 20 74 68 61 74 20 63 6f 6e 74 61  array that conta
9d20: 69 6e 73 20 61 6c 6c 20 76 61 6c 75 65 73 20 67  ins all values g
9d30: 69 76 65 6e 20 69 6e 20 61 72 67 75 6d 65 6e 74  iven in argument
9d40: 73 2e 20 20 4f 72 20 69 66 20 61 6e 79 20 61 72  s.  Or if any ar
9d50: 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 61 20 42  gument.** is a B
9d60: 4c 4f 42 2c 20 74 68 72 6f 77 20 61 6e 20 65 72  LOB, throw an er
9d70: 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ror..*/.static v
9d80: 6f 69 64 20 6a 73 6f 6e 41 72 72 61 79 46 75 6e  oid jsonArrayFun
9d90: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
9da0: 74 65 78 74 20 2a 63 74 78 2c 0a 20 20 69 6e 74  text *ctx,.  int
9db0: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
9dc0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
9dd0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4a 73 6f 6e  .  int i;.  Json
9de0: 53 74 72 69 6e 67 20 6a 78 3b 0a 0a 20 20 6a 73  String jx;..  js
9df0: 6f 6e 49 6e 69 74 28 26 6a 78 2c 20 63 74 78 29  onInit(&jx, ctx)
9e00: 3b 0a 20 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68  ;.  jsonAppendCh
9e10: 61 72 28 26 6a 78 2c 20 27 5b 27 29 3b 0a 20 20  ar(&jx, '[');.  
9e20: 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b  for(i=0; i<argc;
9e30: 20 69 2b 2b 29 7b 0a 20 20 20 20 6a 73 6f 6e 41   i++){.    jsonA
9e40: 70 70 65 6e 64 53 65 70 61 72 61 74 6f 72 28 26  ppendSeparator(&
9e50: 6a 78 29 3b 0a 20 20 20 20 6a 73 6f 6e 41 70 70  jx);.    jsonApp
9e60: 65 6e 64 56 61 6c 75 65 28 26 6a 78 2c 20 61 72  endValue(&jx, ar
9e70: 67 76 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 6a 73  gv[i]);.  }.  js
9e80: 6f 6e 41 70 70 65 6e 64 43 68 61 72 28 26 6a 78  onAppendChar(&jx
9e90: 2c 20 27 5d 27 29 3b 0a 20 20 6a 73 6f 6e 52 65  , ']');.  jsonRe
9ea0: 73 75 6c 74 28 26 6a 78 29 3b 0a 20 20 73 71 6c  sult(&jx);.  sql
9eb0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 73 75 62 74  ite3_result_subt
9ec0: 79 70 65 28 63 74 78 2c 20 4a 53 4f 4e 5f 53 55  ype(ctx, JSON_SU
9ed0: 42 54 59 50 45 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  BTYPE);.}.../*.*
9ee0: 2a 20 6a 73 6f 6e 5f 61 72 72 61 79 5f 6c 65 6e  * json_array_len
9ef0: 67 74 68 28 4a 53 4f 4e 29 0a 2a 2a 20 6a 73 6f  gth(JSON).** jso
9f00: 6e 5f 61 72 72 61 79 5f 6c 65 6e 67 74 68 28 4a  n_array_length(J
9f10: 53 4f 4e 2c 20 50 41 54 48 29 0a 2a 2a 0a 2a 2a  SON, PATH).**.**
9f20: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
9f30: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
9f40: 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20  n the top-level 
9f50: 4a 53 4f 4e 20 61 72 72 61 79 2e 20 20 0a 2a 2a  JSON array.  .**
9f60: 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   Return 0 if the
9f70: 20 69 6e 70 75 74 20 69 73 20 6e 6f 74 20 61 20   input is not a 
9f80: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 4a 53 4f 4e  well-formed JSON
9f90: 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69   array..*/.stati
9fa0: 63 20 76 6f 69 64 20 6a 73 6f 6e 41 72 72 61 79  c void jsonArray
9fb0: 4c 65 6e 67 74 68 46 75 6e 63 28 0a 20 20 73 71  LengthFunc(.  sq
9fc0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
9fd0: 74 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  tx,.  int argc,.
9fe0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
9ff0: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e  **argv.){.  Json
a000: 50 61 72 73 65 20 2a 70 3b 20 20 20 20 20 20 20  Parse *p;       
a010: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 20     /* The parse 
a020: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
a030: 36 34 20 6e 20 3d 20 30 3b 0a 20 20 75 33 32 20  64 n = 0;.  u32 
a040: 69 3b 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70  i;.  JsonNode *p
a050: 4e 6f 64 65 3b 0a 0a 20 20 70 20 3d 20 6a 73 6f  Node;..  p = jso
a060: 6e 50 61 72 73 65 43 61 63 68 65 64 28 63 74 78  nParseCached(ctx
a070: 2c 20 61 72 67 76 2c 20 63 74 78 29 3b 0a 20 20  , argv, ctx);.  
a080: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
a090: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  n;.  assert( p->
a0a0: 6e 4e 6f 64 65 20 29 3b 0a 20 20 69 66 28 20 61  nNode );.  if( a
a0b0: 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 63 6f  rgc==2 ){.    co
a0c0: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 20  nst char *zPath 
a0d0: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
a0e0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
a0f0: 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20  t(argv[1]);.    
a100: 70 4e 6f 64 65 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b  pNode = jsonLook
a110: 75 70 28 70 2c 20 7a 50 61 74 68 2c 20 30 2c 20  up(p, zPath, 0, 
a120: 63 74 78 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ctx);.  }else{. 
a130: 20 20 20 70 4e 6f 64 65 20 3d 20 70 2d 3e 61 4e     pNode = p->aN
a140: 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ode;.  }.  if( p
a150: 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Node==0 ){.    r
a160: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
a170: 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65 3d 3d 4a   pNode->eType==J
a180: 53 4f 4e 5f 41 52 52 41 59 20 29 7b 0a 20 20 20  SON_ARRAY ){.   
a190: 20 61 73 73 65 72 74 28 20 28 70 4e 6f 64 65 2d   assert( (pNode-
a1a0: 3e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45  >jnFlags & JNODE
a1b0: 5f 41 50 50 45 4e 44 29 3d 3d 30 20 29 3b 0a 20  _APPEND)==0 );. 
a1c0: 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70     for(i=1; i<=p
a1d0: 4e 6f 64 65 2d 3e 6e 3b 20 6e 2b 2b 29 7b 0a 20  Node->n; n++){. 
a1e0: 20 20 20 20 20 69 20 2b 3d 20 6a 73 6f 6e 4e 6f       i += jsonNo
a1f0: 64 65 53 69 7a 65 28 26 70 4e 6f 64 65 5b 69 5d  deSize(&pNode[i]
a200: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
a210: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
a220: 74 36 34 28 63 74 78 2c 20 6e 29 3b 0a 7d 0a 0a  t64(ctx, n);.}..
a230: 2f 2a 0a 2a 2a 20 6a 73 6f 6e 5f 65 78 74 72 61  /*.** json_extra
a240: 63 74 28 4a 53 4f 4e 2c 20 50 41 54 48 2c 20 2e  ct(JSON, PATH, .
a250: 2e 2e 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ..).**.** Return
a260: 20 74 68 65 20 65 6c 65 6d 65 6e 74 20 64 65 73   the element des
a270: 63 72 69 62 65 64 20 62 79 20 50 41 54 48 2e 20  cribed by PATH. 
a280: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
a290: 74 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 50  there is no.** P
a2a0: 41 54 48 20 65 6c 65 6d 65 6e 74 2e 20 20 49 66  ATH element.  If
a2b0: 20 74 68 65 72 65 20 61 72 65 20 6d 75 6c 74 69   there are multi
a2c0: 70 6c 65 20 50 41 54 48 73 2c 20 74 68 65 6e 20  ple PATHs, then 
a2d0: 72 65 74 75 72 6e 20 61 20 4a 53 4f 4e 20 61 72  return a JSON ar
a2e0: 72 61 79 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  ray.** with the 
a2f0: 72 65 73 75 6c 74 20 66 72 6f 6d 20 65 61 63 68  result from each
a300: 20 70 61 74 68 2e 20 20 54 68 72 6f 77 20 61 6e   path.  Throw an
a310: 20 65 72 72 6f 72 20 69 66 20 74 68 65 20 4a 53   error if the JS
a320: 4f 4e 20 6f 72 20 61 6e 79 20 50 41 54 48 0a 2a  ON or any PATH.*
a330: 2a 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 2e 0a  * is malformed..
a340: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a  */.static void j
a350: 73 6f 6e 45 78 74 72 61 63 74 46 75 6e 63 28 0a  sonExtractFunc(.
a360: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
a370: 74 20 2a 63 74 78 2c 0a 20 20 69 6e 74 20 61 72  t *ctx,.  int ar
a380: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
a390: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
a3a0: 4a 73 6f 6e 50 61 72 73 65 20 2a 70 3b 20 20 20  JsonParse *p;   
a3b0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
a3c0: 72 73 65 20 2a 2f 0a 20 20 4a 73 6f 6e 4e 6f 64  rse */.  JsonNod
a3d0: 65 20 2a 70 4e 6f 64 65 3b 0a 20 20 63 6f 6e 73  e *pNode;.  cons
a3e0: 74 20 63 68 61 72 20 2a 7a 50 61 74 68 3b 0a 20  t char *zPath;. 
a3f0: 20 4a 73 6f 6e 53 74 72 69 6e 67 20 6a 78 3b 0a   JsonString jx;.
a400: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20    int i;..  if( 
a410: 61 72 67 63 3c 32 20 29 20 72 65 74 75 72 6e 3b  argc<2 ) return;
a420: 0a 20 20 70 20 3d 20 6a 73 6f 6e 50 61 72 73 65  .  p = jsonParse
a430: 43 61 63 68 65 64 28 63 74 78 2c 20 61 72 67 76  Cached(ctx, argv
a440: 2c 20 63 74 78 29 3b 0a 20 20 69 66 28 20 70 3d  , ctx);.  if( p=
a450: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6a  =0 ) return;.  j
a460: 73 6f 6e 49 6e 69 74 28 26 6a 78 2c 20 63 74 78  sonInit(&jx, ctx
a470: 29 3b 0a 20 20 6a 73 6f 6e 41 70 70 65 6e 64 43  );.  jsonAppendC
a480: 68 61 72 28 26 6a 78 2c 20 27 5b 27 29 3b 0a 20  har(&jx, '[');. 
a490: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 61 72 67 63   for(i=1; i<argc
a4a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a 50 61 74  ; i++){.    zPat
a4b0: 68 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  h = (const char*
a4c0: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
a4d0: 65 78 74 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20  ext(argv[i]);.  
a4e0: 20 20 70 4e 6f 64 65 20 3d 20 6a 73 6f 6e 4c 6f    pNode = jsonLo
a4f0: 6f 6b 75 70 28 70 2c 20 7a 50 61 74 68 2c 20 30  okup(p, zPath, 0
a500: 2c 20 63 74 78 29 3b 0a 20 20 20 20 69 66 28 20  , ctx);.    if( 
a510: 70 2d 3e 6e 45 72 72 20 29 20 62 72 65 61 6b 3b  p->nErr ) break;
a520: 0a 20 20 20 20 69 66 28 20 61 72 67 63 3e 32 20  .    if( argc>2 
a530: 29 7b 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70 70  ){.      jsonApp
a540: 65 6e 64 53 65 70 61 72 61 74 6f 72 28 26 6a 78  endSeparator(&jx
a550: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 6f  );.      if( pNo
a560: 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 73  de ){.        js
a570: 6f 6e 52 65 6e 64 65 72 4e 6f 64 65 28 70 4e 6f  onRenderNode(pNo
a580: 64 65 2c 20 26 6a 78 2c 20 30 29 3b 0a 20 20 20  de, &jx, 0);.   
a590: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a5a0: 20 20 6a 73 6f 6e 41 70 70 65 6e 64 52 61 77 28    jsonAppendRaw(
a5b0: 26 6a 78 2c 20 22 6e 75 6c 6c 22 2c 20 34 29 3b  &jx, "null", 4);
a5c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
a5d0: 73 65 20 69 66 28 20 70 4e 6f 64 65 20 29 7b 0a  se if( pNode ){.
a5e0: 20 20 20 20 20 20 6a 73 6f 6e 52 65 74 75 72 6e        jsonReturn
a5f0: 28 70 4e 6f 64 65 2c 20 63 74 78 2c 20 30 29 3b  (pNode, ctx, 0);
a600: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
a610: 20 61 72 67 63 3e 32 20 26 26 20 69 3d 3d 61 72   argc>2 && i==ar
a620: 67 63 20 29 7b 0a 20 20 20 20 6a 73 6f 6e 41 70  gc ){.    jsonAp
a630: 70 65 6e 64 43 68 61 72 28 26 6a 78 2c 20 27 5d  pendChar(&jx, ']
a640: 27 29 3b 0a 20 20 20 20 6a 73 6f 6e 52 65 73 75  ');.    jsonResu
a650: 6c 74 28 26 6a 78 29 3b 0a 20 20 20 20 73 71 6c  lt(&jx);.    sql
a660: 69 74 65 33 5f 72 65 73 75 6c 74 5f 73 75 62 74  ite3_result_subt
a670: 79 70 65 28 63 74 78 2c 20 4a 53 4f 4e 5f 53 55  ype(ctx, JSON_SU
a680: 42 54 59 50 45 29 3b 0a 20 20 7d 0a 20 20 6a 73  BTYPE);.  }.  js
a690: 6f 6e 52 65 73 65 74 28 26 6a 78 29 3b 0a 7d 0a  onReset(&jx);.}.
a6a0: 0a 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  ./* This is the 
a6b0: 52 46 43 20 37 33 39 36 20 4d 65 72 67 65 50 61  RFC 7396 MergePa
a6c0: 74 63 68 20 61 6c 67 6f 72 69 74 68 6d 2e 0a 2a  tch algorithm..*
a6d0: 2f 0a 73 74 61 74 69 63 20 4a 73 6f 6e 4e 6f 64  /.static JsonNod
a6e0: 65 20 2a 6a 73 6f 6e 4d 65 72 67 65 50 61 74 63  e *jsonMergePatc
a6f0: 68 28 0a 20 20 4a 73 6f 6e 50 61 72 73 65 20 2a  h(.  JsonParse *
a700: 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 54 68 65  pParse,   /* The
a710: 20 4a 53 4f 4e 20 70 61 72 73 65 72 20 74 68 61   JSON parser tha
a720: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 54  t contains the T
a730: 41 52 47 45 54 20 2a 2f 0a 20 20 75 33 32 20 69  ARGET */.  u32 i
a740: 54 61 72 67 65 74 2c 20 20 20 20 20 20 20 20 20  Target,         
a750: 2f 2a 20 4e 6f 64 65 20 6f 66 20 74 68 65 20 54  /* Node of the T
a760: 41 52 47 45 54 20 69 6e 20 70 50 61 72 73 65 20  ARGET in pParse 
a770: 2a 2f 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70  */.  JsonNode *p
a780: 50 61 74 63 68 20 20 20 20 20 2f 2a 20 54 68 65  Patch     /* The
a790: 20 50 41 54 43 48 20 2a 2f 0a 29 7b 0a 20 20 75   PATCH */.){.  u
a7a0: 33 32 20 69 2c 20 6a 3b 0a 20 20 75 33 32 20 69  32 i, j;.  u32 i
a7b0: 52 6f 6f 74 3b 0a 20 20 4a 73 6f 6e 4e 6f 64 65  Root;.  JsonNode
a7c0: 20 2a 70 54 61 72 67 65 74 3b 0a 20 20 69 66 28   *pTarget;.  if(
a7d0: 20 70 50 61 74 63 68 2d 3e 65 54 79 70 65 21 3d   pPatch->eType!=
a7e0: 4a 53 4f 4e 5f 4f 42 4a 45 43 54 20 29 7b 0a 20  JSON_OBJECT ){. 
a7f0: 20 20 20 72 65 74 75 72 6e 20 70 50 61 74 63 68     return pPatch
a800: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
a810: 69 54 61 72 67 65 74 3e 3d 30 20 26 26 20 69 54  iTarget>=0 && iT
a820: 61 72 67 65 74 3c 70 50 61 72 73 65 2d 3e 6e 4e  arget<pParse->nN
a830: 6f 64 65 20 29 3b 0a 20 20 70 54 61 72 67 65 74  ode );.  pTarget
a840: 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 4e 6f 64   = &pParse->aNod
a850: 65 5b 69 54 61 72 67 65 74 5d 3b 0a 20 20 61 73  e[iTarget];.  as
a860: 73 65 72 74 28 20 28 70 50 61 74 63 68 2d 3e 6a  sert( (pPatch->j
a870: 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 41  nFlags & JNODE_A
a880: 50 50 45 4e 44 29 3d 3d 30 20 29 3b 0a 20 20 69  PPEND)==0 );.  i
a890: 66 28 20 70 54 61 72 67 65 74 2d 3e 65 54 79 70  f( pTarget->eTyp
a8a0: 65 21 3d 4a 53 4f 4e 5f 4f 42 4a 45 43 54 20 29  e!=JSON_OBJECT )
a8b0: 7b 0a 20 20 20 20 6a 73 6f 6e 52 65 6d 6f 76 65  {.    jsonRemove
a8c0: 41 6c 6c 4e 75 6c 6c 73 28 70 50 61 74 63 68 29  AllNulls(pPatch)
a8d0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61  ;.    return pPa
a8e0: 74 63 68 3b 0a 20 20 7d 0a 20 20 69 52 6f 6f 74  tch;.  }.  iRoot
a8f0: 20 3d 20 69 54 61 72 67 65 74 3b 0a 20 20 66 6f   = iTarget;.  fo
a900: 72 28 69 3d 31 3b 20 69 3c 70 50 61 74 63 68 2d  r(i=1; i<pPatch-
a910: 3e 6e 3b 20 69 20 2b 3d 20 6a 73 6f 6e 4e 6f 64  >n; i += jsonNod
a920: 65 53 69 7a 65 28 26 70 50 61 74 63 68 5b 69 2b  eSize(&pPatch[i+
a930: 31 5d 29 2b 31 29 7b 0a 20 20 20 20 75 33 32 20  1])+1){.    u32 
a940: 6e 4b 65 79 3b 0a 20 20 20 20 63 6f 6e 73 74 20  nKey;.    const 
a950: 63 68 61 72 20 2a 7a 4b 65 79 3b 0a 20 20 20 20  char *zKey;.    
a960: 61 73 73 65 72 74 28 20 70 50 61 74 63 68 5b 69  assert( pPatch[i
a970: 5d 2e 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f 53 54  ].eType==JSON_ST
a980: 52 49 4e 47 20 29 3b 0a 20 20 20 20 61 73 73 65  RING );.    asse
a990: 72 74 28 20 70 50 61 74 63 68 5b 69 5d 2e 6a 6e  rt( pPatch[i].jn
a9a0: 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 4c 41  Flags & JNODE_LA
a9b0: 42 45 4c 20 29 3b 0a 20 20 20 20 6e 4b 65 79 20  BEL );.    nKey 
a9c0: 3d 20 70 50 61 74 63 68 5b 69 5d 2e 6e 3b 0a 20  = pPatch[i].n;. 
a9d0: 20 20 20 7a 4b 65 79 20 3d 20 70 50 61 74 63 68     zKey = pPatch
a9e0: 5b 69 5d 2e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 3b  [i].u.zJContent;
a9f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50  .    assert( (pP
aa00: 61 74 63 68 5b 69 5d 2e 6a 6e 46 6c 61 67 73 20  atch[i].jnFlags 
aa10: 26 20 4a 4e 4f 44 45 5f 52 41 57 29 3d 3d 30 20  & JNODE_RAW)==0 
aa20: 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20  );.    for(j=1; 
aa30: 6a 3c 70 54 61 72 67 65 74 2d 3e 6e 3b 20 6a 20  j<pTarget->n; j 
aa40: 2b 3d 20 6a 73 6f 6e 4e 6f 64 65 53 69 7a 65 28  += jsonNodeSize(
aa50: 26 70 54 61 72 67 65 74 5b 6a 2b 31 5d 29 2b 31  &pTarget[j+1])+1
aa60: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
aa70: 28 20 70 54 61 72 67 65 74 5b 6a 5d 2e 65 54 79  ( pTarget[j].eTy
aa80: 70 65 3d 3d 4a 53 4f 4e 5f 53 54 52 49 4e 47 20  pe==JSON_STRING 
aa90: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
aaa0: 20 70 54 61 72 67 65 74 5b 6a 5d 2e 6a 6e 46 6c   pTarget[j].jnFl
aab0: 61 67 73 20 26 20 4a 4e 4f 44 45 5f 4c 41 42 45  ags & JNODE_LABE
aac0: 4c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  L );.      asser
aad0: 74 28 20 28 70 50 61 74 63 68 5b 69 5d 2e 6a 6e  t( (pPatch[i].jn
aae0: 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 52 41  Flags & JNODE_RA
aaf0: 57 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  W)==0 );.      i
ab00: 66 28 20 70 54 61 72 67 65 74 5b 6a 5d 2e 6e 3d  f( pTarget[j].n=
ab10: 3d 6e 4b 65 79 20 26 26 20 73 74 72 6e 63 6d 70  =nKey && strncmp
ab20: 28 70 54 61 72 67 65 74 5b 6a 5d 2e 75 2e 7a 4a  (pTarget[j].u.zJ
ab30: 43 6f 6e 74 65 6e 74 2c 7a 4b 65 79 2c 6e 4b 65  Content,zKey,nKe
ab40: 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  y)==0 ){.       
ab50: 20 69 66 28 20 70 54 61 72 67 65 74 5b 6a 2b 31   if( pTarget[j+1
ab60: 5d 2e 6a 6e 46 6c 61 67 73 20 26 20 28 4a 4e 4f  ].jnFlags & (JNO
ab70: 44 45 5f 52 45 4d 4f 56 45 7c 4a 4e 4f 44 45 5f  DE_REMOVE|JNODE_
ab80: 50 41 54 43 48 29 20 29 20 62 72 65 61 6b 3b 0a  PATCH) ) break;.
ab90: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 74          if( pPat
aba0: 63 68 5b 69 2b 31 5d 2e 65 54 79 70 65 3d 3d 4a  ch[i+1].eType==J
abb0: 53 4f 4e 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  SON_NULL ){.    
abc0: 20 20 20 20 20 20 70 54 61 72 67 65 74 5b 6a 2b        pTarget[j+
abd0: 31 5d 2e 6a 6e 46 6c 61 67 73 20 7c 3d 20 4a 4e  1].jnFlags |= JN
abe0: 4f 44 45 5f 52 45 4d 4f 56 45 3b 0a 20 20 20 20  ODE_REMOVE;.    
abf0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ac00: 20 20 20 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70       JsonNode *p
ac10: 4e 65 77 20 3d 20 6a 73 6f 6e 4d 65 72 67 65 50  New = jsonMergeP
ac20: 61 74 63 68 28 70 50 61 72 73 65 2c 20 69 54 61  atch(pParse, iTa
ac30: 72 67 65 74 2b 6a 2b 31 2c 20 26 70 50 61 74 63  rget+j+1, &pPatc
ac40: 68 5b 69 2b 31 5d 29 3b 0a 20 20 20 20 20 20 20  h[i+1]);.       
ac50: 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
ac60: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
ac70: 20 20 20 20 20 70 54 61 72 67 65 74 20 3d 20 26       pTarget = &
ac80: 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65 5b 69 54  pParse->aNode[iT
ac90: 61 72 67 65 74 5d 3b 0a 20 20 20 20 20 20 20 20  arget];.        
aca0: 20 20 69 66 28 20 70 4e 65 77 21 3d 26 70 54 61    if( pNew!=&pTa
acb0: 72 67 65 74 5b 6a 2b 31 5d 20 29 7b 0a 20 20 20  rget[j+1] ){.   
acc0: 20 20 20 20 20 20 20 20 20 70 54 61 72 67 65 74           pTarget
acd0: 5b 6a 2b 31 5d 2e 75 2e 70 50 61 74 63 68 20 3d  [j+1].u.pPatch =
ace0: 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20   pNew;.         
acf0: 20 20 20 70 54 61 72 67 65 74 5b 6a 2b 31 5d 2e     pTarget[j+1].
ad00: 6a 6e 46 6c 61 67 73 20 7c 3d 20 4a 4e 4f 44 45  jnFlags |= JNODE
ad10: 5f 50 41 54 43 48 3b 0a 20 20 20 20 20 20 20 20  _PATCH;.        
ad20: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
ad30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ad40: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
ad50: 66 28 20 6a 3e 3d 70 54 61 72 67 65 74 2d 3e 6e  f( j>=pTarget->n
ad60: 20 26 26 20 70 50 61 74 63 68 5b 69 2b 31 5d 2e   && pPatch[i+1].
ad70: 65 54 79 70 65 21 3d 4a 53 4f 4e 5f 4e 55 4c 4c  eType!=JSON_NULL
ad80: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 53   ){.      int iS
ad90: 74 61 72 74 2c 20 69 50 61 74 63 68 3b 0a 20 20  tart, iPatch;.  
ada0: 20 20 20 20 69 53 74 61 72 74 20 3d 20 6a 73 6f      iStart = jso
adb0: 6e 50 61 72 73 65 41 64 64 4e 6f 64 65 28 70 50  nParseAddNode(pP
adc0: 61 72 73 65 2c 20 4a 53 4f 4e 5f 4f 42 4a 45 43  arse, JSON_OBJEC
add0: 54 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20  T, 2, 0);.      
ade0: 6a 73 6f 6e 50 61 72 73 65 41 64 64 4e 6f 64 65  jsonParseAddNode
adf0: 28 70 50 61 72 73 65 2c 20 4a 53 4f 4e 5f 53 54  (pParse, JSON_ST
ae00: 52 49 4e 47 2c 20 6e 4b 65 79 2c 20 7a 4b 65 79  RING, nKey, zKey
ae10: 29 3b 0a 20 20 20 20 20 20 69 50 61 74 63 68 20  );.      iPatch 
ae20: 3d 20 6a 73 6f 6e 50 61 72 73 65 41 64 64 4e 6f  = jsonParseAddNo
ae30: 64 65 28 70 50 61 72 73 65 2c 20 4a 53 4f 4e 5f  de(pParse, JSON_
ae40: 54 52 55 45 2c 20 30 2c 20 30 29 3b 0a 20 20 20  TRUE, 0, 0);.   
ae50: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6f     if( pParse->o
ae60: 6f 6d 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  om ) return 0;. 
ae70: 20 20 20 20 20 6a 73 6f 6e 52 65 6d 6f 76 65 41       jsonRemoveA
ae80: 6c 6c 4e 75 6c 6c 73 28 70 50 61 74 63 68 29 3b  llNulls(pPatch);
ae90: 0a 20 20 20 20 20 20 70 54 61 72 67 65 74 20 3d  .      pTarget =
aea0: 20 26 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65 5b   &pParse->aNode[
aeb0: 69 54 61 72 67 65 74 5d 3b 0a 20 20 20 20 20 20  iTarget];.      
aec0: 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65 5b 69 52  pParse->aNode[iR
aed0: 6f 6f 74 5d 2e 6a 6e 46 6c 61 67 73 20 7c 3d 20  oot].jnFlags |= 
aee0: 4a 4e 4f 44 45 5f 41 50 50 45 4e 44 3b 0a 20 20  JNODE_APPEND;.  
aef0: 20 20 20 20 70 50 61 72 73 65 2d 3e 61 4e 6f 64      pParse->aNod
af00: 65 5b 69 52 6f 6f 74 5d 2e 75 2e 69 41 70 70 65  e[iRoot].u.iAppe
af10: 6e 64 20 3d 20 69 53 74 61 72 74 20 2d 20 69 52  nd = iStart - iR
af20: 6f 6f 74 3b 0a 20 20 20 20 20 20 69 52 6f 6f 74  oot;.      iRoot
af30: 20 3d 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20   = iStart;.     
af40: 20 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65 5b 69   pParse->aNode[i
af50: 50 61 74 63 68 5d 2e 6a 6e 46 6c 61 67 73 20 7c  Patch].jnFlags |
af60: 3d 20 4a 4e 4f 44 45 5f 50 41 54 43 48 3b 0a 20  = JNODE_PATCH;. 
af70: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 4e 6f       pParse->aNo
af80: 64 65 5b 69 50 61 74 63 68 5d 2e 75 2e 70 50 61  de[iPatch].u.pPa
af90: 74 63 68 20 3d 20 26 70 50 61 74 63 68 5b 69 2b  tch = &pPatch[i+
afa0: 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  1];.    }.  }.  
afb0: 72 65 74 75 72 6e 20 70 54 61 72 67 65 74 3b 0a  return pTarget;.
afc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
afd0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a  ntation of the j
afe0: 73 6f 6e 5f 6d 65 72 67 65 70 61 74 63 68 28 4a  son_mergepatch(J
aff0: 53 4f 4e 31 2c 4a 53 4f 4e 32 29 20 66 75 6e 63  SON1,JSON2) func
b000: 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 20  tion.  Return a 
b010: 4a 53 4f 4e 0a 2a 2a 20 6f 62 6a 65 63 74 20 74  JSON.** object t
b020: 68 61 74 20 69 73 20 74 68 65 20 72 65 73 75 6c  hat is the resul
b030: 74 20 6f 66 20 72 75 6e 6e 69 6e 67 20 74 68 65  t of running the
b040: 20 52 46 43 20 37 33 39 36 20 4d 65 72 67 65 50   RFC 7396 MergeP
b050: 61 74 63 68 28 29 20 61 6c 67 6f 72 69 74 68 6d  atch() algorithm
b060: 0a 2a 2a 20 6f 6e 20 74 68 65 20 74 77 6f 20 61  .** on the two a
b070: 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61  rguments..*/.sta
b080: 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 50 61 74  tic void jsonPat
b090: 63 68 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  chFunc(.  sqlite
b0a0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 0a  3_context *ctx,.
b0b0: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
b0c0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
b0d0: 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e 50 61 72 73  gv.){.  JsonPars
b0e0: 65 20 78 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  e x;     /* The 
b0f0: 4a 53 4f 4e 20 74 68 61 74 20 69 73 20 62 65 69  JSON that is bei
b100: 6e 67 20 70 61 74 63 68 65 64 20 2a 2f 0a 20 20  ng patched */.  
b110: 4a 73 6f 6e 50 61 72 73 65 20 79 3b 20 20 20 20  JsonParse y;    
b120: 20 2f 2a 20 54 68 65 20 70 61 74 63 68 20 2a 2f   /* The patch */
b130: 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 52 65  .  JsonNode *pRe
b140: 73 75 6c 74 3b 20 20 20 2f 2a 20 54 68 65 20 72  sult;   /* The r
b150: 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6d 65 72  esult of the mer
b160: 67 65 20 2a 2f 0a 0a 20 20 55 4e 55 53 45 44 5f  ge */..  UNUSED_
b170: 50 41 52 41 4d 28 61 72 67 63 29 3b 0a 20 20 69  PARAM(argc);.  i
b180: 66 28 20 6a 73 6f 6e 50 61 72 73 65 28 26 78 2c  f( jsonParse(&x,
b190: 20 63 74 78 2c 20 28 63 6f 6e 73 74 20 63 68 61   ctx, (const cha
b1a0: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
b1b0: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 29 20  _text(argv[0])) 
b1c0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
b1d0: 6a 73 6f 6e 50 61 72 73 65 28 26 79 2c 20 63 74  jsonParse(&y, ct
b1e0: 78 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  x, (const char*)
b1f0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
b200: 78 74 28 61 72 67 76 5b 31 5d 29 29 20 29 7b 0a  xt(argv[1])) ){.
b210: 20 20 20 20 6a 73 6f 6e 50 61 72 73 65 52 65 73      jsonParseRes
b220: 65 74 28 26 78 29 3b 0a 20 20 20 20 72 65 74 75  et(&x);.    retu
b230: 72 6e 3b 0a 20 20 7d 0a 20 20 70 52 65 73 75 6c  rn;.  }.  pResul
b240: 74 20 3d 20 6a 73 6f 6e 4d 65 72 67 65 50 61 74  t = jsonMergePat
b250: 63 68 28 26 78 2c 20 30 2c 20 79 2e 61 4e 6f 64  ch(&x, 0, y.aNod
b260: 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52  e);.  assert( pR
b270: 65 73 75 6c 74 21 3d 30 20 7c 7c 20 78 2e 6f 6f  esult!=0 || x.oo
b280: 6d 20 29 3b 0a 20 20 69 66 28 20 70 52 65 73 75  m );.  if( pResu
b290: 6c 74 20 29 7b 0a 20 20 20 20 6a 73 6f 6e 52 65  lt ){.    jsonRe
b2a0: 74 75 72 6e 4a 73 6f 6e 28 70 52 65 73 75 6c 74  turnJson(pResult
b2b0: 2c 20 63 74 78 2c 20 30 29 3b 0a 20 20 7d 65 6c  , ctx, 0);.  }el
b2c0: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
b2d0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d  result_error_nom
b2e0: 65 6d 28 63 74 78 29 3b 0a 20 20 7d 0a 20 20 6a  em(ctx);.  }.  j
b2f0: 73 6f 6e 50 61 72 73 65 52 65 73 65 74 28 26 78  sonParseReset(&x
b300: 29 3b 0a 20 20 6a 73 6f 6e 50 61 72 73 65 52 65  );.  jsonParseRe
b310: 73 65 74 28 26 79 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  set(&y);.}.../*.
b320: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
b330: 6e 20 6f 66 20 74 68 65 20 6a 73 6f 6e 5f 6f 62  n of the json_ob
b340: 6a 65 63 74 28 4e 41 4d 45 2c 56 41 4c 55 45 2c  ject(NAME,VALUE,
b350: 2e 2e 2e 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  ...) function.  
b360: 52 65 74 75 72 6e 20 61 20 4a 53 4f 4e 0a 2a 2a  Return a JSON.**
b370: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 63 6f 6e   object that con
b380: 74 61 69 6e 73 20 61 6c 6c 20 6e 61 6d 65 2f 76  tains all name/v
b390: 61 6c 75 65 20 67 69 76 65 6e 20 69 6e 20 61 72  alue given in ar
b3a0: 67 75 6d 65 6e 74 73 2e 20 20 4f 72 20 69 66 20  guments.  Or if 
b3b0: 61 6e 79 20 6e 61 6d 65 0a 2a 2a 20 69 73 20 6e  any name.** is n
b3c0: 6f 74 20 61 20 73 74 72 69 6e 67 20 6f 72 20 69  ot a string or i
b3d0: 66 20 61 6e 79 20 76 61 6c 75 65 20 69 73 20 61  f any value is a
b3e0: 20 42 4c 4f 42 2c 20 74 68 72 6f 77 20 61 6e 20   BLOB, throw an 
b3f0: 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  error..*/.static
b400: 20 76 6f 69 64 20 6a 73 6f 6e 4f 62 6a 65 63 74   void jsonObject
b410: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
b420: 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 0a 20 20  context *ctx,.  
b430: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
b440: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
b450: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4a  .){.  int i;.  J
b460: 73 6f 6e 53 74 72 69 6e 67 20 6a 78 3b 0a 20 20  sonString jx;.  
b470: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
b480: 20 75 33 32 20 6e 3b 0a 0a 20 20 69 66 28 20 61   u32 n;..  if( a
b490: 72 67 63 26 31 20 29 7b 0a 20 20 20 20 73 71 6c  rgc&1 ){.    sql
b4a0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
b4b0: 72 28 63 74 78 2c 20 22 6a 73 6f 6e 5f 6f 62 6a  r(ctx, "json_obj
b4c0: 65 63 74 28 29 20 72 65 71 75 69 72 65 73 20 61  ect() requires a
b4d0: 6e 20 65 76 65 6e 20 6e 75 6d 62 65 72 20 22 0a  n even number ".
b4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b500: 20 20 22 6f 66 20 61 72 67 75 6d 65 6e 74 73 22    "of arguments"
b510: 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72  , -1);.    retur
b520: 6e 3b 0a 20 20 7d 0a 20 20 6a 73 6f 6e 49 6e 69  n;.  }.  jsonIni
b530: 74 28 26 6a 78 2c 20 63 74 78 29 3b 0a 20 20 6a  t(&jx, ctx);.  j
b540: 73 6f 6e 41 70 70 65 6e 64 43 68 61 72 28 26 6a  sonAppendChar(&j
b550: 78 2c 20 27 7b 27 29 3b 0a 20 20 66 6f 72 28 69  x, '{');.  for(i
b560: 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 3d 32  =0; i<argc; i+=2
b570: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
b580: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72  e3_value_type(ar
b590: 67 76 5b 69 5d 29 21 3d 53 51 4c 49 54 45 5f 54  gv[i])!=SQLITE_T
b5a0: 45 58 54 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  EXT ){.      sql
b5b0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
b5c0: 72 28 63 74 78 2c 20 22 6a 73 6f 6e 5f 6f 62 6a  r(ctx, "json_obj
b5d0: 65 63 74 28 29 20 6c 61 62 65 6c 73 20 6d 75 73  ect() labels mus
b5e0: 74 20 62 65 20 54 45 58 54 22 2c 20 2d 31 29 3b  t be TEXT", -1);
b5f0: 0a 20 20 20 20 20 20 6a 73 6f 6e 52 65 73 65 74  .      jsonReset
b600: 28 26 6a 78 29 3b 0a 20 20 20 20 20 20 72 65 74  (&jx);.      ret
b610: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a  urn;.    }.    j
b620: 73 6f 6e 41 70 70 65 6e 64 53 65 70 61 72 61 74  sonAppendSeparat
b630: 6f 72 28 26 6a 78 29 3b 0a 20 20 20 20 7a 20 3d  or(&jx);.    z =
b640: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
b650: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
b660: 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 6e  (argv[i]);.    n
b670: 20 3d 20 28 75 33 32 29 73 71 6c 69 74 65 33 5f   = (u32)sqlite3_
b680: 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76  value_bytes(argv
b690: 5b 69 5d 29 3b 0a 20 20 20 20 6a 73 6f 6e 41 70  [i]);.    jsonAp
b6a0: 70 65 6e 64 53 74 72 69 6e 67 28 26 6a 78 2c 20  pendString(&jx, 
b6b0: 7a 2c 20 6e 29 3b 0a 20 20 20 20 6a 73 6f 6e 41  z, n);.    jsonA
b6c0: 70 70 65 6e 64 43 68 61 72 28 26 6a 78 2c 20 27  ppendChar(&jx, '
b6d0: 3a 27 29 3b 0a 20 20 20 20 6a 73 6f 6e 41 70 70  :');.    jsonApp
b6e0: 65 6e 64 56 61 6c 75 65 28 26 6a 78 2c 20 61 72  endValue(&jx, ar
b6f0: 67 76 5b 69 2b 31 5d 29 3b 0a 20 20 7d 0a 20 20  gv[i+1]);.  }.  
b700: 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61 72 28 26  jsonAppendChar(&
b710: 6a 78 2c 20 27 7d 27 29 3b 0a 20 20 6a 73 6f 6e  jx, '}');.  json
b720: 52 65 73 75 6c 74 28 26 6a 78 29 3b 0a 20 20 73  Result(&jx);.  s
b730: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 73 75  qlite3_result_su
b740: 62 74 79 70 65 28 63 74 78 2c 20 4a 53 4f 4e 5f  btype(ctx, JSON_
b750: 53 55 42 54 59 50 45 29 3b 0a 7d 0a 0a 0a 2f 2a  SUBTYPE);.}.../*
b760: 0a 2a 2a 20 6a 73 6f 6e 5f 72 65 6d 6f 76 65 28  .** json_remove(
b770: 4a 53 4f 4e 2c 20 50 41 54 48 2c 20 2e 2e 2e 29  JSON, PATH, ...)
b780: 0a 2a 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68  .**.** Remove th
b790: 65 20 6e 61 6d 65 64 20 65 6c 65 6d 65 6e 74 73  e named elements
b7a0: 20 66 72 6f 6d 20 4a 53 4f 4e 20 61 6e 64 20 72   from JSON and r
b7b0: 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74  eturn the result
b7c0: 2e 20 20 6d 61 6c 66 6f 72 6d 65 64 0a 2a 2a 20  .  malformed.** 
b7d0: 4a 53 4f 4e 20 6f 72 20 50 41 54 48 20 61 72 67  JSON or PATH arg
b7e0: 75 6d 65 6e 74 73 20 72 65 73 75 6c 74 20 69 6e  uments result in
b7f0: 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74   an error..*/.st
b800: 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 52 65  atic void jsonRe
b810: 6d 6f 76 65 46 75 6e 63 28 0a 20 20 73 71 6c 69  moveFunc(.  sqli
b820: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78  te3_context *ctx
b830: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
b840: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
b850: 61 72 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e 50 61  argv.){.  JsonPa
b860: 72 73 65 20 78 3b 20 20 20 20 20 20 20 20 20 20  rse x;          
b870: 2f 2a 20 54 68 65 20 70 61 72 73 65 20 2a 2f 0a  /* The parse */.
b880: 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64    JsonNode *pNod
b890: 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e;.  const char 
b8a0: 2a 7a 50 61 74 68 3b 0a 20 20 75 33 32 20 69 3b  *zPath;.  u32 i;
b8b0: 0a 0a 20 20 69 66 28 20 61 72 67 63 3c 31 20 29  ..  if( argc<1 )
b8c0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6a   return;.  if( j
b8d0: 73 6f 6e 50 61 72 73 65 28 26 78 2c 20 63 74 78  sonParse(&x, ctx
b8e0: 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  , (const char*)s
b8f0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
b900: 74 28 61 72 67 76 5b 30 5d 29 29 20 29 20 72 65  t(argv[0])) ) re
b910: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
b920: 78 2e 6e 4e 6f 64 65 20 29 3b 0a 20 20 66 6f 72  x.nNode );.  for
b930: 28 69 3d 31 3b 20 69 3c 28 75 33 32 29 61 72 67  (i=1; i<(u32)arg
b940: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a 50 61  c; i++){.    zPa
b950: 74 68 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  th = (const char
b960: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
b970: 74 65 78 74 28 61 72 67 76 5b 69 5d 29 3b 0a 20  text(argv[i]);. 
b980: 20 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20     if( zPath==0 
b990: 29 20 67 6f 74 6f 20 72 65 6d 6f 76 65 5f 64 6f  ) goto remove_do
b9a0: 6e 65 3b 0a 20 20 20 20 70 4e 6f 64 65 20 3d 20  ne;.    pNode = 
b9b0: 6a 73 6f 6e 4c 6f 6f 6b 75 70 28 26 78 2c 20 7a  jsonLookup(&x, z
b9c0: 50 61 74 68 2c 20 30 2c 20 63 74 78 29 3b 0a 20  Path, 0, ctx);. 
b9d0: 20 20 20 69 66 28 20 78 2e 6e 45 72 72 20 29 20     if( x.nErr ) 
b9e0: 67 6f 74 6f 20 72 65 6d 6f 76 65 5f 64 6f 6e 65  goto remove_done
b9f0: 3b 0a 20 20 20 20 69 66 28 20 70 4e 6f 64 65 20  ;.    if( pNode 
ba00: 29 20 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73  ) pNode->jnFlags
ba10: 20 7c 3d 20 4a 4e 4f 44 45 5f 52 45 4d 4f 56 45   |= JNODE_REMOVE
ba20: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 78 2e 61  ;.  }.  if( (x.a
ba30: 4e 6f 64 65 5b 30 5d 2e 6a 6e 46 6c 61 67 73 20  Node[0].jnFlags 
ba40: 26 20 4a 4e 4f 44 45 5f 52 45 4d 4f 56 45 29 3d  & JNODE_REMOVE)=
ba50: 3d 30 20 29 7b 0a 20 20 20 20 6a 73 6f 6e 52 65  =0 ){.    jsonRe
ba60: 74 75 72 6e 4a 73 6f 6e 28 78 2e 61 4e 6f 64 65  turnJson(x.aNode
ba70: 2c 20 63 74 78 2c 20 30 29 3b 0a 20 20 7d 0a 72  , ctx, 0);.  }.r
ba80: 65 6d 6f 76 65 5f 64 6f 6e 65 3a 0a 20 20 6a 73  emove_done:.  js
ba90: 6f 6e 50 61 72 73 65 52 65 73 65 74 28 26 78 29  onParseReset(&x)
baa0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 6a 73 6f 6e 5f  ;.}../*.** json_
bab0: 72 65 70 6c 61 63 65 28 4a 53 4f 4e 2c 20 50 41  replace(JSON, PA
bac0: 54 48 2c 20 56 41 4c 55 45 2c 20 2e 2e 2e 29 0a  TH, VALUE, ...).
bad0: 2a 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74 68  **.** Replace th
bae0: 65 20 76 61 6c 75 65 20 61 74 20 50 41 54 48 20  e value at PATH 
baf0: 77 69 74 68 20 56 41 4c 55 45 2e 20 20 49 66 20  with VALUE.  If 
bb00: 50 41 54 48 20 64 6f 65 73 20 6e 6f 74 20 61 6c  PATH does not al
bb10: 72 65 61 64 79 20 65 78 69 73 74 2c 0a 2a 2a 20  ready exist,.** 
bb20: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
bb30: 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 4a 53 4f  a no-op.  If JSO
bb40: 4e 20 6f 72 20 50 41 54 48 20 69 73 20 6d 61 6c  N or PATH is mal
bb50: 66 6f 72 6d 65 64 2c 20 74 68 72 6f 77 20 61 6e  formed, throw an
bb60: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69   error..*/.stati
bb70: 63 20 76 6f 69 64 20 6a 73 6f 6e 52 65 70 6c 61  c void jsonRepla
bb80: 63 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  ceFunc(.  sqlite
bb90: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 0a  3_context *ctx,.
bba0: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
bbb0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
bbc0: 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e 50 61 72 73  gv.){.  JsonPars
bbd0: 65 20 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  e x;          /*
bbe0: 20 54 68 65 20 70 61 72 73 65 20 2a 2f 0a 20 20   The parse */.  
bbf0: 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 3b  JsonNode *pNode;
bc00: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
bc10: 50 61 74 68 3b 0a 20 20 75 33 32 20 69 3b 0a 0a  Path;.  u32 i;..
bc20: 20 20 69 66 28 20 61 72 67 63 3c 31 20 29 20 72    if( argc<1 ) r
bc30: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 61 72  eturn;.  if( (ar
bc40: 67 63 26 31 29 3d 3d 30 20 29 20 7b 0a 20 20 20  gc&1)==0 ) {.   
bc50: 20 6a 73 6f 6e 57 72 6f 6e 67 4e 75 6d 41 72 67   jsonWrongNumArg
bc60: 73 28 63 74 78 2c 20 22 72 65 70 6c 61 63 65 22  s(ctx, "replace"
bc70: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
bc80: 20 7d 0a 20 20 69 66 28 20 6a 73 6f 6e 50 61 72   }.  if( jsonPar
bc90: 73 65 28 26 78 2c 20 63 74 78 2c 20 28 63 6f 6e  se(&x, ctx, (con
bca0: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
bcb0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
bcc0: 5b 30 5d 29 29 20 29 20 72 65 74 75 72 6e 3b 0a  [0])) ) return;.
bcd0: 20 20 61 73 73 65 72 74 28 20 78 2e 6e 4e 6f 64    assert( x.nNod
bce0: 65 20 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20  e );.  for(i=1; 
bcf0: 69 3c 28 75 33 32 29 61 72 67 63 3b 20 69 2b 3d  i<(u32)argc; i+=
bd00: 32 29 7b 0a 20 20 20 20 7a 50 61 74 68 20 3d 20  2){.    zPath = 
bd10: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
bd20: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
bd30: 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 70 4e  argv[i]);.    pN
bd40: 6f 64 65 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75 70  ode = jsonLookup
bd50: 28 26 78 2c 20 7a 50 61 74 68 2c 20 30 2c 20 63  (&x, zPath, 0, c
bd60: 74 78 29 3b 0a 20 20 20 20 69 66 28 20 78 2e 6e  tx);.    if( x.n
bd70: 45 72 72 20 29 20 67 6f 74 6f 20 72 65 70 6c 61  Err ) goto repla
bd80: 63 65 5f 65 72 72 3b 0a 20 20 20 20 69 66 28 20  ce_err;.    if( 
bd90: 70 4e 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 70  pNode ){.      p
bda0: 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73 20 7c 3d  Node->jnFlags |=
bdb0: 20 28 75 38 29 4a 4e 4f 44 45 5f 52 45 50 4c 41   (u8)JNODE_REPLA
bdc0: 43 45 3b 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d  CE;.      pNode-
bdd0: 3e 75 2e 69 52 65 70 6c 61 63 65 20 3d 20 69 20  >u.iReplace = i 
bde0: 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  + 1;.    }.  }. 
bdf0: 20 69 66 28 20 78 2e 61 4e 6f 64 65 5b 30 5d 2e   if( x.aNode[0].
be00: 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f  jnFlags & JNODE_
be10: 52 45 50 4c 41 43 45 20 29 7b 0a 20 20 20 20 73  REPLACE ){.    s
be20: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61  qlite3_result_va
be30: 6c 75 65 28 63 74 78 2c 20 61 72 67 76 5b 78 2e  lue(ctx, argv[x.
be40: 61 4e 6f 64 65 5b 30 5d 2e 75 2e 69 52 65 70 6c  aNode[0].u.iRepl
be50: 61 63 65 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ace]);.  }else{.
be60: 20 20 20 20 6a 73 6f 6e 52 65 74 75 72 6e 4a 73      jsonReturnJs
be70: 6f 6e 28 78 2e 61 4e 6f 64 65 2c 20 63 74 78 2c  on(x.aNode, ctx,
be80: 20 61 72 67 76 29 3b 0a 20 20 7d 0a 72 65 70 6c   argv);.  }.repl
be90: 61 63 65 5f 65 72 72 3a 0a 20 20 6a 73 6f 6e 50  ace_err:.  jsonP
bea0: 61 72 73 65 52 65 73 65 74 28 26 78 29 3b 0a 7d  arseReset(&x);.}
beb0: 0a 0a 2f 2a 0a 2a 2a 20 6a 73 6f 6e 5f 73 65 74  ../*.** json_set
bec0: 28 4a 53 4f 4e 2c 20 50 41 54 48 2c 20 56 41 4c  (JSON, PATH, VAL
bed0: 55 45 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 53  UE, ...).**.** S
bee0: 65 74 20 74 68 65 20 76 61 6c 75 65 20 61 74 20  et the value at 
bef0: 50 41 54 48 20 74 6f 20 56 41 4c 55 45 2e 20 20  PATH to VALUE.  
bf00: 43 72 65 61 74 65 20 74 68 65 20 50 41 54 48 20  Create the PATH 
bf10: 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61  if it does not a
bf20: 6c 72 65 61 64 79 0a 2a 2a 20 65 78 69 73 74 2e  lready.** exist.
bf30: 20 20 4f 76 65 72 77 72 69 74 65 20 65 78 69 73    Overwrite exis
bf40: 74 69 6e 67 20 76 61 6c 75 65 73 20 74 68 61 74  ting values that
bf50: 20 64 6f 20 65 78 69 73 74 2e 0a 2a 2a 20 49 66   do exist..** If
bf60: 20 4a 53 4f 4e 20 6f 72 20 50 41 54 48 20 69 73   JSON or PATH is
bf70: 20 6d 61 6c 66 6f 72 6d 65 64 2c 20 74 68 72 6f   malformed, thro
bf80: 77 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  w an error..**.*
bf90: 2a 20 6a 73 6f 6e 5f 69 6e 73 65 72 74 28 4a 53  * json_insert(JS
bfa0: 4f 4e 2c 20 50 41 54 48 2c 20 56 41 4c 55 45 2c  ON, PATH, VALUE,
bfb0: 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 43 72 65 61   ...).**.** Crea
bfc0: 74 65 20 50 41 54 48 20 61 6e 64 20 69 6e 69 74  te PATH and init
bfd0: 69 61 6c 69 7a 65 20 69 74 20 74 6f 20 56 41 4c  ialize it to VAL
bfe0: 55 45 2e 20 20 49 66 20 50 41 54 48 20 61 6c 72  UE.  If PATH alr
bff0: 65 61 64 79 20 65 78 69 73 74 73 2c 20 74 68 69  eady exists, thi
c000: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  s.** routine is 
c010: 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 4a 53 4f  a no-op.  If JSO
c020: 4e 20 6f 72 20 50 41 54 48 20 69 73 20 6d 61 6c  N or PATH is mal
c030: 66 6f 72 6d 65 64 2c 20 74 68 72 6f 77 20 61 6e  formed, throw an
c040: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69   error..*/.stati
c050: 63 20 76 6f 69 64 20 6a 73 6f 6e 53 65 74 46 75  c void jsonSetFu
c060: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
c070: 6e 74 65 78 74 20 2a 63 74 78 2c 0a 20 20 69 6e  ntext *ctx,.  in
c080: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
c090: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
c0a0: 7b 0a 20 20 4a 73 6f 6e 50 61 72 73 65 20 78 3b  {.  JsonParse x;
c0b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
c0c0: 20 70 61 72 73 65 20 2a 2f 0a 20 20 4a 73 6f 6e   parse */.  Json
c0d0: 4e 6f 64 65 20 2a 70 4e 6f 64 65 3b 0a 20 20 63  Node *pNode;.  c
c0e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
c0f0: 3b 0a 20 20 75 33 32 20 69 3b 0a 20 20 69 6e 74  ;.  u32 i;.  int
c100: 20 62 41 70 6e 64 3b 0a 20 20 69 6e 74 20 62 49   bApnd;.  int bI
c110: 73 53 65 74 20 3d 20 2a 28 69 6e 74 2a 29 73 71  sSet = *(int*)sq
c120: 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28  lite3_user_data(
c130: 63 74 78 29 3b 0a 0a 20 20 69 66 28 20 61 72 67  ctx);..  if( arg
c140: 63 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  c<1 ) return;.  
c150: 69 66 28 20 28 61 72 67 63 26 31 29 3d 3d 30 20  if( (argc&1)==0 
c160: 29 20 7b 0a 20 20 20 20 6a 73 6f 6e 57 72 6f 6e  ) {.    jsonWron
c170: 67 4e 75 6d 41 72 67 73 28 63 74 78 2c 20 62 49  gNumArgs(ctx, bI
c180: 73 53 65 74 20 3f 20 22 73 65 74 22 20 3a 20 22  sSet ? "set" : "
c190: 69 6e 73 65 72 74 22 29 3b 0a 20 20 20 20 72 65  insert");.    re
c1a0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
c1b0: 6a 73 6f 6e 50 61 72 73 65 28 26 78 2c 20 63 74  jsonParse(&x, ct
c1c0: 78 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  x, (const char*)
c1d0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
c1e0: 78 74 28 61 72 67 76 5b 30 5d 29 29 20 29 20 72  xt(argv[0])) ) r
c1f0: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
c200: 20 78 2e 6e 4e 6f 64 65 20 29 3b 0a 20 20 66 6f   x.nNode );.  fo
c210: 72 28 69 3d 31 3b 20 69 3c 28 75 33 32 29 61 72  r(i=1; i<(u32)ar
c220: 67 63 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 7a  gc; i+=2){.    z
c230: 50 61 74 68 20 3d 20 28 63 6f 6e 73 74 20 63 68  Path = (const ch
c240: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
c250: 65 5f 74 65 78 74 28 61 72 67 76 5b 69 5d 29 3b  e_text(argv[i]);
c260: 0a 20 20 20 20 62 41 70 6e 64 20 3d 20 30 3b 0a  .    bApnd = 0;.
c270: 20 20 20 20 70 4e 6f 64 65 20 3d 20 6a 73 6f 6e      pNode = json
c280: 4c 6f 6f 6b 75 70 28 26 78 2c 20 7a 50 61 74 68  Lookup(&x, zPath
c290: 2c 20 26 62 41 70 6e 64 2c 20 63 74 78 29 3b 0a  , &bApnd, ctx);.
c2a0: 20 20 20 20 69 66 28 20 78 2e 6f 6f 6d 20 29 7b      if( x.oom ){
c2b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
c2c0: 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65  esult_error_nome
c2d0: 6d 28 63 74 78 29 3b 0a 20 20 20 20 20 20 67 6f  m(ctx);.      go
c2e0: 74 6f 20 6a 73 6f 6e 53 65 74 44 6f 6e 65 3b 0a  to jsonSetDone;.
c2f0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 2e      }else if( x.
c300: 6e 45 72 72 20 29 7b 0a 20 20 20 20 20 20 67 6f  nErr ){.      go
c310: 74 6f 20 6a 73 6f 6e 53 65 74 44 6f 6e 65 3b 0a  to jsonSetDone;.
c320: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4e      }else if( pN
c330: 6f 64 65 20 26 26 20 28 62 41 70 6e 64 20 7c 7c  ode && (bApnd ||
c340: 20 62 49 73 53 65 74 29 20 29 7b 0a 20 20 20 20   bIsSet) ){.    
c350: 20 20 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73    pNode->jnFlags
c360: 20 7c 3d 20 28 75 38 29 4a 4e 4f 44 45 5f 52 45   |= (u8)JNODE_RE
c370: 50 4c 41 43 45 3b 0a 20 20 20 20 20 20 70 4e 6f  PLACE;.      pNo
c380: 64 65 2d 3e 75 2e 69 52 65 70 6c 61 63 65 20 3d  de->u.iReplace =
c390: 20 69 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20   i + 1;.    }.  
c3a0: 7d 0a 20 20 69 66 28 20 78 2e 61 4e 6f 64 65 5b  }.  if( x.aNode[
c3b0: 30 5d 2e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f  0].jnFlags & JNO
c3c0: 44 45 5f 52 45 50 4c 41 43 45 20 29 7b 0a 20 20  DE_REPLACE ){.  
c3d0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
c3e0: 5f 76 61 6c 75 65 28 63 74 78 2c 20 61 72 67 76  _value(ctx, argv
c3f0: 5b 78 2e 61 4e 6f 64 65 5b 30 5d 2e 75 2e 69 52  [x.aNode[0].u.iR
c400: 65 70 6c 61 63 65 5d 29 3b 0a 20 20 7d 65 6c 73  eplace]);.  }els
c410: 65 7b 0a 20 20 20 20 6a 73 6f 6e 52 65 74 75 72  e{.    jsonRetur
c420: 6e 4a 73 6f 6e 28 78 2e 61 4e 6f 64 65 2c 20 63  nJson(x.aNode, c
c430: 74 78 2c 20 61 72 67 76 29 3b 0a 20 20 7d 0a 6a  tx, argv);.  }.j
c440: 73 6f 6e 53 65 74 44 6f 6e 65 3a 0a 20 20 6a 73  sonSetDone:.  js
c450: 6f 6e 50 61 72 73 65 52 65 73 65 74 28 26 78 29  onParseReset(&x)
c460: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 6a 73 6f 6e 5f  ;.}../*.** json_
c470: 74 79 70 65 28 4a 53 4f 4e 29 0a 2a 2a 20 6a 73  type(JSON).** js
c480: 6f 6e 5f 74 79 70 65 28 4a 53 4f 4e 2c 20 50 41  on_type(JSON, PA
c490: 54 48 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  TH).**.** Return
c4a0: 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 22   the top-level "
c4b0: 74 79 70 65 22 20 6f 66 20 61 20 4a 53 4f 4e 20  type" of a JSON 
c4c0: 73 74 72 69 6e 67 2e 20 20 54 68 72 6f 77 20 61  string.  Throw a
c4d0: 6e 20 65 72 72 6f 72 20 69 66 0a 2a 2a 20 65 69  n error if.** ei
c4e0: 74 68 65 72 20 74 68 65 20 4a 53 4f 4e 20 6f 72  ther the JSON or
c4f0: 20 50 41 54 48 20 69 6e 70 75 74 73 20 61 72 65   PATH inputs are
c500: 20 6e 6f 74 20 77 65 6c 6c 2d 66 6f 72 6d 65 64   not well-formed
c510: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
c520: 20 6a 73 6f 6e 54 79 70 65 46 75 6e 63 28 0a 20   jsonTypeFunc(. 
c530: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
c540: 20 2a 63 74 78 2c 0a 20 20 69 6e 74 20 61 72 67   *ctx,.  int arg
c550: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
c560: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 4a  ue **argv.){.  J
c570: 73 6f 6e 50 61 72 73 65 20 2a 70 3b 20 20 20 20  sonParse *p;    
c580: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
c590: 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  se */.  const ch
c5a0: 61 72 20 2a 7a 50 61 74 68 3b 0a 20 20 4a 73 6f  ar *zPath;.  Jso
c5b0: 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 3b 0a 0a 20  nNode *pNode;.. 
c5c0: 20 70 20 3d 20 6a 73 6f 6e 50 61 72 73 65 43 61   p = jsonParseCa
c5d0: 63 68 65 64 28 63 74 78 2c 20 61 72 67 76 2c 20  ched(ctx, argv, 
c5e0: 63 74 78 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  ctx);.  if( p==0
c5f0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
c600: 20 61 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20   argc==2 ){.    
c610: 7a 50 61 74 68 20 3d 20 28 63 6f 6e 73 74 20 63  zPath = (const c
c620: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
c630: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29  ue_text(argv[1])
c640: 3b 0a 20 20 20 20 70 4e 6f 64 65 20 3d 20 6a 73  ;.    pNode = js
c650: 6f 6e 4c 6f 6f 6b 75 70 28 70 2c 20 7a 50 61 74  onLookup(p, zPat
c660: 68 2c 20 30 2c 20 63 74 78 29 3b 0a 20 20 7d 65  h, 0, ctx);.  }e
c670: 6c 73 65 7b 0a 20 20 20 20 70 4e 6f 64 65 20 3d  lse{.    pNode =
c680: 20 70 2d 3e 61 4e 6f 64 65 3b 0a 20 20 7d 0a 20   p->aNode;.  }. 
c690: 20 69 66 28 20 70 4e 6f 64 65 20 29 7b 0a 20 20   if( pNode ){.  
c6a0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
c6b0: 5f 74 65 78 74 28 63 74 78 2c 20 6a 73 6f 6e 54  _text(ctx, jsonT
c6c0: 79 70 65 5b 70 4e 6f 64 65 2d 3e 65 54 79 70 65  ype[pNode->eType
c6d0: 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54  ], -1, SQLITE_ST
c6e0: 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ATIC);.  }.}../*
c6f0: 0a 2a 2a 20 6a 73 6f 6e 5f 76 61 6c 69 64 28 4a  .** json_valid(J
c700: 53 4f 4e 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  SON).**.** Retur
c710: 6e 20 31 20 69 66 20 4a 53 4f 4e 20 69 73 20 61  n 1 if JSON is a
c720: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 4a 53 4f   well-formed JSO
c730: 4e 20 73 74 72 69 6e 67 20 61 63 63 6f 72 64 69  N string accordi
c740: 6e 67 20 74 6f 20 52 46 43 2d 37 31 35 39 2e 0a  ng to RFC-7159..
c750: 2a 2a 20 52 65 74 75 72 6e 20 30 20 6f 74 68 65  ** Return 0 othe
c760: 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
c770: 20 76 6f 69 64 20 6a 73 6f 6e 56 61 6c 69 64 46   void jsonValidF
c780: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
c790: 6f 6e 74 65 78 74 20 2a 63 74 78 2c 0a 20 20 69  ontext *ctx,.  i
c7a0: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
c7b0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
c7c0: 29 7b 0a 20 20 4a 73 6f 6e 50 61 72 73 65 20 2a  ){.  JsonParse *
c7d0: 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  p;          /* T
c7e0: 68 65 20 70 61 72 73 65 20 2a 2f 0a 20 20 55 4e  he parse */.  UN
c7f0: 55 53 45 44 5f 50 41 52 41 4d 28 61 72 67 63 29  USED_PARAM(argc)
c800: 3b 0a 20 20 70 20 3d 20 6a 73 6f 6e 50 61 72 73  ;.  p = jsonPars
c810: 65 43 61 63 68 65 64 28 63 74 78 2c 20 61 72 67  eCached(ctx, arg
c820: 76 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  v, 0);.  sqlite3
c830: 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 74 78 2c  _result_int(ctx,
c840: 20 70 21 3d 30 29 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a   p!=0);.}.../***
c850: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c860: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 41 67 67  *********.** Agg
c8a0: 72 65 67 61 74 65 20 53 51 4c 20 66 75 6e 63 74  regate SQL funct
c8b0: 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ion implementati
c8c0: 6f 6e 73 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ons.************
c8d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c8e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c8f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c910: 2f 0a 2f 2a 0a 2a 2a 20 6a 73 6f 6e 5f 67 72 6f  /./*.** json_gro
c920: 75 70 5f 61 72 72 61 79 28 56 41 4c 55 45 29 0a  up_array(VALUE).
c930: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 4a  **.** Return a J
c940: 53 4f 4e 20 61 72 72 61 79 20 63 6f 6d 70 6f 73  SON array compos
c950: 65 64 20 6f 66 20 61 6c 6c 20 76 61 6c 75 65 73  ed of all values
c960: 20 69 6e 20 74 68 65 20 61 67 67 72 65 67 61 74   in the aggregat
c970: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
c980: 64 20 6a 73 6f 6e 41 72 72 61 79 53 74 65 70 28  d jsonArrayStep(
c990: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
c9a0: 78 74 20 2a 63 74 78 2c 0a 20 20 69 6e 74 20 61  xt *ctx,.  int a
c9b0: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
c9c0: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
c9d0: 20 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70 53 74   JsonString *pSt
c9e0: 72 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  r;.  UNUSED_PARA
c9f0: 4d 28 61 72 67 63 29 3b 0a 20 20 70 53 74 72 20  M(argc);.  pStr 
ca00: 3d 20 28 4a 73 6f 6e 53 74 72 69 6e 67 2a 29 73  = (JsonString*)s
ca10: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
ca20: 5f 63 6f 6e 74 65 78 74 28 63 74 78 2c 20 73 69  _context(ctx, si
ca30: 7a 65 6f 66 28 2a 70 53 74 72 29 29 3b 0a 20 20  zeof(*pStr));.  
ca40: 69 66 28 20 70 53 74 72 20 29 7b 0a 20 20 20 20  if( pStr ){.    
ca50: 69 66 28 20 70 53 74 72 2d 3e 7a 42 75 66 3d 3d  if( pStr->zBuf==
ca60: 30 20 29 7b 0a 20 20 20 20 20 20 6a 73 6f 6e 49  0 ){.      jsonI
ca70: 6e 69 74 28 70 53 74 72 2c 20 63 74 78 29 3b 0a  nit(pStr, ctx);.
ca80: 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64        jsonAppend
ca90: 43 68 61 72 28 70 53 74 72 2c 20 27 5b 27 29 3b  Char(pStr, '[');
caa0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
cab0: 20 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61 72    jsonAppendChar
cac0: 28 70 53 74 72 2c 20 27 2c 27 29 3b 0a 20 20 20  (pStr, ',');.   
cad0: 20 20 20 70 53 74 72 2d 3e 70 43 74 78 20 3d 20     pStr->pCtx = 
cae0: 63 74 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a  ctx;.    }.    j
caf0: 73 6f 6e 41 70 70 65 6e 64 56 61 6c 75 65 28 70  sonAppendValue(p
cb00: 53 74 72 2c 20 61 72 67 76 5b 30 5d 29 3b 0a 20  Str, argv[0]);. 
cb10: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
cb20: 20 6a 73 6f 6e 41 72 72 61 79 43 6f 6d 70 75 74   jsonArrayComput
cb30: 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  e(sqlite3_contex
cb40: 74 20 2a 63 74 78 2c 20 69 6e 74 20 69 73 46 69  t *ctx, int isFi
cb50: 6e 61 6c 29 7b 0a 20 20 4a 73 6f 6e 53 74 72 69  nal){.  JsonStri
cb60: 6e 67 20 2a 70 53 74 72 3b 0a 20 20 70 53 74 72  ng *pStr;.  pStr
cb70: 20 3d 20 28 4a 73 6f 6e 53 74 72 69 6e 67 2a 29   = (JsonString*)
cb80: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
cb90: 65 5f 63 6f 6e 74 65 78 74 28 63 74 78 2c 20 30  e_context(ctx, 0
cba0: 29 3b 0a 20 20 69 66 28 20 70 53 74 72 20 29 7b  );.  if( pStr ){
cbb0: 0a 20 20 20 20 70 53 74 72 2d 3e 70 43 74 78 20  .    pStr->pCtx 
cbc0: 3d 20 63 74 78 3b 0a 20 20 20 20 6a 73 6f 6e 41  = ctx;.    jsonA
cbd0: 70 70 65 6e 64 43 68 61 72 28 70 53 74 72 2c 20  ppendChar(pStr, 
cbe0: 27 5d 27 29 3b 0a 20 20 20 20 69 66 28 20 70 53  ']');.    if( pS
cbf0: 74 72 2d 3e 62 45 72 72 20 29 7b 0a 20 20 20 20  tr->bErr ){.    
cc00: 20 20 69 66 28 20 70 53 74 72 2d 3e 62 45 72 72    if( pStr->bErr
cc10: 3d 3d 31 20 29 20 73 71 6c 69 74 65 33 5f 72 65  ==1 ) sqlite3_re
cc20: 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d  sult_error_nomem
cc30: 28 63 74 78 29 3b 0a 20 20 20 20 20 20 61 73 73  (ctx);.      ass
cc40: 65 72 74 28 20 70 53 74 72 2d 3e 62 53 74 61 74  ert( pStr->bStat
cc50: 69 63 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ic );.    }else 
cc60: 69 66 28 20 69 73 46 69 6e 61 6c 20 29 7b 0a 20  if( isFinal ){. 
cc70: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
cc80: 75 6c 74 5f 74 65 78 74 28 63 74 78 2c 20 70 53  ult_text(ctx, pS
cc90: 74 72 2d 3e 7a 42 75 66 2c 20 28 69 6e 74 29 70  tr->zBuf, (int)p
cca0: 53 74 72 2d 3e 6e 55 73 65 64 2c 0a 20 20 20 20  Str->nUsed,.    
ccb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ccc0: 20 20 20 20 20 20 70 53 74 72 2d 3e 62 53 74 61        pStr->bSta
ccd0: 74 69 63 20 3f 20 53 51 4c 49 54 45 5f 54 52 41  tic ? SQLITE_TRA
cce0: 4e 53 49 45 4e 54 20 3a 20 73 71 6c 69 74 65 33  NSIENT : sqlite3
ccf0: 5f 66 72 65 65 29 3b 0a 20 20 20 20 20 20 70 53  _free);.      pS
cd00: 74 72 2d 3e 62 53 74 61 74 69 63 20 3d 20 31 3b  tr->bStatic = 1;
cd10: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
cd20: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
cd30: 5f 74 65 78 74 28 63 74 78 2c 20 70 53 74 72 2d  _text(ctx, pStr-
cd40: 3e 7a 42 75 66 2c 20 28 69 6e 74 29 70 53 74 72  >zBuf, (int)pStr
cd50: 2d 3e 6e 55 73 65 64 2c 20 53 51 4c 49 54 45 5f  ->nUsed, SQLITE_
cd60: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
cd70: 20 20 70 53 74 72 2d 3e 6e 55 73 65 64 2d 2d 3b    pStr->nUsed--;
cd80: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
cd90: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
cda0: 6c 74 5f 74 65 78 74 28 63 74 78 2c 20 22 5b 5d  lt_text(ctx, "[]
cdb0: 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 53 54 41  ", 2, SQLITE_STA
cdc0: 54 49 43 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  TIC);.  }.  sqli
cdd0: 74 65 33 5f 72 65 73 75 6c 74 5f 73 75 62 74 79  te3_result_subty
cde0: 70 65 28 63 74 78 2c 20 4a 53 4f 4e 5f 53 55 42  pe(ctx, JSON_SUB
cdf0: 54 59 50 45 29 3b 0a 7d 0a 73 74 61 74 69 63 20  TYPE);.}.static 
ce00: 76 6f 69 64 20 6a 73 6f 6e 41 72 72 61 79 56 61  void jsonArrayVa
ce10: 6c 75 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  lue(sqlite3_cont
ce20: 65 78 74 20 2a 63 74 78 29 7b 0a 20 20 6a 73 6f  ext *ctx){.  jso
ce30: 6e 41 72 72 61 79 43 6f 6d 70 75 74 65 28 63 74  nArrayCompute(ct
ce40: 78 2c 20 30 29 3b 0a 7d 0a 73 74 61 74 69 63 20  x, 0);.}.static 
ce50: 76 6f 69 64 20 6a 73 6f 6e 41 72 72 61 79 46 69  void jsonArrayFi
ce60: 6e 61 6c 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  nal(sqlite3_cont
ce70: 65 78 74 20 2a 63 74 78 29 7b 0a 20 20 6a 73 6f  ext *ctx){.  jso
ce80: 6e 41 72 72 61 79 43 6f 6d 70 75 74 65 28 63 74  nArrayCompute(ct
ce90: 78 2c 20 31 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  x, 1);.}..#ifnde
cea0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
ceb0: 4e 44 4f 57 46 55 4e 43 0a 2f 2a 0a 2a 2a 20 54  NDOWFUNC./*.** T
cec0: 68 69 73 20 6d 65 74 68 6f 64 20 77 6f 72 6b 73  his method works
ced0: 20 66 6f 72 20 62 6f 74 68 20 6a 73 6f 6e 5f 67   for both json_g
cee0: 72 6f 75 70 5f 61 72 72 61 79 28 29 20 61 6e 64  roup_array() and
cef0: 20 6a 73 6f 6e 5f 67 72 6f 75 70 5f 6f 62 6a 65   json_group_obje
cf00: 63 74 28 29 2e 0a 2a 2a 20 49 74 20 77 6f 72 6b  ct()..** It work
cf10: 73 20 62 79 20 72 65 6d 6f 76 69 6e 67 20 74 68  s by removing th
cf20: 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 20  e first element 
cf30: 6f 66 20 74 68 65 20 67 72 6f 75 70 20 62 79 20  of the group by 
cf40: 73 65 61 72 63 68 69 6e 67 20 66 6f 72 77 61 72  searching forwar
cf50: 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73  d.** to the firs
cf60: 74 20 63 6f 6d 6d 61 20 28 22 2c 22 29 20 74 68  t comma (",") th
cf70: 61 74 20 69 73 20 6e 6f 74 20 77 69 74 68 69 6e  at is not within
cf80: 20 61 20 73 74 72 69 6e 67 20 61 6e 64 20 64 65   a string and de
cf90: 6c 65 74 69 6e 67 20 61 6c 6c 0a 2a 2a 20 74 65  leting all.** te
cfa0: 78 74 20 74 68 72 6f 75 67 68 20 74 68 61 74 20  xt through that 
cfb0: 63 6f 6d 6d 61 2e 0a 2a 2f 0a 73 74 61 74 69 63  comma..*/.static
cfc0: 20 76 6f 69 64 20 6a 73 6f 6e 47 72 6f 75 70 49   void jsonGroupI
cfd0: 6e 76 65 72 73 65 28 0a 20 20 73 71 6c 69 74 65  nverse(.  sqlite
cfe0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 0a  3_context *ctx,.
cff0: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
d000: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
d010: 67 76 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  gv.){.  int i;. 
d020: 20 69 6e 74 20 69 6e 53 74 72 20 3d 20 30 3b 0a   int inStr = 0;.
d030: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 4a 73 6f    char *z;.  Jso
d040: 6e 53 74 72 69 6e 67 20 2a 70 53 74 72 3b 0a 20  nString *pStr;. 
d050: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 61 72   UNUSED_PARAM(ar
d060: 67 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  gc);.  UNUSED_PA
d070: 52 41 4d 28 61 72 67 76 29 3b 0a 20 20 70 53 74  RAM(argv);.  pSt
d080: 72 20 3d 20 28 4a 73 6f 6e 53 74 72 69 6e 67 2a  r = (JsonString*
d090: 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61  )sqlite3_aggrega
d0a0: 74 65 5f 63 6f 6e 74 65 78 74 28 63 74 78 2c 20  te_context(ctx, 
d0b0: 30 29 3b 0a 23 69 66 64 65 66 20 4e 45 56 45 52  0);.#ifdef NEVER
d0c0: 0a 20 20 2f 2a 20 70 53 74 72 20 69 73 20 61 6c  .  /* pStr is al
d0d0: 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 73 69  ways non-NULL si
d0e0: 6e 63 65 20 6a 73 6f 6e 41 72 72 61 79 53 74 65  nce jsonArraySte
d0f0: 70 28 29 20 6f 72 20 6a 73 6f 6e 4f 62 6a 65 63  p() or jsonObjec
d100: 74 53 74 65 70 28 29 20 77 69 6c 6c 0a 20 20 2a  tStep() will.  *
d110: 2a 20 61 6c 77 61 79 73 20 68 61 76 65 20 62 65  * always have be
d120: 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 69  en called to ini
d130: 74 61 6c 69 7a 65 20 69 74 20 2a 2f 0a 20 20 69  talize it */.  i
d140: 66 28 20 4e 45 56 45 52 28 21 70 53 74 72 29 20  f( NEVER(!pStr) 
d150: 29 20 72 65 74 75 72 6e 3b 0a 23 65 6e 64 69 66  ) return;.#endif
d160: 0a 20 20 7a 20 3d 20 70 53 74 72 2d 3e 7a 42 75  .  z = pStr->zBu
d170: 66 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 7a 5b  f;.  for(i=1; z[
d180: 69 5d 21 3d 27 2c 27 20 7c 7c 20 69 6e 53 74 72  i]!=',' || inStr
d190: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
d1a0: 72 74 28 20 69 3c 70 53 74 72 2d 3e 6e 55 73 65  rt( i<pStr->nUse
d1b0: 64 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 5b 69  d );.    if( z[i
d1c0: 5d 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20  ]=='"' ){.      
d1d0: 69 6e 53 74 72 20 3d 20 21 69 6e 53 74 72 3b 0a  inStr = !inStr;.
d1e0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b      }else if( z[
d1f0: 69 5d 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20  i]=='\\' ){.    
d200: 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    i++;.    }.  }
d210: 0a 20 20 70 53 74 72 2d 3e 6e 55 73 65 64 20 2d  .  pStr->nUsed -
d220: 3d 20 69 3b 20 20 20 20 20 20 0a 20 20 6d 65 6d  = i;      .  mem
d230: 6d 6f 76 65 28 26 7a 5b 31 5d 2c 20 26 7a 5b 69  move(&z[1], &z[i
d240: 2b 31 5d 2c 20 28 73 69 7a 65 5f 74 29 70 53 74  +1], (size_t)pSt
d250: 72 2d 3e 6e 55 73 65 64 2d 31 29 3b 0a 7d 0a 23  r->nUsed-1);.}.#
d260: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 6a 73  else.# define js
d270: 6f 6e 47 72 6f 75 70 49 6e 76 65 72 73 65 20 30  onGroupInverse 0
d280: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
d290: 6a 73 6f 6e 5f 67 72 6f 75 70 5f 6f 62 6a 28 4e  json_group_obj(N
d2a0: 41 4d 45 2c 56 41 4c 55 45 29 0a 2a 2a 0a 2a 2a  AME,VALUE).**.**
d2b0: 20 52 65 74 75 72 6e 20 61 20 4a 53 4f 4e 20 6f   Return a JSON o
d2c0: 62 6a 65 63 74 20 63 6f 6d 70 6f 73 65 64 20 6f  bject composed o
d2d0: 66 20 61 6c 6c 20 6e 61 6d 65 73 20 61 6e 64 20  f all names and 
d2e0: 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 61 67  values in the ag
d2f0: 67 72 65 67 61 74 65 2e 0a 2a 2f 0a 73 74 61 74  gregate..*/.stat
d300: 69 63 20 76 6f 69 64 20 6a 73 6f 6e 4f 62 6a 65  ic void jsonObje
d310: 63 74 53 74 65 70 28 0a 20 20 73 71 6c 69 74 65  ctStep(.  sqlite
d320: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 0a  3_context *ctx,.
d330: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
d340: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
d350: 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e 53 74 72 69  gv.){.  JsonStri
d360: 6e 67 20 2a 70 53 74 72 3b 0a 20 20 63 6f 6e 73  ng *pStr;.  cons
d370: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 75 33 32  t char *z;.  u32
d380: 20 6e 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   n;.  UNUSED_PAR
d390: 41 4d 28 61 72 67 63 29 3b 0a 20 20 70 53 74 72  AM(argc);.  pStr
d3a0: 20 3d 20 28 4a 73 6f 6e 53 74 72 69 6e 67 2a 29   = (JsonString*)
d3b0: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
d3c0: 65 5f 63 6f 6e 74 65 78 74 28 63 74 78 2c 20 73  e_context(ctx, s
d3d0: 69 7a 65 6f 66 28 2a 70 53 74 72 29 29 3b 0a 20  izeof(*pStr));. 
d3e0: 20 69 66 28 20 70 53 74 72 20 29 7b 0a 20 20 20   if( pStr ){.   
d3f0: 20 69 66 28 20 70 53 74 72 2d 3e 7a 42 75 66 3d   if( pStr->zBuf=
d400: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6a 73 6f 6e  =0 ){.      json
d410: 49 6e 69 74 28 70 53 74 72 2c 20 63 74 78 29 3b  Init(pStr, ctx);
d420: 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e  .      jsonAppen
d430: 64 43 68 61 72 28 70 53 74 72 2c 20 27 7b 27 29  dChar(pStr, '{')
d440: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
d450: 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61     jsonAppendCha
d460: 72 28 70 53 74 72 2c 20 27 2c 27 29 3b 0a 20 20  r(pStr, ',');.  
d470: 20 20 20 20 70 53 74 72 2d 3e 70 43 74 78 20 3d      pStr->pCtx =
d480: 20 63 74 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20   ctx;.    }.    
d490: 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  z = (const char*
d4a0: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
d4b0: 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ext(argv[0]);.  
d4c0: 20 20 6e 20 3d 20 28 75 33 32 29 73 71 6c 69 74    n = (u32)sqlit
d4d0: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
d4e0: 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6a 73 6f  rgv[0]);.    jso
d4f0: 6e 41 70 70 65 6e 64 53 74 72 69 6e 67 28 70 53  nAppendString(pS
d500: 74 72 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 6a  tr, z, n);.    j
d510: 73 6f 6e 41 70 70 65 6e 64 43 68 61 72 28 70 53  sonAppendChar(pS
d520: 74 72 2c 20 27 3a 27 29 3b 0a 20 20 20 20 6a 73  tr, ':');.    js
d530: 6f 6e 41 70 70 65 6e 64 56 61 6c 75 65 28 70 53  onAppendValue(pS
d540: 74 72 2c 20 61 72 67 76 5b 31 5d 29 3b 0a 20 20  tr, argv[1]);.  
d550: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
d560: 6a 73 6f 6e 4f 62 6a 65 63 74 43 6f 6d 70 75 74  jsonObjectComput
d570: 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  e(sqlite3_contex
d580: 74 20 2a 63 74 78 2c 20 69 6e 74 20 69 73 46 69  t *ctx, int isFi
d590: 6e 61 6c 29 7b 0a 20 20 4a 73 6f 6e 53 74 72 69  nal){.  JsonStri
d5a0: 6e 67 20 2a 70 53 74 72 3b 0a 20 20 70 53 74 72  ng *pStr;.  pStr
d5b0: 20 3d 20 28 4a 73 6f 6e 53 74 72 69 6e 67 2a 29   = (JsonString*)
d5c0: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
d5d0: 65 5f 63 6f 6e 74 65 78 74 28 63 74 78 2c 20 30  e_context(ctx, 0
d5e0: 29 3b 0a 20 20 69 66 28 20 70 53 74 72 20 29 7b  );.  if( pStr ){
d5f0: 0a 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 43  .    jsonAppendC
d600: 68 61 72 28 70 53 74 72 2c 20 27 7d 27 29 3b 0a  har(pStr, '}');.
d610: 20 20 20 20 69 66 28 20 70 53 74 72 2d 3e 62 45      if( pStr->bE
d620: 72 72 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  rr ){.      if( 
d630: 70 53 74 72 2d 3e 62 45 72 72 3d 3d 31 20 29 20  pStr->bErr==1 ) 
d640: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
d650: 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 74 78 29 3b  rror_nomem(ctx);
d660: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
d670: 53 74 72 2d 3e 62 53 74 61 74 69 63 20 29 3b 0a  Str->bStatic );.
d680: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73      }else if( is
d690: 46 69 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 73  Final ){.      s
d6a0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
d6b0: 78 74 28 63 74 78 2c 20 70 53 74 72 2d 3e 7a 42  xt(ctx, pStr->zB
d6c0: 75 66 2c 20 28 69 6e 74 29 70 53 74 72 2d 3e 6e  uf, (int)pStr->n
d6d0: 55 73 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20  Used,.          
d6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6f0: 70 53 74 72 2d 3e 62 53 74 61 74 69 63 20 3f 20  pStr->bStatic ? 
d700: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
d710: 20 3a 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29   : sqlite3_free)
d720: 3b 0a 20 20 20 20 20 20 70 53 74 72 2d 3e 62 53  ;.      pStr->bS
d730: 74 61 74 69 63 20 3d 20 31 3b 0a 20 20 20 20 7d  tatic = 1;.    }
d740: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
d750: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
d760: 63 74 78 2c 20 70 53 74 72 2d 3e 7a 42 75 66 2c  ctx, pStr->zBuf,
d770: 20 28 69 6e 74 29 70 53 74 72 2d 3e 6e 55 73 65   (int)pStr->nUse
d780: 64 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  d, SQLITE_TRANSI
d790: 45 4e 54 29 3b 0a 20 20 20 20 20 20 70 53 74 72  ENT);.      pStr
d7a0: 2d 3e 6e 55 73 65 64 2d 2d 3b 0a 20 20 20 20 7d  ->nUsed--;.    }
d7b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
d7c0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
d7d0: 74 28 63 74 78 2c 20 22 7b 7d 22 2c 20 32 2c 20  t(ctx, "{}", 2, 
d7e0: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
d7f0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65    }.  sqlite3_re
d800: 73 75 6c 74 5f 73 75 62 74 79 70 65 28 63 74 78  sult_subtype(ctx
d810: 2c 20 4a 53 4f 4e 5f 53 55 42 54 59 50 45 29 3b  , JSON_SUBTYPE);
d820: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a  .}.static void j
d830: 73 6f 6e 4f 62 6a 65 63 74 56 61 6c 75 65 28 73  sonObjectValue(s
d840: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
d850: 63 74 78 29 7b 0a 20 20 6a 73 6f 6e 4f 62 6a 65  ctx){.  jsonObje
d860: 63 74 43 6f 6d 70 75 74 65 28 63 74 78 2c 20 30  ctCompute(ctx, 0
d870: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
d880: 20 6a 73 6f 6e 4f 62 6a 65 63 74 46 69 6e 61 6c   jsonObjectFinal
d890: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
d8a0: 20 2a 63 74 78 29 7b 0a 20 20 6a 73 6f 6e 4f 62   *ctx){.  jsonOb
d8b0: 6a 65 63 74 43 6f 6d 70 75 74 65 28 63 74 78 2c  jectCompute(ctx,
d8c0: 20 31 29 3b 0a 7d 0a 0a 0a 0a 23 69 66 6e 64 65   1);.}....#ifnde
d8d0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
d8e0: 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 2a 2a 2a  RTUALTABLE./****
d8f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d930: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20  ********.** The 
d940: 6a 73 6f 6e 5f 65 61 63 68 20 76 69 72 74 75 61  json_each virtua
d950: 6c 20 74 61 62 6c 65 0a 2a 2a 2a 2a 2a 2a 2a 2a  l table.********
d960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d9a0: 2a 2a 2a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  ****/.typedef st
d9b0: 72 75 63 74 20 4a 73 6f 6e 45 61 63 68 43 75 72  ruct JsonEachCur
d9c0: 73 6f 72 20 4a 73 6f 6e 45 61 63 68 43 75 72 73  sor JsonEachCurs
d9d0: 6f 72 3b 0a 73 74 72 75 63 74 20 4a 73 6f 6e 45  or;.struct JsonE
d9e0: 61 63 68 43 75 72 73 6f 72 20 7b 0a 20 20 73 71  achCursor {.  sq
d9f0: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
da00: 72 20 62 61 73 65 3b 20 20 2f 2a 20 42 61 73 65  r base;  /* Base
da10: 20 63 6c 61 73 73 20 2d 20 6d 75 73 74 20 62 65   class - must be
da20: 20 66 69 72 73 74 20 2a 2f 0a 20 20 75 33 32 20   first */.  u32 
da30: 69 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20  iRowid;         
da40: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f         /* The ro
da50: 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 69 42 65  wid */.  u32 iBe
da60: 67 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  gin;            
da70: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74      /* The first
da80: 20 6e 6f 64 65 20 6f 66 20 74 68 65 20 73 63 61   node of the sca
da90: 6e 20 2a 2f 0a 20 20 75 33 32 20 69 3b 20 20 20  n */.  u32 i;   
daa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dab0: 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 73 50    /* Index in sP
dac0: 61 72 73 65 2e 61 4e 6f 64 65 5b 5d 20 6f 66 20  arse.aNode[] of 
dad0: 63 75 72 72 65 6e 74 20 72 6f 77 20 2a 2f 0a 20  current row */. 
dae0: 20 75 33 32 20 69 45 6e 64 3b 20 20 20 20 20 20   u32 iEnd;      
daf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
db00: 4f 46 20 77 68 65 6e 20 69 20 65 71 75 61 6c 73  OF when i equals
db10: 20 6f 72 20 65 78 63 65 65 64 73 20 74 68 69 73   or exceeds this
db20: 20 76 61 6c 75 65 20 2a 2f 0a 20 20 75 38 20 65   value */.  u8 e
db30: 54 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20  Type;           
db40: 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f         /* Type o
db50: 66 20 74 6f 70 2d 6c 65 76 65 6c 20 65 6c 65 6d  f top-level elem
db60: 65 6e 74 20 2a 2f 0a 20 20 75 38 20 62 52 65 63  ent */.  u8 bRec
db70: 75 72 73 69 76 65 3b 20 20 20 20 20 20 20 20 20  ursive;         
db80: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
db90: 6a 73 6f 6e 5f 74 72 65 65 28 29 2e 20 20 46 61  json_tree().  Fa
dba0: 6c 73 65 20 66 6f 72 20 6a 73 6f 6e 5f 65 61 63  lse for json_eac
dbb0: 68 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  h() */.  char *z
dbc0: 4a 73 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20  Json;           
dbd0: 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 4a 53 4f      /* Input JSO
dbe0: 4e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 52 6f  N */.  char *zRo
dbf0: 6f 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ot;             
dc00: 20 20 2f 2a 20 50 61 74 68 20 62 79 20 77 68 69    /* Path by whi
dc10: 63 68 20 74 6f 20 66 69 6c 74 65 72 20 7a 4a 73  ch to filter zJs
dc20: 6f 6e 20 2a 2f 0a 20 20 4a 73 6f 6e 50 61 72 73  on */.  JsonPars
dc30: 65 20 73 50 61 72 73 65 3b 20 20 20 20 20 20 20  e sParse;       
dc40: 20 20 20 2f 2a 20 50 61 72 73 65 20 6f 66 20 74     /* Parse of t
dc50: 68 65 20 69 6e 70 75 74 20 4a 53 4f 4e 20 2a 2f  he input JSON */
dc60: 0a 7d 3b 0a 0a 2f 2a 20 43 6f 6e 73 74 72 75 63  .};../* Construc
dc70: 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 73 6f 6e  tor for the json
dc80: 5f 65 61 63 68 20 76 69 72 74 75 61 6c 20 74 61  _each virtual ta
dc90: 62 6c 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ble */.static in
dca0: 74 20 6a 73 6f 6e 45 61 63 68 43 6f 6e 6e 65 63  t jsonEachConnec
dcb0: 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t(.  sqlite3 *db
dcc0: 2c 0a 20 20 76 6f 69 64 20 2a 70 41 75 78 2c 0a  ,.  void *pAux,.
dcd0: 20 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73    int argc, cons
dce0: 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a 61 72  t char *const*ar
dcf0: 67 76 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  gv,.  sqlite3_vt
dd00: 61 62 20 2a 2a 70 70 56 74 61 62 2c 0a 20 20 63  ab **ppVtab,.  c
dd10: 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20  har **pzErr.){. 
dd20: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
dd30: 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  New;.  int rc;..
dd40: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  /* Column number
dd50: 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 45 41  s */.#define JEA
dd60: 43 48 5f 4b 45 59 20 20 20 20 20 30 0a 23 64 65  CH_KEY     0.#de
dd70: 66 69 6e 65 20 4a 45 41 43 48 5f 56 41 4c 55 45  fine JEACH_VALUE
dd80: 20 20 20 31 0a 23 64 65 66 69 6e 65 20 4a 45 41     1.#define JEA
dd90: 43 48 5f 54 59 50 45 20 20 20 20 32 0a 23 64 65  CH_TYPE    2.#de
dda0: 66 69 6e 65 20 4a 45 41 43 48 5f 41 54 4f 4d 20  fine JEACH_ATOM 
ddb0: 20 20 20 33 0a 23 64 65 66 69 6e 65 20 4a 45 41     3.#define JEA
ddc0: 43 48 5f 49 44 20 20 20 20 20 20 34 0a 23 64 65  CH_ID      4.#de
ddd0: 66 69 6e 65 20 4a 45 41 43 48 5f 50 41 52 45 4e  fine JEACH_PAREN
dde0: 54 20 20 35 0a 23 64 65 66 69 6e 65 20 4a 45 41  T  5.#define JEA
ddf0: 43 48 5f 46 55 4c 4c 4b 45 59 20 36 0a 23 64 65  CH_FULLKEY 6.#de
de00: 66 69 6e 65 20 4a 45 41 43 48 5f 50 41 54 48 20  fine JEACH_PATH 
de10: 20 20 20 37 0a 2f 2a 20 54 68 65 20 78 42 65 73     7./* The xBes
de20: 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 20 61 73  tIndex method as
de30: 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20 4a  sumes that the J
de40: 53 4f 4e 20 61 6e 64 20 52 4f 4f 54 20 63 6f 6c  SON and ROOT col
de50: 75 6d 6e 73 20 61 72 65 0a 2a 2a 20 74 68 65 20  umns are.** the 
de60: 6c 61 73 74 20 74 77 6f 20 63 6f 6c 75 6d 6e 73  last two columns
de70: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
de80: 53 68 6f 75 6c 64 20 74 68 69 73 20 65 76 65 72  Should this ever
de90: 20 63 68 61 6e 67 65 73 2c 20 62 65 0a 2a 2a 20   changes, be.** 
dea0: 73 75 72 65 20 74 6f 20 75 70 64 61 74 65 20 74  sure to update t
deb0: 68 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65  he xBestIndex me
dec0: 74 68 6f 64 2e 20 2a 2f 0a 23 64 65 66 69 6e 65  thod. */.#define
ded0: 20 4a 45 41 43 48 5f 4a 53 4f 4e 20 20 20 20 38   JEACH_JSON    8
dee0: 0a 23 64 65 66 69 6e 65 20 4a 45 41 43 48 5f 52  .#define JEACH_R
def0: 4f 4f 54 20 20 20 20 39 0a 0a 20 20 55 4e 55 53  OOT    9..  UNUS
df00: 45 44 5f 50 41 52 41 4d 28 70 7a 45 72 72 29 3b  ED_PARAM(pzErr);
df10: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28  .  UNUSED_PARAM(
df20: 61 72 67 76 29 3b 0a 20 20 55 4e 55 53 45 44 5f  argv);.  UNUSED_
df30: 50 41 52 41 4d 28 61 72 67 63 29 3b 0a 20 20 55  PARAM(argc);.  U
df40: 4e 55 53 45 44 5f 50 41 52 41 4d 28 70 41 75 78  NUSED_PARAM(pAux
df50: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
df60: 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 64  3_declare_vtab(d
df70: 62 2c 20 0a 20 20 20 20 20 22 43 52 45 41 54 45  b, .     "CREATE
df80: 20 54 41 42 4c 45 20 78 28 6b 65 79 2c 76 61 6c   TABLE x(key,val
df90: 75 65 2c 74 79 70 65 2c 61 74 6f 6d 2c 69 64 2c  ue,type,atom,id,
dfa0: 70 61 72 65 6e 74 2c 66 75 6c 6c 6b 65 79 2c 70  parent,fullkey,p
dfb0: 61 74 68 2c 22 0a 20 20 20 20 20 20 20 20 20 20  ath,".          
dfc0: 20 20 20 20 20 20 20 20 20 20 22 6a 73 6f 6e 20            "json 
dfd0: 48 49 44 44 45 4e 2c 72 6f 6f 74 20 48 49 44 44  HIDDEN,root HIDD
dfe0: 45 4e 29 22 29 3b 0a 20 20 69 66 28 20 72 63 3d  EN)");.  if( rc=
dff0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
e000: 20 20 70 4e 65 77 20 3d 20 2a 70 70 56 74 61 62    pNew = *ppVtab
e010: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
e020: 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  c( sizeof(*pNew)
e030: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77   );.    if( pNew
e040: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
e050: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 6d  ITE_NOMEM;.    m
e060: 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73  emset(pNew, 0, s
e070: 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20  izeof(*pNew));. 
e080: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
e090: 7d 0a 0a 2f 2a 20 64 65 73 74 72 75 63 74 6f 72  }../* destructor
e0a0: 20 66 6f 72 20 6a 73 6f 6e 5f 65 61 63 68 20 76   for json_each v
e0b0: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
e0c0: 73 74 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e 45  static int jsonE
e0d0: 61 63 68 44 69 73 63 6f 6e 6e 65 63 74 28 73 71  achDisconnect(sq
e0e0: 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
e0f0: 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  b){.  sqlite3_fr
e100: 65 65 28 70 56 74 61 62 29 3b 0a 20 20 72 65 74  ee(pVtab);.  ret
e110: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
e120: 0a 0a 2f 2a 20 63 6f 6e 73 74 72 75 63 74 6f 72  ../* constructor
e130: 20 66 6f 72 20 61 20 4a 73 6f 6e 45 61 63 68 43   for a JsonEachC
e140: 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 66 6f 72  ursor object for
e150: 20 6a 73 6f 6e 5f 65 61 63 68 28 29 2e 20 2a 2f   json_each(). */
e160: 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e  .static int json
e170: 45 61 63 68 4f 70 65 6e 45 61 63 68 28 73 71 6c  EachOpenEach(sql
e180: 69 74 65 33 5f 76 74 61 62 20 2a 70 2c 20 73 71  ite3_vtab *p, sq
e190: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
e1a0: 72 20 2a 2a 70 70 43 75 72 73 6f 72 29 7b 0a 20  r **ppCursor){. 
e1b0: 20 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 20   JsonEachCursor 
e1c0: 2a 70 43 75 72 3b 0a 0a 20 20 55 4e 55 53 45 44  *pCur;..  UNUSED
e1d0: 5f 50 41 52 41 4d 28 70 29 3b 0a 20 20 70 43 75  _PARAM(p);.  pCu
e1e0: 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  r = sqlite3_mall
e1f0: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43 75 72  oc( sizeof(*pCur
e200: 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 3d  ) );.  if( pCur=
e210: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
e220: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73  TE_NOMEM;.  mems
e230: 65 74 28 70 43 75 72 2c 20 30 2c 20 73 69 7a 65  et(pCur, 0, size
e240: 6f 66 28 2a 70 43 75 72 29 29 3b 0a 20 20 2a 70  of(*pCur));.  *p
e250: 70 43 75 72 73 6f 72 20 3d 20 26 70 43 75 72 2d  pCursor = &pCur-
e260: 3e 62 61 73 65 3b 0a 20 20 72 65 74 75 72 6e 20  >base;.  return 
e270: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
e280: 20 63 6f 6e 73 74 72 75 63 74 6f 72 20 66 6f 72   constructor for
e290: 20 61 20 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f   a JsonEachCurso
e2a0: 72 20 6f 62 6a 65 63 74 20 66 6f 72 20 6a 73 6f  r object for jso
e2b0: 6e 5f 74 72 65 65 28 29 2e 20 2a 2f 0a 73 74 61  n_tree(). */.sta
e2c0: 74 69 63 20 69 6e 74 20 6a 73 6f 6e 45 61 63 68  tic int jsonEach
e2d0: 4f 70 65 6e 54 72 65 65 28 73 71 6c 69 74 65 33  OpenTree(sqlite3
e2e0: 5f 76 74 61 62 20 2a 70 2c 20 73 71 6c 69 74 65  _vtab *p, sqlite
e2f0: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 2a  3_vtab_cursor **
e300: 70 70 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74  ppCursor){.  int
e310: 20 72 63 20 3d 20 6a 73 6f 6e 45 61 63 68 4f 70   rc = jsonEachOp
e320: 65 6e 45 61 63 68 28 70 2c 20 70 70 43 75 72 73  enEach(p, ppCurs
e330: 6f 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  or);.  if( rc==S
e340: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e350: 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 20 2a  JsonEachCursor *
e360: 70 43 75 72 20 3d 20 28 4a 73 6f 6e 45 61 63 68  pCur = (JsonEach
e370: 43 75 72 73 6f 72 2a 29 2a 70 70 43 75 72 73 6f  Cursor*)*ppCurso
e380: 72 3b 0a 20 20 20 20 70 43 75 72 2d 3e 62 52 65  r;.    pCur->bRe
e390: 63 75 72 73 69 76 65 20 3d 20 31 3b 0a 20 20 7d  cursive = 1;.  }
e3a0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
e3b0: 0a 2f 2a 20 52 65 73 65 74 20 61 20 4a 73 6f 6e  ./* Reset a Json
e3c0: 45 61 63 68 43 75 72 73 6f 72 20 62 61 63 6b 20  EachCursor back 
e3d0: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
e3e0: 73 74 61 74 65 2e 20 20 46 72 65 65 20 61 6e 79  state.  Free any
e3f0: 20 6d 65 6d 6f 72 79 0a 2a 2a 20 68 65 6c 64 2e   memory.** held.
e400: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
e410: 6a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 52 65  jsonEachCursorRe
e420: 73 65 74 28 4a 73 6f 6e 45 61 63 68 43 75 72 73  set(JsonEachCurs
e430: 6f 72 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  or *p){.  sqlite
e440: 33 5f 66 72 65 65 28 70 2d 3e 7a 4a 73 6f 6e 29  3_free(p->zJson)
e450: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
e460: 28 70 2d 3e 7a 52 6f 6f 74 29 3b 0a 20 20 6a 73  (p->zRoot);.  js
e470: 6f 6e 50 61 72 73 65 52 65 73 65 74 28 26 70 2d  onParseReset(&p-
e480: 3e 73 50 61 72 73 65 29 3b 0a 20 20 70 2d 3e 69  >sParse);.  p->i
e490: 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 70 2d 3e  Rowid = 0;.  p->
e4a0: 69 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 45 6e 64  i = 0;.  p->iEnd
e4b0: 20 3d 20 30 3b 0a 20 20 70 2d 3e 65 54 79 70 65   = 0;.  p->eType
e4c0: 20 3d 20 30 3b 0a 20 20 70 2d 3e 7a 4a 73 6f 6e   = 0;.  p->zJson
e4d0: 20 3d 20 30 3b 0a 20 20 70 2d 3e 7a 52 6f 6f 74   = 0;.  p->zRoot
e4e0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 20 44 65 73 74   = 0;.}../* Dest
e4f0: 72 75 63 74 6f 72 20 66 6f 72 20 61 20 6a 73 6f  ructor for a jso
e500: 6e 45 61 63 68 43 75 72 73 6f 72 20 6f 62 6a 65  nEachCursor obje
e510: 63 74 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ct */.static int
e520: 20 6a 73 6f 6e 45 61 63 68 43 6c 6f 73 65 28 73   jsonEachClose(s
e530: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
e540: 6f 72 20 2a 63 75 72 29 7b 0a 20 20 4a 73 6f 6e  or *cur){.  Json
e550: 45 61 63 68 43 75 72 73 6f 72 20 2a 70 20 3d 20  EachCursor *p = 
e560: 28 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 2a  (JsonEachCursor*
e570: 29 63 75 72 3b 0a 20 20 6a 73 6f 6e 45 61 63 68  )cur;.  jsonEach
e580: 43 75 72 73 6f 72 52 65 73 65 74 28 70 29 3b 0a  CursorReset(p);.
e590: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 63    sqlite3_free(c
e5a0: 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ur);.  return SQ
e5b0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 52  LITE_OK;.}../* R
e5c0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
e5d0: 65 20 6a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72  e jsonEachCursor
e5e0: 20 6f 62 6a 65 63 74 20 68 61 73 20 62 65 65 6e   object has been
e5f0: 20 61 64 76 61 6e 63 65 64 20 6f 66 66 20 74 68   advanced off th
e600: 65 20 65 6e 64 0a 2a 2a 20 6f 66 20 74 68 65 20  e end.** of the 
e610: 4a 53 4f 4e 20 6f 62 6a 65 63 74 20 2a 2f 0a 73  JSON object */.s
e620: 74 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e 45 61  tatic int jsonEa
e630: 63 68 45 6f 66 28 73 71 6c 69 74 65 33 5f 76 74  chEof(sqlite3_vt
e640: 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 29 7b  ab_cursor *cur){
e650: 0a 20 20 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f  .  JsonEachCurso
e660: 72 20 2a 70 20 3d 20 28 4a 73 6f 6e 45 61 63 68  r *p = (JsonEach
e670: 43 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20 20 72  Cursor*)cur;.  r
e680: 65 74 75 72 6e 20 70 2d 3e 69 20 3e 3d 20 70 2d  eturn p->i >= p-
e690: 3e 69 45 6e 64 3b 0a 7d 0a 0a 2f 2a 20 41 64 76  >iEnd;.}../* Adv
e6a0: 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72 20  ance the cursor 
e6b0: 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d  to the next elem
e6c0: 65 6e 74 20 66 6f 72 20 6a 73 6f 6e 5f 74 72 65  ent for json_tre
e6d0: 65 28 29 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e() */.static in
e6e0: 74 20 6a 73 6f 6e 45 61 63 68 4e 65 78 74 28 73  t jsonEachNext(s
e6f0: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
e700: 6f 72 20 2a 63 75 72 29 7b 0a 20 20 4a 73 6f 6e  or *cur){.  Json
e710: 45 61 63 68 43 75 72 73 6f 72 20 2a 70 20 3d 20  EachCursor *p = 
e720: 28 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 2a  (JsonEachCursor*
e730: 29 63 75 72 3b 0a 20 20 69 66 28 20 70 2d 3e 62  )cur;.  if( p->b
e740: 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20  Recursive ){.   
e750: 20 69 66 28 20 70 2d 3e 73 50 61 72 73 65 2e 61   if( p->sParse.a
e760: 4e 6f 64 65 5b 70 2d 3e 69 5d 2e 6a 6e 46 6c 61  Node[p->i].jnFla
e770: 67 73 20 26 20 4a 4e 4f 44 45 5f 4c 41 42 45 4c  gs & JNODE_LABEL
e780: 20 29 20 70 2d 3e 69 2b 2b 3b 0a 20 20 20 20 70   ) p->i++;.    p
e790: 2d 3e 69 2b 2b 3b 0a 20 20 20 20 70 2d 3e 69 52  ->i++;.    p->iR
e7a0: 6f 77 69 64 2b 2b 3b 0a 20 20 20 20 69 66 28 20  owid++;.    if( 
e7b0: 70 2d 3e 69 3c 70 2d 3e 69 45 6e 64 20 29 7b 0a  p->i<p->iEnd ){.
e7c0: 20 20 20 20 20 20 75 33 32 20 69 55 70 20 3d 20        u32 iUp = 
e7d0: 70 2d 3e 73 50 61 72 73 65 2e 61 55 70 5b 70 2d  p->sParse.aUp[p-
e7e0: 3e 69 5d 3b 0a 20 20 20 20 20 20 4a 73 6f 6e 4e  >i];.      JsonN
e7f0: 6f 64 65 20 2a 70 55 70 20 3d 20 26 70 2d 3e 73  ode *pUp = &p->s
e800: 50 61 72 73 65 2e 61 4e 6f 64 65 5b 69 55 70 5d  Parse.aNode[iUp]
e810: 3b 0a 20 20 20 20 20 20 70 2d 3e 65 54 79 70 65  ;.      p->eType
e820: 20 3d 20 70 55 70 2d 3e 65 54 79 70 65 3b 0a 20   = pUp->eType;. 
e830: 20 20 20 20 20 69 66 28 20 70 55 70 2d 3e 65 54       if( pUp->eT
e840: 79 70 65 3d 3d 4a 53 4f 4e 5f 41 52 52 41 59 20  ype==JSON_ARRAY 
e850: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
e860: 55 70 3d 3d 70 2d 3e 69 2d 31 20 29 7b 0a 20 20  Up==p->i-1 ){.  
e870: 20 20 20 20 20 20 20 20 70 55 70 2d 3e 75 2e 69          pUp->u.i
e880: 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Key = 0;.       
e890: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e8a0: 20 20 70 55 70 2d 3e 75 2e 69 4b 65 79 2b 2b 3b    pUp->u.iKey++;
e8b0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e8c0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
e8d0: 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 2d  {.    switch( p-
e8e0: 3e 65 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20  >eType ){.      
e8f0: 63 61 73 65 20 4a 53 4f 4e 5f 41 52 52 41 59 3a  case JSON_ARRAY:
e900: 20 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 20   {.        p->i 
e910: 2b 3d 20 6a 73 6f 6e 4e 6f 64 65 53 69 7a 65 28  += jsonNodeSize(
e920: 26 70 2d 3e 73 50 61 72 73 65 2e 61 4e 6f 64 65  &p->sParse.aNode
e930: 5b 70 2d 3e 69 5d 29 3b 0a 20 20 20 20 20 20 20  [p->i]);.       
e940: 20 70 2d 3e 69 52 6f 77 69 64 2b 2b 3b 0a 20 20   p->iRowid++;.  
e950: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e960: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
e970: 4a 53 4f 4e 5f 4f 42 4a 45 43 54 3a 20 7b 0a 20  JSON_OBJECT: {. 
e980: 20 20 20 20 20 20 20 70 2d 3e 69 20 2b 3d 20 31         p->i += 1
e990: 20 2b 20 6a 73 6f 6e 4e 6f 64 65 53 69 7a 65 28   + jsonNodeSize(
e9a0: 26 70 2d 3e 73 50 61 72 73 65 2e 61 4e 6f 64 65  &p->sParse.aNode
e9b0: 5b 70 2d 3e 69 2b 31 5d 29 3b 0a 20 20 20 20 20  [p->i+1]);.     
e9c0: 20 20 20 70 2d 3e 69 52 6f 77 69 64 2b 2b 3b 0a     p->iRowid++;.
e9d0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
e9e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66       }.      def
e9f0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  ault: {.        
ea00: 70 2d 3e 69 20 3d 20 70 2d 3e 69 45 6e 64 3b 0a  p->i = p->iEnd;.
ea10: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ea20: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
ea30: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
ea40: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 41 70 70 65 6e  _OK;.}../* Appen
ea50: 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  d the name of th
ea60: 65 20 70 61 74 68 20 66 6f 72 20 65 6c 65 6d 65  e path for eleme
ea70: 6e 74 20 69 20 74 6f 20 70 53 74 72 0a 2a 2f 0a  nt i to pStr.*/.
ea80: 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e  static void json
ea90: 45 61 63 68 43 6f 6d 70 75 74 65 50 61 74 68 28  EachComputePath(
eaa0: 0a 20 20 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f  .  JsonEachCurso
eab0: 72 20 2a 70 2c 20 20 20 20 20 20 20 2f 2a 20 54  r *p,       /* T
eac0: 68 65 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 4a  he cursor */.  J
ead0: 73 6f 6e 53 74 72 69 6e 67 20 2a 70 53 74 72 2c  sonString *pStr,
eae0: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
eaf0: 20 74 68 65 20 70 61 74 68 20 68 65 72 65 20 2a   the path here *
eb00: 2f 0a 20 20 75 33 32 20 69 20 20 20 20 20 20 20  /.  u32 i       
eb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
eb20: 50 61 74 68 20 74 6f 20 74 68 69 73 20 65 6c 65  Path to this ele
eb30: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 4a 73 6f  ment */.){.  Jso
eb40: 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 20 2a 70  nNode *pNode, *p
eb50: 55 70 3b 0a 20 20 75 33 32 20 69 55 70 3b 0a 20  Up;.  u32 iUp;. 
eb60: 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20   if( i==0 ){.   
eb70: 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61 72 28   jsonAppendChar(
eb80: 70 53 74 72 2c 20 27 24 27 29 3b 0a 20 20 20 20  pStr, '$');.    
eb90: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 55  return;.  }.  iU
eba0: 70 20 3d 20 70 2d 3e 73 50 61 72 73 65 2e 61 55  p = p->sParse.aU
ebb0: 70 5b 69 5d 3b 0a 20 20 6a 73 6f 6e 45 61 63 68  p[i];.  jsonEach
ebc0: 43 6f 6d 70 75 74 65 50 61 74 68 28 70 2c 20 70  ComputePath(p, p
ebd0: 53 74 72 2c 20 69 55 70 29 3b 0a 20 20 70 4e 6f  Str, iUp);.  pNo
ebe0: 64 65 20 3d 20 26 70 2d 3e 73 50 61 72 73 65 2e  de = &p->sParse.
ebf0: 61 4e 6f 64 65 5b 69 5d 3b 0a 20 20 70 55 70 20  aNode[i];.  pUp 
ec00: 3d 20 26 70 2d 3e 73 50 61 72 73 65 2e 61 4e 6f  = &p->sParse.aNo
ec10: 64 65 5b 69 55 70 5d 3b 0a 20 20 69 66 28 20 70  de[iUp];.  if( p
ec20: 55 70 2d 3e 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f  Up->eType==JSON_
ec30: 41 52 52 41 59 20 29 7b 0a 20 20 20 20 6a 73 6f  ARRAY ){.    jso
ec40: 6e 50 72 69 6e 74 66 28 33 30 2c 20 70 53 74 72  nPrintf(30, pStr
ec50: 2c 20 22 5b 25 64 5d 22 2c 20 70 55 70 2d 3e 75  , "[%d]", pUp->u
ec60: 2e 69 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b  .iKey);.  }else{
ec70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 55 70  .    assert( pUp
ec80: 2d 3e 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f 4f 42  ->eType==JSON_OB
ec90: 4a 45 43 54 20 29 3b 0a 20 20 20 20 69 66 28 20  JECT );.    if( 
eca0: 28 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73 20  (pNode->jnFlags 
ecb0: 26 20 4a 4e 4f 44 45 5f 4c 41 42 45 4c 29 3d 3d  & JNODE_LABEL)==
ecc0: 30 20 29 20 70 4e 6f 64 65 2d 2d 3b 0a 20 20 20  0 ) pNode--;.   
ecd0: 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e   assert( pNode->
ece0: 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f 53 54 52 49  eType==JSON_STRI
ecf0: 4e 47 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  NG );.    assert
ed00: 28 20 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73  ( pNode->jnFlags
ed10: 20 26 20 4a 4e 4f 44 45 5f 4c 41 42 45 4c 20 29   & JNODE_LABEL )
ed20: 3b 0a 20 20 20 20 6a 73 6f 6e 50 72 69 6e 74 66  ;.    jsonPrintf
ed30: 28 70 4e 6f 64 65 2d 3e 6e 2b 31 2c 20 70 53 74  (pNode->n+1, pSt
ed40: 72 2c 20 22 2e 25 2e 2a 73 22 2c 20 70 4e 6f 64  r, ".%.*s", pNod
ed50: 65 2d 3e 6e 2d 32 2c 20 70 4e 6f 64 65 2d 3e 75  e->n-2, pNode->u
ed60: 2e 7a 4a 43 6f 6e 74 65 6e 74 2b 31 29 3b 0a 20  .zJContent+1);. 
ed70: 20 7d 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20   }.}../* Return 
ed80: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 63  the value of a c
ed90: 6f 6c 75 6d 6e 20 2a 2f 0a 73 74 61 74 69 63 20  olumn */.static 
eda0: 69 6e 74 20 6a 73 6f 6e 45 61 63 68 43 6f 6c 75  int jsonEachColu
edb0: 6d 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  mn(.  sqlite3_vt
edc0: 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 2c 20  ab_cursor *cur, 
edd0: 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
ede0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  */.  sqlite3_con
edf0: 74 65 78 74 20 2a 63 74 78 2c 20 20 20 20 20 20  text *ctx,      
ee00: 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65   /* First argume
ee10: 6e 74 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 65  nt to sqlite3_re
ee20: 73 75 6c 74 5f 2e 2e 2e 28 29 20 2a 2f 0a 20 20  sult_...() */.  
ee30: 69 6e 74 20 69 20 20 20 20 20 20 20 20 20 20 20  int i           
ee40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
ee50: 68 69 63 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 72  hich column to r
ee60: 65 74 75 72 6e 20 2a 2f 0a 29 7b 0a 20 20 4a 73  eturn */.){.  Js
ee70: 6f 6e 45 61 63 68 43 75 72 73 6f 72 20 2a 70 20  onEachCursor *p 
ee80: 3d 20 28 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f  = (JsonEachCurso
ee90: 72 2a 29 63 75 72 3b 0a 20 20 4a 73 6f 6e 4e 6f  r*)cur;.  JsonNo
eea0: 64 65 20 2a 70 54 68 69 73 20 3d 20 26 70 2d 3e  de *pThis = &p->
eeb0: 73 50 61 72 73 65 2e 61 4e 6f 64 65 5b 70 2d 3e  sParse.aNode[p->
eec0: 69 5d 3b 0a 20 20 73 77 69 74 63 68 28 20 69 20  i];.  switch( i 
eed0: 29 7b 0a 20 20 20 20 63 61 73 65 20 4a 45 41 43  ){.    case JEAC
eee0: 48 5f 4b 45 59 3a 20 7b 0a 20 20 20 20 20 20 69  H_KEY: {.      i
eef0: 66 28 20 70 2d 3e 69 3d 3d 30 20 29 20 62 72 65  f( p->i==0 ) bre
ef00: 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ak;.      if( p-
ef10: 3e 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f 4f 42 4a  >eType==JSON_OBJ
ef20: 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20 6a  ECT ){.        j
ef30: 73 6f 6e 52 65 74 75 72 6e 28 70 54 68 69 73 2c  sonReturn(pThis,
ef40: 20 63 74 78 2c 20 30 29 3b 0a 20 20 20 20 20 20   ctx, 0);.      
ef50: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 54 79  }else if( p->eTy
ef60: 70 65 3d 3d 4a 53 4f 4e 5f 41 52 52 41 59 20 29  pe==JSON_ARRAY )
ef70: 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20 69 4b  {.        u32 iK
ef80: 65 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ey;.        if( 
ef90: 70 2d 3e 62 52 65 63 75 72 73 69 76 65 20 29 7b  p->bRecursive ){
efa0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
efb0: 2d 3e 69 52 6f 77 69 64 3d 3d 30 20 29 20 62 72  ->iRowid==0 ) br
efc0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 69  eak;.          i
efd0: 4b 65 79 20 3d 20 70 2d 3e 73 50 61 72 73 65 2e  Key = p->sParse.
efe0: 61 4e 6f 64 65 5b 70 2d 3e 73 50 61 72 73 65 2e  aNode[p->sParse.
eff0: 61 55 70 5b 70 2d 3e 69 5d 5d 2e 75 2e 69 4b 65  aUp[p->i]].u.iKe
f000: 79 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  y;.        }else
f010: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 4b 65 79  {.          iKey
f020: 20 3d 20 70 2d 3e 69 52 6f 77 69 64 3b 0a 20 20   = p->iRowid;.  
f030: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f040: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
f050: 6e 74 36 34 28 63 74 78 2c 20 28 73 71 6c 69 74  nt64(ctx, (sqlit
f060: 65 33 5f 69 6e 74 36 34 29 69 4b 65 79 29 3b 0a  e3_int64)iKey);.
f070: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
f080: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
f090: 61 73 65 20 4a 45 41 43 48 5f 56 41 4c 55 45 3a  ase JEACH_VALUE:
f0a0: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 68   {.      if( pTh
f0b0: 69 73 2d 3e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e  is->jnFlags & JN
f0c0: 4f 44 45 5f 4c 41 42 45 4c 20 29 20 70 54 68 69  ODE_LABEL ) pThi
f0d0: 73 2b 2b 3b 0a 20 20 20 20 20 20 6a 73 6f 6e 52  s++;.      jsonR
f0e0: 65 74 75 72 6e 28 70 54 68 69 73 2c 20 63 74 78  eturn(pThis, ctx
f0f0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
f100: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
f110: 65 20 4a 45 41 43 48 5f 54 59 50 45 3a 20 7b 0a  e JEACH_TYPE: {.
f120: 20 20 20 20 20 20 69 66 28 20 70 54 68 69 73 2d        if( pThis-
f130: 3e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45  >jnFlags & JNODE
f140: 5f 4c 41 42 45 4c 20 29 20 70 54 68 69 73 2b 2b  _LABEL ) pThis++
f150: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
f160: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 74 78 2c  result_text(ctx,
f170: 20 6a 73 6f 6e 54 79 70 65 5b 70 54 68 69 73 2d   jsonType[pThis-
f180: 3e 65 54 79 70 65 5d 2c 20 2d 31 2c 20 53 51 4c  >eType], -1, SQL
f190: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
f1a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
f1b0: 20 20 20 20 63 61 73 65 20 4a 45 41 43 48 5f 41      case JEACH_A
f1c0: 54 4f 4d 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  TOM: {.      if(
f1d0: 20 70 54 68 69 73 2d 3e 6a 6e 46 6c 61 67 73 20   pThis->jnFlags 
f1e0: 26 20 4a 4e 4f 44 45 5f 4c 41 42 45 4c 20 29 20  & JNODE_LABEL ) 
f1f0: 70 54 68 69 73 2b 2b 3b 0a 20 20 20 20 20 20 69  pThis++;.      i
f200: 66 28 20 70 54 68 69 73 2d 3e 65 54 79 70 65 3e  f( pThis->eType>
f210: 3d 4a 53 4f 4e 5f 41 52 52 41 59 20 29 20 62 72  =JSON_ARRAY ) br
f220: 65 61 6b 3b 0a 20 20 20 20 20 20 6a 73 6f 6e 52  eak;.      jsonR
f230: 65 74 75 72 6e 28 70 54 68 69 73 2c 20 63 74 78  eturn(pThis, ctx
f240: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
f250: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
f260: 65 20 4a 45 41 43 48 5f 49 44 3a 20 7b 0a 20 20  e JEACH_ID: {.  
f270: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
f280: 6c 74 5f 69 6e 74 36 34 28 63 74 78 2c 20 0a 20  lt_int64(ctx, . 
f290: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
f2a0: 5f 69 6e 74 36 34 29 70 2d 3e 69 20 2b 20 28 28  _int64)p->i + ((
f2b0: 70 54 68 69 73 2d 3e 6a 6e 46 6c 61 67 73 20 26  pThis->jnFlags &
f2c0: 20 4a 4e 4f 44 45 5f 4c 41 42 45 4c 29 21 3d 30   JNODE_LABEL)!=0
f2d0: 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ));.      break;
f2e0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
f2f0: 4a 45 41 43 48 5f 50 41 52 45 4e 54 3a 20 7b 0a  JEACH_PARENT: {.
f300: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 3e 70        if( p->i>p
f310: 2d 3e 69 42 65 67 69 6e 20 26 26 20 70 2d 3e 62  ->iBegin && p->b
f320: 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20  Recursive ){.   
f330: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
f340: 75 6c 74 5f 69 6e 74 36 34 28 63 74 78 2c 20 28  ult_int64(ctx, (
f350: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 2d  sqlite3_int64)p-
f360: 3e 73 50 61 72 73 65 2e 61 55 70 5b 70 2d 3e 69  >sParse.aUp[p->i
f370: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
f380: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
f390: 20 20 20 63 61 73 65 20 4a 45 41 43 48 5f 46 55     case JEACH_FU
f3a0: 4c 4c 4b 45 59 3a 20 7b 0a 20 20 20 20 20 20 4a  LLKEY: {.      J
f3b0: 73 6f 6e 53 74 72 69 6e 67 20 78 3b 0a 20 20 20  sonString x;.   
f3c0: 20 20 20 6a 73 6f 6e 49 6e 69 74 28 26 78 2c 20     jsonInit(&x, 
f3d0: 63 74 78 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ctx);.      if( 
f3e0: 70 2d 3e 62 52 65 63 75 72 73 69 76 65 20 29 7b  p->bRecursive ){
f3f0: 0a 20 20 20 20 20 20 20 20 6a 73 6f 6e 45 61 63  .        jsonEac
f400: 68 43 6f 6d 70 75 74 65 50 61 74 68 28 70 2c 20  hComputePath(p, 
f410: 26 78 2c 20 70 2d 3e 69 29 3b 0a 20 20 20 20 20  &x, p->i);.     
f420: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f430: 69 66 28 20 70 2d 3e 7a 52 6f 6f 74 20 29 7b 0a  if( p->zRoot ){.
f440: 20 20 20 20 20 20 20 20 20 20 6a 73 6f 6e 41 70            jsonAp
f450: 70 65 6e 64 52 61 77 28 26 78 2c 20 70 2d 3e 7a  pendRaw(&x, p->z
f460: 52 6f 6f 74 2c 20 28 69 6e 74 29 73 74 72 6c 65  Root, (int)strle
f470: 6e 28 70 2d 3e 7a 52 6f 6f 74 29 29 3b 0a 20 20  n(p->zRoot));.  
f480: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f490: 20 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e         jsonAppen
f4a0: 64 43 68 61 72 28 26 78 2c 20 27 24 27 29 3b 0a  dChar(&x, '$');.
f4b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f4c0: 20 20 69 66 28 20 70 2d 3e 65 54 79 70 65 3d 3d    if( p->eType==
f4d0: 4a 53 4f 4e 5f 41 52 52 41 59 20 29 7b 0a 20 20  JSON_ARRAY ){.  
f4e0: 20 20 20 20 20 20 20 20 6a 73 6f 6e 50 72 69 6e          jsonPrin
f4f0: 74 66 28 33 30 2c 20 26 78 2c 20 22 5b 25 64 5d  tf(30, &x, "[%d]
f500: 22 2c 20 70 2d 3e 69 52 6f 77 69 64 29 3b 0a 20  ", p->iRowid);. 
f510: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
f520: 20 70 2d 3e 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f   p->eType==JSON_
f530: 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 20 20  OBJECT ){.      
f540: 20 20 20 20 6a 73 6f 6e 50 72 69 6e 74 66 28 70      jsonPrintf(p
f550: 54 68 69 73 2d 3e 6e 2c 20 26 78 2c 20 22 2e 25  This->n, &x, ".%
f560: 2e 2a 73 22 2c 20 70 54 68 69 73 2d 3e 6e 2d 32  .*s", pThis->n-2
f570: 2c 20 70 54 68 69 73 2d 3e 75 2e 7a 4a 43 6f 6e  , pThis->u.zJCon
f580: 74 65 6e 74 2b 31 29 3b 0a 20 20 20 20 20 20 20  tent+1);.       
f590: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
f5a0: 20 6a 73 6f 6e 52 65 73 75 6c 74 28 26 78 29 3b   jsonResult(&x);
f5b0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f5c0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 45 41    }.    case JEA
f5d0: 43 48 5f 50 41 54 48 3a 20 7b 0a 20 20 20 20 20  CH_PATH: {.     
f5e0: 20 69 66 28 20 70 2d 3e 62 52 65 63 75 72 73 69   if( p->bRecursi
f5f0: 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20 4a 73  ve ){.        Js
f600: 6f 6e 53 74 72 69 6e 67 20 78 3b 0a 20 20 20 20  onString x;.    
f610: 20 20 20 20 6a 73 6f 6e 49 6e 69 74 28 26 78 2c      jsonInit(&x,
f620: 20 63 74 78 29 3b 0a 20 20 20 20 20 20 20 20 6a   ctx);.        j
f630: 73 6f 6e 45 61 63 68 43 6f 6d 70 75 74 65 50 61  sonEachComputePa
f640: 74 68 28 70 2c 20 26 78 2c 20 70 2d 3e 73 50 61  th(p, &x, p->sPa
f650: 72 73 65 2e 61 55 70 5b 70 2d 3e 69 5d 29 3b 0a  rse.aUp[p->i]);.
f660: 20 20 20 20 20 20 20 20 6a 73 6f 6e 52 65 73 75          jsonResu
f670: 6c 74 28 26 78 29 3b 0a 20 20 20 20 20 20 20 20  lt(&x);.        
f680: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
f690: 20 20 20 20 20 2f 2a 20 46 6f 72 20 6a 73 6f 6e       /* For json
f6a0: 5f 65 61 63 68 28 29 20 70 61 74 68 20 61 6e 64  _each() path and
f6b0: 20 72 6f 6f 74 20 61 72 65 20 74 68 65 20 73 61   root are the sa
f6c0: 6d 65 20 73 6f 20 66 61 6c 6c 20 74 68 72 6f 75  me so fall throu
f6d0: 67 68 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f  gh.      ** into
f6e0: 20 74 68 65 20 72 6f 6f 74 20 63 61 73 65 20 2a   the root case *
f6f0: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  /.    }.    defa
f700: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e  ult: {.      con
f710: 73 74 20 63 68 61 72 20 2a 7a 52 6f 6f 74 20 3d  st char *zRoot =
f720: 20 70 2d 3e 7a 52 6f 6f 74 3b 0a 20 20 20 20 20   p->zRoot;.     
f730: 20 69 66 28 20 7a 52 6f 6f 74 3d 3d 30 20 29 20   if( zRoot==0 ) 
f740: 7a 52 6f 6f 74 20 3d 20 22 24 22 3b 0a 20 20 20  zRoot = "$";.   
f750: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
f760: 74 5f 74 65 78 74 28 63 74 78 2c 20 7a 52 6f 6f  t_text(ctx, zRoo
f770: 74 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54  t, -1, SQLITE_ST
f780: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65  ATIC);.      bre
f790: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
f7a0: 73 65 20 4a 45 41 43 48 5f 4a 53 4f 4e 3a 20 7b  se JEACH_JSON: {
f7b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
f7c0: 3d 3d 4a 45 41 43 48 5f 4a 53 4f 4e 20 29 3b 0a  ==JEACH_JSON );.
f7d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
f7e0: 73 75 6c 74 5f 74 65 78 74 28 63 74 78 2c 20 70  sult_text(ctx, p
f7f0: 2d 3e 73 50 61 72 73 65 2e 7a 4a 73 6f 6e 2c 20  ->sParse.zJson, 
f800: 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  -1, SQLITE_STATI
f810: 43 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  C);.      break;
f820: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
f830: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
f840: 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ../* Return the 
f850: 63 75 72 72 65 6e 74 20 72 6f 77 69 64 20 76 61  current rowid va
f860: 6c 75 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  lue */.static in
f870: 74 20 6a 73 6f 6e 45 61 63 68 52 6f 77 69 64 28  t jsonEachRowid(
f880: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
f890: 73 6f 72 20 2a 63 75 72 2c 20 73 71 6c 69 74 65  sor *cur, sqlite
f8a0: 5f 69 6e 74 36 34 20 2a 70 52 6f 77 69 64 29 7b  _int64 *pRowid){
f8b0: 0a 20 20 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f  .  JsonEachCurso
f8c0: 72 20 2a 70 20 3d 20 28 4a 73 6f 6e 45 61 63 68  r *p = (JsonEach
f8d0: 43 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20 20 2a  Cursor*)cur;.  *
f8e0: 70 52 6f 77 69 64 20 3d 20 70 2d 3e 69 52 6f 77  pRowid = p->iRow
f8f0: 69 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  id;.  return SQL
f900: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68  ITE_OK;.}../* Th
f910: 65 20 71 75 65 72 79 20 73 74 72 61 74 65 67 79  e query strategy
f920: 20 69 73 20 74 6f 20 6c 6f 6f 6b 20 66 6f 72 20   is to look for 
f930: 61 6e 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  an equality cons
f940: 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6a 73  traint on the js
f950: 6f 6e 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 20 20 57  on.** column.  W
f960: 69 74 68 6f 75 74 20 73 75 63 68 20 61 20 63 6f  ithout such a co
f970: 6e 73 74 72 61 69 6e 74 2c 20 74 68 65 20 74 61  nstraint, the ta
f980: 62 6c 65 20 63 61 6e 6e 6f 74 20 6f 70 65 72 61  ble cannot opera
f990: 74 65 2e 20 20 69 64 78 4e 75 6d 20 69 73 0a 2a  te.  idxNum is.*
f9a0: 2a 20 31 20 69 66 20 74 68 65 20 63 6f 6e 73 74  * 1 if the const
f9b0: 72 61 69 6e 74 20 69 73 20 66 6f 75 6e 64 2c 20  raint is found, 
f9c0: 33 20 69 66 20 74 68 65 20 63 6f 6e 73 74 72 61  3 if the constra
f9d0: 69 6e 74 20 61 6e 64 20 7a 52 6f 6f 74 20 61 72  int and zRoot ar
f9e0: 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 61 6e 64 20  e found,.** and 
f9f0: 30 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  0 otherwise..*/.
fa00: 73 74 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e 45  static int jsonE
fa10: 61 63 68 42 65 73 74 49 6e 64 65 78 28 0a 20 20  achBestIndex(.  
fa20: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 74 61  sqlite3_vtab *ta
fa30: 62 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64  b,.  sqlite3_ind
fa40: 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66  ex_info *pIdxInf
fa50: 6f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  o.){.  int i;   
fa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa70: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
fa80: 72 20 6f 72 20 63 6f 6d 70 75 74 65 64 20 61 72  r or computed ar
fa90: 72 61 79 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  ray index */.  i
faa0: 6e 74 20 61 49 64 78 5b 32 5d 3b 20 20 20 20 20  nt aIdx[2];     
fab0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
fac0: 65 78 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74  ex of constraint
fad0: 73 20 66 6f 72 20 4a 53 4f 4e 20 61 6e 64 20 52  s for JSON and R
fae0: 4f 4f 54 20 2a 2f 0a 20 20 69 6e 74 20 75 6e 75  OOT */.  int unu
faf0: 73 61 62 6c 65 4d 61 73 6b 20 3d 20 30 3b 20 20  sableMask = 0;  
fb00: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 75      /* Mask of u
fb10: 6e 75 73 61 62 6c 65 20 4a 53 4f 4e 20 61 6e 64  nusable JSON and
fb20: 20 52 4f 4f 54 20 63 6f 6e 73 74 72 61 69 6e 74   ROOT constraint
fb30: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 4d 61  s */.  int idxMa
fb40: 73 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  sk = 0;         
fb50: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 75 73 61    /* Mask of usa
fb60: 62 6c 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e  ble == constrain
fb70: 74 73 20 4a 53 4f 4e 20 61 6e 64 20 52 4f 4f 54  ts JSON and ROOT
fb80: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 73 74 72 75   */.  const stru
fb90: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
fba0: 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 43 6f  _constraint *pCo
fbb0: 6e 73 74 72 61 69 6e 74 3b 0a 0a 20 20 2f 2a 20  nstraint;..  /* 
fbc0: 54 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74  This implementat
fbd0: 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74  ion assumes that
fbe0: 20 4a 53 4f 4e 20 61 6e 64 20 52 4f 4f 54 20 61   JSON and ROOT a
fbf0: 72 65 20 74 68 65 20 6c 61 73 74 20 74 77 6f 0a  re the last two.
fc00: 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20    ** columns in 
fc10: 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 61  the table */.  a
fc20: 73 73 65 72 74 28 20 4a 45 41 43 48 5f 52 4f 4f  ssert( JEACH_ROO
fc30: 54 20 3d 3d 20 4a 45 41 43 48 5f 4a 53 4f 4e 2b  T == JEACH_JSON+
fc40: 31 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  1 );.  UNUSED_PA
fc50: 52 41 4d 28 74 61 62 29 3b 0a 20 20 61 49 64 78  RAM(tab);.  aIdx
fc60: 5b 30 5d 20 3d 20 61 49 64 78 5b 31 5d 20 3d 20  [0] = aIdx[1] = 
fc70: 2d 31 3b 0a 20 20 70 43 6f 6e 73 74 72 61 69 6e  -1;.  pConstrain
fc80: 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43  t = pIdxInfo->aC
fc90: 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 66 6f 72  onstraint;.  for
fca0: 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f  (i=0; i<pIdxInfo
fcb0: 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
fcc0: 2b 2b 2c 20 70 43 6f 6e 73 74 72 61 69 6e 74 2b  ++, pConstraint+
fcd0: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c  +){.    int iCol
fce0: 3b 0a 20 20 20 20 69 6e 74 20 69 4d 61 73 6b 3b  ;.    int iMask;
fcf0: 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 73 74 72  .    if( pConstr
fd00: 61 69 6e 74 2d 3e 69 43 6f 6c 75 6d 6e 20 3c 20  aint->iColumn < 
fd10: 4a 45 41 43 48 5f 4a 53 4f 4e 20 29 20 63 6f 6e  JEACH_JSON ) con
fd20: 74 69 6e 75 65 3b 0a 20 20 20 20 69 43 6f 6c 20  tinue;.    iCol 
fd30: 3d 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 2d 20 4a 45 41 43 48 5f 4a  Column - JEACH_J
fd50: 53 4f 4e 3b 0a 20 20 20 20 61 73 73 65 72 74 28  SON;.    assert(
fd60: 20 69 43 6f 6c 3d 3d 30 20 7c 7c 20 69 43 6f 6c   iCol==0 || iCol
fd70: 3d 3d 31 20 29 3b 0a 20 20 20 20 69 4d 61 73 6b  ==1 );.    iMask
fd80: 20 3d 20 31 20 3c 3c 20 69 43 6f 6c 3b 0a 20 20   = 1 << iCol;.  
fd90: 20 20 69 66 28 20 70 43 6f 6e 73 74 72 61 69 6e    if( pConstrain
fda0: 74 2d 3e 75 73 61 62 6c 65 3d 3d 30 20 29 7b 0a  t->usable==0 ){.
fdb0: 20 20 20 20 20 20 75 6e 75 73 61 62 6c 65 4d 61        unusableMa
fdc0: 73 6b 20 7c 3d 20 69 4d 61 73 6b 3b 0a 20 20 20  sk |= iMask;.   
fdd0: 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6e 73   }else if( pCons
fde0: 74 72 61 69 6e 74 2d 3e 6f 70 3d 3d 53 51 4c 49  traint->op==SQLI
fdf0: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
fe00: 49 4e 54 5f 45 51 20 29 7b 0a 20 20 20 20 20 20  INT_EQ ){.      
fe10: 61 49 64 78 5b 69 43 6f 6c 5d 20 3d 20 69 3b 0a  aIdx[iCol] = i;.
fe20: 20 20 20 20 20 20 69 64 78 4d 61 73 6b 20 7c 3d        idxMask |=
fe30: 20 69 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20   iMask;.    }.  
fe40: 7d 0a 20 20 69 66 28 20 28 75 6e 75 73 61 62 6c  }.  if( (unusabl
fe50: 65 4d 61 73 6b 20 26 20 7e 69 64 78 4d 61 73 6b  eMask & ~idxMask
fe60: 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49  )!=0 ){.    /* I
fe70: 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
fe80: 75 6e 75 73 61 62 6c 65 20 63 6f 6e 73 74 72 61  unusable constra
fe90: 69 6e 74 73 20 6f 6e 20 4a 53 4f 4e 20 6f 72 20  ints on JSON or 
fea0: 52 4f 4f 54 2c 20 74 68 65 6e 20 72 65 6a 65 63  ROOT, then rejec
feb0: 74 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 65 6e  t.    ** this en
fec0: 74 69 72 65 20 70 6c 61 6e 20 2a 2f 0a 20 20 20  tire plan */.   
fed0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
fee0: 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 7d 0a 20  ONSTRAINT;.  }. 
fef0: 20 69 66 28 20 61 49 64 78 5b 30 5d 3c 30 20 29   if( aIdx[0]<0 )
ff00: 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 4a 53 4f 4e  {.    /* No JSON
ff10: 20 69 6e 70 75 74 2e 20 20 4c 65 61 76 65 20 65   input.  Leave e
ff20: 73 74 69 6d 61 74 65 64 43 6f 73 74 20 61 74 20  stimatedCost at 
ff30: 74 68 65 20 68 75 67 65 20 76 61 6c 75 65 20 74  the huge value t
ff40: 68 61 74 20 69 74 20 77 61 73 0a 20 20 20 20 2a  hat it was.    *
ff50: 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  * initialized to
ff60: 20 74 6f 20 64 69 73 63 6f 75 72 61 67 65 20 74   to discourage t
ff70: 68 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72  he query planner
ff80: 20 66 72 6f 6d 20 73 65 6c 65 63 74 69 6e 67 20   from selecting 
ff90: 74 68 69 73 0a 20 20 20 20 2a 2a 20 70 6c 61 6e  this.    ** plan
ffa0: 2e 20 2a 2f 0a 20 20 20 20 70 49 64 78 49 6e 66  . */.    pIdxInf
ffb0: 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20  o->idxNum = 0;. 
ffc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78   }else{.    pIdx
ffd0: 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43  Info->estimatedC
ffe0: 6f 73 74 20 3d 20 31 2e 30 3b 0a 20 20 20 20 69  ost = 1.0;.    i
fff0: 20 3d 20 61 49 64 78 5b 30 5d 3b 0a 20 20 20 20   = aIdx[0];.    
10000 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
10010 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72  raintUsage[i].ar
10020 67 76 49 6e 64 65 78 20 3d 20 31 3b 0a 20 20 20  gvIndex = 1;.   
10030 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73   pIdxInfo->aCons
10040 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f  traintUsage[i].o
10050 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  mit = 1;.    if(
10060 20 61 49 64 78 5b 31 5d 3c 30 20 29 7b 0a 20 20   aIdx[1]<0 ){.  
10070 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64      pIdxInfo->id
10080 78 4e 75 6d 20 3d 20 31 3b 20 20 2f 2a 20 4f 6e  xNum = 1;  /* On
10090 6c 79 20 4a 53 4f 4e 20 73 75 70 70 6c 69 65 64  ly JSON supplied
100a0 2e 20 20 50 6c 61 6e 20 31 20 2a 2f 0a 20 20 20  .  Plan 1 */.   
100b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 20   }else{.      i 
100c0 3d 20 61 49 64 78 5b 31 5d 3b 0a 20 20 20 20 20  = aIdx[1];.     
100d0 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73   pIdxInfo->aCons
100e0 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61  traintUsage[i].a
100f0 72 67 76 49 6e 64 65 78 20 3d 20 32 3b 0a 20 20  rgvIndex = 2;.  
10100 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43      pIdxInfo->aC
10110 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
10120 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  ].omit = 1;.    
10130 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e    pIdxInfo->idxN
10140 75 6d 20 3d 20 33 3b 20 20 2f 2a 20 42 6f 74 68  um = 3;  /* Both
10150 20 4a 53 4f 4e 20 61 6e 64 20 52 4f 4f 54 20 61   JSON and ROOT a
10160 72 65 20 73 75 70 70 6c 69 65 64 2e 20 20 50 6c  re supplied.  Pl
10170 61 6e 20 33 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  an 3 */.    }.  
10180 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
10190 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 53 74 61 72  E_OK;.}../* Star
101a0 74 20 61 20 73 65 61 72 63 68 20 6f 6e 20 61 20  t a search on a 
101b0 6e 65 77 20 4a 53 4f 4e 20 73 74 72 69 6e 67 20  new JSON string 
101c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 73  */.static int js
101d0 6f 6e 45 61 63 68 46 69 6c 74 65 72 28 0a 20 20  onEachFilter(.  
101e0 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
101f0 73 6f 72 20 2a 63 75 72 2c 0a 20 20 69 6e 74 20  sor *cur,.  int 
10200 69 64 78 4e 75 6d 2c 20 63 6f 6e 73 74 20 63 68  idxNum, const ch
10210 61 72 20 2a 69 64 78 53 74 72 2c 0a 20 20 69 6e  ar *idxStr,.  in
10220 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f  t argc, sqlite3_
10230 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
10240 20 20 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72    JsonEachCursor
10250 20 2a 70 20 3d 20 28 4a 73 6f 6e 45 61 63 68 43   *p = (JsonEachC
10260 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20 20 63 6f  ursor*)cur;.  co
10270 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63  nst char *z;.  c
10280 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 6f 6f 74  onst char *zRoot
10290 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
102a0 69 6e 74 36 34 20 6e 3b 0a 0a 20 20 55 4e 55 53  int64 n;..  UNUS
102b0 45 44 5f 50 41 52 41 4d 28 69 64 78 53 74 72 29  ED_PARAM(idxStr)
102c0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
102d0 28 61 72 67 63 29 3b 0a 20 20 6a 73 6f 6e 45 61  (argc);.  jsonEa
102e0 63 68 43 75 72 73 6f 72 52 65 73 65 74 28 70 29  chCursorReset(p)
102f0 3b 0a 20 20 69 66 28 20 69 64 78 4e 75 6d 3d 3d  ;.  if( idxNum==
10300 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
10310 45 5f 4f 4b 3b 0a 20 20 7a 20 3d 20 28 63 6f 6e  E_OK;.  z = (con
10320 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
10330 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
10340 5b 30 5d 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  [0]);.  if( z==0
10350 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
10360 5f 4f 4b 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74  _OK;.  n = sqlit
10370 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
10380 72 67 76 5b 30 5d 29 3b 0a 20 20 70 2d 3e 7a 4a  rgv[0]);.  p->zJ
10390 73 6f 6e 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  son = sqlite3_ma
103a0 6c 6c 6f 63 36 34 28 20 6e 2b 31 20 29 3b 0a 20  lloc64( n+1 );. 
103b0 20 69 66 28 20 70 2d 3e 7a 4a 73 6f 6e 3d 3d 30   if( p->zJson==0
103c0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
103d0 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 63 70 79  _NOMEM;.  memcpy
103e0 28 70 2d 3e 7a 4a 73 6f 6e 2c 20 7a 2c 20 28 73  (p->zJson, z, (s
103f0 69 7a 65 5f 74 29 6e 2b 31 29 3b 0a 20 20 69 66  ize_t)n+1);.  if
10400 28 20 6a 73 6f 6e 50 61 72 73 65 28 26 70 2d 3e  ( jsonParse(&p->
10410 73 50 61 72 73 65 2c 20 30 2c 20 70 2d 3e 7a 4a  sParse, 0, p->zJ
10420 73 6f 6e 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  son) ){.    int 
10430 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
10440 4d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 50  M;.    if( p->sP
10450 61 72 73 65 2e 6f 6f 6d 3d 3d 30 20 29 7b 0a 20  arse.oom==0 ){. 
10460 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
10470 65 28 63 75 72 2d 3e 70 56 74 61 62 2d 3e 7a 45  e(cur->pVtab->zE
10480 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 63 75  rrMsg);.      cu
10490 72 2d 3e 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  r->pVtab->zErrMs
104a0 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
104b0 6e 74 66 28 22 6d 61 6c 66 6f 72 6d 65 64 20 4a  ntf("malformed J
104c0 53 4f 4e 22 29 3b 0a 20 20 20 20 20 20 69 66 28  SON");.      if(
104d0 20 63 75 72 2d 3e 70 56 74 61 62 2d 3e 7a 45 72   cur->pVtab->zEr
104e0 72 4d 73 67 20 29 20 72 63 20 3d 20 53 51 4c 49  rMsg ) rc = SQLI
104f0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
10500 20 20 20 20 6a 73 6f 6e 45 61 63 68 43 75 72 73      jsonEachCurs
10510 6f 72 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20  orReset(p);.    
10520 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 65 6c  return rc;.  }el
10530 73 65 20 69 66 28 20 70 2d 3e 62 52 65 63 75 72  se if( p->bRecur
10540 73 69 76 65 20 26 26 20 6a 73 6f 6e 50 61 72 73  sive && jsonPars
10550 65 46 69 6e 64 50 61 72 65 6e 74 73 28 26 70 2d  eFindParents(&p-
10560 3e 73 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20  >sParse) ){.    
10570 6a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 52 65  jsonEachCursorRe
10580 73 65 74 28 70 29 3b 0a 20 20 20 20 72 65 74 75  set(p);.    retu
10590 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
105a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4a 73  .  }else{.    Js
105b0 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 20 3d 20  onNode *pNode = 
105c0 30 3b 0a 20 20 20 20 69 66 28 20 69 64 78 4e 75  0;.    if( idxNu
105d0 6d 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 63 6f  m==3 ){.      co
105e0 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20 3d  nst char *zErr =
105f0 20 30 3b 0a 20 20 20 20 20 20 7a 52 6f 6f 74 20   0;.      zRoot 
10600 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
10610 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
10620 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20  t(argv[1]);.    
10630 20 20 69 66 28 20 7a 52 6f 6f 74 3d 3d 30 20 29    if( zRoot==0 )
10640 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10650 4b 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c  K;.      n = sql
10660 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
10670 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 20  (argv[1]);.     
10680 20 70 2d 3e 7a 52 6f 6f 74 20 3d 20 73 71 6c 69   p->zRoot = sqli
10690 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 6e 2b  te3_malloc64( n+
106a0 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  1 );.      if( p
106b0 2d 3e 7a 52 6f 6f 74 3d 3d 30 20 29 20 72 65 74  ->zRoot==0 ) ret
106c0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
106d0 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
106e0 2d 3e 7a 52 6f 6f 74 2c 20 7a 52 6f 6f 74 2c 20  ->zRoot, zRoot, 
106f0 28 73 69 7a 65 5f 74 29 6e 2b 31 29 3b 0a 20 20  (size_t)n+1);.  
10700 20 20 20 20 69 66 28 20 7a 52 6f 6f 74 5b 30 5d      if( zRoot[0]
10710 21 3d 27 24 27 20 29 7b 0a 20 20 20 20 20 20 20  !='$' ){.       
10720 20 7a 45 72 72 20 3d 20 7a 52 6f 6f 74 3b 0a 20   zErr = zRoot;. 
10730 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10740 20 20 20 20 70 4e 6f 64 65 20 3d 20 6a 73 6f 6e      pNode = json
10750 4c 6f 6f 6b 75 70 53 74 65 70 28 26 70 2d 3e 73  LookupStep(&p->s
10760 50 61 72 73 65 2c 20 30 2c 20 70 2d 3e 7a 52 6f  Parse, 0, p->zRo
10770 6f 74 2b 31 2c 20 30 2c 20 26 7a 45 72 72 29 3b  ot+1, 0, &zErr);
10780 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
10790 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 20  f( zErr ){.     
107a0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
107b0 63 75 72 2d 3e 70 56 74 61 62 2d 3e 7a 45 72 72  cur->pVtab->zErr
107c0 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 63 75  Msg);.        cu
107d0 72 2d 3e 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  r->pVtab->zErrMs
107e0 67 20 3d 20 6a 73 6f 6e 50 61 74 68 53 79 6e 74  g = jsonPathSynt
107f0 61 78 45 72 72 6f 72 28 7a 45 72 72 29 3b 0a 20  axError(zErr);. 
10800 20 20 20 20 20 20 20 6a 73 6f 6e 45 61 63 68 43         jsonEachC
10810 75 72 73 6f 72 52 65 73 65 74 28 70 29 3b 0a 20  ursorReset(p);. 
10820 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 63 75         return cu
10830 72 2d 3e 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  r->pVtab->zErrMs
10840 67 20 3f 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  g ? SQLITE_ERROR
10850 20 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   : SQLITE_NOMEM;
10860 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
10870 20 70 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20   pNode==0 ){.   
10880 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
10890 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
108a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
108b0 70 4e 6f 64 65 20 3d 20 70 2d 3e 73 50 61 72 73  pNode = p->sPars
108c0 65 2e 61 4e 6f 64 65 3b 0a 20 20 20 20 7d 0a 20  e.aNode;.    }. 
108d0 20 20 20 70 2d 3e 69 42 65 67 69 6e 20 3d 20 70     p->iBegin = p
108e0 2d 3e 69 20 3d 20 28 69 6e 74 29 28 70 4e 6f 64  ->i = (int)(pNod
108f0 65 20 2d 20 70 2d 3e 73 50 61 72 73 65 2e 61 4e  e - p->sParse.aN
10900 6f 64 65 29 3b 0a 20 20 20 20 70 2d 3e 65 54 79  ode);.    p->eTy
10910 70 65 20 3d 20 70 4e 6f 64 65 2d 3e 65 54 79 70  pe = pNode->eTyp
10920 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 54  e;.    if( p->eT
10930 79 70 65 3e 3d 4a 53 4f 4e 5f 41 52 52 41 59 20  ype>=JSON_ARRAY 
10940 29 7b 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e  ){.      pNode->
10950 75 2e 69 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20  u.iKey = 0;.    
10960 20 20 70 2d 3e 69 45 6e 64 20 3d 20 70 2d 3e 69    p->iEnd = p->i
10970 20 2b 20 70 4e 6f 64 65 2d 3e 6e 20 2b 20 31 3b   + pNode->n + 1;
10980 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 62 52  .      if( p->bR
10990 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
109a0 20 20 20 20 70 2d 3e 65 54 79 70 65 20 3d 20 70      p->eType = p
109b0 2d 3e 73 50 61 72 73 65 2e 61 4e 6f 64 65 5b 70  ->sParse.aNode[p
109c0 2d 3e 73 50 61 72 73 65 2e 61 55 70 5b 70 2d 3e  ->sParse.aUp[p->
109d0 69 5d 5d 2e 65 54 79 70 65 3b 0a 20 20 20 20 20  i]].eType;.     
109e0 20 20 20 69 66 28 20 70 2d 3e 69 3e 30 20 26 26     if( p->i>0 &&
109f0 20 28 70 2d 3e 73 50 61 72 73 65 2e 61 4e 6f 64   (p->sParse.aNod
10a00 65 5b 70 2d 3e 69 2d 31 5d 2e 6a 6e 46 6c 61 67  e[p->i-1].jnFlag
10a10 73 20 26 20 4a 4e 4f 44 45 5f 4c 41 42 45 4c 29  s & JNODE_LABEL)
10a20 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
10a30 20 70 2d 3e 69 2d 2d 3b 0a 20 20 20 20 20 20 20   p->i--;.       
10a40 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
10a50 20 20 20 20 20 20 20 20 70 2d 3e 69 2b 2b 3b 0a          p->i++;.
10a60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
10a70 65 7b 0a 20 20 20 20 20 20 70 2d 3e 69 45 6e 64  e{.      p->iEnd
10a80 20 3d 20 70 2d 3e 69 2b 31 3b 0a 20 20 20 20 7d   = p->i+1;.    }
10a90 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
10aa0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54  LITE_OK;.}../* T
10ab0 68 65 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68  he methods of th
10ac0 65 20 6a 73 6f 6e 5f 65 61 63 68 20 76 69 72 74  e json_each virt
10ad0 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 73 74 61  ual table */.sta
10ae0 74 69 63 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75  tic sqlite3_modu
10af0 6c 65 20 6a 73 6f 6e 45 61 63 68 4d 6f 64 75 6c  le jsonEachModul
10b00 65 20 3d 20 7b 0a 20 20 30 2c 20 20 20 20 20 20  e = {.  0,      
10b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
10b30 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
10b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10b50 2a 20 78 43 72 65 61 74 65 20 2a 2f 0a 20 20 6a  * xCreate */.  j
10b60 73 6f 6e 45 61 63 68 43 6f 6e 6e 65 63 74 2c 20  sonEachConnect, 
10b70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f            /* xCo
10b80 6e 6e 65 63 74 20 2a 2f 0a 20 20 6a 73 6f 6e 45  nnect */.  jsonE
10b90 61 63 68 42 65 73 74 49 6e 64 65 78 2c 20 20 20  achBestIndex,   
10ba0 20 20 20 20 20 20 2f 2a 20 78 42 65 73 74 49 6e        /* xBestIn
10bb0 64 65 78 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63  dex */.  jsonEac
10bc0 68 44 69 73 63 6f 6e 6e 65 63 74 2c 20 20 20 20  hDisconnect,    
10bd0 20 20 20 20 2f 2a 20 78 44 69 73 63 6f 6e 6e 65      /* xDisconne
10be0 63 74 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  ct */.  0,      
10bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c00 20 20 20 2f 2a 20 78 44 65 73 74 72 6f 79 20 2a     /* xDestroy *
10c10 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 4f 70 65 6e  /.  jsonEachOpen
10c20 45 61 63 68 2c 20 20 20 20 20 20 20 20 20 20 2f  Each,          /
10c30 2a 20 78 4f 70 65 6e 20 2d 20 6f 70 65 6e 20 61  * xOpen - open a
10c40 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 6a 73 6f   cursor */.  jso
10c50 6e 45 61 63 68 43 6c 6f 73 65 2c 20 20 20 20 20  nEachClose,     
10c60 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
10c70 65 20 2d 20 63 6c 6f 73 65 20 61 20 63 75 72 73  e - close a curs
10c80 6f 72 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68  or */.  jsonEach
10c90 46 69 6c 74 65 72 2c 20 20 20 20 20 20 20 20 20  Filter,         
10ca0 20 20 20 2f 2a 20 78 46 69 6c 74 65 72 20 2d 20     /* xFilter - 
10cb0 63 6f 6e 66 69 67 75 72 65 20 73 63 61 6e 20 63  configure scan c
10cc0 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
10cd0 6a 73 6f 6e 45 61 63 68 4e 65 78 74 2c 20 20 20  jsonEachNext,   
10ce0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4e             /* xN
10cf0 65 78 74 20 2d 20 61 64 76 61 6e 63 65 20 61 20  ext - advance a 
10d00 63 75 72 73 6f 72 20 2a 2f 0a 20 20 6a 73 6f 6e  cursor */.  json
10d10 45 61 63 68 45 6f 66 2c 20 20 20 20 20 20 20 20  EachEof,        
10d20 20 20 20 20 20 20 20 2f 2a 20 78 45 6f 66 20 2d         /* xEof -
10d30 20 63 68 65 63 6b 20 66 6f 72 20 65 6e 64 20 6f   check for end o
10d40 66 20 73 63 61 6e 20 2a 2f 0a 20 20 6a 73 6f 6e  f scan */.  json
10d50 45 61 63 68 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  EachColumn,     
10d60 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6c 75 6d         /* xColum
10d70 6e 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f  n - read data */
10d80 0a 20 20 6a 73 6f 6e 45 61 63 68 52 6f 77 69 64  .  jsonEachRowid
10d90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
10da0 20 78 52 6f 77 69 64 20 2d 20 72 65 61 64 20 64   xRowid - read d
10db0 61 74 61 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  ata */.  0,     
10dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10dd0 20 20 20 20 2f 2a 20 78 55 70 64 61 74 65 20 2a      /* xUpdate *
10de0 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
10df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10e00 2a 20 78 42 65 67 69 6e 20 2a 2f 0a 20 20 30 2c  * xBegin */.  0,
10e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e           /* xSyn
10e30 63 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  c */.  0,       
10e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e50 20 20 2f 2a 20 78 43 6f 6d 6d 69 74 20 2a 2f 0a    /* xCommit */.
10e60 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
10e70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10e80 78 52 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 30  xRollback */.  0
10e90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10ea0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
10eb0 6e 64 4d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 2c  ndMethod */.  0,
10ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ed0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 6e           /* xRen
10ee0 61 6d 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  ame */.  0,     
10ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f00 20 20 20 20 2f 2a 20 78 53 61 76 65 70 6f 69 6e      /* xSavepoin
10f10 74 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  t */.  0,       
10f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f30 20 20 2f 2a 20 78 52 65 6c 65 61 73 65 20 2a 2f    /* xRelease */
10f40 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
10f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10f60 20 78 52 6f 6c 6c 62 61 63 6b 54 6f 20 2a 2f 0a   xRollbackTo */.
10f70 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
10f80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10f90 78 53 68 61 64 6f 77 4e 61 6d 65 20 2a 2f 0a 7d  xShadowName */.}
10fa0 3b 0a 0a 2f 2a 20 54 68 65 20 6d 65 74 68 6f 64  ;../* The method
10fb0 73 20 6f 66 20 74 68 65 20 6a 73 6f 6e 5f 74 72  s of the json_tr
10fc0 65 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ee virtual table
10fd0 2e 20 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69  . */.static sqli
10fe0 74 65 33 5f 6d 6f 64 75 6c 65 20 6a 73 6f 6e 54  te3_module jsonT
10ff0 72 65 65 4d 6f 64 75 6c 65 20 3d 20 7b 0a 20 20  reeModule = {.  
11000 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
11010 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56             /* iV
11020 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20  ersion */.  0,  
11030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11040 20 20 20 20 20 20 20 2f 2a 20 78 43 72 65 61 74         /* xCreat
11050 65 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 43  e */.  jsonEachC
11060 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20 20  onnect,         
11070 20 20 2f 2a 20 78 43 6f 6e 6e 65 63 74 20 2a 2f    /* xConnect */
11080 0a 20 20 6a 73 6f 6e 45 61 63 68 42 65 73 74 49  .  jsonEachBestI
11090 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 2f 2a  ndex,         /*
110a0 20 78 42 65 73 74 49 6e 64 65 78 20 2a 2f 0a 20   xBestIndex */. 
110b0 20 6a 73 6f 6e 45 61 63 68 44 69 73 63 6f 6e 6e   jsonEachDisconn
110c0 65 63 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 78  ect,        /* x
110d0 44 69 73 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20  Disconnect */.  
110e0 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
110f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
11100 65 73 74 72 6f 79 20 2a 2f 0a 20 20 6a 73 6f 6e  estroy */.  json
11110 45 61 63 68 4f 70 65 6e 54 72 65 65 2c 20 20 20  EachOpenTree,   
11120 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20         /* xOpen 
11130 2d 20 6f 70 65 6e 20 61 20 63 75 72 73 6f 72 20  - open a cursor 
11140 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 43 6c 6f  */.  jsonEachClo
11150 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
11160 2f 2a 20 78 43 6c 6f 73 65 20 2d 20 63 6c 6f 73  /* xClose - clos
11170 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  e a cursor */.  
11180 6a 73 6f 6e 45 61 63 68 46 69 6c 74 65 72 2c 20  jsonEachFilter, 
11190 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
111a0 69 6c 74 65 72 20 2d 20 63 6f 6e 66 69 67 75 72  ilter - configur
111b0 65 20 73 63 61 6e 20 63 6f 6e 73 74 72 61 69 6e  e scan constrain
111c0 74 73 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68  ts */.  jsonEach
111d0 4e 65 78 74 2c 20 20 20 20 20 20 20 20 20 20 20  Next,           
111e0 20 20 20 2f 2a 20 78 4e 65 78 74 20 2d 20 61 64     /* xNext - ad
111f0 76 61 6e 63 65 20 61 20 63 75 72 73 6f 72 20 2a  vance a cursor *
11200 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 45 6f 66 2c  /.  jsonEachEof,
11210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11220 2a 20 78 45 6f 66 20 2d 20 63 68 65 63 6b 20 66  * xEof - check f
11230 6f 72 20 65 6e 64 20 6f 66 20 73 63 61 6e 20 2a  or end of scan *
11240 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 43 6f 6c 75  /.  jsonEachColu
11250 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  mn,            /
11260 2a 20 78 43 6f 6c 75 6d 6e 20 2d 20 72 65 61 64  * xColumn - read
11270 20 64 61 74 61 20 2a 2f 0a 20 20 6a 73 6f 6e 45   data */.  jsonE
11280 61 63 68 52 6f 77 69 64 2c 20 20 20 20 20 20 20  achRowid,       
11290 20 20 20 20 20 20 2f 2a 20 78 52 6f 77 69 64 20        /* xRowid 
112a0 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f 0a 20  - read data */. 
112b0 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
112c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
112d0 55 70 64 61 74 65 20 2a 2f 0a 20 20 30 2c 20 20  Update */.  0,  
112e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112f0 20 20 20 20 20 20 20 2f 2a 20 78 42 65 67 69 6e         /* xBegin
11300 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
11310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11320 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20 30   /* xSync */.  0
11330 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f            /* xCo
11350 6d 6d 69 74 20 2a 2f 0a 20 20 30 2c 20 20 20 20  mmit */.  0,    
11360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11370 20 20 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63       /* xRollbac
11380 6b 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  k */.  0,       
11390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113a0 20 20 2f 2a 20 78 46 69 6e 64 4d 65 74 68 6f 64    /* xFindMethod
113b0 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
113c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113d0 20 2f 2a 20 78 52 65 6e 61 6d 65 20 2a 2f 0a 20   /* xRename */. 
113e0 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
113f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
11400 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 30  Savepoint */.  0
11410 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11420 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65            /* xRe
11430 6c 65 61 73 65 20 2a 2f 0a 20 20 30 2c 20 20 20  lease */.  0,   
11440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11450 20 20 20 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61        /* xRollba
11460 63 6b 54 6f 20 2a 2f 0a 20 20 30 20 20 20 20 20  ckTo */.  0     
11470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11480 20 20 20 20 20 2f 2a 20 78 53 68 61 64 6f 77 4e       /* xShadowN
11490 61 6d 65 20 2a 2f 0a 7d 3b 0a 23 65 6e 64 69 66  ame */.};.#endif
114a0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
114b0 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
114c0 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
114d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
114e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
114f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
11510 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
11520 72 6f 75 74 69 6e 65 73 20 61 72 65 20 74 68 65  routines are the
11530 20 6f 6e 6c 79 20 70 75 62 6c 69 63 61 6c 6c 79   only publically
11540 20 76 69 73 69 62 6c 65 20 69 64 65 6e 74 69 66   visible identif
11550 69 65 72 73 20 69 6e 20 74 68 69 73 0a 2a 2a 20  iers in this.** 
11560 66 69 6c 65 2e 20 20 43 61 6c 6c 20 74 68 65 20  file.  Call the 
11570 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
11580 65 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 72  es in order to r
11590 65 67 69 73 74 65 72 20 74 68 65 20 76 61 72 69  egister the vari
115a0 6f 75 73 20 53 51 4c 0a 2a 2a 20 66 75 6e 63 74  ous SQL.** funct
115b0 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 76 69 72  ions and the vir
115c0 74 75 61 6c 20 74 61 62 6c 65 20 69 6d 70 6c 65  tual table imple
115d0 6d 65 6e 74 65 64 20 62 79 20 74 68 69 73 20 66  mented by this f
115e0 69 6c 65 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ile..***********
115f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11630 2a 2f 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 4a  */..int sqlite3J
11640 73 6f 6e 31 49 6e 69 74 28 73 71 6c 69 74 65 33  son1Init(sqlite3
11650 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 72 63 20   *db){.  int rc 
11660 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
11670 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20  nsigned int i;. 
11680 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
11690 72 75 63 74 20 7b 0a 20 20 20 20 20 63 6f 6e 73  ruct {.     cons
116a0 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20  t char *zName;. 
116b0 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20      int nArg;.  
116c0 20 20 20 69 6e 74 20 66 6c 61 67 3b 0a 20 20 20     int flag;.   
116d0 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28    void (*xFunc)(
116e0 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
116f0 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
11700 75 65 2a 2a 29 3b 0a 20 20 7d 20 61 46 75 6e 63  ue**);.  } aFunc
11710 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 6a 73  [] = {.    { "js
11720 6f 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  on",            
11730 20 20 20 20 20 31 2c 20 30 2c 20 20 20 6a 73 6f       1, 0,   jso
11740 6e 52 65 6d 6f 76 65 46 75 6e 63 20 20 20 20 20  nRemoveFunc     
11750 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f     },.    { "jso
11760 6e 5f 61 72 72 61 79 22 2c 20 20 20 20 20 20 20  n_array",       
11770 20 20 20 2d 31 2c 20 30 2c 20 20 20 6a 73 6f 6e     -1, 0,   json
11780 41 72 72 61 79 46 75 6e 63 20 20 20 20 20 20 20  ArrayFunc       
11790 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e    },.    { "json
117a0 5f 61 72 72 61 79 5f 6c 65 6e 67 74 68 22 2c 20  _array_length", 
117b0 20 20 20 31 2c 20 30 2c 20 20 20 6a 73 6f 6e 41     1, 0,   jsonA
117c0 72 72 61 79 4c 65 6e 67 74 68 46 75 6e 63 20 20  rrayLengthFunc  
117d0 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f   },.    { "json_
117e0 61 72 72 61 79 5f 6c 65 6e 67 74 68 22 2c 20 20  array_length",  
117f0 20 20 32 2c 20 30 2c 20 20 20 6a 73 6f 6e 41 72    2, 0,   jsonAr
11800 72 61 79 4c 65 6e 67 74 68 46 75 6e 63 20 20 20  rayLengthFunc   
11810 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 65  },.    { "json_e
11820 78 74 72 61 63 74 22 2c 20 20 20 20 20 20 20 20  xtract",        
11830 2d 31 2c 20 30 2c 20 20 20 6a 73 6f 6e 45 78 74  -1, 0,   jsonExt
11840 72 61 63 74 46 75 6e 63 20 20 20 20 20 20 20 7d  ractFunc       }
11850 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 69 6e  ,.    { "json_in
11860 73 65 72 74 22 2c 20 20 20 20 20 20 20 20 20 2d  sert",         -
11870 31 2c 20 30 2c 20 20 20 6a 73 6f 6e 53 65 74 46  1, 0,   jsonSetF
11880 75 6e 63 20 20 20 20 20 20 20 20 20 20 20 7d 2c  unc           },
11890 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 6f 62 6a  .    { "json_obj
118a0 65 63 74 22 2c 20 20 20 20 20 20 20 20 20 2d 31  ect",         -1
118b0 2c 20 30 2c 20 20 20 6a 73 6f 6e 4f 62 6a 65 63  , 0,   jsonObjec
118c0 74 46 75 6e 63 20 20 20 20 20 20 20 20 7d 2c 0a  tFunc        },.
118d0 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 70 61 74 63      { "json_patc
118e0 68 22 2c 20 20 20 20 20 20 20 20 20 20 20 32 2c  h",           2,
118f0 20 30 2c 20 20 20 6a 73 6f 6e 50 61 74 63 68 46   0,   jsonPatchF
11900 75 6e 63 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  unc         },. 
11910 20 20 20 7b 20 22 6a 73 6f 6e 5f 71 75 6f 74 65     { "json_quote
11920 22 2c 20 20 20 20 20 20 20 20 20 20 20 31 2c 20  ",           1, 
11930 30 2c 20 20 20 6a 73 6f 6e 51 75 6f 74 65 46 75  0,   jsonQuoteFu
11940 6e 63 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  nc         },.  
11950 20 20 7b 20 22 6a 73 6f 6e 5f 72 65 6d 6f 76 65    { "json_remove
11960 22 2c 20 20 20 20 20 20 20 20 20 2d 31 2c 20 30  ",         -1, 0
11970 2c 20 20 20 6a 73 6f 6e 52 65 6d 6f 76 65 46 75  ,   jsonRemoveFu
11980 6e 63 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  nc        },.   
11990 20 7b 20 22 6a 73 6f 6e 5f 72 65 70 6c 61 63 65   { "json_replace
119a0 22 2c 20 20 20 20 20 20 20 20 2d 31 2c 20 30 2c  ",        -1, 0,
119b0 20 20 20 6a 73 6f 6e 52 65 70 6c 61 63 65 46 75     jsonReplaceFu
119c0 6e 63 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  nc       },.    
119d0 7b 20 22 6a 73 6f 6e 5f 73 65 74 22 2c 20 20 20  { "json_set",   
119e0 20 20 20 20 20 20 20 20 20 2d 31 2c 20 31 2c 20           -1, 1, 
119f0 20 20 6a 73 6f 6e 53 65 74 46 75 6e 63 20 20 20    jsonSetFunc   
11a00 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
11a10 20 22 6a 73 6f 6e 5f 74 79 70 65 22 2c 20 20 20   "json_type",   
11a20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 20           1, 0,  
11a30 20 6a 73 6f 6e 54 79 70 65 46 75 6e 63 20 20 20   jsonTypeFunc   
11a40 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
11a50 22 6a 73 6f 6e 5f 74 79 70 65 22 2c 20 20 20 20  "json_type",    
11a60 20 20 20 20 20 20 20 20 32 2c 20 30 2c 20 20 20          2, 0,   
11a70 6a 73 6f 6e 54 79 70 65 46 75 6e 63 20 20 20 20  jsonTypeFunc    
11a80 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
11a90 6a 73 6f 6e 5f 76 61 6c 69 64 22 2c 20 20 20 20  json_valid",    
11aa0 20 20 20 20 20 20 20 31 2c 20 30 2c 20 20 20 6a         1, 0,   j
11ab0 73 6f 6e 56 61 6c 69 64 46 75 6e 63 20 20 20 20  sonValidFunc    
11ac0 20 20 20 20 20 7d 2c 0a 0a 23 69 66 20 53 51 4c       },..#if SQL
11ad0 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a  ITE_DEBUG.    /*
11ae0 20 44 45 42 55 47 20 61 6e 64 20 54 45 53 54 49   DEBUG and TESTI
11af0 4e 47 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  NG functions */.
11b00 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 70 61 72 73      { "json_pars
11b10 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 31 2c  e",           1,
11b20 20 30 2c 20 20 20 6a 73 6f 6e 50 61 72 73 65 46   0,   jsonParseF
11b30 75 6e 63 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  unc         },. 
11b40 20 20 20 7b 20 22 6a 73 6f 6e 5f 74 65 73 74 31     { "json_test1
11b50 22 2c 20 20 20 20 20 20 20 20 20 20 20 31 2c 20  ",           1, 
11b60 30 2c 20 20 20 6a 73 6f 6e 54 65 73 74 31 46 75  0,   jsonTest1Fu
11b70 6e 63 20 20 20 20 20 20 20 20 20 7d 2c 0a 23 65  nc         },.#e
11b80 6e 64 69 66 0a 20 20 7d 3b 0a 20 20 73 74 61 74  ndif.  };.  stat
11b90 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
11ba0 7b 0a 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  {.     const cha
11bb0 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 69  r *zName;.     i
11bc0 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 20 76 6f  nt nArg;.     vo
11bd0 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69  id (*xStep)(sqli
11be0 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
11bf0 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a  ,sqlite3_value**
11c00 29 3b 0a 20 20 20 20 20 76 6f 69 64 20 28 2a 78  );.     void (*x
11c10 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63  Final)(sqlite3_c
11c20 6f 6e 74 65 78 74 2a 29 3b 0a 20 20 20 20 20 76  ontext*);.     v
11c30 6f 69 64 20 28 2a 78 56 61 6c 75 65 29 28 73 71  oid (*xValue)(sq
11c40 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 3b  lite3_context*);
11c50 0a 20 20 7d 20 61 41 67 67 5b 5d 20 3d 20 7b 0a  .  } aAgg[] = {.
11c60 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 67 72 6f 75      { "json_grou
11c70 70 5f 61 72 72 61 79 22 2c 20 20 20 20 20 31 2c  p_array",     1,
11c80 0a 20 20 20 20 20 20 6a 73 6f 6e 41 72 72 61 79  .      jsonArray
11c90 53 74 65 70 2c 20 20 20 6a 73 6f 6e 41 72 72 61  Step,   jsonArra
11ca0 79 46 69 6e 61 6c 2c 20 20 6a 73 6f 6e 41 72 72  yFinal,  jsonArr
11cb0 61 79 56 61 6c 75 65 20 20 7d 2c 0a 20 20 20 20  ayValue  },.    
11cc0 7b 20 22 6a 73 6f 6e 5f 67 72 6f 75 70 5f 6f 62  { "json_group_ob
11cd0 6a 65 63 74 22 2c 20 20 20 20 32 2c 0a 20 20 20  ject",    2,.   
11ce0 20 20 20 6a 73 6f 6e 4f 62 6a 65 63 74 53 74 65     jsonObjectSte
11cf0 70 2c 20 20 6a 73 6f 6e 4f 62 6a 65 63 74 46 69  p,  jsonObjectFi
11d00 6e 61 6c 2c 20 6a 73 6f 6e 4f 62 6a 65 63 74 56  nal, jsonObjectV
11d10 61 6c 75 65 20 7d 2c 0a 20 20 7d 3b 0a 23 69 66  alue },.  };.#if
11d20 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11d30 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
11d40 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
11d50 75 63 74 20 7b 0a 20 20 20 20 20 63 6f 6e 73 74  uct {.     const
11d60 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
11d70 20 20 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c     sqlite3_modul
11d80 65 20 2a 70 4d 6f 64 75 6c 65 3b 0a 20 20 7d 20  e *pModule;.  } 
11d90 61 4d 6f 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b  aMod[] = {.    {
11da0 20 22 6a 73 6f 6e 5f 65 61 63 68 22 2c 20 20 20   "json_each",   
11db0 20 20 20 20 20 20 20 20 20 26 6a 73 6f 6e 45 61           &jsonEa
11dc0 63 68 4d 6f 64 75 6c 65 20 20 20 20 20 20 20 20  chModule        
11dd0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
11de0 22 6a 73 6f 6e 5f 74 72 65 65 22 2c 20 20 20 20  "json_tree",    
11df0 20 20 20 20 20 20 20 20 26 6a 73 6f 6e 54 72 65          &jsonTre
11e00 65 4d 6f 64 75 6c 65 20 20 20 20 20 20 20 20 20  eModule         
11e10 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 23 65        },.  };.#e
11e20 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ndif.  for(i=0; 
11e30 69 3c 73 69 7a 65 6f 66 28 61 46 75 6e 63 29 2f  i<sizeof(aFunc)/
11e40 73 69 7a 65 6f 66 28 61 46 75 6e 63 5b 30 5d 29  sizeof(aFunc[0])
11e50 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
11e60 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20  K; i++){.    rc 
11e70 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
11e80 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 61 46  _function(db, aF
11e90 75 6e 63 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 61 46  unc[i].zName, aF
11ea0 75 6e 63 5b 69 5d 2e 6e 41 72 67 2c 0a 20 20 20  unc[i].nArg,.   
11eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
11ed0 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49  LITE_UTF8 | SQLI
11ee0 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
11ef0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
11f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f10 20 20 20 20 28 76 6f 69 64 2a 29 26 61 46 75 6e      (void*)&aFun
11f20 63 5b 69 5d 2e 66 6c 61 67 2c 0a 20 20 20 20 20  c[i].flag,.     
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 61 46 75 6e              aFun
11f50 63 5b 69 5d 2e 78 46 75 6e 63 2c 20 30 2c 20 30  c[i].xFunc, 0, 0
11f60 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  );.  }.#ifndef S
11f70 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f  QLITE_OMIT_WINDO
11f80 57 46 55 4e 43 0a 20 20 66 6f 72 28 69 3d 30 3b  WFUNC.  for(i=0;
11f90 20 69 3c 73 69 7a 65 6f 66 28 61 41 67 67 29 2f   i<sizeof(aAgg)/
11fa0 73 69 7a 65 6f 66 28 61 41 67 67 5b 30 5d 29 20  sizeof(aAgg[0]) 
11fb0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
11fc0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d  ; i++){.    rc =
11fd0 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
11fe0 77 69 6e 64 6f 77 5f 66 75 6e 63 74 69 6f 6e 28  window_function(
11ff0 64 62 2c 20 61 41 67 67 5b 69 5d 2e 7a 4e 61 6d  db, aAgg[i].zNam
12000 65 2c 20 61 41 67 67 5b 69 5d 2e 6e 41 72 67 2c  e, aAgg[i].nArg,
12010 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12030 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20    SQLITE_UTF8 | 
12040 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
12050 53 54 49 43 2c 20 30 2c 0a 20 20 20 20 20 20 20  STIC, 0,.       
12060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12070 20 20 20 20 20 20 20 20 20 20 61 41 67 67 5b 69            aAgg[i
12080 5d 2e 78 53 74 65 70 2c 20 61 41 67 67 5b 69 5d  ].xStep, aAgg[i]
12090 2e 78 46 69 6e 61 6c 2c 0a 20 20 20 20 20 20 20  .xFinal,.       
120a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120b0 20 20 20 20 20 20 20 20 20 20 61 41 67 67 5b 69            aAgg[i
120c0 5d 2e 78 56 61 6c 75 65 2c 20 6a 73 6f 6e 47 72  ].xValue, jsonGr
120d0 6f 75 70 49 6e 76 65 72 73 65 2c 20 30 29 3b 0a  oupInverse, 0);.
120e0 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64    }.#endif.#ifnd
120f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
12100 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 66 6f  IRTUALTABLE.  fo
12110 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
12120 61 4d 6f 64 29 2f 73 69 7a 65 6f 66 28 61 4d 6f  aMod)/sizeof(aMo
12130 64 5b 30 5d 29 20 26 26 20 72 63 3d 3d 53 51 4c  d[0]) && rc==SQL
12140 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20  ITE_OK; i++){.  
12150 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
12160 72 65 61 74 65 5f 6d 6f 64 75 6c 65 28 64 62 2c  reate_module(db,
12170 20 61 4d 6f 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20   aMod[i].zName, 
12180 61 4d 6f 64 5b 69 5d 2e 70 4d 6f 64 75 6c 65 2c  aMod[i].pModule,
12190 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
121a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
121b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
121c0 43 4f 52 45 0a 23 69 66 64 65 66 20 5f 57 49 4e  CORE.#ifdef _WIN
121d0 33 32 0a 5f 5f 64 65 63 6c 73 70 65 63 28 64 6c  32.__declspec(dl
121e0 6c 65 78 70 6f 72 74 29 0a 23 65 6e 64 69 66 0a  lexport).#endif.
121f0 69 6e 74 20 73 71 6c 69 74 65 33 5f 6a 73 6f 6e  int sqlite3_json
12200 5f 69 6e 69 74 28 0a 20 20 73 71 6c 69 74 65 33  _init(.  sqlite3
12210 20 2a 64 62 2c 20 0a 20 20 63 68 61 72 20 2a 2a   *db, .  char **
12220 70 7a 45 72 72 4d 73 67 2c 20 0a 20 20 63 6f 6e  pzErrMsg, .  con
12230 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72  st sqlite3_api_r
12240 6f 75 74 69 6e 65 73 20 2a 70 41 70 69 0a 29 7b  outines *pApi.){
12250 0a 20 20 53 51 4c 49 54 45 5f 45 58 54 45 4e 53  .  SQLITE_EXTENS
12260 49 4f 4e 5f 49 4e 49 54 32 28 70 41 70 69 29 3b  ION_INIT2(pApi);
12270 0a 20 20 28 76 6f 69 64 29 70 7a 45 72 72 4d 73  .  (void)pzErrMs
12280 67 3b 20 20 2f 2a 20 55 6e 75 73 65 64 20 70 61  g;  /* Unused pa
12290 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 72 65 74  rameter */.  ret
122a0 75 72 6e 20 73 71 6c 69 74 65 33 4a 73 6f 6e 31  urn sqlite3Json1
122b0 49 6e 69 74 28 64 62 29 3b 0a 7d 0a 23 65 6e 64  Init(db);.}.#end
122c0 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  if.#endif /* !de
122d0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 52  fined(SQLITE_COR
122e0 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  E) || defined(SQ
122f0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4a 53 4f 4e  LITE_ENABLE_JSON
12300 31 29 20 2a 2f 0a                                1) */.