From: drh Date: Mon, 4 Apr 2011 21:25:28 +0000 (+0000) Subject: Additional schema mutex checks for sqlite3RootPageMoved(). X-Git-Tag: version-3.7.6~39^2~1 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=cdf011dcc4bb61236e9664f299a177d41172e4be;p=thirdparty%2Fsqlite.git Additional schema mutex checks for sqlite3RootPageMoved(). Reduce the scope of sqlite3ResetInternalSchema() in a few places. FossilOrigin-Name: 39c00907833413c0d97d3e06fdda967b825d23ea --- diff --git a/manifest b/manifest index b3c7e0606a..c71c3e41f8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Minor\scomment\stypo\scorrections.\s\sSimplify\san\sassert.\s\sNo\sfunctional\schanges. -D 2011-04-04T20:40:22.086 +C Additional\sschema\smutex\schecks\sfor\ssqlite3RootPageMoved().\nReduce\sthe\sscope\sof\ssqlite3ResetInternalSchema()\sin\sa\sfew\splaces. +D 2011-04-04T21:25:28.533 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 7a4d9524721d40ef9ee26f93f9bd6a51dba106f2 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -124,7 +124,7 @@ F src/btmutex.c b81062220a4f91b0bd785d13d57205d68449be88 F src/btree.c 107723ed4f9bdb55213ba6164c30c49af75f4bf9 F src/btree.h c0e0ff5c85effe9fc757e3085bbdded6d1cca000 F src/btreeInt.h 6714ce2f5e879eb9a904a6a4575dc4faa4f29991 -F src/build.c 63465c86f7d5919fddb112ec6d38342863e8e8b3 +F src/build.c d809f57250b10e83586bc23921de02055890b239 F src/callback.c 0425c6320730e6d3981acfb9202c1bed9016ad1a F src/complete.c dc1d136c0feee03c2f7550bafc0d29075e36deac F src/ctime.c 52ff72f966cee3087e0138a3ec69371c22be3c01 @@ -171,7 +171,7 @@ F src/pcache.c 09d38c44ab275db581f7a2f6ff8b9bc7f8c0faaa F src/pcache.h c683390d50f856d4cd8e24342ae62027d1bb6050 F src/pcache1.c d548e31beafa792d1994b663a29a5303569efc4e F src/pragma.c 36eec9129bfea2dbcdc1694d362f17330132697d -F src/prepare.c a4d8ac347b39e317d2f463c36b22c650e00b7126 +F src/prepare.c 206e1f06479fb5f756592bded468bd3ece3f41d4 F src/printf.c 585a36b6a963df832cfb69505afa3a34ed5ef8a1 F src/random.c cd4a67b3953b88019f8cd4ccd81394a8ddfaba50 F src/resolve.c 1c0f32b64f8e3f555fe1f732f9d6f501a7f05706 @@ -180,7 +180,7 @@ F src/select.c d24406c45dd2442eb2eeaac413439066b149c944 F src/shell.c 9dc0b4bb59290c0a35256d278cab0f314987ad6a F src/sqlite.h.in e047f69a61d604d4f8be6cf1d1bdfc68be9ba7e5 F src/sqlite3ext.h c90bd5507099f62043832d73f6425d8d5c5da754 -F src/sqliteInt.h 4db35e6a25a424d40bf19b0a818f3e9c78e9e7e2 +F src/sqliteInt.h 7b0150bfdab049b11bb2d055d065051ff734d113 F src/sqliteLimit.h a17dcd3fb775d63b64a43a55c54cb282f9726f44 F src/status.c 7ac64842c86cec2fc1a1d0e5c16d3beb8ad332bf F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e @@ -235,7 +235,7 @@ F src/update.c 81911be16ece3c3e7716aa18565b4814ec41f8b9 F src/utf.c d83650c3ea08f7407bd9d0839d9885241c209c60 F src/util.c cd997077bad039efc0597eb027c929658f93c018 F src/vacuum.c 3b2b0998f4f277e4bc61469c2d78d8424d02899b -F src/vdbe.c 1e62a4f18500f86137fda77416c5e55f7336d1d1 +F src/vdbe.c 0140a57f9cbd50351219bfc4e44ef3de64bd65b8 F src/vdbe.h 4de0efb4b0fdaaa900cf419b35c458933ef1c6d2 F src/vdbeInt.h 7e2f028ecc1a9faa6f253e7aa8d89cae03662bae F src/vdbeapi.c a09ad9164cafc505250d5dd6b69660c960f1308c @@ -926,7 +926,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P ae8374af057b6e6546e9265148cfffe32fcb0849 -R b2220f2e44fb0854f9cc6a8a89a03fab +P 82c2316240345167a571507d9392dfb6445ef523 +R 7c6dcb957e59966f9f4fd72f4c665ab1 U drh -Z 3ca4bebd3aef258bcff81de8a689c390 +Z 5433fdc0cc3ff75407dd2b1ee53a6522 diff --git a/manifest.uuid b/manifest.uuid index fc406390db..18b6d137fd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -82c2316240345167a571507d9392dfb6445ef523 \ No newline at end of file +39c00907833413c0d97d3e06fdda967b825d23ea \ No newline at end of file diff --git a/src/build.c b/src/build.c index 51b790586b..7e73b6a8eb 100644 --- a/src/build.c +++ b/src/build.c @@ -1866,10 +1866,13 @@ static void sqliteViewResetAll(sqlite3 *db, int idx){ ** in order to be certain that we got the right one. */ #ifndef SQLITE_OMIT_AUTOVACUUM -void sqlite3RootPageMoved(Db *pDb, int iFrom, int iTo){ +void sqlite3RootPageMoved(sqlite3 *db, int iDb, int iFrom, int iTo){ HashElem *pElem; Hash *pHash; + Db *pDb; + assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); + pDb = &db->aDb[iDb]; pHash = &pDb->pSchema->tblHash; for(pElem=sqliteHashFirst(pHash); pElem; pElem=sqliteHashNext(pElem)){ Table *pTab = sqliteHashData(pElem); diff --git a/src/prepare.c b/src/prepare.c index aad2bc0b6e..b5edaf5032 100644 --- a/src/prepare.c +++ b/src/prepare.c @@ -472,6 +472,7 @@ static void schemaIsValid(Parse *pParse){ sqlite3BtreeGetMeta(pBt, BTREE_SCHEMA_VERSION, (u32 *)&cookie); assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); if( cookie!=db->aDb[iDb].pSchema->schema_cookie ){ + sqlite3ResetInternalSchema(db, iDb); pParse->rc = SQLITE_SCHEMA; } @@ -613,9 +614,6 @@ static int sqlite3Prepare( if( pParse->checkSchema ){ schemaIsValid(pParse); } - if( pParse->rc==SQLITE_SCHEMA ){ - sqlite3ResetInternalSchema(db, -1); - } if( db->mallocFailed ){ pParse->rc = SQLITE_NOMEM; } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 1d8194a1eb..b874c5e038 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2956,7 +2956,7 @@ extern SQLITE_WSD FuncDefHash sqlite3GlobalFunctions; extern int sqlite3PendingByte; #endif #endif -void sqlite3RootPageMoved(Db*, int, int); +void sqlite3RootPageMoved(sqlite3*, int, int, int); void sqlite3Reindex(Parse*, Token*, Token*); void sqlite3AlterFunctions(void); void sqlite3AlterRenameTable(Parse*, SrcList*, Token*); diff --git a/src/vdbe.c b/src/vdbe.c index 6dc305dcc5..94fd0ff62b 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -551,7 +551,7 @@ int sqlite3VdbeExec( Op *pOp; /* Current operation */ int rc = SQLITE_OK; /* Value to return */ sqlite3 *db = p->db; /* The database */ - u8 resetSchemaOnFault = 0; /* Reset schema after an error if true */ + u8 resetSchemaOnFault = 0; /* Reset schema after an error if positive */ u8 encoding = ENC(db); /* The database encoding */ #ifndef SQLITE_OMIT_PROGRESS_CALLBACK int checkProgress; /* True if progress callbacks are enabled */ @@ -2953,7 +2953,6 @@ case OP_VerifyCookie: { */ if( db->aDb[pOp->p1].pSchema->schema_cookie!=iMeta ){ sqlite3ResetInternalSchema(db, pOp->p1); - sqlite3VdbeMutexResync(p); } p->expired = 1; @@ -4534,8 +4533,10 @@ case OP_Destroy: { /* out2-prerelease */ pOut->u.i = iMoved; #ifndef SQLITE_OMIT_AUTOVACUUM if( rc==SQLITE_OK && iMoved!=0 ){ - sqlite3RootPageMoved(&db->aDb[iDb], iMoved, pOp->p1); - resetSchemaOnFault = 1; + sqlite3RootPageMoved(db, iDb, iMoved, pOp->p1); + /* All OP_Destroy operations occur on the same btree */ + assert( resetSchemaOnFault==0 || resetSchemaOnFault==iDb+1 ); + resetSchemaOnFault = iDb+1; } #endif } @@ -5969,9 +5970,8 @@ vdbe_error_halt: sqlite3VdbeHalt(p); if( rc==SQLITE_IOERR_NOMEM ) db->mallocFailed = 1; rc = SQLITE_ERROR; - if( resetSchemaOnFault ){ - sqlite3ResetInternalSchema(db, 0); - sqlite3VdbeMutexResync(p); + if( resetSchemaOnFault>0 ){ + sqlite3ResetInternalSchema(db, resetSchemaOnFault-1); } /* This is the only way out of this procedure. We have to