/ Hex Artifact Content
Login

Artifact aa640bb2bbb03edd5ff69c055117ea088f121945:


0000: 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 73  # The author dis
0010: 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74  claims copyright
0020: 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20   to this source 
0030: 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20  code.  In place 
0040: 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f 74  of.# a legal not
0050: 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20 62  ice, here is a b
0060: 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20 20  lessing:.#.#    
0070: 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20  May you do good 
0080: 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23 20  and not evil..# 
0090: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00a0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00b0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00c0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20 20  give others..#  
00d0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
00e0: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
00f0: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0100: 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a 2a  ou give..#.#****
0110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 0a 23 0a 23 20 54 68 69 73 20 66 69 6c  ***.#.# This fil
0160: 65 20 74 65 73 74 73 20 74 68 65 20 52 41 49 53  e tests the RAIS
0170: 45 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 23 0a  E() function..#.
0180: 0a 0a 73 65 74 20 74 65 73 74 64 69 72 20 5b 66  ..set testdir [f
0190: 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 61 72 67  ile dirname $arg
01a0: 76 30 5d 0a 73 6f 75 72 63 65 20 24 74 65 73 74  v0].source $test
01b0: 64 69 72 2f 74 65 73 74 65 72 2e 74 63 6c 0a 69  dir/tester.tcl.i
01c0: 66 63 61 70 61 62 6c 65 20 7b 21 74 72 69 67 67  fcapable {!trigg
01d0: 65 72 7d 20 7b 0a 20 20 66 69 6e 69 73 68 5f 74  er} {.  finish_t
01e0: 65 73 74 0a 20 20 72 65 74 75 72 6e 0a 7d 0a 0a  est.  return.}..
01f0: 23 20 54 68 65 20 74 65 73 74 73 20 69 6e 20 74  # The tests in t
0200: 68 69 73 20 66 69 6c 65 20 77 65 72 65 20 77 72  his file were wr
0210: 69 74 74 65 6e 20 62 65 66 6f 72 65 20 53 51 4c  itten before SQL
0220: 69 74 65 20 73 75 70 70 6f 72 74 65 64 20 72 65  ite supported re
0230: 63 75 72 73 69 76 65 20 7d 0a 23 20 74 72 69 67  cursive }.# trig
0240: 67 65 72 20 69 6e 76 6f 63 61 74 69 6f 6e 2c 20  ger invocation, 
0250: 61 6e 64 20 73 6f 6d 65 20 74 65 73 74 73 20 64  and some tests d
0260: 65 70 65 6e 64 20 6f 6e 20 74 68 61 74 20 74 6f  epend on that to
0270: 20 70 61 73 73 2e 20 53 6f 20 64 69 73 61 62 6c   pass. So disabl
0280: 65 0a 23 20 72 65 63 75 72 73 69 76 65 20 74 72  e.# recursive tr
0290: 69 67 67 65 72 73 20 66 6f 72 20 74 68 69 73 20  iggers for this 
02a0: 66 69 6c 65 2e 0a 63 61 74 63 68 73 71 6c 20 7b  file..catchsql {
02b0: 20 70 72 61 67 6d 61 20 72 65 63 75 72 73 69 76   pragma recursiv
02c0: 65 5f 74 72 69 67 67 65 72 73 20 3d 20 6f 66 66  e_triggers = off
02d0: 20 7d 20 0a 0a 23 20 54 65 73 74 20 74 68 61 74   } ..# Test that
02e0: 20 77 65 20 63 61 6e 20 63 61 75 73 65 20 52 4f   we can cause RO
02f0: 4c 4c 42 41 43 4b 2c 20 46 41 49 4c 20 61 6e 64  LLBACK, FAIL and
0300: 20 41 42 4f 52 54 20 63 6f 72 72 65 63 74 6c 79   ABORT correctly
0310: 0a 23 0a 63 61 74 63 68 73 71 6c 20 7b 20 43 52  .#.catchsql { CR
0320: 45 41 54 45 20 54 41 42 4c 45 20 74 62 6c 28 61  EATE TABLE tbl(a
0330: 2c 20 62 20 2c 63 29 20 7d 0a 65 78 65 63 73 71  , b ,c) }.execsq
0340: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
0350: 52 49 47 47 45 52 20 62 65 66 6f 72 65 5f 74 62  RIGGER before_tb
0360: 6c 5f 69 6e 73 65 72 74 20 42 45 46 4f 52 45 20  l_insert BEFORE 
0370: 49 4e 53 45 52 54 20 4f 4e 20 74 62 6c 20 42 45  INSERT ON tbl BE
0380: 47 49 4e 20 53 45 4c 45 43 54 20 43 41 53 45 20  GIN SELECT CASE 
0390: 0a 20 20 20 20 20 20 20 20 57 48 45 4e 20 28 6e  .        WHEN (n
03a0: 65 77 2e 61 20 3d 20 34 29 20 54 48 45 4e 20 52  ew.a = 4) THEN R
03b0: 41 49 53 45 28 49 47 4e 4f 52 45 29 20 45 4e 44  AISE(IGNORE) END
03c0: 3b 0a 20 20 20 20 45 4e 44 3b 0a 0a 20 20 20 20  ;.    END;..    
03d0: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 61  CREATE TRIGGER a
03e0: 66 74 65 72 5f 74 62 6c 5f 69 6e 73 65 72 74 20  fter_tbl_insert 
03f0: 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f 4e 20  AFTER INSERT ON 
0400: 74 62 6c 20 42 45 47 49 4e 20 53 45 4c 45 43 54  tbl BEGIN SELECT
0410: 20 43 41 53 45 20 0a 20 20 20 20 20 20 20 20 57   CASE .        W
0420: 48 45 4e 20 28 6e 65 77 2e 61 20 3d 20 31 29 20  HEN (new.a = 1) 
0430: 54 48 45 4e 20 52 41 49 53 45 28 41 42 4f 52 54  THEN RAISE(ABORT
0440: 2c 20 20 20 20 27 54 72 69 67 67 65 72 20 61 62  ,    'Trigger ab
0450: 6f 72 74 27 29 20 0a 20 20 20 20 20 20 20 20 57  ort') .        W
0460: 48 45 4e 20 28 6e 65 77 2e 61 20 3d 20 32 29 20  HEN (new.a = 2) 
0470: 54 48 45 4e 20 52 41 49 53 45 28 46 41 49 4c 2c  THEN RAISE(FAIL,
0480: 20 20 20 20 20 27 54 72 69 67 67 65 72 20 66 61       'Trigger fa
0490: 69 6c 27 29 20 0a 20 20 20 20 20 20 20 20 57 48  il') .        WH
04a0: 45 4e 20 28 6e 65 77 2e 61 20 3d 20 33 29 20 54  EN (new.a = 3) T
04b0: 48 45 4e 20 52 41 49 53 45 28 52 4f 4c 4c 42 41  HEN RAISE(ROLLBA
04c0: 43 4b 2c 20 27 54 72 69 67 67 65 72 20 72 6f 6c  CK, 'Trigger rol
04d0: 6c 62 61 63 6b 27 29 20 45 4e 44 3b 0a 20 20 20  lback') END;.   
04e0: 20 45 4e 44 3b 0a 7d 0a 23 20 41 42 4f 52 54 0a   END;.}.# ABORT.
04f0: 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 33  do_test trigger3
0500: 2d 31 2e 31 20 7b 0a 20 20 20 20 63 61 74 63 68  -1.1 {.    catch
0510: 73 71 6c 20 7b 0a 20 20 20 20 20 20 20 20 42 45  sql {.        BE
0520: 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 49 4e 53  GIN;.        INS
0530: 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 56 41 4c  ERT INTO tbl VAL
0540: 55 45 53 20 28 35 2c 20 35 2c 20 36 29 3b 0a 20  UES (5, 5, 6);. 
0550: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
0560: 54 4f 20 74 62 6c 20 56 41 4c 55 45 53 20 28 31  TO tbl VALUES (1
0570: 2c 20 35 2c 20 36 29 3b 0a 20 20 20 20 7d 0a 7d  , 5, 6);.    }.}
0580: 20 7b 31 20 7b 54 72 69 67 67 65 72 20 61 62 6f   {1 {Trigger abo
0590: 72 74 7d 7d 0a 76 65 72 69 66 79 5f 65 78 5f 65  rt}}.verify_ex_e
05a0: 72 72 63 6f 64 65 20 74 72 69 67 67 65 72 33 2d  rrcode trigger3-
05b0: 31 2e 31 62 20 53 51 4c 49 54 45 5f 43 4f 4e 53  1.1b SQLITE_CONS
05c0: 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52 0a 64  TRAINT_TRIGGER.d
05d0: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 33 2d  o_test trigger3-
05e0: 31 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71  1.2 {.    execsq
05f0: 6c 20 7b 0a 20 20 20 20 20 20 20 20 53 45 4c 45  l {.        SELE
0600: 43 54 20 2a 20 46 52 4f 4d 20 74 62 6c 3b 0a 20  CT * FROM tbl;. 
0610: 20 20 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b         ROLLBACK;
0620: 0a 20 20 20 20 7d 0a 7d 20 7b 35 20 35 20 36 7d  .    }.} {5 5 6}
0630: 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72  .do_test trigger
0640: 33 2d 31 2e 33 20 7b 0a 20 20 20 20 65 78 65 63  3-1.3 {.    exec
0650: 73 71 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52  sql {SELECT * FR
0660: 4f 4d 20 74 62 6c 7d 0a 7d 20 7b 7d 0a 0a 23 20  OM tbl}.} {}..# 
0670: 46 41 49 4c 0a 64 6f 5f 74 65 73 74 20 74 72 69  FAIL.do_test tri
0680: 67 67 65 72 33 2d 32 2e 31 20 7b 0a 20 20 20 20  gger3-2.1 {.    
0690: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 20  catchsql {.     
06a0: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
06b0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62    INSERT INTO tb
06c0: 6c 20 56 41 4c 55 45 53 20 28 35 2c 20 35 2c 20  l VALUES (5, 5, 
06d0: 36 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45  6);.        INSE
06e0: 52 54 20 49 4e 54 4f 20 74 62 6c 20 56 41 4c 55  RT INTO tbl VALU
06f0: 45 53 20 28 32 2c 20 35 2c 20 36 29 3b 0a 20 20  ES (2, 5, 6);.  
0700: 20 20 7d 0a 7d 20 7b 31 20 7b 54 72 69 67 67 65    }.} {1 {Trigge
0710: 72 20 66 61 69 6c 7d 7d 0a 76 65 72 69 66 79 5f  r fail}}.verify_
0720: 65 78 5f 65 72 72 63 6f 64 65 20 74 72 69 67 67  ex_errcode trigg
0730: 65 72 33 2d 32 2e 31 62 20 53 51 4c 49 54 45 5f  er3-2.1b SQLITE_
0740: 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47  CONSTRAINT_TRIGG
0750: 45 52 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67  ER.do_test trigg
0760: 65 72 33 2d 32 2e 32 20 7b 0a 20 20 20 20 65 78  er3-2.2 {.    ex
0770: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 20 20  ecsql {.        
0780: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 62  SELECT * FROM tb
0790: 6c 3b 0a 20 20 20 20 20 20 20 20 52 4f 4c 4c 42  l;.        ROLLB
07a0: 41 43 4b 3b 0a 20 20 20 20 7d 0a 7d 20 7b 35 20  ACK;.    }.} {5 
07b0: 35 20 36 20 32 20 35 20 36 7d 0a 23 20 52 4f 4c  5 6 2 5 6}.# ROL
07c0: 4c 42 41 43 4b 0a 64 6f 5f 74 65 73 74 20 74 72  LBACK.do_test tr
07d0: 69 67 67 65 72 33 2d 33 2e 31 20 7b 0a 20 20 20  igger3-3.1 {.   
07e0: 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20   catchsql {.    
07f0: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
0800: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
0810: 62 6c 20 56 41 4c 55 45 53 20 28 35 2c 20 35 2c  bl VALUES (5, 5,
0820: 20 36 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53   6);.        INS
0830: 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 56 41 4c  ERT INTO tbl VAL
0840: 55 45 53 20 28 33 2c 20 35 2c 20 36 29 3b 0a 20  UES (3, 5, 6);. 
0850: 20 20 20 7d 0a 7d 20 7b 31 20 7b 54 72 69 67 67     }.} {1 {Trigg
0860: 65 72 20 72 6f 6c 6c 62 61 63 6b 7d 7d 0a 76 65  er rollback}}.ve
0870: 72 69 66 79 5f 65 78 5f 65 72 72 63 6f 64 65 20  rify_ex_errcode 
0880: 74 72 69 67 67 65 72 33 2d 33 2e 31 62 20 53 51  trigger3-3.1b SQ
0890: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
08a0: 54 52 49 47 47 45 52 0a 64 6f 5f 74 65 73 74 20  TRIGGER.do_test 
08b0: 74 72 69 67 67 65 72 33 2d 33 2e 32 20 7b 0a 20  trigger3-3.2 {. 
08c0: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
08d0: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
08e0: 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 7d 0a 7d 20  OM tbl;.    }.} 
08f0: 7b 7d 0a 0a 23 20 56 65 72 69 66 79 20 74 68 61  {}..# Verify tha
0900: 74 20 61 20 52 4f 4c 4c 42 41 43 4b 20 74 72 69  t a ROLLBACK tri
0910: 67 67 65 72 20 77 6f 72 6b 73 20 6c 69 6b 65 20  gger works like 
0920: 61 20 46 41 49 4c 20 74 72 69 67 67 65 72 20 69  a FAIL trigger i
0930: 66 0a 23 20 77 65 20 61 72 65 20 6e 6f 74 20 77  f.# we are not w
0940: 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74  ithin a transact
0950: 69 6f 6e 2e 20 20 54 69 63 6b 65 74 20 23 33 30  ion.  Ticket #30
0960: 33 35 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 74 72  35..#.do_test tr
0970: 69 67 67 65 72 33 2d 33 2e 33 20 7b 0a 20 20 20  igger3-3.3 {.   
0980: 20 63 61 74 63 68 73 71 6c 20 7b 43 4f 4d 4d 49   catchsql {COMMI
0990: 54 7d 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20  T}.    catchsql 
09a0: 7b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  {.        INSERT
09b0: 20 49 4e 54 4f 20 74 62 6c 20 56 41 4c 55 45 53   INTO tbl VALUES
09c0: 20 28 33 2c 20 39 2c 20 31 30 29 3b 0a 20 20 20   (3, 9, 10);.   
09d0: 20 7d 0a 7d 20 7b 31 20 7b 54 72 69 67 67 65 72   }.} {1 {Trigger
09e0: 20 72 6f 6c 6c 62 61 63 6b 7d 7d 0a 76 65 72 69   rollback}}.veri
09f0: 66 79 5f 65 78 5f 65 72 72 63 6f 64 65 20 74 72  fy_ex_errcode tr
0a00: 69 67 67 65 72 33 2d 33 2e 33 62 20 53 51 4c 49  igger3-3.3b SQLI
0a10: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52  TE_CONSTRAINT_TR
0a20: 49 47 47 45 52 0a 64 6f 5f 74 65 73 74 20 74 72  IGGER.do_test tr
0a30: 69 67 67 65 72 33 2d 33 2e 34 20 7b 0a 20 20 20  igger3-3.4 {.   
0a40: 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54   execsql {SELECT
0a50: 20 2a 20 46 52 4f 4d 20 74 62 6c 7d 0a 7d 20 7b   * FROM tbl}.} {
0a60: 7d 0a 0a 23 20 49 47 4e 4f 52 45 0a 64 6f 5f 74  }..# IGNORE.do_t
0a70: 65 73 74 20 74 72 69 67 67 65 72 33 2d 34 2e 31  est trigger3-4.1
0a80: 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20   {.    catchsql 
0a90: 7b 0a 20 20 20 20 20 20 20 20 42 45 47 49 4e 3b  {.        BEGIN;
0aa0: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
0ab0: 49 4e 54 4f 20 74 62 6c 20 56 41 4c 55 45 53 20  INTO tbl VALUES 
0ac0: 28 35 2c 20 35 2c 20 36 29 3b 0a 20 20 20 20 20  (5, 5, 6);.     
0ad0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
0ae0: 62 6c 20 56 41 4c 55 45 53 20 28 34 2c 20 35 2c  bl VALUES (4, 5,
0af0: 20 36 29 3b 0a 20 20 20 20 7d 0a 7d 20 7b 30 20   6);.    }.} {0 
0b00: 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67  {}}.do_test trig
0b10: 67 65 72 33 2d 34 2e 32 20 7b 0a 20 20 20 20 65  ger3-4.2 {.    e
0b20: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 20  xecsql {.       
0b30: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0b40: 62 6c 3b 0a 20 20 20 20 20 20 20 20 52 4f 4c 4c  bl;.        ROLL
0b50: 42 41 43 4b 3b 0a 20 20 20 20 7d 0a 7d 20 7b 35  BACK;.    }.} {5
0b60: 20 35 20 36 7d 0a 0a 23 20 43 68 65 63 6b 20 74   5 6}..# Check t
0b70: 68 61 74 20 77 65 20 63 61 6e 20 61 6c 73 6f 20  hat we can also 
0b80: 64 6f 20 52 41 49 53 45 28 49 47 4e 4f 52 45 29  do RAISE(IGNORE)
0b90: 20 66 6f 72 20 55 50 44 41 54 45 20 61 6e 64 20   for UPDATE and 
0ba0: 44 45 4c 45 54 45 0a 65 78 65 63 73 71 6c 20 7b  DELETE.execsql {
0bb0: 44 52 4f 50 20 54 41 42 4c 45 20 74 62 6c 3b 7d  DROP TABLE tbl;}
0bc0: 0a 65 78 65 63 73 71 6c 20 7b 43 52 45 41 54 45  .execsql {CREATE
0bd0: 20 54 41 42 4c 45 20 74 62 6c 20 28 61 2c 20 62   TABLE tbl (a, b
0be0: 2c 20 63 29 3b 7d 0a 65 78 65 63 73 71 6c 20 7b  , c);}.execsql {
0bf0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20  INSERT INTO tbl 
0c00: 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 3b  VALUES(1, 2, 3);
0c10: 7d 0a 65 78 65 63 73 71 6c 20 7b 49 4e 53 45 52  }.execsql {INSER
0c20: 54 20 49 4e 54 4f 20 74 62 6c 20 56 41 4c 55 45  T INTO tbl VALUE
0c30: 53 28 34 2c 20 35 2c 20 36 29 3b 7d 0a 65 78 65  S(4, 5, 6);}.exe
0c40: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
0c50: 45 20 54 52 49 47 47 45 52 20 62 65 66 6f 72 65  E TRIGGER before
0c60: 5f 74 62 6c 5f 75 70 64 61 74 65 20 42 45 46 4f  _tbl_update BEFO
0c70: 52 45 20 55 50 44 41 54 45 20 4f 4e 20 74 62 6c  RE UPDATE ON tbl
0c80: 20 42 45 47 49 4e 0a 20 20 20 20 20 20 20 20 53   BEGIN.        S
0c90: 45 4c 45 43 54 20 43 41 53 45 20 57 48 45 4e 20  ELECT CASE WHEN 
0ca0: 28 6f 6c 64 2e 61 20 3d 20 31 29 20 54 48 45 4e  (old.a = 1) THEN
0cb0: 20 52 41 49 53 45 28 49 47 4e 4f 52 45 29 20 45   RAISE(IGNORE) E
0cc0: 4e 44 3b 0a 20 20 20 20 45 4e 44 3b 0a 0a 20 20  ND;.    END;..  
0cd0: 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52    CREATE TRIGGER
0ce0: 20 62 65 66 6f 72 65 5f 74 62 6c 5f 64 65 6c 65   before_tbl_dele
0cf0: 74 65 20 42 45 46 4f 52 45 20 44 45 4c 45 54 45  te BEFORE DELETE
0d00: 20 4f 4e 20 74 62 6c 20 42 45 47 49 4e 0a 20 20   ON tbl BEGIN.  
0d10: 20 20 20 20 20 20 53 45 4c 45 43 54 20 43 41 53        SELECT CAS
0d20: 45 20 57 48 45 4e 20 28 6f 6c 64 2e 61 20 3d 20  E WHEN (old.a = 
0d30: 31 29 20 54 48 45 4e 20 52 41 49 53 45 28 49 47  1) THEN RAISE(IG
0d40: 4e 4f 52 45 29 20 45 4e 44 3b 0a 20 20 20 20 45  NORE) END;.    E
0d50: 4e 44 3b 0a 7d 0a 64 6f 5f 74 65 73 74 20 74 72  ND;.}.do_test tr
0d60: 69 67 67 65 72 33 2d 35 2e 31 20 7b 0a 20 20 20  igger3-5.1 {.   
0d70: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
0d80: 20 20 20 55 50 44 41 54 45 20 74 62 6c 20 53 45     UPDATE tbl SE
0d90: 54 20 63 20 3d 20 31 30 3b 0a 20 20 20 20 20 20  T c = 10;.      
0da0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
0db0: 74 62 6c 3b 0a 20 20 20 20 7d 0a 7d 20 7b 31 20  tbl;.    }.} {1 
0dc0: 32 20 33 20 34 20 35 20 31 30 7d 0a 64 6f 5f 74  2 3 4 5 10}.do_t
0dd0: 65 73 74 20 74 72 69 67 67 65 72 33 2d 35 2e 32  est trigger3-5.2
0de0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
0df0: 0a 20 20 20 20 20 20 20 20 44 45 4c 45 54 45 20  .        DELETE 
0e00: 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 20 20  FROM tbl;.      
0e10: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
0e20: 74 62 6c 3b 0a 20 20 20 20 7d 0a 7d 20 7b 31 20  tbl;.    }.} {1 
0e30: 32 20 33 7d 0a 0a 23 20 43 68 65 63 6b 20 74 68  2 3}..# Check th
0e40: 61 74 20 52 41 49 53 45 28 49 47 4e 4f 52 45 29  at RAISE(IGNORE)
0e50: 20 77 6f 72 6b 73 20 63 6f 72 72 65 63 74 6c 79   works correctly
0e60: 20 66 6f 72 20 6e 65 73 74 65 64 20 74 72 69 67   for nested trig
0e70: 67 65 72 73 3a 0a 65 78 65 63 73 71 6c 20 7b 43  gers:.execsql {C
0e80: 52 45 41 54 45 20 54 41 42 4c 45 20 74 62 6c 32  REATE TABLE tbl2
0e90: 28 61 2c 20 62 2c 20 63 29 7d 0a 65 78 65 63 73  (a, b, c)}.execs
0ea0: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
0eb0: 54 52 49 47 47 45 52 20 61 66 74 65 72 5f 74 62  TRIGGER after_tb
0ec0: 6c 32 5f 69 6e 73 65 72 74 20 41 46 54 45 52 20  l2_insert AFTER 
0ed0: 49 4e 53 45 52 54 20 4f 4e 20 74 62 6c 32 20 42  INSERT ON tbl2 B
0ee0: 45 47 49 4e 0a 20 20 20 20 20 20 20 20 55 50 44  EGIN.        UPD
0ef0: 41 54 45 20 74 62 6c 20 53 45 54 20 63 20 3d 20  ATE tbl SET c = 
0f00: 31 30 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45  10;.        INSE
0f10: 52 54 20 49 4e 54 4f 20 74 62 6c 32 20 56 41 4c  RT INTO tbl2 VAL
0f20: 55 45 53 20 28 6e 65 77 2e 61 2c 20 6e 65 77 2e  UES (new.a, new.
0f30: 62 2c 20 6e 65 77 2e 63 29 3b 0a 20 20 20 20 45  b, new.c);.    E
0f40: 4e 44 3b 0a 7d 0a 64 6f 5f 74 65 73 74 20 74 72  ND;.}.do_test tr
0f50: 69 67 67 65 72 33 2d 36 20 7b 0a 20 20 20 20 65  igger3-6 {.    e
0f60: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 20  xecsql {.       
0f70: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c   INSERT INTO tbl
0f80: 32 20 56 41 4c 55 45 53 20 28 31 2c 20 32 2c 20  2 VALUES (1, 2, 
0f90: 33 29 3b 0a 20 20 20 20 20 20 20 20 53 45 4c 45  3);.        SELE
0fa0: 43 54 20 2a 20 46 52 4f 4d 20 74 62 6c 32 3b 0a  CT * FROM tbl2;.
0fb0: 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a          SELECT *
0fc0: 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 7d   FROM tbl;.    }
0fd0: 0a 7d 20 7b 31 20 32 20 33 20 31 20 32 20 33 20  .} {1 2 3 1 2 3 
0fe0: 31 20 32 20 33 7d 0a 0a 23 20 43 68 65 63 6b 20  1 2 3}..# Check 
0ff0: 74 68 61 74 20 74 68 69 6e 67 73 20 61 6c 73 6f  that things also
1000: 20 77 6f 72 6b 20 66 6f 72 20 76 69 65 77 2d 74   work for view-t
1010: 72 69 67 67 65 72 73 0a 0a 69 66 63 61 70 61 62  riggers..ifcapab
1020: 6c 65 20 76 69 65 77 20 7b 0a 0a 65 78 65 63 73  le view {..execs
1030: 71 6c 20 7b 43 52 45 41 54 45 20 56 49 45 57 20  ql {CREATE VIEW 
1040: 74 62 6c 5f 76 69 65 77 20 41 53 20 53 45 4c 45  tbl_view AS SELE
1050: 43 54 20 2a 20 46 52 4f 4d 20 74 62 6c 7d 0a 65  CT * FROM tbl}.e
1060: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
1070: 41 54 45 20 54 52 49 47 47 45 52 20 74 62 6c 5f  ATE TRIGGER tbl_
1080: 76 69 65 77 5f 69 6e 73 65 72 74 20 49 4e 53 54  view_insert INST
1090: 45 41 44 20 4f 46 20 49 4e 53 45 52 54 20 4f 4e  EAD OF INSERT ON
10a0: 20 74 62 6c 5f 76 69 65 77 20 42 45 47 49 4e 0a   tbl_view BEGIN.
10b0: 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 43          SELECT C
10c0: 41 53 45 20 57 48 45 4e 20 28 6e 65 77 2e 61 20  ASE WHEN (new.a 
10d0: 3d 20 31 29 20 54 48 45 4e 20 52 41 49 53 45 28  = 1) THEN RAISE(
10e0: 52 4f 4c 4c 42 41 43 4b 2c 20 27 56 69 65 77 20  ROLLBACK, 'View 
10f0: 72 6f 6c 6c 62 61 63 6b 27 29 0a 20 20 20 20 20  rollback').     
1100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
1110: 48 45 4e 20 28 6e 65 77 2e 61 20 3d 20 32 29 20  HEN (new.a = 2) 
1120: 54 48 45 4e 20 52 41 49 53 45 28 49 47 4e 4f 52  THEN RAISE(IGNOR
1130: 45 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  E) .            
1140: 20 20 20 20 20 20 20 20 57 48 45 4e 20 28 6e 65          WHEN (ne
1150: 77 2e 61 20 3d 20 33 29 20 54 48 45 4e 20 52 41  w.a = 3) THEN RA
1160: 49 53 45 28 41 42 4f 52 54 2c 20 27 56 69 65 77  ISE(ABORT, 'View
1170: 20 61 62 6f 72 74 27 29 20 45 4e 44 3b 0a 20 20   abort') END;.  
1180: 20 20 45 4e 44 3b 0a 7d 0a 0a 64 6f 5f 74 65 73    END;.}..do_tes
1190: 74 20 74 72 69 67 67 65 72 33 2d 37 2e 31 20 7b  t trigger3-7.1 {
11a0: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 0a  .    catchsql {.
11b0: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
11c0: 4e 54 4f 20 74 62 6c 5f 76 69 65 77 20 56 41 4c  NTO tbl_view VAL
11d0: 55 45 53 28 31 2c 20 32 2c 20 33 29 3b 0a 20 20  UES(1, 2, 3);.  
11e0: 20 20 7d 0a 7d 20 7b 31 20 7b 56 69 65 77 20 72    }.} {1 {View r
11f0: 6f 6c 6c 62 61 63 6b 7d 7d 0a 76 65 72 69 66 79  ollback}}.verify
1200: 5f 65 78 5f 65 72 72 63 6f 64 65 20 74 72 69 67  _ex_errcode trig
1210: 67 65 72 33 2d 37 2e 31 62 20 53 51 4c 49 54 45  ger3-7.1b SQLITE
1220: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47  _CONSTRAINT_TRIG
1230: 47 45 52 0a 64 6f 5f 74 65 73 74 20 74 72 69 67  GER.do_test trig
1240: 67 65 72 33 2d 37 2e 32 20 7b 0a 20 20 20 20 63  ger3-7.2 {.    c
1250: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 20 20  atchsql {.      
1260: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62    INSERT INTO tb
1270: 6c 5f 76 69 65 77 20 56 41 4c 55 45 53 28 32 2c  l_view VALUES(2,
1280: 20 32 2c 20 33 29 3b 0a 20 20 20 20 7d 0a 7d 20   2, 3);.    }.} 
1290: 7b 30 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 74  {0 {}}.do_test t
12a0: 72 69 67 67 65 72 33 2d 37 2e 33 20 7b 0a 20 20  rigger3-7.3 {.  
12b0: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
12c0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
12d0: 20 74 62 6c 5f 76 69 65 77 20 56 41 4c 55 45 53   tbl_view VALUES
12e0: 28 33 2c 20 32 2c 20 33 29 3b 0a 20 20 20 20 7d  (3, 2, 3);.    }
12f0: 0a 7d 20 7b 31 20 7b 56 69 65 77 20 61 62 6f 72  .} {1 {View abor
1300: 74 7d 7d 0a 76 65 72 69 66 79 5f 65 78 5f 65 72  t}}.verify_ex_er
1310: 72 63 6f 64 65 20 74 72 69 67 67 65 72 33 2d 37  rcode trigger3-7
1320: 2e 33 62 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  .3b SQLITE_CONST
1330: 52 41 49 4e 54 5f 54 52 49 47 47 45 52 0a 0a 7d  RAINT_TRIGGER..}
1340: 20 3b 23 20 69 66 63 61 70 61 62 6c 65 20 76 69   ;# ifcapable vi
1350: 65 77 0a 0a 69 6e 74 65 67 72 69 74 79 5f 63 68  ew..integrity_ch
1360: 65 63 6b 20 74 72 69 67 67 65 72 33 2d 38 2e 31  eck trigger3-8.1
1370: 0a 0a 63 61 74 63 68 73 71 6c 20 7b 20 44 52 4f  ..catchsql { DRO
1380: 50 20 54 41 42 4c 45 20 74 62 6c 3b 20 7d 20 0a  P TABLE tbl; } .
1390: 63 61 74 63 68 73 71 6c 20 7b 20 44 52 4f 50 20  catchsql { DROP 
13a0: 54 41 42 4c 45 20 74 62 6c 32 3b 20 7d 20 0a 63  TABLE tbl2; } .c
13b0: 61 74 63 68 73 71 6c 20 7b 20 44 52 4f 50 20 56  atchsql { DROP V
13c0: 49 45 57 20 74 62 6c 5f 76 69 65 77 3b 20 7d 0a  IEW tbl_view; }.
13d0: 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a           .finish_test.