Home | History | Annotate | Download | only in test
      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