SQLite
Hex Artifact Content
Not logged in

Artifact dbe086615b9546c156bf32b9378fc09383b58bd17513b866cfd24c1e15281984:


0000: 2f 2a 0a 2a 2a 20 32 30 31 35 2d 30 38 2d 31 32  /*.** 2015-08-12
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ****.**.** This 
0180: 53 51 4c 69 74 65 20 65 78 74 65 6e 73 69 6f 6e  SQLite extension
0190: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 4a 53 4f 4e   implements JSON
01a0: 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 54 68 65   functions.  The
01b0: 20 69 6e 74 65 72 66 61 63 65 20 69 73 0a 2a 2a   interface is.**
01c0: 20 6d 6f 64 65 6c 65 64 20 61 66 74 65 72 20 4d   modeled after M
01d0: 79 53 51 4c 20 4a 53 4f 4e 20 66 75 6e 63 74 69  ySQL JSON functi
01e0: 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 68  ons:.**.**     h
01f0: 74 74 70 73 3a 2f 2f 64 65 76 2e 6d 79 73 71 6c  ttps://dev.mysql
0200: 2e 63 6f 6d 2f 64 6f 63 2f 72 65 66 6d 61 6e 2f  .com/doc/refman/
0210: 35 2e 37 2f 65 6e 2f 6a 73 6f 6e 2e 68 74 6d 6c  5.7/en/json.html
0220: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 74  .**.** For the t
0230: 69 6d 65 20 62 65 69 6e 67 2c 20 61 6c 6c 20 4a  ime being, all J
0240: 53 4f 4e 20 69 73 20 73 74 6f 72 65 64 20 61 73  SON is stored as
0250: 20 70 75 72 65 20 74 65 78 74 2e 20 20 28 57 65   pure text.  (We
0260: 20 6d 69 67 68 74 20 61 64 64 0a 2a 2a 20 61 20   might add.** a 
0270: 4a 53 4f 4e 42 20 74 79 70 65 20 69 6e 20 74 68  JSONB type in th
0280: 65 20 66 75 74 75 72 65 20 77 68 69 63 68 20 73  e future which s
0290: 74 6f 72 65 73 20 61 20 62 69 6e 61 72 79 20 65  tores a binary e
02a0: 6e 63 6f 64 69 6e 67 20 6f 66 20 4a 53 4f 4e 20  ncoding of JSON 
02b0: 69 6e 0a 2a 2a 20 61 20 42 4c 4f 42 2c 20 62 75  in.** a BLOB, bu
02c0: 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75  t there is no su
02d0: 70 70 6f 72 74 20 66 6f 72 20 4a 53 4f 4e 42 20  pport for JSONB 
02e0: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  in the current i
02f0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a  mplementation..*
0300: 2a 20 54 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74  * This implement
0310: 61 74 69 6f 6e 20 70 61 72 73 65 73 20 4a 53 4f  ation parses JSO
0320: 4e 20 74 65 78 74 20 61 74 20 32 35 30 20 4d 42  N text at 250 MB
0330: 2f 73 2c 20 73 6f 20 69 74 20 69 73 20 68 61 72  /s, so it is har
0340: 64 20 74 6f 20 73 65 65 0a 2a 2a 20 68 6f 77 20  d to see.** how 
0350: 4a 53 4f 4e 42 20 6d 69 67 68 74 20 69 6d 70 72  JSONB might impr
0360: 6f 76 65 20 6f 6e 20 74 68 61 74 2e 29 0a 2a 2f  ove on that.).*/
0370: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
0380: 4c 49 54 45 5f 43 4f 52 45 29 20 7c 7c 20 64 65  LITE_CORE) || de
0390: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
03a0: 42 4c 45 5f 4a 53 4f 4e 31 29 0a 23 69 66 20 21  BLE_JSON1).#if !
03b0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 49 4e  defined(SQLITEIN
03c0: 54 5f 48 29 0a 23 69 6e 63 6c 75 64 65 20 22 73  T_H).#include "s
03d0: 71 6c 69 74 65 33 65 78 74 2e 68 22 0a 23 65 6e  qlite3ext.h".#en
03e0: 64 69 66 0a 53 51 4c 49 54 45 5f 45 58 54 45 4e  dif.SQLITE_EXTEN
03f0: 53 49 4f 4e 5f 49 4e 49 54 31 0a 23 69 6e 63 6c  SION_INIT1.#incl
0400: 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23  ude <assert.h>.#
0410: 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e  include <string.
0420: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  h>.#include <std
0430: 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  lib.h>.#include 
0440: 3c 73 74 64 61 72 67 2e 68 3e 0a 0a 2f 2a 20 4d  <stdarg.h>../* M
0450: 61 72 6b 20 61 20 66 75 6e 63 74 69 6f 6e 20 70  ark a function p
0460: 61 72 61 6d 65 74 65 72 20 61 73 20 75 6e 75 73  arameter as unus
0470: 65 64 2c 20 74 6f 20 73 75 70 70 72 65 73 73 20  ed, to suppress 
0480: 6e 75 69 73 61 6e 63 65 20 63 6f 6d 70 69 6c 65  nuisance compile
0490: 72 0a 2a 2a 20 77 61 72 6e 69 6e 67 73 2e 20 2a  r.** warnings. *
04a0: 2f 0a 23 69 66 6e 64 65 66 20 55 4e 55 53 45 44  /.#ifndef UNUSED
04b0: 5f 50 41 52 41 4d 0a 23 20 64 65 66 69 6e 65 20  _PARAM.# define 
04c0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 58 29 20  UNUSED_PARAM(X) 
04d0: 20 28 76 6f 69 64 29 28 58 29 0a 23 65 6e 64 69   (void)(X).#endi
04e0: 66 0a 0a 23 69 66 6e 64 65 66 20 4c 41 52 47 45  f..#ifndef LARGE
04f0: 53 54 5f 49 4e 54 36 34 0a 23 20 64 65 66 69 6e  ST_INT64.# defin
0500: 65 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 20  e LARGEST_INT64 
0510: 20 28 30 78 66 66 66 66 66 66 66 66 7c 28 28 28   (0xffffffff|(((
0520: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 30 78  sqlite3_int64)0x
0530: 37 66 66 66 66 66 66 66 29 3c 3c 33 32 29 29 0a  7fffffff)<<32)).
0540: 23 20 64 65 66 69 6e 65 20 53 4d 41 4c 4c 45 53  # define SMALLES
0550: 54 5f 49 4e 54 36 34 20 28 28 28 73 71 6c 69 74  T_INT64 (((sqlit
0560: 65 33 5f 69 6e 74 36 34 29 2d 31 29 20 2d 20 4c  e3_int64)-1) - L
0570: 41 52 47 45 53 54 5f 49 4e 54 36 34 29 0a 23 65  ARGEST_INT64).#e
0580: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 73  ndif../*.** Vers
0590: 69 6f 6e 73 20 6f 66 20 69 73 73 70 61 63 65 28  ions of isspace(
05a0: 29 2c 20 69 73 61 6c 6e 75 6d 28 29 20 61 6e 64  ), isalnum() and
05b0: 20 69 73 64 69 67 69 74 28 29 20 74 6f 20 77 68   isdigit() to wh
05c0: 69 63 68 20 69 74 20 69 73 20 73 61 66 65 0a 2a  ich it is safe.*
05d0: 2a 20 74 6f 20 70 61 73 73 20 73 69 67 6e 65 64  * to pass signed
05e0: 20 63 68 61 72 20 76 61 6c 75 65 73 2e 0a 2a 2f   char values..*/
05f0: 0a 23 69 66 64 65 66 20 73 71 6c 69 74 65 33 49  .#ifdef sqlite3I
0600: 73 64 69 67 69 74 0a 20 20 20 2f 2a 20 55 73 65  sdigit.   /* Use
0610: 20 74 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65   the SQLite core
0620: 20 76 65 72 73 69 6f 6e 73 20 69 66 20 74 68 69   versions if thi
0630: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72  s routine is par
0640: 74 20 6f 66 20 74 68 65 0a 20 20 20 2a 2a 20 53  t of the.   ** S
0650: 51 4c 69 74 65 20 61 6d 61 6c 67 61 6d 61 74 69  QLite amalgamati
0660: 6f 6e 20 2a 2f 0a 23 20 20 64 65 66 69 6e 65 20  on */.#  define 
0670: 73 61 66 65 5f 69 73 64 69 67 69 74 28 78 29 20  safe_isdigit(x) 
0680: 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28   sqlite3Isdigit(
0690: 78 29 0a 23 20 20 64 65 66 69 6e 65 20 73 61 66  x).#  define saf
06a0: 65 5f 69 73 61 6c 6e 75 6d 28 78 29 20 20 73 71  e_isalnum(x)  sq
06b0: 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 78 29 0a  lite3Isalnum(x).
06c0: 23 20 20 64 65 66 69 6e 65 20 73 61 66 65 5f 69  #  define safe_i
06d0: 73 78 64 69 67 69 74 28 78 29 20 73 71 6c 69 74  sxdigit(x) sqlit
06e0: 65 33 49 73 78 64 69 67 69 74 28 78 29 0a 23 65  e3Isxdigit(x).#e
06f0: 6c 73 65 0a 20 20 20 2f 2a 20 55 73 65 20 74 68  lse.   /* Use th
0700: 65 20 73 74 61 6e 64 61 72 64 20 6c 69 62 72 61  e standard libra
0710: 72 79 20 66 6f 72 20 73 65 70 61 72 61 74 65 20  ry for separate 
0720: 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 2a 2f 0a 23  compilation */.#
0730: 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68  include <ctype.h
0740: 3e 20 20 2f 2a 20 61 6d 61 6c 67 61 6d 61 74 6f  >  /* amalgamato
0750: 72 3a 20 6b 65 65 70 20 2a 2f 0a 23 20 20 64 65  r: keep */.#  de
0760: 66 69 6e 65 20 73 61 66 65 5f 69 73 64 69 67 69  fine safe_isdigi
0770: 74 28 78 29 20 20 69 73 64 69 67 69 74 28 28 75  t(x)  isdigit((u
0780: 6e 73 69 67 6e 65 64 20 63 68 61 72 29 28 78 29  nsigned char)(x)
0790: 29 0a 23 20 20 64 65 66 69 6e 65 20 73 61 66 65  ).#  define safe
07a0: 5f 69 73 61 6c 6e 75 6d 28 78 29 20 20 69 73 61  _isalnum(x)  isa
07b0: 6c 6e 75 6d 28 28 75 6e 73 69 67 6e 65 64 20 63  lnum((unsigned c
07c0: 68 61 72 29 28 78 29 29 0a 23 20 20 64 65 66 69  har)(x)).#  defi
07d0: 6e 65 20 73 61 66 65 5f 69 73 78 64 69 67 69 74  ne safe_isxdigit
07e0: 28 78 29 20 69 73 78 64 69 67 69 74 28 28 75 6e  (x) isxdigit((un
07f0: 73 69 67 6e 65 64 20 63 68 61 72 29 28 78 29 29  signed char)(x))
0800: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
0810: 72 6f 77 69 6e 67 20 6f 75 72 20 6f 77 6e 20 69  rowing our own i
0820: 73 73 70 61 63 65 28 29 20 72 6f 75 74 69 6e 65  sspace() routine
0830: 20 74 68 69 73 20 77 61 79 20 69 73 20 74 77 69   this way is twi
0840: 63 65 20 61 73 20 66 61 73 74 20 61 73 0a 2a 2a  ce as fast as.**
0850: 20 74 68 65 20 6c 69 62 72 61 72 79 20 69 73 73   the library iss
0860: 70 61 63 65 28 29 20 66 75 6e 63 74 69 6f 6e 2c  pace() function,
0870: 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 20   resulting in a 
0880: 37 25 20 6f 76 65 72 61 6c 6c 20 70 65 72 66 6f  7% overall perfo
0890: 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 63 72 65 61  rmance.** increa
08a0: 73 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65  se for the parse
08b0: 72 2e 20 20 28 55 62 75 6e 74 75 31 34 2e 31 30  r.  (Ubuntu14.10
08c0: 20 67 63 63 20 34 2e 38 2e 34 20 78 36 34 20 77   gcc 4.8.4 x64 w
08d0: 69 74 68 20 2d 4f 73 29 2e 0a 2a 2f 0a 73 74 61  ith -Os)..*/.sta
08e0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6a  tic const char j
08f0: 73 6f 6e 49 73 53 70 61 63 65 5b 5d 20 3d 20 7b  sonIsSpace[] = {
0900: 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  .  0, 0, 0, 0, 0
0910: 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 20 20 30  , 0, 0, 0,     0
0920: 2c 20 31 2c 20 31 2c 20 30 2c 20 30 2c 20 31 2c  , 1, 1, 0, 0, 1,
0930: 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30   0, 0,.  0, 0, 0
0940: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0950: 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c       0, 0, 0, 0,
0960: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 31   0, 0, 0, 0,.  1
0970: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0980: 20 30 2c 20 30 2c 20 20 20 20 20 30 2c 20 30 2c   0, 0,     0, 0,
0990: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
09a0: 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  0,.  0, 0, 0, 0,
09b0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 20   0, 0, 0, 0,    
09c0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
09d0: 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c  0, 0, 0,.  0, 0,
09e0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
09f0: 30 2c 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20  0,     0, 0, 0, 
0a00: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  0, 0, 0, 0, 0,. 
0a10: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0a20: 30 2c 20 30 2c 20 30 2c 20 20 20 20 20 30 2c 20  0, 0, 0,     0, 
0a30: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0a40: 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20  , 0,.  0, 0, 0, 
0a50: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20  0, 0, 0, 0, 0,  
0a60: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
0a70: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20  , 0, 0, 0,.  0, 
0a80: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0a90: 2c 20 30 2c 20 20 20 20 20 30 2c 20 30 2c 20 30  , 0,     0, 0, 0
0aa0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0ab0: 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  .  0, 0, 0, 0, 0
0ac0: 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 20 20 30  , 0, 0, 0,     0
0ad0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0ae0: 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30   0, 0,.  0, 0, 0
0af0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0b00: 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c       0, 0, 0, 0,
0b10: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30   0, 0, 0, 0,.  0
0b20: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0b30: 20 30 2c 20 30 2c 20 20 20 20 20 30 2c 20 30 2c   0, 0,     0, 0,
0b40: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0b50: 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  0,.  0, 0, 0, 0,
0b60: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 20   0, 0, 0, 0,    
0b70: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0b80: 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c  0, 0, 0,.  0, 0,
0b90: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0ba0: 30 2c 20 20 20 20 20 30 2c 20 30 2c 20 30 2c 20  0,     0, 0, 0, 
0bb0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  0, 0, 0, 0, 0,. 
0bc0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
0bd0: 30 2c 20 30 2c 20 30 2c 20 20 20 20 20 30 2c 20  0, 0, 0,     0, 
0be0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0bf0: 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20  , 0,.  0, 0, 0, 
0c00: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20  0, 0, 0, 0, 0,  
0c10: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
0c20: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20  , 0, 0, 0,.  0, 
0c30: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
0c40: 2c 20 30 2c 20 20 20 20 20 30 2c 20 30 2c 20 30  , 0,     0, 0, 0
0c50: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
0c60: 0a 7d 3b 0a 23 64 65 66 69 6e 65 20 73 61 66 65  .};.#define safe
0c70: 5f 69 73 73 70 61 63 65 28 78 29 20 28 6a 73 6f  _isspace(x) (jso
0c80: 6e 49 73 53 70 61 63 65 5b 28 75 6e 73 69 67 6e  nIsSpace[(unsign
0c90: 65 64 20 63 68 61 72 29 78 5d 29 0a 0a 23 69 66  ed char)x])..#if
0ca0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d 41 4c  ndef SQLITE_AMAL
0cb0: 47 41 4d 41 54 49 4f 4e 0a 20 20 2f 2a 20 55 6e  GAMATION.  /* Un
0cc0: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 74  signed integer t
0cd0: 79 70 65 73 2e 20 20 54 68 65 73 65 20 61 72 65  ypes.  These are
0ce0: 20 61 6c 72 65 61 64 79 20 64 65 66 69 6e 65 64   already defined
0cf0: 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 49 6e   in the sqliteIn
0d00: 74 2e 68 2c 0a 20 20 2a 2a 20 62 75 74 20 74 68  t.h,.  ** but th
0d10: 65 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6e 65  e definitions ne
0d20: 65 64 20 74 6f 20 62 65 20 72 65 70 65 61 74 65  ed to be repeate
0d30: 64 20 66 6f 72 20 73 65 70 61 72 61 74 65 20 63  d for separate c
0d40: 6f 6d 70 69 6c 61 74 69 6f 6e 2e 20 2a 2f 0a 20  ompilation. */. 
0d50: 20 74 79 70 65 64 65 66 20 73 71 6c 69 74 65 33   typedef sqlite3
0d60: 5f 75 69 6e 74 36 34 20 75 36 34 3b 0a 20 20 74  _uint64 u64;.  t
0d70: 79 70 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20  ypedef unsigned 
0d80: 69 6e 74 20 75 33 32 3b 0a 20 20 74 79 70 65 64  int u32;.  typed
0d90: 65 66 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72  ef unsigned shor
0da0: 74 20 69 6e 74 20 75 31 36 3b 0a 20 20 74 79 70  t int u16;.  typ
0db0: 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20 63 68  edef unsigned ch
0dc0: 61 72 20 75 38 3b 0a 23 65 6e 64 69 66 0a 0a 2f  ar u8;.#endif../
0dd0: 2a 20 4f 62 6a 65 63 74 73 20 2a 2f 0a 74 79 70  * Objects */.typ
0de0: 65 64 65 66 20 73 74 72 75 63 74 20 4a 73 6f 6e  edef struct Json
0df0: 53 74 72 69 6e 67 20 4a 73 6f 6e 53 74 72 69 6e  String JsonStrin
0e00: 67 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  g;.typedef struc
0e10: 74 20 4a 73 6f 6e 4e 6f 64 65 20 4a 73 6f 6e 4e  t JsonNode JsonN
0e20: 6f 64 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ode;.typedef str
0e30: 75 63 74 20 4a 73 6f 6e 50 61 72 73 65 20 4a 73  uct JsonParse Js
0e40: 6f 6e 50 61 72 73 65 3b 0a 0a 2f 2a 20 41 6e 20  onParse;../* An 
0e50: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
0e60: 20 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e   object represen
0e70: 74 73 20 61 20 4a 53 4f 4e 20 73 74 72 69 6e 67  ts a JSON string
0e80: 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  .** under constr
0e90: 75 63 74 69 6f 6e 2e 20 20 52 65 61 6c 6c 79 2c  uction.  Really,
0ea0: 20 74 68 69 73 20 69 73 20 61 20 67 65 6e 65 72   this is a gener
0eb0: 69 63 20 73 74 72 69 6e 67 20 61 63 63 75 6d 75  ic string accumu
0ec0: 6c 61 74 6f 72 0a 2a 2a 20 74 68 61 74 20 63 61  lator.** that ca
0ed0: 6e 20 62 65 20 61 6e 64 20 69 73 20 75 73 65 64  n be and is used
0ee0: 20 74 6f 20 63 72 65 61 74 65 20 73 74 72 69 6e   to create strin
0ef0: 67 73 20 6f 74 68 65 72 20 74 68 61 6e 20 4a 53  gs other than JS
0f00: 4f 4e 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 4a 73  ON..*/.struct Js
0f10: 6f 6e 53 74 72 69 6e 67 20 7b 0a 20 20 73 71 6c  onString {.  sql
0f20: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
0f30: 74 78 3b 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f  tx;   /* Functio
0f40: 6e 20 63 6f 6e 74 65 78 74 20 2d 20 70 75 74 20  n context - put 
0f50: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 68  error messages h
0f60: 65 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ere */.  char *z
0f70: 42 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Buf;            
0f80: 20 20 2f 2a 20 41 70 70 65 6e 64 20 4a 53 4f 4e    /* Append JSON
0f90: 20 63 6f 6e 74 65 6e 74 20 68 65 72 65 20 2a 2f   content here */
0fa0: 0a 20 20 75 36 34 20 6e 41 6c 6c 6f 63 3b 20 20  .  u64 nAlloc;  
0fb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
0fc0: 79 74 65 73 20 6f 66 20 73 74 6f 72 61 67 65 20  ytes of storage 
0fd0: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 7a 42 75  available in zBu
0fe0: 66 5b 5d 20 2a 2f 0a 20 20 75 36 34 20 6e 55 73  f[] */.  u64 nUs
0ff0: 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
1000: 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 7a 42    /* Bytes of zB
1010: 75 66 5b 5d 20 63 75 72 72 65 6e 74 6c 79 20 75  uf[] currently u
1020: 73 65 64 20 2a 2f 0a 20 20 75 38 20 62 53 74 61  sed */.  u8 bSta
1030: 74 69 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  tic;            
1040: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 7a 42 75    /* True if zBu
1050: 66 20 69 73 20 73 74 61 74 69 63 20 73 70 61 63  f is static spac
1060: 65 20 2a 2f 0a 20 20 75 38 20 62 45 72 72 3b 20  e */.  u8 bErr; 
1070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1080: 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 65 72  /* True if an er
1090: 72 6f 72 20 68 61 73 20 62 65 65 6e 20 65 6e 63  ror has been enc
10a0: 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20 63 68  ountered */.  ch
10b0: 61 72 20 7a 53 70 61 63 65 5b 31 30 30 5d 3b 20  ar zSpace[100]; 
10c0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
10d0: 6c 20 73 74 61 74 69 63 20 73 70 61 63 65 20 2a  l static space *
10e0: 2f 0a 7d 3b 0a 0a 2f 2a 20 4a 53 4f 4e 20 74 79  /.};../* JSON ty
10f0: 70 65 20 76 61 6c 75 65 73 0a 2a 2f 0a 23 64 65  pe values.*/.#de
1100: 66 69 6e 65 20 4a 53 4f 4e 5f 4e 55 4c 4c 20 20  fine JSON_NULL  
1110: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 4a 53 4f     0.#define JSO
1120: 4e 5f 54 52 55 45 20 20 20 20 20 31 0a 23 64 65  N_TRUE     1.#de
1130: 66 69 6e 65 20 4a 53 4f 4e 5f 46 41 4c 53 45 20  fine JSON_FALSE 
1140: 20 20 20 32 0a 23 64 65 66 69 6e 65 20 4a 53 4f     2.#define JSO
1150: 4e 5f 49 4e 54 20 20 20 20 20 20 33 0a 23 64 65  N_INT      3.#de
1160: 66 69 6e 65 20 4a 53 4f 4e 5f 52 45 41 4c 20 20  fine JSON_REAL  
1170: 20 20 20 34 0a 23 64 65 66 69 6e 65 20 4a 53 4f     4.#define JSO
1180: 4e 5f 53 54 52 49 4e 47 20 20 20 35 0a 23 64 65  N_STRING   5.#de
1190: 66 69 6e 65 20 4a 53 4f 4e 5f 41 52 52 41 59 20  fine JSON_ARRAY 
11a0: 20 20 20 36 0a 23 64 65 66 69 6e 65 20 4a 53 4f     6.#define JSO
11b0: 4e 5f 4f 42 4a 45 43 54 20 20 20 37 0a 0a 2f 2a  N_OBJECT   7../*
11c0: 20 54 68 65 20 22 73 75 62 74 79 70 65 22 20 73   The "subtype" s
11d0: 65 74 20 66 6f 72 20 4a 53 4f 4e 20 76 61 6c 75  et for JSON valu
11e0: 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 53  es */.#define JS
11f0: 4f 4e 5f 53 55 42 54 59 50 45 20 20 37 34 20 20  ON_SUBTYPE  74  
1200: 20 20 2f 2a 20 41 73 63 69 69 20 66 6f 72 20 22    /* Ascii for "
1210: 4a 22 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d  J" */../*.** Nam
1220: 65 73 20 6f 66 20 74 68 65 20 76 61 72 69 6f 75  es of the variou
1230: 73 20 4a 53 4f 4e 20 74 79 70 65 73 3a 0a 2a 2f  s JSON types:.*/
1240: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
1250: 61 72 20 2a 20 63 6f 6e 73 74 20 6a 73 6f 6e 54  ar * const jsonT
1260: 79 70 65 5b 5d 20 3d 20 7b 0a 20 20 22 6e 75 6c  ype[] = {.  "nul
1270: 6c 22 2c 20 22 74 72 75 65 22 2c 20 22 66 61 6c  l", "true", "fal
1280: 73 65 22 2c 20 22 69 6e 74 65 67 65 72 22 2c 20  se", "integer", 
1290: 22 72 65 61 6c 22 2c 20 22 74 65 78 74 22 2c 20  "real", "text", 
12a0: 22 61 72 72 61 79 22 2c 20 22 6f 62 6a 65 63 74  "array", "object
12b0: 22 0a 7d 3b 0a 0a 2f 2a 20 42 69 74 20 76 61 6c  ".};../* Bit val
12c0: 75 65 73 20 66 6f 72 20 74 68 65 20 4a 73 6f 6e  ues for the Json
12d0: 4e 6f 64 65 2e 6a 6e 46 6c 61 67 20 66 69 65 6c  Node.jnFlag fiel
12e0: 64 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4e 4f  d.*/.#define JNO
12f0: 44 45 5f 52 41 57 20 20 20 20 20 30 78 30 31 20  DE_RAW     0x01 
1300: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
1310: 6e 74 20 69 73 20 72 61 77 2c 20 6e 6f 74 20 4a  nt is raw, not J
1320: 53 4f 4e 20 65 6e 63 6f 64 65 64 20 2a 2f 0a 23  SON encoded */.#
1330: 64 65 66 69 6e 65 20 4a 4e 4f 44 45 5f 45 53 43  define JNODE_ESC
1340: 41 50 45 20 20 30 78 30 32 20 20 20 20 20 20 20  APE  0x02       
1350: 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 69 73 20    /* Content is 
1360: 74 65 78 74 20 77 69 74 68 20 5c 20 65 73 63 61  text with \ esca
1370: 70 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4a  pes */.#define J
1380: 4e 4f 44 45 5f 52 45 4d 4f 56 45 20 20 30 78 30  NODE_REMOVE  0x0
1390: 34 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20  4         /* Do 
13a0: 6e 6f 74 20 6f 75 74 70 75 74 20 2a 2f 0a 23 64  not output */.#d
13b0: 65 66 69 6e 65 20 4a 4e 4f 44 45 5f 52 45 50 4c  efine JNODE_REPL
13c0: 41 43 45 20 30 78 30 38 20 20 20 20 20 20 20 20  ACE 0x08        
13d0: 20 2f 2a 20 52 65 70 6c 61 63 65 20 77 69 74 68   /* Replace with
13e0: 20 4a 73 6f 6e 4e 6f 64 65 2e 75 2e 69 52 65 70   JsonNode.u.iRep
13f0: 6c 61 63 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  lace */.#define 
1400: 4a 4e 4f 44 45 5f 50 41 54 43 48 20 20 20 30 78  JNODE_PATCH   0x
1410: 31 30 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  10         /* Pa
1420: 74 63 68 20 77 69 74 68 20 4a 73 6f 6e 4e 6f 64  tch with JsonNod
1430: 65 2e 75 2e 70 50 61 74 63 68 20 2a 2f 0a 23 64  e.u.pPatch */.#d
1440: 65 66 69 6e 65 20 4a 4e 4f 44 45 5f 41 50 50 45  efine JNODE_APPE
1450: 4e 44 20 20 30 78 32 30 20 20 20 20 20 20 20 20  ND  0x20        
1460: 20 2f 2a 20 4d 6f 72 65 20 41 52 52 41 59 2f 4f   /* More ARRAY/O
1470: 42 4a 45 43 54 20 65 6e 74 72 69 65 73 20 61 74  BJECT entries at
1480: 20 75 2e 69 41 70 70 65 6e 64 20 2a 2f 0a 23 64   u.iAppend */.#d
1490: 65 66 69 6e 65 20 4a 4e 4f 44 45 5f 4c 41 42 45  efine JNODE_LABE
14a0: 4c 20 20 20 30 78 34 30 20 20 20 20 20 20 20 20  L   0x40        
14b0: 20 2f 2a 20 49 73 20 61 20 6c 61 62 65 6c 20 6f   /* Is a label o
14c0: 66 20 61 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a  f an object */..
14d0: 0a 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6e 6f 64  ./* A single nod
14e0: 65 20 6f 66 20 70 61 72 73 65 64 20 4a 53 4f 4e  e of parsed JSON
14f0: 0a 2a 2f 0a 73 74 72 75 63 74 20 4a 73 6f 6e 4e  .*/.struct JsonN
1500: 6f 64 65 20 7b 0a 20 20 75 38 20 65 54 79 70 65  ode {.  u8 eType
1510: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1520: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 4a 53 4f  * One of the JSO
1530: 4e 5f 20 74 79 70 65 20 76 61 6c 75 65 73 20 2a  N_ type values *
1540: 2f 0a 20 20 75 38 20 6a 6e 46 6c 61 67 73 3b 20  /.  u8 jnFlags; 
1550: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 4e             /* JN
1560: 4f 44 45 20 66 6c 61 67 73 20 2a 2f 0a 20 20 75  ODE flags */.  u
1570: 33 32 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  32 n;           
1580: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
1590: 66 20 63 6f 6e 74 65 6e 74 2c 20 6f 72 20 6e 75  f content, or nu
15a0: 6d 62 65 72 20 6f 66 20 73 75 62 2d 6e 6f 64 65  mber of sub-node
15b0: 73 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20  s */.  union {. 
15c0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
15d0: 4a 43 6f 6e 74 65 6e 74 3b 20 2f 2a 20 43 6f 6e  JContent; /* Con
15e0: 74 65 6e 74 20 66 6f 72 20 49 4e 54 2c 20 52 45  tent for INT, RE
15f0: 41 4c 2c 20 61 6e 64 20 53 54 52 49 4e 47 20 2a  AL, and STRING *
1600: 2f 0a 20 20 20 20 75 33 32 20 69 41 70 70 65 6e  /.    u32 iAppen
1610: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
1620: 4d 6f 72 65 20 74 65 72 6d 73 20 66 6f 72 20 41  More terms for A
1630: 52 52 41 59 20 61 6e 64 20 4f 42 4a 45 43 54 20  RRAY and OBJECT 
1640: 2a 2f 0a 20 20 20 20 75 33 32 20 69 4b 65 79 3b  */.    u32 iKey;
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1660: 20 4b 65 79 20 66 6f 72 20 41 52 52 41 59 20 6f   Key for ARRAY o
1670: 62 6a 65 63 74 73 20 69 6e 20 6a 73 6f 6e 5f 74  bjects in json_t
1680: 72 65 65 28 29 20 2a 2f 0a 20 20 20 20 75 33 32  ree() */.    u32
1690: 20 69 52 65 70 6c 61 63 65 3b 20 20 20 20 20 20   iReplace;      
16a0: 20 20 20 20 2f 2a 20 52 65 70 6c 61 63 65 6d 65      /* Replaceme
16b0: 6e 74 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 4a  nt content for J
16c0: 4e 4f 44 45 5f 52 45 50 4c 41 43 45 20 2a 2f 0a  NODE_REPLACE */.
16d0: 20 20 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 50      JsonNode *pP
16e0: 61 74 63 68 3b 20 20 20 20 20 20 2f 2a 20 4e 6f  atch;      /* No
16f0: 64 65 20 63 68 61 69 6e 20 6f 66 20 70 61 74 63  de chain of patc
1700: 68 20 66 6f 72 20 4a 4e 4f 44 45 5f 50 41 54 43  h for JNODE_PATC
1710: 48 20 2a 2f 0a 20 20 7d 20 75 3b 0a 7d 3b 0a 0a  H */.  } u;.};..
1720: 2f 2a 20 41 20 63 6f 6d 70 6c 65 74 65 6c 79 20  /* A completely 
1730: 70 61 72 73 65 64 20 4a 53 4f 4e 20 73 74 72 69  parsed JSON stri
1740: 6e 67 0a 2a 2f 0a 73 74 72 75 63 74 20 4a 73 6f  ng.*/.struct Jso
1750: 6e 50 61 72 73 65 20 7b 0a 20 20 75 33 32 20 6e  nParse {.  u32 n
1760: 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Node;         /*
1770: 20 4e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73   Number of slots
1780: 20 6f 66 20 61 4e 6f 64 65 5b 5d 20 75 73 65 64   of aNode[] used
1790: 20 2a 2f 0a 20 20 75 33 32 20 6e 41 6c 6c 6f 63   */.  u32 nAlloc
17a0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ;        /* Numb
17b0: 65 72 20 6f 66 20 73 6c 6f 74 73 20 6f 66 20 61  er of slots of a
17c0: 4e 6f 64 65 5b 5d 20 61 6c 6c 6f 63 61 74 65 64  Node[] allocated
17d0: 20 2a 2f 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a   */.  JsonNode *
17e0: 61 4e 6f 64 65 3b 20 20 20 2f 2a 20 41 72 72 61  aNode;   /* Arra
17f0: 79 20 6f 66 20 6e 6f 64 65 73 20 63 6f 6e 74 61  y of nodes conta
1800: 69 6e 69 6e 67 20 74 68 65 20 70 61 72 73 65 20  ining the parse 
1810: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1820: 2a 7a 4a 73 6f 6e 3b 20 2f 2a 20 4f 72 69 67 69  *zJson; /* Origi
1830: 6e 61 6c 20 4a 53 4f 4e 20 73 74 72 69 6e 67 20  nal JSON string 
1840: 2a 2f 0a 20 20 75 33 32 20 2a 61 55 70 3b 20 20  */.  u32 *aUp;  
1850: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1860: 20 6f 66 20 70 61 72 65 6e 74 20 6f 66 20 65 61   of parent of ea
1870: 63 68 20 6e 6f 64 65 20 2a 2f 0a 20 20 75 38 20  ch node */.  u8 
1880: 6f 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  oom;            
1890: 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20 69  /* Set to true i
18a0: 66 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20  f out of memory 
18b0: 2a 2f 0a 20 20 75 38 20 6e 45 72 72 3b 20 20 20  */.  u8 nErr;   
18c0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
18d0: 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e  r of errors seen
18e0: 20 2a 2f 0a 20 20 75 31 36 20 69 44 65 70 74 68   */.  u16 iDepth
18f0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 73 74  ;        /* Nest
1900: 69 6e 67 20 64 65 70 74 68 20 2a 2f 0a 20 20 69  ing depth */.  i
1910: 6e 74 20 6e 4a 73 6f 6e 3b 20 20 20 20 20 20 20  nt nJson;       
1920: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74    /* Length of t
1930: 68 65 20 7a 4a 73 6f 6e 20 73 74 72 69 6e 67 20  he zJson string 
1940: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 7d 3b 0a 0a  in bytes */.};..
1950: 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 6e 65  /*.** Maximum ne
1960: 73 74 69 6e 67 20 64 65 70 74 68 20 6f 66 20 4a  sting depth of J
1970: 53 4f 4e 20 66 6f 72 20 74 68 69 73 20 69 6d 70  SON for this imp
1980: 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2a 0a  lementation..**.
1990: 2a 2a 20 54 68 69 73 20 6c 69 6d 69 74 20 69 73  ** This limit is
19a0: 20 6e 65 65 64 65 64 20 74 6f 20 61 76 6f 69 64   needed to avoid
19b0: 20 61 20 73 74 61 63 6b 20 6f 76 65 72 66 6c 6f   a stack overflo
19c0: 77 20 69 6e 20 74 68 65 20 72 65 63 75 72 73 69  w in the recursi
19d0: 76 65 0a 2a 2a 20 64 65 73 63 65 6e 74 20 70 61  ve.** descent pa
19e0: 72 73 65 72 2e 20 20 41 20 64 65 70 74 68 20 6f  rser.  A depth o
19f0: 66 20 32 30 30 30 20 69 73 20 66 61 72 20 64 65  f 2000 is far de
1a00: 65 70 65 72 20 74 68 61 6e 20 61 6e 79 20 73 61  eper than any sa
1a10: 6e 65 20 4a 53 4f 4e 0a 2a 2a 20 73 68 6f 75 6c  ne JSON.** shoul
1a20: 64 20 67 6f 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  d go..*/.#define
1a30: 20 4a 53 4f 4e 5f 4d 41 58 5f 44 45 50 54 48 20   JSON_MAX_DEPTH 
1a40: 20 32 30 30 30 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   2000../********
1a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a90: 2a 2a 0a 2a 2a 20 55 74 69 6c 69 74 79 20 72 6f  **.** Utility ro
1aa0: 75 74 69 6e 65 73 20 66 6f 72 20 64 65 61 6c 69  utines for deali
1ab0: 6e 67 20 77 69 74 68 20 4a 73 6f 6e 53 74 72 69  ng with JsonStri
1ac0: 6e 67 20 6f 62 6a 65 63 74 73 0a 2a 2a 2a 2a 2a  ng objects.*****
1ad0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1af0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b10: 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 20 53 65 74 20 74  *****/../* Set t
1b20: 68 65 20 4a 73 6f 6e 53 74 72 69 6e 67 20 6f 62  he JsonString ob
1b30: 6a 65 63 74 20 74 6f 20 61 6e 20 65 6d 70 74 79  ject to an empty
1b40: 20 73 74 72 69 6e 67 0a 2a 2f 0a 73 74 61 74 69   string.*/.stati
1b50: 63 20 76 6f 69 64 20 6a 73 6f 6e 5a 65 72 6f 28  c void jsonZero(
1b60: 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70 29 7b 0a  JsonString *p){.
1b70: 20 20 70 2d 3e 7a 42 75 66 20 3d 20 70 2d 3e 7a    p->zBuf = p->z
1b80: 53 70 61 63 65 3b 0a 20 20 70 2d 3e 6e 41 6c 6c  Space;.  p->nAll
1b90: 6f 63 20 3d 20 73 69 7a 65 6f 66 28 70 2d 3e 7a  oc = sizeof(p->z
1ba0: 53 70 61 63 65 29 3b 0a 20 20 70 2d 3e 6e 55 73  Space);.  p->nUs
1bb0: 65 64 20 3d 20 30 3b 0a 20 20 70 2d 3e 62 53 74  ed = 0;.  p->bSt
1bc0: 61 74 69 63 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 20  atic = 1;.}../* 
1bd0: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4a  Initialize the J
1be0: 73 6f 6e 53 74 72 69 6e 67 20 6f 62 6a 65 63 74  sonString object
1bf0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1c00: 6a 73 6f 6e 49 6e 69 74 28 4a 73 6f 6e 53 74 72  jsonInit(JsonStr
1c10: 69 6e 67 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f  ing *p, sqlite3_
1c20: 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 29 7b 0a  context *pCtx){.
1c30: 20 20 70 2d 3e 70 43 74 78 20 3d 20 70 43 74 78    p->pCtx = pCtx
1c40: 3b 0a 20 20 70 2d 3e 62 45 72 72 20 3d 20 30 3b  ;.  p->bErr = 0;
1c50: 0a 20 20 6a 73 6f 6e 5a 65 72 6f 28 70 29 3b 0a  .  jsonZero(p);.
1c60: 7d 0a 0a 0a 2f 2a 20 46 72 65 65 20 61 6c 6c 20  }.../* Free all 
1c70: 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79  allocated memory
1c80: 20 61 6e 64 20 72 65 73 65 74 20 74 68 65 20 4a   and reset the J
1c90: 73 6f 6e 53 74 72 69 6e 67 20 6f 62 6a 65 63 74  sonString object
1ca0: 20 62 61 63 6b 20 74 6f 20 69 74 73 0a 2a 2a 20   back to its.** 
1cb0: 69 6e 69 74 69 61 6c 20 73 74 61 74 65 2e 0a 2a  initial state..*
1cc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73  /.static void js
1cd0: 6f 6e 52 65 73 65 74 28 4a 73 6f 6e 53 74 72 69  onReset(JsonStri
1ce0: 6e 67 20 2a 70 29 7b 0a 20 20 69 66 28 20 21 70  ng *p){.  if( !p
1cf0: 2d 3e 62 53 74 61 74 69 63 20 29 20 73 71 6c 69  ->bStatic ) sqli
1d00: 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 42 75 66  te3_free(p->zBuf
1d10: 29 3b 0a 20 20 6a 73 6f 6e 5a 65 72 6f 28 70 29  );.  jsonZero(p)
1d20: 3b 0a 7d 0a 0a 0a 2f 2a 20 52 65 70 6f 72 74 20  ;.}.../* Report 
1d30: 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79  an out-of-memory
1d40: 20 28 4f 4f 4d 29 20 63 6f 6e 64 69 74 69 6f 6e   (OOM) condition
1d50: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64   .*/.static void
1d60: 20 6a 73 6f 6e 4f 6f 6d 28 4a 73 6f 6e 53 74 72   jsonOom(JsonStr
1d70: 69 6e 67 20 2a 70 29 7b 0a 20 20 70 2d 3e 62 45  ing *p){.  p->bE
1d80: 72 72 20 3d 20 31 3b 0a 20 20 73 71 6c 69 74 65  rr = 1;.  sqlite
1d90: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e  3_result_error_n
1da0: 6f 6d 65 6d 28 70 2d 3e 70 43 74 78 29 3b 0a 20  omem(p->pCtx);. 
1db0: 20 6a 73 6f 6e 52 65 73 65 74 28 70 29 3b 0a 7d   jsonReset(p);.}
1dc0: 0a 0a 2f 2a 20 45 6e 6c 61 72 67 65 20 70 4a 73  ../* Enlarge pJs
1dd0: 6f 6e 2d 3e 7a 42 75 66 20 73 6f 20 74 68 61 74  on->zBuf so that
1de0: 20 69 74 20 63 61 6e 20 68 6f 6c 64 20 61 74 20   it can hold at 
1df0: 6c 65 61 73 74 20 4e 20 6d 6f 72 65 20 62 79 74  least N more byt
1e00: 65 73 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 7a 65  es..** Return ze
1e10: 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ro on success.  
1e20: 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
1e30: 6f 6e 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 0a  on an OOM error.
1e40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 73  */.static int js
1e50: 6f 6e 47 72 6f 77 28 4a 73 6f 6e 53 74 72 69 6e  onGrow(JsonStrin
1e60: 67 20 2a 70 2c 20 75 33 32 20 4e 29 7b 0a 20 20  g *p, u32 N){.  
1e70: 75 36 34 20 6e 54 6f 74 61 6c 20 3d 20 4e 3c 70  u64 nTotal = N<p
1e80: 2d 3e 6e 41 6c 6c 6f 63 20 3f 20 70 2d 3e 6e 41  ->nAlloc ? p->nA
1e90: 6c 6c 6f 63 2a 32 20 3a 20 70 2d 3e 6e 41 6c 6c  lloc*2 : p->nAll
1ea0: 6f 63 2b 4e 2b 31 30 3b 0a 20 20 63 68 61 72 20  oc+N+10;.  char 
1eb0: 2a 7a 4e 65 77 3b 0a 20 20 69 66 28 20 70 2d 3e  *zNew;.  if( p->
1ec0: 62 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 69  bStatic ){.    i
1ed0: 66 28 20 70 2d 3e 62 45 72 72 20 29 20 72 65 74  f( p->bErr ) ret
1ee0: 75 72 6e 20 31 3b 0a 20 20 20 20 7a 4e 65 77 20  urn 1;.    zNew 
1ef0: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
1f00: 36 34 28 6e 54 6f 74 61 6c 29 3b 0a 20 20 20 20  64(nTotal);.    
1f10: 69 66 28 20 7a 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( zNew==0 ){. 
1f20: 20 20 20 20 20 6a 73 6f 6e 4f 6f 6d 28 70 29 3b       jsonOom(p);
1f30: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1f40: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1f50: 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 4e 65  }.    memcpy(zNe
1f60: 77 2c 20 70 2d 3e 7a 42 75 66 2c 20 28 73 69 7a  w, p->zBuf, (siz
1f70: 65 5f 74 29 70 2d 3e 6e 55 73 65 64 29 3b 0a 20  e_t)p->nUsed);. 
1f80: 20 20 20 70 2d 3e 7a 42 75 66 20 3d 20 7a 4e 65     p->zBuf = zNe
1f90: 77 3b 0a 20 20 20 20 70 2d 3e 62 53 74 61 74 69  w;.    p->bStati
1fa0: 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  c = 0;.  }else{.
1fb0: 20 20 20 20 7a 4e 65 77 20 3d 20 73 71 6c 69 74      zNew = sqlit
1fc0: 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 2d 3e  e3_realloc64(p->
1fd0: 7a 42 75 66 2c 20 6e 54 6f 74 61 6c 29 3b 0a 20  zBuf, nTotal);. 
1fe0: 20 20 20 69 66 28 20 7a 4e 65 77 3d 3d 30 20 29     if( zNew==0 )
1ff0: 7b 0a 20 20 20 20 20 20 6a 73 6f 6e 4f 6f 6d 28  {.      jsonOom(
2000: 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  p);.      return
2010: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2020: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 7a 42 75 66     }.    p->zBuf
2030: 20 3d 20 7a 4e 65 77 3b 0a 20 20 7d 0a 20 20 70   = zNew;.  }.  p
2040: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 54 6f 74 61  ->nAlloc = nTota
2050: 6c 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  l;.  return SQLI
2060: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 41 70 70  TE_OK;.}../* App
2070: 65 6e 64 20 4e 20 62 79 74 65 73 20 66 72 6f 6d  end N bytes from
2080: 20 7a 49 6e 20 6f 6e 74 6f 20 74 68 65 20 65 6e   zIn onto the en
2090: 64 20 6f 66 20 74 68 65 20 4a 73 6f 6e 53 74 72  d of the JsonStr
20a0: 69 6e 67 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73  ing string..*/.s
20b0: 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 41  tatic void jsonA
20c0: 70 70 65 6e 64 52 61 77 28 4a 73 6f 6e 53 74 72  ppendRaw(JsonStr
20d0: 69 6e 67 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  ing *p, const ch
20e0: 61 72 20 2a 7a 49 6e 2c 20 75 33 32 20 4e 29 7b  ar *zIn, u32 N){
20f0: 0a 20 20 69 66 28 20 28 4e 2b 70 2d 3e 6e 55 73  .  if( (N+p->nUs
2100: 65 64 20 3e 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 29  ed >= p->nAlloc)
2110: 20 26 26 20 6a 73 6f 6e 47 72 6f 77 28 70 2c 4e   && jsonGrow(p,N
2120: 29 21 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )!=0 ) return;. 
2130: 20 6d 65 6d 63 70 79 28 70 2d 3e 7a 42 75 66 2b   memcpy(p->zBuf+
2140: 70 2d 3e 6e 55 73 65 64 2c 20 7a 49 6e 2c 20 4e  p->nUsed, zIn, N
2150: 29 3b 0a 20 20 70 2d 3e 6e 55 73 65 64 20 2b 3d  );.  p->nUsed +=
2160: 20 4e 3b 0a 7d 0a 0a 2f 2a 20 41 70 70 65 6e 64   N;.}../* Append
2170: 20 66 6f 72 6d 61 74 74 65 64 20 74 65 78 74 20   formatted text 
2180: 28 6e 6f 74 20 74 6f 20 65 78 63 65 65 64 20 4e  (not to exceed N
2190: 20 62 79 74 65 73 29 20 74 6f 20 74 68 65 20 4a   bytes) to the J
21a0: 73 6f 6e 53 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74  sonString..*/.st
21b0: 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 50 72  atic void jsonPr
21c0: 69 6e 74 66 28 69 6e 74 20 4e 2c 20 4a 73 6f 6e  intf(int N, Json
21d0: 53 74 72 69 6e 67 20 2a 70 2c 20 63 6f 6e 73 74  String *p, const
21e0: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
21f0: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
2200: 61 70 3b 0a 20 20 69 66 28 20 28 70 2d 3e 6e 55  ap;.  if( (p->nU
2210: 73 65 64 20 2b 20 4e 20 3e 3d 20 70 2d 3e 6e 41  sed + N >= p->nA
2220: 6c 6c 6f 63 29 20 26 26 20 6a 73 6f 6e 47 72 6f  lloc) && jsonGro
2230: 77 28 70 2c 20 4e 29 20 29 20 72 65 74 75 72 6e  w(p, N) ) return
2240: 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ;.  va_start(ap,
2250: 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 73 71 6c   zFormat);.  sql
2260: 69 74 65 33 5f 76 73 6e 70 72 69 6e 74 66 28 4e  ite3_vsnprintf(N
2270: 2c 20 70 2d 3e 7a 42 75 66 2b 70 2d 3e 6e 55 73  , p->zBuf+p->nUs
2280: 65 64 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  ed, zFormat, ap)
2290: 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  ;.  va_end(ap);.
22a0: 20 20 70 2d 3e 6e 55 73 65 64 20 2b 3d 20 28 69    p->nUsed += (i
22b0: 6e 74 29 73 74 72 6c 65 6e 28 70 2d 3e 7a 42 75  nt)strlen(p->zBu
22c0: 66 2b 70 2d 3e 6e 55 73 65 64 29 3b 0a 7d 0a 0a  f+p->nUsed);.}..
22d0: 2f 2a 20 41 70 70 65 6e 64 20 61 20 73 69 6e 67  /* Append a sing
22e0: 6c 65 20 63 68 61 72 61 63 74 65 72 0a 2a 2f 0a  le character.*/.
22f0: 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e  static void json
2300: 41 70 70 65 6e 64 43 68 61 72 28 4a 73 6f 6e 53  AppendChar(JsonS
2310: 74 72 69 6e 67 20 2a 70 2c 20 63 68 61 72 20 63  tring *p, char c
2320: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6e 55 73 65  ){.  if( p->nUse
2330: 64 3e 3d 70 2d 3e 6e 41 6c 6c 6f 63 20 26 26 20  d>=p->nAlloc && 
2340: 6a 73 6f 6e 47 72 6f 77 28 70 2c 31 29 21 3d 30  jsonGrow(p,1)!=0
2350: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 2d 3e   ) return;.  p->
2360: 7a 42 75 66 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d  zBuf[p->nUsed++]
2370: 20 3d 20 63 3b 0a 7d 0a 0a 2f 2a 20 41 70 70 65   = c;.}../* Appe
2380: 6e 64 20 61 20 63 6f 6d 6d 61 20 73 65 70 61 72  nd a comma separ
2390: 61 74 6f 72 20 74 6f 20 74 68 65 20 6f 75 74 70  ator to the outp
23a0: 75 74 20 62 75 66 66 65 72 2c 20 69 66 20 74 68  ut buffer, if th
23b0: 65 20 70 72 65 76 69 6f 75 73 0a 2a 2a 20 63 68  e previous.** ch
23c0: 61 72 61 63 74 65 72 20 69 73 20 6e 6f 74 20 27  aracter is not '
23d0: 5b 27 20 6f 72 20 27 7b 27 2e 0a 2a 2f 0a 73 74  [' or '{'..*/.st
23e0: 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 41 70  atic void jsonAp
23f0: 70 65 6e 64 53 65 70 61 72 61 74 6f 72 28 4a 73  pendSeparator(Js
2400: 6f 6e 53 74 72 69 6e 67 20 2a 70 29 7b 0a 20 20  onString *p){.  
2410: 63 68 61 72 20 63 3b 0a 20 20 69 66 28 20 70 2d  char c;.  if( p-
2420: 3e 6e 55 73 65 64 3d 3d 30 20 29 20 72 65 74 75  >nUsed==0 ) retu
2430: 72 6e 3b 0a 20 20 63 20 3d 20 70 2d 3e 7a 42 75  rn;.  c = p->zBu
2440: 66 5b 70 2d 3e 6e 55 73 65 64 2d 31 5d 3b 0a 20  f[p->nUsed-1];. 
2450: 20 69 66 28 20 63 21 3d 27 5b 27 20 26 26 20 63   if( c!='[' && c
2460: 21 3d 27 7b 27 20 29 20 6a 73 6f 6e 41 70 70 65  !='{' ) jsonAppe
2470: 6e 64 43 68 61 72 28 70 2c 20 27 2c 27 29 3b 0a  ndChar(p, ',');.
2480: 7d 0a 0a 2f 2a 20 41 70 70 65 6e 64 20 74 68 65  }../* Append the
2490: 20 4e 2d 62 79 74 65 20 73 74 72 69 6e 67 20 69   N-byte string i
24a0: 6e 20 7a 49 6e 20 74 6f 20 74 68 65 20 65 6e 64  n zIn to the end
24b0: 20 6f 66 20 74 68 65 20 4a 73 6f 6e 53 74 72 69   of the JsonStri
24c0: 6e 67 20 73 74 72 69 6e 67 0a 2a 2a 20 75 6e 64  ng string.** und
24d0: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
24e0: 20 20 45 6e 63 6c 6f 73 65 20 74 68 65 20 73 74    Enclose the st
24f0: 72 69 6e 67 20 69 6e 20 22 2e 2e 2e 22 20 61 6e  ring in "..." an
2500: 64 20 65 73 63 61 70 65 0a 2a 2a 20 61 6e 79 20  d escape.** any 
2510: 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 20 6f 72  double-quotes or
2520: 20 62 61 63 6b 73 6c 61 73 68 20 63 68 61 72 61   backslash chara
2530: 63 74 65 72 73 20 63 6f 6e 74 61 69 6e 65 64 20  cters contained 
2540: 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20 73 74  within the.** st
2550: 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ring..*/.static 
2560: 76 6f 69 64 20 6a 73 6f 6e 41 70 70 65 6e 64 53  void jsonAppendS
2570: 74 72 69 6e 67 28 4a 73 6f 6e 53 74 72 69 6e 67  tring(JsonString
2580: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
2590: 2a 7a 49 6e 2c 20 75 33 32 20 4e 29 7b 0a 20 20  *zIn, u32 N){.  
25a0: 75 33 32 20 69 3b 0a 20 20 69 66 28 20 28 4e 2b  u32 i;.  if( (N+
25b0: 70 2d 3e 6e 55 73 65 64 2b 32 20 3e 3d 20 70 2d  p->nUsed+2 >= p-
25c0: 3e 6e 41 6c 6c 6f 63 29 20 26 26 20 6a 73 6f 6e  >nAlloc) && json
25d0: 47 72 6f 77 28 70 2c 4e 2b 32 29 21 3d 30 20 29  Grow(p,N+2)!=0 )
25e0: 20 72 65 74 75 72 6e 3b 0a 20 20 70 2d 3e 7a 42   return;.  p->zB
25f0: 75 66 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d  uf[p->nUsed++] =
2600: 20 27 22 27 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   '"';.  for(i=0;
2610: 20 69 3c 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<N; i++){.    
2620: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 20  unsigned char c 
2630: 3d 20 28 28 75 6e 73 69 67 6e 65 64 20 63 6f 6e  = ((unsigned con
2640: 73 74 20 63 68 61 72 2a 29 7a 49 6e 29 5b 69 5d  st char*)zIn)[i]
2650: 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 22 27  ;.    if( c=='"'
2660: 20 7c 7c 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20   || c=='\\' ){. 
2670: 20 20 20 20 20 6a 73 6f 6e 5f 73 69 6d 70 6c 65       json_simple
2680: 5f 65 73 63 61 70 65 3a 0a 20 20 20 20 20 20 69  _escape:.      i
2690: 66 28 20 28 70 2d 3e 6e 55 73 65 64 2b 4e 2b 33  f( (p->nUsed+N+3
26a0: 2d 69 20 3e 20 70 2d 3e 6e 41 6c 6c 6f 63 29 20  -i > p->nAlloc) 
26b0: 26 26 20 6a 73 6f 6e 47 72 6f 77 28 70 2c 4e 2b  && jsonGrow(p,N+
26c0: 33 2d 69 29 21 3d 30 20 29 20 72 65 74 75 72 6e  3-i)!=0 ) return
26d0: 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 42 75 66 5b  ;.      p->zBuf[
26e0: 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d 20 27 5c  p->nUsed++] = '\
26f0: 5c 27 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  \';.    }else if
2700: 28 20 63 3c 3d 30 78 31 66 20 29 7b 0a 20 20 20  ( c<=0x1f ){.   
2710: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
2720: 63 68 61 72 20 61 53 70 65 63 69 61 6c 5b 5d 20  char aSpecial[] 
2730: 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 30 2c 20  = {.         0, 
2740: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
2750: 2c 20 30 2c 20 27 62 27 2c 20 27 74 27 2c 20 27  , 0, 'b', 't', '
2760: 6e 27 2c 20 30 2c 20 27 66 27 2c 20 27 72 27 2c  n', 0, 'f', 'r',
2770: 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
2780: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
2790: 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 20 20 30  , 0, 0,   0,   0
27a0: 2c 20 20 20 30 2c 20 30 2c 20 20 20 30 2c 20 20  ,   0, 0,   0,  
27b0: 20 30 2c 20 30 2c 20 30 0a 20 20 20 20 20 20 7d   0, 0, 0.      }
27c0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
27d0: 73 69 7a 65 6f 66 28 61 53 70 65 63 69 61 6c 29  sizeof(aSpecial)
27e0: 3d 3d 33 32 20 29 3b 0a 20 20 20 20 20 20 61 73  ==32 );.      as
27f0: 73 65 72 74 28 20 61 53 70 65 63 69 61 6c 5b 27  sert( aSpecial['
2800: 5c 62 27 5d 3d 3d 27 62 27 20 29 3b 0a 20 20 20  \b']=='b' );.   
2810: 20 20 20 61 73 73 65 72 74 28 20 61 53 70 65 63     assert( aSpec
2820: 69 61 6c 5b 27 5c 66 27 5d 3d 3d 27 66 27 20 29  ial['\f']=='f' )
2830: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2840: 61 53 70 65 63 69 61 6c 5b 27 5c 6e 27 5d 3d 3d  aSpecial['\n']==
2850: 27 6e 27 20 29 3b 0a 20 20 20 20 20 20 61 73 73  'n' );.      ass
2860: 65 72 74 28 20 61 53 70 65 63 69 61 6c 5b 27 5c  ert( aSpecial['\
2870: 72 27 5d 3d 3d 27 72 27 20 29 3b 0a 20 20 20 20  r']=='r' );.    
2880: 20 20 61 73 73 65 72 74 28 20 61 53 70 65 63 69    assert( aSpeci
2890: 61 6c 5b 27 5c 74 27 5d 3d 3d 27 74 27 20 29 3b  al['\t']=='t' );
28a0: 0a 20 20 20 20 20 20 69 66 28 20 61 53 70 65 63  .      if( aSpec
28b0: 69 61 6c 5b 63 5d 20 29 7b 0a 20 20 20 20 20 20  ial[c] ){.      
28c0: 20 20 63 20 3d 20 61 53 70 65 63 69 61 6c 5b 63    c = aSpecial[c
28d0: 5d 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ];.        goto 
28e0: 6a 73 6f 6e 5f 73 69 6d 70 6c 65 5f 65 73 63 61  json_simple_esca
28f0: 70 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  pe;.      }.    
2900: 20 20 69 66 28 20 28 70 2d 3e 6e 55 73 65 64 2b    if( (p->nUsed+
2910: 4e 2b 37 2b 69 20 3e 20 70 2d 3e 6e 41 6c 6c 6f  N+7+i > p->nAllo
2920: 63 29 20 26 26 20 6a 73 6f 6e 47 72 6f 77 28 70  c) && jsonGrow(p
2930: 2c 4e 2b 37 2d 69 29 21 3d 30 20 29 20 72 65 74  ,N+7-i)!=0 ) ret
2940: 75 72 6e 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 42  urn;.      p->zB
2950: 75 66 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d  uf[p->nUsed++] =
2960: 20 27 5c 5c 27 3b 0a 20 20 20 20 20 20 70 2d 3e   '\\';.      p->
2970: 7a 42 75 66 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d  zBuf[p->nUsed++]
2980: 20 3d 20 27 75 27 3b 0a 20 20 20 20 20 20 70 2d   = 'u';.      p-
2990: 3e 7a 42 75 66 5b 70 2d 3e 6e 55 73 65 64 2b 2b  >zBuf[p->nUsed++
29a0: 5d 20 3d 20 27 30 27 3b 0a 20 20 20 20 20 20 70  ] = '0';.      p
29b0: 2d 3e 7a 42 75 66 5b 70 2d 3e 6e 55 73 65 64 2b  ->zBuf[p->nUsed+
29c0: 2b 5d 20 3d 20 27 30 27 3b 0a 20 20 20 20 20 20  +] = '0';.      
29d0: 70 2d 3e 7a 42 75 66 5b 70 2d 3e 6e 55 73 65 64  p->zBuf[p->nUsed
29e0: 2b 2b 5d 20 3d 20 27 30 27 20 2b 20 28 63 3e 3e  ++] = '0' + (c>>
29f0: 34 29 3b 0a 20 20 20 20 20 20 63 20 3d 20 22 30  4);.      c = "0
2a00: 31 32 33 34 35 36 37 38 39 61 62 63 64 65 66 22  123456789abcdef"
2a10: 5b 63 26 30 78 66 5d 3b 0a 20 20 20 20 7d 0a 20  [c&0xf];.    }. 
2a20: 20 20 20 70 2d 3e 7a 42 75 66 5b 70 2d 3e 6e 55     p->zBuf[p->nU
2a30: 73 65 64 2b 2b 5d 20 3d 20 63 3b 0a 20 20 7d 0a  sed++] = c;.  }.
2a40: 20 20 70 2d 3e 7a 42 75 66 5b 70 2d 3e 6e 55 73    p->zBuf[p->nUs
2a50: 65 64 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 61  ed++] = '"';.  a
2a60: 73 73 65 72 74 28 20 70 2d 3e 6e 55 73 65 64 3c  ssert( p->nUsed<
2a70: 70 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 7d 0a 0a  p->nAlloc );.}..
2a80: 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 66  /*.** Append a f
2a90: 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65  unction paramete
2aa0: 72 20 76 61 6c 75 65 20 74 6f 20 74 68 65 20 4a  r value to the J
2ab0: 53 4f 4e 20 73 74 72 69 6e 67 20 75 6e 64 65 72  SON string under
2ac0: 20 0a 2a 2a 20 63 6f 6e 73 74 72 75 63 74 69 6f   .** constructio
2ad0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
2ae0: 64 20 6a 73 6f 6e 41 70 70 65 6e 64 56 61 6c 75  d jsonAppendValu
2af0: 65 28 0a 20 20 4a 73 6f 6e 53 74 72 69 6e 67 20  e(.  JsonString 
2b00: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
2b10: 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f      /* Append to
2b20: 20 74 68 69 73 20 4a 53 4f 4e 20 73 74 72 69 6e   this JSON strin
2b30: 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  g */.  sqlite3_v
2b40: 61 6c 75 65 20 2a 70 56 61 6c 75 65 20 20 20 20  alue *pValue    
2b50: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74        /* Value t
2b60: 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20  o append */.){. 
2b70: 20 73 77 69 74 63 68 28 20 73 71 6c 69 74 65 33   switch( sqlite3
2b80: 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 56 61 6c  _value_type(pVal
2b90: 75 65 29 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ue) ){.    case 
2ba0: 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20  SQLITE_NULL: {. 
2bb0: 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 52       jsonAppendR
2bc0: 61 77 28 70 2c 20 22 6e 75 6c 6c 22 2c 20 34 29  aw(p, "null", 4)
2bd0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2be0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
2bf0: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 0a 20 20  LITE_INTEGER:.  
2c00: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c    case SQLITE_FL
2c10: 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e  OAT: {.      con
2c20: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f  st char *z = (co
2c30: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
2c40: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61  3_value_text(pVa
2c50: 6c 75 65 29 3b 0a 20 20 20 20 20 20 75 33 32 20  lue);.      u32 
2c60: 6e 20 3d 20 28 75 33 32 29 73 71 6c 69 74 65 33  n = (u32)sqlite3
2c70: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 56 61  _value_bytes(pVa
2c80: 6c 75 65 29 3b 0a 20 20 20 20 20 20 6a 73 6f 6e  lue);.      json
2c90: 41 70 70 65 6e 64 52 61 77 28 70 2c 20 7a 2c 20  AppendRaw(p, z, 
2ca0: 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
2cb0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
2cc0: 53 51 4c 49 54 45 5f 54 45 58 54 3a 20 7b 0a 20  SQLITE_TEXT: {. 
2cd0: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
2ce0: 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  *z = (const char
2cf0: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
2d00: 74 65 78 74 28 70 56 61 6c 75 65 29 3b 0a 20 20  text(pValue);.  
2d10: 20 20 20 20 75 33 32 20 6e 20 3d 20 28 75 33 32      u32 n = (u32
2d20: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62  )sqlite3_value_b
2d30: 79 74 65 73 28 70 56 61 6c 75 65 29 3b 0a 20 20  ytes(pValue);.  
2d40: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
2d50: 76 61 6c 75 65 5f 73 75 62 74 79 70 65 28 70 56  value_subtype(pV
2d60: 61 6c 75 65 29 3d 3d 4a 53 4f 4e 5f 53 55 42 54  alue)==JSON_SUBT
2d70: 59 50 45 20 29 7b 0a 20 20 20 20 20 20 20 20 6a  YPE ){.        j
2d80: 73 6f 6e 41 70 70 65 6e 64 52 61 77 28 70 2c 20  sonAppendRaw(p, 
2d90: 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  z, n);.      }el
2da0: 73 65 7b 0a 20 20 20 20 20 20 20 20 6a 73 6f 6e  se{.        json
2db0: 41 70 70 65 6e 64 53 74 72 69 6e 67 28 70 2c 20  AppendString(p, 
2dc0: 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  z, n);.      }. 
2dd0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2de0: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
2df0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 62 45  .      if( p->bE
2e00: 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rr==0 ){.       
2e10: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
2e20: 65 72 72 6f 72 28 70 2d 3e 70 43 74 78 2c 20 22  error(p->pCtx, "
2e30: 4a 53 4f 4e 20 63 61 6e 6e 6f 74 20 68 6f 6c 64  JSON cannot hold
2e40: 20 42 4c 4f 42 20 76 61 6c 75 65 73 22 2c 20 2d   BLOB values", -
2e50: 31 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 62  1);.        p->b
2e60: 45 72 72 20 3d 20 32 3b 0a 20 20 20 20 20 20 20  Err = 2;.       
2e70: 20 6a 73 6f 6e 52 65 73 65 74 28 70 29 3b 0a 20   jsonReset(p);. 
2e80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
2e90: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ak;.    }.  }.}.
2ea0: 0a 0a 2f 2a 20 4d 61 6b 65 20 74 68 65 20 4a 53  ../* Make the JS
2eb0: 4f 4e 20 69 6e 20 70 20 74 68 65 20 72 65 73 75  ON in p the resu
2ec0: 6c 74 20 6f 66 20 74 68 65 20 53 51 4c 20 66 75  lt of the SQL fu
2ed0: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
2ee0: 63 20 76 6f 69 64 20 6a 73 6f 6e 52 65 73 75 6c  c void jsonResul
2ef0: 74 28 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70 29  t(JsonString *p)
2f00: 7b 0a 20 20 69 66 28 20 70 2d 3e 62 45 72 72 3d  {.  if( p->bErr=
2f10: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
2f20: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 36 34 28  3_result_text64(
2f30: 70 2d 3e 70 43 74 78 2c 20 70 2d 3e 7a 42 75 66  p->pCtx, p->zBuf
2f40: 2c 20 70 2d 3e 6e 55 73 65 64 2c 20 0a 20 20 20  , p->nUsed, .   
2f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f60: 20 20 20 20 20 20 20 70 2d 3e 62 53 74 61 74 69         p->bStati
2f70: 63 20 3f 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  c ? SQLITE_TRANS
2f80: 49 45 4e 54 20 3a 20 73 71 6c 69 74 65 33 5f 66  IENT : sqlite3_f
2f90: 72 65 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ree,.           
2fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
2fb0: 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20  QLITE_UTF8);.   
2fc0: 20 6a 73 6f 6e 5a 65 72 6f 28 70 29 3b 0a 20 20   jsonZero(p);.  
2fd0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62  }.  assert( p->b
2fe0: 53 74 61 74 69 63 20 29 3b 0a 7d 0a 0a 2f 2a 2a  Static );.}../**
2ff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3030: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 55 74 69 6c  ********.** Util
3040: 69 74 79 20 72 6f 75 74 69 6e 65 73 20 66 6f 72  ity routines for
3050: 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 4a 73   dealing with Js
3060: 6f 6e 4e 6f 64 65 20 61 6e 64 20 4a 73 6f 6e 50  onNode and JsonP
3070: 61 72 73 65 20 6f 62 6a 65 63 74 73 0a 2a 2a 2a  arse objects.***
3080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30c0: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
30d0: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
30e0: 72 20 6f 66 20 63 6f 6e 73 65 63 75 74 69 76 65  r of consecutive
30f0: 20 4a 73 6f 6e 4e 6f 64 65 20 73 6c 6f 74 73 20   JsonNode slots 
3100: 6e 65 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e  need to represen
3110: 74 0a 2a 2a 20 74 68 65 20 70 61 72 73 65 64 20  t.** the parsed 
3120: 4a 53 4f 4e 20 61 74 20 70 4e 6f 64 65 2e 20 20  JSON at pNode.  
3130: 54 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6e 73 77  The minimum answ
3140: 65 72 20 69 73 20 31 2e 20 20 46 6f 72 20 41 52  er is 1.  For AR
3150: 52 41 59 20 61 6e 64 0a 2a 2a 20 4f 42 4a 45 43  RAY and.** OBJEC
3160: 54 20 74 79 70 65 73 2c 20 74 68 65 20 6e 75 6d  T types, the num
3170: 62 65 72 20 6d 69 67 68 74 20 62 65 20 6c 61 72  ber might be lar
3180: 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 70 70 65 6e  ger..**.** Appen
3190: 64 65 64 20 65 6c 65 6d 65 6e 74 73 20 61 72 65  ded elements are
31a0: 20 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 20 20 54   not counted.  T
31b0: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
31c0: 64 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 0a  d is the number.
31d0: 2a 2a 20 62 79 20 77 68 69 63 68 20 74 68 65 20  ** by which the 
31e0: 4a 73 6f 6e 4e 6f 64 65 20 63 6f 75 6e 74 65 72  JsonNode counter
31f0: 20 73 68 6f 75 6c 64 20 69 6e 63 72 65 6d 65 6e   should incremen
3200: 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 6f  t in order to go
3210: 20 74 6f 20 74 68 65 0a 2a 2a 20 6e 65 78 74 20   to the.** next 
3220: 70 65 65 72 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73  peer value..*/.s
3230: 74 61 74 69 63 20 75 33 32 20 6a 73 6f 6e 4e 6f  tatic u32 jsonNo
3240: 64 65 53 69 7a 65 28 4a 73 6f 6e 4e 6f 64 65 20  deSize(JsonNode 
3250: 2a 70 4e 6f 64 65 29 7b 0a 20 20 72 65 74 75 72  *pNode){.  retur
3260: 6e 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65 3e 3d  n pNode->eType>=
3270: 4a 53 4f 4e 5f 41 52 52 41 59 20 3f 20 70 4e 6f  JSON_ARRAY ? pNo
3280: 64 65 2d 3e 6e 2b 31 20 3a 20 31 3b 0a 7d 0a 0a  de->n+1 : 1;.}..
3290: 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d 20 61 6c  /*.** Reclaim al
32a0: 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  l memory allocat
32b0: 65 64 20 62 79 20 61 20 4a 73 6f 6e 50 61 72 73  ed by a JsonPars
32c0: 65 20 6f 62 6a 65 63 74 2e 20 20 42 75 74 20 64  e object.  But d
32d0: 6f 20 6e 6f 74 0a 2a 2a 20 64 65 6c 65 74 65 20  o not.** delete 
32e0: 74 68 65 20 4a 73 6f 6e 50 61 72 73 65 20 6f 62  the JsonParse ob
32f0: 6a 65 63 74 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a  ject itself..*/.
3300: 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e  static void json
3310: 50 61 72 73 65 52 65 73 65 74 28 4a 73 6f 6e 50  ParseReset(JsonP
3320: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
3330: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
3340: 61 72 73 65 2d 3e 61 4e 6f 64 65 29 3b 0a 20 20  arse->aNode);.  
3350: 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65 20 3d 20  pParse->aNode = 
3360: 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4e 6f  0;.  pParse->nNo
3370: 64 65 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  de = 0;.  pParse
3380: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  ->nAlloc = 0;.  
3390: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
33a0: 72 73 65 2d 3e 61 55 70 29 3b 0a 20 20 70 50 61  rse->aUp);.  pPa
33b0: 72 73 65 2d 3e 61 55 70 20 3d 20 30 3b 0a 7d 0a  rse->aUp = 0;.}.
33c0: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 4a 73  ./*.** Free a Js
33d0: 6f 6e 50 61 72 73 65 20 6f 62 6a 65 63 74 20 74  onParse object t
33e0: 68 61 74 20 77 61 73 20 6f 62 74 61 69 6e 65 64  hat was obtained
33f0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
3400: 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  lloc()..*/.stati
3410: 63 20 76 6f 69 64 20 6a 73 6f 6e 50 61 72 73 65  c void jsonParse
3420: 46 72 65 65 28 4a 73 6f 6e 50 61 72 73 65 20 2a  Free(JsonParse *
3430: 70 50 61 72 73 65 29 7b 0a 20 20 6a 73 6f 6e 50  pParse){.  jsonP
3440: 61 72 73 65 52 65 73 65 74 28 70 50 61 72 73 65  arseReset(pParse
3450: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
3460: 65 28 70 50 61 72 73 65 29 3b 0a 7d 0a 0a 2f 2a  e(pParse);.}../*
3470: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20  .** Convert the 
3480: 4a 73 6f 6e 4e 6f 64 65 20 70 4e 6f 64 65 20 69  JsonNode pNode i
3490: 6e 74 6f 20 61 20 70 75 72 65 20 4a 53 4f 4e 20  nto a pure JSON 
34a0: 73 74 72 69 6e 67 20 61 6e 64 0a 2a 2a 20 61 70  string and.** ap
34b0: 70 65 6e 64 20 74 6f 20 70 4f 75 74 2e 20 20 53  pend to pOut.  S
34c0: 75 62 73 75 62 73 74 72 75 63 74 75 72 65 20 69  ubsubstructure i
34d0: 73 20 61 6c 73 6f 20 69 6e 63 6c 75 64 65 64 2e  s also included.
34e0: 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20    Return.** the 
34f0: 6e 75 6d 62 65 72 20 6f 66 20 4a 73 6f 6e 4e 6f  number of JsonNo
3500: 64 65 20 6f 62 6a 65 63 74 73 20 74 68 61 74 20  de objects that 
3510: 61 72 65 20 65 6e 63 6f 64 65 64 2e 0a 2a 2f 0a  are encoded..*/.
3520: 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e  static void json
3530: 52 65 6e 64 65 72 4e 6f 64 65 28 0a 20 20 4a 73  RenderNode(.  Js
3540: 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 20 20  onNode *pNode,  
3550: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3560: 54 68 65 20 6e 6f 64 65 20 74 6f 20 72 65 6e 64  The node to rend
3570: 65 72 20 2a 2f 0a 20 20 4a 73 6f 6e 53 74 72 69  er */.  JsonStri
3580: 6e 67 20 2a 70 4f 75 74 2c 20 20 20 20 20 20 20  ng *pOut,       
3590: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
35a0: 4a 53 4f 4e 20 68 65 72 65 20 2a 2f 0a 20 20 73  JSON here */.  s
35b0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
35c0: 52 65 70 6c 61 63 65 20 20 20 20 20 20 20 2f 2a  Replace       /*
35d0: 20 52 65 70 6c 61 63 65 6d 65 6e 74 20 76 61 6c   Replacement val
35e0: 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ues */.){.  if( 
35f0: 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73 20 26  pNode->jnFlags &
3600: 20 28 4a 4e 4f 44 45 5f 52 45 50 4c 41 43 45 7c   (JNODE_REPLACE|
3610: 4a 4e 4f 44 45 5f 50 41 54 43 48 29 20 29 7b 0a  JNODE_PATCH) ){.
3620: 20 20 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 6a      if( pNode->j
3630: 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 52  nFlags & JNODE_R
3640: 45 50 4c 41 43 45 20 29 7b 0a 20 20 20 20 20 20  EPLACE ){.      
3650: 6a 73 6f 6e 41 70 70 65 6e 64 56 61 6c 75 65 28  jsonAppendValue(
3660: 70 4f 75 74 2c 20 61 52 65 70 6c 61 63 65 5b 70  pOut, aReplace[p
3670: 4e 6f 64 65 2d 3e 75 2e 69 52 65 70 6c 61 63 65  Node->u.iReplace
3680: 5d 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ]);.      return
3690: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 6f 64  ;.    }.    pNod
36a0: 65 20 3d 20 70 4e 6f 64 65 2d 3e 75 2e 70 50 61  e = pNode->u.pPa
36b0: 74 63 68 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  tch;.  }.  switc
36c0: 68 28 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65 20  h( pNode->eType 
36d0: 29 7b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  ){.    default: 
36e0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
36f0: 70 4e 6f 64 65 2d 3e 65 54 79 70 65 3d 3d 4a 53  pNode->eType==JS
3700: 4f 4e 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  ON_NULL );.     
3710: 20 6a 73 6f 6e 41 70 70 65 6e 64 52 61 77 28 70   jsonAppendRaw(p
3720: 4f 75 74 2c 20 22 6e 75 6c 6c 22 2c 20 34 29 3b  Out, "null", 4);
3730: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3740: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 53 4f    }.    case JSO
3750: 4e 5f 54 52 55 45 3a 20 7b 0a 20 20 20 20 20 20  N_TRUE: {.      
3760: 6a 73 6f 6e 41 70 70 65 6e 64 52 61 77 28 70 4f  jsonAppendRaw(pO
3770: 75 74 2c 20 22 74 72 75 65 22 2c 20 34 29 3b 0a  ut, "true", 4);.
3780: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3790: 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 53 4f 4e   }.    case JSON
37a0: 5f 46 41 4c 53 45 3a 20 7b 0a 20 20 20 20 20 20  _FALSE: {.      
37b0: 6a 73 6f 6e 41 70 70 65 6e 64 52 61 77 28 70 4f  jsonAppendRaw(pO
37c0: 75 74 2c 20 22 66 61 6c 73 65 22 2c 20 35 29 3b  ut, "false", 5);
37d0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
37e0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 53 4f    }.    case JSO
37f0: 4e 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20  N_STRING: {.    
3800: 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 6a 6e 46    if( pNode->jnF
3810: 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 52 41 57  lags & JNODE_RAW
3820: 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 73 6f 6e   ){.        json
3830: 41 70 70 65 6e 64 53 74 72 69 6e 67 28 70 4f 75  AppendString(pOu
3840: 74 2c 20 70 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f  t, pNode->u.zJCo
3850: 6e 74 65 6e 74 2c 20 70 4e 6f 64 65 2d 3e 6e 29  ntent, pNode->n)
3860: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
3870: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
3880: 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 69  * Fall through i
3890: 6e 74 6f 20 74 68 65 20 6e 65 78 74 20 63 61 73  nto the next cas
38a0: 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63  e */.    }.    c
38b0: 61 73 65 20 4a 53 4f 4e 5f 52 45 41 4c 3a 0a 20  ase JSON_REAL:. 
38c0: 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f 49 4e 54     case JSON_INT
38d0: 3a 20 7b 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70  : {.      jsonAp
38e0: 70 65 6e 64 52 61 77 28 70 4f 75 74 2c 20 70 4e  pendRaw(pOut, pN
38f0: 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74  ode->u.zJContent
3900: 2c 20 70 4e 6f 64 65 2d 3e 6e 29 3b 0a 20 20 20  , pNode->n);.   
3910: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3920: 20 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f 41 52      case JSON_AR
3930: 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 75 33 32  RAY: {.      u32
3940: 20 6a 20 3d 20 31 3b 0a 20 20 20 20 20 20 6a 73   j = 1;.      js
3950: 6f 6e 41 70 70 65 6e 64 43 68 61 72 28 70 4f 75  onAppendChar(pOu
3960: 74 2c 20 27 5b 27 29 3b 0a 20 20 20 20 20 20 66  t, '[');.      f
3970: 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20  or(;;){.        
3980: 77 68 69 6c 65 28 20 6a 3c 3d 70 4e 6f 64 65 2d  while( j<=pNode-
3990: 3e 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >n ){.          
39a0: 69 66 28 20 28 70 4e 6f 64 65 5b 6a 5d 2e 6a 6e  if( (pNode[j].jn
39b0: 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 52 45  Flags & JNODE_RE
39c0: 4d 4f 56 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  MOVE)==0 ){.    
39d0: 20 20 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65          jsonAppe
39e0: 6e 64 53 65 70 61 72 61 74 6f 72 28 70 4f 75 74  ndSeparator(pOut
39f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  );.            j
3a00: 73 6f 6e 52 65 6e 64 65 72 4e 6f 64 65 28 26 70  sonRenderNode(&p
3a10: 4e 6f 64 65 5b 6a 5d 2c 20 70 4f 75 74 2c 20 61  Node[j], pOut, a
3a20: 52 65 70 6c 61 63 65 29 3b 0a 20 20 20 20 20 20  Replace);.      
3a30: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
3a40: 6a 20 2b 3d 20 6a 73 6f 6e 4e 6f 64 65 53 69 7a  j += jsonNodeSiz
3a50: 65 28 26 70 4e 6f 64 65 5b 6a 5d 29 3b 0a 20 20  e(&pNode[j]);.  
3a60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3a70: 69 66 28 20 28 70 4e 6f 64 65 2d 3e 6a 6e 46 6c  if( (pNode->jnFl
3a80: 61 67 73 20 26 20 4a 4e 4f 44 45 5f 41 50 50 45  ags & JNODE_APPE
3a90: 4e 44 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ND)==0 ) break;.
3aa0: 20 20 20 20 20 20 20 20 70 4e 6f 64 65 20 3d 20          pNode = 
3ab0: 26 70 4e 6f 64 65 5b 70 4e 6f 64 65 2d 3e 75 2e  &pNode[pNode->u.
3ac0: 69 41 70 70 65 6e 64 5d 3b 0a 20 20 20 20 20 20  iAppend];.      
3ad0: 20 20 6a 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d    j = 1;.      }
3ae0: 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e  .      jsonAppen
3af0: 64 43 68 61 72 28 70 4f 75 74 2c 20 27 5d 27 29  dChar(pOut, ']')
3b00: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3b10: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 53     }.    case JS
3b20: 4f 4e 5f 4f 42 4a 45 43 54 3a 20 7b 0a 20 20 20  ON_OBJECT: {.   
3b30: 20 20 20 75 33 32 20 6a 20 3d 20 31 3b 0a 20 20     u32 j = 1;.  
3b40: 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68      jsonAppendCh
3b50: 61 72 28 70 4f 75 74 2c 20 27 7b 27 29 3b 0a 20  ar(pOut, '{');. 
3b60: 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20       for(;;){.  
3b70: 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3c 3d        while( j<=
3b80: 70 4e 6f 64 65 2d 3e 6e 20 29 7b 0a 20 20 20 20  pNode->n ){.    
3b90: 20 20 20 20 20 20 69 66 28 20 28 70 4e 6f 64 65        if( (pNode
3ba0: 5b 6a 2b 31 5d 2e 6a 6e 46 6c 61 67 73 20 26 20  [j+1].jnFlags & 
3bb0: 4a 4e 4f 44 45 5f 52 45 4d 4f 56 45 29 3d 3d 30  JNODE_REMOVE)==0
3bc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
3bd0: 6a 73 6f 6e 41 70 70 65 6e 64 53 65 70 61 72 61  jsonAppendSepara
3be0: 74 6f 72 28 70 4f 75 74 29 3b 0a 20 20 20 20 20  tor(pOut);.     
3bf0: 20 20 20 20 20 20 20 6a 73 6f 6e 52 65 6e 64 65         jsonRende
3c00: 72 4e 6f 64 65 28 26 70 4e 6f 64 65 5b 6a 5d 2c  rNode(&pNode[j],
3c10: 20 70 4f 75 74 2c 20 61 52 65 70 6c 61 63 65 29   pOut, aReplace)
3c20: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 73  ;.            js
3c30: 6f 6e 41 70 70 65 6e 64 43 68 61 72 28 70 4f 75  onAppendChar(pOu
3c40: 74 2c 20 27 3a 27 29 3b 0a 20 20 20 20 20 20 20  t, ':');.       
3c50: 20 20 20 20 20 6a 73 6f 6e 52 65 6e 64 65 72 4e       jsonRenderN
3c60: 6f 64 65 28 26 70 4e 6f 64 65 5b 6a 2b 31 5d 2c  ode(&pNode[j+1],
3c70: 20 70 4f 75 74 2c 20 61 52 65 70 6c 61 63 65 29   pOut, aReplace)
3c80: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
3c90: 20 20 20 20 20 20 20 20 6a 20 2b 3d 20 31 20 2b          j += 1 +
3ca0: 20 6a 73 6f 6e 4e 6f 64 65 53 69 7a 65 28 26 70   jsonNodeSize(&p
3cb0: 4e 6f 64 65 5b 6a 2b 31 5d 29 3b 0a 20 20 20 20  Node[j+1]);.    
3cc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
3cd0: 28 20 28 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67  ( (pNode->jnFlag
3ce0: 73 20 26 20 4a 4e 4f 44 45 5f 41 50 50 45 4e 44  s & JNODE_APPEND
3cf0: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
3d00: 20 20 20 20 20 20 70 4e 6f 64 65 20 3d 20 26 70        pNode = &p
3d10: 4e 6f 64 65 5b 70 4e 6f 64 65 2d 3e 75 2e 69 41  Node[pNode->u.iA
3d20: 70 70 65 6e 64 5d 3b 0a 20 20 20 20 20 20 20 20  ppend];.        
3d30: 6a 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  j = 1;.      }. 
3d40: 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 43       jsonAppendC
3d50: 68 61 72 28 70 4f 75 74 2c 20 27 7d 27 29 3b 0a  har(pOut, '}');.
3d60: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3d70: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
3d80: 52 65 74 75 72 6e 20 61 20 4a 73 6f 6e 4e 6f 64  Return a JsonNod
3d90: 65 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 64 65  e and all its de
3da0: 73 63 65 6e 64 65 6e 74 73 20 61 73 20 61 20 4a  scendents as a J
3db0: 53 4f 4e 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73  SON string..*/.s
3dc0: 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 52  tatic void jsonR
3dd0: 65 74 75 72 6e 4a 73 6f 6e 28 0a 20 20 4a 73 6f  eturnJson(.  Jso
3de0: 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 20 20 20  nNode *pNode,   
3df0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 64 65           /* Node
3e00: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
3e10: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
3e20: 2a 70 43 74 78 2c 20 20 20 20 20 20 2f 2a 20 52  *pCtx,      /* R
3e30: 65 74 75 72 6e 20 76 61 6c 75 65 20 66 6f 72 20  eturn value for 
3e40: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
3e50: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
3e60: 20 2a 2a 61 52 65 70 6c 61 63 65 20 20 20 20 2f   **aReplace    /
3e70: 2a 20 41 72 72 61 79 20 6f 66 20 72 65 70 6c 61  * Array of repla
3e80: 63 65 6d 65 6e 74 20 76 61 6c 75 65 73 20 2a 2f  cement values */
3e90: 0a 29 7b 0a 20 20 4a 73 6f 6e 53 74 72 69 6e 67  .){.  JsonString
3ea0: 20 73 3b 0a 20 20 6a 73 6f 6e 49 6e 69 74 28 26   s;.  jsonInit(&
3eb0: 73 2c 20 70 43 74 78 29 3b 0a 20 20 6a 73 6f 6e  s, pCtx);.  json
3ec0: 52 65 6e 64 65 72 4e 6f 64 65 28 70 4e 6f 64 65  RenderNode(pNode
3ed0: 2c 20 26 73 2c 20 61 52 65 70 6c 61 63 65 29 3b  , &s, aReplace);
3ee0: 0a 20 20 6a 73 6f 6e 52 65 73 75 6c 74 28 26 73  .  jsonResult(&s
3ef0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
3f00: 75 6c 74 5f 73 75 62 74 79 70 65 28 70 43 74 78  ult_subtype(pCtx
3f10: 2c 20 4a 53 4f 4e 5f 53 55 42 54 59 50 45 29 3b  , JSON_SUBTYPE);
3f20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 74  .}../*.** Make t
3f30: 68 65 20 4a 73 6f 6e 4e 6f 64 65 20 74 68 65 20  he JsonNode the 
3f40: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
3f50: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  the function..*/
3f60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f  .static void jso
3f70: 6e 52 65 74 75 72 6e 28 0a 20 20 4a 73 6f 6e 4e  nReturn(.  JsonN
3f80: 6f 64 65 20 2a 70 4e 6f 64 65 2c 20 20 20 20 20  ode *pNode,     
3f90: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 64 65 20 74         /* Node t
3fa0: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71  o return */.  sq
3fb0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
3fc0: 43 74 78 2c 20 20 20 20 20 20 2f 2a 20 52 65 74  Ctx,      /* Ret
3fd0: 75 72 6e 20 76 61 6c 75 65 20 66 6f 72 20 74 68  urn value for th
3fe0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
3ff0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
4000: 2a 61 52 65 70 6c 61 63 65 20 20 20 20 2f 2a 20  *aReplace    /* 
4010: 41 72 72 61 79 20 6f 66 20 72 65 70 6c 61 63 65  Array of replace
4020: 6d 65 6e 74 20 76 61 6c 75 65 73 20 2a 2f 0a 29  ment values */.)
4030: 7b 0a 20 20 73 77 69 74 63 68 28 20 70 4e 6f 64  {.  switch( pNod
4040: 65 2d 3e 65 54 79 70 65 20 29 7b 0a 20 20 20 20  e->eType ){.    
4050: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
4060: 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e   assert( pNode->
4070: 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f 4e 55 4c 4c  eType==JSON_NULL
4080: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
4090: 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 28 70 43  3_result_null(pC
40a0: 74 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  tx);.      break
40b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
40c0: 20 4a 53 4f 4e 5f 54 52 55 45 3a 20 7b 0a 20 20   JSON_TRUE: {.  
40d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
40e0: 6c 74 5f 69 6e 74 28 70 43 74 78 2c 20 31 29 3b  lt_int(pCtx, 1);
40f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4100: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 53 4f    }.    case JSO
4110: 4e 5f 46 41 4c 53 45 3a 20 7b 0a 20 20 20 20 20  N_FALSE: {.     
4120: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
4130: 69 6e 74 28 70 43 74 78 2c 20 30 29 3b 0a 20 20  int(pCtx, 0);.  
4140: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4150: 0a 20 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f 49  .    case JSON_I
4160: 4e 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  NT: {.      sqli
4170: 74 65 33 5f 69 6e 74 36 34 20 69 20 3d 20 30 3b  te3_int64 i = 0;
4180: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
4190: 72 20 2a 7a 20 3d 20 70 4e 6f 64 65 2d 3e 75 2e  r *z = pNode->u.
41a0: 7a 4a 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20  zJContent;.     
41b0: 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29   if( z[0]=='-' )
41c0: 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 77  { z++; }.      w
41d0: 68 69 6c 65 28 20 7a 5b 30 5d 3e 3d 27 30 27 20  hile( z[0]>='0' 
41e0: 26 26 20 7a 5b 30 5d 3c 3d 27 39 27 20 29 7b 0a  && z[0]<='9' ){.
41f0: 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64          unsigned
4200: 20 76 20 3d 20 2a 28 7a 2b 2b 29 20 2d 20 27 30   v = *(z++) - '0
4210: 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ';.        if( i
4220: 3e 3d 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 2f  >=LARGEST_INT64/
4230: 31 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  10 ){.          
4240: 69 66 28 20 69 3e 4c 41 52 47 45 53 54 5f 49 4e  if( i>LARGEST_IN
4250: 54 36 34 2f 31 30 20 29 20 67 6f 74 6f 20 69 6e  T64/10 ) goto in
4260: 74 5f 61 73 5f 72 65 61 6c 3b 0a 20 20 20 20 20  t_as_real;.     
4270: 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3e 3d 27       if( z[0]>='
4280: 30 27 20 26 26 20 7a 5b 30 5d 3c 3d 27 39 27 20  0' && z[0]<='9' 
4290: 29 20 67 6f 74 6f 20 69 6e 74 5f 61 73 5f 72 65  ) goto int_as_re
42a0: 61 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  al;.          if
42b0: 28 20 76 3d 3d 39 20 29 20 67 6f 74 6f 20 69 6e  ( v==9 ) goto in
42c0: 74 5f 61 73 5f 72 65 61 6c 3b 0a 20 20 20 20 20  t_as_real;.     
42d0: 20 20 20 20 20 69 66 28 20 76 3d 3d 38 20 29 7b       if( v==8 ){
42e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
42f0: 20 70 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74   pNode->u.zJCont
4300: 65 6e 74 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20  ent[0]=='-' ){. 
4310: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
4320: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
4330: 34 28 70 43 74 78 2c 20 53 4d 41 4c 4c 45 53 54  4(pCtx, SMALLEST
4340: 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 20 20 20  _INT64);.       
4350: 20 20 20 20 20 20 20 67 6f 74 6f 20 69 6e 74 5f         goto int_
4360: 64 6f 6e 65 3b 0a 20 20 20 20 20 20 20 20 20 20  done;.          
4370: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
4380: 20 20 20 20 20 20 20 67 6f 74 6f 20 69 6e 74 5f         goto int_
4390: 61 73 5f 72 65 61 6c 3b 0a 20 20 20 20 20 20 20  as_real;.       
43a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
43b0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
43c0: 20 20 20 20 20 69 20 3d 20 69 2a 31 30 20 2b 20       i = i*10 + 
43d0: 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  v;.      }.     
43e0: 20 69 66 28 20 70 4e 6f 64 65 2d 3e 75 2e 7a 4a   if( pNode->u.zJ
43f0: 43 6f 6e 74 65 6e 74 5b 30 5d 3d 3d 27 2d 27 20  Content[0]=='-' 
4400: 29 7b 20 69 20 3d 20 2d 69 3b 20 7d 0a 20 20 20  ){ i = -i; }.   
4410: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
4420: 74 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 69 29  t_int64(pCtx, i)
4430: 3b 0a 20 20 20 20 20 20 69 6e 74 5f 64 6f 6e 65  ;.      int_done
4440: 3a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  :.      break;. 
4450: 20 20 20 20 20 69 6e 74 5f 61 73 5f 72 65 61 6c       int_as_real
4460: 3a 20 2f 2a 20 66 61 6c 6c 20 74 68 72 6f 75 67  : /* fall throug
4470: 68 20 74 6f 20 72 65 61 6c 20 2a 2f 3b 0a 20 20  h to real */;.  
4480: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 53 4f    }.    case JSO
4490: 4e 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20  N_REAL: {.      
44a0: 64 6f 75 62 6c 65 20 72 3b 0a 23 69 66 64 65 66  double r;.#ifdef
44b0: 20 53 51 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41   SQLITE_AMALGAMA
44c0: 54 49 4f 4e 0a 20 20 20 20 20 20 63 6f 6e 73 74  TION.      const
44d0: 20 63 68 61 72 20 2a 7a 20 3d 20 70 4e 6f 64 65   char *z = pNode
44e0: 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 3b 0a 20  ->u.zJContent;. 
44f0: 20 20 20 20 20 73 71 6c 69 74 65 33 41 74 6f 46       sqlite3AtoF
4500: 28 7a 2c 20 26 72 2c 20 73 71 6c 69 74 65 33 53  (z, &r, sqlite3S
4510: 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51 4c 49  trlen30(z), SQLI
4520: 54 45 5f 55 54 46 38 29 3b 0a 23 65 6c 73 65 0a  TE_UTF8);.#else.
4530: 20 20 20 20 20 20 72 20 3d 20 73 74 72 74 6f 64        r = strtod
4540: 28 70 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74  (pNode->u.zJCont
4550: 65 6e 74 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  ent, 0);.#endif.
4560: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
4570: 73 75 6c 74 5f 64 6f 75 62 6c 65 28 70 43 74 78  sult_double(pCtx
4580: 2c 20 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , r);.      brea
4590: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
45a0: 65 20 4a 53 4f 4e 5f 53 54 52 49 4e 47 3a 20 7b  e JSON_STRING: {
45b0: 0a 23 69 66 20 30 20 2f 2a 20 4e 65 76 65 72 20  .#if 0 /* Never 
45c0: 68 61 70 70 65 6e 73 20 62 65 63 61 75 73 65 20  happens because 
45d0: 4a 4e 4f 44 45 5f 52 41 57 20 69 73 20 6f 6e 6c  JNODE_RAW is onl
45e0: 79 20 73 65 74 20 62 79 20 6a 73 6f 6e 5f 73 65  y set by json_se
45f0: 74 28 29 2c 0a 20 20 20 20 20 20 2a 2a 20 6a 73  t(),.      ** js
4600: 6f 6e 5f 69 6e 73 65 72 74 28 29 20 61 6e 64 20  on_insert() and 
4610: 6a 73 6f 6e 5f 72 65 70 6c 61 63 65 28 29 20 61  json_replace() a
4620: 6e 64 20 74 68 6f 73 65 20 72 6f 75 74 69 6e 65  nd those routine
4630: 73 20 64 6f 20 6e 6f 74 0a 20 20 20 20 20 20 2a  s do not.      *
4640: 2a 20 63 61 6c 6c 20 6a 73 6f 6e 52 65 74 75 72  * call jsonRetur
4650: 6e 28 29 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  n() */.      if(
4660: 20 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73 20   pNode->jnFlags 
4670: 26 20 4a 4e 4f 44 45 5f 52 41 57 20 29 7b 0a 20  & JNODE_RAW ){. 
4680: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
4690: 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c  esult_text(pCtx,
46a0: 20 70 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74   pNode->u.zJCont
46b0: 65 6e 74 2c 20 70 4e 6f 64 65 2d 3e 6e 2c 0a 20  ent, pNode->n,. 
46c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46d0: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
46e0: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
46f0: 20 20 20 20 7d 65 6c 73 65 20 0a 23 65 6e 64 69      }else .#endi
4700: 66 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  f.      assert( 
4710: 28 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73 20  (pNode->jnFlags 
4720: 26 20 4a 4e 4f 44 45 5f 52 41 57 29 3d 3d 30 20  & JNODE_RAW)==0 
4730: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 4e  );.      if( (pN
4740: 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73 20 26 20 4a  ode->jnFlags & J
4750: 4e 4f 44 45 5f 45 53 43 41 50 45 29 3d 3d 30 20  NODE_ESCAPE)==0 
4760: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4a 53  ){.        /* JS
4770: 4f 4e 20 66 6f 72 6d 61 74 74 65 64 20 77 69 74  ON formatted wit
4780: 68 6f 75 74 20 61 6e 79 20 62 61 63 6b 73 6c 61  hout any backsla
4790: 73 68 2d 65 73 63 61 70 65 73 20 2a 2f 0a 20 20  sh-escapes */.  
47a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
47b0: 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20  sult_text(pCtx, 
47c0: 70 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74 65  pNode->u.zJConte
47d0: 6e 74 2b 31 2c 20 70 4e 6f 64 65 2d 3e 6e 2d 32  nt+1, pNode->n-2
47e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
47f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
4800: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
4810: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
4820: 20 20 20 20 20 20 2f 2a 20 54 72 61 6e 73 6c 61        /* Transla
4830: 74 65 20 4a 53 4f 4e 20 66 6f 72 6d 61 74 74 65  te JSON formatte
4840: 64 20 73 74 72 69 6e 67 20 69 6e 74 6f 20 72 61  d string into ra
4850: 77 20 74 65 78 74 20 2a 2f 0a 20 20 20 20 20 20  w text */.      
4860: 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20    u32 i;.       
4870: 20 75 33 32 20 6e 20 3d 20 70 4e 6f 64 65 2d 3e   u32 n = pNode->
4880: 6e 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  n;.        const
4890: 20 63 68 61 72 20 2a 7a 20 3d 20 70 4e 6f 64 65   char *z = pNode
48a0: 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 3b 0a 20  ->u.zJContent;. 
48b0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4f 75         char *zOu
48c0: 74 3b 0a 20 20 20 20 20 20 20 20 75 33 32 20 6a  t;.        u32 j
48d0: 3b 0a 20 20 20 20 20 20 20 20 7a 4f 75 74 20 3d  ;.        zOut =
48e0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
48f0: 20 6e 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20   n+1 );.        
4900: 69 66 28 20 7a 4f 75 74 3d 3d 30 20 29 7b 0a 20  if( zOut==0 ){. 
4910: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
4920: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
4930: 6d 65 6d 28 70 43 74 78 29 3b 0a 20 20 20 20 20  mem(pCtx);.     
4940: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4950: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f      }.        fo
4960: 72 28 69 3d 31 2c 20 6a 3d 30 3b 20 69 3c 6e 2d  r(i=1, j=0; i<n-
4970: 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  1; i++){.       
4980: 20 20 20 63 68 61 72 20 63 20 3d 20 7a 5b 69 5d     char c = z[i]
4990: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
49a0: 63 21 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20  c!='\\' ){.     
49b0: 20 20 20 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d         zOut[j++]
49c0: 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20 20   = c;.          
49d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
49e0: 20 20 20 63 20 3d 20 7a 5b 2b 2b 69 5d 3b 0a 20     c = z[++i];. 
49f0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63             if( c
4a00: 3d 3d 27 75 27 20 29 7b 0a 20 20 20 20 20 20 20  =='u' ){.       
4a10: 20 20 20 20 20 20 20 75 33 32 20 76 20 3d 20 30         u32 v = 0
4a20: 2c 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  , k;.           
4a30: 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 34 3b     for(k=0; k<4;
4a40: 20 69 2b 2b 2c 20 6b 2b 2b 29 7b 0a 20 20 20 20   i++, k++){.    
4a50: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
4a60: 72 74 28 20 69 3c 6e 2d 32 20 29 3b 0a 20 20 20  rt( i<n-2 );.   
4a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 20 3d               c =
4a80: 20 7a 5b 69 2b 31 5d 3b 0a 20 20 20 20 20 20 20   z[i+1];.       
4a90: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
4aa0: 20 73 61 66 65 5f 69 73 78 64 69 67 69 74 28 63   safe_isxdigit(c
4ab0: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
4ac0: 20 20 20 20 20 69 66 28 20 63 3c 3d 27 39 27 20       if( c<='9' 
4ad0: 29 20 76 20 3d 20 76 2a 31 36 20 2b 20 63 20 2d  ) v = v*16 + c -
4ae0: 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20   '0';.          
4af0: 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 63        else if( c
4b00: 3c 3d 27 46 27 20 29 20 76 20 3d 20 76 2a 31 36  <='F' ) v = v*16
4b10: 20 2b 20 63 20 2d 20 27 41 27 20 2b 20 31 30 3b   + c - 'A' + 10;
4b20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4b30: 20 65 6c 73 65 20 76 20 3d 20 76 2a 31 36 20 2b   else v = v*16 +
4b40: 20 63 20 2d 20 27 61 27 20 2b 20 31 30 3b 0a 20   c - 'a' + 10;. 
4b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
4b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
4b70: 20 76 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20   v==0 ) break;. 
4b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
4b90: 20 76 3c 3d 30 78 37 66 20 29 7b 0a 20 20 20 20   v<=0x7f ){.    
4ba0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4f 75 74              zOut
4bb0: 5b 6a 2b 2b 5d 20 3d 20 28 63 68 61 72 29 76 3b  [j++] = (char)v;
4bc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
4bd0: 65 6c 73 65 20 69 66 28 20 76 3c 3d 30 78 37 66  else if( v<=0x7f
4be0: 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  f ){.           
4bf0: 20 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d       zOut[j++] =
4c00: 20 28 63 68 61 72 29 28 30 78 63 30 20 7c 20 28   (char)(0xc0 | (
4c10: 76 3e 3e 36 29 29 3b 0a 20 20 20 20 20 20 20 20  v>>6));.        
4c20: 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b          zOut[j++
4c30: 5d 20 3d 20 30 78 38 30 20 7c 20 28 76 26 30 78  ] = 0x80 | (v&0x
4c40: 33 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  3f);.           
4c50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4c60: 20 20 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 6a            zOut[j
4c70: 2b 2b 5d 20 3d 20 28 63 68 61 72 29 28 30 78 65  ++] = (char)(0xe
4c80: 30 20 7c 20 28 76 3e 3e 31 32 29 29 3b 0a 20 20  0 | (v>>12));.  
4c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4f                zO
4ca0: 75 74 5b 6a 2b 2b 5d 20 3d 20 30 78 38 30 20 7c  ut[j++] = 0x80 |
4cb0: 20 28 28 76 3e 3e 36 29 26 30 78 33 66 29 3b 0a   ((v>>6)&0x3f);.
4cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cd0: 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 30 78 38 30  zOut[j++] = 0x80
4ce0: 20 7c 20 28 76 26 30 78 33 66 29 3b 0a 20 20 20   | (v&0x3f);.   
4cf0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
4d00: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
4d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
4d20: 28 20 63 3d 3d 27 62 27 20 29 7b 0a 20 20 20 20  ( c=='b' ){.    
4d30: 20 20 20 20 20 20 20 20 20 20 20 20 63 20 3d 20              c = 
4d40: 27 5c 62 27 3b 0a 20 20 20 20 20 20 20 20 20 20  '\b';.          
4d50: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
4d60: 3d 27 66 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='f' ){.        
4d70: 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 66 27          c = '\f'
4d80: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
4d90: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 6e 27  }else if( c=='n'
4da0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
4db0: 20 20 20 20 63 20 3d 20 27 5c 6e 27 3b 0a 20 20      c = '\n';.  
4dc0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
4dd0: 65 20 69 66 28 20 63 3d 3d 27 72 27 20 29 7b 0a  e if( c=='r' ){.
4de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4df0: 63 20 3d 20 27 5c 72 27 3b 0a 20 20 20 20 20 20  c = '\r';.      
4e00: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
4e10: 28 20 63 3d 3d 27 74 27 20 29 7b 0a 20 20 20 20  ( c=='t' ){.    
4e20: 20 20 20 20 20 20 20 20 20 20 20 20 63 20 3d 20              c = 
4e30: 27 5c 74 27 3b 0a 20 20 20 20 20 20 20 20 20 20  '\t';.          
4e40: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
4e50: 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20      zOut[j++] = 
4e60: 63 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  c;.            }
4e70: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
4e80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
4e90: 4f 75 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20  Out[j] = 0;.    
4ea0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
4eb0: 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20 7a 4f  lt_text(pCtx, zO
4ec0: 75 74 2c 20 6a 2c 20 73 71 6c 69 74 65 33 5f 66  ut, j, sqlite3_f
4ed0: 72 65 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ree);.      }.  
4ee0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4ef0: 0a 20 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f 41  .    case JSON_A
4f00: 52 52 41 59 3a 0a 20 20 20 20 63 61 73 65 20 4a  RRAY:.    case J
4f10: 53 4f 4e 5f 4f 42 4a 45 43 54 3a 20 7b 0a 20 20  SON_OBJECT: {.  
4f20: 20 20 20 20 6a 73 6f 6e 52 65 74 75 72 6e 4a 73      jsonReturnJs
4f30: 6f 6e 28 70 4e 6f 64 65 2c 20 70 43 74 78 2c 20  on(pNode, pCtx, 
4f40: 61 52 65 70 6c 61 63 65 29 3b 0a 20 20 20 20 20  aReplace);.     
4f50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4f60: 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  }.}../* Forward 
4f70: 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61  reference */.sta
4f80: 74 69 63 20 69 6e 74 20 6a 73 6f 6e 50 61 72 73  tic int jsonPars
4f90: 65 41 64 64 4e 6f 64 65 28 4a 73 6f 6e 50 61 72  eAddNode(JsonPar
4fa0: 73 65 2a 2c 75 33 32 2c 75 33 32 2c 63 6f 6e 73  se*,u32,u32,cons
4fb0: 74 20 63 68 61 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  t char*);../*.**
4fc0: 20 41 20 6d 61 63 72 6f 20 74 6f 20 68 69 6e 74   A macro to hint
4fd0: 20 74 6f 20 74 68 65 20 63 6f 6d 70 69 6c 65 72   to the compiler
4fe0: 20 74 68 61 74 20 61 20 66 75 6e 63 74 69 6f 6e   that a function
4ff0: 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 0a 2a   should not be.*
5000: 2a 20 69 6e 6c 69 6e 65 64 2e 0a 2a 2f 0a 23 69  * inlined..*/.#i
5010: 66 20 64 65 66 69 6e 65 64 28 5f 5f 47 4e 55 43  f defined(__GNUC
5020: 5f 5f 29 0a 23 20 20 64 65 66 69 6e 65 20 4a 53  __).#  define JS
5030: 4f 4e 5f 4e 4f 49 4e 4c 49 4e 45 20 20 5f 5f 61  ON_NOINLINE  __a
5040: 74 74 72 69 62 75 74 65 5f 5f 28 28 6e 6f 69 6e  ttribute__((noin
5050: 6c 69 6e 65 29 29 0a 23 65 6c 69 66 20 64 65 66  line)).#elif def
5060: 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29 20 26  ined(_MSC_VER) &
5070: 26 20 5f 4d 53 43 5f 56 45 52 3e 3d 31 33 31 30  & _MSC_VER>=1310
5080: 0a 23 20 20 64 65 66 69 6e 65 20 4a 53 4f 4e 5f  .#  define JSON_
5090: 4e 4f 49 4e 4c 49 4e 45 20 20 5f 5f 64 65 63 6c  NOINLINE  __decl
50a0: 73 70 65 63 28 6e 6f 69 6e 6c 69 6e 65 29 0a 23  spec(noinline).#
50b0: 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 4a  else.#  define J
50c0: 53 4f 4e 5f 4e 4f 49 4e 4c 49 4e 45 0a 23 65 6e  SON_NOINLINE.#en
50d0: 64 69 66 0a 0a 0a 73 74 61 74 69 63 20 4a 53 4f  dif...static JSO
50e0: 4e 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 6a  N_NOINLINE int j
50f0: 73 6f 6e 50 61 72 73 65 41 64 64 4e 6f 64 65 45  sonParseAddNodeE
5100: 78 70 61 6e 64 28 0a 20 20 4a 73 6f 6e 50 61 72  xpand(.  JsonPar
5110: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
5120: 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65     /* Append the
5130: 20 6e 6f 64 65 20 74 6f 20 74 68 69 73 20 6f 62   node to this ob
5140: 6a 65 63 74 20 2a 2f 0a 20 20 75 33 32 20 65 54  ject */.  u32 eT
5150: 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
5160: 20 20 20 20 2f 2a 20 4e 6f 64 65 20 74 79 70 65      /* Node type
5170: 20 2a 2f 0a 20 20 75 33 32 20 6e 2c 20 20 20 20   */.  u32 n,    
5180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5190: 2f 2a 20 43 6f 6e 74 65 6e 74 20 73 69 7a 65 20  /* Content size 
51a0: 6f 72 20 73 75 62 2d 6e 6f 64 65 20 63 6f 75 6e  or sub-node coun
51b0: 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
51c0: 72 20 2a 7a 43 6f 6e 74 65 6e 74 20 20 20 20 20  r *zContent     
51d0: 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 2a 2f 0a 29   /* Content */.)
51e0: 7b 0a 20 20 75 33 32 20 6e 4e 65 77 3b 0a 20 20  {.  u32 nNew;.  
51f0: 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e 65 77 3b 0a  JsonNode *pNew;.
5200: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
5210: 2d 3e 6e 4e 6f 64 65 3e 3d 70 50 61 72 73 65 2d  ->nNode>=pParse-
5220: 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 20 20 69 66 28  >nAlloc );.  if(
5230: 20 70 50 61 72 73 65 2d 3e 6f 6f 6d 20 29 20 72   pParse->oom ) r
5240: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 6e 4e 65 77  eturn -1;.  nNew
5250: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 41 6c 6c 6f   = pParse->nAllo
5260: 63 2a 32 20 2b 20 31 30 3b 0a 20 20 70 4e 65 77  c*2 + 10;.  pNew
5270: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   = sqlite3_reall
5280: 6f 63 28 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65  oc(pParse->aNode
5290: 2c 20 73 69 7a 65 6f 66 28 4a 73 6f 6e 4e 6f 64  , sizeof(JsonNod
52a0: 65 29 2a 6e 4e 65 77 29 3b 0a 20 20 69 66 28 20  e)*nNew);.  if( 
52b0: 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 70  pNew==0 ){.    p
52c0: 50 61 72 73 65 2d 3e 6f 6f 6d 20 3d 20 31 3b 0a  Parse->oom = 1;.
52d0: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
52e0: 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 41 6c   }.  pParse->nAl
52f0: 6c 6f 63 20 3d 20 6e 4e 65 77 3b 0a 20 20 70 50  loc = nNew;.  pP
5300: 61 72 73 65 2d 3e 61 4e 6f 64 65 20 3d 20 70 4e  arse->aNode = pN
5310: 65 77 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ew;.  assert( pP
5320: 61 72 73 65 2d 3e 6e 4e 6f 64 65 3c 70 50 61 72  arse->nNode<pPar
5330: 73 65 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 20 20  se->nAlloc );.  
5340: 72 65 74 75 72 6e 20 6a 73 6f 6e 50 61 72 73 65  return jsonParse
5350: 41 64 64 4e 6f 64 65 28 70 50 61 72 73 65 2c 20  AddNode(pParse, 
5360: 65 54 79 70 65 2c 20 6e 2c 20 7a 43 6f 6e 74 65  eType, n, zConte
5370: 6e 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  nt);.}../*.** Cr
5380: 65 61 74 65 20 61 20 6e 65 77 20 4a 73 6f 6e 4e  eate a new JsonN
5390: 6f 64 65 20 69 6e 73 74 61 6e 63 65 20 62 61 73  ode instance bas
53a0: 65 64 20 6f 6e 20 74 68 65 20 61 72 67 75 6d 65  ed on the argume
53b0: 6e 74 73 20 61 6e 64 20 61 70 70 65 6e 64 20 74  nts and append t
53c0: 68 61 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20  hat.** instance 
53d0: 74 6f 20 74 68 65 20 4a 73 6f 6e 50 61 72 73 65  to the JsonParse
53e0: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  .  Return the in
53f0: 64 65 78 20 69 6e 20 70 50 61 72 73 65 2d 3e 61  dex in pParse->a
5400: 4e 6f 64 65 5b 5d 20 6f 66 20 74 68 65 0a 2a 2a  Node[] of the.**
5410: 20 6e 65 77 20 6e 6f 64 65 2c 20 6f 72 20 2d 31   new node, or -1
5420: 20 69 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   if a memory all
5430: 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2e 0a 2a  ocation fails..*
5440: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 73 6f  /.static int jso
5450: 6e 50 61 72 73 65 41 64 64 4e 6f 64 65 28 0a 20  nParseAddNode(. 
5460: 20 4a 73 6f 6e 50 61 72 73 65 20 2a 70 50 61 72   JsonParse *pPar
5470: 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 41 70  se,        /* Ap
5480: 70 65 6e 64 20 74 68 65 20 6e 6f 64 65 20 74 6f  pend the node to
5490: 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a   this object */.
54a0: 20 20 75 33 32 20 65 54 79 70 65 2c 20 20 20 20    u32 eType,    
54b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
54c0: 6f 64 65 20 74 79 70 65 20 2a 2f 0a 20 20 75 33  ode type */.  u3
54d0: 32 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  2 n,            
54e0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
54f0: 6e 74 20 73 69 7a 65 20 6f 72 20 73 75 62 2d 6e  nt size or sub-n
5500: 6f 64 65 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 63  ode count */.  c
5510: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6e 74  onst char *zCont
5520: 65 6e 74 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74  ent      /* Cont
5530: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 4a 73 6f 6e  ent */.){.  Json
5540: 4e 6f 64 65 20 2a 70 3b 0a 20 20 69 66 28 20 70  Node *p;.  if( p
5550: 50 61 72 73 65 2d 3e 6e 4e 6f 64 65 3e 3d 70 50  Parse->nNode>=pP
5560: 61 72 73 65 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a  arse->nAlloc ){.
5570: 20 20 20 20 72 65 74 75 72 6e 20 6a 73 6f 6e 50      return jsonP
5580: 61 72 73 65 41 64 64 4e 6f 64 65 45 78 70 61 6e  arseAddNodeExpan
5590: 64 28 70 50 61 72 73 65 2c 20 65 54 79 70 65 2c  d(pParse, eType,
55a0: 20 6e 2c 20 7a 43 6f 6e 74 65 6e 74 29 3b 0a 20   n, zContent);. 
55b0: 20 7d 0a 20 20 70 20 3d 20 26 70 50 61 72 73 65   }.  p = &pParse
55c0: 2d 3e 61 4e 6f 64 65 5b 70 50 61 72 73 65 2d 3e  ->aNode[pParse->
55d0: 6e 4e 6f 64 65 5d 3b 0a 20 20 70 2d 3e 65 54 79  nNode];.  p->eTy
55e0: 70 65 20 3d 20 28 75 38 29 65 54 79 70 65 3b 0a  pe = (u8)eType;.
55f0: 20 20 70 2d 3e 6a 6e 46 6c 61 67 73 20 3d 20 30    p->jnFlags = 0
5600: 3b 0a 20 20 70 2d 3e 6e 20 3d 20 6e 3b 0a 20 20  ;.  p->n = n;.  
5610: 70 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 20 3d  p->u.zJContent =
5620: 20 7a 43 6f 6e 74 65 6e 74 3b 0a 20 20 72 65 74   zContent;.  ret
5630: 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 4e 6f 64  urn pParse->nNod
5640: 65 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  e++;.}../*.** Re
5650: 74 75 72 6e 20 74 72 75 65 20 69 66 20 7a 5b 5d  turn true if z[]
5660: 20 62 65 67 69 6e 73 20 77 69 74 68 20 34 20 28   begins with 4 (
5670: 6f 72 20 6d 6f 72 65 29 20 68 65 78 61 64 65 63  or more) hexadec
5680: 69 6d 61 6c 20 64 69 67 69 74 73 0a 2a 2f 0a 73  imal digits.*/.s
5690: 74 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e 49 73  tatic int jsonIs
56a0: 34 48 65 78 28 63 6f 6e 73 74 20 63 68 61 72 20  4Hex(const char 
56b0: 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *z){.  int i;.  
56c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 34 3b 20 69 2b  for(i=0; i<4; i+
56d0: 2b 29 20 69 66 28 20 21 73 61 66 65 5f 69 73 78  +) if( !safe_isx
56e0: 64 69 67 69 74 28 7a 5b 69 5d 29 20 29 20 72 65  digit(z[i]) ) re
56f0: 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e  turn 0;.  return
5700: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72   1;.}../*.** Par
5710: 73 65 20 61 20 73 69 6e 67 6c 65 20 4a 53 4f 4e  se a single JSON
5720: 20 76 61 6c 75 65 20 77 68 69 63 68 20 62 65 67   value which beg
5730: 69 6e 73 20 61 74 20 70 50 61 72 73 65 2d 3e 7a  ins at pParse->z
5740: 4a 73 6f 6e 5b 69 5d 2e 20 20 52 65 74 75 72 6e  Json[i].  Return
5750: 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66   the.** index of
5760: 20 74 68 65 20 66 69 72 73 74 20 63 68 61 72 61   the first chara
5770: 63 74 65 72 20 70 61 73 74 20 74 68 65 20 65 6e  cter past the en
5780: 64 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 70  d of the value p
5790: 61 72 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  arsed..**.** Ret
57a0: 75 72 6e 20 6e 65 67 61 74 69 76 65 20 66 6f 72  urn negative for
57b0: 20 61 20 73 79 6e 74 61 78 20 65 72 72 6f 72 2e   a syntax error.
57c0: 20 20 53 70 65 63 69 61 6c 20 63 61 73 65 73 3a    Special cases:
57d0: 20 20 72 65 74 75 72 6e 20 2d 32 20 69 66 20 74    return -2 if t
57e0: 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 6f 6e 2d  he.** first non-
57f0: 77 68 69 74 65 73 70 61 63 65 20 63 68 61 72 61  whitespace chara
5800: 63 74 65 72 20 69 73 20 27 7d 27 20 61 6e 64 20  cter is '}' and 
5810: 72 65 74 75 72 6e 20 2d 33 20 69 66 20 74 68 65  return -3 if the
5820: 20 66 69 72 73 74 0a 2a 2a 20 6e 6f 6e 2d 77 68   first.** non-wh
5830: 69 74 65 73 70 61 63 65 20 63 68 61 72 61 63 74  itespace charact
5840: 65 72 20 69 73 20 27 5d 27 2e 0a 2a 2f 0a 73 74  er is ']'..*/.st
5850: 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e 50 61 72  atic int jsonPar
5860: 73 65 56 61 6c 75 65 28 4a 73 6f 6e 50 61 72 73  seValue(JsonPars
5870: 65 20 2a 70 50 61 72 73 65 2c 20 75 33 32 20 69  e *pParse, u32 i
5880: 29 7b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 75  ){.  char c;.  u
5890: 33 32 20 6a 3b 0a 20 20 69 6e 74 20 69 54 68 69  32 j;.  int iThi
58a0: 73 3b 0a 20 20 69 6e 74 20 78 3b 0a 20 20 4a 73  s;.  int x;.  Js
58b0: 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 3b 0a 20  onNode *pNode;. 
58c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
58d0: 20 70 50 61 72 73 65 2d 3e 7a 4a 73 6f 6e 3b 0a   pParse->zJson;.
58e0: 20 20 77 68 69 6c 65 28 20 73 61 66 65 5f 69 73    while( safe_is
58f0: 73 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b 20 69  space(z[i]) ){ i
5900: 2b 2b 3b 20 7d 0a 20 20 69 66 28 20 28 63 20 3d  ++; }.  if( (c =
5910: 20 7a 5b 69 5d 29 3d 3d 27 7b 27 20 29 7b 0a 20   z[i])=='{' ){. 
5920: 20 20 20 2f 2a 20 50 61 72 73 65 20 6f 62 6a 65     /* Parse obje
5930: 63 74 20 2a 2f 0a 20 20 20 20 69 54 68 69 73 20  ct */.    iThis 
5940: 3d 20 6a 73 6f 6e 50 61 72 73 65 41 64 64 4e 6f  = jsonParseAddNo
5950: 64 65 28 70 50 61 72 73 65 2c 20 4a 53 4f 4e 5f  de(pParse, JSON_
5960: 4f 42 4a 45 43 54 2c 20 30 2c 20 30 29 3b 0a 20  OBJECT, 0, 0);. 
5970: 20 20 20 69 66 28 20 69 54 68 69 73 3c 30 20 29     if( iThis<0 )
5980: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
5990: 66 6f 72 28 6a 3d 69 2b 31 3b 3b 6a 2b 2b 29 7b  for(j=i+1;;j++){
59a0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 73 61  .      while( sa
59b0: 66 65 5f 69 73 73 70 61 63 65 28 7a 5b 6a 5d 29  fe_isspace(z[j])
59c0: 20 29 7b 20 6a 2b 2b 3b 20 7d 0a 20 20 20 20 20   ){ j++; }.     
59d0: 20 69 66 28 20 2b 2b 70 50 61 72 73 65 2d 3e 69   if( ++pParse->i
59e0: 44 65 70 74 68 20 3e 20 4a 53 4f 4e 5f 4d 41 58  Depth > JSON_MAX
59f0: 5f 44 45 50 54 48 20 29 20 72 65 74 75 72 6e 20  _DEPTH ) return 
5a00: 2d 31 3b 0a 20 20 20 20 20 20 78 20 3d 20 6a 73  -1;.      x = js
5a10: 6f 6e 50 61 72 73 65 56 61 6c 75 65 28 70 50 61  onParseValue(pPa
5a20: 72 73 65 2c 20 6a 29 3b 0a 20 20 20 20 20 20 69  rse, j);.      i
5a30: 66 28 20 78 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( x<0 ){.      
5a40: 20 20 70 50 61 72 73 65 2d 3e 69 44 65 70 74 68    pParse->iDepth
5a50: 2d 2d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  --;.        if( 
5a60: 78 3d 3d 28 2d 32 29 20 26 26 20 70 50 61 72 73  x==(-2) && pPars
5a70: 65 2d 3e 6e 4e 6f 64 65 3d 3d 28 75 33 32 29 69  e->nNode==(u32)i
5a80: 54 68 69 73 2b 31 20 29 20 72 65 74 75 72 6e 20  This+1 ) return 
5a90: 6a 2b 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74  j+1;.        ret
5aa0: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  urn -1;.      }.
5ab0: 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
5ac0: 2d 3e 6f 6f 6d 20 29 20 72 65 74 75 72 6e 20 2d  ->oom ) return -
5ad0: 31 3b 0a 20 20 20 20 20 20 70 4e 6f 64 65 20 3d  1;.      pNode =
5ae0: 20 26 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65 5b   &pParse->aNode[
5af0: 70 50 61 72 73 65 2d 3e 6e 4e 6f 64 65 2d 31 5d  pParse->nNode-1]
5b00: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 6f 64  ;.      if( pNod
5b10: 65 2d 3e 65 54 79 70 65 21 3d 4a 53 4f 4e 5f 53  e->eType!=JSON_S
5b20: 54 52 49 4e 47 20 29 20 72 65 74 75 72 6e 20 2d  TRING ) return -
5b30: 31 3b 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e  1;.      pNode->
5b40: 6a 6e 46 6c 61 67 73 20 7c 3d 20 4a 4e 4f 44 45  jnFlags |= JNODE
5b50: 5f 4c 41 42 45 4c 3b 0a 20 20 20 20 20 20 6a 20  _LABEL;.      j 
5b60: 3d 20 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  = x;.      while
5b70: 28 20 73 61 66 65 5f 69 73 73 70 61 63 65 28 7a  ( safe_isspace(z
5b80: 5b 6a 5d 29 20 29 7b 20 6a 2b 2b 3b 20 7d 0a 20  [j]) ){ j++; }. 
5b90: 20 20 20 20 20 69 66 28 20 7a 5b 6a 5d 21 3d 27       if( z[j]!='
5ba0: 3a 27 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  :' ) return -1;.
5bb0: 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
5bc0: 20 78 20 3d 20 6a 73 6f 6e 50 61 72 73 65 56 61   x = jsonParseVa
5bd0: 6c 75 65 28 70 50 61 72 73 65 2c 20 6a 29 3b 0a  lue(pParse, j);.
5be0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 69 44        pParse->iD
5bf0: 65 70 74 68 2d 2d 3b 0a 20 20 20 20 20 20 69 66  epth--;.      if
5c00: 28 20 78 3c 30 20 29 20 72 65 74 75 72 6e 20 2d  ( x<0 ) return -
5c10: 31 3b 0a 20 20 20 20 20 20 6a 20 3d 20 78 3b 0a  1;.      j = x;.
5c20: 20 20 20 20 20 20 77 68 69 6c 65 28 20 73 61 66        while( saf
5c30: 65 5f 69 73 73 70 61 63 65 28 7a 5b 6a 5d 29 20  e_isspace(z[j]) 
5c40: 29 7b 20 6a 2b 2b 3b 20 7d 0a 20 20 20 20 20 20  ){ j++; }.      
5c50: 63 20 3d 20 7a 5b 6a 5d 3b 0a 20 20 20 20 20 20  c = z[j];.      
5c60: 69 66 28 20 63 3d 3d 27 2c 27 20 29 20 63 6f 6e  if( c==',' ) con
5c70: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
5c80: 20 63 21 3d 27 7d 27 20 29 20 72 65 74 75 72 6e   c!='}' ) return
5c90: 20 2d 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   -1;.      break
5ca0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
5cb0: 73 65 2d 3e 61 4e 6f 64 65 5b 69 54 68 69 73 5d  se->aNode[iThis]
5cc0: 2e 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4e 6f  .n = pParse->nNo
5cd0: 64 65 20 2d 20 28 75 33 32 29 69 54 68 69 73 20  de - (u32)iThis 
5ce0: 2d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  - 1;.    return 
5cf0: 6a 2b 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  j+1;.  }else if(
5d00: 20 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 2f   c=='[' ){.    /
5d10: 2a 20 50 61 72 73 65 20 61 72 72 61 79 20 2a 2f  * Parse array */
5d20: 0a 20 20 20 20 69 54 68 69 73 20 3d 20 6a 73 6f  .    iThis = jso
5d30: 6e 50 61 72 73 65 41 64 64 4e 6f 64 65 28 70 50  nParseAddNode(pP
5d40: 61 72 73 65 2c 20 4a 53 4f 4e 5f 41 52 52 41 59  arse, JSON_ARRAY
5d50: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
5d60: 20 69 54 68 69 73 3c 30 20 29 20 72 65 74 75 72   iThis<0 ) retur
5d70: 6e 20 2d 31 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  n -1;.    for(j=
5d80: 69 2b 31 3b 3b 6a 2b 2b 29 7b 0a 20 20 20 20 20  i+1;;j++){.     
5d90: 20 77 68 69 6c 65 28 20 73 61 66 65 5f 69 73 73   while( safe_iss
5da0: 70 61 63 65 28 7a 5b 6a 5d 29 20 29 7b 20 6a 2b  pace(z[j]) ){ j+
5db0: 2b 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20 2b  +; }.      if( +
5dc0: 2b 70 50 61 72 73 65 2d 3e 69 44 65 70 74 68 20  +pParse->iDepth 
5dd0: 3e 20 4a 53 4f 4e 5f 4d 41 58 5f 44 45 50 54 48  > JSON_MAX_DEPTH
5de0: 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
5df0: 20 20 20 20 78 20 3d 20 6a 73 6f 6e 50 61 72 73      x = jsonPars
5e00: 65 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 6a  eValue(pParse, j
5e10: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
5e20: 3e 69 44 65 70 74 68 2d 2d 3b 0a 20 20 20 20 20  >iDepth--;.     
5e30: 20 69 66 28 20 78 3c 30 20 29 7b 0a 20 20 20 20   if( x<0 ){.    
5e40: 20 20 20 20 69 66 28 20 78 3d 3d 28 2d 33 29 20      if( x==(-3) 
5e50: 26 26 20 70 50 61 72 73 65 2d 3e 6e 4e 6f 64 65  && pParse->nNode
5e60: 3d 3d 28 75 33 32 29 69 54 68 69 73 2b 31 20 29  ==(u32)iThis+1 )
5e70: 20 72 65 74 75 72 6e 20 6a 2b 31 3b 0a 20 20 20   return j+1;.   
5e80: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
5e90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6a 20        }.      j 
5ea0: 3d 20 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  = x;.      while
5eb0: 28 20 73 61 66 65 5f 69 73 73 70 61 63 65 28 7a  ( safe_isspace(z
5ec0: 5b 6a 5d 29 20 29 7b 20 6a 2b 2b 3b 20 7d 0a 20  [j]) ){ j++; }. 
5ed0: 20 20 20 20 20 63 20 3d 20 7a 5b 6a 5d 3b 0a 20       c = z[j];. 
5ee0: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 2c 27 20       if( c==',' 
5ef0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
5f00: 20 20 69 66 28 20 63 21 3d 27 5d 27 20 29 20 72    if( c!=']' ) r
5f10: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
5f20: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
5f30: 20 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65 5b 69   pParse->aNode[i
5f40: 54 68 69 73 5d 2e 6e 20 3d 20 70 50 61 72 73 65  This].n = pParse
5f50: 2d 3e 6e 4e 6f 64 65 20 2d 20 28 75 33 32 29 69  ->nNode - (u32)i
5f60: 54 68 69 73 20 2d 20 31 3b 0a 20 20 20 20 72 65  This - 1;.    re
5f70: 74 75 72 6e 20 6a 2b 31 3b 0a 20 20 7d 65 6c 73  turn j+1;.  }els
5f80: 65 20 69 66 28 20 63 3d 3d 27 22 27 20 29 7b 0a  e if( c=='"' ){.
5f90: 20 20 20 20 2f 2a 20 50 61 72 73 65 20 73 74 72      /* Parse str
5fa0: 69 6e 67 20 2a 2f 0a 20 20 20 20 75 38 20 6a 6e  ing */.    u8 jn
5fb0: 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 6a  Flags = 0;.    j
5fc0: 20 3d 20 69 2b 31 3b 0a 20 20 20 20 66 6f 72 28   = i+1;.    for(
5fd0: 3b 3b 29 7b 0a 20 20 20 20 20 20 63 20 3d 20 7a  ;;){.      c = z
5fe0: 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 28  [j];.      if( (
5ff0: 63 20 26 20 7e 30 78 31 66 29 3d 3d 30 20 29 7b  c & ~0x1f)==0 ){
6000: 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74  .        /* Cont
6010: 72 6f 6c 20 63 68 61 72 61 63 74 65 72 73 20 61  rol characters a
6020: 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69  re not allowed i
6030: 6e 20 73 74 72 69 6e 67 73 20 2a 2f 0a 20 20 20  n strings */.   
6040: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
6050: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
6060: 28 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20  ( c=='\\' ){.   
6070: 20 20 20 20 20 63 20 3d 20 7a 5b 2b 2b 6a 5d 3b       c = z[++j];
6080: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d  .        if( c==
6090: 27 22 27 20 7c 7c 20 63 3d 3d 27 5c 5c 27 20 7c  '"' || c=='\\' |
60a0: 7c 20 63 3d 3d 27 2f 27 20 7c 7c 20 63 3d 3d 27  | c=='/' || c=='
60b0: 62 27 20 7c 7c 20 63 3d 3d 27 66 27 0a 20 20 20  b' || c=='f'.   
60c0: 20 20 20 20 20 20 20 20 7c 7c 20 63 3d 3d 27 6e          || c=='n
60d0: 27 20 7c 7c 20 63 3d 3d 27 72 27 20 7c 7c 20 63  ' || c=='r' || c
60e0: 3d 3d 27 74 27 0a 20 20 20 20 20 20 20 20 20 20  =='t'.          
60f0: 20 7c 7c 20 28 63 3d 3d 27 75 27 20 26 26 20 6a   || (c=='u' && j
6100: 73 6f 6e 49 73 34 48 65 78 28 7a 2b 6a 2b 31 29  sonIs4Hex(z+j+1)
6110: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6a  ) ){.          j
6120: 6e 46 6c 61 67 73 20 3d 20 4a 4e 4f 44 45 5f 45  nFlags = JNODE_E
6130: 53 43 41 50 45 3b 0a 20 20 20 20 20 20 20 20 7d  SCAPE;.        }
6140: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
6150: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
6160: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
6170: 20 69 66 28 20 63 3d 3d 27 22 27 20 29 7b 0a 20   if( c=='"' ){. 
6180: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
6190: 20 20 20 20 7d 0a 20 20 20 20 20 20 6a 2b 2b 3b      }.      j++;
61a0: 0a 20 20 20 20 7d 0a 20 20 20 20 6a 73 6f 6e 50  .    }.    jsonP
61b0: 61 72 73 65 41 64 64 4e 6f 64 65 28 70 50 61 72  arseAddNode(pPar
61c0: 73 65 2c 20 4a 53 4f 4e 5f 53 54 52 49 4e 47 2c  se, JSON_STRING,
61d0: 20 6a 2b 31 2d 69 2c 20 26 7a 5b 69 5d 29 3b 0a   j+1-i, &z[i]);.
61e0: 20 20 20 20 69 66 28 20 21 70 50 61 72 73 65 2d      if( !pParse-
61f0: 3e 6f 6f 6d 20 29 20 70 50 61 72 73 65 2d 3e 61  >oom ) pParse->a
6200: 4e 6f 64 65 5b 70 50 61 72 73 65 2d 3e 6e 4e 6f  Node[pParse->nNo
6210: 64 65 2d 31 5d 2e 6a 6e 46 6c 61 67 73 20 3d 20  de-1].jnFlags = 
6220: 6a 6e 46 6c 61 67 73 3b 0a 20 20 20 20 72 65 74  jnFlags;.    ret
6230: 75 72 6e 20 6a 2b 31 3b 0a 20 20 7d 65 6c 73 65  urn j+1;.  }else
6240: 20 69 66 28 20 63 3d 3d 27 6e 27 0a 20 20 20 20   if( c=='n'.    
6250: 20 20 20 20 20 26 26 20 73 74 72 6e 63 6d 70 28       && strncmp(
6260: 7a 2b 69 2c 22 6e 75 6c 6c 22 2c 34 29 3d 3d 30  z+i,"null",4)==0
6270: 0a 20 20 20 20 20 20 20 20 20 26 26 20 21 73 61  .         && !sa
6280: 66 65 5f 69 73 61 6c 6e 75 6d 28 7a 5b 69 2b 34  fe_isalnum(z[i+4
6290: 5d 29 20 29 7b 0a 20 20 20 20 6a 73 6f 6e 50 61  ]) ){.    jsonPa
62a0: 72 73 65 41 64 64 4e 6f 64 65 28 70 50 61 72 73  rseAddNode(pPars
62b0: 65 2c 20 4a 53 4f 4e 5f 4e 55 4c 4c 2c 20 30 2c  e, JSON_NULL, 0,
62c0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
62d0: 69 2b 34 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  i+4;.  }else if(
62e0: 20 63 3d 3d 27 74 27 0a 20 20 20 20 20 20 20 20   c=='t'.        
62f0: 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 2b 69 2c   && strncmp(z+i,
6300: 22 74 72 75 65 22 2c 34 29 3d 3d 30 0a 20 20 20  "true",4)==0.   
6310: 20 20 20 20 20 20 26 26 20 21 73 61 66 65 5f 69        && !safe_i
6320: 73 61 6c 6e 75 6d 28 7a 5b 69 2b 34 5d 29 20 29  salnum(z[i+4]) )
6330: 7b 0a 20 20 20 20 6a 73 6f 6e 50 61 72 73 65 41  {.    jsonParseA
6340: 64 64 4e 6f 64 65 28 70 50 61 72 73 65 2c 20 4a  ddNode(pParse, J
6350: 53 4f 4e 5f 54 52 55 45 2c 20 30 2c 20 30 29 3b  SON_TRUE, 0, 0);
6360: 0a 20 20 20 20 72 65 74 75 72 6e 20 69 2b 34 3b  .    return i+4;
6370: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d  .  }else if( c==
6380: 27 66 27 0a 20 20 20 20 20 20 20 20 20 26 26 20  'f'.         && 
6390: 73 74 72 6e 63 6d 70 28 7a 2b 69 2c 22 66 61 6c  strncmp(z+i,"fal
63a0: 73 65 22 2c 35 29 3d 3d 30 0a 20 20 20 20 20 20  se",5)==0.      
63b0: 20 20 20 26 26 20 21 73 61 66 65 5f 69 73 61 6c     && !safe_isal
63c0: 6e 75 6d 28 7a 5b 69 2b 35 5d 29 20 29 7b 0a 20  num(z[i+5]) ){. 
63d0: 20 20 20 6a 73 6f 6e 50 61 72 73 65 41 64 64 4e     jsonParseAddN
63e0: 6f 64 65 28 70 50 61 72 73 65 2c 20 4a 53 4f 4e  ode(pParse, JSON
63f0: 5f 46 41 4c 53 45 2c 20 30 2c 20 30 29 3b 0a 20  _FALSE, 0, 0);. 
6400: 20 20 20 72 65 74 75 72 6e 20 69 2b 35 3b 0a 20     return i+5;. 
6410: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 2d   }else if( c=='-
6420: 27 20 7c 7c 20 28 63 3e 3d 27 30 27 20 26 26 20  ' || (c>='0' && 
6430: 63 3c 3d 27 39 27 29 20 29 7b 0a 20 20 20 20 2f  c<='9') ){.    /
6440: 2a 20 50 61 72 73 65 20 6e 75 6d 62 65 72 20 2a  * Parse number *
6450: 2f 0a 20 20 20 20 75 38 20 73 65 65 6e 44 50 20  /.    u8 seenDP 
6460: 3d 20 30 3b 0a 20 20 20 20 75 38 20 73 65 65 6e  = 0;.    u8 seen
6470: 45 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  E = 0;.    asser
6480: 74 28 20 27 2d 27 20 3c 20 27 30 27 20 29 3b 0a  t( '-' < '0' );.
6490: 20 20 20 20 69 66 28 20 63 3c 3d 27 30 27 20 29      if( c<='0' )
64a0: 7b 0a 20 20 20 20 20 20 6a 20 3d 20 63 3d 3d 27  {.      j = c=='
64b0: 2d 27 20 3f 20 69 2b 31 20 3a 20 69 3b 0a 20 20  -' ? i+1 : i;.  
64c0: 20 20 20 20 69 66 28 20 7a 5b 6a 5d 3d 3d 27 30      if( z[j]=='0
64d0: 27 20 26 26 20 7a 5b 6a 2b 31 5d 3e 3d 27 30 27  ' && z[j+1]>='0'
64e0: 20 26 26 20 7a 5b 6a 2b 31 5d 3c 3d 27 39 27 20   && z[j+1]<='9' 
64f0: 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
6500: 20 7d 0a 20 20 20 20 6a 20 3d 20 69 2b 31 3b 0a   }.    j = i+1;.
6510: 20 20 20 20 66 6f 72 28 3b 3b 20 6a 2b 2b 29 7b      for(;; j++){
6520: 0a 20 20 20 20 20 20 63 20 3d 20 7a 5b 6a 5d 3b  .      c = z[j];
6530: 0a 20 20 20 20 20 20 69 66 28 20 63 3e 3d 27 30  .      if( c>='0
6540: 27 20 26 26 20 63 3c 3d 27 39 27 20 29 20 63 6f  ' && c<='9' ) co
6550: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
6560: 28 20 63 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20  ( c=='.' ){.    
6570: 20 20 20 20 69 66 28 20 7a 5b 6a 2d 31 5d 3d 3d      if( z[j-1]==
6580: 27 2d 27 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  '-' ) return -1;
6590: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 65 65  .        if( see
65a0: 6e 44 50 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  nDP ) return -1;
65b0: 0a 20 20 20 20 20 20 20 20 73 65 65 6e 44 50 20  .        seenDP 
65c0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  = 1;.        con
65d0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
65e0: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 65 27 20       if( c=='e' 
65f0: 7c 7c 20 63 3d 3d 27 45 27 20 29 7b 0a 20 20 20  || c=='E' ){.   
6600: 20 20 20 20 20 69 66 28 20 7a 5b 6a 2d 31 5d 3c       if( z[j-1]<
6610: 27 30 27 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  '0' ) return -1;
6620: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 65 65  .        if( see
6630: 6e 45 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  nE ) return -1;.
6640: 20 20 20 20 20 20 20 20 73 65 65 6e 44 50 20 3d          seenDP =
6650: 20 73 65 65 6e 45 20 3d 20 31 3b 0a 20 20 20 20   seenE = 1;.    
6660: 20 20 20 20 63 20 3d 20 7a 5b 6a 2b 31 5d 3b 0a      c = z[j+1];.
6670: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
6680: 2b 27 20 7c 7c 20 63 3d 3d 27 2d 27 20 29 7b 0a  +' || c=='-' ){.
6690: 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20            j++;. 
66a0: 20 20 20 20 20 20 20 20 20 63 20 3d 20 7a 5b 6a           c = z[j
66b0: 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  +1];.        }. 
66c0: 20 20 20 20 20 20 20 69 66 28 20 63 3c 27 30 27         if( c<'0'
66d0: 20 7c 7c 20 63 3e 27 39 27 20 29 20 72 65 74 75   || c>'9' ) retu
66e0: 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 63  rn -1;.        c
66f0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
6700: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6710: 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 5b 6a 2d    }.    if( z[j-
6720: 31 5d 3c 27 30 27 20 29 20 72 65 74 75 72 6e 20  1]<'0' ) return 
6730: 2d 31 3b 0a 20 20 20 20 6a 73 6f 6e 50 61 72 73  -1;.    jsonPars
6740: 65 41 64 64 4e 6f 64 65 28 70 50 61 72 73 65 2c  eAddNode(pParse,
6750: 20 73 65 65 6e 44 50 20 3f 20 4a 53 4f 4e 5f 52   seenDP ? JSON_R
6760: 45 41 4c 20 3a 20 4a 53 4f 4e 5f 49 4e 54 2c 0a  EAL : JSON_INT,.
6770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6780: 20 20 20 20 20 20 20 20 6a 20 2d 20 69 2c 20 26          j - i, &
6790: 7a 5b 69 5d 29 3b 0a 20 20 20 20 72 65 74 75 72  z[i]);.    retur
67a0: 6e 20 6a 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  n j;.  }else if(
67b0: 20 63 3d 3d 27 7d 27 20 29 7b 0a 20 20 20 20 72   c=='}' ){.    r
67c0: 65 74 75 72 6e 20 2d 32 3b 20 20 2f 2a 20 45 6e  eturn -2;  /* En
67d0: 64 20 6f 66 20 7b 2e 2e 2e 7d 20 2a 2f 0a 20 20  d of {...} */.  
67e0: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5d 27  }else if( c==']'
67f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d   ){.    return -
6800: 33 3b 20 20 2f 2a 20 45 6e 64 20 6f 66 20 5b 2e  3;  /* End of [.
6810: 2e 2e 5d 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69  ..] */.  }else i
6820: 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72  f( c==0 ){.    r
6830: 65 74 75 72 6e 20 30 3b 20 20 20 2f 2a 20 45 6e  eturn 0;   /* En
6840: 64 20 6f 66 20 66 69 6c 65 20 2a 2f 0a 20 20 7d  d of file */.  }
6850: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
6860: 20 2d 31 3b 20 20 2f 2a 20 53 79 6e 74 61 78 20   -1;  /* Syntax 
6870: 65 72 72 6f 72 20 2a 2f 0a 20 20 7d 0a 7d 0a 0a  error */.  }.}..
6880: 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 63 6f  /*.** Parse a co
6890: 6d 70 6c 65 74 65 20 4a 53 4f 4e 20 73 74 72 69  mplete JSON stri
68a0: 6e 67 2e 20 20 52 65 74 75 72 6e 20 30 20 6f 6e  ng.  Return 0 on
68b0: 20 73 75 63 63 65 73 73 20 6f 72 20 6e 6f 6e 2d   success or non-
68c0: 7a 65 72 6f 20 69 66 20 74 68 65 72 65 0a 2a 2a  zero if there.**
68d0: 20 61 72 65 20 61 6e 79 20 65 72 72 6f 72 73 2e   are any errors.
68e0: 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63    If an error oc
68f0: 63 75 72 73 2c 20 66 72 65 65 20 61 6c 6c 20 6d  curs, free all m
6900: 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
6910: 20 77 69 74 68 0a 2a 2a 20 70 50 61 72 73 65 2e   with.** pParse.
6920: 0a 2a 2a 0a 2a 2a 20 70 50 61 72 73 65 20 69 73  .**.** pParse is
6930: 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 77   uninitialized w
6940: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
6950: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73   is called..*/.s
6960: 74 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e 50 61  tatic int jsonPa
6970: 72 73 65 28 0a 20 20 4a 73 6f 6e 50 61 72 73 65  rse(.  JsonParse
6980: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
6990: 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
69a0: 65 20 61 6e 64 20 66 69 6c 6c 20 74 68 69 73 20  e and fill this 
69b0: 4a 73 6f 6e 50 61 72 73 65 20 6f 62 6a 65 63 74  JsonParse object
69c0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f   */.  sqlite3_co
69d0: 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20 20  ntext *pCtx,    
69e0: 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 65 72 72     /* Report err
69f0: 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f  ors here */.  co
6a00: 6e 73 74 20 63 68 61 72 20 2a 7a 4a 73 6f 6e 20  nst char *zJson 
6a10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
6a20: 70 75 74 20 4a 53 4f 4e 20 74 65 78 74 20 74 6f  put JSON text to
6a30: 20 62 65 20 70 61 72 73 65 64 20 2a 2f 0a 29 7b   be parsed */.){
6a40: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6d 65 6d 73  .  int i;.  mems
6a50: 65 74 28 70 50 61 72 73 65 2c 20 30 2c 20 73 69  et(pParse, 0, si
6a60: 7a 65 6f 66 28 2a 70 50 61 72 73 65 29 29 3b 0a  zeof(*pParse));.
6a70: 20 20 69 66 28 20 7a 4a 73 6f 6e 3d 3d 30 20 29    if( zJson==0 )
6a80: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 70 50 61   return 1;.  pPa
6a90: 72 73 65 2d 3e 7a 4a 73 6f 6e 20 3d 20 7a 4a 73  rse->zJson = zJs
6aa0: 6f 6e 3b 0a 20 20 69 20 3d 20 6a 73 6f 6e 50 61  on;.  i = jsonPa
6ab0: 72 73 65 56 61 6c 75 65 28 70 50 61 72 73 65 2c  rseValue(pParse,
6ac0: 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73   0);.  if( pPars
6ad0: 65 2d 3e 6f 6f 6d 20 29 20 69 20 3d 20 2d 31 3b  e->oom ) i = -1;
6ae0: 0a 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20  .  if( i>0 ){.  
6af0: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
6b00: 2d 3e 69 44 65 70 74 68 3d 3d 30 20 29 3b 0a 20  ->iDepth==0 );. 
6b10: 20 20 20 77 68 69 6c 65 28 20 73 61 66 65 5f 69     while( safe_i
6b20: 73 73 70 61 63 65 28 7a 4a 73 6f 6e 5b 69 5d 29  sspace(zJson[i])
6b30: 20 29 20 69 2b 2b 3b 0a 20 20 20 20 69 66 28 20   ) i++;.    if( 
6b40: 7a 4a 73 6f 6e 5b 69 5d 20 29 20 69 20 3d 20 2d  zJson[i] ) i = -
6b50: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c 3d  1;.  }.  if( i<=
6b60: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 74  0 ){.    if( pCt
6b70: 78 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  x!=0 ){.      if
6b80: 28 20 70 50 61 72 73 65 2d 3e 6f 6f 6d 20 29 7b  ( pParse->oom ){
6b90: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6ba0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
6bb0: 6d 65 6d 28 70 43 74 78 29 3b 0a 20 20 20 20 20  mem(pCtx);.     
6bc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6bd0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
6be0: 72 72 6f 72 28 70 43 74 78 2c 20 22 6d 61 6c 66  rror(pCtx, "malf
6bf0: 6f 72 6d 65 64 20 4a 53 4f 4e 22 2c 20 2d 31 29  ormed JSON", -1)
6c00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6c10: 20 20 20 20 6a 73 6f 6e 50 61 72 73 65 52 65 73      jsonParseRes
6c20: 65 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  et(pParse);.    
6c30: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
6c40: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20  return 0;.}../* 
6c50: 4d 61 72 6b 20 6e 6f 64 65 20 69 20 6f 66 20 70  Mark node i of p
6c60: 50 61 72 73 65 20 61 73 20 62 65 69 6e 67 20 61  Parse as being a
6c70: 20 63 68 69 6c 64 20 6f 66 20 69 50 61 72 65 6e   child of iParen
6c80: 74 2e 20 20 43 61 6c 6c 20 72 65 63 75 72 73 69  t.  Call recursi
6c90: 76 65 6c 79 0a 2a 2a 20 74 6f 20 66 69 6c 6c 20  vely.** to fill 
6ca0: 69 6e 20 61 6c 6c 20 74 68 65 20 64 65 73 63 65  in all the desce
6cb0: 6e 64 61 6e 74 73 20 6f 66 20 6e 6f 64 65 20 69  ndants of node i
6cc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6cd0: 20 6a 73 6f 6e 50 61 72 73 65 46 69 6c 6c 49 6e   jsonParseFillIn
6ce0: 50 61 72 65 6e 74 61 67 65 28 4a 73 6f 6e 50 61  Parentage(JsonPa
6cf0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 75 33 32  rse *pParse, u32
6d00: 20 69 2c 20 75 33 32 20 69 50 61 72 65 6e 74 29   i, u32 iParent)
6d10: 7b 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e  {.  JsonNode *pN
6d20: 6f 64 65 20 3d 20 26 70 50 61 72 73 65 2d 3e 61  ode = &pParse->a
6d30: 4e 6f 64 65 5b 69 5d 3b 0a 20 20 75 33 32 20 6a  Node[i];.  u32 j
6d40: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 61 55 70 5b  ;.  pParse->aUp[
6d50: 69 5d 20 3d 20 69 50 61 72 65 6e 74 3b 0a 20 20  i] = iParent;.  
6d60: 73 77 69 74 63 68 28 20 70 4e 6f 64 65 2d 3e 65  switch( pNode->e
6d70: 54 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  Type ){.    case
6d80: 20 4a 53 4f 4e 5f 41 52 52 41 59 3a 20 7b 0a 20   JSON_ARRAY: {. 
6d90: 20 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c       for(j=1; j<
6da0: 3d 70 4e 6f 64 65 2d 3e 6e 3b 20 6a 20 2b 3d 20  =pNode->n; j += 
6db0: 6a 73 6f 6e 4e 6f 64 65 53 69 7a 65 28 70 4e 6f  jsonNodeSize(pNo
6dc0: 64 65 2b 6a 29 29 7b 0a 20 20 20 20 20 20 20 20  de+j)){.        
6dd0: 6a 73 6f 6e 50 61 72 73 65 46 69 6c 6c 49 6e 50  jsonParseFillInP
6de0: 61 72 65 6e 74 61 67 65 28 70 50 61 72 73 65 2c  arentage(pParse,
6df0: 20 69 2b 6a 2c 20 69 29 3b 0a 20 20 20 20 20 20   i+j, i);.      
6e00: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
6e10: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 53     }.    case JS
6e20: 4f 4e 5f 4f 42 4a 45 43 54 3a 20 7b 0a 20 20 20  ON_OBJECT: {.   
6e30: 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 3d 70     for(j=1; j<=p
6e40: 4e 6f 64 65 2d 3e 6e 3b 20 6a 20 2b 3d 20 6a 73  Node->n; j += js
6e50: 6f 6e 4e 6f 64 65 53 69 7a 65 28 70 4e 6f 64 65  onNodeSize(pNode
6e60: 2b 6a 2b 31 29 2b 31 29 7b 0a 20 20 20 20 20 20  +j+1)+1){.      
6e70: 20 20 70 50 61 72 73 65 2d 3e 61 55 70 5b 69 2b    pParse->aUp[i+
6e80: 6a 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  j] = i;.        
6e90: 6a 73 6f 6e 50 61 72 73 65 46 69 6c 6c 49 6e 50  jsonParseFillInP
6ea0: 61 72 65 6e 74 61 67 65 28 70 50 61 72 73 65 2c  arentage(pParse,
6eb0: 20 69 2b 6a 2b 31 2c 20 69 29 3b 0a 20 20 20 20   i+j+1, i);.    
6ec0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
6ed0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
6ee0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 62 72 65 61  lt: {.      brea
6ef0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  k;.    }.  }.}..
6f00: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
6f10: 65 20 70 61 72 65 6e 74 61 67 65 20 6f 66 20 61  e parentage of a
6f20: 6c 6c 20 6e 6f 64 65 73 20 69 6e 20 61 20 63 6f  ll nodes in a co
6f30: 6d 70 6c 65 74 65 64 20 70 61 72 73 65 2e 0a 2a  mpleted parse..*
6f40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 73 6f  /.static int jso
6f50: 6e 50 61 72 73 65 46 69 6e 64 50 61 72 65 6e 74  nParseFindParent
6f60: 73 28 4a 73 6f 6e 50 61 72 73 65 20 2a 70 50 61  s(JsonParse *pPa
6f70: 72 73 65 29 7b 0a 20 20 75 33 32 20 2a 61 55 70  rse){.  u32 *aUp
6f80: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
6f90: 73 65 2d 3e 61 55 70 3d 3d 30 20 29 3b 0a 20 20  se->aUp==0 );.  
6fa0: 61 55 70 20 3d 20 70 50 61 72 73 65 2d 3e 61 55  aUp = pParse->aU
6fb0: 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  p = sqlite3_mall
6fc0: 6f 63 28 20 73 69 7a 65 6f 66 28 75 33 32 29 2a  oc( sizeof(u32)*
6fd0: 70 50 61 72 73 65 2d 3e 6e 4e 6f 64 65 20 29 3b  pParse->nNode );
6fe0: 0a 20 20 69 66 28 20 61 55 70 3d 3d 30 20 29 7b  .  if( aUp==0 ){
6ff0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6f 6f 6d  .    pParse->oom
7000: 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
7010: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
7020: 20 7d 0a 20 20 6a 73 6f 6e 50 61 72 73 65 46 69   }.  jsonParseFi
7030: 6c 6c 49 6e 50 61 72 65 6e 74 61 67 65 28 70 50  llInParentage(pP
7040: 61 72 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 72  arse, 0, 0);.  r
7050: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
7060: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 67 69 63 20  .}../*.** Magic 
7070: 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20  number used for 
7080: 74 68 65 20 4a 53 4f 4e 20 70 61 72 73 65 20 63  the JSON parse c
7090: 61 63 68 65 20 69 6e 20 73 71 6c 69 74 65 33 5f  ache in sqlite3_
70a0: 67 65 74 5f 61 75 78 64 61 74 61 28 29 0a 2a 2f  get_auxdata().*/
70b0: 0a 23 64 65 66 69 6e 65 20 4a 53 4f 4e 5f 43 41  .#define JSON_CA
70c0: 43 48 45 5f 49 44 20 20 28 2d 34 32 39 39 33 38  CHE_ID  (-429938
70d0: 29 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20  )../*.** Obtain 
70e0: 61 20 63 6f 6d 70 6c 65 74 65 20 70 61 72 73 65  a complete parse
70f0: 20 6f 66 20 74 68 65 20 4a 53 4f 4e 20 66 6f 75   of the JSON fou
7100: 6e 64 20 69 6e 20 74 68 65 20 66 69 72 73 74 20  nd in the first 
7110: 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 6f 66 20 74  argument.** of t
7120: 68 65 20 61 72 67 76 20 61 72 72 61 79 2e 20 20  he argv array.  
7130: 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  Use the sqlite3_
7140: 67 65 74 5f 61 75 78 64 61 74 61 28 29 20 63 61  get_auxdata() ca
7150: 63 68 65 20 66 6f 72 20 74 68 69 73 0a 2a 2a 20  che for this.** 
7160: 70 61 72 73 65 20 69 66 20 69 74 20 69 73 20 61  parse if it is a
7170: 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20 74 68  vailable.  If th
7180: 65 20 63 61 63 68 65 20 69 73 20 6e 6f 74 20 61  e cache is not a
7190: 76 61 69 6c 61 62 6c 65 20 6f 72 20 69 66 20 69  vailable or if i
71a0: 74 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  t.** is no longe
71b0: 72 20 76 61 6c 69 64 2c 20 70 61 72 73 65 20 74  r valid, parse t
71c0: 68 65 20 4a 53 4f 4e 20 61 67 61 69 6e 20 61 6e  he JSON again an
71d0: 64 20 72 65 74 75 72 6e 20 74 68 65 20 6e 65 77  d return the new
71e0: 20 70 61 72 73 65 2c 0a 2a 2a 20 61 6e 64 20 61   parse,.** and a
71f0: 6c 73 6f 20 72 65 67 69 73 74 65 72 20 74 68 65  lso register the
7200: 20 6e 65 77 20 70 61 72 73 65 20 73 6f 20 74 68   new parse so th
7210: 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20 61 76  at it will be av
7220: 61 69 6c 61 62 6c 65 20 66 6f 72 0a 2a 2a 20 66  ailable for.** f
7230: 75 74 75 72 65 20 73 71 6c 69 74 65 33 5f 67 65  uture sqlite3_ge
7240: 74 5f 61 75 78 64 61 74 61 28 29 20 63 61 6c 6c  t_auxdata() call
7250: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4a 73 6f  s..*/.static Jso
7260: 6e 50 61 72 73 65 20 2a 6a 73 6f 6e 50 61 72 73  nParse *jsonPars
7270: 65 43 61 63 68 65 64 28 0a 20 20 73 71 6c 69 74  eCached(.  sqlit
7280: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
7290: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
72a0: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f  e **argv.){.  co
72b0: 6e 73 74 20 63 68 61 72 20 2a 7a 4a 73 6f 6e 20  nst char *zJson 
72c0: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
72d0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
72e0: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 6e  t(argv[0]);.  in
72f0: 74 20 6e 4a 73 6f 6e 20 3d 20 73 71 6c 69 74 65  t nJson = sqlite
7300: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72  3_value_bytes(ar
7310: 67 76 5b 30 5d 29 3b 0a 20 20 4a 73 6f 6e 50 61  gv[0]);.  JsonPa
7320: 72 73 65 20 2a 70 3b 0a 20 20 69 66 28 20 7a 4a  rse *p;.  if( zJ
7330: 73 6f 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  son==0 ) return 
7340: 30 3b 0a 20 20 70 20 3d 20 28 4a 73 6f 6e 50 61  0;.  p = (JsonPa
7350: 72 73 65 2a 29 73 71 6c 69 74 65 33 5f 67 65 74  rse*)sqlite3_get
7360: 5f 61 75 78 64 61 74 61 28 70 43 74 78 2c 20 4a  _auxdata(pCtx, J
7370: 53 4f 4e 5f 43 41 43 48 45 5f 49 44 29 3b 0a 20  SON_CACHE_ID);. 
7380: 20 69 66 28 20 70 20 26 26 20 70 2d 3e 6e 4a 73   if( p && p->nJs
7390: 6f 6e 3d 3d 6e 4a 73 6f 6e 20 26 26 20 6d 65 6d  on==nJson && mem
73a0: 63 6d 70 28 70 2d 3e 7a 4a 73 6f 6e 2c 7a 4a 73  cmp(p->zJson,zJs
73b0: 6f 6e 2c 6e 4a 73 6f 6e 29 3d 3d 30 20 29 7b 0a  on,nJson)==0 ){.
73c0: 20 20 20 20 70 2d 3e 6e 45 72 72 20 3d 20 30 3b      p->nErr = 0;
73d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 3b 20 2f  .    return p; /
73e0: 2a 20 54 68 65 20 63 61 63 68 65 64 20 65 6e 74  * The cached ent
73f0: 72 79 20 6d 61 74 63 68 65 73 2c 20 73 6f 20 72  ry matches, so r
7400: 65 74 75 72 6e 20 69 74 20 2a 2f 0a 20 20 7d 0a  eturn it */.  }.
7410: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61    p = sqlite3_ma
7420: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29  lloc( sizeof(*p)
7430: 20 2b 20 6e 4a 73 6f 6e 20 2b 20 31 20 29 3b 0a   + nJson + 1 );.
7440: 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
7450: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
7460: 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74  _error_nomem(pCt
7470: 78 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  x);.    return 0
7480: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70  ;.  }.  memset(p
7490: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  , 0, sizeof(*p))
74a0: 3b 0a 20 20 70 2d 3e 7a 4a 73 6f 6e 20 3d 20 28  ;.  p->zJson = (
74b0: 63 68 61 72 2a 29 26 70 5b 31 5d 3b 0a 20 20 6d  char*)&p[1];.  m
74c0: 65 6d 63 70 79 28 28 63 68 61 72 2a 29 70 2d 3e  emcpy((char*)p->
74d0: 7a 4a 73 6f 6e 2c 20 7a 4a 73 6f 6e 2c 20 6e 4a  zJson, zJson, nJ
74e0: 73 6f 6e 2b 31 29 3b 0a 20 20 69 66 28 20 6a 73  son+1);.  if( js
74f0: 6f 6e 50 61 72 73 65 28 70 2c 20 70 43 74 78 2c  onParse(p, pCtx,
7500: 20 70 2d 3e 7a 4a 73 6f 6e 29 20 29 7b 0a 20 20   p->zJson) ){.  
7510: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
7520: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
7530: 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4a 73 6f 6e 20  .  }.  p->nJson 
7540: 3d 20 6e 4a 73 6f 6e 3b 0a 20 20 73 71 6c 69 74  = nJson;.  sqlit
7550: 65 33 5f 73 65 74 5f 61 75 78 64 61 74 61 28 70  e3_set_auxdata(p
7560: 43 74 78 2c 20 4a 53 4f 4e 5f 43 41 43 48 45 5f  Ctx, JSON_CACHE_
7570: 49 44 2c 20 70 2c 20 28 76 6f 69 64 28 2a 29 28  ID, p, (void(*)(
7580: 76 6f 69 64 2a 29 29 6a 73 6f 6e 50 61 72 73 65  void*))jsonParse
7590: 46 72 65 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Free);.  return 
75a0: 28 4a 73 6f 6e 50 61 72 73 65 2a 29 73 71 6c 69  (JsonParse*)sqli
75b0: 74 65 33 5f 67 65 74 5f 61 75 78 64 61 74 61 28  te3_get_auxdata(
75c0: 70 43 74 78 2c 20 4a 53 4f 4e 5f 43 41 43 48 45  pCtx, JSON_CACHE
75d0: 5f 49 44 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  _ID);.}../*.** C
75e0: 6f 6d 70 61 72 65 20 74 68 65 20 4f 42 4a 45 43  ompare the OBJEC
75f0: 54 20 6c 61 62 65 6c 20 61 74 20 70 4e 6f 64 65  T label at pNode
7600: 20 61 67 61 69 6e 73 74 20 7a 4b 65 79 2c 6e 4b   against zKey,nK
7610: 65 79 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65  ey.  Return true
7620: 20 6f 6e 0a 2a 2a 20 61 20 6d 61 74 63 68 2e 0a   on.** a match..
7630: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 73  */.static int js
7640: 6f 6e 4c 61 62 65 6c 43 6f 6d 70 61 72 65 28 4a  onLabelCompare(J
7650: 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 2c 20  sonNode *pNode, 
7660: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65 79  const char *zKey
7670: 2c 20 75 33 32 20 6e 4b 65 79 29 7b 0a 20 20 69  , u32 nKey){.  i
7680: 66 28 20 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67  f( pNode->jnFlag
7690: 73 20 26 20 4a 4e 4f 44 45 5f 52 41 57 20 29 7b  s & JNODE_RAW ){
76a0: 0a 20 20 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e  .    if( pNode->
76b0: 6e 21 3d 6e 4b 65 79 20 29 20 72 65 74 75 72 6e  n!=nKey ) return
76c0: 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   0;.    return s
76d0: 74 72 6e 63 6d 70 28 70 4e 6f 64 65 2d 3e 75 2e  trncmp(pNode->u.
76e0: 7a 4a 43 6f 6e 74 65 6e 74 2c 20 7a 4b 65 79 2c  zJContent, zKey,
76f0: 20 6e 4b 65 79 29 3d 3d 30 3b 0a 20 20 7d 65 6c   nKey)==0;.  }el
7700: 73 65 7b 0a 20 20 20 20 69 66 28 20 70 4e 6f 64  se{.    if( pNod
7710: 65 2d 3e 6e 21 3d 6e 4b 65 79 2b 32 20 29 20 72  e->n!=nKey+2 ) r
7720: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 72 65 74  eturn 0;.    ret
7730: 75 72 6e 20 73 74 72 6e 63 6d 70 28 70 4e 6f 64  urn strncmp(pNod
7740: 65 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 2b 31  e->u.zJContent+1
7750: 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79 29 3d 3d 30  , zKey, nKey)==0
7760: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 66 6f 72 77  ;.  }.}../* forw
7770: 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  ard declaration 
7780: 2a 2f 0a 73 74 61 74 69 63 20 4a 73 6f 6e 4e 6f  */.static JsonNo
7790: 64 65 20 2a 6a 73 6f 6e 4c 6f 6f 6b 75 70 41 70  de *jsonLookupAp
77a0: 70 65 6e 64 28 4a 73 6f 6e 50 61 72 73 65 2a 2c  pend(JsonParse*,
77b0: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2a  const char*,int*
77c0: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 3b 0a  ,const char**);.
77d0: 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 61 6c  ./*.** Search al
77e0: 6f 6e 67 20 7a 50 61 74 68 20 74 6f 20 66 69 6e  ong zPath to fin
77f0: 64 20 74 68 65 20 6e 6f 64 65 20 73 70 65 63 69  d the node speci
7800: 66 69 65 64 2e 20 20 52 65 74 75 72 6e 20 61 20  fied.  Return a 
7810: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
7820: 61 74 20 6e 6f 64 65 2c 20 6f 72 20 4e 55 4c 4c  at node, or NULL
7830: 20 69 66 20 7a 50 61 74 68 20 69 73 20 6d 61 6c   if zPath is mal
7840: 66 6f 72 6d 65 64 20 6f 72 20 69 66 20 74 68 65  formed or if the
7850: 72 65 20 69 73 20 6e 6f 20 73 75 63 68 0a 2a 2a  re is no such.**
7860: 20 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   node..**.** If 
7870: 70 41 70 6e 64 21 3d 30 2c 20 74 68 65 6e 20 74  pApnd!=0, then t
7880: 72 79 20 74 6f 20 61 70 70 65 6e 64 20 6e 65 77  ry to append new
7890: 20 6e 6f 64 65 73 20 74 6f 20 63 6f 6d 70 6c 65   nodes to comple
78a0: 74 65 20 7a 50 61 74 68 20 69 66 20 69 74 20 69  te zPath if it i
78b0: 73 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74 6f  s.** possible to
78c0: 20 64 6f 20 73 6f 20 61 6e 64 20 69 66 20 6e 6f   do so and if no
78d0: 20 65 78 69 73 74 69 6e 67 20 6e 6f 64 65 20 63   existing node c
78e0: 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 7a 50  orresponds to zP
78f0: 61 74 68 2e 20 20 49 66 0a 2a 2a 20 6e 65 77 20  ath.  If.** new 
7900: 6e 6f 64 65 73 20 61 72 65 20 61 70 70 65 6e 64  nodes are append
7910: 65 64 20 2a 70 41 70 6e 64 20 69 73 20 73 65 74  ed *pApnd is set
7920: 20 74 6f 20 31 2e 0a 2a 2f 0a 73 74 61 74 69 63   to 1..*/.static
7930: 20 4a 73 6f 6e 4e 6f 64 65 20 2a 6a 73 6f 6e 4c   JsonNode *jsonL
7940: 6f 6f 6b 75 70 53 74 65 70 28 0a 20 20 4a 73 6f  ookupStep(.  Jso
7950: 6e 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  nParse *pParse, 
7960: 20 20 20 20 20 2f 2a 20 54 68 65 20 4a 53 4f 4e       /* The JSON
7970: 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20   to search */.  
7980: 75 33 32 20 69 52 6f 6f 74 2c 20 20 20 20 20 20  u32 iRoot,      
7990: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e          /* Begin
79a0: 20 74 68 65 20 73 65 61 72 63 68 20 61 74 20 74   the search at t
79b0: 68 69 73 20 6e 6f 64 65 20 2a 2f 0a 20 20 63 6f  his node */.  co
79c0: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
79d0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 74        /* The pat
79e0: 68 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  h to search */. 
79f0: 20 69 6e 74 20 2a 70 41 70 6e 64 2c 20 20 20 20   int *pApnd,    
7a00: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 70 70 65           /* Appe
7a10: 6e 64 20 6e 6f 64 65 73 20 74 6f 20 63 6f 6d 70  nd nodes to comp
7a20: 6c 65 74 65 20 70 61 74 68 20 69 66 20 6e 6f 74  lete path if not
7a30: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74   NULL */.  const
7a40: 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 20 20 20   char **pzErr   
7a50: 20 20 20 2f 2a 20 4d 61 6b 65 20 2a 70 7a 45 72     /* Make *pzEr
7a60: 72 20 70 6f 69 6e 74 20 74 6f 20 61 6e 79 20 73  r point to any s
7a70: 79 6e 74 61 78 20 65 72 72 6f 72 20 69 6e 20 7a  yntax error in z
7a80: 50 61 74 68 20 2a 2f 0a 29 7b 0a 20 20 75 33 32  Path */.){.  u32
7a90: 20 69 2c 20 6a 2c 20 6e 4b 65 79 3b 0a 20 20 63   i, j, nKey;.  c
7aa0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65 79 3b  onst char *zKey;
7ab0: 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 52 6f  .  JsonNode *pRo
7ac0: 6f 74 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 4e  ot = &pParse->aN
7ad0: 6f 64 65 5b 69 52 6f 6f 74 5d 3b 0a 20 20 69 66  ode[iRoot];.  if
7ae0: 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 30 20 29 20  ( zPath[0]==0 ) 
7af0: 72 65 74 75 72 6e 20 70 52 6f 6f 74 3b 0a 20 20  return pRoot;.  
7b00: 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 2e  if( zPath[0]=='.
7b10: 27 20 29 7b 0a 20 20 20 20 69 66 28 20 70 52 6f  ' ){.    if( pRo
7b20: 6f 74 2d 3e 65 54 79 70 65 21 3d 4a 53 4f 4e 5f  ot->eType!=JSON_
7b30: 4f 42 4a 45 43 54 20 29 20 72 65 74 75 72 6e 20  OBJECT ) return 
7b40: 30 3b 0a 20 20 20 20 7a 50 61 74 68 2b 2b 3b 0a  0;.    zPath++;.
7b50: 20 20 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d      if( zPath[0]
7b60: 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20 7a  =='"' ){.      z
7b70: 4b 65 79 20 3d 20 7a 50 61 74 68 20 2b 20 31 3b  Key = zPath + 1;
7b80: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  .      for(i=1; 
7b90: 7a 50 61 74 68 5b 69 5d 20 26 26 20 7a 50 61 74  zPath[i] && zPat
7ba0: 68 5b 69 5d 21 3d 27 22 27 3b 20 69 2b 2b 29 7b  h[i]!='"'; i++){
7bb0: 7d 0a 20 20 20 20 20 20 6e 4b 65 79 20 3d 20 69  }.      nKey = i
7bc0: 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50  -1;.      if( zP
7bd0: 61 74 68 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  ath[i] ){.      
7be0: 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c    i++;.      }el
7bf0: 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45  se{.        *pzE
7c00: 72 72 20 3d 20 7a 50 61 74 68 3b 0a 20 20 20 20  rr = zPath;.    
7c10: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
7c20: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
7c30: 0a 20 20 20 20 20 20 7a 4b 65 79 20 3d 20 7a 50  .      zKey = zP
7c40: 61 74 68 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  ath;.      for(i
7c50: 3d 30 3b 20 7a 50 61 74 68 5b 69 5d 20 26 26 20  =0; zPath[i] && 
7c60: 7a 50 61 74 68 5b 69 5d 21 3d 27 2e 27 20 26 26  zPath[i]!='.' &&
7c70: 20 7a 50 61 74 68 5b 69 5d 21 3d 27 5b 27 3b 20   zPath[i]!='['; 
7c80: 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 6e 4b 65  i++){}.      nKe
7c90: 79 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20  y = i;.    }.   
7ca0: 20 69 66 28 20 6e 4b 65 79 3d 3d 30 20 29 7b 0a   if( nKey==0 ){.
7cb0: 20 20 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 7a        *pzErr = z
7cc0: 50 61 74 68 3b 0a 20 20 20 20 20 20 72 65 74 75  Path;.      retu
7cd0: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
7ce0: 6a 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 3b  j = 1;.    for(;
7cf0: 3b 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  ;){.      while(
7d00: 20 6a 3c 3d 70 52 6f 6f 74 2d 3e 6e 20 29 7b 0a   j<=pRoot->n ){.
7d10: 20 20 20 20 20 20 20 20 69 66 28 20 6a 73 6f 6e          if( json
7d20: 4c 61 62 65 6c 43 6f 6d 70 61 72 65 28 70 52 6f  LabelCompare(pRo
7d30: 6f 74 2b 6a 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79  ot+j, zKey, nKey
7d40: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ) ){.          r
7d50: 65 74 75 72 6e 20 6a 73 6f 6e 4c 6f 6f 6b 75 70  eturn jsonLookup
7d60: 53 74 65 70 28 70 50 61 72 73 65 2c 20 69 52 6f  Step(pParse, iRo
7d70: 6f 74 2b 6a 2b 31 2c 20 26 7a 50 61 74 68 5b 69  ot+j+1, &zPath[i
7d80: 5d 2c 20 70 41 70 6e 64 2c 20 70 7a 45 72 72 29  ], pApnd, pzErr)
7d90: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
7da0: 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20      j++;.       
7db0: 20 6a 20 2b 3d 20 6a 73 6f 6e 4e 6f 64 65 53 69   j += jsonNodeSi
7dc0: 7a 65 28 26 70 52 6f 6f 74 5b 6a 5d 29 3b 0a 20  ze(&pRoot[j]);. 
7dd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
7de0: 20 28 70 52 6f 6f 74 2d 3e 6a 6e 46 6c 61 67 73   (pRoot->jnFlags
7df0: 20 26 20 4a 4e 4f 44 45 5f 41 50 50 45 4e 44 29   & JNODE_APPEND)
7e00: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
7e10: 20 20 20 69 52 6f 6f 74 20 2b 3d 20 70 52 6f 6f     iRoot += pRoo
7e20: 74 2d 3e 75 2e 69 41 70 70 65 6e 64 3b 0a 20 20  t->u.iAppend;.  
7e30: 20 20 20 20 70 52 6f 6f 74 20 3d 20 26 70 50 61      pRoot = &pPa
7e40: 72 73 65 2d 3e 61 4e 6f 64 65 5b 69 52 6f 6f 74  rse->aNode[iRoot
7e50: 5d 3b 0a 20 20 20 20 20 20 6a 20 3d 20 31 3b 0a  ];.      j = 1;.
7e60: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 41      }.    if( pA
7e70: 70 6e 64 20 29 7b 0a 20 20 20 20 20 20 75 33 32  pnd ){.      u32
7e80: 20 69 53 74 61 72 74 2c 20 69 4c 61 62 65 6c 3b   iStart, iLabel;
7e90: 0a 20 20 20 20 20 20 4a 73 6f 6e 4e 6f 64 65 20  .      JsonNode 
7ea0: 2a 70 4e 6f 64 65 3b 0a 20 20 20 20 20 20 69 53  *pNode;.      iS
7eb0: 74 61 72 74 20 3d 20 6a 73 6f 6e 50 61 72 73 65  tart = jsonParse
7ec0: 41 64 64 4e 6f 64 65 28 70 50 61 72 73 65 2c 20  AddNode(pParse, 
7ed0: 4a 53 4f 4e 5f 4f 42 4a 45 43 54 2c 20 32 2c 20  JSON_OBJECT, 2, 
7ee0: 30 29 3b 0a 20 20 20 20 20 20 69 4c 61 62 65 6c  0);.      iLabel
7ef0: 20 3d 20 6a 73 6f 6e 50 61 72 73 65 41 64 64 4e   = jsonParseAddN
7f00: 6f 64 65 28 70 50 61 72 73 65 2c 20 4a 53 4f 4e  ode(pParse, JSON
7f10: 5f 53 54 52 49 4e 47 2c 20 69 2c 20 7a 50 61 74  _STRING, i, zPat
7f20: 68 29 3b 0a 20 20 20 20 20 20 7a 50 61 74 68 20  h);.      zPath 
7f30: 2b 3d 20 69 3b 0a 20 20 20 20 20 20 70 4e 6f 64  += i;.      pNod
7f40: 65 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 41 70  e = jsonLookupAp
7f50: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 7a 50 61  pend(pParse, zPa
7f60: 74 68 2c 20 70 41 70 6e 64 2c 20 70 7a 45 72 72  th, pApnd, pzErr
7f70: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
7f80: 72 73 65 2d 3e 6f 6f 6d 20 29 20 72 65 74 75 72  rse->oom ) retur
7f90: 6e 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  n 0;.      if( p
7fa0: 4e 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Node ){.        
7fb0: 70 52 6f 6f 74 20 3d 20 26 70 50 61 72 73 65 2d  pRoot = &pParse-
7fc0: 3e 61 4e 6f 64 65 5b 69 52 6f 6f 74 5d 3b 0a 20  >aNode[iRoot];. 
7fd0: 20 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 75 2e         pRoot->u.
7fe0: 69 41 70 70 65 6e 64 20 3d 20 69 53 74 61 72 74  iAppend = iStart
7ff0: 20 2d 20 69 52 6f 6f 74 3b 0a 20 20 20 20 20 20   - iRoot;.      
8000: 20 20 70 52 6f 6f 74 2d 3e 6a 6e 46 6c 61 67 73    pRoot->jnFlags
8010: 20 7c 3d 20 4a 4e 4f 44 45 5f 41 50 50 45 4e 44   |= JNODE_APPEND
8020: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
8030: 2d 3e 61 4e 6f 64 65 5b 69 4c 61 62 65 6c 5d 2e  ->aNode[iLabel].
8040: 6a 6e 46 6c 61 67 73 20 7c 3d 20 4a 4e 4f 44 45  jnFlags |= JNODE
8050: 5f 52 41 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _RAW;.      }.  
8060: 20 20 20 20 72 65 74 75 72 6e 20 70 4e 6f 64 65      return pNode
8070: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
8080: 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 5b  if( zPath[0]=='[
8090: 27 20 26 26 20 73 61 66 65 5f 69 73 64 69 67 69  ' && safe_isdigi
80a0: 74 28 7a 50 61 74 68 5b 31 5d 29 20 29 7b 0a 20  t(zPath[1]) ){. 
80b0: 20 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 65 54     if( pRoot->eT
80c0: 79 70 65 21 3d 4a 53 4f 4e 5f 41 52 52 41 59 20  ype!=JSON_ARRAY 
80d0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
80e0: 69 20 3d 20 30 3b 0a 20 20 20 20 6a 20 3d 20 31  i = 0;.    j = 1
80f0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 61 66  ;.    while( saf
8100: 65 5f 69 73 64 69 67 69 74 28 7a 50 61 74 68 5b  e_isdigit(zPath[
8110: 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20 69 20 3d  j]) ){.      i =
8120: 20 69 2a 31 30 20 2b 20 7a 50 61 74 68 5b 6a 5d   i*10 + zPath[j]
8130: 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 6a 2b   - '0';.      j+
8140: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  +;.    }.    if(
8150: 20 7a 50 61 74 68 5b 6a 5d 21 3d 27 5d 27 20 29   zPath[j]!=']' )
8160: 7b 0a 20 20 20 20 20 20 2a 70 7a 45 72 72 20 3d  {.      *pzErr =
8170: 20 7a 50 61 74 68 3b 0a 20 20 20 20 20 20 72 65   zPath;.      re
8180: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
8190: 20 20 7a 50 61 74 68 20 2b 3d 20 6a 20 2b 20 31    zPath += j + 1
81a0: 3b 0a 20 20 20 20 6a 20 3d 20 31 3b 0a 20 20 20  ;.    j = 1;.   
81b0: 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20   for(;;){.      
81c0: 77 68 69 6c 65 28 20 6a 3c 3d 70 52 6f 6f 74 2d  while( j<=pRoot-
81d0: 3e 6e 20 26 26 20 28 69 3e 30 20 7c 7c 20 28 70  >n && (i>0 || (p
81e0: 52 6f 6f 74 5b 6a 5d 2e 6a 6e 46 6c 61 67 73 20  Root[j].jnFlags 
81f0: 26 20 4a 4e 4f 44 45 5f 52 45 4d 4f 56 45 29 21  & JNODE_REMOVE)!
8200: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  =0) ){.        i
8210: 66 28 20 28 70 52 6f 6f 74 5b 6a 5d 2e 6a 6e 46  f( (pRoot[j].jnF
8220: 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 52 45 4d  lags & JNODE_REM
8230: 4f 56 45 29 3d 3d 30 20 29 20 69 2d 2d 3b 0a 20  OVE)==0 ) i--;. 
8240: 20 20 20 20 20 20 20 6a 20 2b 3d 20 6a 73 6f 6e         j += json
8250: 4e 6f 64 65 53 69 7a 65 28 26 70 52 6f 6f 74 5b  NodeSize(&pRoot[
8260: 6a 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  j]);.      }.   
8270: 20 20 20 69 66 28 20 28 70 52 6f 6f 74 2d 3e 6a     if( (pRoot->j
8280: 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 41  nFlags & JNODE_A
8290: 50 50 45 4e 44 29 3d 3d 30 20 29 20 62 72 65 61  PPEND)==0 ) brea
82a0: 6b 3b 0a 20 20 20 20 20 20 69 52 6f 6f 74 20 2b  k;.      iRoot +
82b0: 3d 20 70 52 6f 6f 74 2d 3e 75 2e 69 41 70 70 65  = pRoot->u.iAppe
82c0: 6e 64 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 20  nd;.      pRoot 
82d0: 3d 20 26 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65  = &pParse->aNode
82e0: 5b 69 52 6f 6f 74 5d 3b 0a 20 20 20 20 20 20 6a  [iRoot];.      j
82f0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
8300: 69 66 28 20 6a 3c 3d 70 52 6f 6f 74 2d 3e 6e 20  if( j<=pRoot->n 
8310: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
8320: 6a 73 6f 6e 4c 6f 6f 6b 75 70 53 74 65 70 28 70  jsonLookupStep(p
8330: 50 61 72 73 65 2c 20 69 52 6f 6f 74 2b 6a 2c 20  Parse, iRoot+j, 
8340: 7a 50 61 74 68 2c 20 70 41 70 6e 64 2c 20 70 7a  zPath, pApnd, pz
8350: 45 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Err);.    }.    
8360: 69 66 28 20 69 3d 3d 30 20 26 26 20 70 41 70 6e  if( i==0 && pApn
8370: 64 20 29 7b 0a 20 20 20 20 20 20 75 33 32 20 69  d ){.      u32 i
8380: 53 74 61 72 74 3b 0a 20 20 20 20 20 20 4a 73 6f  Start;.      Jso
8390: 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 3b 0a 20 20  nNode *pNode;.  
83a0: 20 20 20 20 69 53 74 61 72 74 20 3d 20 6a 73 6f      iStart = jso
83b0: 6e 50 61 72 73 65 41 64 64 4e 6f 64 65 28 70 50  nParseAddNode(pP
83c0: 61 72 73 65 2c 20 4a 53 4f 4e 5f 41 52 52 41 59  arse, JSON_ARRAY
83d0: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  , 1, 0);.      p
83e0: 4e 6f 64 65 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75  Node = jsonLooku
83f0: 70 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  pAppend(pParse, 
8400: 7a 50 61 74 68 2c 20 70 41 70 6e 64 2c 20 70 7a  zPath, pApnd, pz
8410: 45 72 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Err);.      if( 
8420: 70 50 61 72 73 65 2d 3e 6f 6f 6d 20 29 20 72 65  pParse->oom ) re
8430: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 69 66  turn 0;.      if
8440: 28 20 70 4e 6f 64 65 20 29 7b 0a 20 20 20 20 20  ( pNode ){.     
8450: 20 20 20 70 52 6f 6f 74 20 3d 20 26 70 50 61 72     pRoot = &pPar
8460: 73 65 2d 3e 61 4e 6f 64 65 5b 69 52 6f 6f 74 5d  se->aNode[iRoot]
8470: 3b 0a 20 20 20 20 20 20 20 20 70 52 6f 6f 74 2d  ;.        pRoot-
8480: 3e 75 2e 69 41 70 70 65 6e 64 20 3d 20 69 53 74  >u.iAppend = iSt
8490: 61 72 74 20 2d 20 69 52 6f 6f 74 3b 0a 20 20 20  art - iRoot;.   
84a0: 20 20 20 20 20 70 52 6f 6f 74 2d 3e 6a 6e 46 6c       pRoot->jnFl
84b0: 61 67 73 20 7c 3d 20 4a 4e 4f 44 45 5f 41 50 50  ags |= JNODE_APP
84c0: 45 4e 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  END;.      }.   
84d0: 20 20 20 72 65 74 75 72 6e 20 70 4e 6f 64 65 3b     return pNode;
84e0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
84f0: 20 20 20 20 2a 70 7a 45 72 72 20 3d 20 7a 50 61      *pzErr = zPa
8500: 74 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  th;.  }.  return
8510: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70   0;.}../*.** App
8520: 65 6e 64 20 63 6f 6e 74 65 6e 74 20 74 6f 20 70  end content to p
8530: 50 61 72 73 65 20 74 68 61 74 20 77 69 6c 6c 20  Parse that will 
8540: 63 6f 6d 70 6c 65 74 65 20 7a 50 61 74 68 2e 20  complete zPath. 
8550: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
8560: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 69 6e 73 65  r.** to the inse
8570: 72 74 65 64 20 6e 6f 64 65 2c 20 6f 72 20 72 65  rted node, or re
8580: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65  turn NULL if the
8590: 20 61 70 70 65 6e 64 20 66 61 69 6c 73 2e 0a 2a   append fails..*
85a0: 2f 0a 73 74 61 74 69 63 20 4a 73 6f 6e 4e 6f 64  /.static JsonNod
85b0: 65 20 2a 6a 73 6f 6e 4c 6f 6f 6b 75 70 41 70 70  e *jsonLookupApp
85c0: 65 6e 64 28 0a 20 20 4a 73 6f 6e 50 61 72 73 65  end(.  JsonParse
85d0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
85e0: 20 41 70 70 65 6e 64 20 63 6f 6e 74 65 6e 74 20   Append content 
85f0: 74 6f 20 74 68 65 20 4a 53 4f 4e 20 70 61 72 73  to the JSON pars
8600: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
8610: 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 2f 2a  r *zPath,     /*
8620: 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
8630: 63 6f 6e 74 65 6e 74 20 74 6f 20 61 70 70 65 6e  content to appen
8640: 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 70 6e  d */.  int *pApn
8650: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d,            /*
8660: 20 53 65 74 20 74 68 69 73 20 66 6c 61 67 20 74   Set this flag t
8670: 6f 20 31 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  o 1 */.  const c
8680: 68 61 72 20 2a 2a 70 7a 45 72 72 20 20 20 20 20  har **pzErr     
8690: 2f 2a 20 4d 61 6b 65 20 74 68 69 73 20 70 6f 69  /* Make this poi
86a0: 6e 74 20 74 6f 20 61 6e 79 20 73 79 6e 74 61 78  nt to any syntax
86b0: 20 65 72 72 6f 72 20 2a 2f 0a 29 7b 0a 20 20 2a   error */.){.  *
86c0: 70 41 70 6e 64 20 3d 20 31 3b 0a 20 20 69 66 28  pApnd = 1;.  if(
86d0: 20 7a 50 61 74 68 5b 30 5d 3d 3d 30 20 29 7b 0a   zPath[0]==0 ){.
86e0: 20 20 20 20 6a 73 6f 6e 50 61 72 73 65 41 64 64      jsonParseAdd
86f0: 4e 6f 64 65 28 70 50 61 72 73 65 2c 20 4a 53 4f  Node(pParse, JSO
8700: 4e 5f 4e 55 4c 4c 2c 20 30 2c 20 30 29 3b 0a 20  N_NULL, 0, 0);. 
8710: 20 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65     return pParse
8720: 2d 3e 6f 6f 6d 20 3f 20 30 20 3a 20 26 70 50 61  ->oom ? 0 : &pPa
8730: 72 73 65 2d 3e 61 4e 6f 64 65 5b 70 50 61 72 73  rse->aNode[pPars
8740: 65 2d 3e 6e 4e 6f 64 65 2d 31 5d 3b 0a 20 20 7d  e->nNode-1];.  }
8750: 0a 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d  .  if( zPath[0]=
8760: 3d 27 2e 27 20 29 7b 0a 20 20 20 20 6a 73 6f 6e  ='.' ){.    json
8770: 50 61 72 73 65 41 64 64 4e 6f 64 65 28 70 50 61  ParseAddNode(pPa
8780: 72 73 65 2c 20 4a 53 4f 4e 5f 4f 42 4a 45 43 54  rse, JSON_OBJECT
8790: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  , 0, 0);.  }else
87a0: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 50 61   if( strncmp(zPa
87b0: 74 68 2c 22 5b 30 5d 22 2c 33 29 3d 3d 30 20 29  th,"[0]",3)==0 )
87c0: 7b 0a 20 20 20 20 6a 73 6f 6e 50 61 72 73 65 41  {.    jsonParseA
87d0: 64 64 4e 6f 64 65 28 70 50 61 72 73 65 2c 20 4a  ddNode(pParse, J
87e0: 53 4f 4e 5f 41 52 52 41 59 2c 20 30 2c 20 30 29  SON_ARRAY, 0, 0)
87f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
8800: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
8810: 66 28 20 70 50 61 72 73 65 2d 3e 6f 6f 6d 20 29  f( pParse->oom )
8820: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74   return 0;.  ret
8830: 75 72 6e 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 53 74  urn jsonLookupSt
8840: 65 70 28 70 50 61 72 73 65 2c 20 70 50 61 72 73  ep(pParse, pPars
8850: 65 2d 3e 6e 4e 6f 64 65 2d 31 2c 20 7a 50 61 74  e->nNode-1, zPat
8860: 68 2c 20 70 41 70 6e 64 2c 20 70 7a 45 72 72 29  h, pApnd, pzErr)
8870: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
8880: 6e 20 74 68 65 20 74 65 78 74 20 6f 66 20 61 20  n the text of a 
8890: 73 79 6e 74 61 78 20 65 72 72 6f 72 20 6d 65 73  syntax error mes
88a0: 73 61 67 65 20 6f 6e 20 61 20 4a 53 4f 4e 20 70  sage on a JSON p
88b0: 61 74 68 2e 20 20 53 70 61 63 65 20 69 73 0a 2a  ath.  Space is.*
88c0: 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  * obtained from 
88d0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
88e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
88f0: 20 2a 6a 73 6f 6e 50 61 74 68 53 79 6e 74 61 78   *jsonPathSyntax
8900: 45 72 72 6f 72 28 63 6f 6e 73 74 20 63 68 61 72  Error(const char
8910: 20 2a 7a 45 72 72 29 7b 0a 20 20 72 65 74 75 72   *zErr){.  retur
8920: 6e 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  n sqlite3_mprint
8930: 66 28 22 4a 53 4f 4e 20 70 61 74 68 20 65 72 72  f("JSON path err
8940: 6f 72 20 6e 65 61 72 20 27 25 71 27 22 2c 20 7a  or near '%q'", z
8950: 45 72 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  Err);.}../*.** D
8960: 6f 20 61 20 6e 6f 64 65 20 6c 6f 6f 6b 75 70 20  o a node lookup 
8970: 75 73 69 6e 67 20 7a 50 61 74 68 2e 20 20 52 65  using zPath.  Re
8980: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
8990: 6f 20 74 68 65 20 6e 6f 64 65 20 6f 6e 20 73 75  o the node on su
89a0: 63 63 65 73 73 2e 0a 2a 2a 20 52 65 74 75 72 6e  ccess..** Return
89b0: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
89c0: 6e 64 20 6f 72 20 69 66 20 74 68 65 72 65 20 69  nd or if there i
89d0: 73 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  s an error..**.*
89e0: 2a 20 4f 6e 20 61 6e 20 65 72 72 6f 72 2c 20 77  * On an error, w
89f0: 72 69 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  rite an error me
8a00: 73 73 61 67 65 20 69 6e 74 6f 20 70 43 74 78 20  ssage into pCtx 
8a10: 61 6e 64 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  and increment th
8a20: 65 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 6e 45 72  e.** pParse->nEr
8a30: 72 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  r counter..**.**
8a40: 20 49 66 20 70 41 70 6e 64 21 3d 4e 55 4c 4c 20   If pApnd!=NULL 
8a50: 74 68 65 6e 20 74 72 79 20 74 6f 20 61 70 70 65  then try to appe
8a60: 6e 64 20 6d 69 73 73 69 6e 67 20 6e 6f 64 65 73  nd missing nodes
8a70: 20 61 6e 64 20 73 65 74 20 2a 70 41 70 6e 64 20   and set *pApnd 
8a80: 3d 20 31 20 69 66 0a 2a 2a 20 6e 6f 64 65 73 20  = 1 if.** nodes 
8a90: 61 72 65 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f  are appended..*/
8aa0: 0a 73 74 61 74 69 63 20 4a 73 6f 6e 4e 6f 64 65  .static JsonNode
8ab0: 20 2a 6a 73 6f 6e 4c 6f 6f 6b 75 70 28 0a 20 20   *jsonLookup(.  
8ac0: 4a 73 6f 6e 50 61 72 73 65 20 2a 70 50 61 72 73  JsonParse *pPars
8ad0: 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4a  e,      /* The J
8ae0: 53 4f 4e 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  SON to search */
8af0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
8b00: 50 61 74 68 2c 20 20 20 20 20 20 2f 2a 20 54 68  Path,      /* Th
8b10: 65 20 70 61 74 68 20 74 6f 20 73 65 61 72 63 68  e path to search
8b20: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 70 6e 64   */.  int *pApnd
8b30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
8b40: 20 41 70 70 65 6e 64 20 6e 6f 64 65 73 20 74 6f   Append nodes to
8b50: 20 63 6f 6d 70 6c 65 74 65 20 70 61 74 68 20 69   complete path i
8b60: 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 20 20  f not NULL */.  
8b70: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
8b80: 2a 70 43 74 78 20 20 20 2f 2a 20 52 65 70 6f 72  *pCtx   /* Repor
8b90: 74 20 65 72 72 6f 72 73 20 68 65 72 65 2c 20 69  t errors here, i
8ba0: 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  f not NULL */.){
8bb0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
8bc0: 45 72 72 20 3d 20 30 3b 0a 20 20 4a 73 6f 6e 4e  Err = 0;.  JsonN
8bd0: 6f 64 65 20 2a 70 4e 6f 64 65 20 3d 20 30 3b 0a  ode *pNode = 0;.
8be0: 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 0a 20    char *zMsg;.. 
8bf0: 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20 29 20   if( zPath==0 ) 
8c00: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
8c10: 7a 50 61 74 68 5b 30 5d 21 3d 27 24 27 20 29 7b  zPath[0]!='$' ){
8c20: 0a 20 20 20 20 7a 45 72 72 20 3d 20 7a 50 61 74  .    zErr = zPat
8c30: 68 3b 0a 20 20 20 20 67 6f 74 6f 20 6c 6f 6f 6b  h;.    goto look
8c40: 75 70 5f 65 72 72 3b 0a 20 20 7d 0a 20 20 7a 50  up_err;.  }.  zP
8c50: 61 74 68 2b 2b 3b 0a 20 20 70 4e 6f 64 65 20 3d  ath++;.  pNode =
8c60: 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 53 74 65 70 28   jsonLookupStep(
8c70: 70 50 61 72 73 65 2c 20 30 2c 20 7a 50 61 74 68  pParse, 0, zPath
8c80: 2c 20 70 41 70 6e 64 2c 20 26 7a 45 72 72 29 3b  , pApnd, &zErr);
8c90: 0a 20 20 69 66 28 20 7a 45 72 72 3d 3d 30 20 29  .  if( zErr==0 )
8ca0: 20 72 65 74 75 72 6e 20 70 4e 6f 64 65 3b 0a 0a   return pNode;..
8cb0: 6c 6f 6f 6b 75 70 5f 65 72 72 3a 0a 20 20 70 50  lookup_err:.  pP
8cc0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
8cd0: 61 73 73 65 72 74 28 20 7a 45 72 72 21 3d 30 20  assert( zErr!=0 
8ce0: 26 26 20 70 43 74 78 21 3d 30 20 29 3b 0a 20 20  && pCtx!=0 );.  
8cf0: 7a 4d 73 67 20 3d 20 6a 73 6f 6e 50 61 74 68 53  zMsg = jsonPathS
8d00: 79 6e 74 61 78 45 72 72 6f 72 28 7a 45 72 72 29  yntaxError(zErr)
8d10: 3b 0a 20 20 69 66 28 20 7a 4d 73 67 20 29 7b 0a  ;.  if( zMsg ){.
8d20: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
8d30: 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 7a  lt_error(pCtx, z
8d40: 4d 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71  Msg, -1);.    sq
8d50: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 73 67 29  lite3_free(zMsg)
8d60: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
8d70: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
8d80: 72 6f 72 5f 6e 6f 6d 65 6d 28 70 43 74 78 29 3b  ror_nomem(pCtx);
8d90: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
8da0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72  .}.../*.** Repor
8db0: 74 20 74 68 65 20 77 72 6f 6e 67 20 6e 75 6d 62  t the wrong numb
8dc0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
8dd0: 66 6f 72 20 6a 73 6f 6e 5f 69 6e 73 65 72 74 28  for json_insert(
8de0: 29 2c 20 6a 73 6f 6e 5f 72 65 70 6c 61 63 65 28  ), json_replace(
8df0: 29 0a 2a 2a 20 6f 72 20 6a 73 6f 6e 5f 73 65 74  ).** or json_set
8e00: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
8e10: 69 64 20 6a 73 6f 6e 57 72 6f 6e 67 4e 75 6d 41  id jsonWrongNumA
8e20: 72 67 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  rgs(.  sqlite3_c
8e30: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 0a 20 20  ontext *pCtx,.  
8e40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
8e50: 63 4e 61 6d 65 0a 29 7b 0a 20 20 63 68 61 72 20  cName.){.  char 
8e60: 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  *zMsg = sqlite3_
8e70: 6d 70 72 69 6e 74 66 28 22 6a 73 6f 6e 5f 25 73  mprintf("json_%s
8e80: 28 29 20 6e 65 65 64 73 20 61 6e 20 6f 64 64 20  () needs an odd 
8e90: 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
8ea0: 6e 74 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  nts",.          
8eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ec0: 20 20 20 20 20 7a 46 75 6e 63 4e 61 6d 65 29 3b       zFuncName);
8ed0: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
8ee0: 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 7a 4d  t_error(pCtx, zM
8ef0: 73 67 2c 20 2d 31 29 3b 0a 20 20 73 71 6c 69 74  sg, -1);.  sqlit
8f00: 65 33 5f 66 72 65 65 28 7a 4d 73 67 29 3b 20 20  e3_free(zMsg);  
8f10: 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72     .}../*.** Mar
8f20: 6b 20 61 6c 6c 20 4e 55 4c 4c 20 65 6e 74 72 69  k all NULL entri
8f30: 65 73 20 69 6e 20 74 68 65 20 4f 62 6a 65 63 74  es in the Object
8f40: 20 70 61 73 73 65 64 20 69 6e 20 61 73 20 4a 4e   passed in as JN
8f50: 4f 44 45 5f 52 45 4d 4f 56 45 2e 0a 2a 2f 0a 73  ODE_REMOVE..*/.s
8f60: 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 52  tatic void jsonR
8f70: 65 6d 6f 76 65 41 6c 6c 4e 75 6c 6c 73 28 4a 73  emoveAllNulls(Js
8f80: 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 29 7b 0a  onNode *pNode){.
8f90: 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 61 73    int i, n;.  as
8fa0: 73 65 72 74 28 20 70 4e 6f 64 65 2d 3e 65 54 79  sert( pNode->eTy
8fb0: 70 65 3d 3d 4a 53 4f 4e 5f 4f 42 4a 45 43 54 20  pe==JSON_OBJECT 
8fc0: 29 3b 0a 20 20 6e 20 3d 20 70 4e 6f 64 65 2d 3e  );.  n = pNode->
8fd0: 6e 3b 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c  n;.  for(i=2; i<
8fe0: 3d 6e 3b 20 69 20 2b 3d 20 6a 73 6f 6e 4e 6f 64  =n; i += jsonNod
8ff0: 65 53 69 7a 65 28 26 70 4e 6f 64 65 5b 69 5d 29  eSize(&pNode[i])
9000: 2b 31 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28  +1){.    switch(
9010: 20 70 4e 6f 64 65 5b 69 5d 2e 65 54 79 70 65 20   pNode[i].eType 
9020: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4a 53  ){.      case JS
9030: 4f 4e 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20 20 20  ON_NULL:.       
9040: 20 70 4e 6f 64 65 5b 69 5d 2e 6a 6e 46 6c 61 67   pNode[i].jnFlag
9050: 73 20 7c 3d 20 4a 4e 4f 44 45 5f 52 45 4d 4f 56  s |= JNODE_REMOV
9060: 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  E;.        break
9070: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4a 53 4f  ;.      case JSO
9080: 4e 5f 4f 42 4a 45 43 54 3a 0a 20 20 20 20 20 20  N_OBJECT:.      
9090: 20 20 6a 73 6f 6e 52 65 6d 6f 76 65 41 6c 6c 4e    jsonRemoveAllN
90a0: 75 6c 6c 73 28 26 70 4e 6f 64 65 5b 69 5d 29 3b  ulls(&pNode[i]);
90b0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
90c0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a      }.  }.}.../*
90d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
90e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
90f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 53  ***********.** S
9120: 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65  QL functions use
9130: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
9140: 64 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a 2a 2a  d debugging.****
9150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9170: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9180: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9190: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66 64 65  ********/..#ifde
91a0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
91b0: 2a 0a 2a 2a 20 54 68 65 20 6a 73 6f 6e 5f 70 61  *.** The json_pa
91c0: 72 73 65 28 4a 53 4f 4e 29 20 66 75 6e 63 74 69  rse(JSON) functi
91d0: 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 73 74 72  on returns a str
91e0: 69 6e 67 20 77 68 69 63 68 20 64 65 73 63 72 69  ing which descri
91f0: 62 65 73 0a 2a 2a 20 61 20 70 61 72 73 65 20 6f  bes.** a parse o
9200: 66 20 74 68 65 20 4a 53 4f 4e 20 70 72 6f 76 69  f the JSON provi
9210: 64 65 64 2e 20 20 4f 72 20 69 74 20 72 65 74 75  ded.  Or it retu
9220: 72 6e 73 20 4e 55 4c 4c 20 69 66 20 4a 53 4f 4e  rns NULL if JSON
9230: 20 69 73 20 6e 6f 74 0a 2a 2a 20 77 65 6c 6c 2d   is not.** well-
9240: 66 6f 72 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  formed..*/.stati
9250: 63 20 76 6f 69 64 20 6a 73 6f 6e 50 61 72 73 65  c void jsonParse
9260: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
9270: 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 0a 20 20  context *ctx,.  
9280: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
9290: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
92a0: 0a 29 7b 0a 20 20 4a 73 6f 6e 53 74 72 69 6e 67  .){.  JsonString
92b0: 20 73 3b 20 20 20 20 20 20 20 2f 2a 20 4f 75 74   s;       /* Out
92c0: 70 75 74 20 73 74 72 69 6e 67 20 2d 20 6e 6f 74  put string - not
92d0: 20 72 65 61 6c 20 4a 53 4f 4e 20 2a 2f 0a 20 20   real JSON */.  
92e0: 4a 73 6f 6e 50 61 72 73 65 20 78 3b 20 20 20 20  JsonParse x;    
92f0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
9300: 20 2a 2f 0a 20 20 75 33 32 20 69 3b 0a 0a 20 20   */.  u32 i;..  
9310: 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20  assert( argc==1 
9320: 29 3b 0a 20 20 69 66 28 20 6a 73 6f 6e 50 61 72  );.  if( jsonPar
9330: 73 65 28 26 78 2c 20 63 74 78 2c 20 28 63 6f 6e  se(&x, ctx, (con
9340: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
9350: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
9360: 5b 30 5d 29 29 20 29 20 72 65 74 75 72 6e 3b 0a  [0])) ) return;.
9370: 20 20 6a 73 6f 6e 50 61 72 73 65 46 69 6e 64 50    jsonParseFindP
9380: 61 72 65 6e 74 73 28 26 78 29 3b 0a 20 20 6a 73  arents(&x);.  js
9390: 6f 6e 49 6e 69 74 28 26 73 2c 20 63 74 78 29 3b  onInit(&s, ctx);
93a0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 2e  .  for(i=0; i<x.
93b0: 6e 4e 6f 64 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  nNode; i++){.   
93c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
93d0: 70 65 3b 0a 20 20 20 20 69 66 28 20 78 2e 61 4e  pe;.    if( x.aN
93e0: 6f 64 65 5b 69 5d 2e 6a 6e 46 6c 61 67 73 20 26  ode[i].jnFlags &
93f0: 20 4a 4e 4f 44 45 5f 4c 41 42 45 4c 20 29 7b 0a   JNODE_LABEL ){.
9400: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 78 2e        assert( x.
9410: 61 4e 6f 64 65 5b 69 5d 2e 65 54 79 70 65 3d 3d  aNode[i].eType==
9420: 4a 53 4f 4e 5f 53 54 52 49 4e 47 20 29 3b 0a 20  JSON_STRING );. 
9430: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 6c 61       zType = "la
9440: 62 65 6c 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  bel";.    }else{
9450: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 6a  .      zType = j
9460: 73 6f 6e 54 79 70 65 5b 78 2e 61 4e 6f 64 65 5b  sonType[x.aNode[
9470: 69 5d 2e 65 54 79 70 65 5d 3b 0a 20 20 20 20 7d  i].eType];.    }
9480: 0a 20 20 20 20 6a 73 6f 6e 50 72 69 6e 74 66 28  .    jsonPrintf(
9490: 31 30 30 2c 20 26 73 2c 22 6e 6f 64 65 20 25 33  100, &s,"node %3
94a0: 75 3a 20 25 37 73 20 6e 3d 25 2d 34 64 20 75 70  u: %7s n=%-4d up
94b0: 3d 25 2d 34 64 22 2c 0a 20 20 20 20 20 20 20 20  =%-4d",.        
94c0: 20 20 20 20 20 20 20 69 2c 20 7a 54 79 70 65 2c         i, zType,
94d0: 20 78 2e 61 4e 6f 64 65 5b 69 5d 2e 6e 2c 20 78   x.aNode[i].n, x
94e0: 2e 61 55 70 5b 69 5d 29 3b 0a 20 20 20 20 69 66  .aUp[i]);.    if
94f0: 28 20 78 2e 61 4e 6f 64 65 5b 69 5d 2e 75 2e 7a  ( x.aNode[i].u.z
9500: 4a 43 6f 6e 74 65 6e 74 21 3d 30 20 29 7b 0a 20  JContent!=0 ){. 
9510: 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 52       jsonAppendR
9520: 61 77 28 26 73 2c 20 22 20 22 2c 20 31 29 3b 0a  aw(&s, " ", 1);.
9530: 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64        jsonAppend
9540: 52 61 77 28 26 73 2c 20 78 2e 61 4e 6f 64 65 5b  Raw(&s, x.aNode[
9550: 69 5d 2e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 2c 20  i].u.zJContent, 
9560: 78 2e 61 4e 6f 64 65 5b 69 5d 2e 6e 29 3b 0a 20  x.aNode[i].n);. 
9570: 20 20 20 7d 0a 20 20 20 20 6a 73 6f 6e 41 70 70     }.    jsonApp
9580: 65 6e 64 52 61 77 28 26 73 2c 20 22 5c 6e 22 2c  endRaw(&s, "\n",
9590: 20 31 29 3b 0a 20 20 7d 0a 20 20 6a 73 6f 6e 50   1);.  }.  jsonP
95a0: 61 72 73 65 52 65 73 65 74 28 26 78 29 3b 0a 20  arseReset(&x);. 
95b0: 20 6a 73 6f 6e 52 65 73 75 6c 74 28 26 73 29 3b   jsonResult(&s);
95c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 73  .}../*.** The js
95d0: 6f 6e 5f 74 65 73 74 31 28 4a 53 4f 4e 29 20 66  on_test1(JSON) f
95e0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 74  unction return t
95f0: 72 75 65 20 28 31 29 20 69 66 20 74 68 65 20 69  rue (1) if the i
9600: 6e 70 75 74 20 69 73 20 4a 53 4f 4e 0a 2a 2a 20  nput is JSON.** 
9610: 74 65 78 74 20 67 65 6e 65 72 61 74 65 64 20 62  text generated b
9620: 79 20 61 6e 6f 74 68 65 72 20 6a 73 6f 6e 20 66  y another json f
9630: 75 6e 63 74 69 6f 6e 2e 20 20 49 74 20 72 65 74  unction.  It ret
9640: 75 72 6e 73 20 28 30 29 20 69 66 20 74 68 65 20  urns (0) if the 
9650: 69 6e 70 75 74 0a 2a 2a 20 69 73 20 6e 6f 74 20  input.** is not 
9660: 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 4a 53 4f 4e  known to be JSON
9670: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
9680: 20 6a 73 6f 6e 54 65 73 74 31 46 75 6e 63 28 0a   jsonTest1Func(.
9690: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
96a0: 74 20 2a 63 74 78 2c 0a 20 20 69 6e 74 20 61 72  t *ctx,.  int ar
96b0: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
96c0: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
96d0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 61 72 67  UNUSED_PARAM(arg
96e0: 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  c);.  sqlite3_re
96f0: 73 75 6c 74 5f 69 6e 74 28 63 74 78 2c 20 73 71  sult_int(ctx, sq
9700: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 73 75 62 74  lite3_value_subt
9710: 79 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d 4a 53  ype(argv[0])==JS
9720: 4f 4e 5f 53 55 42 54 59 50 45 29 3b 0a 7d 0a 23  ON_SUBTYPE);.}.#
9730: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
9740: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  DEBUG */../*****
9750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9760: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9790: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 53 63 61 6c 61  *******.** Scala
97a0: 72 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 69  r SQL function i
97b0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a  mplementations.*
97c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
97d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
97e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
97f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
9810: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
9820: 6f 6e 20 6f 66 20 74 68 65 20 6a 73 6f 6e 5f 51  on of the json_Q
9830: 55 4f 54 45 28 56 41 4c 55 45 29 20 66 75 6e 63  UOTE(VALUE) func
9840: 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 20  tion.  Return a 
9850: 4a 53 4f 4e 20 76 61 6c 75 65 0a 2a 2a 20 63 6f  JSON value.** co
9860: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
9870: 68 65 20 53 51 4c 20 76 61 6c 75 65 20 69 6e 70  he SQL value inp
9880: 75 74 2e 20 20 4d 6f 73 74 6c 79 20 74 68 69 73  ut.  Mostly this
9890: 20 6d 65 61 6e 73 20 70 75 74 74 69 6e 67 20 0a   means putting .
98a0: 2a 2a 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73  ** double-quotes
98b0: 20 61 72 6f 75 6e 64 20 73 74 72 69 6e 67 73 20   around strings 
98c0: 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 74 68  and returning th
98d0: 65 20 75 6e 71 75 6f 74 65 64 20 73 74 72 69 6e  e unquoted strin
98e0: 67 20 22 6e 75 6c 6c 22 0a 2a 2a 20 77 68 65 6e  g "null".** when
98f0: 20 67 69 76 65 6e 20 61 20 4e 55 4c 4c 20 69 6e   given a NULL in
9900: 70 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  put..*/.static v
9910: 6f 69 64 20 6a 73 6f 6e 51 75 6f 74 65 46 75 6e  oid jsonQuoteFun
9920: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
9930: 74 65 78 74 20 2a 63 74 78 2c 0a 20 20 69 6e 74  text *ctx,.  int
9940: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
9950: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
9960: 0a 20 20 4a 73 6f 6e 53 74 72 69 6e 67 20 6a 78  .  JsonString jx
9970: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
9980: 28 61 72 67 63 29 3b 0a 0a 20 20 6a 73 6f 6e 49  (argc);..  jsonI
9990: 6e 69 74 28 26 6a 78 2c 20 63 74 78 29 3b 0a 20  nit(&jx, ctx);. 
99a0: 20 6a 73 6f 6e 41 70 70 65 6e 64 56 61 6c 75 65   jsonAppendValue
99b0: 28 26 6a 78 2c 20 61 72 67 76 5b 30 5d 29 3b 0a  (&jx, argv[0]);.
99c0: 20 20 6a 73 6f 6e 52 65 73 75 6c 74 28 26 6a 78    jsonResult(&jx
99d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
99e0: 75 6c 74 5f 73 75 62 74 79 70 65 28 63 74 78 2c  ult_subtype(ctx,
99f0: 20 4a 53 4f 4e 5f 53 55 42 54 59 50 45 29 3b 0a   JSON_SUBTYPE);.
9a00: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
9a10: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a  ntation of the j
9a20: 73 6f 6e 5f 61 72 72 61 79 28 56 41 4c 55 45 2c  son_array(VALUE,
9a30: 2e 2e 2e 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  ...) function.  
9a40: 52 65 74 75 72 6e 20 61 20 4a 53 4f 4e 0a 2a 2a  Return a JSON.**
9a50: 20 61 72 72 61 79 20 74 68 61 74 20 63 6f 6e 74   array that cont
9a60: 61 69 6e 73 20 61 6c 6c 20 76 61 6c 75 65 73 20  ains all values 
9a70: 67 69 76 65 6e 20 69 6e 20 61 72 67 75 6d 65 6e  given in argumen
9a80: 74 73 2e 20 20 4f 72 20 69 66 20 61 6e 79 20 61  ts.  Or if any a
9a90: 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 61 20  rgument.** is a 
9aa0: 42 4c 4f 42 2c 20 74 68 72 6f 77 20 61 6e 20 65  BLOB, throw an e
9ab0: 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rror..*/.static 
9ac0: 76 6f 69 64 20 6a 73 6f 6e 41 72 72 61 79 46 75  void jsonArrayFu
9ad0: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
9ae0: 6e 74 65 78 74 20 2a 63 74 78 2c 0a 20 20 69 6e  ntext *ctx,.  in
9af0: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
9b00: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
9b10: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4a 73 6f  {.  int i;.  Jso
9b20: 6e 53 74 72 69 6e 67 20 6a 78 3b 0a 0a 20 20 6a  nString jx;..  j
9b30: 73 6f 6e 49 6e 69 74 28 26 6a 78 2c 20 63 74 78  sonInit(&jx, ctx
9b40: 29 3b 0a 20 20 6a 73 6f 6e 41 70 70 65 6e 64 43  );.  jsonAppendC
9b50: 68 61 72 28 26 6a 78 2c 20 27 5b 27 29 3b 0a 20  har(&jx, '[');. 
9b60: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63   for(i=0; i<argc
9b70: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6a 73 6f 6e  ; i++){.    json
9b80: 41 70 70 65 6e 64 53 65 70 61 72 61 74 6f 72 28  AppendSeparator(
9b90: 26 6a 78 29 3b 0a 20 20 20 20 6a 73 6f 6e 41 70  &jx);.    jsonAp
9ba0: 70 65 6e 64 56 61 6c 75 65 28 26 6a 78 2c 20 61  pendValue(&jx, a
9bb0: 72 67 76 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 6a  rgv[i]);.  }.  j
9bc0: 73 6f 6e 41 70 70 65 6e 64 43 68 61 72 28 26 6a  sonAppendChar(&j
9bd0: 78 2c 20 27 5d 27 29 3b 0a 20 20 6a 73 6f 6e 52  x, ']');.  jsonR
9be0: 65 73 75 6c 74 28 26 6a 78 29 3b 0a 20 20 73 71  esult(&jx);.  sq
9bf0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 73 75 62  lite3_result_sub
9c00: 74 79 70 65 28 63 74 78 2c 20 4a 53 4f 4e 5f 53  type(ctx, JSON_S
9c10: 55 42 54 59 50 45 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  UBTYPE);.}.../*.
9c20: 2a 2a 20 6a 73 6f 6e 5f 61 72 72 61 79 5f 6c 65  ** json_array_le
9c30: 6e 67 74 68 28 4a 53 4f 4e 29 0a 2a 2a 20 6a 73  ngth(JSON).** js
9c40: 6f 6e 5f 61 72 72 61 79 5f 6c 65 6e 67 74 68 28  on_array_length(
9c50: 4a 53 4f 4e 2c 20 50 41 54 48 29 0a 2a 2a 0a 2a  JSON, PATH).**.*
9c60: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
9c70: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
9c80: 69 6e 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c  in the top-level
9c90: 20 4a 53 4f 4e 20 61 72 72 61 79 2e 20 20 0a 2a   JSON array.  .*
9ca0: 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68  * Return 0 if th
9cb0: 65 20 69 6e 70 75 74 20 69 73 20 6e 6f 74 20 61  e input is not a
9cc0: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 4a 53 4f   well-formed JSO
9cd0: 4e 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74  N array..*/.stat
9ce0: 69 63 20 76 6f 69 64 20 6a 73 6f 6e 41 72 72 61  ic void jsonArra
9cf0: 79 4c 65 6e 67 74 68 46 75 6e 63 28 0a 20 20 73  yLengthFunc(.  s
9d00: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
9d10: 63 74 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ctx,.  int argc,
9d20: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
9d30: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 4a 73 6f   **argv.){.  Jso
9d40: 6e 50 61 72 73 65 20 2a 70 3b 20 20 20 20 20 20  nParse *p;      
9d50: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
9d60: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
9d70: 74 36 34 20 6e 20 3d 20 30 3b 0a 20 20 75 33 32  t64 n = 0;.  u32
9d80: 20 69 3b 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a   i;.  JsonNode *
9d90: 70 4e 6f 64 65 3b 0a 0a 20 20 70 20 3d 20 6a 73  pNode;..  p = js
9da0: 6f 6e 50 61 72 73 65 43 61 63 68 65 64 28 63 74  onParseCached(ct
9db0: 78 2c 20 61 72 67 76 29 3b 0a 20 20 69 66 28 20  x, argv);.  if( 
9dc0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
9dd0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4e 6f 64   assert( p->nNod
9de0: 65 20 29 3b 0a 20 20 69 66 28 20 61 72 67 63 3d  e );.  if( argc=
9df0: 3d 32 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =2 ){.    const 
9e00: 63 68 61 72 20 2a 7a 50 61 74 68 20 3d 20 28 63  char *zPath = (c
9e10: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
9e20: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
9e30: 67 76 5b 31 5d 29 3b 0a 20 20 20 20 70 4e 6f 64  gv[1]);.    pNod
9e40: 65 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 28 70  e = jsonLookup(p
9e50: 2c 20 7a 50 61 74 68 2c 20 30 2c 20 63 74 78 29  , zPath, 0, ctx)
9e60: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
9e70: 4e 6f 64 65 20 3d 20 70 2d 3e 61 4e 6f 64 65 3b  Node = p->aNode;
9e80: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 6f 64 65  .  }.  if( pNode
9e90: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
9ea0: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 6f  n;.  }.  if( pNo
9eb0: 64 65 2d 3e 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f  de->eType==JSON_
9ec0: 41 52 52 41 59 20 29 7b 0a 20 20 20 20 61 73 73  ARRAY ){.    ass
9ed0: 65 72 74 28 20 28 70 4e 6f 64 65 2d 3e 6a 6e 46  ert( (pNode->jnF
9ee0: 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 41 50 50  lags & JNODE_APP
9ef0: 45 4e 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20 66  END)==0 );.    f
9f00: 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 4e 6f 64 65  or(i=1; i<=pNode
9f10: 2d 3e 6e 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20  ->n; n++){.     
9f20: 20 69 20 2b 3d 20 6a 73 6f 6e 4e 6f 64 65 53 69   i += jsonNodeSi
9f30: 7a 65 28 26 70 4e 6f 64 65 5b 69 5d 29 3b 0a 20  ze(&pNode[i]);. 
9f40: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
9f50: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28  e3_result_int64(
9f60: 63 74 78 2c 20 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ctx, n);.}../*.*
9f70: 2a 20 6a 73 6f 6e 5f 65 78 74 72 61 63 74 28 4a  * json_extract(J
9f80: 53 4f 4e 2c 20 50 41 54 48 2c 20 2e 2e 2e 29 0a  SON, PATH, ...).
9f90: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
9fa0: 20 65 6c 65 6d 65 6e 74 20 64 65 73 63 72 69 62   element describ
9fb0: 65 64 20 62 79 20 50 41 54 48 2e 20 20 52 65 74  ed by PATH.  Ret
9fc0: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72  urn NULL if ther
9fd0: 65 20 69 73 20 6e 6f 0a 2a 2a 20 50 41 54 48 20  e is no.** PATH 
9fe0: 65 6c 65 6d 65 6e 74 2e 20 20 49 66 20 74 68 65  element.  If the
9ff0: 72 65 20 61 72 65 20 6d 75 6c 74 69 70 6c 65 20  re are multiple 
a000: 50 41 54 48 73 2c 20 74 68 65 6e 20 72 65 74 75  PATHs, then retu
a010: 72 6e 20 61 20 4a 53 4f 4e 20 61 72 72 61 79 0a  rn a JSON array.
a020: 2a 2a 20 77 69 74 68 20 74 68 65 20 72 65 73 75  ** with the resu
a030: 6c 74 20 66 72 6f 6d 20 65 61 63 68 20 70 61 74  lt from each pat
a040: 68 2e 20 20 54 68 72 6f 77 20 61 6e 20 65 72 72  h.  Throw an err
a050: 6f 72 20 69 66 20 74 68 65 20 4a 53 4f 4e 20 6f  or if the JSON o
a060: 72 20 61 6e 79 20 50 41 54 48 0a 2a 2a 20 69 73  r any PATH.** is
a070: 20 6d 61 6c 66 6f 72 6d 65 64 2e 0a 2a 2f 0a 73   malformed..*/.s
a080: 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 45  tatic void jsonE
a090: 78 74 72 61 63 74 46 75 6e 63 28 0a 20 20 73 71  xtractFunc(.  sq
a0a0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
a0b0: 74 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  tx,.  int argc,.
a0c0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
a0d0: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e  **argv.){.  Json
a0e0: 50 61 72 73 65 20 2a 70 3b 20 20 20 20 20 20 20  Parse *p;       
a0f0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 20     /* The parse 
a100: 2a 2f 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70  */.  JsonNode *p
a110: 4e 6f 64 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68  Node;.  const ch
a120: 61 72 20 2a 7a 50 61 74 68 3b 0a 20 20 4a 73 6f  ar *zPath;.  Jso
a130: 6e 53 74 72 69 6e 67 20 6a 78 3b 0a 20 20 69 6e  nString jx;.  in
a140: 74 20 69 3b 0a 0a 20 20 69 66 28 20 61 72 67 63  t i;..  if( argc
a150: 3c 32 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  <2 ) return;.  p
a160: 20 3d 20 6a 73 6f 6e 50 61 72 73 65 43 61 63 68   = jsonParseCach
a170: 65 64 28 63 74 78 2c 20 61 72 67 76 29 3b 0a 20  ed(ctx, argv);. 
a180: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
a190: 72 6e 3b 0a 20 20 6a 73 6f 6e 49 6e 69 74 28 26  rn;.  jsonInit(&
a1a0: 6a 78 2c 20 63 74 78 29 3b 0a 20 20 6a 73 6f 6e  jx, ctx);.  json
a1b0: 41 70 70 65 6e 64 43 68 61 72 28 26 6a 78 2c 20  AppendChar(&jx, 
a1c0: 27 5b 27 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b  '[');.  for(i=1;
a1d0: 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20   i<argc; i++){. 
a1e0: 20 20 20 7a 50 61 74 68 20 3d 20 28 63 6f 6e 73     zPath = (cons
a1f0: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
a200: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
a210: 69 5d 29 3b 0a 20 20 20 20 70 4e 6f 64 65 20 3d  i]);.    pNode =
a220: 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 28 70 2c 20 7a   jsonLookup(p, z
a230: 50 61 74 68 2c 20 30 2c 20 63 74 78 29 3b 0a 20  Path, 0, ctx);. 
a240: 20 20 20 69 66 28 20 70 2d 3e 6e 45 72 72 20 29     if( p->nErr )
a250: 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
a260: 61 72 67 63 3e 32 20 29 7b 0a 20 20 20 20 20 20  argc>2 ){.      
a270: 6a 73 6f 6e 41 70 70 65 6e 64 53 65 70 61 72 61  jsonAppendSepara
a280: 74 6f 72 28 26 6a 78 29 3b 0a 20 20 20 20 20 20  tor(&jx);.      
a290: 69 66 28 20 70 4e 6f 64 65 20 29 7b 0a 20 20 20  if( pNode ){.   
a2a0: 20 20 20 20 20 6a 73 6f 6e 52 65 6e 64 65 72 4e       jsonRenderN
a2b0: 6f 64 65 28 70 4e 6f 64 65 2c 20 26 6a 78 2c 20  ode(pNode, &jx, 
a2c0: 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  0);.      }else{
a2d0: 0a 20 20 20 20 20 20 20 20 6a 73 6f 6e 41 70 70  .        jsonApp
a2e0: 65 6e 64 52 61 77 28 26 6a 78 2c 20 22 6e 75 6c  endRaw(&jx, "nul
a2f0: 6c 22 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d 0a  l", 4);.      }.
a300: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4e      }else if( pN
a310: 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 6a 73 6f  ode ){.      jso
a320: 6e 52 65 74 75 72 6e 28 70 4e 6f 64 65 2c 20 63  nReturn(pNode, c
a330: 74 78 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  tx, 0);.    }.  
a340: 7d 0a 20 20 69 66 28 20 61 72 67 63 3e 32 20 26  }.  if( argc>2 &
a350: 26 20 69 3d 3d 61 72 67 63 20 29 7b 0a 20 20 20  & i==argc ){.   
a360: 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61 72 28   jsonAppendChar(
a370: 26 6a 78 2c 20 27 5d 27 29 3b 0a 20 20 20 20 6a  &jx, ']');.    j
a380: 73 6f 6e 52 65 73 75 6c 74 28 26 6a 78 29 3b 0a  sonResult(&jx);.
a390: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
a3a0: 6c 74 5f 73 75 62 74 79 70 65 28 63 74 78 2c 20  lt_subtype(ctx, 
a3b0: 4a 53 4f 4e 5f 53 55 42 54 59 50 45 29 3b 0a 20  JSON_SUBTYPE);. 
a3c0: 20 7d 0a 20 20 6a 73 6f 6e 52 65 73 65 74 28 26   }.  jsonReset(&
a3d0: 6a 78 29 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73 20  jx);.}../* This 
a3e0: 69 73 20 74 68 65 20 52 46 43 20 37 33 39 36 20  is the RFC 7396 
a3f0: 4d 65 72 67 65 50 61 74 63 68 20 61 6c 67 6f 72  MergePatch algor
a400: 69 74 68 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ithm..*/.static 
a410: 4a 73 6f 6e 4e 6f 64 65 20 2a 6a 73 6f 6e 4d 65  JsonNode *jsonMe
a420: 72 67 65 50 61 74 63 68 28 0a 20 20 4a 73 6f 6e  rgePatch(.  Json
a430: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
a440: 20 2f 2a 20 54 68 65 20 4a 53 4f 4e 20 70 61 72   /* The JSON par
a450: 73 65 72 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ser that contain
a460: 73 20 74 68 65 20 54 41 52 47 45 54 20 2a 2f 0a  s the TARGET */.
a470: 20 20 75 33 32 20 69 54 61 72 67 65 74 2c 20 20    u32 iTarget,  
a480: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 64 65 20 6f         /* Node o
a490: 66 20 74 68 65 20 54 41 52 47 45 54 20 69 6e 20  f the TARGET in 
a4a0: 70 50 61 72 73 65 20 2a 2f 0a 20 20 4a 73 6f 6e  pParse */.  Json
a4b0: 4e 6f 64 65 20 2a 70 50 61 74 63 68 20 20 20 20  Node *pPatch    
a4c0: 20 2f 2a 20 54 68 65 20 50 41 54 43 48 20 2a 2f   /* The PATCH */
a4d0: 0a 29 7b 0a 20 20 75 33 32 20 69 2c 20 6a 3b 0a  .){.  u32 i, j;.
a4e0: 20 20 75 33 32 20 69 52 6f 6f 74 3b 0a 20 20 4a    u32 iRoot;.  J
a4f0: 73 6f 6e 4e 6f 64 65 20 2a 70 54 61 72 67 65 74  sonNode *pTarget
a500: 3b 0a 20 20 69 66 28 20 70 50 61 74 63 68 2d 3e  ;.  if( pPatch->
a510: 65 54 79 70 65 21 3d 4a 53 4f 4e 5f 4f 42 4a 45  eType!=JSON_OBJE
a520: 43 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  CT ){.    return
a530: 20 70 50 61 74 63 68 3b 0a 20 20 7d 0a 20 20 61   pPatch;.  }.  a
a540: 73 73 65 72 74 28 20 69 54 61 72 67 65 74 3e 3d  ssert( iTarget>=
a550: 30 20 26 26 20 69 54 61 72 67 65 74 3c 70 50 61  0 && iTarget<pPa
a560: 72 73 65 2d 3e 6e 4e 6f 64 65 20 29 3b 0a 20 20  rse->nNode );.  
a570: 70 54 61 72 67 65 74 20 3d 20 26 70 50 61 72 73  pTarget = &pPars
a580: 65 2d 3e 61 4e 6f 64 65 5b 69 54 61 72 67 65 74  e->aNode[iTarget
a590: 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 50  ];.  assert( (pP
a5a0: 61 74 63 68 2d 3e 6a 6e 46 6c 61 67 73 20 26 20  atch->jnFlags & 
a5b0: 4a 4e 4f 44 45 5f 41 50 50 45 4e 44 29 3d 3d 30  JNODE_APPEND)==0
a5c0: 20 29 3b 0a 20 20 69 66 28 20 70 54 61 72 67 65   );.  if( pTarge
a5d0: 74 2d 3e 65 54 79 70 65 21 3d 4a 53 4f 4e 5f 4f  t->eType!=JSON_O
a5e0: 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 6a 73 6f  BJECT ){.    jso
a5f0: 6e 52 65 6d 6f 76 65 41 6c 6c 4e 75 6c 6c 73 28  nRemoveAllNulls(
a600: 70 50 61 74 63 68 29 3b 0a 20 20 20 20 72 65 74  pPatch);.    ret
a610: 75 72 6e 20 70 50 61 74 63 68 3b 0a 20 20 7d 0a  urn pPatch;.  }.
a620: 20 20 69 52 6f 6f 74 20 3d 20 69 54 61 72 67 65    iRoot = iTarge
a630: 74 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  t;.  for(i=1; i<
a640: 70 50 61 74 63 68 2d 3e 6e 3b 20 69 20 2b 3d 20  pPatch->n; i += 
a650: 6a 73 6f 6e 4e 6f 64 65 53 69 7a 65 28 26 70 50  jsonNodeSize(&pP
a660: 61 74 63 68 5b 69 2b 31 5d 29 2b 31 29 7b 0a 20  atch[i+1])+1){. 
a670: 20 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 20     u32 nKey;.   
a680: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65   const char *zKe
a690: 79 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  y;.    assert( p
a6a0: 50 61 74 63 68 5b 69 5d 2e 65 54 79 70 65 3d 3d  Patch[i].eType==
a6b0: 4a 53 4f 4e 5f 53 54 52 49 4e 47 20 29 3b 0a 20  JSON_STRING );. 
a6c0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 74 63     assert( pPatc
a6d0: 68 5b 69 5d 2e 6a 6e 46 6c 61 67 73 20 26 20 4a  h[i].jnFlags & J
a6e0: 4e 4f 44 45 5f 4c 41 42 45 4c 20 29 3b 0a 20 20  NODE_LABEL );.  
a6f0: 20 20 6e 4b 65 79 20 3d 20 70 50 61 74 63 68 5b    nKey = pPatch[
a700: 69 5d 2e 6e 3b 0a 20 20 20 20 7a 4b 65 79 20 3d  i].n;.    zKey =
a710: 20 70 50 61 74 63 68 5b 69 5d 2e 75 2e 7a 4a 43   pPatch[i].u.zJC
a720: 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 61 73 73 65  ontent;.    asse
a730: 72 74 28 20 28 70 50 61 74 63 68 5b 69 5d 2e 6a  rt( (pPatch[i].j
a740: 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 52  nFlags & JNODE_R
a750: 41 57 29 3d 3d 30 20 29 3b 0a 20 20 20 20 66 6f  AW)==0 );.    fo
a760: 72 28 6a 3d 31 3b 20 6a 3c 70 54 61 72 67 65 74  r(j=1; j<pTarget
a770: 2d 3e 6e 3b 20 6a 20 2b 3d 20 6a 73 6f 6e 4e 6f  ->n; j += jsonNo
a780: 64 65 53 69 7a 65 28 26 70 54 61 72 67 65 74 5b  deSize(&pTarget[
a790: 6a 2b 31 5d 29 2b 31 20 29 7b 0a 20 20 20 20 20  j+1])+1 ){.     
a7a0: 20 61 73 73 65 72 74 28 20 70 54 61 72 67 65 74   assert( pTarget
a7b0: 5b 6a 5d 2e 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f  [j].eType==JSON_
a7c0: 53 54 52 49 4e 47 20 29 3b 0a 20 20 20 20 20 20  STRING );.      
a7d0: 61 73 73 65 72 74 28 20 70 54 61 72 67 65 74 5b  assert( pTarget[
a7e0: 6a 5d 2e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f  j].jnFlags & JNO
a7f0: 44 45 5f 4c 41 42 45 4c 20 29 3b 0a 20 20 20 20  DE_LABEL );.    
a800: 20 20 61 73 73 65 72 74 28 20 28 70 50 61 74 63    assert( (pPatc
a810: 68 5b 69 5d 2e 6a 6e 46 6c 61 67 73 20 26 20 4a  h[i].jnFlags & J
a820: 4e 4f 44 45 5f 52 41 57 29 3d 3d 30 20 29 3b 0a  NODE_RAW)==0 );.
a830: 20 20 20 20 20 20 69 66 28 20 70 54 61 72 67 65        if( pTarge
a840: 74 5b 6a 5d 2e 6e 3d 3d 6e 4b 65 79 20 26 26 20  t[j].n==nKey && 
a850: 73 74 72 6e 63 6d 70 28 70 54 61 72 67 65 74 5b  strncmp(pTarget[
a860: 6a 5d 2e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 2c 7a  j].u.zJContent,z
a870: 4b 65 79 2c 6e 4b 65 79 29 3d 3d 30 20 29 7b 0a  Key,nKey)==0 ){.
a880: 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61 72          if( pTar
a890: 67 65 74 5b 6a 2b 31 5d 2e 6a 6e 46 6c 61 67 73  get[j+1].jnFlags
a8a0: 20 26 20 28 4a 4e 4f 44 45 5f 52 45 4d 4f 56 45   & (JNODE_REMOVE
a8b0: 7c 4a 4e 4f 44 45 5f 50 41 54 43 48 29 20 29 20  |JNODE_PATCH) ) 
a8c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69  break;.        i
a8d0: 66 28 20 70 50 61 74 63 68 5b 69 2b 31 5d 2e 65  f( pPatch[i+1].e
a8e0: 54 79 70 65 3d 3d 4a 53 4f 4e 5f 4e 55 4c 4c 20  Type==JSON_NULL 
a8f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61  ){.          pTa
a900: 72 67 65 74 5b 6a 2b 31 5d 2e 6a 6e 46 6c 61 67  rget[j+1].jnFlag
a910: 73 20 7c 3d 20 4a 4e 4f 44 45 5f 52 45 4d 4f 56  s |= JNODE_REMOV
a920: 45 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  E;.        }else
a930: 7b 0a 20 20 20 20 20 20 20 20 20 20 4a 73 6f 6e  {.          Json
a940: 4e 6f 64 65 20 2a 70 4e 65 77 20 3d 20 6a 73 6f  Node *pNew = jso
a950: 6e 4d 65 72 67 65 50 61 74 63 68 28 70 50 61 72  nMergePatch(pPar
a960: 73 65 2c 20 69 54 61 72 67 65 74 2b 6a 2b 31 2c  se, iTarget+j+1,
a970: 20 26 70 50 61 74 63 68 5b 69 2b 31 5d 29 3b 0a   &pPatch[i+1]);.
a980: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e            if( pN
a990: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
a9a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 72  ;.          pTar
a9b0: 67 65 74 20 3d 20 26 70 50 61 72 73 65 2d 3e 61  get = &pParse->a
a9c0: 4e 6f 64 65 5b 69 54 61 72 67 65 74 5d 3b 0a 20  Node[iTarget];. 
a9d0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65           if( pNe
a9e0: 77 21 3d 26 70 54 61 72 67 65 74 5b 6a 2b 31 5d  w!=&pTarget[j+1]
a9f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
aa00: 70 54 61 72 67 65 74 5b 6a 2b 31 5d 2e 75 2e 70  pTarget[j+1].u.p
aa10: 50 61 74 63 68 20 3d 20 70 4e 65 77 3b 0a 20 20  Patch = pNew;.  
aa20: 20 20 20 20 20 20 20 20 20 20 70 54 61 72 67 65            pTarge
aa30: 74 5b 6a 2b 31 5d 2e 6a 6e 46 6c 61 67 73 20 7c  t[j+1].jnFlags |
aa40: 3d 20 4a 4e 4f 44 45 5f 50 41 54 43 48 3b 0a 20  = JNODE_PATCH;. 
aa50: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
aa60: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
aa70: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
aa80: 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70 54 61  }.    if( j>=pTa
aa90: 72 67 65 74 2d 3e 6e 20 26 26 20 70 50 61 74 63  rget->n && pPatc
aaa0: 68 5b 69 2b 31 5d 2e 65 54 79 70 65 21 3d 4a 53  h[i+1].eType!=JS
aab0: 4f 4e 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  ON_NULL ){.     
aac0: 20 69 6e 74 20 69 53 74 61 72 74 2c 20 69 50 61   int iStart, iPa
aad0: 74 63 68 3b 0a 20 20 20 20 20 20 69 53 74 61 72  tch;.      iStar
aae0: 74 20 3d 20 6a 73 6f 6e 50 61 72 73 65 41 64 64  t = jsonParseAdd
aaf0: 4e 6f 64 65 28 70 50 61 72 73 65 2c 20 4a 53 4f  Node(pParse, JSO
ab00: 4e 5f 4f 42 4a 45 43 54 2c 20 32 2c 20 30 29 3b  N_OBJECT, 2, 0);
ab10: 0a 20 20 20 20 20 20 6a 73 6f 6e 50 61 72 73 65  .      jsonParse
ab20: 41 64 64 4e 6f 64 65 28 70 50 61 72 73 65 2c 20  AddNode(pParse, 
ab30: 4a 53 4f 4e 5f 53 54 52 49 4e 47 2c 20 6e 4b 65  JSON_STRING, nKe
ab40: 79 2c 20 7a 4b 65 79 29 3b 0a 20 20 20 20 20 20  y, zKey);.      
ab50: 69 50 61 74 63 68 20 3d 20 6a 73 6f 6e 50 61 72  iPatch = jsonPar
ab60: 73 65 41 64 64 4e 6f 64 65 28 70 50 61 72 73 65  seAddNode(pParse
ab70: 2c 20 4a 53 4f 4e 5f 54 52 55 45 2c 20 30 2c 20  , JSON_TRUE, 0, 
ab80: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  0);.      if( pP
ab90: 61 72 73 65 2d 3e 6f 6f 6d 20 29 20 72 65 74 75  arse->oom ) retu
aba0: 72 6e 20 30 3b 0a 20 20 20 20 20 20 6a 73 6f 6e  rn 0;.      json
abb0: 52 65 6d 6f 76 65 41 6c 6c 4e 75 6c 6c 73 28 70  RemoveAllNulls(p
abc0: 50 61 74 63 68 29 3b 0a 20 20 20 20 20 20 70 54  Patch);.      pT
abd0: 61 72 67 65 74 20 3d 20 26 70 50 61 72 73 65 2d  arget = &pParse-
abe0: 3e 61 4e 6f 64 65 5b 69 54 61 72 67 65 74 5d 3b  >aNode[iTarget];
abf0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61  .      pParse->a
ac00: 4e 6f 64 65 5b 69 52 6f 6f 74 5d 2e 6a 6e 46 6c  Node[iRoot].jnFl
ac10: 61 67 73 20 7c 3d 20 4a 4e 4f 44 45 5f 41 50 50  ags |= JNODE_APP
ac20: 45 4e 44 3b 0a 20 20 20 20 20 20 70 50 61 72 73  END;.      pPars
ac30: 65 2d 3e 61 4e 6f 64 65 5b 69 52 6f 6f 74 5d 2e  e->aNode[iRoot].
ac40: 75 2e 69 41 70 70 65 6e 64 20 3d 20 69 53 74 61  u.iAppend = iSta
ac50: 72 74 20 2d 20 69 52 6f 6f 74 3b 0a 20 20 20 20  rt - iRoot;.    
ac60: 20 20 69 52 6f 6f 74 20 3d 20 69 53 74 61 72 74    iRoot = iStart
ac70: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
ac80: 61 4e 6f 64 65 5b 69 50 61 74 63 68 5d 2e 6a 6e  aNode[iPatch].jn
ac90: 46 6c 61 67 73 20 7c 3d 20 4a 4e 4f 44 45 5f 50  Flags |= JNODE_P
aca0: 41 54 43 48 3b 0a 20 20 20 20 20 20 70 50 61 72  ATCH;.      pPar
acb0: 73 65 2d 3e 61 4e 6f 64 65 5b 69 50 61 74 63 68  se->aNode[iPatch
acc0: 5d 2e 75 2e 70 50 61 74 63 68 20 3d 20 26 70 50  ].u.pPatch = &pP
acd0: 61 74 63 68 5b 69 2b 31 5d 3b 0a 20 20 20 20 7d  atch[i+1];.    }
ace0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54  .  }.  return pT
acf0: 61 72 67 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  arget;.}../*.** 
ad00: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
ad10: 66 20 74 68 65 20 6a 73 6f 6e 5f 6d 65 72 67 65  f the json_merge
ad20: 70 61 74 63 68 28 4a 53 4f 4e 31 2c 4a 53 4f 4e  patch(JSON1,JSON
ad30: 32 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 52 65  2) function.  Re
ad40: 74 75 72 6e 20 61 20 4a 53 4f 4e 0a 2a 2a 20 6f  turn a JSON.** o
ad50: 62 6a 65 63 74 20 74 68 61 74 20 69 73 20 74 68  bject that is th
ad60: 65 20 72 65 73 75 6c 74 20 6f 66 20 72 75 6e 6e  e result of runn
ad70: 69 6e 67 20 74 68 65 20 52 46 43 20 37 33 39 36  ing the RFC 7396
ad80: 20 4d 65 72 67 65 50 61 74 63 68 28 29 20 61 6c   MergePatch() al
ad90: 67 6f 72 69 74 68 6d 0a 2a 2a 20 6f 6e 20 74 68  gorithm.** on th
ada0: 65 20 74 77 6f 20 61 72 67 75 6d 65 6e 74 73 2e  e two arguments.
adb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
adc0: 6a 73 6f 6e 50 61 74 63 68 46 75 6e 63 28 0a 20  jsonPatchFunc(. 
add0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
ade0: 20 2a 63 74 78 2c 0a 20 20 69 6e 74 20 61 72 67   *ctx,.  int arg
adf0: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
ae00: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 4a  ue **argv.){.  J
ae10: 73 6f 6e 50 61 72 73 65 20 78 3b 20 20 20 20 20  sonParse x;     
ae20: 2f 2a 20 54 68 65 20 4a 53 4f 4e 20 74 68 61 74  /* The JSON that
ae30: 20 69 73 20 62 65 69 6e 67 20 70 61 74 63 68 65   is being patche
ae40: 64 20 2a 2f 0a 20 20 4a 73 6f 6e 50 61 72 73 65  d */.  JsonParse
ae50: 20 79 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70   y;     /* The p
ae60: 61 74 63 68 20 2a 2f 0a 20 20 4a 73 6f 6e 4e 6f  atch */.  JsonNo
ae70: 64 65 20 2a 70 52 65 73 75 6c 74 3b 20 20 20 2f  de *pResult;   /
ae80: 2a 20 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20  * The result of 
ae90: 74 68 65 20 6d 65 72 67 65 20 2a 2f 0a 0a 20 20  the merge */..  
aea0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 61 72 67  UNUSED_PARAM(arg
aeb0: 63 29 3b 0a 20 20 69 66 28 20 6a 73 6f 6e 50 61  c);.  if( jsonPa
aec0: 72 73 65 28 26 78 2c 20 63 74 78 2c 20 28 63 6f  rse(&x, ctx, (co
aed0: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
aee0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
aef0: 76 5b 30 5d 29 29 20 29 20 72 65 74 75 72 6e 3b  v[0])) ) return;
af00: 0a 20 20 69 66 28 20 6a 73 6f 6e 50 61 72 73 65  .  if( jsonParse
af10: 28 26 79 2c 20 63 74 78 2c 20 28 63 6f 6e 73 74  (&y, ctx, (const
af20: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
af30: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31  alue_text(argv[1
af40: 5d 29 29 20 29 7b 0a 20 20 20 20 6a 73 6f 6e 50  ])) ){.    jsonP
af50: 61 72 73 65 52 65 73 65 74 28 26 78 29 3b 0a 20  arseReset(&x);. 
af60: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
af70: 20 70 52 65 73 75 6c 74 20 3d 20 6a 73 6f 6e 4d   pResult = jsonM
af80: 65 72 67 65 50 61 74 63 68 28 26 78 2c 20 30 2c  ergePatch(&x, 0,
af90: 20 79 2e 61 4e 6f 64 65 29 3b 0a 20 20 61 73 73   y.aNode);.  ass
afa0: 65 72 74 28 20 70 52 65 73 75 6c 74 21 3d 30 20  ert( pResult!=0 
afb0: 7c 7c 20 78 2e 6f 6f 6d 20 29 3b 0a 20 20 69 66  || x.oom );.  if
afc0: 28 20 70 52 65 73 75 6c 74 20 29 7b 0a 20 20 20  ( pResult ){.   
afd0: 20 6a 73 6f 6e 52 65 74 75 72 6e 4a 73 6f 6e 28   jsonReturnJson(
afe0: 70 52 65 73 75 6c 74 2c 20 63 74 78 2c 20 30 29  pResult, ctx, 0)
aff0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
b000: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
b010: 72 6f 72 5f 6e 6f 6d 65 6d 28 63 74 78 29 3b 0a  ror_nomem(ctx);.
b020: 20 20 7d 0a 20 20 6a 73 6f 6e 50 61 72 73 65 52    }.  jsonParseR
b030: 65 73 65 74 28 26 78 29 3b 0a 20 20 6a 73 6f 6e  eset(&x);.  json
b040: 50 61 72 73 65 52 65 73 65 74 28 26 79 29 3b 0a  ParseReset(&y);.
b050: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  }.../*.** Implem
b060: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
b070: 6a 73 6f 6e 5f 6f 62 6a 65 63 74 28 4e 41 4d 45  json_object(NAME
b080: 2c 56 41 4c 55 45 2c 2e 2e 2e 29 20 66 75 6e 63  ,VALUE,...) func
b090: 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 20  tion.  Return a 
b0a0: 4a 53 4f 4e 0a 2a 2a 20 6f 62 6a 65 63 74 20 74  JSON.** object t
b0b0: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  hat contains all
b0c0: 20 6e 61 6d 65 2f 76 61 6c 75 65 20 67 69 76 65   name/value give
b0d0: 6e 20 69 6e 20 61 72 67 75 6d 65 6e 74 73 2e 20  n in arguments. 
b0e0: 20 4f 72 20 69 66 20 61 6e 79 20 6e 61 6d 65 0a   Or if any name.
b0f0: 2a 2a 20 69 73 20 6e 6f 74 20 61 20 73 74 72 69  ** is not a stri
b100: 6e 67 20 6f 72 20 69 66 20 61 6e 79 20 76 61 6c  ng or if any val
b110: 75 65 20 69 73 20 61 20 42 4c 4f 42 2c 20 74 68  ue is a BLOB, th
b120: 72 6f 77 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f  row an error..*/
b130: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f  .static void jso
b140: 6e 4f 62 6a 65 63 74 46 75 6e 63 28 0a 20 20 73  nObjectFunc(.  s
b150: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
b160: 63 74 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ctx,.  int argc,
b170: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
b180: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74   **argv.){.  int
b190: 20 69 3b 0a 20 20 4a 73 6f 6e 53 74 72 69 6e 67   i;.  JsonString
b1a0: 20 6a 78 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61   jx;.  const cha
b1b0: 72 20 2a 7a 3b 0a 20 20 75 33 32 20 6e 3b 0a 0a  r *z;.  u32 n;..
b1c0: 20 20 69 66 28 20 61 72 67 63 26 31 20 29 7b 0a    if( argc&1 ){.
b1d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
b1e0: 6c 74 5f 65 72 72 6f 72 28 63 74 78 2c 20 22 6a  lt_error(ctx, "j
b1f0: 73 6f 6e 5f 6f 62 6a 65 63 74 28 29 20 72 65 71  son_object() req
b200: 75 69 72 65 73 20 61 6e 20 65 76 65 6e 20 6e 75  uires an even nu
b210: 6d 62 65 72 20 22 0a 20 20 20 20 20 20 20 20 20  mber ".         
b220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b230: 20 20 20 20 20 20 20 20 20 22 6f 66 20 61 72 67           "of arg
b240: 75 6d 65 6e 74 73 22 2c 20 2d 31 29 3b 0a 20 20  uments", -1);.  
b250: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
b260: 6a 73 6f 6e 49 6e 69 74 28 26 6a 78 2c 20 63 74  jsonInit(&jx, ct
b270: 78 29 3b 0a 20 20 6a 73 6f 6e 41 70 70 65 6e 64  x);.  jsonAppend
b280: 43 68 61 72 28 26 6a 78 2c 20 27 7b 27 29 3b 0a  Char(&jx, '{');.
b290: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67    for(i=0; i<arg
b2a0: 63 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 69 66  c; i+=2){.    if
b2b0: 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  ( sqlite3_value_
b2c0: 74 79 70 65 28 61 72 67 76 5b 69 5d 29 21 3d 53  type(argv[i])!=S
b2d0: 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20  QLITE_TEXT ){.  
b2e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
b2f0: 6c 74 5f 65 72 72 6f 72 28 63 74 78 2c 20 22 6a  lt_error(ctx, "j
b300: 73 6f 6e 5f 6f 62 6a 65 63 74 28 29 20 6c 61 62  son_object() lab
b310: 65 6c 73 20 6d 75 73 74 20 62 65 20 54 45 58 54  els must be TEXT
b320: 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 6a 73  ", -1);.      js
b330: 6f 6e 52 65 73 65 74 28 26 6a 78 29 3b 0a 20 20  onReset(&jx);.  
b340: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
b350: 7d 0a 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64  }.    jsonAppend
b360: 53 65 70 61 72 61 74 6f 72 28 26 6a 78 29 3b 0a  Separator(&jx);.
b370: 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 63      z = (const c
b380: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
b390: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 69 5d 29  ue_text(argv[i])
b3a0: 3b 0a 20 20 20 20 6e 20 3d 20 28 75 33 32 29 73  ;.    n = (u32)s
b3b0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
b3c0: 65 73 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20  es(argv[i]);.   
b3d0: 20 6a 73 6f 6e 41 70 70 65 6e 64 53 74 72 69 6e   jsonAppendStrin
b3e0: 67 28 26 6a 78 2c 20 7a 2c 20 6e 29 3b 0a 20 20  g(&jx, z, n);.  
b3f0: 20 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61 72    jsonAppendChar
b400: 28 26 6a 78 2c 20 27 3a 27 29 3b 0a 20 20 20 20  (&jx, ':');.    
b410: 6a 73 6f 6e 41 70 70 65 6e 64 56 61 6c 75 65 28  jsonAppendValue(
b420: 26 6a 78 2c 20 61 72 67 76 5b 69 2b 31 5d 29 3b  &jx, argv[i+1]);
b430: 0a 20 20 7d 0a 20 20 6a 73 6f 6e 41 70 70 65 6e  .  }.  jsonAppen
b440: 64 43 68 61 72 28 26 6a 78 2c 20 27 7d 27 29 3b  dChar(&jx, '}');
b450: 0a 20 20 6a 73 6f 6e 52 65 73 75 6c 74 28 26 6a  .  jsonResult(&j
b460: 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  x);.  sqlite3_re
b470: 73 75 6c 74 5f 73 75 62 74 79 70 65 28 63 74 78  sult_subtype(ctx
b480: 2c 20 4a 53 4f 4e 5f 53 55 42 54 59 50 45 29 3b  , JSON_SUBTYPE);
b490: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 6a 73 6f 6e 5f  .}.../*.** json_
b4a0: 72 65 6d 6f 76 65 28 4a 53 4f 4e 2c 20 50 41 54  remove(JSON, PAT
b4b0: 48 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 52 65  H, ...).**.** Re
b4c0: 6d 6f 76 65 20 74 68 65 20 6e 61 6d 65 64 20 65  move the named e
b4d0: 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 20 4a 53 4f  lements from JSO
b4e0: 4e 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  N and return the
b4f0: 20 72 65 73 75 6c 74 2e 20 20 6d 61 6c 66 6f 72   result.  malfor
b500: 6d 65 64 0a 2a 2a 20 4a 53 4f 4e 20 6f 72 20 50  med.** JSON or P
b510: 41 54 48 20 61 72 67 75 6d 65 6e 74 73 20 72 65  ATH arguments re
b520: 73 75 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f 72  sult in an error
b530: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
b540: 20 6a 73 6f 6e 52 65 6d 6f 76 65 46 75 6e 63 28   jsonRemoveFunc(
b550: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
b560: 78 74 20 2a 63 74 78 2c 0a 20 20 69 6e 74 20 61  xt *ctx,.  int a
b570: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
b580: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
b590: 20 4a 73 6f 6e 50 61 72 73 65 20 78 3b 20 20 20   JsonParse x;   
b5a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
b5b0: 72 73 65 20 2a 2f 0a 20 20 4a 73 6f 6e 4e 6f 64  rse */.  JsonNod
b5c0: 65 20 2a 70 4e 6f 64 65 3b 0a 20 20 63 6f 6e 73  e *pNode;.  cons
b5d0: 74 20 63 68 61 72 20 2a 7a 50 61 74 68 3b 0a 20  t char *zPath;. 
b5e0: 20 75 33 32 20 69 3b 0a 0a 20 20 69 66 28 20 61   u32 i;..  if( a
b5f0: 72 67 63 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a  rgc<1 ) return;.
b600: 20 20 69 66 28 20 6a 73 6f 6e 50 61 72 73 65 28    if( jsonParse(
b610: 26 78 2c 20 63 74 78 2c 20 28 63 6f 6e 73 74 20  &x, ctx, (const 
b620: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
b630: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
b640: 29 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  )) ) return;.  a
b650: 73 73 65 72 74 28 20 78 2e 6e 4e 6f 64 65 20 29  ssert( x.nNode )
b660: 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 28  ;.  for(i=1; i<(
b670: 75 33 32 29 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  u32)argc; i++){.
b680: 20 20 20 20 7a 50 61 74 68 20 3d 20 28 63 6f 6e      zPath = (con
b690: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
b6a0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
b6b0: 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a 50  [i]);.    if( zP
b6c0: 61 74 68 3d 3d 30 20 29 20 67 6f 74 6f 20 72 65  ath==0 ) goto re
b6d0: 6d 6f 76 65 5f 64 6f 6e 65 3b 0a 20 20 20 20 70  move_done;.    p
b6e0: 4e 6f 64 65 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75  Node = jsonLooku
b6f0: 70 28 26 78 2c 20 7a 50 61 74 68 2c 20 30 2c 20  p(&x, zPath, 0, 
b700: 63 74 78 29 3b 0a 20 20 20 20 69 66 28 20 78 2e  ctx);.    if( x.
b710: 6e 45 72 72 20 29 20 67 6f 74 6f 20 72 65 6d 6f  nErr ) goto remo
b720: 76 65 5f 64 6f 6e 65 3b 0a 20 20 20 20 69 66 28  ve_done;.    if(
b730: 20 70 4e 6f 64 65 20 29 20 70 4e 6f 64 65 2d 3e   pNode ) pNode->
b740: 6a 6e 46 6c 61 67 73 20 7c 3d 20 4a 4e 4f 44 45  jnFlags |= JNODE
b750: 5f 52 45 4d 4f 56 45 3b 0a 20 20 7d 0a 20 20 69  _REMOVE;.  }.  i
b760: 66 28 20 28 78 2e 61 4e 6f 64 65 5b 30 5d 2e 6a  f( (x.aNode[0].j
b770: 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 52  nFlags & JNODE_R
b780: 45 4d 4f 56 45 29 3d 3d 30 20 29 7b 0a 20 20 20  EMOVE)==0 ){.   
b790: 20 6a 73 6f 6e 52 65 74 75 72 6e 4a 73 6f 6e 28   jsonReturnJson(
b7a0: 78 2e 61 4e 6f 64 65 2c 20 63 74 78 2c 20 30 29  x.aNode, ctx, 0)
b7b0: 3b 0a 20 20 7d 0a 72 65 6d 6f 76 65 5f 64 6f 6e  ;.  }.remove_don
b7c0: 65 3a 0a 20 20 6a 73 6f 6e 50 61 72 73 65 52 65  e:.  jsonParseRe
b7d0: 73 65 74 28 26 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  set(&x);.}../*.*
b7e0: 2a 20 6a 73 6f 6e 5f 72 65 70 6c 61 63 65 28 4a  * json_replace(J
b7f0: 53 4f 4e 2c 20 50 41 54 48 2c 20 56 41 4c 55 45  SON, PATH, VALUE
b800: 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 52 65 70  , ...).**.** Rep
b810: 6c 61 63 65 20 74 68 65 20 76 61 6c 75 65 20 61  lace the value a
b820: 74 20 50 41 54 48 20 77 69 74 68 20 56 41 4c 55  t PATH with VALU
b830: 45 2e 20 20 49 66 20 50 41 54 48 20 64 6f 65 73  E.  If PATH does
b840: 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69   not already exi
b850: 73 74 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  st,.** this rout
b860: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ine is a no-op. 
b870: 20 49 66 20 4a 53 4f 4e 20 6f 72 20 50 41 54 48   If JSON or PATH
b880: 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 2c 20 74   is malformed, t
b890: 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  hrow an error..*
b8a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73  /.static void js
b8b0: 6f 6e 52 65 70 6c 61 63 65 46 75 6e 63 28 0a 20  onReplaceFunc(. 
b8c0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
b8d0: 20 2a 63 74 78 2c 0a 20 20 69 6e 74 20 61 72 67   *ctx,.  int arg
b8e0: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
b8f0: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 4a  ue **argv.){.  J
b900: 73 6f 6e 50 61 72 73 65 20 78 3b 20 20 20 20 20  sonParse x;     
b910: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
b920: 65 20 2a 2f 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20  e */.  JsonNode 
b930: 2a 70 4e 6f 64 65 3b 0a 20 20 63 6f 6e 73 74 20  *pNode;.  const 
b940: 63 68 61 72 20 2a 7a 50 61 74 68 3b 0a 20 20 75  char *zPath;.  u
b950: 33 32 20 69 3b 0a 0a 20 20 69 66 28 20 61 72 67  32 i;..  if( arg
b960: 63 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  c<1 ) return;.  
b970: 69 66 28 20 28 61 72 67 63 26 31 29 3d 3d 30 20  if( (argc&1)==0 
b980: 29 20 7b 0a 20 20 20 20 6a 73 6f 6e 57 72 6f 6e  ) {.    jsonWron
b990: 67 4e 75 6d 41 72 67 73 28 63 74 78 2c 20 22 72  gNumArgs(ctx, "r
b9a0: 65 70 6c 61 63 65 22 29 3b 0a 20 20 20 20 72 65  eplace");.    re
b9b0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
b9c0: 6a 73 6f 6e 50 61 72 73 65 28 26 78 2c 20 63 74  jsonParse(&x, ct
b9d0: 78 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  x, (const char*)
b9e0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
b9f0: 78 74 28 61 72 67 76 5b 30 5d 29 29 20 29 20 72  xt(argv[0])) ) r
ba00: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
ba10: 20 78 2e 6e 4e 6f 64 65 20 29 3b 0a 20 20 66 6f   x.nNode );.  fo
ba20: 72 28 69 3d 31 3b 20 69 3c 28 75 33 32 29 61 72  r(i=1; i<(u32)ar
ba30: 67 63 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 7a  gc; i+=2){.    z
ba40: 50 61 74 68 20 3d 20 28 63 6f 6e 73 74 20 63 68  Path = (const ch
ba50: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
ba60: 65 5f 74 65 78 74 28 61 72 67 76 5b 69 5d 29 3b  e_text(argv[i]);
ba70: 0a 20 20 20 20 70 4e 6f 64 65 20 3d 20 6a 73 6f  .    pNode = jso
ba80: 6e 4c 6f 6f 6b 75 70 28 26 78 2c 20 7a 50 61 74  nLookup(&x, zPat
ba90: 68 2c 20 30 2c 20 63 74 78 29 3b 0a 20 20 20 20  h, 0, ctx);.    
baa0: 69 66 28 20 78 2e 6e 45 72 72 20 29 20 67 6f 74  if( x.nErr ) got
bab0: 6f 20 72 65 70 6c 61 63 65 5f 65 72 72 3b 0a 20  o replace_err;. 
bac0: 20 20 20 69 66 28 20 70 4e 6f 64 65 20 29 7b 0a     if( pNode ){.
bad0: 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 6a 6e 46        pNode->jnF
bae0: 6c 61 67 73 20 7c 3d 20 28 75 38 29 4a 4e 4f 44  lags |= (u8)JNOD
baf0: 45 5f 52 45 50 4c 41 43 45 3b 0a 20 20 20 20 20  E_REPLACE;.     
bb00: 20 70 4e 6f 64 65 2d 3e 75 2e 69 52 65 70 6c 61   pNode->u.iRepla
bb10: 63 65 20 3d 20 69 20 2b 20 31 3b 0a 20 20 20 20  ce = i + 1;.    
bb20: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 78 2e 61 4e  }.  }.  if( x.aN
bb30: 6f 64 65 5b 30 5d 2e 6a 6e 46 6c 61 67 73 20 26  ode[0].jnFlags &
bb40: 20 4a 4e 4f 44 45 5f 52 45 50 4c 41 43 45 20 29   JNODE_REPLACE )
bb50: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
bb60: 73 75 6c 74 5f 76 61 6c 75 65 28 63 74 78 2c 20  sult_value(ctx, 
bb70: 61 72 67 76 5b 78 2e 61 4e 6f 64 65 5b 30 5d 2e  argv[x.aNode[0].
bb80: 75 2e 69 52 65 70 6c 61 63 65 5d 29 3b 0a 20 20  u.iReplace]);.  
bb90: 7d 65 6c 73 65 7b 0a 20 20 20 20 6a 73 6f 6e 52  }else{.    jsonR
bba0: 65 74 75 72 6e 4a 73 6f 6e 28 78 2e 61 4e 6f 64  eturnJson(x.aNod
bbb0: 65 2c 20 63 74 78 2c 20 61 72 67 76 29 3b 0a 20  e, ctx, argv);. 
bbc0: 20 7d 0a 72 65 70 6c 61 63 65 5f 65 72 72 3a 0a   }.replace_err:.
bbd0: 20 20 6a 73 6f 6e 50 61 72 73 65 52 65 73 65 74    jsonParseReset
bbe0: 28 26 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 6a  (&x);.}../*.** j
bbf0: 73 6f 6e 5f 73 65 74 28 4a 53 4f 4e 2c 20 50 41  son_set(JSON, PA
bc00: 54 48 2c 20 56 41 4c 55 45 2c 20 2e 2e 2e 29 0a  TH, VALUE, ...).
bc10: 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61  **.** Set the va
bc20: 6c 75 65 20 61 74 20 50 41 54 48 20 74 6f 20 56  lue at PATH to V
bc30: 41 4c 55 45 2e 20 20 43 72 65 61 74 65 20 74 68  ALUE.  Create th
bc40: 65 20 50 41 54 48 20 69 66 20 69 74 20 64 6f 65  e PATH if it doe
bc50: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a  s not already.**
bc60: 20 65 78 69 73 74 2e 20 20 4f 76 65 72 77 72 69   exist.  Overwri
bc70: 74 65 20 65 78 69 73 74 69 6e 67 20 76 61 6c 75  te existing valu
bc80: 65 73 20 74 68 61 74 20 64 6f 20 65 78 69 73 74  es that do exist
bc90: 2e 0a 2a 2a 20 49 66 20 4a 53 4f 4e 20 6f 72 20  ..** If JSON or 
bca0: 50 41 54 48 20 69 73 20 6d 61 6c 66 6f 72 6d 65  PATH is malforme
bcb0: 64 2c 20 74 68 72 6f 77 20 61 6e 20 65 72 72 6f  d, throw an erro
bcc0: 72 2e 0a 2a 2a 0a 2a 2a 20 6a 73 6f 6e 5f 69 6e  r..**.** json_in
bcd0: 73 65 72 74 28 4a 53 4f 4e 2c 20 50 41 54 48 2c  sert(JSON, PATH,
bce0: 20 56 41 4c 55 45 2c 20 2e 2e 2e 29 0a 2a 2a 0a   VALUE, ...).**.
bcf0: 2a 2a 20 43 72 65 61 74 65 20 50 41 54 48 20 61  ** Create PATH a
bd00: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74  nd initialize it
bd10: 20 74 6f 20 56 41 4c 55 45 2e 20 20 49 66 20 50   to VALUE.  If P
bd20: 41 54 48 20 61 6c 72 65 61 64 79 20 65 78 69 73  ATH already exis
bd30: 74 73 2c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  ts, this.** rout
bd40: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ine is a no-op. 
bd50: 20 49 66 20 4a 53 4f 4e 20 6f 72 20 50 41 54 48   If JSON or PATH
bd60: 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 2c 20 74   is malformed, t
bd70: 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  hrow an error..*
bd80: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73  /.static void js
bd90: 6f 6e 53 65 74 46 75 6e 63 28 0a 20 20 73 71 6c  onSetFunc(.  sql
bda0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74  ite3_context *ct
bdb0: 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  x,.  int argc,. 
bdc0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
bdd0: 2a 61 72 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e 50  *argv.){.  JsonP
bde0: 61 72 73 65 20 78 3b 20 20 20 20 20 20 20 20 20  arse x;         
bdf0: 20 2f 2a 20 54 68 65 20 70 61 72 73 65 20 2a 2f   /* The parse */
be00: 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f  .  JsonNode *pNo
be10: 64 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  de;.  const char
be20: 20 2a 7a 50 61 74 68 3b 0a 20 20 75 33 32 20 69   *zPath;.  u32 i
be30: 3b 0a 20 20 69 6e 74 20 62 41 70 6e 64 3b 0a 20  ;.  int bApnd;. 
be40: 20 69 6e 74 20 62 49 73 53 65 74 20 3d 20 2a 28   int bIsSet = *(
be50: 69 6e 74 2a 29 73 71 6c 69 74 65 33 5f 75 73 65  int*)sqlite3_use
be60: 72 5f 64 61 74 61 28 63 74 78 29 3b 0a 0a 20 20  r_data(ctx);..  
be70: 69 66 28 20 61 72 67 63 3c 31 20 29 20 72 65 74  if( argc<1 ) ret
be80: 75 72 6e 3b 0a 20 20 69 66 28 20 28 61 72 67 63  urn;.  if( (argc
be90: 26 31 29 3d 3d 30 20 29 20 7b 0a 20 20 20 20 6a  &1)==0 ) {.    j
bea0: 73 6f 6e 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  sonWrongNumArgs(
beb0: 63 74 78 2c 20 62 49 73 53 65 74 20 3f 20 22 73  ctx, bIsSet ? "s
bec0: 65 74 22 20 3a 20 22 69 6e 73 65 72 74 22 29 3b  et" : "insert");
bed0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
bee0: 0a 20 20 69 66 28 20 6a 73 6f 6e 50 61 72 73 65  .  if( jsonParse
bef0: 28 26 78 2c 20 63 74 78 2c 20 28 63 6f 6e 73 74  (&x, ctx, (const
bf00: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
bf10: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
bf20: 5d 29 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ])) ) return;.  
bf30: 61 73 73 65 72 74 28 20 78 2e 6e 4e 6f 64 65 20  assert( x.nNode 
bf40: 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  );.  for(i=1; i<
bf50: 28 75 33 32 29 61 72 67 63 3b 20 69 2b 3d 32 29  (u32)argc; i+=2)
bf60: 7b 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 28 63  {.    zPath = (c
bf70: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
bf80: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
bf90: 67 76 5b 69 5d 29 3b 0a 20 20 20 20 62 41 70 6e  gv[i]);.    bApn
bfa0: 64 20 3d 20 30 3b 0a 20 20 20 20 70 4e 6f 64 65  d = 0;.    pNode
bfb0: 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 28 26 78   = jsonLookup(&x
bfc0: 2c 20 7a 50 61 74 68 2c 20 26 62 41 70 6e 64 2c  , zPath, &bApnd,
bfd0: 20 63 74 78 29 3b 0a 20 20 20 20 69 66 28 20 78   ctx);.    if( x
bfe0: 2e 6f 6f 6d 20 29 7b 0a 20 20 20 20 20 20 73 71  .oom ){.      sq
bff0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
c000: 6f 72 5f 6e 6f 6d 65 6d 28 63 74 78 29 3b 0a 20  or_nomem(ctx);. 
c010: 20 20 20 20 20 67 6f 74 6f 20 6a 73 6f 6e 53 65       goto jsonSe
c020: 74 44 6f 6e 65 3b 0a 20 20 20 20 7d 65 6c 73 65  tDone;.    }else
c030: 20 69 66 28 20 78 2e 6e 45 72 72 20 29 7b 0a 20   if( x.nErr ){. 
c040: 20 20 20 20 20 67 6f 74 6f 20 6a 73 6f 6e 53 65       goto jsonSe
c050: 74 44 6f 6e 65 3b 0a 20 20 20 20 7d 65 6c 73 65  tDone;.    }else
c060: 20 69 66 28 20 70 4e 6f 64 65 20 26 26 20 28 62   if( pNode && (b
c070: 41 70 6e 64 20 7c 7c 20 62 49 73 53 65 74 29 20  Apnd || bIsSet) 
c080: 29 7b 0a 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e  ){.      pNode->
c090: 6a 6e 46 6c 61 67 73 20 7c 3d 20 28 75 38 29 4a  jnFlags |= (u8)J
c0a0: 4e 4f 44 45 5f 52 45 50 4c 41 43 45 3b 0a 20 20  NODE_REPLACE;.  
c0b0: 20 20 20 20 70 4e 6f 64 65 2d 3e 75 2e 69 52 65      pNode->u.iRe
c0c0: 70 6c 61 63 65 20 3d 20 69 20 2b 20 31 3b 0a 20  place = i + 1;. 
c0d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 78     }.  }.  if( x
c0e0: 2e 61 4e 6f 64 65 5b 30 5d 2e 6a 6e 46 6c 61 67  .aNode[0].jnFlag
c0f0: 73 20 26 20 4a 4e 4f 44 45 5f 52 45 50 4c 41 43  s & JNODE_REPLAC
c100: 45 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  E ){.    sqlite3
c110: 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 63 74  _result_value(ct
c120: 78 2c 20 61 72 67 76 5b 78 2e 61 4e 6f 64 65 5b  x, argv[x.aNode[
c130: 30 5d 2e 75 2e 69 52 65 70 6c 61 63 65 5d 29 3b  0].u.iReplace]);
c140: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6a 73  .  }else{.    js
c150: 6f 6e 52 65 74 75 72 6e 4a 73 6f 6e 28 78 2e 61  onReturnJson(x.a
c160: 4e 6f 64 65 2c 20 63 74 78 2c 20 61 72 67 76 29  Node, ctx, argv)
c170: 3b 0a 20 20 7d 0a 6a 73 6f 6e 53 65 74 44 6f 6e  ;.  }.jsonSetDon
c180: 65 3a 0a 20 20 6a 73 6f 6e 50 61 72 73 65 52 65  e:.  jsonParseRe
c190: 73 65 74 28 26 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  set(&x);.}../*.*
c1a0: 2a 20 6a 73 6f 6e 5f 74 79 70 65 28 4a 53 4f 4e  * json_type(JSON
c1b0: 29 0a 2a 2a 20 6a 73 6f 6e 5f 74 79 70 65 28 4a  ).** json_type(J
c1c0: 53 4f 4e 2c 20 50 41 54 48 29 0a 2a 2a 0a 2a 2a  SON, PATH).**.**
c1d0: 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f 70 2d   Return the top-
c1e0: 6c 65 76 65 6c 20 22 74 79 70 65 22 20 6f 66 20  level "type" of 
c1f0: 61 20 4a 53 4f 4e 20 73 74 72 69 6e 67 2e 20 20  a JSON string.  
c200: 54 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 20 69  Throw an error i
c210: 66 0a 2a 2a 20 65 69 74 68 65 72 20 74 68 65 20  f.** either the 
c220: 4a 53 4f 4e 20 6f 72 20 50 41 54 48 20 69 6e 70  JSON or PATH inp
c230: 75 74 73 20 61 72 65 20 6e 6f 74 20 77 65 6c 6c  uts are not well
c240: 2d 66 6f 72 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74  -formed..*/.stat
c250: 69 63 20 76 6f 69 64 20 6a 73 6f 6e 54 79 70 65  ic void jsonType
c260: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
c270: 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 0a 20 20  context *ctx,.  
c280: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69  int argc,.  sqli
c290: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
c2a0: 0a 29 7b 0a 20 20 4a 73 6f 6e 50 61 72 73 65 20  .){.  JsonParse 
c2b0: 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  x;          /* T
c2c0: 68 65 20 70 61 72 73 65 20 2a 2f 0a 20 20 63 6f  he parse */.  co
c2d0: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 3b  nst char *zPath;
c2e0: 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f  .  JsonNode *pNo
c2f0: 64 65 3b 0a 0a 20 20 69 66 28 20 6a 73 6f 6e 50  de;..  if( jsonP
c300: 61 72 73 65 28 26 78 2c 20 63 74 78 2c 20 28 63  arse(&x, ctx, (c
c310: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
c320: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
c330: 67 76 5b 30 5d 29 29 20 29 20 72 65 74 75 72 6e  gv[0])) ) return
c340: 3b 0a 20 20 61 73 73 65 72 74 28 20 78 2e 6e 4e  ;.  assert( x.nN
c350: 6f 64 65 20 29 3b 0a 20 20 69 66 28 20 61 72 67  ode );.  if( arg
c360: 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 50 61 74  c==2 ){.    zPat
c370: 68 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  h = (const char*
c380: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
c390: 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  ext(argv[1]);.  
c3a0: 20 20 70 4e 6f 64 65 20 3d 20 6a 73 6f 6e 4c 6f    pNode = jsonLo
c3b0: 6f 6b 75 70 28 26 78 2c 20 7a 50 61 74 68 2c 20  okup(&x, zPath, 
c3c0: 30 2c 20 63 74 78 29 3b 0a 20 20 7d 65 6c 73 65  0, ctx);.  }else
c3d0: 7b 0a 20 20 20 20 70 4e 6f 64 65 20 3d 20 78 2e  {.    pNode = x.
c3e0: 61 4e 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28  aNode;.  }.  if(
c3f0: 20 70 4e 6f 64 65 20 29 7b 0a 20 20 20 20 73 71   pNode ){.    sq
c400: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
c410: 74 28 63 74 78 2c 20 6a 73 6f 6e 54 79 70 65 5b  t(ctx, jsonType[
c420: 70 4e 6f 64 65 2d 3e 65 54 79 70 65 5d 2c 20 2d  pNode->eType], -
c430: 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
c440: 29 3b 0a 20 20 7d 0a 20 20 6a 73 6f 6e 50 61 72  );.  }.  jsonPar
c450: 73 65 52 65 73 65 74 28 26 78 29 3b 0a 7d 0a 0a  seReset(&x);.}..
c460: 2f 2a 0a 2a 2a 20 6a 73 6f 6e 5f 76 61 6c 69 64  /*.** json_valid
c470: 28 4a 53 4f 4e 29 0a 2a 2a 0a 2a 2a 20 52 65 74  (JSON).**.** Ret
c480: 75 72 6e 20 31 20 69 66 20 4a 53 4f 4e 20 69 73  urn 1 if JSON is
c490: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 4a   a well-formed J
c4a0: 53 4f 4e 20 73 74 72 69 6e 67 20 61 63 63 6f 72  SON string accor
c4b0: 64 69 6e 67 20 74 6f 20 52 46 43 2d 37 31 35 39  ding to RFC-7159
c4c0: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 6f 74  ..** Return 0 ot
c4d0: 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
c4e0: 69 63 20 76 6f 69 64 20 6a 73 6f 6e 56 61 6c 69  ic void jsonVali
c4f0: 64 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  dFunc(.  sqlite3
c500: 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 0a 20  _context *ctx,. 
c510: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
c520: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
c530: 76 0a 29 7b 0a 20 20 4a 73 6f 6e 50 61 72 73 65  v.){.  JsonParse
c540: 20 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   x;          /* 
c550: 54 68 65 20 70 61 72 73 65 20 2a 2f 0a 20 20 69  The parse */.  i
c560: 6e 74 20 72 63 20 3d 20 30 3b 0a 0a 20 20 55 4e  nt rc = 0;..  UN
c570: 55 53 45 44 5f 50 41 52 41 4d 28 61 72 67 63 29  USED_PARAM(argc)
c580: 3b 0a 20 20 69 66 28 20 6a 73 6f 6e 50 61 72 73  ;.  if( jsonPars
c590: 65 28 26 78 2c 20 30 2c 20 28 63 6f 6e 73 74 20  e(&x, 0, (const 
c5a0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
c5b0: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
c5c0: 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ))==0 ){.    rc 
c5d0: 3d 20 31 3b 0a 20 20 7d 0a 20 20 6a 73 6f 6e 50  = 1;.  }.  jsonP
c5e0: 61 72 73 65 52 65 73 65 74 28 26 78 29 3b 0a 20  arseReset(&x);. 
c5f0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
c600: 69 6e 74 28 63 74 78 2c 20 72 63 29 3b 0a 7d 0a  int(ctx, rc);.}.
c610: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
c620: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c630: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
c660: 2a 2a 20 41 67 67 72 65 67 61 74 65 20 53 51 4c  ** Aggregate SQL
c670: 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d   function implem
c680: 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 2a 2a 2a 2a  entations.******
c690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c6a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c6b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c6c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c6d0: 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 6a 73  ******/./*.** js
c6e0: 6f 6e 5f 67 72 6f 75 70 5f 61 72 72 61 79 28 56  on_group_array(V
c6f0: 41 4c 55 45 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ALUE).**.** Retu
c700: 72 6e 20 61 20 4a 53 4f 4e 20 61 72 72 61 79 20  rn a JSON array 
c710: 63 6f 6d 70 6f 73 65 64 20 6f 66 20 61 6c 6c 20  composed of all 
c720: 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 61 67  values in the ag
c730: 67 72 65 67 61 74 65 2e 0a 2a 2f 0a 73 74 61 74  gregate..*/.stat
c740: 69 63 20 76 6f 69 64 20 6a 73 6f 6e 41 72 72 61  ic void jsonArra
c750: 79 53 74 65 70 28 0a 20 20 73 71 6c 69 74 65 33  yStep(.  sqlite3
c760: 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 0a 20  _context *ctx,. 
c770: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
c780: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
c790: 76 0a 29 7b 0a 20 20 4a 73 6f 6e 53 74 72 69 6e  v.){.  JsonStrin
c7a0: 67 20 2a 70 53 74 72 3b 0a 20 20 55 4e 55 53 45  g *pStr;.  UNUSE
c7b0: 44 5f 50 41 52 41 4d 28 61 72 67 63 29 3b 0a 20  D_PARAM(argc);. 
c7c0: 20 70 53 74 72 20 3d 20 28 4a 73 6f 6e 53 74 72   pStr = (JsonStr
c7d0: 69 6e 67 2a 29 73 71 6c 69 74 65 33 5f 61 67 67  ing*)sqlite3_agg
c7e0: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63  regate_context(c
c7f0: 74 78 2c 20 73 69 7a 65 6f 66 28 2a 70 53 74 72  tx, sizeof(*pStr
c800: 29 29 3b 0a 20 20 69 66 28 20 70 53 74 72 20 29  ));.  if( pStr )
c810: 7b 0a 20 20 20 20 69 66 28 20 70 53 74 72 2d 3e  {.    if( pStr->
c820: 7a 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zBuf==0 ){.     
c830: 20 6a 73 6f 6e 49 6e 69 74 28 70 53 74 72 2c 20   jsonInit(pStr, 
c840: 63 74 78 29 3b 0a 20 20 20 20 20 20 6a 73 6f 6e  ctx);.      json
c850: 41 70 70 65 6e 64 43 68 61 72 28 70 53 74 72 2c  AppendChar(pStr,
c860: 20 27 5b 27 29 3b 0a 20 20 20 20 7d 65 6c 73 65   '[');.    }else
c870: 7b 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65  {.      jsonAppe
c880: 6e 64 43 68 61 72 28 70 53 74 72 2c 20 27 2c 27  ndChar(pStr, ','
c890: 29 3b 0a 20 20 20 20 20 20 70 53 74 72 2d 3e 70  );.      pStr->p
c8a0: 43 74 78 20 3d 20 63 74 78 3b 0a 20 20 20 20 7d  Ctx = ctx;.    }
c8b0: 0a 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 56  .    jsonAppendV
c8c0: 61 6c 75 65 28 70 53 74 72 2c 20 61 72 67 76 5b  alue(pStr, argv[
c8d0: 30 5d 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  0]);.  }.}.stati
c8e0: 63 20 76 6f 69 64 20 6a 73 6f 6e 41 72 72 61 79  c void jsonArray
c8f0: 46 69 6e 61 6c 28 73 71 6c 69 74 65 33 5f 63 6f  Final(sqlite3_co
c900: 6e 74 65 78 74 20 2a 63 74 78 29 7b 0a 20 20 4a  ntext *ctx){.  J
c910: 73 6f 6e 53 74 72 69 6e 67 20 2a 70 53 74 72 3b  sonString *pStr;
c920: 0a 20 20 70 53 74 72 20 3d 20 28 4a 73 6f 6e 53  .  pStr = (JsonS
c930: 74 72 69 6e 67 2a 29 73 71 6c 69 74 65 33 5f 61  tring*)sqlite3_a
c940: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
c950: 28 63 74 78 2c 20 30 29 3b 0a 20 20 69 66 28 20  (ctx, 0);.  if( 
c960: 70 53 74 72 20 29 7b 0a 20 20 20 20 70 53 74 72  pStr ){.    pStr
c970: 2d 3e 70 43 74 78 20 3d 20 63 74 78 3b 0a 20 20  ->pCtx = ctx;.  
c980: 20 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61 72    jsonAppendChar
c990: 28 70 53 74 72 2c 20 27 5d 27 29 3b 0a 20 20 20  (pStr, ']');.   
c9a0: 20 69 66 28 20 70 53 74 72 2d 3e 62 45 72 72 20   if( pStr->bErr 
c9b0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 53 74  ){.      if( pSt
c9c0: 72 2d 3e 62 45 72 72 3d 3d 31 20 29 20 73 71 6c  r->bErr==1 ) sql
c9d0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
c9e0: 72 5f 6e 6f 6d 65 6d 28 63 74 78 29 3b 0a 20 20  r_nomem(ctx);.  
c9f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74 72      assert( pStr
ca00: 2d 3e 62 53 74 61 74 69 63 20 29 3b 0a 20 20 20  ->bStatic );.   
ca10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
ca20: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
ca30: 74 28 63 74 78 2c 20 70 53 74 72 2d 3e 7a 42 75  t(ctx, pStr->zBu
ca40: 66 2c 20 70 53 74 72 2d 3e 6e 55 73 65 64 2c 0a  f, pStr->nUsed,.
ca50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca60: 20 20 20 20 20 20 20 20 20 20 70 53 74 72 2d 3e            pStr->
ca70: 62 53 74 61 74 69 63 20 3f 20 53 51 4c 49 54 45  bStatic ? SQLITE
ca80: 5f 54 52 41 4e 53 49 45 4e 54 20 3a 20 73 71 6c  _TRANSIENT : sql
ca90: 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 20 20  ite3_free);.    
caa0: 20 20 70 53 74 72 2d 3e 62 53 74 61 74 69 63 20    pStr->bStatic 
cab0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
cac0: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
cad0: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 74 78 2c  result_text(ctx,
cae0: 20 22 5b 5d 22 2c 20 32 2c 20 53 51 4c 49 54 45   "[]", 2, SQLITE
caf0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 20 20  _STATIC);.  }.  
cb00: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 73  sqlite3_result_s
cb10: 75 62 74 79 70 65 28 63 74 78 2c 20 4a 53 4f 4e  ubtype(ctx, JSON
cb20: 5f 53 55 42 54 59 50 45 29 3b 0a 7d 0a 0a 2f 2a  _SUBTYPE);.}../*
cb30: 0a 2a 2a 20 6a 73 6f 6e 5f 67 72 6f 75 70 5f 6f  .** json_group_o
cb40: 62 6a 28 4e 41 4d 45 2c 56 41 4c 55 45 29 0a 2a  bj(NAME,VALUE).*
cb50: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 4a 53  *.** Return a JS
cb60: 4f 4e 20 6f 62 6a 65 63 74 20 63 6f 6d 70 6f 73  ON object compos
cb70: 65 64 20 6f 66 20 61 6c 6c 20 6e 61 6d 65 73 20  ed of all names 
cb80: 61 6e 64 20 76 61 6c 75 65 73 20 69 6e 20 74 68  and values in th
cb90: 65 20 61 67 67 72 65 67 61 74 65 2e 0a 2a 2f 0a  e aggregate..*/.
cba0: 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e  static void json
cbb0: 4f 62 6a 65 63 74 53 74 65 70 28 0a 20 20 73 71  ObjectStep(.  sq
cbc0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
cbd0: 74 78 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  tx,.  int argc,.
cbe0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
cbf0: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e  **argv.){.  Json
cc00: 53 74 72 69 6e 67 20 2a 70 53 74 72 3b 0a 20 20  String *pStr;.  
cc10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
cc20: 20 75 33 32 20 6e 3b 0a 20 20 55 4e 55 53 45 44   u32 n;.  UNUSED
cc30: 5f 50 41 52 41 4d 28 61 72 67 63 29 3b 0a 20 20  _PARAM(argc);.  
cc40: 70 53 74 72 20 3d 20 28 4a 73 6f 6e 53 74 72 69  pStr = (JsonStri
cc50: 6e 67 2a 29 73 71 6c 69 74 65 33 5f 61 67 67 72  ng*)sqlite3_aggr
cc60: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 74  egate_context(ct
cc70: 78 2c 20 73 69 7a 65 6f 66 28 2a 70 53 74 72 29  x, sizeof(*pStr)
cc80: 29 3b 0a 20 20 69 66 28 20 70 53 74 72 20 29 7b  );.  if( pStr ){
cc90: 0a 20 20 20 20 69 66 28 20 70 53 74 72 2d 3e 7a  .    if( pStr->z
cca0: 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Buf==0 ){.      
ccb0: 6a 73 6f 6e 49 6e 69 74 28 70 53 74 72 2c 20 63  jsonInit(pStr, c
ccc0: 74 78 29 3b 0a 20 20 20 20 20 20 6a 73 6f 6e 41  tx);.      jsonA
ccd0: 70 70 65 6e 64 43 68 61 72 28 70 53 74 72 2c 20  ppendChar(pStr, 
cce0: 27 7b 27 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  '{');.    }else{
ccf0: 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e  .      jsonAppen
cd00: 64 43 68 61 72 28 70 53 74 72 2c 20 27 2c 27 29  dChar(pStr, ',')
cd10: 3b 0a 20 20 20 20 20 20 70 53 74 72 2d 3e 70 43  ;.      pStr->pC
cd20: 74 78 20 3d 20 63 74 78 3b 0a 20 20 20 20 7d 0a  tx = ctx;.    }.
cd30: 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 63      z = (const c
cd40: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
cd50: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
cd60: 3b 0a 20 20 20 20 6e 20 3d 20 28 75 33 32 29 73  ;.    n = (u32)s
cd70: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
cd80: 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  es(argv[0]);.   
cd90: 20 6a 73 6f 6e 41 70 70 65 6e 64 53 74 72 69 6e   jsonAppendStrin
cda0: 67 28 70 53 74 72 2c 20 7a 2c 20 6e 29 3b 0a 20  g(pStr, z, n);. 
cdb0: 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61     jsonAppendCha
cdc0: 72 28 70 53 74 72 2c 20 27 3a 27 29 3b 0a 20 20  r(pStr, ':');.  
cdd0: 20 20 6a 73 6f 6e 41 70 70 65 6e 64 56 61 6c 75    jsonAppendValu
cde0: 65 28 70 53 74 72 2c 20 61 72 67 76 5b 31 5d 29  e(pStr, argv[1])
cdf0: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
ce00: 6f 69 64 20 6a 73 6f 6e 4f 62 6a 65 63 74 46 69  oid jsonObjectFi
ce10: 6e 61 6c 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  nal(sqlite3_cont
ce20: 65 78 74 20 2a 63 74 78 29 7b 0a 20 20 4a 73 6f  ext *ctx){.  Jso
ce30: 6e 53 74 72 69 6e 67 20 2a 70 53 74 72 3b 0a 20  nString *pStr;. 
ce40: 20 70 53 74 72 20 3d 20 28 4a 73 6f 6e 53 74 72   pStr = (JsonStr
ce50: 69 6e 67 2a 29 73 71 6c 69 74 65 33 5f 61 67 67  ing*)sqlite3_agg
ce60: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63  regate_context(c
ce70: 74 78 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53  tx, 0);.  if( pS
ce80: 74 72 20 29 7b 0a 20 20 20 20 6a 73 6f 6e 41 70  tr ){.    jsonAp
ce90: 70 65 6e 64 43 68 61 72 28 70 53 74 72 2c 20 27  pendChar(pStr, '
cea0: 7d 27 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74  }');.    if( pSt
ceb0: 72 2d 3e 62 45 72 72 20 29 7b 0a 20 20 20 20 20  r->bErr ){.     
cec0: 20 69 66 28 20 70 53 74 72 2d 3e 62 45 72 72 3d   if( pStr->bErr=
ced0: 3d 31 20 29 20 73 71 6c 69 74 65 33 5f 72 65 73  =1 ) sqlite3_res
cee0: 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28  ult_error_nomem(
cef0: 63 74 78 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ctx);.      asse
cf00: 72 74 28 20 70 53 74 72 2d 3e 62 53 74 61 74 69  rt( pStr->bStati
cf10: 63 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  c );.    }else{.
cf20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
cf30: 73 75 6c 74 5f 74 65 78 74 28 63 74 78 2c 20 70  sult_text(ctx, p
cf40: 53 74 72 2d 3e 7a 42 75 66 2c 20 70 53 74 72 2d  Str->zBuf, pStr-
cf50: 3e 6e 55 73 65 64 2c 0a 20 20 20 20 20 20 20 20  >nUsed,.        
cf60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf70: 20 20 70 53 74 72 2d 3e 62 53 74 61 74 69 63 20    pStr->bStatic 
cf80: 3f 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  ? SQLITE_TRANSIE
cf90: 4e 54 20 3a 20 73 71 6c 69 74 65 33 5f 66 72 65  NT : sqlite3_fre
cfa0: 65 29 3b 0a 20 20 20 20 20 20 70 53 74 72 2d 3e  e);.      pStr->
cfb0: 62 53 74 61 74 69 63 20 3d 20 31 3b 0a 20 20 20  bStatic = 1;.   
cfc0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
cfd0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
cfe0: 65 78 74 28 63 74 78 2c 20 22 7b 7d 22 2c 20 32  ext(ctx, "{}", 2
cff0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
d000: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
d010: 72 65 73 75 6c 74 5f 73 75 62 74 79 70 65 28 63  result_subtype(c
d020: 74 78 2c 20 4a 53 4f 4e 5f 53 55 42 54 59 50 45  tx, JSON_SUBTYPE
d030: 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53  );.}...#ifndef S
d040: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
d050: 41 4c 54 41 42 4c 45 0a 2f 2a 2a 2a 2a 2a 2a 2a  ALTABLE./*******
d060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d0a0: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 73 6f  *****.** The jso
d0b0: 6e 5f 65 61 63 68 20 76 69 72 74 75 61 6c 20 74  n_each virtual t
d0c0: 61 62 6c 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  able.***********
d0d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d0e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d0f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d110: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
d120: 74 20 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72  t JsonEachCursor
d130: 20 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 3b   JsonEachCursor;
d140: 0a 73 74 72 75 63 74 20 4a 73 6f 6e 45 61 63 68  .struct JsonEach
d150: 43 75 72 73 6f 72 20 7b 0a 20 20 73 71 6c 69 74  Cursor {.  sqlit
d160: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 62  e3_vtab_cursor b
d170: 61 73 65 3b 20 20 2f 2a 20 42 61 73 65 20 63 6c  ase;  /* Base cl
d180: 61 73 73 20 2d 20 6d 75 73 74 20 62 65 20 66 69  ass - must be fi
d190: 72 73 74 20 2a 2f 0a 20 20 75 33 32 20 69 52 6f  rst */.  u32 iRo
d1a0: 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  wid;            
d1b0: 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 69 64      /* The rowid
d1c0: 20 2a 2f 0a 20 20 75 33 32 20 69 42 65 67 69 6e   */.  u32 iBegin
d1d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d1e0: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 6e 6f   /* The first no
d1f0: 64 65 20 6f 66 20 74 68 65 20 73 63 61 6e 20 2a  de of the scan *
d200: 2f 0a 20 20 75 33 32 20 69 3b 20 20 20 20 20 20  /.  u32 i;      
d210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d220: 2a 20 49 6e 64 65 78 20 69 6e 20 73 50 61 72 73  * Index in sPars
d230: 65 2e 61 4e 6f 64 65 5b 5d 20 6f 66 20 63 75 72  e.aNode[] of cur
d240: 72 65 6e 74 20 72 6f 77 20 2a 2f 0a 20 20 75 33  rent row */.  u3
d250: 32 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20  2 iEnd;         
d260: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 4f 46 20           /* EOF 
d270: 77 68 65 6e 20 69 20 65 71 75 61 6c 73 20 6f 72  when i equals or
d280: 20 65 78 63 65 65 64 73 20 74 68 69 73 20 76 61   exceeds this va
d290: 6c 75 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70  lue */.  u8 eTyp
d2a0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
d2b0: 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74      /* Type of t
d2c0: 6f 70 2d 6c 65 76 65 6c 20 65 6c 65 6d 65 6e 74  op-level element
d2d0: 20 2a 2f 0a 20 20 75 38 20 62 52 65 63 75 72 73   */.  u8 bRecurs
d2e0: 69 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ive;            
d2f0: 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 6a 73 6f   /* True for jso
d300: 6e 5f 74 72 65 65 28 29 2e 20 20 46 61 6c 73 65  n_tree().  False
d310: 20 66 6f 72 20 6a 73 6f 6e 5f 65 61 63 68 28 29   for json_each()
d320: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 73 6f   */.  char *zJso
d330: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
d340: 20 2f 2a 20 49 6e 70 75 74 20 4a 53 4f 4e 20 2a   /* Input JSON *
d350: 2f 0a 20 20 63 68 61 72 20 2a 7a 52 6f 6f 74 3b  /.  char *zRoot;
d360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d370: 2a 20 50 61 74 68 20 62 79 20 77 68 69 63 68 20  * Path by which 
d380: 74 6f 20 66 69 6c 74 65 72 20 7a 4a 73 6f 6e 20  to filter zJson 
d390: 2a 2f 0a 20 20 4a 73 6f 6e 50 61 72 73 65 20 73  */.  JsonParse s
d3a0: 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20  Parse;          
d3b0: 2f 2a 20 50 61 72 73 65 20 6f 66 20 74 68 65 20  /* Parse of the 
d3c0: 69 6e 70 75 74 20 4a 53 4f 4e 20 2a 2f 0a 7d 3b  input JSON */.};
d3d0: 0a 0a 2f 2a 20 43 6f 6e 73 74 72 75 63 74 6f 72  ../* Constructor
d3e0: 20 66 6f 72 20 74 68 65 20 6a 73 6f 6e 5f 65 61   for the json_ea
d3f0: 63 68 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ch virtual table
d400: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a   */.static int j
d410: 73 6f 6e 45 61 63 68 43 6f 6e 6e 65 63 74 28 0a  sonEachConnect(.
d420: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
d430: 20 76 6f 69 64 20 2a 70 41 75 78 2c 0a 20 20 69   void *pAux,.  i
d440: 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73 74 20 63  nt argc, const c
d450: 68 61 72 20 2a 63 6f 6e 73 74 2a 61 72 67 76 2c  har *const*argv,
d460: 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  .  sqlite3_vtab 
d470: 2a 2a 70 70 56 74 61 62 2c 0a 20 20 63 68 61 72  **ppVtab,.  char
d480: 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 73 71   **pzErr.){.  sq
d490: 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 4e 65 77  lite3_vtab *pNew
d4a0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 2f 2a 20  ;.  int rc;../* 
d4b0: 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 73 20 2a  Column numbers *
d4c0: 2f 0a 23 64 65 66 69 6e 65 20 4a 45 41 43 48 5f  /.#define JEACH_
d4d0: 4b 45 59 20 20 20 20 20 30 0a 23 64 65 66 69 6e  KEY     0.#defin
d4e0: 65 20 4a 45 41 43 48 5f 56 41 4c 55 45 20 20 20  e JEACH_VALUE   
d4f0: 31 0a 23 64 65 66 69 6e 65 20 4a 45 41 43 48 5f  1.#define JEACH_
d500: 54 59 50 45 20 20 20 20 32 0a 23 64 65 66 69 6e  TYPE    2.#defin
d510: 65 20 4a 45 41 43 48 5f 41 54 4f 4d 20 20 20 20  e JEACH_ATOM    
d520: 33 0a 23 64 65 66 69 6e 65 20 4a 45 41 43 48 5f  3.#define JEACH_
d530: 49 44 20 20 20 20 20 20 34 0a 23 64 65 66 69 6e  ID      4.#defin
d540: 65 20 4a 45 41 43 48 5f 50 41 52 45 4e 54 20 20  e JEACH_PARENT  
d550: 35 0a 23 64 65 66 69 6e 65 20 4a 45 41 43 48 5f  5.#define JEACH_
d560: 46 55 4c 4c 4b 45 59 20 36 0a 23 64 65 66 69 6e  FULLKEY 6.#defin
d570: 65 20 4a 45 41 43 48 5f 50 41 54 48 20 20 20 20  e JEACH_PATH    
d580: 37 0a 23 64 65 66 69 6e 65 20 4a 45 41 43 48 5f  7.#define JEACH_
d590: 4a 53 4f 4e 20 20 20 20 38 0a 23 64 65 66 69 6e  JSON    8.#defin
d5a0: 65 20 4a 45 41 43 48 5f 52 4f 4f 54 20 20 20 20  e JEACH_ROOT    
d5b0: 39 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  9..  UNUSED_PARA
d5c0: 4d 28 70 7a 45 72 72 29 3b 0a 20 20 55 4e 55 53  M(pzErr);.  UNUS
d5d0: 45 44 5f 50 41 52 41 4d 28 61 72 67 76 29 3b 0a  ED_PARAM(argv);.
d5e0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 61    UNUSED_PARAM(a
d5f0: 72 67 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  rgc);.  UNUSED_P
d600: 41 52 41 4d 28 70 41 75 78 29 3b 0a 20 20 72 63  ARAM(pAux);.  rc
d610: 20 3d 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61   = sqlite3_decla
d620: 72 65 5f 76 74 61 62 28 64 62 2c 20 0a 20 20 20  re_vtab(db, .   
d630: 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
d640: 78 28 6b 65 79 2c 76 61 6c 75 65 2c 74 79 70 65  x(key,value,type
d650: 2c 61 74 6f 6d 2c 69 64 2c 70 61 72 65 6e 74 2c  ,atom,id,parent,
d660: 66 75 6c 6c 6b 65 79 2c 70 61 74 68 2c 22 0a 20  fullkey,path,". 
d670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d680: 20 20 20 22 6a 73 6f 6e 20 48 49 44 44 45 4e 2c     "json HIDDEN,
d690: 72 6f 6f 74 20 48 49 44 44 45 4e 29 22 29 3b 0a  root HIDDEN)");.
d6a0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
d6b0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 4e 65 77 20  _OK ){.    pNew 
d6c0: 3d 20 2a 70 70 56 74 61 62 20 3d 20 73 71 6c 69  = *ppVtab = sqli
d6d0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  te3_malloc( size
d6e0: 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 20  of(*pNew) );.   
d6f0: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
d700: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
d710: 45 4d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  EM;.    memset(p
d720: 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  New, 0, sizeof(*
d730: 70 4e 65 77 29 29 3b 0a 20 20 7d 0a 20 20 72 65  pNew));.  }.  re
d740: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 64  turn rc;.}../* d
d750: 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 6a 73  estructor for js
d760: 6f 6e 5f 65 61 63 68 20 76 69 72 74 75 61 6c 20  on_each virtual 
d770: 74 61 62 6c 65 20 2a 2f 0a 73 74 61 74 69 63 20  table */.static 
d780: 69 6e 74 20 6a 73 6f 6e 45 61 63 68 44 69 73 63  int jsonEachDisc
d790: 6f 6e 6e 65 63 74 28 73 71 6c 69 74 65 33 5f 76  onnect(sqlite3_v
d7a0: 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 73  tab *pVtab){.  s
d7b0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74 61  qlite3_free(pVta
d7c0: 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  b);.  return SQL
d7d0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 63 6f  ITE_OK;.}../* co
d7e0: 6e 73 74 72 75 63 74 6f 72 20 66 6f 72 20 61 20  nstructor for a 
d7f0: 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 20 6f  JsonEachCursor o
d800: 62 6a 65 63 74 20 66 6f 72 20 6a 73 6f 6e 5f 65  bject for json_e
d810: 61 63 68 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63  ach(). */.static
d820: 20 69 6e 74 20 6a 73 6f 6e 45 61 63 68 4f 70 65   int jsonEachOpe
d830: 6e 45 61 63 68 28 73 71 6c 69 74 65 33 5f 76 74  nEach(sqlite3_vt
d840: 61 62 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76  ab *p, sqlite3_v
d850: 74 61 62 5f 63 75 72 73 6f 72 20 2a 2a 70 70 43  tab_cursor **ppC
d860: 75 72 73 6f 72 29 7b 0a 20 20 4a 73 6f 6e 45 61  ursor){.  JsonEa
d870: 63 68 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  chCursor *pCur;.
d880: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28  .  UNUSED_PARAM(
d890: 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 73 71 6c  p);.  pCur = sql
d8a0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
d8b0: 65 6f 66 28 2a 70 43 75 72 29 20 29 3b 0a 20 20  eof(*pCur) );.  
d8c0: 69 66 28 20 70 43 75 72 3d 3d 30 20 29 20 72 65  if( pCur==0 ) re
d8d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
d8e0: 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 75 72  M;.  memset(pCur
d8f0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43 75  , 0, sizeof(*pCu
d900: 72 29 29 3b 0a 20 20 2a 70 70 43 75 72 73 6f 72  r));.  *ppCursor
d910: 20 3d 20 26 70 43 75 72 2d 3e 62 61 73 65 3b 0a   = &pCur->base;.
d920: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d930: 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 63 6f 6e 73 74 72  OK;.}../* constr
d940: 75 63 74 6f 72 20 66 6f 72 20 61 20 4a 73 6f 6e  uctor for a Json
d950: 45 61 63 68 43 75 72 73 6f 72 20 6f 62 6a 65 63  EachCursor objec
d960: 74 20 66 6f 72 20 6a 73 6f 6e 5f 74 72 65 65 28  t for json_tree(
d970: 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ). */.static int
d980: 20 6a 73 6f 6e 45 61 63 68 4f 70 65 6e 54 72 65   jsonEachOpenTre
d990: 65 28 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a  e(sqlite3_vtab *
d9a0: 70 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f  p, sqlite3_vtab_
d9b0: 63 75 72 73 6f 72 20 2a 2a 70 70 43 75 72 73 6f  cursor **ppCurso
d9c0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 6a  r){.  int rc = j
d9d0: 73 6f 6e 45 61 63 68 4f 70 65 6e 45 61 63 68 28  sonEachOpenEach(
d9e0: 70 2c 20 70 70 43 75 72 73 6f 72 29 3b 0a 20 20  p, ppCursor);.  
d9f0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
da00: 4b 20 29 7b 0a 20 20 20 20 4a 73 6f 6e 45 61 63  K ){.    JsonEac
da10: 68 43 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20  hCursor *pCur = 
da20: 28 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 2a  (JsonEachCursor*
da30: 29 2a 70 70 43 75 72 73 6f 72 3b 0a 20 20 20 20  )*ppCursor;.    
da40: 70 43 75 72 2d 3e 62 52 65 63 75 72 73 69 76 65  pCur->bRecursive
da50: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
da60: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 52 65 73  rn rc;.}../* Res
da70: 65 74 20 61 20 4a 73 6f 6e 45 61 63 68 43 75 72  et a JsonEachCur
da80: 73 6f 72 20 62 61 63 6b 20 74 6f 20 69 74 73 20  sor back to its 
da90: 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 2e 20  original state. 
daa0: 20 46 72 65 65 20 61 6e 79 20 6d 65 6d 6f 72 79   Free any memory
dab0: 0a 2a 2a 20 68 65 6c 64 2e 20 2a 2f 0a 73 74 61  .** held. */.sta
dac0: 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 45 61 63  tic void jsonEac
dad0: 68 43 75 72 73 6f 72 52 65 73 65 74 28 4a 73 6f  hCursorReset(Jso
dae0: 6e 45 61 63 68 43 75 72 73 6f 72 20 2a 70 29 7b  nEachCursor *p){
daf0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
db00: 70 2d 3e 7a 4a 73 6f 6e 29 3b 0a 20 20 73 71 6c  p->zJson);.  sql
db10: 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 52 6f  ite3_free(p->zRo
db20: 6f 74 29 3b 0a 20 20 6a 73 6f 6e 50 61 72 73 65  ot);.  jsonParse
db30: 52 65 73 65 74 28 26 70 2d 3e 73 50 61 72 73 65  Reset(&p->sParse
db40: 29 3b 0a 20 20 70 2d 3e 69 52 6f 77 69 64 20 3d  );.  p->iRowid =
db50: 20 30 3b 0a 20 20 70 2d 3e 69 20 3d 20 30 3b 0a   0;.  p->i = 0;.
db60: 20 20 70 2d 3e 69 45 6e 64 20 3d 20 30 3b 0a 20    p->iEnd = 0;. 
db70: 20 70 2d 3e 65 54 79 70 65 20 3d 20 30 3b 0a 20   p->eType = 0;. 
db80: 20 70 2d 3e 7a 4a 73 6f 6e 20 3d 20 30 3b 0a 20   p->zJson = 0;. 
db90: 20 70 2d 3e 7a 52 6f 6f 74 20 3d 20 30 3b 0a 7d   p->zRoot = 0;.}
dba0: 0a 0a 2f 2a 20 44 65 73 74 72 75 63 74 6f 72 20  ../* Destructor 
dbb0: 66 6f 72 20 61 20 6a 73 6f 6e 45 61 63 68 43 75  for a jsonEachCu
dbc0: 72 73 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 73  rsor object */.s
dbd0: 74 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e 45 61  tatic int jsonEa
dbe0: 63 68 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  chClose(sqlite3_
dbf0: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72  vtab_cursor *cur
dc00: 29 7b 0a 20 20 4a 73 6f 6e 45 61 63 68 43 75 72  ){.  JsonEachCur
dc10: 73 6f 72 20 2a 70 20 3d 20 28 4a 73 6f 6e 45 61  sor *p = (JsonEa
dc20: 63 68 43 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20  chCursor*)cur;. 
dc30: 20 6a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 52   jsonEachCursorR
dc40: 65 73 65 74 28 70 29 3b 0a 20 20 73 71 6c 69 74  eset(p);.  sqlit
dc50: 65 33 5f 66 72 65 65 28 63 75 72 29 3b 0a 20 20  e3_free(cur);.  
dc60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
dc70: 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 54  ;.}../* Return T
dc80: 52 55 45 20 69 66 20 74 68 65 20 6a 73 6f 6e 45  RUE if the jsonE
dc90: 61 63 68 43 75 72 73 6f 72 20 6f 62 6a 65 63 74  achCursor object
dca0: 20 68 61 73 20 62 65 65 6e 20 61 64 76 61 6e 63   has been advanc
dcb0: 65 64 20 6f 66 66 20 74 68 65 20 65 6e 64 0a 2a  ed off the end.*
dcc0: 2a 20 6f 66 20 74 68 65 20 4a 53 4f 4e 20 6f 62  * of the JSON ob
dcd0: 6a 65 63 74 20 2a 2f 0a 73 74 61 74 69 63 20 69  ject */.static i
dce0: 6e 74 20 6a 73 6f 6e 45 61 63 68 45 6f 66 28 73  nt jsonEachEof(s
dcf0: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
dd00: 6f 72 20 2a 63 75 72 29 7b 0a 20 20 4a 73 6f 6e  or *cur){.  Json
dd10: 45 61 63 68 43 75 72 73 6f 72 20 2a 70 20 3d 20  EachCursor *p = 
dd20: 28 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 2a  (JsonEachCursor*
dd30: 29 63 75 72 3b 0a 20 20 72 65 74 75 72 6e 20 70  )cur;.  return p
dd40: 2d 3e 69 20 3e 3d 20 70 2d 3e 69 45 6e 64 3b 0a  ->i >= p->iEnd;.
dd50: 7d 0a 0a 2f 2a 20 41 64 76 61 6e 63 65 20 74 68  }../* Advance th
dd60: 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
dd70: 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 66 6f 72  next element for
dd80: 20 6a 73 6f 6e 5f 74 72 65 65 28 29 20 2a 2f 0a   json_tree() */.
dd90: 73 74 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e 45  static int jsonE
dda0: 61 63 68 4e 65 78 74 28 73 71 6c 69 74 65 33 5f  achNext(sqlite3_
ddb0: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72  vtab_cursor *cur
ddc0: 29 7b 0a 20 20 4a 73 6f 6e 45 61 63 68 43 75 72  ){.  JsonEachCur
ddd0: 73 6f 72 20 2a 70 20 3d 20 28 4a 73 6f 6e 45 61  sor *p = (JsonEa
dde0: 63 68 43 75 72 73 6f 72 2a 29 63 75 72 3b 0a 20  chCursor*)cur;. 
ddf0: 20 69 66 28 20 70 2d 3e 62 52 65 63 75 72 73 69   if( p->bRecursi
de00: 76 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  ve ){.    if( p-
de10: 3e 73 50 61 72 73 65 2e 61 4e 6f 64 65 5b 70 2d  >sParse.aNode[p-
de20: 3e 69 5d 2e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e  >i].jnFlags & JN
de30: 4f 44 45 5f 4c 41 42 45 4c 20 29 20 70 2d 3e 69  ODE_LABEL ) p->i
de40: 2b 2b 3b 0a 20 20 20 20 70 2d 3e 69 2b 2b 3b 0a  ++;.    p->i++;.
de50: 20 20 20 20 70 2d 3e 69 52 6f 77 69 64 2b 2b 3b      p->iRowid++;
de60: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 3c 70 2d  .    if( p->i<p-
de70: 3e 69 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 75  >iEnd ){.      u
de80: 33 32 20 69 55 70 20 3d 20 70 2d 3e 73 50 61 72  32 iUp = p->sPar
de90: 73 65 2e 61 55 70 5b 70 2d 3e 69 5d 3b 0a 20 20  se.aUp[p->i];.  
dea0: 20 20 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 55      JsonNode *pU
deb0: 70 20 3d 20 26 70 2d 3e 73 50 61 72 73 65 2e 61  p = &p->sParse.a
dec0: 4e 6f 64 65 5b 69 55 70 5d 3b 0a 20 20 20 20 20  Node[iUp];.     
ded0: 20 70 2d 3e 65 54 79 70 65 20 3d 20 70 55 70 2d   p->eType = pUp-
dee0: 3e 65 54 79 70 65 3b 0a 20 20 20 20 20 20 69 66  >eType;.      if
def0: 28 20 70 55 70 2d 3e 65 54 79 70 65 3d 3d 4a 53  ( pUp->eType==JS
df00: 4f 4e 5f 41 52 52 41 59 20 29 7b 0a 20 20 20 20  ON_ARRAY ){.    
df10: 20 20 20 20 69 66 28 20 69 55 70 3d 3d 70 2d 3e      if( iUp==p->
df20: 69 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  i-1 ){.         
df30: 20 70 55 70 2d 3e 75 2e 69 4b 65 79 20 3d 20 30   pUp->u.iKey = 0
df40: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
df50: 0a 20 20 20 20 20 20 20 20 20 20 70 55 70 2d 3e  .          pUp->
df60: 75 2e 69 4b 65 79 2b 2b 3b 0a 20 20 20 20 20 20  u.iKey++;.      
df70: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
df80: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  }.  }else{.    s
df90: 77 69 74 63 68 28 20 70 2d 3e 65 54 79 70 65 20  witch( p->eType 
dfa0: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4a 53  ){.      case JS
dfb0: 4f 4e 5f 41 52 52 41 59 3a 20 7b 0a 20 20 20 20  ON_ARRAY: {.    
dfc0: 20 20 20 20 70 2d 3e 69 20 2b 3d 20 6a 73 6f 6e      p->i += json
dfd0: 4e 6f 64 65 53 69 7a 65 28 26 70 2d 3e 73 50 61  NodeSize(&p->sPa
dfe0: 72 73 65 2e 61 4e 6f 64 65 5b 70 2d 3e 69 5d 29  rse.aNode[p->i])
dff0: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 52 6f  ;.        p->iRo
e000: 77 69 64 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62  wid++;.        b
e010: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
e020: 20 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f 4f 42      case JSON_OB
e030: 4a 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 20 20  JECT: {.        
e040: 70 2d 3e 69 20 2b 3d 20 31 20 2b 20 6a 73 6f 6e  p->i += 1 + json
e050: 4e 6f 64 65 53 69 7a 65 28 26 70 2d 3e 73 50 61  NodeSize(&p->sPa
e060: 72 73 65 2e 61 4e 6f 64 65 5b 70 2d 3e 69 2b 31  rse.aNode[p->i+1
e070: 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 69  ]);.        p->i
e080: 52 6f 77 69 64 2b 2b 3b 0a 20 20 20 20 20 20 20  Rowid++;.       
e090: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
e0a0: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b        default: {
e0b0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 20 3d 20  .        p->i = 
e0c0: 70 2d 3e 69 45 6e 64 3b 0a 20 20 20 20 20 20 20  p->iEnd;.       
e0d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
e0e0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
e0f0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
e100: 0a 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 6e  ./* Append the n
e110: 61 6d 65 20 6f 66 20 74 68 65 20 70 61 74 68 20  ame of the path 
e120: 66 6f 72 20 65 6c 65 6d 65 6e 74 20 69 20 74 6f  for element i to
e130: 20 70 53 74 72 0a 2a 2f 0a 73 74 61 74 69 63 20   pStr.*/.static 
e140: 76 6f 69 64 20 6a 73 6f 6e 45 61 63 68 43 6f 6d  void jsonEachCom
e150: 70 75 74 65 50 61 74 68 28 0a 20 20 4a 73 6f 6e  putePath(.  Json
e160: 45 61 63 68 43 75 72 73 6f 72 20 2a 70 2c 20 20  EachCursor *p,  
e170: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
e180: 6f 72 20 2a 2f 0a 20 20 4a 73 6f 6e 53 74 72 69  or */.  JsonStri
e190: 6e 67 20 2a 70 53 74 72 2c 20 20 20 20 20 20 20  ng *pStr,       
e1a0: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61   /* Write the pa
e1b0: 74 68 20 68 65 72 65 20 2a 2f 0a 20 20 75 33 32  th here */.  u32
e1c0: 20 69 20 20 20 20 20 20 20 20 20 20 20 20 20 20   i              
e1d0: 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20 74 6f        /* Path to
e1e0: 20 74 68 69 73 20 65 6c 65 6d 65 6e 74 20 2a 2f   this element */
e1f0: 0a 29 7b 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a  .){.  JsonNode *
e200: 70 4e 6f 64 65 2c 20 2a 70 55 70 3b 0a 20 20 75  pNode, *pUp;.  u
e210: 33 32 20 69 55 70 3b 0a 20 20 69 66 28 20 69 3d  32 iUp;.  if( i=
e220: 3d 30 20 29 7b 0a 20 20 20 20 6a 73 6f 6e 41 70  =0 ){.    jsonAp
e230: 70 65 6e 64 43 68 61 72 28 70 53 74 72 2c 20 27  pendChar(pStr, '
e240: 24 27 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  $');.    return;
e250: 0a 20 20 7d 0a 20 20 69 55 70 20 3d 20 70 2d 3e  .  }.  iUp = p->
e260: 73 50 61 72 73 65 2e 61 55 70 5b 69 5d 3b 0a 20  sParse.aUp[i];. 
e270: 20 6a 73 6f 6e 45 61 63 68 43 6f 6d 70 75 74 65   jsonEachCompute
e280: 50 61 74 68 28 70 2c 20 70 53 74 72 2c 20 69 55  Path(p, pStr, iU
e290: 70 29 3b 0a 20 20 70 4e 6f 64 65 20 3d 20 26 70  p);.  pNode = &p
e2a0: 2d 3e 73 50 61 72 73 65 2e 61 4e 6f 64 65 5b 69  ->sParse.aNode[i
e2b0: 5d 3b 0a 20 20 70 55 70 20 3d 20 26 70 2d 3e 73  ];.  pUp = &p->s
e2c0: 50 61 72 73 65 2e 61 4e 6f 64 65 5b 69 55 70 5d  Parse.aNode[iUp]
e2d0: 3b 0a 20 20 69 66 28 20 70 55 70 2d 3e 65 54 79  ;.  if( pUp->eTy
e2e0: 70 65 3d 3d 4a 53 4f 4e 5f 41 52 52 41 59 20 29  pe==JSON_ARRAY )
e2f0: 7b 0a 20 20 20 20 6a 73 6f 6e 50 72 69 6e 74 66  {.    jsonPrintf
e300: 28 33 30 2c 20 70 53 74 72 2c 20 22 5b 25 64 5d  (30, pStr, "[%d]
e310: 22 2c 20 70 55 70 2d 3e 75 2e 69 4b 65 79 29 3b  ", pUp->u.iKey);
e320: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
e330: 73 65 72 74 28 20 70 55 70 2d 3e 65 54 79 70 65  sert( pUp->eType
e340: 3d 3d 4a 53 4f 4e 5f 4f 42 4a 45 43 54 20 29 3b  ==JSON_OBJECT );
e350: 0a 20 20 20 20 69 66 28 20 28 70 4e 6f 64 65 2d  .    if( (pNode-
e360: 3e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45  >jnFlags & JNODE
e370: 5f 4c 41 42 45 4c 29 3d 3d 30 20 29 20 70 4e 6f  _LABEL)==0 ) pNo
e380: 64 65 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74  de--;.    assert
e390: 28 20 70 4e 6f 64 65 2d 3e 65 54 79 70 65 3d 3d  ( pNode->eType==
e3a0: 4a 53 4f 4e 5f 53 54 52 49 4e 47 20 29 3b 0a 20  JSON_STRING );. 
e3b0: 20 20 20 61 73 73 65 72 74 28 20 70 4e 6f 64 65     assert( pNode
e3c0: 2d 3e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44  ->jnFlags & JNOD
e3d0: 45 5f 4c 41 42 45 4c 20 29 3b 0a 20 20 20 20 6a  E_LABEL );.    j
e3e0: 73 6f 6e 50 72 69 6e 74 66 28 70 4e 6f 64 65 2d  sonPrintf(pNode-
e3f0: 3e 6e 2b 31 2c 20 70 53 74 72 2c 20 22 2e 25 2e  >n+1, pStr, ".%.
e400: 2a 73 22 2c 20 70 4e 6f 64 65 2d 3e 6e 2d 32 2c  *s", pNode->n-2,
e410: 20 70 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74   pNode->u.zJCont
e420: 65 6e 74 2b 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ent+1);.  }.}../
e430: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
e440: 75 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 2a  ue of a column *
e450: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 73 6f  /.static int jso
e460: 6e 45 61 63 68 43 6f 6c 75 6d 6e 28 0a 20 20 73  nEachColumn(.  s
e470: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
e480: 6f 72 20 2a 63 75 72 2c 20 20 20 2f 2a 20 54 68  or *cur,   /* Th
e490: 65 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 73 71  e cursor */.  sq
e4a0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
e4b0: 74 78 2c 20 20 20 20 20 20 20 2f 2a 20 46 69 72  tx,       /* Fir
e4c0: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73  st argument to s
e4d0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 2e 2e  qlite3_result_..
e4e0: 2e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 69 20 20  .() */.  int i  
e4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e500: 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 63 6f       /* Which co
e510: 6c 75 6d 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a  lumn to return *
e520: 2f 0a 29 7b 0a 20 20 4a 73 6f 6e 45 61 63 68 43  /.){.  JsonEachC
e530: 75 72 73 6f 72 20 2a 70 20 3d 20 28 4a 73 6f 6e  ursor *p = (Json
e540: 45 61 63 68 43 75 72 73 6f 72 2a 29 63 75 72 3b  EachCursor*)cur;
e550: 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 54 68  .  JsonNode *pTh
e560: 69 73 20 3d 20 26 70 2d 3e 73 50 61 72 73 65 2e  is = &p->sParse.
e570: 61 4e 6f 64 65 5b 70 2d 3e 69 5d 3b 0a 20 20 73  aNode[p->i];.  s
e580: 77 69 74 63 68 28 20 69 20 29 7b 0a 20 20 20 20  witch( i ){.    
e590: 63 61 73 65 20 4a 45 41 43 48 5f 4b 45 59 3a 20  case JEACH_KEY: 
e5a0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69  {.      if( p->i
e5b0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
e5c0: 20 20 20 69 66 28 20 70 2d 3e 65 54 79 70 65 3d     if( p->eType=
e5d0: 3d 4a 53 4f 4e 5f 4f 42 4a 45 43 54 20 29 7b 0a  =JSON_OBJECT ){.
e5e0: 20 20 20 20 20 20 20 20 6a 73 6f 6e 52 65 74 75          jsonRetu
e5f0: 72 6e 28 70 54 68 69 73 2c 20 63 74 78 2c 20 30  rn(pThis, ctx, 0
e600: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
e610: 66 28 20 70 2d 3e 65 54 79 70 65 3d 3d 4a 53 4f  f( p->eType==JSO
e620: 4e 5f 41 52 52 41 59 20 29 7b 0a 20 20 20 20 20  N_ARRAY ){.     
e630: 20 20 20 75 33 32 20 69 4b 65 79 3b 0a 20 20 20     u32 iKey;.   
e640: 20 20 20 20 20 69 66 28 20 70 2d 3e 62 52 65 63       if( p->bRec
e650: 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  ursive ){.      
e660: 20 20 20 20 69 66 28 20 70 2d 3e 69 52 6f 77 69      if( p->iRowi
e670: 64 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  d==0 ) break;.  
e680: 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 70          iKey = p
e690: 2d 3e 73 50 61 72 73 65 2e 61 4e 6f 64 65 5b 70  ->sParse.aNode[p
e6a0: 2d 3e 73 50 61 72 73 65 2e 61 55 70 5b 70 2d 3e  ->sParse.aUp[p->
e6b0: 69 5d 5d 2e 75 2e 69 4b 65 79 3b 0a 20 20 20 20  i]].u.iKey;.    
e6c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e6d0: 20 20 20 20 20 69 4b 65 79 20 3d 20 70 2d 3e 69       iKey = p->i
e6e0: 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 7d  Rowid;.        }
e6f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e700: 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 74  _result_int64(ct
e710: 78 2c 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  x, (sqlite3_int6
e720: 34 29 69 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d  4)iKey);.      }
e730: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
e740: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 45 41    }.    case JEA
e750: 43 48 5f 56 41 4c 55 45 3a 20 7b 0a 20 20 20 20  CH_VALUE: {.    
e760: 20 20 69 66 28 20 70 54 68 69 73 2d 3e 6a 6e 46    if( pThis->jnF
e770: 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f 4c 41 42  lags & JNODE_LAB
e780: 45 4c 20 29 20 70 54 68 69 73 2b 2b 3b 0a 20 20  EL ) pThis++;.  
e790: 20 20 20 20 6a 73 6f 6e 52 65 74 75 72 6e 28 70      jsonReturn(p
e7a0: 54 68 69 73 2c 20 63 74 78 2c 20 30 29 3b 0a 20  This, ctx, 0);. 
e7b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e7c0: 7d 0a 20 20 20 20 63 61 73 65 20 4a 45 41 43 48  }.    case JEACH
e7d0: 5f 54 59 50 45 3a 20 7b 0a 20 20 20 20 20 20 69  _TYPE: {.      i
e7e0: 66 28 20 70 54 68 69 73 2d 3e 6a 6e 46 6c 61 67  f( pThis->jnFlag
e7f0: 73 20 26 20 4a 4e 4f 44 45 5f 4c 41 42 45 4c 20  s & JNODE_LABEL 
e800: 29 20 70 54 68 69 73 2b 2b 3b 0a 20 20 20 20 20  ) pThis++;.     
e810: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
e820: 74 65 78 74 28 63 74 78 2c 20 6a 73 6f 6e 54 79  text(ctx, jsonTy
e830: 70 65 5b 70 54 68 69 73 2d 3e 65 54 79 70 65 5d  pe[pThis->eType]
e840: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41  , -1, SQLITE_STA
e850: 54 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65 61  TIC);.      brea
e860: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
e870: 65 20 4a 45 41 43 48 5f 41 54 4f 4d 3a 20 7b 0a  e JEACH_ATOM: {.
e880: 20 20 20 20 20 20 69 66 28 20 70 54 68 69 73 2d        if( pThis-
e890: 3e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45  >jnFlags & JNODE
e8a0: 5f 4c 41 42 45 4c 20 29 20 70 54 68 69 73 2b 2b  _LABEL ) pThis++
e8b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 68 69  ;.      if( pThi
e8c0: 73 2d 3e 65 54 79 70 65 3e 3d 4a 53 4f 4e 5f 41  s->eType>=JSON_A
e8d0: 52 52 41 59 20 29 20 62 72 65 61 6b 3b 0a 20 20  RRAY ) break;.  
e8e0: 20 20 20 20 6a 73 6f 6e 52 65 74 75 72 6e 28 70      jsonReturn(p
e8f0: 54 68 69 73 2c 20 63 74 78 2c 20 30 29 3b 0a 20  This, ctx, 0);. 
e900: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e910: 7d 0a 20 20 20 20 63 61 73 65 20 4a 45 41 43 48  }.    case JEACH
e920: 5f 49 44 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  _ID: {.      sql
e930: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
e940: 34 28 63 74 78 2c 20 0a 20 20 20 20 20 20 20 20  4(ctx, .        
e950: 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
e960: 70 2d 3e 69 20 2b 20 28 28 70 54 68 69 73 2d 3e  p->i + ((pThis->
e970: 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f  jnFlags & JNODE_
e980: 4c 41 42 45 4c 29 21 3d 30 29 29 3b 0a 20 20 20  LABEL)!=0));.   
e990: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
e9a0: 20 20 20 20 63 61 73 65 20 4a 45 41 43 48 5f 50      case JEACH_P
e9b0: 41 52 45 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69  ARENT: {.      i
e9c0: 66 28 20 70 2d 3e 69 3e 70 2d 3e 69 42 65 67 69  f( p->i>p->iBegi
e9d0: 6e 20 26 26 20 70 2d 3e 62 52 65 63 75 72 73 69  n && p->bRecursi
e9e0: 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ve ){.        sq
e9f0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
ea00: 36 34 28 63 74 78 2c 20 28 73 71 6c 69 74 65 33  64(ctx, (sqlite3
ea10: 5f 69 6e 74 36 34 29 70 2d 3e 73 50 61 72 73 65  _int64)p->sParse
ea20: 2e 61 55 70 5b 70 2d 3e 69 5d 29 3b 0a 20 20 20  .aUp[p->i]);.   
ea30: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
ea40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
ea50: 20 4a 45 41 43 48 5f 46 55 4c 4c 4b 45 59 3a 20   JEACH_FULLKEY: 
ea60: 7b 0a 20 20 20 20 20 20 4a 73 6f 6e 53 74 72 69  {.      JsonStri
ea70: 6e 67 20 78 3b 0a 20 20 20 20 20 20 6a 73 6f 6e  ng x;.      json
ea80: 49 6e 69 74 28 26 78 2c 20 63 74 78 29 3b 0a 20  Init(&x, ctx);. 
ea90: 20 20 20 20 20 69 66 28 20 70 2d 3e 62 52 65 63       if( p->bRec
eaa0: 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  ursive ){.      
eab0: 20 20 6a 73 6f 6e 45 61 63 68 43 6f 6d 70 75 74    jsonEachComput
eac0: 65 50 61 74 68 28 70 2c 20 26 78 2c 20 70 2d 3e  ePath(p, &x, p->
ead0: 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  i);.      }else{
eae0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
eaf0: 7a 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20 20  zRoot ){.       
eb00: 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 52 61 77     jsonAppendRaw
eb10: 28 26 78 2c 20 70 2d 3e 7a 52 6f 6f 74 2c 20 28  (&x, p->zRoot, (
eb20: 69 6e 74 29 73 74 72 6c 65 6e 28 70 2d 3e 7a 52  int)strlen(p->zR
eb30: 6f 6f 74 29 29 3b 0a 20 20 20 20 20 20 20 20 7d  oot));.        }
eb40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
eb50: 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61 72 28 26  jsonAppendChar(&
eb60: 78 2c 20 27 24 27 29 3b 0a 20 20 20 20 20 20 20  x, '$');.       
eb70: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
eb80: 2d 3e 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f 41 52  ->eType==JSON_AR
eb90: 52 41 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20  RAY ){.         
eba0: 20 6a 73 6f 6e 50 72 69 6e 74 66 28 33 30 2c 20   jsonPrintf(30, 
ebb0: 26 78 2c 20 22 5b 25 64 5d 22 2c 20 70 2d 3e 69  &x, "[%d]", p->i
ebc0: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
ebd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
ebe0: 20 6a 73 6f 6e 50 72 69 6e 74 66 28 70 54 68 69   jsonPrintf(pThi
ebf0: 73 2d 3e 6e 2c 20 26 78 2c 20 22 2e 25 2e 2a 73  s->n, &x, ".%.*s
ec00: 22 2c 20 70 54 68 69 73 2d 3e 6e 2d 32 2c 20 70  ", pThis->n-2, p
ec10: 54 68 69 73 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e  This->u.zJConten
ec20: 74 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  t+1);.        }.
ec30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6a 73        }.      js
ec40: 6f 6e 52 65 73 75 6c 74 28 26 78 29 3b 0a 20 20  onResult(&x);.  
ec50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
ec60: 0a 20 20 20 20 63 61 73 65 20 4a 45 41 43 48 5f  .    case JEACH_
ec70: 50 41 54 48 3a 20 7b 0a 20 20 20 20 20 20 69 66  PATH: {.      if
ec80: 28 20 70 2d 3e 62 52 65 63 75 72 73 69 76 65 20  ( p->bRecursive 
ec90: 29 7b 0a 20 20 20 20 20 20 20 20 4a 73 6f 6e 53  ){.        JsonS
eca0: 74 72 69 6e 67 20 78 3b 0a 20 20 20 20 20 20 20  tring x;.       
ecb0: 20 6a 73 6f 6e 49 6e 69 74 28 26 78 2c 20 63 74   jsonInit(&x, ct
ecc0: 78 29 3b 0a 20 20 20 20 20 20 20 20 6a 73 6f 6e  x);.        json
ecd0: 45 61 63 68 43 6f 6d 70 75 74 65 50 61 74 68 28  EachComputePath(
ece0: 70 2c 20 26 78 2c 20 70 2d 3e 73 50 61 72 73 65  p, &x, p->sParse
ecf0: 2e 61 55 70 5b 70 2d 3e 69 5d 29 3b 0a 20 20 20  .aUp[p->i]);.   
ed00: 20 20 20 20 20 6a 73 6f 6e 52 65 73 75 6c 74 28       jsonResult(
ed10: 26 78 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  &x);.        bre
ed20: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
ed30: 20 20 2f 2a 20 46 6f 72 20 6a 73 6f 6e 5f 65 61    /* For json_ea
ed40: 63 68 28 29 20 70 61 74 68 20 61 6e 64 20 72 6f  ch() path and ro
ed50: 6f 74 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  ot are the same 
ed60: 73 6f 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 0a  so fall through.
ed70: 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68        ** into th
ed80: 65 20 72 6f 6f 74 20 63 61 73 65 20 2a 2f 0a 20  e root case */. 
ed90: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
eda0: 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  : {.      const 
edb0: 63 68 61 72 20 2a 7a 52 6f 6f 74 20 3d 20 70 2d  char *zRoot = p-
edc0: 3e 7a 52 6f 6f 74 3b 0a 20 20 20 20 20 20 69 66  >zRoot;.      if
edd0: 28 20 7a 52 6f 6f 74 3d 3d 30 20 29 20 7a 52 6f  ( zRoot==0 ) zRo
ede0: 6f 74 20 3d 20 22 24 22 3b 0a 20 20 20 20 20 20  ot = "$";.      
edf0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
ee00: 65 78 74 28 63 74 78 2c 20 7a 52 6f 6f 74 2c 20  ext(ctx, zRoot, 
ee10: 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  -1, SQLITE_STATI
ee20: 43 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  C);.      break;
ee30: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
ee40: 4a 45 41 43 48 5f 4a 53 4f 4e 3a 20 7b 0a 20 20  JEACH_JSON: {.  
ee50: 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 4a      assert( i==J
ee60: 45 41 43 48 5f 4a 53 4f 4e 20 29 3b 0a 20 20 20  EACH_JSON );.   
ee70: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
ee80: 74 5f 74 65 78 74 28 63 74 78 2c 20 70 2d 3e 73  t_text(ctx, p->s
ee90: 50 61 72 73 65 2e 7a 4a 73 6f 6e 2c 20 2d 31 2c  Parse.zJson, -1,
eea0: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
eeb0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
eec0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
eed0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
eee0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
eef0: 72 65 6e 74 20 72 6f 77 69 64 20 76 61 6c 75 65  rent rowid value
ef00: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a   */.static int j
ef10: 73 6f 6e 45 61 63 68 52 6f 77 69 64 28 73 71 6c  sonEachRowid(sql
ef20: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
ef30: 20 2a 63 75 72 2c 20 73 71 6c 69 74 65 5f 69 6e   *cur, sqlite_in
ef40: 74 36 34 20 2a 70 52 6f 77 69 64 29 7b 0a 20 20  t64 *pRowid){.  
ef50: 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 20 2a  JsonEachCursor *
ef60: 70 20 3d 20 28 4a 73 6f 6e 45 61 63 68 43 75 72  p = (JsonEachCur
ef70: 73 6f 72 2a 29 63 75 72 3b 0a 20 20 2a 70 52 6f  sor*)cur;.  *pRo
ef80: 77 69 64 20 3d 20 70 2d 3e 69 52 6f 77 69 64 3b  wid = p->iRowid;
ef90: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
efa0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 71  _OK;.}../* The q
efb0: 75 65 72 79 20 73 74 72 61 74 65 67 79 20 69 73  uery strategy is
efc0: 20 74 6f 20 6c 6f 6f 6b 20 66 6f 72 20 61 6e 20   to look for an 
efd0: 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
efe0: 69 6e 74 20 6f 6e 20 74 68 65 20 6a 73 6f 6e 0a  int on the json.
eff0: 2a 2a 20 63 6f 6c 75 6d 6e 2e 20 20 57 69 74 68  ** column.  With
f000: 6f 75 74 20 73 75 63 68 20 61 20 63 6f 6e 73 74  out such a const
f010: 72 61 69 6e 74 2c 20 74 68 65 20 74 61 62 6c 65  raint, the table
f020: 20 63 61 6e 6e 6f 74 20 6f 70 65 72 61 74 65 2e   cannot operate.
f030: 20 20 69 64 78 4e 75 6d 20 69 73 0a 2a 2a 20 31    idxNum is.** 1
f040: 20 69 66 20 74 68 65 20 63 6f 6e 73 74 72 61 69   if the constrai
f050: 6e 74 20 69 73 20 66 6f 75 6e 64 2c 20 33 20 69  nt is found, 3 i
f060: 66 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  f the constraint
f070: 20 61 6e 64 20 7a 52 6f 6f 74 20 61 72 65 20 66   and zRoot are f
f080: 6f 75 6e 64 2c 0a 2a 2a 20 61 6e 64 20 30 20 6f  ound,.** and 0 o
f090: 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
f0a0: 74 69 63 20 69 6e 74 20 6a 73 6f 6e 45 61 63 68  tic int jsonEach
f0b0: 42 65 73 74 49 6e 64 65 78 28 0a 20 20 73 71 6c  BestIndex(.  sql
f0c0: 69 74 65 33 5f 76 74 61 62 20 2a 74 61 62 2c 0a  ite3_vtab *tab,.
f0d0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
f0e0: 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 0a 29  info *pIdxInfo.)
f0f0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
f100: 20 6a 73 6f 6e 49 64 78 20 3d 20 2d 31 3b 0a 20   jsonIdx = -1;. 
f110: 20 69 6e 74 20 72 6f 6f 74 49 64 78 20 3d 20 2d   int rootIdx = -
f120: 31 3b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63  1;.  const struc
f130: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
f140: 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 43 6f 6e  constraint *pCon
f150: 73 74 72 61 69 6e 74 3b 0a 0a 20 20 55 4e 55 53  straint;..  UNUS
f160: 45 44 5f 50 41 52 41 4d 28 74 61 62 29 3b 0a 20  ED_PARAM(tab);. 
f170: 20 70 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70   pConstraint = p
f180: 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
f190: 61 69 6e 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  aint;.  for(i=0;
f1a0: 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f   i<pIdxInfo->nCo
f1b0: 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70  nstraint; i++, p
f1c0: 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 29 7b 0a 20  Constraint++){. 
f1d0: 20 20 20 69 66 28 20 70 43 6f 6e 73 74 72 61 69     if( pConstrai
f1e0: 6e 74 2d 3e 75 73 61 62 6c 65 3d 3d 30 20 29 20  nt->usable==0 ) 
f1f0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
f200: 28 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f  ( pConstraint->o
f210: 70 21 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  p!=SQLITE_INDEX_
f220: 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 29 20  CONSTRAINT_EQ ) 
f230: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73 77  continue;.    sw
f240: 69 74 63 68 28 20 70 43 6f 6e 73 74 72 61 69 6e  itch( pConstrain
f250: 74 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  t->iColumn ){.  
f260: 20 20 20 20 63 61 73 65 20 4a 45 41 43 48 5f 4a      case JEACH_J
f270: 53 4f 4e 3a 20 20 20 6a 73 6f 6e 49 64 78 20 3d  SON:   jsonIdx =
f280: 20 69 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   i;    break;.  
f290: 20 20 20 20 63 61 73 65 20 4a 45 41 43 48 5f 52      case JEACH_R
f2a0: 4f 4f 54 3a 20 20 20 72 6f 6f 74 49 64 78 20 3d  OOT:   rootIdx =
f2b0: 20 69 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   i;    break;.  
f2c0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20      default:    
f2d0: 20 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20         /* no-op 
f2e0: 2a 2f 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  */     break;.  
f2f0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6a 73    }.  }.  if( js
f300: 6f 6e 49 64 78 3c 30 20 29 7b 0a 20 20 20 20 70  onIdx<0 ){.    p
f310: 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20  IdxInfo->idxNum 
f320: 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  = 0;.    pIdxInf
f330: 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
f340: 20 3d 20 31 65 39 39 3b 0a 20 20 7d 65 6c 73 65   = 1e99;.  }else
f350: 7b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e  {.    pIdxInfo->
f360: 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20  estimatedCost = 
f370: 31 2e 30 3b 0a 20 20 20 20 70 49 64 78 49 6e 66  1.0;.    pIdxInf
f380: 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
f390: 61 67 65 5b 6a 73 6f 6e 49 64 78 5d 2e 61 72 67  age[jsonIdx].arg
f3a0: 76 49 6e 64 65 78 20 3d 20 31 3b 0a 20 20 20 20  vIndex = 1;.    
f3b0: 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
f3c0: 72 61 69 6e 74 55 73 61 67 65 5b 6a 73 6f 6e 49  raintUsage[jsonI
f3d0: 64 78 5d 2e 6f 6d 69 74 20 3d 20 31 3b 0a 20 20  dx].omit = 1;.  
f3e0: 20 20 69 66 28 20 72 6f 6f 74 49 64 78 3c 30 20    if( rootIdx<0 
f3f0: 29 7b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66  ){.      pIdxInf
f400: 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 31 3b 0a 20  o->idxNum = 1;. 
f410: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f420: 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
f430: 72 61 69 6e 74 55 73 61 67 65 5b 72 6f 6f 74 49  raintUsage[rootI
f440: 64 78 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20  dx].argvIndex = 
f450: 32 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66  2;.      pIdxInf
f460: 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
f470: 61 67 65 5b 72 6f 6f 74 49 64 78 5d 2e 6f 6d 69  age[rootIdx].omi
f480: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 64  t = 1;.      pId
f490: 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20  xInfo->idxNum = 
f4a0: 33 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  3;.    }.  }.  r
f4b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
f4c0: 0a 7d 0a 0a 2f 2a 20 53 74 61 72 74 20 61 20 73  .}../* Start a s
f4d0: 65 61 72 63 68 20 6f 6e 20 61 20 6e 65 77 20 4a  earch on a new J
f4e0: 53 4f 4e 20 73 74 72 69 6e 67 20 2a 2f 0a 73 74  SON string */.st
f4f0: 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e 45 61 63  atic int jsonEac
f500: 68 46 69 6c 74 65 72 28 0a 20 20 73 71 6c 69 74  hFilter(.  sqlit
f510: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
f520: 63 75 72 2c 0a 20 20 69 6e 74 20 69 64 78 4e 75  cur,.  int idxNu
f530: 6d 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 69  m, const char *i
f540: 64 78 53 74 72 2c 0a 20 20 69 6e 74 20 61 72 67  dxStr,.  int arg
f550: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
f560: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 4a 73 6f   **argv.){.  Jso
f570: 6e 45 61 63 68 43 75 72 73 6f 72 20 2a 70 20 3d  nEachCursor *p =
f580: 20 28 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72   (JsonEachCursor
f590: 2a 29 63 75 72 3b 0a 20 20 63 6f 6e 73 74 20 63  *)cur;.  const c
f5a0: 68 61 72 20 2a 7a 3b 0a 20 20 63 6f 6e 73 74 20  har *z;.  const 
f5b0: 63 68 61 72 20 2a 7a 52 6f 6f 74 20 3d 20 30 3b  char *zRoot = 0;
f5c0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
f5d0: 20 6e 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41   n;..  UNUSED_PA
f5e0: 52 41 4d 28 69 64 78 53 74 72 29 3b 0a 20 20 55  RAM(idxStr);.  U
f5f0: 4e 55 53 45 44 5f 50 41 52 41 4d 28 61 72 67 63  NUSED_PARAM(argc
f600: 29 3b 0a 20 20 6a 73 6f 6e 45 61 63 68 43 75 72  );.  jsonEachCur
f610: 73 6f 72 52 65 73 65 74 28 70 29 3b 0a 20 20 69  sorReset(p);.  i
f620: 66 28 20 69 64 78 4e 75 6d 3d 3d 30 20 29 20 72  f( idxNum==0 ) r
f630: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
f640: 0a 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68  .  z = (const ch
f650: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
f660: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
f670: 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65  .  if( z==0 ) re
f680: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
f690: 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    n = sqlite3_va
f6a0: 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30  lue_bytes(argv[0
f6b0: 5d 29 3b 0a 20 20 70 2d 3e 7a 4a 73 6f 6e 20 3d  ]);.  p->zJson =
f6c0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
f6d0: 34 28 20 6e 2b 31 20 29 3b 0a 20 20 69 66 28 20  4( n+1 );.  if( 
f6e0: 70 2d 3e 7a 4a 73 6f 6e 3d 3d 30 20 29 20 72 65  p->zJson==0 ) re
f6f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
f700: 4d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e 7a  M;.  memcpy(p->z
f710: 4a 73 6f 6e 2c 20 7a 2c 20 28 73 69 7a 65 5f 74  Json, z, (size_t
f720: 29 6e 2b 31 29 3b 0a 20 20 69 66 28 20 6a 73 6f  )n+1);.  if( jso
f730: 6e 50 61 72 73 65 28 26 70 2d 3e 73 50 61 72 73  nParse(&p->sPars
f740: 65 2c 20 30 2c 20 70 2d 3e 7a 4a 73 6f 6e 29 20  e, 0, p->zJson) 
f750: 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  ){.    int rc = 
f760: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
f770: 20 20 69 66 28 20 70 2d 3e 73 50 61 72 73 65 2e    if( p->sParse.
f780: 6f 6f 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  oom==0 ){.      
f790: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 63 75 72  sqlite3_free(cur
f7a0: 2d 3e 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67  ->pVtab->zErrMsg
f7b0: 29 3b 0a 20 20 20 20 20 20 63 75 72 2d 3e 70 56  );.      cur->pV
f7c0: 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73  tab->zErrMsg = s
f7d0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
f7e0: 6d 61 6c 66 6f 72 6d 65 64 20 4a 53 4f 4e 22 29  malformed JSON")
f7f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 63 75 72 2d  ;.      if( cur-
f800: 3e 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20  >pVtab->zErrMsg 
f810: 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  ) rc = SQLITE_ER
f820: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a  ROR;.    }.    j
f830: 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 52 65 73  sonEachCursorRes
f840: 65 74 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72  et(p);.    retur
f850: 6e 20 72 63 3b 0a 20 20 7d 65 6c 73 65 20 69 66  n rc;.  }else if
f860: 28 20 70 2d 3e 62 52 65 63 75 72 73 69 76 65 20  ( p->bRecursive 
f870: 26 26 20 6a 73 6f 6e 50 61 72 73 65 46 69 6e 64  && jsonParseFind
f880: 50 61 72 65 6e 74 73 28 26 70 2d 3e 73 50 61 72  Parents(&p->sPar
f890: 73 65 29 20 29 7b 0a 20 20 20 20 6a 73 6f 6e 45  se) ){.    jsonE
f8a0: 61 63 68 43 75 72 73 6f 72 52 65 73 65 74 28 70  achCursorReset(p
f8b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
f8c0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65  LITE_NOMEM;.  }e
f8d0: 6c 73 65 7b 0a 20 20 20 20 4a 73 6f 6e 4e 6f 64  lse{.    JsonNod
f8e0: 65 20 2a 70 4e 6f 64 65 20 3d 20 30 3b 0a 20 20  e *pNode = 0;.  
f8f0: 20 20 69 66 28 20 69 64 78 4e 75 6d 3d 3d 33 20    if( idxNum==3 
f900: 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
f910: 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20  har *zErr = 0;. 
f920: 20 20 20 20 20 7a 52 6f 6f 74 20 3d 20 28 63 6f       zRoot = (co
f930: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
f940: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
f950: 76 5b 31 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  v[1]);.      if(
f960: 20 7a 52 6f 6f 74 3d 3d 30 20 29 20 72 65 74 75   zRoot==0 ) retu
f970: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
f980: 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f      n = sqlite3_
f990: 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76  value_bytes(argv
f9a0: 5b 31 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 7a  [1]);.      p->z
f9b0: 52 6f 6f 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Root = sqlite3_m
f9c0: 61 6c 6c 6f 63 36 34 28 20 6e 2b 31 20 29 3b 0a  alloc64( n+1 );.
f9d0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 7a 52 6f        if( p->zRo
f9e0: 6f 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ot==0 ) return S
f9f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
fa00: 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 7a 52 6f     memcpy(p->zRo
fa10: 6f 74 2c 20 7a 52 6f 6f 74 2c 20 28 73 69 7a 65  ot, zRoot, (size
fa20: 5f 74 29 6e 2b 31 29 3b 0a 20 20 20 20 20 20 69  _t)n+1);.      i
fa30: 66 28 20 7a 52 6f 6f 74 5b 30 5d 21 3d 27 24 27  f( zRoot[0]!='$'
fa40: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 72 72   ){.        zErr
fa50: 20 3d 20 7a 52 6f 6f 74 3b 0a 20 20 20 20 20 20   = zRoot;.      
fa60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
fa70: 4e 6f 64 65 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75  Node = jsonLooku
fa80: 70 53 74 65 70 28 26 70 2d 3e 73 50 61 72 73 65  pStep(&p->sParse
fa90: 2c 20 30 2c 20 70 2d 3e 7a 52 6f 6f 74 2b 31 2c  , 0, p->zRoot+1,
faa0: 20 30 2c 20 26 7a 45 72 72 29 3b 0a 20 20 20 20   0, &zErr);.    
fab0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 45    }.      if( zE
fac0: 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rr ){.        sq
fad0: 6c 69 74 65 33 5f 66 72 65 65 28 63 75 72 2d 3e  lite3_free(cur->
fae0: 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b  pVtab->zErrMsg);
faf0: 0a 20 20 20 20 20 20 20 20 63 75 72 2d 3e 70 56  .        cur->pV
fb00: 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 6a  tab->zErrMsg = j
fb10: 73 6f 6e 50 61 74 68 53 79 6e 74 61 78 45 72 72  sonPathSyntaxErr
fb20: 6f 72 28 7a 45 72 72 29 3b 0a 20 20 20 20 20 20  or(zErr);.      
fb30: 20 20 6a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72    jsonEachCursor
fb40: 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20 20 20  Reset(p);.      
fb50: 20 20 72 65 74 75 72 6e 20 63 75 72 2d 3e 70 56    return cur->pV
fb60: 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3f 20 53  tab->zErrMsg ? S
fb70: 51 4c 49 54 45 5f 45 52 52 4f 52 20 3a 20 53 51  QLITE_ERROR : SQ
fb80: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
fb90: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4e 6f 64    }else if( pNod
fba0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
fbb0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
fbc0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
fbd0: 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 6f 64 65  lse{.      pNode
fbe0: 20 3d 20 70 2d 3e 73 50 61 72 73 65 2e 61 4e 6f   = p->sParse.aNo
fbf0: 64 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  de;.    }.    p-
fc00: 3e 69 42 65 67 69 6e 20 3d 20 70 2d 3e 69 20 3d  >iBegin = p->i =
fc10: 20 28 69 6e 74 29 28 70 4e 6f 64 65 20 2d 20 70   (int)(pNode - p
fc20: 2d 3e 73 50 61 72 73 65 2e 61 4e 6f 64 65 29 3b  ->sParse.aNode);
fc30: 0a 20 20 20 20 70 2d 3e 65 54 79 70 65 20 3d 20  .    p->eType = 
fc40: 70 4e 6f 64 65 2d 3e 65 54 79 70 65 3b 0a 20 20  pNode->eType;.  
fc50: 20 20 69 66 28 20 70 2d 3e 65 54 79 70 65 3e 3d    if( p->eType>=
fc60: 4a 53 4f 4e 5f 41 52 52 41 59 20 29 7b 0a 20 20  JSON_ARRAY ){.  
fc70: 20 20 20 20 70 4e 6f 64 65 2d 3e 75 2e 69 4b 65      pNode->u.iKe
fc80: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  y = 0;.      p->
fc90: 69 45 6e 64 20 3d 20 70 2d 3e 69 20 2b 20 70 4e  iEnd = p->i + pN
fca0: 6f 64 65 2d 3e 6e 20 2b 20 31 3b 0a 20 20 20 20  ode->n + 1;.    
fcb0: 20 20 69 66 28 20 70 2d 3e 62 52 65 63 75 72 73    if( p->bRecurs
fcc0: 69 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ive ){.        p
fcd0: 2d 3e 65 54 79 70 65 20 3d 20 70 2d 3e 73 50 61  ->eType = p->sPa
fce0: 72 73 65 2e 61 4e 6f 64 65 5b 70 2d 3e 73 50 61  rse.aNode[p->sPa
fcf0: 72 73 65 2e 61 55 70 5b 70 2d 3e 69 5d 5d 2e 65  rse.aUp[p->i]].e
fd00: 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Type;.        if
fd10: 28 20 70 2d 3e 69 3e 30 20 26 26 20 28 70 2d 3e  ( p->i>0 && (p->
fd20: 73 50 61 72 73 65 2e 61 4e 6f 64 65 5b 70 2d 3e  sParse.aNode[p->
fd30: 69 2d 31 5d 2e 6a 6e 46 6c 61 67 73 20 26 20 4a  i-1].jnFlags & J
fd40: 4e 4f 44 45 5f 4c 41 42 45 4c 29 21 3d 30 20 29  NODE_LABEL)!=0 )
fd50: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69  {.          p->i
fd60: 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  --;.        }.  
fd70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
fd80: 20 20 20 70 2d 3e 69 2b 2b 3b 0a 20 20 20 20 20     p->i++;.     
fd90: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
fda0: 20 20 20 20 70 2d 3e 69 45 6e 64 20 3d 20 70 2d      p->iEnd = p-
fdb0: 3e 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  >i+1;.    }.  }.
fdc0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fdd0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 6d 65  OK;.}../* The me
fde0: 74 68 6f 64 73 20 6f 66 20 74 68 65 20 6a 73 6f  thods of the jso
fdf0: 6e 5f 65 61 63 68 20 76 69 72 74 75 61 6c 20 74  n_each virtual t
fe00: 61 62 6c 65 20 2a 2f 0a 73 74 61 74 69 63 20 73  able */.static s
fe10: 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 6a 73  qlite3_module js
fe20: 6f 6e 45 61 63 68 4d 6f 64 75 6c 65 20 3d 20 7b  onEachModule = {
fe30: 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
fe40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fe50: 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 30   iVersion */.  0
fe60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
fe70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 72            /* xCr
fe80: 65 61 74 65 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61  eate */.  jsonEa
fe90: 63 68 43 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20  chConnect,      
fea0: 20 20 20 20 20 2f 2a 20 78 43 6f 6e 6e 65 63 74       /* xConnect
feb0: 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 42 65   */.  jsonEachBe
fec0: 73 74 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20  stIndex,        
fed0: 20 2f 2a 20 78 42 65 73 74 49 6e 64 65 78 20 2a   /* xBestIndex *
fee0: 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 44 69 73 63  /.  jsonEachDisc
fef0: 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20 2f  onnect,        /
ff00: 2a 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 2a 2f  * xDisconnect */
ff10: 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
ff20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ff30: 20 78 44 65 73 74 72 6f 79 20 2a 2f 0a 20 20 6a   xDestroy */.  j
ff40: 73 6f 6e 45 61 63 68 4f 70 65 6e 45 61 63 68 2c  sonEachOpenEach,
ff50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70            /* xOp
ff60: 65 6e 20 2d 20 6f 70 65 6e 20 61 20 63 75 72 73  en - open a curs
ff70: 6f 72 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68  or */.  jsonEach
ff80: 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
ff90: 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2d 20 63     /* xClose - c
ffa0: 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 20 2a 2f  lose a cursor */
ffb0: 0a 20 20 6a 73 6f 6e 45 61 63 68 46 69 6c 74 65  .  jsonEachFilte
ffc0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
ffd0: 20 78 46 69 6c 74 65 72 20 2d 20 63 6f 6e 66 69   xFilter - confi
ffe0: 67 75 72 65 20 73 63 61 6e 20 63 6f 6e 73 74 72  gure scan constr
fff0: 61 69 6e 74 73 20 2a 2f 0a 20 20 6a 73 6f 6e 45  aints */.  jsonE
10000 61 63 68 4e 65 78 74 2c 20 20 20 20 20 20 20 20  achNext,        
10010 20 20 20 20 20 20 2f 2a 20 78 4e 65 78 74 20 2d        /* xNext -
10020 20 61 64 76 61 6e 63 65 20 61 20 63 75 72 73 6f   advance a curso
10030 72 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 45  r */.  jsonEachE
10040 6f 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  of,             
10050 20 20 2f 2a 20 78 45 6f 66 20 2d 20 63 68 65 63    /* xEof - chec
10060 6b 20 66 6f 72 20 65 6e 64 20 6f 66 20 73 63 61  k for end of sca
10070 6e 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 43  n */.  jsonEachC
10080 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20  olumn,          
10090 20 20 2f 2a 20 78 43 6f 6c 75 6d 6e 20 2d 20 72    /* xColumn - r
100a0 65 61 64 20 64 61 74 61 20 2a 2f 0a 20 20 6a 73  ead data */.  js
100b0 6f 6e 45 61 63 68 52 6f 77 69 64 2c 20 20 20 20  onEachRowid,    
100c0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 77           /* xRow
100d0 69 64 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a  id - read data *
100e0 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
100f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10100 2a 20 78 55 70 64 61 74 65 20 2a 2f 0a 20 20 30  * xUpdate */.  0
10110 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10120 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 42 65            /* xBe
10130 67 69 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  gin */.  0,     
10140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10150 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a      /* xSync */.
10160 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
10170 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10180 78 43 6f 6d 6d 69 74 20 2a 2f 0a 20 20 30 2c 20  xCommit */.  0, 
10190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101a0 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 6c 6c          /* xRoll
101b0 62 61 63 6b 20 2a 2f 0a 20 20 30 2c 20 20 20 20  back */.  0,    
101c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101d0 20 20 20 20 20 2f 2a 20 78 46 69 6e 64 4d 65 74       /* xFindMet
101e0 68 6f 64 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  hod */.  0,     
101f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10200 20 20 20 20 2f 2a 20 78 52 65 6e 61 6d 65 20 2a      /* xRename *
10210 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
10220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10230 2a 20 78 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  * xSavepoint */.
10240 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
10250 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10260 78 52 65 6c 65 61 73 65 20 2a 2f 0a 20 20 30 20  xRelease */.  0 
10270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10280 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 6c           /* xRol
10290 6c 62 61 63 6b 54 6f 20 2a 2f 0a 7d 3b 0a 0a 2f  lbackTo */.};../
102a0 2a 20 54 68 65 20 6d 65 74 68 6f 64 73 20 6f 66  * The methods of
102b0 20 74 68 65 20 6a 73 6f 6e 5f 74 72 65 65 20 76   the json_tree v
102c0 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20 2a 2f  irtual table. */
102d0 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f  .static sqlite3_
102e0 6d 6f 64 75 6c 65 20 6a 73 6f 6e 54 72 65 65 4d  module jsonTreeM
102f0 6f 64 75 6c 65 20 3d 20 7b 0a 20 20 30 2c 20 20  odule = {.  0,  
10300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10310 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
10320 6f 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  on */.  0,      
10330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10340 20 20 20 2f 2a 20 78 43 72 65 61 74 65 20 2a 2f     /* xCreate */
10350 0a 20 20 6a 73 6f 6e 45 61 63 68 43 6f 6e 6e 65  .  jsonEachConne
10360 63 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ct,           /*
10370 20 78 43 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 6a   xConnect */.  j
10380 73 6f 6e 45 61 63 68 42 65 73 74 49 6e 64 65 78  sonEachBestIndex
10390 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78 42 65  ,         /* xBe
103a0 73 74 49 6e 64 65 78 20 2a 2f 0a 20 20 6a 73 6f  stIndex */.  jso
103b0 6e 45 61 63 68 44 69 73 63 6f 6e 6e 65 63 74 2c  nEachDisconnect,
103c0 20 20 20 20 20 20 20 20 2f 2a 20 78 44 69 73 63          /* xDisc
103d0 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 30 2c 20 20  onnect */.  0,  
103e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103f0 20 20 20 20 20 20 20 2f 2a 20 78 44 65 73 74 72         /* xDestr
10400 6f 79 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68  oy */.  jsonEach
10410 4f 70 65 6e 54 72 65 65 2c 20 20 20 20 20 20 20  OpenTree,       
10420 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2d 20 6f 70     /* xOpen - op
10430 65 6e 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20  en a cursor */. 
10440 20 6a 73 6f 6e 45 61 63 68 43 6c 6f 73 65 2c 20   jsonEachClose, 
10450 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
10460 43 6c 6f 73 65 20 2d 20 63 6c 6f 73 65 20 61 20  Close - close a 
10470 63 75 72 73 6f 72 20 2a 2f 0a 20 20 6a 73 6f 6e  cursor */.  json
10480 45 61 63 68 46 69 6c 74 65 72 2c 20 20 20 20 20  EachFilter,     
10490 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 74 65         /* xFilte
104a0 72 20 2d 20 63 6f 6e 66 69 67 75 72 65 20 73 63  r - configure sc
104b0 61 6e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  an constraints *
104c0 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 4e 65 78 74  /.  jsonEachNext
104d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
104e0 2a 20 78 4e 65 78 74 20 2d 20 61 64 76 61 6e 63  * xNext - advanc
104f0 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  e a cursor */.  
10500 6a 73 6f 6e 45 61 63 68 45 6f 66 2c 20 20 20 20  jsonEachEof,    
10510 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 45             /* xE
10520 6f 66 20 2d 20 63 68 65 63 6b 20 66 6f 72 20 65  of - check for e
10530 6e 64 20 6f 66 20 73 63 61 6e 20 2a 2f 0a 20 20  nd of scan */.  
10540 6a 73 6f 6e 45 61 63 68 43 6f 6c 75 6d 6e 2c 20  jsonEachColumn, 
10550 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
10560 6f 6c 75 6d 6e 20 2d 20 72 65 61 64 20 64 61 74  olumn - read dat
10570 61 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 52  a */.  jsonEachR
10580 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20 20 20  owid,           
10590 20 20 2f 2a 20 78 52 6f 77 69 64 20 2d 20 72 65    /* xRowid - re
105a0 61 64 20 64 61 74 61 20 2a 2f 0a 20 20 30 2c 20  ad data */.  0, 
105b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105c0 20 20 20 20 20 20 20 20 2f 2a 20 78 55 70 64 61          /* xUpda
105d0 74 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  te */.  0,      
105e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105f0 20 20 20 2f 2a 20 78 42 65 67 69 6e 20 2a 2f 0a     /* xBegin */.
10600 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
10610 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10620 78 53 79 6e 63 20 2a 2f 0a 20 20 30 2c 20 20 20  xSync */.  0,   
10630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10640 20 20 20 20 20 20 2f 2a 20 78 43 6f 6d 6d 69 74        /* xCommit
10650 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20   */.  0,        
10660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10670 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 20 2a 2f   /* xRollback */
10680 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
10690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
106a0 20 78 46 69 6e 64 4d 65 74 68 6f 64 20 2a 2f 0a   xFindMethod */.
106b0 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
106c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
106d0 78 52 65 6e 61 6d 65 20 2a 2f 0a 20 20 30 2c 20  xRename */.  0, 
106e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106f0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 61 76 65          /* xSave
10700 70 6f 69 6e 74 20 2a 2f 0a 20 20 30 2c 20 20 20  point */.  0,   
10710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10720 20 20 20 20 20 20 2f 2a 20 78 52 65 6c 65 61 73        /* xReleas
10730 65 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20  e */.  0        
10740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10750 20 20 2f 2a 20 78 52 6f 6c 6c 62 61 63 6b 54 6f    /* xRollbackTo
10760 20 2a 2f 0a 7d 3b 0a 23 65 6e 64 69 66 20 2f 2a   */.};.#endif /*
10770 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
10780 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a  TUALTABLE */../*
10790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
107a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
107b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
107c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
107d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54  ***********.** T
107e0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
107f0 74 69 6e 65 73 20 61 72 65 20 74 68 65 20 6f 6e  tines are the on
10800 6c 79 20 70 75 62 6c 69 63 61 6c 6c 79 20 76 69  ly publically vi
10810 73 69 62 6c 65 20 69 64 65 6e 74 69 66 69 65 72  sible identifier
10820 73 20 69 6e 20 74 68 69 73 0a 2a 2a 20 66 69 6c  s in this.** fil
10830 65 2e 20 20 43 61 6c 6c 20 74 68 65 20 66 6f 6c  e.  Call the fol
10840 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  lowing routines 
10850 69 6e 20 6f 72 64 65 72 20 74 6f 20 72 65 67 69  in order to regi
10860 73 74 65 72 20 74 68 65 20 76 61 72 69 6f 75 73  ster the various
10870 20 53 51 4c 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e   SQL.** function
10880 73 20 61 6e 64 20 74 68 65 20 76 69 72 74 75 61  s and the virtua
10890 6c 20 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e  l table implemen
108a0 74 65 64 20 62 79 20 74 68 69 73 20 66 69 6c 65  ted by this file
108b0 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**************
108c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
108d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
108e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
108f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
10900 0a 69 6e 74 20 73 71 6c 69 74 65 33 4a 73 6f 6e  .int sqlite3Json
10910 31 49 6e 69 74 28 73 71 6c 69 74 65 33 20 2a 64  1Init(sqlite3 *d
10920 62 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  b){.  int rc = S
10930 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 73 69  QLITE_OK;.  unsi
10940 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 73 74  gned int i;.  st
10950 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
10960 74 20 7b 0a 20 20 20 20 20 63 6f 6e 73 74 20 63  t {.     const c
10970 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20  har *zName;.    
10980 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 20   int nArg;.     
10990 69 6e 74 20 66 6c 61 67 3b 0a 20 20 20 20 20 76  int flag;.     v
109a0 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c  oid (*xFunc)(sql
109b0 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
109c0 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  t,sqlite3_value*
109d0 2a 29 3b 0a 20 20 7d 20 61 46 75 6e 63 5b 5d 20  *);.  } aFunc[] 
109e0 3d 20 7b 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 22  = {.    { "json"
109f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10a00 20 20 31 2c 20 30 2c 20 20 20 6a 73 6f 6e 52 65    1, 0,   jsonRe
10a10 6d 6f 76 65 46 75 6e 63 20 20 20 20 20 20 20 20  moveFunc        
10a20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 61  },.    { "json_a
10a30 72 72 61 79 22 2c 20 20 20 20 20 20 20 20 20 20  rray",          
10a40 2d 31 2c 20 30 2c 20 20 20 6a 73 6f 6e 41 72 72  -1, 0,   jsonArr
10a50 61 79 46 75 6e 63 20 20 20 20 20 20 20 20 20 7d  ayFunc         }
10a60 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 61 72  ,.    { "json_ar
10a70 72 61 79 5f 6c 65 6e 67 74 68 22 2c 20 20 20 20  ray_length",    
10a80 31 2c 20 30 2c 20 20 20 6a 73 6f 6e 41 72 72 61  1, 0,   jsonArra
10a90 79 4c 65 6e 67 74 68 46 75 6e 63 20 20 20 7d 2c  yLengthFunc   },
10aa0 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 61 72 72  .    { "json_arr
10ab0 61 79 5f 6c 65 6e 67 74 68 22 2c 20 20 20 20 32  ay_length",    2
10ac0 2c 20 30 2c 20 20 20 6a 73 6f 6e 41 72 72 61 79  , 0,   jsonArray
10ad0 4c 65 6e 67 74 68 46 75 6e 63 20 20 20 7d 2c 0a  LengthFunc   },.
10ae0 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 65 78 74 72      { "json_extr
10af0 61 63 74 22 2c 20 20 20 20 20 20 20 20 2d 31 2c  act",        -1,
10b00 20 30 2c 20 20 20 6a 73 6f 6e 45 78 74 72 61 63   0,   jsonExtrac
10b10 74 46 75 6e 63 20 20 20 20 20 20 20 7d 2c 0a 20  tFunc       },. 
10b20 20 20 20 7b 20 22 6a 73 6f 6e 5f 69 6e 73 65 72     { "json_inser
10b30 74 22 2c 20 20 20 20 20 20 20 20 20 2d 31 2c 20  t",         -1, 
10b40 30 2c 20 20 20 6a 73 6f 6e 53 65 74 46 75 6e 63  0,   jsonSetFunc
10b50 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
10b60 20 20 7b 20 22 6a 73 6f 6e 5f 6f 62 6a 65 63 74    { "json_object
10b70 22 2c 20 20 20 20 20 20 20 20 20 2d 31 2c 20 30  ",         -1, 0
10b80 2c 20 20 20 6a 73 6f 6e 4f 62 6a 65 63 74 46 75  ,   jsonObjectFu
10b90 6e 63 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  nc        },.   
10ba0 20 7b 20 22 6a 73 6f 6e 5f 70 61 74 63 68 22 2c   { "json_patch",
10bb0 20 20 20 20 20 20 20 20 20 20 20 32 2c 20 30 2c             2, 0,
10bc0 20 20 20 6a 73 6f 6e 50 61 74 63 68 46 75 6e 63     jsonPatchFunc
10bd0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
10be0 7b 20 22 6a 73 6f 6e 5f 71 75 6f 74 65 22 2c 20  { "json_quote", 
10bf0 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20            1, 0, 
10c00 20 20 6a 73 6f 6e 51 75 6f 74 65 46 75 6e 63 20    jsonQuoteFunc 
10c10 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
10c20 20 22 6a 73 6f 6e 5f 72 65 6d 6f 76 65 22 2c 20   "json_remove", 
10c30 20 20 20 20 20 20 20 20 2d 31 2c 20 30 2c 20 20          -1, 0,  
10c40 20 6a 73 6f 6e 52 65 6d 6f 76 65 46 75 6e 63 20   jsonRemoveFunc 
10c50 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
10c60 22 6a 73 6f 6e 5f 72 65 70 6c 61 63 65 22 2c 20  "json_replace", 
10c70 20 20 20 20 20 20 20 2d 31 2c 20 30 2c 20 20 20         -1, 0,   
10c80 6a 73 6f 6e 52 65 70 6c 61 63 65 46 75 6e 63 20  jsonReplaceFunc 
10c90 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
10ca0 6a 73 6f 6e 5f 73 65 74 22 2c 20 20 20 20 20 20  json_set",      
10cb0 20 20 20 20 20 20 2d 31 2c 20 31 2c 20 20 20 6a        -1, 1,   j
10cc0 73 6f 6e 53 65 74 46 75 6e 63 20 20 20 20 20 20  sonSetFunc      
10cd0 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a       },.    { "j
10ce0 73 6f 6e 5f 74 79 70 65 22 2c 20 20 20 20 20 20  son_type",      
10cf0 20 20 20 20 20 20 31 2c 20 30 2c 20 20 20 6a 73        1, 0,   js
10d00 6f 6e 54 79 70 65 46 75 6e 63 20 20 20 20 20 20  onTypeFunc      
10d10 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73      },.    { "js
10d20 6f 6e 5f 74 79 70 65 22 2c 20 20 20 20 20 20 20  on_type",       
10d30 20 20 20 20 20 32 2c 20 30 2c 20 20 20 6a 73 6f       2, 0,   jso
10d40 6e 54 79 70 65 46 75 6e 63 20 20 20 20 20 20 20  nTypeFunc       
10d50 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f     },.    { "jso
10d60 6e 5f 76 61 6c 69 64 22 2c 20 20 20 20 20 20 20  n_valid",       
10d70 20 20 20 20 31 2c 20 30 2c 20 20 20 6a 73 6f 6e      1, 0,   json
10d80 56 61 6c 69 64 46 75 6e 63 20 20 20 20 20 20 20  ValidFunc       
10d90 20 20 7d 2c 0a 0a 23 69 66 20 53 51 4c 49 54 45    },..#if SQLITE
10da0 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 44 45  _DEBUG.    /* DE
10db0 42 55 47 20 61 6e 64 20 54 45 53 54 49 4e 47 20  BUG and TESTING 
10dc0 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20  functions */.   
10dd0 20 7b 20 22 6a 73 6f 6e 5f 70 61 72 73 65 22 2c   { "json_parse",
10de0 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c             1, 0,
10df0 20 20 20 6a 73 6f 6e 50 61 72 73 65 46 75 6e 63     jsonParseFunc
10e00 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
10e10 7b 20 22 6a 73 6f 6e 5f 74 65 73 74 31 22 2c 20  { "json_test1", 
10e20 20 20 20 20 20 20 20 20 20 20 31 2c 20 30 2c 20            1, 0, 
10e30 20 20 6a 73 6f 6e 54 65 73 74 31 46 75 6e 63 20    jsonTest1Func 
10e40 20 20 20 20 20 20 20 20 7d 2c 0a 23 65 6e 64 69          },.#endi
10e50 66 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20  f.  };.  static 
10e60 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20  const struct {. 
10e70 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
10e80 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 69 6e 74 20  zName;.     int 
10e90 6e 41 72 67 3b 0a 20 20 20 20 20 76 6f 69 64 20  nArg;.     void 
10ea0 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33  (*xStep)(sqlite3
10eb0 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
10ec0 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 3b 0a  lite3_value**);.
10ed0 20 20 20 20 20 76 6f 69 64 20 28 2a 78 46 69 6e       void (*xFin
10ee0 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  al)(sqlite3_cont
10ef0 65 78 74 2a 29 3b 0a 20 20 7d 20 61 41 67 67 5b  ext*);.  } aAgg[
10f00 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 6a 73 6f  ] = {.    { "jso
10f10 6e 5f 67 72 6f 75 70 5f 61 72 72 61 79 22 2c 20  n_group_array", 
10f20 20 20 20 20 31 2c 20 20 20 6a 73 6f 6e 41 72 72      1,   jsonArr
10f30 61 79 53 74 65 70 2c 20 20 20 6a 73 6f 6e 41 72  ayStep,   jsonAr
10f40 72 61 79 46 69 6e 61 6c 20 20 7d 2c 0a 20 20 20  rayFinal  },.   
10f50 20 7b 20 22 6a 73 6f 6e 5f 67 72 6f 75 70 5f 6f   { "json_group_o
10f60 62 6a 65 63 74 22 2c 20 20 20 20 32 2c 20 20 20  bject",    2,   
10f70 6a 73 6f 6e 4f 62 6a 65 63 74 53 74 65 70 2c 20  jsonObjectStep, 
10f80 20 6a 73 6f 6e 4f 62 6a 65 63 74 46 69 6e 61 6c   jsonObjectFinal
10f90 20 7d 2c 0a 20 20 7d 3b 0a 23 69 66 6e 64 65 66   },.  };.#ifndef
10fa0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
10fb0 54 55 41 4c 54 41 42 4c 45 0a 20 20 73 74 61 74  TUALTABLE.  stat
10fc0 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
10fd0 7b 0a 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  {.     const cha
10fe0 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 73  r *zName;.     s
10ff0 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70  qlite3_module *p
11000 4d 6f 64 75 6c 65 3b 0a 20 20 7d 20 61 4d 6f 64  Module;.  } aMod
11010 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 6a 73  [] = {.    { "js
11020 6f 6e 5f 65 61 63 68 22 2c 20 20 20 20 20 20 20  on_each",       
11030 20 20 20 20 20 26 6a 73 6f 6e 45 61 63 68 4d 6f       &jsonEachMo
11040 64 75 6c 65 20 20 20 20 20 20 20 20 20 20 20 20  dule            
11050 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f     },.    { "jso
11060 6e 5f 74 72 65 65 22 2c 20 20 20 20 20 20 20 20  n_tree",        
11070 20 20 20 20 26 6a 73 6f 6e 54 72 65 65 4d 6f 64      &jsonTreeMod
11080 75 6c 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ule             
11090 20 20 7d 2c 0a 20 20 7d 3b 0a 23 65 6e 64 69 66    },.  };.#endif
110a0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
110b0 7a 65 6f 66 28 61 46 75 6e 63 29 2f 73 69 7a 65  zeof(aFunc)/size
110c0 6f 66 28 61 46 75 6e 63 5b 30 5d 29 20 26 26 20  of(aFunc[0]) && 
110d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
110e0 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ++){.    rc = sq
110f0 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
11100 63 74 69 6f 6e 28 64 62 2c 20 61 46 75 6e 63 5b  ction(db, aFunc[
11110 69 5d 2e 7a 4e 61 6d 65 2c 20 61 46 75 6e 63 5b  i].zName, aFunc[
11120 69 5d 2e 6e 41 72 67 2c 0a 20 20 20 20 20 20 20  i].nArg,.       
11130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11140 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
11150 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44  _UTF8 | SQLITE_D
11160 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 20 0a 20  ETERMINISTIC, . 
11170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11190 28 76 6f 69 64 2a 29 26 61 46 75 6e 63 5b 69 5d  (void*)&aFunc[i]
111a0 2e 66 6c 61 67 2c 0a 20 20 20 20 20 20 20 20 20  .flag,.         
111b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111c0 20 20 20 20 20 20 20 20 61 46 75 6e 63 5b 69 5d          aFunc[i]
111d0 2e 78 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20  .xFunc, 0, 0);. 
111e0 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
111f0 73 69 7a 65 6f 66 28 61 41 67 67 29 2f 73 69 7a  sizeof(aAgg)/siz
11200 65 6f 66 28 61 41 67 67 5b 30 5d 29 20 26 26 20  eof(aAgg[0]) && 
11210 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
11220 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ++){.    rc = sq
11230 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
11240 63 74 69 6f 6e 28 64 62 2c 20 61 41 67 67 5b 69  ction(db, aAgg[i
11250 5d 2e 7a 4e 61 6d 65 2c 20 61 41 67 67 5b 69 5d  ].zName, aAgg[i]
11260 2e 6e 41 72 67 2c 0a 20 20 20 20 20 20 20 20 20  .nArg,.         
11270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11280 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55          SQLITE_U
11290 54 46 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54  TF8 | SQLITE_DET
112a0 45 52 4d 49 4e 49 53 54 49 43 2c 20 30 2c 0a 20  ERMINISTIC, 0,. 
112b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112d0 30 2c 20 61 41 67 67 5b 69 5d 2e 78 53 74 65 70  0, aAgg[i].xStep
112e0 2c 20 61 41 67 67 5b 69 5d 2e 78 46 69 6e 61 6c  , aAgg[i].xFinal
112f0 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  );.  }.#ifndef S
11300 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
11310 41 4c 54 41 42 4c 45 0a 20 20 66 6f 72 28 69 3d  ALTABLE.  for(i=
11320 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4d 6f 64  0; i<sizeof(aMod
11330 29 2f 73 69 7a 65 6f 66 28 61 4d 6f 64 5b 30 5d  )/sizeof(aMod[0]
11340 29 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ) && rc==SQLITE_
11350 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63  OK; i++){.    rc
11360 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
11370 65 5f 6d 6f 64 75 6c 65 28 64 62 2c 20 61 4d 6f  e_module(db, aMo
11380 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 61 4d 6f 64  d[i].zName, aMod
11390 5b 69 5d 2e 70 4d 6f 64 75 6c 65 2c 20 30 29 3b  [i].pModule, 0);
113a0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
113b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 23 69 66  turn rc;.}...#if
113c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 43 4f 52 45  ndef SQLITE_CORE
113d0 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32 0a 5f  .#ifdef _WIN32._
113e0 5f 64 65 63 6c 73 70 65 63 28 64 6c 6c 65 78 70  _declspec(dllexp
113f0 6f 72 74 29 0a 23 65 6e 64 69 66 0a 69 6e 74 20  ort).#endif.int 
11400 73 71 6c 69 74 65 33 5f 6a 73 6f 6e 5f 69 6e 69  sqlite3_json_ini
11410 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t(.  sqlite3 *db
11420 2c 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72  , .  char **pzEr
11430 72 4d 73 67 2c 20 0a 20 20 63 6f 6e 73 74 20 73  rMsg, .  const s
11440 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69  qlite3_api_routi
11450 6e 65 73 20 2a 70 41 70 69 0a 29 7b 0a 20 20 53  nes *pApi.){.  S
11460 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f  QLITE_EXTENSION_
11470 49 4e 49 54 32 28 70 41 70 69 29 3b 0a 20 20 28  INIT2(pApi);.  (
11480 76 6f 69 64 29 70 7a 45 72 72 4d 73 67 3b 20 20  void)pzErrMsg;  
11490 2f 2a 20 55 6e 75 73 65 64 20 70 61 72 61 6d 65  /* Unused parame
114a0 74 65 72 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ter */.  return 
114b0 73 71 6c 69 74 65 33 4a 73 6f 6e 31 49 6e 69 74  sqlite3Json1Init
114c0 28 64 62 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 23  (db);.}.#endif.#
114d0 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
114e0 64 28 53 51 4c 49 54 45 5f 43 4f 52 45 29 20 7c  d(SQLITE_CORE) |
114f0 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
11500 5f 45 4e 41 42 4c 45 5f 4a 53 4f 4e 31 29 20 2a  _ENABLE_JSON1) *
11510 2f 0a                                            /.