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