diff options
author | drh <> | 2022-01-24 15:34:55 +0000 |
---|---|---|
committer | drh <> | 2022-01-24 15:34:55 +0000 |
commit | c692df2784db52587fdf2a2ae20340ad8e7fc034 (patch) | |
tree | 3ab1ebee2f4688a599475ef396c8397796cd54c3 /src/vdbeblob.c | |
parent | b5d44732214816116942ac27ebcb062542b31296 (diff) | |
download | sqlite-c692df2784db52587fdf2a2ae20340ad8e7fc034.tar.gz sqlite-c692df2784db52587fdf2a2ae20340ad8e7fc034.zip |
Make it so that any Parse object is always linked into the database conenction
while it is active. Hence, an OOM will cause Parse.nErr to be set.
FossilOrigin-Name: 6a45d8fe8bfbc11a5b86d25237e1f8bccfb0f22f3dcaf004ba797aeb57b365ec
Diffstat (limited to 'src/vdbeblob.c')
-rw-r--r-- | src/vdbeblob.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/src/vdbeblob.c b/src/vdbeblob.c index 512442fd2..a18ee05b5 100644 --- a/src/vdbeblob.c +++ b/src/vdbeblob.c @@ -152,10 +152,9 @@ int sqlite3_blob_open( sqlite3_mutex_enter(db->mutex); pBlob = (Incrblob *)sqlite3DbMallocZero(db, sizeof(Incrblob)); - do { - memset(&sParse, 0, sizeof(Parse)); + while(1){ + sqlite3ParseObjectInit(&sParse,db); if( !pBlob ) goto blob_open_out; - sParse.db = db; sqlite3DbFree(db, zErr); zErr = 0; @@ -332,7 +331,9 @@ int sqlite3_blob_open( goto blob_open_out; } rc = blobSeekToRow(pBlob, iRow, &zErr); - } while( (++nAttempt)<SQLITE_MAX_SCHEMA_RETRY && rc==SQLITE_SCHEMA ); + if( (++nAttempt)>=SQLITE_MAX_SCHEMA_RETRY || rc!=SQLITE_SCHEMA ) break; + sqlite3ParseObjectReset(&sParse); + } blob_open_out: if( rc==SQLITE_OK && db->mallocFailed==0 ){ @@ -343,7 +344,7 @@ blob_open_out: } sqlite3ErrorWithMsg(db, rc, (zErr ? "%s" : 0), zErr); sqlite3DbFree(db, zErr); - sqlite3ParserReset(&sParse); + sqlite3ParseObjectReset(&sParse); rc = sqlite3ApiExit(db, rc); sqlite3_mutex_leave(db->mutex); return rc; |