xref: /sqlite-3.40.0/test/trigger4.test (revision fda06bef)
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