1 # 2009 August 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 # 12 # Tests to make sure #3810 is fixed. 13 # 14 # $Id: tkt3810.test,v 1.4 2009/08/06 17:43:31 drh Exp $ 15 16 set testdir [file dirname $argv0] 17 source $testdir/tester.tcl 18 ifcapable {!trigger} { 19 finish_test 20 return 21 } 22 23 # Create a table using the first database connection. 24 # 25 do_test tkt3810-1.1 { 26 execsql { 27 CREATE TABLE t1(x); 28 INSERT INTO t1 VALUES(123); 29 SELECT * FROM t1; 30 CREATE TABLE t2(y); 31 CREATE TABLE t3(z); 32 } 33 } 123 34 35 # Create a second connection to the same database. Make sure the 36 # schema of the database has been parsed by the second connection. 37 # 38 do_test tkt3810-2 { 39 sqlite3 db2 test.db 40 execsql { 41 SELECT * FROM t1; 42 } db2 43 } 123 44 45 # DROP the table using the second connection. The table no longer exists 46 # but the first connection does not yet know this. Then try to create a TEMP 47 # trigger in the first connection that references the table that was dropped. 48 # 49 do_test tkt3810-3 { 50 execsql {DROP TABLE t1} db2 51 execsql { 52 CREATE TEMP TRIGGER r1 AFTER INSERT ON t1 BEGIN 53 INSERT INTO t2 VALUES(new.rowid); 54 END; 55 } 56 catchsql { 57 SELECT * FROM t3; 58 } 59 } {0 {}} 60 61 # Trigger still exists in the sqlite_temp_master table, but now it is 62 # an orphan. 63 # 64 do_test tkt3810-4 { 65 execsql {SELECT name FROM sqlite_temp_master ORDER BY name} 66 } {r1} 67 68 # Because it is an orphan, it cannot be dropped. 69 # 70 do_test tkt3810-5 { 71 catchsql {DROP TRIGGER r1} 72 } {1 {no such trigger: r1}} 73 74 # Create a table t1 then drop the table in order to drop the orphaned 75 # trigger. 76 # 77 do_test tkt3810-6 { 78 execsql {CREATE TABLE t1(x)} db2 79 execsql {DROP TABLE t1} 80 execsql { 81 SELECT name FROM sqlite_temp_master; 82 } 83 } {} 84 85 db2 close 86 87 finish_test 88