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