trigger4.test 4.8 KB

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