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 16 set testdir [file dirname $argv0] 17 source $testdir/tester.tcl 18 19 set testprefix attach4 20 21 ifcapable !attach { 22 finish_test 23 return 24 } 25 26 puts "Testing with SQLITE_MAX_ATTACHED=$SQLITE_MAX_ATTACHED" 27 28 set files {main test.db} 29 for {set ii 0} {$ii < $SQLITE_MAX_ATTACHED} {incr ii} { 30 lappend files aux$ii "test.db$ii" 31 } 32 33 do_test 1.1 { 34 sqlite3_limit db SQLITE_LIMIT_ATTACHED -1 35 } $SQLITE_MAX_ATTACHED 36 37 do_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 53 do_catchsql_test 1.2.2 { 54 ATTACH 'x.db' AS next; 55 } [list 1 "too many attached databases - max $SQLITE_MAX_ATTACHED"] 56 57 do_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 66 do_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 74 set L [list] 75 set S "" 76 foreach {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 } 87 do_execsql_test 1.5 $S $L 88 89 do_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 97 do_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 105 do_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 113 db close 114 foreach {name f} $files { forcedelete $f } 115 116 finish_test 117