blob: 34d19700fc74bd2320724077095e2efdb43b1061 [file] [log] [blame]
danielk19776f349032002-06-11 02:25:40 +00001# 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
drh35d4c2f2004-06-10 01:30:59 +000013
danielk19776f349032002-06-11 02:25:40 +000014set testdir [file dirname $argv0]
15source $testdir/tester.tcl
drhb7f91642004-10-31 02:22:47 +000016ifcapable {!trigger} {
17 finish_test
18 return
19}
danielk19776f349032002-06-11 02:25:40 +000020
dan76d462e2009-08-30 11:42:51 +000021# 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.
dan5bde73c2009-09-01 17:11:07 +000024catchsql { pragma recursive_triggers = off }
danielk19776f349032002-06-11 02:25:40 +000025
dan76d462e2009-08-30 11:42:51 +000026# Test that we can cause ROLLBACK, FAIL and ABORT correctly
27#
28catchsql { CREATE TABLE tbl(a, b ,c) }
danielk19776f349032002-06-11 02:25:40 +000029execsql {
30 CREATE TRIGGER before_tbl_insert BEFORE INSERT ON tbl BEGIN SELECT CASE
dan1da40a32009-09-19 17:00:31 +000031 WHEN (new.a = 4) THEN RAISE(IGNORE) END;
danielk19776f349032002-06-11 02:25:40 +000032 END;
33
34 CREATE TRIGGER after_tbl_insert AFTER INSERT ON tbl BEGIN SELECT CASE
dan1da40a32009-09-19 17:00:31 +000035 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;
danielk19776f349032002-06-11 02:25:40 +000038 END;
39}
40# ABORT
drh41a3bd02002-09-14 12:04:56 +000041do_test trigger3-1.1 {
danielk19776f349032002-06-11 02:25:40 +000042 catchsql {
dan1da40a32009-09-19 17:00:31 +000043 BEGIN;
danielk19776f349032002-06-11 02:25:40 +000044 INSERT INTO tbl VALUES (5, 5, 6);
45 INSERT INTO tbl VALUES (1, 5, 6);
46 }
47} {1 {Trigger abort}}
drh41a3bd02002-09-14 12:04:56 +000048do_test trigger3-1.2 {
danielk19776f349032002-06-11 02:25:40 +000049 execsql {
dan1da40a32009-09-19 17:00:31 +000050 SELECT * FROM tbl;
51 ROLLBACK;
danielk19776f349032002-06-11 02:25:40 +000052 }
53} {5 5 6}
drhdb48ee02003-01-16 13:42:43 +000054do_test trigger3-1.3 {
55 execsql {SELECT * FROM tbl}
56} {}
danielk19776f349032002-06-11 02:25:40 +000057
58# FAIL
drh41a3bd02002-09-14 12:04:56 +000059do_test trigger3-2.1 {
danielk19776f349032002-06-11 02:25:40 +000060 catchsql {
dan76d462e2009-08-30 11:42:51 +000061 BEGIN;
danielk19776f349032002-06-11 02:25:40 +000062 INSERT INTO tbl VALUES (5, 5, 6);
63 INSERT INTO tbl VALUES (2, 5, 6);
64 }
65} {1 {Trigger fail}}
drh41a3bd02002-09-14 12:04:56 +000066do_test trigger3-2.2 {
danielk19776f349032002-06-11 02:25:40 +000067 execsql {
dan1da40a32009-09-19 17:00:31 +000068 SELECT * FROM tbl;
69 ROLLBACK;
danielk19776f349032002-06-11 02:25:40 +000070 }
71} {5 5 6 2 5 6}
72# ROLLBACK
drh41a3bd02002-09-14 12:04:56 +000073do_test trigger3-3.1 {
danielk19776f349032002-06-11 02:25:40 +000074 catchsql {
dan1da40a32009-09-19 17:00:31 +000075 BEGIN;
danielk19776f349032002-06-11 02:25:40 +000076 INSERT INTO tbl VALUES (5, 5, 6);
77 INSERT INTO tbl VALUES (3, 5, 6);
78 }
79} {1 {Trigger rollback}}
drh41a3bd02002-09-14 12:04:56 +000080do_test trigger3-3.2 {
danielk19776f349032002-06-11 02:25:40 +000081 execsql {
dan1da40a32009-09-19 17:00:31 +000082 SELECT * FROM tbl;
danielk19776f349032002-06-11 02:25:40 +000083 }
84} {}
drh4154c222008-04-10 15:12:45 +000085
86# Verify that a ROLLBACK trigger works like a FAIL trigger if
87# we are not within a transaction. Ticket #3035.
88#
89do_test trigger3-3.3 {
90 catchsql {COMMIT}
91 catchsql {
92 INSERT INTO tbl VALUES (3, 9, 10);
93 }
94} {1 {Trigger rollback}}
95do_test trigger3-3.4 {
96 execsql {SELECT * FROM tbl}
97} {}
98
danielk19776f349032002-06-11 02:25:40 +000099# IGNORE
drh41a3bd02002-09-14 12:04:56 +0000100do_test trigger3-4.1 {
danielk19776f349032002-06-11 02:25:40 +0000101 catchsql {
dan1da40a32009-09-19 17:00:31 +0000102 BEGIN;
danielk19776f349032002-06-11 02:25:40 +0000103 INSERT INTO tbl VALUES (5, 5, 6);
104 INSERT INTO tbl VALUES (4, 5, 6);
105 }
106} {0 {}}
drh41a3bd02002-09-14 12:04:56 +0000107do_test trigger3-4.2 {
danielk19776f349032002-06-11 02:25:40 +0000108 execsql {
dan1da40a32009-09-19 17:00:31 +0000109 SELECT * FROM tbl;
110 ROLLBACK;
danielk19776f349032002-06-11 02:25:40 +0000111 }
112} {5 5 6}
113
114# Check that we can also do RAISE(IGNORE) for UPDATE and DELETE
115execsql {DROP TABLE tbl;}
116execsql {CREATE TABLE tbl (a, b, c);}
117execsql {INSERT INTO tbl VALUES(1, 2, 3);}
118execsql {INSERT INTO tbl VALUES(4, 5, 6);}
119execsql {
120 CREATE TRIGGER before_tbl_update BEFORE UPDATE ON tbl BEGIN
dan1da40a32009-09-19 17:00:31 +0000121 SELECT CASE WHEN (old.a = 1) THEN RAISE(IGNORE) END;
danielk19776f349032002-06-11 02:25:40 +0000122 END;
123
124 CREATE TRIGGER before_tbl_delete BEFORE DELETE ON tbl BEGIN
dan1da40a32009-09-19 17:00:31 +0000125 SELECT CASE WHEN (old.a = 1) THEN RAISE(IGNORE) END;
danielk19776f349032002-06-11 02:25:40 +0000126 END;
127}
drh41a3bd02002-09-14 12:04:56 +0000128do_test trigger3-5.1 {
danielk19776f349032002-06-11 02:25:40 +0000129 execsql {
dan1da40a32009-09-19 17:00:31 +0000130 UPDATE tbl SET c = 10;
131 SELECT * FROM tbl;
danielk19776f349032002-06-11 02:25:40 +0000132 }
133} {1 2 3 4 5 10}
drh41a3bd02002-09-14 12:04:56 +0000134do_test trigger3-5.2 {
danielk19776f349032002-06-11 02:25:40 +0000135 execsql {
dan1da40a32009-09-19 17:00:31 +0000136 DELETE FROM tbl;
137 SELECT * FROM tbl;
danielk19776f349032002-06-11 02:25:40 +0000138 }
139} {1 2 3}
140
141# Check that RAISE(IGNORE) works correctly for nested triggers:
142execsql {CREATE TABLE tbl2(a, b, c)}
143execsql {
144 CREATE TRIGGER after_tbl2_insert AFTER INSERT ON tbl2 BEGIN
dan1da40a32009-09-19 17:00:31 +0000145 UPDATE tbl SET c = 10;
danielk19776f349032002-06-11 02:25:40 +0000146 INSERT INTO tbl2 VALUES (new.a, new.b, new.c);
147 END;
148}
drh41a3bd02002-09-14 12:04:56 +0000149do_test trigger3-6 {
danielk19776f349032002-06-11 02:25:40 +0000150 execsql {
dan1da40a32009-09-19 17:00:31 +0000151 INSERT INTO tbl2 VALUES (1, 2, 3);
152 SELECT * FROM tbl2;
153 SELECT * FROM tbl;
danielk19776f349032002-06-11 02:25:40 +0000154 }
155} {1 2 3 1 2 3 1 2 3}
156
157# Check that things also work for view-triggers
danielk19770fa8ddb2004-11-22 08:43:32 +0000158
159ifcapable view {
160
danielk19776f349032002-06-11 02:25:40 +0000161execsql {CREATE VIEW tbl_view AS SELECT * FROM tbl}
162execsql {
163 CREATE TRIGGER tbl_view_insert INSTEAD OF INSERT ON tbl_view BEGIN
dan1da40a32009-09-19 17:00:31 +0000164 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;
danielk19776f349032002-06-11 02:25:40 +0000167 END;
168}
169
drh41a3bd02002-09-14 12:04:56 +0000170do_test trigger3-7.1 {
danielk19776f349032002-06-11 02:25:40 +0000171 catchsql {
dan1da40a32009-09-19 17:00:31 +0000172 INSERT INTO tbl_view VALUES(1, 2, 3);
danielk19776f349032002-06-11 02:25:40 +0000173 }
174} {1 {View rollback}}
drh41a3bd02002-09-14 12:04:56 +0000175do_test trigger3-7.2 {
danielk19776f349032002-06-11 02:25:40 +0000176 catchsql {
dan1da40a32009-09-19 17:00:31 +0000177 INSERT INTO tbl_view VALUES(2, 2, 3);
danielk19776f349032002-06-11 02:25:40 +0000178 }
179} {0 {}}
drh41a3bd02002-09-14 12:04:56 +0000180do_test trigger3-7.3 {
danielk19776f349032002-06-11 02:25:40 +0000181 catchsql {
dan1da40a32009-09-19 17:00:31 +0000182 INSERT INTO tbl_view VALUES(3, 2, 3);
danielk19776f349032002-06-11 02:25:40 +0000183 }
184} {1 {View abort}}
185
danielk19770fa8ddb2004-11-22 08:43:32 +0000186} ;# ifcapable view
187
drhed717fe2003-06-15 23:42:24 +0000188integrity_check trigger3-8.1
189
danielk19776f349032002-06-11 02:25:40 +0000190catchsql { DROP TABLE tbl; }
191catchsql { DROP TABLE tbl2; }
drhe0bc4042002-06-25 01:09:11 +0000192catchsql { DROP VIEW tbl_view; }
danielk19776f349032002-06-11 02:25:40 +0000193
drhe0bc4042002-06-25 01:09:11 +0000194finish_test