| # 2003 July 1 |
| # |
| # 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 testing the ATTACH and DETACH commands |
| # and related functionality. |
| # |
| # $Id: attach2.test,v 1.5 2004/02/12 15:31:22 drh Exp $ |
| # |
| |
| |
| set testdir [file dirname $argv0] |
| source $testdir/tester.tcl |
| |
| # Ticket #354 |
| # |
| do_test attach2-1.1 { |
| db eval { |
| CREATE TABLE t1(a,b); |
| CREATE INDEX x1 ON t1(a); |
| } |
| file delete -force test2.db |
| file delete -force test2.db-journal |
| sqlite db2 test2.db |
| db2 eval { |
| CREATE TABLE t1(a,b); |
| CREATE INDEX x1 ON t1(a); |
| } |
| catchsql { |
| ATTACH 'test2.db' AS t2; |
| } |
| } {0 {}} |
| |
| # Ticket #514 |
| # |
| proc db_list {db} { |
| set list {} |
| foreach {idx name file} [execsql {PRAGMA database_list} $db] { |
| lappend list $idx $name |
| } |
| return $list |
| } |
| db eval {DETACH t2} |
| do_test attach2-2.1 { |
| # lock test2.db then try to attach it. Should get an error. |
| db2 eval {BEGIN} |
| catchsql { |
| ATTACH 'test2.db' AS t2; |
| } |
| } {1 {database is locked}} |
| do_test attach2-2.2 { |
| # make sure test2.db did not get attached. |
| db_list db |
| } {0 main 1 temp} |
| do_test attach2-2.3 { |
| # unlock test2.db and try to attach again. should work this time. |
| db2 eval {COMMIT} |
| catchsql { |
| ATTACH 'test2.db' AS t2; |
| } |
| } {0 {}} |
| do_test attach2-2.4 { |
| db_list db |
| } {0 main 1 temp 2 t2} |
| do_test attach2-2.5 { |
| catchsql { |
| SELECT name FROM t2.sqlite_master; |
| } |
| } {0 {t1 x1}} |
| do_test attach2-2.6 { |
| # lock test2.db and try to read from it. should get an error. |
| db2 eval BEGIN |
| catchsql { |
| SELECT name FROM t2.sqlite_master; |
| } |
| } {1 {database is locked}} |
| do_test attach2-2.7 { |
| # but we can still read from test1.db even though test2.db is locked. |
| catchsql { |
| SELECT name FROM main.sqlite_master; |
| } |
| } {0 {t1 x1}} |
| do_test attach2-2.8 { |
| # start a transaction on test.db even though test2.db is locked. |
| catchsql { |
| BEGIN; |
| INSERT INTO t1 VALUES(8,9); |
| } |
| } {0 {}} |
| do_test attach2-2.9 { |
| execsql { |
| SELECT * FROM t1 |
| } |
| } {8 9} |
| do_test attach2-2.10 { |
| # now try to write to test2.db. the write should fail |
| catchsql { |
| INSERT INTO t2.t1 VALUES(1,2); |
| } |
| } {1 {database is locked}} |
| do_test attach2-2.11 { |
| # when the write failed in the previous test, the transaction should |
| # have rolled back. |
| db2 eval ROLLBACK |
| execsql { |
| SELECT * FROM t1 |
| } |
| } {} |
| do_test attach2-2.12 { |
| catchsql { |
| COMMIT |
| } |
| } {1 {cannot commit - no transaction is active}} |
| |
| # Ticket #574: Make sure it works usingi the non-callback API |
| # |
| do_test attach2-3.1 { |
| db close |
| set DB [sqlite db test.db] |
| set rc [catch {sqlite_compile $DB "ATTACH 'test2.db' AS t2" TAIL} VM] |
| if {$rc} {lappend rc $VM} |
| sqlite_finalize $VM |
| set rc |
| } {0} |
| do_test attach2-3.2 { |
| set rc [catch {sqlite_compile $DB "DETACH t2" TAIL} VM] |
| if {$rc} {lappend rc $VM} |
| sqlite_finalize $VM |
| set rc |
| } {0} |
| |
| db close |
| for {set i 2} {$i<=15} {incr i} { |
| catch {db$i close} |
| } |
| file delete -force test2.db |
| |
| |
| finish_test |