1# 200 July 1 2# 3# The author disclaims copyright to this source code. In place of 4# a legal notice, here is a blessing: 5# 6# May you do good and not evil. 7# May you find forgiveness for yourself and forgive others. 8# May you share freely, never taking more than you give. 9# 10#*********************************************************************** 11# This file implements regression tests for SQLite library. The 12# focus of this script is attaching many database files to a single 13# connection. 14# 15 16set testdir [file dirname $argv0] 17source $testdir/tester.tcl 18 19set testprefix attach4 20 21ifcapable !attach { 22 finish_test 23 return 24} 25 26puts "Testing with SQLITE_MAX_ATTACHED=$SQLITE_MAX_ATTACHED" 27 28set files {main test.db} 29for {set ii 0} {$ii < $SQLITE_MAX_ATTACHED} {incr ii} { 30 lappend files aux$ii "test.db$ii" 31} 32 33do_test 1.1 { 34 sqlite3_limit db SQLITE_LIMIT_ATTACHED -1 35} $SQLITE_MAX_ATTACHED 36 37do_test 1.2.1 { 38 db close 39 foreach {name f} $files { forcedelete $f } 40 sqlite3 db test.db 41 42 foreach {name f} $files { 43 if {$name == "main"} continue 44 execsql "ATTACH '$f' AS $name" 45 } 46 47 db eval {PRAGMA database_list} { 48 lappend L $name [file tail $file] 49 } 50 set L 51} $files 52 53do_catchsql_test 1.2.2 { 54 ATTACH 'x.db' AS next; 55} [list 1 "too many attached databases - max $SQLITE_MAX_ATTACHED"] 56 57do_test 1.3 { 58 execsql BEGIN; 59 foreach {name f} $files { 60 execsql "CREATE TABLE $name.tbl(x)" 61 execsql "INSERT INTO $name.tbl VALUES('$f')" 62 } 63 execsql COMMIT; 64} {} 65 66do_test 1.4 { 67 set L [list] 68 foreach {name f} $files { 69 lappend L $name [execsql "SELECT x FROM $name.tbl"] 70 } 71 set L 72} $files 73 74set L [list] 75set S "" 76foreach {name f} $files { 77 if {[permutation] == "journaltest"} { 78 lappend L delete 79 } else { 80 lappend L wal 81 } 82 append S " 83 PRAGMA $name.journal_mode = WAL; 84 UPDATE $name.tbl SET x = '$name'; 85 " 86} 87do_execsql_test 1.5 $S $L 88 89do_test 1.6 { 90 set L [list] 91 foreach {name f} $files { 92 lappend L [execsql "SELECT x FROM $name.tbl"] $f 93 } 94 set L 95} $files 96 97do_test 1.7 { 98 execsql BEGIN; 99 foreach {name f} $files { 100 execsql "UPDATE $name.tbl SET x = '$f'" 101 } 102 execsql COMMIT; 103} {} 104 105do_test 1.8 { 106 set L [list] 107 foreach {name f} $files { 108 lappend L $name [execsql "SELECT x FROM $name.tbl"] 109 } 110 set L 111} $files 112 113db close 114foreach {name f} $files { forcedelete $f } 115 116finish_test 117