📄 btree.test
字号:
do_test btree-7.2 { for {set i 0} {$i<36} {incr i} { set key [format %03d $i] set data "*** $key ***" btree_insert $::c1 $key $data } lrange [btree_cursor_dump $::c1] 4 5} {8 1}do_test btree-7.3 { btree_move_to $::c1 000 while {[btree_key $::c1]!=""} { btree_delete $::c1 btree_next $::c1 btree_next $::c1 } lrange [btree_cursor_dump $::c1] 4 5} {512 19}#btree_page_dump $::b1 2do_test btree-7.4 { btree_insert $::c1 018 {*** 018 ***+++} btree_key $::c1} {018}do_test btree-7.5 { lrange [btree_cursor_dump $::c1] 4 5} {480 1}#btree_page_dump $::b1 2# Delete an entry to make a hole of a known size, then immediately recreate# that entry. This tests the path into allocateSpace where the hole exactly# matches the size of the desired space.#do_test btree-7.6 { btree_move_to $::c1 007 btree_delete $::c1 btree_move_to $::c1 011 btree_delete $::c1} {}do_test btree-7.7 { lindex [btree_cursor_dump $::c1] 5} {3}#btree_page_dump $::b1 2do_test btree-7.8 { btree_insert $::c1 007 {*** 007 ***} lindex [btree_cursor_dump $::c1] 5} {2}#btree_page_dump $::b1 2# Make sure the freeSpace() routine properly coaleses adjacent memory blocks#do_test btree-7.9 { btree_move_to $::c1 013 btree_delete $::c1 lrange [btree_cursor_dump $::c1] 4 5} {536 2}do_test btree-7.10 { btree_move_to $::c1 009 btree_delete $::c1 lrange [btree_cursor_dump $::c1] 4 5} {564 2}do_test btree-7.11 { btree_move_to $::c1 018 btree_delete $::c1 lrange [btree_cursor_dump $::c1] 4 5} {596 2}do_test btree-7.13 { btree_move_to $::c1 033 btree_delete $::c1 lrange [btree_cursor_dump $::c1] 4 5} {624 3}do_test btree-7.14 { btree_move_to $::c1 035 btree_delete $::c1 lrange [btree_cursor_dump $::c1] 4 5} {652 2}#btree_page_dump $::b1 2do_test btree-7.15 { lindex [btree_pager_stats $::b1] 1} {2}# Check to see that data on overflow pages work correctly.#do_test btree-8.1 { set data "*** This is a very long key " while {[string length $data]<256} {append data $data} set ::data $data btree_insert $::c1 020 $data} {}#btree_page_dump $::b1 2do_test btree-8.1.1 { lindex [btree_pager_stats $::b1] 1} {2}#btree_pager_ref_dump $::b1do_test btree-8.2 { string length [btree_data $::c1]} [string length $::data]do_test btree-8.3 { btree_data $::c1} $::datado_test btree-8.4 { btree_delete $::c1} {}do_test btree-8.4.1 { lindex [btree_get_meta $::b1] 0} [expr {int(([string length $::data]-238+1019)/1020)}]do_test btree-8.5 { set data "*** This is an even longer key" while {[string length $data]<2000} {append data $data} set ::data $data btree_insert $::c1 020 $data} {}do_test btree-8.6 { string length [btree_data $::c1]} [string length $::data]do_test btree-8.7 { btree_data $::c1} $::datado_test btree-8.8 { btree_commit $::b1 btree_data $::c1} $::datado_test btree-8.9 { btree_close_cursor $::c1 btree_close $::b1 set ::b1 [btree_open test1.bt] set ::c1 [btree_cursor $::b1 2 1] btree_move_to $::c1 020 btree_data $::c1} $::datado_test btree-8.10 { btree_begin_transaction $::b1 btree_delete $::c1} {}do_test btree-8.11 { lindex [btree_get_meta $::b1] 0} [expr {int(([string length $::data]-238+1019)/1020)}]# Now check out keys on overflow pages.#do_test btree-8.12 { set ::keyprefix "This is a long prefix to a key " while {[string length $::keyprefix]<256} {append ::keyprefix $::keyprefix} btree_close_cursor $::c1 btree_drop_table $::b1 2 lindex [btree_get_meta $::b1] 0} {4}do_test btree-8.12.1 { set ::c1 [btree_cursor $::b1 2 1] btree_insert $::c1 ${::keyprefix}1 1 btree_data $::c1} {1}do_test btree-8.13 { btree_key $::c1} ${keyprefix}1do_test btree-8.14 { btree_insert $::c1 ${::keyprefix}2 2 btree_insert $::c1 ${::keyprefix}3 3 btree_key $::c1} ${keyprefix}3do_test btree-8.15 { btree_move_to $::c1 ${::keyprefix}2 btree_data $::c1} {2}do_test btree-8.16 { btree_move_to $::c1 ${::keyprefix}1 btree_data $::c1} {1}do_test btree-8.17 { btree_move_to $::c1 ${::keyprefix}3 btree_data $::c1} {3}do_test btree-8.18 { lindex [btree_get_meta $::b1] 0} {1}do_test btree-8.19 { btree_move_to $::c1 ${::keyprefix}2 btree_key $::c1} ${::keyprefix}2#btree_page_dump $::b1 2do_test btree-8.20 { btree_delete $::c1 btree_next $::c1 btree_key $::c1} ${::keyprefix}3#btree_page_dump $::b1 2do_test btree-8.21 { lindex [btree_get_meta $::b1] 0} {2}do_test btree-8.22 { lindex [btree_pager_stats $::b1] 1} {2}do_test btree-8.23 { btree_close_cursor $::c1 btree_drop_table $::b1 2 set ::c1 [btree_cursor $::b1 2 1] lindex [btree_get_meta $::b1] 0} {4}do_test btree-8.24 { lindex [btree_pager_stats $::b1] 1} {2}#btree_pager_ref_dump $::b1# Check page splitting logic#do_test btree-9.1 { for {set i 1} {$i<=19} {incr i} { set key [format %03d $i] set data "*** $key *** $key *** $key *** $key ***" btree_insert $::c1 $key $data }} {}#btree_tree_dump $::b1 2#btree_pager_ref_dump $::b1#set pager_refinfo_enable 1do_test btree-9.2 { btree_insert $::c1 020 {*** 020 *** 020 *** 020 *** 020 ***} select_keys $::c1} {001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020}#btree_page_dump $::b1 5#btree_page_dump $::b1 2#btree_page_dump $::b1 7#btree_pager_ref_dump $::b1#set pager_refinfo_enable 0# The previous "select_keys" command left the cursor pointing at the root# page. So there should only be two pages checked out. 2 (the root) and# page 1.do_test btree-9.2.1 { lindex [btree_pager_stats $::b1] 1} {2}for {set i 1} {$i<=20} {incr i} { do_test btree-9.3.$i.1 [subst { btree_move_to $::c1 [format %03d $i] btree_key $::c1 }] [format %03d $i] do_test btree-9.3.$i.2 [subst { btree_move_to $::c1 [format %03d $i] string range \[btree_data $::c1\] 0 10 }] "*** [format %03d $i] ***"}do_test btree-9.4.1 { lindex [btree_pager_stats $::b1] 1} {3}# Check the page joining logic.##btree_page_dump $::b1 2#btree_pager_ref_dump $::b1do_test btree-9.4.2 { btree_move_to $::c1 005 btree_delete $::c1} {}#btree_page_dump $::b1 2for {set i 1} {$i<=19} {incr i} { if {$i==5} continue do_test btree-9.5.$i.1 [subst { btree_move_to $::c1 [format %03d $i] btree_key $::c1 }] [format %03d $i] do_test btree-9.5.$i.2 [subst { btree_move_to $::c1 [format %03d $i] string range \[btree_data $::c1\] 0 10 }] "*** [format %03d $i] ***"}#btree_pager_ref_dump $::b1do_test btree-9.6 { btree_close_cursor $::c1 lindex [btree_pager_stats $::b1] 1} {1}do_test btree-9.7 { btree_rollback $::b1 lindex [btree_pager_stats $::b1] 1} {0}# Create a tree of depth two. That is, there is a single divider entry# on the root pages and two leaf pages. Then delete the divider entry# see what happens.#do_test btree-10.1 { btree_begin_transaction $::b1 btree_drop_table $::b1 2 lindex [btree_pager_stats $::b1] 1} {1}do_test btree-10.2 { set ::c1 [btree_cursor $::b1 2 1] lindex [btree_pager_stats $::b1] 1} {2}do_test btree-10.3 { for {set i 1} {$i<=20} {incr i} { set key [format %03d $i] set data "*** $key *** $key *** $key *** $key ***" btree_insert $::c1 $key $data } select_keys $::c1} {001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020}#btree_page_dump $::b1 7#btree_page_dump $::b1 2#btree_page_dump $::b1 6do_test btree-10.4 { btree_move_to $::c1 011 btree_delete $::c1 select_keys $::c1} {001 002 003 004 005 006 007 008 009 010 012 013 014 015 016 017 018 019 020}#btree_tree_dump $::b1 2#btree_pager_ref_dump $::b1for {set i 1} {$i<=20} {incr i} { do_test btree-10.5.$i { btree_move_to $::c1 [format %03d $i] lindex [btree_pager_stats $::b1] 1 } {2} #btree_pager_ref_dump $::b1 #btree_tree_dump $::b1 2}# Create a tree with lots more pages#catch {unset ::data}catch {unset ::key}for {set i 21} {$i<=1000} {incr i} { do_test btree-11.1.$i.1 { set key [format %03d $i] set ::data "*** $key *** $key *** $key *** $key ***" btree_insert $::c1 $key $data btree_key $::c1 } [format %03d $i] do_test btree-11.1.$i.2 { btree_data $::c1 } $::data set ::key [format %03d [expr {$i/2}]] if {$::key=="011"} {set ::key 010} do_test btree-11.1.$i.3 { btree_move_to $::c1 $::key btree_key $::c1 } $::key}catch {unset ::data}catch {unset ::key}# Make sure our reference count is still correct.#do_test btree-11.2 { btree_close_cursor $::c1 lindex [btree_pager_stats $::b1] 1} {1}do_test btree-11.3 { set ::c1 [btree_cursor $::b1 2 1] lindex [btree_pager_stats $::b1] 1} {2}#btree_page_dump $::b1 2# Delete the dividers on the root page#do_test btree-11.4 { btree_move_to $::c1 257 btree_delete $::c1 btree_next $::c1 btree_key $::c1} {258}do_test btree-11.4.1 { btree_move_to $::c1 256 btree_key $::c1} {256}do_test btree-11.4.2 { btree_move_to $::c1 258 btree_key $::c1} {258}do_test btree-11.4.3 { btree_move_to $::c1 259 btree_key $::c1} {259}do_test btree-11.4.4 { btree_move_to $::c1 257 set n [btree_key $::c1] expr {$n==256||$n==258}} {1}do_test btree-11.5 { btree_move_to $::c1 513 btree_delete $::c1 btree_next $::c1 btree_key $::c1} {514}do_test btree-11.5.1 { btree_move_to $::c1 512 btree_key $::c1} {512}do_test btree-11.5.2 { btree_move_to $::c1 514 btree_key $::c1} {514}do_test btree-11.5.3 { btree_move_to $::c1 515 btree_key $::c1} {515}do_test btree-11.5.4 { btree_move_to $::c1 513 set n [btree_key $::c1] expr {$n==512||$n==514}} {1}do_test btree-11.6 { btree_move_to $::c1 769 btree_delete $::c1 btree_next $::c1 btree_key $::c1} {770}do_test btree-11.6.1 { btree_move_to $::c1 768 btree_key $::c1} {768}do_test btree-11.6.2 { btree_move_to $::c1 771 btree_key $::c1} {771}do_test btree-11.6.3 { btree_move_to $::c1 770 btree_key $::c1} {770}do_test btree-11.6.4 { btree_move_to $::c1 769 set n [btree_key $::c1] expr {$n==768||$n==770}} {1}#btree_page_dump $::b1 2#btree_page_dump $::b1 25# Change the data on an intermediate node such that the node becomes overfull# and has to split. We happen to know that intermediate nodes exist on# 337, 401 and 465 by the btree_page_dumps above#catch {unset ::data}set ::data {This is going to be a very long data segment}append ::data $::dataappend ::data $::datado_test btree-12.1 { btree_insert $::c1 337 $::data btree_data $::c1} $::datado_test btree-12.2 { btree_insert $::c1 401 $::data btree_data $::c1} $::datado_test btree-12.3 { btree_insert $::c1 465 $::data btree_data $::c1} $::datado_test btree-12.4 { btree_move_to $::c1 337 btree_key $::c1} {337}do_test btree-12.5 { btree_data $::c1} $::datado_test btree-12.6 { btree_next $::c1 btree_key $::c1} {338}do_test btree-12.7 { btree_move_to $::c1 464 btree_key $::c1} {464}do_test btree-12.8 { btree_next $::c1 btree_data $::c1} $::datado_test btree-12.9 { btree_next $::c1 btree_key $::c1} {466}do_test btree-12.10 { btree_move_to $::c1 400 btree_key $::c1} {400}do_test btree-12.11 { btree_next $::c1 btree_data $::c1} $::datado_test btree-12.12 { btree_next $::c1 btree_key $::c1} {402}do_test btree-13.1 { btree_integrity_check $::b1 2 3} {}# To Do:## 1. Do some deletes from the 3-layer tree# 2. Commit and reopen the database# 3. Read every 15th entry and make sure it works# 4. Implement btree_sanity and put it throughout this script#do_test btree-15.98 { btree_close_cursor $::c1 lindex [btree_pager_stats $::b1] 1} {1}do_test btree-15.99 { btree_rollback $::b1 lindex [btree_pager_stats $::b1] 1} {0}btree_pager_ref_dump $::b1do_test btree-99.1 { btree_close $::b1} {}catch {unset data}catch {unset key}} ;# end if( not mem: and has pager_open command );finish_test
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -