blob: fe91b9dcf8e2a09fd13fbbe4e5d8516916770a8c [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}}
drh433dccf2013-02-09 15:37:11 +000048verify_ex_errcode trigger3-1.1b SQLITE_CONSTRAINT_TRIGGER
drh41a3bd02002-09-14 12:04:56 +000049do_test trigger3-1.2 {
danielk19776f349032002-06-11 02:25:40 +000050 execsql {
dan1da40a32009-09-19 17:00:31 +000051 SELECT * FROM tbl;
52 ROLLBACK;
danielk19776f349032002-06-11 02:25:40 +000053 }
54} {5 5 6}
drhdb48ee02003-01-16 13:42:43 +000055do_test trigger3-1.3 {
56 execsql {SELECT * FROM tbl}
57} {}
danielk19776f349032002-06-11 02:25:40 +000058
59# FAIL
drh41a3bd02002-09-14 12:04:56 +000060do_test trigger3-2.1 {
danielk19776f349032002-06-11 02:25:40 +000061 catchsql {
dan76d462e2009-08-30 11:42:51 +000062 BEGIN;
danielk19776f349032002-06-11 02:25:40 +000063 INSERT INTO tbl VALUES (5, 5, 6);
64 INSERT INTO tbl VALUES (2, 5, 6);
65 }
66} {1 {Trigger fail}}
drh433dccf2013-02-09 15:37:11 +000067verify_ex_errcode trigger3-2.1b SQLITE_CONSTRAINT_TRIGGER
drh41a3bd02002-09-14 12:04:56 +000068do_test trigger3-2.2 {
danielk19776f349032002-06-11 02:25:40 +000069 execsql {
dan1da40a32009-09-19 17:00:31 +000070 SELECT * FROM tbl;
71 ROLLBACK;
danielk19776f349032002-06-11 02:25:40 +000072 }
73} {5 5 6 2 5 6}
74# ROLLBACK
drh41a3bd02002-09-14 12:04:56 +000075do_test trigger3-3.1 {
danielk19776f349032002-06-11 02:25:40 +000076 catchsql {
dan1da40a32009-09-19 17:00:31 +000077 BEGIN;
danielk19776f349032002-06-11 02:25:40 +000078 INSERT INTO tbl VALUES (5, 5, 6);
79 INSERT INTO tbl VALUES (3, 5, 6);
80 }
81} {1 {Trigger rollback}}
drh433dccf2013-02-09 15:37:11 +000082verify_ex_errcode trigger3-3.1b SQLITE_CONSTRAINT_TRIGGER
drh41a3bd02002-09-14 12:04:56 +000083do_test trigger3-3.2 {
danielk19776f349032002-06-11 02:25:40 +000084 execsql {
dan1da40a32009-09-19 17:00:31 +000085 SELECT * FROM tbl;
danielk19776f349032002-06-11 02:25:40 +000086 }
87} {}
drh4154c222008-04-10 15:12:45 +000088
89# Verify that a ROLLBACK trigger works like a FAIL trigger if
90# we are not within a transaction. Ticket #3035.
91#
92do_test trigger3-3.3 {
93 catchsql {COMMIT}
94 catchsql {
95 INSERT INTO tbl VALUES (3, 9, 10);
96 }
97} {1 {Trigger rollback}}
drh433dccf2013-02-09 15:37:11 +000098verify_ex_errcode trigger3-3.3b SQLITE_CONSTRAINT_TRIGGER
drh4154c222008-04-10 15:12:45 +000099do_test trigger3-3.4 {
100 execsql {SELECT * FROM tbl}
101} {}
102
danielk19776f349032002-06-11 02:25:40 +0000103# IGNORE
drh41a3bd02002-09-14 12:04:56 +0000104do_test trigger3-4.1 {
danielk19776f349032002-06-11 02:25:40 +0000105 catchsql {
dan1da40a32009-09-19 17:00:31 +0000106 BEGIN;
danielk19776f349032002-06-11 02:25:40 +0000107 INSERT INTO tbl VALUES (5, 5, 6);
108 INSERT INTO tbl VALUES (4, 5, 6);
109 }
110} {0 {}}
drh41a3bd02002-09-14 12:04:56 +0000111do_test trigger3-4.2 {
danielk19776f349032002-06-11 02:25:40 +0000112 execsql {
dan1da40a32009-09-19 17:00:31 +0000113 SELECT * FROM tbl;
114 ROLLBACK;
danielk19776f349032002-06-11 02:25:40 +0000115 }
116} {5 5 6}
117
118# Check that we can also do RAISE(IGNORE) for UPDATE and DELETE
119execsql {DROP TABLE tbl;}
120execsql {CREATE TABLE tbl (a, b, c);}
121execsql {INSERT INTO tbl VALUES(1, 2, 3);}
122execsql {INSERT INTO tbl VALUES(4, 5, 6);}
123execsql {
124 CREATE TRIGGER before_tbl_update BEFORE UPDATE 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
128 CREATE TRIGGER before_tbl_delete BEFORE DELETE ON tbl BEGIN
dan1da40a32009-09-19 17:00:31 +0000129 SELECT CASE WHEN (old.a = 1) THEN RAISE(IGNORE) END;
danielk19776f349032002-06-11 02:25:40 +0000130 END;
131}
drh41a3bd02002-09-14 12:04:56 +0000132do_test trigger3-5.1 {
danielk19776f349032002-06-11 02:25:40 +0000133 execsql {
dan1da40a32009-09-19 17:00:31 +0000134 UPDATE tbl SET c = 10;
135 SELECT * FROM tbl;
danielk19776f349032002-06-11 02:25:40 +0000136 }
137} {1 2 3 4 5 10}
drh41a3bd02002-09-14 12:04:56 +0000138do_test trigger3-5.2 {
danielk19776f349032002-06-11 02:25:40 +0000139 execsql {
dan1da40a32009-09-19 17:00:31 +0000140 DELETE FROM tbl;
141 SELECT * FROM tbl;
danielk19776f349032002-06-11 02:25:40 +0000142 }
143} {1 2 3}
144
145# Check that RAISE(IGNORE) works correctly for nested triggers:
146execsql {CREATE TABLE tbl2(a, b, c)}
147execsql {
148 CREATE TRIGGER after_tbl2_insert AFTER INSERT ON tbl2 BEGIN
dan1da40a32009-09-19 17:00:31 +0000149 UPDATE tbl SET c = 10;
danielk19776f349032002-06-11 02:25:40 +0000150 INSERT INTO tbl2 VALUES (new.a, new.b, new.c);
151 END;
152}
drh41a3bd02002-09-14 12:04:56 +0000153do_test trigger3-6 {
danielk19776f349032002-06-11 02:25:40 +0000154 execsql {
dan1da40a32009-09-19 17:00:31 +0000155 INSERT INTO tbl2 VALUES (1, 2, 3);
156 SELECT * FROM tbl2;
157 SELECT * FROM tbl;
danielk19776f349032002-06-11 02:25:40 +0000158 }
159} {1 2 3 1 2 3 1 2 3}
160
161# Check that things also work for view-triggers
danielk19770fa8ddb2004-11-22 08:43:32 +0000162
163ifcapable view {
164
danielk19776f349032002-06-11 02:25:40 +0000165execsql {CREATE VIEW tbl_view AS SELECT * FROM tbl}
166execsql {
167 CREATE TRIGGER tbl_view_insert INSTEAD OF INSERT ON tbl_view BEGIN
dan1da40a32009-09-19 17:00:31 +0000168 SELECT CASE WHEN (new.a = 1) THEN RAISE(ROLLBACK, 'View rollback')
169 WHEN (new.a = 2) THEN RAISE(IGNORE)
170 WHEN (new.a = 3) THEN RAISE(ABORT, 'View abort') END;
danielk19776f349032002-06-11 02:25:40 +0000171 END;
172}
173
drh41a3bd02002-09-14 12:04:56 +0000174do_test trigger3-7.1 {
danielk19776f349032002-06-11 02:25:40 +0000175 catchsql {
dan1da40a32009-09-19 17:00:31 +0000176 INSERT INTO tbl_view VALUES(1, 2, 3);
danielk19776f349032002-06-11 02:25:40 +0000177 }
178} {1 {View rollback}}
drh433dccf2013-02-09 15:37:11 +0000179verify_ex_errcode trigger3-7.1b SQLITE_CONSTRAINT_TRIGGER
drh41a3bd02002-09-14 12:04:56 +0000180do_test trigger3-7.2 {
danielk19776f349032002-06-11 02:25:40 +0000181 catchsql {
dan1da40a32009-09-19 17:00:31 +0000182 INSERT INTO tbl_view VALUES(2, 2, 3);
danielk19776f349032002-06-11 02:25:40 +0000183 }
184} {0 {}}
drh41a3bd02002-09-14 12:04:56 +0000185do_test trigger3-7.3 {
danielk19776f349032002-06-11 02:25:40 +0000186 catchsql {
dan1da40a32009-09-19 17:00:31 +0000187 INSERT INTO tbl_view VALUES(3, 2, 3);
danielk19776f349032002-06-11 02:25:40 +0000188 }
189} {1 {View abort}}
drh433dccf2013-02-09 15:37:11 +0000190verify_ex_errcode trigger3-7.3b SQLITE_CONSTRAINT_TRIGGER
danielk19776f349032002-06-11 02:25:40 +0000191
danielk19770fa8ddb2004-11-22 08:43:32 +0000192} ;# ifcapable view
193
drhed717fe2003-06-15 23:42:24 +0000194integrity_check trigger3-8.1
195
danielk19776f349032002-06-11 02:25:40 +0000196catchsql { DROP TABLE tbl; }
197catchsql { DROP TABLE tbl2; }
drhe0bc4042002-06-25 01:09:11 +0000198catchsql { DROP VIEW tbl_view; }
danielk19776f349032002-06-11 02:25:40 +0000199
drhe0bc4042002-06-25 01:09:11 +0000200finish_test