1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-08-10 01:02:56 +03:00

Additional schema mutex checks for sqlite3RootPageMoved().

Reduce the scope of sqlite3ResetInternalSchema() in a few places.

FossilOrigin-Name: 39c00907833413c0d97d3e06fdda967b825d23ea
This commit is contained in:
drh
2011-04-04 21:25:28 +00:00
parent 9bbc2e283e
commit cdf011dcc4
6 changed files with 23 additions and 22 deletions

View File

@@ -1,5 +1,5 @@
C Minor\scomment\stypo\scorrections.\s\sSimplify\san\sassert.\s\sNo\sfunctional\schanges. C Additional\sschema\smutex\schecks\sfor\ssqlite3RootPageMoved().\nReduce\sthe\sscope\sof\ssqlite3ResetInternalSchema()\sin\sa\sfew\splaces.
D 2011-04-04T20:40:22.086 D 2011-04-04T21:25:28.533
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
F Makefile.in 7a4d9524721d40ef9ee26f93f9bd6a51dba106f2 F Makefile.in 7a4d9524721d40ef9ee26f93f9bd6a51dba106f2
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -124,7 +124,7 @@ F src/btmutex.c b81062220a4f91b0bd785d13d57205d68449be88
F src/btree.c 107723ed4f9bdb55213ba6164c30c49af75f4bf9 F src/btree.c 107723ed4f9bdb55213ba6164c30c49af75f4bf9
F src/btree.h c0e0ff5c85effe9fc757e3085bbdded6d1cca000 F src/btree.h c0e0ff5c85effe9fc757e3085bbdded6d1cca000
F src/btreeInt.h 6714ce2f5e879eb9a904a6a4575dc4faa4f29991 F src/btreeInt.h 6714ce2f5e879eb9a904a6a4575dc4faa4f29991
F src/build.c 63465c86f7d5919fddb112ec6d38342863e8e8b3 F src/build.c d809f57250b10e83586bc23921de02055890b239
F src/callback.c 0425c6320730e6d3981acfb9202c1bed9016ad1a F src/callback.c 0425c6320730e6d3981acfb9202c1bed9016ad1a
F src/complete.c dc1d136c0feee03c2f7550bafc0d29075e36deac F src/complete.c dc1d136c0feee03c2f7550bafc0d29075e36deac
F src/ctime.c 52ff72f966cee3087e0138a3ec69371c22be3c01 F src/ctime.c 52ff72f966cee3087e0138a3ec69371c22be3c01
@@ -171,7 +171,7 @@ F src/pcache.c 09d38c44ab275db581f7a2f6ff8b9bc7f8c0faaa
F src/pcache.h c683390d50f856d4cd8e24342ae62027d1bb6050 F src/pcache.h c683390d50f856d4cd8e24342ae62027d1bb6050
F src/pcache1.c d548e31beafa792d1994b663a29a5303569efc4e F src/pcache1.c d548e31beafa792d1994b663a29a5303569efc4e
F src/pragma.c 36eec9129bfea2dbcdc1694d362f17330132697d F src/pragma.c 36eec9129bfea2dbcdc1694d362f17330132697d
F src/prepare.c a4d8ac347b39e317d2f463c36b22c650e00b7126 F src/prepare.c 206e1f06479fb5f756592bded468bd3ece3f41d4
F src/printf.c 585a36b6a963df832cfb69505afa3a34ed5ef8a1 F src/printf.c 585a36b6a963df832cfb69505afa3a34ed5ef8a1
F src/random.c cd4a67b3953b88019f8cd4ccd81394a8ddfaba50 F src/random.c cd4a67b3953b88019f8cd4ccd81394a8ddfaba50
F src/resolve.c 1c0f32b64f8e3f555fe1f732f9d6f501a7f05706 F src/resolve.c 1c0f32b64f8e3f555fe1f732f9d6f501a7f05706
@@ -180,7 +180,7 @@ F src/select.c d24406c45dd2442eb2eeaac413439066b149c944
F src/shell.c 9dc0b4bb59290c0a35256d278cab0f314987ad6a F src/shell.c 9dc0b4bb59290c0a35256d278cab0f314987ad6a
F src/sqlite.h.in e047f69a61d604d4f8be6cf1d1bdfc68be9ba7e5 F src/sqlite.h.in e047f69a61d604d4f8be6cf1d1bdfc68be9ba7e5
F src/sqlite3ext.h c90bd5507099f62043832d73f6425d8d5c5da754 F src/sqlite3ext.h c90bd5507099f62043832d73f6425d8d5c5da754
F src/sqliteInt.h 4db35e6a25a424d40bf19b0a818f3e9c78e9e7e2 F src/sqliteInt.h 7b0150bfdab049b11bb2d055d065051ff734d113
F src/sqliteLimit.h a17dcd3fb775d63b64a43a55c54cb282f9726f44 F src/sqliteLimit.h a17dcd3fb775d63b64a43a55c54cb282f9726f44
F src/status.c 7ac64842c86cec2fc1a1d0e5c16d3beb8ad332bf F src/status.c 7ac64842c86cec2fc1a1d0e5c16d3beb8ad332bf
F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e
@@ -235,7 +235,7 @@ F src/update.c 81911be16ece3c3e7716aa18565b4814ec41f8b9
F src/utf.c d83650c3ea08f7407bd9d0839d9885241c209c60 F src/utf.c d83650c3ea08f7407bd9d0839d9885241c209c60
F src/util.c cd997077bad039efc0597eb027c929658f93c018 F src/util.c cd997077bad039efc0597eb027c929658f93c018
F src/vacuum.c 3b2b0998f4f277e4bc61469c2d78d8424d02899b F src/vacuum.c 3b2b0998f4f277e4bc61469c2d78d8424d02899b
F src/vdbe.c 1e62a4f18500f86137fda77416c5e55f7336d1d1 F src/vdbe.c 0140a57f9cbd50351219bfc4e44ef3de64bd65b8
F src/vdbe.h 4de0efb4b0fdaaa900cf419b35c458933ef1c6d2 F src/vdbe.h 4de0efb4b0fdaaa900cf419b35c458933ef1c6d2
F src/vdbeInt.h 7e2f028ecc1a9faa6f253e7aa8d89cae03662bae F src/vdbeInt.h 7e2f028ecc1a9faa6f253e7aa8d89cae03662bae
F src/vdbeapi.c a09ad9164cafc505250d5dd6b69660c960f1308c F src/vdbeapi.c a09ad9164cafc505250d5dd6b69660c960f1308c
@@ -926,7 +926,7 @@ F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c F tool/split-sqlite3c.tcl d9be87f1c340285a3e081eb19b4a247981ed290c
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
P ae8374af057b6e6546e9265148cfffe32fcb0849 P 82c2316240345167a571507d9392dfb6445ef523
R b2220f2e44fb0854f9cc6a8a89a03fab R 7c6dcb957e59966f9f4fd72f4c665ab1
U drh U drh
Z 3ca4bebd3aef258bcff81de8a689c390 Z 5433fdc0cc3ff75407dd2b1ee53a6522

