blob: b12964ba4d2b30df582c2e4aee028b874cdda6a3 [file] [log] [blame]
drh5fa5c102015-08-12 16:49:40 +00001/*
2** 2015-08-12
3**
4** The author disclaims copyright to this source code. In place of
5** a legal notice, here is a blessing:
6**
7** May you do good and not evil.
8** May you find forgiveness for yourself and forgive others.
9** May you share freely, never taking more than you give.
10**
11******************************************************************************
12**
13** This SQLite extension implements JSON functions. The interface is
14** modeled after MySQL JSON functions:
15**
16** https://dev.mysql.com/doc/refman/5.7/en/json.html
17**
drh5634cc02015-08-17 11:28:03 +000018** For the time being, all JSON is stored as pure text. (We might add
19** a JSONB type in the future which stores a binary encoding of JSON in
drhcb6c6c62015-08-19 22:47:17 +000020** a BLOB, but there is no support for JSONB in the current implementation.
21** This implementation parses JSON text at 250 MB/s, so it is hard to see
22** how JSONB might improve on that.)
drh5fa5c102015-08-12 16:49:40 +000023*/
drh50065652015-10-08 19:29:18 +000024#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_JSON1)
drh666d34c2017-01-25 13:54:27 +000025#if !defined(SQLITEINT_H)
drh5fa5c102015-08-12 16:49:40 +000026#include "sqlite3ext.h"
drhf2df7e72015-08-28 20:07:40 +000027#endif
drh5fa5c102015-08-12 16:49:40 +000028SQLITE_EXTENSION_INIT1
29#include <assert.h>
30#include <string.h>
drh987eb1f2015-08-17 15:17:37 +000031#include <stdlib.h>
drh4af352d2015-08-21 20:02:48 +000032#include <stdarg.h>
drh5fa5c102015-08-12 16:49:40 +000033
drhdf3a9072016-02-11 15:37:18 +000034/* Mark a function parameter as unused, to suppress nuisance compiler
35** warnings. */
36#ifndef UNUSED_PARAM
37# define UNUSED_PARAM(X) (void)(X)
38#endif
drh6fd5c1e2015-08-21 20:37:12 +000039
drh8deb4b82015-10-09 18:21:43 +000040#ifndef LARGEST_INT64
41# define LARGEST_INT64 (0xffffffff|(((sqlite3_int64)0x7fffffff)<<32))
42# define SMALLEST_INT64 (((sqlite3_int64)-1) - LARGEST_INT64)
43#endif
44
dan2e8f5512015-09-17 17:21:09 +000045/*
46** Versions of isspace(), isalnum() and isdigit() to which it is safe
47** to pass signed char values.
48*/
drh49472652015-10-16 15:35:39 +000049#ifdef sqlite3Isdigit
50 /* Use the SQLite core versions if this routine is part of the
51 ** SQLite amalgamation */
drhad875e72016-11-07 13:37:28 +000052# define safe_isdigit(x) sqlite3Isdigit(x)
53# define safe_isalnum(x) sqlite3Isalnum(x)
54# define safe_isxdigit(x) sqlite3Isxdigit(x)
drh49472652015-10-16 15:35:39 +000055#else
56 /* Use the standard library for separate compilation */
57#include <ctype.h> /* amalgamator: keep */
drhad875e72016-11-07 13:37:28 +000058# define safe_isdigit(x) isdigit((unsigned char)(x))
59# define safe_isalnum(x) isalnum((unsigned char)(x))
60# define safe_isxdigit(x) isxdigit((unsigned char)(x))
drh49472652015-10-16 15:35:39 +000061#endif
dan2e8f5512015-09-17 17:21:09 +000062
drh95677942015-09-24 01:06:37 +000063/*
64** Growing our own isspace() routine this way is twice as fast as
65** the library isspace() function, resulting in a 7% overall performance
66** increase for the parser. (Ubuntu14.10 gcc 4.8.4 x64 with -Os).
67*/
68static const char jsonIsSpace[] = {
drhb9e8f592015-10-16 15:16:06 +000069 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0,
drh95677942015-09-24 01:06:37 +000070 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
71 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
72 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
73 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
74 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
75 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
76 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
77 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
78 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
79 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
80 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
81 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
82 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
83 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
84 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
85};
86#define safe_isspace(x) (jsonIsSpace[(unsigned char)x])
87
drh9a4718f2015-10-10 14:00:37 +000088#ifndef SQLITE_AMALGAMATION
89 /* Unsigned integer types. These are already defined in the sqliteInt.h,
90 ** but the definitions need to be repeated for separate compilation. */
91 typedef sqlite3_uint64 u64;
92 typedef unsigned int u32;
93 typedef unsigned char u8;
94#endif
drh5fa5c102015-08-12 16:49:40 +000095
drh52216ad2015-08-18 02:28:03 +000096/* Objects */
drh505ad2c2015-08-21 17:33:11 +000097typedef struct JsonString JsonString;
drh52216ad2015-08-18 02:28:03 +000098typedef struct JsonNode JsonNode;
99typedef struct JsonParse JsonParse;
100
drh5634cc02015-08-17 11:28:03 +0000101/* An instance of this object represents a JSON string
102** under construction. Really, this is a generic string accumulator
103** that can be and is used to create strings other than JSON.
drh5fa5c102015-08-12 16:49:40 +0000104*/
drh505ad2c2015-08-21 17:33:11 +0000105struct JsonString {
drh5fa5c102015-08-12 16:49:40 +0000106 sqlite3_context *pCtx; /* Function context - put error messages here */
drh5634cc02015-08-17 11:28:03 +0000107 char *zBuf; /* Append JSON content here */
drh5fa5c102015-08-12 16:49:40 +0000108 u64 nAlloc; /* Bytes of storage available in zBuf[] */
109 u64 nUsed; /* Bytes of zBuf[] currently used */
110 u8 bStatic; /* True if zBuf is static space */
drhd0960592015-08-17 21:22:32 +0000111 u8 bErr; /* True if an error has been encountered */
drh5fa5c102015-08-12 16:49:40 +0000112 char zSpace[100]; /* Initial static space */
113};
114
drhe9c37f32015-08-15 21:25:36 +0000115/* JSON type values
drhbd0621b2015-08-13 13:54:59 +0000116*/
drhe9c37f32015-08-15 21:25:36 +0000117#define JSON_NULL 0
118#define JSON_TRUE 1
119#define JSON_FALSE 2
120#define JSON_INT 3
121#define JSON_REAL 4
122#define JSON_STRING 5
123#define JSON_ARRAY 6
124#define JSON_OBJECT 7
125
drhf5ddb9c2015-09-11 00:06:41 +0000126/* The "subtype" set for JSON values */
127#define JSON_SUBTYPE 74 /* Ascii for "J" */
128
drh987eb1f2015-08-17 15:17:37 +0000129/*
130** Names of the various JSON types:
131*/
132static const char * const jsonType[] = {
133 "null", "true", "false", "integer", "real", "text", "array", "object"
134};
135
drh301eecc2015-08-17 20:14:19 +0000136/* Bit values for the JsonNode.jnFlag field
137*/
138#define JNODE_RAW 0x01 /* Content is raw, not JSON encoded */
139#define JNODE_ESCAPE 0x02 /* Content is text with \ escapes */
140#define JNODE_REMOVE 0x04 /* Do not output */
drh633647a2017-03-22 21:24:31 +0000141#define JNODE_REPLACE 0x08 /* Replace with JsonNode.u.iReplace */
142#define JNODE_PATCH 0x10 /* Patch with JsonNode.u.pPatch */
143#define JNODE_APPEND 0x20 /* More ARRAY/OBJECT entries at u.iAppend */
144#define JNODE_LABEL 0x40 /* Is a label of an object */
drh301eecc2015-08-17 20:14:19 +0000145
drh987eb1f2015-08-17 15:17:37 +0000146
drhe9c37f32015-08-15 21:25:36 +0000147/* A single node of parsed JSON
148*/
drhe9c37f32015-08-15 21:25:36 +0000149struct JsonNode {
drh5634cc02015-08-17 11:28:03 +0000150 u8 eType; /* One of the JSON_ type values */
drh301eecc2015-08-17 20:14:19 +0000151 u8 jnFlags; /* JNODE flags */
drhe9c37f32015-08-15 21:25:36 +0000152 u32 n; /* Bytes of content, or number of sub-nodes */
drh52216ad2015-08-18 02:28:03 +0000153 union {
drh0042a972015-08-18 12:59:58 +0000154 const char *zJContent; /* Content for INT, REAL, and STRING */
155 u32 iAppend; /* More terms for ARRAY and OBJECT */
drh505ad2c2015-08-21 17:33:11 +0000156 u32 iKey; /* Key for ARRAY objects in json_tree() */
drh633647a2017-03-22 21:24:31 +0000157 u32 iReplace; /* Replacement content for JNODE_REPLACE */
158 JsonNode *pPatch; /* Node chain of patch for JNODE_PATCH */
drh52216ad2015-08-18 02:28:03 +0000159 } u;
drhe9c37f32015-08-15 21:25:36 +0000160};
161
162/* A completely parsed JSON string
163*/
drhe9c37f32015-08-15 21:25:36 +0000164struct JsonParse {
165 u32 nNode; /* Number of slots of aNode[] used */
166 u32 nAlloc; /* Number of slots of aNode[] allocated */
167 JsonNode *aNode; /* Array of nodes containing the parse */
168 const char *zJson; /* Original JSON string */
drh505ad2c2015-08-21 17:33:11 +0000169 u32 *aUp; /* Index of parent of each node */
drhe9c37f32015-08-15 21:25:36 +0000170 u8 oom; /* Set to true if out of memory */
drha7714022015-08-29 00:54:49 +0000171 u8 nErr; /* Number of errors seen */
drhe9c37f32015-08-15 21:25:36 +0000172};
173
drh505ad2c2015-08-21 17:33:11 +0000174/**************************************************************************
175** Utility routines for dealing with JsonString objects
176**************************************************************************/
drh301eecc2015-08-17 20:14:19 +0000177
drh505ad2c2015-08-21 17:33:11 +0000178/* Set the JsonString object to an empty string
drh5fa5c102015-08-12 16:49:40 +0000179*/
drh505ad2c2015-08-21 17:33:11 +0000180static void jsonZero(JsonString *p){
drh5fa5c102015-08-12 16:49:40 +0000181 p->zBuf = p->zSpace;
182 p->nAlloc = sizeof(p->zSpace);
183 p->nUsed = 0;
184 p->bStatic = 1;
185}
186
drh505ad2c2015-08-21 17:33:11 +0000187/* Initialize the JsonString object
drh5fa5c102015-08-12 16:49:40 +0000188*/
drh505ad2c2015-08-21 17:33:11 +0000189static void jsonInit(JsonString *p, sqlite3_context *pCtx){
drh5fa5c102015-08-12 16:49:40 +0000190 p->pCtx = pCtx;
drhd0960592015-08-17 21:22:32 +0000191 p->bErr = 0;
drh5fa5c102015-08-12 16:49:40 +0000192 jsonZero(p);
193}
194
195
drh505ad2c2015-08-21 17:33:11 +0000196/* Free all allocated memory and reset the JsonString object back to its
drh5fa5c102015-08-12 16:49:40 +0000197** initial state.
198*/
drh505ad2c2015-08-21 17:33:11 +0000199static void jsonReset(JsonString *p){
drh5fa5c102015-08-12 16:49:40 +0000200 if( !p->bStatic ) sqlite3_free(p->zBuf);
201 jsonZero(p);
202}
203
204
205/* Report an out-of-memory (OOM) condition
206*/
drh505ad2c2015-08-21 17:33:11 +0000207static void jsonOom(JsonString *p){
drh3d1d2a92015-09-22 01:15:49 +0000208 p->bErr = 1;
209 sqlite3_result_error_nomem(p->pCtx);
210 jsonReset(p);
drh5fa5c102015-08-12 16:49:40 +0000211}
212
213/* Enlarge pJson->zBuf so that it can hold at least N more bytes.
214** Return zero on success. Return non-zero on an OOM error
215*/
drh505ad2c2015-08-21 17:33:11 +0000216static int jsonGrow(JsonString *p, u32 N){
drh301eecc2015-08-17 20:14:19 +0000217 u64 nTotal = N<p->nAlloc ? p->nAlloc*2 : p->nAlloc+N+10;
drh5fa5c102015-08-12 16:49:40 +0000218 char *zNew;
219 if( p->bStatic ){
drhd0960592015-08-17 21:22:32 +0000220 if( p->bErr ) return 1;
drh5fa5c102015-08-12 16:49:40 +0000221 zNew = sqlite3_malloc64(nTotal);
222 if( zNew==0 ){
223 jsonOom(p);
224 return SQLITE_NOMEM;
225 }
drh6fd5c1e2015-08-21 20:37:12 +0000226 memcpy(zNew, p->zBuf, (size_t)p->nUsed);
drh5fa5c102015-08-12 16:49:40 +0000227 p->zBuf = zNew;
228 p->bStatic = 0;
229 }else{
230 zNew = sqlite3_realloc64(p->zBuf, nTotal);
231 if( zNew==0 ){
232 jsonOom(p);
233 return SQLITE_NOMEM;
234 }
235 p->zBuf = zNew;
236 }
237 p->nAlloc = nTotal;
238 return SQLITE_OK;
239}
240
drh505ad2c2015-08-21 17:33:11 +0000241/* Append N bytes from zIn onto the end of the JsonString string.
drh5fa5c102015-08-12 16:49:40 +0000242*/
drh505ad2c2015-08-21 17:33:11 +0000243static void jsonAppendRaw(JsonString *p, const char *zIn, u32 N){
drh5fa5c102015-08-12 16:49:40 +0000244 if( (N+p->nUsed >= p->nAlloc) && jsonGrow(p,N)!=0 ) return;
245 memcpy(p->zBuf+p->nUsed, zIn, N);
246 p->nUsed += N;
247}
248
drh4af352d2015-08-21 20:02:48 +0000249/* Append formatted text (not to exceed N bytes) to the JsonString.
250*/
251static void jsonPrintf(int N, JsonString *p, const char *zFormat, ...){
252 va_list ap;
253 if( (p->nUsed + N >= p->nAlloc) && jsonGrow(p, N) ) return;
254 va_start(ap, zFormat);
255 sqlite3_vsnprintf(N, p->zBuf+p->nUsed, zFormat, ap);
256 va_end(ap);
257 p->nUsed += (int)strlen(p->zBuf+p->nUsed);
258}
259
drh5634cc02015-08-17 11:28:03 +0000260/* Append a single character
261*/
drh505ad2c2015-08-21 17:33:11 +0000262static void jsonAppendChar(JsonString *p, char c){
drh5634cc02015-08-17 11:28:03 +0000263 if( p->nUsed>=p->nAlloc && jsonGrow(p,1)!=0 ) return;
264 p->zBuf[p->nUsed++] = c;
265}
266
drh301eecc2015-08-17 20:14:19 +0000267/* Append a comma separator to the output buffer, if the previous
268** character is not '[' or '{'.
269*/
drh505ad2c2015-08-21 17:33:11 +0000270static void jsonAppendSeparator(JsonString *p){
drh301eecc2015-08-17 20:14:19 +0000271 char c;
272 if( p->nUsed==0 ) return;
273 c = p->zBuf[p->nUsed-1];
274 if( c!='[' && c!='{' ) jsonAppendChar(p, ',');
275}
276
drh505ad2c2015-08-21 17:33:11 +0000277/* Append the N-byte string in zIn to the end of the JsonString string
drh5fa5c102015-08-12 16:49:40 +0000278** under construction. Enclose the string in "..." and escape
279** any double-quotes or backslash characters contained within the
280** string.
281*/
drh505ad2c2015-08-21 17:33:11 +0000282static void jsonAppendString(JsonString *p, const char *zIn, u32 N){
drh5fa5c102015-08-12 16:49:40 +0000283 u32 i;
284 if( (N+p->nUsed+2 >= p->nAlloc) && jsonGrow(p,N+2)!=0 ) return;
285 p->zBuf[p->nUsed++] = '"';
286 for(i=0; i<N; i++){
drh3b7f9a62016-02-04 10:28:57 +0000287 unsigned char c = ((unsigned const char*)zIn)[i];
drh5fa5c102015-08-12 16:49:40 +0000288 if( c=='"' || c=='\\' ){
drh3b7f9a62016-02-04 10:28:57 +0000289 json_simple_escape:
drh4977ccf2015-09-19 11:57:26 +0000290 if( (p->nUsed+N+3-i > p->nAlloc) && jsonGrow(p,N+3-i)!=0 ) return;
drh5fa5c102015-08-12 16:49:40 +0000291 p->zBuf[p->nUsed++] = '\\';
drh3b7f9a62016-02-04 10:28:57 +0000292 }else if( c<=0x1f ){
293 static const char aSpecial[] = {
294 0, 0, 0, 0, 0, 0, 0, 0, 'b', 't', 'n', 0, 'f', 'r', 0, 0,
295 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
296 };
297 assert( sizeof(aSpecial)==32 );
298 assert( aSpecial['\b']=='b' );
299 assert( aSpecial['\f']=='f' );
300 assert( aSpecial['\n']=='n' );
301 assert( aSpecial['\r']=='r' );
302 assert( aSpecial['\t']=='t' );
303 if( aSpecial[c] ){
304 c = aSpecial[c];
305 goto json_simple_escape;
306 }
307 if( (p->nUsed+N+7+i > p->nAlloc) && jsonGrow(p,N+7-i)!=0 ) return;
308 p->zBuf[p->nUsed++] = '\\';
309 p->zBuf[p->nUsed++] = 'u';
310 p->zBuf[p->nUsed++] = '0';
311 p->zBuf[p->nUsed++] = '0';
312 p->zBuf[p->nUsed++] = '0' + (c>>4);
313 c = "0123456789abcdef"[c&0xf];
drh5fa5c102015-08-12 16:49:40 +0000314 }
315 p->zBuf[p->nUsed++] = c;
316 }
317 p->zBuf[p->nUsed++] = '"';
drh4977ccf2015-09-19 11:57:26 +0000318 assert( p->nUsed<p->nAlloc );
drh5fa5c102015-08-12 16:49:40 +0000319}
320
drhd0960592015-08-17 21:22:32 +0000321/*
322** Append a function parameter value to the JSON string under
323** construction.
324*/
325static void jsonAppendValue(
drh505ad2c2015-08-21 17:33:11 +0000326 JsonString *p, /* Append to this JSON string */
drhf5ddb9c2015-09-11 00:06:41 +0000327 sqlite3_value *pValue /* Value to append */
drhd0960592015-08-17 21:22:32 +0000328){
329 switch( sqlite3_value_type(pValue) ){
330 case SQLITE_NULL: {
331 jsonAppendRaw(p, "null", 4);
332 break;
333 }
334 case SQLITE_INTEGER:
335 case SQLITE_FLOAT: {
336 const char *z = (const char*)sqlite3_value_text(pValue);
337 u32 n = (u32)sqlite3_value_bytes(pValue);
338 jsonAppendRaw(p, z, n);
339 break;
340 }
341 case SQLITE_TEXT: {
342 const char *z = (const char*)sqlite3_value_text(pValue);
343 u32 n = (u32)sqlite3_value_bytes(pValue);
drhf5ddb9c2015-09-11 00:06:41 +0000344 if( sqlite3_value_subtype(pValue)==JSON_SUBTYPE ){
drhecb5fed2015-08-28 03:33:50 +0000345 jsonAppendRaw(p, z, n);
346 }else{
347 jsonAppendString(p, z, n);
348 }
drhd0960592015-08-17 21:22:32 +0000349 break;
350 }
351 default: {
352 if( p->bErr==0 ){
353 sqlite3_result_error(p->pCtx, "JSON cannot hold BLOB values", -1);
drh4a642b62016-02-05 01:55:27 +0000354 p->bErr = 2;
drhd0960592015-08-17 21:22:32 +0000355 jsonReset(p);
356 }
357 break;
358 }
359 }
360}
361
362
drhbd0621b2015-08-13 13:54:59 +0000363/* Make the JSON in p the result of the SQL function.
drh5fa5c102015-08-12 16:49:40 +0000364*/
drh505ad2c2015-08-21 17:33:11 +0000365static void jsonResult(JsonString *p){
drhd0960592015-08-17 21:22:32 +0000366 if( p->bErr==0 ){
drh5fa5c102015-08-12 16:49:40 +0000367 sqlite3_result_text64(p->pCtx, p->zBuf, p->nUsed,
368 p->bStatic ? SQLITE_TRANSIENT : sqlite3_free,
369 SQLITE_UTF8);
370 jsonZero(p);
371 }
372 assert( p->bStatic );
373}
374
drh505ad2c2015-08-21 17:33:11 +0000375/**************************************************************************
376** Utility routines for dealing with JsonNode and JsonParse objects
377**************************************************************************/
378
379/*
380** Return the number of consecutive JsonNode slots need to represent
381** the parsed JSON at pNode. The minimum answer is 1. For ARRAY and
382** OBJECT types, the number might be larger.
383**
384** Appended elements are not counted. The value returned is the number
385** by which the JsonNode counter should increment in order to go to the
386** next peer value.
387*/
388static u32 jsonNodeSize(JsonNode *pNode){
389 return pNode->eType>=JSON_ARRAY ? pNode->n+1 : 1;
390}
391
392/*
393** Reclaim all memory allocated by a JsonParse object. But do not
394** delete the JsonParse object itself.
395*/
396static void jsonParseReset(JsonParse *pParse){
397 sqlite3_free(pParse->aNode);
398 pParse->aNode = 0;
399 pParse->nNode = 0;
400 pParse->nAlloc = 0;
401 sqlite3_free(pParse->aUp);
402 pParse->aUp = 0;
403}
404
drh5634cc02015-08-17 11:28:03 +0000405/*
406** Convert the JsonNode pNode into a pure JSON string and
407** append to pOut. Subsubstructure is also included. Return
408** the number of JsonNode objects that are encoded.
drhbd0621b2015-08-13 13:54:59 +0000409*/
drh52216ad2015-08-18 02:28:03 +0000410static void jsonRenderNode(
drhd0960592015-08-17 21:22:32 +0000411 JsonNode *pNode, /* The node to render */
drh505ad2c2015-08-21 17:33:11 +0000412 JsonString *pOut, /* Write JSON here */
drhd0960592015-08-17 21:22:32 +0000413 sqlite3_value **aReplace /* Replacement values */
414){
drh633647a2017-03-22 21:24:31 +0000415 if( pNode->jnFlags & (JNODE_REPLACE|JNODE_PATCH) ){
416 if( pNode->jnFlags & JNODE_REPLACE ){
417 jsonAppendValue(pOut, aReplace[pNode->u.iReplace]);
418 return;
419 }
420 pNode = pNode->u.pPatch;
421 }
drh5634cc02015-08-17 11:28:03 +0000422 switch( pNode->eType ){
drha8f39a92015-09-21 22:53:16 +0000423 default: {
424 assert( pNode->eType==JSON_NULL );
drh5634cc02015-08-17 11:28:03 +0000425 jsonAppendRaw(pOut, "null", 4);
426 break;
427 }
428 case JSON_TRUE: {
429 jsonAppendRaw(pOut, "true", 4);
430 break;
431 }
432 case JSON_FALSE: {
433 jsonAppendRaw(pOut, "false", 5);
434 break;
435 }
436 case JSON_STRING: {
drh301eecc2015-08-17 20:14:19 +0000437 if( pNode->jnFlags & JNODE_RAW ){
drh52216ad2015-08-18 02:28:03 +0000438 jsonAppendString(pOut, pNode->u.zJContent, pNode->n);
drh5634cc02015-08-17 11:28:03 +0000439 break;
440 }
441 /* Fall through into the next case */
442 }
443 case JSON_REAL:
444 case JSON_INT: {
drh52216ad2015-08-18 02:28:03 +0000445 jsonAppendRaw(pOut, pNode->u.zJContent, pNode->n);
drh5634cc02015-08-17 11:28:03 +0000446 break;
447 }
448 case JSON_ARRAY: {
drh52216ad2015-08-18 02:28:03 +0000449 u32 j = 1;
drh5634cc02015-08-17 11:28:03 +0000450 jsonAppendChar(pOut, '[');
drh52216ad2015-08-18 02:28:03 +0000451 for(;;){
452 while( j<=pNode->n ){
drh633647a2017-03-22 21:24:31 +0000453 if( (pNode[j].jnFlags & JNODE_REMOVE)==0 ){
drhd0960592015-08-17 21:22:32 +0000454 jsonAppendSeparator(pOut);
drh52216ad2015-08-18 02:28:03 +0000455 jsonRenderNode(&pNode[j], pOut, aReplace);
drhd0960592015-08-17 21:22:32 +0000456 }
drh505ad2c2015-08-21 17:33:11 +0000457 j += jsonNodeSize(&pNode[j]);
drh301eecc2015-08-17 20:14:19 +0000458 }
drh52216ad2015-08-18 02:28:03 +0000459 if( (pNode->jnFlags & JNODE_APPEND)==0 ) break;
460 pNode = &pNode[pNode->u.iAppend];
461 j = 1;
drh5634cc02015-08-17 11:28:03 +0000462 }
463 jsonAppendChar(pOut, ']');
464 break;
465 }
466 case JSON_OBJECT: {
drh52216ad2015-08-18 02:28:03 +0000467 u32 j = 1;
drh5634cc02015-08-17 11:28:03 +0000468 jsonAppendChar(pOut, '{');
drh52216ad2015-08-18 02:28:03 +0000469 for(;;){
470 while( j<=pNode->n ){
471 if( (pNode[j+1].jnFlags & JNODE_REMOVE)==0 ){
472 jsonAppendSeparator(pOut);
473 jsonRenderNode(&pNode[j], pOut, aReplace);
474 jsonAppendChar(pOut, ':');
drh633647a2017-03-22 21:24:31 +0000475 jsonRenderNode(&pNode[j+1], pOut, aReplace);
drhd0960592015-08-17 21:22:32 +0000476 }
drh505ad2c2015-08-21 17:33:11 +0000477 j += 1 + jsonNodeSize(&pNode[j+1]);
drh301eecc2015-08-17 20:14:19 +0000478 }
drh52216ad2015-08-18 02:28:03 +0000479 if( (pNode->jnFlags & JNODE_APPEND)==0 ) break;
480 pNode = &pNode[pNode->u.iAppend];
481 j = 1;
drh5634cc02015-08-17 11:28:03 +0000482 }
483 jsonAppendChar(pOut, '}');
484 break;
485 }
drhbd0621b2015-08-13 13:54:59 +0000486 }
drh5634cc02015-08-17 11:28:03 +0000487}
488
489/*
drhf2df7e72015-08-28 20:07:40 +0000490** Return a JsonNode and all its descendents as a JSON string.
491*/
492static void jsonReturnJson(
493 JsonNode *pNode, /* Node to return */
494 sqlite3_context *pCtx, /* Return value for this function */
495 sqlite3_value **aReplace /* Array of replacement values */
496){
497 JsonString s;
498 jsonInit(&s, pCtx);
499 jsonRenderNode(pNode, &s, aReplace);
500 jsonResult(&s);
drhf5ddb9c2015-09-11 00:06:41 +0000501 sqlite3_result_subtype(pCtx, JSON_SUBTYPE);
drhf2df7e72015-08-28 20:07:40 +0000502}
503
504/*
drh5634cc02015-08-17 11:28:03 +0000505** Make the JsonNode the return value of the function.
506*/
drhd0960592015-08-17 21:22:32 +0000507static void jsonReturn(
508 JsonNode *pNode, /* Node to return */
509 sqlite3_context *pCtx, /* Return value for this function */
510 sqlite3_value **aReplace /* Array of replacement values */
511){
drh5634cc02015-08-17 11:28:03 +0000512 switch( pNode->eType ){
drha8f39a92015-09-21 22:53:16 +0000513 default: {
514 assert( pNode->eType==JSON_NULL );
drh5634cc02015-08-17 11:28:03 +0000515 sqlite3_result_null(pCtx);
516 break;
517 }
518 case JSON_TRUE: {
519 sqlite3_result_int(pCtx, 1);
520 break;
521 }
522 case JSON_FALSE: {
523 sqlite3_result_int(pCtx, 0);
524 break;
525 }
drh987eb1f2015-08-17 15:17:37 +0000526 case JSON_INT: {
527 sqlite3_int64 i = 0;
drh52216ad2015-08-18 02:28:03 +0000528 const char *z = pNode->u.zJContent;
drh987eb1f2015-08-17 15:17:37 +0000529 if( z[0]=='-' ){ z++; }
drh8deb4b82015-10-09 18:21:43 +0000530 while( z[0]>='0' && z[0]<='9' ){
531 unsigned v = *(z++) - '0';
532 if( i>=LARGEST_INT64/10 ){
drha0882fa2015-10-09 20:40:44 +0000533 if( i>LARGEST_INT64/10 ) goto int_as_real;
drh8deb4b82015-10-09 18:21:43 +0000534 if( z[0]>='0' && z[0]<='9' ) goto int_as_real;
535 if( v==9 ) goto int_as_real;
536 if( v==8 ){
537 if( pNode->u.zJContent[0]=='-' ){
538 sqlite3_result_int64(pCtx, SMALLEST_INT64);
539 goto int_done;
540 }else{
541 goto int_as_real;
542 }
543 }
544 }
545 i = i*10 + v;
546 }
drh52216ad2015-08-18 02:28:03 +0000547 if( pNode->u.zJContent[0]=='-' ){ i = -i; }
drh987eb1f2015-08-17 15:17:37 +0000548 sqlite3_result_int64(pCtx, i);
drh8deb4b82015-10-09 18:21:43 +0000549 int_done:
550 break;
551 int_as_real: /* fall through to real */;
552 }
553 case JSON_REAL: {
drh49472652015-10-16 15:35:39 +0000554 double r;
555#ifdef SQLITE_AMALGAMATION
556 const char *z = pNode->u.zJContent;
557 sqlite3AtoF(z, &r, sqlite3Strlen30(z), SQLITE_UTF8);
558#else
559 r = strtod(pNode->u.zJContent, 0);
560#endif
drh8deb4b82015-10-09 18:21:43 +0000561 sqlite3_result_double(pCtx, r);
drh987eb1f2015-08-17 15:17:37 +0000562 break;
563 }
drh5634cc02015-08-17 11:28:03 +0000564 case JSON_STRING: {
drha8f39a92015-09-21 22:53:16 +0000565#if 0 /* Never happens because JNODE_RAW is only set by json_set(),
566 ** json_insert() and json_replace() and those routines do not
567 ** call jsonReturn() */
drh301eecc2015-08-17 20:14:19 +0000568 if( pNode->jnFlags & JNODE_RAW ){
drh52216ad2015-08-18 02:28:03 +0000569 sqlite3_result_text(pCtx, pNode->u.zJContent, pNode->n,
570 SQLITE_TRANSIENT);
drha8f39a92015-09-21 22:53:16 +0000571 }else
572#endif
573 assert( (pNode->jnFlags & JNODE_RAW)==0 );
574 if( (pNode->jnFlags & JNODE_ESCAPE)==0 ){
drh987eb1f2015-08-17 15:17:37 +0000575 /* JSON formatted without any backslash-escapes */
drh52216ad2015-08-18 02:28:03 +0000576 sqlite3_result_text(pCtx, pNode->u.zJContent+1, pNode->n-2,
drh987eb1f2015-08-17 15:17:37 +0000577 SQLITE_TRANSIENT);
drh5634cc02015-08-17 11:28:03 +0000578 }else{
579 /* Translate JSON formatted string into raw text */
drh987eb1f2015-08-17 15:17:37 +0000580 u32 i;
581 u32 n = pNode->n;
drh52216ad2015-08-18 02:28:03 +0000582 const char *z = pNode->u.zJContent;
drh987eb1f2015-08-17 15:17:37 +0000583 char *zOut;
584 u32 j;
585 zOut = sqlite3_malloc( n+1 );
586 if( zOut==0 ){
587 sqlite3_result_error_nomem(pCtx);
588 break;
589 }
590 for(i=1, j=0; i<n-1; i++){
591 char c = z[i];
drh80d87402015-08-24 12:42:41 +0000592 if( c!='\\' ){
drh987eb1f2015-08-17 15:17:37 +0000593 zOut[j++] = c;
594 }else{
595 c = z[++i];
drh80d87402015-08-24 12:42:41 +0000596 if( c=='u' ){
drh987eb1f2015-08-17 15:17:37 +0000597 u32 v = 0, k;
drh27b2d1b2016-11-07 15:15:42 +0000598 for(k=0; k<4; i++, k++){
599 assert( i<n-2 );
drh8784eca2015-08-23 02:42:30 +0000600 c = z[i+1];
drh27b2d1b2016-11-07 15:15:42 +0000601 assert( safe_isxdigit(c) );
602 if( c<='9' ) v = v*16 + c - '0';
603 else if( c<='F' ) v = v*16 + c - 'A' + 10;
604 else v = v*16 + c - 'a' + 10;
drh987eb1f2015-08-17 15:17:37 +0000605 }
drh80d87402015-08-24 12:42:41 +0000606 if( v==0 ) break;
drh987eb1f2015-08-17 15:17:37 +0000607 if( v<=0x7f ){
mistachkin16a93122015-09-11 18:05:01 +0000608 zOut[j++] = (char)v;
drh987eb1f2015-08-17 15:17:37 +0000609 }else if( v<=0x7ff ){
mistachkin16a93122015-09-11 18:05:01 +0000610 zOut[j++] = (char)(0xc0 | (v>>6));
drh987eb1f2015-08-17 15:17:37 +0000611 zOut[j++] = 0x80 | (v&0x3f);
drh80d87402015-08-24 12:42:41 +0000612 }else{
mistachkin16a93122015-09-11 18:05:01 +0000613 zOut[j++] = (char)(0xe0 | (v>>12));
drh987eb1f2015-08-17 15:17:37 +0000614 zOut[j++] = 0x80 | ((v>>6)&0x3f);
615 zOut[j++] = 0x80 | (v&0x3f);
drh987eb1f2015-08-17 15:17:37 +0000616 }
617 }else{
618 if( c=='b' ){
619 c = '\b';
620 }else if( c=='f' ){
621 c = '\f';
622 }else if( c=='n' ){
623 c = '\n';
624 }else if( c=='r' ){
625 c = '\r';
626 }else if( c=='t' ){
627 c = '\t';
628 }
629 zOut[j++] = c;
630 }
631 }
632 }
633 zOut[j] = 0;
634 sqlite3_result_text(pCtx, zOut, j, sqlite3_free);
drh5634cc02015-08-17 11:28:03 +0000635 }
636 break;
637 }
638 case JSON_ARRAY:
639 case JSON_OBJECT: {
drhf2df7e72015-08-28 20:07:40 +0000640 jsonReturnJson(pNode, pCtx, aReplace);
drh5634cc02015-08-17 11:28:03 +0000641 break;
642 }
643 }
drhbd0621b2015-08-13 13:54:59 +0000644}
645
drh95677942015-09-24 01:06:37 +0000646/* Forward reference */
647static int jsonParseAddNode(JsonParse*,u32,u32,const char*);
648
649/*
650** A macro to hint to the compiler that a function should not be
651** inlined.
652*/
653#if defined(__GNUC__)
654# define JSON_NOINLINE __attribute__((noinline))
655#elif defined(_MSC_VER) && _MSC_VER>=1310
656# define JSON_NOINLINE __declspec(noinline)
657#else
658# define JSON_NOINLINE
659#endif
660
661
662static JSON_NOINLINE int jsonParseAddNodeExpand(
663 JsonParse *pParse, /* Append the node to this object */
664 u32 eType, /* Node type */
665 u32 n, /* Content size or sub-node count */
666 const char *zContent /* Content */
667){
668 u32 nNew;
669 JsonNode *pNew;
670 assert( pParse->nNode>=pParse->nAlloc );
671 if( pParse->oom ) return -1;
672 nNew = pParse->nAlloc*2 + 10;
673 pNew = sqlite3_realloc(pParse->aNode, sizeof(JsonNode)*nNew);
674 if( pNew==0 ){
675 pParse->oom = 1;
676 return -1;
677 }
678 pParse->nAlloc = nNew;
679 pParse->aNode = pNew;
680 assert( pParse->nNode<pParse->nAlloc );
681 return jsonParseAddNode(pParse, eType, n, zContent);
682}
683
drh5fa5c102015-08-12 16:49:40 +0000684/*
drhe9c37f32015-08-15 21:25:36 +0000685** Create a new JsonNode instance based on the arguments and append that
686** instance to the JsonParse. Return the index in pParse->aNode[] of the
687** new node, or -1 if a memory allocation fails.
688*/
689static int jsonParseAddNode(
690 JsonParse *pParse, /* Append the node to this object */
691 u32 eType, /* Node type */
692 u32 n, /* Content size or sub-node count */
693 const char *zContent /* Content */
694){
695 JsonNode *p;
696 if( pParse->nNode>=pParse->nAlloc ){
drh95677942015-09-24 01:06:37 +0000697 return jsonParseAddNodeExpand(pParse, eType, n, zContent);
drhe9c37f32015-08-15 21:25:36 +0000698 }
699 p = &pParse->aNode[pParse->nNode];
drh5634cc02015-08-17 11:28:03 +0000700 p->eType = (u8)eType;
drh301eecc2015-08-17 20:14:19 +0000701 p->jnFlags = 0;
drhe9c37f32015-08-15 21:25:36 +0000702 p->n = n;
drh52216ad2015-08-18 02:28:03 +0000703 p->u.zJContent = zContent;
drhe9c37f32015-08-15 21:25:36 +0000704 return pParse->nNode++;
705}
706
707/*
drhad875e72016-11-07 13:37:28 +0000708** Return true if z[] begins with 4 (or more) hexadecimal digits
709*/
710static int jsonIs4Hex(const char *z){
711 int i;
712 for(i=0; i<4; i++) if( !safe_isxdigit(z[i]) ) return 0;
713 return 1;
714}
715
716/*
drhe9c37f32015-08-15 21:25:36 +0000717** Parse a single JSON value which begins at pParse->zJson[i]. Return the
718** index of the first character past the end of the value parsed.
719**
720** Return negative for a syntax error. Special cases: return -2 if the
721** first non-whitespace character is '}' and return -3 if the first
722** non-whitespace character is ']'.
723*/
724static int jsonParseValue(JsonParse *pParse, u32 i){
725 char c;
726 u32 j;
drhbc8f0922015-08-22 19:39:04 +0000727 int iThis;
drhe9c37f32015-08-15 21:25:36 +0000728 int x;
drh852944e2015-09-10 03:29:11 +0000729 JsonNode *pNode;
drh9fa866a2017-04-08 18:18:22 +0000730 const char *z = pParse->zJson;
731 while( safe_isspace(z[i]) ){ i++; }
732 if( (c = z[i])=='{' ){
drhe9c37f32015-08-15 21:25:36 +0000733 /* Parse object */
734 iThis = jsonParseAddNode(pParse, JSON_OBJECT, 0, 0);
drhbc8f0922015-08-22 19:39:04 +0000735 if( iThis<0 ) return -1;
drhe9c37f32015-08-15 21:25:36 +0000736 for(j=i+1;;j++){
drh9fa866a2017-04-08 18:18:22 +0000737 while( safe_isspace(z[j]) ){ j++; }
drhe9c37f32015-08-15 21:25:36 +0000738 x = jsonParseValue(pParse, j);
739 if( x<0 ){
drhf27cd1f2015-09-23 01:10:29 +0000740 if( x==(-2) && pParse->nNode==(u32)iThis+1 ) return j+1;
drhe9c37f32015-08-15 21:25:36 +0000741 return -1;
742 }
drhbe9474e2015-08-22 03:05:54 +0000743 if( pParse->oom ) return -1;
drh852944e2015-09-10 03:29:11 +0000744 pNode = &pParse->aNode[pParse->nNode-1];
745 if( pNode->eType!=JSON_STRING ) return -1;
746 pNode->jnFlags |= JNODE_LABEL;
drhe9c37f32015-08-15 21:25:36 +0000747 j = x;
drh9fa866a2017-04-08 18:18:22 +0000748 while( safe_isspace(z[j]) ){ j++; }
749 if( z[j]!=':' ) return -1;
drhe9c37f32015-08-15 21:25:36 +0000750 j++;
751 x = jsonParseValue(pParse, j);
752 if( x<0 ) return -1;
753 j = x;
drh9fa866a2017-04-08 18:18:22 +0000754 while( safe_isspace(z[j]) ){ j++; }
755 c = z[j];
drhe9c37f32015-08-15 21:25:36 +0000756 if( c==',' ) continue;
757 if( c!='}' ) return -1;
758 break;
759 }
drhbc8f0922015-08-22 19:39:04 +0000760 pParse->aNode[iThis].n = pParse->nNode - (u32)iThis - 1;
drhe9c37f32015-08-15 21:25:36 +0000761 return j+1;
762 }else if( c=='[' ){
763 /* Parse array */
764 iThis = jsonParseAddNode(pParse, JSON_ARRAY, 0, 0);
drhbc8f0922015-08-22 19:39:04 +0000765 if( iThis<0 ) return -1;
drhe9c37f32015-08-15 21:25:36 +0000766 for(j=i+1;;j++){
drh9fa866a2017-04-08 18:18:22 +0000767 while( safe_isspace(z[j]) ){ j++; }
drhe9c37f32015-08-15 21:25:36 +0000768 x = jsonParseValue(pParse, j);
769 if( x<0 ){
drhf27cd1f2015-09-23 01:10:29 +0000770 if( x==(-3) && pParse->nNode==(u32)iThis+1 ) return j+1;
drhe9c37f32015-08-15 21:25:36 +0000771 return -1;
772 }
773 j = x;
drh9fa866a2017-04-08 18:18:22 +0000774 while( safe_isspace(z[j]) ){ j++; }
775 c = z[j];
drhe9c37f32015-08-15 21:25:36 +0000776 if( c==',' ) continue;
777 if( c!=']' ) return -1;
778 break;
779 }
drhbc8f0922015-08-22 19:39:04 +0000780 pParse->aNode[iThis].n = pParse->nNode - (u32)iThis - 1;
drhe9c37f32015-08-15 21:25:36 +0000781 return j+1;
782 }else if( c=='"' ){
783 /* Parse string */
drh301eecc2015-08-17 20:14:19 +0000784 u8 jnFlags = 0;
drhe9c37f32015-08-15 21:25:36 +0000785 j = i+1;
786 for(;;){
drh9fa866a2017-04-08 18:18:22 +0000787 c = z[j];
drhe9c37f32015-08-15 21:25:36 +0000788 if( c==0 ) return -1;
789 if( c=='\\' ){
drh9fa866a2017-04-08 18:18:22 +0000790 c = z[++j];
drhad875e72016-11-07 13:37:28 +0000791 if( c=='"' || c=='\\' || c=='/' || c=='b' || c=='f'
792 || c=='n' || c=='r' || c=='t'
drh9fa866a2017-04-08 18:18:22 +0000793 || (c=='u' && jsonIs4Hex(z+j+1)) ){
drhad875e72016-11-07 13:37:28 +0000794 jnFlags = JNODE_ESCAPE;
795 }else{
796 return -1;
797 }
drhe9c37f32015-08-15 21:25:36 +0000798 }else if( c=='"' ){
799 break;
800 }
801 j++;
802 }
drh9fa866a2017-04-08 18:18:22 +0000803 jsonParseAddNode(pParse, JSON_STRING, j+1-i, &z[i]);
drhbe9474e2015-08-22 03:05:54 +0000804 if( !pParse->oom ) pParse->aNode[pParse->nNode-1].jnFlags = jnFlags;
drhe9c37f32015-08-15 21:25:36 +0000805 return j+1;
806 }else if( c=='n'
drh9fa866a2017-04-08 18:18:22 +0000807 && strncmp(z+i,"null",4)==0
808 && !safe_isalnum(z[i+4]) ){
drhe9c37f32015-08-15 21:25:36 +0000809 jsonParseAddNode(pParse, JSON_NULL, 0, 0);
810 return i+4;
811 }else if( c=='t'
drh9fa866a2017-04-08 18:18:22 +0000812 && strncmp(z+i,"true",4)==0
813 && !safe_isalnum(z[i+4]) ){
drhe9c37f32015-08-15 21:25:36 +0000814 jsonParseAddNode(pParse, JSON_TRUE, 0, 0);
815 return i+4;
816 }else if( c=='f'
drh9fa866a2017-04-08 18:18:22 +0000817 && strncmp(z+i,"false",5)==0
818 && !safe_isalnum(z[i+5]) ){
drhe9c37f32015-08-15 21:25:36 +0000819 jsonParseAddNode(pParse, JSON_FALSE, 0, 0);
820 return i+5;
821 }else if( c=='-' || (c>='0' && c<='9') ){
822 /* Parse number */
823 u8 seenDP = 0;
824 u8 seenE = 0;
drh9fa866a2017-04-08 18:18:22 +0000825 assert( '-' < '0' );
826 if( c<='0' ){
827 j = c=='-' ? i+1 : i;
828 if( z[j]=='0' && z[j+1]>='0' && z[j+1]<='9' ) return -1;
829 }
drhe9c37f32015-08-15 21:25:36 +0000830 j = i+1;
831 for(;; j++){
drh9fa866a2017-04-08 18:18:22 +0000832 c = z[j];
drhe9c37f32015-08-15 21:25:36 +0000833 if( c>='0' && c<='9' ) continue;
834 if( c=='.' ){
drh9fa866a2017-04-08 18:18:22 +0000835 if( z[j-1]=='-' ) return -1;
drhe9c37f32015-08-15 21:25:36 +0000836 if( seenDP ) return -1;
837 seenDP = 1;
838 continue;
839 }
840 if( c=='e' || c=='E' ){
drh9fa866a2017-04-08 18:18:22 +0000841 if( z[j-1]<'0' ) return -1;
drhe9c37f32015-08-15 21:25:36 +0000842 if( seenE ) return -1;
843 seenDP = seenE = 1;
drh9fa866a2017-04-08 18:18:22 +0000844 c = z[j+1];
drh8784eca2015-08-23 02:42:30 +0000845 if( c=='+' || c=='-' ){
846 j++;
drh9fa866a2017-04-08 18:18:22 +0000847 c = z[j+1];
drh8784eca2015-08-23 02:42:30 +0000848 }
drhd1f00682015-08-29 16:02:37 +0000849 if( c<'0' || c>'9' ) return -1;
drhe9c37f32015-08-15 21:25:36 +0000850 continue;
851 }
852 break;
853 }
drh9fa866a2017-04-08 18:18:22 +0000854 if( z[j-1]<'0' ) return -1;
drhe9c37f32015-08-15 21:25:36 +0000855 jsonParseAddNode(pParse, seenDP ? JSON_REAL : JSON_INT,
drh9fa866a2017-04-08 18:18:22 +0000856 j - i, &z[i]);
drhe9c37f32015-08-15 21:25:36 +0000857 return j;
858 }else if( c=='}' ){
859 return -2; /* End of {...} */
860 }else if( c==']' ){
861 return -3; /* End of [...] */
drh8cb15cc2015-09-24 01:40:45 +0000862 }else if( c==0 ){
863 return 0; /* End of file */
drhe9c37f32015-08-15 21:25:36 +0000864 }else{
865 return -1; /* Syntax error */
866 }
867}
868
869/*
870** Parse a complete JSON string. Return 0 on success or non-zero if there
871** are any errors. If an error occurs, free all memory associated with
872** pParse.
873**
874** pParse is uninitialized when this routine is called.
875*/
drhbc8f0922015-08-22 19:39:04 +0000876static int jsonParse(
877 JsonParse *pParse, /* Initialize and fill this JsonParse object */
878 sqlite3_context *pCtx, /* Report errors here */
879 const char *zJson /* Input JSON text to be parsed */
880){
drhe9c37f32015-08-15 21:25:36 +0000881 int i;
drhe9c37f32015-08-15 21:25:36 +0000882 memset(pParse, 0, sizeof(*pParse));
drhc3722b22015-08-23 20:44:59 +0000883 if( zJson==0 ) return 1;
drhe9c37f32015-08-15 21:25:36 +0000884 pParse->zJson = zJson;
885 i = jsonParseValue(pParse, 0);
drhc3722b22015-08-23 20:44:59 +0000886 if( pParse->oom ) i = -1;
drhe9c37f32015-08-15 21:25:36 +0000887 if( i>0 ){
dan2e8f5512015-09-17 17:21:09 +0000888 while( safe_isspace(zJson[i]) ) i++;
drhe9c37f32015-08-15 21:25:36 +0000889 if( zJson[i] ) i = -1;
890 }
drhd1f00682015-08-29 16:02:37 +0000891 if( i<=0 ){
drhf2df7e72015-08-28 20:07:40 +0000892 if( pCtx!=0 ){
893 if( pParse->oom ){
894 sqlite3_result_error_nomem(pCtx);
895 }else{
896 sqlite3_result_error(pCtx, "malformed JSON", -1);
897 }
898 }
drh505ad2c2015-08-21 17:33:11 +0000899 jsonParseReset(pParse);
drhe9c37f32015-08-15 21:25:36 +0000900 return 1;
901 }
902 return 0;
903}
drh301eecc2015-08-17 20:14:19 +0000904
drh505ad2c2015-08-21 17:33:11 +0000905/* Mark node i of pParse as being a child of iParent. Call recursively
906** to fill in all the descendants of node i.
907*/
908static void jsonParseFillInParentage(JsonParse *pParse, u32 i, u32 iParent){
909 JsonNode *pNode = &pParse->aNode[i];
910 u32 j;
911 pParse->aUp[i] = iParent;
912 switch( pNode->eType ){
913 case JSON_ARRAY: {
914 for(j=1; j<=pNode->n; j += jsonNodeSize(pNode+j)){
915 jsonParseFillInParentage(pParse, i+j, i);
916 }
917 break;
918 }
919 case JSON_OBJECT: {
920 for(j=1; j<=pNode->n; j += jsonNodeSize(pNode+j+1)+1){
921 pParse->aUp[i+j] = i;
922 jsonParseFillInParentage(pParse, i+j+1, i);
923 }
924 break;
925 }
926 default: {
927 break;
928 }
929 }
930}
931
932/*
933** Compute the parentage of all nodes in a completed parse.
934*/
935static int jsonParseFindParents(JsonParse *pParse){
936 u32 *aUp;
937 assert( pParse->aUp==0 );
938 aUp = pParse->aUp = sqlite3_malloc( sizeof(u32)*pParse->nNode );
drhc3722b22015-08-23 20:44:59 +0000939 if( aUp==0 ){
940 pParse->oom = 1;
941 return SQLITE_NOMEM;
942 }
drh505ad2c2015-08-21 17:33:11 +0000943 jsonParseFillInParentage(pParse, 0, 0);
944 return SQLITE_OK;
945}
946
drh8cb0c832015-09-22 00:21:03 +0000947/*
948** Compare the OBJECT label at pNode against zKey,nKey. Return true on
949** a match.
950*/
mistachkinf2c26ed2015-10-12 22:20:29 +0000951static int jsonLabelCompare(JsonNode *pNode, const char *zKey, u32 nKey){
drh8cb0c832015-09-22 00:21:03 +0000952 if( pNode->jnFlags & JNODE_RAW ){
953 if( pNode->n!=nKey ) return 0;
954 return strncmp(pNode->u.zJContent, zKey, nKey)==0;
955 }else{
956 if( pNode->n!=nKey+2 ) return 0;
957 return strncmp(pNode->u.zJContent+1, zKey, nKey)==0;
958 }
959}
960
drh52216ad2015-08-18 02:28:03 +0000961/* forward declaration */
drha7714022015-08-29 00:54:49 +0000962static JsonNode *jsonLookupAppend(JsonParse*,const char*,int*,const char**);
drh52216ad2015-08-18 02:28:03 +0000963
drh987eb1f2015-08-17 15:17:37 +0000964/*
965** Search along zPath to find the node specified. Return a pointer
966** to that node, or NULL if zPath is malformed or if there is no such
967** node.
drh52216ad2015-08-18 02:28:03 +0000968**
969** If pApnd!=0, then try to append new nodes to complete zPath if it is
970** possible to do so and if no existing node corresponds to zPath. If
971** new nodes are appended *pApnd is set to 1.
drh987eb1f2015-08-17 15:17:37 +0000972*/
drha7714022015-08-29 00:54:49 +0000973static JsonNode *jsonLookupStep(
drh52216ad2015-08-18 02:28:03 +0000974 JsonParse *pParse, /* The JSON to search */
975 u32 iRoot, /* Begin the search at this node */
976 const char *zPath, /* The path to search */
drha7714022015-08-29 00:54:49 +0000977 int *pApnd, /* Append nodes to complete path if not NULL */
978 const char **pzErr /* Make *pzErr point to any syntax error in zPath */
drh52216ad2015-08-18 02:28:03 +0000979){
drhbc8f0922015-08-22 19:39:04 +0000980 u32 i, j, nKey;
drh6b43cc82015-08-19 23:02:49 +0000981 const char *zKey;
drh52216ad2015-08-18 02:28:03 +0000982 JsonNode *pRoot = &pParse->aNode[iRoot];
drh987eb1f2015-08-17 15:17:37 +0000983 if( zPath[0]==0 ) return pRoot;
984 if( zPath[0]=='.' ){
985 if( pRoot->eType!=JSON_OBJECT ) return 0;
986 zPath++;
drh6b43cc82015-08-19 23:02:49 +0000987 if( zPath[0]=='"' ){
988 zKey = zPath + 1;
989 for(i=1; zPath[i] && zPath[i]!='"'; i++){}
990 nKey = i-1;
drha8f39a92015-09-21 22:53:16 +0000991 if( zPath[i] ){
992 i++;
993 }else{
994 *pzErr = zPath;
995 return 0;
996 }
drh6b43cc82015-08-19 23:02:49 +0000997 }else{
998 zKey = zPath;
999 for(i=0; zPath[i] && zPath[i]!='.' && zPath[i]!='['; i++){}
1000 nKey = i;
1001 }
drha7714022015-08-29 00:54:49 +00001002 if( nKey==0 ){
1003 *pzErr = zPath;
1004 return 0;
1005 }
drh987eb1f2015-08-17 15:17:37 +00001006 j = 1;
drh52216ad2015-08-18 02:28:03 +00001007 for(;;){
1008 while( j<=pRoot->n ){
drh8cb0c832015-09-22 00:21:03 +00001009 if( jsonLabelCompare(pRoot+j, zKey, nKey) ){
drha7714022015-08-29 00:54:49 +00001010 return jsonLookupStep(pParse, iRoot+j+1, &zPath[i], pApnd, pzErr);
drh52216ad2015-08-18 02:28:03 +00001011 }
1012 j++;
drh505ad2c2015-08-21 17:33:11 +00001013 j += jsonNodeSize(&pRoot[j]);
drh987eb1f2015-08-17 15:17:37 +00001014 }
drh52216ad2015-08-18 02:28:03 +00001015 if( (pRoot->jnFlags & JNODE_APPEND)==0 ) break;
1016 iRoot += pRoot->u.iAppend;
1017 pRoot = &pParse->aNode[iRoot];
1018 j = 1;
1019 }
1020 if( pApnd ){
drhbc8f0922015-08-22 19:39:04 +00001021 u32 iStart, iLabel;
1022 JsonNode *pNode;
1023 iStart = jsonParseAddNode(pParse, JSON_OBJECT, 2, 0);
1024 iLabel = jsonParseAddNode(pParse, JSON_STRING, i, zPath);
drh52216ad2015-08-18 02:28:03 +00001025 zPath += i;
drha7714022015-08-29 00:54:49 +00001026 pNode = jsonLookupAppend(pParse, zPath, pApnd, pzErr);
drhbc8f0922015-08-22 19:39:04 +00001027 if( pParse->oom ) return 0;
1028 if( pNode ){
1029 pRoot = &pParse->aNode[iRoot];
1030 pRoot->u.iAppend = iStart - iRoot;
1031 pRoot->jnFlags |= JNODE_APPEND;
1032 pParse->aNode[iLabel].jnFlags |= JNODE_RAW;
1033 }
1034 return pNode;
drh987eb1f2015-08-17 15:17:37 +00001035 }
dan2e8f5512015-09-17 17:21:09 +00001036 }else if( zPath[0]=='[' && safe_isdigit(zPath[1]) ){
drh987eb1f2015-08-17 15:17:37 +00001037 if( pRoot->eType!=JSON_ARRAY ) return 0;
1038 i = 0;
drh3d1d2a92015-09-22 01:15:49 +00001039 j = 1;
1040 while( safe_isdigit(zPath[j]) ){
1041 i = i*10 + zPath[j] - '0';
1042 j++;
drh987eb1f2015-08-17 15:17:37 +00001043 }
drh3d1d2a92015-09-22 01:15:49 +00001044 if( zPath[j]!=']' ){
drha7714022015-08-29 00:54:49 +00001045 *pzErr = zPath;
1046 return 0;
1047 }
drh3d1d2a92015-09-22 01:15:49 +00001048 zPath += j + 1;
drh987eb1f2015-08-17 15:17:37 +00001049 j = 1;
drh52216ad2015-08-18 02:28:03 +00001050 for(;;){
drhbc8f0922015-08-22 19:39:04 +00001051 while( j<=pRoot->n && (i>0 || (pRoot[j].jnFlags & JNODE_REMOVE)!=0) ){
1052 if( (pRoot[j].jnFlags & JNODE_REMOVE)==0 ) i--;
drh505ad2c2015-08-21 17:33:11 +00001053 j += jsonNodeSize(&pRoot[j]);
drh52216ad2015-08-18 02:28:03 +00001054 }
1055 if( (pRoot->jnFlags & JNODE_APPEND)==0 ) break;
1056 iRoot += pRoot->u.iAppend;
1057 pRoot = &pParse->aNode[iRoot];
1058 j = 1;
drh987eb1f2015-08-17 15:17:37 +00001059 }
1060 if( j<=pRoot->n ){
drha7714022015-08-29 00:54:49 +00001061 return jsonLookupStep(pParse, iRoot+j, zPath, pApnd, pzErr);
drh52216ad2015-08-18 02:28:03 +00001062 }
1063 if( i==0 && pApnd ){
drhbc8f0922015-08-22 19:39:04 +00001064 u32 iStart;
1065 JsonNode *pNode;
1066 iStart = jsonParseAddNode(pParse, JSON_ARRAY, 1, 0);
drha7714022015-08-29 00:54:49 +00001067 pNode = jsonLookupAppend(pParse, zPath, pApnd, pzErr);
drhbc8f0922015-08-22 19:39:04 +00001068 if( pParse->oom ) return 0;
1069 if( pNode ){
1070 pRoot = &pParse->aNode[iRoot];
1071 pRoot->u.iAppend = iStart - iRoot;
1072 pRoot->jnFlags |= JNODE_APPEND;
1073 }
1074 return pNode;
drh987eb1f2015-08-17 15:17:37 +00001075 }
drh3d1d2a92015-09-22 01:15:49 +00001076 }else{
drha7714022015-08-29 00:54:49 +00001077 *pzErr = zPath;
drh987eb1f2015-08-17 15:17:37 +00001078 }
1079 return 0;
1080}
1081
drh52216ad2015-08-18 02:28:03 +00001082/*
drhbc8f0922015-08-22 19:39:04 +00001083** Append content to pParse that will complete zPath. Return a pointer
1084** to the inserted node, or return NULL if the append fails.
drh52216ad2015-08-18 02:28:03 +00001085*/
1086static JsonNode *jsonLookupAppend(
1087 JsonParse *pParse, /* Append content to the JSON parse */
1088 const char *zPath, /* Description of content to append */
drha7714022015-08-29 00:54:49 +00001089 int *pApnd, /* Set this flag to 1 */
1090 const char **pzErr /* Make this point to any syntax error */
drh52216ad2015-08-18 02:28:03 +00001091){
1092 *pApnd = 1;
1093 if( zPath[0]==0 ){
1094 jsonParseAddNode(pParse, JSON_NULL, 0, 0);
1095 return pParse->oom ? 0 : &pParse->aNode[pParse->nNode-1];
1096 }
1097 if( zPath[0]=='.' ){
1098 jsonParseAddNode(pParse, JSON_OBJECT, 0, 0);
1099 }else if( strncmp(zPath,"[0]",3)==0 ){
1100 jsonParseAddNode(pParse, JSON_ARRAY, 0, 0);
1101 }else{
1102 return 0;
1103 }
1104 if( pParse->oom ) return 0;
drha7714022015-08-29 00:54:49 +00001105 return jsonLookupStep(pParse, pParse->nNode-1, zPath, pApnd, pzErr);
drh52216ad2015-08-18 02:28:03 +00001106}
1107
drhbc8f0922015-08-22 19:39:04 +00001108/*
drha7714022015-08-29 00:54:49 +00001109** Return the text of a syntax error message on a JSON path. Space is
1110** obtained from sqlite3_malloc().
1111*/
1112static char *jsonPathSyntaxError(const char *zErr){
1113 return sqlite3_mprintf("JSON path error near '%q'", zErr);
1114}
1115
1116/*
1117** Do a node lookup using zPath. Return a pointer to the node on success.
1118** Return NULL if not found or if there is an error.
1119**
1120** On an error, write an error message into pCtx and increment the
1121** pParse->nErr counter.
1122**
1123** If pApnd!=NULL then try to append missing nodes and set *pApnd = 1 if
1124** nodes are appended.
drha7714022015-08-29 00:54:49 +00001125*/
1126static JsonNode *jsonLookup(
1127 JsonParse *pParse, /* The JSON to search */
1128 const char *zPath, /* The path to search */
1129 int *pApnd, /* Append nodes to complete path if not NULL */
drhf5ddb9c2015-09-11 00:06:41 +00001130 sqlite3_context *pCtx /* Report errors here, if not NULL */
drha7714022015-08-29 00:54:49 +00001131){
1132 const char *zErr = 0;
1133 JsonNode *pNode = 0;
drha8f39a92015-09-21 22:53:16 +00001134 char *zMsg;
drha7714022015-08-29 00:54:49 +00001135
1136 if( zPath==0 ) return 0;
1137 if( zPath[0]!='$' ){
1138 zErr = zPath;
1139 goto lookup_err;
1140 }
1141 zPath++;
drha7714022015-08-29 00:54:49 +00001142 pNode = jsonLookupStep(pParse, 0, zPath, pApnd, &zErr);
drha8f39a92015-09-21 22:53:16 +00001143 if( zErr==0 ) return pNode;
drha7714022015-08-29 00:54:49 +00001144
1145lookup_err:
1146 pParse->nErr++;
drha8f39a92015-09-21 22:53:16 +00001147 assert( zErr!=0 && pCtx!=0 );
1148 zMsg = jsonPathSyntaxError(zErr);
1149 if( zMsg ){
1150 sqlite3_result_error(pCtx, zMsg, -1);
1151 sqlite3_free(zMsg);
1152 }else{
1153 sqlite3_result_error_nomem(pCtx);
drha7714022015-08-29 00:54:49 +00001154 }
drha7714022015-08-29 00:54:49 +00001155 return 0;
1156}
1157
1158
1159/*
drhbc8f0922015-08-22 19:39:04 +00001160** Report the wrong number of arguments for json_insert(), json_replace()
1161** or json_set().
1162*/
1163static void jsonWrongNumArgs(
1164 sqlite3_context *pCtx,
1165 const char *zFuncName
1166){
1167 char *zMsg = sqlite3_mprintf("json_%s() needs an odd number of arguments",
1168 zFuncName);
1169 sqlite3_result_error(pCtx, zMsg, -1);
1170 sqlite3_free(zMsg);
1171}
drh52216ad2015-08-18 02:28:03 +00001172
drh29c99692017-03-24 12:35:17 +00001173/*
1174** Mark all NULL entries in the Object passed in as JNODE_REMOVE.
1175*/
1176static void jsonRemoveAllNulls(JsonNode *pNode){
1177 int i, n;
1178 assert( pNode->eType==JSON_OBJECT );
1179 n = pNode->n;
1180 for(i=2; i<=n; i += jsonNodeSize(&pNode[i])+1){
1181 switch( pNode[i].eType ){
1182 case JSON_NULL:
1183 pNode[i].jnFlags |= JNODE_REMOVE;
1184 break;
1185 case JSON_OBJECT:
1186 jsonRemoveAllNulls(&pNode[i]);
1187 break;
1188 }
1189 }
1190}
1191
drha7714022015-08-29 00:54:49 +00001192
drh987eb1f2015-08-17 15:17:37 +00001193/****************************************************************************
1194** SQL functions used for testing and debugging
1195****************************************************************************/
drhe9c37f32015-08-15 21:25:36 +00001196
drh301eecc2015-08-17 20:14:19 +00001197#ifdef SQLITE_DEBUG
drhe9c37f32015-08-15 21:25:36 +00001198/*
drh5634cc02015-08-17 11:28:03 +00001199** The json_parse(JSON) function returns a string which describes
drhe9c37f32015-08-15 21:25:36 +00001200** a parse of the JSON provided. Or it returns NULL if JSON is not
1201** well-formed.
1202*/
drh5634cc02015-08-17 11:28:03 +00001203static void jsonParseFunc(
drhbc8f0922015-08-22 19:39:04 +00001204 sqlite3_context *ctx,
drhe9c37f32015-08-15 21:25:36 +00001205 int argc,
1206 sqlite3_value **argv
1207){
drh505ad2c2015-08-21 17:33:11 +00001208 JsonString s; /* Output string - not real JSON */
1209 JsonParse x; /* The parse */
drhe9c37f32015-08-15 21:25:36 +00001210 u32 i;
drhe9c37f32015-08-15 21:25:36 +00001211
1212 assert( argc==1 );
drhbc8f0922015-08-22 19:39:04 +00001213 if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return;
drh8784eca2015-08-23 02:42:30 +00001214 jsonParseFindParents(&x);
drhbc8f0922015-08-22 19:39:04 +00001215 jsonInit(&s, ctx);
drhe9c37f32015-08-15 21:25:36 +00001216 for(i=0; i<x.nNode; i++){
drh852944e2015-09-10 03:29:11 +00001217 const char *zType;
1218 if( x.aNode[i].jnFlags & JNODE_LABEL ){
1219 assert( x.aNode[i].eType==JSON_STRING );
1220 zType = "label";
1221 }else{
1222 zType = jsonType[x.aNode[i].eType];
drhe9c37f32015-08-15 21:25:36 +00001223 }
drh852944e2015-09-10 03:29:11 +00001224 jsonPrintf(100, &s,"node %3u: %7s n=%-4d up=%-4d",
1225 i, zType, x.aNode[i].n, x.aUp[i]);
1226 if( x.aNode[i].u.zJContent!=0 ){
1227 jsonAppendRaw(&s, " ", 1);
1228 jsonAppendRaw(&s, x.aNode[i].u.zJContent, x.aNode[i].n);
1229 }
1230 jsonAppendRaw(&s, "\n", 1);
drhe9c37f32015-08-15 21:25:36 +00001231 }
drh505ad2c2015-08-21 17:33:11 +00001232 jsonParseReset(&x);
drhe9c37f32015-08-15 21:25:36 +00001233 jsonResult(&s);
1234}
1235
drh5634cc02015-08-17 11:28:03 +00001236/*
drhf5ddb9c2015-09-11 00:06:41 +00001237** The json_test1(JSON) function return true (1) if the input is JSON
1238** text generated by another json function. It returns (0) if the input
1239** is not known to be JSON.
drh5634cc02015-08-17 11:28:03 +00001240*/
1241static void jsonTest1Func(
drhbc8f0922015-08-22 19:39:04 +00001242 sqlite3_context *ctx,
drh5634cc02015-08-17 11:28:03 +00001243 int argc,
1244 sqlite3_value **argv
1245){
mistachkin16a93122015-09-11 18:05:01 +00001246 UNUSED_PARAM(argc);
drhf5ddb9c2015-09-11 00:06:41 +00001247 sqlite3_result_int(ctx, sqlite3_value_subtype(argv[0])==JSON_SUBTYPE);
drh5634cc02015-08-17 11:28:03 +00001248}
drh301eecc2015-08-17 20:14:19 +00001249#endif /* SQLITE_DEBUG */
drh5634cc02015-08-17 11:28:03 +00001250
drh987eb1f2015-08-17 15:17:37 +00001251/****************************************************************************
drhff135ae2015-12-30 01:07:02 +00001252** Scalar SQL function implementations
drh987eb1f2015-08-17 15:17:37 +00001253****************************************************************************/
1254
1255/*
drh2ad96f52016-06-17 13:01:51 +00001256** Implementation of the json_QUOTE(VALUE) function. Return a JSON value
1257** corresponding to the SQL value input. Mostly this means putting
1258** double-quotes around strings and returning the unquoted string "null"
1259** when given a NULL input.
1260*/
1261static void jsonQuoteFunc(
1262 sqlite3_context *ctx,
1263 int argc,
1264 sqlite3_value **argv
1265){
1266 JsonString jx;
drhb0df5402016-08-01 17:06:44 +00001267 UNUSED_PARAM(argc);
drh2ad96f52016-06-17 13:01:51 +00001268
1269 jsonInit(&jx, ctx);
1270 jsonAppendValue(&jx, argv[0]);
1271 jsonResult(&jx);
1272 sqlite3_result_subtype(ctx, JSON_SUBTYPE);
1273}
1274
1275/*
drh987eb1f2015-08-17 15:17:37 +00001276** Implementation of the json_array(VALUE,...) function. Return a JSON
1277** array that contains all values given in arguments. Or if any argument
1278** is a BLOB, throw an error.
1279*/
1280static void jsonArrayFunc(
drhbc8f0922015-08-22 19:39:04 +00001281 sqlite3_context *ctx,
drh987eb1f2015-08-17 15:17:37 +00001282 int argc,
1283 sqlite3_value **argv
1284){
1285 int i;
drh505ad2c2015-08-21 17:33:11 +00001286 JsonString jx;
drh987eb1f2015-08-17 15:17:37 +00001287
drhbc8f0922015-08-22 19:39:04 +00001288 jsonInit(&jx, ctx);
drhd0960592015-08-17 21:22:32 +00001289 jsonAppendChar(&jx, '[');
drh987eb1f2015-08-17 15:17:37 +00001290 for(i=0; i<argc; i++){
drhd0960592015-08-17 21:22:32 +00001291 jsonAppendSeparator(&jx);
drhf5ddb9c2015-09-11 00:06:41 +00001292 jsonAppendValue(&jx, argv[i]);
drh987eb1f2015-08-17 15:17:37 +00001293 }
drhd0960592015-08-17 21:22:32 +00001294 jsonAppendChar(&jx, ']');
drh987eb1f2015-08-17 15:17:37 +00001295 jsonResult(&jx);
drhf5ddb9c2015-09-11 00:06:41 +00001296 sqlite3_result_subtype(ctx, JSON_SUBTYPE);
drh987eb1f2015-08-17 15:17:37 +00001297}
1298
1299
1300/*
1301** json_array_length(JSON)
1302** json_array_length(JSON, PATH)
1303**
1304** Return the number of elements in the top-level JSON array.
1305** Return 0 if the input is not a well-formed JSON array.
1306*/
1307static void jsonArrayLengthFunc(
drhbc8f0922015-08-22 19:39:04 +00001308 sqlite3_context *ctx,
drh987eb1f2015-08-17 15:17:37 +00001309 int argc,
1310 sqlite3_value **argv
1311){
1312 JsonParse x; /* The parse */
1313 sqlite3_int64 n = 0;
1314 u32 i;
drha8f39a92015-09-21 22:53:16 +00001315 JsonNode *pNode;
drh987eb1f2015-08-17 15:17:37 +00001316
drhf2df7e72015-08-28 20:07:40 +00001317 if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return;
drha8f39a92015-09-21 22:53:16 +00001318 assert( x.nNode );
1319 if( argc==2 ){
1320 const char *zPath = (const char*)sqlite3_value_text(argv[1]);
1321 pNode = jsonLookup(&x, zPath, 0, ctx);
1322 }else{
1323 pNode = x.aNode;
1324 }
1325 if( pNode==0 ){
1326 x.nErr = 1;
1327 }else if( pNode->eType==JSON_ARRAY ){
1328 assert( (pNode->jnFlags & JNODE_APPEND)==0 );
1329 for(i=1; i<=pNode->n; n++){
1330 i += jsonNodeSize(&pNode[i]);
drh987eb1f2015-08-17 15:17:37 +00001331 }
drh987eb1f2015-08-17 15:17:37 +00001332 }
drha7714022015-08-29 00:54:49 +00001333 if( x.nErr==0 ) sqlite3_result_int64(ctx, n);
drhf6ec8d42015-08-28 03:48:04 +00001334 jsonParseReset(&x);
1335}
1336
1337/*
drh3ad93bb2015-08-29 19:41:45 +00001338** json_extract(JSON, PATH, ...)
drh987eb1f2015-08-17 15:17:37 +00001339**
drh3ad93bb2015-08-29 19:41:45 +00001340** Return the element described by PATH. Return NULL if there is no
1341** PATH element. If there are multiple PATHs, then return a JSON array
1342** with the result from each path. Throw an error if the JSON or any PATH
1343** is malformed.
drh987eb1f2015-08-17 15:17:37 +00001344*/
1345static void jsonExtractFunc(
drhbc8f0922015-08-22 19:39:04 +00001346 sqlite3_context *ctx,
drh987eb1f2015-08-17 15:17:37 +00001347 int argc,
1348 sqlite3_value **argv
1349){
1350 JsonParse x; /* The parse */
1351 JsonNode *pNode;
1352 const char *zPath;
drh3ad93bb2015-08-29 19:41:45 +00001353 JsonString jx;
1354 int i;
1355
1356 if( argc<2 ) return;
drhbc8f0922015-08-22 19:39:04 +00001357 if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return;
drh3ad93bb2015-08-29 19:41:45 +00001358 jsonInit(&jx, ctx);
1359 jsonAppendChar(&jx, '[');
1360 for(i=1; i<argc; i++){
1361 zPath = (const char*)sqlite3_value_text(argv[i]);
drhf5ddb9c2015-09-11 00:06:41 +00001362 pNode = jsonLookup(&x, zPath, 0, ctx);
drh3ad93bb2015-08-29 19:41:45 +00001363 if( x.nErr ) break;
1364 if( argc>2 ){
1365 jsonAppendSeparator(&jx);
1366 if( pNode ){
1367 jsonRenderNode(pNode, &jx, 0);
1368 }else{
1369 jsonAppendRaw(&jx, "null", 4);
1370 }
1371 }else if( pNode ){
1372 jsonReturn(pNode, ctx, 0);
1373 }
drh987eb1f2015-08-17 15:17:37 +00001374 }
drh3ad93bb2015-08-29 19:41:45 +00001375 if( argc>2 && i==argc ){
1376 jsonAppendChar(&jx, ']');
1377 jsonResult(&jx);
drhf5ddb9c2015-09-11 00:06:41 +00001378 sqlite3_result_subtype(ctx, JSON_SUBTYPE);
drh3ad93bb2015-08-29 19:41:45 +00001379 }
1380 jsonReset(&jx);
drh505ad2c2015-08-21 17:33:11 +00001381 jsonParseReset(&x);
drh987eb1f2015-08-17 15:17:37 +00001382}
1383
drh633647a2017-03-22 21:24:31 +00001384/* This is the RFC 7396 MergePatch algorithm.
1385*/
1386static JsonNode *jsonMergePatch(
1387 JsonParse *pParse, /* The JSON parser that contains the TARGET */
1388 int iTarget, /* Node of the TARGET in pParse */
1389 JsonNode *pPatch /* The PATCH */
1390){
drh0002d242017-03-23 00:46:15 +00001391 u32 i, j;
1392 u32 iRoot;
drh633647a2017-03-22 21:24:31 +00001393 JsonNode *pTarget;
1394 if( pPatch->eType!=JSON_OBJECT ){
1395 return pPatch;
1396 }
1397 assert( iTarget>=0 && iTarget<pParse->nNode );
1398 pTarget = &pParse->aNode[iTarget];
1399 assert( (pPatch->jnFlags & JNODE_APPEND)==0 );
1400 if( pTarget->eType!=JSON_OBJECT ){
drh29c99692017-03-24 12:35:17 +00001401 jsonRemoveAllNulls(pPatch);
drh633647a2017-03-22 21:24:31 +00001402 return pPatch;
1403 }
drhbb7aa2d2017-03-23 00:13:52 +00001404 iRoot = iTarget;
drh633647a2017-03-22 21:24:31 +00001405 for(i=1; i<pPatch->n; i += jsonNodeSize(&pPatch[i+1])+1){
drhba7cce32017-03-24 19:45:05 +00001406 u32 nKey;
drh633647a2017-03-22 21:24:31 +00001407 const char *zKey;
1408 assert( pPatch[i].eType==JSON_STRING );
1409 assert( pPatch[i].jnFlags & JNODE_LABEL );
1410 nKey = pPatch[i].n;
1411 zKey = pPatch[i].u.zJContent;
drhbb7aa2d2017-03-23 00:13:52 +00001412 assert( (pPatch[i].jnFlags & JNODE_RAW)==0 );
drh633647a2017-03-22 21:24:31 +00001413 for(j=1; j<pTarget->n; j += jsonNodeSize(&pTarget[j+1])+1 ){
1414 assert( pTarget[j].eType==JSON_STRING );
1415 assert( pTarget[j].jnFlags & JNODE_LABEL );
drhbb7aa2d2017-03-23 00:13:52 +00001416 assert( (pPatch[i].jnFlags & JNODE_RAW)==0 );
drh1fe162f2017-03-23 12:56:44 +00001417 if( pTarget[j].n==nKey && strncmp(pTarget[j].u.zJContent,zKey,nKey)==0 ){
1418 if( pTarget[j+1].jnFlags & (JNODE_REMOVE|JNODE_PATCH) ) break;
drh633647a2017-03-22 21:24:31 +00001419 if( pPatch[i+1].eType==JSON_NULL ){
1420 pTarget[j+1].jnFlags |= JNODE_REMOVE;
1421 }else{
drhbb7aa2d2017-03-23 00:13:52 +00001422 JsonNode *pNew = jsonMergePatch(pParse, iTarget+j+1, &pPatch[i+1]);
drh633647a2017-03-22 21:24:31 +00001423 if( pNew==0 ) return 0;
1424 pTarget = &pParse->aNode[iTarget];
1425 if( pNew!=&pTarget[j+1] ){
1426 pTarget[j+1].u.pPatch = pNew;
1427 pTarget[j+1].jnFlags |= JNODE_PATCH;
1428 }
1429 }
1430 break;
1431 }
1432 }
drhbb7aa2d2017-03-23 00:13:52 +00001433 if( j>=pTarget->n && pPatch[i+1].eType!=JSON_NULL ){
drh633647a2017-03-22 21:24:31 +00001434 int iStart, iPatch;
1435 iStart = jsonParseAddNode(pParse, JSON_OBJECT, 2, 0);
1436 jsonParseAddNode(pParse, JSON_STRING, nKey, zKey);
1437 iPatch = jsonParseAddNode(pParse, JSON_TRUE, 0, 0);
1438 if( pParse->oom ) return 0;
drh29c99692017-03-24 12:35:17 +00001439 jsonRemoveAllNulls(pPatch);
drh633647a2017-03-22 21:24:31 +00001440 pTarget = &pParse->aNode[iTarget];
drhbb7aa2d2017-03-23 00:13:52 +00001441 pParse->aNode[iRoot].jnFlags |= JNODE_APPEND;
1442 pParse->aNode[iRoot].u.iAppend = iStart - iRoot;
1443 iRoot = iStart;
drh633647a2017-03-22 21:24:31 +00001444 pParse->aNode[iPatch].jnFlags |= JNODE_PATCH;
1445 pParse->aNode[iPatch].u.pPatch = &pPatch[i+1];
1446 }
1447 }
1448 return pTarget;
1449}
1450
1451/*
1452** Implementation of the json_mergepatch(JSON1,JSON2) function. Return a JSON
1453** object that is the result of running the RFC 7396 MergePatch() algorithm
1454** on the two arguments.
1455*/
drh37f03df2017-03-23 20:33:49 +00001456static void jsonPatchFunc(
drh633647a2017-03-22 21:24:31 +00001457 sqlite3_context *ctx,
1458 int argc,
1459 sqlite3_value **argv
1460){
1461 JsonParse x; /* The JSON that is being patched */
1462 JsonParse y; /* The patch */
drhbb7aa2d2017-03-23 00:13:52 +00001463 JsonNode *pResult; /* The result of the merge */
drh633647a2017-03-22 21:24:31 +00001464
drh2fb79e92017-03-25 12:08:11 +00001465 UNUSED_PARAM(argc);
drh633647a2017-03-22 21:24:31 +00001466 if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return;
1467 if( jsonParse(&y, ctx, (const char*)sqlite3_value_text(argv[1])) ){
1468 jsonParseReset(&x);
1469 return;
1470 }
drhbb7aa2d2017-03-23 00:13:52 +00001471 pResult = jsonMergePatch(&x, 0, y.aNode);
1472 assert( pResult!=0 || x.oom );
1473 if( pResult ){
1474 jsonReturnJson(pResult, ctx, 0);
1475 }else{
1476 sqlite3_result_error_nomem(ctx);
1477 }
drh633647a2017-03-22 21:24:31 +00001478 jsonParseReset(&x);
1479 jsonParseReset(&y);
1480}
1481
1482
drh987eb1f2015-08-17 15:17:37 +00001483/*
1484** Implementation of the json_object(NAME,VALUE,...) function. Return a JSON
1485** object that contains all name/value given in arguments. Or if any name
1486** is not a string or if any value is a BLOB, throw an error.
1487*/
1488static void jsonObjectFunc(
drhbc8f0922015-08-22 19:39:04 +00001489 sqlite3_context *ctx,
drh987eb1f2015-08-17 15:17:37 +00001490 int argc,
1491 sqlite3_value **argv
1492){
1493 int i;
drh505ad2c2015-08-21 17:33:11 +00001494 JsonString jx;
drh987eb1f2015-08-17 15:17:37 +00001495 const char *z;
1496 u32 n;
1497
1498 if( argc&1 ){
drhbc8f0922015-08-22 19:39:04 +00001499 sqlite3_result_error(ctx, "json_object() requires an even number "
drh987eb1f2015-08-17 15:17:37 +00001500 "of arguments", -1);
1501 return;
1502 }
drhbc8f0922015-08-22 19:39:04 +00001503 jsonInit(&jx, ctx);
drhd0960592015-08-17 21:22:32 +00001504 jsonAppendChar(&jx, '{');
drh987eb1f2015-08-17 15:17:37 +00001505 for(i=0; i<argc; i+=2){
drh987eb1f2015-08-17 15:17:37 +00001506 if( sqlite3_value_type(argv[i])!=SQLITE_TEXT ){
drhbc8f0922015-08-22 19:39:04 +00001507 sqlite3_result_error(ctx, "json_object() labels must be TEXT", -1);
drhdc384952015-09-19 18:54:39 +00001508 jsonReset(&jx);
drh987eb1f2015-08-17 15:17:37 +00001509 return;
1510 }
drhd0960592015-08-17 21:22:32 +00001511 jsonAppendSeparator(&jx);
drh987eb1f2015-08-17 15:17:37 +00001512 z = (const char*)sqlite3_value_text(argv[i]);
1513 n = (u32)sqlite3_value_bytes(argv[i]);
1514 jsonAppendString(&jx, z, n);
drhd0960592015-08-17 21:22:32 +00001515 jsonAppendChar(&jx, ':');
drhf5ddb9c2015-09-11 00:06:41 +00001516 jsonAppendValue(&jx, argv[i+1]);
drh987eb1f2015-08-17 15:17:37 +00001517 }
drhd0960592015-08-17 21:22:32 +00001518 jsonAppendChar(&jx, '}');
drh987eb1f2015-08-17 15:17:37 +00001519 jsonResult(&jx);
drhf5ddb9c2015-09-11 00:06:41 +00001520 sqlite3_result_subtype(ctx, JSON_SUBTYPE);
drh987eb1f2015-08-17 15:17:37 +00001521}
1522
1523
1524/*
drh301eecc2015-08-17 20:14:19 +00001525** json_remove(JSON, PATH, ...)
1526**
drh3ad93bb2015-08-29 19:41:45 +00001527** Remove the named elements from JSON and return the result. malformed
1528** JSON or PATH arguments result in an error.
drh301eecc2015-08-17 20:14:19 +00001529*/
1530static void jsonRemoveFunc(
drhbc8f0922015-08-22 19:39:04 +00001531 sqlite3_context *ctx,
drh301eecc2015-08-17 20:14:19 +00001532 int argc,
1533 sqlite3_value **argv
1534){
1535 JsonParse x; /* The parse */
1536 JsonNode *pNode;
1537 const char *zPath;
1538 u32 i;
1539
1540 if( argc<1 ) return;
drhbc8f0922015-08-22 19:39:04 +00001541 if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return;
drha8f39a92015-09-21 22:53:16 +00001542 assert( x.nNode );
1543 for(i=1; i<(u32)argc; i++){
1544 zPath = (const char*)sqlite3_value_text(argv[i]);
1545 if( zPath==0 ) goto remove_done;
1546 pNode = jsonLookup(&x, zPath, 0, ctx);
1547 if( x.nErr ) goto remove_done;
1548 if( pNode ) pNode->jnFlags |= JNODE_REMOVE;
1549 }
1550 if( (x.aNode[0].jnFlags & JNODE_REMOVE)==0 ){
1551 jsonReturnJson(x.aNode, ctx, 0);
drhd0960592015-08-17 21:22:32 +00001552 }
drha7714022015-08-29 00:54:49 +00001553remove_done:
drh505ad2c2015-08-21 17:33:11 +00001554 jsonParseReset(&x);
drhd0960592015-08-17 21:22:32 +00001555}
1556
1557/*
1558** json_replace(JSON, PATH, VALUE, ...)
1559**
1560** Replace the value at PATH with VALUE. If PATH does not already exist,
drh3ad93bb2015-08-29 19:41:45 +00001561** this routine is a no-op. If JSON or PATH is malformed, throw an error.
drhd0960592015-08-17 21:22:32 +00001562*/
1563static void jsonReplaceFunc(
drhbc8f0922015-08-22 19:39:04 +00001564 sqlite3_context *ctx,
drhd0960592015-08-17 21:22:32 +00001565 int argc,
1566 sqlite3_value **argv
1567){
1568 JsonParse x; /* The parse */
1569 JsonNode *pNode;
1570 const char *zPath;
1571 u32 i;
1572
1573 if( argc<1 ) return;
1574 if( (argc&1)==0 ) {
drhbc8f0922015-08-22 19:39:04 +00001575 jsonWrongNumArgs(ctx, "replace");
drhd0960592015-08-17 21:22:32 +00001576 return;
1577 }
drhbc8f0922015-08-22 19:39:04 +00001578 if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return;
drha8f39a92015-09-21 22:53:16 +00001579 assert( x.nNode );
1580 for(i=1; i<(u32)argc; i+=2){
1581 zPath = (const char*)sqlite3_value_text(argv[i]);
1582 pNode = jsonLookup(&x, zPath, 0, ctx);
1583 if( x.nErr ) goto replace_err;
1584 if( pNode ){
1585 pNode->jnFlags |= (u8)JNODE_REPLACE;
drh633647a2017-03-22 21:24:31 +00001586 pNode->u.iReplace = i + 1;
drhd0960592015-08-17 21:22:32 +00001587 }
drha8f39a92015-09-21 22:53:16 +00001588 }
1589 if( x.aNode[0].jnFlags & JNODE_REPLACE ){
drh633647a2017-03-22 21:24:31 +00001590 sqlite3_result_value(ctx, argv[x.aNode[0].u.iReplace]);
drha8f39a92015-09-21 22:53:16 +00001591 }else{
1592 jsonReturnJson(x.aNode, ctx, argv);
drh301eecc2015-08-17 20:14:19 +00001593 }
drha7714022015-08-29 00:54:49 +00001594replace_err:
drh505ad2c2015-08-21 17:33:11 +00001595 jsonParseReset(&x);
drh301eecc2015-08-17 20:14:19 +00001596}
drh505ad2c2015-08-21 17:33:11 +00001597
drh52216ad2015-08-18 02:28:03 +00001598/*
1599** json_set(JSON, PATH, VALUE, ...)
1600**
1601** Set the value at PATH to VALUE. Create the PATH if it does not already
1602** exist. Overwrite existing values that do exist.
drh3ad93bb2015-08-29 19:41:45 +00001603** If JSON or PATH is malformed, throw an error.
drh52216ad2015-08-18 02:28:03 +00001604**
1605** json_insert(JSON, PATH, VALUE, ...)
1606**
1607** Create PATH and initialize it to VALUE. If PATH already exists, this
drh3ad93bb2015-08-29 19:41:45 +00001608** routine is a no-op. If JSON or PATH is malformed, throw an error.
drh52216ad2015-08-18 02:28:03 +00001609*/
1610static void jsonSetFunc(
drhbc8f0922015-08-22 19:39:04 +00001611 sqlite3_context *ctx,
drh52216ad2015-08-18 02:28:03 +00001612 int argc,
1613 sqlite3_value **argv
1614){
1615 JsonParse x; /* The parse */
1616 JsonNode *pNode;
1617 const char *zPath;
1618 u32 i;
1619 int bApnd;
drhbc8f0922015-08-22 19:39:04 +00001620 int bIsSet = *(int*)sqlite3_user_data(ctx);
drh52216ad2015-08-18 02:28:03 +00001621
1622 if( argc<1 ) return;
1623 if( (argc&1)==0 ) {
drhbc8f0922015-08-22 19:39:04 +00001624 jsonWrongNumArgs(ctx, bIsSet ? "set" : "insert");
drh52216ad2015-08-18 02:28:03 +00001625 return;
1626 }
drhbc8f0922015-08-22 19:39:04 +00001627 if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return;
drha8f39a92015-09-21 22:53:16 +00001628 assert( x.nNode );
1629 for(i=1; i<(u32)argc; i+=2){
1630 zPath = (const char*)sqlite3_value_text(argv[i]);
1631 bApnd = 0;
1632 pNode = jsonLookup(&x, zPath, &bApnd, ctx);
1633 if( x.oom ){
1634 sqlite3_result_error_nomem(ctx);
1635 goto jsonSetDone;
1636 }else if( x.nErr ){
1637 goto jsonSetDone;
1638 }else if( pNode && (bApnd || bIsSet) ){
1639 pNode->jnFlags |= (u8)JNODE_REPLACE;
drh633647a2017-03-22 21:24:31 +00001640 pNode->u.iReplace = i + 1;
drh52216ad2015-08-18 02:28:03 +00001641 }
drha8f39a92015-09-21 22:53:16 +00001642 }
1643 if( x.aNode[0].jnFlags & JNODE_REPLACE ){
drh633647a2017-03-22 21:24:31 +00001644 sqlite3_result_value(ctx, argv[x.aNode[0].u.iReplace]);
drha8f39a92015-09-21 22:53:16 +00001645 }else{
1646 jsonReturnJson(x.aNode, ctx, argv);
drh52216ad2015-08-18 02:28:03 +00001647 }
drhbc8f0922015-08-22 19:39:04 +00001648jsonSetDone:
drh505ad2c2015-08-21 17:33:11 +00001649 jsonParseReset(&x);
drh52216ad2015-08-18 02:28:03 +00001650}
drh301eecc2015-08-17 20:14:19 +00001651
1652/*
drh987eb1f2015-08-17 15:17:37 +00001653** json_type(JSON)
1654** json_type(JSON, PATH)
1655**
drh3ad93bb2015-08-29 19:41:45 +00001656** Return the top-level "type" of a JSON string. Throw an error if
1657** either the JSON or PATH inputs are not well-formed.
drh987eb1f2015-08-17 15:17:37 +00001658*/
1659static void jsonTypeFunc(
drhbc8f0922015-08-22 19:39:04 +00001660 sqlite3_context *ctx,
drh987eb1f2015-08-17 15:17:37 +00001661 int argc,
1662 sqlite3_value **argv
1663){
1664 JsonParse x; /* The parse */
1665 const char *zPath;
drha8f39a92015-09-21 22:53:16 +00001666 JsonNode *pNode;
drh987eb1f2015-08-17 15:17:37 +00001667
drhbc8f0922015-08-22 19:39:04 +00001668 if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return;
drha8f39a92015-09-21 22:53:16 +00001669 assert( x.nNode );
1670 if( argc==2 ){
1671 zPath = (const char*)sqlite3_value_text(argv[1]);
1672 pNode = jsonLookup(&x, zPath, 0, ctx);
1673 }else{
1674 pNode = x.aNode;
1675 }
1676 if( pNode ){
1677 sqlite3_result_text(ctx, jsonType[pNode->eType], -1, SQLITE_STATIC);
drh987eb1f2015-08-17 15:17:37 +00001678 }
drh505ad2c2015-08-21 17:33:11 +00001679 jsonParseReset(&x);
drh987eb1f2015-08-17 15:17:37 +00001680}
drh5634cc02015-08-17 11:28:03 +00001681
drhbc8f0922015-08-22 19:39:04 +00001682/*
1683** json_valid(JSON)
1684**
drh3ad93bb2015-08-29 19:41:45 +00001685** Return 1 if JSON is a well-formed JSON string according to RFC-7159.
1686** Return 0 otherwise.
drhbc8f0922015-08-22 19:39:04 +00001687*/
1688static void jsonValidFunc(
1689 sqlite3_context *ctx,
1690 int argc,
1691 sqlite3_value **argv
1692){
1693 JsonParse x; /* The parse */
1694 int rc = 0;
1695
mistachkin16a93122015-09-11 18:05:01 +00001696 UNUSED_PARAM(argc);
drha8f39a92015-09-21 22:53:16 +00001697 if( jsonParse(&x, 0, (const char*)sqlite3_value_text(argv[0]))==0 ){
drhbc8f0922015-08-22 19:39:04 +00001698 rc = 1;
1699 }
1700 jsonParseReset(&x);
1701 sqlite3_result_int(ctx, rc);
1702}
1703
drhff135ae2015-12-30 01:07:02 +00001704
1705/****************************************************************************
1706** Aggregate SQL function implementations
1707****************************************************************************/
1708/*
1709** json_group_array(VALUE)
1710**
1711** Return a JSON array composed of all values in the aggregate.
1712*/
1713static void jsonArrayStep(
1714 sqlite3_context *ctx,
1715 int argc,
1716 sqlite3_value **argv
1717){
1718 JsonString *pStr;
drhdf3a9072016-02-11 15:37:18 +00001719 UNUSED_PARAM(argc);
drhff135ae2015-12-30 01:07:02 +00001720 pStr = (JsonString*)sqlite3_aggregate_context(ctx, sizeof(*pStr));
1721 if( pStr ){
1722 if( pStr->zBuf==0 ){
1723 jsonInit(pStr, ctx);
1724 jsonAppendChar(pStr, '[');
1725 }else{
1726 jsonAppendChar(pStr, ',');
1727 pStr->pCtx = ctx;
1728 }
1729 jsonAppendValue(pStr, argv[0]);
1730 }
1731}
1732static void jsonArrayFinal(sqlite3_context *ctx){
1733 JsonString *pStr;
1734 pStr = (JsonString*)sqlite3_aggregate_context(ctx, 0);
1735 if( pStr ){
1736 pStr->pCtx = ctx;
1737 jsonAppendChar(pStr, ']');
1738 if( pStr->bErr ){
drh4a642b62016-02-05 01:55:27 +00001739 if( pStr->bErr==1 ) sqlite3_result_error_nomem(ctx);
drh23079262016-01-01 00:15:59 +00001740 assert( pStr->bStatic );
drhff135ae2015-12-30 01:07:02 +00001741 }else{
1742 sqlite3_result_text(ctx, pStr->zBuf, pStr->nUsed,
1743 pStr->bStatic ? SQLITE_TRANSIENT : sqlite3_free);
1744 pStr->bStatic = 1;
1745 }
1746 }else{
1747 sqlite3_result_text(ctx, "[]", 2, SQLITE_STATIC);
1748 }
1749 sqlite3_result_subtype(ctx, JSON_SUBTYPE);
1750}
1751
1752/*
1753** json_group_obj(NAME,VALUE)
1754**
1755** Return a JSON object composed of all names and values in the aggregate.
1756*/
1757static void jsonObjectStep(
1758 sqlite3_context *ctx,
1759 int argc,
1760 sqlite3_value **argv
1761){
1762 JsonString *pStr;
1763 const char *z;
1764 u32 n;
drhdf3a9072016-02-11 15:37:18 +00001765 UNUSED_PARAM(argc);
drhff135ae2015-12-30 01:07:02 +00001766 pStr = (JsonString*)sqlite3_aggregate_context(ctx, sizeof(*pStr));
1767 if( pStr ){
1768 if( pStr->zBuf==0 ){
1769 jsonInit(pStr, ctx);
1770 jsonAppendChar(pStr, '{');
1771 }else{
1772 jsonAppendChar(pStr, ',');
1773 pStr->pCtx = ctx;
1774 }
1775 z = (const char*)sqlite3_value_text(argv[0]);
1776 n = (u32)sqlite3_value_bytes(argv[0]);
1777 jsonAppendString(pStr, z, n);
1778 jsonAppendChar(pStr, ':');
1779 jsonAppendValue(pStr, argv[1]);
1780 }
1781}
1782static void jsonObjectFinal(sqlite3_context *ctx){
1783 JsonString *pStr;
1784 pStr = (JsonString*)sqlite3_aggregate_context(ctx, 0);
1785 if( pStr ){
1786 jsonAppendChar(pStr, '}');
1787 if( pStr->bErr ){
drh6850a632016-11-07 18:18:08 +00001788 if( pStr->bErr==1 ) sqlite3_result_error_nomem(ctx);
drh23079262016-01-01 00:15:59 +00001789 assert( pStr->bStatic );
drhff135ae2015-12-30 01:07:02 +00001790 }else{
1791 sqlite3_result_text(ctx, pStr->zBuf, pStr->nUsed,
1792 pStr->bStatic ? SQLITE_TRANSIENT : sqlite3_free);
1793 pStr->bStatic = 1;
1794 }
1795 }else{
1796 sqlite3_result_text(ctx, "{}", 2, SQLITE_STATIC);
1797 }
1798 sqlite3_result_subtype(ctx, JSON_SUBTYPE);
1799}
1800
1801
drhd2975922015-08-29 17:22:33 +00001802#ifndef SQLITE_OMIT_VIRTUALTABLE
drhcb6c6c62015-08-19 22:47:17 +00001803/****************************************************************************
1804** The json_each virtual table
1805****************************************************************************/
1806typedef struct JsonEachCursor JsonEachCursor;
1807struct JsonEachCursor {
1808 sqlite3_vtab_cursor base; /* Base class - must be first */
drh505ad2c2015-08-21 17:33:11 +00001809 u32 iRowid; /* The rowid */
drh852944e2015-09-10 03:29:11 +00001810 u32 iBegin; /* The first node of the scan */
drh505ad2c2015-08-21 17:33:11 +00001811 u32 i; /* Index in sParse.aNode[] of current row */
1812 u32 iEnd; /* EOF when i equals or exceeds this value */
1813 u8 eType; /* Type of top-level element */
1814 u8 bRecursive; /* True for json_tree(). False for json_each() */
1815 char *zJson; /* Input JSON */
drh383de692015-09-10 17:20:57 +00001816 char *zRoot; /* Path by which to filter zJson */
drh505ad2c2015-08-21 17:33:11 +00001817 JsonParse sParse; /* Parse of the input JSON */
drhcb6c6c62015-08-19 22:47:17 +00001818};
1819
1820/* Constructor for the json_each virtual table */
1821static int jsonEachConnect(
1822 sqlite3 *db,
1823 void *pAux,
1824 int argc, const char *const*argv,
1825 sqlite3_vtab **ppVtab,
1826 char **pzErr
1827){
1828 sqlite3_vtab *pNew;
drh505ad2c2015-08-21 17:33:11 +00001829 int rc;
drhcb6c6c62015-08-19 22:47:17 +00001830
1831/* Column numbers */
drh4af352d2015-08-21 20:02:48 +00001832#define JEACH_KEY 0
1833#define JEACH_VALUE 1
1834#define JEACH_TYPE 2
1835#define JEACH_ATOM 3
1836#define JEACH_ID 4
1837#define JEACH_PARENT 5
1838#define JEACH_FULLKEY 6
drh383de692015-09-10 17:20:57 +00001839#define JEACH_PATH 7
1840#define JEACH_JSON 8
1841#define JEACH_ROOT 9
drhcb6c6c62015-08-19 22:47:17 +00001842
drh6fd5c1e2015-08-21 20:37:12 +00001843 UNUSED_PARAM(pzErr);
1844 UNUSED_PARAM(argv);
1845 UNUSED_PARAM(argc);
1846 UNUSED_PARAM(pAux);
drh505ad2c2015-08-21 17:33:11 +00001847 rc = sqlite3_declare_vtab(db,
drh383de692015-09-10 17:20:57 +00001848 "CREATE TABLE x(key,value,type,atom,id,parent,fullkey,path,"
1849 "json HIDDEN,root HIDDEN)");
drh505ad2c2015-08-21 17:33:11 +00001850 if( rc==SQLITE_OK ){
1851 pNew = *ppVtab = sqlite3_malloc( sizeof(*pNew) );
1852 if( pNew==0 ) return SQLITE_NOMEM;
1853 memset(pNew, 0, sizeof(*pNew));
1854 }
1855 return rc;
drhcb6c6c62015-08-19 22:47:17 +00001856}
1857
1858/* destructor for json_each virtual table */
1859static int jsonEachDisconnect(sqlite3_vtab *pVtab){
1860 sqlite3_free(pVtab);
1861 return SQLITE_OK;
1862}
1863
drh505ad2c2015-08-21 17:33:11 +00001864/* constructor for a JsonEachCursor object for json_each(). */
1865static int jsonEachOpenEach(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){
drhcb6c6c62015-08-19 22:47:17 +00001866 JsonEachCursor *pCur;
drh6fd5c1e2015-08-21 20:37:12 +00001867
1868 UNUSED_PARAM(p);
drhcb6c6c62015-08-19 22:47:17 +00001869 pCur = sqlite3_malloc( sizeof(*pCur) );
1870 if( pCur==0 ) return SQLITE_NOMEM;
1871 memset(pCur, 0, sizeof(*pCur));
1872 *ppCursor = &pCur->base;
1873 return SQLITE_OK;
1874}
1875
drh505ad2c2015-08-21 17:33:11 +00001876/* constructor for a JsonEachCursor object for json_tree(). */
1877static int jsonEachOpenTree(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){
1878 int rc = jsonEachOpenEach(p, ppCursor);
1879 if( rc==SQLITE_OK ){
1880 JsonEachCursor *pCur = (JsonEachCursor*)*ppCursor;
1881 pCur->bRecursive = 1;
1882 }
1883 return rc;
1884}
1885
drhcb6c6c62015-08-19 22:47:17 +00001886/* Reset a JsonEachCursor back to its original state. Free any memory
1887** held. */
1888static void jsonEachCursorReset(JsonEachCursor *p){
1889 sqlite3_free(p->zJson);
drh383de692015-09-10 17:20:57 +00001890 sqlite3_free(p->zRoot);
drh505ad2c2015-08-21 17:33:11 +00001891 jsonParseReset(&p->sParse);
drhcb6c6c62015-08-19 22:47:17 +00001892 p->iRowid = 0;
1893 p->i = 0;
1894 p->iEnd = 0;
1895 p->eType = 0;
drhcb6c6c62015-08-19 22:47:17 +00001896 p->zJson = 0;
drh383de692015-09-10 17:20:57 +00001897 p->zRoot = 0;
drhcb6c6c62015-08-19 22:47:17 +00001898}
1899
1900/* Destructor for a jsonEachCursor object */
1901static int jsonEachClose(sqlite3_vtab_cursor *cur){
1902 JsonEachCursor *p = (JsonEachCursor*)cur;
1903 jsonEachCursorReset(p);
1904 sqlite3_free(cur);
1905 return SQLITE_OK;
1906}
1907
1908/* Return TRUE if the jsonEachCursor object has been advanced off the end
1909** of the JSON object */
1910static int jsonEachEof(sqlite3_vtab_cursor *cur){
1911 JsonEachCursor *p = (JsonEachCursor*)cur;
1912 return p->i >= p->iEnd;
1913}
1914
drh505ad2c2015-08-21 17:33:11 +00001915/* Advance the cursor to the next element for json_tree() */
drh4af352d2015-08-21 20:02:48 +00001916static int jsonEachNext(sqlite3_vtab_cursor *cur){
drh505ad2c2015-08-21 17:33:11 +00001917 JsonEachCursor *p = (JsonEachCursor*)cur;
drh4af352d2015-08-21 20:02:48 +00001918 if( p->bRecursive ){
drh852944e2015-09-10 03:29:11 +00001919 if( p->sParse.aNode[p->i].jnFlags & JNODE_LABEL ) p->i++;
1920 p->i++;
drh4af352d2015-08-21 20:02:48 +00001921 p->iRowid++;
drh852944e2015-09-10 03:29:11 +00001922 if( p->i<p->iEnd ){
drh8784eca2015-08-23 02:42:30 +00001923 u32 iUp = p->sParse.aUp[p->i];
1924 JsonNode *pUp = &p->sParse.aNode[iUp];
drh4af352d2015-08-21 20:02:48 +00001925 p->eType = pUp->eType;
drh8784eca2015-08-23 02:42:30 +00001926 if( pUp->eType==JSON_ARRAY ){
1927 if( iUp==p->i-1 ){
1928 pUp->u.iKey = 0;
1929 }else{
1930 pUp->u.iKey++;
1931 }
drh4af352d2015-08-21 20:02:48 +00001932 }
1933 }
drh505ad2c2015-08-21 17:33:11 +00001934 }else{
drh4af352d2015-08-21 20:02:48 +00001935 switch( p->eType ){
1936 case JSON_ARRAY: {
1937 p->i += jsonNodeSize(&p->sParse.aNode[p->i]);
1938 p->iRowid++;
1939 break;
1940 }
1941 case JSON_OBJECT: {
1942 p->i += 1 + jsonNodeSize(&p->sParse.aNode[p->i+1]);
1943 p->iRowid++;
1944 break;
1945 }
1946 default: {
1947 p->i = p->iEnd;
1948 break;
1949 }
drh505ad2c2015-08-21 17:33:11 +00001950 }
1951 }
1952 return SQLITE_OK;
1953}
1954
drh4af352d2015-08-21 20:02:48 +00001955/* Append the name of the path for element i to pStr
1956*/
1957static void jsonEachComputePath(
1958 JsonEachCursor *p, /* The cursor */
1959 JsonString *pStr, /* Write the path here */
1960 u32 i /* Path to this element */
1961){
1962 JsonNode *pNode, *pUp;
1963 u32 iUp;
1964 if( i==0 ){
1965 jsonAppendChar(pStr, '$');
1966 return;
drhcb6c6c62015-08-19 22:47:17 +00001967 }
drh4af352d2015-08-21 20:02:48 +00001968 iUp = p->sParse.aUp[i];
1969 jsonEachComputePath(p, pStr, iUp);
1970 pNode = &p->sParse.aNode[i];
1971 pUp = &p->sParse.aNode[iUp];
1972 if( pUp->eType==JSON_ARRAY ){
1973 jsonPrintf(30, pStr, "[%d]", pUp->u.iKey);
1974 }else{
1975 assert( pUp->eType==JSON_OBJECT );
drh852944e2015-09-10 03:29:11 +00001976 if( (pNode->jnFlags & JNODE_LABEL)==0 ) pNode--;
drh4af352d2015-08-21 20:02:48 +00001977 assert( pNode->eType==JSON_STRING );
drh852944e2015-09-10 03:29:11 +00001978 assert( pNode->jnFlags & JNODE_LABEL );
drh4af352d2015-08-21 20:02:48 +00001979 jsonPrintf(pNode->n+1, pStr, ".%.*s", pNode->n-2, pNode->u.zJContent+1);
1980 }
drhcb6c6c62015-08-19 22:47:17 +00001981}
1982
1983/* Return the value of a column */
1984static int jsonEachColumn(
1985 sqlite3_vtab_cursor *cur, /* The cursor */
1986 sqlite3_context *ctx, /* First argument to sqlite3_result_...() */
1987 int i /* Which column to return */
1988){
1989 JsonEachCursor *p = (JsonEachCursor*)cur;
drh505ad2c2015-08-21 17:33:11 +00001990 JsonNode *pThis = &p->sParse.aNode[p->i];
drhcb6c6c62015-08-19 22:47:17 +00001991 switch( i ){
1992 case JEACH_KEY: {
drh8784eca2015-08-23 02:42:30 +00001993 if( p->i==0 ) break;
drhcb6c6c62015-08-19 22:47:17 +00001994 if( p->eType==JSON_OBJECT ){
drh505ad2c2015-08-21 17:33:11 +00001995 jsonReturn(pThis, ctx, 0);
1996 }else if( p->eType==JSON_ARRAY ){
1997 u32 iKey;
1998 if( p->bRecursive ){
1999 if( p->iRowid==0 ) break;
drh8784eca2015-08-23 02:42:30 +00002000 iKey = p->sParse.aNode[p->sParse.aUp[p->i]].u.iKey;
drh505ad2c2015-08-21 17:33:11 +00002001 }else{
2002 iKey = p->iRowid;
2003 }
drh6fd5c1e2015-08-21 20:37:12 +00002004 sqlite3_result_int64(ctx, (sqlite3_int64)iKey);
drhcb6c6c62015-08-19 22:47:17 +00002005 }
2006 break;
2007 }
2008 case JEACH_VALUE: {
drh852944e2015-09-10 03:29:11 +00002009 if( pThis->jnFlags & JNODE_LABEL ) pThis++;
drh505ad2c2015-08-21 17:33:11 +00002010 jsonReturn(pThis, ctx, 0);
2011 break;
2012 }
2013 case JEACH_TYPE: {
drh852944e2015-09-10 03:29:11 +00002014 if( pThis->jnFlags & JNODE_LABEL ) pThis++;
drh505ad2c2015-08-21 17:33:11 +00002015 sqlite3_result_text(ctx, jsonType[pThis->eType], -1, SQLITE_STATIC);
2016 break;
2017 }
2018 case JEACH_ATOM: {
drh852944e2015-09-10 03:29:11 +00002019 if( pThis->jnFlags & JNODE_LABEL ) pThis++;
drh505ad2c2015-08-21 17:33:11 +00002020 if( pThis->eType>=JSON_ARRAY ) break;
2021 jsonReturn(pThis, ctx, 0);
2022 break;
2023 }
2024 case JEACH_ID: {
drh852944e2015-09-10 03:29:11 +00002025 sqlite3_result_int64(ctx,
2026 (sqlite3_int64)p->i + ((pThis->jnFlags & JNODE_LABEL)!=0));
drh505ad2c2015-08-21 17:33:11 +00002027 break;
2028 }
2029 case JEACH_PARENT: {
drh852944e2015-09-10 03:29:11 +00002030 if( p->i>p->iBegin && p->bRecursive ){
drh6fd5c1e2015-08-21 20:37:12 +00002031 sqlite3_result_int64(ctx, (sqlite3_int64)p->sParse.aUp[p->i]);
drhcb6c6c62015-08-19 22:47:17 +00002032 }
2033 break;
2034 }
drh4af352d2015-08-21 20:02:48 +00002035 case JEACH_FULLKEY: {
2036 JsonString x;
2037 jsonInit(&x, ctx);
2038 if( p->bRecursive ){
2039 jsonEachComputePath(p, &x, p->i);
2040 }else{
drh383de692015-09-10 17:20:57 +00002041 if( p->zRoot ){
2042 jsonAppendRaw(&x, p->zRoot, (int)strlen(p->zRoot));
drh4af352d2015-08-21 20:02:48 +00002043 }else{
2044 jsonAppendChar(&x, '$');
2045 }
2046 if( p->eType==JSON_ARRAY ){
2047 jsonPrintf(30, &x, "[%d]", p->iRowid);
2048 }else{
2049 jsonPrintf(pThis->n, &x, ".%.*s", pThis->n-2, pThis->u.zJContent+1);
2050 }
2051 }
2052 jsonResult(&x);
2053 break;
2054 }
drhcb6c6c62015-08-19 22:47:17 +00002055 case JEACH_PATH: {
drh383de692015-09-10 17:20:57 +00002056 if( p->bRecursive ){
2057 JsonString x;
2058 jsonInit(&x, ctx);
2059 jsonEachComputePath(p, &x, p->sParse.aUp[p->i]);
2060 jsonResult(&x);
2061 break;
drh4af352d2015-08-21 20:02:48 +00002062 }
drh383de692015-09-10 17:20:57 +00002063 /* For json_each() path and root are the same so fall through
2064 ** into the root case */
2065 }
drh6850a632016-11-07 18:18:08 +00002066 default: {
drh383de692015-09-10 17:20:57 +00002067 const char *zRoot = p->zRoot;
drh6850a632016-11-07 18:18:08 +00002068 if( zRoot==0 ) zRoot = "$";
drh383de692015-09-10 17:20:57 +00002069 sqlite3_result_text(ctx, zRoot, -1, SQLITE_STATIC);
drhcb6c6c62015-08-19 22:47:17 +00002070 break;
2071 }
drh3d1d2a92015-09-22 01:15:49 +00002072 case JEACH_JSON: {
drh505ad2c2015-08-21 17:33:11 +00002073 assert( i==JEACH_JSON );
drhcb6c6c62015-08-19 22:47:17 +00002074 sqlite3_result_text(ctx, p->sParse.zJson, -1, SQLITE_STATIC);
2075 break;
2076 }
2077 }
2078 return SQLITE_OK;
2079}
2080
2081/* Return the current rowid value */
2082static int jsonEachRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
2083 JsonEachCursor *p = (JsonEachCursor*)cur;
2084 *pRowid = p->iRowid;
2085 return SQLITE_OK;
2086}
2087
2088/* The query strategy is to look for an equality constraint on the json
2089** column. Without such a constraint, the table cannot operate. idxNum is
drh383de692015-09-10 17:20:57 +00002090** 1 if the constraint is found, 3 if the constraint and zRoot are found,
drhcb6c6c62015-08-19 22:47:17 +00002091** and 0 otherwise.
2092*/
2093static int jsonEachBestIndex(
2094 sqlite3_vtab *tab,
2095 sqlite3_index_info *pIdxInfo
2096){
2097 int i;
2098 int jsonIdx = -1;
drh383de692015-09-10 17:20:57 +00002099 int rootIdx = -1;
drhcb6c6c62015-08-19 22:47:17 +00002100 const struct sqlite3_index_constraint *pConstraint;
drh6fd5c1e2015-08-21 20:37:12 +00002101
2102 UNUSED_PARAM(tab);
drhcb6c6c62015-08-19 22:47:17 +00002103 pConstraint = pIdxInfo->aConstraint;
2104 for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){
2105 if( pConstraint->usable==0 ) continue;
2106 if( pConstraint->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue;
2107 switch( pConstraint->iColumn ){
2108 case JEACH_JSON: jsonIdx = i; break;
drh383de692015-09-10 17:20:57 +00002109 case JEACH_ROOT: rootIdx = i; break;
drhcb6c6c62015-08-19 22:47:17 +00002110 default: /* no-op */ break;
2111 }
2112 }
2113 if( jsonIdx<0 ){
2114 pIdxInfo->idxNum = 0;
drh505ad2c2015-08-21 17:33:11 +00002115 pIdxInfo->estimatedCost = 1e99;
drhcb6c6c62015-08-19 22:47:17 +00002116 }else{
drh505ad2c2015-08-21 17:33:11 +00002117 pIdxInfo->estimatedCost = 1.0;
drhcb6c6c62015-08-19 22:47:17 +00002118 pIdxInfo->aConstraintUsage[jsonIdx].argvIndex = 1;
2119 pIdxInfo->aConstraintUsage[jsonIdx].omit = 1;
drh383de692015-09-10 17:20:57 +00002120 if( rootIdx<0 ){
drhcb6c6c62015-08-19 22:47:17 +00002121 pIdxInfo->idxNum = 1;
2122 }else{
drh383de692015-09-10 17:20:57 +00002123 pIdxInfo->aConstraintUsage[rootIdx].argvIndex = 2;
2124 pIdxInfo->aConstraintUsage[rootIdx].omit = 1;
drhcb6c6c62015-08-19 22:47:17 +00002125 pIdxInfo->idxNum = 3;
2126 }
2127 }
2128 return SQLITE_OK;
2129}
2130
2131/* Start a search on a new JSON string */
2132static int jsonEachFilter(
2133 sqlite3_vtab_cursor *cur,
2134 int idxNum, const char *idxStr,
2135 int argc, sqlite3_value **argv
2136){
2137 JsonEachCursor *p = (JsonEachCursor*)cur;
2138 const char *z;
mistachkin16a93122015-09-11 18:05:01 +00002139 const char *zRoot = 0;
drhcb6c6c62015-08-19 22:47:17 +00002140 sqlite3_int64 n;
2141
drh6fd5c1e2015-08-21 20:37:12 +00002142 UNUSED_PARAM(idxStr);
2143 UNUSED_PARAM(argc);
drhcb6c6c62015-08-19 22:47:17 +00002144 jsonEachCursorReset(p);
2145 if( idxNum==0 ) return SQLITE_OK;
2146 z = (const char*)sqlite3_value_text(argv[0]);
2147 if( z==0 ) return SQLITE_OK;
drhcb6c6c62015-08-19 22:47:17 +00002148 n = sqlite3_value_bytes(argv[0]);
drh6fd5c1e2015-08-21 20:37:12 +00002149 p->zJson = sqlite3_malloc64( n+1 );
drhcb6c6c62015-08-19 22:47:17 +00002150 if( p->zJson==0 ) return SQLITE_NOMEM;
drh6fd5c1e2015-08-21 20:37:12 +00002151 memcpy(p->zJson, z, (size_t)n+1);
drha7714022015-08-29 00:54:49 +00002152 if( jsonParse(&p->sParse, 0, p->zJson) ){
2153 int rc = SQLITE_NOMEM;
2154 if( p->sParse.oom==0 ){
2155 sqlite3_free(cur->pVtab->zErrMsg);
2156 cur->pVtab->zErrMsg = sqlite3_mprintf("malformed JSON");
2157 if( cur->pVtab->zErrMsg ) rc = SQLITE_ERROR;
2158 }
drhcb6c6c62015-08-19 22:47:17 +00002159 jsonEachCursorReset(p);
drha7714022015-08-29 00:54:49 +00002160 return rc;
2161 }else if( p->bRecursive && jsonParseFindParents(&p->sParse) ){
2162 jsonEachCursorReset(p);
2163 return SQLITE_NOMEM;
drhcb6c6c62015-08-19 22:47:17 +00002164 }else{
drh95677942015-09-24 01:06:37 +00002165 JsonNode *pNode = 0;
drhcb6c6c62015-08-19 22:47:17 +00002166 if( idxNum==3 ){
drha7714022015-08-29 00:54:49 +00002167 const char *zErr = 0;
drha8f39a92015-09-21 22:53:16 +00002168 zRoot = (const char*)sqlite3_value_text(argv[1]);
2169 if( zRoot==0 ) return SQLITE_OK;
drhcb6c6c62015-08-19 22:47:17 +00002170 n = sqlite3_value_bytes(argv[1]);
drh383de692015-09-10 17:20:57 +00002171 p->zRoot = sqlite3_malloc64( n+1 );
2172 if( p->zRoot==0 ) return SQLITE_NOMEM;
2173 memcpy(p->zRoot, zRoot, (size_t)n+1);
drha8f39a92015-09-21 22:53:16 +00002174 if( zRoot[0]!='$' ){
2175 zErr = zRoot;
2176 }else{
2177 pNode = jsonLookupStep(&p->sParse, 0, p->zRoot+1, 0, &zErr);
2178 }
2179 if( zErr ){
drha7714022015-08-29 00:54:49 +00002180 sqlite3_free(cur->pVtab->zErrMsg);
2181 cur->pVtab->zErrMsg = jsonPathSyntaxError(zErr);
drhcb6c6c62015-08-19 22:47:17 +00002182 jsonEachCursorReset(p);
drha7714022015-08-29 00:54:49 +00002183 return cur->pVtab->zErrMsg ? SQLITE_ERROR : SQLITE_NOMEM;
2184 }else if( pNode==0 ){
drhcb6c6c62015-08-19 22:47:17 +00002185 return SQLITE_OK;
2186 }
2187 }else{
2188 pNode = p->sParse.aNode;
2189 }
drh852944e2015-09-10 03:29:11 +00002190 p->iBegin = p->i = (int)(pNode - p->sParse.aNode);
drhcb6c6c62015-08-19 22:47:17 +00002191 p->eType = pNode->eType;
2192 if( p->eType>=JSON_ARRAY ){
drh8784eca2015-08-23 02:42:30 +00002193 pNode->u.iKey = 0;
drhc3722b22015-08-23 20:44:59 +00002194 p->iEnd = p->i + pNode->n + 1;
drh852944e2015-09-10 03:29:11 +00002195 if( p->bRecursive ){
drh3d1d2a92015-09-22 01:15:49 +00002196 p->eType = p->sParse.aNode[p->sParse.aUp[p->i]].eType;
drh852944e2015-09-10 03:29:11 +00002197 if( p->i>0 && (p->sParse.aNode[p->i-1].jnFlags & JNODE_LABEL)!=0 ){
2198 p->i--;
2199 }
2200 }else{
2201 p->i++;
2202 }
drhcb6c6c62015-08-19 22:47:17 +00002203 }else{
2204 p->iEnd = p->i+1;
2205 }
2206 }
drha8f39a92015-09-21 22:53:16 +00002207 return SQLITE_OK;
drhcb6c6c62015-08-19 22:47:17 +00002208}
2209
2210/* The methods of the json_each virtual table */
2211static sqlite3_module jsonEachModule = {
2212 0, /* iVersion */
2213 0, /* xCreate */
2214 jsonEachConnect, /* xConnect */
2215 jsonEachBestIndex, /* xBestIndex */
2216 jsonEachDisconnect, /* xDisconnect */
2217 0, /* xDestroy */
drh505ad2c2015-08-21 17:33:11 +00002218 jsonEachOpenEach, /* xOpen - open a cursor */
drhcb6c6c62015-08-19 22:47:17 +00002219 jsonEachClose, /* xClose - close a cursor */
2220 jsonEachFilter, /* xFilter - configure scan constraints */
drh4af352d2015-08-21 20:02:48 +00002221 jsonEachNext, /* xNext - advance a cursor */
drhcb6c6c62015-08-19 22:47:17 +00002222 jsonEachEof, /* xEof - check for end of scan */
2223 jsonEachColumn, /* xColumn - read data */
2224 jsonEachRowid, /* xRowid - read data */
2225 0, /* xUpdate */
2226 0, /* xBegin */
2227 0, /* xSync */
2228 0, /* xCommit */
2229 0, /* xRollback */
2230 0, /* xFindMethod */
2231 0, /* xRename */
drh6fd5c1e2015-08-21 20:37:12 +00002232 0, /* xSavepoint */
2233 0, /* xRelease */
2234 0 /* xRollbackTo */
drhcb6c6c62015-08-19 22:47:17 +00002235};
2236
drh505ad2c2015-08-21 17:33:11 +00002237/* The methods of the json_tree virtual table. */
2238static sqlite3_module jsonTreeModule = {
2239 0, /* iVersion */
2240 0, /* xCreate */
2241 jsonEachConnect, /* xConnect */
2242 jsonEachBestIndex, /* xBestIndex */
2243 jsonEachDisconnect, /* xDisconnect */
2244 0, /* xDestroy */
2245 jsonEachOpenTree, /* xOpen - open a cursor */
2246 jsonEachClose, /* xClose - close a cursor */
2247 jsonEachFilter, /* xFilter - configure scan constraints */
drh4af352d2015-08-21 20:02:48 +00002248 jsonEachNext, /* xNext - advance a cursor */
drh505ad2c2015-08-21 17:33:11 +00002249 jsonEachEof, /* xEof - check for end of scan */
2250 jsonEachColumn, /* xColumn - read data */
2251 jsonEachRowid, /* xRowid - read data */
2252 0, /* xUpdate */
2253 0, /* xBegin */
2254 0, /* xSync */
2255 0, /* xCommit */
2256 0, /* xRollback */
2257 0, /* xFindMethod */
2258 0, /* xRename */
drh6fd5c1e2015-08-21 20:37:12 +00002259 0, /* xSavepoint */
2260 0, /* xRelease */
2261 0 /* xRollbackTo */
drh505ad2c2015-08-21 17:33:11 +00002262};
drhd2975922015-08-29 17:22:33 +00002263#endif /* SQLITE_OMIT_VIRTUALTABLE */
drh505ad2c2015-08-21 17:33:11 +00002264
2265/****************************************************************************
drh2f20e132015-09-26 17:44:59 +00002266** The following routines are the only publically visible identifiers in this
2267** file. Call the following routines in order to register the various SQL
drh505ad2c2015-08-21 17:33:11 +00002268** functions and the virtual table implemented by this file.
2269****************************************************************************/
drhcb6c6c62015-08-19 22:47:17 +00002270
drh2f20e132015-09-26 17:44:59 +00002271int sqlite3Json1Init(sqlite3 *db){
drh5fa5c102015-08-12 16:49:40 +00002272 int rc = SQLITE_OK;
drh6fd5c1e2015-08-21 20:37:12 +00002273 unsigned int i;
drh5fa5c102015-08-12 16:49:40 +00002274 static const struct {
2275 const char *zName;
2276 int nArg;
drh52216ad2015-08-18 02:28:03 +00002277 int flag;
drh5fa5c102015-08-12 16:49:40 +00002278 void (*xFunc)(sqlite3_context*,int,sqlite3_value**);
2279 } aFunc[] = {
drhf5ddb9c2015-09-11 00:06:41 +00002280 { "json", 1, 0, jsonRemoveFunc },
drh52216ad2015-08-18 02:28:03 +00002281 { "json_array", -1, 0, jsonArrayFunc },
2282 { "json_array_length", 1, 0, jsonArrayLengthFunc },
2283 { "json_array_length", 2, 0, jsonArrayLengthFunc },
drh3ad93bb2015-08-29 19:41:45 +00002284 { "json_extract", -1, 0, jsonExtractFunc },
drh52216ad2015-08-18 02:28:03 +00002285 { "json_insert", -1, 0, jsonSetFunc },
2286 { "json_object", -1, 0, jsonObjectFunc },
drh37f03df2017-03-23 20:33:49 +00002287 { "json_patch", 2, 0, jsonPatchFunc },
drh2ad96f52016-06-17 13:01:51 +00002288 { "json_quote", 1, 0, jsonQuoteFunc },
drh52216ad2015-08-18 02:28:03 +00002289 { "json_remove", -1, 0, jsonRemoveFunc },
2290 { "json_replace", -1, 0, jsonReplaceFunc },
2291 { "json_set", -1, 1, jsonSetFunc },
2292 { "json_type", 1, 0, jsonTypeFunc },
2293 { "json_type", 2, 0, jsonTypeFunc },
drhbc8f0922015-08-22 19:39:04 +00002294 { "json_valid", 1, 0, jsonValidFunc },
drh987eb1f2015-08-17 15:17:37 +00002295
drh301eecc2015-08-17 20:14:19 +00002296#if SQLITE_DEBUG
drh987eb1f2015-08-17 15:17:37 +00002297 /* DEBUG and TESTING functions */
drh52216ad2015-08-18 02:28:03 +00002298 { "json_parse", 1, 0, jsonParseFunc },
2299 { "json_test1", 1, 0, jsonTest1Func },
drh301eecc2015-08-17 20:14:19 +00002300#endif
drh5fa5c102015-08-12 16:49:40 +00002301 };
drhff135ae2015-12-30 01:07:02 +00002302 static const struct {
2303 const char *zName;
2304 int nArg;
2305 void (*xStep)(sqlite3_context*,int,sqlite3_value**);
2306 void (*xFinal)(sqlite3_context*);
2307 } aAgg[] = {
2308 { "json_group_array", 1, jsonArrayStep, jsonArrayFinal },
2309 { "json_group_object", 2, jsonObjectStep, jsonObjectFinal },
2310 };
drhd2975922015-08-29 17:22:33 +00002311#ifndef SQLITE_OMIT_VIRTUALTABLE
drh505ad2c2015-08-21 17:33:11 +00002312 static const struct {
2313 const char *zName;
2314 sqlite3_module *pModule;
2315 } aMod[] = {
2316 { "json_each", &jsonEachModule },
2317 { "json_tree", &jsonTreeModule },
2318 };
drhd2975922015-08-29 17:22:33 +00002319#endif
drh5fa5c102015-08-12 16:49:40 +00002320 for(i=0; i<sizeof(aFunc)/sizeof(aFunc[0]) && rc==SQLITE_OK; i++){
2321 rc = sqlite3_create_function(db, aFunc[i].zName, aFunc[i].nArg,
drh52216ad2015-08-18 02:28:03 +00002322 SQLITE_UTF8 | SQLITE_DETERMINISTIC,
2323 (void*)&aFunc[i].flag,
drh5fa5c102015-08-12 16:49:40 +00002324 aFunc[i].xFunc, 0, 0);
2325 }
drhff135ae2015-12-30 01:07:02 +00002326 for(i=0; i<sizeof(aAgg)/sizeof(aAgg[0]) && rc==SQLITE_OK; i++){
2327 rc = sqlite3_create_function(db, aAgg[i].zName, aAgg[i].nArg,
2328 SQLITE_UTF8 | SQLITE_DETERMINISTIC, 0,
2329 0, aAgg[i].xStep, aAgg[i].xFinal);
2330 }
drhd2975922015-08-29 17:22:33 +00002331#ifndef SQLITE_OMIT_VIRTUALTABLE
drh505ad2c2015-08-21 17:33:11 +00002332 for(i=0; i<sizeof(aMod)/sizeof(aMod[0]) && rc==SQLITE_OK; i++){
2333 rc = sqlite3_create_module(db, aMod[i].zName, aMod[i].pModule, 0);
drhcb6c6c62015-08-19 22:47:17 +00002334 }
drhd2975922015-08-29 17:22:33 +00002335#endif
drh5fa5c102015-08-12 16:49:40 +00002336 return rc;
2337}
drh2f20e132015-09-26 17:44:59 +00002338
2339
dan8d32e802015-10-14 18:45:42 +00002340#ifndef SQLITE_CORE
drh2f20e132015-09-26 17:44:59 +00002341#ifdef _WIN32
2342__declspec(dllexport)
2343#endif
2344int sqlite3_json_init(
2345 sqlite3 *db,
2346 char **pzErrMsg,
2347 const sqlite3_api_routines *pApi
2348){
2349 SQLITE_EXTENSION_INIT2(pApi);
2350 (void)pzErrMsg; /* Unused parameter */
2351 return sqlite3Json1Init(db);
2352}
dan8d32e802015-10-14 18:45:42 +00002353#endif
drh50065652015-10-08 19:29:18 +00002354#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_JSON1) */