1f573c99bSdrh# The author disclaims copyright to this source code. In place of 2f573c99bSdrh# a legal notice, here is a blessing: 3f573c99bSdrh# 4f573c99bSdrh# May you do good and not evil. 5f573c99bSdrh# May you find forgiveness for yourself and forgive others. 6f573c99bSdrh# May you share freely, never taking more than you give. 7f573c99bSdrh# 8f573c99bSdrh#*********************************************************************** 9f573c99bSdrh# 10f573c99bSdrh# This file tests the triggers of views. 11f573c99bSdrh# 12f573c99bSdrh 13f573c99bSdrhset testdir [file dirname $argv0] 14f573c99bSdrhsource $testdir/tester.tcl 150fa8ddbdSdanielk1977 160fa8ddbdSdanielk1977# If either views or triggers are disabled in this build, omit this file. 170fa8ddbdSdanielk1977ifcapable {!trigger || !view} { 18b7f9164eSdrh finish_test 19b7f9164eSdrh return 20b7f9164eSdrh} 21f573c99bSdrh 22f573c99bSdrhdo_test trigger4-1.1 { 23f573c99bSdrh execsql { 24f573c99bSdrh create table test1(id integer primary key,a); 25f573c99bSdrh create table test2(id integer,b); 26f573c99bSdrh create view test as 27f573c99bSdrh select test1.id as id,a as a,b as b 28f573c99bSdrh from test1 join test2 on test2.id = test1.id; 29f573c99bSdrh create trigger I_test instead of insert on test 30f573c99bSdrh begin 31f573c99bSdrh insert into test1 (id,a) values (NEW.id,NEW.a); 32f573c99bSdrh insert into test2 (id,b) values (NEW.id,NEW.b); 33f573c99bSdrh end; 34f573c99bSdrh insert into test values(1,2,3); 35f573c99bSdrh select * from test1; 36f573c99bSdrh } 37f573c99bSdrh} {1 2} 38f573c99bSdrhdo_test trigger4-1.2 { 39f573c99bSdrh execsql { 40f573c99bSdrh select * from test2; 41f573c99bSdrh } 42f573c99bSdrh} {1 3} 43f573c99bSdrhdo_test trigger4-1.3 { 44f573c99bSdrh db close 45ef4ac8f9Sdrh sqlite3 db test.db 46f573c99bSdrh execsql { 47f573c99bSdrh insert into test values(4,5,6); 48f573c99bSdrh select * from test1; 49f573c99bSdrh } 50f573c99bSdrh} {1 2 4 5} 51f573c99bSdrhdo_test trigger4-1.4 { 52f573c99bSdrh execsql { 53f573c99bSdrh select * from test2; 54f573c99bSdrh } 55f573c99bSdrh} {1 3 4 6} 56f573c99bSdrh 57f573c99bSdrhdo_test trigger4-2.1 { 58f573c99bSdrh execsql { 59f573c99bSdrh create trigger U_test instead of update on test 60f573c99bSdrh begin 61f573c99bSdrh update test1 set a=NEW.a where id=NEW.id; 62f573c99bSdrh update test2 set b=NEW.b where id=NEW.id; 63f573c99bSdrh end; 64f573c99bSdrh update test set a=22 where id=1; 65f573c99bSdrh select * from test1; 66f573c99bSdrh } 67f573c99bSdrh} {1 22 4 5} 68f573c99bSdrhdo_test trigger4-2.2 { 69f573c99bSdrh execsql { 70f573c99bSdrh select * from test2; 71f573c99bSdrh } 72f573c99bSdrh} {1 3 4 6} 73f573c99bSdrhdo_test trigger4-2.3 { 74f573c99bSdrh db close 75ef4ac8f9Sdrh sqlite3 db test.db 76f573c99bSdrh execsql { 77f573c99bSdrh update test set b=66 where id=4; 78f573c99bSdrh select * from test1; 79f573c99bSdrh } 80f573c99bSdrh} {1 22 4 5} 81f573c99bSdrhdo_test trigger4-2.4 { 82f573c99bSdrh execsql { 83f573c99bSdrh select * from test2; 84f573c99bSdrh } 85f573c99bSdrh} {1 3 4 66} 86f573c99bSdrh 87f573c99bSdrhdo_test trigger4-3.1 { 88f573c99bSdrh catchsql { 89f573c99bSdrh drop table test2; 90f573c99bSdrh insert into test values(7,8,9); 91f573c99bSdrh } 92f26e09c8Sdrh} {1 {no such table: main.test2}} 93f573c99bSdrhdo_test trigger4-3.2 { 94f573c99bSdrh db close 95ef4ac8f9Sdrh sqlite3 db test.db 96f573c99bSdrh catchsql { 97f573c99bSdrh insert into test values(7,8,9); 98f573c99bSdrh } 99f26e09c8Sdrh} {1 {no such table: main.test2}} 100f573c99bSdrhdo_test trigger4-3.3 { 101f573c99bSdrh catchsql { 102f573c99bSdrh update test set a=222 where id=1; 103f573c99bSdrh } 104f26e09c8Sdrh} {1 {no such table: main.test2}} 105f573c99bSdrhdo_test trigger4-3.4 { 106f573c99bSdrh execsql { 107f573c99bSdrh select * from test1; 108f573c99bSdrh } 109f573c99bSdrh} {1 22 4 5} 110f573c99bSdrhdo_test trigger4-3.5 { 111f573c99bSdrh execsql { 112f573c99bSdrh create table test2(id,b); 113f573c99bSdrh insert into test values(7,8,9); 114f573c99bSdrh select * from test1; 115f573c99bSdrh } 116f573c99bSdrh} {1 22 4 5 7 8} 117f573c99bSdrhdo_test trigger4-3.6 { 118f573c99bSdrh execsql { 119f573c99bSdrh select * from test2; 120f573c99bSdrh } 121f573c99bSdrh} {7 9} 122f573c99bSdrhdo_test trigger4-3.7 { 123f573c99bSdrh db close 124ef4ac8f9Sdrh sqlite3 db test.db 125f573c99bSdrh execsql { 126f573c99bSdrh update test set b=99 where id=7; 127f573c99bSdrh select * from test2; 128f573c99bSdrh } 129f573c99bSdrh} {7 99} 130f573c99bSdrh 131c7e22ee2Skweldo_test trigger4-4.1 { 132c7e22ee2Skwel db close 133*fda06befSmistachkin forcedelete trigtest.db 134*fda06befSmistachkin forcedelete trigtest.db-journal 135c7e22ee2Skwel sqlite3 db trigtest.db 136c7e22ee2Skwel catchsql {drop table tbl; drop view vw} 137c7e22ee2Skwel execsql { 138c7e22ee2Skwel create table tbl(a integer primary key, b integer); 139c7e22ee2Skwel create view vw as select * from tbl; 140c7e22ee2Skwel create trigger t_del_tbl instead of delete on vw for each row begin 141c7e22ee2Skwel delete from tbl where a = old.a; 142c7e22ee2Skwel end; 143c7e22ee2Skwel create trigger t_upd_tbl instead of update on vw for each row begin 144c7e22ee2Skwel update tbl set a=new.a, b=new.b where a = old.a; 145c7e22ee2Skwel end; 146c7e22ee2Skwel create trigger t_ins_tbl instead of insert on vw for each row begin 147c7e22ee2Skwel insert into tbl values (new.a,new.b); 148c7e22ee2Skwel end; 149c7e22ee2Skwel insert into tbl values(101,1001); 150c7e22ee2Skwel insert into tbl values(102,1002); 151c7e22ee2Skwel insert into tbl select a+2, b+2 from tbl; 152c7e22ee2Skwel insert into tbl select a+4, b+4 from tbl; 153c7e22ee2Skwel insert into tbl select a+8, b+8 from tbl; 154c7e22ee2Skwel insert into tbl select a+16, b+16 from tbl; 155c7e22ee2Skwel insert into tbl select a+32, b+32 from tbl; 156c7e22ee2Skwel insert into tbl select a+64, b+64 from tbl; 157c7e22ee2Skwel select count(*) from vw; 158c7e22ee2Skwel } 159c7e22ee2Skwel} {128} 160c7e22ee2Skweldo_test trigger4-4.2 { 161c7e22ee2Skwel execsql {select a, b from vw where a<103 or a>226 order by a} 162c7e22ee2Skwel} {101 1001 102 1002 227 1127 228 1128} 163c7e22ee2Skwel 164c7e22ee2Skwel#test delete from view 165c7e22ee2Skweldo_test trigger4-5.1 { 166c7e22ee2Skwel catchsql {delete from vw where a>101 and a<2000} 167c7e22ee2Skwel} {0 {}} 168c7e22ee2Skweldo_test trigger4-5.2 { 169c7e22ee2Skwel execsql {select * from vw} 170c7e22ee2Skwel} {101 1001} 171c7e22ee2Skwel 172c7e22ee2Skwel#test insert into view 173c7e22ee2Skweldo_test trigger4-6.1 { 174c7e22ee2Skwel catchsql { 175c7e22ee2Skwel insert into vw values(102,1002); 176c7e22ee2Skwel insert into vw select a+2, b+2 from vw; 177c7e22ee2Skwel insert into vw select a+4, b+4 from vw; 178c7e22ee2Skwel insert into vw select a+8, b+8 from vw; 179c7e22ee2Skwel insert into vw select a+16, b+16 from vw; 180c7e22ee2Skwel insert into vw select a+32, b+32 from vw; 181c7e22ee2Skwel insert into vw select a+64, b+64 from vw; 182c7e22ee2Skwel } 183c7e22ee2Skwel} {0 {}} 184c7e22ee2Skweldo_test trigger4-6.2 { 185c7e22ee2Skwel execsql {select count(*) from vw} 186c7e22ee2Skwel} {128} 187c7e22ee2Skwel 188c7e22ee2Skwel#test update of view 189c7e22ee2Skweldo_test trigger4-7.1 { 190c7e22ee2Skwel catchsql {update vw set b=b+1000 where a>101 and a<2000} 191c7e22ee2Skwel} {0 {}} 192c7e22ee2Skweldo_test trigger4-7.2 { 193c7e22ee2Skwel execsql {select a, b from vw where a<=102 or a>=227 order by a} 194c7e22ee2Skwel} {101 1001 102 2002 227 2127 228 2128} 195c7e22ee2Skwel 196c7e22ee2Skwelintegrity_check trigger4-99.9 197e61c7696Sdrhdb close 198*fda06befSmistachkinforcedelete trigtest.db trigtest.db-journal 199d9910fe5Sdrh 200f573c99bSdrhfinish_test 201