Annotation of embedaddon/sqlite3/test/trigger3.test, revision 1.1

1.1     ! misho       1: # The author disclaims copyright to this source code.  In place of
        !             2: # a legal notice, here is a blessing:
        !             3: #
        !             4: #    May you do good and not evil.
        !             5: #    May you find forgiveness for yourself and forgive others.
        !             6: #    May you share freely, never taking more than you give.
        !             7: #
        !             8: #***********************************************************************
        !             9: #
        !            10: # This file tests the RAISE() function.
        !            11: #
        !            12: 
        !            13: 
        !            14: set testdir [file dirname $argv0]
        !            15: source $testdir/tester.tcl
        !            16: ifcapable {!trigger} {
        !            17:   finish_test
        !            18:   return
        !            19: }
        !            20: 
        !            21: # The tests in this file were written before SQLite supported recursive }
        !            22: # trigger invocation, and some tests depend on that to pass. So disable
        !            23: # recursive triggers for this file.
        !            24: catchsql { pragma recursive_triggers = off } 
        !            25: 
        !            26: # Test that we can cause ROLLBACK, FAIL and ABORT correctly
        !            27: #
        !            28: catchsql { CREATE TABLE tbl(a, b ,c) }
        !            29: execsql {
        !            30:     CREATE TRIGGER before_tbl_insert BEFORE INSERT ON tbl BEGIN SELECT CASE 
        !            31:         WHEN (new.a = 4) THEN RAISE(IGNORE) END;
        !            32:     END;
        !            33: 
        !            34:     CREATE TRIGGER after_tbl_insert AFTER INSERT ON tbl BEGIN SELECT CASE 
        !            35:         WHEN (new.a = 1) THEN RAISE(ABORT,    'Trigger abort') 
        !            36:         WHEN (new.a = 2) THEN RAISE(FAIL,     'Trigger fail') 
        !            37:         WHEN (new.a = 3) THEN RAISE(ROLLBACK, 'Trigger rollback') END;
        !            38:     END;
        !            39: }
        !            40: # ABORT
        !            41: do_test trigger3-1.1 {
        !            42:     catchsql {
        !            43:         BEGIN;
        !            44:         INSERT INTO tbl VALUES (5, 5, 6);
        !            45:         INSERT INTO tbl VALUES (1, 5, 6);
        !            46:     }
        !            47: } {1 {Trigger abort}}
        !            48: do_test trigger3-1.2 {
        !            49:     execsql {
        !            50:         SELECT * FROM tbl;
        !            51:         ROLLBACK;
        !            52:     }
        !            53: } {5 5 6}
        !            54: do_test trigger3-1.3 {
        !            55:     execsql {SELECT * FROM tbl}
        !            56: } {}
        !            57: 
        !            58: # FAIL
        !            59: do_test trigger3-2.1 {
        !            60:     catchsql {
        !            61:         BEGIN;
        !            62:         INSERT INTO tbl VALUES (5, 5, 6);
        !            63:         INSERT INTO tbl VALUES (2, 5, 6);
        !            64:     }
        !            65: } {1 {Trigger fail}}
        !            66: do_test trigger3-2.2 {
        !            67:     execsql {
        !            68:         SELECT * FROM tbl;
        !            69:         ROLLBACK;
        !            70:     }
        !            71: } {5 5 6 2 5 6}
        !            72: # ROLLBACK
        !            73: do_test trigger3-3.1 {
        !            74:     catchsql {
        !            75:         BEGIN;
        !            76:         INSERT INTO tbl VALUES (5, 5, 6);
        !            77:         INSERT INTO tbl VALUES (3, 5, 6);
        !            78:     }
        !            79: } {1 {Trigger rollback}}
        !            80: do_test trigger3-3.2 {
        !            81:     execsql {
        !            82:         SELECT * FROM tbl;
        !            83:     }
        !            84: } {}
        !            85: 
        !            86: # Verify that a ROLLBACK trigger works like a FAIL trigger if
        !            87: # we are not within a transaction.  Ticket #3035.
        !            88: #
        !            89: do_test trigger3-3.3 {
        !            90:     catchsql {COMMIT}
        !            91:     catchsql {
        !            92:         INSERT INTO tbl VALUES (3, 9, 10);
        !            93:     }
        !            94: } {1 {Trigger rollback}}
        !            95: do_test trigger3-3.4 {
        !            96:     execsql {SELECT * FROM tbl}
        !            97: } {}
        !            98: 
        !            99: # IGNORE
        !           100: do_test trigger3-4.1 {
        !           101:     catchsql {
        !           102:         BEGIN;
        !           103:         INSERT INTO tbl VALUES (5, 5, 6);
        !           104:         INSERT INTO tbl VALUES (4, 5, 6);
        !           105:     }
        !           106: } {0 {}}
        !           107: do_test trigger3-4.2 {
        !           108:     execsql {
        !           109:         SELECT * FROM tbl;
        !           110:         ROLLBACK;
        !           111:     }
        !           112: } {5 5 6}
        !           113: 
        !           114: # Check that we can also do RAISE(IGNORE) for UPDATE and DELETE
        !           115: execsql {DROP TABLE tbl;}
        !           116: execsql {CREATE TABLE tbl (a, b, c);}
        !           117: execsql {INSERT INTO tbl VALUES(1, 2, 3);}
        !           118: execsql {INSERT INTO tbl VALUES(4, 5, 6);}
        !           119: execsql {
        !           120:     CREATE TRIGGER before_tbl_update BEFORE UPDATE ON tbl BEGIN
        !           121:         SELECT CASE WHEN (old.a = 1) THEN RAISE(IGNORE) END;
        !           122:     END;
        !           123: 
        !           124:     CREATE TRIGGER before_tbl_delete BEFORE DELETE ON tbl BEGIN
        !           125:         SELECT CASE WHEN (old.a = 1) THEN RAISE(IGNORE) END;
        !           126:     END;
        !           127: }
        !           128: do_test trigger3-5.1 {
        !           129:     execsql {
        !           130:         UPDATE tbl SET c = 10;
        !           131:         SELECT * FROM tbl;
        !           132:     }
        !           133: } {1 2 3 4 5 10}
        !           134: do_test trigger3-5.2 {
        !           135:     execsql {
        !           136:         DELETE FROM tbl;
        !           137:         SELECT * FROM tbl;
        !           138:     }
        !           139: } {1 2 3}
        !           140: 
        !           141: # Check that RAISE(IGNORE) works correctly for nested triggers:
        !           142: execsql {CREATE TABLE tbl2(a, b, c)}
        !           143: execsql {
        !           144:     CREATE TRIGGER after_tbl2_insert AFTER INSERT ON tbl2 BEGIN
        !           145:         UPDATE tbl SET c = 10;
        !           146:         INSERT INTO tbl2 VALUES (new.a, new.b, new.c);
        !           147:     END;
        !           148: }
        !           149: do_test trigger3-6 {
        !           150:     execsql {
        !           151:         INSERT INTO tbl2 VALUES (1, 2, 3);
        !           152:         SELECT * FROM tbl2;
        !           153:         SELECT * FROM tbl;
        !           154:     }
        !           155: } {1 2 3 1 2 3 1 2 3}
        !           156: 
        !           157: # Check that things also work for view-triggers
        !           158: 
        !           159: ifcapable view {
        !           160: 
        !           161: execsql {CREATE VIEW tbl_view AS SELECT * FROM tbl}
        !           162: execsql {
        !           163:     CREATE TRIGGER tbl_view_insert INSTEAD OF INSERT ON tbl_view BEGIN
        !           164:         SELECT CASE WHEN (new.a = 1) THEN RAISE(ROLLBACK, 'View rollback')
        !           165:                     WHEN (new.a = 2) THEN RAISE(IGNORE) 
        !           166:                     WHEN (new.a = 3) THEN RAISE(ABORT, 'View abort') END;
        !           167:     END;
        !           168: }
        !           169: 
        !           170: do_test trigger3-7.1 {
        !           171:     catchsql {
        !           172:         INSERT INTO tbl_view VALUES(1, 2, 3);
        !           173:     }
        !           174: } {1 {View rollback}}
        !           175: do_test trigger3-7.2 {
        !           176:     catchsql {
        !           177:         INSERT INTO tbl_view VALUES(2, 2, 3);
        !           178:     }
        !           179: } {0 {}}
        !           180: do_test trigger3-7.3 {
        !           181:     catchsql {
        !           182:         INSERT INTO tbl_view VALUES(3, 2, 3);
        !           183:     }
        !           184: } {1 {View abort}}
        !           185: 
        !           186: } ;# ifcapable view
        !           187: 
        !           188: integrity_check trigger3-8.1
        !           189: 
        !           190: catchsql { DROP TABLE tbl; } 
        !           191: catchsql { DROP TABLE tbl2; } 
        !           192: catchsql { DROP VIEW tbl_view; }
        !           193: 
        !           194: finish_test

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