xref: /sqlite-3.40.0/src/json.c (revision daefcd9e)
1*9dbf96bdSdrh /*
2*9dbf96bdSdrh ** 2015-08-12
3*9dbf96bdSdrh **
4*9dbf96bdSdrh ** The author disclaims copyright to this source code.  In place of
5*9dbf96bdSdrh ** a legal notice, here is a blessing:
6*9dbf96bdSdrh **
7*9dbf96bdSdrh **    May you do good and not evil.
8*9dbf96bdSdrh **    May you find forgiveness for yourself and forgive others.
9*9dbf96bdSdrh **    May you share freely, never taking more than you give.
10*9dbf96bdSdrh **
11*9dbf96bdSdrh ******************************************************************************
12*9dbf96bdSdrh **
13*9dbf96bdSdrh ** This SQLite JSON functions.
14*9dbf96bdSdrh **
15*9dbf96bdSdrh ** This file began as an extension in ext/misc/json1.c in 2015.  That
16*9dbf96bdSdrh ** extension proved so useful that it has now been moved into the core.
17*9dbf96bdSdrh **
18*9dbf96bdSdrh ** For the time being, all JSON is stored as pure text.  (We might add
19*9dbf96bdSdrh ** a JSONB type in the future which stores a binary encoding of JSON in
20*9dbf96bdSdrh ** a BLOB, but there is no support for JSONB in the current implementation.
21*9dbf96bdSdrh ** This implementation parses JSON text at 250 MB/s, so it is hard to see
22*9dbf96bdSdrh ** how JSONB might improve on that.)
23*9dbf96bdSdrh */
24*9dbf96bdSdrh #ifndef SQLITE_OMIT_JSON
25*9dbf96bdSdrh #include "sqliteInt.h"
26*9dbf96bdSdrh 
27*9dbf96bdSdrh /*
28*9dbf96bdSdrh ** Growing our own isspace() routine this way is twice as fast as
29*9dbf96bdSdrh ** the library isspace() function, resulting in a 7% overall performance
30*9dbf96bdSdrh ** increase for the parser.  (Ubuntu14.10 gcc 4.8.4 x64 with -Os).
31*9dbf96bdSdrh */
32*9dbf96bdSdrh static const char jsonIsSpace[] = {
33*9dbf96bdSdrh   0, 0, 0, 0, 0, 0, 0, 0,     0, 1, 1, 0, 0, 1, 0, 0,
34*9dbf96bdSdrh   0, 0, 0, 0, 0, 0, 0, 0,     0, 0, 0, 0, 0, 0, 0, 0,
35*9dbf96bdSdrh   1, 0, 0, 0, 0, 0, 0, 0,     0, 0, 0, 0, 0, 0, 0, 0,
36*9dbf96bdSdrh   0, 0, 0, 0, 0, 0, 0, 0,     0, 0, 0, 0, 0, 0, 0, 0,
37*9dbf96bdSdrh   0, 0, 0, 0, 0, 0, 0, 0,     0, 0, 0, 0, 0, 0, 0, 0,
38*9dbf96bdSdrh   0, 0, 0, 0, 0, 0, 0, 0,     0, 0, 0, 0, 0, 0, 0, 0,
39*9dbf96bdSdrh   0, 0, 0, 0, 0, 0, 0, 0,     0, 0, 0, 0, 0, 0, 0, 0,
40*9dbf96bdSdrh   0, 0, 0, 0, 0, 0, 0, 0,     0, 0, 0, 0, 0, 0, 0, 0,
41*9dbf96bdSdrh   0, 0, 0, 0, 0, 0, 0, 0,     0, 0, 0, 0, 0, 0, 0, 0,
42*9dbf96bdSdrh   0, 0, 0, 0, 0, 0, 0, 0,     0, 0, 0, 0, 0, 0, 0, 0,
43*9dbf96bdSdrh   0, 0, 0, 0, 0, 0, 0, 0,     0, 0, 0, 0, 0, 0, 0, 0,
44*9dbf96bdSdrh   0, 0, 0, 0, 0, 0, 0, 0,     0, 0, 0, 0, 0, 0, 0, 0,
45*9dbf96bdSdrh   0, 0, 0, 0, 0, 0, 0, 0,     0, 0, 0, 0, 0, 0, 0, 0,
46*9dbf96bdSdrh   0, 0, 0, 0, 0, 0, 0, 0,     0, 0, 0, 0, 0, 0, 0, 0,
47*9dbf96bdSdrh   0, 0, 0, 0, 0, 0, 0, 0,     0, 0, 0, 0, 0, 0, 0, 0,
48*9dbf96bdSdrh   0, 0, 0, 0, 0, 0, 0, 0,     0, 0, 0, 0, 0, 0, 0, 0,
49*9dbf96bdSdrh };
50*9dbf96bdSdrh #define fast_isspace(x) (jsonIsSpace[(unsigned char)x])
51*9dbf96bdSdrh 
52*9dbf96bdSdrh #if !defined(SQLITE_DEBUG) && !defined(SQLITE_COVERAGE_TEST)
53*9dbf96bdSdrh #  define VVA(X)
54*9dbf96bdSdrh #else
55*9dbf96bdSdrh #  define VVA(X) X
56*9dbf96bdSdrh #endif
57*9dbf96bdSdrh 
58*9dbf96bdSdrh /* Objects */
59*9dbf96bdSdrh typedef struct JsonString JsonString;
60*9dbf96bdSdrh typedef struct JsonNode JsonNode;
61*9dbf96bdSdrh typedef struct JsonParse JsonParse;
62*9dbf96bdSdrh 
63*9dbf96bdSdrh /* An instance of this object represents a JSON string
64*9dbf96bdSdrh ** under construction.  Really, this is a generic string accumulator
65*9dbf96bdSdrh ** that can be and is used to create strings other than JSON.
66*9dbf96bdSdrh */
67*9dbf96bdSdrh struct JsonString {
68*9dbf96bdSdrh   sqlite3_context *pCtx;   /* Function context - put error messages here */
69*9dbf96bdSdrh   char *zBuf;              /* Append JSON content here */
70*9dbf96bdSdrh   u64 nAlloc;              /* Bytes of storage available in zBuf[] */
71*9dbf96bdSdrh   u64 nUsed;               /* Bytes of zBuf[] currently used */
72*9dbf96bdSdrh   u8 bStatic;              /* True if zBuf is static space */
73*9dbf96bdSdrh   u8 bErr;                 /* True if an error has been encountered */
74*9dbf96bdSdrh   char zSpace[100];        /* Initial static space */
75*9dbf96bdSdrh };
76*9dbf96bdSdrh 
77*9dbf96bdSdrh /* JSON type values
78*9dbf96bdSdrh */
79*9dbf96bdSdrh #define JSON_NULL     0
80*9dbf96bdSdrh #define JSON_TRUE     1
81*9dbf96bdSdrh #define JSON_FALSE    2
82*9dbf96bdSdrh #define JSON_INT      3
83*9dbf96bdSdrh #define JSON_REAL     4
84*9dbf96bdSdrh #define JSON_STRING   5
85*9dbf96bdSdrh #define JSON_ARRAY    6
86*9dbf96bdSdrh #define JSON_OBJECT   7
87*9dbf96bdSdrh 
88*9dbf96bdSdrh /* The "subtype" set for JSON values */
89*9dbf96bdSdrh #define JSON_SUBTYPE  74    /* Ascii for "J" */
90*9dbf96bdSdrh 
91*9dbf96bdSdrh /*
92*9dbf96bdSdrh ** Names of the various JSON types:
93*9dbf96bdSdrh */
94*9dbf96bdSdrh static const char * const jsonType[] = {
95*9dbf96bdSdrh   "null", "true", "false", "integer", "real", "text", "array", "object"
96*9dbf96bdSdrh };
97*9dbf96bdSdrh 
98*9dbf96bdSdrh /* Bit values for the JsonNode.jnFlag field
99*9dbf96bdSdrh */
100*9dbf96bdSdrh #define JNODE_RAW     0x01         /* Content is raw, not JSON encoded */
101*9dbf96bdSdrh #define JNODE_ESCAPE  0x02         /* Content is text with \ escapes */
102*9dbf96bdSdrh #define JNODE_REMOVE  0x04         /* Do not output */
103*9dbf96bdSdrh #define JNODE_REPLACE 0x08         /* Replace with JsonNode.u.iReplace */
104*9dbf96bdSdrh #define JNODE_PATCH   0x10         /* Patch with JsonNode.u.pPatch */
105*9dbf96bdSdrh #define JNODE_APPEND  0x20         /* More ARRAY/OBJECT entries at u.iAppend */
106*9dbf96bdSdrh #define JNODE_LABEL   0x40         /* Is a label of an object */
107*9dbf96bdSdrh 
108*9dbf96bdSdrh 
109*9dbf96bdSdrh /* A single node of parsed JSON
110*9dbf96bdSdrh */
111*9dbf96bdSdrh struct JsonNode {
112*9dbf96bdSdrh   u8 eType;              /* One of the JSON_ type values */
113*9dbf96bdSdrh   u8 jnFlags;            /* JNODE flags */
114*9dbf96bdSdrh   u8 eU;                 /* Which union element to use */
115*9dbf96bdSdrh   u32 n;                 /* Bytes of content, or number of sub-nodes */
116*9dbf96bdSdrh   union {
117*9dbf96bdSdrh     const char *zJContent; /* 1: Content for INT, REAL, and STRING */
118*9dbf96bdSdrh     u32 iAppend;           /* 2: More terms for ARRAY and OBJECT */
119*9dbf96bdSdrh     u32 iKey;              /* 3: Key for ARRAY objects in json_tree() */
120*9dbf96bdSdrh     u32 iReplace;          /* 4: Replacement content for JNODE_REPLACE */
121*9dbf96bdSdrh     JsonNode *pPatch;      /* 5: Node chain of patch for JNODE_PATCH */
122*9dbf96bdSdrh   } u;
123*9dbf96bdSdrh };
124*9dbf96bdSdrh 
125*9dbf96bdSdrh /* A completely parsed JSON string
126*9dbf96bdSdrh */
127*9dbf96bdSdrh struct JsonParse {
128*9dbf96bdSdrh   u32 nNode;         /* Number of slots of aNode[] used */
129*9dbf96bdSdrh   u32 nAlloc;        /* Number of slots of aNode[] allocated */
130*9dbf96bdSdrh   JsonNode *aNode;   /* Array of nodes containing the parse */
131*9dbf96bdSdrh   const char *zJson; /* Original JSON string */
132*9dbf96bdSdrh   u32 *aUp;          /* Index of parent of each node */
133*9dbf96bdSdrh   u8 oom;            /* Set to true if out of memory */
134*9dbf96bdSdrh   u8 nErr;           /* Number of errors seen */
135*9dbf96bdSdrh   u16 iDepth;        /* Nesting depth */
136*9dbf96bdSdrh   int nJson;         /* Length of the zJson string in bytes */
137*9dbf96bdSdrh   u32 iHold;         /* Replace cache line with the lowest iHold value */
138*9dbf96bdSdrh };
139*9dbf96bdSdrh 
140*9dbf96bdSdrh /*
141*9dbf96bdSdrh ** Maximum nesting depth of JSON for this implementation.
142*9dbf96bdSdrh **
143*9dbf96bdSdrh ** This limit is needed to avoid a stack overflow in the recursive
144*9dbf96bdSdrh ** descent parser.  A depth of 2000 is far deeper than any sane JSON
145*9dbf96bdSdrh ** should go.
146*9dbf96bdSdrh */
147*9dbf96bdSdrh #define JSON_MAX_DEPTH  2000
148*9dbf96bdSdrh 
149*9dbf96bdSdrh /**************************************************************************
150*9dbf96bdSdrh ** Utility routines for dealing with JsonString objects
151*9dbf96bdSdrh **************************************************************************/
152*9dbf96bdSdrh 
153*9dbf96bdSdrh /* Set the JsonString object to an empty string
154*9dbf96bdSdrh */
155*9dbf96bdSdrh static void jsonZero(JsonString *p){
156*9dbf96bdSdrh   p->zBuf = p->zSpace;
157*9dbf96bdSdrh   p->nAlloc = sizeof(p->zSpace);
158*9dbf96bdSdrh   p->nUsed = 0;
159*9dbf96bdSdrh   p->bStatic = 1;
160*9dbf96bdSdrh }
161*9dbf96bdSdrh 
162*9dbf96bdSdrh /* Initialize the JsonString object
163*9dbf96bdSdrh */
164*9dbf96bdSdrh static void jsonInit(JsonString *p, sqlite3_context *pCtx){
165*9dbf96bdSdrh   p->pCtx = pCtx;
166*9dbf96bdSdrh   p->bErr = 0;
167*9dbf96bdSdrh   jsonZero(p);
168*9dbf96bdSdrh }
169*9dbf96bdSdrh 
170*9dbf96bdSdrh 
171*9dbf96bdSdrh /* Free all allocated memory and reset the JsonString object back to its
172*9dbf96bdSdrh ** initial state.
173*9dbf96bdSdrh */
174*9dbf96bdSdrh static void jsonReset(JsonString *p){
175*9dbf96bdSdrh   if( !p->bStatic ) sqlite3_free(p->zBuf);
176*9dbf96bdSdrh   jsonZero(p);
177*9dbf96bdSdrh }
178*9dbf96bdSdrh 
179*9dbf96bdSdrh 
180*9dbf96bdSdrh /* Report an out-of-memory (OOM) condition
181*9dbf96bdSdrh */
182*9dbf96bdSdrh static void jsonOom(JsonString *p){
183*9dbf96bdSdrh   p->bErr = 1;
184*9dbf96bdSdrh   sqlite3_result_error_nomem(p->pCtx);
185*9dbf96bdSdrh   jsonReset(p);
186*9dbf96bdSdrh }
187*9dbf96bdSdrh 
188*9dbf96bdSdrh /* Enlarge pJson->zBuf so that it can hold at least N more bytes.
189*9dbf96bdSdrh ** Return zero on success.  Return non-zero on an OOM error
190*9dbf96bdSdrh */
191*9dbf96bdSdrh static int jsonGrow(JsonString *p, u32 N){
192*9dbf96bdSdrh   u64 nTotal = N<p->nAlloc ? p->nAlloc*2 : p->nAlloc+N+10;
193*9dbf96bdSdrh   char *zNew;
194*9dbf96bdSdrh   if( p->bStatic ){
195*9dbf96bdSdrh     if( p->bErr ) return 1;
196*9dbf96bdSdrh     zNew = sqlite3_malloc64(nTotal);
197*9dbf96bdSdrh     if( zNew==0 ){
198*9dbf96bdSdrh       jsonOom(p);
199*9dbf96bdSdrh       return SQLITE_NOMEM;
200*9dbf96bdSdrh     }
201*9dbf96bdSdrh     memcpy(zNew, p->zBuf, (size_t)p->nUsed);
202*9dbf96bdSdrh     p->zBuf = zNew;
203*9dbf96bdSdrh     p->bStatic = 0;
204*9dbf96bdSdrh   }else{
205*9dbf96bdSdrh     zNew = sqlite3_realloc64(p->zBuf, nTotal);
206*9dbf96bdSdrh     if( zNew==0 ){
207*9dbf96bdSdrh       jsonOom(p);
208*9dbf96bdSdrh       return SQLITE_NOMEM;
209*9dbf96bdSdrh     }
210*9dbf96bdSdrh     p->zBuf = zNew;
211*9dbf96bdSdrh   }
212*9dbf96bdSdrh   p->nAlloc = nTotal;
213*9dbf96bdSdrh   return SQLITE_OK;
214*9dbf96bdSdrh }
215*9dbf96bdSdrh 
216*9dbf96bdSdrh /* Append N bytes from zIn onto the end of the JsonString string.
217*9dbf96bdSdrh */
218*9dbf96bdSdrh static void jsonAppendRaw(JsonString *p, const char *zIn, u32 N){
219*9dbf96bdSdrh   if( N==0 ) return;
220*9dbf96bdSdrh   if( (N+p->nUsed >= p->nAlloc) && jsonGrow(p,N)!=0 ) return;
221*9dbf96bdSdrh   memcpy(p->zBuf+p->nUsed, zIn, N);
222*9dbf96bdSdrh   p->nUsed += N;
223*9dbf96bdSdrh }
224*9dbf96bdSdrh 
225*9dbf96bdSdrh /* Append formatted text (not to exceed N bytes) to the JsonString.
226*9dbf96bdSdrh */
227*9dbf96bdSdrh static void jsonPrintf(int N, JsonString *p, const char *zFormat, ...){
228*9dbf96bdSdrh   va_list ap;
229*9dbf96bdSdrh   if( (p->nUsed + N >= p->nAlloc) && jsonGrow(p, N) ) return;
230*9dbf96bdSdrh   va_start(ap, zFormat);
231*9dbf96bdSdrh   sqlite3_vsnprintf(N, p->zBuf+p->nUsed, zFormat, ap);
232*9dbf96bdSdrh   va_end(ap);
233*9dbf96bdSdrh   p->nUsed += (int)strlen(p->zBuf+p->nUsed);
234*9dbf96bdSdrh }
235*9dbf96bdSdrh 
236*9dbf96bdSdrh /* Append a single character
237*9dbf96bdSdrh */
238*9dbf96bdSdrh static void jsonAppendChar(JsonString *p, char c){
239*9dbf96bdSdrh   if( p->nUsed>=p->nAlloc && jsonGrow(p,1)!=0 ) return;
240*9dbf96bdSdrh   p->zBuf[p->nUsed++] = c;
241*9dbf96bdSdrh }
242*9dbf96bdSdrh 
243*9dbf96bdSdrh /* Append a comma separator to the output buffer, if the previous
244*9dbf96bdSdrh ** character is not '[' or '{'.
245*9dbf96bdSdrh */
246*9dbf96bdSdrh static void jsonAppendSeparator(JsonString *p){
247*9dbf96bdSdrh   char c;
248*9dbf96bdSdrh   if( p->nUsed==0 ) return;
249*9dbf96bdSdrh   c = p->zBuf[p->nUsed-1];
250*9dbf96bdSdrh   if( c!='[' && c!='{' ) jsonAppendChar(p, ',');
251*9dbf96bdSdrh }
252*9dbf96bdSdrh 
253*9dbf96bdSdrh /* Append the N-byte string in zIn to the end of the JsonString string
254*9dbf96bdSdrh ** under construction.  Enclose the string in "..." and escape
255*9dbf96bdSdrh ** any double-quotes or backslash characters contained within the
256*9dbf96bdSdrh ** string.
257*9dbf96bdSdrh */
258*9dbf96bdSdrh static void jsonAppendString(JsonString *p, const char *zIn, u32 N){
259*9dbf96bdSdrh   u32 i;
260*9dbf96bdSdrh   if( zIn==0 || ((N+p->nUsed+2 >= p->nAlloc) && jsonGrow(p,N+2)!=0) ) return;
261*9dbf96bdSdrh   p->zBuf[p->nUsed++] = '"';
262*9dbf96bdSdrh   for(i=0; i<N; i++){
263*9dbf96bdSdrh     unsigned char c = ((unsigned const char*)zIn)[i];
264*9dbf96bdSdrh     if( c=='"' || c=='\\' ){
265*9dbf96bdSdrh       json_simple_escape:
266*9dbf96bdSdrh       if( (p->nUsed+N+3-i > p->nAlloc) && jsonGrow(p,N+3-i)!=0 ) return;
267*9dbf96bdSdrh       p->zBuf[p->nUsed++] = '\\';
268*9dbf96bdSdrh     }else if( c<=0x1f ){
269*9dbf96bdSdrh       static const char aSpecial[] = {
270*9dbf96bdSdrh          0, 0, 0, 0, 0, 0, 0, 0, 'b', 't', 'n', 0, 'f', 'r', 0, 0,
271*9dbf96bdSdrh          0, 0, 0, 0, 0, 0, 0, 0,   0,   0,   0, 0,   0,   0, 0, 0
272*9dbf96bdSdrh       };
273*9dbf96bdSdrh       assert( sizeof(aSpecial)==32 );
274*9dbf96bdSdrh       assert( aSpecial['\b']=='b' );
275*9dbf96bdSdrh       assert( aSpecial['\f']=='f' );
276*9dbf96bdSdrh       assert( aSpecial['\n']=='n' );
277*9dbf96bdSdrh       assert( aSpecial['\r']=='r' );
278*9dbf96bdSdrh       assert( aSpecial['\t']=='t' );
279*9dbf96bdSdrh       if( aSpecial[c] ){
280*9dbf96bdSdrh         c = aSpecial[c];
281*9dbf96bdSdrh         goto json_simple_escape;
282*9dbf96bdSdrh       }
283*9dbf96bdSdrh       if( (p->nUsed+N+7+i > p->nAlloc) && jsonGrow(p,N+7-i)!=0 ) return;
284*9dbf96bdSdrh       p->zBuf[p->nUsed++] = '\\';
285*9dbf96bdSdrh       p->zBuf[p->nUsed++] = 'u';
286*9dbf96bdSdrh       p->zBuf[p->nUsed++] = '0';
287*9dbf96bdSdrh       p->zBuf[p->nUsed++] = '0';
288*9dbf96bdSdrh       p->zBuf[p->nUsed++] = '0' + (c>>4);
289*9dbf96bdSdrh       c = "0123456789abcdef"[c&0xf];
290*9dbf96bdSdrh     }
291*9dbf96bdSdrh     p->zBuf[p->nUsed++] = c;
292*9dbf96bdSdrh   }
293*9dbf96bdSdrh   p->zBuf[p->nUsed++] = '"';
294*9dbf96bdSdrh   assert( p->nUsed<p->nAlloc );
295*9dbf96bdSdrh }
296*9dbf96bdSdrh 
297*9dbf96bdSdrh /*
298*9dbf96bdSdrh ** Append a function parameter value to the JSON string under
299*9dbf96bdSdrh ** construction.
300*9dbf96bdSdrh */
301*9dbf96bdSdrh static void jsonAppendValue(
302*9dbf96bdSdrh   JsonString *p,                 /* Append to this JSON string */
303*9dbf96bdSdrh   sqlite3_value *pValue          /* Value to append */
304*9dbf96bdSdrh ){
305*9dbf96bdSdrh   switch( sqlite3_value_type(pValue) ){
306*9dbf96bdSdrh     case SQLITE_NULL: {
307*9dbf96bdSdrh       jsonAppendRaw(p, "null", 4);
308*9dbf96bdSdrh       break;
309*9dbf96bdSdrh     }
310*9dbf96bdSdrh     case SQLITE_INTEGER:
311*9dbf96bdSdrh     case SQLITE_FLOAT: {
312*9dbf96bdSdrh       const char *z = (const char*)sqlite3_value_text(pValue);
313*9dbf96bdSdrh       u32 n = (u32)sqlite3_value_bytes(pValue);
314*9dbf96bdSdrh       jsonAppendRaw(p, z, n);
315*9dbf96bdSdrh       break;
316*9dbf96bdSdrh     }
317*9dbf96bdSdrh     case SQLITE_TEXT: {
318*9dbf96bdSdrh       const char *z = (const char*)sqlite3_value_text(pValue);
319*9dbf96bdSdrh       u32 n = (u32)sqlite3_value_bytes(pValue);
320*9dbf96bdSdrh       if( sqlite3_value_subtype(pValue)==JSON_SUBTYPE ){
321*9dbf96bdSdrh         jsonAppendRaw(p, z, n);
322*9dbf96bdSdrh       }else{
323*9dbf96bdSdrh         jsonAppendString(p, z, n);
324*9dbf96bdSdrh       }
325*9dbf96bdSdrh       break;
326*9dbf96bdSdrh     }
327*9dbf96bdSdrh     default: {
328*9dbf96bdSdrh       if( p->bErr==0 ){
329*9dbf96bdSdrh         sqlite3_result_error(p->pCtx, "JSON cannot hold BLOB values", -1);
330*9dbf96bdSdrh         p->bErr = 2;
331*9dbf96bdSdrh         jsonReset(p);
332*9dbf96bdSdrh       }
333*9dbf96bdSdrh       break;
334*9dbf96bdSdrh     }
335*9dbf96bdSdrh   }
336*9dbf96bdSdrh }
337*9dbf96bdSdrh 
338*9dbf96bdSdrh 
339*9dbf96bdSdrh /* Make the JSON in p the result of the SQL function.
340*9dbf96bdSdrh */
341*9dbf96bdSdrh static void jsonResult(JsonString *p){
342*9dbf96bdSdrh   if( p->bErr==0 ){
343*9dbf96bdSdrh     sqlite3_result_text64(p->pCtx, p->zBuf, p->nUsed,
344*9dbf96bdSdrh                           p->bStatic ? SQLITE_TRANSIENT : sqlite3_free,
345*9dbf96bdSdrh                           SQLITE_UTF8);
346*9dbf96bdSdrh     jsonZero(p);
347*9dbf96bdSdrh   }
348*9dbf96bdSdrh   assert( p->bStatic );
349*9dbf96bdSdrh }
350*9dbf96bdSdrh 
351*9dbf96bdSdrh /**************************************************************************
352*9dbf96bdSdrh ** Utility routines for dealing with JsonNode and JsonParse objects
353*9dbf96bdSdrh **************************************************************************/
354*9dbf96bdSdrh 
355*9dbf96bdSdrh /*
356*9dbf96bdSdrh ** Return the number of consecutive JsonNode slots need to represent
357*9dbf96bdSdrh ** the parsed JSON at pNode.  The minimum answer is 1.  For ARRAY and
358*9dbf96bdSdrh ** OBJECT types, the number might be larger.
359*9dbf96bdSdrh **
360*9dbf96bdSdrh ** Appended elements are not counted.  The value returned is the number
361*9dbf96bdSdrh ** by which the JsonNode counter should increment in order to go to the
362*9dbf96bdSdrh ** next peer value.
363*9dbf96bdSdrh */
364*9dbf96bdSdrh static u32 jsonNodeSize(JsonNode *pNode){
365*9dbf96bdSdrh   return pNode->eType>=JSON_ARRAY ? pNode->n+1 : 1;
366*9dbf96bdSdrh }
367*9dbf96bdSdrh 
368*9dbf96bdSdrh /*
369*9dbf96bdSdrh ** Reclaim all memory allocated by a JsonParse object.  But do not
370*9dbf96bdSdrh ** delete the JsonParse object itself.
371*9dbf96bdSdrh */
372*9dbf96bdSdrh static void jsonParseReset(JsonParse *pParse){
373*9dbf96bdSdrh   sqlite3_free(pParse->aNode);
374*9dbf96bdSdrh   pParse->aNode = 0;
375*9dbf96bdSdrh   pParse->nNode = 0;
376*9dbf96bdSdrh   pParse->nAlloc = 0;
377*9dbf96bdSdrh   sqlite3_free(pParse->aUp);
378*9dbf96bdSdrh   pParse->aUp = 0;
379*9dbf96bdSdrh }
380*9dbf96bdSdrh 
381*9dbf96bdSdrh /*
382*9dbf96bdSdrh ** Free a JsonParse object that was obtained from sqlite3_malloc().
383*9dbf96bdSdrh */
384*9dbf96bdSdrh static void jsonParseFree(JsonParse *pParse){
385*9dbf96bdSdrh   jsonParseReset(pParse);
386*9dbf96bdSdrh   sqlite3_free(pParse);
387*9dbf96bdSdrh }
388*9dbf96bdSdrh 
389*9dbf96bdSdrh /*
390*9dbf96bdSdrh ** Convert the JsonNode pNode into a pure JSON string and
391*9dbf96bdSdrh ** append to pOut.  Subsubstructure is also included.  Return
392*9dbf96bdSdrh ** the number of JsonNode objects that are encoded.
393*9dbf96bdSdrh */
394*9dbf96bdSdrh static void jsonRenderNode(
395*9dbf96bdSdrh   JsonNode *pNode,               /* The node to render */
396*9dbf96bdSdrh   JsonString *pOut,              /* Write JSON here */
397*9dbf96bdSdrh   sqlite3_value **aReplace       /* Replacement values */
398*9dbf96bdSdrh ){
399*9dbf96bdSdrh   assert( pNode!=0 );
400*9dbf96bdSdrh   if( pNode->jnFlags & (JNODE_REPLACE|JNODE_PATCH) ){
401*9dbf96bdSdrh     if( (pNode->jnFlags & JNODE_REPLACE)!=0 && ALWAYS(aReplace!=0) ){
402*9dbf96bdSdrh       assert( pNode->eU==4 );
403*9dbf96bdSdrh       jsonAppendValue(pOut, aReplace[pNode->u.iReplace]);
404*9dbf96bdSdrh       return;
405*9dbf96bdSdrh     }
406*9dbf96bdSdrh     assert( pNode->eU==5 );
407*9dbf96bdSdrh     pNode = pNode->u.pPatch;
408*9dbf96bdSdrh   }
409*9dbf96bdSdrh   switch( pNode->eType ){
410*9dbf96bdSdrh     default: {
411*9dbf96bdSdrh       assert( pNode->eType==JSON_NULL );
412*9dbf96bdSdrh       jsonAppendRaw(pOut, "null", 4);
413*9dbf96bdSdrh       break;
414*9dbf96bdSdrh     }
415*9dbf96bdSdrh     case JSON_TRUE: {
416*9dbf96bdSdrh       jsonAppendRaw(pOut, "true", 4);
417*9dbf96bdSdrh       break;
418*9dbf96bdSdrh     }
419*9dbf96bdSdrh     case JSON_FALSE: {
420*9dbf96bdSdrh       jsonAppendRaw(pOut, "false", 5);
421*9dbf96bdSdrh       break;
422*9dbf96bdSdrh     }
423*9dbf96bdSdrh     case JSON_STRING: {
424*9dbf96bdSdrh       if( pNode->jnFlags & JNODE_RAW ){
425*9dbf96bdSdrh         assert( pNode->eU==1 );
426*9dbf96bdSdrh         jsonAppendString(pOut, pNode->u.zJContent, pNode->n);
427*9dbf96bdSdrh         break;
428*9dbf96bdSdrh       }
429*9dbf96bdSdrh       /* no break */ deliberate_fall_through
430*9dbf96bdSdrh     }
431*9dbf96bdSdrh     case JSON_REAL:
432*9dbf96bdSdrh     case JSON_INT: {
433*9dbf96bdSdrh       assert( pNode->eU==1 );
434*9dbf96bdSdrh       jsonAppendRaw(pOut, pNode->u.zJContent, pNode->n);
435*9dbf96bdSdrh       break;
436*9dbf96bdSdrh     }
437*9dbf96bdSdrh     case JSON_ARRAY: {
438*9dbf96bdSdrh       u32 j = 1;
439*9dbf96bdSdrh       jsonAppendChar(pOut, '[');
440*9dbf96bdSdrh       for(;;){
441*9dbf96bdSdrh         while( j<=pNode->n ){
442*9dbf96bdSdrh           if( (pNode[j].jnFlags & JNODE_REMOVE)==0 ){
443*9dbf96bdSdrh             jsonAppendSeparator(pOut);
444*9dbf96bdSdrh             jsonRenderNode(&pNode[j], pOut, aReplace);
445*9dbf96bdSdrh           }
446*9dbf96bdSdrh           j += jsonNodeSize(&pNode[j]);
447*9dbf96bdSdrh         }
448*9dbf96bdSdrh         if( (pNode->jnFlags & JNODE_APPEND)==0 ) break;
449*9dbf96bdSdrh         assert( pNode->eU==2 );
450*9dbf96bdSdrh         pNode = &pNode[pNode->u.iAppend];
451*9dbf96bdSdrh         j = 1;
452*9dbf96bdSdrh       }
453*9dbf96bdSdrh       jsonAppendChar(pOut, ']');
454*9dbf96bdSdrh       break;
455*9dbf96bdSdrh     }
456*9dbf96bdSdrh     case JSON_OBJECT: {
457*9dbf96bdSdrh       u32 j = 1;
458*9dbf96bdSdrh       jsonAppendChar(pOut, '{');
459*9dbf96bdSdrh       for(;;){
460*9dbf96bdSdrh         while( j<=pNode->n ){
461*9dbf96bdSdrh           if( (pNode[j+1].jnFlags & JNODE_REMOVE)==0 ){
462*9dbf96bdSdrh             jsonAppendSeparator(pOut);
463*9dbf96bdSdrh             jsonRenderNode(&pNode[j], pOut, aReplace);
464*9dbf96bdSdrh             jsonAppendChar(pOut, ':');
465*9dbf96bdSdrh             jsonRenderNode(&pNode[j+1], pOut, aReplace);
466*9dbf96bdSdrh           }
467*9dbf96bdSdrh           j += 1 + jsonNodeSize(&pNode[j+1]);
468*9dbf96bdSdrh         }
469*9dbf96bdSdrh         if( (pNode->jnFlags & JNODE_APPEND)==0 ) break;
470*9dbf96bdSdrh         assert( pNode->eU==2 );
471*9dbf96bdSdrh         pNode = &pNode[pNode->u.iAppend];
472*9dbf96bdSdrh         j = 1;
473*9dbf96bdSdrh       }
474*9dbf96bdSdrh       jsonAppendChar(pOut, '}');
475*9dbf96bdSdrh       break;
476*9dbf96bdSdrh     }
477*9dbf96bdSdrh   }
478*9dbf96bdSdrh }
479*9dbf96bdSdrh 
480*9dbf96bdSdrh /*
481*9dbf96bdSdrh ** Return a JsonNode and all its descendents as a JSON string.
482*9dbf96bdSdrh */
483*9dbf96bdSdrh static void jsonReturnJson(
484*9dbf96bdSdrh   JsonNode *pNode,            /* Node to return */
485*9dbf96bdSdrh   sqlite3_context *pCtx,      /* Return value for this function */
486*9dbf96bdSdrh   sqlite3_value **aReplace    /* Array of replacement values */
487*9dbf96bdSdrh ){
488*9dbf96bdSdrh   JsonString s;
489*9dbf96bdSdrh   jsonInit(&s, pCtx);
490*9dbf96bdSdrh   jsonRenderNode(pNode, &s, aReplace);
491*9dbf96bdSdrh   jsonResult(&s);
492*9dbf96bdSdrh   sqlite3_result_subtype(pCtx, JSON_SUBTYPE);
493*9dbf96bdSdrh }
494*9dbf96bdSdrh 
495*9dbf96bdSdrh /*
496*9dbf96bdSdrh ** Translate a single byte of Hex into an integer.
497*9dbf96bdSdrh ** This routine only works if h really is a valid hexadecimal
498*9dbf96bdSdrh ** character:  0..9a..fA..F
499*9dbf96bdSdrh */
500*9dbf96bdSdrh static u8 jsonHexToInt(int h){
501*9dbf96bdSdrh   assert( (h>='0' && h<='9') ||  (h>='a' && h<='f') ||  (h>='A' && h<='F') );
502*9dbf96bdSdrh #ifdef SQLITE_EBCDIC
503*9dbf96bdSdrh   h += 9*(1&~(h>>4));
504*9dbf96bdSdrh #else
505*9dbf96bdSdrh   h += 9*(1&(h>>6));
506*9dbf96bdSdrh #endif
507*9dbf96bdSdrh   return (u8)(h & 0xf);
508*9dbf96bdSdrh }
509*9dbf96bdSdrh 
510*9dbf96bdSdrh /*
511*9dbf96bdSdrh ** Convert a 4-byte hex string into an integer
512*9dbf96bdSdrh */
513*9dbf96bdSdrh static u32 jsonHexToInt4(const char *z){
514*9dbf96bdSdrh   u32 v;
515*9dbf96bdSdrh   assert( sqlite3Isxdigit(z[0]) );
516*9dbf96bdSdrh   assert( sqlite3Isxdigit(z[1]) );
517*9dbf96bdSdrh   assert( sqlite3Isxdigit(z[2]) );
518*9dbf96bdSdrh   assert( sqlite3Isxdigit(z[3]) );
519*9dbf96bdSdrh   v = (jsonHexToInt(z[0])<<12)
520*9dbf96bdSdrh     + (jsonHexToInt(z[1])<<8)
521*9dbf96bdSdrh     + (jsonHexToInt(z[2])<<4)
522*9dbf96bdSdrh     + jsonHexToInt(z[3]);
523*9dbf96bdSdrh   return v;
524*9dbf96bdSdrh }
525*9dbf96bdSdrh 
526*9dbf96bdSdrh /*
527*9dbf96bdSdrh ** Make the JsonNode the return value of the function.
528*9dbf96bdSdrh */
529*9dbf96bdSdrh static void jsonReturn(
530*9dbf96bdSdrh   JsonNode *pNode,            /* Node to return */
531*9dbf96bdSdrh   sqlite3_context *pCtx,      /* Return value for this function */
532*9dbf96bdSdrh   sqlite3_value **aReplace    /* Array of replacement values */
533*9dbf96bdSdrh ){
534*9dbf96bdSdrh   switch( pNode->eType ){
535*9dbf96bdSdrh     default: {
536*9dbf96bdSdrh       assert( pNode->eType==JSON_NULL );
537*9dbf96bdSdrh       sqlite3_result_null(pCtx);
538*9dbf96bdSdrh       break;
539*9dbf96bdSdrh     }
540*9dbf96bdSdrh     case JSON_TRUE: {
541*9dbf96bdSdrh       sqlite3_result_int(pCtx, 1);
542*9dbf96bdSdrh       break;
543*9dbf96bdSdrh     }
544*9dbf96bdSdrh     case JSON_FALSE: {
545*9dbf96bdSdrh       sqlite3_result_int(pCtx, 0);
546*9dbf96bdSdrh       break;
547*9dbf96bdSdrh     }
548*9dbf96bdSdrh     case JSON_INT: {
549*9dbf96bdSdrh       sqlite3_int64 i = 0;
550*9dbf96bdSdrh       const char *z;
551*9dbf96bdSdrh       assert( pNode->eU==1 );
552*9dbf96bdSdrh       z = pNode->u.zJContent;
553*9dbf96bdSdrh       if( z[0]=='-' ){ z++; }
554*9dbf96bdSdrh       while( z[0]>='0' && z[0]<='9' ){
555*9dbf96bdSdrh         unsigned v = *(z++) - '0';
556*9dbf96bdSdrh         if( i>=LARGEST_INT64/10 ){
557*9dbf96bdSdrh           if( i>LARGEST_INT64/10 ) goto int_as_real;
558*9dbf96bdSdrh           if( z[0]>='0' && z[0]<='9' ) goto int_as_real;
559*9dbf96bdSdrh           if( v==9 ) goto int_as_real;
560*9dbf96bdSdrh           if( v==8 ){
561*9dbf96bdSdrh             if( pNode->u.zJContent[0]=='-' ){
562*9dbf96bdSdrh               sqlite3_result_int64(pCtx, SMALLEST_INT64);
563*9dbf96bdSdrh               goto int_done;
564*9dbf96bdSdrh             }else{
565*9dbf96bdSdrh               goto int_as_real;
566*9dbf96bdSdrh             }
567*9dbf96bdSdrh           }
568*9dbf96bdSdrh         }
569*9dbf96bdSdrh         i = i*10 + v;
570*9dbf96bdSdrh       }
571*9dbf96bdSdrh       if( pNode->u.zJContent[0]=='-' ){ i = -i; }
572*9dbf96bdSdrh       sqlite3_result_int64(pCtx, i);
573*9dbf96bdSdrh       int_done:
574*9dbf96bdSdrh       break;
575*9dbf96bdSdrh       int_as_real: ; /* no break */ deliberate_fall_through
576*9dbf96bdSdrh     }
577*9dbf96bdSdrh     case JSON_REAL: {
578*9dbf96bdSdrh       double r;
579*9dbf96bdSdrh #ifdef SQLITE_AMALGAMATION
580*9dbf96bdSdrh       const char *z;
581*9dbf96bdSdrh       assert( pNode->eU==1 );
582*9dbf96bdSdrh       z = pNode->u.zJContent;
583*9dbf96bdSdrh       sqlite3AtoF(z, &r, sqlite3Strlen30(z), SQLITE_UTF8);
584*9dbf96bdSdrh #else
585*9dbf96bdSdrh       assert( pNode->eU==1 );
586*9dbf96bdSdrh       r = strtod(pNode->u.zJContent, 0);
587*9dbf96bdSdrh #endif
588*9dbf96bdSdrh       sqlite3_result_double(pCtx, r);
589*9dbf96bdSdrh       break;
590*9dbf96bdSdrh     }
591*9dbf96bdSdrh     case JSON_STRING: {
592*9dbf96bdSdrh #if 0 /* Never happens because JNODE_RAW is only set by json_set(),
593*9dbf96bdSdrh       ** json_insert() and json_replace() and those routines do not
594*9dbf96bdSdrh       ** call jsonReturn() */
595*9dbf96bdSdrh       if( pNode->jnFlags & JNODE_RAW ){
596*9dbf96bdSdrh         assert( pNode->eU==1 );
597*9dbf96bdSdrh         sqlite3_result_text(pCtx, pNode->u.zJContent, pNode->n,
598*9dbf96bdSdrh                             SQLITE_TRANSIENT);
599*9dbf96bdSdrh       }else
600*9dbf96bdSdrh #endif
601*9dbf96bdSdrh       assert( (pNode->jnFlags & JNODE_RAW)==0 );
602*9dbf96bdSdrh       if( (pNode->jnFlags & JNODE_ESCAPE)==0 ){
603*9dbf96bdSdrh         /* JSON formatted without any backslash-escapes */
604*9dbf96bdSdrh         assert( pNode->eU==1 );
605*9dbf96bdSdrh         sqlite3_result_text(pCtx, pNode->u.zJContent+1, pNode->n-2,
606*9dbf96bdSdrh                             SQLITE_TRANSIENT);
607*9dbf96bdSdrh       }else{
608*9dbf96bdSdrh         /* Translate JSON formatted string into raw text */
609*9dbf96bdSdrh         u32 i;
610*9dbf96bdSdrh         u32 n = pNode->n;
611*9dbf96bdSdrh         const char *z;
612*9dbf96bdSdrh         char *zOut;
613*9dbf96bdSdrh         u32 j;
614*9dbf96bdSdrh         assert( pNode->eU==1 );
615*9dbf96bdSdrh         z = pNode->u.zJContent;
616*9dbf96bdSdrh         zOut = sqlite3_malloc( n+1 );
617*9dbf96bdSdrh         if( zOut==0 ){
618*9dbf96bdSdrh           sqlite3_result_error_nomem(pCtx);
619*9dbf96bdSdrh           break;
620*9dbf96bdSdrh         }
621*9dbf96bdSdrh         for(i=1, j=0; i<n-1; i++){
622*9dbf96bdSdrh           char c = z[i];
623*9dbf96bdSdrh           if( c!='\\' ){
624*9dbf96bdSdrh             zOut[j++] = c;
625*9dbf96bdSdrh           }else{
626*9dbf96bdSdrh             c = z[++i];
627*9dbf96bdSdrh             if( c=='u' ){
628*9dbf96bdSdrh               u32 v = jsonHexToInt4(z+i+1);
629*9dbf96bdSdrh               i += 4;
630*9dbf96bdSdrh               if( v==0 ) break;
631*9dbf96bdSdrh               if( v<=0x7f ){
632*9dbf96bdSdrh                 zOut[j++] = (char)v;
633*9dbf96bdSdrh               }else if( v<=0x7ff ){
634*9dbf96bdSdrh                 zOut[j++] = (char)(0xc0 | (v>>6));
635*9dbf96bdSdrh                 zOut[j++] = 0x80 | (v&0x3f);
636*9dbf96bdSdrh               }else{
637*9dbf96bdSdrh                 u32 vlo;
638*9dbf96bdSdrh                 if( (v&0xfc00)==0xd800
639*9dbf96bdSdrh                   && i<n-6
640*9dbf96bdSdrh                   && z[i+1]=='\\'
641*9dbf96bdSdrh                   && z[i+2]=='u'
642*9dbf96bdSdrh                   && ((vlo = jsonHexToInt4(z+i+3))&0xfc00)==0xdc00
643*9dbf96bdSdrh                 ){
644*9dbf96bdSdrh                   /* We have a surrogate pair */
645*9dbf96bdSdrh                   v = ((v&0x3ff)<<10) + (vlo&0x3ff) + 0x10000;
646*9dbf96bdSdrh                   i += 6;
647*9dbf96bdSdrh                   zOut[j++] = 0xf0 | (v>>18);
648*9dbf96bdSdrh                   zOut[j++] = 0x80 | ((v>>12)&0x3f);
649*9dbf96bdSdrh                   zOut[j++] = 0x80 | ((v>>6)&0x3f);
650*9dbf96bdSdrh                   zOut[j++] = 0x80 | (v&0x3f);
651*9dbf96bdSdrh                 }else{
652*9dbf96bdSdrh                   zOut[j++] = 0xe0 | (v>>12);
653*9dbf96bdSdrh                   zOut[j++] = 0x80 | ((v>>6)&0x3f);
654*9dbf96bdSdrh                   zOut[j++] = 0x80 | (v&0x3f);
655*9dbf96bdSdrh                 }
656*9dbf96bdSdrh               }
657*9dbf96bdSdrh             }else{
658*9dbf96bdSdrh               if( c=='b' ){
659*9dbf96bdSdrh                 c = '\b';
660*9dbf96bdSdrh               }else if( c=='f' ){
661*9dbf96bdSdrh                 c = '\f';
662*9dbf96bdSdrh               }else if( c=='n' ){
663*9dbf96bdSdrh                 c = '\n';
664*9dbf96bdSdrh               }else if( c=='r' ){
665*9dbf96bdSdrh                 c = '\r';
666*9dbf96bdSdrh               }else if( c=='t' ){
667*9dbf96bdSdrh                 c = '\t';
668*9dbf96bdSdrh               }
669*9dbf96bdSdrh               zOut[j++] = c;
670*9dbf96bdSdrh             }
671*9dbf96bdSdrh           }
672*9dbf96bdSdrh         }
673*9dbf96bdSdrh         zOut[j] = 0;
674*9dbf96bdSdrh         sqlite3_result_text(pCtx, zOut, j, sqlite3_free);
675*9dbf96bdSdrh       }
676*9dbf96bdSdrh       break;
677*9dbf96bdSdrh     }
678*9dbf96bdSdrh     case JSON_ARRAY:
679*9dbf96bdSdrh     case JSON_OBJECT: {
680*9dbf96bdSdrh       jsonReturnJson(pNode, pCtx, aReplace);
681*9dbf96bdSdrh       break;
682*9dbf96bdSdrh     }
683*9dbf96bdSdrh   }
684*9dbf96bdSdrh }
685*9dbf96bdSdrh 
686*9dbf96bdSdrh /* Forward reference */
687*9dbf96bdSdrh static int jsonParseAddNode(JsonParse*,u32,u32,const char*);
688*9dbf96bdSdrh 
689*9dbf96bdSdrh /*
690*9dbf96bdSdrh ** A macro to hint to the compiler that a function should not be
691*9dbf96bdSdrh ** inlined.
692*9dbf96bdSdrh */
693*9dbf96bdSdrh #if defined(__GNUC__)
694*9dbf96bdSdrh #  define JSON_NOINLINE  __attribute__((noinline))
695*9dbf96bdSdrh #elif defined(_MSC_VER) && _MSC_VER>=1310
696*9dbf96bdSdrh #  define JSON_NOINLINE  __declspec(noinline)
697*9dbf96bdSdrh #else
698*9dbf96bdSdrh #  define JSON_NOINLINE
699*9dbf96bdSdrh #endif
700*9dbf96bdSdrh 
701*9dbf96bdSdrh 
702*9dbf96bdSdrh static JSON_NOINLINE int jsonParseAddNodeExpand(
703*9dbf96bdSdrh   JsonParse *pParse,        /* Append the node to this object */
704*9dbf96bdSdrh   u32 eType,                /* Node type */
705*9dbf96bdSdrh   u32 n,                    /* Content size or sub-node count */
706*9dbf96bdSdrh   const char *zContent      /* Content */
707*9dbf96bdSdrh ){
708*9dbf96bdSdrh   u32 nNew;
709*9dbf96bdSdrh   JsonNode *pNew;
710*9dbf96bdSdrh   assert( pParse->nNode>=pParse->nAlloc );
711*9dbf96bdSdrh   if( pParse->oom ) return -1;
712*9dbf96bdSdrh   nNew = pParse->nAlloc*2 + 10;
713*9dbf96bdSdrh   pNew = sqlite3_realloc64(pParse->aNode, sizeof(JsonNode)*nNew);
714*9dbf96bdSdrh   if( pNew==0 ){
715*9dbf96bdSdrh     pParse->oom = 1;
716*9dbf96bdSdrh     return -1;
717*9dbf96bdSdrh   }
718*9dbf96bdSdrh   pParse->nAlloc = nNew;
719*9dbf96bdSdrh   pParse->aNode = pNew;
720*9dbf96bdSdrh   assert( pParse->nNode<pParse->nAlloc );
721*9dbf96bdSdrh   return jsonParseAddNode(pParse, eType, n, zContent);
722*9dbf96bdSdrh }
723*9dbf96bdSdrh 
724*9dbf96bdSdrh /*
725*9dbf96bdSdrh ** Create a new JsonNode instance based on the arguments and append that
726*9dbf96bdSdrh ** instance to the JsonParse.  Return the index in pParse->aNode[] of the
727*9dbf96bdSdrh ** new node, or -1 if a memory allocation fails.
728*9dbf96bdSdrh */
729*9dbf96bdSdrh static int jsonParseAddNode(
730*9dbf96bdSdrh   JsonParse *pParse,        /* Append the node to this object */
731*9dbf96bdSdrh   u32 eType,                /* Node type */
732*9dbf96bdSdrh   u32 n,                    /* Content size or sub-node count */
733*9dbf96bdSdrh   const char *zContent      /* Content */
734*9dbf96bdSdrh ){
735*9dbf96bdSdrh   JsonNode *p;
736*9dbf96bdSdrh   if( pParse->aNode==0 || pParse->nNode>=pParse->nAlloc ){
737*9dbf96bdSdrh     return jsonParseAddNodeExpand(pParse, eType, n, zContent);
738*9dbf96bdSdrh   }
739*9dbf96bdSdrh   p = &pParse->aNode[pParse->nNode];
740*9dbf96bdSdrh   p->eType = (u8)eType;
741*9dbf96bdSdrh   p->jnFlags = 0;
742*9dbf96bdSdrh   VVA( p->eU = zContent ? 1 : 0 );
743*9dbf96bdSdrh   p->n = n;
744*9dbf96bdSdrh   p->u.zJContent = zContent;
745*9dbf96bdSdrh   return pParse->nNode++;
746*9dbf96bdSdrh }
747*9dbf96bdSdrh 
748*9dbf96bdSdrh /*
749*9dbf96bdSdrh ** Return true if z[] begins with 4 (or more) hexadecimal digits
750*9dbf96bdSdrh */
751*9dbf96bdSdrh static int jsonIs4Hex(const char *z){
752*9dbf96bdSdrh   int i;
753*9dbf96bdSdrh   for(i=0; i<4; i++) if( !sqlite3Isxdigit(z[i]) ) return 0;
754*9dbf96bdSdrh   return 1;
755*9dbf96bdSdrh }
756*9dbf96bdSdrh 
757*9dbf96bdSdrh /*
758*9dbf96bdSdrh ** Parse a single JSON value which begins at pParse->zJson[i].  Return the
759*9dbf96bdSdrh ** index of the first character past the end of the value parsed.
760*9dbf96bdSdrh **
761*9dbf96bdSdrh ** Return negative for a syntax error.  Special cases:  return -2 if the
762*9dbf96bdSdrh ** first non-whitespace character is '}' and return -3 if the first
763*9dbf96bdSdrh ** non-whitespace character is ']'.
764*9dbf96bdSdrh */
765*9dbf96bdSdrh static int jsonParseValue(JsonParse *pParse, u32 i){
766*9dbf96bdSdrh   char c;
767*9dbf96bdSdrh   u32 j;
768*9dbf96bdSdrh   int iThis;
769*9dbf96bdSdrh   int x;
770*9dbf96bdSdrh   JsonNode *pNode;
771*9dbf96bdSdrh   const char *z = pParse->zJson;
772*9dbf96bdSdrh   while( fast_isspace(z[i]) ){ i++; }
773*9dbf96bdSdrh   if( (c = z[i])=='{' ){
774*9dbf96bdSdrh     /* Parse object */
775*9dbf96bdSdrh     iThis = jsonParseAddNode(pParse, JSON_OBJECT, 0, 0);
776*9dbf96bdSdrh     if( iThis<0 ) return -1;
777*9dbf96bdSdrh     for(j=i+1;;j++){
778*9dbf96bdSdrh       while( fast_isspace(z[j]) ){ j++; }
779*9dbf96bdSdrh       if( ++pParse->iDepth > JSON_MAX_DEPTH ) return -1;
780*9dbf96bdSdrh       x = jsonParseValue(pParse, j);
781*9dbf96bdSdrh       if( x<0 ){
782*9dbf96bdSdrh         pParse->iDepth--;
783*9dbf96bdSdrh         if( x==(-2) && pParse->nNode==(u32)iThis+1 ) return j+1;
784*9dbf96bdSdrh         return -1;
785*9dbf96bdSdrh       }
786*9dbf96bdSdrh       if( pParse->oom ) return -1;
787*9dbf96bdSdrh       pNode = &pParse->aNode[pParse->nNode-1];
788*9dbf96bdSdrh       if( pNode->eType!=JSON_STRING ) return -1;
789*9dbf96bdSdrh       pNode->jnFlags |= JNODE_LABEL;
790*9dbf96bdSdrh       j = x;
791*9dbf96bdSdrh       while( fast_isspace(z[j]) ){ j++; }
792*9dbf96bdSdrh       if( z[j]!=':' ) return -1;
793*9dbf96bdSdrh       j++;
794*9dbf96bdSdrh       x = jsonParseValue(pParse, j);
795*9dbf96bdSdrh       pParse->iDepth--;
796*9dbf96bdSdrh       if( x<0 ) return -1;
797*9dbf96bdSdrh       j = x;
798*9dbf96bdSdrh       while( fast_isspace(z[j]) ){ j++; }
799*9dbf96bdSdrh       c = z[j];
800*9dbf96bdSdrh       if( c==',' ) continue;
801*9dbf96bdSdrh       if( c!='}' ) return -1;
802*9dbf96bdSdrh       break;
803*9dbf96bdSdrh     }
804*9dbf96bdSdrh     pParse->aNode[iThis].n = pParse->nNode - (u32)iThis - 1;
805*9dbf96bdSdrh     return j+1;
806*9dbf96bdSdrh   }else if( c=='[' ){
807*9dbf96bdSdrh     /* Parse array */
808*9dbf96bdSdrh     iThis = jsonParseAddNode(pParse, JSON_ARRAY, 0, 0);
809*9dbf96bdSdrh     if( iThis<0 ) return -1;
810*9dbf96bdSdrh     memset(&pParse->aNode[iThis].u, 0, sizeof(pParse->aNode[iThis].u));
811*9dbf96bdSdrh     for(j=i+1;;j++){
812*9dbf96bdSdrh       while( fast_isspace(z[j]) ){ j++; }
813*9dbf96bdSdrh       if( ++pParse->iDepth > JSON_MAX_DEPTH ) return -1;
814*9dbf96bdSdrh       x = jsonParseValue(pParse, j);
815*9dbf96bdSdrh       pParse->iDepth--;
816*9dbf96bdSdrh       if( x<0 ){
817*9dbf96bdSdrh         if( x==(-3) && pParse->nNode==(u32)iThis+1 ) return j+1;
818*9dbf96bdSdrh         return -1;
819*9dbf96bdSdrh       }
820*9dbf96bdSdrh       j = x;
821*9dbf96bdSdrh       while( fast_isspace(z[j]) ){ j++; }
822*9dbf96bdSdrh       c = z[j];
823*9dbf96bdSdrh       if( c==',' ) continue;
824*9dbf96bdSdrh       if( c!=']' ) return -1;
825*9dbf96bdSdrh       break;
826*9dbf96bdSdrh     }
827*9dbf96bdSdrh     pParse->aNode[iThis].n = pParse->nNode - (u32)iThis - 1;
828*9dbf96bdSdrh     return j+1;
829*9dbf96bdSdrh   }else if( c=='"' ){
830*9dbf96bdSdrh     /* Parse string */
831*9dbf96bdSdrh     u8 jnFlags = 0;
832*9dbf96bdSdrh     j = i+1;
833*9dbf96bdSdrh     for(;;){
834*9dbf96bdSdrh       c = z[j];
835*9dbf96bdSdrh       if( (c & ~0x1f)==0 ){
836*9dbf96bdSdrh         /* Control characters are not allowed in strings */
837*9dbf96bdSdrh         return -1;
838*9dbf96bdSdrh       }
839*9dbf96bdSdrh       if( c=='\\' ){
840*9dbf96bdSdrh         c = z[++j];
841*9dbf96bdSdrh         if( c=='"' || c=='\\' || c=='/' || c=='b' || c=='f'
842*9dbf96bdSdrh            || c=='n' || c=='r' || c=='t'
843*9dbf96bdSdrh            || (c=='u' && jsonIs4Hex(z+j+1)) ){
844*9dbf96bdSdrh           jnFlags = JNODE_ESCAPE;
845*9dbf96bdSdrh         }else{
846*9dbf96bdSdrh           return -1;
847*9dbf96bdSdrh         }
848*9dbf96bdSdrh       }else if( c=='"' ){
849*9dbf96bdSdrh         break;
850*9dbf96bdSdrh       }
851*9dbf96bdSdrh       j++;
852*9dbf96bdSdrh     }
853*9dbf96bdSdrh     jsonParseAddNode(pParse, JSON_STRING, j+1-i, &z[i]);
854*9dbf96bdSdrh     if( !pParse->oom ) pParse->aNode[pParse->nNode-1].jnFlags = jnFlags;
855*9dbf96bdSdrh     return j+1;
856*9dbf96bdSdrh   }else if( c=='n'
857*9dbf96bdSdrh          && strncmp(z+i,"null",4)==0
858*9dbf96bdSdrh          && !sqlite3Isalnum(z[i+4]) ){
859*9dbf96bdSdrh     jsonParseAddNode(pParse, JSON_NULL, 0, 0);
860*9dbf96bdSdrh     return i+4;
861*9dbf96bdSdrh   }else if( c=='t'
862*9dbf96bdSdrh          && strncmp(z+i,"true",4)==0
863*9dbf96bdSdrh          && !sqlite3Isalnum(z[i+4]) ){
864*9dbf96bdSdrh     jsonParseAddNode(pParse, JSON_TRUE, 0, 0);
865*9dbf96bdSdrh     return i+4;
866*9dbf96bdSdrh   }else if( c=='f'
867*9dbf96bdSdrh          && strncmp(z+i,"false",5)==0
868*9dbf96bdSdrh          && !sqlite3Isalnum(z[i+5]) ){
869*9dbf96bdSdrh     jsonParseAddNode(pParse, JSON_FALSE, 0, 0);
870*9dbf96bdSdrh     return i+5;
871*9dbf96bdSdrh   }else if( c=='-' || (c>='0' && c<='9') ){
872*9dbf96bdSdrh     /* Parse number */
873*9dbf96bdSdrh     u8 seenDP = 0;
874*9dbf96bdSdrh     u8 seenE = 0;
875*9dbf96bdSdrh     assert( '-' < '0' );
876*9dbf96bdSdrh     if( c<='0' ){
877*9dbf96bdSdrh       j = c=='-' ? i+1 : i;
878*9dbf96bdSdrh       if( z[j]=='0' && z[j+1]>='0' && z[j+1]<='9' ) return -1;
879*9dbf96bdSdrh     }
880*9dbf96bdSdrh     j = i+1;
881*9dbf96bdSdrh     for(;; j++){
882*9dbf96bdSdrh       c = z[j];
883*9dbf96bdSdrh       if( c>='0' && c<='9' ) continue;
884*9dbf96bdSdrh       if( c=='.' ){
885*9dbf96bdSdrh         if( z[j-1]=='-' ) return -1;
886*9dbf96bdSdrh         if( seenDP ) return -1;
887*9dbf96bdSdrh         seenDP = 1;
888*9dbf96bdSdrh         continue;
889*9dbf96bdSdrh       }
890*9dbf96bdSdrh       if( c=='e' || c=='E' ){
891*9dbf96bdSdrh         if( z[j-1]<'0' ) return -1;
892*9dbf96bdSdrh         if( seenE ) return -1;
893*9dbf96bdSdrh         seenDP = seenE = 1;
894*9dbf96bdSdrh         c = z[j+1];
895*9dbf96bdSdrh         if( c=='+' || c=='-' ){
896*9dbf96bdSdrh           j++;
897*9dbf96bdSdrh           c = z[j+1];
898*9dbf96bdSdrh         }
899*9dbf96bdSdrh         if( c<'0' || c>'9' ) return -1;
900*9dbf96bdSdrh         continue;
901*9dbf96bdSdrh       }
902*9dbf96bdSdrh       break;
903*9dbf96bdSdrh     }
904*9dbf96bdSdrh     if( z[j-1]<'0' ) return -1;
905*9dbf96bdSdrh     jsonParseAddNode(pParse, seenDP ? JSON_REAL : JSON_INT,
906*9dbf96bdSdrh                         j - i, &z[i]);
907*9dbf96bdSdrh     return j;
908*9dbf96bdSdrh   }else if( c=='}' ){
909*9dbf96bdSdrh     return -2;  /* End of {...} */
910*9dbf96bdSdrh   }else if( c==']' ){
911*9dbf96bdSdrh     return -3;  /* End of [...] */
912*9dbf96bdSdrh   }else if( c==0 ){
913*9dbf96bdSdrh     return 0;   /* End of file */
914*9dbf96bdSdrh   }else{
915*9dbf96bdSdrh     return -1;  /* Syntax error */
916*9dbf96bdSdrh   }
917*9dbf96bdSdrh }
918*9dbf96bdSdrh 
919*9dbf96bdSdrh /*
920*9dbf96bdSdrh ** Parse a complete JSON string.  Return 0 on success or non-zero if there
921*9dbf96bdSdrh ** are any errors.  If an error occurs, free all memory associated with
922*9dbf96bdSdrh ** pParse.
923*9dbf96bdSdrh **
924*9dbf96bdSdrh ** pParse is uninitialized when this routine is called.
925*9dbf96bdSdrh */
926*9dbf96bdSdrh static int jsonParse(
927*9dbf96bdSdrh   JsonParse *pParse,           /* Initialize and fill this JsonParse object */
928*9dbf96bdSdrh   sqlite3_context *pCtx,       /* Report errors here */
929*9dbf96bdSdrh   const char *zJson            /* Input JSON text to be parsed */
930*9dbf96bdSdrh ){
931*9dbf96bdSdrh   int i;
932*9dbf96bdSdrh   memset(pParse, 0, sizeof(*pParse));
933*9dbf96bdSdrh   if( zJson==0 ) return 1;
934*9dbf96bdSdrh   pParse->zJson = zJson;
935*9dbf96bdSdrh   i = jsonParseValue(pParse, 0);
936*9dbf96bdSdrh   if( pParse->oom ) i = -1;
937*9dbf96bdSdrh   if( i>0 ){
938*9dbf96bdSdrh     assert( pParse->iDepth==0 );
939*9dbf96bdSdrh     while( fast_isspace(zJson[i]) ) i++;
940*9dbf96bdSdrh     if( zJson[i] ) i = -1;
941*9dbf96bdSdrh   }
942*9dbf96bdSdrh   if( i<=0 ){
943*9dbf96bdSdrh     if( pCtx!=0 ){
944*9dbf96bdSdrh       if( pParse->oom ){
945*9dbf96bdSdrh         sqlite3_result_error_nomem(pCtx);
946*9dbf96bdSdrh       }else{
947*9dbf96bdSdrh         sqlite3_result_error(pCtx, "malformed JSON", -1);
948*9dbf96bdSdrh       }
949*9dbf96bdSdrh     }
950*9dbf96bdSdrh     jsonParseReset(pParse);
951*9dbf96bdSdrh     return 1;
952*9dbf96bdSdrh   }
953*9dbf96bdSdrh   return 0;
954*9dbf96bdSdrh }
955*9dbf96bdSdrh 
956*9dbf96bdSdrh /* Mark node i of pParse as being a child of iParent.  Call recursively
957*9dbf96bdSdrh ** to fill in all the descendants of node i.
958*9dbf96bdSdrh */
959*9dbf96bdSdrh static void jsonParseFillInParentage(JsonParse *pParse, u32 i, u32 iParent){
960*9dbf96bdSdrh   JsonNode *pNode = &pParse->aNode[i];
961*9dbf96bdSdrh   u32 j;
962*9dbf96bdSdrh   pParse->aUp[i] = iParent;
963*9dbf96bdSdrh   switch( pNode->eType ){
964*9dbf96bdSdrh     case JSON_ARRAY: {
965*9dbf96bdSdrh       for(j=1; j<=pNode->n; j += jsonNodeSize(pNode+j)){
966*9dbf96bdSdrh         jsonParseFillInParentage(pParse, i+j, i);
967*9dbf96bdSdrh       }
968*9dbf96bdSdrh       break;
969*9dbf96bdSdrh     }
970*9dbf96bdSdrh     case JSON_OBJECT: {
971*9dbf96bdSdrh       for(j=1; j<=pNode->n; j += jsonNodeSize(pNode+j+1)+1){
972*9dbf96bdSdrh         pParse->aUp[i+j] = i;
973*9dbf96bdSdrh         jsonParseFillInParentage(pParse, i+j+1, i);
974*9dbf96bdSdrh       }
975*9dbf96bdSdrh       break;
976*9dbf96bdSdrh     }
977*9dbf96bdSdrh     default: {
978*9dbf96bdSdrh       break;
979*9dbf96bdSdrh     }
980*9dbf96bdSdrh   }
981*9dbf96bdSdrh }
982*9dbf96bdSdrh 
983*9dbf96bdSdrh /*
984*9dbf96bdSdrh ** Compute the parentage of all nodes in a completed parse.
985*9dbf96bdSdrh */
986*9dbf96bdSdrh static int jsonParseFindParents(JsonParse *pParse){
987*9dbf96bdSdrh   u32 *aUp;
988*9dbf96bdSdrh   assert( pParse->aUp==0 );
989*9dbf96bdSdrh   aUp = pParse->aUp = sqlite3_malloc64( sizeof(u32)*pParse->nNode );
990*9dbf96bdSdrh   if( aUp==0 ){
991*9dbf96bdSdrh     pParse->oom = 1;
992*9dbf96bdSdrh     return SQLITE_NOMEM;
993*9dbf96bdSdrh   }
994*9dbf96bdSdrh   jsonParseFillInParentage(pParse, 0, 0);
995*9dbf96bdSdrh   return SQLITE_OK;
996*9dbf96bdSdrh }
997*9dbf96bdSdrh 
998*9dbf96bdSdrh /*
999*9dbf96bdSdrh ** Magic number used for the JSON parse cache in sqlite3_get_auxdata()
1000*9dbf96bdSdrh */
1001*9dbf96bdSdrh #define JSON_CACHE_ID  (-429938)  /* First cache entry */
1002*9dbf96bdSdrh #define JSON_CACHE_SZ  4          /* Max number of cache entries */
1003*9dbf96bdSdrh 
1004*9dbf96bdSdrh /*
1005*9dbf96bdSdrh ** Obtain a complete parse of the JSON found in the first argument
1006*9dbf96bdSdrh ** of the argv array.  Use the sqlite3_get_auxdata() cache for this
1007*9dbf96bdSdrh ** parse if it is available.  If the cache is not available or if it
1008*9dbf96bdSdrh ** is no longer valid, parse the JSON again and return the new parse,
1009*9dbf96bdSdrh ** and also register the new parse so that it will be available for
1010*9dbf96bdSdrh ** future sqlite3_get_auxdata() calls.
1011*9dbf96bdSdrh */
1012*9dbf96bdSdrh static JsonParse *jsonParseCached(
1013*9dbf96bdSdrh   sqlite3_context *pCtx,
1014*9dbf96bdSdrh   sqlite3_value **argv,
1015*9dbf96bdSdrh   sqlite3_context *pErrCtx
1016*9dbf96bdSdrh ){
1017*9dbf96bdSdrh   const char *zJson = (const char*)sqlite3_value_text(argv[0]);
1018*9dbf96bdSdrh   int nJson = sqlite3_value_bytes(argv[0]);
1019*9dbf96bdSdrh   JsonParse *p;
1020*9dbf96bdSdrh   JsonParse *pMatch = 0;
1021*9dbf96bdSdrh   int iKey;
1022*9dbf96bdSdrh   int iMinKey = 0;
1023*9dbf96bdSdrh   u32 iMinHold = 0xffffffff;
1024*9dbf96bdSdrh   u32 iMaxHold = 0;
1025*9dbf96bdSdrh   if( zJson==0 ) return 0;
1026*9dbf96bdSdrh   for(iKey=0; iKey<JSON_CACHE_SZ; iKey++){
1027*9dbf96bdSdrh     p = (JsonParse*)sqlite3_get_auxdata(pCtx, JSON_CACHE_ID+iKey);
1028*9dbf96bdSdrh     if( p==0 ){
1029*9dbf96bdSdrh       iMinKey = iKey;
1030*9dbf96bdSdrh       break;
1031*9dbf96bdSdrh     }
1032*9dbf96bdSdrh     if( pMatch==0
1033*9dbf96bdSdrh      && p->nJson==nJson
1034*9dbf96bdSdrh      && memcmp(p->zJson,zJson,nJson)==0
1035*9dbf96bdSdrh     ){
1036*9dbf96bdSdrh       p->nErr = 0;
1037*9dbf96bdSdrh       pMatch = p;
1038*9dbf96bdSdrh     }else if( p->iHold<iMinHold ){
1039*9dbf96bdSdrh       iMinHold = p->iHold;
1040*9dbf96bdSdrh       iMinKey = iKey;
1041*9dbf96bdSdrh     }
1042*9dbf96bdSdrh     if( p->iHold>iMaxHold ){
1043*9dbf96bdSdrh       iMaxHold = p->iHold;
1044*9dbf96bdSdrh     }
1045*9dbf96bdSdrh   }
1046*9dbf96bdSdrh   if( pMatch ){
1047*9dbf96bdSdrh     pMatch->nErr = 0;
1048*9dbf96bdSdrh     pMatch->iHold = iMaxHold+1;
1049*9dbf96bdSdrh     return pMatch;
1050*9dbf96bdSdrh   }
1051*9dbf96bdSdrh   p = sqlite3_malloc64( sizeof(*p) + nJson + 1 );
1052*9dbf96bdSdrh   if( p==0 ){
1053*9dbf96bdSdrh     sqlite3_result_error_nomem(pCtx);
1054*9dbf96bdSdrh     return 0;
1055*9dbf96bdSdrh   }
1056*9dbf96bdSdrh   memset(p, 0, sizeof(*p));
1057*9dbf96bdSdrh   p->zJson = (char*)&p[1];
1058*9dbf96bdSdrh   memcpy((char*)p->zJson, zJson, nJson+1);
1059*9dbf96bdSdrh   if( jsonParse(p, pErrCtx, p->zJson) ){
1060*9dbf96bdSdrh     sqlite3_free(p);
1061*9dbf96bdSdrh     return 0;
1062*9dbf96bdSdrh   }
1063*9dbf96bdSdrh   p->nJson = nJson;
1064*9dbf96bdSdrh   p->iHold = iMaxHold+1;
1065*9dbf96bdSdrh   sqlite3_set_auxdata(pCtx, JSON_CACHE_ID+iMinKey, p,
1066*9dbf96bdSdrh                       (void(*)(void*))jsonParseFree);
1067*9dbf96bdSdrh   return (JsonParse*)sqlite3_get_auxdata(pCtx, JSON_CACHE_ID+iMinKey);
1068*9dbf96bdSdrh }
1069*9dbf96bdSdrh 
1070*9dbf96bdSdrh /*
1071*9dbf96bdSdrh ** Compare the OBJECT label at pNode against zKey,nKey.  Return true on
1072*9dbf96bdSdrh ** a match.
1073*9dbf96bdSdrh */
1074*9dbf96bdSdrh static int jsonLabelCompare(JsonNode *pNode, const char *zKey, u32 nKey){
1075*9dbf96bdSdrh   assert( pNode->eU==1 );
1076*9dbf96bdSdrh   if( pNode->jnFlags & JNODE_RAW ){
1077*9dbf96bdSdrh     if( pNode->n!=nKey ) return 0;
1078*9dbf96bdSdrh     return strncmp(pNode->u.zJContent, zKey, nKey)==0;
1079*9dbf96bdSdrh   }else{
1080*9dbf96bdSdrh     if( pNode->n!=nKey+2 ) return 0;
1081*9dbf96bdSdrh     return strncmp(pNode->u.zJContent+1, zKey, nKey)==0;
1082*9dbf96bdSdrh   }
1083*9dbf96bdSdrh }
1084*9dbf96bdSdrh 
1085*9dbf96bdSdrh /* forward declaration */
1086*9dbf96bdSdrh static JsonNode *jsonLookupAppend(JsonParse*,const char*,int*,const char**);
1087*9dbf96bdSdrh 
1088*9dbf96bdSdrh /*
1089*9dbf96bdSdrh ** Search along zPath to find the node specified.  Return a pointer
1090*9dbf96bdSdrh ** to that node, or NULL if zPath is malformed or if there is no such
1091*9dbf96bdSdrh ** node.
1092*9dbf96bdSdrh **
1093*9dbf96bdSdrh ** If pApnd!=0, then try to append new nodes to complete zPath if it is
1094*9dbf96bdSdrh ** possible to do so and if no existing node corresponds to zPath.  If
1095*9dbf96bdSdrh ** new nodes are appended *pApnd is set to 1.
1096*9dbf96bdSdrh */
1097*9dbf96bdSdrh static JsonNode *jsonLookupStep(
1098*9dbf96bdSdrh   JsonParse *pParse,      /* The JSON to search */
1099*9dbf96bdSdrh   u32 iRoot,              /* Begin the search at this node */
1100*9dbf96bdSdrh   const char *zPath,      /* The path to search */
1101*9dbf96bdSdrh   int *pApnd,             /* Append nodes to complete path if not NULL */
1102*9dbf96bdSdrh   const char **pzErr      /* Make *pzErr point to any syntax error in zPath */
1103*9dbf96bdSdrh ){
1104*9dbf96bdSdrh   u32 i, j, nKey;
1105*9dbf96bdSdrh   const char *zKey;
1106*9dbf96bdSdrh   JsonNode *pRoot = &pParse->aNode[iRoot];
1107*9dbf96bdSdrh   if( zPath[0]==0 ) return pRoot;
1108*9dbf96bdSdrh   if( pRoot->jnFlags & JNODE_REPLACE ) return 0;
1109*9dbf96bdSdrh   if( zPath[0]=='.' ){
1110*9dbf96bdSdrh     if( pRoot->eType!=JSON_OBJECT ) return 0;
1111*9dbf96bdSdrh     zPath++;
1112*9dbf96bdSdrh     if( zPath[0]=='"' ){
1113*9dbf96bdSdrh       zKey = zPath + 1;
1114*9dbf96bdSdrh       for(i=1; zPath[i] && zPath[i]!='"'; i++){}
1115*9dbf96bdSdrh       nKey = i-1;
1116*9dbf96bdSdrh       if( zPath[i] ){
1117*9dbf96bdSdrh         i++;
1118*9dbf96bdSdrh       }else{
1119*9dbf96bdSdrh         *pzErr = zPath;
1120*9dbf96bdSdrh         return 0;
1121*9dbf96bdSdrh       }
1122*9dbf96bdSdrh     }else{
1123*9dbf96bdSdrh       zKey = zPath;
1124*9dbf96bdSdrh       for(i=0; zPath[i] && zPath[i]!='.' && zPath[i]!='['; i++){}
1125*9dbf96bdSdrh       nKey = i;
1126*9dbf96bdSdrh     }
1127*9dbf96bdSdrh     if( nKey==0 ){
1128*9dbf96bdSdrh       *pzErr = zPath;
1129*9dbf96bdSdrh       return 0;
1130*9dbf96bdSdrh     }
1131*9dbf96bdSdrh     j = 1;
1132*9dbf96bdSdrh     for(;;){
1133*9dbf96bdSdrh       while( j<=pRoot->n ){
1134*9dbf96bdSdrh         if( jsonLabelCompare(pRoot+j, zKey, nKey) ){
1135*9dbf96bdSdrh           return jsonLookupStep(pParse, iRoot+j+1, &zPath[i], pApnd, pzErr);
1136*9dbf96bdSdrh         }
1137*9dbf96bdSdrh         j++;
1138*9dbf96bdSdrh         j += jsonNodeSize(&pRoot[j]);
1139*9dbf96bdSdrh       }
1140*9dbf96bdSdrh       if( (pRoot->jnFlags & JNODE_APPEND)==0 ) break;
1141*9dbf96bdSdrh       assert( pRoot->eU==2 );
1142*9dbf96bdSdrh       iRoot += pRoot->u.iAppend;
1143*9dbf96bdSdrh       pRoot = &pParse->aNode[iRoot];
1144*9dbf96bdSdrh       j = 1;
1145*9dbf96bdSdrh     }
1146*9dbf96bdSdrh     if( pApnd ){
1147*9dbf96bdSdrh       u32 iStart, iLabel;
1148*9dbf96bdSdrh       JsonNode *pNode;
1149*9dbf96bdSdrh       iStart = jsonParseAddNode(pParse, JSON_OBJECT, 2, 0);
1150*9dbf96bdSdrh       iLabel = jsonParseAddNode(pParse, JSON_STRING, nKey, zKey);
1151*9dbf96bdSdrh       zPath += i;
1152*9dbf96bdSdrh       pNode = jsonLookupAppend(pParse, zPath, pApnd, pzErr);
1153*9dbf96bdSdrh       if( pParse->oom ) return 0;
1154*9dbf96bdSdrh       if( pNode ){
1155*9dbf96bdSdrh         pRoot = &pParse->aNode[iRoot];
1156*9dbf96bdSdrh         assert( pRoot->eU==0 );
1157*9dbf96bdSdrh         pRoot->u.iAppend = iStart - iRoot;
1158*9dbf96bdSdrh         pRoot->jnFlags |= JNODE_APPEND;
1159*9dbf96bdSdrh         VVA( pRoot->eU = 2 );
1160*9dbf96bdSdrh         pParse->aNode[iLabel].jnFlags |= JNODE_RAW;
1161*9dbf96bdSdrh       }
1162*9dbf96bdSdrh       return pNode;
1163*9dbf96bdSdrh     }
1164*9dbf96bdSdrh   }else if( zPath[0]=='[' ){
1165*9dbf96bdSdrh     i = 0;
1166*9dbf96bdSdrh     j = 1;
1167*9dbf96bdSdrh     while( sqlite3Isdigit(zPath[j]) ){
1168*9dbf96bdSdrh       i = i*10 + zPath[j] - '0';
1169*9dbf96bdSdrh       j++;
1170*9dbf96bdSdrh     }
1171*9dbf96bdSdrh     if( j<2 || zPath[j]!=']' ){
1172*9dbf96bdSdrh       if( zPath[1]=='#' ){
1173*9dbf96bdSdrh         JsonNode *pBase = pRoot;
1174*9dbf96bdSdrh         int iBase = iRoot;
1175*9dbf96bdSdrh         if( pRoot->eType!=JSON_ARRAY ) return 0;
1176*9dbf96bdSdrh         for(;;){
1177*9dbf96bdSdrh           while( j<=pBase->n ){
1178*9dbf96bdSdrh             if( (pBase[j].jnFlags & JNODE_REMOVE)==0 ) i++;
1179*9dbf96bdSdrh             j += jsonNodeSize(&pBase[j]);
1180*9dbf96bdSdrh           }
1181*9dbf96bdSdrh           if( (pBase->jnFlags & JNODE_APPEND)==0 ) break;
1182*9dbf96bdSdrh           assert( pBase->eU==2 );
1183*9dbf96bdSdrh           iBase += pBase->u.iAppend;
1184*9dbf96bdSdrh           pBase = &pParse->aNode[iBase];
1185*9dbf96bdSdrh           j = 1;
1186*9dbf96bdSdrh         }
1187*9dbf96bdSdrh         j = 2;
1188*9dbf96bdSdrh         if( zPath[2]=='-' && sqlite3Isdigit(zPath[3]) ){
1189*9dbf96bdSdrh           unsigned int x = 0;
1190*9dbf96bdSdrh           j = 3;
1191*9dbf96bdSdrh           do{
1192*9dbf96bdSdrh             x = x*10 + zPath[j] - '0';
1193*9dbf96bdSdrh             j++;
1194*9dbf96bdSdrh           }while( sqlite3Isdigit(zPath[j]) );
1195*9dbf96bdSdrh           if( x>i ) return 0;
1196*9dbf96bdSdrh           i -= x;
1197*9dbf96bdSdrh         }
1198*9dbf96bdSdrh         if( zPath[j]!=']' ){
1199*9dbf96bdSdrh           *pzErr = zPath;
1200*9dbf96bdSdrh           return 0;
1201*9dbf96bdSdrh         }
1202*9dbf96bdSdrh       }else{
1203*9dbf96bdSdrh         *pzErr = zPath;
1204*9dbf96bdSdrh         return 0;
1205*9dbf96bdSdrh       }
1206*9dbf96bdSdrh     }
1207*9dbf96bdSdrh     if( pRoot->eType!=JSON_ARRAY ) return 0;
1208*9dbf96bdSdrh     zPath += j + 1;
1209*9dbf96bdSdrh     j = 1;
1210*9dbf96bdSdrh     for(;;){
1211*9dbf96bdSdrh       while( j<=pRoot->n && (i>0 || (pRoot[j].jnFlags & JNODE_REMOVE)!=0) ){
1212*9dbf96bdSdrh         if( (pRoot[j].jnFlags & JNODE_REMOVE)==0 ) i--;
1213*9dbf96bdSdrh         j += jsonNodeSize(&pRoot[j]);
1214*9dbf96bdSdrh       }
1215*9dbf96bdSdrh       if( (pRoot->jnFlags & JNODE_APPEND)==0 ) break;
1216*9dbf96bdSdrh       assert( pRoot->eU==2 );
1217*9dbf96bdSdrh       iRoot += pRoot->u.iAppend;
1218*9dbf96bdSdrh       pRoot = &pParse->aNode[iRoot];
1219*9dbf96bdSdrh       j = 1;
1220*9dbf96bdSdrh     }
1221*9dbf96bdSdrh     if( j<=pRoot->n ){
1222*9dbf96bdSdrh       return jsonLookupStep(pParse, iRoot+j, zPath, pApnd, pzErr);
1223*9dbf96bdSdrh     }
1224*9dbf96bdSdrh     if( i==0 && pApnd ){
1225*9dbf96bdSdrh       u32 iStart;
1226*9dbf96bdSdrh       JsonNode *pNode;
1227*9dbf96bdSdrh       iStart = jsonParseAddNode(pParse, JSON_ARRAY, 1, 0);
1228*9dbf96bdSdrh       pNode = jsonLookupAppend(pParse, zPath, pApnd, pzErr);
1229*9dbf96bdSdrh       if( pParse->oom ) return 0;
1230*9dbf96bdSdrh       if( pNode ){
1231*9dbf96bdSdrh         pRoot = &pParse->aNode[iRoot];
1232*9dbf96bdSdrh         assert( pRoot->eU==0 );
1233*9dbf96bdSdrh         pRoot->u.iAppend = iStart - iRoot;
1234*9dbf96bdSdrh         pRoot->jnFlags |= JNODE_APPEND;
1235*9dbf96bdSdrh         VVA( pRoot->eU = 2 );
1236*9dbf96bdSdrh       }
1237*9dbf96bdSdrh       return pNode;
1238*9dbf96bdSdrh     }
1239*9dbf96bdSdrh   }else{
1240*9dbf96bdSdrh     *pzErr = zPath;
1241*9dbf96bdSdrh   }
1242*9dbf96bdSdrh   return 0;
1243*9dbf96bdSdrh }
1244*9dbf96bdSdrh 
1245*9dbf96bdSdrh /*
1246*9dbf96bdSdrh ** Append content to pParse that will complete zPath.  Return a pointer
1247*9dbf96bdSdrh ** to the inserted node, or return NULL if the append fails.
1248*9dbf96bdSdrh */
1249*9dbf96bdSdrh static JsonNode *jsonLookupAppend(
1250*9dbf96bdSdrh   JsonParse *pParse,     /* Append content to the JSON parse */
1251*9dbf96bdSdrh   const char *zPath,     /* Description of content to append */
1252*9dbf96bdSdrh   int *pApnd,            /* Set this flag to 1 */
1253*9dbf96bdSdrh   const char **pzErr     /* Make this point to any syntax error */
1254*9dbf96bdSdrh ){
1255*9dbf96bdSdrh   *pApnd = 1;
1256*9dbf96bdSdrh   if( zPath[0]==0 ){
1257*9dbf96bdSdrh     jsonParseAddNode(pParse, JSON_NULL, 0, 0);
1258*9dbf96bdSdrh     return pParse->oom ? 0 : &pParse->aNode[pParse->nNode-1];
1259*9dbf96bdSdrh   }
1260*9dbf96bdSdrh   if( zPath[0]=='.' ){
1261*9dbf96bdSdrh     jsonParseAddNode(pParse, JSON_OBJECT, 0, 0);
1262*9dbf96bdSdrh   }else if( strncmp(zPath,"[0]",3)==0 ){
1263*9dbf96bdSdrh     jsonParseAddNode(pParse, JSON_ARRAY, 0, 0);
1264*9dbf96bdSdrh   }else{
1265*9dbf96bdSdrh     return 0;
1266*9dbf96bdSdrh   }
1267*9dbf96bdSdrh   if( pParse->oom ) return 0;
1268*9dbf96bdSdrh   return jsonLookupStep(pParse, pParse->nNode-1, zPath, pApnd, pzErr);
1269*9dbf96bdSdrh }
1270*9dbf96bdSdrh 
1271*9dbf96bdSdrh /*
1272*9dbf96bdSdrh ** Return the text of a syntax error message on a JSON path.  Space is
1273*9dbf96bdSdrh ** obtained from sqlite3_malloc().
1274*9dbf96bdSdrh */
1275*9dbf96bdSdrh static char *jsonPathSyntaxError(const char *zErr){
1276*9dbf96bdSdrh   return sqlite3_mprintf("JSON path error near '%q'", zErr);
1277*9dbf96bdSdrh }
1278*9dbf96bdSdrh 
1279*9dbf96bdSdrh /*
1280*9dbf96bdSdrh ** Do a node lookup using zPath.  Return a pointer to the node on success.
1281*9dbf96bdSdrh ** Return NULL if not found or if there is an error.
1282*9dbf96bdSdrh **
1283*9dbf96bdSdrh ** On an error, write an error message into pCtx and increment the
1284*9dbf96bdSdrh ** pParse->nErr counter.
1285*9dbf96bdSdrh **
1286*9dbf96bdSdrh ** If pApnd!=NULL then try to append missing nodes and set *pApnd = 1 if
1287*9dbf96bdSdrh ** nodes are appended.
1288*9dbf96bdSdrh */
1289*9dbf96bdSdrh static JsonNode *jsonLookup(
1290*9dbf96bdSdrh   JsonParse *pParse,      /* The JSON to search */
1291*9dbf96bdSdrh   const char *zPath,      /* The path to search */
1292*9dbf96bdSdrh   int *pApnd,             /* Append nodes to complete path if not NULL */
1293*9dbf96bdSdrh   sqlite3_context *pCtx   /* Report errors here, if not NULL */
1294*9dbf96bdSdrh ){
1295*9dbf96bdSdrh   const char *zErr = 0;
1296*9dbf96bdSdrh   JsonNode *pNode = 0;
1297*9dbf96bdSdrh   char *zMsg;
1298*9dbf96bdSdrh 
1299*9dbf96bdSdrh   if( zPath==0 ) return 0;
1300*9dbf96bdSdrh   if( zPath[0]!='$' ){
1301*9dbf96bdSdrh     zErr = zPath;
1302*9dbf96bdSdrh     goto lookup_err;
1303*9dbf96bdSdrh   }
1304*9dbf96bdSdrh   zPath++;
1305*9dbf96bdSdrh   pNode = jsonLookupStep(pParse, 0, zPath, pApnd, &zErr);
1306*9dbf96bdSdrh   if( zErr==0 ) return pNode;
1307*9dbf96bdSdrh 
1308*9dbf96bdSdrh lookup_err:
1309*9dbf96bdSdrh   pParse->nErr++;
1310*9dbf96bdSdrh   assert( zErr!=0 && pCtx!=0 );
1311*9dbf96bdSdrh   zMsg = jsonPathSyntaxError(zErr);
1312*9dbf96bdSdrh   if( zMsg ){
1313*9dbf96bdSdrh     sqlite3_result_error(pCtx, zMsg, -1);
1314*9dbf96bdSdrh     sqlite3_free(zMsg);
1315*9dbf96bdSdrh   }else{
1316*9dbf96bdSdrh     sqlite3_result_error_nomem(pCtx);
1317*9dbf96bdSdrh   }
1318*9dbf96bdSdrh   return 0;
1319*9dbf96bdSdrh }
1320*9dbf96bdSdrh 
1321*9dbf96bdSdrh 
1322*9dbf96bdSdrh /*
1323*9dbf96bdSdrh ** Report the wrong number of arguments for json_insert(), json_replace()
1324*9dbf96bdSdrh ** or json_set().
1325*9dbf96bdSdrh */
1326*9dbf96bdSdrh static void jsonWrongNumArgs(
1327*9dbf96bdSdrh   sqlite3_context *pCtx,
1328*9dbf96bdSdrh   const char *zFuncName
1329*9dbf96bdSdrh ){
1330*9dbf96bdSdrh   char *zMsg = sqlite3_mprintf("json_%s() needs an odd number of arguments",
1331*9dbf96bdSdrh                                zFuncName);
1332*9dbf96bdSdrh   sqlite3_result_error(pCtx, zMsg, -1);
1333*9dbf96bdSdrh   sqlite3_free(zMsg);
1334*9dbf96bdSdrh }
1335*9dbf96bdSdrh 
1336*9dbf96bdSdrh /*
1337*9dbf96bdSdrh ** Mark all NULL entries in the Object passed in as JNODE_REMOVE.
1338*9dbf96bdSdrh */
1339*9dbf96bdSdrh static void jsonRemoveAllNulls(JsonNode *pNode){
1340*9dbf96bdSdrh   int i, n;
1341*9dbf96bdSdrh   assert( pNode->eType==JSON_OBJECT );
1342*9dbf96bdSdrh   n = pNode->n;
1343*9dbf96bdSdrh   for(i=2; i<=n; i += jsonNodeSize(&pNode[i])+1){
1344*9dbf96bdSdrh     switch( pNode[i].eType ){
1345*9dbf96bdSdrh       case JSON_NULL:
1346*9dbf96bdSdrh         pNode[i].jnFlags |= JNODE_REMOVE;
1347*9dbf96bdSdrh         break;
1348*9dbf96bdSdrh       case JSON_OBJECT:
1349*9dbf96bdSdrh         jsonRemoveAllNulls(&pNode[i]);
1350*9dbf96bdSdrh         break;
1351*9dbf96bdSdrh     }
1352*9dbf96bdSdrh   }
1353*9dbf96bdSdrh }
1354*9dbf96bdSdrh 
1355*9dbf96bdSdrh 
1356*9dbf96bdSdrh /****************************************************************************
1357*9dbf96bdSdrh ** SQL functions used for testing and debugging
1358*9dbf96bdSdrh ****************************************************************************/
1359*9dbf96bdSdrh 
1360*9dbf96bdSdrh #ifdef SQLITE_DEBUG
1361*9dbf96bdSdrh /*
1362*9dbf96bdSdrh ** The json_parse(JSON) function returns a string which describes
1363*9dbf96bdSdrh ** a parse of the JSON provided.  Or it returns NULL if JSON is not
1364*9dbf96bdSdrh ** well-formed.
1365*9dbf96bdSdrh */
1366*9dbf96bdSdrh static void jsonParseFunc(
1367*9dbf96bdSdrh   sqlite3_context *ctx,
1368*9dbf96bdSdrh   int argc,
1369*9dbf96bdSdrh   sqlite3_value **argv
1370*9dbf96bdSdrh ){
1371*9dbf96bdSdrh   JsonString s;       /* Output string - not real JSON */
1372*9dbf96bdSdrh   JsonParse x;        /* The parse */
1373*9dbf96bdSdrh   u32 i;
1374*9dbf96bdSdrh 
1375*9dbf96bdSdrh   assert( argc==1 );
1376*9dbf96bdSdrh   if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return;
1377*9dbf96bdSdrh   jsonParseFindParents(&x);
1378*9dbf96bdSdrh   jsonInit(&s, ctx);
1379*9dbf96bdSdrh   for(i=0; i<x.nNode; i++){
1380*9dbf96bdSdrh     const char *zType;
1381*9dbf96bdSdrh     if( x.aNode[i].jnFlags & JNODE_LABEL ){
1382*9dbf96bdSdrh       assert( x.aNode[i].eType==JSON_STRING );
1383*9dbf96bdSdrh       zType = "label";
1384*9dbf96bdSdrh     }else{
1385*9dbf96bdSdrh       zType = jsonType[x.aNode[i].eType];
1386*9dbf96bdSdrh     }
1387*9dbf96bdSdrh     jsonPrintf(100, &s,"node %3u: %7s n=%-4d up=%-4d",
1388*9dbf96bdSdrh                i, zType, x.aNode[i].n, x.aUp[i]);
1389*9dbf96bdSdrh     assert( x.aNode[i].eU==0 || x.aNode[i].eU==1 );
1390*9dbf96bdSdrh     if( x.aNode[i].u.zJContent!=0 ){
1391*9dbf96bdSdrh       assert( x.aNode[i].eU==1 );
1392*9dbf96bdSdrh       jsonAppendRaw(&s, " ", 1);
1393*9dbf96bdSdrh       jsonAppendRaw(&s, x.aNode[i].u.zJContent, x.aNode[i].n);
1394*9dbf96bdSdrh     }else{
1395*9dbf96bdSdrh       assert( x.aNode[i].eU==0 );
1396*9dbf96bdSdrh     }
1397*9dbf96bdSdrh     jsonAppendRaw(&s, "\n", 1);
1398*9dbf96bdSdrh   }
1399*9dbf96bdSdrh   jsonParseReset(&x);
1400*9dbf96bdSdrh   jsonResult(&s);
1401*9dbf96bdSdrh }
1402*9dbf96bdSdrh 
1403*9dbf96bdSdrh /*
1404*9dbf96bdSdrh ** The json_test1(JSON) function return true (1) if the input is JSON
1405*9dbf96bdSdrh ** text generated by another json function.  It returns (0) if the input
1406*9dbf96bdSdrh ** is not known to be JSON.
1407*9dbf96bdSdrh */
1408*9dbf96bdSdrh static void jsonTest1Func(
1409*9dbf96bdSdrh   sqlite3_context *ctx,
1410*9dbf96bdSdrh   int argc,
1411*9dbf96bdSdrh   sqlite3_value **argv
1412*9dbf96bdSdrh ){
1413*9dbf96bdSdrh   UNUSED_PARAMETER(argc);
1414*9dbf96bdSdrh   sqlite3_result_int(ctx, sqlite3_value_subtype(argv[0])==JSON_SUBTYPE);
1415*9dbf96bdSdrh }
1416*9dbf96bdSdrh #endif /* SQLITE_DEBUG */
1417*9dbf96bdSdrh 
1418*9dbf96bdSdrh /****************************************************************************
1419*9dbf96bdSdrh ** Scalar SQL function implementations
1420*9dbf96bdSdrh ****************************************************************************/
1421*9dbf96bdSdrh 
1422*9dbf96bdSdrh /*
1423*9dbf96bdSdrh ** Implementation of the json_QUOTE(VALUE) function.  Return a JSON value
1424*9dbf96bdSdrh ** corresponding to the SQL value input.  Mostly this means putting
1425*9dbf96bdSdrh ** double-quotes around strings and returning the unquoted string "null"
1426*9dbf96bdSdrh ** when given a NULL input.
1427*9dbf96bdSdrh */
1428*9dbf96bdSdrh static void jsonQuoteFunc(
1429*9dbf96bdSdrh   sqlite3_context *ctx,
1430*9dbf96bdSdrh   int argc,
1431*9dbf96bdSdrh   sqlite3_value **argv
1432*9dbf96bdSdrh ){
1433*9dbf96bdSdrh   JsonString jx;
1434*9dbf96bdSdrh   UNUSED_PARAMETER(argc);
1435*9dbf96bdSdrh 
1436*9dbf96bdSdrh   jsonInit(&jx, ctx);
1437*9dbf96bdSdrh   jsonAppendValue(&jx, argv[0]);
1438*9dbf96bdSdrh   jsonResult(&jx);
1439*9dbf96bdSdrh   sqlite3_result_subtype(ctx, JSON_SUBTYPE);
1440*9dbf96bdSdrh }
1441*9dbf96bdSdrh 
1442*9dbf96bdSdrh /*
1443*9dbf96bdSdrh ** Implementation of the json_array(VALUE,...) function.  Return a JSON
1444*9dbf96bdSdrh ** array that contains all values given in arguments.  Or if any argument
1445*9dbf96bdSdrh ** is a BLOB, throw an error.
1446*9dbf96bdSdrh */
1447*9dbf96bdSdrh static void jsonArrayFunc(
1448*9dbf96bdSdrh   sqlite3_context *ctx,
1449*9dbf96bdSdrh   int argc,
1450*9dbf96bdSdrh   sqlite3_value **argv
1451*9dbf96bdSdrh ){
1452*9dbf96bdSdrh   int i;
1453*9dbf96bdSdrh   JsonString jx;
1454*9dbf96bdSdrh 
1455*9dbf96bdSdrh   jsonInit(&jx, ctx);
1456*9dbf96bdSdrh   jsonAppendChar(&jx, '[');
1457*9dbf96bdSdrh   for(i=0; i<argc; i++){
1458*9dbf96bdSdrh     jsonAppendSeparator(&jx);
1459*9dbf96bdSdrh     jsonAppendValue(&jx, argv[i]);
1460*9dbf96bdSdrh   }
1461*9dbf96bdSdrh   jsonAppendChar(&jx, ']');
1462*9dbf96bdSdrh   jsonResult(&jx);
1463*9dbf96bdSdrh   sqlite3_result_subtype(ctx, JSON_SUBTYPE);
1464*9dbf96bdSdrh }
1465*9dbf96bdSdrh 
1466*9dbf96bdSdrh 
1467*9dbf96bdSdrh /*
1468*9dbf96bdSdrh ** json_array_length(JSON)
1469*9dbf96bdSdrh ** json_array_length(JSON, PATH)
1470*9dbf96bdSdrh **
1471*9dbf96bdSdrh ** Return the number of elements in the top-level JSON array.
1472*9dbf96bdSdrh ** Return 0 if the input is not a well-formed JSON array.
1473*9dbf96bdSdrh */
1474*9dbf96bdSdrh static void jsonArrayLengthFunc(
1475*9dbf96bdSdrh   sqlite3_context *ctx,
1476*9dbf96bdSdrh   int argc,
1477*9dbf96bdSdrh   sqlite3_value **argv
1478*9dbf96bdSdrh ){
1479*9dbf96bdSdrh   JsonParse *p;          /* The parse */
1480*9dbf96bdSdrh   sqlite3_int64 n = 0;
1481*9dbf96bdSdrh   u32 i;
1482*9dbf96bdSdrh   JsonNode *pNode;
1483*9dbf96bdSdrh 
1484*9dbf96bdSdrh   p = jsonParseCached(ctx, argv, ctx);
1485*9dbf96bdSdrh   if( p==0 ) return;
1486*9dbf96bdSdrh   assert( p->nNode );
1487*9dbf96bdSdrh   if( argc==2 ){
1488*9dbf96bdSdrh     const char *zPath = (const char*)sqlite3_value_text(argv[1]);
1489*9dbf96bdSdrh     pNode = jsonLookup(p, zPath, 0, ctx);
1490*9dbf96bdSdrh   }else{
1491*9dbf96bdSdrh     pNode = p->aNode;
1492*9dbf96bdSdrh   }
1493*9dbf96bdSdrh   if( pNode==0 ){
1494*9dbf96bdSdrh     return;
1495*9dbf96bdSdrh   }
1496*9dbf96bdSdrh   if( pNode->eType==JSON_ARRAY ){
1497*9dbf96bdSdrh     assert( (pNode->jnFlags & JNODE_APPEND)==0 );
1498*9dbf96bdSdrh     for(i=1; i<=pNode->n; n++){
1499*9dbf96bdSdrh       i += jsonNodeSize(&pNode[i]);
1500*9dbf96bdSdrh     }
1501*9dbf96bdSdrh   }
1502*9dbf96bdSdrh   sqlite3_result_int64(ctx, n);
1503*9dbf96bdSdrh }
1504*9dbf96bdSdrh 
1505*9dbf96bdSdrh /*
1506daefcd9eSdrh ** Bit values for the flags passed into jsonExtractFunc() or
1507daefcd9eSdrh ** jsonSetFunc() via the user-data value.
1508daefcd9eSdrh */
1509daefcd9eSdrh #define JSON_NULLERR   0x01        /* Return NULL if input is not JSON */
1510daefcd9eSdrh #define JSON_ABPATH    0x02        /* Allow abbreviated JSON path specs */
1511daefcd9eSdrh #define JSON_ISSET     0x04        /* json_set(), not json_insert() */
1512daefcd9eSdrh 
1513daefcd9eSdrh /*
1514*9dbf96bdSdrh ** json_extract(JSON, PATH, ...)
1515daefcd9eSdrh ** json_nextract(JSON, PATH, ...)
1516daefcd9eSdrh ** "->"(JSON,PATH)
1517daefcd9eSdrh ** "->>"(JSON,PATH)
1518*9dbf96bdSdrh **
1519daefcd9eSdrh ** Return the element described by PATH.  Return NULL if that PATH element
1520daefcd9eSdrh ** is not found.  For leaf nodes of the JSON, the value returned is a pure
1521daefcd9eSdrh ** SQL value.  In other words, quotes have been removed from strings.
1522daefcd9eSdrh **
1523daefcd9eSdrh ** If there are multiple PATHs, then the value returned is a JSON array
1524daefcd9eSdrh ** with one entry in the array for each PATH term.
1525daefcd9eSdrh **
1526daefcd9eSdrh ** Throw an error if any PATH is malformed.
1527daefcd9eSdrh **
1528daefcd9eSdrh ** If JSON is not well-formed JSON then:
1529daefcd9eSdrh **
1530daefcd9eSdrh **    (1) raise an error if the JSON_NULLERR flag is not set.
1531daefcd9eSdrh **
1532daefcd9eSdrh **    (2) Otherwise (if the JSON_NULLERR flags is set and) if there
1533daefcd9eSdrh **        is a single PATH argument with the value '$', simply quote
1534daefcd9eSdrh **        the JSON input as if by json_quote().  In other words, treat
1535daefcd9eSdrh **        the JSON input as a string and convert it into a valid JSON
1536daefcd9eSdrh **        string.
1537daefcd9eSdrh **
1538daefcd9eSdrh **    (3) Otherwise (if JSON_NULLERR is set and the PATH is not '$')
1539daefcd9eSdrh **        return NULL
1540daefcd9eSdrh **
1541daefcd9eSdrh ** If the JSON_ABPATH flag is set and there is only a single PATH, then
1542daefcd9eSdrh ** allow abbreviated PATH specs that omit the leading "$".
1543*9dbf96bdSdrh */
1544*9dbf96bdSdrh static void jsonExtractFunc(
1545*9dbf96bdSdrh   sqlite3_context *ctx,
1546*9dbf96bdSdrh   int argc,
1547*9dbf96bdSdrh   sqlite3_value **argv
1548*9dbf96bdSdrh ){
1549*9dbf96bdSdrh   JsonParse *p;          /* The parse */
1550*9dbf96bdSdrh   JsonNode *pNode;
1551*9dbf96bdSdrh   const char *zPath;
1552daefcd9eSdrh   int flags = SQLITE_PTR_TO_INT(sqlite3_user_data(ctx));
1553*9dbf96bdSdrh   JsonString jx;
1554*9dbf96bdSdrh 
1555*9dbf96bdSdrh   if( argc<2 ) return;
1556daefcd9eSdrh   p = jsonParseCached(ctx, argv, (flags & JSON_NULLERR)!=0 ? 0 : ctx);
1557daefcd9eSdrh   if( p==0 ){
1558daefcd9eSdrh     /* If the form is "json_nextract(IN,'$')" and IN is not well-formed JSON,
1559daefcd9eSdrh     ** then return IN as a quoted JSON string. */
1560daefcd9eSdrh     if( (flags & JSON_NULLERR)!=0
1561daefcd9eSdrh      && argc==2
1562daefcd9eSdrh      && (zPath = (const char*)sqlite3_value_text(argv[1]))!=0
1563daefcd9eSdrh      && zPath[0]=='$' && zPath[1]==0
1564daefcd9eSdrh     ){
1565daefcd9eSdrh       jsonQuoteFunc(ctx, argc, argv);
1566daefcd9eSdrh     }
1567daefcd9eSdrh     return;
1568daefcd9eSdrh   }
1569daefcd9eSdrh   if( argc==2 ){
1570daefcd9eSdrh     /* With a single PATH argument, the return is the unquoted SQL value */
1571daefcd9eSdrh     zPath = (const char*)sqlite3_value_text(argv[1]);
1572daefcd9eSdrh     if( zPath && zPath[0]!='$' && zPath[0]!=0  && (flags & JSON_ABPATH)!=0 ){
1573daefcd9eSdrh       /* The -> and ->> operators accept abbreviated PATH arguments.  This
1574daefcd9eSdrh       ** is mostly for compatibility with PostgreSQL, but also for convenience.
1575daefcd9eSdrh       **
1576daefcd9eSdrh       **     NUMBER   ==>  $[NUMBER]     // PG compatible
1577daefcd9eSdrh       **     LABEL    ==>  $.LABEL       // PG compatible
1578daefcd9eSdrh       **     [NUMBER] ==>  $[NUMBER]     // Not PG.  Purely for convenience
1579daefcd9eSdrh       */
1580daefcd9eSdrh       jsonInit(&jx, ctx);
1581daefcd9eSdrh       if( sqlite3Isdigit(zPath[0]) ){
1582daefcd9eSdrh         jsonAppendRaw(&jx, "$[", 2);
1583daefcd9eSdrh         jsonAppendRaw(&jx, zPath, (int)strlen(zPath));
1584daefcd9eSdrh         jsonAppendRaw(&jx, "]", 2);
1585daefcd9eSdrh       }else{
1586daefcd9eSdrh         jsonAppendRaw(&jx, "$.", 1 + (zPath[0]!='['));
1587daefcd9eSdrh         jsonAppendRaw(&jx, zPath, (int)strlen(zPath));
1588daefcd9eSdrh         jsonAppendChar(&jx, 0);
1589daefcd9eSdrh       }
1590daefcd9eSdrh       pNode = jx.bErr ? 0 : jsonLookup(p, jx.zBuf, 0, ctx);
1591daefcd9eSdrh       jsonReset(&jx);
1592daefcd9eSdrh     }else{
1593daefcd9eSdrh       pNode = jsonLookup(p, zPath, 0, ctx);
1594daefcd9eSdrh     }
1595daefcd9eSdrh     if( p->nErr ) return;
1596daefcd9eSdrh     if( pNode ) jsonReturn(pNode, ctx, 0);
1597daefcd9eSdrh   }else{
1598daefcd9eSdrh     /* Two or more PATH arguments results in a JSON array with each
1599daefcd9eSdrh     ** element of the array being the value selected by one of the PATHs */
1600daefcd9eSdrh     int i;
1601*9dbf96bdSdrh     jsonInit(&jx, ctx);
1602*9dbf96bdSdrh     jsonAppendChar(&jx, '[');
1603*9dbf96bdSdrh     for(i=1; i<argc; i++){
1604*9dbf96bdSdrh       zPath = (const char*)sqlite3_value_text(argv[i]);
1605*9dbf96bdSdrh       pNode = jsonLookup(p, zPath, 0, ctx);
1606*9dbf96bdSdrh       if( p->nErr ) break;
1607*9dbf96bdSdrh       jsonAppendSeparator(&jx);
1608*9dbf96bdSdrh       if( pNode ){
1609*9dbf96bdSdrh         jsonRenderNode(pNode, &jx, 0);
1610*9dbf96bdSdrh       }else{
1611*9dbf96bdSdrh         jsonAppendRaw(&jx, "null", 4);
1612*9dbf96bdSdrh       }
1613*9dbf96bdSdrh     }
1614daefcd9eSdrh     if( i==argc ){
1615*9dbf96bdSdrh       jsonAppendChar(&jx, ']');
1616*9dbf96bdSdrh       jsonResult(&jx);
1617*9dbf96bdSdrh       sqlite3_result_subtype(ctx, JSON_SUBTYPE);
1618*9dbf96bdSdrh     }
1619*9dbf96bdSdrh     jsonReset(&jx);
1620*9dbf96bdSdrh   }
1621daefcd9eSdrh }
1622*9dbf96bdSdrh 
1623*9dbf96bdSdrh /* This is the RFC 7396 MergePatch algorithm.
1624*9dbf96bdSdrh */
1625*9dbf96bdSdrh static JsonNode *jsonMergePatch(
1626*9dbf96bdSdrh   JsonParse *pParse,   /* The JSON parser that contains the TARGET */
1627*9dbf96bdSdrh   u32 iTarget,         /* Node of the TARGET in pParse */
1628*9dbf96bdSdrh   JsonNode *pPatch     /* The PATCH */
1629*9dbf96bdSdrh ){
1630*9dbf96bdSdrh   u32 i, j;
1631*9dbf96bdSdrh   u32 iRoot;
1632*9dbf96bdSdrh   JsonNode *pTarget;
1633*9dbf96bdSdrh   if( pPatch->eType!=JSON_OBJECT ){
1634*9dbf96bdSdrh     return pPatch;
1635*9dbf96bdSdrh   }
1636*9dbf96bdSdrh   assert( iTarget>=0 && iTarget<pParse->nNode );
1637*9dbf96bdSdrh   pTarget = &pParse->aNode[iTarget];
1638*9dbf96bdSdrh   assert( (pPatch->jnFlags & JNODE_APPEND)==0 );
1639*9dbf96bdSdrh   if( pTarget->eType!=JSON_OBJECT ){
1640*9dbf96bdSdrh     jsonRemoveAllNulls(pPatch);
1641*9dbf96bdSdrh     return pPatch;
1642*9dbf96bdSdrh   }
1643*9dbf96bdSdrh   iRoot = iTarget;
1644*9dbf96bdSdrh   for(i=1; i<pPatch->n; i += jsonNodeSize(&pPatch[i+1])+1){
1645*9dbf96bdSdrh     u32 nKey;
1646*9dbf96bdSdrh     const char *zKey;
1647*9dbf96bdSdrh     assert( pPatch[i].eType==JSON_STRING );
1648*9dbf96bdSdrh     assert( pPatch[i].jnFlags & JNODE_LABEL );
1649*9dbf96bdSdrh     assert( pPatch[i].eU==1 );
1650*9dbf96bdSdrh     nKey = pPatch[i].n;
1651*9dbf96bdSdrh     zKey = pPatch[i].u.zJContent;
1652*9dbf96bdSdrh     assert( (pPatch[i].jnFlags & JNODE_RAW)==0 );
1653*9dbf96bdSdrh     for(j=1; j<pTarget->n; j += jsonNodeSize(&pTarget[j+1])+1 ){
1654*9dbf96bdSdrh       assert( pTarget[j].eType==JSON_STRING );
1655*9dbf96bdSdrh       assert( pTarget[j].jnFlags & JNODE_LABEL );
1656*9dbf96bdSdrh       assert( (pPatch[i].jnFlags & JNODE_RAW)==0 );
1657*9dbf96bdSdrh       if( pTarget[j].n==nKey && strncmp(pTarget[j].u.zJContent,zKey,nKey)==0 ){
1658*9dbf96bdSdrh         if( pTarget[j+1].jnFlags & (JNODE_REMOVE|JNODE_PATCH) ) break;
1659*9dbf96bdSdrh         if( pPatch[i+1].eType==JSON_NULL ){
1660*9dbf96bdSdrh           pTarget[j+1].jnFlags |= JNODE_REMOVE;
1661*9dbf96bdSdrh         }else{
1662*9dbf96bdSdrh           JsonNode *pNew = jsonMergePatch(pParse, iTarget+j+1, &pPatch[i+1]);
1663*9dbf96bdSdrh           if( pNew==0 ) return 0;
1664*9dbf96bdSdrh           pTarget = &pParse->aNode[iTarget];
1665*9dbf96bdSdrh           if( pNew!=&pTarget[j+1] ){
1666*9dbf96bdSdrh             assert( pTarget[j+1].eU==0
1667*9dbf96bdSdrh                  || pTarget[j+1].eU==1
1668*9dbf96bdSdrh                  || pTarget[j+1].eU==2 );
1669*9dbf96bdSdrh             testcase( pTarget[j+1].eU==1 );
1670*9dbf96bdSdrh             testcase( pTarget[j+1].eU==2 );
1671*9dbf96bdSdrh             VVA( pTarget[j+1].eU = 5 );
1672*9dbf96bdSdrh             pTarget[j+1].u.pPatch = pNew;
1673*9dbf96bdSdrh             pTarget[j+1].jnFlags |= JNODE_PATCH;
1674*9dbf96bdSdrh           }
1675*9dbf96bdSdrh         }
1676*9dbf96bdSdrh         break;
1677*9dbf96bdSdrh       }
1678*9dbf96bdSdrh     }
1679*9dbf96bdSdrh     if( j>=pTarget->n && pPatch[i+1].eType!=JSON_NULL ){
1680*9dbf96bdSdrh       int iStart, iPatch;
1681*9dbf96bdSdrh       iStart = jsonParseAddNode(pParse, JSON_OBJECT, 2, 0);
1682*9dbf96bdSdrh       jsonParseAddNode(pParse, JSON_STRING, nKey, zKey);
1683*9dbf96bdSdrh       iPatch = jsonParseAddNode(pParse, JSON_TRUE, 0, 0);
1684*9dbf96bdSdrh       if( pParse->oom ) return 0;
1685*9dbf96bdSdrh       jsonRemoveAllNulls(pPatch);
1686*9dbf96bdSdrh       pTarget = &pParse->aNode[iTarget];
1687*9dbf96bdSdrh       assert( pParse->aNode[iRoot].eU==0 || pParse->aNode[iRoot].eU==2 );
1688*9dbf96bdSdrh       testcase( pParse->aNode[iRoot].eU==2 );
1689*9dbf96bdSdrh       pParse->aNode[iRoot].jnFlags |= JNODE_APPEND;
1690*9dbf96bdSdrh       VVA( pParse->aNode[iRoot].eU = 2 );
1691*9dbf96bdSdrh       pParse->aNode[iRoot].u.iAppend = iStart - iRoot;
1692*9dbf96bdSdrh       iRoot = iStart;
1693*9dbf96bdSdrh       assert( pParse->aNode[iPatch].eU==0 );
1694*9dbf96bdSdrh       VVA( pParse->aNode[iPatch].eU = 5 );
1695*9dbf96bdSdrh       pParse->aNode[iPatch].jnFlags |= JNODE_PATCH;
1696*9dbf96bdSdrh       pParse->aNode[iPatch].u.pPatch = &pPatch[i+1];
1697*9dbf96bdSdrh     }
1698*9dbf96bdSdrh   }
1699*9dbf96bdSdrh   return pTarget;
1700*9dbf96bdSdrh }
1701*9dbf96bdSdrh 
1702*9dbf96bdSdrh /*
1703*9dbf96bdSdrh ** Implementation of the json_mergepatch(JSON1,JSON2) function.  Return a JSON
1704*9dbf96bdSdrh ** object that is the result of running the RFC 7396 MergePatch() algorithm
1705*9dbf96bdSdrh ** on the two arguments.
1706*9dbf96bdSdrh */
1707*9dbf96bdSdrh static void jsonPatchFunc(
1708*9dbf96bdSdrh   sqlite3_context *ctx,
1709*9dbf96bdSdrh   int argc,
1710*9dbf96bdSdrh   sqlite3_value **argv
1711*9dbf96bdSdrh ){
1712*9dbf96bdSdrh   JsonParse x;     /* The JSON that is being patched */
1713*9dbf96bdSdrh   JsonParse y;     /* The patch */
1714*9dbf96bdSdrh   JsonNode *pResult;   /* The result of the merge */
1715*9dbf96bdSdrh 
1716*9dbf96bdSdrh   UNUSED_PARAMETER(argc);
1717*9dbf96bdSdrh   if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return;
1718*9dbf96bdSdrh   if( jsonParse(&y, ctx, (const char*)sqlite3_value_text(argv[1])) ){
1719*9dbf96bdSdrh     jsonParseReset(&x);
1720*9dbf96bdSdrh     return;
1721*9dbf96bdSdrh   }
1722*9dbf96bdSdrh   pResult = jsonMergePatch(&x, 0, y.aNode);
1723*9dbf96bdSdrh   assert( pResult!=0 || x.oom );
1724*9dbf96bdSdrh   if( pResult ){
1725*9dbf96bdSdrh     jsonReturnJson(pResult, ctx, 0);
1726*9dbf96bdSdrh   }else{
1727*9dbf96bdSdrh     sqlite3_result_error_nomem(ctx);
1728*9dbf96bdSdrh   }
1729*9dbf96bdSdrh   jsonParseReset(&x);
1730*9dbf96bdSdrh   jsonParseReset(&y);
1731*9dbf96bdSdrh }
1732*9dbf96bdSdrh 
1733*9dbf96bdSdrh 
1734*9dbf96bdSdrh /*
1735*9dbf96bdSdrh ** Implementation of the json_object(NAME,VALUE,...) function.  Return a JSON
1736*9dbf96bdSdrh ** object that contains all name/value given in arguments.  Or if any name
1737*9dbf96bdSdrh ** is not a string or if any value is a BLOB, throw an error.
1738*9dbf96bdSdrh */
1739*9dbf96bdSdrh static void jsonObjectFunc(
1740*9dbf96bdSdrh   sqlite3_context *ctx,
1741*9dbf96bdSdrh   int argc,
1742*9dbf96bdSdrh   sqlite3_value **argv
1743*9dbf96bdSdrh ){
1744*9dbf96bdSdrh   int i;
1745*9dbf96bdSdrh   JsonString jx;
1746*9dbf96bdSdrh   const char *z;
1747*9dbf96bdSdrh   u32 n;
1748*9dbf96bdSdrh 
1749*9dbf96bdSdrh   if( argc&1 ){
1750*9dbf96bdSdrh     sqlite3_result_error(ctx, "json_object() requires an even number "
1751*9dbf96bdSdrh                                   "of arguments", -1);
1752*9dbf96bdSdrh     return;
1753*9dbf96bdSdrh   }
1754*9dbf96bdSdrh   jsonInit(&jx, ctx);
1755*9dbf96bdSdrh   jsonAppendChar(&jx, '{');
1756*9dbf96bdSdrh   for(i=0; i<argc; i+=2){
1757*9dbf96bdSdrh     if( sqlite3_value_type(argv[i])!=SQLITE_TEXT ){
1758*9dbf96bdSdrh       sqlite3_result_error(ctx, "json_object() labels must be TEXT", -1);
1759*9dbf96bdSdrh       jsonReset(&jx);
1760*9dbf96bdSdrh       return;
1761*9dbf96bdSdrh     }
1762*9dbf96bdSdrh     jsonAppendSeparator(&jx);
1763*9dbf96bdSdrh     z = (const char*)sqlite3_value_text(argv[i]);
1764*9dbf96bdSdrh     n = (u32)sqlite3_value_bytes(argv[i]);
1765*9dbf96bdSdrh     jsonAppendString(&jx, z, n);
1766*9dbf96bdSdrh     jsonAppendChar(&jx, ':');
1767*9dbf96bdSdrh     jsonAppendValue(&jx, argv[i+1]);
1768*9dbf96bdSdrh   }
1769*9dbf96bdSdrh   jsonAppendChar(&jx, '}');
1770*9dbf96bdSdrh   jsonResult(&jx);
1771*9dbf96bdSdrh   sqlite3_result_subtype(ctx, JSON_SUBTYPE);
1772*9dbf96bdSdrh }
1773*9dbf96bdSdrh 
1774*9dbf96bdSdrh 
1775*9dbf96bdSdrh /*
1776*9dbf96bdSdrh ** json_remove(JSON, PATH, ...)
1777*9dbf96bdSdrh **
1778*9dbf96bdSdrh ** Remove the named elements from JSON and return the result.  malformed
1779*9dbf96bdSdrh ** JSON or PATH arguments result in an error.
1780*9dbf96bdSdrh */
1781*9dbf96bdSdrh static void jsonRemoveFunc(
1782*9dbf96bdSdrh   sqlite3_context *ctx,
1783*9dbf96bdSdrh   int argc,
1784*9dbf96bdSdrh   sqlite3_value **argv
1785*9dbf96bdSdrh ){
1786*9dbf96bdSdrh   JsonParse x;          /* The parse */
1787*9dbf96bdSdrh   JsonNode *pNode;
1788*9dbf96bdSdrh   const char *zPath;
1789*9dbf96bdSdrh   u32 i;
1790*9dbf96bdSdrh 
1791*9dbf96bdSdrh   if( argc<1 ) return;
1792*9dbf96bdSdrh   if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return;
1793*9dbf96bdSdrh   assert( x.nNode );
1794*9dbf96bdSdrh   for(i=1; i<(u32)argc; i++){
1795*9dbf96bdSdrh     zPath = (const char*)sqlite3_value_text(argv[i]);
1796*9dbf96bdSdrh     if( zPath==0 ) goto remove_done;
1797*9dbf96bdSdrh     pNode = jsonLookup(&x, zPath, 0, ctx);
1798*9dbf96bdSdrh     if( x.nErr ) goto remove_done;
1799*9dbf96bdSdrh     if( pNode ) pNode->jnFlags |= JNODE_REMOVE;
1800*9dbf96bdSdrh   }
1801*9dbf96bdSdrh   if( (x.aNode[0].jnFlags & JNODE_REMOVE)==0 ){
1802*9dbf96bdSdrh     jsonReturnJson(x.aNode, ctx, 0);
1803*9dbf96bdSdrh   }
1804*9dbf96bdSdrh remove_done:
1805*9dbf96bdSdrh   jsonParseReset(&x);
1806*9dbf96bdSdrh }
1807*9dbf96bdSdrh 
1808*9dbf96bdSdrh /*
1809*9dbf96bdSdrh ** json_replace(JSON, PATH, VALUE, ...)
1810*9dbf96bdSdrh **
1811*9dbf96bdSdrh ** Replace the value at PATH with VALUE.  If PATH does not already exist,
1812*9dbf96bdSdrh ** this routine is a no-op.  If JSON or PATH is malformed, throw an error.
1813*9dbf96bdSdrh */
1814*9dbf96bdSdrh static void jsonReplaceFunc(
1815*9dbf96bdSdrh   sqlite3_context *ctx,
1816*9dbf96bdSdrh   int argc,
1817*9dbf96bdSdrh   sqlite3_value **argv
1818*9dbf96bdSdrh ){
1819*9dbf96bdSdrh   JsonParse x;          /* The parse */
1820*9dbf96bdSdrh   JsonNode *pNode;
1821*9dbf96bdSdrh   const char *zPath;
1822*9dbf96bdSdrh   u32 i;
1823*9dbf96bdSdrh 
1824*9dbf96bdSdrh   if( argc<1 ) return;
1825*9dbf96bdSdrh   if( (argc&1)==0 ) {
1826*9dbf96bdSdrh     jsonWrongNumArgs(ctx, "replace");
1827*9dbf96bdSdrh     return;
1828*9dbf96bdSdrh   }
1829*9dbf96bdSdrh   if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return;
1830*9dbf96bdSdrh   assert( x.nNode );
1831*9dbf96bdSdrh   for(i=1; i<(u32)argc; i+=2){
1832*9dbf96bdSdrh     zPath = (const char*)sqlite3_value_text(argv[i]);
1833*9dbf96bdSdrh     pNode = jsonLookup(&x, zPath, 0, ctx);
1834*9dbf96bdSdrh     if( x.nErr ) goto replace_err;
1835*9dbf96bdSdrh     if( pNode ){
1836*9dbf96bdSdrh       assert( pNode->eU==0 || pNode->eU==1 || pNode->eU==4 );
1837*9dbf96bdSdrh       testcase( pNode->eU!=0 && pNode->eU!=1 );
1838*9dbf96bdSdrh       pNode->jnFlags |= (u8)JNODE_REPLACE;
1839*9dbf96bdSdrh       VVA( pNode->eU =  4 );
1840*9dbf96bdSdrh       pNode->u.iReplace = i + 1;
1841*9dbf96bdSdrh     }
1842*9dbf96bdSdrh   }
1843*9dbf96bdSdrh   if( x.aNode[0].jnFlags & JNODE_REPLACE ){
1844*9dbf96bdSdrh     assert( x.aNode[0].eU==4 );
1845*9dbf96bdSdrh     sqlite3_result_value(ctx, argv[x.aNode[0].u.iReplace]);
1846*9dbf96bdSdrh   }else{
1847*9dbf96bdSdrh     jsonReturnJson(x.aNode, ctx, argv);
1848*9dbf96bdSdrh   }
1849*9dbf96bdSdrh replace_err:
1850*9dbf96bdSdrh   jsonParseReset(&x);
1851*9dbf96bdSdrh }
1852*9dbf96bdSdrh 
1853daefcd9eSdrh 
1854*9dbf96bdSdrh /*
1855*9dbf96bdSdrh ** json_set(JSON, PATH, VALUE, ...)
1856*9dbf96bdSdrh **
1857*9dbf96bdSdrh ** Set the value at PATH to VALUE.  Create the PATH if it does not already
1858*9dbf96bdSdrh ** exist.  Overwrite existing values that do exist.
1859*9dbf96bdSdrh ** If JSON or PATH is malformed, throw an error.
1860*9dbf96bdSdrh **
1861*9dbf96bdSdrh ** json_insert(JSON, PATH, VALUE, ...)
1862*9dbf96bdSdrh **
1863*9dbf96bdSdrh ** Create PATH and initialize it to VALUE.  If PATH already exists, this
1864*9dbf96bdSdrh ** routine is a no-op.  If JSON or PATH is malformed, throw an error.
1865*9dbf96bdSdrh */
1866*9dbf96bdSdrh static void jsonSetFunc(
1867*9dbf96bdSdrh   sqlite3_context *ctx,
1868*9dbf96bdSdrh   int argc,
1869*9dbf96bdSdrh   sqlite3_value **argv
1870*9dbf96bdSdrh ){
1871*9dbf96bdSdrh   JsonParse x;          /* The parse */
1872*9dbf96bdSdrh   JsonNode *pNode;
1873*9dbf96bdSdrh   const char *zPath;
1874*9dbf96bdSdrh   u32 i;
1875*9dbf96bdSdrh   int bApnd;
1876*9dbf96bdSdrh   int bIsSet = sqlite3_user_data(ctx)!=0;
1877*9dbf96bdSdrh 
1878*9dbf96bdSdrh   if( argc<1 ) return;
1879*9dbf96bdSdrh   if( (argc&1)==0 ) {
1880*9dbf96bdSdrh     jsonWrongNumArgs(ctx, bIsSet ? "set" : "insert");
1881*9dbf96bdSdrh     return;
1882*9dbf96bdSdrh   }
1883*9dbf96bdSdrh   if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return;
1884*9dbf96bdSdrh   assert( x.nNode );
1885*9dbf96bdSdrh   for(i=1; i<(u32)argc; i+=2){
1886*9dbf96bdSdrh     zPath = (const char*)sqlite3_value_text(argv[i]);
1887*9dbf96bdSdrh     bApnd = 0;
1888*9dbf96bdSdrh     pNode = jsonLookup(&x, zPath, &bApnd, ctx);
1889*9dbf96bdSdrh     if( x.oom ){
1890*9dbf96bdSdrh       sqlite3_result_error_nomem(ctx);
1891*9dbf96bdSdrh       goto jsonSetDone;
1892*9dbf96bdSdrh     }else if( x.nErr ){
1893*9dbf96bdSdrh       goto jsonSetDone;
1894*9dbf96bdSdrh     }else if( pNode && (bApnd || bIsSet) ){
1895*9dbf96bdSdrh       testcase( pNode->eU!=0 && pNode->eU!=1 && pNode->eU!=4 );
1896*9dbf96bdSdrh       assert( pNode->eU!=3 || pNode->eU!=5 );
1897*9dbf96bdSdrh       VVA( pNode->eU = 4 );
1898*9dbf96bdSdrh       pNode->jnFlags |= (u8)JNODE_REPLACE;
1899*9dbf96bdSdrh       pNode->u.iReplace = i + 1;
1900*9dbf96bdSdrh     }
1901*9dbf96bdSdrh   }
1902*9dbf96bdSdrh   if( x.aNode[0].jnFlags & JNODE_REPLACE ){
1903*9dbf96bdSdrh     assert( x.aNode[0].eU==4 );
1904*9dbf96bdSdrh     sqlite3_result_value(ctx, argv[x.aNode[0].u.iReplace]);
1905*9dbf96bdSdrh   }else{
1906*9dbf96bdSdrh     jsonReturnJson(x.aNode, ctx, argv);
1907*9dbf96bdSdrh   }
1908*9dbf96bdSdrh jsonSetDone:
1909*9dbf96bdSdrh   jsonParseReset(&x);
1910*9dbf96bdSdrh }
1911*9dbf96bdSdrh 
1912*9dbf96bdSdrh /*
1913*9dbf96bdSdrh ** json_type(JSON)
1914daefcd9eSdrh ** json_ntype(JSON)
1915*9dbf96bdSdrh ** json_type(JSON, PATH)
1916*9dbf96bdSdrh **
1917daefcd9eSdrh ** Return the top-level "type" of a JSON string.  json_type() raises an
1918daefcd9eSdrh ** error if either the JSON or PATH inputs are not well-formed.  json_ntype()
1919daefcd9eSdrh ** works like the one-argument version of json_type() except that it
1920daefcd9eSdrh ** returns NULL if the JSON argument is not well-formed.
1921*9dbf96bdSdrh */
1922*9dbf96bdSdrh static void jsonTypeFunc(
1923*9dbf96bdSdrh   sqlite3_context *ctx,
1924*9dbf96bdSdrh   int argc,
1925*9dbf96bdSdrh   sqlite3_value **argv
1926*9dbf96bdSdrh ){
1927*9dbf96bdSdrh   JsonParse *p;          /* The parse */
1928*9dbf96bdSdrh   const char *zPath;
1929*9dbf96bdSdrh   JsonNode *pNode;
1930*9dbf96bdSdrh 
1931daefcd9eSdrh   p = jsonParseCached(ctx, argv, sqlite3_user_data(ctx)!=0 ? 0 : ctx);
1932*9dbf96bdSdrh   if( p==0 ) return;
1933*9dbf96bdSdrh   if( argc==2 ){
1934*9dbf96bdSdrh     zPath = (const char*)sqlite3_value_text(argv[1]);
1935*9dbf96bdSdrh     pNode = jsonLookup(p, zPath, 0, ctx);
1936*9dbf96bdSdrh   }else{
1937*9dbf96bdSdrh     pNode = p->aNode;
1938*9dbf96bdSdrh   }
1939*9dbf96bdSdrh   if( pNode ){
1940*9dbf96bdSdrh     sqlite3_result_text(ctx, jsonType[pNode->eType], -1, SQLITE_STATIC);
1941*9dbf96bdSdrh   }
1942*9dbf96bdSdrh }
1943*9dbf96bdSdrh 
1944*9dbf96bdSdrh /*
1945*9dbf96bdSdrh ** json_valid(JSON)
1946*9dbf96bdSdrh **
1947*9dbf96bdSdrh ** Return 1 if JSON is a well-formed JSON string according to RFC-7159.
1948*9dbf96bdSdrh ** Return 0 otherwise.
1949*9dbf96bdSdrh */
1950*9dbf96bdSdrh static void jsonValidFunc(
1951*9dbf96bdSdrh   sqlite3_context *ctx,
1952*9dbf96bdSdrh   int argc,
1953*9dbf96bdSdrh   sqlite3_value **argv
1954*9dbf96bdSdrh ){
1955*9dbf96bdSdrh   JsonParse *p;          /* The parse */
1956*9dbf96bdSdrh   UNUSED_PARAMETER(argc);
1957*9dbf96bdSdrh   p = jsonParseCached(ctx, argv, 0);
1958*9dbf96bdSdrh   sqlite3_result_int(ctx, p!=0);
1959*9dbf96bdSdrh }
1960*9dbf96bdSdrh 
1961*9dbf96bdSdrh 
1962*9dbf96bdSdrh /****************************************************************************
1963*9dbf96bdSdrh ** Aggregate SQL function implementations
1964*9dbf96bdSdrh ****************************************************************************/
1965*9dbf96bdSdrh /*
1966*9dbf96bdSdrh ** json_group_array(VALUE)
1967*9dbf96bdSdrh **
1968*9dbf96bdSdrh ** Return a JSON array composed of all values in the aggregate.
1969*9dbf96bdSdrh */
1970*9dbf96bdSdrh static void jsonArrayStep(
1971*9dbf96bdSdrh   sqlite3_context *ctx,
1972*9dbf96bdSdrh   int argc,
1973*9dbf96bdSdrh   sqlite3_value **argv
1974*9dbf96bdSdrh ){
1975*9dbf96bdSdrh   JsonString *pStr;
1976*9dbf96bdSdrh   UNUSED_PARAMETER(argc);
1977*9dbf96bdSdrh   pStr = (JsonString*)sqlite3_aggregate_context(ctx, sizeof(*pStr));
1978*9dbf96bdSdrh   if( pStr ){
1979*9dbf96bdSdrh     if( pStr->zBuf==0 ){
1980*9dbf96bdSdrh       jsonInit(pStr, ctx);
1981*9dbf96bdSdrh       jsonAppendChar(pStr, '[');
1982*9dbf96bdSdrh     }else if( pStr->nUsed>1 ){
1983*9dbf96bdSdrh       jsonAppendChar(pStr, ',');
1984*9dbf96bdSdrh     }
1985*9dbf96bdSdrh     pStr->pCtx = ctx;
1986*9dbf96bdSdrh     jsonAppendValue(pStr, argv[0]);
1987*9dbf96bdSdrh   }
1988*9dbf96bdSdrh }
1989*9dbf96bdSdrh static void jsonArrayCompute(sqlite3_context *ctx, int isFinal){
1990*9dbf96bdSdrh   JsonString *pStr;
1991*9dbf96bdSdrh   pStr = (JsonString*)sqlite3_aggregate_context(ctx, 0);
1992*9dbf96bdSdrh   if( pStr ){
1993*9dbf96bdSdrh     pStr->pCtx = ctx;
1994*9dbf96bdSdrh     jsonAppendChar(pStr, ']');
1995*9dbf96bdSdrh     if( pStr->bErr ){
1996*9dbf96bdSdrh       if( pStr->bErr==1 ) sqlite3_result_error_nomem(ctx);
1997*9dbf96bdSdrh       assert( pStr->bStatic );
1998*9dbf96bdSdrh     }else if( isFinal ){
1999*9dbf96bdSdrh       sqlite3_result_text(ctx, pStr->zBuf, (int)pStr->nUsed,
2000*9dbf96bdSdrh                           pStr->bStatic ? SQLITE_TRANSIENT : sqlite3_free);
2001*9dbf96bdSdrh       pStr->bStatic = 1;
2002*9dbf96bdSdrh     }else{
2003*9dbf96bdSdrh       sqlite3_result_text(ctx, pStr->zBuf, (int)pStr->nUsed, SQLITE_TRANSIENT);
2004*9dbf96bdSdrh       pStr->nUsed--;
2005*9dbf96bdSdrh     }
2006*9dbf96bdSdrh   }else{
2007*9dbf96bdSdrh     sqlite3_result_text(ctx, "[]", 2, SQLITE_STATIC);
2008*9dbf96bdSdrh   }
2009*9dbf96bdSdrh   sqlite3_result_subtype(ctx, JSON_SUBTYPE);
2010*9dbf96bdSdrh }
2011*9dbf96bdSdrh static void jsonArrayValue(sqlite3_context *ctx){
2012*9dbf96bdSdrh   jsonArrayCompute(ctx, 0);
2013*9dbf96bdSdrh }
2014*9dbf96bdSdrh static void jsonArrayFinal(sqlite3_context *ctx){
2015*9dbf96bdSdrh   jsonArrayCompute(ctx, 1);
2016*9dbf96bdSdrh }
2017*9dbf96bdSdrh 
2018*9dbf96bdSdrh #ifndef SQLITE_OMIT_WINDOWFUNC
2019*9dbf96bdSdrh /*
2020*9dbf96bdSdrh ** This method works for both json_group_array() and json_group_object().
2021*9dbf96bdSdrh ** It works by removing the first element of the group by searching forward
2022*9dbf96bdSdrh ** to the first comma (",") that is not within a string and deleting all
2023*9dbf96bdSdrh ** text through that comma.
2024*9dbf96bdSdrh */
2025*9dbf96bdSdrh static void jsonGroupInverse(
2026*9dbf96bdSdrh   sqlite3_context *ctx,
2027*9dbf96bdSdrh   int argc,
2028*9dbf96bdSdrh   sqlite3_value **argv
2029*9dbf96bdSdrh ){
2030*9dbf96bdSdrh   unsigned int i;
2031*9dbf96bdSdrh   int inStr = 0;
2032*9dbf96bdSdrh   int nNest = 0;
2033*9dbf96bdSdrh   char *z;
2034*9dbf96bdSdrh   char c;
2035*9dbf96bdSdrh   JsonString *pStr;
2036*9dbf96bdSdrh   UNUSED_PARAMETER(argc);
2037*9dbf96bdSdrh   UNUSED_PARAMETER(argv);
2038*9dbf96bdSdrh   pStr = (JsonString*)sqlite3_aggregate_context(ctx, 0);
2039*9dbf96bdSdrh #ifdef NEVER
2040*9dbf96bdSdrh   /* pStr is always non-NULL since jsonArrayStep() or jsonObjectStep() will
2041*9dbf96bdSdrh   ** always have been called to initalize it */
2042*9dbf96bdSdrh   if( NEVER(!pStr) ) return;
2043*9dbf96bdSdrh #endif
2044*9dbf96bdSdrh   z = pStr->zBuf;
2045*9dbf96bdSdrh   for(i=1; i<pStr->nUsed && ((c = z[i])!=',' || inStr || nNest); i++){
2046*9dbf96bdSdrh     if( c=='"' ){
2047*9dbf96bdSdrh       inStr = !inStr;
2048*9dbf96bdSdrh     }else if( c=='\\' ){
2049*9dbf96bdSdrh       i++;
2050*9dbf96bdSdrh     }else if( !inStr ){
2051*9dbf96bdSdrh       if( c=='{' || c=='[' ) nNest++;
2052*9dbf96bdSdrh       if( c=='}' || c==']' ) nNest--;
2053*9dbf96bdSdrh     }
2054*9dbf96bdSdrh   }
2055*9dbf96bdSdrh   if( i<pStr->nUsed ){
2056*9dbf96bdSdrh     pStr->nUsed -= i;
2057*9dbf96bdSdrh     memmove(&z[1], &z[i+1], (size_t)pStr->nUsed-1);
2058*9dbf96bdSdrh     z[pStr->nUsed] = 0;
2059*9dbf96bdSdrh   }else{
2060*9dbf96bdSdrh     pStr->nUsed = 1;
2061*9dbf96bdSdrh   }
2062*9dbf96bdSdrh }
2063*9dbf96bdSdrh #else
2064*9dbf96bdSdrh # define jsonGroupInverse 0
2065*9dbf96bdSdrh #endif
2066*9dbf96bdSdrh 
2067*9dbf96bdSdrh 
2068*9dbf96bdSdrh /*
2069*9dbf96bdSdrh ** json_group_obj(NAME,VALUE)
2070*9dbf96bdSdrh **
2071*9dbf96bdSdrh ** Return a JSON object composed of all names and values in the aggregate.
2072*9dbf96bdSdrh */
2073*9dbf96bdSdrh static void jsonObjectStep(
2074*9dbf96bdSdrh   sqlite3_context *ctx,
2075*9dbf96bdSdrh   int argc,
2076*9dbf96bdSdrh   sqlite3_value **argv
2077*9dbf96bdSdrh ){
2078*9dbf96bdSdrh   JsonString *pStr;
2079*9dbf96bdSdrh   const char *z;
2080*9dbf96bdSdrh   u32 n;
2081*9dbf96bdSdrh   UNUSED_PARAMETER(argc);
2082*9dbf96bdSdrh   pStr = (JsonString*)sqlite3_aggregate_context(ctx, sizeof(*pStr));
2083*9dbf96bdSdrh   if( pStr ){
2084*9dbf96bdSdrh     if( pStr->zBuf==0 ){
2085*9dbf96bdSdrh       jsonInit(pStr, ctx);
2086*9dbf96bdSdrh       jsonAppendChar(pStr, '{');
2087*9dbf96bdSdrh     }else if( pStr->nUsed>1 ){
2088*9dbf96bdSdrh       jsonAppendChar(pStr, ',');
2089*9dbf96bdSdrh     }
2090*9dbf96bdSdrh     pStr->pCtx = ctx;
2091*9dbf96bdSdrh     z = (const char*)sqlite3_value_text(argv[0]);
2092*9dbf96bdSdrh     n = (u32)sqlite3_value_bytes(argv[0]);
2093*9dbf96bdSdrh     jsonAppendString(pStr, z, n);
2094*9dbf96bdSdrh     jsonAppendChar(pStr, ':');
2095*9dbf96bdSdrh     jsonAppendValue(pStr, argv[1]);
2096*9dbf96bdSdrh   }
2097*9dbf96bdSdrh }
2098*9dbf96bdSdrh static void jsonObjectCompute(sqlite3_context *ctx, int isFinal){
2099*9dbf96bdSdrh   JsonString *pStr;
2100*9dbf96bdSdrh   pStr = (JsonString*)sqlite3_aggregate_context(ctx, 0);
2101*9dbf96bdSdrh   if( pStr ){
2102*9dbf96bdSdrh     jsonAppendChar(pStr, '}');
2103*9dbf96bdSdrh     if( pStr->bErr ){
2104*9dbf96bdSdrh       if( pStr->bErr==1 ) sqlite3_result_error_nomem(ctx);
2105*9dbf96bdSdrh       assert( pStr->bStatic );
2106*9dbf96bdSdrh     }else if( isFinal ){
2107*9dbf96bdSdrh       sqlite3_result_text(ctx, pStr->zBuf, (int)pStr->nUsed,
2108*9dbf96bdSdrh                           pStr->bStatic ? SQLITE_TRANSIENT : sqlite3_free);
2109*9dbf96bdSdrh       pStr->bStatic = 1;
2110*9dbf96bdSdrh     }else{
2111*9dbf96bdSdrh       sqlite3_result_text(ctx, pStr->zBuf, (int)pStr->nUsed, SQLITE_TRANSIENT);
2112*9dbf96bdSdrh       pStr->nUsed--;
2113*9dbf96bdSdrh     }
2114*9dbf96bdSdrh   }else{
2115*9dbf96bdSdrh     sqlite3_result_text(ctx, "{}", 2, SQLITE_STATIC);
2116*9dbf96bdSdrh   }
2117*9dbf96bdSdrh   sqlite3_result_subtype(ctx, JSON_SUBTYPE);
2118*9dbf96bdSdrh }
2119*9dbf96bdSdrh static void jsonObjectValue(sqlite3_context *ctx){
2120*9dbf96bdSdrh   jsonObjectCompute(ctx, 0);
2121*9dbf96bdSdrh }
2122*9dbf96bdSdrh static void jsonObjectFinal(sqlite3_context *ctx){
2123*9dbf96bdSdrh   jsonObjectCompute(ctx, 1);
2124*9dbf96bdSdrh }
2125*9dbf96bdSdrh 
2126*9dbf96bdSdrh 
2127*9dbf96bdSdrh 
2128*9dbf96bdSdrh #ifndef SQLITE_OMIT_VIRTUALTABLE
2129*9dbf96bdSdrh /****************************************************************************
2130*9dbf96bdSdrh ** The json_each virtual table
2131*9dbf96bdSdrh ****************************************************************************/
2132*9dbf96bdSdrh typedef struct JsonEachCursor JsonEachCursor;
2133*9dbf96bdSdrh struct JsonEachCursor {
2134*9dbf96bdSdrh   sqlite3_vtab_cursor base;  /* Base class - must be first */
2135*9dbf96bdSdrh   u32 iRowid;                /* The rowid */
2136*9dbf96bdSdrh   u32 iBegin;                /* The first node of the scan */
2137*9dbf96bdSdrh   u32 i;                     /* Index in sParse.aNode[] of current row */
2138*9dbf96bdSdrh   u32 iEnd;                  /* EOF when i equals or exceeds this value */
2139*9dbf96bdSdrh   u8 eType;                  /* Type of top-level element */
2140*9dbf96bdSdrh   u8 bRecursive;             /* True for json_tree().  False for json_each() */
2141*9dbf96bdSdrh   char *zJson;               /* Input JSON */
2142*9dbf96bdSdrh   char *zRoot;               /* Path by which to filter zJson */
2143*9dbf96bdSdrh   JsonParse sParse;          /* Parse of the input JSON */
2144*9dbf96bdSdrh };
2145*9dbf96bdSdrh 
2146*9dbf96bdSdrh /* Constructor for the json_each virtual table */
2147*9dbf96bdSdrh static int jsonEachConnect(
2148*9dbf96bdSdrh   sqlite3 *db,
2149*9dbf96bdSdrh   void *pAux,
2150*9dbf96bdSdrh   int argc, const char *const*argv,
2151*9dbf96bdSdrh   sqlite3_vtab **ppVtab,
2152*9dbf96bdSdrh   char **pzErr
2153*9dbf96bdSdrh ){
2154*9dbf96bdSdrh   sqlite3_vtab *pNew;
2155*9dbf96bdSdrh   int rc;
2156*9dbf96bdSdrh 
2157*9dbf96bdSdrh /* Column numbers */
2158*9dbf96bdSdrh #define JEACH_KEY     0
2159*9dbf96bdSdrh #define JEACH_VALUE   1
2160*9dbf96bdSdrh #define JEACH_TYPE    2
2161*9dbf96bdSdrh #define JEACH_ATOM    3
2162*9dbf96bdSdrh #define JEACH_ID      4
2163*9dbf96bdSdrh #define JEACH_PARENT  5
2164*9dbf96bdSdrh #define JEACH_FULLKEY 6
2165*9dbf96bdSdrh #define JEACH_PATH    7
2166*9dbf96bdSdrh /* The xBestIndex method assumes that the JSON and ROOT columns are
2167*9dbf96bdSdrh ** the last two columns in the table.  Should this ever changes, be
2168*9dbf96bdSdrh ** sure to update the xBestIndex method. */
2169*9dbf96bdSdrh #define JEACH_JSON    8
2170*9dbf96bdSdrh #define JEACH_ROOT    9
2171*9dbf96bdSdrh 
2172*9dbf96bdSdrh   UNUSED_PARAMETER(pzErr);
2173*9dbf96bdSdrh   UNUSED_PARAMETER(argv);
2174*9dbf96bdSdrh   UNUSED_PARAMETER(argc);
2175*9dbf96bdSdrh   UNUSED_PARAMETER(pAux);
2176*9dbf96bdSdrh   rc = sqlite3_declare_vtab(db,
2177*9dbf96bdSdrh      "CREATE TABLE x(key,value,type,atom,id,parent,fullkey,path,"
2178*9dbf96bdSdrh                     "json HIDDEN,root HIDDEN)");
2179*9dbf96bdSdrh   if( rc==SQLITE_OK ){
2180*9dbf96bdSdrh     pNew = *ppVtab = sqlite3_malloc( sizeof(*pNew) );
2181*9dbf96bdSdrh     if( pNew==0 ) return SQLITE_NOMEM;
2182*9dbf96bdSdrh     memset(pNew, 0, sizeof(*pNew));
2183*9dbf96bdSdrh     sqlite3_vtab_config(db, SQLITE_VTAB_INNOCUOUS);
2184*9dbf96bdSdrh   }
2185*9dbf96bdSdrh   return rc;
2186*9dbf96bdSdrh }
2187*9dbf96bdSdrh 
2188*9dbf96bdSdrh /* destructor for json_each virtual table */
2189*9dbf96bdSdrh static int jsonEachDisconnect(sqlite3_vtab *pVtab){
2190*9dbf96bdSdrh   sqlite3_free(pVtab);
2191*9dbf96bdSdrh   return SQLITE_OK;
2192*9dbf96bdSdrh }
2193*9dbf96bdSdrh 
2194*9dbf96bdSdrh /* constructor for a JsonEachCursor object for json_each(). */
2195*9dbf96bdSdrh static int jsonEachOpenEach(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){
2196*9dbf96bdSdrh   JsonEachCursor *pCur;
2197*9dbf96bdSdrh 
2198*9dbf96bdSdrh   UNUSED_PARAMETER(p);
2199*9dbf96bdSdrh   pCur = sqlite3_malloc( sizeof(*pCur) );
2200*9dbf96bdSdrh   if( pCur==0 ) return SQLITE_NOMEM;
2201*9dbf96bdSdrh   memset(pCur, 0, sizeof(*pCur));
2202*9dbf96bdSdrh   *ppCursor = &pCur->base;
2203*9dbf96bdSdrh   return SQLITE_OK;
2204*9dbf96bdSdrh }
2205*9dbf96bdSdrh 
2206*9dbf96bdSdrh /* constructor for a JsonEachCursor object for json_tree(). */
2207*9dbf96bdSdrh static int jsonEachOpenTree(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){
2208*9dbf96bdSdrh   int rc = jsonEachOpenEach(p, ppCursor);
2209*9dbf96bdSdrh   if( rc==SQLITE_OK ){
2210*9dbf96bdSdrh     JsonEachCursor *pCur = (JsonEachCursor*)*ppCursor;
2211*9dbf96bdSdrh     pCur->bRecursive = 1;
2212*9dbf96bdSdrh   }
2213*9dbf96bdSdrh   return rc;
2214*9dbf96bdSdrh }
2215*9dbf96bdSdrh 
2216*9dbf96bdSdrh /* Reset a JsonEachCursor back to its original state.  Free any memory
2217*9dbf96bdSdrh ** held. */
2218*9dbf96bdSdrh static void jsonEachCursorReset(JsonEachCursor *p){
2219*9dbf96bdSdrh   sqlite3_free(p->zJson);
2220*9dbf96bdSdrh   sqlite3_free(p->zRoot);
2221*9dbf96bdSdrh   jsonParseReset(&p->sParse);
2222*9dbf96bdSdrh   p->iRowid = 0;
2223*9dbf96bdSdrh   p->i = 0;
2224*9dbf96bdSdrh   p->iEnd = 0;
2225*9dbf96bdSdrh   p->eType = 0;
2226*9dbf96bdSdrh   p->zJson = 0;
2227*9dbf96bdSdrh   p->zRoot = 0;
2228*9dbf96bdSdrh }
2229*9dbf96bdSdrh 
2230*9dbf96bdSdrh /* Destructor for a jsonEachCursor object */
2231*9dbf96bdSdrh static int jsonEachClose(sqlite3_vtab_cursor *cur){
2232*9dbf96bdSdrh   JsonEachCursor *p = (JsonEachCursor*)cur;
2233*9dbf96bdSdrh   jsonEachCursorReset(p);
2234*9dbf96bdSdrh   sqlite3_free(cur);
2235*9dbf96bdSdrh   return SQLITE_OK;
2236*9dbf96bdSdrh }
2237*9dbf96bdSdrh 
2238*9dbf96bdSdrh /* Return TRUE if the jsonEachCursor object has been advanced off the end
2239*9dbf96bdSdrh ** of the JSON object */
2240*9dbf96bdSdrh static int jsonEachEof(sqlite3_vtab_cursor *cur){
2241*9dbf96bdSdrh   JsonEachCursor *p = (JsonEachCursor*)cur;
2242*9dbf96bdSdrh   return p->i >= p->iEnd;
2243*9dbf96bdSdrh }
2244*9dbf96bdSdrh 
2245*9dbf96bdSdrh /* Advance the cursor to the next element for json_tree() */
2246*9dbf96bdSdrh static int jsonEachNext(sqlite3_vtab_cursor *cur){
2247*9dbf96bdSdrh   JsonEachCursor *p = (JsonEachCursor*)cur;
2248*9dbf96bdSdrh   if( p->bRecursive ){
2249*9dbf96bdSdrh     if( p->sParse.aNode[p->i].jnFlags & JNODE_LABEL ) p->i++;
2250*9dbf96bdSdrh     p->i++;
2251*9dbf96bdSdrh     p->iRowid++;
2252*9dbf96bdSdrh     if( p->i<p->iEnd ){
2253*9dbf96bdSdrh       u32 iUp = p->sParse.aUp[p->i];
2254*9dbf96bdSdrh       JsonNode *pUp = &p->sParse.aNode[iUp];
2255*9dbf96bdSdrh       p->eType = pUp->eType;
2256*9dbf96bdSdrh       if( pUp->eType==JSON_ARRAY ){
2257*9dbf96bdSdrh         assert( pUp->eU==0 || pUp->eU==3 );
2258*9dbf96bdSdrh         testcase( pUp->eU==3 );
2259*9dbf96bdSdrh         VVA( pUp->eU = 3 );
2260*9dbf96bdSdrh         if( iUp==p->i-1 ){
2261*9dbf96bdSdrh           pUp->u.iKey = 0;
2262*9dbf96bdSdrh         }else{
2263*9dbf96bdSdrh           pUp->u.iKey++;
2264*9dbf96bdSdrh         }
2265*9dbf96bdSdrh       }
2266*9dbf96bdSdrh     }
2267*9dbf96bdSdrh   }else{
2268*9dbf96bdSdrh     switch( p->eType ){
2269*9dbf96bdSdrh       case JSON_ARRAY: {
2270*9dbf96bdSdrh         p->i += jsonNodeSize(&p->sParse.aNode[p->i]);
2271*9dbf96bdSdrh         p->iRowid++;
2272*9dbf96bdSdrh         break;
2273*9dbf96bdSdrh       }
2274*9dbf96bdSdrh       case JSON_OBJECT: {
2275*9dbf96bdSdrh         p->i += 1 + jsonNodeSize(&p->sParse.aNode[p->i+1]);
2276*9dbf96bdSdrh         p->iRowid++;
2277*9dbf96bdSdrh         break;
2278*9dbf96bdSdrh       }
2279*9dbf96bdSdrh       default: {
2280*9dbf96bdSdrh         p->i = p->iEnd;
2281*9dbf96bdSdrh         break;
2282*9dbf96bdSdrh       }
2283*9dbf96bdSdrh     }
2284*9dbf96bdSdrh   }
2285*9dbf96bdSdrh   return SQLITE_OK;
2286*9dbf96bdSdrh }
2287*9dbf96bdSdrh 
2288*9dbf96bdSdrh /* Append the name of the path for element i to pStr
2289*9dbf96bdSdrh */
2290*9dbf96bdSdrh static void jsonEachComputePath(
2291*9dbf96bdSdrh   JsonEachCursor *p,       /* The cursor */
2292*9dbf96bdSdrh   JsonString *pStr,        /* Write the path here */
2293*9dbf96bdSdrh   u32 i                    /* Path to this element */
2294*9dbf96bdSdrh ){
2295*9dbf96bdSdrh   JsonNode *pNode, *pUp;
2296*9dbf96bdSdrh   u32 iUp;
2297*9dbf96bdSdrh   if( i==0 ){
2298*9dbf96bdSdrh     jsonAppendChar(pStr, '$');
2299*9dbf96bdSdrh     return;
2300*9dbf96bdSdrh   }
2301*9dbf96bdSdrh   iUp = p->sParse.aUp[i];
2302*9dbf96bdSdrh   jsonEachComputePath(p, pStr, iUp);
2303*9dbf96bdSdrh   pNode = &p->sParse.aNode[i];
2304*9dbf96bdSdrh   pUp = &p->sParse.aNode[iUp];
2305*9dbf96bdSdrh   if( pUp->eType==JSON_ARRAY ){
2306*9dbf96bdSdrh     assert( pUp->eU==3 || (pUp->eU==0 && pUp->u.iKey==0) );
2307*9dbf96bdSdrh     testcase( pUp->eU==0 );
2308*9dbf96bdSdrh     jsonPrintf(30, pStr, "[%d]", pUp->u.iKey);
2309*9dbf96bdSdrh   }else{
2310*9dbf96bdSdrh     assert( pUp->eType==JSON_OBJECT );
2311*9dbf96bdSdrh     if( (pNode->jnFlags & JNODE_LABEL)==0 ) pNode--;
2312*9dbf96bdSdrh     assert( pNode->eType==JSON_STRING );
2313*9dbf96bdSdrh     assert( pNode->jnFlags & JNODE_LABEL );
2314*9dbf96bdSdrh     assert( pNode->eU==1 );
2315*9dbf96bdSdrh     jsonPrintf(pNode->n+1, pStr, ".%.*s", pNode->n-2, pNode->u.zJContent+1);
2316*9dbf96bdSdrh   }
2317*9dbf96bdSdrh }
2318*9dbf96bdSdrh 
2319*9dbf96bdSdrh /* Return the value of a column */
2320*9dbf96bdSdrh static int jsonEachColumn(
2321*9dbf96bdSdrh   sqlite3_vtab_cursor *cur,   /* The cursor */
2322*9dbf96bdSdrh   sqlite3_context *ctx,       /* First argument to sqlite3_result_...() */
2323*9dbf96bdSdrh   int i                       /* Which column to return */
2324*9dbf96bdSdrh ){
2325*9dbf96bdSdrh   JsonEachCursor *p = (JsonEachCursor*)cur;
2326*9dbf96bdSdrh   JsonNode *pThis = &p->sParse.aNode[p->i];
2327*9dbf96bdSdrh   switch( i ){
2328*9dbf96bdSdrh     case JEACH_KEY: {
2329*9dbf96bdSdrh       if( p->i==0 ) break;
2330*9dbf96bdSdrh       if( p->eType==JSON_OBJECT ){
2331*9dbf96bdSdrh         jsonReturn(pThis, ctx, 0);
2332*9dbf96bdSdrh       }else if( p->eType==JSON_ARRAY ){
2333*9dbf96bdSdrh         u32 iKey;
2334*9dbf96bdSdrh         if( p->bRecursive ){
2335*9dbf96bdSdrh           if( p->iRowid==0 ) break;
2336*9dbf96bdSdrh           assert( p->sParse.aNode[p->sParse.aUp[p->i]].eU==3 );
2337*9dbf96bdSdrh           iKey = p->sParse.aNode[p->sParse.aUp[p->i]].u.iKey;
2338*9dbf96bdSdrh         }else{
2339*9dbf96bdSdrh           iKey = p->iRowid;
2340*9dbf96bdSdrh         }
2341*9dbf96bdSdrh         sqlite3_result_int64(ctx, (sqlite3_int64)iKey);
2342*9dbf96bdSdrh       }
2343*9dbf96bdSdrh       break;
2344*9dbf96bdSdrh     }
2345*9dbf96bdSdrh     case JEACH_VALUE: {
2346*9dbf96bdSdrh       if( pThis->jnFlags & JNODE_LABEL ) pThis++;
2347*9dbf96bdSdrh       jsonReturn(pThis, ctx, 0);
2348*9dbf96bdSdrh       break;
2349*9dbf96bdSdrh     }
2350*9dbf96bdSdrh     case JEACH_TYPE: {
2351*9dbf96bdSdrh       if( pThis->jnFlags & JNODE_LABEL ) pThis++;
2352*9dbf96bdSdrh       sqlite3_result_text(ctx, jsonType[pThis->eType], -1, SQLITE_STATIC);
2353*9dbf96bdSdrh       break;
2354*9dbf96bdSdrh     }
2355*9dbf96bdSdrh     case JEACH_ATOM: {
2356*9dbf96bdSdrh       if( pThis->jnFlags & JNODE_LABEL ) pThis++;
2357*9dbf96bdSdrh       if( pThis->eType>=JSON_ARRAY ) break;
2358*9dbf96bdSdrh       jsonReturn(pThis, ctx, 0);
2359*9dbf96bdSdrh       break;
2360*9dbf96bdSdrh     }
2361*9dbf96bdSdrh     case JEACH_ID: {
2362*9dbf96bdSdrh       sqlite3_result_int64(ctx,
2363*9dbf96bdSdrh          (sqlite3_int64)p->i + ((pThis->jnFlags & JNODE_LABEL)!=0));
2364*9dbf96bdSdrh       break;
2365*9dbf96bdSdrh     }
2366*9dbf96bdSdrh     case JEACH_PARENT: {
2367*9dbf96bdSdrh       if( p->i>p->iBegin && p->bRecursive ){
2368*9dbf96bdSdrh         sqlite3_result_int64(ctx, (sqlite3_int64)p->sParse.aUp[p->i]);
2369*9dbf96bdSdrh       }
2370*9dbf96bdSdrh       break;
2371*9dbf96bdSdrh     }
2372*9dbf96bdSdrh     case JEACH_FULLKEY: {
2373*9dbf96bdSdrh       JsonString x;
2374*9dbf96bdSdrh       jsonInit(&x, ctx);
2375*9dbf96bdSdrh       if( p->bRecursive ){
2376*9dbf96bdSdrh         jsonEachComputePath(p, &x, p->i);
2377*9dbf96bdSdrh       }else{
2378*9dbf96bdSdrh         if( p->zRoot ){
2379*9dbf96bdSdrh           jsonAppendRaw(&x, p->zRoot, (int)strlen(p->zRoot));
2380*9dbf96bdSdrh         }else{
2381*9dbf96bdSdrh           jsonAppendChar(&x, '$');
2382*9dbf96bdSdrh         }
2383*9dbf96bdSdrh         if( p->eType==JSON_ARRAY ){
2384*9dbf96bdSdrh           jsonPrintf(30, &x, "[%d]", p->iRowid);
2385*9dbf96bdSdrh         }else if( p->eType==JSON_OBJECT ){
2386*9dbf96bdSdrh           assert( pThis->eU==1 );
2387*9dbf96bdSdrh           jsonPrintf(pThis->n, &x, ".%.*s", pThis->n-2, pThis->u.zJContent+1);
2388*9dbf96bdSdrh         }
2389*9dbf96bdSdrh       }
2390*9dbf96bdSdrh       jsonResult(&x);
2391*9dbf96bdSdrh       break;
2392*9dbf96bdSdrh     }
2393*9dbf96bdSdrh     case JEACH_PATH: {
2394*9dbf96bdSdrh       if( p->bRecursive ){
2395*9dbf96bdSdrh         JsonString x;
2396*9dbf96bdSdrh         jsonInit(&x, ctx);
2397*9dbf96bdSdrh         jsonEachComputePath(p, &x, p->sParse.aUp[p->i]);
2398*9dbf96bdSdrh         jsonResult(&x);
2399*9dbf96bdSdrh         break;
2400*9dbf96bdSdrh       }
2401*9dbf96bdSdrh       /* For json_each() path and root are the same so fall through
2402*9dbf96bdSdrh       ** into the root case */
2403*9dbf96bdSdrh       /* no break */ deliberate_fall_through
2404*9dbf96bdSdrh     }
2405*9dbf96bdSdrh     default: {
2406*9dbf96bdSdrh       const char *zRoot = p->zRoot;
2407*9dbf96bdSdrh       if( zRoot==0 ) zRoot = "$";
2408*9dbf96bdSdrh       sqlite3_result_text(ctx, zRoot, -1, SQLITE_STATIC);
2409*9dbf96bdSdrh       break;
2410*9dbf96bdSdrh     }
2411*9dbf96bdSdrh     case JEACH_JSON: {
2412*9dbf96bdSdrh       assert( i==JEACH_JSON );
2413*9dbf96bdSdrh       sqlite3_result_text(ctx, p->sParse.zJson, -1, SQLITE_STATIC);
2414*9dbf96bdSdrh       break;
2415*9dbf96bdSdrh     }
2416*9dbf96bdSdrh   }
2417*9dbf96bdSdrh   return SQLITE_OK;
2418*9dbf96bdSdrh }
2419*9dbf96bdSdrh 
2420*9dbf96bdSdrh /* Return the current rowid value */
2421*9dbf96bdSdrh static int jsonEachRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
2422*9dbf96bdSdrh   JsonEachCursor *p = (JsonEachCursor*)cur;
2423*9dbf96bdSdrh   *pRowid = p->iRowid;
2424*9dbf96bdSdrh   return SQLITE_OK;
2425*9dbf96bdSdrh }
2426*9dbf96bdSdrh 
2427*9dbf96bdSdrh /* The query strategy is to look for an equality constraint on the json
2428*9dbf96bdSdrh ** column.  Without such a constraint, the table cannot operate.  idxNum is
2429*9dbf96bdSdrh ** 1 if the constraint is found, 3 if the constraint and zRoot are found,
2430*9dbf96bdSdrh ** and 0 otherwise.
2431*9dbf96bdSdrh */
2432*9dbf96bdSdrh static int jsonEachBestIndex(
2433*9dbf96bdSdrh   sqlite3_vtab *tab,
2434*9dbf96bdSdrh   sqlite3_index_info *pIdxInfo
2435*9dbf96bdSdrh ){
2436*9dbf96bdSdrh   int i;                     /* Loop counter or computed array index */
2437*9dbf96bdSdrh   int aIdx[2];               /* Index of constraints for JSON and ROOT */
2438*9dbf96bdSdrh   int unusableMask = 0;      /* Mask of unusable JSON and ROOT constraints */
2439*9dbf96bdSdrh   int idxMask = 0;           /* Mask of usable == constraints JSON and ROOT */
2440*9dbf96bdSdrh   const struct sqlite3_index_constraint *pConstraint;
2441*9dbf96bdSdrh 
2442*9dbf96bdSdrh   /* This implementation assumes that JSON and ROOT are the last two
2443*9dbf96bdSdrh   ** columns in the table */
2444*9dbf96bdSdrh   assert( JEACH_ROOT == JEACH_JSON+1 );
2445*9dbf96bdSdrh   UNUSED_PARAMETER(tab);
2446*9dbf96bdSdrh   aIdx[0] = aIdx[1] = -1;
2447*9dbf96bdSdrh   pConstraint = pIdxInfo->aConstraint;
2448*9dbf96bdSdrh   for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){
2449*9dbf96bdSdrh     int iCol;
2450*9dbf96bdSdrh     int iMask;
2451*9dbf96bdSdrh     if( pConstraint->iColumn < JEACH_JSON ) continue;
2452*9dbf96bdSdrh     iCol = pConstraint->iColumn - JEACH_JSON;
2453*9dbf96bdSdrh     assert( iCol==0 || iCol==1 );
2454*9dbf96bdSdrh     testcase( iCol==0 );
2455*9dbf96bdSdrh     iMask = 1 << iCol;
2456*9dbf96bdSdrh     if( pConstraint->usable==0 ){
2457*9dbf96bdSdrh       unusableMask |= iMask;
2458*9dbf96bdSdrh     }else if( pConstraint->op==SQLITE_INDEX_CONSTRAINT_EQ ){
2459*9dbf96bdSdrh       aIdx[iCol] = i;
2460*9dbf96bdSdrh       idxMask |= iMask;
2461*9dbf96bdSdrh     }
2462*9dbf96bdSdrh   }
2463*9dbf96bdSdrh   if( (unusableMask & ~idxMask)!=0 ){
2464*9dbf96bdSdrh     /* If there are any unusable constraints on JSON or ROOT, then reject
2465*9dbf96bdSdrh     ** this entire plan */
2466*9dbf96bdSdrh     return SQLITE_CONSTRAINT;
2467*9dbf96bdSdrh   }
2468*9dbf96bdSdrh   if( aIdx[0]<0 ){
2469*9dbf96bdSdrh     /* No JSON input.  Leave estimatedCost at the huge value that it was
2470*9dbf96bdSdrh     ** initialized to to discourage the query planner from selecting this
2471*9dbf96bdSdrh     ** plan. */
2472*9dbf96bdSdrh     pIdxInfo->idxNum = 0;
2473*9dbf96bdSdrh   }else{
2474*9dbf96bdSdrh     pIdxInfo->estimatedCost = 1.0;
2475*9dbf96bdSdrh     i = aIdx[0];
2476*9dbf96bdSdrh     pIdxInfo->aConstraintUsage[i].argvIndex = 1;
2477*9dbf96bdSdrh     pIdxInfo->aConstraintUsage[i].omit = 1;
2478*9dbf96bdSdrh     if( aIdx[1]<0 ){
2479*9dbf96bdSdrh       pIdxInfo->idxNum = 1;  /* Only JSON supplied.  Plan 1 */
2480*9dbf96bdSdrh     }else{
2481*9dbf96bdSdrh       i = aIdx[1];
2482*9dbf96bdSdrh       pIdxInfo->aConstraintUsage[i].argvIndex = 2;
2483*9dbf96bdSdrh       pIdxInfo->aConstraintUsage[i].omit = 1;
2484*9dbf96bdSdrh       pIdxInfo->idxNum = 3;  /* Both JSON and ROOT are supplied.  Plan 3 */
2485*9dbf96bdSdrh     }
2486*9dbf96bdSdrh   }
2487*9dbf96bdSdrh   return SQLITE_OK;
2488*9dbf96bdSdrh }
2489*9dbf96bdSdrh 
2490*9dbf96bdSdrh /* Start a search on a new JSON string */
2491*9dbf96bdSdrh static int jsonEachFilter(
2492*9dbf96bdSdrh   sqlite3_vtab_cursor *cur,
2493*9dbf96bdSdrh   int idxNum, const char *idxStr,
2494*9dbf96bdSdrh   int argc, sqlite3_value **argv
2495*9dbf96bdSdrh ){
2496*9dbf96bdSdrh   JsonEachCursor *p = (JsonEachCursor*)cur;
2497*9dbf96bdSdrh   const char *z;
2498*9dbf96bdSdrh   const char *zRoot = 0;
2499*9dbf96bdSdrh   sqlite3_int64 n;
2500*9dbf96bdSdrh 
2501*9dbf96bdSdrh   UNUSED_PARAMETER(idxStr);
2502*9dbf96bdSdrh   UNUSED_PARAMETER(argc);
2503*9dbf96bdSdrh   jsonEachCursorReset(p);
2504*9dbf96bdSdrh   if( idxNum==0 ) return SQLITE_OK;
2505*9dbf96bdSdrh   z = (const char*)sqlite3_value_text(argv[0]);
2506*9dbf96bdSdrh   if( z==0 ) return SQLITE_OK;
2507*9dbf96bdSdrh   n = sqlite3_value_bytes(argv[0]);
2508*9dbf96bdSdrh   p->zJson = sqlite3_malloc64( n+1 );
2509*9dbf96bdSdrh   if( p->zJson==0 ) return SQLITE_NOMEM;
2510*9dbf96bdSdrh   memcpy(p->zJson, z, (size_t)n+1);
2511*9dbf96bdSdrh   if( jsonParse(&p->sParse, 0, p->zJson) ){
2512*9dbf96bdSdrh     int rc = SQLITE_NOMEM;
2513*9dbf96bdSdrh     if( p->sParse.oom==0 ){
2514*9dbf96bdSdrh       sqlite3_free(cur->pVtab->zErrMsg);
2515*9dbf96bdSdrh       cur->pVtab->zErrMsg = sqlite3_mprintf("malformed JSON");
2516*9dbf96bdSdrh       if( cur->pVtab->zErrMsg ) rc = SQLITE_ERROR;
2517*9dbf96bdSdrh     }
2518*9dbf96bdSdrh     jsonEachCursorReset(p);
2519*9dbf96bdSdrh     return rc;
2520*9dbf96bdSdrh   }else if( p->bRecursive && jsonParseFindParents(&p->sParse) ){
2521*9dbf96bdSdrh     jsonEachCursorReset(p);
2522*9dbf96bdSdrh     return SQLITE_NOMEM;
2523*9dbf96bdSdrh   }else{
2524*9dbf96bdSdrh     JsonNode *pNode = 0;
2525*9dbf96bdSdrh     if( idxNum==3 ){
2526*9dbf96bdSdrh       const char *zErr = 0;
2527*9dbf96bdSdrh       zRoot = (const char*)sqlite3_value_text(argv[1]);
2528*9dbf96bdSdrh       if( zRoot==0 ) return SQLITE_OK;
2529*9dbf96bdSdrh       n = sqlite3_value_bytes(argv[1]);
2530*9dbf96bdSdrh       p->zRoot = sqlite3_malloc64( n+1 );
2531*9dbf96bdSdrh       if( p->zRoot==0 ) return SQLITE_NOMEM;
2532*9dbf96bdSdrh       memcpy(p->zRoot, zRoot, (size_t)n+1);
2533*9dbf96bdSdrh       if( zRoot[0]!='$' ){
2534*9dbf96bdSdrh         zErr = zRoot;
2535*9dbf96bdSdrh       }else{
2536*9dbf96bdSdrh         pNode = jsonLookupStep(&p->sParse, 0, p->zRoot+1, 0, &zErr);
2537*9dbf96bdSdrh       }
2538*9dbf96bdSdrh       if( zErr ){
2539*9dbf96bdSdrh         sqlite3_free(cur->pVtab->zErrMsg);
2540*9dbf96bdSdrh         cur->pVtab->zErrMsg = jsonPathSyntaxError(zErr);
2541*9dbf96bdSdrh         jsonEachCursorReset(p);
2542*9dbf96bdSdrh         return cur->pVtab->zErrMsg ? SQLITE_ERROR : SQLITE_NOMEM;
2543*9dbf96bdSdrh       }else if( pNode==0 ){
2544*9dbf96bdSdrh         return SQLITE_OK;
2545*9dbf96bdSdrh       }
2546*9dbf96bdSdrh     }else{
2547*9dbf96bdSdrh       pNode = p->sParse.aNode;
2548*9dbf96bdSdrh     }
2549*9dbf96bdSdrh     p->iBegin = p->i = (int)(pNode - p->sParse.aNode);
2550*9dbf96bdSdrh     p->eType = pNode->eType;
2551*9dbf96bdSdrh     if( p->eType>=JSON_ARRAY ){
2552*9dbf96bdSdrh       assert( pNode->eU==0 );
2553*9dbf96bdSdrh       VVA( pNode->eU = 3 );
2554*9dbf96bdSdrh       pNode->u.iKey = 0;
2555*9dbf96bdSdrh       p->iEnd = p->i + pNode->n + 1;
2556*9dbf96bdSdrh       if( p->bRecursive ){
2557*9dbf96bdSdrh         p->eType = p->sParse.aNode[p->sParse.aUp[p->i]].eType;
2558*9dbf96bdSdrh         if( p->i>0 && (p->sParse.aNode[p->i-1].jnFlags & JNODE_LABEL)!=0 ){
2559*9dbf96bdSdrh           p->i--;
2560*9dbf96bdSdrh         }
2561*9dbf96bdSdrh       }else{
2562*9dbf96bdSdrh         p->i++;
2563*9dbf96bdSdrh       }
2564*9dbf96bdSdrh     }else{
2565*9dbf96bdSdrh       p->iEnd = p->i+1;
2566*9dbf96bdSdrh     }
2567*9dbf96bdSdrh   }
2568*9dbf96bdSdrh   return SQLITE_OK;
2569*9dbf96bdSdrh }
2570*9dbf96bdSdrh 
2571*9dbf96bdSdrh /* The methods of the json_each virtual table */
2572*9dbf96bdSdrh static sqlite3_module jsonEachModule = {
2573*9dbf96bdSdrh   0,                         /* iVersion */
2574*9dbf96bdSdrh   0,                         /* xCreate */
2575*9dbf96bdSdrh   jsonEachConnect,           /* xConnect */
2576*9dbf96bdSdrh   jsonEachBestIndex,         /* xBestIndex */
2577*9dbf96bdSdrh   jsonEachDisconnect,        /* xDisconnect */
2578*9dbf96bdSdrh   0,                         /* xDestroy */
2579*9dbf96bdSdrh   jsonEachOpenEach,          /* xOpen - open a cursor */
2580*9dbf96bdSdrh   jsonEachClose,             /* xClose - close a cursor */
2581*9dbf96bdSdrh   jsonEachFilter,            /* xFilter - configure scan constraints */
2582*9dbf96bdSdrh   jsonEachNext,              /* xNext - advance a cursor */
2583*9dbf96bdSdrh   jsonEachEof,               /* xEof - check for end of scan */
2584*9dbf96bdSdrh   jsonEachColumn,            /* xColumn - read data */
2585*9dbf96bdSdrh   jsonEachRowid,             /* xRowid - read data */
2586*9dbf96bdSdrh   0,                         /* xUpdate */
2587*9dbf96bdSdrh   0,                         /* xBegin */
2588*9dbf96bdSdrh   0,                         /* xSync */
2589*9dbf96bdSdrh   0,                         /* xCommit */
2590*9dbf96bdSdrh   0,                         /* xRollback */
2591*9dbf96bdSdrh   0,                         /* xFindMethod */
2592*9dbf96bdSdrh   0,                         /* xRename */
2593*9dbf96bdSdrh   0,                         /* xSavepoint */
2594*9dbf96bdSdrh   0,                         /* xRelease */
2595*9dbf96bdSdrh   0,                         /* xRollbackTo */
2596*9dbf96bdSdrh   0                          /* xShadowName */
2597*9dbf96bdSdrh };
2598*9dbf96bdSdrh 
2599*9dbf96bdSdrh /* The methods of the json_tree virtual table. */
2600*9dbf96bdSdrh static sqlite3_module jsonTreeModule = {
2601*9dbf96bdSdrh   0,                         /* iVersion */
2602*9dbf96bdSdrh   0,                         /* xCreate */
2603*9dbf96bdSdrh   jsonEachConnect,           /* xConnect */
2604*9dbf96bdSdrh   jsonEachBestIndex,         /* xBestIndex */
2605*9dbf96bdSdrh   jsonEachDisconnect,        /* xDisconnect */
2606*9dbf96bdSdrh   0,                         /* xDestroy */
2607*9dbf96bdSdrh   jsonEachOpenTree,          /* xOpen - open a cursor */
2608*9dbf96bdSdrh   jsonEachClose,             /* xClose - close a cursor */
2609*9dbf96bdSdrh   jsonEachFilter,            /* xFilter - configure scan constraints */
2610*9dbf96bdSdrh   jsonEachNext,              /* xNext - advance a cursor */
2611*9dbf96bdSdrh   jsonEachEof,               /* xEof - check for end of scan */
2612*9dbf96bdSdrh   jsonEachColumn,            /* xColumn - read data */
2613*9dbf96bdSdrh   jsonEachRowid,             /* xRowid - read data */
2614*9dbf96bdSdrh   0,                         /* xUpdate */
2615*9dbf96bdSdrh   0,                         /* xBegin */
2616*9dbf96bdSdrh   0,                         /* xSync */
2617*9dbf96bdSdrh   0,                         /* xCommit */
2618*9dbf96bdSdrh   0,                         /* xRollback */
2619*9dbf96bdSdrh   0,                         /* xFindMethod */
2620*9dbf96bdSdrh   0,                         /* xRename */
2621*9dbf96bdSdrh   0,                         /* xSavepoint */
2622*9dbf96bdSdrh   0,                         /* xRelease */
2623*9dbf96bdSdrh   0,                         /* xRollbackTo */
2624*9dbf96bdSdrh   0                          /* xShadowName */
2625*9dbf96bdSdrh };
2626*9dbf96bdSdrh #endif /* SQLITE_OMIT_VIRTUALTABLE */
2627*9dbf96bdSdrh #endif /* !defined(SQLITE_OMIT_JSON) */
2628*9dbf96bdSdrh 
2629*9dbf96bdSdrh /*
2630*9dbf96bdSdrh ** Register JSON functions.
2631*9dbf96bdSdrh */
2632*9dbf96bdSdrh void sqlite3RegisterJsonFunctions(void){
2633*9dbf96bdSdrh #ifndef SQLITE_OMIT_JSON
2634*9dbf96bdSdrh   static FuncDef aJsonFunc[] = {
2635*9dbf96bdSdrh     JFUNCTION(json,               1, 0,  jsonRemoveFunc),
2636*9dbf96bdSdrh     JFUNCTION(json_array,        -1, 0,  jsonArrayFunc),
2637*9dbf96bdSdrh     JFUNCTION(json_array_length,  1, 0,  jsonArrayLengthFunc),
2638*9dbf96bdSdrh     JFUNCTION(json_array_length,  2, 0,  jsonArrayLengthFunc),
2639*9dbf96bdSdrh     JFUNCTION(json_extract,      -1, 0,  jsonExtractFunc),
2640daefcd9eSdrh     JFUNCTION(json_nextract,     -1, JSON_NULLERR, jsonExtractFunc),
2641daefcd9eSdrh     JFUNCTION(->,                 2, JSON_NULLERR|JSON_ABPATH, jsonExtractFunc),
2642daefcd9eSdrh     JFUNCTION(->>,                2, JSON_ABPATH, jsonExtractFunc),
2643*9dbf96bdSdrh     JFUNCTION(json_insert,       -1, 0,  jsonSetFunc),
2644daefcd9eSdrh     JFUNCTION(json_ntype,         1, JSON_NULLERR, jsonTypeFunc),
2645*9dbf96bdSdrh     JFUNCTION(json_object,       -1, 0,  jsonObjectFunc),
2646*9dbf96bdSdrh     JFUNCTION(json_patch,         2, 0,  jsonPatchFunc),
2647*9dbf96bdSdrh     JFUNCTION(json_quote,         1, 0,  jsonQuoteFunc),
2648*9dbf96bdSdrh     JFUNCTION(json_remove,       -1, 0,  jsonRemoveFunc),
2649*9dbf96bdSdrh     JFUNCTION(json_replace,      -1, 0,  jsonReplaceFunc),
2650daefcd9eSdrh     JFUNCTION(json_set,          -1, JSON_ISSET,  jsonSetFunc),
2651*9dbf96bdSdrh     JFUNCTION(json_type,          1, 0,  jsonTypeFunc),
2652*9dbf96bdSdrh     JFUNCTION(json_type,          2, 0,  jsonTypeFunc),
2653*9dbf96bdSdrh     JFUNCTION(json_valid,         1, 0,  jsonValidFunc),
2654*9dbf96bdSdrh #if SQLITE_DEBUG
2655*9dbf96bdSdrh     JFUNCTION(json_parse,         1, 0,  jsonParseFunc),
2656*9dbf96bdSdrh     JFUNCTION(json_test1,         1, 0,  jsonTest1Func),
2657*9dbf96bdSdrh #endif
2658*9dbf96bdSdrh     WAGGREGATE(json_group_array,  1, 0, 0,
2659*9dbf96bdSdrh        jsonArrayStep, jsonArrayFinal, jsonArrayValue, jsonGroupInverse,
2660*9dbf96bdSdrh        SQLITE_SUBTYPE|SQLITE_UTF8|SQLITE_DETERMINISTIC|SQLITE_INNOCUOUS),
2661*9dbf96bdSdrh     WAGGREGATE(json_group_object, 2, 0, 0,
2662*9dbf96bdSdrh        jsonObjectStep, jsonObjectFinal, jsonObjectValue, jsonGroupInverse,
2663*9dbf96bdSdrh        SQLITE_SUBTYPE|SQLITE_UTF8|SQLITE_DETERMINISTIC|SQLITE_INNOCUOUS)
2664*9dbf96bdSdrh   };
2665*9dbf96bdSdrh   sqlite3InsertBuiltinFuncs(aJsonFunc, ArraySize(aJsonFunc));
2666*9dbf96bdSdrh #endif
2667*9dbf96bdSdrh }
2668*9dbf96bdSdrh 
2669*9dbf96bdSdrh #if  !defined(SQLITE_OMIT_VIRTUALTABLE) && !defined(SQLITE_OMIT_JSON)
2670*9dbf96bdSdrh /*
2671*9dbf96bdSdrh ** Register the JSON table-valued functions
2672*9dbf96bdSdrh */
2673*9dbf96bdSdrh int sqlite3JsonTableFunctions(sqlite3 *db){
2674*9dbf96bdSdrh   int rc = SQLITE_OK;
2675*9dbf96bdSdrh   static const struct {
2676*9dbf96bdSdrh     const char *zName;
2677*9dbf96bdSdrh     sqlite3_module *pModule;
2678*9dbf96bdSdrh   } aMod[] = {
2679*9dbf96bdSdrh     { "json_each",            &jsonEachModule               },
2680*9dbf96bdSdrh     { "json_tree",            &jsonTreeModule               },
2681*9dbf96bdSdrh   };
2682*9dbf96bdSdrh   int i;
2683*9dbf96bdSdrh   for(i=0; i<sizeof(aMod)/sizeof(aMod[0]) && rc==SQLITE_OK; i++){
2684*9dbf96bdSdrh     rc = sqlite3_create_module(db, aMod[i].zName, aMod[i].pModule, 0);
2685*9dbf96bdSdrh   }
2686*9dbf96bdSdrh   return rc;
2687*9dbf96bdSdrh }
2688*9dbf96bdSdrh #endif /* !defined(SQLITE_OMIT_VIRTUALTABLE) && !defined(SQLITE_OMIT_JSON) */
2689