e_droptrigger.test 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. # 2010 November 29
  2. #
  3. # The author disclaims copyright to this source code. In place of
  4. # a legal notice, here is a blessing:
  5. #
  6. # May you do good and not evil.
  7. # May you find forgiveness for yourself and forgive others.
  8. # May you share freely, never taking more than you give.
  9. #
  10. #***********************************************************************
  11. #
  12. # This file implements tests to verify that the "testable statements" in
  13. # the lang_droptrigger.html document are correct.
  14. #
  15. set testdir [file dirname $argv0]
  16. source $testdir/tester.tcl
  17. set ::testprefix e_droptrigger
  18. ifcapable !trigger { finish_test ; return }
  19. proc do_droptrigger_tests {nm args} {
  20. uplevel do_select_tests [list e_createtable-$nm] $args
  21. }
  22. proc list_all_triggers {{db db}} {
  23. set res [list]
  24. $db eval { PRAGMA database_list } {
  25. if {$name == "temp"} {
  26. set tbl sqlite_temp_master
  27. } else {
  28. set tbl "$name.sqlite_master"
  29. }
  30. lappend res {*}[
  31. db eval "SELECT '$name.' || name FROM $tbl WHERE type = 'trigger'"
  32. ]
  33. }
  34. set res
  35. }
  36. proc droptrigger_reopen_db {{event INSERT}} {
  37. db close
  38. forcedelete test.db test.db2
  39. sqlite3 db test.db
  40. set ::triggers_fired [list]
  41. proc r {x} { lappend ::triggers_fired $x }
  42. db func r r
  43. db eval "
  44. ATTACH 'test.db2' AS aux;
  45. CREATE TEMP TABLE t1(a, b);
  46. INSERT INTO t1 VALUES('a', 'b');
  47. CREATE TRIGGER tr1 AFTER $event ON t1 BEGIN SELECT r('temp.tr1') ; END;
  48. CREATE TABLE t2(a, b);
  49. INSERT INTO t2 VALUES('a', 'b');
  50. CREATE TRIGGER tr1 BEFORE $event ON t2 BEGIN SELECT r('main.tr1') ; END;
  51. CREATE TRIGGER tr2 AFTER $event ON t2 BEGIN SELECT r('main.tr2') ; END;
  52. CREATE TABLE aux.t3(a, b);
  53. INSERT INTO t3 VALUES('a', 'b');
  54. CREATE TRIGGER aux.tr1 BEFORE $event ON t3 BEGIN SELECT r('aux.tr1') ; END;
  55. CREATE TRIGGER aux.tr2 AFTER $event ON t3 BEGIN SELECT r('aux.tr2') ; END;
  56. CREATE TRIGGER aux.tr3 AFTER $event ON t3 BEGIN SELECT r('aux.tr3') ; END;
  57. "
  58. }
  59. # -- syntax diagram drop-trigger-stmt
  60. #
  61. do_droptrigger_tests 1.1 -repair {
  62. droptrigger_reopen_db
  63. } -tclquery {
  64. list_all_triggers
  65. } {
  66. 1 "DROP TRIGGER main.tr1"
  67. {main.tr2 temp.tr1 aux.tr1 aux.tr2 aux.tr3}
  68. 2 "DROP TRIGGER IF EXISTS main.tr1"
  69. {main.tr2 temp.tr1 aux.tr1 aux.tr2 aux.tr3}
  70. 3 "DROP TRIGGER tr1"
  71. {main.tr1 main.tr2 aux.tr1 aux.tr2 aux.tr3}
  72. 4 "DROP TRIGGER IF EXISTS tr1"
  73. {main.tr1 main.tr2 aux.tr1 aux.tr2 aux.tr3}
  74. 5 "DROP TRIGGER aux.tr1"
  75. {main.tr1 main.tr2 temp.tr1 aux.tr2 aux.tr3}
  76. 6 "DROP TRIGGER IF EXISTS aux.tr1"
  77. {main.tr1 main.tr2 temp.tr1 aux.tr2 aux.tr3}
  78. 7 "DROP TRIGGER IF EXISTS aux.xxx"
  79. {main.tr1 main.tr2 temp.tr1 aux.tr1 aux.tr2 aux.tr3}
  80. 8 "DROP TRIGGER IF EXISTS aux.xxx"
  81. {main.tr1 main.tr2 temp.tr1 aux.tr1 aux.tr2 aux.tr3}
  82. }
  83. # EVIDENCE-OF: R-61172-15671 The DROP TRIGGER statement removes a
  84. # trigger created by the CREATE TRIGGER statement.
  85. #
  86. foreach {tn tbl droptrigger before after} {
  87. 1 t1 "DROP TRIGGER tr1" {temp.tr1} {}
  88. 2 t2 "DROP TRIGGER tr1" {main.tr1 main.tr2} {main.tr1 main.tr2}
  89. 3 t3 "DROP TRIGGER tr1" {aux.tr1 aux.tr3 aux.tr2} {aux.tr1 aux.tr3 aux.tr2}
  90. 4 t1 "DROP TRIGGER tr2" {temp.tr1} {temp.tr1}
  91. 5 t2 "DROP TRIGGER tr2" {main.tr1 main.tr2} {main.tr1}
  92. 6 t3 "DROP TRIGGER tr2" {aux.tr1 aux.tr3 aux.tr2} {aux.tr1 aux.tr3 aux.tr2}
  93. 7 t1 "DROP TRIGGER tr3" {temp.tr1} {temp.tr1}
  94. 8 t2 "DROP TRIGGER tr3" {main.tr1 main.tr2} {main.tr1 main.tr2}
  95. 9 t3 "DROP TRIGGER tr3" {aux.tr1 aux.tr3 aux.tr2} {aux.tr1 aux.tr2}
  96. } {
  97. do_test 2.$tn.1 {
  98. droptrigger_reopen_db
  99. execsql " INSERT INTO $tbl VALUES('1', '2') "
  100. set ::triggers_fired
  101. } $before
  102. do_test 2.$tn.2 {
  103. droptrigger_reopen_db
  104. execsql $droptrigger
  105. execsql " INSERT INTO $tbl VALUES('1', '2') "
  106. set ::triggers_fired
  107. } $after
  108. }
  109. # EVIDENCE-OF: R-50239-29811 Once removed, the trigger definition is no
  110. # longer present in the sqlite_master (or sqlite_temp_master) table and
  111. # is not fired by any subsequent INSERT, UPDATE or DELETE statements.
  112. #
  113. # Test cases e_droptrigger-1.* test the first part of this statement
  114. # (that dropped triggers do not appear in the schema table), and tests
  115. # droptrigger-2.* test that dropped triggers are not fired by INSERT
  116. # statements. The following tests verify that they are not fired by
  117. # UPDATE or DELETE statements.
  118. #
  119. foreach {tn tbl droptrigger before after} {
  120. 1 t1 "DROP TRIGGER tr1" {temp.tr1} {}
  121. 2 t2 "DROP TRIGGER tr1" {main.tr1 main.tr2} {main.tr1 main.tr2}
  122. 3 t3 "DROP TRIGGER tr1" {aux.tr1 aux.tr3 aux.tr2} {aux.tr1 aux.tr3 aux.tr2}
  123. 4 t1 "DROP TRIGGER tr2" {temp.tr1} {temp.tr1}
  124. 5 t2 "DROP TRIGGER tr2" {main.tr1 main.tr2} {main.tr1}
  125. 6 t3 "DROP TRIGGER tr2" {aux.tr1 aux.tr3 aux.tr2} {aux.tr1 aux.tr3 aux.tr2}
  126. 7 t1 "DROP TRIGGER tr3" {temp.tr1} {temp.tr1}
  127. 8 t2 "DROP TRIGGER tr3" {main.tr1 main.tr2} {main.tr1 main.tr2}
  128. 9 t3 "DROP TRIGGER tr3" {aux.tr1 aux.tr3 aux.tr2} {aux.tr1 aux.tr2}
  129. } {
  130. do_test 3.1.$tn.1 {
  131. droptrigger_reopen_db UPDATE
  132. execsql "UPDATE $tbl SET a = 'abc'"
  133. set ::triggers_fired
  134. } $before
  135. do_test 3.1.$tn.2 {
  136. droptrigger_reopen_db UPDATE
  137. execsql $droptrigger
  138. execsql "UPDATE $tbl SET a = 'abc'"
  139. set ::triggers_fired
  140. } $after
  141. }
  142. foreach {tn tbl droptrigger before after} {
  143. 1 t1 "DROP TRIGGER tr1" {temp.tr1} {}
  144. 2 t2 "DROP TRIGGER tr1" {main.tr1 main.tr2} {main.tr1 main.tr2}
  145. 3 t3 "DROP TRIGGER tr1" {aux.tr1 aux.tr3 aux.tr2} {aux.tr1 aux.tr3 aux.tr2}
  146. 4 t1 "DROP TRIGGER tr2" {temp.tr1} {temp.tr1}
  147. 5 t2 "DROP TRIGGER tr2" {main.tr1 main.tr2} {main.tr1}
  148. 6 t3 "DROP TRIGGER tr2" {aux.tr1 aux.tr3 aux.tr2} {aux.tr1 aux.tr3 aux.tr2}
  149. 7 t1 "DROP TRIGGER tr3" {temp.tr1} {temp.tr1}
  150. 8 t2 "DROP TRIGGER tr3" {main.tr1 main.tr2} {main.tr1 main.tr2}
  151. 9 t3 "DROP TRIGGER tr3" {aux.tr1 aux.tr3 aux.tr2} {aux.tr1 aux.tr2}
  152. } {
  153. do_test 3.2.$tn.1 {
  154. droptrigger_reopen_db DELETE
  155. execsql "DELETE FROM $tbl"
  156. set ::triggers_fired
  157. } $before
  158. do_test 3.2.$tn.2 {
  159. droptrigger_reopen_db DELETE
  160. execsql $droptrigger
  161. execsql "DELETE FROM $tbl"
  162. set ::triggers_fired
  163. } $after
  164. }
  165. # EVIDENCE-OF: R-37808-62273 Note that triggers are automatically
  166. # dropped when the associated table is dropped.
  167. #
  168. do_test 4.1 {
  169. droptrigger_reopen_db
  170. list_all_triggers
  171. } {main.tr1 main.tr2 temp.tr1 aux.tr1 aux.tr2 aux.tr3}
  172. do_test 4.2 {
  173. droptrigger_reopen_db
  174. execsql "DROP TABLE t1"
  175. list_all_triggers
  176. } {main.tr1 main.tr2 aux.tr1 aux.tr2 aux.tr3}
  177. do_test 4.3 {
  178. droptrigger_reopen_db
  179. execsql "DROP TABLE t1"
  180. list_all_triggers
  181. } {main.tr1 main.tr2 aux.tr1 aux.tr2 aux.tr3}
  182. do_test 4.4 {
  183. droptrigger_reopen_db
  184. execsql "DROP TABLE t1"
  185. list_all_triggers
  186. } {main.tr1 main.tr2 aux.tr1 aux.tr2 aux.tr3}
  187. finish_test