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