trigger3.test 5.0 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 RAISE() function.
  11. #
  12. set testdir [file dirname $argv0]
  13. source $testdir/tester.tcl
  14. ifcapable {!trigger} {
  15. finish_test
  16. return
  17. }
  18. # The tests in this file were written before SQLite supported recursive }
  19. # trigger invocation, and some tests depend on that to pass. So disable
  20. # recursive triggers for this file.
  21. catchsql { pragma recursive_triggers = off }
  22. # Test that we can cause ROLLBACK, FAIL and ABORT correctly
  23. #
  24. catchsql { CREATE TABLE tbl(a, b ,c) }
  25. execsql {
  26. CREATE TRIGGER before_tbl_insert BEFORE INSERT ON tbl BEGIN SELECT CASE
  27. WHEN (new.a = 4) THEN RAISE(IGNORE) END;
  28. END;
  29. CREATE TRIGGER after_tbl_insert AFTER INSERT ON tbl BEGIN SELECT CASE
  30. WHEN (new.a = 1) THEN RAISE(ABORT, 'Trigger abort')
  31. WHEN (new.a = 2) THEN RAISE(FAIL, 'Trigger fail')
  32. WHEN (new.a = 3) THEN RAISE(ROLLBACK, 'Trigger rollback') END;
  33. END;
  34. }
  35. # ABORT
  36. do_test trigger3-1.1 {
  37. catchsql {
  38. BEGIN;
  39. INSERT INTO tbl VALUES (5, 5, 6);
  40. INSERT INTO tbl VALUES (1, 5, 6);
  41. }
  42. } {1 {Trigger abort}}
  43. verify_ex_errcode trigger3-1.1b SQLITE_CONSTRAINT_TRIGGER
  44. do_test trigger3-1.2 {
  45. execsql {
  46. SELECT * FROM tbl;
  47. ROLLBACK;
  48. }
  49. } {5 5 6}
  50. do_test trigger3-1.3 {
  51. execsql {SELECT * FROM tbl}
  52. } {}
  53. # FAIL
  54. do_test trigger3-2.1 {
  55. catchsql {
  56. BEGIN;
  57. INSERT INTO tbl VALUES (5, 5, 6);
  58. INSERT INTO tbl VALUES (2, 5, 6);
  59. }
  60. } {1 {Trigger fail}}
  61. verify_ex_errcode trigger3-2.1b SQLITE_CONSTRAINT_TRIGGER
  62. do_test trigger3-2.2 {
  63. execsql {
  64. SELECT * FROM tbl;
  65. ROLLBACK;
  66. }
  67. } {5 5 6 2 5 6}
  68. # ROLLBACK
  69. do_test trigger3-3.1 {
  70. catchsql {
  71. BEGIN;
  72. INSERT INTO tbl VALUES (5, 5, 6);
  73. INSERT INTO tbl VALUES (3, 5, 6);
  74. }
  75. } {1 {Trigger rollback}}
  76. verify_ex_errcode trigger3-3.1b SQLITE_CONSTRAINT_TRIGGER
  77. do_test trigger3-3.2 {
  78. execsql {
  79. SELECT * FROM tbl;
  80. }
  81. } {}
  82. # Verify that a ROLLBACK trigger works like a FAIL trigger if
  83. # we are not within a transaction. Ticket #3035.
  84. #
  85. do_test trigger3-3.3 {
  86. catchsql {COMMIT}
  87. catchsql {
  88. INSERT INTO tbl VALUES (3, 9, 10);
  89. }
  90. } {1 {Trigger rollback}}
  91. verify_ex_errcode trigger3-3.3b SQLITE_CONSTRAINT_TRIGGER
  92. do_test trigger3-3.4 {
  93. execsql {SELECT * FROM tbl}
  94. } {}
  95. # IGNORE
  96. do_test trigger3-4.1 {
  97. catchsql {
  98. BEGIN;
  99. INSERT INTO tbl VALUES (5, 5, 6);
  100. INSERT INTO tbl VALUES (4, 5, 6);
  101. }
  102. } {0 {}}
  103. do_test trigger3-4.2 {
  104. execsql {
  105. SELECT * FROM tbl;
  106. ROLLBACK;
  107. }
  108. } {5 5 6}
  109. # Check that we can also do RAISE(IGNORE) for UPDATE and DELETE
  110. execsql {DROP TABLE tbl;}
  111. execsql {CREATE TABLE tbl (a, b, c);}
  112. execsql {INSERT INTO tbl VALUES(1, 2, 3);}
  113. execsql {INSERT INTO tbl VALUES(4, 5, 6);}
  114. execsql {
  115. CREATE TRIGGER before_tbl_update BEFORE UPDATE ON tbl BEGIN
  116. SELECT CASE WHEN (old.a = 1) THEN RAISE(IGNORE) END;
  117. END;
  118. CREATE TRIGGER before_tbl_delete BEFORE DELETE ON tbl BEGIN
  119. SELECT CASE WHEN (old.a = 1) THEN RAISE(IGNORE) END;
  120. END;
  121. }
  122. do_test trigger3-5.1 {
  123. execsql {
  124. UPDATE tbl SET c = 10;
  125. SELECT * FROM tbl;
  126. }
  127. } {1 2 3 4 5 10}
  128. do_test trigger3-5.2 {
  129. execsql {
  130. DELETE FROM tbl;
  131. SELECT * FROM tbl;
  132. }
  133. } {1 2 3}
  134. # Check that RAISE(IGNORE) works correctly for nested triggers:
  135. execsql {CREATE TABLE tbl2(a, b, c)}
  136. execsql {
  137. CREATE TRIGGER after_tbl2_insert AFTER INSERT ON tbl2 BEGIN
  138. UPDATE tbl SET c = 10;
  139. INSERT INTO tbl2 VALUES (new.a, new.b, new.c);
  140. END;
  141. }
  142. do_test trigger3-6 {
  143. execsql {
  144. INSERT INTO tbl2 VALUES (1, 2, 3);
  145. SELECT * FROM tbl2;
  146. SELECT * FROM tbl;
  147. }
  148. } {1 2 3 1 2 3 1 2 3}
  149. # Check that things also work for view-triggers
  150. ifcapable view {
  151. execsql {CREATE VIEW tbl_view AS SELECT * FROM tbl}
  152. execsql {
  153. CREATE TRIGGER tbl_view_insert INSTEAD OF INSERT ON tbl_view BEGIN
  154. SELECT CASE WHEN (new.a = 1) THEN RAISE(ROLLBACK, 'View rollback')
  155. WHEN (new.a = 2) THEN RAISE(IGNORE)
  156. WHEN (new.a = 3) THEN RAISE(ABORT, 'View abort') END;
  157. END;
  158. }
  159. do_test trigger3-7.1 {
  160. catchsql {
  161. INSERT INTO tbl_view VALUES(1, 2, 3);
  162. }
  163. } {1 {View rollback}}
  164. verify_ex_errcode trigger3-7.1b SQLITE_CONSTRAINT_TRIGGER
  165. do_test trigger3-7.2 {
  166. catchsql {
  167. INSERT INTO tbl_view VALUES(2, 2, 3);
  168. }
  169. } {0 {}}
  170. do_test trigger3-7.3 {
  171. catchsql {
  172. INSERT INTO tbl_view VALUES(3, 2, 3);
  173. }
  174. } {1 {View abort}}
  175. verify_ex_errcode trigger3-7.3b SQLITE_CONSTRAINT_TRIGGER
  176. } ;# ifcapable view
  177. integrity_check trigger3-8.1
  178. catchsql { DROP TABLE tbl; }
  179. catchsql { DROP TABLE tbl2; }
  180. catchsql { DROP VIEW tbl_view; }
  181. finish_test