f5bf0a78be
The root problem was that the sequence of BTree operations (Delete, Next) would not always leave the cursor pointing at the first entry after the entry that was deleted. A consequence of this error was that a DROP TABLE on a table with indices would not always remove every index associated with that table from the SQLITE_MASTER table. Subsequent attempts to open the database will fail when the index for the missing table was parsed. Changes have also been made to ignore extra indices in the SQLITE_MASTER table so that a database previously corrupted by this bug is once again readable. (CVS 316) FossilOrigin-Name: 8a984667113564f2bac7412165b6ff8b7e3e8f70
79 lines
2.2 KiB
Plaintext
79 lines
2.2 KiB
Plaintext
# 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
|