1*1da57d55SToomas Soome# 2c5c4113dSnw141292# 2003 April 4 3c5c4113dSnw141292# 4c5c4113dSnw141292# The author disclaims copyright to this source code. In place of 5c5c4113dSnw141292# a legal notice, here is a blessing: 6c5c4113dSnw141292# 7c5c4113dSnw141292# May you do good and not evil. 8c5c4113dSnw141292# May you find forgiveness for yourself and forgive others. 9c5c4113dSnw141292# May you share freely, never taking more than you give. 10c5c4113dSnw141292# 11c5c4113dSnw141292#*********************************************************************** 12c5c4113dSnw141292# This file implements regression tests for SQLite library. The 13c5c4113dSnw141292# focus of this script is testing the ATTACH and DETACH commands 14c5c4113dSnw141292# and related functionality. 15c5c4113dSnw141292# 16c5c4113dSnw141292# $Id: attach.test,v 1.13 2004/02/14 01:39:50 drh Exp $ 17c5c4113dSnw141292# 18c5c4113dSnw141292 19c5c4113dSnw141292set testdir [file dirname $argv0] 20c5c4113dSnw141292source $testdir/tester.tcl 21c5c4113dSnw141292 22c5c4113dSnw141292for {set i 2} {$i<=15} {incr i} { 23c5c4113dSnw141292 file delete -force test$i.db 24c5c4113dSnw141292 file delete -force test$i.db-journal 25c5c4113dSnw141292} 26c5c4113dSnw141292 27c5c4113dSnw141292do_test attach-1.1 { 28c5c4113dSnw141292 execsql { 29c5c4113dSnw141292 CREATE TABLE t1(a,b); 30c5c4113dSnw141292 INSERT INTO t1 VALUES(1,2); 31c5c4113dSnw141292 INSERT INTO t1 VALUES(3,4); 32c5c4113dSnw141292 SELECT * FROM t1; 33c5c4113dSnw141292 } 34c5c4113dSnw141292} {1 2 3 4} 35c5c4113dSnw141292do_test attach-1.2 { 36c5c4113dSnw141292 sqlite db2 test2.db 37c5c4113dSnw141292 execsql { 38c5c4113dSnw141292 CREATE TABLE t2(x,y); 39c5c4113dSnw141292 INSERT INTO t2 VALUES(1,'x'); 40c5c4113dSnw141292 INSERT INTO t2 VALUES(2,'y'); 41c5c4113dSnw141292 SELECT * FROM t2; 42c5c4113dSnw141292 } db2 43c5c4113dSnw141292} {1 x 2 y} 44c5c4113dSnw141292do_test attach-1.3 { 45c5c4113dSnw141292 execsql { 46c5c4113dSnw141292 ATTACH DATABASE 'test2.db' AS two; 47c5c4113dSnw141292 SELECT * FROM two.t2; 48c5c4113dSnw141292 } 49c5c4113dSnw141292} {1 x 2 y} 50c5c4113dSnw141292do_test attach-1.4 { 51c5c4113dSnw141292 execsql { 52c5c4113dSnw141292 SELECT * FROM t2; 53c5c4113dSnw141292 } 54c5c4113dSnw141292} {1 x 2 y} 55c5c4113dSnw141292do_test attach-1.5 { 56c5c4113dSnw141292 execsql { 57c5c4113dSnw141292 DETACH DATABASE two; 58c5c4113dSnw141292 SELECT * FROM t1; 59c5c4113dSnw141292 } 60c5c4113dSnw141292} {1 2 3 4} 61c5c4113dSnw141292do_test attach-1.6 { 62c5c4113dSnw141292 catchsql { 63c5c4113dSnw141292 SELECT * FROM t2; 64c5c4113dSnw141292 } 65c5c4113dSnw141292} {1 {no such table: t2}} 66c5c4113dSnw141292do_test attach-1.7 { 67c5c4113dSnw141292 catchsql { 68c5c4113dSnw141292 SELECT * FROM two.t2; 69c5c4113dSnw141292 } 70c5c4113dSnw141292} {1 {no such table: two.t2}} 71c5c4113dSnw141292do_test attach-1.8 { 72c5c4113dSnw141292 catchsql { 73c5c4113dSnw141292 ATTACH DATABASE 'test3.db' AS three; 74c5c4113dSnw141292 } 75c5c4113dSnw141292} {1 {cannot attach empty database: three}} 76c5c4113dSnw141292do_test attach-1.9 { 77c5c4113dSnw141292 catchsql { 78c5c4113dSnw141292 SELECT * FROM three.sqlite_master; 79c5c4113dSnw141292 } 80c5c4113dSnw141292} {1 {no such table: three.sqlite_master}} 81c5c4113dSnw141292do_test attach-1.10 { 82c5c4113dSnw141292 catchsql { 83c5c4113dSnw141292 DETACH DATABASE three; 84c5c4113dSnw141292 } 85c5c4113dSnw141292} {1 {no such database: three}} 86c5c4113dSnw141292do_test attach-1.11 { 87c5c4113dSnw141292 execsql { 88c5c4113dSnw141292 ATTACH 'test.db' AS db2; 89c5c4113dSnw141292 ATTACH 'test.db' AS db3; 90c5c4113dSnw141292 ATTACH 'test.db' AS db4; 91c5c4113dSnw141292 ATTACH 'test.db' AS db5; 92c5c4113dSnw141292 ATTACH 'test.db' AS db6; 93c5c4113dSnw141292 ATTACH 'test.db' AS db7; 94c5c4113dSnw141292 ATTACH 'test.db' AS db8; 95c5c4113dSnw141292 ATTACH 'test.db' AS db9; 96c5c4113dSnw141292 } 97c5c4113dSnw141292} {} 98c5c4113dSnw141292proc db_list {db} { 99c5c4113dSnw141292 set list {} 100c5c4113dSnw141292 foreach {idx name file} [execsql {PRAGMA database_list} $db] { 101c5c4113dSnw141292 lappend list $idx $name 102c5c4113dSnw141292 } 103c5c4113dSnw141292 return $list 104c5c4113dSnw141292} 105c5c4113dSnw141292do_test attach-1.11b { 106c5c4113dSnw141292 db_list db 107c5c4113dSnw141292} {0 main 1 temp 2 db2 3 db3 4 db4 5 db5 6 db6 7 db7 8 db8 9 db9} 108c5c4113dSnw141292do_test attach-1.12 { 109c5c4113dSnw141292 catchsql { 110c5c4113dSnw141292 ATTACH 'test.db' as db2; 111c5c4113dSnw141292 } 112c5c4113dSnw141292} {1 {database db2 is already in use}} 113c5c4113dSnw141292do_test attach-1.13 { 114c5c4113dSnw141292 catchsql { 115c5c4113dSnw141292 ATTACH 'test.db' as db5; 116c5c4113dSnw141292 } 117c5c4113dSnw141292} {1 {database db5 is already in use}} 118c5c4113dSnw141292do_test attach-1.14 { 119c5c4113dSnw141292 catchsql { 120c5c4113dSnw141292 ATTACH 'test.db' as db9; 121c5c4113dSnw141292 } 122c5c4113dSnw141292} {1 {database db9 is already in use}} 123c5c4113dSnw141292do_test attach-1.15 { 124c5c4113dSnw141292 catchsql { 125c5c4113dSnw141292 ATTACH 'test.db' as main; 126c5c4113dSnw141292 } 127c5c4113dSnw141292} {1 {database main is already in use}} 128c5c4113dSnw141292do_test attach-1.16 { 129c5c4113dSnw141292 catchsql { 130c5c4113dSnw141292 ATTACH 'test.db' as temp; 131c5c4113dSnw141292 } 132c5c4113dSnw141292} {1 {database temp is already in use}} 133c5c4113dSnw141292do_test attach-1.17 { 134c5c4113dSnw141292 catchsql { 135c5c4113dSnw141292 ATTACH 'test.db' as MAIN; 136c5c4113dSnw141292 } 137c5c4113dSnw141292} {1 {database MAIN is already in use}} 138c5c4113dSnw141292do_test attach-1.18 { 139c5c4113dSnw141292 catchsql { 140c5c4113dSnw141292 ATTACH 'test.db' as db10; 141c5c4113dSnw141292 ATTACH 'test.db' as db11; 142c5c4113dSnw141292 } 143c5c4113dSnw141292} {0 {}} 144c5c4113dSnw141292do_test attach-1.19 { 145c5c4113dSnw141292 catchsql { 146c5c4113dSnw141292 ATTACH 'test.db' as db12; 147c5c4113dSnw141292 } 148c5c4113dSnw141292} {1 {too many attached databases - max 10}} 149c5c4113dSnw141292do_test attach-1.20.1 { 150c5c4113dSnw141292 execsql { 151c5c4113dSnw141292 DETACH db5; 152c5c4113dSnw141292 } 153c5c4113dSnw141292 db_list db 154c5c4113dSnw141292} {0 main 1 temp 2 db2 3 db3 4 db4 5 db11 6 db6 7 db7 8 db8 9 db9 10 db10} 155c5c4113dSnw141292integrity_check attach-1.20.2 156c5c4113dSnw141292do_test attach-1.21 { 157c5c4113dSnw141292 catchsql { 158c5c4113dSnw141292 ATTACH 'test.db' as db12; 159c5c4113dSnw141292 } 160c5c4113dSnw141292} {0 {}} 161c5c4113dSnw141292do_test attach-1.22 { 162c5c4113dSnw141292 catchsql { 163c5c4113dSnw141292 ATTACH 'test.db' as db13; 164c5c4113dSnw141292 } 165c5c4113dSnw141292} {1 {too many attached databases - max 10}} 166c5c4113dSnw141292do_test attach-1.23 { 167c5c4113dSnw141292 catchsql { 168c5c4113dSnw141292 DETACH db14; 169c5c4113dSnw141292 } 170c5c4113dSnw141292} {1 {no such database: db14}} 171c5c4113dSnw141292do_test attach-1.24 { 172c5c4113dSnw141292 catchsql { 173c5c4113dSnw141292 DETACH db12; 174c5c4113dSnw141292 } 175c5c4113dSnw141292} {0 {}} 176c5c4113dSnw141292do_test attach-1.25 { 177c5c4113dSnw141292 catchsql { 178c5c4113dSnw141292 DETACH db12; 179c5c4113dSnw141292 } 180c5c4113dSnw141292} {1 {no such database: db12}} 181c5c4113dSnw141292do_test attach-1.26 { 182c5c4113dSnw141292 catchsql { 183c5c4113dSnw141292 DETACH main; 184c5c4113dSnw141292 } 185c5c4113dSnw141292} {1 {cannot detach database main}} 186c5c4113dSnw141292do_test attach-1.27 { 187c5c4113dSnw141292 catchsql { 188c5c4113dSnw141292 DETACH Temp; 189c5c4113dSnw141292 } 190c5c4113dSnw141292} {1 {cannot detach database Temp}} 191c5c4113dSnw141292do_test attach-1.28 { 192c5c4113dSnw141292 catchsql { 193c5c4113dSnw141292 DETACH db11; 194c5c4113dSnw141292 DETACH db10; 195c5c4113dSnw141292 DETACH db9; 196c5c4113dSnw141292 DETACH db8; 197c5c4113dSnw141292 DETACH db7; 198c5c4113dSnw141292 DETACH db6; 199c5c4113dSnw141292 DETACH db4; 200c5c4113dSnw141292 DETACH db3; 201c5c4113dSnw141292 DETACH db2; 202c5c4113dSnw141292 } 203c5c4113dSnw141292} {0 {}} 204c5c4113dSnw141292do_test attach-1.29 { 205c5c4113dSnw141292 db_list db 206c5c4113dSnw141292} {0 main 1 temp} 207c5c4113dSnw141292 208c5c4113dSnw141292do_test attach-2.1 { 209c5c4113dSnw141292 execsql { 210c5c4113dSnw141292 CREATE TABLE tx(x1,x2,y1,y2); 211c5c4113dSnw141292 CREATE TRIGGER r1 AFTER UPDATE ON t2 FOR EACH ROW BEGIN 212c5c4113dSnw141292 INSERT INTO tx(x1,x2,y1,y2) VALUES(OLD.x,NEW.x,OLD.y,NEW.y); 213c5c4113dSnw141292 END; 214c5c4113dSnw141292 SELECT * FROM tx; 215c5c4113dSnw141292 } db2; 216c5c4113dSnw141292} {} 217c5c4113dSnw141292do_test attach-2.2 { 218c5c4113dSnw141292 execsql { 219c5c4113dSnw141292 UPDATE t2 SET x=x+10; 220c5c4113dSnw141292 SELECT * FROM tx; 221c5c4113dSnw141292 } db2; 222c5c4113dSnw141292} {1 11 x x 2 12 y y} 223c5c4113dSnw141292do_test attach-2.3 { 224c5c4113dSnw141292 execsql { 225c5c4113dSnw141292 CREATE TABLE tx(x1,x2,y1,y2); 226c5c4113dSnw141292 SELECT * FROM tx; 227c5c4113dSnw141292 } 228c5c4113dSnw141292} {} 229c5c4113dSnw141292do_test attach-2.4 { 230c5c4113dSnw141292 execsql { 231c5c4113dSnw141292 ATTACH 'test2.db' AS db2; 232c5c4113dSnw141292 } 233c5c4113dSnw141292} {} 234c5c4113dSnw141292do_test attach-2.5 { 235c5c4113dSnw141292 execsql { 236c5c4113dSnw141292 UPDATE db2.t2 SET x=x+10; 237c5c4113dSnw141292 SELECT * FROM db2.tx; 238c5c4113dSnw141292 } 239c5c4113dSnw141292} {1 11 x x 2 12 y y 11 21 x x 12 22 y y} 240c5c4113dSnw141292do_test attach-2.6 { 241c5c4113dSnw141292 execsql { 242c5c4113dSnw141292 SELECT * FROM main.tx; 243c5c4113dSnw141292 } 244c5c4113dSnw141292} {} 245c5c4113dSnw141292do_test attach-2.7 { 246c5c4113dSnw141292 execsql { 247c5c4113dSnw141292 SELECT type, name, tbl_name FROM db2.sqlite_master; 248c5c4113dSnw141292 } 249c5c4113dSnw141292} {table t2 t2 table tx tx trigger r1 t2} 250c5c4113dSnw141292do_test attach-2.8 { 251c5c4113dSnw141292 db_list db 252c5c4113dSnw141292} {0 main 1 temp 2 db2} 253c5c4113dSnw141292do_test attach-2.9 { 254c5c4113dSnw141292 execsql { 255c5c4113dSnw141292 CREATE INDEX i2 ON t2(x); 256c5c4113dSnw141292 SELECT * FROM t2 WHERE x>5; 257c5c4113dSnw141292 } db2 258c5c4113dSnw141292} {21 x 22 y} 259c5c4113dSnw141292do_test attach-2.10 { 260c5c4113dSnw141292 execsql { 261c5c4113dSnw141292 SELECT type, name, tbl_name FROM sqlite_master; 262c5c4113dSnw141292 } db2 263c5c4113dSnw141292} {table t2 t2 table tx tx trigger r1 t2 index i2 t2} 264c5c4113dSnw141292#do_test attach-2.11 { 265c5c4113dSnw141292# catchsql { 266c5c4113dSnw141292# SELECT * FROM t2 WHERE x>5; 267c5c4113dSnw141292# } 268c5c4113dSnw141292#} {1 {database schema has changed}} 269c5c4113dSnw141292do_test attach-2.12 { 270c5c4113dSnw141292 db_list db 271c5c4113dSnw141292} {0 main 1 temp 2 db2} 272c5c4113dSnw141292do_test attach-2.13 { 273c5c4113dSnw141292 catchsql { 274c5c4113dSnw141292 SELECT * FROM t2 WHERE x>5; 275c5c4113dSnw141292 } 276c5c4113dSnw141292} {0 {21 x 22 y}} 277c5c4113dSnw141292do_test attach-2.14 { 278c5c4113dSnw141292 execsql { 279c5c4113dSnw141292 SELECT type, name, tbl_name FROM sqlite_master; 280c5c4113dSnw141292 } 281c5c4113dSnw141292} {table t1 t1 table tx tx} 282c5c4113dSnw141292do_test attach-2.15 { 283c5c4113dSnw141292 execsql { 284c5c4113dSnw141292 SELECT type, name, tbl_name FROM db2.sqlite_master; 285c5c4113dSnw141292 } 286c5c4113dSnw141292} {table t2 t2 table tx tx trigger r1 t2 index i2 t2} 287c5c4113dSnw141292do_test attach-2.16 { 288c5c4113dSnw141292 db close 289c5c4113dSnw141292 sqlite db test.db 290c5c4113dSnw141292 execsql { 291c5c4113dSnw141292 ATTACH 'test2.db' AS db2; 292c5c4113dSnw141292 SELECT type, name, tbl_name FROM db2.sqlite_master; 293c5c4113dSnw141292 } 294c5c4113dSnw141292} {table t2 t2 table tx tx trigger r1 t2 index i2 t2} 295c5c4113dSnw141292 296c5c4113dSnw141292do_test attach-3.1 { 297c5c4113dSnw141292 db close 298c5c4113dSnw141292 db2 close 299c5c4113dSnw141292 sqlite db test.db 300c5c4113dSnw141292 sqlite db2 test2.db 301c5c4113dSnw141292 execsql { 302c5c4113dSnw141292 SELECT * FROM t1 303c5c4113dSnw141292 } 304c5c4113dSnw141292} {1 2 3 4} 305c5c4113dSnw141292do_test attach-3.2 { 306c5c4113dSnw141292 catchsql { 307c5c4113dSnw141292 SELECT * FROM t2 308c5c4113dSnw141292 } 309c5c4113dSnw141292} {1 {no such table: t2}} 310c5c4113dSnw141292do_test attach-3.3 { 311c5c4113dSnw141292 catchsql { 312c5c4113dSnw141292 ATTACH DATABASE 'test2.db' AS db2; 313c5c4113dSnw141292 SELECT * FROM t2 314c5c4113dSnw141292 } 315c5c4113dSnw141292} {0 {21 x 22 y}} 316c5c4113dSnw141292 317c5c4113dSnw141292# Even though main has a transaction, test2.db should not be locked. 318c5c4113dSnw141292do_test attach-3.4 { 319c5c4113dSnw141292 execsql BEGIN 320c5c4113dSnw141292 catchsql { 321c5c4113dSnw141292 SELECT * FROM t2; 322c5c4113dSnw141292 } db2; 323c5c4113dSnw141292} {0 {21 x 22 y}} 324c5c4113dSnw141292 325c5c4113dSnw141292# Reading from db2 should not lock test2.db 326c5c4113dSnw141292do_test attach-3.5 { 327c5c4113dSnw141292 execsql {SELECT * FROM t2} 328c5c4113dSnw141292 catchsql { 329c5c4113dSnw141292 SELECT * FROM t2; 330c5c4113dSnw141292 } db2; 331c5c4113dSnw141292} {0 {21 x 22 y}} 332c5c4113dSnw141292 333c5c4113dSnw141292# Making a change to db2 causes test2.ddb to become locked. 334c5c4113dSnw141292do_test attach-3.6 { 335c5c4113dSnw141292 execsql { 336c5c4113dSnw141292 UPDATE t2 SET x=x+1 WHERE x=50; 337c5c4113dSnw141292 } 338c5c4113dSnw141292 catchsql { 339c5c4113dSnw141292 SELECT * FROM t2; 340c5c4113dSnw141292 } db2; 341c5c4113dSnw141292} {1 {database is locked}} 342c5c4113dSnw141292 343c5c4113dSnw141292do_test attach-3.7 { 344c5c4113dSnw141292 execsql ROLLBACK 345c5c4113dSnw141292 execsql {SELECT * FROM t2} db2 346c5c4113dSnw141292} {21 x 22 y} 347c5c4113dSnw141292do_test attach-3.8 { 348c5c4113dSnw141292 execsql BEGIN 349c5c4113dSnw141292 execsql BEGIN db2 350c5c4113dSnw141292 catchsql {SELECT * FROM t2} 351c5c4113dSnw141292} {1 {database is locked}} 352c5c4113dSnw141292do_test attach-3.9 { 353c5c4113dSnw141292 catchsql {SELECT * FROM t2} db2 354c5c4113dSnw141292} {0 {21 x 22 y}} 355c5c4113dSnw141292do_test attach-3.10 { 356c5c4113dSnw141292 execsql {SELECT * FROM t1} 357c5c4113dSnw141292} {1 2 3 4} 358c5c4113dSnw141292do_test attach-3.11 { 359c5c4113dSnw141292 catchsql {UPDATE t1 SET a=a+1} 360c5c4113dSnw141292} {0 {}} 361c5c4113dSnw141292do_test attach-3.12 { 362c5c4113dSnw141292 execsql {SELECT * FROM t1} 363c5c4113dSnw141292} {2 2 4 4} 364c5c4113dSnw141292do_test attach-3.13 { 365c5c4113dSnw141292 catchsql {UPDATE t2 SET x=x+1 WHERE x=50} 366c5c4113dSnw141292} {1 {database is locked}} 367c5c4113dSnw141292do_test attach-3.14 { 368c5c4113dSnw141292 # Unable to reinitialize the schema tables because the aux database 369c5c4113dSnw141292 # is still locked. 370c5c4113dSnw141292 catchsql {SELECT * FROM t1} 371c5c4113dSnw141292} {1 {database is locked}} 372c5c4113dSnw141292do_test attach-3.15 { 373c5c4113dSnw141292 execsql COMMIT db2 374c5c4113dSnw141292 execsql {SELECT * FROM t1} 375c5c4113dSnw141292} {1 2 3 4} 376c5c4113dSnw141292 377c5c4113dSnw141292# Ticket #323 378c5c4113dSnw141292do_test attach-4.1 { 379c5c4113dSnw141292 execsql {DETACH db2} 380c5c4113dSnw141292 db2 close 381c5c4113dSnw141292 sqlite db2 test2.db 382c5c4113dSnw141292 execsql { 383c5c4113dSnw141292 CREATE TABLE t3(x,y); 384c5c4113dSnw141292 CREATE UNIQUE INDEX t3i1 ON t3(x); 385c5c4113dSnw141292 INSERT INTO t3 VALUES(1,2); 386c5c4113dSnw141292 SELECT * FROM t3; 387c5c4113dSnw141292 } db2; 388c5c4113dSnw141292} {1 2} 389c5c4113dSnw141292do_test attach-4.2 { 390c5c4113dSnw141292 execsql { 391c5c4113dSnw141292 CREATE TABLE t3(a,b); 392c5c4113dSnw141292 CREATE UNIQUE INDEX t3i1b ON t3(a); 393c5c4113dSnw141292 INSERT INTO t3 VALUES(9,10); 394c5c4113dSnw141292 SELECT * FROM t3; 395c5c4113dSnw141292 } 396c5c4113dSnw141292} {9 10} 397c5c4113dSnw141292do_test attach-4.3 { 398c5c4113dSnw141292 execsql { 399c5c4113dSnw141292 ATTACH DATABASE 'test2.db' AS db2; 400c5c4113dSnw141292 SELECT * FROM db2.t3; 401c5c4113dSnw141292 } 402c5c4113dSnw141292} {1 2} 403c5c4113dSnw141292do_test attach-4.4 { 404c5c4113dSnw141292 execsql { 405c5c4113dSnw141292 SELECT * FROM main.t3; 406c5c4113dSnw141292 } 407c5c4113dSnw141292} {9 10} 408c5c4113dSnw141292do_test attach-4.5 { 409c5c4113dSnw141292 execsql { 410c5c4113dSnw141292 INSERT INTO db2.t3 VALUES(9,10); 411c5c4113dSnw141292 SELECT * FROM db2.t3; 412c5c4113dSnw141292 } 413c5c4113dSnw141292} {1 2 9 10} 414c5c4113dSnw141292do_test attach-4.6 { 415c5c4113dSnw141292 execsql { 416c5c4113dSnw141292 DETACH db2; 417c5c4113dSnw141292 } 418c5c4113dSnw141292 execsql { 419c5c4113dSnw141292 CREATE TABLE t4(x); 420c5c4113dSnw141292 CREATE TRIGGER t3r3 AFTER INSERT ON t3 BEGIN 421c5c4113dSnw141292 INSERT INTO t4 VALUES('db2.' || NEW.x); 422c5c4113dSnw141292 END; 423c5c4113dSnw141292 INSERT INTO t3 VALUES(6,7); 424c5c4113dSnw141292 SELECT * FROM t4; 425c5c4113dSnw141292 } db2 426c5c4113dSnw141292} {db2.6} 427c5c4113dSnw141292do_test attach-4.7 { 428c5c4113dSnw141292 execsql { 429c5c4113dSnw141292 CREATE TABLE t4(y); 430c5c4113dSnw141292 CREATE TRIGGER t3r3 AFTER INSERT ON t3 BEGIN 431c5c4113dSnw141292 INSERT INTO t4 VALUES('main.' || NEW.a); 432c5c4113dSnw141292 END; 433c5c4113dSnw141292 INSERT INTO main.t3 VALUES(11,12); 434c5c4113dSnw141292 SELECT * FROM main.t4; 435c5c4113dSnw141292 } 436c5c4113dSnw141292} {main.11} 437c5c4113dSnw141292do_test attach-4.8 { 438c5c4113dSnw141292 execsql { 439c5c4113dSnw141292 ATTACH DATABASE 'test2.db' AS db2; 440c5c4113dSnw141292 INSERT INTO db2.t3 VALUES(13,14); 441c5c4113dSnw141292 SELECT * FROM db2.t4 UNION ALL SELECT * FROM main.t4; 442c5c4113dSnw141292 } 443c5c4113dSnw141292} {db2.6 db2.13 main.11} 444c5c4113dSnw141292do_test attach-4.9 { 445c5c4113dSnw141292 execsql { 446c5c4113dSnw141292 INSERT INTO main.t3 VALUES(15,16); 447c5c4113dSnw141292 SELECT * FROM db2.t4 UNION ALL SELECT * FROM main.t4; 448c5c4113dSnw141292 } 449c5c4113dSnw141292} {db2.6 db2.13 main.11 main.15} 450c5c4113dSnw141292do_test attach-4.10 { 451c5c4113dSnw141292 execsql { 452c5c4113dSnw141292 DETACH DATABASE db2; 453c5c4113dSnw141292 } 454c5c4113dSnw141292 execsql { 455c5c4113dSnw141292 CREATE VIEW v3 AS SELECT x*100+y FROM t3; 456c5c4113dSnw141292 SELECT * FROM v3; 457c5c4113dSnw141292 } db2 458c5c4113dSnw141292} {102 910 607 1314} 459c5c4113dSnw141292do_test attach-4.11 { 460c5c4113dSnw141292 execsql { 461c5c4113dSnw141292 CREATE VIEW v3 AS SELECT a*100+b FROM t3; 462c5c4113dSnw141292 SELECT * FROM v3; 463c5c4113dSnw141292 } 464c5c4113dSnw141292} {910 1112 1516} 465c5c4113dSnw141292do_test attach-4.12 { 466c5c4113dSnw141292 execsql { 467c5c4113dSnw141292 ATTACH DATABASE 'test2.db' AS db2; 468c5c4113dSnw141292 SELECT * FROM db2.v3; 469c5c4113dSnw141292 } 470c5c4113dSnw141292} {102 910 607 1314} 471c5c4113dSnw141292do_test attach-4.13 { 472c5c4113dSnw141292 execsql { 473c5c4113dSnw141292 SELECT * FROM main.v3; 474c5c4113dSnw141292 } 475c5c4113dSnw141292} {910 1112 1516} 476c5c4113dSnw141292 477c5c4113dSnw141292# Tests for the sqliteFix...() routines in attach.c 478c5c4113dSnw141292# 479c5c4113dSnw141292do_test attach-5.1 { 480c5c4113dSnw141292 db close 481c5c4113dSnw141292 sqlite db test.db 482c5c4113dSnw141292 db2 close 483c5c4113dSnw141292 file delete -force test2.db 484c5c4113dSnw141292 sqlite db2 test2.db 485c5c4113dSnw141292 catchsql { 486c5c4113dSnw141292 ATTACH DATABASE 'test.db' AS orig; 487c5c4113dSnw141292 CREATE TRIGGER r1 AFTER INSERT ON orig.t1 BEGIN; 488c5c4113dSnw141292 SELECT 'no-op'; 489c5c4113dSnw141292 END; 490c5c4113dSnw141292 } db2 491c5c4113dSnw141292} {1 {triggers may not be added to auxiliary database orig}} 492c5c4113dSnw141292do_test attach-5.2 { 493c5c4113dSnw141292 catchsql { 494c5c4113dSnw141292 CREATE TABLE t5(x,y); 495c5c4113dSnw141292 CREATE TRIGGER r5 AFTER INSERT ON t5 BEGIN 496c5c4113dSnw141292 SELECT 'no-op'; 497c5c4113dSnw141292 END; 498c5c4113dSnw141292 } db2 499c5c4113dSnw141292} {0 {}} 500c5c4113dSnw141292do_test attach-5.3 { 501c5c4113dSnw141292 catchsql { 502c5c4113dSnw141292 DROP TRIGGER r5; 503c5c4113dSnw141292 CREATE TRIGGER r5 AFTER INSERT ON t5 BEGIN 504c5c4113dSnw141292 SELECT 'no-op' FROM orig.t1; 505c5c4113dSnw141292 END; 506c5c4113dSnw141292 } db2 507c5c4113dSnw141292} {1 {trigger r5 cannot reference objects in database orig}} 508c5c4113dSnw141292do_test attach-5.4 { 509c5c4113dSnw141292 catchsql { 510c5c4113dSnw141292 CREATE TEMP TABLE t6(p,q,r); 511c5c4113dSnw141292 CREATE TRIGGER r5 AFTER INSERT ON t5 BEGIN 512c5c4113dSnw141292 SELECT 'no-op' FROM temp.t6; 513c5c4113dSnw141292 END; 514c5c4113dSnw141292 } db2 515c5c4113dSnw141292} {1 {trigger r5 cannot reference objects in database temp}} 516c5c4113dSnw141292do_test attach-5.5 { 517c5c4113dSnw141292 catchsql { 518c5c4113dSnw141292 CREATE TRIGGER r5 AFTER INSERT ON t5 BEGIN 519c5c4113dSnw141292 SELECT 'no-op' || (SELECT * FROM temp.t6); 520c5c4113dSnw141292 END; 521c5c4113dSnw141292 } db2 522c5c4113dSnw141292} {1 {trigger r5 cannot reference objects in database temp}} 523c5c4113dSnw141292do_test attach-5.6 { 524c5c4113dSnw141292 catchsql { 525c5c4113dSnw141292 CREATE TRIGGER r5 AFTER INSERT ON t5 BEGIN 526c5c4113dSnw141292 SELECT 'no-op' FROM t1 WHERE x<(SELECT min(x) FROM temp.t6); 527c5c4113dSnw141292 END; 528c5c4113dSnw141292 } db2 529c5c4113dSnw141292} {1 {trigger r5 cannot reference objects in database temp}} 530c5c4113dSnw141292do_test attach-5.7 { 531c5c4113dSnw141292 catchsql { 532c5c4113dSnw141292 CREATE TRIGGER r5 AFTER INSERT ON t5 BEGIN 533c5c4113dSnw141292 SELECT 'no-op' FROM t1 GROUP BY 1 HAVING x<(SELECT min(x) FROM temp.t6); 534c5c4113dSnw141292 END; 535c5c4113dSnw141292 } db2 536c5c4113dSnw141292} {1 {trigger r5 cannot reference objects in database temp}} 537c5c4113dSnw141292do_test attach-5.7 { 538c5c4113dSnw141292 catchsql { 539c5c4113dSnw141292 CREATE TRIGGER r5 AFTER INSERT ON t5 BEGIN 540c5c4113dSnw141292 SELECT max(1,x,(SELECT min(x) FROM temp.t6)) FROM t1; 541c5c4113dSnw141292 END; 542c5c4113dSnw141292 } db2 543c5c4113dSnw141292} {1 {trigger r5 cannot reference objects in database temp}} 544c5c4113dSnw141292do_test attach-5.8 { 545c5c4113dSnw141292 catchsql { 546c5c4113dSnw141292 CREATE TRIGGER r5 AFTER INSERT ON t5 BEGIN 547c5c4113dSnw141292 INSERT INTO t1 VALUES((SELECT min(x) FROM temp.t6),5); 548c5c4113dSnw141292 END; 549c5c4113dSnw141292 } db2 550c5c4113dSnw141292} {1 {trigger r5 cannot reference objects in database temp}} 551c5c4113dSnw141292do_test attach-5.9 { 552c5c4113dSnw141292 catchsql { 553c5c4113dSnw141292 CREATE TRIGGER r5 AFTER INSERT ON t5 BEGIN 554c5c4113dSnw141292 DELETE FROM t1 WHERE x<(SELECT min(x) FROM temp.t6); 555c5c4113dSnw141292 END; 556c5c4113dSnw141292 } db2 557c5c4113dSnw141292} {1 {trigger r5 cannot reference objects in database temp}} 558c5c4113dSnw141292 559c5c4113dSnw141292# Check to make sure we get a sensible error if unable to open 560c5c4113dSnw141292# the file that we are trying to attach. 561c5c4113dSnw141292# 562c5c4113dSnw141292do_test attach-6.1 { 563c5c4113dSnw141292 catchsql { 564c5c4113dSnw141292 ATTACH DATABASE 'no-such-file' AS nosuch; 565c5c4113dSnw141292 } 566c5c4113dSnw141292} {1 {cannot attach empty database: nosuch}} 567c5c4113dSnw141292file delete -force no-such-file 568c5c4113dSnw141292if {$tcl_platform(platform)=="unix"} { 569c5c4113dSnw141292 do_test attach-6.2 { 570c5c4113dSnw141292 sqlite dbx cannot-read 571c5c4113dSnw141292 dbx eval {CREATE TABLE t1(a,b,c)} 572c5c4113dSnw141292 dbx close 573c5c4113dSnw141292 file attributes cannot-read -permission 0000 574c5c4113dSnw141292 catchsql { 575c5c4113dSnw141292 ATTACH DATABASE 'cannot-read' AS noread; 576c5c4113dSnw141292 } 577c5c4113dSnw141292 } {1 {unable to open database: cannot-read}} 578c5c4113dSnw141292 file delete -force cannot-read 579c5c4113dSnw141292} 580c5c4113dSnw141292 581c5c4113dSnw141292for {set i 2} {$i<=15} {incr i} { 582c5c4113dSnw141292 catch {db$i close} 583c5c4113dSnw141292} 584c5c4113dSnw141292file delete -force test2.db 585c5c4113dSnw141292 586c5c4113dSnw141292 587c5c4113dSnw141292finish_test 588