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