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_JSON 0x01 /* Result is always JSON */ 1510 #define JSON_SQL 0x02 /* Result is always SQL */ 1511 #define JSON_ABPATH 0x03 /* Allow abbreviated JSON path specs */ 1512 #define JSON_ISSET 0x04 /* json_set(), not json_insert() */ 1513 1514 /* 1515 ** json_extract(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. 1521 ** 1522 ** If JSON_JSON is set or if more that one PATH argument is supplied then 1523 ** always return a JSON representation of the result. If JSON_SQL is set, 1524 ** then always return an SQL representation of the result. If neither flag 1525 ** is present and argc==2, then return JSON for objects and arrays and SQL 1526 ** for all other values. 1527 ** 1528 ** When multiple PATH arguments are supplied, the result is a JSON array 1529 ** containing the result of each PATH. 1530 ** 1531 ** Abbreviated JSON path expressions are allows if JSON_ABPATH, for 1532 ** compatibility with PG. 1533 */ 1534 static void jsonExtractFunc( 1535 sqlite3_context *ctx, 1536 int argc, 1537 sqlite3_value **argv 1538 ){ 1539 JsonParse *p; /* The parse */ 1540 JsonNode *pNode; 1541 const char *zPath; 1542 int flags = SQLITE_PTR_TO_INT(sqlite3_user_data(ctx)); 1543 JsonString jx; 1544 1545 if( argc<2 ) return; 1546 p = jsonParseCached(ctx, argv, ctx); 1547 if( p==0 ) return; 1548 if( argc==2 ){ 1549 /* With a single PATH argument */ 1550 zPath = (const char*)sqlite3_value_text(argv[1]); 1551 if( zPath==0 ) return; 1552 if( flags & JSON_ABPATH ){ 1553 if( zPath[0]!='$' ){ 1554 /* The -> and ->> operators accept abbreviated PATH arguments. This 1555 ** is mostly for compatibility with PostgreSQL, but also for 1556 ** convenience. 1557 ** 1558 ** NUMBER ==> $[NUMBER] // PG compatible 1559 ** LABEL ==> $.LABEL // PG compatible 1560 ** [NUMBER] ==> $[NUMBER] // Not PG. Purely for convenience 1561 */ 1562 jsonInit(&jx, ctx); 1563 if( sqlite3Isdigit(zPath[0]) ){ 1564 jsonAppendRaw(&jx, "$[", 2); 1565 jsonAppendRaw(&jx, zPath, (int)strlen(zPath)); 1566 jsonAppendRaw(&jx, "]", 2); 1567 }else{ 1568 jsonAppendRaw(&jx, "$.", 1 + (zPath[0]!='[')); 1569 jsonAppendRaw(&jx, zPath, (int)strlen(zPath)); 1570 jsonAppendChar(&jx, 0); 1571 } 1572 pNode = jx.bErr ? 0 : jsonLookup(p, jx.zBuf, 0, ctx); 1573 jsonReset(&jx); 1574 }else{ 1575 pNode = jsonLookup(p, zPath, 0, ctx); 1576 } 1577 if( pNode ){ 1578 if( flags & JSON_JSON ){ 1579 jsonReturnJson(pNode, ctx, 0); 1580 }else{ 1581 jsonReturn(pNode, ctx, 0); 1582 sqlite3_result_subtype(ctx, 0); 1583 } 1584 } 1585 }else{ 1586 pNode = jsonLookup(p, zPath, 0, ctx); 1587 if( p->nErr==0 && pNode ) jsonReturn(pNode, ctx, 0); 1588 } 1589 }else{ 1590 /* Two or more PATH arguments results in a JSON array with each 1591 ** element of the array being the value selected by one of the PATHs */ 1592 int i; 1593 jsonInit(&jx, ctx); 1594 jsonAppendChar(&jx, '['); 1595 for(i=1; i<argc; i++){ 1596 zPath = (const char*)sqlite3_value_text(argv[i]); 1597 pNode = jsonLookup(p, zPath, 0, ctx); 1598 if( p->nErr ) break; 1599 jsonAppendSeparator(&jx); 1600 if( pNode ){ 1601 jsonRenderNode(pNode, &jx, 0); 1602 }else{ 1603 jsonAppendRaw(&jx, "null", 4); 1604 } 1605 } 1606 if( i==argc ){ 1607 jsonAppendChar(&jx, ']'); 1608 jsonResult(&jx); 1609 sqlite3_result_subtype(ctx, JSON_SUBTYPE); 1610 } 1611 jsonReset(&jx); 1612 } 1613 } 1614 1615 /* This is the RFC 7396 MergePatch algorithm. 1616 */ 1617 static JsonNode *jsonMergePatch( 1618 JsonParse *pParse, /* The JSON parser that contains the TARGET */ 1619 u32 iTarget, /* Node of the TARGET in pParse */ 1620 JsonNode *pPatch /* The PATCH */ 1621 ){ 1622 u32 i, j; 1623 u32 iRoot; 1624 JsonNode *pTarget; 1625 if( pPatch->eType!=JSON_OBJECT ){ 1626 return pPatch; 1627 } 1628 assert( iTarget>=0 && iTarget<pParse->nNode ); 1629 pTarget = &pParse->aNode[iTarget]; 1630 assert( (pPatch->jnFlags & JNODE_APPEND)==0 ); 1631 if( pTarget->eType!=JSON_OBJECT ){ 1632 jsonRemoveAllNulls(pPatch); 1633 return pPatch; 1634 } 1635 iRoot = iTarget; 1636 for(i=1; i<pPatch->n; i += jsonNodeSize(&pPatch[i+1])+1){ 1637 u32 nKey; 1638 const char *zKey; 1639 assert( pPatch[i].eType==JSON_STRING ); 1640 assert( pPatch[i].jnFlags & JNODE_LABEL ); 1641 assert( pPatch[i].eU==1 ); 1642 nKey = pPatch[i].n; 1643 zKey = pPatch[i].u.zJContent; 1644 assert( (pPatch[i].jnFlags & JNODE_RAW)==0 ); 1645 for(j=1; j<pTarget->n; j += jsonNodeSize(&pTarget[j+1])+1 ){ 1646 assert( pTarget[j].eType==JSON_STRING ); 1647 assert( pTarget[j].jnFlags & JNODE_LABEL ); 1648 assert( (pPatch[i].jnFlags & JNODE_RAW)==0 ); 1649 if( pTarget[j].n==nKey && strncmp(pTarget[j].u.zJContent,zKey,nKey)==0 ){ 1650 if( pTarget[j+1].jnFlags & (JNODE_REMOVE|JNODE_PATCH) ) break; 1651 if( pPatch[i+1].eType==JSON_NULL ){ 1652 pTarget[j+1].jnFlags |= JNODE_REMOVE; 1653 }else{ 1654 JsonNode *pNew = jsonMergePatch(pParse, iTarget+j+1, &pPatch[i+1]); 1655 if( pNew==0 ) return 0; 1656 pTarget = &pParse->aNode[iTarget]; 1657 if( pNew!=&pTarget[j+1] ){ 1658 assert( pTarget[j+1].eU==0 1659 || pTarget[j+1].eU==1 1660 || pTarget[j+1].eU==2 ); 1661 testcase( pTarget[j+1].eU==1 ); 1662 testcase( pTarget[j+1].eU==2 ); 1663 VVA( pTarget[j+1].eU = 5 ); 1664 pTarget[j+1].u.pPatch = pNew; 1665 pTarget[j+1].jnFlags |= JNODE_PATCH; 1666 } 1667 } 1668 break; 1669 } 1670 } 1671 if( j>=pTarget->n && pPatch[i+1].eType!=JSON_NULL ){ 1672 int iStart, iPatch; 1673 iStart = jsonParseAddNode(pParse, JSON_OBJECT, 2, 0); 1674 jsonParseAddNode(pParse, JSON_STRING, nKey, zKey); 1675 iPatch = jsonParseAddNode(pParse, JSON_TRUE, 0, 0); 1676 if( pParse->oom ) return 0; 1677 jsonRemoveAllNulls(pPatch); 1678 pTarget = &pParse->aNode[iTarget]; 1679 assert( pParse->aNode[iRoot].eU==0 || pParse->aNode[iRoot].eU==2 ); 1680 testcase( pParse->aNode[iRoot].eU==2 ); 1681 pParse->aNode[iRoot].jnFlags |= JNODE_APPEND; 1682 VVA( pParse->aNode[iRoot].eU = 2 ); 1683 pParse->aNode[iRoot].u.iAppend = iStart - iRoot; 1684 iRoot = iStart; 1685 assert( pParse->aNode[iPatch].eU==0 ); 1686 VVA( pParse->aNode[iPatch].eU = 5 ); 1687 pParse->aNode[iPatch].jnFlags |= JNODE_PATCH; 1688 pParse->aNode[iPatch].u.pPatch = &pPatch[i+1]; 1689 } 1690 } 1691 return pTarget; 1692 } 1693 1694 /* 1695 ** Implementation of the json_mergepatch(JSON1,JSON2) function. Return a JSON 1696 ** object that is the result of running the RFC 7396 MergePatch() algorithm 1697 ** on the two arguments. 1698 */ 1699 static void jsonPatchFunc( 1700 sqlite3_context *ctx, 1701 int argc, 1702 sqlite3_value **argv 1703 ){ 1704 JsonParse x; /* The JSON that is being patched */ 1705 JsonParse y; /* The patch */ 1706 JsonNode *pResult; /* The result of the merge */ 1707 1708 UNUSED_PARAMETER(argc); 1709 if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return; 1710 if( jsonParse(&y, ctx, (const char*)sqlite3_value_text(argv[1])) ){ 1711 jsonParseReset(&x); 1712 return; 1713 } 1714 pResult = jsonMergePatch(&x, 0, y.aNode); 1715 assert( pResult!=0 || x.oom ); 1716 if( pResult ){ 1717 jsonReturnJson(pResult, ctx, 0); 1718 }else{ 1719 sqlite3_result_error_nomem(ctx); 1720 } 1721 jsonParseReset(&x); 1722 jsonParseReset(&y); 1723 } 1724 1725 1726 /* 1727 ** Implementation of the json_object(NAME,VALUE,...) function. Return a JSON 1728 ** object that contains all name/value given in arguments. Or if any name 1729 ** is not a string or if any value is a BLOB, throw an error. 1730 */ 1731 static void jsonObjectFunc( 1732 sqlite3_context *ctx, 1733 int argc, 1734 sqlite3_value **argv 1735 ){ 1736 int i; 1737 JsonString jx; 1738 const char *z; 1739 u32 n; 1740 1741 if( argc&1 ){ 1742 sqlite3_result_error(ctx, "json_object() requires an even number " 1743 "of arguments", -1); 1744 return; 1745 } 1746 jsonInit(&jx, ctx); 1747 jsonAppendChar(&jx, '{'); 1748 for(i=0; i<argc; i+=2){ 1749 if( sqlite3_value_type(argv[i])!=SQLITE_TEXT ){ 1750 sqlite3_result_error(ctx, "json_object() labels must be TEXT", -1); 1751 jsonReset(&jx); 1752 return; 1753 } 1754 jsonAppendSeparator(&jx); 1755 z = (const char*)sqlite3_value_text(argv[i]); 1756 n = (u32)sqlite3_value_bytes(argv[i]); 1757 jsonAppendString(&jx, z, n); 1758 jsonAppendChar(&jx, ':'); 1759 jsonAppendValue(&jx, argv[i+1]); 1760 } 1761 jsonAppendChar(&jx, '}'); 1762 jsonResult(&jx); 1763 sqlite3_result_subtype(ctx, JSON_SUBTYPE); 1764 } 1765 1766 1767 /* 1768 ** json_remove(JSON, PATH, ...) 1769 ** 1770 ** Remove the named elements from JSON and return the result. malformed 1771 ** JSON or PATH arguments result in an error. 1772 */ 1773 static void jsonRemoveFunc( 1774 sqlite3_context *ctx, 1775 int argc, 1776 sqlite3_value **argv 1777 ){ 1778 JsonParse x; /* The parse */ 1779 JsonNode *pNode; 1780 const char *zPath; 1781 u32 i; 1782 1783 if( argc<1 ) return; 1784 if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return; 1785 assert( x.nNode ); 1786 for(i=1; i<(u32)argc; i++){ 1787 zPath = (const char*)sqlite3_value_text(argv[i]); 1788 if( zPath==0 ) goto remove_done; 1789 pNode = jsonLookup(&x, zPath, 0, ctx); 1790 if( x.nErr ) goto remove_done; 1791 if( pNode ) pNode->jnFlags |= JNODE_REMOVE; 1792 } 1793 if( (x.aNode[0].jnFlags & JNODE_REMOVE)==0 ){ 1794 jsonReturnJson(x.aNode, ctx, 0); 1795 } 1796 remove_done: 1797 jsonParseReset(&x); 1798 } 1799 1800 /* 1801 ** json_replace(JSON, PATH, VALUE, ...) 1802 ** 1803 ** Replace the value at PATH with VALUE. If PATH does not already exist, 1804 ** this routine is a no-op. If JSON or PATH is malformed, throw an error. 1805 */ 1806 static void jsonReplaceFunc( 1807 sqlite3_context *ctx, 1808 int argc, 1809 sqlite3_value **argv 1810 ){ 1811 JsonParse x; /* The parse */ 1812 JsonNode *pNode; 1813 const char *zPath; 1814 u32 i; 1815 1816 if( argc<1 ) return; 1817 if( (argc&1)==0 ) { 1818 jsonWrongNumArgs(ctx, "replace"); 1819 return; 1820 } 1821 if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return; 1822 assert( x.nNode ); 1823 for(i=1; i<(u32)argc; i+=2){ 1824 zPath = (const char*)sqlite3_value_text(argv[i]); 1825 pNode = jsonLookup(&x, zPath, 0, ctx); 1826 if( x.nErr ) goto replace_err; 1827 if( pNode ){ 1828 assert( pNode->eU==0 || pNode->eU==1 || pNode->eU==4 ); 1829 testcase( pNode->eU!=0 && pNode->eU!=1 ); 1830 pNode->jnFlags |= (u8)JNODE_REPLACE; 1831 VVA( pNode->eU = 4 ); 1832 pNode->u.iReplace = i + 1; 1833 } 1834 } 1835 if( x.aNode[0].jnFlags & JNODE_REPLACE ){ 1836 assert( x.aNode[0].eU==4 ); 1837 sqlite3_result_value(ctx, argv[x.aNode[0].u.iReplace]); 1838 }else{ 1839 jsonReturnJson(x.aNode, ctx, argv); 1840 } 1841 replace_err: 1842 jsonParseReset(&x); 1843 } 1844 1845 1846 /* 1847 ** json_set(JSON, PATH, VALUE, ...) 1848 ** 1849 ** Set the value at PATH to VALUE. Create the PATH if it does not already 1850 ** exist. Overwrite existing values that do exist. 1851 ** If JSON or PATH is malformed, throw an error. 1852 ** 1853 ** json_insert(JSON, PATH, VALUE, ...) 1854 ** 1855 ** Create PATH and initialize it to VALUE. If PATH already exists, this 1856 ** routine is a no-op. If JSON or PATH is malformed, throw an error. 1857 */ 1858 static void jsonSetFunc( 1859 sqlite3_context *ctx, 1860 int argc, 1861 sqlite3_value **argv 1862 ){ 1863 JsonParse x; /* The parse */ 1864 JsonNode *pNode; 1865 const char *zPath; 1866 u32 i; 1867 int bApnd; 1868 int bIsSet = sqlite3_user_data(ctx)!=0; 1869 1870 if( argc<1 ) return; 1871 if( (argc&1)==0 ) { 1872 jsonWrongNumArgs(ctx, bIsSet ? "set" : "insert"); 1873 return; 1874 } 1875 if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return; 1876 assert( x.nNode ); 1877 for(i=1; i<(u32)argc; i+=2){ 1878 zPath = (const char*)sqlite3_value_text(argv[i]); 1879 bApnd = 0; 1880 pNode = jsonLookup(&x, zPath, &bApnd, ctx); 1881 if( x.oom ){ 1882 sqlite3_result_error_nomem(ctx); 1883 goto jsonSetDone; 1884 }else if( x.nErr ){ 1885 goto jsonSetDone; 1886 }else if( pNode && (bApnd || bIsSet) ){ 1887 testcase( pNode->eU!=0 && pNode->eU!=1 && pNode->eU!=4 ); 1888 assert( pNode->eU!=3 || pNode->eU!=5 ); 1889 VVA( pNode->eU = 4 ); 1890 pNode->jnFlags |= (u8)JNODE_REPLACE; 1891 pNode->u.iReplace = i + 1; 1892 } 1893 } 1894 if( x.aNode[0].jnFlags & JNODE_REPLACE ){ 1895 assert( x.aNode[0].eU==4 ); 1896 sqlite3_result_value(ctx, argv[x.aNode[0].u.iReplace]); 1897 }else{ 1898 jsonReturnJson(x.aNode, ctx, argv); 1899 } 1900 jsonSetDone: 1901 jsonParseReset(&x); 1902 } 1903 1904 /* 1905 ** json_type(JSON) 1906 ** json_ntype(JSON) 1907 ** json_type(JSON, PATH) 1908 ** 1909 ** Return the top-level "type" of a JSON string. json_type() raises an 1910 ** error if either the JSON or PATH inputs are not well-formed. json_ntype() 1911 ** works like the one-argument version of json_type() except that it 1912 ** returns NULL if the JSON argument is not well-formed. 1913 */ 1914 static void jsonTypeFunc( 1915 sqlite3_context *ctx, 1916 int argc, 1917 sqlite3_value **argv 1918 ){ 1919 JsonParse *p; /* The parse */ 1920 const char *zPath; 1921 JsonNode *pNode; 1922 1923 p = jsonParseCached(ctx, argv, sqlite3_user_data(ctx)!=0 ? 0 : ctx); 1924 if( p==0 ) return; 1925 if( argc==2 ){ 1926 zPath = (const char*)sqlite3_value_text(argv[1]); 1927 pNode = jsonLookup(p, zPath, 0, ctx); 1928 }else{ 1929 pNode = p->aNode; 1930 } 1931 if( pNode ){ 1932 sqlite3_result_text(ctx, jsonType[pNode->eType], -1, SQLITE_STATIC); 1933 } 1934 } 1935 1936 /* 1937 ** json_valid(JSON) 1938 ** 1939 ** Return 1 if JSON is a well-formed JSON string according to RFC-7159. 1940 ** Return 0 otherwise. 1941 */ 1942 static void jsonValidFunc( 1943 sqlite3_context *ctx, 1944 int argc, 1945 sqlite3_value **argv 1946 ){ 1947 JsonParse *p; /* The parse */ 1948 UNUSED_PARAMETER(argc); 1949 p = jsonParseCached(ctx, argv, 0); 1950 sqlite3_result_int(ctx, p!=0); 1951 } 1952 1953 1954 /**************************************************************************** 1955 ** Aggregate SQL function implementations 1956 ****************************************************************************/ 1957 /* 1958 ** json_group_array(VALUE) 1959 ** 1960 ** Return a JSON array composed of all values in the aggregate. 1961 */ 1962 static void jsonArrayStep( 1963 sqlite3_context *ctx, 1964 int argc, 1965 sqlite3_value **argv 1966 ){ 1967 JsonString *pStr; 1968 UNUSED_PARAMETER(argc); 1969 pStr = (JsonString*)sqlite3_aggregate_context(ctx, sizeof(*pStr)); 1970 if( pStr ){ 1971 if( pStr->zBuf==0 ){ 1972 jsonInit(pStr, ctx); 1973 jsonAppendChar(pStr, '['); 1974 }else if( pStr->nUsed>1 ){ 1975 jsonAppendChar(pStr, ','); 1976 } 1977 pStr->pCtx = ctx; 1978 jsonAppendValue(pStr, argv[0]); 1979 } 1980 } 1981 static void jsonArrayCompute(sqlite3_context *ctx, int isFinal){ 1982 JsonString *pStr; 1983 pStr = (JsonString*)sqlite3_aggregate_context(ctx, 0); 1984 if( pStr ){ 1985 pStr->pCtx = ctx; 1986 jsonAppendChar(pStr, ']'); 1987 if( pStr->bErr ){ 1988 if( pStr->bErr==1 ) sqlite3_result_error_nomem(ctx); 1989 assert( pStr->bStatic ); 1990 }else if( isFinal ){ 1991 sqlite3_result_text(ctx, pStr->zBuf, (int)pStr->nUsed, 1992 pStr->bStatic ? SQLITE_TRANSIENT : sqlite3_free); 1993 pStr->bStatic = 1; 1994 }else{ 1995 sqlite3_result_text(ctx, pStr->zBuf, (int)pStr->nUsed, SQLITE_TRANSIENT); 1996 pStr->nUsed--; 1997 } 1998 }else{ 1999 sqlite3_result_text(ctx, "[]", 2, SQLITE_STATIC); 2000 } 2001 sqlite3_result_subtype(ctx, JSON_SUBTYPE); 2002 } 2003 static void jsonArrayValue(sqlite3_context *ctx){ 2004 jsonArrayCompute(ctx, 0); 2005 } 2006 static void jsonArrayFinal(sqlite3_context *ctx){ 2007 jsonArrayCompute(ctx, 1); 2008 } 2009 2010 #ifndef SQLITE_OMIT_WINDOWFUNC 2011 /* 2012 ** This method works for both json_group_array() and json_group_object(). 2013 ** It works by removing the first element of the group by searching forward 2014 ** to the first comma (",") that is not within a string and deleting all 2015 ** text through that comma. 2016 */ 2017 static void jsonGroupInverse( 2018 sqlite3_context *ctx, 2019 int argc, 2020 sqlite3_value **argv 2021 ){ 2022 unsigned int i; 2023 int inStr = 0; 2024 int nNest = 0; 2025 char *z; 2026 char c; 2027 JsonString *pStr; 2028 UNUSED_PARAMETER(argc); 2029 UNUSED_PARAMETER(argv); 2030 pStr = (JsonString*)sqlite3_aggregate_context(ctx, 0); 2031 #ifdef NEVER 2032 /* pStr is always non-NULL since jsonArrayStep() or jsonObjectStep() will 2033 ** always have been called to initalize it */ 2034 if( NEVER(!pStr) ) return; 2035 #endif 2036 z = pStr->zBuf; 2037 for(i=1; i<pStr->nUsed && ((c = z[i])!=',' || inStr || nNest); i++){ 2038 if( c=='"' ){ 2039 inStr = !inStr; 2040 }else if( c=='\\' ){ 2041 i++; 2042 }else if( !inStr ){ 2043 if( c=='{' || c=='[' ) nNest++; 2044 if( c=='}' || c==']' ) nNest--; 2045 } 2046 } 2047 if( i<pStr->nUsed ){ 2048 pStr->nUsed -= i; 2049 memmove(&z[1], &z[i+1], (size_t)pStr->nUsed-1); 2050 z[pStr->nUsed] = 0; 2051 }else{ 2052 pStr->nUsed = 1; 2053 } 2054 } 2055 #else 2056 # define jsonGroupInverse 0 2057 #endif 2058 2059 2060 /* 2061 ** json_group_obj(NAME,VALUE) 2062 ** 2063 ** Return a JSON object composed of all names and values in the aggregate. 2064 */ 2065 static void jsonObjectStep( 2066 sqlite3_context *ctx, 2067 int argc, 2068 sqlite3_value **argv 2069 ){ 2070 JsonString *pStr; 2071 const char *z; 2072 u32 n; 2073 UNUSED_PARAMETER(argc); 2074 pStr = (JsonString*)sqlite3_aggregate_context(ctx, sizeof(*pStr)); 2075 if( pStr ){ 2076 if( pStr->zBuf==0 ){ 2077 jsonInit(pStr, ctx); 2078 jsonAppendChar(pStr, '{'); 2079 }else if( pStr->nUsed>1 ){ 2080 jsonAppendChar(pStr, ','); 2081 } 2082 pStr->pCtx = ctx; 2083 z = (const char*)sqlite3_value_text(argv[0]); 2084 n = (u32)sqlite3_value_bytes(argv[0]); 2085 jsonAppendString(pStr, z, n); 2086 jsonAppendChar(pStr, ':'); 2087 jsonAppendValue(pStr, argv[1]); 2088 } 2089 } 2090 static void jsonObjectCompute(sqlite3_context *ctx, int isFinal){ 2091 JsonString *pStr; 2092 pStr = (JsonString*)sqlite3_aggregate_context(ctx, 0); 2093 if( pStr ){ 2094 jsonAppendChar(pStr, '}'); 2095 if( pStr->bErr ){ 2096 if( pStr->bErr==1 ) sqlite3_result_error_nomem(ctx); 2097 assert( pStr->bStatic ); 2098 }else if( isFinal ){ 2099 sqlite3_result_text(ctx, pStr->zBuf, (int)pStr->nUsed, 2100 pStr->bStatic ? SQLITE_TRANSIENT : sqlite3_free); 2101 pStr->bStatic = 1; 2102 }else{ 2103 sqlite3_result_text(ctx, pStr->zBuf, (int)pStr->nUsed, SQLITE_TRANSIENT); 2104 pStr->nUsed--; 2105 } 2106 }else{ 2107 sqlite3_result_text(ctx, "{}", 2, SQLITE_STATIC); 2108 } 2109 sqlite3_result_subtype(ctx, JSON_SUBTYPE); 2110 } 2111 static void jsonObjectValue(sqlite3_context *ctx){ 2112 jsonObjectCompute(ctx, 0); 2113 } 2114 static void jsonObjectFinal(sqlite3_context *ctx){ 2115 jsonObjectCompute(ctx, 1); 2116 } 2117 2118 2119 2120 #ifndef SQLITE_OMIT_VIRTUALTABLE 2121 /**************************************************************************** 2122 ** The json_each virtual table 2123 ****************************************************************************/ 2124 typedef struct JsonEachCursor JsonEachCursor; 2125 struct JsonEachCursor { 2126 sqlite3_vtab_cursor base; /* Base class - must be first */ 2127 u32 iRowid; /* The rowid */ 2128 u32 iBegin; /* The first node of the scan */ 2129 u32 i; /* Index in sParse.aNode[] of current row */ 2130 u32 iEnd; /* EOF when i equals or exceeds this value */ 2131 u8 eType; /* Type of top-level element */ 2132 u8 bRecursive; /* True for json_tree(). False for json_each() */ 2133 char *zJson; /* Input JSON */ 2134 char *zRoot; /* Path by which to filter zJson */ 2135 JsonParse sParse; /* Parse of the input JSON */ 2136 }; 2137 2138 /* Constructor for the json_each virtual table */ 2139 static int jsonEachConnect( 2140 sqlite3 *db, 2141 void *pAux, 2142 int argc, const char *const*argv, 2143 sqlite3_vtab **ppVtab, 2144 char **pzErr 2145 ){ 2146 sqlite3_vtab *pNew; 2147 int rc; 2148 2149 /* Column numbers */ 2150 #define JEACH_KEY 0 2151 #define JEACH_VALUE 1 2152 #define JEACH_TYPE 2 2153 #define JEACH_ATOM 3 2154 #define JEACH_ID 4 2155 #define JEACH_PARENT 5 2156 #define JEACH_FULLKEY 6 2157 #define JEACH_PATH 7 2158 /* The xBestIndex method assumes that the JSON and ROOT columns are 2159 ** the last two columns in the table. Should this ever changes, be 2160 ** sure to update the xBestIndex method. */ 2161 #define JEACH_JSON 8 2162 #define JEACH_ROOT 9 2163 2164 UNUSED_PARAMETER(pzErr); 2165 UNUSED_PARAMETER(argv); 2166 UNUSED_PARAMETER(argc); 2167 UNUSED_PARAMETER(pAux); 2168 rc = sqlite3_declare_vtab(db, 2169 "CREATE TABLE x(key,value,type,atom,id,parent,fullkey,path," 2170 "json HIDDEN,root HIDDEN)"); 2171 if( rc==SQLITE_OK ){ 2172 pNew = *ppVtab = sqlite3_malloc( sizeof(*pNew) ); 2173 if( pNew==0 ) return SQLITE_NOMEM; 2174 memset(pNew, 0, sizeof(*pNew)); 2175 sqlite3_vtab_config(db, SQLITE_VTAB_INNOCUOUS); 2176 } 2177 return rc; 2178 } 2179 2180 /* destructor for json_each virtual table */ 2181 static int jsonEachDisconnect(sqlite3_vtab *pVtab){ 2182 sqlite3_free(pVtab); 2183 return SQLITE_OK; 2184 } 2185 2186 /* constructor for a JsonEachCursor object for json_each(). */ 2187 static int jsonEachOpenEach(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){ 2188 JsonEachCursor *pCur; 2189 2190 UNUSED_PARAMETER(p); 2191 pCur = sqlite3_malloc( sizeof(*pCur) ); 2192 if( pCur==0 ) return SQLITE_NOMEM; 2193 memset(pCur, 0, sizeof(*pCur)); 2194 *ppCursor = &pCur->base; 2195 return SQLITE_OK; 2196 } 2197 2198 /* constructor for a JsonEachCursor object for json_tree(). */ 2199 static int jsonEachOpenTree(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){ 2200 int rc = jsonEachOpenEach(p, ppCursor); 2201 if( rc==SQLITE_OK ){ 2202 JsonEachCursor *pCur = (JsonEachCursor*)*ppCursor; 2203 pCur->bRecursive = 1; 2204 } 2205 return rc; 2206 } 2207 2208 /* Reset a JsonEachCursor back to its original state. Free any memory 2209 ** held. */ 2210 static void jsonEachCursorReset(JsonEachCursor *p){ 2211 sqlite3_free(p->zJson); 2212 sqlite3_free(p->zRoot); 2213 jsonParseReset(&p->sParse); 2214 p->iRowid = 0; 2215 p->i = 0; 2216 p->iEnd = 0; 2217 p->eType = 0; 2218 p->zJson = 0; 2219 p->zRoot = 0; 2220 } 2221 2222 /* Destructor for a jsonEachCursor object */ 2223 static int jsonEachClose(sqlite3_vtab_cursor *cur){ 2224 JsonEachCursor *p = (JsonEachCursor*)cur; 2225 jsonEachCursorReset(p); 2226 sqlite3_free(cur); 2227 return SQLITE_OK; 2228 } 2229 2230 /* Return TRUE if the jsonEachCursor object has been advanced off the end 2231 ** of the JSON object */ 2232 static int jsonEachEof(sqlite3_vtab_cursor *cur){ 2233 JsonEachCursor *p = (JsonEachCursor*)cur; 2234 return p->i >= p->iEnd; 2235 } 2236 2237 /* Advance the cursor to the next element for json_tree() */ 2238 static int jsonEachNext(sqlite3_vtab_cursor *cur){ 2239 JsonEachCursor *p = (JsonEachCursor*)cur; 2240 if( p->bRecursive ){ 2241 if( p->sParse.aNode[p->i].jnFlags & JNODE_LABEL ) p->i++; 2242 p->i++; 2243 p->iRowid++; 2244 if( p->i<p->iEnd ){ 2245 u32 iUp = p->sParse.aUp[p->i]; 2246 JsonNode *pUp = &p->sParse.aNode[iUp]; 2247 p->eType = pUp->eType; 2248 if( pUp->eType==JSON_ARRAY ){ 2249 assert( pUp->eU==0 || pUp->eU==3 ); 2250 testcase( pUp->eU==3 ); 2251 VVA( pUp->eU = 3 ); 2252 if( iUp==p->i-1 ){ 2253 pUp->u.iKey = 0; 2254 }else{ 2255 pUp->u.iKey++; 2256 } 2257 } 2258 } 2259 }else{ 2260 switch( p->eType ){ 2261 case JSON_ARRAY: { 2262 p->i += jsonNodeSize(&p->sParse.aNode[p->i]); 2263 p->iRowid++; 2264 break; 2265 } 2266 case JSON_OBJECT: { 2267 p->i += 1 + jsonNodeSize(&p->sParse.aNode[p->i+1]); 2268 p->iRowid++; 2269 break; 2270 } 2271 default: { 2272 p->i = p->iEnd; 2273 break; 2274 } 2275 } 2276 } 2277 return SQLITE_OK; 2278 } 2279 2280 /* Append the name of the path for element i to pStr 2281 */ 2282 static void jsonEachComputePath( 2283 JsonEachCursor *p, /* The cursor */ 2284 JsonString *pStr, /* Write the path here */ 2285 u32 i /* Path to this element */ 2286 ){ 2287 JsonNode *pNode, *pUp; 2288 u32 iUp; 2289 if( i==0 ){ 2290 jsonAppendChar(pStr, '$'); 2291 return; 2292 } 2293 iUp = p->sParse.aUp[i]; 2294 jsonEachComputePath(p, pStr, iUp); 2295 pNode = &p->sParse.aNode[i]; 2296 pUp = &p->sParse.aNode[iUp]; 2297 if( pUp->eType==JSON_ARRAY ){ 2298 assert( pUp->eU==3 || (pUp->eU==0 && pUp->u.iKey==0) ); 2299 testcase( pUp->eU==0 ); 2300 jsonPrintf(30, pStr, "[%d]", pUp->u.iKey); 2301 }else{ 2302 assert( pUp->eType==JSON_OBJECT ); 2303 if( (pNode->jnFlags & JNODE_LABEL)==0 ) pNode--; 2304 assert( pNode->eType==JSON_STRING ); 2305 assert( pNode->jnFlags & JNODE_LABEL ); 2306 assert( pNode->eU==1 ); 2307 jsonPrintf(pNode->n+1, pStr, ".%.*s", pNode->n-2, pNode->u.zJContent+1); 2308 } 2309 } 2310 2311 /* Return the value of a column */ 2312 static int jsonEachColumn( 2313 sqlite3_vtab_cursor *cur, /* The cursor */ 2314 sqlite3_context *ctx, /* First argument to sqlite3_result_...() */ 2315 int i /* Which column to return */ 2316 ){ 2317 JsonEachCursor *p = (JsonEachCursor*)cur; 2318 JsonNode *pThis = &p->sParse.aNode[p->i]; 2319 switch( i ){ 2320 case JEACH_KEY: { 2321 if( p->i==0 ) break; 2322 if( p->eType==JSON_OBJECT ){ 2323 jsonReturn(pThis, ctx, 0); 2324 }else if( p->eType==JSON_ARRAY ){ 2325 u32 iKey; 2326 if( p->bRecursive ){ 2327 if( p->iRowid==0 ) break; 2328 assert( p->sParse.aNode[p->sParse.aUp[p->i]].eU==3 ); 2329 iKey = p->sParse.aNode[p->sParse.aUp[p->i]].u.iKey; 2330 }else{ 2331 iKey = p->iRowid; 2332 } 2333 sqlite3_result_int64(ctx, (sqlite3_int64)iKey); 2334 } 2335 break; 2336 } 2337 case JEACH_VALUE: { 2338 if( pThis->jnFlags & JNODE_LABEL ) pThis++; 2339 jsonReturn(pThis, ctx, 0); 2340 break; 2341 } 2342 case JEACH_TYPE: { 2343 if( pThis->jnFlags & JNODE_LABEL ) pThis++; 2344 sqlite3_result_text(ctx, jsonType[pThis->eType], -1, SQLITE_STATIC); 2345 break; 2346 } 2347 case JEACH_ATOM: { 2348 if( pThis->jnFlags & JNODE_LABEL ) pThis++; 2349 if( pThis->eType>=JSON_ARRAY ) break; 2350 jsonReturn(pThis, ctx, 0); 2351 break; 2352 } 2353 case JEACH_ID: { 2354 sqlite3_result_int64(ctx, 2355 (sqlite3_int64)p->i + ((pThis->jnFlags & JNODE_LABEL)!=0)); 2356 break; 2357 } 2358 case JEACH_PARENT: { 2359 if( p->i>p->iBegin && p->bRecursive ){ 2360 sqlite3_result_int64(ctx, (sqlite3_int64)p->sParse.aUp[p->i]); 2361 } 2362 break; 2363 } 2364 case JEACH_FULLKEY: { 2365 JsonString x; 2366 jsonInit(&x, ctx); 2367 if( p->bRecursive ){ 2368 jsonEachComputePath(p, &x, p->i); 2369 }else{ 2370 if( p->zRoot ){ 2371 jsonAppendRaw(&x, p->zRoot, (int)strlen(p->zRoot)); 2372 }else{ 2373 jsonAppendChar(&x, '$'); 2374 } 2375 if( p->eType==JSON_ARRAY ){ 2376 jsonPrintf(30, &x, "[%d]", p->iRowid); 2377 }else if( p->eType==JSON_OBJECT ){ 2378 assert( pThis->eU==1 ); 2379 jsonPrintf(pThis->n, &x, ".%.*s", pThis->n-2, pThis->u.zJContent+1); 2380 } 2381 } 2382 jsonResult(&x); 2383 break; 2384 } 2385 case JEACH_PATH: { 2386 if( p->bRecursive ){ 2387 JsonString x; 2388 jsonInit(&x, ctx); 2389 jsonEachComputePath(p, &x, p->sParse.aUp[p->i]); 2390 jsonResult(&x); 2391 break; 2392 } 2393 /* For json_each() path and root are the same so fall through 2394 ** into the root case */ 2395 /* no break */ deliberate_fall_through 2396 } 2397 default: { 2398 const char *zRoot = p->zRoot; 2399 if( zRoot==0 ) zRoot = "$"; 2400 sqlite3_result_text(ctx, zRoot, -1, SQLITE_STATIC); 2401 break; 2402 } 2403 case JEACH_JSON: { 2404 assert( i==JEACH_JSON ); 2405 sqlite3_result_text(ctx, p->sParse.zJson, -1, SQLITE_STATIC); 2406 break; 2407 } 2408 } 2409 return SQLITE_OK; 2410 } 2411 2412 /* Return the current rowid value */ 2413 static int jsonEachRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){ 2414 JsonEachCursor *p = (JsonEachCursor*)cur; 2415 *pRowid = p->iRowid; 2416 return SQLITE_OK; 2417 } 2418 2419 /* The query strategy is to look for an equality constraint on the json 2420 ** column. Without such a constraint, the table cannot operate. idxNum is 2421 ** 1 if the constraint is found, 3 if the constraint and zRoot are found, 2422 ** and 0 otherwise. 2423 */ 2424 static int jsonEachBestIndex( 2425 sqlite3_vtab *tab, 2426 sqlite3_index_info *pIdxInfo 2427 ){ 2428 int i; /* Loop counter or computed array index */ 2429 int aIdx[2]; /* Index of constraints for JSON and ROOT */ 2430 int unusableMask = 0; /* Mask of unusable JSON and ROOT constraints */ 2431 int idxMask = 0; /* Mask of usable == constraints JSON and ROOT */ 2432 const struct sqlite3_index_constraint *pConstraint; 2433 2434 /* This implementation assumes that JSON and ROOT are the last two 2435 ** columns in the table */ 2436 assert( JEACH_ROOT == JEACH_JSON+1 ); 2437 UNUSED_PARAMETER(tab); 2438 aIdx[0] = aIdx[1] = -1; 2439 pConstraint = pIdxInfo->aConstraint; 2440 for(i=0; i<pIdxInfo->nConstraint; i++, pConstraint++){ 2441 int iCol; 2442 int iMask; 2443 if( pConstraint->iColumn < JEACH_JSON ) continue; 2444 iCol = pConstraint->iColumn - JEACH_JSON; 2445 assert( iCol==0 || iCol==1 ); 2446 testcase( iCol==0 ); 2447 iMask = 1 << iCol; 2448 if( pConstraint->usable==0 ){ 2449 unusableMask |= iMask; 2450 }else if( pConstraint->op==SQLITE_INDEX_CONSTRAINT_EQ ){ 2451 aIdx[iCol] = i; 2452 idxMask |= iMask; 2453 } 2454 } 2455 if( (unusableMask & ~idxMask)!=0 ){ 2456 /* If there are any unusable constraints on JSON or ROOT, then reject 2457 ** this entire plan */ 2458 return SQLITE_CONSTRAINT; 2459 } 2460 if( aIdx[0]<0 ){ 2461 /* No JSON input. Leave estimatedCost at the huge value that it was 2462 ** initialized to to discourage the query planner from selecting this 2463 ** plan. */ 2464 pIdxInfo->idxNum = 0; 2465 }else{ 2466 pIdxInfo->estimatedCost = 1.0; 2467 i = aIdx[0]; 2468 pIdxInfo->aConstraintUsage[i].argvIndex = 1; 2469 pIdxInfo->aConstraintUsage[i].omit = 1; 2470 if( aIdx[1]<0 ){ 2471 pIdxInfo->idxNum = 1; /* Only JSON supplied. Plan 1 */ 2472 }else{ 2473 i = aIdx[1]; 2474 pIdxInfo->aConstraintUsage[i].argvIndex = 2; 2475 pIdxInfo->aConstraintUsage[i].omit = 1; 2476 pIdxInfo->idxNum = 3; /* Both JSON and ROOT are supplied. Plan 3 */ 2477 } 2478 } 2479 return SQLITE_OK; 2480 } 2481 2482 /* Start a search on a new JSON string */ 2483 static int jsonEachFilter( 2484 sqlite3_vtab_cursor *cur, 2485 int idxNum, const char *idxStr, 2486 int argc, sqlite3_value **argv 2487 ){ 2488 JsonEachCursor *p = (JsonEachCursor*)cur; 2489 const char *z; 2490 const char *zRoot = 0; 2491 sqlite3_int64 n; 2492 2493 UNUSED_PARAMETER(idxStr); 2494 UNUSED_PARAMETER(argc); 2495 jsonEachCursorReset(p); 2496 if( idxNum==0 ) return SQLITE_OK; 2497 z = (const char*)sqlite3_value_text(argv[0]); 2498 if( z==0 ) return SQLITE_OK; 2499 n = sqlite3_value_bytes(argv[0]); 2500 p->zJson = sqlite3_malloc64( n+1 ); 2501 if( p->zJson==0 ) return SQLITE_NOMEM; 2502 memcpy(p->zJson, z, (size_t)n+1); 2503 if( jsonParse(&p->sParse, 0, p->zJson) ){ 2504 int rc = SQLITE_NOMEM; 2505 if( p->sParse.oom==0 ){ 2506 sqlite3_free(cur->pVtab->zErrMsg); 2507 cur->pVtab->zErrMsg = sqlite3_mprintf("malformed JSON"); 2508 if( cur->pVtab->zErrMsg ) rc = SQLITE_ERROR; 2509 } 2510 jsonEachCursorReset(p); 2511 return rc; 2512 }else if( p->bRecursive && jsonParseFindParents(&p->sParse) ){ 2513 jsonEachCursorReset(p); 2514 return SQLITE_NOMEM; 2515 }else{ 2516 JsonNode *pNode = 0; 2517 if( idxNum==3 ){ 2518 const char *zErr = 0; 2519 zRoot = (const char*)sqlite3_value_text(argv[1]); 2520 if( zRoot==0 ) return SQLITE_OK; 2521 n = sqlite3_value_bytes(argv[1]); 2522 p->zRoot = sqlite3_malloc64( n+1 ); 2523 if( p->zRoot==0 ) return SQLITE_NOMEM; 2524 memcpy(p->zRoot, zRoot, (size_t)n+1); 2525 if( zRoot[0]!='$' ){ 2526 zErr = zRoot; 2527 }else{ 2528 pNode = jsonLookupStep(&p->sParse, 0, p->zRoot+1, 0, &zErr); 2529 } 2530 if( zErr ){ 2531 sqlite3_free(cur->pVtab->zErrMsg); 2532 cur->pVtab->zErrMsg = jsonPathSyntaxError(zErr); 2533 jsonEachCursorReset(p); 2534 return cur->pVtab->zErrMsg ? SQLITE_ERROR : SQLITE_NOMEM; 2535 }else if( pNode==0 ){ 2536 return SQLITE_OK; 2537 } 2538 }else{ 2539 pNode = p->sParse.aNode; 2540 } 2541 p->iBegin = p->i = (int)(pNode - p->sParse.aNode); 2542 p->eType = pNode->eType; 2543 if( p->eType>=JSON_ARRAY ){ 2544 assert( pNode->eU==0 ); 2545 VVA( pNode->eU = 3 ); 2546 pNode->u.iKey = 0; 2547 p->iEnd = p->i + pNode->n + 1; 2548 if( p->bRecursive ){ 2549 p->eType = p->sParse.aNode[p->sParse.aUp[p->i]].eType; 2550 if( p->i>0 && (p->sParse.aNode[p->i-1].jnFlags & JNODE_LABEL)!=0 ){ 2551 p->i--; 2552 } 2553 }else{ 2554 p->i++; 2555 } 2556 }else{ 2557 p->iEnd = p->i+1; 2558 } 2559 } 2560 return SQLITE_OK; 2561 } 2562 2563 /* The methods of the json_each virtual table */ 2564 static sqlite3_module jsonEachModule = { 2565 0, /* iVersion */ 2566 0, /* xCreate */ 2567 jsonEachConnect, /* xConnect */ 2568 jsonEachBestIndex, /* xBestIndex */ 2569 jsonEachDisconnect, /* xDisconnect */ 2570 0, /* xDestroy */ 2571 jsonEachOpenEach, /* xOpen - open a cursor */ 2572 jsonEachClose, /* xClose - close a cursor */ 2573 jsonEachFilter, /* xFilter - configure scan constraints */ 2574 jsonEachNext, /* xNext - advance a cursor */ 2575 jsonEachEof, /* xEof - check for end of scan */ 2576 jsonEachColumn, /* xColumn - read data */ 2577 jsonEachRowid, /* xRowid - read data */ 2578 0, /* xUpdate */ 2579 0, /* xBegin */ 2580 0, /* xSync */ 2581 0, /* xCommit */ 2582 0, /* xRollback */ 2583 0, /* xFindMethod */ 2584 0, /* xRename */ 2585 0, /* xSavepoint */ 2586 0, /* xRelease */ 2587 0, /* xRollbackTo */ 2588 0 /* xShadowName */ 2589 }; 2590 2591 /* The methods of the json_tree virtual table. */ 2592 static sqlite3_module jsonTreeModule = { 2593 0, /* iVersion */ 2594 0, /* xCreate */ 2595 jsonEachConnect, /* xConnect */ 2596 jsonEachBestIndex, /* xBestIndex */ 2597 jsonEachDisconnect, /* xDisconnect */ 2598 0, /* xDestroy */ 2599 jsonEachOpenTree, /* xOpen - open a cursor */ 2600 jsonEachClose, /* xClose - close a cursor */ 2601 jsonEachFilter, /* xFilter - configure scan constraints */ 2602 jsonEachNext, /* xNext - advance a cursor */ 2603 jsonEachEof, /* xEof - check for end of scan */ 2604 jsonEachColumn, /* xColumn - read data */ 2605 jsonEachRowid, /* xRowid - read data */ 2606 0, /* xUpdate */ 2607 0, /* xBegin */ 2608 0, /* xSync */ 2609 0, /* xCommit */ 2610 0, /* xRollback */ 2611 0, /* xFindMethod */ 2612 0, /* xRename */ 2613 0, /* xSavepoint */ 2614 0, /* xRelease */ 2615 0, /* xRollbackTo */ 2616 0 /* xShadowName */ 2617 }; 2618 #endif /* SQLITE_OMIT_VIRTUALTABLE */ 2619 #endif /* !defined(SQLITE_OMIT_JSON) */ 2620 2621 /* 2622 ** Register JSON functions. 2623 */ 2624 void sqlite3RegisterJsonFunctions(void){ 2625 #ifndef SQLITE_OMIT_JSON 2626 static FuncDef aJsonFunc[] = { 2627 JFUNCTION(json, 1, 0, jsonRemoveFunc), 2628 JFUNCTION(json_array, -1, 0, jsonArrayFunc), 2629 JFUNCTION(json_array_length, 1, 0, jsonArrayLengthFunc), 2630 JFUNCTION(json_array_length, 2, 0, jsonArrayLengthFunc), 2631 JFUNCTION(json_extract, -1, 0, jsonExtractFunc), 2632 JFUNCTION(->, 2, JSON_JSON, jsonExtractFunc), 2633 JFUNCTION(->>, 2, JSON_SQL, jsonExtractFunc), 2634 JFUNCTION(json_insert, -1, 0, jsonSetFunc), 2635 JFUNCTION(json_object, -1, 0, jsonObjectFunc), 2636 JFUNCTION(json_patch, 2, 0, jsonPatchFunc), 2637 JFUNCTION(json_quote, 1, 0, jsonQuoteFunc), 2638 JFUNCTION(json_remove, -1, 0, jsonRemoveFunc), 2639 JFUNCTION(json_replace, -1, 0, jsonReplaceFunc), 2640 JFUNCTION(json_set, -1, JSON_ISSET, jsonSetFunc), 2641 JFUNCTION(json_type, 1, 0, jsonTypeFunc), 2642 JFUNCTION(json_type, 2, 0, jsonTypeFunc), 2643 JFUNCTION(json_valid, 1, 0, jsonValidFunc), 2644 #if SQLITE_DEBUG 2645 JFUNCTION(json_parse, 1, 0, jsonParseFunc), 2646 JFUNCTION(json_test1, 1, 0, jsonTest1Func), 2647 #endif 2648 WAGGREGATE(json_group_array, 1, 0, 0, 2649 jsonArrayStep, jsonArrayFinal, jsonArrayValue, jsonGroupInverse, 2650 SQLITE_SUBTYPE|SQLITE_UTF8|SQLITE_DETERMINISTIC|SQLITE_INNOCUOUS), 2651 WAGGREGATE(json_group_object, 2, 0, 0, 2652 jsonObjectStep, jsonObjectFinal, jsonObjectValue, jsonGroupInverse, 2653 SQLITE_SUBTYPE|SQLITE_UTF8|SQLITE_DETERMINISTIC|SQLITE_INNOCUOUS) 2654 }; 2655 sqlite3InsertBuiltinFuncs(aJsonFunc, ArraySize(aJsonFunc)); 2656 #endif 2657 } 2658 2659 #if !defined(SQLITE_OMIT_VIRTUALTABLE) && !defined(SQLITE_OMIT_JSON) 2660 /* 2661 ** Register the JSON table-valued functions 2662 */ 2663 int sqlite3JsonTableFunctions(sqlite3 *db){ 2664 int rc = SQLITE_OK; 2665 static const struct { 2666 const char *zName; 2667 sqlite3_module *pModule; 2668 } aMod[] = { 2669 { "json_each", &jsonEachModule }, 2670 { "json_tree", &jsonTreeModule }, 2671 }; 2672 int i; 2673 for(i=0; i<sizeof(aMod)/sizeof(aMod[0]) && rc==SQLITE_OK; i++){ 2674 rc = sqlite3_create_module(db, aMod[i].zName, aMod[i].pModule, 0); 2675 } 2676 return rc; 2677 } 2678 #endif /* !defined(SQLITE_OMIT_VIRTUALTABLE) && !defined(SQLITE_OMIT_JSON) */ 2679