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