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