xref: /sqlite-3.40.0/test/trigger3.test (revision 433dccfb)
16f34903eSdanielk1977# The author disclaims copyright to this source code.  In place of
26f34903eSdanielk1977# a legal notice, here is a blessing:
36f34903eSdanielk1977#
46f34903eSdanielk1977#    May you do good and not evil.
56f34903eSdanielk1977#    May you find forgiveness for yourself and forgive others.
66f34903eSdanielk1977#    May you share freely, never taking more than you give.
76f34903eSdanielk1977#
86f34903eSdanielk1977#***********************************************************************
96f34903eSdanielk1977#
106f34903eSdanielk1977# This file tests the RAISE() function.
116f34903eSdanielk1977#
126f34903eSdanielk1977
1335d4c2f4Sdrh
146f34903eSdanielk1977set testdir [file dirname $argv0]
156f34903eSdanielk1977source $testdir/tester.tcl
16b7f9164eSdrhifcapable {!trigger} {
17b7f9164eSdrh  finish_test
18b7f9164eSdrh  return
19b7f9164eSdrh}
206f34903eSdanielk1977
2176d462eeSdan# The tests in this file were written before SQLite supported recursive }
2276d462eeSdan# trigger invocation, and some tests depend on that to pass. So disable
2376d462eeSdan# recursive triggers for this file.
245bde73c4Sdancatchsql { pragma recursive_triggers = off }
256f34903eSdanielk1977
2676d462eeSdan# Test that we can cause ROLLBACK, FAIL and ABORT correctly
2776d462eeSdan#
2876d462eeSdancatchsql { CREATE TABLE tbl(a, b ,c) }
296f34903eSdanielk1977execsql {
306f34903eSdanielk1977    CREATE TRIGGER before_tbl_insert BEFORE INSERT ON tbl BEGIN SELECT CASE
316f34903eSdanielk1977        WHEN (new.a = 4) THEN RAISE(IGNORE) END;
326f34903eSdanielk1977    END;
336f34903eSdanielk1977
346f34903eSdanielk1977    CREATE TRIGGER after_tbl_insert AFTER INSERT ON tbl BEGIN SELECT CASE
356f34903eSdanielk1977        WHEN (new.a = 1) THEN RAISE(ABORT,    'Trigger abort')
366f34903eSdanielk1977        WHEN (new.a = 2) THEN RAISE(FAIL,     'Trigger fail')
376f34903eSdanielk1977        WHEN (new.a = 3) THEN RAISE(ROLLBACK, 'Trigger rollback') END;
386f34903eSdanielk1977    END;
396f34903eSdanielk1977}
406f34903eSdanielk1977# ABORT
4141a3bd0aSdrhdo_test trigger3-1.1 {
426f34903eSdanielk1977    catchsql {
436f34903eSdanielk1977        BEGIN;
446f34903eSdanielk1977        INSERT INTO tbl VALUES (5, 5, 6);
456f34903eSdanielk1977        INSERT INTO tbl VALUES (1, 5, 6);
466f34903eSdanielk1977    }
476f34903eSdanielk1977} {1 {Trigger abort}}
48*433dccfbSdrhverify_ex_errcode trigger3-1.1b SQLITE_CONSTRAINT_TRIGGER
4941a3bd0aSdrhdo_test trigger3-1.2 {
506f34903eSdanielk1977    execsql {
516f34903eSdanielk1977        SELECT * FROM tbl;
526f34903eSdanielk1977        ROLLBACK;
536f34903eSdanielk1977    }
546f34903eSdanielk1977} {5 5 6}
55db48ee02Sdrhdo_test trigger3-1.3 {
56db48ee02Sdrh    execsql {SELECT * FROM tbl}
57db48ee02Sdrh} {}
586f34903eSdanielk1977
596f34903eSdanielk1977# FAIL
6041a3bd0aSdrhdo_test trigger3-2.1 {
616f34903eSdanielk1977    catchsql {
626f34903eSdanielk1977        BEGIN;
636f34903eSdanielk1977        INSERT INTO tbl VALUES (5, 5, 6);
646f34903eSdanielk1977        INSERT INTO tbl VALUES (2, 5, 6);
656f34903eSdanielk1977    }
666f34903eSdanielk1977} {1 {Trigger fail}}
67*433dccfbSdrhverify_ex_errcode trigger3-2.1b SQLITE_CONSTRAINT_TRIGGER
6841a3bd0aSdrhdo_test trigger3-2.2 {
696f34903eSdanielk1977    execsql {
706f34903eSdanielk1977        SELECT * FROM tbl;
716f34903eSdanielk1977        ROLLBACK;
726f34903eSdanielk1977    }
736f34903eSdanielk1977} {5 5 6 2 5 6}
746f34903eSdanielk1977# ROLLBACK
7541a3bd0aSdrhdo_test trigger3-3.1 {
766f34903eSdanielk1977    catchsql {
776f34903eSdanielk1977        BEGIN;
786f34903eSdanielk1977        INSERT INTO tbl VALUES (5, 5, 6);
796f34903eSdanielk1977        INSERT INTO tbl VALUES (3, 5, 6);
806f34903eSdanielk1977    }
816f34903eSdanielk1977} {1 {Trigger rollback}}
82*433dccfbSdrhverify_ex_errcode trigger3-3.1b SQLITE_CONSTRAINT_TRIGGER
8341a3bd0aSdrhdo_test trigger3-3.2 {
846f34903eSdanielk1977    execsql {
856f34903eSdanielk1977        SELECT * FROM tbl;
866f34903eSdanielk1977    }
876f34903eSdanielk1977} {}
884154c223Sdrh
894154c223Sdrh# Verify that a ROLLBACK trigger works like a FAIL trigger if
904154c223Sdrh# we are not within a transaction.  Ticket #3035.
914154c223Sdrh#
924154c223Sdrhdo_test trigger3-3.3 {
934154c223Sdrh    catchsql {COMMIT}
944154c223Sdrh    catchsql {
954154c223Sdrh        INSERT INTO tbl VALUES (3, 9, 10);
964154c223Sdrh    }
974154c223Sdrh} {1 {Trigger rollback}}
98*433dccfbSdrhverify_ex_errcode trigger3-3.3b SQLITE_CONSTRAINT_TRIGGER
994154c223Sdrhdo_test trigger3-3.4 {
1004154c223Sdrh    execsql {SELECT * FROM tbl}
1014154c223Sdrh} {}
1024154c223Sdrh
1036f34903eSdanielk1977# IGNORE
10441a3bd0aSdrhdo_test trigger3-4.1 {
1056f34903eSdanielk1977    catchsql {
1066f34903eSdanielk1977        BEGIN;
1076f34903eSdanielk1977        INSERT INTO tbl VALUES (5, 5, 6);
1086f34903eSdanielk1977        INSERT INTO tbl VALUES (4, 5, 6);
1096f34903eSdanielk1977    }
1106f34903eSdanielk1977} {0 {}}
11141a3bd0aSdrhdo_test trigger3-4.2 {
1126f34903eSdanielk1977    execsql {
1136f34903eSdanielk1977        SELECT * FROM tbl;
1146f34903eSdanielk1977        ROLLBACK;
1156f34903eSdanielk1977    }
1166f34903eSdanielk1977} {5 5 6}
1176f34903eSdanielk1977
1186f34903eSdanielk1977# Check that we can also do RAISE(IGNORE) for UPDATE and DELETE
1196f34903eSdanielk1977execsql {DROP TABLE tbl;}
1206f34903eSdanielk1977execsql {CREATE TABLE tbl (a, b, c);}
1216f34903eSdanielk1977execsql {INSERT INTO tbl VALUES(1, 2, 3);}
1226f34903eSdanielk1977execsql {INSERT INTO tbl VALUES(4, 5, 6);}
1236f34903eSdanielk1977execsql {
1246f34903eSdanielk1977    CREATE TRIGGER before_tbl_update BEFORE UPDATE ON tbl BEGIN
1256f34903eSdanielk1977        SELECT CASE WHEN (old.a = 1) THEN RAISE(IGNORE) END;
1266f34903eSdanielk1977    END;
1276f34903eSdanielk1977
1286f34903eSdanielk1977    CREATE TRIGGER before_tbl_delete BEFORE DELETE ON tbl BEGIN
1296f34903eSdanielk1977        SELECT CASE WHEN (old.a = 1) THEN RAISE(IGNORE) END;
1306f34903eSdanielk1977    END;
1316f34903eSdanielk1977}
13241a3bd0aSdrhdo_test trigger3-5.1 {
1336f34903eSdanielk1977    execsql {
1346f34903eSdanielk1977        UPDATE tbl SET c = 10;
1356f34903eSdanielk1977        SELECT * FROM tbl;
1366f34903eSdanielk1977    }
1376f34903eSdanielk1977} {1 2 3 4 5 10}
13841a3bd0aSdrhdo_test trigger3-5.2 {
1396f34903eSdanielk1977    execsql {
1406f34903eSdanielk1977        DELETE FROM tbl;
1416f34903eSdanielk1977        SELECT * FROM tbl;
1426f34903eSdanielk1977    }
1436f34903eSdanielk1977} {1 2 3}
1446f34903eSdanielk1977
1456f34903eSdanielk1977# Check that RAISE(IGNORE) works correctly for nested triggers:
1466f34903eSdanielk1977execsql {CREATE TABLE tbl2(a, b, c)}
1476f34903eSdanielk1977execsql {
1486f34903eSdanielk1977    CREATE TRIGGER after_tbl2_insert AFTER INSERT ON tbl2 BEGIN
1496f34903eSdanielk1977        UPDATE tbl SET c = 10;
1506f34903eSdanielk1977        INSERT INTO tbl2 VALUES (new.a, new.b, new.c);
1516f34903eSdanielk1977    END;
1526f34903eSdanielk1977}
15341a3bd0aSdrhdo_test trigger3-6 {
1546f34903eSdanielk1977    execsql {
1556f34903eSdanielk1977        INSERT INTO tbl2 VALUES (1, 2, 3);
1566f34903eSdanielk1977        SELECT * FROM tbl2;
1576f34903eSdanielk1977        SELECT * FROM tbl;
1586f34903eSdanielk1977    }
1596f34903eSdanielk1977} {1 2 3 1 2 3 1 2 3}
1606f34903eSdanielk1977
1616f34903eSdanielk1977# Check that things also work for view-triggers
1620fa8ddbdSdanielk1977
1630fa8ddbdSdanielk1977ifcapable view {
1640fa8ddbdSdanielk1977
1656f34903eSdanielk1977execsql {CREATE VIEW tbl_view AS SELECT * FROM tbl}
1666f34903eSdanielk1977execsql {
1676f34903eSdanielk1977    CREATE TRIGGER tbl_view_insert INSTEAD OF INSERT ON tbl_view BEGIN
1686f34903eSdanielk1977        SELECT CASE WHEN (new.a = 1) THEN RAISE(ROLLBACK, 'View rollback')
1696f34903eSdanielk1977                    WHEN (new.a = 2) THEN RAISE(IGNORE)
1706f34903eSdanielk1977                    WHEN (new.a = 3) THEN RAISE(ABORT, 'View abort') END;
1716f34903eSdanielk1977    END;
1726f34903eSdanielk1977}
1736f34903eSdanielk1977
17441a3bd0aSdrhdo_test trigger3-7.1 {
1756f34903eSdanielk1977    catchsql {
1766f34903eSdanielk1977        INSERT INTO tbl_view VALUES(1, 2, 3);
1776f34903eSdanielk1977    }
1786f34903eSdanielk1977} {1 {View rollback}}
179*433dccfbSdrhverify_ex_errcode trigger3-7.1b SQLITE_CONSTRAINT_TRIGGER
18041a3bd0aSdrhdo_test trigger3-7.2 {
1816f34903eSdanielk1977    catchsql {
1826f34903eSdanielk1977        INSERT INTO tbl_view VALUES(2, 2, 3);
1836f34903eSdanielk1977    }
1846f34903eSdanielk1977} {0 {}}
18541a3bd0aSdrhdo_test trigger3-7.3 {
1866f34903eSdanielk1977    catchsql {
1876f34903eSdanielk1977        INSERT INTO tbl_view VALUES(3, 2, 3);
1886f34903eSdanielk1977    }
1896f34903eSdanielk1977} {1 {View abort}}
190*433dccfbSdrhverify_ex_errcode trigger3-7.3b SQLITE_CONSTRAINT_TRIGGER
1916f34903eSdanielk1977
1920fa8ddbdSdanielk1977} ;# ifcapable view
1930fa8ddbdSdanielk1977
194ed717fe3Sdrhintegrity_check trigger3-8.1
195ed717fe3Sdrh
1966f34903eSdanielk1977catchsql { DROP TABLE tbl; }
1976f34903eSdanielk1977catchsql { DROP TABLE tbl2; }
1986f34903eSdanielk1977catchsql { DROP VIEW tbl_view; }
1996f34903eSdanielk1977
200e0bc4048Sdrhfinish_test
201