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 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 .#include "sqlit
0380: 65 33 65 78 74 2e 68 22 0a 53 51 4c 49 54 45 5f e3ext.h".SQLITE_
0390: 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54 31 0a EXTENSION_INIT1.
03a0: 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74 #include <assert
03b0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 .h>.#include <st
03c0: 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 ring.h>.#include
03d0: 20 3c 63 74 79 70 65 2e 68 3e 0a 23 69 6e 63 6c <ctype.h>.#incl
03e0: 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 ude <stdlib.h>.#
03f0: 69 6e 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e include <stdarg.
0400: 68 3e 0a 0a 2f 2a 20 55 6e 73 69 67 6e 65 64 20 h>../* Unsigned
0410: 69 6e 74 65 67 65 72 20 74 79 70 65 73 20 2a 2f integer types */
0420: 0a 74 79 70 65 64 65 66 20 73 71 6c 69 74 65 33 .typedef sqlite3
0430: 5f 75 69 6e 74 36 34 20 75 36 34 3b 0a 74 79 70 _uint64 u64;.typ
0440: 65 64 65 66 20 75 6e 73 69 67 6e 65 64 20 69 6e edef unsigned in
0450: 74 20 75 33 32 3b 0a 74 79 70 65 64 65 66 20 75 t u32;.typedef u
0460: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 75 38 3b nsigned char u8;
0470: 0a 0a 2f 2a 20 4f 62 6a 65 63 74 73 20 2a 2f 0a ../* Objects */.
0480: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 4a typedef struct J
0490: 73 6f 6e 53 74 72 69 6e 67 20 4a 73 6f 6e 53 74 sonString JsonSt
04a0: 72 69 6e 67 3b 0a 74 79 70 65 64 65 66 20 73 74 ring;.typedef st
04b0: 72 75 63 74 20 4a 73 6f 6e 4e 6f 64 65 20 4a 73 ruct JsonNode Js
04c0: 6f 6e 4e 6f 64 65 3b 0a 74 79 70 65 64 65 66 20 onNode;.typedef
04d0: 73 74 72 75 63 74 20 4a 73 6f 6e 50 61 72 73 65 struct JsonParse
04e0: 20 4a 73 6f 6e 50 61 72 73 65 3b 0a 0a 2f 2a 20 JsonParse;../*
04f0: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 An instance of t
0500: 68 69 73 20 6f 62 6a 65 63 74 20 72 65 70 72 65 his object repre
0510: 73 65 6e 74 73 20 61 20 4a 53 4f 4e 20 73 74 72 sents a JSON str
0520: 69 6e 67 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e ing.** under con
0530: 73 74 72 75 63 74 69 6f 6e 2e 20 20 52 65 61 6c struction. Real
0540: 6c 79 2c 20 74 68 69 73 20 69 73 20 61 20 67 65 ly, this is a ge
0550: 6e 65 72 69 63 20 73 74 72 69 6e 67 20 61 63 63 neric string acc
0560: 75 6d 75 6c 61 74 6f 72 0a 2a 2a 20 74 68 61 74 umulator.** that
0570: 20 63 61 6e 20 62 65 20 61 6e 64 20 69 73 20 75 can be and is u
0580: 73 65 64 20 74 6f 20 63 72 65 61 74 65 20 73 74 sed to create st
0590: 72 69 6e 67 73 20 6f 74 68 65 72 20 74 68 61 6e rings other than
05a0: 20 4a 53 4f 4e 2e 0a 2a 2f 0a 73 74 72 75 63 74 JSON..*/.struct
05b0: 20 4a 73 6f 6e 53 74 72 69 6e 67 20 7b 0a 20 20 JsonString {.
05c0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 sqlite3_context
05d0: 2a 70 43 74 78 3b 20 20 20 2f 2a 20 46 75 6e 63 *pCtx; /* Func
05e0: 74 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2d 20 70 tion context - p
05f0: 75 74 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 ut error message
0600: 73 20 68 65 72 65 20 2a 2f 0a 20 20 63 68 61 72 s here */. char
0610: 20 2a 7a 42 75 66 3b 20 20 20 20 20 20 20 20 20 *zBuf;
0620: 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 4a /* Append J
0630: 53 4f 4e 20 63 6f 6e 74 65 6e 74 20 68 65 72 65 SON content here
0640: 20 2a 2f 0a 20 20 75 36 34 20 6e 41 6c 6c 6f 63 */. u64 nAlloc
0650: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f ; /
0660: 2a 20 42 79 74 65 73 20 6f 66 20 73 74 6f 72 61 * Bytes of stora
0670: 67 65 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 ge available in
0680: 7a 42 75 66 5b 5d 20 2a 2f 0a 20 20 75 36 34 20 zBuf[] */. u64
0690: 6e 55 73 65 64 3b 20 20 20 20 20 20 20 20 20 20 nUsed;
06a0: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 /* Bytes of
06b0: 20 7a 42 75 66 5b 5d 20 63 75 72 72 65 6e 74 6c zBuf[] currentl
06c0: 79 20 75 73 65 64 20 2a 2f 0a 20 20 75 38 20 62 y used */. u8 b
06d0: 53 74 61 74 69 63 3b 20 20 20 20 20 20 20 20 20 Static;
06e0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 /* True if
06f0: 7a 42 75 66 20 69 73 20 73 74 61 74 69 63 20 73 zBuf is static s
0700: 70 61 63 65 20 2a 2f 0a 20 20 75 38 20 62 45 72 pace */. u8 bEr
0710: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 r;
0720: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e /* True if an
0730: 20 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20 error has been
0740: 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20 encountered */.
0750: 20 63 68 61 72 20 7a 53 70 61 63 65 5b 31 30 30 char zSpace[100
0760: 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 ]; /* Ini
0770: 74 69 61 6c 20 73 74 61 74 69 63 20 73 70 61 63 tial static spac
0780: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 4a 53 4f 4e e */.};../* JSON
0790: 20 74 79 70 65 20 76 61 6c 75 65 73 0a 2a 2f 0a type values.*/.
07a0: 23 64 65 66 69 6e 65 20 4a 53 4f 4e 5f 4e 55 4c #define JSON_NUL
07b0: 4c 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20 L 0.#define
07c0: 4a 53 4f 4e 5f 54 52 55 45 20 20 20 20 20 31 0a JSON_TRUE 1.
07d0: 23 64 65 66 69 6e 65 20 4a 53 4f 4e 5f 46 41 4c #define JSON_FAL
07e0: 53 45 20 20 20 20 32 0a 23 64 65 66 69 6e 65 20 SE 2.#define
07f0: 4a 53 4f 4e 5f 49 4e 54 20 20 20 20 20 20 33 0a JSON_INT 3.
0800: 23 64 65 66 69 6e 65 20 4a 53 4f 4e 5f 52 45 41 #define JSON_REA
0810: 4c 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65 20 L 4.#define
0820: 4a 53 4f 4e 5f 53 54 52 49 4e 47 20 20 20 35 0a JSON_STRING 5.
0830: 23 64 65 66 69 6e 65 20 4a 53 4f 4e 5f 41 52 52 #define JSON_ARR
0840: 41 59 20 20 20 20 36 0a 23 64 65 66 69 6e 65 20 AY 6.#define
0850: 4a 53 4f 4e 5f 4f 42 4a 45 43 54 20 20 20 37 0a JSON_OBJECT 7.
0860: 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 73 20 6f 66 20 ./*.** Names of
0870: 74 68 65 20 76 61 72 69 6f 75 73 20 4a 53 4f 4e the various JSON
0880: 20 74 79 70 65 73 3a 0a 2a 2f 0a 73 74 61 74 69 types:.*/.stati
0890: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 c const char * c
08a0: 6f 6e 73 74 20 6a 73 6f 6e 54 79 70 65 5b 5d 20 onst jsonType[]
08b0: 3d 20 7b 0a 20 20 22 6e 75 6c 6c 22 2c 20 22 74 = {. "null", "t
08c0: 72 75 65 22 2c 20 22 66 61 6c 73 65 22 2c 20 22 rue", "false", "
08d0: 69 6e 74 65 67 65 72 22 2c 20 22 72 65 61 6c 22 integer", "real"
08e0: 2c 20 22 74 65 78 74 22 2c 20 22 61 72 72 61 79 , "text", "array
08f0: 22 2c 20 22 6f 62 6a 65 63 74 22 0a 7d 3b 0a 0a ", "object".};..
0900: 2f 2a 20 42 69 74 20 76 61 6c 75 65 73 20 66 6f /* Bit values fo
0910: 72 20 74 68 65 20 4a 73 6f 6e 4e 6f 64 65 2e 6a r the JsonNode.j
0920: 6e 46 6c 61 67 20 66 69 65 6c 64 0a 2a 2f 0a 23 nFlag field.*/.#
0930: 64 65 66 69 6e 65 20 4a 4e 4f 44 45 5f 52 41 57 define JNODE_RAW
0940: 20 20 20 20 20 30 78 30 31 20 20 20 20 20 20 20 0x01
0950: 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 69 73 20 /* Content is
0960: 72 61 77 2c 20 6e 6f 74 20 4a 53 4f 4e 20 65 6e raw, not JSON en
0970: 63 6f 64 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 coded */.#define
0980: 20 4a 4e 4f 44 45 5f 45 53 43 41 50 45 20 20 30 JNODE_ESCAPE 0
0990: 78 30 32 20 20 20 20 20 20 20 20 20 2f 2a 20 43 x02 /* C
09a0: 6f 6e 74 65 6e 74 20 69 73 20 74 65 78 74 20 77 ontent is text w
09b0: 69 74 68 20 5c 20 65 73 63 61 70 65 73 20 2a 2f ith \ escapes */
09c0: 0a 23 64 65 66 69 6e 65 20 4a 4e 4f 44 45 5f 52 .#define JNODE_R
09d0: 45 4d 4f 56 45 20 20 30 78 30 34 20 20 20 20 20 EMOVE 0x04
09e0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6f 75 /* Do not ou
09f0: 74 70 75 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 tput */.#define
0a00: 4a 4e 4f 44 45 5f 52 45 50 4c 41 43 45 20 30 78 JNODE_REPLACE 0x
0a10: 30 38 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 08 /* Re
0a20: 70 6c 61 63 65 20 77 69 74 68 20 4a 73 6f 6e 4e place with JsonN
0a30: 6f 64 65 2e 69 56 61 6c 20 2a 2f 0a 23 64 65 66 ode.iVal */.#def
0a40: 69 6e 65 20 4a 4e 4f 44 45 5f 41 50 50 45 4e 44 ine JNODE_APPEND
0a50: 20 20 30 78 31 30 20 20 20 20 20 20 20 20 20 2f 0x10 /
0a60: 2a 20 4d 6f 72 65 20 41 52 52 41 59 2f 4f 42 4a * More ARRAY/OBJ
0a70: 45 43 54 20 65 6e 74 72 69 65 73 20 61 74 20 75 ECT entries at u
0a80: 2e 69 41 70 70 65 6e 64 20 2a 2f 0a 0a 0a 2f 2a .iAppend */.../*
0a90: 20 41 20 73 69 6e 67 6c 65 20 6e 6f 64 65 20 6f A single node o
0aa0: 66 20 70 61 72 73 65 64 20 4a 53 4f 4e 0a 2a 2f f parsed JSON.*/
0ab0: 0a 73 74 72 75 63 74 20 4a 73 6f 6e 4e 6f 64 65 .struct JsonNode
0ac0: 20 7b 0a 20 20 75 38 20 65 54 79 70 65 3b 20 20 {. u8 eType;
0ad0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f /* O
0ae0: 6e 65 20 6f 66 20 74 68 65 20 4a 53 4f 4e 5f 20 ne of the JSON_
0af0: 74 79 70 65 20 76 61 6c 75 65 73 20 2a 2f 0a 20 type values */.
0b00: 20 75 38 20 6a 6e 46 6c 61 67 73 3b 20 20 20 20 u8 jnFlags;
0b10: 20 20 20 20 20 20 20 20 2f 2a 20 4a 4e 4f 44 45 /* JNODE
0b20: 20 66 6c 61 67 73 20 2a 2f 0a 20 20 75 38 20 69 flags */. u8 i
0b30: 56 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 Val;
0b40: 20 20 20 2f 2a 20 52 65 70 6c 61 63 65 6d 65 6e /* Replacemen
0b50: 74 20 76 61 6c 75 65 20 77 68 65 6e 20 4a 4e 4f t value when JNO
0b60: 44 45 5f 52 45 50 4c 41 43 45 20 2a 2f 0a 20 20 DE_REPLACE */.
0b70: 75 33 32 20 6e 3b 20 20 20 20 20 20 20 20 20 20 u32 n;
0b80: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 /* Bytes
0b90: 6f 66 20 63 6f 6e 74 65 6e 74 2c 20 6f 72 20 6e of content, or n
0ba0: 75 6d 62 65 72 20 6f 66 20 73 75 62 2d 6e 6f 64 umber of sub-nod
0bb0: 65 73 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b 0a es */. union {.
0bc0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a const char *
0bd0: 7a 4a 43 6f 6e 74 65 6e 74 3b 20 2f 2a 20 43 6f zJContent; /* Co
0be0: 6e 74 65 6e 74 20 66 6f 72 20 49 4e 54 2c 20 52 ntent for INT, R
0bf0: 45 41 4c 2c 20 61 6e 64 20 53 54 52 49 4e 47 20 EAL, and STRING
0c00: 2a 2f 0a 20 20 20 20 75 33 32 20 69 41 70 70 65 */. u32 iAppe
0c10: 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a nd; /*
0c20: 20 4d 6f 72 65 20 74 65 72 6d 73 20 66 6f 72 20 More terms for
0c30: 41 52 52 41 59 20 61 6e 64 20 4f 42 4a 45 43 54 ARRAY and OBJECT
0c40: 20 2a 2f 0a 20 20 20 20 75 33 32 20 69 4b 65 79 */. u32 iKey
0c50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f ; /
0c60: 2a 20 4b 65 79 20 66 6f 72 20 41 52 52 41 59 20 * Key for ARRAY
0c70: 6f 62 6a 65 63 74 73 20 69 6e 20 6a 73 6f 6e 5f objects in json_
0c80: 74 72 65 65 28 29 20 2a 2f 0a 20 20 7d 20 75 3b tree() */. } u;
0c90: 0a 7d 3b 0a 0a 2f 2a 20 41 20 63 6f 6d 70 6c 65 .};../* A comple
0ca0: 74 65 6c 79 20 70 61 72 73 65 64 20 4a 53 4f 4e tely parsed JSON
0cb0: 20 73 74 72 69 6e 67 0a 2a 2f 0a 73 74 72 75 63 string.*/.struc
0cc0: 74 20 4a 73 6f 6e 50 61 72 73 65 20 7b 0a 20 20 t JsonParse {.
0cd0: 75 33 32 20 6e 4e 6f 64 65 3b 20 20 20 20 20 20 u32 nNode;
0ce0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 /* Number of
0cf0: 73 6c 6f 74 73 20 6f 66 20 61 4e 6f 64 65 5b 5d slots of aNode[]
0d00: 20 75 73 65 64 20 2a 2f 0a 20 20 75 33 32 20 6e used */. u32 n
0d10: 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 2f 2a Alloc; /*
0d20: 20 4e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 Number of slots
0d30: 20 6f 66 20 61 4e 6f 64 65 5b 5d 20 61 6c 6c 6f of aNode[] allo
0d40: 63 61 74 65 64 20 2a 2f 0a 20 20 4a 73 6f 6e 4e cated */. JsonN
0d50: 6f 64 65 20 2a 61 4e 6f 64 65 3b 20 20 20 2f 2a ode *aNode; /*
0d60: 20 41 72 72 61 79 20 6f 66 20 6e 6f 64 65 73 20 Array of nodes
0d70: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 containing the p
0d80: 61 72 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 arse */. const
0d90: 63 68 61 72 20 2a 7a 4a 73 6f 6e 3b 20 2f 2a 20 char *zJson; /*
0da0: 4f 72 69 67 69 6e 61 6c 20 4a 53 4f 4e 20 73 74 Original JSON st
0db0: 72 69 6e 67 20 2a 2f 0a 20 20 75 33 32 20 2a 61 ring */. u32 *a
0dc0: 55 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 Up; /*
0dd0: 49 6e 64 65 78 20 6f 66 20 70 61 72 65 6e 74 20 Index of parent
0de0: 6f 66 20 65 61 63 68 20 6e 6f 64 65 20 2a 2f 0a of each node */.
0df0: 20 20 75 38 20 6f 6f 6d 3b 20 20 20 20 20 20 20 u8 oom;
0e00: 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 /* Set to t
0e10: 72 75 65 20 69 66 20 6f 75 74 20 6f 66 20 6d 65 rue if out of me
0e20: 6d 6f 72 79 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a mory */.};../***
0e30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0e40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0e50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0e60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0e70: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 55 74 69 6c 69 *******.** Utili
0e80: 74 79 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 ty routines for
0e90: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 4a 73 6f dealing with Jso
0ea0: 6e 53 74 72 69 6e 67 20 6f 62 6a 65 63 74 73 0a nString objects.
0eb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0ec0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0ed0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0ee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0ef0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 20 **********/../*
0f00: 53 65 74 20 74 68 65 20 4a 73 6f 6e 53 74 72 69 Set the JsonStri
0f10: 6e 67 20 6f 62 6a 65 63 74 20 74 6f 20 61 6e 20 ng object to an
0f20: 65 6d 70 74 79 20 73 74 72 69 6e 67 0a 2a 2f 0a empty string.*/.
0f30: 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e static void json
0f40: 5a 65 72 6f 28 4a 73 6f 6e 53 74 72 69 6e 67 20 Zero(JsonString
0f50: 2a 70 29 7b 0a 20 20 70 2d 3e 7a 42 75 66 20 3d *p){. p->zBuf =
0f60: 20 70 2d 3e 7a 53 70 61 63 65 3b 0a 20 20 70 2d p->zSpace;. p-
0f70: 3e 6e 41 6c 6c 6f 63 20 3d 20 73 69 7a 65 6f 66 >nAlloc = sizeof
0f80: 28 70 2d 3e 7a 53 70 61 63 65 29 3b 0a 20 20 70 (p->zSpace);. p
0f90: 2d 3e 6e 55 73 65 64 20 3d 20 30 3b 0a 20 20 70 ->nUsed = 0;. p
0fa0: 2d 3e 62 53 74 61 74 69 63 20 3d 20 31 3b 0a 7d ->bStatic = 1;.}
0fb0: 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 ../* Initialize
0fc0: 74 68 65 20 4a 73 6f 6e 53 74 72 69 6e 67 20 6f the JsonString o
0fd0: 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 bject.*/.static
0fe0: 76 6f 69 64 20 6a 73 6f 6e 49 6e 69 74 28 4a 73 void jsonInit(Js
0ff0: 6f 6e 53 74 72 69 6e 67 20 2a 70 2c 20 73 71 6c onString *p, sql
1000: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 ite3_context *pC
1010: 74 78 29 7b 0a 20 20 70 2d 3e 70 43 74 78 20 3d tx){. p->pCtx =
1020: 20 70 43 74 78 3b 0a 20 20 70 2d 3e 62 45 72 72 pCtx;. p->bErr
1030: 20 3d 20 30 3b 0a 20 20 6a 73 6f 6e 5a 65 72 6f = 0;. jsonZero
1040: 28 70 29 3b 0a 7d 0a 0a 0a 2f 2a 20 46 72 65 65 (p);.}.../* Free
1050: 20 61 6c 6c 20 61 6c 6c 6f 63 61 74 65 64 20 6d all allocated m
1060: 65 6d 6f 72 79 20 61 6e 64 20 72 65 73 65 74 20 emory and reset
1070: 74 68 65 20 4a 73 6f 6e 53 74 72 69 6e 67 20 6f the JsonString o
1080: 62 6a 65 63 74 20 62 61 63 6b 20 74 6f 20 69 74 bject back to it
1090: 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 73 74 61 s.** initial sta
10a0: 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f te..*/.static vo
10b0: 69 64 20 6a 73 6f 6e 52 65 73 65 74 28 4a 73 6f id jsonReset(Jso
10c0: 6e 53 74 72 69 6e 67 20 2a 70 29 7b 0a 20 20 69 nString *p){. i
10d0: 66 28 20 21 70 2d 3e 62 53 74 61 74 69 63 20 29 f( !p->bStatic )
10e0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d sqlite3_free(p-
10f0: 3e 7a 42 75 66 29 3b 0a 20 20 6a 73 6f 6e 5a 65 >zBuf);. jsonZe
1100: 72 6f 28 70 29 3b 0a 7d 0a 0a 0a 2f 2a 20 52 65 ro(p);.}.../* Re
1110: 70 6f 72 74 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d port an out-of-m
1120: 65 6d 6f 72 79 20 28 4f 4f 4d 29 20 63 6f 6e 64 emory (OOM) cond
1130: 69 74 69 6f 6e 20 0a 2a 2f 0a 73 74 61 74 69 63 ition .*/.static
1140: 20 76 6f 69 64 20 6a 73 6f 6e 4f 6f 6d 28 4a 73 void jsonOom(Js
1150: 6f 6e 53 74 72 69 6e 67 20 2a 70 29 7b 0a 20 20 onString *p){.
1160: 69 66 28 20 21 70 2d 3e 62 45 72 72 20 29 7b 0a if( !p->bErr ){.
1170: 20 20 20 20 70 2d 3e 62 45 72 72 20 3d 20 31 3b p->bErr = 1;
1180: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 . sqlite3_res
1190: 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 ult_error_nomem(
11a0: 70 2d 3e 70 43 74 78 29 3b 0a 20 20 20 20 6a 73 p->pCtx);. js
11b0: 6f 6e 52 65 73 65 74 28 70 29 3b 0a 20 20 7d 0a onReset(p);. }.
11c0: 7d 0a 0a 2f 2a 20 45 6e 6c 61 72 67 65 20 70 4a }../* Enlarge pJ
11d0: 73 6f 6e 2d 3e 7a 42 75 66 20 73 6f 20 74 68 61 son->zBuf so tha
11e0: 74 20 69 74 20 63 61 6e 20 68 6f 6c 64 20 61 74 t it can hold at
11f0: 20 6c 65 61 73 74 20 4e 20 6d 6f 72 65 20 62 79 least N more by
1200: 74 65 73 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 7a tes..** Return z
1210: 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 ero on success.
1220: 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f Return non-zero
1230: 20 6f 6e 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 on an OOM error
1240: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a .*/.static int j
1250: 73 6f 6e 47 72 6f 77 28 4a 73 6f 6e 53 74 72 69 sonGrow(JsonStri
1260: 6e 67 20 2a 70 2c 20 75 33 32 20 4e 29 7b 0a 20 ng *p, u32 N){.
1270: 20 75 36 34 20 6e 54 6f 74 61 6c 20 3d 20 4e 3c u64 nTotal = N<
1280: 70 2d 3e 6e 41 6c 6c 6f 63 20 3f 20 70 2d 3e 6e p->nAlloc ? p->n
1290: 41 6c 6c 6f 63 2a 32 20 3a 20 70 2d 3e 6e 41 6c Alloc*2 : p->nAl
12a0: 6c 6f 63 2b 4e 2b 31 30 3b 0a 20 20 63 68 61 72 loc+N+10;. char
12b0: 20 2a 7a 4e 65 77 3b 0a 20 20 69 66 28 20 70 2d *zNew;. if( p-
12c0: 3e 62 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 >bStatic ){.
12d0: 69 66 28 20 70 2d 3e 62 45 72 72 20 29 20 72 65 if( p->bErr ) re
12e0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7a 4e 65 77 turn 1;. zNew
12f0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f = sqlite3_mallo
1300: 63 36 34 28 6e 54 6f 74 61 6c 29 3b 0a 20 20 20 c64(nTotal);.
1310: 20 69 66 28 20 7a 4e 65 77 3d 3d 30 20 29 7b 0a if( zNew==0 ){.
1320: 20 20 20 20 20 20 6a 73 6f 6e 4f 6f 6d 28 70 29 jsonOom(p)
1330: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 ;. return S
1340: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 QLITE_NOMEM;.
1350: 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 4e }. memcpy(zN
1360: 65 77 2c 20 70 2d 3e 7a 42 75 66 2c 20 70 2d 3e ew, p->zBuf, p->
1370: 6e 55 73 65 64 29 3b 0a 20 20 20 20 70 2d 3e 7a nUsed);. p->z
1380: 42 75 66 20 3d 20 7a 4e 65 77 3b 0a 20 20 20 20 Buf = zNew;.
1390: 70 2d 3e 62 53 74 61 74 69 63 20 3d 20 30 3b 0a p->bStatic = 0;.
13a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 65 }else{. zNe
13b0: 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c w = sqlite3_real
13c0: 6c 6f 63 36 34 28 70 2d 3e 7a 42 75 66 2c 20 6e loc64(p->zBuf, n
13d0: 54 6f 74 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 Total);. if(
13e0: 7a 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 zNew==0 ){.
13f0: 20 6a 73 6f 6e 4f 6f 6d 28 70 29 3b 0a 20 20 20 jsonOom(p);.
1400: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 return SQLITE
1410: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 _NOMEM;. }.
1420: 20 20 70 2d 3e 7a 42 75 66 20 3d 20 7a 4e 65 77 p->zBuf = zNew
1430: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 41 6c 6c 6f ;. }. p->nAllo
1440: 63 20 3d 20 6e 54 6f 74 61 6c 3b 0a 20 20 72 65 c = nTotal;. re
1450: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a turn SQLITE_OK;.
1460: 7d 0a 0a 2f 2a 20 41 70 70 65 6e 64 20 4e 20 62 }../* Append N b
1470: 79 74 65 73 20 66 72 6f 6d 20 7a 49 6e 20 6f 6e ytes from zIn on
1480: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 to the end of th
1490: 65 20 4a 73 6f 6e 53 74 72 69 6e 67 20 73 74 72 e JsonString str
14a0: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 ing..*/.static v
14b0: 6f 69 64 20 6a 73 6f 6e 41 70 70 65 6e 64 52 61 oid jsonAppendRa
14c0: 77 28 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70 2c w(JsonString *p,
14d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e const char *zIn
14e0: 2c 20 75 33 32 20 4e 29 7b 0a 20 20 69 66 28 20 , u32 N){. if(
14f0: 28 4e 2b 70 2d 3e 6e 55 73 65 64 20 3e 3d 20 70 (N+p->nUsed >= p
1500: 2d 3e 6e 41 6c 6c 6f 63 29 20 26 26 20 6a 73 6f ->nAlloc) && jso
1510: 6e 47 72 6f 77 28 70 2c 4e 29 21 3d 30 20 29 20 nGrow(p,N)!=0 )
1520: 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 63 70 79 return;. memcpy
1530: 28 70 2d 3e 7a 42 75 66 2b 70 2d 3e 6e 55 73 65 (p->zBuf+p->nUse
1540: 64 2c 20 7a 49 6e 2c 20 4e 29 3b 0a 20 20 70 2d d, zIn, N);. p-
1550: 3e 6e 55 73 65 64 20 2b 3d 20 4e 3b 0a 7d 0a 0a >nUsed += N;.}..
1560: 2f 2a 20 41 70 70 65 6e 64 20 66 6f 72 6d 61 74 /* Append format
1570: 74 65 64 20 74 65 78 74 20 28 6e 6f 74 20 74 6f ted text (not to
1580: 20 65 78 63 65 65 64 20 4e 20 62 79 74 65 73 29 exceed N bytes)
1590: 20 74 6f 20 74 68 65 20 4a 73 6f 6e 53 74 72 69 to the JsonStri
15a0: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f ng..*/.static vo
15b0: 69 64 20 6a 73 6f 6e 50 72 69 6e 74 66 28 69 6e id jsonPrintf(in
15c0: 74 20 4e 2c 20 4a 73 6f 6e 53 74 72 69 6e 67 20 t N, JsonString
15d0: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a *p, const char *
15e0: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 zFormat, ...){.
15f0: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 va_list ap;. i
1600: 66 28 20 28 70 2d 3e 6e 55 73 65 64 20 2b 20 4e f( (p->nUsed + N
1610: 20 3e 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 29 20 26 >= p->nAlloc) &
1620: 26 20 6a 73 6f 6e 47 72 6f 77 28 70 2c 20 4e 29 & jsonGrow(p, N)
1630: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 76 61 5f ) return;. va_
1640: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 start(ap, zForma
1650: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 73 t);. sqlite3_vs
1660: 6e 70 72 69 6e 74 66 28 4e 2c 20 70 2d 3e 7a 42 nprintf(N, p->zB
1670: 75 66 2b 70 2d 3e 6e 55 73 65 64 2c 20 7a 46 6f uf+p->nUsed, zFo
1680: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f rmat, ap);. va_
1690: 65 6e 64 28 61 70 29 3b 0a 20 20 70 2d 3e 6e 55 end(ap);. p->nU
16a0: 73 65 64 20 2b 3d 20 28 69 6e 74 29 73 74 72 6c sed += (int)strl
16b0: 65 6e 28 70 2d 3e 7a 42 75 66 2b 70 2d 3e 6e 55 en(p->zBuf+p->nU
16c0: 73 65 64 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 sed);.}..#ifdef
16d0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20 SQLITE_DEBUG./*
16e0: 41 70 70 65 6e 64 20 74 68 65 20 7a 65 72 6f 2d Append the zero-
16f0: 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e terminated strin
1700: 67 20 7a 49 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 g zIn.*/.static
1710: 76 6f 69 64 20 6a 73 6f 6e 41 70 70 65 6e 64 28 void jsonAppend(
1720: 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70 2c 20 63 JsonString *p, c
1730: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 29 7b onst char *zIn){
1740: 0a 20 20 6a 73 6f 6e 41 70 70 65 6e 64 52 61 77 . jsonAppendRaw
1750: 28 70 2c 20 7a 49 6e 2c 20 28 75 33 32 29 73 74 (p, zIn, (u32)st
1760: 72 6c 65 6e 28 7a 49 6e 29 29 3b 0a 7d 0a 23 65 rlen(zIn));.}.#e
1770: 6e 64 69 66 0a 0a 2f 2a 20 41 70 70 65 6e 64 20 ndif../* Append
1780: 61 20 73 69 6e 67 6c 65 20 63 68 61 72 61 63 74 a single charact
1790: 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 er.*/.static voi
17a0: 64 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61 72 d jsonAppendChar
17b0: 28 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70 2c 20 (JsonString *p,
17c0: 63 68 61 72 20 63 29 7b 0a 20 20 69 66 28 20 70 char c){. if( p
17d0: 2d 3e 6e 55 73 65 64 3e 3d 70 2d 3e 6e 41 6c 6c ->nUsed>=p->nAll
17e0: 6f 63 20 26 26 20 6a 73 6f 6e 47 72 6f 77 28 70 oc && jsonGrow(p
17f0: 2c 31 29 21 3d 30 20 29 20 72 65 74 75 72 6e 3b ,1)!=0 ) return;
1800: 0a 20 20 70 2d 3e 7a 42 75 66 5b 70 2d 3e 6e 55 . p->zBuf[p->nU
1810: 73 65 64 2b 2b 5d 20 3d 20 63 3b 0a 7d 0a 0a 2f sed++] = c;.}../
1820: 2a 20 41 70 70 65 6e 64 20 61 20 63 6f 6d 6d 61 * Append a comma
1830: 20 73 65 70 61 72 61 74 6f 72 20 74 6f 20 74 68 separator to th
1840: 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2c e output buffer,
1850: 20 69 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 if the previous
1860: 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 20 69 73 .** character is
1870: 20 6e 6f 74 20 27 5b 27 20 6f 72 20 27 7b 27 2e not '[' or '{'.
1880: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 .*/.static void
1890: 6a 73 6f 6e 41 70 70 65 6e 64 53 65 70 61 72 61 jsonAppendSepara
18a0: 74 6f 72 28 4a 73 6f 6e 53 74 72 69 6e 67 20 2a tor(JsonString *
18b0: 70 29 7b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 p){. char c;.
18c0: 69 66 28 20 70 2d 3e 6e 55 73 65 64 3d 3d 30 20 if( p->nUsed==0
18d0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 63 20 3d 20 ) return;. c =
18e0: 70 2d 3e 7a 42 75 66 5b 70 2d 3e 6e 55 73 65 64 p->zBuf[p->nUsed
18f0: 2d 31 5d 3b 0a 20 20 69 66 28 20 63 21 3d 27 5b -1];. if( c!='[
1900: 27 20 26 26 20 63 21 3d 27 7b 27 20 29 20 6a 73 ' && c!='{' ) js
1910: 6f 6e 41 70 70 65 6e 64 43 68 61 72 28 70 2c 20 onAppendChar(p,
1920: 27 2c 27 29 3b 0a 7d 0a 0a 2f 2a 20 41 70 70 65 ',');.}../* Appe
1930: 6e 64 20 74 68 65 20 4e 2d 62 79 74 65 20 73 74 nd the N-byte st
1940: 72 69 6e 67 20 69 6e 20 7a 49 6e 20 74 6f 20 74 ring in zIn to t
1950: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 4a 73 he end of the Js
1960: 6f 6e 53 74 72 69 6e 67 20 73 74 72 69 6e 67 0a onString string.
1970: 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 ** under constru
1980: 63 74 69 6f 6e 2e 20 20 45 6e 63 6c 6f 73 65 20 ction. Enclose
1990: 74 68 65 20 73 74 72 69 6e 67 20 69 6e 20 22 2e the string in ".
19a0: 2e 2e 22 20 61 6e 64 20 65 73 63 61 70 65 0a 2a .." and escape.*
19b0: 2a 20 61 6e 79 20 64 6f 75 62 6c 65 2d 71 75 6f * any double-quo
19c0: 74 65 73 20 6f 72 20 62 61 63 6b 73 6c 61 73 68 tes or backslash
19d0: 20 63 68 61 72 61 63 74 65 72 73 20 63 6f 6e 74 characters cont
19e0: 61 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 ained within the
19f0: 0a 2a 2a 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 .** string..*/.s
1a00: 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 41 tatic void jsonA
1a10: 70 70 65 6e 64 53 74 72 69 6e 67 28 4a 73 6f 6e ppendString(Json
1a20: 53 74 72 69 6e 67 20 2a 70 2c 20 63 6f 6e 73 74 String *p, const
1a30: 20 63 68 61 72 20 2a 7a 49 6e 2c 20 75 33 32 20 char *zIn, u32
1a40: 4e 29 7b 0a 20 20 75 33 32 20 69 3b 0a 20 20 69 N){. u32 i;. i
1a50: 66 28 20 28 4e 2b 70 2d 3e 6e 55 73 65 64 2b 32 f( (N+p->nUsed+2
1a60: 20 3e 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 29 20 26 >= p->nAlloc) &
1a70: 26 20 6a 73 6f 6e 47 72 6f 77 28 70 2c 4e 2b 32 & jsonGrow(p,N+2
1a80: 29 21 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 )!=0 ) return;.
1a90: 20 70 2d 3e 7a 42 75 66 5b 70 2d 3e 6e 55 73 65 p->zBuf[p->nUse
1aa0: 64 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 66 6f d++] = '"';. fo
1ab0: 72 28 69 3d 30 3b 20 69 3c 4e 3b 20 69 2b 2b 29 r(i=0; i<N; i++)
1ac0: 7b 0a 20 20 20 20 63 68 61 72 20 63 20 3d 20 7a {. char c = z
1ad0: 49 6e 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 63 In[i];. if( c
1ae0: 3d 3d 27 22 27 20 7c 7c 20 63 3d 3d 27 5c 5c 27 =='"' || c=='\\'
1af0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 ){. if( (p
1b00: 2d 3e 6e 55 73 65 64 2b 4e 2b 31 2d 69 20 3e 20 ->nUsed+N+1-i >
1b10: 70 2d 3e 6e 41 6c 6c 6f 63 29 20 26 26 20 6a 73 p->nAlloc) && js
1b20: 6f 6e 47 72 6f 77 28 70 2c 4e 2b 31 2d 69 29 21 onGrow(p,N+1-i)!
1b30: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 =0 ) return;.
1b40: 20 20 20 70 2d 3e 7a 42 75 66 5b 70 2d 3e 6e 55 p->zBuf[p->nU
1b50: 73 65 64 2b 2b 5d 20 3d 20 27 5c 5c 27 3b 0a 20 sed++] = '\\';.
1b60: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 7a 42 75 66 }. p->zBuf
1b70: 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d 20 63 [p->nUsed++] = c
1b80: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 7a 42 75 66 5b ;. }. p->zBuf[
1b90: 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d 20 27 22 p->nUsed++] = '"
1ba0: 27 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 ';.}../*.** Appe
1bb0: 6e 64 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 61 nd a function pa
1bc0: 72 61 6d 65 74 65 72 20 76 61 6c 75 65 20 74 6f rameter value to
1bd0: 20 74 68 65 20 4a 53 4f 4e 20 73 74 72 69 6e 67 the JSON string
1be0: 20 75 6e 64 65 72 20 0a 2a 2a 20 63 6f 6e 73 74 under .** const
1bf0: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 ruction..*/.stat
1c00: 69 63 20 76 6f 69 64 20 6a 73 6f 6e 41 70 70 65 ic void jsonAppe
1c10: 6e 64 56 61 6c 75 65 28 0a 20 20 4a 73 6f 6e 53 ndValue(. JsonS
1c20: 74 72 69 6e 67 20 2a 70 2c 20 20 20 20 20 20 20 tring *p,
1c30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 70 70 /* App
1c40: 65 6e 64 20 74 6f 20 74 68 69 73 20 4a 53 4f 4e end to this JSON
1c50: 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 73 71 6c string */. sql
1c60: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c ite3_value *pVal
1c70: 75 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 ue /* V
1c80: 61 6c 75 65 20 74 6f 20 61 70 70 65 6e 64 20 2a alue to append *
1c90: 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73 /.){. switch( s
1ca0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 qlite3_value_typ
1cb0: 65 28 70 56 61 6c 75 65 29 20 29 7b 0a 20 20 20 e(pValue) ){.
1cc0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c case SQLITE_NUL
1cd0: 4c 3a 20 7b 0a 20 20 20 20 20 20 6a 73 6f 6e 41 L: {. jsonA
1ce0: 70 70 65 6e 64 52 61 77 28 70 2c 20 22 6e 75 6c ppendRaw(p, "nul
1cf0: 6c 22 2c 20 34 29 3b 0a 20 20 20 20 20 20 62 72 l", 4);. br
1d00: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 eak;. }. c
1d10: 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 ase SQLITE_INTEG
1d20: 45 52 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c ER:. case SQL
1d30: 49 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 ITE_FLOAT: {.
1d40: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a const char *z
1d50: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 = (const char*)
1d60: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 sqlite3_value_te
1d70: 78 74 28 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 xt(pValue);.
1d80: 20 20 75 33 32 20 6e 20 3d 20 28 75 33 32 29 73 u32 n = (u32)s
1d90: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 qlite3_value_byt
1da0: 65 73 28 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 es(pValue);.
1db0: 20 20 6a 73 6f 6e 41 70 70 65 6e 64 52 61 77 28 jsonAppendRaw(
1dc0: 70 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 p, z, n);.
1dd0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 break;. }.
1de0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58 case SQLITE_TEX
1df0: 54 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 T: {. const
1e00: 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e 73 char *z = (cons
1e10: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f t char*)sqlite3_
1e20: 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 75 value_text(pValu
1e30: 65 29 3b 0a 20 20 20 20 20 20 75 33 32 20 6e 20 e);. u32 n
1e40: 3d 20 28 75 33 32 29 73 71 6c 69 74 65 33 5f 76 = (u32)sqlite3_v
1e50: 61 6c 75 65 5f 62 79 74 65 73 28 70 56 61 6c 75 alue_bytes(pValu
1e60: 65 29 3b 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70 e);. jsonAp
1e70: 70 65 6e 64 53 74 72 69 6e 67 28 70 2c 20 7a 2c pendString(p, z,
1e80: 20 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b n);. break
1e90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 ;. }. defa
1ea0: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 ult: {. if(
1eb0: 20 70 2d 3e 62 45 72 72 3d 3d 30 20 29 7b 0a 20 p->bErr==0 ){.
1ec0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 sqlite3_r
1ed0: 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 2d 3e 70 esult_error(p->p
1ee0: 43 74 78 2c 20 22 4a 53 4f 4e 20 63 61 6e 6e 6f Ctx, "JSON canno
1ef0: 74 20 68 6f 6c 64 20 42 4c 4f 42 20 76 61 6c 75 t hold BLOB valu
1f00: 65 73 22 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 es", -1);.
1f10: 20 20 70 2d 3e 62 45 72 72 20 3d 20 31 3b 0a 20 p->bErr = 1;.
1f20: 20 20 20 20 20 20 20 6a 73 6f 6e 52 65 73 65 74 jsonReset
1f30: 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 (p);. }.
1f40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a break;. }.
1f50: 20 20 7d 0a 7d 0a 0a 0a 2f 2a 20 4d 61 6b 65 20 }.}.../* Make
1f60: 74 68 65 20 4a 53 4f 4e 20 69 6e 20 70 20 74 68 the JSON in p th
1f70: 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 e result of the
1f80: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f SQL function..*/
1f90: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f .static void jso
1fa0: 6e 52 65 73 75 6c 74 28 4a 73 6f 6e 53 74 72 69 nResult(JsonStri
1fb0: 6e 67 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d ng *p){. if( p-
1fc0: 3e 62 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 >bErr==0 ){.
1fd0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 sqlite3_result_t
1fe0: 65 78 74 36 34 28 70 2d 3e 70 43 74 78 2c 20 70 ext64(p->pCtx, p
1ff0: 2d 3e 7a 42 75 66 2c 20 70 2d 3e 6e 55 73 65 64 ->zBuf, p->nUsed
2000: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 , .
2010: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e p->
2020: 62 53 74 61 74 69 63 20 3f 20 53 51 4c 49 54 45 bStatic ? SQLITE
2030: 5f 54 52 41 4e 53 49 45 4e 54 20 3a 20 73 71 6c _TRANSIENT : sql
2040: 69 74 65 33 5f 66 72 65 65 2c 0a 20 20 20 20 20 ite3_free,.
2050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2060: 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 SQLITE_UTF8
2070: 29 3b 0a 20 20 20 20 6a 73 6f 6e 5a 65 72 6f 28 );. jsonZero(
2080: 70 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 p);. }. assert
2090: 28 20 70 2d 3e 62 53 74 61 74 69 63 20 29 3b 0a ( p->bStatic );.
20a0: 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a }../************
20b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
20c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
20d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
20e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a **************.*
20f0: 2a 20 55 74 69 6c 69 74 79 20 72 6f 75 74 69 6e * Utility routin
2100: 65 73 20 66 6f 72 20 64 65 61 6c 69 6e 67 20 77 es for dealing w
2110: 69 74 68 20 4a 73 6f 6e 4e 6f 64 65 20 61 6e 64 ith JsonNode and
2120: 20 4a 73 6f 6e 50 61 72 73 65 20 6f 62 6a 65 63 JsonParse objec
2130: 74 73 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ts.*************
2140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
2150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
2160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
2170: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a *************/..
2180: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 /*.** Return the
2190: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73 65 number of conse
21a0: 63 75 74 69 76 65 20 4a 73 6f 6e 4e 6f 64 65 20 cutive JsonNode
21b0: 73 6c 6f 74 73 20 6e 65 65 64 20 74 6f 20 72 65 slots need to re
21c0: 70 72 65 73 65 6e 74 0a 2a 2a 20 74 68 65 20 70 present.** the p
21d0: 61 72 73 65 64 20 4a 53 4f 4e 20 61 74 20 70 4e arsed JSON at pN
21e0: 6f 64 65 2e 20 20 54 68 65 20 6d 69 6e 69 6d 75 ode. The minimu
21f0: 6d 20 61 6e 73 77 65 72 20 69 73 20 31 2e 20 20 m answer is 1.
2200: 46 6f 72 20 41 52 52 41 59 20 61 6e 64 0a 2a 2a For ARRAY and.**
2210: 20 4f 42 4a 45 43 54 20 74 79 70 65 73 2c 20 74 OBJECT types, t
2220: 68 65 20 6e 75 6d 62 65 72 20 6d 69 67 68 74 20 he number might
2230: 62 65 20 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a be larger..**.**
2240: 20 41 70 70 65 6e 64 65 64 20 65 6c 65 6d 65 6e Appended elemen
2250: 74 73 20 61 72 65 20 6e 6f 74 20 63 6f 75 6e 74 ts are not count
2260: 65 64 2e 20 20 54 68 65 20 76 61 6c 75 65 20 72 ed. The value r
2270: 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 6e eturned is the n
2280: 75 6d 62 65 72 0a 2a 2a 20 62 79 20 77 68 69 63 umber.** by whic
2290: 68 20 74 68 65 20 4a 73 6f 6e 4e 6f 64 65 20 63 h the JsonNode c
22a0: 6f 75 6e 74 65 72 20 73 68 6f 75 6c 64 20 69 6e ounter should in
22b0: 63 72 65 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72 crement in order
22c0: 20 74 6f 20 67 6f 20 74 6f 20 74 68 65 0a 2a 2a to go to the.**
22d0: 20 6e 65 78 74 20 70 65 65 72 20 76 61 6c 75 65 next peer value
22e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 ..*/.static u32
22f0: 6a 73 6f 6e 4e 6f 64 65 53 69 7a 65 28 4a 73 6f jsonNodeSize(Jso
2300: 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 29 7b 0a 20 nNode *pNode){.
2310: 20 72 65 74 75 72 6e 20 70 4e 6f 64 65 2d 3e 65 return pNode->e
2320: 54 79 70 65 3e 3d 4a 53 4f 4e 5f 41 52 52 41 59 Type>=JSON_ARRAY
2330: 20 3f 20 70 4e 6f 64 65 2d 3e 6e 2b 31 20 3a 20 ? pNode->n+1 :
2340: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 1;.}../*.** Recl
2350: 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 aim all memory a
2360: 6c 6c 6f 63 61 74 65 64 20 62 79 20 61 20 4a 73 llocated by a Js
2370: 6f 6e 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 20 onParse object.
2380: 20 42 75 74 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64 But do not.** d
2390: 65 6c 65 74 65 20 74 68 65 20 4a 73 6f 6e 50 61 elete the JsonPa
23a0: 72 73 65 20 6f 62 6a 65 63 74 20 69 74 73 65 6c rse object itsel
23b0: 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 f..*/.static voi
23c0: 64 20 6a 73 6f 6e 50 61 72 73 65 52 65 73 65 74 d jsonParseReset
23d0: 28 4a 73 6f 6e 50 61 72 73 65 20 2a 70 50 61 72 (JsonParse *pPar
23e0: 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 se){. sqlite3_f
23f0: 72 65 65 28 70 50 61 72 73 65 2d 3e 61 4e 6f 64 ree(pParse->aNod
2400: 65 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 61 4e e);. pParse->aN
2410: 6f 64 65 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 ode = 0;. pPars
2420: 65 2d 3e 6e 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 e->nNode = 0;.
2430: 70 50 61 72 73 65 2d 3e 6e 41 6c 6c 6f 63 20 3d pParse->nAlloc =
2440: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 0;. sqlite3_fr
2450: 65 65 28 70 50 61 72 73 65 2d 3e 61 55 70 29 3b ee(pParse->aUp);
2460: 0a 20 20 70 50 61 72 73 65 2d 3e 61 55 70 20 3d . pParse->aUp =
2470: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 0;.}../*.** Con
2480: 76 65 72 74 20 74 68 65 20 4a 73 6f 6e 4e 6f 64 vert the JsonNod
2490: 65 20 70 4e 6f 64 65 20 69 6e 74 6f 20 61 20 70 e pNode into a p
24a0: 75 72 65 20 4a 53 4f 4e 20 73 74 72 69 6e 67 20 ure JSON string
24b0: 61 6e 64 0a 2a 2a 20 61 70 70 65 6e 64 20 74 6f and.** append to
24c0: 20 70 4f 75 74 2e 20 20 53 75 62 73 75 62 73 74 pOut. Subsubst
24d0: 72 75 63 74 75 72 65 20 69 73 20 61 6c 73 6f 20 ructure is also
24e0: 69 6e 63 6c 75 64 65 64 2e 20 20 52 65 74 75 72 included. Retur
24f0: 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 n.** the number
2500: 6f 66 20 4a 73 6f 6e 4e 6f 64 65 20 6f 62 6a 65 of JsonNode obje
2510: 63 74 73 20 74 68 61 74 20 61 72 65 20 65 6e 63 cts that are enc
2520: 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 oded..*/.static
2530: 76 6f 69 64 20 6a 73 6f 6e 52 65 6e 64 65 72 4e void jsonRenderN
2540: 6f 64 65 28 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 ode(. JsonNode
2550: 2a 70 4e 6f 64 65 2c 20 20 20 20 20 20 20 20 20 *pNode,
2560: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 6f 64 /* The nod
2570: 65 20 74 6f 20 72 65 6e 64 65 72 20 2a 2f 0a 20 e to render */.
2580: 20 4a 73 6f 6e 53 74 72 69 6e 67 20 2a 70 4f 75 JsonString *pOu
2590: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 t,
25a0: 2f 2a 20 57 72 69 74 65 20 4a 53 4f 4e 20 68 65 /* Write JSON he
25b0: 72 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f re */. sqlite3_
25c0: 76 61 6c 75 65 20 2a 2a 61 52 65 70 6c 61 63 65 value **aReplace
25d0: 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6c 61 63 /* Replac
25e0: 65 6d 65 6e 74 20 76 61 6c 75 65 73 20 2a 2f 0a ement values */.
25f0: 29 7b 0a 20 20 73 77 69 74 63 68 28 20 70 4e 6f ){. switch( pNo
2600: 64 65 2d 3e 65 54 79 70 65 20 29 7b 0a 20 20 20 de->eType ){.
2610: 20 63 61 73 65 20 4a 53 4f 4e 5f 4e 55 4c 4c 3a case JSON_NULL:
2620: 20 7b 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 {. jsonApp
2630: 65 6e 64 52 61 77 28 70 4f 75 74 2c 20 22 6e 75 endRaw(pOut, "nu
2640: 6c 6c 22 2c 20 34 29 3b 0a 20 20 20 20 20 20 62 ll", 4);. b
2650: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 reak;. }.
2660: 63 61 73 65 20 4a 53 4f 4e 5f 54 52 55 45 3a 20 case JSON_TRUE:
2670: 7b 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 {. jsonAppe
2680: 6e 64 52 61 77 28 70 4f 75 74 2c 20 22 74 72 75 ndRaw(pOut, "tru
2690: 65 22 2c 20 34 29 3b 0a 20 20 20 20 20 20 62 72 e", 4);. br
26a0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 eak;. }. c
26b0: 61 73 65 20 4a 53 4f 4e 5f 46 41 4c 53 45 3a 20 ase JSON_FALSE:
26c0: 7b 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 {. jsonAppe
26d0: 6e 64 52 61 77 28 70 4f 75 74 2c 20 22 66 61 6c ndRaw(pOut, "fal
26e0: 73 65 22 2c 20 35 29 3b 0a 20 20 20 20 20 20 62 se", 5);. b
26f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 reak;. }.
2700: 63 61 73 65 20 4a 53 4f 4e 5f 53 54 52 49 4e 47 case JSON_STRING
2710: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4e : {. if( pN
2720: 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73 20 26 20 4a ode->jnFlags & J
2730: 4e 4f 44 45 5f 52 41 57 20 29 7b 0a 20 20 20 20 NODE_RAW ){.
2740: 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 53 74 jsonAppendSt
2750: 72 69 6e 67 28 70 4f 75 74 2c 20 70 4e 6f 64 65 ring(pOut, pNode
2760: 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 2c 20 70 ->u.zJContent, p
2770: 4e 6f 64 65 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 Node->n);.
2780: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d break;. }
2790: 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 . /* Fall t
27a0: 68 72 6f 75 67 68 20 69 6e 74 6f 20 74 68 65 20 hrough into the
27b0: 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 next case */.
27c0: 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 53 4f 4e }. case JSON
27d0: 5f 52 45 41 4c 3a 0a 20 20 20 20 63 61 73 65 20 _REAL:. case
27e0: 4a 53 4f 4e 5f 49 4e 54 3a 20 7b 0a 20 20 20 20 JSON_INT: {.
27f0: 20 20 6a 73 6f 6e 41 70 70 65 6e 64 52 61 77 28 jsonAppendRaw(
2800: 70 4f 75 74 2c 20 70 4e 6f 64 65 2d 3e 75 2e 7a pOut, pNode->u.z
2810: 4a 43 6f 6e 74 65 6e 74 2c 20 70 4e 6f 64 65 2d JContent, pNode-
2820: 3e 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b >n);. break
2830: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 ;. }. case
2840: 20 4a 53 4f 4e 5f 41 52 52 41 59 3a 20 7b 0a 20 JSON_ARRAY: {.
2850: 20 20 20 20 20 75 33 32 20 6a 20 3d 20 31 3b 0a u32 j = 1;.
2860: 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 jsonAppend
2870: 43 68 61 72 28 70 4f 75 74 2c 20 27 5b 27 29 3b Char(pOut, '[');
2880: 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a . for(;;){.
2890: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a while( j
28a0: 3c 3d 70 4e 6f 64 65 2d 3e 6e 20 29 7b 0a 20 20 <=pNode->n ){.
28b0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 6f 64 if( pNod
28c0: 65 5b 6a 5d 2e 6a 6e 46 6c 61 67 73 20 26 20 28 e[j].jnFlags & (
28d0: 4a 4e 4f 44 45 5f 52 45 4d 4f 56 45 7c 4a 4e 4f JNODE_REMOVE|JNO
28e0: 44 45 5f 52 45 50 4c 41 43 45 29 20 29 7b 0a 20 DE_REPLACE) ){.
28f0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 if( p
2900: 4e 6f 64 65 5b 6a 5d 2e 6a 6e 46 6c 61 67 73 20 Node[j].jnFlags
2910: 26 20 4a 4e 4f 44 45 5f 52 45 50 4c 41 43 45 20 & JNODE_REPLACE
2920: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ){.
2930: 20 6a 73 6f 6e 41 70 70 65 6e 64 53 65 70 61 72 jsonAppendSepar
2940: 61 74 6f 72 28 70 4f 75 74 29 3b 0a 20 20 20 20 ator(pOut);.
2950: 20 20 20 20 20 20 20 20 20 20 6a 73 6f 6e 41 70 jsonAp
2960: 70 65 6e 64 56 61 6c 75 65 28 70 4f 75 74 2c 20 pendValue(pOut,
2970: 61 52 65 70 6c 61 63 65 5b 70 4e 6f 64 65 5b 6a aReplace[pNode[j
2980: 5d 2e 69 56 61 6c 5d 29 3b 0a 20 20 20 20 20 20 ].iVal]);.
2990: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 }.
29a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 }else{.
29b0: 20 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 53 jsonAppendS
29c0: 65 70 61 72 61 74 6f 72 28 70 4f 75 74 29 3b 0a eparator(pOut);.
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 6a 73 6f 6e json
29e0: 52 65 6e 64 65 72 4e 6f 64 65 28 26 70 4e 6f 64 RenderNode(&pNod
29f0: 65 5b 6a 5d 2c 20 70 4f 75 74 2c 20 61 52 65 70 e[j], pOut, aRep
2a00: 6c 61 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20 lace);.
2a10: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6a 20 2b }. j +
2a20: 3d 20 6a 73 6f 6e 4e 6f 64 65 53 69 7a 65 28 26 = jsonNodeSize(&
2a30: 70 4e 6f 64 65 5b 6a 5d 29 3b 0a 20 20 20 20 20 pNode[j]);.
2a40: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 }. if(
2a50: 20 28 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73 (pNode->jnFlags
2a60: 20 26 20 4a 4e 4f 44 45 5f 41 50 50 45 4e 44 29 & JNODE_APPEND)
2a70: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 ==0 ) break;.
2a80: 20 20 20 20 20 70 4e 6f 64 65 20 3d 20 26 70 4e pNode = &pN
2a90: 6f 64 65 5b 70 4e 6f 64 65 2d 3e 75 2e 69 41 70 ode[pNode->u.iAp
2aa0: 70 65 6e 64 5d 3b 0a 20 20 20 20 20 20 20 20 6a pend];. j
2ab0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 = 1;. }.
2ac0: 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68 jsonAppendCh
2ad0: 61 72 28 70 4f 75 74 2c 20 27 5d 27 29 3b 0a 20 ar(pOut, ']');.
2ae0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 break;.
2af0: 7d 0a 20 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f }. case JSON_
2b00: 4f 42 4a 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 OBJECT: {.
2b10: 75 33 32 20 6a 20 3d 20 31 3b 0a 20 20 20 20 20 u32 j = 1;.
2b20: 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61 72 28 jsonAppendChar(
2b30: 70 4f 75 74 2c 20 27 7b 27 29 3b 0a 20 20 20 20 pOut, '{');.
2b40: 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 for(;;){.
2b50: 20 20 20 77 68 69 6c 65 28 20 6a 3c 3d 70 4e 6f while( j<=pNo
2b60: 64 65 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20 20 de->n ){.
2b70: 20 20 20 69 66 28 20 28 70 4e 6f 64 65 5b 6a 2b if( (pNode[j+
2b80: 31 5d 2e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 1].jnFlags & JNO
2b90: 44 45 5f 52 45 4d 4f 56 45 29 3d 3d 30 20 29 7b DE_REMOVE)==0 ){
2ba0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 73 6f . jso
2bb0: 6e 41 70 70 65 6e 64 53 65 70 61 72 61 74 6f 72 nAppendSeparator
2bc0: 28 70 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 (pOut);.
2bd0: 20 20 20 20 6a 73 6f 6e 52 65 6e 64 65 72 4e 6f jsonRenderNo
2be0: 64 65 28 26 70 4e 6f 64 65 5b 6a 5d 2c 20 70 4f de(&pNode[j], pO
2bf0: 75 74 2c 20 61 52 65 70 6c 61 63 65 29 3b 0a 20 ut, aReplace);.
2c00: 20 20 20 20 20 20 20 20 20 20 20 6a 73 6f 6e 41 jsonA
2c10: 70 70 65 6e 64 43 68 61 72 28 70 4f 75 74 2c 20 ppendChar(pOut,
2c20: 27 3a 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 ':');.
2c30: 20 20 69 66 28 20 70 4e 6f 64 65 5b 6a 2b 31 5d if( pNode[j+1]
2c40: 2e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 .jnFlags & JNODE
2c50: 5f 52 45 50 4c 41 43 45 20 29 7b 0a 20 20 20 20 _REPLACE ){.
2c60: 20 20 20 20 20 20 20 20 20 20 6a 73 6f 6e 41 70 jsonAp
2c70: 70 65 6e 64 56 61 6c 75 65 28 70 4f 75 74 2c 20 pendValue(pOut,
2c80: 61 52 65 70 6c 61 63 65 5b 70 4e 6f 64 65 5b 6a aReplace[pNode[j
2c90: 2b 31 5d 2e 69 56 61 6c 5d 29 3b 0a 20 20 20 20 +1].iVal]);.
2ca0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 }else{.
2cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 73 6f jso
2cc0: 6e 52 65 6e 64 65 72 4e 6f 64 65 28 26 70 4e 6f nRenderNode(&pNo
2cd0: 64 65 5b 6a 2b 31 5d 2c 20 70 4f 75 74 2c 20 61 de[j+1], pOut, a
2ce0: 52 65 70 6c 61 63 65 29 3b 0a 20 20 20 20 20 20 Replace);.
2cf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 }.
2d00: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6a 20 }. j
2d10: 2b 3d 20 31 20 2b 20 6a 73 6f 6e 4e 6f 64 65 53 += 1 + jsonNodeS
2d20: 69 7a 65 28 26 70 4e 6f 64 65 5b 6a 2b 31 5d 29 ize(&pNode[j+1])
2d30: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 ;. }.
2d40: 20 20 20 20 69 66 28 20 28 70 4e 6f 64 65 2d 3e if( (pNode->
2d50: 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 5f jnFlags & JNODE_
2d60: 41 50 50 45 4e 44 29 3d 3d 30 20 29 20 62 72 65 APPEND)==0 ) bre
2d70: 61 6b 3b 0a 20 20 20 20 20 20 20 20 70 4e 6f 64 ak;. pNod
2d80: 65 20 3d 20 26 70 4e 6f 64 65 5b 70 4e 6f 64 65 e = &pNode[pNode
2d90: 2d 3e 75 2e 69 41 70 70 65 6e 64 5d 3b 0a 20 20 ->u.iAppend];.
2da0: 20 20 20 20 20 20 6a 20 3d 20 31 3b 0a 20 20 20 j = 1;.
2db0: 20 20 20 7d 0a 20 20 20 20 20 20 6a 73 6f 6e 41 }. jsonA
2dc0: 70 70 65 6e 64 43 68 61 72 28 70 4f 75 74 2c 20 ppendChar(pOut,
2dd0: 27 7d 27 29 3b 0a 20 20 20 20 20 20 62 72 65 61 '}');. brea
2de0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a k;. }. }.}..
2df0: 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 74 68 65 20 4a /*.** Make the J
2e00: 73 6f 6e 4e 6f 64 65 20 74 68 65 20 72 65 74 75 sonNode the retu
2e10: 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 rn value of the
2e20: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 function..*/.sta
2e30: 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 52 65 74 tic void jsonRet
2e40: 75 72 6e 28 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 urn(. JsonNode
2e50: 2a 70 4e 6f 64 65 2c 20 20 20 20 20 20 20 20 20 *pNode,
2e60: 20 20 20 2f 2a 20 4e 6f 64 65 20 74 6f 20 72 65 /* Node to re
2e70: 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 turn */. sqlite
2e80: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 3_context *pCtx,
2e90: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 /* Return
2ea0: 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 66 value for this f
2eb0: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c unction */. sql
2ec0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 52 65 ite3_value **aRe
2ed0: 70 6c 61 63 65 20 20 20 20 2f 2a 20 41 72 72 61 place /* Arra
2ee0: 79 20 6f 66 20 72 65 70 6c 61 63 65 6d 65 6e 74 y of replacement
2ef0: 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 values */.){.
2f00: 73 77 69 74 63 68 28 20 70 4e 6f 64 65 2d 3e 65 switch( pNode->e
2f10: 54 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 Type ){. case
2f20: 20 4a 53 4f 4e 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 JSON_NULL: {.
2f30: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 sqlite3_resu
2f40: 6c 74 5f 6e 75 6c 6c 28 70 43 74 78 29 3b 0a 20 lt_null(pCtx);.
2f50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 break;.
2f60: 7d 0a 20 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f }. case JSON_
2f70: 54 52 55 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 TRUE: {. sq
2f80: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 lite3_result_int
2f90: 28 70 43 74 78 2c 20 31 29 3b 0a 20 20 20 20 20 (pCtx, 1);.
2fa0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 break;. }.
2fb0: 20 20 63 61 73 65 20 4a 53 4f 4e 5f 46 41 4c 53 case JSON_FALS
2fc0: 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 E: {. sqlit
2fd0: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 70 43 e3_result_int(pC
2fe0: 74 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 tx, 0);. br
2ff0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 eak;. }. c
3000: 61 73 65 20 4a 53 4f 4e 5f 52 45 41 4c 3a 20 7b ase JSON_REAL: {
3010: 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 20 . double r
3020: 3d 20 73 74 72 74 6f 64 28 70 4e 6f 64 65 2d 3e = strtod(pNode->
3030: 75 2e 7a 4a 43 6f 6e 74 65 6e 74 2c 20 30 29 3b u.zJContent, 0);
3040: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 . sqlite3_r
3050: 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 70 43 74 esult_double(pCt
3060: 78 2c 20 72 29 3b 0a 20 20 20 20 20 20 62 72 65 x, r);. bre
3070: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 ak;. }. ca
3080: 73 65 20 4a 53 4f 4e 5f 49 4e 54 3a 20 7b 0a 20 se JSON_INT: {.
3090: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 sqlite3_int
30a0: 36 34 20 69 20 3d 20 30 3b 0a 20 20 20 20 20 20 64 i = 0;.
30b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 const char *z =
30c0: 70 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 pNode->u.zJConte
30d0: 6e 74 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b nt;. if( z[
30e0: 30 5d 3d 3d 27 2d 27 20 29 7b 20 7a 2b 2b 3b 20 0]=='-' ){ z++;
30f0: 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a }. while( z
3100: 5b 30 5d 3e 3d 27 30 27 20 26 26 20 7a 5b 30 5d [0]>='0' && z[0]
3110: 3c 3d 27 39 27 20 29 7b 20 69 20 3d 20 69 2a 31 <='9' ){ i = i*1
3120: 30 20 2b 20 2a 28 7a 2b 2b 29 20 2d 20 27 30 27 0 + *(z++) - '0'
3130: 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4e ; }. if( pN
3140: 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 ode->u.zJContent
3150: 5b 30 5d 3d 3d 27 2d 27 20 29 7b 20 69 20 3d 20 [0]=='-' ){ i =
3160: 2d 69 3b 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 -i; }. sqli
3170: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 te3_result_int64
3180: 28 70 43 74 78 2c 20 69 29 3b 0a 20 20 20 20 20 (pCtx, i);.
3190: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 break;. }.
31a0: 20 20 63 61 73 65 20 4a 53 4f 4e 5f 53 54 52 49 case JSON_STRI
31b0: 4e 47 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 NG: {. if(
31c0: 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73 20 26 pNode->jnFlags &
31d0: 20 4a 4e 4f 44 45 5f 52 41 57 20 29 7b 0a 20 20 JNODE_RAW ){.
31e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 sqlite3_re
31f0: 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20 sult_text(pCtx,
3200: 70 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 pNode->u.zJConte
3210: 6e 74 2c 20 70 4e 6f 64 65 2d 3e 6e 2c 0a 20 20 nt, pNode->n,.
3220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3230: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 SQLITE
3240: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 _TRANSIENT);.
3250: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4e }else if( (pN
3260: 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73 20 26 20 4a ode->jnFlags & J
3270: 4e 4f 44 45 5f 45 53 43 41 50 45 29 3d 3d 30 20 NODE_ESCAPE)==0
3280: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4a 53 ){. /* JS
3290: 4f 4e 20 66 6f 72 6d 61 74 74 65 64 20 77 69 74 ON formatted wit
32a0: 68 6f 75 74 20 61 6e 79 20 62 61 63 6b 73 6c 61 hout any backsla
32b0: 73 68 2d 65 73 63 61 70 65 73 20 2a 2f 0a 20 20 sh-escapes */.
32c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 sqlite3_re
32d0: 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20 sult_text(pCtx,
32e0: 70 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 pNode->u.zJConte
32f0: 6e 74 2b 31 2c 20 70 4e 6f 64 65 2d 3e 6e 2d 32 nt+1, pNode->n-2
3300: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
3310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 SQ
3320: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b LITE_TRANSIENT);
3330: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 . }else{.
3340: 20 20 20 20 20 20 2f 2a 20 54 72 61 6e 73 6c 61 /* Transla
3350: 74 65 20 4a 53 4f 4e 20 66 6f 72 6d 61 74 74 65 te JSON formatte
3360: 64 20 73 74 72 69 6e 67 20 69 6e 74 6f 20 72 61 d string into ra
3370: 77 20 74 65 78 74 20 2a 2f 0a 20 20 20 20 20 20 w text */.
3380: 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20 u32 i;.
3390: 20 75 33 32 20 6e 20 3d 20 70 4e 6f 64 65 2d 3e u32 n = pNode->
33a0: 6e 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 n;. const
33b0: 20 63 68 61 72 20 2a 7a 20 3d 20 70 4e 6f 64 65 char *z = pNode
33c0: 2d 3e 75 2e 7a 4a 43 6f 6e 74 65 6e 74 3b 0a 20 ->u.zJContent;.
33d0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4f 75 char *zOu
33e0: 74 3b 0a 20 20 20 20 20 20 20 20 75 33 32 20 6a t;. u32 j
33f0: 3b 0a 20 20 20 20 20 20 20 20 7a 4f 75 74 20 3d ;. zOut =
3400: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 sqlite3_malloc(
3410: 20 6e 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 n+1 );.
3420: 69 66 28 20 7a 4f 75 74 3d 3d 30 20 29 7b 0a 20 if( zOut==0 ){.
3430: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 sqlite3
3440: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f _result_error_no
3450: 6d 65 6d 28 70 43 74 78 29 3b 0a 20 20 20 20 20 mem(pCtx);.
3460: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 break;.
3470: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f }. fo
3480: 72 28 69 3d 31 2c 20 6a 3d 30 3b 20 69 3c 6e 2d r(i=1, j=0; i<n-
3490: 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 1; i++){.
34a0: 20 20 20 63 68 61 72 20 63 20 3d 20 7a 5b 69 5d char c = z[i]
34b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 ;. if(
34c0: 63 21 3d 27 5c 5c 27 20 26 26 20 7a 5b 69 2b 31 c!='\\' && z[i+1
34d0: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 ] ){.
34e0: 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a zOut[j++] = c;.
34f0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b }else{
3500: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 20 3d . c =
3510: 20 7a 5b 2b 2b 69 5d 3b 0a 20 20 20 20 20 20 20 z[++i];.
3520: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 75 27 20 if( c=='u'
3530: 26 26 20 7a 5b 31 5d 20 29 7b 0a 20 20 20 20 20 && z[1] ){.
3540: 20 20 20 20 20 20 20 20 20 75 33 32 20 76 20 3d u32 v =
3550: 20 30 2c 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 0, k;.
3560: 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 z++;.
3570: 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b for(k=0;
3580: 20 6b 3c 34 20 26 26 20 7a 5b 6b 5d 3b 20 6b 2b k<4 && z[k]; k+
3590: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 +){.
35a0: 20 20 20 20 63 20 3d 20 7a 5b 30 5d 3b 0a 20 20 c = z[0];.
35b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 if
35c0: 28 20 63 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27 ( c>='0' && c<='
35d0: 39 27 20 29 20 76 20 3d 20 76 2a 31 36 20 2b 20 9' ) v = v*16 +
35e0: 63 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 20 c - '0';.
35f0: 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 else if
3600: 28 20 63 3e 3d 27 41 27 20 26 26 20 63 3c 3d 27 ( c>='A' && c<='
3610: 46 27 20 29 20 76 20 3d 20 76 2a 31 36 20 2b 20 F' ) v = v*16 +
3620: 63 20 2d 20 27 41 27 20 2b 20 31 30 3b 0a 20 20 c - 'A' + 10;.
3630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6c el
3640: 73 65 20 69 66 28 20 63 3e 3d 27 61 27 20 26 26 se if( c>='a' &&
3650: 20 63 3c 3d 27 66 27 20 29 20 76 20 3d 20 76 2a c<='f' ) v = v*
3660: 31 36 20 2b 20 63 20 2d 20 27 61 27 20 2b 20 31 16 + c - 'a' + 1
3670: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 0;.
3680: 20 20 20 65 6c 73 65 20 62 72 65 61 6b 3b 0a 20 else break;.
3690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a z
36a0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 ++;.
36b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 }.
36c0: 20 20 69 66 28 20 76 3c 3d 30 78 37 66 20 29 7b if( v<=0x7f ){
36d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
36e0: 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 76 3b 0a zOut[j++] = v;.
36f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 }e
3700: 6c 73 65 20 69 66 28 20 76 3c 3d 30 78 37 66 66 lse if( v<=0x7ff
3710: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 ){.
3720: 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 zOut[j++] =
3730: 30 78 63 30 20 7c 20 28 76 3e 3e 36 29 3b 0a 20 0xc0 | (v>>6);.
3740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a z
3750: 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 30 78 38 30 20 Out[j++] = 0x80
3760: 7c 20 28 76 26 30 78 33 66 29 3b 0a 20 20 20 20 | (v&0x3f);.
3770: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 }else
3780: 69 66 28 20 76 3c 3d 30 78 66 66 66 66 20 29 7b if( v<=0xffff ){
3790: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
37a0: 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 30 78 65 zOut[j++] = 0xe
37b0: 30 20 7c 20 28 76 3e 3e 31 32 29 3b 0a 20 20 20 0 | (v>>12);.
37c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4f 75 zOu
37d0: 74 5b 6a 2b 2b 5d 20 3d 20 30 78 38 30 20 7c 20 t[j++] = 0x80 |
37e0: 28 28 76 3e 3e 36 29 26 30 78 33 66 29 3b 0a 20 ((v>>6)&0x3f);.
37f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a z
3800: 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 30 78 38 30 20 Out[j++] = 0x80
3810: 7c 20 28 76 26 30 78 33 66 29 3b 0a 20 20 20 20 | (v&0x3f);.
3820: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 }else
3830: 69 66 28 20 76 3c 3d 30 78 31 30 66 66 66 66 20 if( v<=0x10ffff
3840: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ){.
3850: 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 30 zOut[j++] = 0
3860: 78 66 30 20 7c 20 28 76 3e 3e 31 38 29 3b 0a 20 xf0 | (v>>18);.
3870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a z
3880: 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 30 78 38 30 20 Out[j++] = 0x80
3890: 7c 20 28 28 76 3e 3e 31 32 29 26 30 78 33 66 29 | ((v>>12)&0x3f)
38a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;.
38b0: 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 30 78 zOut[j++] = 0x
38c0: 38 30 20 7c 20 28 28 76 3e 3e 36 29 26 30 78 33 80 | ((v>>6)&0x3
38d0: 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 f);.
38e0: 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 zOut[j++] =
38f0: 30 78 38 30 20 7c 20 28 76 26 30 78 33 66 29 3b 0x80 | (v&0x3f);
3900: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d . }
3910: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c . }el
3920: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 se{.
3930: 20 20 69 66 28 20 63 3d 3d 27 62 27 20 29 7b 0a if( c=='b' ){.
3940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3950: 63 20 3d 20 27 5c 62 27 3b 0a 20 20 20 20 20 20 c = '\b';.
3960: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 }else if
3970: 28 20 63 3d 3d 27 66 27 20 29 7b 0a 20 20 20 20 ( c=='f' ){.
3980: 20 20 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 c =
3990: 27 5c 66 27 3b 0a 20 20 20 20 20 20 20 20 20 20 '\f';.
39a0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d }else if( c=
39b0: 3d 27 6e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 ='n' ){.
39c0: 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 6e 27 c = '\n'
39d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;.
39e0: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 72 27 }else if( c=='r'
39f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 ){.
3a00: 20 20 20 20 63 20 3d 20 27 5c 72 27 3b 0a 20 20 c = '\r';.
3a10: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 }els
3a20: 65 20 69 66 28 20 63 3d 3d 27 74 27 20 29 7b 0a e if( c=='t' ){.
3a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3a40: 63 20 3d 20 27 5c 74 27 3b 0a 20 20 20 20 20 20 c = '\t';.
3a50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
3a60: 20 20 20 20 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b zOut[j++
3a70: 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20 ] = c;.
3a80: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d }. }
3a90: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 . }.
3aa0: 20 20 20 7a 4f 75 74 5b 6a 5d 20 3d 20 30 3b 0a zOut[j] = 0;.
3ab0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f sqlite3_
3ac0: 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 result_text(pCtx
3ad0: 2c 20 7a 4f 75 74 2c 20 6a 2c 20 73 71 6c 69 74 , zOut, j, sqlit
3ae0: 65 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 20 20 e3_free);.
3af0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 }. break;.
3b00: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 53 }. case JS
3b10: 4f 4e 5f 41 52 52 41 59 3a 0a 20 20 20 20 63 61 ON_ARRAY:. ca
3b20: 73 65 20 4a 53 4f 4e 5f 4f 42 4a 45 43 54 3a 20 se JSON_OBJECT:
3b30: 7b 0a 20 20 20 20 20 20 4a 73 6f 6e 53 74 72 69 {. JsonStri
3b40: 6e 67 20 73 3b 0a 20 20 20 20 20 20 6a 73 6f 6e ng s;. json
3b50: 49 6e 69 74 28 26 73 2c 20 70 43 74 78 29 3b 0a Init(&s, pCtx);.
3b60: 20 20 20 20 20 20 6a 73 6f 6e 52 65 6e 64 65 72 jsonRender
3b70: 4e 6f 64 65 28 70 4e 6f 64 65 2c 20 26 73 2c 20 Node(pNode, &s,
3b80: 61 52 65 70 6c 61 63 65 29 3b 0a 20 20 20 20 20 aReplace);.
3b90: 20 6a 73 6f 6e 52 65 73 75 6c 74 28 26 73 29 3b jsonResult(&s);
3ba0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 . break;.
3bb0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a }. }.}../*.**
3bc0: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 4a 73 Create a new Js
3bd0: 6f 6e 4e 6f 64 65 20 69 6e 73 74 61 6e 63 65 20 onNode instance
3be0: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 61 72 67 based on the arg
3bf0: 75 6d 65 6e 74 73 20 61 6e 64 20 61 70 70 65 6e uments and appen
3c00: 64 20 74 68 61 74 0a 2a 2a 20 69 6e 73 74 61 6e d that.** instan
3c10: 63 65 20 74 6f 20 74 68 65 20 4a 73 6f 6e 50 61 ce to the JsonPa
3c20: 72 73 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 rse. Return the
3c30: 20 69 6e 64 65 78 20 69 6e 20 70 50 61 72 73 65 index in pParse
3c40: 2d 3e 61 4e 6f 64 65 5b 5d 20 6f 66 20 74 68 65 ->aNode[] of the
3c50: 0a 2a 2a 20 6e 65 77 20 6e 6f 64 65 2c 20 6f 72 .** new node, or
3c60: 20 2d 31 20 69 66 20 61 20 6d 65 6d 6f 72 79 20 -1 if a memory
3c70: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 allocation fails
3c80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 ..*/.static int
3c90: 6a 73 6f 6e 50 61 72 73 65 41 64 64 4e 6f 64 65 jsonParseAddNode
3ca0: 28 0a 20 20 4a 73 6f 6e 50 61 72 73 65 20 2a 70 (. JsonParse *p
3cb0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a Parse, /*
3cc0: 20 41 70 70 65 6e 64 20 74 68 65 20 6e 6f 64 65 Append the node
3cd0: 20 74 6f 20 74 68 69 73 20 6f 62 6a 65 63 74 20 to this object
3ce0: 2a 2f 0a 20 20 75 33 32 20 65 54 79 70 65 2c 20 */. u32 eType,
3cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
3d00: 2a 20 4e 6f 64 65 20 74 79 70 65 20 2a 2f 0a 20 * Node type */.
3d10: 20 75 33 32 20 6e 2c 20 20 20 20 20 20 20 20 20 u32 n,
3d20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f /* Co
3d30: 6e 74 65 6e 74 20 73 69 7a 65 20 6f 72 20 73 75 ntent size or su
3d40: 62 2d 6e 6f 64 65 20 63 6f 75 6e 74 20 2a 2f 0a b-node count */.
3d50: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 const char *zC
3d60: 6f 6e 74 65 6e 74 20 20 20 20 20 20 2f 2a 20 43 ontent /* C
3d70: 6f 6e 74 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 4a ontent */.){. J
3d80: 73 6f 6e 4e 6f 64 65 20 2a 70 3b 0a 20 20 69 66 sonNode *p;. if
3d90: 28 20 70 50 61 72 73 65 2d 3e 6e 4e 6f 64 65 3e ( pParse->nNode>
3da0: 3d 70 50 61 72 73 65 2d 3e 6e 41 6c 6c 6f 63 20 =pParse->nAlloc
3db0: 29 7b 0a 20 20 20 20 75 33 32 20 6e 4e 65 77 3b ){. u32 nNew;
3dc0: 0a 20 20 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 . JsonNode *p
3dd0: 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 70 50 61 New;. if( pPa
3de0: 72 73 65 2d 3e 6f 6f 6d 20 29 20 72 65 74 75 72 rse->oom ) retur
3df0: 6e 20 2d 31 3b 0a 20 20 20 20 6e 4e 65 77 20 3d n -1;. nNew =
3e00: 20 70 50 61 72 73 65 2d 3e 6e 41 6c 6c 6f 63 2a pParse->nAlloc*
3e10: 32 20 2b 20 31 30 3b 0a 20 20 20 20 69 66 28 20 2 + 10;. if(
3e20: 6e 4e 65 77 3c 3d 70 50 61 72 73 65 2d 3e 6e 4e nNew<=pParse->nN
3e30: 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 ode ){. pPa
3e40: 72 73 65 2d 3e 6f 6f 6d 20 3d 20 31 3b 0a 20 20 rse->oom = 1;.
3e50: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 return -1;.
3e60: 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 20 3d 20 }. pNew =
3e70: 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 sqlite3_realloc(
3e80: 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65 2c 20 73 pParse->aNode, s
3e90: 69 7a 65 6f 66 28 4a 73 6f 6e 4e 6f 64 65 29 2a izeof(JsonNode)*
3ea0: 6e 4e 65 77 29 3b 0a 20 20 20 20 69 66 28 20 70 nNew);. if( p
3eb0: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 New==0 ){.
3ec0: 70 50 61 72 73 65 2d 3e 6f 6f 6d 20 3d 20 31 3b pParse->oom = 1;
3ed0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 . return -1
3ee0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 ;. }. pPar
3ef0: 73 65 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 4e 65 se->nAlloc = nNe
3f00: 77 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61 w;. pParse->a
3f10: 4e 6f 64 65 20 3d 20 70 4e 65 77 3b 0a 20 20 7d Node = pNew;. }
3f20: 0a 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e . p = &pParse->
3f30: 61 4e 6f 64 65 5b 70 50 61 72 73 65 2d 3e 6e 4e aNode[pParse->nN
3f40: 6f 64 65 5d 3b 0a 20 20 70 2d 3e 65 54 79 70 65 ode];. p->eType
3f50: 20 3d 20 28 75 38 29 65 54 79 70 65 3b 0a 20 20 = (u8)eType;.
3f60: 70 2d 3e 6a 6e 46 6c 61 67 73 20 3d 20 30 3b 0a p->jnFlags = 0;.
3f70: 20 20 70 2d 3e 69 56 61 6c 20 3d 20 30 3b 0a 20 p->iVal = 0;.
3f80: 20 70 2d 3e 6e 20 3d 20 6e 3b 0a 20 20 70 2d 3e p->n = n;. p->
3f90: 75 2e 7a 4a 43 6f 6e 74 65 6e 74 20 3d 20 7a 43 u.zJContent = zC
3fa0: 6f 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e ontent;. return
3fb0: 20 70 50 61 72 73 65 2d 3e 6e 4e 6f 64 65 2b 2b pParse->nNode++
3fc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 ;.}../*.** Parse
3fd0: 20 61 20 73 69 6e 67 6c 65 20 4a 53 4f 4e 20 76 a single JSON v
3fe0: 61 6c 75 65 20 77 68 69 63 68 20 62 65 67 69 6e alue which begin
3ff0: 73 20 61 74 20 70 50 61 72 73 65 2d 3e 7a 4a 73 s at pParse->zJs
4000: 6f 6e 5b 69 5d 2e 20 20 52 65 74 75 72 6e 20 74 on[i]. Return t
4010: 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 he.** index of t
4020: 68 65 20 66 69 72 73 74 20 63 68 61 72 61 63 74 he first charact
4030: 65 72 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 er past the end
4040: 6f 66 20 74 68 65 20 76 61 6c 75 65 20 70 61 72 of the value par
4050: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 sed..**.** Retur
4060: 6e 20 6e 65 67 61 74 69 76 65 20 66 6f 72 20 61 n negative for a
4070: 20 73 79 6e 74 61 78 20 65 72 72 6f 72 2e 20 20 syntax error.
4080: 53 70 65 63 69 61 6c 20 63 61 73 65 73 3a 20 20 Special cases:
4090: 72 65 74 75 72 6e 20 2d 32 20 69 66 20 74 68 65 return -2 if the
40a0: 0a 2a 2a 20 66 69 72 73 74 20 6e 6f 6e 2d 77 68 .** first non-wh
40b0: 69 74 65 73 70 61 63 65 20 63 68 61 72 61 63 74 itespace charact
40c0: 65 72 20 69 73 20 27 7d 27 20 61 6e 64 20 72 65 er is '}' and re
40d0: 74 75 72 6e 20 2d 33 20 69 66 20 74 68 65 20 66 turn -3 if the f
40e0: 69 72 73 74 0a 2a 2a 20 6e 6f 6e 2d 77 68 69 74 irst.** non-whit
40f0: 65 73 70 61 63 65 20 63 68 61 72 61 63 74 65 72 espace character
4100: 20 69 73 20 27 5d 27 2e 0a 2a 2f 0a 73 74 61 74 is ']'..*/.stat
4110: 69 63 20 69 6e 74 20 6a 73 6f 6e 50 61 72 73 65 ic int jsonParse
4120: 56 61 6c 75 65 28 4a 73 6f 6e 50 61 72 73 65 20 Value(JsonParse
4130: 2a 70 50 61 72 73 65 2c 20 75 33 32 20 69 29 7b *pParse, u32 i){
4140: 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 75 33 32 . char c;. u32
4150: 20 6a 3b 0a 20 20 75 33 32 20 69 54 68 69 73 3b j;. u32 iThis;
4160: 0a 20 20 69 6e 74 20 78 3b 0a 20 20 77 68 69 6c . int x;. whil
4170: 65 28 20 69 73 73 70 61 63 65 28 70 50 61 72 73 e( isspace(pPars
4180: 65 2d 3e 7a 4a 73 6f 6e 5b 69 5d 29 20 29 7b 20 e->zJson[i]) ){
4190: 69 2b 2b 3b 20 7d 0a 20 20 69 66 28 20 28 63 20 i++; }. if( (c
41a0: 3d 20 70 50 61 72 73 65 2d 3e 7a 4a 73 6f 6e 5b = pParse->zJson[
41b0: 69 5d 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 i])==0 ) return
41c0: 30 3b 0a 20 20 69 66 28 20 63 3d 3d 27 7b 27 20 0;. if( c=='{'
41d0: 29 7b 0a 20 20 20 20 2f 2a 20 50 61 72 73 65 20 ){. /* Parse
41e0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69 54 object */. iT
41f0: 68 69 73 20 3d 20 6a 73 6f 6e 50 61 72 73 65 41 his = jsonParseA
4200: 64 64 4e 6f 64 65 28 70 50 61 72 73 65 2c 20 4a ddNode(pParse, J
4210: 53 4f 4e 5f 4f 42 4a 45 43 54 2c 20 30 2c 20 30 SON_OBJECT, 0, 0
4220: 29 3b 0a 20 20 20 20 69 66 28 20 69 54 68 69 73 );. if( iThis
4230: 3c 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a <0 ) return -1;.
4240: 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 3b 6a for(j=i+1;;j
4250: 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 ++){. while
4260: 28 20 69 73 73 70 61 63 65 28 70 50 61 72 73 65 ( isspace(pParse
4270: 2d 3e 7a 4a 73 6f 6e 5b 6a 5d 29 20 29 7b 20 6a ->zJson[j]) ){ j
4280: 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 78 20 3d 20 ++; }. x =
4290: 6a 73 6f 6e 50 61 72 73 65 56 61 6c 75 65 28 70 jsonParseValue(p
42a0: 50 61 72 73 65 2c 20 6a 29 3b 0a 20 20 20 20 20 Parse, j);.
42b0: 20 69 66 28 20 78 3c 30 20 29 7b 0a 20 20 20 20 if( x<0 ){.
42c0: 20 20 20 20 69 66 28 20 78 3d 3d 28 2d 32 29 20 if( x==(-2)
42d0: 26 26 20 70 50 61 72 73 65 2d 3e 6e 4e 6f 64 65 && pParse->nNode
42e0: 3d 3d 69 54 68 69 73 2b 31 20 29 20 72 65 74 75 ==iThis+1 ) retu
42f0: 72 6e 20 6a 2b 31 3b 0a 20 20 20 20 20 20 20 20 rn j+1;.
4300: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 return -1;.
4310: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 }. if( pPa
4320: 72 73 65 2d 3e 61 4e 6f 64 65 5b 70 50 61 72 73 rse->aNode[pPars
4330: 65 2d 3e 6e 4e 6f 64 65 2d 31 5d 2e 65 54 79 70 e->nNode-1].eTyp
4340: 65 21 3d 4a 53 4f 4e 5f 53 54 52 49 4e 47 20 29 e!=JSON_STRING )
4350: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 return -1;.
4360: 20 20 6a 20 3d 20 78 3b 0a 20 20 20 20 20 20 77 j = x;. w
4370: 68 69 6c 65 28 20 69 73 73 70 61 63 65 28 70 50 hile( isspace(pP
4380: 61 72 73 65 2d 3e 7a 4a 73 6f 6e 5b 6a 5d 29 20 arse->zJson[j])
4390: 29 7b 20 6a 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 ){ j++; }.
43a0: 69 66 28 20 70 50 61 72 73 65 2d 3e 7a 4a 73 6f if( pParse->zJso
43b0: 6e 5b 6a 5d 21 3d 27 3a 27 20 29 20 72 65 74 75 n[j]!=':' ) retu
43c0: 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 6a 2b 2b rn -1;. j++
43d0: 3b 0a 20 20 20 20 20 20 78 20 3d 20 6a 73 6f 6e ;. x = json
43e0: 50 61 72 73 65 56 61 6c 75 65 28 70 50 61 72 73 ParseValue(pPars
43f0: 65 2c 20 6a 29 3b 0a 20 20 20 20 20 20 69 66 28 e, j);. if(
4400: 20 78 3c 30 20 29 20 72 65 74 75 72 6e 20 2d 31 x<0 ) return -1
4410: 3b 0a 20 20 20 20 20 20 6a 20 3d 20 78 3b 0a 20 ;. j = x;.
4420: 20 20 20 20 20 77 68 69 6c 65 28 20 69 73 73 70 while( issp
4430: 61 63 65 28 70 50 61 72 73 65 2d 3e 7a 4a 73 6f ace(pParse->zJso
4440: 6e 5b 6a 5d 29 20 29 7b 20 6a 2b 2b 3b 20 7d 0a n[j]) ){ j++; }.
4450: 20 20 20 20 20 20 63 20 3d 20 70 50 61 72 73 65 c = pParse
4460: 2d 3e 7a 4a 73 6f 6e 5b 6a 5d 3b 0a 20 20 20 20 ->zJson[j];.
4470: 20 20 69 66 28 20 63 3d 3d 27 2c 27 20 29 20 63 if( c==',' ) c
4480: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 ontinue;. i
4490: 66 28 20 63 21 3d 27 7d 27 20 29 20 72 65 74 75 f( c!='}' ) retu
44a0: 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 62 72 65 rn -1;. bre
44b0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 ak;. }. pP
44c0: 61 72 73 65 2d 3e 61 4e 6f 64 65 5b 69 54 68 69 arse->aNode[iThi
44d0: 73 5d 2e 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e s].n = pParse->n
44e0: 4e 6f 64 65 20 2d 20 69 54 68 69 73 20 2d 20 31 Node - iThis - 1
44f0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6a 2b 31 ;. return j+1
4500: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d ;. }else if( c=
4510: 3d 27 5b 27 20 29 7b 0a 20 20 20 20 2f 2a 20 50 ='[' ){. /* P
4520: 61 72 73 65 20 61 72 72 61 79 20 2a 2f 0a 20 20 arse array */.
4530: 20 20 69 54 68 69 73 20 3d 20 6a 73 6f 6e 50 61 iThis = jsonPa
4540: 72 73 65 41 64 64 4e 6f 64 65 28 70 50 61 72 73 rseAddNode(pPars
4550: 65 2c 20 4a 53 4f 4e 5f 41 52 52 41 59 2c 20 30 e, JSON_ARRAY, 0
4560: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 69 54 , 0);. if( iT
4570: 68 69 73 3c 30 20 29 20 72 65 74 75 72 6e 20 2d his<0 ) return -
4580: 31 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 1;. for(j=i+1
4590: 3b 3b 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 ;;j++){. wh
45a0: 69 6c 65 28 20 69 73 73 70 61 63 65 28 70 50 61 ile( isspace(pPa
45b0: 72 73 65 2d 3e 7a 4a 73 6f 6e 5b 6a 5d 29 20 29 rse->zJson[j]) )
45c0: 7b 20 6a 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 78 { j++; }. x
45d0: 20 3d 20 6a 73 6f 6e 50 61 72 73 65 56 61 6c 75 = jsonParseValu
45e0: 65 28 70 50 61 72 73 65 2c 20 6a 29 3b 0a 20 20 e(pParse, j);.
45f0: 20 20 20 20 69 66 28 20 78 3c 30 20 29 7b 0a 20 if( x<0 ){.
4600: 20 20 20 20 20 20 20 69 66 28 20 78 3d 3d 28 2d if( x==(-
4610: 33 29 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 4e 3) && pParse->nN
4620: 6f 64 65 3d 3d 69 54 68 69 73 2b 31 20 29 20 72 ode==iThis+1 ) r
4630: 65 74 75 72 6e 20 6a 2b 31 3b 0a 20 20 20 20 20 eturn j+1;.
4640: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 return -1;.
4650: 20 20 20 20 7d 0a 20 20 20 20 20 20 6a 20 3d 20 }. j =
4660: 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 x;. while(
4670: 69 73 73 70 61 63 65 28 70 50 61 72 73 65 2d 3e isspace(pParse->
4680: 7a 4a 73 6f 6e 5b 6a 5d 29 20 29 7b 20 6a 2b 2b zJson[j]) ){ j++
4690: 3b 20 7d 0a 20 20 20 20 20 20 63 20 3d 20 70 50 ; }. c = pP
46a0: 61 72 73 65 2d 3e 7a 4a 73 6f 6e 5b 6a 5d 3b 0a arse->zJson[j];.
46b0: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 2c 27 if( c==','
46c0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 ) continue;.
46d0: 20 20 20 69 66 28 20 63 21 3d 27 5d 27 20 29 20 if( c!=']' )
46e0: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 return -1;.
46f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 break;. }.
4700: 20 20 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65 5b pParse->aNode[
4710: 69 54 68 69 73 5d 2e 6e 20 3d 20 70 50 61 72 73 iThis].n = pPars
4720: 65 2d 3e 6e 4e 6f 64 65 20 2d 20 69 54 68 69 73 e->nNode - iThis
4730: 20 2d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e - 1;. return
4740: 20 6a 2b 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 j+1;. }else if
4750: 28 20 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 ( c=='"' ){.
4760: 2f 2a 20 50 61 72 73 65 20 73 74 72 69 6e 67 20 /* Parse string
4770: 2a 2f 0a 20 20 20 20 75 38 20 6a 6e 46 6c 61 67 */. u8 jnFlag
4780: 73 20 3d 20 30 3b 0a 20 20 20 20 6a 20 3d 20 69 s = 0;. j = i
4790: 2b 31 3b 0a 20 20 20 20 66 6f 72 28 3b 3b 29 7b +1;. for(;;){
47a0: 0a 20 20 20 20 20 20 63 20 3d 20 70 50 61 72 73 . c = pPars
47b0: 65 2d 3e 7a 4a 73 6f 6e 5b 6a 5d 3b 0a 20 20 20 e->zJson[j];.
47c0: 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20 72 65 if( c==0 ) re
47d0: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69 turn -1;. i
47e0: 66 28 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 f( c=='\\' ){.
47f0: 20 20 20 20 20 20 63 20 3d 20 70 50 61 72 73 65 c = pParse
4800: 2d 3e 7a 4a 73 6f 6e 5b 2b 2b 6a 5d 3b 0a 20 20 ->zJson[++j];.
4810: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 if( c==0 )
4820: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 return -1;.
4830: 20 20 20 20 6a 6e 46 6c 61 67 73 20 3d 20 4a 4e jnFlags = JN
4840: 4f 44 45 5f 45 53 43 41 50 45 3b 0a 20 20 20 20 ODE_ESCAPE;.
4850: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 }else if( c=='
4860: 22 27 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 "' ){. br
4870: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 eak;. }.
4880: 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 j++;. }.
4890: 20 20 6a 73 6f 6e 50 61 72 73 65 41 64 64 4e 6f jsonParseAddNo
48a0: 64 65 28 70 50 61 72 73 65 2c 20 4a 53 4f 4e 5f de(pParse, JSON_
48b0: 53 54 52 49 4e 47 2c 20 6a 2b 31 2d 69 2c 20 26 STRING, j+1-i, &
48c0: 70 50 61 72 73 65 2d 3e 7a 4a 73 6f 6e 5b 69 5d pParse->zJson[i]
48d0: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61 );. pParse->a
48e0: 4e 6f 64 65 5b 70 50 61 72 73 65 2d 3e 6e 4e 6f Node[pParse->nNo
48f0: 64 65 2d 31 5d 2e 6a 6e 46 6c 61 67 73 20 3d 20 de-1].jnFlags =
4900: 6a 6e 46 6c 61 67 73 3b 0a 20 20 20 20 72 65 74 jnFlags;. ret
4910: 75 72 6e 20 6a 2b 31 3b 0a 20 20 7d 65 6c 73 65 urn j+1;. }else
4920: 20 69 66 28 20 63 3d 3d 27 6e 27 0a 20 20 20 20 if( c=='n'.
4930: 20 20 20 20 20 26 26 20 73 74 72 6e 63 6d 70 28 && strncmp(
4940: 70 50 61 72 73 65 2d 3e 7a 4a 73 6f 6e 2b 69 2c pParse->zJson+i,
4950: 22 6e 75 6c 6c 22 2c 34 29 3d 3d 30 0a 20 20 20 "null",4)==0.
4960: 20 20 20 20 20 20 26 26 20 21 69 73 61 6c 6e 75 && !isalnu
4970: 6d 28 70 50 61 72 73 65 2d 3e 7a 4a 73 6f 6e 5b m(pParse->zJson[
4980: 69 2b 34 5d 29 20 29 7b 0a 20 20 20 20 6a 73 6f i+4]) ){. jso
4990: 6e 50 61 72 73 65 41 64 64 4e 6f 64 65 28 70 50 nParseAddNode(pP
49a0: 61 72 73 65 2c 20 4a 53 4f 4e 5f 4e 55 4c 4c 2c arse, JSON_NULL,
49b0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 0, 0);. retu
49c0: 72 6e 20 69 2b 34 3b 0a 20 20 7d 65 6c 73 65 20 rn i+4;. }else
49d0: 69 66 28 20 63 3d 3d 27 74 27 0a 20 20 20 20 20 if( c=='t'.
49e0: 20 20 20 20 26 26 20 73 74 72 6e 63 6d 70 28 70 && strncmp(p
49f0: 50 61 72 73 65 2d 3e 7a 4a 73 6f 6e 2b 69 2c 22 Parse->zJson+i,"
4a00: 74 72 75 65 22 2c 34 29 3d 3d 30 0a 20 20 20 20 true",4)==0.
4a10: 20 20 20 20 20 26 26 20 21 69 73 61 6c 6e 75 6d && !isalnum
4a20: 28 70 50 61 72 73 65 2d 3e 7a 4a 73 6f 6e 5b 69 (pParse->zJson[i
4a30: 2b 34 5d 29 20 29 7b 0a 20 20 20 20 6a 73 6f 6e +4]) ){. json
4a40: 50 61 72 73 65 41 64 64 4e 6f 64 65 28 70 50 61 ParseAddNode(pPa
4a50: 72 73 65 2c 20 4a 53 4f 4e 5f 54 52 55 45 2c 20 rse, JSON_TRUE,
4a60: 30 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 0, 0);. retur
4a70: 6e 20 69 2b 34 3b 0a 20 20 7d 65 6c 73 65 20 69 n i+4;. }else i
4a80: 66 28 20 63 3d 3d 27 66 27 0a 20 20 20 20 20 20 f( c=='f'.
4a90: 20 20 20 26 26 20 73 74 72 6e 63 6d 70 28 70 50 && strncmp(pP
4aa0: 61 72 73 65 2d 3e 7a 4a 73 6f 6e 2b 69 2c 22 66 arse->zJson+i,"f
4ab0: 61 6c 73 65 22 2c 35 29 3d 3d 30 0a 20 20 20 20 alse",5)==0.
4ac0: 20 20 20 20 20 26 26 20 21 69 73 61 6c 6e 75 6d && !isalnum
4ad0: 28 70 50 61 72 73 65 2d 3e 7a 4a 73 6f 6e 5b 69 (pParse->zJson[i
4ae0: 2b 35 5d 29 20 29 7b 0a 20 20 20 20 6a 73 6f 6e +5]) ){. json
4af0: 50 61 72 73 65 41 64 64 4e 6f 64 65 28 70 50 61 ParseAddNode(pPa
4b00: 72 73 65 2c 20 4a 53 4f 4e 5f 46 41 4c 53 45 2c rse, JSON_FALSE,
4b10: 20 30 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 0, 0);. retu
4b20: 72 6e 20 69 2b 35 3b 0a 20 20 7d 65 6c 73 65 20 rn i+5;. }else
4b30: 69 66 28 20 63 3d 3d 27 2d 27 20 7c 7c 20 28 63 if( c=='-' || (c
4b40: 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27 39 27 29 >='0' && c<='9')
4b50: 20 29 7b 0a 20 20 20 20 2f 2a 20 50 61 72 73 65 ){. /* Parse
4b60: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 75 number */. u
4b70: 38 20 73 65 65 6e 44 50 20 3d 20 30 3b 0a 20 20 8 seenDP = 0;.
4b80: 20 20 75 38 20 73 65 65 6e 45 20 3d 20 30 3b 0a u8 seenE = 0;.
4b90: 20 20 20 20 6a 20 3d 20 69 2b 31 3b 0a 20 20 20 j = i+1;.
4ba0: 20 66 6f 72 28 3b 3b 20 6a 2b 2b 29 7b 0a 20 20 for(;; j++){.
4bb0: 20 20 20 20 63 20 3d 20 70 50 61 72 73 65 2d 3e c = pParse->
4bc0: 7a 4a 73 6f 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 zJson[j];.
4bd0: 69 66 28 20 63 3e 3d 27 30 27 20 26 26 20 63 3c if( c>='0' && c<
4be0: 3d 27 39 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b ='9' ) continue;
4bf0: 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 2e . if( c=='.
4c00: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 ' ){. if(
4c10: 20 70 50 61 72 73 65 2d 3e 7a 4a 73 6f 6e 5b 6a pParse->zJson[j
4c20: 2d 31 5d 3d 3d 27 2d 27 20 29 20 72 65 74 75 72 -1]=='-' ) retur
4c30: 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 66 n -1;. if
4c40: 28 20 73 65 65 6e 44 50 20 29 20 72 65 74 75 72 ( seenDP ) retur
4c50: 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 73 65 n -1;. se
4c60: 65 6e 44 50 20 3d 20 31 3b 0a 20 20 20 20 20 20 enDP = 1;.
4c70: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 continue;.
4c80: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d }. if( c=
4c90: 3d 27 65 27 20 7c 7c 20 63 3d 3d 27 45 27 20 29 ='e' || c=='E' )
4ca0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 {. if( pP
4cb0: 61 72 73 65 2d 3e 7a 4a 73 6f 6e 5b 6a 2d 31 5d arse->zJson[j-1]
4cc0: 3c 27 30 27 20 29 20 72 65 74 75 72 6e 20 2d 31 <'0' ) return -1
4cd0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 65 ;. if( se
4ce0: 65 6e 45 20 29 20 72 65 74 75 72 6e 20 2d 31 3b enE ) return -1;
4cf0: 0a 20 20 20 20 20 20 20 20 73 65 65 6e 44 50 20 . seenDP
4d00: 3d 20 73 65 65 6e 45 20 3d 20 31 3b 0a 20 20 20 = seenE = 1;.
4d10: 20 20 20 20 20 63 20 3d 20 70 50 61 72 73 65 2d c = pParse-
4d20: 3e 7a 4a 73 6f 6e 5b 6a 2b 31 5d 3b 0a 20 20 20 >zJson[j+1];.
4d30: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 2b 27 20 if( c=='+'
4d40: 7c 7c 20 63 3d 3d 27 2d 27 20 29 20 6a 2b 2b 3b || c=='-' ) j++;
4d50: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 . continu
4d60: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 e;. }.
4d70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 break;. }.
4d80: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 7a 4a if( pParse->zJ
4d90: 73 6f 6e 5b 6a 2d 31 5d 3c 27 30 27 20 29 20 72 son[j-1]<'0' ) r
4da0: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 6a 73 eturn -1;. js
4db0: 6f 6e 50 61 72 73 65 41 64 64 4e 6f 64 65 28 70 onParseAddNode(p
4dc0: 50 61 72 73 65 2c 20 73 65 65 6e 44 50 20 3f 20 Parse, seenDP ?
4dd0: 4a 53 4f 4e 5f 52 45 41 4c 20 3a 20 4a 53 4f 4e JSON_REAL : JSON
4de0: 5f 49 4e 54 2c 0a 20 20 20 20 20 20 20 20 20 20 _INT,.
4df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 20 j
4e00: 2d 20 69 2c 20 26 70 50 61 72 73 65 2d 3e 7a 4a - i, &pParse->zJ
4e10: 73 6f 6e 5b 69 5d 29 3b 0a 20 20 20 20 72 65 74 son[i]);. ret
4e20: 75 72 6e 20 6a 3b 0a 20 20 7d 65 6c 73 65 20 69 urn j;. }else i
4e30: 66 28 20 63 3d 3d 27 7d 27 20 29 7b 0a 20 20 20 f( c=='}' ){.
4e40: 20 72 65 74 75 72 6e 20 2d 32 3b 20 20 2f 2a 20 return -2; /*
4e50: 45 6e 64 20 6f 66 20 7b 2e 2e 2e 7d 20 2a 2f 0a End of {...} */.
4e60: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 }else if( c=='
4e70: 5d 27 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e ]' ){. return
4e80: 20 2d 33 3b 20 20 2f 2a 20 45 6e 64 20 6f 66 20 -3; /* End of
4e90: 5b 2e 2e 2e 5d 20 2a 2f 0a 20 20 7d 65 6c 73 65 [...] */. }else
4ea0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b {. return -1;
4eb0: 20 20 2f 2a 20 53 79 6e 74 61 78 20 65 72 72 6f /* Syntax erro
4ec0: 72 20 2a 2f 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a r */. }.}../*.*
4ed0: 2a 20 50 61 72 73 65 20 61 20 63 6f 6d 70 6c 65 * Parse a comple
4ee0: 74 65 20 4a 53 4f 4e 20 73 74 72 69 6e 67 2e 20 te JSON string.
4ef0: 20 52 65 74 75 72 6e 20 30 20 6f 6e 20 73 75 63 Return 0 on suc
4f00: 63 65 73 73 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f cess or non-zero
4f10: 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 if there.** are
4f20: 20 61 6e 79 20 65 72 72 6f 72 73 2e 20 20 49 66 any errors. If
4f30: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 an error occurs
4f40: 2c 20 66 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 , free all memor
4f50: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 y associated wit
4f60: 68 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a 0a h.** pParse..**.
4f70: 2a 2a 20 70 50 61 72 73 65 20 69 73 20 75 6e 69 ** pParse is uni
4f80: 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20 nitialized when
4f90: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 this routine is
4fa0: 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 called..*/.stati
4fb0: 63 20 69 6e 74 20 6a 73 6f 6e 50 61 72 73 65 28 c int jsonParse(
4fc0: 4a 73 6f 6e 50 61 72 73 65 20 2a 70 50 61 72 73 JsonParse *pPars
4fd0: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a e, const char *z
4fe0: 4a 73 6f 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a Json){. int i;.
4ff0: 20 20 69 66 28 20 7a 4a 73 6f 6e 3d 3d 30 20 29 if( zJson==0 )
5000: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d return 1;. mem
5010: 73 65 74 28 70 50 61 72 73 65 2c 20 30 2c 20 73 set(pParse, 0, s
5020: 69 7a 65 6f 66 28 2a 70 50 61 72 73 65 29 29 3b izeof(*pParse));
5030: 0a 20 20 70 50 61 72 73 65 2d 3e 7a 4a 73 6f 6e . pParse->zJson
5040: 20 3d 20 7a 4a 73 6f 6e 3b 0a 20 20 69 20 3d 20 = zJson;. i =
5050: 6a 73 6f 6e 50 61 72 73 65 56 61 6c 75 65 28 70 jsonParseValue(p
5060: 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 69 66 28 Parse, 0);. if(
5070: 20 69 3e 30 20 29 7b 0a 20 20 20 20 77 68 69 6c i>0 ){. whil
5080: 65 28 20 69 73 73 70 61 63 65 28 7a 4a 73 6f 6e e( isspace(zJson
5090: 5b 69 5d 29 20 29 20 69 2b 2b 3b 0a 20 20 20 20 [i]) ) i++;.
50a0: 69 66 28 20 7a 4a 73 6f 6e 5b 69 5d 20 29 20 69 if( zJson[i] ) i
50b0: 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 = -1;. }. if(
50c0: 20 69 3c 30 20 29 7b 0a 20 20 20 20 6a 73 6f 6e i<0 ){. json
50d0: 50 61 72 73 65 52 65 73 65 74 28 70 50 61 72 73 ParseReset(pPars
50e0: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 e);. return 1
50f0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 ;. }. return 0
5100: 3b 0a 7d 0a 0a 2f 2a 20 4d 61 72 6b 20 6e 6f 64 ;.}../* Mark nod
5110: 65 20 69 20 6f 66 20 70 50 61 72 73 65 20 61 73 e i of pParse as
5120: 20 62 65 69 6e 67 20 61 20 63 68 69 6c 64 20 6f being a child o
5130: 66 20 69 50 61 72 65 6e 74 2e 20 20 43 61 6c 6c f iParent. Call
5140: 20 72 65 63 75 72 73 69 76 65 6c 79 0a 2a 2a 20 recursively.**
5150: 74 6f 20 66 69 6c 6c 20 69 6e 20 61 6c 6c 20 74 to fill in all t
5160: 68 65 20 64 65 73 63 65 6e 64 61 6e 74 73 20 6f he descendants o
5170: 66 20 6e 6f 64 65 20 69 2e 0a 2a 2f 0a 73 74 61 f node i..*/.sta
5180: 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 50 61 72 tic void jsonPar
5190: 73 65 46 69 6c 6c 49 6e 50 61 72 65 6e 74 61 67 seFillInParentag
51a0: 65 28 4a 73 6f 6e 50 61 72 73 65 20 2a 70 50 61 e(JsonParse *pPa
51b0: 72 73 65 2c 20 75 33 32 20 69 2c 20 75 33 32 20 rse, u32 i, u32
51c0: 69 50 61 72 65 6e 74 29 7b 0a 20 20 4a 73 6f 6e iParent){. Json
51d0: 4e 6f 64 65 20 2a 70 4e 6f 64 65 20 3d 20 26 70 Node *pNode = &p
51e0: 50 61 72 73 65 2d 3e 61 4e 6f 64 65 5b 69 5d 3b Parse->aNode[i];
51f0: 0a 20 20 75 33 32 20 6a 3b 0a 20 20 70 50 61 72 . u32 j;. pPar
5200: 73 65 2d 3e 61 55 70 5b 69 5d 20 3d 20 69 50 61 se->aUp[i] = iPa
5210: 72 65 6e 74 3b 0a 20 20 73 77 69 74 63 68 28 20 rent;. switch(
5220: 70 4e 6f 64 65 2d 3e 65 54 79 70 65 20 29 7b 0a pNode->eType ){.
5230: 20 20 20 20 63 61 73 65 20 4a 53 4f 4e 5f 41 52 case JSON_AR
5240: 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 66 6f 72 RAY: {. for
5250: 28 6a 3d 31 3b 20 6a 3c 3d 70 4e 6f 64 65 2d 3e (j=1; j<=pNode->
5260: 6e 3b 20 6a 20 2b 3d 20 6a 73 6f 6e 4e 6f 64 65 n; j += jsonNode
5270: 53 69 7a 65 28 70 4e 6f 64 65 2b 6a 29 29 7b 0a Size(pNode+j)){.
5280: 20 20 20 20 20 20 20 20 6a 73 6f 6e 50 61 72 73 jsonPars
5290: 65 46 69 6c 6c 49 6e 50 61 72 65 6e 74 61 67 65 eFillInParentage
52a0: 28 70 50 61 72 73 65 2c 20 69 2b 6a 2c 20 69 29 (pParse, i+j, i)
52b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 ;. }.
52c0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 break;. }.
52d0: 20 63 61 73 65 20 4a 53 4f 4e 5f 4f 42 4a 45 43 case JSON_OBJEC
52e0: 54 3a 20 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a T: {. for(j
52f0: 3d 31 3b 20 6a 3c 3d 70 4e 6f 64 65 2d 3e 6e 3b =1; j<=pNode->n;
5300: 20 6a 20 2b 3d 20 6a 73 6f 6e 4e 6f 64 65 53 69 j += jsonNodeSi
5310: 7a 65 28 70 4e 6f 64 65 2b 6a 2b 31 29 2b 31 29 ze(pNode+j+1)+1)
5320: 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 {. pParse
5330: 2d 3e 61 55 70 5b 69 2b 6a 5d 20 3d 20 69 3b 0a ->aUp[i+j] = i;.
5340: 20 20 20 20 20 20 20 20 6a 73 6f 6e 50 61 72 73 jsonPars
5350: 65 46 69 6c 6c 49 6e 50 61 72 65 6e 74 61 67 65 eFillInParentage
5360: 28 70 50 61 72 73 65 2c 20 69 2b 6a 2b 31 2c 20 (pParse, i+j+1,
5370: 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 i);. }.
5380: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 break;. }.
5390: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 default: {.
53a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d break;. }
53b0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f . }.}../*.** Co
53c0: 6d 70 75 74 65 20 74 68 65 20 70 61 72 65 6e 74 mpute the parent
53d0: 61 67 65 20 6f 66 20 61 6c 6c 20 6e 6f 64 65 73 age of all nodes
53e0: 20 69 6e 20 61 20 63 6f 6d 70 6c 65 74 65 64 20 in a completed
53f0: 70 61 72 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 parse..*/.static
5400: 20 69 6e 74 20 6a 73 6f 6e 50 61 72 73 65 46 69 int jsonParseFi
5410: 6e 64 50 61 72 65 6e 74 73 28 4a 73 6f 6e 50 61 ndParents(JsonPa
5420: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 rse *pParse){.
5430: 75 33 32 20 2a 61 55 70 3b 0a 20 20 61 73 73 65 u32 *aUp;. asse
5440: 72 74 28 20 70 50 61 72 73 65 2d 3e 61 55 70 3d rt( pParse->aUp=
5450: 3d 30 20 29 3b 0a 20 20 61 55 70 20 3d 20 70 50 =0 );. aUp = pP
5460: 61 72 73 65 2d 3e 61 55 70 20 3d 20 73 71 6c 69 arse->aUp = sqli
5470: 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 te3_malloc( size
5480: 6f 66 28 75 33 32 29 2a 70 50 61 72 73 65 2d 3e of(u32)*pParse->
5490: 6e 4e 6f 64 65 20 29 3b 0a 20 20 69 66 28 20 61 nNode );. if( a
54a0: 55 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 Up==0 ) return S
54b0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6a QLITE_NOMEM;. j
54c0: 73 6f 6e 50 61 72 73 65 46 69 6c 6c 49 6e 50 61 sonParseFillInPa
54d0: 72 65 6e 74 61 67 65 28 70 50 61 72 73 65 2c 20 rentage(pParse,
54e0: 30 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 0, 0);. return
54f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a SQLITE_OK;.}../*
5500: 20 66 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 forward declara
5510: 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 4a tion */.static J
5520: 73 6f 6e 4e 6f 64 65 20 2a 6a 73 6f 6e 4c 6f 6f sonNode *jsonLoo
5530: 6b 75 70 41 70 70 65 6e 64 28 4a 73 6f 6e 50 61 kupAppend(JsonPa
5540: 72 73 65 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a rse*,const char*
5550: 2c 69 6e 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 ,int*);../*.** S
5560: 65 61 72 63 68 20 61 6c 6f 6e 67 20 7a 50 61 74 earch along zPat
5570: 68 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 6f h to find the no
5580: 64 65 20 73 70 65 63 69 66 69 65 64 2e 20 20 52 de specified. R
5590: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a eturn a pointer.
55a0: 2a 2a 20 74 6f 20 74 68 61 74 20 6e 6f 64 65 2c ** to that node,
55b0: 20 6f 72 20 4e 55 4c 4c 20 69 66 20 7a 50 61 74 or NULL if zPat
55c0: 68 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 20 6f h is malformed o
55d0: 72 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f r if there is no
55e0: 20 73 75 63 68 0a 2a 2a 20 6e 6f 64 65 2e 0a 2a such.** node..*
55f0: 2a 0a 2a 2a 20 49 66 20 70 41 70 6e 64 21 3d 30 *.** If pApnd!=0
5600: 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20 61 70 , then try to ap
5610: 70 65 6e 64 20 6e 65 77 20 6e 6f 64 65 73 20 74 pend new nodes t
5620: 6f 20 63 6f 6d 70 6c 65 74 65 20 7a 50 61 74 68 o complete zPath
5630: 20 69 66 20 69 74 20 69 73 0a 2a 2a 20 70 6f 73 if it is.** pos
5640: 73 69 62 6c 65 20 74 6f 20 64 6f 20 73 6f 20 61 sible to do so a
5650: 6e 64 20 69 66 20 6e 6f 20 65 78 69 73 74 69 6e nd if no existin
5660: 67 20 6e 6f 64 65 20 63 6f 72 72 65 73 70 6f 6e g node correspon
5670: 64 73 20 74 6f 20 7a 50 61 74 68 2e 20 20 49 66 ds to zPath. If
5680: 0a 2a 2a 20 6e 65 77 20 6e 6f 64 65 73 20 61 72 .** new nodes ar
5690: 65 20 61 70 70 65 6e 64 65 64 20 2a 70 41 70 6e e appended *pApn
56a0: 64 20 69 73 20 73 65 74 20 74 6f 20 31 2e 0a 2a d is set to 1..*
56b0: 2f 0a 73 74 61 74 69 63 20 4a 73 6f 6e 4e 6f 64 /.static JsonNod
56c0: 65 20 2a 6a 73 6f 6e 4c 6f 6f 6b 75 70 28 0a 20 e *jsonLookup(.
56d0: 20 4a 73 6f 6e 50 61 72 73 65 20 2a 70 50 61 72 JsonParse *pPar
56e0: 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 se, /* The
56f0: 4a 53 4f 4e 20 74 6f 20 73 65 61 72 63 68 20 2a JSON to search *
5700: 2f 0a 20 20 75 33 32 20 69 52 6f 6f 74 2c 20 20 /. u32 iRoot,
5710: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 /* B
5720: 65 67 69 6e 20 74 68 65 20 73 65 61 72 63 68 20 egin the search
5730: 61 74 20 74 68 69 73 20 6e 6f 64 65 20 2a 2f 0a at this node */.
5740: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 const char *zP
5750: 61 74 68 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 ath, /* The
5760: 20 70 61 74 68 20 74 6f 20 73 65 61 72 63 68 20 path to search
5770: 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 70 6e 64 20 */. int *pApnd
5780: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
5790: 41 70 70 65 6e 64 20 6e 6f 64 65 73 20 74 6f 20 Append nodes to
57a0: 63 6f 6d 70 6c 65 74 65 20 70 61 74 68 20 69 66 complete path if
57b0: 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a not NULL */.){.
57c0: 20 20 75 33 32 20 69 2c 20 6a 2c 20 6b 2c 20 6e u32 i, j, k, n
57d0: 4b 65 79 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 Key;. const cha
57e0: 72 20 2a 7a 4b 65 79 3b 0a 20 20 4a 73 6f 6e 4e r *zKey;. JsonN
57f0: 6f 64 65 20 2a 70 52 6f 6f 74 20 3d 20 26 70 50 ode *pRoot = &pP
5800: 61 72 73 65 2d 3e 61 4e 6f 64 65 5b 69 52 6f 6f arse->aNode[iRoo
5810: 74 5d 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 5b t];. if( zPath[
5820: 30 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 70 0]==0 ) return p
5830: 52 6f 6f 74 3b 0a 20 20 69 66 28 20 7a 50 61 74 Root;. if( zPat
5840: 68 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 h[0]=='.' ){.
5850: 20 69 66 28 20 70 52 6f 6f 74 2d 3e 65 54 79 70 if( pRoot->eTyp
5860: 65 21 3d 4a 53 4f 4e 5f 4f 42 4a 45 43 54 20 29 e!=JSON_OBJECT )
5870: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7a return 0;. z
5880: 50 61 74 68 2b 2b 3b 0a 20 20 20 20 69 66 28 20 Path++;. if(
5890: 7a 50 61 74 68 5b 30 5d 3d 3d 27 22 27 20 29 7b zPath[0]=='"' ){
58a0: 0a 20 20 20 20 20 20 7a 4b 65 79 20 3d 20 7a 50 . zKey = zP
58b0: 61 74 68 20 2b 20 31 3b 0a 20 20 20 20 20 20 66 ath + 1;. f
58c0: 6f 72 28 69 3d 31 3b 20 7a 50 61 74 68 5b 69 5d or(i=1; zPath[i]
58d0: 20 26 26 20 7a 50 61 74 68 5b 69 5d 21 3d 27 22 && zPath[i]!='"
58e0: 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 '; i++){}.
58f0: 6e 4b 65 79 20 3d 20 69 2d 31 3b 0a 20 20 20 20 nKey = i-1;.
5900: 20 20 69 66 28 20 7a 50 61 74 68 5b 69 5d 20 29 if( zPath[i] )
5910: 20 69 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b i++;. }else{
5920: 0a 20 20 20 20 20 20 7a 4b 65 79 20 3d 20 7a 50 . zKey = zP
5930: 61 74 68 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 ath;. for(i
5940: 3d 30 3b 20 7a 50 61 74 68 5b 69 5d 20 26 26 20 =0; zPath[i] &&
5950: 7a 50 61 74 68 5b 69 5d 21 3d 27 2e 27 20 26 26 zPath[i]!='.' &&
5960: 20 7a 50 61 74 68 5b 69 5d 21 3d 27 5b 27 3b 20 zPath[i]!='[';
5970: 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 6e 4b 65 i++){}. nKe
5980: 79 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 y = i;. }.
5990: 20 69 66 28 20 6e 4b 65 79 3d 3d 30 20 29 20 72 if( nKey==0 ) r
59a0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 6a 20 3d eturn 0;. j =
59b0: 20 31 3b 0a 20 20 20 20 66 6f 72 28 3b 3b 29 7b 1;. for(;;){
59c0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3c . while( j<
59d0: 3d 70 52 6f 6f 74 2d 3e 6e 20 29 7b 0a 20 20 20 =pRoot->n ){.
59e0: 20 20 20 20 20 69 66 28 20 70 52 6f 6f 74 5b 6a if( pRoot[j
59f0: 5d 2e 6e 3d 3d 6e 4b 65 79 2b 32 0a 20 20 20 20 ].n==nKey+2.
5a00: 20 20 20 20 20 26 26 20 73 74 72 6e 63 6d 70 28 && strncmp(
5a10: 26 70 52 6f 6f 74 5b 6a 5d 2e 75 2e 7a 4a 43 6f &pRoot[j].u.zJCo
5a20: 6e 74 65 6e 74 5b 31 5d 2c 7a 4b 65 79 2c 6e 4b ntent[1],zKey,nK
5a30: 65 79 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 29 ey)==0. )
5a40: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 {. retu
5a50: 72 6e 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 28 70 50 rn jsonLookup(pP
5a60: 61 72 73 65 2c 20 69 52 6f 6f 74 2b 6a 2b 31 2c arse, iRoot+j+1,
5a70: 20 26 7a 50 61 74 68 5b 69 5d 2c 20 70 41 70 6e &zPath[i], pApn
5a80: 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 d);. }.
5a90: 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 j++;.
5aa0: 20 20 20 6a 20 2b 3d 20 6a 73 6f 6e 4e 6f 64 65 j += jsonNode
5ab0: 53 69 7a 65 28 26 70 52 6f 6f 74 5b 6a 5d 29 3b Size(&pRoot[j]);
5ac0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 . }. i
5ad0: 66 28 20 28 70 52 6f 6f 74 2d 3e 6a 6e 46 6c 61 f( (pRoot->jnFla
5ae0: 67 73 20 26 20 4a 4e 4f 44 45 5f 41 50 50 45 4e gs & JNODE_APPEN
5af0: 44 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 D)==0 ) break;.
5b00: 20 20 20 20 20 69 52 6f 6f 74 20 2b 3d 20 70 52 iRoot += pR
5b10: 6f 6f 74 2d 3e 75 2e 69 41 70 70 65 6e 64 3b 0a oot->u.iAppend;.
5b20: 20 20 20 20 20 20 70 52 6f 6f 74 20 3d 20 26 70 pRoot = &p
5b30: 50 61 72 73 65 2d 3e 61 4e 6f 64 65 5b 69 52 6f Parse->aNode[iRo
5b40: 6f 74 5d 3b 0a 20 20 20 20 20 20 6a 20 3d 20 31 ot];. j = 1
5b50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 ;. }. if(
5b60: 70 41 70 6e 64 20 29 7b 0a 20 20 20 20 20 20 6b pApnd ){. k
5b70: 20 3d 20 6a 73 6f 6e 50 61 72 73 65 41 64 64 4e = jsonParseAddN
5b80: 6f 64 65 28 70 50 61 72 73 65 2c 20 4a 53 4f 4e ode(pParse, JSON
5b90: 5f 4f 42 4a 45 43 54 2c 20 32 2c 20 30 29 3b 0a _OBJECT, 2, 0);.
5ba0: 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 75 2e 69 pRoot->u.i
5bb0: 41 70 70 65 6e 64 20 3d 20 6b 20 2d 20 69 52 6f Append = k - iRo
5bc0: 6f 74 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d ot;. pRoot-
5bd0: 3e 6a 6e 46 6c 61 67 73 20 7c 3d 20 4a 4e 4f 44 >jnFlags |= JNOD
5be0: 45 5f 41 50 50 45 4e 44 3b 0a 20 20 20 20 20 20 E_APPEND;.
5bf0: 6b 20 3d 20 6a 73 6f 6e 50 61 72 73 65 41 64 64 k = jsonParseAdd
5c00: 4e 6f 64 65 28 70 50 61 72 73 65 2c 20 4a 53 4f Node(pParse, JSO
5c10: 4e 5f 53 54 52 49 4e 47 2c 20 69 2c 20 7a 50 61 N_STRING, i, zPa
5c20: 74 68 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 th);. if( !
5c30: 70 50 61 72 73 65 2d 3e 6f 6f 6d 20 29 20 70 50 pParse->oom ) pP
5c40: 61 72 73 65 2d 3e 61 4e 6f 64 65 5b 6b 5d 2e 6a arse->aNode[k].j
5c50: 6e 46 6c 61 67 73 20 7c 3d 20 4a 4e 4f 44 45 5f nFlags |= JNODE_
5c60: 52 41 57 3b 0a 20 20 20 20 20 20 7a 50 61 74 68 RAW;. zPath
5c70: 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20 72 65 74 += i;. ret
5c80: 75 72 6e 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 41 70 urn jsonLookupAp
5c90: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 7a 50 61 pend(pParse, zPa
5ca0: 74 68 2c 20 70 41 70 6e 64 29 3b 0a 20 20 20 20 th, pApnd);.
5cb0: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 50 }. }else if( zP
5cc0: 61 74 68 5b 30 5d 3d 3d 27 5b 27 20 26 26 20 69 ath[0]=='[' && i
5cd0: 73 64 69 67 69 74 28 7a 50 61 74 68 5b 31 5d 29 sdigit(zPath[1])
5ce0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 52 6f 6f ){. if( pRoo
5cf0: 74 2d 3e 65 54 79 70 65 21 3d 4a 53 4f 4e 5f 41 t->eType!=JSON_A
5d00: 52 52 41 59 20 29 20 72 65 74 75 72 6e 20 30 3b RRAY ) return 0;
5d10: 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 20 20 . i = 0;.
5d20: 7a 50 61 74 68 2b 2b 3b 0a 20 20 20 20 77 68 69 zPath++;. whi
5d30: 6c 65 28 20 69 73 64 69 67 69 74 28 7a 50 61 74 le( isdigit(zPat
5d40: 68 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 69 h[0]) ){. i
5d50: 20 3d 20 69 20 2b 20 7a 50 61 74 68 5b 30 5d 20 = i + zPath[0]
5d60: 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 7a 50 61 - '0';. zPa
5d70: 74 68 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 th++;. }.
5d80: 69 66 28 20 7a 50 61 74 68 5b 30 5d 21 3d 27 5d if( zPath[0]!=']
5d90: 27 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 ' ) return 0;.
5da0: 20 20 7a 50 61 74 68 2b 2b 3b 0a 20 20 20 20 6a zPath++;. j
5db0: 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 3b 3b = 1;. for(;;
5dc0: 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 ){. while(
5dd0: 69 3e 30 20 26 26 20 6a 3c 3d 70 52 6f 6f 74 2d i>0 && j<=pRoot-
5de0: 3e 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 20 >n ){. j
5df0: 2b 3d 20 6a 73 6f 6e 4e 6f 64 65 53 69 7a 65 28 += jsonNodeSize(
5e00: 26 70 52 6f 6f 74 5b 6a 5d 29 3b 0a 20 20 20 20 &pRoot[j]);.
5e10: 20 20 20 20 69 2d 2d 3b 0a 20 20 20 20 20 20 7d i--;. }
5e20: 0a 20 20 20 20 20 20 69 66 28 20 28 70 52 6f 6f . if( (pRoo
5e30: 74 2d 3e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f t->jnFlags & JNO
5e40: 44 45 5f 41 50 50 45 4e 44 29 3d 3d 30 20 29 20 DE_APPEND)==0 )
5e50: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 52 6f break;. iRo
5e60: 6f 74 20 2b 3d 20 70 52 6f 6f 74 2d 3e 75 2e 69 ot += pRoot->u.i
5e70: 41 70 70 65 6e 64 3b 0a 20 20 20 20 20 20 70 52 Append;. pR
5e80: 6f 6f 74 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 oot = &pParse->a
5e90: 4e 6f 64 65 5b 69 52 6f 6f 74 5d 3b 0a 20 20 20 Node[iRoot];.
5ea0: 20 20 20 6a 20 3d 20 31 3b 0a 20 20 20 20 7d 0a j = 1;. }.
5eb0: 20 20 20 20 69 66 28 20 6a 3c 3d 70 52 6f 6f 74 if( j<=pRoot
5ec0: 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20 72 65 74 ->n ){. ret
5ed0: 75 72 6e 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 28 70 urn jsonLookup(p
5ee0: 50 61 72 73 65 2c 20 69 52 6f 6f 74 2b 6a 2c 20 Parse, iRoot+j,
5ef0: 7a 50 61 74 68 2c 20 70 41 70 6e 64 29 3b 0a 20 zPath, pApnd);.
5f00: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d }. if( i==
5f10: 30 20 26 26 20 70 41 70 6e 64 20 29 7b 0a 20 20 0 && pApnd ){.
5f20: 20 20 20 20 6b 20 3d 20 6a 73 6f 6e 50 61 72 73 k = jsonPars
5f30: 65 41 64 64 4e 6f 64 65 28 70 50 61 72 73 65 2c eAddNode(pParse,
5f40: 20 4a 53 4f 4e 5f 41 52 52 41 59 2c 20 31 2c 20 JSON_ARRAY, 1,
5f50: 30 29 3b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 0);. pRoot-
5f60: 3e 75 2e 69 41 70 70 65 6e 64 20 3d 20 6b 20 2d >u.iAppend = k -
5f70: 20 69 52 6f 6f 74 3b 0a 20 20 20 20 20 20 70 52 iRoot;. pR
5f80: 6f 6f 74 2d 3e 6a 6e 46 6c 61 67 73 20 7c 3d 20 oot->jnFlags |=
5f90: 4a 4e 4f 44 45 5f 41 50 50 45 4e 44 3b 0a 20 20 JNODE_APPEND;.
5fa0: 20 20 20 20 72 65 74 75 72 6e 20 6a 73 6f 6e 4c return jsonL
5fb0: 6f 6f 6b 75 70 41 70 70 65 6e 64 28 70 50 61 72 ookupAppend(pPar
5fc0: 73 65 2c 20 7a 50 61 74 68 2c 20 70 41 70 6e 64 se, zPath, pApnd
5fd0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 );. }. }. r
5fe0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a eturn 0;.}../*.*
5ff0: 2a 20 41 70 70 65 6e 64 20 63 6f 6e 74 65 6e 74 * Append content
6000: 20 74 6f 20 70 50 61 72 73 65 20 74 68 61 74 20 to pParse that
6010: 77 69 6c 6c 20 63 6f 6d 70 6c 65 74 65 20 7a 50 will complete zP
6020: 61 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4a ath..*/.static J
6030: 73 6f 6e 4e 6f 64 65 20 2a 6a 73 6f 6e 4c 6f 6f sonNode *jsonLoo
6040: 6b 75 70 41 70 70 65 6e 64 28 0a 20 20 4a 73 6f kupAppend(. Jso
6050: 6e 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 nParse *pParse,
6060: 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 63 6f /* Append co
6070: 6e 74 65 6e 74 20 74 6f 20 74 68 65 20 4a 53 4f ntent to the JSO
6080: 4e 20 70 61 72 73 65 20 2a 2f 0a 20 20 63 6f 6e N parse */. con
6090: 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 st char *zPath,
60a0: 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 /* Descripti
60b0: 6f 6e 20 6f 66 20 63 6f 6e 74 65 6e 74 20 74 6f on of content to
60c0: 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 append */. int
60d0: 20 2a 70 41 70 6e 64 20 20 20 20 20 20 20 20 20 *pApnd
60e0: 20 20 20 20 2f 2a 20 53 65 74 20 74 68 69 73 20 /* Set this
60f0: 66 6c 61 67 20 74 6f 20 31 20 2a 2f 0a 29 7b 0a flag to 1 */.){.
6100: 20 20 2a 70 41 70 6e 64 20 3d 20 31 3b 0a 20 20 *pApnd = 1;.
6110: 69 66 28 20 7a 50 61 74 68 5b 30 5d 3d 3d 30 20 if( zPath[0]==0
6120: 29 7b 0a 20 20 20 20 6a 73 6f 6e 50 61 72 73 65 ){. jsonParse
6130: 41 64 64 4e 6f 64 65 28 70 50 61 72 73 65 2c 20 AddNode(pParse,
6140: 4a 53 4f 4e 5f 4e 55 4c 4c 2c 20 30 2c 20 30 29 JSON_NULL, 0, 0)
6150: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 ;. return pPa
6160: 72 73 65 2d 3e 6f 6f 6d 20 3f 20 30 20 3a 20 26 rse->oom ? 0 : &
6170: 70 50 61 72 73 65 2d 3e 61 4e 6f 64 65 5b 70 50 pParse->aNode[pP
6180: 61 72 73 65 2d 3e 6e 4e 6f 64 65 2d 31 5d 3b 0a arse->nNode-1];.
6190: 20 20 7d 0a 20 20 69 66 28 20 7a 50 61 74 68 5b }. if( zPath[
61a0: 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 6a 0]=='.' ){. j
61b0: 73 6f 6e 50 61 72 73 65 41 64 64 4e 6f 64 65 28 sonParseAddNode(
61c0: 70 50 61 72 73 65 2c 20 4a 53 4f 4e 5f 4f 42 4a pParse, JSON_OBJ
61d0: 45 43 54 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 65 ECT, 0, 0);. }e
61e0: 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 lse if( strncmp(
61f0: 7a 50 61 74 68 2c 22 5b 30 5d 22 2c 33 29 3d 3d zPath,"[0]",3)==
6200: 30 20 29 7b 0a 20 20 20 20 6a 73 6f 6e 50 61 72 0 ){. jsonPar
6210: 73 65 41 64 64 4e 6f 64 65 28 70 50 61 72 73 65 seAddNode(pParse
6220: 2c 20 4a 53 4f 4e 5f 41 52 52 41 59 2c 20 30 2c , JSON_ARRAY, 0,
6230: 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0);. }else{.
6240: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a return 0;. }.
6250: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6f 6f if( pParse->oo
6260: 6d 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 m ) return 0;.
6270: 72 65 74 75 72 6e 20 6a 73 6f 6e 4c 6f 6f 6b 75 return jsonLooku
6280: 70 28 70 50 61 72 73 65 2c 20 70 50 61 72 73 65 p(pParse, pParse
6290: 2d 3e 6e 4e 6f 64 65 2d 31 2c 20 7a 50 61 74 68 ->nNode-1, zPath
62a0: 2c 20 70 41 70 6e 64 29 3b 0a 7d 0a 0a 0a 2f 2a , pApnd);.}.../*
62b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
62c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
62d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
62e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
62f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 53 ***********.** S
6300: 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65 QL functions use
6310: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e d for testing an
6320: 64 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a 2a 2a d debugging.****
6330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6370: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66 64 65 ********/..#ifde
6380: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f f SQLITE_DEBUG./
6390: 2a 0a 2a 2a 20 54 68 65 20 6a 73 6f 6e 5f 70 61 *.** The json_pa
63a0: 72 73 65 28 4a 53 4f 4e 29 20 66 75 6e 63 74 69 rse(JSON) functi
63b0: 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 73 74 72 on returns a str
63c0: 69 6e 67 20 77 68 69 63 68 20 64 65 73 63 72 69 ing which descri
63d0: 62 65 73 0a 2a 2a 20 61 20 70 61 72 73 65 20 6f bes.** a parse o
63e0: 66 20 74 68 65 20 4a 53 4f 4e 20 70 72 6f 76 69 f the JSON provi
63f0: 64 65 64 2e 20 20 4f 72 20 69 74 20 72 65 74 75 ded. Or it retu
6400: 72 6e 73 20 4e 55 4c 4c 20 69 66 20 4a 53 4f 4e rns NULL if JSON
6410: 20 69 73 20 6e 6f 74 0a 2a 2a 20 77 65 6c 6c 2d is not.** well-
6420: 66 6f 72 6d 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 formed..*/.stati
6430: 63 20 76 6f 69 64 20 6a 73 6f 6e 50 61 72 73 65 c void jsonParse
6440: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f Func(. sqlite3_
6450: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 context *context
6460: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 ,. int argc,.
6470: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a sqlite3_value **
6480: 61 72 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e 53 74 argv.){. JsonSt
6490: 72 69 6e 67 20 73 3b 20 20 20 20 20 20 20 2f 2a ring s; /*
64a0: 20 4f 75 74 70 75 74 20 73 74 72 69 6e 67 20 2d Output string -
64b0: 20 6e 6f 74 20 72 65 61 6c 20 4a 53 4f 4e 20 2a not real JSON *
64c0: 2f 0a 20 20 4a 73 6f 6e 50 61 72 73 65 20 78 3b /. JsonParse x;
64d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 /* The p
64e0: 61 72 73 65 20 2a 2f 0a 20 20 75 33 32 20 69 3b arse */. u32 i;
64f0: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 . char zBuf[100
6500: 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 72 ];.. assert( ar
6510: 67 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 6a gc==1 );. if( j
6520: 73 6f 6e 50 61 72 73 65 28 26 78 2c 20 28 63 6f sonParse(&x, (co
6530: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 nst char*)sqlite
6540: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 3_value_text(arg
6550: 76 5b 30 5d 29 29 20 29 20 72 65 74 75 72 6e 3b v[0])) ) return;
6560: 0a 20 20 6a 73 6f 6e 49 6e 69 74 28 26 73 2c 20 . jsonInit(&s,
6570: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 66 6f 72 28 context);. for(
6580: 69 3d 30 3b 20 69 3c 78 2e 6e 4e 6f 64 65 3b 20 i=0; i<x.nNode;
6590: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 i++){. sqlite
65a0: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 3_snprintf(sizeo
65b0: 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 f(zBuf), zBuf, "
65c0: 6e 6f 64 65 20 25 33 75 3a 20 25 37 73 20 6e 3d node %3u: %7s n=
65d0: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 %d\n",.
65e0: 20 20 20 20 20 20 20 20 20 20 20 20 69 2c 20 6a i, j
65f0: 73 6f 6e 54 79 70 65 5b 78 2e 61 4e 6f 64 65 5b sonType[x.aNode[
6600: 69 5d 2e 65 54 79 70 65 5d 2c 20 78 2e 61 4e 6f i].eType], x.aNo
6610: 64 65 5b 69 5d 2e 6e 29 3b 0a 20 20 20 20 6a 73 de[i].n);. js
6620: 6f 6e 41 70 70 65 6e 64 28 26 73 2c 20 7a 42 75 onAppend(&s, zBu
6630: 66 29 3b 0a 20 20 20 20 69 66 28 20 78 2e 61 4e f);. if( x.aN
6640: 6f 64 65 5b 69 5d 2e 75 2e 7a 4a 43 6f 6e 74 65 ode[i].u.zJConte
6650: 6e 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 6a nt!=0 ){. j
6660: 73 6f 6e 41 70 70 65 6e 64 52 61 77 28 26 73 2c sonAppendRaw(&s,
6670: 20 22 20 20 20 20 74 65 78 74 3a 20 22 2c 20 31 " text: ", 1
6680: 30 29 3b 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70 0);. jsonAp
6690: 70 65 6e 64 52 61 77 28 26 73 2c 20 78 2e 61 4e pendRaw(&s, x.aN
66a0: 6f 64 65 5b 69 5d 2e 75 2e 7a 4a 43 6f 6e 74 65 ode[i].u.zJConte
66b0: 6e 74 2c 20 78 2e 61 4e 6f 64 65 5b 69 5d 2e 6e nt, x.aNode[i].n
66c0: 29 3b 0a 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 );. jsonApp
66d0: 65 6e 64 52 61 77 28 26 73 2c 20 22 5c 6e 22 2c endRaw(&s, "\n",
66e0: 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 1);. }. }.
66f0: 20 6a 73 6f 6e 50 61 72 73 65 52 65 73 65 74 28 jsonParseReset(
6700: 26 78 29 3b 0a 20 20 6a 73 6f 6e 52 65 73 75 6c &x);. jsonResul
6710: 74 28 26 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 t(&s);.}../*.**
6720: 54 68 65 20 6a 73 6f 6e 5f 74 65 73 74 31 28 4a The json_test1(J
6730: 53 4f 4e 29 20 66 75 6e 63 74 69 6f 6e 20 70 61 SON) function pa
6740: 72 73 65 73 20 61 6e 64 20 72 65 62 75 69 6c 64 rses and rebuild
6750: 73 20 74 68 65 20 4a 53 4f 4e 20 73 74 72 69 6e s the JSON strin
6760: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 g..*/.static voi
6770: 64 20 6a 73 6f 6e 54 65 73 74 31 46 75 6e 63 28 d jsonTest1Func(
6780: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 . sqlite3_conte
6790: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 xt *context,. i
67a0: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 nt argc,. sqlit
67b0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a e3_value **argv.
67c0: 29 7b 0a 20 20 4a 73 6f 6e 50 61 72 73 65 20 78 ){. JsonParse x
67d0: 3b 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 20 ; /* The parse
67e0: 2a 2f 0a 20 20 69 66 28 20 6a 73 6f 6e 50 61 72 */. if( jsonPar
67f0: 73 65 28 26 78 2c 20 28 63 6f 6e 73 74 20 63 68 se(&x, (const ch
6800: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 ar*)sqlite3_valu
6810: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 29 e_text(argv[0]))
6820: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6a 73 6f ) return;. jso
6830: 6e 52 65 74 75 72 6e 28 78 2e 61 4e 6f 64 65 2c nReturn(x.aNode,
6840: 20 63 6f 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 context, 0);.
6850: 6a 73 6f 6e 50 61 72 73 65 52 65 73 65 74 28 26 jsonParseReset(&
6860: 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 x);.}../*.** The
6870: 20 6a 73 6f 6e 5f 6e 6f 64 65 63 6f 75 6e 74 28 json_nodecount(
6880: 4a 53 4f 4e 29 20 66 75 6e 63 74 69 6f 6e 20 72 JSON) function r
6890: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 eturns the numbe
68a0: 72 20 6f 66 20 6e 6f 64 65 73 20 69 6e 20 74 68 r of nodes in th
68b0: 65 0a 2a 2a 20 69 6e 70 75 74 20 4a 53 4f 4e 20 e.** input JSON
68c0: 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 string..*/.stati
68d0: 63 20 76 6f 69 64 20 6a 73 6f 6e 4e 6f 64 65 43 c void jsonNodeC
68e0: 6f 75 6e 74 46 75 6e 63 28 0a 20 20 73 71 6c 69 ountFunc(. sqli
68f0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e te3_context *con
6900: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 text,. int argc
6910: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 ,. sqlite3_valu
6920: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 4a 73 e **argv.){. Js
6930: 6f 6e 50 61 72 73 65 20 78 3b 20 20 2f 2a 20 54 onParse x; /* T
6940: 68 65 20 70 61 72 73 65 20 2a 2f 0a 20 20 69 66 he parse */. if
6950: 28 20 6a 73 6f 6e 50 61 72 73 65 28 26 78 2c 20 ( jsonParse(&x,
6960: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c (const char*)sql
6970: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 ite3_value_text(
6980: 61 72 67 76 5b 30 5d 29 29 20 29 20 72 65 74 75 argv[0])) ) retu
6990: 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 rn;. sqlite3_re
69a0: 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 sult_int64(conte
69b0: 78 74 2c 20 78 2e 6e 4e 6f 64 65 29 3b 0a 20 20 xt, x.nNode);.
69c0: 6a 73 6f 6e 50 61 72 73 65 52 65 73 65 74 28 26 jsonParseReset(&
69d0: 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 x);.}.#endif /*
69e0: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a SQLITE_DEBUG */.
69f0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ./**************
6a00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a **************.*
6a40: 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 69 * SQL function i
6a50: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a mplementations.*
6a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6a70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a ***********/../*
6ab0: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 .** Implementati
6ac0: 6f 6e 20 6f 66 20 74 68 65 20 6a 73 6f 6e 5f 61 on of the json_a
6ad0: 72 72 61 79 28 56 41 4c 55 45 2c 2e 2e 2e 29 20 rray(VALUE,...)
6ae0: 66 75 6e 63 74 69 6f 6e 2e 20 20 52 65 74 75 72 function. Retur
6af0: 6e 20 61 20 4a 53 4f 4e 0a 2a 2a 20 61 72 72 61 n a JSON.** arra
6b00: 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 y that contains
6b10: 61 6c 6c 20 76 61 6c 75 65 73 20 67 69 76 65 6e all values given
6b20: 20 69 6e 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 in arguments.
6b30: 4f 72 20 69 66 20 61 6e 79 20 61 72 67 75 6d 65 Or if any argume
6b40: 6e 74 0a 2a 2a 20 69 73 20 61 20 42 4c 4f 42 2c nt.** is a BLOB,
6b50: 20 74 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 2e throw an error.
6b60: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 .*/.static void
6b70: 6a 73 6f 6e 41 72 72 61 79 46 75 6e 63 28 0a 20 jsonArrayFunc(.
6b80: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 sqlite3_context
6b90: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 *context,. int
6ba0: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 argc,. sqlite3
6bb0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b _value **argv.){
6bc0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4a 73 6f 6e . int i;. Json
6bd0: 53 74 72 69 6e 67 20 6a 78 3b 0a 0a 20 20 6a 73 String jx;.. js
6be0: 6f 6e 49 6e 69 74 28 26 6a 78 2c 20 63 6f 6e 74 onInit(&jx, cont
6bf0: 65 78 74 29 3b 0a 20 20 6a 73 6f 6e 41 70 70 65 ext);. jsonAppe
6c00: 6e 64 43 68 61 72 28 26 6a 78 2c 20 27 5b 27 29 ndChar(&jx, '[')
6c10: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 ;. for(i=0; i<a
6c20: 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6a rgc; i++){. j
6c30: 73 6f 6e 41 70 70 65 6e 64 53 65 70 61 72 61 74 sonAppendSeparat
6c40: 6f 72 28 26 6a 78 29 3b 0a 20 20 20 20 6a 73 6f or(&jx);. jso
6c50: 6e 41 70 70 65 6e 64 56 61 6c 75 65 28 26 6a 78 nAppendValue(&jx
6c60: 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20 7d 0a , argv[i]);. }.
6c70: 20 20 6a 73 6f 6e 41 70 70 65 6e 64 43 68 61 72 jsonAppendChar
6c80: 28 26 6a 78 2c 20 27 5d 27 29 3b 0a 20 20 6a 73 (&jx, ']');. js
6c90: 6f 6e 52 65 73 75 6c 74 28 26 6a 78 29 3b 0a 7d onResult(&jx);.}
6ca0: 0a 0a 0a 2f 2a 0a 2a 2a 20 6a 73 6f 6e 5f 61 72 .../*.** json_ar
6cb0: 72 61 79 5f 6c 65 6e 67 74 68 28 4a 53 4f 4e 29 ray_length(JSON)
6cc0: 0a 2a 2a 20 6a 73 6f 6e 5f 61 72 72 61 79 5f 6c .** json_array_l
6cd0: 65 6e 67 74 68 28 4a 53 4f 4e 2c 20 50 41 54 48 ength(JSON, PATH
6ce0: 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 ).**.** Return t
6cf0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 he number of ele
6d00: 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 74 6f 70 ments in the top
6d10: 2d 6c 65 76 65 6c 20 4a 53 4f 4e 20 61 72 72 61 -level JSON arra
6d20: 79 2e 20 20 0a 2a 2a 20 52 65 74 75 72 6e 20 30 y. .** Return 0
6d30: 20 69 66 20 74 68 65 20 69 6e 70 75 74 20 69 73 if the input is
6d40: 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d not a well-form
6d50: 65 64 20 4a 53 4f 4e 20 61 72 72 61 79 2e 0a 2a ed JSON array..*
6d60: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 /.static void js
6d70: 6f 6e 41 72 72 61 79 4c 65 6e 67 74 68 46 75 6e onArrayLengthFun
6d80: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e c(. sqlite3_con
6d90: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 text *context,.
6da0: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c int argc,. sql
6db0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 ite3_value **arg
6dc0: 76 0a 29 7b 0a 20 20 4a 73 6f 6e 50 61 72 73 65 v.){. JsonParse
6dd0: 20 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 x; /*
6de0: 54 68 65 20 70 61 72 73 65 20 2a 2f 0a 20 20 73 The parse */. s
6df0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 20 3d qlite3_int64 n =
6e00: 20 30 3b 0a 20 20 75 33 32 20 69 3b 0a 20 20 63 0;. u32 i;. c
6e10: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 onst char *zPath
6e20: 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 32 ;.. if( argc==2
6e30: 20 29 7b 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 ){. zPath =
6e40: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c (const char*)sql
6e50: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 ite3_value_text(
6e60: 61 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 69 66 argv[1]);. if
6e70: 28 20 7a 50 61 74 68 3d 3d 30 20 29 20 72 65 74 ( zPath==0 ) ret
6e80: 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 urn;. if( zPa
6e90: 74 68 5b 30 5d 21 3d 27 24 27 20 29 20 72 65 74 th[0]!='$' ) ret
6ea0: 75 72 6e 3b 0a 20 20 20 20 7a 50 61 74 68 2b 2b urn;. zPath++
6eb0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a ;. }else{. z
6ec0: 50 61 74 68 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 Path = 0;. }.
6ed0: 69 66 28 20 6a 73 6f 6e 50 61 72 73 65 28 26 78 if( jsonParse(&x
6ee0: 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 , (const char*)s
6ef0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 qlite3_value_tex
6f00: 74 28 61 72 67 76 5b 30 5d 29 29 3d 3d 30 20 29 t(argv[0]))==0 )
6f10: 7b 0a 20 20 20 20 69 66 28 20 78 2e 6e 4e 6f 64 {. if( x.nNod
6f20: 65 20 29 7b 0a 20 20 20 20 20 20 4a 73 6f 6e 4e e ){. JsonN
6f30: 6f 64 65 20 2a 70 4e 6f 64 65 20 3d 20 78 2e 61 ode *pNode = x.a
6f40: 4e 6f 64 65 3b 0a 20 20 20 20 20 20 69 66 28 20 Node;. if(
6f50: 7a 50 61 74 68 20 29 20 70 4e 6f 64 65 20 3d 20 zPath ) pNode =
6f60: 6a 73 6f 6e 4c 6f 6f 6b 75 70 28 26 78 2c 20 30 jsonLookup(&x, 0
6f70: 2c 20 7a 50 61 74 68 2c 20 30 29 3b 0a 20 20 20 , zPath, 0);.
6f80: 20 20 20 69 66 28 20 70 4e 6f 64 65 2d 3e 65 54 if( pNode->eT
6f90: 79 70 65 3d 3d 4a 53 4f 4e 5f 41 52 52 41 59 20 ype==JSON_ARRAY
6fa0: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 ){. asser
6fb0: 74 28 20 28 70 4e 6f 64 65 2d 3e 6a 6e 46 6c 61 t( (pNode->jnFla
6fc0: 67 73 20 26 20 4a 4e 4f 44 45 5f 41 50 50 45 4e gs & JNODE_APPEN
6fd0: 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 D)==0 );.
6fe0: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 4e 6f for(i=1; i<=pNo
6ff0: 64 65 2d 3e 6e 3b 20 6e 2b 2b 29 7b 0a 20 20 20 de->n; n++){.
7000: 20 20 20 20 20 20 20 69 20 2b 3d 20 6a 73 6f 6e i += json
7010: 4e 6f 64 65 53 69 7a 65 28 26 70 4e 6f 64 65 5b NodeSize(&pNode[
7020: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 i]);. }.
7030: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 }. }.
7040: 20 6a 73 6f 6e 50 61 72 73 65 52 65 73 65 74 28 jsonParseReset(
7050: 26 78 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 &x);. }. sqlit
7060: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 e3_result_int64(
7070: 63 6f 6e 74 65 78 74 2c 20 6e 29 3b 0a 7d 0a 0a context, n);.}..
7080: 2f 2a 0a 2a 2a 20 6a 73 6f 6e 5f 65 78 74 72 61 /*.** json_extra
7090: 63 74 28 4a 53 4f 4e 2c 20 50 41 54 48 29 0a 2a ct(JSON, PATH).*
70a0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 *.** Return the
70b0: 65 6c 65 6d 65 6e 74 20 64 65 73 63 72 69 62 65 element describe
70c0: 64 20 62 79 20 50 41 54 48 2e 20 20 52 65 74 75 d by PATH. Retu
70d0: 72 6e 20 4e 55 4c 4c 20 69 66 20 4a 53 4f 4e 20 rn NULL if JSON
70e0: 69 73 20 6e 6f 74 0a 2a 2a 20 76 61 6c 69 64 20 is not.** valid
70f0: 4a 53 4f 4e 20 6f 72 20 69 66 20 74 68 65 72 65 JSON or if there
7100: 20 69 73 20 6e 6f 20 50 41 54 48 20 65 6c 65 6d is no PATH elem
7110: 65 6e 74 20 6f 72 20 69 66 20 50 41 54 48 20 69 ent or if PATH i
7120: 73 20 6d 61 6c 66 6f 72 6d 65 64 2e 0a 2a 2f 0a s malformed..*/.
7130: 73 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e static void json
7140: 45 78 74 72 61 63 74 46 75 6e 63 28 0a 20 20 73 ExtractFunc(. s
7150: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a qlite3_context *
7160: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 context,. int a
7170: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 rgc,. sqlite3_v
7180: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 alue **argv.){.
7190: 20 4a 73 6f 6e 50 61 72 73 65 20 78 3b 20 20 20 JsonParse x;
71a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 /* The pa
71b0: 72 73 65 20 2a 2f 0a 20 20 4a 73 6f 6e 4e 6f 64 rse */. JsonNod
71c0: 65 20 2a 70 4e 6f 64 65 3b 0a 20 20 63 6f 6e 73 e *pNode;. cons
71d0: 74 20 63 68 61 72 20 2a 7a 50 61 74 68 3b 0a 20 t char *zPath;.
71e0: 20 61 73 73 65 72 74 28 20 61 72 67 63 3d 3d 32 assert( argc==2
71f0: 20 29 3b 0a 20 20 7a 50 61 74 68 20 3d 20 28 63 );. zPath = (c
7200: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 onst char*)sqlit
7210: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 e3_value_text(ar
7220: 67 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20 7a 50 gv[1]);. if( zP
7230: 61 74 68 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b ath==0 ) return;
7240: 0a 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d 21 . if( zPath[0]!
7250: 3d 27 24 27 20 29 20 72 65 74 75 72 6e 3b 0a 20 ='$' ) return;.
7260: 20 7a 50 61 74 68 2b 2b 3b 0a 20 20 69 66 28 20 zPath++;. if(
7270: 6a 73 6f 6e 50 61 72 73 65 28 26 78 2c 20 28 63 jsonParse(&x, (c
7280: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 onst char*)sqlit
7290: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 e3_value_text(ar
72a0: 67 76 5b 30 5d 29 29 20 29 20 72 65 74 75 72 6e gv[0])) ) return
72b0: 3b 0a 20 20 70 4e 6f 64 65 20 3d 20 6a 73 6f 6e ;. pNode = json
72c0: 4c 6f 6f 6b 75 70 28 26 78 2c 20 30 2c 20 7a 50 Lookup(&x, 0, zP
72d0: 61 74 68 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 ath, 0);. if( p
72e0: 4e 6f 64 65 20 29 7b 0a 20 20 20 20 6a 73 6f 6e Node ){. json
72f0: 52 65 74 75 72 6e 28 70 4e 6f 64 65 2c 20 63 6f Return(pNode, co
7300: 6e 74 65 78 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 ntext, 0);. }.
7310: 20 6a 73 6f 6e 50 61 72 73 65 52 65 73 65 74 28 jsonParseReset(
7320: 26 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d &x);.}../*.** Im
7330: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 plementation of
7340: 74 68 65 20 6a 73 6f 6e 5f 6f 62 6a 65 63 74 28 the json_object(
7350: 4e 41 4d 45 2c 56 41 4c 55 45 2c 2e 2e 2e 29 20 NAME,VALUE,...)
7360: 66 75 6e 63 74 69 6f 6e 2e 20 20 52 65 74 75 72 function. Retur
7370: 6e 20 61 20 4a 53 4f 4e 0a 2a 2a 20 6f 62 6a 65 n a JSON.** obje
7380: 63 74 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 ct that contains
7390: 20 61 6c 6c 20 6e 61 6d 65 2f 76 61 6c 75 65 20 all name/value
73a0: 67 69 76 65 6e 20 69 6e 20 61 72 67 75 6d 65 6e given in argumen
73b0: 74 73 2e 20 20 4f 72 20 69 66 20 61 6e 79 20 6e ts. Or if any n
73c0: 61 6d 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 20 ame.** is not a
73d0: 73 74 72 69 6e 67 20 6f 72 20 69 66 20 61 6e 79 string or if any
73e0: 20 76 61 6c 75 65 20 69 73 20 61 20 42 4c 4f 42 value is a BLOB
73f0: 2c 20 74 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 , throw an error
7400: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 ..*/.static void
7410: 20 6a 73 6f 6e 4f 62 6a 65 63 74 46 75 6e 63 28 jsonObjectFunc(
7420: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 . sqlite3_conte
7430: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 xt *context,. i
7440: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 nt argc,. sqlit
7450: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a e3_value **argv.
7460: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4a 73 ){. int i;. Js
7470: 6f 6e 53 74 72 69 6e 67 20 6a 78 3b 0a 20 20 63 onString jx;. c
7480: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 onst char *z;.
7490: 75 33 32 20 6e 3b 0a 0a 20 20 69 66 28 20 61 72 u32 n;.. if( ar
74a0: 67 63 26 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 gc&1 ){. sqli
74b0: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 te3_result_error
74c0: 28 63 6f 6e 74 65 78 74 2c 20 22 6a 73 6f 6e 5f (context, "json_
74d0: 6f 62 6a 65 63 74 28 29 20 72 65 71 75 69 72 65 object() require
74e0: 73 20 61 6e 20 65 76 65 6e 20 6e 75 6d 62 65 72 s an even number
74f0: 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ".
7500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7510: 20 20 20 20 20 22 6f 66 20 61 72 67 75 6d 65 6e "of argumen
7520: 74 73 22 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 ts", -1);. re
7530: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6a 73 6f 6e turn;. }. json
7540: 49 6e 69 74 28 26 6a 78 2c 20 63 6f 6e 74 65 78 Init(&jx, contex
7550: 74 29 3b 0a 20 20 6a 73 6f 6e 41 70 70 65 6e 64 t);. jsonAppend
7560: 43 68 61 72 28 26 6a 78 2c 20 27 7b 27 29 3b 0a Char(&jx, '{');.
7570: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 for(i=0; i<arg
7580: 63 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 69 66 c; i+=2){. if
7590: 28 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f ( sqlite3_value_
75a0: 74 79 70 65 28 61 72 67 76 5b 69 5d 29 21 3d 53 type(argv[i])!=S
75b0: 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20 QLITE_TEXT ){.
75c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 sqlite3_resu
75d0: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 lt_error(context
75e0: 2c 20 22 6a 73 6f 6e 5f 6f 62 6a 65 63 74 28 29 , "json_object()
75f0: 20 6c 61 62 65 6c 73 20 6d 75 73 74 20 62 65 20 labels must be
7600: 54 45 58 54 22 2c 20 2d 31 29 3b 0a 20 20 20 20 TEXT", -1);.
7610: 20 20 6a 73 6f 6e 5a 65 72 6f 28 26 6a 78 29 3b jsonZero(&jx);
7620: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 . return;.
7630: 20 20 20 7d 0a 20 20 20 20 6a 73 6f 6e 41 70 70 }. jsonApp
7640: 65 6e 64 53 65 70 61 72 61 74 6f 72 28 26 6a 78 endSeparator(&jx
7650: 29 3b 0a 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73 );. z = (cons
7660: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f t char*)sqlite3_
7670: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b value_text(argv[
7680: 69 5d 29 3b 0a 20 20 20 20 6e 20 3d 20 28 75 33 i]);. n = (u3
7690: 32 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 2)sqlite3_value_
76a0: 62 79 74 65 73 28 61 72 67 76 5b 69 5d 29 3b 0a bytes(argv[i]);.
76b0: 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 53 74 jsonAppendSt
76c0: 72 69 6e 67 28 26 6a 78 2c 20 7a 2c 20 6e 29 3b ring(&jx, z, n);
76d0: 0a 20 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 43 . jsonAppendC
76e0: 68 61 72 28 26 6a 78 2c 20 27 3a 27 29 3b 0a 20 har(&jx, ':');.
76f0: 20 20 20 6a 73 6f 6e 41 70 70 65 6e 64 56 61 6c jsonAppendVal
7700: 75 65 28 26 6a 78 2c 20 61 72 67 76 5b 69 2b 31 ue(&jx, argv[i+1
7710: 5d 29 3b 0a 20 20 7d 0a 20 20 6a 73 6f 6e 41 70 ]);. }. jsonAp
7720: 70 65 6e 64 43 68 61 72 28 26 6a 78 2c 20 27 7d pendChar(&jx, '}
7730: 27 29 3b 0a 20 20 6a 73 6f 6e 52 65 73 75 6c 74 ');. jsonResult
7740: 28 26 6a 78 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a (&jx);.}.../*.**
7750: 20 6a 73 6f 6e 5f 72 65 6d 6f 76 65 28 4a 53 4f json_remove(JSO
7760: 4e 2c 20 50 41 54 48 2c 20 2e 2e 2e 29 0a 2a 2a N, PATH, ...).**
7770: 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6e .** Remove the n
7780: 61 6d 65 64 20 65 6c 65 6d 65 6e 74 73 20 66 72 amed elements fr
7790: 6f 6d 20 4a 53 4f 4e 20 61 6e 64 20 72 65 74 75 om JSON and retu
77a0: 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 20 20 rn the result.
77b0: 49 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 50 41 Ill-formed.** PA
77c0: 54 48 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 TH arguments are
77d0: 20 73 69 6c 65 6e 74 6c 79 20 69 67 6e 6f 72 65 silently ignore
77e0: 64 2e 20 20 49 66 20 4a 53 4f 4e 20 69 73 20 69 d. If JSON is i
77f0: 6c 6c 2d 66 6f 72 6d 65 64 2c 20 74 68 65 6e 20 ll-formed, then
7800: 4e 55 4c 4c 0a 2a 2a 20 69 73 20 72 65 74 75 72 NULL.** is retur
7810: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 ned..*/.static v
7820: 6f 69 64 20 6a 73 6f 6e 52 65 6d 6f 76 65 46 75 oid jsonRemoveFu
7830: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f nc(. sqlite3_co
7840: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a ntext *context,.
7850: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 int argc,. sq
7860: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 lite3_value **ar
7870: 67 76 0a 29 7b 0a 20 20 4a 73 6f 6e 50 61 72 73 gv.){. JsonPars
7880: 65 20 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a e x; /*
7890: 20 54 68 65 20 70 61 72 73 65 20 2a 2f 0a 20 20 The parse */.
78a0: 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 3b JsonNode *pNode;
78b0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a . const char *z
78c0: 50 61 74 68 3b 0a 20 20 75 33 32 20 69 3b 0a 0a Path;. u32 i;..
78d0: 20 20 69 66 28 20 61 72 67 63 3c 31 20 29 20 72 if( argc<1 ) r
78e0: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6a 73 6f eturn;. if( jso
78f0: 6e 50 61 72 73 65 28 26 78 2c 20 28 63 6f 6e 73 nParse(&x, (cons
7900: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f t char*)sqlite3_
7910: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b value_text(argv[
7920: 30 5d 29 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 0])) ) return;.
7930: 20 69 66 28 20 78 2e 6e 4e 6f 64 65 20 29 7b 0a if( x.nNode ){.
7940: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 61 for(i=1; i<a
7950: 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 rgc; i++){.
7960: 20 7a 50 61 74 68 20 3d 20 28 63 6f 6e 73 74 20 zPath = (const
7970: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 char*)sqlite3_va
7980: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 69 5d lue_text(argv[i]
7990: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 61 );. if( zPa
79a0: 74 68 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 th==0 ) continue
79b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 61 74 ;. if( zPat
79c0: 68 5b 30 5d 21 3d 27 24 27 20 29 20 63 6f 6e 74 h[0]!='$' ) cont
79d0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 4e 6f 64 inue;. pNod
79e0: 65 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 28 26 e = jsonLookup(&
79f0: 78 2c 20 30 2c 20 26 7a 50 61 74 68 5b 31 5d 2c x, 0, &zPath[1],
7a00: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 0);. if( p
7a10: 4e 6f 64 65 20 29 20 70 4e 6f 64 65 2d 3e 6a 6e Node ) pNode->jn
7a20: 46 6c 61 67 73 20 7c 3d 20 4a 4e 4f 44 45 5f 52 Flags |= JNODE_R
7a30: 45 4d 4f 56 45 3b 0a 20 20 20 20 7d 0a 20 20 20 EMOVE;. }.
7a40: 20 69 66 28 20 28 78 2e 61 4e 6f 64 65 5b 30 5d if( (x.aNode[0]
7a50: 2e 6a 6e 46 6c 61 67 73 20 26 20 4a 4e 4f 44 45 .jnFlags & JNODE
7a60: 5f 52 45 4d 4f 56 45 29 3d 3d 30 20 29 7b 0a 20 _REMOVE)==0 ){.
7a70: 20 20 20 20 20 6a 73 6f 6e 52 65 74 75 72 6e 28 jsonReturn(
7a80: 78 2e 61 4e 6f 64 65 2c 20 63 6f 6e 74 65 78 74 x.aNode, context
7a90: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a , 0);. }. }.
7aa0: 20 20 6a 73 6f 6e 50 61 72 73 65 52 65 73 65 74 jsonParseReset
7ab0: 28 26 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 6a (&x);.}../*.** j
7ac0: 73 6f 6e 5f 72 65 70 6c 61 63 65 28 4a 53 4f 4e son_replace(JSON
7ad0: 2c 20 50 41 54 48 2c 20 56 41 4c 55 45 2c 20 2e , PATH, VALUE, .
7ae0: 2e 2e 29 0a 2a 2a 0a 2a 2a 20 52 65 70 6c 61 63 ..).**.** Replac
7af0: 65 20 74 68 65 20 76 61 6c 75 65 20 61 74 20 50 e the value at P
7b00: 41 54 48 20 77 69 74 68 20 56 41 4c 55 45 2e 20 ATH with VALUE.
7b10: 20 49 66 20 50 41 54 48 20 64 6f 65 73 20 6e 6f If PATH does no
7b20: 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 2c t already exist,
7b30: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 .** this routine
7b40: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 is a no-op. If
7b50: 20 4a 53 4f 4e 20 69 73 20 69 6c 6c 2d 66 6f 72 JSON is ill-for
7b60: 6d 65 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c med, return NULL
7b70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 ..*/.static void
7b80: 20 6a 73 6f 6e 52 65 70 6c 61 63 65 46 75 6e 63 jsonReplaceFunc
7b90: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 (. sqlite3_cont
7ba0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 ext *context,.
7bb0: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 int argc,. sqli
7bc0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 te3_value **argv
7bd0: 0a 29 7b 0a 20 20 4a 73 6f 6e 50 61 72 73 65 20 .){. JsonParse
7be0: 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 x; /* T
7bf0: 68 65 20 70 61 72 73 65 20 2a 2f 0a 20 20 4a 73 he parse */. Js
7c00: 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 3b 0a 20 onNode *pNode;.
7c10: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 const char *zPa
7c20: 74 68 3b 0a 20 20 75 33 32 20 69 3b 0a 0a 20 20 th;. u32 i;..
7c30: 69 66 28 20 61 72 67 63 3c 31 20 29 20 72 65 74 if( argc<1 ) ret
7c40: 75 72 6e 3b 0a 20 20 69 66 28 20 28 61 72 67 63 urn;. if( (argc
7c50: 26 31 29 3d 3d 30 20 29 20 7b 0a 20 20 20 20 73 &1)==0 ) {. s
7c60: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 qlite3_result_er
7c70: 72 6f 72 28 63 6f 6e 74 65 78 74 2c 0a 20 20 20 ror(context,.
7c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7c90: 20 20 20 20 20 20 22 6a 73 6f 6e 5f 72 65 70 6c "json_repl
7ca0: 61 63 65 28 29 20 6e 65 65 64 73 20 61 6e 20 6f ace() needs an o
7cb0: 64 64 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 dd number of arg
7cc0: 75 6d 65 6e 74 73 22 2c 20 2d 31 29 3b 0a 20 20 uments", -1);.
7cd0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 return;. }.
7ce0: 69 66 28 20 6a 73 6f 6e 50 61 72 73 65 28 26 78 if( jsonParse(&x
7cf0: 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 , (const char*)s
7d00: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 qlite3_value_tex
7d10: 74 28 61 72 67 76 5b 30 5d 29 29 20 29 20 72 65 t(argv[0])) ) re
7d20: 74 75 72 6e 3b 0a 20 20 69 66 28 20 78 2e 6e 4e turn;. if( x.nN
7d30: 6f 64 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 ode ){. for(i
7d40: 3d 31 3b 20 69 3c 61 72 67 63 3b 20 69 2b 3d 32 =1; i<argc; i+=2
7d50: 29 7b 0a 20 20 20 20 20 20 7a 50 61 74 68 20 3d ){. zPath =
7d60: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 (const char*)sq
7d70: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 lite3_value_text
7d80: 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20 (argv[i]);.
7d90: 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20 29 20 if( zPath==0 )
7da0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 continue;.
7db0: 69 66 28 20 7a 50 61 74 68 5b 30 5d 21 3d 27 24 if( zPath[0]!='$
7dc0: 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 ' ) continue;.
7dd0: 20 20 20 20 70 4e 6f 64 65 20 3d 20 6a 73 6f 6e pNode = json
7de0: 4c 6f 6f 6b 75 70 28 26 78 2c 20 30 2c 20 26 7a Lookup(&x, 0, &z
7df0: 50 61 74 68 5b 31 5d 2c 20 30 29 3b 0a 20 20 20 Path[1], 0);.
7e00: 20 20 20 69 66 28 20 70 4e 6f 64 65 20 29 7b 0a if( pNode ){.
7e10: 20 20 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 6a pNode->j
7e20: 6e 46 6c 61 67 73 20 7c 3d 20 4a 4e 4f 44 45 5f nFlags |= JNODE_
7e30: 52 45 50 4c 41 43 45 3b 0a 20 20 20 20 20 20 20 REPLACE;.
7e40: 20 70 4e 6f 64 65 2d 3e 69 56 61 6c 20 3d 20 69 pNode->iVal = i
7e50: 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 +1;. }.
7e60: 7d 0a 20 20 20 20 69 66 28 20 78 2e 61 4e 6f 64 }. if( x.aNod
7e70: 65 5b 30 5d 2e 6a 6e 46 6c 61 67 73 20 26 20 4a e[0].jnFlags & J
7e80: 4e 4f 44 45 5f 52 45 50 4c 41 43 45 20 29 7b 0a NODE_REPLACE ){.
7e90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 sqlite3_re
7ea0: 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65 sult_value(conte
7eb0: 78 74 2c 20 61 72 67 76 5b 78 2e 61 4e 6f 64 65 xt, argv[x.aNode
7ec0: 5b 30 5d 2e 69 56 61 6c 5d 29 3b 0a 20 20 20 20 [0].iVal]);.
7ed0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 73 6f }else{. jso
7ee0: 6e 52 65 74 75 72 6e 28 78 2e 61 4e 6f 64 65 2c nReturn(x.aNode,
7ef0: 20 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 29 3b context, argv);
7f00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6a 73 6f . }. }. jso
7f10: 6e 50 61 72 73 65 52 65 73 65 74 28 26 78 29 3b nParseReset(&x);
7f20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 6a 73 6f 6e 5f 73 .}../*.** json_s
7f30: 65 74 28 4a 53 4f 4e 2c 20 50 41 54 48 2c 20 56 et(JSON, PATH, V
7f40: 41 4c 55 45 2c 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a ALUE, ...).**.**
7f50: 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 61 Set the value a
7f60: 74 20 50 41 54 48 20 74 6f 20 56 41 4c 55 45 2e t PATH to VALUE.
7f70: 20 20 43 72 65 61 74 65 20 74 68 65 20 50 41 54 Create the PAT
7f80: 48 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 H if it does not
7f90: 20 61 6c 72 65 61 64 79 0a 2a 2a 20 65 78 69 73 already.** exis
7fa0: 74 2e 20 20 4f 76 65 72 77 72 69 74 65 20 65 78 t. Overwrite ex
7fb0: 69 73 74 69 6e 67 20 76 61 6c 75 65 73 20 74 68 isting values th
7fc0: 61 74 20 64 6f 20 65 78 69 73 74 2e 0a 2a 2a 20 at do exist..**
7fd0: 49 66 20 4a 53 4f 4e 20 69 73 20 69 6c 6c 2d 66 If JSON is ill-f
7fe0: 6f 72 6d 65 64 2c 20 72 65 74 75 72 6e 20 4e 55 ormed, return NU
7ff0: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 6a 73 6f 6e 5f 69 LL..**.** json_i
8000: 6e 73 65 72 74 28 4a 53 4f 4e 2c 20 50 41 54 48 nsert(JSON, PATH
8010: 2c 20 56 41 4c 55 45 2c 20 2e 2e 2e 29 0a 2a 2a , VALUE, ...).**
8020: 0a 2a 2a 20 43 72 65 61 74 65 20 50 41 54 48 20 .** Create PATH
8030: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 and initialize i
8040: 74 20 74 6f 20 56 41 4c 55 45 2e 20 20 49 66 20 t to VALUE. If
8050: 50 41 54 48 20 61 6c 72 65 61 64 79 20 65 78 69 PATH already exi
8060: 73 74 73 2c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 sts, this.** rou
8070: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e tine is a no-op.
8080: 20 20 49 66 20 4a 53 4f 4e 20 69 73 20 69 6c 6c If JSON is ill
8090: 2d 66 6f 72 6d 65 64 2c 20 72 65 74 75 72 6e 20 -formed, return
80a0: 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 NULL..*/.static
80b0: 76 6f 69 64 20 6a 73 6f 6e 53 65 74 46 75 6e 63 void jsonSetFunc
80c0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 (. sqlite3_cont
80d0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 ext *context,.
80e0: 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 int argc,. sqli
80f0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 te3_value **argv
8100: 0a 29 7b 0a 20 20 4a 73 6f 6e 50 61 72 73 65 20 .){. JsonParse
8110: 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 x; /* T
8120: 68 65 20 70 61 72 73 65 20 2a 2f 0a 20 20 4a 73 he parse */. Js
8130: 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 3b 0a 20 onNode *pNode;.
8140: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 const char *zPa
8150: 74 68 3b 0a 20 20 75 33 32 20 69 3b 0a 20 20 69 th;. u32 i;. i
8160: 6e 74 20 62 41 70 6e 64 3b 0a 20 20 69 6e 74 20 nt bApnd;. int
8170: 62 49 73 53 65 74 20 3d 20 2a 28 69 6e 74 2a 29 bIsSet = *(int*)
8180: 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 sqlite3_user_dat
8190: 61 28 63 6f 6e 74 65 78 74 29 3b 0a 0a 20 20 69 a(context);.. i
81a0: 66 28 20 61 72 67 63 3c 31 20 29 20 72 65 74 75 f( argc<1 ) retu
81b0: 72 6e 3b 0a 20 20 69 66 28 20 28 61 72 67 63 26 rn;. if( (argc&
81c0: 31 29 3d 3d 30 20 29 20 7b 0a 20 20 20 20 73 71 1)==0 ) {. sq
81d0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 lite3_result_err
81e0: 6f 72 28 63 6f 6e 74 65 78 74 2c 0a 20 20 20 20 or(context,.
81f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8200: 20 20 20 20 20 22 6a 73 6f 6e 5f 73 65 74 28 29 "json_set()
8210: 20 6e 65 65 64 73 20 61 6e 20 6f 64 64 20 6e 75 needs an odd nu
8220: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 mber of argument
8230: 73 22 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 s", -1);. ret
8240: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6a urn;. }. if( j
8250: 73 6f 6e 50 61 72 73 65 28 26 78 2c 20 28 63 6f sonParse(&x, (co
8260: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 nst char*)sqlite
8270: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 3_value_text(arg
8280: 76 5b 30 5d 29 29 20 29 20 72 65 74 75 72 6e 3b v[0])) ) return;
8290: 0a 20 20 69 66 28 20 78 2e 6e 4e 6f 64 65 20 29 . if( x.nNode )
82a0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 {. for(i=1; i
82b0: 3c 61 72 67 63 3b 20 69 2b 3d 32 29 7b 0a 20 20 <argc; i+=2){.
82c0: 20 20 20 20 7a 50 61 74 68 20 3d 20 28 63 6f 6e zPath = (con
82d0: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 st char*)sqlite3
82e0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 _value_text(argv
82f0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 [i]);. if(
8300: 7a 50 61 74 68 3d 3d 30 20 29 20 63 6f 6e 74 69 zPath==0 ) conti
8310: 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a nue;. if( z
8320: 50 61 74 68 5b 30 5d 21 3d 27 24 27 20 29 20 63 Path[0]!='$' ) c
8330: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 62 ontinue;. b
8340: 41 70 6e 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 Apnd = 0;.
8350: 70 4e 6f 64 65 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b pNode = jsonLook
8360: 75 70 28 26 78 2c 20 30 2c 20 26 7a 50 61 74 68 up(&x, 0, &zPath
8370: 5b 31 5d 2c 20 26 62 41 70 6e 64 29 3b 0a 20 20 [1], &bApnd);.
8380: 20 20 20 20 69 66 28 20 70 4e 6f 64 65 20 26 26 if( pNode &&
8390: 20 28 62 41 70 6e 64 20 7c 7c 20 62 49 73 53 65 (bApnd || bIsSe
83a0: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e t) ){. pN
83b0: 6f 64 65 2d 3e 6a 6e 46 6c 61 67 73 20 7c 3d 20 ode->jnFlags |=
83c0: 4a 4e 4f 44 45 5f 52 45 50 4c 41 43 45 3b 0a 20 JNODE_REPLACE;.
83d0: 20 20 20 20 20 20 20 70 4e 6f 64 65 2d 3e 69 56 pNode->iV
83e0: 61 6c 20 3d 20 69 2b 31 3b 0a 20 20 20 20 20 20 al = i+1;.
83f0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 }. }. if(
8400: 78 2e 61 4e 6f 64 65 5b 30 5d 2e 6a 6e 46 6c 61 x.aNode[0].jnFla
8410: 67 73 20 26 20 4a 4e 4f 44 45 5f 52 45 50 4c 41 gs & JNODE_REPLA
8420: 43 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 CE ){. sqli
8430: 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 te3_result_value
8440: 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 78 (context, argv[x
8450: 2e 61 4e 6f 64 65 5b 30 5d 2e 69 56 61 6c 5d 29 .aNode[0].iVal])
8460: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 ;. }else{.
8470: 20 20 20 6a 73 6f 6e 52 65 74 75 72 6e 28 78 2e jsonReturn(x.
8480: 61 4e 6f 64 65 2c 20 63 6f 6e 74 65 78 74 2c 20 aNode, context,
8490: 61 72 67 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d argv);. }. }
84a0: 0a 20 20 6a 73 6f 6e 50 61 72 73 65 52 65 73 65 . jsonParseRese
84b0: 74 28 26 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 t(&x);.}../*.**
84c0: 6a 73 6f 6e 5f 74 79 70 65 28 4a 53 4f 4e 29 0a json_type(JSON).
84d0: 2a 2a 20 6a 73 6f 6e 5f 74 79 70 65 28 4a 53 4f ** json_type(JSO
84e0: 4e 2c 20 50 41 54 48 29 0a 2a 2a 0a 2a 2a 20 52 N, PATH).**.** R
84f0: 65 74 75 72 6e 20 74 68 65 20 74 6f 70 2d 6c 65 eturn the top-le
8500: 76 65 6c 20 22 74 79 70 65 22 20 6f 66 20 61 20 vel "type" of a
8510: 4a 53 4f 4e 20 73 74 72 69 6e 67 2e 20 20 52 65 JSON string. Re
8520: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 turn NULL if the
8530: 0a 2a 2a 20 69 6e 70 75 74 20 69 73 20 6e 6f 74 .** input is not
8540: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 4a a well-formed J
8550: 53 4f 4e 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 SON string..*/.s
8560: 74 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 54 tatic void jsonT
8570: 79 70 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 ypeFunc(. sqlit
8580: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 e3_context *cont
8590: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c ext,. int argc,
85a0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 . sqlite3_value
85b0: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 4a 73 6f **argv.){. Jso
85c0: 6e 50 61 72 73 65 20 78 3b 20 20 20 20 20 20 20 nParse x;
85d0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 20 /* The parse
85e0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 */. const char
85f0: 2a 7a 50 61 74 68 3b 0a 0a 20 20 69 66 28 20 61 *zPath;.. if( a
8600: 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 50 rgc==2 ){. zP
8610: 61 74 68 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 ath = (const cha
8620: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 r*)sqlite3_value
8630: 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a _text(argv[1]);.
8640: 20 20 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 if( zPath==0
8650: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 ) return;. i
8660: 66 28 20 7a 50 61 74 68 5b 30 5d 21 3d 27 24 27 f( zPath[0]!='$'
8670: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7a ) return;. z
8680: 50 61 74 68 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b Path++;. }else{
8690: 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 30 3b 0a . zPath = 0;.
86a0: 20 20 7d 0a 20 20 69 66 28 20 6a 73 6f 6e 50 61 }. if( jsonPa
86b0: 72 73 65 28 26 78 2c 20 28 63 6f 6e 73 74 20 63 rse(&x, (const c
86c0: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c har*)sqlite3_val
86d0: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 ue_text(argv[0])
86e0: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 ) ) return;. if
86f0: 28 20 78 2e 6e 4e 6f 64 65 20 29 7b 0a 20 20 20 ( x.nNode ){.
8700: 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 JsonNode *pNode
8710: 20 3d 20 78 2e 61 4e 6f 64 65 3b 0a 20 20 20 20 = x.aNode;.
8720: 69 66 28 20 7a 50 61 74 68 20 29 20 70 4e 6f 64 if( zPath ) pNod
8730: 65 20 3d 20 6a 73 6f 6e 4c 6f 6f 6b 75 70 28 26 e = jsonLookup(&
8740: 78 2c 20 30 2c 20 7a 50 61 74 68 2c 20 30 29 3b x, 0, zPath, 0);
8750: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 . sqlite3_res
8760: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 ult_text(context
8770: 2c 20 6a 73 6f 6e 54 79 70 65 5b 70 4e 6f 64 65 , jsonType[pNode
8780: 2d 3e 65 54 79 70 65 5d 2c 20 2d 31 2c 20 53 51 ->eType], -1, SQ
8790: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 LITE_STATIC);.
87a0: 7d 0a 20 20 6a 73 6f 6e 50 61 72 73 65 52 65 73 }. jsonParseRes
87b0: 65 74 28 26 78 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a et(&x);.}../****
87c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
87d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
87e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
87f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
8800: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 ********.** The
8810: 6a 73 6f 6e 5f 65 61 63 68 20 76 69 72 74 75 61 json_each virtua
8820: 6c 20 74 61 62 6c 65 0a 2a 2a 2a 2a 2a 2a 2a 2a l table.********
8830: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
8840: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
8850: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
8860: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
8870: 2a 2a 2a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 ****/.typedef st
8880: 72 75 63 74 20 4a 73 6f 6e 45 61 63 68 43 75 72 ruct JsonEachCur
8890: 73 6f 72 20 4a 73 6f 6e 45 61 63 68 43 75 72 73 sor JsonEachCurs
88a0: 6f 72 3b 0a 73 74 72 75 63 74 20 4a 73 6f 6e 45 or;.struct JsonE
88b0: 61 63 68 43 75 72 73 6f 72 20 7b 0a 20 20 73 71 achCursor {. sq
88c0: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f lite3_vtab_curso
88d0: 72 20 62 61 73 65 3b 20 20 2f 2a 20 42 61 73 65 r base; /* Base
88e0: 20 63 6c 61 73 73 20 2d 20 6d 75 73 74 20 62 65 class - must be
88f0: 20 66 69 72 73 74 20 2a 2f 0a 20 20 75 33 32 20 first */. u32
8900: 69 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 iRowid;
8910: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f /* The ro
8920: 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 69 3b 20 wid */. u32 i;
8930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8940: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 /* Index in
8950: 73 50 61 72 73 65 2e 61 4e 6f 64 65 5b 5d 20 6f sParse.aNode[] o
8960: 66 20 63 75 72 72 65 6e 74 20 72 6f 77 20 2a 2f f current row */
8970: 0a 20 20 75 33 32 20 69 45 6e 64 3b 20 20 20 20 . u32 iEnd;
8980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
8990: 20 45 4f 46 20 77 68 65 6e 20 69 20 65 71 75 61 EOF when i equa
89a0: 6c 73 20 6f 72 20 65 78 63 65 65 64 73 20 74 68 ls or exceeds th
89b0: 69 73 20 76 61 6c 75 65 20 2a 2f 0a 20 20 75 38 is value */. u8
89c0: 20 65 54 79 70 65 3b 20 20 20 20 20 20 20 20 20 eType;
89d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 /* Type
89e0: 20 6f 66 20 74 6f 70 2d 6c 65 76 65 6c 20 65 6c of top-level el
89f0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 38 20 62 52 ement */. u8 bR
8a00: 65 63 75 72 73 69 76 65 3b 20 20 20 20 20 20 20 ecursive;
8a10: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f /* True fo
8a20: 72 20 6a 73 6f 6e 5f 74 72 65 65 28 29 2e 20 20 r json_tree().
8a30: 46 61 6c 73 65 20 66 6f 72 20 6a 73 6f 6e 5f 65 False for json_e
8a40: 61 63 68 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 ach() */. char
8a50: 2a 7a 4a 73 6f 6e 3b 20 20 20 20 20 20 20 20 20 *zJson;
8a60: 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 4a /* Input J
8a70: 53 4f 4e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a SON */. char *z
8a80: 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 Path;
8a90: 20 20 20 20 2f 2a 20 50 61 74 68 20 62 79 20 77 /* Path by w
8aa0: 68 69 63 68 20 74 6f 20 66 69 6c 74 65 72 20 7a hich to filter z
8ab0: 4a 73 6f 6e 20 2a 2f 0a 20 20 4a 73 6f 6e 50 61 Json */. JsonPa
8ac0: 72 73 65 20 73 50 61 72 73 65 3b 20 20 20 20 20 rse sParse;
8ad0: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 6f 66 /* Parse of
8ae0: 20 74 68 65 20 69 6e 70 75 74 20 4a 53 4f 4e 20 the input JSON
8af0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 43 6f 6e 73 74 72 */.};../* Constr
8b00: 75 63 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 73 uctor for the js
8b10: 6f 6e 5f 65 61 63 68 20 76 69 72 74 75 61 6c 20 on_each virtual
8b20: 74 61 62 6c 65 20 2a 2f 0a 73 74 61 74 69 63 20 table */.static
8b30: 69 6e 74 20 6a 73 6f 6e 45 61 63 68 43 6f 6e 6e int jsonEachConn
8b40: 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a ect(. sqlite3 *
8b50: 64 62 2c 0a 20 20 76 6f 69 64 20 2a 70 41 75 78 db,. void *pAux
8b60: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 63 6f ,. int argc, co
8b70: 6e 73 74 20 63 68 61 72 20 2a 63 6f 6e 73 74 2a nst char *const*
8b80: 61 72 67 76 2c 0a 20 20 73 71 6c 69 74 65 33 5f argv,. sqlite3_
8b90: 76 74 61 62 20 2a 2a 70 70 56 74 61 62 2c 0a 20 vtab **ppVtab,.
8ba0: 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b char **pzErr.){
8bb0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 . sqlite3_vtab
8bc0: 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 72 63 3b *pNew;. int rc;
8bd0: 0a 0a 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 ../* Column numb
8be0: 65 72 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4a ers */.#define J
8bf0: 45 41 43 48 5f 4b 45 59 20 20 20 20 20 30 0a 23 EACH_KEY 0.#
8c00: 64 65 66 69 6e 65 20 4a 45 41 43 48 5f 56 41 4c define JEACH_VAL
8c10: 55 45 20 20 20 31 0a 23 64 65 66 69 6e 65 20 4a UE 1.#define J
8c20: 45 41 43 48 5f 54 59 50 45 20 20 20 20 32 0a 23 EACH_TYPE 2.#
8c30: 64 65 66 69 6e 65 20 4a 45 41 43 48 5f 41 54 4f define JEACH_ATO
8c40: 4d 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 4a M 3.#define J
8c50: 45 41 43 48 5f 49 44 20 20 20 20 20 20 34 0a 23 EACH_ID 4.#
8c60: 64 65 66 69 6e 65 20 4a 45 41 43 48 5f 50 41 52 define JEACH_PAR
8c70: 45 4e 54 20 20 35 0a 23 64 65 66 69 6e 65 20 4a ENT 5.#define J
8c80: 45 41 43 48 5f 46 55 4c 4c 4b 45 59 20 36 0a 23 EACH_FULLKEY 6.#
8c90: 64 65 66 69 6e 65 20 4a 45 41 43 48 5f 4a 53 4f define JEACH_JSO
8ca0: 4e 20 20 20 20 37 0a 23 64 65 66 69 6e 65 20 4a N 7.#define J
8cb0: 45 41 43 48 5f 50 41 54 48 20 20 20 20 38 0a 0a EACH_PATH 8..
8cc0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 64 rc = sqlite3_d
8cd0: 65 63 6c 61 72 65 5f 76 74 61 62 28 64 62 2c 20 eclare_vtab(db,
8ce0: 0a 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41 . "CREATE TA
8cf0: 42 4c 45 20 78 28 6b 65 79 2c 76 61 6c 75 65 2c BLE x(key,value,
8d00: 74 79 70 65 2c 61 74 6f 6d 2c 69 64 2c 70 61 72 type,atom,id,par
8d10: 65 6e 74 2c 66 75 6c 6c 6b 65 79 2c 22 0a 20 20 ent,fullkey,".
8d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8d30: 20 20 22 6a 73 6f 6e 20 48 49 44 44 45 4e 2c 70 "json HIDDEN,p
8d40: 61 74 68 20 48 49 44 44 45 4e 29 22 29 3b 0a 20 ath HIDDEN)");.
8d50: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f if( rc==SQLITE_
8d60: 4f 4b 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d OK ){. pNew =
8d70: 20 2a 70 70 56 74 61 62 20 3d 20 73 71 6c 69 74 *ppVtab = sqlit
8d80: 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f e3_malloc( sizeo
8d90: 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 20 20 f(*pNew) );.
8da0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 if( pNew==0 ) re
8db0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 turn SQLITE_NOME
8dc0: 4d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4e M;. memset(pN
8dd0: 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 ew, 0, sizeof(*p
8de0: 4e 65 77 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 New));. }. ret
8df0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 64 65 urn rc;.}../* de
8e00: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 6a 73 6f structor for jso
8e10: 6e 5f 65 61 63 68 20 76 69 72 74 75 61 6c 20 74 n_each virtual t
8e20: 61 62 6c 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 able */.static i
8e30: 6e 74 20 6a 73 6f 6e 45 61 63 68 44 69 73 63 6f nt jsonEachDisco
8e40: 6e 6e 65 63 74 28 73 71 6c 69 74 65 33 5f 76 74 nnect(sqlite3_vt
8e50: 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 73 71 ab *pVtab){. sq
8e60: 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74 61 62 lite3_free(pVtab
8e70: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 );. return SQLI
8e80: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 63 6f 6e TE_OK;.}../* con
8e90: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 61 20 4a structor for a J
8ea0: 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 20 6f 62 sonEachCursor ob
8eb0: 6a 65 63 74 20 66 6f 72 20 6a 73 6f 6e 5f 65 61 ject for json_ea
8ec0: 63 68 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 ch(). */.static
8ed0: 69 6e 74 20 6a 73 6f 6e 45 61 63 68 4f 70 65 6e int jsonEachOpen
8ee0: 45 61 63 68 28 73 71 6c 69 74 65 33 5f 76 74 61 Each(sqlite3_vta
8ef0: 62 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 74 b *p, sqlite3_vt
8f00: 61 62 5f 63 75 72 73 6f 72 20 2a 2a 70 70 43 75 ab_cursor **ppCu
8f10: 72 73 6f 72 29 7b 0a 20 20 4a 73 6f 6e 45 61 63 rsor){. JsonEac
8f20: 68 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 hCursor *pCur;.
8f30: 20 70 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f pCur = sqlite3_
8f40: 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a malloc( sizeof(*
8f50: 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70 pCur) );. if( p
8f60: 43 75 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 Cur==0 ) return
8f70: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 SQLITE_NOMEM;.
8f80: 6d 65 6d 73 65 74 28 70 43 75 72 2c 20 30 2c 20 memset(pCur, 0,
8f90: 73 69 7a 65 6f 66 28 2a 70 43 75 72 29 29 3b 0a sizeof(*pCur));.
8fa0: 20 20 2a 70 70 43 75 72 73 6f 72 20 3d 20 26 70 *ppCursor = &p
8fb0: 43 75 72 2d 3e 62 61 73 65 3b 0a 20 20 72 65 74 Cur->base;. ret
8fc0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d urn SQLITE_OK;.}
8fd0: 0a 0a 2f 2a 20 63 6f 6e 73 74 72 75 63 74 6f 72 ../* constructor
8fe0: 20 66 6f 72 20 61 20 4a 73 6f 6e 45 61 63 68 43 for a JsonEachC
8ff0: 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 66 6f 72 ursor object for
9000: 20 6a 73 6f 6e 5f 74 72 65 65 28 29 2e 20 2a 2f json_tree(). */
9010: 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e .static int json
9020: 45 61 63 68 4f 70 65 6e 54 72 65 65 28 73 71 6c EachOpenTree(sql
9030: 69 74 65 33 5f 76 74 61 62 20 2a 70 2c 20 73 71 ite3_vtab *p, sq
9040: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f lite3_vtab_curso
9050: 72 20 2a 2a 70 70 43 75 72 73 6f 72 29 7b 0a 20 r **ppCursor){.
9060: 20 69 6e 74 20 72 63 20 3d 20 6a 73 6f 6e 45 61 int rc = jsonEa
9070: 63 68 4f 70 65 6e 45 61 63 68 28 70 2c 20 70 70 chOpenEach(p, pp
9080: 43 75 72 73 6f 72 29 3b 0a 20 20 69 66 28 20 72 Cursor);. if( r
9090: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a c==SQLITE_OK ){.
90a0: 20 20 20 20 4a 73 6f 6e 45 61 63 68 43 75 72 73 JsonEachCurs
90b0: 6f 72 20 2a 70 43 75 72 20 3d 20 28 4a 73 6f 6e or *pCur = (Json
90c0: 45 61 63 68 43 75 72 73 6f 72 2a 29 2a 70 70 43 EachCursor*)*ppC
90d0: 75 72 73 6f 72 3b 0a 20 20 20 20 70 43 75 72 2d ursor;. pCur-
90e0: 3e 62 52 65 63 75 72 73 69 76 65 20 3d 20 31 3b >bRecursive = 1;
90f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 . }. return rc
9100: 3b 0a 7d 0a 0a 2f 2a 20 52 65 73 65 74 20 61 20 ;.}../* Reset a
9110: 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 20 62 JsonEachCursor b
9120: 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 ack to its origi
9130: 6e 61 6c 20 73 74 61 74 65 2e 20 20 46 72 65 65 nal state. Free
9140: 20 61 6e 79 20 6d 65 6d 6f 72 79 0a 2a 2a 20 68 any memory.** h
9150: 65 6c 64 2e 20 2a 2f 0a 73 74 61 74 69 63 20 76 eld. */.static v
9160: 6f 69 64 20 6a 73 6f 6e 45 61 63 68 43 75 72 73 oid jsonEachCurs
9170: 6f 72 52 65 73 65 74 28 4a 73 6f 6e 45 61 63 68 orReset(JsonEach
9180: 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 73 71 Cursor *p){. sq
9190: 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 4a lite3_free(p->zJ
91a0: 73 6f 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f son);. sqlite3_
91b0: 66 72 65 65 28 70 2d 3e 7a 50 61 74 68 29 3b 0a free(p->zPath);.
91c0: 20 20 6a 73 6f 6e 50 61 72 73 65 52 65 73 65 74 jsonParseReset
91d0: 28 26 70 2d 3e 73 50 61 72 73 65 29 3b 0a 20 20 (&p->sParse);.
91e0: 70 2d 3e 69 52 6f 77 69 64 20 3d 20 30 3b 0a 20 p->iRowid = 0;.
91f0: 20 70 2d 3e 69 20 3d 20 30 3b 0a 20 20 70 2d 3e p->i = 0;. p->
9200: 69 45 6e 64 20 3d 20 30 3b 0a 20 20 70 2d 3e 65 iEnd = 0;. p->e
9210: 54 79 70 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 7a Type = 0;. p->z
9220: 4a 73 6f 6e 20 3d 20 30 3b 0a 20 20 70 2d 3e 7a Json = 0;. p->z
9230: 50 61 74 68 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 20 Path = 0;.}../*
9240: 44 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 61 Destructor for a
9250: 20 6a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 20 jsonEachCursor
9260: 6f 62 6a 65 63 74 20 2a 2f 0a 73 74 61 74 69 63 object */.static
9270: 20 69 6e 74 20 6a 73 6f 6e 45 61 63 68 43 6c 6f int jsonEachClo
9280: 73 65 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f se(sqlite3_vtab_
9290: 63 75 72 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20 cursor *cur){.
92a0: 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 20 2a JsonEachCursor *
92b0: 70 20 3d 20 28 4a 73 6f 6e 45 61 63 68 43 75 72 p = (JsonEachCur
92c0: 73 6f 72 2a 29 63 75 72 3b 0a 20 20 6a 73 6f 6e sor*)cur;. json
92d0: 45 61 63 68 43 75 72 73 6f 72 52 65 73 65 74 28 EachCursorReset(
92e0: 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 p);. sqlite3_fr
92f0: 65 65 28 63 75 72 29 3b 0a 20 20 72 65 74 75 72 ee(cur);. retur
9300: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a n SQLITE_OK;.}..
9310: 2f 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 /* Return TRUE i
9320: 66 20 74 68 65 20 6a 73 6f 6e 45 61 63 68 43 75 f the jsonEachCu
9330: 72 73 6f 72 20 6f 62 6a 65 63 74 20 68 61 73 20 rsor object has
9340: 62 65 65 6e 20 61 64 76 61 6e 63 65 64 20 6f 66 been advanced of
9350: 66 20 74 68 65 20 65 6e 64 0a 2a 2a 20 6f 66 20 f the end.** of
9360: 74 68 65 20 4a 53 4f 4e 20 6f 62 6a 65 63 74 20 the JSON object
9370: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 73 */.static int js
9380: 6f 6e 45 61 63 68 45 6f 66 28 73 71 6c 69 74 65 onEachEof(sqlite
9390: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 63 3_vtab_cursor *c
93a0: 75 72 29 7b 0a 20 20 4a 73 6f 6e 45 61 63 68 43 ur){. JsonEachC
93b0: 75 72 73 6f 72 20 2a 70 20 3d 20 28 4a 73 6f 6e ursor *p = (Json
93c0: 45 61 63 68 43 75 72 73 6f 72 2a 29 63 75 72 3b EachCursor*)cur;
93d0: 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 69 20 3e . return p->i >
93e0: 3d 20 70 2d 3e 69 45 6e 64 3b 0a 7d 0a 0a 2f 2a = p->iEnd;.}../*
93f0: 20 41 64 76 61 6e 63 65 20 74 68 65 20 63 75 72 Advance the cur
9400: 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 sor to the next
9410: 65 6c 65 6d 65 6e 74 20 66 6f 72 20 6a 73 6f 6e element for json
9420: 5f 74 72 65 65 28 29 20 2a 2f 0a 73 74 61 74 69 _tree() */.stati
9430: 63 20 69 6e 74 20 6a 73 6f 6e 45 61 63 68 4e 65 c int jsonEachNe
9440: 78 74 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f xt(sqlite3_vtab_
9450: 63 75 72 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20 cursor *cur){.
9460: 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 20 2a JsonEachCursor *
9470: 70 20 3d 20 28 4a 73 6f 6e 45 61 63 68 43 75 72 p = (JsonEachCur
9480: 73 6f 72 2a 29 63 75 72 3b 0a 20 20 69 66 28 20 sor*)cur;. if(
9490: 70 2d 3e 62 52 65 63 75 72 73 69 76 65 20 29 7b p->bRecursive ){
94a0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 3d 3d 30 . if( p->i==0
94b0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 20 3d ){. p->i =
94c0: 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 1;. }else if
94d0: 28 20 70 2d 3e 73 50 61 72 73 65 2e 61 4e 6f 64 ( p->sParse.aNod
94e0: 65 5b 70 2d 3e 73 50 61 72 73 65 2e 61 55 70 5b e[p->sParse.aUp[
94f0: 70 2d 3e 69 5d 5d 2e 65 54 79 70 65 3d 3d 4a 53 p->i]].eType==JS
9500: 4f 4e 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 ON_OBJECT ){.
9510: 20 20 20 70 2d 3e 69 20 2b 3d 20 32 3b 0a 20 20 p->i += 2;.
9520: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 }else{. p
9530: 2d 3e 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 ->i++;. }.
9540: 20 70 2d 3e 69 52 6f 77 69 64 2b 2b 3b 0a 20 20 p->iRowid++;.
9550: 20 20 69 66 28 20 70 2d 3e 69 3c 70 2d 3e 73 50 if( p->i<p->sP
9560: 61 72 73 65 2e 6e 4e 6f 64 65 20 29 7b 0a 20 20 arse.nNode ){.
9570: 20 20 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 55 JsonNode *pU
9580: 70 20 3d 20 26 70 2d 3e 73 50 61 72 73 65 2e 61 p = &p->sParse.a
9590: 4e 6f 64 65 5b 70 2d 3e 73 50 61 72 73 65 2e 61 Node[p->sParse.a
95a0: 55 70 5b 70 2d 3e 69 5d 5d 3b 0a 20 20 20 20 20 Up[p->i]];.
95b0: 20 70 2d 3e 65 54 79 70 65 20 3d 20 70 55 70 2d p->eType = pUp-
95c0: 3e 65 54 79 70 65 3b 0a 20 20 20 20 20 20 69 66 >eType;. if
95d0: 28 20 70 55 70 2d 3e 65 54 79 70 65 3d 3d 4a 53 ( pUp->eType==JS
95e0: 4f 4e 5f 41 52 52 41 59 20 29 20 70 55 70 2d 3e ON_ARRAY ) pUp->
95f0: 75 2e 69 4b 65 79 2b 2b 3b 0a 20 20 20 20 20 20 u.iKey++;.
9600: 69 66 28 20 70 2d 3e 73 50 61 72 73 65 2e 61 4e if( p->sParse.aN
9610: 6f 64 65 5b 70 2d 3e 69 5d 2e 65 54 79 70 65 3d ode[p->i].eType=
9620: 3d 4a 53 4f 4e 5f 41 52 52 41 59 20 29 7b 0a 20 =JSON_ARRAY ){.
9630: 20 20 20 20 20 20 20 70 2d 3e 73 50 61 72 73 65 p->sParse
9640: 2e 61 4e 6f 64 65 5b 70 2d 3e 69 5d 2e 75 2e 69 .aNode[p->i].u.i
9650: 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d Key = 0;. }
9660: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a . }. }else{.
9670: 20 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e 65 switch( p->e
9680: 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 Type ){. ca
9690: 73 65 20 4a 53 4f 4e 5f 41 52 52 41 59 3a 20 7b se JSON_ARRAY: {
96a0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 69 20 2b 3d . p->i +=
96b0: 20 6a 73 6f 6e 4e 6f 64 65 53 69 7a 65 28 26 70 jsonNodeSize(&p
96c0: 2d 3e 73 50 61 72 73 65 2e 61 4e 6f 64 65 5b 70 ->sParse.aNode[p
96d0: 2d 3e 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 ->i]);. p
96e0: 2d 3e 69 52 6f 77 69 64 2b 2b 3b 0a 20 20 20 20 ->iRowid++;.
96f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 break;.
9700: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4a 53 }. case JS
9710: 4f 4e 5f 4f 42 4a 45 43 54 3a 20 7b 0a 20 20 20 ON_OBJECT: {.
9720: 20 20 20 20 20 70 2d 3e 69 20 2b 3d 20 31 20 2b p->i += 1 +
9730: 20 6a 73 6f 6e 4e 6f 64 65 53 69 7a 65 28 26 70 jsonNodeSize(&p
9740: 2d 3e 73 50 61 72 73 65 2e 61 4e 6f 64 65 5b 70 ->sParse.aNode[p
9750: 2d 3e 69 2b 31 5d 29 3b 0a 20 20 20 20 20 20 20 ->i+1]);.
9760: 20 70 2d 3e 69 52 6f 77 69 64 2b 2b 3b 0a 20 20 p->iRowid++;.
9770: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
9780: 20 20 20 7d 0a 20 20 20 20 20 20 64 65 66 61 75 }. defau
9790: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 2d lt: {. p-
97a0: 3e 69 20 3d 20 70 2d 3e 69 45 6e 64 3b 0a 20 20 >i = p->iEnd;.
97b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
97c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 }. }. }.
97d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f return SQLITE_O
97e0: 4b 3b 0a 7d 0a 0a 2f 2a 20 41 70 70 65 6e 64 20 K;.}../* Append
97f0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 the name of the
9800: 70 61 74 68 20 66 6f 72 20 65 6c 65 6d 65 6e 74 path for element
9810: 20 69 20 74 6f 20 70 53 74 72 0a 2a 2f 0a 73 74 i to pStr.*/.st
9820: 61 74 69 63 20 76 6f 69 64 20 6a 73 6f 6e 45 61 atic void jsonEa
9830: 63 68 43 6f 6d 70 75 74 65 50 61 74 68 28 0a 20 chComputePath(.
9840: 20 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 20 JsonEachCursor
9850: 2a 70 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 *p, /* The
9860: 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 4a 73 6f cursor */. Jso
9870: 6e 53 74 72 69 6e 67 20 2a 70 53 74 72 2c 20 20 nString *pStr,
9880: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 /* Write t
9890: 68 65 20 70 61 74 68 20 68 65 72 65 20 2a 2f 0a he path here */.
98a0: 20 20 75 33 32 20 69 20 20 20 20 20 20 20 20 20 u32 i
98b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 /* Pa
98c0: 74 68 20 74 6f 20 74 68 69 73 20 65 6c 65 6d 65 th to this eleme
98d0: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 4a 73 6f 6e 4e nt */.){. JsonN
98e0: 6f 64 65 20 2a 70 4e 6f 64 65 2c 20 2a 70 55 70 ode *pNode, *pUp
98f0: 3b 0a 20 20 75 33 32 20 69 55 70 3b 0a 20 20 69 ;. u32 iUp;. i
9900: 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 6a f( i==0 ){. j
9910: 73 6f 6e 41 70 70 65 6e 64 43 68 61 72 28 70 53 sonAppendChar(pS
9920: 74 72 2c 20 27 24 27 29 3b 0a 20 20 20 20 72 65 tr, '$');. re
9930: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 55 70 20 turn;. }. iUp
9940: 3d 20 70 2d 3e 73 50 61 72 73 65 2e 61 55 70 5b = p->sParse.aUp[
9950: 69 5d 3b 0a 20 20 6a 73 6f 6e 45 61 63 68 43 6f i];. jsonEachCo
9960: 6d 70 75 74 65 50 61 74 68 28 70 2c 20 70 53 74 mputePath(p, pSt
9970: 72 2c 20 69 55 70 29 3b 0a 20 20 70 4e 6f 64 65 r, iUp);. pNode
9980: 20 3d 20 26 70 2d 3e 73 50 61 72 73 65 2e 61 4e = &p->sParse.aN
9990: 6f 64 65 5b 69 5d 3b 0a 20 20 70 55 70 20 3d 20 ode[i];. pUp =
99a0: 26 70 2d 3e 73 50 61 72 73 65 2e 61 4e 6f 64 65 &p->sParse.aNode
99b0: 5b 69 55 70 5d 3b 0a 20 20 69 66 28 20 70 55 70 [iUp];. if( pUp
99c0: 2d 3e 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f 41 52 ->eType==JSON_AR
99d0: 52 41 59 20 29 7b 0a 20 20 20 20 6a 73 6f 6e 50 RAY ){. jsonP
99e0: 72 69 6e 74 66 28 33 30 2c 20 70 53 74 72 2c 20 rintf(30, pStr,
99f0: 22 5b 25 64 5d 22 2c 20 70 55 70 2d 3e 75 2e 69 "[%d]", pUp->u.i
9a00: 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 Key);. }else{.
9a10: 20 20 20 61 73 73 65 72 74 28 20 70 55 70 2d 3e assert( pUp->
9a20: 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f 4f 42 4a 45 eType==JSON_OBJE
9a30: 43 54 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e CT );. if( pN
9a40: 6f 64 65 2d 3e 65 54 79 70 65 3e 3d 4a 53 4f 4e ode->eType>=JSON
9a50: 5f 41 52 52 41 59 20 29 20 70 4e 6f 64 65 2d 2d _ARRAY ) pNode--
9a60: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e ;. assert( pN
9a70: 6f 64 65 2d 3e 65 54 79 70 65 3d 3d 4a 53 4f 4e ode->eType==JSON
9a80: 5f 53 54 52 49 4e 47 20 29 3b 0a 20 20 20 20 6a _STRING );. j
9a90: 73 6f 6e 50 72 69 6e 74 66 28 70 4e 6f 64 65 2d sonPrintf(pNode-
9aa0: 3e 6e 2b 31 2c 20 70 53 74 72 2c 20 22 2e 25 2e >n+1, pStr, ".%.
9ab0: 2a 73 22 2c 20 70 4e 6f 64 65 2d 3e 6e 2d 32 2c *s", pNode->n-2,
9ac0: 20 70 4e 6f 64 65 2d 3e 75 2e 7a 4a 43 6f 6e 74 pNode->u.zJCont
9ad0: 65 6e 74 2b 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f ent+1);. }.}../
9ae0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c * Return the val
9af0: 75 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 2a ue of a column *
9b00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 73 6f /.static int jso
9b10: 6e 45 61 63 68 43 6f 6c 75 6d 6e 28 0a 20 20 73 nEachColumn(. s
9b20: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 qlite3_vtab_curs
9b30: 6f 72 20 2a 63 75 72 2c 20 20 20 2f 2a 20 54 68 or *cur, /* Th
9b40: 65 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 73 71 e cursor */. sq
9b50: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 lite3_context *c
9b60: 74 78 2c 20 20 20 20 20 20 20 2f 2a 20 46 69 72 tx, /* Fir
9b70: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 st argument to s
9b80: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 2e 2e qlite3_result_..
9b90: 2e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 69 20 20 .() */. int i
9ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9bb0: 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 63 6f /* Which co
9bc0: 6c 75 6d 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a lumn to return *
9bd0: 2f 0a 29 7b 0a 20 20 4a 73 6f 6e 45 61 63 68 43 /.){. JsonEachC
9be0: 75 72 73 6f 72 20 2a 70 20 3d 20 28 4a 73 6f 6e ursor *p = (Json
9bf0: 45 61 63 68 43 75 72 73 6f 72 2a 29 63 75 72 3b EachCursor*)cur;
9c00: 0a 20 20 4a 73 6f 6e 4e 6f 64 65 20 2a 70 54 68 . JsonNode *pTh
9c10: 69 73 20 3d 20 26 70 2d 3e 73 50 61 72 73 65 2e is = &p->sParse.
9c20: 61 4e 6f 64 65 5b 70 2d 3e 69 5d 3b 0a 20 20 73 aNode[p->i];. s
9c30: 77 69 74 63 68 28 20 69 20 29 7b 0a 20 20 20 20 witch( i ){.
9c40: 63 61 73 65 20 4a 45 41 43 48 5f 4b 45 59 3a 20 case JEACH_KEY:
9c50: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 {. if( p->e
9c60: 54 79 70 65 3d 3d 4a 53 4f 4e 5f 4f 42 4a 45 43 Type==JSON_OBJEC
9c70: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 6a 73 6f T ){. jso
9c80: 6e 52 65 74 75 72 6e 28 70 54 68 69 73 2c 20 63 nReturn(pThis, c
9c90: 74 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 tx, 0);. }e
9ca0: 6c 73 65 20 69 66 28 20 70 2d 3e 65 54 79 70 65 lse if( p->eType
9cb0: 3d 3d 4a 53 4f 4e 5f 41 52 52 41 59 20 29 7b 0a ==JSON_ARRAY ){.
9cc0: 20 20 20 20 20 20 20 20 75 33 32 20 69 4b 65 79 u32 iKey
9cd0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d ;. if( p-
9ce0: 3e 62 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 >bRecursive ){.
9cf0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e if( p->
9d00: 69 52 6f 77 69 64 3d 3d 30 20 29 20 62 72 65 61 iRowid==0 ) brea
9d10: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4b 65 k;. iKe
9d20: 79 20 3d 20 70 2d 3e 73 50 61 72 73 65 2e 61 4e y = p->sParse.aN
9d30: 6f 64 65 5b 70 2d 3e 73 50 61 72 73 65 2e 61 55 ode[p->sParse.aU
9d40: 70 5b 70 2d 3e 69 5d 5d 2e 75 2e 69 4b 65 79 20 p[p->i]].u.iKey
9d50: 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c - 1;. }el
9d60: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 4b se{. iK
9d70: 65 79 20 3d 20 70 2d 3e 69 52 6f 77 69 64 3b 0a ey = p->iRowid;.
9d80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
9d90: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 sqlite3_result
9da0: 5f 69 6e 74 36 34 28 63 74 78 2c 20 69 4b 65 79 _int64(ctx, iKey
9db0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 );. }.
9dc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 break;. }.
9dd0: 20 20 63 61 73 65 20 4a 45 41 43 48 5f 56 41 4c case JEACH_VAL
9de0: 55 45 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 UE: {. if(
9df0: 70 2d 3e 65 54 79 70 65 3d 3d 4a 53 4f 4e 5f 4f p->eType==JSON_O
9e00: 42 4a 45 43 54 20 29 20 70 54 68 69 73 2b 2b 3b BJECT ) pThis++;
9e10: 0a 20 20 20 20 20 20 6a 73 6f 6e 52 65 74 75 72 . jsonRetur
9e20: 6e 28 70 54 68 69 73 2c 20 63 74 78 2c 20 30 29 n(pThis, ctx, 0)
9e30: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 ;. break;.
9e40: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 45 }. case JE
9e50: 41 43 48 5f 54 59 50 45 3a 20 7b 0a 20 20 20 20 ACH_TYPE: {.
9e60: 20 20 69 66 28 20 70 2d 3e 65 54 79 70 65 3d 3d if( p->eType==
9e70: 4a 53 4f 4e 5f 4f 42 4a 45 43 54 20 29 20 70 54 JSON_OBJECT ) pT
9e80: 68 69 73 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c his++;. sql
9e90: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 ite3_result_text
9ea0: 28 63 74 78 2c 20 6a 73 6f 6e 54 79 70 65 5b 70 (ctx, jsonType[p
9eb0: 54 68 69 73 2d 3e 65 54 79 70 65 5d 2c 20 2d 31 This->eType], -1
9ec0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 , SQLITE_STATIC)
9ed0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 ;. break;.
9ee0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4a 45 }. case JE
9ef0: 41 43 48 5f 41 54 4f 4d 3a 20 7b 0a 20 20 20 20 ACH_ATOM: {.
9f00: 20 20 69 66 28 20 70 2d 3e 65 54 79 70 65 3d 3d if( p->eType==
9f10: 4a 53 4f 4e 5f 4f 42 4a 45 43 54 20 29 20 70 54 JSON_OBJECT ) pT
9f20: 68 69 73 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 his++;. if(
9f30: 20 70 54 68 69 73 2d 3e 65 54 79 70 65 3e 3d 4a pThis->eType>=J
9f40: 53 4f 4e 5f 41 52 52 41 59 20 29 20 62 72 65 61 SON_ARRAY ) brea
9f50: 6b 3b 0a 20 20 20 20 20 20 6a 73 6f 6e 52 65 74 k;. jsonRet
9f60: 75 72 6e 28 70 54 68 69 73 2c 20 63 74 78 2c 20 urn(pThis, ctx,
9f70: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0);. break;
9f80: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 . }. case
9f90: 4a 45 41 43 48 5f 49 44 3a 20 7b 0a 20 20 20 20 JEACH_ID: {.
9fa0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 sqlite3_result
9fb0: 5f 69 6e 74 36 34 28 63 74 78 2c 20 70 2d 3e 69 _int64(ctx, p->i
9fc0: 20 2b 20 28 70 2d 3e 65 54 79 70 65 3d 3d 4a 53 + (p->eType==JS
9fd0: 4f 4e 5f 4f 42 4a 45 43 54 29 29 3b 0a 20 20 20 ON_OBJECT));.
9fe0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a break;. }.
9ff0: 20 20 20 20 63 61 73 65 20 4a 45 41 43 48 5f 50 case JEACH_P
a000: 41 52 45 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69 ARENT: {. i
a010: 66 28 20 70 2d 3e 69 3e 30 20 26 26 20 70 2d 3e f( p->i>0 && p->
a020: 62 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 bRecursive ){.
a030: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 sqlite3_re
a040: 73 75 6c 74 5f 69 6e 74 36 34 28 63 74 78 2c 20 sult_int64(ctx,
a050: 70 2d 3e 73 50 61 72 73 65 2e 61 55 70 5b 70 2d p->sParse.aUp[p-
a060: 3e 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 >i]);. }.
a070: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d break;. }
a080: 0a 20 20 20 20 63 61 73 65 20 4a 45 41 43 48 5f . case JEACH_
a090: 46 55 4c 4c 4b 45 59 3a 20 7b 0a 20 20 20 20 20 FULLKEY: {.
a0a0: 20 4a 73 6f 6e 53 74 72 69 6e 67 20 78 3b 0a 20 JsonString x;.
a0b0: 20 20 20 20 20 6a 73 6f 6e 49 6e 69 74 28 26 78 jsonInit(&x
a0c0: 2c 20 63 74 78 29 3b 0a 20 20 20 20 20 20 69 66 , ctx);. if
a0d0: 28 20 70 2d 3e 62 52 65 63 75 72 73 69 76 65 20 ( p->bRecursive
a0e0: 29 7b 0a 20 20 20 20 20 20 20 20 6a 73 6f 6e 45 ){. jsonE
a0f0: 61 63 68 43 6f 6d 70 75 74 65 50 61 74 68 28 70 achComputePath(p
a100: 2c 20 26 78 2c 20 70 2d 3e 69 29 3b 0a 20 20 20 , &x, p->i);.
a110: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
a120: 20 20 69 66 28 20 70 2d 3e 7a 50 61 74 68 20 29 if( p->zPath )
a130: 7b 0a 20 20 20 20 20 20 20 20 20 20 6a 73 6f 6e {. json
a140: 41 70 70 65 6e 64 52 61 77 28 26 78 2c 20 70 2d AppendRaw(&x, p-
a150: 3e 7a 50 61 74 68 2c 20 28 69 6e 74 29 73 74 72 >zPath, (int)str
a160: 6c 65 6e 28 70 2d 3e 7a 50 61 74 68 29 29 3b 0a len(p->zPath));.
a170: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 }else{.
a180: 20 20 20 20 20 20 20 20 20 6a 73 6f 6e 41 70 70 jsonApp
a190: 65 6e 64 43 68 61 72 28 26 78 2c 20 27 24 27 29 endChar(&x, '$')
a1a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 ;. }.
a1b0: 20 20 20 20 69 66 28 20 70 2d 3e 65 54 79 70 65 if( p->eType
a1c0: 3d 3d 4a 53 4f 4e 5f 41 52 52 41 59 20 29 7b 0a ==JSON_ARRAY ){.
a1d0: 20 20 20 20 20 20 20 20 20 20 6a 73 6f 6e 50 72 jsonPr
a1e0: 69 6e 74 66 28 33 30 2c 20 26 78 2c 20 22 5b 25 intf(30, &x, "[%
a1f0: 64 5d 22 2c 20 70 2d 3e 69 52 6f 77 69 64 29 3b d]", p->iRowid);
a200: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a . }else{.
a210: 20 20 20 20 20 20 20 20 20 20 6a 73 6f 6e 50 72 jsonPr
a220: 69 6e 74 66 28 70 54 68 69 73 2d 3e 6e 2c 20 26 intf(pThis->n, &
a230: 78 2c 20 22 2e 25 2e 2a 73 22 2c 20 70 54 68 69 x, ".%.*s", pThi
a240: 73 2d 3e 6e 2d 32 2c 20 70 54 68 69 73 2d 3e 75 s->n-2, pThis->u
a250: 2e 7a 4a 43 6f 6e 74 65 6e 74 2b 31 29 3b 0a 20 .zJContent+1);.
a260: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d }. }
a270: 0a 20 20 20 20 20 20 6a 73 6f 6e 52 65 73 75 6c . jsonResul
a280: 74 28 26 78 29 3b 0a 20 20 20 20 20 20 62 72 65 t(&x);. bre
a290: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 ak;. }. ca
a2a0: 73 65 20 4a 45 41 43 48 5f 50 41 54 48 3a 20 7b se JEACH_PATH: {
a2b0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 . const cha
a2c0: 72 20 2a 7a 50 61 74 68 20 3d 20 70 2d 3e 7a 50 r *zPath = p->zP
a2d0: 61 74 68 3b 0a 20 20 20 20 20 20 20 69 66 28 20 ath;. if(
a2e0: 7a 50 61 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20 zPath==0 ){.
a2f0: 20 20 20 20 69 66 28 20 70 2d 3e 62 52 65 63 75 if( p->bRecu
a300: 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 20 rsive ){.
a310: 20 20 20 4a 73 6f 6e 53 74 72 69 6e 67 20 78 3b JsonString x;
a320: 0a 20 20 20 20 20 20 20 20 20 20 6a 73 6f 6e 49 . jsonI
a330: 6e 69 74 28 26 78 2c 20 63 74 78 29 3b 0a 20 20 nit(&x, ctx);.
a340: 20 20 20 20 20 20 20 20 6a 73 6f 6e 45 61 63 68 jsonEach
a350: 43 6f 6d 70 75 74 65 50 61 74 68 28 70 2c 20 26 ComputePath(p, &
a360: 78 2c 20 70 2d 3e 73 50 61 72 73 65 2e 61 55 70 x, p->sParse.aUp
a370: 5b 70 2d 3e 69 5d 29 3b 0a 20 20 20 20 20 20 20 [p->i]);.
a380: 20 20 20 6a 73 6f 6e 52 65 73 75 6c 74 28 26 78 jsonResult(&x
a390: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 );. bre
a3a0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 ak;. }.
a3b0: 20 20 20 20 20 20 7a 50 61 74 68 20 3d 20 22 24 zPath = "$
a3c0: 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 ";. }.
a3d0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f sqlite3_result_
a3e0: 74 65 78 74 28 63 74 78 2c 20 7a 50 61 74 68 2c text(ctx, zPath,
a3f0: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 -1, SQLITE_STAT
a400: 49 43 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b IC);. break
a410: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 ;. }. defa
a420: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 ult: {. ass
a430: 65 72 74 28 20 69 3d 3d 4a 45 41 43 48 5f 4a 53 ert( i==JEACH_JS
a440: 4f 4e 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 ON );. sqli
a450: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 te3_result_text(
a460: 63 74 78 2c 20 70 2d 3e 73 50 61 72 73 65 2e 7a ctx, p->sParse.z
a470: 4a 73 6f 6e 2c 20 2d 31 2c 20 53 51 4c 49 54 45 Json, -1, SQLITE
a480: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 _STATIC);.
a490: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d break;. }. }
a4a0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 . return SQLITE
a4b0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 _OK;.}../* Retur
a4c0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f n the current ro
a4d0: 77 69 64 20 76 61 6c 75 65 20 2a 2f 0a 73 74 61 wid value */.sta
a4e0: 74 69 63 20 69 6e 74 20 6a 73 6f 6e 45 61 63 68 tic int jsonEach
a4f0: 52 6f 77 69 64 28 73 71 6c 69 74 65 33 5f 76 74 Rowid(sqlite3_vt
a500: 61 62 5f 63 75 72 73 6f 72 20 2a 63 75 72 2c 20 ab_cursor *cur,
a510: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 52 sqlite_int64 *pR
a520: 6f 77 69 64 29 7b 0a 20 20 4a 73 6f 6e 45 61 63 owid){. JsonEac
a530: 68 43 75 72 73 6f 72 20 2a 70 20 3d 20 28 4a 73 hCursor *p = (Js
a540: 6f 6e 45 61 63 68 43 75 72 73 6f 72 2a 29 63 75 onEachCursor*)cu
a550: 72 3b 0a 20 20 2a 70 52 6f 77 69 64 20 3d 20 70 r;. *pRowid = p
a560: 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 72 65 74 75 ->iRowid;. retu
a570: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a rn SQLITE_OK;.}.
a580: 0a 2f 2a 20 54 68 65 20 71 75 65 72 79 20 73 74 ./* The query st
a590: 72 61 74 65 67 79 20 69 73 20 74 6f 20 6c 6f 6f rategy is to loo
a5a0: 6b 20 66 6f 72 20 61 6e 20 65 71 75 61 6c 69 74 k for an equalit
a5b0: 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 y constraint on
a5c0: 74 68 65 20 6a 73 6f 6e 0a 2a 2a 20 63 6f 6c 75 the json.** colu
a5d0: 6d 6e 2e 20 20 57 69 74 68 6f 75 74 20 73 75 63 mn. Without suc
a5e0: 68 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 h a constraint,
a5f0: 74 68 65 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74 the table cannot
a600: 20 6f 70 65 72 61 74 65 2e 20 20 69 64 78 4e 75 operate. idxNu
a610: 6d 20 69 73 0a 2a 2a 20 31 20 69 66 20 74 68 65 m is.** 1 if the
a620: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 66 constraint is f
a630: 6f 75 6e 64 2c 20 33 20 69 66 20 74 68 65 20 63 ound, 3 if the c
a640: 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 7a 50 onstraint and zP
a650: 61 74 68 20 61 72 65 20 66 6f 75 6e 64 2c 0a 2a ath are found,.*
a660: 2a 20 61 6e 64 20 30 20 6f 74 68 65 72 77 69 73 * and 0 otherwis
a670: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 e..*/.static int
a680: 20 6a 73 6f 6e 45 61 63 68 42 65 73 74 49 6e 64 jsonEachBestInd
a690: 65 78 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 ex(. sqlite3_vt
a6a0: 61 62 20 2a 74 61 62 2c 0a 20 20 73 71 6c 69 74 ab *tab,. sqlit
a6b0: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 e3_index_info *p
a6c0: 49 64 78 49 6e 66 6f 0a 29 7b 0a 20 20 69 6e 74 IdxInfo.){. int
a6d0: 20 69 3b 0a 20 20 69 6e 74 20 6a 73 6f 6e 49 64 i;. int jsonId
a6e0: 78 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 70 61 x = -1;. int pa
a6f0: 74 68 49 64 78 20 3d 20 2d 31 3b 0a 20 20 63 6f thIdx = -1;. co
a700: 6e 73 74 20 73 74 72 75 63 74 20 73 71 6c 69 74 nst struct sqlit
a710: 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 e3_index_constra
a720: 69 6e 74 20 2a 70 43 6f 6e 73 74 72 61 69 6e 74 int *pConstraint
a730: 3b 0a 20 20 70 43 6f 6e 73 74 72 61 69 6e 74 20 ;. pConstraint
a740: 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e = pIdxInfo->aCon
a750: 73 74 72 61 69 6e 74 3b 0a 20 20 66 6f 72 28 69 straint;. for(i
a760: 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e =0; i<pIdxInfo->
a770: 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b nConstraint; i++
a780: 2c 20 70 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 29 , pConstraint++)
a790: 7b 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 73 74 {. if( pConst
a7a0: 72 61 69 6e 74 2d 3e 75 73 61 62 6c 65 3d 3d 30 raint->usable==0
a7b0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 ) continue;.
a7c0: 20 69 66 28 20 70 43 6f 6e 73 74 72 61 69 6e 74 if( pConstraint
a7d0: 2d 3e 6f 70 21 3d 53 51 4c 49 54 45 5f 49 4e 44 ->op!=SQLITE_IND
a7e0: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 EX_CONSTRAINT_EQ
a7f0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 ) continue;.
a800: 20 73 77 69 74 63 68 28 20 70 43 6f 6e 73 74 72 switch( pConstr
a810: 61 69 6e 74 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b aint->iColumn ){
a820: 0a 20 20 20 20 20 20 63 61 73 65 20 4a 45 41 43 . case JEAC
a830: 48 5f 4a 53 4f 4e 3a 20 20 20 6a 73 6f 6e 49 64 H_JSON: jsonId
a840: 78 20 3d 20 69 3b 20 20 20 20 62 72 65 61 6b 3b x = i; break;
a850: 0a 20 20 20 20 20 20 63 61 73 65 20 4a 45 41 43 . case JEAC
a860: 48 5f 50 41 54 48 3a 20 20 20 70 61 74 68 49 64 H_PATH: pathId
a870: 78 20 3d 20 69 3b 20 20 20 20 62 72 65 61 6b 3b x = i; break;
a880: 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 . default:
a890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 2d /* no-
a8a0: 6f 70 20 2a 2f 20 20 20 20 20 62 72 65 61 6b 3b op */ break;
a8b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 . }. }. if(
a8c0: 20 6a 73 6f 6e 49 64 78 3c 30 20 29 7b 0a 20 20 jsonIdx<0 ){.
a8d0: 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e pIdxInfo->idxN
a8e0: 75 6d 20 3d 20 30 3b 0a 20 20 20 20 70 49 64 78 um = 0;. pIdx
a8f0: 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 Info->estimatedC
a900: 6f 73 74 20 3d 20 31 65 39 39 3b 0a 20 20 7d 65 ost = 1e99;. }e
a910: 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 49 6e 66 lse{. pIdxInf
a920: 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 o->estimatedCost
a930: 20 3d 20 31 2e 30 3b 0a 20 20 20 20 70 49 64 78 = 1.0;. pIdx
a940: 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e Info->aConstrain
a950: 74 55 73 61 67 65 5b 6a 73 6f 6e 49 64 78 5d 2e tUsage[jsonIdx].
a960: 61 72 67 76 49 6e 64 65 78 20 3d 20 31 3b 0a 20 argvIndex = 1;.
a970: 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f pIdxInfo->aCo
a980: 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 6a 73 nstraintUsage[js
a990: 6f 6e 49 64 78 5d 2e 6f 6d 69 74 20 3d 20 31 3b onIdx].omit = 1;
a9a0: 0a 20 20 20 20 69 66 28 20 70 61 74 68 49 64 78 . if( pathIdx
a9b0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 <0 ){. pIdx
a9c0: 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 31 Info->idxNum = 1
a9d0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 ;. }else{.
a9e0: 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f pIdxInfo->aCo
a9f0: 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 70 61 nstraintUsage[pa
aa00: 74 68 49 64 78 5d 2e 61 72 67 76 49 6e 64 65 78 thIdx].argvIndex
aa10: 20 3d 20 32 3b 0a 20 20 20 20 20 20 70 49 64 78 = 2;. pIdx
aa20: 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e Info->aConstrain
aa30: 74 55 73 61 67 65 5b 70 61 74 68 49 64 78 5d 2e tUsage[pathIdx].
aa40: 6f 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 omit = 1;.
aa50: 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d pIdxInfo->idxNum
aa60: 20 3d 20 33 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a = 3;. }. }.
aa70: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f return SQLITE_
aa80: 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 53 74 61 72 74 20 OK;.}../* Start
aa90: 61 20 73 65 61 72 63 68 20 6f 6e 20 61 20 6e 65 a search on a ne
aaa0: 77 20 4a 53 4f 4e 20 73 74 72 69 6e 67 20 2a 2f w JSON string */
aab0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 73 6f 6e .static int json
aac0: 45 61 63 68 46 69 6c 74 65 72 28 0a 20 20 73 71 EachFilter(. sq
aad0: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f lite3_vtab_curso
aae0: 72 20 2a 63 75 72 2c 0a 20 20 69 6e 74 20 69 64 r *cur,. int id
aaf0: 78 4e 75 6d 2c 20 63 6f 6e 73 74 20 63 68 61 72 xNum, const char
ab00: 20 2a 69 64 78 53 74 72 2c 0a 20 20 69 6e 74 20 *idxStr,. int
ab10: 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 argc, sqlite3_va
ab20: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 lue **argv.){.
ab30: 4a 73 6f 6e 45 61 63 68 43 75 72 73 6f 72 20 2a JsonEachCursor *
ab40: 70 20 3d 20 28 4a 73 6f 6e 45 61 63 68 43 75 72 p = (JsonEachCur
ab50: 73 6f 72 2a 29 63 75 72 3b 0a 20 20 63 6f 6e 73 sor*)cur;. cons
ab60: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 63 6f 6e t char *z;. con
ab70: 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 3b 0a st char *zPath;.
ab80: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 sqlite3_int64
ab90: 6e 3b 0a 0a 20 20 6a 73 6f 6e 45 61 63 68 43 75 n;.. jsonEachCu
aba0: 72 73 6f 72 52 65 73 65 74 28 70 29 3b 0a 20 20 rsorReset(p);.
abb0: 69 66 28 20 69 64 78 4e 75 6d 3d 3d 30 20 29 20 if( idxNum==0 )
abc0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b return SQLITE_OK
abd0: 3b 0a 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 63 ;. z = (const c
abe0: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c har*)sqlite3_val
abf0: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 ue_text(argv[0])
ac00: 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 ;. if( z==0 ) r
ac10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b eturn SQLITE_OK;
ac20: 0a 20 20 69 66 28 20 69 64 78 4e 75 6d 26 32 20 . if( idxNum&2
ac30: 29 7b 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 28 ){. zPath = (
ac40: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 const char*)sqli
ac50: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 te3_value_text(a
ac60: 72 67 76 5b 31 5d 29 3b 0a 20 20 20 20 69 66 28 rgv[1]);. if(
ac70: 20 7a 50 61 74 68 3d 3d 30 20 7c 7c 20 7a 50 61 zPath==0 || zPa
ac80: 74 68 5b 30 5d 21 3d 27 24 27 20 29 20 72 65 74 th[0]!='$' ) ret
ac90: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 urn SQLITE_OK;.
aca0: 20 7d 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 }. n = sqlite3
acb0: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 _value_bytes(arg
acc0: 76 5b 30 5d 29 3b 0a 20 20 70 2d 3e 7a 4a 73 6f v[0]);. p->zJso
acd0: 6e 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c n = sqlite3_mall
ace0: 6f 63 28 20 6e 2b 31 20 29 3b 0a 20 20 69 66 28 oc( n+1 );. if(
acf0: 20 70 2d 3e 7a 4a 73 6f 6e 3d 3d 30 20 29 20 72 p->zJson==0 ) r
ad00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d eturn SQLITE_NOM
ad10: 45 4d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e EM;. memcpy(p->
ad20: 7a 4a 73 6f 6e 2c 20 7a 2c 20 6e 2b 31 29 3b 0a zJson, z, n+1);.
ad30: 20 20 69 66 28 20 6a 73 6f 6e 50 61 72 73 65 28 if( jsonParse(
ad40: 26 70 2d 3e 73 50 61 72 73 65 2c 20 70 2d 3e 7a &p->sParse, p->z
ad50: 4a 73 6f 6e 29 20 0a 20 20 20 7c 7c 20 28 70 2d Json) . || (p-
ad60: 3e 62 52 65 63 75 72 73 69 76 65 20 26 26 20 6a >bRecursive && j
ad70: 73 6f 6e 50 61 72 73 65 46 69 6e 64 50 61 72 65 sonParseFindPare
ad80: 6e 74 73 28 26 70 2d 3e 73 50 61 72 73 65 29 29 nts(&p->sParse))
ad90: 0a 20 20 29 7b 0a 20 20 20 20 6a 73 6f 6e 45 61 . ){. jsonEa
ada0: 63 68 43 75 72 73 6f 72 52 65 73 65 74 28 70 29 chCursorReset(p)
adb0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4a ;. }else{. J
adc0: 73 6f 6e 4e 6f 64 65 20 2a 70 4e 6f 64 65 3b 0a sonNode *pNode;.
add0: 20 20 20 20 69 66 28 20 69 64 78 4e 75 6d 3d 3d if( idxNum==
ade0: 33 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 62 52 3 ){. p->bR
adf0: 65 63 75 72 73 69 76 65 20 3d 20 30 3b 0a 20 20 ecursive = 0;.
ae00: 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f n = sqlite3_
ae10: 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 value_bytes(argv
ae20: 5b 31 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 7a [1]);. p->z
ae30: 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 5f 6d Path = sqlite3_m
ae40: 61 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a 20 20 alloc( n+1 );.
ae50: 20 20 20 20 69 66 28 20 70 2d 3e 7a 50 61 74 68 if( p->zPath
ae60: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c ==0 ) return SQL
ae70: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 ITE_NOMEM;.
ae80: 20 6d 65 6d 63 70 79 28 70 2d 3e 7a 50 61 74 68 memcpy(p->zPath
ae90: 2c 20 7a 50 61 74 68 2c 20 6e 2b 31 29 3b 0a 20 , zPath, n+1);.
aea0: 20 20 20 20 20 70 4e 6f 64 65 20 3d 20 6a 73 6f pNode = jso
aeb0: 6e 4c 6f 6f 6b 75 70 28 26 70 2d 3e 73 50 61 72 nLookup(&p->sPar
aec0: 73 65 2c 20 30 2c 20 70 2d 3e 7a 50 61 74 68 2b se, 0, p->zPath+
aed0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 1, 0);. if(
aee0: 20 70 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 pNode==0 ){.
aef0: 20 20 20 20 20 6a 73 6f 6e 45 61 63 68 43 75 72 jsonEachCur
af00: 73 6f 72 52 65 73 65 74 28 70 29 3b 0a 20 20 20 sorReset(p);.
af10: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 return SQLI
af20: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 TE_OK;. }.
af30: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
af40: 70 4e 6f 64 65 20 3d 20 70 2d 3e 73 50 61 72 73 pNode = p->sPars
af50: 65 2e 61 4e 6f 64 65 3b 0a 20 20 20 20 7d 0a 20 e.aNode;. }.
af60: 20 20 20 70 2d 3e 69 20 3d 20 28 69 6e 74 29 28 p->i = (int)(
af70: 70 4e 6f 64 65 20 2d 20 70 2d 3e 73 50 61 72 73 pNode - p->sPars
af80: 65 2e 61 4e 6f 64 65 29 3b 0a 20 20 20 20 70 2d e.aNode);. p-
af90: 3e 65 54 79 70 65 20 3d 20 70 4e 6f 64 65 2d 3e >eType = pNode->
afa0: 65 54 79 70 65 3b 0a 20 20 20 20 69 66 28 20 70 eType;. if( p
afb0: 2d 3e 65 54 79 70 65 3e 3d 4a 53 4f 4e 5f 41 52 ->eType>=JSON_AR
afc0: 52 41 59 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e RAY ){. p->
afd0: 69 2b 2b 3b 0a 20 20 20 20 20 20 70 2d 3e 69 45 i++;. p->iE
afe0: 6e 64 20 3d 20 70 2d 3e 69 20 2b 20 70 4e 6f 64 nd = p->i + pNod
aff0: 65 2d 3e 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b e->n;. }else{
b000: 0a 20 20 20 20 20 20 70 2d 3e 69 45 6e 64 20 3d . p->iEnd =
b010: 20 70 2d 3e 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 p->i+1;. }.
b020: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 }. return SQLI
b030: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 TE_OK;.}../* The
b040: 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20 methods of the
b050: 6a 73 6f 6e 5f 65 61 63 68 20 76 69 72 74 75 61 json_each virtua
b060: 6c 20 74 61 62 6c 65 20 2a 2f 0a 73 74 61 74 69 l table */.stati
b070: 63 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 c sqlite3_module
b080: 20 6a 73 6f 6e 45 61 63 68 4d 6f 64 75 6c 65 20 jsonEachModule
b090: 3d 20 7b 0a 20 20 30 2c 20 20 20 20 20 20 20 20 = {. 0,
b0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
b0b0: 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a /* iVersion */.
b0c0: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 0,
b0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
b0e0: 78 43 72 65 61 74 65 20 2a 2f 0a 20 20 6a 73 6f xCreate */. jso
b0f0: 6e 45 61 63 68 43 6f 6e 6e 65 63 74 2c 20 20 20 nEachConnect,
b100: 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6e 6e /* xConn
b110: 65 63 74 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 ect */. jsonEac
b120: 68 42 65 73 74 49 6e 64 65 78 2c 20 20 20 20 20 hBestIndex,
b130: 20 20 20 20 2f 2a 20 78 42 65 73 74 49 6e 64 65 /* xBestInde
b140: 78 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 44 x */. jsonEachD
b150: 69 73 63 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20 isconnect,
b160: 20 20 2f 2a 20 78 44 69 73 63 6f 6e 6e 65 63 74 /* xDisconnect
b170: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 */. 0,
b180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
b190: 20 2f 2a 20 78 44 65 73 74 72 6f 79 20 2a 2f 0a /* xDestroy */.
b1a0: 20 20 6a 73 6f 6e 45 61 63 68 4f 70 65 6e 45 61 jsonEachOpenEa
b1b0: 63 68 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 ch, /*
b1c0: 78 4f 70 65 6e 20 2d 20 6f 70 65 6e 20 61 20 63 xOpen - open a c
b1d0: 75 72 73 6f 72 20 2a 2f 0a 20 20 6a 73 6f 6e 45 ursor */. jsonE
b1e0: 61 63 68 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 achClose,
b1f0: 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 /* xClose
b200: 2d 20 63 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 - close a cursor
b210: 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 46 69 */. jsonEachFi
b220: 6c 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 lter,
b230: 20 2f 2a 20 78 46 69 6c 74 65 72 20 2d 20 63 6f /* xFilter - co
b240: 6e 66 69 67 75 72 65 20 73 63 61 6e 20 63 6f 6e nfigure scan con
b250: 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 6a 73 straints */. js
b260: 6f 6e 45 61 63 68 4e 65 78 74 2c 20 20 20 20 20 onEachNext,
b270: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4e 65 78 /* xNex
b280: 74 20 2d 20 61 64 76 61 6e 63 65 20 61 20 63 75 t - advance a cu
b290: 72 73 6f 72 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 rsor */. jsonEa
b2a0: 63 68 45 6f 66 2c 20 20 20 20 20 20 20 20 20 20 chEof,
b2b0: 20 20 20 20 20 2f 2a 20 78 45 6f 66 20 2d 20 63 /* xEof - c
b2c0: 68 65 63 6b 20 66 6f 72 20 65 6e 64 20 6f 66 20 heck for end of
b2d0: 73 63 61 6e 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 scan */. jsonEa
b2e0: 63 68 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 chColumn,
b2f0: 20 20 20 20 20 2f 2a 20 78 43 6f 6c 75 6d 6e 20 /* xColumn
b300: 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f 0a 20 - read data */.
b310: 20 6a 73 6f 6e 45 61 63 68 52 6f 77 69 64 2c 20 jsonEachRowid,
b320: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 /* x
b330: 52 6f 77 69 64 20 2d 20 72 65 61 64 20 64 61 74 Rowid - read dat
b340: 61 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 a */. 0,
b350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
b360: 20 20 2f 2a 20 78 55 70 64 61 74 65 20 2a 2f 0a /* xUpdate */.
b370: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 0,
b380: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
b390: 78 42 65 67 69 6e 20 2a 2f 0a 20 20 30 2c 20 20 xBegin */. 0,
b3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
b3b0: 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 /* xSync
b3c0: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 */. 0,
b3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
b3e0: 2f 2a 20 78 43 6f 6d 6d 69 74 20 2a 2f 0a 20 20 /* xCommit */.
b3f0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0,
b400: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 /* xR
b410: 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 30 2c 20 ollback */. 0,
b420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
b430: 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6e 64 /* xFind
b440: 4d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 2c 20 20 Method */. 0,
b450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
b460: 20 20 20 20 20 20 20 2f 2a 20 78 52 65 6e 61 6d /* xRenam
b470: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 20 e */.};../* The
b480: 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20 6a methods of the j
b490: 73 6f 6e 5f 74 72 65 65 20 76 69 72 74 75 61 6c son_tree virtual
b4a0: 20 74 61 62 6c 65 2e 20 2a 2f 0a 73 74 61 74 69 table. */.stati
b4b0: 63 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 c sqlite3_module
b4c0: 20 6a 73 6f 6e 54 72 65 65 4d 6f 64 75 6c 65 20 jsonTreeModule
b4d0: 3d 20 7b 0a 20 20 30 2c 20 20 20 20 20 20 20 20 = {. 0,
b4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
b4f0: 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a /* iVersion */.
b500: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 0,
b510: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
b520: 78 43 72 65 61 74 65 20 2a 2f 0a 20 20 6a 73 6f xCreate */. jso
b530: 6e 45 61 63 68 43 6f 6e 6e 65 63 74 2c 20 20 20 nEachConnect,
b540: 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6f 6e 6e /* xConn
b550: 65 63 74 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 ect */. jsonEac
b560: 68 42 65 73 74 49 6e 64 65 78 2c 20 20 20 20 20 hBestIndex,
b570: 20 20 20 20 2f 2a 20 78 42 65 73 74 49 6e 64 65 /* xBestInde
b580: 78 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 44 x */. jsonEachD
b590: 69 73 63 6f 6e 6e 65 63 74 2c 20 20 20 20 20 20 isconnect,
b5a0: 20 20 2f 2a 20 78 44 69 73 63 6f 6e 6e 65 63 74 /* xDisconnect
b5b0: 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 */. 0,
b5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
b5d0: 20 2f 2a 20 78 44 65 73 74 72 6f 79 20 2a 2f 0a /* xDestroy */.
b5e0: 20 20 6a 73 6f 6e 45 61 63 68 4f 70 65 6e 54 72 jsonEachOpenTr
b5f0: 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 ee, /*
b600: 78 4f 70 65 6e 20 2d 20 6f 70 65 6e 20 61 20 63 xOpen - open a c
b610: 75 72 73 6f 72 20 2a 2f 0a 20 20 6a 73 6f 6e 45 ursor */. jsonE
b620: 61 63 68 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 achClose,
b630: 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 /* xClose
b640: 2d 20 63 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 - close a cursor
b650: 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 63 68 46 69 */. jsonEachFi
b660: 6c 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 lter,
b670: 20 2f 2a 20 78 46 69 6c 74 65 72 20 2d 20 63 6f /* xFilter - co
b680: 6e 66 69 67 75 72 65 20 73 63 61 6e 20 63 6f 6e nfigure scan con
b690: 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 6a 73 straints */. js
b6a0: 6f 6e 45 61 63 68 4e 65 78 74 2c 20 20 20 20 20 onEachNext,
b6b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4e 65 78 /* xNex
b6c0: 74 20 2d 20 61 64 76 61 6e 63 65 20 61 20 63 75 t - advance a cu
b6d0: 72 73 6f 72 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 rsor */. jsonEa
b6e0: 63 68 45 6f 66 2c 20 20 20 20 20 20 20 20 20 20 chEof,
b6f0: 20 20 20 20 20 2f 2a 20 78 45 6f 66 20 2d 20 63 /* xEof - c
b700: 68 65 63 6b 20 66 6f 72 20 65 6e 64 20 6f 66 20 heck for end of
b710: 73 63 61 6e 20 2a 2f 0a 20 20 6a 73 6f 6e 45 61 scan */. jsonEa
b720: 63 68 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 chColumn,
b730: 20 20 20 20 20 2f 2a 20 78 43 6f 6c 75 6d 6e 20 /* xColumn
b740: 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f 0a 20 - read data */.
b750: 20 6a 73 6f 6e 45 61 63 68 52 6f 77 69 64 2c 20 jsonEachRowid,
b760: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 /* x
b770: 52 6f 77 69 64 20 2d 20 72 65 61 64 20 64 61 74 Rowid - read dat
b780: 61 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 a */. 0,
b790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
b7a0: 20 20 2f 2a 20 78 55 70 64 61 74 65 20 2a 2f 0a /* xUpdate */.
b7b0: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 0,
b7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
b7d0: 78 42 65 67 69 6e 20 2a 2f 0a 20 20 30 2c 20 20 xBegin */. 0,
b7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
b7f0: 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 /* xSync
b800: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 */. 0,
b810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
b820: 2f 2a 20 78 43 6f 6d 6d 69 74 20 2a 2f 0a 20 20 /* xCommit */.
b830: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0,
b840: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 /* xR
b850: 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 30 2c 20 ollback */. 0,
b860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
b870: 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6e 64 /* xFind
b880: 4d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 2c 20 20 Method */. 0,
b890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
b8a0: 20 20 20 20 20 20 20 2f 2a 20 78 52 65 6e 61 6d /* xRenam
b8b0: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a e */.};../******
b8c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
b8d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
b8e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
b8f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
b900: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f ******.** The fo
b910: 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20 llowing routine
b920: 69 73 20 74 68 65 20 6f 6e 6c 79 20 70 75 62 6c is the only publ
b930: 69 63 61 6c 6c 79 20 76 69 73 69 62 6c 65 20 69 ically visible i
b940: 64 65 6e 74 69 66 69 65 72 20 69 6e 20 74 68 69 dentifier in thi
b950: 73 0a 2a 2a 20 66 69 6c 65 2e 20 20 43 61 6c 6c s.** file. Call
b960: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 the following r
b970: 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 outine in order
b980: 74 6f 20 72 65 67 69 73 74 65 72 20 74 68 65 20 to register the
b990: 76 61 72 69 6f 75 73 20 53 51 4c 0a 2a 2a 20 66 various SQL.** f
b9a0: 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 unctions and the
b9b0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 virtual table i
b9c0: 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 74 68 mplemented by th
b9d0: 69 73 20 66 69 6c 65 2e 0a 2a 2a 2a 2a 2a 2a 2a is file..*******
b9e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
b9f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
ba00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
ba10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
ba20: 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66 64 65 66 20 5f *****/..#ifdef _
ba30: 57 49 4e 33 32 0a 5f 5f 64 65 63 6c 73 70 65 63 WIN32.__declspec
ba40: 28 64 6c 6c 65 78 70 6f 72 74 29 0a 23 65 6e 64 (dllexport).#end
ba50: 69 66 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6a if.int sqlite3_j
ba60: 73 6f 6e 5f 69 6e 69 74 28 0a 20 20 73 71 6c 69 son_init(. sqli
ba70: 74 65 33 20 2a 64 62 2c 20 0a 20 20 63 68 61 72 te3 *db, . char
ba80: 20 2a 2a 70 7a 45 72 72 4d 73 67 2c 20 0a 20 20 **pzErrMsg, .
ba90: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 const sqlite3_ap
baa0: 69 5f 72 6f 75 74 69 6e 65 73 20 2a 70 41 70 69 i_routines *pApi
bab0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 .){. int rc = S
bac0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 QLITE_OK;. int
bad0: 69 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 i;. static cons
bae0: 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 t struct {.
baf0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d const char *zNam
bb00: 65 3b 0a 20 20 20 20 20 69 6e 74 20 6e 41 72 67 e;. int nArg
bb10: 3b 0a 20 20 20 20 20 69 6e 74 20 66 6c 61 67 3b ;. int flag;
bb20: 0a 20 20 20 20 20 76 6f 69 64 20 28 2a 78 46 75 . void (*xFu
bb30: 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 nc)(sqlite3_cont
bb40: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 ext*,int,sqlite3
bb50: 5f 76 61 6c 75 65 2a 2a 29 3b 0a 20 20 7d 20 61 _value**);. } a
bb60: 46 75 6e 63 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b Func[] = {. {
bb70: 20 22 6a 73 6f 6e 5f 61 72 72 61 79 22 2c 20 20 "json_array",
bb80: 20 20 20 20 20 20 20 20 2d 31 2c 20 30 2c 20 20 -1, 0,
bb90: 20 6a 73 6f 6e 41 72 72 61 79 46 75 6e 63 20 20 jsonArrayFunc
bba0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 },. {
bbb0: 22 6a 73 6f 6e 5f 61 72 72 61 79 5f 6c 65 6e 67 "json_array_leng
bbc0: 74 68 22 2c 20 20 20 20 31 2c 20 30 2c 20 20 20 th", 1, 0,
bbd0: 6a 73 6f 6e 41 72 72 61 79 4c 65 6e 67 74 68 46 jsonArrayLengthF
bbe0: 75 6e 63 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 unc },. { "
bbf0: 6a 73 6f 6e 5f 61 72 72 61 79 5f 6c 65 6e 67 74 json_array_lengt
bc00: 68 22 2c 20 20 20 20 32 2c 20 30 2c 20 20 20 6a h", 2, 0, j
bc10: 73 6f 6e 41 72 72 61 79 4c 65 6e 67 74 68 46 75 sonArrayLengthFu
bc20: 6e 63 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a nc },. { "j
bc30: 73 6f 6e 5f 65 78 74 72 61 63 74 22 2c 20 20 20 son_extract",
bc40: 20 20 20 20 20 20 32 2c 20 30 2c 20 20 20 6a 73 2, 0, js
bc50: 6f 6e 45 78 74 72 61 63 74 46 75 6e 63 20 20 20 onExtractFunc
bc60: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 },. { "js
bc70: 6f 6e 5f 69 6e 73 65 72 74 22 2c 20 20 20 20 20 on_insert",
bc80: 20 20 20 20 2d 31 2c 20 30 2c 20 20 20 6a 73 6f -1, 0, jso
bc90: 6e 53 65 74 46 75 6e 63 20 20 20 20 20 20 20 20 nSetFunc
bca0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f },. { "jso
bcb0: 6e 5f 6f 62 6a 65 63 74 22 2c 20 20 20 20 20 20 n_object",
bcc0: 20 20 20 2d 31 2c 20 30 2c 20 20 20 6a 73 6f 6e -1, 0, json
bcd0: 4f 62 6a 65 63 74 46 75 6e 63 20 20 20 20 20 20 ObjectFunc
bce0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e },. { "json
bcf0: 5f 72 65 6d 6f 76 65 22 2c 20 20 20 20 20 20 20 _remove",
bd00: 20 20 2d 31 2c 20 30 2c 20 20 20 6a 73 6f 6e 52 -1, 0, jsonR
bd10: 65 6d 6f 76 65 46 75 6e 63 20 20 20 20 20 20 20 emoveFunc
bd20: 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f },. { "json_
bd30: 72 65 70 6c 61 63 65 22 2c 20 20 20 20 20 20 20 replace",
bd40: 20 2d 31 2c 20 30 2c 20 20 20 6a 73 6f 6e 52 65 -1, 0, jsonRe
bd50: 70 6c 61 63 65 46 75 6e 63 20 20 20 20 20 20 20 placeFunc
bd60: 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 73 },. { "json_s
bd70: 65 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 et",
bd80: 2d 31 2c 20 31 2c 20 20 20 6a 73 6f 6e 53 65 74 -1, 1, jsonSet
bd90: 46 75 6e 63 20 20 20 20 20 20 20 20 20 20 20 7d Func }
bda0: 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 74 79 ,. { "json_ty
bdb0: 70 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 pe",
bdc0: 31 2c 20 30 2c 20 20 20 6a 73 6f 6e 54 79 70 65 1, 0, jsonType
bdd0: 46 75 6e 63 20 20 20 20 20 20 20 20 20 20 7d 2c Func },
bde0: 0a 20 20 20 20 7b 20 22 6a 73 6f 6e 5f 74 79 70 . { "json_typ
bdf0: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 32 e", 2
be00: 2c 20 30 2c 20 20 20 6a 73 6f 6e 54 79 70 65 46 , 0, jsonTypeF
be10: 75 6e 63 20 20 20 20 20 20 20 20 20 20 7d 2c 0a unc },.
be20: 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 .#if SQLITE_DEBU
be30: 47 0a 20 20 20 20 2f 2a 20 44 45 42 55 47 20 61 G. /* DEBUG a
be40: 6e 64 20 54 45 53 54 49 4e 47 20 66 75 6e 63 74 nd TESTING funct
be50: 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 7b 20 22 6a ions */. { "j
be60: 73 6f 6e 5f 70 61 72 73 65 22 2c 20 20 20 20 20 son_parse",
be70: 20 20 20 20 20 20 31 2c 20 30 2c 20 20 20 6a 73 1, 0, js
be80: 6f 6e 50 61 72 73 65 46 75 6e 63 20 20 20 20 20 onParseFunc
be90: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 },. { "js
bea0: 6f 6e 5f 74 65 73 74 31 22 2c 20 20 20 20 20 20 on_test1",
beb0: 20 20 20 20 20 31 2c 20 30 2c 20 20 20 6a 73 6f 1, 0, jso
bec0: 6e 54 65 73 74 31 46 75 6e 63 20 20 20 20 20 20 nTest1Func
bed0: 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f },. { "jso
bee0: 6e 5f 6e 6f 64 65 63 6f 75 6e 74 22 2c 20 20 20 n_nodecount",
bef0: 20 20 20 20 31 2c 20 30 2c 20 20 20 6a 73 6f 6e 1, 0, json
bf00: 4e 6f 64 65 43 6f 75 6e 74 46 75 6e 63 20 20 20 NodeCountFunc
bf10: 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 7d 3b },.#endif. };
bf20: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 . static const
bf30: 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 63 6f struct {. co
bf40: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b nst char *zName;
bf50: 0a 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 6f . sqlite3_mo
bf60: 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 3b 0a 20 dule *pModule;.
bf70: 20 7d 20 61 4d 6f 64 5b 5d 20 3d 20 7b 0a 20 20 } aMod[] = {.
bf80: 20 20 7b 20 22 6a 73 6f 6e 5f 65 61 63 68 22 2c { "json_each",
bf90: 20 20 20 20 20 20 20 20 20 20 20 20 26 6a 73 6f &jso
bfa0: 6e 45 61 63 68 4d 6f 64 75 6c 65 20 20 20 20 20 nEachModule
bfb0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 },.
bfc0: 20 7b 20 22 6a 73 6f 6e 5f 74 72 65 65 22 2c 20 { "json_tree",
bfd0: 20 20 20 20 20 20 20 20 20 20 20 26 6a 73 6f 6e &json
bfe0: 54 72 65 65 4d 6f 64 75 6c 65 20 20 20 20 20 20 TreeModule
bff0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b },. };
c000: 0a 20 20 53 51 4c 49 54 45 5f 45 58 54 45 4e 53 . SQLITE_EXTENS
c010: 49 4f 4e 5f 49 4e 49 54 32 28 70 41 70 69 29 3b ION_INIT2(pApi);
c020: 0a 20 20 28 76 6f 69 64 29 70 7a 45 72 72 4d 73 . (void)pzErrMs
c030: 67 3b 20 20 2f 2a 20 55 6e 75 73 65 64 20 70 61 g; /* Unused pa
c040: 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 66 6f 72 rameter */. for
c050: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 (i=0; i<sizeof(a
c060: 46 75 6e 63 29 2f 73 69 7a 65 6f 66 28 61 46 75 Func)/sizeof(aFu
c070: 6e 63 5b 30 5d 29 20 26 26 20 72 63 3d 3d 53 51 nc[0]) && rc==SQ
c080: 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 LITE_OK; i++){.
c090: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f rc = sqlite3_
c0a0: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 create_function(
c0b0: 64 62 2c 20 61 46 75 6e 63 5b 69 5d 2e 7a 4e 61 db, aFunc[i].zNa
c0c0: 6d 65 2c 20 61 46 75 6e 63 5b 69 5d 2e 6e 41 72 me, aFunc[i].nAr
c0d0: 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 g,.
c0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
c0f0: 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20 SQLITE_UTF8
c100: 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 | SQLITE_DETERMI
c110: 4e 49 53 54 49 43 2c 20 0a 20 20 20 20 20 20 20 NISTIC, .
c120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
c130: 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a (void*
c140: 29 26 61 46 75 6e 63 5b 69 5d 2e 66 6c 61 67 2c )&aFunc[i].flag,
c150: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
c160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
c170: 20 20 61 46 75 6e 63 5b 69 5d 2e 78 46 75 6e 63 aFunc[i].xFunc
c180: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 66 , 0, 0);. }. f
c190: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 or(i=0; i<sizeof
c1a0: 28 61 4d 6f 64 29 2f 73 69 7a 65 6f 66 28 61 4d (aMod)/sizeof(aM
c1b0: 6f 64 5b 30 5d 29 20 26 26 20 72 63 3d 3d 53 51 od[0]) && rc==SQ
c1c0: 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 LITE_OK; i++){.
c1d0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f rc = sqlite3_
c1e0: 63 72 65 61 74 65 5f 6d 6f 64 75 6c 65 28 64 62 create_module(db
c1f0: 2c 20 61 4d 6f 64 5b 69 5d 2e 7a 4e 61 6d 65 2c , aMod[i].zName,
c200: 20 61 4d 6f 64 5b 69 5d 2e 70 4d 6f 64 75 6c 65 aMod[i].pModule
c210: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 , 0);. }. retu
c220: 72 6e 20 72 63 3b 0a 7d 0a rn rc;.}.