Home | History | Annotate | Download | only in test
      1 # 2010 September 28
      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 # This file implements regression tests for SQLite library. The
     12 # focus of this file is testing that a trigger may have the same
     13 # name as an index, view or table in the same database.
     14 #
     15 
     16 set testdir [file dirname $argv0]
     17 source $testdir/tester.tcl
     18 
     19 #--------------------------------------------------------------------------
     20 # Test organization:
     21 #
     22 #   schema4-1.*: Dropping and creating triggers and other objects where
     23 #     triggers and at least on other object share a name.
     24 #
     25 #   schema4-2.*: Renaming tables where there is a trigger that shares the
     26 #     name of the table or one of its indices.
     27 #
     28 
     29 do_execsql_test schema4-1.1 {
     30   CREATE TABLE log(x, a, b);
     31   CREATE TABLE tbl(a, b);
     32 
     33   CREATE TABLE t1(a, b);
     34   CREATE VIEW v1 AS SELECT * FROM tbl;
     35   CREATE INDEX i1 ON tbl(a);
     36 } {}
     37 
     38 do_execsql_test schema4-1.2 {
     39   CREATE TRIGGER t1 AFTER INSERT ON tbl BEGIN
     40     INSERT INTO log VALUES('after insert', new.a, new.b);
     41   END;
     42   CREATE TRIGGER v1 AFTER UPDATE ON tbl BEGIN
     43     INSERT INTO log VALUES('after update', new.a, new.b);
     44   END;
     45   CREATE TRIGGER i1 AFTER DELETE ON tbl BEGIN
     46     INSERT INTO log VALUES('after delete', old.a, old.b);
     47   END;
     48 } {}
     49 
     50 do_execsql_test schema4-1.3 {
     51   INSERT INTO tbl VALUES(1, 2);
     52   UPDATE tbl SET b=a+b, a=a+1;
     53   DELETE FROM tbl;
     54 
     55   SELECT x, a, b FROM log;
     56 } {{after insert} 1 2 {after update} 2 3 {after delete} 2 3}
     57 
     58 do_execsql_test schema4-1.4 {
     59   DELETE FROM log;
     60 
     61   DROP INDEX i1;
     62   DROP TABLE t1;
     63   DROP VIEW v1;
     64 
     65   INSERT INTO tbl VALUES(1, 2);
     66   UPDATE tbl SET b=a+b, a=a+1;
     67   DELETE FROM tbl;
     68 
     69   SELECT x, a, b FROM log;
     70 } {{after insert} 1 2 {after update} 2 3 {after delete} 2 3}
     71 
     72 db close
     73 sqlite3 db test.db
     74 
     75 do_execsql_test schema4-1.5 {
     76   DELETE FROM log;
     77   INSERT INTO tbl VALUES(1, 2);
     78   UPDATE tbl SET b=a+b, a=a+1;
     79   DELETE FROM tbl;
     80   SELECT x, a, b FROM log;
     81 } {{after insert} 1 2 {after update} 2 3 {after delete} 2 3}
     82 
     83 do_execsql_test schema4-1.6 {
     84   CREATE TABLE t1(a, b);
     85   CREATE VIEW v1 AS SELECT * FROM tbl;
     86   CREATE INDEX i1 ON tbl(a);
     87 } {}
     88 
     89 ifcapable fts3 {
     90   do_execsql_test schema4-1.7 {
     91     DROP TABLE t1;
     92     CREATE VIRTUAL TABLE t1 USING fts3;
     93   } {}
     94 
     95   do_execsql_test schema4-1.8 {
     96     DELETE FROM log;
     97     DROP TABLE t1;
     98     INSERT INTO tbl VALUES(1, 2);
     99     UPDATE tbl SET b=a+b, a=a+1;
    100     DELETE FROM tbl;
    101     SELECT x, a, b FROM log;
    102   } {{after insert} 1 2 {after update} 2 3 {after delete} 2 3}
    103 }
    104 
    105 ifcapable altertable {
    106   drop_all_tables
    107   do_execsql_test schema4-2.1 {
    108     CREATE TABLE log(x, a, b);
    109     CREATE TABLE tbl(a, b);
    110   
    111     CREATE TABLE t1(a, b);
    112     CREATE INDEX i1 ON t1(a, b);
    113   } {}
    114   
    115   do_execsql_test schema4-2.2 {
    116     CREATE TRIGGER t1 AFTER INSERT ON tbl BEGIN
    117       INSERT INTO log VALUES('after insert', new.a, new.b);
    118     END;
    119     CREATE TRIGGER i1 AFTER DELETE ON tbl BEGIN
    120       INSERT INTO log VALUES('after delete', old.a, old.b);
    121     END;
    122   } {}
    123 
    124   do_execsql_test schema4-2.3 { ALTER TABLE t1 RENAME TO t2 } {}
    125 
    126   do_execsql_test schema4-2.4 { 
    127     INSERT INTO tbl VALUES('a', 'b');
    128     DELETE FROM tbl;
    129     SELECT * FROM log;
    130   } {{after insert} a b {after delete} a b}
    131 
    132   db close
    133   sqlite3 db test.db
    134 
    135   do_execsql_test schema4-2.5 { 
    136     DELETE FROM log;
    137     INSERT INTO tbl VALUES('c', 'd');
    138     DELETE FROM tbl;
    139     SELECT * FROM log;
    140   } {{after insert} c d {after delete} c d}
    141 
    142   do_execsql_test schema4-2.6 {
    143     CREATE TEMP TRIGGER x1 AFTER UPDATE ON tbl BEGIN
    144       INSERT INTO log VALUES('after update', new.a, new.b);
    145     END;
    146 
    147     CREATE TEMP TABLE x1(x);
    148     INSERT INTO x1 VALUES(123);
    149   } {}
    150 
    151   do_execsql_test schema4-2.8 {
    152     select sql from sqlite_temp_master WHERE type='table';
    153   } {{CREATE TABLE x1(x)}}
    154 
    155   do_execsql_test schema4-2.7 { ALTER TABLE tbl RENAME TO tbl2 } {}
    156 
    157   do_execsql_test schema4-2.9 {
    158     select sql from sqlite_temp_master WHERE type='table';
    159   } {{CREATE TABLE x1(x)}}
    160 
    161   do_execsql_test schema4-2.10 { 
    162     DELETE FROM log;
    163     INSERT INTO tbl2 VALUES('e', 'f');
    164     UPDATE tbl2 SET a='g', b='h';
    165     DELETE FROM tbl2;
    166     SELECT * FROM log;
    167   } {{after insert} e f {after update} g h {after delete} g h}
    168 
    169   do_execsql_test schema4-2.11 {
    170     INSERT INTO x1 VALUES(456);
    171     SELECT * FROM x1
    172   } {123 456}
    173 }
    174 
    175 finish_test
    176