aboutsummaryrefslogtreecommitdiff
path: root/src/vdbeblob.c
diff options
context:
space:
mode:
authordrh <>2022-01-24 15:34:55 +0000
committerdrh <>2022-01-24 15:34:55 +0000
commitc692df2784db52587fdf2a2ae20340ad8e7fc034 (patch)
tree3ab1ebee2f4688a599475ef396c8397796cd54c3 /src/vdbeblob.c
parentb5d44732214816116942ac27ebcb062542b31296 (diff)
downloadsqlite-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.c11
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;