aboutsummaryrefslogtreecommitdiff
path: root/src/json.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/json.c')
-rw-r--r--src/json.c31
1 files changed, 14 insertions, 17 deletions
diff --git a/src/json.c b/src/json.c
index 850e2241e..6a4a0babf 100644
--- a/src/json.c
+++ b/src/json.c
@@ -4521,23 +4521,20 @@ static int jsonEachNext(sqlite3_vtab_cursor *cur){
*/
static int jsonEachPathLength(JsonEachCursor *p){
u32 n = p->path.nUsed;
- const char *z = p->path.zBuf;
- if( p->iRowid==0 && p->bRecursive && n>1 ){
- if( z[n-1]==']' ){
- do{
- assert( n>1 );
- n--;
- }while( z[n]!='[' );
- }else if( z[n-1]=='"' ){
- do{
- assert( n>1 );
- n--;
- }while( z[n]!='.' || z[n+1]!='"' );
- }else{
- do{
- assert( n>1 );
- n--;
- }while( z[n]!='.' );
+ char *z = p->path.zBuf;
+ if( p->iRowid==0 && p->bRecursive && n>=2 ){
+ while( n>1 ){
+ n--;
+ if( z[n]=='[' || z[n]=='.' ){
+ u32 x, sz = 0;
+ char cSaved = z[n];
+ z[n] = 0;
+ assert( p->sParse.eEdit==0 );
+ x = jsonLookupStep(&p->sParse, 0, z+1, 0);
+ z[n] = cSaved;
+ if( JSON_LOOKUP_ISERROR(x) ) continue;
+ if( x + jsonbPayloadSize(&p->sParse, x, &sz) == p->i ) break;
+ }
}
}
return n;