xref: /illumos-gate/usr/src/lib/libsqlite/test/trigger3.test (revision 1da57d551424de5a9d469760be7c4b4d4f10a755)
1*1da57d55SToomas Soome#
2c5c4113dSnw141292# The author disclaims copyright to this source code.  In place of
3c5c4113dSnw141292# a legal notice, here is a blessing:
4c5c4113dSnw141292#
5c5c4113dSnw141292#    May you do good and not evil.
6c5c4113dSnw141292#    May you find forgiveness for yourself and forgive others.
7c5c4113dSnw141292#    May you share freely, never taking more than you give.
8c5c4113dSnw141292#
9c5c4113dSnw141292#***********************************************************************
10c5c4113dSnw141292#
11c5c4113dSnw141292# This file tests the RAISE() function.
12c5c4113dSnw141292#
13c5c4113dSnw141292
14c5c4113dSnw141292set testdir [file dirname $argv0]
15c5c4113dSnw141292source $testdir/tester.tcl
16c5c4113dSnw141292
17c5c4113dSnw141292# Test that we can cause ROLLBACK, FAIL and ABORT correctly
18c5c4113dSnw141292# catchsql { DROP TABLE tbl; }
19c5c4113dSnw141292catchsql { CREATE TABLE tbl (a, b, c) }
20c5c4113dSnw141292
21c5c4113dSnw141292execsql {
22c5c4113dSnw141292    CREATE TRIGGER before_tbl_insert BEFORE INSERT ON tbl BEGIN SELECT CASE
23c5c4113dSnw141292	WHEN (new.a = 4) THEN RAISE(IGNORE) END;
24c5c4113dSnw141292    END;
25c5c4113dSnw141292
26c5c4113dSnw141292    CREATE TRIGGER after_tbl_insert AFTER INSERT ON tbl BEGIN SELECT CASE
27c5c4113dSnw141292	WHEN (new.a = 1) THEN RAISE(ABORT,    'Trigger abort')
28c5c4113dSnw141292	WHEN (new.a = 2) THEN RAISE(FAIL,     'Trigger fail')
29c5c4113dSnw141292	WHEN (new.a = 3) THEN RAISE(ROLLBACK, 'Trigger rollback') END;
30c5c4113dSnw141292    END;
31c5c4113dSnw141292}
32c5c4113dSnw141292# ABORT
33c5c4113dSnw141292do_test trigger3-1.1 {
34c5c4113dSnw141292    catchsql {
35c5c4113dSnw141292	BEGIN;
36c5c4113dSnw141292        INSERT INTO tbl VALUES (5, 5, 6);
37c5c4113dSnw141292        INSERT INTO tbl VALUES (1, 5, 6);
38c5c4113dSnw141292    }
39c5c4113dSnw141292} {1 {Trigger abort}}
40c5c4113dSnw141292do_test trigger3-1.2 {
41c5c4113dSnw141292    execsql {
42c5c4113dSnw141292	SELECT * FROM tbl;
43c5c4113dSnw141292	ROLLBACK;
44c5c4113dSnw141292    }
45c5c4113dSnw141292} {5 5 6}
46c5c4113dSnw141292do_test trigger3-1.3 {
47c5c4113dSnw141292    execsql {SELECT * FROM tbl}
48c5c4113dSnw141292} {}
49c5c4113dSnw141292
50c5c4113dSnw141292# FAIL
51c5c4113dSnw141292do_test trigger3-2.1 {
52c5c4113dSnw141292    catchsql {
53c5c4113dSnw141292	BEGIN;
54c5c4113dSnw141292        INSERT INTO tbl VALUES (5, 5, 6);
55c5c4113dSnw141292        INSERT INTO tbl VALUES (2, 5, 6);
56c5c4113dSnw141292    }
57c5c4113dSnw141292} {1 {Trigger fail}}
58c5c4113dSnw141292do_test trigger3-2.2 {
59c5c4113dSnw141292    execsql {
60c5c4113dSnw141292	SELECT * FROM tbl;
61c5c4113dSnw141292	ROLLBACK;
62c5c4113dSnw141292    }
63c5c4113dSnw141292} {5 5 6 2 5 6}
64c5c4113dSnw141292# ROLLBACK
65c5c4113dSnw141292do_test trigger3-3.1 {
66c5c4113dSnw141292    catchsql {
67c5c4113dSnw141292	BEGIN;
68c5c4113dSnw141292        INSERT INTO tbl VALUES (5, 5, 6);
69c5c4113dSnw141292        INSERT INTO tbl VALUES (3, 5, 6);
70c5c4113dSnw141292    }
71c5c4113dSnw141292} {1 {Trigger rollback}}
72c5c4113dSnw141292do_test trigger3-3.2 {
73c5c4113dSnw141292    execsql {
74c5c4113dSnw141292	SELECT * FROM tbl;
75c5c4113dSnw141292    }
76c5c4113dSnw141292} {}
77c5c4113dSnw141292# IGNORE
78c5c4113dSnw141292do_test trigger3-4.1 {
79c5c4113dSnw141292    catchsql {
80c5c4113dSnw141292	BEGIN;
81c5c4113dSnw141292        INSERT INTO tbl VALUES (5, 5, 6);
82c5c4113dSnw141292        INSERT INTO tbl VALUES (4, 5, 6);
83c5c4113dSnw141292    }
84c5c4113dSnw141292} {0 {}}
85c5c4113dSnw141292do_test trigger3-4.2 {
86c5c4113dSnw141292    execsql {
87c5c4113dSnw141292	SELECT * FROM tbl;
88c5c4113dSnw141292	ROLLBACK;
89c5c4113dSnw141292    }
90c5c4113dSnw141292} {5 5 6}
91c5c4113dSnw141292
92c5c4113dSnw141292# Check that we can also do RAISE(IGNORE) for UPDATE and DELETE
93c5c4113dSnw141292execsql {DROP TABLE tbl;}
94c5c4113dSnw141292execsql {CREATE TABLE tbl (a, b, c);}
95c5c4113dSnw141292execsql {INSERT INTO tbl VALUES(1, 2, 3);}
96c5c4113dSnw141292execsql {INSERT INTO tbl VALUES(4, 5, 6);}
97c5c4113dSnw141292execsql {
98c5c4113dSnw141292    CREATE TRIGGER before_tbl_update BEFORE UPDATE ON tbl BEGIN
99c5c4113dSnw141292	SELECT CASE WHEN (old.a = 1) THEN RAISE(IGNORE) END;
100c5c4113dSnw141292    END;
101c5c4113dSnw141292
102c5c4113dSnw141292    CREATE TRIGGER before_tbl_delete BEFORE DELETE ON tbl BEGIN
103c5c4113dSnw141292	SELECT CASE WHEN (old.a = 1) THEN RAISE(IGNORE) END;
104c5c4113dSnw141292    END;
105c5c4113dSnw141292}
106c5c4113dSnw141292do_test trigger3-5.1 {
107c5c4113dSnw141292    execsql {
108c5c4113dSnw141292	UPDATE tbl SET c = 10;
109c5c4113dSnw141292	SELECT * FROM tbl;
110c5c4113dSnw141292    }
111c5c4113dSnw141292} {1 2 3 4 5 10}
112c5c4113dSnw141292do_test trigger3-5.2 {
113c5c4113dSnw141292    execsql {
114c5c4113dSnw141292	DELETE FROM tbl;
115c5c4113dSnw141292	SELECT * FROM tbl;
116c5c4113dSnw141292    }
117c5c4113dSnw141292} {1 2 3}
118c5c4113dSnw141292
119c5c4113dSnw141292# Check that RAISE(IGNORE) works correctly for nested triggers:
120c5c4113dSnw141292execsql {CREATE TABLE tbl2(a, b, c)}
121c5c4113dSnw141292execsql {
122c5c4113dSnw141292    CREATE TRIGGER after_tbl2_insert AFTER INSERT ON tbl2 BEGIN
123c5c4113dSnw141292	UPDATE tbl SET c = 10;
124c5c4113dSnw141292        INSERT INTO tbl2 VALUES (new.a, new.b, new.c);
125c5c4113dSnw141292    END;
126c5c4113dSnw141292}
127c5c4113dSnw141292do_test trigger3-6 {
128c5c4113dSnw141292    execsql {
129c5c4113dSnw141292	INSERT INTO tbl2 VALUES (1, 2, 3);
130c5c4113dSnw141292	SELECT * FROM tbl2;
131c5c4113dSnw141292	SELECT * FROM tbl;
132c5c4113dSnw141292    }
133c5c4113dSnw141292} {1 2 3 1 2 3 1 2 3}
134c5c4113dSnw141292
135c5c4113dSnw141292# Check that things also work for view-triggers
136c5c4113dSnw141292execsql {CREATE VIEW tbl_view AS SELECT * FROM tbl}
137c5c4113dSnw141292execsql {
138c5c4113dSnw141292    CREATE TRIGGER tbl_view_insert INSTEAD OF INSERT ON tbl_view BEGIN
139c5c4113dSnw141292	SELECT CASE WHEN (new.a = 1) THEN RAISE(ROLLBACK, 'View rollback')
140c5c4113dSnw141292	            WHEN (new.a = 2) THEN RAISE(IGNORE)
141c5c4113dSnw141292	            WHEN (new.a = 3) THEN RAISE(ABORT, 'View abort') END;
142c5c4113dSnw141292    END;
143c5c4113dSnw141292}
144c5c4113dSnw141292
145c5c4113dSnw141292do_test trigger3-7.1 {
146c5c4113dSnw141292    catchsql {
147c5c4113dSnw141292	INSERT INTO tbl_view VALUES(1, 2, 3);
148c5c4113dSnw141292    }
149c5c4113dSnw141292} {1 {View rollback}}
150c5c4113dSnw141292do_test trigger3-7.2 {
151c5c4113dSnw141292    catchsql {
152c5c4113dSnw141292	INSERT INTO tbl_view VALUES(2, 2, 3);
153c5c4113dSnw141292    }
154c5c4113dSnw141292} {0 {}}
155c5c4113dSnw141292do_test trigger3-7.3 {
156c5c4113dSnw141292    catchsql {
157c5c4113dSnw141292	INSERT INTO tbl_view VALUES(3, 2, 3);
158c5c4113dSnw141292    }
159c5c4113dSnw141292} {1 {View abort}}
160c5c4113dSnw141292
161c5c4113dSnw141292integrity_check trigger3-8.1
162c5c4113dSnw141292
163c5c4113dSnw141292catchsql { DROP TABLE tbl; }
164c5c4113dSnw141292catchsql { DROP TABLE tbl2; }
165c5c4113dSnw141292catchsql { DROP VIEW tbl_view; }
166c5c4113dSnw141292
167c5c4113dSnw141292finish_test
168