View File

@@ -1 +1 @@
82c2316240345167a571507d9392dfb6445ef523 39c00907833413c0d97d3e06fdda967b825d23ea

View File

@@ -1866,10 +1866,13 @@ static void sqliteViewResetAll(sqlite3 *db, int idx){
** in order to be certain that we got the right one. ** in order to be certain that we got the right one.
*/ */
#ifndef SQLITE_OMIT_AUTOVACUUM #ifndef SQLITE_OMIT_AUTOVACUUM
void sqlite3RootPageMoved(Db *pDb, int iFrom, int iTo){ void sqlite3RootPageMoved(sqlite3 *db, int iDb, int iFrom, int iTo){
HashElem *pElem; HashElem *pElem;
Hash *pHash; Hash *pHash;
Db *pDb;
assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
pDb = &db->aDb[iDb];
pHash = &pDb->pSchema->tblHash; pHash = &pDb->pSchema->tblHash;
for(pElem=sqliteHashFirst(pHash); pElem; pElem=sqliteHashNext(pElem)){ for(pElem=sqliteHashFirst(pHash); pElem; pElem=sqliteHashNext(pElem)){
Table *pTab = sqliteHashData(pElem); Table *pTab = sqliteHashData(pElem);

View File

@@ -472,6 +472,7 @@ static void schemaIsValid(Parse *pParse){
sqlite3BtreeGetMeta(pBt, BTREE_SCHEMA_VERSION, (u32 *)&cookie); sqlite3BtreeGetMeta(pBt, BTREE_SCHEMA_VERSION, (u32 *)&cookie);
assert( sqlite3SchemaMutexHeld(db, iDb, 0) ); assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
if( cookie!=db->aDb[iDb].pSchema->schema_cookie ){ if( cookie!=db->aDb[iDb].pSchema->schema_cookie ){
sqlite3ResetInternalSchema(db, iDb);
pParse->rc = SQLITE_SCHEMA; pParse->rc = SQLITE_SCHEMA;
} }
@@ -613,9 +614,6 @@ static int sqlite3Prepare(
if( pParse->checkSchema ){ if( pParse->checkSchema ){
schemaIsValid(pParse); schemaIsValid(pParse);
} }
if( pParse->rc==SQLITE_SCHEMA ){
sqlite3ResetInternalSchema(db, -1);
}
if( db->mallocFailed ){ if( db->mallocFailed ){
pParse->rc = SQLITE_NOMEM; pParse->rc = SQLITE_NOMEM;
} }

View File

@@ -2956,7 +2956,7 @@ extern SQLITE_WSD FuncDefHash sqlite3GlobalFunctions;
extern int sqlite3PendingByte; extern int sqlite3PendingByte;
#endif #endif
#endif #endif
void sqlite3RootPageMoved(Db*, int, int); void sqlite3RootPageMoved(sqlite3*, int, int, int);
void sqlite3Reindex(Parse*, Token*, Token*); void sqlite3Reindex(Parse*, Token*, Token*);
void sqlite3AlterFunctions(void); void sqlite3AlterFunctions(void);
void sqlite3AlterRenameTable(Parse*, SrcList*, Token*); void sqlite3AlterRenameTable(Parse*, SrcList*, Token*);

View File

@@ -551,7 +551,7 @@ int sqlite3VdbeExec(
Op *pOp; /* Current operation */ Op *pOp; /* Current operation */
int rc = SQLITE_OK; /* Value to return */ int rc = SQLITE_OK; /* Value to return */
sqlite3 *db = p->db; /* The database */ 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 */ u8 encoding = ENC(db); /* The database encoding */
#ifndef SQLITE_OMIT_PROGRESS_CALLBACK #ifndef SQLITE_OMIT_PROGRESS_CALLBACK
int checkProgress; /* True if progress callbacks are enabled */ int checkProgress; /* True if progress callbacks are enabled */
@@ -2953,7 +2953,6 @@ case OP_VerifyCookie: {
*/ */
if( db->aDb[pOp->p1].pSchema->schema_cookie!=iMeta ){ if( db->aDb[pOp->p1].pSchema->schema_cookie!=iMeta ){
sqlite3ResetInternalSchema(db, pOp->p1); sqlite3ResetInternalSchema(db, pOp->p1);
sqlite3VdbeMutexResync(p);
} }
p->expired = 1; p->expired = 1;
@@ -4534,8 +4533,10 @@ case OP_Destroy: { /* out2-prerelease */
pOut->u.i = iMoved; pOut->u.i = iMoved;
#ifndef SQLITE_OMIT_AUTOVACUUM #ifndef SQLITE_OMIT_AUTOVACUUM
if( rc==SQLITE_OK && iMoved!=0 ){ if( rc==SQLITE_OK && iMoved!=0 ){
sqlite3RootPageMoved(&db->aDb[iDb], iMoved, pOp->p1); sqlite3RootPageMoved(db, iDb, iMoved, pOp->p1);
resetSchemaOnFault = 1; /* All OP_Destroy operations occur on the same btree */
assert( resetSchemaOnFault==0 || resetSchemaOnFault==iDb+1 );
resetSchemaOnFault = iDb+1;
} }
#endif #endif
} }
@@ -5969,9 +5970,8 @@ vdbe_error_halt:
sqlite3VdbeHalt(p); sqlite3VdbeHalt(p);
if( rc==SQLITE_IOERR_NOMEM ) db->mallocFailed = 1; if( rc==SQLITE_IOERR_NOMEM ) db->mallocFailed = 1;
rc = SQLITE_ERROR; rc = SQLITE_ERROR;
if( resetSchemaOnFault ){ if( resetSchemaOnFault>0 ){
sqlite3ResetInternalSchema(db, 0); sqlite3ResetInternalSchema(db, resetSchemaOnFault-1);
sqlite3VdbeMutexResync(p);
} }
/* This is the only way out of this procedure. We have to /* This is the only way out of this procedure. We have to