aboutsummaryrefslogtreecommitdiff
path: root/src/json.c
diff options
context:
space:
mode:
authordrh <>2023-04-27 14:38:51 +0000
committerdrh <>2023-04-27 14:38:51 +0000
commit0d8579120a2d46b75d1564e7d928690fb33ef572 (patch)
tree83c3778fcabfb9d9f8e709f40514550a4c04c47f /src/json.c
parenta549e7a527902556f8bd55e506674f8a3a983952 (diff)
downloadsqlite-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.c33
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;
}
}