/ Hex Artifact Content
Login

Artifact 02f5f0d9c131df79f4ee168d2b426f0f0d273b7771fc0bb5293c4e7692d9a2ee:


0000: 2f 2a 0a 2a 2a 20 32 30 31 35 2d 30 38 2d 31 32  /*.** 2015-08-12
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ****.**.** This 
0180: 53 51 4c 69 74 65 20 65 78 74 65 6e 73 69 6f 6e  SQLite extension
0190: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 4a 53 4f 4e   implements JSON
01a0: 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68 65   functions.  The
01b0: 20 69 6e 74 65 72 66 61 63 65 20 69 73 0a 2a 2a   interface is.**
01c0: 20 6d 6f 64 65 6c 65 64 20 61 66 74 65 72 20 4d   modeled after M
01d0: 79 53 51 4c 20 4a 53 4f 4e 20 66 75 6e 63 74 69  ySQL JSON functi
01e0: 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 68  ons:.**.**     h
01f0: 74 74 70 73 3a 2f 2f 64 65 76 2e 6d 79 73 71 6c  ttps://dev.mysql
0200: 2e 63 6f 6d 2f 64 6f 63 2f 72 65 66 6d 61 6e 2f  .com/doc/refman/
0210: 35 2e 37 2f 65 6e 2f 6a 73 6f 6e 2e 68 74 6d 6c  5.7/en/json.html
0220: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 74  .**.** For the t
0230: 69 6d 65 20 62 65 69 6e 67 2c 20 61 6c 6c 20 4a  ime being, all J
0240: 53 4f 4e 20 69 73 20 73 74 6f 72 65 64 20 61 73  SON is stored as
0250: 20 70 75 72 65 20 74 65 78 74 2e 20 20 28 57 65   pure text.  (We
0260: 20 6d 69 67 68 74 20 61 64 64 0a 2a 2a 20 61 20   might add.** a 
0270: 4a 53 4f 4e 42 20 74 79 70 65 20 69 6e 20 74 68  JSONB type in th
0280: 65 20 66 75 74 75 72 65 20 77 68 69 63 68 20 73  e future which s
0290: 74 6f 72 65 73 20 61 20 62 69 6e 61 72 79 20 65  tores a binary e
02a0: 6e 63 6f 64 69 6e 67 20 6f 66 20 4a 53 4f 4e 20  ncoding of JSON 
02b0: 69 6e 0a 2a 2a 20 61 20 42 4c 4f 42 2c 20 62 75  in.** a BLOB, bu
02c0: 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75  t there is no su
02d0: 70 70 6f 72 74 20 66 6f 72 20 4a 53 4f 4e 42 20  pport for JSONB 
02e0: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  in the current i
02f0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a  mplementation..*
0300: 2a 20 54 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74  * This implement
0310: 61 74 69 6f 6e 20 70 61 72 73 65 73 20 4a 53 4f  ation parses JSO
0320: 4e 20 74 65 78 74 20 61 74 20 32 35 30 20 4d 42  N text at 250 MB
0330: 2f 73 2c 20 73 6f 20 69 74 20 69 73 20 68 61 72  /s, so it is har
0340: 64 20 74 6f 20 73 65 65 0a 2a 2a 20 68 6f 77 20  d to see.** how 
0350: 4a 53 4f 4e 42 20 6d 69 67 68 74 20 69 6d 70 72  JSONB might impr
0360: 6f 76 65 20 6f 6e 20 74 68 61 74 2e 29 0a 2a 2f  ove on that.).*/
0370: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
0380: 4c 49 54 45 5f 43 4f 52 45 29 20 7c 7c 20 64 65  LITE_CORE) || de
0390: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
03a0: 42 4c 45 5f 4a 53 4f 4e 31 29 0a 23 69 66 20 21  BLE_JSON1).#if !
03b0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 49 4e  defined(SQLITEIN
03c0: 54 5f 48 29 0a 23 69 6e 63 6c 75 64 65 20 22 73  T_H).#include "s
03d0: 71 6c 69 74 65 33 65 78 74 2e 68 22 0a 23 65 6e  qlite3ext.h".#en
03e0: 64 69 66 0a 53 51 4c 49 54 45 5f 45 58 54 45 4e  dif.SQLITE_EXTEN
03f0: 53 49 4f 4e 5f 49 4e 49 54 31 0a 23 69 6e 63 6c  SION_INIT1.#incl
0400: 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23  ude <assert.h>.#
0410: 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e  include <string.
0420: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  h>.#include <std
0430: 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  lib.h>.#include 
0440: 3c 73 74 64 61 72 67 2e 68 3e 0a 0a 2f 2a 20 4d  <stdarg.h>../* M
0450: 61 72 6b 20 61 20 66 75 6e 63 74 69 6f 6e 20 70  ark a function p
0460: 61 72 61 6d 65 74 65 72 20 61 73 20 75 6e 75 73  arameter as unus
0470: 65 64 2c 20 74 6f 20 73 75 70 70 72 65 73 73 20  ed, to suppress 
0480: 6e 75 69 73 61 6e 63 65 20 63 6f 6d 70 69 6c 65  nuisance compile
0490: 72 0a 2a 2a 20 77 61 72 6e 69 6e 67 73 2e 20 2a  r.** warnings. *
04a0: 2f 0a 23 69 66 6e 64 65 66 20 55 4e 55 53 45 44  /.#ifndef UNUSED
04b0: 5f 50 41 52 41 4d 0a 23 20 64 65 66 69 6e 65 20  _PARAM.# define 
04c0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 58 29 20  UNUSED_PARAM(X) 
04d0: 20 28 76 6f 69 64 29 28 58 29 0a 23 65 6e 64 69   (void)(X).#endi
04e0: 66 0a 0a 23 69 66 6e 64 65 66 20 4c 41 52 47 45  f..#ifndef LARGE
04f0: 53 54 5f 49 4e 54 36 34 0a 23 20 64 65 66 69 6e  ST_INT64.# defin
0500: 65 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 20  e LARGEST_INT64 
0510: 20 28 30 78 66 66 66 66 66 66 66 66 7c 28 28 28   (0xffffffff|(((
0520: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 30 78  sqlite3_int64)0x
0530: 37 66 66 66 66 66 66 66 29 3c 3c 33 32 29 29 0a  7fffffff)<<32)).
0540: 23 20 64 65 66 69 6e 65 20 53 4d 41 4c 4c 45 53  # define SMALLES
0550: 54 5f 49 4e 54 36 34 20 28 28 28 73 71 6c 69 74  T_INT64 (((sqlit
0560: 65 33 5f 69 6e 74 36 34 29 2d 31 29 20 2d 20 4c  e3_int64)-1) - L
0570: 41 52 47 45 53 54 5f 49 4e 54 36 34 29 0a 23 65  ARGEST_INT64).#e
0580: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 73  ndif../*.** Vers
0590: 69 6f 6e 73 20 6f 66 20 69 73 73 70 61 63 65 28  ions of isspace(
05a0: 29 2c 20 69 73 61 6c 6e 75 6d 28 29 20 61 6e 64  ), isalnum() and
05b0: 20 69 73 64 69 67 69 74 28 29 20 74 6f 20 77 68   isdigit() to wh
05c0: 69 63 68 20 69 74 20 69 73 20 73 61 66 65 0a 2a  ich it is safe.*
05d0: 2a 20 74 6f 20 70 61 73 73 20 73 69 67 6e 65 64  * to pass signed
05e0: 20 63 68 61 72 20 76 61 6c 75 65 73 2e 0a 2a 2f   char values..*/
05f0: 0a 23 69 66 64 65 66 20 73 71 6c 69 74 65 33 49  .#ifdef sqlite3I
0600: 73 64 69 67 69 74 0a 20 20 20 2f 2a 20 55 73 65  sdigit.   /* Use
0610: 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65   the SQLite core
0620: 20 76 65 72 73 69 6f 6e 73 20 69 66 20 74 68 69   versions if thi
0630: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72  s routine is par
0640: 74 20 6f 66 20 74 68 65 0a 20 20 20 2a 2a 20 53  t of the.   ** S
0650: 51 4c 69 74 65 20 61 6d 61 6c 67 61 6d 61 74 69  QLite amalgamati
0660: 6f 6e 20 2a 2f 0a 23 20 20 64 65 66 69 6e 65 20  on */.#  define 
0670: 73 61 66 65 5f 69 73 64 69 67 69 74 28 78 29 20  safe_isdigit(x) 
0680: 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28   sqlite3Isdigit(
0690: 78 29 0a 23 20 20 64 65 66 69 6e 65 20 73 61 66  x).#  define saf
06a0: 65 5f 69 73 61 6c 6e 75 6d 28 78 29 20 20 73 71  e_isalnum(x)  sq
06b0: 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 78 29 0a  lite3Isalnum(x).
06c0: 23 20 20 64 65 66 69 6e 65 20 73 61 66 65 5f 69  #  define safe_i
06d0: 73 78 64 69 67 69 74 28 78 29 20 73 71 6c 69 74  sxdigit(x) sqlit
06e0: 65 33 49 73 78 64 69 67 69 74 28 78 29 0a 23 65  e3Isxdigit(x).#e
06f0: 6c 73 65 0a 20 20 20 2f 2a 20 55 73 65 20 74 68  lse.   /* Use th
0700: 65 20 73 74 61 6e 64 61 72 64 20 6c 69 62 72 61  e standard libra
0710: 72 79 20 66 6f 72 20 73 65 70 61 72 61 74 65 20  ry for separate 
0720: 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 2a 2f 0a 23  compilation */.#
0730: 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68  include <ctype.h
0740: 3e 20 20 2f 2a 20 61 6d 61 6c 67 61 6d 61 74 6f  >  /* amalgamato
0750: 72 3a 20 6b 65 65 70 20 2a 2f 0a 23 20 20 64 65  r: keep */.#  de
0760: 66 69 6e 65 20 73 61 66 65 5f 69 73 64 69 67 69  fine safe_isdigi
0770: 74 28 78 29 20 20 69 73 64 69 67 69 74 28 28 75  t(x)  isdigit((u
0780: 6e 73 69 67 6e 65 64 20 63 68 61 72 29 28 78 29  nsigned char)(x)
0790: 29 0a 23 20 20 64 65 66 69 6e 65 20 73 61 66 65  ).#  define safe
07a0: 5f 69 73 61 6c 6e 75 6d 28 78 29 20 20 69 73 61  _isalnum(x)  isa
07b0: 6c 6e 75 6d 28 28 75 6e 73 69 67 6e 65 64 20 63  lnum((unsigned c
07c0: 68 61 72 29 28 78 29 29 0a 23 20 20 64 65 66 69  har)(x)).#  defi
07d0: 6e 65 20 73 61 66 65 5f 69 73 78 64 69 67 69 74  ne safe_isxdigit
07e0: 28 78 29 20 69 73 78 64 69 67 69 74 28 28 75 6e  (x) isxdigit((un
07f0: 73 69 67 6e 65 64 20 63 68 61 72 29 28 78 29 29  signed char)(x))
0800: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
0810: 72 6f 77 69 6e 67 20 6f 75 72 20 6f 77 6e 20 69  rowing our own i
0820: 73 73 70 61 63 65 28 29 20 72 6f 75 74 69 6e 65  sspace() routine
0830: 20 74 68 69 73 20 77 61 79 20 69 73 20 74 77 69   this way is twi
0840: 63 65 20 61 73 20 66 61 73 74 20 61 73 0a 2a 2a  ce as fast as.**
0850: 20 74 68 65 20 6c 69 62 72 61 72 79 20 69 73 73   the library iss
0860: 70 61 63 65 28 29 20 66 75 6e 63 74 69 6f 6e 2c  pace() function,
0870: 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 20   resulting in a 
0880: 37 25 20 6f 76 65 72 61 6c 6c 20 70 65 72 66 6f  7% overall perfo
0890: 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 63 72 65 61  rmance.** increa
08a0: 73 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65  se for the parse
08b0: 72 2e 20 20 28 55 62 75 6e 74 75 31 34 2e 31 30  r.  (Ubuntu14.10
08c0: 20 67 63 63 20 34 2e 38 2e 34 20 78 36 34 20 77   gcc 4.8.4 x64 w
08d0: 69 74 68 20 2d 4f 73 29 2e 0a 2a 2f 0a 73 74 61  ith -Os)..*/.sta
08e0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6a  tic const char j
08f0: 73 6f 6e 49 73 53 70 61 63 65 5b 5d 20 3d 20 7b  sonIsSpace[] = {
0900: 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  .  0, 0, 0, 0, 0
0910: 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 20 20 30  , 0, 0, 0,     0
0920: 2c 20 31 2c 20 31 2c 20 30 2c 20 30 2c 20 31 2c  , 1, 1, 0, 0, 1,
0930: 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30   0, 0,.  0, 0, 0
0940: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0950: 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c       0, 0, 0, 0,
0960: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 31   0, 0, 0, 0,.  1
0970: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0980: 20 30 2c 20 30 2c 20 20 20 20 20 30 2c 20 30 2c   0, 0,     0, 0,
0990: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
09a0: 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  0,.  0, 0, 0, 0,
09b0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 20   0, 0, 0, 0,    
09c0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
09d0: 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c  0, 0, 0,.  0, 0,
09e0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
09f0: 30 2c 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20  0,     0, 0, 0, 
0a00: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  0, 0, 0, 0, 0,. 
0a10: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0a20: 30 2c 20 30 2c 20 30 2c 20 20 20 20 20 30 2c 20  0, 0, 0,     0, 
0a30: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0a40: 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20  , 0,.  0, 0, 0, 
0a50: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20  0, 0, 0, 0, 0,  
0a60: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
0a70: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20  , 0, 0, 0,.  0, 
0a80: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0a90: 2c 20 30 2c 20 20 20 20 20 30 2c 20 30 2c 20 30  , 0,     0, 0, 0
0aa0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0ab0: 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  .  0, 0, 0, 0, 0
0ac0: 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 20 20 30  , 0, 0, 0,     0
0ad0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0ae0: 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30   0, 0,.  0, 0, 0
0af0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0b00: 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c       0, 0, 0, 0,
0b10: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30   0, 0, 0, 0,.  0
0b20: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0b30: 20 30 2c 20 30 2c 20 20 20 20 20 30 2c 20 30 2c   0, 0,     0, 0,
0b40: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0b50: 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  0,.  0, 0, 0, 0,
0b60: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 20   0, 0, 0, 0,    
0b70: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0b80: 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c  0, 0, 0,.  0, 0,
0b90: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0ba0: 30 2c 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20  0,     0, 0, 0, 
0bb0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  0, 0, 0, 0, 0,. 
0bc0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0bd0: 30 2c 20 30 2c 20 30 2c 20 20 20 20 20 30 2c 20  0, 0, 0,     0, 
0be0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0bf0: 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20  , 0,.  0, 0, 0, 
0c00: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20  0, 0, 0, 0, 0,  
0c10: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
0c20: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20  , 0, 0, 0,.  0, 
0c30: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0c40: 2c 20 30 2c 20 20 20 20 20 30 2c 20 30 2c 20 30  , 0,     0, 0, 0
0c50: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0c60: 0a 7d 3b 0a 23 64 65 66 69 6e 65 20 73 61 66 65  .};.#define safe
0c70: 5f 69 73 73 70 61 63 65 28 78 29 20 28 6a 73 6f  _isspace(x) (jso
0c80: 6e 49 73 53 70 61 63 65 5b 28 75 6e 73 69 67 6e  nIsSpace[(unsign
0c90: 65 64 20 63 68 61 72 29 78 5d 29 0a 0a 23 69 66  ed char)x])..#if
0ca0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d 41 4c  ndef SQLITE_AMAL
0cb0: 47 41 4d 41 54 49 4f 4e 0a 20 20 2f 2a 20 55 6e  GAMATION.  /* Un
0cc0: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 74  signed integer t
0cd0: 79 70 65 73 2e 20 20 54 68 65 73 65 20 61 72 65  ypes.  These are
0ce0: 20 61 6c 72 65 61 64 79 20 64 65 66 69 6e 65 64   already defined
0cf0: 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 49 6e   in the sqliteIn
0d00: 74 2e 68 2c 0a 20 20 2a 2a 20 62 75 74 20 74 68  t.h,.  ** but th
0d10: 65 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6e 65  e definitions ne
0d20: 65 64 20 74 6f 20 62 65 20 72 65 70 65 61 74 65  ed to be repeate
0d30: 64 20 66 6f 72 20 73 65 70 61 72 61 74 65 20 63  d for separate c
0d40: 6f 6d 70 69 6c 61 74 69 6f 6e 2e 20 2a 2f 0a 20  ompilation. */. 
0d50: 20 74 79 70 65 64 65 66 20 73 71 6c 69 74 65 33   typedef sqlite3
0d60: 5f 75 69 6e 74 36 34 20 75 36 34 3b 0a 20 20 74  _uint64 u64;.  t
0d70: 79 70 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20  ypedef unsigned 
0d80: 69 6e 74 20 75 33 32 3b 0a 20 20 74 79 70 65 64  int u32;.  typed
0d90: 65 66 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72  ef unsigned shor
0da0: 74 20 69 6e 74 20 75 31 36 3b 0a 20 20 74 79 70  t int u16;.  typ
0db0: 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20 63 68  edef unsigned ch
0dc0: 61 72 20 75 38 3b 0a 23 65 6e 64 69 66 0a 0a 2f  ar u8;.#endif../
0dd0: 2a 20 4f 62 6a 65 63 74 73 20 2a 2f 0a 74 79 70  * Objects */.typ
0de0: 65 64 65 66 20 73 74 72 75 63 74 20 4a 73 6f 6e  edef struct Json
0df0: 53 74 72 69 6e 67 20 4a 73 6f 6e 53 74 72 69 6e  String JsonStrin
0e00: 67 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  g;.typedef struc
0e10: 74 20 4a 73 6f 6e 4e 6f 64 65 20 4a 73 6f 6e 4e  t JsonNode JsonN
0e20: 6f 64 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ode;.typedef str
0e30: 75 63 74 20 4a 73 6f 6e 50 61 72 73 65 20 4a 73  uct JsonParse Js
0e40: 6f 6e 50 61 72 73 65 3b 0a 0a 2f 2a 20 41 6e 20  onParse;../* An 
0e50: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
0e60: 20 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e   object represen
0e70: 74 73 20 61 20 4a 53 4f 4e 20 73 74 72 69 6e 67  ts a JSON string
0e80: 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  .** under constr
0e90: 75 63 74 69 6f 6e 2e 20 20 52 65 61 6c 6c 79 2c  uction.  Really,
0ea0: 20 74 68 69 73 20 69 73 20 61 20 67 65 6e 65 72   this is a gener
0eb0: 69 63 20 73 74 72 69 6e 67 20 61 63 63 75 6d 75  ic string accumu
0ec0: 6c 61 74 6f 72 0a 2a 2a 20 74 68 61 74 20 63 61  lator.** that ca
0ed0: 6e 20 62 65 20 61 6e 64 20 69 73 20 75 73 65 64  n be and is used
0ee0: 20 74 6f 20 63 72 65 61 74 65 20 73 74 72 69 6e   to create strin
0ef0: 67 73 20 6f 74 68 65 72 20 74 68 61 6e 20 4a 53  gs other than JS
0f00: 4f 4e 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 4a 73  ON..*/.struct Js
0f10: 6f 6e 53 74 72 69 6e 67 20 7b 0a 20 20 73 71 6c  onString {.  sql
0f20: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
0f30: 74 78 3b 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f  tx;   /* Functio
0f40: 6e 20 63 6f 6e 74 65 78 74 20 2d 20 70 75 74 20  n context - put 
0f50: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 68  error messages h
0f60: 65 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ere */.  char *z
0f70: 42 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Buf;            
0f80: 20 20 2f 2a 20 41 70 70 65 6e 64 20 4a 53 4f 4e    /* Append JSON
0f90: 20 63 6f 6e 74 65 6e 74 20 68 65 72 65 20 2a 2f   content here */
0fa0: 0a 20 20 75 36 34 20 6e 41 6c 6c 6f 63 3b 20 20  .  u64 nAlloc;  
0fb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
0fc0: 79 74 65 73 20 6f 66 20 73 74 6f 72 61 67 65 20  ytes of storage 
0fd0: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 7a 42 75  available in zBu
0fe0: 66 5b 5d 20 2a 2f 0a 20 20 75 36 34 20 6e 55 73  f[] */.  u64 nUs
0ff0: 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
1000: 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 7a 42    /* Bytes of zB
1010: 75 66 5b 5d 20 63 75 72 72 65 6e 74 6c 79 20 75  uf[] currently u
1020: 73 65 64 20 2a 2f 0a 20 20 75 38 20 62 53 74 61  sed */.  u8 bSta
1030: 74 69 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  tic;            
1040: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 7a 42 75    /* True if zBu
1050: 66 20 69 73 20 73 74 61 74 69 63 20 73 70 61 63  f is static spac
1060: 65 20 2a 2f 0a 20 20 75 38 20 62 45 72 72 3b 20  e */.  u8 bErr; 
1070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1080: 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 65 72  /* True if an er
1090: 72 6f 72 20 68 61 73 20 62 65 65 6e 20 65 6e 63  ror has been enc
10a0: 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20 63 68  ountered */.  ch
10b0: 61 72 20 7a 53 70 61 63 65 5b 31 30 30 5d 3b 20  ar zSpace[100]; 
10c0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
10d0: 6c 20 73 74 61 74 69 63 20 73 70 61 63 65 20 2a  l static space *
10e0: 2f 0a 7d 3b 0a 0a 2f 2a 20 4a 53 4f 4e 20 74 79  /.};../* JSON ty
10f0: 70 65 20 76 61 6c 75 65 73 0a 2a 2f 0a 23 64 65  pe values.*/.#de
1100: 66 69 6e 65 20 4a 53 4f 4e 5f 4e 55 4c 4c 20 20  fine JSON_NULL  
1110: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 4a 53 4f     0.#define JSO
1120: 4e 5f 54 52 55 45 20 20 20 20 20 31 0a 23 64 65  N_TRUE     1.#de
1130: 66 69 6e 65 20 4a 53 4f 4e 5f 46 41 4c 53 45 20  fine JSON_FALSE 
1140: 20 20 20 32 0a 23 64 65 66 69 6e 65 20 4a 53 4f     2.#define JSO
1150: 4e 5f 49 4e 54 20 20 20 20 20 20 33 0a 23 64 65  N_INT      3.#de
1160: 66 69 6e 65 20 4a 53 4f 4e 5f 52 45 41 4c 20 20  fine JSON_REAL  
1170: 20 20 20 34 0a 23 64 65 66 69 6e 65 20 4a 53 4f     4.#define JSO
1180: 4e 5f 53 54 52 49 4e 47 20 20 20 35 0a 23 64 65  N_STRING   5.#de
1190: 66 69 6e 65 20 4a 53 4f 4e 5f 41 52 52 41 59 20  fine JSON_ARRAY 
11a0: 20 20 20 36 0a 23 64 65 66 69 6e 65 20 4a 53 4f     6.#define JSO
11b0: 4e 5f 4f 42 4a 45 43 54 20 20 20 37 0a 0a 2f 2a  N_OBJECT   7../*
11c0: 20 54 68 65 20 22 73 75 62 74 79 70 65 22 20 73   The "subtype" s
11d0: 65 74 20 66 6f 72 20 4a 53 4f 4e 20 76 61 6c 75  et for JSON valu
11e0: 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 53  es */.#define JS
11f0: 4f 4e 5f 53 55 42 54 59 50 45 20 20 37 34 20 20  ON_SUBTYPE  74  
1200: 20 20 2f 2a 20 41 73 63 69 69 20 66 6f 72 20 22    /* Ascii for "
1210: 4a 22 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d  J" */../*.** Nam
1220: 65 73 20 6f 66 20 74 68 65 20 76 61 72 69 6f 75  es of the variou
1230: 73 20 4a 53 4f 4e 20 74 79 70 65 73 3a 0a 2a 2f  s JSON types:.*/
1240: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
1250: 61 72 20 2a 20 63 6f 6e 73 74 20 6a 73 6f 6e 54  ar * const jsonT
1260: 79 70 65 5b 5d 20 3d 20 7b 0a 20 20 22 6e 75 6c  ype[] = {.  "nul
1270: 6c 22 2c 20 22 74 72 75 65 22 2c 20 22 66 61 6c  l", "true", "fal
1280: 73 65 22 2c 20 22 69 6e 74 65 67 65 72 22 2c 20  se", "integer", 
1290: 22 72 65 61 6c 22 2c 20 22 74 65 78 74 22 2c 20  "real", "text", 
12a0: 22 61 72 72 61 79 22 2c 20 22 6f 62 6a 65 63 74  "array", "object
12b0: 22 0a 7d 3b 0a 0a 2f 2a 20 42 69 74 20 76 61 6c  ".};../* Bit val
12c0: 75 65 73 20 66 6f 72 20 74 68 65 20 4a 73 6f 6e  ues for the Json
12d0: 4e 6f 64 65 2e 6a 6e 46 6c 61 67 20 66 69 65 6c  Node.jnFlag fiel
12e0: 64 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4e 4f  d.*/.#define JNO
12f0: 44 45 5f 52 41 57 20 20 20 20 20 30 78 30 31 20  DE_RAW     0x01 
1300: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
1310: 6e 74 20 69 73 20 72 61 77 2c 20 6e 6f 74 20 4a  nt is raw, not J
1320: 53 4f 4e 20 65 6e 63 6f 64 65 64 20 2a 2f 0a 23  SON encoded */.#
1330: 64 65 66 69 6e 65 20 4a 4e 4f 44 45 5f 45 53 43  define JNODE_ESC
1340: 41 50 45 20 20 30 78 30 32 20 20 20 20 20 20 20  APE  0x02       
1350: 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 69 73 20    /* Content is 
1360: 74 65 78 74 20 77 69 74 68 20 5c 20 65 73 63 61  text with \ esca
1370: 70 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4a  pes */.#define J
1380: 4e 4f 44 45 5f 52 45 4d 4f 56 45 20 20 30 78 30  NODE_REMOVE  0x0
1390: 34 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20  4         /* Do 
13a0: 6e 6f 74 20 6f 75 74 70 75 74 20 2a 2f 0a 23 64  not output */.#d
13b0: 65 66 69 6e 65 20 4a 4e 4f 44 45 5f 52 45 50 4c  efine JNODE_REPL
13c0: 41 43 45 20 30 78 30 38 20 20 20 20 20 20 20 20  ACE 0x08        
13d0: 20 2f 2a 20 52 65 70 6c 61 63 65 20 77 69 74 68   /* Replace with
13e0: 20 4a 73 6f 6e 4e 6f 64 65 2e 75 2e 69 52 65 70   JsonNode.u.iRep
13f0: 6c 61 63 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  lace */.#define 
1400: 4a 4e 4f 44 45 5f 50 41 54 43 48 20 20 20 30 78  JNODE_PATCH   0x
1410: 31 30 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  10         /* Pa
1420: 74 63 68 20 77 69 74 68 20 4a 73 6f 6e 4e 6f 64  tch with JsonNod
1430: 65 2e 75 2e 70 50 61 74 63 68 20 2a 2f 0a 23 64  e.u.pPatch */.#d
1440: 65 66 69 6e 65 20 4a 4e 4f 44 45 5f 41 50 50 45  efine JNODE_APPE
1450: 4e 44 20 20 30 78 32 30 20 20 20 20 20 20 20 20  ND  0x20        
1460: 20 2f 2a 20 4d 6f 72 65 20 41 52 52 41 59 2f 4f   /* More ARRAY/O
1470: 42 4a 45 43 54 20 65 6e 74 72 69 65 73 20 61 74  BJECT entries at
1480: 20 75 2e 69 41 70 70 65 6e 64 20 2a 2f 0a 23 64   u.iAppend */.#d
1490: 65 66 69 6e 65 20 4a 4e 4f 44 45 5f 4c 41 42 45  efine JNODE_LABE
14a0: 4c 20 20 20 30 78 34 30 20 20 20 20 20 20 20 20  L   0x40        
14b0: 20 2f 2a 20 49 73 20 61 20 6c 61 62 65 6c 20 6f   /* Is a label o
14c0: 66 20 61 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a  f an object */..
14d0: 0a 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6e 6f 64  ./* A single nod
14e0: 65 20 6f 66 20 70 61 72 73 65 64 20 4a 53 4f 4e  e of parsed JSON
14f0: 0a 2a 2f 0a 73 74 72 75 63 74 20 4a 73 6f 6e 4e  .*/.struct JsonN
1500: 6f 64 65 20 7b 0a 20 20 75 38 20 65 54 79 70 65  ode {.  u8 eType
1510: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1520: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 4a 53 4f  * One of the JSO
1530: 4e 5f 20 74 79 70 65 20 76 61 6c 75 65 73 20 2a  N_ type values *
1540: 2f 0a 20 20 75 38 20 6a 6e 46 6c 61 67 73 3b 20  /.  u8 jnFlags; 
1550: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 4e             /* JN
1560: 4f 44 45 20 66 6c 61 67 73 20 2a 2f 0a 20 20 75  ODE flags */.  u
1570: 33 32 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  32 n;           
1580: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
1590: 66 20 63 6f 6e 74 65 6e 74 2c 20 6f 72 20 6e 75  f content, or nu
15a0: 6d 62 65 72 20 6f 66 20 73 75 62 2d 6e 6f 64 65  mber of sub-node
15b0: 73 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20  s */.  union {. 
15c0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
15d0: 4a 43 6f 6e 74 65 6e 74 3b 20 2f 2a 20 43 6f 6e  JContent; /* Con
15e0: 74 65 6e 74 20 66 6f 72 20 49 4e 54 2c 20 52 45  tent for INT, RE
15f0: 41 4c 2c 20 61 6e 64 20 53 54 52 49 4e 47 20 2a  AL, and STRING *
1600: 2f 0a 20 20 20 20 75 33 32 20 69 41 70 70 65 6e  /.    u32 iAppen
1610: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
1620: 4d 6f 72 65 20 74 65 72 6d 73 20 66 6f 72 20 41  More terms for A
1630: 52 52 41 59 20 61 6e 64 20 4f 42 4a 45 43 54 20  RRAY and OBJECT 
1640: 2a 2f 0a 20 20 20 20 75 33 32 20 69 4b 65 79 3b  */.    u32 iKey;
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1660: 20 4b 65 79 20 66 6f 72 20 41 52 52 41 59 20 6f   Key for ARRAY o
1670: 62 6a 65 63 74 73 20 69 6e 20 6a 73 6f 6e 5f 74  bjects in json_t
1680: 72 65 65 28 29 20 2a 2f 0a 20 20 20 20 75 33 32  ree() */.    u32
1690: 20 69 52 65 70 6c 61 63 65 3b 20 20 20 20 20 20   iReplace;      
16a0: 20 20 20 20 2f 2a 20 52 65 70 6c 61 63 65 6d 65      /* Replaceme
16b0: 6e 74 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 4a  nt content for J
16c0: 4e 4f 44 45 5f 52 45 50 4c 41 43 45 20 2a 2f 0a  NODE_REPLACE */.
16d0: 20 20 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 50      JsonNode *pP
16e0: 61 74 63 68 3b 20 20 20 20 20 20 2f 2a 20 4e 6f  atch;      /* No
16f0: 64 65 20 63 68 61 69 6e 20 6f 66 20 70 61 74 63  de chain of patc
1700: 68 20 66 6f 72 20 4a 4e 4f 44 45 5f 50 41 54 43  h for JNODE_PATC
1710: 48 20 2a 2f 0a 20 20 7d 20 75 3b 0a 7d 3b 0a 0a  H */.  } u;.};..
1720: 2f 2a 20 41 20 63 6f 6d 70 6c 65 74 65 6c 79 20  /* A completely 
1730: 70 61 72 73 65 64 20 4a 53 4f 4e 20 73 74 72 69  parsed JSON stri
1740: 6e 67 0a 2a 2f 0a 73 74 72 75 63 74 20 4a 73 6f  ng.*/.struct Jso
1750: 6e 50 61 72 73 65 20 7b 0a 20 20 75 33 32 20 6e  nParse {.  u32 n
1760: 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Node;         /*
1770: 20 4e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73   Number of slots
1780: 20 6f 66 20 61 4e 6f 64 65 5b 5d 20 75 73 65 64   of aNode[] used
1790: 20 2a 2f 0a 20 20 75 33 32 20 6e 41 6c 6c 6f 63   */.  u32 nAlloc
17a0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ;        /* Numb
17b0: 65 72 20 6f 66 20 73 6c 6f 74 73 20 6f 66 20 61  er of slots of a
17c0: 4e 6f 64 65 5b 5d 20 61 6c 6c 6f 63 61 74 65 64  Node[] allocated
17d0: 20 2a 2f 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a   */.  JsonNode *
17e0: 61 4e 6f 64 65 3b 20 20 20 2f 2a 20 41 72 72 61  aNode;   /* Arra
17f0: 79 20 6f 66 20 6e 6f 64 65 73 20 63 6f 6e 74 61  y of nodes conta
1800: 69 6e 69 6e 67 20 74 68 65 20 70 61 72 73 65 20  ining the parse 
1810: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1820: 2a 7a 4a 73 6f 6e 3b 20 2f 2a 20 4f 72 69 67 69  *zJson; /* Origi
1830: 6e 61 6c 20 4a 53 4f 4e 20 73 74 72 69 6e 67 20  nal JSON string 
1840: 2a 2f 0a 20 20 75 33 32 20 2a 61 55 70 3b 20 20  */.  u32 *aUp;  
1850: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1860: 20 6f 66 20 70 61 72 65 6e 74 20 6f 66 20 65 61   of parent of ea
1870: 63 68 20 6e 6f 64 65 20 2a 2f 0a 20 20 75 38 20  ch node */.  u8 
1880: 6f 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  oom;            
1890: 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20 69  /* Set to true i
18a0: 66 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20  f out of memory 
18b0: 2a 2f 0a 20 20 75 38 20 6e 45 72 72 3b 20 20 20  */.  u8 nErr;   
18c0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
18d0: 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e  r of errors seen
18e0: 20 2a 2f 0a 20 20 75 31 36 20 69 44 65 70 74 68   */.  u16 iDepth
18f0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 73 74  ;        /* Nest
1900: 69 6e 67 20 64 65 70 74 68 20 2a 2f 0a 20 20 69  ing depth */.  i
1910: 6e 74 20 6e 4a 73 6f 6e 3b 20 20 20 20 20 20 20  nt nJson;       
1920: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74    /* Length of t
1930: 68 65 20 7a 4a 73 6f 6e 20 73 74 72 69 6e 67 20  he zJson string 
1940: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 7d 3b 0a 0a  in bytes */.};..
1950: 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 6e 65  /*.** Maximum ne
1960: 73 74 69 6e 67 20 64 65 70 74 68 20 6f 66 20 4a  sting depth of J
1970: 53 4f 4e 20 66 6f 72 20 74 68 69 73 20 69 6d 70  SON for this imp
1980: 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2a 0a  lementation..**.
1990: 2a 2a 20 54 68 69 73 20 6c 69 6d 69 74 20 69 73  ** This limit is
19a0: 20 6e 65 65 64 65 64 20 74 6f 20 61 76 6f 69 64   needed to avoid
19b0: 20 61 20 73 74 61 63 6b 20 6f 76 65 72 66 6c 6f   a stack overflo
19c0: 77 20 69 6e 20 74 68 65 20 72 65 63 75 72 73 69  w in the recursi
19d0: 76 65 0a 2a 2a 20 64 65 73 63 65 6e 74 20 70 61  ve.** descent pa
19e0: 72 73 65 72 2e 20 20 41 20 64 65 70 74 68 20 6f  rser.  A depth o
19f0: 66 20 32 30 30 30 20 69 73 20 66 61 72 20 64 65  f 2000 is far de
1a00: 65 70 65 72 20 74 68 61 6e 20 61 6e 79 20 73 61  eper than any sa
1a10: 6e 65 20 4a 53 4f 4e 0a 2a 2a 20 73 68 6f 75 6c  ne JSON.** shoul
1a20: 64 20 67 6f 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  d go..*/.#define
1a30: 20 4a 53 4f 4e 5f 4d 41 58 5f 44 45 50 54 48 20   JSON_MAX_DEPTH 
1a40: 20 32 30 30 30 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   2000../********
1a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a90: 2a 2a 0a 2a 2a 20 55 74 69 6c 69 74 79 20 72 6f  **.** Utility ro
1aa0: 75 74 69 6e 65 73 20 66 6f 72 20 64 65 61 6c 69  utines for deali
1ab0: 6e 67 20 77 69 74 68 20 4a 73 6f 6e 53 74 72 69  ng with JsonStri
1ac0: 6e 67 20 6f 62 6a 65 63 74 73 0a 2a 2a 2a 2a 2a  ng objects.*****
1ad0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1af0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b10: 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 20 53 65 74 20 74  *****/../* Set t
1b20: 68 65 20 4a 73 6f 6e 53 74 72 69 6e 67 20 6f 62  he JsonString ob
1b30: 6a 65 63 74 20 74 6f 20 61 6e 20 65 6d 70 74 79  ject to an empty
1b40: 20 73 74 72 69 6e 67 0a 2a 2f 0a 73 74 61 74 69   string.*/.stati
1b50: 63 20 76 6f 69 64 20 6a 73 6f 6e 5a 65 72 6f 28  c void jsonZero(
1b60: 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70 29 7b 0a  JsonString *p){.
1b70: 20 20 70 2d 3e 7a 42 75 66 20 3d 20 70 2d 3e 7a    p->zBuf = p->z
1b80: 53 70 61 63 65 3b 0a 20 20 70 2d 3e 6e 41 6c 6c  Space;.  p->nAll
1b90: 6f 63 20 3d 20 73 69 7a 65 6f 66 28 70 2d 3e 7a  oc = sizeof(p->z
1ba0: 53 70 61 63 65 29 3b 0a 20 20 70 2d 3e 6e 55 73  Space);.  p->nUs
1bb0: 65 64 20 3d 20 30 3b 0a 20 20 70 2d 3e 62 53 74  ed = 0;.  p->bSt
1bc0: 61 74 69 63 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 20  atic = 1;.}../* 
1bd0: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4a  Initialize the J
1be0: 73 6f 6e 53 74 72 69 6e 67 20 6f 62 6a 65 63 74  sonString object
1bf0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1c00: 6a 73 6f 6e 49 6e 69 74 28 4a 73 6f 6e 53 74 72  jsonInit(JsonStr
1c10: 69 6e 67 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f  ing *p, sqlite3_
1c20: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a  context *pCtx){.
1c30: 20 20 70 2d 3e 70 43 74 78 20 3d 20 70 43 74 78    p->pCtx = pCtx
1c40: 3b 0a 20 20 70 2d 3e 62 45 72 72 20 3d 20 30 3b  ;.  p->bErr = 0;
1c50: 0a 20 20 6a 73 6f 6e 5a 65 72 6f 28 70 29 3b 0a  .  jsonZero(p);.
1c60: 7d 0a 0a 0a 2f 2a 20 46 72 65 65 20 61 6c 6c 20  }.../* Free all 
1c70: 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79  allocated memory
1c80: 20 61 6e 64 20 72 65 73 65 74 20 74 68 65 20 4a   and reset the J
1c90: 73 6f 6e 53 74 72 69 6e 67 20 6f 62 6a 65 63 74  sonString object
1ca0: 20 62 61 63 6b 20 74 6f 20 69 74 73 0a 2a 2a 20   back to its.** 
1cb0: 69 6e 69 74 69 61 6c 20 73 74 61 74 65 2e 0a 2a  initial state..*
1cc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73  /.static void js
1cd0: 6f 6e 52 65 73 65 74 28 4a 73 6f 6e 53 74 72 69  onReset(JsonStri
1ce0: 6e 67 20 2a 70 29 7b 0a 20 20 69 66 28 20 21 70  ng *p){.  if( !p
1cf0: 2d 3e 62 53 74 61 74 69 63 20 29 20 73 71 6c 69  ->bStatic ) sqli
1d00: 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 42 75 66  te3_free(p->zBuf
1d10: 29 3b 0a 20 20 6a 73 6f 6e 5a 65 72 6f 28 70 29  );.  jsonZero(p)
1d20: 3b 0a 7d 0a 0a 0a 2f 2a 20 52 65 70 6f 72 74 20  ;.}.../* Report 
1d30: 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79  an out-of-memory
1d40: 20 28 4f 4f 4d 29 20 63 6f 6e 64 69 74 69 6f 6e   (OOM) condition
1d50: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64   .*/.static void
1d60: 20 6a 73 6f 6e 4f 6f 6d 28 4a 73 6f 6e 53 74 72   jsonOom(JsonStr
1d70: 69 6e 67 20 2a 70 29 7b 0a 20 20 70 2d 3e 62 45  ing *p){.  p->bE
1d80: 72 72 20 3d 20 31 3b 0a 20 20 73 71 6c 69 74 65  rr = 1;.  sqlite
1d90: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e  3_result_error_n
1da0: 6f 6d 65 6d 28 70 2d 3e 70 43 74 78 29 3b 0a 20  omem(p->pCtx);. 
1db0: 20 6a 73 6f 6e 52 65 73 65 74 28 70 29 3b 0a 7d   jsonReset(p);.}
1dc0: 0a 0a 2f 2a 20 45 6e 6c 61 72 67 65 20 70 4a 73  ../* Enlarge pJs
1dd0: 6f 6e 2d 3e 7a 42 75 66 20 73 6f 20 74 68 61 74  on->zBuf so that
1de0: 20 69 74 20 63 61 6e 20 68 6f 6c 64 20 61 74 20   it can hold at 
1df0: 6c 65 61 73 74 20 4e 20 6d 6f 72 65 20 62 79 74  least N more byt
1e00: 65 73 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 7a 65  es..** Return ze
1e10: 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ro on success.  
1e20: 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
1e30: 6f 6e 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 0a  on an OOM error.
1e40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 73  */.static int js
1e50: 6f 6e 47 72 6f 77 28 4a 73 6f 6e 53 74 72 69 6e  onGrow(JsonStrin
1e60: 67 20 2a 70 2c 20 75 33 32 20 4e 29 7b 0a 20 20  g *p, u32 N){.  
1e70: 75 36 34 20 6e 54 6f 74 61 6c 20 3d 20 4e 3c 70  u64 nTotal = N<p
1e80: 2d 3e 6e 41 6c 6c 6f 63 20 3f 20 70 2d 3e 6e 41  ->nAlloc ? p->nA
1e90: 6c 6c 6f 63 2a 32 20 3a 20 70 2d 3e 6e 41 6c 6c  lloc*2 : p->nAll
1ea0: 6f 63 2b 4e 2b 31 30 3b 0a 20 20 63 68 61 72 20  oc+N+10;.  char 
1eb0: 2a 7a 4e 65 77 3b 0a 20 20 69 66 28 20 70 2d 3e  *zNew;.  if( p->
1ec0: 62 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 69  bStatic ){.    i
1ed0: 66 28 20 70 2d 3e 62 45 72 72 20 29 20 72 65 74  f( p->bErr ) ret
1ee0: 75 72 6e 20 31 3b 0a 20 20 20 20 7a 4e 65 77 20  urn 1;.    zNew 
1ef0: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
1f00: 36 34 28 6e 54 6f 74 61 6c 29 3b 0a 20 20 20 20  64(nTotal);.    
1f10: 69 66 28 20 7a 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( zNew==0 ){. 
1f20: 20 20 20 20 20 6a 73 6f 6e 4f 6f 6d 28 70 29 3b       jsonOom(p);
1f30: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1f40: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1f50: 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 4e 65  }.    memcpy(zNe
1f60: 77 2c 20 70 2d 3e 7a 42 75 66 2c 20 28 73 69 7a  w, p->zBuf, (siz
1f70: 65 5f 74 29 70 2d 3e 6e 55 73 65 64 29 3b 0a 20  e_t)p->nUsed);. 
1f80: 20 20 20 70 2d 3e 7a 42 75 66 20 3d 20 7a 4e 65     p->zBuf = zNe
1f90: 77 3b 0a 20 20 20 20 70 2d 3e 62 53 74 61 74 69  w;.    p->bStati
1fa0: 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  c = 0;.  }else{.
1fb0: 20 20 20 20 7a 4e 65 77 20 3d 20 73 71 6c 69 74      zNew = sqlit
1fc0: 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 2d 3e  e3_realloc64(p->
1fd0: 7a 42 75 66 2c 20 6e 54 6f 74 61 6c 29 3b 0a 20  zBuf, nTotal);. 
1fe0: 20 20 20 69 66 28 20 7a 4e 65 77 3d 3d 30 20 29     if( zNew==0 )
1ff0: 7b 0a 20 20 20 20 20 20 6a 73 6f 6e 4f 6f 6d 28  {.      jsonOom(
2000: 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  p);.      return
2010: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2020: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 7a 42 75 66     }.    p->zBuf
2030: 20 3d 20 7a 4e 65 77 3b 0a 20 20 7d 0a 20 20 70   = zNew;.  }.  p
2040: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 54 6f 74 61  ->nAlloc = nTota
2050: 6c 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  l;.  return SQLI
2060: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 41 70 70  TE_OK;.}../* App
2070: 65 6e 64 20 4e 20 62 79 74 65 73 20 66 72 6f 6d  end N bytes from
2080: 20 7a 49 6e 20 6f 6e 74 6f 20 74 68 65 20 65 6e   zIn onto the en
2090: 64 20 6f 66 20 74 68 65 20 4a 73 6f 6e 53 74 72  d of the JsonStr
20a0: 69 6e 67 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73  ing string..*/.s
20b0: 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 41  tatic void jsonA
20c0: 70 70 65 6e 64 52 61 77 28 4a 73 6f 6e 53 74 72  ppendRaw(JsonStr
20d0: 69 6e 67 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  ing *p, const ch
20e0: 61 72 20 2a 7a 49 6e 2c 20 75 33 32 20 4e 29 7b  ar *zIn, u32 N){
20f0: 0a 20 20 69 66 28 20 28 4e 2b 70 2d 3e 6e 55 73  .  if( (N+p->nUs
2100: 65 64 20 3e 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 29  ed >= p->nAlloc)
2110: 20 26 26 20 6a 73 6f 6e 47 72 6f 77 28 70 2c 4e   && jsonGrow(p,N
2120: 29 21 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )!=0 ) return;. 
2130: 20 6d 65 6d 63 70 79 28 70 2d 3e 7a 42 75 66 2b   memcpy(p->zBuf+
2140: 70 2d 3e 6e 55 73 65 64 2c 20 7a 49 6e 2c 20 4e  p->nUsed, zIn, N
2150: 29 3b 0a 20 20 70 2d 3e 6e 55 73 65 64 20 2b 3d  );.  p->nUsed +=
2160: 20 4e 3b 0a 7d 0a 0a 2f 2a 20 41 70 70 65 6e 64   N;.}../* Append
2170: 20 66 6f 72 6d 61 74 74 65 64 20 74 65 78 74 20   formatted text 
2180: 28 6e 6f 74 20 74 6f 20 65 78 63 65 65 64 20 4e  (not to exceed N
2190: 20 62 79 74 65 73 29 20 74 6f 20 74 68 65 20 4a   bytes) to the J
21a0: 73 6f 6e 53 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74  sonString..*/.st
21b0: 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 50 72  atic void jsonPr
21c0: 69 6e 74 66 28 69 6e 74 20 4e 2c 20 4a 73 6f 6e  intf(int N, Json
21d0: 53 74 72 69 6e 67 20 2a 70 2c 20 63 6f 6e 73 74  String *p, const
21e0: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
21f0: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
2200: 61 70 3b 0a 20 20 69 66 28 20 28 70 2d 3e 6e 55  ap;.  if( (p->nU
2210: 73 65 64 20 2b 20 4e 20 3e 3d 20 70 2d 3e 6e 41  sed + N >= p->nA
2220: 6c 6c 6f 63 29 20 26 26 20 6a 73 6f 6e 47 72 6f  lloc) && jsonGro
2230: 77 28 70 2c 20 4e 29 20 29 20 72 65 74 75 72 6e  w(p, N) ) return
2240: 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ;.  va_start(ap,
2250: 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 73 71 6c   zFormat);.  sql
2260: 69 74 65 33 5f 76 73 6e 70 72 69 6e 74 66 28 4e  ite3_vsnprintf(N
2270: 2c 20 70 2d 3e 7a 42 75 66 2b 70 2d 3e 6e 55 73  , p->zBuf+p->nUs
2280: 65 64 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  ed, zFormat, ap)
2290: 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  ;.  va_end(ap);.
22a0: 20 20 70 2d 3e 6e 55 73 65 64 20 2b 3d 20 28 69    p->nUsed += (i
22b0: 6e 74 29 73 74 72 6c 65 6e 28 70 2d 3e 7a 42 75  nt)strlen(p->zBu
22c0: 66 2b 70 2d 3e 6e 55 73 65 64 29 3b 0a 7d 0a 0a  f+p->nUsed);.}..
22d0: 2f 2a 20 41 70 70 65 6e 64 20 61 20 73 69 6e 67  /* Append a sing
22e0: 6c 65 20 63 68 61 72 61 63 74 65 72 0a 2a 2f 0a  le character.*/.
22f0: 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e  static void json
2300: 41 70 70 65 6e 64 43 68 61 72 28 4a 73 6f 6e 53  AppendChar(JsonS
2310: 74 72 69 6e 67 20 2a 70 2c 20 63 68 61 72 20 63  tring *p, char c
2320: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6e 55 73 65  ){.  if( p->nUse
2330: 64 3e 3d 70 2d 3e 6e 41 6c 6c 6f 63 20 26 26 20  d>=p->nAlloc && 
2340: 6a 73 6f 6e 47 72 6f 77 28 70 2c 31 29 21 3d 30  jsonGrow(p,1)!=0
2350: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 2d 3e   ) return;.  p->
2360: 7a 42 75 66 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d  zBuf[p->nUsed++]
2370: 20 3d 20 63 3b 0a 7d 0a 0a 2f 2a 20 41 70 70 65   = c;.}../* Appe
2380: 6e 64 20 61 20 63 6f 6d 6d 61 20 73 65 70 61 72  nd a comma separ
2390: 61 74 6f 72 20 74 6f 20 74 68 65 20 6f 75 74 70  ator to the outp
23a0: 75 74 20 62 75 66 66 65 72 2c 20 69 66 20 74 68  ut buffer, if th
23b0: 65 20 70 72 65 76 69 6f 75 73 0a 2a 2a 20 63 68  e previous.** ch
23c0: 61 72 61 63 74 65 72 20 69 73 20 6e 6f 74 20 27  aracter is not '
23d0: 5b 27 20 6f 72 20 27 7b 27 2e 0a 2a 2f 0a 73 74  [' or '{'..*/.st
23e0: 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 41 70  atic void jsonAp
23f0: 70 65 6e 64 53 65 70 61 72 61 74 6f 72 28 4a 73  pendSeparator(Js
2400: 6f 6e 53 74 72 69 6e 67 20 2a 70 29 7b 0a 20 20  onString *p){.  
2410: 63 68 61 72 20 63 3b 0a 20 20 69 66 28 20 70 2d  char c;.  if( p-
2420: 3e 6e 55 73 65 64 3d 3d 30 20 29 20 72 65 74 75  >nUsed==0 ) retu
2430: 72 6e 3b 0a 20 20 63 20 3d 20 70 2d 3e 7a 42 75  rn;.  c = p->zBu
2440: 66 5b 70 2d 3e 6e 55 73 65 64 2d 31 5d 3b 0a 20  f[p->nUsed-1];. 
2450: 20 69 66 28 20 63 21 3d 27 5b 27 20 26 26 20 63   if( c!='[' && c
2460: 21 3d 27 7b 27 20 29 20 6a 73 6f 6e 41 70 70 65  !='{' ) jsonAppe
2470: 6e 64 43 68 61 72 28 70 2c 20 27 2c 27 29 3b 0a  ndChar(p, ',');.
2480: 7d 0a 0a 2f 2a 20 41 70 70 65 6e 64 20 74 68 65  }../* Append the
2490: 20 4e 2d 62 79 74 65 20 73 74 72 69 6e 67 20 69   N-byte string i
24a0: 6e 20 7a 49 6e 20 74 6f 20 74 68 65 20 65 6e 64  n zIn to the end
24b0: 20 6f 66 20 74 68 65 20 4a 73 6f 6e 53 74 72 69   of the JsonStri
24c0: 6e 67 20 73 74 72 69 6e 67 0a 2a 2a 20 75 6e 64  ng string.** und
24d0: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
24e0: 20 20 45 6e 63 6c 6f 73 65 20 74 68 65 20 73 74    Enclose the st
24f0: 72 69 6e 67 20 69 6e 20 22 2e 2e 2e 22 20 61 6e  ring in "..." an
2500: 64 20 65 73 63 61 70 65 0a 2a 2a 20 61 6e 79 20  d escape.** any 
2510: 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 20 6f 72  double-quotes or
2520: 20 62 61 63 6b 73 6c 61 73 68 20 63 68 61 72 61   backslash chara
2530: 63 74 65 72 73 20 63 6f 6e 74 61 69 6e 65 64 20  cters contained 
2540: 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20 73 74  within the.** st
2550: 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ring..*/.static 
2560: 76 6f 69 64 20 6a 73 6f 6e 41 70 70 65 6e 64 53  void jsonAppendS
2570: 74 72 69 6e 67 28 4a 73 6f 6e 53 74 72 69 6e 67  tring(JsonString
2580: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
2590: 2a 7a 49 6e 2c 20 75 33 32 20 4e 29 7b 0a 20 20  *zIn, u32 N){.  
25a0: 75 33 32 20 69 3b 0a 20 20 69 66 28 20 28 4e 2b  u32 i;.  if( (N+
25b0: 70 2d 3e 6e 55 73 65 64 2b 32 20 3e 3d 20 70 2d  p->nUsed+2 >= p-
25c0: 3e 6e 41 6c 6c 6f 63 29 20 26 26 20 6a 73 6f 6e  >nAlloc) && json
25d0: 47 72 6f 77 28 70 2c 4e 2b 32 29 21 3d 30 20 29  Grow(p,N+2)!=0 )
25e0: 20 72 65 74 75 72 6e 3b 0a 20 20 70 2d 3e 7a 42   return;.  p->zB
25f0: 75 66 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d  uf[p->nUsed++] =
2600: 20 27 22 27 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   '"';.  for(i=0;
2610: 20 69 3c 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<N; i++){.    
2620: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 20  unsigned char c 
2630: 3d 20 28 28 75 6e 73 69 67 6e 65 64 20 63 6f 6e  = ((unsigned con
2640: 73 74 20 63 68 61 72 2a 29 7a 49 6e 29 5b 69 5d  st char*)zIn)[i]
2650: 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 22 27  ;.    if( c=='"'
2660: 20 7c 7c 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20   || c=='\\' ){. 
2670: 20 20 20 20 20 6a 73 6f 6e 5f 73 69 6d 70 6c 65       json_simple
2680: 5f 65 73 63 61 70 65 3a 0a 20 20 20 20 20 20 69  _escape:.      i
2690: 66 28 20 28 70 2d 3e 6e 55 73 65 64 2b 4e 2b 33  f( (p->nUsed+N+3
26a0: 2d 69 20 3e 20 70 2d 3e 6e 41 6c 6c 6f 63 29 20  -i > p->nAlloc) 
26b0: 26 26 20 6a 73 6f 6e 47 72 6f 77 28 70 2c 4e 2b  && jsonGrow(p,N+
26c0: 33 2d 69 29 21 3d 30 20 29 20 72 65 74 75 72 6e  3-i)!=0 ) return
26d0: 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 42 75 66 5b  ;.      p->zBuf[
26e0: 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d 20 27 5c  p->nUsed++] = '\
26f0: 5c 27 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  \';.    }else if
2700: 28 20 63 3c 3d 30 78 31 66 20 29 7b 0a 20 20 20  ( c<=0x1f ){.   
2710: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
2720: 63 68 61 72 20 61 53 70 65 63 69 61 6c 5b 5d 20  char aSpecial[] 
2730: 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 30 2c 20  = {.         0, 
2740: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
2750: 2c 20 30 2c 20 27 62 27 2c 20 27 74 27 2c 20 27  , 0, 'b', 't', '
2760: 6e 27 2c 20 30 2c 20 27 66 27 2c 20 27 72 27 2c  n', 0, 'f', 'r',
2770: 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
2780: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
2790: 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 20 20 30  , 0, 0,   0,   0
27a0: 2c 20 20 20 30 2c 20 30 2c 20 20 20 30 2c 20 20  ,   0, 0,   0,  
27b0: 20 30 2c 20 30 2c 20 30 0a 20 20 20 20 20 20 7d   0, 0, 0.      }
27c0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
27d0: 73 69 7a 65 6f 66 28 61 53 70 65 63 69 61 6c 29  sizeof(aSpecial)
27e0: 3d 3d 33 32 20 29 3b 0a 20 20 20 20 20 20 61 73  ==32 );.      as
27f0: 73 65 72 74 28 20 61 53 70 65 63 69 61 6c 5b 27  sert( aSpecial['
2800: 5c 62 27 5d 3d 3d 27 62 27 20 29 3b 0a 20 20 20  \b']=='b' );.   
2810: 20 20 20 61 73 73 65 72 74 28 20 61 53 70 65 63     assert( aSpec
2820: 69 61 6c 5b 27 5c 66 27 5d 3d 3d 27 66 27 20 29  ial['\f']=='f' )
2830: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2840: 61 53 70 65 63 69 61 6c 5b 27 5c 6e 27 5d 3d 3d  aSpecial['\n']==
2850: 27 6e 27 20 29 3b 0a 20 20 20 20 20 20 61 73 73  'n' );.      ass
2860: 65 72 74 28 20 61 53 70 65 63 69 61 6c 5b 27 5c  ert( aSpecial['\
2870: 72 27 5d 3d 3d 27 72 27 20 29 3b 0a 20 20 20 20  r']=='r' );.    
2880: 20 20 61 73 73 65 72 74 28 20 61 53 70 65 63 69    assert( aSpeci
2890: 61 6c 5b 27 5c 74 27 5d 3d 3d 27 74 27 20 29 3b  al['\t']=='t' );
28a0: 0a 20 20 20 20 20 20 69 66 28 20 61 53 70 65 63  .      if( aSpec
28b0: 69 61 6c 5b 63 5d 20 29 7b 0a 20 20 20 20 20 20  ial[c] ){.      
28c0: 20 20 63 20 3d 20 61 53 70 65 63 69 61 6c 5b 63    c = aSpecial[c
28d0: 5d 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ];.        goto 
28e0: 6a 73 6f 6e 5f 73 69 6d 70 6c 65 5f 65 73 63 61  json_simple_esca
28f0: 70 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  pe;.      }.    
2900: 20 20 69 66 28 20 28 70 2d 3e 6e 55 73 65 64 2b    if( (p->nUsed+
2910: 4e 2b 37 2b 69 20 3e 20 70 2d 3e 6e 41 6c 6c 6f  N+7+i > p->nAllo
2920: 63 29 20 26 26 20 6a 73 6f 6e 47 72 6f 77 28 70  c) && jsonGrow(p
2930: 2c 4e 2b 37 2d 69 29 21 3d 30 20 29 20 72 65 74  ,N+7-i)!=0 ) ret
2940: 75 72 6e 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 42  urn;.      p->zB
2950: 75 66 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d  uf[p->nUsed++] =
2960: 20 27 5c 5c 27 3b 0a 20 20 20 20 20 20 70 2d 3e   '\\';.      p->
2970: 7a 42 75 66 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d  zBuf[p->nUsed++]
2980: 20 3d 20 27 75 27 3b 0a 20 20 20 20 20 20 70 2d   = 'u';.      p-
2990: 3e 7a 42 75 66 5b 70 2d 3e 6e 55 73 65 64 2b 2b  >zBuf[p->nUsed++
29a0: 5d 20 3d 20 27 30 27 3b 0a 20 20 20 20 20 20 70  ] = '0';.      p
29b0: 2d 3e 7a 42 75 66 5b 70 2d 3e 6e 55 73 65 64 2b  ->zBuf[p->nUsed+
29c0: 2b 5d 20 3d 20 27 30 27 3b 0a 20 20 20 20 20 20  +] = '0';.      
29d0: 70 2d 3e 7a 42 75 66 5b 70 2d 3e 6e 55 73 65 64  p->zBuf[p->nUsed
29e0: 2b 2b 5d 20 3d 20 27 30 27 20 2b 20 28 63 3e 3e  ++] = '0' + (c>>
29f0: 34 29 3b 0a 20 20 20 20 20 20 63 20 3d 20 22 30  4);.      c = "0
2a00: 31 32 33 34 35 36 37 38 39 61 62 63 64 65 66 22  123456789abcdef"
2a10: 5b 63 26 30 78 66 5d 3b 0a 20 20 20 20 7d 0a 20  [c&0xf];.    }. 
2a20: 20 20 20 70 2d 3e 7a 42 75 66 5b 70 2d 3e 6e 55     p->zBuf[p->nU
2a30: 73 65 64 2b 2b 5d 20 3d 20 63 3b 0a 20 20 7d 0a  sed++] = c;.  }.
2a40: 20 20 70 2d 3e 7a 42 75 66 5b 70 2d 3e 6e 55 73    p->zBuf[p->nUs
2a50: 65 64 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 61  ed++] = '"';.  a
2a60: 73 73 65 72 74 28 20 70 2d 3e 6e 55 73 65 64 3c  ssert( p->nUsed<
2a70: 70 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 7d 0a 0a  p->nAlloc );.}..
2a80: 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 66  /*.** Append a f
2a90: 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65  unction paramete
2aa0: 72 20 76 61 6c 75 65 20 74 6f 20 74 68 65 20 4a  r value to the J
2ab0: 53 4f 4e 20 73 74 72 69 6e 67 20 75 6e 64 65 72  SON string under
2ac0: 20 0a 2a 2a 20 63 6f 6e 73 74 72 75 63 74 69 6f   .** constructio
2ad0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
2ae0: 64 20 6a 73 6f 6e 41 70 70 65 6e 64 56 61 6c 75  d jsonAppendValu
2af0: 65 28 0a 20 20 4a 73 6f 6e 53 74 72 69 6e 67 20  e(.  JsonString 
2b00: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
2b10: 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f      /* Append to
2b20: 20 74 68 69 73 20 4a 53 4f 4e 20 73 74 72 69 6e   this JSON strin
2b30: 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  g */.  sqlite3_v
2b40: 61 6c 75 65 20 2a 70 56 61 6c 75 65 20 20 20 20  alue *pValue    
2b50: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74        /* Value t
2b60: 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20  o append */.){. 
2b70: 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33   switch( sqlite3
2b80: 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 56 61 6c  _value_type(pVal
2b90: 75 65 29 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ue) ){.    case 
2ba0: 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20  SQLITE_NULL: {. 
2bb0: 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 52       jsonAppendR
2bc0: 61 77 28 70 2c 20 22 6e 75 6c 6c 22 2c 20 34 29  aw(p, "null", 4)
2bd0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2be0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
2bf0: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 0a 20 20  LITE_INTEGER:.  
2c00: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c    case SQLITE_FL
2c10: 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e  OAT: {.      con
2c20: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f  st char *z = (co
2c30: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
2c40: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61  3_value_text(pVa
2c50: 6c 75 65 29 3b 0a 20 20 20 20 20 20 75 33 32 20  lue);.      u32 
2c60: 6e 20 3d 20 28 75 33 32 29 73 71 6c 69 74 65 33  n = (u32)sqlite3
2c70: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 56 61  _value_bytes(pVa
2c80: 6c 75 65 29 3b 0a 20 20 20 20 20 20 6a 73 6f 6e  lue);.      json
2c90: 41 70 70 65 6e 64 52 61 77 28 70 2c 20 7a 2c 20  AppendRaw(p, z, 
2ca0: 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
2cb0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
2cc0: 53 51 4c 49 54 45 5f 54 45 58 54 3a 20 7b 0a 20  SQLITE_TEXT: {. 
2cd0: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
2ce0: 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  *z = (const char
2cf0: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
2d00: 74 65 78 74 28 70 56 61 6c 75 65 29 3b 0a 20 20  text(pValue);.  
2d10: 20 20 20 20 75 33 32 20 6e 20 3d 20 28 75 33 32      u32 n = (u32
2d20: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62  )sqlite3_value_b
2d30: 79 74 65 73 28 70 56 61 6c 75 65 29 3b 0a 20 20  ytes(pValue);.  
2d40: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
2d50: 76 61 6c 75 65 5f 73 75 62 74 79 70 65 28 70 56  value_subtype(pV
2d60: 61 6c 75 65 29 3d 3d 4a 53 4f 4e 5f 53 55 42 54  alue)==JSON_SUBT
2d70: 59 50 45 20 29 7b 0a 20 20 20 20 20 20 20 20 6a  YPE ){.        j
2d80: 73 6f 6e 41 70 70 65 6e 64 52 61 77 28 70 2c 20  sonAppendRaw(p, 
2d90: 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  z, n);.      }el
2da0: 73 65 7b 0a 20 20 20 20 20 20 20 20 6a 73 6f 6e  se{.        json
2db0: 41 70 70 65 6e 64 53 74 72 69 6e 67 28 70 2c 20  AppendString(p, 
2dc0: 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  z, n);.      }. 
2dd0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2de0: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
2df0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 62 45  .      if( p->bE
2e00: 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rr==0 ){.       
2e10: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
2e20: 65 72 72 6f 72 28 70 2d 3e 70 43 74 78 2c 20 22  error(p->pCtx, "
2e30: 4a 53 4f 4e 20 63 61 6e 6e 6f 74 20 68 6f 6c 64  JSON cannot hold
2e40: 20 42 4c 4f 42 20 76 61 6c 75 65 73 22 2c 20 2d   BLOB values", -
2e50: 31 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 62  1);.        p->b
2e60: 45 72 72 20 3d 20 32 3b 0a 20 20 20 20 20 20 20  Err = 2;.       
2e70: 20 6a 73 6f 6e 52 65 73 65 74 28 70 29 3b 0a 20   jsonReset(p);. 
2e80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
2e90: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ak;.    }.  }.}.
2ea0: 0a 0a 2f 2a 20 4d 61 6b 65 20 74 68 65 20 4a 53  ../* Make the JS
2eb0: 4f 4e 20 69 6e 20 70 20 74 68 65 20 72 65 73 75  ON in p the resu
2ec0: 6c 74 20 6f 66 20 74 68 65 20 53 51 4c 20 66 75  lt of the SQL fu
2ed0: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
2ee0: 63 20 76 6f 69 64 20 6a 73 6f 6e 52 65 73 75 6c  c void jsonResul
2ef0: 74 28 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70 29  t(JsonString *p)
2f00: 7b 0a 20 20 69 66 28 20 70 2d 3e 62 45 72 72 3d  {.  if( p->bErr=
2f10: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
2f20: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 36 34 28  3_result_text64(
2f30: 70 2d 3e 70 43 74 78 2c 20 70 2d 3e 7a 42 75 66  p->pCtx, p->zBuf
2f40: 2c 20 70 2d 3e 6e 55 73 65 64 2c 20 0a 20 20 20  , p->nUsed, .   
2f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f60: 20 20 20 20 20 20 20 70 2d 3e 62 53 74 61 74 69         p->bStati
2f70: 63 20 3f 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  c ? SQLITE_TRANS
2f80: 49 45 4e 54 20 3a 20 73 71 6c 69 74 65 33 5f 66  IENT : sqlite3_f
2f90: 72 65 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ree,.           
2fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
2fb0: 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20  QLITE_UTF8);.   
2fc0: 20 6a 73 6f 6e 5a 65 72 6f 28 70 29 3b 0a 20 20   jsonZero(p);.  
2fd0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62  }.  assert( p->b
2fe0: 53 74 61 74 69 63 20 29 3b 0a 7d 0a 0a 2f 2a 2a  Static );.}../**
2ff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3030: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 55 74 69 6c  ********.** Util
3040: 69 74 79 20 72 6f 75 74 69 6e 65 73 20 66 6f 72  ity routines for
3050: 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 4a 73   dealing with Js
3060: 6f 6e 4e 6f 64 65 20 61 6e 64 20 4a 73 6f 6e 50  onNode and JsonP
3070: 61 72 73 65 20 6f 62 6a 65 63 74 73 0a 2a 2a 2a  arse objects.***
3080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30c0: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
30d0: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
30e0: 72 20 6f 66 20 63 6f 6e 73 65 63 75 74 69 76 65  r of consecutive
30f0: 20 4a 73 6f 6e 4e 6f 64 65 20 73 6c 6f 74 73 20   JsonNode slots 
3100: 6e 65 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e  need to represen
3110: 74 0a 2a 2a 20 74 68 65 20 70 61 72 73 65 64 20  t.** the parsed 
3120: 4a 53 4f 4e 20 61 74 20 70 4e 6f 64 65 2e 20 20  JSON at pNode.  
3130: 54 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6e 73 77  The minimum answ
3140: 65 72 20 69 73 20 31 2e 20 20 46 6f 72 20 41 52  er is 1.  For AR
3150: 52 41 59 20 61 6e 64 0a 2a 2a 20 4f 42 4a 45 43  RAY and.** OBJEC
3160: 54 20 74 79 70 65 73 2c 20 74 68 65 20 6e 75 6d  T types, the num
3170: 62 65 72 20 6d 69 67 68 74 20 62 65 20 6c 61 72  ber might be lar
3180: 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 70 70 65 6e  ger..**.** Appen
3190: 64 65 64 20 65 6c 65 6d 65 6e 74 73 20 61 72 65  ded elements are
31a0: 20 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 20 20 54   not counted.  T
31b0: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
31c0: 64 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 0a  d is the number.
31d0: 2a 2a 20 62 79 20 77 68 69 63 68 20 74 68 65 20  ** by which the 
31e0: 4a 73 6f 6e 4e 6f 64 65 20 63 6f 75 6e 74 65 72  JsonNode counter
31f0: 20 73 68 6f 75 6c 64 20 69 6e 63 72 65 6d 65 6e   should incremen
3200: 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 6f  t in order to go
3210: 20 74 6f 20 74 68 65 0a 2a 2a 20 6e 65 78 74 20   to the.** next 
3220: 70 65 65 72 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73  peer value..*/.s
3230: 74 61 74 69 63 20 75 33 32 20 6a 73 6f 6e 4e 6f  tatic u32 jsonNo
3240: 64 65 53 69 7a 65 28 4a 73 6f 6e 4e 6f 64 65 20  deSize(JsonNode 
3250: 2a 70 4e 6f 64 65 29 7b 0a 20 20 72 65 74 75 72  *pNode){.  retur
3260: 6e 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65 3e 3d  n pNode->eType>=
3270: 4a 53 4f 4e 5f 41 52 52 41 59 20 3f 20 70 4e 6f  JSON_ARRAY ? pNo
3280: 64 65 2d 3e 6e 2b 31 20 3a 20 31 3b 0a 7d 0a 0a  de->n+1 : 1;.}..
3290: 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d 20 61 6c  /*.** Reclaim al
32a0: 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  l memory allocat
32b0: 65 64 20 62 79 20 61 20 4a 73 6f 6e 50 61 72 73  ed by a JsonPars
32c0: 65 20 6f 62 6a 65 63 74 2e 20 20 42 75 74 20 64  e object.  But d
32d0: 6f 20 6e 6f 74 0a 2a 2a 20 64 65 6c 65 74 65 20  o not.** delete 
32e0: 74 68 65 20 4a 73 6f 6e 50 61 72 73 65 20 6f 62  the JsonParse ob
32f0: 6a 65 63 74 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a  ject itself..*/.
3300: 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e  static void json
3310: 50 61 72 73 65 52 65 73 65 74 28 4a 73 6f 6e 50  ParseReset(JsonP
3320: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
3330: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
3340: 61 72 73 65 2d 3e 61 4e 6f 64 65 29 3b 0a 20 20  arse->aNode);.  
3350: 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65 20 3d 20  pParse->aNode = 
3360: 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4e 6f  0;.  pParse->nNo
3370: 64 65 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  de = 0;.  pParse
3380: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  ->nAlloc = 0;.  
3390: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
33a0: 72 73 65 2d 3e 61 55 70 29 3b 0a 20 20 70 50 61  rse->aUp);.  pPa
33b0: 72 73 65 2d 3e 61 55 70 20 3d 20 30 3b 0a 7d 0a  rse->aUp = 0;.}.
33c0: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 4a 73  ./*.** Free a Js
33d0: 6f 6e 50 61 72 73 65 20 6f 62 6a 65 63 74 20 74  onParse object t
33e0: 68 61 74 20 77 61 73 20 6f 62 74 61 69 6e 65 64  hat was obtained
33f0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
3400: 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  lloc()..*/.stati
3410: 63 20 76 6f 69 64 20 6a 73 6f 6e 50 61 72 73 65  c void jsonParse
3420: 46 72 65 65 28 4a 73 6f 6e 50 61 72 73 65 20 2a  Free(JsonParse *
3430: 70 50 61 72 73 65 29 7b 0a 20 20 6a 73 6f 6e 50  pParse){.  jsonP
3440: 61 72 73 65 52 65 73 65 74 28 70 50 61 72 73 65  arseReset(pParse
3450: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
3460: 65 28 70 50 61 72 73 65 29 3b 0a 7d 0a 0a 2f 2a  e(pParse);.}../*
3470: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20  .** Convert the 
3480: 4a 73 6f 6e 4e 6f 64 65 20 70 4e 6f 64 65 20 69  JsonNode pNode i
3490: 6e 74 6f 20 61 20 70 75 72 65 20 4a 53 4f 4e 20  nto a pure JSON 
34a0: 73 74 72 69 6e 67 20 61 6e 64 0a 2a 2a 20 61 70  string and.** ap
34b0: 70 65 6e 64 20 74 6f 20 70 4f 75 74 2e 20 20 53  pend to pOut.  S
34c0: 75 62 73 75 62 73 74 72 75 63 74 75 72 65 20 69  ubsubstructure i
34d0: 73 20 61 6c 73 6f 20 69 6e 63 6c 75 64 65 64 2e  s also included.
34e0: 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20    Return.** the 
34f0: 6e 75 6d 62 65 72 20 6f 66 20 4a 73 6f 6e 4e 6f  number of JsonNo
3500: 64 65 20 6f 62 6a 65 63 74 73 20 74 68 61 74 20  de objects that 
3510: 61 72 65 20 65 6e 63 6f 64 65 64 2e 0a 2a 2f 0a  are encoded..*/.
3520: 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e  static void json
3530: 52 65 6e 64 65 72 4e 6f 64 65 28 0a 20 20 4a 73  RenderNode(.  Js
3540: 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 20 20  onNode *pNode,  
3550: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3560: 54 68 65 20 6e 6f 64 65 20 74 6f 20 72 65 6e 64  The node to rend
3570: 65 72 20 2a 2f 0a 20 20 4a 73 6f 6e 53 74 72 69  er */.  JsonStri
3580: 6e 67 20 2a 70 4f 75 74 2c 20 20 20 20 20 20 20  ng *pOut,       
3590: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
35a0: 4a 53 4f 4e 20 68 65 72 65 20 2a 2f 0a 20 20 73  JSON here */.  s
35b0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
35c0: 52 65 70 6c 61 63 65 20 20 20 20 20 20 20 2f 2a  Replace       /*
35d0: 20 52 65 70 6c 61 63 65 6d 65 6e 74 20 76 61 6c   Replacement val
35e0: 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ues */.){.  if( 
35f0: 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73 20 26  pNode->jnFlags &
3600: 20 28 4a 4e 4f 44 45 5f 52 45 50 4c 41 43 45 7c   (JNODE_REPLACE|
3610: 4a 4e 4f 44 45 5f 50 41 54 43 48 29 20 29 7b 0a  JNODE_PATCH) ){.
3620: 20 20 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 6a      if( pNode->j
3630: 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 52  nFlags & JNODE_R
3640: 45 50 4c 41 43 45 20 29 7b 0a 20 20 20 20 20 20  EPLACE ){.      
3650: 6a 73 6f 6e 41 70 70 65 6e 64 56 61 6c 75 65 28  jsonAppendValue(
3660: 70 4f 75 74 2c 20 61 52 65 70 6c 61 63 65 5b 70  pOut, aReplace[p
3670: 4e 6f 64 65 2d 3e 75 2e 69 52 65 70 6c 61 63 65  Node->u.iReplace
3680: 5d 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ]);.      return
3690: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 6f 64  ;.    }.    pNod
36a0: 65 20 3d 20 70 4e 6f 64 65 2d 3e 75 2e 70 50 61  e = pNode->u.pPa
36b0: 74 63 68 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  tch;.  }.  switc
36c0: 68 28 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65 20  h( pNode->eType 
36d0: 29 7b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  ){.    default: 
36e0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
36f0: 70 4e 6f 64 65 2d 3e 65 54 79 70 65 3d 3d 4a 53  pNode->eType==JS
3700: 4f 4e 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  ON_NULL );.     
3710: 20 6a 73 6f 6e 41 70 70 65 6e 64 52 61 77 28 70   jsonAppendRaw(p
3720: 4f 75 74 2c 20 22 6e 75 6c 6c 22 2c 20 34 29 3b  Out, "null", 4);
3730: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3740: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 53 4f    }.    case JSO
3750: 4e 5f 54 52 55 45 3a 20 7b 0a 20 20 20 20 20 20  N_TRUE: {.      
3760: 6a 73 6f 6e 41 70 70 65 6e 64 52 61 77 28 70 4f  jsonAppendRaw(pO
3770: 75 74 2c 20 22 74 72 75 65 22 2c 20 34 29 3b 0a  ut, "true", 4);.
3780: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3790: 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 53 4f 4e   }.    case JSON
37a0: 5f 46 41 4c 53 45 3a 20 7b 0a 20 20 20 20 20 20  _FALSE: {.      
37b0: 6a 73 6f 6e 41 70 70 65 6e 64 52 61 77 28 70 4f  jsonAppendRaw(pO
37c0: 75 74 2c 20 22 66 61 6c 73 65 22 2c 20 35 29 3b  ut, "false", 5);
37d0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
37e0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 53 4f    }.    case JSO
37f0: 4e 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20  N_STRING: {.    
3800: 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 6a 6e 46    if( pNode->jnF
3810: 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 52 41 57  lags & JNODE_RAW
3820: 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 73 6f 6e   ){.        json
3830: 41 70 70 65 6e 64 53 74 72 69 6e 67 28 70 4f 75  AppendString(pOu
3840: 74 2c 20 70 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f  t, pNode->u.zJCo
3850: 6e 74 65 6e 74 2c 20 70 4e 6f 64 65 2d 3e 6e 29  ntent, pNode->n)
3860: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
3870: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
3880: 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 69  * Fall through i
3890: 6e 74 6f 20 74 68 65 20 6e 65 78 74 20 63 61 73  nto the next cas
38a0: 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63  e */.    }.    c
38b0: 61 73 65 20 4a 53 4f 4e 5f 52 45 41 4c 3a 0a 20  ase JSON_REAL:. 
38c0: 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f 49 4e 54     case JSON_INT
38d0: 3a 20 7b 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70  : {.      jsonAp
38e0: 70 65 6e 64 52 61 77 28 70 4f 75 74 2c 20 70 4e  pendRaw(pOut, pN
38f0: 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74  ode->u.zJContent
3900: 2c 20 70 4e 6f 64 65 2d 3e 6e 29 3b 0a 20 20 20  , pNode->n);.   
3910: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3920: 20 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f 41 52      case JSON_AR
3930: 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 75 33 32  RAY: {.      u32
3940: 20 6a 20 3d 20 31 3b 0a 20 20 20 20 20 20 6a 73   j = 1;.      js
3950: 6f 6e 41 70 70 65 6e 64 43 68 61 72 28 70 4f 75  onAppendChar(pOu
3960: 74 2c 20 27 5b 27 29 3b 0a 20 20 20 20 20 20 66  t, '[');.      f
3970: 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20  or(;;){.        
3980: 77 68 69 6c 65 28 20 6a 3c 3d 70 4e 6f 64 65 2d  while( j<=pNode-
3990: 3e 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >n ){.          
39a0: 69 66 28 20 28 70 4e 6f 64 65 5b 6a 5d 2e 6a 6e  if( (pNode[j].jn
39b0: 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 52 45  Flags & JNODE_RE
39c0: 4d 4f 56 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  MOVE)==0 ){.    
39d0: 20 20 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65          jsonAppe
39e0: 6e 64 53 65 70 61 72 61 74 6f 72 28 70 4f 75 74  ndSeparator(pOut
39f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  );.            j
3a00: 73 6f 6e 52 65 6e 64 65 72 4e 6f 64 65 28 26 70  sonRenderNode(&p
3a10: 4e 6f 64 65 5b 6a 5d 2c 20 70 4f 75 74 2c 20 61  Node[j], pOut, a
3a20: 52 65 70 6c 61 63 65 29 3b 0a 20 20 20 20 20 20  Replace);.      
3a30: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
3a40: 6a 20 2b 3d 20 6a 73 6f 6e 4e 6f 64 65 53 69 7a  j += jsonNodeSiz
3a50: 65 28 26 70 4e 6f 64 65 5b 6a 5d 29 3b 0a 20 20  e(&pNode[j]);.  
3a60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3a70: 69 66 28 20 28 70 4e 6f 64 65 2d 3e 6a 6e 46 6c  if( (pNode->jnFl
3a80: 61 67 73 20 26 20 4a 4e 4f 44 45 5f 41 50 50 45  ags & JNODE_APPE
3a90: 4e 44 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ND)==0 ) break;.
3aa0: 20 20 20 20 20 20 20 20 70 4e 6f 64 65 20 3d 20          pNode = 
3ab0: 26 70 4e 6f 64 65 5b 70 4e 6f 64 65 2d 3e 75 2e  &pNode[pNode->u.
3ac0: 69 41 70 70 65 6e 64 5d 3b 0a 20 20 20 20 20 20  iAppend];.      
3ad0: 20 20 6a 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d    j = 1;.      }
3ae0: 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e  .      jsonAppen
3af0: 64 43 68 61 72 28 70 4f 75 74 2c 20 27 5d 27 29  dChar(pOut, ']')
3b00: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3b10: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 53     }.    case JS
3b20: 4f 4e 5f 4f 42 4a 45 43 54 3a 20 7b 0a 20 20 20  ON_OBJECT: {.   
3b30: 20 20 20 75 33 32 20 6a 20 3d 20 31 3b 0a 20 20     u32 j = 1;.  
3b40: 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68      jsonAppendCh
3b50: 61 72 28 70 4f 75 74 2c 20 27 7b 27 29 3b 0a 20  ar(pOut, '{');. 
3b60: 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20       for(;;){.  
3b70: 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3c 3d        while( j<=
3b80: 70 4e 6f 64 65 2d 3e 6e 20 29 7b 0a 20 20 20 20  pNode->n ){.    
3b90: 20 20 20 20 20 20 69 66 28 20 28 70 4e 6f 64 65        if( (pNode
3ba0: 5b 6a 2b 31 5d 2e 6a 6e 46 6c 61 67 73 20 26 20  [j+1].jnFlags & 
3bb0: 4a 4e 4f 44 45 5f 52 45 4d 4f 56 45 29 3d 3d 30  JNODE_REMOVE)==0
3bc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
3bd0: 6a 73 6f 6e 41 70 70 65 6e 64 53 65 70 61 72 61  jsonAppendSepara
3be0: 74 6f 72 28 70 4f 75 74 29 3b 0a 20 20 20 20 20  tor(pOut);.     
3bf0: 20 20 20 20 20 20 20 6a 73 6f 6e 52 65 6e 64 65         jsonRende
3c00: 72 4e 6f 64 65 28 26 70 4e 6f 64 65 5b 6a 5d 2c  rNode(&pNode[j],
3c10: 20 70 4f 75 74 2c 20 61 52 65 70 6c 61 63 65 29   pOut, aReplace)
3c20: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 73  ;.            js
3c30: 6f 6e 41 70 70 65 6e 64 43 68 61 72 28 70 4f 75  onAppendChar(pOu
3c40: 74 2c 20 27 3a 27 29 3b 0a 20 20 20 20 20 20 20  t, ':');.       
3c50: 20 20 20 20 20 6a 73 6f 6e 52 65 6e 64 65 72 4e       jsonRenderN
3c60: 6f 64 65 28 26 70 4e 6f 64 65 5b 6a 2b 31 5d 2c  ode(&pNode[j+1],
3c70: 20 70 4f 75 74 2c 20 61 52 65 70 6c 61 63 65 29   pOut, aReplace)
3c80: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
3c90: 20 20 20 20 20 20 20 20 6a 20 2b 3d 20 31 20 2b          j += 1 +
3ca0: 20 6a 73 6f 6e 4e 6f 64 65 53 69 7a 65 28 26 70   jsonNodeSize(&p
3cb0: 4e 6f 64 65 5b 6a 2b 31 5d 29 3b 0a 20 20 20 20  Node[j+1]);.    
3cc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
3cd0: 28 20 28 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67  ( (pNode->jnFlag
3ce0: 73 20 26 20 4a 4e 4f 44 45 5f 41 50 50 45 4e 44  s & JNODE_APPEND
3cf0: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
3d00: 20 20 20 20 20 20 70 4e 6f 64 65 20 3d 20 26 70        pNode = &p
3d10: 4e 6f 64 65 5b 70 4e 6f 64 65 2d 3e 75 2e 69 41  Node[pNode->u.iA
3d20: 70 70 65 6e 64 5d 3b 0a 20 20 20 20 20 20 20 20  ppend];.        
3d30: 6a 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  j = 1;.      }. 
3d40: 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 43       jsonAppendC
3d50: 68 61 72 28 70 4f 75 74 2c 20 27 7d 27 29 3b 0a  har(pOut, '}');.
3d60: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3d70: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
3d80: 52 65 74 75 72 6e 20 61 20 4a 73 6f 6e 4e 6f 64  Return a JsonNod
3d90: 65 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 64 65  e and all its de
3da0: 73 63 65 6e 64 65 6e 74 73 20 61 73 20 61 20 4a  scendents as a J
3db0: 53 4f 4e 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73  SON string..*/.s
3dc0: 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 52  tatic void jsonR
3dd0: 65 74 75 72 6e 4a 73 6f 6e 28 0a 20 20 4a 73 6f  eturnJson(.  Jso
3de0: 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 20 20 20  nNode *pNode,   
3df0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 64 65           /* Node
3e00: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
3e10: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
3e20: 2a 70 43 74 78 2c 20 20 20 20 20 20 2f 2a 20 52  *pCtx,      /* R
3e30: 65 74 75 72 6e 20 76 61 6c 75 65 20 66 6f 72 20  eturn value for 
3e40: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
3e50: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
3e60: 20 2a 2a 61 52 65 70 6c 61 63 65 20 20 20 20 2f   **aReplace    /
3e70: 2a 20 41 72 72 61 79 20 6f 66 20 72 65 70 6c 61  * Array of repla
3e80: 63 65 6d 65 6e 74 20 76 61 6c 75 65 73 20 2a 2f  cement values */
3e90: 0a 29 7b 0a 20 20 4a 73 6f 6e 53 74 72 69 6e 67  .){.  JsonString
3ea0: 20 73 3b 0a 20 20 6a 73 6f 6e 49 6e 69 74 28 26   s;.  jsonInit(&
3eb0: 73 2c 20 70 43 74 78 29 3b 0a 20 20 6a 73 6f 6e  s, pCtx);.  json
3ec0: 52 65 6e 64 65 72 4e 6f 64 65 28 70 4e 6f 64 65  RenderNode(pNode
3ed0: 2c 20 26 73 2c 20 61 52 65 70 6c 61 63 65 29 3b  , &s, aReplace);
3ee0: 0a 20 20 6a 73 6f 6e 52 65 73 75 6c 74 28 26 73  .  jsonResult(&s
3ef0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
3f00: 75 6c 74 5f 73 75 62 74 79 70 65 28 70 43 74 78  ult_subtype(pCtx
3f10: 2c 20 4a 53 4f 4e 5f 53 55 42 54 59 50 45 29 3b  , JSON_SUBTYPE);
3f20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 74  .}../*.** Make t
3f30: 68 65 20 4a 73 6f 6e 4e 6f 64 65 20 74 68 65 20  he JsonNode the 
3f40: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
3f50: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  the function..*/
3f60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f  .static void jso
3f70: 6e 52 65 74 75 72 6e 28 0a 20 20 4a 73 6f 6e 4e  nReturn(.  JsonN
3f80: 6f 64 65 20 2a 70 4e 6f 64 65 2c 20 20 20 20 20  ode *pNode,     
3f90: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 64 65 20 74         /* Node t
3fa0: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71  o return */.  sq
3fb0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
3fc0: 43 74 78 2c 20 20 20 20 20 20 2f 2a 20 52 65 74  Ctx,      /* Ret
3fd0: 75 72 6e 20 76 61 6c 75 65 20 66 6f 72 20 74 68  urn value for th
3fe0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
3ff0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
4000: 2a 61 52 65 70 6c 61 63 65 20 20 20 20 2f 2a 20  *aReplace    /* 
4010: 41 72 72 61 79 20 6f 66 20 72 65 70 6c 61 63 65  Array of replace
4020: 6d 65 6e 74 20 76 61 6c 75 65 73 20 2a 2f 0a 29  ment values */.)
4030: 7b 0a 20 20 73 77 69 74 63 68 28 20 70 4e 6f 64  {.  switch( pNod
4040: 65 2d 3e 65 54 79 70 65 20 29 7b 0a 20 20 20 20  e->eType ){.    
4050: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
4060: 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e   assert( pNode->
4070: 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f 4e 55 4c 4c  eType==JSON_NULL
4080: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
4090: 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 28 70 43  3_result_null(pC
40a0: 74 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  tx);.      break
40b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
40c0: 20 4a 53 4f 4e 5f 54 52 55 45 3a 20 7b 0a 20 20   JSON_TRUE: {.  
40d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
40e0: 6c 74 5f 69 6e 74 28 70 43 74 78 2c 20 31 29 3b  lt_int(pCtx, 1);
40f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4100: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 53 4f    }.    case JSO
4110: 4e 5f 46 41 4c 53 45 3a 20 7b 0a 20 20 20 20 20  N_FALSE: {.     
4120: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
4130: 69 6e 74 28 70 43 74 78 2c 20 30 29 3b 0a 20 20  int(pCtx, 0);.  
4140: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4150: 0a 20 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f 49  .    case JSON_I
4160: 4e 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  NT: {.      sqli
4170: 74 65 33 5f 69 6e 74 36 34 20 69 20 3d 20 30 3b  te3_int64 i = 0;
4180: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
4190: 72 20 2a 7a 20 3d 20 70 4e 6f 64 65 2d 3e 75 2e  r *z = pNode->u.
41a0: 7a 4a 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20  zJContent;.     
41b0: 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29   if( z[0]=='-' )
41c0: 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 77  { z++; }.      w
41d0: 68 69 6c 65 28 20 7a 5b 30 5d 3e 3d 27 30 27 20  hile( z[0]>='0' 
41e0: 26 26 20 7a 5b 30 5d 3c 3d 27 39 27 20 29 7b 0a  && z[0]<='9' ){.
41f0: 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64          unsigned
4200: 20 76 20 3d 20 2a 28 7a 2b 2b 29 20 2d 20 27 30   v = *(z++) - '0
4210: 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ';.        if( i
4220: 3e 3d 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 2f  >=LARGEST_INT64/
4230: 31 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  10 ){.          
4240: 69 66 28 20 69 3e 4c 41 52 47 45 53 54 5f 49 4e  if( i>LARGEST_IN
4250: 54 36 34 2f 31 30 20 29 20 67 6f 74 6f 20 69 6e  T64/10 ) goto in
4260: 74 5f 61 73 5f 72 65 61 6c 3b 0a 20 20 20 20 20  t_as_real;.     
4270: 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3e 3d 27       if( z[0]>='
4280: 30 27 20 26 26 20 7a 5b 30 5d 3c 3d 27 39 27 20  0' && z[0]<='9' 
4290: 29 20 67 6f 74 6f 20 69 6e 74 5f 61 73 5f 72 65  ) goto int_as_re
42a0: 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  al;.          if
42b0: 28 20 76 3d 3d 39 20 29 20 67 6f 74 6f 20 69 6e  ( v==9 ) goto in
42c0: 74 5f 61 73 5f 72 65 61 6c 3b 0a 20 20 20 20 20  t_as_real;.     
42d0: 20 20 20 20 20 69 66 28 20 76 3d 3d 38 20 29 7b       if( v==8 ){
42e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
42f0: 20 70 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74   pNode->u.zJCont
4300: 65 6e 74 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20  ent[0]=='-' ){. 
4310: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
4320: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
4330: 34 28 70 43 74 78 2c 20 53 4d 41 4c 4c 45 53 54  4(pCtx, SMALLEST
4340: 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 20 20 20  _INT64);.       
4350: 20 20 20 20 20 20 20 67 6f 74 6f 20 69 6e 74 5f         goto int_
4360: 64 6f 6e 65 3b 0a 20 20 20 20 20 20 20 20 20 20  done;.          
4370: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
4380: 20 20 20 20 20 20 20 67 6f 74 6f 20 69 6e 74 5f         goto int_
4390: 61 73 5f 72 65 61 6c 3b 0a 20 20 20 20 20 20 20  as_real;.       
43a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
43b0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
43c0: 20 20 20 20 20 69 20 3d 20 69 2a 31 30 20 2b 20       i = i*10 + 
43d0: 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  v;.      }.     
43e0: 20 69 66 28 20 70 4e 6f 64 65 2d 3e 75 2e 7a 4a   if( pNode->u.zJ
43f0: 43 6f 6e 74 65 6e 74 5b 30 5d 3d 3d 27 2d 27 20  Content[0]=='-' 
4400: 29 7b 20 69 20 3d 20 2d 69 3b 20 7d 0a 20 20 20  ){ i = -i; }.   
4410: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
4420: 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 69 29  t_int64(pCtx, i)
4430: 3b 0a 20 20 20 20 20 20 69 6e 74 5f 64 6f 6e 65  ;.      int_done
4440: 3a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  :.      break;. 
4450: 20 20 20 20 20 69 6e 74 5f 61 73 5f 72 65 61 6c       int_as_real
4460: 3a 20 2f 2a 20 66 61 6c 6c 20 74 68 72 6f 75 67  : /* fall throug
4470: 68 20 74 6f 20 72 65 61 6c 20 2a 2f 3b 0a 20 20  h to real */;.  
4480: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 53 4f    }.    case JSO
4490: 4e 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20  N_REAL: {.      
44a0: 64 6f 75 62 6c 65 20 72 3b 0a 23 69 66 64 65 66  double r;.#ifdef
44b0: 20 53 51 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41   SQLITE_AMALGAMA
44c0: 54 49 4f 4e 0a 20 20 20 20 20 20 63 6f 6e 73 74  TION.      const
44d0: 20 63 68 61 72 20 2a 7a 20 3d 20 70 4e 6f 64 65   char *z = pNode
44e0: 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 3b 0a 20  ->u.zJContent;. 
44f0: 20 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f 46       sqlite3AtoF
4500: 28 7a 2c 20 26 72 2c 20 73 71 6c 69 74 65 33 53  (z, &r, sqlite3S
4510: 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51 4c 49  trlen30(z), SQLI
4520: 54 45 5f 55 54 46 38 29 3b 0a 23 65 6c 73 65 0a  TE_UTF8);.#else.
4530: 20 20 20 20 20 20 72 20 3d 20 73 74 72 74 6f 64        r = strtod
4540: 28 70 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74  (pNode->u.zJCont
4550: 65 6e 74 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  ent, 0);.#endif.
4560: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
4570: 73 75 6c 74 5f 64 6f 75 62 6c 65 28 70 43 74 78  sult_double(pCtx
4580: 2c 20 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , r);.      brea
4590: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
45a0: 65 20 4a 53 4f 4e 5f 53 54 52 49 4e 47 3a 20 7b  e JSON_STRING: {
45b0: 0a 23 69 66 20 30 20 2f 2a 20 4e 65 76 65 72 20  .#if 0 /* Never 
45c0: 68 61 70 70 65 6e 73 20 62 65 63 61 75 73 65 20  happens because 
45d0: 4a 4e 4f 44 45 5f 52 41 57 20 69 73 20 6f 6e 6c  JNODE_RAW is onl
45e0: 79 20 73 65 74 20 62 79 20 6a 73 6f 6e 5f 73 65  y set by json_se
45f0: 74 28 29 2c 0a 20 20 20 20 20 20 2a 2a 20 6a 73  t(),.      ** js
4600: 6f 6e 5f 69 6e 73 65 72 74 28 29 20 61 6e 64 20  on_insert() and 
4610: 6a 73 6f 6e 5f 72 65 70 6c 61 63 65 28 29 20 61  json_replace() a
4620: 6e 64 20 74 68 6f 73 65 20 72 6f 75 74 69 6e 65  nd those routine
4630: 73 20 64 6f 20 6e 6f 74 0a 20 20 20 20 20 20 2a  s do not.      *
4640: 2a 20 63 61 6c 6c 20 6a 73 6f 6e 52 65 74 75 72  * call jsonRetur
4650: 6e 28 29 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  n() */.      if(
4660: 20 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73 20   pNode->jnFlags 
4670: 26 20 4a 4e 4f 44 45 5f 52 41 57 20 29 7b 0a 20  & JNODE_RAW ){. 
4680: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
4690: 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c  esult_text(pCtx,
46a0: 20 70 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74   pNode->u.zJCont
46b0: 65 6e 74 2c 20 70 4e 6f 64 65 2d 3e 6e 2c 0a 20  ent, pNode->n,. 
46c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46d0: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
46e0: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
46f0: 20 20 20 20 7d 65 6c 73 65 20 0a 23 65 6e 64 69      }else .#endi
4700: 66 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  f.      assert( 
4710: 28 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73 20  (pNode->jnFlags 
4720: 26 20 4a 4e 4f 44 45 5f 52 41 57 29 3d 3d 30 20  & JNODE_RAW)==0 
4730: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4e  );.      if( (pN
4740: 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73 20 26 20 4a  ode->jnFlags & J
4750: 4e 4f 44 45 5f 45 53 43 41 50 45 29 3d 3d 30 20  NODE_ESCAPE)==0 
4760: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4a 53  ){.        /* JS
4770: 4f 4e 20 66 6f 72 6d 61 74 74 65 64 20 77 69 74  ON formatted wit
4780: 68 6f 75 74 20 61 6e 79 20 62 61 63 6b 73 6c 61  hout any backsla
4790: 73 68 2d 65 73 63 61 70 65 73 20 2a 2f 0a 20 20  sh-escapes */.  
47a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
47b0: 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20  sult_text(pCtx, 
47c0: 70 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74 65  pNode->u.zJConte
47d0: 6e 74 2b 31 2c 20 70 4e 6f 64 65 2d 3e 6e 2d 32  nt+1, pNode->n-2
47e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
47f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
4800: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
4810: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
4820: 20 20 20 20 20 20 2f 2a 20 54 72 61 6e 73 6c 61        /* Transla
4830: 74 65 20 4a 53 4f 4e 20 66 6f 72 6d 61 74 74 65  te JSON formatte
4840: 64 20 73 74 72 69 6e 67 20 69 6e 74 6f 20 72 61  d string into ra
4850: 77 20 74 65 78 74 20 2a 2f 0a 20 20 20 20 20 20  w text */.      
4860: 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20    u32 i;.       
4870: 20 75 33 32 20 6e 20 3d 20 70 4e 6f 64 65 2d 3e   u32 n = pNode->
4880: 6e 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  n;.        const
4890: 20 63 68 61 72 20 2a 7a 20 3d 20 70 4e 6f 64 65   char *z = pNode
48a0: 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 3b 0a 20  ->u.zJContent;. 
48b0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4f 75         char *zOu
48c0: 74 3b 0a 20 20 20 20 20 20 20 20 75 33 32 20 6a  t;.        u32 j
48d0: 3b 0a 20 20 20 20 20 20 20 20 7a 4f 75 74 20 3d  ;.        zOut =
48e0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
48f0: 20 6e 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20   n+1 );.        
4900: 69 66 28 20 7a 4f 75 74 3d 3d 30 20 29 7b 0a 20  if( zOut==0 ){. 
4910: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
4920: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
4930: 6d 65 6d 28 70 43 74 78 29 3b 0a 20 20 20 20 20  mem(pCtx);.     
4940: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4950: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f      }.        fo
4960: 72 28 69 3d 31 2c 20 6a 3d 30 3b 20 69 3c 6e 2d  r(i=1, j=0; i<n-
4970: 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  1; i++){.       
4980: 20 20 20 63 68 61 72 20 63 20 3d 20 7a 5b 69 5d     char c = z[i]
4990: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
49a0: 63 21 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20  c!='\\' ){.     
49b0: 20 20 20 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d         zOut[j++]
49c0: 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20 20   = c;.          
49d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
49e0: 20 20 20 63 20 3d 20 7a 5b 2b 2b 69 5d 3b 0a 20     c = z[++i];. 
49f0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63             if( c
4a00: 3d 3d 27 75 27 20 29 7b 0a 20 20 20 20 20 20 20  =='u' ){.       
4a10: 20 20 20 20 20 20 20 75 33 32 20 76 20 3d 20 30         u32 v = 0
4a20: 2c 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  , k;.           
4a30: 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 34 3b     for(k=0; k<4;
4a40: 20 69 2b 2b 2c 20 6b 2b 2b 29 7b 0a 20 20 20 20   i++, k++){.    
4a50: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
4a60: 72 74 28 20 69 3c 6e 2d 32 20 29 3b 0a 20 20 20  rt( i<n-2 );.   
4a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 20 3d               c =
4a80: 20 7a 5b 69 2b 31 5d 3b 0a 20 20 20 20 20 20 20   z[i+1];.       
4a90: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
4aa0: 20 73 61 66 65 5f 69 73 78 64 69 67 69 74 28 63   safe_isxdigit(c
4ab0: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
4ac0: 20 20 20 20 20 69 66 28 20 63 3c 3d 27 39 27 20       if( c<='9' 
4ad0: 29 20 76 20 3d 20 76 2a 31 36 20 2b 20 63 20 2d  ) v = v*16 + c -
4ae0: 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20   '0';.          
4af0: 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 63        else if( c
4b00: 3c 3d 27 46 27 20 29 20 76 20 3d 20 76 2a 31 36  <='F' ) v = v*16
4b10: 20 2b 20 63 20 2d 20 27 41 27 20 2b 20 31 30 3b   + c - 'A' + 10;
4b20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4b30: 20 65 6c 73 65 20 76 20 3d 20 76 2a 31 36 20 2b   else v = v*16 +
4b40: 20 63 20 2d 20 27 61 27 20 2b 20 31 30 3b 0a 20   c - 'a' + 10;. 
4b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
4b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
4b70: 20 76 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20   v==0 ) break;. 
4b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
4b90: 20 76 3c 3d 30 78 37 66 20 29 7b 0a 20 20 20 20   v<=0x7f ){.    
4ba0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4f 75 74              zOut
4bb0: 5b 6a 2b 2b 5d 20 3d 20 28 63 68 61 72 29 76 3b  [j++] = (char)v;
4bc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
4bd0: 65 6c 73 65 20 69 66 28 20 76 3c 3d 30 78 37 66  else if( v<=0x7f
4be0: 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  f ){.           
4bf0: 20 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d       zOut[j++] =
4c00: 20 28 63 68 61 72 29 28 30 78 63 30 20 7c 20 28   (char)(0xc0 | (
4c10: 76 3e 3e 36 29 29 3b 0a 20 20 20 20 20 20 20 20  v>>6));.        
4c20: 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b          zOut[j++
4c30: 5d 20 3d 20 30 78 38 30 20 7c 20 28 76 26 30 78  ] = 0x80 | (v&0x
4c40: 33 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  3f);.           
4c50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4c60: 20 20 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 6a            zOut[j
4c70: 2b 2b 5d 20 3d 20 28 63 68 61 72 29 28 30 78 65  ++] = (char)(0xe
4c80: 30 20 7c 20 28 76 3e 3e 31 32 29 29 3b 0a 20 20  0 | (v>>12));.  
4c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4f                zO
4ca0: 75 74 5b 6a 2b 2b 5d 20 3d 20 30 78 38 30 20 7c  ut[j++] = 0x80 |
4cb0: 20 28 28 76 3e 3e 36 29 26 30 78 33 66 29 3b 0a   ((v>>6)&0x3f);.
4cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cd0: 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 30 78 38 30  zOut[j++] = 0x80
4ce0: 20 7c 20 28 76 26 30 78 33 66 29 3b 0a 20 20 20   | (v&0x3f);.   
4cf0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
4d00: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
4d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
4d20: 28 20 63 3d 3d 27 62 27 20 29 7b 0a 20 20 20 20  ( c=='b' ){.    
4d30: 20 20 20 20 20 20 20 20 20 20 20 20 63 20 3d 20              c = 
4d40: 27 5c 62 27 3b 0a 20 20 20 20 20 20 20 20 20 20  '\b';.          
4d50: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
4d60: 3d 27 66 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='f' ){.        
4d70: 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 66 27          c = '\f'
4d80: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
4d90: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 6e 27  }else if( c=='n'
4da0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
4db0: 20 20 20 20 63 20 3d 20 27 5c 6e 27 3b 0a 20 20      c = '\n';.  
4dc0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
4dd0: 65 20 69 66 28 20 63 3d 3d 27 72 27 20 29 7b 0a  e if( c=='r' ){.
4de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4df0: 63 20 3d 20 27 5c 72 27 3b 0a 20 20 20 20 20 20  c = '\r';.      
4e00: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
4e10: 28 20 63 3d 3d 27 74 27 20 29 7b 0a 20 20 20 20  ( c=='t' ){.    
4e20: 20 20 20 20 20 20 20 20 20 20 20 20 63 20 3d 20              c = 
4e30: 27 5c 74 27 3b 0a 20 20 20 20 20 20 20 20 20 20  '\t';.          
4e40: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
4e50: 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20      zOut[j++] = 
4e60: 63 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  c;.            }
4e70: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
4e80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
4e90: 4f 75 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20  Out[j] = 0;.    
4ea0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
4eb0: 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20 7a 4f  lt_text(pCtx, zO
4ec0: 75 74 2c 20 6a 2c 20 73 71 6c 69 74 65 33 5f 66  ut, j, sqlite3_f
4ed0: 72 65 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ree);.      }.  
4ee0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4ef0: 0a 20 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f 41  .    case JSON_A
4f00: 52 52 41 59 3a 0a 20 20 20 20 63 61 73 65 20 4a  RRAY:.    case J
4f10: 53 4f 4e 5f 4f 42 4a 45 43 54 3a 20 7b 0a 20 20  SON_OBJECT: {.  
4f20: 20 20 20 20 6a 73 6f 6e 52 65 74 75 72 6e 4a 73      jsonReturnJs
4f30: 6f 6e 28 70 4e 6f 64 65 2c 20 70 43 74 78 2c 20  on(pNode, pCtx, 
4f40: 61 52 65 70 6c 61 63 65 29 3b 0a 20 20 20 20 20  aReplace);.     
4f50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4f60: 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  }.}../* Forward 
4f70: 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61  reference */.sta
4f80: 74 69 63 20 69 6e 74 20 6a 73 6f 6e 50 61 72 73  tic int jsonPars
4f90: 65 41 64 64 4e 6f 64 65 28 4a 73 6f 6e 50 61 72  eAddNode(JsonPar
4fa0: 73 65 2a 2c 75 33 32 2c 75 33 32 2c 63 6f 6e 73  se*,u32,u32,cons
4fb0: 74 20 63 68 61 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  t char*);../*.**
4fc0: 20 41 20 6d 61 63 72 6f 20 74 6f 20 68 69 6e 74   A macro to hint
4fd0: 20 74 6f 20 74 68 65 20 63 6f 6d 70 69 6c 65 72   to the compiler
4fe0: 20 74 68 61 74 20 61 20 66 75 6e 63 74 69 6f 6e   that a function
4ff0: 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 0a 2a   should not be.*
5000: 2a 20 69 6e 6c 69 6e 65 64 2e 0a 2a 2f 0a 23 69  * inlined..*/.#i
5010: 66 20 64 65 66 69 6e 65 64 28 5f 5f 47 4e 55 43  f defined(__GNUC
5020: 5f 5f 29 0a 23 20 20 64 65 66 69 6e 65 20 4a 53  __).#  define JS
5030: 4f 4e 5f 4e 4f 49 4e 4c 49 4e 45 20 20 5f 5f 61  ON_NOINLINE  __a
5040: 74 74 72 69 62 75 74 65 5f 5f 28 28 6e 6f 69 6e  ttribute__((noin
5050: 6c 69 6e 65 29 29 0a 23 65 6c 69 66 20 64 65 66  line)).#elif def
5060: 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29 20 26  ined(_MSC_VER) &
5070: 26 20 5f 4d 53 43 5f 56 45 52 3e 3d 31 33 31 30  & _MSC_VER>=1310
5080: 0a 23 20 20 64 65 66 69 6e 65 20 4a 53 4f 4e 5f  .#  define JSON_
5090: 4e 4f 49 4e 4c 49 4e 45 20 20 5f 5f 64 65 63 6c  NOINLINE  __decl
50a0: 73 70 65 63 28 6e 6f 69 6e 6c 69 6e 65 29 0a 23  spec(noinline).#
50b0: 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 4a  else.#  define J
50c0: 53 4f 4e 5f 4e 4f 49 4e 4c 49 4e 45 0a 23 65 6e  SON_NOINLINE.#en
50d0: 64 69 66 0a 0a 0a 73 74 61 74 69 63 20 4a 53 4f  dif...static JSO
50e0: 4e 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 6a  N_NOINLINE int j
50f0: 73 6f 6e 50 61 72 73 65 41 64 64 4e 6f 64 65 45  sonParseAddNodeE
5100: 78 70 61 6e 64 28 0a 20 20 4a 73 6f 6e 50 61 72  xpand(.  JsonPar
5110: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
5120: 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65     /* Append the
5130: 20 6e 6f 64 65 20 74 6f 20 74 68 69 73 20 6f 62   node to this ob
5140: 6a 65 63 74 20 2a 2f 0a 20 20 75 33 32 20 65 54  ject */.  u32 eT
5150: 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
5160: 20 20 20 20 2f 2a 20 4e 6f 64 65 20 74 79 70 65      /* Node type
5170: 20 2a 2f 0a 20 20 75 33 32 20 6e 2c 20 20 20 20   */.  u32 n,    
5180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5190: 2f 2a 20 43 6f 6e 74 65 6e 74 20 73 69 7a 65 20  /* Content size 
51a0: 6f 72 20 73 75 62 2d 6e 6f 64 65 20 63 6f 75 6e  or sub-node coun
51b0: 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
51c0: 72 20 2a 7a 43 6f 6e 74 65 6e 74 20 20 20 20 20  r *zContent     
51d0: 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 2a 2f 0a 29   /* Content */.)
51e0: 7b 0a 20 20 75 33 32 20 6e 4e 65 77 3b 0a 20 20  {.  u32 nNew;.  
51f0: 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e 65 77 3b 0a  JsonNode *pNew;.
5200: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
5210: 2d 3e 6e 4e 6f 64 65 3e 3d 70 50 61 72 73 65 2d  ->nNode>=pParse-
5220: 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 20 20 69 66 28  >nAlloc );.  if(
5230: 20 70 50 61 72 73 65 2d 3e 6f 6f 6d 20 29 20 72   pParse->oom ) r
5240: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 6e 4e 65 77  eturn -1;.  nNew
5250: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 41 6c 6c 6f   = pParse->nAllo
5260: 63 2a 32 20 2b 20 31 30 3b 0a 20 20 70 4e 65 77  c*2 + 10;.  pNew
5270: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   = sqlite3_reall
5280: 6f 63 28 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65  oc(pParse->aNode
5290: 2c 20 73 69 7a 65 6f 66 28 4a 73 6f 6e 4e 6f 64  , sizeof(JsonNod
52a0: 65 29 2a 6e 4e 65 77 29 3b 0a 20 20 69 66 28 20  e)*nNew);.  if( 
52b0: 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 70  pNew==0 ){.    p
52c0: 50 61 72 73 65 2d 3e 6f 6f 6d 20 3d 20 31 3b 0a  Parse->oom = 1;.
52d0: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
52e0: 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 41 6c   }.  pParse->nAl
52f0: 6c 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20 20 70 50  loc = nNew;.  pP
5300: 61 72 73 65 2d 3e 61 4e 6f 64 65 20 3d 20 70 4e  arse->aNode = pN
5310: 65 77 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ew;.  assert( pP
5320: 61 72 73 65 2d 3e 6e 4e 6f 64 65 3c 70 50 61 72  arse->nNode<pPar
5330: 73 65 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 20 20  se->nAlloc );.  
5340: 72 65 74 75 72 6e 20 6a 73 6f 6e 50 61 72 73 65  return jsonParse
5350: 41 64 64 4e 6f 64 65 28 70 50 61 72 73 65 2c 20  AddNode(pParse, 
5360: 65 54 79 70 65 2c 20 6e 2c 20 7a 43 6f 6e 74 65  eType, n, zConte
5370: 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  nt);.}../*.** Cr
5380: 65 61 74 65 20 61 20 6e 65 77 20 4a 73 6f 6e 4e  eate a new JsonN
5390: 6f 64 65 20 69 6e 73 74 61 6e 63 65 20 62 61 73  ode instance bas
53a0: 65 64 20 6f 6e 20 74 68 65 20 61 72 67 75 6d 65  ed on the argume
53b0: 6e 74 73 20 61 6e 64 20 61 70 70 65 6e 64 20 74  nts and append t
53c0: 68 61 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20  hat.** instance 
53d0: 74 6f 20 74 68 65 20 4a 73 6f 6e 50 61 72 73 65  to the JsonParse
53e0: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  .  Return the in
53f0: 64 65 78 20 69 6e 20 70 50 61 72 73 65 2d 3e 61  dex in pParse->a
5400: 4e 6f 64 65 5b 5d 20 6f 66 20 74 68 65 0a 2a 2a  Node[] of the.**
5410: 20 6e 65 77 20 6e 6f 64 65 2c 20 6f 72 20 2d 31   new node, or -1
5420: 20 69 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   if a memory all
5430: 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2e 0a 2a  ocation fails..*
5440: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 73 6f  /.static int jso
5450: 6e 50 61 72 73 65 41 64 64 4e 6f 64 65 28 0a 20  nParseAddNode(. 
5460: 20 4a 73 6f 6e 50 61 72 73 65 20 2a 70 50 61 72   JsonParse *pPar
5470: 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 41 70  se,        /* Ap
5480: 70 65 6e 64 20 74 68 65 20 6e 6f 64 65 20 74 6f  pend the node to
5490: 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a   this object */.
54a0: 20 20 75 33 32 20 65 54 79 70 65 2c 20 20 20 20    u32 eType,    
54b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
54c0: 6f 64 65 20 74 79 70 65 20 2a 2f 0a 20 20 75 33  ode type */.  u3
54d0: 32 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  2 n,            
54e0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
54f0: 6e 74 20 73 69 7a 65 20 6f 72 20 73 75 62 2d 6e  nt size or sub-n
5500: 6f 64 65 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 63  ode count */.  c
5510: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6e 74  onst char *zCont
5520: 65 6e 74 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74  ent      /* Cont
5530: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 4a 73 6f 6e  ent */.){.  Json
5540: 4e 6f 64 65 20 2a 70 3b 0a 20 20 69 66 28 20 70  Node *p;.  if( p
5550: 50 61 72 73 65 2d 3e 6e 4e 6f 64 65 3e 3d 70 50  Parse->nNode>=pP
5560: 61 72 73 65 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a  arse->nAlloc ){.
5570: 20 20 20 20 72 65 74 75 72 6e 20 6a 73 6f 6e 50      return jsonP
5580: 61 72 73 65 41 64 64 4e 6f 64 65 45 78 70 61 6e  arseAddNodeExpan
5590: 64 28 70 50 61 72 73 65 2c 20 65 54 79 70 65 2c  d(pParse, eType,
55a0: 20 6e 2c 20 7a 43 6f 6e 74 65 6e 74 29 3b 0a 20   n, zContent);. 
55b0: 20 7d 0a 20 20 70 20 3d 20 26 70 50 61 72 73 65   }.  p = &pParse
55c0: 2d 3e 61 4e 6f 64 65 5b 70 50 61 72 73 65 2d 3e  ->aNode[pParse->
55d0: 6e 4e 6f 64 65 5d 3b 0a 20 20 70 2d 3e 65 54 79  nNode];.  p->eTy
55e0: 70 65 20 3d 20 28 75 38 29 65 54 79 70 65 3b 0a  pe = (u8)eType;.
55f0: 20 20 70 2d 3e 6a 6e 46 6c 61 67 73 20 3d 20 30    p->jnFlags = 0
5600: 3b 0a 20 20 70 2d 3e 6e 20 3d 20 6e 3b 0a 20 20  ;.  p->n = n;.  
5610: 70 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 20 3d  p->u.zJContent =
5620: 20 7a 43 6f 6e 74 65 6e 74 3b 0a 20 20 72 65 74   zContent;.  ret
5630: 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 4e 6f 64  urn pParse->nNod
5640: 65 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  e++;.}../*.** Re
5650: 74 75 72 6e 20 74 72 75 65 20 69 66 20 7a 5b 5d  turn true if z[]
5660: 20 62 65 67 69 6e 73 20 77 69 74 68 20 34 20 28   begins with 4 (
5670: 6f 72 20 6d 6f 72 65 29 20 68 65 78 61 64 65 63  or more) hexadec
5680: 69 6d 61 6c 20 64 69 67 69 74 73 0a 2a 2f 0a 73  imal digits.*/.s
5690: 74 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e 49 73  tatic int jsonIs
56a0: 34 48 65 78 28 63 6f 6e 73 74 20 63 68 61 72 20  4Hex(const char 
56b0: 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *z){.  int i;.  
56c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 34 3b 20 69 2b  for(i=0; i<4; i+
56d0: 2b 29 20 69 66 28 20 21 73 61 66 65 5f 69 73 78  +) if( !safe_isx
56e0: 64 69 67 69 74 28 7a 5b 69 5d 29 20 29 20 72 65  digit(z[i]) ) re
56f0: 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e  turn 0;.  return
5700: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72   1;.}../*.** Par
5710: 73 65 20 61 20 73 69 6e 67 6c 65 20 4a 53 4f 4e  se a single JSON
5720: 20 76 61 6c 75 65 20 77 68 69 63 68 20 62 65 67   value which beg
5730: 69 6e 73 20 61 74 20 70 50 61 72 73 65 2d 3e 7a  ins at pParse->z
5740: 4a 73 6f 6e 5b 69 5d 2e 20 20 52 65 74 75 72 6e  Json[i].  Return
5750: 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66   the.** index of
5760: 20 74 68 65 20 66 69 72 73 74 20 63 68 61 72 61   the first chara
5770: 63 74 65 72 20 70 61 73 74 20 74 68 65 20 65 6e  cter past the en
5780: 64 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 70  d of the value p
5790: 61 72 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  arsed..**.** Ret
57a0: 75 72 6e 20 6e 65 67 61 74 69 76 65 20 66 6f 72  urn negative for
57b0: 20 61 20 73 79 6e 74 61 78 20 65 72 72 6f 72 2e   a syntax error.
57c0: 20 20 53 70 65 63 69 61 6c 20 63 61 73 65 73 3a    Special cases:
57d0: 20 20 72 65 74 75 72 6e 20 2d 32 20 69 66 20 74    return -2 if t
57e0: 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 6f 6e 2d  he.** first non-
57f0: 77 68 69 74 65 73 70 61 63 65 20 63 68 61 72 61  whitespace chara
5800: 63 74 65 72 20 69 73 20 27 7d 27 20 61 6e 64 20  cter is '}' and 
5810: 72 65 74 75 72 6e 20 2d 33 20 69 66 20 74 68 65  return -3 if the
5820: 20 66 69 72 73 74 0a 2a 2a 20 6e 6f 6e 2d 77 68   first.** non-wh
5830: 69 74 65 73 70 61 63 65 20 63 68 61 72 61 63 74  itespace charact
5840: 65 72 20 69 73 20 27 5d 27 2e 0a 2a 2f 0a 73 74  er is ']'..*/.st
5850: 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e 50 61 72  atic int jsonPar
5860: 73 65 56 61 6c 75 65 28 4a 73 6f 6e 50 61 72 73  seValue(JsonPars
5870: 65 20 2a 70 50 61 72 73 65 2c 20 75 33 32 20 69  e *pParse, u32 i
5880: 29 7b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 75  ){.  char c;.  u
5890: 33 32 20 6a 3b 0a 20 20 69 6e 74 20 69 54 68 69  32 j;.  int iThi
58a0: 73 3b 0a 20 20 69 6e 74 20 78 3b 0a 20 20 4a 73  s;.  int x;.  Js
58b0: 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 3b 0a 20  onNode *pNode;. 
58c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
58d0: 20 70 50 61 72 73 65 2d 3e 7a 4a 73 6f 6e 3b 0a   pParse->zJson;.
58e0: 20 20 77 68 69 6c 65 28 20 73 61 66 65 5f 69 73    while( safe_is
58f0: 73 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b 20 69  space(z[i]) ){ i
5900: 2b 2b 3b 20 7d 0a 20 20 69 66 28 20 28 63 20 3d  ++; }.  if( (c =
5910: 20 7a 5b 69 5d 29 3d 3d 27 7b 27 20 29 7b 0a 20   z[i])=='{' ){. 
5920: 20 20 20 2f 2a 20 50 61 72 73 65 20 6f 62 6a 65     /* Parse obje
5930: 63 74 20 2a 2f 0a 20 20 20 20 69 54 68 69 73 20  ct */.    iThis 
5940: 3d 20 6a 73 6f 6e 50 61 72 73 65 41 64 64 4e 6f  = jsonParseAddNo
5950: 64 65 28 70 50 61 72 73 65 2c 20 4a 53 4f 4e 5f  de(pParse, JSON_
5960: 4f 42 4a 45 43 54 2c 20 30 2c 20 30 29 3b 0a 20  OBJECT, 0, 0);. 
5970: 20 20 20 69 66 28 20 69 54 68 69 73 3c 30 20 29     if( iThis<0 )
5980: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
5990: 66 6f 72 28 6a 3d 69 2b 31 3b 3b 6a 2b 2b 29 7b  for(j=i+1;;j++){
59a0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 73 61  .      while( sa
59b0: 66 65 5f 69 73 73 70 61 63 65 28 7a 5b 6a 5d 29  fe_isspace(z[j])
59c0: 20 29 7b 20 6a 2b 2b 3b 20 7d 0a 20 20 20 20 20   ){ j++; }.     
59d0: 20 69 66 28 20 2b 2b 70 50 61 72 73 65 2d 3e 69   if( ++pParse->i
59e0: 44 65 70 74 68 20 3e 20 4a 53 4f 4e 5f 4d 41 58  Depth > JSON_MAX
59f0: 5f 44 45 50 54 48 20 29 20 72 65 74 75 72 6e 20  _DEPTH ) return 
5a00: 2d 31 3b 0a 20 20 20 20 20 20 78 20 3d 20 6a 73  -1;.      x = js
5a10: 6f 6e 50 61 72 73 65 56 61 6c 75 65 28 70 50 61  onParseValue(pPa
5a20: 72 73 65 2c 20 6a 29 3b 0a 20 20 20 20 20 20 69  rse, j);.      i
5a30: 66 28 20 78 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( x<0 ){.      
5a40: 20 20 70 50 61 72 73 65 2d 3e 69 44 65 70 74 68    pParse->iDepth
5a50: 2d 2d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  --;.        if( 
5a60: 78 3d 3d 28 2d 32 29 20 26 26 20 70 50 61 72 73  x==(-2) && pPars
5a70: 65 2d 3e 6e 4e 6f 64 65 3d 3d 28 75 33 32 29 69  e->nNode==(u32)i
5a80: 54 68 69 73 2b 31 20 29 20 72 65 74 75 72 6e 20  This+1 ) return 
5a90: 6a 2b 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74  j+1;.        ret
5aa0: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  urn -1;.      }.
5ab0: 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
5ac0: 2d 3e 6f 6f 6d 20 29 20 72 65 74 75 72 6e 20 2d  ->oom ) return -
5ad0: 31 3b 0a 20 20 20 20 20 20 70 4e 6f 64 65 20 3d  1;.      pNode =
5ae0: 20 26 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65 5b   &pParse->aNode[
5af0: 70 50 61 72 73 65 2d 3e 6e 4e 6f 64 65 2d 31 5d  pParse->nNode-1]
5b00: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 6f 64  ;.      if( pNod
5b10: 65 2d 3e 65 54 79 70 65 21 3d 4a 53 4f 4e 5f 53  e->eType!=JSON_S
5b20: 54 52 49 4e 47 20 29 20 72 65 74 75 72 6e 20 2d  TRING ) return -
5b30: 31 3b 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e  1;.      pNode->
5b40: 6a 6e 46 6c 61 67 73 20 7c 3d 20 4a 4e 4f 44 45  jnFlags |= JNODE
5b50: 5f 4c 41 42 45 4c 3b 0a 20 20 20 20 20 20 6a 20  _LABEL;.      j 
5b60: 3d 20 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  = x;.      while
5b70: 28 20 73 61 66 65 5f 69 73 73 70 61 63 65 28 7a  ( safe_isspace(z
5b80: 5b 6a 5d 29 20 29 7b 20 6a 2b 2b 3b 20 7d 0a 20  [j]) ){ j++; }. 
5b90: 20 20 20 20 20 69 66 28 20 7a 5b 6a 5d 21 3d 27       if( z[j]!='
5ba0: 3a 27 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  :' ) return -1;.
5bb0: 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
5bc0: 20 78 20 3d 20 6a 73 6f 6e 50 61 72 73 65 56 61   x = jsonParseVa
5bd0: 6c 75 65 28 70 50 61 72 73 65 2c 20 6a 29 3b 0a  lue(pParse, j);.
5be0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 69 44        pParse->iD
5bf0: 65 70 74 68 2d 2d 3b 0a 20 20 20 20 20 20 69 66  epth--;.      if
5c00: 28 20 78 3c 30 20 29 20 72 65 74 75 72 6e 20 2d  ( x<0 ) return -
5c10: 31 3b 0a 20 20 20 20 20 20 6a 20 3d 20 78 3b 0a  1;.      j = x;.
5c20: 20 20 20 20 20 20 77 68 69 6c 65 28 20 73 61 66        while( saf
5c30: 65 5f 69 73 73 70 61 63 65 28 7a 5b 6a 5d 29 20  e_isspace(z[j]) 
5c40: 29 7b 20 6a 2b 2b 3b 20 7d 0a 20 20 20 20 20 20  ){ j++; }.      
5c50: 63 20 3d 20 7a 5b 6a 5d 3b 0a 20 20 20 20 20 20  c = z[j];.      
5c60: 69 66 28 20 63 3d 3d 27 2c 27 20 29 20 63 6f 6e  if( c==',' ) con
5c70: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
5c80: 20 63 21 3d 27 7d 27 20 29 20 72 65 74 75 72 6e   c!='}' ) return
5c90: 20 2d 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   -1;.      break
5ca0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
5cb0: 73 65 2d 3e 61 4e 6f 64 65 5b 69 54 68 69 73 5d  se->aNode[iThis]
5cc0: 2e 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4e 6f  .n = pParse->nNo
5cd0: 64 65 20 2d 20 28 75 33 32 29 69 54 68 69 73 20  de - (u32)iThis 
5ce0: 2d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  - 1;.    return 
5cf0: 6a 2b 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  j+1;.  }else if(
5d00: 20 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 2f   c=='[' ){.    /
5d10: 2a 20 50 61 72 73 65 20 61 72 72 61 79 20 2a 2f  * Parse array */
5d20: 0a 20 20 20 20 69 54 68 69 73 20 3d 20 6a 73 6f  .    iThis = jso
5d30: 6e 50 61 72 73 65 41 64 64 4e 6f 64 65 28 70 50  nParseAddNode(pP
5d40: 61 72 73 65 2c 20 4a 53 4f 4e 5f 41 52 52 41 59  arse, JSON_ARRAY
5d50: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
5d60: 20 69 54 68 69 73 3c 30 20 29 20 72 65 74 75 72   iThis<0 ) retur
5d70: 6e 20 2d 31 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  n -1;.    for(j=
5d80: 69 2b 31 3b 3b 6a 2b 2b 29 7b 0a 20 20 20 20 20  i+1;;j++){.     
5d90: 20 77 68 69 6c 65 28 20 73 61 66 65 5f 69 73 73   while( safe_iss
5da0: 70 61 63 65 28 7a 5b 6a 5d 29 20 29 7b 20 6a 2b  pace(z[j]) ){ j+
5db0: 2b 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20 2b  +; }.      if( +
5dc0: 2b 70 50 61 72 73 65 2d 3e 69 44 65 70 74 68 20  +pParse->iDepth 
5dd0: 3e 20 4a 53 4f 4e 5f 4d 41 58 5f 44 45 50 54 48  > JSON_MAX_DEPTH
5de0: 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
5df0: 20 20 20 20 78 20 3d 20 6a 73 6f 6e 50 61 72 73      x = jsonPars
5e00: 65 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 6a  eValue(pParse, j
5e10: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
5e20: 3e 69 44 65 70 74 68 2d 2d 3b 0a 20 20 20 20 20  >iDepth--;.     
5e30: 20 69 66 28 20 78 3c 30 20 29 7b 0a 20 20 20 20   if( x<0 ){.    
5e40: 20 20 20 20 69 66 28 20 78 3d 3d 28 2d 33 29 20      if( x==(-3) 
5e50: 26 26 20 70 50 61 72 73 65 2d 3e 6e 4e 6f 64 65  && pParse->nNode
5e60: 3d 3d 28 75 33 32 29 69 54 68 69 73 2b 31 20 29  ==(u32)iThis+1 )
5e70: 20 72 65 74 75 72 6e 20 6a 2b 31 3b 0a 20 20 20   return j+1;.   
5e80: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
5e90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6a 20        }.      j 
5ea0: 3d 20 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  = x;.      while
5eb0: 28 20 73 61 66 65 5f 69 73 73 70 61 63 65 28 7a  ( safe_isspace(z
5ec0: 5b 6a 5d 29 20 29 7b 20 6a 2b 2b 3b 20 7d 0a 20  [j]) ){ j++; }. 
5ed0: 20 20 20 20 20 63 20 3d 20 7a 5b 6a 5d 3b 0a 20       c = z[j];. 
5ee0: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 2c 27 20       if( c==',' 
5ef0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
5f00: 20 20 69 66 28 20 63 21 3d 27 5d 27 20 29 20 72    if( c!=']' ) r
5f10: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
5f20: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
5f30: 20 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65 5b 69   pParse->aNode[i
5f40: 54 68 69 73 5d 2e 6e 20 3d 20 70 50 61 72 73 65  This].n = pParse
5f50: 2d 3e 6e 4e 6f 64 65 20 2d 20 28 75 33 32 29 69  ->nNode - (u32)i
5f60: 54 68 69 73 20 2d 20 31 3b 0a 20 20 20 20 72 65  This - 1;.    re
5f70: 74 75 72 6e 20 6a 2b 31 3b 0a 20 20 7d 65 6c 73  turn j+1;.  }els
5f80: 65 20 69 66 28 20 63 3d 3d 27 22 27 20 29 7b 0a  e if( c=='"' ){.
5f90: 20 20 20 20 2f 2a 20 50 61 72 73 65 20 73 74 72      /* Parse str
5fa0: 69 6e 67 20 2a 2f 0a 20 20 20 20 75 38 20 6a 6e  ing */.    u8 jn
5fb0: 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 6a  Flags = 0;.    j
5fc0: 20 3d 20 69 2b 31 3b 0a 20 20 20 20 66 6f 72 28   = i+1;.    for(
5fd0: 3b 3b 29 7b 0a 20 20 20 20 20 20 63 20 3d 20 7a  ;;){.      c = z
5fe0: 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 28  [j];.      if( (
5ff0: 63 20 26 20 7e 30 78 31 66 29 3d 3d 30 20 29 7b  c & ~0x1f)==0 ){
6000: 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74  .        /* Cont
6010: 72 6f 6c 20 63 68 61 72 61 63 74 65 72 73 20 61  rol characters a
6020: 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69  re not allowed i
6030: 6e 20 73 74 72 69 6e 67 73 20 2a 2f 0a 20 20 20  n strings */.   
6040: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
6050: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
6060: 28 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20  ( c=='\\' ){.   
6070: 20 20 20 20 20 63 20 3d 20 7a 5b 2b 2b 6a 5d 3b       c = z[++j];
6080: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d  .        if( c==
6090: 27 22 27 20 7c 7c 20 63 3d 3d 27 5c 5c 27 20 7c  '"' || c=='\\' |
60a0: 7c 20 63 3d 3d 27 2f 27 20 7c 7c 20 63 3d 3d 27  | c=='/' || c=='
60b0: 62 27 20 7c 7c 20 63 3d 3d 27 66 27 0a 20 20 20  b' || c=='f'.   
60c0: 20 20 20 20 20 20 20 20 7c 7c 20 63 3d 3d 27 6e          || c=='n
60d0: 27 20 7c 7c 20 63 3d 3d 27 72 27 20 7c 7c 20 63  ' || c=='r' || c
60e0: 3d 3d 27 74 27 0a 20 20 20 20 20 20 20 20 20 20  =='t'.          
60f0: 20 7c 7c 20 28 63 3d 3d 27 75 27 20 26 26 20 6a   || (c=='u' && j
6100: 73 6f 6e 49 73 34 48 65 78 28 7a 2b 6a 2b 31 29  sonIs4Hex(z+j+1)
6110: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6a  ) ){.          j
6120: 6e 46 6c 61 67 73 20 3d 20 4a 4e 4f 44 45 5f 45  nFlags = JNODE_E
6130: 53 43 41 50 45 3b 0a 20 20 20 20 20 20 20 20 7d  SCAPE;.        }
6140: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
6150: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
6160: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
6170: 20 69 66 28 20 63 3d 3d 27 22 27 20 29 7b 0a 20   if( c=='"' ){. 
6180: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
6190: 20 20 20 20 7d 0a 20 20 20 20 20 20 6a 2b 2b 3b      }.      j++;
61a0: 0a 20 20 20 20 7d 0a 20 20 20 20 6a 73 6f 6e 50  .    }.    jsonP
61b0: 61 72 73 65 41 64 64 4e 6f 64 65 28 70 50 61 72  arseAddNode(pPar
61c0: 73 65 2c 20 4a 53 4f 4e 5f 53 54 52 49 4e 47 2c  se, JSON_STRING,
61d0: 20 6a 2b 31 2d 69 2c 20 26 7a 5b 69 5d 29 3b 0a   j+1-i, &z[i]);.
61e0: 20 20 20 20 69 66 28 20 21 70 50 61 72 73 65 2d      if( !pParse-
61f0: 3e 6f 6f 6d 20 29 20 70 50 61 72 73 65 2d 3e 61  >oom ) pParse->a
6200: 4e 6f 64 65 5b 70 50 61 72 73 65 2d 3e 6e 4e 6f  Node[pParse->nNo
6210: 64 65 2d 31 5d 2e 6a 6e 46 6c 61 67 73 20 3d 20  de-1].jnFlags = 
6220: 6a 6e 46 6c 61 67 73 3b 0a 20 20 20 20 72 65 74  jnFlags;.    ret
6230: 75 72 6e 20 6a 2b 31 3b 0a 20 20 7d 65 6c 73 65  urn j+1;.  }else
6240: 20 69 66 28 20 63 3d 3d 27 6e 27 0a 20 20 20 20   if( c=='n'.    
6250: 20 20 20 20 20 26 26 20 73 74 72 6e 63 6d 70 28       && strncmp(
6260: 7a 2b 69 2c 22 6e 75 6c 6c 22 2c 34 29 3d 3d 30  z+i,"null",4)==0
6270: 0a 20 20 20 20 20 20 20 20 20 26 26 20 21 73 61  .         && !sa
6280: 66 65 5f 69 73 61 6c 6e 75 6d 28 7a 5b 69 2b 34  fe_isalnum(z[i+4
6290: 5d 29 20 29 7b 0a 20 20 20 20 6a 73 6f 6e 50 61  ]) ){.    jsonPa
62a0: 72 73 65 41 64 64 4e 6f 64 65 28 70 50 61 72 73  rseAddNode(pPars
62b0: 65 2c 20 4a 53 4f 4e 5f 4e 55 4c 4c 2c 20 30 2c  e, JSON_NULL, 0,
62c0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
62d0: 69 2b 34 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  i+4;.  }else if(
62e0: 20 63 3d 3d 27 74 27 0a 20 20 20 20 20 20 20 20   c=='t'.        
62f0: 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 2b 69 2c   && strncmp(z+i,
6300: 22 74 72 75 65 22 2c 34 29 3d 3d 30 0a 20 20 20  "true",4)==0.   
6310: 20 20 20 20 20 20 26 26 20 21 73 61 66 65 5f 69        && !safe_i
6320: 73 61 6c 6e 75 6d 28 7a 5b 69 2b 34 5d 29 20 29  salnum(z[i+4]) )
6330: 7b 0a 20 20 20 20 6a 73 6f 6e 50 61 72 73 65 41  {.    jsonParseA
6340: 64 64 4e 6f 64 65 28 70 50 61 72 73 65 2c 20 4a  ddNode(pParse, J
6350: 53 4f 4e 5f 54 52 55 45 2c 20 30 2c 20 30 29 3b  SON_TRUE, 0, 0);
6360: 0a 20 20 20 20 72 65 74 75 72 6e 20 69 2b 34 3b  .    return i+4;
6370: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d  .  }else if( c==
6380: 27 66 27 0a 20 20 20 20 20 20 20 20 20 26 26 20  'f'.         && 
6390: 73 74 72 6e 63 6d 70 28 7a 2b 69 2c 22 66 61 6c  strncmp(z+i,"fal
63a0: 73 65 22 2c 35 29 3d 3d 30 0a 20 20 20 20 20 20  se",5)==0.      
63b0: 20 20 20 26 26 20 21 73 61 66 65 5f 69 73 61 6c     && !safe_isal
63c0: 6e 75 6d 28 7a 5b 69 2b 35 5d 29 20 29 7b 0a 20  num(z[i+5]) ){. 
63d0: 20 20 20 6a 73 6f 6e 50 61 72 73 65 41 64 64 4e     jsonParseAddN
63e0: 6f 64 65 28 70 50 61 72 73 65 2c 20 4a 53 4f 4e  ode(pParse, JSON
63f0: 5f 46 41 4c 53 45 2c 20 30 2c 20 30 29 3b 0a 20  _FALSE, 0, 0);. 
6400: 20 20 20 72 65 74 75 72 6e 20 69 2b 35 3b 0a 20     return i+5;. 
6410: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 2d   }else if( c=='-
6420: 27 20 7c 7c 20 28 63 3e 3d 27 30 27 20 26 26 20  ' || (c>='0' && 
6430: 63 3c 3d 27 39 27 29 20 29 7b 0a 20 20 20 20 2f  c<='9') ){.    /
6440: 2a 20 50 61 72 73 65 20 6e 75 6d 62 65 72 20 2a  * Parse number *
6450: 2f 0a 20 20 20 20 75 38 20 73 65 65 6e 44 50 20  /.    u8 seenDP 
6460: 3d 20 30 3b 0a 20 20 20 20 75 38 20 73 65 65 6e  = 0;.    u8 seen
6470: 45 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  E = 0;.    asser
6480: 74 28 20 27 2d 27 20 3c 20 27 30 27 20 29 3b 0a  t( '-' < '0' );.
6490: 20 20 20 20 69 66 28 20 63 3c 3d 27 30 27 20 29      if( c<='0' )
64a0: 7b 0a 20 20 20 20 20 20 6a 20 3d 20 63 3d 3d 27  {.      j = c=='
64b0: 2d 27 20 3f 20 69 2b 31 20 3a 20 69 3b 0a 20 20  -' ? i+1 : i;.  
64c0: 20 20 20 20 69 66 28 20 7a 5b 6a 5d 3d 3d 27 30      if( z[j]=='0
64d0: 27 20 26 26 20 7a 5b 6a 2b 31 5d 3e 3d 27 30 27  ' && z[j+1]>='0'
64e0: 20 26 26 20 7a 5b 6a 2b 31 5d 3c 3d 27 39 27 20   && z[j+1]<='9' 
64f0: 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
6500: 20 7d 0a 20 20 20 20 6a 20 3d 20 69 2b 31 3b 0a   }.    j = i+1;.
6510: 20 20 20 20 66 6f 72 28 3b 3b 20 6a 2b 2b 29 7b      for(;; j++){
6520: 0a 20 20 20 20 20 20 63 20 3d 20 7a 5b 6a 5d 3b  .      c = z[j];
6530: 0a 20 20 20 20 20 20 69 66 28 20 63 3e 3d 27 30  .      if( c>='0
6540: 27 20 26 26 20 63 3c 3d 27 39 27 20 29 20 63 6f  ' && c<='9' ) co
6550: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
6560: 28 20 63 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20  ( c=='.' ){.    
6570: 20 20 20 20 69 66 28 20 7a 5b 6a 2d 31 5d 3d 3d      if( z[j-1]==
6580: 27 2d 27 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  '-' ) return -1;
6590: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 65 65  .        if( see
65a0: 6e 44 50 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  nDP ) return -1;
65b0: 0a 20 20 20 20 20 20 20 20 73 65 65 6e 44 50 20  .        seenDP 
65c0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  = 1;.        con
65d0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
65e0: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 65 27 20       if( c=='e' 
65f0: 7c 7c 20 63 3d 3d 27 45 27 20 29 7b 0a 20 20 20  || c=='E' ){.   
6600: 20 20 20 20 20 69 66 28 20 7a 5b 6a 2d 31 5d 3c       if( z[j-1]<
6610: 27 30 27 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  '0' ) return -1;
6620: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 65 65  .        if( see
6630: 6e 45 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  nE ) return -1;.
6640: 20 20 20 20 20 20 20 20 73 65 65 6e 44 50 20 3d          seenDP =
6650: 20 73 65 65 6e 45 20 3d 20 31 3b 0a 20 20 20 20   seenE = 1;.    
6660: 20 20 20 20 63 20 3d 20 7a 5b 6a 2b 31 5d 3b 0a      c = z[j+1];.
6670: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
6680: 2b 27 20 7c 7c 20 63 3d 3d 27 2d 27 20 29 7b 0a  +' || c=='-' ){.
6690: 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20            j++;. 
66a0: 20 20 20 20 20 20 20 20 20 63 20 3d 20 7a 5b 6a           c = z[j
66b0: 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  +1];.        }. 
66c0: 20 20 20 20 20 20 20 69 66 28 20 63 3c 27 30 27         if( c<'0'
66d0: 20 7c 7c 20 63 3e 27 39 27 20 29 20 72 65 74 75   || c>'9' ) retu
66e0: 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 63  rn -1;.        c
66f0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
6700: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6710: 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 5b 6a 2d    }.    if( z[j-
6720: 31 5d 3c 27 30 27 20 29 20 72 65 74 75 72 6e 20  1]<'0' ) return 
6730: 2d 31 3b 0a 20 20 20 20 6a 73 6f 6e 50 61 72 73  -1;.    jsonPars
6740: 65 41 64 64 4e 6f 64 65 28 70 50 61 72 73 65 2c  eAddNode(pParse,
6750: 20 73 65 65 6e 44 50 20 3f 20 4a 53 4f 4e 5f 52   seenDP ? JSON_R
6760: 45 41 4c 20 3a 20 4a 53 4f 4e 5f 49 4e 54 2c 0a  EAL : JSON_INT,.
6770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6780: 20 20 20 20 20 20 20 20 6a 20 2d 20 69 2c 20 26          j - i, &
6790: 7a 5b 69 5d 29 3b 0a 20 20 20 20 72 65 74 75 72  z[i]);.    retur
67a0: 6e 20 6a 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  n j;.  }else if(
67b0: 20 63 3d 3d 27 7d 27 20 29 7b 0a 20 20 20 20 72   c=='}' ){.    r
67c0: 65 74 75 72 6e 20 2d 32 3b 20 20 2f 2a 20 45 6e  eturn -2;  /* En
67d0: 64 20 6f 66 20 7b 2e 2e 2e 7d 20 2a 2f 0a 20 20  d of {...} */.  
67e0: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5d 27  }else if( c==']'
67f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d   ){.    return -
6800: 33 3b 20 20 2f 2a 20 45 6e 64 20 6f 66 20 5b 2e  3;  /* End of [.
6810: 2e 2e 5d 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69  ..] */.  }else i
6820: 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72  f( c==0 ){.    r
6830: 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 45 6e  eturn 0;   /* En
6840: 64 20 6f 66 20 66 69 6c 65 20 2a 2f 0a 20 20 7d  d of file */.  }
6850: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
6860: 20 2d 31 3b 20 20 2f 2a 20 53 79 6e 74 61 78 20   -1;  /* Syntax 
6870: 65 72 72 6f 72 20 2a 2f 0a 20 20 7d 0a 7d 0a 0a  error */.  }.}..
6880: 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 63 6f  /*.** Parse a co
6890: 6d 70 6c 65 74 65 20 4a 53 4f 4e 20 73 74 72 69  mplete JSON stri
68a0: 6e 67 2e 20 20 52 65 74 75 72 6e 20 30 20 6f 6e  ng.  Return 0 on
68b0: 20 73 75 63 63 65 73 73 20 6f 72 20 6e 6f 6e 2d   success or non-
68c0: 7a 65 72 6f 20 69 66 20 74 68 65 72 65 0a 2a 2a  zero if there.**
68d0: 20 61 72 65 20 61 6e 79 20 65 72 72 6f 72 73 2e   are any errors.
68e0: 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63    If an error oc
68f0: 63 75 72 73 2c 20 66 72 65 65 20 61 6c 6c 20 6d  curs, free all m
6900: 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
6910: 20 77 69 74 68 0a 2a 2a 20 70 50 61 72 73 65 2e   with.** pParse.
6920: 0a 2a 2a 0a 2a 2a 20 70 50 61 72 73 65 20 69 73  .**.** pParse is
6930: 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 77   uninitialized w
6940: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
6950: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73   is called..*/.s
6960: 74 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e 50 61  tatic int jsonPa
6970: 72 73 65 28 0a 20 20 4a 73 6f 6e 50 61 72 73 65  rse(.  JsonParse
6980: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
6990: 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
69a0: 65 20 61 6e 64 20 66 69 6c 6c 20 74 68 69 73 20  e and fill this 
69b0: 4a 73 6f 6e 50 61 72 73 65 20 6f 62 6a 65 63 74  JsonParse object
69c0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f   */.  sqlite3_co
69d0: 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20 20  ntext *pCtx,    
69e0: 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 65 72 72     /* Report err
69f0: 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f  ors here */.  co
6a00: 6e 73 74 20 63 68 61 72 20 2a 7a 4a 73 6f 6e 20  nst char *zJson 
6a10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
6a20: 70 75 74 20 4a 53 4f 4e 20 74 65 78 74 20 74 6f  put JSON text to
6a30: 20 62 65 20 70 61 72 73 65 64 20 2a 2f 0a 29 7b   be parsed */.){
6a40: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6d 65 6d 73  .  int i;.  mems
6a50: 65 74 28 70 50 61 72 73 65 2c 20 30 2c 20 73 69  et(pParse, 0, si
6a60: 7a 65 6f 66 28 2a 70 50 61 72 73 65 29 29 3b 0a  zeof(*pParse));.
6a70: 20 20 69 66 28 20 7a 4a 73 6f 6e 3d 3d 30 20 29    if( zJson==0 )
6a80: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 70 50 61   return 1;.  pPa
6a90: 72 73 65 2d 3e 7a 4a 73 6f 6e 20 3d 20 7a 4a 73  rse->zJson = zJs
6aa0: 6f 6e 3b 0a 20 20 69 20 3d 20 6a 73 6f 6e 50 61  on;.  i = jsonPa
6ab0: 72 73 65 56 61 6c 75 65 28 70 50 61 72 73 65 2c  rseValue(pParse,
6ac0: 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73   0);.  if( pPars
6ad0: 65 2d 3e 6f 6f 6d 20 29 20 69 20 3d 20 2d 31 3b  e->oom ) i = -1;
6ae0: 0a 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20  .  if( i>0 ){.  
6af0: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
6b00: 2d 3e 69 44 65 70 74 68 3d 3d 30 20 29 3b 0a 20  ->iDepth==0 );. 
6b10: 20 20 20 77 68 69 6c 65 28 20 73 61 66 65 5f 69     while( safe_i
6b20: 73 73 70 61 63 65 28 7a 4a 73 6f 6e 5b 69 5d 29  sspace(zJson[i])
6b30: 20 29 20 69 2b 2b 3b 0a 20 20 20 20 69 66 28 20   ) i++;.    if( 
6b40: 7a 4a 73 6f 6e 5b 69 5d 20 29 20 69 20 3d 20 2d  zJson[i] ) i = -
6b50: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c 3d  1;.  }.  if( i<=
6b60: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 74  0 ){.    if( pCt
6b70: 78 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  x!=0 ){.      if
6b80: 28 20 70 50 61 72 73 65 2d 3e 6f 6f 6d 20 29 7b  ( pParse->oom ){
6b90: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6ba0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
6bb0: 6d 65 6d 28 70 43 74 78 29 3b 0a 20 20 20 20 20  mem(pCtx);.     
6bc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6bd0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
6be0: 72 72 6f 72 28 70 43 74 78 2c 20 22 6d 61 6c 66  rror(pCtx, "malf
6bf0: 6f 72 6d 65 64 20 4a 53 4f 4e 22 2c 20 2d 31 29  ormed JSON", -1)
6c00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6c10: 20 20 20 20 6a 73 6f 6e 50 61 72 73 65 52 65 73      jsonParseRes
6c20: 65 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  et(pParse);.    
6c30: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
6c40: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20  return 0;.}../* 
6c50: 4d 61 72 6b 20 6e 6f 64 65 20 69 20 6f 66 20 70  Mark node i of p
6c60: 50 61 72 73 65 20 61 73 20 62 65 69 6e 67 20 61  Parse as being a
6c70: 20 63 68 69 6c 64 20 6f 66 20 69 50 61 72 65 6e   child of iParen
6c80: 74 2e 20 20 43 61 6c 6c 20 72 65 63 75 72 73 69  t.  Call recursi
6c90: 76 65 6c 79 0a 2a 2a 20 74 6f 20 66 69 6c 6c 20  vely.** to fill 
6ca0: 69 6e 20 61 6c 6c 20 74 68 65 20 64 65 73 63 65  in all the desce
6cb0: 6e 64 61 6e 74 73 20 6f 66 20 6e 6f 64 65 20 69  ndants of node i
6cc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6cd0: 20 6a 73 6f 6e 50 61 72 73 65 46 69 6c 6c 49 6e   jsonParseFillIn
6ce0: 50 61 72 65 6e 74 61 67 65 28 4a 73 6f 6e 50 61  Parentage(JsonPa
6cf0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 75 33 32  rse *pParse, u32
6d00: 20 69 2c 20 75 33 32 20 69 50 61 72 65 6e 74 29   i, u32 iParent)
6d10: 7b 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e  {.  JsonNode *pN
6d20: 6f 64 65 20 3d 20 26 70 50 61 72 73 65 2d 3e 61  ode = &pParse->a
6d30: 4e 6f 64 65 5b 69 5d 3b 0a 20 20 75 33 32 20 6a  Node[i];.  u32 j
6d40: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 61 55 70 5b  ;.  pParse->aUp[
6d50: 69 5d 20 3d 20 69 50 61 72 65 6e 74 3b 0a 20 20  i] = iParent;.  
6d60: 73 77 69 74 63 68 28 20 70 4e 6f 64 65 2d 3e 65  switch( pNode->e
6d70: 54 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  Type ){.    case
6d80: 20 4a 53 4f 4e 5f 41 52 52 41 59 3a 20 7b 0a 20   JSON_ARRAY: {. 
6d90: 20 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c       for(j=1; j<
6da0: 3d 70 4e 6f 64 65 2d 3e 6e 3b 20 6a 20 2b 3d 20  =pNode->n; j += 
6db0: 6a 73 6f 6e 4e 6f 64 65 53 69 7a 65 28 70 4e 6f  jsonNodeSize(pNo
6dc0: 64 65 2b 6a 29 29 7b 0a 20 20 20 20 20 20 20 20  de+j)){.        
6dd0: 6a 73 6f 6e 50 61 72 73 65 46 69 6c 6c 49 6e 50  jsonParseFillInP
6de0: 61 72 65 6e 74 61 67 65 28 70 50 61 72 73 65 2c  arentage(pParse,
6df0: 20 69 2b 6a 2c 20 69 29 3b 0a 20 20 20 20 20 20   i+j, i);.      
6e00: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
6e10: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 53     }.    case JS
6e20: 4f 4e 5f 4f 42 4a 45 43 54 3a 20 7b 0a 20 20 20  ON_OBJECT: {.   
6e30: 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 3d 70     for(j=1; j<=p
6e40: 4e 6f 64 65 2d 3e 6e 3b 20 6a 20 2b 3d 20 6a 73  Node->n; j += js
6e50: 6f 6e 4e 6f 64 65 53 69 7a 65 28 70 4e 6f 64 65  onNodeSize(pNode
6e60: 2b 6a 2b 31 29 2b 31 29 7b 0a 20 20 20 20 20 20  +j+1)+1){.      
6e70: 20 20 70 50 61 72 73 65 2d 3e 61 55 70 5b 69 2b    pParse->aUp[i+
6e80: 6a 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  j] = i;.        
6e90: 6a 73 6f 6e 50 61 72 73 65 46 69 6c 6c 49 6e 50  jsonParseFillInP
6ea0: 61 72 65 6e 74 61 67 65 28 70 50 61 72 73 65 2c  arentage(pParse,
6eb0: 20 69 2b 6a 2b 31 2c 20 69 29 3b 0a 20 20 20 20   i+j+1, i);.    
6ec0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
6ed0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
6ee0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 62 72 65 61  lt: {.      brea
6ef0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  k;.    }.  }.}..
6f00: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
6f10: 65 20 70 61 72 65 6e 74 61 67 65 20 6f 66 20 61  e parentage of a
6f20: 6c 6c 20 6e 6f 64 65 73 20 69 6e 20 61 20 63 6f  ll nodes in a co
6f30: 6d 70 6c 65 74 65 64 20 70 61 72 73 65 2e 0a 2a  mpleted parse..*
6f40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 73 6f  /.static int jso
6f50: 6e 50 61 72 73 65 46 69 6e 64 50 61 72 65 6e 74  nParseFindParent
6f60: 73 28 4a 73 6f 6e 50 61 72 73 65 20 2a 70 50 61  s(JsonParse *pPa
6f70: 72 73 65 29 7b 0a 20 20 75 33 32 20 2a 61 55 70  rse){.  u32 *aUp
6f80: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
6f90: 73 65 2d 3e 61 55 70 3d 3d 30 20 29 3b 0a 20 20  se->aUp==0 );.  
6fa0: 61 55 70 20 3d 20 70 50 61 72 73 65 2d 3e 61 55  aUp = pParse->aU
6fb0: 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  p = sqlite3_mall
6fc0: 6f 63 28 20 73 69 7a 65 6f 66 28 75 33 32 29 2a  oc( sizeof(u32)*
6fd0: 70 50 61 72 73 65 2d 3e 6e 4e 6f 64 65 20 29 3b  pParse->nNode );
6fe0: 0a 20 20 69 66 28 20 61 55 70 3d 3d 30 20 29 7b  .  if( aUp==0 ){
6ff0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6f 6f 6d  .    pParse->oom
7000: 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
7010: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
7020: 20 7d 0a 20 20 6a 73 6f 6e 50 61 72 73 65 46 69   }.  jsonParseFi
7030: 6c 6c 49 6e 50 61 72 65 6e 74 61 67 65 28 70 50  llInParentage(pP
7040: 61 72 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 72  arse, 0, 0);.  r
7050: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
7060: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 67 69 63 20  .}../*.** Magic 
7070: 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20  number used for 
7080: 74 68 65 20 4a 53 4f 4e 20 70 61 72 73 65 20 63  the JSON parse c
7090: 61 63 68 65 20 69 6e 20 73 71 6c 69 74 65 33 5f  ache in sqlite3_
70a0: 67 65 74 5f 61 75 78 64 61 74 61 28 29 0a 2a 2f  get_auxdata().*/
70b0: 0a 23 64 65 66 69 6e 65 20 4a 53 4f 4e 5f 43 41  .#define JSON_CA
70c0: 43 48 45 5f 49 44 20 20 28 2d 34 32 39 39 33 38  CHE_ID  (-429938
70d0: 29 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20  )../*.** Obtain 
70e0: 61 20 63 6f 6d 70 6c 65 74 65 20 70 61 72 73 65  a complete parse
70f0: 20 6f 66 20 74 68 65 20 4a 53 4f 4e 20 66 6f 75   of the JSON fou
7100: 6e 64 20 69 6e 20 74 68 65 20 66 69 72 73 74 20  nd in the first 
7110: 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 6f 66 20 74  argument.** of t
7120: 68 65 20 61 72 67 76 20 61 72 72 61 79 2e 20 20  he argv array.  
7130: 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  Use the sqlite3_
7140: 67 65 74 5f 61 75 78 64 61 74 61 28 29 20 63 61  get_auxdata() ca
7150: 63 68 65 20 66 6f 72 20 74 68 69 73 0a 2a 2a 20  che for this.** 
7160: 70 61 72 73 65 20 69 66 20 69 74 20 69 73 20 61  parse if it is a
7170: 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20 74 68  vailable.  If th
7180: 65 20 63 61 63 68 65 20 69 73 20 6e 6f 74 20 61  e cache is not a
7190: 76 61 69 6c 61 62 6c 65 20 6f 72 20 69 66 20 69  vailable or if i
71a0: 74 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  t.** is no longe
71b0: 72 20 76 61 6c 69 64 2c 20 70 61 72 73 65 20 74  r valid, parse t
71c0: 68 65 20 4a 53 4f 4e 20 61 67 61 69 6e 20 61 6e  he JSON again an
71d0: 64 20 72 65 74 75 72 6e 20 74 68 65 20 6e 65 77  d return the new
71e0: 20 70 61 72 73 65 2c 0a 2a 2a 20 61 6e 64 20 61   parse,.** and a
71f0: 6c 73 6f 20 72 65 67 69 73 74 65 72 20 74 68 65  lso register the
7200: 20 6e 65 77 20 70 61 72 73 65 20 73 6f 20 74 68   new parse so th
7210: 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20 61 76  at it will be av
7220: 61 69 6c 61 62 6c 65 20 66 6f 72 0a 2a 2a 20 66  ailable for.** f
7230: 75 74 75 72 65 20 73 71 6c 69 74 65 33 5f 67 65  uture sqlite3_ge
7240: 74 5f 61 75 78 64 61 74 61 28 29 20 63 61 6c 6c  t_auxdata() call
7250: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4a 73 6f  s..*/.static Jso
7260: 6e 50 61 72 73 65 20 2a 6a 73 6f 6e 50 61 72 73  nParse *jsonPars
7270: 65 43 61 63 68 65 64 28 0a 20 20 73 71 6c 69 74  eCached(.  sqlit
7280: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
7290: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
72a0: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f  e **argv.){.  co
72b0: 6e 73 74 20 63 68 61 72 20 2a 7a 4a 73 6f 6e 20  nst char *zJson 
72c0: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
72d0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
72e0: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 6e  t(argv[0]);.  in
72f0: 74 20 6e 4a 73 6f 6e 20 3d 20 73 71 6c 69 74 65  t nJson = sqlite
7300: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72  3_value_bytes(ar
7310: 67 76 5b 30 5d 29 3b 0a 20 20 4a 73 6f 6e 50 61  gv[0]);.  JsonPa
7320: 72 73 65 20 2a 70 3b 0a 20 20 69 66 28 20 7a 4a  rse *p;.  if( zJ
7330: 73 6f 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  son==0 ) return 
7340: 30 3b 0a 20 20 70 20 3d 20 28 4a 73 6f 6e 50 61  0;.  p = (JsonPa
7350: 72 73 65 2a 29 73 71 6c 69 74 65 33 5f 67 65 74  rse*)sqlite3_get
7360: 5f 61 75 78 64 61 74 61 28 70 43 74 78 2c 20 4a  _auxdata(pCtx, J
7370: 53 4f 4e 5f 43 41 43 48 45 5f 49 44 29 3b 0a 20  SON_CACHE_ID);. 
7380: 20 69 66 28 20 70 20 26 26 20 70 2d 3e 6e 4a 73   if( p && p->nJs
7390: 6f 6e 3d 3d 6e 4a 73 6f 6e 20 26 26 20 6d 65 6d  on==nJson && mem
73a0: 63 6d 70 28 70 2d 3e 7a 4a 73 6f 6e 2c 7a 4a 73  cmp(p->zJson,zJs
73b0: 6f 6e 2c 6e 4a 73 6f 6e 29 3d 3d 30 20 29 7b 0a  on,nJson)==0 ){.
73c0: 20 20 20 20 70 2d 3e 6e 45 72 72 20 3d 20 30 3b      p->nErr = 0;
73d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 3b 20 2f  .    return p; /
73e0: 2a 20 54 68 65 20 63 61 63 68 65 64 20 65 6e 74  * The cached ent
73f0: 72 79 20 6d 61 74 63 68 65 73 2c 20 73 6f 20 72  ry matches, so r
7400: 65 74 75 72 6e 20 69 74 20 2a 2f 0a 20 20 7d 0a  eturn it */.  }.
7410: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61    p = sqlite3_ma
7420: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29  lloc( sizeof(*p)
7430: 20 2b 20 6e 4a 73 6f 6e 20 2b 20 31 20 29 3b 0a   + nJson + 1 );.
7440: 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
7450: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
7460: 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74  _error_nomem(pCt
7470: 78 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  x);.    return 0
7480: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70  ;.  }.  memset(p
7490: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  , 0, sizeof(*p))
74a0: 3b 0a 20 20 70 2d 3e 7a 4a 73 6f 6e 20 3d 20 28  ;.  p->zJson = (
74b0: 63 68 61 72 2a 29 26 70 5b 31 5d 3b 0a 20 20 6d  char*)&p[1];.  m
74c0: 65 6d 63 70 79 28 28 63 68 61 72 2a 29 70 2d 3e  emcpy((char*)p->
74d0: 7a 4a 73 6f 6e 2c 20 7a 4a 73 6f 6e 2c 20 6e 4a  zJson, zJson, nJ
74e0: 73 6f 6e 2b 31 29 3b 0a 20 20 69 66 28 20 6a 73  son+1);.  if( js
74f0: 6f 6e 50 61 72 73 65 28 70 2c 20 70 43 74 78 2c  onParse(p, pCtx,
7500: 20 70 2d 3e 7a 4a 73 6f 6e 29 20 29 7b 0a 20 20   p->zJson) ){.  
7510: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
7520: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
7530: 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4a 73 6f 6e 20  .  }.  p->nJson 
7540: 3d 20 6e 4a 73 6f 6e 3b 0a 20 20 73 71 6c 69 74  = nJson;.  sqlit
7550: 65 33 5f 73 65 74 5f 61 75 78 64 61 74 61 28 70  e3_set_auxdata(p
7560: 43 74 78 2c 20 4a 53 4f 4e 5f 43 41 43 48 45 5f  Ctx, JSON_CACHE_
7570: 49 44 2c 20 70 2c 20 28 76 6f 69 64 28 2a 29 28  ID, p, (void(*)(
7580: 76 6f 69 64 2a 29 29 6a 73 6f 6e 50 61 72 73 65  void*))jsonParse
7590: 46 72 65 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Free);.  return 
75a0: 28 4a 73 6f 6e 50 61 72 73 65 2a 29 73 71 6c 69  (JsonParse*)sqli
75b0: 74 65 33 5f 67 65 74 5f 61 75 78 64 61 74 61 28  te3_get_auxdata(
75c0: 70 43 74 78 2c 20 4a 53 4f 4e 5f 43 41 43 48 45  pCtx, JSON_CACHE
75d0: 5f 49 44 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  _ID);.}../*.** C
75e0: 6f 6d 70 61 72 65 20 74 68 65 20 4f 42 4a 45 43  ompare the OBJEC
75f0: 54 20 6c 61 62 65 6c 20 61 74 20 70 4e 6f 64 65  T label at pNode
7600: 20 61 67 61 69 6e 73 74 20 7a 4b 65 79 2c 6e 4b   against zKey,nK
7610: 65 79 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65  ey.  Return true
7620: 20 6f 6e 0a 2a 2a 20 61 20 6d 61 74 63 68 2e 0a   on.** a match..
7630: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 73  */.static int js
7640: 6f 6e 4c 61 62 65 6c 43 6f 6d 70 61 72 65 28 4a  onLabelCompare(J
7650: 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 20  sonNode *pNode, 
7660: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65 79  const char *zKey
7670: 2c 20 75 33 32 20 6e 4b 65 79 29 7b 0a 20 20 69  , u32 nKey){.  i
7680: 66 28 20 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67  f( pNode->jnFlag
7690: 73 20 26 20 4a 4e 4f 44 45 5f 52 41 57 20 29 7b  s & JNODE_RAW ){
76a0: 0a 20 20 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e  .    if( pNode->
76b0: 6e 21 3d 6e 4b 65 79 20 29 20 72 65 74 75 72 6e  n!=nKey ) return
76c0: 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   0;.    return s
76d0: 74 72 6e 63 6d 70 28 70 4e 6f 64 65 2d 3e 75 2e  trncmp(pNode->u.
76e0: 7a 4a 43 6f 6e 74 65 6e 74 2c 20 7a 4b 65 79 2c  zJContent, zKey,
76f0: 20 6e 4b 65 79 29 3d 3d 30 3b 0a 20 20 7d 65 6c   nKey)==0;.  }el
7700: 73 65 7b 0a 20 20 20 20 69 66 28 20 70 4e 6f 64  se{.    if( pNod
7710: 65 2d 3e 6e 21 3d 6e 4b 65 79 2b 32 20 29 20 72  e->n!=nKey+2 ) r
7720: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 72 65 74  eturn 0;.    ret
7730: 75 72 6e 20 73 74 72 6e 63 6d 70 28 70 4e 6f 64  urn strncmp(pNod
7740: 65 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 2b 31  e->u.zJContent+1
7750: 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79 29 3d 3d 30  , zKey, nKey)==0
7760: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 66 6f 72 77  ;.  }.}../* forw
7770: 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  ard declaration 
7780: 2a 2f 0a 73 74 61 74 69 63 20 4a 73 6f 6e 4e 6f  */.static JsonNo
7790: 64 65 20 2a 6a 73 6f 6e 4c 6f 6f 6b 75 70 41 70  de *jsonLookupAp
77a0: 70 65 6e 64 28 4a 73 6f 6e 50 61 72 73 65 2a 2c  pend(JsonParse*,
77b0: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2a  const char*,int*
77c0: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 3b 0a  ,const char**);.
77d0: 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 61 6c  ./*.** Search al
77e0: 6f 6e 67 20 7a 50 61 74 68 20 74 6f 20 66 69 6e  ong zPath to fin
77f0: 64 20 74 68 65 20 6e 6f 64 65 20 73 70 65 63 69  d the node speci
7800: 66 69 65 64 2e 20 20 52 65 74 75 72 6e 20 61 20  fied.  Return a 
7810: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
7820: 61 74 20 6e 6f 64 65 2c 20 6f 72 20 4e 55 4c 4c  at node, or NULL
7830: 20 69 66 20 7a 50 61 74 68 20 69 73 20 6d 61 6c   if zPath is mal
7840: 66 6f 72 6d 65 64 20 6f 72 20 69 66 20 74 68 65  formed or if the
7850: 72 65 20 69 73 20 6e 6f 20 73 75 63 68 0a 2a 2a  re is no such.**
7860: 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   node..**.** If 
7870: 70 41 70 6e 64 21 3d 30 2c 20 74 68 65 6e 20 74  pApnd!=0, then t
7880: 72 79 20 74 6f 20 61 70 70 65 6e 64 20 6e 65 77  ry to append new
7890: 20 6e 6f 64 65 73 20 74 6f 20 63 6f 6d 70 6c 65   nodes to comple
78a0: 74 65 20 7a 50 61 74 68 20 69 66 20 69 74 20 69  te zPath if it i
78b0: 73 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74 6f  s.** possible to
78c0: 20 64 6f 20 73 6f 20 61 6e 64 20 69 66 20 6e 6f   do so and if no
78d0: 20 65 78 69 73 74 69 6e 67 20 6e 6f 64 65 20 63   existing node c
78e0: 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 7a 50  orresponds to zP
78f0: 61 74 68 2e 20 20 49 66 0a 2a 2a 20 6e 65 77 20  ath.  If.** new 
7900: 6e 6f 64 65 73 20 61 72 65 20 61 70 70 65 6e 64  nodes are append
7910: 65 64 20 2a 70 41 70 6e 64 20 69 73 20 73 65 74  ed *pApnd is set
7920: 20 74 6f 20 31 2e 0a 2a 2f 0a 73 74 61 74 69 63   to 1..*/.static
7930: 20 4a 73 6f 6e 4e 6f 64 65 20 2a 6a 73 6f 6e 4c   JsonNode *jsonL
7940: 6f 6f 6b 75 70 53 74 65 70 28 0a 20 20 4a 73 6f  ookupStep(.  Jso
7950: 6e 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  nParse *pParse, 
7960: 20 20 20 20 20 2f 2a 20 54 68 65 20 4a 53 4f 4e       /* The JSON
7970: 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
7980: 75 33 32 20 69 52 6f 6f 74 2c 20 20 20 20 20 20  u32 iRoot,      
7990: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
79a0: 20 74 68 65 20 73 65 61 72 63 68 20 61 74 20 74   the search at t
79b0: 68 69 73 20 6e 6f 64 65 20 2a 2f 0a 20 20 63 6f  his node */.  co
79c0: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
79d0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 74        /* The pat
79e0: 68 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  h to search */. 
79f0: 20 69 6e 74 20 2a 70 41 70 6e 64 2c 20 20 20 20   int *pApnd,    
7a00: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 70 70 65           /* Appe
7a10: 6e 64 20 6e 6f 64 65 73 20 74 6f 20 63 6f 6d 70  nd nodes to comp
7a20: 6c 65 74 65 20 70 61 74 68 20 69 66 20 6e 6f 74  lete path if not
7a30: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74   NULL */.  const
7a40: 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 20 20 20   char **pzErr   
7a50: 20 20 20 2f 2a 20 4d 61 6b 65 20 2a 70 7a 45 72     /* Make *pzEr
7a60: 72 20 70 6f 69 6e 74 20 74 6f 20 61 6e 79 20 73  r point to any s
7a70: 79 6e 74 61 78 20 65 72 72 6f 72 20 69 6e 20 7a  yntax error in z
7a80: 50 61 74 68 20 2a 2f 0a 29 7b 0a 20 20 75 33 32  Path */.){.  u32
7a90: 20 69 2c 20 6a 2c 20 6e 4b 65 79 3b 0a 20 20 63   i, j, nKey;.  c
7aa0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65 79 3b  onst char *zKey;
7ab0: 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 52 6f  .  JsonNode *pRo
7ac0: 6f 74 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 4e  ot = &pParse->aN
7ad0: 6f 64 65 5b 69 52 6f 6f 74 5d 3b 0a 20 20 69 66  ode[iRoot];.  if
7ae0: 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 30 20 29 20  ( zPath[0]==0 ) 
7af0: 72 65 74 75 72 6e 20 70 52 6f 6f 74 3b 0a 20 20  return pRoot;.  
7b00: 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 2e  if( zPath[0]=='.
7b10: 27 20 29 7b 0a 20 20 20 20 69 66 28 20 70 52 6f  ' ){.    if( pRo
7b20: 6f 74 2d 3e 65 54 79 70 65 21 3d 4a 53 4f 4e 5f  ot->eType!=JSON_
7b30: 4f 42 4a 45 43 54 20 29 20 72 65 74 75 72 6e 20  OBJECT ) return 
7b40: 30 3b 0a 20 20 20 20 7a 50 61 74 68 2b 2b 3b 0a  0;.    zPath++;.
7b50: 20 20 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d      if( zPath[0]
7b60: 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20 7a  =='"' ){.      z
7b70: 4b 65 79 20 3d 20 7a 50 61 74 68 20 2b 20 31 3b  Key = zPath + 1;
7b80: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  .      for(i=1; 
7b90: 7a 50 61 74 68 5b 69 5d 20 26 26 20 7a 50 61 74  zPath[i] && zPat
7ba0: 68 5b 69 5d 21 3d 27 22 27 3b 20 69 2b 2b 29 7b  h[i]!='"'; i++){
7bb0: 7d 0a 20 20 20 20 20 20 6e 4b 65 79 20 3d 20 69  }.      nKey = i
7bc0: 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50  -1;.      if( zP
7bd0: 61 74 68 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  ath[i] ){.      
7be0: 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c    i++;.      }el
7bf0: 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45  se{.        *pzE
7c00: 72 72 20 3d 20 7a 50 61 74 68 3b 0a 20 20 20 20  rr = zPath;.    
7c10: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
7c20: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
7c30: 0a 20 20 20 20 20 20 7a 4b 65 79 20 3d 20 7a 50  .      zKey = zP
7c40: 61 74 68 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  ath;.      for(i
7c50: 3d 30 3b 20 7a 50 61 74 68 5b 69 5d 20 26 26 20  =0; zPath[i] && 
7c60: 7a 50 61 74 68 5b 69 5d 21 3d 27 2e 27 20 26 26  zPath[i]!='.' &&
7c70: 20 7a 50 61 74 68 5b 69 5d 21 3d 27 5b 27 3b 20   zPath[i]!='['; 
7c80: 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 6e 4b 65  i++){}.      nKe
7c90: 79 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20  y = i;.    }.   
7ca0: 20 69 66 28 20 6e 4b 65 79 3d 3d 30 20 29 7b 0a   if( nKey==0 ){.
7cb0: 20 20 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 7a        *pzErr = z
7cc0: 50 61 74 68 3b 0a 20 20 20 20 20 20 72 65 74 75  Path;.      retu
7cd0: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
7ce0: 6a 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 3b  j = 1;.    for(;
7cf0: 3b 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  ;){.      while(
7d00: 20 6a 3c 3d 70 52 6f 6f 74 2d 3e 6e 20 29 7b 0a   j<=pRoot->n ){.
7d10: 20 20 20 20 20 20 20 20 69 66 28 20 6a 73 6f 6e          if( json
7d20: 4c 61 62 65 6c 43 6f 6d 70 61 72 65 28 70 52 6f  LabelCompare(pRo
7d30: 6f 74 2b 6a 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79  ot+j, zKey, nKey
7d40: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ) ){.          r
7d50: 65 74 75 72 6e 20 6a 73 6f 6e 4c 6f 6f 6b 75 70  eturn jsonLookup
7d60: 53 74 65 70 28 70 50 61 72 73 65 2c 20 69 52 6f  Step(pParse, iRo
7d70: 6f 74 2b 6a 2b 31 2c 20 26 7a 50 61 74 68 5b 69  ot+j+1, &zPath[i
7d80: 5d 2c 20 70 41 70 6e 64 2c 20 70 7a 45 72 72 29  ], pApnd, pzErr)
7d90: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
7da0: 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20      j++;.       
7db0: 20 6a 20 2b 3d 20 6a 73 6f 6e 4e 6f 64 65 53 69   j += jsonNodeSi
7dc0: 7a 65 28 26 70 52 6f 6f 74 5b 6a 5d 29 3b 0a 20  ze(&pRoot[j]);. 
7dd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
7de0: 20 28 70 52 6f 6f 74 2d 3e 6a 6e 46 6c 61 67 73   (pRoot->jnFlags
7df0: 20 26 20 4a 4e 4f 44 45 5f 41 50 50 45 4e 44 29   & JNODE_APPEND)
7e00: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
7e10: 20 20 20 69 52 6f 6f 74 20 2b 3d 20 70 52 6f 6f     iRoot += pRoo
7e20: 74 2d 3e 75 2e 69 41 70 70 65 6e 64 3b 0a 20 20  t->u.iAppend;.  
7e30: 20 20 20 20 70 52 6f 6f 74 20 3d 20 26 70 50 61      pRoot = &pPa
7e40: 72 73 65 2d 3e 61 4e 6f 64 65 5b 69 52 6f 6f 74  rse->aNode[iRoot
7e50: 5d 3b 0a 20 20 20 20 20 20 6a 20 3d 20 31 3b 0a  ];.      j = 1;.
7e60: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 41      }.    if( pA
7e70: 70 6e 64 20 29 7b 0a 20 20 20 20 20 20 75 33 32  pnd ){.      u32
7e80: 20 69 53 74 61 72 74 2c 20 69 4c 61 62 65 6c 3b   iStart, iLabel;
7e90: 0a 20 20 20 20 20 20 4a 73 6f 6e 4e 6f 64 65 20  .      JsonNode 
7ea0: 2a 70 4e 6f 64 65 3b 0a 20 20 20 20 20 20 69 53  *pNode;.      iS
7eb0: 74 61 72 74 20 3d 20 6a 73 6f 6e 50 61 72 73 65  tart = jsonParse
7ec0: 41 64 64 4e 6f 64 65 28 70 50 61 72 73 65 2c 20  AddNode(pParse, 
7ed0: 4a 53 4f 4e 5f 4f 42 4a 45 43 54 2c 20 32 2c 20  JSON_OBJECT, 2, 
7ee0: 30 29 3b 0a 20 20 20 20 20 20 69 4c 61 62 65 6c  0);.      iLabel
7ef0: 20 3d 20 6a 73 6f 6e 50 61 72 73 65 41 64 64 4e   = jsonParseAddN
7f00: 6f 64 65 28 70 50 61 72 73 65 2c 20 4a 53 4f 4e  ode(pParse, JSON
7f10: 5f 53 54 52 49 4e 47 2c 20 69 2c 20 7a 50 61 74  _STRING, i, zPat
7f20: 68 29 3b 0a 20 20 20 20 20 20 7a 50 61 74 68 20  h);.      zPath 
7f30: 2b 3d 20 69 3b 0a 20 20 20 20 20 20 70 4e 6f 64  += i;.      pNod
7f40: 65 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 41 70  e = jsonLookupAp
7f50: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 7a 50 61  pend(pParse, zPa
7f60: 74 68 2c 20 70 41 70 6e 64 2c 20 70 7a 45 72 72  th, pApnd, pzErr
7f70: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
7f80: 72 73 65 2d 3e 6f 6f 6d 20 29 20 72 65 74 75 72  rse->oom ) retur
7f90: 6e 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  n 0;.      if( p
7fa0: 4e 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Node ){.        
7fb0: 70 52 6f 6f 74 20 3d 20 26 70 50 61 72 73 65 2d  pRoot = &pParse-
7fc0: 3e 61 4e 6f 64 65 5b 69 52 6f 6f 74 5d 3b 0a 20  >aNode[iRoot];. 
7fd0: 20 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 75 2e         pRoot->u.
7fe0: 69 41 70 70 65 6e 64 20 3d 20 69 53 74 61 72 74  iAppend = iStart
7ff0: 20 2d 20 69 52 6f 6f 74 3b 0a 20 20 20 20 20 20   - iRoot;.      
8000: 20 20 70 52 6f 6f 74 2d 3e 6a 6e 46 6c 61 67 73    pRoot->jnFlags
8010: 20 7c 3d 20 4a 4e 4f 44 45 5f 41 50 50 45 4e 44   |= JNODE_APPEND
8020: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
8030: 2d 3e 61 4e 6f 64 65 5b 69 4c 61 62 65 6c 5d 2e  ->aNode[iLabel].
8040: 6a 6e 46 6c 61 67 73 20 7c 3d 20 4a 4e 4f 44 45  jnFlags |= JNODE
8050: 5f 52 41 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _RAW;.      }.  
8060: 20 20 20 20 72 65 74 75 72 6e 20 70 4e 6f 64 65      return pNode
8070: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
8080: 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 5b  if( zPath[0]=='[
8090: 27 20 26 26 20 73 61 66 65 5f 69 73 64 69 67 69  ' && safe_isdigi
80a0: 74 28 7a 50 61 74 68 5b 31 5d 29 20 29 7b 0a 20  t(zPath[1]) ){. 
80b0: 20 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 65 54     if( pRoot->eT
80c0: 79 70 65 21 3d 4a 53 4f 4e 5f 41 52 52 41 59 20  ype!=JSON_ARRAY 
80d0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
80e0: 69 20 3d 20 30 3b 0a 20 20 20 20 6a 20 3d 20 31  i = 0;.    j = 1
80f0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 61 66  ;.    while( saf
8100: 65 5f 69 73 64 69 67 69 74 28 7a 50 61 74 68 5b  e_isdigit(zPath[
8110: 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20 69 20 3d  j]) ){.      i =
8120: 20 69 2a 31 30 20 2b 20 7a 50 61 74 68 5b 6a 5d   i*10 + zPath[j]
8130: 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 6a 2b   - '0';.      j+
8140: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  +;.    }.    if(
8150: 20 7a 50 61 74 68 5b 6a 5d 21 3d 27 5d 27 20 29   zPath[j]!=']' )
8160: 7b 0a 20 20 20 20 20 20 2a 70 7a 45 72 72 20 3d  {.      *pzErr =
8170: 20 7a 50 61 74 68 3b 0a 20 20 20 20 20 20 72 65   zPath;.      re
8180: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
8190: 20 20 7a 50 61 74 68 20 2b 3d 20 6a 20 2b 20 31    zPath += j + 1
81a0: 3b 0a 20 20 20 20 6a 20 3d 20 31 3b 0a 20 20 20  ;.    j = 1;.   
81b0: 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20   for(;;){.      
81c0: 77 68 69 6c 65 28 20 6a 3c 3d 70 52 6f 6f 74 2d  while( j<=pRoot-
81d0: 3e 6e 20 26 26 20 28 69 3e 30 20 7c 7c 20 28 70  >n && (i>0 || (p
81e0: 52 6f 6f 74 5b 6a 5d 2e 6a 6e 46 6c 61 67 73 20  Root[j].jnFlags 
81f0: 26 20 4a 4e 4f 44 45 5f 52 45 4d 4f 56 45 29 21  & JNODE_REMOVE)!
8200: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  =0) ){.        i
8210: 66 28 20 28 70 52 6f 6f 74 5b 6a 5d 2e 6a 6e 46  f( (pRoot[j].jnF
8220: 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 52 45 4d  lags & JNODE_REM
8230: 4f 56 45 29 3d 3d 30 20 29 20 69 2d 2d 3b 0a 20  OVE)==0 ) i--;. 
8240: 20 20 20 20 20 20 20 6a 20 2b 3d 20 6a 73 6f 6e         j += json
8250: 4e 6f 64 65 53 69 7a 65 28 26 70 52 6f 6f 74 5b  NodeSize(&pRoot[
8260: 6a 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  j]);.      }.   
8270: 20 20 20 69 66 28 20 28 70 52 6f 6f 74 2d 3e 6a     if( (pRoot->j
8280: 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 41  nFlags & JNODE_A
8290: 50 50 45 4e 44 29 3d 3d 30 20 29 20 62 72 65 61  PPEND)==0 ) brea
82a0: 6b 3b 0a 20 20 20 20 20 20 69 52 6f 6f 74 20 2b  k;.      iRoot +
82b0: 3d 20 70 52 6f 6f 74 2d 3e 75 2e 69 41 70 70 65  = pRoot->u.iAppe
82c0: 6e 64 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 20  nd;.      pRoot 
82d0: 3d 20 26 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65  = &pParse->aNode
82e0: 5b 69 52 6f 6f 74 5d 3b 0a 20 20 20 20 20 20 6a  [iRoot];.      j
82f0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
8300: 69 66 28 20 6a 3c 3d 70 52 6f 6f 74 2d 3e 6e 20  if( j<=pRoot->n 
8310: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
8320: 6a 73 6f 6e 4c 6f 6f 6b 75 70 53 74 65 70 28 70  jsonLookupStep(p
8330: 50 61 72 73 65 2c 20 69 52 6f 6f 74 2b 6a 2c 20  Parse, iRoot+j, 
8340: 7a 50 61 74 68 2c 20 70 41 70 6e 64 2c 20 70 7a  zPath, pApnd, pz
8350: 45 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Err);.    }.    
8360: 69 66 28 20 69 3d 3d 30 20 26 26 20 70 41 70 6e  if( i==0 && pApn
8370: 64 20 29 7b 0a 20 20 20 20 20 20 75 33 32 20 69  d ){.      u32 i
8380: 53 74 61 72 74 3b 0a 20 20 20 20 20 20 4a 73 6f  Start;.      Jso
8390: 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 3b 0a 20 20  nNode *pNode;.  
83a0: 20 20 20 20 69 53 74 61 72 74 20 3d 20 6a 73 6f      iStart = jso
83b0: 6e 50 61 72 73 65 41 64 64 4e 6f 64 65 28 70 50  nParseAddNode(pP
83c0: 61 72 73 65 2c 20 4a 53 4f 4e 5f 41 52 52 41 59  arse, JSON_ARRAY
83d0: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  , 1, 0);.      p
83e0: 4e 6f 64 65 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75  Node = jsonLooku
83f0: 70 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  pAppend(pParse, 
8400: 7a 50 61 74 68 2c 20 70 41 70 6e 64 2c 20 70 7a  zPath, pApnd, pz
8410: 45 72 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Err);.      if( 
8420: 70 50 61 72 73 65 2d 3e 6f 6f 6d 20 29 20 72 65  pParse->oom ) re
8430: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 69 66  turn 0;.      if
8440: 28 20 70 4e 6f 64 65 20 29 7b 0a 20 20 20 20 20  ( pNode ){.     
8450: 20 20 20 70 52 6f 6f 74 20 3d 20 26 70 50 61 72     pRoot = &pPar
8460: 73 65 2d 3e 61 4e 6f 64 65 5b 69 52 6f 6f 74 5d  se->aNode[iRoot]
8470: 3b 0a 20 20 20 20 20 20 20 20 70 52 6f 6f 74 2d  ;.        pRoot-
8480: 3e 75 2e 69 41 70 70 65 6e 64 20 3d 20 69 53 74  >u.iAppend = iSt
8490: 61 72 74 20 2d 20 69 52 6f 6f 74 3b 0a 20 20 20  art - iRoot;.   
84a0: 20 20 20 20 20 70 52 6f 6f 74 2d 3e 6a 6e 46 6c       pRoot->jnFl
84b0: 61 67 73 20 7c 3d 20 4a 4e 4f 44 45 5f 41 50 50  ags |= JNODE_APP
84c0: 45 4e 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  END;.      }.   
84d0: 20 20 20 72 65 74 75 72 6e 20 70 4e 6f 64 65 3b     return pNode;
84e0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
84f0: 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 7a 50 61      *pzErr = zPa
8500: 74 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  th;.  }.  return
8510: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70   0;.}../*.** App
8520: 65 6e 64 20 63 6f 6e 74 65 6e 74 20 74 6f 20 70  end content to p
8530: 50 61 72 73 65 20 74 68 61 74 20 77 69 6c 6c 20  Parse that will 
8540: 63 6f 6d 70 6c 65 74 65 20 7a 50 61 74 68 2e 20  complete zPath. 
8550: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
8560: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 69 6e 73 65  r.** to the inse
8570: 72 74 65 64 20 6e 6f 64 65 2c 20 6f 72 20 72 65  rted node, or re
8580: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65  turn NULL if the
8590: 20 61 70 70 65 6e 64 20 66 61 69 6c 73 2e 0a 2a   append fails..*
85a0: 2f 0a 73 74 61 74 69 63 20 4a 73 6f 6e 4e 6f 64  /.static JsonNod
85b0: 65 20 2a 6a 73 6f 6e 4c 6f 6f 6b 75 70 41 70 70  e *jsonLookupApp
85c0: 65 6e 64 28 0a 20 20 4a 73 6f 6e 50 61 72 73 65  end(.  JsonParse
85d0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
85e0: 20 41 70 70 65 6e 64 20 63 6f 6e 74 65 6e 74 20   Append content 
85f0: 74 6f 20 74 68 65 20 4a 53 4f 4e 20 70 61 72 73  to the JSON pars
8600: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
8610: 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 2f 2a  r *zPath,     /*
8620: 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
8630: 63 6f 6e 74 65 6e 74 20 74 6f 20 61 70 70 65 6e  content to appen
8640: 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 70 6e  d */.  int *pApn
8650: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d,            /*
8660: 20 53 65 74 20 74 68 69 73 20 66 6c 61 67 20 74   Set this flag t
8670: 6f 20 31 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  o 1 */.  const c
8680: 68 61 72 20 2a 2a 70 7a 45 72 72 20 20 20 20 20  har **pzErr     
8690: 2f 2a 20 4d 61 6b 65 20 74 68 69 73 20 70 6f 69  /* Make this poi
86a0: 6e 74 20 74 6f 20 61 6e 79 20 73 79 6e 74 61 78  nt to any syntax
86b0: 20 65 72 72 6f 72 20 2a 2f 0a 29 7b 0a 20 20 2a   error */.){.  *
86c0: 70 41 70 6e 64 20 3d 20 31 3b 0a 20 20 69 66 28  pApnd = 1;.  if(
86d0: 20 7a 50 61 74 68 5b 30 5d 3d 3d 30 20 29 7b 0a   zPath[0]==0 ){.
86e0: 20 20 20 20 6a 73 6f 6e 50 61 72 73 65 41 64 64      jsonParseAdd
86f0: 4e 6f 64 65 28 70 50 61 72 73 65 2c 20 4a 53 4f  Node(pParse, JSO
8700: 4e 5f 4e 55 4c 4c 2c 20 30 2c 20 30 29 3b 0a 20  N_NULL, 0, 0);. 
8710: 20 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65     return pParse
8720: 2d 3e 6f 6f 6d 20 3f 20 30 20 3a 20 26 70 50 61  ->oom ? 0 : &pPa
8730: 72 73 65 2d 3e 61 4e 6f 64 65 5b 70 50 61 72 73  rse->aNode[pPars
8740: 65 2d 3e 6e 4e 6f 64 65 2d 31 5d 3b 0a 20 20 7d  e->nNode-1];.  }
8750: 0a 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d  .  if( zPath[0]=
8760: 3d 27 2e 27 20 29 7b 0a 20 20 20 20 6a 73 6f 6e  ='.' ){.    json
8770: 50 61 72 73 65 41 64 64 4e 6f 64 65 28 70 50 61  ParseAddNode(pPa
8780: 72 73 65 2c 20 4a 53 4f 4e 5f 4f 42 4a 45 43 54  rse, JSON_OBJECT
8790: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  , 0, 0);.  }else
87a0: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 50 61   if( strncmp(zPa
87b0: 74 68 2c 22 5b 30 5d 22 2c 33 29 3d 3d 30 20 29  th,"[0]",3)==0 )
87c0: 7b 0a 20 20 20 20 6a 73 6f 6e 50 61 72 73 65 41  {.    jsonParseA
87d0: 64 64 4e 6f 64 65 28 70 50 61 72 73 65 2c 20 4a  ddNode(pParse, J
87e0: 53 4f 4e 5f 41 52 52 41 59 2c 20 30 2c 20 30 29  SON_ARRAY, 0, 0)
87f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
8800: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
8810: 66 28 20 70 50 61 72 73 65 2d 3e 6f 6f 6d 20 29  f( pParse->oom )
8820: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74   return 0;.  ret
8830: 75 72 6e 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 53 74  urn jsonLookupSt
8840: 65 70 28 70 50 61 72 73 65 2c 20 70 50 61 72 73  ep(pParse, pPars
8850: 65 2d 3e 6e 4e 6f 64 65 2d 31 2c 20 7a 50 61 74  e->nNode-1, zPat
8860: 68 2c 20 70 41 70 6e 64 2c 20 70 7a 45 72 72 29  h, pApnd, pzErr)
8870: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
8880: 6e 20 74 68 65 20 74 65 78 74 20 6f 66 20 61 20  n the text of a 
8890: 73 79 6e 74 61 78 20 65 72 72 6f 72 20 6d 65 73  syntax error mes
88a0: 73 61 67 65 20 6f 6e 20 61 20 4a 53 4f 4e 20 70  sage on a JSON p
88b0: 61 74 68 2e 20 20 53 70 61 63 65 20 69 73 0a 2a  ath.  Space is.*
88c0: 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  * obtained from 
88d0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
88e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
88f0: 20 2a 6a 73 6f 6e 50 61 74 68 53 79 6e 74 61 78   *jsonPathSyntax
8900: 45 72 72 6f 72 28 63 6f 6e 73 74 20 63 68 61 72  Error(const char
8910: 20 2a 7a 45 72 72 29 7b 0a 20 20 72 65 74 75 72   *zErr){.  retur
8920: 6e 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  n sqlite3_mprint
8930: 66 28 22 4a 53 4f 4e 20 70 61 74 68 20 65 72 72  f("JSON path err
8940: 6f 72 20 6e 65 61 72 20 27 25 71 27 22 2c 20 7a  or near '%q'", z
8950: 45 72 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  Err);.}../*.** D
8960: 6f 20 61 20 6e 6f 64 65 20 6c 6f 6f 6b 75 70 20  o a node lookup 
8970: 75 73 69 6e 67 20 7a 50 61 74 68 2e 20 20 52 65  using zPath.  Re
8980: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
8990: 6f 20 74 68 65 20 6e 6f 64 65 20 6f 6e 20 73 75  o the node on su
89a0: 63 63 65 73 73 2e 0a 2a 2a 20 52 65 74 75 72 6e  ccess..** Return
89b0: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
89c0: 6e 64 20 6f 72 20 69 66 20 74 68 65 72 65 20 69  nd or if there i
89d0: 73 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  s an error..**.*
89e0: 2a 20 4f 6e 20 61 6e 20 65 72 72 6f 72 2c 20 77  * On an error, w
89f0: 72 69 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  rite an error me
8a00: 73 73 61 67 65 20 69 6e 74 6f 20 70 43 74 78 20  ssage into pCtx 
8a10: 61 6e 64 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  and increment th
8a20: 65 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 6e 45 72  e.** pParse->nEr
8a30: 72 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  r counter..**.**
8a40: 20 49 66 20 70 41 70 6e 64 21 3d 4e 55 4c 4c 20   If pApnd!=NULL 
8a50: 74 68 65 6e 20 74 72 79 20 74 6f 20 61 70 70 65  then try to appe
8a60: 6e 64 20 6d 69 73 73 69 6e 67 20 6e 6f 64 65 73  nd missing nodes
8a70: 20 61 6e 64 20 73 65 74 20 2a 70 41 70 6e 64 20   and set *pApnd 
8a80: 3d 20 31 20 69 66 0a 2a 2a 20 6e 6f 64 65 73 20  = 1 if.** nodes 
8a90: 61 72 65 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f  are appended..*/
8aa0: 0a 73 74 61 74 69 63 20 4a 73 6f 6e 4e 6f 64 65  .static JsonNode
8ab0: 20 2a 6a 73 6f 6e 4c 6f 6f 6b 75 70 28 0a 20 20   *jsonLookup(.  
8ac0: 4a 73 6f 6e 50 61 72 73 65 20 2a 70 50 61 72 73  JsonParse *pPars
8ad0: 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4a  e,      /* The J
8ae0: 53 4f 4e 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  SON to search */
8af0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
8b00: 50 61 74 68 2c 20 20 20 20 20 20 2f 2a 20 54 68  Path,      /* Th
8b10: 65 20 70 61 74 68 20 74 6f 20 73 65 61 72 63 68  e path to search
8b20: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 70 6e 64   */.  int *pApnd
8b30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
8b40: 20 41 70 70 65 6e 64 20 6e 6f 64 65 73 20 74 6f   Append nodes to
8b50: 20 63 6f 6d 70 6c 65 74 65 20 70 61 74 68 20 69   complete path i
8b60: 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20  f not NULL */.  
8b70: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
8b80: 2a 70 43 74 78 20 20 20 2f 2a 20 52 65 70 6f 72  *pCtx   /* Repor
8b90: 74 20 65 72 72 6f 72 73 20 68 65 72 65 2c 20 69  t errors here, i
8ba0: 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  f not NULL */.){
8bb0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
8bc0: 45 72 72 20 3d 20 30 3b 0a 20 20 4a 73 6f 6e 4e  Err = 0;.  JsonN
8bd0: 6f 64 65 20 2a 70 4e 6f 64 65 20 3d 20 30 3b 0a  ode *pNode = 0;.
8be0: 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 0a 20    char *zMsg;.. 
8bf0: 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20 29 20   if( zPath==0 ) 
8c00: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
8c10: 7a 50 61 74 68 5b 30 5d 21 3d 27 24 27 20 29 7b  zPath[0]!='$' ){
8c20: 0a 20 20 20 20 7a 45 72 72 20 3d 20 7a 50 61 74  .    zErr = zPat
8c30: 68 3b 0a 20 20 20 20 67 6f 74 6f 20 6c 6f 6f 6b  h;.    goto look
8c40: 75 70 5f 65 72 72 3b 0a 20 20 7d 0a 20 20 7a 50  up_err;.  }.  zP
8c50: 61 74 68 2b 2b 3b 0a 20 20 70 4e 6f 64 65 20 3d  ath++;.  pNode =
8c60: 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 53 74 65 70 28   jsonLookupStep(
8c70: 70 50 61 72 73 65 2c 20 30 2c 20 7a 50 61 74 68  pParse, 0, zPath
8c80: 2c 20 70 41 70 6e 64 2c 20 26 7a 45 72 72 29 3b  , pApnd, &zErr);
8c90: 0a 20 20 69 66 28 20 7a 45 72 72 3d 3d 30 20 29  .  if( zErr==0 )
8ca0: 20 72 65 74 75 72 6e 20 70 4e 6f 64 65 3b 0a 0a   return pNode;..
8cb0: 6c 6f 6f 6b 75 70 5f 65 72 72 3a 0a 20 20 70 50  lookup_err:.  pP
8cc0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
8cd0: 61 73 73 65 72 74 28 20 7a 45 72 72 21 3d 30 20  assert( zErr!=0 
8ce0: 26 26 20 70 43 74 78 21 3d 30 20 29 3b 0a 20 20  && pCtx!=0 );.  
8cf0: 7a 4d 73 67 20 3d 20 6a 73 6f 6e 50 61 74 68 53  zMsg = jsonPathS
8d00: 79 6e 74 61 78 45 72 72 6f 72 28 7a 45 72 72 29  yntaxError(zErr)
8d10: 3b 0a 20 20 69 66 28 20 7a 4d 73 67 20 29 7b 0a  ;.  if( zMsg ){.
8d20: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
8d30: 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 7a  lt_error(pCtx, z
8d40: 4d 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71  Msg, -1);.    sq
8d50: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 73 67 29  lite3_free(zMsg)
8d60: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
8d70: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
8d80: 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78 29 3b  ror_nomem(pCtx);
8d90: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
8da0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72  .}.../*.** Repor
8db0: 74 20 74 68 65 20 77 72 6f 6e 67 20 6e 75 6d 62  t the wrong numb
8dc0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
8dd0: 66 6f 72 20 6a 73 6f 6e 5f 69 6e 73 65 72 74 28  for json_insert(
8de0: 29 2c 20 6a 73 6f 6e 5f 72 65 70 6c 61 63 65 28  ), json_replace(
8df0: 29 0a 2a 2a 20 6f 72 20 6a 73 6f 6e 5f 73 65 74  ).** or json_set
8e00: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
8e10: 69 64 20 6a 73 6f 6e 57 72 6f 6e 67 4e 75 6d 41  id jsonWrongNumA
8e20: 72 67 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  rgs(.  sqlite3_c
8e30: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 0a 20 20  ontext *pCtx,.  
8e40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
8e50: 63 4e 61 6d 65 0a 29 7b 0a 20 20 63 68 61 72 20  cName.){.  char 
8e60: 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  *zMsg = sqlite3_
8e70: 6d 70 72 69 6e 74 66 28 22 6a 73 6f 6e 5f 25 73  mprintf("json_%s
8e80: 28 29 20 6e 65 65 64 73 20 61 6e 20 6f 64 64 20  () needs an odd 
8e90: 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
8ea0: 6e 74 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  nts",.          
8eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ec0: 20 20 20 20 20 7a 46 75 6e 63 4e 61 6d 65 29 3b       zFuncName);
8ed0: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
8ee0: 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 7a 4d  t_error(pCtx, zM
8ef0: 73 67 2c 20 2d 31 29 3b 0a 20 20 73 71 6c 69 74  sg, -1);.  sqlit
8f00: 65 33 5f 66 72 65 65 28 7a 4d 73 67 29 3b 20 20  e3_free(zMsg);  
8f10: 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72     .}../*.** Mar
8f20: 6b 20 61 6c 6c 20 4e 55 4c 4c 20 65 6e 74 72 69  k all NULL entri
8f30: 65 73 20 69 6e 20 74 68 65 20 4f 62 6a 65 63 74  es in the Object
8f40: 20 70 61 73 73 65 64 20 69 6e 20 61 73 20 4a 4e   passed in as JN
8f50: 4f 44 45 5f 52 45 4d 4f 56 45 2e 0a 2a 2f 0a 73  ODE_REMOVE..*/.s
8f60: 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 52  tatic void jsonR
8f70: 65 6d 6f 76 65 41 6c 6c 4e 75 6c 6c 73 28 4a 73  emoveAllNulls(Js
8f80: 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 29 7b 0a  onNode *pNode){.
8f90: 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 61 73    int i, n;.  as
8fa0: 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e 65 54 79  sert( pNode->eTy
8fb0: 70 65 3d 3d 4a 53 4f 4e 5f 4f 42 4a 45 43 54 20  pe==JSON_OBJECT 
8fc0: 29 3b 0a 20 20 6e 20 3d 20 70 4e 6f 64 65 2d 3e  );.  n = pNode->
8fd0: 6e 3b 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c  n;.  for(i=2; i<
8fe0: 3d 6e 3b 20 69 20 2b 3d 20 6a 73 6f 6e 4e 6f 64  =n; i += jsonNod
8ff0: 65 53 69 7a 65 28 26 70 4e 6f 64 65 5b 69 5d 29  eSize(&pNode[i])
9000: 2b 31 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28  +1){.    switch(
9010: 20 70 4e 6f 64 65 5b 69 5d 2e 65 54 79 70 65 20   pNode[i].eType 
9020: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4a 53  ){.      case JS
9030: 4f 4e 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20 20 20  ON_NULL:.       
9040: 20 70 4e 6f 64 65 5b 69 5d 2e 6a 6e 46 6c 61 67   pNode[i].jnFlag
9050: 73 20 7c 3d 20 4a 4e 4f 44 45 5f 52 45 4d 4f 56  s |= JNODE_REMOV
9060: 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  E;.        break
9070: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4a 53 4f  ;.      case JSO
9080: 4e 5f 4f 42 4a 45 43 54 3a 0a 20 20 20 20 20 20  N_OBJECT:.      
9090: 20 20 6a 73 6f 6e 52 65 6d 6f 76 65 41 6c 6c 4e    jsonRemoveAllN
90a0: 75 6c 6c 73 28 26 70 4e 6f 64 65 5b 69 5d 29 3b  ulls(&pNode[i]);
90b0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
90c0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a      }.  }.}.../*
90d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
90e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
90f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 53  ***********.** S
9120: 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65  QL functions use
9130: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
9140: 64 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a 2a 2a  d debugging.****
9150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9170: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9180: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9190: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66 64 65  ********/..#ifde
91a0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
91b0: 2a 0a 2a 2a 20 54 68 65 20 6a 73 6f 6e 5f 70 61  *.** The json_pa
91c0: 72 73 65 28 4a 53 4f 4e 29 20 66 75 6e 63 74 69  rse(JSON) functi
91d0: 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 73 74 72  on returns a str
91e0: 69 6e 67 20 77 68 69 63 68 20 64 65 73 63 72 69  ing which descri
91f0: 62 65 73 0a 2a 2a 20 61 20 70 61 72 73 65 20 6f  bes.** a parse o
9200: 66 20 74 68 65 20 4a 53 4f 4e 20 70 72 6f 76 69  f the JSON provi
9210: 64 65 64 2e 20 20 4f 72 20 69 74 20 72 65 74 75  ded.  Or it retu
9220: 72 6e 73 20 4e 55 4c 4c 20 69 66 20 4a 53 4f 4e  rns NULL if JSON
9230: 20 69 73 20 6e 6f 74 0a 2a 2a 20 77 65 6c 6c 2d   is not.** well-
9240: 66 6f 72 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  formed..*/.stati
9250: 63 20 76 6f 69 64 20 6a 73 6f 6e 50 61 72 73 65  c void jsonParse
9260: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
9270: 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 0a 20 20  context *ctx,.  
9280: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
9290: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
92a0: 0a 29 7b 0a 20 20 4a 73 6f 6e 53 74 72 69 6e 67  .){.  JsonString
92b0: 20 73 3b 20 20 20 20 20 20 20 2f 2a 20 4f 75 74   s;       /* Out
92c0: 70 75 74 20 73 74 72 69 6e 67 20 2d 20 6e 6f 74  put string - not
92d0: 20 72 65 61 6c 20 4a 53 4f 4e 20 2a 2f 0a 20 20   real JSON */.  
92e0: 4a 73 6f 6e 50 61 72 73 65 20 78 3b 20 20 20 20  JsonParse x;    
92f0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
9300: 20 2a 2f 0a 20 20 75 33 32 20 69 3b 0a 0a 20 20   */.  u32 i;..  
9310: 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20  assert( argc==1 
9320: 29 3b 0a 20 20 69 66 28 20 6a 73 6f 6e 50 61 72  );.  if( jsonPar
9330: 73 65 28 26 78 2c 20 63 74 78 2c 20 28 63 6f 6e  se(&x, ctx, (con
9340: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
9350: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
9360: 5b 30 5d 29 29 20 29 20 72 65 74 75 72 6e 3b 0a  [0])) ) return;.
9370: 20 20 6a 73 6f 6e 50 61 72 73 65 46 69 6e 64 50    jsonParseFindP
9380: 61 72 65 6e 74 73 28 26 78 29 3b 0a 20 20 6a 73  arents(&x);.  js
9390: 6f 6e 49 6e 69 74 28 26 73 2c 20 63 74 78 29 3b  onInit(&s, ctx);
93a0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 2e  .  for(i=0; i<x.
93b0: 6e 4e 6f 64 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  nNode; i++){.   
93c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
93d0: 70 65 3b 0a 20 20 20 20 69 66 28 20 78 2e 61 4e  pe;.    if( x.aN
93e0: 6f 64 65 5b 69 5d 2e 6a 6e 46 6c 61 67 73 20 26  ode[i].jnFlags &
93f0: 20 4a 4e 4f 44 45 5f 4c 41 42 45 4c 20 29 7b 0a   JNODE_LABEL ){.
9400: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 78 2e        assert( x.
9410: 61 4e 6f 64 65 5b 69 5d 2e 65 54 79 70 65 3d 3d  aNode[i].eType==
9420: 4a 53 4f 4e 5f 53 54 52 49 4e 47 20 29 3b 0a 20  JSON_STRING );. 
9430: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 6c 61       zType = "la
9440: 62 65 6c 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  bel";.    }else{
9450: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 6a  .      zType = j
9460: 73 6f 6e 54 79 70 65 5b 78 2e 61 4e 6f 64 65 5b  sonType[x.aNode[
9470: 69 5d 2e 65 54 79 70 65 5d 3b 0a 20 20 20 20 7d  i].eType];.    }
9480: 0a 20 20 20 20 6a 73 6f 6e 50 72 69 6e 74 66 28  .    jsonPrintf(
9490: 31 30 30 2c 20 26 73 2c 22 6e 6f 64 65 20 25 33  100, &s,"node %3
94a0: 75 3a 20 25 37 73 20 6e 3d 25 2d 34 64 20 75 70  u: %7s n=%-4d up
94b0: 3d 25 2d 34 64 22 2c 0a 20 20 20 20 20 20 20 20  =%-4d",.        
94c0: 20 20 20 20 20 20 20 69 2c 20 7a 54 79 70 65 2c         i, zType,
94d0: 20 78 2e 61 4e 6f 64 65 5b 69 5d 2e 6e 2c 20 78   x.aNode[i].n, x
94e0: 2e 61 55 70 5b 69 5d 29 3b 0a 20 20 20 20 69 66  .aUp[i]);.    if
94f0: 28 20 78 2e 61 4e 6f 64 65 5b 69 5d 2e 75 2e 7a  ( x.aNode[i].u.z
9500: 4a 43 6f 6e 74 65 6e 74 21 3d 30 20 29 7b 0a 20  JContent!=0 ){. 
9510: 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 52       jsonAppendR
9520: 61 77 28 26 73 2c 20 22 20 22 2c 20 31 29 3b 0a  aw(&s, " ", 1);.
9530: 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64        jsonAppend
9540: 52 61 77 28 26 73 2c 20 78 2e 61 4e 6f 64 65 5b  Raw(&s, x.aNode[
9550: 69 5d 2e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 2c 20  i].u.zJContent, 
9560: 78 2e 61 4e 6f 64 65 5b 69 5d 2e 6e 29 3b 0a 20  x.aNode[i].n);. 
9570: 20 20 20 7d 0a 20 20 20 20 6a 73 6f 6e 41 70 70     }.    jsonApp
9580: 65 6e 64 52 61 77 28 26 73 2c 20 22 5c 6e 22 2c  endRaw(&s, "\n",
9590: 20 31 29 3b 0a 20 20 7d 0a 20 20 6a 73 6f 6e 50   1);.  }.  jsonP
95a0: 61 72 73 65 52 65 73 65 74 28 26 78 29 3b 0a 20  arseReset(&x);. 
95b0: 20 6a 73 6f 6e 52 65 73 75 6c 74 28 26 73 29 3b   jsonResult(&s);
95c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 73  .}../*.** The js
95d0: 6f 6e 5f 74 65 73 74 31 28 4a 53 4f 4e 29 20 66  on_test1(JSON) f
95e0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 74  unction return t
95f0: 72 75 65 20 28 31 29 20 69 66 20 74 68 65 20 69  rue (1) if the i
9600: 6e 70 75 74 20 69 73 20 4a 53 4f 4e 0a 2a 2a 20  nput is JSON.** 
9610: 74 65 78 74 20 67 65 6e 65 72 61 74 65 64 20 62  text generated b
9620: 79 20 61 6e 6f 74 68 65 72 20 6a 73 6f 6e 20 66  y another json f
9630: 75 6e 63 74 69 6f 6e 2e 20 20 49 74 20 72 65 74  unction.  It ret
9640: 75 72 6e 73 20 28 30 29 20 69 66 20 74 68 65 20  urns (0) if the 
9650: 69 6e 70 75 74 0a 2a 2a 20 69 73 20 6e 6f 74 20  input.** is not 
9660: 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 4a 53 4f 4e  known to be JSON
9670: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
9680: 20 6a 73 6f 6e 54 65 73 74 31 46 75 6e 63 28 0a   jsonTest1Func(.
9690: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
96a0: 74 20 2a 63 74 78 2c 0a 20 20 69 6e 74 20 61 72  t *ctx,.  int ar
96b0: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
96c0: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
96d0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 61 72 67  UNUSED_PARAM(arg
96e0: 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  c);.  sqlite3_re
96f0: 73 75 6c 74 5f 69 6e 74 28 63 74 78 2c 20 73 71  sult_int(ctx, sq
9700: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 73 75 62 74  lite3_value_subt
9710: 79 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d 4a 53  ype(argv[0])==JS
9720: 4f 4e 5f 53 55 42 54 59 50 45 29 3b 0a 7d 0a 23  ON_SUBTYPE);.}.#
9730: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
9740: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  DEBUG */../*****
9750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9760: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9790: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 53 63 61 6c 61  *******.** Scala
97a0: 72 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 69  r SQL function i
97b0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a  mplementations.*
97c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
97d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
97e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
97f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
9810: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
9820: 6f 6e 20 6f 66 20 74 68 65 20 6a 73 6f 6e 5f 51  on of the json_Q
9830: 55 4f 54 45 28 56 41 4c 55 45 29 20 66 75 6e 63  UOTE(VALUE) func
9840: 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 20  tion.  Return a 
9850: 4a 53 4f 4e 20 76 61 6c 75 65 0a 2a 2a 20 63 6f  JSON value.** co
9860: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
9870: 68 65 20 53 51 4c 20 76 61 6c 75 65 20 69 6e 70  he SQL value inp
9880: 75 74 2e 20 20 4d 6f 73 74 6c 79 20 74 68 69 73  ut.  Mostly this
9890: 20 6d 65 61 6e 73 20 70 75 74 74 69 6e 67 20 0a   means putting .
98a0: 2a 2a 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73  ** double-quotes
98b0: 20 61 72 6f 75 6e 64 20 73 74 72 69 6e 67 73 20   around strings 
98c0: 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 74 68  and returning th
98d0: 65 20 75 6e 71 75 6f 74 65 64 20 73 74 72 69 6e  e unquoted strin
98e0: 67 20 22 6e 75 6c 6c 22 0a 2a 2a 20 77 68 65 6e  g "null".** when
98f0: 20 67 69 76 65 6e 20 61 20 4e 55 4c 4c 20 69 6e   given a NULL in
9900: 70 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  put..*/.static v
9910: 6f 69 64 20 6a 73 6f 6e 51 75 6f 74 65 46 75 6e  oid jsonQuoteFun
9920: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
9930: 74 65 78 74 20 2a 63 74 78 2c 0a 20 20 69 6e 74  text *ctx,.  int
9940: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
9950: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
9960: 0a 20 20 4a 73 6f 6e 53 74 72 69 6e 67 20 6a 78  .  JsonString jx
9970: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
9980: 28 61 72 67 63 29 3b 0a 0a 20 20 6a 73 6f 6e 49  (argc);..  jsonI
9990: 6e 69 74 28 26 6a 78 2c 20 63 74 78 29 3b 0a 20  nit(&jx, ctx);. 
99a0: 20 6a 73 6f 6e 41 70 70 65 6e 64 56 61 6c 75 65   jsonAppendValue
99b0: 28 26 6a 78 2c 20 61 72 67 76 5b 30 5d 29 3b 0a  (&jx, argv[0]);.
99c0: 20 20 6a 73 6f 6e 52 65 73 75 6c 74 28 26 6a 78    jsonResult(&jx
99d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
99e0: 75 6c 74 5f 73 75 62 74 79 70 65 28 63 74 78 2c  ult_subtype(ctx,
99f0: 20 4a 53 4f 4e 5f 53 55 42 54 59 50 45 29 3b 0a   JSON_SUBTYPE);.
9a00: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
9a10: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a  ntation of the j
9a20: 73 6f 6e 5f 61 72 72 61 79 28 56 41 4c 55 45 2c  son_array(VALUE,
9a30: 2e 2e 2e 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  ...) function.  
9a40: 52 65 74 75 72 6e 20 61 20 4a 53 4f 4e 0a 2a 2a  Return a JSON.**
9a50: 20 61 72 72 61 79 20 74 68 61 74 20 63 6f 6e 74   array that cont
9a60: 61 69 6e 73 20 61 6c 6c 20 76 61 6c 75 65 73 20  ains all values 
9a70: 67 69 76 65 6e 20 69 6e 20 61 72 67 75 6d 65 6e  given in argumen
9a80: 74 73 2e 20 20 4f 72 20 69 66 20 61 6e 79 20 61  ts.  Or if any a
9a90: 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 61 20  rgument.** is a 
9aa0: 42 4c 4f 42 2c 20 74 68 72 6f 77 20 61 6e 20 65  BLOB, throw an e
9ab0: 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rror..*/.static 
9ac0: 76 6f 69 64 20 6a 73 6f 6e 41 72 72 61 79 46 75  void jsonArrayFu
9ad0: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
9ae0: 6e 74 65 78 74 20 2a 63 74 78 2c 0a 20 20 69 6e  ntext *ctx,.  in
9af0: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
9b00: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
9b10: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4a 73 6f  {.  int i;.  Jso
9b20: 6e 53 74 72 69 6e 67 20 6a 78 3b 0a 0a 20 20 6a  nString jx;..  j
9b30: 73 6f 6e 49 6e 69 74 28 26 6a 78 2c 20 63 74 78  sonInit(&jx, ctx
9b40: 29 3b 0a 20 20 6a 73 6f 6e 41 70 70 65 6e 64 43  );.  jsonAppendC
9b50: 68 61 72 28 26 6a 78 2c 20 27 5b 27 29 3b 0a 20  har(&jx, '[');. 
9b60: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63   for(i=0; i<argc
9b70: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6a 73 6f 6e  ; i++){.    json
9b80: 41 70 70 65 6e 64 53 65 70 61 72 61 74 6f 72 28  AppendSeparator(
9b90: 26 6a 78 29 3b 0a 20 20 20 20 6a 73 6f 6e 41 70  &jx);.    jsonAp
9ba0: 70 65 6e 64 56 61 6c 75 65 28 26 6a 78 2c 20 61  pendValue(&jx, a
9bb0: 72 67 76 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 6a  rgv[i]);.  }.  j
9bc0: 73 6f 6e 41 70 70 65 6e 64 43 68 61 72 28 26 6a  sonAppendChar(&j
9bd0: 78 2c 20 27 5d 27 29 3b 0a 20 20 6a 73 6f 6e 52  x, ']');.  jsonR
9be0: 65 73 75 6c 74 28 26 6a 78 29 3b 0a 20 20 73 71  esult(&jx);.  sq
9bf0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 73 75 62  lite3_result_sub
9c00: 74 79 70 65 28 63 74 78 2c 20 4a 53 4f 4e 5f 53  type(ctx, JSON_S
9c10: 55 42 54 59 50 45 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  UBTYPE);.}.../*.
9c20: 2a 2a 20 6a 73 6f 6e 5f 61 72 72 61 79 5f 6c 65  ** json_array_le
9c30: 6e 67 74 68 28 4a 53 4f 4e 29 0a 2a 2a 20 6a 73  ngth(JSON).** js
9c40: 6f 6e 5f 61 72 72 61 79 5f 6c 65 6e 67 74 68 28  on_array_length(
9c50: 4a 53 4f 4e 2c 20 50 41 54 48 29 0a 2a 2a 0a 2a  JSON, PATH).**.*
9c60: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
9c70: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
9c80: 69 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c  in the top-level
9c90: 20 4a 53 4f 4e 20 61 72 72 61 79 2e 20 20 0a 2a   JSON array.  .*
9ca0: 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68  * Return 0 if th
9cb0: 65 20 69 6e 70 75 74 20 69 73 20 6e 6f 74 20 61  e input is not a
9cc0: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 4a 53 4f   well-formed JSO
9cd0: 4e 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74  N array..*/.stat
9ce0: 69 63 20 76 6f 69 64 20 6a 73 6f 6e 41 72 72 61  ic void jsonArra
9cf0: 79 4c 65 6e 67 74 68 46 75 6e 63 28 0a 20 20 73  yLengthFunc(.  s
9d00: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
9d10: 63 74 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ctx,.  int argc,
9d20: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
9d30: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 4a 73 6f   **argv.){.  Jso
9d40: 6e 50 61 72 73 65 20 2a 70 3b 20 20 20 20 20 20  nParse *p;      
9d50: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
9d60: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
9d70: 74 36 34 20 6e 20 3d 20 30 3b 0a 20 20 75 33 32  t64 n = 0;.  u32
9d80: 20 69 3b 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a   i;.  JsonNode *
9d90: 70 4e 6f 64 65 3b 0a 0a 20 20 70 20 3d 20 6a 73  pNode;..  p = js
9da0: 6f 6e 50 61 72 73 65 43 61 63 68 65 64 28 63 74  onParseCached(ct
9db0: 78 2c 20 61 72 67 76 29 3b 0a 20 20 69 66 28 20  x, argv);.  if( 
9dc0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
9dd0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4e 6f 64   assert( p->nNod
9de0: 65 20 29 3b 0a 20 20 69 66 28 20 61 72 67 63 3d  e );.  if( argc=
9df0: 3d 32 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =2 ){.    const 
9e00: 63 68 61 72 20 2a 7a 50 61 74 68 20 3d 20 28 63  char *zPath = (c
9e10: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
9e20: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
9e30: 67 76 5b 31 5d 29 3b 0a 20 20 20 20 70 4e 6f 64  gv[1]);.    pNod
9e40: 65 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 28 70  e = jsonLookup(p
9e50: 2c 20 7a 50 61 74 68 2c 20 30 2c 20 63 74 78 29  , zPath, 0, ctx)
9e60: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
9e70: 4e 6f 64 65 20 3d 20 70 2d 3e 61 4e 6f 64 65 3b  Node = p->aNode;
9e80: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 6f 64 65  .  }.  if( pNode
9e90: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
9ea0: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 6f  n;.  }.  if( pNo
9eb0: 64 65 2d 3e 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f  de->eType==JSON_
9ec0: 41 52 52 41 59 20 29 7b 0a 20 20 20 20 61 73 73  ARRAY ){.    ass
9ed0: 65 72 74 28 20 28 70 4e 6f 64 65 2d 3e 6a 6e 46  ert( (pNode->jnF
9ee0: 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 41 50 50  lags & JNODE_APP
9ef0: 45 4e 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20 66  END)==0 );.    f
9f00: 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 4e 6f 64 65  or(i=1; i<=pNode
9f10: 2d 3e 6e 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20  ->n; n++){.     
9f20: 20 69 20 2b 3d 20 6a 73 6f 6e 4e 6f 64 65 53 69   i += jsonNodeSi
9f30: 7a 65 28 26 70 4e 6f 64 65 5b 69 5d 29 3b 0a 20  ze(&pNode[i]);. 
9f40: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
9f50: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28  e3_result_int64(
9f60: 63 74 78 2c 20 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ctx, n);.}../*.*
9f70: 2a 20 6a 73 6f 6e 5f 65 78 74 72 61 63 74 28 4a  * json_extract(J
9f80: 53 4f 4e 2c 20 50 41 54 48 2c 20 2e 2e 2e 29 0a  SON, PATH, ...).
9f90: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
9fa0: 20 65 6c 65 6d 65 6e 74 20 64 65 73 63 72 69 62   element describ
9fb0: 65 64 20 62 79 20 50 41 54 48 2e 20 20 52 65 74  ed by PATH.  Ret
9fc0: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72  urn NULL if ther
9fd0: 65 20 69 73 20 6e 6f 0a 2a 2a 20 50 41 54 48 20  e is no.** PATH 
9fe0: 65 6c 65 6d 65 6e 74 2e 20 20 49 66 20 74 68 65  element.  If the
9ff0: 72 65 20 61 72 65 20 6d 75 6c 74 69 70 6c 65 20  re are multiple 
a000: 50 41 54 48 73 2c 20 74 68 65 6e 20 72 65 74 75  PATHs, then retu
a010: 72 6e 20 61 20 4a 53 4f 4e 20 61 72 72 61 79 0a  rn a JSON array.
a020: 2a 2a 20 77 69 74 68 20 74 68 65 20 72 65 73 75  ** with the resu
a030: 6c 74 20 66 72 6f 6d 20 65 61 63 68 20 70 61 74  lt from each pat
a040: 68 2e 20 20 54 68 72 6f 77 20 61 6e 20 65 72 72  h.  Throw an err
a050: 6f 72 20 69 66 20 74 68 65 20 4a 53 4f 4e 20 6f  or if the JSON o
a060: 72 20 61 6e 79 20 50 41 54 48 0a 2a 2a 20 69 73  r any PATH.** is
a070: 20 6d 61 6c 66 6f 72 6d 65 64 2e 0a 2a 2f 0a 73   malformed..*/.s
a080: 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 45  tatic void jsonE
a090: 78 74 72 61 63 74 46 75 6e 63 28 0a 20 20 73 71  xtractFunc(.  sq
a0a0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
a0b0: 74 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  tx,.  int argc,.
a0c0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
a0d0: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e  **argv.){.  Json
a0e0: 50 61 72 73 65 20 2a 70 3b 20 20 20 20 20 20 20  Parse *p;       
a0f0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 20     /* The parse 
a100: 2a 2f 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70  */.  JsonNode *p
a110: 4e 6f 64 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68  Node;.  const ch
a120: 61 72 20 2a 7a 50 61 74 68 3b 0a 20 20 4a 73 6f  ar *zPath;.  Jso
a130: 6e 53 74 72 69 6e 67 20 6a 78 3b 0a 20 20 69 6e  nString jx;.  in
a140: 74 20 69 3b 0a 0a 20 20 69 66 28 20 61 72 67 63  t i;..  if( argc
a150: 3c 32 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  <2 ) return;.  p
a160: 20 3d 20 6a 73 6f 6e 50 61 72 73 65 43 61 63 68   = jsonParseCach
a170: 65 64 28 63 74 78 2c 20 61 72 67 76 29 3b 0a 20  ed(ctx, argv);. 
a180: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
a190: 72 6e 3b 0a 20 20 6a 73 6f 6e 49 6e 69 74 28 26  rn;.  jsonInit(&
a1a0: 6a 78 2c 20 63 74 78 29 3b 0a 20 20 6a 73 6f 6e  jx, ctx);.  json
a1b0: 41 70 70 65 6e 64 43 68 61 72 28 26 6a 78 2c 20  AppendChar(&jx, 
a1c0: 27 5b 27 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b  '[');.  for(i=1;
a1d0: 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20   i<argc; i++){. 
a1e0: 20 20 20 7a 50 61 74 68 20 3d 20 28 63 6f 6e 73     zPath = (cons
a1f0: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
a200: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
a210: 69 5d 29 3b 0a 20 20 20 20 70 4e 6f 64 65 20 3d  i]);.    pNode =
a220: 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 28 70 2c 20 7a   jsonLookup(p, z
a230: 50 61 74 68 2c 20 30 2c 20 63 74 78 29 3b 0a 20  Path, 0, ctx);. 
a240: 20 20 20 69 66 28 20 70 2d 3e 6e 45 72 72 20 29     if( p->nErr )
a250: 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
a260: 61 72 67 63 3e 32 20 29 7b 0a 20 20 20 20 20 20  argc>2 ){.      
a270: 6a 73 6f 6e 41 70 70 65 6e 64 53 65 70 61 72 61  jsonAppendSepara
a280: 74 6f 72 28 26 6a 78 29 3b 0a 20 20 20 20 20 20  tor(&jx);.      
a290: 69 66 28 20 70 4e 6f 64 65 20 29 7b 0a 20 20 20  if( pNode ){.   
a2a0: 20 20 20 20 20 6a 73 6f 6e 52 65 6e 64 65 72 4e       jsonRenderN
a2b0: 6f 64 65 28 70 4e 6f 64 65 2c 20 26 6a 78 2c 20  ode(pNode, &jx, 
a2c0: 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  0);.      }else{
a2d0: 0a 20 20 20 20 20 20 20 20 6a 73 6f 6e 41 70 70  .        jsonApp
a2e0: 65 6e 64 52 61 77 28 26 6a 78 2c 20 22 6e 75 6c  endRaw(&jx, "nul
a2f0: 6c 22 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d 0a  l", 4);.      }.
a300: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4e      }else if( pN
a310: 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 6a 73 6f  ode ){.      jso
a320: 6e 52 65 74 75 72 6e 28 70 4e 6f 64 65 2c 20 63  nReturn(pNode, c
a330: 74 78 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  tx, 0);.    }.  
a340: 7d 0a 20 20 69 66 28 20 61 72 67 63 3e 32 20 26  }.  if( argc>2 &
a350: 26 20 69 3d 3d 61 72 67 63 20 29 7b 0a 20 20 20  & i==argc ){.   
a360: 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61 72 28   jsonAppendChar(
a370: 26 6a 78 2c 20 27 5d 27 29 3b 0a 20 20 20 20 6a  &jx, ']');.    j
a380: 73 6f 6e 52 65 73 75 6c 74 28 26 6a 78 29 3b 0a  sonResult(&jx);.
a390: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
a3a0: 6c 74 5f 73 75 62 74 79 70 65 28 63 74 78 2c 20  lt_subtype(ctx, 
a3b0: 4a 53 4f 4e 5f 53 55 42 54 59 50 45 29 3b 0a 20  JSON_SUBTYPE);. 
a3c0: 20 7d 0a 20 20 6a 73 6f 6e 52 65 73 65 74 28 26   }.  jsonReset(&
a3d0: 6a 78 29 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73 20  jx);.}../* This 
a3e0: 69 73 20 74 68 65 20 52 46 43 20 37 33 39 36 20  is the RFC 7396 
a3f0: 4d 65 72 67 65 50 61 74 63 68 20 61 6c 67 6f 72  MergePatch algor
a400: 69 74 68 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ithm..*/.static 
a410: 4a 73 6f 6e 4e 6f 64 65 20 2a 6a 73 6f 6e 4d 65  JsonNode *jsonMe
a420: 72 67 65 50 61 74 63 68 28 0a 20 20 4a 73 6f 6e  rgePatch(.  Json
a430: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
a440: 20 2f 2a 20 54 68 65 20 4a 53 4f 4e 20 70 61 72   /* The JSON par
a450: 73 65 72 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ser that contain
a460: 73 20 74 68 65 20 54 41 52 47 45 54 20 2a 2f 0a  s the TARGET */.
a470: 20 20 75 33 32 20 69 54 61 72 67 65 74 2c 20 20    u32 iTarget,  
a480: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 64 65 20 6f         /* Node o
a490: 66 20 74 68 65 20 54 41 52 47 45 54 20 69 6e 20  f the TARGET in 
a4a0: 70 50 61 72 73 65 20 2a 2f 0a 20 20 4a 73 6f 6e  pParse */.  Json
a4b0: 4e 6f 64 65 20 2a 70 50 61 74 63 68 20 20 20 20  Node *pPatch    
a4c0: 20 2f 2a 20 54 68 65 20 50 41 54 43 48 20 2a 2f   /* The PATCH */
a4d0: 0a 29 7b 0a 20 20 75 33 32 20 69 2c 20 6a 3b 0a  .){.  u32 i, j;.
a4e0: 20 20 75 33 32 20 69 52 6f 6f 74 3b 0a 20 20 4a    u32 iRoot;.  J
a4f0: 73 6f 6e 4e 6f 64 65 20 2a 70 54 61 72 67 65 74  sonNode *pTarget
a500: 3b 0a 20 20 69 66 28 20 70 50 61 74 63 68 2d 3e  ;.  if( pPatch->
a510: 65 54 79 70 65 21 3d 4a 53 4f 4e 5f 4f 42 4a 45  eType!=JSON_OBJE
a520: 43 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  CT ){.    return
a530: 20 70 50 61 74 63 68 3b 0a 20 20 7d 0a 20 20 61   pPatch;.  }.  a
a540: 73 73 65 72 74 28 20 69 54 61 72 67 65 74 3e 3d  ssert( iTarget>=
a550: 30 20 26 26 20 69 54 61 72 67 65 74 3c 70 50 61  0 && iTarget<pPa
a560: 72 73 65 2d 3e 6e 4e 6f 64 65 20 29 3b 0a 20 20  rse->nNode );.  
a570: 70 54 61 72 67 65 74 20 3d 20 26 70 50 61 72 73  pTarget = &pPars
a580: 65 2d 3e 61 4e 6f 64 65 5b 69 54 61 72 67 65 74  e->aNode[iTarget
a590: 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 50  ];.  assert( (pP
a5a0: 61 74 63 68 2d 3e 6a 6e 46 6c 61 67 73 20 26 20  atch->jnFlags & 
a5b0: 4a 4e 4f 44 45 5f 41 50 50 45 4e 44 29 3d 3d 30  JNODE_APPEND)==0
a5c0: 20 29 3b 0a 20 20 69 66 28 20 70 54 61 72 67 65   );.  if( pTarge
a5d0: 74 2d 3e 65 54 79 70 65 21 3d 4a 53 4f 4e 5f 4f  t->eType!=JSON_O
a5e0: 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 6a 73 6f  BJECT ){.    jso
a5f0: 6e 52 65 6d 6f 76 65 41 6c 6c 4e 75 6c 6c 73 28  nRemoveAllNulls(
a600: 70 50 61 74 63 68 29 3b 0a 20 20 20 20 72 65 74  pPatch);.    ret
a610: 75 72 6e 20 70 50 61 74 63 68 3b 0a 20 20 7d 0a  urn pPatch;.  }.
a620: 20 20 69 52 6f 6f 74 20 3d 20 69 54 61 72 67 65    iRoot = iTarge
a630: 74 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  t;.  for(i=1; i<
a640: 70 50 61 74 63 68 2d 3e 6e 3b 20 69 20 2b 3d 20  pPatch->n; i += 
a650: 6a 73 6f 6e 4e 6f 64 65 53 69 7a 65 28 26 70 50  jsonNodeSize(&pP
a660: 61 74 63 68 5b 69 2b 31 5d 29 2b 31 29 7b 0a 20  atch[i+1])+1){. 
a670: 20 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 20     u32 nKey;.   
a680: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65   const char *zKe
a690: 79 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  y;.    assert( p
a6a0: 50 61 74 63 68 5b 69 5d 2e 65 54 79 70 65 3d 3d  Patch[i].eType==
a6b0: 4a 53 4f 4e 5f 53 54 52 49 4e 47 20 29 3b 0a 20  JSON_STRING );. 
a6c0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 74 63     assert( pPatc
a6d0: 68 5b 69 5d 2e 6a 6e 46 6c 61 67 73 20 26 20 4a  h[i].jnFlags & J
a6e0: 4e 4f 44 45 5f 4c 41 42 45 4c 20 29 3b 0a 20 20  NODE_LABEL );.  
a6f0: 20 20 6e 4b 65 79 20 3d 20 70 50 61 74 63 68 5b    nKey = pPatch[
a700: 69 5d 2e 6e 3b 0a 20 20 20 20 7a 4b 65 79 20 3d  i].n;.    zKey =
a710: 20 70 50 61 74 63 68 5b 69 5d 2e 75 2e 7a 4a 43   pPatch[i].u.zJC
a720: 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 61 73 73 65  ontent;.    asse
a730: 72 74 28 20 28 70 50 61 74 63 68 5b 69 5d 2e 6a  rt( (pPatch[i].j
a740: 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 52  nFlags & JNODE_R
a750: 41 57 29 3d 3d 30 20 29 3b 0a 20 20 20 20 66 6f  AW)==0 );.    fo
a760: 72 28 6a 3d 31 3b 20 6a 3c 70 54 61 72 67 65 74  r(j=1; j<pTarget
a770: 2d 3e 6e 3b 20 6a 20 2b 3d 20 6a 73 6f 6e 4e 6f  ->n; j += jsonNo
a780: 64 65 53 69 7a 65 28 26 70 54 61 72 67 65 74 5b  deSize(&pTarget[
a790: 6a 2b 31 5d 29 2b 31 20 29 7b 0a 20 20 20 20 20  j+1])+1 ){.     
a7a0: 20 61 73 73 65 72 74 28 20 70 54 61 72 67 65 74   assert( pTarget
a7b0: 5b 6a 5d 2e 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f  [j].eType==JSON_
a7c0: 53 54 52 49 4e 47 20 29 3b 0a 20 20 20 20 20 20  STRING );.      
a7d0: 61 73 73 65 72 74 28 20 70 54 61 72 67 65 74 5b  assert( pTarget[
a7e0: 6a 5d 2e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f  j].jnFlags & JNO
a7f0: 44 45 5f 4c 41 42 45 4c 20 29 3b 0a 20 20 20 20  DE_LABEL );.    
a800: 20 20 61 73 73 65 72 74 28 20 28 70 50 61 74 63    assert( (pPatc
a810: 68 5b 69 5d 2e 6a 6e 46 6c 61 67 73 20 26 20 4a  h[i].jnFlags & J
a820: 4e 4f 44 45 5f 52 41 57 29 3d 3d 30 20 29 3b 0a  NODE_RAW)==0 );.
a830: 20 20 20 20 20 20 69 66 28 20 70 54 61 72 67 65        if( pTarge
a840: 74 5b 6a 5d 2e 6e 3d 3d 6e 4b 65 79 20 26 26 20  t[j].n==nKey && 
a850: 73 74 72 6e 63 6d 70 28 70 54 61 72 67 65 74 5b  strncmp(pTarget[
a860: 6a 5d 2e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 2c 7a  j].u.zJContent,z
a870: 4b 65 79 2c 6e 4b 65 79 29 3d 3d 30 20 29 7b 0a  Key,nKey)==0 ){.
a880: 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61 72          if( pTar
a890: 67 65 74 5b 6a 2b 31 5d 2e 6a 6e 46 6c 61 67 73  get[j+1].jnFlags
a8a0: 20 26 20 28 4a 4e 4f 44 45 5f 52 45 4d 4f 56 45   & (JNODE_REMOVE
a8b0: 7c 4a 4e 4f 44 45 5f 50 41 54 43 48 29 20 29 20  |JNODE_PATCH) ) 
a8c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69  break;.        i
a8d0: 66 28 20 70 50 61 74 63 68 5b 69 2b 31 5d 2e 65  f( pPatch[i+1].e
a8e0: 54 79 70 65 3d 3d 4a 53 4f 4e 5f 4e 55 4c 4c 20  Type==JSON_NULL 
a8f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61  ){.          pTa
a900: 72 67 65 74 5b 6a 2b 31 5d 2e 6a 6e 46 6c 61 67  rget[j+1].jnFlag
a910: 73 20 7c 3d 20 4a 4e 4f 44 45 5f 52 45 4d 4f 56  s |= JNODE_REMOV
a920: 45 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  E;.        }else
a930: 7b 0a 20 20 20 20 20 20 20 20 20 20 4a 73 6f 6e  {.          Json
a940: 4e 6f 64 65 20 2a 70 4e 65 77 20 3d 20 6a 73 6f  Node *pNew = jso
a950: 6e 4d 65 72 67 65 50 61 74 63 68 28 70 50 61 72  nMergePatch(pPar
a960: 73 65 2c 20 69 54 61 72 67 65 74 2b 6a 2b 31 2c  se, iTarget+j+1,
a970: 20 26 70 50 61 74 63 68 5b 69 2b 31 5d 29 3b 0a   &pPatch[i+1]);.
a980: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e            if( pN
a990: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
a9a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 72  ;.          pTar
a9b0: 67 65 74 20 3d 20 26 70 50 61 72 73 65 2d 3e 61  get = &pParse->a
a9c0: 4e 6f 64 65 5b 69 54 61 72 67 65 74 5d 3b 0a 20  Node[iTarget];. 
a9d0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65           if( pNe
a9e0: 77 21 3d 26 70 54 61 72 67 65 74 5b 6a 2b 31 5d  w!=&pTarget[j+1]
a9f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
aa00: 70 54 61 72 67 65 74 5b 6a 2b 31 5d 2e 75 2e 70  pTarget[j+1].u.p
aa10: 50 61 74 63 68 20 3d 20 70 4e 65 77 3b 0a 20 20  Patch = pNew;.  
aa20: 20 20 20 20 20 20 20 20 20 20 70 54 61 72 67 65            pTarge
aa30: 74 5b 6a 2b 31 5d 2e 6a 6e 46 6c 61 67 73 20 7c  t[j+1].jnFlags |
aa40: 3d 20 4a 4e 4f 44 45 5f 50 41 54 43 48 3b 0a 20  = JNODE_PATCH;. 
aa50: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
aa60: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
aa70: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
aa80: 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70 54 61  }.    if( j>=pTa
aa90: 72 67 65 74 2d 3e 6e 20 26 26 20 70 50 61 74 63  rget->n && pPatc
aaa0: 68 5b 69 2b 31 5d 2e 65 54 79 70 65 21 3d 4a 53  h[i+1].eType!=JS
aab0: 4f 4e 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  ON_NULL ){.     
aac0: 20 69 6e 74 20 69 53 74 61 72 74 2c 20 69 50 61   int iStart, iPa
aad0: 74 63 68 3b 0a 20 20 20 20 20 20 69 53 74 61 72  tch;.      iStar
aae0: 74 20 3d 20 6a 73 6f 6e 50 61 72 73 65 41 64 64  t = jsonParseAdd
aaf0: 4e 6f 64 65 28 70 50 61 72 73 65 2c 20 4a 53 4f  Node(pParse, JSO
ab00: 4e 5f 4f 42 4a 45 43 54 2c 20 32 2c 20 30 29 3b  N_OBJECT, 2, 0);
ab10: 0a 20 20 20 20 20 20 6a 73 6f 6e 50 61 72 73 65  .      jsonParse
ab20: 41 64 64 4e 6f 64 65 28 70 50 61 72 73 65 2c 20  AddNode(pParse, 
ab30: 4a 53 4f 4e 5f 53 54 52 49 4e 47 2c 20 6e 4b 65  JSON_STRING, nKe
ab40: 79 2c 20 7a 4b 65 79 29 3b 0a 20 20 20 20 20 20  y, zKey);.      
ab50: 69 50 61 74 63 68 20 3d 20 6a 73 6f 6e 50 61 72  iPatch = jsonPar
ab60: 73 65 41 64 64 4e 6f 64 65 28 70 50 61 72 73 65  seAddNode(pParse
ab70: 2c 20 4a 53 4f 4e 5f 54 52 55 45 2c 20 30 2c 20  , JSON_TRUE, 0, 
ab80: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  0);.      if( pP
ab90: 61 72 73 65 2d 3e 6f 6f 6d 20 29 20 72 65 74 75  arse->oom ) retu
aba0: 72 6e 20 30 3b 0a 20 20 20 20 20 20 6a 73 6f 6e  rn 0;.      json
abb0: 52 65 6d 6f 76 65 41 6c 6c 4e 75 6c 6c 73 28 70  RemoveAllNulls(p
abc0: 50 61 74 63 68 29 3b 0a 20 20 20 20 20 20 70 54  Patch);.      pT
abd0: 61 72 67 65 74 20 3d 20 26 70 50 61 72 73 65 2d  arget = &pParse-
abe0: 3e 61 4e 6f 64 65 5b 69 54 61 72 67 65 74 5d 3b  >aNode[iTarget];
abf0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61  .      pParse->a
ac00: 4e 6f 64 65 5b 69 52 6f 6f 74 5d 2e 6a 6e 46 6c  Node[iRoot].jnFl
ac10: 61 67 73 20 7c 3d 20 4a 4e 4f 44 45 5f 41 50 50  ags |= JNODE_APP
ac20: 45 4e 44 3b 0a 20 20 20 20 20 20 70 50 61 72 73  END;.      pPars
ac30: 65 2d 3e 61 4e 6f 64 65 5b 69 52 6f 6f 74 5d 2e  e->aNode[iRoot].
ac40: 75 2e 69 41 70 70 65 6e 64 20 3d 20 69 53 74 61  u.iAppend = iSta
ac50: 72 74 20 2d 20 69 52 6f 6f 74 3b 0a 20 20 20 20  rt - iRoot;.    
ac60: 20 20 69 52 6f 6f 74 20 3d 20 69 53 74 61 72 74    iRoot = iStart
ac70: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
ac80: 61 4e 6f 64 65 5b 69 50 61 74 63 68 5d 2e 6a 6e  aNode[iPatch].jn
ac90: 46 6c 61 67 73 20 7c 3d 20 4a 4e 4f 44 45 5f 50  Flags |= JNODE_P
aca0: 41 54 43 48 3b 0a 20 20 20 20 20 20 70 50 61 72  ATCH;.      pPar
acb0: 73 65 2d 3e 61 4e 6f 64 65 5b 69 50 61 74 63 68  se->aNode[iPatch
acc0: 5d 2e 75 2e 70 50 61 74 63 68 20 3d 20 26 70 50  ].u.pPatch = &pP
acd0: 61 74 63 68 5b 69 2b 31 5d 3b 0a 20 20 20 20 7d  atch[i+1];.    }
ace0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54  .  }.  return pT
acf0: 61 72 67 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  arget;.}../*.** 
ad00: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
ad10: 66 20 74 68 65 20 6a 73 6f 6e 5f 6d 65 72 67 65  f the json_merge
ad20: 70 61 74 63 68 28 4a 53 4f 4e 31 2c 4a 53 4f 4e  patch(JSON1,JSON
ad30: 32 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 52 65  2) function.  Re
ad40: 74 75 72 6e 20 61 20 4a 53 4f 4e 0a 2a 2a 20 6f  turn a JSON.** o
ad50: 62 6a 65 63 74 20 74 68 61 74 20 69 73 20 74 68  bject that is th
ad60: 65 20 72 65 73 75 6c 74 20 6f 66 20 72 75 6e 6e  e result of runn
ad70: 69 6e 67 20 74 68 65 20 52 46 43 20 37 33 39 36  ing the RFC 7396
ad80: 20 4d 65 72 67 65 50 61 74 63 68 28 29 20 61 6c   MergePatch() al
ad90: 67 6f 72 69 74 68 6d 0a 2a 2a 20 6f 6e 20 74 68  gorithm.** on th
ada0: 65 20 74 77 6f 20 61 72 67 75 6d 65 6e 74 73 2e  e two arguments.
adb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
adc0: 6a 73 6f 6e 50 61 74 63 68 46 75 6e 63 28 0a 20  jsonPatchFunc(. 
add0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
ade0: 20 2a 63 74 78 2c 0a 20 20 69 6e 74 20 61 72 67   *ctx,.  int arg
adf0: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
ae00: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 4a  ue **argv.){.  J
ae10: 73 6f 6e 50 61 72 73 65 20 78 3b 20 20 20 20 20  sonParse x;     
ae20: 2f 2a 20 54 68 65 20 4a 53 4f 4e 20 74 68 61 74  /* The JSON that
ae30: 20 69 73 20 62 65 69 6e 67 20 70 61 74 63 68 65   is being patche
ae40: 64 20 2a 2f 0a 20 20 4a 73 6f 6e 50 61 72 73 65  d */.  JsonParse
ae50: 20 79 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70   y;     /* The p
ae60: 61 74 63 68 20 2a 2f 0a 20 20 4a 73 6f 6e 4e 6f  atch */.  JsonNo
ae70: 64 65 20 2a 70 52 65 73 75 6c 74 3b 20 20 20 2f  de *pResult;   /
ae80: 2a 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20  * The result of 
ae90: 74 68 65 20 6d 65 72 67 65 20 2a 2f 0a 0a 20 20  the merge */..  
aea0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 61 72 67  UNUSED_PARAM(arg
aeb0: 63 29 3b 0a 20 20 69 66 28 20 6a 73 6f 6e 50 61  c);.  if( jsonPa
aec0: 72 73 65 28 26 78 2c 20 63 74 78 2c 20 28 63 6f  rse(&x, ctx, (co
aed0: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
aee0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
aef0: 76 5b 30 5d 29 29 20 29 20 72 65 74 75 72 6e 3b  v[0])) ) return;
af00: 0a 20 20 69 66 28 20 6a 73 6f 6e 50 61 72 73 65  .  if( jsonParse
af10: 28 26 79 2c 20 63 74 78 2c 20 28 63 6f 6e 73 74  (&y, ctx, (const
af20: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
af30: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31  alue_text(argv[1
af40: 5d 29 29 20 29 7b 0a 20 20 20 20 6a 73 6f 6e 50  ])) ){.    jsonP
af50: 61 72 73 65 52 65 73 65 74 28 26 78 29 3b 0a 20  arseReset(&x);. 
af60: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
af70: 20 70 52 65 73 75 6c 74 20 3d 20 6a 73 6f 6e 4d   pResult = jsonM
af80: 65 72 67 65 50 61 74 63 68 28 26 78 2c 20 30 2c  ergePatch(&x, 0,
af90: 20 79 2e 61 4e 6f 64 65 29 3b 0a 20 20 61 73 73   y.aNode);.  ass
afa0: 65 72 74 28 20 70 52 65 73 75 6c 74 21 3d 30 20  ert( pResult!=0 
afb0: 7c 7c 20 78 2e 6f 6f 6d 20 29 3b 0a 20 20 69 66  || x.oom );.  if
afc0: 28 20 70 52 65 73 75 6c 74 20 29 7b 0a 20 20 20  ( pResult ){.   
afd0: 20 6a 73 6f 6e 52 65 74 75 72 6e 4a 73 6f 6e 28   jsonReturnJson(
afe0: 70 52 65 73 75 6c 74 2c 20 63 74 78 2c 20 30 29  pResult, ctx, 0)
aff0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
b000: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
b010: 72 6f 72 5f 6e 6f 6d 65 6d 28 63 74 78 29 3b 0a  ror_nomem(ctx);.
b020: 20 20 7d 0a 20 20 6a 73 6f 6e 50 61 72 73 65 52    }.  jsonParseR
b030: 65 73 65 74 28 26 78 29 3b 0a 20 20 6a 73 6f 6e  eset(&x);.  json
b040: 50 61 72 73 65 52 65 73 65 74 28 26 79 29 3b 0a  ParseReset(&y);.
b050: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  }.../*.** Implem
b060: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
b070: 6a 73 6f 6e 5f 6f 62 6a 65 63 74 28 4e 41 4d 45  json_object(NAME
b080: 2c 56 41 4c 55 45 2c 2e 2e 2e 29 20 66 75 6e 63  ,VALUE,...) func
b090: 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 20  tion.  Return a 
b0a0: 4a 53 4f 4e 0a 2a 2a 20 6f 62 6a 65 63 74 20 74  JSON.** object t
b0b0: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  hat contains all
b0c0: 20 6e 61 6d 65 2f 76 61 6c 75 65 20 67 69 76 65   name/value give
b0d0: 6e 20 69 6e 20 61 72 67 75 6d 65 6e 74 73 2e 20  n in arguments. 
b0e0: 20 4f 72 20 69 66 20 61 6e 79 20 6e 61 6d 65 0a   Or if any name.
b0f0: 2a 2a 20 69 73 20 6e 6f 74 20 61 20 73 74 72 69  ** is not a stri
b100: 6e 67 20 6f 72 20 69 66 20 61 6e 79 20 76 61 6c  ng or if any val
b110: 75 65 20 69 73 20 61 20 42 4c 4f 42 2c 20 74 68  ue is a BLOB, th
b120: 72 6f 77 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f  row an error..*/
b130: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f  .static void jso
b140: 6e 4f 62 6a 65 63 74 46 75 6e 63 28 0a 20 20 73  nObjectFunc(.  s
b150: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
b160: 63 74 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ctx,.  int argc,
b170: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
b180: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74   **argv.){.  int
b190: 20 69 3b 0a 20 20 4a 73 6f 6e 53 74 72 69 6e 67   i;.  JsonString
b1a0: 20 6a 78 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61   jx;.  const cha
b1b0: 72 20 2a 7a 3b 0a 20 20 75 33 32 20 6e 3b 0a 0a  r *z;.  u32 n;..
b1c0: 20 20 69 66 28 20 61 72 67 63 26 31 20 29 7b 0a    if( argc&1 ){.
b1d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
b1e0: 6c 74 5f 65 72 72 6f 72 28 63 74 78 2c 20 22 6a  lt_error(ctx, "j
b1f0: 73 6f 6e 5f 6f 62 6a 65 63 74 28 29 20 72 65 71  son_object() req
b200: 75 69 72 65 73 20 61 6e 20 65 76 65 6e 20 6e 75  uires an even nu
b210: 6d 62 65 72 20 22 0a 20 20 20 20 20 20 20 20 20  mber ".         
b220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b230: 20 20 20 20 20 20 20 20 20 22 6f 66 20 61 72 67           "of arg
b240: 75 6d 65 6e 74 73 22 2c 20 2d 31 29 3b 0a 20 20  uments", -1);.  
b250: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
b260: 6a 73 6f 6e 49 6e 69 74 28 26 6a 78 2c 20 63 74  jsonInit(&jx, ct
b270: 78 29 3b 0a 20 20 6a 73 6f 6e 41 70 70 65 6e 64  x);.  jsonAppend
b280: 43 68 61 72 28 26 6a 78 2c 20 27 7b 27 29 3b 0a  Char(&jx, '{');.
b290: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67    for(i=0; i<arg
b2a0: 63 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 69 66  c; i+=2){.    if
b2b0: 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
b2c0: 74 79 70 65 28 61 72 67 76 5b 69 5d 29 21 3d 53  type(argv[i])!=S
b2d0: 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20  QLITE_TEXT ){.  
b2e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
b2f0: 6c 74 5f 65 72 72 6f 72 28 63 74 78 2c 20 22 6a  lt_error(ctx, "j
b300: 73 6f 6e 5f 6f 62 6a 65 63 74 28 29 20 6c 61 62  son_object() lab
b310: 65 6c 73 20 6d 75 73 74 20 62 65 20 54 45 58 54  els must be TEXT
b320: 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 6a 73  ", -1);.      js
b330: 6f 6e 52 65 73 65 74 28 26 6a 78 29 3b 0a 20 20  onReset(&jx);.  
b340: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
b350: 7d 0a 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64  }.    jsonAppend
b360: 53 65 70 61 72 61 74 6f 72 28 26 6a 78 29 3b 0a  Separator(&jx);.
b370: 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 63      z = (const c
b380: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
b390: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 69 5d 29  ue_text(argv[i])
b3a0: 3b 0a 20 20 20 20 6e 20 3d 20 28 75 33 32 29 73  ;.    n = (u32)s
b3b0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
b3c0: 65 73 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20  es(argv[i]);.   
b3d0: 20 6a 73 6f 6e 41 70 70 65 6e 64 53 74 72 69 6e   jsonAppendStrin
b3e0: 67 28 26 6a 78 2c 20 7a 2c 20 6e 29 3b 0a 20 20  g(&jx, z, n);.  
b3f0: 20 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61 72    jsonAppendChar
b400: 28 26 6a 78 2c 20 27 3a 27 29 3b 0a 20 20 20 20  (&jx, ':');.    
b410: 6a 73 6f 6e 41 70 70 65 6e 64 56 61 6c 75 65 28  jsonAppendValue(
b420: 26 6a 78 2c 20 61 72 67 76 5b 69 2b 31 5d 29 3b  &jx, argv[i+1]);
b430: 0a 20 20 7d 0a 20 20 6a 73 6f 6e 41 70 70 65 6e  .  }.  jsonAppen
b440: 64 43 68 61 72 28 26 6a 78 2c 20 27 7d 27 29 3b  dChar(&jx, '}');
b450: 0a 20 20 6a 73 6f 6e 52 65 73 75 6c 74 28 26 6a  .  jsonResult(&j
b460: 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  x);.  sqlite3_re
b470: 73 75 6c 74 5f 73 75 62 74 79 70 65 28 63 74 78  sult_subtype(ctx
b480: 2c 20 4a 53 4f 4e 5f 53 55 42 54 59 50 45 29 3b  , JSON_SUBTYPE);
b490: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 6a 73 6f 6e 5f  .}.../*.** json_
b4a0: 72 65 6d 6f 76 65 28 4a 53 4f 4e 2c 20 50 41 54  remove(JSON, PAT
b4b0: 48 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 52 65  H, ...).**.** Re
b4c0: 6d 6f 76 65 20 74 68 65 20 6e 61 6d 65 64 20 65  move the named e
b4d0: 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 20 4a 53 4f  lements from JSO
b4e0: 4e 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  N and return the
b4f0: 20 72 65 73 75 6c 74 2e 20 20 6d 61 6c 66 6f 72   result.  malfor
b500: 6d 65 64 0a 2a 2a 20 4a 53 4f 4e 20 6f 72 20 50  med.** JSON or P
b510: 41 54 48 20 61 72 67 75 6d 65 6e 74 73 20 72 65  ATH arguments re
b520: 73 75 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f 72  sult in an error
b530: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
b540: 20 6a 73 6f 6e 52 65 6d 6f 76 65 46 75 6e 63 28   jsonRemoveFunc(
b550: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
b560: 78 74 20 2a 63 74 78 2c 0a 20 20 69 6e 74 20 61  xt *ctx,.  int a
b570: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
b580: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
b590: 20 4a 73 6f 6e 50 61 72 73 65 20 78 3b 20 20 20   JsonParse x;   
b5a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
b5b0: 72 73 65 20 2a 2f 0a 20 20 4a 73 6f 6e 4e 6f 64  rse */.  JsonNod
b5c0: 65 20 2a 70 4e 6f 64 65 3b 0a 20 20 63 6f 6e 73  e *pNode;.  cons
b5d0: 74 20 63 68 61 72 20 2a 7a 50 61 74 68 3b 0a 20  t char *zPath;. 
b5e0: 20 75 33 32 20 69 3b 0a 0a 20 20 69 66 28 20 61   u32 i;..  if( a
b5f0: 72 67 63 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a  rgc<1 ) return;.
b600: 20 20 69 66 28 20 6a 73 6f 6e 50 61 72 73 65 28    if( jsonParse(
b610: 26 78 2c 20 63 74 78 2c 20 28 63 6f 6e 73 74 20  &x, ctx, (const 
b620: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
b630: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
b640: 29 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  )) ) return;.  a
b650: 73 73 65 72 74 28 20 78 2e 6e 4e 6f 64 65 20 29  ssert( x.nNode )
b660: 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 28  ;.  for(i=1; i<(
b670: 75 33 32 29 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  u32)argc; i++){.
b680: 20 20 20 20 7a 50 61 74 68 20 3d 20 28 63 6f 6e      zPath = (con
b690: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
b6a0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
b6b0: 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a 50  [i]);.    if( zP
b6c0: 61 74 68 3d 3d 30 20 29 20 67 6f 74 6f 20 72 65  ath==0 ) goto re
b6d0: 6d 6f 76 65 5f 64 6f 6e 65 3b 0a 20 20 20 20 70  move_done;.    p
b6e0: 4e 6f 64 65 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75  Node = jsonLooku
b6f0: 70 28 26 78 2c 20 7a 50 61 74 68 2c 20 30 2c 20  p(&x, zPath, 0, 
b700: 63 74 78 29 3b 0a 20 20 20 20 69 66 28 20 78 2e  ctx);.    if( x.
b710: 6e 45 72 72 20 29 20 67 6f 74 6f 20 72 65 6d 6f  nErr ) goto remo
b720: 76 65 5f 64 6f 6e 65 3b 0a 20 20 20 20 69 66 28  ve_done;.    if(
b730: 20 70 4e 6f 64 65 20 29 20 70 4e 6f 64 65 2d 3e   pNode ) pNode->
b740: 6a 6e 46 6c 61 67 73 20 7c 3d 20 4a 4e 4f 44 45  jnFlags |= JNODE
b750: 5f 52 45 4d 4f 56 45 3b 0a 20 20 7d 0a 20 20 69  _REMOVE;.  }.  i
b760: 66 28 20 28 78 2e 61 4e 6f 64 65 5b 30 5d 2e 6a  f( (x.aNode[0].j
b770: 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 52  nFlags & JNODE_R
b780: 45 4d 4f 56 45 29 3d 3d 30 20 29 7b 0a 20 20 20  EMOVE)==0 ){.   
b790: 20 6a 73 6f 6e 52 65 74 75 72 6e 4a 73 6f 6e 28   jsonReturnJson(
b7a0: 78 2e 61 4e 6f 64 65 2c 20 63 74 78 2c 20 30 29  x.aNode, ctx, 0)
b7b0: 3b 0a 20 20 7d 0a 72 65 6d 6f 76 65 5f 64 6f 6e  ;.  }.remove_don
b7c0: 65 3a 0a 20 20 6a 73 6f 6e 50 61 72 73 65 52 65  e:.  jsonParseRe
b7d0: 73 65 74 28 26 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  set(&x);.}../*.*
b7e0: 2a 20 6a 73 6f 6e 5f 72 65 70 6c 61 63 65 28 4a  * json_replace(J
b7f0: 53 4f 4e 2c 20 50 41 54 48 2c 20 56 41 4c 55 45  SON, PATH, VALUE
b800: 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 52 65 70  , ...).**.** Rep
b810: 6c 61 63 65 20 74 68 65 20 76 61 6c 75 65 20 61  lace the value a
b820: 74 20 50 41 54 48 20 77 69 74 68 20 56 41 4c 55  t PATH with VALU
b830: 45 2e 20 20 49 66 20 50 41 54 48 20 64 6f 65 73  E.  If PATH does
b840: 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69   not already exi
b850: 73 74 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  st,.** this rout
b860: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ine is a no-op. 
b870: 20 49 66 20 4a 53 4f 4e 20 6f 72 20 50 41 54 48   If JSON or PATH
b880: 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 2c 20 74   is malformed, t
b890: 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  hrow an error..*
b8a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73  /.static void js
b8b0: 6f 6e 52 65 70 6c 61 63 65 46 75 6e 63 28 0a 20  onReplaceFunc(. 
b8c0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
b8d0: 20 2a 63 74 78 2c 0a 20 20 69 6e 74 20 61 72 67   *ctx,.  int arg
b8e0: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
b8f0: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 4a  ue **argv.){.  J
b900: 73 6f 6e 50 61 72 73 65 20 78 3b 20 20 20 20 20  sonParse x;     
b910: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
b920: 65 20 2a 2f 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20  e */.  JsonNode 
b930: 2a 70 4e 6f 64 65 3b 0a 20 20 63 6f 6e 73 74 20  *pNode;.  const 
b940: 63 68 61 72 20 2a 7a 50 61 74 68 3b 0a 20 20 75  char *zPath;.  u
b950: 33 32 20 69 3b 0a 0a 20 20 69 66 28 20 61 72 67  32 i;..  if( arg
b960: 63 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  c<1 ) return;.  
b970: 69 66 28 20 28 61 72 67 63 26 31 29 3d 3d 30 20  if( (argc&1)==0 
b980: 29 20 7b 0a 20 20 20 20 6a 73 6f 6e 57 72 6f 6e  ) {.    jsonWron
b990: 67 4e 75 6d 41 72 67 73 28 63 74 78 2c 20 22 72  gNumArgs(ctx, "r
b9a0: 65 70 6c 61 63 65 22 29 3b 0a 20 20 20 20 72 65  eplace");.    re
b9b0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
b9c0: 6a 73 6f 6e 50 61 72 73 65 28 26 78 2c 20 63 74  jsonParse(&x, ct
b9d0: 78 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  x, (const char*)
b9e0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
b9f0: 78 74 28 61 72 67 76 5b 30 5d 29 29 20 29 20 72  xt(argv[0])) ) r
ba00: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
ba10: 20 78 2e 6e 4e 6f 64 65 20 29 3b 0a 20 20 66 6f   x.nNode );.  fo
ba20: 72 28 69 3d 31 3b 20 69 3c 28 75 33 32 29 61 72  r(i=1; i<(u32)ar
ba30: 67 63 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 7a  gc; i+=2){.    z
ba40: 50 61 74 68 20 3d 20 28 63 6f 6e 73 74 20 63 68  Path = (const ch
ba50: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
ba60: 65 5f 74 65 78 74 28 61 72 67 76 5b 69 5d 29 3b  e_text(argv[i]);
ba70: 0a 20 20 20 20 70 4e 6f 64 65 20 3d 20 6a 73 6f  .    pNode = jso
ba80: 6e 4c 6f 6f 6b 75 70 28 26 78 2c 20 7a 50 61 74  nLookup(&x, zPat
ba90: 68 2c 20 30 2c 20 63 74 78 29 3b 0a 20 20 20 20  h, 0, ctx);.    
baa0: 69 66 28 20 78 2e 6e 45 72 72 20 29 20 67 6f 74  if( x.nErr ) got
bab0: 6f 20 72 65 70 6c 61 63 65 5f 65 72 72 3b 0a 20  o replace_err;. 
bac0: 20 20 20 69 66 28 20 70 4e 6f 64 65 20 29 7b 0a     if( pNode ){.
bad0: 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 6a 6e 46        pNode->jnF
bae0: 6c 61 67 73 20 7c 3d 20 28 75 38 29 4a 4e 4f 44  lags |= (u8)JNOD
baf0: 45 5f 52 45 50 4c 41 43 45 3b 0a 20 20 20 20 20  E_REPLACE;.     
bb00: 20 70 4e 6f 64 65 2d 3e 75 2e 69 52 65 70 6c 61   pNode->u.iRepla
bb10: 63 65 20 3d 20 69 20 2b 20 31 3b 0a 20 20 20 20  ce = i + 1;.    
bb20: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 78 2e 61 4e  }.  }.  if( x.aN
bb30: 6f 64 65 5b 30 5d 2e 6a 6e 46 6c 61 67 73 20 26  ode[0].jnFlags &
bb40: 20 4a 4e 4f 44 45 5f 52 45 50 4c 41 43 45 20 29   JNODE_REPLACE )
bb50: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
bb60: 73 75 6c 74 5f 76 61 6c 75 65 28 63 74 78 2c 20  sult_value(ctx, 
bb70: 61 72 67 76 5b 78 2e 61 4e 6f 64 65 5b 30 5d 2e  argv[x.aNode[0].
bb80: 75 2e 69 52 65 70 6c 61 63 65 5d 29 3b 0a 20 20  u.iReplace]);.  
bb90: 7d 65 6c 73 65 7b 0a 20 20 20 20 6a 73 6f 6e 52  }else{.    jsonR
bba0: 65 74 75 72 6e 4a 73 6f 6e 28 78 2e 61 4e 6f 64  eturnJson(x.aNod
bbb0: 65 2c 20 63 74 78 2c 20 61 72 67 76 29 3b 0a 20  e, ctx, argv);. 
bbc0: 20 7d 0a 72 65 70 6c 61 63 65 5f 65 72 72 3a 0a   }.replace_err:.
bbd0: 20 20 6a 73 6f 6e 50 61 72 73 65 52 65 73 65 74    jsonParseReset
bbe0: 28 26 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 6a  (&x);.}../*.** j
bbf0: 73 6f 6e 5f 73 65 74 28 4a 53 4f 4e 2c 20 50 41  son_set(JSON, PA
bc00: 54 48 2c 20 56 41 4c 55 45 2c 20 2e 2e 2e 29 0a  TH, VALUE, ...).
bc10: 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61  **.** Set the va
bc20: 6c 75 65 20 61 74 20 50 41 54 48 20 74 6f 20 56  lue at PATH to V
bc30: 41 4c 55 45 2e 20 20 43 72 65 61 74 65 20 74 68  ALUE.  Create th
bc40: 65 20 50 41 54 48 20 69 66 20 69 74 20 64 6f 65  e PATH if it doe
bc50: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a  s not already.**
bc60: 20 65 78 69 73 74 2e 20 20 4f 76 65 72 77 72 69   exist.  Overwri
bc70: 74 65 20 65 78 69 73 74 69 6e 67 20 76 61 6c 75  te existing valu
bc80: 65 73 20 74 68 61 74 20 64 6f 20 65 78 69 73 74  es that do exist
bc90: 2e 0a 2a 2a 20 49 66 20 4a 53 4f 4e 20 6f 72 20  ..** If JSON or 
bca0: 50 41 54 48 20 69 73 20 6d 61 6c 66 6f 72 6d 65  PATH is malforme
bcb0: 64 2c 20 74 68 72 6f 77 20 61 6e 20 65 72 72 6f  d, throw an erro
bcc0: 72 2e 0a 2a 2a 0a 2a 2a 20 6a 73 6f 6e 5f 69 6e  r..**.** json_in
bcd0: 73 65 72 74 28 4a 53 4f 4e 2c 20 50 41 54 48 2c  sert(JSON, PATH,
bce0: 20 56 41 4c 55 45 2c 20 2e 2e 2e 29 0a 2a 2a 0a   VALUE, ...).**.
bcf0: 2a 2a 20 43 72 65 61 74 65 20 50 41 54 48 20 61  ** Create PATH a
bd00: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74  nd initialize it
bd10: 20 74 6f 20 56 41 4c 55 45 2e 20 20 49 66 20 50   to VALUE.  If P
bd20: 41 54 48 20 61 6c 72 65 61 64 79 20 65 78 69 73  ATH already exis
bd30: 74 73 2c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  ts, this.** rout
bd40: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ine is a no-op. 
bd50: 20 49 66 20 4a 53 4f 4e 20 6f 72 20 50 41 54 48   If JSON or PATH
bd60: 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 2c 20 74   is malformed, t
bd70: 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  hrow an error..*
bd80: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73  /.static void js
bd90: 6f 6e 53 65 74 46 75 6e 63 28 0a 20 20 73 71 6c  onSetFunc(.  sql
bda0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74  ite3_context *ct
bdb0: 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  x,.  int argc,. 
bdc0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
bdd0: 2a 61 72 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e 50  *argv.){.  JsonP
bde0: 61 72 73 65 20 78 3b 20 20 20 20 20 20 20 20 20  arse x;         
bdf0: 20 2f 2a 20 54 68 65 20 70 61 72 73 65 20 2a 2f   /* The parse */
be00: 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f  .  JsonNode *pNo
be10: 64 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  de;.  const char
be20: 20 2a 7a 50 61 74 68 3b 0a 20 20 75 33 32 20 69   *zPath;.  u32 i
be30: 3b 0a 20 20 69 6e 74 20 62 41 70 6e 64 3b 0a 20  ;.  int bApnd;. 
be40: 20 69 6e 74 20 62 49 73 53 65 74 20 3d 20 2a 28   int bIsSet = *(
be50: 69 6e 74 2a 29 73 71 6c 69 74 65 33 5f 75 73 65  int*)sqlite3_use
be60: 72 5f 64 61 74 61 28 63 74 78 29 3b 0a 0a 20 20  r_data(ctx);..  
be70: 69 66 28 20 61 72 67 63 3c 31 20 29 20 72 65 74  if( argc<1 ) ret
be80: 75 72 6e 3b 0a 20 20 69 66 28 20 28 61 72 67 63  urn;.  if( (argc
be90: 26 31 29 3d 3d 30 20 29 20 7b 0a 20 20 20 20 6a  &1)==0 ) {.    j
bea0: 73 6f 6e 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  sonWrongNumArgs(
beb0: 63 74 78 2c 20 62 49 73 53 65 74 20 3f 20 22 73  ctx, bIsSet ? "s
bec0: 65 74 22 20 3a 20 22 69 6e 73 65 72 74 22 29 3b  et" : "insert");
bed0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
bee0: 0a 20 20 69 66 28 20 6a 73 6f 6e 50 61 72 73 65  .  if( jsonParse
bef0: 28 26 78 2c 20 63 74 78 2c 20 28 63 6f 6e 73 74  (&x, ctx, (const
bf00: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
bf10: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
bf20: 5d 29 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ])) ) return;.  
bf30: 61 73 73 65 72 74 28 20 78 2e 6e 4e 6f 64 65 20  assert( x.nNode 
bf40: 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  );.  for(i=1; i<
bf50: 28 75 33 32 29 61 72 67 63 3b 20 69 2b 3d 32 29  (u32)argc; i+=2)
bf60: 7b 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 28 63  {.    zPath = (c
bf70: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
bf80: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
bf90: 67 76 5b 69 5d 29 3b 0a 20 20 20 20 62 41 70 6e  gv[i]);.    bApn
bfa0: 64 20 3d 20 30 3b 0a 20 20 20 20 70 4e 6f 64 65  d = 0;.    pNode
bfb0: 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 28 26 78   = jsonLookup(&x
bfc0: 2c 20 7a 50 61 74 68 2c 20 26 62 41 70 6e 64 2c  , zPath, &bApnd,
bfd0: 20 63 74 78 29 3b 0a 20 20 20 20 69 66 28 20 78   ctx);.    if( x
bfe0: 2e 6f 6f 6d 20 29 7b 0a 20 20 20 20 20 20 73 71  .oom ){.      sq
bff0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
c000: 6f 72 5f 6e 6f 6d 65 6d 28 63 74 78 29 3b 0a 20  or_nomem(ctx);. 
c010: 20 20 20 20 20 67 6f 74 6f 20 6a 73 6f 6e 53 65       goto jsonSe
c020: 74 44 6f 6e 65 3b 0a 20 20 20 20 7d 65 6c 73 65  tDone;.    }else
c030: 20 69 66 28 20 78 2e 6e 45 72 72 20 29 7b 0a 20   if( x.nErr ){. 
c040: 20 20 20 20 20 67 6f 74 6f 20 6a 73 6f 6e 53 65       goto jsonSe
c050: 74 44 6f 6e 65 3b 0a 20 20 20 20 7d 65 6c 73 65  tDone;.    }else
c060: 20 69 66 28 20 70 4e 6f 64 65 20 26 26 20 28 62   if( pNode && (b
c070: 41 70 6e 64 20 7c 7c 20 62 49 73 53 65 74 29 20  Apnd || bIsSet) 
c080: 29 7b 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e  ){.      pNode->
c090: 6a 6e 46 6c 61 67 73 20 7c 3d 20 28 75 38 29 4a  jnFlags |= (u8)J
c0a0: 4e 4f 44 45 5f 52 45 50 4c 41 43 45 3b 0a 20 20  NODE_REPLACE;.  
c0b0: 20 20 20 20 70 4e 6f 64 65 2d 3e 75 2e 69 52 65      pNode->u.iRe
c0c0: 70 6c 61 63 65 20 3d 20 69 20 2b 20 31 3b 0a 20  place = i + 1;. 
c0d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 78     }.  }.  if( x
c0e0: 2e 61 4e 6f 64 65 5b 30 5d 2e 6a 6e 46 6c 61 67  .aNode[0].jnFlag
c0f0: 73 20 26 20 4a 4e 4f 44 45 5f 52 45 50 4c 41 43  s & JNODE_REPLAC
c100: 45 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  E ){.    sqlite3
c110: 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 74  _result_value(ct
c120: 78 2c 20 61 72 67 76 5b 78 2e 61 4e 6f 64 65 5b  x, argv[x.aNode[
c130: 30 5d 2e 75 2e 69 52 65 70 6c 61 63 65 5d 29 3b  0].u.iReplace]);
c140: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6a 73  .  }else{.    js
c150: 6f 6e 52 65 74 75 72 6e 4a 73 6f 6e 28 78 2e 61  onReturnJson(x.a
c160: 4e 6f 64 65 2c 20 63 74 78 2c 20 61 72 67 76 29  Node, ctx, argv)
c170: 3b 0a 20 20 7d 0a 6a 73 6f 6e 53 65 74 44 6f 6e  ;.  }.jsonSetDon
c180: 65 3a 0a 20 20 6a 73 6f 6e 50 61 72 73 65 52 65  e:.  jsonParseRe
c190: 73 65 74 28 26 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  set(&x);.}../*.*
c1a0: 2a 20 6a 73 6f 6e 5f 74 79 70 65 28 4a 53 4f 4e  * json_type(JSON
c1b0: 29 0a 2a 2a 20 6a 73 6f 6e 5f 74 79 70 65 28 4a  ).** json_type(J
c1c0: 53 4f 4e 2c 20 50 41 54 48 29 0a 2a 2a 0a 2a 2a  SON, PATH).**.**
c1d0: 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f 70 2d   Return the top-
c1e0: 6c 65 76 65 6c 20 22 74 79 70 65 22 20 6f 66 20  level "type" of 
c1f0: 61 20 4a 53 4f 4e 20 73 74 72 69 6e 67 2e 20 20  a JSON string.  
c200: 54 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 20 69  Throw an error i
c210: 66 0a 2a 2a 20 65 69 74 68 65 72 20 74 68 65 20  f.** either the 
c220: 4a 53 4f 4e 20 6f 72 20 50 41 54 48 20 69 6e 70  JSON or PATH inp
c230: 75 74 73 20 61 72 65 20 6e 6f 74 20 77 65 6c 6c  uts are not well
c240: 2d 66 6f 72 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74  -formed..*/.stat
c250: 69 63 20 76 6f 69 64 20 6a 73 6f 6e 54 79 70 65  ic void jsonType
c260: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
c270: 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 0a 20 20  context *ctx,.  
c280: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
c290: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
c2a0: 0a 29 7b 0a 20 20 4a 73 6f 6e 50 61 72 73 65 20  .){.  JsonParse 
c2b0: 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  x;          /* T
c2c0: 68 65 20 70 61 72 73 65 20 2a 2f 0a 20 20 63 6f  he parse */.  co
c2d0: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 3b  nst char *zPath;
c2e0: 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f  .  JsonNode *pNo
c2f0: 64 65 3b 0a 0a 20 20 69 66 28 20 6a 73 6f 6e 50  de;..  if( jsonP
c300: 61 72 73 65 28 26 78 2c 20 63 74 78 2c 20 28 63  arse(&x, ctx, (c
c310: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
c320: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
c330: 67 76 5b 30 5d 29 29 20 29 20 72 65 74 75 72 6e  gv[0])) ) return
c340: 3b 0a 20 20 61 73 73 65 72 74 28 20 78 2e 6e 4e  ;.  assert( x.nN
c350: 6f 64 65 20 29 3b 0a 20 20 69 66 28 20 61 72 67  ode );.  if( arg
c360: 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 50 61 74  c==2 ){.    zPat
c370: 68 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  h = (const char*
c380: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
c390: 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  ext(argv[1]);.  
c3a0: 20 20 70 4e 6f 64 65 20 3d 20 6a 73 6f 6e 4c 6f    pNode = jsonLo
c3b0: 6f 6b 75 70 28 26 78 2c 20 7a 50 61 74 68 2c 20  okup(&x, zPath, 
c3c0: 30 2c 20 63 74 78 29 3b 0a 20 20 7d 65 6c 73 65  0, ctx);.  }else
c3d0: 7b 0a 20 20 20 20 70 4e 6f 64 65 20 3d 20 78 2e  {.    pNode = x.
c3e0: 61 4e 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28  aNode;.  }.  if(
c3f0: 20 70 4e 6f 64 65 20 29 7b 0a 20 20 20 20 73 71   pNode ){.    sq
c400: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
c410: 74 28 63 74 78 2c 20 6a 73 6f 6e 54 79 70 65 5b  t(ctx, jsonType[
c420: 70 4e 6f 64 65 2d 3e 65 54 79 70 65 5d 2c 20 2d  pNode->eType], -
c430: 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
c440: 29 3b 0a 20 20 7d 0a 20 20 6a 73 6f 6e 50 61 72  );.  }.  jsonPar
c450: 73 65 52 65 73 65 74 28 26 78 29 3b 0a 7d 0a 0a  seReset(&x);.}..
c460: 2f 2a 0a 2a 2a 20 6a 73 6f 6e 5f 76 61 6c 69 64  /*.** json_valid
c470: 28 4a 53 4f 4e 29 0a 2a 2a 0a 2a 2a 20 52 65 74  (JSON).**.** Ret
c480: 75 72 6e 20 31 20 69 66 20 4a 53 4f 4e 20 69 73  urn 1 if JSON is
c490: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 4a   a well-formed J
c4a0: 53 4f 4e 20 73 74 72 69 6e 67 20 61 63 63 6f 72  SON string accor
c4b0: 64 69 6e 67 20 74 6f 20 52 46 43 2d 37 31 35 39  ding to RFC-7159
c4c0: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 6f 74  ..** Return 0 ot
c4d0: 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
c4e0: 69 63 20 76 6f 69 64 20 6a 73 6f 6e 56 61 6c 69  ic void jsonVali
c4f0: 64 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  dFunc(.  sqlite3
c500: 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 0a 20  _context *ctx,. 
c510: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
c520: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
c530: 76 0a 29 7b 0a 20 20 4a 73 6f 6e 50 61 72 73 65  v.){.  JsonParse
c540: 20 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   x;          /* 
c550: 54 68 65 20 70 61 72 73 65 20 2a 2f 0a 20 20 69  The parse */.  i
c560: 6e 74 20 72 63 20 3d 20 30 3b 0a 0a 20 20 55 4e  nt rc = 0;..  UN
c570: 55 53 45 44 5f 50 41 52 41 4d 28 61 72 67 63 29  USED_PARAM(argc)
c580: 3b 0a 20 20 69 66 28 20 6a 73 6f 6e 50 61 72 73  ;.  if( jsonPars
c590: 65 28 26 78 2c 20 30 2c 20 28 63 6f 6e 73 74 20  e(&x, 0, (const 
c5a0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
c5b0: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
c5c0: 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ))==0 ){.    rc 
c5d0: 3d 20 31 3b 0a 20 20 7d 0a 20 20 6a 73 6f 6e 50  = 1;.  }.  jsonP
c5e0: 61 72 73 65 52 65 73 65 74 28 26 78 29 3b 0a 20  arseReset(&x);. 
c5f0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
c600: 69 6e 74 28 63 74 78 2c 20 72 63 29 3b 0a 7d 0a  int(ctx, rc);.}.
c610: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
c620: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c630: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
c660: 2a 2a 20 41 67 67 72 65 67 61 74 65 20 53 51 4c  ** Aggregate SQL
c670: 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d   function implem
c680: 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 2a 2a 2a 2a  entations.******
c690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c6a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c6b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c6c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c6d0: 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 6a 73  ******/./*.** js
c6e0: 6f 6e 5f 67 72 6f 75 70 5f 61 72 72 61 79 28 56  on_group_array(V
c6f0: 41 4c 55 45 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ALUE).**.** Retu
c700: 72 6e 20 61 20 4a 53 4f 4e 20 61 72 72 61 79 20  rn a JSON array 
c710: 63 6f 6d 70 6f 73 65 64 20 6f 66 20 61 6c 6c 20  composed of all 
c720: 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 61 67  values in the ag
c730: 67 72 65 67 61 74 65 2e 0a 2a 2f 0a 73 74 61 74  gregate..*/.stat
c740: 69 63 20 76 6f 69 64 20 6a 73 6f 6e 41 72 72 61  ic void jsonArra
c750: 79 53 74 65 70 28 0a 20 20 73 71 6c 69 74 65 33  yStep(.  sqlite3
c760: 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 0a 20  _context *ctx,. 
c770: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
c780: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
c790: 76 0a 29 7b 0a 20 20 4a 73 6f 6e 53 74 72 69 6e  v.){.  JsonStrin
c7a0: 67 20 2a 70 53 74 72 3b 0a 20 20 55 4e 55 53 45  g *pStr;.  UNUSE
c7b0: 44 5f 50 41 52 41 4d 28 61 72 67 63 29 3b 0a 20  D_PARAM(argc);. 
c7c0: 20 70 53 74 72 20 3d 20 28 4a 73 6f 6e 53 74 72   pStr = (JsonStr
c7d0: 69 6e 67 2a 29 73 71 6c 69 74 65 33 5f 61 67 67  ing*)sqlite3_agg
c7e0: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63  regate_context(c
c7f0: 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 53 74 72  tx, sizeof(*pStr
c800: 29 29 3b 0a 20 20 69 66 28 20 70 53 74 72 20 29  ));.  if( pStr )
c810: 7b 0a 20 20 20 20 69 66 28 20 70 53 74 72 2d 3e  {.    if( pStr->
c820: 7a 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zBuf==0 ){.     
c830: 20 6a 73 6f 6e 49 6e 69 74 28 70 53 74 72 2c 20   jsonInit(pStr, 
c840: 63 74 78 29 3b 0a 20 20 20 20 20 20 6a 73 6f 6e  ctx);.      json
c850: 41 70 70 65 6e 64 43 68 61 72 28 70 53 74 72 2c  AppendChar(pStr,
c860: 20 27 5b 27 29 3b 0a 20 20 20 20 7d 65 6c 73 65   '[');.    }else
c870: 7b 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65  {.      jsonAppe
c880: 6e 64 43 68 61 72 28 70 53 74 72 2c 20 27 2c 27  ndChar(pStr, ','
c890: 29 3b 0a 20 20 20 20 20 20 70 53 74 72 2d 3e 70  );.      pStr->p
c8a0: 43 74 78 20 3d 20 63 74 78 3b 0a 20 20 20 20 7d  Ctx = ctx;.    }
c8b0: 0a 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 56  .    jsonAppendV
c8c0: 61 6c 75 65 28 70 53 74 72 2c 20 61 72 67 76 5b  alue(pStr, argv[
c8d0: 30 5d 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  0]);.  }.}.stati
c8e0: 63 20 76 6f 69 64 20 6a 73 6f 6e 41 72 72 61 79  c void jsonArray
c8f0: 46 69 6e 61 6c 28 73 71 6c 69 74 65 33 5f 63 6f  Final(sqlite3_co
c900: 6e 74 65 78 74 20 2a 63 74 78 29 7b 0a 20 20 4a  ntext *ctx){.  J
c910: 73 6f 6e 53 74 72 69 6e 67 20 2a 70 53 74 72 3b  sonString *pStr;
c920: 0a 20 20 70 53 74 72 20 3d 20 28 4a 73 6f 6e 53  .  pStr = (JsonS
c930: 74 72 69 6e 67 2a 29 73 71 6c 69 74 65 33 5f 61  tring*)sqlite3_a
c940: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
c950: 28 63 74 78 2c 20 30 29 3b 0a 20 20 69 66 28 20  (ctx, 0);.  if( 
c960: 70 53 74 72 20 29 7b 0a 20 20 20 20 70 53 74 72  pStr ){.    pStr
c970: 2d 3e 70 43 74 78 20 3d 20 63 74 78 3b 0a 20 20  ->pCtx = ctx;.  
c980: 20 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61 72    jsonAppendChar
c990: 28 70 53 74 72 2c 20 27 5d 27 29 3b 0a 20 20 20  (pStr, ']');.   
c9a0: 20 69 66 28 20 70 53 74 72 2d 3e 62 45 72 72 20   if( pStr->bErr 
c9b0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 53 74  ){.      if( pSt
c9c0: 72 2d 3e 62 45 72 72 3d 3d 31 20 29 20 73 71 6c  r->bErr==1 ) sql
c9d0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
c9e0: 72 5f 6e 6f 6d 65 6d 28 63 74 78 29 3b 0a 20 20  r_nomem(ctx);.  
c9f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74 72      assert( pStr
ca00: 2d 3e 62 53 74 61 74 69 63 20 29 3b 0a 20 20 20  ->bStatic );.   
ca10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
ca20: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
ca30: 74 28 63 74 78 2c 20 70 53 74 72 2d 3e 7a 42 75  t(ctx, pStr->zBu
ca40: 66 2c 20 70 53 74 72 2d 3e 6e 55 73 65 64 2c 0a  f, pStr->nUsed,.
ca50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca60: 20 20 20 20 20 20 20 20 20 20 70 53 74 72 2d 3e            pStr->
ca70: 62 53 74 61 74 69 63 20 3f 20 53 51 4c 49 54 45  bStatic ? SQLITE
ca80: 5f 54 52 41 4e 53 49 45 4e 54 20 3a 20 73 71 6c  _TRANSIENT : sql
ca90: 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 20 20  ite3_free);.    
caa0: 20 20 70 53 74 72 2d 3e 62 53 74 61 74 69 63 20    pStr->bStatic 
cab0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
cac0: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
cad0: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 74 78 2c  result_text(ctx,
cae0: 20 22 5b 5d 22 2c 20 32 2c 20 53 51 4c 49 54 45   "[]", 2, SQLITE
caf0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 20 20  _STATIC);.  }.  
cb00: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 73  sqlite3_result_s
cb10: 75 62 74 79 70 65 28 63 74 78 2c 20 4a 53 4f 4e  ubtype(ctx, JSON
cb20: 5f 53 55 42 54 59 50 45 29 3b 0a 7d 0a 0a 2f 2a  _SUBTYPE);.}../*
cb30: 0a 2a 2a 20 6a 73 6f 6e 5f 67 72 6f 75 70 5f 6f  .** json_group_o
cb40: 62 6a 28 4e 41 4d 45 2c 56 41 4c 55 45 29 0a 2a  bj(NAME,VALUE).*
cb50: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 4a 53  *.** Return a JS
cb60: 4f 4e 20 6f 62 6a 65 63 74 20 63 6f 6d 70 6f 73  ON object compos
cb70: 65 64 20 6f 66 20 61 6c 6c 20 6e 61 6d 65 73 20  ed of all names 
cb80: 61 6e 64 20 76 61 6c 75 65 73 20 69 6e 20 74 68  and values in th
cb90: 65 20 61 67 67 72 65 67 61 74 65 2e 0a 2a 2f 0a  e aggregate..*/.
cba0: 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e  static void json
cbb0: 4f 62 6a 65 63 74 53 74 65 70 28 0a 20 20 73 71  ObjectStep(.  sq
cbc0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
cbd0: 74 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  tx,.  int argc,.
cbe0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
cbf0: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e  **argv.){.  Json
cc00: 53 74 72 69 6e 67 20 2a 70 53 74 72 3b 0a 20 20  String *pStr;.  
cc10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
cc20: 20 75 33 32 20 6e 3b 0a 20 20 55 4e 55 53 45 44   u32 n;.  UNUSED
cc30: 5f 50 41 52 41 4d 28 61 72 67 63 29 3b 0a 20 20  _PARAM(argc);.  
cc40: 70 53 74 72 20 3d 20 28 4a 73 6f 6e 53 74 72 69  pStr = (JsonStri
cc50: 6e 67 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72  ng*)sqlite3_aggr
cc60: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 74  egate_context(ct
cc70: 78 2c 20 73 69 7a 65 6f 66 28 2a 70 53 74 72 29  x, sizeof(*pStr)
cc80: 29 3b 0a 20 20 69 66 28 20 70 53 74 72 20 29 7b  );.  if( pStr ){
cc90: 0a 20 20 20 20 69 66 28 20 70 53 74 72 2d 3e 7a  .    if( pStr->z
cca0: 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Buf==0 ){.      
ccb0: 6a 73 6f 6e 49 6e 69 74 28 70 53 74 72 2c 20 63  jsonInit(pStr, c
ccc0: 74 78 29 3b 0a 20 20 20 20 20 20 6a 73 6f 6e 41  tx);.      jsonA
ccd0: 70 70 65 6e 64 43 68 61 72 28 70 53 74 72 2c 20  ppendChar(pStr, 
cce0: 27 7b 27 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  '{');.    }else{
ccf0: 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e  .      jsonAppen
cd00: 64 43 68 61 72 28 70 53 74 72 2c 20 27 2c 27 29  dChar(pStr, ',')
cd10: 3b 0a 20 20 20 20 20 20 70 53 74 72 2d 3e 70 43  ;.      pStr->pC
cd20: 74 78 20 3d 20 63 74 78 3b 0a 20 20 20 20 7d 0a  tx = ctx;.    }.
cd30: 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 63      z = (const c
cd40: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
cd50: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
cd60: 3b 0a 20 20 20 20 6e 20 3d 20 28 75 33 32 29 73  ;.    n = (u32)s
cd70: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
cd80: 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  es(argv[0]);.   
cd90: 20 6a 73 6f 6e 41 70 70 65 6e 64 53 74 72 69 6e   jsonAppendStrin
cda0: 67 28 70 53 74 72 2c 20 7a 2c 20 6e 29 3b 0a 20  g(pStr, z, n);. 
cdb0: 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61     jsonAppendCha
cdc0: 72 28 70 53 74 72 2c 20 27 3a 27 29 3b 0a 20 20  r(pStr, ':');.  
cdd0: 20 20 6a 73 6f 6e 41 70 70 65 6e 64 56 61 6c 75    jsonAppendValu
cde0: 65 28 70 53 74 72 2c 20 61 72 67 76 5b 31 5d 29  e(pStr, argv[1])
cdf0: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
ce00: 6f 69 64 20 6a 73 6f 6e 4f 62 6a 65 63 74 46 69  oid jsonObjectFi
ce10: 6e 61 6c 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  nal(sqlite3_cont
ce20: 65 78 74 20 2a 63 74 78 29 7b 0a 20 20 4a 73 6f  ext *ctx){.  Jso
ce30: 6e 53 74 72 69 6e 67 20 2a 70 53 74 72 3b 0a 20  nString *pStr;. 
ce40: 20 70 53 74 72 20 3d 20 28 4a 73 6f 6e 53 74 72   pStr = (JsonStr
ce50: 69 6e 67 2a 29 73 71 6c 69 74 65 33 5f 61 67 67  ing*)sqlite3_agg
ce60: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63  regate_context(c
ce70: 74 78 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53  tx, 0);.  if( pS
ce80: 74 72 20 29 7b 0a 20 20 20 20 6a 73 6f 6e 41 70  tr ){.    jsonAp
ce90: 70 65 6e 64 43 68 61 72 28 70 53 74 72 2c 20 27  pendChar(pStr, '
cea0: 7d 27 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74  }');.    if( pSt
ceb0: 72 2d 3e 62 45 72 72 20 29 7b 0a 20 20 20 20 20  r->bErr ){.     
cec0: 20 69 66 28 20 70 53 74 72 2d 3e 62 45 72 72 3d   if( pStr->bErr=
ced0: 3d 31 20 29 20 73 71 6c 69 74 65 33 5f 72 65 73  =1 ) sqlite3_res
cee0: 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28  ult_error_nomem(
cef0: 63 74 78 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ctx);.      asse
cf00: 72 74 28 20 70 53 74 72 2d 3e 62 53 74 61 74 69  rt( pStr->bStati
cf10: 63 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  c );.    }else{.
cf20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
cf30: 73 75 6c 74 5f 74 65 78 74 28 63 74 78 2c 20 70  sult_text(ctx, p
cf40: 53 74 72 2d 3e 7a 42 75 66 2c 20 70 53 74 72 2d  Str->zBuf, pStr-
cf50: 3e 6e 55 73 65 64 2c 0a 20 20 20 20 20 20 20 20  >nUsed,.        
cf60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf70: 20 20 70 53 74 72 2d 3e 62 53 74 61 74 69 63 20    pStr->bStatic 
cf80: 3f 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  ? SQLITE_TRANSIE
cf90: 4e 54 20 3a 20 73 71 6c 69 74 65 33 5f 66 72 65  NT : sqlite3_fre
cfa0: 65 29 3b 0a 20 20 20 20 20 20 70 53 74 72 2d 3e  e);.      pStr->
cfb0: 62 53 74 61 74 69 63 20 3d 20 31 3b 0a 20 20 20  bStatic = 1;.   
cfc0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
cfd0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
cfe0: 65 78 74 28 63 74 78 2c 20 22 7b 7d 22 2c 20 32  ext(ctx, "{}", 2
cff0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
d000: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
d010: 72 65 73 75 6c 74 5f 73 75 62 74 79 70 65 28 63  result_subtype(c
d020: 74 78 2c 20 4a 53 4f 4e 5f 53 55 42 54 59 50 45  tx, JSON_SUBTYPE
d030: 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53  );.}...#ifndef S
d040: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
d050: 41 4c 54 41 42 4c 45 0a 2f 2a 2a 2a 2a 2a 2a 2a  ALTABLE./*******
d060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d0a0: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 73 6f  *****.** The jso
d0b0: 6e 5f 65 61 63 68 20 76 69 72 74 75 61 6c 20 74  n_each virtual t
d0c0: 61 62 6c 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  able.***********
d0d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d0e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d0f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d110: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
d120: 74 20 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72  t JsonEachCursor
d130: 20 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 3b   JsonEachCursor;
d140: 0a 73 74 72 75 63 74 20 4a 73 6f 6e 45 61 63 68  .struct JsonEach
d150: 43 75 72 73 6f 72 20 7b 0a 20 20 73 71 6c 69 74  Cursor {.  sqlit
d160: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 62  e3_vtab_cursor b
d170: 61 73 65 3b 20 20 2f 2a 20 42 61 73 65 20 63 6c  ase;  /* Base cl
d180: 61 73 73 20 2d 20 6d 75 73 74 20 62 65 20 66 69  ass - must be fi
d190: 72 73 74 20 2a 2f 0a 20 20 75 33 32 20 69 52 6f  rst */.  u32 iRo
d1a0: 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  wid;            
d1b0: 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 69 64      /* The rowid
d1c0: 20 2a 2f 0a 20 20 75 33 32 20 69 42 65 67 69 6e   */.  u32 iBegin
d1d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d1e0: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 6e 6f   /* The first no
d1f0: 64 65 20 6f 66 20 74 68 65 20 73 63 61 6e 20 2a  de of the scan *
d200: 2f 0a 20 20 75 33 32 20 69 3b 20 20 20 20 20 20  /.  u32 i;      
d210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d220: 2a 20 49 6e 64 65 78 20 69 6e 20 73 50 61 72 73  * Index in sPars
d230: 65 2e 61 4e 6f 64 65 5b 5d 20 6f 66 20 63 75 72  e.aNode[] of cur
d240: 72 65 6e 74 20 72 6f 77 20 2a 2f 0a 20 20 75 33  rent row */.  u3
d250: 32 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20  2 iEnd;         
d260: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 4f 46 20           /* EOF 
d270: 77 68 65 6e 20 69 20 65 71 75 61 6c 73 20 6f 72  when i equals or
d280: 20 65 78 63 65 65 64 73 20 74 68 69 73 20 76 61   exceeds this va
d290: 6c 75 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70  lue */.  u8 eTyp
d2a0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
d2b0: 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74      /* Type of t
d2c0: 6f 70 2d 6c 65 76 65 6c 20 65 6c 65 6d 65 6e 74  op-level element
d2d0: 20 2a 2f 0a 20 20 75 38 20 62 52 65 63 75 72 73   */.  u8 bRecurs
d2e0: 69 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ive;            
d2f0: 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 6a 73 6f   /* True for jso
d300: 6e 5f 74 72 65 65 28 29 2e 20 20 46 61 6c 73 65  n_tree().  False
d310: 20 66 6f 72 20 6a 73 6f 6e 5f 65 61 63 68 28 29   for json_each()
d320: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 73 6f   */.  char *zJso
d330: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
d340: 20 2f 2a 20 49 6e 70 75 74 20 4a 53 4f 4e 20 2a   /* Input JSON *
d350: 2f 0a 20 20 63 68 61 72 20 2a 7a 52 6f 6f 74 3b  /.  char *zRoot;
d360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d370: 2a 20 50 61 74 68 20 62 79 20 77 68 69 63 68 20  * Path by which 
d380: 74 6f 20 66 69 6c 74 65 72 20 7a 4a 73 6f 6e 20  to filter zJson 
d390: 2a 2f 0a 20 20 4a 73 6f 6e 50 61 72 73 65 20 73  */.  JsonParse s
d3a0: 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20  Parse;          
d3b0: 2f 2a 20 50 61 72 73 65 20 6f 66 20 74 68 65 20  /* Parse of the 
d3c0: 69 6e 70 75 74 20 4a 53 4f 4e 20 2a 2f 0a 7d 3b  input JSON */.};
d3d0: 0a 0a 2f 2a 20 43 6f 6e 73 74 72 75 63 74 6f 72  ../* Constructor
d3e0: 20 66 6f 72 20 74 68 65 20 6a 73 6f 6e 5f 65 61   for the json_ea
d3f0: 63 68 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ch virtual table
d400: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a   */.static int j
d410: 73 6f 6e 45 61 63 68 43 6f 6e 6e 65 63 74 28 0a  sonEachConnect(.
d420: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
d430: 20 76 6f 69 64 20 2a 70 41 75 78 2c 0a 20 20 69   void *pAux,.  i
d440: 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63  nt argc, const c
d450: 68 61 72 20 2a 63 6f 6e 73 74 2a 61 72 67 76 2c  har *const*argv,
d460: 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  .  sqlite3_vtab 
d470: 2a 2a 70 70 56 74 61 62 2c 0a 20 20 63 68 61 72  **ppVtab,.  char
d480: 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 73 71   **pzErr.){.  sq
d490: 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 4e 65 77  lite3_vtab *pNew
d4a0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 2f 2a 20  ;.  int rc;../* 
d4b0: 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 73 20 2a  Column numbers *
d4c0: 2f 0a 23 64 65 66 69 6e 65 20 4a 45 41 43 48 5f  /.#define JEACH_
d4d0: 4b 45 59 20 20 20 20 20 30 0a 23 64 65 66 69 6e  KEY     0.#defin
d4e0: 65 20 4a 45 41 43 48 5f 56 41 4c 55 45 20 20 20  e JEACH_VALUE   
d4f0: 31 0a 23 64 65 66 69 6e 65 20 4a 45 41 43 48 5f  1.#define JEACH_
d500: 54 59 50 45 20 20 20 20 32 0a 23 64 65 66 69 6e  TYPE    2.#defin
d510: 65 20 4a 45 41 43 48 5f 41 54 4f 4d 20 20 20 20  e JEACH_ATOM    
d520: 33 0a 23 64 65 66 69 6e 65 20 4a 45 41 43 48 5f  3.#define JEACH_
d530: 49 44 20 20 20 20 20 20 34 0a 23 64 65 66 69 6e  ID      4.#defin
d540: 65 20 4a 45 41 43 48 5f 50 41 52 45 4e 54 20 20  e JEACH_PARENT  
d550: 35 0a 23 64 65 66 69 6e 65 20 4a 45 41 43 48 5f  5.#define JEACH_
d560: 46 55 4c 4c 4b 45 59 20 36 0a 23 64 65 66 69 6e  FULLKEY 6.#defin
d570: 65 20 4a 45 41 43 48 5f 50 41 54 48 20 20 20 20  e JEACH_PATH    
d580: 37 0a 23 64 65 66 69 6e 65 20 4a 45 41 43 48 5f  7.#define JEACH_
d590: 4a 53 4f 4e 20 20 20 20 38 0a 23 64 65 66 69 6e  JSON    8.#defin
d5a0: 65 20 4a 45 41 43 48 5f 52 4f 4f 54 20 20 20 20  e JEACH_ROOT    
d5b0: 39 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  9..  UNUSED_PARA
d5c0: 4d 28 70 7a 45 72 72 29 3b 0a 20 20 55 4e 55 53  M(pzErr);.  UNUS
d5d0: 45 44 5f 50 41 52 41 4d 28 61 72 67 76 29 3b 0a  ED_PARAM(argv);.
d5e0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 61    UNUSED_PARAM(a
d5f0: 72 67 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  rgc);.  UNUSED_P
d600: 41 52 41 4d 28 70 41 75 78 29 3b 0a 20 20 72 63  ARAM(pAux);.  rc
d610: 20 3d 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61   = sqlite3_decla
d620: 72 65 5f 76 74 61 62 28 64 62 2c 20 0a 20 20 20  re_vtab(db, .   
d630: 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
d640: 78 28 6b 65 79 2c 76 61 6c 75 65 2c 74 79 70 65  x(key,value,type
d650: 2c 61 74 6f 6d 2c 69 64 2c 70 61 72 65 6e 74 2c  ,atom,id,parent,
d660: 66 75 6c 6c 6b 65 79 2c 70 61 74 68 2c 22 0a 20  fullkey,path,". 
d670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d680: 20 20 20 22 6a 73 6f 6e 20 48 49 44 44 45 4e 2c     "json HIDDEN,
d690: 72 6f 6f 74 20 48 49 44 44 45 4e 29 22 29 3b 0a  root HIDDEN)");.
d6a0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
d6b0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 4e 65 77 20  _OK ){.    pNew 
d6c0: 3d 20 2a 70 70 56 74 61 62 20 3d 20 73 71 6c 69  = *ppVtab = sqli
d6d0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  te3_malloc( size
d6e0: 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 20  of(*pNew) );.   
d6f0: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
d700: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
d710: 45 4d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  EM;.    memset(p
d720: 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  New, 0, sizeof(*
d730: 70 4e 65 77 29 29 3b 0a 20 20 7d 0a 20 20 72 65  pNew));.  }.  re
d740: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 64  turn rc;.}../* d
d750: 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 6a 73  estructor for js
d760: 6f 6e 5f 65 61 63 68 20 76 69 72 74 75 61 6c 20  on_each virtual 
d770: 74 61 62 6c 65 20 2a 2f 0a 73 74 61 74 69 63 20  table */.static 
d780: 69 6e 74 20 6a 73 6f 6e 45 61 63 68 44 69 73 63  int jsonEachDisc
d790: 6f 6e 6e 65 63 74 28 73 71 6c 69 74 65 33 5f 76  onnect(sqlite3_v
d7a0: 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 73  tab *pVtab){.  s
d7b0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74 61  qlite3_free(pVta
d7c0: 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  b);.  return SQL
d7d0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 63 6f  ITE_OK;.}../* co
d7e0: 6e 73 74 72 75 63 74 6f 72 20 66 6f 72 20 61 20  nstructor for a 
d7f0: 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 20 6f  JsonEachCursor o
d800: 62 6a 65 63 74 20 66 6f 72 20 6a 73 6f 6e 5f 65  bject for json_e
d810: 61 63 68 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63  ach(). */.static
d820: 20 69 6e 74 20 6a 73 6f 6e 45 61 63 68 4f 70 65   int jsonEachOpe
d830: 6e 45 61 63 68 28 73 71 6c 69 74 65 33 5f 76 74  nEach(sqlite3_vt
d840: 61 62 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76  ab *p, sqlite3_v
d850: 74 61 62 5f 63 75 72 73 6f 72 20 2a 2a 70 70 43  tab_cursor **ppC
d860: 75 72 73 6f 72 29 7b 0a 20 20 4a 73 6f 6e 45 61  ursor){.  JsonEa
d870: 63 68 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  chCursor *pCur;.
d880: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28  .  UNUSED_PARAM(
d890: 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 73 71 6c  p);.  pCur = sql
d8a0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
d8b0: 65 6f 66 28 2a 70 43 75 72 29 20 29 3b 0a 20 20  eof(*pCur) );.  
d8c0: 69 66 28 20 70 43 75 72 3d 3d 30 20 29 20 72 65  if( pCur==0 ) re
d8d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
d8e0: 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 75 72  M;.  memset(pCur
d8f0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43 75  , 0, sizeof(*pCu
d900: 72 29 29 3b 0a 20 20 2a 70 70 43 75 72 73 6f 72  r));.  *ppCursor
d910: 20 3d 20 26 70 43 75 72 2d 3e 62 61 73 65 3b 0a   = &pCur->base;.
d920: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d930: 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 63 6f 6e 73 74 72  OK;.}../* constr
d940: 75 63 74 6f 72 20 66 6f 72 20 61 20 4a 73 6f 6e  uctor for a Json
d950: 45 61 63 68 43 75 72 73 6f 72 20 6f 62 6a 65 63  EachCursor objec
d960: 74 20 66 6f 72 20 6a 73 6f 6e 5f 74 72 65 65 28  t for json_tree(
d970: 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ). */.static int
d980: 20 6a 73 6f 6e 45 61 63 68 4f 70 65 6e 54 72 65   jsonEachOpenTre
d990: 65 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a  e(sqlite3_vtab *
d9a0: 70 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  p, sqlite3_vtab_
d9b0: 63 75 72 73 6f 72 20 2a 2a 70 70 43 75 72 73 6f  cursor **ppCurso
d9c0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 6a  r){.  int rc = j
d9d0: 73 6f 6e 45 61 63 68 4f 70 65 6e 45 61 63 68 28  sonEachOpenEach(
d9e0: 70 2c 20 70 70 43 75 72 73 6f 72 29 3b 0a 20 20  p, ppCursor);.  
d9f0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
da00: 4b 20 29 7b 0a 20 20 20 20 4a 73 6f 6e 45 61 63  K ){.    JsonEac
da10: 68 43 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20  hCursor *pCur = 
da20: 28 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 2a  (JsonEachCursor*
da30: 29 2a 70 70 43 75 72 73 6f 72 3b 0a 20 20 20 20  )*ppCursor;.    
da40: 70 43 75 72 2d 3e 62 52 65 63 75 72 73 69 76 65  pCur->bRecursive
da50: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
da60: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 52 65 73  rn rc;.}../* Res
da70: 65 74 20 61 20 4a 73 6f 6e 45 61 63 68 43 75 72  et a JsonEachCur
da80: 73 6f 72 20 62 61 63 6b 20 74 6f 20 69 74 73 20  sor back to its 
da90: 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 2e 20  original state. 
daa0: 20 46 72 65 65 20 61 6e 79 20 6d 65 6d 6f 72 79   Free any memory
dab0: 0a 2a 2a 20 68 65 6c 64 2e 20 2a 2f 0a 73 74 61  .** held. */.sta
dac0: 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 45 61 63  tic void jsonEac
dad0: 68 43 75 72 73 6f 72 52 65 73 65 74 28 4a 73 6f  hCursorReset(Jso
dae0: 6e 45 61 63 68 43 75 72 73 6f 72 20 2a 70 29 7b  nEachCursor *p){
daf0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
db00: 70 2d 3e 7a 4a 73 6f 6e 29 3b 0a 20 20 73 71 6c  p->zJson);.  sql
db10: 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 52 6f  ite3_free(p->zRo
db20: 6f 74 29 3b 0a 20 20 6a 73 6f 6e 50 61 72 73 65  ot);.  jsonParse
db30: 52 65 73 65 74 28 26 70 2d 3e 73 50 61 72 73 65  Reset(&p->sParse
db40: 29 3b 0a 20 20 70 2d 3e 69 52 6f 77 69 64 20 3d  );.  p->iRowid =
db50: 20 30 3b 0a 20 20 70 2d 3e 69 20 3d 20 30 3b 0a   0;.  p->i = 0;.
db60: 20 20 70 2d 3e 69 45 6e 64 20 3d 20 30 3b 0a 20    p->iEnd = 0;. 
db70: 20 70 2d 3e 65 54 79 70 65 20 3d 20 30 3b 0a 20   p->eType = 0;. 
db80: 20 70 2d 3e 7a 4a 73 6f 6e 20 3d 20 30 3b 0a 20   p->zJson = 0;. 
db90: 20 70 2d 3e 7a 52 6f 6f 74 20 3d 20 30 3b 0a 7d   p->zRoot = 0;.}
dba0: 0a 0a 2f 2a 20 44 65 73 74 72 75 63 74 6f 72 20  ../* Destructor 
dbb0: 66 6f 72 20 61 20 6a 73 6f 6e 45 61 63 68 43 75  for a jsonEachCu
dbc0: 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 73  rsor object */.s
dbd0: 74 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e 45 61  tatic int jsonEa
dbe0: 63 68 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  chClose(sqlite3_
dbf0: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72  vtab_cursor *cur
dc00: 29 7b 0a 20 20 4a 73 6f 6e 45 61 63 68 43 75 72  ){.  JsonEachCur
dc10: 73 6f 72 20 2a 70 20 3d 20 28 4a 73 6f 6e 45 61  sor *p = (JsonEa
dc20: 63 68 43 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20  chCursor*)cur;. 
dc30: 20 6a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 52   jsonEachCursorR
dc40: 65 73 65 74 28 70 29 3b 0a 20 20 73 71 6c 69 74  eset(p);.  sqlit
dc50: 65 33 5f 66 72 65 65 28 63 75 72 29 3b 0a 20 20  e3_free(cur);.  
dc60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
dc70: 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 54  ;.}../* Return T
dc80: 52 55 45 20 69 66 20 74 68 65 20 6a 73 6f 6e 45  RUE if the jsonE
dc90: 61 63 68 43 75 72 73 6f 72 20 6f 62 6a 65 63 74  achCursor object
dca0: 20 68 61 73 20 62 65 65 6e 20 61 64 76 61 6e 63   has been advanc
dcb0: 65 64 20 6f 66 66 20 74 68 65 20 65 6e 64 0a 2a  ed off the end.*
dcc0: 2a 20 6f 66 20 74 68 65 20 4a 53 4f 4e 20 6f 62  * of the JSON ob
dcd0: 6a 65 63 74 20 2a 2f 0a 73 74 61 74 69 63 20 69  ject */.static i
dce0: 6e 74 20 6a 73 6f 6e 45 61 63 68 45 6f 66 28 73  nt jsonEachEof(s
dcf0: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
dd00: 6f 72 20 2a 63 75 72 29 7b 0a 20 20 4a 73 6f 6e  or *cur){.  Json
dd10: 45 61 63 68 43 75 72 73 6f 72 20 2a 70 20 3d 20  EachCursor *p = 
dd20: 28 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 2a  (JsonEachCursor*
dd30: 29 63 75 72 3b 0a 20 20 72 65 74 75 72 6e 20 70  )cur;.  return p
dd40: 2d 3e 69 20 3e 3d 20 70 2d 3e 69 45 6e 64 3b 0a  ->i >= p->iEnd;.
dd50: 7d 0a 0a 2f 2a 20 41 64 76 61 6e 63 65 20 74 68  }../* Advance th
dd60: 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
dd70: 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 66 6f 72  next element for
dd80: 20 6a 73 6f 6e 5f 74 72 65 65 28 29 20 2a 2f 0a   json_tree() */.
dd90: 73 74 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e 45  static int jsonE
dda0: 61 63 68 4e 65 78 74 28 73 71 6c 69 74 65 33 5f  achNext(sqlite3_
ddb0: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72  vtab_cursor *cur
ddc0: 29 7b 0a 20 20 4a 73 6f 6e 45 61 63 68 43 75 72  ){.  JsonEachCur
ddd0: 73 6f 72 20 2a 70 20 3d 20 28 4a 73 6f 6e 45 61  sor *p = (JsonEa
dde0: 63 68 43 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20  chCursor*)cur;. 
ddf0: 20 69 66 28 20 70 2d 3e 62 52 65 63 75 72 73 69   if( p->bRecursi
de00: 76 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  ve ){.    if( p-
de10: 3e 73 50 61 72 73 65 2e 61 4e 6f 64 65 5b 70 2d  >sParse.aNode[p-
de20: 3e 69 5d 2e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e  >i].jnFlags & JN
de30: 4f 44 45 5f 4c 41 42 45 4c 20 29 20 70 2d 3e 69  ODE_LABEL ) p->i
de40: 2b 2b 3b 0a 20 20 20 20 70 2d 3e 69 2b 2b 3b 0a  ++;.    p->i++;.
de50: 20 20 20 20 70 2d 3e 69 52 6f 77 69 64 2b 2b 3b      p->iRowid++;
de60: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 3c 70 2d  .    if( p->i<p-
de70: 3e 69 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 75  >iEnd ){.      u
de80: 33 32 20 69 55 70 20 3d 20 70 2d 3e 73 50 61 72  32 iUp = p->sPar
de90: 73 65 2e 61 55 70 5b 70 2d 3e 69 5d 3b 0a 20 20  se.aUp[p->i];.  
dea0: 20 20 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 55      JsonNode *pU
deb0: 70 20 3d 20 26 70 2d 3e 73 50 61 72 73 65 2e 61  p = &p->sParse.a
dec0: 4e 6f 64 65 5b 69 55 70 5d 3b 0a 20 20 20 20 20  Node[iUp];.     
ded0: 20 70 2d 3e 65 54 79 70 65 20 3d 20 70 55 70 2d   p->eType = pUp-
dee0: 3e 65 54 79 70 65 3b 0a 20 20 20 20 20 20 69 66  >eType;.      if
def0: 28 20 70 55 70 2d 3e 65 54 79 70 65 3d 3d 4a 53  ( pUp->eType==JS
df00: 4f 4e 5f 41 52 52 41 59 20 29 7b 0a 20 20 20 20  ON_ARRAY ){.    
df10: 20 20 20 20 69 66 28 20 69 55 70 3d 3d 70 2d 3e      if( iUp==p->
df20: 69 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  i-1 ){.         
df30: 20 70 55 70 2d 3e 75 2e 69 4b 65 79 20 3d 20 30   pUp->u.iKey = 0
df40: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
df50: 0a 20 20 20 20 20 20 20 20 20 20 70 55 70 2d 3e  .          pUp->
df60: 75 2e 69 4b 65 79 2b 2b 3b 0a 20 20 20 20 20 20  u.iKey++;.      
df70: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
df80: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  }.  }else{.    s
df90: 77 69 74 63 68 28 20 70 2d 3e 65 54 79 70 65 20  witch( p->eType 
dfa0: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4a 53  ){.      case JS
dfb0: 4f 4e 5f 41 52 52 41 59 3a 20 7b 0a 20 20 20 20  ON_ARRAY: {.    
dfc0: 20 20 20 20 70 2d 3e 69 20 2b 3d 20 6a 73 6f 6e      p->i += json
dfd0: 4e 6f 64 65 53 69 7a 65 28 26 70 2d 3e 73 50 61  NodeSize(&p->sPa
dfe0: 72 73 65 2e 61 4e 6f 64 65 5b 70 2d 3e 69 5d 29  rse.aNode[p->i])
dff0: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 52 6f  ;.        p->iRo
e000: 77 69 64 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62  wid++;.        b
e010: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
e020: 20 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f 4f 42      case JSON_OB
e030: 4a 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 20 20  JECT: {.        
e040: 70 2d 3e 69 20 2b 3d 20 31 20 2b 20 6a 73 6f 6e  p->i += 1 + json
e050: 4e 6f 64 65 53 69 7a 65 28 26 70 2d 3e 73 50 61  NodeSize(&p->sPa
e060: 72 73 65 2e 61 4e 6f 64 65 5b 70 2d 3e 69 2b 31  rse.aNode[p->i+1
e070: 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69  ]);.        p->i
e080: 52 6f 77 69 64 2b 2b 3b 0a 20 20 20 20 20 20 20  Rowid++;.       
e090: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
e0a0: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b        default: {
e0b0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 20 3d 20  .        p->i = 
e0c0: 70 2d 3e 69 45 6e 64 3b 0a 20 20 20 20 20 20 20  p->iEnd;.       
e0d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
e0e0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
e0f0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
e100: 0a 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 6e  ./* Append the n
e110: 61 6d 65 20 6f 66 20 74 68 65 20 70 61 74 68 20  ame of the path 
e120: 66 6f 72 20 65 6c 65 6d 65 6e 74 20 69 20 74 6f  for element i to
e130: 20 70 53 74 72 0a 2a 2f 0a 73 74 61 74 69 63 20   pStr.*/.static 
e140: 76 6f 69 64 20 6a 73 6f 6e 45 61 63 68 43 6f 6d  void jsonEachCom
e150: 70 75 74 65 50 61 74 68 28 0a 20 20 4a 73 6f 6e  putePath(.  Json
e160: 45 61 63 68 43 75 72 73 6f 72 20 2a 70 2c 20 20  EachCursor *p,  
e170: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
e180: 6f 72 20 2a 2f 0a 20 20 4a 73 6f 6e 53 74 72 69  or */.  JsonStri
e190: 6e 67 20 2a 70 53 74 72 2c 20 20 20 20 20 20 20  ng *pStr,       
e1a0: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61   /* Write the pa
e1b0: 74 68 20 68 65 72 65 20 2a 2f 0a 20 20 75 33 32  th here */.  u32
e1c0: 20 69 20 20 20 20 20 20 20 20 20 20 20 20 20 20   i              
e1d0: 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20 74 6f        /* Path to
e1e0: 20 74 68 69 73 20 65 6c 65 6d 65 6e 74 20 2a 2f   this element */
e1f0: 0a 29 7b 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a  .){.  JsonNode *
e200: 70 4e 6f 64 65 2c 20 2a 70 55 70 3b 0a 20 20 75  pNode, *pUp;.  u
e210: 33 32 20 69 55 70 3b 0a 20 20 69 66 28 20 69 3d  32 iUp;.  if( i=
e220: 3d 30 20 29 7b 0a 20 20 20 20 6a 73 6f 6e 41 70  =0 ){.    jsonAp
e230: 70 65 6e 64 43 68 61 72 28 70 53 74 72 2c 20 27  pendChar(pStr, '
e240: 24 27 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  $');.    return;
e250: 0a 20 20 7d 0a 20 20 69 55 70 20 3d 20 70 2d 3e  .  }.  iUp = p->
e260: 73 50 61 72 73 65 2e 61 55 70 5b 69 5d 3b 0a 20  sParse.aUp[i];. 
e270: 20 6a 73 6f 6e 45 61 63 68 43 6f 6d 70 75 74 65   jsonEachCompute
e280: 50 61 74 68 28 70 2c 20 70 53 74 72 2c 20 69 55  Path(p, pStr, iU
e290: 70 29 3b 0a 20 20 70 4e 6f 64 65 20 3d 20 26 70  p);.  pNode = &p
e2a0: 2d 3e 73 50 61 72 73 65 2e 61 4e 6f 64 65 5b 69  ->sParse.aNode[i
e2b0: 5d 3b 0a 20 20 70 55 70 20 3d 20 26 70 2d 3e 73  ];.  pUp = &p->s
e2c0: 50 61 72 73 65 2e 61 4e 6f 64 65 5b 69 55 70 5d  Parse.aNode[iUp]
e2d0: 3b 0a 20 20 69 66 28 20 70 55 70 2d 3e 65 54 79  ;.  if( pUp->eTy
e2e0: 70 65 3d 3d 4a 53 4f 4e 5f 41 52 52 41 59 20 29  pe==JSON_ARRAY )
e2f0: 7b 0a 20 20 20 20 6a 73 6f 6e 50 72 69 6e 74 66  {.    jsonPrintf
e300: 28 33 30 2c 20 70 53 74 72 2c 20 22 5b 25 64 5d  (30, pStr, "[%d]
e310: 22 2c 20 70 55 70 2d 3e 75 2e 69 4b 65 79 29 3b  ", pUp->u.iKey);
e320: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
e330: 73 65 72 74 28 20 70 55 70 2d 3e 65 54 79 70 65  sert( pUp->eType
e340: 3d 3d 4a 53 4f 4e 5f 4f 42 4a 45 43 54 20 29 3b  ==JSON_OBJECT );
e350: 0a 20 20 20 20 69 66 28 20 28 70 4e 6f 64 65 2d  .    if( (pNode-
e360: 3e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45  >jnFlags & JNODE
e370: 5f 4c 41 42 45 4c 29 3d 3d 30 20 29 20 70 4e 6f  _LABEL)==0 ) pNo
e380: 64 65 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74  de--;.    assert
e390: 28 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65 3d 3d  ( pNode->eType==
e3a0: 4a 53 4f 4e 5f 53 54 52 49 4e 47 20 29 3b 0a 20  JSON_STRING );. 
e3b0: 20 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65     assert( pNode
e3c0: 2d 3e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44  ->jnFlags & JNOD
e3d0: 45 5f 4c 41 42 45 4c 20 29 3b 0a 20 20 20 20 6a  E_LABEL );.    j
e3e0: 73 6f 6e 50 72 69 6e 74 66 28 70 4e 6f 64 65 2d  sonPrintf(pNode-
e3f0: 3e 6e 2b 31 2c 20 70 53 74 72 2c 20 22 2e 25 2e  >n+1, pStr, ".%.
e400: 2a 73 22 2c 20 70 4e 6f 64 65 2d 3e 6e 2d 32 2c  *s", pNode->n-2,
e410: 20 70 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74   pNode->u.zJCont
e420: 65 6e 74 2b 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ent+1);.  }.}../
e430: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
e440: 75 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 2a  ue of a column *
e450: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 73 6f  /.static int jso
e460: 6e 45 61 63 68 43 6f 6c 75 6d 6e 28 0a 20 20 73  nEachColumn(.  s
e470: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
e480: 6f 72 20 2a 63 75 72 2c 20 20 20 2f 2a 20 54 68  or *cur,   /* Th
e490: 65 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 73 71  e cursor */.  sq
e4a0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
e4b0: 74 78 2c 20 20 20 20 20 20 20 2f 2a 20 46 69 72  tx,       /* Fir
e4c0: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73  st argument to s
e4d0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 2e 2e  qlite3_result_..
e4e0: 2e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 69 20 20  .() */.  int i  
e4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e500: 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 63 6f       /* Which co
e510: 6c 75 6d 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a  lumn to return *
e520: 2f 0a 29 7b 0a 20 20 4a 73 6f 6e 45 61 63 68 43  /.){.  JsonEachC
e530: 75 72 73 6f 72 20 2a 70 20 3d 20 28 4a 73 6f 6e  ursor *p = (Json
e540: 45 61 63 68 43 75 72 73 6f 72 2a 29 63 75 72 3b  EachCursor*)cur;
e550: 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 54 68  .  JsonNode *pTh
e560: 69 73 20 3d 20 26 70 2d 3e 73 50 61 72 73 65 2e  is = &p->sParse.
e570: 61 4e 6f 64 65 5b 70 2d 3e 69 5d 3b 0a 20 20 73  aNode[p->i];.  s
e580: 77 69 74 63 68 28 20 69 20 29 7b 0a 20 20 20 20  witch( i ){.    
e590: 63 61 73 65 20 4a 45 41 43 48 5f 4b 45 59 3a 20  case JEACH_KEY: 
e5a0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69  {.      if( p->i
e5b0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
e5c0: 20 20 20 69 66 28 20 70 2d 3e 65 54 79 70 65 3d     if( p->eType=
e5d0: 3d 4a 53 4f 4e 5f 4f 42 4a 45 43 54 20 29 7b 0a  =JSON_OBJECT ){.
e5e0: 20 20 20 20 20 20 20 20 6a 73 6f 6e 52 65 74 75          jsonRetu
e5f0: 72 6e 28 70 54 68 69 73 2c 20 63 74 78 2c 20 30  rn(pThis, ctx, 0
e600: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
e610: 66 28 20 70 2d 3e 65 54 79 70 65 3d 3d 4a 53 4f  f( p->eType==JSO
e620: 4e 5f 41 52 52 41 59 20 29 7b 0a 20 20 20 20 20  N_ARRAY ){.     
e630: 20 20 20 75 33 32 20 69 4b 65 79 3b 0a 20 20 20     u32 iKey;.   
e640: 20 20 20 20 20 69 66 28 20 70 2d 3e 62 52 65 63       if( p->bRec
e650: 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  ursive ){.      
e660: 20 20 20 20 69 66 28 20 70 2d 3e 69 52 6f 77 69      if( p->iRowi
e670: 64 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  d==0 ) break;.  
e680: 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 70          iKey = p
e690: 2d 3e 73 50 61 72 73 65 2e 61 4e 6f 64 65 5b 70  ->sParse.aNode[p
e6a0: 2d 3e 73 50 61 72 73 65 2e 61 55 70 5b 70 2d 3e  ->sParse.aUp[p->
e6b0: 69 5d 5d 2e 75 2e 69 4b 65 79 3b 0a 20 20 20 20  i]].u.iKey;.    
e6c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e6d0: 20 20 20 20 20 69 4b 65 79 20 3d 20 70 2d 3e 69       iKey = p->i
e6e0: 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 7d  Rowid;.        }
e6f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e700: 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 74  _result_int64(ct
e710: 78 2c 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  x, (sqlite3_int6
e720: 34 29 69 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d  4)iKey);.      }
e730: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
e740: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 45 41    }.    case JEA
e750: 43 48 5f 56 41 4c 55 45 3a 20 7b 0a 20 20 20 20  CH_VALUE: {.    
e760: 20 20 69 66 28 20 70 54 68 69 73 2d 3e 6a 6e 46    if( pThis->jnF
e770: 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 4c 41 42  lags & JNODE_LAB
e780: 45 4c 20 29 20 70 54 68 69 73 2b 2b 3b 0a 20 20  EL ) pThis++;.  
e790: 20 20 20 20 6a 73 6f 6e 52 65 74 75 72 6e 28 70      jsonReturn(p
e7a0: 54 68 69 73 2c 20 63 74 78 2c 20 30 29 3b 0a 20  This, ctx, 0);. 
e7b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e7c0: 7d 0a 20 20 20 20 63 61 73 65 20 4a 45 41 43 48  }.    case JEACH
e7d0: 5f 54 59 50 45 3a 20 7b 0a 20 20 20 20 20 20 69  _TYPE: {.      i
e7e0: 66 28 20 70 54 68 69 73 2d 3e 6a 6e 46 6c 61 67  f( pThis->jnFlag
e7f0: 73 20 26 20 4a 4e 4f 44 45 5f 4c 41 42 45 4c 20  s & JNODE_LABEL 
e800: 29 20 70 54 68 69 73 2b 2b 3b 0a 20 20 20 20 20  ) pThis++;.     
e810: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
e820: 74 65 78 74 28 63 74 78 2c 20 6a 73 6f 6e 54 79  text(ctx, jsonTy
e830: 70 65 5b 70 54 68 69 73 2d 3e 65 54 79 70 65 5d  pe[pThis->eType]
e840: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41  , -1, SQLITE_STA
e850: 54 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65 61  TIC);.      brea
e860: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
e870: 65 20 4a 45 41 43 48 5f 41 54 4f 4d 3a 20 7b 0a  e JEACH_ATOM: {.
e880: 20 20 20 20 20 20 69 66 28 20 70 54 68 69 73 2d        if( pThis-
e890: 3e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45  >jnFlags & JNODE
e8a0: 5f 4c 41 42 45 4c 20 29 20 70 54 68 69 73 2b 2b  _LABEL ) pThis++
e8b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 68 69  ;.      if( pThi
e8c0: 73 2d 3e 65 54 79 70 65 3e 3d 4a 53 4f 4e 5f 41  s->eType>=JSON_A
e8d0: 52 52 41 59 20 29 20 62 72 65 61 6b 3b 0a 20 20  RRAY ) break;.  
e8e0: 20 20 20 20 6a 73 6f 6e 52 65 74 75 72 6e 28 70      jsonReturn(p
e8f0: 54 68 69 73 2c 20 63 74 78 2c 20 30 29 3b 0a 20  This, ctx, 0);. 
e900: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e910: 7d 0a 20 20 20 20 63 61 73 65 20 4a 45 41 43 48  }.    case JEACH
e920: 5f 49 44 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  _ID: {.      sql
e930: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
e940: 34 28 63 74 78 2c 20 0a 20 20 20 20 20 20 20 20  4(ctx, .        
e950: 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
e960: 70 2d 3e 69 20 2b 20 28 28 70 54 68 69 73 2d 3e  p->i + ((pThis->
e970: 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f  jnFlags & JNODE_
e980: 4c 41 42 45 4c 29 21 3d 30 29 29 3b 0a 20 20 20  LABEL)!=0));.   
e990: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
e9a0: 20 20 20 20 63 61 73 65 20 4a 45 41 43 48 5f 50      case JEACH_P
e9b0: 41 52 45 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69  ARENT: {.      i
e9c0: 66 28 20 70 2d 3e 69 3e 70 2d 3e 69 42 65 67 69  f( p->i>p->iBegi
e9d0: 6e 20 26 26 20 70 2d 3e 62 52 65 63 75 72 73 69  n && p->bRecursi
e9e0: 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ve ){.        sq
e9f0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
ea00: 36 34 28 63 74 78 2c 20 28 73 71 6c 69 74 65 33  64(ctx, (sqlite3
ea10: 5f 69 6e 74 36 34 29 70 2d 3e 73 50 61 72 73 65  _int64)p->sParse
ea20: 2e 61 55 70 5b 70 2d 3e 69 5d 29 3b 0a 20 20 20  .aUp[p->i]);.   
ea30: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
ea40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
ea50: 20 4a 45 41 43 48 5f 46 55 4c 4c 4b 45 59 3a 20   JEACH_FULLKEY: 
ea60: 7b 0a 20 20 20 20 20 20 4a 73 6f 6e 53 74 72 69  {.      JsonStri
ea70: 6e 67 20 78 3b 0a 20 20 20 20 20 20 6a 73 6f 6e  ng x;.      json
ea80: 49 6e 69 74 28 26 78 2c 20 63 74 78 29 3b 0a 20  Init(&x, ctx);. 
ea90: 20 20 20 20 20 69 66 28 20 70 2d 3e 62 52 65 63       if( p->bRec
eaa0: 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  ursive ){.      
eab0: 20 20 6a 73 6f 6e 45 61 63 68 43 6f 6d 70 75 74    jsonEachComput
eac0: 65 50 61 74 68 28 70 2c 20 26 78 2c 20 70 2d 3e  ePath(p, &x, p->
ead0: 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  i);.      }else{
eae0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
eaf0: 7a 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20 20  zRoot ){.       
eb00: 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 52 61 77     jsonAppendRaw
eb10: 28 26 78 2c 20 70 2d 3e 7a 52 6f 6f 74 2c 20 28  (&x, p->zRoot, (
eb20: 69 6e 74 29 73 74 72 6c 65 6e 28 70 2d 3e 7a 52  int)strlen(p->zR
eb30: 6f 6f 74 29 29 3b 0a 20 20 20 20 20 20 20 20 7d  oot));.        }
eb40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
eb50: 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61 72 28 26  jsonAppendChar(&
eb60: 78 2c 20 27 24 27 29 3b 0a 20 20 20 20 20 20 20  x, '$');.       
eb70: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
eb80: 2d 3e 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f 41 52  ->eType==JSON_AR
eb90: 52 41 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20  RAY ){.         
eba0: 20 6a 73 6f 6e 50 72 69 6e 74 66 28 33 30 2c 20   jsonPrintf(30, 
ebb0: 26 78 2c 20 22 5b 25 64 5d 22 2c 20 70 2d 3e 69  &x, "[%d]", p->i
ebc0: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
ebd0: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 54 79  }else if( p->eTy
ebe0: 70 65 3d 3d 4a 53 4f 4e 5f 4f 42 4a 45 43 54 20  pe==JSON_OBJECT 
ebf0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6a 73 6f  ){.          jso
ec00: 6e 50 72 69 6e 74 66 28 70 54 68 69 73 2d 3e 6e  nPrintf(pThis->n
ec10: 2c 20 26 78 2c 20 22 2e 25 2e 2a 73 22 2c 20 70  , &x, ".%.*s", p
ec20: 54 68 69 73 2d 3e 6e 2d 32 2c 20 70 54 68 69 73  This->n-2, pThis
ec30: 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 2b 31 29  ->u.zJContent+1)
ec40: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
ec50: 20 20 7d 0a 20 20 20 20 20 20 6a 73 6f 6e 52 65    }.      jsonRe
ec60: 73 75 6c 74 28 26 78 29 3b 0a 20 20 20 20 20 20  sult(&x);.      
ec70: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
ec80: 20 63 61 73 65 20 4a 45 41 43 48 5f 50 41 54 48   case JEACH_PATH
ec90: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  : {.      if( p-
eca0: 3e 62 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20  >bRecursive ){. 
ecb0: 20 20 20 20 20 20 20 4a 73 6f 6e 53 74 72 69 6e         JsonStrin
ecc0: 67 20 78 3b 0a 20 20 20 20 20 20 20 20 6a 73 6f  g x;.        jso
ecd0: 6e 49 6e 69 74 28 26 78 2c 20 63 74 78 29 3b 0a  nInit(&x, ctx);.
ece0: 20 20 20 20 20 20 20 20 6a 73 6f 6e 45 61 63 68          jsonEach
ecf0: 43 6f 6d 70 75 74 65 50 61 74 68 28 70 2c 20 26  ComputePath(p, &
ed00: 78 2c 20 70 2d 3e 73 50 61 72 73 65 2e 61 55 70  x, p->sParse.aUp
ed10: 5b 70 2d 3e 69 5d 29 3b 0a 20 20 20 20 20 20 20  [p->i]);.       
ed20: 20 6a 73 6f 6e 52 65 73 75 6c 74 28 26 78 29 3b   jsonResult(&x);
ed30: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
ed40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
ed50: 20 46 6f 72 20 6a 73 6f 6e 5f 65 61 63 68 28 29   For json_each()
ed60: 20 70 61 74 68 20 61 6e 64 20 72 6f 6f 74 20 61   path and root a
ed70: 72 65 20 74 68 65 20 73 61 6d 65 20 73 6f 20 66  re the same so f
ed80: 61 6c 6c 20 74 68 72 6f 75 67 68 0a 20 20 20 20  all through.    
ed90: 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 72 6f    ** into the ro
eda0: 6f 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d  ot case */.    }
edb0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
edc0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
edd0: 20 2a 7a 52 6f 6f 74 20 3d 20 70 2d 3e 7a 52 6f   *zRoot = p->zRo
ede0: 6f 74 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52  ot;.      if( zR
edf0: 6f 6f 74 3d 3d 30 20 29 20 7a 52 6f 6f 74 20 3d  oot==0 ) zRoot =
ee00: 20 22 24 22 3b 0a 20 20 20 20 20 20 73 71 6c 69   "$";.      sqli
ee10: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
ee20: 63 74 78 2c 20 7a 52 6f 6f 74 2c 20 2d 31 2c 20  ctx, zRoot, -1, 
ee30: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
ee40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ee50: 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 45 41 43   }.    case JEAC
ee60: 48 5f 4a 53 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  H_JSON: {.      
ee70: 61 73 73 65 72 74 28 20 69 3d 3d 4a 45 41 43 48  assert( i==JEACH
ee80: 5f 4a 53 4f 4e 20 29 3b 0a 20 20 20 20 20 20 73  _JSON );.      s
ee90: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
eea0: 78 74 28 63 74 78 2c 20 70 2d 3e 73 50 61 72 73  xt(ctx, p->sPars
eeb0: 65 2e 7a 4a 73 6f 6e 2c 20 2d 31 2c 20 53 51 4c  e.zJson, -1, SQL
eec0: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
eed0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
eee0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
eef0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 52 65  ITE_OK;.}../* Re
ef00: 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
ef10: 20 72 6f 77 69 64 20 76 61 6c 75 65 20 2a 2f 0a   rowid value */.
ef20: 73 74 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e 45  static int jsonE
ef30: 61 63 68 52 6f 77 69 64 28 73 71 6c 69 74 65 33  achRowid(sqlite3
ef40: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75  _vtab_cursor *cu
ef50: 72 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  r, sqlite_int64 
ef60: 2a 70 52 6f 77 69 64 29 7b 0a 20 20 4a 73 6f 6e  *pRowid){.  Json
ef70: 45 61 63 68 43 75 72 73 6f 72 20 2a 70 20 3d 20  EachCursor *p = 
ef80: 28 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 2a  (JsonEachCursor*
ef90: 29 63 75 72 3b 0a 20 20 2a 70 52 6f 77 69 64 20  )cur;.  *pRowid 
efa0: 3d 20 70 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 72  = p->iRowid;.  r
efb0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
efc0: 0a 7d 0a 0a 2f 2a 20 54 68 65 20 71 75 65 72 79  .}../* The query
efd0: 20 73 74 72 61 74 65 67 79 20 69 73 20 74 6f 20   strategy is to 
efe0: 6c 6f 6f 6b 20 66 6f 72 20 61 6e 20 65 71 75 61  look for an equa
eff0: 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
f000: 6f 6e 20 74 68 65 20 6a 73 6f 6e 0a 2a 2a 20 63  on the json.** c
f010: 6f 6c 75 6d 6e 2e 20 20 57 69 74 68 6f 75 74 20  olumn.  Without 
f020: 73 75 63 68 20 61 20 63 6f 6e 73 74 72 61 69 6e  such a constrain
f030: 74 2c 20 74 68 65 20 74 61 62 6c 65 20 63 61 6e  t, the table can
f040: 6e 6f 74 20 6f 70 65 72 61 74 65 2e 20 20 69 64  not operate.  id
f050: 78 4e 75 6d 20 69 73 0a 2a 2a 20 31 20 69 66 20  xNum is.** 1 if 
f060: 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  the constraint i
f070: 73 20 66 6f 75 6e 64 2c 20 33 20 69 66 20 74 68  s found, 3 if th
f080: 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64  e constraint and
f090: 20 7a 52 6f 6f 74 20 61 72 65 20 66 6f 75 6e 64   zRoot are found
f0a0: 2c 0a 2a 2a 20 61 6e 64 20 30 20 6f 74 68 65 72  ,.** and 0 other
f0b0: 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
f0c0: 69 6e 74 20 6a 73 6f 6e 45 61 63 68 42 65 73 74  int jsonEachBest
f0d0: 49 6e 64 65 78 28 0a 20 20 73 71 6c 69 74 65 33  Index(.  sqlite3
f0e0: 5f 76 74 61 62 20 2a 74 61 62 2c 0a 20 20 73 71  _vtab *tab,.  sq
f0f0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
f100: 20 2a 70 49 64 78 49 6e 66 6f 0a 29 7b 0a 20 20   *pIdxInfo.){.  
f110: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6a 73 6f  int i;.  int jso
f120: 6e 49 64 78 20 3d 20 2d 31 3b 0a 20 20 69 6e 74  nIdx = -1;.  int
f130: 20 72 6f 6f 74 49 64 78 20 3d 20 2d 31 3b 0a 20   rootIdx = -1;. 
f140: 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 71   const struct sq
f150: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
f160: 74 72 61 69 6e 74 20 2a 70 43 6f 6e 73 74 72 61  traint *pConstra
f170: 69 6e 74 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50  int;..  UNUSED_P
f180: 41 52 41 4d 28 74 61 62 29 3b 0a 20 20 70 43 6f  ARAM(tab);.  pCo
f190: 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78 49  nstraint = pIdxI
f1a0: 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
f1b0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
f1c0: 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
f1d0: 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 43 6f 6e 73  aint; i++, pCons
f1e0: 74 72 61 69 6e 74 2b 2b 29 7b 0a 20 20 20 20 69  traint++){.    i
f1f0: 66 28 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e  f( pConstraint->
f200: 75 73 61 62 6c 65 3d 3d 30 20 29 20 63 6f 6e 74  usable==0 ) cont
f210: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 43  inue;.    if( pC
f220: 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f 70 21 3d 53  onstraint->op!=S
f230: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
f240: 54 52 41 49 4e 54 5f 45 51 20 29 20 63 6f 6e 74  TRAINT_EQ ) cont
f250: 69 6e 75 65 3b 0a 20 20 20 20 73 77 69 74 63 68  inue;.    switch
f260: 28 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 69  ( pConstraint->i
f270: 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
f280: 63 61 73 65 20 4a 45 41 43 48 5f 4a 53 4f 4e 3a  case JEACH_JSON:
f290: 20 20 20 6a 73 6f 6e 49 64 78 20 3d 20 69 3b 20     jsonIdx = i; 
f2a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
f2b0: 63 61 73 65 20 4a 45 41 43 48 5f 52 4f 4f 54 3a  case JEACH_ROOT:
f2c0: 20 20 20 72 6f 6f 74 49 64 78 20 3d 20 69 3b 20     rootIdx = i; 
f2d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
f2e0: 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20  default:        
f2f0: 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 20 20     /* no-op */  
f300: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
f310: 20 20 7d 0a 20 20 69 66 28 20 6a 73 6f 6e 49 64    }.  if( jsonId
f320: 78 3c 30 20 29 7b 0a 20 20 20 20 70 49 64 78 49  x<0 ){.    pIdxI
f330: 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b  nfo->idxNum = 0;
f340: 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65  .    pIdxInfo->e
f350: 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 31  stimatedCost = 1
f360: 65 39 39 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  e99;.  }else{.  
f370: 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69    pIdxInfo->esti
f380: 6d 61 74 65 64 43 6f 73 74 20 3d 20 31 2e 30 3b  matedCost = 1.0;
f390: 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61  .    pIdxInfo->a
f3a0: 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
f3b0: 6a 73 6f 6e 49 64 78 5d 2e 61 72 67 76 49 6e 64  jsonIdx].argvInd
f3c0: 65 78 20 3d 20 31 3b 0a 20 20 20 20 70 49 64 78  ex = 1;.    pIdx
f3d0: 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
f3e0: 74 55 73 61 67 65 5b 6a 73 6f 6e 49 64 78 5d 2e  tUsage[jsonIdx].
f3f0: 6f 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 69 66  omit = 1;.    if
f400: 28 20 72 6f 6f 74 49 64 78 3c 30 20 29 7b 0a 20  ( rootIdx<0 ){. 
f410: 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69       pIdxInfo->i
f420: 64 78 4e 75 6d 20 3d 20 31 3b 0a 20 20 20 20 7d  dxNum = 1;.    }
f430: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 64 78  else{.      pIdx
f440: 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
f450: 74 55 73 61 67 65 5b 72 6f 6f 74 49 64 78 5d 2e  tUsage[rootIdx].
f460: 61 72 67 76 49 6e 64 65 78 20 3d 20 32 3b 0a 20  argvIndex = 2;. 
f470: 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61       pIdxInfo->a
f480: 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
f490: 72 6f 6f 74 49 64 78 5d 2e 6f 6d 69 74 20 3d 20  rootIdx].omit = 
f4a0: 31 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66  1;.      pIdxInf
f4b0: 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 33 3b 0a 20  o->idxNum = 3;. 
f4c0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
f4d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
f4e0: 2f 2a 20 53 74 61 72 74 20 61 20 73 65 61 72 63  /* Start a searc
f4f0: 68 20 6f 6e 20 61 20 6e 65 77 20 4a 53 4f 4e 20  h on a new JSON 
f500: 73 74 72 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63  string */.static
f510: 20 69 6e 74 20 6a 73 6f 6e 45 61 63 68 46 69 6c   int jsonEachFil
f520: 74 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ter(.  sqlite3_v
f530: 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 2c  tab_cursor *cur,
f540: 0a 20 20 69 6e 74 20 69 64 78 4e 75 6d 2c 20 63  .  int idxNum, c
f550: 6f 6e 73 74 20 63 68 61 72 20 2a 69 64 78 53 74  onst char *idxSt
f560: 72 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 73  r,.  int argc, s
f570: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
f580: 72 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e 45 61 63  rgv.){.  JsonEac
f590: 68 43 75 72 73 6f 72 20 2a 70 20 3d 20 28 4a 73  hCursor *p = (Js
f5a0: 6f 6e 45 61 63 68 43 75 72 73 6f 72 2a 29 63 75  onEachCursor*)cu
f5b0: 72 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  r;.  const char 
f5c0: 2a 7a 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  *z;.  const char
f5d0: 20 2a 7a 52 6f 6f 74 20 3d 20 30 3b 0a 20 20 73   *zRoot = 0;.  s
f5e0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 3b 0a  qlite3_int64 n;.
f5f0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28  .  UNUSED_PARAM(
f600: 69 64 78 53 74 72 29 3b 0a 20 20 55 4e 55 53 45  idxStr);.  UNUSE
f610: 44 5f 50 41 52 41 4d 28 61 72 67 63 29 3b 0a 20  D_PARAM(argc);. 
f620: 20 6a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 52   jsonEachCursorR
f630: 65 73 65 74 28 70 29 3b 0a 20 20 69 66 28 20 69  eset(p);.  if( i
f640: 64 78 4e 75 6d 3d 3d 30 20 29 20 72 65 74 75 72  dxNum==0 ) retur
f650: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7a  n SQLITE_OK;.  z
f660: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
f670: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
f680: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69  xt(argv[0]);.  i
f690: 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( z==0 ) return
f6a0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6e 20   SQLITE_OK;.  n 
f6b0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
f6c0: 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a  bytes(argv[0]);.
f6d0: 20 20 70 2d 3e 7a 4a 73 6f 6e 20 3d 20 73 71 6c    p->zJson = sql
f6e0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 6e  ite3_malloc64( n
f6f0: 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 7a  +1 );.  if( p->z
f700: 4a 73 6f 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e  Json==0 ) return
f710: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
f720: 20 6d 65 6d 63 70 79 28 70 2d 3e 7a 4a 73 6f 6e   memcpy(p->zJson
f730: 2c 20 7a 2c 20 28 73 69 7a 65 5f 74 29 6e 2b 31  , z, (size_t)n+1
f740: 29 3b 0a 20 20 69 66 28 20 6a 73 6f 6e 50 61 72  );.  if( jsonPar
f750: 73 65 28 26 70 2d 3e 73 50 61 72 73 65 2c 20 30  se(&p->sParse, 0
f760: 2c 20 70 2d 3e 7a 4a 73 6f 6e 29 20 29 7b 0a 20  , p->zJson) ){. 
f770: 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49     int rc = SQLI
f780: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 69 66  TE_NOMEM;.    if
f790: 28 20 70 2d 3e 73 50 61 72 73 65 2e 6f 6f 6d 3d  ( p->sParse.oom=
f7a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
f7b0: 74 65 33 5f 66 72 65 65 28 63 75 72 2d 3e 70 56  te3_free(cur->pV
f7c0: 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  tab->zErrMsg);. 
f7d0: 20 20 20 20 20 63 75 72 2d 3e 70 56 74 61 62 2d       cur->pVtab-
f7e0: 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74  >zErrMsg = sqlit
f7f0: 65 33 5f 6d 70 72 69 6e 74 66 28 22 6d 61 6c 66  e3_mprintf("malf
f800: 6f 72 6d 65 64 20 4a 53 4f 4e 22 29 3b 0a 20 20  ormed JSON");.  
f810: 20 20 20 20 69 66 28 20 63 75 72 2d 3e 70 56 74      if( cur->pVt
f820: 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 20 72 63  ab->zErrMsg ) rc
f830: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
f840: 0a 20 20 20 20 7d 0a 20 20 20 20 6a 73 6f 6e 45  .    }.    jsonE
f850: 61 63 68 43 75 72 73 6f 72 52 65 73 65 74 28 70  achCursorReset(p
f860: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
f870: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
f880: 3e 62 52 65 63 75 72 73 69 76 65 20 26 26 20 6a  >bRecursive && j
f890: 73 6f 6e 50 61 72 73 65 46 69 6e 64 50 61 72 65  sonParseFindPare
f8a0: 6e 74 73 28 26 70 2d 3e 73 50 61 72 73 65 29 20  nts(&p->sParse) 
f8b0: 29 7b 0a 20 20 20 20 6a 73 6f 6e 45 61 63 68 43  ){.    jsonEachC
f8c0: 75 72 73 6f 72 52 65 73 65 74 28 70 29 3b 0a 20  ursorReset(p);. 
f8d0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f8e0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b  _NOMEM;.  }else{
f8f0: 0a 20 20 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70  .    JsonNode *p
f900: 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 69 66  Node = 0;.    if
f910: 28 20 69 64 78 4e 75 6d 3d 3d 33 20 29 7b 0a 20  ( idxNum==3 ){. 
f920: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
f930: 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 20  *zErr = 0;.     
f940: 20 7a 52 6f 6f 74 20 3d 20 28 63 6f 6e 73 74 20   zRoot = (const 
f950: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
f960: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d  lue_text(argv[1]
f970: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 52 6f  );.      if( zRo
f980: 6f 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ot==0 ) return S
f990: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
f9a0: 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  n = sqlite3_valu
f9b0: 65 5f 62 79 74 65 73 28 61 72 67 76 5b 31 5d 29  e_bytes(argv[1])
f9c0: 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 52 6f 6f 74  ;.      p->zRoot
f9d0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
f9e0: 63 36 34 28 20 6e 2b 31 20 29 3b 0a 20 20 20 20  c64( n+1 );.    
f9f0: 20 20 69 66 28 20 70 2d 3e 7a 52 6f 6f 74 3d 3d    if( p->zRoot==
fa00: 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
fa10: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 6d  E_NOMEM;.      m
fa20: 65 6d 63 70 79 28 70 2d 3e 7a 52 6f 6f 74 2c 20  emcpy(p->zRoot, 
fa30: 7a 52 6f 6f 74 2c 20 28 73 69 7a 65 5f 74 29 6e  zRoot, (size_t)n
fa40: 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  +1);.      if( z
fa50: 52 6f 6f 74 5b 30 5d 21 3d 27 24 27 20 29 7b 0a  Root[0]!='$' ){.
fa60: 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20 7a          zErr = z
fa70: 52 6f 6f 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Root;.      }els
fa80: 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 6f 64 65  e{.        pNode
fa90: 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 53 74 65   = jsonLookupSte
faa0: 70 28 26 70 2d 3e 73 50 61 72 73 65 2c 20 30 2c  p(&p->sParse, 0,
fab0: 20 70 2d 3e 7a 52 6f 6f 74 2b 31 2c 20 30 2c 20   p->zRoot+1, 0, 
fac0: 26 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 7d 0a  &zErr);.      }.
fad0: 20 20 20 20 20 20 69 66 28 20 7a 45 72 72 20 29        if( zErr )
fae0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
faf0: 33 5f 66 72 65 65 28 63 75 72 2d 3e 70 56 74 61  3_free(cur->pVta
fb00: 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  b->zErrMsg);.   
fb10: 20 20 20 20 20 63 75 72 2d 3e 70 56 74 61 62 2d       cur->pVtab-
fb20: 3e 7a 45 72 72 4d 73 67 20 3d 20 6a 73 6f 6e 50  >zErrMsg = jsonP
fb30: 61 74 68 53 79 6e 74 61 78 45 72 72 6f 72 28 7a  athSyntaxError(z
fb40: 45 72 72 29 3b 0a 20 20 20 20 20 20 20 20 6a 73  Err);.        js
fb50: 6f 6e 45 61 63 68 43 75 72 73 6f 72 52 65 73 65  onEachCursorRese
fb60: 74 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65  t(p);.        re
fb70: 74 75 72 6e 20 63 75 72 2d 3e 70 56 74 61 62 2d  turn cur->pVtab-
fb80: 3e 7a 45 72 72 4d 73 67 20 3f 20 53 51 4c 49 54  >zErrMsg ? SQLIT
fb90: 45 5f 45 52 52 4f 52 20 3a 20 53 51 4c 49 54 45  E_ERROR : SQLITE
fba0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65  _NOMEM;.      }e
fbb0: 6c 73 65 20 69 66 28 20 70 4e 6f 64 65 3d 3d 30  lse if( pNode==0
fbc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
fbd0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
fbe0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
fbf0: 0a 20 20 20 20 20 20 70 4e 6f 64 65 20 3d 20 70  .      pNode = p
fc00: 2d 3e 73 50 61 72 73 65 2e 61 4e 6f 64 65 3b 0a  ->sParse.aNode;.
fc10: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 42 65      }.    p->iBe
fc20: 67 69 6e 20 3d 20 70 2d 3e 69 20 3d 20 28 69 6e  gin = p->i = (in
fc30: 74 29 28 70 4e 6f 64 65 20 2d 20 70 2d 3e 73 50  t)(pNode - p->sP
fc40: 61 72 73 65 2e 61 4e 6f 64 65 29 3b 0a 20 20 20  arse.aNode);.   
fc50: 20 70 2d 3e 65 54 79 70 65 20 3d 20 70 4e 6f 64   p->eType = pNod
fc60: 65 2d 3e 65 54 79 70 65 3b 0a 20 20 20 20 69 66  e->eType;.    if
fc70: 28 20 70 2d 3e 65 54 79 70 65 3e 3d 4a 53 4f 4e  ( p->eType>=JSON
fc80: 5f 41 52 52 41 59 20 29 7b 0a 20 20 20 20 20 20  _ARRAY ){.      
fc90: 70 4e 6f 64 65 2d 3e 75 2e 69 4b 65 79 20 3d 20  pNode->u.iKey = 
fca0: 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 45 6e 64  0;.      p->iEnd
fcb0: 20 3d 20 70 2d 3e 69 20 2b 20 70 4e 6f 64 65 2d   = p->i + pNode-
fcc0: 3e 6e 20 2b 20 31 3b 0a 20 20 20 20 20 20 69 66  >n + 1;.      if
fcd0: 28 20 70 2d 3e 62 52 65 63 75 72 73 69 76 65 20  ( p->bRecursive 
fce0: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 54  ){.        p->eT
fcf0: 79 70 65 20 3d 20 70 2d 3e 73 50 61 72 73 65 2e  ype = p->sParse.
fd00: 61 4e 6f 64 65 5b 70 2d 3e 73 50 61 72 73 65 2e  aNode[p->sParse.
fd10: 61 55 70 5b 70 2d 3e 69 5d 5d 2e 65 54 79 70 65  aUp[p->i]].eType
fd20: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
fd30: 3e 69 3e 30 20 26 26 20 28 70 2d 3e 73 50 61 72  >i>0 && (p->sPar
fd40: 73 65 2e 61 4e 6f 64 65 5b 70 2d 3e 69 2d 31 5d  se.aNode[p->i-1]
fd50: 2e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45  .jnFlags & JNODE
fd60: 5f 4c 41 42 45 4c 29 21 3d 30 20 29 7b 0a 20 20  _LABEL)!=0 ){.  
fd70: 20 20 20 20 20 20 20 20 70 2d 3e 69 2d 2d 3b 0a          p->i--;.
fd80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
fd90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
fda0: 2d 3e 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  ->i++;.      }. 
fdb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fdc0: 70 2d 3e 69 45 6e 64 20 3d 20 70 2d 3e 69 2b 31  p->iEnd = p->i+1
fdd0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
fde0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
fdf0: 7d 0a 0a 2f 2a 20 54 68 65 20 6d 65 74 68 6f 64  }../* The method
fe00: 73 20 6f 66 20 74 68 65 20 6a 73 6f 6e 5f 65 61  s of the json_ea
fe10: 63 68 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ch virtual table
fe20: 20 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74   */.static sqlit
fe30: 65 33 5f 6d 6f 64 75 6c 65 20 6a 73 6f 6e 45 61  e3_module jsonEa
fe40: 63 68 4d 6f 64 75 6c 65 20 3d 20 7b 0a 20 20 30  chModule = {.  0
fe50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
fe60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
fe70: 72 73 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20  rsion */.  0,   
fe80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe90: 20 20 20 20 20 20 2f 2a 20 78 43 72 65 61 74 65        /* xCreate
fea0: 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 43 6f   */.  jsonEachCo
feb0: 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20 20 20  nnect,          
fec0: 20 2f 2a 20 78 43 6f 6e 6e 65 63 74 20 2a 2f 0a   /* xConnect */.
fed0: 20 20 6a 73 6f 6e 45 61 63 68 42 65 73 74 49 6e    jsonEachBestIn
fee0: 64 65 78 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  dex,         /* 
fef0: 78 42 65 73 74 49 6e 64 65 78 20 2a 2f 0a 20 20  xBestIndex */.  
ff00: 6a 73 6f 6e 45 61 63 68 44 69 73 63 6f 6e 6e 65  jsonEachDisconne
ff10: 63 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 44  ct,        /* xD
ff20: 69 73 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 30  isconnect */.  0
ff30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
ff40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65            /* xDe
ff50: 73 74 72 6f 79 20 2a 2f 0a 20 20 6a 73 6f 6e 45  stroy */.  jsonE
ff60: 61 63 68 4f 70 65 6e 45 61 63 68 2c 20 20 20 20  achOpenEach,    
ff70: 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2d        /* xOpen -
ff80: 20 6f 70 65 6e 20 61 20 63 75 72 73 6f 72 20 2a   open a cursor *
ff90: 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 43 6c 6f 73  /.  jsonEachClos
ffa0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
ffb0: 2a 20 78 43 6c 6f 73 65 20 2d 20 63 6c 6f 73 65  * xClose - close
ffc0: 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 6a   a cursor */.  j
ffd0: 73 6f 6e 45 61 63 68 46 69 6c 74 65 72 2c 20 20  sonEachFilter,  
ffe0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
fff0: 6c 74 65 72 20 2d 20 63 6f 6e 66 69 67 75 72 65  lter - configure
10000 20 73 63 61 6e 20 63 6f 6e 73 74 72 61 69 6e 74   scan constraint
10010 73 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 4e  s */.  jsonEachN
10020 65 78 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ext,            
10030 20 20 2f 2a 20 78 4e 65 78 74 20 2d 20 61 64 76    /* xNext - adv
10040 61 6e 63 65 20 61 20 63 75 72 73 6f 72 20 2a 2f  ance a cursor */
10050 0a 20 20 6a 73 6f 6e 45 61 63 68 45 6f 66 2c 20  .  jsonEachEof, 
10060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10070 20 78 45 6f 66 20 2d 20 63 68 65 63 6b 20 66 6f   xEof - check fo
10080 72 20 65 6e 64 20 6f 66 20 73 63 61 6e 20 2a 2f  r end of scan */
10090 0a 20 20 6a 73 6f 6e 45 61 63 68 43 6f 6c 75 6d  .  jsonEachColum
100a0 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  n,            /*
100b0 20 78 43 6f 6c 75 6d 6e 20 2d 20 72 65 61 64 20   xColumn - read 
100c0 64 61 74 61 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61  data */.  jsonEa
100d0 63 68 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20  chRowid,        
100e0 20 20 20 20 20 2f 2a 20 78 52 6f 77 69 64 20 2d       /* xRowid -
100f0 20 72 65 61 64 20 64 61 74 61 20 2a 2f 0a 20 20   read data */.  
10100 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
10110 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
10120 70 64 61 74 65 20 2a 2f 0a 20 20 30 2c 20 20 20  pdate */.  0,   
10130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10140 20 20 20 20 20 20 2f 2a 20 78 42 65 67 69 6e 20        /* xBegin 
10150 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
10160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10170 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20 30 2c  /* xSync */.  0,
10180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10190 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6d           /* xCom
101a0 6d 69 74 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  mit */.  0,     
101b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101c0 20 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b      /* xRollback
101d0 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
101e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101f0 20 2f 2a 20 78 46 69 6e 64 4d 65 74 68 6f 64 20   /* xFindMethod 
10200 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
10210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10220 2f 2a 20 78 52 65 6e 61 6d 65 20 2a 2f 0a 20 20  /* xRename */.  
10230 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
10240 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
10250 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 30 2c  avepoint */.  0,
10260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10270 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 6c           /* xRel
10280 65 61 73 65 20 2a 2f 0a 20 20 30 20 20 20 20 20  ease */.  0     
10290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102a0 20 20 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63       /* xRollbac
102b0 6b 54 6f 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68  kTo */.};../* Th
102c0 65 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65  e methods of the
102d0 20 6a 73 6f 6e 5f 74 72 65 65 20 76 69 72 74 75   json_tree virtu
102e0 61 6c 20 74 61 62 6c 65 2e 20 2a 2f 0a 73 74 61  al table. */.sta
102f0 74 69 63 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75  tic sqlite3_modu
10300 6c 65 20 6a 73 6f 6e 54 72 65 65 4d 6f 64 75 6c  le jsonTreeModul
10310 65 20 3d 20 7b 0a 20 20 30 2c 20 20 20 20 20 20  e = {.  0,      
10320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10330 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
10340 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
10350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10360 2a 20 78 43 72 65 61 74 65 20 2a 2f 0a 20 20 6a  * xCreate */.  j
10370 73 6f 6e 45 61 63 68 43 6f 6e 6e 65 63 74 2c 20  sonEachConnect, 
10380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f            /* xCo
10390 6e 6e 65 63 74 20 2a 2f 0a 20 20 6a 73 6f 6e 45  nnect */.  jsonE
103a0 61 63 68 42 65 73 74 49 6e 64 65 78 2c 20 20 20  achBestIndex,   
103b0 20 20 20 20 20 20 2f 2a 20 78 42 65 73 74 49 6e        /* xBestIn
103c0 64 65 78 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63  dex */.  jsonEac
103d0 68 44 69 73 63 6f 6e 6e 65 63 74 2c 20 20 20 20  hDisconnect,    
103e0 20 20 20 20 2f 2a 20 78 44 69 73 63 6f 6e 6e 65      /* xDisconne
103f0 63 74 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  ct */.  0,      
10400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10410 20 20 20 2f 2a 20 78 44 65 73 74 72 6f 79 20 2a     /* xDestroy *
10420 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 4f 70 65 6e  /.  jsonEachOpen
10430 54 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f  Tree,          /
10440 2a 20 78 4f 70 65 6e 20 2d 20 6f 70 65 6e 20 61  * xOpen - open a
10450 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 6a 73 6f   cursor */.  jso
10460 6e 45 61 63 68 43 6c 6f 73 65 2c 20 20 20 20 20  nEachClose,     
10470 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
10480 65 20 2d 20 63 6c 6f 73 65 20 61 20 63 75 72 73  e - close a curs
10490 6f 72 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68  or */.  jsonEach
104a0 46 69 6c 74 65 72 2c 20 20 20 20 20 20 20 20 20  Filter,         
104b0 20 20 20 2f 2a 20 78 46 69 6c 74 65 72 20 2d 20     /* xFilter - 
104c0 63 6f 6e 66 69 67 75 72 65 20 73 63 61 6e 20 63  configure scan c
104d0 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
104e0 6a 73 6f 6e 45 61 63 68 4e 65 78 74 2c 20 20 20  jsonEachNext,   
104f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4e             /* xN
10500 65 78 74 20 2d 20 61 64 76 61 6e 63 65 20 61 20  ext - advance a 
10510 63 75 72 73 6f 72 20 2a 2f 0a 20 20 6a 73 6f 6e  cursor */.  json
10520 45 61 63 68 45 6f 66 2c 20 20 20 20 20 20 20 20  EachEof,        
10530 20 20 20 20 20 20 20 2f 2a 20 78 45 6f 66 20 2d         /* xEof -
10540 20 63 68 65 63 6b 20 66 6f 72 20 65 6e 64 20 6f   check for end o
10550 66 20 73 63 61 6e 20 2a 2f 0a 20 20 6a 73 6f 6e  f scan */.  json
10560 45 61 63 68 43 6f 6c 75 6d 6e 2c 20 20 20 20 20  EachColumn,     
10570 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6c 75 6d         /* xColum
10580 6e 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f  n - read data */
10590 0a 20 20 6a 73 6f 6e 45 61 63 68 52 6f 77 69 64  .  jsonEachRowid
105a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
105b0 20 78 52 6f 77 69 64 20 2d 20 72 65 61 64 20 64   xRowid - read d
105c0 61 74 61 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  ata */.  0,     
105d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105e0 20 20 20 20 2f 2a 20 78 55 70 64 61 74 65 20 2a      /* xUpdate *
105f0 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
10600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10610 2a 20 78 42 65 67 69 6e 20 2a 2f 0a 20 20 30 2c  * xBegin */.  0,
10620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10630 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e           /* xSyn
10640 63 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  c */.  0,       
10650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10660 20 20 2f 2a 20 78 43 6f 6d 6d 69 74 20 2a 2f 0a    /* xCommit */.
10670 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
10680 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10690 78 52 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 30  xRollback */.  0
106a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
106b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
106c0 6e 64 4d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 2c  ndMethod */.  0,
106d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106e0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 6e           /* xRen
106f0 61 6d 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  ame */.  0,     
10700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10710 20 20 20 20 2f 2a 20 78 53 61 76 65 70 6f 69 6e      /* xSavepoin
10720 74 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  t */.  0,       
10730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10740 20 20 2f 2a 20 78 52 65 6c 65 61 73 65 20 2a 2f    /* xRelease */
10750 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20  .  0            
10760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10770 20 78 52 6f 6c 6c 62 61 63 6b 54 6f 20 2a 2f 0a   xRollbackTo */.
10780 7d 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  };.#endif /* SQL
10790 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
107a0 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  TABLE */../*****
107b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
107c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
107d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
107e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
107f0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 66  *******.** The f
10800 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
10810 73 20 61 72 65 20 74 68 65 20 6f 6e 6c 79 20 70  s are the only p
10820 75 62 6c 69 63 61 6c 6c 79 20 76 69 73 69 62 6c  ublically visibl
10830 65 20 69 64 65 6e 74 69 66 69 65 72 73 20 69 6e  e identifiers in
10840 20 74 68 69 73 0a 2a 2a 20 66 69 6c 65 2e 20 20   this.** file.  
10850 43 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  Call the followi
10860 6e 67 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 6f  ng routines in o
10870 72 64 65 72 20 74 6f 20 72 65 67 69 73 74 65 72  rder to register
10880 20 74 68 65 20 76 61 72 69 6f 75 73 20 53 51 4c   the various SQL
10890 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e  .** functions an
108a0 64 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  d the virtual ta
108b0 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  ble implemented 
108c0 62 79 20 74 68 69 73 20 66 69 6c 65 2e 0a 2a 2a  by this file..**
108d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
108e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
108f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 69 6e 74  **********/..int
10920 20 73 71 6c 69 74 65 33 4a 73 6f 6e 31 49 6e 69   sqlite3Json1Ini
10930 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
10940 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
10950 45 5f 4f 4b 3b 0a 20 20 75 6e 73 69 67 6e 65 64  E_OK;.  unsigned
10960 20 69 6e 74 20 69 3b 0a 20 20 73 74 61 74 69 63   int i;.  static
10970 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a   const struct {.
10980 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
10990 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 69 6e 74  *zName;.     int
109a0 20 6e 41 72 67 3b 0a 20 20 20 20 20 69 6e 74 20   nArg;.     int 
109b0 66 6c 61 67 3b 0a 20 20 20 20 20 76 6f 69 64 20  flag;.     void 
109c0 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33  (*xFunc)(sqlite3
109d0 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
109e0 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 3b 0a  lite3_value**);.
109f0 20 20 7d 20 61 46 75 6e 63 5b 5d 20 3d 20 7b 0a    } aFunc[] = {.
10a00 20 20 20 20 7b 20 22 6a 73 6f 6e 22 2c 20 20 20      { "json",   
10a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c                1,
10a20 20 30 2c 20 20 20 6a 73 6f 6e 52 65 6d 6f 76 65   0,   jsonRemove
10a30 46 75 6e 63 20 20 20 20 20 20 20 20 7d 2c 0a 20  Func        },. 
10a40 20 20 20 7b 20 22 6a 73 6f 6e 5f 61 72 72 61 79     { "json_array
10a50 22 2c 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20  ",          -1, 
10a60 30 2c 20 20 20 6a 73 6f 6e 41 72 72 61 79 46 75  0,   jsonArrayFu
10a70 6e 63 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  nc         },.  
10a80 20 20 7b 20 22 6a 73 6f 6e 5f 61 72 72 61 79 5f    { "json_array_
10a90 6c 65 6e 67 74 68 22 2c 20 20 20 20 31 2c 20 30  length",    1, 0
10aa0 2c 20 20 20 6a 73 6f 6e 41 72 72 61 79 4c 65 6e  ,   jsonArrayLen
10ab0 67 74 68 46 75 6e 63 20 20 20 7d 2c 0a 20 20 20  gthFunc   },.   
10ac0 20 7b 20 22 6a 73 6f 6e 5f 61 72 72 61 79 5f 6c   { "json_array_l
10ad0 65 6e 67 74 68 22 2c 20 20 20 20 32 2c 20 30 2c  ength",    2, 0,
10ae0 20 20 20 6a 73 6f 6e 41 72 72 61 79 4c 65 6e 67     jsonArrayLeng
10af0 74 68 46 75 6e 63 20 20 20 7d 2c 0a 20 20 20 20  thFunc   },.    
10b00 7b 20 22 6a 73 6f 6e 5f 65 78 74 72 61 63 74 22  { "json_extract"
10b10 2c 20 20 20 20 20 20 20 20 2d 31 2c 20 30 2c 20  ,        -1, 0, 
10b20 20 20 6a 73 6f 6e 45 78 74 72 61 63 74 46 75 6e    jsonExtractFun
10b30 63 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b  c       },.    {
10b40 20 22 6a 73 6f 6e 5f 69 6e 73 65 72 74 22 2c 20   "json_insert", 
10b50 20 20 20 20 20 20 20 20 2d 31 2c 20 30 2c 20 20          -1, 0,  
10b60 20 6a 73 6f 6e 53 65 74 46 75 6e 63 20 20 20 20   jsonSetFunc    
10b70 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
10b80 22 6a 73 6f 6e 5f 6f 62 6a 65 63 74 22 2c 20 20  "json_object",  
10b90 20 20 20 20 20 20 20 2d 31 2c 20 30 2c 20 20 20         -1, 0,   
10ba0 6a 73 6f 6e 4f 62 6a 65 63 74 46 75 6e 63 20 20  jsonObjectFunc  
10bb0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
10bc0 6a 73 6f 6e 5f 70 61 74 63 68 22 2c 20 20 20 20  json_patch",    
10bd0 20 20 20 20 20 20 20 32 2c 20 30 2c 20 20 20 6a         2, 0,   j
10be0 73 6f 6e 50 61 74 63 68 46 75 6e 63 20 20 20 20  sonPatchFunc    
10bf0 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a       },.    { "j
10c00 73 6f 6e 5f 71 75 6f 74 65 22 2c 20 20 20 20 20  son_quote",     
10c10 20 20 20 20 20 20 31 2c 20 30 2c 20 20 20 6a 73        1, 0,   js
10c20 6f 6e 51 75 6f 74 65 46 75 6e 63 20 20 20 20 20  onQuoteFunc     
10c30 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73      },.    { "js
10c40 6f 6e 5f 72 65 6d 6f 76 65 22 2c 20 20 20 20 20  on_remove",     
10c50 20 20 20 20 2d 31 2c 20 30 2c 20 20 20 6a 73 6f      -1, 0,   jso
10c60 6e 52 65 6d 6f 76 65 46 75 6e 63 20 20 20 20 20  nRemoveFunc     
10c70 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f     },.    { "jso
10c80 6e 5f 72 65 70 6c 61 63 65 22 2c 20 20 20 20 20  n_replace",     
10c90 20 20 20 2d 31 2c 20 30 2c 20 20 20 6a 73 6f 6e     -1, 0,   json
10ca0 52 65 70 6c 61 63 65 46 75 6e 63 20 20 20 20 20  ReplaceFunc     
10cb0 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e    },.    { "json
10cc0 5f 73 65 74 22 2c 20 20 20 20 20 20 20 20 20 20  _set",          
10cd0 20 20 2d 31 2c 20 31 2c 20 20 20 6a 73 6f 6e 53    -1, 1,   jsonS
10ce0 65 74 46 75 6e 63 20 20 20 20 20 20 20 20 20 20  etFunc          
10cf0 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f   },.    { "json_
10d00 74 79 70 65 22 2c 20 20 20 20 20 20 20 20 20 20  type",          
10d10 20 20 31 2c 20 30 2c 20 20 20 6a 73 6f 6e 54 79    1, 0,   jsonTy
10d20 70 65 46 75 6e 63 20 20 20 20 20 20 20 20 20 20  peFunc          
10d30 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 74  },.    { "json_t
10d40 79 70 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ype",           
10d50 20 32 2c 20 30 2c 20 20 20 6a 73 6f 6e 54 79 70   2, 0,   jsonTyp
10d60 65 46 75 6e 63 20 20 20 20 20 20 20 20 20 20 7d  eFunc          }
10d70 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 76 61  ,.    { "json_va
10d80 6c 69 64 22 2c 20 20 20 20 20 20 20 20 20 20 20  lid",           
10d90 31 2c 20 30 2c 20 20 20 6a 73 6f 6e 56 61 6c 69  1, 0,   jsonVali
10da0 64 46 75 6e 63 20 20 20 20 20 20 20 20 20 7d 2c  dFunc         },
10db0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42  ..#if SQLITE_DEB
10dc0 55 47 0a 20 20 20 20 2f 2a 20 44 45 42 55 47 20  UG.    /* DEBUG 
10dd0 61 6e 64 20 54 45 53 54 49 4e 47 20 66 75 6e 63  and TESTING func
10de0 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 7b 20 22  tions */.    { "
10df0 6a 73 6f 6e 5f 70 61 72 73 65 22 2c 20 20 20 20  json_parse",    
10e00 20 20 20 20 20 20 20 31 2c 20 30 2c 20 20 20 6a         1, 0,   j
10e10 73 6f 6e 50 61 72 73 65 46 75 6e 63 20 20 20 20  sonParseFunc    
10e20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a       },.    { "j
10e30 73 6f 6e 5f 74 65 73 74 31 22 2c 20 20 20 20 20  son_test1",     
10e40 20 20 20 20 20 20 31 2c 20 30 2c 20 20 20 6a 73        1, 0,   js
10e50 6f 6e 54 65 73 74 31 46 75 6e 63 20 20 20 20 20  onTest1Func     
10e60 20 20 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20      },.#endif.  
10e70 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  };.  static cons
10e80 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20  t struct {.     
10e90 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
10ea0 65 3b 0a 20 20 20 20 20 69 6e 74 20 6e 41 72 67  e;.     int nArg
10eb0 3b 0a 20 20 20 20 20 76 6f 69 64 20 28 2a 78 53  ;.     void (*xS
10ec0 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  tep)(sqlite3_con
10ed0 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
10ee0 33 5f 76 61 6c 75 65 2a 2a 29 3b 0a 20 20 20 20  3_value**);.    
10ef0 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28   void (*xFinal)(
10f00 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
10f10 29 3b 0a 20 20 7d 20 61 41 67 67 5b 5d 20 3d 20  );.  } aAgg[] = 
10f20 7b 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 67 72  {.    { "json_gr
10f30 6f 75 70 5f 61 72 72 61 79 22 2c 20 20 20 20 20  oup_array",     
10f40 31 2c 20 20 20 6a 73 6f 6e 41 72 72 61 79 53 74  1,   jsonArraySt
10f50 65 70 2c 20 20 20 6a 73 6f 6e 41 72 72 61 79 46  ep,   jsonArrayF
10f60 69 6e 61 6c 20 20 7d 2c 0a 20 20 20 20 7b 20 22  inal  },.    { "
10f70 6a 73 6f 6e 5f 67 72 6f 75 70 5f 6f 62 6a 65 63  json_group_objec
10f80 74 22 2c 20 20 20 20 32 2c 20 20 20 6a 73 6f 6e  t",    2,   json
10f90 4f 62 6a 65 63 74 53 74 65 70 2c 20 20 6a 73 6f  ObjectStep,  jso
10fa0 6e 4f 62 6a 65 63 74 46 69 6e 61 6c 20 7d 2c 0a  nObjectFinal },.
10fb0 20 20 7d 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c    };.#ifndef SQL
10fc0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
10fd0 54 41 42 4c 45 0a 20 20 73 74 61 74 69 63 20 63  TABLE.  static c
10fe0 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20  onst struct {.  
10ff0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
11000 4e 61 6d 65 3b 0a 20 20 20 20 20 73 71 6c 69 74  Name;.     sqlit
11010 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75  e3_module *pModu
11020 6c 65 3b 0a 20 20 7d 20 61 4d 6f 64 5b 5d 20 3d  le;.  } aMod[] =
11030 20 7b 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 65   {.    { "json_e
11040 61 63 68 22 2c 20 20 20 20 20 20 20 20 20 20 20  ach",           
11050 20 26 6a 73 6f 6e 45 61 63 68 4d 6f 64 75 6c 65   &jsonEachModule
11060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
11070 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 74 72  ,.    { "json_tr
11080 65 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ee",            
11090 26 6a 73 6f 6e 54 72 65 65 4d 6f 64 75 6c 65 20  &jsonTreeModule 
110a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
110b0 0a 20 20 7d 3b 0a 23 65 6e 64 69 66 0a 20 20 66  .  };.#endif.  f
110c0 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
110d0 28 61 46 75 6e 63 29 2f 73 69 7a 65 6f 66 28 61  (aFunc)/sizeof(a
110e0 46 75 6e 63 5b 30 5d 29 20 26 26 20 72 63 3d 3d  Func[0]) && rc==
110f0 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b  SQLITE_OK; i++){
11100 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
11110 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
11120 6e 28 64 62 2c 20 61 46 75 6e 63 5b 69 5d 2e 7a  n(db, aFunc[i].z
11130 4e 61 6d 65 2c 20 61 46 75 6e 63 5b 69 5d 2e 6e  Name, aFunc[i].n
11140 41 72 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Arg,.           
11150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11160 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46        SQLITE_UTF
11170 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
11180 4d 49 4e 49 53 54 49 43 2c 20 0a 20 20 20 20 20  MINISTIC, .     
11190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111a0 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
111b0 64 2a 29 26 61 46 75 6e 63 5b 69 5d 2e 66 6c 61  d*)&aFunc[i].fla
111c0 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  g,.             
111d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111e0 20 20 20 20 61 46 75 6e 63 5b 69 5d 2e 78 46 75      aFunc[i].xFu
111f0 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  nc, 0, 0);.  }. 
11200 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
11210 6f 66 28 61 41 67 67 29 2f 73 69 7a 65 6f 66 28  of(aAgg)/sizeof(
11220 61 41 67 67 5b 30 5d 29 20 26 26 20 72 63 3d 3d  aAgg[0]) && rc==
11230 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b  SQLITE_OK; i++){
11240 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
11250 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
11260 6e 28 64 62 2c 20 61 41 67 67 5b 69 5d 2e 7a 4e  n(db, aAgg[i].zN
11270 61 6d 65 2c 20 61 41 67 67 5b 69 5d 2e 6e 41 72  ame, aAgg[i].nAr
11280 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  g,.             
11290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112a0 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20      SQLITE_UTF8 
112b0 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
112c0 4e 49 53 54 49 43 2c 20 30 2c 0a 20 20 20 20 20  NISTIC, 0,.     
112d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112e0 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 61              0, a
112f0 41 67 67 5b 69 5d 2e 78 53 74 65 70 2c 20 61 41  Agg[i].xStep, aA
11300 67 67 5b 69 5d 2e 78 46 69 6e 61 6c 29 3b 0a 20  gg[i].xFinal);. 
11310 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
11320 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
11330 42 4c 45 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  BLE.  for(i=0; i
11340 3c 73 69 7a 65 6f 66 28 61 4d 6f 64 29 2f 73 69  <sizeof(aMod)/si
11350 7a 65 6f 66 28 61 4d 6f 64 5b 30 5d 29 20 26 26  zeof(aMod[0]) &&
11360 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
11370 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  i++){.    rc = s
11380 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 6d 6f  qlite3_create_mo
11390 64 75 6c 65 28 64 62 2c 20 61 4d 6f 64 5b 69 5d  dule(db, aMod[i]
113a0 2e 7a 4e 61 6d 65 2c 20 61 4d 6f 64 5b 69 5d 2e  .zName, aMod[i].
113b0 70 4d 6f 64 75 6c 65 2c 20 30 29 3b 0a 20 20 7d  pModule, 0);.  }
113c0 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
113d0 20 72 63 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66   rc;.}...#ifndef
113e0 20 53 51 4c 49 54 45 5f 43 4f 52 45 0a 23 69 66   SQLITE_CORE.#if
113f0 64 65 66 20 5f 57 49 4e 33 32 0a 5f 5f 64 65 63  def _WIN32.__dec
11400 6c 73 70 65 63 28 64 6c 6c 65 78 70 6f 72 74 29  lspec(dllexport)
11410 0a 23 65 6e 64 69 66 0a 69 6e 74 20 73 71 6c 69  .#endif.int sqli
11420 74 65 33 5f 6a 73 6f 6e 5f 69 6e 69 74 28 0a 20  te3_json_init(. 
11430 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20   sqlite3 *db, . 
11440 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67   char **pzErrMsg
11450 2c 20 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  , .  const sqlit
11460 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 20  e3_api_routines 
11470 2a 70 41 70 69 0a 29 7b 0a 20 20 53 51 4c 49 54  *pApi.){.  SQLIT
11480 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54  E_EXTENSION_INIT
11490 32 28 70 41 70 69 29 3b 0a 20 20 28 76 6f 69 64  2(pApi);.  (void
114a0 29 70 7a 45 72 72 4d 73 67 3b 20 20 2f 2a 20 55  )pzErrMsg;  /* U
114b0 6e 75 73 65 64 20 70 61 72 61 6d 65 74 65 72 20  nused parameter 
114c0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  */.  return sqli
114d0 74 65 33 4a 73 6f 6e 31 49 6e 69 74 28 64 62 29  te3Json1Init(db)
114e0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69  ;.}.#endif.#endi
114f0 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
11500 4c 49 54 45 5f 43 4f 52 45 29 20 7c 7c 20 64 65  LITE_CORE) || de
11510 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
11520 42 4c 45 5f 4a 53 4f 4e 31 29 20 2a 2f 0a        BLE_JSON1) */.