/ Hex Artifact Content
Login

Artifact 8af4672f43634257dbcfdb4515b4070325463d67c6968b4be1bd414de28d4d58:


0000: 2f 2a 0a 2a 2a 20 32 30 31 35 2d 30 38 2d 31 32  /*.** 2015-08-12
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ****.**.** This 
0180: 53 51 4c 69 74 65 20 65 78 74 65 6e 73 69 6f 6e  SQLite extension
0190: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 4a 53 4f 4e   implements JSON
01a0: 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68 65   functions.  The
01b0: 20 69 6e 74 65 72 66 61 63 65 20 69 73 0a 2a 2a   interface is.**
01c0: 20 6d 6f 64 65 6c 65 64 20 61 66 74 65 72 20 4d   modeled after M
01d0: 79 53 51 4c 20 4a 53 4f 4e 20 66 75 6e 63 74 69  ySQL JSON functi
01e0: 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 68  ons:.**.**     h
01f0: 74 74 70 73 3a 2f 2f 64 65 76 2e 6d 79 73 71 6c  ttps://dev.mysql
0200: 2e 63 6f 6d 2f 64 6f 63 2f 72 65 66 6d 61 6e 2f  .com/doc/refman/
0210: 35 2e 37 2f 65 6e 2f 6a 73 6f 6e 2e 68 74 6d 6c  5.7/en/json.html
0220: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 74  .**.** For the t
0230: 69 6d 65 20 62 65 69 6e 67 2c 20 61 6c 6c 20 4a  ime being, all J
0240: 53 4f 4e 20 69 73 20 73 74 6f 72 65 64 20 61 73  SON is stored as
0250: 20 70 75 72 65 20 74 65 78 74 2e 20 20 28 57 65   pure text.  (We
0260: 20 6d 69 67 68 74 20 61 64 64 0a 2a 2a 20 61 20   might add.** a 
0270: 4a 53 4f 4e 42 20 74 79 70 65 20 69 6e 20 74 68  JSONB type in th
0280: 65 20 66 75 74 75 72 65 20 77 68 69 63 68 20 73  e future which s
0290: 74 6f 72 65 73 20 61 20 62 69 6e 61 72 79 20 65  tores a binary e
02a0: 6e 63 6f 64 69 6e 67 20 6f 66 20 4a 53 4f 4e 20  ncoding of JSON 
02b0: 69 6e 0a 2a 2a 20 61 20 42 4c 4f 42 2c 20 62 75  in.** a BLOB, bu
02c0: 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75  t there is no su
02d0: 70 70 6f 72 74 20 66 6f 72 20 4a 53 4f 4e 42 20  pport for JSONB 
02e0: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  in the current i
02f0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a  mplementation..*
0300: 2a 20 54 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74  * This implement
0310: 61 74 69 6f 6e 20 70 61 72 73 65 73 20 4a 53 4f  ation parses JSO
0320: 4e 20 74 65 78 74 20 61 74 20 32 35 30 20 4d 42  N text at 250 MB
0330: 2f 73 2c 20 73 6f 20 69 74 20 69 73 20 68 61 72  /s, so it is har
0340: 64 20 74 6f 20 73 65 65 0a 2a 2a 20 68 6f 77 20  d to see.** how 
0350: 4a 53 4f 4e 42 20 6d 69 67 68 74 20 69 6d 70 72  JSONB might impr
0360: 6f 76 65 20 6f 6e 20 74 68 61 74 2e 29 0a 2a 2f  ove on that.).*/
0370: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
0380: 4c 49 54 45 5f 43 4f 52 45 29 20 7c 7c 20 64 65  LITE_CORE) || de
0390: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
03a0: 42 4c 45 5f 4a 53 4f 4e 31 29 0a 23 69 66 20 21  BLE_JSON1).#if !
03b0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 49 4e  defined(SQLITEIN
03c0: 54 5f 48 29 0a 23 69 6e 63 6c 75 64 65 20 22 73  T_H).#include "s
03d0: 71 6c 69 74 65 33 65 78 74 2e 68 22 0a 23 65 6e  qlite3ext.h".#en
03e0: 64 69 66 0a 53 51 4c 49 54 45 5f 45 58 54 45 4e  dif.SQLITE_EXTEN
03f0: 53 49 4f 4e 5f 49 4e 49 54 31 0a 23 69 6e 63 6c  SION_INIT1.#incl
0400: 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23  ude <assert.h>.#
0410: 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e  include <string.
0420: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  h>.#include <std
0430: 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  lib.h>.#include 
0440: 3c 73 74 64 61 72 67 2e 68 3e 0a 0a 2f 2a 20 4d  <stdarg.h>../* M
0450: 61 72 6b 20 61 20 66 75 6e 63 74 69 6f 6e 20 70  ark a function p
0460: 61 72 61 6d 65 74 65 72 20 61 73 20 75 6e 75 73  arameter as unus
0470: 65 64 2c 20 74 6f 20 73 75 70 70 72 65 73 73 20  ed, to suppress 
0480: 6e 75 69 73 61 6e 63 65 20 63 6f 6d 70 69 6c 65  nuisance compile
0490: 72 0a 2a 2a 20 77 61 72 6e 69 6e 67 73 2e 20 2a  r.** warnings. *
04a0: 2f 0a 23 69 66 6e 64 65 66 20 55 4e 55 53 45 44  /.#ifndef UNUSED
04b0: 5f 50 41 52 41 4d 0a 23 20 64 65 66 69 6e 65 20  _PARAM.# define 
04c0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 58 29 20  UNUSED_PARAM(X) 
04d0: 20 28 76 6f 69 64 29 28 58 29 0a 23 65 6e 64 69   (void)(X).#endi
04e0: 66 0a 0a 23 69 66 6e 64 65 66 20 4c 41 52 47 45  f..#ifndef LARGE
04f0: 53 54 5f 49 4e 54 36 34 0a 23 20 64 65 66 69 6e  ST_INT64.# defin
0500: 65 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 20  e LARGEST_INT64 
0510: 20 28 30 78 66 66 66 66 66 66 66 66 7c 28 28 28   (0xffffffff|(((
0520: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 30 78  sqlite3_int64)0x
0530: 37 66 66 66 66 66 66 66 29 3c 3c 33 32 29 29 0a  7fffffff)<<32)).
0540: 23 20 64 65 66 69 6e 65 20 53 4d 41 4c 4c 45 53  # define SMALLES
0550: 54 5f 49 4e 54 36 34 20 28 28 28 73 71 6c 69 74  T_INT64 (((sqlit
0560: 65 33 5f 69 6e 74 36 34 29 2d 31 29 20 2d 20 4c  e3_int64)-1) - L
0570: 41 52 47 45 53 54 5f 49 4e 54 36 34 29 0a 23 65  ARGEST_INT64).#e
0580: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 73  ndif../*.** Vers
0590: 69 6f 6e 73 20 6f 66 20 69 73 73 70 61 63 65 28  ions of isspace(
05a0: 29 2c 20 69 73 61 6c 6e 75 6d 28 29 20 61 6e 64  ), isalnum() and
05b0: 20 69 73 64 69 67 69 74 28 29 20 74 6f 20 77 68   isdigit() to wh
05c0: 69 63 68 20 69 74 20 69 73 20 73 61 66 65 0a 2a  ich it is safe.*
05d0: 2a 20 74 6f 20 70 61 73 73 20 73 69 67 6e 65 64  * to pass signed
05e0: 20 63 68 61 72 20 76 61 6c 75 65 73 2e 0a 2a 2f   char values..*/
05f0: 0a 23 69 66 64 65 66 20 73 71 6c 69 74 65 33 49  .#ifdef sqlite3I
0600: 73 64 69 67 69 74 0a 20 20 20 2f 2a 20 55 73 65  sdigit.   /* Use
0610: 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65   the SQLite core
0620: 20 76 65 72 73 69 6f 6e 73 20 69 66 20 74 68 69   versions if thi
0630: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72  s routine is par
0640: 74 20 6f 66 20 74 68 65 0a 20 20 20 2a 2a 20 53  t of the.   ** S
0650: 51 4c 69 74 65 20 61 6d 61 6c 67 61 6d 61 74 69  QLite amalgamati
0660: 6f 6e 20 2a 2f 0a 23 20 20 64 65 66 69 6e 65 20  on */.#  define 
0670: 73 61 66 65 5f 69 73 64 69 67 69 74 28 78 29 20  safe_isdigit(x) 
0680: 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28   sqlite3Isdigit(
0690: 78 29 0a 23 20 20 64 65 66 69 6e 65 20 73 61 66  x).#  define saf
06a0: 65 5f 69 73 61 6c 6e 75 6d 28 78 29 20 20 73 71  e_isalnum(x)  sq
06b0: 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 78 29 0a  lite3Isalnum(x).
06c0: 23 20 20 64 65 66 69 6e 65 20 73 61 66 65 5f 69  #  define safe_i
06d0: 73 78 64 69 67 69 74 28 78 29 20 73 71 6c 69 74  sxdigit(x) sqlit
06e0: 65 33 49 73 78 64 69 67 69 74 28 78 29 0a 23 65  e3Isxdigit(x).#e
06f0: 6c 73 65 0a 20 20 20 2f 2a 20 55 73 65 20 74 68  lse.   /* Use th
0700: 65 20 73 74 61 6e 64 61 72 64 20 6c 69 62 72 61  e standard libra
0710: 72 79 20 66 6f 72 20 73 65 70 61 72 61 74 65 20  ry for separate 
0720: 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 2a 2f 0a 23  compilation */.#
0730: 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68  include <ctype.h
0740: 3e 20 20 2f 2a 20 61 6d 61 6c 67 61 6d 61 74 6f  >  /* amalgamato
0750: 72 3a 20 6b 65 65 70 20 2a 2f 0a 23 20 20 64 65  r: keep */.#  de
0760: 66 69 6e 65 20 73 61 66 65 5f 69 73 64 69 67 69  fine safe_isdigi
0770: 74 28 78 29 20 20 69 73 64 69 67 69 74 28 28 75  t(x)  isdigit((u
0780: 6e 73 69 67 6e 65 64 20 63 68 61 72 29 28 78 29  nsigned char)(x)
0790: 29 0a 23 20 20 64 65 66 69 6e 65 20 73 61 66 65  ).#  define safe
07a0: 5f 69 73 61 6c 6e 75 6d 28 78 29 20 20 69 73 61  _isalnum(x)  isa
07b0: 6c 6e 75 6d 28 28 75 6e 73 69 67 6e 65 64 20 63  lnum((unsigned c
07c0: 68 61 72 29 28 78 29 29 0a 23 20 20 64 65 66 69  har)(x)).#  defi
07d0: 6e 65 20 73 61 66 65 5f 69 73 78 64 69 67 69 74  ne safe_isxdigit
07e0: 28 78 29 20 69 73 78 64 69 67 69 74 28 28 75 6e  (x) isxdigit((un
07f0: 73 69 67 6e 65 64 20 63 68 61 72 29 28 78 29 29  signed char)(x))
0800: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
0810: 72 6f 77 69 6e 67 20 6f 75 72 20 6f 77 6e 20 69  rowing our own i
0820: 73 73 70 61 63 65 28 29 20 72 6f 75 74 69 6e 65  sspace() routine
0830: 20 74 68 69 73 20 77 61 79 20 69 73 20 74 77 69   this way is twi
0840: 63 65 20 61 73 20 66 61 73 74 20 61 73 0a 2a 2a  ce as fast as.**
0850: 20 74 68 65 20 6c 69 62 72 61 72 79 20 69 73 73   the library iss
0860: 70 61 63 65 28 29 20 66 75 6e 63 74 69 6f 6e 2c  pace() function,
0870: 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 20   resulting in a 
0880: 37 25 20 6f 76 65 72 61 6c 6c 20 70 65 72 66 6f  7% overall perfo
0890: 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 63 72 65 61  rmance.** increa
08a0: 73 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65  se for the parse
08b0: 72 2e 20 20 28 55 62 75 6e 74 75 31 34 2e 31 30  r.  (Ubuntu14.10
08c0: 20 67 63 63 20 34 2e 38 2e 34 20 78 36 34 20 77   gcc 4.8.4 x64 w
08d0: 69 74 68 20 2d 4f 73 29 2e 0a 2a 2f 0a 73 74 61  ith -Os)..*/.sta
08e0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6a  tic const char j
08f0: 73 6f 6e 49 73 53 70 61 63 65 5b 5d 20 3d 20 7b  sonIsSpace[] = {
0900: 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  .  0, 0, 0, 0, 0
0910: 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 20 20 30  , 0, 0, 0,     0
0920: 2c 20 31 2c 20 31 2c 20 30 2c 20 30 2c 20 31 2c  , 1, 1, 0, 0, 1,
0930: 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30   0, 0,.  0, 0, 0
0940: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0950: 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c       0, 0, 0, 0,
0960: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 31   0, 0, 0, 0,.  1
0970: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0980: 20 30 2c 20 30 2c 20 20 20 20 20 30 2c 20 30 2c   0, 0,     0, 0,
0990: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
09a0: 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  0,.  0, 0, 0, 0,
09b0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 20   0, 0, 0, 0,    
09c0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
09d0: 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c  0, 0, 0,.  0, 0,
09e0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
09f0: 30 2c 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20  0,     0, 0, 0, 
0a00: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  0, 0, 0, 0, 0,. 
0a10: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0a20: 30 2c 20 30 2c 20 30 2c 20 20 20 20 20 30 2c 20  0, 0, 0,     0, 
0a30: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0a40: 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20  , 0,.  0, 0, 0, 
0a50: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20  0, 0, 0, 0, 0,  
0a60: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
0a70: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20  , 0, 0, 0,.  0, 
0a80: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0a90: 2c 20 30 2c 20 20 20 20 20 30 2c 20 30 2c 20 30  , 0,     0, 0, 0
0aa0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0ab0: 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  .  0, 0, 0, 0, 0
0ac0: 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 20 20 30  , 0, 0, 0,     0
0ad0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0ae0: 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30   0, 0,.  0, 0, 0
0af0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0b00: 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c       0, 0, 0, 0,
0b10: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30   0, 0, 0, 0,.  0
0b20: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0b30: 20 30 2c 20 30 2c 20 20 20 20 20 30 2c 20 30 2c   0, 0,     0, 0,
0b40: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0b50: 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  0,.  0, 0, 0, 0,
0b60: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 20   0, 0, 0, 0,    
0b70: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0b80: 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c  0, 0, 0,.  0, 0,
0b90: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0ba0: 30 2c 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20  0,     0, 0, 0, 
0bb0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  0, 0, 0, 0, 0,. 
0bc0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0bd0: 30 2c 20 30 2c 20 30 2c 20 20 20 20 20 30 2c 20  0, 0, 0,     0, 
0be0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0bf0: 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20  , 0,.  0, 0, 0, 
0c00: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20  0, 0, 0, 0, 0,  
0c10: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
0c20: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20  , 0, 0, 0,.  0, 
0c30: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0c40: 2c 20 30 2c 20 20 20 20 20 30 2c 20 30 2c 20 30  , 0,     0, 0, 0
0c50: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0c60: 0a 7d 3b 0a 23 64 65 66 69 6e 65 20 73 61 66 65  .};.#define safe
0c70: 5f 69 73 73 70 61 63 65 28 78 29 20 28 6a 73 6f  _isspace(x) (jso
0c80: 6e 49 73 53 70 61 63 65 5b 28 75 6e 73 69 67 6e  nIsSpace[(unsign
0c90: 65 64 20 63 68 61 72 29 78 5d 29 0a 0a 23 69 66  ed char)x])..#if
0ca0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d 41 4c  ndef SQLITE_AMAL
0cb0: 47 41 4d 41 54 49 4f 4e 0a 20 20 2f 2a 20 55 6e  GAMATION.  /* Un
0cc0: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 74  signed integer t
0cd0: 79 70 65 73 2e 20 20 54 68 65 73 65 20 61 72 65  ypes.  These are
0ce0: 20 61 6c 72 65 61 64 79 20 64 65 66 69 6e 65 64   already defined
0cf0: 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 49 6e   in the sqliteIn
0d00: 74 2e 68 2c 0a 20 20 2a 2a 20 62 75 74 20 74 68  t.h,.  ** but th
0d10: 65 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6e 65  e definitions ne
0d20: 65 64 20 74 6f 20 62 65 20 72 65 70 65 61 74 65  ed to be repeate
0d30: 64 20 66 6f 72 20 73 65 70 61 72 61 74 65 20 63  d for separate c
0d40: 6f 6d 70 69 6c 61 74 69 6f 6e 2e 20 2a 2f 0a 20  ompilation. */. 
0d50: 20 74 79 70 65 64 65 66 20 73 71 6c 69 74 65 33   typedef sqlite3
0d60: 5f 75 69 6e 74 36 34 20 75 36 34 3b 0a 20 20 74  _uint64 u64;.  t
0d70: 79 70 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20  ypedef unsigned 
0d80: 69 6e 74 20 75 33 32 3b 0a 20 20 74 79 70 65 64  int u32;.  typed
0d90: 65 66 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72  ef unsigned shor
0da0: 74 20 69 6e 74 20 75 31 36 3b 0a 20 20 74 79 70  t int u16;.  typ
0db0: 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20 63 68  edef unsigned ch
0dc0: 61 72 20 75 38 3b 0a 23 65 6e 64 69 66 0a 0a 2f  ar u8;.#endif../
0dd0: 2a 20 4f 62 6a 65 63 74 73 20 2a 2f 0a 74 79 70  * Objects */.typ
0de0: 65 64 65 66 20 73 74 72 75 63 74 20 4a 73 6f 6e  edef struct Json
0df0: 53 74 72 69 6e 67 20 4a 73 6f 6e 53 74 72 69 6e  String JsonStrin
0e00: 67 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  g;.typedef struc
0e10: 74 20 4a 73 6f 6e 4e 6f 64 65 20 4a 73 6f 6e 4e  t JsonNode JsonN
0e20: 6f 64 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ode;.typedef str
0e30: 75 63 74 20 4a 73 6f 6e 50 61 72 73 65 20 4a 73  uct JsonParse Js
0e40: 6f 6e 50 61 72 73 65 3b 0a 0a 2f 2a 20 41 6e 20  onParse;../* An 
0e50: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
0e60: 20 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e   object represen
0e70: 74 73 20 61 20 4a 53 4f 4e 20 73 74 72 69 6e 67  ts a JSON string
0e80: 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  .** under constr
0e90: 75 63 74 69 6f 6e 2e 20 20 52 65 61 6c 6c 79 2c  uction.  Really,
0ea0: 20 74 68 69 73 20 69 73 20 61 20 67 65 6e 65 72   this is a gener
0eb0: 69 63 20 73 74 72 69 6e 67 20 61 63 63 75 6d 75  ic string accumu
0ec0: 6c 61 74 6f 72 0a 2a 2a 20 74 68 61 74 20 63 61  lator.** that ca
0ed0: 6e 20 62 65 20 61 6e 64 20 69 73 20 75 73 65 64  n be and is used
0ee0: 20 74 6f 20 63 72 65 61 74 65 20 73 74 72 69 6e   to create strin
0ef0: 67 73 20 6f 74 68 65 72 20 74 68 61 6e 20 4a 53  gs other than JS
0f00: 4f 4e 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 4a 73  ON..*/.struct Js
0f10: 6f 6e 53 74 72 69 6e 67 20 7b 0a 20 20 73 71 6c  onString {.  sql
0f20: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
0f30: 74 78 3b 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f  tx;   /* Functio
0f40: 6e 20 63 6f 6e 74 65 78 74 20 2d 20 70 75 74 20  n context - put 
0f50: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 68  error messages h
0f60: 65 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ere */.  char *z
0f70: 42 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Buf;            
0f80: 20 20 2f 2a 20 41 70 70 65 6e 64 20 4a 53 4f 4e    /* Append JSON
0f90: 20 63 6f 6e 74 65 6e 74 20 68 65 72 65 20 2a 2f   content here */
0fa0: 0a 20 20 75 36 34 20 6e 41 6c 6c 6f 63 3b 20 20  .  u64 nAlloc;  
0fb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
0fc0: 79 74 65 73 20 6f 66 20 73 74 6f 72 61 67 65 20  ytes of storage 
0fd0: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 7a 42 75  available in zBu
0fe0: 66 5b 5d 20 2a 2f 0a 20 20 75 36 34 20 6e 55 73  f[] */.  u64 nUs
0ff0: 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
1000: 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 7a 42    /* Bytes of zB
1010: 75 66 5b 5d 20 63 75 72 72 65 6e 74 6c 79 20 75  uf[] currently u
1020: 73 65 64 20 2a 2f 0a 20 20 75 38 20 62 53 74 61  sed */.  u8 bSta
1030: 74 69 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  tic;            
1040: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 7a 42 75    /* True if zBu
1050: 66 20 69 73 20 73 74 61 74 69 63 20 73 70 61 63  f is static spac
1060: 65 20 2a 2f 0a 20 20 75 38 20 62 45 72 72 3b 20  e */.  u8 bErr; 
1070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1080: 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 65 72  /* True if an er
1090: 72 6f 72 20 68 61 73 20 62 65 65 6e 20 65 6e 63  ror has been enc
10a0: 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20 63 68  ountered */.  ch
10b0: 61 72 20 7a 53 70 61 63 65 5b 31 30 30 5d 3b 20  ar zSpace[100]; 
10c0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
10d0: 6c 20 73 74 61 74 69 63 20 73 70 61 63 65 20 2a  l static space *
10e0: 2f 0a 7d 3b 0a 0a 2f 2a 20 4a 53 4f 4e 20 74 79  /.};../* JSON ty
10f0: 70 65 20 76 61 6c 75 65 73 0a 2a 2f 0a 23 64 65  pe values.*/.#de
1100: 66 69 6e 65 20 4a 53 4f 4e 5f 4e 55 4c 4c 20 20  fine JSON_NULL  
1110: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 4a 53 4f     0.#define JSO
1120: 4e 5f 54 52 55 45 20 20 20 20 20 31 0a 23 64 65  N_TRUE     1.#de
1130: 66 69 6e 65 20 4a 53 4f 4e 5f 46 41 4c 53 45 20  fine JSON_FALSE 
1140: 20 20 20 32 0a 23 64 65 66 69 6e 65 20 4a 53 4f     2.#define JSO
1150: 4e 5f 49 4e 54 20 20 20 20 20 20 33 0a 23 64 65  N_INT      3.#de
1160: 66 69 6e 65 20 4a 53 4f 4e 5f 52 45 41 4c 20 20  fine JSON_REAL  
1170: 20 20 20 34 0a 23 64 65 66 69 6e 65 20 4a 53 4f     4.#define JSO
1180: 4e 5f 53 54 52 49 4e 47 20 20 20 35 0a 23 64 65  N_STRING   5.#de
1190: 66 69 6e 65 20 4a 53 4f 4e 5f 41 52 52 41 59 20  fine JSON_ARRAY 
11a0: 20 20 20 36 0a 23 64 65 66 69 6e 65 20 4a 53 4f     6.#define JSO
11b0: 4e 5f 4f 42 4a 45 43 54 20 20 20 37 0a 0a 2f 2a  N_OBJECT   7../*
11c0: 20 54 68 65 20 22 73 75 62 74 79 70 65 22 20 73   The "subtype" s
11d0: 65 74 20 66 6f 72 20 4a 53 4f 4e 20 76 61 6c 75  et for JSON valu
11e0: 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 53  es */.#define JS
11f0: 4f 4e 5f 53 55 42 54 59 50 45 20 20 37 34 20 20  ON_SUBTYPE  74  
1200: 20 20 2f 2a 20 41 73 63 69 69 20 66 6f 72 20 22    /* Ascii for "
1210: 4a 22 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d  J" */../*.** Nam
1220: 65 73 20 6f 66 20 74 68 65 20 76 61 72 69 6f 75  es of the variou
1230: 73 20 4a 53 4f 4e 20 74 79 70 65 73 3a 0a 2a 2f  s JSON types:.*/
1240: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
1250: 61 72 20 2a 20 63 6f 6e 73 74 20 6a 73 6f 6e 54  ar * const jsonT
1260: 79 70 65 5b 5d 20 3d 20 7b 0a 20 20 22 6e 75 6c  ype[] = {.  "nul
1270: 6c 22 2c 20 22 74 72 75 65 22 2c 20 22 66 61 6c  l", "true", "fal
1280: 73 65 22 2c 20 22 69 6e 74 65 67 65 72 22 2c 20  se", "integer", 
1290: 22 72 65 61 6c 22 2c 20 22 74 65 78 74 22 2c 20  "real", "text", 
12a0: 22 61 72 72 61 79 22 2c 20 22 6f 62 6a 65 63 74  "array", "object
12b0: 22 0a 7d 3b 0a 0a 2f 2a 20 42 69 74 20 76 61 6c  ".};../* Bit val
12c0: 75 65 73 20 66 6f 72 20 74 68 65 20 4a 73 6f 6e  ues for the Json
12d0: 4e 6f 64 65 2e 6a 6e 46 6c 61 67 20 66 69 65 6c  Node.jnFlag fiel
12e0: 64 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4e 4f  d.*/.#define JNO
12f0: 44 45 5f 52 41 57 20 20 20 20 20 30 78 30 31 20  DE_RAW     0x01 
1300: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
1310: 6e 74 20 69 73 20 72 61 77 2c 20 6e 6f 74 20 4a  nt is raw, not J
1320: 53 4f 4e 20 65 6e 63 6f 64 65 64 20 2a 2f 0a 23  SON encoded */.#
1330: 64 65 66 69 6e 65 20 4a 4e 4f 44 45 5f 45 53 43  define JNODE_ESC
1340: 41 50 45 20 20 30 78 30 32 20 20 20 20 20 20 20  APE  0x02       
1350: 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 69 73 20    /* Content is 
1360: 74 65 78 74 20 77 69 74 68 20 5c 20 65 73 63 61  text with \ esca
1370: 70 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4a  pes */.#define J
1380: 4e 4f 44 45 5f 52 45 4d 4f 56 45 20 20 30 78 30  NODE_REMOVE  0x0
1390: 34 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20  4         /* Do 
13a0: 6e 6f 74 20 6f 75 74 70 75 74 20 2a 2f 0a 23 64  not output */.#d
13b0: 65 66 69 6e 65 20 4a 4e 4f 44 45 5f 52 45 50 4c  efine JNODE_REPL
13c0: 41 43 45 20 30 78 30 38 20 20 20 20 20 20 20 20  ACE 0x08        
13d0: 20 2f 2a 20 52 65 70 6c 61 63 65 20 77 69 74 68   /* Replace with
13e0: 20 4a 73 6f 6e 4e 6f 64 65 2e 75 2e 69 52 65 70   JsonNode.u.iRep
13f0: 6c 61 63 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  lace */.#define 
1400: 4a 4e 4f 44 45 5f 50 41 54 43 48 20 20 20 30 78  JNODE_PATCH   0x
1410: 31 30 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  10         /* Pa
1420: 74 63 68 20 77 69 74 68 20 4a 73 6f 6e 4e 6f 64  tch with JsonNod
1430: 65 2e 75 2e 70 50 61 74 63 68 20 2a 2f 0a 23 64  e.u.pPatch */.#d
1440: 65 66 69 6e 65 20 4a 4e 4f 44 45 5f 41 50 50 45  efine JNODE_APPE
1450: 4e 44 20 20 30 78 32 30 20 20 20 20 20 20 20 20  ND  0x20        
1460: 20 2f 2a 20 4d 6f 72 65 20 41 52 52 41 59 2f 4f   /* More ARRAY/O
1470: 42 4a 45 43 54 20 65 6e 74 72 69 65 73 20 61 74  BJECT entries at
1480: 20 75 2e 69 41 70 70 65 6e 64 20 2a 2f 0a 23 64   u.iAppend */.#d
1490: 65 66 69 6e 65 20 4a 4e 4f 44 45 5f 4c 41 42 45  efine JNODE_LABE
14a0: 4c 20 20 20 30 78 34 30 20 20 20 20 20 20 20 20  L   0x40        
14b0: 20 2f 2a 20 49 73 20 61 20 6c 61 62 65 6c 20 6f   /* Is a label o
14c0: 66 20 61 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a  f an object */..
14d0: 0a 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6e 6f 64  ./* A single nod
14e0: 65 20 6f 66 20 70 61 72 73 65 64 20 4a 53 4f 4e  e of parsed JSON
14f0: 0a 2a 2f 0a 73 74 72 75 63 74 20 4a 73 6f 6e 4e  .*/.struct JsonN
1500: 6f 64 65 20 7b 0a 20 20 75 38 20 65 54 79 70 65  ode {.  u8 eType
1510: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1520: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 4a 53 4f  * One of the JSO
1530: 4e 5f 20 74 79 70 65 20 76 61 6c 75 65 73 20 2a  N_ type values *
1540: 2f 0a 20 20 75 38 20 6a 6e 46 6c 61 67 73 3b 20  /.  u8 jnFlags; 
1550: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 4e             /* JN
1560: 4f 44 45 20 66 6c 61 67 73 20 2a 2f 0a 20 20 75  ODE flags */.  u
1570: 33 32 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  32 n;           
1580: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
1590: 66 20 63 6f 6e 74 65 6e 74 2c 20 6f 72 20 6e 75  f content, or nu
15a0: 6d 62 65 72 20 6f 66 20 73 75 62 2d 6e 6f 64 65  mber of sub-node
15b0: 73 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20  s */.  union {. 
15c0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
15d0: 4a 43 6f 6e 74 65 6e 74 3b 20 2f 2a 20 43 6f 6e  JContent; /* Con
15e0: 74 65 6e 74 20 66 6f 72 20 49 4e 54 2c 20 52 45  tent for INT, RE
15f0: 41 4c 2c 20 61 6e 64 20 53 54 52 49 4e 47 20 2a  AL, and STRING *
1600: 2f 0a 20 20 20 20 75 33 32 20 69 41 70 70 65 6e  /.    u32 iAppen
1610: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
1620: 4d 6f 72 65 20 74 65 72 6d 73 20 66 6f 72 20 41  More terms for A
1630: 52 52 41 59 20 61 6e 64 20 4f 42 4a 45 43 54 20  RRAY and OBJECT 
1640: 2a 2f 0a 20 20 20 20 75 33 32 20 69 4b 65 79 3b  */.    u32 iKey;
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1660: 20 4b 65 79 20 66 6f 72 20 41 52 52 41 59 20 6f   Key for ARRAY o
1670: 62 6a 65 63 74 73 20 69 6e 20 6a 73 6f 6e 5f 74  bjects in json_t
1680: 72 65 65 28 29 20 2a 2f 0a 20 20 20 20 75 33 32  ree() */.    u32
1690: 20 69 52 65 70 6c 61 63 65 3b 20 20 20 20 20 20   iReplace;      
16a0: 20 20 20 20 2f 2a 20 52 65 70 6c 61 63 65 6d 65      /* Replaceme
16b0: 6e 74 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 4a  nt content for J
16c0: 4e 4f 44 45 5f 52 45 50 4c 41 43 45 20 2a 2f 0a  NODE_REPLACE */.
16d0: 20 20 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 50      JsonNode *pP
16e0: 61 74 63 68 3b 20 20 20 20 20 20 2f 2a 20 4e 6f  atch;      /* No
16f0: 64 65 20 63 68 61 69 6e 20 6f 66 20 70 61 74 63  de chain of patc
1700: 68 20 66 6f 72 20 4a 4e 4f 44 45 5f 50 41 54 43  h for JNODE_PATC
1710: 48 20 2a 2f 0a 20 20 7d 20 75 3b 0a 7d 3b 0a 0a  H */.  } u;.};..
1720: 2f 2a 20 41 20 63 6f 6d 70 6c 65 74 65 6c 79 20  /* A completely 
1730: 70 61 72 73 65 64 20 4a 53 4f 4e 20 73 74 72 69  parsed JSON stri
1740: 6e 67 0a 2a 2f 0a 73 74 72 75 63 74 20 4a 73 6f  ng.*/.struct Jso
1750: 6e 50 61 72 73 65 20 7b 0a 20 20 75 33 32 20 6e  nParse {.  u32 n
1760: 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Node;         /*
1770: 20 4e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73   Number of slots
1780: 20 6f 66 20 61 4e 6f 64 65 5b 5d 20 75 73 65 64   of aNode[] used
1790: 20 2a 2f 0a 20 20 75 33 32 20 6e 41 6c 6c 6f 63   */.  u32 nAlloc
17a0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ;        /* Numb
17b0: 65 72 20 6f 66 20 73 6c 6f 74 73 20 6f 66 20 61  er of slots of a
17c0: 4e 6f 64 65 5b 5d 20 61 6c 6c 6f 63 61 74 65 64  Node[] allocated
17d0: 20 2a 2f 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a   */.  JsonNode *
17e0: 61 4e 6f 64 65 3b 20 20 20 2f 2a 20 41 72 72 61  aNode;   /* Arra
17f0: 79 20 6f 66 20 6e 6f 64 65 73 20 63 6f 6e 74 61  y of nodes conta
1800: 69 6e 69 6e 67 20 74 68 65 20 70 61 72 73 65 20  ining the parse 
1810: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1820: 2a 7a 4a 73 6f 6e 3b 20 2f 2a 20 4f 72 69 67 69  *zJson; /* Origi
1830: 6e 61 6c 20 4a 53 4f 4e 20 73 74 72 69 6e 67 20  nal JSON string 
1840: 2a 2f 0a 20 20 75 33 32 20 2a 61 55 70 3b 20 20  */.  u32 *aUp;  
1850: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1860: 20 6f 66 20 70 61 72 65 6e 74 20 6f 66 20 65 61   of parent of ea
1870: 63 68 20 6e 6f 64 65 20 2a 2f 0a 20 20 75 38 20  ch node */.  u8 
1880: 6f 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  oom;            
1890: 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20 69  /* Set to true i
18a0: 66 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20  f out of memory 
18b0: 2a 2f 0a 20 20 75 38 20 6e 45 72 72 3b 20 20 20  */.  u8 nErr;   
18c0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
18d0: 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e  r of errors seen
18e0: 20 2a 2f 0a 20 20 75 31 36 20 69 44 65 70 74 68   */.  u16 iDepth
18f0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 73 74  ;        /* Nest
1900: 69 6e 67 20 64 65 70 74 68 20 2a 2f 0a 20 20 69  ing depth */.  i
1910: 6e 74 20 6e 4a 73 6f 6e 3b 20 20 20 20 20 20 20  nt nJson;       
1920: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74    /* Length of t
1930: 68 65 20 7a 4a 73 6f 6e 20 73 74 72 69 6e 67 20  he zJson string 
1940: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33  in bytes */.  u3
1950: 32 20 69 48 6f 6c 64 3b 20 20 20 20 20 20 20 20  2 iHold;        
1960: 20 2f 2a 20 52 65 70 6c 61 63 65 20 63 61 63 68   /* Replace cach
1970: 65 20 6c 69 6e 65 20 77 69 74 68 20 74 68 65 20  e line with the 
1980: 6c 6f 77 65 73 74 20 69 48 6f 6c 64 20 76 61 6c  lowest iHold val
1990: 75 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ue */.};../*.** 
19a0: 4d 61 78 69 6d 75 6d 20 6e 65 73 74 69 6e 67 20  Maximum nesting 
19b0: 64 65 70 74 68 20 6f 66 20 4a 53 4f 4e 20 66 6f  depth of JSON fo
19c0: 72 20 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74  r this implement
19d0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ation..**.** Thi
19e0: 73 20 6c 69 6d 69 74 20 69 73 20 6e 65 65 64 65  s limit is neede
19f0: 64 20 74 6f 20 61 76 6f 69 64 20 61 20 73 74 61  d to avoid a sta
1a00: 63 6b 20 6f 76 65 72 66 6c 6f 77 20 69 6e 20 74  ck overflow in t
1a10: 68 65 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20  he recursive.** 
1a20: 64 65 73 63 65 6e 74 20 70 61 72 73 65 72 2e 20  descent parser. 
1a30: 20 41 20 64 65 70 74 68 20 6f 66 20 32 30 30 30   A depth of 2000
1a40: 20 69 73 20 66 61 72 20 64 65 65 70 65 72 20 74   is far deeper t
1a50: 68 61 6e 20 61 6e 79 20 73 61 6e 65 20 4a 53 4f  han any sane JSO
1a60: 4e 0a 2a 2a 20 73 68 6f 75 6c 64 20 67 6f 2e 0a  N.** should go..
1a70: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 53 4f 4e 5f  */.#define JSON_
1a80: 4d 41 58 5f 44 45 50 54 48 20 20 32 30 30 30 0a  MAX_DEPTH  2000.
1a90: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
1aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ad0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
1ae0: 55 74 69 6c 69 74 79 20 72 6f 75 74 69 6e 65 73  Utility routines
1af0: 20 66 6f 72 20 64 65 61 6c 69 6e 67 20 77 69 74   for dealing wit
1b00: 68 20 4a 73 6f 6e 53 74 72 69 6e 67 20 6f 62 6a  h JsonString obj
1b10: 65 63 74 73 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ects.***********
1b20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
1b60: 0a 0a 2f 2a 20 53 65 74 20 74 68 65 20 4a 73 6f  ../* Set the Jso
1b70: 6e 53 74 72 69 6e 67 20 6f 62 6a 65 63 74 20 74  nString object t
1b80: 6f 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  o an empty strin
1b90: 67 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  g.*/.static void
1ba0: 20 6a 73 6f 6e 5a 65 72 6f 28 4a 73 6f 6e 53 74   jsonZero(JsonSt
1bb0: 72 69 6e 67 20 2a 70 29 7b 0a 20 20 70 2d 3e 7a  ring *p){.  p->z
1bc0: 42 75 66 20 3d 20 70 2d 3e 7a 53 70 61 63 65 3b  Buf = p->zSpace;
1bd0: 0a 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 73  .  p->nAlloc = s
1be0: 69 7a 65 6f 66 28 70 2d 3e 7a 53 70 61 63 65 29  izeof(p->zSpace)
1bf0: 3b 0a 20 20 70 2d 3e 6e 55 73 65 64 20 3d 20 30  ;.  p->nUsed = 0
1c00: 3b 0a 20 20 70 2d 3e 62 53 74 61 74 69 63 20 3d  ;.  p->bStatic =
1c10: 20 31 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69 74 69 61   1;.}../* Initia
1c20: 6c 69 7a 65 20 74 68 65 20 4a 73 6f 6e 53 74 72  lize the JsonStr
1c30: 69 6e 67 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74  ing object.*/.st
1c40: 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 49 6e  atic void jsonIn
1c50: 69 74 28 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70  it(JsonString *p
1c60: 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  , sqlite3_contex
1c70: 74 20 2a 70 43 74 78 29 7b 0a 20 20 70 2d 3e 70  t *pCtx){.  p->p
1c80: 43 74 78 20 3d 20 70 43 74 78 3b 0a 20 20 70 2d  Ctx = pCtx;.  p-
1c90: 3e 62 45 72 72 20 3d 20 30 3b 0a 20 20 6a 73 6f  >bErr = 0;.  jso
1ca0: 6e 5a 65 72 6f 28 70 29 3b 0a 7d 0a 0a 0a 2f 2a  nZero(p);.}.../*
1cb0: 20 46 72 65 65 20 61 6c 6c 20 61 6c 6c 6f 63 61   Free all alloca
1cc0: 74 65 64 20 6d 65 6d 6f 72 79 20 61 6e 64 20 72  ted memory and r
1cd0: 65 73 65 74 20 74 68 65 20 4a 73 6f 6e 53 74 72  eset the JsonStr
1ce0: 69 6e 67 20 6f 62 6a 65 63 74 20 62 61 63 6b 20  ing object back 
1cf0: 74 6f 20 69 74 73 0a 2a 2a 20 69 6e 69 74 69 61  to its.** initia
1d00: 6c 20 73 74 61 74 65 2e 0a 2a 2f 0a 73 74 61 74  l state..*/.stat
1d10: 69 63 20 76 6f 69 64 20 6a 73 6f 6e 52 65 73 65  ic void jsonRese
1d20: 74 28 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70 29  t(JsonString *p)
1d30: 7b 0a 20 20 69 66 28 20 21 70 2d 3e 62 53 74 61  {.  if( !p->bSta
1d40: 74 69 63 20 29 20 73 71 6c 69 74 65 33 5f 66 72  tic ) sqlite3_fr
1d50: 65 65 28 70 2d 3e 7a 42 75 66 29 3b 0a 20 20 6a  ee(p->zBuf);.  j
1d60: 73 6f 6e 5a 65 72 6f 28 70 29 3b 0a 7d 0a 0a 0a  sonZero(p);.}...
1d70: 2f 2a 20 52 65 70 6f 72 74 20 61 6e 20 6f 75 74  /* Report an out
1d80: 2d 6f 66 2d 6d 65 6d 6f 72 79 20 28 4f 4f 4d 29  -of-memory (OOM)
1d90: 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2f 0a 73   condition .*/.s
1da0: 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 4f  tatic void jsonO
1db0: 6f 6d 28 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70  om(JsonString *p
1dc0: 29 7b 0a 20 20 70 2d 3e 62 45 72 72 20 3d 20 31  ){.  p->bErr = 1
1dd0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
1de0: 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 70  lt_error_nomem(p
1df0: 2d 3e 70 43 74 78 29 3b 0a 20 20 6a 73 6f 6e 52  ->pCtx);.  jsonR
1e00: 65 73 65 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 20 45  eset(p);.}../* E
1e10: 6e 6c 61 72 67 65 20 70 4a 73 6f 6e 2d 3e 7a 42  nlarge pJson->zB
1e20: 75 66 20 73 6f 20 74 68 61 74 20 69 74 20 63 61  uf so that it ca
1e30: 6e 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20  n hold at least 
1e40: 4e 20 6d 6f 72 65 20 62 79 74 65 73 2e 0a 2a 2a  N more bytes..**
1e50: 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 6f 6e 20   Return zero on 
1e60: 73 75 63 63 65 73 73 2e 20 20 52 65 74 75 72 6e  success.  Return
1e70: 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20 61 6e 20   non-zero on an 
1e80: 4f 4f 4d 20 65 72 72 6f 72 0a 2a 2f 0a 73 74 61  OOM error.*/.sta
1e90: 74 69 63 20 69 6e 74 20 6a 73 6f 6e 47 72 6f 77  tic int jsonGrow
1ea0: 28 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70 2c 20  (JsonString *p, 
1eb0: 75 33 32 20 4e 29 7b 0a 20 20 75 36 34 20 6e 54  u32 N){.  u64 nT
1ec0: 6f 74 61 6c 20 3d 20 4e 3c 70 2d 3e 6e 41 6c 6c  otal = N<p->nAll
1ed0: 6f 63 20 3f 20 70 2d 3e 6e 41 6c 6c 6f 63 2a 32  oc ? p->nAlloc*2
1ee0: 20 3a 20 70 2d 3e 6e 41 6c 6c 6f 63 2b 4e 2b 31   : p->nAlloc+N+1
1ef0: 30 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 65 77 3b  0;.  char *zNew;
1f00: 0a 20 20 69 66 28 20 70 2d 3e 62 53 74 61 74 69  .  if( p->bStati
1f10: 63 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  c ){.    if( p->
1f20: 62 45 72 72 20 29 20 72 65 74 75 72 6e 20 31 3b  bErr ) return 1;
1f30: 0a 20 20 20 20 7a 4e 65 77 20 3d 20 73 71 6c 69  .    zNew = sqli
1f40: 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 54 6f  te3_malloc64(nTo
1f50: 74 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e  tal);.    if( zN
1f60: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6a  ew==0 ){.      j
1f70: 73 6f 6e 4f 6f 6d 28 70 29 3b 0a 20 20 20 20 20  sonOom(p);.     
1f80: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
1f90: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
1fa0: 6d 65 6d 63 70 79 28 7a 4e 65 77 2c 20 70 2d 3e  memcpy(zNew, p->
1fb0: 7a 42 75 66 2c 20 28 73 69 7a 65 5f 74 29 70 2d  zBuf, (size_t)p-
1fc0: 3e 6e 55 73 65 64 29 3b 0a 20 20 20 20 70 2d 3e  >nUsed);.    p->
1fd0: 7a 42 75 66 20 3d 20 7a 4e 65 77 3b 0a 20 20 20  zBuf = zNew;.   
1fe0: 20 70 2d 3e 62 53 74 61 74 69 63 20 3d 20 30 3b   p->bStatic = 0;
1ff0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e  .  }else{.    zN
2000: 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61  ew = sqlite3_rea
2010: 6c 6c 6f 63 36 34 28 70 2d 3e 7a 42 75 66 2c 20  lloc64(p->zBuf, 
2020: 6e 54 6f 74 61 6c 29 3b 0a 20 20 20 20 69 66 28  nTotal);.    if(
2030: 20 7a 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   zNew==0 ){.    
2040: 20 20 6a 73 6f 6e 4f 6f 6d 28 70 29 3b 0a 20 20    jsonOom(p);.  
2050: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2060: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
2070: 20 20 20 70 2d 3e 7a 42 75 66 20 3d 20 7a 4e 65     p->zBuf = zNe
2080: 77 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 41 6c 6c  w;.  }.  p->nAll
2090: 6f 63 20 3d 20 6e 54 6f 74 61 6c 3b 0a 20 20 72  oc = nTotal;.  r
20a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
20b0: 0a 7d 0a 0a 2f 2a 20 41 70 70 65 6e 64 20 4e 20  .}../* Append N 
20c0: 62 79 74 65 73 20 66 72 6f 6d 20 7a 49 6e 20 6f  bytes from zIn o
20d0: 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74  nto the end of t
20e0: 68 65 20 4a 73 6f 6e 53 74 72 69 6e 67 20 73 74  he JsonString st
20f0: 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ring..*/.static 
2100: 76 6f 69 64 20 6a 73 6f 6e 41 70 70 65 6e 64 52  void jsonAppendR
2110: 61 77 28 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70  aw(JsonString *p
2120: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49  , const char *zI
2130: 6e 2c 20 75 33 32 20 4e 29 7b 0a 20 20 69 66 28  n, u32 N){.  if(
2140: 20 28 4e 2b 70 2d 3e 6e 55 73 65 64 20 3e 3d 20   (N+p->nUsed >= 
2150: 70 2d 3e 6e 41 6c 6c 6f 63 29 20 26 26 20 6a 73  p->nAlloc) && js
2160: 6f 6e 47 72 6f 77 28 70 2c 4e 29 21 3d 30 20 29  onGrow(p,N)!=0 )
2170: 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 63 70   return;.  memcp
2180: 79 28 70 2d 3e 7a 42 75 66 2b 70 2d 3e 6e 55 73  y(p->zBuf+p->nUs
2190: 65 64 2c 20 7a 49 6e 2c 20 4e 29 3b 0a 20 20 70  ed, zIn, N);.  p
21a0: 2d 3e 6e 55 73 65 64 20 2b 3d 20 4e 3b 0a 7d 0a  ->nUsed += N;.}.
21b0: 0a 2f 2a 20 41 70 70 65 6e 64 20 66 6f 72 6d 61  ./* Append forma
21c0: 74 74 65 64 20 74 65 78 74 20 28 6e 6f 74 20 74  tted text (not t
21d0: 6f 20 65 78 63 65 65 64 20 4e 20 62 79 74 65 73  o exceed N bytes
21e0: 29 20 74 6f 20 74 68 65 20 4a 73 6f 6e 53 74 72  ) to the JsonStr
21f0: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
2200: 6f 69 64 20 6a 73 6f 6e 50 72 69 6e 74 66 28 69  oid jsonPrintf(i
2210: 6e 74 20 4e 2c 20 4a 73 6f 6e 53 74 72 69 6e 67  nt N, JsonString
2220: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
2230: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
2240: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
2250: 69 66 28 20 28 70 2d 3e 6e 55 73 65 64 20 2b 20  if( (p->nUsed + 
2260: 4e 20 3e 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 29 20  N >= p->nAlloc) 
2270: 26 26 20 6a 73 6f 6e 47 72 6f 77 28 70 2c 20 4e  && jsonGrow(p, N
2280: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 76 61  ) ) return;.  va
2290: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
22a0: 61 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  at);.  sqlite3_v
22b0: 73 6e 70 72 69 6e 74 66 28 4e 2c 20 70 2d 3e 7a  snprintf(N, p->z
22c0: 42 75 66 2b 70 2d 3e 6e 55 73 65 64 2c 20 7a 46  Buf+p->nUsed, zF
22d0: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61  ormat, ap);.  va
22e0: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 70 2d 3e 6e  _end(ap);.  p->n
22f0: 55 73 65 64 20 2b 3d 20 28 69 6e 74 29 73 74 72  Used += (int)str
2300: 6c 65 6e 28 70 2d 3e 7a 42 75 66 2b 70 2d 3e 6e  len(p->zBuf+p->n
2310: 55 73 65 64 29 3b 0a 7d 0a 0a 2f 2a 20 41 70 70  Used);.}../* App
2320: 65 6e 64 20 61 20 73 69 6e 67 6c 65 20 63 68 61  end a single cha
2330: 72 61 63 74 65 72 0a 2a 2f 0a 73 74 61 74 69 63  racter.*/.static
2340: 20 76 6f 69 64 20 6a 73 6f 6e 41 70 70 65 6e 64   void jsonAppend
2350: 43 68 61 72 28 4a 73 6f 6e 53 74 72 69 6e 67 20  Char(JsonString 
2360: 2a 70 2c 20 63 68 61 72 20 63 29 7b 0a 20 20 69  *p, char c){.  i
2370: 66 28 20 70 2d 3e 6e 55 73 65 64 3e 3d 70 2d 3e  f( p->nUsed>=p->
2380: 6e 41 6c 6c 6f 63 20 26 26 20 6a 73 6f 6e 47 72  nAlloc && jsonGr
2390: 6f 77 28 70 2c 31 29 21 3d 30 20 29 20 72 65 74  ow(p,1)!=0 ) ret
23a0: 75 72 6e 3b 0a 20 20 70 2d 3e 7a 42 75 66 5b 70  urn;.  p->zBuf[p
23b0: 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d 20 63 3b 0a  ->nUsed++] = c;.
23c0: 7d 0a 0a 2f 2a 20 41 70 70 65 6e 64 20 61 20 63  }../* Append a c
23d0: 6f 6d 6d 61 20 73 65 70 61 72 61 74 6f 72 20 74  omma separator t
23e0: 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  o the output buf
23f0: 66 65 72 2c 20 69 66 20 74 68 65 20 70 72 65 76  fer, if the prev
2400: 69 6f 75 73 0a 2a 2a 20 63 68 61 72 61 63 74 65  ious.** characte
2410: 72 20 69 73 20 6e 6f 74 20 27 5b 27 20 6f 72 20  r is not '[' or 
2420: 27 7b 27 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  '{'..*/.static v
2430: 6f 69 64 20 6a 73 6f 6e 41 70 70 65 6e 64 53 65  oid jsonAppendSe
2440: 70 61 72 61 74 6f 72 28 4a 73 6f 6e 53 74 72 69  parator(JsonStri
2450: 6e 67 20 2a 70 29 7b 0a 20 20 63 68 61 72 20 63  ng *p){.  char c
2460: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 55 73 65 64  ;.  if( p->nUsed
2470: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
2480: 63 20 3d 20 70 2d 3e 7a 42 75 66 5b 70 2d 3e 6e  c = p->zBuf[p->n
2490: 55 73 65 64 2d 31 5d 3b 0a 20 20 69 66 28 20 63  Used-1];.  if( c
24a0: 21 3d 27 5b 27 20 26 26 20 63 21 3d 27 7b 27 20  !='[' && c!='{' 
24b0: 29 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61 72  ) jsonAppendChar
24c0: 28 70 2c 20 27 2c 27 29 3b 0a 7d 0a 0a 2f 2a 20  (p, ',');.}../* 
24d0: 41 70 70 65 6e 64 20 74 68 65 20 4e 2d 62 79 74  Append the N-byt
24e0: 65 20 73 74 72 69 6e 67 20 69 6e 20 7a 49 6e 20  e string in zIn 
24f0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
2500: 65 20 4a 73 6f 6e 53 74 72 69 6e 67 20 73 74 72  e JsonString str
2510: 69 6e 67 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e  ing.** under con
2520: 73 74 72 75 63 74 69 6f 6e 2e 20 20 45 6e 63 6c  struction.  Encl
2530: 6f 73 65 20 74 68 65 20 73 74 72 69 6e 67 20 69  ose the string i
2540: 6e 20 22 2e 2e 2e 22 20 61 6e 64 20 65 73 63 61  n "..." and esca
2550: 70 65 0a 2a 2a 20 61 6e 79 20 64 6f 75 62 6c 65  pe.** any double
2560: 2d 71 75 6f 74 65 73 20 6f 72 20 62 61 63 6b 73  -quotes or backs
2570: 6c 61 73 68 20 63 68 61 72 61 63 74 65 72 73 20  lash characters 
2580: 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
2590: 20 74 68 65 0a 2a 2a 20 73 74 72 69 6e 67 2e 0a   the.** string..
25a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a  */.static void j
25b0: 73 6f 6e 41 70 70 65 6e 64 53 74 72 69 6e 67 28  sonAppendString(
25c0: 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70 2c 20 63  JsonString *p, c
25d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 2c 20  onst char *zIn, 
25e0: 75 33 32 20 4e 29 7b 0a 20 20 75 33 32 20 69 3b  u32 N){.  u32 i;
25f0: 0a 20 20 69 66 28 20 28 4e 2b 70 2d 3e 6e 55 73  .  if( (N+p->nUs
2600: 65 64 2b 32 20 3e 3d 20 70 2d 3e 6e 41 6c 6c 6f  ed+2 >= p->nAllo
2610: 63 29 20 26 26 20 6a 73 6f 6e 47 72 6f 77 28 70  c) && jsonGrow(p
2620: 2c 4e 2b 32 29 21 3d 30 20 29 20 72 65 74 75 72  ,N+2)!=0 ) retur
2630: 6e 3b 0a 20 20 70 2d 3e 7a 42 75 66 5b 70 2d 3e  n;.  p->zBuf[p->
2640: 6e 55 73 65 64 2b 2b 5d 20 3d 20 27 22 27 3b 0a  nUsed++] = '"';.
2650: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b 20    for(i=0; i<N; 
2660: 69 2b 2b 29 7b 0a 20 20 20 20 75 6e 73 69 67 6e  i++){.    unsign
2670: 65 64 20 63 68 61 72 20 63 20 3d 20 28 28 75 6e  ed char c = ((un
2680: 73 69 67 6e 65 64 20 63 6f 6e 73 74 20 63 68 61  signed const cha
2690: 72 2a 29 7a 49 6e 29 5b 69 5d 3b 0a 20 20 20 20  r*)zIn)[i];.    
26a0: 69 66 28 20 63 3d 3d 27 22 27 20 7c 7c 20 63 3d  if( c=='"' || c=
26b0: 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 6a  ='\\' ){.      j
26c0: 73 6f 6e 5f 73 69 6d 70 6c 65 5f 65 73 63 61 70  son_simple_escap
26d0: 65 3a 0a 20 20 20 20 20 20 69 66 28 20 28 70 2d  e:.      if( (p-
26e0: 3e 6e 55 73 65 64 2b 4e 2b 33 2d 69 20 3e 20 70  >nUsed+N+3-i > p
26f0: 2d 3e 6e 41 6c 6c 6f 63 29 20 26 26 20 6a 73 6f  ->nAlloc) && jso
2700: 6e 47 72 6f 77 28 70 2c 4e 2b 33 2d 69 29 21 3d  nGrow(p,N+3-i)!=
2710: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
2720: 20 20 70 2d 3e 7a 42 75 66 5b 70 2d 3e 6e 55 73    p->zBuf[p->nUs
2730: 65 64 2b 2b 5d 20 3d 20 27 5c 5c 27 3b 0a 20 20  ed++] = '\\';.  
2740: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3c 3d 30    }else if( c<=0
2750: 78 31 66 20 29 7b 0a 20 20 20 20 20 20 73 74 61  x1f ){.      sta
2760: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 61  tic const char a
2770: 53 70 65 63 69 61 6c 5b 5d 20 3d 20 7b 0a 20 20  Special[] = {.  
2780: 20 20 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20         0, 0, 0, 
2790: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 27  0, 0, 0, 0, 0, '
27a0: 62 27 2c 20 27 74 27 2c 20 27 6e 27 2c 20 30 2c  b', 't', 'n', 0,
27b0: 20 27 66 27 2c 20 27 72 27 2c 20 30 2c 20 30 2c   'f', 'r', 0, 0,
27c0: 0a 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20  .         0, 0, 
27d0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
27e0: 2c 20 20 20 30 2c 20 20 20 30 2c 20 20 20 30 2c  ,   0,   0,   0,
27f0: 20 30 2c 20 20 20 30 2c 20 20 20 30 2c 20 30 2c   0,   0,   0, 0,
2800: 20 30 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20   0.      };.    
2810: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
2820: 28 61 53 70 65 63 69 61 6c 29 3d 3d 33 32 20 29  (aSpecial)==32 )
2830: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2840: 61 53 70 65 63 69 61 6c 5b 27 5c 62 27 5d 3d 3d  aSpecial['\b']==
2850: 27 62 27 20 29 3b 0a 20 20 20 20 20 20 61 73 73  'b' );.      ass
2860: 65 72 74 28 20 61 53 70 65 63 69 61 6c 5b 27 5c  ert( aSpecial['\
2870: 66 27 5d 3d 3d 27 66 27 20 29 3b 0a 20 20 20 20  f']=='f' );.    
2880: 20 20 61 73 73 65 72 74 28 20 61 53 70 65 63 69    assert( aSpeci
2890: 61 6c 5b 27 5c 6e 27 5d 3d 3d 27 6e 27 20 29 3b  al['\n']=='n' );
28a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61  .      assert( a
28b0: 53 70 65 63 69 61 6c 5b 27 5c 72 27 5d 3d 3d 27  Special['\r']=='
28c0: 72 27 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  r' );.      asse
28d0: 72 74 28 20 61 53 70 65 63 69 61 6c 5b 27 5c 74  rt( aSpecial['\t
28e0: 27 5d 3d 3d 27 74 27 20 29 3b 0a 20 20 20 20 20  ']=='t' );.     
28f0: 20 69 66 28 20 61 53 70 65 63 69 61 6c 5b 63 5d   if( aSpecial[c]
2900: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20   ){.        c = 
2910: 61 53 70 65 63 69 61 6c 5b 63 5d 3b 0a 20 20 20  aSpecial[c];.   
2920: 20 20 20 20 20 67 6f 74 6f 20 6a 73 6f 6e 5f 73       goto json_s
2930: 69 6d 70 6c 65 5f 65 73 63 61 70 65 3b 0a 20 20  imple_escape;.  
2940: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2950: 28 70 2d 3e 6e 55 73 65 64 2b 4e 2b 37 2b 69 20  (p->nUsed+N+7+i 
2960: 3e 20 70 2d 3e 6e 41 6c 6c 6f 63 29 20 26 26 20  > p->nAlloc) && 
2970: 6a 73 6f 6e 47 72 6f 77 28 70 2c 4e 2b 37 2d 69  jsonGrow(p,N+7-i
2980: 29 21 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )!=0 ) return;. 
2990: 20 20 20 20 20 70 2d 3e 7a 42 75 66 5b 70 2d 3e       p->zBuf[p->
29a0: 6e 55 73 65 64 2b 2b 5d 20 3d 20 27 5c 5c 27 3b  nUsed++] = '\\';
29b0: 0a 20 20 20 20 20 20 70 2d 3e 7a 42 75 66 5b 70  .      p->zBuf[p
29c0: 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d 20 27 75 27  ->nUsed++] = 'u'
29d0: 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 42 75 66 5b  ;.      p->zBuf[
29e0: 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d 20 27 30  p->nUsed++] = '0
29f0: 27 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 42 75 66  ';.      p->zBuf
2a00: 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d 20 27  [p->nUsed++] = '
2a10: 30 27 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 42 75  0';.      p->zBu
2a20: 66 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d 20  f[p->nUsed++] = 
2a30: 27 30 27 20 2b 20 28 63 3e 3e 34 29 3b 0a 20 20  '0' + (c>>4);.  
2a40: 20 20 20 20 63 20 3d 20 22 30 31 32 33 34 35 36      c = "0123456
2a50: 37 38 39 61 62 63 64 65 66 22 5b 63 26 30 78 66  789abcdef"[c&0xf
2a60: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  ];.    }.    p->
2a70: 7a 42 75 66 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d  zBuf[p->nUsed++]
2a80: 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 70 2d 3e 7a   = c;.  }.  p->z
2a90: 42 75 66 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20  Buf[p->nUsed++] 
2aa0: 3d 20 27 22 27 3b 0a 20 20 61 73 73 65 72 74 28  = '"';.  assert(
2ab0: 20 70 2d 3e 6e 55 73 65 64 3c 70 2d 3e 6e 41 6c   p->nUsed<p->nAl
2ac0: 6c 6f 63 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  loc );.}../*.** 
2ad0: 41 70 70 65 6e 64 20 61 20 66 75 6e 63 74 69 6f  Append a functio
2ae0: 6e 20 70 61 72 61 6d 65 74 65 72 20 76 61 6c 75  n parameter valu
2af0: 65 20 74 6f 20 74 68 65 20 4a 53 4f 4e 20 73 74  e to the JSON st
2b00: 72 69 6e 67 20 75 6e 64 65 72 20 0a 2a 2a 20 63  ring under .** c
2b10: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  onstruction..*/.
2b20: 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e  static void json
2b30: 41 70 70 65 6e 64 56 61 6c 75 65 28 0a 20 20 4a  AppendValue(.  J
2b40: 73 6f 6e 53 74 72 69 6e 67 20 2a 70 2c 20 20 20  sonString *p,   
2b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b60: 20 41 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20   Append to this 
2b70: 4a 53 4f 4e 20 73 74 72 69 6e 67 20 2a 2f 0a 20  JSON string */. 
2b80: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
2b90: 70 56 61 6c 75 65 20 20 20 20 20 20 20 20 20 20  pValue          
2ba0: 2f 2a 20 56 61 6c 75 65 20 74 6f 20 61 70 70 65  /* Value to appe
2bb0: 6e 64 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63  nd */.){.  switc
2bc0: 68 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  h( sqlite3_value
2bd0: 5f 74 79 70 65 28 70 56 61 6c 75 65 29 20 29 7b  _type(pValue) ){
2be0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
2bf0: 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 6a  _NULL: {.      j
2c00: 73 6f 6e 41 70 70 65 6e 64 52 61 77 28 70 2c 20  sonAppendRaw(p, 
2c10: 22 6e 75 6c 6c 22 2c 20 34 29 3b 0a 20 20 20 20  "null", 4);.    
2c20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
2c30: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
2c40: 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61 73 65  NTEGER:.    case
2c50: 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b   SQLITE_FLOAT: {
2c60: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
2c70: 72 20 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68  r *z = (const ch
2c80: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
2c90: 65 5f 74 65 78 74 28 70 56 61 6c 75 65 29 3b 0a  e_text(pValue);.
2ca0: 20 20 20 20 20 20 75 33 32 20 6e 20 3d 20 28 75        u32 n = (u
2cb0: 33 32 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  32)sqlite3_value
2cc0: 5f 62 79 74 65 73 28 70 56 61 6c 75 65 29 3b 0a  _bytes(pValue);.
2cd0: 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64        jsonAppend
2ce0: 52 61 77 28 70 2c 20 7a 2c 20 6e 29 3b 0a 20 20  Raw(p, z, n);.  
2cf0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2d00: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
2d10: 5f 54 45 58 54 3a 20 7b 0a 20 20 20 20 20 20 63  _TEXT: {.      c
2d20: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28  onst char *z = (
2d30: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
2d40: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70  te3_value_text(p
2d50: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 75 33  Value);.      u3
2d60: 32 20 6e 20 3d 20 28 75 33 32 29 73 71 6c 69 74  2 n = (u32)sqlit
2d70: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70  e3_value_bytes(p
2d80: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 69 66  Value);.      if
2d90: 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
2da0: 73 75 62 74 79 70 65 28 70 56 61 6c 75 65 29 3d  subtype(pValue)=
2db0: 3d 4a 53 4f 4e 5f 53 55 42 54 59 50 45 20 29 7b  =JSON_SUBTYPE ){
2dc0: 0a 20 20 20 20 20 20 20 20 6a 73 6f 6e 41 70 70  .        jsonApp
2dd0: 65 6e 64 52 61 77 28 70 2c 20 7a 2c 20 6e 29 3b  endRaw(p, z, n);
2de0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2df0: 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64        jsonAppend
2e00: 53 74 72 69 6e 67 28 70 2c 20 7a 2c 20 6e 29 3b  String(p, z, n);
2e10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
2e20: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
2e30: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
2e40: 20 69 66 28 20 70 2d 3e 62 45 72 72 3d 3d 30 20   if( p->bErr==0 
2e50: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2e60: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
2e70: 70 2d 3e 70 43 74 78 2c 20 22 4a 53 4f 4e 20 63  p->pCtx, "JSON c
2e80: 61 6e 6e 6f 74 20 68 6f 6c 64 20 42 4c 4f 42 20  annot hold BLOB 
2e90: 76 61 6c 75 65 73 22 2c 20 2d 31 29 3b 0a 20 20  values", -1);.  
2ea0: 20 20 20 20 20 20 70 2d 3e 62 45 72 72 20 3d 20        p->bErr = 
2eb0: 32 3b 0a 20 20 20 20 20 20 20 20 6a 73 6f 6e 52  2;.        jsonR
2ec0: 65 73 65 74 28 70 29 3b 0a 20 20 20 20 20 20 7d  eset(p);.      }
2ed0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2ee0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 20 4d    }.  }.}.../* M
2ef0: 61 6b 65 20 74 68 65 20 4a 53 4f 4e 20 69 6e 20  ake the JSON in 
2f00: 70 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  p the result of 
2f10: 74 68 65 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  the SQL function
2f20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2f30: 20 6a 73 6f 6e 52 65 73 75 6c 74 28 4a 73 6f 6e   jsonResult(Json
2f40: 53 74 72 69 6e 67 20 2a 70 29 7b 0a 20 20 69 66  String *p){.  if
2f50: 28 20 70 2d 3e 62 45 72 72 3d 3d 30 20 29 7b 0a  ( p->bErr==0 ){.
2f60: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
2f70: 6c 74 5f 74 65 78 74 36 34 28 70 2d 3e 70 43 74  lt_text64(p->pCt
2f80: 78 2c 20 70 2d 3e 7a 42 75 66 2c 20 70 2d 3e 6e  x, p->zBuf, p->n
2f90: 55 73 65 64 2c 20 0a 20 20 20 20 20 20 20 20 20  Used, .         
2fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb0: 20 70 2d 3e 62 53 74 61 74 69 63 20 3f 20 53 51   p->bStatic ? SQ
2fc0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 20 3a  LITE_TRANSIENT :
2fd0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 2c 0a 20   sqlite3_free,. 
2fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ff0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
3000: 55 54 46 38 29 3b 0a 20 20 20 20 6a 73 6f 6e 5a  UTF8);.    jsonZ
3010: 65 72 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 61 73  ero(p);.  }.  as
3020: 73 65 72 74 28 20 70 2d 3e 62 53 74 61 74 69 63  sert( p->bStatic
3030: 20 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   );.}../********
3040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3080: 2a 2a 0a 2a 2a 20 55 74 69 6c 69 74 79 20 72 6f  **.** Utility ro
3090: 75 74 69 6e 65 73 20 66 6f 72 20 64 65 61 6c 69  utines for deali
30a0: 6e 67 20 77 69 74 68 20 4a 73 6f 6e 4e 6f 64 65  ng with JsonNode
30b0: 20 61 6e 64 20 4a 73 6f 6e 50 61 72 73 65 20 6f   and JsonParse o
30c0: 62 6a 65 63 74 73 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  bjects.*********
30d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3110: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
3120: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
3130: 6f 6e 73 65 63 75 74 69 76 65 20 4a 73 6f 6e 4e  onsecutive JsonN
3140: 6f 64 65 20 73 6c 6f 74 73 20 6e 65 65 64 20 74  ode slots need t
3150: 6f 20 72 65 70 72 65 73 65 6e 74 0a 2a 2a 20 74  o represent.** t
3160: 68 65 20 70 61 72 73 65 64 20 4a 53 4f 4e 20 61  he parsed JSON a
3170: 74 20 70 4e 6f 64 65 2e 20 20 54 68 65 20 6d 69  t pNode.  The mi
3180: 6e 69 6d 75 6d 20 61 6e 73 77 65 72 20 69 73 20  nimum answer is 
3190: 31 2e 20 20 46 6f 72 20 41 52 52 41 59 20 61 6e  1.  For ARRAY an
31a0: 64 0a 2a 2a 20 4f 42 4a 45 43 54 20 74 79 70 65  d.** OBJECT type
31b0: 73 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6d 69  s, the number mi
31c0: 67 68 74 20 62 65 20 6c 61 72 67 65 72 2e 0a 2a  ght be larger..*
31d0: 2a 0a 2a 2a 20 41 70 70 65 6e 64 65 64 20 65 6c  *.** Appended el
31e0: 65 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74 20 63  ements are not c
31f0: 6f 75 6e 74 65 64 2e 20 20 54 68 65 20 76 61 6c  ounted.  The val
3200: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
3210: 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 62 79 20  he number.** by 
3220: 77 68 69 63 68 20 74 68 65 20 4a 73 6f 6e 4e 6f  which the JsonNo
3230: 64 65 20 63 6f 75 6e 74 65 72 20 73 68 6f 75 6c  de counter shoul
3240: 64 20 69 6e 63 72 65 6d 65 6e 74 20 69 6e 20 6f  d increment in o
3250: 72 64 65 72 20 74 6f 20 67 6f 20 74 6f 20 74 68  rder to go to th
3260: 65 0a 2a 2a 20 6e 65 78 74 20 70 65 65 72 20 76  e.** next peer v
3270: 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
3280: 75 33 32 20 6a 73 6f 6e 4e 6f 64 65 53 69 7a 65  u32 jsonNodeSize
3290: 28 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65  (JsonNode *pNode
32a0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 4e 6f 64  ){.  return pNod
32b0: 65 2d 3e 65 54 79 70 65 3e 3d 4a 53 4f 4e 5f 41  e->eType>=JSON_A
32c0: 52 52 41 59 20 3f 20 70 4e 6f 64 65 2d 3e 6e 2b  RRAY ? pNode->n+
32d0: 31 20 3a 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1 : 1;.}../*.** 
32e0: 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f  Reclaim all memo
32f0: 72 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ry allocated by 
3300: 61 20 4a 73 6f 6e 50 61 72 73 65 20 6f 62 6a 65  a JsonParse obje
3310: 63 74 2e 20 20 42 75 74 20 64 6f 20 6e 6f 74 0a  ct.  But do not.
3320: 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 4a 73  ** delete the Js
3330: 6f 6e 50 61 72 73 65 20 6f 62 6a 65 63 74 20 69  onParse object i
3340: 74 73 65 6c 66 2e 0a 2a 2f 0a 73 74 61 74 69 63  tself..*/.static
3350: 20 76 6f 69 64 20 6a 73 6f 6e 50 61 72 73 65 52   void jsonParseR
3360: 65 73 65 74 28 4a 73 6f 6e 50 61 72 73 65 20 2a  eset(JsonParse *
3370: 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
3380: 65 33 5f 66 72 65 65 28 70 50 61 72 73 65 2d 3e  e3_free(pParse->
3390: 61 4e 6f 64 65 29 3b 0a 20 20 70 50 61 72 73 65  aNode);.  pParse
33a0: 2d 3e 61 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 70  ->aNode = 0;.  p
33b0: 50 61 72 73 65 2d 3e 6e 4e 6f 64 65 20 3d 20 30  Parse->nNode = 0
33c0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 41 6c 6c  ;.  pParse->nAll
33d0: 6f 63 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  oc = 0;.  sqlite
33e0: 33 5f 66 72 65 65 28 70 50 61 72 73 65 2d 3e 61  3_free(pParse->a
33f0: 55 70 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 61  Up);.  pParse->a
3400: 55 70 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Up = 0;.}../*.**
3410: 20 46 72 65 65 20 61 20 4a 73 6f 6e 50 61 72 73   Free a JsonPars
3420: 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 61  e object that wa
3430: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
3440: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
3450: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3460: 20 6a 73 6f 6e 50 61 72 73 65 46 72 65 65 28 4a   jsonParseFree(J
3470: 73 6f 6e 50 61 72 73 65 20 2a 70 50 61 72 73 65  sonParse *pParse
3480: 29 7b 0a 20 20 6a 73 6f 6e 50 61 72 73 65 52 65  ){.  jsonParseRe
3490: 73 65 74 28 70 50 61 72 73 65 29 3b 0a 20 20 73  set(pParse);.  s
34a0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 72  qlite3_free(pPar
34b0: 73 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  se);.}../*.** Co
34c0: 6e 76 65 72 74 20 74 68 65 20 4a 73 6f 6e 4e 6f  nvert the JsonNo
34d0: 64 65 20 70 4e 6f 64 65 20 69 6e 74 6f 20 61 20  de pNode into a 
34e0: 70 75 72 65 20 4a 53 4f 4e 20 73 74 72 69 6e 67  pure JSON string
34f0: 20 61 6e 64 0a 2a 2a 20 61 70 70 65 6e 64 20 74   and.** append t
3500: 6f 20 70 4f 75 74 2e 20 20 53 75 62 73 75 62 73  o pOut.  Subsubs
3510: 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 73 6f  tructure is also
3520: 20 69 6e 63 6c 75 64 65 64 2e 20 20 52 65 74 75   included.  Retu
3530: 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  rn.** the number
3540: 20 6f 66 20 4a 73 6f 6e 4e 6f 64 65 20 6f 62 6a   of JsonNode obj
3550: 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65 6e  ects that are en
3560: 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  coded..*/.static
3570: 20 76 6f 69 64 20 6a 73 6f 6e 52 65 6e 64 65 72   void jsonRender
3580: 4e 6f 64 65 28 0a 20 20 4a 73 6f 6e 4e 6f 64 65  Node(.  JsonNode
3590: 20 2a 70 4e 6f 64 65 2c 20 20 20 20 20 20 20 20   *pNode,        
35a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 6f         /* The no
35b0: 64 65 20 74 6f 20 72 65 6e 64 65 72 20 2a 2f 0a  de to render */.
35c0: 20 20 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70 4f    JsonString *pO
35d0: 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ut,             
35e0: 20 2f 2a 20 57 72 69 74 65 20 4a 53 4f 4e 20 68   /* Write JSON h
35f0: 65 72 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ere */.  sqlite3
3600: 5f 76 61 6c 75 65 20 2a 2a 61 52 65 70 6c 61 63  _value **aReplac
3610: 65 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6c 61  e       /* Repla
3620: 63 65 6d 65 6e 74 20 76 61 6c 75 65 73 20 2a 2f  cement values */
3630: 0a 29 7b 0a 20 20 69 66 28 20 70 4e 6f 64 65 2d  .){.  if( pNode-
3640: 3e 6a 6e 46 6c 61 67 73 20 26 20 28 4a 4e 4f 44  >jnFlags & (JNOD
3650: 45 5f 52 45 50 4c 41 43 45 7c 4a 4e 4f 44 45 5f  E_REPLACE|JNODE_
3660: 50 41 54 43 48 29 20 29 7b 0a 20 20 20 20 69 66  PATCH) ){.    if
3670: 28 20 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73  ( pNode->jnFlags
3680: 20 26 20 4a 4e 4f 44 45 5f 52 45 50 4c 41 43 45   & JNODE_REPLACE
3690: 20 29 7b 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70   ){.      jsonAp
36a0: 70 65 6e 64 56 61 6c 75 65 28 70 4f 75 74 2c 20  pendValue(pOut, 
36b0: 61 52 65 70 6c 61 63 65 5b 70 4e 6f 64 65 2d 3e  aReplace[pNode->
36c0: 75 2e 69 52 65 70 6c 61 63 65 5d 29 3b 0a 20 20  u.iReplace]);.  
36d0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
36e0: 7d 0a 20 20 20 20 70 4e 6f 64 65 20 3d 20 70 4e  }.    pNode = pN
36f0: 6f 64 65 2d 3e 75 2e 70 50 61 74 63 68 3b 0a 20  ode->u.pPatch;. 
3700: 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70 4e 6f   }.  switch( pNo
3710: 64 65 2d 3e 65 54 79 70 65 20 29 7b 0a 20 20 20  de->eType ){.   
3720: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
3730: 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d    assert( pNode-
3740: 3e 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f 4e 55 4c  >eType==JSON_NUL
3750: 4c 20 29 3b 0a 20 20 20 20 20 20 6a 73 6f 6e 41  L );.      jsonA
3760: 70 70 65 6e 64 52 61 77 28 70 4f 75 74 2c 20 22  ppendRaw(pOut, "
3770: 6e 75 6c 6c 22 2c 20 34 29 3b 0a 20 20 20 20 20  null", 4);.     
3780: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
3790: 20 20 63 61 73 65 20 4a 53 4f 4e 5f 54 52 55 45    case JSON_TRUE
37a0: 3a 20 7b 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70  : {.      jsonAp
37b0: 70 65 6e 64 52 61 77 28 70 4f 75 74 2c 20 22 74  pendRaw(pOut, "t
37c0: 72 75 65 22 2c 20 34 29 3b 0a 20 20 20 20 20 20  rue", 4);.      
37d0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
37e0: 20 63 61 73 65 20 4a 53 4f 4e 5f 46 41 4c 53 45   case JSON_FALSE
37f0: 3a 20 7b 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70  : {.      jsonAp
3800: 70 65 6e 64 52 61 77 28 70 4f 75 74 2c 20 22 66  pendRaw(pOut, "f
3810: 61 6c 73 65 22 2c 20 35 29 3b 0a 20 20 20 20 20  alse", 5);.     
3820: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
3830: 20 20 63 61 73 65 20 4a 53 4f 4e 5f 53 54 52 49    case JSON_STRI
3840: 4e 47 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  NG: {.      if( 
3850: 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73 20 26  pNode->jnFlags &
3860: 20 4a 4e 4f 44 45 5f 52 41 57 20 29 7b 0a 20 20   JNODE_RAW ){.  
3870: 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64        jsonAppend
3880: 53 74 72 69 6e 67 28 70 4f 75 74 2c 20 70 4e 6f  String(pOut, pNo
3890: 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 2c  de->u.zJContent,
38a0: 20 70 4e 6f 64 65 2d 3e 6e 29 3b 0a 20 20 20 20   pNode->n);.    
38b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
38c0: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c   }.      /* Fall
38d0: 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20 74 68   through into th
38e0: 65 20 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20  e next case */. 
38f0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 53     }.    case JS
3900: 4f 4e 5f 52 45 41 4c 3a 0a 20 20 20 20 63 61 73  ON_REAL:.    cas
3910: 65 20 4a 53 4f 4e 5f 49 4e 54 3a 20 7b 0a 20 20  e JSON_INT: {.  
3920: 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 52 61      jsonAppendRa
3930: 77 28 70 4f 75 74 2c 20 70 4e 6f 64 65 2d 3e 75  w(pOut, pNode->u
3940: 2e 7a 4a 43 6f 6e 74 65 6e 74 2c 20 70 4e 6f 64  .zJContent, pNod
3950: 65 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  e->n);.      bre
3960: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
3970: 73 65 20 4a 53 4f 4e 5f 41 52 52 41 59 3a 20 7b  se JSON_ARRAY: {
3980: 0a 20 20 20 20 20 20 75 33 32 20 6a 20 3d 20 31  .      u32 j = 1
3990: 3b 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65  ;.      jsonAppe
39a0: 6e 64 43 68 61 72 28 70 4f 75 74 2c 20 27 5b 27  ndChar(pOut, '['
39b0: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29  );.      for(;;)
39c0: 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
39d0: 20 6a 3c 3d 70 4e 6f 64 65 2d 3e 6e 20 29 7b 0a   j<=pNode->n ){.
39e0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
39f0: 4e 6f 64 65 5b 6a 5d 2e 6a 6e 46 6c 61 67 73 20  Node[j].jnFlags 
3a00: 26 20 4a 4e 4f 44 45 5f 52 45 4d 4f 56 45 29 3d  & JNODE_REMOVE)=
3a10: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
3a20: 20 20 6a 73 6f 6e 41 70 70 65 6e 64 53 65 70 61    jsonAppendSepa
3a30: 72 61 74 6f 72 28 70 4f 75 74 29 3b 0a 20 20 20  rator(pOut);.   
3a40: 20 20 20 20 20 20 20 20 20 6a 73 6f 6e 52 65 6e           jsonRen
3a50: 64 65 72 4e 6f 64 65 28 26 70 4e 6f 64 65 5b 6a  derNode(&pNode[j
3a60: 5d 2c 20 70 4f 75 74 2c 20 61 52 65 70 6c 61 63  ], pOut, aReplac
3a70: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
3a80: 20 20 20 20 20 20 20 20 20 20 6a 20 2b 3d 20 6a            j += j
3a90: 73 6f 6e 4e 6f 64 65 53 69 7a 65 28 26 70 4e 6f  sonNodeSize(&pNo
3aa0: 64 65 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20  de[j]);.        
3ab0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  }.        if( (p
3ac0: 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73 20 26 20  Node->jnFlags & 
3ad0: 4a 4e 4f 44 45 5f 41 50 50 45 4e 44 29 3d 3d 30  JNODE_APPEND)==0
3ae0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
3af0: 20 20 70 4e 6f 64 65 20 3d 20 26 70 4e 6f 64 65    pNode = &pNode
3b00: 5b 70 4e 6f 64 65 2d 3e 75 2e 69 41 70 70 65 6e  [pNode->u.iAppen
3b10: 64 5d 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20  d];.        j = 
3b20: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
3b30: 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61 72 28   jsonAppendChar(
3b40: 70 4f 75 74 2c 20 27 5d 27 29 3b 0a 20 20 20 20  pOut, ']');.    
3b50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3b60: 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f 4f 42 4a     case JSON_OBJ
3b70: 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 75 33 32  ECT: {.      u32
3b80: 20 6a 20 3d 20 31 3b 0a 20 20 20 20 20 20 6a 73   j = 1;.      js
3b90: 6f 6e 41 70 70 65 6e 64 43 68 61 72 28 70 4f 75  onAppendChar(pOu
3ba0: 74 2c 20 27 7b 27 29 3b 0a 20 20 20 20 20 20 66  t, '{');.      f
3bb0: 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20  or(;;){.        
3bc0: 77 68 69 6c 65 28 20 6a 3c 3d 70 4e 6f 64 65 2d  while( j<=pNode-
3bd0: 3e 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >n ){.          
3be0: 69 66 28 20 28 70 4e 6f 64 65 5b 6a 2b 31 5d 2e  if( (pNode[j+1].
3bf0: 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f  jnFlags & JNODE_
3c00: 52 45 4d 4f 56 45 29 3d 3d 30 20 29 7b 0a 20 20  REMOVE)==0 ){.  
3c10: 20 20 20 20 20 20 20 20 20 20 6a 73 6f 6e 41 70            jsonAp
3c20: 70 65 6e 64 53 65 70 61 72 61 74 6f 72 28 70 4f  pendSeparator(pO
3c30: 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ut);.           
3c40: 20 6a 73 6f 6e 52 65 6e 64 65 72 4e 6f 64 65 28   jsonRenderNode(
3c50: 26 70 4e 6f 64 65 5b 6a 5d 2c 20 70 4f 75 74 2c  &pNode[j], pOut,
3c60: 20 61 52 65 70 6c 61 63 65 29 3b 0a 20 20 20 20   aReplace);.    
3c70: 20 20 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65          jsonAppe
3c80: 6e 64 43 68 61 72 28 70 4f 75 74 2c 20 27 3a 27  ndChar(pOut, ':'
3c90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  );.            j
3ca0: 73 6f 6e 52 65 6e 64 65 72 4e 6f 64 65 28 26 70  sonRenderNode(&p
3cb0: 4e 6f 64 65 5b 6a 2b 31 5d 2c 20 70 4f 75 74 2c  Node[j+1], pOut,
3cc0: 20 61 52 65 70 6c 61 63 65 29 3b 0a 20 20 20 20   aReplace);.    
3cd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3ce0: 20 20 6a 20 2b 3d 20 31 20 2b 20 6a 73 6f 6e 4e    j += 1 + jsonN
3cf0: 6f 64 65 53 69 7a 65 28 26 70 4e 6f 64 65 5b 6a  odeSize(&pNode[j
3d00: 2b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  +1]);.        }.
3d10: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4e 6f          if( (pNo
3d20: 64 65 2d 3e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e  de->jnFlags & JN
3d30: 4f 44 45 5f 41 50 50 45 4e 44 29 3d 3d 30 20 29  ODE_APPEND)==0 )
3d40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
3d50: 70 4e 6f 64 65 20 3d 20 26 70 4e 6f 64 65 5b 70  pNode = &pNode[p
3d60: 4e 6f 64 65 2d 3e 75 2e 69 41 70 70 65 6e 64 5d  Node->u.iAppend]
3d70: 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 31 3b  ;.        j = 1;
3d80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6a  .      }.      j
3d90: 73 6f 6e 41 70 70 65 6e 64 43 68 61 72 28 70 4f  sonAppendChar(pO
3da0: 75 74 2c 20 27 7d 27 29 3b 0a 20 20 20 20 20 20  ut, '}');.      
3db0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
3dc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
3dd0: 20 61 20 4a 73 6f 6e 4e 6f 64 65 20 61 6e 64 20   a JsonNode and 
3de0: 61 6c 6c 20 69 74 73 20 64 65 73 63 65 6e 64 65  all its descende
3df0: 6e 74 73 20 61 73 20 61 20 4a 53 4f 4e 20 73 74  nts as a JSON st
3e00: 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ring..*/.static 
3e10: 76 6f 69 64 20 6a 73 6f 6e 52 65 74 75 72 6e 4a  void jsonReturnJ
3e20: 73 6f 6e 28 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20  son(.  JsonNode 
3e30: 2a 70 4e 6f 64 65 2c 20 20 20 20 20 20 20 20 20  *pNode,         
3e40: 20 20 20 2f 2a 20 4e 6f 64 65 20 74 6f 20 72 65     /* Node to re
3e50: 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  turn */.  sqlite
3e60: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
3e70: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
3e80: 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 66  value for this f
3e90: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  unction */.  sql
3ea0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 52 65  ite3_value **aRe
3eb0: 70 6c 61 63 65 20 20 20 20 2f 2a 20 41 72 72 61  place    /* Arra
3ec0: 79 20 6f 66 20 72 65 70 6c 61 63 65 6d 65 6e 74  y of replacement
3ed0: 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20   values */.){.  
3ee0: 4a 73 6f 6e 53 74 72 69 6e 67 20 73 3b 0a 20 20  JsonString s;.  
3ef0: 6a 73 6f 6e 49 6e 69 74 28 26 73 2c 20 70 43 74  jsonInit(&s, pCt
3f00: 78 29 3b 0a 20 20 6a 73 6f 6e 52 65 6e 64 65 72  x);.  jsonRender
3f10: 4e 6f 64 65 28 70 4e 6f 64 65 2c 20 26 73 2c 20  Node(pNode, &s, 
3f20: 61 52 65 70 6c 61 63 65 29 3b 0a 20 20 6a 73 6f  aReplace);.  jso
3f30: 6e 52 65 73 75 6c 74 28 26 73 29 3b 0a 20 20 73  nResult(&s);.  s
3f40: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 73 75  qlite3_result_su
3f50: 62 74 79 70 65 28 70 43 74 78 2c 20 4a 53 4f 4e  btype(pCtx, JSON
3f60: 5f 53 55 42 54 59 50 45 29 3b 0a 7d 0a 0a 2f 2a  _SUBTYPE);.}../*
3f70: 0a 2a 2a 20 4d 61 6b 65 20 74 68 65 20 4a 73 6f  .** Make the Jso
3f80: 6e 4e 6f 64 65 20 74 68 65 20 72 65 74 75 72 6e  nNode the return
3f90: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 66 75   value of the fu
3fa0: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
3fb0: 63 20 76 6f 69 64 20 6a 73 6f 6e 52 65 74 75 72  c void jsonRetur
3fc0: 6e 28 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70  n(.  JsonNode *p
3fd0: 4e 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20  Node,           
3fe0: 20 2f 2a 20 4e 6f 64 65 20 74 6f 20 72 65 74 75   /* Node to retu
3ff0: 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  rn */.  sqlite3_
4000: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20  context *pCtx,  
4010: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61      /* Return va
4020: 6c 75 65 20 66 6f 72 20 74 68 69 73 20 66 75 6e  lue for this fun
4030: 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  ction */.  sqlit
4040: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 52 65 70 6c  e3_value **aRepl
4050: 61 63 65 20 20 20 20 2f 2a 20 41 72 72 61 79 20  ace    /* Array 
4060: 6f 66 20 72 65 70 6c 61 63 65 6d 65 6e 74 20 76  of replacement v
4070: 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 73 77  alues */.){.  sw
4080: 69 74 63 68 28 20 70 4e 6f 64 65 2d 3e 65 54 79  itch( pNode->eTy
4090: 70 65 20 29 7b 0a 20 20 20 20 64 65 66 61 75 6c  pe ){.    defaul
40a0: 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
40b0: 74 28 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65 3d  t( pNode->eType=
40c0: 3d 4a 53 4f 4e 5f 4e 55 4c 4c 20 29 3b 0a 20 20  =JSON_NULL );.  
40d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
40e0: 6c 74 5f 6e 75 6c 6c 28 70 43 74 78 29 3b 0a 20  lt_null(pCtx);. 
40f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4100: 7d 0a 20 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f  }.    case JSON_
4110: 54 52 55 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  TRUE: {.      sq
4120: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
4130: 28 70 43 74 78 2c 20 31 29 3b 0a 20 20 20 20 20  (pCtx, 1);.     
4140: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4150: 20 20 63 61 73 65 20 4a 53 4f 4e 5f 46 41 4c 53    case JSON_FALS
4160: 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
4170: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 70 43  e3_result_int(pC
4180: 74 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  tx, 0);.      br
4190: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
41a0: 61 73 65 20 4a 53 4f 4e 5f 49 4e 54 3a 20 7b 0a  ase JSON_INT: {.
41b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
41c0: 74 36 34 20 69 20 3d 20 30 3b 0a 20 20 20 20 20  t64 i = 0;.     
41d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
41e0: 20 70 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74   pNode->u.zJCont
41f0: 65 6e 74 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  ent;.      if( z
4200: 5b 30 5d 3d 3d 27 2d 27 20 29 7b 20 7a 2b 2b 3b  [0]=='-' ){ z++;
4210: 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20   }.      while( 
4220: 7a 5b 30 5d 3e 3d 27 30 27 20 26 26 20 7a 5b 30  z[0]>='0' && z[0
4230: 5d 3c 3d 27 39 27 20 29 7b 0a 20 20 20 20 20 20  ]<='9' ){.      
4240: 20 20 75 6e 73 69 67 6e 65 64 20 76 20 3d 20 2a    unsigned v = *
4250: 28 7a 2b 2b 29 20 2d 20 27 30 27 3b 0a 20 20 20  (z++) - '0';.   
4260: 20 20 20 20 20 69 66 28 20 69 3e 3d 4c 41 52 47       if( i>=LARG
4270: 45 53 54 5f 49 4e 54 36 34 2f 31 30 20 29 7b 0a  EST_INT64/10 ){.
4280: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
4290: 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 2f 31 30  LARGEST_INT64/10
42a0: 20 29 20 67 6f 74 6f 20 69 6e 74 5f 61 73 5f 72   ) goto int_as_r
42b0: 65 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 69  eal;.          i
42c0: 66 28 20 7a 5b 30 5d 3e 3d 27 30 27 20 26 26 20  f( z[0]>='0' && 
42d0: 7a 5b 30 5d 3c 3d 27 39 27 20 29 20 67 6f 74 6f  z[0]<='9' ) goto
42e0: 20 69 6e 74 5f 61 73 5f 72 65 61 6c 3b 0a 20 20   int_as_real;.  
42f0: 20 20 20 20 20 20 20 20 69 66 28 20 76 3d 3d 39          if( v==9
4300: 20 29 20 67 6f 74 6f 20 69 6e 74 5f 61 73 5f 72   ) goto int_as_r
4310: 65 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 69  eal;.          i
4320: 66 28 20 76 3d 3d 38 20 29 7b 0a 20 20 20 20 20  f( v==8 ){.     
4330: 20 20 20 20 20 20 20 69 66 28 20 70 4e 6f 64 65         if( pNode
4340: 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 5b 30 5d  ->u.zJContent[0]
4350: 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20  =='-' ){.       
4360: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
4370: 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74 78  esult_int64(pCtx
4380: 2c 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34  , SMALLEST_INT64
4390: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
43a0: 20 67 6f 74 6f 20 69 6e 74 5f 64 6f 6e 65 3b 0a   goto int_done;.
43b0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
43c0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
43d0: 20 67 6f 74 6f 20 69 6e 74 5f 61 73 5f 72 65 61   goto int_as_rea
43e0: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  l;.            }
43f0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
4400: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
4410: 20 3d 20 69 2a 31 30 20 2b 20 76 3b 0a 20 20 20   = i*10 + v;.   
4420: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
4430: 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e  Node->u.zJConten
4440: 74 5b 30 5d 3d 3d 27 2d 27 20 29 7b 20 69 20 3d  t[0]=='-' ){ i =
4450: 20 2d 69 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c   -i; }.      sql
4460: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
4470: 34 28 70 43 74 78 2c 20 69 29 3b 0a 20 20 20 20  4(pCtx, i);.    
4480: 20 20 69 6e 74 5f 64 6f 6e 65 3a 0a 20 20 20 20    int_done:.    
4490: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69    break;.      i
44a0: 6e 74 5f 61 73 5f 72 65 61 6c 3a 20 2f 2a 20 66  nt_as_real: /* f
44b0: 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 72  all through to r
44c0: 65 61 6c 20 2a 2f 3b 0a 20 20 20 20 7d 0a 20 20  eal */;.    }.  
44d0: 20 20 63 61 73 65 20 4a 53 4f 4e 5f 52 45 41 4c    case JSON_REAL
44e0: 3a 20 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65  : {.      double
44f0: 20 72 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   r;.#ifdef SQLIT
4500: 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a 20  E_AMALGAMATION. 
4510: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
4520: 2a 7a 20 3d 20 70 4e 6f 64 65 2d 3e 75 2e 7a 4a  *z = pNode->u.zJ
4530: 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20 73  Content;.      s
4540: 71 6c 69 74 65 33 41 74 6f 46 28 7a 2c 20 26 72  qlite3AtoF(z, &r
4550: 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  , sqlite3Strlen3
4560: 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54 46  0(z), SQLITE_UTF
4570: 38 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  8);.#else.      
4580: 72 20 3d 20 73 74 72 74 6f 64 28 70 4e 6f 64 65  r = strtod(pNode
4590: 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 2c 20 30  ->u.zJContent, 0
45a0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
45b0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64  sqlite3_result_d
45c0: 6f 75 62 6c 65 28 70 43 74 78 2c 20 72 29 3b 0a  ouble(pCtx, r);.
45d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
45e0: 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 53 4f 4e   }.    case JSON
45f0: 5f 53 54 52 49 4e 47 3a 20 7b 0a 23 69 66 20 30  _STRING: {.#if 0
4600: 20 2f 2a 20 4e 65 76 65 72 20 68 61 70 70 65 6e   /* Never happen
4610: 73 20 62 65 63 61 75 73 65 20 4a 4e 4f 44 45 5f  s because JNODE_
4620: 52 41 57 20 69 73 20 6f 6e 6c 79 20 73 65 74 20  RAW is only set 
4630: 62 79 20 6a 73 6f 6e 5f 73 65 74 28 29 2c 0a 20  by json_set(),. 
4640: 20 20 20 20 20 2a 2a 20 6a 73 6f 6e 5f 69 6e 73       ** json_ins
4650: 65 72 74 28 29 20 61 6e 64 20 6a 73 6f 6e 5f 72  ert() and json_r
4660: 65 70 6c 61 63 65 28 29 20 61 6e 64 20 74 68 6f  eplace() and tho
4670: 73 65 20 72 6f 75 74 69 6e 65 73 20 64 6f 20 6e  se routines do n
4680: 6f 74 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c  ot.      ** call
4690: 20 6a 73 6f 6e 52 65 74 75 72 6e 28 29 20 2a 2f   jsonReturn() */
46a0: 0a 20 20 20 20 20 20 69 66 28 20 70 4e 6f 64 65  .      if( pNode
46b0: 2d 3e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44  ->jnFlags & JNOD
46c0: 45 5f 52 41 57 20 29 7b 0a 20 20 20 20 20 20 20  E_RAW ){.       
46d0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
46e0: 74 65 78 74 28 70 43 74 78 2c 20 70 4e 6f 64 65  text(pCtx, pNode
46f0: 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 2c 20 70  ->u.zJContent, p
4700: 4e 6f 64 65 2d 3e 6e 2c 0a 20 20 20 20 20 20 20  Node->n,.       
4710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4720: 20 20 20 20 20 53 51 4c 49 54 45 5f 54 52 41 4e       SQLITE_TRAN
4730: 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 65  SIENT);.      }e
4740: 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20 20 20 20  lse .#endif.    
4750: 20 20 61 73 73 65 72 74 28 20 28 70 4e 6f 64 65    assert( (pNode
4760: 2d 3e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44  ->jnFlags & JNOD
4770: 45 5f 52 41 57 29 3d 3d 30 20 29 3b 0a 20 20 20  E_RAW)==0 );.   
4780: 20 20 20 69 66 28 20 28 70 4e 6f 64 65 2d 3e 6a     if( (pNode->j
4790: 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 45  nFlags & JNODE_E
47a0: 53 43 41 50 45 29 3d 3d 30 20 29 7b 0a 20 20 20  SCAPE)==0 ){.   
47b0: 20 20 20 20 20 2f 2a 20 4a 53 4f 4e 20 66 6f 72       /* JSON for
47c0: 6d 61 74 74 65 64 20 77 69 74 68 6f 75 74 20 61  matted without a
47d0: 6e 79 20 62 61 63 6b 73 6c 61 73 68 2d 65 73 63  ny backslash-esc
47e0: 61 70 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  apes */.        
47f0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
4800: 65 78 74 28 70 43 74 78 2c 20 70 4e 6f 64 65 2d  ext(pCtx, pNode-
4810: 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 2b 31 2c 20  >u.zJContent+1, 
4820: 70 4e 6f 64 65 2d 3e 6e 2d 32 2c 0a 20 20 20 20  pNode->n-2,.    
4830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4840: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54          SQLITE_T
4850: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20  RANSIENT);.     
4860: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
4870: 2f 2a 20 54 72 61 6e 73 6c 61 74 65 20 4a 53 4f  /* Translate JSO
4880: 4e 20 66 6f 72 6d 61 74 74 65 64 20 73 74 72 69  N formatted stri
4890: 6e 67 20 69 6e 74 6f 20 72 61 77 20 74 65 78 74  ng into raw text
48a0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20   */.        u32 
48b0: 69 3b 0a 20 20 20 20 20 20 20 20 75 33 32 20 6e  i;.        u32 n
48c0: 20 3d 20 70 4e 6f 64 65 2d 3e 6e 3b 0a 20 20 20   = pNode->n;.   
48d0: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
48e0: 2a 7a 20 3d 20 70 4e 6f 64 65 2d 3e 75 2e 7a 4a  *z = pNode->u.zJ
48f0: 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20 20  Content;.       
4900: 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 20 20 20   char *zOut;.   
4910: 20 20 20 20 20 75 33 32 20 6a 3b 0a 20 20 20 20       u32 j;.    
4920: 20 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74      zOut = sqlit
4930: 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 2b 31 20 29  e3_malloc( n+1 )
4940: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4f  ;.        if( zO
4950: 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ut==0 ){.       
4960: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
4970: 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43  t_error_nomem(pC
4980: 74 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  tx);.          b
4990: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
49a0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 2c          for(i=1,
49b0: 20 6a 3d 30 3b 20 69 3c 6e 2d 31 3b 20 69 2b 2b   j=0; i<n-1; i++
49c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  ){.          cha
49d0: 72 20 63 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20  r c = z[i];.    
49e0: 20 20 20 20 20 20 69 66 28 20 63 21 3d 27 5c 5c        if( c!='\\
49f0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ' ){.           
4a00: 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a   zOut[j++] = c;.
4a10: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
4a20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 20 3d  .            c =
4a30: 20 7a 5b 2b 2b 69 5d 3b 0a 20 20 20 20 20 20 20   z[++i];.       
4a40: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 75 27 20       if( c=='u' 
4a50: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
4a60: 20 75 33 32 20 76 20 3d 20 30 2c 20 6b 3b 0a 20   u32 v = 0, k;. 
4a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
4a80: 28 6b 3d 30 3b 20 6b 3c 34 3b 20 69 2b 2b 2c 20  (k=0; k<4; i++, 
4a90: 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  k++){.          
4aa0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3c        assert( i<
4ab0: 6e 2d 32 20 29 3b 0a 20 20 20 20 20 20 20 20 20  n-2 );.         
4ac0: 20 20 20 20 20 20 20 63 20 3d 20 7a 5b 69 2b 31         c = z[i+1
4ad0: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
4ae0: 20 20 20 61 73 73 65 72 74 28 20 73 61 66 65 5f     assert( safe_
4af0: 69 73 78 64 69 67 69 74 28 63 29 20 29 3b 0a 20  isxdigit(c) );. 
4b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
4b10: 66 28 20 63 3c 3d 27 39 27 20 29 20 76 20 3d 20  f( c<='9' ) v = 
4b20: 76 2a 31 36 20 2b 20 63 20 2d 20 27 30 27 3b 0a  v*16 + c - '0';.
4b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b40: 65 6c 73 65 20 69 66 28 20 63 3c 3d 27 46 27 20  else if( c<='F' 
4b50: 29 20 76 20 3d 20 76 2a 31 36 20 2b 20 63 20 2d  ) v = v*16 + c -
4b60: 20 27 41 27 20 2b 20 31 30 3b 0a 20 20 20 20 20   'A' + 10;.     
4b70: 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20             else 
4b80: 76 20 3d 20 76 2a 31 36 20 2b 20 63 20 2d 20 27  v = v*16 + c - '
4b90: 61 27 20 2b 20 31 30 3b 0a 20 20 20 20 20 20 20  a' + 10;.       
4ba0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4bb0: 20 20 20 20 20 20 20 69 66 28 20 76 3d 3d 30 20         if( v==0 
4bc0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
4bd0: 20 20 20 20 20 20 20 69 66 28 20 76 3c 3d 30 78         if( v<=0x
4be0: 37 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  7f ){.          
4bf0: 20 20 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20        zOut[j++] 
4c00: 3d 20 28 63 68 61 72 29 76 3b 0a 20 20 20 20 20  = (char)v;.     
4c10: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
4c20: 66 28 20 76 3c 3d 30 78 37 66 66 20 29 7b 0a 20  f( v<=0x7ff ){. 
4c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
4c40: 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 28 63 68 61 72  Out[j++] = (char
4c50: 29 28 30 78 63 30 20 7c 20 28 76 3e 3e 36 29 29  )(0xc0 | (v>>6))
4c60: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
4c70: 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 30 78    zOut[j++] = 0x
4c80: 38 30 20 7c 20 28 76 26 30 78 33 66 29 3b 0a 20  80 | (v&0x3f);. 
4c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c               }el
4ca0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
4cb0: 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20      zOut[j++] = 
4cc0: 28 63 68 61 72 29 28 30 78 65 30 20 7c 20 28 76  (char)(0xe0 | (v
4cd0: 3e 3e 31 32 29 29 3b 0a 20 20 20 20 20 20 20 20  >>12));.        
4ce0: 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b          zOut[j++
4cf0: 5d 20 3d 20 30 78 38 30 20 7c 20 28 28 76 3e 3e  ] = 0x80 | ((v>>
4d00: 36 29 26 30 78 33 66 29 3b 0a 20 20 20 20 20 20  6)&0x3f);.      
4d10: 20 20 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 6a            zOut[j
4d20: 2b 2b 5d 20 3d 20 30 78 38 30 20 7c 20 28 76 26  ++] = 0x80 | (v&
4d30: 30 78 33 66 29 3b 0a 20 20 20 20 20 20 20 20 20  0x3f);.         
4d40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
4d50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4d60: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
4d70: 62 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b' ){.          
4d80: 20 20 20 20 20 20 63 20 3d 20 27 5c 62 27 3b 0a        c = '\b';.
4d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65                }e
4da0: 6c 73 65 20 69 66 28 20 63 3d 3d 27 66 27 20 29  lse if( c=='f' )
4db0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
4dc0: 20 20 63 20 3d 20 27 5c 66 27 3b 0a 20 20 20 20    c = '\f';.    
4dd0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
4de0: 69 66 28 20 63 3d 3d 27 6e 27 20 29 7b 0a 20 20  if( c=='n' ){.  
4df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 20                c 
4e00: 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20  = '\n';.        
4e10: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
4e20: 63 3d 3d 27 72 27 20 29 7b 0a 20 20 20 20 20 20  c=='r' ){.      
4e30: 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c            c = '\
4e40: 72 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r';.            
4e50: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
4e60: 74 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t' ){.          
4e70: 20 20 20 20 20 20 63 20 3d 20 27 5c 74 27 3b 0a        c = '\t';.
4e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
4e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4f                zO
4ea0: 75 74 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20  ut[j++] = c;.   
4eb0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
4ec0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
4ed0: 0a 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 6a 5d  .        zOut[j]
4ee0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71   = 0;.        sq
4ef0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
4f00: 74 28 70 43 74 78 2c 20 7a 4f 75 74 2c 20 6a 2c  t(pCtx, zOut, j,
4f10: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a   sqlite3_free);.
4f20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
4f30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
4f40: 61 73 65 20 4a 53 4f 4e 5f 41 52 52 41 59 3a 0a  ase JSON_ARRAY:.
4f50: 20 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f 4f 42      case JSON_OB
4f60: 4a 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 6a 73  JECT: {.      js
4f70: 6f 6e 52 65 74 75 72 6e 4a 73 6f 6e 28 70 4e 6f  onReturnJson(pNo
4f80: 64 65 2c 20 70 43 74 78 2c 20 61 52 65 70 6c 61  de, pCtx, aRepla
4f90: 63 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ce);.      break
4fa0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
4fb0: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
4fc0: 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nce */.static in
4fd0: 74 20 6a 73 6f 6e 50 61 72 73 65 41 64 64 4e 6f  t jsonParseAddNo
4fe0: 64 65 28 4a 73 6f 6e 50 61 72 73 65 2a 2c 75 33  de(JsonParse*,u3
4ff0: 32 2c 75 33 32 2c 63 6f 6e 73 74 20 63 68 61 72  2,u32,const char
5000: 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d 61 63  *);../*.** A mac
5010: 72 6f 20 74 6f 20 68 69 6e 74 20 74 6f 20 74 68  ro to hint to th
5020: 65 20 63 6f 6d 70 69 6c 65 72 20 74 68 61 74 20  e compiler that 
5030: 61 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  a function shoul
5040: 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 69 6e 6c 69  d not be.** inli
5050: 6e 65 64 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  ned..*/.#if defi
5060: 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 0a 23 20  ned(__GNUC__).# 
5070: 20 64 65 66 69 6e 65 20 4a 53 4f 4e 5f 4e 4f 49   define JSON_NOI
5080: 4e 4c 49 4e 45 20 20 5f 5f 61 74 74 72 69 62 75  NLINE  __attribu
5090: 74 65 5f 5f 28 28 6e 6f 69 6e 6c 69 6e 65 29 29  te__((noinline))
50a0: 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 5f  .#elif defined(_
50b0: 4d 53 43 5f 56 45 52 29 20 26 26 20 5f 4d 53 43  MSC_VER) && _MSC
50c0: 5f 56 45 52 3e 3d 31 33 31 30 0a 23 20 20 64 65  _VER>=1310.#  de
50d0: 66 69 6e 65 20 4a 53 4f 4e 5f 4e 4f 49 4e 4c 49  fine JSON_NOINLI
50e0: 4e 45 20 20 5f 5f 64 65 63 6c 73 70 65 63 28 6e  NE  __declspec(n
50f0: 6f 69 6e 6c 69 6e 65 29 0a 23 65 6c 73 65 0a 23  oinline).#else.#
5100: 20 20 64 65 66 69 6e 65 20 4a 53 4f 4e 5f 4e 4f    define JSON_NO
5110: 49 4e 4c 49 4e 45 0a 23 65 6e 64 69 66 0a 0a 0a  INLINE.#endif...
5120: 73 74 61 74 69 63 20 4a 53 4f 4e 5f 4e 4f 49 4e  static JSON_NOIN
5130: 4c 49 4e 45 20 69 6e 74 20 6a 73 6f 6e 50 61 72  LINE int jsonPar
5140: 73 65 41 64 64 4e 6f 64 65 45 78 70 61 6e 64 28  seAddNodeExpand(
5150: 0a 20 20 4a 73 6f 6e 50 61 72 73 65 20 2a 70 50  .  JsonParse *pP
5160: 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
5170: 41 70 70 65 6e 64 20 74 68 65 20 6e 6f 64 65 20  Append the node 
5180: 74 6f 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a  to this object *
5190: 2f 0a 20 20 75 33 32 20 65 54 79 70 65 2c 20 20  /.  u32 eType,  
51a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
51b0: 20 4e 6f 64 65 20 74 79 70 65 20 2a 2f 0a 20 20   Node type */.  
51c0: 75 33 32 20 6e 2c 20 20 20 20 20 20 20 20 20 20  u32 n,          
51d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
51e0: 74 65 6e 74 20 73 69 7a 65 20 6f 72 20 73 75 62  tent size or sub
51f0: 2d 6e 6f 64 65 20 63 6f 75 6e 74 20 2a 2f 0a 20  -node count */. 
5200: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
5210: 6e 74 65 6e 74 20 20 20 20 20 20 2f 2a 20 43 6f  ntent      /* Co
5220: 6e 74 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 75 33  ntent */.){.  u3
5230: 32 20 6e 4e 65 77 3b 0a 20 20 4a 73 6f 6e 4e 6f  2 nNew;.  JsonNo
5240: 64 65 20 2a 70 4e 65 77 3b 0a 20 20 61 73 73 65  de *pNew;.  asse
5250: 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 4e 6f 64  rt( pParse->nNod
5260: 65 3e 3d 70 50 61 72 73 65 2d 3e 6e 41 6c 6c 6f  e>=pParse->nAllo
5270: 63 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  c );.  if( pPars
5280: 65 2d 3e 6f 6f 6d 20 29 20 72 65 74 75 72 6e 20  e->oom ) return 
5290: 2d 31 3b 0a 20 20 6e 4e 65 77 20 3d 20 70 50 61  -1;.  nNew = pPa
52a0: 72 73 65 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20  rse->nAlloc*2 + 
52b0: 31 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  10;.  pNew = sql
52c0: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70  ite3_realloc64(p
52d0: 50 61 72 73 65 2d 3e 61 4e 6f 64 65 2c 20 73 69  Parse->aNode, si
52e0: 7a 65 6f 66 28 4a 73 6f 6e 4e 6f 64 65 29 2a 6e  zeof(JsonNode)*n
52f0: 4e 65 77 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  New);.  if( pNew
5300: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 72 73  ==0 ){.    pPars
5310: 65 2d 3e 6f 6f 6d 20 3d 20 31 3b 0a 20 20 20 20  e->oom = 1;.    
5320: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20  return -1;.  }. 
5330: 20 70 50 61 72 73 65 2d 3e 6e 41 6c 6c 6f 63 20   pParse->nAlloc 
5340: 3d 20 6e 4e 65 77 3b 0a 20 20 70 50 61 72 73 65  = nNew;.  pParse
5350: 2d 3e 61 4e 6f 64 65 20 3d 20 70 4e 65 77 3b 0a  ->aNode = pNew;.
5360: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
5370: 2d 3e 6e 4e 6f 64 65 3c 70 50 61 72 73 65 2d 3e  ->nNode<pParse->
5380: 6e 41 6c 6c 6f 63 20 29 3b 0a 20 20 72 65 74 75  nAlloc );.  retu
5390: 72 6e 20 6a 73 6f 6e 50 61 72 73 65 41 64 64 4e  rn jsonParseAddN
53a0: 6f 64 65 28 70 50 61 72 73 65 2c 20 65 54 79 70  ode(pParse, eTyp
53b0: 65 2c 20 6e 2c 20 7a 43 6f 6e 74 65 6e 74 29 3b  e, n, zContent);
53c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
53d0: 20 61 20 6e 65 77 20 4a 73 6f 6e 4e 6f 64 65 20   a new JsonNode 
53e0: 69 6e 73 74 61 6e 63 65 20 62 61 73 65 64 20 6f  instance based o
53f0: 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20  n the arguments 
5400: 61 6e 64 20 61 70 70 65 6e 64 20 74 68 61 74 0a  and append that.
5410: 2a 2a 20 69 6e 73 74 61 6e 63 65 20 74 6f 20 74  ** instance to t
5420: 68 65 20 4a 73 6f 6e 50 61 72 73 65 2e 20 20 52  he JsonParse.  R
5430: 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
5440: 69 6e 20 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65  in pParse->aNode
5450: 5b 5d 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 65 77  [] of the.** new
5460: 20 6e 6f 64 65 2c 20 6f 72 20 2d 31 20 69 66 20   node, or -1 if 
5470: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
5480: 69 6f 6e 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  ion fails..*/.st
5490: 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e 50 61 72  atic int jsonPar
54a0: 73 65 41 64 64 4e 6f 64 65 28 0a 20 20 4a 73 6f  seAddNode(.  Jso
54b0: 6e 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  nParse *pParse, 
54c0: 20 20 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64         /* Append
54d0: 20 74 68 65 20 6e 6f 64 65 20 74 6f 20 74 68 69   the node to thi
54e0: 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 33  s object */.  u3
54f0: 32 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20  2 eType,        
5500: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 64 65 20          /* Node 
5510: 74 79 70 65 20 2a 2f 0a 20 20 75 33 32 20 6e 2c  type */.  u32 n,
5520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5530: 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 73      /* Content s
5540: 69 7a 65 20 6f 72 20 73 75 62 2d 6e 6f 64 65 20  ize or sub-node 
5550: 63 6f 75 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  count */.  const
5560: 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 6e 74 20   char *zContent 
5570: 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20       /* Content 
5580: 2a 2f 0a 29 7b 0a 20 20 4a 73 6f 6e 4e 6f 64 65  */.){.  JsonNode
5590: 20 2a 70 3b 0a 20 20 69 66 28 20 70 50 61 72 73   *p;.  if( pPars
55a0: 65 2d 3e 6e 4e 6f 64 65 3e 3d 70 50 61 72 73 65  e->nNode>=pParse
55b0: 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  ->nAlloc ){.    
55c0: 72 65 74 75 72 6e 20 6a 73 6f 6e 50 61 72 73 65  return jsonParse
55d0: 41 64 64 4e 6f 64 65 45 78 70 61 6e 64 28 70 50  AddNodeExpand(pP
55e0: 61 72 73 65 2c 20 65 54 79 70 65 2c 20 6e 2c 20  arse, eType, n, 
55f0: 7a 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 7d 0a 20  zContent);.  }. 
5600: 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 4e   p = &pParse->aN
5610: 6f 64 65 5b 70 50 61 72 73 65 2d 3e 6e 4e 6f 64  ode[pParse->nNod
5620: 65 5d 3b 0a 20 20 70 2d 3e 65 54 79 70 65 20 3d  e];.  p->eType =
5630: 20 28 75 38 29 65 54 79 70 65 3b 0a 20 20 70 2d   (u8)eType;.  p-
5640: 3e 6a 6e 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20  >jnFlags = 0;.  
5650: 70 2d 3e 6e 20 3d 20 6e 3b 0a 20 20 70 2d 3e 75  p->n = n;.  p->u
5660: 2e 7a 4a 43 6f 6e 74 65 6e 74 20 3d 20 7a 43 6f  .zJContent = zCo
5670: 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20  ntent;.  return 
5680: 70 50 61 72 73 65 2d 3e 6e 4e 6f 64 65 2b 2b 3b  pParse->nNode++;
5690: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
56a0: 20 74 72 75 65 20 69 66 20 7a 5b 5d 20 62 65 67   true if z[] beg
56b0: 69 6e 73 20 77 69 74 68 20 34 20 28 6f 72 20 6d  ins with 4 (or m
56c0: 6f 72 65 29 20 68 65 78 61 64 65 63 69 6d 61 6c  ore) hexadecimal
56d0: 20 64 69 67 69 74 73 0a 2a 2f 0a 73 74 61 74 69   digits.*/.stati
56e0: 63 20 69 6e 74 20 6a 73 6f 6e 49 73 34 48 65 78  c int jsonIs4Hex
56f0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
5700: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
5710: 69 3d 30 3b 20 69 3c 34 3b 20 69 2b 2b 29 20 69  i=0; i<4; i++) i
5720: 66 28 20 21 73 61 66 65 5f 69 73 78 64 69 67 69  f( !safe_isxdigi
5730: 74 28 7a 5b 69 5d 29 20 29 20 72 65 74 75 72 6e  t(z[i]) ) return
5740: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   0;.  return 1;.
5750: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61  }../*.** Parse a
5760: 20 73 69 6e 67 6c 65 20 4a 53 4f 4e 20 76 61 6c   single JSON val
5770: 75 65 20 77 68 69 63 68 20 62 65 67 69 6e 73 20  ue which begins 
5780: 61 74 20 70 50 61 72 73 65 2d 3e 7a 4a 73 6f 6e  at pParse->zJson
5790: 5b 69 5d 2e 20 20 52 65 74 75 72 6e 20 74 68 65  [i].  Return the
57a0: 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65  .** index of the
57b0: 20 66 69 72 73 74 20 63 68 61 72 61 63 74 65 72   first character
57c0: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
57d0: 20 74 68 65 20 76 61 6c 75 65 20 70 61 72 73 65   the value parse
57e0: 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
57f0: 6e 65 67 61 74 69 76 65 20 66 6f 72 20 61 20 73  negative for a s
5800: 79 6e 74 61 78 20 65 72 72 6f 72 2e 20 20 53 70  yntax error.  Sp
5810: 65 63 69 61 6c 20 63 61 73 65 73 3a 20 20 72 65  ecial cases:  re
5820: 74 75 72 6e 20 2d 32 20 69 66 20 74 68 65 0a 2a  turn -2 if the.*
5830: 2a 20 66 69 72 73 74 20 6e 6f 6e 2d 77 68 69 74  * first non-whit
5840: 65 73 70 61 63 65 20 63 68 61 72 61 63 74 65 72  espace character
5850: 20 69 73 20 27 7d 27 20 61 6e 64 20 72 65 74 75   is '}' and retu
5860: 72 6e 20 2d 33 20 69 66 20 74 68 65 20 66 69 72  rn -3 if the fir
5870: 73 74 0a 2a 2a 20 6e 6f 6e 2d 77 68 69 74 65 73  st.** non-whites
5880: 70 61 63 65 20 63 68 61 72 61 63 74 65 72 20 69  pace character i
5890: 73 20 27 5d 27 2e 0a 2a 2f 0a 73 74 61 74 69 63  s ']'..*/.static
58a0: 20 69 6e 74 20 6a 73 6f 6e 50 61 72 73 65 56 61   int jsonParseVa
58b0: 6c 75 65 28 4a 73 6f 6e 50 61 72 73 65 20 2a 70  lue(JsonParse *p
58c0: 50 61 72 73 65 2c 20 75 33 32 20 69 29 7b 0a 20  Parse, u32 i){. 
58d0: 20 63 68 61 72 20 63 3b 0a 20 20 75 33 32 20 6a   char c;.  u32 j
58e0: 3b 0a 20 20 69 6e 74 20 69 54 68 69 73 3b 0a 20  ;.  int iThis;. 
58f0: 20 69 6e 74 20 78 3b 0a 20 20 4a 73 6f 6e 4e 6f   int x;.  JsonNo
5900: 64 65 20 2a 70 4e 6f 64 65 3b 0a 20 20 63 6f 6e  de *pNode;.  con
5910: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 50 61  st char *z = pPa
5920: 72 73 65 2d 3e 7a 4a 73 6f 6e 3b 0a 20 20 77 68  rse->zJson;.  wh
5930: 69 6c 65 28 20 73 61 66 65 5f 69 73 73 70 61 63  ile( safe_isspac
5940: 65 28 7a 5b 69 5d 29 20 29 7b 20 69 2b 2b 3b 20  e(z[i]) ){ i++; 
5950: 7d 0a 20 20 69 66 28 20 28 63 20 3d 20 7a 5b 69  }.  if( (c = z[i
5960: 5d 29 3d 3d 27 7b 27 20 29 7b 0a 20 20 20 20 2f  ])=='{' ){.    /
5970: 2a 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 2a  * Parse object *
5980: 2f 0a 20 20 20 20 69 54 68 69 73 20 3d 20 6a 73  /.    iThis = js
5990: 6f 6e 50 61 72 73 65 41 64 64 4e 6f 64 65 28 70  onParseAddNode(p
59a0: 50 61 72 73 65 2c 20 4a 53 4f 4e 5f 4f 42 4a 45  Parse, JSON_OBJE
59b0: 43 54 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  CT, 0, 0);.    i
59c0: 66 28 20 69 54 68 69 73 3c 30 20 29 20 72 65 74  f( iThis<0 ) ret
59d0: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 66 6f 72 28  urn -1;.    for(
59e0: 6a 3d 69 2b 31 3b 3b 6a 2b 2b 29 7b 0a 20 20 20  j=i+1;;j++){.   
59f0: 20 20 20 77 68 69 6c 65 28 20 73 61 66 65 5f 69     while( safe_i
5a00: 73 73 70 61 63 65 28 7a 5b 6a 5d 29 20 29 7b 20  sspace(z[j]) ){ 
5a10: 6a 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 69 66 28  j++; }.      if(
5a20: 20 2b 2b 70 50 61 72 73 65 2d 3e 69 44 65 70 74   ++pParse->iDept
5a30: 68 20 3e 20 4a 53 4f 4e 5f 4d 41 58 5f 44 45 50  h > JSON_MAX_DEP
5a40: 54 48 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  TH ) return -1;.
5a50: 20 20 20 20 20 20 78 20 3d 20 6a 73 6f 6e 50 61        x = jsonPa
5a60: 72 73 65 56 61 6c 75 65 28 70 50 61 72 73 65 2c  rseValue(pParse,
5a70: 20 6a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 78   j);.      if( x
5a80: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  <0 ){.        pP
5a90: 61 72 73 65 2d 3e 69 44 65 70 74 68 2d 2d 3b 0a  arse->iDepth--;.
5aa0: 20 20 20 20 20 20 20 20 69 66 28 20 78 3d 3d 28          if( x==(
5ab0: 2d 32 29 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  -2) && pParse->n
5ac0: 4e 6f 64 65 3d 3d 28 75 33 32 29 69 54 68 69 73  Node==(u32)iThis
5ad0: 2b 31 20 29 20 72 65 74 75 72 6e 20 6a 2b 31 3b  +1 ) return j+1;
5ae0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
5af0: 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
5b00: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6f 6f    if( pParse->oo
5b10: 6d 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  m ) return -1;. 
5b20: 20 20 20 20 20 70 4e 6f 64 65 20 3d 20 26 70 50       pNode = &pP
5b30: 61 72 73 65 2d 3e 61 4e 6f 64 65 5b 70 50 61 72  arse->aNode[pPar
5b40: 73 65 2d 3e 6e 4e 6f 64 65 2d 31 5d 3b 0a 20 20  se->nNode-1];.  
5b50: 20 20 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 65      if( pNode->e
5b60: 54 79 70 65 21 3d 4a 53 4f 4e 5f 53 54 52 49 4e  Type!=JSON_STRIN
5b70: 47 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  G ) return -1;. 
5b80: 20 20 20 20 20 70 4e 6f 64 65 2d 3e 6a 6e 46 6c       pNode->jnFl
5b90: 61 67 73 20 7c 3d 20 4a 4e 4f 44 45 5f 4c 41 42  ags |= JNODE_LAB
5ba0: 45 4c 3b 0a 20 20 20 20 20 20 6a 20 3d 20 78 3b  EL;.      j = x;
5bb0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 73 61  .      while( sa
5bc0: 66 65 5f 69 73 73 70 61 63 65 28 7a 5b 6a 5d 29  fe_isspace(z[j])
5bd0: 20 29 7b 20 6a 2b 2b 3b 20 7d 0a 20 20 20 20 20   ){ j++; }.     
5be0: 20 69 66 28 20 7a 5b 6a 5d 21 3d 27 3a 27 20 29   if( z[j]!=':' )
5bf0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
5c00: 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 78 20 3d    j++;.      x =
5c10: 20 6a 73 6f 6e 50 61 72 73 65 56 61 6c 75 65 28   jsonParseValue(
5c20: 70 50 61 72 73 65 2c 20 6a 29 3b 0a 20 20 20 20  pParse, j);.    
5c30: 20 20 70 50 61 72 73 65 2d 3e 69 44 65 70 74 68    pParse->iDepth
5c40: 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3c  --;.      if( x<
5c50: 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  0 ) return -1;. 
5c60: 20 20 20 20 20 6a 20 3d 20 78 3b 0a 20 20 20 20       j = x;.    
5c70: 20 20 77 68 69 6c 65 28 20 73 61 66 65 5f 69 73    while( safe_is
5c80: 73 70 61 63 65 28 7a 5b 6a 5d 29 20 29 7b 20 6a  space(z[j]) ){ j
5c90: 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 63 20 3d 20  ++; }.      c = 
5ca0: 7a 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  z[j];.      if( 
5cb0: 63 3d 3d 27 2c 27 20 29 20 63 6f 6e 74 69 6e 75  c==',' ) continu
5cc0: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 63 21 3d  e;.      if( c!=
5cd0: 27 7d 27 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  '}' ) return -1;
5ce0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5cf0: 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
5d00: 61 4e 6f 64 65 5b 69 54 68 69 73 5d 2e 6e 20 3d  aNode[iThis].n =
5d10: 20 70 50 61 72 73 65 2d 3e 6e 4e 6f 64 65 20 2d   pParse->nNode -
5d20: 20 28 75 33 32 29 69 54 68 69 73 20 2d 20 31 3b   (u32)iThis - 1;
5d30: 0a 20 20 20 20 72 65 74 75 72 6e 20 6a 2b 31 3b  .    return j+1;
5d40: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d  .  }else if( c==
5d50: 27 5b 27 20 29 7b 0a 20 20 20 20 2f 2a 20 50 61  '[' ){.    /* Pa
5d60: 72 73 65 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  rse array */.   
5d70: 20 69 54 68 69 73 20 3d 20 6a 73 6f 6e 50 61 72   iThis = jsonPar
5d80: 73 65 41 64 64 4e 6f 64 65 28 70 50 61 72 73 65  seAddNode(pParse
5d90: 2c 20 4a 53 4f 4e 5f 41 52 52 41 59 2c 20 30 2c  , JSON_ARRAY, 0,
5da0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 69 54 68   0);.    if( iTh
5db0: 69 73 3c 30 20 29 20 72 65 74 75 72 6e 20 2d 31  is<0 ) return -1
5dc0: 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b  ;.    for(j=i+1;
5dd0: 3b 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 69  ;j++){.      whi
5de0: 6c 65 28 20 73 61 66 65 5f 69 73 73 70 61 63 65  le( safe_isspace
5df0: 28 7a 5b 6a 5d 29 20 29 7b 20 6a 2b 2b 3b 20 7d  (z[j]) ){ j++; }
5e00: 0a 20 20 20 20 20 20 69 66 28 20 2b 2b 70 50 61  .      if( ++pPa
5e10: 72 73 65 2d 3e 69 44 65 70 74 68 20 3e 20 4a 53  rse->iDepth > JS
5e20: 4f 4e 5f 4d 41 58 5f 44 45 50 54 48 20 29 20 72  ON_MAX_DEPTH ) r
5e30: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
5e40: 78 20 3d 20 6a 73 6f 6e 50 61 72 73 65 56 61 6c  x = jsonParseVal
5e50: 75 65 28 70 50 61 72 73 65 2c 20 6a 29 3b 0a 20  ue(pParse, j);. 
5e60: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 69 44 65       pParse->iDe
5e70: 70 74 68 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28  pth--;.      if(
5e80: 20 78 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20   x<0 ){.        
5e90: 69 66 28 20 78 3d 3d 28 2d 33 29 20 26 26 20 70  if( x==(-3) && p
5ea0: 50 61 72 73 65 2d 3e 6e 4e 6f 64 65 3d 3d 28 75  Parse->nNode==(u
5eb0: 33 32 29 69 54 68 69 73 2b 31 20 29 20 72 65 74  32)iThis+1 ) ret
5ec0: 75 72 6e 20 6a 2b 31 3b 0a 20 20 20 20 20 20 20  urn j+1;.       
5ed0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
5ee0: 20 20 7d 0a 20 20 20 20 20 20 6a 20 3d 20 78 3b    }.      j = x;
5ef0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 73 61  .      while( sa
5f00: 66 65 5f 69 73 73 70 61 63 65 28 7a 5b 6a 5d 29  fe_isspace(z[j])
5f10: 20 29 7b 20 6a 2b 2b 3b 20 7d 0a 20 20 20 20 20   ){ j++; }.     
5f20: 20 63 20 3d 20 7a 5b 6a 5d 3b 0a 20 20 20 20 20   c = z[j];.     
5f30: 20 69 66 28 20 63 3d 3d 27 2c 27 20 29 20 63 6f   if( c==',' ) co
5f40: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
5f50: 28 20 63 21 3d 27 5d 27 20 29 20 72 65 74 75 72  ( c!=']' ) retur
5f60: 6e 20 2d 31 3b 0a 20 20 20 20 20 20 62 72 65 61  n -1;.      brea
5f70: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  k;.    }.    pPa
5f80: 72 73 65 2d 3e 61 4e 6f 64 65 5b 69 54 68 69 73  rse->aNode[iThis
5f90: 5d 2e 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4e  ].n = pParse->nN
5fa0: 6f 64 65 20 2d 20 28 75 33 32 29 69 54 68 69 73  ode - (u32)iThis
5fb0: 20 2d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   - 1;.    return
5fc0: 20 6a 2b 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66   j+1;.  }else if
5fd0: 28 20 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20  ( c=='"' ){.    
5fe0: 2f 2a 20 50 61 72 73 65 20 73 74 72 69 6e 67 20  /* Parse string 
5ff0: 2a 2f 0a 20 20 20 20 75 38 20 6a 6e 46 6c 61 67  */.    u8 jnFlag
6000: 73 20 3d 20 30 3b 0a 20 20 20 20 6a 20 3d 20 69  s = 0;.    j = i
6010: 2b 31 3b 0a 20 20 20 20 66 6f 72 28 3b 3b 29 7b  +1;.    for(;;){
6020: 0a 20 20 20 20 20 20 63 20 3d 20 7a 5b 6a 5d 3b  .      c = z[j];
6030: 0a 20 20 20 20 20 20 69 66 28 20 28 63 20 26 20  .      if( (c & 
6040: 7e 30 78 31 66 29 3d 3d 30 20 29 7b 0a 20 20 20  ~0x1f)==0 ){.   
6050: 20 20 20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20       /* Control 
6060: 63 68 61 72 61 63 74 65 72 73 20 61 72 65 20 6e  characters are n
6070: 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 73 74  ot allowed in st
6080: 72 69 6e 67 73 20 2a 2f 0a 20 20 20 20 20 20 20  rings */.       
6090: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
60a0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d    }.      if( c=
60b0: 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 20  ='\\' ){.       
60c0: 20 63 20 3d 20 7a 5b 2b 2b 6a 5d 3b 0a 20 20 20   c = z[++j];.   
60d0: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 22 27 20       if( c=='"' 
60e0: 7c 7c 20 63 3d 3d 27 5c 5c 27 20 7c 7c 20 63 3d  || c=='\\' || c=
60f0: 3d 27 2f 27 20 7c 7c 20 63 3d 3d 27 62 27 20 7c  ='/' || c=='b' |
6100: 7c 20 63 3d 3d 27 66 27 0a 20 20 20 20 20 20 20  | c=='f'.       
6110: 20 20 20 20 7c 7c 20 63 3d 3d 27 6e 27 20 7c 7c      || c=='n' ||
6120: 20 63 3d 3d 27 72 27 20 7c 7c 20 63 3d 3d 27 74   c=='r' || c=='t
6130: 27 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  '.           || 
6140: 28 63 3d 3d 27 75 27 20 26 26 20 6a 73 6f 6e 49  (c=='u' && jsonI
6150: 73 34 48 65 78 28 7a 2b 6a 2b 31 29 29 20 29 7b  s4Hex(z+j+1)) ){
6160: 0a 20 20 20 20 20 20 20 20 20 20 6a 6e 46 6c 61  .          jnFla
6170: 67 73 20 3d 20 4a 4e 4f 44 45 5f 45 53 43 41 50  gs = JNODE_ESCAP
6180: 45 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  E;.        }else
6190: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
61a0: 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d  rn -1;.        }
61b0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
61c0: 20 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20   c=='"' ){.     
61d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
61e0: 7d 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20  }.      j++;.   
61f0: 20 7d 0a 20 20 20 20 6a 73 6f 6e 50 61 72 73 65   }.    jsonParse
6200: 41 64 64 4e 6f 64 65 28 70 50 61 72 73 65 2c 20  AddNode(pParse, 
6210: 4a 53 4f 4e 5f 53 54 52 49 4e 47 2c 20 6a 2b 31  JSON_STRING, j+1
6220: 2d 69 2c 20 26 7a 5b 69 5d 29 3b 0a 20 20 20 20  -i, &z[i]);.    
6230: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6f 6f 6d  if( !pParse->oom
6240: 20 29 20 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65   ) pParse->aNode
6250: 5b 70 50 61 72 73 65 2d 3e 6e 4e 6f 64 65 2d 31  [pParse->nNode-1
6260: 5d 2e 6a 6e 46 6c 61 67 73 20 3d 20 6a 6e 46 6c  ].jnFlags = jnFl
6270: 61 67 73 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ags;.    return 
6280: 6a 2b 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  j+1;.  }else if(
6290: 20 63 3d 3d 27 6e 27 0a 20 20 20 20 20 20 20 20   c=='n'.        
62a0: 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 2b 69 2c   && strncmp(z+i,
62b0: 22 6e 75 6c 6c 22 2c 34 29 3d 3d 30 0a 20 20 20  "null",4)==0.   
62c0: 20 20 20 20 20 20 26 26 20 21 73 61 66 65 5f 69        && !safe_i
62d0: 73 61 6c 6e 75 6d 28 7a 5b 69 2b 34 5d 29 20 29  salnum(z[i+4]) )
62e0: 7b 0a 20 20 20 20 6a 73 6f 6e 50 61 72 73 65 41  {.    jsonParseA
62f0: 64 64 4e 6f 64 65 28 70 50 61 72 73 65 2c 20 4a  ddNode(pParse, J
6300: 53 4f 4e 5f 4e 55 4c 4c 2c 20 30 2c 20 30 29 3b  SON_NULL, 0, 0);
6310: 0a 20 20 20 20 72 65 74 75 72 6e 20 69 2b 34 3b  .    return i+4;
6320: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d  .  }else if( c==
6330: 27 74 27 0a 20 20 20 20 20 20 20 20 20 26 26 20  't'.         && 
6340: 73 74 72 6e 63 6d 70 28 7a 2b 69 2c 22 74 72 75  strncmp(z+i,"tru
6350: 65 22 2c 34 29 3d 3d 30 0a 20 20 20 20 20 20 20  e",4)==0.       
6360: 20 20 26 26 20 21 73 61 66 65 5f 69 73 61 6c 6e    && !safe_isaln
6370: 75 6d 28 7a 5b 69 2b 34 5d 29 20 29 7b 0a 20 20  um(z[i+4]) ){.  
6380: 20 20 6a 73 6f 6e 50 61 72 73 65 41 64 64 4e 6f    jsonParseAddNo
6390: 64 65 28 70 50 61 72 73 65 2c 20 4a 53 4f 4e 5f  de(pParse, JSON_
63a0: 54 52 55 45 2c 20 30 2c 20 30 29 3b 0a 20 20 20  TRUE, 0, 0);.   
63b0: 20 72 65 74 75 72 6e 20 69 2b 34 3b 0a 20 20 7d   return i+4;.  }
63c0: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 66 27 0a  else if( c=='f'.
63d0: 20 20 20 20 20 20 20 20 20 26 26 20 73 74 72 6e           && strn
63e0: 63 6d 70 28 7a 2b 69 2c 22 66 61 6c 73 65 22 2c  cmp(z+i,"false",
63f0: 35 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  5)==0.         &
6400: 26 20 21 73 61 66 65 5f 69 73 61 6c 6e 75 6d 28  & !safe_isalnum(
6410: 7a 5b 69 2b 35 5d 29 20 29 7b 0a 20 20 20 20 6a  z[i+5]) ){.    j
6420: 73 6f 6e 50 61 72 73 65 41 64 64 4e 6f 64 65 28  sonParseAddNode(
6430: 70 50 61 72 73 65 2c 20 4a 53 4f 4e 5f 46 41 4c  pParse, JSON_FAL
6440: 53 45 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 72  SE, 0, 0);.    r
6450: 65 74 75 72 6e 20 69 2b 35 3b 0a 20 20 7d 65 6c  eturn i+5;.  }el
6460: 73 65 20 69 66 28 20 63 3d 3d 27 2d 27 20 7c 7c  se if( c=='-' ||
6470: 20 28 63 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27   (c>='0' && c<='
6480: 39 27 29 20 29 7b 0a 20 20 20 20 2f 2a 20 50 61  9') ){.    /* Pa
6490: 72 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  rse number */.  
64a0: 20 20 75 38 20 73 65 65 6e 44 50 20 3d 20 30 3b    u8 seenDP = 0;
64b0: 0a 20 20 20 20 75 38 20 73 65 65 6e 45 20 3d 20  .    u8 seenE = 
64c0: 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 27  0;.    assert( '
64d0: 2d 27 20 3c 20 27 30 27 20 29 3b 0a 20 20 20 20  -' < '0' );.    
64e0: 69 66 28 20 63 3c 3d 27 30 27 20 29 7b 0a 20 20  if( c<='0' ){.  
64f0: 20 20 20 20 6a 20 3d 20 63 3d 3d 27 2d 27 20 3f      j = c=='-' ?
6500: 20 69 2b 31 20 3a 20 69 3b 0a 20 20 20 20 20 20   i+1 : i;.      
6510: 69 66 28 20 7a 5b 6a 5d 3d 3d 27 30 27 20 26 26  if( z[j]=='0' &&
6520: 20 7a 5b 6a 2b 31 5d 3e 3d 27 30 27 20 26 26 20   z[j+1]>='0' && 
6530: 7a 5b 6a 2b 31 5d 3c 3d 27 39 27 20 29 20 72 65  z[j+1]<='9' ) re
6540: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  turn -1;.    }. 
6550: 20 20 20 6a 20 3d 20 69 2b 31 3b 0a 20 20 20 20     j = i+1;.    
6560: 66 6f 72 28 3b 3b 20 6a 2b 2b 29 7b 0a 20 20 20  for(;; j++){.   
6570: 20 20 20 63 20 3d 20 7a 5b 6a 5d 3b 0a 20 20 20     c = z[j];.   
6580: 20 20 20 69 66 28 20 63 3e 3d 27 30 27 20 26 26     if( c>='0' &&
6590: 20 63 3c 3d 27 39 27 20 29 20 63 6f 6e 74 69 6e   c<='9' ) contin
65a0: 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d  ue;.      if( c=
65b0: 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='.' ){.        
65c0: 69 66 28 20 7a 5b 6a 2d 31 5d 3d 3d 27 2d 27 20  if( z[j-1]=='-' 
65d0: 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
65e0: 20 20 20 20 20 69 66 28 20 73 65 65 6e 44 50 20       if( seenDP 
65f0: 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
6600: 20 20 20 20 20 73 65 65 6e 44 50 20 3d 20 31 3b       seenDP = 1;
6610: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
6620: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
6630: 20 69 66 28 20 63 3d 3d 27 65 27 20 7c 7c 20 63   if( c=='e' || c
6640: 3d 3d 27 45 27 20 29 7b 0a 20 20 20 20 20 20 20  =='E' ){.       
6650: 20 69 66 28 20 7a 5b 6a 2d 31 5d 3c 27 30 27 20   if( z[j-1]<'0' 
6660: 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
6670: 20 20 20 20 20 69 66 28 20 73 65 65 6e 45 20 29       if( seenE )
6680: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
6690: 20 20 20 20 73 65 65 6e 44 50 20 3d 20 73 65 65      seenDP = see
66a0: 6e 45 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nE = 1;.        
66b0: 63 20 3d 20 7a 5b 6a 2b 31 5d 3b 0a 20 20 20 20  c = z[j+1];.    
66c0: 20 20 20 20 69 66 28 20 63 3d 3d 27 2b 27 20 7c      if( c=='+' |
66d0: 7c 20 63 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20  | c=='-' ){.    
66e0: 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
66f0: 20 20 20 20 20 63 20 3d 20 7a 5b 6a 2b 31 5d 3b       c = z[j+1];
6700: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6710: 20 20 20 69 66 28 20 63 3c 27 30 27 20 7c 7c 20     if( c<'0' || 
6720: 63 3e 27 39 27 20 29 20 72 65 74 75 72 6e 20 2d  c>'9' ) return -
6730: 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  1;.        conti
6740: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
6750: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6760: 20 20 20 20 69 66 28 20 7a 5b 6a 2d 31 5d 3c 27      if( z[j-1]<'
6770: 30 27 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  0' ) return -1;.
6780: 20 20 20 20 6a 73 6f 6e 50 61 72 73 65 41 64 64      jsonParseAdd
6790: 4e 6f 64 65 28 70 50 61 72 73 65 2c 20 73 65 65  Node(pParse, see
67a0: 6e 44 50 20 3f 20 4a 53 4f 4e 5f 52 45 41 4c 20  nDP ? JSON_REAL 
67b0: 3a 20 4a 53 4f 4e 5f 49 4e 54 2c 0a 20 20 20 20  : JSON_INT,.    
67c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67d0: 20 20 20 20 6a 20 2d 20 69 2c 20 26 7a 5b 69 5d      j - i, &z[i]
67e0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6a 3b  );.    return j;
67f0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d  .  }else if( c==
6800: 27 7d 27 20 29 7b 0a 20 20 20 20 72 65 74 75 72  '}' ){.    retur
6810: 6e 20 2d 32 3b 20 20 2f 2a 20 45 6e 64 20 6f 66  n -2;  /* End of
6820: 20 7b 2e 2e 2e 7d 20 2a 2f 0a 20 20 7d 65 6c 73   {...} */.  }els
6830: 65 20 69 66 28 20 63 3d 3d 27 5d 27 20 29 7b 0a  e if( c==']' ){.
6840: 20 20 20 20 72 65 74 75 72 6e 20 2d 33 3b 20 20      return -3;  
6850: 2f 2a 20 45 6e 64 20 6f 66 20 5b 2e 2e 2e 5d 20  /* End of [...] 
6860: 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 63  */.  }else if( c
6870: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
6880: 6e 20 30 3b 20 20 20 2f 2a 20 45 6e 64 20 6f 66  n 0;   /* End of
6890: 20 66 69 6c 65 20 2a 2f 0a 20 20 7d 65 6c 73 65   file */.  }else
68a0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  {.    return -1;
68b0: 20 20 2f 2a 20 53 79 6e 74 61 78 20 65 72 72 6f    /* Syntax erro
68c0: 72 20 2a 2f 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  r */.  }.}../*.*
68d0: 2a 20 50 61 72 73 65 20 61 20 63 6f 6d 70 6c 65  * Parse a comple
68e0: 74 65 20 4a 53 4f 4e 20 73 74 72 69 6e 67 2e 20  te JSON string. 
68f0: 20 52 65 74 75 72 6e 20 30 20 6f 6e 20 73 75 63   Return 0 on suc
6900: 63 65 73 73 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  cess or non-zero
6910: 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   if there.** are
6920: 20 61 6e 79 20 65 72 72 6f 72 73 2e 20 20 49 66   any errors.  If
6930: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
6940: 2c 20 66 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72  , free all memor
6950: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
6960: 68 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a 0a  h.** pParse..**.
6970: 2a 2a 20 70 50 61 72 73 65 20 69 73 20 75 6e 69  ** pParse is uni
6980: 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20  nitialized when 
6990: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
69a0: 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
69b0: 63 20 69 6e 74 20 6a 73 6f 6e 50 61 72 73 65 28  c int jsonParse(
69c0: 0a 20 20 4a 73 6f 6e 50 61 72 73 65 20 2a 70 50  .  JsonParse *pP
69d0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
69e0: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e  /* Initialize an
69f0: 64 20 66 69 6c 6c 20 74 68 69 73 20 4a 73 6f 6e  d fill this Json
6a00: 50 61 72 73 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  Parse object */.
6a10: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
6a20: 74 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20 2f  t *pCtx,       /
6a30: 2a 20 52 65 70 6f 72 74 20 65 72 72 6f 72 73 20  * Report errors 
6a40: 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  here */.  const 
6a50: 63 68 61 72 20 2a 7a 4a 73 6f 6e 20 20 20 20 20  char *zJson     
6a60: 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20         /* Input 
6a70: 4a 53 4f 4e 20 74 65 78 74 20 74 6f 20 62 65 20  JSON text to be 
6a80: 70 61 72 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 69  parsed */.){.  i
6a90: 6e 74 20 69 3b 0a 20 20 6d 65 6d 73 65 74 28 70  nt i;.  memset(p
6aa0: 50 61 72 73 65 2c 20 30 2c 20 73 69 7a 65 6f 66  Parse, 0, sizeof
6ab0: 28 2a 70 50 61 72 73 65 29 29 3b 0a 20 20 69 66  (*pParse));.  if
6ac0: 28 20 7a 4a 73 6f 6e 3d 3d 30 20 29 20 72 65 74  ( zJson==0 ) ret
6ad0: 75 72 6e 20 31 3b 0a 20 20 70 50 61 72 73 65 2d  urn 1;.  pParse-
6ae0: 3e 7a 4a 73 6f 6e 20 3d 20 7a 4a 73 6f 6e 3b 0a  >zJson = zJson;.
6af0: 20 20 69 20 3d 20 6a 73 6f 6e 50 61 72 73 65 56    i = jsonParseV
6b00: 61 6c 75 65 28 70 50 61 72 73 65 2c 20 30 29 3b  alue(pParse, 0);
6b10: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6f  .  if( pParse->o
6b20: 6f 6d 20 29 20 69 20 3d 20 2d 31 3b 0a 20 20 69  om ) i = -1;.  i
6b30: 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 61 73  f( i>0 ){.    as
6b40: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 69 44  sert( pParse->iD
6b50: 65 70 74 68 3d 3d 30 20 29 3b 0a 20 20 20 20 77  epth==0 );.    w
6b60: 68 69 6c 65 28 20 73 61 66 65 5f 69 73 73 70 61  hile( safe_isspa
6b70: 63 65 28 7a 4a 73 6f 6e 5b 69 5d 29 20 29 20 69  ce(zJson[i]) ) i
6b80: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 7a 4a 73 6f  ++;.    if( zJso
6b90: 6e 5b 69 5d 20 29 20 69 20 3d 20 2d 31 3b 0a 20  n[i] ) i = -1;. 
6ba0: 20 7d 0a 20 20 69 66 28 20 69 3c 3d 30 20 29 7b   }.  if( i<=0 ){
6bb0: 0a 20 20 20 20 69 66 28 20 70 43 74 78 21 3d 30  .    if( pCtx!=0
6bc0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50   ){.      if( pP
6bd0: 61 72 73 65 2d 3e 6f 6f 6d 20 29 7b 0a 20 20 20  arse->oom ){.   
6be0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
6bf0: 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28  ult_error_nomem(
6c00: 70 43 74 78 29 3b 0a 20 20 20 20 20 20 7d 65 6c  pCtx);.      }el
6c10: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
6c20: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
6c30: 28 70 43 74 78 2c 20 22 6d 61 6c 66 6f 72 6d 65  (pCtx, "malforme
6c40: 64 20 4a 53 4f 4e 22 2c 20 2d 31 29 3b 0a 20 20  d JSON", -1);.  
6c50: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
6c60: 6a 73 6f 6e 50 61 72 73 65 52 65 73 65 74 28 70  jsonParseReset(p
6c70: 50 61 72 73 65 29 3b 0a 20 20 20 20 72 65 74 75  Parse);.    retu
6c80: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
6c90: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 4d 61 72 6b  rn 0;.}../* Mark
6ca0: 20 6e 6f 64 65 20 69 20 6f 66 20 70 50 61 72 73   node i of pPars
6cb0: 65 20 61 73 20 62 65 69 6e 67 20 61 20 63 68 69  e as being a chi
6cc0: 6c 64 20 6f 66 20 69 50 61 72 65 6e 74 2e 20 20  ld of iParent.  
6cd0: 43 61 6c 6c 20 72 65 63 75 72 73 69 76 65 6c 79  Call recursively
6ce0: 0a 2a 2a 20 74 6f 20 66 69 6c 6c 20 69 6e 20 61  .** to fill in a
6cf0: 6c 6c 20 74 68 65 20 64 65 73 63 65 6e 64 61 6e  ll the descendan
6d00: 74 73 20 6f 66 20 6e 6f 64 65 20 69 2e 0a 2a 2f  ts of node i..*/
6d10: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f  .static void jso
6d20: 6e 50 61 72 73 65 46 69 6c 6c 49 6e 50 61 72 65  nParseFillInPare
6d30: 6e 74 61 67 65 28 4a 73 6f 6e 50 61 72 73 65 20  ntage(JsonParse 
6d40: 2a 70 50 61 72 73 65 2c 20 75 33 32 20 69 2c 20  *pParse, u32 i, 
6d50: 75 33 32 20 69 50 61 72 65 6e 74 29 7b 0a 20 20  u32 iParent){.  
6d60: 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 20  JsonNode *pNode 
6d70: 3d 20 26 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65  = &pParse->aNode
6d80: 5b 69 5d 3b 0a 20 20 75 33 32 20 6a 3b 0a 20 20  [i];.  u32 j;.  
6d90: 70 50 61 72 73 65 2d 3e 61 55 70 5b 69 5d 20 3d  pParse->aUp[i] =
6da0: 20 69 50 61 72 65 6e 74 3b 0a 20 20 73 77 69 74   iParent;.  swit
6db0: 63 68 28 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65  ch( pNode->eType
6dc0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4a 53 4f   ){.    case JSO
6dd0: 4e 5f 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20  N_ARRAY: {.     
6de0: 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 3d 70 4e 6f   for(j=1; j<=pNo
6df0: 64 65 2d 3e 6e 3b 20 6a 20 2b 3d 20 6a 73 6f 6e  de->n; j += json
6e00: 4e 6f 64 65 53 69 7a 65 28 70 4e 6f 64 65 2b 6a  NodeSize(pNode+j
6e10: 29 29 7b 0a 20 20 20 20 20 20 20 20 6a 73 6f 6e  )){.        json
6e20: 50 61 72 73 65 46 69 6c 6c 49 6e 50 61 72 65 6e  ParseFillInParen
6e30: 74 61 67 65 28 70 50 61 72 73 65 2c 20 69 2b 6a  tage(pParse, i+j
6e40: 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , i);.      }.  
6e50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6e60: 0a 20 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f 4f  .    case JSON_O
6e70: 42 4a 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 66  BJECT: {.      f
6e80: 6f 72 28 6a 3d 31 3b 20 6a 3c 3d 70 4e 6f 64 65  or(j=1; j<=pNode
6e90: 2d 3e 6e 3b 20 6a 20 2b 3d 20 6a 73 6f 6e 4e 6f  ->n; j += jsonNo
6ea0: 64 65 53 69 7a 65 28 70 4e 6f 64 65 2b 6a 2b 31  deSize(pNode+j+1
6eb0: 29 2b 31 29 7b 0a 20 20 20 20 20 20 20 20 70 50  )+1){.        pP
6ec0: 61 72 73 65 2d 3e 61 55 70 5b 69 2b 6a 5d 20 3d  arse->aUp[i+j] =
6ed0: 20 69 3b 0a 20 20 20 20 20 20 20 20 6a 73 6f 6e   i;.        json
6ee0: 50 61 72 73 65 46 69 6c 6c 49 6e 50 61 72 65 6e  ParseFillInParen
6ef0: 74 61 67 65 28 70 50 61 72 73 65 2c 20 69 2b 6a  tage(pParse, i+j
6f00: 2b 31 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a  +1, i);.      }.
6f10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6f20: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
6f30: 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
6f40: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
6f50: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 70 61  * Compute the pa
6f60: 72 65 6e 74 61 67 65 20 6f 66 20 61 6c 6c 20 6e  rentage of all n
6f70: 6f 64 65 73 20 69 6e 20 61 20 63 6f 6d 70 6c 65  odes in a comple
6f80: 74 65 64 20 70 61 72 73 65 2e 0a 2a 2f 0a 73 74  ted parse..*/.st
6f90: 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e 50 61 72  atic int jsonPar
6fa0: 73 65 46 69 6e 64 50 61 72 65 6e 74 73 28 4a 73  seFindParents(Js
6fb0: 6f 6e 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  onParse *pParse)
6fc0: 7b 0a 20 20 75 33 32 20 2a 61 55 70 3b 0a 20 20  {.  u32 *aUp;.  
6fd0: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
6fe0: 61 55 70 3d 3d 30 20 29 3b 0a 20 20 61 55 70 20  aUp==0 );.  aUp 
6ff0: 3d 20 70 50 61 72 73 65 2d 3e 61 55 70 20 3d 20  = pParse->aUp = 
7000: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
7010: 28 20 73 69 7a 65 6f 66 28 75 33 32 29 2a 70 50  ( sizeof(u32)*pP
7020: 61 72 73 65 2d 3e 6e 4e 6f 64 65 20 29 3b 0a 20  arse->nNode );. 
7030: 20 69 66 28 20 61 55 70 3d 3d 30 20 29 7b 0a 20   if( aUp==0 ){. 
7040: 20 20 20 70 50 61 72 73 65 2d 3e 6f 6f 6d 20 3d     pParse->oom =
7050: 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
7060: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
7070: 0a 20 20 6a 73 6f 6e 50 61 72 73 65 46 69 6c 6c  .  jsonParseFill
7080: 49 6e 50 61 72 65 6e 74 61 67 65 28 70 50 61 72  InParentage(pPar
7090: 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65 74  se, 0, 0);.  ret
70a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
70b0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 67 69 63 20 6e 75  ../*.** Magic nu
70c0: 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 74 68  mber used for th
70d0: 65 20 4a 53 4f 4e 20 70 61 72 73 65 20 63 61 63  e JSON parse cac
70e0: 68 65 20 69 6e 20 73 71 6c 69 74 65 33 5f 67 65  he in sqlite3_ge
70f0: 74 5f 61 75 78 64 61 74 61 28 29 0a 2a 2f 0a 23  t_auxdata().*/.#
7100: 64 65 66 69 6e 65 20 4a 53 4f 4e 5f 43 41 43 48  define JSON_CACH
7110: 45 5f 49 44 20 20 28 2d 34 32 39 39 33 38 29 20  E_ID  (-429938) 
7120: 20 2f 2a 20 46 69 72 73 74 20 63 61 63 68 65 20   /* First cache 
7130: 65 6e 74 72 79 20 2a 2f 0a 23 64 65 66 69 6e 65  entry */.#define
7140: 20 4a 53 4f 4e 5f 43 41 43 48 45 5f 53 5a 20 20   JSON_CACHE_SZ  
7150: 34 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  4          /* Ma
7160: 78 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68  x number of cach
7170: 65 20 65 6e 74 72 69 65 73 20 2a 2f 0a 0a 2f 2a  e entries */../*
7180: 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 63 6f 6d  .** Obtain a com
7190: 70 6c 65 74 65 20 70 61 72 73 65 20 6f 66 20 74  plete parse of t
71a0: 68 65 20 4a 53 4f 4e 20 66 6f 75 6e 64 20 69 6e  he JSON found in
71b0: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
71c0: 65 6e 74 0a 2a 2a 20 6f 66 20 74 68 65 20 61 72  ent.** of the ar
71d0: 67 76 20 61 72 72 61 79 2e 20 20 55 73 65 20 74  gv array.  Use t
71e0: 68 65 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61  he sqlite3_get_a
71f0: 75 78 64 61 74 61 28 29 20 63 61 63 68 65 20 66  uxdata() cache f
7200: 6f 72 20 74 68 69 73 0a 2a 2a 20 70 61 72 73 65  or this.** parse
7210: 20 69 66 20 69 74 20 69 73 20 61 76 61 69 6c 61   if it is availa
7220: 62 6c 65 2e 20 20 49 66 20 74 68 65 20 63 61 63  ble.  If the cac
7230: 68 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61  he is not availa
7240: 62 6c 65 20 6f 72 20 69 66 20 69 74 0a 2a 2a 20  ble or if it.** 
7250: 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 76 61 6c  is no longer val
7260: 69 64 2c 20 70 61 72 73 65 20 74 68 65 20 4a 53  id, parse the JS
7270: 4f 4e 20 61 67 61 69 6e 20 61 6e 64 20 72 65 74  ON again and ret
7280: 75 72 6e 20 74 68 65 20 6e 65 77 20 70 61 72 73  urn the new pars
7290: 65 2c 0a 2a 2a 20 61 6e 64 20 61 6c 73 6f 20 72  e,.** and also r
72a0: 65 67 69 73 74 65 72 20 74 68 65 20 6e 65 77 20  egister the new 
72b0: 70 61 72 73 65 20 73 6f 20 74 68 61 74 20 69 74  parse so that it
72c0: 20 77 69 6c 6c 20 62 65 20 61 76 61 69 6c 61 62   will be availab
72d0: 6c 65 20 66 6f 72 0a 2a 2a 20 66 75 74 75 72 65  le for.** future
72e0: 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 78   sqlite3_get_aux
72f0: 64 61 74 61 28 29 20 63 61 6c 6c 73 2e 0a 2a 2f  data() calls..*/
7300: 0a 73 74 61 74 69 63 20 4a 73 6f 6e 50 61 72 73  .static JsonPars
7310: 65 20 2a 6a 73 6f 6e 50 61 72 73 65 43 61 63 68  e *jsonParseCach
7320: 65 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  ed(.  sqlite3_co
7330: 6e 74 65 78 74 20 2a 70 43 74 78 2c 0a 20 20 73  ntext *pCtx,.  s
7340: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
7350: 72 67 76 2c 0a 20 20 73 71 6c 69 74 65 33 5f 63  rgv,.  sqlite3_c
7360: 6f 6e 74 65 78 74 20 2a 70 45 72 72 43 74 78 0a  ontext *pErrCtx.
7370: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
7380: 2a 7a 4a 73 6f 6e 20 3d 20 28 63 6f 6e 73 74 20  *zJson = (const 
7390: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
73a0: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
73b0: 29 3b 0a 20 20 69 6e 74 20 6e 4a 73 6f 6e 20 3d  );.  int nJson =
73c0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
73d0: 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20  ytes(argv[0]);. 
73e0: 20 4a 73 6f 6e 50 61 72 73 65 20 2a 70 3b 0a 20   JsonParse *p;. 
73f0: 20 4a 73 6f 6e 50 61 72 73 65 20 2a 70 4d 61 74   JsonParse *pMat
7400: 63 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4b  ch = 0;.  int iK
7410: 65 79 3b 0a 20 20 69 6e 74 20 69 4d 69 6e 4b 65  ey;.  int iMinKe
7420: 79 20 3d 20 30 3b 0a 20 20 75 33 32 20 69 4d 69  y = 0;.  u32 iMi
7430: 6e 48 6f 6c 64 20 3d 20 30 78 66 66 66 66 66 66  nHold = 0xffffff
7440: 66 66 3b 0a 20 20 75 33 32 20 69 4d 61 78 48 6f  ff;.  u32 iMaxHo
7450: 6c 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 4a  ld = 0;.  if( zJ
7460: 73 6f 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  son==0 ) return 
7470: 30 3b 0a 20 20 66 6f 72 28 69 4b 65 79 3d 30 3b  0;.  for(iKey=0;
7480: 20 69 4b 65 79 3c 4a 53 4f 4e 5f 43 41 43 48 45   iKey<JSON_CACHE
7490: 5f 53 5a 3b 20 69 4b 65 79 2b 2b 29 7b 0a 20 20  _SZ; iKey++){.  
74a0: 20 20 70 20 3d 20 28 4a 73 6f 6e 50 61 72 73 65    p = (JsonParse
74b0: 2a 29 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75  *)sqlite3_get_au
74c0: 78 64 61 74 61 28 70 43 74 78 2c 20 4a 53 4f 4e  xdata(pCtx, JSON
74d0: 5f 43 41 43 48 45 5f 49 44 2b 69 4b 65 79 29 3b  _CACHE_ID+iKey);
74e0: 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  .    if( p==0 ){
74f0: 0a 20 20 20 20 20 20 69 4d 69 6e 4b 65 79 20 3d  .      iMinKey =
7500: 20 69 4b 65 79 3b 0a 20 20 20 20 20 20 62 72 65   iKey;.      bre
7510: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
7520: 28 20 70 4d 61 74 63 68 3d 3d 30 0a 20 20 20 20  ( pMatch==0.    
7530: 20 26 26 20 70 2d 3e 6e 4a 73 6f 6e 3d 3d 6e 4a   && p->nJson==nJ
7540: 73 6f 6e 0a 20 20 20 20 20 26 26 20 6d 65 6d 63  son.     && memc
7550: 6d 70 28 70 2d 3e 7a 4a 73 6f 6e 2c 7a 4a 73 6f  mp(p->zJson,zJso
7560: 6e 2c 6e 4a 73 6f 6e 29 3d 3d 30 0a 20 20 20 20  n,nJson)==0.    
7570: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 45 72 72  ){.      p->nErr
7580: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4d 61 74   = 0;.      pMat
7590: 63 68 20 3d 20 70 3b 0a 20 20 20 20 7d 65 6c 73  ch = p;.    }els
75a0: 65 20 69 66 28 20 70 2d 3e 69 48 6f 6c 64 3c 69  e if( p->iHold<i
75b0: 4d 69 6e 48 6f 6c 64 20 29 7b 0a 20 20 20 20 20  MinHold ){.     
75c0: 20 69 4d 69 6e 48 6f 6c 64 20 3d 20 70 2d 3e 69   iMinHold = p->i
75d0: 48 6f 6c 64 3b 0a 20 20 20 20 20 20 69 4d 69 6e  Hold;.      iMin
75e0: 4b 65 79 20 3d 20 69 4b 65 79 3b 0a 20 20 20 20  Key = iKey;.    
75f0: 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 48 6f  }.    if( p->iHo
7600: 6c 64 3e 69 4d 61 78 48 6f 6c 64 20 29 7b 0a 20  ld>iMaxHold ){. 
7610: 20 20 20 20 20 69 4d 61 78 48 6f 6c 64 20 3d 20       iMaxHold = 
7620: 70 2d 3e 69 48 6f 6c 64 3b 0a 20 20 20 20 7d 0a  p->iHold;.    }.
7630: 20 20 7d 0a 20 20 69 66 28 20 70 4d 61 74 63 68    }.  if( pMatch
7640: 20 29 7b 0a 20 20 20 20 70 4d 61 74 63 68 2d 3e   ){.    pMatch->
7650: 6e 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 70 4d  nErr = 0;.    pM
7660: 61 74 63 68 2d 3e 69 48 6f 6c 64 20 3d 20 69 4d  atch->iHold = iM
7670: 61 78 48 6f 6c 64 2b 31 3b 0a 20 20 20 20 72 65  axHold+1;.    re
7680: 74 75 72 6e 20 70 4d 61 74 63 68 3b 0a 20 20 7d  turn pMatch;.  }
7690: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d  .  p = sqlite3_m
76a0: 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28  alloc64( sizeof(
76b0: 2a 70 29 20 2b 20 6e 4a 73 6f 6e 20 2b 20 31 20  *p) + nJson + 1 
76c0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  );.  if( p==0 ){
76d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
76e0: 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28  ult_error_nomem(
76f0: 70 43 74 78 29 3b 0a 20 20 20 20 72 65 74 75 72  pCtx);.    retur
7700: 6e 20 30 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  n 0;.  }.  memse
7710: 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  t(p, 0, sizeof(*
7720: 70 29 29 3b 0a 20 20 70 2d 3e 7a 4a 73 6f 6e 20  p));.  p->zJson 
7730: 3d 20 28 63 68 61 72 2a 29 26 70 5b 31 5d 3b 0a  = (char*)&p[1];.
7740: 20 20 6d 65 6d 63 70 79 28 28 63 68 61 72 2a 29    memcpy((char*)
7750: 70 2d 3e 7a 4a 73 6f 6e 2c 20 7a 4a 73 6f 6e 2c  p->zJson, zJson,
7760: 20 6e 4a 73 6f 6e 2b 31 29 3b 0a 20 20 69 66 28   nJson+1);.  if(
7770: 20 6a 73 6f 6e 50 61 72 73 65 28 70 2c 20 70 45   jsonParse(p, pE
7780: 72 72 43 74 78 2c 20 70 2d 3e 7a 4a 73 6f 6e 29  rrCtx, p->zJson)
7790: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
77a0: 66 72 65 65 28 70 29 3b 0a 20 20 20 20 72 65 74  free(p);.    ret
77b0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e  urn 0;.  }.  p->
77c0: 6e 4a 73 6f 6e 20 3d 20 6e 4a 73 6f 6e 3b 0a 20  nJson = nJson;. 
77d0: 20 70 2d 3e 69 48 6f 6c 64 20 3d 20 69 4d 61 78   p->iHold = iMax
77e0: 48 6f 6c 64 2b 31 3b 0a 20 20 73 71 6c 69 74 65  Hold+1;.  sqlite
77f0: 33 5f 73 65 74 5f 61 75 78 64 61 74 61 28 70 43  3_set_auxdata(pC
7800: 74 78 2c 20 4a 53 4f 4e 5f 43 41 43 48 45 5f 49  tx, JSON_CACHE_I
7810: 44 2b 69 4d 69 6e 4b 65 79 2c 20 70 2c 0a 20 20  D+iMinKey, p,.  
7820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7830: 20 20 20 20 28 76 6f 69 64 28 2a 29 28 76 6f 69      (void(*)(voi
7840: 64 2a 29 29 6a 73 6f 6e 50 61 72 73 65 46 72 65  d*))jsonParseFre
7850: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 4a 73  e);.  return (Js
7860: 6f 6e 50 61 72 73 65 2a 29 73 71 6c 69 74 65 33  onParse*)sqlite3
7870: 5f 67 65 74 5f 61 75 78 64 61 74 61 28 70 43 74  _get_auxdata(pCt
7880: 78 2c 20 4a 53 4f 4e 5f 43 41 43 48 45 5f 49 44  x, JSON_CACHE_ID
7890: 2b 69 4d 69 6e 4b 65 79 29 3b 0a 7d 0a 0a 2f 2a  +iMinKey);.}../*
78a0: 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20  .** Compare the 
78b0: 4f 42 4a 45 43 54 20 6c 61 62 65 6c 20 61 74 20  OBJECT label at 
78c0: 70 4e 6f 64 65 20 61 67 61 69 6e 73 74 20 7a 4b  pNode against zK
78d0: 65 79 2c 6e 4b 65 79 2e 20 20 52 65 74 75 72 6e  ey,nKey.  Return
78e0: 20 74 72 75 65 20 6f 6e 0a 2a 2a 20 61 20 6d 61   true on.** a ma
78f0: 74 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tch..*/.static i
7900: 6e 74 20 6a 73 6f 6e 4c 61 62 65 6c 43 6f 6d 70  nt jsonLabelComp
7910: 61 72 65 28 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e  are(JsonNode *pN
7920: 6f 64 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ode, const char 
7930: 2a 7a 4b 65 79 2c 20 75 33 32 20 6e 4b 65 79 29  *zKey, u32 nKey)
7940: 7b 0a 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 6a  {.  if( pNode->j
7950: 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 52  nFlags & JNODE_R
7960: 41 57 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4e  AW ){.    if( pN
7970: 6f 64 65 2d 3e 6e 21 3d 6e 4b 65 79 20 29 20 72  ode->n!=nKey ) r
7980: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 72 65 74  eturn 0;.    ret
7990: 75 72 6e 20 73 74 72 6e 63 6d 70 28 70 4e 6f 64  urn strncmp(pNod
79a0: 65 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 2c 20  e->u.zJContent, 
79b0: 7a 4b 65 79 2c 20 6e 4b 65 79 29 3d 3d 30 3b 0a  zKey, nKey)==0;.
79c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
79d0: 20 70 4e 6f 64 65 2d 3e 6e 21 3d 6e 4b 65 79 2b   pNode->n!=nKey+
79e0: 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  2 ) return 0;.  
79f0: 20 20 72 65 74 75 72 6e 20 73 74 72 6e 63 6d 70    return strncmp
7a00: 28 70 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74  (pNode->u.zJCont
7a10: 65 6e 74 2b 31 2c 20 7a 4b 65 79 2c 20 6e 4b 65  ent+1, zKey, nKe
7a20: 79 29 3d 3d 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  y)==0;.  }.}../*
7a30: 20 66 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   forward declara
7a40: 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 4a  tion */.static J
7a50: 73 6f 6e 4e 6f 64 65 20 2a 6a 73 6f 6e 4c 6f 6f  sonNode *jsonLoo
7a60: 6b 75 70 41 70 70 65 6e 64 28 4a 73 6f 6e 50 61  kupAppend(JsonPa
7a70: 72 73 65 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  rse*,const char*
7a80: 2c 69 6e 74 2a 2c 63 6f 6e 73 74 20 63 68 61 72  ,int*,const char
7a90: 2a 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72  **);../*.** Sear
7aa0: 63 68 20 61 6c 6f 6e 67 20 7a 50 61 74 68 20 74  ch along zPath t
7ab0: 6f 20 66 69 6e 64 20 74 68 65 20 6e 6f 64 65 20  o find the node 
7ac0: 73 70 65 63 69 66 69 65 64 2e 20 20 52 65 74 75  specified.  Retu
7ad0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  rn a pointer.** 
7ae0: 74 6f 20 74 68 61 74 20 6e 6f 64 65 2c 20 6f 72  to that node, or
7af0: 20 4e 55 4c 4c 20 69 66 20 7a 50 61 74 68 20 69   NULL if zPath i
7b00: 73 20 6d 61 6c 66 6f 72 6d 65 64 20 6f 72 20 69  s malformed or i
7b10: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75  f there is no su
7b20: 63 68 0a 2a 2a 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a  ch.** node..**.*
7b30: 2a 20 49 66 20 70 41 70 6e 64 21 3d 30 2c 20 74  * If pApnd!=0, t
7b40: 68 65 6e 20 74 72 79 20 74 6f 20 61 70 70 65 6e  hen try to appen
7b50: 64 20 6e 65 77 20 6e 6f 64 65 73 20 74 6f 20 63  d new nodes to c
7b60: 6f 6d 70 6c 65 74 65 20 7a 50 61 74 68 20 69 66  omplete zPath if
7b70: 20 69 74 20 69 73 0a 2a 2a 20 70 6f 73 73 69 62   it is.** possib
7b80: 6c 65 20 74 6f 20 64 6f 20 73 6f 20 61 6e 64 20  le to do so and 
7b90: 69 66 20 6e 6f 20 65 78 69 73 74 69 6e 67 20 6e  if no existing n
7ba0: 6f 64 65 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  ode corresponds 
7bb0: 74 6f 20 7a 50 61 74 68 2e 20 20 49 66 0a 2a 2a  to zPath.  If.**
7bc0: 20 6e 65 77 20 6e 6f 64 65 73 20 61 72 65 20 61   new nodes are a
7bd0: 70 70 65 6e 64 65 64 20 2a 70 41 70 6e 64 20 69  ppended *pApnd i
7be0: 73 20 73 65 74 20 74 6f 20 31 2e 0a 2a 2f 0a 73  s set to 1..*/.s
7bf0: 74 61 74 69 63 20 4a 73 6f 6e 4e 6f 64 65 20 2a  tatic JsonNode *
7c00: 6a 73 6f 6e 4c 6f 6f 6b 75 70 53 74 65 70 28 0a  jsonLookupStep(.
7c10: 20 20 4a 73 6f 6e 50 61 72 73 65 20 2a 70 50 61    JsonParse *pPa
7c20: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  rse,      /* The
7c30: 20 4a 53 4f 4e 20 74 6f 20 73 65 61 72 63 68 20   JSON to search 
7c40: 2a 2f 0a 20 20 75 33 32 20 69 52 6f 6f 74 2c 20  */.  u32 iRoot, 
7c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7c60: 42 65 67 69 6e 20 74 68 65 20 73 65 61 72 63 68  Begin the search
7c70: 20 61 74 20 74 68 69 73 20 6e 6f 64 65 20 2a 2f   at this node */
7c80: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7c90: 50 61 74 68 2c 20 20 20 20 20 20 2f 2a 20 54 68  Path,      /* Th
7ca0: 65 20 70 61 74 68 20 74 6f 20 73 65 61 72 63 68  e path to search
7cb0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 70 6e 64   */.  int *pApnd
7cc0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
7cd0: 20 41 70 70 65 6e 64 20 6e 6f 64 65 73 20 74 6f   Append nodes to
7ce0: 20 63 6f 6d 70 6c 65 74 65 20 70 61 74 68 20 69   complete path i
7cf0: 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20  f not NULL */.  
7d00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 45  const char **pzE
7d10: 72 72 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20  rr      /* Make 
7d20: 2a 70 7a 45 72 72 20 70 6f 69 6e 74 20 74 6f 20  *pzErr point to 
7d30: 61 6e 79 20 73 79 6e 74 61 78 20 65 72 72 6f 72  any syntax error
7d40: 20 69 6e 20 7a 50 61 74 68 20 2a 2f 0a 29 7b 0a   in zPath */.){.
7d50: 20 20 75 33 32 20 69 2c 20 6a 2c 20 6e 4b 65 79    u32 i, j, nKey
7d60: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
7d70: 7a 4b 65 79 3b 0a 20 20 4a 73 6f 6e 4e 6f 64 65  zKey;.  JsonNode
7d80: 20 2a 70 52 6f 6f 74 20 3d 20 26 70 50 61 72 73   *pRoot = &pPars
7d90: 65 2d 3e 61 4e 6f 64 65 5b 69 52 6f 6f 74 5d 3b  e->aNode[iRoot];
7da0: 0a 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d  .  if( zPath[0]=
7db0: 3d 30 20 29 20 72 65 74 75 72 6e 20 70 52 6f 6f  =0 ) return pRoo
7dc0: 74 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 5b 30  t;.  if( zPath[0
7dd0: 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 69 66  ]=='.' ){.    if
7de0: 28 20 70 52 6f 6f 74 2d 3e 65 54 79 70 65 21 3d  ( pRoot->eType!=
7df0: 4a 53 4f 4e 5f 4f 42 4a 45 43 54 20 29 20 72 65  JSON_OBJECT ) re
7e00: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7a 50 61 74  turn 0;.    zPat
7e10: 68 2b 2b 3b 0a 20 20 20 20 69 66 28 20 7a 50 61  h++;.    if( zPa
7e20: 74 68 5b 30 5d 3d 3d 27 22 27 20 29 7b 0a 20 20  th[0]=='"' ){.  
7e30: 20 20 20 20 7a 4b 65 79 20 3d 20 7a 50 61 74 68      zKey = zPath
7e40: 20 2b 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28   + 1;.      for(
7e50: 69 3d 31 3b 20 7a 50 61 74 68 5b 69 5d 20 26 26  i=1; zPath[i] &&
7e60: 20 7a 50 61 74 68 5b 69 5d 21 3d 27 22 27 3b 20   zPath[i]!='"'; 
7e70: 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 6e 4b 65  i++){}.      nKe
7e80: 79 20 3d 20 69 2d 31 3b 0a 20 20 20 20 20 20 69  y = i-1;.      i
7e90: 66 28 20 7a 50 61 74 68 5b 69 5d 20 29 7b 0a 20  f( zPath[i] ){. 
7ea0: 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
7eb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7ec0: 20 2a 70 7a 45 72 72 20 3d 20 7a 50 61 74 68 3b   *pzErr = zPath;
7ed0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
7ee0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
7ef0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4b 65 79  else{.      zKey
7f00: 20 3d 20 7a 50 61 74 68 3b 0a 20 20 20 20 20 20   = zPath;.      
7f10: 66 6f 72 28 69 3d 30 3b 20 7a 50 61 74 68 5b 69  for(i=0; zPath[i
7f20: 5d 20 26 26 20 7a 50 61 74 68 5b 69 5d 21 3d 27  ] && zPath[i]!='
7f30: 2e 27 20 26 26 20 7a 50 61 74 68 5b 69 5d 21 3d  .' && zPath[i]!=
7f40: 27 5b 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20  '['; i++){}.    
7f50: 20 20 6e 4b 65 79 20 3d 20 69 3b 0a 20 20 20 20    nKey = i;.    
7f60: 7d 0a 20 20 20 20 69 66 28 20 6e 4b 65 79 3d 3d  }.    if( nKey==
7f70: 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 7a 45 72  0 ){.      *pzEr
7f80: 72 20 3d 20 7a 50 61 74 68 3b 0a 20 20 20 20 20  r = zPath;.     
7f90: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
7fa0: 0a 20 20 20 20 6a 20 3d 20 31 3b 0a 20 20 20 20  .    j = 1;.    
7fb0: 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 77  for(;;){.      w
7fc0: 68 69 6c 65 28 20 6a 3c 3d 70 52 6f 6f 74 2d 3e  hile( j<=pRoot->
7fd0: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  n ){.        if(
7fe0: 20 6a 73 6f 6e 4c 61 62 65 6c 43 6f 6d 70 61 72   jsonLabelCompar
7ff0: 65 28 70 52 6f 6f 74 2b 6a 2c 20 7a 4b 65 79 2c  e(pRoot+j, zKey,
8000: 20 6e 4b 65 79 29 20 29 7b 0a 20 20 20 20 20 20   nKey) ){.      
8010: 20 20 20 20 72 65 74 75 72 6e 20 6a 73 6f 6e 4c      return jsonL
8020: 6f 6f 6b 75 70 53 74 65 70 28 70 50 61 72 73 65  ookupStep(pParse
8030: 2c 20 69 52 6f 6f 74 2b 6a 2b 31 2c 20 26 7a 50  , iRoot+j+1, &zP
8040: 61 74 68 5b 69 5d 2c 20 70 41 70 6e 64 2c 20 70  ath[i], pApnd, p
8050: 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  zErr);.        }
8060: 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  .        j++;.  
8070: 20 20 20 20 20 20 6a 20 2b 3d 20 6a 73 6f 6e 4e        j += jsonN
8080: 6f 64 65 53 69 7a 65 28 26 70 52 6f 6f 74 5b 6a  odeSize(&pRoot[j
8090: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
80a0: 20 20 69 66 28 20 28 70 52 6f 6f 74 2d 3e 6a 6e    if( (pRoot->jn
80b0: 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 41 50  Flags & JNODE_AP
80c0: 50 45 4e 44 29 3d 3d 30 20 29 20 62 72 65 61 6b  PEND)==0 ) break
80d0: 3b 0a 20 20 20 20 20 20 69 52 6f 6f 74 20 2b 3d  ;.      iRoot +=
80e0: 20 70 52 6f 6f 74 2d 3e 75 2e 69 41 70 70 65 6e   pRoot->u.iAppen
80f0: 64 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 20 3d  d;.      pRoot =
8100: 20 26 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65 5b   &pParse->aNode[
8110: 69 52 6f 6f 74 5d 3b 0a 20 20 20 20 20 20 6a 20  iRoot];.      j 
8120: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
8130: 66 28 20 70 41 70 6e 64 20 29 7b 0a 20 20 20 20  f( pApnd ){.    
8140: 20 20 75 33 32 20 69 53 74 61 72 74 2c 20 69 4c    u32 iStart, iL
8150: 61 62 65 6c 3b 0a 20 20 20 20 20 20 4a 73 6f 6e  abel;.      Json
8160: 4e 6f 64 65 20 2a 70 4e 6f 64 65 3b 0a 20 20 20  Node *pNode;.   
8170: 20 20 20 69 53 74 61 72 74 20 3d 20 6a 73 6f 6e     iStart = json
8180: 50 61 72 73 65 41 64 64 4e 6f 64 65 28 70 50 61  ParseAddNode(pPa
8190: 72 73 65 2c 20 4a 53 4f 4e 5f 4f 42 4a 45 43 54  rse, JSON_OBJECT
81a0: 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 2, 0);.      i
81b0: 4c 61 62 65 6c 20 3d 20 6a 73 6f 6e 50 61 72 73  Label = jsonPars
81c0: 65 41 64 64 4e 6f 64 65 28 70 50 61 72 73 65 2c  eAddNode(pParse,
81d0: 20 4a 53 4f 4e 5f 53 54 52 49 4e 47 2c 20 69 2c   JSON_STRING, i,
81e0: 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7a   zPath);.      z
81f0: 50 61 74 68 20 2b 3d 20 69 3b 0a 20 20 20 20 20  Path += i;.     
8200: 20 70 4e 6f 64 65 20 3d 20 6a 73 6f 6e 4c 6f 6f   pNode = jsonLoo
8210: 6b 75 70 41 70 70 65 6e 64 28 70 50 61 72 73 65  kupAppend(pParse
8220: 2c 20 7a 50 61 74 68 2c 20 70 41 70 6e 64 2c 20  , zPath, pApnd, 
8230: 70 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 69 66  pzErr);.      if
8240: 28 20 70 50 61 72 73 65 2d 3e 6f 6f 6d 20 29 20  ( pParse->oom ) 
8250: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
8260: 69 66 28 20 70 4e 6f 64 65 20 29 7b 0a 20 20 20  if( pNode ){.   
8270: 20 20 20 20 20 70 52 6f 6f 74 20 3d 20 26 70 50       pRoot = &pP
8280: 61 72 73 65 2d 3e 61 4e 6f 64 65 5b 69 52 6f 6f  arse->aNode[iRoo
8290: 74 5d 3b 0a 20 20 20 20 20 20 20 20 70 52 6f 6f  t];.        pRoo
82a0: 74 2d 3e 75 2e 69 41 70 70 65 6e 64 20 3d 20 69  t->u.iAppend = i
82b0: 53 74 61 72 74 20 2d 20 69 52 6f 6f 74 3b 0a 20  Start - iRoot;. 
82c0: 20 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 6a 6e         pRoot->jn
82d0: 46 6c 61 67 73 20 7c 3d 20 4a 4e 4f 44 45 5f 41  Flags |= JNODE_A
82e0: 50 50 45 4e 44 3b 0a 20 20 20 20 20 20 20 20 70  PPEND;.        p
82f0: 50 61 72 73 65 2d 3e 61 4e 6f 64 65 5b 69 4c 61  Parse->aNode[iLa
8300: 62 65 6c 5d 2e 6a 6e 46 6c 61 67 73 20 7c 3d 20  bel].jnFlags |= 
8310: 4a 4e 4f 44 45 5f 52 41 57 3b 0a 20 20 20 20 20  JNODE_RAW;.     
8320: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
8330: 70 4e 6f 64 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNode;.    }.  }
8340: 65 6c 73 65 20 69 66 28 20 7a 50 61 74 68 5b 30  else if( zPath[0
8350: 5d 3d 3d 27 5b 27 20 26 26 20 73 61 66 65 5f 69  ]=='[' && safe_i
8360: 73 64 69 67 69 74 28 7a 50 61 74 68 5b 31 5d 29  sdigit(zPath[1])
8370: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 52 6f 6f   ){.    if( pRoo
8380: 74 2d 3e 65 54 79 70 65 21 3d 4a 53 4f 4e 5f 41  t->eType!=JSON_A
8390: 52 52 41 59 20 29 20 72 65 74 75 72 6e 20 30 3b  RRAY ) return 0;
83a0: 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 20 20  .    i = 0;.    
83b0: 6a 20 3d 20 31 3b 0a 20 20 20 20 77 68 69 6c 65  j = 1;.    while
83c0: 28 20 73 61 66 65 5f 69 73 64 69 67 69 74 28 7a  ( safe_isdigit(z
83d0: 50 61 74 68 5b 6a 5d 29 20 29 7b 0a 20 20 20 20  Path[j]) ){.    
83e0: 20 20 69 20 3d 20 69 2a 31 30 20 2b 20 7a 50 61    i = i*10 + zPa
83f0: 74 68 5b 6a 5d 20 2d 20 27 30 27 3b 0a 20 20 20  th[j] - '0';.   
8400: 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     j++;.    }.  
8410: 20 20 69 66 28 20 7a 50 61 74 68 5b 6a 5d 21 3d    if( zPath[j]!=
8420: 27 5d 27 20 29 7b 0a 20 20 20 20 20 20 2a 70 7a  ']' ){.      *pz
8430: 45 72 72 20 3d 20 7a 50 61 74 68 3b 0a 20 20 20  Err = zPath;.   
8440: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
8450: 20 7d 0a 20 20 20 20 7a 50 61 74 68 20 2b 3d 20   }.    zPath += 
8460: 6a 20 2b 20 31 3b 0a 20 20 20 20 6a 20 3d 20 31  j + 1;.    j = 1
8470: 3b 0a 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20  ;.    for(;;){. 
8480: 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3c 3d 70       while( j<=p
8490: 52 6f 6f 74 2d 3e 6e 20 26 26 20 28 69 3e 30 20  Root->n && (i>0 
84a0: 7c 7c 20 28 70 52 6f 6f 74 5b 6a 5d 2e 6a 6e 46  || (pRoot[j].jnF
84b0: 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 52 45 4d  lags & JNODE_REM
84c0: 4f 56 45 29 21 3d 30 29 20 29 7b 0a 20 20 20 20  OVE)!=0) ){.    
84d0: 20 20 20 20 69 66 28 20 28 70 52 6f 6f 74 5b 6a      if( (pRoot[j
84e0: 5d 2e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44  ].jnFlags & JNOD
84f0: 45 5f 52 45 4d 4f 56 45 29 3d 3d 30 20 29 20 69  E_REMOVE)==0 ) i
8500: 2d 2d 3b 0a 20 20 20 20 20 20 20 20 6a 20 2b 3d  --;.        j +=
8510: 20 6a 73 6f 6e 4e 6f 64 65 53 69 7a 65 28 26 70   jsonNodeSize(&p
8520: 52 6f 6f 74 5b 6a 5d 29 3b 0a 20 20 20 20 20 20  Root[j]);.      
8530: 7d 0a 20 20 20 20 20 20 69 66 28 20 28 70 52 6f  }.      if( (pRo
8540: 6f 74 2d 3e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e  ot->jnFlags & JN
8550: 4f 44 45 5f 41 50 50 45 4e 44 29 3d 3d 30 20 29  ODE_APPEND)==0 )
8560: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 52   break;.      iR
8570: 6f 6f 74 20 2b 3d 20 70 52 6f 6f 74 2d 3e 75 2e  oot += pRoot->u.
8580: 69 41 70 70 65 6e 64 3b 0a 20 20 20 20 20 20 70  iAppend;.      p
8590: 52 6f 6f 74 20 3d 20 26 70 50 61 72 73 65 2d 3e  Root = &pParse->
85a0: 61 4e 6f 64 65 5b 69 52 6f 6f 74 5d 3b 0a 20 20  aNode[iRoot];.  
85b0: 20 20 20 20 6a 20 3d 20 31 3b 0a 20 20 20 20 7d      j = 1;.    }
85c0: 0a 20 20 20 20 69 66 28 20 6a 3c 3d 70 52 6f 6f  .    if( j<=pRoo
85d0: 74 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20 72 65  t->n ){.      re
85e0: 74 75 72 6e 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 53  turn jsonLookupS
85f0: 74 65 70 28 70 50 61 72 73 65 2c 20 69 52 6f 6f  tep(pParse, iRoo
8600: 74 2b 6a 2c 20 7a 50 61 74 68 2c 20 70 41 70 6e  t+j, zPath, pApn
8610: 64 2c 20 70 7a 45 72 72 29 3b 0a 20 20 20 20 7d  d, pzErr);.    }
8620: 0a 20 20 20 20 69 66 28 20 69 3d 3d 30 20 26 26  .    if( i==0 &&
8630: 20 70 41 70 6e 64 20 29 7b 0a 20 20 20 20 20 20   pApnd ){.      
8640: 75 33 32 20 69 53 74 61 72 74 3b 0a 20 20 20 20  u32 iStart;.    
8650: 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64    JsonNode *pNod
8660: 65 3b 0a 20 20 20 20 20 20 69 53 74 61 72 74 20  e;.      iStart 
8670: 3d 20 6a 73 6f 6e 50 61 72 73 65 41 64 64 4e 6f  = jsonParseAddNo
8680: 64 65 28 70 50 61 72 73 65 2c 20 4a 53 4f 4e 5f  de(pParse, JSON_
8690: 41 52 52 41 59 2c 20 31 2c 20 30 29 3b 0a 20 20  ARRAY, 1, 0);.  
86a0: 20 20 20 20 70 4e 6f 64 65 20 3d 20 6a 73 6f 6e      pNode = json
86b0: 4c 6f 6f 6b 75 70 41 70 70 65 6e 64 28 70 50 61  LookupAppend(pPa
86c0: 72 73 65 2c 20 7a 50 61 74 68 2c 20 70 41 70 6e  rse, zPath, pApn
86d0: 64 2c 20 70 7a 45 72 72 29 3b 0a 20 20 20 20 20  d, pzErr);.     
86e0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6f 6f 6d   if( pParse->oom
86f0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
8700: 20 20 20 69 66 28 20 70 4e 6f 64 65 20 29 7b 0a     if( pNode ){.
8710: 20 20 20 20 20 20 20 20 70 52 6f 6f 74 20 3d 20          pRoot = 
8720: 26 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65 5b 69  &pParse->aNode[i
8730: 52 6f 6f 74 5d 3b 0a 20 20 20 20 20 20 20 20 70  Root];.        p
8740: 52 6f 6f 74 2d 3e 75 2e 69 41 70 70 65 6e 64 20  Root->u.iAppend 
8750: 3d 20 69 53 74 61 72 74 20 2d 20 69 52 6f 6f 74  = iStart - iRoot
8760: 3b 0a 20 20 20 20 20 20 20 20 70 52 6f 6f 74 2d  ;.        pRoot-
8770: 3e 6a 6e 46 6c 61 67 73 20 7c 3d 20 4a 4e 4f 44  >jnFlags |= JNOD
8780: 45 5f 41 50 50 45 4e 44 3b 0a 20 20 20 20 20 20  E_APPEND;.      
8790: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  }.      return p
87a0: 4e 6f 64 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  Node;.    }.  }e
87b0: 6c 73 65 7b 0a 20 20 20 20 2a 70 7a 45 72 72 20  lse{.    *pzErr 
87c0: 3d 20 7a 50 61 74 68 3b 0a 20 20 7d 0a 20 20 72  = zPath;.  }.  r
87d0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
87e0: 2a 20 41 70 70 65 6e 64 20 63 6f 6e 74 65 6e 74  * Append content
87f0: 20 74 6f 20 70 50 61 72 73 65 20 74 68 61 74 20   to pParse that 
8800: 77 69 6c 6c 20 63 6f 6d 70 6c 65 74 65 20 7a 50  will complete zP
8810: 61 74 68 2e 20 20 52 65 74 75 72 6e 20 61 20 70  ath.  Return a p
8820: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
8830: 20 69 6e 73 65 72 74 65 64 20 6e 6f 64 65 2c 20   inserted node, 
8840: 6f 72 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 69  or return NULL i
8850: 66 20 74 68 65 20 61 70 70 65 6e 64 20 66 61 69  f the append fai
8860: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4a 73  ls..*/.static Js
8870: 6f 6e 4e 6f 64 65 20 2a 6a 73 6f 6e 4c 6f 6f 6b  onNode *jsonLook
8880: 75 70 41 70 70 65 6e 64 28 0a 20 20 4a 73 6f 6e  upAppend(.  Json
8890: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
88a0: 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 63 6f 6e     /* Append con
88b0: 74 65 6e 74 20 74 6f 20 74 68 65 20 4a 53 4f 4e  tent to the JSON
88c0: 20 70 61 72 73 65 20 2a 2f 0a 20 20 63 6f 6e 73   parse */.  cons
88d0: 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
88e0: 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f     /* Descriptio
88f0: 6e 20 6f 66 20 63 6f 6e 74 65 6e 74 20 74 6f 20  n of content to 
8900: 61 70 70 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  append */.  int 
8910: 2a 70 41 70 6e 64 2c 20 20 20 20 20 20 20 20 20  *pApnd,         
8920: 20 20 20 2f 2a 20 53 65 74 20 74 68 69 73 20 66     /* Set this f
8930: 6c 61 67 20 74 6f 20 31 20 2a 2f 0a 20 20 63 6f  lag to 1 */.  co
8940: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 45 72 72  nst char **pzErr
8950: 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 74 68 69       /* Make thi
8960: 73 20 70 6f 69 6e 74 20 74 6f 20 61 6e 79 20 73  s point to any s
8970: 79 6e 74 61 78 20 65 72 72 6f 72 20 2a 2f 0a 29  yntax error */.)
8980: 7b 0a 20 20 2a 70 41 70 6e 64 20 3d 20 31 3b 0a  {.  *pApnd = 1;.
8990: 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d    if( zPath[0]==
89a0: 30 20 29 7b 0a 20 20 20 20 6a 73 6f 6e 50 61 72  0 ){.    jsonPar
89b0: 73 65 41 64 64 4e 6f 64 65 28 70 50 61 72 73 65  seAddNode(pParse
89c0: 2c 20 4a 53 4f 4e 5f 4e 55 4c 4c 2c 20 30 2c 20  , JSON_NULL, 0, 
89d0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70  0);.    return p
89e0: 50 61 72 73 65 2d 3e 6f 6f 6d 20 3f 20 30 20 3a  Parse->oom ? 0 :
89f0: 20 26 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65 5b   &pParse->aNode[
8a00: 70 50 61 72 73 65 2d 3e 6e 4e 6f 64 65 2d 31 5d  pParse->nNode-1]
8a10: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 50 61 74  ;.  }.  if( zPat
8a20: 68 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20  h[0]=='.' ){.   
8a30: 20 6a 73 6f 6e 50 61 72 73 65 41 64 64 4e 6f 64   jsonParseAddNod
8a40: 65 28 70 50 61 72 73 65 2c 20 4a 53 4f 4e 5f 4f  e(pParse, JSON_O
8a50: 42 4a 45 43 54 2c 20 30 2c 20 30 29 3b 0a 20 20  BJECT, 0, 0);.  
8a60: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d  }else if( strncm
8a70: 70 28 7a 50 61 74 68 2c 22 5b 30 5d 22 2c 33 29  p(zPath,"[0]",3)
8a80: 3d 3d 30 20 29 7b 0a 20 20 20 20 6a 73 6f 6e 50  ==0 ){.    jsonP
8a90: 61 72 73 65 41 64 64 4e 6f 64 65 28 70 50 61 72  arseAddNode(pPar
8aa0: 73 65 2c 20 4a 53 4f 4e 5f 41 52 52 41 59 2c 20  se, JSON_ARRAY, 
8ab0: 30 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  0, 0);.  }else{.
8ac0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
8ad0: 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  }.  if( pParse->
8ae0: 6f 6f 6d 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  oom ) return 0;.
8af0: 20 20 72 65 74 75 72 6e 20 6a 73 6f 6e 4c 6f 6f    return jsonLoo
8b00: 6b 75 70 53 74 65 70 28 70 50 61 72 73 65 2c 20  kupStep(pParse, 
8b10: 70 50 61 72 73 65 2d 3e 6e 4e 6f 64 65 2d 31 2c  pParse->nNode-1,
8b20: 20 7a 50 61 74 68 2c 20 70 41 70 6e 64 2c 20 70   zPath, pApnd, p
8b30: 7a 45 72 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zErr);.}../*.** 
8b40: 52 65 74 75 72 6e 20 74 68 65 20 74 65 78 74 20  Return the text 
8b50: 6f 66 20 61 20 73 79 6e 74 61 78 20 65 72 72 6f  of a syntax erro
8b60: 72 20 6d 65 73 73 61 67 65 20 6f 6e 20 61 20 4a  r message on a J
8b70: 53 4f 4e 20 70 61 74 68 2e 20 20 53 70 61 63 65  SON path.  Space
8b80: 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20   is.** obtained 
8b90: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
8ba0: 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  loc()..*/.static
8bb0: 20 63 68 61 72 20 2a 6a 73 6f 6e 50 61 74 68 53   char *jsonPathS
8bc0: 79 6e 74 61 78 45 72 72 6f 72 28 63 6f 6e 73 74  yntaxError(const
8bd0: 20 63 68 61 72 20 2a 7a 45 72 72 29 7b 0a 20 20   char *zErr){.  
8be0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d  return sqlite3_m
8bf0: 70 72 69 6e 74 66 28 22 4a 53 4f 4e 20 70 61 74  printf("JSON pat
8c00: 68 20 65 72 72 6f 72 20 6e 65 61 72 20 27 25 71  h error near '%q
8c10: 27 22 2c 20 7a 45 72 72 29 3b 0a 7d 0a 0a 2f 2a  '", zErr);.}../*
8c20: 0a 2a 2a 20 44 6f 20 61 20 6e 6f 64 65 20 6c 6f  .** Do a node lo
8c30: 6f 6b 75 70 20 75 73 69 6e 67 20 7a 50 61 74 68  okup using zPath
8c40: 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
8c50: 74 65 72 20 74 6f 20 74 68 65 20 6e 6f 64 65 20  ter to the node 
8c60: 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 20 52  on success..** R
8c70: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
8c80: 74 20 66 6f 75 6e 64 20 6f 72 20 69 66 20 74 68  t found or if th
8c90: 65 72 65 20 69 73 20 61 6e 20 65 72 72 6f 72 2e  ere is an error.
8ca0: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 61 6e 20 65 72 72  .**.** On an err
8cb0: 6f 72 2c 20 77 72 69 74 65 20 61 6e 20 65 72 72  or, write an err
8cc0: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 74 6f 20  or message into 
8cd0: 70 43 74 78 20 61 6e 64 20 69 6e 63 72 65 6d 65  pCtx and increme
8ce0: 6e 74 20 74 68 65 0a 2a 2a 20 70 50 61 72 73 65  nt the.** pParse
8cf0: 2d 3e 6e 45 72 72 20 63 6f 75 6e 74 65 72 2e 0a  ->nErr counter..
8d00: 2a 2a 0a 2a 2a 20 49 66 20 70 41 70 6e 64 21 3d  **.** If pApnd!=
8d10: 4e 55 4c 4c 20 74 68 65 6e 20 74 72 79 20 74 6f  NULL then try to
8d20: 20 61 70 70 65 6e 64 20 6d 69 73 73 69 6e 67 20   append missing 
8d30: 6e 6f 64 65 73 20 61 6e 64 20 73 65 74 20 2a 70  nodes and set *p
8d40: 41 70 6e 64 20 3d 20 31 20 69 66 0a 2a 2a 20 6e  Apnd = 1 if.** n
8d50: 6f 64 65 73 20 61 72 65 20 61 70 70 65 6e 64 65  odes are appende
8d60: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4a 73 6f  d..*/.static Jso
8d70: 6e 4e 6f 64 65 20 2a 6a 73 6f 6e 4c 6f 6f 6b 75  nNode *jsonLooku
8d80: 70 28 0a 20 20 4a 73 6f 6e 50 61 72 73 65 20 2a  p(.  JsonParse *
8d90: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
8da0: 54 68 65 20 4a 53 4f 4e 20 74 6f 20 73 65 61 72  The JSON to sear
8db0: 63 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ch */.  const ch
8dc0: 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
8dd0: 2f 2a 20 54 68 65 20 70 61 74 68 20 74 6f 20 73  /* The path to s
8de0: 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20 2a  earch */.  int *
8df0: 70 41 70 6e 64 2c 20 20 20 20 20 20 20 20 20 20  pApnd,          
8e00: 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 6e 6f 64     /* Append nod
8e10: 65 73 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 70  es to complete p
8e20: 61 74 68 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20  ath if not NULL 
8e30: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  */.  sqlite3_con
8e40: 74 65 78 74 20 2a 70 43 74 78 20 20 20 2f 2a 20  text *pCtx   /* 
8e50: 52 65 70 6f 72 74 20 65 72 72 6f 72 73 20 68 65  Report errors he
8e60: 72 65 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20  re, if not NULL 
8e70: 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
8e80: 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20  ar *zErr = 0;.  
8e90: 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 20  JsonNode *pNode 
8ea0: 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 73  = 0;.  char *zMs
8eb0: 67 3b 0a 0a 20 20 69 66 28 20 7a 50 61 74 68 3d  g;..  if( zPath=
8ec0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
8ed0: 20 69 66 28 20 7a 50 61 74 68 5b 30 5d 21 3d 27   if( zPath[0]!='
8ee0: 24 27 20 29 7b 0a 20 20 20 20 7a 45 72 72 20 3d  $' ){.    zErr =
8ef0: 20 7a 50 61 74 68 3b 0a 20 20 20 20 67 6f 74 6f   zPath;.    goto
8f00: 20 6c 6f 6f 6b 75 70 5f 65 72 72 3b 0a 20 20 7d   lookup_err;.  }
8f10: 0a 20 20 7a 50 61 74 68 2b 2b 3b 0a 20 20 70 4e  .  zPath++;.  pN
8f20: 6f 64 65 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75 70  ode = jsonLookup
8f30: 53 74 65 70 28 70 50 61 72 73 65 2c 20 30 2c 20  Step(pParse, 0, 
8f40: 7a 50 61 74 68 2c 20 70 41 70 6e 64 2c 20 26 7a  zPath, pApnd, &z
8f50: 45 72 72 29 3b 0a 20 20 69 66 28 20 7a 45 72 72  Err);.  if( zErr
8f60: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 70 4e 6f  ==0 ) return pNo
8f70: 64 65 3b 0a 0a 6c 6f 6f 6b 75 70 5f 65 72 72 3a  de;..lookup_err:
8f80: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b  .  pParse->nErr+
8f90: 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 45 72  +;.  assert( zEr
8fa0: 72 21 3d 30 20 26 26 20 70 43 74 78 21 3d 30 20  r!=0 && pCtx!=0 
8fb0: 29 3b 0a 20 20 7a 4d 73 67 20 3d 20 6a 73 6f 6e  );.  zMsg = json
8fc0: 50 61 74 68 53 79 6e 74 61 78 45 72 72 6f 72 28  PathSyntaxError(
8fd0: 7a 45 72 72 29 3b 0a 20 20 69 66 28 20 7a 4d 73  zErr);.  if( zMs
8fe0: 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  g ){.    sqlite3
8ff0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43  _result_error(pC
9000: 74 78 2c 20 7a 4d 73 67 2c 20 2d 31 29 3b 0a 20  tx, zMsg, -1);. 
9010: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
9020: 7a 4d 73 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  zMsg);.  }else{.
9030: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
9040: 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 70  lt_error_nomem(p
9050: 43 74 78 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Ctx);.  }.  retu
9060: 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn 0;.}.../*.** 
9070: 52 65 70 6f 72 74 20 74 68 65 20 77 72 6f 6e 67  Report the wrong
9080: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
9090: 65 6e 74 73 20 66 6f 72 20 6a 73 6f 6e 5f 69 6e  ents for json_in
90a0: 73 65 72 74 28 29 2c 20 6a 73 6f 6e 5f 72 65 70  sert(), json_rep
90b0: 6c 61 63 65 28 29 0a 2a 2a 20 6f 72 20 6a 73 6f  lace().** or jso
90c0: 6e 5f 73 65 74 28 29 2e 0a 2a 2f 0a 73 74 61 74  n_set()..*/.stat
90d0: 69 63 20 76 6f 69 64 20 6a 73 6f 6e 57 72 6f 6e  ic void jsonWron
90e0: 67 4e 75 6d 41 72 67 73 28 0a 20 20 73 71 6c 69  gNumArgs(.  sqli
90f0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
9100: 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  x,.  const char 
9110: 2a 7a 46 75 6e 63 4e 61 6d 65 0a 29 7b 0a 20 20  *zFuncName.){.  
9120: 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c  char *zMsg = sql
9130: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6a 73  ite3_mprintf("js
9140: 6f 6e 5f 25 73 28 29 20 6e 65 65 64 73 20 61 6e  on_%s() needs an
9150: 20 6f 64 64 20 6e 75 6d 62 65 72 20 6f 66 20 61   odd number of a
9160: 72 67 75 6d 65 6e 74 73 22 2c 0a 20 20 20 20 20  rguments",.     
9170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9180: 20 20 20 20 20 20 20 20 20 20 7a 46 75 6e 63 4e            zFuncN
9190: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ame);.  sqlite3_
91a0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74  result_error(pCt
91b0: 78 2c 20 7a 4d 73 67 2c 20 2d 31 29 3b 0a 20 20  x, zMsg, -1);.  
91c0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 73  sqlite3_free(zMs
91d0: 67 29 3b 20 20 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a  g);     .}../*.*
91e0: 2a 20 4d 61 72 6b 20 61 6c 6c 20 4e 55 4c 4c 20  * Mark all NULL 
91f0: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 4f  entries in the O
9200: 62 6a 65 63 74 20 70 61 73 73 65 64 20 69 6e 20  bject passed in 
9210: 61 73 20 4a 4e 4f 44 45 5f 52 45 4d 4f 56 45 2e  as JNODE_REMOVE.
9220: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9230: 6a 73 6f 6e 52 65 6d 6f 76 65 41 6c 6c 4e 75 6c  jsonRemoveAllNul
9240: 6c 73 28 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f  ls(JsonNode *pNo
9250: 64 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b  de){.  int i, n;
9260: 0a 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65  .  assert( pNode
9270: 2d 3e 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f 4f 42  ->eType==JSON_OB
9280: 4a 45 43 54 20 29 3b 0a 20 20 6e 20 3d 20 70 4e  JECT );.  n = pN
9290: 6f 64 65 2d 3e 6e 3b 0a 20 20 66 6f 72 28 69 3d  ode->n;.  for(i=
92a0: 32 3b 20 69 3c 3d 6e 3b 20 69 20 2b 3d 20 6a 73  2; i<=n; i += js
92b0: 6f 6e 4e 6f 64 65 53 69 7a 65 28 26 70 4e 6f 64  onNodeSize(&pNod
92c0: 65 5b 69 5d 29 2b 31 29 7b 0a 20 20 20 20 73 77  e[i])+1){.    sw
92d0: 69 74 63 68 28 20 70 4e 6f 64 65 5b 69 5d 2e 65  itch( pNode[i].e
92e0: 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61  Type ){.      ca
92f0: 73 65 20 4a 53 4f 4e 5f 4e 55 4c 4c 3a 0a 20 20  se JSON_NULL:.  
9300: 20 20 20 20 20 20 70 4e 6f 64 65 5b 69 5d 2e 6a        pNode[i].j
9310: 6e 46 6c 61 67 73 20 7c 3d 20 4a 4e 4f 44 45 5f  nFlags |= JNODE_
9320: 52 45 4d 4f 56 45 3b 0a 20 20 20 20 20 20 20 20  REMOVE;.        
9330: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
9340: 65 20 4a 53 4f 4e 5f 4f 42 4a 45 43 54 3a 0a 20  e JSON_OBJECT:. 
9350: 20 20 20 20 20 20 20 6a 73 6f 6e 52 65 6d 6f 76         jsonRemov
9360: 65 41 6c 6c 4e 75 6c 6c 73 28 26 70 4e 6f 64 65  eAllNulls(&pNode
9370: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 62 72  [i]);.        br
9380: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  eak;.    }.  }.}
9390: 0a 0a 0a 2f 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 2a 2a 2a 2a 2a 2a  ****************
93e0: 0a 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  .** SQL function
93f0: 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
9400: 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ng and debugging
9410: 0a 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 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
9460: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
9470: 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 73  BUG./*.** The js
9480: 6f 6e 5f 70 61 72 73 65 28 4a 53 4f 4e 29 20 66  on_parse(JSON) f
9490: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
94a0: 61 20 73 74 72 69 6e 67 20 77 68 69 63 68 20 64  a string which d
94b0: 65 73 63 72 69 62 65 73 0a 2a 2a 20 61 20 70 61  escribes.** a pa
94c0: 72 73 65 20 6f 66 20 74 68 65 20 4a 53 4f 4e 20  rse of the JSON 
94d0: 70 72 6f 76 69 64 65 64 2e 20 20 4f 72 20 69 74  provided.  Or it
94e0: 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66   returns NULL if
94f0: 20 4a 53 4f 4e 20 69 73 20 6e 6f 74 0a 2a 2a 20   JSON is not.** 
9500: 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 0a 2a 2f 0a  well-formed..*/.
9510: 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e  static void json
9520: 50 61 72 73 65 46 75 6e 63 28 0a 20 20 73 71 6c  ParseFunc(.  sql
9530: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74  ite3_context *ct
9540: 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  x,.  int argc,. 
9550: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
9560: 2a 61 72 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e 53  *argv.){.  JsonS
9570: 74 72 69 6e 67 20 73 3b 20 20 20 20 20 20 20 2f  tring s;       /
9580: 2a 20 4f 75 74 70 75 74 20 73 74 72 69 6e 67 20  * Output string 
9590: 2d 20 6e 6f 74 20 72 65 61 6c 20 4a 53 4f 4e 20  - not real JSON 
95a0: 2a 2f 0a 20 20 4a 73 6f 6e 50 61 72 73 65 20 78  */.  JsonParse x
95b0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
95c0: 70 61 72 73 65 20 2a 2f 0a 20 20 75 33 32 20 69  parse */.  u32 i
95d0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 72 67  ;..  assert( arg
95e0: 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 6a 73  c==1 );.  if( js
95f0: 6f 6e 50 61 72 73 65 28 26 78 2c 20 63 74 78 2c  onParse(&x, ctx,
9600: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
9610: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
9620: 28 61 72 67 76 5b 30 5d 29 29 20 29 20 72 65 74  (argv[0])) ) ret
9630: 75 72 6e 3b 0a 20 20 6a 73 6f 6e 50 61 72 73 65  urn;.  jsonParse
9640: 46 69 6e 64 50 61 72 65 6e 74 73 28 26 78 29 3b  FindParents(&x);
9650: 0a 20 20 6a 73 6f 6e 49 6e 69 74 28 26 73 2c 20  .  jsonInit(&s, 
9660: 63 74 78 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ctx);.  for(i=0;
9670: 20 69 3c 78 2e 6e 4e 6f 64 65 3b 20 69 2b 2b 29   i<x.nNode; i++)
9680: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
9690: 20 2a 7a 54 79 70 65 3b 0a 20 20 20 20 69 66 28   *zType;.    if(
96a0: 20 78 2e 61 4e 6f 64 65 5b 69 5d 2e 6a 6e 46 6c   x.aNode[i].jnFl
96b0: 61 67 73 20 26 20 4a 4e 4f 44 45 5f 4c 41 42 45  ags & JNODE_LABE
96c0: 4c 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  L ){.      asser
96d0: 74 28 20 78 2e 61 4e 6f 64 65 5b 69 5d 2e 65 54  t( x.aNode[i].eT
96e0: 79 70 65 3d 3d 4a 53 4f 4e 5f 53 54 52 49 4e 47  ype==JSON_STRING
96f0: 20 29 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20   );.      zType 
9700: 3d 20 22 6c 61 62 65 6c 22 3b 0a 20 20 20 20 7d  = "label";.    }
9710: 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 54 79 70  else{.      zTyp
9720: 65 20 3d 20 6a 73 6f 6e 54 79 70 65 5b 78 2e 61  e = jsonType[x.a
9730: 4e 6f 64 65 5b 69 5d 2e 65 54 79 70 65 5d 3b 0a  Node[i].eType];.
9740: 20 20 20 20 7d 0a 20 20 20 20 6a 73 6f 6e 50 72      }.    jsonPr
9750: 69 6e 74 66 28 31 30 30 2c 20 26 73 2c 22 6e 6f  intf(100, &s,"no
9760: 64 65 20 25 33 75 3a 20 25 37 73 20 6e 3d 25 2d  de %3u: %7s n=%-
9770: 34 64 20 75 70 3d 25 2d 34 64 22 2c 0a 20 20 20  4d up=%-4d",.   
9780: 20 20 20 20 20 20 20 20 20 20 20 20 69 2c 20 7a              i, z
9790: 54 79 70 65 2c 20 78 2e 61 4e 6f 64 65 5b 69 5d  Type, x.aNode[i]
97a0: 2e 6e 2c 20 78 2e 61 55 70 5b 69 5d 29 3b 0a 20  .n, x.aUp[i]);. 
97b0: 20 20 20 69 66 28 20 78 2e 61 4e 6f 64 65 5b 69     if( x.aNode[i
97c0: 5d 2e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 21 3d 30  ].u.zJContent!=0
97d0: 20 29 7b 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70   ){.      jsonAp
97e0: 70 65 6e 64 52 61 77 28 26 73 2c 20 22 20 22 2c  pendRaw(&s, " ",
97f0: 20 31 29 3b 0a 20 20 20 20 20 20 6a 73 6f 6e 41   1);.      jsonA
9800: 70 70 65 6e 64 52 61 77 28 26 73 2c 20 78 2e 61  ppendRaw(&s, x.a
9810: 4e 6f 64 65 5b 69 5d 2e 75 2e 7a 4a 43 6f 6e 74  Node[i].u.zJCont
9820: 65 6e 74 2c 20 78 2e 61 4e 6f 64 65 5b 69 5d 2e  ent, x.aNode[i].
9830: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 73  n);.    }.    js
9840: 6f 6e 41 70 70 65 6e 64 52 61 77 28 26 73 2c 20  onAppendRaw(&s, 
9850: 22 5c 6e 22 2c 20 31 29 3b 0a 20 20 7d 0a 20 20  "\n", 1);.  }.  
9860: 6a 73 6f 6e 50 61 72 73 65 52 65 73 65 74 28 26  jsonParseReset(&
9870: 78 29 3b 0a 20 20 6a 73 6f 6e 52 65 73 75 6c 74  x);.  jsonResult
9880: 28 26 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  (&s);.}../*.** T
9890: 68 65 20 6a 73 6f 6e 5f 74 65 73 74 31 28 4a 53  he json_test1(JS
98a0: 4f 4e 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  ON) function ret
98b0: 75 72 6e 20 74 72 75 65 20 28 31 29 20 69 66 20  urn true (1) if 
98c0: 74 68 65 20 69 6e 70 75 74 20 69 73 20 4a 53 4f  the input is JSO
98d0: 4e 0a 2a 2a 20 74 65 78 74 20 67 65 6e 65 72 61  N.** text genera
98e0: 74 65 64 20 62 79 20 61 6e 6f 74 68 65 72 20 6a  ted by another j
98f0: 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49  son function.  I
9900: 74 20 72 65 74 75 72 6e 73 20 28 30 29 20 69 66  t returns (0) if
9910: 20 74 68 65 20 69 6e 70 75 74 0a 2a 2a 20 69 73   the input.** is
9920: 20 6e 6f 74 20 6b 6e 6f 77 6e 20 74 6f 20 62 65   not known to be
9930: 20 4a 53 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63   JSON..*/.static
9940: 20 76 6f 69 64 20 6a 73 6f 6e 54 65 73 74 31 46   void jsonTest1F
9950: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
9960: 6f 6e 74 65 78 74 20 2a 63 74 78 2c 0a 20 20 69  ontext *ctx,.  i
9970: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
9980: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
9990: 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
99a0: 4d 28 61 72 67 63 29 3b 0a 20 20 73 71 6c 69 74  M(argc);.  sqlit
99b0: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 74  e3_result_int(ct
99c0: 78 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  x, sqlite3_value
99d0: 5f 73 75 62 74 79 70 65 28 61 72 67 76 5b 30 5d  _subtype(argv[0]
99e0: 29 3d 3d 4a 53 4f 4e 5f 53 55 42 54 59 50 45 29  )==JSON_SUBTYPE)
99f0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
9a00: 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f  LITE_DEBUG */../
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 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
9a60: 53 63 61 6c 61 72 20 53 51 4c 20 66 75 6e 63 74  Scalar SQL funct
9a70: 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ion implementati
9a80: 6f 6e 73 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ons.************
9a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9ad0: 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  /../*.** Impleme
9ae0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a  ntation of the j
9af0: 73 6f 6e 5f 51 55 4f 54 45 28 56 41 4c 55 45 29  son_QUOTE(VALUE)
9b00: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 52 65 74 75   function.  Retu
9b10: 72 6e 20 61 20 4a 53 4f 4e 20 76 61 6c 75 65 0a  rn a JSON value.
9b20: 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
9b30: 20 74 6f 20 74 68 65 20 53 51 4c 20 76 61 6c 75   to the SQL valu
9b40: 65 20 69 6e 70 75 74 2e 20 20 4d 6f 73 74 6c 79  e input.  Mostly
9b50: 20 74 68 69 73 20 6d 65 61 6e 73 20 70 75 74 74   this means putt
9b60: 69 6e 67 20 0a 2a 2a 20 64 6f 75 62 6c 65 2d 71  ing .** double-q
9b70: 75 6f 74 65 73 20 61 72 6f 75 6e 64 20 73 74 72  uotes around str
9b80: 69 6e 67 73 20 61 6e 64 20 72 65 74 75 72 6e 69  ings and returni
9b90: 6e 67 20 74 68 65 20 75 6e 71 75 6f 74 65 64 20  ng the unquoted 
9ba0: 73 74 72 69 6e 67 20 22 6e 75 6c 6c 22 0a 2a 2a  string "null".**
9bb0: 20 77 68 65 6e 20 67 69 76 65 6e 20 61 20 4e 55   when given a NU
9bc0: 4c 4c 20 69 6e 70 75 74 2e 0a 2a 2f 0a 73 74 61  LL input..*/.sta
9bd0: 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 51 75 6f  tic void jsonQuo
9be0: 74 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  teFunc(.  sqlite
9bf0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 0a  3_context *ctx,.
9c00: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
9c10: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
9c20: 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e 53 74 72 69  gv.){.  JsonStri
9c30: 6e 67 20 6a 78 3b 0a 20 20 55 4e 55 53 45 44 5f  ng jx;.  UNUSED_
9c40: 50 41 52 41 4d 28 61 72 67 63 29 3b 0a 0a 20 20  PARAM(argc);..  
9c50: 6a 73 6f 6e 49 6e 69 74 28 26 6a 78 2c 20 63 74  jsonInit(&jx, ct
9c60: 78 29 3b 0a 20 20 6a 73 6f 6e 41 70 70 65 6e 64  x);.  jsonAppend
9c70: 56 61 6c 75 65 28 26 6a 78 2c 20 61 72 67 76 5b  Value(&jx, argv[
9c80: 30 5d 29 3b 0a 20 20 6a 73 6f 6e 52 65 73 75 6c  0]);.  jsonResul
9c90: 74 28 26 6a 78 29 3b 0a 20 20 73 71 6c 69 74 65  t(&jx);.  sqlite
9ca0: 33 5f 72 65 73 75 6c 74 5f 73 75 62 74 79 70 65  3_result_subtype
9cb0: 28 63 74 78 2c 20 4a 53 4f 4e 5f 53 55 42 54 59  (ctx, JSON_SUBTY
9cc0: 50 45 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  PE);.}../*.** Im
9cd0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
9ce0: 74 68 65 20 6a 73 6f 6e 5f 61 72 72 61 79 28 56  the json_array(V
9cf0: 41 4c 55 45 2c 2e 2e 2e 29 20 66 75 6e 63 74 69  ALUE,...) functi
9d00: 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 20 4a 53  on.  Return a JS
9d10: 4f 4e 0a 2a 2a 20 61 72 72 61 79 20 74 68 61 74  ON.** array that
9d20: 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 76 61   contains all va
9d30: 6c 75 65 73 20 67 69 76 65 6e 20 69 6e 20 61 72  lues given in ar
9d40: 67 75 6d 65 6e 74 73 2e 20 20 4f 72 20 69 66 20  guments.  Or if 
9d50: 61 6e 79 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  any argument.** 
9d60: 69 73 20 61 20 42 4c 4f 42 2c 20 74 68 72 6f 77  is a BLOB, throw
9d70: 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74   an error..*/.st
9d80: 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 41 72  atic void jsonAr
9d90: 72 61 79 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  rayFunc(.  sqlit
9da0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c  e3_context *ctx,
9db0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
9dc0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
9dd0: 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  rgv.){.  int i;.
9de0: 20 20 4a 73 6f 6e 53 74 72 69 6e 67 20 6a 78 3b    JsonString jx;
9df0: 0a 0a 20 20 6a 73 6f 6e 49 6e 69 74 28 26 6a 78  ..  jsonInit(&jx
9e00: 2c 20 63 74 78 29 3b 0a 20 20 6a 73 6f 6e 41 70  , ctx);.  jsonAp
9e10: 70 65 6e 64 43 68 61 72 28 26 6a 78 2c 20 27 5b  pendChar(&jx, '[
9e20: 27 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ');.  for(i=0; i
9e30: 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <argc; i++){.   
9e40: 20 6a 73 6f 6e 41 70 70 65 6e 64 53 65 70 61 72   jsonAppendSepar
9e50: 61 74 6f 72 28 26 6a 78 29 3b 0a 20 20 20 20 6a  ator(&jx);.    j
9e60: 73 6f 6e 41 70 70 65 6e 64 56 61 6c 75 65 28 26  sonAppendValue(&
9e70: 6a 78 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20  jx, argv[i]);.  
9e80: 7d 0a 20 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68  }.  jsonAppendCh
9e90: 61 72 28 26 6a 78 2c 20 27 5d 27 29 3b 0a 20 20  ar(&jx, ']');.  
9ea0: 6a 73 6f 6e 52 65 73 75 6c 74 28 26 6a 78 29 3b  jsonResult(&jx);
9eb0: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
9ec0: 74 5f 73 75 62 74 79 70 65 28 63 74 78 2c 20 4a  t_subtype(ctx, J
9ed0: 53 4f 4e 5f 53 55 42 54 59 50 45 29 3b 0a 7d 0a  SON_SUBTYPE);.}.
9ee0: 0a 0a 2f 2a 0a 2a 2a 20 6a 73 6f 6e 5f 61 72 72  ../*.** json_arr
9ef0: 61 79 5f 6c 65 6e 67 74 68 28 4a 53 4f 4e 29 0a  ay_length(JSON).
9f00: 2a 2a 20 6a 73 6f 6e 5f 61 72 72 61 79 5f 6c 65  ** json_array_le
9f10: 6e 67 74 68 28 4a 53 4f 4e 2c 20 50 41 54 48 29  ngth(JSON, PATH)
9f20: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
9f30: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
9f40: 65 6e 74 73 20 69 6e 20 74 68 65 20 74 6f 70 2d  ents in the top-
9f50: 6c 65 76 65 6c 20 4a 53 4f 4e 20 61 72 72 61 79  level JSON array
9f60: 2e 20 20 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  .  .** Return 0 
9f70: 69 66 20 74 68 65 20 69 6e 70 75 74 20 69 73 20  if the input is 
9f80: 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65  not a well-forme
9f90: 64 20 4a 53 4f 4e 20 61 72 72 61 79 2e 0a 2a 2f  d JSON array..*/
9fa0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f  .static void jso
9fb0: 6e 41 72 72 61 79 4c 65 6e 67 74 68 46 75 6e 63  nArrayLengthFunc
9fc0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
9fd0: 65 78 74 20 2a 63 74 78 2c 0a 20 20 69 6e 74 20  ext *ctx,.  int 
9fe0: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
9ff0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
a000: 20 20 4a 73 6f 6e 50 61 72 73 65 20 2a 70 3b 20    JsonParse *p; 
a010: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
a020: 70 61 72 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  parse */.  sqlit
a030: 65 33 5f 69 6e 74 36 34 20 6e 20 3d 20 30 3b 0a  e3_int64 n = 0;.
a040: 20 20 75 33 32 20 69 3b 0a 20 20 4a 73 6f 6e 4e    u32 i;.  JsonN
a050: 6f 64 65 20 2a 70 4e 6f 64 65 3b 0a 0a 20 20 70  ode *pNode;..  p
a060: 20 3d 20 6a 73 6f 6e 50 61 72 73 65 43 61 63 68   = jsonParseCach
a070: 65 64 28 63 74 78 2c 20 61 72 67 76 2c 20 63 74  ed(ctx, argv, ct
a080: 78 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  x);.  if( p==0 )
a090: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
a0a0: 74 28 20 70 2d 3e 6e 4e 6f 64 65 20 29 3b 0a 20  t( p->nNode );. 
a0b0: 20 69 66 28 20 61 72 67 63 3d 3d 32 20 29 7b 0a   if( argc==2 ){.
a0c0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
a0d0: 7a 50 61 74 68 20 3d 20 28 63 6f 6e 73 74 20 63  zPath = (const c
a0e0: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
a0f0: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29  ue_text(argv[1])
a100: 3b 0a 20 20 20 20 70 4e 6f 64 65 20 3d 20 6a 73  ;.    pNode = js
a110: 6f 6e 4c 6f 6f 6b 75 70 28 70 2c 20 7a 50 61 74  onLookup(p, zPat
a120: 68 2c 20 30 2c 20 63 74 78 29 3b 0a 20 20 7d 65  h, 0, ctx);.  }e
a130: 6c 73 65 7b 0a 20 20 20 20 70 4e 6f 64 65 20 3d  lse{.    pNode =
a140: 20 70 2d 3e 61 4e 6f 64 65 3b 0a 20 20 7d 0a 20   p->aNode;.  }. 
a150: 20 69 66 28 20 70 4e 6f 64 65 3d 3d 30 20 29 7b   if( pNode==0 ){
a160: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
a170: 0a 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 65 54  .  if( pNode->eT
a180: 79 70 65 3d 3d 4a 53 4f 4e 5f 41 52 52 41 59 20  ype==JSON_ARRAY 
a190: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  ){.    assert( (
a1a0: 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73 20 26  pNode->jnFlags &
a1b0: 20 4a 4e 4f 44 45 5f 41 50 50 45 4e 44 29 3d 3d   JNODE_APPEND)==
a1c0: 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31  0 );.    for(i=1
a1d0: 3b 20 69 3c 3d 70 4e 6f 64 65 2d 3e 6e 3b 20 6e  ; i<=pNode->n; n
a1e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 20 2b 3d 20  ++){.      i += 
a1f0: 6a 73 6f 6e 4e 6f 64 65 53 69 7a 65 28 26 70 4e  jsonNodeSize(&pN
a200: 6f 64 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  ode[i]);.    }. 
a210: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73   }.  sqlite3_res
a220: 75 6c 74 5f 69 6e 74 36 34 28 63 74 78 2c 20 6e  ult_int64(ctx, n
a230: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 6a 73 6f 6e  );.}../*.** json
a240: 5f 65 78 74 72 61 63 74 28 4a 53 4f 4e 2c 20 50  _extract(JSON, P
a250: 41 54 48 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20  ATH, ...).**.** 
a260: 52 65 74 75 72 6e 20 74 68 65 20 65 6c 65 6d 65  Return the eleme
a270: 6e 74 20 64 65 73 63 72 69 62 65 64 20 62 79 20  nt described by 
a280: 50 41 54 48 2e 20 20 52 65 74 75 72 6e 20 4e 55  PATH.  Return NU
a290: 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  LL if there is n
a2a0: 6f 0a 2a 2a 20 50 41 54 48 20 65 6c 65 6d 65 6e  o.** PATH elemen
a2b0: 74 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65  t.  If there are
a2c0: 20 6d 75 6c 74 69 70 6c 65 20 50 41 54 48 73 2c   multiple PATHs,
a2d0: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20 4a   then return a J
a2e0: 53 4f 4e 20 61 72 72 61 79 0a 2a 2a 20 77 69 74  SON array.** wit
a2f0: 68 20 74 68 65 20 72 65 73 75 6c 74 20 66 72 6f  h the result fro
a300: 6d 20 65 61 63 68 20 70 61 74 68 2e 20 20 54 68  m each path.  Th
a310: 72 6f 77 20 61 6e 20 65 72 72 6f 72 20 69 66 20  row an error if 
a320: 74 68 65 20 4a 53 4f 4e 20 6f 72 20 61 6e 79 20  the JSON or any 
a330: 50 41 54 48 0a 2a 2a 20 69 73 20 6d 61 6c 66 6f  PATH.** is malfo
a340: 72 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rmed..*/.static 
a350: 76 6f 69 64 20 6a 73 6f 6e 45 78 74 72 61 63 74  void jsonExtract
a360: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
a370: 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 0a 20 20  context *ctx,.  
a380: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
a390: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
a3a0: 0a 29 7b 0a 20 20 4a 73 6f 6e 50 61 72 73 65 20  .){.  JsonParse 
a3b0: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  *p;          /* 
a3c0: 54 68 65 20 70 61 72 73 65 20 2a 2f 0a 20 20 4a  The parse */.  J
a3d0: 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 3b 0a  sonNode *pNode;.
a3e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
a3f0: 61 74 68 3b 0a 20 20 4a 73 6f 6e 53 74 72 69 6e  ath;.  JsonStrin
a400: 67 20 6a 78 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  g jx;.  int i;..
a410: 20 20 69 66 28 20 61 72 67 63 3c 32 20 29 20 72    if( argc<2 ) r
a420: 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20 6a 73 6f  eturn;.  p = jso
a430: 6e 50 61 72 73 65 43 61 63 68 65 64 28 63 74 78  nParseCached(ctx
a440: 2c 20 61 72 67 76 2c 20 63 74 78 29 3b 0a 20 20  , argv, ctx);.  
a450: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
a460: 6e 3b 0a 20 20 6a 73 6f 6e 49 6e 69 74 28 26 6a  n;.  jsonInit(&j
a470: 78 2c 20 63 74 78 29 3b 0a 20 20 6a 73 6f 6e 41  x, ctx);.  jsonA
a480: 70 70 65 6e 64 43 68 61 72 28 26 6a 78 2c 20 27  ppendChar(&jx, '
a490: 5b 27 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20  [');.  for(i=1; 
a4a0: 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<argc; i++){.  
a4b0: 20 20 7a 50 61 74 68 20 3d 20 28 63 6f 6e 73 74    zPath = (const
a4c0: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
a4d0: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 69  alue_text(argv[i
a4e0: 5d 29 3b 0a 20 20 20 20 70 4e 6f 64 65 20 3d 20  ]);.    pNode = 
a4f0: 6a 73 6f 6e 4c 6f 6f 6b 75 70 28 70 2c 20 7a 50  jsonLookup(p, zP
a500: 61 74 68 2c 20 30 2c 20 63 74 78 29 3b 0a 20 20  ath, 0, ctx);.  
a510: 20 20 69 66 28 20 70 2d 3e 6e 45 72 72 20 29 20    if( p->nErr ) 
a520: 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 61  break;.    if( a
a530: 72 67 63 3e 32 20 29 7b 0a 20 20 20 20 20 20 6a  rgc>2 ){.      j
a540: 73 6f 6e 41 70 70 65 6e 64 53 65 70 61 72 61 74  sonAppendSeparat
a550: 6f 72 28 26 6a 78 29 3b 0a 20 20 20 20 20 20 69  or(&jx);.      i
a560: 66 28 20 70 4e 6f 64 65 20 29 7b 0a 20 20 20 20  f( pNode ){.    
a570: 20 20 20 20 6a 73 6f 6e 52 65 6e 64 65 72 4e 6f      jsonRenderNo
a580: 64 65 28 70 4e 6f 64 65 2c 20 26 6a 78 2c 20 30  de(pNode, &jx, 0
a590: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
a5a0: 20 20 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65          jsonAppe
a5b0: 6e 64 52 61 77 28 26 6a 78 2c 20 22 6e 75 6c 6c  ndRaw(&jx, "null
a5c0: 22 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ", 4);.      }. 
a5d0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4e 6f     }else if( pNo
a5e0: 64 65 20 29 7b 0a 20 20 20 20 20 20 6a 73 6f 6e  de ){.      json
a5f0: 52 65 74 75 72 6e 28 70 4e 6f 64 65 2c 20 63 74  Return(pNode, ct
a600: 78 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  x, 0);.    }.  }
a610: 0a 20 20 69 66 28 20 61 72 67 63 3e 32 20 26 26  .  if( argc>2 &&
a620: 20 69 3d 3d 61 72 67 63 20 29 7b 0a 20 20 20 20   i==argc ){.    
a630: 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61 72 28 26  jsonAppendChar(&
a640: 6a 78 2c 20 27 5d 27 29 3b 0a 20 20 20 20 6a 73  jx, ']');.    js
a650: 6f 6e 52 65 73 75 6c 74 28 26 6a 78 29 3b 0a 20  onResult(&jx);. 
a660: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
a670: 74 5f 73 75 62 74 79 70 65 28 63 74 78 2c 20 4a  t_subtype(ctx, J
a680: 53 4f 4e 5f 53 55 42 54 59 50 45 29 3b 0a 20 20  SON_SUBTYPE);.  
a690: 7d 0a 20 20 6a 73 6f 6e 52 65 73 65 74 28 26 6a  }.  jsonReset(&j
a6a0: 78 29 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73 20 69  x);.}../* This i
a6b0: 73 20 74 68 65 20 52 46 43 20 37 33 39 36 20 4d  s the RFC 7396 M
a6c0: 65 72 67 65 50 61 74 63 68 20 61 6c 67 6f 72 69  ergePatch algori
a6d0: 74 68 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4a  thm..*/.static J
a6e0: 73 6f 6e 4e 6f 64 65 20 2a 6a 73 6f 6e 4d 65 72  sonNode *jsonMer
a6f0: 67 65 50 61 74 63 68 28 0a 20 20 4a 73 6f 6e 50  gePatch(.  JsonP
a700: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
a710: 2f 2a 20 54 68 65 20 4a 53 4f 4e 20 70 61 72 73  /* The JSON pars
a720: 65 72 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  er that contains
a730: 20 74 68 65 20 54 41 52 47 45 54 20 2a 2f 0a 20   the TARGET */. 
a740: 20 75 33 32 20 69 54 61 72 67 65 74 2c 20 20 20   u32 iTarget,   
a750: 20 20 20 20 20 20 2f 2a 20 4e 6f 64 65 20 6f 66        /* Node of
a760: 20 74 68 65 20 54 41 52 47 45 54 20 69 6e 20 70   the TARGET in p
a770: 50 61 72 73 65 20 2a 2f 0a 20 20 4a 73 6f 6e 4e  Parse */.  JsonN
a780: 6f 64 65 20 2a 70 50 61 74 63 68 20 20 20 20 20  ode *pPatch     
a790: 2f 2a 20 54 68 65 20 50 41 54 43 48 20 2a 2f 0a  /* The PATCH */.
a7a0: 29 7b 0a 20 20 75 33 32 20 69 2c 20 6a 3b 0a 20  ){.  u32 i, j;. 
a7b0: 20 75 33 32 20 69 52 6f 6f 74 3b 0a 20 20 4a 73   u32 iRoot;.  Js
a7c0: 6f 6e 4e 6f 64 65 20 2a 70 54 61 72 67 65 74 3b  onNode *pTarget;
a7d0: 0a 20 20 69 66 28 20 70 50 61 74 63 68 2d 3e 65  .  if( pPatch->e
a7e0: 54 79 70 65 21 3d 4a 53 4f 4e 5f 4f 42 4a 45 43  Type!=JSON_OBJEC
a7f0: 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  T ){.    return 
a800: 70 50 61 74 63 68 3b 0a 20 20 7d 0a 20 20 61 73  pPatch;.  }.  as
a810: 73 65 72 74 28 20 69 54 61 72 67 65 74 3e 3d 30  sert( iTarget>=0
a820: 20 26 26 20 69 54 61 72 67 65 74 3c 70 50 61 72   && iTarget<pPar
a830: 73 65 2d 3e 6e 4e 6f 64 65 20 29 3b 0a 20 20 70  se->nNode );.  p
a840: 54 61 72 67 65 74 20 3d 20 26 70 50 61 72 73 65  Target = &pParse
a850: 2d 3e 61 4e 6f 64 65 5b 69 54 61 72 67 65 74 5d  ->aNode[iTarget]
a860: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 50 61  ;.  assert( (pPa
a870: 74 63 68 2d 3e 6a 6e 46 6c 61 67 73 20 26 20 4a  tch->jnFlags & J
a880: 4e 4f 44 45 5f 41 50 50 45 4e 44 29 3d 3d 30 20  NODE_APPEND)==0 
a890: 29 3b 0a 20 20 69 66 28 20 70 54 61 72 67 65 74  );.  if( pTarget
a8a0: 2d 3e 65 54 79 70 65 21 3d 4a 53 4f 4e 5f 4f 42  ->eType!=JSON_OB
a8b0: 4a 45 43 54 20 29 7b 0a 20 20 20 20 6a 73 6f 6e  JECT ){.    json
a8c0: 52 65 6d 6f 76 65 41 6c 6c 4e 75 6c 6c 73 28 70  RemoveAllNulls(p
a8d0: 50 61 74 63 68 29 3b 0a 20 20 20 20 72 65 74 75  Patch);.    retu
a8e0: 72 6e 20 70 50 61 74 63 68 3b 0a 20 20 7d 0a 20  rn pPatch;.  }. 
a8f0: 20 69 52 6f 6f 74 20 3d 20 69 54 61 72 67 65 74   iRoot = iTarget
a900: 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70  ;.  for(i=1; i<p
a910: 50 61 74 63 68 2d 3e 6e 3b 20 69 20 2b 3d 20 6a  Patch->n; i += j
a920: 73 6f 6e 4e 6f 64 65 53 69 7a 65 28 26 70 50 61  sonNodeSize(&pPa
a930: 74 63 68 5b 69 2b 31 5d 29 2b 31 29 7b 0a 20 20  tch[i+1])+1){.  
a940: 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 20 20    u32 nKey;.    
a950: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65 79  const char *zKey
a960: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
a970: 61 74 63 68 5b 69 5d 2e 65 54 79 70 65 3d 3d 4a  atch[i].eType==J
a980: 53 4f 4e 5f 53 54 52 49 4e 47 20 29 3b 0a 20 20  SON_STRING );.  
a990: 20 20 61 73 73 65 72 74 28 20 70 50 61 74 63 68    assert( pPatch
a9a0: 5b 69 5d 2e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e  [i].jnFlags & JN
a9b0: 4f 44 45 5f 4c 41 42 45 4c 20 29 3b 0a 20 20 20  ODE_LABEL );.   
a9c0: 20 6e 4b 65 79 20 3d 20 70 50 61 74 63 68 5b 69   nKey = pPatch[i
a9d0: 5d 2e 6e 3b 0a 20 20 20 20 7a 4b 65 79 20 3d 20  ].n;.    zKey = 
a9e0: 70 50 61 74 63 68 5b 69 5d 2e 75 2e 7a 4a 43 6f  pPatch[i].u.zJCo
a9f0: 6e 74 65 6e 74 3b 0a 20 20 20 20 61 73 73 65 72  ntent;.    asser
aa00: 74 28 20 28 70 50 61 74 63 68 5b 69 5d 2e 6a 6e  t( (pPatch[i].jn
aa10: 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 52 41  Flags & JNODE_RA
aa20: 57 29 3d 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72  W)==0 );.    for
aa30: 28 6a 3d 31 3b 20 6a 3c 70 54 61 72 67 65 74 2d  (j=1; j<pTarget-
aa40: 3e 6e 3b 20 6a 20 2b 3d 20 6a 73 6f 6e 4e 6f 64  >n; j += jsonNod
aa50: 65 53 69 7a 65 28 26 70 54 61 72 67 65 74 5b 6a  eSize(&pTarget[j
aa60: 2b 31 5d 29 2b 31 20 29 7b 0a 20 20 20 20 20 20  +1])+1 ){.      
aa70: 61 73 73 65 72 74 28 20 70 54 61 72 67 65 74 5b  assert( pTarget[
aa80: 6a 5d 2e 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f 53  j].eType==JSON_S
aa90: 54 52 49 4e 47 20 29 3b 0a 20 20 20 20 20 20 61  TRING );.      a
aaa0: 73 73 65 72 74 28 20 70 54 61 72 67 65 74 5b 6a  ssert( pTarget[j
aab0: 5d 2e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44  ].jnFlags & JNOD
aac0: 45 5f 4c 41 42 45 4c 20 29 3b 0a 20 20 20 20 20  E_LABEL );.     
aad0: 20 61 73 73 65 72 74 28 20 28 70 50 61 74 63 68   assert( (pPatch
aae0: 5b 69 5d 2e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e  [i].jnFlags & JN
aaf0: 4f 44 45 5f 52 41 57 29 3d 3d 30 20 29 3b 0a 20  ODE_RAW)==0 );. 
ab00: 20 20 20 20 20 69 66 28 20 70 54 61 72 67 65 74       if( pTarget
ab10: 5b 6a 5d 2e 6e 3d 3d 6e 4b 65 79 20 26 26 20 73  [j].n==nKey && s
ab20: 74 72 6e 63 6d 70 28 70 54 61 72 67 65 74 5b 6a  trncmp(pTarget[j
ab30: 5d 2e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 2c 7a 4b  ].u.zJContent,zK
ab40: 65 79 2c 6e 4b 65 79 29 3d 3d 30 20 29 7b 0a 20  ey,nKey)==0 ){. 
ab50: 20 20 20 20 20 20 20 69 66 28 20 70 54 61 72 67         if( pTarg
ab60: 65 74 5b 6a 2b 31 5d 2e 6a 6e 46 6c 61 67 73 20  et[j+1].jnFlags 
ab70: 26 20 28 4a 4e 4f 44 45 5f 52 45 4d 4f 56 45 7c  & (JNODE_REMOVE|
ab80: 4a 4e 4f 44 45 5f 50 41 54 43 48 29 20 29 20 62  JNODE_PATCH) ) b
ab90: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66  reak;.        if
aba0: 28 20 70 50 61 74 63 68 5b 69 2b 31 5d 2e 65 54  ( pPatch[i+1].eT
abb0: 79 70 65 3d 3d 4a 53 4f 4e 5f 4e 55 4c 4c 20 29  ype==JSON_NULL )
abc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 72  {.          pTar
abd0: 67 65 74 5b 6a 2b 31 5d 2e 6a 6e 46 6c 61 67 73  get[j+1].jnFlags
abe0: 20 7c 3d 20 4a 4e 4f 44 45 5f 52 45 4d 4f 56 45   |= JNODE_REMOVE
abf0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
ac00: 0a 20 20 20 20 20 20 20 20 20 20 4a 73 6f 6e 4e  .          JsonN
ac10: 6f 64 65 20 2a 70 4e 65 77 20 3d 20 6a 73 6f 6e  ode *pNew = json
ac20: 4d 65 72 67 65 50 61 74 63 68 28 70 50 61 72 73  MergePatch(pPars
ac30: 65 2c 20 69 54 61 72 67 65 74 2b 6a 2b 31 2c 20  e, iTarget+j+1, 
ac40: 26 70 50 61 74 63 68 5b 69 2b 31 5d 29 3b 0a 20  &pPatch[i+1]);. 
ac50: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65           if( pNe
ac60: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
ac70: 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 72 67  .          pTarg
ac80: 65 74 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 4e  et = &pParse->aN
ac90: 6f 64 65 5b 69 54 61 72 67 65 74 5d 3b 0a 20 20  ode[iTarget];.  
aca0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
acb0: 21 3d 26 70 54 61 72 67 65 74 5b 6a 2b 31 5d 20  !=&pTarget[j+1] 
acc0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
acd0: 54 61 72 67 65 74 5b 6a 2b 31 5d 2e 75 2e 70 50  Target[j+1].u.pP
ace0: 61 74 63 68 20 3d 20 70 4e 65 77 3b 0a 20 20 20  atch = pNew;.   
acf0: 20 20 20 20 20 20 20 20 20 70 54 61 72 67 65 74           pTarget
ad00: 5b 6a 2b 31 5d 2e 6a 6e 46 6c 61 67 73 20 7c 3d  [j+1].jnFlags |=
ad10: 20 4a 4e 4f 44 45 5f 50 41 54 43 48 3b 0a 20 20   JNODE_PATCH;.  
ad20: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ad30: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
ad40: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
ad50: 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70 54 61 72  .    if( j>=pTar
ad60: 67 65 74 2d 3e 6e 20 26 26 20 70 50 61 74 63 68  get->n && pPatch
ad70: 5b 69 2b 31 5d 2e 65 54 79 70 65 21 3d 4a 53 4f  [i+1].eType!=JSO
ad80: 4e 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  N_NULL ){.      
ad90: 69 6e 74 20 69 53 74 61 72 74 2c 20 69 50 61 74  int iStart, iPat
ada0: 63 68 3b 0a 20 20 20 20 20 20 69 53 74 61 72 74  ch;.      iStart
adb0: 20 3d 20 6a 73 6f 6e 50 61 72 73 65 41 64 64 4e   = jsonParseAddN
adc0: 6f 64 65 28 70 50 61 72 73 65 2c 20 4a 53 4f 4e  ode(pParse, JSON
add0: 5f 4f 42 4a 45 43 54 2c 20 32 2c 20 30 29 3b 0a  _OBJECT, 2, 0);.
ade0: 20 20 20 20 20 20 6a 73 6f 6e 50 61 72 73 65 41        jsonParseA
adf0: 64 64 4e 6f 64 65 28 70 50 61 72 73 65 2c 20 4a  ddNode(pParse, J
ae00: 53 4f 4e 5f 53 54 52 49 4e 47 2c 20 6e 4b 65 79  SON_STRING, nKey
ae10: 2c 20 7a 4b 65 79 29 3b 0a 20 20 20 20 20 20 69  , zKey);.      i
ae20: 50 61 74 63 68 20 3d 20 6a 73 6f 6e 50 61 72 73  Patch = jsonPars
ae30: 65 41 64 64 4e 6f 64 65 28 70 50 61 72 73 65 2c  eAddNode(pParse,
ae40: 20 4a 53 4f 4e 5f 54 52 55 45 2c 20 30 2c 20 30   JSON_TRUE, 0, 0
ae50: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
ae60: 72 73 65 2d 3e 6f 6f 6d 20 29 20 72 65 74 75 72  rse->oom ) retur
ae70: 6e 20 30 3b 0a 20 20 20 20 20 20 6a 73 6f 6e 52  n 0;.      jsonR
ae80: 65 6d 6f 76 65 41 6c 6c 4e 75 6c 6c 73 28 70 50  emoveAllNulls(pP
ae90: 61 74 63 68 29 3b 0a 20 20 20 20 20 20 70 54 61  atch);.      pTa
aea0: 72 67 65 74 20 3d 20 26 70 50 61 72 73 65 2d 3e  rget = &pParse->
aeb0: 61 4e 6f 64 65 5b 69 54 61 72 67 65 74 5d 3b 0a  aNode[iTarget];.
aec0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 4e        pParse->aN
aed0: 6f 64 65 5b 69 52 6f 6f 74 5d 2e 6a 6e 46 6c 61  ode[iRoot].jnFla
aee0: 67 73 20 7c 3d 20 4a 4e 4f 44 45 5f 41 50 50 45  gs |= JNODE_APPE
aef0: 4e 44 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  ND;.      pParse
af00: 2d 3e 61 4e 6f 64 65 5b 69 52 6f 6f 74 5d 2e 75  ->aNode[iRoot].u
af10: 2e 69 41 70 70 65 6e 64 20 3d 20 69 53 74 61 72  .iAppend = iStar
af20: 74 20 2d 20 69 52 6f 6f 74 3b 0a 20 20 20 20 20  t - iRoot;.     
af30: 20 69 52 6f 6f 74 20 3d 20 69 53 74 61 72 74 3b   iRoot = iStart;
af40: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61  .      pParse->a
af50: 4e 6f 64 65 5b 69 50 61 74 63 68 5d 2e 6a 6e 46  Node[iPatch].jnF
af60: 6c 61 67 73 20 7c 3d 20 4a 4e 4f 44 45 5f 50 41  lags |= JNODE_PA
af70: 54 43 48 3b 0a 20 20 20 20 20 20 70 50 61 72 73  TCH;.      pPars
af80: 65 2d 3e 61 4e 6f 64 65 5b 69 50 61 74 63 68 5d  e->aNode[iPatch]
af90: 2e 75 2e 70 50 61 74 63 68 20 3d 20 26 70 50 61  .u.pPatch = &pPa
afa0: 74 63 68 5b 69 2b 31 5d 3b 0a 20 20 20 20 7d 0a  tch[i+1];.    }.
afb0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61    }.  return pTa
afc0: 72 67 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rget;.}../*.** I
afd0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
afe0: 20 74 68 65 20 6a 73 6f 6e 5f 6d 65 72 67 65 70   the json_mergep
aff0: 61 74 63 68 28 4a 53 4f 4e 31 2c 4a 53 4f 4e 32  atch(JSON1,JSON2
b000: 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 52 65 74  ) function.  Ret
b010: 75 72 6e 20 61 20 4a 53 4f 4e 0a 2a 2a 20 6f 62  urn a JSON.** ob
b020: 6a 65 63 74 20 74 68 61 74 20 69 73 20 74 68 65  ject that is the
b030: 20 72 65 73 75 6c 74 20 6f 66 20 72 75 6e 6e 69   result of runni
b040: 6e 67 20 74 68 65 20 52 46 43 20 37 33 39 36 20  ng the RFC 7396 
b050: 4d 65 72 67 65 50 61 74 63 68 28 29 20 61 6c 67  MergePatch() alg
b060: 6f 72 69 74 68 6d 0a 2a 2a 20 6f 6e 20 74 68 65  orithm.** on the
b070: 20 74 77 6f 20 61 72 67 75 6d 65 6e 74 73 2e 0a   two arguments..
b080: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a  */.static void j
b090: 73 6f 6e 50 61 74 63 68 46 75 6e 63 28 0a 20 20  sonPatchFunc(.  
b0a0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
b0b0: 2a 63 74 78 2c 0a 20 20 69 6e 74 20 61 72 67 63  *ctx,.  int argc
b0c0: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
b0d0: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 4a 73  e **argv.){.  Js
b0e0: 6f 6e 50 61 72 73 65 20 78 3b 20 20 20 20 20 2f  onParse x;     /
b0f0: 2a 20 54 68 65 20 4a 53 4f 4e 20 74 68 61 74 20  * The JSON that 
b100: 69 73 20 62 65 69 6e 67 20 70 61 74 63 68 65 64  is being patched
b110: 20 2a 2f 0a 20 20 4a 73 6f 6e 50 61 72 73 65 20   */.  JsonParse 
b120: 79 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  y;     /* The pa
b130: 74 63 68 20 2a 2f 0a 20 20 4a 73 6f 6e 4e 6f 64  tch */.  JsonNod
b140: 65 20 2a 70 52 65 73 75 6c 74 3b 20 20 20 2f 2a  e *pResult;   /*
b150: 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   The result of t
b160: 68 65 20 6d 65 72 67 65 20 2a 2f 0a 0a 20 20 55  he merge */..  U
b170: 4e 55 53 45 44 5f 50 41 52 41 4d 28 61 72 67 63  NUSED_PARAM(argc
b180: 29 3b 0a 20 20 69 66 28 20 6a 73 6f 6e 50 61 72  );.  if( jsonPar
b190: 73 65 28 26 78 2c 20 63 74 78 2c 20 28 63 6f 6e  se(&x, ctx, (con
b1a0: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
b1b0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
b1c0: 5b 30 5d 29 29 20 29 20 72 65 74 75 72 6e 3b 0a  [0])) ) return;.
b1d0: 20 20 69 66 28 20 6a 73 6f 6e 50 61 72 73 65 28    if( jsonParse(
b1e0: 26 79 2c 20 63 74 78 2c 20 28 63 6f 6e 73 74 20  &y, ctx, (const 
b1f0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
b200: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d  lue_text(argv[1]
b210: 29 29 20 29 7b 0a 20 20 20 20 6a 73 6f 6e 50 61  )) ){.    jsonPa
b220: 72 73 65 52 65 73 65 74 28 26 78 29 3b 0a 20 20  rseReset(&x);.  
b230: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
b240: 70 52 65 73 75 6c 74 20 3d 20 6a 73 6f 6e 4d 65  pResult = jsonMe
b250: 72 67 65 50 61 74 63 68 28 26 78 2c 20 30 2c 20  rgePatch(&x, 0, 
b260: 79 2e 61 4e 6f 64 65 29 3b 0a 20 20 61 73 73 65  y.aNode);.  asse
b270: 72 74 28 20 70 52 65 73 75 6c 74 21 3d 30 20 7c  rt( pResult!=0 |
b280: 7c 20 78 2e 6f 6f 6d 20 29 3b 0a 20 20 69 66 28  | x.oom );.  if(
b290: 20 70 52 65 73 75 6c 74 20 29 7b 0a 20 20 20 20   pResult ){.    
b2a0: 6a 73 6f 6e 52 65 74 75 72 6e 4a 73 6f 6e 28 70  jsonReturnJson(p
b2b0: 52 65 73 75 6c 74 2c 20 63 74 78 2c 20 30 29 3b  Result, ctx, 0);
b2c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
b2d0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
b2e0: 6f 72 5f 6e 6f 6d 65 6d 28 63 74 78 29 3b 0a 20  or_nomem(ctx);. 
b2f0: 20 7d 0a 20 20 6a 73 6f 6e 50 61 72 73 65 52 65   }.  jsonParseRe
b300: 73 65 74 28 26 78 29 3b 0a 20 20 6a 73 6f 6e 50  set(&x);.  jsonP
b310: 61 72 73 65 52 65 73 65 74 28 26 79 29 3b 0a 7d  arseReset(&y);.}
b320: 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  .../*.** Impleme
b330: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a  ntation of the j
b340: 73 6f 6e 5f 6f 62 6a 65 63 74 28 4e 41 4d 45 2c  son_object(NAME,
b350: 56 41 4c 55 45 2c 2e 2e 2e 29 20 66 75 6e 63 74  VALUE,...) funct
b360: 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 20 4a  ion.  Return a J
b370: 53 4f 4e 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68  SON.** object th
b380: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20  at contains all 
b390: 6e 61 6d 65 2f 76 61 6c 75 65 20 67 69 76 65 6e  name/value given
b3a0: 20 69 6e 20 61 72 67 75 6d 65 6e 74 73 2e 20 20   in arguments.  
b3b0: 4f 72 20 69 66 20 61 6e 79 20 6e 61 6d 65 0a 2a  Or if any name.*
b3c0: 2a 20 69 73 20 6e 6f 74 20 61 20 73 74 72 69 6e  * is not a strin
b3d0: 67 20 6f 72 20 69 66 20 61 6e 79 20 76 61 6c 75  g or if any valu
b3e0: 65 20 69 73 20 61 20 42 4c 4f 42 2c 20 74 68 72  e is a BLOB, thr
b3f0: 6f 77 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a  ow an error..*/.
b400: 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e  static void json
b410: 4f 62 6a 65 63 74 46 75 6e 63 28 0a 20 20 73 71  ObjectFunc(.  sq
b420: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
b430: 74 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  tx,.  int argc,.
b440: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
b450: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20  **argv.){.  int 
b460: 69 3b 0a 20 20 4a 73 6f 6e 53 74 72 69 6e 67 20  i;.  JsonString 
b470: 6a 78 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  jx;.  const char
b480: 20 2a 7a 3b 0a 20 20 75 33 32 20 6e 3b 0a 0a 20   *z;.  u32 n;.. 
b490: 20 69 66 28 20 61 72 67 63 26 31 20 29 7b 0a 20   if( argc&1 ){. 
b4a0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
b4b0: 74 5f 65 72 72 6f 72 28 63 74 78 2c 20 22 6a 73  t_error(ctx, "js
b4c0: 6f 6e 5f 6f 62 6a 65 63 74 28 29 20 72 65 71 75  on_object() requ
b4d0: 69 72 65 73 20 61 6e 20 65 76 65 6e 20 6e 75 6d  ires an even num
b4e0: 62 65 72 20 22 0a 20 20 20 20 20 20 20 20 20 20  ber ".          
b4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b500: 20 20 20 20 20 20 20 20 22 6f 66 20 61 72 67 75          "of argu
b510: 6d 65 6e 74 73 22 2c 20 2d 31 29 3b 0a 20 20 20  ments", -1);.   
b520: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6a   return;.  }.  j
b530: 73 6f 6e 49 6e 69 74 28 26 6a 78 2c 20 63 74 78  sonInit(&jx, ctx
b540: 29 3b 0a 20 20 6a 73 6f 6e 41 70 70 65 6e 64 43  );.  jsonAppendC
b550: 68 61 72 28 26 6a 78 2c 20 27 7b 27 29 3b 0a 20  har(&jx, '{');. 
b560: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63   for(i=0; i<argc
b570: 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 69 66 28  ; i+=2){.    if(
b580: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
b590: 79 70 65 28 61 72 67 76 5b 69 5d 29 21 3d 53 51  ype(argv[i])!=SQ
b5a0: 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 20  LITE_TEXT ){.   
b5b0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
b5c0: 74 5f 65 72 72 6f 72 28 63 74 78 2c 20 22 6a 73  t_error(ctx, "js
b5d0: 6f 6e 5f 6f 62 6a 65 63 74 28 29 20 6c 61 62 65  on_object() labe
b5e0: 6c 73 20 6d 75 73 74 20 62 65 20 54 45 58 54 22  ls must be TEXT"
b5f0: 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 6a 73 6f  , -1);.      jso
b600: 6e 52 65 73 65 74 28 26 6a 78 29 3b 0a 20 20 20  nReset(&jx);.   
b610: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
b620: 0a 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 53  .    jsonAppendS
b630: 65 70 61 72 61 74 6f 72 28 26 6a 78 29 3b 0a 20  eparator(&jx);. 
b640: 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68     z = (const ch
b650: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
b660: 65 5f 74 65 78 74 28 61 72 67 76 5b 69 5d 29 3b  e_text(argv[i]);
b670: 0a 20 20 20 20 6e 20 3d 20 28 75 33 32 29 73 71  .    n = (u32)sq
b680: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
b690: 73 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20  s(argv[i]);.    
b6a0: 6a 73 6f 6e 41 70 70 65 6e 64 53 74 72 69 6e 67  jsonAppendString
b6b0: 28 26 6a 78 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20  (&jx, z, n);.   
b6c0: 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61 72 28   jsonAppendChar(
b6d0: 26 6a 78 2c 20 27 3a 27 29 3b 0a 20 20 20 20 6a  &jx, ':');.    j
b6e0: 73 6f 6e 41 70 70 65 6e 64 56 61 6c 75 65 28 26  sonAppendValue(&
b6f0: 6a 78 2c 20 61 72 67 76 5b 69 2b 31 5d 29 3b 0a  jx, argv[i+1]);.
b700: 20 20 7d 0a 20 20 6a 73 6f 6e 41 70 70 65 6e 64    }.  jsonAppend
b710: 43 68 61 72 28 26 6a 78 2c 20 27 7d 27 29 3b 0a  Char(&jx, '}');.
b720: 20 20 6a 73 6f 6e 52 65 73 75 6c 74 28 26 6a 78    jsonResult(&jx
b730: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
b740: 75 6c 74 5f 73 75 62 74 79 70 65 28 63 74 78 2c  ult_subtype(ctx,
b750: 20 4a 53 4f 4e 5f 53 55 42 54 59 50 45 29 3b 0a   JSON_SUBTYPE);.
b760: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 6a 73 6f 6e 5f 72  }.../*.** json_r
b770: 65 6d 6f 76 65 28 4a 53 4f 4e 2c 20 50 41 54 48  emove(JSON, PATH
b780: 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 52 65 6d  , ...).**.** Rem
b790: 6f 76 65 20 74 68 65 20 6e 61 6d 65 64 20 65 6c  ove the named el
b7a0: 65 6d 65 6e 74 73 20 66 72 6f 6d 20 4a 53 4f 4e  ements from JSON
b7b0: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
b7c0: 72 65 73 75 6c 74 2e 20 20 6d 61 6c 66 6f 72 6d  result.  malform
b7d0: 65 64 0a 2a 2a 20 4a 53 4f 4e 20 6f 72 20 50 41  ed.** JSON or PA
b7e0: 54 48 20 61 72 67 75 6d 65 6e 74 73 20 72 65 73  TH arguments res
b7f0: 75 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e  ult in an error.
b800: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b810: 6a 73 6f 6e 52 65 6d 6f 76 65 46 75 6e 63 28 0a  jsonRemoveFunc(.
b820: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
b830: 74 20 2a 63 74 78 2c 0a 20 20 69 6e 74 20 61 72  t *ctx,.  int ar
b840: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
b850: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
b860: 4a 73 6f 6e 50 61 72 73 65 20 78 3b 20 20 20 20  JsonParse x;    
b870: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
b880: 73 65 20 2a 2f 0a 20 20 4a 73 6f 6e 4e 6f 64 65  se */.  JsonNode
b890: 20 2a 70 4e 6f 64 65 3b 0a 20 20 63 6f 6e 73 74   *pNode;.  const
b8a0: 20 63 68 61 72 20 2a 7a 50 61 74 68 3b 0a 20 20   char *zPath;.  
b8b0: 75 33 32 20 69 3b 0a 0a 20 20 69 66 28 20 61 72  u32 i;..  if( ar
b8c0: 67 63 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20  gc<1 ) return;. 
b8d0: 20 69 66 28 20 6a 73 6f 6e 50 61 72 73 65 28 26   if( jsonParse(&
b8e0: 78 2c 20 63 74 78 2c 20 28 63 6f 6e 73 74 20 63  x, ctx, (const c
b8f0: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
b900: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
b910: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  ) ) return;.  as
b920: 73 65 72 74 28 20 78 2e 6e 4e 6f 64 65 20 29 3b  sert( x.nNode );
b930: 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 28 75  .  for(i=1; i<(u
b940: 33 32 29 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20  32)argc; i++){. 
b950: 20 20 20 7a 50 61 74 68 20 3d 20 28 63 6f 6e 73     zPath = (cons
b960: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
b970: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
b980: 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61  i]);.    if( zPa
b990: 74 68 3d 3d 30 20 29 20 67 6f 74 6f 20 72 65 6d  th==0 ) goto rem
b9a0: 6f 76 65 5f 64 6f 6e 65 3b 0a 20 20 20 20 70 4e  ove_done;.    pN
b9b0: 6f 64 65 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75 70  ode = jsonLookup
b9c0: 28 26 78 2c 20 7a 50 61 74 68 2c 20 30 2c 20 63  (&x, zPath, 0, c
b9d0: 74 78 29 3b 0a 20 20 20 20 69 66 28 20 78 2e 6e  tx);.    if( x.n
b9e0: 45 72 72 20 29 20 67 6f 74 6f 20 72 65 6d 6f 76  Err ) goto remov
b9f0: 65 5f 64 6f 6e 65 3b 0a 20 20 20 20 69 66 28 20  e_done;.    if( 
ba00: 70 4e 6f 64 65 20 29 20 70 4e 6f 64 65 2d 3e 6a  pNode ) pNode->j
ba10: 6e 46 6c 61 67 73 20 7c 3d 20 4a 4e 4f 44 45 5f  nFlags |= JNODE_
ba20: 52 45 4d 4f 56 45 3b 0a 20 20 7d 0a 20 20 69 66  REMOVE;.  }.  if
ba30: 28 20 28 78 2e 61 4e 6f 64 65 5b 30 5d 2e 6a 6e  ( (x.aNode[0].jn
ba40: 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 52 45  Flags & JNODE_RE
ba50: 4d 4f 56 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  MOVE)==0 ){.    
ba60: 6a 73 6f 6e 52 65 74 75 72 6e 4a 73 6f 6e 28 78  jsonReturnJson(x
ba70: 2e 61 4e 6f 64 65 2c 20 63 74 78 2c 20 30 29 3b  .aNode, ctx, 0);
ba80: 0a 20 20 7d 0a 72 65 6d 6f 76 65 5f 64 6f 6e 65  .  }.remove_done
ba90: 3a 0a 20 20 6a 73 6f 6e 50 61 72 73 65 52 65 73  :.  jsonParseRes
baa0: 65 74 28 26 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  et(&x);.}../*.**
bab0: 20 6a 73 6f 6e 5f 72 65 70 6c 61 63 65 28 4a 53   json_replace(JS
bac0: 4f 4e 2c 20 50 41 54 48 2c 20 56 41 4c 55 45 2c  ON, PATH, VALUE,
bad0: 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 52 65 70 6c   ...).**.** Repl
bae0: 61 63 65 20 74 68 65 20 76 61 6c 75 65 20 61 74  ace the value at
baf0: 20 50 41 54 48 20 77 69 74 68 20 56 41 4c 55 45   PATH with VALUE
bb00: 2e 20 20 49 66 20 50 41 54 48 20 64 6f 65 73 20  .  If PATH does 
bb10: 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  not already exis
bb20: 74 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  t,.** this routi
bb30: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  ne is a no-op.  
bb40: 49 66 20 4a 53 4f 4e 20 6f 72 20 50 41 54 48 20  If JSON or PATH 
bb50: 69 73 20 6d 61 6c 66 6f 72 6d 65 64 2c 20 74 68  is malformed, th
bb60: 72 6f 77 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f  row an error..*/
bb70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f  .static void jso
bb80: 6e 52 65 70 6c 61 63 65 46 75 6e 63 28 0a 20 20  nReplaceFunc(.  
bb90: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
bba0: 2a 63 74 78 2c 0a 20 20 69 6e 74 20 61 72 67 63  *ctx,.  int argc
bbb0: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
bbc0: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 4a 73  e **argv.){.  Js
bbd0: 6f 6e 50 61 72 73 65 20 78 3b 20 20 20 20 20 20  onParse x;      
bbe0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
bbf0: 20 2a 2f 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a   */.  JsonNode *
bc00: 70 4e 6f 64 65 3b 0a 20 20 63 6f 6e 73 74 20 63  pNode;.  const c
bc10: 68 61 72 20 2a 7a 50 61 74 68 3b 0a 20 20 75 33  har *zPath;.  u3
bc20: 32 20 69 3b 0a 0a 20 20 69 66 28 20 61 72 67 63  2 i;..  if( argc
bc30: 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  <1 ) return;.  i
bc40: 66 28 20 28 61 72 67 63 26 31 29 3d 3d 30 20 29  f( (argc&1)==0 )
bc50: 20 7b 0a 20 20 20 20 6a 73 6f 6e 57 72 6f 6e 67   {.    jsonWrong
bc60: 4e 75 6d 41 72 67 73 28 63 74 78 2c 20 22 72 65  NumArgs(ctx, "re
bc70: 70 6c 61 63 65 22 29 3b 0a 20 20 20 20 72 65 74  place");.    ret
bc80: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6a  urn;.  }.  if( j
bc90: 73 6f 6e 50 61 72 73 65 28 26 78 2c 20 63 74 78  sonParse(&x, ctx
bca0: 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  , (const char*)s
bcb0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
bcc0: 74 28 61 72 67 76 5b 30 5d 29 29 20 29 20 72 65  t(argv[0])) ) re
bcd0: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
bce0: 78 2e 6e 4e 6f 64 65 20 29 3b 0a 20 20 66 6f 72  x.nNode );.  for
bcf0: 28 69 3d 31 3b 20 69 3c 28 75 33 32 29 61 72 67  (i=1; i<(u32)arg
bd00: 63 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 7a 50  c; i+=2){.    zP
bd10: 61 74 68 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ath = (const cha
bd20: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
bd30: 5f 74 65 78 74 28 61 72 67 76 5b 69 5d 29 3b 0a  _text(argv[i]);.
bd40: 20 20 20 20 70 4e 6f 64 65 20 3d 20 6a 73 6f 6e      pNode = json
bd50: 4c 6f 6f 6b 75 70 28 26 78 2c 20 7a 50 61 74 68  Lookup(&x, zPath
bd60: 2c 20 30 2c 20 63 74 78 29 3b 0a 20 20 20 20 69  , 0, ctx);.    i
bd70: 66 28 20 78 2e 6e 45 72 72 20 29 20 67 6f 74 6f  f( x.nErr ) goto
bd80: 20 72 65 70 6c 61 63 65 5f 65 72 72 3b 0a 20 20   replace_err;.  
bd90: 20 20 69 66 28 20 70 4e 6f 64 65 20 29 7b 0a 20    if( pNode ){. 
bda0: 20 20 20 20 20 70 4e 6f 64 65 2d 3e 6a 6e 46 6c       pNode->jnFl
bdb0: 61 67 73 20 7c 3d 20 28 75 38 29 4a 4e 4f 44 45  ags |= (u8)JNODE
bdc0: 5f 52 45 50 4c 41 43 45 3b 0a 20 20 20 20 20 20  _REPLACE;.      
bdd0: 70 4e 6f 64 65 2d 3e 75 2e 69 52 65 70 6c 61 63  pNode->u.iReplac
bde0: 65 20 3d 20 69 20 2b 20 31 3b 0a 20 20 20 20 7d  e = i + 1;.    }
bdf0: 0a 20 20 7d 0a 20 20 69 66 28 20 78 2e 61 4e 6f  .  }.  if( x.aNo
be00: 64 65 5b 30 5d 2e 6a 6e 46 6c 61 67 73 20 26 20  de[0].jnFlags & 
be10: 4a 4e 4f 44 45 5f 52 45 50 4c 41 43 45 20 29 7b  JNODE_REPLACE ){
be20: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
be30: 75 6c 74 5f 76 61 6c 75 65 28 63 74 78 2c 20 61  ult_value(ctx, a
be40: 72 67 76 5b 78 2e 61 4e 6f 64 65 5b 30 5d 2e 75  rgv[x.aNode[0].u
be50: 2e 69 52 65 70 6c 61 63 65 5d 29 3b 0a 20 20 7d  .iReplace]);.  }
be60: 65 6c 73 65 7b 0a 20 20 20 20 6a 73 6f 6e 52 65  else{.    jsonRe
be70: 74 75 72 6e 4a 73 6f 6e 28 78 2e 61 4e 6f 64 65  turnJson(x.aNode
be80: 2c 20 63 74 78 2c 20 61 72 67 76 29 3b 0a 20 20  , ctx, argv);.  
be90: 7d 0a 72 65 70 6c 61 63 65 5f 65 72 72 3a 0a 20  }.replace_err:. 
bea0: 20 6a 73 6f 6e 50 61 72 73 65 52 65 73 65 74 28   jsonParseReset(
beb0: 26 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 6a 73  &x);.}../*.** js
bec0: 6f 6e 5f 73 65 74 28 4a 53 4f 4e 2c 20 50 41 54  on_set(JSON, PAT
bed0: 48 2c 20 56 41 4c 55 45 2c 20 2e 2e 2e 29 0a 2a  H, VALUE, ...).*
bee0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c  *.** Set the val
bef0: 75 65 20 61 74 20 50 41 54 48 20 74 6f 20 56 41  ue at PATH to VA
bf00: 4c 55 45 2e 20 20 43 72 65 61 74 65 20 74 68 65  LUE.  Create the
bf10: 20 50 41 54 48 20 69 66 20 69 74 20 64 6f 65 73   PATH if it does
bf20: 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20   not already.** 
bf30: 65 78 69 73 74 2e 20 20 4f 76 65 72 77 72 69 74  exist.  Overwrit
bf40: 65 20 65 78 69 73 74 69 6e 67 20 76 61 6c 75 65  e existing value
bf50: 73 20 74 68 61 74 20 64 6f 20 65 78 69 73 74 2e  s that do exist.
bf60: 0a 2a 2a 20 49 66 20 4a 53 4f 4e 20 6f 72 20 50  .** If JSON or P
bf70: 41 54 48 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64  ATH is malformed
bf80: 2c 20 74 68 72 6f 77 20 61 6e 20 65 72 72 6f 72  , throw an error
bf90: 2e 0a 2a 2a 0a 2a 2a 20 6a 73 6f 6e 5f 69 6e 73  ..**.** json_ins
bfa0: 65 72 74 28 4a 53 4f 4e 2c 20 50 41 54 48 2c 20  ert(JSON, PATH, 
bfb0: 56 41 4c 55 45 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a  VALUE, ...).**.*
bfc0: 2a 20 43 72 65 61 74 65 20 50 41 54 48 20 61 6e  * Create PATH an
bfd0: 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 20  d initialize it 
bfe0: 74 6f 20 56 41 4c 55 45 2e 20 20 49 66 20 50 41  to VALUE.  If PA
bff0: 54 48 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  TH already exist
c000: 73 2c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  s, this.** routi
c010: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  ne is a no-op.  
c020: 49 66 20 4a 53 4f 4e 20 6f 72 20 50 41 54 48 20  If JSON or PATH 
c030: 69 73 20 6d 61 6c 66 6f 72 6d 65 64 2c 20 74 68  is malformed, th
c040: 72 6f 77 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f  row an error..*/
c050: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f  .static void jso
c060: 6e 53 65 74 46 75 6e 63 28 0a 20 20 73 71 6c 69  nSetFunc(.  sqli
c070: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78  te3_context *ctx
c080: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
c090: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
c0a0: 61 72 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e 50 61  argv.){.  JsonPa
c0b0: 72 73 65 20 78 3b 20 20 20 20 20 20 20 20 20 20  rse x;          
c0c0: 2f 2a 20 54 68 65 20 70 61 72 73 65 20 2a 2f 0a  /* The parse */.
c0d0: 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64    JsonNode *pNod
c0e0: 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e;.  const char 
c0f0: 2a 7a 50 61 74 68 3b 0a 20 20 75 33 32 20 69 3b  *zPath;.  u32 i;
c100: 0a 20 20 69 6e 74 20 62 41 70 6e 64 3b 0a 20 20  .  int bApnd;.  
c110: 69 6e 74 20 62 49 73 53 65 74 20 3d 20 2a 28 69  int bIsSet = *(i
c120: 6e 74 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72  nt*)sqlite3_user
c130: 5f 64 61 74 61 28 63 74 78 29 3b 0a 0a 20 20 69  _data(ctx);..  i
c140: 66 28 20 61 72 67 63 3c 31 20 29 20 72 65 74 75  f( argc<1 ) retu
c150: 72 6e 3b 0a 20 20 69 66 28 20 28 61 72 67 63 26  rn;.  if( (argc&
c160: 31 29 3d 3d 30 20 29 20 7b 0a 20 20 20 20 6a 73  1)==0 ) {.    js
c170: 6f 6e 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 63  onWrongNumArgs(c
c180: 74 78 2c 20 62 49 73 53 65 74 20 3f 20 22 73 65  tx, bIsSet ? "se
c190: 74 22 20 3a 20 22 69 6e 73 65 72 74 22 29 3b 0a  t" : "insert");.
c1a0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
c1b0: 20 20 69 66 28 20 6a 73 6f 6e 50 61 72 73 65 28    if( jsonParse(
c1c0: 26 78 2c 20 63 74 78 2c 20 28 63 6f 6e 73 74 20  &x, ctx, (const 
c1d0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
c1e0: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
c1f0: 29 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  )) ) return;.  a
c200: 73 73 65 72 74 28 20 78 2e 6e 4e 6f 64 65 20 29  ssert( x.nNode )
c210: 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 28  ;.  for(i=1; i<(
c220: 75 33 32 29 61 72 67 63 3b 20 69 2b 3d 32 29 7b  u32)argc; i+=2){
c230: 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 28 63 6f  .    zPath = (co
c240: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
c250: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
c260: 76 5b 69 5d 29 3b 0a 20 20 20 20 62 41 70 6e 64  v[i]);.    bApnd
c270: 20 3d 20 30 3b 0a 20 20 20 20 70 4e 6f 64 65 20   = 0;.    pNode 
c280: 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 28 26 78 2c  = jsonLookup(&x,
c290: 20 7a 50 61 74 68 2c 20 26 62 41 70 6e 64 2c 20   zPath, &bApnd, 
c2a0: 63 74 78 29 3b 0a 20 20 20 20 69 66 28 20 78 2e  ctx);.    if( x.
c2b0: 6f 6f 6d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  oom ){.      sql
c2c0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
c2d0: 72 5f 6e 6f 6d 65 6d 28 63 74 78 29 3b 0a 20 20  r_nomem(ctx);.  
c2e0: 20 20 20 20 67 6f 74 6f 20 6a 73 6f 6e 53 65 74      goto jsonSet
c2f0: 44 6f 6e 65 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Done;.    }else 
c300: 69 66 28 20 78 2e 6e 45 72 72 20 29 7b 0a 20 20  if( x.nErr ){.  
c310: 20 20 20 20 67 6f 74 6f 20 6a 73 6f 6e 53 65 74      goto jsonSet
c320: 44 6f 6e 65 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Done;.    }else 
c330: 69 66 28 20 70 4e 6f 64 65 20 26 26 20 28 62 41  if( pNode && (bA
c340: 70 6e 64 20 7c 7c 20 62 49 73 53 65 74 29 20 29  pnd || bIsSet) )
c350: 7b 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 6a  {.      pNode->j
c360: 6e 46 6c 61 67 73 20 7c 3d 20 28 75 38 29 4a 4e  nFlags |= (u8)JN
c370: 4f 44 45 5f 52 45 50 4c 41 43 45 3b 0a 20 20 20  ODE_REPLACE;.   
c380: 20 20 20 70 4e 6f 64 65 2d 3e 75 2e 69 52 65 70     pNode->u.iRep
c390: 6c 61 63 65 20 3d 20 69 20 2b 20 31 3b 0a 20 20  lace = i + 1;.  
c3a0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 78 2e    }.  }.  if( x.
c3b0: 61 4e 6f 64 65 5b 30 5d 2e 6a 6e 46 6c 61 67 73  aNode[0].jnFlags
c3c0: 20 26 20 4a 4e 4f 44 45 5f 52 45 50 4c 41 43 45   & JNODE_REPLACE
c3d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
c3e0: 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 74 78  result_value(ctx
c3f0: 2c 20 61 72 67 76 5b 78 2e 61 4e 6f 64 65 5b 30  , argv[x.aNode[0
c400: 5d 2e 75 2e 69 52 65 70 6c 61 63 65 5d 29 3b 0a  ].u.iReplace]);.
c410: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6a 73 6f    }else{.    jso
c420: 6e 52 65 74 75 72 6e 4a 73 6f 6e 28 78 2e 61 4e  nReturnJson(x.aN
c430: 6f 64 65 2c 20 63 74 78 2c 20 61 72 67 76 29 3b  ode, ctx, argv);
c440: 0a 20 20 7d 0a 6a 73 6f 6e 53 65 74 44 6f 6e 65  .  }.jsonSetDone
c450: 3a 0a 20 20 6a 73 6f 6e 50 61 72 73 65 52 65 73  :.  jsonParseRes
c460: 65 74 28 26 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  et(&x);.}../*.**
c470: 20 6a 73 6f 6e 5f 74 79 70 65 28 4a 53 4f 4e 29   json_type(JSON)
c480: 0a 2a 2a 20 6a 73 6f 6e 5f 74 79 70 65 28 4a 53  .** json_type(JS
c490: 4f 4e 2c 20 50 41 54 48 29 0a 2a 2a 0a 2a 2a 20  ON, PATH).**.** 
c4a0: 52 65 74 75 72 6e 20 74 68 65 20 74 6f 70 2d 6c  Return the top-l
c4b0: 65 76 65 6c 20 22 74 79 70 65 22 20 6f 66 20 61  evel "type" of a
c4c0: 20 4a 53 4f 4e 20 73 74 72 69 6e 67 2e 20 20 54   JSON string.  T
c4d0: 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 20 69 66  hrow an error if
c4e0: 0a 2a 2a 20 65 69 74 68 65 72 20 74 68 65 20 4a  .** either the J
c4f0: 53 4f 4e 20 6f 72 20 50 41 54 48 20 69 6e 70 75  SON or PATH inpu
c500: 74 73 20 61 72 65 20 6e 6f 74 20 77 65 6c 6c 2d  ts are not well-
c510: 66 6f 72 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  formed..*/.stati
c520: 63 20 76 6f 69 64 20 6a 73 6f 6e 54 79 70 65 46  c void jsonTypeF
c530: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
c540: 6f 6e 74 65 78 74 20 2a 63 74 78 2c 0a 20 20 69  ontext *ctx,.  i
c550: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
c560: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
c570: 29 7b 0a 20 20 4a 73 6f 6e 50 61 72 73 65 20 2a  ){.  JsonParse *
c580: 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  p;          /* T
c590: 68 65 20 70 61 72 73 65 20 2a 2f 0a 20 20 63 6f  he parse */.  co
c5a0: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 3b  nst char *zPath;
c5b0: 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f  .  JsonNode *pNo
c5c0: 64 65 3b 0a 0a 20 20 70 20 3d 20 6a 73 6f 6e 50  de;..  p = jsonP
c5d0: 61 72 73 65 43 61 63 68 65 64 28 63 74 78 2c 20  arseCached(ctx, 
c5e0: 61 72 67 76 2c 20 63 74 78 29 3b 0a 20 20 69 66  argv, ctx);.  if
c5f0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
c600: 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 32 20 29  .  if( argc==2 )
c610: 7b 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 28 63  {.    zPath = (c
c620: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
c630: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
c640: 67 76 5b 31 5d 29 3b 0a 20 20 20 20 70 4e 6f 64  gv[1]);.    pNod
c650: 65 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 28 70  e = jsonLookup(p
c660: 2c 20 7a 50 61 74 68 2c 20 30 2c 20 63 74 78 29  , zPath, 0, ctx)
c670: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
c680: 4e 6f 64 65 20 3d 20 70 2d 3e 61 4e 6f 64 65 3b  Node = p->aNode;
c690: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 6f 64 65  .  }.  if( pNode
c6a0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
c6b0: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 74 78 2c  result_text(ctx,
c6c0: 20 6a 73 6f 6e 54 79 70 65 5b 70 4e 6f 64 65 2d   jsonType[pNode-
c6d0: 3e 65 54 79 70 65 5d 2c 20 2d 31 2c 20 53 51 4c  >eType], -1, SQL
c6e0: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d  ITE_STATIC);.  }
c6f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 6a 73 6f 6e 5f 76  .}../*.** json_v
c700: 61 6c 69 64 28 4a 53 4f 4e 29 0a 2a 2a 0a 2a 2a  alid(JSON).**.**
c710: 20 52 65 74 75 72 6e 20 31 20 69 66 20 4a 53 4f   Return 1 if JSO
c720: 4e 20 69 73 20 61 20 77 65 6c 6c 2d 66 6f 72 6d  N is a well-form
c730: 65 64 20 4a 53 4f 4e 20 73 74 72 69 6e 67 20 61  ed JSON string a
c740: 63 63 6f 72 64 69 6e 67 20 74 6f 20 52 46 43 2d  ccording to RFC-
c750: 37 31 35 39 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  7159..** Return 
c760: 30 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  0 otherwise..*/.
c770: 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e  static void json
c780: 56 61 6c 69 64 46 75 6e 63 28 0a 20 20 73 71 6c  ValidFunc(.  sql
c790: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74  ite3_context *ct
c7a0: 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  x,.  int argc,. 
c7b0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
c7c0: 2a 61 72 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e 50  *argv.){.  JsonP
c7d0: 61 72 73 65 20 2a 70 3b 20 20 20 20 20 20 20 20  arse *p;        
c7e0: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 20 2a    /* The parse *
c7f0: 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  /.  UNUSED_PARAM
c800: 28 61 72 67 63 29 3b 0a 20 20 70 20 3d 20 6a 73  (argc);.  p = js
c810: 6f 6e 50 61 72 73 65 43 61 63 68 65 64 28 63 74  onParseCached(ct
c820: 78 2c 20 61 72 67 76 2c 20 30 29 3b 0a 20 20 73  x, argv, 0);.  s
c830: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
c840: 74 28 63 74 78 2c 20 70 21 3d 30 29 3b 0a 7d 0a  t(ctx, p!=0);.}.
c850: 0a 0a 2f 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 2a 2a 2a 2a 2a 2a 0a  ***************.
c8a0: 2a 2a 20 41 67 67 72 65 67 61 74 65 20 53 51 4c  ** Aggregate SQL
c8b0: 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d   function implem
c8c0: 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 2a 2a 2a 2a  entations.******
c8d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c8e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c8f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c910: 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 6a 73  ******/./*.** js
c920: 6f 6e 5f 67 72 6f 75 70 5f 61 72 72 61 79 28 56  on_group_array(V
c930: 41 4c 55 45 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ALUE).**.** Retu
c940: 72 6e 20 61 20 4a 53 4f 4e 20 61 72 72 61 79 20  rn a JSON array 
c950: 63 6f 6d 70 6f 73 65 64 20 6f 66 20 61 6c 6c 20  composed of all 
c960: 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 61 67  values in the ag
c970: 67 72 65 67 61 74 65 2e 0a 2a 2f 0a 73 74 61 74  gregate..*/.stat
c980: 69 63 20 76 6f 69 64 20 6a 73 6f 6e 41 72 72 61  ic void jsonArra
c990: 79 53 74 65 70 28 0a 20 20 73 71 6c 69 74 65 33  yStep(.  sqlite3
c9a0: 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 0a 20  _context *ctx,. 
c9b0: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
c9c0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
c9d0: 76 0a 29 7b 0a 20 20 4a 73 6f 6e 53 74 72 69 6e  v.){.  JsonStrin
c9e0: 67 20 2a 70 53 74 72 3b 0a 20 20 55 4e 55 53 45  g *pStr;.  UNUSE
c9f0: 44 5f 50 41 52 41 4d 28 61 72 67 63 29 3b 0a 20  D_PARAM(argc);. 
ca00: 20 70 53 74 72 20 3d 20 28 4a 73 6f 6e 53 74 72   pStr = (JsonStr
ca10: 69 6e 67 2a 29 73 71 6c 69 74 65 33 5f 61 67 67  ing*)sqlite3_agg
ca20: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63  regate_context(c
ca30: 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 53 74 72  tx, sizeof(*pStr
ca40: 29 29 3b 0a 20 20 69 66 28 20 70 53 74 72 20 29  ));.  if( pStr )
ca50: 7b 0a 20 20 20 20 69 66 28 20 70 53 74 72 2d 3e  {.    if( pStr->
ca60: 7a 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zBuf==0 ){.     
ca70: 20 6a 73 6f 6e 49 6e 69 74 28 70 53 74 72 2c 20   jsonInit(pStr, 
ca80: 63 74 78 29 3b 0a 20 20 20 20 20 20 6a 73 6f 6e  ctx);.      json
ca90: 41 70 70 65 6e 64 43 68 61 72 28 70 53 74 72 2c  AppendChar(pStr,
caa0: 20 27 5b 27 29 3b 0a 20 20 20 20 7d 65 6c 73 65   '[');.    }else
cab0: 7b 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65  {.      jsonAppe
cac0: 6e 64 43 68 61 72 28 70 53 74 72 2c 20 27 2c 27  ndChar(pStr, ','
cad0: 29 3b 0a 20 20 20 20 20 20 70 53 74 72 2d 3e 70  );.      pStr->p
cae0: 43 74 78 20 3d 20 63 74 78 3b 0a 20 20 20 20 7d  Ctx = ctx;.    }
caf0: 0a 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 56  .    jsonAppendV
cb00: 61 6c 75 65 28 70 53 74 72 2c 20 61 72 67 76 5b  alue(pStr, argv[
cb10: 30 5d 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  0]);.  }.}.stati
cb20: 63 20 76 6f 69 64 20 6a 73 6f 6e 41 72 72 61 79  c void jsonArray
cb30: 43 6f 6d 70 75 74 65 28 73 71 6c 69 74 65 33 5f  Compute(sqlite3_
cb40: 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20 69 6e  context *ctx, in
cb50: 74 20 69 73 46 69 6e 61 6c 29 7b 0a 20 20 4a 73  t isFinal){.  Js
cb60: 6f 6e 53 74 72 69 6e 67 20 2a 70 53 74 72 3b 0a  onString *pStr;.
cb70: 20 20 70 53 74 72 20 3d 20 28 4a 73 6f 6e 53 74    pStr = (JsonSt
cb80: 72 69 6e 67 2a 29 73 71 6c 69 74 65 33 5f 61 67  ring*)sqlite3_ag
cb90: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
cba0: 63 74 78 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  ctx, 0);.  if( p
cbb0: 53 74 72 20 29 7b 0a 20 20 20 20 70 53 74 72 2d  Str ){.    pStr-
cbc0: 3e 70 43 74 78 20 3d 20 63 74 78 3b 0a 20 20 20  >pCtx = ctx;.   
cbd0: 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61 72 28   jsonAppendChar(
cbe0: 70 53 74 72 2c 20 27 5d 27 29 3b 0a 20 20 20 20  pStr, ']');.    
cbf0: 69 66 28 20 70 53 74 72 2d 3e 62 45 72 72 20 29  if( pStr->bErr )
cc00: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 53 74 72  {.      if( pStr
cc10: 2d 3e 62 45 72 72 3d 3d 31 20 29 20 73 71 6c 69  ->bErr==1 ) sqli
cc20: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
cc30: 5f 6e 6f 6d 65 6d 28 63 74 78 29 3b 0a 20 20 20  _nomem(ctx);.   
cc40: 20 20 20 61 73 73 65 72 74 28 20 70 53 74 72 2d     assert( pStr-
cc50: 3e 62 53 74 61 74 69 63 20 29 3b 0a 20 20 20 20  >bStatic );.    
cc60: 7d 65 6c 73 65 20 69 66 28 20 69 73 46 69 6e 61  }else if( isFina
cc70: 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
cc80: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
cc90: 74 78 2c 20 70 53 74 72 2d 3e 7a 42 75 66 2c 20  tx, pStr->zBuf, 
cca0: 28 69 6e 74 29 70 53 74 72 2d 3e 6e 55 73 65 64  (int)pStr->nUsed
ccb0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ccc0: 20 20 20 20 20 20 20 20 20 20 20 20 70 53 74 72              pStr
ccd0: 2d 3e 62 53 74 61 74 69 63 20 3f 20 53 51 4c 49  ->bStatic ? SQLI
cce0: 54 45 5f 54 52 41 4e 53 49 45 4e 54 20 3a 20 73  TE_TRANSIENT : s
ccf0: 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20  qlite3_free);.  
cd00: 20 20 20 20 70 53 74 72 2d 3e 62 53 74 61 74 69      pStr->bStati
cd10: 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  c = 1;.    }else
cd20: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
cd30: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 74 78 2c  result_text(ctx,
cd40: 20 70 53 74 72 2d 3e 7a 42 75 66 2c 20 28 69 6e   pStr->zBuf, (in
cd50: 74 29 70 53 74 72 2d 3e 6e 55 73 65 64 2c 20 53  t)pStr->nUsed, S
cd60: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
cd70: 3b 0a 20 20 20 20 20 20 70 53 74 72 2d 3e 6e 55  ;.      pStr->nU
cd80: 73 65 64 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d  sed--;.    }.  }
cd90: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
cda0: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 74  3_result_text(ct
cdb0: 78 2c 20 22 5b 5d 22 2c 20 32 2c 20 53 51 4c 49  x, "[]", 2, SQLI
cdc0: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a  TE_STATIC);.  }.
cdd0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
cde0: 5f 73 75 62 74 79 70 65 28 63 74 78 2c 20 4a 53  _subtype(ctx, JS
cdf0: 4f 4e 5f 53 55 42 54 59 50 45 29 3b 0a 7d 0a 73  ON_SUBTYPE);.}.s
ce00: 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 41  tatic void jsonA
ce10: 72 72 61 79 56 61 6c 75 65 28 73 71 6c 69 74 65  rrayValue(sqlite
ce20: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 29 7b  3_context *ctx){
ce30: 0a 20 20 6a 73 6f 6e 41 72 72 61 79 43 6f 6d 70  .  jsonArrayComp
ce40: 75 74 65 28 63 74 78 2c 20 30 29 3b 0a 7d 0a 73  ute(ctx, 0);.}.s
ce50: 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 41  tatic void jsonA
ce60: 72 72 61 79 46 69 6e 61 6c 28 73 71 6c 69 74 65  rrayFinal(sqlite
ce70: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 29 7b  3_context *ctx){
ce80: 0a 20 20 6a 73 6f 6e 41 72 72 61 79 43 6f 6d 70  .  jsonArrayComp
ce90: 75 74 65 28 63 74 78 2c 20 31 29 3b 0a 7d 0a 0a  ute(ctx, 1);.}..
cea0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ceb0: 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 2f  MIT_WINDOWFUNC./
cec0: 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 74 68 6f 64  *.** This method
ced0: 20 77 6f 72 6b 73 20 66 6f 72 20 62 6f 74 68 20   works for both 
cee0: 6a 73 6f 6e 5f 67 72 6f 75 70 5f 61 72 72 61 79  json_group_array
cef0: 28 29 20 61 6e 64 20 6a 73 6f 6e 5f 67 72 6f 75  () and json_grou
cf00: 70 5f 6f 62 6a 65 63 74 28 29 2e 0a 2a 2a 20 49  p_object()..** I
cf10: 74 20 77 6f 72 6b 73 20 62 79 20 72 65 6d 6f 76  t works by remov
cf20: 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 65 6c  ing the first el
cf30: 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 72 6f  ement of the gro
cf40: 75 70 20 62 79 20 73 65 61 72 63 68 69 6e 67 20  up by searching 
cf50: 66 6f 72 77 61 72 64 0a 2a 2a 20 74 6f 20 74 68  forward.** to th
cf60: 65 20 66 69 72 73 74 20 63 6f 6d 6d 61 20 28 22  e first comma ("
cf70: 2c 22 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20  ,") that is not 
cf80: 77 69 74 68 69 6e 20 61 20 73 74 72 69 6e 67 20  within a string 
cf90: 61 6e 64 20 64 65 6c 65 74 69 6e 67 20 61 6c 6c  and deleting all
cfa0: 0a 2a 2a 20 74 65 78 74 20 74 68 72 6f 75 67 68  .** text through
cfb0: 20 74 68 61 74 20 63 6f 6d 6d 61 2e 0a 2a 2f 0a   that comma..*/.
cfc0: 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e  static void json
cfd0: 47 72 6f 75 70 49 6e 76 65 72 73 65 28 0a 20 20  GroupInverse(.  
cfe0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
cff0: 2a 63 74 78 2c 0a 20 20 69 6e 74 20 61 72 67 63  *ctx,.  int argc
d000: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
d010: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e  e **argv.){.  in
d020: 74 20 69 3b 0a 20 20 69 6e 74 20 69 6e 53 74 72  t i;.  int inStr
d030: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 3b   = 0;.  char *z;
d040: 0a 20 20 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70  .  JsonString *p
d050: 53 74 72 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  Str;.  UNUSED_PA
d060: 52 41 4d 28 61 72 67 63 29 3b 0a 20 20 55 4e 55  RAM(argc);.  UNU
d070: 53 45 44 5f 50 41 52 41 4d 28 61 72 67 76 29 3b  SED_PARAM(argv);
d080: 0a 20 20 70 53 74 72 20 3d 20 28 4a 73 6f 6e 53  .  pStr = (JsonS
d090: 74 72 69 6e 67 2a 29 73 71 6c 69 74 65 33 5f 61  tring*)sqlite3_a
d0a0: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
d0b0: 28 63 74 78 2c 20 30 29 3b 0a 23 69 66 64 65 66  (ctx, 0);.#ifdef
d0c0: 20 4e 45 56 45 52 0a 20 20 2f 2a 20 70 53 74 72   NEVER.  /* pStr
d0d0: 20 69 73 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e   is always non-N
d0e0: 55 4c 4c 20 73 69 6e 63 65 20 6a 73 6f 6e 41 72  ULL since jsonAr
d0f0: 72 61 79 53 74 65 70 28 29 20 6f 72 20 6a 73 6f  rayStep() or jso
d100: 6e 4f 62 6a 65 63 74 53 74 65 70 28 29 20 77 69  nObjectStep() wi
d110: 6c 6c 0a 20 20 2a 2a 20 61 6c 77 61 79 73 20 68  ll.  ** always h
d120: 61 76 65 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  ave been called 
d130: 74 6f 20 69 6e 69 74 61 6c 69 7a 65 20 69 74 20  to initalize it 
d140: 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 21  */.  if( NEVER(!
d150: 70 53 74 72 29 20 29 20 72 65 74 75 72 6e 3b 0a  pStr) ) return;.
d160: 23 65 6e 64 69 66 0a 20 20 7a 20 3d 20 70 53 74  #endif.  z = pSt
d170: 72 2d 3e 7a 42 75 66 3b 0a 20 20 66 6f 72 28 69  r->zBuf;.  for(i
d180: 3d 31 3b 20 7a 5b 69 5d 21 3d 27 2c 27 20 7c 7c  =1; z[i]!=',' ||
d190: 20 69 6e 53 74 72 3b 20 69 2b 2b 29 7b 0a 20 20   inStr; i++){.  
d1a0: 20 20 61 73 73 65 72 74 28 20 69 3c 70 53 74 72    assert( i<pStr
d1b0: 2d 3e 6e 55 73 65 64 20 29 3b 0a 20 20 20 20 69  ->nUsed );.    i
d1c0: 66 28 20 7a 5b 69 5d 3d 3d 27 22 27 20 29 7b 0a  f( z[i]=='"' ){.
d1d0: 20 20 20 20 20 20 69 6e 53 74 72 20 3d 20 21 69        inStr = !i
d1e0: 6e 53 74 72 3b 0a 20 20 20 20 7d 65 6c 73 65 20  nStr;.    }else 
d1f0: 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 5c 27 20 29  if( z[i]=='\\' )
d200: 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20  {.      i++;.   
d210: 20 7d 0a 20 20 7d 0a 20 20 70 53 74 72 2d 3e 6e   }.  }.  pStr->n
d220: 55 73 65 64 20 2d 3d 20 69 3b 20 20 20 20 20 20  Used -= i;      
d230: 0a 20 20 6d 65 6d 6d 6f 76 65 28 26 7a 5b 31 5d  .  memmove(&z[1]
d240: 2c 20 26 7a 5b 69 2b 31 5d 2c 20 28 73 69 7a 65  , &z[i+1], (size
d250: 5f 74 29 70 53 74 72 2d 3e 6e 55 73 65 64 2d 31  _t)pStr->nUsed-1
d260: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
d270: 69 6e 65 20 6a 73 6f 6e 47 72 6f 75 70 49 6e 76  ine jsonGroupInv
d280: 65 72 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 0a  erse 0.#endif...
d290: 2f 2a 0a 2a 2a 20 6a 73 6f 6e 5f 67 72 6f 75 70  /*.** json_group
d2a0: 5f 6f 62 6a 28 4e 41 4d 45 2c 56 41 4c 55 45 29  _obj(NAME,VALUE)
d2b0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  .**.** Return a 
d2c0: 4a 53 4f 4e 20 6f 62 6a 65 63 74 20 63 6f 6d 70  JSON object comp
d2d0: 6f 73 65 64 20 6f 66 20 61 6c 6c 20 6e 61 6d 65  osed of all name
d2e0: 73 20 61 6e 64 20 76 61 6c 75 65 73 20 69 6e 20  s and values in 
d2f0: 74 68 65 20 61 67 67 72 65 67 61 74 65 2e 0a 2a  the aggregate..*
d300: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73  /.static void js
d310: 6f 6e 4f 62 6a 65 63 74 53 74 65 70 28 0a 20 20  onObjectStep(.  
d320: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
d330: 2a 63 74 78 2c 0a 20 20 69 6e 74 20 61 72 67 63  *ctx,.  int argc
d340: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
d350: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 4a 73  e **argv.){.  Js
d360: 6f 6e 53 74 72 69 6e 67 20 2a 70 53 74 72 3b 0a  onString *pStr;.
d370: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
d380: 0a 20 20 75 33 32 20 6e 3b 0a 20 20 55 4e 55 53  .  u32 n;.  UNUS
d390: 45 44 5f 50 41 52 41 4d 28 61 72 67 63 29 3b 0a  ED_PARAM(argc);.
d3a0: 20 20 70 53 74 72 20 3d 20 28 4a 73 6f 6e 53 74    pStr = (JsonSt
d3b0: 72 69 6e 67 2a 29 73 71 6c 69 74 65 33 5f 61 67  ring*)sqlite3_ag
d3c0: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
d3d0: 63 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 53 74  ctx, sizeof(*pSt
d3e0: 72 29 29 3b 0a 20 20 69 66 28 20 70 53 74 72 20  r));.  if( pStr 
d3f0: 29 7b 0a 20 20 20 20 69 66 28 20 70 53 74 72 2d  ){.    if( pStr-
d400: 3e 7a 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >zBuf==0 ){.    
d410: 20 20 6a 73 6f 6e 49 6e 69 74 28 70 53 74 72 2c    jsonInit(pStr,
d420: 20 63 74 78 29 3b 0a 20 20 20 20 20 20 6a 73 6f   ctx);.      jso
d430: 6e 41 70 70 65 6e 64 43 68 61 72 28 70 53 74 72  nAppendChar(pStr
d440: 2c 20 27 7b 27 29 3b 0a 20 20 20 20 7d 65 6c 73  , '{');.    }els
d450: 65 7b 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70 70  e{.      jsonApp
d460: 65 6e 64 43 68 61 72 28 70 53 74 72 2c 20 27 2c  endChar(pStr, ',
d470: 27 29 3b 0a 20 20 20 20 20 20 70 53 74 72 2d 3e  ');.      pStr->
d480: 70 43 74 78 20 3d 20 63 74 78 3b 0a 20 20 20 20  pCtx = ctx;.    
d490: 7d 0a 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74  }.    z = (const
d4a0: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
d4b0: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
d4c0: 5d 29 3b 0a 20 20 20 20 6e 20 3d 20 28 75 33 32  ]);.    n = (u32
d4d0: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62  )sqlite3_value_b
d4e0: 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20  ytes(argv[0]);. 
d4f0: 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 53 74 72     jsonAppendStr
d500: 69 6e 67 28 70 53 74 72 2c 20 7a 2c 20 6e 29 3b  ing(pStr, z, n);
d510: 0a 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 43  .    jsonAppendC
d520: 68 61 72 28 70 53 74 72 2c 20 27 3a 27 29 3b 0a  har(pStr, ':');.
d530: 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 56 61      jsonAppendVa
d540: 6c 75 65 28 70 53 74 72 2c 20 61 72 67 76 5b 31  lue(pStr, argv[1
d550: 5d 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  ]);.  }.}.static
d560: 20 76 6f 69 64 20 6a 73 6f 6e 4f 62 6a 65 63 74   void jsonObject
d570: 43 6f 6d 70 75 74 65 28 73 71 6c 69 74 65 33 5f  Compute(sqlite3_
d580: 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20 69 6e  context *ctx, in
d590: 74 20 69 73 46 69 6e 61 6c 29 7b 0a 20 20 4a 73  t isFinal){.  Js
d5a0: 6f 6e 53 74 72 69 6e 67 20 2a 70 53 74 72 3b 0a  onString *pStr;.
d5b0: 20 20 70 53 74 72 20 3d 20 28 4a 73 6f 6e 53 74    pStr = (JsonSt
d5c0: 72 69 6e 67 2a 29 73 71 6c 69 74 65 33 5f 61 67  ring*)sqlite3_ag
d5d0: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
d5e0: 63 74 78 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  ctx, 0);.  if( p
d5f0: 53 74 72 20 29 7b 0a 20 20 20 20 6a 73 6f 6e 41  Str ){.    jsonA
d600: 70 70 65 6e 64 43 68 61 72 28 70 53 74 72 2c 20  ppendChar(pStr, 
d610: 27 7d 27 29 3b 0a 20 20 20 20 69 66 28 20 70 53  '}');.    if( pS
d620: 74 72 2d 3e 62 45 72 72 20 29 7b 0a 20 20 20 20  tr->bErr ){.    
d630: 20 20 69 66 28 20 70 53 74 72 2d 3e 62 45 72 72    if( pStr->bErr
d640: 3d 3d 31 20 29 20 73 71 6c 69 74 65 33 5f 72 65  ==1 ) sqlite3_re
d650: 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d  sult_error_nomem
d660: 28 63 74 78 29 3b 0a 20 20 20 20 20 20 61 73 73  (ctx);.      ass
d670: 65 72 74 28 20 70 53 74 72 2d 3e 62 53 74 61 74  ert( pStr->bStat
d680: 69 63 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ic );.    }else 
d690: 69 66 28 20 69 73 46 69 6e 61 6c 20 29 7b 0a 20  if( isFinal ){. 
d6a0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
d6b0: 75 6c 74 5f 74 65 78 74 28 63 74 78 2c 20 70 53  ult_text(ctx, pS
d6c0: 74 72 2d 3e 7a 42 75 66 2c 20 28 69 6e 74 29 70  tr->zBuf, (int)p
d6d0: 53 74 72 2d 3e 6e 55 73 65 64 2c 0a 20 20 20 20  Str->nUsed,.    
d6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6f0: 20 20 20 20 20 20 70 53 74 72 2d 3e 62 53 74 61        pStr->bSta
d700: 74 69 63 20 3f 20 53 51 4c 49 54 45 5f 54 52 41  tic ? SQLITE_TRA
d710: 4e 53 49 45 4e 54 20 3a 20 73 71 6c 69 74 65 33  NSIENT : sqlite3
d720: 5f 66 72 65 65 29 3b 0a 20 20 20 20 20 20 70 53  _free);.      pS
d730: 74 72 2d 3e 62 53 74 61 74 69 63 20 3d 20 31 3b  tr->bStatic = 1;
d740: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
d750: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
d760: 5f 74 65 78 74 28 63 74 78 2c 20 70 53 74 72 2d  _text(ctx, pStr-
d770: 3e 7a 42 75 66 2c 20 28 69 6e 74 29 70 53 74 72  >zBuf, (int)pStr
d780: 2d 3e 6e 55 73 65 64 2c 20 53 51 4c 49 54 45 5f  ->nUsed, SQLITE_
d790: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
d7a0: 20 20 70 53 74 72 2d 3e 6e 55 73 65 64 2d 2d 3b    pStr->nUsed--;
d7b0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
d7c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
d7d0: 6c 74 5f 74 65 78 74 28 63 74 78 2c 20 22 7b 7d  lt_text(ctx, "{}
d7e0: 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 53 54 41  ", 2, SQLITE_STA
d7f0: 54 49 43 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  TIC);.  }.  sqli
d800: 74 65 33 5f 72 65 73 75 6c 74 5f 73 75 62 74 79  te3_result_subty
d810: 70 65 28 63 74 78 2c 20 4a 53 4f 4e 5f 53 55 42  pe(ctx, JSON_SUB
d820: 54 59 50 45 29 3b 0a 7d 0a 73 74 61 74 69 63 20  TYPE);.}.static 
d830: 76 6f 69 64 20 6a 73 6f 6e 4f 62 6a 65 63 74 56  void jsonObjectV
d840: 61 6c 75 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e  alue(sqlite3_con
d850: 74 65 78 74 20 2a 63 74 78 29 7b 0a 20 20 6a 73  text *ctx){.  js
d860: 6f 6e 4f 62 6a 65 63 74 43 6f 6d 70 75 74 65 28  onObjectCompute(
d870: 63 74 78 2c 20 30 29 3b 0a 7d 0a 73 74 61 74 69  ctx, 0);.}.stati
d880: 63 20 76 6f 69 64 20 6a 73 6f 6e 4f 62 6a 65 63  c void jsonObjec
d890: 74 46 69 6e 61 6c 28 73 71 6c 69 74 65 33 5f 63  tFinal(sqlite3_c
d8a0: 6f 6e 74 65 78 74 20 2a 63 74 78 29 7b 0a 20 20  ontext *ctx){.  
d8b0: 6a 73 6f 6e 4f 62 6a 65 63 74 43 6f 6d 70 75 74  jsonObjectComput
d8c0: 65 28 63 74 78 2c 20 31 29 3b 0a 7d 0a 0a 0a 0a  e(ctx, 1);.}....
d8d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d8e0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
d8f0: 0a 2f 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 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
d940: 2a 20 54 68 65 20 6a 73 6f 6e 5f 65 61 63 68 20  * The json_each 
d950: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 0a 2a 2a  virtual table.**
d960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d9a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 74 79 70 65  **********/.type
d9b0: 64 65 66 20 73 74 72 75 63 74 20 4a 73 6f 6e 45  def struct JsonE
d9c0: 61 63 68 43 75 72 73 6f 72 20 4a 73 6f 6e 45 61  achCursor JsonEa
d9d0: 63 68 43 75 72 73 6f 72 3b 0a 73 74 72 75 63 74  chCursor;.struct
d9e0: 20 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 20   JsonEachCursor 
d9f0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62  {.  sqlite3_vtab
da00: 5f 63 75 72 73 6f 72 20 62 61 73 65 3b 20 20 2f  _cursor base;  /
da10: 2a 20 42 61 73 65 20 63 6c 61 73 73 20 2d 20 6d  * Base class - m
da20: 75 73 74 20 62 65 20 66 69 72 73 74 20 2a 2f 0a  ust be first */.
da30: 20 20 75 33 32 20 69 52 6f 77 69 64 3b 20 20 20    u32 iRowid;   
da40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
da50: 54 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75  The rowid */.  u
da60: 33 32 20 69 42 65 67 69 6e 3b 20 20 20 20 20 20  32 iBegin;      
da70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
da80: 20 66 69 72 73 74 20 6e 6f 64 65 20 6f 66 20 74   first node of t
da90: 68 65 20 73 63 61 6e 20 2a 2f 0a 20 20 75 33 32  he scan */.  u32
daa0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
dab0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
dac0: 20 69 6e 20 73 50 61 72 73 65 2e 61 4e 6f 64 65   in sParse.aNode
dad0: 5b 5d 20 6f 66 20 63 75 72 72 65 6e 74 20 72 6f  [] of current ro
dae0: 77 20 2a 2f 0a 20 20 75 33 32 20 69 45 6e 64 3b  w */.  u32 iEnd;
daf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db00: 20 20 2f 2a 20 45 4f 46 20 77 68 65 6e 20 69 20    /* EOF when i 
db10: 65 71 75 61 6c 73 20 6f 72 20 65 78 63 65 65 64  equals or exceed
db20: 73 20 74 68 69 73 20 76 61 6c 75 65 20 2a 2f 0a  s this value */.
db30: 20 20 75 38 20 65 54 79 70 65 3b 20 20 20 20 20    u8 eType;     
db40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
db50: 54 79 70 65 20 6f 66 20 74 6f 70 2d 6c 65 76 65  Type of top-leve
db60: 6c 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75  l element */.  u
db70: 38 20 62 52 65 63 75 72 73 69 76 65 3b 20 20 20  8 bRecursive;   
db80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
db90: 65 20 66 6f 72 20 6a 73 6f 6e 5f 74 72 65 65 28  e for json_tree(
dba0: 29 2e 20 20 46 61 6c 73 65 20 66 6f 72 20 6a 73  ).  False for js
dbb0: 6f 6e 5f 65 61 63 68 28 29 20 2a 2f 0a 20 20 63  on_each() */.  c
dbc0: 68 61 72 20 2a 7a 4a 73 6f 6e 3b 20 20 20 20 20  har *zJson;     
dbd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70            /* Inp
dbe0: 75 74 20 4a 53 4f 4e 20 2a 2f 0a 20 20 63 68 61  ut JSON */.  cha
dbf0: 72 20 2a 7a 52 6f 6f 74 3b 20 20 20 20 20 20 20  r *zRoot;       
dc00: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20          /* Path 
dc10: 62 79 20 77 68 69 63 68 20 74 6f 20 66 69 6c 74  by which to filt
dc20: 65 72 20 7a 4a 73 6f 6e 20 2a 2f 0a 20 20 4a 73  er zJson */.  Js
dc30: 6f 6e 50 61 72 73 65 20 73 50 61 72 73 65 3b 20  onParse sParse; 
dc40: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
dc50: 65 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 4a  e of the input J
dc60: 53 4f 4e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 43 6f  SON */.};../* Co
dc70: 6e 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68  nstructor for th
dc80: 65 20 6a 73 6f 6e 5f 65 61 63 68 20 76 69 72 74  e json_each virt
dc90: 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 73 74 61  ual table */.sta
dca0: 74 69 63 20 69 6e 74 20 6a 73 6f 6e 45 61 63 68  tic int jsonEach
dcb0: 43 6f 6e 6e 65 63 74 28 0a 20 20 73 71 6c 69 74  Connect(.  sqlit
dcc0: 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20 2a  e3 *db,.  void *
dcd0: 70 41 75 78 2c 0a 20 20 69 6e 74 20 61 72 67 63  pAux,.  int argc
dce0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f  , const char *co
dcf0: 6e 73 74 2a 61 72 67 76 2c 0a 20 20 73 71 6c 69  nst*argv,.  sqli
dd00: 74 65 33 5f 76 74 61 62 20 2a 2a 70 70 56 74 61  te3_vtab **ppVta
dd10: 62 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72  b,.  char **pzEr
dd20: 72 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  r.){.  sqlite3_v
dd30: 74 61 62 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  tab *pNew;.  int
dd40: 20 72 63 3b 0a 0a 2f 2a 20 43 6f 6c 75 6d 6e 20   rc;../* Column 
dd50: 6e 75 6d 62 65 72 73 20 2a 2f 0a 23 64 65 66 69  numbers */.#defi
dd60: 6e 65 20 4a 45 41 43 48 5f 4b 45 59 20 20 20 20  ne JEACH_KEY    
dd70: 20 30 0a 23 64 65 66 69 6e 65 20 4a 45 41 43 48   0.#define JEACH
dd80: 5f 56 41 4c 55 45 20 20 20 31 0a 23 64 65 66 69  _VALUE   1.#defi
dd90: 6e 65 20 4a 45 41 43 48 5f 54 59 50 45 20 20 20  ne JEACH_TYPE   
dda0: 20 32 0a 23 64 65 66 69 6e 65 20 4a 45 41 43 48   2.#define JEACH
ddb0: 5f 41 54 4f 4d 20 20 20 20 33 0a 23 64 65 66 69  _ATOM    3.#defi
ddc0: 6e 65 20 4a 45 41 43 48 5f 49 44 20 20 20 20 20  ne JEACH_ID     
ddd0: 20 34 0a 23 64 65 66 69 6e 65 20 4a 45 41 43 48   4.#define JEACH
dde0: 5f 50 41 52 45 4e 54 20 20 35 0a 23 64 65 66 69  _PARENT  5.#defi
ddf0: 6e 65 20 4a 45 41 43 48 5f 46 55 4c 4c 4b 45 59  ne JEACH_FULLKEY
de00: 20 36 0a 23 64 65 66 69 6e 65 20 4a 45 41 43 48   6.#define JEACH
de10: 5f 50 41 54 48 20 20 20 20 37 0a 2f 2a 20 54 68  _PATH    7./* Th
de20: 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74  e xBestIndex met
de30: 68 6f 64 20 61 73 73 75 6d 65 73 20 74 68 61 74  hod assumes that
de40: 20 74 68 65 20 4a 53 4f 4e 20 61 6e 64 20 52 4f   the JSON and RO
de50: 4f 54 20 63 6f 6c 75 6d 6e 73 20 61 72 65 0a 2a  OT columns are.*
de60: 2a 20 74 68 65 20 6c 61 73 74 20 74 77 6f 20 63  * the last two c
de70: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61  olumns in the ta
de80: 62 6c 65 2e 20 20 53 68 6f 75 6c 64 20 74 68 69  ble.  Should thi
de90: 73 20 65 76 65 72 20 63 68 61 6e 67 65 73 2c 20  s ever changes, 
dea0: 62 65 0a 2a 2a 20 73 75 72 65 20 74 6f 20 75 70  be.** sure to up
deb0: 64 61 74 65 20 74 68 65 20 78 42 65 73 74 49 6e  date the xBestIn
dec0: 64 65 78 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 23  dex method. */.#
ded0: 64 65 66 69 6e 65 20 4a 45 41 43 48 5f 4a 53 4f  define JEACH_JSO
dee0: 4e 20 20 20 20 38 0a 23 64 65 66 69 6e 65 20 4a  N    8.#define J
def0: 45 41 43 48 5f 52 4f 4f 54 20 20 20 20 39 0a 0a  EACH_ROOT    9..
df00: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 70    UNUSED_PARAM(p
df10: 7a 45 72 72 29 3b 0a 20 20 55 4e 55 53 45 44 5f  zErr);.  UNUSED_
df20: 50 41 52 41 4d 28 61 72 67 76 29 3b 0a 20 20 55  PARAM(argv);.  U
df30: 4e 55 53 45 44 5f 50 41 52 41 4d 28 61 72 67 63  NUSED_PARAM(argc
df40: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
df50: 4d 28 70 41 75 78 29 3b 0a 20 20 72 63 20 3d 20  M(pAux);.  rc = 
df60: 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f  sqlite3_declare_
df70: 76 74 61 62 28 64 62 2c 20 0a 20 20 20 20 20 22  vtab(db, .     "
df80: 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 28 6b  CREATE TABLE x(k
df90: 65 79 2c 76 61 6c 75 65 2c 74 79 70 65 2c 61 74  ey,value,type,at
dfa0: 6f 6d 2c 69 64 2c 70 61 72 65 6e 74 2c 66 75 6c  om,id,parent,ful
dfb0: 6c 6b 65 79 2c 70 61 74 68 2c 22 0a 20 20 20 20  lkey,path,".    
dfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfd0: 22 6a 73 6f 6e 20 48 49 44 44 45 4e 2c 72 6f 6f  "json HIDDEN,roo
dfe0: 74 20 48 49 44 44 45 4e 29 22 29 3b 0a 20 20 69  t HIDDEN)");.  i
dff0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
e000: 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 2a   ){.    pNew = *
e010: 70 70 56 74 61 62 20 3d 20 73 71 6c 69 74 65 33  ppVtab = sqlite3
e020: 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  _malloc( sizeof(
e030: 2a 70 4e 65 77 29 20 29 3b 0a 20 20 20 20 69 66  *pNew) );.    if
e040: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
e050: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
e060: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65 77  .    memset(pNew
e070: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  , 0, sizeof(*pNe
e080: 77 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  w));.  }.  retur
e090: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 64 65 73 74  n rc;.}../* dest
e0a0: 72 75 63 74 6f 72 20 66 6f 72 20 6a 73 6f 6e 5f  ructor for json_
e0b0: 65 61 63 68 20 76 69 72 74 75 61 6c 20 74 61 62  each virtual tab
e0c0: 6c 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  le */.static int
e0d0: 20 6a 73 6f 6e 45 61 63 68 44 69 73 63 6f 6e 6e   jsonEachDisconn
e0e0: 65 63 74 28 73 71 6c 69 74 65 33 5f 76 74 61 62  ect(sqlite3_vtab
e0f0: 20 2a 70 56 74 61 62 29 7b 0a 20 20 73 71 6c 69   *pVtab){.  sqli
e100: 74 65 33 5f 66 72 65 65 28 70 56 74 61 62 29 3b  te3_free(pVtab);
e110: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
e120: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 63 6f 6e 73 74  _OK;.}../* const
e130: 72 75 63 74 6f 72 20 66 6f 72 20 61 20 4a 73 6f  ructor for a Jso
e140: 6e 45 61 63 68 43 75 72 73 6f 72 20 6f 62 6a 65  nEachCursor obje
e150: 63 74 20 66 6f 72 20 6a 73 6f 6e 5f 65 61 63 68  ct for json_each
e160: 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  (). */.static in
e170: 74 20 6a 73 6f 6e 45 61 63 68 4f 70 65 6e 45 61  t jsonEachOpenEa
e180: 63 68 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  ch(sqlite3_vtab 
e190: 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62  *p, sqlite3_vtab
e1a0: 5f 63 75 72 73 6f 72 20 2a 2a 70 70 43 75 72 73  _cursor **ppCurs
e1b0: 6f 72 29 7b 0a 20 20 4a 73 6f 6e 45 61 63 68 43  or){.  JsonEachC
e1c0: 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20  ursor *pCur;..  
e1d0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 70 29 3b  UNUSED_PARAM(p);
e1e0: 0a 20 20 70 43 75 72 20 3d 20 73 71 6c 69 74 65  .  pCur = sqlite
e1f0: 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
e200: 28 2a 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28  (*pCur) );.  if(
e210: 20 70 43 75 72 3d 3d 30 20 29 20 72 65 74 75 72   pCur==0 ) retur
e220: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
e230: 20 20 6d 65 6d 73 65 74 28 70 43 75 72 2c 20 30    memset(pCur, 0
e240: 2c 20 73 69 7a 65 6f 66 28 2a 70 43 75 72 29 29  , sizeof(*pCur))
e250: 3b 0a 20 20 2a 70 70 43 75 72 73 6f 72 20 3d 20  ;.  *ppCursor = 
e260: 26 70 43 75 72 2d 3e 62 61 73 65 3b 0a 20 20 72  &pCur->base;.  r
e270: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
e280: 0a 7d 0a 0a 2f 2a 20 63 6f 6e 73 74 72 75 63 74  .}../* construct
e290: 6f 72 20 66 6f 72 20 61 20 4a 73 6f 6e 45 61 63  or for a JsonEac
e2a0: 68 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 66  hCursor object f
e2b0: 6f 72 20 6a 73 6f 6e 5f 74 72 65 65 28 29 2e 20  or json_tree(). 
e2c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 73  */.static int js
e2d0: 6f 6e 45 61 63 68 4f 70 65 6e 54 72 65 65 28 73  onEachOpenTree(s
e2e0: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 2c 20  qlite3_vtab *p, 
e2f0: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
e300: 73 6f 72 20 2a 2a 70 70 43 75 72 73 6f 72 29 7b  sor **ppCursor){
e310: 0a 20 20 69 6e 74 20 72 63 20 3d 20 6a 73 6f 6e  .  int rc = json
e320: 45 61 63 68 4f 70 65 6e 45 61 63 68 28 70 2c 20  EachOpenEach(p, 
e330: 70 70 43 75 72 73 6f 72 29 3b 0a 20 20 69 66 28  ppCursor);.  if(
e340: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
e350: 7b 0a 20 20 20 20 4a 73 6f 6e 45 61 63 68 43 75  {.    JsonEachCu
e360: 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 4a 73  rsor *pCur = (Js
e370: 6f 6e 45 61 63 68 43 75 72 73 6f 72 2a 29 2a 70  onEachCursor*)*p
e380: 70 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 43 75  pCursor;.    pCu
e390: 72 2d 3e 62 52 65 63 75 72 73 69 76 65 20 3d 20  r->bRecursive = 
e3a0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
e3b0: 72 63 3b 0a 7d 0a 0a 2f 2a 20 52 65 73 65 74 20  rc;.}../* Reset 
e3c0: 61 20 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72  a JsonEachCursor
e3d0: 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69   back to its ori
e3e0: 67 69 6e 61 6c 20 73 74 61 74 65 2e 20 20 46 72  ginal state.  Fr
e3f0: 65 65 20 61 6e 79 20 6d 65 6d 6f 72 79 0a 2a 2a  ee any memory.**
e400: 20 68 65 6c 64 2e 20 2a 2f 0a 73 74 61 74 69 63   held. */.static
e410: 20 76 6f 69 64 20 6a 73 6f 6e 45 61 63 68 43 75   void jsonEachCu
e420: 72 73 6f 72 52 65 73 65 74 28 4a 73 6f 6e 45 61  rsorReset(JsonEa
e430: 63 68 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  chCursor *p){.  
e440: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
e450: 7a 4a 73 6f 6e 29 3b 0a 20 20 73 71 6c 69 74 65  zJson);.  sqlite
e460: 33 5f 66 72 65 65 28 70 2d 3e 7a 52 6f 6f 74 29  3_free(p->zRoot)
e470: 3b 0a 20 20 6a 73 6f 6e 50 61 72 73 65 52 65 73  ;.  jsonParseRes
e480: 65 74 28 26 70 2d 3e 73 50 61 72 73 65 29 3b 0a  et(&p->sParse);.
e490: 20 20 70 2d 3e 69 52 6f 77 69 64 20 3d 20 30 3b    p->iRowid = 0;
e4a0: 0a 20 20 70 2d 3e 69 20 3d 20 30 3b 0a 20 20 70  .  p->i = 0;.  p
e4b0: 2d 3e 69 45 6e 64 20 3d 20 30 3b 0a 20 20 70 2d  ->iEnd = 0;.  p-
e4c0: 3e 65 54 79 70 65 20 3d 20 30 3b 0a 20 20 70 2d  >eType = 0;.  p-
e4d0: 3e 7a 4a 73 6f 6e 20 3d 20 30 3b 0a 20 20 70 2d  >zJson = 0;.  p-
e4e0: 3e 7a 52 6f 6f 74 20 3d 20 30 3b 0a 7d 0a 0a 2f  >zRoot = 0;.}../
e4f0: 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66 6f 72  * Destructor for
e500: 20 61 20 6a 73 6f 6e 45 61 63 68 43 75 72 73 6f   a jsonEachCurso
e510: 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 73 74 61 74  r object */.stat
e520: 69 63 20 69 6e 74 20 6a 73 6f 6e 45 61 63 68 43  ic int jsonEachC
e530: 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 74 61  lose(sqlite3_vta
e540: 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 29 7b 0a  b_cursor *cur){.
e550: 20 20 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72    JsonEachCursor
e560: 20 2a 70 20 3d 20 28 4a 73 6f 6e 45 61 63 68 43   *p = (JsonEachC
e570: 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20 20 6a 73  ursor*)cur;.  js
e580: 6f 6e 45 61 63 68 43 75 72 73 6f 72 52 65 73 65  onEachCursorRese
e590: 74 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t(p);.  sqlite3_
e5a0: 66 72 65 65 28 63 75 72 29 3b 0a 20 20 72 65 74  free(cur);.  ret
e5b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
e5c0: 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 54 52 55 45  ../* Return TRUE
e5d0: 20 69 66 20 74 68 65 20 6a 73 6f 6e 45 61 63 68   if the jsonEach
e5e0: 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 68 61  Cursor object ha
e5f0: 73 20 62 65 65 6e 20 61 64 76 61 6e 63 65 64 20  s been advanced 
e600: 6f 66 66 20 74 68 65 20 65 6e 64 0a 2a 2a 20 6f  off the end.** o
e610: 66 20 74 68 65 20 4a 53 4f 4e 20 6f 62 6a 65 63  f the JSON objec
e620: 74 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  t */.static int 
e630: 6a 73 6f 6e 45 61 63 68 45 6f 66 28 73 71 6c 69  jsonEachEof(sqli
e640: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
e650: 2a 63 75 72 29 7b 0a 20 20 4a 73 6f 6e 45 61 63  *cur){.  JsonEac
e660: 68 43 75 72 73 6f 72 20 2a 70 20 3d 20 28 4a 73  hCursor *p = (Js
e670: 6f 6e 45 61 63 68 43 75 72 73 6f 72 2a 29 63 75  onEachCursor*)cu
e680: 72 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 69  r;.  return p->i
e690: 20 3e 3d 20 70 2d 3e 69 45 6e 64 3b 0a 7d 0a 0a   >= p->iEnd;.}..
e6a0: 2f 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 63  /* Advance the c
e6b0: 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78  ursor to the nex
e6c0: 74 20 65 6c 65 6d 65 6e 74 20 66 6f 72 20 6a 73  t element for js
e6d0: 6f 6e 5f 74 72 65 65 28 29 20 2a 2f 0a 73 74 61  on_tree() */.sta
e6e0: 74 69 63 20 69 6e 74 20 6a 73 6f 6e 45 61 63 68  tic int jsonEach
e6f0: 4e 65 78 74 28 73 71 6c 69 74 65 33 5f 76 74 61  Next(sqlite3_vta
e700: 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 29 7b 0a  b_cursor *cur){.
e710: 20 20 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72    JsonEachCursor
e720: 20 2a 70 20 3d 20 28 4a 73 6f 6e 45 61 63 68 43   *p = (JsonEachC
e730: 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20 20 69 66  ursor*)cur;.  if
e740: 28 20 70 2d 3e 62 52 65 63 75 72 73 69 76 65 20  ( p->bRecursive 
e750: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 50  ){.    if( p->sP
e760: 61 72 73 65 2e 61 4e 6f 64 65 5b 70 2d 3e 69 5d  arse.aNode[p->i]
e770: 2e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45  .jnFlags & JNODE
e780: 5f 4c 41 42 45 4c 20 29 20 70 2d 3e 69 2b 2b 3b  _LABEL ) p->i++;
e790: 0a 20 20 20 20 70 2d 3e 69 2b 2b 3b 0a 20 20 20  .    p->i++;.   
e7a0: 20 70 2d 3e 69 52 6f 77 69 64 2b 2b 3b 0a 20 20   p->iRowid++;.  
e7b0: 20 20 69 66 28 20 70 2d 3e 69 3c 70 2d 3e 69 45    if( p->i<p->iE
e7c0: 6e 64 20 29 7b 0a 20 20 20 20 20 20 75 33 32 20  nd ){.      u32 
e7d0: 69 55 70 20 3d 20 70 2d 3e 73 50 61 72 73 65 2e  iUp = p->sParse.
e7e0: 61 55 70 5b 70 2d 3e 69 5d 3b 0a 20 20 20 20 20  aUp[p->i];.     
e7f0: 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 55 70 20 3d   JsonNode *pUp =
e800: 20 26 70 2d 3e 73 50 61 72 73 65 2e 61 4e 6f 64   &p->sParse.aNod
e810: 65 5b 69 55 70 5d 3b 0a 20 20 20 20 20 20 70 2d  e[iUp];.      p-
e820: 3e 65 54 79 70 65 20 3d 20 70 55 70 2d 3e 65 54  >eType = pUp->eT
e830: 79 70 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ype;.      if( p
e840: 55 70 2d 3e 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f  Up->eType==JSON_
e850: 41 52 52 41 59 20 29 7b 0a 20 20 20 20 20 20 20  ARRAY ){.       
e860: 20 69 66 28 20 69 55 70 3d 3d 70 2d 3e 69 2d 31   if( iUp==p->i-1
e870: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 55   ){.          pU
e880: 70 2d 3e 75 2e 69 4b 65 79 20 3d 20 30 3b 0a 20  p->u.iKey = 0;. 
e890: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
e8a0: 20 20 20 20 20 20 20 20 70 55 70 2d 3e 75 2e 69          pUp->u.i
e8b0: 4b 65 79 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  Key++;.        }
e8c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
e8d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 77 69 74   }else{.    swit
e8e0: 63 68 28 20 70 2d 3e 65 54 79 70 65 20 29 7b 0a  ch( p->eType ){.
e8f0: 20 20 20 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f        case JSON_
e900: 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 20  ARRAY: {.       
e910: 20 70 2d 3e 69 20 2b 3d 20 6a 73 6f 6e 4e 6f 64   p->i += jsonNod
e920: 65 53 69 7a 65 28 26 70 2d 3e 73 50 61 72 73 65  eSize(&p->sParse
e930: 2e 61 4e 6f 64 65 5b 70 2d 3e 69 5d 29 3b 0a 20  .aNode[p->i]);. 
e940: 20 20 20 20 20 20 20 70 2d 3e 69 52 6f 77 69 64         p->iRowid
e950: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ++;.        brea
e960: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
e970: 20 63 61 73 65 20 4a 53 4f 4e 5f 4f 42 4a 45 43   case JSON_OBJEC
e980: 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  T: {.        p->
e990: 69 20 2b 3d 20 31 20 2b 20 6a 73 6f 6e 4e 6f 64  i += 1 + jsonNod
e9a0: 65 53 69 7a 65 28 26 70 2d 3e 73 50 61 72 73 65  eSize(&p->sParse
e9b0: 2e 61 4e 6f 64 65 5b 70 2d 3e 69 2b 31 5d 29 3b  .aNode[p->i+1]);
e9c0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 52 6f 77  .        p->iRow
e9d0: 69 64 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62 72  id++;.        br
e9e0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
e9f0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
ea00: 20 20 20 20 20 20 70 2d 3e 69 20 3d 20 70 2d 3e        p->i = p->
ea10: 69 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 62 72  iEnd;.        br
ea20: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
ea30: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
ea40: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
ea50: 20 41 70 70 65 6e 64 20 74 68 65 20 6e 61 6d 65   Append the name
ea60: 20 6f 66 20 74 68 65 20 70 61 74 68 20 66 6f 72   of the path for
ea70: 20 65 6c 65 6d 65 6e 74 20 69 20 74 6f 20 70 53   element i to pS
ea80: 74 72 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  tr.*/.static voi
ea90: 64 20 6a 73 6f 6e 45 61 63 68 43 6f 6d 70 75 74  d jsonEachComput
eaa0: 65 50 61 74 68 28 0a 20 20 4a 73 6f 6e 45 61 63  ePath(.  JsonEac
eab0: 68 43 75 72 73 6f 72 20 2a 70 2c 20 20 20 20 20  hCursor *p,     
eac0: 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
ead0: 2a 2f 0a 20 20 4a 73 6f 6e 53 74 72 69 6e 67 20  */.  JsonString 
eae0: 2a 70 53 74 72 2c 20 20 20 20 20 20 20 20 2f 2a  *pStr,        /*
eaf0: 20 57 72 69 74 65 20 74 68 65 20 70 61 74 68 20   Write the path 
eb00: 68 65 72 65 20 2a 2f 0a 20 20 75 33 32 20 69 20  here */.  u32 i 
eb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb20: 20 20 20 2f 2a 20 50 61 74 68 20 74 6f 20 74 68     /* Path to th
eb30: 69 73 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b  is element */.){
eb40: 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f  .  JsonNode *pNo
eb50: 64 65 2c 20 2a 70 55 70 3b 0a 20 20 75 33 32 20  de, *pUp;.  u32 
eb60: 69 55 70 3b 0a 20 20 69 66 28 20 69 3d 3d 30 20  iUp;.  if( i==0 
eb70: 29 7b 0a 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e  ){.    jsonAppen
eb80: 64 43 68 61 72 28 70 53 74 72 2c 20 27 24 27 29  dChar(pStr, '$')
eb90: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
eba0: 7d 0a 20 20 69 55 70 20 3d 20 70 2d 3e 73 50 61  }.  iUp = p->sPa
ebb0: 72 73 65 2e 61 55 70 5b 69 5d 3b 0a 20 20 6a 73  rse.aUp[i];.  js
ebc0: 6f 6e 45 61 63 68 43 6f 6d 70 75 74 65 50 61 74  onEachComputePat
ebd0: 68 28 70 2c 20 70 53 74 72 2c 20 69 55 70 29 3b  h(p, pStr, iUp);
ebe0: 0a 20 20 70 4e 6f 64 65 20 3d 20 26 70 2d 3e 73  .  pNode = &p->s
ebf0: 50 61 72 73 65 2e 61 4e 6f 64 65 5b 69 5d 3b 0a  Parse.aNode[i];.
ec00: 20 20 70 55 70 20 3d 20 26 70 2d 3e 73 50 61 72    pUp = &p->sPar
ec10: 73 65 2e 61 4e 6f 64 65 5b 69 55 70 5d 3b 0a 20  se.aNode[iUp];. 
ec20: 20 69 66 28 20 70 55 70 2d 3e 65 54 79 70 65 3d   if( pUp->eType=
ec30: 3d 4a 53 4f 4e 5f 41 52 52 41 59 20 29 7b 0a 20  =JSON_ARRAY ){. 
ec40: 20 20 20 6a 73 6f 6e 50 72 69 6e 74 66 28 33 30     jsonPrintf(30
ec50: 2c 20 70 53 74 72 2c 20 22 5b 25 64 5d 22 2c 20  , pStr, "[%d]", 
ec60: 70 55 70 2d 3e 75 2e 69 4b 65 79 29 3b 0a 20 20  pUp->u.iKey);.  
ec70: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
ec80: 74 28 20 70 55 70 2d 3e 65 54 79 70 65 3d 3d 4a  t( pUp->eType==J
ec90: 53 4f 4e 5f 4f 42 4a 45 43 54 20 29 3b 0a 20 20  SON_OBJECT );.  
eca0: 20 20 69 66 28 20 28 70 4e 6f 64 65 2d 3e 6a 6e    if( (pNode->jn
ecb0: 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 4c 41  Flags & JNODE_LA
ecc0: 42 45 4c 29 3d 3d 30 20 29 20 70 4e 6f 64 65 2d  BEL)==0 ) pNode-
ecd0: 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  -;.    assert( p
ece0: 4e 6f 64 65 2d 3e 65 54 79 70 65 3d 3d 4a 53 4f  Node->eType==JSO
ecf0: 4e 5f 53 54 52 49 4e 47 20 29 3b 0a 20 20 20 20  N_STRING );.    
ed00: 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e 6a  assert( pNode->j
ed10: 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 4c  nFlags & JNODE_L
ed20: 41 42 45 4c 20 29 3b 0a 20 20 20 20 6a 73 6f 6e  ABEL );.    json
ed30: 50 72 69 6e 74 66 28 70 4e 6f 64 65 2d 3e 6e 2b  Printf(pNode->n+
ed40: 31 2c 20 70 53 74 72 2c 20 22 2e 25 2e 2a 73 22  1, pStr, ".%.*s"
ed50: 2c 20 70 4e 6f 64 65 2d 3e 6e 2d 32 2c 20 70 4e  , pNode->n-2, pN
ed60: 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74  ode->u.zJContent
ed70: 2b 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52  +1);.  }.}../* R
ed80: 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
ed90: 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 73  of a column */.s
eda0: 74 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e 45 61  tatic int jsonEa
edb0: 63 68 43 6f 6c 75 6d 6e 28 0a 20 20 73 71 6c 69  chColumn(.  sqli
edc0: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
edd0: 2a 63 75 72 2c 20 20 20 2f 2a 20 54 68 65 20 63  *cur,   /* The c
ede0: 75 72 73 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74  ursor */.  sqlit
edf0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c  e3_context *ctx,
ee00: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
ee10: 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 71 6c 69  argument to sqli
ee20: 74 65 33 5f 72 65 73 75 6c 74 5f 2e 2e 2e 28 29  te3_result_...()
ee30: 20 2a 2f 0a 20 20 69 6e 74 20 69 20 20 20 20 20   */.  int i     
ee40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee50: 20 20 2f 2a 20 57 68 69 63 68 20 63 6f 6c 75 6d    /* Which colum
ee60: 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 29  n to return */.)
ee70: 7b 0a 20 20 4a 73 6f 6e 45 61 63 68 43 75 72 73  {.  JsonEachCurs
ee80: 6f 72 20 2a 70 20 3d 20 28 4a 73 6f 6e 45 61 63  or *p = (JsonEac
ee90: 68 43 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20 20  hCursor*)cur;.  
eea0: 4a 73 6f 6e 4e 6f 64 65 20 2a 70 54 68 69 73 20  JsonNode *pThis 
eeb0: 3d 20 26 70 2d 3e 73 50 61 72 73 65 2e 61 4e 6f  = &p->sParse.aNo
eec0: 64 65 5b 70 2d 3e 69 5d 3b 0a 20 20 73 77 69 74  de[p->i];.  swit
eed0: 63 68 28 20 69 20 29 7b 0a 20 20 20 20 63 61 73  ch( i ){.    cas
eee0: 65 20 4a 45 41 43 48 5f 4b 45 59 3a 20 7b 0a 20  e JEACH_KEY: {. 
eef0: 20 20 20 20 20 69 66 28 20 70 2d 3e 69 3d 3d 30       if( p->i==0
ef00: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
ef10: 69 66 28 20 70 2d 3e 65 54 79 70 65 3d 3d 4a 53  if( p->eType==JS
ef20: 4f 4e 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20  ON_OBJECT ){.   
ef30: 20 20 20 20 20 6a 73 6f 6e 52 65 74 75 72 6e 28       jsonReturn(
ef40: 70 54 68 69 73 2c 20 63 74 78 2c 20 30 29 3b 0a  pThis, ctx, 0);.
ef50: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
ef60: 70 2d 3e 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f 41  p->eType==JSON_A
ef70: 52 52 41 59 20 29 7b 0a 20 20 20 20 20 20 20 20  RRAY ){.        
ef80: 75 33 32 20 69 4b 65 79 3b 0a 20 20 20 20 20 20  u32 iKey;.      
ef90: 20 20 69 66 28 20 70 2d 3e 62 52 65 63 75 72 73    if( p->bRecurs
efa0: 69 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ive ){.         
efb0: 20 69 66 28 20 70 2d 3e 69 52 6f 77 69 64 3d 3d   if( p->iRowid==
efc0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
efd0: 20 20 20 20 20 69 4b 65 79 20 3d 20 70 2d 3e 73       iKey = p->s
efe0: 50 61 72 73 65 2e 61 4e 6f 64 65 5b 70 2d 3e 73  Parse.aNode[p->s
eff0: 50 61 72 73 65 2e 61 55 70 5b 70 2d 3e 69 5d 5d  Parse.aUp[p->i]]
f000: 2e 75 2e 69 4b 65 79 3b 0a 20 20 20 20 20 20 20  .u.iKey;.       
f010: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f020: 20 20 69 4b 65 79 20 3d 20 70 2d 3e 69 52 6f 77    iKey = p->iRow
f030: 69 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  id;.        }.  
f040: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
f050: 73 75 6c 74 5f 69 6e 74 36 34 28 63 74 78 2c 20  sult_int64(ctx, 
f060: 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 69  (sqlite3_int64)i
f070: 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Key);.      }.  
f080: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f090: 0a 20 20 20 20 63 61 73 65 20 4a 45 41 43 48 5f  .    case JEACH_
f0a0: 56 41 4c 55 45 3a 20 7b 0a 20 20 20 20 20 20 69  VALUE: {.      i
f0b0: 66 28 20 70 54 68 69 73 2d 3e 6a 6e 46 6c 61 67  f( pThis->jnFlag
f0c0: 73 20 26 20 4a 4e 4f 44 45 5f 4c 41 42 45 4c 20  s & JNODE_LABEL 
f0d0: 29 20 70 54 68 69 73 2b 2b 3b 0a 20 20 20 20 20  ) pThis++;.     
f0e0: 20 6a 73 6f 6e 52 65 74 75 72 6e 28 70 54 68 69   jsonReturn(pThi
f0f0: 73 2c 20 63 74 78 2c 20 30 29 3b 0a 20 20 20 20  s, ctx, 0);.    
f100: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
f110: 20 20 20 63 61 73 65 20 4a 45 41 43 48 5f 54 59     case JEACH_TY
f120: 50 45 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  PE: {.      if( 
f130: 70 54 68 69 73 2d 3e 6a 6e 46 6c 61 67 73 20 26  pThis->jnFlags &
f140: 20 4a 4e 4f 44 45 5f 4c 41 42 45 4c 20 29 20 70   JNODE_LABEL ) p
f150: 54 68 69 73 2b 2b 3b 0a 20 20 20 20 20 20 73 71  This++;.      sq
f160: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
f170: 74 28 63 74 78 2c 20 6a 73 6f 6e 54 79 70 65 5b  t(ctx, jsonType[
f180: 70 54 68 69 73 2d 3e 65 54 79 70 65 5d 2c 20 2d  pThis->eType], -
f190: 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
f1a0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
f1b0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a      }.    case J
f1c0: 45 41 43 48 5f 41 54 4f 4d 3a 20 7b 0a 20 20 20  EACH_ATOM: {.   
f1d0: 20 20 20 69 66 28 20 70 54 68 69 73 2d 3e 6a 6e     if( pThis->jn
f1e0: 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 4c 41  Flags & JNODE_LA
f1f0: 42 45 4c 20 29 20 70 54 68 69 73 2b 2b 3b 0a 20  BEL ) pThis++;. 
f200: 20 20 20 20 20 69 66 28 20 70 54 68 69 73 2d 3e       if( pThis->
f210: 65 54 79 70 65 3e 3d 4a 53 4f 4e 5f 41 52 52 41  eType>=JSON_ARRA
f220: 59 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  Y ) break;.     
f230: 20 6a 73 6f 6e 52 65 74 75 72 6e 28 70 54 68 69   jsonReturn(pThi
f240: 73 2c 20 63 74 78 2c 20 30 29 3b 0a 20 20 20 20  s, ctx, 0);.    
f250: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
f260: 20 20 20 63 61 73 65 20 4a 45 41 43 48 5f 49 44     case JEACH_ID
f270: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
f280: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63  3_result_int64(c
f290: 74 78 2c 20 0a 20 20 20 20 20 20 20 20 20 28 73  tx, .         (s
f2a0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 2d 3e  qlite3_int64)p->
f2b0: 69 20 2b 20 28 28 70 54 68 69 73 2d 3e 6a 6e 46  i + ((pThis->jnF
f2c0: 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 4c 41 42  lags & JNODE_LAB
f2d0: 45 4c 29 21 3d 30 29 29 3b 0a 20 20 20 20 20 20  EL)!=0));.      
f2e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
f2f0: 20 63 61 73 65 20 4a 45 41 43 48 5f 50 41 52 45   case JEACH_PARE
f300: 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  NT: {.      if( 
f310: 70 2d 3e 69 3e 70 2d 3e 69 42 65 67 69 6e 20 26  p->i>p->iBegin &
f320: 26 20 70 2d 3e 62 52 65 63 75 72 73 69 76 65 20  & p->bRecursive 
f330: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
f340: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28  e3_result_int64(
f350: 63 74 78 2c 20 28 73 71 6c 69 74 65 33 5f 69 6e  ctx, (sqlite3_in
f360: 74 36 34 29 70 2d 3e 73 50 61 72 73 65 2e 61 55  t64)p->sParse.aU
f370: 70 5b 70 2d 3e 69 5d 29 3b 0a 20 20 20 20 20 20  p[p->i]);.      
f380: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
f390: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 45     }.    case JE
f3a0: 41 43 48 5f 46 55 4c 4c 4b 45 59 3a 20 7b 0a 20  ACH_FULLKEY: {. 
f3b0: 20 20 20 20 20 4a 73 6f 6e 53 74 72 69 6e 67 20       JsonString 
f3c0: 78 3b 0a 20 20 20 20 20 20 6a 73 6f 6e 49 6e 69  x;.      jsonIni
f3d0: 74 28 26 78 2c 20 63 74 78 29 3b 0a 20 20 20 20  t(&x, ctx);.    
f3e0: 20 20 69 66 28 20 70 2d 3e 62 52 65 63 75 72 73    if( p->bRecurs
f3f0: 69 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20 6a  ive ){.        j
f400: 73 6f 6e 45 61 63 68 43 6f 6d 70 75 74 65 50 61  sonEachComputePa
f410: 74 68 28 70 2c 20 26 78 2c 20 70 2d 3e 69 29 3b  th(p, &x, p->i);
f420: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
f430: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 7a 52 6f        if( p->zRo
f440: 6f 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ot ){.          
f450: 6a 73 6f 6e 41 70 70 65 6e 64 52 61 77 28 26 78  jsonAppendRaw(&x
f460: 2c 20 70 2d 3e 7a 52 6f 6f 74 2c 20 28 69 6e 74  , p->zRoot, (int
f470: 29 73 74 72 6c 65 6e 28 70 2d 3e 7a 52 6f 6f 74  )strlen(p->zRoot
f480: 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ));.        }els
f490: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6a 73 6f  e{.          jso
f4a0: 6e 41 70 70 65 6e 64 43 68 61 72 28 26 78 2c 20  nAppendChar(&x, 
f4b0: 27 24 27 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  '$');.        }.
f4c0: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65          if( p->e
f4d0: 54 79 70 65 3d 3d 4a 53 4f 4e 5f 41 52 52 41 59  Type==JSON_ARRAY
f4e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6a 73   ){.          js
f4f0: 6f 6e 50 72 69 6e 74 66 28 33 30 2c 20 26 78 2c  onPrintf(30, &x,
f500: 20 22 5b 25 64 5d 22 2c 20 70 2d 3e 69 52 6f 77   "[%d]", p->iRow
f510: 69 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  id);.        }el
f520: 73 65 20 69 66 28 20 70 2d 3e 65 54 79 70 65 3d  se if( p->eType=
f530: 3d 4a 53 4f 4e 5f 4f 42 4a 45 43 54 20 29 7b 0a  =JSON_OBJECT ){.
f540: 20 20 20 20 20 20 20 20 20 20 6a 73 6f 6e 50 72            jsonPr
f550: 69 6e 74 66 28 70 54 68 69 73 2d 3e 6e 2c 20 26  intf(pThis->n, &
f560: 78 2c 20 22 2e 25 2e 2a 73 22 2c 20 70 54 68 69  x, ".%.*s", pThi
f570: 73 2d 3e 6e 2d 32 2c 20 70 54 68 69 73 2d 3e 75  s->n-2, pThis->u
f580: 2e 7a 4a 43 6f 6e 74 65 6e 74 2b 31 29 3b 0a 20  .zJContent+1);. 
f590: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
f5a0: 0a 20 20 20 20 20 20 6a 73 6f 6e 52 65 73 75 6c  .      jsonResul
f5b0: 74 28 26 78 29 3b 0a 20 20 20 20 20 20 62 72 65  t(&x);.      bre
f5c0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
f5d0: 73 65 20 4a 45 41 43 48 5f 50 41 54 48 3a 20 7b  se JEACH_PATH: {
f5e0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 62 52  .      if( p->bR
f5f0: 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
f600: 20 20 20 20 4a 73 6f 6e 53 74 72 69 6e 67 20 78      JsonString x
f610: 3b 0a 20 20 20 20 20 20 20 20 6a 73 6f 6e 49 6e  ;.        jsonIn
f620: 69 74 28 26 78 2c 20 63 74 78 29 3b 0a 20 20 20  it(&x, ctx);.   
f630: 20 20 20 20 20 6a 73 6f 6e 45 61 63 68 43 6f 6d       jsonEachCom
f640: 70 75 74 65 50 61 74 68 28 70 2c 20 26 78 2c 20  putePath(p, &x, 
f650: 70 2d 3e 73 50 61 72 73 65 2e 61 55 70 5b 70 2d  p->sParse.aUp[p-
f660: 3e 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 6a 73  >i]);.        js
f670: 6f 6e 52 65 73 75 6c 74 28 26 78 29 3b 0a 20 20  onResult(&x);.  
f680: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f690: 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 6f     }.      /* Fo
f6a0: 72 20 6a 73 6f 6e 5f 65 61 63 68 28 29 20 70 61  r json_each() pa
f6b0: 74 68 20 61 6e 64 20 72 6f 6f 74 20 61 72 65 20  th and root are 
f6c0: 74 68 65 20 73 61 6d 65 20 73 6f 20 66 61 6c 6c  the same so fall
f6d0: 20 74 68 72 6f 75 67 68 0a 20 20 20 20 20 20 2a   through.      *
f6e0: 2a 20 69 6e 74 6f 20 74 68 65 20 72 6f 6f 74 20  * into the root 
f6f0: 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  case */.    }.  
f700: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
f710: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
f720: 52 6f 6f 74 20 3d 20 70 2d 3e 7a 52 6f 6f 74 3b  Root = p->zRoot;
f730: 0a 20 20 20 20 20 20 69 66 28 20 7a 52 6f 6f 74  .      if( zRoot
f740: 3d 3d 30 20 29 20 7a 52 6f 6f 74 20 3d 20 22 24  ==0 ) zRoot = "$
f750: 22 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ";.      sqlite3
f760: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 74 78  _result_text(ctx
f770: 2c 20 7a 52 6f 6f 74 2c 20 2d 31 2c 20 53 51 4c  , zRoot, -1, SQL
f780: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
f790: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
f7a0: 20 20 20 20 63 61 73 65 20 4a 45 41 43 48 5f 4a      case JEACH_J
f7b0: 53 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  SON: {.      ass
f7c0: 65 72 74 28 20 69 3d 3d 4a 45 41 43 48 5f 4a 53  ert( i==JEACH_JS
f7d0: 4f 4e 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ON );.      sqli
f7e0: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
f7f0: 63 74 78 2c 20 70 2d 3e 73 50 61 72 73 65 2e 7a  ctx, p->sParse.z
f800: 4a 73 6f 6e 2c 20 2d 31 2c 20 53 51 4c 49 54 45  Json, -1, SQLITE
f810: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
f820: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
f830: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
f840: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  _OK;.}../* Retur
f850: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  n the current ro
f860: 77 69 64 20 76 61 6c 75 65 20 2a 2f 0a 73 74 61  wid value */.sta
f870: 74 69 63 20 69 6e 74 20 6a 73 6f 6e 45 61 63 68  tic int jsonEach
f880: 52 6f 77 69 64 28 73 71 6c 69 74 65 33 5f 76 74  Rowid(sqlite3_vt
f890: 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 2c 20  ab_cursor *cur, 
f8a0: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 52  sqlite_int64 *pR
f8b0: 6f 77 69 64 29 7b 0a 20 20 4a 73 6f 6e 45 61 63  owid){.  JsonEac
f8c0: 68 43 75 72 73 6f 72 20 2a 70 20 3d 20 28 4a 73  hCursor *p = (Js
f8d0: 6f 6e 45 61 63 68 43 75 72 73 6f 72 2a 29 63 75  onEachCursor*)cu
f8e0: 72 3b 0a 20 20 2a 70 52 6f 77 69 64 20 3d 20 70  r;.  *pRowid = p
f8f0: 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 72 65 74 75  ->iRowid;.  retu
f900: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
f910: 0a 2f 2a 20 54 68 65 20 71 75 65 72 79 20 73 74  ./* The query st
f920: 72 61 74 65 67 79 20 69 73 20 74 6f 20 6c 6f 6f  rategy is to loo
f930: 6b 20 66 6f 72 20 61 6e 20 65 71 75 61 6c 69 74  k for an equalit
f940: 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20  y constraint on 
f950: 74 68 65 20 6a 73 6f 6e 0a 2a 2a 20 63 6f 6c 75  the json.** colu
f960: 6d 6e 2e 20 20 57 69 74 68 6f 75 74 20 73 75 63  mn.  Without suc
f970: 68 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20  h a constraint, 
f980: 74 68 65 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74  the table cannot
f990: 20 6f 70 65 72 61 74 65 2e 20 20 69 64 78 4e 75   operate.  idxNu
f9a0: 6d 20 69 73 0a 2a 2a 20 31 20 69 66 20 74 68 65  m is.** 1 if the
f9b0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 66   constraint is f
f9c0: 6f 75 6e 64 2c 20 33 20 69 66 20 74 68 65 20 63  ound, 3 if the c
f9d0: 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 7a 52  onstraint and zR
f9e0: 6f 6f 74 20 61 72 65 20 66 6f 75 6e 64 2c 0a 2a  oot are found,.*
f9f0: 2a 20 61 6e 64 20 30 20 6f 74 68 65 72 77 69 73  * and 0 otherwis
fa00: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
fa10: 20 6a 73 6f 6e 45 61 63 68 42 65 73 74 49 6e 64   jsonEachBestInd
fa20: 65 78 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  ex(.  sqlite3_vt
fa30: 61 62 20 2a 74 61 62 2c 0a 20 20 73 71 6c 69 74  ab *tab,.  sqlit
fa40: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
fa50: 49 64 78 49 6e 66 6f 0a 29 7b 0a 20 20 69 6e 74  IdxInfo.){.  int
fa60: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
fa70: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
fa80: 63 6f 75 6e 74 65 72 20 6f 72 20 63 6f 6d 70 75  counter or compu
fa90: 74 65 64 20 61 72 72 61 79 20 69 6e 64 65 78 20  ted array index 
faa0: 2a 2f 0a 20 20 69 6e 74 20 61 49 64 78 5b 32 5d  */.  int aIdx[2]
fab0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
fac0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6e 73  /* Index of cons
fad0: 74 72 61 69 6e 74 73 20 66 6f 72 20 4a 53 4f 4e  traints for JSON
fae0: 20 61 6e 64 20 52 4f 4f 54 20 2a 2f 0a 20 20 69   and ROOT */.  i
faf0: 6e 74 20 75 6e 75 73 61 62 6c 65 4d 61 73 6b 20  nt unusableMask 
fb00: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4d 61 73  = 0;      /* Mas
fb10: 6b 20 6f 66 20 75 6e 75 73 61 62 6c 65 20 4a 53  k of unusable JS
fb20: 4f 4e 20 61 6e 64 20 52 4f 4f 54 20 63 6f 6e 73  ON and ROOT cons
fb30: 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  traints */.  int
fb40: 20 69 64 78 4d 61 73 6b 20 3d 20 30 3b 20 20 20   idxMask = 0;   
fb50: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
fb60: 6f 66 20 75 73 61 62 6c 65 20 3d 3d 20 63 6f 6e  of usable == con
fb70: 73 74 72 61 69 6e 74 73 20 4a 53 4f 4e 20 61 6e  straints JSON an
fb80: 64 20 52 4f 4f 54 20 2a 2f 0a 20 20 63 6f 6e 73  d ROOT */.  cons
fb90: 74 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  t struct sqlite3
fba0: 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
fbb0: 74 20 2a 70 43 6f 6e 73 74 72 61 69 6e 74 3b 0a  t *pConstraint;.
fbc0: 0a 20 20 2f 2a 20 54 68 69 73 20 69 6d 70 6c 65  .  /* This imple
fbd0: 6d 65 6e 74 61 74 69 6f 6e 20 61 73 73 75 6d 65  mentation assume
fbe0: 73 20 74 68 61 74 20 4a 53 4f 4e 20 61 6e 64 20  s that JSON and 
fbf0: 52 4f 4f 54 20 61 72 65 20 74 68 65 20 6c 61 73  ROOT are the las
fc00: 74 20 74 77 6f 0a 20 20 2a 2a 20 63 6f 6c 75 6d  t two.  ** colum
fc10: 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ns in the table 
fc20: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 4a 45 41  */.  assert( JEA
fc30: 43 48 5f 52 4f 4f 54 20 3d 3d 20 4a 45 41 43 48  CH_ROOT == JEACH
fc40: 5f 4a 53 4f 4e 2b 31 20 29 3b 0a 20 20 55 4e 55  _JSON+1 );.  UNU
fc50: 53 45 44 5f 50 41 52 41 4d 28 74 61 62 29 3b 0a  SED_PARAM(tab);.
fc60: 20 20 61 49 64 78 5b 30 5d 20 3d 20 61 49 64 78    aIdx[0] = aIdx
fc70: 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 43 6f 6e  [1] = -1;.  pCon
fc80: 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78 49 6e  straint = pIdxIn
fc90: 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->aConstraint;
fca0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49  .  for(i=0; i<pI
fcb0: 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
fcc0: 69 6e 74 3b 20 69 2b 2b 2c 20 70 43 6f 6e 73 74  int; i++, pConst
fcd0: 72 61 69 6e 74 2b 2b 29 7b 0a 20 20 20 20 69 6e  raint++){.    in
fce0: 74 20 69 43 6f 6c 3b 0a 20 20 20 20 69 6e 74 20  t iCol;.    int 
fcf0: 69 4d 61 73 6b 3b 0a 20 20 20 20 69 66 28 20 70  iMask;.    if( p
fd00: 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 69 43 6f 6c  Constraint->iCol
fd10: 75 6d 6e 20 3c 20 4a 45 41 43 48 5f 4a 53 4f 4e  umn < JEACH_JSON
fd20: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
fd30: 20 69 43 6f 6c 20 3d 20 70 43 6f 6e 73 74 72 61   iCol = pConstra
fd40: 69 6e 74 2d 3e 69 43 6f 6c 75 6d 6e 20 2d 20 4a  int->iColumn - J
fd50: 45 41 43 48 5f 4a 53 4f 4e 3b 0a 20 20 20 20 61  EACH_JSON;.    a
fd60: 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 30 20 7c  ssert( iCol==0 |
fd70: 7c 20 69 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20  | iCol==1 );.   
fd80: 20 69 4d 61 73 6b 20 3d 20 31 20 3c 3c 20 69 43   iMask = 1 << iC
fd90: 6f 6c 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6e  ol;.    if( pCon
fda0: 73 74 72 61 69 6e 74 2d 3e 75 73 61 62 6c 65 3d  straint->usable=
fdb0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 75 73  =0 ){.      unus
fdc0: 61 62 6c 65 4d 61 73 6b 20 7c 3d 20 69 4d 61 73  ableMask |= iMas
fdd0: 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  k;.    }else if(
fde0: 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f 70   pConstraint->op
fdf0: 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
fe00: 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 29 7b 0a  ONSTRAINT_EQ ){.
fe10: 20 20 20 20 20 20 61 49 64 78 5b 69 43 6f 6c 5d        aIdx[iCol]
fe20: 20 3d 20 69 3b 0a 20 20 20 20 20 20 69 64 78 4d   = i;.      idxM
fe30: 61 73 6b 20 7c 3d 20 69 4d 61 73 6b 3b 0a 20 20  ask |= iMask;.  
fe40: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 75    }.  }.  if( (u
fe50: 6e 75 73 61 62 6c 65 4d 61 73 6b 20 26 20 7e 69  nusableMask & ~i
fe60: 64 78 4d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20  dxMask)!=0 ){.  
fe70: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
fe80: 65 20 61 6e 79 20 75 6e 75 73 61 62 6c 65 20 63  e any unusable c
fe90: 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 4a 53  onstraints on JS
fea0: 4f 4e 20 6f 72 20 52 4f 4f 54 2c 20 74 68 65 6e  ON or ROOT, then
feb0: 20 72 65 6a 65 63 74 0a 20 20 20 20 2a 2a 20 74   reject.    ** t
fec0: 68 69 73 20 65 6e 74 69 72 65 20 70 6c 61 6e 20  his entire plan 
fed0: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
fee0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b  LITE_CONSTRAINT;
fef0: 0a 20 20 7d 0a 20 20 69 66 28 20 61 49 64 78 5b  .  }.  if( aIdx[
ff00: 30 5d 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  0]<0 ){.    /* N
ff10: 6f 20 4a 53 4f 4e 20 69 6e 70 75 74 2e 20 20 4c  o JSON input.  L
ff20: 65 61 76 65 20 65 73 74 69 6d 61 74 65 64 43 6f  eave estimatedCo
ff30: 73 74 20 61 74 20 74 68 65 20 68 75 67 65 20 76  st at the huge v
ff40: 61 6c 75 65 20 74 68 61 74 20 69 74 20 77 61 73  alue that it was
ff50: 0a 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69  .    ** initiali
ff60: 7a 65 64 20 74 6f 20 74 6f 20 64 69 73 63 6f 75  zed to to discou
ff70: 72 61 67 65 20 74 68 65 20 71 75 65 72 79 20 70  rage the query p
ff80: 6c 61 6e 6e 65 72 20 66 72 6f 6d 20 73 65 6c 65  lanner from sele
ff90: 63 74 69 6e 67 20 74 68 69 73 0a 20 20 20 20 2a  cting this.    *
ffa0: 2a 20 70 6c 61 6e 2e 20 2a 2f 0a 20 20 20 20 70  * plan. */.    p
ffb0: 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20  IdxInfo->idxNum 
ffc0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
ffd0: 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69    pIdxInfo->esti
ffe0: 6d 61 74 65 64 43 6f 73 74 20 3d 20 31 2e 30 3b  matedCost = 1.0;
fff0: 0a 20 20 20 20 69 20 3d 20 61 49 64 78 5b 30 5d  .    i = aIdx[0]
10000 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  ;.    pIdxInfo->
10010 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
10020 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20  [i].argvIndex = 
10030 31 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  1;.    pIdxInfo-
10040 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
10050 65 5b 69 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20  e[i].omit = 1;. 
10060 20 20 20 69 66 28 20 61 49 64 78 5b 31 5d 3c 30     if( aIdx[1]<0
10070 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 49 6e   ){.      pIdxIn
10080 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 31 3b 20  fo->idxNum = 1; 
10090 20 2f 2a 20 4f 6e 6c 79 20 4a 53 4f 4e 20 73 75   /* Only JSON su
100a0 70 70 6c 69 65 64 2e 20 20 50 6c 61 6e 20 31 20  pplied.  Plan 1 
100b0 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
100c0 20 20 20 20 69 20 3d 20 61 49 64 78 5b 31 5d 3b      i = aIdx[1];
100d0 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  .      pIdxInfo-
100e0 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
100f0 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d  e[i].argvIndex =
10100 20 32 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e   2;.      pIdxIn
10110 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
10120 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 20 3d 20 31  sage[i].omit = 1
10130 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f  ;.      pIdxInfo
10140 2d 3e 69 64 78 4e 75 6d 20 3d 20 33 3b 20 20 2f  ->idxNum = 3;  /
10150 2a 20 42 6f 74 68 20 4a 53 4f 4e 20 61 6e 64 20  * Both JSON and 
10160 52 4f 4f 54 20 61 72 65 20 73 75 70 70 6c 69 65  ROOT are supplie
10170 64 2e 20 20 50 6c 61 6e 20 33 20 2a 2f 0a 20 20  d.  Plan 3 */.  
10180 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
10190 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
101a0 2a 20 53 74 61 72 74 20 61 20 73 65 61 72 63 68  * Start a search
101b0 20 6f 6e 20 61 20 6e 65 77 20 4a 53 4f 4e 20 73   on a new JSON s
101c0 74 72 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20  tring */.static 
101d0 69 6e 74 20 6a 73 6f 6e 45 61 63 68 46 69 6c 74  int jsonEachFilt
101e0 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  er(.  sqlite3_vt
101f0 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 2c 0a  ab_cursor *cur,.
10200 20 20 69 6e 74 20 69 64 78 4e 75 6d 2c 20 63 6f    int idxNum, co
10210 6e 73 74 20 63 68 61 72 20 2a 69 64 78 53 74 72  nst char *idxStr
10220 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 73 71  ,.  int argc, sq
10230 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
10240 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e 45 61 63 68  gv.){.  JsonEach
10250 43 75 72 73 6f 72 20 2a 70 20 3d 20 28 4a 73 6f  Cursor *p = (Jso
10260 6e 45 61 63 68 43 75 72 73 6f 72 2a 29 63 75 72  nEachCursor*)cur
10270 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
10280 7a 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  z;.  const char 
10290 2a 7a 52 6f 6f 74 20 3d 20 30 3b 0a 20 20 73 71  *zRoot = 0;.  sq
102a0 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 3b 0a 0a  lite3_int64 n;..
102b0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 69    UNUSED_PARAM(i
102c0 64 78 53 74 72 29 3b 0a 20 20 55 4e 55 53 45 44  dxStr);.  UNUSED
102d0 5f 50 41 52 41 4d 28 61 72 67 63 29 3b 0a 20 20  _PARAM(argc);.  
102e0 6a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 52 65  jsonEachCursorRe
102f0 73 65 74 28 70 29 3b 0a 20 20 69 66 28 20 69 64  set(p);.  if( id
10300 78 4e 75 6d 3d 3d 30 20 29 20 72 65 74 75 72 6e  xNum==0 ) return
10310 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7a 20   SQLITE_OK;.  z 
10320 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
10330 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
10340 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66  t(argv[0]);.  if
10350 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( z==0 ) return 
10360 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6e 20 3d  SQLITE_OK;.  n =
10370 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
10380 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20  ytes(argv[0]);. 
10390 20 70 2d 3e 7a 4a 73 6f 6e 20 3d 20 73 71 6c 69   p->zJson = sqli
103a0 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 6e 2b  te3_malloc64( n+
103b0 31 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 4a  1 );.  if( p->zJ
103c0 73 6f 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  son==0 ) return 
103d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
103e0 6d 65 6d 63 70 79 28 70 2d 3e 7a 4a 73 6f 6e 2c  memcpy(p->zJson,
103f0 20 7a 2c 20 28 73 69 7a 65 5f 74 29 6e 2b 31 29   z, (size_t)n+1)
10400 3b 0a 20 20 69 66 28 20 6a 73 6f 6e 50 61 72 73  ;.  if( jsonPars
10410 65 28 26 70 2d 3e 73 50 61 72 73 65 2c 20 30 2c  e(&p->sParse, 0,
10420 20 70 2d 3e 7a 4a 73 6f 6e 29 20 29 7b 0a 20 20   p->zJson) ){.  
10430 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
10440 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 69 66 28  E_NOMEM;.    if(
10450 20 70 2d 3e 73 50 61 72 73 65 2e 6f 6f 6d 3d 3d   p->sParse.oom==
10460 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
10470 65 33 5f 66 72 65 65 28 63 75 72 2d 3e 70 56 74  e3_free(cur->pVt
10480 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ab->zErrMsg);.  
10490 20 20 20 20 63 75 72 2d 3e 70 56 74 61 62 2d 3e      cur->pVtab->
104a0 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
104b0 33 5f 6d 70 72 69 6e 74 66 28 22 6d 61 6c 66 6f  3_mprintf("malfo
104c0 72 6d 65 64 20 4a 53 4f 4e 22 29 3b 0a 20 20 20  rmed JSON");.   
104d0 20 20 20 69 66 28 20 63 75 72 2d 3e 70 56 74 61     if( cur->pVta
104e0 62 2d 3e 7a 45 72 72 4d 73 67 20 29 20 72 63 20  b->zErrMsg ) rc 
104f0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
10500 20 20 20 20 7d 0a 20 20 20 20 6a 73 6f 6e 45 61      }.    jsonEa
10510 63 68 43 75 72 73 6f 72 52 65 73 65 74 28 70 29  chCursorReset(p)
10520 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
10530 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
10540 62 52 65 63 75 72 73 69 76 65 20 26 26 20 6a 73  bRecursive && js
10550 6f 6e 50 61 72 73 65 46 69 6e 64 50 61 72 65 6e  onParseFindParen
10560 74 73 28 26 70 2d 3e 73 50 61 72 73 65 29 20 29  ts(&p->sParse) )
10570 7b 0a 20 20 20 20 6a 73 6f 6e 45 61 63 68 43 75  {.    jsonEachCu
10580 72 73 6f 72 52 65 73 65 74 28 70 29 3b 0a 20 20  rsorReset(p);.  
10590 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
105a0 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NOMEM;.  }else{.
105b0 20 20 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e      JsonNode *pN
105c0 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ode = 0;.    if(
105d0 20 69 64 78 4e 75 6d 3d 3d 33 20 29 7b 0a 20 20   idxNum==3 ){.  
105e0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
105f0 7a 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  zErr = 0;.      
10600 7a 52 6f 6f 74 20 3d 20 28 63 6f 6e 73 74 20 63  zRoot = (const c
10610 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
10620 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29  ue_text(argv[1])
10630 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52 6f 6f  ;.      if( zRoo
10640 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  t==0 ) return SQ
10650 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 6e  LITE_OK;.      n
10660 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
10670 5f 62 79 74 65 73 28 61 72 67 76 5b 31 5d 29 3b  _bytes(argv[1]);
10680 0a 20 20 20 20 20 20 70 2d 3e 7a 52 6f 6f 74 20  .      p->zRoot 
10690 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
106a0 36 34 28 20 6e 2b 31 20 29 3b 0a 20 20 20 20 20  64( n+1 );.     
106b0 20 69 66 28 20 70 2d 3e 7a 52 6f 6f 74 3d 3d 30   if( p->zRoot==0
106c0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
106d0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 6d 65  _NOMEM;.      me
106e0 6d 63 70 79 28 70 2d 3e 7a 52 6f 6f 74 2c 20 7a  mcpy(p->zRoot, z
106f0 52 6f 6f 74 2c 20 28 73 69 7a 65 5f 74 29 6e 2b  Root, (size_t)n+
10700 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52  1);.      if( zR
10710 6f 6f 74 5b 30 5d 21 3d 27 24 27 20 29 7b 0a 20  oot[0]!='$' ){. 
10720 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20 7a 52         zErr = zR
10730 6f 6f 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  oot;.      }else
10740 7b 0a 20 20 20 20 20 20 20 20 70 4e 6f 64 65 20  {.        pNode 
10750 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 53 74 65 70  = jsonLookupStep
10760 28 26 70 2d 3e 73 50 61 72 73 65 2c 20 30 2c 20  (&p->sParse, 0, 
10770 70 2d 3e 7a 52 6f 6f 74 2b 31 2c 20 30 2c 20 26  p->zRoot+1, 0, &
10780 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  zErr);.      }. 
10790 20 20 20 20 20 69 66 28 20 7a 45 72 72 20 29 7b       if( zErr ){
107a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
107b0 5f 66 72 65 65 28 63 75 72 2d 3e 70 56 74 61 62  _free(cur->pVtab
107c0 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
107d0 20 20 20 20 63 75 72 2d 3e 70 56 74 61 62 2d 3e      cur->pVtab->
107e0 7a 45 72 72 4d 73 67 20 3d 20 6a 73 6f 6e 50 61  zErrMsg = jsonPa
107f0 74 68 53 79 6e 74 61 78 45 72 72 6f 72 28 7a 45  thSyntaxError(zE
10800 72 72 29 3b 0a 20 20 20 20 20 20 20 20 6a 73 6f  rr);.        jso
10810 6e 45 61 63 68 43 75 72 73 6f 72 52 65 73 65 74  nEachCursorReset
10820 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  (p);.        ret
10830 75 72 6e 20 63 75 72 2d 3e 70 56 74 61 62 2d 3e  urn cur->pVtab->
10840 7a 45 72 72 4d 73 67 20 3f 20 53 51 4c 49 54 45  zErrMsg ? SQLITE
10850 5f 45 52 52 4f 52 20 3a 20 53 51 4c 49 54 45 5f  _ERROR : SQLITE_
10860 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c  NOMEM;.      }el
10870 73 65 20 69 66 28 20 70 4e 6f 64 65 3d 3d 30 20  se if( pNode==0 
10880 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
10890 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
108a0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
108b0 20 20 20 20 20 20 70 4e 6f 64 65 20 3d 20 70 2d        pNode = p-
108c0 3e 73 50 61 72 73 65 2e 61 4e 6f 64 65 3b 0a 20  >sParse.aNode;. 
108d0 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 42 65 67     }.    p->iBeg
108e0 69 6e 20 3d 20 70 2d 3e 69 20 3d 20 28 69 6e 74  in = p->i = (int
108f0 29 28 70 4e 6f 64 65 20 2d 20 70 2d 3e 73 50 61  )(pNode - p->sPa
10900 72 73 65 2e 61 4e 6f 64 65 29 3b 0a 20 20 20 20  rse.aNode);.    
10910 70 2d 3e 65 54 79 70 65 20 3d 20 70 4e 6f 64 65  p->eType = pNode
10920 2d 3e 65 54 79 70 65 3b 0a 20 20 20 20 69 66 28  ->eType;.    if(
10930 20 70 2d 3e 65 54 79 70 65 3e 3d 4a 53 4f 4e 5f   p->eType>=JSON_
10940 41 52 52 41 59 20 29 7b 0a 20 20 20 20 20 20 70  ARRAY ){.      p
10950 4e 6f 64 65 2d 3e 75 2e 69 4b 65 79 20 3d 20 30  Node->u.iKey = 0
10960 3b 0a 20 20 20 20 20 20 70 2d 3e 69 45 6e 64 20  ;.      p->iEnd 
10970 3d 20 70 2d 3e 69 20 2b 20 70 4e 6f 64 65 2d 3e  = p->i + pNode->
10980 6e 20 2b 20 31 3b 0a 20 20 20 20 20 20 69 66 28  n + 1;.      if(
10990 20 70 2d 3e 62 52 65 63 75 72 73 69 76 65 20 29   p->bRecursive )
109a0 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 54 79  {.        p->eTy
109b0 70 65 20 3d 20 70 2d 3e 73 50 61 72 73 65 2e 61  pe = p->sParse.a
109c0 4e 6f 64 65 5b 70 2d 3e 73 50 61 72 73 65 2e 61  Node[p->sParse.a
109d0 55 70 5b 70 2d 3e 69 5d 5d 2e 65 54 79 70 65 3b  Up[p->i]].eType;
109e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
109f0 69 3e 30 20 26 26 20 28 70 2d 3e 73 50 61 72 73  i>0 && (p->sPars
10a00 65 2e 61 4e 6f 64 65 5b 70 2d 3e 69 2d 31 5d 2e  e.aNode[p->i-1].
10a10 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f  jnFlags & JNODE_
10a20 4c 41 42 45 4c 29 21 3d 30 20 29 7b 0a 20 20 20  LABEL)!=0 ){.   
10a30 20 20 20 20 20 20 20 70 2d 3e 69 2d 2d 3b 0a 20         p->i--;. 
10a40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
10a50 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 2d  else{.        p-
10a60 3e 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  >i++;.      }.  
10a70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
10a80 2d 3e 69 45 6e 64 20 3d 20 70 2d 3e 69 2b 31 3b  ->iEnd = p->i+1;
10a90 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
10aa0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
10ab0 0a 0a 2f 2a 20 54 68 65 20 6d 65 74 68 6f 64 73  ../* The methods
10ac0 20 6f 66 20 74 68 65 20 6a 73 6f 6e 5f 65 61 63   of the json_eac
10ad0 68 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  h virtual table 
10ae0 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
10af0 33 5f 6d 6f 64 75 6c 65 20 6a 73 6f 6e 45 61 63  3_module jsonEac
10b00 68 4d 6f 64 75 6c 65 20 3d 20 7b 0a 20 20 30 2c  hModule = {.  0,
10b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
10b30 73 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20  sion */.  0,    
10b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b50 20 20 20 20 20 2f 2a 20 78 43 72 65 61 74 65 20       /* xCreate 
10b60 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 43 6f 6e  */.  jsonEachCon
10b70 6e 65 63 74 2c 20 20 20 20 20 20 20 20 20 20 20  nect,           
10b80 2f 2a 20 78 43 6f 6e 6e 65 63 74 20 2a 2f 0a 20  /* xConnect */. 
10b90 20 6a 73 6f 6e 45 61 63 68 42 65 73 74 49 6e 64   jsonEachBestInd
10ba0 65 78 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ex,         /* x
10bb0 42 65 73 74 49 6e 64 65 78 20 2a 2f 0a 20 20 6a  BestIndex */.  j
10bc0 73 6f 6e 45 61 63 68 44 69 73 63 6f 6e 6e 65 63  sonEachDisconnec
10bd0 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 44 69  t,        /* xDi
10be0 73 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 30 2c  sconnect */.  0,
10bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c00 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 73           /* xDes
10c10 74 72 6f 79 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61  troy */.  jsonEa
10c20 63 68 4f 70 65 6e 45 61 63 68 2c 20 20 20 20 20  chOpenEach,     
10c30 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2d 20       /* xOpen - 
10c40 6f 70 65 6e 20 61 20 63 75 72 73 6f 72 20 2a 2f  open a cursor */
10c50 0a 20 20 6a 73 6f 6e 45 61 63 68 43 6c 6f 73 65  .  jsonEachClose
10c60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
10c70 20 78 43 6c 6f 73 65 20 2d 20 63 6c 6f 73 65 20   xClose - close 
10c80 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 6a 73  a cursor */.  js
10c90 6f 6e 45 61 63 68 46 69 6c 74 65 72 2c 20 20 20  onEachFilter,   
10ca0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
10cb0 74 65 72 20 2d 20 63 6f 6e 66 69 67 75 72 65 20  ter - configure 
10cc0 73 63 61 6e 20 63 6f 6e 73 74 72 61 69 6e 74 73  scan constraints
10cd0 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 4e 65   */.  jsonEachNe
10ce0 78 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  xt,             
10cf0 20 2f 2a 20 78 4e 65 78 74 20 2d 20 61 64 76 61   /* xNext - adva
10d00 6e 63 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a  nce a cursor */.
10d10 20 20 6a 73 6f 6e 45 61 63 68 45 6f 66 2c 20 20    jsonEachEof,  
10d20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10d30 78 45 6f 66 20 2d 20 63 68 65 63 6b 20 66 6f 72  xEof - check for
10d40 20 65 6e 64 20 6f 66 20 73 63 61 6e 20 2a 2f 0a   end of scan */.
10d50 20 20 6a 73 6f 6e 45 61 63 68 43 6f 6c 75 6d 6e    jsonEachColumn
10d60 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
10d70 78 43 6f 6c 75 6d 6e 20 2d 20 72 65 61 64 20 64  xColumn - read d
10d80 61 74 61 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63  ata */.  jsonEac
10d90 68 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20  hRowid,         
10da0 20 20 20 20 2f 2a 20 78 52 6f 77 69 64 20 2d 20      /* xRowid - 
10db0 72 65 61 64 20 64 61 74 61 20 2a 2f 0a 20 20 30  read data */.  0
10dc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10dd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 70            /* xUp
10de0 64 61 74 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20  date */.  0,    
10df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e00 20 20 20 20 20 2f 2a 20 78 42 65 67 69 6e 20 2a       /* xBegin *
10e10 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
10e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10e30 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20 30 2c 20  * xSync */.  0, 
10e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e50 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6d 6d          /* xComm
10e60 69 74 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  it */.  0,      
10e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e80 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 20     /* xRollback 
10e90 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
10ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10eb0 2f 2a 20 78 46 69 6e 64 4d 65 74 68 6f 64 20 2a  /* xFindMethod *
10ec0 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
10ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10ee0 2a 20 78 52 65 6e 61 6d 65 20 2a 2f 0a 20 20 30  * xRename */.  0
10ef0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10f00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 61            /* xSa
10f10 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 30 2c 20  vepoint */.  0, 
10f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f30 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 6c 65          /* xRele
10f40 61 73 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  ase */.  0,     
10f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f60 20 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b      /* xRollback
10f70 54 6f 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20  To */.  0       
10f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f90 20 20 20 2f 2a 20 78 53 68 61 64 6f 77 4e 61 6d     /* xShadowNam
10fa0 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 20  e */.};../* The 
10fb0 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20 6a  methods of the j
10fc0 73 6f 6e 5f 74 72 65 65 20 76 69 72 74 75 61 6c  son_tree virtual
10fd0 20 74 61 62 6c 65 2e 20 2a 2f 0a 73 74 61 74 69   table. */.stati
10fe0 63 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65  c sqlite3_module
10ff0 20 6a 73 6f 6e 54 72 65 65 4d 6f 64 75 6c 65 20   jsonTreeModule 
11000 3d 20 7b 0a 20 20 30 2c 20 20 20 20 20 20 20 20  = {.  0,        
11010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11020 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a   /* iVersion */.
11030 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
11040 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11050 78 43 72 65 61 74 65 20 2a 2f 0a 20 20 6a 73 6f  xCreate */.  jso
11060 6e 45 61 63 68 43 6f 6e 6e 65 63 74 2c 20 20 20  nEachConnect,   
11070 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6e 6e          /* xConn
11080 65 63 74 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63  ect */.  jsonEac
11090 68 42 65 73 74 49 6e 64 65 78 2c 20 20 20 20 20  hBestIndex,     
110a0 20 20 20 20 2f 2a 20 78 42 65 73 74 49 6e 64 65      /* xBestInde
110b0 78 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 44  x */.  jsonEachD
110c0 69 73 63 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20  isconnect,      
110d0 20 20 2f 2a 20 78 44 69 73 63 6f 6e 6e 65 63 74    /* xDisconnect
110e0 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
110f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11100 20 2f 2a 20 78 44 65 73 74 72 6f 79 20 2a 2f 0a   /* xDestroy */.
11110 20 20 6a 73 6f 6e 45 61 63 68 4f 70 65 6e 54 72    jsonEachOpenTr
11120 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ee,          /* 
11130 78 4f 70 65 6e 20 2d 20 6f 70 65 6e 20 61 20 63  xOpen - open a c
11140 75 72 73 6f 72 20 2a 2f 0a 20 20 6a 73 6f 6e 45  ursor */.  jsonE
11150 61 63 68 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  achClose,       
11160 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
11170 2d 20 63 6c 6f 73 65 20 61 20 63 75 72 73 6f 72  - close a cursor
11180 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 46 69   */.  jsonEachFi
11190 6c 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  lter,           
111a0 20 2f 2a 20 78 46 69 6c 74 65 72 20 2d 20 63 6f   /* xFilter - co
111b0 6e 66 69 67 75 72 65 20 73 63 61 6e 20 63 6f 6e  nfigure scan con
111c0 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 6a 73  straints */.  js
111d0 6f 6e 45 61 63 68 4e 65 78 74 2c 20 20 20 20 20  onEachNext,     
111e0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4e 65 78           /* xNex
111f0 74 20 2d 20 61 64 76 61 6e 63 65 20 61 20 63 75  t - advance a cu
11200 72 73 6f 72 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61  rsor */.  jsonEa
11210 63 68 45 6f 66 2c 20 20 20 20 20 20 20 20 20 20  chEof,          
11220 20 20 20 20 20 2f 2a 20 78 45 6f 66 20 2d 20 63       /* xEof - c
11230 68 65 63 6b 20 66 6f 72 20 65 6e 64 20 6f 66 20  heck for end of 
11240 73 63 61 6e 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61  scan */.  jsonEa
11250 63 68 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20  chColumn,       
11260 20 20 20 20 20 2f 2a 20 78 43 6f 6c 75 6d 6e 20       /* xColumn 
11270 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f 0a 20  - read data */. 
11280 20 6a 73 6f 6e 45 61 63 68 52 6f 77 69 64 2c 20   jsonEachRowid, 
11290 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
112a0 52 6f 77 69 64 20 2d 20 72 65 61 64 20 64 61 74  Rowid - read dat
112b0 61 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  a */.  0,       
112c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112d0 20 20 2f 2a 20 78 55 70 64 61 74 65 20 2a 2f 0a    /* xUpdate */.
112e0 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
112f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11300 78 42 65 67 69 6e 20 2a 2f 0a 20 20 30 2c 20 20  xBegin */.  0,  
11310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11320 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20         /* xSync 
11330 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
11340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11350 2f 2a 20 78 43 6f 6d 6d 69 74 20 2a 2f 0a 20 20  /* xCommit */.  
11360 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
11370 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
11380 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 30 2c 20  ollback */.  0, 
11390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113a0 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6e 64          /* xFind
113b0 4d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 2c 20 20  Method */.  0,  
113c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113d0 20 20 20 20 20 20 20 2f 2a 20 78 52 65 6e 61 6d         /* xRenam
113e0 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  e */.  0,       
113f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11400 20 20 2f 2a 20 78 53 61 76 65 70 6f 69 6e 74 20    /* xSavepoint 
11410 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
11420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11430 2f 2a 20 78 52 65 6c 65 61 73 65 20 2a 2f 0a 20  /* xRelease */. 
11440 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
11450 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
11460 52 6f 6c 6c 62 61 63 6b 54 6f 20 2a 2f 0a 20 20  RollbackTo */.  
11470 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
11480 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
11490 68 61 64 6f 77 4e 61 6d 65 20 2a 2f 0a 7d 3b 0a  hadowName */.};.
114a0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
114b0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
114c0 4c 45 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  LE */../********
114d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
114e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
114f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11510 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ****.** The foll
11520 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61  owing routines a
11530 72 65 20 74 68 65 20 6f 6e 6c 79 20 70 75 62 6c  re the only publ
11540 69 63 61 6c 6c 79 20 76 69 73 69 62 6c 65 20 69  ically visible i
11550 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20 74 68  dentifiers in th
11560 69 73 0a 2a 2a 20 66 69 6c 65 2e 20 20 43 61 6c  is.** file.  Cal
11570 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  l the following 
11580 72 6f 75 74 69 6e 65 73 20 69 6e 20 6f 72 64 65  routines in orde
11590 72 20 74 6f 20 72 65 67 69 73 74 65 72 20 74 68  r to register th
115a0 65 20 76 61 72 69 6f 75 73 20 53 51 4c 0a 2a 2a  e various SQL.**
115b0 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 74   functions and t
115c0 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
115d0 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
115e0 74 68 69 73 20 66 69 6c 65 2e 0a 2a 2a 2a 2a 2a  this file..*****
115f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11630 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 69 6e 74 20 73 71  *******/..int sq
11640 6c 69 74 65 33 4a 73 6f 6e 31 49 6e 69 74 28 73  lite3Json1Init(s
11650 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
11660 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
11670 4b 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  K;.  unsigned in
11680 74 20 69 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  t i;.  static co
11690 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20  nst struct {.   
116a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
116b0 61 6d 65 3b 0a 20 20 20 20 20 69 6e 74 20 6e 41  ame;.     int nA
116c0 72 67 3b 0a 20 20 20 20 20 69 6e 74 20 66 6c 61  rg;.     int fla
116d0 67 3b 0a 20 20 20 20 20 76 6f 69 64 20 28 2a 78  g;.     void (*x
116e0 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f  Func)(sqlite3_co
116f0 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
11700 65 33 5f 76 61 6c 75 65 2a 2a 29 3b 0a 20 20 7d  e3_value**);.  }
11710 20 61 46 75 6e 63 5b 5d 20 3d 20 7b 0a 20 20 20   aFunc[] = {.   
11720 20 7b 20 22 6a 73 6f 6e 22 2c 20 20 20 20 20 20   { "json",      
11730 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c             1, 0,
11740 20 20 20 6a 73 6f 6e 52 65 6d 6f 76 65 46 75 6e     jsonRemoveFun
11750 63 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  c        },.    
11760 7b 20 22 6a 73 6f 6e 5f 61 72 72 61 79 22 2c 20  { "json_array", 
11770 20 20 20 20 20 20 20 20 20 2d 31 2c 20 30 2c 20           -1, 0, 
11780 20 20 6a 73 6f 6e 41 72 72 61 79 46 75 6e 63 20    jsonArrayFunc 
11790 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
117a0 20 22 6a 73 6f 6e 5f 61 72 72 61 79 5f 6c 65 6e   "json_array_len
117b0 67 74 68 22 2c 20 20 20 20 31 2c 20 30 2c 20 20  gth",    1, 0,  
117c0 20 6a 73 6f 6e 41 72 72 61 79 4c 65 6e 67 74 68   jsonArrayLength
117d0 46 75 6e 63 20 20 20 7d 2c 0a 20 20 20 20 7b 20  Func   },.    { 
117e0 22 6a 73 6f 6e 5f 61 72 72 61 79 5f 6c 65 6e 67  "json_array_leng
117f0 74 68 22 2c 20 20 20 20 32 2c 20 30 2c 20 20 20  th",    2, 0,   
11800 6a 73 6f 6e 41 72 72 61 79 4c 65 6e 67 74 68 46  jsonArrayLengthF
11810 75 6e 63 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22  unc   },.    { "
11820 6a 73 6f 6e 5f 65 78 74 72 61 63 74 22 2c 20 20  json_extract",  
11830 20 20 20 20 20 20 2d 31 2c 20 30 2c 20 20 20 6a        -1, 0,   j
11840 73 6f 6e 45 78 74 72 61 63 74 46 75 6e 63 20 20  sonExtractFunc  
11850 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a       },.    { "j
11860 73 6f 6e 5f 69 6e 73 65 72 74 22 2c 20 20 20 20  son_insert",    
11870 20 20 20 20 20 2d 31 2c 20 30 2c 20 20 20 6a 73       -1, 0,   js
11880 6f 6e 53 65 74 46 75 6e 63 20 20 20 20 20 20 20  onSetFunc       
11890 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73      },.    { "js
118a0 6f 6e 5f 6f 62 6a 65 63 74 22 2c 20 20 20 20 20  on_object",     
118b0 20 20 20 20 2d 31 2c 20 30 2c 20 20 20 6a 73 6f      -1, 0,   jso
118c0 6e 4f 62 6a 65 63 74 46 75 6e 63 20 20 20 20 20  nObjectFunc     
118d0 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f     },.    { "jso
118e0 6e 5f 70 61 74 63 68 22 2c 20 20 20 20 20 20 20  n_patch",       
118f0 20 20 20 20 32 2c 20 30 2c 20 20 20 6a 73 6f 6e      2, 0,   json
11900 50 61 74 63 68 46 75 6e 63 20 20 20 20 20 20 20  PatchFunc       
11910 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e    },.    { "json
11920 5f 71 75 6f 74 65 22 2c 20 20 20 20 20 20 20 20  _quote",        
11930 20 20 20 31 2c 20 30 2c 20 20 20 6a 73 6f 6e 51     1, 0,   jsonQ
11940 75 6f 74 65 46 75 6e 63 20 20 20 20 20 20 20 20  uoteFunc        
11950 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f   },.    { "json_
11960 72 65 6d 6f 76 65 22 2c 20 20 20 20 20 20 20 20  remove",        
11970 20 2d 31 2c 20 30 2c 20 20 20 6a 73 6f 6e 52 65   -1, 0,   jsonRe
11980 6d 6f 76 65 46 75 6e 63 20 20 20 20 20 20 20 20  moveFunc        
11990 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 72  },.    { "json_r
119a0 65 70 6c 61 63 65 22 2c 20 20 20 20 20 20 20 20  eplace",        
119b0 2d 31 2c 20 30 2c 20 20 20 6a 73 6f 6e 52 65 70  -1, 0,   jsonRep
119c0 6c 61 63 65 46 75 6e 63 20 20 20 20 20 20 20 7d  laceFunc       }
119d0 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 73 65  ,.    { "json_se
119e0 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 2d  t",            -
119f0 31 2c 20 31 2c 20 20 20 6a 73 6f 6e 53 65 74 46  1, 1,   jsonSetF
11a00 75 6e 63 20 20 20 20 20 20 20 20 20 20 20 7d 2c  unc           },
11a10 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 74 79 70  .    { "json_typ
11a20 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 31  e",            1
11a30 2c 20 30 2c 20 20 20 6a 73 6f 6e 54 79 70 65 46  , 0,   jsonTypeF
11a40 75 6e 63 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  unc          },.
11a50 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 74 79 70 65      { "json_type
11a60 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 32 2c  ",            2,
11a70 20 30 2c 20 20 20 6a 73 6f 6e 54 79 70 65 46 75   0,   jsonTypeFu
11a80 6e 63 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  nc          },. 
11a90 20 20 20 7b 20 22 6a 73 6f 6e 5f 76 61 6c 69 64     { "json_valid
11aa0 22 2c 20 20 20 20 20 20 20 20 20 20 20 31 2c 20  ",           1, 
11ab0 30 2c 20 20 20 6a 73 6f 6e 56 61 6c 69 64 46 75  0,   jsonValidFu
11ac0 6e 63 20 20 20 20 20 20 20 20 20 7d 2c 0a 0a 23  nc         },..#
11ad0 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  if SQLITE_DEBUG.
11ae0 20 20 20 20 2f 2a 20 44 45 42 55 47 20 61 6e 64      /* DEBUG and
11af0 20 54 45 53 54 49 4e 47 20 66 75 6e 63 74 69 6f   TESTING functio
11b00 6e 73 20 2a 2f 0a 20 20 20 20 7b 20 22 6a 73 6f  ns */.    { "jso
11b10 6e 5f 70 61 72 73 65 22 2c 20 20 20 20 20 20 20  n_parse",       
11b20 20 20 20 20 31 2c 20 30 2c 20 20 20 6a 73 6f 6e      1, 0,   json
11b30 50 61 72 73 65 46 75 6e 63 20 20 20 20 20 20 20  ParseFunc       
11b40 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e    },.    { "json
11b50 5f 74 65 73 74 31 22 2c 20 20 20 20 20 20 20 20  _test1",        
11b60 20 20 20 31 2c 20 30 2c 20 20 20 6a 73 6f 6e 54     1, 0,   jsonT
11b70 65 73 74 31 46 75 6e 63 20 20 20 20 20 20 20 20  est1Func        
11b80 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 7d 3b 0a   },.#endif.  };.
11b90 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
11ba0 74 72 75 63 74 20 7b 0a 20 20 20 20 20 63 6f 6e  truct {.     con
11bb0 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  st char *zName;.
11bc0 20 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20       int nArg;. 
11bd0 20 20 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70      void (*xStep
11be0 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
11bf0 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
11c00 61 6c 75 65 2a 2a 29 3b 0a 20 20 20 20 20 76 6f  alue**);.     vo
11c10 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c  id (*xFinal)(sql
11c20 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 3b 0a  ite3_context*);.
11c30 20 20 20 20 20 76 6f 69 64 20 28 2a 78 56 61 6c       void (*xVal
11c40 75 65 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ue)(sqlite3_cont
11c50 65 78 74 2a 29 3b 0a 20 20 7d 20 61 41 67 67 5b  ext*);.  } aAgg[
11c60 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 6a 73 6f  ] = {.    { "jso
11c70 6e 5f 67 72 6f 75 70 5f 61 72 72 61 79 22 2c 20  n_group_array", 
11c80 20 20 20 20 31 2c 0a 20 20 20 20 20 20 6a 73 6f      1,.      jso
11c90 6e 41 72 72 61 79 53 74 65 70 2c 20 20 20 6a 73  nArrayStep,   js
11ca0 6f 6e 41 72 72 61 79 46 69 6e 61 6c 2c 20 20 6a  onArrayFinal,  j
11cb0 73 6f 6e 41 72 72 61 79 56 61 6c 75 65 20 20 7d  sonArrayValue  }
11cc0 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 67 72  ,.    { "json_gr
11cd0 6f 75 70 5f 6f 62 6a 65 63 74 22 2c 20 20 20 20  oup_object",    
11ce0 32 2c 0a 20 20 20 20 20 20 6a 73 6f 6e 4f 62 6a  2,.      jsonObj
11cf0 65 63 74 53 74 65 70 2c 20 20 6a 73 6f 6e 4f 62  ectStep,  jsonOb
11d00 6a 65 63 74 46 69 6e 61 6c 2c 20 6a 73 6f 6e 4f  jectFinal, jsonO
11d10 62 6a 65 63 74 56 61 6c 75 65 20 7d 2c 0a 20 20  bjectValue },.  
11d20 7d 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  };.#ifndef SQLIT
11d30 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
11d40 42 4c 45 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  BLE.  static con
11d50 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
11d60 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
11d70 6d 65 3b 0a 20 20 20 20 20 73 71 6c 69 74 65 33  me;.     sqlite3
11d80 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65  _module *pModule
11d90 3b 0a 20 20 7d 20 61 4d 6f 64 5b 5d 20 3d 20 7b  ;.  } aMod[] = {
11da0 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 65 61 63  .    { "json_eac
11db0 68 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 26  h",            &
11dc0 6a 73 6f 6e 45 61 63 68 4d 6f 64 75 6c 65 20 20  jsonEachModule  
11dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
11de0 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 74 72 65 65      { "json_tree
11df0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 26 6a  ",            &j
11e00 73 6f 6e 54 72 65 65 4d 6f 64 75 6c 65 20 20 20  sonTreeModule   
11e10 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
11e20 20 7d 3b 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72   };.#endif.  for
11e30 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
11e40 46 75 6e 63 29 2f 73 69 7a 65 6f 66 28 61 46 75  Func)/sizeof(aFu
11e50 6e 63 5b 30 5d 29 20 26 26 20 72 63 3d 3d 53 51  nc[0]) && rc==SQ
11e60 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20  LITE_OK; i++){. 
11e70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
11e80 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
11e90 64 62 2c 20 61 46 75 6e 63 5b 69 5d 2e 7a 4e 61  db, aFunc[i].zNa
11ea0 6d 65 2c 20 61 46 75 6e 63 5b 69 5d 2e 6e 41 72  me, aFunc[i].nAr
11eb0 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  g,.             
11ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ed0 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20      SQLITE_UTF8 
11ee0 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
11ef0 4e 49 53 54 49 43 2c 20 0a 20 20 20 20 20 20 20  NISTIC, .       
11f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f10 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
11f20 29 26 61 46 75 6e 63 5b 69 5d 2e 66 6c 61 67 2c  )&aFunc[i].flag,
11f30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f50 20 20 61 46 75 6e 63 5b 69 5d 2e 78 46 75 6e 63    aFunc[i].xFunc
11f60 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 69 66  , 0, 0);.  }.#if
11f70 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11f80 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 66 6f  _WINDOWFUNC.  fo
11f90 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
11fa0 61 41 67 67 29 2f 73 69 7a 65 6f 66 28 61 41 67  aAgg)/sizeof(aAg
11fb0 67 5b 30 5d 29 20 26 26 20 72 63 3d 3d 53 51 4c  g[0]) && rc==SQL
11fc0 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20  ITE_OK; i++){.  
11fd0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
11fe0 72 65 61 74 65 5f 77 69 6e 64 6f 77 5f 66 75 6e  reate_window_fun
11ff0 63 74 69 6f 6e 28 64 62 2c 20 61 41 67 67 5b 69  ction(db, aAgg[i
12000 5d 2e 7a 4e 61 6d 65 2c 20 61 41 67 67 5b 69 5d  ].zName, aAgg[i]
12010 2e 6e 41 72 67 2c 0a 20 20 20 20 20 20 20 20 20  .nArg,.         
12020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12030 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55          SQLITE_U
12040 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
12050 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 20  ERMINISTIC, 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 20 20 20 20 20 20                  
12080 61 41 67 67 5b 69 5d 2e 78 53 74 65 70 2c 20 61  aAgg[i].xStep, a
12090 41 67 67 5b 69 5d 2e 78 46 69 6e 61 6c 2c 0a 20  Agg[i].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 20 20 20 20 20 20                  
120c0 61 41 67 67 5b 69 5d 2e 78 56 61 6c 75 65 2c 20  aAgg[i].xValue, 
120d0 6a 73 6f 6e 47 72 6f 75 70 49 6e 76 65 72 73 65  jsonGroupInverse
120e0 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
120f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12100 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
12110 45 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  E.  for(i=0; i<s
12120 69 7a 65 6f 66 28 61 4d 6f 64 29 2f 73 69 7a 65  izeof(aMod)/size
12130 6f 66 28 61 4d 6f 64 5b 30 5d 29 20 26 26 20 72  of(aMod[0]) && r
12140 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b  c==SQLITE_OK; i+
12150 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  +){.    rc = sql
12160 69 74 65 33 5f 63 72 65 61 74 65 5f 6d 6f 64 75  ite3_create_modu
12170 6c 65 28 64 62 2c 20 61 4d 6f 64 5b 69 5d 2e 7a  le(db, aMod[i].z
12180 4e 61 6d 65 2c 20 61 4d 6f 64 5b 69 5d 2e 70 4d  Name, aMod[i].pM
12190 6f 64 75 6c 65 2c 20 30 29 3b 0a 20 20 7d 0a 23  odule, 0);.  }.#
121a0 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72  endif.  return r
121b0 63 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53  c;.}...#ifndef S
121c0 51 4c 49 54 45 5f 43 4f 52 45 0a 23 69 66 64 65  QLITE_CORE.#ifde
121d0 66 20 5f 57 49 4e 33 32 0a 5f 5f 64 65 63 6c 73  f _WIN32.__decls
121e0 70 65 63 28 64 6c 6c 65 78 70 6f 72 74 29 0a 23  pec(dllexport).#
121f0 65 6e 64 69 66 0a 69 6e 74 20 73 71 6c 69 74 65  endif.int sqlite
12200 33 5f 6a 73 6f 6e 5f 69 6e 69 74 28 0a 20 20 73  3_json_init(.  s
12210 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 63  qlite3 *db, .  c
12220 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 2c 20  har **pzErrMsg, 
12230 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  .  const sqlite3
12240 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 20 2a 70  _api_routines *p
12250 41 70 69 0a 29 7b 0a 20 20 53 51 4c 49 54 45 5f  Api.){.  SQLITE_
12260 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54 32 28  EXTENSION_INIT2(
12270 70 41 70 69 29 3b 0a 20 20 28 76 6f 69 64 29 70  pApi);.  (void)p
12280 7a 45 72 72 4d 73 67 3b 20 20 2f 2a 20 55 6e 75  zErrMsg;  /* Unu
12290 73 65 64 20 70 61 72 61 6d 65 74 65 72 20 2a 2f  sed parameter */
122a0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
122b0 33 4a 73 6f 6e 31 49 6e 69 74 28 64 62 29 3b 0a  3Json1Init(db);.
122c0 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 20  }.#endif.#endif 
122d0 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
122e0 54 45 5f 43 4f 52 45 29 20 7c 7c 20 64 65 66 69  TE_CORE) || defi
122f0 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
12300 45 5f 4a 53 4f 4e 31 29 20 2a 2f 0a              E_JSON1) */.