2N/A#pragma ident "%Z%%M% %I% %E% SMI"
2N/A# The author disclaims copyright to this source code. In place of
2N/A# a legal notice, here is a blessing:
2N/A# May you do good and not evil.
2N/A# May you find forgiveness for yourself and forgive others.
2N/A# May you share freely, never taking more than you give.
2N/A#***********************************************************************
2N/A# This file implements regression tests for SQLite library. The
2N/A# focus of this script is testing the ATTACH and DETACH commands
2N/A# and related functionality.
2N/Aset testdir [file dirname $argv0]
2N/Afor {set i 2} {$i<=15} {incr i} {
2N/A CREATE TABLE t1(a,b);
2N/A INSERT INTO t1 VALUES(1,2);
2N/A INSERT INTO t1 VALUES(3,4);
2N/A CREATE TABLE t2(x,y);
2N/A INSERT INTO t2 VALUES(1,'x');
2N/A INSERT INTO t2 VALUES(2,'y');
2N/A DETACH DATABASE two;
2N/A} {1 {no such table: t2}}
2N/A} {1 {cannot attach empty database: three}}
2N/Ado_test attach-1.10 {
2N/A DETACH DATABASE three;
2N/A} {1 {no such database: three}}
2N/Ado_test attach-1.11 {
2N/A foreach {idx name file} [execsql {PRAGMA database_list} $db] {
2N/A lappend list $idx $name
2N/Ado_test attach-1.11b {
2N/A} {0 main 1 temp 2 db2 3 db3 4 db4 5 db5 6 db6 7 db7 8 db8 9 db9}
2N/Ado_test attach-1.12 {
2N/A} {1 {database db2 is already in use}}
2N/Ado_test attach-1.13 {
2N/A} {1 {database db5 is already in use}}
2N/Ado_test attach-1.14 {
2N/A} {1 {database db9 is already in use}}
2N/Ado_test attach-1.15 {
2N/A} {1 {database main is already in use}}
2N/Ado_test attach-1.16 {
2N/A} {1 {database temp is already in use}}
2N/Ado_test attach-1.17 {
2N/A} {1 {database MAIN is already in use}}
2N/Ado_test attach-1.18 {
2N/Ado_test attach-1.19 {
2N/A} {1 {too many attached databases - max 10}}
2N/Ado_test attach-1.20.1 {
2N/A} {0 main 1 temp 2 db2 3 db3 4 db4 5 db11 6 db6 7 db7 8 db8 9 db9 10 db10}
2N/Aintegrity_check attach-1.20.2
2N/Ado_test attach-1.21 {
2N/Ado_test attach-1.22 {
2N/A} {1 {too many attached databases - max 10}}
2N/Ado_test attach-1.23 {
2N/A} {1 {no such database: db14}}
2N/Ado_test attach-1.24 {
2N/Ado_test attach-1.25 {
2N/A} {1 {no such database: db12}}
2N/Ado_test attach-1.26 {
2N/A} {1 {cannot detach database main}}
2N/Ado_test attach-1.27 {
2N/A} {1 {cannot detach database Temp}}
2N/Ado_test attach-1.28 {
2N/Ado_test attach-1.29 {
2N/A CREATE TABLE tx(x1,x2,y1,y2);
2N/A CREATE TRIGGER r1 AFTER UPDATE ON t2 FOR EACH ROW BEGIN
2N/A UPDATE t2 SET x=x+10;
2N/A} {1 11 x x 2 12 y y}
2N/A CREATE TABLE tx(x1,x2,y1,y2);
2N/A} {1 11 x x 2 12 y y 11 21 x x 12 22 y y}
2N/A} {table t2 t2 table tx tx trigger r1 t2}
2N/A} {0 main 1 temp 2 db2}
2N/A CREATE INDEX i2 ON t2(x);
2N/A SELECT * FROM t2 WHERE x>5;
2N/Ado_test attach-2.10 {
2N/A SELECT type, name, tbl_name FROM sqlite_master;
2N/A} {table t2 t2 table tx tx trigger r1 t2 index i2 t2}
2N/A#do_test attach-2.11 {
2N/A# SELECT * FROM t2 WHERE x>5;
2N/A#} {1 {database schema has changed}}
2N/Ado_test attach-2.12 {
2N/A} {0 main 1 temp 2 db2}
2N/Ado_test attach-2.13 {
2N/A SELECT * FROM t2 WHERE x>5;
2N/Ado_test attach-2.14 {
2N/A SELECT type, name, tbl_name FROM sqlite_master;
2N/A} {table t1 t1 table tx tx}
2N/Ado_test attach-2.15 {
2N/A} {table t2 t2 table tx tx trigger r1 t2 index i2 t2}
2N/Ado_test attach-2.16 {
2N/A} {table t2 t2 table tx tx trigger r1 t2 index i2 t2}
2N/A} {1 {no such table: t2}}
2N/A# Even though main has a transaction,
test2.db should not be locked.
2N/A execsql {SELECT * FROM t2}
2N/A UPDATE t2 SET x=x+1 WHERE x=50;
2N/A} {1 {database is locked}}
2N/A execsql {SELECT * FROM t2} db2
2N/A catchsql {SELECT * FROM t2}
2N/A} {1 {database is locked}}
2N/A catchsql {SELECT * FROM t2} db2
2N/Ado_test attach-3.10 {
2N/A execsql {SELECT * FROM t1}
2N/Ado_test attach-3.11 {
2N/A catchsql {UPDATE t1 SET a=a+1}
2N/Ado_test attach-3.12 {
2N/A execsql {SELECT * FROM t1}
2N/Ado_test attach-3.13 {
2N/A catchsql {UPDATE t2 SET x=x+1 WHERE x=50}
2N/A} {1 {database is locked}}
2N/Ado_test attach-3.14 {
2N/A # Unable to reinitialize the schema tables because the aux database
2N/A catchsql {SELECT * FROM t1}
2N/A} {1 {database is locked}}
2N/Ado_test attach-3.15 {
2N/A execsql {SELECT * FROM t1}
2N/A execsql {DETACH db2}
2N/A CREATE TABLE t3(x,y);
2N/A CREATE UNIQUE INDEX t3i1 ON t3(x);
2N/A INSERT INTO t3 VALUES(1,2);
2N/A CREATE TABLE t3(a,b);
2N/A CREATE UNIQUE INDEX t3i1b ON t3(a);
2N/A INSERT INTO t3 VALUES(9,10);
2N/A CREATE TRIGGER t3r3 AFTER INSERT ON t3 BEGIN
2N/A INSERT INTO t3 VALUES(6,7);
2N/A CREATE TRIGGER t3r3 AFTER INSERT ON t3 BEGIN
2N/A INSERT INTO t4 VALUES('main.' ||
NEW.a);
2N/A} {db2.6 db2.13 main.11}
2N/A} {db2.6 db2.13 main.11 main.15}
2N/Ado_test attach-4.10 {
2N/A DETACH DATABASE db2;
2N/A CREATE VIEW v3 AS SELECT x*100+y FROM t3;
2N/Ado_test attach-4.11 {
2N/A CREATE VIEW v3 AS SELECT a*100+b FROM t3;
2N/Ado_test attach-4.12 {
2N/Ado_test attach-4.13 {
2N/A} {1 {triggers may not be added to auxiliary database orig}}
2N/A CREATE TABLE t5(x,y);
2N/A CREATE TRIGGER r5 AFTER INSERT ON t5 BEGIN
2N/A CREATE TRIGGER r5 AFTER INSERT ON t5 BEGIN
2N/A} {1 {trigger r5 cannot reference objects in database orig}}
2N/A CREATE TEMP TABLE t6(p,q,r);
2N/A CREATE TRIGGER r5 AFTER INSERT ON t5 BEGIN
2N/A} {1 {trigger r5 cannot reference objects in database temp}}
2N/A CREATE TRIGGER r5 AFTER INSERT ON t5 BEGIN
2N/A} {1 {trigger r5 cannot reference objects in database temp}}
2N/A CREATE TRIGGER r5 AFTER INSERT ON t5 BEGIN
2N/A SELECT 'no-op' FROM t1 WHERE x<(SELECT min(x) FROM
temp.t6);
2N/A} {1 {trigger r5 cannot reference objects in database temp}}
2N/A CREATE TRIGGER r5 AFTER INSERT ON t5 BEGIN
2N/A SELECT 'no-op' FROM t1 GROUP BY 1 HAVING x<(SELECT min(x) FROM
temp.t6);
2N/A} {1 {trigger r5 cannot reference objects in database temp}}
2N/A CREATE TRIGGER r5 AFTER INSERT ON t5 BEGIN
2N/A SELECT max(1,x,(SELECT min(x) FROM
temp.t6)) FROM t1;
2N/A} {1 {trigger r5 cannot reference objects in database temp}}
2N/A CREATE TRIGGER r5 AFTER INSERT ON t5 BEGIN
2N/A INSERT INTO t1 VALUES((SELECT min(x) FROM
temp.t6),5);
2N/A} {1 {trigger r5 cannot reference objects in database temp}}
2N/A CREATE TRIGGER r5 AFTER INSERT ON t5 BEGIN
2N/A DELETE FROM t1 WHERE x<(SELECT min(x) FROM
temp.t6);
2N/A} {1 {trigger r5 cannot reference objects in database temp}}
2N/A# Check to make sure we get a sensible error if unable to open
2N/A# the file that we are trying to attach.
2N/A ATTACH DATABASE 'no-such-file' AS nosuch;
2N/A} {1 {cannot attach empty database: nosuch}}
2N/Afile delete -force no-such-file
2N/Aif {$tcl_platform(platform)=="unix"} {
2N/A do_test attach-6.2 {
2N/A sqlite dbx cannot-read
2N/A dbx eval {CREATE TABLE t1(a,b,c)}
2N/A file attributes cannot-read -permission 0000
2N/A ATTACH DATABASE 'cannot-read' AS noread;
2N/A } {1 {unable to open database: cannot-read}}
2N/A file delete -force cannot-read
2N/Afor {set i 2} {$i<=15} {incr i} {