Fossil SCM

Always unlink prepared statements from the Stmt list prior to finalizing them. This prevents an error in db_finalize() from triggering a rollback and hence a recursive call to sqlite3_finalize().

drh 2018-07-24 22:01 forum-v2
Commit 42d821a714d092a86dfcdf6b815300b7d5ce228f5e42c10fe8658c4be8f2881d
1 file changed +5 -5
+5 -5
--- src/db.c
+++ src/db.c
@@ -492,15 +492,10 @@
492492
db_check_result(rc);
493493
return rc;
494494
}
495495
int db_finalize(Stmt *pStmt){
496496
int rc;
497
- db_stats(pStmt);
498
- blob_reset(&pStmt->sql);
499
- rc = sqlite3_finalize(pStmt->pStmt);
500
- db_check_result(rc);
501
- pStmt->pStmt = 0;
502497
if( pStmt->pNext ){
503498
pStmt->pNext->pPrev = pStmt->pPrev;
504499
}
505500
if( pStmt->pPrev ){
506501
pStmt->pPrev->pNext = pStmt->pNext;
@@ -507,10 +502,15 @@
507502
}else if( db.pAllStmt==pStmt ){
508503
db.pAllStmt = pStmt->pNext;
509504
}
510505
pStmt->pNext = 0;
511506
pStmt->pPrev = 0;
507
+ db_stats(pStmt);
508
+ blob_reset(&pStmt->sql);
509
+ rc = sqlite3_finalize(pStmt->pStmt);
510
+ db_check_result(rc);
511
+ pStmt->pStmt = 0;
512512
return rc;
513513
}
514514
515515
/*
516516
** Return the rowid of the most recent insert
517517
--- src/db.c
+++ src/db.c
@@ -492,15 +492,10 @@
492 db_check_result(rc);
493 return rc;
494 }
495 int db_finalize(Stmt *pStmt){
496 int rc;
497 db_stats(pStmt);
498 blob_reset(&pStmt->sql);
499 rc = sqlite3_finalize(pStmt->pStmt);
500 db_check_result(rc);
501 pStmt->pStmt = 0;
502 if( pStmt->pNext ){
503 pStmt->pNext->pPrev = pStmt->pPrev;
504 }
505 if( pStmt->pPrev ){
506 pStmt->pPrev->pNext = pStmt->pNext;
@@ -507,10 +502,15 @@
507 }else if( db.pAllStmt==pStmt ){
508 db.pAllStmt = pStmt->pNext;
509 }
510 pStmt->pNext = 0;
511 pStmt->pPrev = 0;
 
 
 
 
 
512 return rc;
513 }
514
515 /*
516 ** Return the rowid of the most recent insert
517
--- src/db.c
+++ src/db.c
@@ -492,15 +492,10 @@
492 db_check_result(rc);
493 return rc;
494 }
495 int db_finalize(Stmt *pStmt){
496 int rc;
 
 
 
 
 
497 if( pStmt->pNext ){
498 pStmt->pNext->pPrev = pStmt->pPrev;
499 }
500 if( pStmt->pPrev ){
501 pStmt->pPrev->pNext = pStmt->pNext;
@@ -507,10 +502,15 @@
502 }else if( db.pAllStmt==pStmt ){
503 db.pAllStmt = pStmt->pNext;
504 }
505 pStmt->pNext = 0;
506 pStmt->pPrev = 0;
507 db_stats(pStmt);
508 blob_reset(&pStmt->sql);
509 rc = sqlite3_finalize(pStmt->pStmt);
510 db_check_result(rc);
511 pStmt->pStmt = 0;
512 return rc;
513 }
514
515 /*
516 ** Return the rowid of the most recent insert
517

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button