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 set mode delete 79 } else { 80 set mode wal 81 } 82 ifcapable !wal { set mode delete } 83 lappend L $mode 84 append S " 85 PRAGMA $name.journal_mode = WAL; 86 UPDATE $name.tbl SET x = '$name'; 87 " 88} 89do_execsql_test 1.5 $S $L 90 91do_test 1.6 { 92 set L [list] 93 foreach {name f} $files { 94 lappend L [execsql "SELECT x FROM $name.tbl"] $f 95 } 96 set L 97} $files 98 99do_test 1.7 { 100 execsql BEGIN; 101 foreach {name f} $files { 102 execsql "UPDATE $name.tbl SET x = '$f'" 103 } 104 execsql COMMIT; 105} {} 106 107do_test 1.8 { 108 set L [list] 109 foreach {name f} $files { 110 lappend L $name [execsql "SELECT x FROM $name.tbl"] 111 } 112 set L 113} $files 114 115db close 116foreach {name f} $files { forcedelete $f } 117 118#------------------------------------------------------------------------- 119reset_db 120do_execsql_test 2.0 { 121 ATTACH DATABASE '' AS aux; 122 CREATE TABLE IF NOT EXISTS aux.t1(a, b); 123 CREATE TEMPORARY TRIGGER tr1 DELETE ON t1 BEGIN 124 DELETE FROM t1; 125 END; 126 CREATE TABLE temp.t1(a, b); 127} 128 129do_execsql_test 2.1 { 130 DETACH DATABASE aux; 131} 132 133do_execsql_test 2.2 { 134 DROP TRIGGER tr1; 135} 136 137finish_test 138 139