blob: e2dbc7e3078c69e37c6baaa8df3bbab0086786a3 [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**
drh9dbf96b2022-01-06 01:40:09 +000013** This SQLite JSON functions.
drh5fa5c102015-08-12 16:49:40 +000014**
drh9dbf96b2022-01-06 01:40:09 +000015** This file began as an extension in ext/misc/json1.c in 2015. That
16** extension proved so useful that it has now been moved into the core.
drh5fa5c102015-08-12 16:49:40 +000017**
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*/
drh9dbf96b2022-01-06 01:40:09 +000024#ifndef SQLITE_OMIT_JSON
25#include "sqliteInt.h"
dan2e8f5512015-09-17 17:21:09 +000026
drh95677942015-09-24 01:06:37 +000027/*
28** Growing our own isspace() routine this way is twice as fast as
29** the library isspace() function, resulting in a 7% overall performance
30** increase for the parser. (Ubuntu14.10 gcc 4.8.4 x64 with -Os).
31*/
32static const char jsonIsSpace[] = {
drhb9e8f592015-10-16 15:16:06 +000033 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0,
drh95677942015-09-24 01:06:37 +000034 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
35 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
36 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
37 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
38 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
39 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
40 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
41 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
42 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
43 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
44 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
45 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
46 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
47 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
48 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
49};
drh9dbf96b2022-01-06 01:40:09 +000050#define fast_isspace(x) (jsonIsSpace[(unsigned char)x])
drh95677942015-09-24 01:06:37 +000051
drh16fc5e62021-11-01 12:53:01 +000052#if !defined(SQLITE_DEBUG) && !defined(SQLITE_COVERAGE_TEST)
drh285f2ef2021-10-15 16:15:04 +000053# define VVA(X)
54#else
55# define VVA(X) X
56#endif
57
drh52216ad2015-08-18 02:28:03 +000058/* Objects */
drh505ad2c2015-08-21 17:33:11 +000059typedef struct JsonString JsonString;
drh52216ad2015-08-18 02:28:03 +000060typedef struct JsonNode JsonNode;
61typedef struct JsonParse JsonParse;
62
drh5634cc02015-08-17 11:28:03 +000063/* An instance of this object represents a JSON string
64** under construction. Really, this is a generic string accumulator
65** that can be and is used to create strings other than JSON.
drh5fa5c102015-08-12 16:49:40 +000066*/
drh505ad2c2015-08-21 17:33:11 +000067struct JsonString {
drh5fa5c102015-08-12 16:49:40 +000068 sqlite3_context *pCtx; /* Function context - put error messages here */
drh5634cc02015-08-17 11:28:03 +000069 char *zBuf; /* Append JSON content here */
drh5fa5c102015-08-12 16:49:40 +000070 u64 nAlloc; /* Bytes of storage available in zBuf[] */
71 u64 nUsed; /* Bytes of zBuf[] currently used */
72 u8 bStatic; /* True if zBuf is static space */
drhd0960592015-08-17 21:22:32 +000073 u8 bErr; /* True if an error has been encountered */
drh5fa5c102015-08-12 16:49:40 +000074 char zSpace[100]; /* Initial static space */
75};
76
drhe9c37f32015-08-15 21:25:36 +000077/* JSON type values
drhbd0621b2015-08-13 13:54:59 +000078*/
drhe9c37f32015-08-15 21:25:36 +000079#define JSON_NULL 0
80#define JSON_TRUE 1
81#define JSON_FALSE 2
82#define JSON_INT 3
83#define JSON_REAL 4
84#define JSON_STRING 5
85#define JSON_ARRAY 6
86#define JSON_OBJECT 7
87
drhf5ddb9c2015-09-11 00:06:41 +000088/* The "subtype" set for JSON values */
89#define JSON_SUBTYPE 74 /* Ascii for "J" */
90
drh987eb1f2015-08-17 15:17:37 +000091/*
92** Names of the various JSON types:
93*/
94static const char * const jsonType[] = {
95 "null", "true", "false", "integer", "real", "text", "array", "object"
96};
97
drh301eecc2015-08-17 20:14:19 +000098/* Bit values for the JsonNode.jnFlag field
99*/
100#define JNODE_RAW 0x01 /* Content is raw, not JSON encoded */
101#define JNODE_ESCAPE 0x02 /* Content is text with \ escapes */
102#define JNODE_REMOVE 0x04 /* Do not output */
drh633647a2017-03-22 21:24:31 +0000103#define JNODE_REPLACE 0x08 /* Replace with JsonNode.u.iReplace */
104#define JNODE_PATCH 0x10 /* Patch with JsonNode.u.pPatch */
105#define JNODE_APPEND 0x20 /* More ARRAY/OBJECT entries at u.iAppend */
106#define JNODE_LABEL 0x40 /* Is a label of an object */
drh301eecc2015-08-17 20:14:19 +0000107
drh987eb1f2015-08-17 15:17:37 +0000108
drhe9c37f32015-08-15 21:25:36 +0000109/* A single node of parsed JSON
110*/
drhe9c37f32015-08-15 21:25:36 +0000111struct JsonNode {
drh5634cc02015-08-17 11:28:03 +0000112 u8 eType; /* One of the JSON_ type values */
drh301eecc2015-08-17 20:14:19 +0000113 u8 jnFlags; /* JNODE flags */
drh285f2ef2021-10-15 16:15:04 +0000114 u8 eU; /* Which union element to use */
drhe9c37f32015-08-15 21:25:36 +0000115 u32 n; /* Bytes of content, or number of sub-nodes */
drh52216ad2015-08-18 02:28:03 +0000116 union {
drh285f2ef2021-10-15 16:15:04 +0000117 const char *zJContent; /* 1: Content for INT, REAL, and STRING */
118 u32 iAppend; /* 2: More terms for ARRAY and OBJECT */
119 u32 iKey; /* 3: Key for ARRAY objects in json_tree() */
120 u32 iReplace; /* 4: Replacement content for JNODE_REPLACE */
121 JsonNode *pPatch; /* 5: Node chain of patch for JNODE_PATCH */
drh52216ad2015-08-18 02:28:03 +0000122 } u;
drhe9c37f32015-08-15 21:25:36 +0000123};
124
125/* A completely parsed JSON string
126*/
drhe9c37f32015-08-15 21:25:36 +0000127struct JsonParse {
128 u32 nNode; /* Number of slots of aNode[] used */
129 u32 nAlloc; /* Number of slots of aNode[] allocated */
130 JsonNode *aNode; /* Array of nodes containing the parse */
131 const char *zJson; /* Original JSON string */
drh505ad2c2015-08-21 17:33:11 +0000132 u32 *aUp; /* Index of parent of each node */
drhe9c37f32015-08-15 21:25:36 +0000133 u8 oom; /* Set to true if out of memory */
drha7714022015-08-29 00:54:49 +0000134 u8 nErr; /* Number of errors seen */
drhff6d50e2017-04-11 18:55:05 +0000135 u16 iDepth; /* Nesting depth */
drh3fb153c2017-05-11 16:49:59 +0000136 int nJson; /* Length of the zJson string in bytes */
drhe35fc302018-08-30 01:52:10 +0000137 u32 iHold; /* Replace cache line with the lowest iHold value */
drhe9c37f32015-08-15 21:25:36 +0000138};
139
drhff6d50e2017-04-11 18:55:05 +0000140/*
141** Maximum nesting depth of JSON for this implementation.
142**
143** This limit is needed to avoid a stack overflow in the recursive
144** descent parser. A depth of 2000 is far deeper than any sane JSON
145** should go.
146*/
147#define JSON_MAX_DEPTH 2000
148
drh505ad2c2015-08-21 17:33:11 +0000149/**************************************************************************
150** Utility routines for dealing with JsonString objects
151**************************************************************************/
drh301eecc2015-08-17 20:14:19 +0000152
drh505ad2c2015-08-21 17:33:11 +0000153/* Set the JsonString object to an empty string
drh5fa5c102015-08-12 16:49:40 +0000154*/
drh505ad2c2015-08-21 17:33:11 +0000155static void jsonZero(JsonString *p){
drh5fa5c102015-08-12 16:49:40 +0000156 p->zBuf = p->zSpace;
157 p->nAlloc = sizeof(p->zSpace);
158 p->nUsed = 0;
159 p->bStatic = 1;
160}
161
drh505ad2c2015-08-21 17:33:11 +0000162/* Initialize the JsonString object
drh5fa5c102015-08-12 16:49:40 +0000163*/
drh505ad2c2015-08-21 17:33:11 +0000164static void jsonInit(JsonString *p, sqlite3_context *pCtx){
drh5fa5c102015-08-12 16:49:40 +0000165 p->pCtx = pCtx;
drhd0960592015-08-17 21:22:32 +0000166 p->bErr = 0;
drh5fa5c102015-08-12 16:49:40 +0000167 jsonZero(p);
168}
169
170
drh505ad2c2015-08-21 17:33:11 +0000171/* Free all allocated memory and reset the JsonString object back to its
drh5fa5c102015-08-12 16:49:40 +0000172** initial state.
173*/
drh505ad2c2015-08-21 17:33:11 +0000174static void jsonReset(JsonString *p){
drh5fa5c102015-08-12 16:49:40 +0000175 if( !p->bStatic ) sqlite3_free(p->zBuf);
176 jsonZero(p);
177}
178
179
180/* Report an out-of-memory (OOM) condition
181*/
drh505ad2c2015-08-21 17:33:11 +0000182static void jsonOom(JsonString *p){
drh3d1d2a92015-09-22 01:15:49 +0000183 p->bErr = 1;
184 sqlite3_result_error_nomem(p->pCtx);
185 jsonReset(p);
drh5fa5c102015-08-12 16:49:40 +0000186}
187
188/* Enlarge pJson->zBuf so that it can hold at least N more bytes.
189** Return zero on success. Return non-zero on an OOM error
190*/
drh505ad2c2015-08-21 17:33:11 +0000191static int jsonGrow(JsonString *p, u32 N){
drh301eecc2015-08-17 20:14:19 +0000192 u64 nTotal = N<p->nAlloc ? p->nAlloc*2 : p->nAlloc+N+10;
drh5fa5c102015-08-12 16:49:40 +0000193 char *zNew;
194 if( p->bStatic ){
drhd0960592015-08-17 21:22:32 +0000195 if( p->bErr ) return 1;
drh5fa5c102015-08-12 16:49:40 +0000196 zNew = sqlite3_malloc64(nTotal);
197 if( zNew==0 ){
198 jsonOom(p);
199 return SQLITE_NOMEM;
200 }
drh6fd5c1e2015-08-21 20:37:12 +0000201 memcpy(zNew, p->zBuf, (size_t)p->nUsed);
drh5fa5c102015-08-12 16:49:40 +0000202 p->zBuf = zNew;
203 p->bStatic = 0;
204 }else{
205 zNew = sqlite3_realloc64(p->zBuf, nTotal);
206 if( zNew==0 ){
207 jsonOom(p);
208 return SQLITE_NOMEM;
209 }
210 p->zBuf = zNew;
211 }
212 p->nAlloc = nTotal;
213 return SQLITE_OK;
214}
215
drh505ad2c2015-08-21 17:33:11 +0000216/* Append N bytes from zIn onto the end of the JsonString string.
drh5fa5c102015-08-12 16:49:40 +0000217*/
drh505ad2c2015-08-21 17:33:11 +0000218static void jsonAppendRaw(JsonString *p, const char *zIn, u32 N){
drhc795e3d2020-05-17 13:47:28 +0000219 if( N==0 ) return;
drh5fa5c102015-08-12 16:49:40 +0000220 if( (N+p->nUsed >= p->nAlloc) && jsonGrow(p,N)!=0 ) return;
221 memcpy(p->zBuf+p->nUsed, zIn, N);
222 p->nUsed += N;
223}
224
drh4af352d2015-08-21 20:02:48 +0000225/* Append formatted text (not to exceed N bytes) to the JsonString.
226*/
227static void jsonPrintf(int N, JsonString *p, const char *zFormat, ...){
228 va_list ap;
229 if( (p->nUsed + N >= p->nAlloc) && jsonGrow(p, N) ) return;
230 va_start(ap, zFormat);
231 sqlite3_vsnprintf(N, p->zBuf+p->nUsed, zFormat, ap);
232 va_end(ap);
233 p->nUsed += (int)strlen(p->zBuf+p->nUsed);
234}
235
drh5634cc02015-08-17 11:28:03 +0000236/* Append a single character
237*/
drh505ad2c2015-08-21 17:33:11 +0000238static void jsonAppendChar(JsonString *p, char c){
drh5634cc02015-08-17 11:28:03 +0000239 if( p->nUsed>=p->nAlloc && jsonGrow(p,1)!=0 ) return;
240 p->zBuf[p->nUsed++] = c;
241}
242
drh301eecc2015-08-17 20:14:19 +0000243/* Append a comma separator to the output buffer, if the previous
244** character is not '[' or '{'.
245*/
drh505ad2c2015-08-21 17:33:11 +0000246static void jsonAppendSeparator(JsonString *p){
drh301eecc2015-08-17 20:14:19 +0000247 char c;
248 if( p->nUsed==0 ) return;
249 c = p->zBuf[p->nUsed-1];
250 if( c!='[' && c!='{' ) jsonAppendChar(p, ',');
251}
252
drh505ad2c2015-08-21 17:33:11 +0000253/* Append the N-byte string in zIn to the end of the JsonString string
drh5fa5c102015-08-12 16:49:40 +0000254** under construction. Enclose the string in "..." and escape
255** any double-quotes or backslash characters contained within the
256** string.
257*/
drh505ad2c2015-08-21 17:33:11 +0000258static void jsonAppendString(JsonString *p, const char *zIn, u32 N){
drh5fa5c102015-08-12 16:49:40 +0000259 u32 i;
drh76baad92021-04-30 16:12:40 +0000260 if( zIn==0 || ((N+p->nUsed+2 >= p->nAlloc) && jsonGrow(p,N+2)!=0) ) return;
drh5fa5c102015-08-12 16:49:40 +0000261 p->zBuf[p->nUsed++] = '"';
262 for(i=0; i<N; i++){
drh3b7f9a62016-02-04 10:28:57 +0000263 unsigned char c = ((unsigned const char*)zIn)[i];
drh5fa5c102015-08-12 16:49:40 +0000264 if( c=='"' || c=='\\' ){
drh3b7f9a62016-02-04 10:28:57 +0000265 json_simple_escape:
drh4977ccf2015-09-19 11:57:26 +0000266 if( (p->nUsed+N+3-i > p->nAlloc) && jsonGrow(p,N+3-i)!=0 ) return;
drh5fa5c102015-08-12 16:49:40 +0000267 p->zBuf[p->nUsed++] = '\\';
drh3b7f9a62016-02-04 10:28:57 +0000268 }else if( c<=0x1f ){
269 static const char aSpecial[] = {
270 0, 0, 0, 0, 0, 0, 0, 0, 'b', 't', 'n', 0, 'f', 'r', 0, 0,
271 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
272 };
273 assert( sizeof(aSpecial)==32 );
274 assert( aSpecial['\b']=='b' );
275 assert( aSpecial['\f']=='f' );
276 assert( aSpecial['\n']=='n' );
277 assert( aSpecial['\r']=='r' );
278 assert( aSpecial['\t']=='t' );
279 if( aSpecial[c] ){
280 c = aSpecial[c];
281 goto json_simple_escape;
282 }
283 if( (p->nUsed+N+7+i > p->nAlloc) && jsonGrow(p,N+7-i)!=0 ) return;
284 p->zBuf[p->nUsed++] = '\\';
285 p->zBuf[p->nUsed++] = 'u';
286 p->zBuf[p->nUsed++] = '0';
287 p->zBuf[p->nUsed++] = '0';
288 p->zBuf[p->nUsed++] = '0' + (c>>4);
289 c = "0123456789abcdef"[c&0xf];
drh5fa5c102015-08-12 16:49:40 +0000290 }
291 p->zBuf[p->nUsed++] = c;
292 }
293 p->zBuf[p->nUsed++] = '"';
drh4977ccf2015-09-19 11:57:26 +0000294 assert( p->nUsed<p->nAlloc );
drh5fa5c102015-08-12 16:49:40 +0000295}
296
drhd0960592015-08-17 21:22:32 +0000297/*
298** Append a function parameter value to the JSON string under
299** construction.
300*/
301static void jsonAppendValue(
drh505ad2c2015-08-21 17:33:11 +0000302 JsonString *p, /* Append to this JSON string */
drhf5ddb9c2015-09-11 00:06:41 +0000303 sqlite3_value *pValue /* Value to append */
drhd0960592015-08-17 21:22:32 +0000304){
305 switch( sqlite3_value_type(pValue) ){
306 case SQLITE_NULL: {
307 jsonAppendRaw(p, "null", 4);
308 break;
309 }
310 case SQLITE_INTEGER:
311 case SQLITE_FLOAT: {
312 const char *z = (const char*)sqlite3_value_text(pValue);
313 u32 n = (u32)sqlite3_value_bytes(pValue);
314 jsonAppendRaw(p, z, n);
315 break;
316 }
317 case SQLITE_TEXT: {
318 const char *z = (const char*)sqlite3_value_text(pValue);
319 u32 n = (u32)sqlite3_value_bytes(pValue);
drhf5ddb9c2015-09-11 00:06:41 +0000320 if( sqlite3_value_subtype(pValue)==JSON_SUBTYPE ){
drhecb5fed2015-08-28 03:33:50 +0000321 jsonAppendRaw(p, z, n);
322 }else{
323 jsonAppendString(p, z, n);
324 }
drhd0960592015-08-17 21:22:32 +0000325 break;
326 }
327 default: {
328 if( p->bErr==0 ){
329 sqlite3_result_error(p->pCtx, "JSON cannot hold BLOB values", -1);
drh4a642b62016-02-05 01:55:27 +0000330 p->bErr = 2;
drhd0960592015-08-17 21:22:32 +0000331 jsonReset(p);
332 }
333 break;
334 }
335 }
336}
337
338
drhbd0621b2015-08-13 13:54:59 +0000339/* Make the JSON in p the result of the SQL function.
drh5fa5c102015-08-12 16:49:40 +0000340*/
drh505ad2c2015-08-21 17:33:11 +0000341static void jsonResult(JsonString *p){
drhd0960592015-08-17 21:22:32 +0000342 if( p->bErr==0 ){
drh5fa5c102015-08-12 16:49:40 +0000343 sqlite3_result_text64(p->pCtx, p->zBuf, p->nUsed,
344 p->bStatic ? SQLITE_TRANSIENT : sqlite3_free,
345 SQLITE_UTF8);
346 jsonZero(p);
347 }
348 assert( p->bStatic );
349}
350
drh505ad2c2015-08-21 17:33:11 +0000351/**************************************************************************
352** Utility routines for dealing with JsonNode and JsonParse objects
353**************************************************************************/
354
355/*
356** Return the number of consecutive JsonNode slots need to represent
357** the parsed JSON at pNode. The minimum answer is 1. For ARRAY and
358** OBJECT types, the number might be larger.
359**
360** Appended elements are not counted. The value returned is the number
361** by which the JsonNode counter should increment in order to go to the
362** next peer value.
363*/
364static u32 jsonNodeSize(JsonNode *pNode){
365 return pNode->eType>=JSON_ARRAY ? pNode->n+1 : 1;
366}
367
368/*
369** Reclaim all memory allocated by a JsonParse object. But do not
370** delete the JsonParse object itself.
371*/
372static void jsonParseReset(JsonParse *pParse){
373 sqlite3_free(pParse->aNode);
374 pParse->aNode = 0;
375 pParse->nNode = 0;
376 pParse->nAlloc = 0;
377 sqlite3_free(pParse->aUp);
378 pParse->aUp = 0;
379}
380
drh5634cc02015-08-17 11:28:03 +0000381/*
drh3fb153c2017-05-11 16:49:59 +0000382** Free a JsonParse object that was obtained from sqlite3_malloc().
383*/
384static void jsonParseFree(JsonParse *pParse){
385 jsonParseReset(pParse);
386 sqlite3_free(pParse);
387}
388
389/*
drh5634cc02015-08-17 11:28:03 +0000390** Convert the JsonNode pNode into a pure JSON string and
391** append to pOut. Subsubstructure is also included. Return
392** the number of JsonNode objects that are encoded.
drhbd0621b2015-08-13 13:54:59 +0000393*/
drh52216ad2015-08-18 02:28:03 +0000394static void jsonRenderNode(
drhd0960592015-08-17 21:22:32 +0000395 JsonNode *pNode, /* The node to render */
drh505ad2c2015-08-21 17:33:11 +0000396 JsonString *pOut, /* Write JSON here */
drhd0960592015-08-17 21:22:32 +0000397 sqlite3_value **aReplace /* Replacement values */
398){
drh7d4c94b2021-10-04 22:34:38 +0000399 assert( pNode!=0 );
drh633647a2017-03-22 21:24:31 +0000400 if( pNode->jnFlags & (JNODE_REPLACE|JNODE_PATCH) ){
drh7d4c94b2021-10-04 22:34:38 +0000401 if( (pNode->jnFlags & JNODE_REPLACE)!=0 && ALWAYS(aReplace!=0) ){
drh285f2ef2021-10-15 16:15:04 +0000402 assert( pNode->eU==4 );
drh633647a2017-03-22 21:24:31 +0000403 jsonAppendValue(pOut, aReplace[pNode->u.iReplace]);
404 return;
405 }
drh285f2ef2021-10-15 16:15:04 +0000406 assert( pNode->eU==5 );
drh633647a2017-03-22 21:24:31 +0000407 pNode = pNode->u.pPatch;
408 }
drh5634cc02015-08-17 11:28:03 +0000409 switch( pNode->eType ){
drha8f39a92015-09-21 22:53:16 +0000410 default: {
411 assert( pNode->eType==JSON_NULL );
drh5634cc02015-08-17 11:28:03 +0000412 jsonAppendRaw(pOut, "null", 4);
413 break;
414 }
415 case JSON_TRUE: {
416 jsonAppendRaw(pOut, "true", 4);
417 break;
418 }
419 case JSON_FALSE: {
420 jsonAppendRaw(pOut, "false", 5);
421 break;
422 }
423 case JSON_STRING: {
drh301eecc2015-08-17 20:14:19 +0000424 if( pNode->jnFlags & JNODE_RAW ){
drh285f2ef2021-10-15 16:15:04 +0000425 assert( pNode->eU==1 );
drh52216ad2015-08-18 02:28:03 +0000426 jsonAppendString(pOut, pNode->u.zJContent, pNode->n);
drh5634cc02015-08-17 11:28:03 +0000427 break;
428 }
drh08b92082020-08-10 14:18:00 +0000429 /* no break */ deliberate_fall_through
drh5634cc02015-08-17 11:28:03 +0000430 }
431 case JSON_REAL:
432 case JSON_INT: {
drh285f2ef2021-10-15 16:15:04 +0000433 assert( pNode->eU==1 );
drh52216ad2015-08-18 02:28:03 +0000434 jsonAppendRaw(pOut, pNode->u.zJContent, pNode->n);
drh5634cc02015-08-17 11:28:03 +0000435 break;
436 }
437 case JSON_ARRAY: {
drh52216ad2015-08-18 02:28:03 +0000438 u32 j = 1;
drh5634cc02015-08-17 11:28:03 +0000439 jsonAppendChar(pOut, '[');
drh52216ad2015-08-18 02:28:03 +0000440 for(;;){
441 while( j<=pNode->n ){
drh633647a2017-03-22 21:24:31 +0000442 if( (pNode[j].jnFlags & JNODE_REMOVE)==0 ){
drhd0960592015-08-17 21:22:32 +0000443 jsonAppendSeparator(pOut);
drh52216ad2015-08-18 02:28:03 +0000444 jsonRenderNode(&pNode[j], pOut, aReplace);
drhd0960592015-08-17 21:22:32 +0000445 }
drh505ad2c2015-08-21 17:33:11 +0000446 j += jsonNodeSize(&pNode[j]);
drh301eecc2015-08-17 20:14:19 +0000447 }
drh52216ad2015-08-18 02:28:03 +0000448 if( (pNode->jnFlags & JNODE_APPEND)==0 ) break;
drh285f2ef2021-10-15 16:15:04 +0000449 assert( pNode->eU==2 );
drh52216ad2015-08-18 02:28:03 +0000450 pNode = &pNode[pNode->u.iAppend];
451 j = 1;
drh5634cc02015-08-17 11:28:03 +0000452 }
453 jsonAppendChar(pOut, ']');
454 break;
455 }
456 case JSON_OBJECT: {
drh52216ad2015-08-18 02:28:03 +0000457 u32 j = 1;
drh5634cc02015-08-17 11:28:03 +0000458 jsonAppendChar(pOut, '{');
drh52216ad2015-08-18 02:28:03 +0000459 for(;;){
460 while( j<=pNode->n ){
461 if( (pNode[j+1].jnFlags & JNODE_REMOVE)==0 ){
462 jsonAppendSeparator(pOut);
463 jsonRenderNode(&pNode[j], pOut, aReplace);
464 jsonAppendChar(pOut, ':');
drh633647a2017-03-22 21:24:31 +0000465 jsonRenderNode(&pNode[j+1], pOut, aReplace);
drhd0960592015-08-17 21:22:32 +0000466 }
drh505ad2c2015-08-21 17:33:11 +0000467 j += 1 + jsonNodeSize(&pNode[j+1]);
drh301eecc2015-08-17 20:14:19 +0000468 }
drh52216ad2015-08-18 02:28:03 +0000469 if( (pNode->jnFlags & JNODE_APPEND)==0 ) break;
drh285f2ef2021-10-15 16:15:04 +0000470 assert( pNode->eU==2 );
drh52216ad2015-08-18 02:28:03 +0000471 pNode = &pNode[pNode->u.iAppend];
472 j = 1;
drh5634cc02015-08-17 11:28:03 +0000473 }
474 jsonAppendChar(pOut, '}');
475 break;
476 }
drhbd0621b2015-08-13 13:54:59 +0000477 }
drh5634cc02015-08-17 11:28:03 +0000478}
479
480/*
drhf2df7e72015-08-28 20:07:40 +0000481** Return a JsonNode and all its descendents as a JSON string.
482*/
483static void jsonReturnJson(
484 JsonNode *pNode, /* Node to return */
485 sqlite3_context *pCtx, /* Return value for this function */
486 sqlite3_value **aReplace /* Array of replacement values */
487){
488 JsonString s;
489 jsonInit(&s, pCtx);
490 jsonRenderNode(pNode, &s, aReplace);
491 jsonResult(&s);
drhf5ddb9c2015-09-11 00:06:41 +0000492 sqlite3_result_subtype(pCtx, JSON_SUBTYPE);
drhf2df7e72015-08-28 20:07:40 +0000493}
494
495/*
drh48eb03b2019-11-10 11:09:06 +0000496** Translate a single byte of Hex into an integer.
497** This routine only works if h really is a valid hexadecimal
498** character: 0..9a..fA..F
499*/
500static u8 jsonHexToInt(int h){
501 assert( (h>='0' && h<='9') || (h>='a' && h<='f') || (h>='A' && h<='F') );
502#ifdef SQLITE_EBCDIC
503 h += 9*(1&~(h>>4));
504#else
505 h += 9*(1&(h>>6));
506#endif
507 return (u8)(h & 0xf);
508}
509
510/*
511** Convert a 4-byte hex string into an integer
512*/
513static u32 jsonHexToInt4(const char *z){
514 u32 v;
drh9dbf96b2022-01-06 01:40:09 +0000515 assert( sqlite3Isxdigit(z[0]) );
516 assert( sqlite3Isxdigit(z[1]) );
517 assert( sqlite3Isxdigit(z[2]) );
518 assert( sqlite3Isxdigit(z[3]) );
drh48eb03b2019-11-10 11:09:06 +0000519 v = (jsonHexToInt(z[0])<<12)
520 + (jsonHexToInt(z[1])<<8)
521 + (jsonHexToInt(z[2])<<4)
522 + jsonHexToInt(z[3]);
523 return v;
524}
525
526/*
drh5634cc02015-08-17 11:28:03 +0000527** Make the JsonNode the return value of the function.
528*/
drhd0960592015-08-17 21:22:32 +0000529static void jsonReturn(
530 JsonNode *pNode, /* Node to return */
531 sqlite3_context *pCtx, /* Return value for this function */
532 sqlite3_value **aReplace /* Array of replacement values */
533){
drh5634cc02015-08-17 11:28:03 +0000534 switch( pNode->eType ){
drha8f39a92015-09-21 22:53:16 +0000535 default: {
536 assert( pNode->eType==JSON_NULL );
drh5634cc02015-08-17 11:28:03 +0000537 sqlite3_result_null(pCtx);
538 break;
539 }
540 case JSON_TRUE: {
541 sqlite3_result_int(pCtx, 1);
542 break;
543 }
544 case JSON_FALSE: {
545 sqlite3_result_int(pCtx, 0);
546 break;
547 }
drh987eb1f2015-08-17 15:17:37 +0000548 case JSON_INT: {
549 sqlite3_int64 i = 0;
drh285f2ef2021-10-15 16:15:04 +0000550 const char *z;
551 assert( pNode->eU==1 );
552 z = pNode->u.zJContent;
drh987eb1f2015-08-17 15:17:37 +0000553 if( z[0]=='-' ){ z++; }
drh8deb4b82015-10-09 18:21:43 +0000554 while( z[0]>='0' && z[0]<='9' ){
555 unsigned v = *(z++) - '0';
556 if( i>=LARGEST_INT64/10 ){
drha0882fa2015-10-09 20:40:44 +0000557 if( i>LARGEST_INT64/10 ) goto int_as_real;
drh8deb4b82015-10-09 18:21:43 +0000558 if( z[0]>='0' && z[0]<='9' ) goto int_as_real;
559 if( v==9 ) goto int_as_real;
560 if( v==8 ){
561 if( pNode->u.zJContent[0]=='-' ){
562 sqlite3_result_int64(pCtx, SMALLEST_INT64);
563 goto int_done;
564 }else{
565 goto int_as_real;
566 }
567 }
568 }
569 i = i*10 + v;
570 }
drh52216ad2015-08-18 02:28:03 +0000571 if( pNode->u.zJContent[0]=='-' ){ i = -i; }
drh987eb1f2015-08-17 15:17:37 +0000572 sqlite3_result_int64(pCtx, i);
drh8deb4b82015-10-09 18:21:43 +0000573 int_done:
574 break;
drhe85e1da2021-10-01 21:01:07 +0000575 int_as_real: ; /* no break */ deliberate_fall_through
drh8deb4b82015-10-09 18:21:43 +0000576 }
577 case JSON_REAL: {
drh49472652015-10-16 15:35:39 +0000578 double r;
579#ifdef SQLITE_AMALGAMATION
drh285f2ef2021-10-15 16:15:04 +0000580 const char *z;
581 assert( pNode->eU==1 );
582 z = pNode->u.zJContent;
drh49472652015-10-16 15:35:39 +0000583 sqlite3AtoF(z, &r, sqlite3Strlen30(z), SQLITE_UTF8);
584#else
drh285f2ef2021-10-15 16:15:04 +0000585 assert( pNode->eU==1 );
drh49472652015-10-16 15:35:39 +0000586 r = strtod(pNode->u.zJContent, 0);
587#endif
drh8deb4b82015-10-09 18:21:43 +0000588 sqlite3_result_double(pCtx, r);
drh987eb1f2015-08-17 15:17:37 +0000589 break;
590 }
drh5634cc02015-08-17 11:28:03 +0000591 case JSON_STRING: {
drha8f39a92015-09-21 22:53:16 +0000592#if 0 /* Never happens because JNODE_RAW is only set by json_set(),
593 ** json_insert() and json_replace() and those routines do not
594 ** call jsonReturn() */
drh301eecc2015-08-17 20:14:19 +0000595 if( pNode->jnFlags & JNODE_RAW ){
drh285f2ef2021-10-15 16:15:04 +0000596 assert( pNode->eU==1 );
drh52216ad2015-08-18 02:28:03 +0000597 sqlite3_result_text(pCtx, pNode->u.zJContent, pNode->n,
598 SQLITE_TRANSIENT);
drha8f39a92015-09-21 22:53:16 +0000599 }else
600#endif
601 assert( (pNode->jnFlags & JNODE_RAW)==0 );
602 if( (pNode->jnFlags & JNODE_ESCAPE)==0 ){
drh987eb1f2015-08-17 15:17:37 +0000603 /* JSON formatted without any backslash-escapes */
drh285f2ef2021-10-15 16:15:04 +0000604 assert( pNode->eU==1 );
drh52216ad2015-08-18 02:28:03 +0000605 sqlite3_result_text(pCtx, pNode->u.zJContent+1, pNode->n-2,
drh987eb1f2015-08-17 15:17:37 +0000606 SQLITE_TRANSIENT);
drh5634cc02015-08-17 11:28:03 +0000607 }else{
608 /* Translate JSON formatted string into raw text */
drh987eb1f2015-08-17 15:17:37 +0000609 u32 i;
610 u32 n = pNode->n;
drh285f2ef2021-10-15 16:15:04 +0000611 const char *z;
drh987eb1f2015-08-17 15:17:37 +0000612 char *zOut;
613 u32 j;
drh285f2ef2021-10-15 16:15:04 +0000614 assert( pNode->eU==1 );
615 z = pNode->u.zJContent;
drh987eb1f2015-08-17 15:17:37 +0000616 zOut = sqlite3_malloc( n+1 );
617 if( zOut==0 ){
618 sqlite3_result_error_nomem(pCtx);
619 break;
620 }
621 for(i=1, j=0; i<n-1; i++){
622 char c = z[i];
drh80d87402015-08-24 12:42:41 +0000623 if( c!='\\' ){
drh987eb1f2015-08-17 15:17:37 +0000624 zOut[j++] = c;
625 }else{
626 c = z[++i];
drh80d87402015-08-24 12:42:41 +0000627 if( c=='u' ){
drh48eb03b2019-11-10 11:09:06 +0000628 u32 v = jsonHexToInt4(z+i+1);
629 i += 4;
drh80d87402015-08-24 12:42:41 +0000630 if( v==0 ) break;
drh987eb1f2015-08-17 15:17:37 +0000631 if( v<=0x7f ){
mistachkin16a93122015-09-11 18:05:01 +0000632 zOut[j++] = (char)v;
drh987eb1f2015-08-17 15:17:37 +0000633 }else if( v<=0x7ff ){
mistachkin16a93122015-09-11 18:05:01 +0000634 zOut[j++] = (char)(0xc0 | (v>>6));
drh987eb1f2015-08-17 15:17:37 +0000635 zOut[j++] = 0x80 | (v&0x3f);
drh80d87402015-08-24 12:42:41 +0000636 }else{
drh48eb03b2019-11-10 11:09:06 +0000637 u32 vlo;
638 if( (v&0xfc00)==0xd800
639 && i<n-6
640 && z[i+1]=='\\'
641 && z[i+2]=='u'
642 && ((vlo = jsonHexToInt4(z+i+3))&0xfc00)==0xdc00
643 ){
644 /* We have a surrogate pair */
645 v = ((v&0x3ff)<<10) + (vlo&0x3ff) + 0x10000;
646 i += 6;
647 zOut[j++] = 0xf0 | (v>>18);
648 zOut[j++] = 0x80 | ((v>>12)&0x3f);
649 zOut[j++] = 0x80 | ((v>>6)&0x3f);
650 zOut[j++] = 0x80 | (v&0x3f);
651 }else{
652 zOut[j++] = 0xe0 | (v>>12);
653 zOut[j++] = 0x80 | ((v>>6)&0x3f);
654 zOut[j++] = 0x80 | (v&0x3f);
655 }
drh987eb1f2015-08-17 15:17:37 +0000656 }
657 }else{
658 if( c=='b' ){
659 c = '\b';
660 }else if( c=='f' ){
661 c = '\f';
662 }else if( c=='n' ){
663 c = '\n';
664 }else if( c=='r' ){
665 c = '\r';
666 }else if( c=='t' ){
667 c = '\t';
668 }
669 zOut[j++] = c;
670 }
671 }
672 }
673 zOut[j] = 0;
674 sqlite3_result_text(pCtx, zOut, j, sqlite3_free);
drh5634cc02015-08-17 11:28:03 +0000675 }
676 break;
677 }
678 case JSON_ARRAY:
679 case JSON_OBJECT: {
drhf2df7e72015-08-28 20:07:40 +0000680 jsonReturnJson(pNode, pCtx, aReplace);
drh5634cc02015-08-17 11:28:03 +0000681 break;
682 }
683 }
drhbd0621b2015-08-13 13:54:59 +0000684}
685
drh95677942015-09-24 01:06:37 +0000686/* Forward reference */
687static int jsonParseAddNode(JsonParse*,u32,u32,const char*);
688
689/*
690** A macro to hint to the compiler that a function should not be
691** inlined.
692*/
693#if defined(__GNUC__)
694# define JSON_NOINLINE __attribute__((noinline))
695#elif defined(_MSC_VER) && _MSC_VER>=1310
696# define JSON_NOINLINE __declspec(noinline)
697#else
698# define JSON_NOINLINE
699#endif
700
701
702static JSON_NOINLINE int jsonParseAddNodeExpand(
703 JsonParse *pParse, /* Append the node to this object */
704 u32 eType, /* Node type */
705 u32 n, /* Content size or sub-node count */
706 const char *zContent /* Content */
707){
708 u32 nNew;
709 JsonNode *pNew;
710 assert( pParse->nNode>=pParse->nAlloc );
711 if( pParse->oom ) return -1;
712 nNew = pParse->nAlloc*2 + 10;
drh2d77d802019-01-08 20:02:48 +0000713 pNew = sqlite3_realloc64(pParse->aNode, sizeof(JsonNode)*nNew);
drh95677942015-09-24 01:06:37 +0000714 if( pNew==0 ){
715 pParse->oom = 1;
716 return -1;
717 }
718 pParse->nAlloc = nNew;
719 pParse->aNode = pNew;
720 assert( pParse->nNode<pParse->nAlloc );
721 return jsonParseAddNode(pParse, eType, n, zContent);
722}
723
drh5fa5c102015-08-12 16:49:40 +0000724/*
drhe9c37f32015-08-15 21:25:36 +0000725** Create a new JsonNode instance based on the arguments and append that
726** instance to the JsonParse. Return the index in pParse->aNode[] of the
727** new node, or -1 if a memory allocation fails.
728*/
729static int jsonParseAddNode(
730 JsonParse *pParse, /* Append the node to this object */
731 u32 eType, /* Node type */
732 u32 n, /* Content size or sub-node count */
733 const char *zContent /* Content */
734){
735 JsonNode *p;
drhaa6fe5b2021-10-04 13:18:44 +0000736 if( pParse->aNode==0 || pParse->nNode>=pParse->nAlloc ){
drh95677942015-09-24 01:06:37 +0000737 return jsonParseAddNodeExpand(pParse, eType, n, zContent);
drhe9c37f32015-08-15 21:25:36 +0000738 }
739 p = &pParse->aNode[pParse->nNode];
drh5634cc02015-08-17 11:28:03 +0000740 p->eType = (u8)eType;
drh301eecc2015-08-17 20:14:19 +0000741 p->jnFlags = 0;
drh285f2ef2021-10-15 16:15:04 +0000742 VVA( p->eU = zContent ? 1 : 0 );
drhe9c37f32015-08-15 21:25:36 +0000743 p->n = n;
drh52216ad2015-08-18 02:28:03 +0000744 p->u.zJContent = zContent;
drhe9c37f32015-08-15 21:25:36 +0000745 return pParse->nNode++;
746}
747
748/*
drhad875e72016-11-07 13:37:28 +0000749** Return true if z[] begins with 4 (or more) hexadecimal digits
750*/
751static int jsonIs4Hex(const char *z){
752 int i;
drh9dbf96b2022-01-06 01:40:09 +0000753 for(i=0; i<4; i++) if( !sqlite3Isxdigit(z[i]) ) return 0;
drhad875e72016-11-07 13:37:28 +0000754 return 1;
755}
756
757/*
drhe9c37f32015-08-15 21:25:36 +0000758** Parse a single JSON value which begins at pParse->zJson[i]. Return the
759** index of the first character past the end of the value parsed.
760**
761** Return negative for a syntax error. Special cases: return -2 if the
762** first non-whitespace character is '}' and return -3 if the first
763** non-whitespace character is ']'.
764*/
765static int jsonParseValue(JsonParse *pParse, u32 i){
766 char c;
767 u32 j;
drhbc8f0922015-08-22 19:39:04 +0000768 int iThis;
drhe9c37f32015-08-15 21:25:36 +0000769 int x;
drh852944e2015-09-10 03:29:11 +0000770 JsonNode *pNode;
drh9fa866a2017-04-08 18:18:22 +0000771 const char *z = pParse->zJson;
drh9dbf96b2022-01-06 01:40:09 +0000772 while( fast_isspace(z[i]) ){ i++; }
drh9fa866a2017-04-08 18:18:22 +0000773 if( (c = z[i])=='{' ){
drhe9c37f32015-08-15 21:25:36 +0000774 /* Parse object */
775 iThis = jsonParseAddNode(pParse, JSON_OBJECT, 0, 0);
drhbc8f0922015-08-22 19:39:04 +0000776 if( iThis<0 ) return -1;
drhe9c37f32015-08-15 21:25:36 +0000777 for(j=i+1;;j++){
drh9dbf96b2022-01-06 01:40:09 +0000778 while( fast_isspace(z[j]) ){ j++; }
drhff6d50e2017-04-11 18:55:05 +0000779 if( ++pParse->iDepth > JSON_MAX_DEPTH ) return -1;
drhe9c37f32015-08-15 21:25:36 +0000780 x = jsonParseValue(pParse, j);
781 if( x<0 ){
drhff6d50e2017-04-11 18:55:05 +0000782 pParse->iDepth--;
drhf27cd1f2015-09-23 01:10:29 +0000783 if( x==(-2) && pParse->nNode==(u32)iThis+1 ) return j+1;
drhe9c37f32015-08-15 21:25:36 +0000784 return -1;
785 }
drhbe9474e2015-08-22 03:05:54 +0000786 if( pParse->oom ) return -1;
drh852944e2015-09-10 03:29:11 +0000787 pNode = &pParse->aNode[pParse->nNode-1];
788 if( pNode->eType!=JSON_STRING ) return -1;
789 pNode->jnFlags |= JNODE_LABEL;
drhe9c37f32015-08-15 21:25:36 +0000790 j = x;
drh9dbf96b2022-01-06 01:40:09 +0000791 while( fast_isspace(z[j]) ){ j++; }
drh9fa866a2017-04-08 18:18:22 +0000792 if( z[j]!=':' ) return -1;
drhe9c37f32015-08-15 21:25:36 +0000793 j++;
794 x = jsonParseValue(pParse, j);
drhff6d50e2017-04-11 18:55:05 +0000795 pParse->iDepth--;
drhe9c37f32015-08-15 21:25:36 +0000796 if( x<0 ) return -1;
797 j = x;
drh9dbf96b2022-01-06 01:40:09 +0000798 while( fast_isspace(z[j]) ){ j++; }
drh9fa866a2017-04-08 18:18:22 +0000799 c = z[j];
drhe9c37f32015-08-15 21:25:36 +0000800 if( c==',' ) continue;
801 if( c!='}' ) return -1;
802 break;
803 }
drhbc8f0922015-08-22 19:39:04 +0000804 pParse->aNode[iThis].n = pParse->nNode - (u32)iThis - 1;
drhe9c37f32015-08-15 21:25:36 +0000805 return j+1;
806 }else if( c=='[' ){
807 /* Parse array */
808 iThis = jsonParseAddNode(pParse, JSON_ARRAY, 0, 0);
drhbc8f0922015-08-22 19:39:04 +0000809 if( iThis<0 ) return -1;
drh285f2ef2021-10-15 16:15:04 +0000810 memset(&pParse->aNode[iThis].u, 0, sizeof(pParse->aNode[iThis].u));
drhe9c37f32015-08-15 21:25:36 +0000811 for(j=i+1;;j++){
drh9dbf96b2022-01-06 01:40:09 +0000812 while( fast_isspace(z[j]) ){ j++; }
drhff6d50e2017-04-11 18:55:05 +0000813 if( ++pParse->iDepth > JSON_MAX_DEPTH ) return -1;
drhe9c37f32015-08-15 21:25:36 +0000814 x = jsonParseValue(pParse, j);
drhff6d50e2017-04-11 18:55:05 +0000815 pParse->iDepth--;
drhe9c37f32015-08-15 21:25:36 +0000816 if( x<0 ){
drhf27cd1f2015-09-23 01:10:29 +0000817 if( x==(-3) && pParse->nNode==(u32)iThis+1 ) return j+1;
drhe9c37f32015-08-15 21:25:36 +0000818 return -1;
819 }
820 j = x;
drh9dbf96b2022-01-06 01:40:09 +0000821 while( fast_isspace(z[j]) ){ j++; }
drh9fa866a2017-04-08 18:18:22 +0000822 c = z[j];
drhe9c37f32015-08-15 21:25:36 +0000823 if( c==',' ) continue;
824 if( c!=']' ) return -1;
825 break;
826 }
drhbc8f0922015-08-22 19:39:04 +0000827 pParse->aNode[iThis].n = pParse->nNode - (u32)iThis - 1;
drhe9c37f32015-08-15 21:25:36 +0000828 return j+1;
829 }else if( c=='"' ){
830 /* Parse string */
drh301eecc2015-08-17 20:14:19 +0000831 u8 jnFlags = 0;
drhe9c37f32015-08-15 21:25:36 +0000832 j = i+1;
833 for(;;){
drh9fa866a2017-04-08 18:18:22 +0000834 c = z[j];
drh86715382017-04-13 00:12:32 +0000835 if( (c & ~0x1f)==0 ){
836 /* Control characters are not allowed in strings */
837 return -1;
838 }
drhe9c37f32015-08-15 21:25:36 +0000839 if( c=='\\' ){
drh9fa866a2017-04-08 18:18:22 +0000840 c = z[++j];
drhad875e72016-11-07 13:37:28 +0000841 if( c=='"' || c=='\\' || c=='/' || c=='b' || c=='f'
842 || c=='n' || c=='r' || c=='t'
drh9fa866a2017-04-08 18:18:22 +0000843 || (c=='u' && jsonIs4Hex(z+j+1)) ){
drhad875e72016-11-07 13:37:28 +0000844 jnFlags = JNODE_ESCAPE;
845 }else{
846 return -1;
847 }
drhe9c37f32015-08-15 21:25:36 +0000848 }else if( c=='"' ){
849 break;
850 }
851 j++;
852 }
drh9fa866a2017-04-08 18:18:22 +0000853 jsonParseAddNode(pParse, JSON_STRING, j+1-i, &z[i]);
drhbe9474e2015-08-22 03:05:54 +0000854 if( !pParse->oom ) pParse->aNode[pParse->nNode-1].jnFlags = jnFlags;
drhe9c37f32015-08-15 21:25:36 +0000855 return j+1;
856 }else if( c=='n'
drh9fa866a2017-04-08 18:18:22 +0000857 && strncmp(z+i,"null",4)==0
drh9dbf96b2022-01-06 01:40:09 +0000858 && !sqlite3Isalnum(z[i+4]) ){
drhe9c37f32015-08-15 21:25:36 +0000859 jsonParseAddNode(pParse, JSON_NULL, 0, 0);
860 return i+4;
861 }else if( c=='t'
drh9fa866a2017-04-08 18:18:22 +0000862 && strncmp(z+i,"true",4)==0
drh9dbf96b2022-01-06 01:40:09 +0000863 && !sqlite3Isalnum(z[i+4]) ){
drhe9c37f32015-08-15 21:25:36 +0000864 jsonParseAddNode(pParse, JSON_TRUE, 0, 0);
865 return i+4;
866 }else if( c=='f'
drh9fa866a2017-04-08 18:18:22 +0000867 && strncmp(z+i,"false",5)==0
drh9dbf96b2022-01-06 01:40:09 +0000868 && !sqlite3Isalnum(z[i+5]) ){
drhe9c37f32015-08-15 21:25:36 +0000869 jsonParseAddNode(pParse, JSON_FALSE, 0, 0);
870 return i+5;
871 }else if( c=='-' || (c>='0' && c<='9') ){
872 /* Parse number */
873 u8 seenDP = 0;
874 u8 seenE = 0;
drh9fa866a2017-04-08 18:18:22 +0000875 assert( '-' < '0' );
876 if( c<='0' ){
877 j = c=='-' ? i+1 : i;
878 if( z[j]=='0' && z[j+1]>='0' && z[j+1]<='9' ) return -1;
879 }
drhe9c37f32015-08-15 21:25:36 +0000880 j = i+1;
881 for(;; j++){
drh9fa866a2017-04-08 18:18:22 +0000882 c = z[j];
drhe9c37f32015-08-15 21:25:36 +0000883 if( c>='0' && c<='9' ) continue;
884 if( c=='.' ){
drh9fa866a2017-04-08 18:18:22 +0000885 if( z[j-1]=='-' ) return -1;
drhe9c37f32015-08-15 21:25:36 +0000886 if( seenDP ) return -1;
887 seenDP = 1;
888 continue;
889 }
890 if( c=='e' || c=='E' ){
drh9fa866a2017-04-08 18:18:22 +0000891 if( z[j-1]<'0' ) return -1;
drhe9c37f32015-08-15 21:25:36 +0000892 if( seenE ) return -1;
893 seenDP = seenE = 1;
drh9fa866a2017-04-08 18:18:22 +0000894 c = z[j+1];
drh8784eca2015-08-23 02:42:30 +0000895 if( c=='+' || c=='-' ){
896 j++;
drh9fa866a2017-04-08 18:18:22 +0000897 c = z[j+1];
drh8784eca2015-08-23 02:42:30 +0000898 }
drhd1f00682015-08-29 16:02:37 +0000899 if( c<'0' || c>'9' ) return -1;
drhe9c37f32015-08-15 21:25:36 +0000900 continue;
901 }
902 break;
903 }
drh9fa866a2017-04-08 18:18:22 +0000904 if( z[j-1]<'0' ) return -1;
drhe9c37f32015-08-15 21:25:36 +0000905 jsonParseAddNode(pParse, seenDP ? JSON_REAL : JSON_INT,
drh9fa866a2017-04-08 18:18:22 +0000906 j - i, &z[i]);
drhe9c37f32015-08-15 21:25:36 +0000907 return j;
908 }else if( c=='}' ){
909 return -2; /* End of {...} */
910 }else if( c==']' ){
911 return -3; /* End of [...] */
drh8cb15cc2015-09-24 01:40:45 +0000912 }else if( c==0 ){
913 return 0; /* End of file */
drhe9c37f32015-08-15 21:25:36 +0000914 }else{
915 return -1; /* Syntax error */
916 }
917}
918
919/*
920** Parse a complete JSON string. Return 0 on success or non-zero if there
921** are any errors. If an error occurs, free all memory associated with
922** pParse.
923**
924** pParse is uninitialized when this routine is called.
925*/
drhbc8f0922015-08-22 19:39:04 +0000926static int jsonParse(
927 JsonParse *pParse, /* Initialize and fill this JsonParse object */
928 sqlite3_context *pCtx, /* Report errors here */
929 const char *zJson /* Input JSON text to be parsed */
930){
drhe9c37f32015-08-15 21:25:36 +0000931 int i;
drhe9c37f32015-08-15 21:25:36 +0000932 memset(pParse, 0, sizeof(*pParse));
drhc3722b22015-08-23 20:44:59 +0000933 if( zJson==0 ) return 1;
drhe9c37f32015-08-15 21:25:36 +0000934 pParse->zJson = zJson;
935 i = jsonParseValue(pParse, 0);
drhc3722b22015-08-23 20:44:59 +0000936 if( pParse->oom ) i = -1;
drhe9c37f32015-08-15 21:25:36 +0000937 if( i>0 ){
drhff6d50e2017-04-11 18:55:05 +0000938 assert( pParse->iDepth==0 );
drh9dbf96b2022-01-06 01:40:09 +0000939 while( fast_isspace(zJson[i]) ) i++;
drhe9c37f32015-08-15 21:25:36 +0000940 if( zJson[i] ) i = -1;
941 }
drhd1f00682015-08-29 16:02:37 +0000942 if( i<=0 ){
drhf2df7e72015-08-28 20:07:40 +0000943 if( pCtx!=0 ){
944 if( pParse->oom ){
945 sqlite3_result_error_nomem(pCtx);
946 }else{
947 sqlite3_result_error(pCtx, "malformed JSON", -1);
948 }
949 }
drh505ad2c2015-08-21 17:33:11 +0000950 jsonParseReset(pParse);
drhe9c37f32015-08-15 21:25:36 +0000951 return 1;
952 }
953 return 0;
954}
drh301eecc2015-08-17 20:14:19 +0000955
drh505ad2c2015-08-21 17:33:11 +0000956/* Mark node i of pParse as being a child of iParent. Call recursively
957** to fill in all the descendants of node i.
958*/
959static void jsonParseFillInParentage(JsonParse *pParse, u32 i, u32 iParent){
960 JsonNode *pNode = &pParse->aNode[i];
961 u32 j;
962 pParse->aUp[i] = iParent;
963 switch( pNode->eType ){
964 case JSON_ARRAY: {
965 for(j=1; j<=pNode->n; j += jsonNodeSize(pNode+j)){
966 jsonParseFillInParentage(pParse, i+j, i);
967 }
968 break;
969 }
970 case JSON_OBJECT: {
971 for(j=1; j<=pNode->n; j += jsonNodeSize(pNode+j+1)+1){
972 pParse->aUp[i+j] = i;
973 jsonParseFillInParentage(pParse, i+j+1, i);
974 }
975 break;
976 }
977 default: {
978 break;
979 }
980 }
981}
982
983/*
984** Compute the parentage of all nodes in a completed parse.
985*/
986static int jsonParseFindParents(JsonParse *pParse){
987 u32 *aUp;
988 assert( pParse->aUp==0 );
drh2d77d802019-01-08 20:02:48 +0000989 aUp = pParse->aUp = sqlite3_malloc64( sizeof(u32)*pParse->nNode );
drhc3722b22015-08-23 20:44:59 +0000990 if( aUp==0 ){
991 pParse->oom = 1;
992 return SQLITE_NOMEM;
993 }
drh505ad2c2015-08-21 17:33:11 +0000994 jsonParseFillInParentage(pParse, 0, 0);
995 return SQLITE_OK;
996}
997
drh8cb0c832015-09-22 00:21:03 +0000998/*
drh3fb153c2017-05-11 16:49:59 +0000999** Magic number used for the JSON parse cache in sqlite3_get_auxdata()
1000*/
drhe35fc302018-08-30 01:52:10 +00001001#define JSON_CACHE_ID (-429938) /* First cache entry */
1002#define JSON_CACHE_SZ 4 /* Max number of cache entries */
drh3fb153c2017-05-11 16:49:59 +00001003
1004/*
1005** Obtain a complete parse of the JSON found in the first argument
1006** of the argv array. Use the sqlite3_get_auxdata() cache for this
1007** parse if it is available. If the cache is not available or if it
1008** is no longer valid, parse the JSON again and return the new parse,
1009** and also register the new parse so that it will be available for
1010** future sqlite3_get_auxdata() calls.
1011*/
1012static JsonParse *jsonParseCached(
1013 sqlite3_context *pCtx,
drhe35fc302018-08-30 01:52:10 +00001014 sqlite3_value **argv,
1015 sqlite3_context *pErrCtx
drh3fb153c2017-05-11 16:49:59 +00001016){
1017 const char *zJson = (const char*)sqlite3_value_text(argv[0]);
1018 int nJson = sqlite3_value_bytes(argv[0]);
1019 JsonParse *p;
drhe35fc302018-08-30 01:52:10 +00001020 JsonParse *pMatch = 0;
1021 int iKey;
1022 int iMinKey = 0;
1023 u32 iMinHold = 0xffffffff;
1024 u32 iMaxHold = 0;
drh3fb153c2017-05-11 16:49:59 +00001025 if( zJson==0 ) return 0;
drhe35fc302018-08-30 01:52:10 +00001026 for(iKey=0; iKey<JSON_CACHE_SZ; iKey++){
1027 p = (JsonParse*)sqlite3_get_auxdata(pCtx, JSON_CACHE_ID+iKey);
1028 if( p==0 ){
1029 iMinKey = iKey;
1030 break;
1031 }
1032 if( pMatch==0
1033 && p->nJson==nJson
1034 && memcmp(p->zJson,zJson,nJson)==0
1035 ){
1036 p->nErr = 0;
1037 pMatch = p;
1038 }else if( p->iHold<iMinHold ){
1039 iMinHold = p->iHold;
1040 iMinKey = iKey;
1041 }
1042 if( p->iHold>iMaxHold ){
1043 iMaxHold = p->iHold;
1044 }
1045 }
1046 if( pMatch ){
1047 pMatch->nErr = 0;
1048 pMatch->iHold = iMaxHold+1;
1049 return pMatch;
drh3fb153c2017-05-11 16:49:59 +00001050 }
drh2d77d802019-01-08 20:02:48 +00001051 p = sqlite3_malloc64( sizeof(*p) + nJson + 1 );
drh3fb153c2017-05-11 16:49:59 +00001052 if( p==0 ){
1053 sqlite3_result_error_nomem(pCtx);
1054 return 0;
1055 }
1056 memset(p, 0, sizeof(*p));
1057 p->zJson = (char*)&p[1];
1058 memcpy((char*)p->zJson, zJson, nJson+1);
drhe35fc302018-08-30 01:52:10 +00001059 if( jsonParse(p, pErrCtx, p->zJson) ){
drh3fb153c2017-05-11 16:49:59 +00001060 sqlite3_free(p);
1061 return 0;
1062 }
1063 p->nJson = nJson;
drhe35fc302018-08-30 01:52:10 +00001064 p->iHold = iMaxHold+1;
1065 sqlite3_set_auxdata(pCtx, JSON_CACHE_ID+iMinKey, p,
1066 (void(*)(void*))jsonParseFree);
1067 return (JsonParse*)sqlite3_get_auxdata(pCtx, JSON_CACHE_ID+iMinKey);
drh3fb153c2017-05-11 16:49:59 +00001068}
1069
1070/*
drh8cb0c832015-09-22 00:21:03 +00001071** Compare the OBJECT label at pNode against zKey,nKey. Return true on
1072** a match.
1073*/
mistachkinf2c26ed2015-10-12 22:20:29 +00001074static int jsonLabelCompare(JsonNode *pNode, const char *zKey, u32 nKey){
drh285f2ef2021-10-15 16:15:04 +00001075 assert( pNode->eU==1 );
drh8cb0c832015-09-22 00:21:03 +00001076 if( pNode->jnFlags & JNODE_RAW ){
1077 if( pNode->n!=nKey ) return 0;
1078 return strncmp(pNode->u.zJContent, zKey, nKey)==0;
1079 }else{
1080 if( pNode->n!=nKey+2 ) return 0;
1081 return strncmp(pNode->u.zJContent+1, zKey, nKey)==0;
1082 }
1083}
1084
drh52216ad2015-08-18 02:28:03 +00001085/* forward declaration */
drha7714022015-08-29 00:54:49 +00001086static JsonNode *jsonLookupAppend(JsonParse*,const char*,int*,const char**);
drh52216ad2015-08-18 02:28:03 +00001087
drh987eb1f2015-08-17 15:17:37 +00001088/*
1089** Search along zPath to find the node specified. Return a pointer
1090** to that node, or NULL if zPath is malformed or if there is no such
1091** node.
drh52216ad2015-08-18 02:28:03 +00001092**
1093** If pApnd!=0, then try to append new nodes to complete zPath if it is
1094** possible to do so and if no existing node corresponds to zPath. If
1095** new nodes are appended *pApnd is set to 1.
drh987eb1f2015-08-17 15:17:37 +00001096*/
drha7714022015-08-29 00:54:49 +00001097static JsonNode *jsonLookupStep(
drh52216ad2015-08-18 02:28:03 +00001098 JsonParse *pParse, /* The JSON to search */
1099 u32 iRoot, /* Begin the search at this node */
1100 const char *zPath, /* The path to search */
drha7714022015-08-29 00:54:49 +00001101 int *pApnd, /* Append nodes to complete path if not NULL */
1102 const char **pzErr /* Make *pzErr point to any syntax error in zPath */
drh52216ad2015-08-18 02:28:03 +00001103){
drhbc8f0922015-08-22 19:39:04 +00001104 u32 i, j, nKey;
drh6b43cc82015-08-19 23:02:49 +00001105 const char *zKey;
drh52216ad2015-08-18 02:28:03 +00001106 JsonNode *pRoot = &pParse->aNode[iRoot];
drh987eb1f2015-08-17 15:17:37 +00001107 if( zPath[0]==0 ) return pRoot;
drh7e35e812019-07-31 12:13:58 +00001108 if( pRoot->jnFlags & JNODE_REPLACE ) return 0;
drh987eb1f2015-08-17 15:17:37 +00001109 if( zPath[0]=='.' ){
1110 if( pRoot->eType!=JSON_OBJECT ) return 0;
1111 zPath++;
drh6b43cc82015-08-19 23:02:49 +00001112 if( zPath[0]=='"' ){
1113 zKey = zPath + 1;
1114 for(i=1; zPath[i] && zPath[i]!='"'; i++){}
1115 nKey = i-1;
drha8f39a92015-09-21 22:53:16 +00001116 if( zPath[i] ){
1117 i++;
1118 }else{
1119 *pzErr = zPath;
1120 return 0;
1121 }
drh6b43cc82015-08-19 23:02:49 +00001122 }else{
1123 zKey = zPath;
1124 for(i=0; zPath[i] && zPath[i]!='.' && zPath[i]!='['; i++){}
1125 nKey = i;
1126 }
drha7714022015-08-29 00:54:49 +00001127 if( nKey==0 ){
1128 *pzErr = zPath;
1129 return 0;
1130 }
drh987eb1f2015-08-17 15:17:37 +00001131 j = 1;
drh52216ad2015-08-18 02:28:03 +00001132 for(;;){
1133 while( j<=pRoot->n ){
drh8cb0c832015-09-22 00:21:03 +00001134 if( jsonLabelCompare(pRoot+j, zKey, nKey) ){
drha7714022015-08-29 00:54:49 +00001135 return jsonLookupStep(pParse, iRoot+j+1, &zPath[i], pApnd, pzErr);
drh52216ad2015-08-18 02:28:03 +00001136 }
1137 j++;
drh505ad2c2015-08-21 17:33:11 +00001138 j += jsonNodeSize(&pRoot[j]);
drh987eb1f2015-08-17 15:17:37 +00001139 }
drh52216ad2015-08-18 02:28:03 +00001140 if( (pRoot->jnFlags & JNODE_APPEND)==0 ) break;
drh285f2ef2021-10-15 16:15:04 +00001141 assert( pRoot->eU==2 );
drh52216ad2015-08-18 02:28:03 +00001142 iRoot += pRoot->u.iAppend;
1143 pRoot = &pParse->aNode[iRoot];
1144 j = 1;
1145 }
1146 if( pApnd ){
drhbc8f0922015-08-22 19:39:04 +00001147 u32 iStart, iLabel;
1148 JsonNode *pNode;
1149 iStart = jsonParseAddNode(pParse, JSON_OBJECT, 2, 0);
danfe9a8322019-06-17 14:50:33 +00001150 iLabel = jsonParseAddNode(pParse, JSON_STRING, nKey, zKey);
drh52216ad2015-08-18 02:28:03 +00001151 zPath += i;
drha7714022015-08-29 00:54:49 +00001152 pNode = jsonLookupAppend(pParse, zPath, pApnd, pzErr);
drhbc8f0922015-08-22 19:39:04 +00001153 if( pParse->oom ) return 0;
1154 if( pNode ){
1155 pRoot = &pParse->aNode[iRoot];
drh285f2ef2021-10-15 16:15:04 +00001156 assert( pRoot->eU==0 );
drhbc8f0922015-08-22 19:39:04 +00001157 pRoot->u.iAppend = iStart - iRoot;
1158 pRoot->jnFlags |= JNODE_APPEND;
drh285f2ef2021-10-15 16:15:04 +00001159 VVA( pRoot->eU = 2 );
drhbc8f0922015-08-22 19:39:04 +00001160 pParse->aNode[iLabel].jnFlags |= JNODE_RAW;
1161 }
1162 return pNode;
drh987eb1f2015-08-17 15:17:37 +00001163 }
drh52818642019-11-22 17:37:56 +00001164 }else if( zPath[0]=='[' ){
drh987eb1f2015-08-17 15:17:37 +00001165 i = 0;
drh3d1d2a92015-09-22 01:15:49 +00001166 j = 1;
drh9dbf96b2022-01-06 01:40:09 +00001167 while( sqlite3Isdigit(zPath[j]) ){
drh3d1d2a92015-09-22 01:15:49 +00001168 i = i*10 + zPath[j] - '0';
1169 j++;
drh987eb1f2015-08-17 15:17:37 +00001170 }
drh52818642019-11-22 17:37:56 +00001171 if( j<2 || zPath[j]!=']' ){
1172 if( zPath[1]=='#' ){
1173 JsonNode *pBase = pRoot;
1174 int iBase = iRoot;
1175 if( pRoot->eType!=JSON_ARRAY ) return 0;
1176 for(;;){
1177 while( j<=pBase->n ){
1178 if( (pBase[j].jnFlags & JNODE_REMOVE)==0 ) i++;
1179 j += jsonNodeSize(&pBase[j]);
1180 }
1181 if( (pBase->jnFlags & JNODE_APPEND)==0 ) break;
drh285f2ef2021-10-15 16:15:04 +00001182 assert( pBase->eU==2 );
drh52818642019-11-22 17:37:56 +00001183 iBase += pBase->u.iAppend;
1184 pBase = &pParse->aNode[iBase];
1185 j = 1;
1186 }
1187 j = 2;
drh9dbf96b2022-01-06 01:40:09 +00001188 if( zPath[2]=='-' && sqlite3Isdigit(zPath[3]) ){
drh52818642019-11-22 17:37:56 +00001189 unsigned int x = 0;
1190 j = 3;
1191 do{
1192 x = x*10 + zPath[j] - '0';
1193 j++;
drh9dbf96b2022-01-06 01:40:09 +00001194 }while( sqlite3Isdigit(zPath[j]) );
drh52818642019-11-22 17:37:56 +00001195 if( x>i ) return 0;
1196 i -= x;
1197 }
1198 if( zPath[j]!=']' ){
1199 *pzErr = zPath;
1200 return 0;
1201 }
1202 }else{
1203 *pzErr = zPath;
1204 return 0;
1205 }
drha7714022015-08-29 00:54:49 +00001206 }
drh52818642019-11-22 17:37:56 +00001207 if( pRoot->eType!=JSON_ARRAY ) return 0;
drh3d1d2a92015-09-22 01:15:49 +00001208 zPath += j + 1;
drh987eb1f2015-08-17 15:17:37 +00001209 j = 1;
drh52216ad2015-08-18 02:28:03 +00001210 for(;;){
drhbc8f0922015-08-22 19:39:04 +00001211 while( j<=pRoot->n && (i>0 || (pRoot[j].jnFlags & JNODE_REMOVE)!=0) ){
1212 if( (pRoot[j].jnFlags & JNODE_REMOVE)==0 ) i--;
drh505ad2c2015-08-21 17:33:11 +00001213 j += jsonNodeSize(&pRoot[j]);
drh52216ad2015-08-18 02:28:03 +00001214 }
1215 if( (pRoot->jnFlags & JNODE_APPEND)==0 ) break;
drh285f2ef2021-10-15 16:15:04 +00001216 assert( pRoot->eU==2 );
drh52216ad2015-08-18 02:28:03 +00001217 iRoot += pRoot->u.iAppend;
1218 pRoot = &pParse->aNode[iRoot];
1219 j = 1;
drh987eb1f2015-08-17 15:17:37 +00001220 }
1221 if( j<=pRoot->n ){
drha7714022015-08-29 00:54:49 +00001222 return jsonLookupStep(pParse, iRoot+j, zPath, pApnd, pzErr);
drh52216ad2015-08-18 02:28:03 +00001223 }
1224 if( i==0 && pApnd ){
drhbc8f0922015-08-22 19:39:04 +00001225 u32 iStart;
1226 JsonNode *pNode;
1227 iStart = jsonParseAddNode(pParse, JSON_ARRAY, 1, 0);
drha7714022015-08-29 00:54:49 +00001228 pNode = jsonLookupAppend(pParse, zPath, pApnd, pzErr);
drhbc8f0922015-08-22 19:39:04 +00001229 if( pParse->oom ) return 0;
1230 if( pNode ){
1231 pRoot = &pParse->aNode[iRoot];
drh285f2ef2021-10-15 16:15:04 +00001232 assert( pRoot->eU==0 );
drhbc8f0922015-08-22 19:39:04 +00001233 pRoot->u.iAppend = iStart - iRoot;
1234 pRoot->jnFlags |= JNODE_APPEND;
drh285f2ef2021-10-15 16:15:04 +00001235 VVA( pRoot->eU = 2 );
drhbc8f0922015-08-22 19:39:04 +00001236 }
1237 return pNode;
drh987eb1f2015-08-17 15:17:37 +00001238 }
drh3d1d2a92015-09-22 01:15:49 +00001239 }else{
drha7714022015-08-29 00:54:49 +00001240 *pzErr = zPath;
drh987eb1f2015-08-17 15:17:37 +00001241 }
1242 return 0;
1243}
1244
drh52216ad2015-08-18 02:28:03 +00001245/*
drhbc8f0922015-08-22 19:39:04 +00001246** Append content to pParse that will complete zPath. Return a pointer
1247** to the inserted node, or return NULL if the append fails.
drh52216ad2015-08-18 02:28:03 +00001248*/
1249static JsonNode *jsonLookupAppend(
1250 JsonParse *pParse, /* Append content to the JSON parse */
1251 const char *zPath, /* Description of content to append */
drha7714022015-08-29 00:54:49 +00001252 int *pApnd, /* Set this flag to 1 */
1253 const char **pzErr /* Make this point to any syntax error */
drh52216ad2015-08-18 02:28:03 +00001254){
1255 *pApnd = 1;
1256 if( zPath[0]==0 ){
1257 jsonParseAddNode(pParse, JSON_NULL, 0, 0);
1258 return pParse->oom ? 0 : &pParse->aNode[pParse->nNode-1];
1259 }
1260 if( zPath[0]=='.' ){
1261 jsonParseAddNode(pParse, JSON_OBJECT, 0, 0);
1262 }else if( strncmp(zPath,"[0]",3)==0 ){
1263 jsonParseAddNode(pParse, JSON_ARRAY, 0, 0);
1264 }else{
1265 return 0;
1266 }
1267 if( pParse->oom ) return 0;
drha7714022015-08-29 00:54:49 +00001268 return jsonLookupStep(pParse, pParse->nNode-1, zPath, pApnd, pzErr);
drh52216ad2015-08-18 02:28:03 +00001269}
1270
drhbc8f0922015-08-22 19:39:04 +00001271/*
drha7714022015-08-29 00:54:49 +00001272** Return the text of a syntax error message on a JSON path. Space is
1273** obtained from sqlite3_malloc().
1274*/
1275static char *jsonPathSyntaxError(const char *zErr){
1276 return sqlite3_mprintf("JSON path error near '%q'", zErr);
1277}
1278
1279/*
1280** Do a node lookup using zPath. Return a pointer to the node on success.
1281** Return NULL if not found or if there is an error.
1282**
1283** On an error, write an error message into pCtx and increment the
1284** pParse->nErr counter.
1285**
1286** If pApnd!=NULL then try to append missing nodes and set *pApnd = 1 if
1287** nodes are appended.
drha7714022015-08-29 00:54:49 +00001288*/
1289static JsonNode *jsonLookup(
1290 JsonParse *pParse, /* The JSON to search */
1291 const char *zPath, /* The path to search */
1292 int *pApnd, /* Append nodes to complete path if not NULL */
drhf5ddb9c2015-09-11 00:06:41 +00001293 sqlite3_context *pCtx /* Report errors here, if not NULL */
drha7714022015-08-29 00:54:49 +00001294){
1295 const char *zErr = 0;
1296 JsonNode *pNode = 0;
drha8f39a92015-09-21 22:53:16 +00001297 char *zMsg;
drha7714022015-08-29 00:54:49 +00001298
1299 if( zPath==0 ) return 0;
1300 if( zPath[0]!='$' ){
1301 zErr = zPath;
1302 goto lookup_err;
1303 }
1304 zPath++;
drha7714022015-08-29 00:54:49 +00001305 pNode = jsonLookupStep(pParse, 0, zPath, pApnd, &zErr);
drha8f39a92015-09-21 22:53:16 +00001306 if( zErr==0 ) return pNode;
drha7714022015-08-29 00:54:49 +00001307
1308lookup_err:
1309 pParse->nErr++;
drha8f39a92015-09-21 22:53:16 +00001310 assert( zErr!=0 && pCtx!=0 );
1311 zMsg = jsonPathSyntaxError(zErr);
1312 if( zMsg ){
1313 sqlite3_result_error(pCtx, zMsg, -1);
1314 sqlite3_free(zMsg);
1315 }else{
1316 sqlite3_result_error_nomem(pCtx);
drha7714022015-08-29 00:54:49 +00001317 }
drha7714022015-08-29 00:54:49 +00001318 return 0;
1319}
1320
1321
1322/*
drhbc8f0922015-08-22 19:39:04 +00001323** Report the wrong number of arguments for json_insert(), json_replace()
1324** or json_set().
1325*/
1326static void jsonWrongNumArgs(
1327 sqlite3_context *pCtx,
1328 const char *zFuncName
1329){
1330 char *zMsg = sqlite3_mprintf("json_%s() needs an odd number of arguments",
1331 zFuncName);
1332 sqlite3_result_error(pCtx, zMsg, -1);
1333 sqlite3_free(zMsg);
1334}
drh52216ad2015-08-18 02:28:03 +00001335
drh29c99692017-03-24 12:35:17 +00001336/*
1337** Mark all NULL entries in the Object passed in as JNODE_REMOVE.
1338*/
1339static void jsonRemoveAllNulls(JsonNode *pNode){
1340 int i, n;
1341 assert( pNode->eType==JSON_OBJECT );
1342 n = pNode->n;
1343 for(i=2; i<=n; i += jsonNodeSize(&pNode[i])+1){
1344 switch( pNode[i].eType ){
1345 case JSON_NULL:
1346 pNode[i].jnFlags |= JNODE_REMOVE;
1347 break;
1348 case JSON_OBJECT:
1349 jsonRemoveAllNulls(&pNode[i]);
1350 break;
1351 }
1352 }
1353}
1354
drha7714022015-08-29 00:54:49 +00001355
drh987eb1f2015-08-17 15:17:37 +00001356/****************************************************************************
1357** SQL functions used for testing and debugging
1358****************************************************************************/
drhe9c37f32015-08-15 21:25:36 +00001359
drh301eecc2015-08-17 20:14:19 +00001360#ifdef SQLITE_DEBUG
drhe9c37f32015-08-15 21:25:36 +00001361/*
drh5634cc02015-08-17 11:28:03 +00001362** The json_parse(JSON) function returns a string which describes
drhe9c37f32015-08-15 21:25:36 +00001363** a parse of the JSON provided. Or it returns NULL if JSON is not
1364** well-formed.
1365*/
drh5634cc02015-08-17 11:28:03 +00001366static void jsonParseFunc(
drhbc8f0922015-08-22 19:39:04 +00001367 sqlite3_context *ctx,
drhe9c37f32015-08-15 21:25:36 +00001368 int argc,
1369 sqlite3_value **argv
1370){
drh505ad2c2015-08-21 17:33:11 +00001371 JsonString s; /* Output string - not real JSON */
1372 JsonParse x; /* The parse */
drhe9c37f32015-08-15 21:25:36 +00001373 u32 i;
drhe9c37f32015-08-15 21:25:36 +00001374
1375 assert( argc==1 );
drhbc8f0922015-08-22 19:39:04 +00001376 if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return;
drh8784eca2015-08-23 02:42:30 +00001377 jsonParseFindParents(&x);
drhbc8f0922015-08-22 19:39:04 +00001378 jsonInit(&s, ctx);
drhe9c37f32015-08-15 21:25:36 +00001379 for(i=0; i<x.nNode; i++){
drh852944e2015-09-10 03:29:11 +00001380 const char *zType;
1381 if( x.aNode[i].jnFlags & JNODE_LABEL ){
1382 assert( x.aNode[i].eType==JSON_STRING );
1383 zType = "label";
1384 }else{
1385 zType = jsonType[x.aNode[i].eType];
drhe9c37f32015-08-15 21:25:36 +00001386 }
drh852944e2015-09-10 03:29:11 +00001387 jsonPrintf(100, &s,"node %3u: %7s n=%-4d up=%-4d",
1388 i, zType, x.aNode[i].n, x.aUp[i]);
drh285f2ef2021-10-15 16:15:04 +00001389 assert( x.aNode[i].eU==0 || x.aNode[i].eU==1 );
drh852944e2015-09-10 03:29:11 +00001390 if( x.aNode[i].u.zJContent!=0 ){
drh285f2ef2021-10-15 16:15:04 +00001391 assert( x.aNode[i].eU==1 );
drh852944e2015-09-10 03:29:11 +00001392 jsonAppendRaw(&s, " ", 1);
1393 jsonAppendRaw(&s, x.aNode[i].u.zJContent, x.aNode[i].n);
drh285f2ef2021-10-15 16:15:04 +00001394 }else{
1395 assert( x.aNode[i].eU==0 );
drh852944e2015-09-10 03:29:11 +00001396 }
1397 jsonAppendRaw(&s, "\n", 1);
drhe9c37f32015-08-15 21:25:36 +00001398 }
drh505ad2c2015-08-21 17:33:11 +00001399 jsonParseReset(&x);
drhe9c37f32015-08-15 21:25:36 +00001400 jsonResult(&s);
1401}
1402
drh5634cc02015-08-17 11:28:03 +00001403/*
drhf5ddb9c2015-09-11 00:06:41 +00001404** The json_test1(JSON) function return true (1) if the input is JSON
1405** text generated by another json function. It returns (0) if the input
1406** is not known to be JSON.
drh5634cc02015-08-17 11:28:03 +00001407*/
1408static void jsonTest1Func(
drhbc8f0922015-08-22 19:39:04 +00001409 sqlite3_context *ctx,
drh5634cc02015-08-17 11:28:03 +00001410 int argc,
1411 sqlite3_value **argv
1412){
drh9dbf96b2022-01-06 01:40:09 +00001413 UNUSED_PARAMETER(argc);
drhf5ddb9c2015-09-11 00:06:41 +00001414 sqlite3_result_int(ctx, sqlite3_value_subtype(argv[0])==JSON_SUBTYPE);
drh5634cc02015-08-17 11:28:03 +00001415}
drh301eecc2015-08-17 20:14:19 +00001416#endif /* SQLITE_DEBUG */
drh5634cc02015-08-17 11:28:03 +00001417
drh987eb1f2015-08-17 15:17:37 +00001418/****************************************************************************
drhff135ae2015-12-30 01:07:02 +00001419** Scalar SQL function implementations
drh987eb1f2015-08-17 15:17:37 +00001420****************************************************************************/
1421
1422/*
drh2ad96f52016-06-17 13:01:51 +00001423** Implementation of the json_QUOTE(VALUE) function. Return a JSON value
1424** corresponding to the SQL value input. Mostly this means putting
1425** double-quotes around strings and returning the unquoted string "null"
1426** when given a NULL input.
1427*/
1428static void jsonQuoteFunc(
1429 sqlite3_context *ctx,
1430 int argc,
1431 sqlite3_value **argv
1432){
1433 JsonString jx;
drh9dbf96b2022-01-06 01:40:09 +00001434 UNUSED_PARAMETER(argc);
drh2ad96f52016-06-17 13:01:51 +00001435
1436 jsonInit(&jx, ctx);
1437 jsonAppendValue(&jx, argv[0]);
1438 jsonResult(&jx);
1439 sqlite3_result_subtype(ctx, JSON_SUBTYPE);
1440}
1441
1442/*
drh987eb1f2015-08-17 15:17:37 +00001443** Implementation of the json_array(VALUE,...) function. Return a JSON
1444** array that contains all values given in arguments. Or if any argument
1445** is a BLOB, throw an error.
1446*/
1447static void jsonArrayFunc(
drhbc8f0922015-08-22 19:39:04 +00001448 sqlite3_context *ctx,
drh987eb1f2015-08-17 15:17:37 +00001449 int argc,
1450 sqlite3_value **argv
1451){
1452 int i;
drh505ad2c2015-08-21 17:33:11 +00001453 JsonString jx;
drh987eb1f2015-08-17 15:17:37 +00001454
drhbc8f0922015-08-22 19:39:04 +00001455 jsonInit(&jx, ctx);
drhd0960592015-08-17 21:22:32 +00001456 jsonAppendChar(&jx, '[');
drh987eb1f2015-08-17 15:17:37 +00001457 for(i=0; i<argc; i++){
drhd0960592015-08-17 21:22:32 +00001458 jsonAppendSeparator(&jx);
drhf5ddb9c2015-09-11 00:06:41 +00001459 jsonAppendValue(&jx, argv[i]);
drh987eb1f2015-08-17 15:17:37 +00001460 }
drhd0960592015-08-17 21:22:32 +00001461 jsonAppendChar(&jx, ']');
drh987eb1f2015-08-17 15:17:37 +00001462 jsonResult(&jx);
drhf5ddb9c2015-09-11 00:06:41 +00001463 sqlite3_result_subtype(ctx, JSON_SUBTYPE);
drh987eb1f2015-08-17 15:17:37 +00001464}
1465
1466
1467/*
1468** json_array_length(JSON)
1469** json_array_length(JSON, PATH)
1470**
1471** Return the number of elements in the top-level JSON array.
1472** Return 0 if the input is not a well-formed JSON array.
1473*/
1474static void jsonArrayLengthFunc(
drhbc8f0922015-08-22 19:39:04 +00001475 sqlite3_context *ctx,
drh987eb1f2015-08-17 15:17:37 +00001476 int argc,
1477 sqlite3_value **argv
1478){
drh3fb153c2017-05-11 16:49:59 +00001479 JsonParse *p; /* The parse */
drh987eb1f2015-08-17 15:17:37 +00001480 sqlite3_int64 n = 0;
1481 u32 i;
drha8f39a92015-09-21 22:53:16 +00001482 JsonNode *pNode;
drh987eb1f2015-08-17 15:17:37 +00001483
drhe35fc302018-08-30 01:52:10 +00001484 p = jsonParseCached(ctx, argv, ctx);
drh3fb153c2017-05-11 16:49:59 +00001485 if( p==0 ) return;
1486 assert( p->nNode );
drha8f39a92015-09-21 22:53:16 +00001487 if( argc==2 ){
1488 const char *zPath = (const char*)sqlite3_value_text(argv[1]);
drh3fb153c2017-05-11 16:49:59 +00001489 pNode = jsonLookup(p, zPath, 0, ctx);
drha8f39a92015-09-21 22:53:16 +00001490 }else{
drh3fb153c2017-05-11 16:49:59 +00001491 pNode = p->aNode;
drha8f39a92015-09-21 22:53:16 +00001492 }
1493 if( pNode==0 ){
drh3fb153c2017-05-11 16:49:59 +00001494 return;
1495 }
1496 if( pNode->eType==JSON_ARRAY ){
drha8f39a92015-09-21 22:53:16 +00001497 assert( (pNode->jnFlags & JNODE_APPEND)==0 );
1498 for(i=1; i<=pNode->n; n++){
1499 i += jsonNodeSize(&pNode[i]);
drh987eb1f2015-08-17 15:17:37 +00001500 }
drh987eb1f2015-08-17 15:17:37 +00001501 }
drh3fb153c2017-05-11 16:49:59 +00001502 sqlite3_result_int64(ctx, n);
drhf6ec8d42015-08-28 03:48:04 +00001503}
1504
1505/*
drhdc60c682022-01-08 15:05:53 +00001506** Bit values for the flags passed into jsonExtractFunc() or
1507** jsonSetFunc() via the user-data value.
1508*/
drhd83c90b2022-01-10 15:43:13 +00001509#define JSON_JSON 0x01 /* Result is always JSON */
1510#define JSON_SQL 0x02 /* Result is always SQL */
1511#define JSON_ABPATH 0x03 /* Allow abbreviated JSON path specs */
drhdc60c682022-01-08 15:05:53 +00001512#define JSON_ISSET 0x04 /* json_set(), not json_insert() */
1513
1514/*
drh3ad93bb2015-08-29 19:41:45 +00001515** json_extract(JSON, PATH, ...)
drhdc60c682022-01-08 15:05:53 +00001516** "->"(JSON,PATH)
1517** "->>"(JSON,PATH)
drh987eb1f2015-08-17 15:17:37 +00001518**
drhdc60c682022-01-08 15:05:53 +00001519** Return the element described by PATH. Return NULL if that PATH element
drhd83c90b2022-01-10 15:43:13 +00001520** is not found.
drhdc60c682022-01-08 15:05:53 +00001521**
drhd83c90b2022-01-10 15:43:13 +00001522** If JSON_JSON is set or if more that one PATH argument is supplied then
1523** always return a JSON representation of the result. If JSON_SQL is set,
1524** then always return an SQL representation of the result. If neither flag
1525** is present and argc==2, then return JSON for objects and arrays and SQL
1526** for all other values.
drhdc60c682022-01-08 15:05:53 +00001527**
drhd83c90b2022-01-10 15:43:13 +00001528** When multiple PATH arguments are supplied, the result is a JSON array
1529** containing the result of each PATH.
drhdc60c682022-01-08 15:05:53 +00001530**
drhd83c90b2022-01-10 15:43:13 +00001531** Abbreviated JSON path expressions are allows if JSON_ABPATH, for
1532** compatibility with PG.
drh987eb1f2015-08-17 15:17:37 +00001533*/
1534static void jsonExtractFunc(
drhbc8f0922015-08-22 19:39:04 +00001535 sqlite3_context *ctx,
drh987eb1f2015-08-17 15:17:37 +00001536 int argc,
1537 sqlite3_value **argv
1538){
drh3fb153c2017-05-11 16:49:59 +00001539 JsonParse *p; /* The parse */
drh987eb1f2015-08-17 15:17:37 +00001540 JsonNode *pNode;
1541 const char *zPath;
drhdaefcd92022-01-08 15:37:13 +00001542 int flags = SQLITE_PTR_TO_INT(sqlite3_user_data(ctx));
drh3ad93bb2015-08-29 19:41:45 +00001543 JsonString jx;
drh3ad93bb2015-08-29 19:41:45 +00001544
1545 if( argc<2 ) return;
drhd83c90b2022-01-10 15:43:13 +00001546 p = jsonParseCached(ctx, argv, ctx);
1547 if( p==0 ) return;
drh12b9fa92022-01-07 15:47:12 +00001548 if( argc==2 ){
drhd83c90b2022-01-10 15:43:13 +00001549 /* With a single PATH argument */
drh12b9fa92022-01-07 15:47:12 +00001550 zPath = (const char*)sqlite3_value_text(argv[1]);
drhd83c90b2022-01-10 15:43:13 +00001551 if( zPath==0 ) return;
1552 if( zPath[0]!='$' && (flags & JSON_ABPATH)!=0 ){
drhdc60c682022-01-08 15:05:53 +00001553 /* The -> and ->> operators accept abbreviated PATH arguments. This
1554 ** is mostly for compatibility with PostgreSQL, but also for convenience.
1555 **
1556 ** NUMBER ==> $[NUMBER] // PG compatible
1557 ** LABEL ==> $.LABEL // PG compatible
1558 ** [NUMBER] ==> $[NUMBER] // Not PG. Purely for convenience
drh12b9fa92022-01-07 15:47:12 +00001559 */
1560 jsonInit(&jx, ctx);
drhdaefcd92022-01-08 15:37:13 +00001561 if( sqlite3Isdigit(zPath[0]) ){
drh12b9fa92022-01-07 15:47:12 +00001562 jsonAppendRaw(&jx, "$[", 2);
1563 jsonAppendRaw(&jx, zPath, (int)strlen(zPath));
1564 jsonAppendRaw(&jx, "]", 2);
1565 }else{
1566 jsonAppendRaw(&jx, "$.", 1 + (zPath[0]!='['));
1567 jsonAppendRaw(&jx, zPath, (int)strlen(zPath));
1568 jsonAppendChar(&jx, 0);
1569 }
drhd83c90b2022-01-10 15:43:13 +00001570 if( jx.bErr==0 ){
1571 pNode = jsonLookup(p, jx.zBuf, 0, ctx);
1572 if( pNode==0 ){
1573 /* No-op. jsonLookup will have left an error for us */
1574 }else if( flags & JSON_JSON ){
1575 jsonReturnJson(pNode, ctx, 0);
1576 }else{
1577 jsonReturn(pNode, ctx, 0);
1578 sqlite3_result_subtype(ctx, 0);
1579 }
1580 }
drh12b9fa92022-01-07 15:47:12 +00001581 jsonReset(&jx);
1582 }else{
1583 pNode = jsonLookup(p, zPath, 0, ctx);
drhd83c90b2022-01-10 15:43:13 +00001584 if( p->nErr==0 && pNode ) jsonReturn(pNode, ctx, 0);
drh12b9fa92022-01-07 15:47:12 +00001585 }
drh12b9fa92022-01-07 15:47:12 +00001586 }else{
1587 /* Two or more PATH arguments results in a JSON array with each
1588 ** element of the array being the value selected by one of the PATHs */
1589 int i;
1590 jsonInit(&jx, ctx);
1591 jsonAppendChar(&jx, '[');
1592 for(i=1; i<argc; i++){
1593 zPath = (const char*)sqlite3_value_text(argv[i]);
1594 pNode = jsonLookup(p, zPath, 0, ctx);
1595 if( p->nErr ) break;
drh3ad93bb2015-08-29 19:41:45 +00001596 jsonAppendSeparator(&jx);
1597 if( pNode ){
1598 jsonRenderNode(pNode, &jx, 0);
1599 }else{
1600 jsonAppendRaw(&jx, "null", 4);
1601 }
drh3ad93bb2015-08-29 19:41:45 +00001602 }
drh12b9fa92022-01-07 15:47:12 +00001603 if( i==argc ){
1604 jsonAppendChar(&jx, ']');
1605 jsonResult(&jx);
1606 sqlite3_result_subtype(ctx, JSON_SUBTYPE);
1607 }
1608 jsonReset(&jx);
drh987eb1f2015-08-17 15:17:37 +00001609 }
drh987eb1f2015-08-17 15:17:37 +00001610}
1611
drh633647a2017-03-22 21:24:31 +00001612/* This is the RFC 7396 MergePatch algorithm.
1613*/
1614static JsonNode *jsonMergePatch(
1615 JsonParse *pParse, /* The JSON parser that contains the TARGET */
mistachkinb1ed7172017-04-14 14:50:34 +00001616 u32 iTarget, /* Node of the TARGET in pParse */
drh633647a2017-03-22 21:24:31 +00001617 JsonNode *pPatch /* The PATCH */
1618){
drh0002d242017-03-23 00:46:15 +00001619 u32 i, j;
1620 u32 iRoot;
drh633647a2017-03-22 21:24:31 +00001621 JsonNode *pTarget;
1622 if( pPatch->eType!=JSON_OBJECT ){
1623 return pPatch;
1624 }
1625 assert( iTarget>=0 && iTarget<pParse->nNode );
1626 pTarget = &pParse->aNode[iTarget];
1627 assert( (pPatch->jnFlags & JNODE_APPEND)==0 );
1628 if( pTarget->eType!=JSON_OBJECT ){
drh29c99692017-03-24 12:35:17 +00001629 jsonRemoveAllNulls(pPatch);
drh633647a2017-03-22 21:24:31 +00001630 return pPatch;
1631 }
drhbb7aa2d2017-03-23 00:13:52 +00001632 iRoot = iTarget;
drh633647a2017-03-22 21:24:31 +00001633 for(i=1; i<pPatch->n; i += jsonNodeSize(&pPatch[i+1])+1){
drhba7cce32017-03-24 19:45:05 +00001634 u32 nKey;
drh633647a2017-03-22 21:24:31 +00001635 const char *zKey;
1636 assert( pPatch[i].eType==JSON_STRING );
1637 assert( pPatch[i].jnFlags & JNODE_LABEL );
drh285f2ef2021-10-15 16:15:04 +00001638 assert( pPatch[i].eU==1 );
drh633647a2017-03-22 21:24:31 +00001639 nKey = pPatch[i].n;
1640 zKey = pPatch[i].u.zJContent;
drhbb7aa2d2017-03-23 00:13:52 +00001641 assert( (pPatch[i].jnFlags & JNODE_RAW)==0 );
drh633647a2017-03-22 21:24:31 +00001642 for(j=1; j<pTarget->n; j += jsonNodeSize(&pTarget[j+1])+1 ){
1643 assert( pTarget[j].eType==JSON_STRING );
1644 assert( pTarget[j].jnFlags & JNODE_LABEL );
drhbb7aa2d2017-03-23 00:13:52 +00001645 assert( (pPatch[i].jnFlags & JNODE_RAW)==0 );
drh1fe162f2017-03-23 12:56:44 +00001646 if( pTarget[j].n==nKey && strncmp(pTarget[j].u.zJContent,zKey,nKey)==0 ){
1647 if( pTarget[j+1].jnFlags & (JNODE_REMOVE|JNODE_PATCH) ) break;
drh633647a2017-03-22 21:24:31 +00001648 if( pPatch[i+1].eType==JSON_NULL ){
1649 pTarget[j+1].jnFlags |= JNODE_REMOVE;
1650 }else{
drhbb7aa2d2017-03-23 00:13:52 +00001651 JsonNode *pNew = jsonMergePatch(pParse, iTarget+j+1, &pPatch[i+1]);
drh633647a2017-03-22 21:24:31 +00001652 if( pNew==0 ) return 0;
1653 pTarget = &pParse->aNode[iTarget];
1654 if( pNew!=&pTarget[j+1] ){
drha2852ac2021-11-15 01:45:11 +00001655 assert( pTarget[j+1].eU==0
1656 || pTarget[j+1].eU==1
1657 || pTarget[j+1].eU==2 );
drh285f2ef2021-10-15 16:15:04 +00001658 testcase( pTarget[j+1].eU==1 );
drha2852ac2021-11-15 01:45:11 +00001659 testcase( pTarget[j+1].eU==2 );
drh285f2ef2021-10-15 16:15:04 +00001660 VVA( pTarget[j+1].eU = 5 );
drh633647a2017-03-22 21:24:31 +00001661 pTarget[j+1].u.pPatch = pNew;
1662 pTarget[j+1].jnFlags |= JNODE_PATCH;
1663 }
1664 }
1665 break;
1666 }
1667 }
drhbb7aa2d2017-03-23 00:13:52 +00001668 if( j>=pTarget->n && pPatch[i+1].eType!=JSON_NULL ){
drh633647a2017-03-22 21:24:31 +00001669 int iStart, iPatch;
1670 iStart = jsonParseAddNode(pParse, JSON_OBJECT, 2, 0);
1671 jsonParseAddNode(pParse, JSON_STRING, nKey, zKey);
1672 iPatch = jsonParseAddNode(pParse, JSON_TRUE, 0, 0);
1673 if( pParse->oom ) return 0;
drh29c99692017-03-24 12:35:17 +00001674 jsonRemoveAllNulls(pPatch);
drh633647a2017-03-22 21:24:31 +00001675 pTarget = &pParse->aNode[iTarget];
drh8b554e22021-10-20 20:22:37 +00001676 assert( pParse->aNode[iRoot].eU==0 || pParse->aNode[iRoot].eU==2 );
1677 testcase( pParse->aNode[iRoot].eU==2 );
drhbb7aa2d2017-03-23 00:13:52 +00001678 pParse->aNode[iRoot].jnFlags |= JNODE_APPEND;
drh285f2ef2021-10-15 16:15:04 +00001679 VVA( pParse->aNode[iRoot].eU = 2 );
drhbb7aa2d2017-03-23 00:13:52 +00001680 pParse->aNode[iRoot].u.iAppend = iStart - iRoot;
1681 iRoot = iStart;
drh285f2ef2021-10-15 16:15:04 +00001682 assert( pParse->aNode[iPatch].eU==0 );
1683 VVA( pParse->aNode[iPatch].eU = 5 );
drh633647a2017-03-22 21:24:31 +00001684 pParse->aNode[iPatch].jnFlags |= JNODE_PATCH;
1685 pParse->aNode[iPatch].u.pPatch = &pPatch[i+1];
1686 }
1687 }
1688 return pTarget;
1689}
1690
1691/*
1692** Implementation of the json_mergepatch(JSON1,JSON2) function. Return a JSON
1693** object that is the result of running the RFC 7396 MergePatch() algorithm
1694** on the two arguments.
1695*/
drh37f03df2017-03-23 20:33:49 +00001696static void jsonPatchFunc(
drh633647a2017-03-22 21:24:31 +00001697 sqlite3_context *ctx,
1698 int argc,
1699 sqlite3_value **argv
1700){
1701 JsonParse x; /* The JSON that is being patched */
1702 JsonParse y; /* The patch */
drhbb7aa2d2017-03-23 00:13:52 +00001703 JsonNode *pResult; /* The result of the merge */
drh633647a2017-03-22 21:24:31 +00001704
drh9dbf96b2022-01-06 01:40:09 +00001705 UNUSED_PARAMETER(argc);
drh633647a2017-03-22 21:24:31 +00001706 if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return;
1707 if( jsonParse(&y, ctx, (const char*)sqlite3_value_text(argv[1])) ){
1708 jsonParseReset(&x);
1709 return;
1710 }
drhbb7aa2d2017-03-23 00:13:52 +00001711 pResult = jsonMergePatch(&x, 0, y.aNode);
1712 assert( pResult!=0 || x.oom );
1713 if( pResult ){
1714 jsonReturnJson(pResult, ctx, 0);
1715 }else{
1716 sqlite3_result_error_nomem(ctx);
1717 }
drh633647a2017-03-22 21:24:31 +00001718 jsonParseReset(&x);
1719 jsonParseReset(&y);
1720}
1721
1722
drh987eb1f2015-08-17 15:17:37 +00001723/*
1724** Implementation of the json_object(NAME,VALUE,...) function. Return a JSON
1725** object that contains all name/value given in arguments. Or if any name
1726** is not a string or if any value is a BLOB, throw an error.
1727*/
1728static void jsonObjectFunc(
drhbc8f0922015-08-22 19:39:04 +00001729 sqlite3_context *ctx,
drh987eb1f2015-08-17 15:17:37 +00001730 int argc,
1731 sqlite3_value **argv
1732){
1733 int i;
drh505ad2c2015-08-21 17:33:11 +00001734 JsonString jx;
drh987eb1f2015-08-17 15:17:37 +00001735 const char *z;
1736 u32 n;
1737
1738 if( argc&1 ){
drhbc8f0922015-08-22 19:39:04 +00001739 sqlite3_result_error(ctx, "json_object() requires an even number "
drh987eb1f2015-08-17 15:17:37 +00001740 "of arguments", -1);
1741 return;
1742 }
drhbc8f0922015-08-22 19:39:04 +00001743 jsonInit(&jx, ctx);
drhd0960592015-08-17 21:22:32 +00001744 jsonAppendChar(&jx, '{');
drh987eb1f2015-08-17 15:17:37 +00001745 for(i=0; i<argc; i+=2){
drh987eb1f2015-08-17 15:17:37 +00001746 if( sqlite3_value_type(argv[i])!=SQLITE_TEXT ){
drhbc8f0922015-08-22 19:39:04 +00001747 sqlite3_result_error(ctx, "json_object() labels must be TEXT", -1);
drhdc384952015-09-19 18:54:39 +00001748 jsonReset(&jx);
drh987eb1f2015-08-17 15:17:37 +00001749 return;
1750 }
drhd0960592015-08-17 21:22:32 +00001751 jsonAppendSeparator(&jx);
drh987eb1f2015-08-17 15:17:37 +00001752 z = (const char*)sqlite3_value_text(argv[i]);
1753 n = (u32)sqlite3_value_bytes(argv[i]);
1754 jsonAppendString(&jx, z, n);
drhd0960592015-08-17 21:22:32 +00001755 jsonAppendChar(&jx, ':');
drhf5ddb9c2015-09-11 00:06:41 +00001756 jsonAppendValue(&jx, argv[i+1]);
drh987eb1f2015-08-17 15:17:37 +00001757 }
drhd0960592015-08-17 21:22:32 +00001758 jsonAppendChar(&jx, '}');
drh987eb1f2015-08-17 15:17:37 +00001759 jsonResult(&jx);
drhf5ddb9c2015-09-11 00:06:41 +00001760 sqlite3_result_subtype(ctx, JSON_SUBTYPE);
drh987eb1f2015-08-17 15:17:37 +00001761}
1762
1763
1764/*
drh301eecc2015-08-17 20:14:19 +00001765** json_remove(JSON, PATH, ...)
1766**
drh3ad93bb2015-08-29 19:41:45 +00001767** Remove the named elements from JSON and return the result. malformed
1768** JSON or PATH arguments result in an error.
drh301eecc2015-08-17 20:14:19 +00001769*/
1770static void jsonRemoveFunc(
drhbc8f0922015-08-22 19:39:04 +00001771 sqlite3_context *ctx,
drh301eecc2015-08-17 20:14:19 +00001772 int argc,
1773 sqlite3_value **argv
1774){
1775 JsonParse x; /* The parse */
1776 JsonNode *pNode;
1777 const char *zPath;
1778 u32 i;
1779
1780 if( argc<1 ) return;
drhbc8f0922015-08-22 19:39:04 +00001781 if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return;
drha8f39a92015-09-21 22:53:16 +00001782 assert( x.nNode );
1783 for(i=1; i<(u32)argc; i++){
1784 zPath = (const char*)sqlite3_value_text(argv[i]);
1785 if( zPath==0 ) goto remove_done;
1786 pNode = jsonLookup(&x, zPath, 0, ctx);
1787 if( x.nErr ) goto remove_done;
1788 if( pNode ) pNode->jnFlags |= JNODE_REMOVE;
1789 }
1790 if( (x.aNode[0].jnFlags & JNODE_REMOVE)==0 ){
1791 jsonReturnJson(x.aNode, ctx, 0);
drhd0960592015-08-17 21:22:32 +00001792 }
drha7714022015-08-29 00:54:49 +00001793remove_done:
drh505ad2c2015-08-21 17:33:11 +00001794 jsonParseReset(&x);
drhd0960592015-08-17 21:22:32 +00001795}
1796
1797/*
1798** json_replace(JSON, PATH, VALUE, ...)
1799**
1800** Replace the value at PATH with VALUE. If PATH does not already exist,
drh3ad93bb2015-08-29 19:41:45 +00001801** this routine is a no-op. If JSON or PATH is malformed, throw an error.
drhd0960592015-08-17 21:22:32 +00001802*/
1803static void jsonReplaceFunc(
drhbc8f0922015-08-22 19:39:04 +00001804 sqlite3_context *ctx,
drhd0960592015-08-17 21:22:32 +00001805 int argc,
1806 sqlite3_value **argv
1807){
1808 JsonParse x; /* The parse */
1809 JsonNode *pNode;
1810 const char *zPath;
1811 u32 i;
1812
1813 if( argc<1 ) return;
1814 if( (argc&1)==0 ) {
drhbc8f0922015-08-22 19:39:04 +00001815 jsonWrongNumArgs(ctx, "replace");
drhd0960592015-08-17 21:22:32 +00001816 return;
1817 }
drhbc8f0922015-08-22 19:39:04 +00001818 if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return;
drha8f39a92015-09-21 22:53:16 +00001819 assert( x.nNode );
1820 for(i=1; i<(u32)argc; i+=2){
1821 zPath = (const char*)sqlite3_value_text(argv[i]);
1822 pNode = jsonLookup(&x, zPath, 0, ctx);
1823 if( x.nErr ) goto replace_err;
1824 if( pNode ){
drh285f2ef2021-10-15 16:15:04 +00001825 assert( pNode->eU==0 || pNode->eU==1 || pNode->eU==4 );
drh9dbf96b2022-01-06 01:40:09 +00001826 testcase( pNode->eU!=0 && pNode->eU!=1 );
drha8f39a92015-09-21 22:53:16 +00001827 pNode->jnFlags |= (u8)JNODE_REPLACE;
drh285f2ef2021-10-15 16:15:04 +00001828 VVA( pNode->eU = 4 );
drh633647a2017-03-22 21:24:31 +00001829 pNode->u.iReplace = i + 1;
drhd0960592015-08-17 21:22:32 +00001830 }
drha8f39a92015-09-21 22:53:16 +00001831 }
1832 if( x.aNode[0].jnFlags & JNODE_REPLACE ){
drh285f2ef2021-10-15 16:15:04 +00001833 assert( x.aNode[0].eU==4 );
drh633647a2017-03-22 21:24:31 +00001834 sqlite3_result_value(ctx, argv[x.aNode[0].u.iReplace]);
drha8f39a92015-09-21 22:53:16 +00001835 }else{
1836 jsonReturnJson(x.aNode, ctx, argv);
drh301eecc2015-08-17 20:14:19 +00001837 }
drha7714022015-08-29 00:54:49 +00001838replace_err:
drh505ad2c2015-08-21 17:33:11 +00001839 jsonParseReset(&x);
drh301eecc2015-08-17 20:14:19 +00001840}
drh505ad2c2015-08-21 17:33:11 +00001841
drhdc60c682022-01-08 15:05:53 +00001842
drh52216ad2015-08-18 02:28:03 +00001843/*
1844** json_set(JSON, PATH, VALUE, ...)
1845**
1846** Set the value at PATH to VALUE. Create the PATH if it does not already
1847** exist. Overwrite existing values that do exist.
drh3ad93bb2015-08-29 19:41:45 +00001848** If JSON or PATH is malformed, throw an error.
drh52216ad2015-08-18 02:28:03 +00001849**
1850** json_insert(JSON, PATH, VALUE, ...)
1851**
1852** Create PATH and initialize it to VALUE. If PATH already exists, this
drh3ad93bb2015-08-29 19:41:45 +00001853** routine is a no-op. If JSON or PATH is malformed, throw an error.
drh52216ad2015-08-18 02:28:03 +00001854*/
1855static void jsonSetFunc(
drhbc8f0922015-08-22 19:39:04 +00001856 sqlite3_context *ctx,
drh52216ad2015-08-18 02:28:03 +00001857 int argc,
1858 sqlite3_value **argv
1859){
1860 JsonParse x; /* The parse */
1861 JsonNode *pNode;
1862 const char *zPath;
1863 u32 i;
1864 int bApnd;
drh9dbf96b2022-01-06 01:40:09 +00001865 int bIsSet = sqlite3_user_data(ctx)!=0;
drh52216ad2015-08-18 02:28:03 +00001866
1867 if( argc<1 ) return;
1868 if( (argc&1)==0 ) {
drhbc8f0922015-08-22 19:39:04 +00001869 jsonWrongNumArgs(ctx, bIsSet ? "set" : "insert");
drh52216ad2015-08-18 02:28:03 +00001870 return;
1871 }
drhbc8f0922015-08-22 19:39:04 +00001872 if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return;
drha8f39a92015-09-21 22:53:16 +00001873 assert( x.nNode );
1874 for(i=1; i<(u32)argc; i+=2){
1875 zPath = (const char*)sqlite3_value_text(argv[i]);
1876 bApnd = 0;
1877 pNode = jsonLookup(&x, zPath, &bApnd, ctx);
1878 if( x.oom ){
1879 sqlite3_result_error_nomem(ctx);
1880 goto jsonSetDone;
1881 }else if( x.nErr ){
1882 goto jsonSetDone;
1883 }else if( pNode && (bApnd || bIsSet) ){
drh9dbf96b2022-01-06 01:40:09 +00001884 testcase( pNode->eU!=0 && pNode->eU!=1 && pNode->eU!=4 );
drh285f2ef2021-10-15 16:15:04 +00001885 assert( pNode->eU!=3 || pNode->eU!=5 );
1886 VVA( pNode->eU = 4 );
drha8f39a92015-09-21 22:53:16 +00001887 pNode->jnFlags |= (u8)JNODE_REPLACE;
drh633647a2017-03-22 21:24:31 +00001888 pNode->u.iReplace = i + 1;
drh52216ad2015-08-18 02:28:03 +00001889 }
drha8f39a92015-09-21 22:53:16 +00001890 }
1891 if( x.aNode[0].jnFlags & JNODE_REPLACE ){
drh285f2ef2021-10-15 16:15:04 +00001892 assert( x.aNode[0].eU==4 );
drh633647a2017-03-22 21:24:31 +00001893 sqlite3_result_value(ctx, argv[x.aNode[0].u.iReplace]);
drha8f39a92015-09-21 22:53:16 +00001894 }else{
1895 jsonReturnJson(x.aNode, ctx, argv);
drh52216ad2015-08-18 02:28:03 +00001896 }
drhbc8f0922015-08-22 19:39:04 +00001897jsonSetDone:
drh505ad2c2015-08-21 17:33:11 +00001898 jsonParseReset(&x);
drh52216ad2015-08-18 02:28:03 +00001899}
drh301eecc2015-08-17 20:14:19 +00001900
1901/*
drh987eb1f2015-08-17 15:17:37 +00001902** json_type(JSON)
drha4e4e182022-01-07 16:03:00 +00001903** json_ntype(JSON)
drh987eb1f2015-08-17 15:17:37 +00001904** json_type(JSON, PATH)
1905**
drha4e4e182022-01-07 16:03:00 +00001906** Return the top-level "type" of a JSON string. json_type() raises an
1907** error if either the JSON or PATH inputs are not well-formed. json_ntype()
1908** works like the one-argument version of json_type() except that it
1909** returns NULL if the JSON argument is not well-formed.
drh987eb1f2015-08-17 15:17:37 +00001910*/
1911static void jsonTypeFunc(
drhbc8f0922015-08-22 19:39:04 +00001912 sqlite3_context *ctx,
drh987eb1f2015-08-17 15:17:37 +00001913 int argc,
1914 sqlite3_value **argv
1915){
drhe35fc302018-08-30 01:52:10 +00001916 JsonParse *p; /* The parse */
drh987eb1f2015-08-17 15:17:37 +00001917 const char *zPath;
drha8f39a92015-09-21 22:53:16 +00001918 JsonNode *pNode;
drh987eb1f2015-08-17 15:17:37 +00001919
drhdaefcd92022-01-08 15:37:13 +00001920 p = jsonParseCached(ctx, argv, sqlite3_user_data(ctx)!=0 ? 0 : ctx);
drhe35fc302018-08-30 01:52:10 +00001921 if( p==0 ) return;
drha8f39a92015-09-21 22:53:16 +00001922 if( argc==2 ){
1923 zPath = (const char*)sqlite3_value_text(argv[1]);
drhe35fc302018-08-30 01:52:10 +00001924 pNode = jsonLookup(p, zPath, 0, ctx);
drha8f39a92015-09-21 22:53:16 +00001925 }else{
drhe35fc302018-08-30 01:52:10 +00001926 pNode = p->aNode;
drha8f39a92015-09-21 22:53:16 +00001927 }
1928 if( pNode ){
1929 sqlite3_result_text(ctx, jsonType[pNode->eType], -1, SQLITE_STATIC);
drh987eb1f2015-08-17 15:17:37 +00001930 }
drh987eb1f2015-08-17 15:17:37 +00001931}
drh5634cc02015-08-17 11:28:03 +00001932
drhbc8f0922015-08-22 19:39:04 +00001933/*
1934** json_valid(JSON)
1935**
drh3ad93bb2015-08-29 19:41:45 +00001936** Return 1 if JSON is a well-formed JSON string according to RFC-7159.
1937** Return 0 otherwise.
drhbc8f0922015-08-22 19:39:04 +00001938*/
1939static void jsonValidFunc(
1940 sqlite3_context *ctx,
1941 int argc,
1942 sqlite3_value **argv
1943){
drhe35fc302018-08-30 01:52:10 +00001944 JsonParse *p; /* The parse */
drh9dbf96b2022-01-06 01:40:09 +00001945 UNUSED_PARAMETER(argc);
drhe35fc302018-08-30 01:52:10 +00001946 p = jsonParseCached(ctx, argv, 0);
1947 sqlite3_result_int(ctx, p!=0);
drhbc8f0922015-08-22 19:39:04 +00001948}
1949
drhff135ae2015-12-30 01:07:02 +00001950
1951/****************************************************************************
1952** Aggregate SQL function implementations
1953****************************************************************************/
1954/*
1955** json_group_array(VALUE)
1956**
1957** Return a JSON array composed of all values in the aggregate.
1958*/
1959static void jsonArrayStep(
1960 sqlite3_context *ctx,
1961 int argc,
1962 sqlite3_value **argv
1963){
1964 JsonString *pStr;
drh9dbf96b2022-01-06 01:40:09 +00001965 UNUSED_PARAMETER(argc);
drhff135ae2015-12-30 01:07:02 +00001966 pStr = (JsonString*)sqlite3_aggregate_context(ctx, sizeof(*pStr));
1967 if( pStr ){
1968 if( pStr->zBuf==0 ){
1969 jsonInit(pStr, ctx);
1970 jsonAppendChar(pStr, '[');
drhfab5b072019-09-14 00:21:34 +00001971 }else if( pStr->nUsed>1 ){
drhff135ae2015-12-30 01:07:02 +00001972 jsonAppendChar(pStr, ',');
drhff135ae2015-12-30 01:07:02 +00001973 }
dan8505d732021-04-14 12:11:39 +00001974 pStr->pCtx = ctx;
drhff135ae2015-12-30 01:07:02 +00001975 jsonAppendValue(pStr, argv[0]);
1976 }
1977}
drh8be47a72018-07-05 20:05:29 +00001978static void jsonArrayCompute(sqlite3_context *ctx, int isFinal){
drhff135ae2015-12-30 01:07:02 +00001979 JsonString *pStr;
1980 pStr = (JsonString*)sqlite3_aggregate_context(ctx, 0);
1981 if( pStr ){
1982 pStr->pCtx = ctx;
1983 jsonAppendChar(pStr, ']');
1984 if( pStr->bErr ){
drh4a642b62016-02-05 01:55:27 +00001985 if( pStr->bErr==1 ) sqlite3_result_error_nomem(ctx);
drh23079262016-01-01 00:15:59 +00001986 assert( pStr->bStatic );
drh8be47a72018-07-05 20:05:29 +00001987 }else if( isFinal ){
mistachkined008ec2018-09-12 01:05:26 +00001988 sqlite3_result_text(ctx, pStr->zBuf, (int)pStr->nUsed,
drhff135ae2015-12-30 01:07:02 +00001989 pStr->bStatic ? SQLITE_TRANSIENT : sqlite3_free);
1990 pStr->bStatic = 1;
drh8be47a72018-07-05 20:05:29 +00001991 }else{
mistachkined008ec2018-09-12 01:05:26 +00001992 sqlite3_result_text(ctx, pStr->zBuf, (int)pStr->nUsed, SQLITE_TRANSIENT);
drh8be47a72018-07-05 20:05:29 +00001993 pStr->nUsed--;
drhff135ae2015-12-30 01:07:02 +00001994 }
1995 }else{
1996 sqlite3_result_text(ctx, "[]", 2, SQLITE_STATIC);
1997 }
1998 sqlite3_result_subtype(ctx, JSON_SUBTYPE);
1999}
drh8be47a72018-07-05 20:05:29 +00002000static void jsonArrayValue(sqlite3_context *ctx){
2001 jsonArrayCompute(ctx, 0);
2002}
2003static void jsonArrayFinal(sqlite3_context *ctx){
2004 jsonArrayCompute(ctx, 1);
2005}
2006
2007#ifndef SQLITE_OMIT_WINDOWFUNC
2008/*
2009** This method works for both json_group_array() and json_group_object().
2010** It works by removing the first element of the group by searching forward
2011** to the first comma (",") that is not within a string and deleting all
2012** text through that comma.
2013*/
2014static void jsonGroupInverse(
2015 sqlite3_context *ctx,
2016 int argc,
2017 sqlite3_value **argv
2018){
drhe39f3882019-09-21 17:31:03 +00002019 unsigned int i;
drh8be47a72018-07-05 20:05:29 +00002020 int inStr = 0;
drhfab5b072019-09-14 00:21:34 +00002021 int nNest = 0;
drh8be47a72018-07-05 20:05:29 +00002022 char *z;
drhfab5b072019-09-14 00:21:34 +00002023 char c;
drh8be47a72018-07-05 20:05:29 +00002024 JsonString *pStr;
drh9dbf96b2022-01-06 01:40:09 +00002025 UNUSED_PARAMETER(argc);
2026 UNUSED_PARAMETER(argv);
drh8be47a72018-07-05 20:05:29 +00002027 pStr = (JsonString*)sqlite3_aggregate_context(ctx, 0);
drh491d4c82018-07-07 20:23:46 +00002028#ifdef NEVER
drhfd4b7282018-07-07 19:47:21 +00002029 /* pStr is always non-NULL since jsonArrayStep() or jsonObjectStep() will
2030 ** always have been called to initalize it */
2031 if( NEVER(!pStr) ) return;
drh491d4c82018-07-07 20:23:46 +00002032#endif
drh8be47a72018-07-05 20:05:29 +00002033 z = pStr->zBuf;
drh0e5cd342021-04-13 01:12:32 +00002034 for(i=1; i<pStr->nUsed && ((c = z[i])!=',' || inStr || nNest); i++){
drhfab5b072019-09-14 00:21:34 +00002035 if( c=='"' ){
drh8be47a72018-07-05 20:05:29 +00002036 inStr = !inStr;
drhfab5b072019-09-14 00:21:34 +00002037 }else if( c=='\\' ){
drh8be47a72018-07-05 20:05:29 +00002038 i++;
drhfab5b072019-09-14 00:21:34 +00002039 }else if( !inStr ){
2040 if( c=='{' || c=='[' ) nNest++;
2041 if( c=='}' || c==']' ) nNest--;
drh8be47a72018-07-05 20:05:29 +00002042 }
2043 }
drh0e5cd342021-04-13 01:12:32 +00002044 if( i<pStr->nUsed ){
2045 pStr->nUsed -= i;
2046 memmove(&z[1], &z[i+1], (size_t)pStr->nUsed-1);
2047 z[pStr->nUsed] = 0;
2048 }else{
2049 pStr->nUsed = 1;
2050 }
drh8be47a72018-07-05 20:05:29 +00002051}
2052#else
2053# define jsonGroupInverse 0
2054#endif
2055
drhff135ae2015-12-30 01:07:02 +00002056
2057/*
2058** json_group_obj(NAME,VALUE)
2059**
2060** Return a JSON object composed of all names and values in the aggregate.
2061*/
2062static void jsonObjectStep(
2063 sqlite3_context *ctx,
2064 int argc,
2065 sqlite3_value **argv
2066){
2067 JsonString *pStr;
2068 const char *z;
2069 u32 n;
drh9dbf96b2022-01-06 01:40:09 +00002070 UNUSED_PARAMETER(argc);
drhff135ae2015-12-30 01:07:02 +00002071 pStr = (JsonString*)sqlite3_aggregate_context(ctx, sizeof(*pStr));
2072 if( pStr ){
2073 if( pStr->zBuf==0 ){
2074 jsonInit(pStr, ctx);
2075 jsonAppendChar(pStr, '{');
drhfab5b072019-09-14 00:21:34 +00002076 }else if( pStr->nUsed>1 ){
drhff135ae2015-12-30 01:07:02 +00002077 jsonAppendChar(pStr, ',');
drhff135ae2015-12-30 01:07:02 +00002078 }
drhd2f55772021-05-28 12:15:19 +00002079 pStr->pCtx = ctx;
drhff135ae2015-12-30 01:07:02 +00002080 z = (const char*)sqlite3_value_text(argv[0]);
2081 n = (u32)sqlite3_value_bytes(argv[0]);
2082 jsonAppendString(pStr, z, n);
2083 jsonAppendChar(pStr, ':');
2084 jsonAppendValue(pStr, argv[1]);
2085 }
2086}
drh8be47a72018-07-05 20:05:29 +00002087static void jsonObjectCompute(sqlite3_context *ctx, int isFinal){
drhff135ae2015-12-30 01:07:02 +00002088 JsonString *pStr;
2089 pStr = (JsonString*)sqlite3_aggregate_context(ctx, 0);
2090 if( pStr ){
2091 jsonAppendChar(pStr, '}');
2092 if( pStr->bErr ){
drh6850a632016-11-07 18:18:08 +00002093 if( pStr->bErr==1 ) sqlite3_result_error_nomem(ctx);
drh23079262016-01-01 00:15:59 +00002094 assert( pStr->bStatic );
drh8be47a72018-07-05 20:05:29 +00002095 }else if( isFinal ){
mistachkined008ec2018-09-12 01:05:26 +00002096 sqlite3_result_text(ctx, pStr->zBuf, (int)pStr->nUsed,
drhff135ae2015-12-30 01:07:02 +00002097 pStr->bStatic ? SQLITE_TRANSIENT : sqlite3_free);
2098 pStr->bStatic = 1;
drh8be47a72018-07-05 20:05:29 +00002099 }else{
mistachkined008ec2018-09-12 01:05:26 +00002100 sqlite3_result_text(ctx, pStr->zBuf, (int)pStr->nUsed, SQLITE_TRANSIENT);
drh8be47a72018-07-05 20:05:29 +00002101 pStr->nUsed--;
drhff135ae2015-12-30 01:07:02 +00002102 }
2103 }else{
2104 sqlite3_result_text(ctx, "{}", 2, SQLITE_STATIC);
2105 }
2106 sqlite3_result_subtype(ctx, JSON_SUBTYPE);
2107}
drh8be47a72018-07-05 20:05:29 +00002108static void jsonObjectValue(sqlite3_context *ctx){
2109 jsonObjectCompute(ctx, 0);
2110}
2111static void jsonObjectFinal(sqlite3_context *ctx){
2112 jsonObjectCompute(ctx, 1);
2113}
2114
drhff135ae2015-12-30 01:07:02 +00002115
2116
drhd2975922015-08-29 17:22:33 +00002117#ifndef SQLITE_OMIT_VIRTUALTABLE
drhcb6c6c62015-08-19 22:47:17 +00002118/****************************************************************************
2119** The json_each virtual table
2120****************************************************************************/
2121typedef struct JsonEachCursor JsonEachCursor;
2122struct JsonEachCursor {
2123 sqlite3_vtab_cursor base; /* Base class - must be first */
drh505ad2c2015-08-21 17:33:11 +00002124 u32 iRowid; /* The rowid */
drh852944e2015-09-10 03:29:11 +00002125 u32 iBegin; /* The first node of the scan */
drh505ad2c2015-08-21 17:33:11 +00002126 u32 i; /* Index in sParse.aNode[] of current row */
2127 u32 iEnd; /* EOF when i equals or exceeds this value */
2128 u8 eType; /* Type of top-level element */
2129 u8 bRecursive; /* True for json_tree(). False for json_each() */
2130 char *zJson; /* Input JSON */
drh383de692015-09-10 17:20:57 +00002131 char *zRoot; /* Path by which to filter zJson */
drh505ad2c2015-08-21 17:33:11 +00002132 JsonParse sParse; /* Parse of the input JSON */
drhcb6c6c62015-08-19 22:47:17 +00002133};
2134
2135/* Constructor for the json_each virtual table */
2136static int jsonEachConnect(
2137 sqlite3 *db,
2138 void *pAux,
2139 int argc, const char *const*argv,
2140 sqlite3_vtab **ppVtab,
2141 char **pzErr
2142){
2143 sqlite3_vtab *pNew;
drh505ad2c2015-08-21 17:33:11 +00002144 int rc;
drhcb6c6c62015-08-19 22:47:17 +00002145
2146/* Column numbers */
drh4af352d2015-08-21 20:02:48 +00002147#define JEACH_KEY 0
2148#define JEACH_VALUE 1
2149#define JEACH_TYPE 2
2150#define JEACH_ATOM 3
2151#define JEACH_ID 4
2152#define JEACH_PARENT 5
2153#define JEACH_FULLKEY 6
drh383de692015-09-10 17:20:57 +00002154#define JEACH_PATH 7
drh43579192018-11-16 16:04:50 +00002155/* The xBestIndex method assumes that the JSON and ROOT columns are
2156** the last two columns in the table. Should this ever changes, be
2157** sure to update the xBestIndex method. */
drh383de692015-09-10 17:20:57 +00002158#define JEACH_JSON 8
2159#define JEACH_ROOT 9
drhcb6c6c62015-08-19 22:47:17 +00002160
drh9dbf96b2022-01-06 01:40:09 +00002161 UNUSED_PARAMETER(pzErr);
2162 UNUSED_PARAMETER(argv);
2163 UNUSED_PARAMETER(argc);
2164 UNUSED_PARAMETER(pAux);
drh505ad2c2015-08-21 17:33:11 +00002165 rc = sqlite3_declare_vtab(db,
drh383de692015-09-10 17:20:57 +00002166 "CREATE TABLE x(key,value,type,atom,id,parent,fullkey,path,"
2167 "json HIDDEN,root HIDDEN)");
drh505ad2c2015-08-21 17:33:11 +00002168 if( rc==SQLITE_OK ){
2169 pNew = *ppVtab = sqlite3_malloc( sizeof(*pNew) );
2170 if( pNew==0 ) return SQLITE_NOMEM;
2171 memset(pNew, 0, sizeof(*pNew));
drh2b1c2aa2020-01-07 19:45:40 +00002172 sqlite3_vtab_config(db, SQLITE_VTAB_INNOCUOUS);
drh505ad2c2015-08-21 17:33:11 +00002173 }
2174 return rc;
drhcb6c6c62015-08-19 22:47:17 +00002175}
2176
2177/* destructor for json_each virtual table */
2178static int jsonEachDisconnect(sqlite3_vtab *pVtab){
2179 sqlite3_free(pVtab);
2180 return SQLITE_OK;
2181}
2182
drh505ad2c2015-08-21 17:33:11 +00002183/* constructor for a JsonEachCursor object for json_each(). */
2184static int jsonEachOpenEach(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){
drhcb6c6c62015-08-19 22:47:17 +00002185 JsonEachCursor *pCur;
drh6fd5c1e2015-08-21 20:37:12 +00002186
drh9dbf96b2022-01-06 01:40:09 +00002187 UNUSED_PARAMETER(p);
drhcb6c6c62015-08-19 22:47:17 +00002188 pCur = sqlite3_malloc( sizeof(*pCur) );
2189 if( pCur==0 ) return SQLITE_NOMEM;
2190 memset(pCur, 0, sizeof(*pCur));
2191 *ppCursor = &pCur->base;
2192 return SQLITE_OK;
2193}
2194
drh505ad2c2015-08-21 17:33:11 +00002195/* constructor for a JsonEachCursor object for json_tree(). */
2196static int jsonEachOpenTree(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){
2197 int rc = jsonEachOpenEach(p, ppCursor);
2198 if( rc==SQLITE_OK ){
2199 JsonEachCursor *pCur = (JsonEachCursor*)*ppCursor;
2200 pCur->bRecursive = 1;
2201 }
2202 return rc;
2203}
2204
drhcb6c6c62015-08-19 22:47:17 +00002205/* Reset a JsonEachCursor back to its original state. Free any memory
2206** held. */
2207static void jsonEachCursorReset(JsonEachCursor *p){
2208 sqlite3_free(p->zJson);
drh383de692015-09-10 17:20:57 +00002209 sqlite3_free(p->zRoot);
drh505ad2c2015-08-21 17:33:11 +00002210 jsonParseReset(&p->sParse);
drhcb6c6c62015-08-19 22:47:17 +00002211 p->iRowid = 0;
2212 p->i = 0;
2213 p->iEnd = 0;
2214 p->eType = 0;
drhcb6c6c62015-08-19 22:47:17 +00002215 p->zJson = 0;
drh383de692015-09-10 17:20:57 +00002216 p->zRoot = 0;
drhcb6c6c62015-08-19 22:47:17 +00002217}
2218
2219/* Destructor for a jsonEachCursor object */
2220static int jsonEachClose(sqlite3_vtab_cursor *cur){
2221 JsonEachCursor *p = (JsonEachCursor*)cur;
2222 jsonEachCursorReset(p);
2223 sqlite3_free(cur);
2224 return SQLITE_OK;
2225}
2226
2227/* Return TRUE if the jsonEachCursor object has been advanced off the end
2228** of the JSON object */
2229static int jsonEachEof(sqlite3_vtab_cursor *cur){
2230 JsonEachCursor *p = (JsonEachCursor*)cur;
2231 return p->i >= p->iEnd;
2232}
2233
drh505ad2c2015-08-21 17:33:11 +00002234/* Advance the cursor to the next element for json_tree() */
drh4af352d2015-08-21 20:02:48 +00002235static int jsonEachNext(sqlite3_vtab_cursor *cur){
drh505ad2c2015-08-21 17:33:11 +00002236 JsonEachCursor *p = (JsonEachCursor*)cur;
drh4af352d2015-08-21 20:02:48 +00002237 if( p->bRecursive ){
drh852944e2015-09-10 03:29:11 +00002238 if( p->sParse.aNode[p->i].jnFlags & JNODE_LABEL ) p->i++;
2239 p->i++;
drh4af352d2015-08-21 20:02:48 +00002240 p->iRowid++;
drh852944e2015-09-10 03:29:11 +00002241 if( p->i<p->iEnd ){
drh8784eca2015-08-23 02:42:30 +00002242 u32 iUp = p->sParse.aUp[p->i];
2243 JsonNode *pUp = &p->sParse.aNode[iUp];
drh4af352d2015-08-21 20:02:48 +00002244 p->eType = pUp->eType;
drh8784eca2015-08-23 02:42:30 +00002245 if( pUp->eType==JSON_ARRAY ){
drh285f2ef2021-10-15 16:15:04 +00002246 assert( pUp->eU==0 || pUp->eU==3 );
drh9dbf96b2022-01-06 01:40:09 +00002247 testcase( pUp->eU==3 );
drh285f2ef2021-10-15 16:15:04 +00002248 VVA( pUp->eU = 3 );
drh8784eca2015-08-23 02:42:30 +00002249 if( iUp==p->i-1 ){
2250 pUp->u.iKey = 0;
2251 }else{
2252 pUp->u.iKey++;
2253 }
drh4af352d2015-08-21 20:02:48 +00002254 }
2255 }
drh505ad2c2015-08-21 17:33:11 +00002256 }else{
drh4af352d2015-08-21 20:02:48 +00002257 switch( p->eType ){
2258 case JSON_ARRAY: {
2259 p->i += jsonNodeSize(&p->sParse.aNode[p->i]);
2260 p->iRowid++;
2261 break;
2262 }
2263 case JSON_OBJECT: {
2264 p->i += 1 + jsonNodeSize(&p->sParse.aNode[p->i+1]);
2265 p->iRowid++;
2266 break;
2267 }
2268 default: {
2269 p->i = p->iEnd;
2270 break;
2271 }
drh505ad2c2015-08-21 17:33:11 +00002272 }
2273 }
2274 return SQLITE_OK;
2275}
2276
drh4af352d2015-08-21 20:02:48 +00002277/* Append the name of the path for element i to pStr
2278*/
2279static void jsonEachComputePath(
2280 JsonEachCursor *p, /* The cursor */
2281 JsonString *pStr, /* Write the path here */
2282 u32 i /* Path to this element */
2283){
2284 JsonNode *pNode, *pUp;
2285 u32 iUp;
2286 if( i==0 ){
2287 jsonAppendChar(pStr, '$');
2288 return;
drhcb6c6c62015-08-19 22:47:17 +00002289 }
drh4af352d2015-08-21 20:02:48 +00002290 iUp = p->sParse.aUp[i];
2291 jsonEachComputePath(p, pStr, iUp);
2292 pNode = &p->sParse.aNode[i];
2293 pUp = &p->sParse.aNode[iUp];
2294 if( pUp->eType==JSON_ARRAY ){
drh285f2ef2021-10-15 16:15:04 +00002295 assert( pUp->eU==3 || (pUp->eU==0 && pUp->u.iKey==0) );
2296 testcase( pUp->eU==0 );
drh4af352d2015-08-21 20:02:48 +00002297 jsonPrintf(30, pStr, "[%d]", pUp->u.iKey);
2298 }else{
2299 assert( pUp->eType==JSON_OBJECT );
drh852944e2015-09-10 03:29:11 +00002300 if( (pNode->jnFlags & JNODE_LABEL)==0 ) pNode--;
drh4af352d2015-08-21 20:02:48 +00002301 assert( pNode->eType==JSON_STRING );
drh852944e2015-09-10 03:29:11 +00002302 assert( pNode->jnFlags & JNODE_LABEL );
drh285f2ef2021-10-15 16:15:04 +00002303 assert( pNode->eU==1 );
drh4af352d2015-08-21 20:02:48 +00002304 jsonPrintf(pNode->n+1, pStr, ".%.*s", pNode->n-2, pNode->u.zJContent+1);
2305 }
drhcb6c6c62015-08-19 22:47:17 +00002306}
2307
2308/* Return the value of a column */
2309static int jsonEachColumn(
2310 sqlite3_vtab_cursor *cur, /* The cursor */
2311 sqlite3_context *ctx, /* First argument to sqlite3_result_...() */
2312 int i /* Which column to return */
2313){
2314 JsonEachCursor *p = (JsonEachCursor*)cur;
drh505ad2c2015-08-21 17:33:11 +00002315 JsonNode *pThis = &p->sParse.aNode[p->i];
drhcb6c6c62015-08-19 22:47:17 +00002316 switch( i ){
2317 case JEACH_KEY: {
drh8784eca2015-08-23 02:42:30 +00002318 if( p->i==0 ) break;
drhcb6c6c62015-08-19 22:47:17 +00002319 if( p->eType==JSON_OBJECT ){
drh505ad2c2015-08-21 17:33:11 +00002320 jsonReturn(pThis, ctx, 0);
2321 }else if( p->eType==JSON_ARRAY ){
2322 u32 iKey;
2323 if( p->bRecursive ){
2324 if( p->iRowid==0 ) break;
drh285f2ef2021-10-15 16:15:04 +00002325 assert( p->sParse.aNode[p->sParse.aUp[p->i]].eU==3 );
drh8784eca2015-08-23 02:42:30 +00002326 iKey = p->sParse.aNode[p->sParse.aUp[p->i]].u.iKey;
drh505ad2c2015-08-21 17:33:11 +00002327 }else{
2328 iKey = p->iRowid;
2329 }
drh6fd5c1e2015-08-21 20:37:12 +00002330 sqlite3_result_int64(ctx, (sqlite3_int64)iKey);
drhcb6c6c62015-08-19 22:47:17 +00002331 }
2332 break;
2333 }
2334 case JEACH_VALUE: {
drh852944e2015-09-10 03:29:11 +00002335 if( pThis->jnFlags & JNODE_LABEL ) pThis++;
drh505ad2c2015-08-21 17:33:11 +00002336 jsonReturn(pThis, ctx, 0);
2337 break;
2338 }
2339 case JEACH_TYPE: {
drh852944e2015-09-10 03:29:11 +00002340 if( pThis->jnFlags & JNODE_LABEL ) pThis++;
drh505ad2c2015-08-21 17:33:11 +00002341 sqlite3_result_text(ctx, jsonType[pThis->eType], -1, SQLITE_STATIC);
2342 break;
2343 }
2344 case JEACH_ATOM: {
drh852944e2015-09-10 03:29:11 +00002345 if( pThis->jnFlags & JNODE_LABEL ) pThis++;
drh505ad2c2015-08-21 17:33:11 +00002346 if( pThis->eType>=JSON_ARRAY ) break;
2347 jsonReturn(pThis, ctx, 0);
2348 break;
2349 }
2350 case JEACH_ID: {
drh852944e2015-09-10 03:29:11 +00002351 sqlite3_result_int64(ctx,
2352 (sqlite3_int64)p->i + ((pThis->jnFlags & JNODE_LABEL)!=0));
drh505ad2c2015-08-21 17:33:11 +00002353 break;
2354 }
2355 case JEACH_PARENT: {
drh852944e2015-09-10 03:29:11 +00002356 if( p->i>p->iBegin && p->bRecursive ){
drh6fd5c1e2015-08-21 20:37:12 +00002357 sqlite3_result_int64(ctx, (sqlite3_int64)p->sParse.aUp[p->i]);
drhcb6c6c62015-08-19 22:47:17 +00002358 }
2359 break;
2360 }
drh4af352d2015-08-21 20:02:48 +00002361 case JEACH_FULLKEY: {
2362 JsonString x;
2363 jsonInit(&x, ctx);
2364 if( p->bRecursive ){
2365 jsonEachComputePath(p, &x, p->i);
2366 }else{
drh383de692015-09-10 17:20:57 +00002367 if( p->zRoot ){
2368 jsonAppendRaw(&x, p->zRoot, (int)strlen(p->zRoot));
drh4af352d2015-08-21 20:02:48 +00002369 }else{
2370 jsonAppendChar(&x, '$');
2371 }
2372 if( p->eType==JSON_ARRAY ){
2373 jsonPrintf(30, &x, "[%d]", p->iRowid);
drhdd7460f2018-05-16 12:19:11 +00002374 }else if( p->eType==JSON_OBJECT ){
drh285f2ef2021-10-15 16:15:04 +00002375 assert( pThis->eU==1 );
drh4af352d2015-08-21 20:02:48 +00002376 jsonPrintf(pThis->n, &x, ".%.*s", pThis->n-2, pThis->u.zJContent+1);
2377 }
2378 }
2379 jsonResult(&x);
2380 break;
2381 }
drhcb6c6c62015-08-19 22:47:17 +00002382 case JEACH_PATH: {
drh383de692015-09-10 17:20:57 +00002383 if( p->bRecursive ){
2384 JsonString x;
2385 jsonInit(&x, ctx);
2386 jsonEachComputePath(p, &x, p->sParse.aUp[p->i]);
2387 jsonResult(&x);
2388 break;
drh4af352d2015-08-21 20:02:48 +00002389 }
drh383de692015-09-10 17:20:57 +00002390 /* For json_each() path and root are the same so fall through
2391 ** into the root case */
drh08b92082020-08-10 14:18:00 +00002392 /* no break */ deliberate_fall_through
drh383de692015-09-10 17:20:57 +00002393 }
drh6850a632016-11-07 18:18:08 +00002394 default: {
drh383de692015-09-10 17:20:57 +00002395 const char *zRoot = p->zRoot;
drh6850a632016-11-07 18:18:08 +00002396 if( zRoot==0 ) zRoot = "$";
drh383de692015-09-10 17:20:57 +00002397 sqlite3_result_text(ctx, zRoot, -1, SQLITE_STATIC);
drhcb6c6c62015-08-19 22:47:17 +00002398 break;
2399 }
drh3d1d2a92015-09-22 01:15:49 +00002400 case JEACH_JSON: {
drh505ad2c2015-08-21 17:33:11 +00002401 assert( i==JEACH_JSON );
drhcb6c6c62015-08-19 22:47:17 +00002402 sqlite3_result_text(ctx, p->sParse.zJson, -1, SQLITE_STATIC);
2403 break;
2404 }
2405 }
2406 return SQLITE_OK;
2407}
2408
2409/* Return the current rowid value */
2410static int jsonEachRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
2411 JsonEachCursor *p = (JsonEachCursor*)cur;
2412 *pRowid = p->iRowid;
2413 return SQLITE_OK;
2414}
2415
2416/* The query strategy is to look for an equality constraint on the json
2417** column. Without such a constraint, the table cannot operate. idxNum is
drh383de692015-09-10 17:20:57 +00002418** 1 if the constraint is found, 3 if the constraint and zRoot are found,
drhcb6c6c62015-08-19 22:47:17 +00002419** and 0 otherwise.
2420*/
2421static int jsonEachBestIndex(
2422 sqlite3_vtab *tab,
2423 sqlite3_index_info *pIdxInfo
2424){
drh43579192018-11-16 16:04:50 +00002425 int i; /* Loop counter or computed array index */
2426 int aIdx[2]; /* Index of constraints for JSON and ROOT */
2427 int unusableMask = 0; /* Mask of unusable JSON and ROOT constraints */
2428 int idxMask = 0; /* Mask of usable == constraints JSON and ROOT */
drhcb6c6c62015-08-19 22:47:17 +00002429 const struct sqlite3_index_constraint *pConstraint;
drh6fd5c1e2015-08-21 20:37:12 +00002430
drh43579192018-11-16 16:04:50 +00002431 /* This implementation assumes that JSON and ROOT are the last two
2432 ** columns in the table */
2433 assert( JEACH_ROOT == JEACH_JSON+1 );
drh9dbf96b2022-01-06 01:40:09 +00002434 UNUSED_PARAMETER(tab);
drh43579192018-11-16 16:04:50 +00002435 aIdx[0] = aIdx[1] = -1;
drhcb6c6c62015-08-19 22:47:17 +00002436 pConstraint = pIdxInfo->aConstraint;
2437 for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){
drh43579192018-11-16 16:04:50 +00002438 int iCol;
2439 int iMask;
2440 if( pConstraint->iColumn < JEACH_JSON ) continue;
2441 iCol = pConstraint->iColumn - JEACH_JSON;
2442 assert( iCol==0 || iCol==1 );
drh285f2ef2021-10-15 16:15:04 +00002443 testcase( iCol==0 );
drh43579192018-11-16 16:04:50 +00002444 iMask = 1 << iCol;
2445 if( pConstraint->usable==0 ){
2446 unusableMask |= iMask;
2447 }else if( pConstraint->op==SQLITE_INDEX_CONSTRAINT_EQ ){
2448 aIdx[iCol] = i;
2449 idxMask |= iMask;
drhcb6c6c62015-08-19 22:47:17 +00002450 }
2451 }
drh43579192018-11-16 16:04:50 +00002452 if( (unusableMask & ~idxMask)!=0 ){
2453 /* If there are any unusable constraints on JSON or ROOT, then reject
2454 ** this entire plan */
2455 return SQLITE_CONSTRAINT;
2456 }
2457 if( aIdx[0]<0 ){
2458 /* No JSON input. Leave estimatedCost at the huge value that it was
2459 ** initialized to to discourage the query planner from selecting this
2460 ** plan. */
drhcb6c6c62015-08-19 22:47:17 +00002461 pIdxInfo->idxNum = 0;
drhcb6c6c62015-08-19 22:47:17 +00002462 }else{
drh505ad2c2015-08-21 17:33:11 +00002463 pIdxInfo->estimatedCost = 1.0;
drh43579192018-11-16 16:04:50 +00002464 i = aIdx[0];
2465 pIdxInfo->aConstraintUsage[i].argvIndex = 1;
2466 pIdxInfo->aConstraintUsage[i].omit = 1;
2467 if( aIdx[1]<0 ){
2468 pIdxInfo->idxNum = 1; /* Only JSON supplied. Plan 1 */
drhcb6c6c62015-08-19 22:47:17 +00002469 }else{
drh43579192018-11-16 16:04:50 +00002470 i = aIdx[1];
2471 pIdxInfo->aConstraintUsage[i].argvIndex = 2;
2472 pIdxInfo->aConstraintUsage[i].omit = 1;
2473 pIdxInfo->idxNum = 3; /* Both JSON and ROOT are supplied. Plan 3 */
drhcb6c6c62015-08-19 22:47:17 +00002474 }
2475 }
2476 return SQLITE_OK;
2477}
2478
2479/* Start a search on a new JSON string */
2480static int jsonEachFilter(
2481 sqlite3_vtab_cursor *cur,
2482 int idxNum, const char *idxStr,
2483 int argc, sqlite3_value **argv
2484){
2485 JsonEachCursor *p = (JsonEachCursor*)cur;
2486 const char *z;
mistachkin16a93122015-09-11 18:05:01 +00002487 const char *zRoot = 0;
drhcb6c6c62015-08-19 22:47:17 +00002488 sqlite3_int64 n;
2489
drh9dbf96b2022-01-06 01:40:09 +00002490 UNUSED_PARAMETER(idxStr);
2491 UNUSED_PARAMETER(argc);
drhcb6c6c62015-08-19 22:47:17 +00002492 jsonEachCursorReset(p);
2493 if( idxNum==0 ) return SQLITE_OK;
2494 z = (const char*)sqlite3_value_text(argv[0]);
2495 if( z==0 ) return SQLITE_OK;
drhcb6c6c62015-08-19 22:47:17 +00002496 n = sqlite3_value_bytes(argv[0]);
drh6fd5c1e2015-08-21 20:37:12 +00002497 p->zJson = sqlite3_malloc64( n+1 );
drhcb6c6c62015-08-19 22:47:17 +00002498 if( p->zJson==0 ) return SQLITE_NOMEM;
drh6fd5c1e2015-08-21 20:37:12 +00002499 memcpy(p->zJson, z, (size_t)n+1);
drha7714022015-08-29 00:54:49 +00002500 if( jsonParse(&p->sParse, 0, p->zJson) ){
2501 int rc = SQLITE_NOMEM;
2502 if( p->sParse.oom==0 ){
2503 sqlite3_free(cur->pVtab->zErrMsg);
2504 cur->pVtab->zErrMsg = sqlite3_mprintf("malformed JSON");
2505 if( cur->pVtab->zErrMsg ) rc = SQLITE_ERROR;
2506 }
drhcb6c6c62015-08-19 22:47:17 +00002507 jsonEachCursorReset(p);
drha7714022015-08-29 00:54:49 +00002508 return rc;
2509 }else if( p->bRecursive && jsonParseFindParents(&p->sParse) ){
2510 jsonEachCursorReset(p);
2511 return SQLITE_NOMEM;
drhcb6c6c62015-08-19 22:47:17 +00002512 }else{
drh95677942015-09-24 01:06:37 +00002513 JsonNode *pNode = 0;
drhcb6c6c62015-08-19 22:47:17 +00002514 if( idxNum==3 ){
drha7714022015-08-29 00:54:49 +00002515 const char *zErr = 0;
drha8f39a92015-09-21 22:53:16 +00002516 zRoot = (const char*)sqlite3_value_text(argv[1]);
2517 if( zRoot==0 ) return SQLITE_OK;
drhcb6c6c62015-08-19 22:47:17 +00002518 n = sqlite3_value_bytes(argv[1]);
drh383de692015-09-10 17:20:57 +00002519 p->zRoot = sqlite3_malloc64( n+1 );
2520 if( p->zRoot==0 ) return SQLITE_NOMEM;
2521 memcpy(p->zRoot, zRoot, (size_t)n+1);
drha8f39a92015-09-21 22:53:16 +00002522 if( zRoot[0]!='$' ){
2523 zErr = zRoot;
2524 }else{
2525 pNode = jsonLookupStep(&p->sParse, 0, p->zRoot+1, 0, &zErr);
2526 }
2527 if( zErr ){
drha7714022015-08-29 00:54:49 +00002528 sqlite3_free(cur->pVtab->zErrMsg);
2529 cur->pVtab->zErrMsg = jsonPathSyntaxError(zErr);
drhcb6c6c62015-08-19 22:47:17 +00002530 jsonEachCursorReset(p);
drha7714022015-08-29 00:54:49 +00002531 return cur->pVtab->zErrMsg ? SQLITE_ERROR : SQLITE_NOMEM;
2532 }else if( pNode==0 ){
drhcb6c6c62015-08-19 22:47:17 +00002533 return SQLITE_OK;
2534 }
2535 }else{
2536 pNode = p->sParse.aNode;
2537 }
drh852944e2015-09-10 03:29:11 +00002538 p->iBegin = p->i = (int)(pNode - p->sParse.aNode);
drhcb6c6c62015-08-19 22:47:17 +00002539 p->eType = pNode->eType;
2540 if( p->eType>=JSON_ARRAY ){
drh285f2ef2021-10-15 16:15:04 +00002541 assert( pNode->eU==0 );
2542 VVA( pNode->eU = 3 );
drh8784eca2015-08-23 02:42:30 +00002543 pNode->u.iKey = 0;
drhc3722b22015-08-23 20:44:59 +00002544 p->iEnd = p->i + pNode->n + 1;
drh852944e2015-09-10 03:29:11 +00002545 if( p->bRecursive ){
drh3d1d2a92015-09-22 01:15:49 +00002546 p->eType = p->sParse.aNode[p->sParse.aUp[p->i]].eType;
drh852944e2015-09-10 03:29:11 +00002547 if( p->i>0 && (p->sParse.aNode[p->i-1].jnFlags & JNODE_LABEL)!=0 ){
2548 p->i--;
2549 }
2550 }else{
2551 p->i++;
2552 }
drhcb6c6c62015-08-19 22:47:17 +00002553 }else{
2554 p->iEnd = p->i+1;
2555 }
2556 }
drha8f39a92015-09-21 22:53:16 +00002557 return SQLITE_OK;
drhcb6c6c62015-08-19 22:47:17 +00002558}
2559
2560/* The methods of the json_each virtual table */
2561static sqlite3_module jsonEachModule = {
2562 0, /* iVersion */
2563 0, /* xCreate */
2564 jsonEachConnect, /* xConnect */
2565 jsonEachBestIndex, /* xBestIndex */
2566 jsonEachDisconnect, /* xDisconnect */
2567 0, /* xDestroy */
drh505ad2c2015-08-21 17:33:11 +00002568 jsonEachOpenEach, /* xOpen - open a cursor */
drhcb6c6c62015-08-19 22:47:17 +00002569 jsonEachClose, /* xClose - close a cursor */
2570 jsonEachFilter, /* xFilter - configure scan constraints */
drh4af352d2015-08-21 20:02:48 +00002571 jsonEachNext, /* xNext - advance a cursor */
drhcb6c6c62015-08-19 22:47:17 +00002572 jsonEachEof, /* xEof - check for end of scan */
2573 jsonEachColumn, /* xColumn - read data */
2574 jsonEachRowid, /* xRowid - read data */
2575 0, /* xUpdate */
2576 0, /* xBegin */
2577 0, /* xSync */
2578 0, /* xCommit */
2579 0, /* xRollback */
2580 0, /* xFindMethod */
2581 0, /* xRename */
drh6fd5c1e2015-08-21 20:37:12 +00002582 0, /* xSavepoint */
2583 0, /* xRelease */
drh84c501b2018-11-05 23:01:45 +00002584 0, /* xRollbackTo */
2585 0 /* xShadowName */
drhcb6c6c62015-08-19 22:47:17 +00002586};
2587
drh505ad2c2015-08-21 17:33:11 +00002588/* The methods of the json_tree virtual table. */
2589static sqlite3_module jsonTreeModule = {
2590 0, /* iVersion */
2591 0, /* xCreate */
2592 jsonEachConnect, /* xConnect */
2593 jsonEachBestIndex, /* xBestIndex */
2594 jsonEachDisconnect, /* xDisconnect */
2595 0, /* xDestroy */
2596 jsonEachOpenTree, /* xOpen - open a cursor */
2597 jsonEachClose, /* xClose - close a cursor */
2598 jsonEachFilter, /* xFilter - configure scan constraints */
drh4af352d2015-08-21 20:02:48 +00002599 jsonEachNext, /* xNext - advance a cursor */
drh505ad2c2015-08-21 17:33:11 +00002600 jsonEachEof, /* xEof - check for end of scan */
2601 jsonEachColumn, /* xColumn - read data */
2602 jsonEachRowid, /* xRowid - read data */
2603 0, /* xUpdate */
2604 0, /* xBegin */
2605 0, /* xSync */
2606 0, /* xCommit */
2607 0, /* xRollback */
2608 0, /* xFindMethod */
2609 0, /* xRename */
drh6fd5c1e2015-08-21 20:37:12 +00002610 0, /* xSavepoint */
2611 0, /* xRelease */
drh84c501b2018-11-05 23:01:45 +00002612 0, /* xRollbackTo */
2613 0 /* xShadowName */
drh505ad2c2015-08-21 17:33:11 +00002614};
drhd2975922015-08-29 17:22:33 +00002615#endif /* SQLITE_OMIT_VIRTUALTABLE */
drh9dbf96b2022-01-06 01:40:09 +00002616#endif /* !defined(SQLITE_OMIT_JSON) */
drh505ad2c2015-08-21 17:33:11 +00002617
drh9dbf96b2022-01-06 01:40:09 +00002618/*
2619** Register JSON functions.
2620*/
2621void sqlite3RegisterJsonFunctions(void){
2622#ifndef SQLITE_OMIT_JSON
2623 static FuncDef aJsonFunc[] = {
drhdaefcd92022-01-08 15:37:13 +00002624 JFUNCTION(json, 1, 0, jsonRemoveFunc),
2625 JFUNCTION(json_array, -1, 0, jsonArrayFunc),
2626 JFUNCTION(json_array_length, 1, 0, jsonArrayLengthFunc),
2627 JFUNCTION(json_array_length, 2, 0, jsonArrayLengthFunc),
2628 JFUNCTION(json_extract, -1, 0, jsonExtractFunc),
drhd83c90b2022-01-10 15:43:13 +00002629 JFUNCTION(->, 2, JSON_JSON, jsonExtractFunc),
2630 JFUNCTION(->>, 2, JSON_SQL, jsonExtractFunc),
drhdaefcd92022-01-08 15:37:13 +00002631 JFUNCTION(json_insert, -1, 0, jsonSetFunc),
drhdaefcd92022-01-08 15:37:13 +00002632 JFUNCTION(json_object, -1, 0, jsonObjectFunc),
2633 JFUNCTION(json_patch, 2, 0, jsonPatchFunc),
2634 JFUNCTION(json_quote, 1, 0, jsonQuoteFunc),
2635 JFUNCTION(json_remove, -1, 0, jsonRemoveFunc),
2636 JFUNCTION(json_replace, -1, 0, jsonReplaceFunc),
2637 JFUNCTION(json_set, -1, JSON_ISSET, jsonSetFunc),
2638 JFUNCTION(json_type, 1, 0, jsonTypeFunc),
2639 JFUNCTION(json_type, 2, 0, jsonTypeFunc),
2640 JFUNCTION(json_valid, 1, 0, jsonValidFunc),
drh301eecc2015-08-17 20:14:19 +00002641#if SQLITE_DEBUG
drhdaefcd92022-01-08 15:37:13 +00002642 JFUNCTION(json_parse, 1, 0, jsonParseFunc),
2643 JFUNCTION(json_test1, 1, 0, jsonTest1Func),
drh301eecc2015-08-17 20:14:19 +00002644#endif
drhdaefcd92022-01-08 15:37:13 +00002645 WAGGREGATE(json_group_array, 1, 0, 0,
drh9dbf96b2022-01-06 01:40:09 +00002646 jsonArrayStep, jsonArrayFinal, jsonArrayValue, jsonGroupInverse,
2647 SQLITE_SUBTYPE|SQLITE_UTF8|SQLITE_DETERMINISTIC|SQLITE_INNOCUOUS),
drhdaefcd92022-01-08 15:37:13 +00002648 WAGGREGATE(json_group_object, 2, 0, 0,
drh9dbf96b2022-01-06 01:40:09 +00002649 jsonObjectStep, jsonObjectFinal, jsonObjectValue, jsonGroupInverse,
2650 SQLITE_SUBTYPE|SQLITE_UTF8|SQLITE_DETERMINISTIC|SQLITE_INNOCUOUS)
drh5fa5c102015-08-12 16:49:40 +00002651 };
drh9dbf96b2022-01-06 01:40:09 +00002652 sqlite3InsertBuiltinFuncs(aJsonFunc, ArraySize(aJsonFunc));
2653#endif
2654}
2655
2656#if !defined(SQLITE_OMIT_VIRTUALTABLE) && !defined(SQLITE_OMIT_JSON)
2657/*
2658** Register the JSON table-valued functions
2659*/
2660int sqlite3JsonTableFunctions(sqlite3 *db){
2661 int rc = SQLITE_OK;
drh505ad2c2015-08-21 17:33:11 +00002662 static const struct {
drhdaefcd92022-01-08 15:37:13 +00002663 const char *zName;
2664 sqlite3_module *pModule;
drh505ad2c2015-08-21 17:33:11 +00002665 } aMod[] = {
2666 { "json_each", &jsonEachModule },
2667 { "json_tree", &jsonTreeModule },
2668 };
drh9dbf96b2022-01-06 01:40:09 +00002669 int i;
drh505ad2c2015-08-21 17:33:11 +00002670 for(i=0; i<sizeof(aMod)/sizeof(aMod[0]) && rc==SQLITE_OK; i++){
2671 rc = sqlite3_create_module(db, aMod[i].zName, aMod[i].pModule, 0);
drhcb6c6c62015-08-19 22:47:17 +00002672 }
drh5fa5c102015-08-12 16:49:40 +00002673 return rc;
2674}
drh9dbf96b2022-01-06 01:40:09 +00002675#endif /* !defined(SQLITE_OMIT_VIRTUALTABLE) && !defined(SQLITE_OMIT_JSON) */