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