Annotation of embedaddon/sqlite3/test/e_droptrigger.test, revision 1.1.1.1

1.1       misho       1: # 2010 November 29
                      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: # This file implements tests to verify that the "testable statements" in 
                     13: # the lang_droptrigger.html document are correct.
                     14: #
                     15: 
                     16: set testdir [file dirname $argv0]
                     17: source $testdir/tester.tcl
                     18: set ::testprefix e_droptrigger
                     19: 
                     20: ifcapable !trigger { finish_test ; return }
                     21: 
                     22: proc do_droptrigger_tests {nm args} {
                     23:   uplevel do_select_tests [list e_createtable-$nm] $args
                     24: }
                     25: 
                     26: proc list_all_triggers {{db db}} {
                     27:   set res [list]
                     28:   $db eval { PRAGMA database_list } {
                     29:     if {$name == "temp"} {
                     30:       set tbl sqlite_temp_master
                     31:     } else {
                     32:       set tbl "$name.sqlite_master"
                     33:     }
                     34:     lappend res {*}[
                     35:       db eval "SELECT '$name.' || name FROM $tbl WHERE type = 'trigger'"
                     36:     ]
                     37:   }
                     38:   set res
                     39: }
                     40: 
                     41: 
                     42: proc droptrigger_reopen_db {{event INSERT}} {
                     43:   db close
                     44:   forcedelete test.db test.db2
                     45:   sqlite3 db test.db
                     46: 
                     47:   set ::triggers_fired [list]
                     48:   proc r {x} { lappend ::triggers_fired $x }
                     49:   db func r r
                     50: 
                     51:   db eval "
                     52:     ATTACH 'test.db2' AS aux;
                     53: 
                     54:     CREATE TEMP TABLE t1(a, b);
                     55:     INSERT INTO t1 VALUES('a', 'b');
                     56:     CREATE TRIGGER tr1 AFTER $event ON t1 BEGIN SELECT r('temp.tr1') ; END;
                     57: 
                     58:     CREATE TABLE t2(a, b);
                     59:     INSERT INTO t2 VALUES('a', 'b');
                     60:     CREATE TRIGGER tr1 BEFORE $event ON t2 BEGIN SELECT r('main.tr1') ; END;
                     61:     CREATE TRIGGER tr2 AFTER  $event ON t2 BEGIN SELECT r('main.tr2') ; END;
                     62: 
                     63:     CREATE TABLE aux.t3(a, b);
                     64:     INSERT INTO t3 VALUES('a', 'b');
                     65:     CREATE TRIGGER aux.tr1 BEFORE $event ON t3 BEGIN SELECT r('aux.tr1') ; END;
                     66:     CREATE TRIGGER aux.tr2 AFTER  $event ON t3 BEGIN SELECT r('aux.tr2') ; END;
                     67:     CREATE TRIGGER aux.tr3 AFTER  $event ON t3 BEGIN SELECT r('aux.tr3') ; END;
                     68:   "
                     69: }
                     70: 
                     71: 
                     72: # EVIDENCE-OF: R-27975-10951 -- syntax diagram drop-trigger-stmt
                     73: #
                     74: do_droptrigger_tests 1.1 -repair {
                     75:   droptrigger_reopen_db
                     76: } -tclquery {
                     77:   list_all_triggers 
                     78: } {
                     79:   1   "DROP TRIGGER main.tr1"            
                     80:       {main.tr2 temp.tr1 aux.tr1 aux.tr2 aux.tr3}
                     81:   2   "DROP TRIGGER IF EXISTS main.tr1"  
                     82:       {main.tr2 temp.tr1 aux.tr1 aux.tr2 aux.tr3}
                     83:   3   "DROP TRIGGER tr1"                 
                     84:       {main.tr1 main.tr2 aux.tr1 aux.tr2 aux.tr3}
                     85:   4   "DROP TRIGGER IF EXISTS tr1"       
                     86:       {main.tr1 main.tr2 aux.tr1 aux.tr2 aux.tr3}
                     87: 
                     88:   5   "DROP TRIGGER aux.tr1"             
                     89:       {main.tr1 main.tr2 temp.tr1 aux.tr2 aux.tr3}
                     90:   6   "DROP TRIGGER IF EXISTS aux.tr1"   
                     91:       {main.tr1 main.tr2 temp.tr1 aux.tr2 aux.tr3}
                     92: 
                     93:   7   "DROP TRIGGER IF EXISTS aux.xxx"   
                     94:       {main.tr1 main.tr2 temp.tr1 aux.tr1 aux.tr2 aux.tr3}
                     95:   8   "DROP TRIGGER IF EXISTS aux.xxx"   
                     96:       {main.tr1 main.tr2 temp.tr1 aux.tr1 aux.tr2 aux.tr3}
                     97: }
                     98: 
                     99: # EVIDENCE-OF: R-61172-15671 The DROP TRIGGER statement removes a
                    100: # trigger created by the CREATE TRIGGER statement.
                    101: #
                    102: foreach {tn tbl droptrigger before after} {
                    103:   1   t1  "DROP TRIGGER tr1" {temp.tr1}                {}
                    104:   2   t2  "DROP TRIGGER tr1" {main.tr1 main.tr2}       {main.tr1 main.tr2}
                    105:   3   t3  "DROP TRIGGER tr1" {aux.tr1 aux.tr3 aux.tr2} {aux.tr1 aux.tr3 aux.tr2}
                    106: 
                    107:   4   t1  "DROP TRIGGER tr2" {temp.tr1}                {temp.tr1}
                    108:   5   t2  "DROP TRIGGER tr2" {main.tr1 main.tr2}       {main.tr1}
                    109:   6   t3  "DROP TRIGGER tr2" {aux.tr1 aux.tr3 aux.tr2} {aux.tr1 aux.tr3 aux.tr2}
                    110: 
                    111:   7   t1  "DROP TRIGGER tr3" {temp.tr1}                {temp.tr1}
                    112:   8   t2  "DROP TRIGGER tr3" {main.tr1 main.tr2}       {main.tr1 main.tr2}
                    113:   9   t3  "DROP TRIGGER tr3" {aux.tr1 aux.tr3 aux.tr2} {aux.tr1 aux.tr2}
                    114: } {
                    115: 
                    116:   do_test 2.$tn.1 {
                    117:     droptrigger_reopen_db
                    118:     execsql " INSERT INTO $tbl VALUES('1', '2') "
                    119:     set ::triggers_fired
                    120:   } $before
                    121: 
                    122:   do_test 2.$tn.2 {
                    123:     droptrigger_reopen_db
                    124:     execsql $droptrigger
                    125:     execsql " INSERT INTO $tbl VALUES('1', '2') "
                    126:     set ::triggers_fired
                    127:   } $after
                    128: }
                    129: 
                    130: # EVIDENCE-OF: R-50239-29811 Once removed, the trigger definition is no
                    131: # longer present in the sqlite_master (or sqlite_temp_master) table and
                    132: # is not fired by any subsequent INSERT, UPDATE or DELETE statements.
                    133: #
                    134: #   Test cases e_droptrigger-1.* test the first part of this statement
                    135: #   (that dropped triggers do not appear in the schema table), and tests
                    136: #   droptrigger-2.* test that dropped triggers are not fired by INSERT
                    137: #   statements. The following tests verify that they are not fired by
                    138: #   UPDATE or DELETE statements.
                    139: #
                    140: foreach {tn tbl droptrigger before after} {
                    141:   1   t1  "DROP TRIGGER tr1" {temp.tr1}                {}
                    142:   2   t2  "DROP TRIGGER tr1" {main.tr1 main.tr2}       {main.tr1 main.tr2}
                    143:   3   t3  "DROP TRIGGER tr1" {aux.tr1 aux.tr3 aux.tr2} {aux.tr1 aux.tr3 aux.tr2}
                    144: 
                    145:   4   t1  "DROP TRIGGER tr2" {temp.tr1}                {temp.tr1}
                    146:   5   t2  "DROP TRIGGER tr2" {main.tr1 main.tr2}       {main.tr1}
                    147:   6   t3  "DROP TRIGGER tr2" {aux.tr1 aux.tr3 aux.tr2} {aux.tr1 aux.tr3 aux.tr2}
                    148: 
                    149:   7   t1  "DROP TRIGGER tr3" {temp.tr1}                {temp.tr1}
                    150:   8   t2  "DROP TRIGGER tr3" {main.tr1 main.tr2}       {main.tr1 main.tr2}
                    151:   9   t3  "DROP TRIGGER tr3" {aux.tr1 aux.tr3 aux.tr2} {aux.tr1 aux.tr2}
                    152: } {
                    153: 
                    154:   do_test 3.1.$tn.1 {
                    155:     droptrigger_reopen_db UPDATE
                    156:     execsql "UPDATE $tbl SET a = 'abc'"
                    157:     set ::triggers_fired
                    158:   } $before
                    159: 
                    160:   do_test 3.1.$tn.2 {
                    161:     droptrigger_reopen_db UPDATE
                    162:     execsql $droptrigger
                    163:     execsql "UPDATE $tbl SET a = 'abc'"
                    164:     set ::triggers_fired
                    165:   } $after
                    166: }
                    167: foreach {tn tbl droptrigger before after} {
                    168:   1   t1  "DROP TRIGGER tr1" {temp.tr1}                {}
                    169:   2   t2  "DROP TRIGGER tr1" {main.tr1 main.tr2}       {main.tr1 main.tr2}
                    170:   3   t3  "DROP TRIGGER tr1" {aux.tr1 aux.tr3 aux.tr2} {aux.tr1 aux.tr3 aux.tr2}
                    171: 
                    172:   4   t1  "DROP TRIGGER tr2" {temp.tr1}                {temp.tr1}
                    173:   5   t2  "DROP TRIGGER tr2" {main.tr1 main.tr2}       {main.tr1}
                    174:   6   t3  "DROP TRIGGER tr2" {aux.tr1 aux.tr3 aux.tr2} {aux.tr1 aux.tr3 aux.tr2}
                    175: 
                    176:   7   t1  "DROP TRIGGER tr3" {temp.tr1}                {temp.tr1}
                    177:   8   t2  "DROP TRIGGER tr3" {main.tr1 main.tr2}       {main.tr1 main.tr2}
                    178:   9   t3  "DROP TRIGGER tr3" {aux.tr1 aux.tr3 aux.tr2} {aux.tr1 aux.tr2}
                    179: } {
                    180: 
                    181:   do_test 3.2.$tn.1 {
                    182:     droptrigger_reopen_db DELETE
                    183:     execsql "DELETE FROM $tbl"
                    184:     set ::triggers_fired
                    185:   } $before
                    186: 
                    187:   do_test 3.2.$tn.2 {
                    188:     droptrigger_reopen_db DELETE
                    189:     execsql $droptrigger
                    190:     execsql "DELETE FROM $tbl"
                    191:     set ::triggers_fired
                    192:   } $after
                    193: }
                    194: 
                    195: # EVIDENCE-OF: R-37808-62273 Note that triggers are automatically
                    196: # dropped when the associated table is dropped.
                    197: #
                    198: do_test 4.1 {
                    199:   droptrigger_reopen_db
                    200:   list_all_triggers
                    201: } {main.tr1 main.tr2 temp.tr1 aux.tr1 aux.tr2 aux.tr3}
                    202: do_test 4.2 {
                    203:   droptrigger_reopen_db
                    204:   execsql "DROP TABLE t1"
                    205:   list_all_triggers
                    206: } {main.tr1 main.tr2 aux.tr1 aux.tr2 aux.tr3}
                    207: do_test 4.3 {
                    208:   droptrigger_reopen_db
                    209:   execsql "DROP TABLE t1"
                    210:   list_all_triggers
                    211: } {main.tr1 main.tr2 aux.tr1 aux.tr2 aux.tr3}
                    212: do_test 4.4 {
                    213:   droptrigger_reopen_db
                    214:   execsql "DROP TABLE t1"
                    215:   list_all_triggers
                    216: } {main.tr1 main.tr2 aux.tr1 aux.tr2 aux.tr3}
                    217: 
                    218: finish_test

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>