/ Hex Artifact Content
Login

Artifact cbf5da84a2413380644bde3fef94943ee103ea4e:


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 52 65 67 72 65 73 73 69  ***.#.# Regressi
0160: 6f 6e 20 74 65 73 74 69 6e 67 20 6f 66 20 46 4f  on testing of FO
0170: 52 20 45 41 43 48 20 52 4f 57 20 74 61 62 6c 65  R EACH ROW table
0180: 20 74 72 69 67 67 65 72 73 0a 23 0a 23 20 31 2e   triggers.#.# 1.
0190: 20 54 72 69 67 67 65 72 20 65 78 65 63 75 74 69   Trigger executi
01a0: 6f 6e 20 6f 72 64 65 72 20 74 65 73 74 73 2e 20  on order tests. 
01b0: 0a 23 20 54 68 65 73 65 20 74 65 73 74 73 20 65  .# These tests e
01c0: 6e 73 75 72 65 20 74 68 61 74 20 42 45 46 4f 52  nsure that BEFOR
01d0: 45 20 61 6e 64 20 41 46 54 45 52 20 74 72 69 67  E and AFTER trig
01e0: 67 65 72 73 20 61 72 65 20 66 69 72 65 64 20 61  gers are fired a
01f0: 74 20 74 68 65 20 63 6f 72 72 65 63 74 0a 23 20  t the correct.# 
0200: 74 69 6d 65 73 20 72 65 6c 61 74 69 76 65 20 74  times relative t
0210: 6f 20 65 61 63 68 20 6f 74 68 65 72 20 61 6e 64  o each other and
0220: 20 74 68 65 20 74 72 69 67 67 65 72 69 6e 67 20   the triggering 
0230: 73 74 61 74 65 6d 65 6e 74 2e 20 0a 23 0a 23 20  statement. .#.# 
0240: 74 72 69 67 67 65 72 32 2d 31 2e 31 2e 2a 3a 20  trigger2-1.1.*: 
0250: 4f 4e 20 55 50 44 41 54 45 20 74 72 69 67 67 65  ON UPDATE trigge
0260: 72 20 65 78 65 63 75 74 69 6f 6e 20 6d 6f 64 65  r execution mode
0270: 6c 2e 0a 23 20 74 72 69 67 67 65 72 32 2d 31 2e  l..# trigger2-1.
0280: 32 2e 2a 3a 20 44 45 4c 45 54 45 20 74 72 69 67  2.*: DELETE trig
0290: 67 65 72 20 65 78 65 63 75 74 69 6f 6e 20 6d 6f  ger execution mo
02a0: 64 65 6c 2e 0a 23 20 74 72 69 67 67 65 72 32 2d  del..# trigger2-
02b0: 31 2e 33 2e 2a 3a 20 49 4e 53 45 52 54 20 74 72  1.3.*: INSERT tr
02c0: 69 67 67 65 72 20 65 78 65 63 75 74 69 6f 6e 20  igger execution 
02d0: 6d 6f 64 65 6c 2e 0a 23 0a 23 20 32 2e 20 54 72  model..#.# 2. Tr
02e0: 69 67 67 65 72 20 70 72 6f 67 72 61 6d 20 65 78  igger program ex
02f0: 65 63 75 74 69 6f 6e 20 74 65 73 74 73 2e 0a 23  ecution tests..#
0300: 20 54 68 65 73 65 20 74 65 73 74 73 20 65 6e 73   These tests ens
0310: 75 72 65 20 74 68 61 74 20 74 72 69 67 67 65 72  ure that trigger
0320: 20 70 72 6f 67 72 61 6d 73 20 65 78 65 63 75 74   programs execut
0330: 65 20 63 6f 72 72 65 63 74 6c 79 20 28 69 65 2e  e correctly (ie.
0340: 20 74 68 61 74 20 61 0a 23 20 74 72 69 67 67 65   that a.# trigge
0350: 72 20 70 72 6f 67 72 61 6d 20 63 61 6e 20 63 6f  r program can co
0360: 72 72 65 63 74 6c 79 20 65 78 65 63 75 74 65 20  rrectly execute 
0370: 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 2c 20  INSERT, UPDATE, 
0380: 44 45 4c 45 54 45 20 2a 20 53 45 4c 45 43 54 0a  DELETE * SELECT.
0390: 23 20 73 74 61 74 65 6d 65 6e 74 73 2c 20 61 6e  # statements, an
03a0: 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 74  d combinations t
03b0: 68 65 72 65 6f 66 29 2e 0a 23 0a 23 20 33 2e 20  hereof)..#.# 3. 
03c0: 53 65 6c 65 63 74 69 76 65 20 74 72 69 67 67 65  Selective trigge
03d0: 72 20 65 78 65 63 75 74 69 6f 6e 20 0a 23 20 54  r execution .# T
03e0: 68 69 73 20 74 65 73 74 73 20 74 68 61 74 20 63  his tests that c
03f0: 6f 6e 64 69 74 69 6f 6e 61 6c 20 74 72 69 67 67  onditional trigg
0400: 65 72 73 20 28 69 65 2e 20 55 50 44 41 54 45 20  ers (ie. UPDATE 
0410: 4f 46 20 74 72 69 67 67 65 72 73 20 61 6e 64 20  OF triggers and 
0420: 74 72 69 67 67 65 72 73 0a 23 20 77 69 74 68 20  triggers.# with 
0430: 57 48 45 4e 20 63 6c 61 75 73 65 73 29 20 61 72  WHEN clauses) ar
0440: 65 20 66 69 72 65 64 20 6f 6e 6c 79 20 66 69 72  e fired only fir
0450: 65 64 20 77 68 65 6e 20 74 68 65 79 20 61 72 65  ed when they are
0460: 20 73 75 70 70 6f 73 65 64 20 74 6f 20 62 65 2e   supposed to be.
0470: 0a 23 0a 23 20 74 72 69 67 67 65 72 32 2d 33 2e  .#.# trigger2-3.
0480: 31 3a 20 55 50 44 41 54 45 20 4f 46 20 74 72 69  1: UPDATE OF tri
0490: 67 67 65 72 73 0a 23 20 74 72 69 67 67 65 72 32  ggers.# trigger2
04a0: 2d 33 2e 32 3a 20 57 48 45 4e 20 63 6c 61 75 73  -3.2: WHEN claus
04b0: 65 0a 23 0a 23 20 34 2e 20 43 61 73 63 61 64 65  e.#.# 4. Cascade
04c0: 64 20 74 72 69 67 67 65 72 20 65 78 65 63 75 74  d trigger execut
04d0: 69 6f 6e 20 0a 23 20 54 65 73 74 73 20 74 68 61  ion .# Tests tha
04e0: 74 20 74 72 69 67 67 65 72 2d 70 72 6f 67 72 61  t trigger-progra
04f0: 6d 73 20 6d 61 79 20 63 61 75 73 65 20 6f 74 68  ms may cause oth
0500: 65 72 20 74 72 69 67 67 65 72 73 20 74 6f 20 66  er triggers to f
0510: 69 72 65 2e 20 41 6c 73 6f 20 74 68 61 74 20 61  ire. Also that a
0520: 20 0a 23 20 74 72 69 67 67 65 72 2d 70 72 6f 67   .# trigger-prog
0530: 72 61 6d 20 69 73 20 6e 65 76 65 72 20 65 78 65  ram is never exe
0540: 63 75 74 65 64 20 72 65 63 75 72 73 69 76 65 6c  cuted recursivel
0550: 79 2e 0a 23 20 0a 23 20 74 72 69 67 67 65 72 32  y..# .# trigger2
0560: 2d 34 2e 31 3a 20 54 72 69 76 69 61 6c 20 63 61  -4.1: Trivial ca
0570: 73 63 61 64 69 6e 67 20 74 72 69 67 67 65 72 0a  scading trigger.
0580: 23 20 74 72 69 67 67 65 72 32 2d 34 2e 32 3a 20  # trigger2-4.2: 
0590: 54 72 69 76 69 61 6c 20 72 65 63 75 72 73 69 76  Trivial recursiv
05a0: 65 20 74 72 69 67 67 65 72 20 68 61 6e 64 6c 69  e trigger handli
05b0: 6e 67 20 0a 23 0a 23 20 35 2e 20 43 6f 75 6e 74  ng .#.# 5. Count
05c0: 20 63 68 61 6e 67 65 73 20 62 65 68 61 76 69 6f   changes behavio
05d0: 75 72 2e 0a 23 20 56 65 72 69 66 79 20 74 68 61  ur..# Verify tha
05e0: 74 20 72 6f 77 73 20 61 6c 74 65 72 65 64 20 62  t rows altered b
05f0: 79 20 74 72 69 67 67 65 72 73 20 61 72 65 20 6e  y triggers are n
0600: 6f 74 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74  ot included in t
0610: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
0620: 23 20 6f 66 20 74 68 65 20 22 63 6f 75 6e 74 20  # of the "count 
0630: 63 68 61 6e 67 65 73 22 20 69 6e 74 65 72 66 61  changes" interfa
0640: 63 65 2e 0a 23 0a 23 20 36 2e 20 4f 4e 20 43 4f  ce..#.# 6. ON CO
0650: 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 20 68 61  NFLICT clause ha
0660: 6e 64 6c 69 6e 67 0a 23 20 74 72 69 67 67 65 72  ndling.# trigger
0670: 32 2d 36 2e 31 5b 61 2d 66 5d 3a 20 49 4e 53 45  2-6.1[a-f]: INSE
0680: 52 54 20 73 74 61 74 65 6d 65 6e 74 73 0a 23 20  RT statements.# 
0690: 74 72 69 67 67 65 72 32 2d 36 2e 32 5b 61 2d 66  trigger2-6.2[a-f
06a0: 5d 3a 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  ]: UPDATE statem
06b0: 65 6e 74 73 0a 23 0a 23 20 37 2e 20 54 72 69 67  ents.#.# 7. Trig
06c0: 67 65 72 73 20 6f 6e 20 76 69 65 77 73 20 66 69  gers on views fi
06d0: 72 65 20 63 6f 72 72 65 63 74 6c 79 2e 0a 23 0a  re correctly..#.
06e0: 0a 73 65 74 20 74 65 73 74 64 69 72 20 5b 66 69  .set testdir [fi
06f0: 6c 65 20 64 69 72 6e 61 6d 65 20 24 61 72 67 76  le dirname $argv
0700: 30 5d 0a 73 6f 75 72 63 65 20 24 74 65 73 74 64  0].source $testd
0710: 69 72 2f 74 65 73 74 65 72 2e 74 63 6c 0a 69 66  ir/tester.tcl.if
0720: 63 61 70 61 62 6c 65 20 7b 21 74 72 69 67 67 65  capable {!trigge
0730: 72 7d 20 7b 0a 20 20 66 69 6e 69 73 68 5f 74 65  r} {.  finish_te
0740: 73 74 0a 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 23  st.  return.}..#
0750: 20 31 2e 0a 73 65 74 20 69 69 20 30 0a 66 6f 72   1..set ii 0.for
0760: 65 61 63 68 20 74 62 6c 5f 64 65 66 6e 20 7b 0a  each tbl_defn {.
0770: 09 7b 43 52 45 41 54 45 20 54 45 4d 50 20 54 41  .{CREATE TEMP TA
0780: 42 4c 45 20 74 62 6c 20 28 61 2c 20 62 29 3b 7d  BLE tbl (a, b);}
0790: 20 0a 09 7b 43 52 45 41 54 45 20 54 41 42 4c 45   ..{CREATE TABLE
07a0: 20 74 62 6c 20 28 61 2c 20 62 29 3b 7d 20 0a 09   tbl (a, b);} ..
07b0: 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 62  {CREATE TABLE tb
07c0: 6c 20 28 61 20 49 4e 54 45 47 45 52 20 50 52 49  l (a INTEGER PRI
07d0: 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 7d 20 0a  MARY KEY, b);} .
07e0: 09 7b 43 52 45 41 54 45 20 54 45 4d 50 4f 52 41  .{CREATE TEMPORA
07f0: 52 59 20 54 41 42 4c 45 20 74 62 6c 20 28 61 20  RY TABLE tbl (a 
0800: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
0810: 4b 45 59 2c 20 62 29 3b 7d 20 0a 20 20 20 20 20  KEY, b);} .     
0820: 20 20 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45     {CREATE TABLE
0830: 20 74 62 6c 20 28 61 2c 20 62 20 50 52 49 4d 41   tbl (a, b PRIMA
0840: 52 59 20 4b 45 59 29 3b 7d 20 0a 09 7b 43 52 45  RY KEY);} ..{CRE
0850: 41 54 45 20 54 41 42 4c 45 20 74 62 6c 20 28 61  ATE TABLE tbl (a
0860: 2c 20 62 29 3b 20 43 52 45 41 54 45 20 49 4e 44  , b); CREATE IND
0870: 45 58 20 74 62 6c 5f 69 64 78 20 4f 4e 20 74 62  EX tbl_idx ON tb
0880: 6c 28 62 29 3b 7d 20 0a 09 7b 43 52 45 41 54 45  l(b);} ..{CREATE
0890: 20 54 45 4d 50 20 54 41 42 4c 45 20 74 62 6c 20   TEMP TABLE tbl 
08a0: 28 61 2c 20 62 29 3b 20 43 52 45 41 54 45 20 49  (a, b); CREATE I
08b0: 4e 44 45 58 20 74 62 6c 5f 69 64 78 20 4f 4e 20  NDEX tbl_idx ON 
08c0: 74 62 6c 28 62 29 3b 7d 20 0a 7d 20 7b 0a 20 20  tbl(b);} .} {.  
08d0: 69 6e 63 72 20 69 69 0a 20 20 63 61 74 63 68 73  incr ii.  catchs
08e0: 71 6c 20 7b 20 44 52 4f 50 20 49 4e 44 45 58 20  ql { DROP INDEX 
08f0: 74 62 6c 5f 69 64 78 3b 20 7d 0a 20 20 63 61 74  tbl_idx; }.  cat
0900: 63 68 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50  chsql {.    DROP
0910: 20 54 41 42 4c 45 20 72 6c 6f 67 3b 0a 20 20 20   TABLE rlog;.   
0920: 20 44 52 4f 50 20 54 41 42 4c 45 20 63 6c 6f 67   DROP TABLE clog
0930: 3b 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45  ;.    DROP TABLE
0940: 20 74 62 6c 3b 0a 20 20 20 20 44 52 4f 50 20 54   tbl;.    DROP T
0950: 41 42 4c 45 20 6f 74 68 65 72 5f 74 62 6c 3b 0a  ABLE other_tbl;.
0960: 20 20 7d 0a 0a 20 20 65 78 65 63 73 71 6c 20 24    }..  execsql $
0970: 74 62 6c 5f 64 65 66 6e 0a 0a 20 20 65 78 65 63  tbl_defn..  exec
0980: 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54  sql {.    INSERT
0990: 20 49 4e 54 4f 20 74 62 6c 20 56 41 4c 55 45 53   INTO tbl VALUES
09a0: 28 31 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53 45  (1, 2);.    INSE
09b0: 52 54 20 49 4e 54 4f 20 74 62 6c 20 56 41 4c 55  RT INTO tbl VALU
09c0: 45 53 28 33 2c 20 34 29 3b 0a 0a 20 20 20 20 43  ES(3, 4);..    C
09d0: 52 45 41 54 45 20 54 41 42 4c 45 20 72 6c 6f 67  REATE TABLE rlog
09e0: 20 28 69 64 78 2c 20 6f 6c 64 5f 61 2c 20 6f 6c   (idx, old_a, ol
09f0: 64 5f 62 2c 20 64 62 5f 73 75 6d 5f 61 2c 20 64  d_b, db_sum_a, d
0a00: 62 5f 73 75 6d 5f 62 2c 20 6e 65 77 5f 61 2c 20  b_sum_b, new_a, 
0a10: 6e 65 77 5f 62 29 3b 0a 20 20 20 20 43 52 45 41  new_b);.    CREA
0a20: 54 45 20 54 41 42 4c 45 20 63 6c 6f 67 20 28 69  TE TABLE clog (i
0a30: 64 78 2c 20 6f 6c 64 5f 61 2c 20 6f 6c 64 5f 62  dx, old_a, old_b
0a40: 2c 20 64 62 5f 73 75 6d 5f 61 2c 20 64 62 5f 73  , db_sum_a, db_s
0a50: 75 6d 5f 62 2c 20 6e 65 77 5f 61 2c 20 6e 65 77  um_b, new_a, new
0a60: 5f 62 29 3b 0a 0a 20 20 20 20 43 52 45 41 54 45  _b);..    CREATE
0a70: 20 54 52 49 47 47 45 52 20 62 65 66 6f 72 65 5f   TRIGGER before_
0a80: 75 70 64 61 74 65 5f 72 6f 77 20 42 45 46 4f 52  update_row BEFOR
0a90: 45 20 55 50 44 41 54 45 20 4f 4e 20 74 62 6c 20  E UPDATE ON tbl 
0aa0: 46 4f 52 20 45 41 43 48 20 52 4f 57 20 0a 20 20  FOR EACH ROW .  
0ab0: 20 20 20 20 42 45 47 49 4e 0a 20 20 20 20 20 20      BEGIN.      
0ac0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 72 6c 6f 67  INSERT INTO rlog
0ad0: 20 56 41 4c 55 45 53 20 28 20 28 53 45 4c 45 43   VALUES ( (SELEC
0ae0: 54 20 63 6f 61 6c 65 73 63 65 28 6d 61 78 28 69  T coalesce(max(i
0af0: 64 78 29 2c 30 29 20 2b 20 31 20 46 52 4f 4d 20  dx),0) + 1 FROM 
0b00: 72 6c 6f 67 29 2c 20 0a 09 20 20 6f 6c 64 2e 61  rlog), ..  old.a
0b10: 2c 20 6f 6c 64 2e 62 2c 20 0a 09 20 20 28 53 45  , old.b, ..  (SE
0b20: 4c 45 43 54 20 73 75 6d 28 61 29 20 46 52 4f 4d  LECT sum(a) FROM
0b30: 20 74 62 6c 29 2c 20 28 53 45 4c 45 43 54 20 73   tbl), (SELECT s
0b40: 75 6d 28 62 29 20 46 52 4f 4d 20 74 62 6c 29 2c  um(b) FROM tbl),
0b50: 20 0a 09 20 20 6e 65 77 2e 61 2c 20 6e 65 77 2e   ..  new.a, new.
0b60: 62 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 0a 20 20  b);.    END;..  
0b70: 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52    CREATE TRIGGER
0b80: 20 61 66 74 65 72 5f 75 70 64 61 74 65 5f 72 6f   after_update_ro
0b90: 77 20 41 46 54 45 52 20 55 50 44 41 54 45 20 4f  w AFTER UPDATE O
0ba0: 4e 20 74 62 6c 20 46 4f 52 20 45 41 43 48 20 52  N tbl FOR EACH R
0bb0: 4f 57 20 0a 20 20 20 20 20 20 42 45 47 49 4e 0a  OW .      BEGIN.
0bc0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
0bd0: 4f 20 72 6c 6f 67 20 56 41 4c 55 45 53 20 28 20  O rlog VALUES ( 
0be0: 28 53 45 4c 45 43 54 20 63 6f 61 6c 65 73 63 65  (SELECT coalesce
0bf0: 28 6d 61 78 28 69 64 78 29 2c 30 29 20 2b 20 31  (max(idx),0) + 1
0c00: 20 46 52 4f 4d 20 72 6c 6f 67 29 2c 20 0a 09 20   FROM rlog), .. 
0c10: 20 6f 6c 64 2e 61 2c 20 6f 6c 64 2e 62 2c 20 0a   old.a, old.b, .
0c20: 09 20 20 28 53 45 4c 45 43 54 20 73 75 6d 28 61  .  (SELECT sum(a
0c30: 29 20 46 52 4f 4d 20 74 62 6c 29 2c 20 28 53 45  ) FROM tbl), (SE
0c40: 4c 45 43 54 20 73 75 6d 28 62 29 20 46 52 4f 4d  LECT sum(b) FROM
0c50: 20 74 62 6c 29 2c 20 0a 09 20 20 6e 65 77 2e 61   tbl), ..  new.a
0c60: 2c 20 6e 65 77 2e 62 29 3b 0a 20 20 20 20 45 4e  , new.b);.    EN
0c70: 44 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54  D;..    CREATE T
0c80: 52 49 47 47 45 52 20 63 6f 6e 64 69 74 69 6f 6e  RIGGER condition
0c90: 61 6c 5f 75 70 64 61 74 65 5f 72 6f 77 20 41 46  al_update_row AF
0ca0: 54 45 52 20 55 50 44 41 54 45 20 4f 4e 20 74 62  TER UPDATE ON tb
0cb0: 6c 20 46 4f 52 20 45 41 43 48 20 52 4f 57 0a 20  l FOR EACH ROW. 
0cc0: 20 20 20 20 20 57 48 45 4e 20 6f 6c 64 2e 61 20       WHEN old.a 
0cd0: 3d 20 31 0a 20 20 20 20 20 20 42 45 47 49 4e 0a  = 1.      BEGIN.
0ce0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
0cf0: 4f 20 63 6c 6f 67 20 56 41 4c 55 45 53 20 28 20  O clog VALUES ( 
0d00: 28 53 45 4c 45 43 54 20 63 6f 61 6c 65 73 63 65  (SELECT coalesce
0d10: 28 6d 61 78 28 69 64 78 29 2c 30 29 20 2b 20 31  (max(idx),0) + 1
0d20: 20 46 52 4f 4d 20 63 6c 6f 67 29 2c 20 0a 09 20   FROM clog), .. 
0d30: 20 6f 6c 64 2e 61 2c 20 6f 6c 64 2e 62 2c 20 0a   old.a, old.b, .
0d40: 09 20 20 28 53 45 4c 45 43 54 20 73 75 6d 28 61  .  (SELECT sum(a
0d50: 29 20 46 52 4f 4d 20 74 62 6c 29 2c 20 28 53 45  ) FROM tbl), (SE
0d60: 4c 45 43 54 20 73 75 6d 28 62 29 20 46 52 4f 4d  LECT sum(b) FROM
0d70: 20 74 62 6c 29 2c 20 0a 09 20 20 6e 65 77 2e 61   tbl), ..  new.a
0d80: 2c 20 6e 65 77 2e 62 29 3b 0a 20 20 20 20 45 4e  , new.b);.    EN
0d90: 44 3b 0a 20 20 7d 0a 0a 20 20 64 6f 5f 74 65 73  D;.  }..  do_tes
0da0: 74 20 74 72 69 67 67 65 72 32 2d 31 2e 24 69 69  t trigger2-1.$ii
0db0: 2e 31 20 7b 0a 20 20 20 20 73 65 74 20 72 20 7b  .1 {.    set r {
0dc0: 7d 0a 20 20 20 20 66 6f 72 65 61 63 68 20 76 20  }.    foreach v 
0dd0: 5b 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20  [execsql { .    
0de0: 20 20 55 50 44 41 54 45 20 74 62 6c 20 53 45 54    UPDATE tbl SET
0df0: 20 61 20 3d 20 61 20 2a 20 31 30 2c 20 62 20 3d   a = a * 10, b =
0e00: 20 62 20 2a 20 31 30 3b 0a 20 20 20 20 20 20 53   b * 10;.      S
0e10: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 72 6c 6f  ELECT * FROM rlo
0e20: 67 20 4f 52 44 45 52 20 42 59 20 69 64 78 3b 0a  g ORDER BY idx;.
0e30: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
0e40: 52 4f 4d 20 63 6c 6f 67 20 4f 52 44 45 52 20 42  ROM clog ORDER B
0e50: 59 20 69 64 78 3b 0a 20 20 20 20 7d 5d 20 7b 0a  Y idx;.    }] {.
0e60: 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 20        lappend r 
0e70: 5b 65 78 70 72 20 7b 69 6e 74 28 24 76 29 7d 5d  [expr {int($v)}]
0e80: 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74 20 72  .    }.    set r
0e90: 0a 20 20 7d 20 5b 6c 69 73 74 20 31 20 31 20 32  .  } [list 1 1 2
0ea0: 20 20 34 20 20 36 20 31 30 20 32 30 20 5c 0a 20    4  6 10 20 \. 
0eb0: 20 20 20 20 20 20 20 20 20 32 20 31 20 32 20 31           2 1 2 1
0ec0: 33 20 32 34 20 31 30 20 32 30 20 5c 0a 09 20 20  3 24 10 20 \..  
0ed0: 33 20 33 20 34 20 31 33 20 32 34 20 33 30 20 34  3 3 4 13 24 30 4
0ee0: 30 20 5c 0a 09 20 20 34 20 33 20 34 20 34 30 20  0 \..  4 3 4 40 
0ef0: 36 30 20 33 30 20 34 30 20 5c 0a 20 20 20 20 20  60 30 40 \.     
0f00: 20 20 20 20 20 31 20 31 20 32 20 31 33 20 32 34       1 1 2 13 24
0f10: 20 31 30 20 32 30 20 5d 0a 0a 20 20 65 78 65 63   10 20 ]..  exec
0f20: 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45  sql {.    DELETE
0f30: 20 46 52 4f 4d 20 72 6c 6f 67 3b 0a 20 20 20 20   FROM rlog;.    
0f40: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 62 6c 3b  DELETE FROM tbl;
0f50: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
0f60: 20 74 62 6c 20 56 41 4c 55 45 53 20 28 31 30 30   tbl VALUES (100
0f70: 2c 20 31 30 30 29 3b 0a 20 20 20 20 49 4e 53 45  , 100);.    INSE
0f80: 52 54 20 49 4e 54 4f 20 74 62 6c 20 56 41 4c 55  RT INTO tbl VALU
0f90: 45 53 20 28 33 30 30 2c 20 32 30 30 29 3b 0a 20  ES (300, 200);. 
0fa0: 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45     CREATE TRIGGE
0fb0: 52 20 64 65 6c 65 74 65 5f 62 65 66 6f 72 65 5f  R delete_before_
0fc0: 72 6f 77 20 42 45 46 4f 52 45 20 44 45 4c 45 54  row BEFORE DELET
0fd0: 45 20 4f 4e 20 74 62 6c 20 46 4f 52 20 45 41 43  E ON tbl FOR EAC
0fe0: 48 20 52 4f 57 0a 20 20 20 20 20 20 42 45 47 49  H ROW.      BEGI
0ff0: 4e 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  N.      INSERT I
1000: 4e 54 4f 20 72 6c 6f 67 20 56 41 4c 55 45 53 20  NTO rlog VALUES 
1010: 28 20 28 53 45 4c 45 43 54 20 63 6f 61 6c 65 73  ( (SELECT coales
1020: 63 65 28 6d 61 78 28 69 64 78 29 2c 30 29 20 2b  ce(max(idx),0) +
1030: 20 31 20 46 52 4f 4d 20 72 6c 6f 67 29 2c 20 0a   1 FROM rlog), .
1040: 09 20 20 6f 6c 64 2e 61 2c 20 6f 6c 64 2e 62 2c  .  old.a, old.b,
1050: 20 0a 09 20 20 28 53 45 4c 45 43 54 20 73 75 6d   ..  (SELECT sum
1060: 28 61 29 20 46 52 4f 4d 20 74 62 6c 29 2c 20 28  (a) FROM tbl), (
1070: 53 45 4c 45 43 54 20 73 75 6d 28 62 29 20 46 52  SELECT sum(b) FR
1080: 4f 4d 20 74 62 6c 29 2c 20 0a 09 20 20 30 2c 20  OM tbl), ..  0, 
1090: 30 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 0a 20 20  0);.    END;..  
10a0: 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52    CREATE TRIGGER
10b0: 20 64 65 6c 65 74 65 5f 61 66 74 65 72 5f 72 6f   delete_after_ro
10c0: 77 20 41 46 54 45 52 20 44 45 4c 45 54 45 20 4f  w AFTER DELETE O
10d0: 4e 20 74 62 6c 20 46 4f 52 20 45 41 43 48 20 52  N tbl FOR EACH R
10e0: 4f 57 0a 20 20 20 20 20 20 42 45 47 49 4e 0a 20  OW.      BEGIN. 
10f0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
1100: 20 72 6c 6f 67 20 56 41 4c 55 45 53 20 28 20 28   rlog VALUES ( (
1110: 53 45 4c 45 43 54 20 63 6f 61 6c 65 73 63 65 28  SELECT coalesce(
1120: 6d 61 78 28 69 64 78 29 2c 30 29 20 2b 20 31 20  max(idx),0) + 1 
1130: 46 52 4f 4d 20 72 6c 6f 67 29 2c 20 0a 09 20 20  FROM rlog), ..  
1140: 6f 6c 64 2e 61 2c 20 6f 6c 64 2e 62 2c 20 0a 09  old.a, old.b, ..
1150: 20 20 28 53 45 4c 45 43 54 20 73 75 6d 28 61 29    (SELECT sum(a)
1160: 20 46 52 4f 4d 20 74 62 6c 29 2c 20 28 53 45 4c   FROM tbl), (SEL
1170: 45 43 54 20 73 75 6d 28 62 29 20 46 52 4f 4d 20  ECT sum(b) FROM 
1180: 74 62 6c 29 2c 20 0a 09 20 20 30 2c 20 30 29 3b  tbl), ..  0, 0);
1190: 0a 20 20 20 20 45 4e 44 3b 0a 20 20 7d 0a 20 20  .    END;.  }.  
11a0: 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 32  do_test trigger2
11b0: 2d 31 2e 24 69 69 2e 32 20 7b 0a 20 20 20 20 73  -1.$ii.2 {.    s
11c0: 65 74 20 72 20 7b 7d 0a 20 20 20 20 66 6f 72 65  et r {}.    fore
11d0: 61 63 68 20 76 20 5b 65 78 65 63 73 71 6c 20 7b  ach v [execsql {
11e0: 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52  .      DELETE FR
11f0: 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 20 20 53 45  OM tbl;.      SE
1200: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 72 6c 6f 67  LECT * FROM rlog
1210: 3b 0a 20 20 20 20 7d 5d 20 7b 0a 20 20 20 20 20  ;.    }] {.     
1220: 20 6c 61 70 70 65 6e 64 20 72 20 5b 65 78 70 72   lappend r [expr
1230: 20 7b 69 6e 74 28 24 76 29 7d 5d 0a 20 20 20 20   {int($v)}].    
1240: 7d 0a 20 20 20 20 73 65 74 20 72 0a 20 20 7d 20  }.    set r.  } 
1250: 5b 6c 69 73 74 20 31 20 31 30 30 20 31 30 30 20  [list 1 100 100 
1260: 34 30 30 20 33 30 30 20 30 20 30 20 5c 0a 20 20  400 300 0 0 \.  
1270: 20 20 20 20 20 20 20 20 32 20 31 30 30 20 31 30          2 100 10
1280: 30 20 33 30 30 20 32 30 30 20 30 20 30 20 5c 0a  0 300 200 0 0 \.
1290: 20 20 20 20 20 20 20 20 20 20 33 20 33 30 30 20            3 300 
12a0: 32 30 30 20 33 30 30 20 32 30 30 20 30 20 30 20  200 300 200 0 0 
12b0: 5c 0a 20 20 20 20 20 20 20 20 20 20 34 20 33 30  \.          4 30
12c0: 30 20 32 30 30 20 30 20 30 20 30 20 30 20 5d 0a  0 200 0 0 0 0 ].
12d0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
12e0: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 72 6c 6f   DELETE FROM rlo
12f0: 67 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 52  g;.    CREATE TR
1300: 49 47 47 45 52 20 69 6e 73 65 72 74 5f 62 65 66  IGGER insert_bef
1310: 6f 72 65 5f 72 6f 77 20 42 45 46 4f 52 45 20 49  ore_row BEFORE I
1320: 4e 53 45 52 54 20 4f 4e 20 74 62 6c 20 46 4f 52  NSERT ON tbl FOR
1330: 20 45 41 43 48 20 52 4f 57 0a 20 20 20 20 20 20   EACH ROW.      
1340: 42 45 47 49 4e 0a 20 20 20 20 20 20 49 4e 53 45  BEGIN.      INSE
1350: 52 54 20 49 4e 54 4f 20 72 6c 6f 67 20 56 41 4c  RT INTO rlog VAL
1360: 55 45 53 20 28 20 28 53 45 4c 45 43 54 20 63 6f  UES ( (SELECT co
1370: 61 6c 65 73 63 65 28 6d 61 78 28 69 64 78 29 2c  alesce(max(idx),
1380: 30 29 20 2b 20 31 20 46 52 4f 4d 20 72 6c 6f 67  0) + 1 FROM rlog
1390: 29 2c 20 0a 09 20 20 30 2c 20 30 2c 0a 09 20 20  ), ..  0, 0,..  
13a0: 28 53 45 4c 45 43 54 20 73 75 6d 28 61 29 20 46  (SELECT sum(a) F
13b0: 52 4f 4d 20 74 62 6c 29 2c 20 28 53 45 4c 45 43  ROM tbl), (SELEC
13c0: 54 20 73 75 6d 28 62 29 20 46 52 4f 4d 20 74 62  T sum(b) FROM tb
13d0: 6c 29 2c 20 0a 09 20 20 6e 65 77 2e 61 2c 20 6e  l), ..  new.a, n
13e0: 65 77 2e 62 29 3b 0a 20 20 20 20 45 4e 44 3b 0a  ew.b);.    END;.
13f0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47  .    CREATE TRIG
1400: 47 45 52 20 69 6e 73 65 72 74 5f 61 66 74 65 72  GER insert_after
1410: 5f 72 6f 77 20 41 46 54 45 52 20 49 4e 53 45 52  _row AFTER INSER
1420: 54 20 4f 4e 20 74 62 6c 20 46 4f 52 20 45 41 43  T ON tbl FOR EAC
1430: 48 20 52 4f 57 0a 20 20 20 20 20 20 42 45 47 49  H ROW.      BEGI
1440: 4e 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  N.      INSERT I
1450: 4e 54 4f 20 72 6c 6f 67 20 56 41 4c 55 45 53 20  NTO rlog VALUES 
1460: 28 20 28 53 45 4c 45 43 54 20 63 6f 61 6c 65 73  ( (SELECT coales
1470: 63 65 28 6d 61 78 28 69 64 78 29 2c 30 29 20 2b  ce(max(idx),0) +
1480: 20 31 20 46 52 4f 4d 20 72 6c 6f 67 29 2c 20 0a   1 FROM rlog), .
1490: 09 20 20 30 2c 20 30 2c 0a 09 20 20 28 53 45 4c  .  0, 0,..  (SEL
14a0: 45 43 54 20 73 75 6d 28 61 29 20 46 52 4f 4d 20  ECT sum(a) FROM 
14b0: 74 62 6c 29 2c 20 28 53 45 4c 45 43 54 20 73 75  tbl), (SELECT su
14c0: 6d 28 62 29 20 46 52 4f 4d 20 74 62 6c 29 2c 20  m(b) FROM tbl), 
14d0: 0a 09 20 20 6e 65 77 2e 61 2c 20 6e 65 77 2e 62  ..  new.a, new.b
14e0: 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 7d 0a  );.    END;.  }.
14f0: 20 20 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65    do_test trigge
1500: 72 32 2d 31 2e 24 69 69 2e 33 20 7b 0a 20 20 20  r2-1.$ii.3 {.   
1510: 20 65 78 65 63 73 71 6c 20 7b 0a 0a 20 20 20 20   execsql {..    
1520: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6f    CREATE TABLE o
1530: 74 68 65 72 5f 74 62 6c 28 61 2c 20 62 29 3b 0a  ther_tbl(a, b);.
1540: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
1550: 4f 20 6f 74 68 65 72 5f 74 62 6c 20 56 41 4c 55  O other_tbl VALU
1560: 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 20 20  ES(1, 2);.      
1570: 49 4e 53 45 52 54 20 49 4e 54 4f 20 6f 74 68 65  INSERT INTO othe
1580: 72 5f 74 62 6c 20 56 41 4c 55 45 53 28 33 2c 20  r_tbl VALUES(3, 
1590: 34 29 3b 0a 20 20 20 20 20 20 2d 2d 20 49 4e 53  4);.      -- INS
15a0: 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 53 45 4c  ERT INTO tbl SEL
15b0: 45 43 54 20 2a 20 46 52 4f 4d 20 6f 74 68 65 72  ECT * FROM other
15c0: 5f 74 62 6c 3b 0a 20 20 20 20 20 20 49 4e 53 45  _tbl;.      INSE
15d0: 52 54 20 49 4e 54 4f 20 74 62 6c 20 56 41 4c 55  RT INTO tbl VALU
15e0: 45 53 28 35 2c 20 36 29 3b 0a 20 20 20 20 20 20  ES(5, 6);.      
15f0: 44 52 4f 50 20 54 41 42 4c 45 20 6f 74 68 65 72  DROP TABLE other
1600: 5f 74 62 6c 3b 0a 0a 20 20 20 20 20 20 53 45 4c  _tbl;..      SEL
1610: 45 43 54 20 2a 20 46 52 4f 4d 20 72 6c 6f 67 3b  ECT * FROM rlog;
1620: 0a 20 20 20 20 7d 0a 20 20 7d 20 5b 6c 69 73 74  .    }.  } [list
1630: 20 31 20 30 20 30 20 30 2e 30 20 30 2e 30 20 35   1 0 0 0.0 0.0 5
1640: 20 36 20 5c 0a 20 20 20 20 20 20 20 20 20 20 32   6 \.          2
1650: 20 30 20 30 20 35 2e 30 20 36 2e 30 20 35 20 36   0 0 5.0 6.0 5 6
1660: 20 5d 0a 0a 20 20 69 6e 74 65 67 72 69 74 79 5f   ]..  integrity_
1670: 63 68 65 63 6b 20 74 72 69 67 67 65 72 32 2d 31  check trigger2-1
1680: 2e 24 69 69 2e 34 0a 7d 0a 63 61 74 63 68 73 71  .$ii.4.}.catchsq
1690: 6c 20 7b 0a 20 20 44 52 4f 50 20 54 41 42 4c 45  l {.  DROP TABLE
16a0: 20 72 6c 6f 67 3b 0a 20 20 44 52 4f 50 20 54 41   rlog;.  DROP TA
16b0: 42 4c 45 20 63 6c 6f 67 3b 0a 20 20 44 52 4f 50  BLE clog;.  DROP
16c0: 20 54 41 42 4c 45 20 74 62 6c 3b 0a 20 20 44 52   TABLE tbl;.  DR
16d0: 4f 50 20 54 41 42 4c 45 20 6f 74 68 65 72 5f 74  OP TABLE other_t
16e0: 62 6c 3b 0a 7d 0a 0a 23 20 32 2e 0a 73 65 74 20  bl;.}..# 2..set 
16f0: 69 69 20 30 0a 66 6f 72 65 61 63 68 20 74 72 5f  ii 0.foreach tr_
1700: 70 72 6f 67 72 61 6d 20 7b 0a 20 20 7b 55 50 44  program {.  {UPD
1710: 41 54 45 20 74 62 6c 20 53 45 54 20 62 20 3d 20  ATE tbl SET b = 
1720: 6f 6c 64 2e 62 3b 7d 0a 20 20 7b 49 4e 53 45 52  old.b;}.  {INSER
1730: 54 20 49 4e 54 4f 20 6c 6f 67 20 56 41 4c 55 45  T INTO log VALUE
1740: 53 28 6e 65 77 2e 63 2c 20 32 2c 20 33 29 3b 7d  S(new.c, 2, 3);}
1750: 0a 20 20 7b 44 45 4c 45 54 45 20 46 52 4f 4d 20  .  {DELETE FROM 
1760: 6c 6f 67 20 57 48 45 52 45 20 61 20 3d 20 31 3b  log WHERE a = 1;
1770: 7d 0a 20 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f  }.  {INSERT INTO
1780: 20 74 62 6c 20 56 41 4c 55 45 53 28 35 30 30 2c   tbl VALUES(500,
1790: 20 6e 65 77 2e 62 20 2a 20 31 30 2c 20 37 30 30   new.b * 10, 700
17a0: 29 3b 20 0a 20 20 20 20 55 50 44 41 54 45 20 74  ); .    UPDATE t
17b0: 62 6c 20 53 45 54 20 63 20 3d 20 6f 6c 64 2e 63  bl SET c = old.c
17c0: 3b 20 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52  ; .    DELETE FR
17d0: 4f 4d 20 6c 6f 67 3b 7d 0a 20 20 7b 49 4e 53 45  OM log;}.  {INSE
17e0: 52 54 20 49 4e 54 4f 20 6c 6f 67 20 73 65 6c 65  RT INTO log sele
17f0: 63 74 20 2a 20 66 72 6f 6d 20 74 62 6c 3b 7d 20  ct * from tbl;} 
1800: 0a 7d 20 7b 0a 20 20 66 6f 72 65 61 63 68 20 74  .} {.  foreach t
1810: 65 73 74 5f 76 61 72 73 65 74 20 5b 20 6c 69 73  est_varset [ lis
1820: 74 20 5c 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  t \.    {.      
1830: 73 65 74 20 73 74 61 74 65 6d 65 6e 74 20 7b 55  set statement {U
1840: 50 44 41 54 45 20 74 62 6c 20 53 45 54 20 63 20  PDATE tbl SET c 
1850: 3d 20 31 30 20 57 48 45 52 45 20 61 20 3d 20 31  = 10 WHERE a = 1
1860: 3b 7d 20 0a 20 20 20 20 20 20 73 65 74 20 70 72  ;} .      set pr
1870: 65 70 20 20 20 20 20 20 7b 49 4e 53 45 52 54 20  ep      {INSERT 
1880: 49 4e 54 4f 20 74 62 6c 20 56 41 4c 55 45 53 28  INTO tbl VALUES(
1890: 31 2c 20 32 2c 20 33 29 3b 7d 0a 20 20 20 20 20  1, 2, 3);}.     
18a0: 20 73 65 74 20 6e 65 77 43 20 31 30 0a 20 20 20   set newC 10.   
18b0: 20 20 20 73 65 74 20 6e 65 77 42 20 32 0a 20 20     set newB 2.  
18c0: 20 20 20 20 73 65 74 20 6e 65 77 41 20 31 0a 20      set newA 1. 
18d0: 20 20 20 20 20 73 65 74 20 6f 6c 64 41 20 31 0a       set oldA 1.
18e0: 20 20 20 20 20 20 73 65 74 20 6f 6c 64 42 20 32        set oldB 2
18f0: 0a 20 20 20 20 20 20 73 65 74 20 6f 6c 64 43 20  .      set oldC 
1900: 33 0a 20 20 20 20 7d 20 5c 0a 20 20 20 20 7b 0a  3.    } \.    {.
1910: 20 20 20 20 20 20 73 65 74 20 73 74 61 74 65 6d        set statem
1920: 65 6e 74 20 7b 44 45 4c 45 54 45 20 46 52 4f 4d  ent {DELETE FROM
1930: 20 74 62 6c 20 57 48 45 52 45 20 61 20 3d 20 31   tbl WHERE a = 1
1940: 3b 7d 0a 20 20 20 20 20 20 73 65 74 20 70 72 65  ;}.      set pre
1950: 70 20 20 20 20 20 20 7b 49 4e 53 45 52 54 20 49  p      {INSERT I
1960: 4e 54 4f 20 74 62 6c 20 56 41 4c 55 45 53 28 31  NTO tbl VALUES(1
1970: 2c 20 32 2c 20 33 29 3b 7d 0a 20 20 20 20 20 20  , 2, 3);}.      
1980: 73 65 74 20 6f 6c 64 41 20 31 0a 20 20 20 20 20  set oldA 1.     
1990: 20 73 65 74 20 6f 6c 64 42 20 32 0a 20 20 20 20   set oldB 2.    
19a0: 20 20 73 65 74 20 6f 6c 64 43 20 33 0a 20 20 20    set oldC 3.   
19b0: 20 7d 20 5c 0a 20 20 20 20 7b 0a 20 20 20 20 20   } \.    {.     
19c0: 20 73 65 74 20 73 74 61 74 65 6d 65 6e 74 20 7b   set statement {
19d0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20  INSERT INTO tbl 
19e0: 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 3b  VALUES(1, 2, 3);
19f0: 7d 0a 20 20 20 20 20 20 73 65 74 20 6e 65 77 41  }.      set newA
1a00: 20 31 0a 20 20 20 20 20 20 73 65 74 20 6e 65 77   1.      set new
1a10: 42 20 32 0a 20 20 20 20 20 20 73 65 74 20 6e 65  B 2.      set ne
1a20: 77 43 20 33 0a 20 20 20 20 7d 0a 20 20 5d 20 5c  wC 3.    }.  ] \
1a30: 0a 20 20 7b 0a 20 20 20 20 73 65 74 20 73 74 61  .  {.    set sta
1a40: 74 65 6d 65 6e 74 20 7b 7d 0a 20 20 20 20 73 65  tement {}.    se
1a50: 74 20 70 72 65 70 20 7b 7d 0a 20 20 20 20 73 65  t prep {}.    se
1a60: 74 20 6e 65 77 41 20 7b 27 27 7d 0a 20 20 20 20  t newA {''}.    
1a70: 73 65 74 20 6e 65 77 42 20 7b 27 27 7d 0a 20 20  set newB {''}.  
1a80: 20 20 73 65 74 20 6e 65 77 43 20 7b 27 27 7d 0a    set newC {''}.
1a90: 20 20 20 20 73 65 74 20 6f 6c 64 41 20 7b 27 27      set oldA {''
1aa0: 7d 0a 20 20 20 20 73 65 74 20 6f 6c 64 42 20 7b  }.    set oldB {
1ab0: 27 27 7d 0a 20 20 20 20 73 65 74 20 6f 6c 64 43  ''}.    set oldC
1ac0: 20 7b 27 27 7d 0a 0a 20 20 20 20 69 6e 63 72 20   {''}..    incr 
1ad0: 69 69 0a 0a 20 20 20 20 65 76 61 6c 20 24 74 65  ii..    eval $te
1ae0: 73 74 5f 76 61 72 73 65 74 0a 0a 20 20 20 20 73  st_varset..    s
1af0: 65 74 20 73 74 61 74 65 6d 65 6e 74 5f 74 79 70  et statement_typ
1b00: 65 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20  e [string range 
1b10: 24 73 74 61 74 65 6d 65 6e 74 20 30 20 35 5d 0a  $statement 0 5].
1b20: 20 20 20 20 73 65 74 20 74 72 5f 70 72 6f 67 72      set tr_progr
1b30: 61 6d 5f 66 69 78 65 64 20 24 74 72 5f 70 72 6f  am_fixed $tr_pro
1b40: 67 72 61 6d 0a 20 20 20 20 69 66 20 7b 24 73 74  gram.    if {$st
1b50: 61 74 65 6d 65 6e 74 5f 74 79 70 65 20 3d 3d 20  atement_type == 
1b60: 22 44 45 4c 45 54 45 22 7d 20 7b 0a 20 20 20 20  "DELETE"} {.    
1b70: 20 20 72 65 67 73 75 62 20 2d 61 6c 6c 20 6e 65    regsub -all ne
1b80: 77 5c 2e 61 20 24 74 72 5f 70 72 6f 67 72 61 6d  w\.a $tr_program
1b90: 5f 66 69 78 65 64 20 7b 27 27 7d 20 74 72 5f 70  _fixed {''} tr_p
1ba0: 72 6f 67 72 61 6d 5f 66 69 78 65 64 20 0a 20 20  rogram_fixed .  
1bb0: 20 20 20 20 72 65 67 73 75 62 20 2d 61 6c 6c 20      regsub -all 
1bc0: 6e 65 77 5c 2e 62 20 24 74 72 5f 70 72 6f 67 72  new\.b $tr_progr
1bd0: 61 6d 5f 66 69 78 65 64 20 7b 27 27 7d 20 74 72  am_fixed {''} tr
1be0: 5f 70 72 6f 67 72 61 6d 5f 66 69 78 65 64 20 0a  _program_fixed .
1bf0: 20 20 20 20 20 20 72 65 67 73 75 62 20 2d 61 6c        regsub -al
1c00: 6c 20 6e 65 77 5c 2e 63 20 24 74 72 5f 70 72 6f  l new\.c $tr_pro
1c10: 67 72 61 6d 5f 66 69 78 65 64 20 7b 27 27 7d 20  gram_fixed {''} 
1c20: 74 72 5f 70 72 6f 67 72 61 6d 5f 66 69 78 65 64  tr_program_fixed
1c30: 20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 7b   .    }.    if {
1c40: 24 73 74 61 74 65 6d 65 6e 74 5f 74 79 70 65 20  $statement_type 
1c50: 3d 3d 20 22 49 4e 53 45 52 54 22 7d 20 7b 0a 20  == "INSERT"} {. 
1c60: 20 20 20 20 20 72 65 67 73 75 62 20 2d 61 6c 6c       regsub -all
1c70: 20 6f 6c 64 5c 2e 61 20 24 74 72 5f 70 72 6f 67   old\.a $tr_prog
1c80: 72 61 6d 5f 66 69 78 65 64 20 7b 27 27 7d 20 74  ram_fixed {''} t
1c90: 72 5f 70 72 6f 67 72 61 6d 5f 66 69 78 65 64 20  r_program_fixed 
1ca0: 0a 20 20 20 20 20 20 72 65 67 73 75 62 20 2d 61  .      regsub -a
1cb0: 6c 6c 20 6f 6c 64 5c 2e 62 20 24 74 72 5f 70 72  ll old\.b $tr_pr
1cc0: 6f 67 72 61 6d 5f 66 69 78 65 64 20 7b 27 27 7d  ogram_fixed {''}
1cd0: 20 74 72 5f 70 72 6f 67 72 61 6d 5f 66 69 78 65   tr_program_fixe
1ce0: 64 20 0a 20 20 20 20 20 20 72 65 67 73 75 62 20  d .      regsub 
1cf0: 2d 61 6c 6c 20 6f 6c 64 5c 2e 63 20 24 74 72 5f  -all old\.c $tr_
1d00: 70 72 6f 67 72 61 6d 5f 66 69 78 65 64 20 7b 27  program_fixed {'
1d10: 27 7d 20 74 72 5f 70 72 6f 67 72 61 6d 5f 66 69  '} tr_program_fi
1d20: 78 65 64 20 0a 20 20 20 20 7d 0a 0a 0a 20 20 20  xed .    }...   
1d30: 20 73 65 74 20 74 72 5f 70 72 6f 67 72 61 6d 5f   set tr_program_
1d40: 63 6f 6f 6b 65 64 20 24 74 72 5f 70 72 6f 67 72  cooked $tr_progr
1d50: 61 6d 0a 20 20 20 20 72 65 67 73 75 62 20 2d 61  am.    regsub -a
1d60: 6c 6c 20 6e 65 77 5c 2e 61 20 24 74 72 5f 70 72  ll new\.a $tr_pr
1d70: 6f 67 72 61 6d 5f 63 6f 6f 6b 65 64 20 24 6e 65  ogram_cooked $ne
1d80: 77 41 20 74 72 5f 70 72 6f 67 72 61 6d 5f 63 6f  wA tr_program_co
1d90: 6f 6b 65 64 20 0a 20 20 20 20 72 65 67 73 75 62  oked .    regsub
1da0: 20 2d 61 6c 6c 20 6e 65 77 5c 2e 62 20 24 74 72   -all new\.b $tr
1db0: 5f 70 72 6f 67 72 61 6d 5f 63 6f 6f 6b 65 64 20  _program_cooked 
1dc0: 24 6e 65 77 42 20 74 72 5f 70 72 6f 67 72 61 6d  $newB tr_program
1dd0: 5f 63 6f 6f 6b 65 64 20 0a 20 20 20 20 72 65 67  _cooked .    reg
1de0: 73 75 62 20 2d 61 6c 6c 20 6e 65 77 5c 2e 63 20  sub -all new\.c 
1df0: 24 74 72 5f 70 72 6f 67 72 61 6d 5f 63 6f 6f 6b  $tr_program_cook
1e00: 65 64 20 24 6e 65 77 43 20 74 72 5f 70 72 6f 67  ed $newC tr_prog
1e10: 72 61 6d 5f 63 6f 6f 6b 65 64 20 0a 20 20 20 20  ram_cooked .    
1e20: 72 65 67 73 75 62 20 2d 61 6c 6c 20 6f 6c 64 5c  regsub -all old\
1e30: 2e 61 20 24 74 72 5f 70 72 6f 67 72 61 6d 5f 63  .a $tr_program_c
1e40: 6f 6f 6b 65 64 20 24 6f 6c 64 41 20 74 72 5f 70  ooked $oldA tr_p
1e50: 72 6f 67 72 61 6d 5f 63 6f 6f 6b 65 64 20 0a 20  rogram_cooked . 
1e60: 20 20 20 72 65 67 73 75 62 20 2d 61 6c 6c 20 6f     regsub -all o
1e70: 6c 64 5c 2e 62 20 24 74 72 5f 70 72 6f 67 72 61  ld\.b $tr_progra
1e80: 6d 5f 63 6f 6f 6b 65 64 20 24 6f 6c 64 42 20 74  m_cooked $oldB t
1e90: 72 5f 70 72 6f 67 72 61 6d 5f 63 6f 6f 6b 65 64  r_program_cooked
1ea0: 20 0a 20 20 20 20 72 65 67 73 75 62 20 2d 61 6c   .    regsub -al
1eb0: 6c 20 6f 6c 64 5c 2e 63 20 24 74 72 5f 70 72 6f  l old\.c $tr_pro
1ec0: 67 72 61 6d 5f 63 6f 6f 6b 65 64 20 24 6f 6c 64  gram_cooked $old
1ed0: 43 20 74 72 5f 70 72 6f 67 72 61 6d 5f 63 6f 6f  C tr_program_coo
1ee0: 6b 65 64 20 0a 0a 20 20 20 20 63 61 74 63 68 73  ked ..    catchs
1ef0: 71 6c 20 7b 0a 20 20 20 20 20 20 44 52 4f 50 20  ql {.      DROP 
1f00: 54 41 42 4c 45 20 74 62 6c 3b 0a 20 20 20 20 20  TABLE tbl;.     
1f10: 20 44 52 4f 50 20 54 41 42 4c 45 20 6c 6f 67 3b   DROP TABLE log;
1f20: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 65 78 65 63  .    }..    exec
1f30: 73 71 6c 20 7b 0a 20 20 20 20 20 20 43 52 45 41  sql {.      CREA
1f40: 54 45 20 54 41 42 4c 45 20 74 62 6c 28 61 20 50  TE TABLE tbl(a P
1f50: 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 2c 20 63  RIMARY KEY, b, c
1f60: 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  );.      CREATE 
1f70: 54 41 42 4c 45 20 6c 6f 67 28 61 2c 20 62 2c 20  TABLE log(a, b, 
1f80: 63 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73  c);.    }..    s
1f90: 65 74 20 71 75 65 72 79 20 7b 53 45 4c 45 43 54  et query {SELECT
1fa0: 20 2a 20 46 52 4f 4d 20 74 62 6c 3b 20 53 45 4c   * FROM tbl; SEL
1fb0: 45 43 54 20 2a 20 46 52 4f 4d 20 6c 6f 67 3b 7d  ECT * FROM log;}
1fc0: 0a 20 20 20 20 73 65 74 20 70 72 65 70 20 22 24  .    set prep "$
1fd0: 70 72 65 70 3b 20 49 4e 53 45 52 54 20 49 4e 54  prep; INSERT INT
1fe0: 4f 20 6c 6f 67 20 56 41 4c 55 45 53 28 31 2c 20  O log VALUES(1, 
1ff0: 32 2c 20 33 29 3b 5c 0a 20 20 20 20 20 20 20 20  2, 3);\.        
2000: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
2010: 20 6c 6f 67 20 56 41 4c 55 45 53 28 31 30 2c 20   log VALUES(10, 
2020: 32 30 2c 20 33 30 29 3b 22 0a 0a 23 20 43 68 65  20, 30);"..# Che
2030: 63 6b 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  ck execution of 
2040: 42 45 46 4f 52 45 20 70 72 6f 67 72 61 6d 73 3a  BEFORE programs:
2050: 0a 0a 20 20 20 20 73 65 74 20 62 65 66 6f 72 65  ..    set before
2060: 5f 64 61 74 61 20 5b 20 65 78 65 63 73 71 6c 20  _data [ execsql 
2070: 22 24 70 72 65 70 20 24 74 72 5f 70 72 6f 67 72  "$prep $tr_progr
2080: 61 6d 5f 63 6f 6f 6b 65 64 20 24 73 74 61 74 65  am_cooked $state
2090: 6d 65 6e 74 20 24 71 75 65 72 79 22 20 5d 0a 0a  ment $query" ]..
20a0: 20 20 20 20 65 78 65 63 73 71 6c 20 22 44 45 4c      execsql "DEL
20b0: 45 54 45 20 46 52 4f 4d 20 74 62 6c 3b 20 44 45  ETE FROM tbl; DE
20c0: 4c 45 54 45 20 46 52 4f 4d 20 6c 6f 67 3b 20 24  LETE FROM log; $
20d0: 70 72 65 70 22 3b 0a 20 20 20 20 65 78 65 63 73  prep";.    execs
20e0: 71 6c 20 22 43 52 45 41 54 45 20 54 52 49 47 47  ql "CREATE TRIGG
20f0: 45 52 20 74 68 65 5f 74 72 69 67 67 65 72 20 42  ER the_trigger B
2100: 45 46 4f 52 45 20 5b 73 74 72 69 6e 67 20 72 61  EFORE [string ra
2110: 6e 67 65 20 24 73 74 61 74 65 6d 65 6e 74 20 30  nge $statement 0
2120: 20 36 5d 5c 0a 20 20 20 20 20 20 20 20 20 20 20   6]\.           
2130: 20 20 4f 4e 20 74 62 6c 20 42 45 47 49 4e 20 24    ON tbl BEGIN $
2140: 74 72 5f 70 72 6f 67 72 61 6d 5f 66 69 78 65 64  tr_program_fixed
2150: 20 45 4e 44 3b 22 0a 0a 20 20 20 20 64 6f 5f 74   END;"..    do_t
2160: 65 73 74 20 74 72 69 67 67 65 72 32 2d 32 2e 24  est trigger2-2.$
2170: 69 69 2d 62 65 66 6f 72 65 20 22 65 78 65 63 73  ii-before "execs
2180: 71 6c 20 7b 24 73 74 61 74 65 6d 65 6e 74 20 24  ql {$statement $
2190: 71 75 65 72 79 7d 22 20 24 62 65 66 6f 72 65 5f  query}" $before_
21a0: 64 61 74 61 0a 0a 20 20 20 20 65 78 65 63 73 71  data..    execsq
21b0: 6c 20 22 44 52 4f 50 20 54 52 49 47 47 45 52 20  l "DROP TRIGGER 
21c0: 74 68 65 5f 74 72 69 67 67 65 72 3b 22 0a 20 20  the_trigger;".  
21d0: 20 20 65 78 65 63 73 71 6c 20 22 44 45 4c 45 54    execsql "DELET
21e0: 45 20 46 52 4f 4d 20 74 62 6c 3b 20 44 45 4c 45  E FROM tbl; DELE
21f0: 54 45 20 46 52 4f 4d 20 6c 6f 67 3b 22 0a 0a 23  TE FROM log;"..#
2200: 20 43 68 65 63 6b 20 65 78 65 63 75 74 69 6f 6e   Check execution
2210: 20 6f 66 20 41 46 54 45 52 20 70 72 6f 67 72 61   of AFTER progra
2220: 6d 73 0a 20 20 20 20 73 65 74 20 61 66 74 65 72  ms.    set after
2230: 5f 64 61 74 61 20 5b 20 65 78 65 63 73 71 6c 20  _data [ execsql 
2240: 22 24 70 72 65 70 20 24 73 74 61 74 65 6d 65 6e  "$prep $statemen
2250: 74 20 24 74 72 5f 70 72 6f 67 72 61 6d 5f 63 6f  t $tr_program_co
2260: 6f 6b 65 64 20 24 71 75 65 72 79 22 20 5d 0a 0a  oked $query" ]..
2270: 20 20 20 20 65 78 65 63 73 71 6c 20 22 44 45 4c      execsql "DEL
2280: 45 54 45 20 46 52 4f 4d 20 74 62 6c 3b 20 44 45  ETE FROM tbl; DE
2290: 4c 45 54 45 20 46 52 4f 4d 20 6c 6f 67 3b 20 24  LETE FROM log; $
22a0: 70 72 65 70 22 3b 0a 20 20 20 20 65 78 65 63 73  prep";.    execs
22b0: 71 6c 20 22 43 52 45 41 54 45 20 54 52 49 47 47  ql "CREATE TRIGG
22c0: 45 52 20 74 68 65 5f 74 72 69 67 67 65 72 20 41  ER the_trigger A
22d0: 46 54 45 52 20 5b 73 74 72 69 6e 67 20 72 61 6e  FTER [string ran
22e0: 67 65 20 24 73 74 61 74 65 6d 65 6e 74 20 30 20  ge $statement 0 
22f0: 36 5d 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  6]\.            
2300: 20 4f 4e 20 74 62 6c 20 42 45 47 49 4e 20 24 74   ON tbl BEGIN $t
2310: 72 5f 70 72 6f 67 72 61 6d 5f 66 69 78 65 64 20  r_program_fixed 
2320: 45 4e 44 3b 22 0a 0a 20 20 20 20 64 6f 5f 74 65  END;"..    do_te
2330: 73 74 20 74 72 69 67 67 65 72 32 2d 32 2e 24 69  st trigger2-2.$i
2340: 69 2d 61 66 74 65 72 20 22 65 78 65 63 73 71 6c  i-after "execsql
2350: 20 7b 24 73 74 61 74 65 6d 65 6e 74 20 24 71 75   {$statement $qu
2360: 65 72 79 7d 22 20 24 61 66 74 65 72 5f 64 61 74  ery}" $after_dat
2370: 61 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22 44  a.    execsql "D
2380: 52 4f 50 20 54 52 49 47 47 45 52 20 74 68 65 5f  ROP TRIGGER the_
2390: 74 72 69 67 67 65 72 3b 22 0a 0a 20 20 20 20 69  trigger;"..    i
23a0: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 74  ntegrity_check t
23b0: 72 69 67 67 65 72 32 2d 32 2e 24 69 69 2d 69 6e  rigger2-2.$ii-in
23c0: 74 65 67 72 69 74 79 0a 20 20 7d 0a 7d 0a 63 61  tegrity.  }.}.ca
23d0: 74 63 68 73 71 6c 20 7b 0a 20 20 44 52 4f 50 20  tchsql {.  DROP 
23e0: 54 41 42 4c 45 20 74 62 6c 3b 0a 20 20 44 52 4f  TABLE tbl;.  DRO
23f0: 50 20 54 41 42 4c 45 20 6c 6f 67 3b 0a 7d 0a 0a  P TABLE log;.}..
2400: 23 20 33 2e 0a 0a 23 20 74 72 69 67 67 65 72 32  # 3...# trigger2
2410: 2d 33 2e 31 3a 20 55 50 44 41 54 45 20 4f 46 20  -3.1: UPDATE OF 
2420: 74 72 69 67 67 65 72 73 0a 65 78 65 63 73 71 6c  triggers.execsql
2430: 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c   {.  CREATE TABL
2440: 45 20 74 62 6c 20 28 61 2c 20 62 2c 20 63 2c 20  E tbl (a, b, c, 
2450: 64 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42  d);.  CREATE TAB
2460: 4c 45 20 6c 6f 67 20 28 61 29 3b 0a 20 20 49 4e  LE log (a);.  IN
2470: 53 45 52 54 20 49 4e 54 4f 20 6c 6f 67 20 56 41  SERT INTO log VA
2480: 4c 55 45 53 20 28 30 29 3b 0a 20 20 49 4e 53 45  LUES (0);.  INSE
2490: 52 54 20 49 4e 54 4f 20 74 62 6c 20 56 41 4c 55  RT INTO tbl VALU
24a0: 45 53 20 28 30 2c 20 30 2c 20 30 2c 20 30 29 3b  ES (0, 0, 0, 0);
24b0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
24c0: 62 6c 20 56 41 4c 55 45 53 20 28 31 2c 20 30 2c  bl VALUES (1, 0,
24d0: 20 30 2c 20 30 29 3b 0a 20 20 43 52 45 41 54 45   0, 0);.  CREATE
24e0: 20 54 52 49 47 47 45 52 20 74 62 6c 5f 61 66 74   TRIGGER tbl_aft
24f0: 65 72 5f 75 70 64 61 74 65 5f 63 64 20 42 45 46  er_update_cd BEF
2500: 4f 52 45 20 55 50 44 41 54 45 20 4f 46 20 63 2c  ORE UPDATE OF c,
2510: 20 64 20 4f 4e 20 74 62 6c 0a 20 20 20 20 42 45   d ON tbl.    BE
2520: 47 49 4e 0a 20 20 20 20 20 20 55 50 44 41 54 45  GIN.      UPDATE
2530: 20 6c 6f 67 20 53 45 54 20 61 20 3d 20 61 20 2b   log SET a = a +
2540: 20 31 3b 0a 20 20 20 20 45 4e 44 3b 0a 7d 0a 64   1;.    END;.}.d
2550: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 32 2d  o_test trigger2-
2560: 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  3.1 {.  execsql 
2570: 7b 0a 20 20 20 20 55 50 44 41 54 45 20 74 62 6c  {.    UPDATE tbl
2580: 20 53 45 54 20 62 20 3d 20 31 2c 20 63 20 3d 20   SET b = 1, c = 
2590: 31 30 3b 20 2d 2d 20 32 0a 20 20 20 20 55 50 44  10; -- 2.    UPD
25a0: 41 54 45 20 74 62 6c 20 53 45 54 20 62 20 3d 20  ATE tbl SET b = 
25b0: 31 30 3b 20 2d 2d 20 30 0a 20 20 20 20 55 50 44  10; -- 0.    UPD
25c0: 41 54 45 20 74 62 6c 20 53 45 54 20 64 20 3d 20  ATE tbl SET d = 
25d0: 34 20 57 48 45 52 45 20 61 20 3d 20 30 3b 20 2d  4 WHERE a = 0; -
25e0: 2d 31 0a 20 20 20 20 55 50 44 41 54 45 20 74 62  -1.    UPDATE tb
25f0: 6c 20 53 45 54 20 61 20 3d 20 34 2c 20 62 20 3d  l SET a = 4, b =
2600: 20 31 30 3b 20 2d 2d 30 0a 20 20 20 20 53 45 4c   10; --0.    SEL
2610: 45 43 54 20 2a 20 46 52 4f 4d 20 6c 6f 67 3b 0a  ECT * FROM log;.
2620: 20 20 7d 0a 7d 20 7b 33 7d 0a 65 78 65 63 73 71    }.} {3}.execsq
2630: 6c 20 7b 0a 20 20 44 52 4f 50 20 54 41 42 4c 45  l {.  DROP TABLE
2640: 20 74 62 6c 3b 0a 20 20 44 52 4f 50 20 54 41 42   tbl;.  DROP TAB
2650: 4c 45 20 6c 6f 67 3b 0a 7d 0a 0a 23 20 74 72 69  LE log;.}..# tri
2660: 67 67 65 72 32 2d 33 2e 32 3a 20 57 48 45 4e 20  gger2-3.2: WHEN 
2670: 63 6c 61 75 73 65 0a 73 65 74 20 77 68 65 6e 5f  clause.set when_
2680: 74 72 69 67 67 65 72 73 20 5b 20 6c 69 73 74 20  triggers [ list 
2690: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  \.             {
26a0: 74 31 20 42 45 46 4f 52 45 20 49 4e 53 45 52 54  t1 BEFORE INSERT
26b0: 20 4f 4e 20 74 62 6c 20 57 48 45 4e 20 6e 65 77   ON tbl WHEN new
26c0: 2e 61 20 3e 20 32 30 7d 20 5c 0a 20 20 20 20 20  .a > 20} \.     
26d0: 20 20 20 20 20 20 20 20 7b 74 32 20 42 45 46 4f          {t2 BEFO
26e0: 52 45 20 49 4e 53 45 52 54 20 4f 4e 20 74 62 6c  RE INSERT ON tbl
26f0: 20 57 48 45 4e 20 28 53 45 4c 45 43 54 20 63 6f   WHEN (SELECT co
2700: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 62 6c 29  unt(*) FROM tbl)
2710: 20 3d 20 30 7d 20 5d 0a 0a 65 78 65 63 73 71 6c   = 0} ]..execsql
2720: 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c   {.  CREATE TABL
2730: 45 20 74 62 6c 20 28 61 2c 20 62 2c 20 63 2c 20  E tbl (a, b, c, 
2740: 64 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42  d);.  CREATE TAB
2750: 4c 45 20 6c 6f 67 20 28 61 29 3b 0a 20 20 49 4e  LE log (a);.  IN
2760: 53 45 52 54 20 49 4e 54 4f 20 6c 6f 67 20 56 41  SERT INTO log VA
2770: 4c 55 45 53 20 28 30 29 3b 0a 7d 0a 0a 66 6f 72  LUES (0);.}..for
2780: 65 61 63 68 20 74 72 69 67 20 24 77 68 65 6e 5f  each trig $when_
2790: 74 72 69 67 67 65 72 73 20 7b 0a 20 20 65 78 65  triggers {.  exe
27a0: 63 73 71 6c 20 22 43 52 45 41 54 45 20 54 52 49  csql "CREATE TRI
27b0: 47 47 45 52 20 24 74 72 69 67 20 42 45 47 49 4e  GGER $trig BEGIN
27c0: 20 55 50 44 41 54 45 20 6c 6f 67 20 73 65 74 20   UPDATE log set 
27d0: 61 20 3d 20 61 20 2b 20 31 3b 20 45 4e 44 3b 22  a = a + 1; END;"
27e0: 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 74 72 69 67  .}..do_test trig
27f0: 67 65 72 32 2d 33 2e 32 20 7b 0a 20 20 65 78 65  ger2-3.2 {.  exe
2800: 63 73 71 6c 20 7b 20 0a 0a 20 20 20 20 49 4e 53  csql { ..    INS
2810: 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 56 41 4c  ERT INTO tbl VAL
2820: 55 45 53 28 30 2c 20 30 2c 20 30 2c 20 30 29 3b  UES(0, 0, 0, 0);
2830: 20 20 20 20 20 2d 2d 20 31 0a 20 20 20 20 53 45       -- 1.    SE
2840: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6c 6f 67 3b  LECT * FROM log;
2850: 0a 20 20 20 20 55 50 44 41 54 45 20 6c 6f 67 20  .    UPDATE log 
2860: 53 45 54 20 61 20 3d 20 30 3b 0a 0a 20 20 20 20  SET a = 0;..    
2870: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20  INSERT INTO tbl 
2880: 56 41 4c 55 45 53 28 30 2c 20 30 2c 20 30 2c 20  VALUES(0, 0, 0, 
2890: 30 29 3b 20 20 20 20 20 2d 2d 20 30 0a 20 20 20  0);     -- 0.   
28a0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6c   SELECT * FROM l
28b0: 6f 67 3b 0a 20 20 20 20 55 50 44 41 54 45 20 6c  og;.    UPDATE l
28c0: 6f 67 20 53 45 54 20 61 20 3d 20 30 3b 0a 0a 20  og SET a = 0;.. 
28d0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
28e0: 62 6c 20 56 41 4c 55 45 53 28 32 30 30 2c 20 30  bl VALUES(200, 0
28f0: 2c 20 30 2c 20 30 29 3b 20 20 20 20 20 2d 2d 20  , 0, 0);     -- 
2900: 31 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  1.    SELECT * F
2910: 52 4f 4d 20 6c 6f 67 3b 0a 20 20 20 20 55 50 44  ROM log;.    UPD
2920: 41 54 45 20 6c 6f 67 20 53 45 54 20 61 20 3d 20  ATE log SET a = 
2930: 30 3b 0a 20 20 7d 0a 7d 20 7b 31 20 30 20 31 7d  0;.  }.} {1 0 1}
2940: 0a 65 78 65 63 73 71 6c 20 7b 0a 20 20 44 52 4f  .execsql {.  DRO
2950: 50 20 54 41 42 4c 45 20 74 62 6c 3b 0a 20 20 44  P TABLE tbl;.  D
2960: 52 4f 50 20 54 41 42 4c 45 20 6c 6f 67 3b 0a 7d  ROP TABLE log;.}
2970: 0a 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b  .integrity_check
2980: 20 74 72 69 67 67 65 72 32 2d 33 2e 33 0a 0a 23   trigger2-3.3..#
2990: 20 53 69 6d 70 6c 65 20 63 61 73 63 61 64 65 64   Simple cascaded
29a0: 20 74 72 69 67 67 65 72 0a 65 78 65 63 73 71 6c   trigger.execsql
29b0: 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c   {.  CREATE TABL
29c0: 45 20 74 62 6c 41 28 61 2c 20 62 29 3b 0a 20 20  E tblA(a, b);.  
29d0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 62 6c  CREATE TABLE tbl
29e0: 42 28 61 2c 20 62 29 3b 0a 20 20 43 52 45 41 54  B(a, b);.  CREAT
29f0: 45 20 54 41 42 4c 45 20 74 62 6c 43 28 61 2c 20  E TABLE tblC(a, 
2a00: 62 29 3b 0a 0a 20 20 43 52 45 41 54 45 20 54 52  b);..  CREATE TR
2a10: 49 47 47 45 52 20 74 72 31 20 42 45 46 4f 52 45  IGGER tr1 BEFORE
2a20: 20 49 4e 53 45 52 54 20 4f 4e 20 74 62 6c 41 20   INSERT ON tblA 
2a30: 42 45 47 49 4e 0a 20 20 20 20 49 4e 53 45 52 54  BEGIN.    INSERT
2a40: 20 49 4e 54 4f 20 74 62 6c 42 20 76 61 6c 75 65   INTO tblB value
2a50: 73 28 6e 65 77 2e 61 2c 20 6e 65 77 2e 62 29 3b  s(new.a, new.b);
2a60: 0a 20 20 45 4e 44 3b 0a 0a 20 20 43 52 45 41 54  .  END;..  CREAT
2a70: 45 20 54 52 49 47 47 45 52 20 74 72 32 20 42 45  E TRIGGER tr2 BE
2a80: 46 4f 52 45 20 49 4e 53 45 52 54 20 4f 4e 20 74  FORE INSERT ON t
2a90: 62 6c 42 20 42 45 47 49 4e 0a 20 20 20 20 49 4e  blB BEGIN.    IN
2aa0: 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 43 20 76  SERT INTO tblC v
2ab0: 61 6c 75 65 73 28 6e 65 77 2e 61 2c 20 6e 65 77  alues(new.a, new
2ac0: 2e 62 29 3b 0a 20 20 45 4e 44 3b 0a 7d 0a 64 6f  .b);.  END;.}.do
2ad0: 5f 74 65 73 74 20 74 72 69 67 67 65 72 32 2d 34  _test trigger2-4
2ae0: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
2af0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
2b00: 20 74 62 6c 41 20 76 61 6c 75 65 73 28 31 2c 20   tblA values(1, 
2b10: 32 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  2);.    SELECT *
2b20: 20 46 52 4f 4d 20 74 62 6c 41 3b 0a 20 20 20 20   FROM tblA;.    
2b30: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 62  SELECT * FROM tb
2b40: 6c 42 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  lB;.    SELECT *
2b50: 20 46 52 4f 4d 20 74 62 6c 43 3b 0a 20 20 7d 0a   FROM tblC;.  }.
2b60: 7d 20 7b 31 20 32 20 31 20 32 20 31 20 32 7d 0a  } {1 2 1 2 1 2}.
2b70: 65 78 65 63 73 71 6c 20 7b 0a 20 20 44 52 4f 50  execsql {.  DROP
2b80: 20 54 41 42 4c 45 20 74 62 6c 41 3b 0a 20 20 44   TABLE tblA;.  D
2b90: 52 4f 50 20 54 41 42 4c 45 20 74 62 6c 42 3b 0a  ROP TABLE tblB;.
2ba0: 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74 62 6c    DROP TABLE tbl
2bb0: 43 3b 0a 7d 0a 0a 23 20 53 69 6d 70 6c 65 20 72  C;.}..# Simple r
2bc0: 65 63 75 72 73 69 76 65 20 74 72 69 67 67 65 72  ecursive trigger
2bd0: 0a 65 78 65 63 73 71 6c 20 7b 0a 20 20 43 52 45  .execsql {.  CRE
2be0: 41 54 45 20 54 41 42 4c 45 20 74 62 6c 28 61 2c  ATE TABLE tbl(a,
2bf0: 20 62 2c 20 63 29 3b 0a 20 20 43 52 45 41 54 45   b, c);.  CREATE
2c00: 20 54 52 49 47 47 45 52 20 74 62 6c 5f 74 72 69   TRIGGER tbl_tri
2c10: 67 20 42 45 46 4f 52 45 20 49 4e 53 45 52 54 20  g BEFORE INSERT 
2c20: 4f 4e 20 74 62 6c 20 0a 20 20 20 20 42 45 47 49  ON tbl .    BEGI
2c30: 4e 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  N.      INSERT I
2c40: 4e 54 4f 20 74 62 6c 20 56 41 4c 55 45 53 20 28  NTO tbl VALUES (
2c50: 6e 65 77 2e 61 2c 20 6e 65 77 2e 62 2c 20 6e 65  new.a, new.b, ne
2c60: 77 2e 63 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 7d  w.c);.    END;.}
2c70: 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72  .do_test trigger
2c80: 32 2d 34 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  2-4.2 {.  execsq
2c90: 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  l {.    INSERT I
2ca0: 4e 54 4f 20 74 62 6c 20 56 41 4c 55 45 53 20 28  NTO tbl VALUES (
2cb0: 31 2c 20 32 2c 20 33 29 3b 0a 20 20 20 20 73 65  1, 2, 3);.    se
2cc0: 6c 65 63 74 20 2a 20 66 72 6f 6d 20 74 62 6c 3b  lect * from tbl;
2cd0: 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 33 20 31 20  .  }.} {1 2 3 1 
2ce0: 32 20 33 7d 0a 65 78 65 63 73 71 6c 20 7b 0a 20  2 3}.execsql {. 
2cf0: 20 44 52 4f 50 20 54 41 42 4c 45 20 74 62 6c 3b   DROP TABLE tbl;
2d00: 0a 7d 0a 0a 23 20 35 2e 0a 65 78 65 63 73 71 6c  .}..# 5..execsql
2d10: 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c   {.  CREATE TABL
2d20: 45 20 74 62 6c 28 61 2c 20 62 2c 20 63 29 3b 0a  E tbl(a, b, c);.
2d30: 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52    CREATE TRIGGER
2d40: 20 74 62 6c 5f 74 72 69 67 20 42 45 46 4f 52 45   tbl_trig BEFORE
2d50: 20 49 4e 53 45 52 54 20 4f 4e 20 74 62 6c 20 0a   INSERT ON tbl .
2d60: 20 20 20 20 42 45 47 49 4e 0a 20 20 20 20 20 20      BEGIN.      
2d70: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20  INSERT INTO tbl 
2d80: 56 41 4c 55 45 53 20 28 31 2c 20 32 2c 20 33 29  VALUES (1, 2, 3)
2d90: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
2da0: 4e 54 4f 20 74 62 6c 20 56 41 4c 55 45 53 20 28  NTO tbl VALUES (
2db0: 32 2c 20 32 2c 20 33 29 3b 0a 20 20 20 20 20 20  2, 2, 3);.      
2dc0: 55 50 44 41 54 45 20 74 62 6c 20 73 65 74 20 62  UPDATE tbl set b
2dd0: 20 3d 20 31 30 20 57 48 45 52 45 20 61 20 3d 20   = 10 WHERE a = 
2de0: 31 3b 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20  1;.      DELETE 
2df0: 46 52 4f 4d 20 74 62 6c 20 57 48 45 52 45 20 61  FROM tbl WHERE a
2e00: 20 3d 20 31 3b 0a 20 20 20 20 20 20 44 45 4c 45   = 1;.      DELE
2e10: 54 45 20 46 52 4f 4d 20 74 62 6c 3b 0a 20 20 20  TE FROM tbl;.   
2e20: 20 45 4e 44 3b 0a 7d 0a 64 6f 5f 74 65 73 74 20   END;.}.do_test 
2e30: 74 72 69 67 67 65 72 32 2d 35 20 7b 0a 20 20 65  trigger2-5 {.  e
2e40: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53  xecsql {.    INS
2e50: 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 56 41 4c  ERT INTO tbl VAL
2e60: 55 45 53 28 31 30 30 2c 20 32 30 30 2c 20 33 30  UES(100, 200, 30
2e70: 30 29 3b 0a 20 20 7d 0a 20 20 64 62 20 63 68 61  0);.  }.  db cha
2e80: 6e 67 65 73 0a 7d 20 7b 31 7d 0a 65 78 65 63 73  nges.} {1}.execs
2e90: 71 6c 20 7b 0a 20 20 44 52 4f 50 20 54 41 42 4c  ql {.  DROP TABL
2ea0: 45 20 74 62 6c 3b 0a 7d 0a 0a 23 20 48 61 6e 64  E tbl;.}..# Hand
2eb0: 6c 69 6e 67 20 6f 66 20 4f 4e 20 43 4f 4e 46 4c  ling of ON CONFL
2ec0: 49 43 54 20 62 79 20 49 4e 53 45 52 54 20 73 74  ICT by INSERT st
2ed0: 61 74 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 20  atements inside 
2ee0: 74 72 69 67 67 65 72 73 0a 65 78 65 63 73 71 6c  triggers.execsql
2ef0: 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c   {.  CREATE TABL
2f00: 45 20 74 62 6c 20 28 61 20 70 72 69 6d 61 72 79  E tbl (a primary
2f10: 20 6b 65 79 2c 20 62 2c 20 63 29 3b 0a 20 20 43   key, b, c);.  C
2f20: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 61 69  REATE TRIGGER ai
2f30: 5f 74 62 6c 20 41 46 54 45 52 20 49 4e 53 45 52  _tbl AFTER INSER
2f40: 54 20 4f 4e 20 74 62 6c 20 42 45 47 49 4e 0a 20  T ON tbl BEGIN. 
2f50: 20 20 20 49 4e 53 45 52 54 20 4f 52 20 49 47 4e     INSERT OR IGN
2f60: 4f 52 45 20 49 4e 54 4f 20 74 62 6c 20 76 61 6c  ORE INTO tbl val
2f70: 75 65 73 20 28 6e 65 77 2e 61 2c 20 30 2c 20 30  ues (new.a, 0, 0
2f80: 29 3b 0a 20 20 45 4e 44 3b 0a 7d 0a 64 6f 5f 74  );.  END;.}.do_t
2f90: 65 73 74 20 74 72 69 67 67 65 72 32 2d 36 2e 31  est trigger2-6.1
2fa0: 61 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  a {.  execsql {.
2fb0: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49      BEGIN;.    I
2fc0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 76  NSERT INTO tbl v
2fd0: 61 6c 75 65 73 20 28 31 2c 20 32 2c 20 33 29 3b  alues (1, 2, 3);
2fe0: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 66 72  .    SELECT * fr
2ff0: 6f 6d 20 74 62 6c 3b 0a 20 20 7d 0a 7d 20 7b 31  om tbl;.  }.} {1
3000: 20 32 20 33 7d 0a 64 6f 5f 74 65 73 74 20 74 72   2 3}.do_test tr
3010: 69 67 67 65 72 32 2d 36 2e 31 62 20 7b 0a 20 20  igger2-6.1b {.  
3020: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 49  catchsql {.    I
3030: 4e 53 45 52 54 20 4f 52 20 41 42 4f 52 54 20 49  NSERT OR ABORT I
3040: 4e 54 4f 20 74 62 6c 20 76 61 6c 75 65 73 20 28  NTO tbl values (
3050: 32 2c 20 32 2c 20 33 29 3b 0a 20 20 7d 0a 7d 20  2, 2, 3);.  }.} 
3060: 7b 31 20 7b 63 6f 6c 75 6d 6e 20 61 20 69 73 20  {1 {column a is 
3070: 6e 6f 74 20 75 6e 69 71 75 65 7d 7d 0a 64 6f 5f  not unique}}.do_
3080: 74 65 73 74 20 74 72 69 67 67 65 72 32 2d 36 2e  test trigger2-6.
3090: 31 63 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  1c {.  execsql {
30a0: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 66 72  .    SELECT * fr
30b0: 6f 6d 20 74 62 6c 3b 0a 20 20 7d 0a 7d 20 7b 31  om tbl;.  }.} {1
30c0: 20 32 20 33 7d 0a 64 6f 5f 74 65 73 74 20 74 72   2 3}.do_test tr
30d0: 69 67 67 65 72 32 2d 36 2e 31 64 20 7b 0a 20 20  igger2-6.1d {.  
30e0: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 49  catchsql {.    I
30f0: 4e 53 45 52 54 20 4f 52 20 46 41 49 4c 20 49 4e  NSERT OR FAIL IN
3100: 54 4f 20 74 62 6c 20 76 61 6c 75 65 73 20 28 32  TO tbl values (2
3110: 2c 20 32 2c 20 33 29 3b 0a 20 20 7d 0a 7d 20 7b  , 2, 3);.  }.} {
3120: 31 20 7b 63 6f 6c 75 6d 6e 20 61 20 69 73 20 6e  1 {column a is n
3130: 6f 74 20 75 6e 69 71 75 65 7d 7d 0a 64 6f 5f 74  ot unique}}.do_t
3140: 65 73 74 20 74 72 69 67 67 65 72 32 2d 36 2e 31  est trigger2-6.1
3150: 65 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  e {.  execsql {.
3160: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 66 72 6f      SELECT * fro
3170: 6d 20 74 62 6c 3b 0a 20 20 7d 0a 7d 20 7b 31 20  m tbl;.  }.} {1 
3180: 32 20 33 20 32 20 32 20 33 7d 0a 64 6f 5f 74 65  2 3 2 2 3}.do_te
3190: 73 74 20 74 72 69 67 67 65 72 32 2d 36 2e 31 66  st trigger2-6.1f
31a0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
31b0: 20 20 20 49 4e 53 45 52 54 20 4f 52 20 52 45 50     INSERT OR REP
31c0: 4c 41 43 45 20 49 4e 54 4f 20 74 62 6c 20 76 61  LACE INTO tbl va
31d0: 6c 75 65 73 20 28 32 2c 20 32 2c 20 33 29 3b 0a  lues (2, 2, 3);.
31e0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 66 72 6f      SELECT * fro
31f0: 6d 20 74 62 6c 3b 0a 20 20 7d 0a 7d 20 7b 31 20  m tbl;.  }.} {1 
3200: 32 20 33 20 32 20 30 20 30 7d 0a 64 6f 5f 74 65  2 3 2 0 0}.do_te
3210: 73 74 20 74 72 69 67 67 65 72 32 2d 36 2e 31 67  st trigger2-6.1g
3220: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a   {.  catchsql {.
3230: 20 20 20 20 49 4e 53 45 52 54 20 4f 52 20 52 4f      INSERT OR RO
3240: 4c 4c 42 41 43 4b 20 49 4e 54 4f 20 74 62 6c 20  LLBACK INTO tbl 
3250: 76 61 6c 75 65 73 20 28 33 2c 20 32 2c 20 33 29  values (3, 2, 3)
3260: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 63 6f 6c 75  ;.  }.} {1 {colu
3270: 6d 6e 20 61 20 69 73 20 6e 6f 74 20 75 6e 69 71  mn a is not uniq
3280: 75 65 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69  ue}}.do_test tri
3290: 67 67 65 72 32 2d 36 2e 31 68 20 7b 0a 20 20 65  gger2-6.1h {.  e
32a0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
32b0: 45 43 54 20 2a 20 66 72 6f 6d 20 74 62 6c 3b 0a  ECT * from tbl;.
32c0: 20 20 7d 0a 7d 20 7b 7d 0a 65 78 65 63 73 71 6c    }.} {}.execsql
32d0: 20 7b 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 62   {DELETE FROM tb
32e0: 6c 7d 0a 0a 0a 23 20 48 61 6e 64 6c 69 6e 67 20  l}...# Handling 
32f0: 6f 66 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 62  of ON CONFLICT b
3300: 79 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65  y UPDATE stateme
3310: 6e 74 73 20 69 6e 73 69 64 65 20 74 72 69 67 67  nts inside trigg
3320: 65 72 73 0a 65 78 65 63 73 71 6c 20 7b 0a 20 20  ers.execsql {.  
3330: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20  INSERT INTO tbl 
3340: 76 61 6c 75 65 73 20 28 34 2c 20 32 2c 20 33 29  values (4, 2, 3)
3350: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
3360: 74 62 6c 20 76 61 6c 75 65 73 20 28 36 2c 20 33  tbl values (6, 3
3370: 2c 20 34 29 3b 0a 20 20 43 52 45 41 54 45 20 54  , 4);.  CREATE T
3380: 52 49 47 47 45 52 20 61 75 5f 74 62 6c 20 41 46  RIGGER au_tbl AF
3390: 54 45 52 20 55 50 44 41 54 45 20 4f 4e 20 74 62  TER UPDATE ON tb
33a0: 6c 20 42 45 47 49 4e 0a 20 20 20 20 55 50 44 41  l BEGIN.    UPDA
33b0: 54 45 20 4f 52 20 49 47 4e 4f 52 45 20 74 62 6c  TE OR IGNORE tbl
33c0: 20 53 45 54 20 61 20 3d 20 6e 65 77 2e 61 2c 20   SET a = new.a, 
33d0: 63 20 3d 20 31 30 3b 0a 20 20 45 4e 44 3b 0a 7d  c = 10;.  END;.}
33e0: 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72  .do_test trigger
33f0: 32 2d 36 2e 32 61 20 7b 0a 20 20 65 78 65 63 73  2-6.2a {.  execs
3400: 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  ql {.    BEGIN;.
3410: 20 20 20 20 55 50 44 41 54 45 20 74 62 6c 20 53      UPDATE tbl S
3420: 45 54 20 61 20 3d 20 31 20 57 48 45 52 45 20 61  ET a = 1 WHERE a
3430: 20 3d 20 34 3b 0a 20 20 20 20 53 45 4c 45 43 54   = 4;.    SELECT
3440: 20 2a 20 66 72 6f 6d 20 74 62 6c 3b 0a 20 20 7d   * from tbl;.  }
3450: 0a 7d 20 7b 31 20 32 20 31 30 20 36 20 33 20 34  .} {1 2 10 6 3 4
3460: 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65  }.do_test trigge
3470: 72 32 2d 36 2e 32 62 20 7b 0a 20 20 63 61 74 63  r2-6.2b {.  catc
3480: 68 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54  hsql {.    UPDAT
3490: 45 20 4f 52 20 41 42 4f 52 54 20 74 62 6c 20 53  E OR ABORT tbl S
34a0: 45 54 20 61 20 3d 20 34 20 57 48 45 52 45 20 61  ET a = 4 WHERE a
34b0: 20 3d 20 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b   = 1;.  }.} {1 {
34c0: 63 6f 6c 75 6d 6e 20 61 20 69 73 20 6e 6f 74 20  column a is not 
34d0: 75 6e 69 71 75 65 7d 7d 0a 64 6f 5f 74 65 73 74  unique}}.do_test
34e0: 20 74 72 69 67 67 65 72 32 2d 36 2e 32 63 20 7b   trigger2-6.2c {
34f0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
3500: 20 53 45 4c 45 43 54 20 2a 20 66 72 6f 6d 20 74   SELECT * from t
3510: 62 6c 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 31  bl;.  }.} {1 2 1
3520: 30 20 36 20 33 20 34 7d 0a 64 6f 5f 74 65 73 74  0 6 3 4}.do_test
3530: 20 74 72 69 67 67 65 72 32 2d 36 2e 32 64 20 7b   trigger2-6.2d {
3540: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .  catchsql {.  
3550: 20 20 55 50 44 41 54 45 20 4f 52 20 46 41 49 4c    UPDATE OR FAIL
3560: 20 74 62 6c 20 53 45 54 20 61 20 3d 20 34 20 57   tbl SET a = 4 W
3570: 48 45 52 45 20 61 20 3d 20 31 3b 0a 20 20 7d 0a  HERE a = 1;.  }.
3580: 7d 20 7b 31 20 7b 63 6f 6c 75 6d 6e 20 61 20 69  } {1 {column a i
3590: 73 20 6e 6f 74 20 75 6e 69 71 75 65 7d 7d 0a 64  s not unique}}.d
35a0: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 32 2d  o_test trigger2-
35b0: 36 2e 32 65 20 7b 0a 20 20 65 78 65 63 73 71 6c  6.2e {.  execsql
35c0: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   {.    SELECT * 
35d0: 66 72 6f 6d 20 74 62 6c 3b 0a 20 20 7d 0a 7d 20  from tbl;.  }.} 
35e0: 7b 34 20 32 20 31 30 20 36 20 33 20 34 7d 0a 64  {4 2 10 6 3 4}.d
35f0: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 32 2d  o_test trigger2-
3600: 36 2e 32 66 2e 31 20 7b 0a 20 20 65 78 65 63 73  6.2f.1 {.  execs
3610: 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20  ql {.    UPDATE 
3620: 4f 52 20 52 45 50 4c 41 43 45 20 74 62 6c 20 53  OR REPLACE tbl S
3630: 45 54 20 61 20 3d 20 31 20 57 48 45 52 45 20 61  ET a = 1 WHERE a
3640: 20 3d 20 34 3b 0a 20 20 20 20 53 45 4c 45 43 54   = 4;.    SELECT
3650: 20 2a 20 66 72 6f 6d 20 74 62 6c 3b 0a 20 20 7d   * from tbl;.  }
3660: 0a 7d 20 7b 31 20 33 20 31 30 7d 0a 64 6f 5f 74  .} {1 3 10}.do_t
3670: 65 73 74 20 74 72 69 67 67 65 72 32 2d 36 2e 32  est trigger2-6.2
3680: 66 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  f.2 {.  execsql 
3690: 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  {.    INSERT INT
36a0: 4f 20 74 62 6c 20 56 41 4c 55 45 53 20 28 32 2c  O tbl VALUES (2,
36b0: 20 33 2c 20 34 29 3b 0a 20 20 20 20 53 45 4c 45   3, 4);.    SELE
36c0: 43 54 20 2a 20 46 52 4f 4d 20 74 62 6c 3b 0a 20  CT * FROM tbl;. 
36d0: 20 7d 0a 7d 20 7b 31 20 33 20 31 30 20 32 20 33   }.} {1 3 10 2 3
36e0: 20 34 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67   4}.do_test trig
36f0: 67 65 72 32 2d 36 2e 32 67 20 7b 0a 20 20 63 61  ger2-6.2g {.  ca
3700: 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 55 50 44  tchsql {.    UPD
3710: 41 54 45 20 4f 52 20 52 4f 4c 4c 42 41 43 4b 20  ATE OR ROLLBACK 
3720: 74 62 6c 20 53 45 54 20 61 20 3d 20 34 20 57 48  tbl SET a = 4 WH
3730: 45 52 45 20 61 20 3d 20 31 3b 0a 20 20 7d 0a 7d  ERE a = 1;.  }.}
3740: 20 7b 31 20 7b 63 6f 6c 75 6d 6e 20 61 20 69 73   {1 {column a is
3750: 20 6e 6f 74 20 75 6e 69 71 75 65 7d 7d 0a 64 6f   not unique}}.do
3760: 5f 74 65 73 74 20 74 72 69 67 67 65 72 32 2d 36  _test trigger2-6
3770: 2e 32 68 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  .2h {.  execsql 
3780: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 66  {.    SELECT * f
3790: 72 6f 6d 20 74 62 6c 3b 0a 20 20 7d 0a 7d 20 7b  rom tbl;.  }.} {
37a0: 34 20 32 20 33 20 36 20 33 20 34 7d 0a 65 78 65  4 2 3 6 3 4}.exe
37b0: 63 73 71 6c 20 7b 0a 20 20 44 52 4f 50 20 54 41  csql {.  DROP TA
37c0: 42 4c 45 20 74 62 6c 3b 0a 7d 0a 0a 23 20 37 2e  BLE tbl;.}..# 7.
37d0: 20 54 72 69 67 67 65 72 73 20 6f 6e 20 76 69 65   Triggers on vie
37e0: 77 73 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67  ws.do_test trigg
37f0: 65 72 32 2d 37 2e 31 20 7b 0a 20 20 65 78 65 63  er2-7.1 {.  exec
3800: 73 71 6c 20 7b 0a 20 20 43 52 45 41 54 45 20 54  sql {.  CREATE T
3810: 41 42 4c 45 20 61 62 28 61 2c 20 62 29 3b 0a 20  ABLE ab(a, b);. 
3820: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 64   CREATE TABLE cd
3830: 28 63 2c 20 64 29 3b 0a 20 20 49 4e 53 45 52 54  (c, d);.  INSERT
3840: 20 49 4e 54 4f 20 61 62 20 56 41 4c 55 45 53 20   INTO ab VALUES 
3850: 28 31 2c 20 32 29 3b 0a 20 20 49 4e 53 45 52 54  (1, 2);.  INSERT
3860: 20 49 4e 54 4f 20 61 62 20 56 41 4c 55 45 53 20   INTO ab VALUES 
3870: 28 30 2c 20 30 29 3b 0a 20 20 49 4e 53 45 52 54  (0, 0);.  INSERT
3880: 20 49 4e 54 4f 20 63 64 20 56 41 4c 55 45 53 20   INTO cd VALUES 
3890: 28 33 2c 20 34 29 3b 0a 0a 20 20 43 52 45 41 54  (3, 4);..  CREAT
38a0: 45 20 54 41 42 4c 45 20 74 6c 6f 67 28 69 69 20  E TABLE tlog(ii 
38b0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
38c0: 4b 45 59 2c 20 0a 20 20 20 20 20 20 6f 6c 64 61  KEY, .      olda
38d0: 2c 20 6f 6c 64 62 2c 20 6f 6c 64 63 2c 20 6f 6c  , oldb, oldc, ol
38e0: 64 64 2c 20 6e 65 77 61 2c 20 6e 65 77 62 2c 20  dd, newa, newb, 
38f0: 6e 65 77 63 2c 20 6e 65 77 64 29 3b 0a 0a 20 20  newc, newd);..  
3900: 43 52 45 41 54 45 20 56 49 45 57 20 61 62 63 64  CREATE VIEW abcd
3910: 20 41 53 20 53 45 4c 45 43 54 20 61 2c 20 62 2c   AS SELECT a, b,
3920: 20 63 2c 20 64 20 46 52 4f 4d 20 61 62 2c 20 63   c, d FROM ab, c
3930: 64 3b 0a 0a 20 20 43 52 45 41 54 45 20 54 52 49  d;..  CREATE TRI
3940: 47 47 45 52 20 62 65 66 6f 72 65 5f 75 70 64 61  GGER before_upda
3950: 74 65 20 49 4e 53 54 45 41 44 20 4f 46 20 55 50  te INSTEAD OF UP
3960: 44 41 54 45 20 4f 4e 20 61 62 63 64 20 42 45 47  DATE ON abcd BEG
3970: 49 4e 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  IN.    INSERT IN
3980: 54 4f 20 74 6c 6f 67 20 56 41 4c 55 45 53 28 4e  TO tlog VALUES(N
3990: 55 4c 4c 2c 20 0a 09 6f 6c 64 2e 61 2c 20 6f 6c  ULL, ..old.a, ol
39a0: 64 2e 62 2c 20 6f 6c 64 2e 63 2c 20 6f 6c 64 2e  d.b, old.c, old.
39b0: 64 2c 20 6e 65 77 2e 61 2c 20 6e 65 77 2e 62 2c  d, new.a, new.b,
39c0: 20 6e 65 77 2e 63 2c 20 6e 65 77 2e 64 29 3b 0a   new.c, new.d);.
39d0: 20 20 45 4e 44 3b 0a 20 20 43 52 45 41 54 45 20    END;.  CREATE 
39e0: 54 52 49 47 47 45 52 20 61 66 74 65 72 5f 75 70  TRIGGER after_up
39f0: 64 61 74 65 20 49 4e 53 54 45 41 44 20 4f 46 20  date INSTEAD OF 
3a00: 55 50 44 41 54 45 20 4f 4e 20 61 62 63 64 20 42  UPDATE ON abcd B
3a10: 45 47 49 4e 0a 20 20 20 20 49 4e 53 45 52 54 20  EGIN.    INSERT 
3a20: 49 4e 54 4f 20 74 6c 6f 67 20 56 41 4c 55 45 53  INTO tlog VALUES
3a30: 28 4e 55 4c 4c 2c 20 0a 09 6f 6c 64 2e 61 2c 20  (NULL, ..old.a, 
3a40: 6f 6c 64 2e 62 2c 20 6f 6c 64 2e 63 2c 20 6f 6c  old.b, old.c, ol
3a50: 64 2e 64 2c 20 6e 65 77 2e 61 2c 20 6e 65 77 2e  d.d, new.a, new.
3a60: 62 2c 20 6e 65 77 2e 63 2c 20 6e 65 77 2e 64 29  b, new.c, new.d)
3a70: 3b 0a 20 20 45 4e 44 3b 0a 0a 20 20 43 52 45 41  ;.  END;..  CREA
3a80: 54 45 20 54 52 49 47 47 45 52 20 62 65 66 6f 72  TE TRIGGER befor
3a90: 65 5f 64 65 6c 65 74 65 20 49 4e 53 54 45 41 44  e_delete INSTEAD
3aa0: 20 4f 46 20 44 45 4c 45 54 45 20 4f 4e 20 61 62   OF DELETE ON ab
3ab0: 63 64 20 42 45 47 49 4e 0a 20 20 20 20 49 4e 53  cd BEGIN.    INS
3ac0: 45 52 54 20 49 4e 54 4f 20 74 6c 6f 67 20 56 41  ERT INTO tlog VA
3ad0: 4c 55 45 53 28 4e 55 4c 4c 2c 20 0a 09 6f 6c 64  LUES(NULL, ..old
3ae0: 2e 61 2c 20 6f 6c 64 2e 62 2c 20 6f 6c 64 2e 63  .a, old.b, old.c
3af0: 2c 20 6f 6c 64 2e 64 2c 20 30 2c 20 30 2c 20 30  , old.d, 0, 0, 0
3b00: 2c 20 30 29 3b 0a 20 20 45 4e 44 3b 0a 20 20 43  , 0);.  END;.  C
3b10: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 61 66  REATE TRIGGER af
3b20: 74 65 72 5f 64 65 6c 65 74 65 20 49 4e 53 54 45  ter_delete INSTE
3b30: 41 44 20 4f 46 20 44 45 4c 45 54 45 20 4f 4e 20  AD OF DELETE ON 
3b40: 61 62 63 64 20 42 45 47 49 4e 0a 20 20 20 20 49  abcd BEGIN.    I
3b50: 4e 53 45 52 54 20 49 4e 54 4f 20 74 6c 6f 67 20  NSERT INTO tlog 
3b60: 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 0a 09 6f  VALUES(NULL, ..o
3b70: 6c 64 2e 61 2c 20 6f 6c 64 2e 62 2c 20 6f 6c 64  ld.a, old.b, old
3b80: 2e 63 2c 20 6f 6c 64 2e 64 2c 20 30 2c 20 30 2c  .c, old.d, 0, 0,
3b90: 20 30 2c 20 30 29 3b 0a 20 20 45 4e 44 3b 0a 0a   0, 0);.  END;..
3ba0: 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52    CREATE TRIGGER
3bb0: 20 62 65 66 6f 72 65 5f 69 6e 73 65 72 74 20 49   before_insert I
3bc0: 4e 53 54 45 41 44 20 4f 46 20 49 4e 53 45 52 54  NSTEAD OF INSERT
3bd0: 20 4f 4e 20 61 62 63 64 20 42 45 47 49 4e 0a 20   ON abcd BEGIN. 
3be0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
3bf0: 6c 6f 67 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c  log VALUES(NULL,
3c00: 20 0a 09 30 2c 20 30 2c 20 30 2c 20 30 2c 20 6e   ..0, 0, 0, 0, n
3c10: 65 77 2e 61 2c 20 6e 65 77 2e 62 2c 20 6e 65 77  ew.a, new.b, new
3c20: 2e 63 2c 20 6e 65 77 2e 64 29 3b 0a 20 20 45 4e  .c, new.d);.  EN
3c30: 44 3b 0a 20 20 20 43 52 45 41 54 45 20 54 52 49  D;.   CREATE TRI
3c40: 47 47 45 52 20 61 66 74 65 72 5f 69 6e 73 65 72  GGER after_inser
3c50: 74 20 49 4e 53 54 45 41 44 20 4f 46 20 49 4e 53  t INSTEAD OF INS
3c60: 45 52 54 20 4f 4e 20 61 62 63 64 20 42 45 47 49  ERT ON abcd BEGI
3c70: 4e 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  N.    INSERT INT
3c80: 4f 20 74 6c 6f 67 20 56 41 4c 55 45 53 28 4e 55  O tlog VALUES(NU
3c90: 4c 4c 2c 20 0a 09 30 2c 20 30 2c 20 30 2c 20 30  LL, ..0, 0, 0, 0
3ca0: 2c 20 6e 65 77 2e 61 2c 20 6e 65 77 2e 62 2c 20  , new.a, new.b, 
3cb0: 6e 65 77 2e 63 2c 20 6e 65 77 2e 64 29 3b 0a 20  new.c, new.d);. 
3cc0: 20 20 45 4e 44 3b 0a 20 20 7d 0a 7d 20 7b 7d 3b    END;.  }.} {};
3cd0: 0a 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65  ..do_test trigge
3ce0: 72 32 2d 37 2e 32 20 7b 0a 20 20 65 78 65 63 73  r2-7.2 {.  execs
3cf0: 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20  ql {.    UPDATE 
3d00: 61 62 63 64 20 53 45 54 20 61 20 3d 20 31 30 30  abcd SET a = 100
3d10: 2c 20 62 20 3d 20 35 2a 35 20 57 48 45 52 45 20  , b = 5*5 WHERE 
3d20: 61 20 3d 20 31 3b 0a 20 20 20 20 44 45 4c 45 54  a = 1;.    DELET
3d30: 45 20 46 52 4f 4d 20 61 62 63 64 20 57 48 45 52  E FROM abcd WHER
3d40: 45 20 61 20 3d 20 31 3b 0a 20 20 20 20 49 4e 53  E a = 1;.    INS
3d50: 45 52 54 20 49 4e 54 4f 20 61 62 63 64 20 56 41  ERT INTO abcd VA
3d60: 4c 55 45 53 28 31 30 2c 20 32 30 2c 20 33 30 2c  LUES(10, 20, 30,
3d70: 20 34 30 29 3b 0a 20 20 20 20 53 45 4c 45 43 54   40);.    SELECT
3d80: 20 2a 20 46 52 4f 4d 20 74 6c 6f 67 3b 0a 20 20   * FROM tlog;.  
3d90: 7d 0a 7d 20 5b 20 6c 69 73 74 20 31 20 31 20 32  }.} [ list 1 1 2
3da0: 20 33 20 34 20 31 30 30 20 32 35 20 33 20 34 20   3 4 100 25 3 4 
3db0: 5c 0a 20 20 20 20 20 20 20 20 20 32 20 31 20 32  \.         2 1 2
3dc0: 20 33 20 34 20 31 30 30 20 32 35 20 33 20 34 20   3 4 100 25 3 4 
3dd0: 5c 0a 09 20 33 20 31 20 32 20 33 20 34 20 30 20  \.. 3 1 2 3 4 0 
3de0: 30 20 30 20 30 20 5c 0a 09 20 34 20 31 20 32 20  0 0 0 \.. 4 1 2 
3df0: 33 20 34 20 30 20 30 20 30 20 30 20 5c 0a 09 20  3 4 0 0 0 0 \.. 
3e00: 35 20 30 20 30 20 30 20 30 20 31 30 20 32 30 20  5 0 0 0 0 10 20 
3e10: 33 30 20 34 30 20 5c 0a 09 20 36 20 30 20 30 20  30 40 \.. 6 0 0 
3e20: 30 20 30 20 31 30 20 32 30 20 33 30 20 34 30 20  0 0 10 20 30 40 
3e30: 5d 0a 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67  ]..do_test trigg
3e40: 65 72 32 2d 37 2e 33 20 7b 0a 20 20 65 78 65 63  er2-7.3 {.  exec
3e50: 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45  sql {.    DELETE
3e60: 20 46 52 4f 4d 20 74 6c 6f 67 3b 0a 20 20 20 20   FROM tlog;.    
3e70: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63 64  INSERT INTO abcd
3e80: 20 56 41 4c 55 45 53 28 31 30 2c 20 32 30 2c 20   VALUES(10, 20, 
3e90: 33 30 2c 20 34 30 29 3b 0a 20 20 20 20 55 50 44  30, 40);.    UPD
3ea0: 41 54 45 20 61 62 63 64 20 53 45 54 20 61 20 3d  ATE abcd SET a =
3eb0: 20 31 30 30 2c 20 62 20 3d 20 35 2a 35 20 57 48   100, b = 5*5 WH
3ec0: 45 52 45 20 61 20 3d 20 31 3b 0a 20 20 20 20 44  ERE a = 1;.    D
3ed0: 45 4c 45 54 45 20 46 52 4f 4d 20 61 62 63 64 20  ELETE FROM abcd 
3ee0: 57 48 45 52 45 20 61 20 3d 20 31 3b 0a 20 20 20  WHERE a = 1;.   
3ef0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
3f00: 6c 6f 67 3b 0a 20 20 7d 0a 7d 20 5b 20 6c 69 73  log;.  }.} [ lis
3f10: 74 20 5c 0a 20 20 20 31 20 30 20 30 20 30 20 30  t \.   1 0 0 0 0
3f20: 20 31 30 20 32 30 20 33 30 20 34 30 20 5c 0a 20   10 20 30 40 \. 
3f30: 20 20 32 20 30 20 30 20 30 20 30 20 31 30 20 32    2 0 0 0 0 10 2
3f40: 30 20 33 30 20 34 30 20 5c 0a 20 20 20 33 20 31  0 30 40 \.   3 1
3f50: 20 32 20 33 20 34 20 31 30 30 20 32 35 20 33 20   2 3 4 100 25 3 
3f60: 34 20 5c 0a 20 20 20 34 20 31 20 32 20 33 20 34  4 \.   4 1 2 3 4
3f70: 20 31 30 30 20 32 35 20 33 20 34 20 5c 0a 20 20   100 25 3 4 \.  
3f80: 20 35 20 31 20 32 20 33 20 34 20 30 20 30 20 30   5 1 2 3 4 0 0 0
3f90: 20 30 20 5c 0a 20 20 20 36 20 31 20 32 20 33 20   0 \.   6 1 2 3 
3fa0: 34 20 30 20 30 20 30 20 30 20 5c 0a 5d 0a 64 6f  4 0 0 0 0 \.].do
3fb0: 5f 74 65 73 74 20 74 72 69 67 67 65 72 32 2d 37  _test trigger2-7
3fc0: 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .4 {.  execsql {
3fd0: 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  .    DELETE FROM
3fe0: 20 74 6c 6f 67 3b 0a 20 20 20 20 44 45 4c 45 54   tlog;.    DELET
3ff0: 45 20 46 52 4f 4d 20 61 62 63 64 20 57 48 45 52  E FROM abcd WHER
4000: 45 20 61 20 3d 20 31 3b 0a 20 20 20 20 49 4e 53  E a = 1;.    INS
4010: 45 52 54 20 49 4e 54 4f 20 61 62 63 64 20 56 41  ERT INTO abcd VA
4020: 4c 55 45 53 28 31 30 2c 20 32 30 2c 20 33 30 2c  LUES(10, 20, 30,
4030: 20 34 30 29 3b 0a 20 20 20 20 55 50 44 41 54 45   40);.    UPDATE
4040: 20 61 62 63 64 20 53 45 54 20 61 20 3d 20 31 30   abcd SET a = 10
4050: 30 2c 20 62 20 3d 20 35 2a 35 20 57 48 45 52 45  0, b = 5*5 WHERE
4060: 20 61 20 3d 20 31 3b 0a 20 20 20 20 53 45 4c 45   a = 1;.    SELE
4070: 43 54 20 2a 20 46 52 4f 4d 20 74 6c 6f 67 3b 0a  CT * FROM tlog;.
4080: 20 20 7d 0a 7d 20 5b 20 6c 69 73 74 20 5c 0a 20    }.} [ list \. 
4090: 20 20 31 20 31 20 32 20 33 20 34 20 30 20 30 20    1 1 2 3 4 0 0 
40a0: 30 20 30 20 5c 0a 20 20 20 32 20 31 20 32 20 33  0 0 \.   2 1 2 3
40b0: 20 34 20 30 20 30 20 30 20 30 20 5c 0a 20 20 20   4 0 0 0 0 \.   
40c0: 33 20 30 20 30 20 30 20 30 20 31 30 20 32 30 20  3 0 0 0 0 10 20 
40d0: 33 30 20 34 30 20 5c 0a 20 20 20 34 20 30 20 30  30 40 \.   4 0 0
40e0: 20 30 20 30 20 31 30 20 32 30 20 33 30 20 34 30   0 0 10 20 30 40
40f0: 20 5c 0a 20 20 20 35 20 31 20 32 20 33 20 34 20   \.   5 1 2 3 4 
4100: 31 30 30 20 32 35 20 33 20 34 20 5c 0a 20 20 20  100 25 3 4 \.   
4110: 36 20 31 20 32 20 33 20 34 20 31 30 30 20 32 35  6 1 2 3 4 100 25
4120: 20 33 20 34 20 5c 0a 5d 0a 0a 64 6f 5f 74 65 73   3 4 \.]..do_tes
4130: 74 20 74 72 69 67 67 65 72 32 2d 38 2e 31 20 7b  t trigger2-8.1 {
4140: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
4150: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
4160: 28 61 2c 62 2c 63 29 3b 0a 20 20 20 20 49 4e 53  (a,b,c);.    INS
4170: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
4180: 45 53 28 31 2c 32 2c 33 29 3b 0a 20 20 20 20 43  ES(1,2,3);.    C
4190: 52 45 41 54 45 20 56 49 45 57 20 76 31 20 41 53  REATE VIEW v1 AS
41a0: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b  .      SELECT a+
41b0: 62 20 41 53 20 78 2c 20 62 2b 63 20 41 53 20 79  b AS x, b+c AS y
41c0: 2c 20 61 2b 63 20 41 53 20 7a 20 46 52 4f 4d 20  , a+c AS z FROM 
41d0: 74 31 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  t1;.    SELECT *
41e0: 20 46 52 4f 4d 20 76 31 3b 0a 20 20 7d 0a 7d 20   FROM v1;.  }.} 
41f0: 7b 33 20 35 20 34 7d 0a 64 6f 5f 74 65 73 74 20  {3 5 4}.do_test 
4200: 74 72 69 67 67 65 72 32 2d 38 2e 32 20 7b 0a 20  trigger2-8.2 {. 
4210: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
4220: 52 45 41 54 45 20 54 41 42 4c 45 20 76 31 6c 6f  REATE TABLE v1lo
4230: 67 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 3b 0a  g(a,b,c,d,e,f);.
4240: 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47      CREATE TRIGG
4250: 45 52 20 72 31 20 49 4e 53 54 45 41 44 20 4f 46  ER r1 INSTEAD OF
4260: 20 44 45 4c 45 54 45 20 4f 4e 20 76 31 20 42 45   DELETE ON v1 BE
4270: 47 49 4e 0a 20 20 20 20 20 20 49 4e 53 45 52 54  GIN.      INSERT
4280: 20 49 4e 54 4f 20 76 31 6c 6f 67 20 56 41 4c 55   INTO v1log VALU
4290: 45 53 28 4f 4c 44 2e 78 2c 4e 55 4c 4c 2c 4f 4c  ES(OLD.x,NULL,OL
42a0: 44 2e 79 2c 4e 55 4c 4c 2c 4f 4c 44 2e 7a 2c 4e  D.y,NULL,OLD.z,N
42b0: 55 4c 4c 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20  ULL);.    END;. 
42c0: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 76     DELETE FROM v
42d0: 31 20 57 48 45 52 45 20 78 3d 31 3b 0a 20 20 20  1 WHERE x=1;.   
42e0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 76   SELECT * FROM v
42f0: 31 6c 6f 67 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  1log;.  }.} {}.d
4300: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 32 2d  o_test trigger2-
4310: 38 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  8.3 {.  execsql 
4320: 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  {.    DELETE FRO
4330: 4d 20 76 31 20 57 48 45 52 45 20 78 3d 33 3b 0a  M v1 WHERE x=3;.
4340: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
4350: 4d 20 76 31 6c 6f 67 3b 0a 20 20 7d 0a 7d 20 7b  M v1log;.  }.} {
4360: 33 20 7b 7d 20 35 20 7b 7d 20 34 20 7b 7d 7d 0a  3 {} 5 {} 4 {}}.
4370: 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 32  do_test trigger2
4380: 2d 38 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c  -8.4 {.  execsql
4390: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
43a0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 34 2c 35  TO t1 VALUES(4,5
43b0: 2c 36 29 3b 0a 20 20 20 20 44 45 4c 45 54 45 20  ,6);.    DELETE 
43c0: 46 52 4f 4d 20 76 31 6c 6f 67 3b 0a 20 20 20 20  FROM v1log;.    
43d0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 76 31 20 57  DELETE FROM v1 W
43e0: 48 45 52 45 20 79 3d 31 31 3b 0a 20 20 20 20 53  HERE y=11;.    S
43f0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 76 31 6c  ELECT * FROM v1l
4400: 6f 67 3b 0a 20 20 7d 0a 7d 20 7b 39 20 7b 7d 20  og;.  }.} {9 {} 
4410: 31 31 20 7b 7d 20 31 30 20 7b 7d 7d 0a 64 6f 5f  11 {} 10 {}}.do_
4420: 74 65 73 74 20 74 72 69 67 67 65 72 32 2d 38 2e  test trigger2-8.
4430: 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  5 {.  execsql {.
4440: 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47      CREATE TRIGG
4450: 45 52 20 72 32 20 49 4e 53 54 45 41 44 20 4f 46  ER r2 INSTEAD OF
4460: 20 49 4e 53 45 52 54 20 4f 4e 20 76 31 20 42 45   INSERT ON v1 BE
4470: 47 49 4e 0a 20 20 20 20 20 20 49 4e 53 45 52 54  GIN.      INSERT
4480: 20 49 4e 54 4f 20 76 31 6c 6f 67 20 56 41 4c 55   INTO v1log VALU
4490: 45 53 28 4e 55 4c 4c 2c 4e 45 57 2e 78 2c 4e 55  ES(NULL,NEW.x,NU
44a0: 4c 4c 2c 4e 45 57 2e 79 2c 4e 55 4c 4c 2c 4e 45  LL,NEW.y,NULL,NE
44b0: 57 2e 7a 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20  W.z);.    END;. 
44c0: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 76     DELETE FROM v
44d0: 31 6c 6f 67 3b 0a 20 20 20 20 49 4e 53 45 52 54  1log;.    INSERT
44e0: 20 49 4e 54 4f 20 76 31 20 56 41 4c 55 45 53 28   INTO v1 VALUES(
44f0: 31 2c 32 2c 33 29 3b 0a 20 20 20 20 53 45 4c 45  1,2,3);.    SELE
4500: 43 54 20 2a 20 46 52 4f 4d 20 76 31 6c 6f 67 3b  CT * FROM v1log;
4510: 0a 20 20 7d 0a 7d 20 7b 7b 7d 20 31 20 7b 7d 20  .  }.} {{} 1 {} 
4520: 32 20 7b 7d 20 33 7d 0a 64 6f 5f 74 65 73 74 20  2 {} 3}.do_test 
4530: 74 72 69 67 67 65 72 32 2d 38 2e 36 20 7b 0a 20  trigger2-8.6 {. 
4540: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
4550: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 72 33  REATE TRIGGER r3
4560: 20 49 4e 53 54 45 41 44 20 4f 46 20 55 50 44 41   INSTEAD OF UPDA
4570: 54 45 20 4f 4e 20 76 31 20 42 45 47 49 4e 0a 20  TE ON v1 BEGIN. 
4580: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
4590: 20 76 31 6c 6f 67 20 56 41 4c 55 45 53 28 4f 4c   v1log VALUES(OL
45a0: 44 2e 78 2c 4e 45 57 2e 78 2c 4f 4c 44 2e 79 2c  D.x,NEW.x,OLD.y,
45b0: 4e 45 57 2e 79 2c 4f 4c 44 2e 7a 2c 4e 45 57 2e  NEW.y,OLD.z,NEW.
45c0: 7a 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 20  z);.    END;.   
45d0: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 76 31 6c   DELETE FROM v1l
45e0: 6f 67 3b 0a 20 20 20 20 55 50 44 41 54 45 20 76  og;.    UPDATE v
45f0: 31 20 53 45 54 20 78 3d 78 2b 31 30 30 2c 20 79  1 SET x=x+100, y
4600: 3d 79 2b 32 30 30 2c 20 7a 3d 7a 2b 33 30 30 3b  =y+200, z=z+300;
4610: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
4620: 4f 4d 20 76 31 6c 6f 67 3b 0a 20 20 7d 0a 7d 20  OM v1log;.  }.} 
4630: 7b 33 20 31 30 33 20 35 20 32 30 35 20 34 20 33  {3 103 5 205 4 3
4640: 30 34 20 39 20 31 30 39 20 31 31 20 32 31 31 20  04 9 109 11 211 
4650: 31 30 20 33 31 30 7d 0a 0a 69 6e 74 65 67 72 69  10 310}..integri
4660: 74 79 5f 63 68 65 63 6b 20 74 72 69 67 67 65 72  ty_check trigger
4670: 32 2d 39 2e 39 0a 0a 66 69 6e 69 73 68 5f 74 65  2-9.9..finish_te
4680: 73 74 0a                                         st.