diff --git a/VERSION b/VERSION
index 3e3c2f1e5e..eca07e4c1a 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-2.1.1
+2.1.2
diff --git a/manifest b/manifest
index 43775a84bc..e1b392af29 100644
--- a/manifest
+++ b/manifest
@@ -1,9 +1,9 @@
-C Fix\sa\sbug\sin\sthe\slocking\sprotocol.\s(CVS\s315)
-D 2001-11-22T00:01:27
+C Fix\sa\sbug\sin\sDROP\sTABLE\sthat\scould\scause\sSQLITE_MASTER\stable\scorruption.\nThe\sroot\sproblem\swas\sthat\sthe\ssequence\sof\sBTree\soperations\s(Delete,\sNext)\nwould\snot\salways\sleave\sthe\scursor\spointing\sat\sthe\sfirst\sentry\safter\sthe\nentry\sthat\swas\sdeleted.\s\sA\sconsequence\sof\sthis\serror\swas\sthat\sa\sDROP\sTABLE\non\sa\stable\swith\sindices\swould\snot\salways\sremove\severy\sindex\sassociated\nwith\sthat\stable\sfrom\sthe\sSQLITE_MASTER\stable.\s\sSubsequent\sattempts\sto\nopen\sthe\sdatabase\swill\sfail\swhen\sthe\sindex\sfor\sthe\smissing\stable\swas\nparsed.\s\sChanges\shave\salso\sbeen\smade\sto\signore\sextra\sindices\sin\sthe\nSQLITE_MASTER\stable\sso\sthat\sa\sdatabase\spreviously\scorrupted\sby\sthis\sbug\nis\sonce\sagain\sreadable.\s(CVS\s316)
+D 2001-11-23T00:24:12
F Makefile.in 6801df952cb1df64aa32e4de85fed24511d28efd
F Makefile.template 1fdb891f14083ee0b63cf7282f91529634438e7a
F README a4c0ba11354ef6ba0776b400d057c59da47a4cc0
-F VERSION d9c9ad4098db7cbc9f2ecb3ad59fdfb337996198
+F VERSION c5cc20339d1ecb09a252aeef3d5417cd4d802473
F aclocal.m4 11faa843caa38fd451bc6aeb43e248d1723a269d
F config.guess f38b1e93d1e0fa6f5a6913e9e7b12774b9232588
F config.log 6a73d03433669b10a3f0c221198c3f26b9413914
@@ -19,7 +19,7 @@ F libtool c56e618713c9510a103bda6b95f3ea3900dcacd6
F ltmain.sh e9ed72eb1d690f447c13945eaf69e28af531eda1
F publish.sh 33cbe6798969f637698044023c139080e5d772a6
F src/TODO af7f3cab0228e34149cf98e073aa83d45878e7e6
-F src/btree.c ef8934adc4ee61b4028ade1d6ed7ae1f74090e31
+F src/btree.c d40fa46c8c578f1d166f4ea70d7a9d365399e0f3
F src/btree.h 0250a0a577a98cc64ddf1582d50c08b8d2451650
F src/build.c 2e21d425328e7c8bd6ade235e9eef51bf6fa870f
F src/delete.c 5d93a21c1388cfb1359bda01c072f25583a2f4f2
@@ -27,7 +27,7 @@ F src/expr.c 53515a7ba787bf4f0b3f73be30eb86aadb6f1b90
F src/hash.c 6f1a7712ae3aac8351662969aec5693740a2fbf7
F src/hash.h a5f5b3ce2d086a172c5879b0b06a27a82eac9fac
F src/insert.c 3526be771a01035198bef28d8f370cbcab94f46d
-F src/main.c 0b0e7244c7af91613111d5b72387e33f8789ed72
+F src/main.c 799bdaf30cb33409b04a282aac53a9616d707c0d
F src/md5.c 52f677bfc590e09f71d07d7e327bd59da738d07c
F src/os.c d7dc681438f311cf8211a78d8d87a7cbdccc2f14
F src/os.h bed702c9e3b768bc3cb1b12c90b83d099c1546be
@@ -54,14 +54,15 @@ F src/vdbe.h cd4c8647051a0c22c0e133c375f1cd17bb8b1e06
F src/where.c 05d27a01e53c20b8cd10589b7e789b2a64367988
F test/all.test 2a51e5395ac7c2c539689b123b9782a05e3837fe
F test/bigrow.test 1f098f85586d2117bdb3412d27eba45252bc8a6e
-F test/btree.test 47952c7a0c22660566264c68c0664592b7da85ce
+F test/btree.test 6ab4dc5f595905a276ef588fad3c9236dc07a47b
F test/btree2.test 08e9485619265cbaf5d11bd71f357cdc26bb87e0
+F test/btree3.test 9caa9e22491dd8cd8aa36d7ac3b48b089817c895
F test/copy.test 768e6f1701a07d08090e1ca7f7dcce0a7a72b43e
F test/delete.test c904a62129fe102b314a96111a8417f10249e4d8
F test/expr.test b4171c84b767f7b7e94dbce4824ba8e981a1c72f
F test/func.test 9012f7fc5369422c890e93549aa61d762e0c8bb3
F test/in.test 9323681388be301dc73f370b4cd62c5a33f79d1e
-F test/index.test c58829080a24aed3f897d7a77d9592aea30164fa
+F test/index.test c2c3088648d106a5a612a14cb346998a4ff77bfa
F test/insert.test a5c122aa726f1cef6f07d6767e8fd6f220994c11
F test/insert2.test d6901ca931e308fea7fca8c95ebe7dc957cc9fc2
F test/ioerr.test 57d9bffaca18b34f9e976f786eadc2591d6efc6a
@@ -76,7 +77,7 @@ F test/quick.test 6f023c7a73fc413e6d65b7a1879c79764038dc05
F test/quote.test 286db944717afa9a9bf829dd85e59185c65d5435
F test/rowid.test ba56df896cb913b70d06661d960869e310fe426e
F test/select1.test 13aa0a5545209a73d1073cb9062a1b9075b734ae
-F test/select2.test 070c7ac1a66e294004a2a1bfdc9cd2f4d29c1e6e
+F test/select2.test ed2c1882857106b85478f54f67000e14966be4c4
F test/select3.test 5e1fe8e5a4e63fb2827ab3b89527e0fd4ae35259
F test/select4.test 29a2ffb187f3d8b6ca42a0a6b619e9cabe12e228
F test/select5.test c2a6c4a003316ee42cbbd689eebef8fdce0db2ac
@@ -103,7 +104,7 @@ F www/arch.fig d5f9752a4dbf242e9cfffffd3f5762b6c63b3bcf
F www/arch.png 82ef36db1143828a7abc88b1e308a5f55d4336f4
F www/arch.tcl 03b521d252575f93b9c52f7c8b0007011512fcfb
F www/c_interface.tcl d446234c1d3ed747fcefd30e972a19f2b2fc0e05
-F www/changes.tcl c3b863396d8d3966439e631b39b0a845062505db
+F www/changes.tcl f1a09dfa633183121d7d4255f4cadadc84dc034d
F www/crosscompile.tcl c99efacb3aefaa550c6e80d91b240f55eb9fd33e
F www/download.tcl 3e51c9ff1326b0a182846134987301310dff7d60
F www/dynload.tcl 02eb8273aa78cfa9070dd4501dca937fb22b466c
@@ -115,7 +116,7 @@ F www/speed.tcl 212a91d555384e01873160d6a189f1490c791bc2
F www/sqlite.tcl 6a21242a272e9c0939a04419a51c3d50cae33e3e
F www/tclsqlite.tcl 13d50723f583888fc80ae1a38247c0ab415066fa
F www/vdbe.tcl eb4e1768cffa266cbbb7133488022a7a6cb278d9
-P 03673adbfe0c8a92d79f86ddf1136736594208ad
-R 6db2507abc73fcd18a105f2aaf8fbb99
+P a9db1c12c5a4d5741de0e5eb5aa87c647a5646b8
+R c4b924c66bb520eb6ed8e5503bdf1605
U drh
-Z 5464cc9093ffef5c17cabdd72823cca6
+Z ef51c9b0a8111962938d6717ff48b7e2
diff --git a/manifest.uuid b/manifest.uuid
index 731607f770..db28f8d4cd 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-a9db1c12c5a4d5741de0e5eb5aa87c647a5646b8
\ No newline at end of file
+8a984667113564f2bac7412165b6ff8b7e3e8f70
\ No newline at end of file
diff --git a/src/btree.c b/src/btree.c
index e381f92e6d..574627d7a5 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.40 2001/11/21 02:21:12 drh Exp $
+** $Id: btree.c,v 1.41 2001/11/23 00:24:12 drh Exp $
**
** This file implements a external (disk-based) database using BTrees.
** For a detailed discussion of BTrees, refer to
@@ -1327,7 +1327,7 @@ int sqliteBtreeNext(BtCursor *pCur, int *pRes){
if( pRes ) *pRes = 1;
return SQLITE_ABORT;
}
- if( pCur->bSkipNext ){
+ if( pCur->bSkipNext && pCur->idxpPage->nCell ){
pCur->bSkipNext = 0;
if( pRes ) *pRes = 0;
return SQLITE_OK;
@@ -2194,14 +2194,18 @@ int sqliteBtreeDelete(BtCursor *pCur){
if( rc ) return rc;
pCur->bSkipNext = 1;
dropCell(leafCur.pPage, leafCur.idx, szNext);
- rc = balance(pCur->pBt, leafCur.pPage, 0);
+ rc = balance(pCur->pBt, leafCur.pPage, pCur);
releaseTempCursor(&leafCur);
}else{
dropCell(pPage, pCur->idx, cellSize(pCell));
if( pCur->idx>=pPage->nCell ){
pCur->idx = pPage->nCell-1;
- if( pCur->idx<0 ){ pCur->idx = 0; }
- pCur->bSkipNext = 0;
+ if( pCur->idx<0 ){
+ pCur->idx = 0;
+ pCur->bSkipNext = 1;
+ }else{
+ pCur->bSkipNext = 0;
+ }
}else{
pCur->bSkipNext = 1;
}
diff --git a/src/main.c b/src/main.c
index 84dd601420..a9beba9c3f 100644
--- a/src/main.c
+++ b/src/main.c
@@ -14,7 +14,7 @@
** other files are for internal use by SQLite and should not be
** accessed by users of the library.
**
-** $Id: main.c,v 1.49 2001/11/07 16:48:27 drh Exp $
+** $Id: main.c,v 1.50 2001/11/23 00:24:12 drh Exp $
*/
#include "sqliteInt.h"
#include "os.h"
@@ -63,7 +63,7 @@ static int sqliteOpenCb(void *pDb, int argc, char **argv, char **azColName){
sParse.db = db;
sParse.initFlag = 1;
sParse.newTnum = atoi(argv[2]);
- nErr = sqliteRunParser(&sParse, argv[3], 0);
+ sqliteRunParser(&sParse, argv[3], 0);
}else{
/* If the SQL column is blank it means this is an index that
** was created to be the PRIMARY KEY or to fulfill a UNIQUE
diff --git a/test/btree.test b/test/btree.test
index 97e7847f63..ef52df855c 100644
--- a/test/btree.test
+++ b/test/btree.test
@@ -11,7 +11,7 @@
# This file implements regression tests for SQLite library. The
# focus of this script is btree database backend
#
-# $Id: btree.test,v 1.10 2001/09/23 02:35:53 drh Exp $
+# $Id: btree.test,v 1.11 2001/11/23 00:24:12 drh Exp $
set testdir [file dirname $argv0]
@@ -997,11 +997,11 @@ do_test btree-13.1 {
# 4. Implement btree_sanity and put it throughout this script
#
-do_test btree-10.98 {
+do_test btree-15.98 {
btree_close_cursor $::c1
lindex [btree_pager_stats $::b1] 1
} {1}
-do_test btree-10.99 {
+do_test btree-15.99 {
btree_rollback $::b1
lindex [btree_pager_stats $::b1] 1
} {0}
diff --git a/test/btree3.test b/test/btree3.test
new file mode 100644
index 0000000000..30bf893939
--- /dev/null
+++ b/test/btree3.test
@@ -0,0 +1,78 @@
+# 2001 November 22
+#
+# The author disclaims copyright to this source code. In place of
+# a legal notice, here is a blessing:
+#
+# May you do good and not evil.
+# May you find forgiveness for yourself and forgive others.
+# May you share freely, never taking more than you give.
+#
+#***********************************************************************
+# This file implements regression tests for SQLite library. The
+# focus of this script is btree database backend
+#
+# In particular, this file tests a small part of the Delete logic
+# for the BTree backend. When a row is deleted from a table, the
+# cursor is suppose to be left pointing at either the previous or
+# next entry in that table. If the cursor is left pointing at the
+# next entry, then the next Next operation is ignored. So the
+# sequence of operations (Delete, Next) should always leave the
+# cursor pointing at the first entry past the one that was deleted.
+# This test is designed to verify that behavior.
+#
+# $Id: btree3.test,v 1.1 2001/11/23 00:24:12 drh Exp $
+
+
+set testdir [file dirname $argv0]
+source $testdir/tester.tcl
+
+if {[info commands btree_open]!=""} {
+
+# Open a test database.
+#
+file delete -force test1.bt
+file delete -force test1.bt-journal
+set b1 [btree_open test1.bt]
+btree_begin_transaction $::b1
+
+# Insert a few one records
+#
+set data {abcdefghijklmnopqrstuvwxyz0123456789}
+append data $data
+append data $data
+append data $data
+append data $data
+for {set k 2} {$k<=10} {incr k} {
+ for {set j 1} {$j<=$k} {incr j} {
+ set jkey [format %02d $j]
+ btree_clear_table $::b1 2
+ set ::c1 [btree_cursor $::b1 2 1]
+ for {set i 1} {$i<=$k+1} {incr i} {
+ set key [format %02d $i]
+ do_test btree3-$k.$j.1.$i {
+ btree_insert $::c1 $::key $::data
+ } {}
+ # btree_tree_dump $::b1 2
+ }
+ do_test btree3-$k.$j.2 {
+ btree_move_to $::c1 $::jkey
+ btree_key $::c1
+ } $::jkey
+ do_test btree3-$k.$j.3 {
+ btree_delete $::c1
+ } {}
+ do_test btree3-$k.$j.4 {
+ btree_next $::c1
+ btree_key $::c1
+ } [format %02d [expr $j+1]]
+ btree_close_cursor $::c1
+ }
+}
+
+btree_rollback $::b1
+btree_pager_ref_dump $::b1
+btree_close $::b1
+
+} ;# end if( not mem: and has pager_open command );
+
+finish_test
diff --git a/test/index.test b/test/index.test
index 616ebf84b4..359c821d41 100644
--- a/test/index.test
+++ b/test/index.test
@@ -11,7 +11,7 @@
# This file implements regression tests for SQLite library. The
# focus of this file is testing the CREATE INDEX statement.
#
-# $Id: index.test,v 1.15 2001/11/08 00:45:22 drh Exp $
+# $Id: index.test,v 1.16 2001/11/23 00:24:12 drh Exp $
set testdir [file dirname $argv0]
source $testdir/tester.tcl
@@ -189,6 +189,16 @@ do_test index-6.3 {
execsql {DROP TABLE test2}
execsql {SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name}
} {}
+do_test index-6.4 {
+ execsql {
+ CREATE TABLE test1(a,b);
+ CREATE INDEX index1 ON test1(a);
+ CREATE INDEX index2 ON test1(b);
+ CREATE INDEX index3 ON test1(a,b);
+ DROP TABLE test1;
+ SELECT name FROM sqlite_master WHERE type!='meta' ORDER BY name;
+ }
+} {}
# Create a primary key
#
diff --git a/test/select2.test b/test/select2.test
index b370cdbb49..c78dae8e6e 100644
--- a/test/select2.test
+++ b/test/select2.test
@@ -11,7 +11,7 @@
# This file implements regression tests for SQLite library. The
# focus of this file is testing the SELECT statement.
#
-# $Id: select2.test,v 1.15 2001/11/08 00:45:22 drh Exp $
+# $Id: select2.test,v 1.16 2001/11/23 00:24:13 drh Exp $
set testdir [file dirname $argv0]
source $testdir/tester.tcl
@@ -26,6 +26,7 @@ for {set i 0} {$i<=30} {incr i} {
close $f
execsql {COPY tbl1 FROM './testdata1.txt'}
file delete -force ./testdata1.txt
+catch {unset data}
# Do a second query inside a first.
#
diff --git a/www/changes.tcl b/www/changes.tcl
index 991f356362..9b19247fe4 100644
--- a/www/changes.tcl
+++ b/www/changes.tcl
@@ -17,9 +17,16 @@ proc chng {date desc} {
puts "
"
}
-chng {2001 Nov ?? (2.1.2)} {
+chng {2001 Nov 22 (2.1.2)} {
Changes to support 64-bit architectures.
Fix a bug in the locking protocol.
+Fix a bug that could (rarely) cause the database to become
+ unreadable after a DROP TABLE due to corruption to the SQLITE_MASTER
+ table.
+Change the code so that version 2.1.1 databases that were rendered
+ unreadable by the above bug can be read by this version of
+ the library even though the SQLITE_MASTER table is (slightly)
+ corrupted.
}
chng {2001 Nov 13 (2.1.1)} {
@@ -40,7 +47,7 @@ chng {2001 Nov 3 (2.0.8)} {
Documentation updates
Simplify the design of the VDBE by restricting the number of sorters
and lists to 1.
- In practice, no more than one sorter and one list was every used anyhow.
+ In practice, no more than one sorter and one list was ever used anyhow.
}