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 creating and dropping triggers, and interaction thereof 12c5c4113dSnw141292# with the database COMMIT/ROLLBACK logic. 13c5c4113dSnw141292# 14c5c4113dSnw141292# 1. CREATE and DROP TRIGGER tests 15c5c4113dSnw141292# trig-1.1: Error if table does not exist 16c5c4113dSnw141292# trig-1.2: Error if trigger already exists 17c5c4113dSnw141292# trig-1.3: Created triggers are deleted if the transaction is rolled back 18c5c4113dSnw141292# trig-1.4: DROP TRIGGER removes trigger 19c5c4113dSnw141292# trig-1.5: Dropped triggers are restored if the transaction is rolled back 20c5c4113dSnw141292# trig-1.6: Error if dropped trigger doesn't exist 21c5c4113dSnw141292# trig-1.7: Dropping the table automatically drops all triggers 22c5c4113dSnw141292# trig-1.8: A trigger created on a TEMP table is not inserted into sqlite_master 23c5c4113dSnw141292# trig-1.9: Ensure that we cannot create a trigger on sqlite_master 24c5c4113dSnw141292# trig-1.10: 25c5c4113dSnw141292# trig-1.11: 26c5c4113dSnw141292# trig-1.12: Ensure that INSTEAD OF triggers cannot be created on tables 27c5c4113dSnw141292# trig-1.13: Ensure that AFTER triggers cannot be created on views 28c5c4113dSnw141292# trig-1.14: Ensure that BEFORE triggers cannot be created on views 29c5c4113dSnw141292# 30c5c4113dSnw141292 31c5c4113dSnw141292set testdir [file dirname $argv0] 32c5c4113dSnw141292source $testdir/tester.tcl 33c5c4113dSnw141292 34c5c4113dSnw141292do_test trigger1-1.1.2 { 35c5c4113dSnw141292 catchsql { 36c5c4113dSnw141292 CREATE TRIGGER trig UPDATE ON no_such_table BEGIN 37c5c4113dSnw141292 SELECT * from sqlite_master; 38c5c4113dSnw141292 END; 39c5c4113dSnw141292 } 40c5c4113dSnw141292} {1 {no such table: no_such_table}} 41c5c4113dSnw141292do_test trigger1-1.1.2 { 42c5c4113dSnw141292 catchsql { 43c5c4113dSnw141292 CREATE TEMP TRIGGER trig UPDATE ON no_such_table BEGIN 44c5c4113dSnw141292 SELECT * from sqlite_master; 45c5c4113dSnw141292 END; 46c5c4113dSnw141292 } 47c5c4113dSnw141292} {1 {no such table: no_such_table}} 48c5c4113dSnw141292 49c5c4113dSnw141292execsql { 50c5c4113dSnw141292 CREATE TABLE t1(a); 51c5c4113dSnw141292} 52c5c4113dSnw141292execsql { 53c5c4113dSnw141292 CREATE TRIGGER tr1 INSERT ON t1 BEGIN 54c5c4113dSnw141292 INSERT INTO t1 values(1); 55c5c4113dSnw141292 END; 56c5c4113dSnw141292} 57c5c4113dSnw141292do_test trigger1-1.2 { 58c5c4113dSnw141292 catchsql { 59c5c4113dSnw141292 CREATE TRIGGER tr1 DELETE ON t1 BEGIN 60c5c4113dSnw141292 SELECT * FROM sqlite_master; 61c5c4113dSnw141292 END 62c5c4113dSnw141292 } 63c5c4113dSnw141292} {1 {trigger tr1 already exists}} 64c5c4113dSnw141292 65c5c4113dSnw141292do_test trigger1-1.3 { 66c5c4113dSnw141292 catchsql { 67c5c4113dSnw141292 BEGIN; 68c5c4113dSnw141292 CREATE TRIGGER tr2 INSERT ON t1 BEGIN 69c5c4113dSnw141292 SELECT * from sqlite_master; END; 70c5c4113dSnw141292 ROLLBACK; 71c5c4113dSnw141292 CREATE TRIGGER tr2 INSERT ON t1 BEGIN 72c5c4113dSnw141292 SELECT * from sqlite_master; END; 73c5c4113dSnw141292 } 74c5c4113dSnw141292} {0 {}} 75c5c4113dSnw141292 76c5c4113dSnw141292do_test trigger1-1.4 { 77c5c4113dSnw141292 catchsql { 78c5c4113dSnw141292 DROP TRIGGER tr1; 79c5c4113dSnw141292 CREATE TRIGGER tr1 DELETE ON t1 BEGIN 80c5c4113dSnw141292 SELECT * FROM sqlite_master; 81c5c4113dSnw141292 END 82c5c4113dSnw141292 } 83c5c4113dSnw141292} {0 {}} 84c5c4113dSnw141292 85c5c4113dSnw141292do_test trigger1-1.5 { 86c5c4113dSnw141292 execsql { 87c5c4113dSnw141292 BEGIN; 88c5c4113dSnw141292 DROP TRIGGER tr2; 89c5c4113dSnw141292 ROLLBACK; 90c5c4113dSnw141292 DROP TRIGGER tr2; 91c5c4113dSnw141292 } 92c5c4113dSnw141292} {} 93c5c4113dSnw141292 94c5c4113dSnw141292do_test trigger1-1.6 { 95c5c4113dSnw141292 catchsql { 96c5c4113dSnw141292 DROP TRIGGER biggles; 97c5c4113dSnw141292 } 98c5c4113dSnw141292} {1 {no such trigger: biggles}} 99c5c4113dSnw141292 100c5c4113dSnw141292do_test trigger1-1.7 { 101c5c4113dSnw141292 catchsql { 102c5c4113dSnw141292 DROP TABLE t1; 103c5c4113dSnw141292 DROP TRIGGER tr1; 104c5c4113dSnw141292 } 105c5c4113dSnw141292} {1 {no such trigger: tr1}} 106c5c4113dSnw141292 107c5c4113dSnw141292execsql { 108c5c4113dSnw141292 CREATE TEMP TABLE temp_table(a); 109c5c4113dSnw141292} 110c5c4113dSnw141292do_test trigger1-1.8 { 111c5c4113dSnw141292 execsql { 112c5c4113dSnw141292 CREATE TRIGGER temp_trig UPDATE ON temp_table BEGIN 113c5c4113dSnw141292 SELECT * from sqlite_master; 114c5c4113dSnw141292 END; 115c5c4113dSnw141292 SELECT count(*) FROM sqlite_master WHERE name = 'temp_trig'; 116c5c4113dSnw141292 } 117c5c4113dSnw141292} {0} 118c5c4113dSnw141292 119c5c4113dSnw141292do_test trigger1-1.9 { 120c5c4113dSnw141292 catchsql { 121c5c4113dSnw141292 CREATE TRIGGER tr1 AFTER UPDATE ON sqlite_master BEGIN 122c5c4113dSnw141292 SELECT * FROM sqlite_master; 123c5c4113dSnw141292 END; 124c5c4113dSnw141292 } 125c5c4113dSnw141292} {1 {cannot create trigger on system table}} 126c5c4113dSnw141292 127c5c4113dSnw141292# Check to make sure that a DELETE statement within the body of 128c5c4113dSnw141292# a trigger does not mess up the DELETE that caused the trigger to 129c5c4113dSnw141292# run in the first place. 130c5c4113dSnw141292# 131c5c4113dSnw141292do_test trigger1-1.10 { 132c5c4113dSnw141292 execsql { 133c5c4113dSnw141292 create table t1(a,b); 134c5c4113dSnw141292 insert into t1 values(1,'a'); 135c5c4113dSnw141292 insert into t1 values(2,'b'); 136c5c4113dSnw141292 insert into t1 values(3,'c'); 137c5c4113dSnw141292 insert into t1 values(4,'d'); 138c5c4113dSnw141292 create trigger r1 after delete on t1 for each row begin 139c5c4113dSnw141292 delete from t1 WHERE a=old.a+2; 140c5c4113dSnw141292 end; 141c5c4113dSnw141292 delete from t1 where a in (1,3); 142c5c4113dSnw141292 select * from t1; 143c5c4113dSnw141292 drop table t1; 144c5c4113dSnw141292 } 145c5c4113dSnw141292} {2 b 4 d} 146c5c4113dSnw141292do_test trigger1-1.11 { 147c5c4113dSnw141292 execsql { 148c5c4113dSnw141292 create table t1(a,b); 149c5c4113dSnw141292 insert into t1 values(1,'a'); 150c5c4113dSnw141292 insert into t1 values(2,'b'); 151c5c4113dSnw141292 insert into t1 values(3,'c'); 152c5c4113dSnw141292 insert into t1 values(4,'d'); 153c5c4113dSnw141292 create trigger r1 after update on t1 for each row begin 154c5c4113dSnw141292 delete from t1 WHERE a=old.a+2; 155c5c4113dSnw141292 end; 156c5c4113dSnw141292 update t1 set b='x-' || b where a in (1,3); 157c5c4113dSnw141292 select * from t1; 158c5c4113dSnw141292 drop table t1; 159c5c4113dSnw141292 } 160c5c4113dSnw141292} {1 x-a 2 b 4 d} 161c5c4113dSnw141292 162c5c4113dSnw141292# Ensure that we cannot create INSTEAD OF triggers on tables 163c5c4113dSnw141292do_test trigger1-1.12 { 164c5c4113dSnw141292 catchsql { 165c5c4113dSnw141292 create table t1(a,b); 166c5c4113dSnw141292 create trigger t1t instead of update on t1 for each row begin 167c5c4113dSnw141292 delete from t1 WHERE a=old.a+2; 168c5c4113dSnw141292 end; 169c5c4113dSnw141292 } 170c5c4113dSnw141292} {1 {cannot create INSTEAD OF trigger on table: t1}} 171c5c4113dSnw141292# Ensure that we cannot create BEFORE triggers on views 172c5c4113dSnw141292do_test trigger1-1.13 { 173c5c4113dSnw141292 catchsql { 174c5c4113dSnw141292 create view v1 as select * from t1; 175c5c4113dSnw141292 create trigger v1t before update on v1 for each row begin 176c5c4113dSnw141292 delete from t1 WHERE a=old.a+2; 177c5c4113dSnw141292 end; 178c5c4113dSnw141292 } 179c5c4113dSnw141292} {1 {cannot create BEFORE trigger on view: v1}} 180c5c4113dSnw141292# Ensure that we cannot create AFTER triggers on views 181c5c4113dSnw141292do_test trigger1-1.14 { 182c5c4113dSnw141292 catchsql { 183c5c4113dSnw141292 drop view v1; 184c5c4113dSnw141292 create view v1 as select * from t1; 185c5c4113dSnw141292 create trigger v1t AFTER update on v1 for each row begin 186c5c4113dSnw141292 delete from t1 WHERE a=old.a+2; 187c5c4113dSnw141292 end; 188c5c4113dSnw141292 } 189c5c4113dSnw141292} {1 {cannot create AFTER trigger on view: v1}} 190c5c4113dSnw141292 191c5c4113dSnw141292# Check for memory leaks in the trigger parser 192c5c4113dSnw141292# 193c5c4113dSnw141292do_test trigger1-2.1 { 194c5c4113dSnw141292 catchsql { 195c5c4113dSnw141292 CREATE TRIGGER r1 AFTER INSERT ON t1 BEGIN 196c5c4113dSnw141292 SELECT * FROM; -- Syntax error 197c5c4113dSnw141292 END; 198c5c4113dSnw141292 } 199c5c4113dSnw141292} {1 {near ";": syntax error}} 200c5c4113dSnw141292do_test trigger1-2.2 { 201c5c4113dSnw141292 catchsql { 202c5c4113dSnw141292 CREATE TRIGGER r1 AFTER INSERT ON t1 BEGIN 203c5c4113dSnw141292 SELECT * FROM t1; 204c5c4113dSnw141292 SELECT * FROM; -- Syntax error 205c5c4113dSnw141292 END; 206c5c4113dSnw141292 } 207c5c4113dSnw141292} {1 {near ";": syntax error}} 208c5c4113dSnw141292 209c5c4113dSnw141292# Create a trigger that refers to a table that might not exist. 210c5c4113dSnw141292# 211c5c4113dSnw141292do_test trigger1-3.1 { 212c5c4113dSnw141292 execsql { 213c5c4113dSnw141292 CREATE TEMP TABLE t2(x,y); 214c5c4113dSnw141292 } 215c5c4113dSnw141292 catchsql { 216c5c4113dSnw141292 CREATE TRIGGER r1 AFTER INSERT ON t1 BEGIN 217c5c4113dSnw141292 INSERT INTO t2 VALUES(NEW.a,NEW.b); 218c5c4113dSnw141292 END; 219c5c4113dSnw141292 } 220c5c4113dSnw141292} {0 {}} 221c5c4113dSnw141292do_test trigger-3.2 { 222c5c4113dSnw141292 catchsql { 223c5c4113dSnw141292 INSERT INTO t1 VALUES(1,2); 224c5c4113dSnw141292 SELECT * FROM t2; 225c5c4113dSnw141292 } 226c5c4113dSnw141292} {1 {no such table: main.t2}} 227c5c4113dSnw141292do_test trigger-3.3 { 228c5c4113dSnw141292 db close 229c5c4113dSnw141292 set rc [catch {sqlite db test.db} err] 230c5c4113dSnw141292 if {$rc} {lappend rc $err} 231c5c4113dSnw141292 set rc 232c5c4113dSnw141292} {0} 233c5c4113dSnw141292do_test trigger-3.4 { 234c5c4113dSnw141292 catchsql { 235c5c4113dSnw141292 INSERT INTO t1 VALUES(1,2); 236c5c4113dSnw141292 SELECT * FROM t2; 237c5c4113dSnw141292 } 238c5c4113dSnw141292} {1 {no such table: main.t2}} 239c5c4113dSnw141292do_test trigger-3.5 { 240c5c4113dSnw141292 catchsql { 241c5c4113dSnw141292 CREATE TEMP TABLE t2(x,y); 242c5c4113dSnw141292 INSERT INTO t1 VALUES(1,2); 243c5c4113dSnw141292 SELECT * FROM t2; 244c5c4113dSnw141292 } 245c5c4113dSnw141292} {1 {no such table: main.t2}} 246c5c4113dSnw141292do_test trigger-3.6 { 247c5c4113dSnw141292 catchsql { 248c5c4113dSnw141292 DROP TRIGGER r1; 249c5c4113dSnw141292 CREATE TEMP TRIGGER r1 AFTER INSERT ON t1 BEGIN 250c5c4113dSnw141292 INSERT INTO t2 VALUES(NEW.a,NEW.b); 251c5c4113dSnw141292 END; 252c5c4113dSnw141292 INSERT INTO t1 VALUES(1,2); 253c5c4113dSnw141292 SELECT * FROM t2; 254c5c4113dSnw141292 } 255c5c4113dSnw141292} {0 {1 2}} 256c5c4113dSnw141292do_test trigger-3.7 { 257c5c4113dSnw141292 execsql { 258c5c4113dSnw141292 DROP TABLE t2; 259c5c4113dSnw141292 CREATE TABLE t2(x,y); 260c5c4113dSnw141292 SELECT * FROM t2; 261c5c4113dSnw141292 } 262c5c4113dSnw141292} {} 263c5c4113dSnw141292do_test trigger-3.8 { 264c5c4113dSnw141292 execsql { 265c5c4113dSnw141292 INSERT INTO t1 VALUES(3,4); 266c5c4113dSnw141292 SELECT * FROM t1 UNION ALL SELECT * FROM t2; 267c5c4113dSnw141292 } 268c5c4113dSnw141292} {1 2 3 4 3 4} 269c5c4113dSnw141292do_test trigger-3.9 { 270c5c4113dSnw141292 db close 271c5c4113dSnw141292 sqlite db test.db 272c5c4113dSnw141292 execsql { 273c5c4113dSnw141292 INSERT INTO t1 VALUES(5,6); 274c5c4113dSnw141292 SELECT * FROM t1 UNION ALL SELECT * FROM t2; 275c5c4113dSnw141292 } 276c5c4113dSnw141292} {1 2 3 4 5 6 3 4} 277c5c4113dSnw141292 278c5c4113dSnw141292do_test trigger-4.1 { 279c5c4113dSnw141292 execsql { 280c5c4113dSnw141292 CREATE TEMP TRIGGER r1 BEFORE INSERT ON t1 BEGIN 281c5c4113dSnw141292 INSERT INTO t2 VALUES(NEW.a,NEW.b); 282c5c4113dSnw141292 END; 283c5c4113dSnw141292 INSERT INTO t1 VALUES(7,8); 284c5c4113dSnw141292 SELECT * FROM t2; 285c5c4113dSnw141292 } 286c5c4113dSnw141292} {3 4 7 8} 287c5c4113dSnw141292do_test trigger-4.2 { 288c5c4113dSnw141292 sqlite db2 test.db 289c5c4113dSnw141292 execsql { 290c5c4113dSnw141292 INSERT INTO t1 VALUES(9,10); 291c5c4113dSnw141292 } db2; 292c5c4113dSnw141292 db2 close 293c5c4113dSnw141292 execsql { 294c5c4113dSnw141292 SELECT * FROM t2; 295c5c4113dSnw141292 } 296c5c4113dSnw141292} {3 4 7 8} 297c5c4113dSnw141292do_test trigger-4.3 { 298c5c4113dSnw141292 execsql { 299c5c4113dSnw141292 DROP TABLE t1; 300c5c4113dSnw141292 SELECT * FROM t2; 301c5c4113dSnw141292 }; 302c5c4113dSnw141292} {3 4 7 8} 303c5c4113dSnw141292do_test trigger-4.4 { 304c5c4113dSnw141292 db close 305c5c4113dSnw141292 sqlite db test.db 306c5c4113dSnw141292 execsql { 307c5c4113dSnw141292 SELECT * FROM t2; 308c5c4113dSnw141292 }; 309c5c4113dSnw141292} {3 4 7 8} 310c5c4113dSnw141292 311c5c4113dSnw141292integrity_check trigger-5.1 312c5c4113dSnw141292 313c5c4113dSnw141292# Create a trigger with the same name as a table. Make sure the 314c5c4113dSnw141292# trigger works. Then drop the trigger. Make sure the table is 315c5c4113dSnw141292# still there. 316c5c4113dSnw141292# 317c5c4113dSnw141292do_test trigger-6.1 { 318c5c4113dSnw141292 execsql {SELECT type, name FROM sqlite_master} 319c5c4113dSnw141292} {view v1 table t2} 320c5c4113dSnw141292do_test trigger-6.2 { 321c5c4113dSnw141292 execsql { 322c5c4113dSnw141292 CREATE TRIGGER t2 BEFORE DELETE ON t2 BEGIN 323c5c4113dSnw141292 SELECT RAISE(ABORT,'deletes are not allows'); 324c5c4113dSnw141292 END; 325c5c4113dSnw141292 SELECT type, name FROM sqlite_master; 326c5c4113dSnw141292 } 327c5c4113dSnw141292} {view v1 table t2 trigger t2} 328c5c4113dSnw141292do_test trigger-6.3 { 329c5c4113dSnw141292 catchsql {DELETE FROM t2} 330c5c4113dSnw141292} {1 {deletes are not allows}} 331c5c4113dSnw141292do_test trigger-6.4 { 332c5c4113dSnw141292 execsql {SELECT * FROM t2} 333c5c4113dSnw141292} {3 4 7 8} 334c5c4113dSnw141292do_test trigger-6.5 { 335c5c4113dSnw141292 db close 336c5c4113dSnw141292 sqlite db test.db 337c5c4113dSnw141292 execsql {SELECT type, name FROM sqlite_master} 338c5c4113dSnw141292} {view v1 table t2 trigger t2} 339c5c4113dSnw141292do_test trigger-6.6 { 340c5c4113dSnw141292 execsql { 341c5c4113dSnw141292 DROP TRIGGER t2; 342c5c4113dSnw141292 SELECT type, name FROM sqlite_master; 343c5c4113dSnw141292 } 344c5c4113dSnw141292} {view v1 table t2} 345c5c4113dSnw141292do_test trigger-6.7 { 346c5c4113dSnw141292 execsql {SELECT * FROM t2} 347c5c4113dSnw141292} {3 4 7 8} 348c5c4113dSnw141292do_test trigger-6.8 { 349c5c4113dSnw141292 db close 350c5c4113dSnw141292 sqlite db test.db 351c5c4113dSnw141292 execsql {SELECT * FROM t2} 352c5c4113dSnw141292} {3 4 7 8} 353c5c4113dSnw141292 354c5c4113dSnw141292integrity_check trigger-7.1 355c5c4113dSnw141292 356c5c4113dSnw141292# Check to make sure the name of a trigger can be quoted so that keywords 357c5c4113dSnw141292# can be used as trigger names. Ticket #468 358c5c4113dSnw141292# 359c5c4113dSnw141292do_test trigger-8.1 { 360c5c4113dSnw141292 execsql { 361c5c4113dSnw141292 CREATE TRIGGER 'trigger' AFTER INSERT ON t2 BEGIN SELECT 1; END; 362c5c4113dSnw141292 SELECT name FROM sqlite_master WHERE type='trigger'; 363c5c4113dSnw141292 } 364c5c4113dSnw141292} {trigger} 365c5c4113dSnw141292do_test trigger-8.2 { 366c5c4113dSnw141292 execsql { 367c5c4113dSnw141292 DROP TRIGGER 'trigger'; 368c5c4113dSnw141292 SELECT name FROM sqlite_master WHERE type='trigger'; 369c5c4113dSnw141292 } 370c5c4113dSnw141292} {} 371c5c4113dSnw141292do_test trigger-8.3 { 372c5c4113dSnw141292 execsql { 373c5c4113dSnw141292 CREATE TRIGGER "trigger" AFTER INSERT ON t2 BEGIN SELECT 1; END; 374c5c4113dSnw141292 SELECT name FROM sqlite_master WHERE type='trigger'; 375c5c4113dSnw141292 } 376c5c4113dSnw141292} {trigger} 377c5c4113dSnw141292do_test trigger-8.4 { 378c5c4113dSnw141292 execsql { 379c5c4113dSnw141292 DROP TRIGGER "trigger"; 380c5c4113dSnw141292 SELECT name FROM sqlite_master WHERE type='trigger'; 381c5c4113dSnw141292 } 382c5c4113dSnw141292} {} 383c5c4113dSnw141292do_test trigger-8.5 { 384c5c4113dSnw141292 execsql { 385c5c4113dSnw141292 CREATE TRIGGER [trigger] AFTER INSERT ON t2 BEGIN SELECT 1; END; 386c5c4113dSnw141292 SELECT name FROM sqlite_master WHERE type='trigger'; 387c5c4113dSnw141292 } 388c5c4113dSnw141292} {trigger} 389c5c4113dSnw141292do_test trigger-8.6 { 390c5c4113dSnw141292 execsql { 391c5c4113dSnw141292 DROP TRIGGER [trigger]; 392c5c4113dSnw141292 SELECT name FROM sqlite_master WHERE type='trigger'; 393c5c4113dSnw141292 } 394c5c4113dSnw141292} {} 395c5c4113dSnw141292 396c5c4113dSnw141292# Make sure REPLACE works inside of triggers. 397c5c4113dSnw141292# 398c5c4113dSnw141292do_test trigger-9.1 { 399c5c4113dSnw141292 execsql { 400c5c4113dSnw141292 CREATE TABLE t3(a,b); 401c5c4113dSnw141292 CREATE TABLE t4(x UNIQUE, b); 402c5c4113dSnw141292 CREATE TRIGGER r34 AFTER INSERT ON t3 BEGIN 403c5c4113dSnw141292 REPLACE INTO t4 VALUES(new.a,new.b); 404c5c4113dSnw141292 END; 405c5c4113dSnw141292 INSERT INTO t3 VALUES(1,2); 406c5c4113dSnw141292 SELECT * FROM t3 UNION ALL SELECT 99, 99 UNION ALL SELECT * FROM t4; 407c5c4113dSnw141292 } 408c5c4113dSnw141292} {1 2 99 99 1 2} 409c5c4113dSnw141292do_test trigger-9.2 { 410c5c4113dSnw141292 execsql { 411c5c4113dSnw141292 INSERT INTO t3 VALUES(1,3); 412c5c4113dSnw141292 SELECT * FROM t3 UNION ALL SELECT 99, 99 UNION ALL SELECT * FROM t4; 413c5c4113dSnw141292 } 414c5c4113dSnw141292} {1 2 1 3 99 99 1 3} 415c5c4113dSnw141292 416c5c4113dSnw141292execsql { 417c5c4113dSnw141292 DROP TABLE t2; 418c5c4113dSnw141292 DROP TABLE t3; 419c5c4113dSnw141292 DROP TABLE t4; 420c5c4113dSnw141292} 421c5c4113dSnw141292 422c5c4113dSnw141292# Ticket #764. At one stage TEMP triggers would fail to re-install when the 423c5c4113dSnw141292# schema was reloaded. The following tests ensure that TEMP triggers are 424c5c4113dSnw141292# correctly re-installed. 425c5c4113dSnw141292# 426c5c4113dSnw141292# Also verify that references within trigger programs are resolved at 427c5c4113dSnw141292# statement compile time, not trigger installation time. This means, for 428c5c4113dSnw141292# example, that you can drop and re-create tables referenced by triggers. 429c5c4113dSnw141292do_test trigger-10.0 { 430c5c4113dSnw141292 file delete -force test2.db 431c5c4113dSnw141292 file delete -force test2.db-journal 432c5c4113dSnw141292 sqlite db2 test2.db 433c5c4113dSnw141292 execsql {CREATE TABLE t3(a, b, c);} db2 434c5c4113dSnw141292 db2 close 435c5c4113dSnw141292 execsql { 436c5c4113dSnw141292 ATTACH 'test2.db' AS aux; 437c5c4113dSnw141292 } 438c5c4113dSnw141292} {} 439c5c4113dSnw141292do_test trigger-10.1 { 440c5c4113dSnw141292 execsql { 441c5c4113dSnw141292 CREATE TABLE t1(a, b, c); 442c5c4113dSnw141292 CREATE temp TABLE t2(a, b, c); 443c5c4113dSnw141292 CREATE TABLE insert_log(db, a, b, c); 444c5c4113dSnw141292 } 445c5c4113dSnw141292} {} 446c5c4113dSnw141292do_test trigger-10.2 { 447c5c4113dSnw141292 execsql { 448c5c4113dSnw141292 CREATE TEMP TRIGGER trig1 AFTER INSERT ON t1 BEGIN 449c5c4113dSnw141292 INSERT INTO insert_log VALUES('main', new.a, new.b, new.c); 450c5c4113dSnw141292 END; 451c5c4113dSnw141292 CREATE TEMP TRIGGER trig2 AFTER INSERT ON t2 BEGIN 452c5c4113dSnw141292 INSERT INTO insert_log VALUES('temp', new.a, new.b, new.c); 453c5c4113dSnw141292 END; 454c5c4113dSnw141292 CREATE TEMP TRIGGER trig3 AFTER INSERT ON t3 BEGIN 455c5c4113dSnw141292 INSERT INTO insert_log VALUES('aux', new.a, new.b, new.c); 456c5c4113dSnw141292 END; 457c5c4113dSnw141292 } 458c5c4113dSnw141292} {} 459c5c4113dSnw141292do_test trigger-10.3 { 460c5c4113dSnw141292 execsql { 461c5c4113dSnw141292 INSERT INTO t1 VALUES(1, 2, 3); 462c5c4113dSnw141292 INSERT INTO t2 VALUES(4, 5, 6); 463c5c4113dSnw141292 INSERT INTO t3 VALUES(7, 8, 9); 464c5c4113dSnw141292 } 465c5c4113dSnw141292} {} 466c5c4113dSnw141292do_test trigger-10.4 { 467c5c4113dSnw141292 execsql { 468c5c4113dSnw141292 SELECT * FROM insert_log; 469c5c4113dSnw141292 } 470c5c4113dSnw141292} {main 1 2 3 temp 4 5 6 aux 7 8 9} 471c5c4113dSnw141292do_test trigger-10.5 { 472c5c4113dSnw141292 execsql { 473c5c4113dSnw141292 BEGIN; 474c5c4113dSnw141292 INSERT INTO t1 VALUES(1, 2, 3); 475c5c4113dSnw141292 INSERT INTO t2 VALUES(4, 5, 6); 476c5c4113dSnw141292 INSERT INTO t3 VALUES(7, 8, 9); 477c5c4113dSnw141292 ROLLBACK; 478c5c4113dSnw141292 } 479c5c4113dSnw141292} {} 480c5c4113dSnw141292do_test trigger-10.6 { 481c5c4113dSnw141292 execsql { 482c5c4113dSnw141292 SELECT * FROM insert_log; 483c5c4113dSnw141292 } 484c5c4113dSnw141292} {main 1 2 3 temp 4 5 6 aux 7 8 9} 485c5c4113dSnw141292do_test trigger-10.7 { 486c5c4113dSnw141292 execsql { 487c5c4113dSnw141292 DELETE FROM insert_log; 488c5c4113dSnw141292 INSERT INTO t1 VALUES(11, 12, 13); 489c5c4113dSnw141292 INSERT INTO t2 VALUES(14, 15, 16); 490c5c4113dSnw141292 INSERT INTO t3 VALUES(17, 18, 19); 491c5c4113dSnw141292 } 492c5c4113dSnw141292} {} 493c5c4113dSnw141292do_test trigger-10.8 { 494c5c4113dSnw141292 execsql { 495c5c4113dSnw141292 SELECT * FROM insert_log; 496c5c4113dSnw141292 } 497c5c4113dSnw141292} {main 11 12 13 temp 14 15 16 aux 17 18 19} 498c5c4113dSnw141292do_test trigger-10.8 { 499c5c4113dSnw141292# Drop and re-create the insert_log table in a different database. Note 500c5c4113dSnw141292# that we can change the column names because the trigger programs don't 501c5c4113dSnw141292# use them explicitly. 502c5c4113dSnw141292 execsql { 503c5c4113dSnw141292 DROP TABLE insert_log; 504c5c4113dSnw141292 CREATE temp TABLE insert_log(db, d, e, f); 505c5c4113dSnw141292 } 506c5c4113dSnw141292} {} 507c5c4113dSnw141292do_test trigger-10.10 { 508c5c4113dSnw141292 execsql { 509c5c4113dSnw141292 INSERT INTO t1 VALUES(21, 22, 23); 510c5c4113dSnw141292 INSERT INTO t2 VALUES(24, 25, 26); 511c5c4113dSnw141292 INSERT INTO t3 VALUES(27, 28, 29); 512c5c4113dSnw141292 } 513c5c4113dSnw141292} {} 514c5c4113dSnw141292do_test trigger-10.11 { 515c5c4113dSnw141292 execsql { 516c5c4113dSnw141292 SELECT * FROM insert_log; 517c5c4113dSnw141292 } 518c5c4113dSnw141292} {main 21 22 23 temp 24 25 26 aux 27 28 29} 519c5c4113dSnw141292 520c5c4113dSnw141292finish_test 521