diff --git a/manifest b/manifest index 511dafb31d..f92100e482 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Five-algorithm\sconflict\sresolution\sappears\sto\sbe\sworking.\s(CVS\s363) -D 2002-02-03T00:56:10 +C The\sVACUUM\scommand\snow\sdoes\sa\sdatabase\ssanity\scheck.\s(CVS\s364) +D 2002-02-03T03:34:08 F Makefile.in 9fa4277413bf1d9cf91365f07d4108d7d87ed2af F Makefile.template 3372d45f8853afdb70bd30cc6fb50a3cd9069834 F README a4c0ba11354ef6ba0776b400d057c59da47a4cc0 @@ -19,13 +19,13 @@ F ltmain.sh e9ed72eb1d690f447c13945eaf69e28af531eda1 F publish.sh 5b59f4aff037aafa0e4a3b6fa599495dbd73f360 F sqlite.1 2e2bb0529ef468ade9e4322bd609d0695fb9ded9 F src/TODO af7f3cab0228e34149cf98e073aa83d45878e7e6 -F src/btree.c ba5712cf620f80055948cc41157e14eab6ceee86 +F src/btree.c ced7d25e7ed33df5ef177e839db3e137d3c6a361 F src/btree.h a94bef69f5174461331b6b9ae45a2d84f05af6db -F src/build.c 0c7346d0522e59be67a4bb841020540d8ba5d136 +F src/build.c a8851852bd67821a06dc1a816291ca0edaf15a18 F src/delete.c f8ad71be53cf18656b6573de65395852fe817f0c F src/expr.c a2a87dbd411a508ff89dffa90505ad42dac2f920 F src/hash.c 8f7c740ef2eaaa8decfa8751f2be30680b123e46 -F src/hash.h a5f5b3ce2d086a172c5879b0b06a27a82eac9fac +F src/hash.h d1ce47900c7325af5e41c4feb4855c4bf2b841e7 F src/insert.c 173da7b06fe9282e0f529ff1e599460304ceeb23 F src/main.c 300320ba68d3e5b22c2c5b2c07fa884878202181 F src/md5.c 52f677bfc590e09f71d07d7e327bd59da738d07c @@ -49,15 +49,15 @@ F src/test3.c d6775f95fd91f5b3cf0e2382a28e5aaeb68f745b F src/tokenize.c 01a09db6adf933e941db1b781789a0c175be6504 F src/update.c 95459f94a061860bf8e5716b3426a5ba85c79103 F src/util.c 8f8973dd55a6ec63be9632fc5de86965c99d6327 -F src/vdbe.c df1c920e74b2cd76d763833a655fbabb67f17237 -F src/vdbe.h 3791edabb212038ae5fbcfa72580204596be01a7 +F src/vdbe.c 6e9851f14edaa98fd244103ff899082063a0e519 +F src/vdbe.h 3d49d22ba9ad14ea0e380bc582ff57347eaddb59 F src/where.c 2dda39367f193194e4c7d2e0dcab31527d9d8aba F test/all.test 2a51e5395ac7c2c539689b123b9782a05e3837fe F test/bigrow.test 8ab252dba108f12ad64e337b0f2ff31a807ac578 F test/btree.test 6ab4dc5f595905a276ef588fad3c9236dc07a47b F test/btree2.test 08e9485619265cbaf5d11bd71f357cdc26bb87e0 F test/btree3.test 9caa9e22491dd8cd8aa36d7ac3b48b089817c895 -F test/conflict.test dd1b380595bb48b90289d761f4d11a46d7c60178 +F test/conflict.test 5515d5dcbb6be9c715d1b83b2796b8a9cb7a32d4 F test/copy.test 9ff0063c0b95b3d51b8d0c7fe0ff51dabaa66549 F test/delete.test c904a62129fe102b314a96111a8417f10249e4d8 F test/expr.test c8a495050dcec3f9e68538c3ef466726933302c1 @@ -122,7 +122,7 @@ F www/speed.tcl 83457b2bf6bb430900bd48ca3dd98264d9a916a5 F www/sqlite.tcl 8b5884354cb615049aed83039f8dfe1552a44279 F www/tclsqlite.tcl 829b393d1ab187fd7a5e978631b3429318885c49 F www/vdbe.tcl 2013852c27a02a091d39a766bc87cff329f21218 -P 9be4d4c6f12056782966396dca0b8e2d384d0cf2 -R 60fe69f0169f5844176ca5b7853e2e65 +P 0115518f8e4591123582e3d2bb67282111ebcf60 +R 3b844437150a914d910bcb945e186cae U drh -Z fa5a72d3a4d7961b510d6a8d5ba99c2c +Z 41bd35da914d3e147a09ab98b479c192 diff --git a/manifest.uuid b/manifest.uuid index 7e943ff703..8eaf5c4165 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0115518f8e4591123582e3d2bb67282111ebcf60 \ No newline at end of file +95d1f8389dd5e168bdf0290169662296b6a0f6d9 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 2aaee41752..bf52166325 100644 --- a/src/btree.c +++ b/src/btree.c @@ -9,7 +9,7 @@ ** May you share freely, never taking more than you give. ** ************************************************************************* -** $Id: btree.c,v 1.48 2002/02/03 00:56:10 drh Exp $ +** $Id: btree.c,v 1.49 2002/02/03 03:34:08 drh Exp $ ** ** This file implements a external (disk-based) database using BTrees. ** For a detailed discussion of BTrees, refer to @@ -2737,7 +2737,7 @@ static int checkTreePage( cur.idx = i; zKey2 = sqliteMalloc( NKEY(pCell->h)+1 ); getPayload(&cur, 0, NKEY(pCell->h), zKey2); - if( zKey1 && strcmp(zKey1,zKey2)>=0 ){ + if( zKey1 && strcmp(zKey1,zKey2)>0 ){ checkAppendMsg(pCheck, zContext, "Key is out of order"); } diff --git a/src/build.c b/src/build.c index a9fcf22603..9a0594977a 100644 --- a/src/build.c +++ b/src/build.c @@ -25,7 +25,7 @@ ** ROLLBACK ** PRAGMA ** -** $Id: build.c,v 1.72 2002/02/03 00:56:10 drh Exp $ +** $Id: build.c,v 1.73 2002/02/03 03:34:08 drh Exp $ */ #include "sqliteInt.h" #include @@ -1397,49 +1397,34 @@ copy_cleanup: ** The non-standard VACUUM command is used to clean up the database, ** collapse free space, etc. It is modelled after the VACUUM command ** in PostgreSQL. +** +** In this implementation, no cleanup occurs. Instead, the B-tree that +** forms the database is checked for integrity. This is a no-op unless +** SQLite is compiled with the SQLITE_TEST macro. */ void sqliteVacuum(Parse *pParse, Token *pTableName){ - char *zName; +#if 1 + static VdbeOp checkDb[] = { + { OP_SetInsert, 0, 0, "2"}, + { OP_Open, 0, 2, 0}, + { OP_Rewind, 0, 6, 0}, + { OP_Column, 0, 3, 0}, + { OP_SetInsert, 0, 0, 0}, + { OP_Next, 0, 3, 0}, + { OP_SanityCheck, 0, 0, 0}, + { OP_ColumnCount, 1, 0, 0}, + { OP_ColumnName, 0, 0, "sanity_check"}, + { OP_Callback, 1, 0, 0}, + }; + static Vdbe *v; - sqlite *db = pParse->db; + - if( pParse->nErr || sqlite_malloc_failed ) return; - if( pTableName ){ - zName = sqliteTableNameFromToken(pTableName); - }else{ - zName = 0; - } - if( zName && sqliteFindIndex(db, zName)==0 - && sqliteFindTable(db, zName)==0 ){ - sqliteSetString(&pParse->zErrMsg, "no such table or index: ", zName, 0); - pParse->nErr++; - goto vacuum_cleanup; - } v = sqliteGetVdbe(pParse); - if( v==0 ) goto vacuum_cleanup; - sqliteBeginWriteOperation(pParse); - if( zName ){ - sqliteVdbeAddOp(v, OP_Reorganize, 0, 0); - sqliteVdbeChangeP3(v, -1, zName, strlen(zName)); - }else{ - Table *pTab; - Index *pIdx; - HashElem *pE; - for(pE=sqliteHashFirst(&db->tblHash); pE; pE=sqliteHashNext(pE)){ - pTab = sqliteHashData(pE); - sqliteVdbeAddOp(v, OP_Reorganize, 0, 0); - sqliteVdbeChangeP3(v, -1, pTab->zName, P3_STATIC); - for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ - sqliteVdbeAddOp(v, OP_Reorganize, 0, 0); - sqliteVdbeChangeP3(v, -1, pIdx->zName, P3_STATIC); - } - } - } - sqliteEndWriteOperation(pParse); - -vacuum_cleanup: - sqliteFree(zName); + if( v==0 ) return; + sqliteVdbeAddOpList(v, ArraySize(checkDb), checkDb); return; +#endif } /* diff --git a/src/hash.h b/src/hash.h index 83ee270a02..d5c7f62510 100644 --- a/src/hash.h +++ b/src/hash.h @@ -12,7 +12,7 @@ ** This is the header file for the generic hash-table implemenation ** used in SQLite. ** -** $Id: hash.h,v 1.2 2001/10/09 04:19:47 drh Exp $ +** $Id: hash.h,v 1.3 2002/02/03 03:34:09 drh Exp $ */ #ifndef _SQLITE_HASH_H_ #define _SQLITE_HASH_H_ @@ -98,5 +98,11 @@ void sqliteHashClear(Hash*); #define sqliteHashFirst(H) ((H)->first) #define sqliteHashNext(E) ((E)->next) #define sqliteHashData(E) ((E)->data) +#define sqliteHashKey(E) ((E)->pKey) + +/* +** Number of entries in a hash table +*/ +#define sqliteHashCount(H) ((H)->count) #endif /* _SQLITE_HASH_H_ */ diff --git a/src/vdbe.c b/src/vdbe.c index 0fc2a0c4e3..b663b315d3 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -30,7 +30,7 @@ ** But other routines are also provided to help in building up ** a program instruction by instruction. ** -** $Id: vdbe.c,v 1.115 2002/02/03 00:56:10 drh Exp $ +** $Id: vdbe.c,v 1.116 2002/02/03 03:34:09 drh Exp $ */ #include "sqliteInt.h" #include @@ -868,7 +868,7 @@ static char *zOpName[] = { 0, "IsUnique", "NotExists", "Delete", "Column", "KeyAsData", "Recno", "FullKey", "Rewind", "Next", "Destroy", "Clear", "CreateIndex", - "CreateTable", "Reorganize", "IdxPut", "IdxDelete", + "CreateTable", "SanityCheck", "IdxPut", "IdxDelete", "IdxRecno", "IdxGT", "IdxGE", "MemLoad", "MemStore", "ListWrite", "ListRewind", "ListRead", "ListReset", "SortPut", "SortMakeRec", "SortMakeKey", @@ -3481,15 +3481,51 @@ case OP_CreateTable: { break; } -/* Opcode: Reorganize P1 * * +/* Opcode: SanityCheck P1 * * ** -** Compress, optimize, and tidy up table or index whose root page in the -** database file is P1. +** Do an analysis of the currently open database. Push onto the +** stack the text of an error message describing any problems. +** If there are no errors, push a "ok" onto the stack. ** -** In the current implementation, this is a no-op. +** P1 is the index of a set that contains the root page numbers +** for all tables and indices in this database. +** +** This opcode is used for testing purposes only. */ -case OP_Reorganize: { - /* This is currently a no-op */ +case OP_SanityCheck: { +#if 1 /* This opcode used for testing only */ + int nRoot; + int *aRoot; + int tos = ++p->tos; + int iSet = pOp->p1; + Set *pSet; + int j; + HashElem *i; + char *z; + + if( iSet<0 || iSet>=p->nSet ){ + goto bad_instruction; + } + VERIFY( if( NeedStack(p, p->tos) ) goto no_mem; ) + pSet = &p->aSet[iSet]; + nRoot = sqliteHashCount(&pSet->hash); + aRoot = sqliteMalloc( sizeof(int)*(nRoot+1) ); + for(j=0, i=sqliteHashFirst(&pSet->hash); i; i=sqliteHashNext(i), j++){ + aRoot[j] = atoi((char*)sqliteHashKey(i)); + } + aRoot[j] = 0; + z = sqliteBtreeSanityCheck(pBt, aRoot, nRoot); + if( z==0 || z[0]==0 ){ + zStack[tos] = "ok"; + aStack[tos].n = 3; + aStack[tos].flags = STK_Str | STK_Static; + if( z ) sqliteFree(z); + }else{ + zStack[tos] = z; + aStack[tos].n = strlen(z) + 1; + aStack[tos].flags = STK_Str | STK_Dyn; + } +#endif /* SQLITE_TEST */ break; } diff --git a/src/vdbe.h b/src/vdbe.h index 6a63afd5ab..93945f6a99 100644 --- a/src/vdbe.h +++ b/src/vdbe.h @@ -15,7 +15,7 @@ ** or VDBE. The VDBE implements an abstract machine that runs a ** simple program to access and modify the underlying database. ** -** $Id: vdbe.h,v 1.40 2002/02/02 18:49:21 drh Exp $ +** $Id: vdbe.h,v 1.41 2002/02/03 03:34:09 drh Exp $ */ #ifndef _SQLITE_VDBE_H_ #define _SQLITE_VDBE_H_ @@ -104,7 +104,7 @@ typedef struct VdbeOp VdbeOp; #define OP_Clear 31 #define OP_CreateIndex 32 #define OP_CreateTable 33 -#define OP_Reorganize 34 +#define OP_SanityCheck 34 #define OP_IdxPut 35 #define OP_IdxDelete 36 diff --git a/test/conflict.test b/test/conflict.test index ff4b19d28d..7bf5efd6ee 100644 --- a/test/conflict.test +++ b/test/conflict.test @@ -13,7 +13,7 @@ # This file implements tests for the conflict resolution extension # to SQLite. # -# $Id: conflict.test,v 1.5 2002/02/03 00:56:11 drh Exp $ +# $Id: conflict.test,v 1.6 2002/02/03 03:34:09 drh Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl @@ -367,6 +367,7 @@ foreach {i conf1 conf2 cmd t0 t1 t2} { UPDATE t3 SET x=0; BEGIN $conf2; $cmd t3 SET x=1; + $cmd t1 SET b=b*2; $cmd t1 SET a=c+5; }]} r1] execsql {COMMIT}