/ Hex Artifact Content
Login

Artifact 66ccdfa63283adb2c015019b431eeee1f5af40a78d9aad10afd22c2c6db0e3b0:


0000: 2f 2a 0a 2a 2a 20 32 30 31 35 2d 30 38 2d 31 32  /*.** 2015-08-12
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ****.**.** This 
0180: 53 51 4c 69 74 65 20 65 78 74 65 6e 73 69 6f 6e  SQLite extension
0190: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 4a 53 4f 4e   implements JSON
01a0: 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68 65   functions.  The
01b0: 20 69 6e 74 65 72 66 61 63 65 20 69 73 0a 2a 2a   interface is.**
01c0: 20 6d 6f 64 65 6c 65 64 20 61 66 74 65 72 20 4d   modeled after M
01d0: 79 53 51 4c 20 4a 53 4f 4e 20 66 75 6e 63 74 69  ySQL JSON functi
01e0: 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 68  ons:.**.**     h
01f0: 74 74 70 73 3a 2f 2f 64 65 76 2e 6d 79 73 71 6c  ttps://dev.mysql
0200: 2e 63 6f 6d 2f 64 6f 63 2f 72 65 66 6d 61 6e 2f  .com/doc/refman/
0210: 35 2e 37 2f 65 6e 2f 6a 73 6f 6e 2e 68 74 6d 6c  5.7/en/json.html
0220: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 74  .**.** For the t
0230: 69 6d 65 20 62 65 69 6e 67 2c 20 61 6c 6c 20 4a  ime being, all J
0240: 53 4f 4e 20 69 73 20 73 74 6f 72 65 64 20 61 73  SON is stored as
0250: 20 70 75 72 65 20 74 65 78 74 2e 20 20 28 57 65   pure text.  (We
0260: 20 6d 69 67 68 74 20 61 64 64 0a 2a 2a 20 61 20   might add.** a 
0270: 4a 53 4f 4e 42 20 74 79 70 65 20 69 6e 20 74 68  JSONB type in th
0280: 65 20 66 75 74 75 72 65 20 77 68 69 63 68 20 73  e future which s
0290: 74 6f 72 65 73 20 61 20 62 69 6e 61 72 79 20 65  tores a binary e
02a0: 6e 63 6f 64 69 6e 67 20 6f 66 20 4a 53 4f 4e 20  ncoding of JSON 
02b0: 69 6e 0a 2a 2a 20 61 20 42 4c 4f 42 2c 20 62 75  in.** a BLOB, bu
02c0: 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75  t there is no su
02d0: 70 70 6f 72 74 20 66 6f 72 20 4a 53 4f 4e 42 20  pport for JSONB 
02e0: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  in the current i
02f0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a  mplementation..*
0300: 2a 20 54 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74  * This implement
0310: 61 74 69 6f 6e 20 70 61 72 73 65 73 20 4a 53 4f  ation parses JSO
0320: 4e 20 74 65 78 74 20 61 74 20 32 35 30 20 4d 42  N text at 250 MB
0330: 2f 73 2c 20 73 6f 20 69 74 20 69 73 20 68 61 72  /s, so it is har
0340: 64 20 74 6f 20 73 65 65 0a 2a 2a 20 68 6f 77 20  d to see.** how 
0350: 4a 53 4f 4e 42 20 6d 69 67 68 74 20 69 6d 70 72  JSONB might impr
0360: 6f 76 65 20 6f 6e 20 74 68 61 74 2e 29 0a 2a 2f  ove on that.).*/
0370: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
0380: 4c 49 54 45 5f 43 4f 52 45 29 20 7c 7c 20 64 65  LITE_CORE) || de
0390: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
03a0: 42 4c 45 5f 4a 53 4f 4e 31 29 0a 23 69 66 20 21  BLE_JSON1).#if !
03b0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 49 4e  defined(SQLITEIN
03c0: 54 5f 48 29 0a 23 69 6e 63 6c 75 64 65 20 22 73  T_H).#include "s
03d0: 71 6c 69 74 65 33 65 78 74 2e 68 22 0a 23 65 6e  qlite3ext.h".#en
03e0: 64 69 66 0a 53 51 4c 49 54 45 5f 45 58 54 45 4e  dif.SQLITE_EXTEN
03f0: 53 49 4f 4e 5f 49 4e 49 54 31 0a 23 69 6e 63 6c  SION_INIT1.#incl
0400: 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23  ude <assert.h>.#
0410: 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e  include <string.
0420: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  h>.#include <std
0430: 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  lib.h>.#include 
0440: 3c 73 74 64 61 72 67 2e 68 3e 0a 0a 2f 2a 20 4d  <stdarg.h>../* M
0450: 61 72 6b 20 61 20 66 75 6e 63 74 69 6f 6e 20 70  ark a function p
0460: 61 72 61 6d 65 74 65 72 20 61 73 20 75 6e 75 73  arameter as unus
0470: 65 64 2c 20 74 6f 20 73 75 70 70 72 65 73 73 20  ed, to suppress 
0480: 6e 75 69 73 61 6e 63 65 20 63 6f 6d 70 69 6c 65  nuisance compile
0490: 72 0a 2a 2a 20 77 61 72 6e 69 6e 67 73 2e 20 2a  r.** warnings. *
04a0: 2f 0a 23 69 66 6e 64 65 66 20 55 4e 55 53 45 44  /.#ifndef UNUSED
04b0: 5f 50 41 52 41 4d 0a 23 20 64 65 66 69 6e 65 20  _PARAM.# define 
04c0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 58 29 20  UNUSED_PARAM(X) 
04d0: 20 28 76 6f 69 64 29 28 58 29 0a 23 65 6e 64 69   (void)(X).#endi
04e0: 66 0a 0a 23 69 66 6e 64 65 66 20 4c 41 52 47 45  f..#ifndef LARGE
04f0: 53 54 5f 49 4e 54 36 34 0a 23 20 64 65 66 69 6e  ST_INT64.# defin
0500: 65 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 20  e LARGEST_INT64 
0510: 20 28 30 78 66 66 66 66 66 66 66 66 7c 28 28 28   (0xffffffff|(((
0520: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 30 78  sqlite3_int64)0x
0530: 37 66 66 66 66 66 66 66 29 3c 3c 33 32 29 29 0a  7fffffff)<<32)).
0540: 23 20 64 65 66 69 6e 65 20 53 4d 41 4c 4c 45 53  # define SMALLES
0550: 54 5f 49 4e 54 36 34 20 28 28 28 73 71 6c 69 74  T_INT64 (((sqlit
0560: 65 33 5f 69 6e 74 36 34 29 2d 31 29 20 2d 20 4c  e3_int64)-1) - L
0570: 41 52 47 45 53 54 5f 49 4e 54 36 34 29 0a 23 65  ARGEST_INT64).#e
0580: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 73  ndif../*.** Vers
0590: 69 6f 6e 73 20 6f 66 20 69 73 73 70 61 63 65 28  ions of isspace(
05a0: 29 2c 20 69 73 61 6c 6e 75 6d 28 29 20 61 6e 64  ), isalnum() and
05b0: 20 69 73 64 69 67 69 74 28 29 20 74 6f 20 77 68   isdigit() to wh
05c0: 69 63 68 20 69 74 20 69 73 20 73 61 66 65 0a 2a  ich it is safe.*
05d0: 2a 20 74 6f 20 70 61 73 73 20 73 69 67 6e 65 64  * to pass signed
05e0: 20 63 68 61 72 20 76 61 6c 75 65 73 2e 0a 2a 2f   char values..*/
05f0: 0a 23 69 66 64 65 66 20 73 71 6c 69 74 65 33 49  .#ifdef sqlite3I
0600: 73 64 69 67 69 74 0a 20 20 20 2f 2a 20 55 73 65  sdigit.   /* Use
0610: 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65   the SQLite core
0620: 20 76 65 72 73 69 6f 6e 73 20 69 66 20 74 68 69   versions if thi
0630: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72  s routine is par
0640: 74 20 6f 66 20 74 68 65 0a 20 20 20 2a 2a 20 53  t of the.   ** S
0650: 51 4c 69 74 65 20 61 6d 61 6c 67 61 6d 61 74 69  QLite amalgamati
0660: 6f 6e 20 2a 2f 0a 23 20 20 64 65 66 69 6e 65 20  on */.#  define 
0670: 73 61 66 65 5f 69 73 64 69 67 69 74 28 78 29 20  safe_isdigit(x) 
0680: 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28   sqlite3Isdigit(
0690: 78 29 0a 23 20 20 64 65 66 69 6e 65 20 73 61 66  x).#  define saf
06a0: 65 5f 69 73 61 6c 6e 75 6d 28 78 29 20 20 73 71  e_isalnum(x)  sq
06b0: 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 78 29 0a  lite3Isalnum(x).
06c0: 23 20 20 64 65 66 69 6e 65 20 73 61 66 65 5f 69  #  define safe_i
06d0: 73 78 64 69 67 69 74 28 78 29 20 73 71 6c 69 74  sxdigit(x) sqlit
06e0: 65 33 49 73 78 64 69 67 69 74 28 78 29 0a 23 65  e3Isxdigit(x).#e
06f0: 6c 73 65 0a 20 20 20 2f 2a 20 55 73 65 20 74 68  lse.   /* Use th
0700: 65 20 73 74 61 6e 64 61 72 64 20 6c 69 62 72 61  e standard libra
0710: 72 79 20 66 6f 72 20 73 65 70 61 72 61 74 65 20  ry for separate 
0720: 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 2a 2f 0a 23  compilation */.#
0730: 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68  include <ctype.h
0740: 3e 20 20 2f 2a 20 61 6d 61 6c 67 61 6d 61 74 6f  >  /* amalgamato
0750: 72 3a 20 6b 65 65 70 20 2a 2f 0a 23 20 20 64 65  r: keep */.#  de
0760: 66 69 6e 65 20 73 61 66 65 5f 69 73 64 69 67 69  fine safe_isdigi
0770: 74 28 78 29 20 20 69 73 64 69 67 69 74 28 28 75  t(x)  isdigit((u
0780: 6e 73 69 67 6e 65 64 20 63 68 61 72 29 28 78 29  nsigned char)(x)
0790: 29 0a 23 20 20 64 65 66 69 6e 65 20 73 61 66 65  ).#  define safe
07a0: 5f 69 73 61 6c 6e 75 6d 28 78 29 20 20 69 73 61  _isalnum(x)  isa
07b0: 6c 6e 75 6d 28 28 75 6e 73 69 67 6e 65 64 20 63  lnum((unsigned c
07c0: 68 61 72 29 28 78 29 29 0a 23 20 20 64 65 66 69  har)(x)).#  defi
07d0: 6e 65 20 73 61 66 65 5f 69 73 78 64 69 67 69 74  ne safe_isxdigit
07e0: 28 78 29 20 69 73 78 64 69 67 69 74 28 28 75 6e  (x) isxdigit((un
07f0: 73 69 67 6e 65 64 20 63 68 61 72 29 28 78 29 29  signed char)(x))
0800: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
0810: 72 6f 77 69 6e 67 20 6f 75 72 20 6f 77 6e 20 69  rowing our own i
0820: 73 73 70 61 63 65 28 29 20 72 6f 75 74 69 6e 65  sspace() routine
0830: 20 74 68 69 73 20 77 61 79 20 69 73 20 74 77 69   this way is twi
0840: 63 65 20 61 73 20 66 61 73 74 20 61 73 0a 2a 2a  ce as fast as.**
0850: 20 74 68 65 20 6c 69 62 72 61 72 79 20 69 73 73   the library iss
0860: 70 61 63 65 28 29 20 66 75 6e 63 74 69 6f 6e 2c  pace() function,
0870: 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 20   resulting in a 
0880: 37 25 20 6f 76 65 72 61 6c 6c 20 70 65 72 66 6f  7% overall perfo
0890: 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 63 72 65 61  rmance.** increa
08a0: 73 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65  se for the parse
08b0: 72 2e 20 20 28 55 62 75 6e 74 75 31 34 2e 31 30  r.  (Ubuntu14.10
08c0: 20 67 63 63 20 34 2e 38 2e 34 20 78 36 34 20 77   gcc 4.8.4 x64 w
08d0: 69 74 68 20 2d 4f 73 29 2e 0a 2a 2f 0a 73 74 61  ith -Os)..*/.sta
08e0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6a  tic const char j
08f0: 73 6f 6e 49 73 53 70 61 63 65 5b 5d 20 3d 20 7b  sonIsSpace[] = {
0900: 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  .  0, 0, 0, 0, 0
0910: 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 20 20 30  , 0, 0, 0,     0
0920: 2c 20 31 2c 20 31 2c 20 30 2c 20 30 2c 20 31 2c  , 1, 1, 0, 0, 1,
0930: 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30   0, 0,.  0, 0, 0
0940: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0950: 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c       0, 0, 0, 0,
0960: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 31   0, 0, 0, 0,.  1
0970: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0980: 20 30 2c 20 30 2c 20 20 20 20 20 30 2c 20 30 2c   0, 0,     0, 0,
0990: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
09a0: 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  0,.  0, 0, 0, 0,
09b0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 20   0, 0, 0, 0,    
09c0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
09d0: 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c  0, 0, 0,.  0, 0,
09e0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
09f0: 30 2c 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20  0,     0, 0, 0, 
0a00: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  0, 0, 0, 0, 0,. 
0a10: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0a20: 30 2c 20 30 2c 20 30 2c 20 20 20 20 20 30 2c 20  0, 0, 0,     0, 
0a30: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0a40: 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20  , 0,.  0, 0, 0, 
0a50: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20  0, 0, 0, 0, 0,  
0a60: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
0a70: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20  , 0, 0, 0,.  0, 
0a80: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0a90: 2c 20 30 2c 20 20 20 20 20 30 2c 20 30 2c 20 30  , 0,     0, 0, 0
0aa0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0ab0: 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  .  0, 0, 0, 0, 0
0ac0: 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 20 20 30  , 0, 0, 0,     0
0ad0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0ae0: 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30   0, 0,.  0, 0, 0
0af0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0b00: 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c       0, 0, 0, 0,
0b10: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30   0, 0, 0, 0,.  0
0b20: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0b30: 20 30 2c 20 30 2c 20 20 20 20 20 30 2c 20 30 2c   0, 0,     0, 0,
0b40: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0b50: 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  0,.  0, 0, 0, 0,
0b60: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 20   0, 0, 0, 0,    
0b70: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0b80: 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c  0, 0, 0,.  0, 0,
0b90: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0ba0: 30 2c 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20  0,     0, 0, 0, 
0bb0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  0, 0, 0, 0, 0,. 
0bc0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0bd0: 30 2c 20 30 2c 20 30 2c 20 20 20 20 20 30 2c 20  0, 0, 0,     0, 
0be0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0bf0: 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20  , 0,.  0, 0, 0, 
0c00: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20  0, 0, 0, 0, 0,  
0c10: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
0c20: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20  , 0, 0, 0,.  0, 
0c30: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0c40: 2c 20 30 2c 20 20 20 20 20 30 2c 20 30 2c 20 30  , 0,     0, 0, 0
0c50: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0c60: 0a 7d 3b 0a 23 64 65 66 69 6e 65 20 73 61 66 65  .};.#define safe
0c70: 5f 69 73 73 70 61 63 65 28 78 29 20 28 6a 73 6f  _isspace(x) (jso
0c80: 6e 49 73 53 70 61 63 65 5b 28 75 6e 73 69 67 6e  nIsSpace[(unsign
0c90: 65 64 20 63 68 61 72 29 78 5d 29 0a 0a 23 69 66  ed char)x])..#if
0ca0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d 41 4c  ndef SQLITE_AMAL
0cb0: 47 41 4d 41 54 49 4f 4e 0a 20 20 2f 2a 20 55 6e  GAMATION.  /* Un
0cc0: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 74  signed integer t
0cd0: 79 70 65 73 2e 20 20 54 68 65 73 65 20 61 72 65  ypes.  These are
0ce0: 20 61 6c 72 65 61 64 79 20 64 65 66 69 6e 65 64   already defined
0cf0: 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 49 6e   in the sqliteIn
0d00: 74 2e 68 2c 0a 20 20 2a 2a 20 62 75 74 20 74 68  t.h,.  ** but th
0d10: 65 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6e 65  e definitions ne
0d20: 65 64 20 74 6f 20 62 65 20 72 65 70 65 61 74 65  ed to be repeate
0d30: 64 20 66 6f 72 20 73 65 70 61 72 61 74 65 20 63  d for separate c
0d40: 6f 6d 70 69 6c 61 74 69 6f 6e 2e 20 2a 2f 0a 20  ompilation. */. 
0d50: 20 74 79 70 65 64 65 66 20 73 71 6c 69 74 65 33   typedef sqlite3
0d60: 5f 75 69 6e 74 36 34 20 75 36 34 3b 0a 20 20 74  _uint64 u64;.  t
0d70: 79 70 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20  ypedef unsigned 
0d80: 69 6e 74 20 75 33 32 3b 0a 20 20 74 79 70 65 64  int u32;.  typed
0d90: 65 66 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72  ef unsigned shor
0da0: 74 20 69 6e 74 20 75 31 36 3b 0a 20 20 74 79 70  t int u16;.  typ
0db0: 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20 63 68  edef unsigned ch
0dc0: 61 72 20 75 38 3b 0a 23 65 6e 64 69 66 0a 0a 2f  ar u8;.#endif../
0dd0: 2a 20 4f 62 6a 65 63 74 73 20 2a 2f 0a 74 79 70  * Objects */.typ
0de0: 65 64 65 66 20 73 74 72 75 63 74 20 4a 73 6f 6e  edef struct Json
0df0: 53 74 72 69 6e 67 20 4a 73 6f 6e 53 74 72 69 6e  String JsonStrin
0e00: 67 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  g;.typedef struc
0e10: 74 20 4a 73 6f 6e 4e 6f 64 65 20 4a 73 6f 6e 4e  t JsonNode JsonN
0e20: 6f 64 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ode;.typedef str
0e30: 75 63 74 20 4a 73 6f 6e 50 61 72 73 65 20 4a 73  uct JsonParse Js
0e40: 6f 6e 50 61 72 73 65 3b 0a 0a 2f 2a 20 41 6e 20  onParse;../* An 
0e50: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
0e60: 20 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e   object represen
0e70: 74 73 20 61 20 4a 53 4f 4e 20 73 74 72 69 6e 67  ts a JSON string
0e80: 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  .** under constr
0e90: 75 63 74 69 6f 6e 2e 20 20 52 65 61 6c 6c 79 2c  uction.  Really,
0ea0: 20 74 68 69 73 20 69 73 20 61 20 67 65 6e 65 72   this is a gener
0eb0: 69 63 20 73 74 72 69 6e 67 20 61 63 63 75 6d 75  ic string accumu
0ec0: 6c 61 74 6f 72 0a 2a 2a 20 74 68 61 74 20 63 61  lator.** that ca
0ed0: 6e 20 62 65 20 61 6e 64 20 69 73 20 75 73 65 64  n be and is used
0ee0: 20 74 6f 20 63 72 65 61 74 65 20 73 74 72 69 6e   to create strin
0ef0: 67 73 20 6f 74 68 65 72 20 74 68 61 6e 20 4a 53  gs other than JS
0f00: 4f 4e 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 4a 73  ON..*/.struct Js
0f10: 6f 6e 53 74 72 69 6e 67 20 7b 0a 20 20 73 71 6c  onString {.  sql
0f20: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
0f30: 74 78 3b 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f  tx;   /* Functio
0f40: 6e 20 63 6f 6e 74 65 78 74 20 2d 20 70 75 74 20  n context - put 
0f50: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 68  error messages h
0f60: 65 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ere */.  char *z
0f70: 42 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Buf;            
0f80: 20 20 2f 2a 20 41 70 70 65 6e 64 20 4a 53 4f 4e    /* Append JSON
0f90: 20 63 6f 6e 74 65 6e 74 20 68 65 72 65 20 2a 2f   content here */
0fa0: 0a 20 20 75 36 34 20 6e 41 6c 6c 6f 63 3b 20 20  .  u64 nAlloc;  
0fb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
0fc0: 79 74 65 73 20 6f 66 20 73 74 6f 72 61 67 65 20  ytes of storage 
0fd0: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 7a 42 75  available in zBu
0fe0: 66 5b 5d 20 2a 2f 0a 20 20 75 36 34 20 6e 55 73  f[] */.  u64 nUs
0ff0: 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
1000: 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 7a 42    /* Bytes of zB
1010: 75 66 5b 5d 20 63 75 72 72 65 6e 74 6c 79 20 75  uf[] currently u
1020: 73 65 64 20 2a 2f 0a 20 20 75 38 20 62 53 74 61  sed */.  u8 bSta
1030: 74 69 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  tic;            
1040: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 7a 42 75    /* True if zBu
1050: 66 20 69 73 20 73 74 61 74 69 63 20 73 70 61 63  f is static spac
1060: 65 20 2a 2f 0a 20 20 75 38 20 62 45 72 72 3b 20  e */.  u8 bErr; 
1070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1080: 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 65 72  /* True if an er
1090: 72 6f 72 20 68 61 73 20 62 65 65 6e 20 65 6e 63  ror has been enc
10a0: 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20 63 68  ountered */.  ch
10b0: 61 72 20 7a 53 70 61 63 65 5b 31 30 30 5d 3b 20  ar zSpace[100]; 
10c0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
10d0: 6c 20 73 74 61 74 69 63 20 73 70 61 63 65 20 2a  l static space *
10e0: 2f 0a 7d 3b 0a 0a 2f 2a 20 4a 53 4f 4e 20 74 79  /.};../* JSON ty
10f0: 70 65 20 76 61 6c 75 65 73 0a 2a 2f 0a 23 64 65  pe values.*/.#de
1100: 66 69 6e 65 20 4a 53 4f 4e 5f 4e 55 4c 4c 20 20  fine JSON_NULL  
1110: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 4a 53 4f     0.#define JSO
1120: 4e 5f 54 52 55 45 20 20 20 20 20 31 0a 23 64 65  N_TRUE     1.#de
1130: 66 69 6e 65 20 4a 53 4f 4e 5f 46 41 4c 53 45 20  fine JSON_FALSE 
1140: 20 20 20 32 0a 23 64 65 66 69 6e 65 20 4a 53 4f     2.#define JSO
1150: 4e 5f 49 4e 54 20 20 20 20 20 20 33 0a 23 64 65  N_INT      3.#de
1160: 66 69 6e 65 20 4a 53 4f 4e 5f 52 45 41 4c 20 20  fine JSON_REAL  
1170: 20 20 20 34 0a 23 64 65 66 69 6e 65 20 4a 53 4f     4.#define JSO
1180: 4e 5f 53 54 52 49 4e 47 20 20 20 35 0a 23 64 65  N_STRING   5.#de
1190: 66 69 6e 65 20 4a 53 4f 4e 5f 41 52 52 41 59 20  fine JSON_ARRAY 
11a0: 20 20 20 36 0a 23 64 65 66 69 6e 65 20 4a 53 4f     6.#define JSO
11b0: 4e 5f 4f 42 4a 45 43 54 20 20 20 37 0a 0a 2f 2a  N_OBJECT   7../*
11c0: 20 54 68 65 20 22 73 75 62 74 79 70 65 22 20 73   The "subtype" s
11d0: 65 74 20 66 6f 72 20 4a 53 4f 4e 20 76 61 6c 75  et for JSON valu
11e0: 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 53  es */.#define JS
11f0: 4f 4e 5f 53 55 42 54 59 50 45 20 20 37 34 20 20  ON_SUBTYPE  74  
1200: 20 20 2f 2a 20 41 73 63 69 69 20 66 6f 72 20 22    /* Ascii for "
1210: 4a 22 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d  J" */../*.** Nam
1220: 65 73 20 6f 66 20 74 68 65 20 76 61 72 69 6f 75  es of the variou
1230: 73 20 4a 53 4f 4e 20 74 79 70 65 73 3a 0a 2a 2f  s JSON types:.*/
1240: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
1250: 61 72 20 2a 20 63 6f 6e 73 74 20 6a 73 6f 6e 54  ar * const jsonT
1260: 79 70 65 5b 5d 20 3d 20 7b 0a 20 20 22 6e 75 6c  ype[] = {.  "nul
1270: 6c 22 2c 20 22 74 72 75 65 22 2c 20 22 66 61 6c  l", "true", "fal
1280: 73 65 22 2c 20 22 69 6e 74 65 67 65 72 22 2c 20  se", "integer", 
1290: 22 72 65 61 6c 22 2c 20 22 74 65 78 74 22 2c 20  "real", "text", 
12a0: 22 61 72 72 61 79 22 2c 20 22 6f 62 6a 65 63 74  "array", "object
12b0: 22 0a 7d 3b 0a 0a 2f 2a 20 42 69 74 20 76 61 6c  ".};../* Bit val
12c0: 75 65 73 20 66 6f 72 20 74 68 65 20 4a 73 6f 6e  ues for the Json
12d0: 4e 6f 64 65 2e 6a 6e 46 6c 61 67 20 66 69 65 6c  Node.jnFlag fiel
12e0: 64 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4e 4f  d.*/.#define JNO
12f0: 44 45 5f 52 41 57 20 20 20 20 20 30 78 30 31 20  DE_RAW     0x01 
1300: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
1310: 6e 74 20 69 73 20 72 61 77 2c 20 6e 6f 74 20 4a  nt is raw, not J
1320: 53 4f 4e 20 65 6e 63 6f 64 65 64 20 2a 2f 0a 23  SON encoded */.#
1330: 64 65 66 69 6e 65 20 4a 4e 4f 44 45 5f 45 53 43  define JNODE_ESC
1340: 41 50 45 20 20 30 78 30 32 20 20 20 20 20 20 20  APE  0x02       
1350: 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 69 73 20    /* Content is 
1360: 74 65 78 74 20 77 69 74 68 20 5c 20 65 73 63 61  text with \ esca
1370: 70 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4a  pes */.#define J
1380: 4e 4f 44 45 5f 52 45 4d 4f 56 45 20 20 30 78 30  NODE_REMOVE  0x0
1390: 34 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20  4         /* Do 
13a0: 6e 6f 74 20 6f 75 74 70 75 74 20 2a 2f 0a 23 64  not output */.#d
13b0: 65 66 69 6e 65 20 4a 4e 4f 44 45 5f 52 45 50 4c  efine JNODE_REPL
13c0: 41 43 45 20 30 78 30 38 20 20 20 20 20 20 20 20  ACE 0x08        
13d0: 20 2f 2a 20 52 65 70 6c 61 63 65 20 77 69 74 68   /* Replace with
13e0: 20 4a 73 6f 6e 4e 6f 64 65 2e 75 2e 69 52 65 70   JsonNode.u.iRep
13f0: 6c 61 63 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  lace */.#define 
1400: 4a 4e 4f 44 45 5f 50 41 54 43 48 20 20 20 30 78  JNODE_PATCH   0x
1410: 31 30 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  10         /* Pa
1420: 74 63 68 20 77 69 74 68 20 4a 73 6f 6e 4e 6f 64  tch with JsonNod
1430: 65 2e 75 2e 70 50 61 74 63 68 20 2a 2f 0a 23 64  e.u.pPatch */.#d
1440: 65 66 69 6e 65 20 4a 4e 4f 44 45 5f 41 50 50 45  efine JNODE_APPE
1450: 4e 44 20 20 30 78 32 30 20 20 20 20 20 20 20 20  ND  0x20        
1460: 20 2f 2a 20 4d 6f 72 65 20 41 52 52 41 59 2f 4f   /* More ARRAY/O
1470: 42 4a 45 43 54 20 65 6e 74 72 69 65 73 20 61 74  BJECT entries at
1480: 20 75 2e 69 41 70 70 65 6e 64 20 2a 2f 0a 23 64   u.iAppend */.#d
1490: 65 66 69 6e 65 20 4a 4e 4f 44 45 5f 4c 41 42 45  efine JNODE_LABE
14a0: 4c 20 20 20 30 78 34 30 20 20 20 20 20 20 20 20  L   0x40        
14b0: 20 2f 2a 20 49 73 20 61 20 6c 61 62 65 6c 20 6f   /* Is a label o
14c0: 66 20 61 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a  f an object */..
14d0: 0a 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6e 6f 64  ./* A single nod
14e0: 65 20 6f 66 20 70 61 72 73 65 64 20 4a 53 4f 4e  e of parsed JSON
14f0: 0a 2a 2f 0a 73 74 72 75 63 74 20 4a 73 6f 6e 4e  .*/.struct JsonN
1500: 6f 64 65 20 7b 0a 20 20 75 38 20 65 54 79 70 65  ode {.  u8 eType
1510: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1520: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 4a 53 4f  * One of the JSO
1530: 4e 5f 20 74 79 70 65 20 76 61 6c 75 65 73 20 2a  N_ type values *
1540: 2f 0a 20 20 75 38 20 6a 6e 46 6c 61 67 73 3b 20  /.  u8 jnFlags; 
1550: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 4e             /* JN
1560: 4f 44 45 20 66 6c 61 67 73 20 2a 2f 0a 20 20 75  ODE flags */.  u
1570: 33 32 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  32 n;           
1580: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
1590: 66 20 63 6f 6e 74 65 6e 74 2c 20 6f 72 20 6e 75  f content, or nu
15a0: 6d 62 65 72 20 6f 66 20 73 75 62 2d 6e 6f 64 65  mber of sub-node
15b0: 73 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20  s */.  union {. 
15c0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
15d0: 4a 43 6f 6e 74 65 6e 74 3b 20 2f 2a 20 43 6f 6e  JContent; /* Con
15e0: 74 65 6e 74 20 66 6f 72 20 49 4e 54 2c 20 52 45  tent for INT, RE
15f0: 41 4c 2c 20 61 6e 64 20 53 54 52 49 4e 47 20 2a  AL, and STRING *
1600: 2f 0a 20 20 20 20 75 33 32 20 69 41 70 70 65 6e  /.    u32 iAppen
1610: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
1620: 4d 6f 72 65 20 74 65 72 6d 73 20 66 6f 72 20 41  More terms for A
1630: 52 52 41 59 20 61 6e 64 20 4f 42 4a 45 43 54 20  RRAY and OBJECT 
1640: 2a 2f 0a 20 20 20 20 75 33 32 20 69 4b 65 79 3b  */.    u32 iKey;
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1660: 20 4b 65 79 20 66 6f 72 20 41 52 52 41 59 20 6f   Key for ARRAY o
1670: 62 6a 65 63 74 73 20 69 6e 20 6a 73 6f 6e 5f 74  bjects in json_t
1680: 72 65 65 28 29 20 2a 2f 0a 20 20 20 20 75 33 32  ree() */.    u32
1690: 20 69 52 65 70 6c 61 63 65 3b 20 20 20 20 20 20   iReplace;      
16a0: 20 20 20 20 2f 2a 20 52 65 70 6c 61 63 65 6d 65      /* Replaceme
16b0: 6e 74 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 4a  nt content for J
16c0: 4e 4f 44 45 5f 52 45 50 4c 41 43 45 20 2a 2f 0a  NODE_REPLACE */.
16d0: 20 20 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 50      JsonNode *pP
16e0: 61 74 63 68 3b 20 20 20 20 20 20 2f 2a 20 4e 6f  atch;      /* No
16f0: 64 65 20 63 68 61 69 6e 20 6f 66 20 70 61 74 63  de chain of patc
1700: 68 20 66 6f 72 20 4a 4e 4f 44 45 5f 50 41 54 43  h for JNODE_PATC
1710: 48 20 2a 2f 0a 20 20 7d 20 75 3b 0a 7d 3b 0a 0a  H */.  } u;.};..
1720: 2f 2a 20 41 20 63 6f 6d 70 6c 65 74 65 6c 79 20  /* A completely 
1730: 70 61 72 73 65 64 20 4a 53 4f 4e 20 73 74 72 69  parsed JSON stri
1740: 6e 67 0a 2a 2f 0a 73 74 72 75 63 74 20 4a 73 6f  ng.*/.struct Jso
1750: 6e 50 61 72 73 65 20 7b 0a 20 20 75 33 32 20 6e  nParse {.  u32 n
1760: 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Node;         /*
1770: 20 4e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73   Number of slots
1780: 20 6f 66 20 61 4e 6f 64 65 5b 5d 20 75 73 65 64   of aNode[] used
1790: 20 2a 2f 0a 20 20 75 33 32 20 6e 41 6c 6c 6f 63   */.  u32 nAlloc
17a0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ;        /* Numb
17b0: 65 72 20 6f 66 20 73 6c 6f 74 73 20 6f 66 20 61  er of slots of a
17c0: 4e 6f 64 65 5b 5d 20 61 6c 6c 6f 63 61 74 65 64  Node[] allocated
17d0: 20 2a 2f 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a   */.  JsonNode *
17e0: 61 4e 6f 64 65 3b 20 20 20 2f 2a 20 41 72 72 61  aNode;   /* Arra
17f0: 79 20 6f 66 20 6e 6f 64 65 73 20 63 6f 6e 74 61  y of nodes conta
1800: 69 6e 69 6e 67 20 74 68 65 20 70 61 72 73 65 20  ining the parse 
1810: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1820: 2a 7a 4a 73 6f 6e 3b 20 2f 2a 20 4f 72 69 67 69  *zJson; /* Origi
1830: 6e 61 6c 20 4a 53 4f 4e 20 73 74 72 69 6e 67 20  nal JSON string 
1840: 2a 2f 0a 20 20 75 33 32 20 2a 61 55 70 3b 20 20  */.  u32 *aUp;  
1850: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1860: 20 6f 66 20 70 61 72 65 6e 74 20 6f 66 20 65 61   of parent of ea
1870: 63 68 20 6e 6f 64 65 20 2a 2f 0a 20 20 75 38 20  ch node */.  u8 
1880: 6f 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  oom;            
1890: 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20 69  /* Set to true i
18a0: 66 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20  f out of memory 
18b0: 2a 2f 0a 20 20 75 38 20 6e 45 72 72 3b 20 20 20  */.  u8 nErr;   
18c0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
18d0: 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e  r of errors seen
18e0: 20 2a 2f 0a 20 20 75 31 36 20 69 44 65 70 74 68   */.  u16 iDepth
18f0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 73 74  ;        /* Nest
1900: 69 6e 67 20 64 65 70 74 68 20 2a 2f 0a 20 20 69  ing depth */.  i
1910: 6e 74 20 6e 4a 73 6f 6e 3b 20 20 20 20 20 20 20  nt nJson;       
1920: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74    /* Length of t
1930: 68 65 20 7a 4a 73 6f 6e 20 73 74 72 69 6e 67 20  he zJson string 
1940: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33  in bytes */.  u3
1950: 32 20 69 48 6f 6c 64 3b 20 20 20 20 20 20 20 20  2 iHold;        
1960: 20 2f 2a 20 52 65 70 6c 61 63 65 20 63 61 63 68   /* Replace cach
1970: 65 20 6c 69 6e 65 20 77 69 74 68 20 74 68 65 20  e line with the 
1980: 6c 6f 77 65 73 74 20 69 48 6f 6c 64 20 76 61 6c  lowest iHold val
1990: 75 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ue */.};../*.** 
19a0: 4d 61 78 69 6d 75 6d 20 6e 65 73 74 69 6e 67 20  Maximum nesting 
19b0: 64 65 70 74 68 20 6f 66 20 4a 53 4f 4e 20 66 6f  depth of JSON fo
19c0: 72 20 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74  r this implement
19d0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ation..**.** Thi
19e0: 73 20 6c 69 6d 69 74 20 69 73 20 6e 65 65 64 65  s limit is neede
19f0: 64 20 74 6f 20 61 76 6f 69 64 20 61 20 73 74 61  d to avoid a sta
1a00: 63 6b 20 6f 76 65 72 66 6c 6f 77 20 69 6e 20 74  ck overflow in t
1a10: 68 65 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20  he recursive.** 
1a20: 64 65 73 63 65 6e 74 20 70 61 72 73 65 72 2e 20  descent parser. 
1a30: 20 41 20 64 65 70 74 68 20 6f 66 20 32 30 30 30   A depth of 2000
1a40: 20 69 73 20 66 61 72 20 64 65 65 70 65 72 20 74   is far deeper t
1a50: 68 61 6e 20 61 6e 79 20 73 61 6e 65 20 4a 53 4f  han any sane JSO
1a60: 4e 0a 2a 2a 20 73 68 6f 75 6c 64 20 67 6f 2e 0a  N.** should go..
1a70: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 53 4f 4e 5f  */.#define JSON_
1a80: 4d 41 58 5f 44 45 50 54 48 20 20 32 30 30 30 0a  MAX_DEPTH  2000.
1a90: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
1aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ad0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
1ae0: 55 74 69 6c 69 74 79 20 72 6f 75 74 69 6e 65 73  Utility routines
1af0: 20 66 6f 72 20 64 65 61 6c 69 6e 67 20 77 69 74   for dealing wit
1b00: 68 20 4a 73 6f 6e 53 74 72 69 6e 67 20 6f 62 6a  h JsonString obj
1b10: 65 63 74 73 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ects.***********
1b20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
1b60: 0a 0a 2f 2a 20 53 65 74 20 74 68 65 20 4a 73 6f  ../* Set the Jso
1b70: 6e 53 74 72 69 6e 67 20 6f 62 6a 65 63 74 20 74  nString object t
1b80: 6f 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  o an empty strin
1b90: 67 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  g.*/.static void
1ba0: 20 6a 73 6f 6e 5a 65 72 6f 28 4a 73 6f 6e 53 74   jsonZero(JsonSt
1bb0: 72 69 6e 67 20 2a 70 29 7b 0a 20 20 70 2d 3e 7a  ring *p){.  p->z
1bc0: 42 75 66 20 3d 20 70 2d 3e 7a 53 70 61 63 65 3b  Buf = p->zSpace;
1bd0: 0a 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 73  .  p->nAlloc = s
1be0: 69 7a 65 6f 66 28 70 2d 3e 7a 53 70 61 63 65 29  izeof(p->zSpace)
1bf0: 3b 0a 20 20 70 2d 3e 6e 55 73 65 64 20 3d 20 30  ;.  p->nUsed = 0
1c00: 3b 0a 20 20 70 2d 3e 62 53 74 61 74 69 63 20 3d  ;.  p->bStatic =
1c10: 20 31 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69 74 69 61   1;.}../* Initia
1c20: 6c 69 7a 65 20 74 68 65 20 4a 73 6f 6e 53 74 72  lize the JsonStr
1c30: 69 6e 67 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74  ing object.*/.st
1c40: 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 49 6e  atic void jsonIn
1c50: 69 74 28 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70  it(JsonString *p
1c60: 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  , sqlite3_contex
1c70: 74 20 2a 70 43 74 78 29 7b 0a 20 20 70 2d 3e 70  t *pCtx){.  p->p
1c80: 43 74 78 20 3d 20 70 43 74 78 3b 0a 20 20 70 2d  Ctx = pCtx;.  p-
1c90: 3e 62 45 72 72 20 3d 20 30 3b 0a 20 20 6a 73 6f  >bErr = 0;.  jso
1ca0: 6e 5a 65 72 6f 28 70 29 3b 0a 7d 0a 0a 0a 2f 2a  nZero(p);.}.../*
1cb0: 20 46 72 65 65 20 61 6c 6c 20 61 6c 6c 6f 63 61   Free all alloca
1cc0: 74 65 64 20 6d 65 6d 6f 72 79 20 61 6e 64 20 72  ted memory and r
1cd0: 65 73 65 74 20 74 68 65 20 4a 73 6f 6e 53 74 72  eset the JsonStr
1ce0: 69 6e 67 20 6f 62 6a 65 63 74 20 62 61 63 6b 20  ing object back 
1cf0: 74 6f 20 69 74 73 0a 2a 2a 20 69 6e 69 74 69 61  to its.** initia
1d00: 6c 20 73 74 61 74 65 2e 0a 2a 2f 0a 73 74 61 74  l state..*/.stat
1d10: 69 63 20 76 6f 69 64 20 6a 73 6f 6e 52 65 73 65  ic void jsonRese
1d20: 74 28 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70 29  t(JsonString *p)
1d30: 7b 0a 20 20 69 66 28 20 21 70 2d 3e 62 53 74 61  {.  if( !p->bSta
1d40: 74 69 63 20 29 20 73 71 6c 69 74 65 33 5f 66 72  tic ) sqlite3_fr
1d50: 65 65 28 70 2d 3e 7a 42 75 66 29 3b 0a 20 20 6a  ee(p->zBuf);.  j
1d60: 73 6f 6e 5a 65 72 6f 28 70 29 3b 0a 7d 0a 0a 0a  sonZero(p);.}...
1d70: 2f 2a 20 52 65 70 6f 72 74 20 61 6e 20 6f 75 74  /* Report an out
1d80: 2d 6f 66 2d 6d 65 6d 6f 72 79 20 28 4f 4f 4d 29  -of-memory (OOM)
1d90: 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2f 0a 73   condition .*/.s
1da0: 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 4f  tatic void jsonO
1db0: 6f 6d 28 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70  om(JsonString *p
1dc0: 29 7b 0a 20 20 70 2d 3e 62 45 72 72 20 3d 20 31  ){.  p->bErr = 1
1dd0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
1de0: 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 70  lt_error_nomem(p
1df0: 2d 3e 70 43 74 78 29 3b 0a 20 20 6a 73 6f 6e 52  ->pCtx);.  jsonR
1e00: 65 73 65 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 20 45  eset(p);.}../* E
1e10: 6e 6c 61 72 67 65 20 70 4a 73 6f 6e 2d 3e 7a 42  nlarge pJson->zB
1e20: 75 66 20 73 6f 20 74 68 61 74 20 69 74 20 63 61  uf so that it ca
1e30: 6e 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20  n hold at least 
1e40: 4e 20 6d 6f 72 65 20 62 79 74 65 73 2e 0a 2a 2a  N more bytes..**
1e50: 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 6f 6e 20   Return zero on 
1e60: 73 75 63 63 65 73 73 2e 20 20 52 65 74 75 72 6e  success.  Return
1e70: 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20 61 6e 20   non-zero on an 
1e80: 4f 4f 4d 20 65 72 72 6f 72 0a 2a 2f 0a 73 74 61  OOM error.*/.sta
1e90: 74 69 63 20 69 6e 74 20 6a 73 6f 6e 47 72 6f 77  tic int jsonGrow
1ea0: 28 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70 2c 20  (JsonString *p, 
1eb0: 75 33 32 20 4e 29 7b 0a 20 20 75 36 34 20 6e 54  u32 N){.  u64 nT
1ec0: 6f 74 61 6c 20 3d 20 4e 3c 70 2d 3e 6e 41 6c 6c  otal = N<p->nAll
1ed0: 6f 63 20 3f 20 70 2d 3e 6e 41 6c 6c 6f 63 2a 32  oc ? p->nAlloc*2
1ee0: 20 3a 20 70 2d 3e 6e 41 6c 6c 6f 63 2b 4e 2b 31   : p->nAlloc+N+1
1ef0: 30 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 65 77 3b  0;.  char *zNew;
1f00: 0a 20 20 69 66 28 20 70 2d 3e 62 53 74 61 74 69  .  if( p->bStati
1f10: 63 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  c ){.    if( p->
1f20: 62 45 72 72 20 29 20 72 65 74 75 72 6e 20 31 3b  bErr ) return 1;
1f30: 0a 20 20 20 20 7a 4e 65 77 20 3d 20 73 71 6c 69  .    zNew = sqli
1f40: 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 54 6f  te3_malloc64(nTo
1f50: 74 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e  tal);.    if( zN
1f60: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6a  ew==0 ){.      j
1f70: 73 6f 6e 4f 6f 6d 28 70 29 3b 0a 20 20 20 20 20  sonOom(p);.     
1f80: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
1f90: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
1fa0: 6d 65 6d 63 70 79 28 7a 4e 65 77 2c 20 70 2d 3e  memcpy(zNew, p->
1fb0: 7a 42 75 66 2c 20 28 73 69 7a 65 5f 74 29 70 2d  zBuf, (size_t)p-
1fc0: 3e 6e 55 73 65 64 29 3b 0a 20 20 20 20 70 2d 3e  >nUsed);.    p->
1fd0: 7a 42 75 66 20 3d 20 7a 4e 65 77 3b 0a 20 20 20  zBuf = zNew;.   
1fe0: 20 70 2d 3e 62 53 74 61 74 69 63 20 3d 20 30 3b   p->bStatic = 0;
1ff0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e  .  }else{.    zN
2000: 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61  ew = sqlite3_rea
2010: 6c 6c 6f 63 36 34 28 70 2d 3e 7a 42 75 66 2c 20  lloc64(p->zBuf, 
2020: 6e 54 6f 74 61 6c 29 3b 0a 20 20 20 20 69 66 28  nTotal);.    if(
2030: 20 7a 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   zNew==0 ){.    
2040: 20 20 6a 73 6f 6e 4f 6f 6d 28 70 29 3b 0a 20 20    jsonOom(p);.  
2050: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2060: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
2070: 20 20 20 70 2d 3e 7a 42 75 66 20 3d 20 7a 4e 65     p->zBuf = zNe
2080: 77 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 41 6c 6c  w;.  }.  p->nAll
2090: 6f 63 20 3d 20 6e 54 6f 74 61 6c 3b 0a 20 20 72  oc = nTotal;.  r
20a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
20b0: 0a 7d 0a 0a 2f 2a 20 41 70 70 65 6e 64 20 4e 20  .}../* Append N 
20c0: 62 79 74 65 73 20 66 72 6f 6d 20 7a 49 6e 20 6f  bytes from zIn o
20d0: 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74  nto the end of t
20e0: 68 65 20 4a 73 6f 6e 53 74 72 69 6e 67 20 73 74  he JsonString st
20f0: 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ring..*/.static 
2100: 76 6f 69 64 20 6a 73 6f 6e 41 70 70 65 6e 64 52  void jsonAppendR
2110: 61 77 28 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70  aw(JsonString *p
2120: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49  , const char *zI
2130: 6e 2c 20 75 33 32 20 4e 29 7b 0a 20 20 69 66 28  n, u32 N){.  if(
2140: 20 28 4e 2b 70 2d 3e 6e 55 73 65 64 20 3e 3d 20   (N+p->nUsed >= 
2150: 70 2d 3e 6e 41 6c 6c 6f 63 29 20 26 26 20 6a 73  p->nAlloc) && js
2160: 6f 6e 47 72 6f 77 28 70 2c 4e 29 21 3d 30 20 29  onGrow(p,N)!=0 )
2170: 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 63 70   return;.  memcp
2180: 79 28 70 2d 3e 7a 42 75 66 2b 70 2d 3e 6e 55 73  y(p->zBuf+p->nUs
2190: 65 64 2c 20 7a 49 6e 2c 20 4e 29 3b 0a 20 20 70  ed, zIn, N);.  p
21a0: 2d 3e 6e 55 73 65 64 20 2b 3d 20 4e 3b 0a 7d 0a  ->nUsed += N;.}.
21b0: 0a 2f 2a 20 41 70 70 65 6e 64 20 66 6f 72 6d 61  ./* Append forma
21c0: 74 74 65 64 20 74 65 78 74 20 28 6e 6f 74 20 74  tted text (not t
21d0: 6f 20 65 78 63 65 65 64 20 4e 20 62 79 74 65 73  o exceed N bytes
21e0: 29 20 74 6f 20 74 68 65 20 4a 73 6f 6e 53 74 72  ) to the JsonStr
21f0: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
2200: 6f 69 64 20 6a 73 6f 6e 50 72 69 6e 74 66 28 69  oid jsonPrintf(i
2210: 6e 74 20 4e 2c 20 4a 73 6f 6e 53 74 72 69 6e 67  nt N, JsonString
2220: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
2230: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
2240: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
2250: 69 66 28 20 28 70 2d 3e 6e 55 73 65 64 20 2b 20  if( (p->nUsed + 
2260: 4e 20 3e 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 29 20  N >= p->nAlloc) 
2270: 26 26 20 6a 73 6f 6e 47 72 6f 77 28 70 2c 20 4e  && jsonGrow(p, N
2280: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 76 61  ) ) return;.  va
2290: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
22a0: 61 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  at);.  sqlite3_v
22b0: 73 6e 70 72 69 6e 74 66 28 4e 2c 20 70 2d 3e 7a  snprintf(N, p->z
22c0: 42 75 66 2b 70 2d 3e 6e 55 73 65 64 2c 20 7a 46  Buf+p->nUsed, zF
22d0: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61  ormat, ap);.  va
22e0: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 70 2d 3e 6e  _end(ap);.  p->n
22f0: 55 73 65 64 20 2b 3d 20 28 69 6e 74 29 73 74 72  Used += (int)str
2300: 6c 65 6e 28 70 2d 3e 7a 42 75 66 2b 70 2d 3e 6e  len(p->zBuf+p->n
2310: 55 73 65 64 29 3b 0a 7d 0a 0a 2f 2a 20 41 70 70  Used);.}../* App
2320: 65 6e 64 20 61 20 73 69 6e 67 6c 65 20 63 68 61  end a single cha
2330: 72 61 63 74 65 72 0a 2a 2f 0a 73 74 61 74 69 63  racter.*/.static
2340: 20 76 6f 69 64 20 6a 73 6f 6e 41 70 70 65 6e 64   void jsonAppend
2350: 43 68 61 72 28 4a 73 6f 6e 53 74 72 69 6e 67 20  Char(JsonString 
2360: 2a 70 2c 20 63 68 61 72 20 63 29 7b 0a 20 20 69  *p, char c){.  i
2370: 66 28 20 70 2d 3e 6e 55 73 65 64 3e 3d 70 2d 3e  f( p->nUsed>=p->
2380: 6e 41 6c 6c 6f 63 20 26 26 20 6a 73 6f 6e 47 72  nAlloc && jsonGr
2390: 6f 77 28 70 2c 31 29 21 3d 30 20 29 20 72 65 74  ow(p,1)!=0 ) ret
23a0: 75 72 6e 3b 0a 20 20 70 2d 3e 7a 42 75 66 5b 70  urn;.  p->zBuf[p
23b0: 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d 20 63 3b 0a  ->nUsed++] = c;.
23c0: 7d 0a 0a 2f 2a 20 41 70 70 65 6e 64 20 61 20 63  }../* Append a c
23d0: 6f 6d 6d 61 20 73 65 70 61 72 61 74 6f 72 20 74  omma separator t
23e0: 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  o the output buf
23f0: 66 65 72 2c 20 69 66 20 74 68 65 20 70 72 65 76  fer, if the prev
2400: 69 6f 75 73 0a 2a 2a 20 63 68 61 72 61 63 74 65  ious.** characte
2410: 72 20 69 73 20 6e 6f 74 20 27 5b 27 20 6f 72 20  r is not '[' or 
2420: 27 7b 27 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  '{'..*/.static v
2430: 6f 69 64 20 6a 73 6f 6e 41 70 70 65 6e 64 53 65  oid jsonAppendSe
2440: 70 61 72 61 74 6f 72 28 4a 73 6f 6e 53 74 72 69  parator(JsonStri
2450: 6e 67 20 2a 70 29 7b 0a 20 20 63 68 61 72 20 63  ng *p){.  char c
2460: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 55 73 65 64  ;.  if( p->nUsed
2470: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
2480: 63 20 3d 20 70 2d 3e 7a 42 75 66 5b 70 2d 3e 6e  c = p->zBuf[p->n
2490: 55 73 65 64 2d 31 5d 3b 0a 20 20 69 66 28 20 63  Used-1];.  if( c
24a0: 21 3d 27 5b 27 20 26 26 20 63 21 3d 27 7b 27 20  !='[' && c!='{' 
24b0: 29 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61 72  ) jsonAppendChar
24c0: 28 70 2c 20 27 2c 27 29 3b 0a 7d 0a 0a 2f 2a 20  (p, ',');.}../* 
24d0: 41 70 70 65 6e 64 20 74 68 65 20 4e 2d 62 79 74  Append the N-byt
24e0: 65 20 73 74 72 69 6e 67 20 69 6e 20 7a 49 6e 20  e string in zIn 
24f0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
2500: 65 20 4a 73 6f 6e 53 74 72 69 6e 67 20 73 74 72  e JsonString str
2510: 69 6e 67 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e  ing.** under con
2520: 73 74 72 75 63 74 69 6f 6e 2e 20 20 45 6e 63 6c  struction.  Encl
2530: 6f 73 65 20 74 68 65 20 73 74 72 69 6e 67 20 69  ose the string i
2540: 6e 20 22 2e 2e 2e 22 20 61 6e 64 20 65 73 63 61  n "..." and esca
2550: 70 65 0a 2a 2a 20 61 6e 79 20 64 6f 75 62 6c 65  pe.** any double
2560: 2d 71 75 6f 74 65 73 20 6f 72 20 62 61 63 6b 73  -quotes or backs
2570: 6c 61 73 68 20 63 68 61 72 61 63 74 65 72 73 20  lash characters 
2580: 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
2590: 20 74 68 65 0a 2a 2a 20 73 74 72 69 6e 67 2e 0a   the.** string..
25a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a  */.static void j
25b0: 73 6f 6e 41 70 70 65 6e 64 53 74 72 69 6e 67 28  sonAppendString(
25c0: 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70 2c 20 63  JsonString *p, c
25d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 2c 20  onst char *zIn, 
25e0: 75 33 32 20 4e 29 7b 0a 20 20 75 33 32 20 69 3b  u32 N){.  u32 i;
25f0: 0a 20 20 69 66 28 20 28 4e 2b 70 2d 3e 6e 55 73  .  if( (N+p->nUs
2600: 65 64 2b 32 20 3e 3d 20 70 2d 3e 6e 41 6c 6c 6f  ed+2 >= p->nAllo
2610: 63 29 20 26 26 20 6a 73 6f 6e 47 72 6f 77 28 70  c) && jsonGrow(p
2620: 2c 4e 2b 32 29 21 3d 30 20 29 20 72 65 74 75 72  ,N+2)!=0 ) retur
2630: 6e 3b 0a 20 20 70 2d 3e 7a 42 75 66 5b 70 2d 3e  n;.  p->zBuf[p->
2640: 6e 55 73 65 64 2b 2b 5d 20 3d 20 27 22 27 3b 0a  nUsed++] = '"';.
2650: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b 20    for(i=0; i<N; 
2660: 69 2b 2b 29 7b 0a 20 20 20 20 75 6e 73 69 67 6e  i++){.    unsign
2670: 65 64 20 63 68 61 72 20 63 20 3d 20 28 28 75 6e  ed char c = ((un
2680: 73 69 67 6e 65 64 20 63 6f 6e 73 74 20 63 68 61  signed const cha
2690: 72 2a 29 7a 49 6e 29 5b 69 5d 3b 0a 20 20 20 20  r*)zIn)[i];.    
26a0: 69 66 28 20 63 3d 3d 27 22 27 20 7c 7c 20 63 3d  if( c=='"' || c=
26b0: 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 6a  ='\\' ){.      j
26c0: 73 6f 6e 5f 73 69 6d 70 6c 65 5f 65 73 63 61 70  son_simple_escap
26d0: 65 3a 0a 20 20 20 20 20 20 69 66 28 20 28 70 2d  e:.      if( (p-
26e0: 3e 6e 55 73 65 64 2b 4e 2b 33 2d 69 20 3e 20 70  >nUsed+N+3-i > p
26f0: 2d 3e 6e 41 6c 6c 6f 63 29 20 26 26 20 6a 73 6f  ->nAlloc) && jso
2700: 6e 47 72 6f 77 28 70 2c 4e 2b 33 2d 69 29 21 3d  nGrow(p,N+3-i)!=
2710: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
2720: 20 20 70 2d 3e 7a 42 75 66 5b 70 2d 3e 6e 55 73    p->zBuf[p->nUs
2730: 65 64 2b 2b 5d 20 3d 20 27 5c 5c 27 3b 0a 20 20  ed++] = '\\';.  
2740: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3c 3d 30    }else if( c<=0
2750: 78 31 66 20 29 7b 0a 20 20 20 20 20 20 73 74 61  x1f ){.      sta
2760: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 61  tic const char a
2770: 53 70 65 63 69 61 6c 5b 5d 20 3d 20 7b 0a 20 20  Special[] = {.  
2780: 20 20 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20         0, 0, 0, 
2790: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 27  0, 0, 0, 0, 0, '
27a0: 62 27 2c 20 27 74 27 2c 20 27 6e 27 2c 20 30 2c  b', 't', 'n', 0,
27b0: 20 27 66 27 2c 20 27 72 27 2c 20 30 2c 20 30 2c   'f', 'r', 0, 0,
27c0: 0a 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20  .         0, 0, 
27d0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
27e0: 2c 20 20 20 30 2c 20 20 20 30 2c 20 20 20 30 2c  ,   0,   0,   0,
27f0: 20 30 2c 20 20 20 30 2c 20 20 20 30 2c 20 30 2c   0,   0,   0, 0,
2800: 20 30 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20   0.      };.    
2810: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
2820: 28 61 53 70 65 63 69 61 6c 29 3d 3d 33 32 20 29  (aSpecial)==32 )
2830: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2840: 61 53 70 65 63 69 61 6c 5b 27 5c 62 27 5d 3d 3d  aSpecial['\b']==
2850: 27 62 27 20 29 3b 0a 20 20 20 20 20 20 61 73 73  'b' );.      ass
2860: 65 72 74 28 20 61 53 70 65 63 69 61 6c 5b 27 5c  ert( aSpecial['\
2870: 66 27 5d 3d 3d 27 66 27 20 29 3b 0a 20 20 20 20  f']=='f' );.    
2880: 20 20 61 73 73 65 72 74 28 20 61 53 70 65 63 69    assert( aSpeci
2890: 61 6c 5b 27 5c 6e 27 5d 3d 3d 27 6e 27 20 29 3b  al['\n']=='n' );
28a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61  .      assert( a
28b0: 53 70 65 63 69 61 6c 5b 27 5c 72 27 5d 3d 3d 27  Special['\r']=='
28c0: 72 27 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  r' );.      asse
28d0: 72 74 28 20 61 53 70 65 63 69 61 6c 5b 27 5c 74  rt( aSpecial['\t
28e0: 27 5d 3d 3d 27 74 27 20 29 3b 0a 20 20 20 20 20  ']=='t' );.     
28f0: 20 69 66 28 20 61 53 70 65 63 69 61 6c 5b 63 5d   if( aSpecial[c]
2900: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20   ){.        c = 
2910: 61 53 70 65 63 69 61 6c 5b 63 5d 3b 0a 20 20 20  aSpecial[c];.   
2920: 20 20 20 20 20 67 6f 74 6f 20 6a 73 6f 6e 5f 73       goto json_s
2930: 69 6d 70 6c 65 5f 65 73 63 61 70 65 3b 0a 20 20  imple_escape;.  
2940: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2950: 28 70 2d 3e 6e 55 73 65 64 2b 4e 2b 37 2b 69 20  (p->nUsed+N+7+i 
2960: 3e 20 70 2d 3e 6e 41 6c 6c 6f 63 29 20 26 26 20  > p->nAlloc) && 
2970: 6a 73 6f 6e 47 72 6f 77 28 70 2c 4e 2b 37 2d 69  jsonGrow(p,N+7-i
2980: 29 21 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )!=0 ) return;. 
2990: 20 20 20 20 20 70 2d 3e 7a 42 75 66 5b 70 2d 3e       p->zBuf[p->
29a0: 6e 55 73 65 64 2b 2b 5d 20 3d 20 27 5c 5c 27 3b  nUsed++] = '\\';
29b0: 0a 20 20 20 20 20 20 70 2d 3e 7a 42 75 66 5b 70  .      p->zBuf[p
29c0: 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d 20 27 75 27  ->nUsed++] = 'u'
29d0: 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 42 75 66 5b  ;.      p->zBuf[
29e0: 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d 20 27 30  p->nUsed++] = '0
29f0: 27 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 42 75 66  ';.      p->zBuf
2a00: 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d 20 27  [p->nUsed++] = '
2a10: 30 27 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 42 75  0';.      p->zBu
2a20: 66 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d 20  f[p->nUsed++] = 
2a30: 27 30 27 20 2b 20 28 63 3e 3e 34 29 3b 0a 20 20  '0' + (c>>4);.  
2a40: 20 20 20 20 63 20 3d 20 22 30 31 32 33 34 35 36      c = "0123456
2a50: 37 38 39 61 62 63 64 65 66 22 5b 63 26 30 78 66  789abcdef"[c&0xf
2a60: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  ];.    }.    p->
2a70: 7a 42 75 66 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d  zBuf[p->nUsed++]
2a80: 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 70 2d 3e 7a   = c;.  }.  p->z
2a90: 42 75 66 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20  Buf[p->nUsed++] 
2aa0: 3d 20 27 22 27 3b 0a 20 20 61 73 73 65 72 74 28  = '"';.  assert(
2ab0: 20 70 2d 3e 6e 55 73 65 64 3c 70 2d 3e 6e 41 6c   p->nUsed<p->nAl
2ac0: 6c 6f 63 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  loc );.}../*.** 
2ad0: 41 70 70 65 6e 64 20 61 20 66 75 6e 63 74 69 6f  Append a functio
2ae0: 6e 20 70 61 72 61 6d 65 74 65 72 20 76 61 6c 75  n parameter valu
2af0: 65 20 74 6f 20 74 68 65 20 4a 53 4f 4e 20 73 74  e to the JSON st
2b00: 72 69 6e 67 20 75 6e 64 65 72 20 0a 2a 2a 20 63  ring under .** c
2b10: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  onstruction..*/.
2b20: 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e  static void json
2b30: 41 70 70 65 6e 64 56 61 6c 75 65 28 0a 20 20 4a  AppendValue(.  J
2b40: 73 6f 6e 53 74 72 69 6e 67 20 2a 70 2c 20 20 20  sonString *p,   
2b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b60: 20 41 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20   Append to this 
2b70: 4a 53 4f 4e 20 73 74 72 69 6e 67 20 2a 2f 0a 20  JSON string */. 
2b80: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
2b90: 70 56 61 6c 75 65 20 20 20 20 20 20 20 20 20 20  pValue          
2ba0: 2f 2a 20 56 61 6c 75 65 20 74 6f 20 61 70 70 65  /* Value to appe
2bb0: 6e 64 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63  nd */.){.  switc
2bc0: 68 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  h( sqlite3_value
2bd0: 5f 74 79 70 65 28 70 56 61 6c 75 65 29 20 29 7b  _type(pValue) ){
2be0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
2bf0: 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 6a  _NULL: {.      j
2c00: 73 6f 6e 41 70 70 65 6e 64 52 61 77 28 70 2c 20  sonAppendRaw(p, 
2c10: 22 6e 75 6c 6c 22 2c 20 34 29 3b 0a 20 20 20 20  "null", 4);.    
2c20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
2c30: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
2c40: 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61 73 65  NTEGER:.    case
2c50: 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 20 7b   SQLITE_FLOAT: {
2c60: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
2c70: 72 20 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68  r *z = (const ch
2c80: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
2c90: 65 5f 74 65 78 74 28 70 56 61 6c 75 65 29 3b 0a  e_text(pValue);.
2ca0: 20 20 20 20 20 20 75 33 32 20 6e 20 3d 20 28 75        u32 n = (u
2cb0: 33 32 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  32)sqlite3_value
2cc0: 5f 62 79 74 65 73 28 70 56 61 6c 75 65 29 3b 0a  _bytes(pValue);.
2cd0: 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64        jsonAppend
2ce0: 52 61 77 28 70 2c 20 7a 2c 20 6e 29 3b 0a 20 20  Raw(p, z, n);.  
2cf0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2d00: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
2d10: 5f 54 45 58 54 3a 20 7b 0a 20 20 20 20 20 20 63  _TEXT: {.      c
2d20: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28  onst char *z = (
2d30: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
2d40: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70  te3_value_text(p
2d50: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 75 33  Value);.      u3
2d60: 32 20 6e 20 3d 20 28 75 33 32 29 73 71 6c 69 74  2 n = (u32)sqlit
2d70: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70  e3_value_bytes(p
2d80: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 69 66  Value);.      if
2d90: 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
2da0: 73 75 62 74 79 70 65 28 70 56 61 6c 75 65 29 3d  subtype(pValue)=
2db0: 3d 4a 53 4f 4e 5f 53 55 42 54 59 50 45 20 29 7b  =JSON_SUBTYPE ){
2dc0: 0a 20 20 20 20 20 20 20 20 6a 73 6f 6e 41 70 70  .        jsonApp
2dd0: 65 6e 64 52 61 77 28 70 2c 20 7a 2c 20 6e 29 3b  endRaw(p, z, n);
2de0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2df0: 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64        jsonAppend
2e00: 53 74 72 69 6e 67 28 70 2c 20 7a 2c 20 6e 29 3b  String(p, z, n);
2e10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
2e20: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
2e30: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
2e40: 20 69 66 28 20 70 2d 3e 62 45 72 72 3d 3d 30 20   if( p->bErr==0 
2e50: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2e60: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
2e70: 70 2d 3e 70 43 74 78 2c 20 22 4a 53 4f 4e 20 63  p->pCtx, "JSON c
2e80: 61 6e 6e 6f 74 20 68 6f 6c 64 20 42 4c 4f 42 20  annot hold BLOB 
2e90: 76 61 6c 75 65 73 22 2c 20 2d 31 29 3b 0a 20 20  values", -1);.  
2ea0: 20 20 20 20 20 20 70 2d 3e 62 45 72 72 20 3d 20        p->bErr = 
2eb0: 32 3b 0a 20 20 20 20 20 20 20 20 6a 73 6f 6e 52  2;.        jsonR
2ec0: 65 73 65 74 28 70 29 3b 0a 20 20 20 20 20 20 7d  eset(p);.      }
2ed0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2ee0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 20 4d    }.  }.}.../* M
2ef0: 61 6b 65 20 74 68 65 20 4a 53 4f 4e 20 69 6e 20  ake the JSON in 
2f00: 70 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  p the result of 
2f10: 74 68 65 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  the SQL function
2f20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2f30: 20 6a 73 6f 6e 52 65 73 75 6c 74 28 4a 73 6f 6e   jsonResult(Json
2f40: 53 74 72 69 6e 67 20 2a 70 29 7b 0a 20 20 69 66  String *p){.  if
2f50: 28 20 70 2d 3e 62 45 72 72 3d 3d 30 20 29 7b 0a  ( p->bErr==0 ){.
2f60: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
2f70: 6c 74 5f 74 65 78 74 36 34 28 70 2d 3e 70 43 74  lt_text64(p->pCt
2f80: 78 2c 20 70 2d 3e 7a 42 75 66 2c 20 70 2d 3e 6e  x, p->zBuf, p->n
2f90: 55 73 65 64 2c 20 0a 20 20 20 20 20 20 20 20 20  Used, .         
2fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb0: 20 70 2d 3e 62 53 74 61 74 69 63 20 3f 20 53 51   p->bStatic ? SQ
2fc0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 20 3a  LITE_TRANSIENT :
2fd0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 2c 0a 20   sqlite3_free,. 
2fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ff0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
3000: 55 54 46 38 29 3b 0a 20 20 20 20 6a 73 6f 6e 5a  UTF8);.    jsonZ
3010: 65 72 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 61 73  ero(p);.  }.  as
3020: 73 65 72 74 28 20 70 2d 3e 62 53 74 61 74 69 63  sert( p->bStatic
3030: 20 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   );.}../********
3040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3080: 2a 2a 0a 2a 2a 20 55 74 69 6c 69 74 79 20 72 6f  **.** Utility ro
3090: 75 74 69 6e 65 73 20 66 6f 72 20 64 65 61 6c 69  utines for deali
30a0: 6e 67 20 77 69 74 68 20 4a 73 6f 6e 4e 6f 64 65  ng with JsonNode
30b0: 20 61 6e 64 20 4a 73 6f 6e 50 61 72 73 65 20 6f   and JsonParse o
30c0: 62 6a 65 63 74 73 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  bjects.*********
30d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3110: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
3120: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
3130: 6f 6e 73 65 63 75 74 69 76 65 20 4a 73 6f 6e 4e  onsecutive JsonN
3140: 6f 64 65 20 73 6c 6f 74 73 20 6e 65 65 64 20 74  ode slots need t
3150: 6f 20 72 65 70 72 65 73 65 6e 74 0a 2a 2a 20 74  o represent.** t
3160: 68 65 20 70 61 72 73 65 64 20 4a 53 4f 4e 20 61  he parsed JSON a
3170: 74 20 70 4e 6f 64 65 2e 20 20 54 68 65 20 6d 69  t pNode.  The mi
3180: 6e 69 6d 75 6d 20 61 6e 73 77 65 72 20 69 73 20  nimum answer is 
3190: 31 2e 20 20 46 6f 72 20 41 52 52 41 59 20 61 6e  1.  For ARRAY an
31a0: 64 0a 2a 2a 20 4f 42 4a 45 43 54 20 74 79 70 65  d.** OBJECT type
31b0: 73 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6d 69  s, the number mi
31c0: 67 68 74 20 62 65 20 6c 61 72 67 65 72 2e 0a 2a  ght be larger..*
31d0: 2a 0a 2a 2a 20 41 70 70 65 6e 64 65 64 20 65 6c  *.** Appended el
31e0: 65 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74 20 63  ements are not c
31f0: 6f 75 6e 74 65 64 2e 20 20 54 68 65 20 76 61 6c  ounted.  The val
3200: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
3210: 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 62 79 20  he number.** by 
3220: 77 68 69 63 68 20 74 68 65 20 4a 73 6f 6e 4e 6f  which the JsonNo
3230: 64 65 20 63 6f 75 6e 74 65 72 20 73 68 6f 75 6c  de counter shoul
3240: 64 20 69 6e 63 72 65 6d 65 6e 74 20 69 6e 20 6f  d increment in o
3250: 72 64 65 72 20 74 6f 20 67 6f 20 74 6f 20 74 68  rder to go to th
3260: 65 0a 2a 2a 20 6e 65 78 74 20 70 65 65 72 20 76  e.** next peer v
3270: 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
3280: 75 33 32 20 6a 73 6f 6e 4e 6f 64 65 53 69 7a 65  u32 jsonNodeSize
3290: 28 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65  (JsonNode *pNode
32a0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 4e 6f 64  ){.  return pNod
32b0: 65 2d 3e 65 54 79 70 65 3e 3d 4a 53 4f 4e 5f 41  e->eType>=JSON_A
32c0: 52 52 41 59 20 3f 20 70 4e 6f 64 65 2d 3e 6e 2b  RRAY ? pNode->n+
32d0: 31 20 3a 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1 : 1;.}../*.** 
32e0: 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f  Reclaim all memo
32f0: 72 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ry allocated by 
3300: 61 20 4a 73 6f 6e 50 61 72 73 65 20 6f 62 6a 65  a JsonParse obje
3310: 63 74 2e 20 20 42 75 74 20 64 6f 20 6e 6f 74 0a  ct.  But do not.
3320: 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 4a 73  ** delete the Js
3330: 6f 6e 50 61 72 73 65 20 6f 62 6a 65 63 74 20 69  onParse object i
3340: 74 73 65 6c 66 2e 0a 2a 2f 0a 73 74 61 74 69 63  tself..*/.static
3350: 20 76 6f 69 64 20 6a 73 6f 6e 50 61 72 73 65 52   void jsonParseR
3360: 65 73 65 74 28 4a 73 6f 6e 50 61 72 73 65 20 2a  eset(JsonParse *
3370: 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
3380: 65 33 5f 66 72 65 65 28 70 50 61 72 73 65 2d 3e  e3_free(pParse->
3390: 61 4e 6f 64 65 29 3b 0a 20 20 70 50 61 72 73 65  aNode);.  pParse
33a0: 2d 3e 61 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 70  ->aNode = 0;.  p
33b0: 50 61 72 73 65 2d 3e 6e 4e 6f 64 65 20 3d 20 30  Parse->nNode = 0
33c0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 41 6c 6c  ;.  pParse->nAll
33d0: 6f 63 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  oc = 0;.  sqlite
33e0: 33 5f 66 72 65 65 28 70 50 61 72 73 65 2d 3e 61  3_free(pParse->a
33f0: 55 70 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 61  Up);.  pParse->a
3400: 55 70 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Up = 0;.}../*.**
3410: 20 46 72 65 65 20 61 20 4a 73 6f 6e 50 61 72 73   Free a JsonPars
3420: 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 61  e object that wa
3430: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
3440: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
3450: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3460: 20 6a 73 6f 6e 50 61 72 73 65 46 72 65 65 28 4a   jsonParseFree(J
3470: 73 6f 6e 50 61 72 73 65 20 2a 70 50 61 72 73 65  sonParse *pParse
3480: 29 7b 0a 20 20 6a 73 6f 6e 50 61 72 73 65 52 65  ){.  jsonParseRe
3490: 73 65 74 28 70 50 61 72 73 65 29 3b 0a 20 20 73  set(pParse);.  s
34a0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 72  qlite3_free(pPar
34b0: 73 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  se);.}../*.** Co
34c0: 6e 76 65 72 74 20 74 68 65 20 4a 73 6f 6e 4e 6f  nvert the JsonNo
34d0: 64 65 20 70 4e 6f 64 65 20 69 6e 74 6f 20 61 20  de pNode into a 
34e0: 70 75 72 65 20 4a 53 4f 4e 20 73 74 72 69 6e 67  pure JSON string
34f0: 20 61 6e 64 0a 2a 2a 20 61 70 70 65 6e 64 20 74   and.** append t
3500: 6f 20 70 4f 75 74 2e 20 20 53 75 62 73 75 62 73  o pOut.  Subsubs
3510: 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 73 6f  tructure is also
3520: 20 69 6e 63 6c 75 64 65 64 2e 20 20 52 65 74 75   included.  Retu
3530: 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  rn.** the number
3540: 20 6f 66 20 4a 73 6f 6e 4e 6f 64 65 20 6f 62 6a   of JsonNode obj
3550: 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65 6e  ects that are en
3560: 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  coded..*/.static
3570: 20 76 6f 69 64 20 6a 73 6f 6e 52 65 6e 64 65 72   void jsonRender
3580: 4e 6f 64 65 28 0a 20 20 4a 73 6f 6e 4e 6f 64 65  Node(.  JsonNode
3590: 20 2a 70 4e 6f 64 65 2c 20 20 20 20 20 20 20 20   *pNode,        
35a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 6f         /* The no
35b0: 64 65 20 74 6f 20 72 65 6e 64 65 72 20 2a 2f 0a  de to render */.
35c0: 20 20 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70 4f    JsonString *pO
35d0: 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ut,             
35e0: 20 2f 2a 20 57 72 69 74 65 20 4a 53 4f 4e 20 68   /* Write JSON h
35f0: 65 72 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ere */.  sqlite3
3600: 5f 76 61 6c 75 65 20 2a 2a 61 52 65 70 6c 61 63  _value **aReplac
3610: 65 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6c 61  e       /* Repla
3620: 63 65 6d 65 6e 74 20 76 61 6c 75 65 73 20 2a 2f  cement values */
3630: 0a 29 7b 0a 20 20 69 66 28 20 70 4e 6f 64 65 2d  .){.  if( pNode-
3640: 3e 6a 6e 46 6c 61 67 73 20 26 20 28 4a 4e 4f 44  >jnFlags & (JNOD
3650: 45 5f 52 45 50 4c 41 43 45 7c 4a 4e 4f 44 45 5f  E_REPLACE|JNODE_
3660: 50 41 54 43 48 29 20 29 7b 0a 20 20 20 20 69 66  PATCH) ){.    if
3670: 28 20 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73  ( pNode->jnFlags
3680: 20 26 20 4a 4e 4f 44 45 5f 52 45 50 4c 41 43 45   & JNODE_REPLACE
3690: 20 29 7b 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70   ){.      jsonAp
36a0: 70 65 6e 64 56 61 6c 75 65 28 70 4f 75 74 2c 20  pendValue(pOut, 
36b0: 61 52 65 70 6c 61 63 65 5b 70 4e 6f 64 65 2d 3e  aReplace[pNode->
36c0: 75 2e 69 52 65 70 6c 61 63 65 5d 29 3b 0a 20 20  u.iReplace]);.  
36d0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
36e0: 7d 0a 20 20 20 20 70 4e 6f 64 65 20 3d 20 70 4e  }.    pNode = pN
36f0: 6f 64 65 2d 3e 75 2e 70 50 61 74 63 68 3b 0a 20  ode->u.pPatch;. 
3700: 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70 4e 6f   }.  switch( pNo
3710: 64 65 2d 3e 65 54 79 70 65 20 29 7b 0a 20 20 20  de->eType ){.   
3720: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
3730: 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d    assert( pNode-
3740: 3e 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f 4e 55 4c  >eType==JSON_NUL
3750: 4c 20 29 3b 0a 20 20 20 20 20 20 6a 73 6f 6e 41  L );.      jsonA
3760: 70 70 65 6e 64 52 61 77 28 70 4f 75 74 2c 20 22  ppendRaw(pOut, "
3770: 6e 75 6c 6c 22 2c 20 34 29 3b 0a 20 20 20 20 20  null", 4);.     
3780: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
3790: 20 20 63 61 73 65 20 4a 53 4f 4e 5f 54 52 55 45    case JSON_TRUE
37a0: 3a 20 7b 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70  : {.      jsonAp
37b0: 70 65 6e 64 52 61 77 28 70 4f 75 74 2c 20 22 74  pendRaw(pOut, "t
37c0: 72 75 65 22 2c 20 34 29 3b 0a 20 20 20 20 20 20  rue", 4);.      
37d0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
37e0: 20 63 61 73 65 20 4a 53 4f 4e 5f 46 41 4c 53 45   case JSON_FALSE
37f0: 3a 20 7b 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70  : {.      jsonAp
3800: 70 65 6e 64 52 61 77 28 70 4f 75 74 2c 20 22 66  pendRaw(pOut, "f
3810: 61 6c 73 65 22 2c 20 35 29 3b 0a 20 20 20 20 20  alse", 5);.     
3820: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
3830: 20 20 63 61 73 65 20 4a 53 4f 4e 5f 53 54 52 49    case JSON_STRI
3840: 4e 47 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  NG: {.      if( 
3850: 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73 20 26  pNode->jnFlags &
3860: 20 4a 4e 4f 44 45 5f 52 41 57 20 29 7b 0a 20 20   JNODE_RAW ){.  
3870: 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64        jsonAppend
3880: 53 74 72 69 6e 67 28 70 4f 75 74 2c 20 70 4e 6f  String(pOut, pNo
3890: 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 2c  de->u.zJContent,
38a0: 20 70 4e 6f 64 65 2d 3e 6e 29 3b 0a 20 20 20 20   pNode->n);.    
38b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
38c0: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c   }.      /* Fall
38d0: 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20 74 68   through into th
38e0: 65 20 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20  e next case */. 
38f0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 53     }.    case JS
3900: 4f 4e 5f 52 45 41 4c 3a 0a 20 20 20 20 63 61 73  ON_REAL:.    cas
3910: 65 20 4a 53 4f 4e 5f 49 4e 54 3a 20 7b 0a 20 20  e JSON_INT: {.  
3920: 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 52 61      jsonAppendRa
3930: 77 28 70 4f 75 74 2c 20 70 4e 6f 64 65 2d 3e 75  w(pOut, pNode->u
3940: 2e 7a 4a 43 6f 6e 74 65 6e 74 2c 20 70 4e 6f 64  .zJContent, pNod
3950: 65 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  e->n);.      bre
3960: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
3970: 73 65 20 4a 53 4f 4e 5f 41 52 52 41 59 3a 20 7b  se JSON_ARRAY: {
3980: 0a 20 20 20 20 20 20 75 33 32 20 6a 20 3d 20 31  .      u32 j = 1
3990: 3b 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65  ;.      jsonAppe
39a0: 6e 64 43 68 61 72 28 70 4f 75 74 2c 20 27 5b 27  ndChar(pOut, '['
39b0: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29  );.      for(;;)
39c0: 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
39d0: 20 6a 3c 3d 70 4e 6f 64 65 2d 3e 6e 20 29 7b 0a   j<=pNode->n ){.
39e0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
39f0: 4e 6f 64 65 5b 6a 5d 2e 6a 6e 46 6c 61 67 73 20  Node[j].jnFlags 
3a00: 26 20 4a 4e 4f 44 45 5f 52 45 4d 4f 56 45 29 3d  & JNODE_REMOVE)=
3a10: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
3a20: 20 20 6a 73 6f 6e 41 70 70 65 6e 64 53 65 70 61    jsonAppendSepa
3a30: 72 61 74 6f 72 28 70 4f 75 74 29 3b 0a 20 20 20  rator(pOut);.   
3a40: 20 20 20 20 20 20 20 20 20 6a 73 6f 6e 52 65 6e           jsonRen
3a50: 64 65 72 4e 6f 64 65 28 26 70 4e 6f 64 65 5b 6a  derNode(&pNode[j
3a60: 5d 2c 20 70 4f 75 74 2c 20 61 52 65 70 6c 61 63  ], pOut, aReplac
3a70: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
3a80: 20 20 20 20 20 20 20 20 20 20 6a 20 2b 3d 20 6a            j += j
3a90: 73 6f 6e 4e 6f 64 65 53 69 7a 65 28 26 70 4e 6f  sonNodeSize(&pNo
3aa0: 64 65 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 20 20  de[j]);.        
3ab0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  }.        if( (p
3ac0: 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73 20 26 20  Node->jnFlags & 
3ad0: 4a 4e 4f 44 45 5f 41 50 50 45 4e 44 29 3d 3d 30  JNODE_APPEND)==0
3ae0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
3af0: 20 20 70 4e 6f 64 65 20 3d 20 26 70 4e 6f 64 65    pNode = &pNode
3b00: 5b 70 4e 6f 64 65 2d 3e 75 2e 69 41 70 70 65 6e  [pNode->u.iAppen
3b10: 64 5d 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20  d];.        j = 
3b20: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
3b30: 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61 72 28   jsonAppendChar(
3b40: 70 4f 75 74 2c 20 27 5d 27 29 3b 0a 20 20 20 20  pOut, ']');.    
3b50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3b60: 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f 4f 42 4a     case JSON_OBJ
3b70: 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 75 33 32  ECT: {.      u32
3b80: 20 6a 20 3d 20 31 3b 0a 20 20 20 20 20 20 6a 73   j = 1;.      js
3b90: 6f 6e 41 70 70 65 6e 64 43 68 61 72 28 70 4f 75  onAppendChar(pOu
3ba0: 74 2c 20 27 7b 27 29 3b 0a 20 20 20 20 20 20 66  t, '{');.      f
3bb0: 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20  or(;;){.        
3bc0: 77 68 69 6c 65 28 20 6a 3c 3d 70 4e 6f 64 65 2d  while( j<=pNode-
3bd0: 3e 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >n ){.          
3be0: 69 66 28 20 28 70 4e 6f 64 65 5b 6a 2b 31 5d 2e  if( (pNode[j+1].
3bf0: 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f  jnFlags & JNODE_
3c00: 52 45 4d 4f 56 45 29 3d 3d 30 20 29 7b 0a 20 20  REMOVE)==0 ){.  
3c10: 20 20 20 20 20 20 20 20 20 20 6a 73 6f 6e 41 70            jsonAp
3c20: 70 65 6e 64 53 65 70 61 72 61 74 6f 72 28 70 4f  pendSeparator(pO
3c30: 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ut);.           
3c40: 20 6a 73 6f 6e 52 65 6e 64 65 72 4e 6f 64 65 28   jsonRenderNode(
3c50: 26 70 4e 6f 64 65 5b 6a 5d 2c 20 70 4f 75 74 2c  &pNode[j], pOut,
3c60: 20 61 52 65 70 6c 61 63 65 29 3b 0a 20 20 20 20   aReplace);.    
3c70: 20 20 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65          jsonAppe
3c80: 6e 64 43 68 61 72 28 70 4f 75 74 2c 20 27 3a 27  ndChar(pOut, ':'
3c90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  );.            j
3ca0: 73 6f 6e 52 65 6e 64 65 72 4e 6f 64 65 28 26 70  sonRenderNode(&p
3cb0: 4e 6f 64 65 5b 6a 2b 31 5d 2c 20 70 4f 75 74 2c  Node[j+1], pOut,
3cc0: 20 61 52 65 70 6c 61 63 65 29 3b 0a 20 20 20 20   aReplace);.    
3cd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3ce0: 20 20 6a 20 2b 3d 20 31 20 2b 20 6a 73 6f 6e 4e    j += 1 + jsonN
3cf0: 6f 64 65 53 69 7a 65 28 26 70 4e 6f 64 65 5b 6a  odeSize(&pNode[j
3d00: 2b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  +1]);.        }.
3d10: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4e 6f          if( (pNo
3d20: 64 65 2d 3e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e  de->jnFlags & JN
3d30: 4f 44 45 5f 41 50 50 45 4e 44 29 3d 3d 30 20 29  ODE_APPEND)==0 )
3d40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
3d50: 70 4e 6f 64 65 20 3d 20 26 70 4e 6f 64 65 5b 70  pNode = &pNode[p
3d60: 4e 6f 64 65 2d 3e 75 2e 69 41 70 70 65 6e 64 5d  Node->u.iAppend]
3d70: 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 31 3b  ;.        j = 1;
3d80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6a  .      }.      j
3d90: 73 6f 6e 41 70 70 65 6e 64 43 68 61 72 28 70 4f  sonAppendChar(pO
3da0: 75 74 2c 20 27 7d 27 29 3b 0a 20 20 20 20 20 20  ut, '}');.      
3db0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
3dc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
3dd0: 20 61 20 4a 73 6f 6e 4e 6f 64 65 20 61 6e 64 20   a JsonNode and 
3de0: 61 6c 6c 20 69 74 73 20 64 65 73 63 65 6e 64 65  all its descende
3df0: 6e 74 73 20 61 73 20 61 20 4a 53 4f 4e 20 73 74  nts as a JSON st
3e00: 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ring..*/.static 
3e10: 76 6f 69 64 20 6a 73 6f 6e 52 65 74 75 72 6e 4a  void jsonReturnJ
3e20: 73 6f 6e 28 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20  son(.  JsonNode 
3e30: 2a 70 4e 6f 64 65 2c 20 20 20 20 20 20 20 20 20  *pNode,         
3e40: 20 20 20 2f 2a 20 4e 6f 64 65 20 74 6f 20 72 65     /* Node to re
3e50: 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  turn */.  sqlite
3e60: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
3e70: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
3e80: 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 66  value for this f
3e90: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  unction */.  sql
3ea0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 52 65  ite3_value **aRe
3eb0: 70 6c 61 63 65 20 20 20 20 2f 2a 20 41 72 72 61  place    /* Arra
3ec0: 79 20 6f 66 20 72 65 70 6c 61 63 65 6d 65 6e 74  y of replacement
3ed0: 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20   values */.){.  
3ee0: 4a 73 6f 6e 53 74 72 69 6e 67 20 73 3b 0a 20 20  JsonString s;.  
3ef0: 6a 73 6f 6e 49 6e 69 74 28 26 73 2c 20 70 43 74  jsonInit(&s, pCt
3f00: 78 29 3b 0a 20 20 6a 73 6f 6e 52 65 6e 64 65 72  x);.  jsonRender
3f10: 4e 6f 64 65 28 70 4e 6f 64 65 2c 20 26 73 2c 20  Node(pNode, &s, 
3f20: 61 52 65 70 6c 61 63 65 29 3b 0a 20 20 6a 73 6f  aReplace);.  jso
3f30: 6e 52 65 73 75 6c 74 28 26 73 29 3b 0a 20 20 73  nResult(&s);.  s
3f40: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 73 75  qlite3_result_su
3f50: 62 74 79 70 65 28 70 43 74 78 2c 20 4a 53 4f 4e  btype(pCtx, JSON
3f60: 5f 53 55 42 54 59 50 45 29 3b 0a 7d 0a 0a 2f 2a  _SUBTYPE);.}../*
3f70: 0a 2a 2a 20 4d 61 6b 65 20 74 68 65 20 4a 73 6f  .** Make the Jso
3f80: 6e 4e 6f 64 65 20 74 68 65 20 72 65 74 75 72 6e  nNode the return
3f90: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 66 75   value of the fu
3fa0: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
3fb0: 63 20 76 6f 69 64 20 6a 73 6f 6e 52 65 74 75 72  c void jsonRetur
3fc0: 6e 28 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70  n(.  JsonNode *p
3fd0: 4e 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20  Node,           
3fe0: 20 2f 2a 20 4e 6f 64 65 20 74 6f 20 72 65 74 75   /* Node to retu
3ff0: 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  rn */.  sqlite3_
4000: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20  context *pCtx,  
4010: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61      /* Return va
4020: 6c 75 65 20 66 6f 72 20 74 68 69 73 20 66 75 6e  lue for this fun
4030: 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  ction */.  sqlit
4040: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 52 65 70 6c  e3_value **aRepl
4050: 61 63 65 20 20 20 20 2f 2a 20 41 72 72 61 79 20  ace    /* Array 
4060: 6f 66 20 72 65 70 6c 61 63 65 6d 65 6e 74 20 76  of replacement v
4070: 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 73 77  alues */.){.  sw
4080: 69 74 63 68 28 20 70 4e 6f 64 65 2d 3e 65 54 79  itch( pNode->eTy
4090: 70 65 20 29 7b 0a 20 20 20 20 64 65 66 61 75 6c  pe ){.    defaul
40a0: 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
40b0: 74 28 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65 3d  t( pNode->eType=
40c0: 3d 4a 53 4f 4e 5f 4e 55 4c 4c 20 29 3b 0a 20 20  =JSON_NULL );.  
40d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
40e0: 6c 74 5f 6e 75 6c 6c 28 70 43 74 78 29 3b 0a 20  lt_null(pCtx);. 
40f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4100: 7d 0a 20 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f  }.    case JSON_
4110: 54 52 55 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  TRUE: {.      sq
4120: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
4130: 28 70 43 74 78 2c 20 31 29 3b 0a 20 20 20 20 20  (pCtx, 1);.     
4140: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4150: 20 20 63 61 73 65 20 4a 53 4f 4e 5f 46 41 4c 53    case JSON_FALS
4160: 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
4170: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 70 43  e3_result_int(pC
4180: 74 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  tx, 0);.      br
4190: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
41a0: 61 73 65 20 4a 53 4f 4e 5f 49 4e 54 3a 20 7b 0a  ase JSON_INT: {.
41b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
41c0: 74 36 34 20 69 20 3d 20 30 3b 0a 20 20 20 20 20  t64 i = 0;.     
41d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
41e0: 20 70 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74   pNode->u.zJCont
41f0: 65 6e 74 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  ent;.      if( z
4200: 5b 30 5d 3d 3d 27 2d 27 20 29 7b 20 7a 2b 2b 3b  [0]=='-' ){ z++;
4210: 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20   }.      while( 
4220: 7a 5b 30 5d 3e 3d 27 30 27 20 26 26 20 7a 5b 30  z[0]>='0' && z[0
4230: 5d 3c 3d 27 39 27 20 29 7b 0a 20 20 20 20 20 20  ]<='9' ){.      
4240: 20 20 75 6e 73 69 67 6e 65 64 20 76 20 3d 20 2a    unsigned v = *
4250: 28 7a 2b 2b 29 20 2d 20 27 30 27 3b 0a 20 20 20  (z++) - '0';.   
4260: 20 20 20 20 20 69 66 28 20 69 3e 3d 4c 41 52 47       if( i>=LARG
4270: 45 53 54 5f 49 4e 54 36 34 2f 31 30 20 29 7b 0a  EST_INT64/10 ){.
4280: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
4290: 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 2f 31 30  LARGEST_INT64/10
42a0: 20 29 20 67 6f 74 6f 20 69 6e 74 5f 61 73 5f 72   ) goto int_as_r
42b0: 65 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 69  eal;.          i
42c0: 66 28 20 7a 5b 30 5d 3e 3d 27 30 27 20 26 26 20  f( z[0]>='0' && 
42d0: 7a 5b 30 5d 3c 3d 27 39 27 20 29 20 67 6f 74 6f  z[0]<='9' ) goto
42e0: 20 69 6e 74 5f 61 73 5f 72 65 61 6c 3b 0a 20 20   int_as_real;.  
42f0: 20 20 20 20 20 20 20 20 69 66 28 20 76 3d 3d 39          if( v==9
4300: 20 29 20 67 6f 74 6f 20 69 6e 74 5f 61 73 5f 72   ) goto int_as_r
4310: 65 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 69  eal;.          i
4320: 66 28 20 76 3d 3d 38 20 29 7b 0a 20 20 20 20 20  f( v==8 ){.     
4330: 20 20 20 20 20 20 20 69 66 28 20 70 4e 6f 64 65         if( pNode
4340: 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 5b 30 5d  ->u.zJContent[0]
4350: 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20  =='-' ){.       
4360: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
4370: 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74 78  esult_int64(pCtx
4380: 2c 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34  , SMALLEST_INT64
4390: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
43a0: 20 67 6f 74 6f 20 69 6e 74 5f 64 6f 6e 65 3b 0a   goto int_done;.
43b0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
43c0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
43d0: 20 67 6f 74 6f 20 69 6e 74 5f 61 73 5f 72 65 61   goto int_as_rea
43e0: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  l;.            }
43f0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
4400: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
4410: 20 3d 20 69 2a 31 30 20 2b 20 76 3b 0a 20 20 20   = i*10 + v;.   
4420: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
4430: 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e  Node->u.zJConten
4440: 74 5b 30 5d 3d 3d 27 2d 27 20 29 7b 20 69 20 3d  t[0]=='-' ){ i =
4450: 20 2d 69 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c   -i; }.      sql
4460: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
4470: 34 28 70 43 74 78 2c 20 69 29 3b 0a 20 20 20 20  4(pCtx, i);.    
4480: 20 20 69 6e 74 5f 64 6f 6e 65 3a 0a 20 20 20 20    int_done:.    
4490: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69    break;.      i
44a0: 6e 74 5f 61 73 5f 72 65 61 6c 3a 20 2f 2a 20 66  nt_as_real: /* f
44b0: 61 6c 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 72  all through to r
44c0: 65 61 6c 20 2a 2f 3b 0a 20 20 20 20 7d 0a 20 20  eal */;.    }.  
44d0: 20 20 63 61 73 65 20 4a 53 4f 4e 5f 52 45 41 4c    case JSON_REAL
44e0: 3a 20 7b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65  : {.      double
44f0: 20 72 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   r;.#ifdef SQLIT
4500: 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a 20  E_AMALGAMATION. 
4510: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
4520: 2a 7a 20 3d 20 70 4e 6f 64 65 2d 3e 75 2e 7a 4a  *z = pNode->u.zJ
4530: 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20 73  Content;.      s
4540: 71 6c 69 74 65 33 41 74 6f 46 28 7a 2c 20 26 72  qlite3AtoF(z, &r
4550: 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  , sqlite3Strlen3
4560: 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54 46  0(z), SQLITE_UTF
4570: 38 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  8);.#else.      
4580: 72 20 3d 20 73 74 72 74 6f 64 28 70 4e 6f 64 65  r = strtod(pNode
4590: 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 2c 20 30  ->u.zJContent, 0
45a0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
45b0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64  sqlite3_result_d
45c0: 6f 75 62 6c 65 28 70 43 74 78 2c 20 72 29 3b 0a  ouble(pCtx, r);.
45d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
45e0: 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 53 4f 4e   }.    case JSON
45f0: 5f 53 54 52 49 4e 47 3a 20 7b 0a 23 69 66 20 30  _STRING: {.#if 0
4600: 20 2f 2a 20 4e 65 76 65 72 20 68 61 70 70 65 6e   /* Never happen
4610: 73 20 62 65 63 61 75 73 65 20 4a 4e 4f 44 45 5f  s because JNODE_
4620: 52 41 57 20 69 73 20 6f 6e 6c 79 20 73 65 74 20  RAW is only set 
4630: 62 79 20 6a 73 6f 6e 5f 73 65 74 28 29 2c 0a 20  by json_set(),. 
4640: 20 20 20 20 20 2a 2a 20 6a 73 6f 6e 5f 69 6e 73       ** json_ins
4650: 65 72 74 28 29 20 61 6e 64 20 6a 73 6f 6e 5f 72  ert() and json_r
4660: 65 70 6c 61 63 65 28 29 20 61 6e 64 20 74 68 6f  eplace() and tho
4670: 73 65 20 72 6f 75 74 69 6e 65 73 20 64 6f 20 6e  se routines do n
4680: 6f 74 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c  ot.      ** call
4690: 20 6a 73 6f 6e 52 65 74 75 72 6e 28 29 20 2a 2f   jsonReturn() */
46a0: 0a 20 20 20 20 20 20 69 66 28 20 70 4e 6f 64 65  .      if( pNode
46b0: 2d 3e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44  ->jnFlags & JNOD
46c0: 45 5f 52 41 57 20 29 7b 0a 20 20 20 20 20 20 20  E_RAW ){.       
46d0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
46e0: 74 65 78 74 28 70 43 74 78 2c 20 70 4e 6f 64 65  text(pCtx, pNode
46f0: 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 2c 20 70  ->u.zJContent, p
4700: 4e 6f 64 65 2d 3e 6e 2c 0a 20 20 20 20 20 20 20  Node->n,.       
4710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4720: 20 20 20 20 20 53 51 4c 49 54 45 5f 54 52 41 4e       SQLITE_TRAN
4730: 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 65  SIENT);.      }e
4740: 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20 20 20 20  lse .#endif.    
4750: 20 20 61 73 73 65 72 74 28 20 28 70 4e 6f 64 65    assert( (pNode
4760: 2d 3e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44  ->jnFlags & JNOD
4770: 45 5f 52 41 57 29 3d 3d 30 20 29 3b 0a 20 20 20  E_RAW)==0 );.   
4780: 20 20 20 69 66 28 20 28 70 4e 6f 64 65 2d 3e 6a     if( (pNode->j
4790: 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 45  nFlags & JNODE_E
47a0: 53 43 41 50 45 29 3d 3d 30 20 29 7b 0a 20 20 20  SCAPE)==0 ){.   
47b0: 20 20 20 20 20 2f 2a 20 4a 53 4f 4e 20 66 6f 72       /* JSON for
47c0: 6d 61 74 74 65 64 20 77 69 74 68 6f 75 74 20 61  matted without a
47d0: 6e 79 20 62 61 63 6b 73 6c 61 73 68 2d 65 73 63  ny backslash-esc
47e0: 61 70 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  apes */.        
47f0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
4800: 65 78 74 28 70 43 74 78 2c 20 70 4e 6f 64 65 2d  ext(pCtx, pNode-
4810: 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 2b 31 2c 20  >u.zJContent+1, 
4820: 70 4e 6f 64 65 2d 3e 6e 2d 32 2c 0a 20 20 20 20  pNode->n-2,.    
4830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4840: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54          SQLITE_T
4850: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20  RANSIENT);.     
4860: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
4870: 2f 2a 20 54 72 61 6e 73 6c 61 74 65 20 4a 53 4f  /* Translate JSO
4880: 4e 20 66 6f 72 6d 61 74 74 65 64 20 73 74 72 69  N formatted stri
4890: 6e 67 20 69 6e 74 6f 20 72 61 77 20 74 65 78 74  ng into raw text
48a0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20   */.        u32 
48b0: 69 3b 0a 20 20 20 20 20 20 20 20 75 33 32 20 6e  i;.        u32 n
48c0: 20 3d 20 70 4e 6f 64 65 2d 3e 6e 3b 0a 20 20 20   = pNode->n;.   
48d0: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
48e0: 2a 7a 20 3d 20 70 4e 6f 64 65 2d 3e 75 2e 7a 4a  *z = pNode->u.zJ
48f0: 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20 20  Content;.       
4900: 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 20 20 20   char *zOut;.   
4910: 20 20 20 20 20 75 33 32 20 6a 3b 0a 20 20 20 20       u32 j;.    
4920: 20 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74      zOut = sqlit
4930: 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 2b 31 20 29  e3_malloc( n+1 )
4940: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4f  ;.        if( zO
4950: 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ut==0 ){.       
4960: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
4970: 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43  t_error_nomem(pC
4980: 74 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  tx);.          b
4990: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
49a0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 2c          for(i=1,
49b0: 20 6a 3d 30 3b 20 69 3c 6e 2d 31 3b 20 69 2b 2b   j=0; i<n-1; i++
49c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  ){.          cha
49d0: 72 20 63 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20  r c = z[i];.    
49e0: 20 20 20 20 20 20 69 66 28 20 63 21 3d 27 5c 5c        if( c!='\\
49f0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ' ){.           
4a00: 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a   zOut[j++] = c;.
4a10: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
4a20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 20 3d  .            c =
4a30: 20 7a 5b 2b 2b 69 5d 3b 0a 20 20 20 20 20 20 20   z[++i];.       
4a40: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 75 27 20       if( c=='u' 
4a50: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
4a60: 20 75 33 32 20 76 20 3d 20 30 2c 20 6b 3b 0a 20   u32 v = 0, k;. 
4a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
4a80: 28 6b 3d 30 3b 20 6b 3c 34 3b 20 69 2b 2b 2c 20  (k=0; k<4; i++, 
4a90: 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  k++){.          
4aa0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3c        assert( i<
4ab0: 6e 2d 32 20 29 3b 0a 20 20 20 20 20 20 20 20 20  n-2 );.         
4ac0: 20 20 20 20 20 20 20 63 20 3d 20 7a 5b 69 2b 31         c = z[i+1
4ad0: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
4ae0: 20 20 20 61 73 73 65 72 74 28 20 73 61 66 65 5f     assert( safe_
4af0: 69 73 78 64 69 67 69 74 28 63 29 20 29 3b 0a 20  isxdigit(c) );. 
4b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
4b10: 66 28 20 63 3c 3d 27 39 27 20 29 20 76 20 3d 20  f( c<='9' ) v = 
4b20: 76 2a 31 36 20 2b 20 63 20 2d 20 27 30 27 3b 0a  v*16 + c - '0';.
4b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b40: 65 6c 73 65 20 69 66 28 20 63 3c 3d 27 46 27 20  else if( c<='F' 
4b50: 29 20 76 20 3d 20 76 2a 31 36 20 2b 20 63 20 2d  ) v = v*16 + c -
4b60: 20 27 41 27 20 2b 20 31 30 3b 0a 20 20 20 20 20   'A' + 10;.     
4b70: 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20             else 
4b80: 76 20 3d 20 76 2a 31 36 20 2b 20 63 20 2d 20 27  v = v*16 + c - '
4b90: 61 27 20 2b 20 31 30 3b 0a 20 20 20 20 20 20 20  a' + 10;.       
4ba0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4bb0: 20 20 20 20 20 20 20 69 66 28 20 76 3d 3d 30 20         if( v==0 
4bc0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
4bd0: 20 20 20 20 20 20 20 69 66 28 20 76 3c 3d 30 78         if( v<=0x
4be0: 37 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  7f ){.          
4bf0: 20 20 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20        zOut[j++] 
4c00: 3d 20 28 63 68 61 72 29 76 3b 0a 20 20 20 20 20  = (char)v;.     
4c10: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
4c20: 66 28 20 76 3c 3d 30 78 37 66 66 20 29 7b 0a 20  f( v<=0x7ff ){. 
4c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
4c40: 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 28 63 68 61 72  Out[j++] = (char
4c50: 29 28 30 78 63 30 20 7c 20 28 76 3e 3e 36 29 29  )(0xc0 | (v>>6))
4c60: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
4c70: 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 30 78    zOut[j++] = 0x
4c80: 38 30 20 7c 20 28 76 26 30 78 33 66 29 3b 0a 20  80 | (v&0x3f);. 
4c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c               }el
4ca0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
4cb0: 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20      zOut[j++] = 
4cc0: 28 63 68 61 72 29 28 30 78 65 30 20 7c 20 28 76  (char)(0xe0 | (v
4cd0: 3e 3e 31 32 29 29 3b 0a 20 20 20 20 20 20 20 20  >>12));.        
4ce0: 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b          zOut[j++
4cf0: 5d 20 3d 20 30 78 38 30 20 7c 20 28 28 76 3e 3e  ] = 0x80 | ((v>>
4d00: 36 29 26 30 78 33 66 29 3b 0a 20 20 20 20 20 20  6)&0x3f);.      
4d10: 20 20 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 6a            zOut[j
4d20: 2b 2b 5d 20 3d 20 30 78 38 30 20 7c 20 28 76 26  ++] = 0x80 | (v&
4d30: 30 78 33 66 29 3b 0a 20 20 20 20 20 20 20 20 20  0x3f);.         
4d40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
4d50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4d60: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
4d70: 62 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b' ){.          
4d80: 20 20 20 20 20 20 63 20 3d 20 27 5c 62 27 3b 0a        c = '\b';.
4d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65                }e
4da0: 6c 73 65 20 69 66 28 20 63 3d 3d 27 66 27 20 29  lse if( c=='f' )
4db0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
4dc0: 20 20 63 20 3d 20 27 5c 66 27 3b 0a 20 20 20 20    c = '\f';.    
4dd0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
4de0: 69 66 28 20 63 3d 3d 27 6e 27 20 29 7b 0a 20 20  if( c=='n' ){.  
4df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 20                c 
4e00: 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20  = '\n';.        
4e10: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
4e20: 63 3d 3d 27 72 27 20 29 7b 0a 20 20 20 20 20 20  c=='r' ){.      
4e30: 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c            c = '\
4e40: 72 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r';.            
4e50: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
4e60: 74 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t' ){.          
4e70: 20 20 20 20 20 20 63 20 3d 20 27 5c 74 27 3b 0a        c = '\t';.
4e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
4e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4f                zO
4ea0: 75 74 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20  ut[j++] = c;.   
4eb0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
4ec0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
4ed0: 0a 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 6a 5d  .        zOut[j]
4ee0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71   = 0;.        sq
4ef0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
4f00: 74 28 70 43 74 78 2c 20 7a 4f 75 74 2c 20 6a 2c  t(pCtx, zOut, j,
4f10: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a   sqlite3_free);.
4f20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
4f30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
4f40: 61 73 65 20 4a 53 4f 4e 5f 41 52 52 41 59 3a 0a  ase JSON_ARRAY:.
4f50: 20 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f 4f 42      case JSON_OB
4f60: 4a 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 6a 73  JECT: {.      js
4f70: 6f 6e 52 65 74 75 72 6e 4a 73 6f 6e 28 70 4e 6f  onReturnJson(pNo
4f80: 64 65 2c 20 70 43 74 78 2c 20 61 52 65 70 6c 61  de, pCtx, aRepla
4f90: 63 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ce);.      break
4fa0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
4fb0: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
4fc0: 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nce */.static in
4fd0: 74 20 6a 73 6f 6e 50 61 72 73 65 41 64 64 4e 6f  t jsonParseAddNo
4fe0: 64 65 28 4a 73 6f 6e 50 61 72 73 65 2a 2c 75 33  de(JsonParse*,u3
4ff0: 32 2c 75 33 32 2c 63 6f 6e 73 74 20 63 68 61 72  2,u32,const char
5000: 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d 61 63  *);../*.** A mac
5010: 72 6f 20 74 6f 20 68 69 6e 74 20 74 6f 20 74 68  ro to hint to th
5020: 65 20 63 6f 6d 70 69 6c 65 72 20 74 68 61 74 20  e compiler that 
5030: 61 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  a function shoul
5040: 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 69 6e 6c 69  d not be.** inli
5050: 6e 65 64 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  ned..*/.#if defi
5060: 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 0a 23 20  ned(__GNUC__).# 
5070: 20 64 65 66 69 6e 65 20 4a 53 4f 4e 5f 4e 4f 49   define JSON_NOI
5080: 4e 4c 49 4e 45 20 20 5f 5f 61 74 74 72 69 62 75  NLINE  __attribu
5090: 74 65 5f 5f 28 28 6e 6f 69 6e 6c 69 6e 65 29 29  te__((noinline))
50a0: 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 5f  .#elif defined(_
50b0: 4d 53 43 5f 56 45 52 29 20 26 26 20 5f 4d 53 43  MSC_VER) && _MSC
50c0: 5f 56 45 52 3e 3d 31 33 31 30 0a 23 20 20 64 65  _VER>=1310.#  de
50d0: 66 69 6e 65 20 4a 53 4f 4e 5f 4e 4f 49 4e 4c 49  fine JSON_NOINLI
50e0: 4e 45 20 20 5f 5f 64 65 63 6c 73 70 65 63 28 6e  NE  __declspec(n
50f0: 6f 69 6e 6c 69 6e 65 29 0a 23 65 6c 73 65 0a 23  oinline).#else.#
5100: 20 20 64 65 66 69 6e 65 20 4a 53 4f 4e 5f 4e 4f    define JSON_NO
5110: 49 4e 4c 49 4e 45 0a 23 65 6e 64 69 66 0a 0a 0a  INLINE.#endif...
5120: 73 74 61 74 69 63 20 4a 53 4f 4e 5f 4e 4f 49 4e  static JSON_NOIN
5130: 4c 49 4e 45 20 69 6e 74 20 6a 73 6f 6e 50 61 72  LINE int jsonPar
5140: 73 65 41 64 64 4e 6f 64 65 45 78 70 61 6e 64 28  seAddNodeExpand(
5150: 0a 20 20 4a 73 6f 6e 50 61 72 73 65 20 2a 70 50  .  JsonParse *pP
5160: 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
5170: 41 70 70 65 6e 64 20 74 68 65 20 6e 6f 64 65 20  Append the node 
5180: 74 6f 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a  to this object *
5190: 2f 0a 20 20 75 33 32 20 65 54 79 70 65 2c 20 20  /.  u32 eType,  
51a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
51b0: 20 4e 6f 64 65 20 74 79 70 65 20 2a 2f 0a 20 20   Node type */.  
51c0: 75 33 32 20 6e 2c 20 20 20 20 20 20 20 20 20 20  u32 n,          
51d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
51e0: 74 65 6e 74 20 73 69 7a 65 20 6f 72 20 73 75 62  tent size or sub
51f0: 2d 6e 6f 64 65 20 63 6f 75 6e 74 20 2a 2f 0a 20  -node count */. 
5200: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
5210: 6e 74 65 6e 74 20 20 20 20 20 20 2f 2a 20 43 6f  ntent      /* Co
5220: 6e 74 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 75 33  ntent */.){.  u3
5230: 32 20 6e 4e 65 77 3b 0a 20 20 4a 73 6f 6e 4e 6f  2 nNew;.  JsonNo
5240: 64 65 20 2a 70 4e 65 77 3b 0a 20 20 61 73 73 65  de *pNew;.  asse
5250: 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 4e 6f 64  rt( pParse->nNod
5260: 65 3e 3d 70 50 61 72 73 65 2d 3e 6e 41 6c 6c 6f  e>=pParse->nAllo
5270: 63 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  c );.  if( pPars
5280: 65 2d 3e 6f 6f 6d 20 29 20 72 65 74 75 72 6e 20  e->oom ) return 
5290: 2d 31 3b 0a 20 20 6e 4e 65 77 20 3d 20 70 50 61  -1;.  nNew = pPa
52a0: 72 73 65 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20  rse->nAlloc*2 + 
52b0: 31 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  10;.  pNew = sql
52c0: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70  ite3_realloc64(p
52d0: 50 61 72 73 65 2d 3e 61 4e 6f 64 65 2c 20 73 69  Parse->aNode, si
52e0: 7a 65 6f 66 28 4a 73 6f 6e 4e 6f 64 65 29 2a 6e  zeof(JsonNode)*n
52f0: 4e 65 77 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  New);.  if( pNew
5300: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 72 73  ==0 ){.    pPars
5310: 65 2d 3e 6f 6f 6d 20 3d 20 31 3b 0a 20 20 20 20  e->oom = 1;.    
5320: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20  return -1;.  }. 
5330: 20 70 50 61 72 73 65 2d 3e 6e 41 6c 6c 6f 63 20   pParse->nAlloc 
5340: 3d 20 6e 4e 65 77 3b 0a 20 20 70 50 61 72 73 65  = nNew;.  pParse
5350: 2d 3e 61 4e 6f 64 65 20 3d 20 70 4e 65 77 3b 0a  ->aNode = pNew;.
5360: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
5370: 2d 3e 6e 4e 6f 64 65 3c 70 50 61 72 73 65 2d 3e  ->nNode<pParse->
5380: 6e 41 6c 6c 6f 63 20 29 3b 0a 20 20 72 65 74 75  nAlloc );.  retu
5390: 72 6e 20 6a 73 6f 6e 50 61 72 73 65 41 64 64 4e  rn jsonParseAddN
53a0: 6f 64 65 28 70 50 61 72 73 65 2c 20 65 54 79 70  ode(pParse, eTyp
53b0: 65 2c 20 6e 2c 20 7a 43 6f 6e 74 65 6e 74 29 3b  e, n, zContent);
53c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
53d0: 20 61 20 6e 65 77 20 4a 73 6f 6e 4e 6f 64 65 20   a new JsonNode 
53e0: 69 6e 73 74 61 6e 63 65 20 62 61 73 65 64 20 6f  instance based o
53f0: 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20  n the arguments 
5400: 61 6e 64 20 61 70 70 65 6e 64 20 74 68 61 74 0a  and append that.
5410: 2a 2a 20 69 6e 73 74 61 6e 63 65 20 74 6f 20 74  ** instance to t
5420: 68 65 20 4a 73 6f 6e 50 61 72 73 65 2e 20 20 52  he JsonParse.  R
5430: 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
5440: 69 6e 20 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65  in pParse->aNode
5450: 5b 5d 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 65 77  [] of the.** new
5460: 20 6e 6f 64 65 2c 20 6f 72 20 2d 31 20 69 66 20   node, or -1 if 
5470: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
5480: 69 6f 6e 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  ion fails..*/.st
5490: 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e 50 61 72  atic int jsonPar
54a0: 73 65 41 64 64 4e 6f 64 65 28 0a 20 20 4a 73 6f  seAddNode(.  Jso
54b0: 6e 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  nParse *pParse, 
54c0: 20 20 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64         /* Append
54d0: 20 74 68 65 20 6e 6f 64 65 20 74 6f 20 74 68 69   the node to thi
54e0: 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75 33  s object */.  u3
54f0: 32 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20  2 eType,        
5500: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 64 65 20          /* Node 
5510: 74 79 70 65 20 2a 2f 0a 20 20 75 33 32 20 6e 2c  type */.  u32 n,
5520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5530: 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 73      /* Content s
5540: 69 7a 65 20 6f 72 20 73 75 62 2d 6e 6f 64 65 20  ize or sub-node 
5550: 63 6f 75 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  count */.  const
5560: 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 6e 74 20   char *zContent 
5570: 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20       /* Content 
5580: 2a 2f 0a 29 7b 0a 20 20 4a 73 6f 6e 4e 6f 64 65  */.){.  JsonNode
5590: 20 2a 70 3b 0a 20 20 69 66 28 20 70 50 61 72 73   *p;.  if( pPars
55a0: 65 2d 3e 6e 4e 6f 64 65 3e 3d 70 50 61 72 73 65  e->nNode>=pParse
55b0: 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  ->nAlloc ){.    
55c0: 72 65 74 75 72 6e 20 6a 73 6f 6e 50 61 72 73 65  return jsonParse
55d0: 41 64 64 4e 6f 64 65 45 78 70 61 6e 64 28 70 50  AddNodeExpand(pP
55e0: 61 72 73 65 2c 20 65 54 79 70 65 2c 20 6e 2c 20  arse, eType, n, 
55f0: 7a 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 7d 0a 20  zContent);.  }. 
5600: 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 4e   p = &pParse->aN
5610: 6f 64 65 5b 70 50 61 72 73 65 2d 3e 6e 4e 6f 64  ode[pParse->nNod
5620: 65 5d 3b 0a 20 20 70 2d 3e 65 54 79 70 65 20 3d  e];.  p->eType =
5630: 20 28 75 38 29 65 54 79 70 65 3b 0a 20 20 70 2d   (u8)eType;.  p-
5640: 3e 6a 6e 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20  >jnFlags = 0;.  
5650: 70 2d 3e 6e 20 3d 20 6e 3b 0a 20 20 70 2d 3e 75  p->n = n;.  p->u
5660: 2e 7a 4a 43 6f 6e 74 65 6e 74 20 3d 20 7a 43 6f  .zJContent = zCo
5670: 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20  ntent;.  return 
5680: 70 50 61 72 73 65 2d 3e 6e 4e 6f 64 65 2b 2b 3b  pParse->nNode++;
5690: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
56a0: 20 74 72 75 65 20 69 66 20 7a 5b 5d 20 62 65 67   true if z[] beg
56b0: 69 6e 73 20 77 69 74 68 20 34 20 28 6f 72 20 6d  ins with 4 (or m
56c0: 6f 72 65 29 20 68 65 78 61 64 65 63 69 6d 61 6c  ore) hexadecimal
56d0: 20 64 69 67 69 74 73 0a 2a 2f 0a 73 74 61 74 69   digits.*/.stati
56e0: 63 20 69 6e 74 20 6a 73 6f 6e 49 73 34 48 65 78  c int jsonIs4Hex
56f0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
5700: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
5710: 69 3d 30 3b 20 69 3c 34 3b 20 69 2b 2b 29 20 69  i=0; i<4; i++) i
5720: 66 28 20 21 73 61 66 65 5f 69 73 78 64 69 67 69  f( !safe_isxdigi
5730: 74 28 7a 5b 69 5d 29 20 29 20 72 65 74 75 72 6e  t(z[i]) ) return
5740: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   0;.  return 1;.
5750: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61  }../*.** Parse a
5760: 20 73 69 6e 67 6c 65 20 4a 53 4f 4e 20 76 61 6c   single JSON val
5770: 75 65 20 77 68 69 63 68 20 62 65 67 69 6e 73 20  ue which begins 
5780: 61 74 20 70 50 61 72 73 65 2d 3e 7a 4a 73 6f 6e  at pParse->zJson
5790: 5b 69 5d 2e 20 20 52 65 74 75 72 6e 20 74 68 65  [i].  Return the
57a0: 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65  .** index of the
57b0: 20 66 69 72 73 74 20 63 68 61 72 61 63 74 65 72   first character
57c0: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
57d0: 20 74 68 65 20 76 61 6c 75 65 20 70 61 72 73 65   the value parse
57e0: 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
57f0: 6e 65 67 61 74 69 76 65 20 66 6f 72 20 61 20 73  negative for a s
5800: 79 6e 74 61 78 20 65 72 72 6f 72 2e 20 20 53 70  yntax error.  Sp
5810: 65 63 69 61 6c 20 63 61 73 65 73 3a 20 20 72 65  ecial cases:  re
5820: 74 75 72 6e 20 2d 32 20 69 66 20 74 68 65 0a 2a  turn -2 if the.*
5830: 2a 20 66 69 72 73 74 20 6e 6f 6e 2d 77 68 69 74  * first non-whit
5840: 65 73 70 61 63 65 20 63 68 61 72 61 63 74 65 72  espace character
5850: 20 69 73 20 27 7d 27 20 61 6e 64 20 72 65 74 75   is '}' and retu
5860: 72 6e 20 2d 33 20 69 66 20 74 68 65 20 66 69 72  rn -3 if the fir
5870: 73 74 0a 2a 2a 20 6e 6f 6e 2d 77 68 69 74 65 73  st.** non-whites
5880: 70 61 63 65 20 63 68 61 72 61 63 74 65 72 20 69  pace character i
5890: 73 20 27 5d 27 2e 0a 2a 2f 0a 73 74 61 74 69 63  s ']'..*/.static
58a0: 20 69 6e 74 20 6a 73 6f 6e 50 61 72 73 65 56 61   int jsonParseVa
58b0: 6c 75 65 28 4a 73 6f 6e 50 61 72 73 65 20 2a 70  lue(JsonParse *p
58c0: 50 61 72 73 65 2c 20 75 33 32 20 69 29 7b 0a 20  Parse, u32 i){. 
58d0: 20 63 68 61 72 20 63 3b 0a 20 20 75 33 32 20 6a   char c;.  u32 j
58e0: 3b 0a 20 20 69 6e 74 20 69 54 68 69 73 3b 0a 20  ;.  int iThis;. 
58f0: 20 69 6e 74 20 78 3b 0a 20 20 4a 73 6f 6e 4e 6f   int x;.  JsonNo
5900: 64 65 20 2a 70 4e 6f 64 65 3b 0a 20 20 63 6f 6e  de *pNode;.  con
5910: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 50 61  st char *z = pPa
5920: 72 73 65 2d 3e 7a 4a 73 6f 6e 3b 0a 20 20 77 68  rse->zJson;.  wh
5930: 69 6c 65 28 20 73 61 66 65 5f 69 73 73 70 61 63  ile( safe_isspac
5940: 65 28 7a 5b 69 5d 29 20 29 7b 20 69 2b 2b 3b 20  e(z[i]) ){ i++; 
5950: 7d 0a 20 20 69 66 28 20 28 63 20 3d 20 7a 5b 69  }.  if( (c = z[i
5960: 5d 29 3d 3d 27 7b 27 20 29 7b 0a 20 20 20 20 2f  ])=='{' ){.    /
5970: 2a 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 2a  * Parse object *
5980: 2f 0a 20 20 20 20 69 54 68 69 73 20 3d 20 6a 73  /.    iThis = js
5990: 6f 6e 50 61 72 73 65 41 64 64 4e 6f 64 65 28 70  onParseAddNode(p
59a0: 50 61 72 73 65 2c 20 4a 53 4f 4e 5f 4f 42 4a 45  Parse, JSON_OBJE
59b0: 43 54 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69  CT, 0, 0);.    i
59c0: 66 28 20 69 54 68 69 73 3c 30 20 29 20 72 65 74  f( iThis<0 ) ret
59d0: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 66 6f 72 28  urn -1;.    for(
59e0: 6a 3d 69 2b 31 3b 3b 6a 2b 2b 29 7b 0a 20 20 20  j=i+1;;j++){.   
59f0: 20 20 20 77 68 69 6c 65 28 20 73 61 66 65 5f 69     while( safe_i
5a00: 73 73 70 61 63 65 28 7a 5b 6a 5d 29 20 29 7b 20  sspace(z[j]) ){ 
5a10: 6a 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 69 66 28  j++; }.      if(
5a20: 20 2b 2b 70 50 61 72 73 65 2d 3e 69 44 65 70 74   ++pParse->iDept
5a30: 68 20 3e 20 4a 53 4f 4e 5f 4d 41 58 5f 44 45 50  h > JSON_MAX_DEP
5a40: 54 48 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  TH ) return -1;.
5a50: 20 20 20 20 20 20 78 20 3d 20 6a 73 6f 6e 50 61        x = jsonPa
5a60: 72 73 65 56 61 6c 75 65 28 70 50 61 72 73 65 2c  rseValue(pParse,
5a70: 20 6a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 78   j);.      if( x
5a80: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  <0 ){.        pP
5a90: 61 72 73 65 2d 3e 69 44 65 70 74 68 2d 2d 3b 0a  arse->iDepth--;.
5aa0: 20 20 20 20 20 20 20 20 69 66 28 20 78 3d 3d 28          if( x==(
5ab0: 2d 32 29 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  -2) && pParse->n
5ac0: 4e 6f 64 65 3d 3d 28 75 33 32 29 69 54 68 69 73  Node==(u32)iThis
5ad0: 2b 31 20 29 20 72 65 74 75 72 6e 20 6a 2b 31 3b  +1 ) return j+1;
5ae0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
5af0: 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
5b00: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6f 6f    if( pParse->oo
5b10: 6d 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  m ) return -1;. 
5b20: 20 20 20 20 20 70 4e 6f 64 65 20 3d 20 26 70 50       pNode = &pP
5b30: 61 72 73 65 2d 3e 61 4e 6f 64 65 5b 70 50 61 72  arse->aNode[pPar
5b40: 73 65 2d 3e 6e 4e 6f 64 65 2d 31 5d 3b 0a 20 20  se->nNode-1];.  
5b50: 20 20 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 65      if( pNode->e
5b60: 54 79 70 65 21 3d 4a 53 4f 4e 5f 53 54 52 49 4e  Type!=JSON_STRIN
5b70: 47 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  G ) return -1;. 
5b80: 20 20 20 20 20 70 4e 6f 64 65 2d 3e 6a 6e 46 6c       pNode->jnFl
5b90: 61 67 73 20 7c 3d 20 4a 4e 4f 44 45 5f 4c 41 42  ags |= JNODE_LAB
5ba0: 45 4c 3b 0a 20 20 20 20 20 20 6a 20 3d 20 78 3b  EL;.      j = x;
5bb0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 73 61  .      while( sa
5bc0: 66 65 5f 69 73 73 70 61 63 65 28 7a 5b 6a 5d 29  fe_isspace(z[j])
5bd0: 20 29 7b 20 6a 2b 2b 3b 20 7d 0a 20 20 20 20 20   ){ j++; }.     
5be0: 20 69 66 28 20 7a 5b 6a 5d 21 3d 27 3a 27 20 29   if( z[j]!=':' )
5bf0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
5c00: 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 78 20 3d    j++;.      x =
5c10: 20 6a 73 6f 6e 50 61 72 73 65 56 61 6c 75 65 28   jsonParseValue(
5c20: 70 50 61 72 73 65 2c 20 6a 29 3b 0a 20 20 20 20  pParse, j);.    
5c30: 20 20 70 50 61 72 73 65 2d 3e 69 44 65 70 74 68    pParse->iDepth
5c40: 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3c  --;.      if( x<
5c50: 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  0 ) return -1;. 
5c60: 20 20 20 20 20 6a 20 3d 20 78 3b 0a 20 20 20 20       j = x;.    
5c70: 20 20 77 68 69 6c 65 28 20 73 61 66 65 5f 69 73    while( safe_is
5c80: 73 70 61 63 65 28 7a 5b 6a 5d 29 20 29 7b 20 6a  space(z[j]) ){ j
5c90: 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 63 20 3d 20  ++; }.      c = 
5ca0: 7a 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  z[j];.      if( 
5cb0: 63 3d 3d 27 2c 27 20 29 20 63 6f 6e 74 69 6e 75  c==',' ) continu
5cc0: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 63 21 3d  e;.      if( c!=
5cd0: 27 7d 27 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  '}' ) return -1;
5ce0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5cf0: 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
5d00: 61 4e 6f 64 65 5b 69 54 68 69 73 5d 2e 6e 20 3d  aNode[iThis].n =
5d10: 20 70 50 61 72 73 65 2d 3e 6e 4e 6f 64 65 20 2d   pParse->nNode -
5d20: 20 28 75 33 32 29 69 54 68 69 73 20 2d 20 31 3b   (u32)iThis - 1;
5d30: 0a 20 20 20 20 72 65 74 75 72 6e 20 6a 2b 31 3b  .    return j+1;
5d40: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d  .  }else if( c==
5d50: 27 5b 27 20 29 7b 0a 20 20 20 20 2f 2a 20 50 61  '[' ){.    /* Pa
5d60: 72 73 65 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  rse array */.   
5d70: 20 69 54 68 69 73 20 3d 20 6a 73 6f 6e 50 61 72   iThis = jsonPar
5d80: 73 65 41 64 64 4e 6f 64 65 28 70 50 61 72 73 65  seAddNode(pParse
5d90: 2c 20 4a 53 4f 4e 5f 41 52 52 41 59 2c 20 30 2c  , JSON_ARRAY, 0,
5da0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 69 54 68   0);.    if( iTh
5db0: 69 73 3c 30 20 29 20 72 65 74 75 72 6e 20 2d 31  is<0 ) return -1
5dc0: 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b  ;.    for(j=i+1;
5dd0: 3b 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 69  ;j++){.      whi
5de0: 6c 65 28 20 73 61 66 65 5f 69 73 73 70 61 63 65  le( safe_isspace
5df0: 28 7a 5b 6a 5d 29 20 29 7b 20 6a 2b 2b 3b 20 7d  (z[j]) ){ j++; }
5e00: 0a 20 20 20 20 20 20 69 66 28 20 2b 2b 70 50 61  .      if( ++pPa
5e10: 72 73 65 2d 3e 69 44 65 70 74 68 20 3e 20 4a 53  rse->iDepth > JS
5e20: 4f 4e 5f 4d 41 58 5f 44 45 50 54 48 20 29 20 72  ON_MAX_DEPTH ) r
5e30: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
5e40: 78 20 3d 20 6a 73 6f 6e 50 61 72 73 65 56 61 6c  x = jsonParseVal
5e50: 75 65 28 70 50 61 72 73 65 2c 20 6a 29 3b 0a 20  ue(pParse, j);. 
5e60: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 69 44 65       pParse->iDe
5e70: 70 74 68 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28  pth--;.      if(
5e80: 20 78 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20   x<0 ){.        
5e90: 69 66 28 20 78 3d 3d 28 2d 33 29 20 26 26 20 70  if( x==(-3) && p
5ea0: 50 61 72 73 65 2d 3e 6e 4e 6f 64 65 3d 3d 28 75  Parse->nNode==(u
5eb0: 33 32 29 69 54 68 69 73 2b 31 20 29 20 72 65 74  32)iThis+1 ) ret
5ec0: 75 72 6e 20 6a 2b 31 3b 0a 20 20 20 20 20 20 20  urn j+1;.       
5ed0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
5ee0: 20 20 7d 0a 20 20 20 20 20 20 6a 20 3d 20 78 3b    }.      j = x;
5ef0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 73 61  .      while( sa
5f00: 66 65 5f 69 73 73 70 61 63 65 28 7a 5b 6a 5d 29  fe_isspace(z[j])
5f10: 20 29 7b 20 6a 2b 2b 3b 20 7d 0a 20 20 20 20 20   ){ j++; }.     
5f20: 20 63 20 3d 20 7a 5b 6a 5d 3b 0a 20 20 20 20 20   c = z[j];.     
5f30: 20 69 66 28 20 63 3d 3d 27 2c 27 20 29 20 63 6f   if( c==',' ) co
5f40: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
5f50: 28 20 63 21 3d 27 5d 27 20 29 20 72 65 74 75 72  ( c!=']' ) retur
5f60: 6e 20 2d 31 3b 0a 20 20 20 20 20 20 62 72 65 61  n -1;.      brea
5f70: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  k;.    }.    pPa
5f80: 72 73 65 2d 3e 61 4e 6f 64 65 5b 69 54 68 69 73  rse->aNode[iThis
5f90: 5d 2e 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4e  ].n = pParse->nN
5fa0: 6f 64 65 20 2d 20 28 75 33 32 29 69 54 68 69 73  ode - (u32)iThis
5fb0: 20 2d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   - 1;.    return
5fc0: 20 6a 2b 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66   j+1;.  }else if
5fd0: 28 20 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20  ( c=='"' ){.    
5fe0: 2f 2a 20 50 61 72 73 65 20 73 74 72 69 6e 67 20  /* Parse string 
5ff0: 2a 2f 0a 20 20 20 20 75 38 20 6a 6e 46 6c 61 67  */.    u8 jnFlag
6000: 73 20 3d 20 30 3b 0a 20 20 20 20 6a 20 3d 20 69  s = 0;.    j = i
6010: 2b 31 3b 0a 20 20 20 20 66 6f 72 28 3b 3b 29 7b  +1;.    for(;;){
6020: 0a 20 20 20 20 20 20 63 20 3d 20 7a 5b 6a 5d 3b  .      c = z[j];
6030: 0a 20 20 20 20 20 20 69 66 28 20 28 63 20 26 20  .      if( (c & 
6040: 7e 30 78 31 66 29 3d 3d 30 20 29 7b 0a 20 20 20  ~0x1f)==0 ){.   
6050: 20 20 20 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20       /* Control 
6060: 63 68 61 72 61 63 74 65 72 73 20 61 72 65 20 6e  characters are n
6070: 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 73 74  ot allowed in st
6080: 72 69 6e 67 73 20 2a 2f 0a 20 20 20 20 20 20 20  rings */.       
6090: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
60a0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d    }.      if( c=
60b0: 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 20  ='\\' ){.       
60c0: 20 63 20 3d 20 7a 5b 2b 2b 6a 5d 3b 0a 20 20 20   c = z[++j];.   
60d0: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 22 27 20       if( c=='"' 
60e0: 7c 7c 20 63 3d 3d 27 5c 5c 27 20 7c 7c 20 63 3d  || c=='\\' || c=
60f0: 3d 27 2f 27 20 7c 7c 20 63 3d 3d 27 62 27 20 7c  ='/' || c=='b' |
6100: 7c 20 63 3d 3d 27 66 27 0a 20 20 20 20 20 20 20  | c=='f'.       
6110: 20 20 20 20 7c 7c 20 63 3d 3d 27 6e 27 20 7c 7c      || c=='n' ||
6120: 20 63 3d 3d 27 72 27 20 7c 7c 20 63 3d 3d 27 74   c=='r' || c=='t
6130: 27 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  '.           || 
6140: 28 63 3d 3d 27 75 27 20 26 26 20 6a 73 6f 6e 49  (c=='u' && jsonI
6150: 73 34 48 65 78 28 7a 2b 6a 2b 31 29 29 20 29 7b  s4Hex(z+j+1)) ){
6160: 0a 20 20 20 20 20 20 20 20 20 20 6a 6e 46 6c 61  .          jnFla
6170: 67 73 20 3d 20 4a 4e 4f 44 45 5f 45 53 43 41 50  gs = JNODE_ESCAP
6180: 45 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  E;.        }else
6190: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
61a0: 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d  rn -1;.        }
61b0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
61c0: 20 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20   c=='"' ){.     
61d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
61e0: 7d 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20  }.      j++;.   
61f0: 20 7d 0a 20 20 20 20 6a 73 6f 6e 50 61 72 73 65   }.    jsonParse
6200: 41 64 64 4e 6f 64 65 28 70 50 61 72 73 65 2c 20  AddNode(pParse, 
6210: 4a 53 4f 4e 5f 53 54 52 49 4e 47 2c 20 6a 2b 31  JSON_STRING, j+1
6220: 2d 69 2c 20 26 7a 5b 69 5d 29 3b 0a 20 20 20 20  -i, &z[i]);.    
6230: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6f 6f 6d  if( !pParse->oom
6240: 20 29 20 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65   ) pParse->aNode
6250: 5b 70 50 61 72 73 65 2d 3e 6e 4e 6f 64 65 2d 31  [pParse->nNode-1
6260: 5d 2e 6a 6e 46 6c 61 67 73 20 3d 20 6a 6e 46 6c  ].jnFlags = jnFl
6270: 61 67 73 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ags;.    return 
6280: 6a 2b 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  j+1;.  }else if(
6290: 20 63 3d 3d 27 6e 27 0a 20 20 20 20 20 20 20 20   c=='n'.        
62a0: 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 2b 69 2c   && strncmp(z+i,
62b0: 22 6e 75 6c 6c 22 2c 34 29 3d 3d 30 0a 20 20 20  "null",4)==0.   
62c0: 20 20 20 20 20 20 26 26 20 21 73 61 66 65 5f 69        && !safe_i
62d0: 73 61 6c 6e 75 6d 28 7a 5b 69 2b 34 5d 29 20 29  salnum(z[i+4]) )
62e0: 7b 0a 20 20 20 20 6a 73 6f 6e 50 61 72 73 65 41  {.    jsonParseA
62f0: 64 64 4e 6f 64 65 28 70 50 61 72 73 65 2c 20 4a  ddNode(pParse, J
6300: 53 4f 4e 5f 4e 55 4c 4c 2c 20 30 2c 20 30 29 3b  SON_NULL, 0, 0);
6310: 0a 20 20 20 20 72 65 74 75 72 6e 20 69 2b 34 3b  .    return i+4;
6320: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d  .  }else if( c==
6330: 27 74 27 0a 20 20 20 20 20 20 20 20 20 26 26 20  't'.         && 
6340: 73 74 72 6e 63 6d 70 28 7a 2b 69 2c 22 74 72 75  strncmp(z+i,"tru
6350: 65 22 2c 34 29 3d 3d 30 0a 20 20 20 20 20 20 20  e",4)==0.       
6360: 20 20 26 26 20 21 73 61 66 65 5f 69 73 61 6c 6e    && !safe_isaln
6370: 75 6d 28 7a 5b 69 2b 34 5d 29 20 29 7b 0a 20 20  um(z[i+4]) ){.  
6380: 20 20 6a 73 6f 6e 50 61 72 73 65 41 64 64 4e 6f    jsonParseAddNo
6390: 64 65 28 70 50 61 72 73 65 2c 20 4a 53 4f 4e 5f  de(pParse, JSON_
63a0: 54 52 55 45 2c 20 30 2c 20 30 29 3b 0a 20 20 20  TRUE, 0, 0);.   
63b0: 20 72 65 74 75 72 6e 20 69 2b 34 3b 0a 20 20 7d   return i+4;.  }
63c0: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 66 27 0a  else if( c=='f'.
63d0: 20 20 20 20 20 20 20 20 20 26 26 20 73 74 72 6e           && strn
63e0: 63 6d 70 28 7a 2b 69 2c 22 66 61 6c 73 65 22 2c  cmp(z+i,"false",
63f0: 35 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  5)==0.         &
6400: 26 20 21 73 61 66 65 5f 69 73 61 6c 6e 75 6d 28  & !safe_isalnum(
6410: 7a 5b 69 2b 35 5d 29 20 29 7b 0a 20 20 20 20 6a  z[i+5]) ){.    j
6420: 73 6f 6e 50 61 72 73 65 41 64 64 4e 6f 64 65 28  sonParseAddNode(
6430: 70 50 61 72 73 65 2c 20 4a 53 4f 4e 5f 46 41 4c  pParse, JSON_FAL
6440: 53 45 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 72  SE, 0, 0);.    r
6450: 65 74 75 72 6e 20 69 2b 35 3b 0a 20 20 7d 65 6c  eturn i+5;.  }el
6460: 73 65 20 69 66 28 20 63 3d 3d 27 2d 27 20 7c 7c  se if( c=='-' ||
6470: 20 28 63 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27   (c>='0' && c<='
6480: 39 27 29 20 29 7b 0a 20 20 20 20 2f 2a 20 50 61  9') ){.    /* Pa
6490: 72 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  rse number */.  
64a0: 20 20 75 38 20 73 65 65 6e 44 50 20 3d 20 30 3b    u8 seenDP = 0;
64b0: 0a 20 20 20 20 75 38 20 73 65 65 6e 45 20 3d 20  .    u8 seenE = 
64c0: 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 27  0;.    assert( '
64d0: 2d 27 20 3c 20 27 30 27 20 29 3b 0a 20 20 20 20  -' < '0' );.    
64e0: 69 66 28 20 63 3c 3d 27 30 27 20 29 7b 0a 20 20  if( c<='0' ){.  
64f0: 20 20 20 20 6a 20 3d 20 63 3d 3d 27 2d 27 20 3f      j = c=='-' ?
6500: 20 69 2b 31 20 3a 20 69 3b 0a 20 20 20 20 20 20   i+1 : i;.      
6510: 69 66 28 20 7a 5b 6a 5d 3d 3d 27 30 27 20 26 26  if( z[j]=='0' &&
6520: 20 7a 5b 6a 2b 31 5d 3e 3d 27 30 27 20 26 26 20   z[j+1]>='0' && 
6530: 7a 5b 6a 2b 31 5d 3c 3d 27 39 27 20 29 20 72 65  z[j+1]<='9' ) re
6540: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  turn -1;.    }. 
6550: 20 20 20 6a 20 3d 20 69 2b 31 3b 0a 20 20 20 20     j = i+1;.    
6560: 66 6f 72 28 3b 3b 20 6a 2b 2b 29 7b 0a 20 20 20  for(;; j++){.   
6570: 20 20 20 63 20 3d 20 7a 5b 6a 5d 3b 0a 20 20 20     c = z[j];.   
6580: 20 20 20 69 66 28 20 63 3e 3d 27 30 27 20 26 26     if( c>='0' &&
6590: 20 63 3c 3d 27 39 27 20 29 20 63 6f 6e 74 69 6e   c<='9' ) contin
65a0: 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d  ue;.      if( c=
65b0: 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='.' ){.        
65c0: 69 66 28 20 7a 5b 6a 2d 31 5d 3d 3d 27 2d 27 20  if( z[j-1]=='-' 
65d0: 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
65e0: 20 20 20 20 20 69 66 28 20 73 65 65 6e 44 50 20       if( seenDP 
65f0: 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
6600: 20 20 20 20 20 73 65 65 6e 44 50 20 3d 20 31 3b       seenDP = 1;
6610: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
6620: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
6630: 20 69 66 28 20 63 3d 3d 27 65 27 20 7c 7c 20 63   if( c=='e' || c
6640: 3d 3d 27 45 27 20 29 7b 0a 20 20 20 20 20 20 20  =='E' ){.       
6650: 20 69 66 28 20 7a 5b 6a 2d 31 5d 3c 27 30 27 20   if( z[j-1]<'0' 
6660: 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
6670: 20 20 20 20 20 69 66 28 20 73 65 65 6e 45 20 29       if( seenE )
6680: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
6690: 20 20 20 20 73 65 65 6e 44 50 20 3d 20 73 65 65      seenDP = see
66a0: 6e 45 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nE = 1;.        
66b0: 63 20 3d 20 7a 5b 6a 2b 31 5d 3b 0a 20 20 20 20  c = z[j+1];.    
66c0: 20 20 20 20 69 66 28 20 63 3d 3d 27 2b 27 20 7c      if( c=='+' |
66d0: 7c 20 63 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20  | c=='-' ){.    
66e0: 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
66f0: 20 20 20 20 20 63 20 3d 20 7a 5b 6a 2b 31 5d 3b       c = z[j+1];
6700: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6710: 20 20 20 69 66 28 20 63 3c 27 30 27 20 7c 7c 20     if( c<'0' || 
6720: 63 3e 27 39 27 20 29 20 72 65 74 75 72 6e 20 2d  c>'9' ) return -
6730: 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  1;.        conti
6740: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
6750: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6760: 20 20 20 20 69 66 28 20 7a 5b 6a 2d 31 5d 3c 27      if( z[j-1]<'
6770: 30 27 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  0' ) return -1;.
6780: 20 20 20 20 6a 73 6f 6e 50 61 72 73 65 41 64 64      jsonParseAdd
6790: 4e 6f 64 65 28 70 50 61 72 73 65 2c 20 73 65 65  Node(pParse, see
67a0: 6e 44 50 20 3f 20 4a 53 4f 4e 5f 52 45 41 4c 20  nDP ? JSON_REAL 
67b0: 3a 20 4a 53 4f 4e 5f 49 4e 54 2c 0a 20 20 20 20  : JSON_INT,.    
67c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67d0: 20 20 20 20 6a 20 2d 20 69 2c 20 26 7a 5b 69 5d      j - i, &z[i]
67e0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6a 3b  );.    return j;
67f0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d  .  }else if( c==
6800: 27 7d 27 20 29 7b 0a 20 20 20 20 72 65 74 75 72  '}' ){.    retur
6810: 6e 20 2d 32 3b 20 20 2f 2a 20 45 6e 64 20 6f 66  n -2;  /* End of
6820: 20 7b 2e 2e 2e 7d 20 2a 2f 0a 20 20 7d 65 6c 73   {...} */.  }els
6830: 65 20 69 66 28 20 63 3d 3d 27 5d 27 20 29 7b 0a  e if( c==']' ){.
6840: 20 20 20 20 72 65 74 75 72 6e 20 2d 33 3b 20 20      return -3;  
6850: 2f 2a 20 45 6e 64 20 6f 66 20 5b 2e 2e 2e 5d 20  /* End of [...] 
6860: 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 63  */.  }else if( c
6870: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
6880: 6e 20 30 3b 20 20 20 2f 2a 20 45 6e 64 20 6f 66  n 0;   /* End of
6890: 20 66 69 6c 65 20 2a 2f 0a 20 20 7d 65 6c 73 65   file */.  }else
68a0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  {.    return -1;
68b0: 20 20 2f 2a 20 53 79 6e 74 61 78 20 65 72 72 6f    /* Syntax erro
68c0: 72 20 2a 2f 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  r */.  }.}../*.*
68d0: 2a 20 50 61 72 73 65 20 61 20 63 6f 6d 70 6c 65  * Parse a comple
68e0: 74 65 20 4a 53 4f 4e 20 73 74 72 69 6e 67 2e 20  te JSON string. 
68f0: 20 52 65 74 75 72 6e 20 30 20 6f 6e 20 73 75 63   Return 0 on suc
6900: 63 65 73 73 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  cess or non-zero
6910: 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   if there.** are
6920: 20 61 6e 79 20 65 72 72 6f 72 73 2e 20 20 49 66   any errors.  If
6930: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
6940: 2c 20 66 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72  , free all memor
6950: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
6960: 68 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a 0a  h.** pParse..**.
6970: 2a 2a 20 70 50 61 72 73 65 20 69 73 20 75 6e 69  ** pParse is uni
6980: 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20  nitialized when 
6990: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
69a0: 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
69b0: 63 20 69 6e 74 20 6a 73 6f 6e 50 61 72 73 65 28  c int jsonParse(
69c0: 0a 20 20 4a 73 6f 6e 50 61 72 73 65 20 2a 70 50  .  JsonParse *pP
69d0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
69e0: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e  /* Initialize an
69f0: 64 20 66 69 6c 6c 20 74 68 69 73 20 4a 73 6f 6e  d fill this Json
6a00: 50 61 72 73 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  Parse object */.
6a10: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
6a20: 74 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20 2f  t *pCtx,       /
6a30: 2a 20 52 65 70 6f 72 74 20 65 72 72 6f 72 73 20  * Report errors 
6a40: 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  here */.  const 
6a50: 63 68 61 72 20 2a 7a 4a 73 6f 6e 20 20 20 20 20  char *zJson     
6a60: 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20         /* Input 
6a70: 4a 53 4f 4e 20 74 65 78 74 20 74 6f 20 62 65 20  JSON text to be 
6a80: 70 61 72 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 69  parsed */.){.  i
6a90: 6e 74 20 69 3b 0a 20 20 6d 65 6d 73 65 74 28 70  nt i;.  memset(p
6aa0: 50 61 72 73 65 2c 20 30 2c 20 73 69 7a 65 6f 66  Parse, 0, sizeof
6ab0: 28 2a 70 50 61 72 73 65 29 29 3b 0a 20 20 69 66  (*pParse));.  if
6ac0: 28 20 7a 4a 73 6f 6e 3d 3d 30 20 29 20 72 65 74  ( zJson==0 ) ret
6ad0: 75 72 6e 20 31 3b 0a 20 20 70 50 61 72 73 65 2d  urn 1;.  pParse-
6ae0: 3e 7a 4a 73 6f 6e 20 3d 20 7a 4a 73 6f 6e 3b 0a  >zJson = zJson;.
6af0: 20 20 69 20 3d 20 6a 73 6f 6e 50 61 72 73 65 56    i = jsonParseV
6b00: 61 6c 75 65 28 70 50 61 72 73 65 2c 20 30 29 3b  alue(pParse, 0);
6b10: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6f  .  if( pParse->o
6b20: 6f 6d 20 29 20 69 20 3d 20 2d 31 3b 0a 20 20 69  om ) i = -1;.  i
6b30: 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 61 73  f( i>0 ){.    as
6b40: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 69 44  sert( pParse->iD
6b50: 65 70 74 68 3d 3d 30 20 29 3b 0a 20 20 20 20 77  epth==0 );.    w
6b60: 68 69 6c 65 28 20 73 61 66 65 5f 69 73 73 70 61  hile( safe_isspa
6b70: 63 65 28 7a 4a 73 6f 6e 5b 69 5d 29 20 29 20 69  ce(zJson[i]) ) i
6b80: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 7a 4a 73 6f  ++;.    if( zJso
6b90: 6e 5b 69 5d 20 29 20 69 20 3d 20 2d 31 3b 0a 20  n[i] ) i = -1;. 
6ba0: 20 7d 0a 20 20 69 66 28 20 69 3c 3d 30 20 29 7b   }.  if( i<=0 ){
6bb0: 0a 20 20 20 20 69 66 28 20 70 43 74 78 21 3d 30  .    if( pCtx!=0
6bc0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50   ){.      if( pP
6bd0: 61 72 73 65 2d 3e 6f 6f 6d 20 29 7b 0a 20 20 20  arse->oom ){.   
6be0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
6bf0: 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28  ult_error_nomem(
6c00: 70 43 74 78 29 3b 0a 20 20 20 20 20 20 7d 65 6c  pCtx);.      }el
6c10: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
6c20: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
6c30: 28 70 43 74 78 2c 20 22 6d 61 6c 66 6f 72 6d 65  (pCtx, "malforme
6c40: 64 20 4a 53 4f 4e 22 2c 20 2d 31 29 3b 0a 20 20  d JSON", -1);.  
6c50: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
6c60: 6a 73 6f 6e 50 61 72 73 65 52 65 73 65 74 28 70  jsonParseReset(p
6c70: 50 61 72 73 65 29 3b 0a 20 20 20 20 72 65 74 75  Parse);.    retu
6c80: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
6c90: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 4d 61 72 6b  rn 0;.}../* Mark
6ca0: 20 6e 6f 64 65 20 69 20 6f 66 20 70 50 61 72 73   node i of pPars
6cb0: 65 20 61 73 20 62 65 69 6e 67 20 61 20 63 68 69  e as being a chi
6cc0: 6c 64 20 6f 66 20 69 50 61 72 65 6e 74 2e 20 20  ld of iParent.  
6cd0: 43 61 6c 6c 20 72 65 63 75 72 73 69 76 65 6c 79  Call recursively
6ce0: 0a 2a 2a 20 74 6f 20 66 69 6c 6c 20 69 6e 20 61  .** to fill in a
6cf0: 6c 6c 20 74 68 65 20 64 65 73 63 65 6e 64 61 6e  ll the descendan
6d00: 74 73 20 6f 66 20 6e 6f 64 65 20 69 2e 0a 2a 2f  ts of node i..*/
6d10: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f  .static void jso
6d20: 6e 50 61 72 73 65 46 69 6c 6c 49 6e 50 61 72 65  nParseFillInPare
6d30: 6e 74 61 67 65 28 4a 73 6f 6e 50 61 72 73 65 20  ntage(JsonParse 
6d40: 2a 70 50 61 72 73 65 2c 20 75 33 32 20 69 2c 20  *pParse, u32 i, 
6d50: 75 33 32 20 69 50 61 72 65 6e 74 29 7b 0a 20 20  u32 iParent){.  
6d60: 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 20  JsonNode *pNode 
6d70: 3d 20 26 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65  = &pParse->aNode
6d80: 5b 69 5d 3b 0a 20 20 75 33 32 20 6a 3b 0a 20 20  [i];.  u32 j;.  
6d90: 70 50 61 72 73 65 2d 3e 61 55 70 5b 69 5d 20 3d  pParse->aUp[i] =
6da0: 20 69 50 61 72 65 6e 74 3b 0a 20 20 73 77 69 74   iParent;.  swit
6db0: 63 68 28 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65  ch( pNode->eType
6dc0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4a 53 4f   ){.    case JSO
6dd0: 4e 5f 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20  N_ARRAY: {.     
6de0: 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 3d 70 4e 6f   for(j=1; j<=pNo
6df0: 64 65 2d 3e 6e 3b 20 6a 20 2b 3d 20 6a 73 6f 6e  de->n; j += json
6e00: 4e 6f 64 65 53 69 7a 65 28 70 4e 6f 64 65 2b 6a  NodeSize(pNode+j
6e10: 29 29 7b 0a 20 20 20 20 20 20 20 20 6a 73 6f 6e  )){.        json
6e20: 50 61 72 73 65 46 69 6c 6c 49 6e 50 61 72 65 6e  ParseFillInParen
6e30: 74 61 67 65 28 70 50 61 72 73 65 2c 20 69 2b 6a  tage(pParse, i+j
6e40: 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , i);.      }.  
6e50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6e60: 0a 20 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f 4f  .    case JSON_O
6e70: 42 4a 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 66  BJECT: {.      f
6e80: 6f 72 28 6a 3d 31 3b 20 6a 3c 3d 70 4e 6f 64 65  or(j=1; j<=pNode
6e90: 2d 3e 6e 3b 20 6a 20 2b 3d 20 6a 73 6f 6e 4e 6f  ->n; j += jsonNo
6ea0: 64 65 53 69 7a 65 28 70 4e 6f 64 65 2b 6a 2b 31  deSize(pNode+j+1
6eb0: 29 2b 31 29 7b 0a 20 20 20 20 20 20 20 20 70 50  )+1){.        pP
6ec0: 61 72 73 65 2d 3e 61 55 70 5b 69 2b 6a 5d 20 3d  arse->aUp[i+j] =
6ed0: 20 69 3b 0a 20 20 20 20 20 20 20 20 6a 73 6f 6e   i;.        json
6ee0: 50 61 72 73 65 46 69 6c 6c 49 6e 50 61 72 65 6e  ParseFillInParen
6ef0: 74 61 67 65 28 70 50 61 72 73 65 2c 20 69 2b 6a  tage(pParse, i+j
6f00: 2b 31 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a  +1, i);.      }.
6f10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6f20: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
6f30: 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
6f40: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
6f50: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 70 61  * Compute the pa
6f60: 72 65 6e 74 61 67 65 20 6f 66 20 61 6c 6c 20 6e  rentage of all n
6f70: 6f 64 65 73 20 69 6e 20 61 20 63 6f 6d 70 6c 65  odes in a comple
6f80: 74 65 64 20 70 61 72 73 65 2e 0a 2a 2f 0a 73 74  ted parse..*/.st
6f90: 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e 50 61 72  atic int jsonPar
6fa0: 73 65 46 69 6e 64 50 61 72 65 6e 74 73 28 4a 73  seFindParents(Js
6fb0: 6f 6e 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  onParse *pParse)
6fc0: 7b 0a 20 20 75 33 32 20 2a 61 55 70 3b 0a 20 20  {.  u32 *aUp;.  
6fd0: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
6fe0: 61 55 70 3d 3d 30 20 29 3b 0a 20 20 61 55 70 20  aUp==0 );.  aUp 
6ff0: 3d 20 70 50 61 72 73 65 2d 3e 61 55 70 20 3d 20  = pParse->aUp = 
7000: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
7010: 28 20 73 69 7a 65 6f 66 28 75 33 32 29 2a 70 50  ( sizeof(u32)*pP
7020: 61 72 73 65 2d 3e 6e 4e 6f 64 65 20 29 3b 0a 20  arse->nNode );. 
7030: 20 69 66 28 20 61 55 70 3d 3d 30 20 29 7b 0a 20   if( aUp==0 ){. 
7040: 20 20 20 70 50 61 72 73 65 2d 3e 6f 6f 6d 20 3d     pParse->oom =
7050: 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
7060: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
7070: 0a 20 20 6a 73 6f 6e 50 61 72 73 65 46 69 6c 6c  .  jsonParseFill
7080: 49 6e 50 61 72 65 6e 74 61 67 65 28 70 50 61 72  InParentage(pPar
7090: 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65 74  se, 0, 0);.  ret
70a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
70b0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 67 69 63 20 6e 75  ../*.** Magic nu
70c0: 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 74 68  mber used for th
70d0: 65 20 4a 53 4f 4e 20 70 61 72 73 65 20 63 61 63  e JSON parse cac
70e0: 68 65 20 69 6e 20 73 71 6c 69 74 65 33 5f 67 65  he in sqlite3_ge
70f0: 74 5f 61 75 78 64 61 74 61 28 29 0a 2a 2f 0a 23  t_auxdata().*/.#
7100: 64 65 66 69 6e 65 20 4a 53 4f 4e 5f 43 41 43 48  define JSON_CACH
7110: 45 5f 49 44 20 20 28 2d 34 32 39 39 33 38 29 20  E_ID  (-429938) 
7120: 20 2f 2a 20 46 69 72 73 74 20 63 61 63 68 65 20   /* First cache 
7130: 65 6e 74 72 79 20 2a 2f 0a 23 64 65 66 69 6e 65  entry */.#define
7140: 20 4a 53 4f 4e 5f 43 41 43 48 45 5f 53 5a 20 20   JSON_CACHE_SZ  
7150: 34 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  4          /* Ma
7160: 78 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68  x number of cach
7170: 65 20 65 6e 74 72 69 65 73 20 2a 2f 0a 0a 2f 2a  e entries */../*
7180: 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 63 6f 6d  .** Obtain a com
7190: 70 6c 65 74 65 20 70 61 72 73 65 20 6f 66 20 74  plete parse of t
71a0: 68 65 20 4a 53 4f 4e 20 66 6f 75 6e 64 20 69 6e  he JSON found in
71b0: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
71c0: 65 6e 74 0a 2a 2a 20 6f 66 20 74 68 65 20 61 72  ent.** of the ar
71d0: 67 76 20 61 72 72 61 79 2e 20 20 55 73 65 20 74  gv array.  Use t
71e0: 68 65 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61  he sqlite3_get_a
71f0: 75 78 64 61 74 61 28 29 20 63 61 63 68 65 20 66  uxdata() cache f
7200: 6f 72 20 74 68 69 73 0a 2a 2a 20 70 61 72 73 65  or this.** parse
7210: 20 69 66 20 69 74 20 69 73 20 61 76 61 69 6c 61   if it is availa
7220: 62 6c 65 2e 20 20 49 66 20 74 68 65 20 63 61 63  ble.  If the cac
7230: 68 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61  he is not availa
7240: 62 6c 65 20 6f 72 20 69 66 20 69 74 0a 2a 2a 20  ble or if it.** 
7250: 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 76 61 6c  is no longer val
7260: 69 64 2c 20 70 61 72 73 65 20 74 68 65 20 4a 53  id, parse the JS
7270: 4f 4e 20 61 67 61 69 6e 20 61 6e 64 20 72 65 74  ON again and ret
7280: 75 72 6e 20 74 68 65 20 6e 65 77 20 70 61 72 73  urn the new pars
7290: 65 2c 0a 2a 2a 20 61 6e 64 20 61 6c 73 6f 20 72  e,.** and also r
72a0: 65 67 69 73 74 65 72 20 74 68 65 20 6e 65 77 20  egister the new 
72b0: 70 61 72 73 65 20 73 6f 20 74 68 61 74 20 69 74  parse so that it
72c0: 20 77 69 6c 6c 20 62 65 20 61 76 61 69 6c 61 62   will be availab
72d0: 6c 65 20 66 6f 72 0a 2a 2a 20 66 75 74 75 72 65  le for.** future
72e0: 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 78   sqlite3_get_aux
72f0: 64 61 74 61 28 29 20 63 61 6c 6c 73 2e 0a 2a 2f  data() calls..*/
7300: 0a 73 74 61 74 69 63 20 4a 73 6f 6e 50 61 72 73  .static JsonPars
7310: 65 20 2a 6a 73 6f 6e 50 61 72 73 65 43 61 63 68  e *jsonParseCach
7320: 65 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  ed(.  sqlite3_co
7330: 6e 74 65 78 74 20 2a 70 43 74 78 2c 0a 20 20 73  ntext *pCtx,.  s
7340: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
7350: 72 67 76 2c 0a 20 20 73 71 6c 69 74 65 33 5f 63  rgv,.  sqlite3_c
7360: 6f 6e 74 65 78 74 20 2a 70 45 72 72 43 74 78 0a  ontext *pErrCtx.
7370: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
7380: 2a 7a 4a 73 6f 6e 20 3d 20 28 63 6f 6e 73 74 20  *zJson = (const 
7390: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
73a0: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
73b0: 29 3b 0a 20 20 69 6e 74 20 6e 4a 73 6f 6e 20 3d  );.  int nJson =
73c0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
73d0: 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20  ytes(argv[0]);. 
73e0: 20 4a 73 6f 6e 50 61 72 73 65 20 2a 70 3b 0a 20   JsonParse *p;. 
73f0: 20 4a 73 6f 6e 50 61 72 73 65 20 2a 70 4d 61 74   JsonParse *pMat
7400: 63 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4b  ch = 0;.  int iK
7410: 65 79 3b 0a 20 20 69 6e 74 20 69 4d 69 6e 4b 65  ey;.  int iMinKe
7420: 79 20 3d 20 30 3b 0a 20 20 75 33 32 20 69 4d 69  y = 0;.  u32 iMi
7430: 6e 48 6f 6c 64 20 3d 20 30 78 66 66 66 66 66 66  nHold = 0xffffff
7440: 66 66 3b 0a 20 20 75 33 32 20 69 4d 61 78 48 6f  ff;.  u32 iMaxHo
7450: 6c 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 4a  ld = 0;.  if( zJ
7460: 73 6f 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  son==0 ) return 
7470: 30 3b 0a 20 20 66 6f 72 28 69 4b 65 79 3d 30 3b  0;.  for(iKey=0;
7480: 20 69 4b 65 79 3c 4a 53 4f 4e 5f 43 41 43 48 45   iKey<JSON_CACHE
7490: 5f 53 5a 3b 20 69 4b 65 79 2b 2b 29 7b 0a 20 20  _SZ; iKey++){.  
74a0: 20 20 70 20 3d 20 28 4a 73 6f 6e 50 61 72 73 65    p = (JsonParse
74b0: 2a 29 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75  *)sqlite3_get_au
74c0: 78 64 61 74 61 28 70 43 74 78 2c 20 4a 53 4f 4e  xdata(pCtx, JSON
74d0: 5f 43 41 43 48 45 5f 49 44 2b 69 4b 65 79 29 3b  _CACHE_ID+iKey);
74e0: 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  .    if( p==0 ){
74f0: 0a 20 20 20 20 20 20 69 4d 69 6e 4b 65 79 20 3d  .      iMinKey =
7500: 20 69 4b 65 79 3b 0a 20 20 20 20 20 20 62 72 65   iKey;.      bre
7510: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
7520: 28 20 70 4d 61 74 63 68 3d 3d 30 0a 20 20 20 20  ( pMatch==0.    
7530: 20 26 26 20 70 2d 3e 6e 4a 73 6f 6e 3d 3d 6e 4a   && p->nJson==nJ
7540: 73 6f 6e 0a 20 20 20 20 20 26 26 20 6d 65 6d 63  son.     && memc
7550: 6d 70 28 70 2d 3e 7a 4a 73 6f 6e 2c 7a 4a 73 6f  mp(p->zJson,zJso
7560: 6e 2c 6e 4a 73 6f 6e 29 3d 3d 30 0a 20 20 20 20  n,nJson)==0.    
7570: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 45 72 72  ){.      p->nErr
7580: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4d 61 74   = 0;.      pMat
7590: 63 68 20 3d 20 70 3b 0a 20 20 20 20 7d 65 6c 73  ch = p;.    }els
75a0: 65 20 69 66 28 20 70 2d 3e 69 48 6f 6c 64 3c 69  e if( p->iHold<i
75b0: 4d 69 6e 48 6f 6c 64 20 29 7b 0a 20 20 20 20 20  MinHold ){.     
75c0: 20 69 4d 69 6e 48 6f 6c 64 20 3d 20 70 2d 3e 69   iMinHold = p->i
75d0: 48 6f 6c 64 3b 0a 20 20 20 20 20 20 69 4d 69 6e  Hold;.      iMin
75e0: 4b 65 79 20 3d 20 69 4b 65 79 3b 0a 20 20 20 20  Key = iKey;.    
75f0: 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 48 6f  }.    if( p->iHo
7600: 6c 64 3e 69 4d 61 78 48 6f 6c 64 20 29 7b 0a 20  ld>iMaxHold ){. 
7610: 20 20 20 20 20 69 4d 61 78 48 6f 6c 64 20 3d 20       iMaxHold = 
7620: 70 2d 3e 69 48 6f 6c 64 3b 0a 20 20 20 20 7d 0a  p->iHold;.    }.
7630: 20 20 7d 0a 20 20 69 66 28 20 70 4d 61 74 63 68    }.  if( pMatch
7640: 20 29 7b 0a 20 20 20 20 70 4d 61 74 63 68 2d 3e   ){.    pMatch->
7650: 6e 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 70 4d  nErr = 0;.    pM
7660: 61 74 63 68 2d 3e 69 48 6f 6c 64 20 3d 20 69 4d  atch->iHold = iM
7670: 61 78 48 6f 6c 64 2b 31 3b 0a 20 20 20 20 72 65  axHold+1;.    re
7680: 74 75 72 6e 20 70 4d 61 74 63 68 3b 0a 20 20 7d  turn pMatch;.  }
7690: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d  .  p = sqlite3_m
76a0: 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28  alloc64( sizeof(
76b0: 2a 70 29 20 2b 20 6e 4a 73 6f 6e 20 2b 20 31 20  *p) + nJson + 1 
76c0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  );.  if( p==0 ){
76d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
76e0: 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28  ult_error_nomem(
76f0: 70 43 74 78 29 3b 0a 20 20 20 20 72 65 74 75 72  pCtx);.    retur
7700: 6e 20 30 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  n 0;.  }.  memse
7710: 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  t(p, 0, sizeof(*
7720: 70 29 29 3b 0a 20 20 70 2d 3e 7a 4a 73 6f 6e 20  p));.  p->zJson 
7730: 3d 20 28 63 68 61 72 2a 29 26 70 5b 31 5d 3b 0a  = (char*)&p[1];.
7740: 20 20 6d 65 6d 63 70 79 28 28 63 68 61 72 2a 29    memcpy((char*)
7750: 70 2d 3e 7a 4a 73 6f 6e 2c 20 7a 4a 73 6f 6e 2c  p->zJson, zJson,
7760: 20 6e 4a 73 6f 6e 2b 31 29 3b 0a 20 20 69 66 28   nJson+1);.  if(
7770: 20 6a 73 6f 6e 50 61 72 73 65 28 70 2c 20 70 45   jsonParse(p, pE
7780: 72 72 43 74 78 2c 20 70 2d 3e 7a 4a 73 6f 6e 29  rrCtx, p->zJson)
7790: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
77a0: 66 72 65 65 28 70 29 3b 0a 20 20 20 20 72 65 74  free(p);.    ret
77b0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e  urn 0;.  }.  p->
77c0: 6e 4a 73 6f 6e 20 3d 20 6e 4a 73 6f 6e 3b 0a 20  nJson = nJson;. 
77d0: 20 70 2d 3e 69 48 6f 6c 64 20 3d 20 69 4d 61 78   p->iHold = iMax
77e0: 48 6f 6c 64 2b 31 3b 0a 20 20 73 71 6c 69 74 65  Hold+1;.  sqlite
77f0: 33 5f 73 65 74 5f 61 75 78 64 61 74 61 28 70 43  3_set_auxdata(pC
7800: 74 78 2c 20 4a 53 4f 4e 5f 43 41 43 48 45 5f 49  tx, JSON_CACHE_I
7810: 44 2b 69 4d 69 6e 4b 65 79 2c 20 70 2c 0a 20 20  D+iMinKey, p,.  
7820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7830: 20 20 20 20 28 76 6f 69 64 28 2a 29 28 76 6f 69      (void(*)(voi
7840: 64 2a 29 29 6a 73 6f 6e 50 61 72 73 65 46 72 65  d*))jsonParseFre
7850: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 4a 73  e);.  return (Js
7860: 6f 6e 50 61 72 73 65 2a 29 73 71 6c 69 74 65 33  onParse*)sqlite3
7870: 5f 67 65 74 5f 61 75 78 64 61 74 61 28 70 43 74  _get_auxdata(pCt
7880: 78 2c 20 4a 53 4f 4e 5f 43 41 43 48 45 5f 49 44  x, JSON_CACHE_ID
7890: 2b 69 4d 69 6e 4b 65 79 29 3b 0a 7d 0a 0a 2f 2a  +iMinKey);.}../*
78a0: 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20  .** Compare the 
78b0: 4f 42 4a 45 43 54 20 6c 61 62 65 6c 20 61 74 20  OBJECT label at 
78c0: 70 4e 6f 64 65 20 61 67 61 69 6e 73 74 20 7a 4b  pNode against zK
78d0: 65 79 2c 6e 4b 65 79 2e 20 20 52 65 74 75 72 6e  ey,nKey.  Return
78e0: 20 74 72 75 65 20 6f 6e 0a 2a 2a 20 61 20 6d 61   true on.** a ma
78f0: 74 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tch..*/.static i
7900: 6e 74 20 6a 73 6f 6e 4c 61 62 65 6c 43 6f 6d 70  nt jsonLabelComp
7910: 61 72 65 28 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e  are(JsonNode *pN
7920: 6f 64 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ode, const char 
7930: 2a 7a 4b 65 79 2c 20 75 33 32 20 6e 4b 65 79 29  *zKey, u32 nKey)
7940: 7b 0a 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 6a  {.  if( pNode->j
7950: 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 52  nFlags & JNODE_R
7960: 41 57 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4e  AW ){.    if( pN
7970: 6f 64 65 2d 3e 6e 21 3d 6e 4b 65 79 20 29 20 72  ode->n!=nKey ) r
7980: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 72 65 74  eturn 0;.    ret
7990: 75 72 6e 20 73 74 72 6e 63 6d 70 28 70 4e 6f 64  urn strncmp(pNod
79a0: 65 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 2c 20  e->u.zJContent, 
79b0: 7a 4b 65 79 2c 20 6e 4b 65 79 29 3d 3d 30 3b 0a  zKey, nKey)==0;.
79c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
79d0: 20 70 4e 6f 64 65 2d 3e 6e 21 3d 6e 4b 65 79 2b   pNode->n!=nKey+
79e0: 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  2 ) return 0;.  
79f0: 20 20 72 65 74 75 72 6e 20 73 74 72 6e 63 6d 70    return strncmp
7a00: 28 70 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74  (pNode->u.zJCont
7a10: 65 6e 74 2b 31 2c 20 7a 4b 65 79 2c 20 6e 4b 65  ent+1, zKey, nKe
7a20: 79 29 3d 3d 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  y)==0;.  }.}../*
7a30: 20 66 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   forward declara
7a40: 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 4a  tion */.static J
7a50: 73 6f 6e 4e 6f 64 65 20 2a 6a 73 6f 6e 4c 6f 6f  sonNode *jsonLoo
7a60: 6b 75 70 41 70 70 65 6e 64 28 4a 73 6f 6e 50 61  kupAppend(JsonPa
7a70: 72 73 65 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  rse*,const char*
7a80: 2c 69 6e 74 2a 2c 63 6f 6e 73 74 20 63 68 61 72  ,int*,const char
7a90: 2a 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72  **);../*.** Sear
7aa0: 63 68 20 61 6c 6f 6e 67 20 7a 50 61 74 68 20 74  ch along zPath t
7ab0: 6f 20 66 69 6e 64 20 74 68 65 20 6e 6f 64 65 20  o find the node 
7ac0: 73 70 65 63 69 66 69 65 64 2e 20 20 52 65 74 75  specified.  Retu
7ad0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  rn a pointer.** 
7ae0: 74 6f 20 74 68 61 74 20 6e 6f 64 65 2c 20 6f 72  to that node, or
7af0: 20 4e 55 4c 4c 20 69 66 20 7a 50 61 74 68 20 69   NULL if zPath i
7b00: 73 20 6d 61 6c 66 6f 72 6d 65 64 20 6f 72 20 69  s malformed or i
7b10: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75  f there is no su
7b20: 63 68 0a 2a 2a 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a  ch.** node..**.*
7b30: 2a 20 49 66 20 70 41 70 6e 64 21 3d 30 2c 20 74  * If pApnd!=0, t
7b40: 68 65 6e 20 74 72 79 20 74 6f 20 61 70 70 65 6e  hen try to appen
7b50: 64 20 6e 65 77 20 6e 6f 64 65 73 20 74 6f 20 63  d new nodes to c
7b60: 6f 6d 70 6c 65 74 65 20 7a 50 61 74 68 20 69 66  omplete zPath if
7b70: 20 69 74 20 69 73 0a 2a 2a 20 70 6f 73 73 69 62   it is.** possib
7b80: 6c 65 20 74 6f 20 64 6f 20 73 6f 20 61 6e 64 20  le to do so and 
7b90: 69 66 20 6e 6f 20 65 78 69 73 74 69 6e 67 20 6e  if no existing n
7ba0: 6f 64 65 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  ode corresponds 
7bb0: 74 6f 20 7a 50 61 74 68 2e 20 20 49 66 0a 2a 2a  to zPath.  If.**
7bc0: 20 6e 65 77 20 6e 6f 64 65 73 20 61 72 65 20 61   new nodes are a
7bd0: 70 70 65 6e 64 65 64 20 2a 70 41 70 6e 64 20 69  ppended *pApnd i
7be0: 73 20 73 65 74 20 74 6f 20 31 2e 0a 2a 2f 0a 73  s set to 1..*/.s
7bf0: 74 61 74 69 63 20 4a 73 6f 6e 4e 6f 64 65 20 2a  tatic JsonNode *
7c00: 6a 73 6f 6e 4c 6f 6f 6b 75 70 53 74 65 70 28 0a  jsonLookupStep(.
7c10: 20 20 4a 73 6f 6e 50 61 72 73 65 20 2a 70 50 61    JsonParse *pPa
7c20: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  rse,      /* The
7c30: 20 4a 53 4f 4e 20 74 6f 20 73 65 61 72 63 68 20   JSON to search 
7c40: 2a 2f 0a 20 20 75 33 32 20 69 52 6f 6f 74 2c 20  */.  u32 iRoot, 
7c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7c60: 42 65 67 69 6e 20 74 68 65 20 73 65 61 72 63 68  Begin the search
7c70: 20 61 74 20 74 68 69 73 20 6e 6f 64 65 20 2a 2f   at this node */
7c80: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7c90: 50 61 74 68 2c 20 20 20 20 20 20 2f 2a 20 54 68  Path,      /* Th
7ca0: 65 20 70 61 74 68 20 74 6f 20 73 65 61 72 63 68  e path to search
7cb0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 70 6e 64   */.  int *pApnd
7cc0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
7cd0: 20 41 70 70 65 6e 64 20 6e 6f 64 65 73 20 74 6f   Append nodes to
7ce0: 20 63 6f 6d 70 6c 65 74 65 20 70 61 74 68 20 69   complete path i
7cf0: 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20  f not NULL */.  
7d00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 45  const char **pzE
7d10: 72 72 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20  rr      /* Make 
7d20: 2a 70 7a 45 72 72 20 70 6f 69 6e 74 20 74 6f 20  *pzErr point to 
7d30: 61 6e 79 20 73 79 6e 74 61 78 20 65 72 72 6f 72  any syntax error
7d40: 20 69 6e 20 7a 50 61 74 68 20 2a 2f 0a 29 7b 0a   in zPath */.){.
7d50: 20 20 75 33 32 20 69 2c 20 6a 2c 20 6e 4b 65 79    u32 i, j, nKey
7d60: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
7d70: 7a 4b 65 79 3b 0a 20 20 4a 73 6f 6e 4e 6f 64 65  zKey;.  JsonNode
7d80: 20 2a 70 52 6f 6f 74 20 3d 20 26 70 50 61 72 73   *pRoot = &pPars
7d90: 65 2d 3e 61 4e 6f 64 65 5b 69 52 6f 6f 74 5d 3b  e->aNode[iRoot];
7da0: 0a 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d  .  if( zPath[0]=
7db0: 3d 30 20 29 20 72 65 74 75 72 6e 20 70 52 6f 6f  =0 ) return pRoo
7dc0: 74 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  t;.  if( pRoot->
7dd0: 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f  jnFlags & JNODE_
7de0: 52 45 50 4c 41 43 45 20 29 20 72 65 74 75 72 6e  REPLACE ) return
7df0: 20 30 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 5b   0;.  if( zPath[
7e00: 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 69  0]=='.' ){.    i
7e10: 66 28 20 70 52 6f 6f 74 2d 3e 65 54 79 70 65 21  f( pRoot->eType!
7e20: 3d 4a 53 4f 4e 5f 4f 42 4a 45 43 54 20 29 20 72  =JSON_OBJECT ) r
7e30: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7a 50 61  eturn 0;.    zPa
7e40: 74 68 2b 2b 3b 0a 20 20 20 20 69 66 28 20 7a 50  th++;.    if( zP
7e50: 61 74 68 5b 30 5d 3d 3d 27 22 27 20 29 7b 0a 20  ath[0]=='"' ){. 
7e60: 20 20 20 20 20 7a 4b 65 79 20 3d 20 7a 50 61 74       zKey = zPat
7e70: 68 20 2b 20 31 3b 0a 20 20 20 20 20 20 66 6f 72  h + 1;.      for
7e80: 28 69 3d 31 3b 20 7a 50 61 74 68 5b 69 5d 20 26  (i=1; zPath[i] &
7e90: 26 20 7a 50 61 74 68 5b 69 5d 21 3d 27 22 27 3b  & zPath[i]!='"';
7ea0: 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 6e 4b   i++){}.      nK
7eb0: 65 79 20 3d 20 69 2d 31 3b 0a 20 20 20 20 20 20  ey = i-1;.      
7ec0: 69 66 28 20 7a 50 61 74 68 5b 69 5d 20 29 7b 0a  if( zPath[i] ){.
7ed0: 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20          i++;.   
7ee0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7ef0: 20 20 2a 70 7a 45 72 72 20 3d 20 7a 50 61 74 68    *pzErr = zPath
7f00: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
7f10: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
7f20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 4b 65  }else{.      zKe
7f30: 79 20 3d 20 7a 50 61 74 68 3b 0a 20 20 20 20 20  y = zPath;.     
7f40: 20 66 6f 72 28 69 3d 30 3b 20 7a 50 61 74 68 5b   for(i=0; zPath[
7f50: 69 5d 20 26 26 20 7a 50 61 74 68 5b 69 5d 21 3d  i] && zPath[i]!=
7f60: 27 2e 27 20 26 26 20 7a 50 61 74 68 5b 69 5d 21  '.' && zPath[i]!
7f70: 3d 27 5b 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20  ='['; i++){}.   
7f80: 20 20 20 6e 4b 65 79 20 3d 20 69 3b 0a 20 20 20     nKey = i;.   
7f90: 20 7d 0a 20 20 20 20 69 66 28 20 6e 4b 65 79 3d   }.    if( nKey=
7fa0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 7a 45  =0 ){.      *pzE
7fb0: 72 72 20 3d 20 7a 50 61 74 68 3b 0a 20 20 20 20  rr = zPath;.    
7fc0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
7fd0: 7d 0a 20 20 20 20 6a 20 3d 20 31 3b 0a 20 20 20  }.    j = 1;.   
7fe0: 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20   for(;;){.      
7ff0: 77 68 69 6c 65 28 20 6a 3c 3d 70 52 6f 6f 74 2d  while( j<=pRoot-
8000: 3e 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  >n ){.        if
8010: 28 20 6a 73 6f 6e 4c 61 62 65 6c 43 6f 6d 70 61  ( jsonLabelCompa
8020: 72 65 28 70 52 6f 6f 74 2b 6a 2c 20 7a 4b 65 79  re(pRoot+j, zKey
8030: 2c 20 6e 4b 65 79 29 20 29 7b 0a 20 20 20 20 20  , nKey) ){.     
8040: 20 20 20 20 20 72 65 74 75 72 6e 20 6a 73 6f 6e       return json
8050: 4c 6f 6f 6b 75 70 53 74 65 70 28 70 50 61 72 73  LookupStep(pPars
8060: 65 2c 20 69 52 6f 6f 74 2b 6a 2b 31 2c 20 26 7a  e, iRoot+j+1, &z
8070: 50 61 74 68 5b 69 5d 2c 20 70 41 70 6e 64 2c 20  Path[i], pApnd, 
8080: 70 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 20 20  pzErr);.        
8090: 7d 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20  }.        j++;. 
80a0: 20 20 20 20 20 20 20 6a 20 2b 3d 20 6a 73 6f 6e         j += json
80b0: 4e 6f 64 65 53 69 7a 65 28 26 70 52 6f 6f 74 5b  NodeSize(&pRoot[
80c0: 6a 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  j]);.      }.   
80d0: 20 20 20 69 66 28 20 28 70 52 6f 6f 74 2d 3e 6a     if( (pRoot->j
80e0: 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 41  nFlags & JNODE_A
80f0: 50 50 45 4e 44 29 3d 3d 30 20 29 20 62 72 65 61  PPEND)==0 ) brea
8100: 6b 3b 0a 20 20 20 20 20 20 69 52 6f 6f 74 20 2b  k;.      iRoot +
8110: 3d 20 70 52 6f 6f 74 2d 3e 75 2e 69 41 70 70 65  = pRoot->u.iAppe
8120: 6e 64 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 20  nd;.      pRoot 
8130: 3d 20 26 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65  = &pParse->aNode
8140: 5b 69 52 6f 6f 74 5d 3b 0a 20 20 20 20 20 20 6a  [iRoot];.      j
8150: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
8160: 69 66 28 20 70 41 70 6e 64 20 29 7b 0a 20 20 20  if( pApnd ){.   
8170: 20 20 20 75 33 32 20 69 53 74 61 72 74 2c 20 69     u32 iStart, i
8180: 4c 61 62 65 6c 3b 0a 20 20 20 20 20 20 4a 73 6f  Label;.      Jso
8190: 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 3b 0a 20 20  nNode *pNode;.  
81a0: 20 20 20 20 69 53 74 61 72 74 20 3d 20 6a 73 6f      iStart = jso
81b0: 6e 50 61 72 73 65 41 64 64 4e 6f 64 65 28 70 50  nParseAddNode(pP
81c0: 61 72 73 65 2c 20 4a 53 4f 4e 5f 4f 42 4a 45 43  arse, JSON_OBJEC
81d0: 54 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20  T, 2, 0);.      
81e0: 69 4c 61 62 65 6c 20 3d 20 6a 73 6f 6e 50 61 72  iLabel = jsonPar
81f0: 73 65 41 64 64 4e 6f 64 65 28 70 50 61 72 73 65  seAddNode(pParse
8200: 2c 20 4a 53 4f 4e 5f 53 54 52 49 4e 47 2c 20 6e  , JSON_STRING, n
8210: 4b 65 79 2c 20 7a 4b 65 79 29 3b 0a 20 20 20 20  Key, zKey);.    
8220: 20 20 7a 50 61 74 68 20 2b 3d 20 69 3b 0a 20 20    zPath += i;.  
8230: 20 20 20 20 70 4e 6f 64 65 20 3d 20 6a 73 6f 6e      pNode = json
8240: 4c 6f 6f 6b 75 70 41 70 70 65 6e 64 28 70 50 61  LookupAppend(pPa
8250: 72 73 65 2c 20 7a 50 61 74 68 2c 20 70 41 70 6e  rse, zPath, pApn
8260: 64 2c 20 70 7a 45 72 72 29 3b 0a 20 20 20 20 20  d, pzErr);.     
8270: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6f 6f 6d   if( pParse->oom
8280: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
8290: 20 20 20 69 66 28 20 70 4e 6f 64 65 20 29 7b 0a     if( pNode ){.
82a0: 20 20 20 20 20 20 20 20 70 52 6f 6f 74 20 3d 20          pRoot = 
82b0: 26 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65 5b 69  &pParse->aNode[i
82c0: 52 6f 6f 74 5d 3b 0a 20 20 20 20 20 20 20 20 70  Root];.        p
82d0: 52 6f 6f 74 2d 3e 75 2e 69 41 70 70 65 6e 64 20  Root->u.iAppend 
82e0: 3d 20 69 53 74 61 72 74 20 2d 20 69 52 6f 6f 74  = iStart - iRoot
82f0: 3b 0a 20 20 20 20 20 20 20 20 70 52 6f 6f 74 2d  ;.        pRoot-
8300: 3e 6a 6e 46 6c 61 67 73 20 7c 3d 20 4a 4e 4f 44  >jnFlags |= JNOD
8310: 45 5f 41 50 50 45 4e 44 3b 0a 20 20 20 20 20 20  E_APPEND;.      
8320: 20 20 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65 5b    pParse->aNode[
8330: 69 4c 61 62 65 6c 5d 2e 6a 6e 46 6c 61 67 73 20  iLabel].jnFlags 
8340: 7c 3d 20 4a 4e 4f 44 45 5f 52 41 57 3b 0a 20 20  |= JNODE_RAW;.  
8350: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
8360: 72 6e 20 70 4e 6f 64 65 3b 0a 20 20 20 20 7d 0a  rn pNode;.    }.
8370: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 50 61 74    }else if( zPat
8380: 68 5b 30 5d 3d 3d 27 5b 27 20 26 26 20 73 61 66  h[0]=='[' && saf
8390: 65 5f 69 73 64 69 67 69 74 28 7a 50 61 74 68 5b  e_isdigit(zPath[
83a0: 31 5d 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70  1]) ){.    if( p
83b0: 52 6f 6f 74 2d 3e 65 54 79 70 65 21 3d 4a 53 4f  Root->eType!=JSO
83c0: 4e 5f 41 52 52 41 59 20 29 20 72 65 74 75 72 6e  N_ARRAY ) return
83d0: 20 30 3b 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20   0;.    i = 0;. 
83e0: 20 20 20 6a 20 3d 20 31 3b 0a 20 20 20 20 77 68     j = 1;.    wh
83f0: 69 6c 65 28 20 73 61 66 65 5f 69 73 64 69 67 69  ile( safe_isdigi
8400: 74 28 7a 50 61 74 68 5b 6a 5d 29 20 29 7b 0a 20  t(zPath[j]) ){. 
8410: 20 20 20 20 20 69 20 3d 20 69 2a 31 30 20 2b 20       i = i*10 + 
8420: 7a 50 61 74 68 5b 6a 5d 20 2d 20 27 30 27 3b 0a  zPath[j] - '0';.
8430: 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d        j++;.    }
8440: 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68 5b 6a  .    if( zPath[j
8450: 5d 21 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20 20  ]!=']' ){.      
8460: 2a 70 7a 45 72 72 20 3d 20 7a 50 61 74 68 3b 0a  *pzErr = zPath;.
8470: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
8480: 20 20 20 20 7d 0a 20 20 20 20 7a 50 61 74 68 20      }.    zPath 
8490: 2b 3d 20 6a 20 2b 20 31 3b 0a 20 20 20 20 6a 20  += j + 1;.    j 
84a0: 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 3b 3b 29  = 1;.    for(;;)
84b0: 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a  {.      while( j
84c0: 3c 3d 70 52 6f 6f 74 2d 3e 6e 20 26 26 20 28 69  <=pRoot->n && (i
84d0: 3e 30 20 7c 7c 20 28 70 52 6f 6f 74 5b 6a 5d 2e  >0 || (pRoot[j].
84e0: 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f  jnFlags & JNODE_
84f0: 52 45 4d 4f 56 45 29 21 3d 30 29 20 29 7b 0a 20  REMOVE)!=0) ){. 
8500: 20 20 20 20 20 20 20 69 66 28 20 28 70 52 6f 6f         if( (pRoo
8510: 74 5b 6a 5d 2e 6a 6e 46 6c 61 67 73 20 26 20 4a  t[j].jnFlags & J
8520: 4e 4f 44 45 5f 52 45 4d 4f 56 45 29 3d 3d 30 20  NODE_REMOVE)==0 
8530: 29 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20 20 6a  ) i--;.        j
8540: 20 2b 3d 20 6a 73 6f 6e 4e 6f 64 65 53 69 7a 65   += jsonNodeSize
8550: 28 26 70 52 6f 6f 74 5b 6a 5d 29 3b 0a 20 20 20  (&pRoot[j]);.   
8560: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
8570: 70 52 6f 6f 74 2d 3e 6a 6e 46 6c 61 67 73 20 26  pRoot->jnFlags &
8580: 20 4a 4e 4f 44 45 5f 41 50 50 45 4e 44 29 3d 3d   JNODE_APPEND)==
8590: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
85a0: 20 69 52 6f 6f 74 20 2b 3d 20 70 52 6f 6f 74 2d   iRoot += pRoot-
85b0: 3e 75 2e 69 41 70 70 65 6e 64 3b 0a 20 20 20 20  >u.iAppend;.    
85c0: 20 20 70 52 6f 6f 74 20 3d 20 26 70 50 61 72 73    pRoot = &pPars
85d0: 65 2d 3e 61 4e 6f 64 65 5b 69 52 6f 6f 74 5d 3b  e->aNode[iRoot];
85e0: 0a 20 20 20 20 20 20 6a 20 3d 20 31 3b 0a 20 20  .      j = 1;.  
85f0: 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 3d 70    }.    if( j<=p
8600: 52 6f 6f 74 2d 3e 6e 20 29 7b 0a 20 20 20 20 20  Root->n ){.     
8610: 20 72 65 74 75 72 6e 20 6a 73 6f 6e 4c 6f 6f 6b   return jsonLook
8620: 75 70 53 74 65 70 28 70 50 61 72 73 65 2c 20 69  upStep(pParse, i
8630: 52 6f 6f 74 2b 6a 2c 20 7a 50 61 74 68 2c 20 70  Root+j, zPath, p
8640: 41 70 6e 64 2c 20 70 7a 45 72 72 29 3b 0a 20 20  Apnd, pzErr);.  
8650: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 30    }.    if( i==0
8660: 20 26 26 20 70 41 70 6e 64 20 29 7b 0a 20 20 20   && pApnd ){.   
8670: 20 20 20 75 33 32 20 69 53 74 61 72 74 3b 0a 20     u32 iStart;. 
8680: 20 20 20 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70       JsonNode *p
8690: 4e 6f 64 65 3b 0a 20 20 20 20 20 20 69 53 74 61  Node;.      iSta
86a0: 72 74 20 3d 20 6a 73 6f 6e 50 61 72 73 65 41 64  rt = jsonParseAd
86b0: 64 4e 6f 64 65 28 70 50 61 72 73 65 2c 20 4a 53  dNode(pParse, JS
86c0: 4f 4e 5f 41 52 52 41 59 2c 20 31 2c 20 30 29 3b  ON_ARRAY, 1, 0);
86d0: 0a 20 20 20 20 20 20 70 4e 6f 64 65 20 3d 20 6a  .      pNode = j
86e0: 73 6f 6e 4c 6f 6f 6b 75 70 41 70 70 65 6e 64 28  sonLookupAppend(
86f0: 70 50 61 72 73 65 2c 20 7a 50 61 74 68 2c 20 70  pParse, zPath, p
8700: 41 70 6e 64 2c 20 70 7a 45 72 72 29 3b 0a 20 20  Apnd, pzErr);.  
8710: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
8720: 6f 6f 6d 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  oom ) return 0;.
8730: 20 20 20 20 20 20 69 66 28 20 70 4e 6f 64 65 20        if( pNode 
8740: 29 7b 0a 20 20 20 20 20 20 20 20 70 52 6f 6f 74  ){.        pRoot
8750: 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 4e 6f 64   = &pParse->aNod
8760: 65 5b 69 52 6f 6f 74 5d 3b 0a 20 20 20 20 20 20  e[iRoot];.      
8770: 20 20 70 52 6f 6f 74 2d 3e 75 2e 69 41 70 70 65    pRoot->u.iAppe
8780: 6e 64 20 3d 20 69 53 74 61 72 74 20 2d 20 69 52  nd = iStart - iR
8790: 6f 6f 74 3b 0a 20 20 20 20 20 20 20 20 70 52 6f  oot;.        pRo
87a0: 6f 74 2d 3e 6a 6e 46 6c 61 67 73 20 7c 3d 20 4a  ot->jnFlags |= J
87b0: 4e 4f 44 45 5f 41 50 50 45 4e 44 3b 0a 20 20 20  NODE_APPEND;.   
87c0: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
87d0: 6e 20 70 4e 6f 64 65 3b 0a 20 20 20 20 7d 0a 20  n pNode;.    }. 
87e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 7a 45   }else{.    *pzE
87f0: 72 72 20 3d 20 7a 50 61 74 68 3b 0a 20 20 7d 0a  rr = zPath;.  }.
8800: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
8810: 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 63 6f 6e 74  *.** Append cont
8820: 65 6e 74 20 74 6f 20 70 50 61 72 73 65 20 74 68  ent to pParse th
8830: 61 74 20 77 69 6c 6c 20 63 6f 6d 70 6c 65 74 65  at will complete
8840: 20 7a 50 61 74 68 2e 20 20 52 65 74 75 72 6e 20   zPath.  Return 
8850: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
8860: 74 68 65 20 69 6e 73 65 72 74 65 64 20 6e 6f 64  the inserted nod
8870: 65 2c 20 6f 72 20 72 65 74 75 72 6e 20 4e 55 4c  e, or return NUL
8880: 4c 20 69 66 20 74 68 65 20 61 70 70 65 6e 64 20  L if the append 
8890: 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fails..*/.static
88a0: 20 4a 73 6f 6e 4e 6f 64 65 20 2a 6a 73 6f 6e 4c   JsonNode *jsonL
88b0: 6f 6f 6b 75 70 41 70 70 65 6e 64 28 0a 20 20 4a  ookupAppend(.  J
88c0: 73 6f 6e 50 61 72 73 65 20 2a 70 50 61 72 73 65  sonParse *pParse
88d0: 2c 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20  ,     /* Append 
88e0: 63 6f 6e 74 65 6e 74 20 74 6f 20 74 68 65 20 4a  content to the J
88f0: 53 4f 4e 20 70 61 72 73 65 20 2a 2f 0a 20 20 63  SON parse */.  c
8900: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
8910: 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70  ,     /* Descrip
8920: 74 69 6f 6e 20 6f 66 20 63 6f 6e 74 65 6e 74 20  tion of content 
8930: 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 69  to append */.  i
8940: 6e 74 20 2a 70 41 70 6e 64 2c 20 20 20 20 20 20  nt *pApnd,      
8950: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68 69        /* Set thi
8960: 73 20 66 6c 61 67 20 74 6f 20 31 20 2a 2f 0a 20  s flag to 1 */. 
8970: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
8980: 45 72 72 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20  Err     /* Make 
8990: 74 68 69 73 20 70 6f 69 6e 74 20 74 6f 20 61 6e  this point to an
89a0: 79 20 73 79 6e 74 61 78 20 65 72 72 6f 72 20 2a  y syntax error *
89b0: 2f 0a 29 7b 0a 20 20 2a 70 41 70 6e 64 20 3d 20  /.){.  *pApnd = 
89c0: 31 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 5b 30  1;.  if( zPath[0
89d0: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 6a 73 6f 6e  ]==0 ){.    json
89e0: 50 61 72 73 65 41 64 64 4e 6f 64 65 28 70 50 61  ParseAddNode(pPa
89f0: 72 73 65 2c 20 4a 53 4f 4e 5f 4e 55 4c 4c 2c 20  rse, JSON_NULL, 
8a00: 30 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  0, 0);.    retur
8a10: 6e 20 70 50 61 72 73 65 2d 3e 6f 6f 6d 20 3f 20  n pParse->oom ? 
8a20: 30 20 3a 20 26 70 50 61 72 73 65 2d 3e 61 4e 6f  0 : &pParse->aNo
8a30: 64 65 5b 70 50 61 72 73 65 2d 3e 6e 4e 6f 64 65  de[pParse->nNode
8a40: 2d 31 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  -1];.  }.  if( z
8a50: 50 61 74 68 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a  Path[0]=='.' ){.
8a60: 20 20 20 20 6a 73 6f 6e 50 61 72 73 65 41 64 64      jsonParseAdd
8a70: 4e 6f 64 65 28 70 50 61 72 73 65 2c 20 4a 53 4f  Node(pParse, JSO
8a80: 4e 5f 4f 42 4a 45 43 54 2c 20 30 2c 20 30 29 3b  N_OBJECT, 0, 0);
8a90: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
8aa0: 6e 63 6d 70 28 7a 50 61 74 68 2c 22 5b 30 5d 22  ncmp(zPath,"[0]"
8ab0: 2c 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6a 73  ,3)==0 ){.    js
8ac0: 6f 6e 50 61 72 73 65 41 64 64 4e 6f 64 65 28 70  onParseAddNode(p
8ad0: 50 61 72 73 65 2c 20 4a 53 4f 4e 5f 41 52 52 41  Parse, JSON_ARRA
8ae0: 59 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  Y, 0, 0);.  }els
8af0: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  e{.    return 0;
8b00: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73  .  }.  if( pPars
8b10: 65 2d 3e 6f 6f 6d 20 29 20 72 65 74 75 72 6e 20  e->oom ) return 
8b20: 30 3b 0a 20 20 72 65 74 75 72 6e 20 6a 73 6f 6e  0;.  return json
8b30: 4c 6f 6f 6b 75 70 53 74 65 70 28 70 50 61 72 73  LookupStep(pPars
8b40: 65 2c 20 70 50 61 72 73 65 2d 3e 6e 4e 6f 64 65  e, pParse->nNode
8b50: 2d 31 2c 20 7a 50 61 74 68 2c 20 70 41 70 6e 64  -1, zPath, pApnd
8b60: 2c 20 70 7a 45 72 72 29 3b 0a 7d 0a 0a 2f 2a 0a  , pzErr);.}../*.
8b70: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 65  ** Return the te
8b80: 78 74 20 6f 66 20 61 20 73 79 6e 74 61 78 20 65  xt of a syntax e
8b90: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6f 6e 20  rror message on 
8ba0: 61 20 4a 53 4f 4e 20 70 61 74 68 2e 20 20 53 70  a JSON path.  Sp
8bb0: 61 63 65 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e  ace is.** obtain
8bc0: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
8bd0: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61  malloc()..*/.sta
8be0: 74 69 63 20 63 68 61 72 20 2a 6a 73 6f 6e 50 61  tic char *jsonPa
8bf0: 74 68 53 79 6e 74 61 78 45 72 72 6f 72 28 63 6f  thSyntaxError(co
8c00: 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 29 7b  nst char *zErr){
8c10: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
8c20: 33 5f 6d 70 72 69 6e 74 66 28 22 4a 53 4f 4e 20  3_mprintf("JSON 
8c30: 70 61 74 68 20 65 72 72 6f 72 20 6e 65 61 72 20  path error near 
8c40: 27 25 71 27 22 2c 20 7a 45 72 72 29 3b 0a 7d 0a  '%q'", zErr);.}.
8c50: 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 6e 6f 64 65  ./*.** Do a node
8c60: 20 6c 6f 6f 6b 75 70 20 75 73 69 6e 67 20 7a 50   lookup using zP
8c70: 61 74 68 2e 20 20 52 65 74 75 72 6e 20 61 20 70  ath.  Return a p
8c80: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 6f  ointer to the no
8c90: 64 65 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a  de on success..*
8ca0: 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  * Return NULL if
8cb0: 20 6e 6f 74 20 66 6f 75 6e 64 20 6f 72 20 69 66   not found or if
8cc0: 20 74 68 65 72 65 20 69 73 20 61 6e 20 65 72 72   there is an err
8cd0: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 61 6e 20  or..**.** On an 
8ce0: 65 72 72 6f 72 2c 20 77 72 69 74 65 20 61 6e 20  error, write an 
8cf0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
8d00: 74 6f 20 70 43 74 78 20 61 6e 64 20 69 6e 63 72  to pCtx and incr
8d10: 65 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 70 50 61  ement the.** pPa
8d20: 72 73 65 2d 3e 6e 45 72 72 20 63 6f 75 6e 74 65  rse->nErr counte
8d30: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 41 70 6e  r..**.** If pApn
8d40: 64 21 3d 4e 55 4c 4c 20 74 68 65 6e 20 74 72 79  d!=NULL then try
8d50: 20 74 6f 20 61 70 70 65 6e 64 20 6d 69 73 73 69   to append missi
8d60: 6e 67 20 6e 6f 64 65 73 20 61 6e 64 20 73 65 74  ng nodes and set
8d70: 20 2a 70 41 70 6e 64 20 3d 20 31 20 69 66 0a 2a   *pApnd = 1 if.*
8d80: 2a 20 6e 6f 64 65 73 20 61 72 65 20 61 70 70 65  * nodes are appe
8d90: 6e 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nded..*/.static 
8da0: 4a 73 6f 6e 4e 6f 64 65 20 2a 6a 73 6f 6e 4c 6f  JsonNode *jsonLo
8db0: 6f 6b 75 70 28 0a 20 20 4a 73 6f 6e 50 61 72 73  okup(.  JsonPars
8dc0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
8dd0: 2f 2a 20 54 68 65 20 4a 53 4f 4e 20 74 6f 20 73  /* The JSON to s
8de0: 65 61 72 63 68 20 2a 2f 0a 20 20 63 6f 6e 73 74  earch */.  const
8df0: 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
8e00: 20 20 20 2f 2a 20 54 68 65 20 70 61 74 68 20 74     /* The path t
8e10: 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e  o search */.  in
8e20: 74 20 2a 70 41 70 6e 64 2c 20 20 20 20 20 20 20  t *pApnd,       
8e30: 20 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20        /* Append 
8e40: 6e 6f 64 65 73 20 74 6f 20 63 6f 6d 70 6c 65 74  nodes to complet
8e50: 65 20 70 61 74 68 20 69 66 20 6e 6f 74 20 4e 55  e path if not NU
8e60: 4c 4c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  LL */.  sqlite3_
8e70: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 20 20  context *pCtx   
8e80: 2f 2a 20 52 65 70 6f 72 74 20 65 72 72 6f 72 73  /* Report errors
8e90: 20 68 65 72 65 2c 20 69 66 20 6e 6f 74 20 4e 55   here, if not NU
8ea0: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  LL */.){.  const
8eb0: 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b   char *zErr = 0;
8ec0: 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f  .  JsonNode *pNo
8ed0: 64 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  de = 0;.  char *
8ee0: 7a 4d 73 67 3b 0a 0a 20 20 69 66 28 20 7a 50 61  zMsg;..  if( zPa
8ef0: 74 68 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  th==0 ) return 0
8f00: 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d  ;.  if( zPath[0]
8f10: 21 3d 27 24 27 20 29 7b 0a 20 20 20 20 7a 45 72  !='$' ){.    zEr
8f20: 72 20 3d 20 7a 50 61 74 68 3b 0a 20 20 20 20 67  r = zPath;.    g
8f30: 6f 74 6f 20 6c 6f 6f 6b 75 70 5f 65 72 72 3b 0a  oto lookup_err;.
8f40: 20 20 7d 0a 20 20 7a 50 61 74 68 2b 2b 3b 0a 20    }.  zPath++;. 
8f50: 20 70 4e 6f 64 65 20 3d 20 6a 73 6f 6e 4c 6f 6f   pNode = jsonLoo
8f60: 6b 75 70 53 74 65 70 28 70 50 61 72 73 65 2c 20  kupStep(pParse, 
8f70: 30 2c 20 7a 50 61 74 68 2c 20 70 41 70 6e 64 2c  0, zPath, pApnd,
8f80: 20 26 7a 45 72 72 29 3b 0a 20 20 69 66 28 20 7a   &zErr);.  if( z
8f90: 45 72 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Err==0 ) return 
8fa0: 70 4e 6f 64 65 3b 0a 0a 6c 6f 6f 6b 75 70 5f 65  pNode;..lookup_e
8fb0: 72 72 3a 0a 20 20 70 50 61 72 73 65 2d 3e 6e 45  rr:.  pParse->nE
8fc0: 72 72 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20  rr++;.  assert( 
8fd0: 7a 45 72 72 21 3d 30 20 26 26 20 70 43 74 78 21  zErr!=0 && pCtx!
8fe0: 3d 30 20 29 3b 0a 20 20 7a 4d 73 67 20 3d 20 6a  =0 );.  zMsg = j
8ff0: 73 6f 6e 50 61 74 68 53 79 6e 74 61 78 45 72 72  sonPathSyntaxErr
9000: 6f 72 28 7a 45 72 72 29 3b 0a 20 20 69 66 28 20  or(zErr);.  if( 
9010: 7a 4d 73 67 20 29 7b 0a 20 20 20 20 73 71 6c 69  zMsg ){.    sqli
9020: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
9030: 28 70 43 74 78 2c 20 7a 4d 73 67 2c 20 2d 31 29  (pCtx, zMsg, -1)
9040: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
9050: 65 65 28 7a 4d 73 67 29 3b 0a 20 20 7d 65 6c 73  ee(zMsg);.  }els
9060: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  e{.    sqlite3_r
9070: 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65  esult_error_nome
9080: 6d 28 70 43 74 78 29 3b 0a 20 20 7d 0a 20 20 72  m(pCtx);.  }.  r
9090: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn 0;.}.../*.
90a0: 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20 77 72  ** Report the wr
90b0: 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  ong number of ar
90c0: 67 75 6d 65 6e 74 73 20 66 6f 72 20 6a 73 6f 6e  guments for json
90d0: 5f 69 6e 73 65 72 74 28 29 2c 20 6a 73 6f 6e 5f  _insert(), json_
90e0: 72 65 70 6c 61 63 65 28 29 0a 2a 2a 20 6f 72 20  replace().** or 
90f0: 6a 73 6f 6e 5f 73 65 74 28 29 2e 0a 2a 2f 0a 73  json_set()..*/.s
9100: 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 57  tatic void jsonW
9110: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 0a 20 20 73  rongNumArgs(.  s
9120: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
9130: 70 43 74 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68  pCtx,.  const ch
9140: 61 72 20 2a 7a 46 75 6e 63 4e 61 6d 65 0a 29 7b  ar *zFuncName.){
9150: 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20  .  char *zMsg = 
9160: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
9170: 22 6a 73 6f 6e 5f 25 73 28 29 20 6e 65 65 64 73  "json_%s() needs
9180: 20 61 6e 20 6f 64 64 20 6e 75 6d 62 65 72 20 6f   an odd number o
9190: 66 20 61 72 67 75 6d 65 6e 74 73 22 2c 0a 20 20  f arguments",.  
91a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 46 75               zFu
91c0: 6e 63 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  ncName);.  sqlit
91d0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
91e0: 70 43 74 78 2c 20 7a 4d 73 67 2c 20 2d 31 29 3b  pCtx, zMsg, -1);
91f0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
9200: 7a 4d 73 67 29 3b 20 20 20 20 20 0a 7d 0a 0a 2f  zMsg);     .}../
9210: 2a 0a 2a 2a 20 4d 61 72 6b 20 61 6c 6c 20 4e 55  *.** Mark all NU
9220: 4c 4c 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  LL entries in th
9230: 65 20 4f 62 6a 65 63 74 20 70 61 73 73 65 64 20  e Object passed 
9240: 69 6e 20 61 73 20 4a 4e 4f 44 45 5f 52 45 4d 4f  in as JNODE_REMO
9250: 56 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  VE..*/.static vo
9260: 69 64 20 6a 73 6f 6e 52 65 6d 6f 76 65 41 6c 6c  id jsonRemoveAll
9270: 4e 75 6c 6c 73 28 4a 73 6f 6e 4e 6f 64 65 20 2a  Nulls(JsonNode *
9280: 70 4e 6f 64 65 29 7b 0a 20 20 69 6e 74 20 69 2c  pNode){.  int i,
9290: 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e   n;.  assert( pN
92a0: 6f 64 65 2d 3e 65 54 79 70 65 3d 3d 4a 53 4f 4e  ode->eType==JSON
92b0: 5f 4f 42 4a 45 43 54 20 29 3b 0a 20 20 6e 20 3d  _OBJECT );.  n =
92c0: 20 70 4e 6f 64 65 2d 3e 6e 3b 0a 20 20 66 6f 72   pNode->n;.  for
92d0: 28 69 3d 32 3b 20 69 3c 3d 6e 3b 20 69 20 2b 3d  (i=2; i<=n; i +=
92e0: 20 6a 73 6f 6e 4e 6f 64 65 53 69 7a 65 28 26 70   jsonNodeSize(&p
92f0: 4e 6f 64 65 5b 69 5d 29 2b 31 29 7b 0a 20 20 20  Node[i])+1){.   
9300: 20 73 77 69 74 63 68 28 20 70 4e 6f 64 65 5b 69   switch( pNode[i
9310: 5d 2e 65 54 79 70 65 20 29 7b 0a 20 20 20 20 20  ].eType ){.     
9320: 20 63 61 73 65 20 4a 53 4f 4e 5f 4e 55 4c 4c 3a   case JSON_NULL:
9330: 0a 20 20 20 20 20 20 20 20 70 4e 6f 64 65 5b 69  .        pNode[i
9340: 5d 2e 6a 6e 46 6c 61 67 73 20 7c 3d 20 4a 4e 4f  ].jnFlags |= JNO
9350: 44 45 5f 52 45 4d 4f 56 45 3b 0a 20 20 20 20 20  DE_REMOVE;.     
9360: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9370: 63 61 73 65 20 4a 53 4f 4e 5f 4f 42 4a 45 43 54  case JSON_OBJECT
9380: 3a 0a 20 20 20 20 20 20 20 20 6a 73 6f 6e 52 65  :.        jsonRe
9390: 6d 6f 76 65 41 6c 6c 4e 75 6c 6c 73 28 26 70 4e  moveAllNulls(&pN
93a0: 6f 64 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  ode[i]);.       
93b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
93c0: 7d 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  }.}.../*********
93d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
93e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
93f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9400: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9410: 2a 2a 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e 63 74  ***.** SQL funct
9420: 69 6f 6e 73 20 75 73 65 64 20 66 6f 72 20 74 65  ions used for te
9430: 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67  sting and debugg
9440: 69 6e 67 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing.************
9450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9480: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9490: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
94a0: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 65  _DEBUG./*.** The
94b0: 20 6a 73 6f 6e 5f 70 61 72 73 65 28 4a 53 4f 4e   json_parse(JSON
94c0: 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  ) function retur
94d0: 6e 73 20 61 20 73 74 72 69 6e 67 20 77 68 69 63  ns a string whic
94e0: 68 20 64 65 73 63 72 69 62 65 73 0a 2a 2a 20 61  h describes.** a
94f0: 20 70 61 72 73 65 20 6f 66 20 74 68 65 20 4a 53   parse of the JS
9500: 4f 4e 20 70 72 6f 76 69 64 65 64 2e 20 20 4f 72  ON provided.  Or
9510: 20 69 74 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c   it returns NULL
9520: 20 69 66 20 4a 53 4f 4e 20 69 73 20 6e 6f 74 0a   if JSON is not.
9530: 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 0a  ** well-formed..
9540: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a  */.static void j
9550: 73 6f 6e 50 61 72 73 65 46 75 6e 63 28 0a 20 20  sonParseFunc(.  
9560: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
9570: 2a 63 74 78 2c 0a 20 20 69 6e 74 20 61 72 67 63  *ctx,.  int argc
9580: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
9590: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 4a 73  e **argv.){.  Js
95a0: 6f 6e 53 74 72 69 6e 67 20 73 3b 20 20 20 20 20  onString s;     
95b0: 20 20 2f 2a 20 4f 75 74 70 75 74 20 73 74 72 69    /* Output stri
95c0: 6e 67 20 2d 20 6e 6f 74 20 72 65 61 6c 20 4a 53  ng - not real JS
95d0: 4f 4e 20 2a 2f 0a 20 20 4a 73 6f 6e 50 61 72 73  ON */.  JsonPars
95e0: 65 20 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  e x;        /* T
95f0: 68 65 20 70 61 72 73 65 20 2a 2f 0a 20 20 75 33  he parse */.  u3
9600: 32 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  2 i;..  assert( 
9610: 61 72 67 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28  argc==1 );.  if(
9620: 20 6a 73 6f 6e 50 61 72 73 65 28 26 78 2c 20 63   jsonParse(&x, c
9630: 74 78 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  tx, (const char*
9640: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
9650: 65 78 74 28 61 72 67 76 5b 30 5d 29 29 20 29 20  ext(argv[0])) ) 
9660: 72 65 74 75 72 6e 3b 0a 20 20 6a 73 6f 6e 50 61  return;.  jsonPa
9670: 72 73 65 46 69 6e 64 50 61 72 65 6e 74 73 28 26  rseFindParents(&
9680: 78 29 3b 0a 20 20 6a 73 6f 6e 49 6e 69 74 28 26  x);.  jsonInit(&
9690: 73 2c 20 63 74 78 29 3b 0a 20 20 66 6f 72 28 69  s, ctx);.  for(i
96a0: 3d 30 3b 20 69 3c 78 2e 6e 4e 6f 64 65 3b 20 69  =0; i<x.nNode; i
96b0: 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ++){.    const c
96c0: 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20 20 20  har *zType;.    
96d0: 69 66 28 20 78 2e 61 4e 6f 64 65 5b 69 5d 2e 6a  if( x.aNode[i].j
96e0: 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 4c  nFlags & JNODE_L
96f0: 41 42 45 4c 20 29 7b 0a 20 20 20 20 20 20 61 73  ABEL ){.      as
9700: 73 65 72 74 28 20 78 2e 61 4e 6f 64 65 5b 69 5d  sert( x.aNode[i]
9710: 2e 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f 53 54 52  .eType==JSON_STR
9720: 49 4e 47 20 29 3b 0a 20 20 20 20 20 20 7a 54 79  ING );.      zTy
9730: 70 65 20 3d 20 22 6c 61 62 65 6c 22 3b 0a 20 20  pe = "label";.  
9740: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
9750: 54 79 70 65 20 3d 20 6a 73 6f 6e 54 79 70 65 5b  Type = jsonType[
9760: 78 2e 61 4e 6f 64 65 5b 69 5d 2e 65 54 79 70 65  x.aNode[i].eType
9770: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 73 6f  ];.    }.    jso
9780: 6e 50 72 69 6e 74 66 28 31 30 30 2c 20 26 73 2c  nPrintf(100, &s,
9790: 22 6e 6f 64 65 20 25 33 75 3a 20 25 37 73 20 6e  "node %3u: %7s n
97a0: 3d 25 2d 34 64 20 75 70 3d 25 2d 34 64 22 2c 0a  =%-4d up=%-4d",.
97b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
97c0: 2c 20 7a 54 79 70 65 2c 20 78 2e 61 4e 6f 64 65  , zType, x.aNode
97d0: 5b 69 5d 2e 6e 2c 20 78 2e 61 55 70 5b 69 5d 29  [i].n, x.aUp[i])
97e0: 3b 0a 20 20 20 20 69 66 28 20 78 2e 61 4e 6f 64  ;.    if( x.aNod
97f0: 65 5b 69 5d 2e 75 2e 7a 4a 43 6f 6e 74 65 6e 74  e[i].u.zJContent
9800: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 6a 73 6f  !=0 ){.      jso
9810: 6e 41 70 70 65 6e 64 52 61 77 28 26 73 2c 20 22  nAppendRaw(&s, "
9820: 20 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 6a 73   ", 1);.      js
9830: 6f 6e 41 70 70 65 6e 64 52 61 77 28 26 73 2c 20  onAppendRaw(&s, 
9840: 78 2e 61 4e 6f 64 65 5b 69 5d 2e 75 2e 7a 4a 43  x.aNode[i].u.zJC
9850: 6f 6e 74 65 6e 74 2c 20 78 2e 61 4e 6f 64 65 5b  ontent, x.aNode[
9860: 69 5d 2e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  i].n);.    }.   
9870: 20 6a 73 6f 6e 41 70 70 65 6e 64 52 61 77 28 26   jsonAppendRaw(&
9880: 73 2c 20 22 5c 6e 22 2c 20 31 29 3b 0a 20 20 7d  s, "\n", 1);.  }
9890: 0a 20 20 6a 73 6f 6e 50 61 72 73 65 52 65 73 65  .  jsonParseRese
98a0: 74 28 26 78 29 3b 0a 20 20 6a 73 6f 6e 52 65 73  t(&x);.  jsonRes
98b0: 75 6c 74 28 26 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ult(&s);.}../*.*
98c0: 2a 20 54 68 65 20 6a 73 6f 6e 5f 74 65 73 74 31  * The json_test1
98d0: 28 4a 53 4f 4e 29 20 66 75 6e 63 74 69 6f 6e 20  (JSON) function 
98e0: 72 65 74 75 72 6e 20 74 72 75 65 20 28 31 29 20  return true (1) 
98f0: 69 66 20 74 68 65 20 69 6e 70 75 74 20 69 73 20  if the input is 
9900: 4a 53 4f 4e 0a 2a 2a 20 74 65 78 74 20 67 65 6e  JSON.** text gen
9910: 65 72 61 74 65 64 20 62 79 20 61 6e 6f 74 68 65  erated by anothe
9920: 72 20 6a 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e  r json function.
9930: 20 20 49 74 20 72 65 74 75 72 6e 73 20 28 30 29    It returns (0)
9940: 20 69 66 20 74 68 65 20 69 6e 70 75 74 0a 2a 2a   if the input.**
9950: 20 69 73 20 6e 6f 74 20 6b 6e 6f 77 6e 20 74 6f   is not known to
9960: 20 62 65 20 4a 53 4f 4e 2e 0a 2a 2f 0a 73 74 61   be JSON..*/.sta
9970: 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 54 65 73  tic void jsonTes
9980: 74 31 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  t1Func(.  sqlite
9990: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 0a  3_context *ctx,.
99a0: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
99b0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
99c0: 67 76 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  gv.){.  UNUSED_P
99d0: 41 52 41 4d 28 61 72 67 63 29 3b 0a 20 20 73 71  ARAM(argc);.  sq
99e0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
99f0: 28 63 74 78 2c 20 73 71 6c 69 74 65 33 5f 76 61  (ctx, sqlite3_va
9a00: 6c 75 65 5f 73 75 62 74 79 70 65 28 61 72 67 76  lue_subtype(argv
9a10: 5b 30 5d 29 3d 3d 4a 53 4f 4e 5f 53 55 42 54 59  [0])==JSON_SUBTY
9a20: 50 45 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  PE);.}.#endif /*
9a30: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
9a40: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
9a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9a70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
9a90: 2a 2a 20 53 63 61 6c 61 72 20 53 51 4c 20 66 75  ** Scalar SQL fu
9aa0: 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d 65 6e 74  nction implement
9ab0: 61 74 69 6f 6e 73 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ations.*********
9ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9ad0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9ae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9af0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9b00: 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  ***/../*.** Impl
9b10: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
9b20: 65 20 6a 73 6f 6e 5f 51 55 4f 54 45 28 56 41 4c  e json_QUOTE(VAL
9b30: 55 45 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 52  UE) function.  R
9b40: 65 74 75 72 6e 20 61 20 4a 53 4f 4e 20 76 61 6c  eturn a JSON val
9b50: 75 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  ue.** correspond
9b60: 69 6e 67 20 74 6f 20 74 68 65 20 53 51 4c 20 76  ing to the SQL v
9b70: 61 6c 75 65 20 69 6e 70 75 74 2e 20 20 4d 6f 73  alue input.  Mos
9b80: 74 6c 79 20 74 68 69 73 20 6d 65 61 6e 73 20 70  tly this means p
9b90: 75 74 74 69 6e 67 20 0a 2a 2a 20 64 6f 75 62 6c  utting .** doubl
9ba0: 65 2d 71 75 6f 74 65 73 20 61 72 6f 75 6e 64 20  e-quotes around 
9bb0: 73 74 72 69 6e 67 73 20 61 6e 64 20 72 65 74 75  strings and retu
9bc0: 72 6e 69 6e 67 20 74 68 65 20 75 6e 71 75 6f 74  rning the unquot
9bd0: 65 64 20 73 74 72 69 6e 67 20 22 6e 75 6c 6c 22  ed string "null"
9be0: 0a 2a 2a 20 77 68 65 6e 20 67 69 76 65 6e 20 61  .** when given a
9bf0: 20 4e 55 4c 4c 20 69 6e 70 75 74 2e 0a 2a 2f 0a   NULL input..*/.
9c00: 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e  static void json
9c10: 51 75 6f 74 65 46 75 6e 63 28 0a 20 20 73 71 6c  QuoteFunc(.  sql
9c20: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74  ite3_context *ct
9c30: 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  x,.  int argc,. 
9c40: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
9c50: 2a 61 72 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e 53  *argv.){.  JsonS
9c60: 74 72 69 6e 67 20 6a 78 3b 0a 20 20 55 4e 55 53  tring jx;.  UNUS
9c70: 45 44 5f 50 41 52 41 4d 28 61 72 67 63 29 3b 0a  ED_PARAM(argc);.
9c80: 0a 20 20 6a 73 6f 6e 49 6e 69 74 28 26 6a 78 2c  .  jsonInit(&jx,
9c90: 20 63 74 78 29 3b 0a 20 20 6a 73 6f 6e 41 70 70   ctx);.  jsonApp
9ca0: 65 6e 64 56 61 6c 75 65 28 26 6a 78 2c 20 61 72  endValue(&jx, ar
9cb0: 67 76 5b 30 5d 29 3b 0a 20 20 6a 73 6f 6e 52 65  gv[0]);.  jsonRe
9cc0: 73 75 6c 74 28 26 6a 78 29 3b 0a 20 20 73 71 6c  sult(&jx);.  sql
9cd0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 73 75 62 74  ite3_result_subt
9ce0: 79 70 65 28 63 74 78 2c 20 4a 53 4f 4e 5f 53 55  ype(ctx, JSON_SU
9cf0: 42 54 59 50 45 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  BTYPE);.}../*.**
9d00: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
9d10: 6f 66 20 74 68 65 20 6a 73 6f 6e 5f 61 72 72 61  of the json_arra
9d20: 79 28 56 41 4c 55 45 2c 2e 2e 2e 29 20 66 75 6e  y(VALUE,...) fun
9d30: 63 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61  ction.  Return a
9d40: 20 4a 53 4f 4e 0a 2a 2a 20 61 72 72 61 79 20 74   JSON.** array t
9d50: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  hat contains all
9d60: 20 76 61 6c 75 65 73 20 67 69 76 65 6e 20 69 6e   values given in
9d70: 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 4f 72 20   arguments.  Or 
9d80: 69 66 20 61 6e 79 20 61 72 67 75 6d 65 6e 74 0a  if any argument.
9d90: 2a 2a 20 69 73 20 61 20 42 4c 4f 42 2c 20 74 68  ** is a BLOB, th
9da0: 72 6f 77 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f  row an error..*/
9db0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f  .static void jso
9dc0: 6e 41 72 72 61 79 46 75 6e 63 28 0a 20 20 73 71  nArrayFunc(.  sq
9dd0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
9de0: 74 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  tx,.  int argc,.
9df0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
9e00: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20  **argv.){.  int 
9e10: 69 3b 0a 20 20 4a 73 6f 6e 53 74 72 69 6e 67 20  i;.  JsonString 
9e20: 6a 78 3b 0a 0a 20 20 6a 73 6f 6e 49 6e 69 74 28  jx;..  jsonInit(
9e30: 26 6a 78 2c 20 63 74 78 29 3b 0a 20 20 6a 73 6f  &jx, ctx);.  jso
9e40: 6e 41 70 70 65 6e 64 43 68 61 72 28 26 6a 78 2c  nAppendChar(&jx,
9e50: 20 27 5b 27 29 3b 0a 20 20 66 6f 72 28 69 3d 30   '[');.  for(i=0
9e60: 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  ; i<argc; i++){.
9e70: 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 53 65      jsonAppendSe
9e80: 70 61 72 61 74 6f 72 28 26 6a 78 29 3b 0a 20 20  parator(&jx);.  
9e90: 20 20 6a 73 6f 6e 41 70 70 65 6e 64 56 61 6c 75    jsonAppendValu
9ea0: 65 28 26 6a 78 2c 20 61 72 67 76 5b 69 5d 29 3b  e(&jx, argv[i]);
9eb0: 0a 20 20 7d 0a 20 20 6a 73 6f 6e 41 70 70 65 6e  .  }.  jsonAppen
9ec0: 64 43 68 61 72 28 26 6a 78 2c 20 27 5d 27 29 3b  dChar(&jx, ']');
9ed0: 0a 20 20 6a 73 6f 6e 52 65 73 75 6c 74 28 26 6a  .  jsonResult(&j
9ee0: 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  x);.  sqlite3_re
9ef0: 73 75 6c 74 5f 73 75 62 74 79 70 65 28 63 74 78  sult_subtype(ctx
9f00: 2c 20 4a 53 4f 4e 5f 53 55 42 54 59 50 45 29 3b  , JSON_SUBTYPE);
9f10: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 6a 73 6f 6e 5f  .}.../*.** json_
9f20: 61 72 72 61 79 5f 6c 65 6e 67 74 68 28 4a 53 4f  array_length(JSO
9f30: 4e 29 0a 2a 2a 20 6a 73 6f 6e 5f 61 72 72 61 79  N).** json_array
9f40: 5f 6c 65 6e 67 74 68 28 4a 53 4f 4e 2c 20 50 41  _length(JSON, PA
9f50: 54 48 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  TH).**.** Return
9f60: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
9f70: 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 74  lements in the t
9f80: 6f 70 2d 6c 65 76 65 6c 20 4a 53 4f 4e 20 61 72  op-level JSON ar
9f90: 72 61 79 2e 20 20 0a 2a 2a 20 52 65 74 75 72 6e  ray.  .** Return
9fa0: 20 30 20 69 66 20 74 68 65 20 69 6e 70 75 74 20   0 if the input 
9fb0: 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f  is not a well-fo
9fc0: 72 6d 65 64 20 4a 53 4f 4e 20 61 72 72 61 79 2e  rmed JSON array.
9fd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9fe0: 6a 73 6f 6e 41 72 72 61 79 4c 65 6e 67 74 68 46  jsonArrayLengthF
9ff0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
a000: 6f 6e 74 65 78 74 20 2a 63 74 78 2c 0a 20 20 69  ontext *ctx,.  i
a010: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
a020: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
a030: 29 7b 0a 20 20 4a 73 6f 6e 50 61 72 73 65 20 2a  ){.  JsonParse *
a040: 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  p;          /* T
a050: 68 65 20 70 61 72 73 65 20 2a 2f 0a 20 20 73 71  he parse */.  sq
a060: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 20 3d 20  lite3_int64 n = 
a070: 30 3b 0a 20 20 75 33 32 20 69 3b 0a 20 20 4a 73  0;.  u32 i;.  Js
a080: 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 3b 0a 0a  onNode *pNode;..
a090: 20 20 70 20 3d 20 6a 73 6f 6e 50 61 72 73 65 43    p = jsonParseC
a0a0: 61 63 68 65 64 28 63 74 78 2c 20 61 72 67 76 2c  ached(ctx, argv,
a0b0: 20 63 74 78 29 3b 0a 20 20 69 66 28 20 70 3d 3d   ctx);.  if( p==
a0c0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  0 ) return;.  as
a0d0: 73 65 72 74 28 20 70 2d 3e 6e 4e 6f 64 65 20 29  sert( p->nNode )
a0e0: 3b 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 32 20  ;.  if( argc==2 
a0f0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
a100: 72 20 2a 7a 50 61 74 68 20 3d 20 28 63 6f 6e 73  r *zPath = (cons
a110: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
a120: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
a130: 31 5d 29 3b 0a 20 20 20 20 70 4e 6f 64 65 20 3d  1]);.    pNode =
a140: 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 28 70 2c 20 7a   jsonLookup(p, z
a150: 50 61 74 68 2c 20 30 2c 20 63 74 78 29 3b 0a 20  Path, 0, ctx);. 
a160: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 6f 64   }else{.    pNod
a170: 65 20 3d 20 70 2d 3e 61 4e 6f 64 65 3b 0a 20 20  e = p->aNode;.  
a180: 7d 0a 20 20 69 66 28 20 70 4e 6f 64 65 3d 3d 30  }.  if( pNode==0
a190: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
a1a0: 20 20 7d 0a 20 20 69 66 28 20 70 4e 6f 64 65 2d    }.  if( pNode-
a1b0: 3e 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f 41 52 52  >eType==JSON_ARR
a1c0: 41 59 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  AY ){.    assert
a1d0: 28 20 28 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67  ( (pNode->jnFlag
a1e0: 73 20 26 20 4a 4e 4f 44 45 5f 41 50 50 45 4e 44  s & JNODE_APPEND
a1f0: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28  )==0 );.    for(
a200: 69 3d 31 3b 20 69 3c 3d 70 4e 6f 64 65 2d 3e 6e  i=1; i<=pNode->n
a210: 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69 20  ; n++){.      i 
a220: 2b 3d 20 6a 73 6f 6e 4e 6f 64 65 53 69 7a 65 28  += jsonNodeSize(
a230: 26 70 4e 6f 64 65 5b 69 5d 29 3b 0a 20 20 20 20  &pNode[i]);.    
a240: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
a250: 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 74 78  result_int64(ctx
a260: 2c 20 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 6a  , n);.}../*.** j
a270: 73 6f 6e 5f 65 78 74 72 61 63 74 28 4a 53 4f 4e  son_extract(JSON
a280: 2c 20 50 41 54 48 2c 20 2e 2e 2e 29 0a 2a 2a 0a  , PATH, ...).**.
a290: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 65 6c  ** Return the el
a2a0: 65 6d 65 6e 74 20 64 65 73 63 72 69 62 65 64 20  ement described 
a2b0: 62 79 20 50 41 54 48 2e 20 20 52 65 74 75 72 6e  by PATH.  Return
a2c0: 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 69   NULL if there i
a2d0: 73 20 6e 6f 0a 2a 2a 20 50 41 54 48 20 65 6c 65  s no.** PATH ele
a2e0: 6d 65 6e 74 2e 20 20 49 66 20 74 68 65 72 65 20  ment.  If there 
a2f0: 61 72 65 20 6d 75 6c 74 69 70 6c 65 20 50 41 54  are multiple PAT
a300: 48 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  Hs, then return 
a310: 61 20 4a 53 4f 4e 20 61 72 72 61 79 0a 2a 2a 20  a JSON array.** 
a320: 77 69 74 68 20 74 68 65 20 72 65 73 75 6c 74 20  with the result 
a330: 66 72 6f 6d 20 65 61 63 68 20 70 61 74 68 2e 20  from each path. 
a340: 20 54 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 20   Throw an error 
a350: 69 66 20 74 68 65 20 4a 53 4f 4e 20 6f 72 20 61  if the JSON or a
a360: 6e 79 20 50 41 54 48 0a 2a 2a 20 69 73 20 6d 61  ny PATH.** is ma
a370: 6c 66 6f 72 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74  lformed..*/.stat
a380: 69 63 20 76 6f 69 64 20 6a 73 6f 6e 45 78 74 72  ic void jsonExtr
a390: 61 63 74 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  actFunc(.  sqlit
a3a0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c  e3_context *ctx,
a3b0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
a3c0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
a3d0: 72 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e 50 61 72  rgv.){.  JsonPar
a3e0: 73 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  se *p;          
a3f0: 2f 2a 20 54 68 65 20 70 61 72 73 65 20 2a 2f 0a  /* The parse */.
a400: 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64    JsonNode *pNod
a410: 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e;.  const char 
a420: 2a 7a 50 61 74 68 3b 0a 20 20 4a 73 6f 6e 53 74  *zPath;.  JsonSt
a430: 72 69 6e 67 20 6a 78 3b 0a 20 20 69 6e 74 20 69  ring jx;.  int i
a440: 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 3c 32 20  ;..  if( argc<2 
a450: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 20 3d 20  ) return;.  p = 
a460: 6a 73 6f 6e 50 61 72 73 65 43 61 63 68 65 64 28  jsonParseCached(
a470: 63 74 78 2c 20 61 72 67 76 2c 20 63 74 78 29 3b  ctx, argv, ctx);
a480: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
a490: 74 75 72 6e 3b 0a 20 20 6a 73 6f 6e 49 6e 69 74  turn;.  jsonInit
a4a0: 28 26 6a 78 2c 20 63 74 78 29 3b 0a 20 20 6a 73  (&jx, ctx);.  js
a4b0: 6f 6e 41 70 70 65 6e 64 43 68 61 72 28 26 6a 78  onAppendChar(&jx
a4c0: 2c 20 27 5b 27 29 3b 0a 20 20 66 6f 72 28 69 3d  , '[');.  for(i=
a4d0: 31 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b  1; i<argc; i++){
a4e0: 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 28 63 6f  .    zPath = (co
a4f0: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
a500: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
a510: 76 5b 69 5d 29 3b 0a 20 20 20 20 70 4e 6f 64 65  v[i]);.    pNode
a520: 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 28 70 2c   = jsonLookup(p,
a530: 20 7a 50 61 74 68 2c 20 30 2c 20 63 74 78 29 3b   zPath, 0, ctx);
a540: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 45 72 72  .    if( p->nErr
a550: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
a560: 28 20 61 72 67 63 3e 32 20 29 7b 0a 20 20 20 20  ( argc>2 ){.    
a570: 20 20 6a 73 6f 6e 41 70 70 65 6e 64 53 65 70 61    jsonAppendSepa
a580: 72 61 74 6f 72 28 26 6a 78 29 3b 0a 20 20 20 20  rator(&jx);.    
a590: 20 20 69 66 28 20 70 4e 6f 64 65 20 29 7b 0a 20    if( pNode ){. 
a5a0: 20 20 20 20 20 20 20 6a 73 6f 6e 52 65 6e 64 65         jsonRende
a5b0: 72 4e 6f 64 65 28 70 4e 6f 64 65 2c 20 26 6a 78  rNode(pNode, &jx
a5c0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 0);.      }els
a5d0: 65 7b 0a 20 20 20 20 20 20 20 20 6a 73 6f 6e 41  e{.        jsonA
a5e0: 70 70 65 6e 64 52 61 77 28 26 6a 78 2c 20 22 6e  ppendRaw(&jx, "n
a5f0: 75 6c 6c 22 2c 20 34 29 3b 0a 20 20 20 20 20 20  ull", 4);.      
a600: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
a610: 70 4e 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 6a  pNode ){.      j
a620: 73 6f 6e 52 65 74 75 72 6e 28 70 4e 6f 64 65 2c  sonReturn(pNode,
a630: 20 63 74 78 2c 20 30 29 3b 0a 20 20 20 20 7d 0a   ctx, 0);.    }.
a640: 20 20 7d 0a 20 20 69 66 28 20 61 72 67 63 3e 32    }.  if( argc>2
a650: 20 26 26 20 69 3d 3d 61 72 67 63 20 29 7b 0a 20   && i==argc ){. 
a660: 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61     jsonAppendCha
a670: 72 28 26 6a 78 2c 20 27 5d 27 29 3b 0a 20 20 20  r(&jx, ']');.   
a680: 20 6a 73 6f 6e 52 65 73 75 6c 74 28 26 6a 78 29   jsonResult(&jx)
a690: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  ;.    sqlite3_re
a6a0: 73 75 6c 74 5f 73 75 62 74 79 70 65 28 63 74 78  sult_subtype(ctx
a6b0: 2c 20 4a 53 4f 4e 5f 53 55 42 54 59 50 45 29 3b  , JSON_SUBTYPE);
a6c0: 0a 20 20 7d 0a 20 20 6a 73 6f 6e 52 65 73 65 74  .  }.  jsonReset
a6d0: 28 26 6a 78 29 3b 0a 7d 0a 0a 2f 2a 20 54 68 69  (&jx);.}../* Thi
a6e0: 73 20 69 73 20 74 68 65 20 52 46 43 20 37 33 39  s is the RFC 739
a6f0: 36 20 4d 65 72 67 65 50 61 74 63 68 20 61 6c 67  6 MergePatch alg
a700: 6f 72 69 74 68 6d 2e 0a 2a 2f 0a 73 74 61 74 69  orithm..*/.stati
a710: 63 20 4a 73 6f 6e 4e 6f 64 65 20 2a 6a 73 6f 6e  c JsonNode *json
a720: 4d 65 72 67 65 50 61 74 63 68 28 0a 20 20 4a 73  MergePatch(.  Js
a730: 6f 6e 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  onParse *pParse,
a740: 20 20 20 2f 2a 20 54 68 65 20 4a 53 4f 4e 20 70     /* The JSON p
a750: 61 72 73 65 72 20 74 68 61 74 20 63 6f 6e 74 61  arser that conta
a760: 69 6e 73 20 74 68 65 20 54 41 52 47 45 54 20 2a  ins the TARGET *
a770: 2f 0a 20 20 75 33 32 20 69 54 61 72 67 65 74 2c  /.  u32 iTarget,
a780: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 64 65           /* Node
a790: 20 6f 66 20 74 68 65 20 54 41 52 47 45 54 20 69   of the TARGET i
a7a0: 6e 20 70 50 61 72 73 65 20 2a 2f 0a 20 20 4a 73  n pParse */.  Js
a7b0: 6f 6e 4e 6f 64 65 20 2a 70 50 61 74 63 68 20 20  onNode *pPatch  
a7c0: 20 20 20 2f 2a 20 54 68 65 20 50 41 54 43 48 20     /* The PATCH 
a7d0: 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 69 2c 20 6a  */.){.  u32 i, j
a7e0: 3b 0a 20 20 75 33 32 20 69 52 6f 6f 74 3b 0a 20  ;.  u32 iRoot;. 
a7f0: 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 54 61 72 67   JsonNode *pTarg
a800: 65 74 3b 0a 20 20 69 66 28 20 70 50 61 74 63 68  et;.  if( pPatch
a810: 2d 3e 65 54 79 70 65 21 3d 4a 53 4f 4e 5f 4f 42  ->eType!=JSON_OB
a820: 4a 45 43 54 20 29 7b 0a 20 20 20 20 72 65 74 75  JECT ){.    retu
a830: 72 6e 20 70 50 61 74 63 68 3b 0a 20 20 7d 0a 20  rn pPatch;.  }. 
a840: 20 61 73 73 65 72 74 28 20 69 54 61 72 67 65 74   assert( iTarget
a850: 3e 3d 30 20 26 26 20 69 54 61 72 67 65 74 3c 70  >=0 && iTarget<p
a860: 50 61 72 73 65 2d 3e 6e 4e 6f 64 65 20 29 3b 0a  Parse->nNode );.
a870: 20 20 70 54 61 72 67 65 74 20 3d 20 26 70 50 61    pTarget = &pPa
a880: 72 73 65 2d 3e 61 4e 6f 64 65 5b 69 54 61 72 67  rse->aNode[iTarg
a890: 65 74 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28  et];.  assert( (
a8a0: 70 50 61 74 63 68 2d 3e 6a 6e 46 6c 61 67 73 20  pPatch->jnFlags 
a8b0: 26 20 4a 4e 4f 44 45 5f 41 50 50 45 4e 44 29 3d  & JNODE_APPEND)=
a8c0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 54 61 72  =0 );.  if( pTar
a8d0: 67 65 74 2d 3e 65 54 79 70 65 21 3d 4a 53 4f 4e  get->eType!=JSON
a8e0: 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 6a  _OBJECT ){.    j
a8f0: 73 6f 6e 52 65 6d 6f 76 65 41 6c 6c 4e 75 6c 6c  sonRemoveAllNull
a900: 73 28 70 50 61 74 63 68 29 3b 0a 20 20 20 20 72  s(pPatch);.    r
a910: 65 74 75 72 6e 20 70 50 61 74 63 68 3b 0a 20 20  eturn pPatch;.  
a920: 7d 0a 20 20 69 52 6f 6f 74 20 3d 20 69 54 61 72  }.  iRoot = iTar
a930: 67 65 74 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20  get;.  for(i=1; 
a940: 69 3c 70 50 61 74 63 68 2d 3e 6e 3b 20 69 20 2b  i<pPatch->n; i +
a950: 3d 20 6a 73 6f 6e 4e 6f 64 65 53 69 7a 65 28 26  = jsonNodeSize(&
a960: 70 50 61 74 63 68 5b 69 2b 31 5d 29 2b 31 29 7b  pPatch[i+1])+1){
a970: 0a 20 20 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20  .    u32 nKey;. 
a980: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
a990: 4b 65 79 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Key;.    assert(
a9a0: 20 70 50 61 74 63 68 5b 69 5d 2e 65 54 79 70 65   pPatch[i].eType
a9b0: 3d 3d 4a 53 4f 4e 5f 53 54 52 49 4e 47 20 29 3b  ==JSON_STRING );
a9c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
a9d0: 74 63 68 5b 69 5d 2e 6a 6e 46 6c 61 67 73 20 26  tch[i].jnFlags &
a9e0: 20 4a 4e 4f 44 45 5f 4c 41 42 45 4c 20 29 3b 0a   JNODE_LABEL );.
a9f0: 20 20 20 20 6e 4b 65 79 20 3d 20 70 50 61 74 63      nKey = pPatc
aa00: 68 5b 69 5d 2e 6e 3b 0a 20 20 20 20 7a 4b 65 79  h[i].n;.    zKey
aa10: 20 3d 20 70 50 61 74 63 68 5b 69 5d 2e 75 2e 7a   = pPatch[i].u.z
aa20: 4a 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 61 73  JContent;.    as
aa30: 73 65 72 74 28 20 28 70 50 61 74 63 68 5b 69 5d  sert( (pPatch[i]
aa40: 2e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45  .jnFlags & JNODE
aa50: 5f 52 41 57 29 3d 3d 30 20 29 3b 0a 20 20 20 20  _RAW)==0 );.    
aa60: 66 6f 72 28 6a 3d 31 3b 20 6a 3c 70 54 61 72 67  for(j=1; j<pTarg
aa70: 65 74 2d 3e 6e 3b 20 6a 20 2b 3d 20 6a 73 6f 6e  et->n; j += json
aa80: 4e 6f 64 65 53 69 7a 65 28 26 70 54 61 72 67 65  NodeSize(&pTarge
aa90: 74 5b 6a 2b 31 5d 29 2b 31 20 29 7b 0a 20 20 20  t[j+1])+1 ){.   
aaa0: 20 20 20 61 73 73 65 72 74 28 20 70 54 61 72 67     assert( pTarg
aab0: 65 74 5b 6a 5d 2e 65 54 79 70 65 3d 3d 4a 53 4f  et[j].eType==JSO
aac0: 4e 5f 53 54 52 49 4e 47 20 29 3b 0a 20 20 20 20  N_STRING );.    
aad0: 20 20 61 73 73 65 72 74 28 20 70 54 61 72 67 65    assert( pTarge
aae0: 74 5b 6a 5d 2e 6a 6e 46 6c 61 67 73 20 26 20 4a  t[j].jnFlags & J
aaf0: 4e 4f 44 45 5f 4c 41 42 45 4c 20 29 3b 0a 20 20  NODE_LABEL );.  
ab00: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50 61      assert( (pPa
ab10: 74 63 68 5b 69 5d 2e 6a 6e 46 6c 61 67 73 20 26  tch[i].jnFlags &
ab20: 20 4a 4e 4f 44 45 5f 52 41 57 29 3d 3d 30 20 29   JNODE_RAW)==0 )
ab30: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 72  ;.      if( pTar
ab40: 67 65 74 5b 6a 5d 2e 6e 3d 3d 6e 4b 65 79 20 26  get[j].n==nKey &
ab50: 26 20 73 74 72 6e 63 6d 70 28 70 54 61 72 67 65  & strncmp(pTarge
ab60: 74 5b 6a 5d 2e 75 2e 7a 4a 43 6f 6e 74 65 6e 74  t[j].u.zJContent
ab70: 2c 7a 4b 65 79 2c 6e 4b 65 79 29 3d 3d 30 20 29  ,zKey,nKey)==0 )
ab80: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  {.        if( pT
ab90: 61 72 67 65 74 5b 6a 2b 31 5d 2e 6a 6e 46 6c 61  arget[j+1].jnFla
aba0: 67 73 20 26 20 28 4a 4e 4f 44 45 5f 52 45 4d 4f  gs & (JNODE_REMO
abb0: 56 45 7c 4a 4e 4f 44 45 5f 50 41 54 43 48 29 20  VE|JNODE_PATCH) 
abc0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
abd0: 20 69 66 28 20 70 50 61 74 63 68 5b 69 2b 31 5d   if( pPatch[i+1]
abe0: 2e 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f 4e 55 4c  .eType==JSON_NUL
abf0: 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  L ){.          p
ac00: 54 61 72 67 65 74 5b 6a 2b 31 5d 2e 6a 6e 46 6c  Target[j+1].jnFl
ac10: 61 67 73 20 7c 3d 20 4a 4e 4f 44 45 5f 52 45 4d  ags |= JNODE_REM
ac20: 4f 56 45 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  OVE;.        }el
ac30: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 4a 73  se{.          Js
ac40: 6f 6e 4e 6f 64 65 20 2a 70 4e 65 77 20 3d 20 6a  onNode *pNew = j
ac50: 73 6f 6e 4d 65 72 67 65 50 61 74 63 68 28 70 50  sonMergePatch(pP
ac60: 61 72 73 65 2c 20 69 54 61 72 67 65 74 2b 6a 2b  arse, iTarget+j+
ac70: 31 2c 20 26 70 50 61 74 63 68 5b 69 2b 31 5d 29  1, &pPatch[i+1])
ac80: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
ac90: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
aca0: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54   0;.          pT
acb0: 61 72 67 65 74 20 3d 20 26 70 50 61 72 73 65 2d  arget = &pParse-
acc0: 3e 61 4e 6f 64 65 5b 69 54 61 72 67 65 74 5d 3b  >aNode[iTarget];
acd0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
ace0: 4e 65 77 21 3d 26 70 54 61 72 67 65 74 5b 6a 2b  New!=&pTarget[j+
acf0: 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1] ){.          
ad00: 20 20 70 54 61 72 67 65 74 5b 6a 2b 31 5d 2e 75    pTarget[j+1].u
ad10: 2e 70 50 61 74 63 68 20 3d 20 70 4e 65 77 3b 0a  .pPatch = pNew;.
ad20: 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61 72              pTar
ad30: 67 65 74 5b 6a 2b 31 5d 2e 6a 6e 46 6c 61 67 73  get[j+1].jnFlags
ad40: 20 7c 3d 20 4a 4e 4f 44 45 5f 50 41 54 43 48 3b   |= JNODE_PATCH;
ad50: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
ad60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
ad70: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
ad80: 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70    }.    if( j>=p
ad90: 54 61 72 67 65 74 2d 3e 6e 20 26 26 20 70 50 61  Target->n && pPa
ada0: 74 63 68 5b 69 2b 31 5d 2e 65 54 79 70 65 21 3d  tch[i+1].eType!=
adb0: 4a 53 4f 4e 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20  JSON_NULL ){.   
adc0: 20 20 20 69 6e 74 20 69 53 74 61 72 74 2c 20 69     int iStart, i
add0: 50 61 74 63 68 3b 0a 20 20 20 20 20 20 69 53 74  Patch;.      iSt
ade0: 61 72 74 20 3d 20 6a 73 6f 6e 50 61 72 73 65 41  art = jsonParseA
adf0: 64 64 4e 6f 64 65 28 70 50 61 72 73 65 2c 20 4a  ddNode(pParse, J
ae00: 53 4f 4e 5f 4f 42 4a 45 43 54 2c 20 32 2c 20 30  SON_OBJECT, 2, 0
ae10: 29 3b 0a 20 20 20 20 20 20 6a 73 6f 6e 50 61 72  );.      jsonPar
ae20: 73 65 41 64 64 4e 6f 64 65 28 70 50 61 72 73 65  seAddNode(pParse
ae30: 2c 20 4a 53 4f 4e 5f 53 54 52 49 4e 47 2c 20 6e  , JSON_STRING, n
ae40: 4b 65 79 2c 20 7a 4b 65 79 29 3b 0a 20 20 20 20  Key, zKey);.    
ae50: 20 20 69 50 61 74 63 68 20 3d 20 6a 73 6f 6e 50    iPatch = jsonP
ae60: 61 72 73 65 41 64 64 4e 6f 64 65 28 70 50 61 72  arseAddNode(pPar
ae70: 73 65 2c 20 4a 53 4f 4e 5f 54 52 55 45 2c 20 30  se, JSON_TRUE, 0
ae80: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
ae90: 70 50 61 72 73 65 2d 3e 6f 6f 6d 20 29 20 72 65  pParse->oom ) re
aea0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 6a 73  turn 0;.      js
aeb0: 6f 6e 52 65 6d 6f 76 65 41 6c 6c 4e 75 6c 6c 73  onRemoveAllNulls
aec0: 28 70 50 61 74 63 68 29 3b 0a 20 20 20 20 20 20  (pPatch);.      
aed0: 70 54 61 72 67 65 74 20 3d 20 26 70 50 61 72 73  pTarget = &pPars
aee0: 65 2d 3e 61 4e 6f 64 65 5b 69 54 61 72 67 65 74  e->aNode[iTarget
aef0: 5d 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  ];.      pParse-
af00: 3e 61 4e 6f 64 65 5b 69 52 6f 6f 74 5d 2e 6a 6e  >aNode[iRoot].jn
af10: 46 6c 61 67 73 20 7c 3d 20 4a 4e 4f 44 45 5f 41  Flags |= JNODE_A
af20: 50 50 45 4e 44 3b 0a 20 20 20 20 20 20 70 50 61  PPEND;.      pPa
af30: 72 73 65 2d 3e 61 4e 6f 64 65 5b 69 52 6f 6f 74  rse->aNode[iRoot
af40: 5d 2e 75 2e 69 41 70 70 65 6e 64 20 3d 20 69 53  ].u.iAppend = iS
af50: 74 61 72 74 20 2d 20 69 52 6f 6f 74 3b 0a 20 20  tart - iRoot;.  
af60: 20 20 20 20 69 52 6f 6f 74 20 3d 20 69 53 74 61      iRoot = iSta
af70: 72 74 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  rt;.      pParse
af80: 2d 3e 61 4e 6f 64 65 5b 69 50 61 74 63 68 5d 2e  ->aNode[iPatch].
af90: 6a 6e 46 6c 61 67 73 20 7c 3d 20 4a 4e 4f 44 45  jnFlags |= JNODE
afa0: 5f 50 41 54 43 48 3b 0a 20 20 20 20 20 20 70 50  _PATCH;.      pP
afb0: 61 72 73 65 2d 3e 61 4e 6f 64 65 5b 69 50 61 74  arse->aNode[iPat
afc0: 63 68 5d 2e 75 2e 70 50 61 74 63 68 20 3d 20 26  ch].u.pPatch = &
afd0: 70 50 61 74 63 68 5b 69 2b 31 5d 3b 0a 20 20 20  pPatch[i+1];.   
afe0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
aff0: 70 54 61 72 67 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  pTarget;.}../*.*
b000: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
b010: 20 6f 66 20 74 68 65 20 6a 73 6f 6e 5f 6d 65 72   of the json_mer
b020: 67 65 70 61 74 63 68 28 4a 53 4f 4e 31 2c 4a 53  gepatch(JSON1,JS
b030: 4f 4e 32 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  ON2) function.  
b040: 52 65 74 75 72 6e 20 61 20 4a 53 4f 4e 0a 2a 2a  Return a JSON.**
b050: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 73 20   object that is 
b060: 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 72 75  the result of ru
b070: 6e 6e 69 6e 67 20 74 68 65 20 52 46 43 20 37 33  nning the RFC 73
b080: 39 36 20 4d 65 72 67 65 50 61 74 63 68 28 29 20  96 MergePatch() 
b090: 61 6c 67 6f 72 69 74 68 6d 0a 2a 2a 20 6f 6e 20  algorithm.** on 
b0a0: 74 68 65 20 74 77 6f 20 61 72 67 75 6d 65 6e 74  the two argument
b0b0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
b0c0: 64 20 6a 73 6f 6e 50 61 74 63 68 46 75 6e 63 28  d jsonPatchFunc(
b0d0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
b0e0: 78 74 20 2a 63 74 78 2c 0a 20 20 69 6e 74 20 61  xt *ctx,.  int a
b0f0: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
b100: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
b110: 20 4a 73 6f 6e 50 61 72 73 65 20 78 3b 20 20 20   JsonParse x;   
b120: 20 20 2f 2a 20 54 68 65 20 4a 53 4f 4e 20 74 68    /* The JSON th
b130: 61 74 20 69 73 20 62 65 69 6e 67 20 70 61 74 63  at is being patc
b140: 68 65 64 20 2a 2f 0a 20 20 4a 73 6f 6e 50 61 72  hed */.  JsonPar
b150: 73 65 20 79 3b 20 20 20 20 20 2f 2a 20 54 68 65  se y;     /* The
b160: 20 70 61 74 63 68 20 2a 2f 0a 20 20 4a 73 6f 6e   patch */.  Json
b170: 4e 6f 64 65 20 2a 70 52 65 73 75 6c 74 3b 20 20  Node *pResult;  
b180: 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 6f   /* The result o
b190: 66 20 74 68 65 20 6d 65 72 67 65 20 2a 2f 0a 0a  f the merge */..
b1a0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 61    UNUSED_PARAM(a
b1b0: 72 67 63 29 3b 0a 20 20 69 66 28 20 6a 73 6f 6e  rgc);.  if( json
b1c0: 50 61 72 73 65 28 26 78 2c 20 63 74 78 2c 20 28  Parse(&x, ctx, (
b1d0: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
b1e0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
b1f0: 72 67 76 5b 30 5d 29 29 20 29 20 72 65 74 75 72  rgv[0])) ) retur
b200: 6e 3b 0a 20 20 69 66 28 20 6a 73 6f 6e 50 61 72  n;.  if( jsonPar
b210: 73 65 28 26 79 2c 20 63 74 78 2c 20 28 63 6f 6e  se(&y, ctx, (con
b220: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
b230: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
b240: 5b 31 5d 29 29 20 29 7b 0a 20 20 20 20 6a 73 6f  [1])) ){.    jso
b250: 6e 50 61 72 73 65 52 65 73 65 74 28 26 78 29 3b  nParseReset(&x);
b260: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
b270: 0a 20 20 70 52 65 73 75 6c 74 20 3d 20 6a 73 6f  .  pResult = jso
b280: 6e 4d 65 72 67 65 50 61 74 63 68 28 26 78 2c 20  nMergePatch(&x, 
b290: 30 2c 20 79 2e 61 4e 6f 64 65 29 3b 0a 20 20 61  0, y.aNode);.  a
b2a0: 73 73 65 72 74 28 20 70 52 65 73 75 6c 74 21 3d  ssert( pResult!=
b2b0: 30 20 7c 7c 20 78 2e 6f 6f 6d 20 29 3b 0a 20 20  0 || x.oom );.  
b2c0: 69 66 28 20 70 52 65 73 75 6c 74 20 29 7b 0a 20  if( pResult ){. 
b2d0: 20 20 20 6a 73 6f 6e 52 65 74 75 72 6e 4a 73 6f     jsonReturnJso
b2e0: 6e 28 70 52 65 73 75 6c 74 2c 20 63 74 78 2c 20  n(pResult, ctx, 
b2f0: 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
b300: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
b310: 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 74 78 29  error_nomem(ctx)
b320: 3b 0a 20 20 7d 0a 20 20 6a 73 6f 6e 50 61 72 73  ;.  }.  jsonPars
b330: 65 52 65 73 65 74 28 26 78 29 3b 0a 20 20 6a 73  eReset(&x);.  js
b340: 6f 6e 50 61 72 73 65 52 65 73 65 74 28 26 79 29  onParseReset(&y)
b350: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  ;.}.../*.** Impl
b360: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
b370: 65 20 6a 73 6f 6e 5f 6f 62 6a 65 63 74 28 4e 41  e json_object(NA
b380: 4d 45 2c 56 41 4c 55 45 2c 2e 2e 2e 29 20 66 75  ME,VALUE,...) fu
b390: 6e 63 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20  nction.  Return 
b3a0: 61 20 4a 53 4f 4e 0a 2a 2a 20 6f 62 6a 65 63 74  a JSON.** object
b3b0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61   that contains a
b3c0: 6c 6c 20 6e 61 6d 65 2f 76 61 6c 75 65 20 67 69  ll name/value gi
b3d0: 76 65 6e 20 69 6e 20 61 72 67 75 6d 65 6e 74 73  ven in arguments
b3e0: 2e 20 20 4f 72 20 69 66 20 61 6e 79 20 6e 61 6d  .  Or if any nam
b3f0: 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 20 73 74  e.** is not a st
b400: 72 69 6e 67 20 6f 72 20 69 66 20 61 6e 79 20 76  ring or if any v
b410: 61 6c 75 65 20 69 73 20 61 20 42 4c 4f 42 2c 20  alue is a BLOB, 
b420: 74 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 2e 0a  throw an error..
b430: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a  */.static void j
b440: 73 6f 6e 4f 62 6a 65 63 74 46 75 6e 63 28 0a 20  sonObjectFunc(. 
b450: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
b460: 20 2a 63 74 78 2c 0a 20 20 69 6e 74 20 61 72 67   *ctx,.  int arg
b470: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
b480: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69  ue **argv.){.  i
b490: 6e 74 20 69 3b 0a 20 20 4a 73 6f 6e 53 74 72 69  nt i;.  JsonStri
b4a0: 6e 67 20 6a 78 3b 0a 20 20 63 6f 6e 73 74 20 63  ng jx;.  const c
b4b0: 68 61 72 20 2a 7a 3b 0a 20 20 75 33 32 20 6e 3b  har *z;.  u32 n;
b4c0: 0a 0a 20 20 69 66 28 20 61 72 67 63 26 31 20 29  ..  if( argc&1 )
b4d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
b4e0: 73 75 6c 74 5f 65 72 72 6f 72 28 63 74 78 2c 20  sult_error(ctx, 
b4f0: 22 6a 73 6f 6e 5f 6f 62 6a 65 63 74 28 29 20 72  "json_object() r
b500: 65 71 75 69 72 65 73 20 61 6e 20 65 76 65 6e 20  equires an even 
b510: 6e 75 6d 62 65 72 20 22 0a 20 20 20 20 20 20 20  number ".       
b520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b530: 20 20 20 20 20 20 20 20 20 20 20 22 6f 66 20 61             "of a
b540: 72 67 75 6d 65 6e 74 73 22 2c 20 2d 31 29 3b 0a  rguments", -1);.
b550: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
b560: 20 20 6a 73 6f 6e 49 6e 69 74 28 26 6a 78 2c 20    jsonInit(&jx, 
b570: 63 74 78 29 3b 0a 20 20 6a 73 6f 6e 41 70 70 65  ctx);.  jsonAppe
b580: 6e 64 43 68 61 72 28 26 6a 78 2c 20 27 7b 27 29  ndChar(&jx, '{')
b590: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61  ;.  for(i=0; i<a
b5a0: 72 67 63 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20  rgc; i+=2){.    
b5b0: 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  if( sqlite3_valu
b5c0: 65 5f 74 79 70 65 28 61 72 67 76 5b 69 5d 29 21  e_type(argv[i])!
b5d0: 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a  =SQLITE_TEXT ){.
b5e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
b5f0: 73 75 6c 74 5f 65 72 72 6f 72 28 63 74 78 2c 20  sult_error(ctx, 
b600: 22 6a 73 6f 6e 5f 6f 62 6a 65 63 74 28 29 20 6c  "json_object() l
b610: 61 62 65 6c 73 20 6d 75 73 74 20 62 65 20 54 45  abels must be TE
b620: 58 54 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  XT", -1);.      
b630: 6a 73 6f 6e 52 65 73 65 74 28 26 6a 78 29 3b 0a  jsonReset(&jx);.
b640: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
b650: 20 20 7d 0a 20 20 20 20 6a 73 6f 6e 41 70 70 65    }.    jsonAppe
b660: 6e 64 53 65 70 61 72 61 74 6f 72 28 26 6a 78 29  ndSeparator(&jx)
b670: 3b 0a 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74  ;.    z = (const
b680: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
b690: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 69  alue_text(argv[i
b6a0: 5d 29 3b 0a 20 20 20 20 6e 20 3d 20 28 75 33 32  ]);.    n = (u32
b6b0: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62  )sqlite3_value_b
b6c0: 79 74 65 73 28 61 72 67 76 5b 69 5d 29 3b 0a 20  ytes(argv[i]);. 
b6d0: 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 53 74 72     jsonAppendStr
b6e0: 69 6e 67 28 26 6a 78 2c 20 7a 2c 20 6e 29 3b 0a  ing(&jx, z, n);.
b6f0: 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68      jsonAppendCh
b700: 61 72 28 26 6a 78 2c 20 27 3a 27 29 3b 0a 20 20  ar(&jx, ':');.  
b710: 20 20 6a 73 6f 6e 41 70 70 65 6e 64 56 61 6c 75    jsonAppendValu
b720: 65 28 26 6a 78 2c 20 61 72 67 76 5b 69 2b 31 5d  e(&jx, argv[i+1]
b730: 29 3b 0a 20 20 7d 0a 20 20 6a 73 6f 6e 41 70 70  );.  }.  jsonApp
b740: 65 6e 64 43 68 61 72 28 26 6a 78 2c 20 27 7d 27  endChar(&jx, '}'
b750: 29 3b 0a 20 20 6a 73 6f 6e 52 65 73 75 6c 74 28  );.  jsonResult(
b760: 26 6a 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  &jx);.  sqlite3_
b770: 72 65 73 75 6c 74 5f 73 75 62 74 79 70 65 28 63  result_subtype(c
b780: 74 78 2c 20 4a 53 4f 4e 5f 53 55 42 54 59 50 45  tx, JSON_SUBTYPE
b790: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 6a 73 6f  );.}.../*.** jso
b7a0: 6e 5f 72 65 6d 6f 76 65 28 4a 53 4f 4e 2c 20 50  n_remove(JSON, P
b7b0: 41 54 48 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20  ATH, ...).**.** 
b7c0: 52 65 6d 6f 76 65 20 74 68 65 20 6e 61 6d 65 64  Remove the named
b7d0: 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 20 4a   elements from J
b7e0: 53 4f 4e 20 61 6e 64 20 72 65 74 75 72 6e 20 74  SON and return t
b7f0: 68 65 20 72 65 73 75 6c 74 2e 20 20 6d 61 6c 66  he result.  malf
b800: 6f 72 6d 65 64 0a 2a 2a 20 4a 53 4f 4e 20 6f 72  ormed.** JSON or
b810: 20 50 41 54 48 20 61 72 67 75 6d 65 6e 74 73 20   PATH arguments 
b820: 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 65 72 72  result in an err
b830: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  or..*/.static vo
b840: 69 64 20 6a 73 6f 6e 52 65 6d 6f 76 65 46 75 6e  id jsonRemoveFun
b850: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
b860: 74 65 78 74 20 2a 63 74 78 2c 0a 20 20 69 6e 74  text *ctx,.  int
b870: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
b880: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
b890: 0a 20 20 4a 73 6f 6e 50 61 72 73 65 20 78 3b 20  .  JsonParse x; 
b8a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
b8b0: 70 61 72 73 65 20 2a 2f 0a 20 20 4a 73 6f 6e 4e  parse */.  JsonN
b8c0: 6f 64 65 20 2a 70 4e 6f 64 65 3b 0a 20 20 63 6f  ode *pNode;.  co
b8d0: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 3b  nst char *zPath;
b8e0: 0a 20 20 75 33 32 20 69 3b 0a 0a 20 20 69 66 28  .  u32 i;..  if(
b8f0: 20 61 72 67 63 3c 31 20 29 20 72 65 74 75 72 6e   argc<1 ) return
b900: 3b 0a 20 20 69 66 28 20 6a 73 6f 6e 50 61 72 73  ;.  if( jsonPars
b910: 65 28 26 78 2c 20 63 74 78 2c 20 28 63 6f 6e 73  e(&x, ctx, (cons
b920: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
b930: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
b940: 30 5d 29 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  0])) ) return;. 
b950: 20 61 73 73 65 72 74 28 20 78 2e 6e 4e 6f 64 65   assert( x.nNode
b960: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69   );.  for(i=1; i
b970: 3c 28 75 33 32 29 61 72 67 63 3b 20 69 2b 2b 29  <(u32)argc; i++)
b980: 7b 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 28 63  {.    zPath = (c
b990: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
b9a0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
b9b0: 67 76 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20  gv[i]);.    if( 
b9c0: 7a 50 61 74 68 3d 3d 30 20 29 20 67 6f 74 6f 20  zPath==0 ) goto 
b9d0: 72 65 6d 6f 76 65 5f 64 6f 6e 65 3b 0a 20 20 20  remove_done;.   
b9e0: 20 70 4e 6f 64 65 20 3d 20 6a 73 6f 6e 4c 6f 6f   pNode = jsonLoo
b9f0: 6b 75 70 28 26 78 2c 20 7a 50 61 74 68 2c 20 30  kup(&x, zPath, 0
ba00: 2c 20 63 74 78 29 3b 0a 20 20 20 20 69 66 28 20  , ctx);.    if( 
ba10: 78 2e 6e 45 72 72 20 29 20 67 6f 74 6f 20 72 65  x.nErr ) goto re
ba20: 6d 6f 76 65 5f 64 6f 6e 65 3b 0a 20 20 20 20 69  move_done;.    i
ba30: 66 28 20 70 4e 6f 64 65 20 29 20 70 4e 6f 64 65  f( pNode ) pNode
ba40: 2d 3e 6a 6e 46 6c 61 67 73 20 7c 3d 20 4a 4e 4f  ->jnFlags |= JNO
ba50: 44 45 5f 52 45 4d 4f 56 45 3b 0a 20 20 7d 0a 20  DE_REMOVE;.  }. 
ba60: 20 69 66 28 20 28 78 2e 61 4e 6f 64 65 5b 30 5d   if( (x.aNode[0]
ba70: 2e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45  .jnFlags & JNODE
ba80: 5f 52 45 4d 4f 56 45 29 3d 3d 30 20 29 7b 0a 20  _REMOVE)==0 ){. 
ba90: 20 20 20 6a 73 6f 6e 52 65 74 75 72 6e 4a 73 6f     jsonReturnJso
baa0: 6e 28 78 2e 61 4e 6f 64 65 2c 20 63 74 78 2c 20  n(x.aNode, ctx, 
bab0: 30 29 3b 0a 20 20 7d 0a 72 65 6d 6f 76 65 5f 64  0);.  }.remove_d
bac0: 6f 6e 65 3a 0a 20 20 6a 73 6f 6e 50 61 72 73 65  one:.  jsonParse
bad0: 52 65 73 65 74 28 26 78 29 3b 0a 7d 0a 0a 2f 2a  Reset(&x);.}../*
bae0: 0a 2a 2a 20 6a 73 6f 6e 5f 72 65 70 6c 61 63 65  .** json_replace
baf0: 28 4a 53 4f 4e 2c 20 50 41 54 48 2c 20 56 41 4c  (JSON, PATH, VAL
bb00: 55 45 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 52  UE, ...).**.** R
bb10: 65 70 6c 61 63 65 20 74 68 65 20 76 61 6c 75 65  eplace the value
bb20: 20 61 74 20 50 41 54 48 20 77 69 74 68 20 56 41   at PATH with VA
bb30: 4c 55 45 2e 20 20 49 66 20 50 41 54 48 20 64 6f  LUE.  If PATH do
bb40: 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  es not already e
bb50: 78 69 73 74 2c 0a 2a 2a 20 74 68 69 73 20 72 6f  xist,.** this ro
bb60: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
bb70: 2e 20 20 49 66 20 4a 53 4f 4e 20 6f 72 20 50 41  .  If JSON or PA
bb80: 54 48 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 2c  TH is malformed,
bb90: 20 74 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 2e   throw an error.
bba0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
bbb0: 6a 73 6f 6e 52 65 70 6c 61 63 65 46 75 6e 63 28  jsonReplaceFunc(
bbc0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
bbd0: 78 74 20 2a 63 74 78 2c 0a 20 20 69 6e 74 20 61  xt *ctx,.  int a
bbe0: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
bbf0: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
bc00: 20 4a 73 6f 6e 50 61 72 73 65 20 78 3b 20 20 20   JsonParse x;   
bc10: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
bc20: 72 73 65 20 2a 2f 0a 20 20 4a 73 6f 6e 4e 6f 64  rse */.  JsonNod
bc30: 65 20 2a 70 4e 6f 64 65 3b 0a 20 20 63 6f 6e 73  e *pNode;.  cons
bc40: 74 20 63 68 61 72 20 2a 7a 50 61 74 68 3b 0a 20  t char *zPath;. 
bc50: 20 75 33 32 20 69 3b 0a 0a 20 20 69 66 28 20 61   u32 i;..  if( a
bc60: 72 67 63 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a  rgc<1 ) return;.
bc70: 20 20 69 66 28 20 28 61 72 67 63 26 31 29 3d 3d    if( (argc&1)==
bc80: 30 20 29 20 7b 0a 20 20 20 20 6a 73 6f 6e 57 72  0 ) {.    jsonWr
bc90: 6f 6e 67 4e 75 6d 41 72 67 73 28 63 74 78 2c 20  ongNumArgs(ctx, 
bca0: 22 72 65 70 6c 61 63 65 22 29 3b 0a 20 20 20 20  "replace");.    
bcb0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
bcc0: 28 20 6a 73 6f 6e 50 61 72 73 65 28 26 78 2c 20  ( jsonParse(&x, 
bcd0: 63 74 78 2c 20 28 63 6f 6e 73 74 20 63 68 61 72  ctx, (const char
bce0: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
bcf0: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 29 20 29  text(argv[0])) )
bd00: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
bd10: 74 28 20 78 2e 6e 4e 6f 64 65 20 29 3b 0a 20 20  t( x.nNode );.  
bd20: 66 6f 72 28 69 3d 31 3b 20 69 3c 28 75 33 32 29  for(i=1; i<(u32)
bd30: 61 72 67 63 3b 20 69 2b 3d 32 29 7b 0a 20 20 20  argc; i+=2){.   
bd40: 20 7a 50 61 74 68 20 3d 20 28 63 6f 6e 73 74 20   zPath = (const 
bd50: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
bd60: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 69 5d  lue_text(argv[i]
bd70: 29 3b 0a 20 20 20 20 70 4e 6f 64 65 20 3d 20 6a  );.    pNode = j
bd80: 73 6f 6e 4c 6f 6f 6b 75 70 28 26 78 2c 20 7a 50  sonLookup(&x, zP
bd90: 61 74 68 2c 20 30 2c 20 63 74 78 29 3b 0a 20 20  ath, 0, ctx);.  
bda0: 20 20 69 66 28 20 78 2e 6e 45 72 72 20 29 20 67    if( x.nErr ) g
bdb0: 6f 74 6f 20 72 65 70 6c 61 63 65 5f 65 72 72 3b  oto replace_err;
bdc0: 0a 20 20 20 20 69 66 28 20 70 4e 6f 64 65 20 29  .    if( pNode )
bdd0: 7b 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 6a  {.      pNode->j
bde0: 6e 46 6c 61 67 73 20 7c 3d 20 28 75 38 29 4a 4e  nFlags |= (u8)JN
bdf0: 4f 44 45 5f 52 45 50 4c 41 43 45 3b 0a 20 20 20  ODE_REPLACE;.   
be00: 20 20 20 70 4e 6f 64 65 2d 3e 75 2e 69 52 65 70     pNode->u.iRep
be10: 6c 61 63 65 20 3d 20 69 20 2b 20 31 3b 0a 20 20  lace = i + 1;.  
be20: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 78 2e    }.  }.  if( x.
be30: 61 4e 6f 64 65 5b 30 5d 2e 6a 6e 46 6c 61 67 73  aNode[0].jnFlags
be40: 20 26 20 4a 4e 4f 44 45 5f 52 45 50 4c 41 43 45   & JNODE_REPLACE
be50: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
be60: 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 74 78  result_value(ctx
be70: 2c 20 61 72 67 76 5b 78 2e 61 4e 6f 64 65 5b 30  , argv[x.aNode[0
be80: 5d 2e 75 2e 69 52 65 70 6c 61 63 65 5d 29 3b 0a  ].u.iReplace]);.
be90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6a 73 6f    }else{.    jso
bea0: 6e 52 65 74 75 72 6e 4a 73 6f 6e 28 78 2e 61 4e  nReturnJson(x.aN
beb0: 6f 64 65 2c 20 63 74 78 2c 20 61 72 67 76 29 3b  ode, ctx, argv);
bec0: 0a 20 20 7d 0a 72 65 70 6c 61 63 65 5f 65 72 72  .  }.replace_err
bed0: 3a 0a 20 20 6a 73 6f 6e 50 61 72 73 65 52 65 73  :.  jsonParseRes
bee0: 65 74 28 26 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  et(&x);.}../*.**
bef0: 20 6a 73 6f 6e 5f 73 65 74 28 4a 53 4f 4e 2c 20   json_set(JSON, 
bf00: 50 41 54 48 2c 20 56 41 4c 55 45 2c 20 2e 2e 2e  PATH, VALUE, ...
bf10: 29 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ).**.** Set the 
bf20: 76 61 6c 75 65 20 61 74 20 50 41 54 48 20 74 6f  value at PATH to
bf30: 20 56 41 4c 55 45 2e 20 20 43 72 65 61 74 65 20   VALUE.  Create 
bf40: 74 68 65 20 50 41 54 48 20 69 66 20 69 74 20 64  the PATH if it d
bf50: 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a  oes not already.
bf60: 2a 2a 20 65 78 69 73 74 2e 20 20 4f 76 65 72 77  ** exist.  Overw
bf70: 72 69 74 65 20 65 78 69 73 74 69 6e 67 20 76 61  rite existing va
bf80: 6c 75 65 73 20 74 68 61 74 20 64 6f 20 65 78 69  lues that do exi
bf90: 73 74 2e 0a 2a 2a 20 49 66 20 4a 53 4f 4e 20 6f  st..** If JSON o
bfa0: 72 20 50 41 54 48 20 69 73 20 6d 61 6c 66 6f 72  r PATH is malfor
bfb0: 6d 65 64 2c 20 74 68 72 6f 77 20 61 6e 20 65 72  med, throw an er
bfc0: 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 6a 73 6f 6e 5f  ror..**.** json_
bfd0: 69 6e 73 65 72 74 28 4a 53 4f 4e 2c 20 50 41 54  insert(JSON, PAT
bfe0: 48 2c 20 56 41 4c 55 45 2c 20 2e 2e 2e 29 0a 2a  H, VALUE, ...).*
bff0: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 50 41 54 48  *.** Create PATH
c000: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
c010: 69 74 20 74 6f 20 56 41 4c 55 45 2e 20 20 49 66  it to VALUE.  If
c020: 20 50 41 54 48 20 61 6c 72 65 61 64 79 20 65 78   PATH already ex
c030: 69 73 74 73 2c 20 74 68 69 73 0a 2a 2a 20 72 6f  ists, this.** ro
c040: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
c050: 2e 20 20 49 66 20 4a 53 4f 4e 20 6f 72 20 50 41  .  If JSON or PA
c060: 54 48 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 2c  TH is malformed,
c070: 20 74 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 2e   throw an error.
c080: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c090: 6a 73 6f 6e 53 65 74 46 75 6e 63 28 0a 20 20 73  jsonSetFunc(.  s
c0a0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
c0b0: 63 74 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ctx,.  int argc,
c0c0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
c0d0: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 4a 73 6f   **argv.){.  Jso
c0e0: 6e 50 61 72 73 65 20 78 3b 20 20 20 20 20 20 20  nParse x;       
c0f0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 20     /* The parse 
c100: 2a 2f 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70  */.  JsonNode *p
c110: 4e 6f 64 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68  Node;.  const ch
c120: 61 72 20 2a 7a 50 61 74 68 3b 0a 20 20 75 33 32  ar *zPath;.  u32
c130: 20 69 3b 0a 20 20 69 6e 74 20 62 41 70 6e 64 3b   i;.  int bApnd;
c140: 0a 20 20 69 6e 74 20 62 49 73 53 65 74 20 3d 20  .  int bIsSet = 
c150: 2a 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 5f 75  *(int*)sqlite3_u
c160: 73 65 72 5f 64 61 74 61 28 63 74 78 29 3b 0a 0a  ser_data(ctx);..
c170: 20 20 69 66 28 20 61 72 67 63 3c 31 20 29 20 72    if( argc<1 ) r
c180: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 61 72  eturn;.  if( (ar
c190: 67 63 26 31 29 3d 3d 30 20 29 20 7b 0a 20 20 20  gc&1)==0 ) {.   
c1a0: 20 6a 73 6f 6e 57 72 6f 6e 67 4e 75 6d 41 72 67   jsonWrongNumArg
c1b0: 73 28 63 74 78 2c 20 62 49 73 53 65 74 20 3f 20  s(ctx, bIsSet ? 
c1c0: 22 73 65 74 22 20 3a 20 22 69 6e 73 65 72 74 22  "set" : "insert"
c1d0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
c1e0: 20 7d 0a 20 20 69 66 28 20 6a 73 6f 6e 50 61 72   }.  if( jsonPar
c1f0: 73 65 28 26 78 2c 20 63 74 78 2c 20 28 63 6f 6e  se(&x, ctx, (con
c200: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
c210: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
c220: 5b 30 5d 29 29 20 29 20 72 65 74 75 72 6e 3b 0a  [0])) ) return;.
c230: 20 20 61 73 73 65 72 74 28 20 78 2e 6e 4e 6f 64    assert( x.nNod
c240: 65 20 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20  e );.  for(i=1; 
c250: 69 3c 28 75 33 32 29 61 72 67 63 3b 20 69 2b 3d  i<(u32)argc; i+=
c260: 32 29 7b 0a 20 20 20 20 7a 50 61 74 68 20 3d 20  2){.    zPath = 
c270: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
c280: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
c290: 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 62 41  argv[i]);.    bA
c2a0: 70 6e 64 20 3d 20 30 3b 0a 20 20 20 20 70 4e 6f  pnd = 0;.    pNo
c2b0: 64 65 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 28  de = jsonLookup(
c2c0: 26 78 2c 20 7a 50 61 74 68 2c 20 26 62 41 70 6e  &x, zPath, &bApn
c2d0: 64 2c 20 63 74 78 29 3b 0a 20 20 20 20 69 66 28  d, ctx);.    if(
c2e0: 20 78 2e 6f 6f 6d 20 29 7b 0a 20 20 20 20 20 20   x.oom ){.      
c2f0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
c300: 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 74 78 29 3b  rror_nomem(ctx);
c310: 0a 20 20 20 20 20 20 67 6f 74 6f 20 6a 73 6f 6e  .      goto json
c320: 53 65 74 44 6f 6e 65 3b 0a 20 20 20 20 7d 65 6c  SetDone;.    }el
c330: 73 65 20 69 66 28 20 78 2e 6e 45 72 72 20 29 7b  se if( x.nErr ){
c340: 0a 20 20 20 20 20 20 67 6f 74 6f 20 6a 73 6f 6e  .      goto json
c350: 53 65 74 44 6f 6e 65 3b 0a 20 20 20 20 7d 65 6c  SetDone;.    }el
c360: 73 65 20 69 66 28 20 70 4e 6f 64 65 20 26 26 20  se if( pNode && 
c370: 28 62 41 70 6e 64 20 7c 7c 20 62 49 73 53 65 74  (bApnd || bIsSet
c380: 29 20 29 7b 0a 20 20 20 20 20 20 70 4e 6f 64 65  ) ){.      pNode
c390: 2d 3e 6a 6e 46 6c 61 67 73 20 7c 3d 20 28 75 38  ->jnFlags |= (u8
c3a0: 29 4a 4e 4f 44 45 5f 52 45 50 4c 41 43 45 3b 0a  )JNODE_REPLACE;.
c3b0: 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 75 2e 69        pNode->u.i
c3c0: 52 65 70 6c 61 63 65 20 3d 20 69 20 2b 20 31 3b  Replace = i + 1;
c3d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
c3e0: 20 78 2e 61 4e 6f 64 65 5b 30 5d 2e 6a 6e 46 6c   x.aNode[0].jnFl
c3f0: 61 67 73 20 26 20 4a 4e 4f 44 45 5f 52 45 50 4c  ags & JNODE_REPL
c400: 41 43 45 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ACE ){.    sqlit
c410: 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28  e3_result_value(
c420: 63 74 78 2c 20 61 72 67 76 5b 78 2e 61 4e 6f 64  ctx, argv[x.aNod
c430: 65 5b 30 5d 2e 75 2e 69 52 65 70 6c 61 63 65 5d  e[0].u.iReplace]
c440: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
c450: 6a 73 6f 6e 52 65 74 75 72 6e 4a 73 6f 6e 28 78  jsonReturnJson(x
c460: 2e 61 4e 6f 64 65 2c 20 63 74 78 2c 20 61 72 67  .aNode, ctx, arg
c470: 76 29 3b 0a 20 20 7d 0a 6a 73 6f 6e 53 65 74 44  v);.  }.jsonSetD
c480: 6f 6e 65 3a 0a 20 20 6a 73 6f 6e 50 61 72 73 65  one:.  jsonParse
c490: 52 65 73 65 74 28 26 78 29 3b 0a 7d 0a 0a 2f 2a  Reset(&x);.}../*
c4a0: 0a 2a 2a 20 6a 73 6f 6e 5f 74 79 70 65 28 4a 53  .** json_type(JS
c4b0: 4f 4e 29 0a 2a 2a 20 6a 73 6f 6e 5f 74 79 70 65  ON).** json_type
c4c0: 28 4a 53 4f 4e 2c 20 50 41 54 48 29 0a 2a 2a 0a  (JSON, PATH).**.
c4d0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f  ** Return the to
c4e0: 70 2d 6c 65 76 65 6c 20 22 74 79 70 65 22 20 6f  p-level "type" o
c4f0: 66 20 61 20 4a 53 4f 4e 20 73 74 72 69 6e 67 2e  f a JSON string.
c500: 20 20 54 68 72 6f 77 20 61 6e 20 65 72 72 6f 72    Throw an error
c510: 20 69 66 0a 2a 2a 20 65 69 74 68 65 72 20 74 68   if.** either th
c520: 65 20 4a 53 4f 4e 20 6f 72 20 50 41 54 48 20 69  e JSON or PATH i
c530: 6e 70 75 74 73 20 61 72 65 20 6e 6f 74 20 77 65  nputs are not we
c540: 6c 6c 2d 66 6f 72 6d 65 64 2e 0a 2a 2f 0a 73 74  ll-formed..*/.st
c550: 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 54 79  atic void jsonTy
c560: 70 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  peFunc(.  sqlite
c570: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 0a  3_context *ctx,.
c580: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
c590: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
c5a0: 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e 50 61 72 73  gv.){.  JsonPars
c5b0: 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 2f  e *p;          /
c5c0: 2a 20 54 68 65 20 70 61 72 73 65 20 2a 2f 0a 20  * The parse */. 
c5d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
c5e0: 74 68 3b 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a  th;.  JsonNode *
c5f0: 70 4e 6f 64 65 3b 0a 0a 20 20 70 20 3d 20 6a 73  pNode;..  p = js
c600: 6f 6e 50 61 72 73 65 43 61 63 68 65 64 28 63 74  onParseCached(ct
c610: 78 2c 20 61 72 67 76 2c 20 63 74 78 29 3b 0a 20  x, argv, ctx);. 
c620: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
c630: 72 6e 3b 0a 20 20 69 66 28 20 61 72 67 63 3d 3d  rn;.  if( argc==
c640: 32 20 29 7b 0a 20 20 20 20 7a 50 61 74 68 20 3d  2 ){.    zPath =
c650: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
c660: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
c670: 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 70  (argv[1]);.    p
c680: 4e 6f 64 65 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75  Node = jsonLooku
c690: 70 28 70 2c 20 7a 50 61 74 68 2c 20 30 2c 20 63  p(p, zPath, 0, c
c6a0: 74 78 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  tx);.  }else{.  
c6b0: 20 20 70 4e 6f 64 65 20 3d 20 70 2d 3e 61 4e 6f    pNode = p->aNo
c6c0: 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e  de;.  }.  if( pN
c6d0: 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ode ){.    sqlit
c6e0: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
c6f0: 74 78 2c 20 6a 73 6f 6e 54 79 70 65 5b 70 4e 6f  tx, jsonType[pNo
c700: 64 65 2d 3e 65 54 79 70 65 5d 2c 20 2d 31 2c 20  de->eType], -1, 
c710: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
c720: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 6a 73 6f    }.}../*.** jso
c730: 6e 5f 76 61 6c 69 64 28 4a 53 4f 4e 29 0a 2a 2a  n_valid(JSON).**
c740: 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20  .** Return 1 if 
c750: 4a 53 4f 4e 20 69 73 20 61 20 77 65 6c 6c 2d 66  JSON is a well-f
c760: 6f 72 6d 65 64 20 4a 53 4f 4e 20 73 74 72 69 6e  ormed JSON strin
c770: 67 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 52  g according to R
c780: 46 43 2d 37 31 35 39 2e 0a 2a 2a 20 52 65 74 75  FC-7159..** Retu
c790: 72 6e 20 30 20 6f 74 68 65 72 77 69 73 65 2e 0a  rn 0 otherwise..
c7a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a  */.static void j
c7b0: 73 6f 6e 56 61 6c 69 64 46 75 6e 63 28 0a 20 20  sonValidFunc(.  
c7c0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
c7d0: 2a 63 74 78 2c 0a 20 20 69 6e 74 20 61 72 67 63  *ctx,.  int argc
c7e0: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
c7f0: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 4a 73  e **argv.){.  Js
c800: 6f 6e 50 61 72 73 65 20 2a 70 3b 20 20 20 20 20  onParse *p;     
c810: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
c820: 65 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41  e */.  UNUSED_PA
c830: 52 41 4d 28 61 72 67 63 29 3b 0a 20 20 70 20 3d  RAM(argc);.  p =
c840: 20 6a 73 6f 6e 50 61 72 73 65 43 61 63 68 65 64   jsonParseCached
c850: 28 63 74 78 2c 20 61 72 67 76 2c 20 30 29 3b 0a  (ctx, argv, 0);.
c860: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
c870: 5f 69 6e 74 28 63 74 78 2c 20 70 21 3d 30 29 3b  _int(ctx, p!=0);
c880: 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}.../**********
c890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c8a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c8b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c8c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c8d0: 2a 2a 0a 2a 2a 20 41 67 67 72 65 67 61 74 65 20  **.** Aggregate 
c8e0: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70  SQL function imp
c8f0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 2a  lementations.***
c900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
c950: 20 6a 73 6f 6e 5f 67 72 6f 75 70 5f 61 72 72 61   json_group_arra
c960: 79 28 56 41 4c 55 45 29 0a 2a 2a 0a 2a 2a 20 52  y(VALUE).**.** R
c970: 65 74 75 72 6e 20 61 20 4a 53 4f 4e 20 61 72 72  eturn a JSON arr
c980: 61 79 20 63 6f 6d 70 6f 73 65 64 20 6f 66 20 61  ay composed of a
c990: 6c 6c 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65  ll values in the
c9a0: 20 61 67 67 72 65 67 61 74 65 2e 0a 2a 2f 0a 73   aggregate..*/.s
c9b0: 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 41  tatic void jsonA
c9c0: 72 72 61 79 53 74 65 70 28 0a 20 20 73 71 6c 69  rrayStep(.  sqli
c9d0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78  te3_context *ctx
c9e0: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
c9f0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
ca00: 61 72 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e 53 74  argv.){.  JsonSt
ca10: 72 69 6e 67 20 2a 70 53 74 72 3b 0a 20 20 55 4e  ring *pStr;.  UN
ca20: 55 53 45 44 5f 50 41 52 41 4d 28 61 72 67 63 29  USED_PARAM(argc)
ca30: 3b 0a 20 20 70 53 74 72 20 3d 20 28 4a 73 6f 6e  ;.  pStr = (Json
ca40: 53 74 72 69 6e 67 2a 29 73 71 6c 69 74 65 33 5f  String*)sqlite3_
ca50: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
ca60: 74 28 63 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70  t(ctx, sizeof(*p
ca70: 53 74 72 29 29 3b 0a 20 20 69 66 28 20 70 53 74  Str));.  if( pSt
ca80: 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 74  r ){.    if( pSt
ca90: 72 2d 3e 7a 42 75 66 3d 3d 30 20 29 7b 0a 20 20  r->zBuf==0 ){.  
caa0: 20 20 20 20 6a 73 6f 6e 49 6e 69 74 28 70 53 74      jsonInit(pSt
cab0: 72 2c 20 63 74 78 29 3b 0a 20 20 20 20 20 20 6a  r, ctx);.      j
cac0: 73 6f 6e 41 70 70 65 6e 64 43 68 61 72 28 70 53  sonAppendChar(pS
cad0: 74 72 2c 20 27 5b 27 29 3b 0a 20 20 20 20 7d 65  tr, '[');.    }e
cae0: 6c 73 65 20 69 66 28 20 70 53 74 72 2d 3e 6e 55  lse if( pStr->nU
caf0: 73 65 64 3e 31 20 29 7b 0a 20 20 20 20 20 20 6a  sed>1 ){.      j
cb00: 73 6f 6e 41 70 70 65 6e 64 43 68 61 72 28 70 53  sonAppendChar(pS
cb10: 74 72 2c 20 27 2c 27 29 3b 0a 20 20 20 20 20 20  tr, ',');.      
cb20: 70 53 74 72 2d 3e 70 43 74 78 20 3d 20 63 74 78  pStr->pCtx = ctx
cb30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 73 6f 6e  ;.    }.    json
cb40: 41 70 70 65 6e 64 56 61 6c 75 65 28 70 53 74 72  AppendValue(pStr
cb50: 2c 20 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7d 0a  , argv[0]);.  }.
cb60: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73  }.static void js
cb70: 6f 6e 41 72 72 61 79 43 6f 6d 70 75 74 65 28 73  onArrayCompute(s
cb80: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
cb90: 63 74 78 2c 20 69 6e 74 20 69 73 46 69 6e 61 6c  ctx, int isFinal
cba0: 29 7b 0a 20 20 4a 73 6f 6e 53 74 72 69 6e 67 20  ){.  JsonString 
cbb0: 2a 70 53 74 72 3b 0a 20 20 70 53 74 72 20 3d 20  *pStr;.  pStr = 
cbc0: 28 4a 73 6f 6e 53 74 72 69 6e 67 2a 29 73 71 6c  (JsonString*)sql
cbd0: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
cbe0: 6f 6e 74 65 78 74 28 63 74 78 2c 20 30 29 3b 0a  ontext(ctx, 0);.
cbf0: 20 20 69 66 28 20 70 53 74 72 20 29 7b 0a 20 20    if( pStr ){.  
cc00: 20 20 70 53 74 72 2d 3e 70 43 74 78 20 3d 20 63    pStr->pCtx = c
cc10: 74 78 3b 0a 20 20 20 20 6a 73 6f 6e 41 70 70 65  tx;.    jsonAppe
cc20: 6e 64 43 68 61 72 28 70 53 74 72 2c 20 27 5d 27  ndChar(pStr, ']'
cc30: 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74 72 2d  );.    if( pStr-
cc40: 3e 62 45 72 72 20 29 7b 0a 20 20 20 20 20 20 69  >bErr ){.      i
cc50: 66 28 20 70 53 74 72 2d 3e 62 45 72 72 3d 3d 31  f( pStr->bErr==1
cc60: 20 29 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c   ) sqlite3_resul
cc70: 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 74  t_error_nomem(ct
cc80: 78 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  x);.      assert
cc90: 28 20 70 53 74 72 2d 3e 62 53 74 61 74 69 63 20  ( pStr->bStatic 
cca0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
ccb0: 20 69 73 46 69 6e 61 6c 20 29 7b 0a 20 20 20 20   isFinal ){.    
ccc0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
ccd0: 5f 74 65 78 74 28 63 74 78 2c 20 70 53 74 72 2d  _text(ctx, pStr-
cce0: 3e 7a 42 75 66 2c 20 28 69 6e 74 29 70 53 74 72  >zBuf, (int)pStr
ccf0: 2d 3e 6e 55 73 65 64 2c 0a 20 20 20 20 20 20 20  ->nUsed,.       
cd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd10: 20 20 20 70 53 74 72 2d 3e 62 53 74 61 74 69 63     pStr->bStatic
cd20: 20 3f 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49   ? SQLITE_TRANSI
cd30: 45 4e 54 20 3a 20 73 71 6c 69 74 65 33 5f 66 72  ENT : sqlite3_fr
cd40: 65 65 29 3b 0a 20 20 20 20 20 20 70 53 74 72 2d  ee);.      pStr-
cd50: 3e 62 53 74 61 74 69 63 20 3d 20 31 3b 0a 20 20  >bStatic = 1;.  
cd60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
cd70: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
cd80: 78 74 28 63 74 78 2c 20 70 53 74 72 2d 3e 7a 42  xt(ctx, pStr->zB
cd90: 75 66 2c 20 28 69 6e 74 29 70 53 74 72 2d 3e 6e  uf, (int)pStr->n
cda0: 55 73 65 64 2c 20 53 51 4c 49 54 45 5f 54 52 41  Used, SQLITE_TRA
cdb0: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 70  NSIENT);.      p
cdc0: 53 74 72 2d 3e 6e 55 73 65 64 2d 2d 3b 0a 20 20  Str->nUsed--;.  
cdd0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
cde0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
cdf0: 74 65 78 74 28 63 74 78 2c 20 22 5b 5d 22 2c 20  text(ctx, "[]", 
ce00: 32 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  2, SQLITE_STATIC
ce10: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
ce20: 5f 72 65 73 75 6c 74 5f 73 75 62 74 79 70 65 28  _result_subtype(
ce30: 63 74 78 2c 20 4a 53 4f 4e 5f 53 55 42 54 59 50  ctx, JSON_SUBTYP
ce40: 45 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  E);.}.static voi
ce50: 64 20 6a 73 6f 6e 41 72 72 61 79 56 61 6c 75 65  d jsonArrayValue
ce60: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
ce70: 20 2a 63 74 78 29 7b 0a 20 20 6a 73 6f 6e 41 72   *ctx){.  jsonAr
ce80: 72 61 79 43 6f 6d 70 75 74 65 28 63 74 78 2c 20  rayCompute(ctx, 
ce90: 30 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  0);.}.static voi
cea0: 64 20 6a 73 6f 6e 41 72 72 61 79 46 69 6e 61 6c  d jsonArrayFinal
ceb0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
cec0: 20 2a 63 74 78 29 7b 0a 20 20 6a 73 6f 6e 41 72   *ctx){.  jsonAr
ced0: 72 61 79 43 6f 6d 70 75 74 65 28 63 74 78 2c 20  rayCompute(ctx, 
cee0: 31 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  1);.}..#ifndef S
cef0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f  QLITE_OMIT_WINDO
cf00: 57 46 55 4e 43 0a 2f 2a 0a 2a 2a 20 54 68 69 73  WFUNC./*.** This
cf10: 20 6d 65 74 68 6f 64 20 77 6f 72 6b 73 20 66 6f   method works fo
cf20: 72 20 62 6f 74 68 20 6a 73 6f 6e 5f 67 72 6f 75  r both json_grou
cf30: 70 5f 61 72 72 61 79 28 29 20 61 6e 64 20 6a 73  p_array() and js
cf40: 6f 6e 5f 67 72 6f 75 70 5f 6f 62 6a 65 63 74 28  on_group_object(
cf50: 29 2e 0a 2a 2a 20 49 74 20 77 6f 72 6b 73 20 62  )..** It works b
cf60: 79 20 72 65 6d 6f 76 69 6e 67 20 74 68 65 20 66  y removing the f
cf70: 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20  irst element of 
cf80: 74 68 65 20 67 72 6f 75 70 20 62 79 20 73 65 61  the group by sea
cf90: 72 63 68 69 6e 67 20 66 6f 72 77 61 72 64 0a 2a  rching forward.*
cfa0: 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63  * to the first c
cfb0: 6f 6d 6d 61 20 28 22 2c 22 29 20 74 68 61 74 20  omma (",") that 
cfc0: 69 73 20 6e 6f 74 20 77 69 74 68 69 6e 20 61 20  is not within a 
cfd0: 73 74 72 69 6e 67 20 61 6e 64 20 64 65 6c 65 74  string and delet
cfe0: 69 6e 67 20 61 6c 6c 0a 2a 2a 20 74 65 78 74 20  ing all.** text 
cff0: 74 68 72 6f 75 67 68 20 74 68 61 74 20 63 6f 6d  through that com
d000: 6d 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ma..*/.static vo
d010: 69 64 20 6a 73 6f 6e 47 72 6f 75 70 49 6e 76 65  id jsonGroupInve
d020: 72 73 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  rse(.  sqlite3_c
d030: 6f 6e 74 65 78 74 20 2a 63 74 78 2c 0a 20 20 69  ontext *ctx,.  i
d040: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
d050: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
d060: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  ){.  unsigned in
d070: 74 20 69 3b 0a 20 20 69 6e 74 20 69 6e 53 74 72  t i;.  int inStr
d080: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4e 65 73   = 0;.  int nNes
d090: 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  t = 0;.  char *z
d0a0: 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 4a 73  ;.  char c;.  Js
d0b0: 6f 6e 53 74 72 69 6e 67 20 2a 70 53 74 72 3b 0a  onString *pStr;.
d0c0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 61    UNUSED_PARAM(a
d0d0: 72 67 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  rgc);.  UNUSED_P
d0e0: 41 52 41 4d 28 61 72 67 76 29 3b 0a 20 20 70 53  ARAM(argv);.  pS
d0f0: 74 72 20 3d 20 28 4a 73 6f 6e 53 74 72 69 6e 67  tr = (JsonString
d100: 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  *)sqlite3_aggreg
d110: 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 74 78 2c  ate_context(ctx,
d120: 20 30 29 3b 0a 23 69 66 64 65 66 20 4e 45 56 45   0);.#ifdef NEVE
d130: 52 0a 20 20 2f 2a 20 70 53 74 72 20 69 73 20 61  R.  /* pStr is a
d140: 6c 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 73  lways non-NULL s
d150: 69 6e 63 65 20 6a 73 6f 6e 41 72 72 61 79 53 74  ince jsonArraySt
d160: 65 70 28 29 20 6f 72 20 6a 73 6f 6e 4f 62 6a 65  ep() or jsonObje
d170: 63 74 53 74 65 70 28 29 20 77 69 6c 6c 0a 20 20  ctStep() will.  
d180: 2a 2a 20 61 6c 77 61 79 73 20 68 61 76 65 20 62  ** always have b
d190: 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e  een called to in
d1a0: 69 74 61 6c 69 7a 65 20 69 74 20 2a 2f 0a 20 20  italize it */.  
d1b0: 69 66 28 20 4e 45 56 45 52 28 21 70 53 74 72 29  if( NEVER(!pStr)
d1c0: 20 29 20 72 65 74 75 72 6e 3b 0a 23 65 6e 64 69   ) return;.#endi
d1d0: 66 0a 20 20 7a 20 3d 20 70 53 74 72 2d 3e 7a 42  f.  z = pStr->zB
d1e0: 75 66 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 28  uf;.  for(i=1; (
d1f0: 63 20 3d 20 7a 5b 69 5d 29 21 3d 27 2c 27 20 7c  c = z[i])!=',' |
d200: 7c 20 69 6e 53 74 72 20 7c 7c 20 6e 4e 65 73 74  | inStr || nNest
d210: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
d220: 69 3e 3d 70 53 74 72 2d 3e 6e 55 73 65 64 20 29  i>=pStr->nUsed )
d230: 7b 0a 20 20 20 20 20 20 70 53 74 72 2d 3e 6e 55  {.      pStr->nU
d240: 73 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 72  sed = 1;.      r
d250: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
d260: 20 69 66 28 20 63 3d 3d 27 22 27 20 29 7b 0a 20   if( c=='"' ){. 
d270: 20 20 20 20 20 69 6e 53 74 72 20 3d 20 21 69 6e       inStr = !in
d280: 53 74 72 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  Str;.    }else i
d290: 66 28 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20  f( c=='\\' ){.  
d2a0: 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 7d 65 6c      i++;.    }el
d2b0: 73 65 20 69 66 28 20 21 69 6e 53 74 72 20 29 7b  se if( !inStr ){
d2c0: 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 7b  .      if( c=='{
d2d0: 27 20 7c 7c 20 63 3d 3d 27 5b 27 20 29 20 6e 4e  ' || c=='[' ) nN
d2e0: 65 73 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  est++;.      if(
d2f0: 20 63 3d 3d 27 7d 27 20 7c 7c 20 63 3d 3d 27 5d   c=='}' || c==']
d300: 27 20 29 20 6e 4e 65 73 74 2d 2d 3b 0a 20 20 20  ' ) nNest--;.   
d310: 20 7d 0a 20 20 7d 0a 20 20 70 53 74 72 2d 3e 6e   }.  }.  pStr->n
d320: 55 73 65 64 20 2d 3d 20 69 3b 20 20 20 20 20 20  Used -= i;      
d330: 0a 20 20 6d 65 6d 6d 6f 76 65 28 26 7a 5b 31 5d  .  memmove(&z[1]
d340: 2c 20 26 7a 5b 69 2b 31 5d 2c 20 28 73 69 7a 65  , &z[i+1], (size
d350: 5f 74 29 70 53 74 72 2d 3e 6e 55 73 65 64 2d 31  _t)pStr->nUsed-1
d360: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
d370: 69 6e 65 20 6a 73 6f 6e 47 72 6f 75 70 49 6e 76  ine jsonGroupInv
d380: 65 72 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 0a  erse 0.#endif...
d390: 2f 2a 0a 2a 2a 20 6a 73 6f 6e 5f 67 72 6f 75 70  /*.** json_group
d3a0: 5f 6f 62 6a 28 4e 41 4d 45 2c 56 41 4c 55 45 29  _obj(NAME,VALUE)
d3b0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  .**.** Return a 
d3c0: 4a 53 4f 4e 20 6f 62 6a 65 63 74 20 63 6f 6d 70  JSON object comp
d3d0: 6f 73 65 64 20 6f 66 20 61 6c 6c 20 6e 61 6d 65  osed of all name
d3e0: 73 20 61 6e 64 20 76 61 6c 75 65 73 20 69 6e 20  s and values in 
d3f0: 74 68 65 20 61 67 67 72 65 67 61 74 65 2e 0a 2a  the aggregate..*
d400: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73  /.static void js
d410: 6f 6e 4f 62 6a 65 63 74 53 74 65 70 28 0a 20 20  onObjectStep(.  
d420: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
d430: 2a 63 74 78 2c 0a 20 20 69 6e 74 20 61 72 67 63  *ctx,.  int argc
d440: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
d450: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 4a 73  e **argv.){.  Js
d460: 6f 6e 53 74 72 69 6e 67 20 2a 70 53 74 72 3b 0a  onString *pStr;.
d470: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
d480: 0a 20 20 75 33 32 20 6e 3b 0a 20 20 55 4e 55 53  .  u32 n;.  UNUS
d490: 45 44 5f 50 41 52 41 4d 28 61 72 67 63 29 3b 0a  ED_PARAM(argc);.
d4a0: 20 20 70 53 74 72 20 3d 20 28 4a 73 6f 6e 53 74    pStr = (JsonSt
d4b0: 72 69 6e 67 2a 29 73 71 6c 69 74 65 33 5f 61 67  ring*)sqlite3_ag
d4c0: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
d4d0: 63 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 53 74  ctx, sizeof(*pSt
d4e0: 72 29 29 3b 0a 20 20 69 66 28 20 70 53 74 72 20  r));.  if( pStr 
d4f0: 29 7b 0a 20 20 20 20 69 66 28 20 70 53 74 72 2d  ){.    if( pStr-
d500: 3e 7a 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >zBuf==0 ){.    
d510: 20 20 6a 73 6f 6e 49 6e 69 74 28 70 53 74 72 2c    jsonInit(pStr,
d520: 20 63 74 78 29 3b 0a 20 20 20 20 20 20 6a 73 6f   ctx);.      jso
d530: 6e 41 70 70 65 6e 64 43 68 61 72 28 70 53 74 72  nAppendChar(pStr
d540: 2c 20 27 7b 27 29 3b 0a 20 20 20 20 7d 65 6c 73  , '{');.    }els
d550: 65 20 69 66 28 20 70 53 74 72 2d 3e 6e 55 73 65  e if( pStr->nUse
d560: 64 3e 31 20 29 7b 0a 20 20 20 20 20 20 6a 73 6f  d>1 ){.      jso
d570: 6e 41 70 70 65 6e 64 43 68 61 72 28 70 53 74 72  nAppendChar(pStr
d580: 2c 20 27 2c 27 29 3b 0a 20 20 20 20 20 20 70 53  , ',');.      pS
d590: 74 72 2d 3e 70 43 74 78 20 3d 20 63 74 78 3b 0a  tr->pCtx = ctx;.
d5a0: 20 20 20 20 7d 0a 20 20 20 20 7a 20 3d 20 28 63      }.    z = (c
d5b0: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
d5c0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
d5d0: 67 76 5b 30 5d 29 3b 0a 20 20 20 20 6e 20 3d 20  gv[0]);.    n = 
d5e0: 28 75 33 32 29 73 71 6c 69 74 65 33 5f 76 61 6c  (u32)sqlite3_val
d5f0: 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d  ue_bytes(argv[0]
d600: 29 3b 0a 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e  );.    jsonAppen
d610: 64 53 74 72 69 6e 67 28 70 53 74 72 2c 20 7a 2c  dString(pStr, z,
d620: 20 6e 29 3b 0a 20 20 20 20 6a 73 6f 6e 41 70 70   n);.    jsonApp
d630: 65 6e 64 43 68 61 72 28 70 53 74 72 2c 20 27 3a  endChar(pStr, ':
d640: 27 29 3b 0a 20 20 20 20 6a 73 6f 6e 41 70 70 65  ');.    jsonAppe
d650: 6e 64 56 61 6c 75 65 28 70 53 74 72 2c 20 61 72  ndValue(pStr, ar
d660: 67 76 5b 31 5d 29 3b 0a 20 20 7d 0a 7d 0a 73 74  gv[1]);.  }.}.st
d670: 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 4f 62  atic void jsonOb
d680: 6a 65 63 74 43 6f 6d 70 75 74 65 28 73 71 6c 69  jectCompute(sqli
d690: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78  te3_context *ctx
d6a0: 2c 20 69 6e 74 20 69 73 46 69 6e 61 6c 29 7b 0a  , int isFinal){.
d6b0: 20 20 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70 53    JsonString *pS
d6c0: 74 72 3b 0a 20 20 70 53 74 72 20 3d 20 28 4a 73  tr;.  pStr = (Js
d6d0: 6f 6e 53 74 72 69 6e 67 2a 29 73 71 6c 69 74 65  onString*)sqlite
d6e0: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
d6f0: 65 78 74 28 63 74 78 2c 20 30 29 3b 0a 20 20 69  ext(ctx, 0);.  i
d700: 66 28 20 70 53 74 72 20 29 7b 0a 20 20 20 20 6a  f( pStr ){.    j
d710: 73 6f 6e 41 70 70 65 6e 64 43 68 61 72 28 70 53  sonAppendChar(pS
d720: 74 72 2c 20 27 7d 27 29 3b 0a 20 20 20 20 69 66  tr, '}');.    if
d730: 28 20 70 53 74 72 2d 3e 62 45 72 72 20 29 7b 0a  ( pStr->bErr ){.
d740: 20 20 20 20 20 20 69 66 28 20 70 53 74 72 2d 3e        if( pStr->
d750: 62 45 72 72 3d 3d 31 20 29 20 73 71 6c 69 74 65  bErr==1 ) sqlite
d760: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e  3_result_error_n
d770: 6f 6d 65 6d 28 63 74 78 29 3b 0a 20 20 20 20 20  omem(ctx);.     
d780: 20 61 73 73 65 72 74 28 20 70 53 74 72 2d 3e 62   assert( pStr->b
d790: 53 74 61 74 69 63 20 29 3b 0a 20 20 20 20 7d 65  Static );.    }e
d7a0: 6c 73 65 20 69 66 28 20 69 73 46 69 6e 61 6c 20  lse if( isFinal 
d7b0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
d7c0: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 74 78  _result_text(ctx
d7d0: 2c 20 70 53 74 72 2d 3e 7a 42 75 66 2c 20 28 69  , pStr->zBuf, (i
d7e0: 6e 74 29 70 53 74 72 2d 3e 6e 55 73 65 64 2c 0a  nt)pStr->nUsed,.
d7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d800: 20 20 20 20 20 20 20 20 20 20 70 53 74 72 2d 3e            pStr->
d810: 62 53 74 61 74 69 63 20 3f 20 53 51 4c 49 54 45  bStatic ? SQLITE
d820: 5f 54 52 41 4e 53 49 45 4e 54 20 3a 20 73 71 6c  _TRANSIENT : sql
d830: 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 20 20  ite3_free);.    
d840: 20 20 70 53 74 72 2d 3e 62 53 74 61 74 69 63 20    pStr->bStatic 
d850: 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
d860: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
d870: 73 75 6c 74 5f 74 65 78 74 28 63 74 78 2c 20 70  sult_text(ctx, p
d880: 53 74 72 2d 3e 7a 42 75 66 2c 20 28 69 6e 74 29  Str->zBuf, (int)
d890: 70 53 74 72 2d 3e 6e 55 73 65 64 2c 20 53 51 4c  pStr->nUsed, SQL
d8a0: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
d8b0: 20 20 20 20 20 20 70 53 74 72 2d 3e 6e 55 73 65        pStr->nUse
d8c0: 64 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  d--;.    }.  }el
d8d0: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
d8e0: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 74 78 2c  result_text(ctx,
d8f0: 20 22 7b 7d 22 2c 20 32 2c 20 53 51 4c 49 54 45   "{}", 2, SQLITE
d900: 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 20 20  _STATIC);.  }.  
d910: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 73  sqlite3_result_s
d920: 75 62 74 79 70 65 28 63 74 78 2c 20 4a 53 4f 4e  ubtype(ctx, JSON
d930: 5f 53 55 42 54 59 50 45 29 3b 0a 7d 0a 73 74 61  _SUBTYPE);.}.sta
d940: 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 4f 62 6a  tic void jsonObj
d950: 65 63 74 56 61 6c 75 65 28 73 71 6c 69 74 65 33  ectValue(sqlite3
d960: 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 29 7b 0a  _context *ctx){.
d970: 20 20 6a 73 6f 6e 4f 62 6a 65 63 74 43 6f 6d 70    jsonObjectComp
d980: 75 74 65 28 63 74 78 2c 20 30 29 3b 0a 7d 0a 73  ute(ctx, 0);.}.s
d990: 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 4f  tatic void jsonO
d9a0: 62 6a 65 63 74 46 69 6e 61 6c 28 73 71 6c 69 74  bjectFinal(sqlit
d9b0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 29  e3_context *ctx)
d9c0: 7b 0a 20 20 6a 73 6f 6e 4f 62 6a 65 63 74 43 6f  {.  jsonObjectCo
d9d0: 6d 70 75 74 65 28 63 74 78 2c 20 31 29 3b 0a 7d  mpute(ctx, 1);.}
d9e0: 0a 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ....#ifndef SQLI
d9f0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
da00: 41 42 4c 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ABLE./**********
da10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
da20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
da30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
da40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
da50: 2a 2a 0a 2a 2a 20 54 68 65 20 6a 73 6f 6e 5f 65  **.** The json_e
da60: 61 63 68 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ach virtual tabl
da70: 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e.**************
da80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
da90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
daa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
dac0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 4a  typedef struct J
dad0: 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 20 4a 73  sonEachCursor Js
dae0: 6f 6e 45 61 63 68 43 75 72 73 6f 72 3b 0a 73 74  onEachCursor;.st
daf0: 72 75 63 74 20 4a 73 6f 6e 45 61 63 68 43 75 72  ruct JsonEachCur
db00: 73 6f 72 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  sor {.  sqlite3_
db10: 76 74 61 62 5f 63 75 72 73 6f 72 20 62 61 73 65  vtab_cursor base
db20: 3b 20 20 2f 2a 20 42 61 73 65 20 63 6c 61 73 73  ;  /* Base class
db30: 20 2d 20 6d 75 73 74 20 62 65 20 66 69 72 73 74   - must be first
db40: 20 2a 2f 0a 20 20 75 33 32 20 69 52 6f 77 69 64   */.  u32 iRowid
db50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
db60: 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20 2a 2f   /* The rowid */
db70: 0a 20 20 75 33 32 20 69 42 65 67 69 6e 3b 20 20  .  u32 iBegin;  
db80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
db90: 20 54 68 65 20 66 69 72 73 74 20 6e 6f 64 65 20   The first node 
dba0: 6f 66 20 74 68 65 20 73 63 61 6e 20 2a 2f 0a 20  of the scan */. 
dbb0: 20 75 33 32 20 69 3b 20 20 20 20 20 20 20 20 20   u32 i;         
dbc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
dbd0: 6e 64 65 78 20 69 6e 20 73 50 61 72 73 65 2e 61  ndex in sParse.a
dbe0: 4e 6f 64 65 5b 5d 20 6f 66 20 63 75 72 72 65 6e  Node[] of curren
dbf0: 74 20 72 6f 77 20 2a 2f 0a 20 20 75 33 32 20 69  t row */.  u32 i
dc00: 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  End;            
dc10: 20 20 20 20 20 20 2f 2a 20 45 4f 46 20 77 68 65        /* EOF whe
dc20: 6e 20 69 20 65 71 75 61 6c 73 20 6f 72 20 65 78  n i equals or ex
dc30: 63 65 65 64 73 20 74 68 69 73 20 76 61 6c 75 65  ceeds this value
dc40: 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 3b 20   */.  u8 eType; 
dc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc60: 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 6f 70 2d   /* Type of top-
dc70: 6c 65 76 65 6c 20 65 6c 65 6d 65 6e 74 20 2a 2f  level element */
dc80: 0a 20 20 75 38 20 62 52 65 63 75 72 73 69 76 65  .  u8 bRecursive
dc90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
dca0: 20 54 72 75 65 20 66 6f 72 20 6a 73 6f 6e 5f 74   True for json_t
dcb0: 72 65 65 28 29 2e 20 20 46 61 6c 73 65 20 66 6f  ree().  False fo
dcc0: 72 20 6a 73 6f 6e 5f 65 61 63 68 28 29 20 2a 2f  r json_each() */
dcd0: 0a 20 20 63 68 61 72 20 2a 7a 4a 73 6f 6e 3b 20  .  char *zJson; 
dce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dcf0: 20 49 6e 70 75 74 20 4a 53 4f 4e 20 2a 2f 0a 20   Input JSON */. 
dd00: 20 63 68 61 72 20 2a 7a 52 6f 6f 74 3b 20 20 20   char *zRoot;   
dd10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
dd20: 61 74 68 20 62 79 20 77 68 69 63 68 20 74 6f 20  ath by which to 
dd30: 66 69 6c 74 65 72 20 7a 4a 73 6f 6e 20 2a 2f 0a  filter zJson */.
dd40: 20 20 4a 73 6f 6e 50 61 72 73 65 20 73 50 61 72    JsonParse sPar
dd50: 73 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se;          /* 
dd60: 50 61 72 73 65 20 6f 66 20 74 68 65 20 69 6e 70  Parse of the inp
dd70: 75 74 20 4a 53 4f 4e 20 2a 2f 0a 7d 3b 0a 0a 2f  ut JSON */.};../
dd80: 2a 20 43 6f 6e 73 74 72 75 63 74 6f 72 20 66 6f  * Constructor fo
dd90: 72 20 74 68 65 20 6a 73 6f 6e 5f 65 61 63 68 20  r the json_each 
dda0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f  virtual table */
ddb0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e  .static int json
ddc0: 45 61 63 68 43 6f 6e 6e 65 63 74 28 0a 20 20 73  EachConnect(.  s
ddd0: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f  qlite3 *db,.  vo
dde0: 69 64 20 2a 70 41 75 78 2c 0a 20 20 69 6e 74 20  id *pAux,.  int 
ddf0: 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72  argc, const char
de00: 20 2a 63 6f 6e 73 74 2a 61 72 67 76 2c 0a 20 20   *const*argv,.  
de10: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a 70  sqlite3_vtab **p
de20: 70 56 74 61 62 2c 0a 20 20 63 68 61 72 20 2a 2a  pVtab,.  char **
de30: 70 7a 45 72 72 0a 29 7b 0a 20 20 73 71 6c 69 74  pzErr.){.  sqlit
de40: 65 33 5f 76 74 61 62 20 2a 70 4e 65 77 3b 0a 20  e3_vtab *pNew;. 
de50: 20 69 6e 74 20 72 63 3b 0a 0a 2f 2a 20 43 6f 6c   int rc;../* Col
de60: 75 6d 6e 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 23  umn numbers */.#
de70: 64 65 66 69 6e 65 20 4a 45 41 43 48 5f 4b 45 59  define JEACH_KEY
de80: 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20 4a       0.#define J
de90: 45 41 43 48 5f 56 41 4c 55 45 20 20 20 31 0a 23  EACH_VALUE   1.#
dea0: 64 65 66 69 6e 65 20 4a 45 41 43 48 5f 54 59 50  define JEACH_TYP
deb0: 45 20 20 20 20 32 0a 23 64 65 66 69 6e 65 20 4a  E    2.#define J
dec0: 45 41 43 48 5f 41 54 4f 4d 20 20 20 20 33 0a 23  EACH_ATOM    3.#
ded0: 64 65 66 69 6e 65 20 4a 45 41 43 48 5f 49 44 20  define JEACH_ID 
dee0: 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65 20 4a       4.#define J
def0: 45 41 43 48 5f 50 41 52 45 4e 54 20 20 35 0a 23  EACH_PARENT  5.#
df00: 64 65 66 69 6e 65 20 4a 45 41 43 48 5f 46 55 4c  define JEACH_FUL
df10: 4c 4b 45 59 20 36 0a 23 64 65 66 69 6e 65 20 4a  LKEY 6.#define J
df20: 45 41 43 48 5f 50 41 54 48 20 20 20 20 37 0a 2f  EACH_PATH    7./
df30: 2a 20 54 68 65 20 78 42 65 73 74 49 6e 64 65 78  * The xBestIndex
df40: 20 6d 65 74 68 6f 64 20 61 73 73 75 6d 65 73 20   method assumes 
df50: 74 68 61 74 20 74 68 65 20 4a 53 4f 4e 20 61 6e  that the JSON an
df60: 64 20 52 4f 4f 54 20 63 6f 6c 75 6d 6e 73 20 61  d ROOT columns a
df70: 72 65 0a 2a 2a 20 74 68 65 20 6c 61 73 74 20 74  re.** the last t
df80: 77 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  wo columns in th
df90: 65 20 74 61 62 6c 65 2e 20 20 53 68 6f 75 6c 64  e table.  Should
dfa0: 20 74 68 69 73 20 65 76 65 72 20 63 68 61 6e 67   this ever chang
dfb0: 65 73 2c 20 62 65 0a 2a 2a 20 73 75 72 65 20 74  es, be.** sure t
dfc0: 6f 20 75 70 64 61 74 65 20 74 68 65 20 78 42 65  o update the xBe
dfd0: 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 2e 20  stIndex method. 
dfe0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 45 41 43 48  */.#define JEACH
dff0: 5f 4a 53 4f 4e 20 20 20 20 38 0a 23 64 65 66 69  _JSON    8.#defi
e000: 6e 65 20 4a 45 41 43 48 5f 52 4f 4f 54 20 20 20  ne JEACH_ROOT   
e010: 20 39 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   9..  UNUSED_PAR
e020: 41 4d 28 70 7a 45 72 72 29 3b 0a 20 20 55 4e 55  AM(pzErr);.  UNU
e030: 53 45 44 5f 50 41 52 41 4d 28 61 72 67 76 29 3b  SED_PARAM(argv);
e040: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28  .  UNUSED_PARAM(
e050: 61 72 67 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f  argc);.  UNUSED_
e060: 50 41 52 41 4d 28 70 41 75 78 29 3b 0a 20 20 72  PARAM(pAux);.  r
e070: 63 20 3d 20 73 71 6c 69 74 65 33 5f 64 65 63 6c  c = sqlite3_decl
e080: 61 72 65 5f 76 74 61 62 28 64 62 2c 20 0a 20 20  are_vtab(db, .  
e090: 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
e0a0: 20 78 28 6b 65 79 2c 76 61 6c 75 65 2c 74 79 70   x(key,value,typ
e0b0: 65 2c 61 74 6f 6d 2c 69 64 2c 70 61 72 65 6e 74  e,atom,id,parent
e0c0: 2c 66 75 6c 6c 6b 65 79 2c 70 61 74 68 2c 22 0a  ,fullkey,path,".
e0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0e0: 20 20 20 20 22 6a 73 6f 6e 20 48 49 44 44 45 4e      "json HIDDEN
e0f0: 2c 72 6f 6f 74 20 48 49 44 44 45 4e 29 22 29 3b  ,root HIDDEN)");
e100: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
e110: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 4e 65 77  E_OK ){.    pNew
e120: 20 3d 20 2a 70 70 56 74 61 62 20 3d 20 73 71 6c   = *ppVtab = sql
e130: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
e140: 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20  eof(*pNew) );.  
e150: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
e160: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
e170: 4d 45 4d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  MEM;.    memset(
e180: 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pNew, 0, sizeof(
e190: 2a 70 4e 65 77 29 29 3b 0a 20 20 7d 0a 20 20 72  *pNew));.  }.  r
e1a0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
e1b0: 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 6a  destructor for j
e1c0: 73 6f 6e 5f 65 61 63 68 20 76 69 72 74 75 61 6c  son_each virtual
e1d0: 20 74 61 62 6c 65 20 2a 2f 0a 73 74 61 74 69 63   table */.static
e1e0: 20 69 6e 74 20 6a 73 6f 6e 45 61 63 68 44 69 73   int jsonEachDis
e1f0: 63 6f 6e 6e 65 63 74 28 73 71 6c 69 74 65 33 5f  connect(sqlite3_
e200: 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20  vtab *pVtab){.  
e210: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74  sqlite3_free(pVt
e220: 61 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ab);.  return SQ
e230: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 63  LITE_OK;.}../* c
e240: 6f 6e 73 74 72 75 63 74 6f 72 20 66 6f 72 20 61  onstructor for a
e250: 20 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 20   JsonEachCursor 
e260: 6f 62 6a 65 63 74 20 66 6f 72 20 6a 73 6f 6e 5f  object for json_
e270: 65 61 63 68 28 29 2e 20 2a 2f 0a 73 74 61 74 69  each(). */.stati
e280: 63 20 69 6e 74 20 6a 73 6f 6e 45 61 63 68 4f 70  c int jsonEachOp
e290: 65 6e 45 61 63 68 28 73 71 6c 69 74 65 33 5f 76  enEach(sqlite3_v
e2a0: 74 61 62 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f  tab *p, sqlite3_
e2b0: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 2a 70 70  vtab_cursor **pp
e2c0: 43 75 72 73 6f 72 29 7b 0a 20 20 4a 73 6f 6e 45  Cursor){.  JsonE
e2d0: 61 63 68 43 75 72 73 6f 72 20 2a 70 43 75 72 3b  achCursor *pCur;
e2e0: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
e2f0: 28 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 73 71  (p);.  pCur = sq
e300: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
e310: 7a 65 6f 66 28 2a 70 43 75 72 29 20 29 3b 0a 20  zeof(*pCur) );. 
e320: 20 69 66 28 20 70 43 75 72 3d 3d 30 20 29 20 72   if( pCur==0 ) r
e330: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
e340: 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 75  EM;.  memset(pCu
e350: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43  r, 0, sizeof(*pC
e360: 75 72 29 29 3b 0a 20 20 2a 70 70 43 75 72 73 6f  ur));.  *ppCurso
e370: 72 20 3d 20 26 70 43 75 72 2d 3e 62 61 73 65 3b  r = &pCur->base;
e380: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
e390: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 63 6f 6e 73 74  _OK;.}../* const
e3a0: 72 75 63 74 6f 72 20 66 6f 72 20 61 20 4a 73 6f  ructor for a Jso
e3b0: 6e 45 61 63 68 43 75 72 73 6f 72 20 6f 62 6a 65  nEachCursor obje
e3c0: 63 74 20 66 6f 72 20 6a 73 6f 6e 5f 74 72 65 65  ct for json_tree
e3d0: 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  (). */.static in
e3e0: 74 20 6a 73 6f 6e 45 61 63 68 4f 70 65 6e 54 72  t jsonEachOpenTr
e3f0: 65 65 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20  ee(sqlite3_vtab 
e400: 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62  *p, sqlite3_vtab
e410: 5f 63 75 72 73 6f 72 20 2a 2a 70 70 43 75 72 73  _cursor **ppCurs
e420: 6f 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  or){.  int rc = 
e430: 6a 73 6f 6e 45 61 63 68 4f 70 65 6e 45 61 63 68  jsonEachOpenEach
e440: 28 70 2c 20 70 70 43 75 72 73 6f 72 29 3b 0a 20  (p, ppCursor);. 
e450: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
e460: 4f 4b 20 29 7b 0a 20 20 20 20 4a 73 6f 6e 45 61  OK ){.    JsonEa
e470: 63 68 43 75 72 73 6f 72 20 2a 70 43 75 72 20 3d  chCursor *pCur =
e480: 20 28 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72   (JsonEachCursor
e490: 2a 29 2a 70 70 43 75 72 73 6f 72 3b 0a 20 20 20  *)*ppCursor;.   
e4a0: 20 70 43 75 72 2d 3e 62 52 65 63 75 72 73 69 76   pCur->bRecursiv
e4b0: 65 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 1;.  }.  ret
e4c0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 52 65  urn rc;.}../* Re
e4d0: 73 65 74 20 61 20 4a 73 6f 6e 45 61 63 68 43 75  set a JsonEachCu
e4e0: 72 73 6f 72 20 62 61 63 6b 20 74 6f 20 69 74 73  rsor back to its
e4f0: 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 2e   original state.
e500: 20 20 46 72 65 65 20 61 6e 79 20 6d 65 6d 6f 72    Free any memor
e510: 79 0a 2a 2a 20 68 65 6c 64 2e 20 2a 2f 0a 73 74  y.** held. */.st
e520: 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 45 61  atic void jsonEa
e530: 63 68 43 75 72 73 6f 72 52 65 73 65 74 28 4a 73  chCursorReset(Js
e540: 6f 6e 45 61 63 68 43 75 72 73 6f 72 20 2a 70 29  onEachCursor *p)
e550: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  {.  sqlite3_free
e560: 28 70 2d 3e 7a 4a 73 6f 6e 29 3b 0a 20 20 73 71  (p->zJson);.  sq
e570: 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 52  lite3_free(p->zR
e580: 6f 6f 74 29 3b 0a 20 20 6a 73 6f 6e 50 61 72 73  oot);.  jsonPars
e590: 65 52 65 73 65 74 28 26 70 2d 3e 73 50 61 72 73  eReset(&p->sPars
e5a0: 65 29 3b 0a 20 20 70 2d 3e 69 52 6f 77 69 64 20  e);.  p->iRowid 
e5b0: 3d 20 30 3b 0a 20 20 70 2d 3e 69 20 3d 20 30 3b  = 0;.  p->i = 0;
e5c0: 0a 20 20 70 2d 3e 69 45 6e 64 20 3d 20 30 3b 0a  .  p->iEnd = 0;.
e5d0: 20 20 70 2d 3e 65 54 79 70 65 20 3d 20 30 3b 0a    p->eType = 0;.
e5e0: 20 20 70 2d 3e 7a 4a 73 6f 6e 20 3d 20 30 3b 0a    p->zJson = 0;.
e5f0: 20 20 70 2d 3e 7a 52 6f 6f 74 20 3d 20 30 3b 0a    p->zRoot = 0;.
e600: 7d 0a 0a 2f 2a 20 44 65 73 74 72 75 63 74 6f 72  }../* Destructor
e610: 20 66 6f 72 20 61 20 6a 73 6f 6e 45 61 63 68 43   for a jsonEachC
e620: 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  ursor object */.
e630: 73 74 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e 45  static int jsonE
e640: 61 63 68 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  achClose(sqlite3
e650: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75  _vtab_cursor *cu
e660: 72 29 7b 0a 20 20 4a 73 6f 6e 45 61 63 68 43 75  r){.  JsonEachCu
e670: 72 73 6f 72 20 2a 70 20 3d 20 28 4a 73 6f 6e 45  rsor *p = (JsonE
e680: 61 63 68 43 75 72 73 6f 72 2a 29 63 75 72 3b 0a  achCursor*)cur;.
e690: 20 20 6a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72    jsonEachCursor
e6a0: 52 65 73 65 74 28 70 29 3b 0a 20 20 73 71 6c 69  Reset(p);.  sqli
e6b0: 74 65 33 5f 66 72 65 65 28 63 75 72 29 3b 0a 20  te3_free(cur);. 
e6c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e6d0: 4b 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  K;.}../* Return 
e6e0: 54 52 55 45 20 69 66 20 74 68 65 20 6a 73 6f 6e  TRUE if the json
e6f0: 45 61 63 68 43 75 72 73 6f 72 20 6f 62 6a 65 63  EachCursor objec
e700: 74 20 68 61 73 20 62 65 65 6e 20 61 64 76 61 6e  t has been advan
e710: 63 65 64 20 6f 66 66 20 74 68 65 20 65 6e 64 0a  ced off the end.
e720: 2a 2a 20 6f 66 20 74 68 65 20 4a 53 4f 4e 20 6f  ** of the JSON o
e730: 62 6a 65 63 74 20 2a 2f 0a 73 74 61 74 69 63 20  bject */.static 
e740: 69 6e 74 20 6a 73 6f 6e 45 61 63 68 45 6f 66 28  int jsonEachEof(
e750: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
e760: 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20 4a 73 6f  sor *cur){.  Jso
e770: 6e 45 61 63 68 43 75 72 73 6f 72 20 2a 70 20 3d  nEachCursor *p =
e780: 20 28 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72   (JsonEachCursor
e790: 2a 29 63 75 72 3b 0a 20 20 72 65 74 75 72 6e 20  *)cur;.  return 
e7a0: 70 2d 3e 69 20 3e 3d 20 70 2d 3e 69 45 6e 64 3b  p->i >= p->iEnd;
e7b0: 0a 7d 0a 0a 2f 2a 20 41 64 76 61 6e 63 65 20 74  .}../* Advance t
e7c0: 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
e7d0: 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 66 6f   next element fo
e7e0: 72 20 6a 73 6f 6e 5f 74 72 65 65 28 29 20 2a 2f  r json_tree() */
e7f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e  .static int json
e800: 45 61 63 68 4e 65 78 74 28 73 71 6c 69 74 65 33  EachNext(sqlite3
e810: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75  _vtab_cursor *cu
e820: 72 29 7b 0a 20 20 4a 73 6f 6e 45 61 63 68 43 75  r){.  JsonEachCu
e830: 72 73 6f 72 20 2a 70 20 3d 20 28 4a 73 6f 6e 45  rsor *p = (JsonE
e840: 61 63 68 43 75 72 73 6f 72 2a 29 63 75 72 3b 0a  achCursor*)cur;.
e850: 20 20 69 66 28 20 70 2d 3e 62 52 65 63 75 72 73    if( p->bRecurs
e860: 69 76 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ive ){.    if( p
e870: 2d 3e 73 50 61 72 73 65 2e 61 4e 6f 64 65 5b 70  ->sParse.aNode[p
e880: 2d 3e 69 5d 2e 6a 6e 46 6c 61 67 73 20 26 20 4a  ->i].jnFlags & J
e890: 4e 4f 44 45 5f 4c 41 42 45 4c 20 29 20 70 2d 3e  NODE_LABEL ) p->
e8a0: 69 2b 2b 3b 0a 20 20 20 20 70 2d 3e 69 2b 2b 3b  i++;.    p->i++;
e8b0: 0a 20 20 20 20 70 2d 3e 69 52 6f 77 69 64 2b 2b  .    p->iRowid++
e8c0: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 3c 70  ;.    if( p->i<p
e8d0: 2d 3e 69 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  ->iEnd ){.      
e8e0: 75 33 32 20 69 55 70 20 3d 20 70 2d 3e 73 50 61  u32 iUp = p->sPa
e8f0: 72 73 65 2e 61 55 70 5b 70 2d 3e 69 5d 3b 0a 20  rse.aUp[p->i];. 
e900: 20 20 20 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70       JsonNode *p
e910: 55 70 20 3d 20 26 70 2d 3e 73 50 61 72 73 65 2e  Up = &p->sParse.
e920: 61 4e 6f 64 65 5b 69 55 70 5d 3b 0a 20 20 20 20  aNode[iUp];.    
e930: 20 20 70 2d 3e 65 54 79 70 65 20 3d 20 70 55 70    p->eType = pUp
e940: 2d 3e 65 54 79 70 65 3b 0a 20 20 20 20 20 20 69  ->eType;.      i
e950: 66 28 20 70 55 70 2d 3e 65 54 79 70 65 3d 3d 4a  f( pUp->eType==J
e960: 53 4f 4e 5f 41 52 52 41 59 20 29 7b 0a 20 20 20  SON_ARRAY ){.   
e970: 20 20 20 20 20 69 66 28 20 69 55 70 3d 3d 70 2d       if( iUp==p-
e980: 3e 69 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  >i-1 ){.        
e990: 20 20 70 55 70 2d 3e 75 2e 69 4b 65 79 20 3d 20    pUp->u.iKey = 
e9a0: 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
e9b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 55 70 2d  {.          pUp-
e9c0: 3e 75 2e 69 4b 65 79 2b 2b 3b 0a 20 20 20 20 20  >u.iKey++;.     
e9d0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
e9e0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
e9f0: 73 77 69 74 63 68 28 20 70 2d 3e 65 54 79 70 65  switch( p->eType
ea00: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4a   ){.      case J
ea10: 53 4f 4e 5f 41 52 52 41 59 3a 20 7b 0a 20 20 20  SON_ARRAY: {.   
ea20: 20 20 20 20 20 70 2d 3e 69 20 2b 3d 20 6a 73 6f       p->i += jso
ea30: 6e 4e 6f 64 65 53 69 7a 65 28 26 70 2d 3e 73 50  nNodeSize(&p->sP
ea40: 61 72 73 65 2e 61 4e 6f 64 65 5b 70 2d 3e 69 5d  arse.aNode[p->i]
ea50: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 52  );.        p->iR
ea60: 6f 77 69 64 2b 2b 3b 0a 20 20 20 20 20 20 20 20  owid++;.        
ea70: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
ea80: 20 20 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f 4f       case JSON_O
ea90: 42 4a 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 20  BJECT: {.       
eaa0: 20 70 2d 3e 69 20 2b 3d 20 31 20 2b 20 6a 73 6f   p->i += 1 + jso
eab0: 6e 4e 6f 64 65 53 69 7a 65 28 26 70 2d 3e 73 50  nNodeSize(&p->sP
eac0: 61 72 73 65 2e 61 4e 6f 64 65 5b 70 2d 3e 69 2b  arse.aNode[p->i+
ead0: 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  1]);.        p->
eae0: 69 52 6f 77 69 64 2b 2b 3b 0a 20 20 20 20 20 20  iRowid++;.      
eaf0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
eb00: 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20  .      default: 
eb10: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 20 3d  {.        p->i =
eb20: 20 70 2d 3e 69 45 6e 64 3b 0a 20 20 20 20 20 20   p->iEnd;.      
eb30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
eb40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
eb50: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
eb60: 0a 0a 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20  ../* Append the 
eb70: 6e 61 6d 65 20 6f 66 20 74 68 65 20 70 61 74 68  name of the path
eb80: 20 66 6f 72 20 65 6c 65 6d 65 6e 74 20 69 20 74   for element i t
eb90: 6f 20 70 53 74 72 0a 2a 2f 0a 73 74 61 74 69 63  o pStr.*/.static
eba0: 20 76 6f 69 64 20 6a 73 6f 6e 45 61 63 68 43 6f   void jsonEachCo
ebb0: 6d 70 75 74 65 50 61 74 68 28 0a 20 20 4a 73 6f  mputePath(.  Jso
ebc0: 6e 45 61 63 68 43 75 72 73 6f 72 20 2a 70 2c 20  nEachCursor *p, 
ebd0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
ebe0: 73 6f 72 20 2a 2f 0a 20 20 4a 73 6f 6e 53 74 72  sor */.  JsonStr
ebf0: 69 6e 67 20 2a 70 53 74 72 2c 20 20 20 20 20 20  ing *pStr,      
ec00: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70    /* Write the p
ec10: 61 74 68 20 68 65 72 65 20 2a 2f 0a 20 20 75 33  ath here */.  u3
ec20: 32 20 69 20 20 20 20 20 20 20 20 20 20 20 20 20  2 i             
ec30: 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20 74         /* Path t
ec40: 6f 20 74 68 69 73 20 65 6c 65 6d 65 6e 74 20 2a  o this element *
ec50: 2f 0a 29 7b 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20  /.){.  JsonNode 
ec60: 2a 70 4e 6f 64 65 2c 20 2a 70 55 70 3b 0a 20 20  *pNode, *pUp;.  
ec70: 75 33 32 20 69 55 70 3b 0a 20 20 69 66 28 20 69  u32 iUp;.  if( i
ec80: 3d 3d 30 20 29 7b 0a 20 20 20 20 6a 73 6f 6e 41  ==0 ){.    jsonA
ec90: 70 70 65 6e 64 43 68 61 72 28 70 53 74 72 2c 20  ppendChar(pStr, 
eca0: 27 24 27 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  '$');.    return
ecb0: 3b 0a 20 20 7d 0a 20 20 69 55 70 20 3d 20 70 2d  ;.  }.  iUp = p-
ecc0: 3e 73 50 61 72 73 65 2e 61 55 70 5b 69 5d 3b 0a  >sParse.aUp[i];.
ecd0: 20 20 6a 73 6f 6e 45 61 63 68 43 6f 6d 70 75 74    jsonEachComput
ece0: 65 50 61 74 68 28 70 2c 20 70 53 74 72 2c 20 69  ePath(p, pStr, i
ecf0: 55 70 29 3b 0a 20 20 70 4e 6f 64 65 20 3d 20 26  Up);.  pNode = &
ed00: 70 2d 3e 73 50 61 72 73 65 2e 61 4e 6f 64 65 5b  p->sParse.aNode[
ed10: 69 5d 3b 0a 20 20 70 55 70 20 3d 20 26 70 2d 3e  i];.  pUp = &p->
ed20: 73 50 61 72 73 65 2e 61 4e 6f 64 65 5b 69 55 70  sParse.aNode[iUp
ed30: 5d 3b 0a 20 20 69 66 28 20 70 55 70 2d 3e 65 54  ];.  if( pUp->eT
ed40: 79 70 65 3d 3d 4a 53 4f 4e 5f 41 52 52 41 59 20  ype==JSON_ARRAY 
ed50: 29 7b 0a 20 20 20 20 6a 73 6f 6e 50 72 69 6e 74  ){.    jsonPrint
ed60: 66 28 33 30 2c 20 70 53 74 72 2c 20 22 5b 25 64  f(30, pStr, "[%d
ed70: 5d 22 2c 20 70 55 70 2d 3e 75 2e 69 4b 65 79 29  ]", pUp->u.iKey)
ed80: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
ed90: 73 73 65 72 74 28 20 70 55 70 2d 3e 65 54 79 70  ssert( pUp->eTyp
eda0: 65 3d 3d 4a 53 4f 4e 5f 4f 42 4a 45 43 54 20 29  e==JSON_OBJECT )
edb0: 3b 0a 20 20 20 20 69 66 28 20 28 70 4e 6f 64 65  ;.    if( (pNode
edc0: 2d 3e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44  ->jnFlags & JNOD
edd0: 45 5f 4c 41 42 45 4c 29 3d 3d 30 20 29 20 70 4e  E_LABEL)==0 ) pN
ede0: 6f 64 65 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72  ode--;.    asser
edf0: 74 28 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65 3d  t( pNode->eType=
ee00: 3d 4a 53 4f 4e 5f 53 54 52 49 4e 47 20 29 3b 0a  =JSON_STRING );.
ee10: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64      assert( pNod
ee20: 65 2d 3e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f  e->jnFlags & JNO
ee30: 44 45 5f 4c 41 42 45 4c 20 29 3b 0a 20 20 20 20  DE_LABEL );.    
ee40: 6a 73 6f 6e 50 72 69 6e 74 66 28 70 4e 6f 64 65  jsonPrintf(pNode
ee50: 2d 3e 6e 2b 31 2c 20 70 53 74 72 2c 20 22 2e 25  ->n+1, pStr, ".%
ee60: 2e 2a 73 22 2c 20 70 4e 6f 64 65 2d 3e 6e 2d 32  .*s", pNode->n-2
ee70: 2c 20 70 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e  , pNode->u.zJCon
ee80: 74 65 6e 74 2b 31 29 3b 0a 20 20 7d 0a 7d 0a 0a  tent+1);.  }.}..
ee90: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61  /* Return the va
eea0: 6c 75 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20  lue of a column 
eeb0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 73  */.static int js
eec0: 6f 6e 45 61 63 68 43 6f 6c 75 6d 6e 28 0a 20 20  onEachColumn(.  
eed0: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
eee0: 73 6f 72 20 2a 63 75 72 2c 20 20 20 2f 2a 20 54  sor *cur,   /* T
eef0: 68 65 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 73  he cursor */.  s
ef00: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
ef10: 63 74 78 2c 20 20 20 20 20 20 20 2f 2a 20 46 69  ctx,       /* Fi
ef20: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
ef30: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 2e  sqlite3_result_.
ef40: 2e 2e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 69 20  ..() */.  int i 
ef50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef60: 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 63        /* Which c
ef70: 6f 6c 75 6d 6e 20 74 6f 20 72 65 74 75 72 6e 20  olumn to return 
ef80: 2a 2f 0a 29 7b 0a 20 20 4a 73 6f 6e 45 61 63 68  */.){.  JsonEach
ef90: 43 75 72 73 6f 72 20 2a 70 20 3d 20 28 4a 73 6f  Cursor *p = (Jso
efa0: 6e 45 61 63 68 43 75 72 73 6f 72 2a 29 63 75 72  nEachCursor*)cur
efb0: 3b 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 54  ;.  JsonNode *pT
efc0: 68 69 73 20 3d 20 26 70 2d 3e 73 50 61 72 73 65  his = &p->sParse
efd0: 2e 61 4e 6f 64 65 5b 70 2d 3e 69 5d 3b 0a 20 20  .aNode[p->i];.  
efe0: 73 77 69 74 63 68 28 20 69 20 29 7b 0a 20 20 20  switch( i ){.   
eff0: 20 63 61 73 65 20 4a 45 41 43 48 5f 4b 45 59 3a   case JEACH_KEY:
f000: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   {.      if( p->
f010: 69 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  i==0 ) break;.  
f020: 20 20 20 20 69 66 28 20 70 2d 3e 65 54 79 70 65      if( p->eType
f030: 3d 3d 4a 53 4f 4e 5f 4f 42 4a 45 43 54 20 29 7b  ==JSON_OBJECT ){
f040: 0a 20 20 20 20 20 20 20 20 6a 73 6f 6e 52 65 74  .        jsonRet
f050: 75 72 6e 28 70 54 68 69 73 2c 20 63 74 78 2c 20  urn(pThis, ctx, 
f060: 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  0);.      }else 
f070: 69 66 28 20 70 2d 3e 65 54 79 70 65 3d 3d 4a 53  if( p->eType==JS
f080: 4f 4e 5f 41 52 52 41 59 20 29 7b 0a 20 20 20 20  ON_ARRAY ){.    
f090: 20 20 20 20 75 33 32 20 69 4b 65 79 3b 0a 20 20      u32 iKey;.  
f0a0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 62 52 65        if( p->bRe
f0b0: 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20  cursive ){.     
f0c0: 20 20 20 20 20 69 66 28 20 70 2d 3e 69 52 6f 77       if( p->iRow
f0d0: 69 64 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  id==0 ) break;. 
f0e0: 20 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20           iKey = 
f0f0: 70 2d 3e 73 50 61 72 73 65 2e 61 4e 6f 64 65 5b  p->sParse.aNode[
f100: 70 2d 3e 73 50 61 72 73 65 2e 61 55 70 5b 70 2d  p->sParse.aUp[p-
f110: 3e 69 5d 5d 2e 75 2e 69 4b 65 79 3b 0a 20 20 20  >i]].u.iKey;.   
f120: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f130: 20 20 20 20 20 20 69 4b 65 79 20 3d 20 70 2d 3e        iKey = p->
f140: 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20  iRowid;.        
f150: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
f160: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63  3_result_int64(c
f170: 74 78 2c 20 28 73 71 6c 69 74 65 33 5f 69 6e 74  tx, (sqlite3_int
f180: 36 34 29 69 4b 65 79 29 3b 0a 20 20 20 20 20 20  64)iKey);.      
f190: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
f1a0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 45     }.    case JE
f1b0: 41 43 48 5f 56 41 4c 55 45 3a 20 7b 0a 20 20 20  ACH_VALUE: {.   
f1c0: 20 20 20 69 66 28 20 70 54 68 69 73 2d 3e 6a 6e     if( pThis->jn
f1d0: 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 4c 41  Flags & JNODE_LA
f1e0: 42 45 4c 20 29 20 70 54 68 69 73 2b 2b 3b 0a 20  BEL ) pThis++;. 
f1f0: 20 20 20 20 20 6a 73 6f 6e 52 65 74 75 72 6e 28       jsonReturn(
f200: 70 54 68 69 73 2c 20 63 74 78 2c 20 30 29 3b 0a  pThis, ctx, 0);.
f210: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f220: 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 45 41 43   }.    case JEAC
f230: 48 5f 54 59 50 45 3a 20 7b 0a 20 20 20 20 20 20  H_TYPE: {.      
f240: 69 66 28 20 70 54 68 69 73 2d 3e 6a 6e 46 6c 61  if( pThis->jnFla
f250: 67 73 20 26 20 4a 4e 4f 44 45 5f 4c 41 42 45 4c  gs & JNODE_LABEL
f260: 20 29 20 70 54 68 69 73 2b 2b 3b 0a 20 20 20 20   ) pThis++;.    
f270: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
f280: 5f 74 65 78 74 28 63 74 78 2c 20 6a 73 6f 6e 54  _text(ctx, jsonT
f290: 79 70 65 5b 70 54 68 69 73 2d 3e 65 54 79 70 65  ype[pThis->eType
f2a0: 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54  ], -1, SQLITE_ST
f2b0: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65  ATIC);.      bre
f2c0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
f2d0: 73 65 20 4a 45 41 43 48 5f 41 54 4f 4d 3a 20 7b  se JEACH_ATOM: {
f2e0: 0a 20 20 20 20 20 20 69 66 28 20 70 54 68 69 73  .      if( pThis
f2f0: 2d 3e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44  ->jnFlags & JNOD
f300: 45 5f 4c 41 42 45 4c 20 29 20 70 54 68 69 73 2b  E_LABEL ) pThis+
f310: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 68  +;.      if( pTh
f320: 69 73 2d 3e 65 54 79 70 65 3e 3d 4a 53 4f 4e 5f  is->eType>=JSON_
f330: 41 52 52 41 59 20 29 20 62 72 65 61 6b 3b 0a 20  ARRAY ) break;. 
f340: 20 20 20 20 20 6a 73 6f 6e 52 65 74 75 72 6e 28       jsonReturn(
f350: 70 54 68 69 73 2c 20 63 74 78 2c 20 30 29 3b 0a  pThis, ctx, 0);.
f360: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f370: 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 45 41 43   }.    case JEAC
f380: 48 5f 49 44 3a 20 7b 0a 20 20 20 20 20 20 73 71  H_ID: {.      sq
f390: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
f3a0: 36 34 28 63 74 78 2c 20 0a 20 20 20 20 20 20 20  64(ctx, .       
f3b0: 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34    (sqlite3_int64
f3c0: 29 70 2d 3e 69 20 2b 20 28 28 70 54 68 69 73 2d  )p->i + ((pThis-
f3d0: 3e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45  >jnFlags & JNODE
f3e0: 5f 4c 41 42 45 4c 29 21 3d 30 29 29 3b 0a 20 20  _LABEL)!=0));.  
f3f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f400: 0a 20 20 20 20 63 61 73 65 20 4a 45 41 43 48 5f  .    case JEACH_
f410: 50 41 52 45 4e 54 3a 20 7b 0a 20 20 20 20 20 20  PARENT: {.      
f420: 69 66 28 20 70 2d 3e 69 3e 70 2d 3e 69 42 65 67  if( p->i>p->iBeg
f430: 69 6e 20 26 26 20 70 2d 3e 62 52 65 63 75 72 73  in && p->bRecurs
f440: 69 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ive ){.        s
f450: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
f460: 74 36 34 28 63 74 78 2c 20 28 73 71 6c 69 74 65  t64(ctx, (sqlite
f470: 33 5f 69 6e 74 36 34 29 70 2d 3e 73 50 61 72 73  3_int64)p->sPars
f480: 65 2e 61 55 70 5b 70 2d 3e 69 5d 29 3b 0a 20 20  e.aUp[p->i]);.  
f490: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
f4a0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
f4b0: 65 20 4a 45 41 43 48 5f 46 55 4c 4c 4b 45 59 3a  e JEACH_FULLKEY:
f4c0: 20 7b 0a 20 20 20 20 20 20 4a 73 6f 6e 53 74 72   {.      JsonStr
f4d0: 69 6e 67 20 78 3b 0a 20 20 20 20 20 20 6a 73 6f  ing x;.      jso
f4e0: 6e 49 6e 69 74 28 26 78 2c 20 63 74 78 29 3b 0a  nInit(&x, ctx);.
f4f0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 62 52 65        if( p->bRe
f500: 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20  cursive ){.     
f510: 20 20 20 6a 73 6f 6e 45 61 63 68 43 6f 6d 70 75     jsonEachCompu
f520: 74 65 50 61 74 68 28 70 2c 20 26 78 2c 20 70 2d  tePath(p, &x, p-
f530: 3e 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  >i);.      }else
f540: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
f550: 3e 7a 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20  >zRoot ){.      
f560: 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 52 61      jsonAppendRa
f570: 77 28 26 78 2c 20 70 2d 3e 7a 52 6f 6f 74 2c 20  w(&x, p->zRoot, 
f580: 28 69 6e 74 29 73 74 72 6c 65 6e 28 70 2d 3e 7a  (int)strlen(p->z
f590: 52 6f 6f 74 29 29 3b 0a 20 20 20 20 20 20 20 20  Root));.        
f5a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
f5b0: 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61 72 28   jsonAppendChar(
f5c0: 26 78 2c 20 27 24 27 29 3b 0a 20 20 20 20 20 20  &x, '$');.      
f5d0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
f5e0: 70 2d 3e 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f 41  p->eType==JSON_A
f5f0: 52 52 41 59 20 29 7b 0a 20 20 20 20 20 20 20 20  RRAY ){.        
f600: 20 20 6a 73 6f 6e 50 72 69 6e 74 66 28 33 30 2c    jsonPrintf(30,
f610: 20 26 78 2c 20 22 5b 25 64 5d 22 2c 20 70 2d 3e   &x, "[%d]", p->
f620: 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  iRowid);.       
f630: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 54   }else if( p->eT
f640: 79 70 65 3d 3d 4a 53 4f 4e 5f 4f 42 4a 45 43 54  ype==JSON_OBJECT
f650: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6a 73   ){.          js
f660: 6f 6e 50 72 69 6e 74 66 28 70 54 68 69 73 2d 3e  onPrintf(pThis->
f670: 6e 2c 20 26 78 2c 20 22 2e 25 2e 2a 73 22 2c 20  n, &x, ".%.*s", 
f680: 70 54 68 69 73 2d 3e 6e 2d 32 2c 20 70 54 68 69  pThis->n-2, pThi
f690: 73 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 2b 31  s->u.zJContent+1
f6a0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
f6b0: 20 20 20 7d 0a 20 20 20 20 20 20 6a 73 6f 6e 52     }.      jsonR
f6c0: 65 73 75 6c 74 28 26 78 29 3b 0a 20 20 20 20 20  esult(&x);.     
f6d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
f6e0: 20 20 63 61 73 65 20 4a 45 41 43 48 5f 50 41 54    case JEACH_PAT
f6f0: 48 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  H: {.      if( p
f700: 2d 3e 62 52 65 63 75 72 73 69 76 65 20 29 7b 0a  ->bRecursive ){.
f710: 20 20 20 20 20 20 20 20 4a 73 6f 6e 53 74 72 69          JsonStri
f720: 6e 67 20 78 3b 0a 20 20 20 20 20 20 20 20 6a 73  ng x;.        js
f730: 6f 6e 49 6e 69 74 28 26 78 2c 20 63 74 78 29 3b  onInit(&x, ctx);
f740: 0a 20 20 20 20 20 20 20 20 6a 73 6f 6e 45 61 63  .        jsonEac
f750: 68 43 6f 6d 70 75 74 65 50 61 74 68 28 70 2c 20  hComputePath(p, 
f760: 26 78 2c 20 70 2d 3e 73 50 61 72 73 65 2e 61 55  &x, p->sParse.aU
f770: 70 5b 70 2d 3e 69 5d 29 3b 0a 20 20 20 20 20 20  p[p->i]);.      
f780: 20 20 6a 73 6f 6e 52 65 73 75 6c 74 28 26 78 29    jsonResult(&x)
f790: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
f7a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
f7b0: 2a 20 46 6f 72 20 6a 73 6f 6e 5f 65 61 63 68 28  * For json_each(
f7c0: 29 20 70 61 74 68 20 61 6e 64 20 72 6f 6f 74 20  ) path and root 
f7d0: 61 72 65 20 74 68 65 20 73 61 6d 65 20 73 6f 20  are the same so 
f7e0: 66 61 6c 6c 20 74 68 72 6f 75 67 68 0a 20 20 20  fall through.   
f7f0: 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 72     ** into the r
f800: 6f 6f 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  oot case */.    
f810: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
f820: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
f830: 72 20 2a 7a 52 6f 6f 74 20 3d 20 70 2d 3e 7a 52  r *zRoot = p->zR
f840: 6f 6f 74 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  oot;.      if( z
f850: 52 6f 6f 74 3d 3d 30 20 29 20 7a 52 6f 6f 74 20  Root==0 ) zRoot 
f860: 3d 20 22 24 22 3b 0a 20 20 20 20 20 20 73 71 6c  = "$";.      sql
f870: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
f880: 28 63 74 78 2c 20 7a 52 6f 6f 74 2c 20 2d 31 2c  (ctx, zRoot, -1,
f890: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
f8a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f8b0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 45 41    }.    case JEA
f8c0: 43 48 5f 4a 53 4f 4e 3a 20 7b 0a 20 20 20 20 20  CH_JSON: {.     
f8d0: 20 61 73 73 65 72 74 28 20 69 3d 3d 4a 45 41 43   assert( i==JEAC
f8e0: 48 5f 4a 53 4f 4e 20 29 3b 0a 20 20 20 20 20 20  H_JSON );.      
f8f0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
f900: 65 78 74 28 63 74 78 2c 20 70 2d 3e 73 50 61 72  ext(ctx, p->sPar
f910: 73 65 2e 7a 4a 73 6f 6e 2c 20 2d 31 2c 20 53 51  se.zJson, -1, SQ
f920: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
f930: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f940: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
f950: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 52  LITE_OK;.}../* R
f960: 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
f970: 74 20 72 6f 77 69 64 20 76 61 6c 75 65 20 2a 2f  t rowid value */
f980: 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e  .static int json
f990: 45 61 63 68 52 6f 77 69 64 28 73 71 6c 69 74 65  EachRowid(sqlite
f9a0: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63  3_vtab_cursor *c
f9b0: 75 72 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34  ur, sqlite_int64
f9c0: 20 2a 70 52 6f 77 69 64 29 7b 0a 20 20 4a 73 6f   *pRowid){.  Jso
f9d0: 6e 45 61 63 68 43 75 72 73 6f 72 20 2a 70 20 3d  nEachCursor *p =
f9e0: 20 28 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72   (JsonEachCursor
f9f0: 2a 29 63 75 72 3b 0a 20 20 2a 70 52 6f 77 69 64  *)cur;.  *pRowid
fa00: 20 3d 20 70 2d 3e 69 52 6f 77 69 64 3b 0a 20 20   = p->iRowid;.  
fa10: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
fa20: 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 71 75 65 72  ;.}../* The quer
fa30: 79 20 73 74 72 61 74 65 67 79 20 69 73 20 74 6f  y strategy is to
fa40: 20 6c 6f 6f 6b 20 66 6f 72 20 61 6e 20 65 71 75   look for an equ
fa50: 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
fa60: 20 6f 6e 20 74 68 65 20 6a 73 6f 6e 0a 2a 2a 20   on the json.** 
fa70: 63 6f 6c 75 6d 6e 2e 20 20 57 69 74 68 6f 75 74  column.  Without
fa80: 20 73 75 63 68 20 61 20 63 6f 6e 73 74 72 61 69   such a constrai
fa90: 6e 74 2c 20 74 68 65 20 74 61 62 6c 65 20 63 61  nt, the table ca
faa0: 6e 6e 6f 74 20 6f 70 65 72 61 74 65 2e 20 20 69  nnot operate.  i
fab0: 64 78 4e 75 6d 20 69 73 0a 2a 2a 20 31 20 69 66  dxNum is.** 1 if
fac0: 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
fad0: 69 73 20 66 6f 75 6e 64 2c 20 33 20 69 66 20 74  is found, 3 if t
fae0: 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e  he constraint an
faf0: 64 20 7a 52 6f 6f 74 20 61 72 65 20 66 6f 75 6e  d zRoot are foun
fb00: 64 2c 0a 2a 2a 20 61 6e 64 20 30 20 6f 74 68 65  d,.** and 0 othe
fb10: 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
fb20: 20 69 6e 74 20 6a 73 6f 6e 45 61 63 68 42 65 73   int jsonEachBes
fb30: 74 49 6e 64 65 78 28 0a 20 20 73 71 6c 69 74 65  tIndex(.  sqlite
fb40: 33 5f 76 74 61 62 20 2a 74 61 62 2c 0a 20 20 73  3_vtab *tab,.  s
fb50: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
fb60: 6f 20 2a 70 49 64 78 49 6e 66 6f 0a 29 7b 0a 20  o *pIdxInfo.){. 
fb70: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
fb80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
fb90: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 6f 72 20 63  oop counter or c
fba0: 6f 6d 70 75 74 65 64 20 61 72 72 61 79 20 69 6e  omputed array in
fbb0: 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 61 49 64  dex */.  int aId
fbc0: 78 5b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20  x[2];           
fbd0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
fbe0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20  constraints for 
fbf0: 4a 53 4f 4e 20 61 6e 64 20 52 4f 4f 54 20 2a 2f  JSON and ROOT */
fc00: 0a 20 20 69 6e 74 20 75 6e 75 73 61 62 6c 65 4d  .  int unusableM
fc10: 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  ask = 0;      /*
fc20: 20 4d 61 73 6b 20 6f 66 20 75 6e 75 73 61 62 6c   Mask of unusabl
fc30: 65 20 4a 53 4f 4e 20 61 6e 64 20 52 4f 4f 54 20  e JSON and ROOT 
fc40: 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
fc50: 20 69 6e 74 20 69 64 78 4d 61 73 6b 20 3d 20 30   int idxMask = 0
fc60: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  ;           /* M
fc70: 61 73 6b 20 6f 66 20 75 73 61 62 6c 65 20 3d 3d  ask of usable ==
fc80: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 4a 53 4f   constraints JSO
fc90: 4e 20 61 6e 64 20 52 4f 4f 54 20 2a 2f 0a 20 20  N and ROOT */.  
fca0: 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 71 6c  const struct sql
fcb0: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
fcc0: 72 61 69 6e 74 20 2a 70 43 6f 6e 73 74 72 61 69  raint *pConstrai
fcd0: 6e 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 69  nt;..  /* This i
fce0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 61 73  mplementation as
fcf0: 73 75 6d 65 73 20 74 68 61 74 20 4a 53 4f 4e 20  sumes that JSON 
fd00: 61 6e 64 20 52 4f 4f 54 20 61 72 65 20 74 68 65  and ROOT are the
fd10: 20 6c 61 73 74 20 74 77 6f 0a 20 20 2a 2a 20 63   last two.  ** c
fd20: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61  olumns in the ta
fd30: 62 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ble */.  assert(
fd40: 20 4a 45 41 43 48 5f 52 4f 4f 54 20 3d 3d 20 4a   JEACH_ROOT == J
fd50: 45 41 43 48 5f 4a 53 4f 4e 2b 31 20 29 3b 0a 20  EACH_JSON+1 );. 
fd60: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 74 61   UNUSED_PARAM(ta
fd70: 62 29 3b 0a 20 20 61 49 64 78 5b 30 5d 20 3d 20  b);.  aIdx[0] = 
fd80: 61 49 64 78 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20  aIdx[1] = -1;.  
fd90: 70 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49  pConstraint = pI
fda0: 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
fdb0: 69 6e 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  int;.  for(i=0; 
fdc0: 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  i<pIdxInfo->nCon
fdd0: 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 43  straint; i++, pC
fde0: 6f 6e 73 74 72 61 69 6e 74 2b 2b 29 7b 0a 20 20  onstraint++){.  
fdf0: 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20    int iCol;.    
fe00: 69 6e 74 20 69 4d 61 73 6b 3b 0a 20 20 20 20 69  int iMask;.    i
fe10: 66 28 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e  f( pConstraint->
fe20: 69 43 6f 6c 75 6d 6e 20 3c 20 4a 45 41 43 48 5f  iColumn < JEACH_
fe30: 4a 53 4f 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  JSON ) continue;
fe40: 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 43 6f 6e  .    iCol = pCon
fe50: 73 74 72 61 69 6e 74 2d 3e 69 43 6f 6c 75 6d 6e  straint->iColumn
fe60: 20 2d 20 4a 45 41 43 48 5f 4a 53 4f 4e 3b 0a 20   - JEACH_JSON;. 
fe70: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d     assert( iCol=
fe80: 3d 30 20 7c 7c 20 69 43 6f 6c 3d 3d 31 20 29 3b  =0 || iCol==1 );
fe90: 0a 20 20 20 20 69 4d 61 73 6b 20 3d 20 31 20 3c  .    iMask = 1 <
fea0: 3c 20 69 43 6f 6c 3b 0a 20 20 20 20 69 66 28 20  < iCol;.    if( 
feb0: 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 75 73 61  pConstraint->usa
fec0: 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ble==0 ){.      
fed0: 75 6e 75 73 61 62 6c 65 4d 61 73 6b 20 7c 3d 20  unusableMask |= 
fee0: 69 4d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  iMask;.    }else
fef0: 20 69 66 28 20 70 43 6f 6e 73 74 72 61 69 6e 74   if( pConstraint
ff00: 2d 3e 6f 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  ->op==SQLITE_IND
ff10: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51  EX_CONSTRAINT_EQ
ff20: 20 29 7b 0a 20 20 20 20 20 20 61 49 64 78 5b 69   ){.      aIdx[i
ff30: 43 6f 6c 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20  Col] = i;.      
ff40: 69 64 78 4d 61 73 6b 20 7c 3d 20 69 4d 61 73 6b  idxMask |= iMask
ff50: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
ff60: 28 20 28 75 6e 75 73 61 62 6c 65 4d 61 73 6b 20  ( (unusableMask 
ff70: 26 20 7e 69 64 78 4d 61 73 6b 29 21 3d 30 20 29  & ~idxMask)!=0 )
ff80: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
ff90: 65 20 61 72 65 20 61 6e 79 20 75 6e 75 73 61 62  e are any unusab
ffa0: 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  le constraints o
ffb0: 6e 20 4a 53 4f 4e 20 6f 72 20 52 4f 4f 54 2c 20  n JSON or ROOT, 
ffc0: 74 68 65 6e 20 72 65 6a 65 63 74 0a 20 20 20 20  then reject.    
ffd0: 2a 2a 20 74 68 69 73 20 65 6e 74 69 72 65 20 70  ** this entire p
ffe0: 6c 61 6e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  lan */.    retur
fff0: 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
10000 49 4e 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61  INT;.  }.  if( a
10010 49 64 78 5b 30 5d 3c 30 20 29 7b 0a 20 20 20 20  Idx[0]<0 ){.    
10020 2f 2a 20 4e 6f 20 4a 53 4f 4e 20 69 6e 70 75 74  /* No JSON input
10030 2e 20 20 4c 65 61 76 65 20 65 73 74 69 6d 61 74  .  Leave estimat
10040 65 64 43 6f 73 74 20 61 74 20 74 68 65 20 68 75  edCost at the hu
10050 67 65 20 76 61 6c 75 65 20 74 68 61 74 20 69 74  ge value that it
10060 20 77 61 73 0a 20 20 20 20 2a 2a 20 69 6e 69 74   was.    ** init
10070 69 61 6c 69 7a 65 64 20 74 6f 20 74 6f 20 64 69  ialized to to di
10080 73 63 6f 75 72 61 67 65 20 74 68 65 20 71 75 65  scourage the que
10090 72 79 20 70 6c 61 6e 6e 65 72 20 66 72 6f 6d 20  ry planner from 
100a0 73 65 6c 65 63 74 69 6e 67 20 74 68 69 73 0a 20  selecting this. 
100b0 20 20 20 2a 2a 20 70 6c 61 6e 2e 20 2a 2f 0a 20     ** plan. */. 
100c0 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78     pIdxInfo->idx
100d0 4e 75 6d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Num = 0;.  }else
100e0 7b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  {.    pIdxInfo->
100f0 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20  estimatedCost = 
10100 31 2e 30 3b 0a 20 20 20 20 69 20 3d 20 61 49 64  1.0;.    i = aId
10110 78 5b 30 5d 3b 0a 20 20 20 20 70 49 64 78 49 6e  x[0];.    pIdxIn
10120 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
10130 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65  sage[i].argvInde
10140 78 20 3d 20 31 3b 0a 20 20 20 20 70 49 64 78 49  x = 1;.    pIdxI
10150 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
10160 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 20 3d 20  Usage[i].omit = 
10170 31 3b 0a 20 20 20 20 69 66 28 20 61 49 64 78 5b  1;.    if( aIdx[
10180 31 5d 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 49  1]<0 ){.      pI
10190 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d  dxInfo->idxNum =
101a0 20 31 3b 20 20 2f 2a 20 4f 6e 6c 79 20 4a 53 4f   1;  /* Only JSO
101b0 4e 20 73 75 70 70 6c 69 65 64 2e 20 20 50 6c 61  N supplied.  Pla
101c0 6e 20 31 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  n 1 */.    }else
101d0 7b 0a 20 20 20 20 20 20 69 20 3d 20 61 49 64 78  {.      i = aIdx
101e0 5b 31 5d 3b 0a 20 20 20 20 20 20 70 49 64 78 49  [1];.      pIdxI
101f0 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
10200 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64  Usage[i].argvInd
10210 65 78 20 3d 20 32 3b 0a 20 20 20 20 20 20 70 49  ex = 2;.      pI
10220 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
10230 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74  intUsage[i].omit
10240 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 64 78   = 1;.      pIdx
10250 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 33  Info->idxNum = 3
10260 3b 20 20 2f 2a 20 42 6f 74 68 20 4a 53 4f 4e 20  ;  /* Both JSON 
10270 61 6e 64 20 52 4f 4f 54 20 61 72 65 20 73 75 70  and ROOT are sup
10280 70 6c 69 65 64 2e 20 20 50 6c 61 6e 20 33 20 2a  plied.  Plan 3 *
10290 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  /.    }.  }.  re
102a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
102b0 7d 0a 0a 2f 2a 20 53 74 61 72 74 20 61 20 73 65  }../* Start a se
102c0 61 72 63 68 20 6f 6e 20 61 20 6e 65 77 20 4a 53  arch on a new JS
102d0 4f 4e 20 73 74 72 69 6e 67 20 2a 2f 0a 73 74 61  ON string */.sta
102e0 74 69 63 20 69 6e 74 20 6a 73 6f 6e 45 61 63 68  tic int jsonEach
102f0 46 69 6c 74 65 72 28 0a 20 20 73 71 6c 69 74 65  Filter(.  sqlite
10300 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63  3_vtab_cursor *c
10310 75 72 2c 0a 20 20 69 6e 74 20 69 64 78 4e 75 6d  ur,.  int idxNum
10320 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 64  , const char *id
10330 78 53 74 72 2c 0a 20 20 69 6e 74 20 61 72 67 63  xStr,.  int argc
10340 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
10350 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e  **argv.){.  Json
10360 45 61 63 68 43 75 72 73 6f 72 20 2a 70 20 3d 20  EachCursor *p = 
10370 28 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 2a  (JsonEachCursor*
10380 29 63 75 72 3b 0a 20 20 63 6f 6e 73 74 20 63 68  )cur;.  const ch
10390 61 72 20 2a 7a 3b 0a 20 20 63 6f 6e 73 74 20 63  ar *z;.  const c
103a0 68 61 72 20 2a 7a 52 6f 6f 74 20 3d 20 30 3b 0a  har *zRoot = 0;.
103b0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
103c0 6e 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  n;..  UNUSED_PAR
103d0 41 4d 28 69 64 78 53 74 72 29 3b 0a 20 20 55 4e  AM(idxStr);.  UN
103e0 55 53 45 44 5f 50 41 52 41 4d 28 61 72 67 63 29  USED_PARAM(argc)
103f0 3b 0a 20 20 6a 73 6f 6e 45 61 63 68 43 75 72 73  ;.  jsonEachCurs
10400 6f 72 52 65 73 65 74 28 70 29 3b 0a 20 20 69 66  orReset(p);.  if
10410 28 20 69 64 78 4e 75 6d 3d 3d 30 20 29 20 72 65  ( idxNum==0 ) re
10420 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10430 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68 61    z = (const cha
10440 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
10450 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
10460 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
10470 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
10480 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   n = sqlite3_val
10490 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d  ue_bytes(argv[0]
104a0 29 3b 0a 20 20 70 2d 3e 7a 4a 73 6f 6e 20 3d 20  );.  p->zJson = 
104b0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
104c0 28 20 6e 2b 31 20 29 3b 0a 20 20 69 66 28 20 70  ( n+1 );.  if( p
104d0 2d 3e 7a 4a 73 6f 6e 3d 3d 30 20 29 20 72 65 74  ->zJson==0 ) ret
104e0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
104f0 3b 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e 7a 4a  ;.  memcpy(p->zJ
10500 73 6f 6e 2c 20 7a 2c 20 28 73 69 7a 65 5f 74 29  son, z, (size_t)
10510 6e 2b 31 29 3b 0a 20 20 69 66 28 20 6a 73 6f 6e  n+1);.  if( json
10520 50 61 72 73 65 28 26 70 2d 3e 73 50 61 72 73 65  Parse(&p->sParse
10530 2c 20 30 2c 20 70 2d 3e 7a 4a 73 6f 6e 29 20 29  , 0, p->zJson) )
10540 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53  {.    int rc = S
10550 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
10560 20 69 66 28 20 70 2d 3e 73 50 61 72 73 65 2e 6f   if( p->sParse.o
10570 6f 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  om==0 ){.      s
10580 71 6c 69 74 65 33 5f 66 72 65 65 28 63 75 72 2d  qlite3_free(cur-
10590 3e 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29  >pVtab->zErrMsg)
105a0 3b 0a 20 20 20 20 20 20 63 75 72 2d 3e 70 56 74  ;.      cur->pVt
105b0 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71  ab->zErrMsg = sq
105c0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6d  lite3_mprintf("m
105d0 61 6c 66 6f 72 6d 65 64 20 4a 53 4f 4e 22 29 3b  alformed JSON");
105e0 0a 20 20 20 20 20 20 69 66 28 20 63 75 72 2d 3e  .      if( cur->
105f0 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29  pVtab->zErrMsg )
10600 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
10610 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 73  OR;.    }.    js
10620 6f 6e 45 61 63 68 43 75 72 73 6f 72 52 65 73 65  onEachCursorRese
10630 74 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  t(p);.    return
10640 20 72 63 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28   rc;.  }else if(
10650 20 70 2d 3e 62 52 65 63 75 72 73 69 76 65 20 26   p->bRecursive &
10660 26 20 6a 73 6f 6e 50 61 72 73 65 46 69 6e 64 50  & jsonParseFindP
10670 61 72 65 6e 74 73 28 26 70 2d 3e 73 50 61 72 73  arents(&p->sPars
10680 65 29 20 29 7b 0a 20 20 20 20 6a 73 6f 6e 45 61  e) ){.    jsonEa
10690 63 68 43 75 72 73 6f 72 52 65 73 65 74 28 70 29  chCursorReset(p)
106a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
106b0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c  ITE_NOMEM;.  }el
106c0 73 65 7b 0a 20 20 20 20 4a 73 6f 6e 4e 6f 64 65  se{.    JsonNode
106d0 20 2a 70 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 20   *pNode = 0;.   
106e0 20 69 66 28 20 69 64 78 4e 75 6d 3d 3d 33 20 29   if( idxNum==3 )
106f0 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
10700 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20  ar *zErr = 0;.  
10710 20 20 20 20 7a 52 6f 6f 74 20 3d 20 28 63 6f 6e      zRoot = (con
10720 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
10730 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
10740 5b 31 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [1]);.      if( 
10750 7a 52 6f 6f 74 3d 3d 30 20 29 20 72 65 74 75 72  zRoot==0 ) retur
10760 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
10770 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76     n = sqlite3_v
10780 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b  alue_bytes(argv[
10790 31 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 52  1]);.      p->zR
107a0 6f 6f 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  oot = sqlite3_ma
107b0 6c 6c 6f 63 36 34 28 20 6e 2b 31 20 29 3b 0a 20  lloc64( n+1 );. 
107c0 20 20 20 20 20 69 66 28 20 70 2d 3e 7a 52 6f 6f       if( p->zRoo
107d0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  t==0 ) return SQ
107e0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
107f0 20 20 6d 65 6d 63 70 79 28 70 2d 3e 7a 52 6f 6f    memcpy(p->zRoo
10800 74 2c 20 7a 52 6f 6f 74 2c 20 28 73 69 7a 65 5f  t, zRoot, (size_
10810 74 29 6e 2b 31 29 3b 0a 20 20 20 20 20 20 69 66  t)n+1);.      if
10820 28 20 7a 52 6f 6f 74 5b 30 5d 21 3d 27 24 27 20  ( zRoot[0]!='$' 
10830 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20  ){.        zErr 
10840 3d 20 7a 52 6f 6f 74 3b 0a 20 20 20 20 20 20 7d  = zRoot;.      }
10850 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e  else{.        pN
10860 6f 64 65 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75 70  ode = jsonLookup
10870 53 74 65 70 28 26 70 2d 3e 73 50 61 72 73 65 2c  Step(&p->sParse,
10880 20 30 2c 20 70 2d 3e 7a 52 6f 6f 74 2b 31 2c 20   0, p->zRoot+1, 
10890 30 2c 20 26 7a 45 72 72 29 3b 0a 20 20 20 20 20  0, &zErr);.     
108a0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 45 72   }.      if( zEr
108b0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
108c0 69 74 65 33 5f 66 72 65 65 28 63 75 72 2d 3e 70  ite3_free(cur->p
108d0 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  Vtab->zErrMsg);.
108e0 20 20 20 20 20 20 20 20 63 75 72 2d 3e 70 56 74          cur->pVt
108f0 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 6a 73  ab->zErrMsg = js
10900 6f 6e 50 61 74 68 53 79 6e 74 61 78 45 72 72 6f  onPathSyntaxErro
10910 72 28 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 20  r(zErr);.       
10920 20 6a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 52   jsonEachCursorR
10930 65 73 65 74 28 70 29 3b 0a 20 20 20 20 20 20 20  eset(p);.       
10940 20 72 65 74 75 72 6e 20 63 75 72 2d 3e 70 56 74   return cur->pVt
10950 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3f 20 53 51  ab->zErrMsg ? SQ
10960 4c 49 54 45 5f 45 52 52 4f 52 20 3a 20 53 51 4c  LITE_ERROR : SQL
10970 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
10980 20 7d 65 6c 73 65 20 69 66 28 20 70 4e 6f 64 65   }else if( pNode
10990 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
109a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
109b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
109c0 73 65 7b 0a 20 20 20 20 20 20 70 4e 6f 64 65 20  se{.      pNode 
109d0 3d 20 70 2d 3e 73 50 61 72 73 65 2e 61 4e 6f 64  = p->sParse.aNod
109e0 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  e;.    }.    p->
109f0 69 42 65 67 69 6e 20 3d 20 70 2d 3e 69 20 3d 20  iBegin = p->i = 
10a00 28 69 6e 74 29 28 70 4e 6f 64 65 20 2d 20 70 2d  (int)(pNode - p-
10a10 3e 73 50 61 72 73 65 2e 61 4e 6f 64 65 29 3b 0a  >sParse.aNode);.
10a20 20 20 20 20 70 2d 3e 65 54 79 70 65 20 3d 20 70      p->eType = p
10a30 4e 6f 64 65 2d 3e 65 54 79 70 65 3b 0a 20 20 20  Node->eType;.   
10a40 20 69 66 28 20 70 2d 3e 65 54 79 70 65 3e 3d 4a   if( p->eType>=J
10a50 53 4f 4e 5f 41 52 52 41 59 20 29 7b 0a 20 20 20  SON_ARRAY ){.   
10a60 20 20 20 70 4e 6f 64 65 2d 3e 75 2e 69 4b 65 79     pNode->u.iKey
10a70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69   = 0;.      p->i
10a80 45 6e 64 20 3d 20 70 2d 3e 69 20 2b 20 70 4e 6f  End = p->i + pNo
10a90 64 65 2d 3e 6e 20 2b 20 31 3b 0a 20 20 20 20 20  de->n + 1;.     
10aa0 20 69 66 28 20 70 2d 3e 62 52 65 63 75 72 73 69   if( p->bRecursi
10ab0 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  ve ){.        p-
10ac0 3e 65 54 79 70 65 20 3d 20 70 2d 3e 73 50 61 72  >eType = p->sPar
10ad0 73 65 2e 61 4e 6f 64 65 5b 70 2d 3e 73 50 61 72  se.aNode[p->sPar
10ae0 73 65 2e 61 55 70 5b 70 2d 3e 69 5d 5d 2e 65 54  se.aUp[p->i]].eT
10af0 79 70 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ype;.        if(
10b00 20 70 2d 3e 69 3e 30 20 26 26 20 28 70 2d 3e 73   p->i>0 && (p->s
10b10 50 61 72 73 65 2e 61 4e 6f 64 65 5b 70 2d 3e 69  Parse.aNode[p->i
10b20 2d 31 5d 2e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e  -1].jnFlags & JN
10b30 4f 44 45 5f 4c 41 42 45 4c 29 21 3d 30 20 29 7b  ODE_LABEL)!=0 ){
10b40 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 2d  .          p->i-
10b50 2d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  -;.        }.   
10b60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10b70 20 20 70 2d 3e 69 2b 2b 3b 0a 20 20 20 20 20 20    p->i++;.      
10b80 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
10b90 20 20 20 70 2d 3e 69 45 6e 64 20 3d 20 70 2d 3e     p->iEnd = p->
10ba0 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  i+1;.    }.  }. 
10bb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10bc0 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 6d 65 74  K;.}../* The met
10bd0 68 6f 64 73 20 6f 66 20 74 68 65 20 6a 73 6f 6e  hods of the json
10be0 5f 65 61 63 68 20 76 69 72 74 75 61 6c 20 74 61  _each virtual ta
10bf0 62 6c 65 20 2a 2f 0a 73 74 61 74 69 63 20 73 71  ble */.static sq
10c00 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 6a 73 6f  lite3_module jso
10c10 6e 45 61 63 68 4d 6f 64 75 6c 65 20 3d 20 7b 0a  nEachModule = {.
10c20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
10c30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10c40 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 30 2c  iVersion */.  0,
10c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c60 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 72 65           /* xCre
10c70 61 74 65 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63  ate */.  jsonEac
10c80 68 43 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20 20  hConnect,       
10c90 20 20 20 20 2f 2a 20 78 43 6f 6e 6e 65 63 74 20      /* xConnect 
10ca0 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 42 65 73  */.  jsonEachBes
10cb0 74 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20  tIndex,         
10cc0 2f 2a 20 78 42 65 73 74 49 6e 64 65 78 20 2a 2f  /* xBestIndex */
10cd0 0a 20 20 6a 73 6f 6e 45 61 63 68 44 69 73 63 6f  .  jsonEachDisco
10ce0 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20 2f 2a  nnect,        /*
10cf0 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 2a 2f 0a   xDisconnect */.
10d00 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
10d10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10d20 78 44 65 73 74 72 6f 79 20 2a 2f 0a 20 20 6a 73  xDestroy */.  js
10d30 6f 6e 45 61 63 68 4f 70 65 6e 45 61 63 68 2c 20  onEachOpenEach, 
10d40 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65           /* xOpe
10d50 6e 20 2d 20 6f 70 65 6e 20 61 20 63 75 72 73 6f  n - open a curso
10d60 72 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 43  r */.  jsonEachC
10d70 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
10d80 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2d 20 63 6c    /* xClose - cl
10d90 6f 73 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a  ose a cursor */.
10da0 20 20 6a 73 6f 6e 45 61 63 68 46 69 6c 74 65 72    jsonEachFilter
10db0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
10dc0 78 46 69 6c 74 65 72 20 2d 20 63 6f 6e 66 69 67  xFilter - config
10dd0 75 72 65 20 73 63 61 6e 20 63 6f 6e 73 74 72 61  ure scan constra
10de0 69 6e 74 73 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61  ints */.  jsonEa
10df0 63 68 4e 65 78 74 2c 20 20 20 20 20 20 20 20 20  chNext,         
10e00 20 20 20 20 20 2f 2a 20 78 4e 65 78 74 20 2d 20       /* xNext - 
10e10 61 64 76 61 6e 63 65 20 61 20 63 75 72 73 6f 72  advance a cursor
10e20 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 45 6f   */.  jsonEachEo
10e30 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
10e40 20 2f 2a 20 78 45 6f 66 20 2d 20 63 68 65 63 6b   /* xEof - check
10e50 20 66 6f 72 20 65 6e 64 20 6f 66 20 73 63 61 6e   for end of scan
10e60 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 43 6f   */.  jsonEachCo
10e70 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20  lumn,           
10e80 20 2f 2a 20 78 43 6f 6c 75 6d 6e 20 2d 20 72 65   /* xColumn - re
10e90 61 64 20 64 61 74 61 20 2a 2f 0a 20 20 6a 73 6f  ad data */.  jso
10ea0 6e 45 61 63 68 52 6f 77 69 64 2c 20 20 20 20 20  nEachRowid,     
10eb0 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 77 69          /* xRowi
10ec0 64 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f  d - read data */
10ed0 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
10ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10ef0 20 78 55 70 64 61 74 65 20 2a 2f 0a 20 20 30 2c   xUpdate */.  0,
10f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f10 20 20 20 20 20 20 20 20 20 2f 2a 20 78 42 65 67           /* xBeg
10f20 69 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  in */.  0,      
10f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f40 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20     /* xSync */. 
10f50 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
10f60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
10f70 43 6f 6d 6d 69 74 20 2a 2f 0a 20 20 30 2c 20 20  Commit */.  0,  
10f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f90 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 6c 6c 62         /* xRollb
10fa0 61 63 6b 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  ack */.  0,     
10fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fc0 20 20 20 20 2f 2a 20 78 46 69 6e 64 4d 65 74 68      /* xFindMeth
10fd0 6f 64 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  od */.  0,      
10fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ff0 20 20 20 2f 2a 20 78 52 65 6e 61 6d 65 20 2a 2f     /* xRename */
11000 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
11010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11020 20 78 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20   xSavepoint */. 
11030 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
11040 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
11050 52 65 6c 65 61 73 65 20 2a 2f 0a 20 20 30 2c 20  Release */.  0, 
11060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11070 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 6c 6c          /* xRoll
11080 62 61 63 6b 54 6f 20 2a 2f 0a 20 20 30 20 20 20  backTo */.  0   
11090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110a0 20 20 20 20 20 20 20 2f 2a 20 78 53 68 61 64 6f         /* xShado
110b0 77 4e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  wName */.};../* 
110c0 54 68 65 20 6d 65 74 68 6f 64 73 20 6f 66 20 74  The methods of t
110d0 68 65 20 6a 73 6f 6e 5f 74 72 65 65 20 76 69 72  he json_tree vir
110e0 74 75 61 6c 20 74 61 62 6c 65 2e 20 2a 2f 0a 73  tual table. */.s
110f0 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 6d 6f  tatic sqlite3_mo
11100 64 75 6c 65 20 6a 73 6f 6e 54 72 65 65 4d 6f 64  dule jsonTreeMod
11110 75 6c 65 20 3d 20 7b 0a 20 20 30 2c 20 20 20 20  ule = {.  0,    
11120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11130 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
11140 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
11150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11160 20 2f 2a 20 78 43 72 65 61 74 65 20 2a 2f 0a 20   /* xCreate */. 
11170 20 6a 73 6f 6e 45 61 63 68 43 6f 6e 6e 65 63 74   jsonEachConnect
11180 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
11190 43 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 6a 73 6f  Connect */.  jso
111a0 6e 45 61 63 68 42 65 73 74 49 6e 64 65 78 2c 20  nEachBestIndex, 
111b0 20 20 20 20 20 20 20 20 2f 2a 20 78 42 65 73 74          /* xBest
111c0 49 6e 64 65 78 20 2a 2f 0a 20 20 6a 73 6f 6e 45  Index */.  jsonE
111d0 61 63 68 44 69 73 63 6f 6e 6e 65 63 74 2c 20 20  achDisconnect,  
111e0 20 20 20 20 20 20 2f 2a 20 78 44 69 73 63 6f 6e        /* xDiscon
111f0 6e 65 63 74 20 2a 2f 0a 20 20 30 2c 20 20 20 20  nect */.  0,    
11200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11210 20 20 20 20 20 2f 2a 20 78 44 65 73 74 72 6f 79       /* xDestroy
11220 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 4f 70   */.  jsonEachOp
11230 65 6e 54 72 65 65 2c 20 20 20 20 20 20 20 20 20  enTree,         
11240 20 2f 2a 20 78 4f 70 65 6e 20 2d 20 6f 70 65 6e   /* xOpen - open
11250 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 6a   a cursor */.  j
11260 73 6f 6e 45 61 63 68 43 6c 6f 73 65 2c 20 20 20  sonEachClose,   
11270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
11280 6f 73 65 20 2d 20 63 6c 6f 73 65 20 61 20 63 75  ose - close a cu
11290 72 73 6f 72 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61  rsor */.  jsonEa
112a0 63 68 46 69 6c 74 65 72 2c 20 20 20 20 20 20 20  chFilter,       
112b0 20 20 20 20 20 2f 2a 20 78 46 69 6c 74 65 72 20       /* xFilter 
112c0 2d 20 63 6f 6e 66 69 67 75 72 65 20 73 63 61 6e  - configure scan
112d0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
112e0 20 20 6a 73 6f 6e 45 61 63 68 4e 65 78 74 2c 20    jsonEachNext, 
112f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11300 78 4e 65 78 74 20 2d 20 61 64 76 61 6e 63 65 20  xNext - advance 
11310 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 6a 73  a cursor */.  js
11320 6f 6e 45 61 63 68 45 6f 66 2c 20 20 20 20 20 20  onEachEof,      
11330 20 20 20 20 20 20 20 20 20 2f 2a 20 78 45 6f 66           /* xEof
11340 20 2d 20 63 68 65 63 6b 20 66 6f 72 20 65 6e 64   - check for end
11350 20 6f 66 20 73 63 61 6e 20 2a 2f 0a 20 20 6a 73   of scan */.  js
11360 6f 6e 45 61 63 68 43 6f 6c 75 6d 6e 2c 20 20 20  onEachColumn,   
11370 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6c           /* xCol
11380 75 6d 6e 20 2d 20 72 65 61 64 20 64 61 74 61 20  umn - read data 
11390 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 52 6f 77  */.  jsonEachRow
113a0 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
113b0 2f 2a 20 78 52 6f 77 69 64 20 2d 20 72 65 61 64  /* xRowid - read
113c0 20 64 61 74 61 20 2a 2f 0a 20 20 30 2c 20 20 20   data */.  0,   
113d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113e0 20 20 20 20 20 20 2f 2a 20 78 55 70 64 61 74 65        /* xUpdate
113f0 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
11400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11410 20 2f 2a 20 78 42 65 67 69 6e 20 2a 2f 0a 20 20   /* xBegin */.  
11420 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
11430 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
11440 79 6e 63 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  ync */.  0,     
11450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11460 20 20 20 20 2f 2a 20 78 43 6f 6d 6d 69 74 20 2a      /* xCommit *
11470 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
11480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11490 2a 20 78 52 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  * xRollback */. 
114a0 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
114b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
114c0 46 69 6e 64 4d 65 74 68 6f 64 20 2a 2f 0a 20 20  FindMethod */.  
114d0 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
114e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
114f0 65 6e 61 6d 65 20 2a 2f 0a 20 20 30 2c 20 20 20  ename */.  0,   
11500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11510 20 20 20 20 20 20 2f 2a 20 78 53 61 76 65 70 6f        /* xSavepo
11520 69 6e 74 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  int */.  0,     
11530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11540 20 20 20 20 2f 2a 20 78 52 65 6c 65 61 73 65 20      /* xRelease 
11550 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
11560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11570 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 54 6f 20 2a  /* xRollbackTo *
11580 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20  /.  0           
11590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
115a0 2a 20 78 53 68 61 64 6f 77 4e 61 6d 65 20 2a 2f  * xShadowName */
115b0 0a 7d 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  .};.#endif /* SQ
115c0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
115d0 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 2a 2a 2a  LTABLE */../****
115e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
115f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11620 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20  ********.** The 
11630 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
11640 65 73 20 61 72 65 20 74 68 65 20 6f 6e 6c 79 20  es are the only 
11650 70 75 62 6c 69 63 61 6c 6c 79 20 76 69 73 69 62  publically visib
11660 6c 65 20 69 64 65 6e 74 69 66 69 65 72 73 20 69  le identifiers i
11670 6e 20 74 68 69 73 0a 2a 2a 20 66 69 6c 65 2e 20  n this.** file. 
11680 20 43 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77   Call the follow
11690 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 69 6e 20  ing routines in 
116a0 6f 72 64 65 72 20 74 6f 20 72 65 67 69 73 74 65  order to registe
116b0 72 20 74 68 65 20 76 61 72 69 6f 75 73 20 53 51  r the various SQ
116c0 4c 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 61  L.** functions a
116d0 6e 64 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  nd the virtual t
116e0 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64  able implemented
116f0 20 62 79 20 74 68 69 73 20 66 69 6c 65 2e 0a 2a   by this file..*
11700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 69 6e  ***********/..in
11750 74 20 73 71 6c 69 74 65 33 4a 73 6f 6e 31 49 6e  t sqlite3Json1In
11760 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  it(sqlite3 *db){
11770 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
11780 54 45 5f 4f 4b 3b 0a 20 20 75 6e 73 69 67 6e 65  TE_OK;.  unsigne
11790 64 20 69 6e 74 20 69 3b 0a 20 20 73 74 61 74 69  d int i;.  stati
117a0 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b  c const struct {
117b0 0a 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  .     const char
117c0 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 69 6e   *zName;.     in
117d0 74 20 6e 41 72 67 3b 0a 20 20 20 20 20 69 6e 74  t nArg;.     int
117e0 20 66 6c 61 67 3b 0a 20 20 20 20 20 76 6f 69 64   flag;.     void
117f0 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65   (*xFunc)(sqlite
11800 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
11810 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 3b  qlite3_value**);
11820 0a 20 20 7d 20 61 46 75 6e 63 5b 5d 20 3d 20 7b  .  } aFunc[] = {
11830 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 22 2c 20 20  .    { "json",  
11840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
11850 2c 20 30 2c 20 20 20 6a 73 6f 6e 52 65 6d 6f 76  , 0,   jsonRemov
11860 65 46 75 6e 63 20 20 20 20 20 20 20 20 7d 2c 0a  eFunc        },.
11870 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 61 72 72 61      { "json_arra
11880 79 22 2c 20 20 20 20 20 20 20 20 20 20 2d 31 2c  y",          -1,
11890 20 30 2c 20 20 20 6a 73 6f 6e 41 72 72 61 79 46   0,   jsonArrayF
118a0 75 6e 63 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  unc         },. 
118b0 20 20 20 7b 20 22 6a 73 6f 6e 5f 61 72 72 61 79     { "json_array
118c0 5f 6c 65 6e 67 74 68 22 2c 20 20 20 20 31 2c 20  _length",    1, 
118d0 30 2c 20 20 20 6a 73 6f 6e 41 72 72 61 79 4c 65  0,   jsonArrayLe
118e0 6e 67 74 68 46 75 6e 63 20 20 20 7d 2c 0a 20 20  ngthFunc   },.  
118f0 20 20 7b 20 22 6a 73 6f 6e 5f 61 72 72 61 79 5f    { "json_array_
11900 6c 65 6e 67 74 68 22 2c 20 20 20 20 32 2c 20 30  length",    2, 0
11910 2c 20 20 20 6a 73 6f 6e 41 72 72 61 79 4c 65 6e  ,   jsonArrayLen
11920 67 74 68 46 75 6e 63 20 20 20 7d 2c 0a 20 20 20  gthFunc   },.   
11930 20 7b 20 22 6a 73 6f 6e 5f 65 78 74 72 61 63 74   { "json_extract
11940 22 2c 20 20 20 20 20 20 20 20 2d 31 2c 20 30 2c  ",        -1, 0,
11950 20 20 20 6a 73 6f 6e 45 78 74 72 61 63 74 46 75     jsonExtractFu
11960 6e 63 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  nc       },.    
11970 7b 20 22 6a 73 6f 6e 5f 69 6e 73 65 72 74 22 2c  { "json_insert",
11980 20 20 20 20 20 20 20 20 20 2d 31 2c 20 30 2c 20           -1, 0, 
11990 20 20 6a 73 6f 6e 53 65 74 46 75 6e 63 20 20 20    jsonSetFunc   
119a0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
119b0 20 22 6a 73 6f 6e 5f 6f 62 6a 65 63 74 22 2c 20   "json_object", 
119c0 20 20 20 20 20 20 20 20 2d 31 2c 20 30 2c 20 20          -1, 0,  
119d0 20 6a 73 6f 6e 4f 62 6a 65 63 74 46 75 6e 63 20   jsonObjectFunc 
119e0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
119f0 22 6a 73 6f 6e 5f 70 61 74 63 68 22 2c 20 20 20  "json_patch",   
11a00 20 20 20 20 20 20 20 20 32 2c 20 30 2c 20 20 20          2, 0,   
11a10 6a 73 6f 6e 50 61 74 63 68 46 75 6e 63 20 20 20  jsonPatchFunc   
11a20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
11a30 6a 73 6f 6e 5f 71 75 6f 74 65 22 2c 20 20 20 20  json_quote",    
11a40 20 20 20 20 20 20 20 31 2c 20 30 2c 20 20 20 6a         1, 0,   j
11a50 73 6f 6e 51 75 6f 74 65 46 75 6e 63 20 20 20 20  sonQuoteFunc    
11a60 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a       },.    { "j
11a70 73 6f 6e 5f 72 65 6d 6f 76 65 22 2c 20 20 20 20  son_remove",    
11a80 20 20 20 20 20 2d 31 2c 20 30 2c 20 20 20 6a 73       -1, 0,   js
11a90 6f 6e 52 65 6d 6f 76 65 46 75 6e 63 20 20 20 20  onRemoveFunc    
11aa0 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73      },.    { "js
11ab0 6f 6e 5f 72 65 70 6c 61 63 65 22 2c 20 20 20 20  on_replace",    
11ac0 20 20 20 20 2d 31 2c 20 30 2c 20 20 20 6a 73 6f      -1, 0,   jso
11ad0 6e 52 65 70 6c 61 63 65 46 75 6e 63 20 20 20 20  nReplaceFunc    
11ae0 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f     },.    { "jso
11af0 6e 5f 73 65 74 22 2c 20 20 20 20 20 20 20 20 20  n_set",         
11b00 20 20 20 2d 31 2c 20 31 2c 20 20 20 6a 73 6f 6e     -1, 1,   json
11b10 53 65 74 46 75 6e 63 20 20 20 20 20 20 20 20 20  SetFunc         
11b20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e    },.    { "json
11b30 5f 74 79 70 65 22 2c 20 20 20 20 20 20 20 20 20  _type",         
11b40 20 20 20 31 2c 20 30 2c 20 20 20 6a 73 6f 6e 54     1, 0,   jsonT
11b50 79 70 65 46 75 6e 63 20 20 20 20 20 20 20 20 20  ypeFunc         
11b60 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f   },.    { "json_
11b70 74 79 70 65 22 2c 20 20 20 20 20 20 20 20 20 20  type",          
11b80 20 20 32 2c 20 30 2c 20 20 20 6a 73 6f 6e 54 79    2, 0,   jsonTy
11b90 70 65 46 75 6e 63 20 20 20 20 20 20 20 20 20 20  peFunc          
11ba0 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 76  },.    { "json_v
11bb0 61 6c 69 64 22 2c 20 20 20 20 20 20 20 20 20 20  alid",          
11bc0 20 31 2c 20 30 2c 20 20 20 6a 73 6f 6e 56 61 6c   1, 0,   jsonVal
11bd0 69 64 46 75 6e 63 20 20 20 20 20 20 20 20 20 7d  idFunc         }
11be0 2c 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45  ,..#if SQLITE_DE
11bf0 42 55 47 0a 20 20 20 20 2f 2a 20 44 45 42 55 47  BUG.    /* DEBUG
11c00 20 61 6e 64 20 54 45 53 54 49 4e 47 20 66 75 6e   and TESTING fun
11c10 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 7b 20  ctions */.    { 
11c20 22 6a 73 6f 6e 5f 70 61 72 73 65 22 2c 20 20 20  "json_parse",   
11c30 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20 20 20          1, 0,   
11c40 6a 73 6f 6e 50 61 72 73 65 46 75 6e 63 20 20 20  jsonParseFunc   
11c50 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
11c60 6a 73 6f 6e 5f 74 65 73 74 31 22 2c 20 20 20 20  json_test1",    
11c70 20 20 20 20 20 20 20 31 2c 20 30 2c 20 20 20 6a         1, 0,   j
11c80 73 6f 6e 54 65 73 74 31 46 75 6e 63 20 20 20 20  sonTest1Func    
11c90 20 20 20 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20       },.#endif. 
11ca0 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   };.  static con
11cb0 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
11cc0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
11cd0 6d 65 3b 0a 20 20 20 20 20 69 6e 74 20 6e 41 72  me;.     int nAr
11ce0 67 3b 0a 20 20 20 20 20 76 6f 69 64 20 28 2a 78  g;.     void (*x
11cf0 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f  Step)(sqlite3_co
11d00 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
11d10 65 33 5f 76 61 6c 75 65 2a 2a 29 3b 0a 20 20 20  e3_value**);.   
11d20 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29    void (*xFinal)
11d30 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
11d40 2a 29 3b 0a 20 20 20 20 20 76 6f 69 64 20 28 2a  *);.     void (*
11d50 78 56 61 6c 75 65 29 28 73 71 6c 69 74 65 33 5f  xValue)(sqlite3_
11d60 63 6f 6e 74 65 78 74 2a 29 3b 0a 20 20 7d 20 61  context*);.  } a
11d70 41 67 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20  Agg[] = {.    { 
11d80 22 6a 73 6f 6e 5f 67 72 6f 75 70 5f 61 72 72 61  "json_group_arra
11d90 79 22 2c 20 20 20 20 20 31 2c 0a 20 20 20 20 20  y",     1,.     
11da0 20 6a 73 6f 6e 41 72 72 61 79 53 74 65 70 2c 20   jsonArrayStep, 
11db0 20 20 6a 73 6f 6e 41 72 72 61 79 46 69 6e 61 6c    jsonArrayFinal
11dc0 2c 20 20 6a 73 6f 6e 41 72 72 61 79 56 61 6c 75  ,  jsonArrayValu
11dd0 65 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f  e  },.    { "jso
11de0 6e 5f 67 72 6f 75 70 5f 6f 62 6a 65 63 74 22 2c  n_group_object",
11df0 20 20 20 20 32 2c 0a 20 20 20 20 20 20 6a 73 6f      2,.      jso
11e00 6e 4f 62 6a 65 63 74 53 74 65 70 2c 20 20 6a 73  nObjectStep,  js
11e10 6f 6e 4f 62 6a 65 63 74 46 69 6e 61 6c 2c 20 6a  onObjectFinal, j
11e20 73 6f 6e 4f 62 6a 65 63 74 56 61 6c 75 65 20 7d  sonObjectValue }
11e30 2c 0a 20 20 7d 3b 0a 23 69 66 6e 64 65 66 20 53  ,.  };.#ifndef S
11e40 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
11e50 41 4c 54 41 42 4c 45 0a 20 20 73 74 61 74 69 63  ALTABLE.  static
11e60 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a   const struct {.
11e70 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
11e80 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 73 71 6c  *zName;.     sql
11e90 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f  ite3_module *pMo
11ea0 64 75 6c 65 3b 0a 20 20 7d 20 61 4d 6f 64 5b 5d  dule;.  } aMod[]
11eb0 20 3d 20 7b 0a 20 20 20 20 7b 20 22 6a 73 6f 6e   = {.    { "json
11ec0 5f 65 61 63 68 22 2c 20 20 20 20 20 20 20 20 20  _each",         
11ed0 20 20 20 26 6a 73 6f 6e 45 61 63 68 4d 6f 64 75     &jsonEachModu
11ee0 6c 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  le              
11ef0 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f   },.    { "json_
11f00 74 72 65 65 22 2c 20 20 20 20 20 20 20 20 20 20  tree",          
11f10 20 20 26 6a 73 6f 6e 54 72 65 65 4d 6f 64 75 6c    &jsonTreeModul
11f20 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
11f30 7d 2c 0a 20 20 7d 3b 0a 23 65 6e 64 69 66 0a 20  },.  };.#endif. 
11f40 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
11f50 6f 66 28 61 46 75 6e 63 29 2f 73 69 7a 65 6f 66  of(aFunc)/sizeof
11f60 28 61 46 75 6e 63 5b 30 5d 29 20 26 26 20 72 63  (aFunc[0]) && rc
11f70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b  ==SQLITE_OK; i++
11f80 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
11f90 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
11fa0 69 6f 6e 28 64 62 2c 20 61 46 75 6e 63 5b 69 5d  ion(db, aFunc[i]
11fb0 2e 7a 4e 61 6d 65 2c 20 61 46 75 6e 63 5b 69 5d  .zName, aFunc[i]
11fc0 2e 6e 41 72 67 2c 0a 20 20 20 20 20 20 20 20 20  .nArg,.         
11fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fe0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55          SQLITE_U
11ff0 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
12000 45 52 4d 49 4e 49 53 54 49 43 2c 0a 20 20 20 20  ERMINISTIC,.    
12010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12020 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
12030 69 64 2a 29 26 61 46 75 6e 63 5b 69 5d 2e 66 6c  id*)&aFunc[i].fl
12040 61 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ag,.            
12050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12060 20 20 20 20 20 61 46 75 6e 63 5b 69 5d 2e 78 46       aFunc[i].xF
12070 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  unc, 0, 0);.  }.
12080 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12090 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20  MIT_WINDOWFUNC. 
120a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
120b0 6f 66 28 61 41 67 67 29 2f 73 69 7a 65 6f 66 28  of(aAgg)/sizeof(
120c0 61 41 67 67 5b 30 5d 29 20 26 26 20 72 63 3d 3d  aAgg[0]) && rc==
120d0 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b  SQLITE_OK; i++){
120e0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
120f0 33 5f 63 72 65 61 74 65 5f 77 69 6e 64 6f 77 5f  3_create_window_
12100 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 61 41 67  function(db, aAg
12110 67 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 61 41 67 67  g[i].zName, aAgg
12120 5b 69 5d 2e 6e 41 72 67 2c 0a 20 20 20 20 20 20  [i].nArg,.      
12130 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
12140 5f 53 55 42 54 59 50 45 20 7c 20 53 51 4c 49 54  _SUBTYPE | SQLIT
12150 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
12160 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 30  DETERMINISTIC, 0
12170 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12190 20 20 20 61 41 67 67 5b 69 5d 2e 78 53 74 65 70     aAgg[i].xStep
121a0 2c 20 61 41 67 67 5b 69 5d 2e 78 46 69 6e 61 6c  , aAgg[i].xFinal
121b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
121c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121d0 20 20 20 61 41 67 67 5b 69 5d 2e 78 56 61 6c 75     aAgg[i].xValu
121e0 65 2c 20 6a 73 6f 6e 47 72 6f 75 70 49 6e 76 65  e, jsonGroupInve
121f0 72 73 65 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  rse, 0);.  }.#en
12200 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
12210 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
12220 41 42 4c 45 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ABLE.  for(i=0; 
12230 69 3c 73 69 7a 65 6f 66 28 61 4d 6f 64 29 2f 73  i<sizeof(aMod)/s
12240 69 7a 65 6f 66 28 61 4d 6f 64 5b 30 5d 29 20 26  izeof(aMod[0]) &
12250 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
12260 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20   i++){.    rc = 
12270 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 6d  sqlite3_create_m
12280 6f 64 75 6c 65 28 64 62 2c 20 61 4d 6f 64 5b 69  odule(db, aMod[i
12290 5d 2e 7a 4e 61 6d 65 2c 20 61 4d 6f 64 5b 69 5d  ].zName, aMod[i]
122a0 2e 70 4d 6f 64 75 6c 65 2c 20 30 29 3b 0a 20 20  .pModule, 0);.  
122b0 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
122c0 6e 20 72 63 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65  n rc;.}...#ifnde
122d0 66 20 53 51 4c 49 54 45 5f 43 4f 52 45 0a 23 69  f SQLITE_CORE.#i
122e0 66 64 65 66 20 5f 57 49 4e 33 32 0a 5f 5f 64 65  fdef _WIN32.__de
122f0 63 6c 73 70 65 63 28 64 6c 6c 65 78 70 6f 72 74  clspec(dllexport
12300 29 0a 23 65 6e 64 69 66 0a 69 6e 74 20 73 71 6c  ).#endif.int sql
12310 69 74 65 33 5f 6a 73 6f 6e 5f 69 6e 69 74 28 0a  ite3_json_init(.
12320 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a    sqlite3 *db, .
12330 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73    char **pzErrMs
12340 67 2c 20 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69  g, .  const sqli
12350 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73  te3_api_routines
12360 20 2a 70 41 70 69 0a 29 7b 0a 20 20 53 51 4c 49   *pApi.){.  SQLI
12370 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49  TE_EXTENSION_INI
12380 54 32 28 70 41 70 69 29 3b 0a 20 20 28 76 6f 69  T2(pApi);.  (voi
12390 64 29 70 7a 45 72 72 4d 73 67 3b 20 20 2f 2a 20  d)pzErrMsg;  /* 
123a0 55 6e 75 73 65 64 20 70 61 72 61 6d 65 74 65 72  Unused parameter
123b0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   */.  return sql
123c0 69 74 65 33 4a 73 6f 6e 31 49 6e 69 74 28 64 62  ite3Json1Init(db
123d0 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64  );.}.#endif.#end
123e0 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
123f0 51 4c 49 54 45 5f 43 4f 52 45 29 20 7c 7c 20 64  QLITE_CORE) || d
12400 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
12410 41 42 4c 45 5f 4a 53 4f 4e 31 29 20 2a 2f 0a     ABLE_JSON1) */.