diff options
author | drh <> | 2023-04-27 14:38:51 +0000 |
---|---|---|
committer | drh <> | 2023-04-27 14:38:51 +0000 |
commit | 0d8579120a2d46b75d1564e7d928690fb33ef572 (patch) | |
tree | 83c3778fcabfb9d9f8e709f40514550a4c04c47f /src/json.c | |
parent | a549e7a527902556f8bd55e506674f8a3a983952 (diff) | |
download | sqlite-0d8579120a2d46b75d1564e7d928690fb33ef572.tar.gz sqlite-0d8579120a2d46b75d1564e7d928690fb33ef572.zip |
Performance optimization in the JSON parser.
FossilOrigin-Name: 5a88ba743f55d45b1c0ce0090bb3b396bcf7fcf7b3bcb989aaf30b8bb772599e
Diffstat (limited to 'src/json.c')
-rw-r--r-- | src/json.c | 33 |
1 files changed, 30 insertions, 3 deletions
diff --git a/src/json.c b/src/json.c index dbc1c6b83..3828ca6bc 100644 --- a/src/json.c +++ b/src/json.c @@ -1075,19 +1075,35 @@ json_parse_restart: if( z[j]==':' ){ j++; }else{ + if( fast_isspace(z[j]) ){ + do{ j++; }while( fast_isspace(z[j]) ); + if( z[j]==':' ){ + j++; + goto parse_object_value; + } + } x = jsonParseValue(pParse, j); if( x!=(-5) ) return -1; j = pParse->iErr+1; } + parse_object_value: x = jsonParseValue(pParse, j); pParse->iDepth--; - if( x<0 ) return -1; + if( x<=0 ) return -1; j = x; if( z[j]==',' ){ continue; }else if( z[j]=='}' ){ break; }else{ + if( fast_isspace(z[j]) ){ + do{ j++; }while( fast_isspace(z[j]) ); + if( z[j]==',' ){ + continue; + }else if( z[j]=='}' ){ + break; + } + } x = jsonParseValue(pParse, j); if( x==(-4) ){ j = pParse->iErr; @@ -1112,7 +1128,7 @@ json_parse_restart: if( ++pParse->iDepth > JSON_MAX_DEPTH ) return -1; x = jsonParseValue(pParse, j); pParse->iDepth--; - if( x<0 ){ + if( x<=0 ){ if( x==(-3) ){ j = pParse->iErr; if( pParse->nNode!=(u32)iThis+1 ) pParse->has5 = 1; @@ -1126,6 +1142,14 @@ json_parse_restart: }else if( z[j]==']' ){ break; }else{ + if( fast_isspace(z[j]) ){ + do{ j++; }while( fast_isspace(z[j]) ); + if( z[j]==',' ){ + continue; + }else if( z[j]==']' ){ + break; + } + } x = jsonParseValue(pParse, j); if( x==(-4) ){ j = pParse->iErr; @@ -1378,7 +1402,10 @@ static int jsonParse( while( fast_isspace(zJson[i]) ) i++; if( zJson[i] ){ i += json5Whitespace(&zJson[i]); - if( zJson[i] ) return -1; + if( zJson[i] ){ + jsonParseReset(pParse); + return 1; + } pParse->has5 = 1; } } |