blob: 839e133bf2786f0bde05e04144450a98fe042b25 [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)
drhf2df7e72015-08-28 20:07:40 +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 */
drhd0960592015-08-17 21:22:32 +0000141#define JNODE_REPLACE 0x08 /* Replace with JsonNode.iVal */
drh52216ad2015-08-18 02:28:03 +0000142#define JNODE_APPEND 0x10 /* More ARRAY/OBJECT entries at u.iAppend */
drhf5ddb9c2015-09-11 00:06:41 +0000143#define JNODE_LABEL 0x20 /* Is a label of an object */
drh301eecc2015-08-17 20:14:19 +0000144
drh987eb1f2015-08-17 15:17:37 +0000145
drhe9c37f32015-08-15 21:25:36 +0000146/* A single node of parsed JSON
147*/
drhe9c37f32015-08-15 21:25:36 +0000148struct JsonNode {
drh5634cc02015-08-17 11:28:03 +0000149 u8 eType; /* One of the JSON_ type values */
drh301eecc2015-08-17 20:14:19 +0000150 u8 jnFlags; /* JNODE flags */
drhd0960592015-08-17 21:22:32 +0000151 u8 iVal; /* Replacement value when JNODE_REPLACE */
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() */
drh52216ad2015-08-18 02:28:03 +0000157 } u;
drhe9c37f32015-08-15 21:25:36 +0000158};
159
160/* A completely parsed JSON string
161*/
drhe9c37f32015-08-15 21:25:36 +0000162struct JsonParse {
163 u32 nNode; /* Number of slots of aNode[] used */
164 u32 nAlloc; /* Number of slots of aNode[] allocated */
165 JsonNode *aNode; /* Array of nodes containing the parse */
166 const char *zJson; /* Original JSON string */
drh505ad2c2015-08-21 17:33:11 +0000167 u32 *aUp; /* Index of parent of each node */
drhe9c37f32015-08-15 21:25:36 +0000168 u8 oom; /* Set to true if out of memory */
drha7714022015-08-29 00:54:49 +0000169 u8 nErr; /* Number of errors seen */
drhe9c37f32015-08-15 21:25:36 +0000170};
171
drh505ad2c2015-08-21 17:33:11 +0000172/**************************************************************************
173** Utility routines for dealing with JsonString objects
174**************************************************************************/
drh301eecc2015-08-17 20:14:19 +0000175
drh505ad2c2015-08-21 17:33:11 +0000176/* Set the JsonString object to an empty string
drh5fa5c102015-08-12 16:49:40 +0000177*/
drh505ad2c2015-08-21 17:33:11 +0000178static void jsonZero(JsonString *p){
drh5fa5c102015-08-12 16:49:40 +0000179 p->zBuf = p->zSpace;
180 p->nAlloc = sizeof(p->zSpace);
181 p->nUsed = 0;
182 p->bStatic = 1;
183}
184
drh505ad2c2015-08-21 17:33:11 +0000185/* Initialize the JsonString object
drh5fa5c102015-08-12 16:49:40 +0000186*/
drh505ad2c2015-08-21 17:33:11 +0000187static void jsonInit(JsonString *p, sqlite3_context *pCtx){
drh5fa5c102015-08-12 16:49:40 +0000188 p->pCtx = pCtx;
drhd0960592015-08-17 21:22:32 +0000189 p->bErr = 0;
drh5fa5c102015-08-12 16:49:40 +0000190 jsonZero(p);
191}
192
193
drh505ad2c2015-08-21 17:33:11 +0000194/* Free all allocated memory and reset the JsonString object back to its
drh5fa5c102015-08-12 16:49:40 +0000195** initial state.
196*/
drh505ad2c2015-08-21 17:33:11 +0000197static void jsonReset(JsonString *p){
drh5fa5c102015-08-12 16:49:40 +0000198 if( !p->bStatic ) sqlite3_free(p->zBuf);
199 jsonZero(p);
200}
201
202
203/* Report an out-of-memory (OOM) condition
204*/
drh505ad2c2015-08-21 17:33:11 +0000205static void jsonOom(JsonString *p){
drh3d1d2a92015-09-22 01:15:49 +0000206 p->bErr = 1;
207 sqlite3_result_error_nomem(p->pCtx);
208 jsonReset(p);
drh5fa5c102015-08-12 16:49:40 +0000209}
210
211/* Enlarge pJson->zBuf so that it can hold at least N more bytes.
212** Return zero on success. Return non-zero on an OOM error
213*/
drh505ad2c2015-08-21 17:33:11 +0000214static int jsonGrow(JsonString *p, u32 N){
drh301eecc2015-08-17 20:14:19 +0000215 u64 nTotal = N<p->nAlloc ? p->nAlloc*2 : p->nAlloc+N+10;
drh5fa5c102015-08-12 16:49:40 +0000216 char *zNew;
217 if( p->bStatic ){
drhd0960592015-08-17 21:22:32 +0000218 if( p->bErr ) return 1;
drh5fa5c102015-08-12 16:49:40 +0000219 zNew = sqlite3_malloc64(nTotal);
220 if( zNew==0 ){
221 jsonOom(p);
222 return SQLITE_NOMEM;
223 }
drh6fd5c1e2015-08-21 20:37:12 +0000224 memcpy(zNew, p->zBuf, (size_t)p->nUsed);
drh5fa5c102015-08-12 16:49:40 +0000225 p->zBuf = zNew;
226 p->bStatic = 0;
227 }else{
228 zNew = sqlite3_realloc64(p->zBuf, nTotal);
229 if( zNew==0 ){
230 jsonOom(p);
231 return SQLITE_NOMEM;
232 }
233 p->zBuf = zNew;
234 }
235 p->nAlloc = nTotal;
236 return SQLITE_OK;
237}
238
drh505ad2c2015-08-21 17:33:11 +0000239/* Append N bytes from zIn onto the end of the JsonString string.
drh5fa5c102015-08-12 16:49:40 +0000240*/
drh505ad2c2015-08-21 17:33:11 +0000241static void jsonAppendRaw(JsonString *p, const char *zIn, u32 N){
drh5fa5c102015-08-12 16:49:40 +0000242 if( (N+p->nUsed >= p->nAlloc) && jsonGrow(p,N)!=0 ) return;
243 memcpy(p->zBuf+p->nUsed, zIn, N);
244 p->nUsed += N;
245}
246
drh4af352d2015-08-21 20:02:48 +0000247/* Append formatted text (not to exceed N bytes) to the JsonString.
248*/
249static void jsonPrintf(int N, JsonString *p, const char *zFormat, ...){
250 va_list ap;
251 if( (p->nUsed + N >= p->nAlloc) && jsonGrow(p, N) ) return;
252 va_start(ap, zFormat);
253 sqlite3_vsnprintf(N, p->zBuf+p->nUsed, zFormat, ap);
254 va_end(ap);
255 p->nUsed += (int)strlen(p->zBuf+p->nUsed);
256}
257
drh5634cc02015-08-17 11:28:03 +0000258/* Append a single character
259*/
drh505ad2c2015-08-21 17:33:11 +0000260static void jsonAppendChar(JsonString *p, char c){
drh5634cc02015-08-17 11:28:03 +0000261 if( p->nUsed>=p->nAlloc && jsonGrow(p,1)!=0 ) return;
262 p->zBuf[p->nUsed++] = c;
263}
264
drh301eecc2015-08-17 20:14:19 +0000265/* Append a comma separator to the output buffer, if the previous
266** character is not '[' or '{'.
267*/
drh505ad2c2015-08-21 17:33:11 +0000268static void jsonAppendSeparator(JsonString *p){
drh301eecc2015-08-17 20:14:19 +0000269 char c;
270 if( p->nUsed==0 ) return;
271 c = p->zBuf[p->nUsed-1];
272 if( c!='[' && c!='{' ) jsonAppendChar(p, ',');
273}
274
drh505ad2c2015-08-21 17:33:11 +0000275/* Append the N-byte string in zIn to the end of the JsonString string
drh5fa5c102015-08-12 16:49:40 +0000276** under construction. Enclose the string in "..." and escape
277** any double-quotes or backslash characters contained within the
278** string.
279*/
drh505ad2c2015-08-21 17:33:11 +0000280static void jsonAppendString(JsonString *p, const char *zIn, u32 N){
drh5fa5c102015-08-12 16:49:40 +0000281 u32 i;
282 if( (N+p->nUsed+2 >= p->nAlloc) && jsonGrow(p,N+2)!=0 ) return;
283 p->zBuf[p->nUsed++] = '"';
284 for(i=0; i<N; i++){
drh3b7f9a62016-02-04 10:28:57 +0000285 unsigned char c = ((unsigned const char*)zIn)[i];
drh5fa5c102015-08-12 16:49:40 +0000286 if( c=='"' || c=='\\' ){
drh3b7f9a62016-02-04 10:28:57 +0000287 json_simple_escape:
drh4977ccf2015-09-19 11:57:26 +0000288 if( (p->nUsed+N+3-i > p->nAlloc) && jsonGrow(p,N+3-i)!=0 ) return;
drh5fa5c102015-08-12 16:49:40 +0000289 p->zBuf[p->nUsed++] = '\\';
drh3b7f9a62016-02-04 10:28:57 +0000290 }else if( c<=0x1f ){
291 static const char aSpecial[] = {
292 0, 0, 0, 0, 0, 0, 0, 0, 'b', 't', 'n', 0, 'f', 'r', 0, 0,
293 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
294 };
295 assert( sizeof(aSpecial)==32 );
296 assert( aSpecial['\b']=='b' );
297 assert( aSpecial['\f']=='f' );
298 assert( aSpecial['\n']=='n' );
299 assert( aSpecial['\r']=='r' );
300 assert( aSpecial['\t']=='t' );
301 if( aSpecial[c] ){
302 c = aSpecial[c];
303 goto json_simple_escape;
304 }
305 if( (p->nUsed+N+7+i > p->nAlloc) && jsonGrow(p,N+7-i)!=0 ) return;
306 p->zBuf[p->nUsed++] = '\\';
307 p->zBuf[p->nUsed++] = 'u';
308 p->zBuf[p->nUsed++] = '0';
309 p->zBuf[p->nUsed++] = '0';
310 p->zBuf[p->nUsed++] = '0' + (c>>4);
311 c = "0123456789abcdef"[c&0xf];
drh5fa5c102015-08-12 16:49:40 +0000312 }
313 p->zBuf[p->nUsed++] = c;
314 }
315 p->zBuf[p->nUsed++] = '"';
drh4977ccf2015-09-19 11:57:26 +0000316 assert( p->nUsed<p->nAlloc );
drh5fa5c102015-08-12 16:49:40 +0000317}
318
drhd0960592015-08-17 21:22:32 +0000319/*
320** Append a function parameter value to the JSON string under
321** construction.
322*/
323static void jsonAppendValue(
drh505ad2c2015-08-21 17:33:11 +0000324 JsonString *p, /* Append to this JSON string */
drhf5ddb9c2015-09-11 00:06:41 +0000325 sqlite3_value *pValue /* Value to append */
drhd0960592015-08-17 21:22:32 +0000326){
327 switch( sqlite3_value_type(pValue) ){
328 case SQLITE_NULL: {
329 jsonAppendRaw(p, "null", 4);
330 break;
331 }
332 case SQLITE_INTEGER:
333 case SQLITE_FLOAT: {
334 const char *z = (const char*)sqlite3_value_text(pValue);
335 u32 n = (u32)sqlite3_value_bytes(pValue);
336 jsonAppendRaw(p, z, n);
337 break;
338 }
339 case SQLITE_TEXT: {
340 const char *z = (const char*)sqlite3_value_text(pValue);
341 u32 n = (u32)sqlite3_value_bytes(pValue);
drhf5ddb9c2015-09-11 00:06:41 +0000342 if( sqlite3_value_subtype(pValue)==JSON_SUBTYPE ){
drhecb5fed2015-08-28 03:33:50 +0000343 jsonAppendRaw(p, z, n);
344 }else{
345 jsonAppendString(p, z, n);
346 }
drhd0960592015-08-17 21:22:32 +0000347 break;
348 }
349 default: {
350 if( p->bErr==0 ){
351 sqlite3_result_error(p->pCtx, "JSON cannot hold BLOB values", -1);
drh4a642b62016-02-05 01:55:27 +0000352 p->bErr = 2;
drhd0960592015-08-17 21:22:32 +0000353 jsonReset(p);
354 }
355 break;
356 }
357 }
358}
359
360
drhbd0621b2015-08-13 13:54:59 +0000361/* Make the JSON in p the result of the SQL function.
drh5fa5c102015-08-12 16:49:40 +0000362*/
drh505ad2c2015-08-21 17:33:11 +0000363static void jsonResult(JsonString *p){
drhd0960592015-08-17 21:22:32 +0000364 if( p->bErr==0 ){
drh5fa5c102015-08-12 16:49:40 +0000365 sqlite3_result_text64(p->pCtx, p->zBuf, p->nUsed,
366 p->bStatic ? SQLITE_TRANSIENT : sqlite3_free,
367 SQLITE_UTF8);
368 jsonZero(p);
369 }
370 assert( p->bStatic );
371}
372
drh505ad2c2015-08-21 17:33:11 +0000373/**************************************************************************
374** Utility routines for dealing with JsonNode and JsonParse objects
375**************************************************************************/
376
377/*
378** Return the number of consecutive JsonNode slots need to represent
379** the parsed JSON at pNode. The minimum answer is 1. For ARRAY and
380** OBJECT types, the number might be larger.
381**
382** Appended elements are not counted. The value returned is the number
383** by which the JsonNode counter should increment in order to go to the
384** next peer value.
385*/
386static u32 jsonNodeSize(JsonNode *pNode){
387 return pNode->eType>=JSON_ARRAY ? pNode->n+1 : 1;
388}
389
390/*
391** Reclaim all memory allocated by a JsonParse object. But do not
392** delete the JsonParse object itself.
393*/
394static void jsonParseReset(JsonParse *pParse){
395 sqlite3_free(pParse->aNode);
396 pParse->aNode = 0;
397 pParse->nNode = 0;
398 pParse->nAlloc = 0;
399 sqlite3_free(pParse->aUp);
400 pParse->aUp = 0;
401}
402
drh5634cc02015-08-17 11:28:03 +0000403/*
404** Convert the JsonNode pNode into a pure JSON string and
405** append to pOut. Subsubstructure is also included. Return
406** the number of JsonNode objects that are encoded.
drhbd0621b2015-08-13 13:54:59 +0000407*/
drh52216ad2015-08-18 02:28:03 +0000408static void jsonRenderNode(
drhd0960592015-08-17 21:22:32 +0000409 JsonNode *pNode, /* The node to render */
drh505ad2c2015-08-21 17:33:11 +0000410 JsonString *pOut, /* Write JSON here */
drhd0960592015-08-17 21:22:32 +0000411 sqlite3_value **aReplace /* Replacement values */
412){
drh5634cc02015-08-17 11:28:03 +0000413 switch( pNode->eType ){
drha8f39a92015-09-21 22:53:16 +0000414 default: {
415 assert( pNode->eType==JSON_NULL );
drh5634cc02015-08-17 11:28:03 +0000416 jsonAppendRaw(pOut, "null", 4);
417 break;
418 }
419 case JSON_TRUE: {
420 jsonAppendRaw(pOut, "true", 4);
421 break;
422 }
423 case JSON_FALSE: {
424 jsonAppendRaw(pOut, "false", 5);
425 break;
426 }
427 case JSON_STRING: {
drh301eecc2015-08-17 20:14:19 +0000428 if( pNode->jnFlags & JNODE_RAW ){
drh52216ad2015-08-18 02:28:03 +0000429 jsonAppendString(pOut, pNode->u.zJContent, pNode->n);
drh5634cc02015-08-17 11:28:03 +0000430 break;
431 }
432 /* Fall through into the next case */
433 }
434 case JSON_REAL:
435 case JSON_INT: {
drh52216ad2015-08-18 02:28:03 +0000436 jsonAppendRaw(pOut, pNode->u.zJContent, pNode->n);
drh5634cc02015-08-17 11:28:03 +0000437 break;
438 }
439 case JSON_ARRAY: {
drh52216ad2015-08-18 02:28:03 +0000440 u32 j = 1;
drh5634cc02015-08-17 11:28:03 +0000441 jsonAppendChar(pOut, '[');
drh52216ad2015-08-18 02:28:03 +0000442 for(;;){
443 while( j<=pNode->n ){
444 if( pNode[j].jnFlags & (JNODE_REMOVE|JNODE_REPLACE) ){
445 if( pNode[j].jnFlags & JNODE_REPLACE ){
446 jsonAppendSeparator(pOut);
drhf5ddb9c2015-09-11 00:06:41 +0000447 jsonAppendValue(pOut, aReplace[pNode[j].iVal]);
drh52216ad2015-08-18 02:28:03 +0000448 }
449 }else{
drhd0960592015-08-17 21:22:32 +0000450 jsonAppendSeparator(pOut);
drh52216ad2015-08-18 02:28:03 +0000451 jsonRenderNode(&pNode[j], pOut, aReplace);
drhd0960592015-08-17 21:22:32 +0000452 }
drh505ad2c2015-08-21 17:33:11 +0000453 j += jsonNodeSize(&pNode[j]);
drh301eecc2015-08-17 20:14:19 +0000454 }
drh52216ad2015-08-18 02:28:03 +0000455 if( (pNode->jnFlags & JNODE_APPEND)==0 ) break;
456 pNode = &pNode[pNode->u.iAppend];
457 j = 1;
drh5634cc02015-08-17 11:28:03 +0000458 }
459 jsonAppendChar(pOut, ']');
460 break;
461 }
462 case JSON_OBJECT: {
drh52216ad2015-08-18 02:28:03 +0000463 u32 j = 1;
drh5634cc02015-08-17 11:28:03 +0000464 jsonAppendChar(pOut, '{');
drh52216ad2015-08-18 02:28:03 +0000465 for(;;){
466 while( j<=pNode->n ){
467 if( (pNode[j+1].jnFlags & JNODE_REMOVE)==0 ){
468 jsonAppendSeparator(pOut);
469 jsonRenderNode(&pNode[j], pOut, aReplace);
470 jsonAppendChar(pOut, ':');
471 if( pNode[j+1].jnFlags & JNODE_REPLACE ){
drhf5ddb9c2015-09-11 00:06:41 +0000472 jsonAppendValue(pOut, aReplace[pNode[j+1].iVal]);
drh52216ad2015-08-18 02:28:03 +0000473 }else{
474 jsonRenderNode(&pNode[j+1], pOut, aReplace);
475 }
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;
drh80d87402015-08-24 12:42:41 +0000598 for(k=0; k<4 && i<n-2; i++, k++){
drh8784eca2015-08-23 02:42:30 +0000599 c = z[i+1];
drh987eb1f2015-08-17 15:17:37 +0000600 if( c>='0' && c<='9' ) v = v*16 + c - '0';
601 else if( c>='A' && c<='F' ) v = v*16 + c - 'A' + 10;
602 else if( c>='a' && c<='f' ) v = v*16 + c - 'a' + 10;
603 else break;
drh987eb1f2015-08-17 15:17:37 +0000604 }
drh80d87402015-08-24 12:42:41 +0000605 if( v==0 ) break;
drh987eb1f2015-08-17 15:17:37 +0000606 if( v<=0x7f ){
mistachkin16a93122015-09-11 18:05:01 +0000607 zOut[j++] = (char)v;
drh987eb1f2015-08-17 15:17:37 +0000608 }else if( v<=0x7ff ){
mistachkin16a93122015-09-11 18:05:01 +0000609 zOut[j++] = (char)(0xc0 | (v>>6));
drh987eb1f2015-08-17 15:17:37 +0000610 zOut[j++] = 0x80 | (v&0x3f);
drh80d87402015-08-24 12:42:41 +0000611 }else{
mistachkin16a93122015-09-11 18:05:01 +0000612 zOut[j++] = (char)(0xe0 | (v>>12));
drh987eb1f2015-08-17 15:17:37 +0000613 zOut[j++] = 0x80 | ((v>>6)&0x3f);
614 zOut[j++] = 0x80 | (v&0x3f);
drh987eb1f2015-08-17 15:17:37 +0000615 }
616 }else{
617 if( c=='b' ){
618 c = '\b';
619 }else if( c=='f' ){
620 c = '\f';
621 }else if( c=='n' ){
622 c = '\n';
623 }else if( c=='r' ){
624 c = '\r';
625 }else if( c=='t' ){
626 c = '\t';
627 }
628 zOut[j++] = c;
629 }
630 }
631 }
632 zOut[j] = 0;
633 sqlite3_result_text(pCtx, zOut, j, sqlite3_free);
drh5634cc02015-08-17 11:28:03 +0000634 }
635 break;
636 }
637 case JSON_ARRAY:
638 case JSON_OBJECT: {
drhf2df7e72015-08-28 20:07:40 +0000639 jsonReturnJson(pNode, pCtx, aReplace);
drh5634cc02015-08-17 11:28:03 +0000640 break;
641 }
642 }
drhbd0621b2015-08-13 13:54:59 +0000643}
644
drh95677942015-09-24 01:06:37 +0000645/* Forward reference */
646static int jsonParseAddNode(JsonParse*,u32,u32,const char*);
647
648/*
649** A macro to hint to the compiler that a function should not be
650** inlined.
651*/
652#if defined(__GNUC__)
653# define JSON_NOINLINE __attribute__((noinline))
654#elif defined(_MSC_VER) && _MSC_VER>=1310
655# define JSON_NOINLINE __declspec(noinline)
656#else
657# define JSON_NOINLINE
658#endif
659
660
661static JSON_NOINLINE int jsonParseAddNodeExpand(
662 JsonParse *pParse, /* Append the node to this object */
663 u32 eType, /* Node type */
664 u32 n, /* Content size or sub-node count */
665 const char *zContent /* Content */
666){
667 u32 nNew;
668 JsonNode *pNew;
669 assert( pParse->nNode>=pParse->nAlloc );
670 if( pParse->oom ) return -1;
671 nNew = pParse->nAlloc*2 + 10;
672 pNew = sqlite3_realloc(pParse->aNode, sizeof(JsonNode)*nNew);
673 if( pNew==0 ){
674 pParse->oom = 1;
675 return -1;
676 }
677 pParse->nAlloc = nNew;
678 pParse->aNode = pNew;
679 assert( pParse->nNode<pParse->nAlloc );
680 return jsonParseAddNode(pParse, eType, n, zContent);
681}
682
drh5fa5c102015-08-12 16:49:40 +0000683/*
drhe9c37f32015-08-15 21:25:36 +0000684** Create a new JsonNode instance based on the arguments and append that
685** instance to the JsonParse. Return the index in pParse->aNode[] of the
686** new node, or -1 if a memory allocation fails.
687*/
688static int jsonParseAddNode(
689 JsonParse *pParse, /* Append the node to this object */
690 u32 eType, /* Node type */
691 u32 n, /* Content size or sub-node count */
692 const char *zContent /* Content */
693){
694 JsonNode *p;
695 if( pParse->nNode>=pParse->nAlloc ){
drh95677942015-09-24 01:06:37 +0000696 return jsonParseAddNodeExpand(pParse, eType, n, zContent);
drhe9c37f32015-08-15 21:25:36 +0000697 }
698 p = &pParse->aNode[pParse->nNode];
drh5634cc02015-08-17 11:28:03 +0000699 p->eType = (u8)eType;
drh301eecc2015-08-17 20:14:19 +0000700 p->jnFlags = 0;
drhd0960592015-08-17 21:22:32 +0000701 p->iVal = 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;
dan2e8f5512015-09-17 17:21:09 +0000730 while( safe_isspace(pParse->zJson[i]) ){ i++; }
drh8cb15cc2015-09-24 01:40:45 +0000731 if( (c = pParse->zJson[i])=='{' ){
drhe9c37f32015-08-15 21:25:36 +0000732 /* Parse object */
733 iThis = jsonParseAddNode(pParse, JSON_OBJECT, 0, 0);
drhbc8f0922015-08-22 19:39:04 +0000734 if( iThis<0 ) return -1;
drhe9c37f32015-08-15 21:25:36 +0000735 for(j=i+1;;j++){
dan2e8f5512015-09-17 17:21:09 +0000736 while( safe_isspace(pParse->zJson[j]) ){ j++; }
drhe9c37f32015-08-15 21:25:36 +0000737 x = jsonParseValue(pParse, j);
738 if( x<0 ){
drhf27cd1f2015-09-23 01:10:29 +0000739 if( x==(-2) && pParse->nNode==(u32)iThis+1 ) return j+1;
drhe9c37f32015-08-15 21:25:36 +0000740 return -1;
741 }
drhbe9474e2015-08-22 03:05:54 +0000742 if( pParse->oom ) return -1;
drh852944e2015-09-10 03:29:11 +0000743 pNode = &pParse->aNode[pParse->nNode-1];
744 if( pNode->eType!=JSON_STRING ) return -1;
745 pNode->jnFlags |= JNODE_LABEL;
drhe9c37f32015-08-15 21:25:36 +0000746 j = x;
dan2e8f5512015-09-17 17:21:09 +0000747 while( safe_isspace(pParse->zJson[j]) ){ j++; }
drhe9c37f32015-08-15 21:25:36 +0000748 if( pParse->zJson[j]!=':' ) return -1;
749 j++;
750 x = jsonParseValue(pParse, j);
751 if( x<0 ) return -1;
752 j = x;
dan2e8f5512015-09-17 17:21:09 +0000753 while( safe_isspace(pParse->zJson[j]) ){ j++; }
drhe9c37f32015-08-15 21:25:36 +0000754 c = pParse->zJson[j];
755 if( c==',' ) continue;
756 if( c!='}' ) return -1;
757 break;
758 }
drhbc8f0922015-08-22 19:39:04 +0000759 pParse->aNode[iThis].n = pParse->nNode - (u32)iThis - 1;
drhe9c37f32015-08-15 21:25:36 +0000760 return j+1;
761 }else if( c=='[' ){
762 /* Parse array */
763 iThis = jsonParseAddNode(pParse, JSON_ARRAY, 0, 0);
drhbc8f0922015-08-22 19:39:04 +0000764 if( iThis<0 ) return -1;
drhe9c37f32015-08-15 21:25:36 +0000765 for(j=i+1;;j++){
dan2e8f5512015-09-17 17:21:09 +0000766 while( safe_isspace(pParse->zJson[j]) ){ j++; }
drhe9c37f32015-08-15 21:25:36 +0000767 x = jsonParseValue(pParse, j);
768 if( x<0 ){
drhf27cd1f2015-09-23 01:10:29 +0000769 if( x==(-3) && pParse->nNode==(u32)iThis+1 ) return j+1;
drhe9c37f32015-08-15 21:25:36 +0000770 return -1;
771 }
772 j = x;
dan2e8f5512015-09-17 17:21:09 +0000773 while( safe_isspace(pParse->zJson[j]) ){ j++; }
drhe9c37f32015-08-15 21:25:36 +0000774 c = pParse->zJson[j];
775 if( c==',' ) continue;
776 if( c!=']' ) return -1;
777 break;
778 }
drhbc8f0922015-08-22 19:39:04 +0000779 pParse->aNode[iThis].n = pParse->nNode - (u32)iThis - 1;
drhe9c37f32015-08-15 21:25:36 +0000780 return j+1;
781 }else if( c=='"' ){
782 /* Parse string */
drh301eecc2015-08-17 20:14:19 +0000783 u8 jnFlags = 0;
drhe9c37f32015-08-15 21:25:36 +0000784 j = i+1;
785 for(;;){
786 c = pParse->zJson[j];
787 if( c==0 ) return -1;
788 if( c=='\\' ){
789 c = pParse->zJson[++j];
drhad875e72016-11-07 13:37:28 +0000790 if( c=='"' || c=='\\' || c=='/' || c=='b' || c=='f'
791 || c=='n' || c=='r' || c=='t'
792 || (c=='u' && jsonIs4Hex(pParse->zJson+j+1)) ){
793 jnFlags = JNODE_ESCAPE;
794 }else{
795 return -1;
796 }
drhe9c37f32015-08-15 21:25:36 +0000797 }else if( c=='"' ){
798 break;
799 }
800 j++;
801 }
802 jsonParseAddNode(pParse, JSON_STRING, j+1-i, &pParse->zJson[i]);
drhbe9474e2015-08-22 03:05:54 +0000803 if( !pParse->oom ) pParse->aNode[pParse->nNode-1].jnFlags = jnFlags;
drhe9c37f32015-08-15 21:25:36 +0000804 return j+1;
805 }else if( c=='n'
806 && strncmp(pParse->zJson+i,"null",4)==0
dan2e8f5512015-09-17 17:21:09 +0000807 && !safe_isalnum(pParse->zJson[i+4]) ){
drhe9c37f32015-08-15 21:25:36 +0000808 jsonParseAddNode(pParse, JSON_NULL, 0, 0);
809 return i+4;
810 }else if( c=='t'
811 && strncmp(pParse->zJson+i,"true",4)==0
dan2e8f5512015-09-17 17:21:09 +0000812 && !safe_isalnum(pParse->zJson[i+4]) ){
drhe9c37f32015-08-15 21:25:36 +0000813 jsonParseAddNode(pParse, JSON_TRUE, 0, 0);
814 return i+4;
815 }else if( c=='f'
816 && strncmp(pParse->zJson+i,"false",5)==0
dan2e8f5512015-09-17 17:21:09 +0000817 && !safe_isalnum(pParse->zJson[i+5]) ){
drhe9c37f32015-08-15 21:25:36 +0000818 jsonParseAddNode(pParse, JSON_FALSE, 0, 0);
819 return i+5;
820 }else if( c=='-' || (c>='0' && c<='9') ){
821 /* Parse number */
822 u8 seenDP = 0;
823 u8 seenE = 0;
824 j = i+1;
825 for(;; j++){
826 c = pParse->zJson[j];
827 if( c>='0' && c<='9' ) continue;
828 if( c=='.' ){
829 if( pParse->zJson[j-1]=='-' ) return -1;
830 if( seenDP ) return -1;
831 seenDP = 1;
832 continue;
833 }
834 if( c=='e' || c=='E' ){
835 if( pParse->zJson[j-1]<'0' ) return -1;
836 if( seenE ) return -1;
837 seenDP = seenE = 1;
838 c = pParse->zJson[j+1];
drh8784eca2015-08-23 02:42:30 +0000839 if( c=='+' || c=='-' ){
840 j++;
841 c = pParse->zJson[j+1];
842 }
drhd1f00682015-08-29 16:02:37 +0000843 if( c<'0' || c>'9' ) return -1;
drhe9c37f32015-08-15 21:25:36 +0000844 continue;
845 }
846 break;
847 }
848 if( pParse->zJson[j-1]<'0' ) return -1;
849 jsonParseAddNode(pParse, seenDP ? JSON_REAL : JSON_INT,
850 j - i, &pParse->zJson[i]);
851 return j;
852 }else if( c=='}' ){
853 return -2; /* End of {...} */
854 }else if( c==']' ){
855 return -3; /* End of [...] */
drh8cb15cc2015-09-24 01:40:45 +0000856 }else if( c==0 ){
857 return 0; /* End of file */
drhe9c37f32015-08-15 21:25:36 +0000858 }else{
859 return -1; /* Syntax error */
860 }
861}
862
863/*
864** Parse a complete JSON string. Return 0 on success or non-zero if there
865** are any errors. If an error occurs, free all memory associated with
866** pParse.
867**
868** pParse is uninitialized when this routine is called.
869*/
drhbc8f0922015-08-22 19:39:04 +0000870static int jsonParse(
871 JsonParse *pParse, /* Initialize and fill this JsonParse object */
872 sqlite3_context *pCtx, /* Report errors here */
873 const char *zJson /* Input JSON text to be parsed */
874){
drhe9c37f32015-08-15 21:25:36 +0000875 int i;
drhe9c37f32015-08-15 21:25:36 +0000876 memset(pParse, 0, sizeof(*pParse));
drhc3722b22015-08-23 20:44:59 +0000877 if( zJson==0 ) return 1;
drhe9c37f32015-08-15 21:25:36 +0000878 pParse->zJson = zJson;
879 i = jsonParseValue(pParse, 0);
drhc3722b22015-08-23 20:44:59 +0000880 if( pParse->oom ) i = -1;
drhe9c37f32015-08-15 21:25:36 +0000881 if( i>0 ){
dan2e8f5512015-09-17 17:21:09 +0000882 while( safe_isspace(zJson[i]) ) i++;
drhe9c37f32015-08-15 21:25:36 +0000883 if( zJson[i] ) i = -1;
884 }
drhd1f00682015-08-29 16:02:37 +0000885 if( i<=0 ){
drhf2df7e72015-08-28 20:07:40 +0000886 if( pCtx!=0 ){
887 if( pParse->oom ){
888 sqlite3_result_error_nomem(pCtx);
889 }else{
890 sqlite3_result_error(pCtx, "malformed JSON", -1);
891 }
892 }
drh505ad2c2015-08-21 17:33:11 +0000893 jsonParseReset(pParse);
drhe9c37f32015-08-15 21:25:36 +0000894 return 1;
895 }
896 return 0;
897}
drh301eecc2015-08-17 20:14:19 +0000898
drh505ad2c2015-08-21 17:33:11 +0000899/* Mark node i of pParse as being a child of iParent. Call recursively
900** to fill in all the descendants of node i.
901*/
902static void jsonParseFillInParentage(JsonParse *pParse, u32 i, u32 iParent){
903 JsonNode *pNode = &pParse->aNode[i];
904 u32 j;
905 pParse->aUp[i] = iParent;
906 switch( pNode->eType ){
907 case JSON_ARRAY: {
908 for(j=1; j<=pNode->n; j += jsonNodeSize(pNode+j)){
909 jsonParseFillInParentage(pParse, i+j, i);
910 }
911 break;
912 }
913 case JSON_OBJECT: {
914 for(j=1; j<=pNode->n; j += jsonNodeSize(pNode+j+1)+1){
915 pParse->aUp[i+j] = i;
916 jsonParseFillInParentage(pParse, i+j+1, i);
917 }
918 break;
919 }
920 default: {
921 break;
922 }
923 }
924}
925
926/*
927** Compute the parentage of all nodes in a completed parse.
928*/
929static int jsonParseFindParents(JsonParse *pParse){
930 u32 *aUp;
931 assert( pParse->aUp==0 );
932 aUp = pParse->aUp = sqlite3_malloc( sizeof(u32)*pParse->nNode );
drhc3722b22015-08-23 20:44:59 +0000933 if( aUp==0 ){
934 pParse->oom = 1;
935 return SQLITE_NOMEM;
936 }
drh505ad2c2015-08-21 17:33:11 +0000937 jsonParseFillInParentage(pParse, 0, 0);
938 return SQLITE_OK;
939}
940
drh8cb0c832015-09-22 00:21:03 +0000941/*
942** Compare the OBJECT label at pNode against zKey,nKey. Return true on
943** a match.
944*/
mistachkinf2c26ed2015-10-12 22:20:29 +0000945static int jsonLabelCompare(JsonNode *pNode, const char *zKey, u32 nKey){
drh8cb0c832015-09-22 00:21:03 +0000946 if( pNode->jnFlags & JNODE_RAW ){
947 if( pNode->n!=nKey ) return 0;
948 return strncmp(pNode->u.zJContent, zKey, nKey)==0;
949 }else{
950 if( pNode->n!=nKey+2 ) return 0;
951 return strncmp(pNode->u.zJContent+1, zKey, nKey)==0;
952 }
953}
954
drh52216ad2015-08-18 02:28:03 +0000955/* forward declaration */
drha7714022015-08-29 00:54:49 +0000956static JsonNode *jsonLookupAppend(JsonParse*,const char*,int*,const char**);
drh52216ad2015-08-18 02:28:03 +0000957
drh987eb1f2015-08-17 15:17:37 +0000958/*
959** Search along zPath to find the node specified. Return a pointer
960** to that node, or NULL if zPath is malformed or if there is no such
961** node.
drh52216ad2015-08-18 02:28:03 +0000962**
963** If pApnd!=0, then try to append new nodes to complete zPath if it is
964** possible to do so and if no existing node corresponds to zPath. If
965** new nodes are appended *pApnd is set to 1.
drh987eb1f2015-08-17 15:17:37 +0000966*/
drha7714022015-08-29 00:54:49 +0000967static JsonNode *jsonLookupStep(
drh52216ad2015-08-18 02:28:03 +0000968 JsonParse *pParse, /* The JSON to search */
969 u32 iRoot, /* Begin the search at this node */
970 const char *zPath, /* The path to search */
drha7714022015-08-29 00:54:49 +0000971 int *pApnd, /* Append nodes to complete path if not NULL */
972 const char **pzErr /* Make *pzErr point to any syntax error in zPath */
drh52216ad2015-08-18 02:28:03 +0000973){
drhbc8f0922015-08-22 19:39:04 +0000974 u32 i, j, nKey;
drh6b43cc82015-08-19 23:02:49 +0000975 const char *zKey;
drh52216ad2015-08-18 02:28:03 +0000976 JsonNode *pRoot = &pParse->aNode[iRoot];
drh987eb1f2015-08-17 15:17:37 +0000977 if( zPath[0]==0 ) return pRoot;
978 if( zPath[0]=='.' ){
979 if( pRoot->eType!=JSON_OBJECT ) return 0;
980 zPath++;
drh6b43cc82015-08-19 23:02:49 +0000981 if( zPath[0]=='"' ){
982 zKey = zPath + 1;
983 for(i=1; zPath[i] && zPath[i]!='"'; i++){}
984 nKey = i-1;
drha8f39a92015-09-21 22:53:16 +0000985 if( zPath[i] ){
986 i++;
987 }else{
988 *pzErr = zPath;
989 return 0;
990 }
drh6b43cc82015-08-19 23:02:49 +0000991 }else{
992 zKey = zPath;
993 for(i=0; zPath[i] && zPath[i]!='.' && zPath[i]!='['; i++){}
994 nKey = i;
995 }
drha7714022015-08-29 00:54:49 +0000996 if( nKey==0 ){
997 *pzErr = zPath;
998 return 0;
999 }
drh987eb1f2015-08-17 15:17:37 +00001000 j = 1;
drh52216ad2015-08-18 02:28:03 +00001001 for(;;){
1002 while( j<=pRoot->n ){
drh8cb0c832015-09-22 00:21:03 +00001003 if( jsonLabelCompare(pRoot+j, zKey, nKey) ){
drha7714022015-08-29 00:54:49 +00001004 return jsonLookupStep(pParse, iRoot+j+1, &zPath[i], pApnd, pzErr);
drh52216ad2015-08-18 02:28:03 +00001005 }
1006 j++;
drh505ad2c2015-08-21 17:33:11 +00001007 j += jsonNodeSize(&pRoot[j]);
drh987eb1f2015-08-17 15:17:37 +00001008 }
drh52216ad2015-08-18 02:28:03 +00001009 if( (pRoot->jnFlags & JNODE_APPEND)==0 ) break;
1010 iRoot += pRoot->u.iAppend;
1011 pRoot = &pParse->aNode[iRoot];
1012 j = 1;
1013 }
1014 if( pApnd ){
drhbc8f0922015-08-22 19:39:04 +00001015 u32 iStart, iLabel;
1016 JsonNode *pNode;
1017 iStart = jsonParseAddNode(pParse, JSON_OBJECT, 2, 0);
1018 iLabel = jsonParseAddNode(pParse, JSON_STRING, i, zPath);
drh52216ad2015-08-18 02:28:03 +00001019 zPath += i;
drha7714022015-08-29 00:54:49 +00001020 pNode = jsonLookupAppend(pParse, zPath, pApnd, pzErr);
drhbc8f0922015-08-22 19:39:04 +00001021 if( pParse->oom ) return 0;
1022 if( pNode ){
1023 pRoot = &pParse->aNode[iRoot];
1024 pRoot->u.iAppend = iStart - iRoot;
1025 pRoot->jnFlags |= JNODE_APPEND;
1026 pParse->aNode[iLabel].jnFlags |= JNODE_RAW;
1027 }
1028 return pNode;
drh987eb1f2015-08-17 15:17:37 +00001029 }
dan2e8f5512015-09-17 17:21:09 +00001030 }else if( zPath[0]=='[' && safe_isdigit(zPath[1]) ){
drh987eb1f2015-08-17 15:17:37 +00001031 if( pRoot->eType!=JSON_ARRAY ) return 0;
1032 i = 0;
drh3d1d2a92015-09-22 01:15:49 +00001033 j = 1;
1034 while( safe_isdigit(zPath[j]) ){
1035 i = i*10 + zPath[j] - '0';
1036 j++;
drh987eb1f2015-08-17 15:17:37 +00001037 }
drh3d1d2a92015-09-22 01:15:49 +00001038 if( zPath[j]!=']' ){
drha7714022015-08-29 00:54:49 +00001039 *pzErr = zPath;
1040 return 0;
1041 }
drh3d1d2a92015-09-22 01:15:49 +00001042 zPath += j + 1;
drh987eb1f2015-08-17 15:17:37 +00001043 j = 1;
drh52216ad2015-08-18 02:28:03 +00001044 for(;;){
drhbc8f0922015-08-22 19:39:04 +00001045 while( j<=pRoot->n && (i>0 || (pRoot[j].jnFlags & JNODE_REMOVE)!=0) ){
1046 if( (pRoot[j].jnFlags & JNODE_REMOVE)==0 ) i--;
drh505ad2c2015-08-21 17:33:11 +00001047 j += jsonNodeSize(&pRoot[j]);
drh52216ad2015-08-18 02:28:03 +00001048 }
1049 if( (pRoot->jnFlags & JNODE_APPEND)==0 ) break;
1050 iRoot += pRoot->u.iAppend;
1051 pRoot = &pParse->aNode[iRoot];
1052 j = 1;
drh987eb1f2015-08-17 15:17:37 +00001053 }
1054 if( j<=pRoot->n ){
drha7714022015-08-29 00:54:49 +00001055 return jsonLookupStep(pParse, iRoot+j, zPath, pApnd, pzErr);
drh52216ad2015-08-18 02:28:03 +00001056 }
1057 if( i==0 && pApnd ){
drhbc8f0922015-08-22 19:39:04 +00001058 u32 iStart;
1059 JsonNode *pNode;
1060 iStart = jsonParseAddNode(pParse, JSON_ARRAY, 1, 0);
drha7714022015-08-29 00:54:49 +00001061 pNode = jsonLookupAppend(pParse, zPath, pApnd, pzErr);
drhbc8f0922015-08-22 19:39:04 +00001062 if( pParse->oom ) return 0;
1063 if( pNode ){
1064 pRoot = &pParse->aNode[iRoot];
1065 pRoot->u.iAppend = iStart - iRoot;
1066 pRoot->jnFlags |= JNODE_APPEND;
1067 }
1068 return pNode;
drh987eb1f2015-08-17 15:17:37 +00001069 }
drh3d1d2a92015-09-22 01:15:49 +00001070 }else{
drha7714022015-08-29 00:54:49 +00001071 *pzErr = zPath;
drh987eb1f2015-08-17 15:17:37 +00001072 }
1073 return 0;
1074}
1075
drh52216ad2015-08-18 02:28:03 +00001076/*
drhbc8f0922015-08-22 19:39:04 +00001077** Append content to pParse that will complete zPath. Return a pointer
1078** to the inserted node, or return NULL if the append fails.
drh52216ad2015-08-18 02:28:03 +00001079*/
1080static JsonNode *jsonLookupAppend(
1081 JsonParse *pParse, /* Append content to the JSON parse */
1082 const char *zPath, /* Description of content to append */
drha7714022015-08-29 00:54:49 +00001083 int *pApnd, /* Set this flag to 1 */
1084 const char **pzErr /* Make this point to any syntax error */
drh52216ad2015-08-18 02:28:03 +00001085){
1086 *pApnd = 1;
1087 if( zPath[0]==0 ){
1088 jsonParseAddNode(pParse, JSON_NULL, 0, 0);
1089 return pParse->oom ? 0 : &pParse->aNode[pParse->nNode-1];
1090 }
1091 if( zPath[0]=='.' ){
1092 jsonParseAddNode(pParse, JSON_OBJECT, 0, 0);
1093 }else if( strncmp(zPath,"[0]",3)==0 ){
1094 jsonParseAddNode(pParse, JSON_ARRAY, 0, 0);
1095 }else{
1096 return 0;
1097 }
1098 if( pParse->oom ) return 0;
drha7714022015-08-29 00:54:49 +00001099 return jsonLookupStep(pParse, pParse->nNode-1, zPath, pApnd, pzErr);
drh52216ad2015-08-18 02:28:03 +00001100}
1101
drhbc8f0922015-08-22 19:39:04 +00001102/*
drha7714022015-08-29 00:54:49 +00001103** Return the text of a syntax error message on a JSON path. Space is
1104** obtained from sqlite3_malloc().
1105*/
1106static char *jsonPathSyntaxError(const char *zErr){
1107 return sqlite3_mprintf("JSON path error near '%q'", zErr);
1108}
1109
1110/*
1111** Do a node lookup using zPath. Return a pointer to the node on success.
1112** Return NULL if not found or if there is an error.
1113**
1114** On an error, write an error message into pCtx and increment the
1115** pParse->nErr counter.
1116**
1117** If pApnd!=NULL then try to append missing nodes and set *pApnd = 1 if
1118** nodes are appended.
drha7714022015-08-29 00:54:49 +00001119*/
1120static JsonNode *jsonLookup(
1121 JsonParse *pParse, /* The JSON to search */
1122 const char *zPath, /* The path to search */
1123 int *pApnd, /* Append nodes to complete path if not NULL */
drhf5ddb9c2015-09-11 00:06:41 +00001124 sqlite3_context *pCtx /* Report errors here, if not NULL */
drha7714022015-08-29 00:54:49 +00001125){
1126 const char *zErr = 0;
1127 JsonNode *pNode = 0;
drha8f39a92015-09-21 22:53:16 +00001128 char *zMsg;
drha7714022015-08-29 00:54:49 +00001129
1130 if( zPath==0 ) return 0;
1131 if( zPath[0]!='$' ){
1132 zErr = zPath;
1133 goto lookup_err;
1134 }
1135 zPath++;
drha7714022015-08-29 00:54:49 +00001136 pNode = jsonLookupStep(pParse, 0, zPath, pApnd, &zErr);
drha8f39a92015-09-21 22:53:16 +00001137 if( zErr==0 ) return pNode;
drha7714022015-08-29 00:54:49 +00001138
1139lookup_err:
1140 pParse->nErr++;
drha8f39a92015-09-21 22:53:16 +00001141 assert( zErr!=0 && pCtx!=0 );
1142 zMsg = jsonPathSyntaxError(zErr);
1143 if( zMsg ){
1144 sqlite3_result_error(pCtx, zMsg, -1);
1145 sqlite3_free(zMsg);
1146 }else{
1147 sqlite3_result_error_nomem(pCtx);
drha7714022015-08-29 00:54:49 +00001148 }
drha7714022015-08-29 00:54:49 +00001149 return 0;
1150}
1151
1152
1153/*
drhbc8f0922015-08-22 19:39:04 +00001154** Report the wrong number of arguments for json_insert(), json_replace()
1155** or json_set().
1156*/
1157static void jsonWrongNumArgs(
1158 sqlite3_context *pCtx,
1159 const char *zFuncName
1160){
1161 char *zMsg = sqlite3_mprintf("json_%s() needs an odd number of arguments",
1162 zFuncName);
1163 sqlite3_result_error(pCtx, zMsg, -1);
1164 sqlite3_free(zMsg);
1165}
drh52216ad2015-08-18 02:28:03 +00001166
drha7714022015-08-29 00:54:49 +00001167
drh987eb1f2015-08-17 15:17:37 +00001168/****************************************************************************
1169** SQL functions used for testing and debugging
1170****************************************************************************/
drhe9c37f32015-08-15 21:25:36 +00001171
drh301eecc2015-08-17 20:14:19 +00001172#ifdef SQLITE_DEBUG
drhe9c37f32015-08-15 21:25:36 +00001173/*
drh5634cc02015-08-17 11:28:03 +00001174** The json_parse(JSON) function returns a string which describes
drhe9c37f32015-08-15 21:25:36 +00001175** a parse of the JSON provided. Or it returns NULL if JSON is not
1176** well-formed.
1177*/
drh5634cc02015-08-17 11:28:03 +00001178static void jsonParseFunc(
drhbc8f0922015-08-22 19:39:04 +00001179 sqlite3_context *ctx,
drhe9c37f32015-08-15 21:25:36 +00001180 int argc,
1181 sqlite3_value **argv
1182){
drh505ad2c2015-08-21 17:33:11 +00001183 JsonString s; /* Output string - not real JSON */
1184 JsonParse x; /* The parse */
drhe9c37f32015-08-15 21:25:36 +00001185 u32 i;
drhe9c37f32015-08-15 21:25:36 +00001186
1187 assert( argc==1 );
drhbc8f0922015-08-22 19:39:04 +00001188 if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return;
drh8784eca2015-08-23 02:42:30 +00001189 jsonParseFindParents(&x);
drhbc8f0922015-08-22 19:39:04 +00001190 jsonInit(&s, ctx);
drhe9c37f32015-08-15 21:25:36 +00001191 for(i=0; i<x.nNode; i++){
drh852944e2015-09-10 03:29:11 +00001192 const char *zType;
1193 if( x.aNode[i].jnFlags & JNODE_LABEL ){
1194 assert( x.aNode[i].eType==JSON_STRING );
1195 zType = "label";
1196 }else{
1197 zType = jsonType[x.aNode[i].eType];
drhe9c37f32015-08-15 21:25:36 +00001198 }
drh852944e2015-09-10 03:29:11 +00001199 jsonPrintf(100, &s,"node %3u: %7s n=%-4d up=%-4d",
1200 i, zType, x.aNode[i].n, x.aUp[i]);
1201 if( x.aNode[i].u.zJContent!=0 ){
1202 jsonAppendRaw(&s, " ", 1);
1203 jsonAppendRaw(&s, x.aNode[i].u.zJContent, x.aNode[i].n);
1204 }
1205 jsonAppendRaw(&s, "\n", 1);
drhe9c37f32015-08-15 21:25:36 +00001206 }
drh505ad2c2015-08-21 17:33:11 +00001207 jsonParseReset(&x);
drhe9c37f32015-08-15 21:25:36 +00001208 jsonResult(&s);
1209}
1210
drh5634cc02015-08-17 11:28:03 +00001211/*
drhf5ddb9c2015-09-11 00:06:41 +00001212** The json_test1(JSON) function return true (1) if the input is JSON
1213** text generated by another json function. It returns (0) if the input
1214** is not known to be JSON.
drh5634cc02015-08-17 11:28:03 +00001215*/
1216static void jsonTest1Func(
drhbc8f0922015-08-22 19:39:04 +00001217 sqlite3_context *ctx,
drh5634cc02015-08-17 11:28:03 +00001218 int argc,
1219 sqlite3_value **argv
1220){
mistachkin16a93122015-09-11 18:05:01 +00001221 UNUSED_PARAM(argc);
drhf5ddb9c2015-09-11 00:06:41 +00001222 sqlite3_result_int(ctx, sqlite3_value_subtype(argv[0])==JSON_SUBTYPE);
drh5634cc02015-08-17 11:28:03 +00001223}
drh301eecc2015-08-17 20:14:19 +00001224#endif /* SQLITE_DEBUG */
drh5634cc02015-08-17 11:28:03 +00001225
drh987eb1f2015-08-17 15:17:37 +00001226/****************************************************************************
drhff135ae2015-12-30 01:07:02 +00001227** Scalar SQL function implementations
drh987eb1f2015-08-17 15:17:37 +00001228****************************************************************************/
1229
1230/*
drh2ad96f52016-06-17 13:01:51 +00001231** Implementation of the json_QUOTE(VALUE) function. Return a JSON value
1232** corresponding to the SQL value input. Mostly this means putting
1233** double-quotes around strings and returning the unquoted string "null"
1234** when given a NULL input.
1235*/
1236static void jsonQuoteFunc(
1237 sqlite3_context *ctx,
1238 int argc,
1239 sqlite3_value **argv
1240){
1241 JsonString jx;
drhb0df5402016-08-01 17:06:44 +00001242 UNUSED_PARAM(argc);
drh2ad96f52016-06-17 13:01:51 +00001243
1244 jsonInit(&jx, ctx);
1245 jsonAppendValue(&jx, argv[0]);
1246 jsonResult(&jx);
1247 sqlite3_result_subtype(ctx, JSON_SUBTYPE);
1248}
1249
1250/*
drh987eb1f2015-08-17 15:17:37 +00001251** Implementation of the json_array(VALUE,...) function. Return a JSON
1252** array that contains all values given in arguments. Or if any argument
1253** is a BLOB, throw an error.
1254*/
1255static void jsonArrayFunc(
drhbc8f0922015-08-22 19:39:04 +00001256 sqlite3_context *ctx,
drh987eb1f2015-08-17 15:17:37 +00001257 int argc,
1258 sqlite3_value **argv
1259){
1260 int i;
drh505ad2c2015-08-21 17:33:11 +00001261 JsonString jx;
drh987eb1f2015-08-17 15:17:37 +00001262
drhbc8f0922015-08-22 19:39:04 +00001263 jsonInit(&jx, ctx);
drhd0960592015-08-17 21:22:32 +00001264 jsonAppendChar(&jx, '[');
drh987eb1f2015-08-17 15:17:37 +00001265 for(i=0; i<argc; i++){
drhd0960592015-08-17 21:22:32 +00001266 jsonAppendSeparator(&jx);
drhf5ddb9c2015-09-11 00:06:41 +00001267 jsonAppendValue(&jx, argv[i]);
drh987eb1f2015-08-17 15:17:37 +00001268 }
drhd0960592015-08-17 21:22:32 +00001269 jsonAppendChar(&jx, ']');
drh987eb1f2015-08-17 15:17:37 +00001270 jsonResult(&jx);
drhf5ddb9c2015-09-11 00:06:41 +00001271 sqlite3_result_subtype(ctx, JSON_SUBTYPE);
drh987eb1f2015-08-17 15:17:37 +00001272}
1273
1274
1275/*
1276** json_array_length(JSON)
1277** json_array_length(JSON, PATH)
1278**
1279** Return the number of elements in the top-level JSON array.
1280** Return 0 if the input is not a well-formed JSON array.
1281*/
1282static void jsonArrayLengthFunc(
drhbc8f0922015-08-22 19:39:04 +00001283 sqlite3_context *ctx,
drh987eb1f2015-08-17 15:17:37 +00001284 int argc,
1285 sqlite3_value **argv
1286){
1287 JsonParse x; /* The parse */
1288 sqlite3_int64 n = 0;
1289 u32 i;
drha8f39a92015-09-21 22:53:16 +00001290 JsonNode *pNode;
drh987eb1f2015-08-17 15:17:37 +00001291
drhf2df7e72015-08-28 20:07:40 +00001292 if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return;
drha8f39a92015-09-21 22:53:16 +00001293 assert( x.nNode );
1294 if( argc==2 ){
1295 const char *zPath = (const char*)sqlite3_value_text(argv[1]);
1296 pNode = jsonLookup(&x, zPath, 0, ctx);
1297 }else{
1298 pNode = x.aNode;
1299 }
1300 if( pNode==0 ){
1301 x.nErr = 1;
1302 }else if( pNode->eType==JSON_ARRAY ){
1303 assert( (pNode->jnFlags & JNODE_APPEND)==0 );
1304 for(i=1; i<=pNode->n; n++){
1305 i += jsonNodeSize(&pNode[i]);
drh987eb1f2015-08-17 15:17:37 +00001306 }
drh987eb1f2015-08-17 15:17:37 +00001307 }
drha7714022015-08-29 00:54:49 +00001308 if( x.nErr==0 ) sqlite3_result_int64(ctx, n);
drhf6ec8d42015-08-28 03:48:04 +00001309 jsonParseReset(&x);
1310}
1311
1312/*
drh3ad93bb2015-08-29 19:41:45 +00001313** json_extract(JSON, PATH, ...)
drh987eb1f2015-08-17 15:17:37 +00001314**
drh3ad93bb2015-08-29 19:41:45 +00001315** Return the element described by PATH. Return NULL if there is no
1316** PATH element. If there are multiple PATHs, then return a JSON array
1317** with the result from each path. Throw an error if the JSON or any PATH
1318** is malformed.
drh987eb1f2015-08-17 15:17:37 +00001319*/
1320static void jsonExtractFunc(
drhbc8f0922015-08-22 19:39:04 +00001321 sqlite3_context *ctx,
drh987eb1f2015-08-17 15:17:37 +00001322 int argc,
1323 sqlite3_value **argv
1324){
1325 JsonParse x; /* The parse */
1326 JsonNode *pNode;
1327 const char *zPath;
drh3ad93bb2015-08-29 19:41:45 +00001328 JsonString jx;
1329 int i;
1330
1331 if( argc<2 ) return;
drhbc8f0922015-08-22 19:39:04 +00001332 if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return;
drh3ad93bb2015-08-29 19:41:45 +00001333 jsonInit(&jx, ctx);
1334 jsonAppendChar(&jx, '[');
1335 for(i=1; i<argc; i++){
1336 zPath = (const char*)sqlite3_value_text(argv[i]);
drhf5ddb9c2015-09-11 00:06:41 +00001337 pNode = jsonLookup(&x, zPath, 0, ctx);
drh3ad93bb2015-08-29 19:41:45 +00001338 if( x.nErr ) break;
1339 if( argc>2 ){
1340 jsonAppendSeparator(&jx);
1341 if( pNode ){
1342 jsonRenderNode(pNode, &jx, 0);
1343 }else{
1344 jsonAppendRaw(&jx, "null", 4);
1345 }
1346 }else if( pNode ){
1347 jsonReturn(pNode, ctx, 0);
1348 }
drh987eb1f2015-08-17 15:17:37 +00001349 }
drh3ad93bb2015-08-29 19:41:45 +00001350 if( argc>2 && i==argc ){
1351 jsonAppendChar(&jx, ']');
1352 jsonResult(&jx);
drhf5ddb9c2015-09-11 00:06:41 +00001353 sqlite3_result_subtype(ctx, JSON_SUBTYPE);
drh3ad93bb2015-08-29 19:41:45 +00001354 }
1355 jsonReset(&jx);
drh505ad2c2015-08-21 17:33:11 +00001356 jsonParseReset(&x);
drh987eb1f2015-08-17 15:17:37 +00001357}
1358
1359/*
1360** Implementation of the json_object(NAME,VALUE,...) function. Return a JSON
1361** object that contains all name/value given in arguments. Or if any name
1362** is not a string or if any value is a BLOB, throw an error.
1363*/
1364static void jsonObjectFunc(
drhbc8f0922015-08-22 19:39:04 +00001365 sqlite3_context *ctx,
drh987eb1f2015-08-17 15:17:37 +00001366 int argc,
1367 sqlite3_value **argv
1368){
1369 int i;
drh505ad2c2015-08-21 17:33:11 +00001370 JsonString jx;
drh987eb1f2015-08-17 15:17:37 +00001371 const char *z;
1372 u32 n;
1373
1374 if( argc&1 ){
drhbc8f0922015-08-22 19:39:04 +00001375 sqlite3_result_error(ctx, "json_object() requires an even number "
drh987eb1f2015-08-17 15:17:37 +00001376 "of arguments", -1);
1377 return;
1378 }
drhbc8f0922015-08-22 19:39:04 +00001379 jsonInit(&jx, ctx);
drhd0960592015-08-17 21:22:32 +00001380 jsonAppendChar(&jx, '{');
drh987eb1f2015-08-17 15:17:37 +00001381 for(i=0; i<argc; i+=2){
drh987eb1f2015-08-17 15:17:37 +00001382 if( sqlite3_value_type(argv[i])!=SQLITE_TEXT ){
drhbc8f0922015-08-22 19:39:04 +00001383 sqlite3_result_error(ctx, "json_object() labels must be TEXT", -1);
drhdc384952015-09-19 18:54:39 +00001384 jsonReset(&jx);
drh987eb1f2015-08-17 15:17:37 +00001385 return;
1386 }
drhd0960592015-08-17 21:22:32 +00001387 jsonAppendSeparator(&jx);
drh987eb1f2015-08-17 15:17:37 +00001388 z = (const char*)sqlite3_value_text(argv[i]);
1389 n = (u32)sqlite3_value_bytes(argv[i]);
1390 jsonAppendString(&jx, z, n);
drhd0960592015-08-17 21:22:32 +00001391 jsonAppendChar(&jx, ':');
drhf5ddb9c2015-09-11 00:06:41 +00001392 jsonAppendValue(&jx, argv[i+1]);
drh987eb1f2015-08-17 15:17:37 +00001393 }
drhd0960592015-08-17 21:22:32 +00001394 jsonAppendChar(&jx, '}');
drh987eb1f2015-08-17 15:17:37 +00001395 jsonResult(&jx);
drhf5ddb9c2015-09-11 00:06:41 +00001396 sqlite3_result_subtype(ctx, JSON_SUBTYPE);
drh987eb1f2015-08-17 15:17:37 +00001397}
1398
1399
1400/*
drh301eecc2015-08-17 20:14:19 +00001401** json_remove(JSON, PATH, ...)
1402**
drh3ad93bb2015-08-29 19:41:45 +00001403** Remove the named elements from JSON and return the result. malformed
1404** JSON or PATH arguments result in an error.
drh301eecc2015-08-17 20:14:19 +00001405*/
1406static void jsonRemoveFunc(
drhbc8f0922015-08-22 19:39:04 +00001407 sqlite3_context *ctx,
drh301eecc2015-08-17 20:14:19 +00001408 int argc,
1409 sqlite3_value **argv
1410){
1411 JsonParse x; /* The parse */
1412 JsonNode *pNode;
1413 const char *zPath;
1414 u32 i;
1415
1416 if( argc<1 ) return;
drhbc8f0922015-08-22 19:39:04 +00001417 if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return;
drha8f39a92015-09-21 22:53:16 +00001418 assert( x.nNode );
1419 for(i=1; i<(u32)argc; i++){
1420 zPath = (const char*)sqlite3_value_text(argv[i]);
1421 if( zPath==0 ) goto remove_done;
1422 pNode = jsonLookup(&x, zPath, 0, ctx);
1423 if( x.nErr ) goto remove_done;
1424 if( pNode ) pNode->jnFlags |= JNODE_REMOVE;
1425 }
1426 if( (x.aNode[0].jnFlags & JNODE_REMOVE)==0 ){
1427 jsonReturnJson(x.aNode, ctx, 0);
drhd0960592015-08-17 21:22:32 +00001428 }
drha7714022015-08-29 00:54:49 +00001429remove_done:
drh505ad2c2015-08-21 17:33:11 +00001430 jsonParseReset(&x);
drhd0960592015-08-17 21:22:32 +00001431}
1432
1433/*
1434** json_replace(JSON, PATH, VALUE, ...)
1435**
1436** Replace the value at PATH with VALUE. If PATH does not already exist,
drh3ad93bb2015-08-29 19:41:45 +00001437** this routine is a no-op. If JSON or PATH is malformed, throw an error.
drhd0960592015-08-17 21:22:32 +00001438*/
1439static void jsonReplaceFunc(
drhbc8f0922015-08-22 19:39:04 +00001440 sqlite3_context *ctx,
drhd0960592015-08-17 21:22:32 +00001441 int argc,
1442 sqlite3_value **argv
1443){
1444 JsonParse x; /* The parse */
1445 JsonNode *pNode;
1446 const char *zPath;
1447 u32 i;
1448
1449 if( argc<1 ) return;
1450 if( (argc&1)==0 ) {
drhbc8f0922015-08-22 19:39:04 +00001451 jsonWrongNumArgs(ctx, "replace");
drhd0960592015-08-17 21:22:32 +00001452 return;
1453 }
drhbc8f0922015-08-22 19:39:04 +00001454 if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return;
drha8f39a92015-09-21 22:53:16 +00001455 assert( x.nNode );
1456 for(i=1; i<(u32)argc; i+=2){
1457 zPath = (const char*)sqlite3_value_text(argv[i]);
1458 pNode = jsonLookup(&x, zPath, 0, ctx);
1459 if( x.nErr ) goto replace_err;
1460 if( pNode ){
1461 pNode->jnFlags |= (u8)JNODE_REPLACE;
1462 pNode->iVal = (u8)(i+1);
drhd0960592015-08-17 21:22:32 +00001463 }
drha8f39a92015-09-21 22:53:16 +00001464 }
1465 if( x.aNode[0].jnFlags & JNODE_REPLACE ){
1466 sqlite3_result_value(ctx, argv[x.aNode[0].iVal]);
1467 }else{
1468 jsonReturnJson(x.aNode, ctx, argv);
drh301eecc2015-08-17 20:14:19 +00001469 }
drha7714022015-08-29 00:54:49 +00001470replace_err:
drh505ad2c2015-08-21 17:33:11 +00001471 jsonParseReset(&x);
drh301eecc2015-08-17 20:14:19 +00001472}
drh505ad2c2015-08-21 17:33:11 +00001473
drh52216ad2015-08-18 02:28:03 +00001474/*
1475** json_set(JSON, PATH, VALUE, ...)
1476**
1477** Set the value at PATH to VALUE. Create the PATH if it does not already
1478** exist. Overwrite existing values that do exist.
drh3ad93bb2015-08-29 19:41:45 +00001479** If JSON or PATH is malformed, throw an error.
drh52216ad2015-08-18 02:28:03 +00001480**
1481** json_insert(JSON, PATH, VALUE, ...)
1482**
1483** Create PATH and initialize it to VALUE. If PATH already exists, this
drh3ad93bb2015-08-29 19:41:45 +00001484** routine is a no-op. If JSON or PATH is malformed, throw an error.
drh52216ad2015-08-18 02:28:03 +00001485*/
1486static void jsonSetFunc(
drhbc8f0922015-08-22 19:39:04 +00001487 sqlite3_context *ctx,
drh52216ad2015-08-18 02:28:03 +00001488 int argc,
1489 sqlite3_value **argv
1490){
1491 JsonParse x; /* The parse */
1492 JsonNode *pNode;
1493 const char *zPath;
1494 u32 i;
1495 int bApnd;
drhbc8f0922015-08-22 19:39:04 +00001496 int bIsSet = *(int*)sqlite3_user_data(ctx);
drh52216ad2015-08-18 02:28:03 +00001497
1498 if( argc<1 ) return;
1499 if( (argc&1)==0 ) {
drhbc8f0922015-08-22 19:39:04 +00001500 jsonWrongNumArgs(ctx, bIsSet ? "set" : "insert");
drh52216ad2015-08-18 02:28:03 +00001501 return;
1502 }
drhbc8f0922015-08-22 19:39:04 +00001503 if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return;
drha8f39a92015-09-21 22:53:16 +00001504 assert( x.nNode );
1505 for(i=1; i<(u32)argc; i+=2){
1506 zPath = (const char*)sqlite3_value_text(argv[i]);
1507 bApnd = 0;
1508 pNode = jsonLookup(&x, zPath, &bApnd, ctx);
1509 if( x.oom ){
1510 sqlite3_result_error_nomem(ctx);
1511 goto jsonSetDone;
1512 }else if( x.nErr ){
1513 goto jsonSetDone;
1514 }else if( pNode && (bApnd || bIsSet) ){
1515 pNode->jnFlags |= (u8)JNODE_REPLACE;
1516 pNode->iVal = (u8)(i+1);
drh52216ad2015-08-18 02:28:03 +00001517 }
drha8f39a92015-09-21 22:53:16 +00001518 }
1519 if( x.aNode[0].jnFlags & JNODE_REPLACE ){
1520 sqlite3_result_value(ctx, argv[x.aNode[0].iVal]);
1521 }else{
1522 jsonReturnJson(x.aNode, ctx, argv);
drh52216ad2015-08-18 02:28:03 +00001523 }
drhbc8f0922015-08-22 19:39:04 +00001524jsonSetDone:
drh505ad2c2015-08-21 17:33:11 +00001525 jsonParseReset(&x);
drh52216ad2015-08-18 02:28:03 +00001526}
drh301eecc2015-08-17 20:14:19 +00001527
1528/*
drh987eb1f2015-08-17 15:17:37 +00001529** json_type(JSON)
1530** json_type(JSON, PATH)
1531**
drh3ad93bb2015-08-29 19:41:45 +00001532** Return the top-level "type" of a JSON string. Throw an error if
1533** either the JSON or PATH inputs are not well-formed.
drh987eb1f2015-08-17 15:17:37 +00001534*/
1535static void jsonTypeFunc(
drhbc8f0922015-08-22 19:39:04 +00001536 sqlite3_context *ctx,
drh987eb1f2015-08-17 15:17:37 +00001537 int argc,
1538 sqlite3_value **argv
1539){
1540 JsonParse x; /* The parse */
1541 const char *zPath;
drha8f39a92015-09-21 22:53:16 +00001542 JsonNode *pNode;
drh987eb1f2015-08-17 15:17:37 +00001543
drhbc8f0922015-08-22 19:39:04 +00001544 if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return;
drha8f39a92015-09-21 22:53:16 +00001545 assert( x.nNode );
1546 if( argc==2 ){
1547 zPath = (const char*)sqlite3_value_text(argv[1]);
1548 pNode = jsonLookup(&x, zPath, 0, ctx);
1549 }else{
1550 pNode = x.aNode;
1551 }
1552 if( pNode ){
1553 sqlite3_result_text(ctx, jsonType[pNode->eType], -1, SQLITE_STATIC);
drh987eb1f2015-08-17 15:17:37 +00001554 }
drh505ad2c2015-08-21 17:33:11 +00001555 jsonParseReset(&x);
drh987eb1f2015-08-17 15:17:37 +00001556}
drh5634cc02015-08-17 11:28:03 +00001557
drhbc8f0922015-08-22 19:39:04 +00001558/*
1559** json_valid(JSON)
1560**
drh3ad93bb2015-08-29 19:41:45 +00001561** Return 1 if JSON is a well-formed JSON string according to RFC-7159.
1562** Return 0 otherwise.
drhbc8f0922015-08-22 19:39:04 +00001563*/
1564static void jsonValidFunc(
1565 sqlite3_context *ctx,
1566 int argc,
1567 sqlite3_value **argv
1568){
1569 JsonParse x; /* The parse */
1570 int rc = 0;
1571
mistachkin16a93122015-09-11 18:05:01 +00001572 UNUSED_PARAM(argc);
drha8f39a92015-09-21 22:53:16 +00001573 if( jsonParse(&x, 0, (const char*)sqlite3_value_text(argv[0]))==0 ){
drhbc8f0922015-08-22 19:39:04 +00001574 rc = 1;
1575 }
1576 jsonParseReset(&x);
1577 sqlite3_result_int(ctx, rc);
1578}
1579
drhff135ae2015-12-30 01:07:02 +00001580
1581/****************************************************************************
1582** Aggregate SQL function implementations
1583****************************************************************************/
1584/*
1585** json_group_array(VALUE)
1586**
1587** Return a JSON array composed of all values in the aggregate.
1588*/
1589static void jsonArrayStep(
1590 sqlite3_context *ctx,
1591 int argc,
1592 sqlite3_value **argv
1593){
1594 JsonString *pStr;
drhdf3a9072016-02-11 15:37:18 +00001595 UNUSED_PARAM(argc);
drhff135ae2015-12-30 01:07:02 +00001596 pStr = (JsonString*)sqlite3_aggregate_context(ctx, sizeof(*pStr));
1597 if( pStr ){
1598 if( pStr->zBuf==0 ){
1599 jsonInit(pStr, ctx);
1600 jsonAppendChar(pStr, '[');
1601 }else{
1602 jsonAppendChar(pStr, ',');
1603 pStr->pCtx = ctx;
1604 }
1605 jsonAppendValue(pStr, argv[0]);
1606 }
1607}
1608static void jsonArrayFinal(sqlite3_context *ctx){
1609 JsonString *pStr;
1610 pStr = (JsonString*)sqlite3_aggregate_context(ctx, 0);
1611 if( pStr ){
1612 pStr->pCtx = ctx;
1613 jsonAppendChar(pStr, ']');
1614 if( pStr->bErr ){
drh4a642b62016-02-05 01:55:27 +00001615 if( pStr->bErr==1 ) sqlite3_result_error_nomem(ctx);
drh23079262016-01-01 00:15:59 +00001616 assert( pStr->bStatic );
drhff135ae2015-12-30 01:07:02 +00001617 }else{
1618 sqlite3_result_text(ctx, pStr->zBuf, pStr->nUsed,
1619 pStr->bStatic ? SQLITE_TRANSIENT : sqlite3_free);
1620 pStr->bStatic = 1;
1621 }
1622 }else{
1623 sqlite3_result_text(ctx, "[]", 2, SQLITE_STATIC);
1624 }
1625 sqlite3_result_subtype(ctx, JSON_SUBTYPE);
1626}
1627
1628/*
1629** json_group_obj(NAME,VALUE)
1630**
1631** Return a JSON object composed of all names and values in the aggregate.
1632*/
1633static void jsonObjectStep(
1634 sqlite3_context *ctx,
1635 int argc,
1636 sqlite3_value **argv
1637){
1638 JsonString *pStr;
1639 const char *z;
1640 u32 n;
drhdf3a9072016-02-11 15:37:18 +00001641 UNUSED_PARAM(argc);
drhff135ae2015-12-30 01:07:02 +00001642 pStr = (JsonString*)sqlite3_aggregate_context(ctx, sizeof(*pStr));
1643 if( pStr ){
1644 if( pStr->zBuf==0 ){
1645 jsonInit(pStr, ctx);
1646 jsonAppendChar(pStr, '{');
1647 }else{
1648 jsonAppendChar(pStr, ',');
1649 pStr->pCtx = ctx;
1650 }
1651 z = (const char*)sqlite3_value_text(argv[0]);
1652 n = (u32)sqlite3_value_bytes(argv[0]);
1653 jsonAppendString(pStr, z, n);
1654 jsonAppendChar(pStr, ':');
1655 jsonAppendValue(pStr, argv[1]);
1656 }
1657}
1658static void jsonObjectFinal(sqlite3_context *ctx){
1659 JsonString *pStr;
1660 pStr = (JsonString*)sqlite3_aggregate_context(ctx, 0);
1661 if( pStr ){
1662 jsonAppendChar(pStr, '}');
1663 if( pStr->bErr ){
drh4a642b62016-02-05 01:55:27 +00001664 if( pStr->bErr==0 ) sqlite3_result_error_nomem(ctx);
drh23079262016-01-01 00:15:59 +00001665 assert( pStr->bStatic );
drhff135ae2015-12-30 01:07:02 +00001666 }else{
1667 sqlite3_result_text(ctx, pStr->zBuf, pStr->nUsed,
1668 pStr->bStatic ? SQLITE_TRANSIENT : sqlite3_free);
1669 pStr->bStatic = 1;
1670 }
1671 }else{
1672 sqlite3_result_text(ctx, "{}", 2, SQLITE_STATIC);
1673 }
1674 sqlite3_result_subtype(ctx, JSON_SUBTYPE);
1675}
1676
1677
drhd2975922015-08-29 17:22:33 +00001678#ifndef SQLITE_OMIT_VIRTUALTABLE
drhcb6c6c62015-08-19 22:47:17 +00001679/****************************************************************************
1680** The json_each virtual table
1681****************************************************************************/
1682typedef struct JsonEachCursor JsonEachCursor;
1683struct JsonEachCursor {
1684 sqlite3_vtab_cursor base; /* Base class - must be first */
drh505ad2c2015-08-21 17:33:11 +00001685 u32 iRowid; /* The rowid */
drh852944e2015-09-10 03:29:11 +00001686 u32 iBegin; /* The first node of the scan */
drh505ad2c2015-08-21 17:33:11 +00001687 u32 i; /* Index in sParse.aNode[] of current row */
1688 u32 iEnd; /* EOF when i equals or exceeds this value */
1689 u8 eType; /* Type of top-level element */
1690 u8 bRecursive; /* True for json_tree(). False for json_each() */
1691 char *zJson; /* Input JSON */
drh383de692015-09-10 17:20:57 +00001692 char *zRoot; /* Path by which to filter zJson */
drh505ad2c2015-08-21 17:33:11 +00001693 JsonParse sParse; /* Parse of the input JSON */
drhcb6c6c62015-08-19 22:47:17 +00001694};
1695
1696/* Constructor for the json_each virtual table */
1697static int jsonEachConnect(
1698 sqlite3 *db,
1699 void *pAux,
1700 int argc, const char *const*argv,
1701 sqlite3_vtab **ppVtab,
1702 char **pzErr
1703){
1704 sqlite3_vtab *pNew;
drh505ad2c2015-08-21 17:33:11 +00001705 int rc;
drhcb6c6c62015-08-19 22:47:17 +00001706
1707/* Column numbers */
drh4af352d2015-08-21 20:02:48 +00001708#define JEACH_KEY 0
1709#define JEACH_VALUE 1
1710#define JEACH_TYPE 2
1711#define JEACH_ATOM 3
1712#define JEACH_ID 4
1713#define JEACH_PARENT 5
1714#define JEACH_FULLKEY 6
drh383de692015-09-10 17:20:57 +00001715#define JEACH_PATH 7
1716#define JEACH_JSON 8
1717#define JEACH_ROOT 9
drhcb6c6c62015-08-19 22:47:17 +00001718
drh6fd5c1e2015-08-21 20:37:12 +00001719 UNUSED_PARAM(pzErr);
1720 UNUSED_PARAM(argv);
1721 UNUSED_PARAM(argc);
1722 UNUSED_PARAM(pAux);
drh505ad2c2015-08-21 17:33:11 +00001723 rc = sqlite3_declare_vtab(db,
drh383de692015-09-10 17:20:57 +00001724 "CREATE TABLE x(key,value,type,atom,id,parent,fullkey,path,"
1725 "json HIDDEN,root HIDDEN)");
drh505ad2c2015-08-21 17:33:11 +00001726 if( rc==SQLITE_OK ){
1727 pNew = *ppVtab = sqlite3_malloc( sizeof(*pNew) );
1728 if( pNew==0 ) return SQLITE_NOMEM;
1729 memset(pNew, 0, sizeof(*pNew));
1730 }
1731 return rc;
drhcb6c6c62015-08-19 22:47:17 +00001732}
1733
1734/* destructor for json_each virtual table */
1735static int jsonEachDisconnect(sqlite3_vtab *pVtab){
1736 sqlite3_free(pVtab);
1737 return SQLITE_OK;
1738}
1739
drh505ad2c2015-08-21 17:33:11 +00001740/* constructor for a JsonEachCursor object for json_each(). */
1741static int jsonEachOpenEach(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){
drhcb6c6c62015-08-19 22:47:17 +00001742 JsonEachCursor *pCur;
drh6fd5c1e2015-08-21 20:37:12 +00001743
1744 UNUSED_PARAM(p);
drhcb6c6c62015-08-19 22:47:17 +00001745 pCur = sqlite3_malloc( sizeof(*pCur) );
1746 if( pCur==0 ) return SQLITE_NOMEM;
1747 memset(pCur, 0, sizeof(*pCur));
1748 *ppCursor = &pCur->base;
1749 return SQLITE_OK;
1750}
1751
drh505ad2c2015-08-21 17:33:11 +00001752/* constructor for a JsonEachCursor object for json_tree(). */
1753static int jsonEachOpenTree(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){
1754 int rc = jsonEachOpenEach(p, ppCursor);
1755 if( rc==SQLITE_OK ){
1756 JsonEachCursor *pCur = (JsonEachCursor*)*ppCursor;
1757 pCur->bRecursive = 1;
1758 }
1759 return rc;
1760}
1761
drhcb6c6c62015-08-19 22:47:17 +00001762/* Reset a JsonEachCursor back to its original state. Free any memory
1763** held. */
1764static void jsonEachCursorReset(JsonEachCursor *p){
1765 sqlite3_free(p->zJson);
drh383de692015-09-10 17:20:57 +00001766 sqlite3_free(p->zRoot);
drh505ad2c2015-08-21 17:33:11 +00001767 jsonParseReset(&p->sParse);
drhcb6c6c62015-08-19 22:47:17 +00001768 p->iRowid = 0;
1769 p->i = 0;
1770 p->iEnd = 0;
1771 p->eType = 0;
drhcb6c6c62015-08-19 22:47:17 +00001772 p->zJson = 0;
drh383de692015-09-10 17:20:57 +00001773 p->zRoot = 0;
drhcb6c6c62015-08-19 22:47:17 +00001774}
1775
1776/* Destructor for a jsonEachCursor object */
1777static int jsonEachClose(sqlite3_vtab_cursor *cur){
1778 JsonEachCursor *p = (JsonEachCursor*)cur;
1779 jsonEachCursorReset(p);
1780 sqlite3_free(cur);
1781 return SQLITE_OK;
1782}
1783
1784/* Return TRUE if the jsonEachCursor object has been advanced off the end
1785** of the JSON object */
1786static int jsonEachEof(sqlite3_vtab_cursor *cur){
1787 JsonEachCursor *p = (JsonEachCursor*)cur;
1788 return p->i >= p->iEnd;
1789}
1790
drh505ad2c2015-08-21 17:33:11 +00001791/* Advance the cursor to the next element for json_tree() */
drh4af352d2015-08-21 20:02:48 +00001792static int jsonEachNext(sqlite3_vtab_cursor *cur){
drh505ad2c2015-08-21 17:33:11 +00001793 JsonEachCursor *p = (JsonEachCursor*)cur;
drh4af352d2015-08-21 20:02:48 +00001794 if( p->bRecursive ){
drh852944e2015-09-10 03:29:11 +00001795 if( p->sParse.aNode[p->i].jnFlags & JNODE_LABEL ) p->i++;
1796 p->i++;
drh4af352d2015-08-21 20:02:48 +00001797 p->iRowid++;
drh852944e2015-09-10 03:29:11 +00001798 if( p->i<p->iEnd ){
drh8784eca2015-08-23 02:42:30 +00001799 u32 iUp = p->sParse.aUp[p->i];
1800 JsonNode *pUp = &p->sParse.aNode[iUp];
drh4af352d2015-08-21 20:02:48 +00001801 p->eType = pUp->eType;
drh8784eca2015-08-23 02:42:30 +00001802 if( pUp->eType==JSON_ARRAY ){
1803 if( iUp==p->i-1 ){
1804 pUp->u.iKey = 0;
1805 }else{
1806 pUp->u.iKey++;
1807 }
drh4af352d2015-08-21 20:02:48 +00001808 }
1809 }
drh505ad2c2015-08-21 17:33:11 +00001810 }else{
drh4af352d2015-08-21 20:02:48 +00001811 switch( p->eType ){
1812 case JSON_ARRAY: {
1813 p->i += jsonNodeSize(&p->sParse.aNode[p->i]);
1814 p->iRowid++;
1815 break;
1816 }
1817 case JSON_OBJECT: {
1818 p->i += 1 + jsonNodeSize(&p->sParse.aNode[p->i+1]);
1819 p->iRowid++;
1820 break;
1821 }
1822 default: {
1823 p->i = p->iEnd;
1824 break;
1825 }
drh505ad2c2015-08-21 17:33:11 +00001826 }
1827 }
1828 return SQLITE_OK;
1829}
1830
drh4af352d2015-08-21 20:02:48 +00001831/* Append the name of the path for element i to pStr
1832*/
1833static void jsonEachComputePath(
1834 JsonEachCursor *p, /* The cursor */
1835 JsonString *pStr, /* Write the path here */
1836 u32 i /* Path to this element */
1837){
1838 JsonNode *pNode, *pUp;
1839 u32 iUp;
1840 if( i==0 ){
1841 jsonAppendChar(pStr, '$');
1842 return;
drhcb6c6c62015-08-19 22:47:17 +00001843 }
drh4af352d2015-08-21 20:02:48 +00001844 iUp = p->sParse.aUp[i];
1845 jsonEachComputePath(p, pStr, iUp);
1846 pNode = &p->sParse.aNode[i];
1847 pUp = &p->sParse.aNode[iUp];
1848 if( pUp->eType==JSON_ARRAY ){
1849 jsonPrintf(30, pStr, "[%d]", pUp->u.iKey);
1850 }else{
1851 assert( pUp->eType==JSON_OBJECT );
drh852944e2015-09-10 03:29:11 +00001852 if( (pNode->jnFlags & JNODE_LABEL)==0 ) pNode--;
drh4af352d2015-08-21 20:02:48 +00001853 assert( pNode->eType==JSON_STRING );
drh852944e2015-09-10 03:29:11 +00001854 assert( pNode->jnFlags & JNODE_LABEL );
drh4af352d2015-08-21 20:02:48 +00001855 jsonPrintf(pNode->n+1, pStr, ".%.*s", pNode->n-2, pNode->u.zJContent+1);
1856 }
drhcb6c6c62015-08-19 22:47:17 +00001857}
1858
1859/* Return the value of a column */
1860static int jsonEachColumn(
1861 sqlite3_vtab_cursor *cur, /* The cursor */
1862 sqlite3_context *ctx, /* First argument to sqlite3_result_...() */
1863 int i /* Which column to return */
1864){
1865 JsonEachCursor *p = (JsonEachCursor*)cur;
drh505ad2c2015-08-21 17:33:11 +00001866 JsonNode *pThis = &p->sParse.aNode[p->i];
drhcb6c6c62015-08-19 22:47:17 +00001867 switch( i ){
1868 case JEACH_KEY: {
drh8784eca2015-08-23 02:42:30 +00001869 if( p->i==0 ) break;
drhcb6c6c62015-08-19 22:47:17 +00001870 if( p->eType==JSON_OBJECT ){
drh505ad2c2015-08-21 17:33:11 +00001871 jsonReturn(pThis, ctx, 0);
1872 }else if( p->eType==JSON_ARRAY ){
1873 u32 iKey;
1874 if( p->bRecursive ){
1875 if( p->iRowid==0 ) break;
drh8784eca2015-08-23 02:42:30 +00001876 iKey = p->sParse.aNode[p->sParse.aUp[p->i]].u.iKey;
drh505ad2c2015-08-21 17:33:11 +00001877 }else{
1878 iKey = p->iRowid;
1879 }
drh6fd5c1e2015-08-21 20:37:12 +00001880 sqlite3_result_int64(ctx, (sqlite3_int64)iKey);
drhcb6c6c62015-08-19 22:47:17 +00001881 }
1882 break;
1883 }
1884 case JEACH_VALUE: {
drh852944e2015-09-10 03:29:11 +00001885 if( pThis->jnFlags & JNODE_LABEL ) pThis++;
drh505ad2c2015-08-21 17:33:11 +00001886 jsonReturn(pThis, ctx, 0);
1887 break;
1888 }
1889 case JEACH_TYPE: {
drh852944e2015-09-10 03:29:11 +00001890 if( pThis->jnFlags & JNODE_LABEL ) pThis++;
drh505ad2c2015-08-21 17:33:11 +00001891 sqlite3_result_text(ctx, jsonType[pThis->eType], -1, SQLITE_STATIC);
1892 break;
1893 }
1894 case JEACH_ATOM: {
drh852944e2015-09-10 03:29:11 +00001895 if( pThis->jnFlags & JNODE_LABEL ) pThis++;
drh505ad2c2015-08-21 17:33:11 +00001896 if( pThis->eType>=JSON_ARRAY ) break;
1897 jsonReturn(pThis, ctx, 0);
1898 break;
1899 }
1900 case JEACH_ID: {
drh852944e2015-09-10 03:29:11 +00001901 sqlite3_result_int64(ctx,
1902 (sqlite3_int64)p->i + ((pThis->jnFlags & JNODE_LABEL)!=0));
drh505ad2c2015-08-21 17:33:11 +00001903 break;
1904 }
1905 case JEACH_PARENT: {
drh852944e2015-09-10 03:29:11 +00001906 if( p->i>p->iBegin && p->bRecursive ){
drh6fd5c1e2015-08-21 20:37:12 +00001907 sqlite3_result_int64(ctx, (sqlite3_int64)p->sParse.aUp[p->i]);
drhcb6c6c62015-08-19 22:47:17 +00001908 }
1909 break;
1910 }
drh4af352d2015-08-21 20:02:48 +00001911 case JEACH_FULLKEY: {
1912 JsonString x;
1913 jsonInit(&x, ctx);
1914 if( p->bRecursive ){
1915 jsonEachComputePath(p, &x, p->i);
1916 }else{
drh383de692015-09-10 17:20:57 +00001917 if( p->zRoot ){
1918 jsonAppendRaw(&x, p->zRoot, (int)strlen(p->zRoot));
drh4af352d2015-08-21 20:02:48 +00001919 }else{
1920 jsonAppendChar(&x, '$');
1921 }
1922 if( p->eType==JSON_ARRAY ){
1923 jsonPrintf(30, &x, "[%d]", p->iRowid);
1924 }else{
1925 jsonPrintf(pThis->n, &x, ".%.*s", pThis->n-2, pThis->u.zJContent+1);
1926 }
1927 }
1928 jsonResult(&x);
1929 break;
1930 }
drhcb6c6c62015-08-19 22:47:17 +00001931 case JEACH_PATH: {
drh383de692015-09-10 17:20:57 +00001932 if( p->bRecursive ){
1933 JsonString x;
1934 jsonInit(&x, ctx);
1935 jsonEachComputePath(p, &x, p->sParse.aUp[p->i]);
1936 jsonResult(&x);
1937 break;
drh4af352d2015-08-21 20:02:48 +00001938 }
drh383de692015-09-10 17:20:57 +00001939 /* For json_each() path and root are the same so fall through
1940 ** into the root case */
1941 }
1942 case JEACH_ROOT: {
1943 const char *zRoot = p->zRoot;
1944 if( zRoot==0 ) zRoot = "$";
1945 sqlite3_result_text(ctx, zRoot, -1, SQLITE_STATIC);
drhcb6c6c62015-08-19 22:47:17 +00001946 break;
1947 }
drh3d1d2a92015-09-22 01:15:49 +00001948 case JEACH_JSON: {
drh505ad2c2015-08-21 17:33:11 +00001949 assert( i==JEACH_JSON );
drhcb6c6c62015-08-19 22:47:17 +00001950 sqlite3_result_text(ctx, p->sParse.zJson, -1, SQLITE_STATIC);
1951 break;
1952 }
1953 }
1954 return SQLITE_OK;
1955}
1956
1957/* Return the current rowid value */
1958static int jsonEachRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
1959 JsonEachCursor *p = (JsonEachCursor*)cur;
1960 *pRowid = p->iRowid;
1961 return SQLITE_OK;
1962}
1963
1964/* The query strategy is to look for an equality constraint on the json
1965** column. Without such a constraint, the table cannot operate. idxNum is
drh383de692015-09-10 17:20:57 +00001966** 1 if the constraint is found, 3 if the constraint and zRoot are found,
drhcb6c6c62015-08-19 22:47:17 +00001967** and 0 otherwise.
1968*/
1969static int jsonEachBestIndex(
1970 sqlite3_vtab *tab,
1971 sqlite3_index_info *pIdxInfo
1972){
1973 int i;
1974 int jsonIdx = -1;
drh383de692015-09-10 17:20:57 +00001975 int rootIdx = -1;
drhcb6c6c62015-08-19 22:47:17 +00001976 const struct sqlite3_index_constraint *pConstraint;
drh6fd5c1e2015-08-21 20:37:12 +00001977
1978 UNUSED_PARAM(tab);
drhcb6c6c62015-08-19 22:47:17 +00001979 pConstraint = pIdxInfo->aConstraint;
1980 for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){
1981 if( pConstraint->usable==0 ) continue;
1982 if( pConstraint->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue;
1983 switch( pConstraint->iColumn ){
1984 case JEACH_JSON: jsonIdx = i; break;
drh383de692015-09-10 17:20:57 +00001985 case JEACH_ROOT: rootIdx = i; break;
drhcb6c6c62015-08-19 22:47:17 +00001986 default: /* no-op */ break;
1987 }
1988 }
1989 if( jsonIdx<0 ){
1990 pIdxInfo->idxNum = 0;
drh505ad2c2015-08-21 17:33:11 +00001991 pIdxInfo->estimatedCost = 1e99;
drhcb6c6c62015-08-19 22:47:17 +00001992 }else{
drh505ad2c2015-08-21 17:33:11 +00001993 pIdxInfo->estimatedCost = 1.0;
drhcb6c6c62015-08-19 22:47:17 +00001994 pIdxInfo->aConstraintUsage[jsonIdx].argvIndex = 1;
1995 pIdxInfo->aConstraintUsage[jsonIdx].omit = 1;
drh383de692015-09-10 17:20:57 +00001996 if( rootIdx<0 ){
drhcb6c6c62015-08-19 22:47:17 +00001997 pIdxInfo->idxNum = 1;
1998 }else{
drh383de692015-09-10 17:20:57 +00001999 pIdxInfo->aConstraintUsage[rootIdx].argvIndex = 2;
2000 pIdxInfo->aConstraintUsage[rootIdx].omit = 1;
drhcb6c6c62015-08-19 22:47:17 +00002001 pIdxInfo->idxNum = 3;
2002 }
2003 }
2004 return SQLITE_OK;
2005}
2006
2007/* Start a search on a new JSON string */
2008static int jsonEachFilter(
2009 sqlite3_vtab_cursor *cur,
2010 int idxNum, const char *idxStr,
2011 int argc, sqlite3_value **argv
2012){
2013 JsonEachCursor *p = (JsonEachCursor*)cur;
2014 const char *z;
mistachkin16a93122015-09-11 18:05:01 +00002015 const char *zRoot = 0;
drhcb6c6c62015-08-19 22:47:17 +00002016 sqlite3_int64 n;
2017
drh6fd5c1e2015-08-21 20:37:12 +00002018 UNUSED_PARAM(idxStr);
2019 UNUSED_PARAM(argc);
drhcb6c6c62015-08-19 22:47:17 +00002020 jsonEachCursorReset(p);
2021 if( idxNum==0 ) return SQLITE_OK;
2022 z = (const char*)sqlite3_value_text(argv[0]);
2023 if( z==0 ) return SQLITE_OK;
drhcb6c6c62015-08-19 22:47:17 +00002024 n = sqlite3_value_bytes(argv[0]);
drh6fd5c1e2015-08-21 20:37:12 +00002025 p->zJson = sqlite3_malloc64( n+1 );
drhcb6c6c62015-08-19 22:47:17 +00002026 if( p->zJson==0 ) return SQLITE_NOMEM;
drh6fd5c1e2015-08-21 20:37:12 +00002027 memcpy(p->zJson, z, (size_t)n+1);
drha7714022015-08-29 00:54:49 +00002028 if( jsonParse(&p->sParse, 0, p->zJson) ){
2029 int rc = SQLITE_NOMEM;
2030 if( p->sParse.oom==0 ){
2031 sqlite3_free(cur->pVtab->zErrMsg);
2032 cur->pVtab->zErrMsg = sqlite3_mprintf("malformed JSON");
2033 if( cur->pVtab->zErrMsg ) rc = SQLITE_ERROR;
2034 }
drhcb6c6c62015-08-19 22:47:17 +00002035 jsonEachCursorReset(p);
drha7714022015-08-29 00:54:49 +00002036 return rc;
2037 }else if( p->bRecursive && jsonParseFindParents(&p->sParse) ){
2038 jsonEachCursorReset(p);
2039 return SQLITE_NOMEM;
drhcb6c6c62015-08-19 22:47:17 +00002040 }else{
drh95677942015-09-24 01:06:37 +00002041 JsonNode *pNode = 0;
drhcb6c6c62015-08-19 22:47:17 +00002042 if( idxNum==3 ){
drha7714022015-08-29 00:54:49 +00002043 const char *zErr = 0;
drha8f39a92015-09-21 22:53:16 +00002044 zRoot = (const char*)sqlite3_value_text(argv[1]);
2045 if( zRoot==0 ) return SQLITE_OK;
drhcb6c6c62015-08-19 22:47:17 +00002046 n = sqlite3_value_bytes(argv[1]);
drh383de692015-09-10 17:20:57 +00002047 p->zRoot = sqlite3_malloc64( n+1 );
2048 if( p->zRoot==0 ) return SQLITE_NOMEM;
2049 memcpy(p->zRoot, zRoot, (size_t)n+1);
drha8f39a92015-09-21 22:53:16 +00002050 if( zRoot[0]!='$' ){
2051 zErr = zRoot;
2052 }else{
2053 pNode = jsonLookupStep(&p->sParse, 0, p->zRoot+1, 0, &zErr);
2054 }
2055 if( zErr ){
drha7714022015-08-29 00:54:49 +00002056 sqlite3_free(cur->pVtab->zErrMsg);
2057 cur->pVtab->zErrMsg = jsonPathSyntaxError(zErr);
drhcb6c6c62015-08-19 22:47:17 +00002058 jsonEachCursorReset(p);
drha7714022015-08-29 00:54:49 +00002059 return cur->pVtab->zErrMsg ? SQLITE_ERROR : SQLITE_NOMEM;
2060 }else if( pNode==0 ){
drhcb6c6c62015-08-19 22:47:17 +00002061 return SQLITE_OK;
2062 }
2063 }else{
2064 pNode = p->sParse.aNode;
2065 }
drh852944e2015-09-10 03:29:11 +00002066 p->iBegin = p->i = (int)(pNode - p->sParse.aNode);
drhcb6c6c62015-08-19 22:47:17 +00002067 p->eType = pNode->eType;
2068 if( p->eType>=JSON_ARRAY ){
drh8784eca2015-08-23 02:42:30 +00002069 pNode->u.iKey = 0;
drhc3722b22015-08-23 20:44:59 +00002070 p->iEnd = p->i + pNode->n + 1;
drh852944e2015-09-10 03:29:11 +00002071 if( p->bRecursive ){
drh3d1d2a92015-09-22 01:15:49 +00002072 p->eType = p->sParse.aNode[p->sParse.aUp[p->i]].eType;
drh852944e2015-09-10 03:29:11 +00002073 if( p->i>0 && (p->sParse.aNode[p->i-1].jnFlags & JNODE_LABEL)!=0 ){
2074 p->i--;
2075 }
2076 }else{
2077 p->i++;
2078 }
drhcb6c6c62015-08-19 22:47:17 +00002079 }else{
2080 p->iEnd = p->i+1;
2081 }
2082 }
drha8f39a92015-09-21 22:53:16 +00002083 return SQLITE_OK;
drhcb6c6c62015-08-19 22:47:17 +00002084}
2085
2086/* The methods of the json_each virtual table */
2087static sqlite3_module jsonEachModule = {
2088 0, /* iVersion */
2089 0, /* xCreate */
2090 jsonEachConnect, /* xConnect */
2091 jsonEachBestIndex, /* xBestIndex */
2092 jsonEachDisconnect, /* xDisconnect */
2093 0, /* xDestroy */
drh505ad2c2015-08-21 17:33:11 +00002094 jsonEachOpenEach, /* xOpen - open a cursor */
drhcb6c6c62015-08-19 22:47:17 +00002095 jsonEachClose, /* xClose - close a cursor */
2096 jsonEachFilter, /* xFilter - configure scan constraints */
drh4af352d2015-08-21 20:02:48 +00002097 jsonEachNext, /* xNext - advance a cursor */
drhcb6c6c62015-08-19 22:47:17 +00002098 jsonEachEof, /* xEof - check for end of scan */
2099 jsonEachColumn, /* xColumn - read data */
2100 jsonEachRowid, /* xRowid - read data */
2101 0, /* xUpdate */
2102 0, /* xBegin */
2103 0, /* xSync */
2104 0, /* xCommit */
2105 0, /* xRollback */
2106 0, /* xFindMethod */
2107 0, /* xRename */
drh6fd5c1e2015-08-21 20:37:12 +00002108 0, /* xSavepoint */
2109 0, /* xRelease */
2110 0 /* xRollbackTo */
drhcb6c6c62015-08-19 22:47:17 +00002111};
2112
drh505ad2c2015-08-21 17:33:11 +00002113/* The methods of the json_tree virtual table. */
2114static sqlite3_module jsonTreeModule = {
2115 0, /* iVersion */
2116 0, /* xCreate */
2117 jsonEachConnect, /* xConnect */
2118 jsonEachBestIndex, /* xBestIndex */
2119 jsonEachDisconnect, /* xDisconnect */
2120 0, /* xDestroy */
2121 jsonEachOpenTree, /* xOpen - open a cursor */
2122 jsonEachClose, /* xClose - close a cursor */
2123 jsonEachFilter, /* xFilter - configure scan constraints */
drh4af352d2015-08-21 20:02:48 +00002124 jsonEachNext, /* xNext - advance a cursor */
drh505ad2c2015-08-21 17:33:11 +00002125 jsonEachEof, /* xEof - check for end of scan */
2126 jsonEachColumn, /* xColumn - read data */
2127 jsonEachRowid, /* xRowid - read data */
2128 0, /* xUpdate */
2129 0, /* xBegin */
2130 0, /* xSync */
2131 0, /* xCommit */
2132 0, /* xRollback */
2133 0, /* xFindMethod */
2134 0, /* xRename */
drh6fd5c1e2015-08-21 20:37:12 +00002135 0, /* xSavepoint */
2136 0, /* xRelease */
2137 0 /* xRollbackTo */
drh505ad2c2015-08-21 17:33:11 +00002138};
drhd2975922015-08-29 17:22:33 +00002139#endif /* SQLITE_OMIT_VIRTUALTABLE */
drh505ad2c2015-08-21 17:33:11 +00002140
2141/****************************************************************************
drh2f20e132015-09-26 17:44:59 +00002142** The following routines are the only publically visible identifiers in this
2143** file. Call the following routines in order to register the various SQL
drh505ad2c2015-08-21 17:33:11 +00002144** functions and the virtual table implemented by this file.
2145****************************************************************************/
drhcb6c6c62015-08-19 22:47:17 +00002146
drh2f20e132015-09-26 17:44:59 +00002147int sqlite3Json1Init(sqlite3 *db){
drh5fa5c102015-08-12 16:49:40 +00002148 int rc = SQLITE_OK;
drh6fd5c1e2015-08-21 20:37:12 +00002149 unsigned int i;
drh5fa5c102015-08-12 16:49:40 +00002150 static const struct {
2151 const char *zName;
2152 int nArg;
drh52216ad2015-08-18 02:28:03 +00002153 int flag;
drh5fa5c102015-08-12 16:49:40 +00002154 void (*xFunc)(sqlite3_context*,int,sqlite3_value**);
2155 } aFunc[] = {
drhf5ddb9c2015-09-11 00:06:41 +00002156 { "json", 1, 0, jsonRemoveFunc },
drh52216ad2015-08-18 02:28:03 +00002157 { "json_array", -1, 0, jsonArrayFunc },
2158 { "json_array_length", 1, 0, jsonArrayLengthFunc },
2159 { "json_array_length", 2, 0, jsonArrayLengthFunc },
drh3ad93bb2015-08-29 19:41:45 +00002160 { "json_extract", -1, 0, jsonExtractFunc },
drh52216ad2015-08-18 02:28:03 +00002161 { "json_insert", -1, 0, jsonSetFunc },
2162 { "json_object", -1, 0, jsonObjectFunc },
drh2ad96f52016-06-17 13:01:51 +00002163 { "json_quote", 1, 0, jsonQuoteFunc },
drh52216ad2015-08-18 02:28:03 +00002164 { "json_remove", -1, 0, jsonRemoveFunc },
2165 { "json_replace", -1, 0, jsonReplaceFunc },
2166 { "json_set", -1, 1, jsonSetFunc },
2167 { "json_type", 1, 0, jsonTypeFunc },
2168 { "json_type", 2, 0, jsonTypeFunc },
drhbc8f0922015-08-22 19:39:04 +00002169 { "json_valid", 1, 0, jsonValidFunc },
drh987eb1f2015-08-17 15:17:37 +00002170
drh301eecc2015-08-17 20:14:19 +00002171#if SQLITE_DEBUG
drh987eb1f2015-08-17 15:17:37 +00002172 /* DEBUG and TESTING functions */
drh52216ad2015-08-18 02:28:03 +00002173 { "json_parse", 1, 0, jsonParseFunc },
2174 { "json_test1", 1, 0, jsonTest1Func },
drh301eecc2015-08-17 20:14:19 +00002175#endif
drh5fa5c102015-08-12 16:49:40 +00002176 };
drhff135ae2015-12-30 01:07:02 +00002177 static const struct {
2178 const char *zName;
2179 int nArg;
2180 void (*xStep)(sqlite3_context*,int,sqlite3_value**);
2181 void (*xFinal)(sqlite3_context*);
2182 } aAgg[] = {
2183 { "json_group_array", 1, jsonArrayStep, jsonArrayFinal },
2184 { "json_group_object", 2, jsonObjectStep, jsonObjectFinal },
2185 };
drhd2975922015-08-29 17:22:33 +00002186#ifndef SQLITE_OMIT_VIRTUALTABLE
drh505ad2c2015-08-21 17:33:11 +00002187 static const struct {
2188 const char *zName;
2189 sqlite3_module *pModule;
2190 } aMod[] = {
2191 { "json_each", &jsonEachModule },
2192 { "json_tree", &jsonTreeModule },
2193 };
drhd2975922015-08-29 17:22:33 +00002194#endif
drh5fa5c102015-08-12 16:49:40 +00002195 for(i=0; i<sizeof(aFunc)/sizeof(aFunc[0]) && rc==SQLITE_OK; i++){
2196 rc = sqlite3_create_function(db, aFunc[i].zName, aFunc[i].nArg,
drh52216ad2015-08-18 02:28:03 +00002197 SQLITE_UTF8 | SQLITE_DETERMINISTIC,
2198 (void*)&aFunc[i].flag,
drh5fa5c102015-08-12 16:49:40 +00002199 aFunc[i].xFunc, 0, 0);
2200 }
drhff135ae2015-12-30 01:07:02 +00002201 for(i=0; i<sizeof(aAgg)/sizeof(aAgg[0]) && rc==SQLITE_OK; i++){
2202 rc = sqlite3_create_function(db, aAgg[i].zName, aAgg[i].nArg,
2203 SQLITE_UTF8 | SQLITE_DETERMINISTIC, 0,
2204 0, aAgg[i].xStep, aAgg[i].xFinal);
2205 }
drhd2975922015-08-29 17:22:33 +00002206#ifndef SQLITE_OMIT_VIRTUALTABLE
drh505ad2c2015-08-21 17:33:11 +00002207 for(i=0; i<sizeof(aMod)/sizeof(aMod[0]) && rc==SQLITE_OK; i++){
2208 rc = sqlite3_create_module(db, aMod[i].zName, aMod[i].pModule, 0);
drhcb6c6c62015-08-19 22:47:17 +00002209 }
drhd2975922015-08-29 17:22:33 +00002210#endif
drh5fa5c102015-08-12 16:49:40 +00002211 return rc;
2212}
drh2f20e132015-09-26 17:44:59 +00002213
2214
dan8d32e802015-10-14 18:45:42 +00002215#ifndef SQLITE_CORE
drh2f20e132015-09-26 17:44:59 +00002216#ifdef _WIN32
2217__declspec(dllexport)
2218#endif
2219int sqlite3_json_init(
2220 sqlite3 *db,
2221 char **pzErrMsg,
2222 const sqlite3_api_routines *pApi
2223){
2224 SQLITE_EXTENSION_INIT2(pApi);
2225 (void)pzErrMsg; /* Unused parameter */
2226 return sqlite3Json1Init(db);
2227}
dan8d32e802015-10-14 18:45:42 +00002228#endif
drh50065652015-10-08 19:29:18 +00002229#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_JSON1) */