1c3f9bad2Sdanielk1977# The author disclaims copyright to this source code. In place of 2c3f9bad2Sdanielk1977# a legal notice, here is a blessing: 3c3f9bad2Sdanielk1977# 4c3f9bad2Sdanielk1977# May you do good and not evil. 5c3f9bad2Sdanielk1977# May you find forgiveness for yourself and forgive others. 6c3f9bad2Sdanielk1977# May you share freely, never taking more than you give. 7c3f9bad2Sdanielk1977# 8c3f9bad2Sdanielk1977#*********************************************************************** 9c3f9bad2Sdanielk1977# 10c3f9bad2Sdanielk1977# Regression testing of FOR EACH ROW table triggers 11c3f9bad2Sdanielk1977# 12c3f9bad2Sdanielk1977# 1. Trigger execution order tests. 13c3f9bad2Sdanielk1977# These tests ensure that BEFORE and AFTER triggers are fired at the correct 14c3f9bad2Sdanielk1977# times relative to each other and the triggering statement. 15c3f9bad2Sdanielk1977# 1641a3bd0aSdrh# trigger2-1.1.*: ON UPDATE trigger execution model. 1741a3bd0aSdrh# trigger2-1.2.*: DELETE trigger execution model. 1841a3bd0aSdrh# trigger2-1.3.*: INSERT trigger execution model. 19c3f9bad2Sdanielk1977# 20c3f9bad2Sdanielk1977# 2. Trigger program execution tests. 21c3f9bad2Sdanielk1977# These tests ensure that trigger programs execute correctly (ie. that a 22c3f9bad2Sdanielk1977# trigger program can correctly execute INSERT, UPDATE, DELETE * SELECT 23c3f9bad2Sdanielk1977# statements, and combinations thereof). 24c3f9bad2Sdanielk1977# 25c3f9bad2Sdanielk1977# 3. Selective trigger execution 26c3f9bad2Sdanielk1977# This tests that conditional triggers (ie. UPDATE OF triggers and triggers 27c3f9bad2Sdanielk1977# with WHEN clauses) are fired only fired when they are supposed to be. 28c3f9bad2Sdanielk1977# 2941a3bd0aSdrh# trigger2-3.1: UPDATE OF triggers 3041a3bd0aSdrh# trigger2-3.2: WHEN clause 31c3f9bad2Sdanielk1977# 32c3f9bad2Sdanielk1977# 4. Cascaded trigger execution 33c3f9bad2Sdanielk1977# Tests that trigger-programs may cause other triggers to fire. Also that a 34c3f9bad2Sdanielk1977# trigger-program is never executed recursively. 35c3f9bad2Sdanielk1977# 3641a3bd0aSdrh# trigger2-4.1: Trivial cascading trigger 3741a3bd0aSdrh# trigger2-4.2: Trivial recursive trigger handling 38c3f9bad2Sdanielk1977# 39c3f9bad2Sdanielk1977# 5. Count changes behaviour. 40c3f9bad2Sdanielk1977# Verify that rows altered by triggers are not included in the return value 41c3f9bad2Sdanielk1977# of the "count changes" interface. 42c3f9bad2Sdanielk1977# 43c3f9bad2Sdanielk1977# 6. ON CONFLICT clause handling 4441a3bd0aSdrh# trigger2-6.1[a-f]: INSERT statements 4541a3bd0aSdrh# trigger2-6.2[a-f]: UPDATE statements 46c3f9bad2Sdanielk1977# 470fa8ddbdSdanielk1977# 7. & 8. Triggers on views fire correctly. 48c3f9bad2Sdanielk1977# 49c3f9bad2Sdanielk1977 50c3f9bad2Sdanielk1977set testdir [file dirname $argv0] 51c3f9bad2Sdanielk1977source $testdir/tester.tcl 52*fe599b05Sdanset testprefix trigger2 53b7f9164eSdrhifcapable {!trigger} { 54b7f9164eSdrh finish_test 55b7f9164eSdrh return 56b7f9164eSdrh} 57c3f9bad2Sdanielk1977 5876d462eeSdan# The tests in this file were written before SQLite supported recursive 5976d462eeSdan# trigger invocation, and some tests depend on that to pass. So disable 6076d462eeSdan# recursive triggers for this file. 615bde73c4Sdancatchsql { pragma recursive_triggers = off } 6276d462eeSdan 63c3f9bad2Sdanielk1977# 1. 64e61b9f4fSdanielk1977ifcapable subquery { 65c3f9bad2Sdanielk1977 set ii 0 6653c0f748Sdanielk1977 set tbl_definitions [list \ 6753c0f748Sdanielk1977 {CREATE TABLE tbl (a, b);} \ 6853c0f748Sdanielk1977 {CREATE TABLE tbl (a INTEGER PRIMARY KEY, b);} \ 6953c0f748Sdanielk1977 {CREATE TABLE tbl (a, b PRIMARY KEY);} \ 7053c0f748Sdanielk1977 {CREATE TABLE tbl (a, b); CREATE INDEX tbl_idx ON tbl(b);} \ 7153c0f748Sdanielk1977 ] 7253c0f748Sdanielk1977 ifcapable tempdb { 7353c0f748Sdanielk1977 lappend tbl_definitions \ 748bf8dc92Sdrh {CREATE TEMP TABLE tbl (a, b); CREATE INDEX tbl_idx ON tbl(b);} 7553c0f748Sdanielk1977 lappend tbl_definitions {CREATE TEMP TABLE tbl (a, b);} 7653c0f748Sdanielk1977 lappend tbl_definitions \ 7753c0f748Sdanielk1977 {CREATE TEMPORARY TABLE tbl (a INTEGER PRIMARY KEY, b);} 7853c0f748Sdanielk1977 } 7953c0f748Sdanielk1977 foreach tbl_defn $tbl_definitions { 80c3f9bad2Sdanielk1977 incr ii 81c3f9bad2Sdanielk1977 catchsql { DROP INDEX tbl_idx; } 82c3f9bad2Sdanielk1977 catchsql { 83c3f9bad2Sdanielk1977 DROP TABLE rlog; 84c3f9bad2Sdanielk1977 DROP TABLE clog; 85c3f9bad2Sdanielk1977 DROP TABLE tbl; 86c3f9bad2Sdanielk1977 DROP TABLE other_tbl; 87c3f9bad2Sdanielk1977 } 88c3f9bad2Sdanielk1977 89c3f9bad2Sdanielk1977 execsql $tbl_defn 90c3f9bad2Sdanielk1977 91c3f9bad2Sdanielk1977 execsql { 92c3f9bad2Sdanielk1977 INSERT INTO tbl VALUES(1, 2); 93c3f9bad2Sdanielk1977 INSERT INTO tbl VALUES(3, 4); 94c3f9bad2Sdanielk1977 95c3f9bad2Sdanielk1977 CREATE TABLE rlog (idx, old_a, old_b, db_sum_a, db_sum_b, new_a, new_b); 96c3f9bad2Sdanielk1977 CREATE TABLE clog (idx, old_a, old_b, db_sum_a, db_sum_b, new_a, new_b); 97c3f9bad2Sdanielk1977 98c3f9bad2Sdanielk1977 CREATE TRIGGER before_update_row BEFORE UPDATE ON tbl FOR EACH ROW 99c3f9bad2Sdanielk1977 BEGIN 100f5905aa7Sdrh INSERT INTO rlog VALUES ( (SELECT coalesce(max(idx),0) + 1 FROM rlog), 101c3f9bad2Sdanielk1977 old.a, old.b, 102c2bd913aSdrh (SELECT coalesce(sum(a),0) FROM tbl), 103c2bd913aSdrh (SELECT coalesce(sum(b),0) FROM tbl), 104c3f9bad2Sdanielk1977 new.a, new.b); 105c3f9bad2Sdanielk1977 END; 106c3f9bad2Sdanielk1977 107c3f9bad2Sdanielk1977 CREATE TRIGGER after_update_row AFTER UPDATE ON tbl FOR EACH ROW 108c3f9bad2Sdanielk1977 BEGIN 109f5905aa7Sdrh INSERT INTO rlog VALUES ( (SELECT coalesce(max(idx),0) + 1 FROM rlog), 110c3f9bad2Sdanielk1977 old.a, old.b, 111c2bd913aSdrh (SELECT coalesce(sum(a),0) FROM tbl), 112c2bd913aSdrh (SELECT coalesce(sum(b),0) FROM tbl), 113c3f9bad2Sdanielk1977 new.a, new.b); 114c3f9bad2Sdanielk1977 END; 115c3f9bad2Sdanielk1977 116c3f9bad2Sdanielk1977 CREATE TRIGGER conditional_update_row AFTER UPDATE ON tbl FOR EACH ROW 117c3f9bad2Sdanielk1977 WHEN old.a = 1 118c3f9bad2Sdanielk1977 BEGIN 119f5905aa7Sdrh INSERT INTO clog VALUES ( (SELECT coalesce(max(idx),0) + 1 FROM clog), 120c3f9bad2Sdanielk1977 old.a, old.b, 121c2bd913aSdrh (SELECT coalesce(sum(a),0) FROM tbl), 122c2bd913aSdrh (SELECT coalesce(sum(b),0) FROM tbl), 123c3f9bad2Sdanielk1977 new.a, new.b); 124c3f9bad2Sdanielk1977 END; 125c3f9bad2Sdanielk1977 } 126c3f9bad2Sdanielk1977 1278bf8dc92Sdrh do_test trigger2-1.$ii.1 { 12892febd92Sdrh set r {} 12992febd92Sdrh foreach v [execsql { 130c3f9bad2Sdanielk1977 UPDATE tbl SET a = a * 10, b = b * 10; 131c3f9bad2Sdanielk1977 SELECT * FROM rlog ORDER BY idx; 132c3f9bad2Sdanielk1977 SELECT * FROM clog ORDER BY idx; 13392febd92Sdrh }] { 13492febd92Sdrh lappend r [expr {int($v)}] 135c3f9bad2Sdanielk1977 } 13692febd92Sdrh set r 137c3f9bad2Sdanielk1977 } [list 1 1 2 4 6 10 20 \ 138c3f9bad2Sdanielk1977 2 1 2 13 24 10 20 \ 139c3f9bad2Sdanielk1977 3 3 4 13 24 30 40 \ 140c3f9bad2Sdanielk1977 4 3 4 40 60 30 40 \ 141c3f9bad2Sdanielk1977 1 1 2 13 24 10 20 ] 142c3f9bad2Sdanielk1977 143c3f9bad2Sdanielk1977 execsql { 144c3f9bad2Sdanielk1977 DELETE FROM rlog; 145c3f9bad2Sdanielk1977 DELETE FROM tbl; 146c3f9bad2Sdanielk1977 INSERT INTO tbl VALUES (100, 100); 147c3f9bad2Sdanielk1977 INSERT INTO tbl VALUES (300, 200); 148c3f9bad2Sdanielk1977 CREATE TRIGGER delete_before_row BEFORE DELETE ON tbl FOR EACH ROW 149c3f9bad2Sdanielk1977 BEGIN 150f5905aa7Sdrh INSERT INTO rlog VALUES ( (SELECT coalesce(max(idx),0) + 1 FROM rlog), 151c3f9bad2Sdanielk1977 old.a, old.b, 152c2bd913aSdrh (SELECT coalesce(sum(a),0) FROM tbl), 153c2bd913aSdrh (SELECT coalesce(sum(b),0) FROM tbl), 154c3f9bad2Sdanielk1977 0, 0); 155c3f9bad2Sdanielk1977 END; 156c3f9bad2Sdanielk1977 157c3f9bad2Sdanielk1977 CREATE TRIGGER delete_after_row AFTER DELETE ON tbl FOR EACH ROW 158c3f9bad2Sdanielk1977 BEGIN 159f5905aa7Sdrh INSERT INTO rlog VALUES ( (SELECT coalesce(max(idx),0) + 1 FROM rlog), 160c3f9bad2Sdanielk1977 old.a, old.b, 161c2bd913aSdrh (SELECT coalesce(sum(a),0) FROM tbl), 162c2bd913aSdrh (SELECT coalesce(sum(b),0) FROM tbl), 163c3f9bad2Sdanielk1977 0, 0); 164c3f9bad2Sdanielk1977 END; 165c3f9bad2Sdanielk1977 } 1668bf8dc92Sdrh do_test trigger2-1.$ii.2 { 16792febd92Sdrh set r {} 16892febd92Sdrh foreach v [execsql { 169c3f9bad2Sdanielk1977 DELETE FROM tbl; 170c3f9bad2Sdanielk1977 SELECT * FROM rlog; 17192febd92Sdrh }] { 17292febd92Sdrh lappend r [expr {int($v)}] 173c3f9bad2Sdanielk1977 } 17492febd92Sdrh set r 175c3f9bad2Sdanielk1977 } [list 1 100 100 400 300 0 0 \ 176c3f9bad2Sdanielk1977 2 100 100 300 200 0 0 \ 177c3f9bad2Sdanielk1977 3 300 200 300 200 0 0 \ 178c3f9bad2Sdanielk1977 4 300 200 0 0 0 0 ] 179c3f9bad2Sdanielk1977 180c3f9bad2Sdanielk1977 execsql { 181c3f9bad2Sdanielk1977 DELETE FROM rlog; 182c3f9bad2Sdanielk1977 CREATE TRIGGER insert_before_row BEFORE INSERT ON tbl FOR EACH ROW 183c3f9bad2Sdanielk1977 BEGIN 184f5905aa7Sdrh INSERT INTO rlog VALUES ( (SELECT coalesce(max(idx),0) + 1 FROM rlog), 185c3f9bad2Sdanielk1977 0, 0, 186c2bd913aSdrh (SELECT coalesce(sum(a),0) FROM tbl), 187c2bd913aSdrh (SELECT coalesce(sum(b),0) FROM tbl), 188c3f9bad2Sdanielk1977 new.a, new.b); 189c3f9bad2Sdanielk1977 END; 190c3f9bad2Sdanielk1977 191c3f9bad2Sdanielk1977 CREATE TRIGGER insert_after_row AFTER INSERT ON tbl FOR EACH ROW 192c3f9bad2Sdanielk1977 BEGIN 193f5905aa7Sdrh INSERT INTO rlog VALUES ( (SELECT coalesce(max(idx),0) + 1 FROM rlog), 194c3f9bad2Sdanielk1977 0, 0, 195c2bd913aSdrh (SELECT coalesce(sum(a),0) FROM tbl), 196c2bd913aSdrh (SELECT coalesce(sum(b),0) FROM tbl), 197c3f9bad2Sdanielk1977 new.a, new.b); 198c3f9bad2Sdanielk1977 END; 199c3f9bad2Sdanielk1977 } 2008bf8dc92Sdrh do_test trigger2-1.$ii.3 { 201c3f9bad2Sdanielk1977 execsql { 202c3f9bad2Sdanielk1977 203c3f9bad2Sdanielk1977 CREATE TABLE other_tbl(a, b); 204c3f9bad2Sdanielk1977 INSERT INTO other_tbl VALUES(1, 2); 205c3f9bad2Sdanielk1977 INSERT INTO other_tbl VALUES(3, 4); 206c3f9bad2Sdanielk1977 -- INSERT INTO tbl SELECT * FROM other_tbl; 207c3f9bad2Sdanielk1977 INSERT INTO tbl VALUES(5, 6); 208c3f9bad2Sdanielk1977 DROP TABLE other_tbl; 209c3f9bad2Sdanielk1977 210c3f9bad2Sdanielk1977 SELECT * FROM rlog; 211c3f9bad2Sdanielk1977 } 2123d1d95e6Sdrh } [list 1 0 0 0 0 5 6 \ 2133d1d95e6Sdrh 2 0 0 5 6 5 6 ] 2148bf8dc92Sdrh 21540e016e4Sdrh integrity_check trigger2-1.$ii.4 216c3f9bad2Sdanielk1977 } 217c3f9bad2Sdanielk1977 catchsql { 218c3f9bad2Sdanielk1977 DROP TABLE rlog; 219c3f9bad2Sdanielk1977 DROP TABLE clog; 220c3f9bad2Sdanielk1977 DROP TABLE tbl; 221c3f9bad2Sdanielk1977 DROP TABLE other_tbl; 222c3f9bad2Sdanielk1977 } 223e61b9f4fSdanielk1977} 224c3f9bad2Sdanielk1977 225c3f9bad2Sdanielk1977# 2. 226c3f9bad2Sdanielk1977set ii 0 2278bf8dc92Sdrhforeach tr_program { 2288bf8dc92Sdrh {UPDATE tbl SET b = old.b;} 2298bf8dc92Sdrh {INSERT INTO log VALUES(new.c, 2, 3);} 2308bf8dc92Sdrh {DELETE FROM log WHERE a = 1;} 231c3f9bad2Sdanielk1977 {INSERT INTO tbl VALUES(500, new.b * 10, 700); 232c3f9bad2Sdanielk1977 UPDATE tbl SET c = old.c; 2338bf8dc92Sdrh DELETE FROM log;} 234c3f9bad2Sdanielk1977 {INSERT INTO log select * from tbl;} 2358bf8dc92Sdrh} { 236c3f9bad2Sdanielk1977 foreach test_varset [ list \ 237c3f9bad2Sdanielk1977 { 238c3f9bad2Sdanielk1977 set statement {UPDATE tbl SET c = 10 WHERE a = 1;} 239c3f9bad2Sdanielk1977 set prep {INSERT INTO tbl VALUES(1, 2, 3);} 240c3f9bad2Sdanielk1977 set newC 10 241c3f9bad2Sdanielk1977 set newB 2 242c3f9bad2Sdanielk1977 set newA 1 243c3f9bad2Sdanielk1977 set oldA 1 244c3f9bad2Sdanielk1977 set oldB 2 245c3f9bad2Sdanielk1977 set oldC 3 246c3f9bad2Sdanielk1977 } \ 247c3f9bad2Sdanielk1977 { 248c3f9bad2Sdanielk1977 set statement {DELETE FROM tbl WHERE a = 1;} 249c3f9bad2Sdanielk1977 set prep {INSERT INTO tbl VALUES(1, 2, 3);} 250c3f9bad2Sdanielk1977 set oldA 1 251c3f9bad2Sdanielk1977 set oldB 2 252c3f9bad2Sdanielk1977 set oldC 3 253c3f9bad2Sdanielk1977 } \ 254c3f9bad2Sdanielk1977 { 255c3f9bad2Sdanielk1977 set statement {INSERT INTO tbl VALUES(1, 2, 3);} 256c3f9bad2Sdanielk1977 set newA 1 257c3f9bad2Sdanielk1977 set newB 2 258c3f9bad2Sdanielk1977 set newC 3 259c3f9bad2Sdanielk1977 } 260c3f9bad2Sdanielk1977 ] \ 261c3f9bad2Sdanielk1977 { 262c3f9bad2Sdanielk1977 set statement {} 263c3f9bad2Sdanielk1977 set prep {} 264c3f9bad2Sdanielk1977 set newA {''} 265c3f9bad2Sdanielk1977 set newB {''} 266c3f9bad2Sdanielk1977 set newC {''} 267c3f9bad2Sdanielk1977 set oldA {''} 268c3f9bad2Sdanielk1977 set oldB {''} 269c3f9bad2Sdanielk1977 set oldC {''} 270c3f9bad2Sdanielk1977 271c3f9bad2Sdanielk1977 incr ii 272c3f9bad2Sdanielk1977 273c3f9bad2Sdanielk1977 eval $test_varset 274c3f9bad2Sdanielk1977 275c3f9bad2Sdanielk1977 set statement_type [string range $statement 0 5] 276c3f9bad2Sdanielk1977 set tr_program_fixed $tr_program 277c3f9bad2Sdanielk1977 if {$statement_type == "DELETE"} { 278c3f9bad2Sdanielk1977 regsub -all new\.a $tr_program_fixed {''} tr_program_fixed 279c3f9bad2Sdanielk1977 regsub -all new\.b $tr_program_fixed {''} tr_program_fixed 280c3f9bad2Sdanielk1977 regsub -all new\.c $tr_program_fixed {''} tr_program_fixed 281c3f9bad2Sdanielk1977 } 282c3f9bad2Sdanielk1977 if {$statement_type == "INSERT"} { 283c3f9bad2Sdanielk1977 regsub -all old\.a $tr_program_fixed {''} tr_program_fixed 284c3f9bad2Sdanielk1977 regsub -all old\.b $tr_program_fixed {''} tr_program_fixed 285c3f9bad2Sdanielk1977 regsub -all old\.c $tr_program_fixed {''} tr_program_fixed 286c3f9bad2Sdanielk1977 } 287c3f9bad2Sdanielk1977 288c3f9bad2Sdanielk1977 289c3f9bad2Sdanielk1977 set tr_program_cooked $tr_program 290c3f9bad2Sdanielk1977 regsub -all new\.a $tr_program_cooked $newA tr_program_cooked 291c3f9bad2Sdanielk1977 regsub -all new\.b $tr_program_cooked $newB tr_program_cooked 292c3f9bad2Sdanielk1977 regsub -all new\.c $tr_program_cooked $newC tr_program_cooked 293c3f9bad2Sdanielk1977 regsub -all old\.a $tr_program_cooked $oldA tr_program_cooked 294c3f9bad2Sdanielk1977 regsub -all old\.b $tr_program_cooked $oldB tr_program_cooked 295c3f9bad2Sdanielk1977 regsub -all old\.c $tr_program_cooked $oldC tr_program_cooked 296c3f9bad2Sdanielk1977 297c3f9bad2Sdanielk1977 catchsql { 298c3f9bad2Sdanielk1977 DROP TABLE tbl; 299c3f9bad2Sdanielk1977 DROP TABLE log; 300c3f9bad2Sdanielk1977 } 3018bf8dc92Sdrh 302c3f9bad2Sdanielk1977 execsql { 303c3f9bad2Sdanielk1977 CREATE TABLE tbl(a PRIMARY KEY, b, c); 304c3f9bad2Sdanielk1977 CREATE TABLE log(a, b, c); 305c3f9bad2Sdanielk1977 } 306c3f9bad2Sdanielk1977 307c3f9bad2Sdanielk1977 set query {SELECT * FROM tbl; SELECT * FROM log;} 3088bf8dc92Sdrh set prep "$prep; INSERT INTO log VALUES(1, 2, 3);\ 3098bf8dc92Sdrh INSERT INTO log VALUES(10, 20, 30);" 310c3f9bad2Sdanielk1977 311c3f9bad2Sdanielk1977# Check execution of BEFORE programs: 312c3f9bad2Sdanielk1977 313c3f9bad2Sdanielk1977 set before_data [ execsql "$prep $tr_program_cooked $statement $query" ] 314c3f9bad2Sdanielk1977 315c3f9bad2Sdanielk1977 execsql "DELETE FROM tbl; DELETE FROM log; $prep"; 3168bf8dc92Sdrh execsql "CREATE TRIGGER the_trigger BEFORE [string range $statement 0 6]\ 3178bf8dc92Sdrh ON tbl BEGIN $tr_program_fixed END;" 318c3f9bad2Sdanielk1977 3198bf8dc92Sdrh do_test trigger2-2.$ii-before "execsql {$statement $query}" $before_data 320c3f9bad2Sdanielk1977 321c3f9bad2Sdanielk1977 execsql "DROP TRIGGER the_trigger;" 322c3f9bad2Sdanielk1977 execsql "DELETE FROM tbl; DELETE FROM log;" 323c3f9bad2Sdanielk1977 324c3f9bad2Sdanielk1977# Check execution of AFTER programs 325c3f9bad2Sdanielk1977 set after_data [ execsql "$prep $statement $tr_program_cooked $query" ] 326c3f9bad2Sdanielk1977 327c3f9bad2Sdanielk1977 execsql "DELETE FROM tbl; DELETE FROM log; $prep"; 3288bf8dc92Sdrh execsql "CREATE TRIGGER the_trigger AFTER [string range $statement 0 6]\ 3298bf8dc92Sdrh ON tbl BEGIN $tr_program_fixed END;" 330c3f9bad2Sdanielk1977 3318bf8dc92Sdrh do_test trigger2-2.$ii-after "execsql {$statement $query}" $after_data 332c3f9bad2Sdanielk1977 execsql "DROP TRIGGER the_trigger;" 3338bf8dc92Sdrh 33440e016e4Sdrh integrity_check trigger2-2.$ii-integrity 335c3f9bad2Sdanielk1977 } 336c3f9bad2Sdanielk1977} 337c3f9bad2Sdanielk1977catchsql { 338c3f9bad2Sdanielk1977 DROP TABLE tbl; 339c3f9bad2Sdanielk1977 DROP TABLE log; 340c3f9bad2Sdanielk1977} 341c3f9bad2Sdanielk1977 342c3f9bad2Sdanielk1977# 3. 343c3f9bad2Sdanielk1977 34441a3bd0aSdrh# trigger2-3.1: UPDATE OF triggers 345c3f9bad2Sdanielk1977execsql { 346c3f9bad2Sdanielk1977 CREATE TABLE tbl (a, b, c, d); 347c3f9bad2Sdanielk1977 CREATE TABLE log (a); 348c3f9bad2Sdanielk1977 INSERT INTO log VALUES (0); 349c3f9bad2Sdanielk1977 INSERT INTO tbl VALUES (0, 0, 0, 0); 350c3f9bad2Sdanielk1977 INSERT INTO tbl VALUES (1, 0, 0, 0); 351c3f9bad2Sdanielk1977 CREATE TRIGGER tbl_after_update_cd BEFORE UPDATE OF c, d ON tbl 352c3f9bad2Sdanielk1977 BEGIN 353c3f9bad2Sdanielk1977 UPDATE log SET a = a + 1; 354c3f9bad2Sdanielk1977 END; 355c3f9bad2Sdanielk1977} 35641a3bd0aSdrhdo_test trigger2-3.1 { 357c3f9bad2Sdanielk1977 execsql { 358c3f9bad2Sdanielk1977 UPDATE tbl SET b = 1, c = 10; -- 2 359c3f9bad2Sdanielk1977 UPDATE tbl SET b = 10; -- 0 360c3f9bad2Sdanielk1977 UPDATE tbl SET d = 4 WHERE a = 0; --1 361c3f9bad2Sdanielk1977 UPDATE tbl SET a = 4, b = 10; --0 362c3f9bad2Sdanielk1977 SELECT * FROM log; 363c3f9bad2Sdanielk1977 } 364c3f9bad2Sdanielk1977} {3} 365c3f9bad2Sdanielk1977execsql { 366c3f9bad2Sdanielk1977 DROP TABLE tbl; 367c3f9bad2Sdanielk1977 DROP TABLE log; 368c3f9bad2Sdanielk1977} 369c3f9bad2Sdanielk1977 37041a3bd0aSdrh# trigger2-3.2: WHEN clause 371e61b9f4fSdanielk1977set when_triggers [list {t1 BEFORE INSERT ON tbl WHEN new.a > 20}] 372e61b9f4fSdanielk1977ifcapable subquery { 373e61b9f4fSdanielk1977 lappend when_triggers \ 3747bf56610Sdrh {t2 BEFORE INSERT ON tbl WHEN (SELECT count(*) FROM tbl) = 0} 375e61b9f4fSdanielk1977} 376c3f9bad2Sdanielk1977 377c3f9bad2Sdanielk1977execsql { 378c3f9bad2Sdanielk1977 CREATE TABLE tbl (a, b, c, d); 379c3f9bad2Sdanielk1977 CREATE TABLE log (a); 380c3f9bad2Sdanielk1977 INSERT INTO log VALUES (0); 381c3f9bad2Sdanielk1977} 382c3f9bad2Sdanielk1977 383c3f9bad2Sdanielk1977foreach trig $when_triggers { 384c3f9bad2Sdanielk1977 execsql "CREATE TRIGGER $trig BEGIN UPDATE log set a = a + 1; END;" 385c3f9bad2Sdanielk1977} 386c3f9bad2Sdanielk1977 387e61b9f4fSdanielk1977ifcapable subquery { 388e61b9f4fSdanielk1977 set t232 {1 0 1} 389e61b9f4fSdanielk1977} else { 390e61b9f4fSdanielk1977 set t232 {0 0 1} 391e61b9f4fSdanielk1977} 39241a3bd0aSdrhdo_test trigger2-3.2 { 393c3f9bad2Sdanielk1977 execsql { 394c3f9bad2Sdanielk1977 395e61b9f4fSdanielk1977 INSERT INTO tbl VALUES(0, 0, 0, 0); -- 1 (ifcapable subquery) 396c3f9bad2Sdanielk1977 SELECT * FROM log; 397c3f9bad2Sdanielk1977 UPDATE log SET a = 0; 398c3f9bad2Sdanielk1977 399c3f9bad2Sdanielk1977 INSERT INTO tbl VALUES(0, 0, 0, 0); -- 0 400c3f9bad2Sdanielk1977 SELECT * FROM log; 401c3f9bad2Sdanielk1977 UPDATE log SET a = 0; 402c3f9bad2Sdanielk1977 403c3f9bad2Sdanielk1977 INSERT INTO tbl VALUES(200, 0, 0, 0); -- 1 404c3f9bad2Sdanielk1977 SELECT * FROM log; 405c3f9bad2Sdanielk1977 UPDATE log SET a = 0; 406c3f9bad2Sdanielk1977 } 407e61b9f4fSdanielk1977} $t232 408c3f9bad2Sdanielk1977execsql { 409c3f9bad2Sdanielk1977 DROP TABLE tbl; 410c3f9bad2Sdanielk1977 DROP TABLE log; 411c3f9bad2Sdanielk1977} 41240e016e4Sdrhintegrity_check trigger2-3.3 413c3f9bad2Sdanielk1977 414c3f9bad2Sdanielk1977# Simple cascaded trigger 415c3f9bad2Sdanielk1977execsql { 416c3f9bad2Sdanielk1977 CREATE TABLE tblA(a, b); 417c3f9bad2Sdanielk1977 CREATE TABLE tblB(a, b); 418c3f9bad2Sdanielk1977 CREATE TABLE tblC(a, b); 419c3f9bad2Sdanielk1977 420c3f9bad2Sdanielk1977 CREATE TRIGGER tr1 BEFORE INSERT ON tblA BEGIN 421c3f9bad2Sdanielk1977 INSERT INTO tblB values(new.a, new.b); 422c3f9bad2Sdanielk1977 END; 423c3f9bad2Sdanielk1977 424c3f9bad2Sdanielk1977 CREATE TRIGGER tr2 BEFORE INSERT ON tblB BEGIN 425c3f9bad2Sdanielk1977 INSERT INTO tblC values(new.a, new.b); 426c3f9bad2Sdanielk1977 END; 427c3f9bad2Sdanielk1977} 42841a3bd0aSdrhdo_test trigger2-4.1 { 429c3f9bad2Sdanielk1977 execsql { 430c3f9bad2Sdanielk1977 INSERT INTO tblA values(1, 2); 431c3f9bad2Sdanielk1977 SELECT * FROM tblA; 432c3f9bad2Sdanielk1977 SELECT * FROM tblB; 433c3f9bad2Sdanielk1977 SELECT * FROM tblC; 434c3f9bad2Sdanielk1977 } 435c3f9bad2Sdanielk1977} {1 2 1 2 1 2} 436c3f9bad2Sdanielk1977execsql { 437c3f9bad2Sdanielk1977 DROP TABLE tblA; 438c3f9bad2Sdanielk1977 DROP TABLE tblB; 439c3f9bad2Sdanielk1977 DROP TABLE tblC; 440c3f9bad2Sdanielk1977} 441c3f9bad2Sdanielk1977 442c3f9bad2Sdanielk1977# Simple recursive trigger 443c3f9bad2Sdanielk1977execsql { 444c3f9bad2Sdanielk1977 CREATE TABLE tbl(a, b, c); 445c3f9bad2Sdanielk1977 CREATE TRIGGER tbl_trig BEFORE INSERT ON tbl 446c3f9bad2Sdanielk1977 BEGIN 447c3f9bad2Sdanielk1977 INSERT INTO tbl VALUES (new.a, new.b, new.c); 448c3f9bad2Sdanielk1977 END; 449c3f9bad2Sdanielk1977} 45041a3bd0aSdrhdo_test trigger2-4.2 { 451c3f9bad2Sdanielk1977 execsql { 452c3f9bad2Sdanielk1977 INSERT INTO tbl VALUES (1, 2, 3); 453c3f9bad2Sdanielk1977 select * from tbl; 454c3f9bad2Sdanielk1977 } 455c3f9bad2Sdanielk1977} {1 2 3 1 2 3} 456c3f9bad2Sdanielk1977execsql { 457c3f9bad2Sdanielk1977 DROP TABLE tbl; 458c3f9bad2Sdanielk1977} 459c3f9bad2Sdanielk1977 460c3f9bad2Sdanielk1977# 5. 461c3f9bad2Sdanielk1977execsql { 462c3f9bad2Sdanielk1977 CREATE TABLE tbl(a, b, c); 463c3f9bad2Sdanielk1977 CREATE TRIGGER tbl_trig BEFORE INSERT ON tbl 464c3f9bad2Sdanielk1977 BEGIN 465c3f9bad2Sdanielk1977 INSERT INTO tbl VALUES (1, 2, 3); 466c3f9bad2Sdanielk1977 INSERT INTO tbl VALUES (2, 2, 3); 467c3f9bad2Sdanielk1977 UPDATE tbl set b = 10 WHERE a = 1; 468c3f9bad2Sdanielk1977 DELETE FROM tbl WHERE a = 1; 469c3f9bad2Sdanielk1977 DELETE FROM tbl; 470c3f9bad2Sdanielk1977 END; 471c3f9bad2Sdanielk1977} 47241a3bd0aSdrhdo_test trigger2-5 { 473c3f9bad2Sdanielk1977 execsql { 474c3f9bad2Sdanielk1977 INSERT INTO tbl VALUES(100, 200, 300); 475c3f9bad2Sdanielk1977 } 476c3f9bad2Sdanielk1977 db changes 477c3f9bad2Sdanielk1977} {1} 478c3f9bad2Sdanielk1977execsql { 479c3f9bad2Sdanielk1977 DROP TABLE tbl; 480c3f9bad2Sdanielk1977} 481c3f9bad2Sdanielk1977 4823bdca9c9Sdanielk1977ifcapable conflict { 483c3f9bad2Sdanielk1977 # Handling of ON CONFLICT by INSERT statements inside triggers 484c3f9bad2Sdanielk1977 execsql { 485c3f9bad2Sdanielk1977 CREATE TABLE tbl (a primary key, b, c); 486c3f9bad2Sdanielk1977 CREATE TRIGGER ai_tbl AFTER INSERT ON tbl BEGIN 487c3f9bad2Sdanielk1977 INSERT OR IGNORE INTO tbl values (new.a, 0, 0); 488c3f9bad2Sdanielk1977 END; 489c3f9bad2Sdanielk1977 } 49041a3bd0aSdrh do_test trigger2-6.1a { 491c3f9bad2Sdanielk1977 execsql { 492c3f9bad2Sdanielk1977 BEGIN; 493c3f9bad2Sdanielk1977 INSERT INTO tbl values (1, 2, 3); 494c3f9bad2Sdanielk1977 SELECT * from tbl; 495c3f9bad2Sdanielk1977 } 496c3f9bad2Sdanielk1977 } {1 2 3} 49741a3bd0aSdrh do_test trigger2-6.1b { 498c3f9bad2Sdanielk1977 catchsql { 499c3f9bad2Sdanielk1977 INSERT OR ABORT INTO tbl values (2, 2, 3); 500c3f9bad2Sdanielk1977 } 501f9c8ce3cSdrh } {1 {UNIQUE constraint failed: tbl.a}} 50241a3bd0aSdrh do_test trigger2-6.1c { 503c3f9bad2Sdanielk1977 execsql { 504c3f9bad2Sdanielk1977 SELECT * from tbl; 505c3f9bad2Sdanielk1977 } 506c3f9bad2Sdanielk1977 } {1 2 3} 50741a3bd0aSdrh do_test trigger2-6.1d { 508c3f9bad2Sdanielk1977 catchsql { 509c3f9bad2Sdanielk1977 INSERT OR FAIL INTO tbl values (2, 2, 3); 510c3f9bad2Sdanielk1977 } 511f9c8ce3cSdrh } {1 {UNIQUE constraint failed: tbl.a}} 51241a3bd0aSdrh do_test trigger2-6.1e { 513c3f9bad2Sdanielk1977 execsql { 514c3f9bad2Sdanielk1977 SELECT * from tbl; 515c3f9bad2Sdanielk1977 } 516c3f9bad2Sdanielk1977 } {1 2 3 2 2 3} 51741a3bd0aSdrh do_test trigger2-6.1f { 518c3f9bad2Sdanielk1977 execsql { 519c3f9bad2Sdanielk1977 INSERT OR REPLACE INTO tbl values (2, 2, 3); 520c3f9bad2Sdanielk1977 SELECT * from tbl; 521c3f9bad2Sdanielk1977 } 522c3f9bad2Sdanielk1977 } {1 2 3 2 0 0} 52341a3bd0aSdrh do_test trigger2-6.1g { 524c3f9bad2Sdanielk1977 catchsql { 525c3f9bad2Sdanielk1977 INSERT OR ROLLBACK INTO tbl values (3, 2, 3); 526c3f9bad2Sdanielk1977 } 527f9c8ce3cSdrh } {1 {UNIQUE constraint failed: tbl.a}} 52841a3bd0aSdrh do_test trigger2-6.1h { 529c3f9bad2Sdanielk1977 execsql { 530c3f9bad2Sdanielk1977 SELECT * from tbl; 531c3f9bad2Sdanielk1977 } 532c3f9bad2Sdanielk1977 } {} 5334303feedSdrh execsql {DELETE FROM tbl} 534c3f9bad2Sdanielk1977 535c3f9bad2Sdanielk1977 536c3f9bad2Sdanielk1977 # Handling of ON CONFLICT by UPDATE statements inside triggers 537c3f9bad2Sdanielk1977 execsql { 538c3f9bad2Sdanielk1977 INSERT INTO tbl values (4, 2, 3); 539c3f9bad2Sdanielk1977 INSERT INTO tbl values (6, 3, 4); 540c3f9bad2Sdanielk1977 CREATE TRIGGER au_tbl AFTER UPDATE ON tbl BEGIN 541c3f9bad2Sdanielk1977 UPDATE OR IGNORE tbl SET a = new.a, c = 10; 542c3f9bad2Sdanielk1977 END; 543c3f9bad2Sdanielk1977 } 54441a3bd0aSdrh do_test trigger2-6.2a { 545c3f9bad2Sdanielk1977 execsql { 546c3f9bad2Sdanielk1977 BEGIN; 547c3f9bad2Sdanielk1977 UPDATE tbl SET a = 1 WHERE a = 4; 548c3f9bad2Sdanielk1977 SELECT * from tbl; 549c3f9bad2Sdanielk1977 } 550c3f9bad2Sdanielk1977 } {1 2 10 6 3 4} 55141a3bd0aSdrh do_test trigger2-6.2b { 552c3f9bad2Sdanielk1977 catchsql { 553c3f9bad2Sdanielk1977 UPDATE OR ABORT tbl SET a = 4 WHERE a = 1; 554c3f9bad2Sdanielk1977 } 555f9c8ce3cSdrh } {1 {UNIQUE constraint failed: tbl.a}} 55641a3bd0aSdrh do_test trigger2-6.2c { 557c3f9bad2Sdanielk1977 execsql { 558c3f9bad2Sdanielk1977 SELECT * from tbl; 559c3f9bad2Sdanielk1977 } 560c3f9bad2Sdanielk1977 } {1 2 10 6 3 4} 56141a3bd0aSdrh do_test trigger2-6.2d { 562c3f9bad2Sdanielk1977 catchsql { 563c3f9bad2Sdanielk1977 UPDATE OR FAIL tbl SET a = 4 WHERE a = 1; 564c3f9bad2Sdanielk1977 } 565f9c8ce3cSdrh } {1 {UNIQUE constraint failed: tbl.a}} 56641a3bd0aSdrh do_test trigger2-6.2e { 567c3f9bad2Sdanielk1977 execsql { 568c3f9bad2Sdanielk1977 SELECT * from tbl; 569c3f9bad2Sdanielk1977 } 570c3f9bad2Sdanielk1977 } {4 2 10 6 3 4} 5714303feedSdrh do_test trigger2-6.2f.1 { 572c3f9bad2Sdanielk1977 execsql { 573c3f9bad2Sdanielk1977 UPDATE OR REPLACE tbl SET a = 1 WHERE a = 4; 574c3f9bad2Sdanielk1977 SELECT * from tbl; 575c3f9bad2Sdanielk1977 } 576c3f9bad2Sdanielk1977 } {1 3 10} 5774303feedSdrh do_test trigger2-6.2f.2 { 578c3f9bad2Sdanielk1977 execsql { 579c3f9bad2Sdanielk1977 INSERT INTO tbl VALUES (2, 3, 4); 5804303feedSdrh SELECT * FROM tbl; 581c3f9bad2Sdanielk1977 } 5824303feedSdrh } {1 3 10 2 3 4} 58341a3bd0aSdrh do_test trigger2-6.2g { 584c3f9bad2Sdanielk1977 catchsql { 585c3f9bad2Sdanielk1977 UPDATE OR ROLLBACK tbl SET a = 4 WHERE a = 1; 586c3f9bad2Sdanielk1977 } 587f9c8ce3cSdrh } {1 {UNIQUE constraint failed: tbl.a}} 58841a3bd0aSdrh do_test trigger2-6.2h { 589c3f9bad2Sdanielk1977 execsql { 590c3f9bad2Sdanielk1977 SELECT * from tbl; 591c3f9bad2Sdanielk1977 } 592c3f9bad2Sdanielk1977 } {4 2 3 6 3 4} 593c3f9bad2Sdanielk1977 execsql { 594c3f9bad2Sdanielk1977 DROP TABLE tbl; 595c3f9bad2Sdanielk1977 } 5963bdca9c9Sdanielk1977} ; # ifcapable conflict 597c3f9bad2Sdanielk1977 598c3f9bad2Sdanielk1977# 7. Triggers on views 5990fa8ddbdSdanielk1977ifcapable view { 6000fa8ddbdSdanielk1977 60141a3bd0aSdrhdo_test trigger2-7.1 { 602c3f9bad2Sdanielk1977 execsql { 603c3f9bad2Sdanielk1977 CREATE TABLE ab(a, b); 604c3f9bad2Sdanielk1977 CREATE TABLE cd(c, d); 605c3f9bad2Sdanielk1977 INSERT INTO ab VALUES (1, 2); 606c3f9bad2Sdanielk1977 INSERT INTO ab VALUES (0, 0); 607c3f9bad2Sdanielk1977 INSERT INTO cd VALUES (3, 4); 608c3f9bad2Sdanielk1977 609c3f9bad2Sdanielk1977 CREATE TABLE tlog(ii INTEGER PRIMARY KEY, 610c3f9bad2Sdanielk1977 olda, oldb, oldc, oldd, newa, newb, newc, newd); 611c3f9bad2Sdanielk1977 612c3f9bad2Sdanielk1977 CREATE VIEW abcd AS SELECT a, b, c, d FROM ab, cd; 613c3f9bad2Sdanielk1977 614993b173eSdanielk1977 CREATE TRIGGER before_update INSTEAD OF UPDATE ON abcd BEGIN 615c3f9bad2Sdanielk1977 INSERT INTO tlog VALUES(NULL, 616c3f9bad2Sdanielk1977 old.a, old.b, old.c, old.d, new.a, new.b, new.c, new.d); 617c3f9bad2Sdanielk1977 END; 618993b173eSdanielk1977 CREATE TRIGGER after_update INSTEAD OF UPDATE ON abcd BEGIN 619c3f9bad2Sdanielk1977 INSERT INTO tlog VALUES(NULL, 620c3f9bad2Sdanielk1977 old.a, old.b, old.c, old.d, new.a, new.b, new.c, new.d); 621c3f9bad2Sdanielk1977 END; 622c3f9bad2Sdanielk1977 623993b173eSdanielk1977 CREATE TRIGGER before_delete INSTEAD OF DELETE ON abcd BEGIN 624c3f9bad2Sdanielk1977 INSERT INTO tlog VALUES(NULL, 625c3f9bad2Sdanielk1977 old.a, old.b, old.c, old.d, 0, 0, 0, 0); 626c3f9bad2Sdanielk1977 END; 627993b173eSdanielk1977 CREATE TRIGGER after_delete INSTEAD OF DELETE ON abcd BEGIN 628c3f9bad2Sdanielk1977 INSERT INTO tlog VALUES(NULL, 629c3f9bad2Sdanielk1977 old.a, old.b, old.c, old.d, 0, 0, 0, 0); 630c3f9bad2Sdanielk1977 END; 631c3f9bad2Sdanielk1977 632993b173eSdanielk1977 CREATE TRIGGER before_insert INSTEAD OF INSERT ON abcd BEGIN 633c3f9bad2Sdanielk1977 INSERT INTO tlog VALUES(NULL, 634c3f9bad2Sdanielk1977 0, 0, 0, 0, new.a, new.b, new.c, new.d); 635c3f9bad2Sdanielk1977 END; 636993b173eSdanielk1977 CREATE TRIGGER after_insert INSTEAD OF INSERT ON abcd BEGIN 637c3f9bad2Sdanielk1977 INSERT INTO tlog VALUES(NULL, 638c3f9bad2Sdanielk1977 0, 0, 0, 0, new.a, new.b, new.c, new.d); 639c3f9bad2Sdanielk1977 END; 640c3f9bad2Sdanielk1977 } 6418bf8dc92Sdrh} {}; 642c3f9bad2Sdanielk1977 64341a3bd0aSdrhdo_test trigger2-7.2 { 644c3f9bad2Sdanielk1977 execsql { 645c3f9bad2Sdanielk1977 UPDATE abcd SET a = 100, b = 5*5 WHERE a = 1; 646c3f9bad2Sdanielk1977 DELETE FROM abcd WHERE a = 1; 647c3f9bad2Sdanielk1977 INSERT INTO abcd VALUES(10, 20, 30, 40); 648c3f9bad2Sdanielk1977 SELECT * FROM tlog; 649c3f9bad2Sdanielk1977 } 650c3f9bad2Sdanielk1977} [ list 1 1 2 3 4 100 25 3 4 \ 651c3f9bad2Sdanielk1977 2 1 2 3 4 100 25 3 4 \ 652993b173eSdanielk1977 3 1 2 3 4 0 0 0 0 \ 653993b173eSdanielk1977 4 1 2 3 4 0 0 0 0 \ 654993b173eSdanielk1977 5 0 0 0 0 10 20 30 40 \ 655993b173eSdanielk1977 6 0 0 0 0 10 20 30 40 ] 656c3f9bad2Sdanielk1977 6575cf590c1Sdrhdo_test trigger2-7.3 { 6585cf590c1Sdrh execsql { 6595cf590c1Sdrh DELETE FROM tlog; 6605cf590c1Sdrh INSERT INTO abcd VALUES(10, 20, 30, 40); 6615cf590c1Sdrh UPDATE abcd SET a = 100, b = 5*5 WHERE a = 1; 6625cf590c1Sdrh DELETE FROM abcd WHERE a = 1; 6635cf590c1Sdrh SELECT * FROM tlog; 6645cf590c1Sdrh } 6655cf590c1Sdrh} [ list \ 6665cf590c1Sdrh 1 0 0 0 0 10 20 30 40 \ 6675cf590c1Sdrh 2 0 0 0 0 10 20 30 40 \ 6685cf590c1Sdrh 3 1 2 3 4 100 25 3 4 \ 6695cf590c1Sdrh 4 1 2 3 4 100 25 3 4 \ 6705cf590c1Sdrh 5 1 2 3 4 0 0 0 0 \ 6715cf590c1Sdrh 6 1 2 3 4 0 0 0 0 \ 6725cf590c1Sdrh] 6735cf590c1Sdrhdo_test trigger2-7.4 { 6745cf590c1Sdrh execsql { 6755cf590c1Sdrh DELETE FROM tlog; 6765cf590c1Sdrh DELETE FROM abcd WHERE a = 1; 6775cf590c1Sdrh INSERT INTO abcd VALUES(10, 20, 30, 40); 6785cf590c1Sdrh UPDATE abcd SET a = 100, b = 5*5 WHERE a = 1; 6795cf590c1Sdrh SELECT * FROM tlog; 6805cf590c1Sdrh } 6815cf590c1Sdrh} [ list \ 6825cf590c1Sdrh 1 1 2 3 4 0 0 0 0 \ 6835cf590c1Sdrh 2 1 2 3 4 0 0 0 0 \ 6845cf590c1Sdrh 3 0 0 0 0 10 20 30 40 \ 6855cf590c1Sdrh 4 0 0 0 0 10 20 30 40 \ 6865cf590c1Sdrh 5 1 2 3 4 100 25 3 4 \ 6875cf590c1Sdrh 6 1 2 3 4 100 25 3 4 \ 6885cf590c1Sdrh] 6895cf590c1Sdrh 6905cf590c1Sdrhdo_test trigger2-8.1 { 6915cf590c1Sdrh execsql { 6925cf590c1Sdrh CREATE TABLE t1(a,b,c); 6935cf590c1Sdrh INSERT INTO t1 VALUES(1,2,3); 6945cf590c1Sdrh CREATE VIEW v1 AS 6955cf590c1Sdrh SELECT a+b AS x, b+c AS y, a+c AS z FROM t1; 6965cf590c1Sdrh SELECT * FROM v1; 6975cf590c1Sdrh } 6985cf590c1Sdrh} {3 5 4} 6995cf590c1Sdrhdo_test trigger2-8.2 { 7005cf590c1Sdrh execsql { 7015cf590c1Sdrh CREATE TABLE v1log(a,b,c,d,e,f); 7025cf590c1Sdrh CREATE TRIGGER r1 INSTEAD OF DELETE ON v1 BEGIN 7035cf590c1Sdrh INSERT INTO v1log VALUES(OLD.x,NULL,OLD.y,NULL,OLD.z,NULL); 7045cf590c1Sdrh END; 7055cf590c1Sdrh DELETE FROM v1 WHERE x=1; 7065cf590c1Sdrh SELECT * FROM v1log; 7075cf590c1Sdrh } 7085cf590c1Sdrh} {} 7095cf590c1Sdrhdo_test trigger2-8.3 { 7105cf590c1Sdrh execsql { 7115cf590c1Sdrh DELETE FROM v1 WHERE x=3; 7125cf590c1Sdrh SELECT * FROM v1log; 7135cf590c1Sdrh } 7145cf590c1Sdrh} {3 {} 5 {} 4 {}} 7155cf590c1Sdrhdo_test trigger2-8.4 { 7165cf590c1Sdrh execsql { 7175cf590c1Sdrh INSERT INTO t1 VALUES(4,5,6); 7185cf590c1Sdrh DELETE FROM v1log; 7195cf590c1Sdrh DELETE FROM v1 WHERE y=11; 7205cf590c1Sdrh SELECT * FROM v1log; 7215cf590c1Sdrh } 7225cf590c1Sdrh} {9 {} 11 {} 10 {}} 7235cf590c1Sdrhdo_test trigger2-8.5 { 7245cf590c1Sdrh execsql { 7255cf590c1Sdrh CREATE TRIGGER r2 INSTEAD OF INSERT ON v1 BEGIN 7265cf590c1Sdrh INSERT INTO v1log VALUES(NULL,NEW.x,NULL,NEW.y,NULL,NEW.z); 7275cf590c1Sdrh END; 7285cf590c1Sdrh DELETE FROM v1log; 7295cf590c1Sdrh INSERT INTO v1 VALUES(1,2,3); 7305cf590c1Sdrh SELECT * FROM v1log; 7315cf590c1Sdrh } 7325cf590c1Sdrh} {{} 1 {} 2 {} 3} 7335cf590c1Sdrhdo_test trigger2-8.6 { 7345cf590c1Sdrh execsql { 7355cf590c1Sdrh CREATE TRIGGER r3 INSTEAD OF UPDATE ON v1 BEGIN 7365cf590c1Sdrh INSERT INTO v1log VALUES(OLD.x,NEW.x,OLD.y,NEW.y,OLD.z,NEW.z); 7375cf590c1Sdrh END; 7385cf590c1Sdrh DELETE FROM v1log; 7395cf590c1Sdrh UPDATE v1 SET x=x+100, y=y+200, z=z+300; 7405cf590c1Sdrh SELECT * FROM v1log; 7415cf590c1Sdrh } 7425cf590c1Sdrh} {3 103 5 205 4 304 9 109 11 211 10 310} 7435cf590c1Sdrh 744f7300753Sdanielk1977# At one point the following was causing a segfault. 745f7300753Sdanielk1977do_test trigger2-9.1 { 746f7300753Sdanielk1977 execsql { 747f7300753Sdanielk1977 CREATE TABLE t3(a TEXT, b TEXT); 748f7300753Sdanielk1977 CREATE VIEW v3 AS SELECT t3.a FROM t3; 749f7300753Sdanielk1977 CREATE TRIGGER trig1 INSTEAD OF DELETE ON v3 BEGIN 750f7300753Sdanielk1977 SELECT 1; 751f7300753Sdanielk1977 END; 752f7300753Sdanielk1977 DELETE FROM v3 WHERE a = 1; 753f7300753Sdanielk1977 } 754f7300753Sdanielk1977} {} 755f7300753Sdanielk1977 75603836614Sdrhintegrity_check trigger2-9.99 75703836614Sdrh 75803836614Sdrh# 2019-11-02 Problem found by TH3, related to generated column support. 75903836614Sdrhdb close 76003836614Sdrhsqlite3 db :memory: 76103836614Sdrhdo_execsql_test trigger2-10.1 { 76203836614Sdrh CREATE TABLE t1(a,b,c,d); 76303836614Sdrh CREATE VIEW v2(a,b,c,d) AS SELECT * FROM t1; 76403836614Sdrh CREATE TRIGGER v2ins INSTEAD OF INSERT ON v2 BEGIN 76503836614Sdrh INSERT INTO t1(a,b,c,d) VALUES(new.a, new.b, new.c, new.d); 76603836614Sdrh END; 76703836614Sdrh INSERT INTO v2(a,d) VALUES(11,14); 76803836614Sdrh SELECT * FROM t1; 76903836614Sdrh} {11 {} {} 14} 77003836614Sdrh 7710fa8ddbdSdanielk1977} ;# ifcapable view 7720fa8ddbdSdanielk1977 773*fe599b05Sdan#------------------------------------------------------------------------- 774*fe599b05Sdanreset_db 775*fe599b05Sdando_execsql_test 11.1 { 776*fe599b05Sdan CREATE TABLE t1(a INT PRIMARY KEY, b, c REAL, d, e); 777*fe599b05Sdan CREATE TABLE t2(a INT, b, c REAL, d, e, PRIMARY KEY(a,b)) WITHOUT ROWID; 778*fe599b05Sdan CREATE UNIQUE INDEX t2c ON t2(c); 779*fe599b05Sdan CREATE UNIQUE INDEX t2d ON t2(d); 780*fe599b05Sdan CREATE UNIQUE INDEX t2e ON t2(e); 781*fe599b05Sdan} 782*fe599b05Sdan 783*fe599b05Sdando_catchsql_test 11.2 { 784*fe599b05Sdan CREATE TRIGGER r1 BEFORE INSERT ON t1 BEGIN 785*fe599b05Sdan INSERT INTO t2(a,b,c,d,e) VALUES(91,NULL,93,94,?1) 786*fe599b05Sdan ON CONFLICT(b,a) DO NOTHING 787*fe599b05Sdan ON CONFLICT DO UPDATE SET b=?1; 788*fe599b05Sdan END; 789*fe599b05Sdan} {1 {trigger cannot use variables}} 790*fe599b05Sdan 7915cf590c1Sdrh 792c3f9bad2Sdanielk1977finish_test 793*fe599b05Sdan 794