1*4520Snw141292 2*4520Snw141292#pragma ident "%Z%%M% %I% %E% SMI" 3*4520Snw141292 4*4520Snw141292# 2001 September 15 5*4520Snw141292# 6*4520Snw141292# The author disclaims copyright to this source code. In place of 7*4520Snw141292# a legal notice, here is a blessing: 8*4520Snw141292# 9*4520Snw141292# May you do good and not evil. 10*4520Snw141292# May you find forgiveness for yourself and forgive others. 11*4520Snw141292# May you share freely, never taking more than you give. 12*4520Snw141292# 13*4520Snw141292#*********************************************************************** 14*4520Snw141292# This file implements regression tests for SQLite library. The 15*4520Snw141292# focus of this script is btree database backend 16*4520Snw141292# 17*4520Snw141292# $Id: btree.test,v 1.15 2004/02/10 01:54:28 drh Exp $ 18*4520Snw141292 19*4520Snw141292 20*4520Snw141292set testdir [file dirname $argv0] 21*4520Snw141292source $testdir/tester.tcl 22*4520Snw141292 23*4520Snw141292if {[info commands btree_open]!="" && $SQLITE_PAGE_SIZE==1024 24*4520Snw141292 && $SQLITE_USABLE_SIZE==1024} { 25*4520Snw141292 26*4520Snw141292# Basic functionality. Open and close a database. 27*4520Snw141292# 28*4520Snw141292do_test btree-1.1 { 29*4520Snw141292 file delete -force test1.bt 30*4520Snw141292 file delete -force test1.bt-journal 31*4520Snw141292 set rc [catch {btree_open test1.bt} ::b1] 32*4520Snw141292} {0} 33*4520Snw141292 34*4520Snw141292# The second element of the list returned by btree_pager_stats is the 35*4520Snw141292# number of pages currently checked out. We'll be checking this value 36*4520Snw141292# frequently during this test script, to make sure the btree library 37*4520Snw141292# is properly releasing the pages it checks out, and thus avoiding 38*4520Snw141292# page leaks. 39*4520Snw141292# 40*4520Snw141292do_test btree-1.1.1 { 41*4520Snw141292 lindex [btree_pager_stats $::b1] 1 42*4520Snw141292} {0} 43*4520Snw141292do_test btree-1.2 { 44*4520Snw141292 set rc [catch {btree_open test1.bt} ::b2] 45*4520Snw141292} {0} 46*4520Snw141292do_test btree-1.3 { 47*4520Snw141292 set rc [catch {btree_close $::b2} msg] 48*4520Snw141292 lappend rc $msg 49*4520Snw141292} {0 {}} 50*4520Snw141292 51*4520Snw141292# Do an insert and verify that the database file grows in size. 52*4520Snw141292# 53*4520Snw141292do_test btree-1.4 { 54*4520Snw141292 set rc [catch {btree_begin_transaction $::b1} msg] 55*4520Snw141292 lappend rc $msg 56*4520Snw141292} {0 {}} 57*4520Snw141292do_test btree-1.4.1 { 58*4520Snw141292 lindex [btree_pager_stats $::b1] 1 59*4520Snw141292} {1} 60*4520Snw141292do_test btree-1.5 { 61*4520Snw141292 set rc [catch {btree_cursor $::b1 2 1} ::c1] 62*4520Snw141292 if {$rc} {lappend rc $::c1} 63*4520Snw141292 set rc 64*4520Snw141292} {0} 65*4520Snw141292do_test btree-1.6 { 66*4520Snw141292 set rc [catch {btree_insert $::c1 one 1.00} msg] 67*4520Snw141292 lappend rc $msg 68*4520Snw141292} {0 {}} 69*4520Snw141292do_test btree-1.7 { 70*4520Snw141292 btree_key $::c1 71*4520Snw141292} {one} 72*4520Snw141292do_test btree-1.8 { 73*4520Snw141292 btree_data $::c1 74*4520Snw141292} {1.00} 75*4520Snw141292do_test btree-1.9 { 76*4520Snw141292 set rc [catch {btree_close_cursor $::c1} msg] 77*4520Snw141292 lappend rc $msg 78*4520Snw141292} {0 {}} 79*4520Snw141292do_test btree-1.10 { 80*4520Snw141292 set rc [catch {btree_commit $::b1} msg] 81*4520Snw141292 lappend rc $msg 82*4520Snw141292} {0 {}} 83*4520Snw141292do_test btree-1.11 { 84*4520Snw141292 file size test1.bt 85*4520Snw141292} {2048} 86*4520Snw141292do_test btree-1.12 { 87*4520Snw141292 lindex [btree_pager_stats $::b1] 1 88*4520Snw141292} {0} 89*4520Snw141292 90*4520Snw141292# Reopen the database and attempt to read the record that we wrote. 91*4520Snw141292# 92*4520Snw141292do_test btree-2.1 { 93*4520Snw141292 set rc [catch {btree_cursor $::b1 2 1} ::c1] 94*4520Snw141292 if {$rc} {lappend rc $::c1} 95*4520Snw141292 set rc 96*4520Snw141292} {0} 97*4520Snw141292do_test btree-2.2 { 98*4520Snw141292 btree_move_to $::c1 abc 99*4520Snw141292} {1} 100*4520Snw141292do_test btree-2.3 { 101*4520Snw141292 btree_move_to $::c1 xyz 102*4520Snw141292} {-1} 103*4520Snw141292do_test btree-2.4 { 104*4520Snw141292 btree_move_to $::c1 one 105*4520Snw141292} {0} 106*4520Snw141292do_test btree-2.5 { 107*4520Snw141292 btree_key $::c1 108*4520Snw141292} {one} 109*4520Snw141292do_test btree-2.6 { 110*4520Snw141292 btree_data $::c1 111*4520Snw141292} {1.00} 112*4520Snw141292do_test btree-2.7 { 113*4520Snw141292 lindex [btree_pager_stats $::b1] 1 114*4520Snw141292} {2} 115*4520Snw141292 116*4520Snw141292# Do some additional inserts 117*4520Snw141292# 118*4520Snw141292do_test btree-3.1 { 119*4520Snw141292 btree_begin_transaction $::b1 120*4520Snw141292 btree_insert $::c1 two 2.00 121*4520Snw141292 btree_key $::c1 122*4520Snw141292} {two} 123*4520Snw141292do_test btree-3.1.1 { 124*4520Snw141292 lindex [btree_pager_stats $::b1] 1 125*4520Snw141292} {2} 126*4520Snw141292do_test btree-3.2 { 127*4520Snw141292 btree_insert $::c1 three 3.00 128*4520Snw141292 btree_key $::c1 129*4520Snw141292} {three} 130*4520Snw141292do_test btree-3.4 { 131*4520Snw141292 btree_insert $::c1 four 4.00 132*4520Snw141292 btree_key $::c1 133*4520Snw141292} {four} 134*4520Snw141292do_test btree-3.5 { 135*4520Snw141292 btree_insert $::c1 five 5.00 136*4520Snw141292 btree_key $::c1 137*4520Snw141292} {five} 138*4520Snw141292do_test btree-3.6 { 139*4520Snw141292 btree_insert $::c1 six 6.00 140*4520Snw141292 btree_key $::c1 141*4520Snw141292} {six} 142*4520Snw141292#btree_page_dump $::b1 2 143*4520Snw141292do_test btree-3.7 { 144*4520Snw141292 set rc [btree_move_to $::c1 {}] 145*4520Snw141292 expr {$rc>0} 146*4520Snw141292} {1} 147*4520Snw141292do_test btree-3.8 { 148*4520Snw141292 btree_key $::c1 149*4520Snw141292} {five} 150*4520Snw141292do_test btree-3.9 { 151*4520Snw141292 btree_data $::c1 152*4520Snw141292} {5.00} 153*4520Snw141292do_test btree-3.10 { 154*4520Snw141292 btree_next $::c1 155*4520Snw141292 btree_key $::c1 156*4520Snw141292} {four} 157*4520Snw141292do_test btree-3.11 { 158*4520Snw141292 btree_data $::c1 159*4520Snw141292} {4.00} 160*4520Snw141292do_test btree-3.12 { 161*4520Snw141292 btree_next $::c1 162*4520Snw141292 btree_key $::c1 163*4520Snw141292} {one} 164*4520Snw141292do_test btree-3.13 { 165*4520Snw141292 btree_data $::c1 166*4520Snw141292} {1.00} 167*4520Snw141292do_test btree-3.14 { 168*4520Snw141292 btree_next $::c1 169*4520Snw141292 btree_key $::c1 170*4520Snw141292} {six} 171*4520Snw141292do_test btree-3.15 { 172*4520Snw141292 btree_data $::c1 173*4520Snw141292} {6.00} 174*4520Snw141292do_test btree-3.16 { 175*4520Snw141292 btree_next $::c1 176*4520Snw141292 btree_key $::c1 177*4520Snw141292} {three} 178*4520Snw141292do_test btree-3.17 { 179*4520Snw141292 btree_data $::c1 180*4520Snw141292} {3.00} 181*4520Snw141292do_test btree-3.18 { 182*4520Snw141292 btree_next $::c1 183*4520Snw141292 btree_key $::c1 184*4520Snw141292} {two} 185*4520Snw141292do_test btree-3.19 { 186*4520Snw141292 btree_data $::c1 187*4520Snw141292} {2.00} 188*4520Snw141292do_test btree-3.20 { 189*4520Snw141292 btree_next $::c1 190*4520Snw141292 btree_key $::c1 191*4520Snw141292} {} 192*4520Snw141292do_test btree-3.21 { 193*4520Snw141292 btree_data $::c1 194*4520Snw141292} {} 195*4520Snw141292 196*4520Snw141292# Commit the changes, reopen and reread the data 197*4520Snw141292# 198*4520Snw141292do_test btree-3.22 { 199*4520Snw141292 set rc [catch {btree_close_cursor $::c1} msg] 200*4520Snw141292 lappend rc $msg 201*4520Snw141292} {0 {}} 202*4520Snw141292do_test btree-3.22.1 { 203*4520Snw141292 lindex [btree_pager_stats $::b1] 1 204*4520Snw141292} {1} 205*4520Snw141292do_test btree-3.23 { 206*4520Snw141292 set rc [catch {btree_commit $::b1} msg] 207*4520Snw141292 lappend rc $msg 208*4520Snw141292} {0 {}} 209*4520Snw141292do_test btree-3.23.1 { 210*4520Snw141292 lindex [btree_pager_stats $::b1] 1 211*4520Snw141292} {0} 212*4520Snw141292do_test btree-3.24 { 213*4520Snw141292 file size test1.bt 214*4520Snw141292} {2048} 215*4520Snw141292do_test btree-3.25 { 216*4520Snw141292 set rc [catch {btree_cursor $::b1 2 1} ::c1] 217*4520Snw141292 if {$rc} {lappend rc $::c1} 218*4520Snw141292 set rc 219*4520Snw141292} {0} 220*4520Snw141292do_test btree-3.25.1 { 221*4520Snw141292 lindex [btree_pager_stats $::b1] 1 222*4520Snw141292} {2} 223*4520Snw141292do_test btree-3.26 { 224*4520Snw141292 set rc [btree_move_to $::c1 {}] 225*4520Snw141292 expr {$rc>0} 226*4520Snw141292} {1} 227*4520Snw141292do_test btree-3.27 { 228*4520Snw141292 btree_key $::c1 229*4520Snw141292} {five} 230*4520Snw141292do_test btree-3.28 { 231*4520Snw141292 btree_data $::c1 232*4520Snw141292} {5.00} 233*4520Snw141292do_test btree-3.29 { 234*4520Snw141292 btree_next $::c1 235*4520Snw141292 btree_key $::c1 236*4520Snw141292} {four} 237*4520Snw141292do_test btree-3.30 { 238*4520Snw141292 btree_data $::c1 239*4520Snw141292} {4.00} 240*4520Snw141292do_test btree-3.31 { 241*4520Snw141292 btree_next $::c1 242*4520Snw141292 btree_key $::c1 243*4520Snw141292} {one} 244*4520Snw141292do_test btree-3.32 { 245*4520Snw141292 btree_data $::c1 246*4520Snw141292} {1.00} 247*4520Snw141292do_test btree-3.33 { 248*4520Snw141292 btree_next $::c1 249*4520Snw141292 btree_key $::c1 250*4520Snw141292} {six} 251*4520Snw141292do_test btree-3.34 { 252*4520Snw141292 btree_data $::c1 253*4520Snw141292} {6.00} 254*4520Snw141292do_test btree-3.35 { 255*4520Snw141292 btree_next $::c1 256*4520Snw141292 btree_key $::c1 257*4520Snw141292} {three} 258*4520Snw141292do_test btree-3.36 { 259*4520Snw141292 btree_data $::c1 260*4520Snw141292} {3.00} 261*4520Snw141292do_test btree-3.37 { 262*4520Snw141292 btree_next $::c1 263*4520Snw141292 btree_key $::c1 264*4520Snw141292} {two} 265*4520Snw141292do_test btree-3.38 { 266*4520Snw141292 btree_data $::c1 267*4520Snw141292} {2.00} 268*4520Snw141292do_test btree-3.39 { 269*4520Snw141292 btree_next $::c1 270*4520Snw141292 btree_key $::c1 271*4520Snw141292} {} 272*4520Snw141292do_test btree-3.40 { 273*4520Snw141292 btree_data $::c1 274*4520Snw141292} {} 275*4520Snw141292do_test btree-3.41 { 276*4520Snw141292 lindex [btree_pager_stats $::b1] 1 277*4520Snw141292} {2} 278*4520Snw141292 279*4520Snw141292 280*4520Snw141292# Now try a delete 281*4520Snw141292# 282*4520Snw141292do_test btree-4.1 { 283*4520Snw141292 btree_begin_transaction $::b1 284*4520Snw141292 btree_move_to $::c1 one 285*4520Snw141292 btree_key $::c1 286*4520Snw141292} {one} 287*4520Snw141292do_test btree-4.1.1 { 288*4520Snw141292 lindex [btree_pager_stats $::b1] 1 289*4520Snw141292} {2} 290*4520Snw141292do_test btree-4.2 { 291*4520Snw141292 btree_delete $::c1 292*4520Snw141292} {} 293*4520Snw141292do_test btree-4.3 { 294*4520Snw141292 btree_key $::c1 295*4520Snw141292} {six} 296*4520Snw141292do_test btree-4.4 { 297*4520Snw141292 btree_next $::c1 298*4520Snw141292 btree_key $::c1 299*4520Snw141292} {six} 300*4520Snw141292do_test btree-4.5 { 301*4520Snw141292 btree_next $::c1 302*4520Snw141292 btree_key $::c1 303*4520Snw141292} {three} 304*4520Snw141292do_test btree-4.4 { 305*4520Snw141292 btree_move_to $::c1 {} 306*4520Snw141292 set r {} 307*4520Snw141292 while 1 { 308*4520Snw141292 set key [btree_key $::c1] 309*4520Snw141292 if {$key==""} break 310*4520Snw141292 lappend r $key 311*4520Snw141292 lappend r [btree_data $::c1] 312*4520Snw141292 btree_next $::c1 313*4520Snw141292 } 314*4520Snw141292 set r 315*4520Snw141292} {five 5.00 four 4.00 six 6.00 three 3.00 two 2.00} 316*4520Snw141292 317*4520Snw141292# Commit and make sure the delete is still there. 318*4520Snw141292# 319*4520Snw141292do_test btree-4.5 { 320*4520Snw141292 btree_commit $::b1 321*4520Snw141292 btree_move_to $::c1 {} 322*4520Snw141292 set r {} 323*4520Snw141292 while 1 { 324*4520Snw141292 set key [btree_key $::c1] 325*4520Snw141292 if {$key==""} break 326*4520Snw141292 lappend r $key 327*4520Snw141292 lappend r [btree_data $::c1] 328*4520Snw141292 btree_next $::c1 329*4520Snw141292 } 330*4520Snw141292 set r 331*4520Snw141292} {five 5.00 four 4.00 six 6.00 three 3.00 two 2.00} 332*4520Snw141292 333*4520Snw141292# Completely close the database and reopen it. Then check 334*4520Snw141292# the data again. 335*4520Snw141292# 336*4520Snw141292do_test btree-4.6 { 337*4520Snw141292 lindex [btree_pager_stats $::b1] 1 338*4520Snw141292} {2} 339*4520Snw141292do_test btree-4.7 { 340*4520Snw141292 btree_close_cursor $::c1 341*4520Snw141292 lindex [btree_pager_stats $::b1] 1 342*4520Snw141292} {0} 343*4520Snw141292do_test btree-4.8 { 344*4520Snw141292 btree_close $::b1 345*4520Snw141292 set ::b1 [btree_open test1.bt] 346*4520Snw141292 set ::c1 [btree_cursor $::b1 2 1] 347*4520Snw141292 lindex [btree_pager_stats $::b1] 1 348*4520Snw141292} {2} 349*4520Snw141292do_test btree-4.9 { 350*4520Snw141292 set r {} 351*4520Snw141292 btree_first $::c1 352*4520Snw141292 while 1 { 353*4520Snw141292 set key [btree_key $::c1] 354*4520Snw141292 if {$key==""} break 355*4520Snw141292 lappend r $key 356*4520Snw141292 lappend r [btree_data $::c1] 357*4520Snw141292 btree_next $::c1 358*4520Snw141292 } 359*4520Snw141292 set r 360*4520Snw141292} {five 5.00 four 4.00 six 6.00 three 3.00 two 2.00} 361*4520Snw141292 362*4520Snw141292# Try to read and write meta data 363*4520Snw141292# 364*4520Snw141292do_test btree-5.1 { 365*4520Snw141292 btree_get_meta $::b1 366*4520Snw141292} {0 0 0 0 0 0 0 0 0 0} 367*4520Snw141292do_test btree-5.2 { 368*4520Snw141292 set rc [catch {btree_update_meta $::b1 1 2 3 4 5 6 7 8 9 10} msg] 369*4520Snw141292 lappend rc $msg 370*4520Snw141292} {1 SQLITE_ERROR} 371*4520Snw141292do_test btree-5.3 { 372*4520Snw141292 btree_begin_transaction $::b1 373*4520Snw141292 set rc [catch {btree_update_meta $::b1 1 2 3 4 5 6 7 8 9 10} msg] 374*4520Snw141292 lappend rc $msg 375*4520Snw141292} {0 {}} 376*4520Snw141292do_test btree-5.4 { 377*4520Snw141292 btree_get_meta $::b1 378*4520Snw141292} {0 2 3 4 5 6 7 8 9 10} 379*4520Snw141292do_test btree-5.5 { 380*4520Snw141292 btree_close_cursor $::c1 381*4520Snw141292 btree_rollback $::b1 382*4520Snw141292 btree_get_meta $::b1 383*4520Snw141292} {0 0 0 0 0 0 0 0 0 0} 384*4520Snw141292do_test btree-5.6 { 385*4520Snw141292 btree_begin_transaction $::b1 386*4520Snw141292 btree_update_meta $::b1 999 10 20 30 40 50 60 70 80 90 387*4520Snw141292 btree_commit $::b1 388*4520Snw141292 btree_get_meta $::b1 389*4520Snw141292} {0 10 20 30 40 50 60 70 80 90} 390*4520Snw141292 391*4520Snw141292proc select_all {cursor} { 392*4520Snw141292 set r {} 393*4520Snw141292 btree_move_to $cursor {} 394*4520Snw141292 while 1 { 395*4520Snw141292 set key [btree_key $cursor] 396*4520Snw141292 if {$key==""} break 397*4520Snw141292 lappend r $key 398*4520Snw141292 lappend r [btree_data $cursor] 399*4520Snw141292 btree_next $cursor 400*4520Snw141292 } 401*4520Snw141292 return $r 402*4520Snw141292} 403*4520Snw141292proc select_keys {cursor} { 404*4520Snw141292 set r {} 405*4520Snw141292 btree_move_to $cursor {} 406*4520Snw141292 while 1 { 407*4520Snw141292 set key [btree_key $cursor] 408*4520Snw141292 if {$key==""} break 409*4520Snw141292 lappend r $key 410*4520Snw141292 btree_next $cursor 411*4520Snw141292 } 412*4520Snw141292 return $r 413*4520Snw141292} 414*4520Snw141292 415*4520Snw141292# Try to create a new table in the database file 416*4520Snw141292# 417*4520Snw141292do_test btree-6.1 { 418*4520Snw141292 set rc [catch {btree_create_table $::b1} msg] 419*4520Snw141292 lappend rc $msg 420*4520Snw141292} {1 SQLITE_ERROR} 421*4520Snw141292do_test btree-6.2 { 422*4520Snw141292 btree_begin_transaction $::b1 423*4520Snw141292 set ::t2 [btree_create_table $::b1] 424*4520Snw141292} {3} 425*4520Snw141292do_test btree-6.2.1 { 426*4520Snw141292 lindex [btree_pager_stats $::b1] 1 427*4520Snw141292} {1} 428*4520Snw141292do_test btree-6.2.2 { 429*4520Snw141292 set ::c2 [btree_cursor $::b1 $::t2 1] 430*4520Snw141292 lindex [btree_pager_stats $::b1] 1 431*4520Snw141292} {2} 432*4520Snw141292do_test btree-6.2.3 { 433*4520Snw141292 btree_insert $::c2 ten 10 434*4520Snw141292 btree_key $::c2 435*4520Snw141292} {ten} 436*4520Snw141292do_test btree-6.3 { 437*4520Snw141292 btree_commit $::b1 438*4520Snw141292 set ::c1 [btree_cursor $::b1 2 1] 439*4520Snw141292 lindex [btree_pager_stats $::b1] 1 440*4520Snw141292} {3} 441*4520Snw141292do_test btree-6.3.1 { 442*4520Snw141292 select_all $::c1 443*4520Snw141292} {five 5.00 four 4.00 six 6.00 three 3.00 two 2.00} 444*4520Snw141292#btree_page_dump $::b1 3 445*4520Snw141292do_test btree-6.4 { 446*4520Snw141292 select_all $::c2 447*4520Snw141292} {ten 10} 448*4520Snw141292 449*4520Snw141292# Drop the new table, then create it again anew. 450*4520Snw141292# 451*4520Snw141292do_test btree-6.5 { 452*4520Snw141292 btree_begin_transaction $::b1 453*4520Snw141292} {} 454*4520Snw141292do_test btree-6.6 { 455*4520Snw141292 btree_close_cursor $::c2 456*4520Snw141292} {} 457*4520Snw141292do_test btree-6.6.1 { 458*4520Snw141292 lindex [btree_pager_stats $::b1] 1 459*4520Snw141292} {2} 460*4520Snw141292do_test btree-6.7 { 461*4520Snw141292 btree_drop_table $::b1 $::t2 462*4520Snw141292} {} 463*4520Snw141292do_test btree-6.7.1 { 464*4520Snw141292 lindex [btree_get_meta $::b1] 0 465*4520Snw141292} {1} 466*4520Snw141292do_test btree-6.8 { 467*4520Snw141292 set ::t2 [btree_create_table $::b1] 468*4520Snw141292} {3} 469*4520Snw141292do_test btree-6.8.1 { 470*4520Snw141292 lindex [btree_get_meta $::b1] 0 471*4520Snw141292} {0} 472*4520Snw141292do_test btree-6.9 { 473*4520Snw141292 set ::c2 [btree_cursor $::b1 $::t2 1] 474*4520Snw141292 lindex [btree_pager_stats $::b1] 1 475*4520Snw141292} {3} 476*4520Snw141292 477*4520Snw141292do_test btree-6.9.1 { 478*4520Snw141292 btree_move_to $::c2 {} 479*4520Snw141292 btree_key $::c2 480*4520Snw141292} {} 481*4520Snw141292 482*4520Snw141292# If we drop table 2 it just clears the table. Table 2 always exists. 483*4520Snw141292# 484*4520Snw141292do_test btree-6.10 { 485*4520Snw141292 btree_close_cursor $::c1 486*4520Snw141292 btree_drop_table $::b1 2 487*4520Snw141292 set ::c1 [btree_cursor $::b1 2 1] 488*4520Snw141292 btree_move_to $::c1 {} 489*4520Snw141292 btree_key $::c1 490*4520Snw141292} {} 491*4520Snw141292do_test btree-6.11 { 492*4520Snw141292 btree_commit $::b1 493*4520Snw141292 select_all $::c1 494*4520Snw141292} {} 495*4520Snw141292do_test btree-6.12 { 496*4520Snw141292 select_all $::c2 497*4520Snw141292} {} 498*4520Snw141292do_test btree-6.13 { 499*4520Snw141292 btree_close_cursor $::c2 500*4520Snw141292 lindex [btree_pager_stats $::b1] 1 501*4520Snw141292} {2} 502*4520Snw141292 503*4520Snw141292# Check to see that pages defragment properly. To do this test we will 504*4520Snw141292# 505*4520Snw141292# 1. Fill the first page table 2 with data. 506*4520Snw141292# 2. Delete every other entry of table 2. 507*4520Snw141292# 3. Insert a single entry that requires more contiguous 508*4520Snw141292# space than is available. 509*4520Snw141292# 510*4520Snw141292do_test btree-7.1 { 511*4520Snw141292 btree_begin_transaction $::b1 512*4520Snw141292} {} 513*4520Snw141292catch {unset key} 514*4520Snw141292catch {unset data} 515*4520Snw141292do_test btree-7.2 { 516*4520Snw141292 for {set i 0} {$i<36} {incr i} { 517*4520Snw141292 set key [format %03d $i] 518*4520Snw141292 set data "*** $key ***" 519*4520Snw141292 btree_insert $::c1 $key $data 520*4520Snw141292 } 521*4520Snw141292 lrange [btree_cursor_dump $::c1] 4 5 522*4520Snw141292} {8 1} 523*4520Snw141292do_test btree-7.3 { 524*4520Snw141292 btree_move_to $::c1 000 525*4520Snw141292 while {[btree_key $::c1]!=""} { 526*4520Snw141292 btree_delete $::c1 527*4520Snw141292 btree_next $::c1 528*4520Snw141292 btree_next $::c1 529*4520Snw141292 } 530*4520Snw141292 lrange [btree_cursor_dump $::c1] 4 5 531*4520Snw141292} {512 19} 532*4520Snw141292#btree_page_dump $::b1 2 533*4520Snw141292do_test btree-7.4 { 534*4520Snw141292 btree_insert $::c1 018 {*** 018 ***+++} 535*4520Snw141292 btree_key $::c1 536*4520Snw141292} {018} 537*4520Snw141292do_test btree-7.5 { 538*4520Snw141292 lrange [btree_cursor_dump $::c1] 4 5 539*4520Snw141292} {480 1} 540*4520Snw141292#btree_page_dump $::b1 2 541*4520Snw141292 542*4520Snw141292# Delete an entry to make a hole of a known size, then immediately recreate 543*4520Snw141292# that entry. This tests the path into allocateSpace where the hole exactly 544*4520Snw141292# matches the size of the desired space. 545*4520Snw141292# 546*4520Snw141292do_test btree-7.6 { 547*4520Snw141292 btree_move_to $::c1 007 548*4520Snw141292 btree_delete $::c1 549*4520Snw141292 btree_move_to $::c1 011 550*4520Snw141292 btree_delete $::c1 551*4520Snw141292} {} 552*4520Snw141292do_test btree-7.7 { 553*4520Snw141292 lindex [btree_cursor_dump $::c1] 5 554*4520Snw141292} {3} 555*4520Snw141292#btree_page_dump $::b1 2 556*4520Snw141292do_test btree-7.8 { 557*4520Snw141292 btree_insert $::c1 007 {*** 007 ***} 558*4520Snw141292 lindex [btree_cursor_dump $::c1] 5 559*4520Snw141292} {2} 560*4520Snw141292#btree_page_dump $::b1 2 561*4520Snw141292 562*4520Snw141292# Make sure the freeSpace() routine properly coaleses adjacent memory blocks 563*4520Snw141292# 564*4520Snw141292do_test btree-7.9 { 565*4520Snw141292 btree_move_to $::c1 013 566*4520Snw141292 btree_delete $::c1 567*4520Snw141292 lrange [btree_cursor_dump $::c1] 4 5 568*4520Snw141292} {536 2} 569*4520Snw141292do_test btree-7.10 { 570*4520Snw141292 btree_move_to $::c1 009 571*4520Snw141292 btree_delete $::c1 572*4520Snw141292 lrange [btree_cursor_dump $::c1] 4 5 573*4520Snw141292} {564 2} 574*4520Snw141292do_test btree-7.11 { 575*4520Snw141292 btree_move_to $::c1 018 576*4520Snw141292 btree_delete $::c1 577*4520Snw141292 lrange [btree_cursor_dump $::c1] 4 5 578*4520Snw141292} {596 2} 579*4520Snw141292do_test btree-7.13 { 580*4520Snw141292 btree_move_to $::c1 033 581*4520Snw141292 btree_delete $::c1 582*4520Snw141292 lrange [btree_cursor_dump $::c1] 4 5 583*4520Snw141292} {624 3} 584*4520Snw141292do_test btree-7.14 { 585*4520Snw141292 btree_move_to $::c1 035 586*4520Snw141292 btree_delete $::c1 587*4520Snw141292 lrange [btree_cursor_dump $::c1] 4 5 588*4520Snw141292} {652 2} 589*4520Snw141292#btree_page_dump $::b1 2 590*4520Snw141292do_test btree-7.15 { 591*4520Snw141292 lindex [btree_pager_stats $::b1] 1 592*4520Snw141292} {2} 593*4520Snw141292 594*4520Snw141292# Check to see that data on overflow pages work correctly. 595*4520Snw141292# 596*4520Snw141292do_test btree-8.1 { 597*4520Snw141292 set data "*** This is a very long key " 598*4520Snw141292 while {[string length $data]<256} {append data $data} 599*4520Snw141292 set ::data $data 600*4520Snw141292 btree_insert $::c1 020 $data 601*4520Snw141292} {} 602*4520Snw141292#btree_page_dump $::b1 2 603*4520Snw141292do_test btree-8.1.1 { 604*4520Snw141292 lindex [btree_pager_stats $::b1] 1 605*4520Snw141292} {2} 606*4520Snw141292#btree_pager_ref_dump $::b1 607*4520Snw141292do_test btree-8.2 { 608*4520Snw141292 string length [btree_data $::c1] 609*4520Snw141292} [string length $::data] 610*4520Snw141292do_test btree-8.3 { 611*4520Snw141292 btree_data $::c1 612*4520Snw141292} $::data 613*4520Snw141292do_test btree-8.4 { 614*4520Snw141292 btree_delete $::c1 615*4520Snw141292} {} 616*4520Snw141292do_test btree-8.4.1 { 617*4520Snw141292 lindex [btree_get_meta $::b1] 0 618*4520Snw141292} [expr {int(([string length $::data]-238+1019)/1020)}] 619*4520Snw141292do_test btree-8.5 { 620*4520Snw141292 set data "*** This is an even longer key" 621*4520Snw141292 while {[string length $data]<2000} {append data $data} 622*4520Snw141292 set ::data $data 623*4520Snw141292 btree_insert $::c1 020 $data 624*4520Snw141292} {} 625*4520Snw141292do_test btree-8.6 { 626*4520Snw141292 string length [btree_data $::c1] 627*4520Snw141292} [string length $::data] 628*4520Snw141292do_test btree-8.7 { 629*4520Snw141292 btree_data $::c1 630*4520Snw141292} $::data 631*4520Snw141292do_test btree-8.8 { 632*4520Snw141292 btree_commit $::b1 633*4520Snw141292 btree_data $::c1 634*4520Snw141292} $::data 635*4520Snw141292do_test btree-8.9 { 636*4520Snw141292 btree_close_cursor $::c1 637*4520Snw141292 btree_close $::b1 638*4520Snw141292 set ::b1 [btree_open test1.bt] 639*4520Snw141292 set ::c1 [btree_cursor $::b1 2 1] 640*4520Snw141292 btree_move_to $::c1 020 641*4520Snw141292 btree_data $::c1 642*4520Snw141292} $::data 643*4520Snw141292do_test btree-8.10 { 644*4520Snw141292 btree_begin_transaction $::b1 645*4520Snw141292 btree_delete $::c1 646*4520Snw141292} {} 647*4520Snw141292do_test btree-8.11 { 648*4520Snw141292 lindex [btree_get_meta $::b1] 0 649*4520Snw141292} [expr {int(([string length $::data]-238+1019)/1020)}] 650*4520Snw141292 651*4520Snw141292# Now check out keys on overflow pages. 652*4520Snw141292# 653*4520Snw141292do_test btree-8.12 { 654*4520Snw141292 set ::keyprefix "This is a long prefix to a key " 655*4520Snw141292 while {[string length $::keyprefix]<256} {append ::keyprefix $::keyprefix} 656*4520Snw141292 btree_close_cursor $::c1 657*4520Snw141292 btree_drop_table $::b1 2 658*4520Snw141292 lindex [btree_get_meta $::b1] 0 659*4520Snw141292} {4} 660*4520Snw141292do_test btree-8.12.1 { 661*4520Snw141292 set ::c1 [btree_cursor $::b1 2 1] 662*4520Snw141292 btree_insert $::c1 ${::keyprefix}1 1 663*4520Snw141292 btree_data $::c1 664*4520Snw141292} {1} 665*4520Snw141292do_test btree-8.13 { 666*4520Snw141292 btree_key $::c1 667*4520Snw141292} ${keyprefix}1 668*4520Snw141292do_test btree-8.14 { 669*4520Snw141292 btree_insert $::c1 ${::keyprefix}2 2 670*4520Snw141292 btree_insert $::c1 ${::keyprefix}3 3 671*4520Snw141292 btree_key $::c1 672*4520Snw141292} ${keyprefix}3 673*4520Snw141292do_test btree-8.15 { 674*4520Snw141292 btree_move_to $::c1 ${::keyprefix}2 675*4520Snw141292 btree_data $::c1 676*4520Snw141292} {2} 677*4520Snw141292do_test btree-8.16 { 678*4520Snw141292 btree_move_to $::c1 ${::keyprefix}1 679*4520Snw141292 btree_data $::c1 680*4520Snw141292} {1} 681*4520Snw141292do_test btree-8.17 { 682*4520Snw141292 btree_move_to $::c1 ${::keyprefix}3 683*4520Snw141292 btree_data $::c1 684*4520Snw141292} {3} 685*4520Snw141292do_test btree-8.18 { 686*4520Snw141292 lindex [btree_get_meta $::b1] 0 687*4520Snw141292} {1} 688*4520Snw141292do_test btree-8.19 { 689*4520Snw141292 btree_move_to $::c1 ${::keyprefix}2 690*4520Snw141292 btree_key $::c1 691*4520Snw141292} ${::keyprefix}2 692*4520Snw141292#btree_page_dump $::b1 2 693*4520Snw141292do_test btree-8.20 { 694*4520Snw141292 btree_delete $::c1 695*4520Snw141292 btree_next $::c1 696*4520Snw141292 btree_key $::c1 697*4520Snw141292} ${::keyprefix}3 698*4520Snw141292#btree_page_dump $::b1 2 699*4520Snw141292do_test btree-8.21 { 700*4520Snw141292 lindex [btree_get_meta $::b1] 0 701*4520Snw141292} {2} 702*4520Snw141292do_test btree-8.22 { 703*4520Snw141292 lindex [btree_pager_stats $::b1] 1 704*4520Snw141292} {2} 705*4520Snw141292do_test btree-8.23 { 706*4520Snw141292 btree_close_cursor $::c1 707*4520Snw141292 btree_drop_table $::b1 2 708*4520Snw141292 set ::c1 [btree_cursor $::b1 2 1] 709*4520Snw141292 lindex [btree_get_meta $::b1] 0 710*4520Snw141292} {4} 711*4520Snw141292do_test btree-8.24 { 712*4520Snw141292 lindex [btree_pager_stats $::b1] 1 713*4520Snw141292} {2} 714*4520Snw141292#btree_pager_ref_dump $::b1 715*4520Snw141292 716*4520Snw141292# Check page splitting logic 717*4520Snw141292# 718*4520Snw141292do_test btree-9.1 { 719*4520Snw141292 for {set i 1} {$i<=19} {incr i} { 720*4520Snw141292 set key [format %03d $i] 721*4520Snw141292 set data "*** $key *** $key *** $key *** $key ***" 722*4520Snw141292 btree_insert $::c1 $key $data 723*4520Snw141292 } 724*4520Snw141292} {} 725*4520Snw141292#btree_tree_dump $::b1 2 726*4520Snw141292#btree_pager_ref_dump $::b1 727*4520Snw141292#set pager_refinfo_enable 1 728*4520Snw141292do_test btree-9.2 { 729*4520Snw141292 btree_insert $::c1 020 {*** 020 *** 020 *** 020 *** 020 ***} 730*4520Snw141292 select_keys $::c1 731*4520Snw141292} {001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020} 732*4520Snw141292#btree_page_dump $::b1 5 733*4520Snw141292#btree_page_dump $::b1 2 734*4520Snw141292#btree_page_dump $::b1 7 735*4520Snw141292#btree_pager_ref_dump $::b1 736*4520Snw141292#set pager_refinfo_enable 0 737*4520Snw141292 738*4520Snw141292# The previous "select_keys" command left the cursor pointing at the root 739*4520Snw141292# page. So there should only be two pages checked out. 2 (the root) and 740*4520Snw141292# page 1. 741*4520Snw141292do_test btree-9.2.1 { 742*4520Snw141292 lindex [btree_pager_stats $::b1] 1 743*4520Snw141292} {2} 744*4520Snw141292for {set i 1} {$i<=20} {incr i} { 745*4520Snw141292 do_test btree-9.3.$i.1 [subst { 746*4520Snw141292 btree_move_to $::c1 [format %03d $i] 747*4520Snw141292 btree_key $::c1 748*4520Snw141292 }] [format %03d $i] 749*4520Snw141292 do_test btree-9.3.$i.2 [subst { 750*4520Snw141292 btree_move_to $::c1 [format %03d $i] 751*4520Snw141292 string range \[btree_data $::c1\] 0 10 752*4520Snw141292 }] "*** [format %03d $i] ***" 753*4520Snw141292} 754*4520Snw141292do_test btree-9.4.1 { 755*4520Snw141292 lindex [btree_pager_stats $::b1] 1 756*4520Snw141292} {3} 757*4520Snw141292 758*4520Snw141292# Check the page joining logic. 759*4520Snw141292# 760*4520Snw141292#btree_page_dump $::b1 2 761*4520Snw141292#btree_pager_ref_dump $::b1 762*4520Snw141292do_test btree-9.4.2 { 763*4520Snw141292 btree_move_to $::c1 005 764*4520Snw141292 btree_delete $::c1 765*4520Snw141292} {} 766*4520Snw141292#btree_page_dump $::b1 2 767*4520Snw141292for {set i 1} {$i<=19} {incr i} { 768*4520Snw141292 if {$i==5} continue 769*4520Snw141292 do_test btree-9.5.$i.1 [subst { 770*4520Snw141292 btree_move_to $::c1 [format %03d $i] 771*4520Snw141292 btree_key $::c1 772*4520Snw141292 }] [format %03d $i] 773*4520Snw141292 do_test btree-9.5.$i.2 [subst { 774*4520Snw141292 btree_move_to $::c1 [format %03d $i] 775*4520Snw141292 string range \[btree_data $::c1\] 0 10 776*4520Snw141292 }] "*** [format %03d $i] ***" 777*4520Snw141292} 778*4520Snw141292#btree_pager_ref_dump $::b1 779*4520Snw141292do_test btree-9.6 { 780*4520Snw141292 btree_close_cursor $::c1 781*4520Snw141292 lindex [btree_pager_stats $::b1] 1 782*4520Snw141292} {1} 783*4520Snw141292do_test btree-9.7 { 784*4520Snw141292 btree_rollback $::b1 785*4520Snw141292 lindex [btree_pager_stats $::b1] 1 786*4520Snw141292} {0} 787*4520Snw141292 788*4520Snw141292# Create a tree of depth two. That is, there is a single divider entry 789*4520Snw141292# on the root pages and two leaf pages. Then delete the divider entry 790*4520Snw141292# see what happens. 791*4520Snw141292# 792*4520Snw141292do_test btree-10.1 { 793*4520Snw141292 btree_begin_transaction $::b1 794*4520Snw141292 btree_drop_table $::b1 2 795*4520Snw141292 lindex [btree_pager_stats $::b1] 1 796*4520Snw141292} {1} 797*4520Snw141292do_test btree-10.2 { 798*4520Snw141292 set ::c1 [btree_cursor $::b1 2 1] 799*4520Snw141292 lindex [btree_pager_stats $::b1] 1 800*4520Snw141292} {2} 801*4520Snw141292do_test btree-10.3 { 802*4520Snw141292 for {set i 1} {$i<=20} {incr i} { 803*4520Snw141292 set key [format %03d $i] 804*4520Snw141292 set data "*** $key *** $key *** $key *** $key ***" 805*4520Snw141292 btree_insert $::c1 $key $data 806*4520Snw141292 } 807*4520Snw141292 select_keys $::c1 808*4520Snw141292} {001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020} 809*4520Snw141292#btree_page_dump $::b1 7 810*4520Snw141292#btree_page_dump $::b1 2 811*4520Snw141292#btree_page_dump $::b1 6 812*4520Snw141292do_test btree-10.4 { 813*4520Snw141292 btree_move_to $::c1 011 814*4520Snw141292 btree_delete $::c1 815*4520Snw141292 select_keys $::c1 816*4520Snw141292} {001 002 003 004 005 006 007 008 009 010 012 013 014 015 016 017 018 019 020} 817*4520Snw141292#btree_tree_dump $::b1 2 818*4520Snw141292#btree_pager_ref_dump $::b1 819*4520Snw141292for {set i 1} {$i<=20} {incr i} { 820*4520Snw141292 do_test btree-10.5.$i { 821*4520Snw141292 btree_move_to $::c1 [format %03d $i] 822*4520Snw141292 lindex [btree_pager_stats $::b1] 1 823*4520Snw141292 } {2} 824*4520Snw141292 #btree_pager_ref_dump $::b1 825*4520Snw141292 #btree_tree_dump $::b1 2 826*4520Snw141292} 827*4520Snw141292 828*4520Snw141292# Create a tree with lots more pages 829*4520Snw141292# 830*4520Snw141292catch {unset ::data} 831*4520Snw141292catch {unset ::key} 832*4520Snw141292for {set i 21} {$i<=1000} {incr i} { 833*4520Snw141292 do_test btree-11.1.$i.1 { 834*4520Snw141292 set key [format %03d $i] 835*4520Snw141292 set ::data "*** $key *** $key *** $key *** $key ***" 836*4520Snw141292 btree_insert $::c1 $key $data 837*4520Snw141292 btree_key $::c1 838*4520Snw141292 } [format %03d $i] 839*4520Snw141292 do_test btree-11.1.$i.2 { 840*4520Snw141292 btree_data $::c1 841*4520Snw141292 } $::data 842*4520Snw141292 set ::key [format %03d [expr {$i/2}]] 843*4520Snw141292 if {$::key=="011"} {set ::key 010} 844*4520Snw141292 do_test btree-11.1.$i.3 { 845*4520Snw141292 btree_move_to $::c1 $::key 846*4520Snw141292 btree_key $::c1 847*4520Snw141292 } $::key 848*4520Snw141292} 849*4520Snw141292catch {unset ::data} 850*4520Snw141292catch {unset ::key} 851*4520Snw141292 852*4520Snw141292# Make sure our reference count is still correct. 853*4520Snw141292# 854*4520Snw141292do_test btree-11.2 { 855*4520Snw141292 btree_close_cursor $::c1 856*4520Snw141292 lindex [btree_pager_stats $::b1] 1 857*4520Snw141292} {1} 858*4520Snw141292do_test btree-11.3 { 859*4520Snw141292 set ::c1 [btree_cursor $::b1 2 1] 860*4520Snw141292 lindex [btree_pager_stats $::b1] 1 861*4520Snw141292} {2} 862*4520Snw141292#btree_page_dump $::b1 2 863*4520Snw141292 864*4520Snw141292# Delete the dividers on the root page 865*4520Snw141292# 866*4520Snw141292do_test btree-11.4 { 867*4520Snw141292 btree_move_to $::c1 257 868*4520Snw141292 btree_delete $::c1 869*4520Snw141292 btree_next $::c1 870*4520Snw141292 btree_key $::c1 871*4520Snw141292} {258} 872*4520Snw141292do_test btree-11.4.1 { 873*4520Snw141292 btree_move_to $::c1 256 874*4520Snw141292 btree_key $::c1 875*4520Snw141292} {256} 876*4520Snw141292do_test btree-11.4.2 { 877*4520Snw141292 btree_move_to $::c1 258 878*4520Snw141292 btree_key $::c1 879*4520Snw141292} {258} 880*4520Snw141292do_test btree-11.4.3 { 881*4520Snw141292 btree_move_to $::c1 259 882*4520Snw141292 btree_key $::c1 883*4520Snw141292} {259} 884*4520Snw141292do_test btree-11.4.4 { 885*4520Snw141292 btree_move_to $::c1 257 886*4520Snw141292 set n [btree_key $::c1] 887*4520Snw141292 expr {$n==256||$n==258} 888*4520Snw141292} {1} 889*4520Snw141292do_test btree-11.5 { 890*4520Snw141292 btree_move_to $::c1 513 891*4520Snw141292 btree_delete $::c1 892*4520Snw141292 btree_next $::c1 893*4520Snw141292 btree_key $::c1 894*4520Snw141292} {514} 895*4520Snw141292do_test btree-11.5.1 { 896*4520Snw141292 btree_move_to $::c1 512 897*4520Snw141292 btree_key $::c1 898*4520Snw141292} {512} 899*4520Snw141292do_test btree-11.5.2 { 900*4520Snw141292 btree_move_to $::c1 514 901*4520Snw141292 btree_key $::c1 902*4520Snw141292} {514} 903*4520Snw141292do_test btree-11.5.3 { 904*4520Snw141292 btree_move_to $::c1 515 905*4520Snw141292 btree_key $::c1 906*4520Snw141292} {515} 907*4520Snw141292do_test btree-11.5.4 { 908*4520Snw141292 btree_move_to $::c1 513 909*4520Snw141292 set n [btree_key $::c1] 910*4520Snw141292 expr {$n==512||$n==514} 911*4520Snw141292} {1} 912*4520Snw141292do_test btree-11.6 { 913*4520Snw141292 btree_move_to $::c1 769 914*4520Snw141292 btree_delete $::c1 915*4520Snw141292 btree_next $::c1 916*4520Snw141292 btree_key $::c1 917*4520Snw141292} {770} 918*4520Snw141292do_test btree-11.6.1 { 919*4520Snw141292 btree_move_to $::c1 768 920*4520Snw141292 btree_key $::c1 921*4520Snw141292} {768} 922*4520Snw141292do_test btree-11.6.2 { 923*4520Snw141292 btree_move_to $::c1 771 924*4520Snw141292 btree_key $::c1 925*4520Snw141292} {771} 926*4520Snw141292do_test btree-11.6.3 { 927*4520Snw141292 btree_move_to $::c1 770 928*4520Snw141292 btree_key $::c1 929*4520Snw141292} {770} 930*4520Snw141292do_test btree-11.6.4 { 931*4520Snw141292 btree_move_to $::c1 769 932*4520Snw141292 set n [btree_key $::c1] 933*4520Snw141292 expr {$n==768||$n==770} 934*4520Snw141292} {1} 935*4520Snw141292#btree_page_dump $::b1 2 936*4520Snw141292#btree_page_dump $::b1 25 937*4520Snw141292 938*4520Snw141292# Change the data on an intermediate node such that the node becomes overfull 939*4520Snw141292# and has to split. We happen to know that intermediate nodes exist on 940*4520Snw141292# 337, 401 and 465 by the btree_page_dumps above 941*4520Snw141292# 942*4520Snw141292catch {unset ::data} 943*4520Snw141292set ::data {This is going to be a very long data segment} 944*4520Snw141292append ::data $::data 945*4520Snw141292append ::data $::data 946*4520Snw141292do_test btree-12.1 { 947*4520Snw141292 btree_insert $::c1 337 $::data 948*4520Snw141292 btree_data $::c1 949*4520Snw141292} $::data 950*4520Snw141292do_test btree-12.2 { 951*4520Snw141292 btree_insert $::c1 401 $::data 952*4520Snw141292 btree_data $::c1 953*4520Snw141292} $::data 954*4520Snw141292do_test btree-12.3 { 955*4520Snw141292 btree_insert $::c1 465 $::data 956*4520Snw141292 btree_data $::c1 957*4520Snw141292} $::data 958*4520Snw141292do_test btree-12.4 { 959*4520Snw141292 btree_move_to $::c1 337 960*4520Snw141292 btree_key $::c1 961*4520Snw141292} {337} 962*4520Snw141292do_test btree-12.5 { 963*4520Snw141292 btree_data $::c1 964*4520Snw141292} $::data 965*4520Snw141292do_test btree-12.6 { 966*4520Snw141292 btree_next $::c1 967*4520Snw141292 btree_key $::c1 968*4520Snw141292} {338} 969*4520Snw141292do_test btree-12.7 { 970*4520Snw141292 btree_move_to $::c1 464 971*4520Snw141292 btree_key $::c1 972*4520Snw141292} {464} 973*4520Snw141292do_test btree-12.8 { 974*4520Snw141292 btree_next $::c1 975*4520Snw141292 btree_data $::c1 976*4520Snw141292} $::data 977*4520Snw141292do_test btree-12.9 { 978*4520Snw141292 btree_next $::c1 979*4520Snw141292 btree_key $::c1 980*4520Snw141292} {466} 981*4520Snw141292do_test btree-12.10 { 982*4520Snw141292 btree_move_to $::c1 400 983*4520Snw141292 btree_key $::c1 984*4520Snw141292} {400} 985*4520Snw141292do_test btree-12.11 { 986*4520Snw141292 btree_next $::c1 987*4520Snw141292 btree_data $::c1 988*4520Snw141292} $::data 989*4520Snw141292do_test btree-12.12 { 990*4520Snw141292 btree_next $::c1 991*4520Snw141292 btree_key $::c1 992*4520Snw141292} {402} 993*4520Snw141292do_test btree-13.1 { 994*4520Snw141292 btree_integrity_check $::b1 2 3 995*4520Snw141292} {} 996*4520Snw141292 997*4520Snw141292# To Do: 998*4520Snw141292# 999*4520Snw141292# 1. Do some deletes from the 3-layer tree 1000*4520Snw141292# 2. Commit and reopen the database 1001*4520Snw141292# 3. Read every 15th entry and make sure it works 1002*4520Snw141292# 4. Implement btree_sanity and put it throughout this script 1003*4520Snw141292# 1004*4520Snw141292 1005*4520Snw141292do_test btree-15.98 { 1006*4520Snw141292 btree_close_cursor $::c1 1007*4520Snw141292 lindex [btree_pager_stats $::b1] 1 1008*4520Snw141292} {1} 1009*4520Snw141292do_test btree-15.99 { 1010*4520Snw141292 btree_rollback $::b1 1011*4520Snw141292 lindex [btree_pager_stats $::b1] 1 1012*4520Snw141292} {0} 1013*4520Snw141292btree_pager_ref_dump $::b1 1014*4520Snw141292 1015*4520Snw141292do_test btree-99.1 { 1016*4520Snw141292 btree_close $::b1 1017*4520Snw141292} {} 1018*4520Snw141292catch {unset data} 1019*4520Snw141292catch {unset key} 1020*4520Snw141292 1021*4520Snw141292} ;# end if( not mem: and has pager_open command ); 1022*4520Snw141292 1023*4520Snw141292finish_test 1024