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 lappend L wal 78 append S " 79 PRAGMA $name.journal_mode = WAL; 80 UPDATE $name.tbl SET x = '$name'; 81 " 82} 83do_execsql_test 1.5 $S $L 84 85do_test 1.6 { 86 set L [list] 87 foreach {name f} $files { 88 lappend L [execsql "SELECT x FROM $name.tbl"] $f 89 } 90 set L 91} $files 92 93do_test 1.7 { 94 execsql BEGIN; 95 foreach {name f} $files { 96 execsql "UPDATE $name.tbl SET x = '$f'" 97 } 98 execsql COMMIT; 99} {} 100 101do_test 1.8 { 102 set L [list] 103 foreach {name f} $files { 104 lappend L $name [execsql "SELECT x FROM $name.tbl"] 105 } 106 set L 107} $files 108 109db close 110foreach {name f} $files { forcedelete $f } 111 112finish_test 113