Annotation of embedaddon/sqlite3/test/e_droptrigger.test, revision 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>