1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-08-07 02:42:48 +03:00

Allow btree cursors to persist through BtreeDelete() calls. (CVS 2103)

FossilOrigin-Name: 6ad5fc8e1a119b750a82fc1426704164a2042d57
This commit is contained in:
danielk1977
2004-11-16 04:57:24 +00:00
parent 670fb032ab
commit 6a43f9b3ff
4 changed files with 282 additions and 108 deletions

View File

@@ -9,9 +9,11 @@
#
#***********************************************************************
# This file implements regression tests for SQLite library. The
# focus of this script is btree database backend.
# focus of this script is btree database backend. Specifically,
# this file tests that existing cursors are correctly repositioned
# when entries are inserted into or deleted from btrees.
#
# $Id: btree8.test,v 1.1 2004/11/13 13:19:56 danielk1977 Exp $
# $Id: btree8.test,v 1.2 2004/11/16 04:57:25 danielk1977 Exp $
set testdir [file dirname $argv0]
source $testdir/tester.tcl
@@ -55,13 +57,12 @@ foreach key $keys {
}
btree_commit $::bt
# set btree_trace 1
# Now write more entries to the table (and overwriting the ones that exist).
# After each write, check that the cursors created above still point to the
# same entries.
btree_begin_transaction $::bt
set ::write_csr [btree_cursor $::bt $::tnum 1]
set first_entry $testnum
for {set i $testnum} {$i < 5000 && $nErr==0 } {incr i} {
set datalen [expr int(rand()*20.0)]
@@ -77,9 +78,34 @@ for {set i $testnum} {$i < 5000 && $nErr==0 } {incr i} {
} $key
}
}
# Now delete entries from the table.
btree_first $::write_csr
for {set i $first_entry} {$i < 5000 && $nErr==0 } {incr i} {
do_test btree8-2.$i.1 {
btree_key $::write_csr
} $i
do_test btree8-2.$i.2 {
btree_delete $::write_csr
btree_next $::write_csr
expr 0
} {0}
set testnum 2
foreach csr $csr_list key $keys {
incr testnum
if {$key <= $i } {
set key 0
}
do_test btree8-2.$i.$testnum {
btree_key $::csr
} $key
}
}
btree_close_cursor $::write_csr
btree_commit $::bt
if {$::nErr>0} { puts $::csr_list }
if {$::nErr>0} { puts $::csr_list ; exit }
foreach csr $csr_list {
btree_close_cursor $csr
}
@@ -92,6 +118,7 @@ set csr_list [list]
# [num_to_string 456 10] -> "456.456.45"
#
proc num_to_string {num len} {
set num [format %.4d $num]
return [string range [string repeat "$num." $len] 0 [expr $len-1]]
}
@@ -108,7 +135,7 @@ btree_begin_transaction $::bt
set testnum 0
foreach key $skeys {
incr testnum
do_test btree-8-2.$testnum {
do_test btree-8-3.$testnum {
set csr [btree_cursor $::bt $::inum 1]
btree_insert $csr $key ""
lappend csr_list $csr
@@ -124,21 +151,73 @@ btree_commit $::bt
# same entries.
btree_begin_transaction $::bt
set ::write_csr [btree_cursor $::bt $::inum 1]
set first_entry $testnum
for {set i $testnum} {$i < 5000 && $nErr==0 } {incr i} {
set skey [num_to_string $i 20]
do_test btree8-2.$i.1 {
do_test btree-8-3.$i.1 {
btree_insert $::write_csr $skey ""
} {}
set testnum 1
foreach csr $csr_list key $skeys {
incr testnum
do_test btree8-2.$i.$testnum {
do_test btree-8-3.$i.$testnum {
btree_key $::csr
} $key
}
}
btree_commit $::bt
btree_begin_transaction $::bt
proc lremove {l key} {
set idx [lsearch $l $key]
return [concat [lrange $l 0 [expr $idx-1]] [lrange $l [expr $idx+1] end]]
}
proc K {x y} {set x}
proc lshuffle { list } {
set n [llength $list]
while {$n>0} {
set j [expr {int(rand()*$n)}]
lappend slist [lindex $list $j]
set list [lreplace [K $list [set list {}]] $j $j]
incr n -1
}
return $slist
}
# Now delete entries from the index. Do this in a random order, to try to
# ensure that internal and external nodes are deleted.
for {set i $first_entry} {$i < 5000} {incr i} {
lappend delete_order $i
}
set delete_order [lshuffle $delete_order]
btree_first $::write_csr
foreach i $delete_order {
do_test btree8-4.$i.1 {
btree_move_to $::write_csr [num_to_string $i 20]
btree_key $::write_csr
} [num_to_string $i 20]
do_test btree8-4.$i.2 {
btree_delete $::write_csr
} {}
set delete_order [lremove $delete_order $i]
set testnum 2
foreach csr $csr_list key $keys {
incr testnum
if { [lsearch $delete_order $key]==-1 } {
set skey ""
} else {
set skey [num_to_string $key 20]
}
do_test btree8-4.$i.$testnum {
btree_key $::csr
} $skey
}
}
btree_close_cursor $::write_csr
btree_commit $::bt
if {$::nErr>0} { puts $::csr_list }