📄 btree.test
字号:
# 2001 September 15## The author disclaims copyright to this source code. In place of# a legal notice, here is a blessing:## May you do good and not evil.# May you find forgiveness for yourself and forgive others.# May you share freely, never taking more than you give.##***********************************************************************# This file implements regression tests for SQLite library. The# focus of this script is btree database backend## $Id: btree.test,v 1.15 2004/02/10 01:54:28 drh Exp $set testdir [file dirname $argv0]source $testdir/tester.tclif {[info commands btree_open]!="" && $SQLITE_PAGE_SIZE==1024 && $SQLITE_USABLE_SIZE==1024} {# Basic functionality. Open and close a database.#do_test btree-1.1 { file delete -force test1.bt file delete -force test1.bt-journal set rc [catch {btree_open test1.bt} ::b1]} {0}# The second element of the list returned by btree_pager_stats is the# number of pages currently checked out. We'll be checking this value# frequently during this test script, to make sure the btree library# is properly releasing the pages it checks out, and thus avoiding# page leaks.#do_test btree-1.1.1 { lindex [btree_pager_stats $::b1] 1} {0}do_test btree-1.2 { set rc [catch {btree_open test1.bt} ::b2]} {0}do_test btree-1.3 { set rc [catch {btree_close $::b2} msg] lappend rc $msg} {0 {}}# Do an insert and verify that the database file grows in size.#do_test btree-1.4 { set rc [catch {btree_begin_transaction $::b1} msg] lappend rc $msg} {0 {}}do_test btree-1.4.1 { lindex [btree_pager_stats $::b1] 1} {1}do_test btree-1.5 { set rc [catch {btree_cursor $::b1 2 1} ::c1] if {$rc} {lappend rc $::c1} set rc} {0}do_test btree-1.6 { set rc [catch {btree_insert $::c1 one 1.00} msg] lappend rc $msg} {0 {}}do_test btree-1.7 { btree_key $::c1} {one}do_test btree-1.8 { btree_data $::c1} {1.00}do_test btree-1.9 { set rc [catch {btree_close_cursor $::c1} msg] lappend rc $msg} {0 {}}do_test btree-1.10 { set rc [catch {btree_commit $::b1} msg] lappend rc $msg} {0 {}}do_test btree-1.11 { file size test1.bt} {2048}do_test btree-1.12 { lindex [btree_pager_stats $::b1] 1} {0}# Reopen the database and attempt to read the record that we wrote.#do_test btree-2.1 { set rc [catch {btree_cursor $::b1 2 1} ::c1] if {$rc} {lappend rc $::c1} set rc} {0}do_test btree-2.2 { btree_move_to $::c1 abc} {1}do_test btree-2.3 { btree_move_to $::c1 xyz} {-1}do_test btree-2.4 { btree_move_to $::c1 one} {0}do_test btree-2.5 { btree_key $::c1} {one}do_test btree-2.6 { btree_data $::c1} {1.00}do_test btree-2.7 { lindex [btree_pager_stats $::b1] 1} {2}# Do some additional inserts#do_test btree-3.1 { btree_begin_transaction $::b1 btree_insert $::c1 two 2.00 btree_key $::c1} {two}do_test btree-3.1.1 { lindex [btree_pager_stats $::b1] 1} {2}do_test btree-3.2 { btree_insert $::c1 three 3.00 btree_key $::c1} {three}do_test btree-3.4 { btree_insert $::c1 four 4.00 btree_key $::c1} {four}do_test btree-3.5 { btree_insert $::c1 five 5.00 btree_key $::c1} {five}do_test btree-3.6 { btree_insert $::c1 six 6.00 btree_key $::c1} {six}#btree_page_dump $::b1 2do_test btree-3.7 { set rc [btree_move_to $::c1 {}] expr {$rc>0}} {1}do_test btree-3.8 { btree_key $::c1} {five}do_test btree-3.9 { btree_data $::c1} {5.00}do_test btree-3.10 { btree_next $::c1 btree_key $::c1} {four}do_test btree-3.11 { btree_data $::c1} {4.00}do_test btree-3.12 { btree_next $::c1 btree_key $::c1} {one}do_test btree-3.13 { btree_data $::c1} {1.00}do_test btree-3.14 { btree_next $::c1 btree_key $::c1} {six}do_test btree-3.15 { btree_data $::c1} {6.00}do_test btree-3.16 { btree_next $::c1 btree_key $::c1} {three}do_test btree-3.17 { btree_data $::c1} {3.00}do_test btree-3.18 { btree_next $::c1 btree_key $::c1} {two}do_test btree-3.19 { btree_data $::c1} {2.00}do_test btree-3.20 { btree_next $::c1 btree_key $::c1} {}do_test btree-3.21 { btree_data $::c1} {}# Commit the changes, reopen and reread the data#do_test btree-3.22 { set rc [catch {btree_close_cursor $::c1} msg] lappend rc $msg} {0 {}}do_test btree-3.22.1 { lindex [btree_pager_stats $::b1] 1} {1}do_test btree-3.23 { set rc [catch {btree_commit $::b1} msg] lappend rc $msg} {0 {}}do_test btree-3.23.1 { lindex [btree_pager_stats $::b1] 1} {0}do_test btree-3.24 { file size test1.bt} {2048}do_test btree-3.25 { set rc [catch {btree_cursor $::b1 2 1} ::c1] if {$rc} {lappend rc $::c1} set rc} {0}do_test btree-3.25.1 { lindex [btree_pager_stats $::b1] 1} {2}do_test btree-3.26 { set rc [btree_move_to $::c1 {}] expr {$rc>0}} {1}do_test btree-3.27 { btree_key $::c1} {five}do_test btree-3.28 { btree_data $::c1} {5.00}do_test btree-3.29 { btree_next $::c1 btree_key $::c1} {four}do_test btree-3.30 { btree_data $::c1} {4.00}do_test btree-3.31 { btree_next $::c1 btree_key $::c1} {one}do_test btree-3.32 { btree_data $::c1} {1.00}do_test btree-3.33 { btree_next $::c1 btree_key $::c1} {six}do_test btree-3.34 { btree_data $::c1} {6.00}do_test btree-3.35 { btree_next $::c1 btree_key $::c1} {three}do_test btree-3.36 { btree_data $::c1} {3.00}do_test btree-3.37 { btree_next $::c1 btree_key $::c1} {two}do_test btree-3.38 { btree_data $::c1} {2.00}do_test btree-3.39 { btree_next $::c1 btree_key $::c1} {}do_test btree-3.40 { btree_data $::c1} {}do_test btree-3.41 { lindex [btree_pager_stats $::b1] 1} {2}# Now try a delete#do_test btree-4.1 { btree_begin_transaction $::b1 btree_move_to $::c1 one btree_key $::c1} {one}do_test btree-4.1.1 { lindex [btree_pager_stats $::b1] 1} {2}do_test btree-4.2 { btree_delete $::c1} {}do_test btree-4.3 { btree_key $::c1} {six}do_test btree-4.4 { btree_next $::c1 btree_key $::c1} {six}do_test btree-4.5 { btree_next $::c1 btree_key $::c1} {three}do_test btree-4.4 { btree_move_to $::c1 {} set r {} while 1 { set key [btree_key $::c1] if {$key==""} break lappend r $key lappend r [btree_data $::c1] btree_next $::c1 } set r } {five 5.00 four 4.00 six 6.00 three 3.00 two 2.00}# Commit and make sure the delete is still there.#do_test btree-4.5 { btree_commit $::b1 btree_move_to $::c1 {} set r {} while 1 { set key [btree_key $::c1] if {$key==""} break lappend r $key lappend r [btree_data $::c1] btree_next $::c1 } set r } {five 5.00 four 4.00 six 6.00 three 3.00 two 2.00}# Completely close the database and reopen it. Then check# the data again.#do_test btree-4.6 { lindex [btree_pager_stats $::b1] 1} {2}do_test btree-4.7 { btree_close_cursor $::c1 lindex [btree_pager_stats $::b1] 1} {0}do_test btree-4.8 { btree_close $::b1 set ::b1 [btree_open test1.bt] set ::c1 [btree_cursor $::b1 2 1] lindex [btree_pager_stats $::b1] 1} {2}do_test btree-4.9 { set r {} btree_first $::c1 while 1 { set key [btree_key $::c1] if {$key==""} break lappend r $key lappend r [btree_data $::c1] btree_next $::c1 } set r } {five 5.00 four 4.00 six 6.00 three 3.00 two 2.00}# Try to read and write meta data#do_test btree-5.1 { btree_get_meta $::b1} {0 0 0 0 0 0 0 0 0 0}do_test btree-5.2 { set rc [catch {btree_update_meta $::b1 1 2 3 4 5 6 7 8 9 10} msg] lappend rc $msg} {1 SQLITE_ERROR}do_test btree-5.3 { btree_begin_transaction $::b1 set rc [catch {btree_update_meta $::b1 1 2 3 4 5 6 7 8 9 10} msg] lappend rc $msg} {0 {}}do_test btree-5.4 { btree_get_meta $::b1} {0 2 3 4 5 6 7 8 9 10}do_test btree-5.5 { btree_close_cursor $::c1 btree_rollback $::b1 btree_get_meta $::b1} {0 0 0 0 0 0 0 0 0 0}do_test btree-5.6 { btree_begin_transaction $::b1 btree_update_meta $::b1 999 10 20 30 40 50 60 70 80 90 btree_commit $::b1 btree_get_meta $::b1} {0 10 20 30 40 50 60 70 80 90}proc select_all {cursor} { set r {} btree_move_to $cursor {} while 1 { set key [btree_key $cursor] if {$key==""} break lappend r $key lappend r [btree_data $cursor] btree_next $cursor } return $r}proc select_keys {cursor} { set r {} btree_move_to $cursor {} while 1 { set key [btree_key $cursor] if {$key==""} break lappend r $key btree_next $cursor } return $r}# Try to create a new table in the database file#do_test btree-6.1 { set rc [catch {btree_create_table $::b1} msg] lappend rc $msg} {1 SQLITE_ERROR}do_test btree-6.2 { btree_begin_transaction $::b1 set ::t2 [btree_create_table $::b1]} {3}do_test btree-6.2.1 { lindex [btree_pager_stats $::b1] 1} {1}do_test btree-6.2.2 { set ::c2 [btree_cursor $::b1 $::t2 1] lindex [btree_pager_stats $::b1] 1} {2}do_test btree-6.2.3 { btree_insert $::c2 ten 10 btree_key $::c2} {ten}do_test btree-6.3 { btree_commit $::b1 set ::c1 [btree_cursor $::b1 2 1] lindex [btree_pager_stats $::b1] 1} {3}do_test btree-6.3.1 { select_all $::c1} {five 5.00 four 4.00 six 6.00 three 3.00 two 2.00}#btree_page_dump $::b1 3do_test btree-6.4 { select_all $::c2} {ten 10}# Drop the new table, then create it again anew.#do_test btree-6.5 { btree_begin_transaction $::b1} {}do_test btree-6.6 { btree_close_cursor $::c2} {}do_test btree-6.6.1 { lindex [btree_pager_stats $::b1] 1} {2}do_test btree-6.7 { btree_drop_table $::b1 $::t2} {}do_test btree-6.7.1 { lindex [btree_get_meta $::b1] 0} {1}do_test btree-6.8 { set ::t2 [btree_create_table $::b1]} {3}do_test btree-6.8.1 { lindex [btree_get_meta $::b1] 0} {0}do_test btree-6.9 { set ::c2 [btree_cursor $::b1 $::t2 1] lindex [btree_pager_stats $::b1] 1} {3}do_test btree-6.9.1 { btree_move_to $::c2 {} btree_key $::c2} {}# If we drop table 2 it just clears the table. Table 2 always exists.#do_test btree-6.10 { btree_close_cursor $::c1 btree_drop_table $::b1 2 set ::c1 [btree_cursor $::b1 2 1] btree_move_to $::c1 {} btree_key $::c1} {}do_test btree-6.11 { btree_commit $::b1 select_all $::c1} {}do_test btree-6.12 { select_all $::c2} {}do_test btree-6.13 { btree_close_cursor $::c2 lindex [btree_pager_stats $::b1] 1} {2}# Check to see that pages defragment properly. To do this test we will# # 1. Fill the first page table 2 with data.# 2. Delete every other entry of table 2. # 3. Insert a single entry that requires more contiguous# space than is available.#do_test btree-7.1 { btree_begin_transaction $::b1} {}catch {unset key}catch {unset data}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -