📄 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.40 2007/06/25 08:16:58 danielk1977 Exp $set testdir [file dirname $argv0]source $testdir/tester.tclifcapable default_autovacuum { finish_test return}# 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 2000 0} ::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 2000 0} ::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 1 1} ::c1] if {$rc} {lappend rc $::c1} set rc} {0}do_test btree-1.6 { set rc [catch {btree_insert $::c1 100 1.00} msg] lappend rc $msg} {0 {}}do_test btree-1.7 { btree_move_to $::c1 100 btree_key $::c1} {100}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} {1024}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 1 1} ::c1] if {$rc} {lappend rc $::c1} set rc} {0}do_test btree-2.1.1 { btree_cursor_list $::b1} {}do_test btree-2.2 { btree_move_to $::c1 99} {1}do_test btree-2.3 { btree_move_to $::c1 101} {-1}do_test btree-2.4 { btree_move_to $::c1 100} {0}do_test btree-2.5 { btree_key $::c1} {100}do_test btree-2.6 { btree_data $::c1} {1.00}do_test btree-2.7 { lindex [btree_pager_stats $::b1] 1} {1}# Do some additional inserts#do_test btree-3.1 { btree_begin_transaction $::b1 btree_insert $::c1 200 2.00 btree_move_to $::c1 200 btree_key $::c1} {200}do_test btree-3.1.1 { lindex [btree_pager_stats $::b1] 1} {1}do_test btree-3.2 { btree_insert $::c1 300 3.00 btree_move_to $::c1 300 btree_key $::c1} {300}do_test btree-3.4 { btree_insert $::c1 400 4.00 btree_move_to $::c1 400 btree_key $::c1} {400}do_test btree-3.5 { btree_insert $::c1 500 5.00 btree_move_to $::c1 500 btree_key $::c1} {500}do_test btree-3.6 { btree_insert $::c1 600 6.00 btree_move_to $::c1 600 btree_key $::c1} {600}#btree_page_dump $::b1 2do_test btree-3.7 { set rc [btree_move_to $::c1 0] expr {$rc>0}} {1}do_test btree-3.8 { btree_key $::c1} {100}do_test btree-3.9 { btree_data $::c1} {1.00}do_test btree-3.10 { btree_next $::c1 btree_key $::c1} {200}do_test btree-3.11 { btree_data $::c1} {2.00}do_test btree-3.12 { btree_next $::c1 btree_key $::c1} {300}do_test btree-3.13 { btree_data $::c1} {3.00}do_test btree-3.14 { btree_next $::c1 btree_key $::c1} {400}do_test btree-3.15 { btree_data $::c1} {4.00}do_test btree-3.16 { btree_next $::c1 btree_key $::c1} {500}do_test btree-3.17 { btree_data $::c1} {5.00}do_test btree-3.18 { btree_next $::c1 btree_key $::c1} {600}do_test btree-3.19 { btree_data $::c1} {6.00}do_test btree-3.20.1 { btree_next $::c1 btree_key $::c1} {0}do_test btree-3.20.2 { btree_eof $::c1} {1}# This test case used to test that one couldn't request data from an # invalid cursor. That is now an assert()ed condition.## do_test btree-3.21 {# set rc [catch {btree_data $::c1} res]# lappend rc $res# } {1 SQLITE_INTERNAL}# 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} {1024}do_test btree-3.25 { set rc [catch {btree_cursor $::b1 1 1} ::c1] if {$rc} {lappend rc $::c1} set rc} {0}do_test btree-3.25.1 { lindex [btree_pager_stats $::b1] 1} {1}do_test btree-3.26 { set rc [btree_move_to $::c1 0] expr {$rc>0}} {1}do_test btree-3.27 { btree_key $::c1} {100}do_test btree-3.28 { btree_data $::c1} {1.00}do_test btree-3.29 { btree_next $::c1 btree_key $::c1} {200}do_test btree-3.30 { btree_data $::c1} {2.00}do_test btree-3.31 { btree_next $::c1 btree_key $::c1} {300}do_test btree-3.32 { btree_data $::c1} {3.00}do_test btree-3.33 { btree_next $::c1 btree_key $::c1} {400}do_test btree-3.34 { btree_data $::c1} {4.00}do_test btree-3.35 { btree_next $::c1 btree_key $::c1} {500}do_test btree-3.36 { btree_data $::c1} {5.00}do_test btree-3.37 { btree_next $::c1 btree_key $::c1} {600}do_test btree-3.38 { btree_data $::c1} {6.00}do_test btree-3.39 { btree_next $::c1 btree_key $::c1} {0}# This test case used to test that requesting data from an invalid cursor# returned SQLITE_INTERNAL. That is now an assert()ed condition.## do_test btree-3.40 {# set rc [catch {btree_data $::c1} res]# lappend rc $res# } {1 SQLITE_INTERNAL}do_test btree-3.41 { lindex [btree_pager_stats $::b1] 1} {1}# Now try a delete#do_test btree-4.1 { btree_begin_transaction $::b1 btree_move_to $::c1 100 btree_key $::c1} {100}do_test btree-4.1.1 { lindex [btree_pager_stats $::b1] 1} {1}do_test btree-4.2 { btree_delete $::c1} {}do_test btree-4.3 { btree_move_to $::c1 100 btree_key $::c1} {200}do_test btree-4.4 { btree_next $::c1 btree_key $::c1} {300}do_test btree-4.5 { btree_next $::c1 btree_key $::c1} {400}do_test btree-4.4 { btree_move_to $::c1 0 set r {} while 1 { set key [btree_key $::c1] if {[btree_eof $::c1]} break lappend r $key lappend r [btree_data $::c1] btree_next $::c1 } set r } {200 2.00 300 3.00 400 4.00 500 5.00 600 6.00}# Commit and make sure the delete is still there.#do_test btree-4.5 { btree_commit $::b1 btree_move_to $::c1 0 set r {} while 1 { set key [btree_key $::c1] if {[btree_eof $::c1]} break lappend r $key lappend r [btree_data $::c1] btree_next $::c1 } set r } {200 2.00 300 3.00 400 4.00 500 5.00 600 6.00}# Completely close the database and reopen it. Then check# the data again.#do_test btree-4.6 { lindex [btree_pager_stats $::b1] 1} {1}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 2000 0] set ::c1 [btree_cursor $::b1 1 1] lindex [btree_pager_stats $::b1] 1} {1}do_test btree-4.9 { set r {} btree_first $::c1 while 1 { set key [btree_key $::c1] if {[btree_eof $::c1]} break lappend r $key lappend r [btree_data $::c1] btree_next $::c1 } set r } {200 2.00 300 3.00 400 4.00 500 5.00 600 6.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 0 1 2 3 4 5 6 7 8 9 } msg] lappend rc $msg} {1 SQLITE_ERROR}do_test btree-5.3 { btree_begin_transaction $::b1 set rc [catch { btree_update_meta $::b1 0 1 2 3 0 5 6 0 8 9 } msg] lappend rc $msg} {0 {}}do_test btree-5.4 { btree_get_meta $::b1} {0 1 2 3 0 5 6 0 8 9}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 0 10 20 30 0 50 60 0 80 90 btree_commit $::b1 btree_get_meta $::b1} {0 10 20 30 0 50 60 0 80 90}proc select_all {cursor} { set r {} btree_first $cursor while {![btree_eof $cursor]} { set key [btree_key $cursor] lappend r $key lappend r [btree_data $cursor] btree_next $cursor } return $r}proc select_keys {cursor} { set r {} btree_first $cursor while {![btree_eof $cursor]} { set key [btree_key $cursor] 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 0} msg] lappend rc $msg} {1 SQLITE_ERROR}do_test btree-6.2 { btree_begin_transaction $::b1 set ::t2 [btree_create_table $::b1 0]} {2}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_move_to $::c2 ten btree_key $::c2} {ten}do_test btree-6.3 { btree_commit $::b1 set ::c1 [btree_cursor $::b1 1 1] lindex [btree_pager_stats $::b1] 1} {2}do_test btree-6.3.1 { select_all $::c1} {200 2.00 300 3.00 400 4.00 500 5.00 600 6.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} {1}do_test btree-6.7 { btree_close_cursor $::c1 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 0]} {2}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} {2}# This test case used to test that requesting the key from an invalid cursor# returned an empty string. But that is now an assert()ed condition.## do_test btree-6.9.1 {# btree_move_to $::c2 {}# btree_key $::c2# } {}# If we drop table 1 it just clears the table. Table 1 always exists.#do_test btree-6.10 { btree_close_cursor $::c2 btree_drop_table $::b1 1 set ::c2 [btree_cursor $::b1 $::t2 1] set ::c1 [btree_cursor $::b1 1 1] btree_first $::c1 btree_eof $::c1} {1}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} {1}# Check to see that pages defragment properly. To do this test we will# # 1. Fill the first page of table 1 with data.# 2. Delete every other entry of table 1.# 3. Insert a single entry that requires more contiguous# space than is available.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -