/ Hex Artifact Content
Login

Artifact c12759a0d7ba6488d9d24c96a1352ddee995c1ab:


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 2d 31 2e 31 2e 2a 3a 20 4f 4e 20 55  trig-1.1.*: ON U
0250: 50 44 41 54 45 20 74 72 69 67 67 65 72 20 65 78  PDATE trigger ex
0260: 65 63 75 74 69 6f 6e 20 6d 6f 64 65 6c 2e 0a 23  ecution model..#
0270: 20 74 72 69 67 2d 31 2e 32 2e 2a 3a 20 44 45 4c   trig-1.2.*: DEL
0280: 45 54 45 20 74 72 69 67 67 65 72 20 65 78 65 63  ETE trigger exec
0290: 75 74 69 6f 6e 20 6d 6f 64 65 6c 2e 0a 23 20 74  ution model..# t
02a0: 72 69 67 2d 31 2e 33 2e 2a 3a 20 49 4e 53 45 52  rig-1.3.*: INSER
02b0: 54 20 74 72 69 67 67 65 72 20 65 78 65 63 75 74  T trigger execut
02c0: 69 6f 6e 20 6d 6f 64 65 6c 2e 0a 23 0a 23 20 32  ion model..#.# 2
02d0: 2e 20 54 72 69 67 67 65 72 20 70 72 6f 67 72 61  . Trigger progra
02e0: 6d 20 65 78 65 63 75 74 69 6f 6e 20 74 65 73 74  m execution test
02f0: 73 2e 0a 23 20 54 68 65 73 65 20 74 65 73 74 73  s..# These tests
0300: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 72 69   ensure that tri
0310: 67 67 65 72 20 70 72 6f 67 72 61 6d 73 20 65 78  gger programs ex
0320: 65 63 75 74 65 20 63 6f 72 72 65 63 74 6c 79 20  ecute correctly 
0330: 28 69 65 2e 20 74 68 61 74 20 61 0a 23 20 74 72  (ie. that a.# tr
0340: 69 67 67 65 72 20 70 72 6f 67 72 61 6d 20 63 61  igger program ca
0350: 6e 20 63 6f 72 72 65 63 74 6c 79 20 65 78 65 63  n correctly exec
0360: 75 74 65 20 49 4e 53 45 52 54 2c 20 55 50 44 41  ute INSERT, UPDA
0370: 54 45 2c 20 44 45 4c 45 54 45 20 2a 20 53 45 4c  TE, DELETE * SEL
0380: 45 43 54 0a 23 20 73 74 61 74 65 6d 65 6e 74 73  ECT.# statements
0390: 2c 20 61 6e 64 20 63 6f 6d 62 69 6e 61 74 69 6f  , and combinatio
03a0: 6e 73 20 74 68 65 72 65 6f 66 29 2e 0a 23 0a 23  ns thereof)..#.#
03b0: 20 33 2e 20 53 65 6c 65 63 74 69 76 65 20 74 72   3. Selective tr
03c0: 69 67 67 65 72 20 65 78 65 63 75 74 69 6f 6e 20  igger execution 
03d0: 0a 23 20 54 68 69 73 20 74 65 73 74 73 20 74 68  .# This tests th
03e0: 61 74 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 74  at conditional t
03f0: 72 69 67 67 65 72 73 20 28 69 65 2e 20 55 50 44  riggers (ie. UPD
0400: 41 54 45 20 4f 46 20 74 72 69 67 67 65 72 73 20  ATE OF triggers 
0410: 61 6e 64 20 74 72 69 67 67 65 72 73 0a 23 20 77  and triggers.# w
0420: 69 74 68 20 57 48 45 4e 20 63 6c 61 75 73 65 73  ith WHEN clauses
0430: 29 20 61 72 65 20 66 69 72 65 64 20 6f 6e 6c 79  ) are fired only
0440: 20 66 69 72 65 64 20 77 68 65 6e 20 74 68 65 79   fired when they
0450: 20 61 72 65 20 73 75 70 70 6f 73 65 64 20 74 6f   are supposed to
0460: 20 62 65 2e 0a 23 0a 23 20 74 72 69 67 2d 33 2e   be..#.# trig-3.
0470: 31 3a 20 55 50 44 41 54 45 20 4f 46 20 74 72 69  1: UPDATE OF tri
0480: 67 67 65 72 73 0a 23 20 74 72 69 67 2d 33 2e 32  ggers.# trig-3.2
0490: 3a 20 57 48 45 4e 20 63 6c 61 75 73 65 0a 23 0a  : WHEN clause.#.
04a0: 23 20 34 2e 20 43 61 73 63 61 64 65 64 20 74 72  # 4. Cascaded tr
04b0: 69 67 67 65 72 20 65 78 65 63 75 74 69 6f 6e 20  igger execution 
04c0: 0a 23 20 54 65 73 74 73 20 74 68 61 74 20 74 72  .# Tests that tr
04d0: 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 73 20 6d  igger-programs m
04e0: 61 79 20 63 61 75 73 65 20 6f 74 68 65 72 20 74  ay cause other t
04f0: 72 69 67 67 65 72 73 20 74 6f 20 66 69 72 65 2e  riggers to fire.
0500: 20 41 6c 73 6f 20 74 68 61 74 20 61 20 0a 23 20   Also that a .# 
0510: 74 72 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 20  trigger-program 
0520: 69 73 20 6e 65 76 65 72 20 65 78 65 63 75 74 65  is never execute
0530: 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e 0a 23  d recursively..#
0540: 20 0a 23 20 74 72 69 67 2d 34 2e 31 3a 20 54 72   .# trig-4.1: Tr
0550: 69 76 69 61 6c 20 63 61 73 63 61 64 69 6e 67 20  ivial cascading 
0560: 74 72 69 67 67 65 72 0a 23 20 74 72 69 67 2d 34  trigger.# trig-4
0570: 2e 32 3a 20 54 72 69 76 69 61 6c 20 72 65 63 75  .2: Trivial recu
0580: 72 73 69 76 65 20 74 72 69 67 67 65 72 20 68 61  rsive trigger ha
0590: 6e 64 6c 69 6e 67 20 0a 23 0a 23 20 35 2e 20 43  ndling .#.# 5. C
05a0: 6f 75 6e 74 20 63 68 61 6e 67 65 73 20 62 65 68  ount changes beh
05b0: 61 76 69 6f 75 72 2e 0a 23 20 56 65 72 69 66 79  aviour..# Verify
05c0: 20 74 68 61 74 20 72 6f 77 73 20 61 6c 74 65 72   that rows alter
05d0: 65 64 20 62 79 20 74 72 69 67 67 65 72 73 20 61  ed by triggers a
05e0: 72 65 20 6e 6f 74 20 69 6e 63 6c 75 64 65 64 20  re not included 
05f0: 69 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  in the return va
0600: 6c 75 65 0a 23 20 6f 66 20 74 68 65 20 22 63 6f  lue.# of the "co
0610: 75 6e 74 20 63 68 61 6e 67 65 73 22 20 69 6e 74  unt changes" int
0620: 65 72 66 61 63 65 2e 0a 23 0a 23 20 36 2e 20 4f  erface..#.# 6. O
0630: 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73  N CONFLICT claus
0640: 65 20 68 61 6e 64 6c 69 6e 67 0a 23 20 74 72 69  e handling.# tri
0650: 67 2d 36 2e 31 5b 61 2d 66 5d 3a 20 49 4e 53 45  g-6.1[a-f]: INSE
0660: 52 54 20 73 74 61 74 65 6d 65 6e 74 73 0a 23 20  RT statements.# 
0670: 74 72 69 67 2d 36 2e 32 5b 61 2d 66 5d 3a 20 55  trig-6.2[a-f]: U
0680: 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73  PDATE statements
0690: 0a 23 0a 23 20 37 2e 20 54 72 69 67 67 65 72 73  .#.# 7. Triggers
06a0: 20 6f 6e 20 76 69 65 77 73 20 66 69 72 65 20 63   on views fire c
06b0: 6f 72 72 65 63 74 6c 79 2e 0a 23 0a 0a 73 65 74  orrectly..#..set
06c0: 20 74 65 73 74 64 69 72 20 5b 66 69 6c 65 20 64   testdir [file d
06d0: 69 72 6e 61 6d 65 20 24 61 72 67 76 30 5d 0a 73  irname $argv0].s
06e0: 6f 75 72 63 65 20 24 74 65 73 74 64 69 72 2f 74  ource $testdir/t
06f0: 65 73 74 65 72 2e 74 63 6c 0a 0a 23 20 31 2e 0a  ester.tcl..# 1..
0700: 73 65 74 20 69 69 20 30 0a 66 6f 72 65 61 63 68  set ii 0.foreach
0710: 20 74 62 6c 5f 64 65 66 6e 20 5b 20 6c 69 73 74   tbl_defn [ list
0720: 20 5c 0a 09 7b 43 52 45 41 54 45 20 54 41 42 4c   \..{CREATE TABL
0730: 45 20 74 62 6c 20 28 61 2c 20 62 29 3b 7d 20 5c  E tbl (a, b);} \
0740: 0a 09 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20  ..{CREATE TABLE 
0750: 74 62 6c 20 28 61 20 49 4e 54 45 47 45 52 20 50  tbl (a INTEGER P
0760: 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 7d  RIMARY KEY, b);}
0770: 20 5c 0a 20 20 20 20 20 20 20 20 7b 43 52 45 41   \.        {CREA
0780: 54 45 20 54 41 42 4c 45 20 74 62 6c 20 28 61 2c  TE TABLE tbl (a,
0790: 20 62 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b   b PRIMARY KEY);
07a0: 7d 20 5c 0a 09 7b 43 52 45 41 54 45 20 54 41 42  } \..{CREATE TAB
07b0: 4c 45 20 74 62 6c 20 28 61 2c 20 62 29 3b 20 43  LE tbl (a, b); C
07c0: 52 45 41 54 45 20 49 4e 44 45 58 20 74 62 6c 5f  REATE INDEX tbl_
07d0: 69 64 78 20 4f 4e 20 74 62 6c 28 62 29 3b 7d 20  idx ON tbl(b);} 
07e0: 5d 20 7b 0a 20 20 69 6e 63 72 20 69 69 0a 20 20  ] {.  incr ii.  
07f0: 63 61 74 63 68 73 71 6c 20 7b 20 44 52 4f 50 20  catchsql { DROP 
0800: 49 4e 44 45 58 20 74 62 6c 5f 69 64 78 3b 20 7d  INDEX tbl_idx; }
0810: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .  catchsql {.  
0820: 20 20 44 52 4f 50 20 54 41 42 4c 45 20 72 6c 6f    DROP TABLE rlo
0830: 67 3b 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c  g;.    DROP TABL
0840: 45 20 63 6c 6f 67 3b 0a 20 20 20 20 44 52 4f 50  E clog;.    DROP
0850: 20 54 41 42 4c 45 20 74 62 6c 3b 0a 20 20 20 20   TABLE tbl;.    
0860: 44 52 4f 50 20 54 41 42 4c 45 20 6f 74 68 65 72  DROP TABLE other
0870: 5f 74 62 6c 3b 0a 20 20 7d 0a 0a 20 20 65 78 65  _tbl;.  }..  exe
0880: 63 73 71 6c 20 24 74 62 6c 5f 64 65 66 6e 0a 0a  csql $tbl_defn..
0890: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
08a0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20  INSERT INTO tbl 
08b0: 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20  VALUES(1, 2);.  
08c0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62    INSERT INTO tb
08d0: 6c 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a  l VALUES(3, 4);.
08e0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
08f0: 45 20 72 6c 6f 67 20 28 69 64 78 2c 20 6f 6c 64  E rlog (idx, old
0900: 5f 61 2c 20 6f 6c 64 5f 62 2c 20 64 62 5f 73 75  _a, old_b, db_su
0910: 6d 5f 61 2c 20 64 62 5f 73 75 6d 5f 62 2c 20 6e  m_a, db_sum_b, n
0920: 65 77 5f 61 2c 20 6e 65 77 5f 62 29 3b 0a 20 20  ew_a, new_b);.  
0930: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
0940: 6c 6f 67 20 28 69 64 78 2c 20 6f 6c 64 5f 61 2c  log (idx, old_a,
0950: 20 6f 6c 64 5f 62 2c 20 64 62 5f 73 75 6d 5f 61   old_b, db_sum_a
0960: 2c 20 64 62 5f 73 75 6d 5f 62 2c 20 6e 65 77 5f  , db_sum_b, new_
0970: 61 2c 20 6e 65 77 5f 62 29 3b 0a 0a 20 20 20 20  a, new_b);..    
0980: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 62  CREATE TRIGGER b
0990: 65 66 6f 72 65 5f 75 70 64 61 74 65 5f 72 6f 77  efore_update_row
09a0: 20 42 45 46 4f 52 45 20 55 50 44 41 54 45 20 4f   BEFORE UPDATE O
09b0: 4e 20 74 62 6c 20 46 4f 52 20 45 41 43 48 20 52  N tbl FOR EACH R
09c0: 4f 57 20 0a 20 20 20 20 20 20 42 45 47 49 4e 0a  OW .      BEGIN.
09d0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
09e0: 4f 20 72 6c 6f 67 20 56 41 4c 55 45 53 20 28 20  O rlog VALUES ( 
09f0: 28 53 45 4c 45 43 54 20 63 6f 61 6c 65 73 63 65  (SELECT coalesce
0a00: 28 6d 61 78 28 69 64 78 29 2c 30 29 20 2b 20 31  (max(idx),0) + 1
0a10: 20 46 52 4f 4d 20 72 6c 6f 67 29 2c 20 0a 09 20   FROM rlog), .. 
0a20: 20 6f 6c 64 2e 61 2c 20 6f 6c 64 2e 62 2c 20 0a   old.a, old.b, .
0a30: 09 20 20 28 53 45 4c 45 43 54 20 73 75 6d 28 61  .  (SELECT sum(a
0a40: 29 20 46 52 4f 4d 20 74 62 6c 29 2c 20 28 53 45  ) FROM tbl), (SE
0a50: 4c 45 43 54 20 73 75 6d 28 62 29 20 46 52 4f 4d  LECT sum(b) FROM
0a60: 20 74 62 6c 29 2c 20 0a 09 20 20 6e 65 77 2e 61   tbl), ..  new.a
0a70: 2c 20 6e 65 77 2e 62 29 3b 0a 20 20 20 20 45 4e  , new.b);.    EN
0a80: 44 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54  D;..    CREATE T
0a90: 52 49 47 47 45 52 20 61 66 74 65 72 5f 75 70 64  RIGGER after_upd
0aa0: 61 74 65 5f 72 6f 77 20 41 46 54 45 52 20 55 50  ate_row AFTER UP
0ab0: 44 41 54 45 20 4f 4e 20 74 62 6c 20 46 4f 52 20  DATE ON tbl FOR 
0ac0: 45 41 43 48 20 52 4f 57 20 0a 20 20 20 20 20 20  EACH ROW .      
0ad0: 42 45 47 49 4e 0a 20 20 20 20 20 20 49 4e 53 45  BEGIN.      INSE
0ae0: 52 54 20 49 4e 54 4f 20 72 6c 6f 67 20 56 41 4c  RT INTO rlog VAL
0af0: 55 45 53 20 28 20 28 53 45 4c 45 43 54 20 63 6f  UES ( (SELECT co
0b00: 61 6c 65 73 63 65 28 6d 61 78 28 69 64 78 29 2c  alesce(max(idx),
0b10: 30 29 20 2b 20 31 20 46 52 4f 4d 20 72 6c 6f 67  0) + 1 FROM rlog
0b20: 29 2c 20 0a 09 20 20 6f 6c 64 2e 61 2c 20 6f 6c  ), ..  old.a, ol
0b30: 64 2e 62 2c 20 0a 09 20 20 28 53 45 4c 45 43 54  d.b, ..  (SELECT
0b40: 20 73 75 6d 28 61 29 20 46 52 4f 4d 20 74 62 6c   sum(a) FROM tbl
0b50: 29 2c 20 28 53 45 4c 45 43 54 20 73 75 6d 28 62  ), (SELECT sum(b
0b60: 29 20 46 52 4f 4d 20 74 62 6c 29 2c 20 0a 09 20  ) FROM tbl), .. 
0b70: 20 6e 65 77 2e 61 2c 20 6e 65 77 2e 62 29 3b 0a   new.a, new.b);.
0b80: 20 20 20 20 45 4e 44 3b 0a 0a 20 20 20 20 43 52      END;..    CR
0b90: 45 41 54 45 20 54 52 49 47 47 45 52 20 63 6f 6e  EATE TRIGGER con
0ba0: 64 69 74 69 6f 6e 61 6c 5f 75 70 64 61 74 65 5f  ditional_update_
0bb0: 72 6f 77 20 41 46 54 45 52 20 55 50 44 41 54 45  row AFTER UPDATE
0bc0: 20 4f 4e 20 74 62 6c 20 46 4f 52 20 45 41 43 48   ON tbl FOR EACH
0bd0: 20 52 4f 57 0a 20 20 20 20 20 20 57 48 45 4e 20   ROW.      WHEN 
0be0: 6f 6c 64 2e 61 20 3d 20 31 0a 20 20 20 20 20 20  old.a = 1.      
0bf0: 42 45 47 49 4e 0a 20 20 20 20 20 20 49 4e 53 45  BEGIN.      INSE
0c00: 52 54 20 49 4e 54 4f 20 63 6c 6f 67 20 56 41 4c  RT INTO clog VAL
0c10: 55 45 53 20 28 20 28 53 45 4c 45 43 54 20 63 6f  UES ( (SELECT co
0c20: 61 6c 65 73 63 65 28 6d 61 78 28 69 64 78 29 2c  alesce(max(idx),
0c30: 30 29 20 2b 20 31 20 46 52 4f 4d 20 63 6c 6f 67  0) + 1 FROM clog
0c40: 29 2c 20 0a 09 20 20 6f 6c 64 2e 61 2c 20 6f 6c  ), ..  old.a, ol
0c50: 64 2e 62 2c 20 0a 09 20 20 28 53 45 4c 45 43 54  d.b, ..  (SELECT
0c60: 20 73 75 6d 28 61 29 20 46 52 4f 4d 20 74 62 6c   sum(a) FROM tbl
0c70: 29 2c 20 28 53 45 4c 45 43 54 20 73 75 6d 28 62  ), (SELECT sum(b
0c80: 29 20 46 52 4f 4d 20 74 62 6c 29 2c 20 0a 09 20  ) FROM tbl), .. 
0c90: 20 6e 65 77 2e 61 2c 20 6e 65 77 2e 62 29 3b 0a   new.a, new.b);.
0ca0: 20 20 20 20 45 4e 44 3b 0a 20 20 7d 0a 0a 20 20      END;.  }..  
0cb0: 64 6f 5f 74 65 73 74 20 74 72 69 67 2d 31 2e 31  do_test trig-1.1
0cc0: 2e 24 69 69 20 7b 0a 20 20 20 20 65 78 65 63 73  .$ii {.    execs
0cd0: 71 6c 20 7b 0a 20 20 20 20 20 20 55 50 44 41 54  ql {.      UPDAT
0ce0: 45 20 74 62 6c 20 53 45 54 20 61 20 3d 20 61 20  E tbl SET a = a 
0cf0: 2a 20 31 30 2c 20 62 20 3d 20 62 20 2a 20 31 30  * 10, b = b * 10
0d00: 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  ;.      SELECT *
0d10: 20 46 52 4f 4d 20 72 6c 6f 67 20 4f 52 44 45 52   FROM rlog ORDER
0d20: 20 42 59 20 69 64 78 3b 0a 20 20 20 20 20 20 53   BY idx;.      S
0d30: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 6c 6f  ELECT * FROM clo
0d40: 67 20 4f 52 44 45 52 20 42 59 20 69 64 78 3b 0a  g ORDER BY idx;.
0d50: 20 20 20 20 7d 0a 20 20 7d 20 5b 6c 69 73 74 20      }.  } [list 
0d60: 31 20 31 20 32 20 20 34 20 20 36 20 31 30 20 32  1 1 2  4  6 10 2
0d70: 30 20 5c 0a 20 20 20 20 20 20 20 20 20 20 32 20  0 \.          2 
0d80: 31 20 32 20 31 33 20 32 34 20 31 30 20 32 30 20  1 2 13 24 10 20 
0d90: 5c 0a 09 20 20 33 20 33 20 34 20 31 33 20 32 34  \..  3 3 4 13 24
0da0: 20 33 30 20 34 30 20 5c 0a 09 20 20 34 20 33 20   30 40 \..  4 3 
0db0: 34 20 34 30 20 36 30 20 33 30 20 34 30 20 5c 0a  4 40 60 30 40 \.
0dc0: 20 20 20 20 20 20 20 20 20 20 31 20 31 20 32 20            1 1 2 
0dd0: 31 33 20 32 34 20 31 30 20 32 30 20 5d 0a 20 20  13 24 10 20 ].  
0de0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
0df0: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 72 6c 6f   DELETE FROM rlo
0e00: 67 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52  g;.    DELETE FR
0e10: 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 49 4e 53 45  OM tbl;.    INSE
0e20: 52 54 20 49 4e 54 4f 20 74 62 6c 20 56 41 4c 55  RT INTO tbl VALU
0e30: 45 53 20 28 31 30 30 2c 20 31 30 30 29 3b 0a 20  ES (100, 100);. 
0e40: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
0e50: 62 6c 20 56 41 4c 55 45 53 20 28 33 30 30 2c 20  bl VALUES (300, 
0e60: 32 30 30 29 3b 0a 20 20 20 20 43 52 45 41 54 45  200);.    CREATE
0e70: 20 54 52 49 47 47 45 52 20 64 65 6c 65 74 65 5f   TRIGGER delete_
0e80: 62 65 66 6f 72 65 5f 72 6f 77 20 42 45 46 4f 52  before_row BEFOR
0e90: 45 20 44 45 4c 45 54 45 20 4f 4e 20 74 62 6c 20  E DELETE ON tbl 
0ea0: 46 4f 52 20 45 41 43 48 20 52 4f 57 0a 20 20 20  FOR EACH ROW.   
0eb0: 20 20 20 42 45 47 49 4e 0a 20 20 20 20 20 20 49     BEGIN.      I
0ec0: 4e 53 45 52 54 20 49 4e 54 4f 20 72 6c 6f 67 20  NSERT INTO rlog 
0ed0: 56 41 4c 55 45 53 20 28 20 28 53 45 4c 45 43 54  VALUES ( (SELECT
0ee0: 20 63 6f 61 6c 65 73 63 65 28 6d 61 78 28 69 64   coalesce(max(id
0ef0: 78 29 2c 30 29 20 2b 20 31 20 46 52 4f 4d 20 72  x),0) + 1 FROM r
0f00: 6c 6f 67 29 2c 20 0a 09 20 20 6f 6c 64 2e 61 2c  log), ..  old.a,
0f10: 20 6f 6c 64 2e 62 2c 20 0a 09 20 20 28 53 45 4c   old.b, ..  (SEL
0f20: 45 43 54 20 73 75 6d 28 61 29 20 46 52 4f 4d 20  ECT sum(a) FROM 
0f30: 74 62 6c 29 2c 20 28 53 45 4c 45 43 54 20 73 75  tbl), (SELECT su
0f40: 6d 28 62 29 20 46 52 4f 4d 20 74 62 6c 29 2c 20  m(b) FROM tbl), 
0f50: 0a 09 20 20 30 2c 20 30 29 3b 0a 20 20 20 20 45  ..  0, 0);.    E
0f60: 4e 44 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20  ND;..    CREATE 
0f70: 54 52 49 47 47 45 52 20 64 65 6c 65 74 65 5f 61  TRIGGER delete_a
0f80: 66 74 65 72 5f 72 6f 77 20 41 46 54 45 52 20 44  fter_row AFTER D
0f90: 45 4c 45 54 45 20 4f 4e 20 74 62 6c 20 46 4f 52  ELETE ON tbl FOR
0fa0: 20 45 41 43 48 20 52 4f 57 0a 20 20 20 20 20 20   EACH ROW.      
0fb0: 42 45 47 49 4e 0a 20 20 20 20 20 20 49 4e 53 45  BEGIN.      INSE
0fc0: 52 54 20 49 4e 54 4f 20 72 6c 6f 67 20 56 41 4c  RT INTO rlog VAL
0fd0: 55 45 53 20 28 20 28 53 45 4c 45 43 54 20 63 6f  UES ( (SELECT co
0fe0: 61 6c 65 73 63 65 28 6d 61 78 28 69 64 78 29 2c  alesce(max(idx),
0ff0: 30 29 20 2b 20 31 20 46 52 4f 4d 20 72 6c 6f 67  0) + 1 FROM rlog
1000: 29 2c 20 0a 09 20 20 6f 6c 64 2e 61 2c 20 6f 6c  ), ..  old.a, ol
1010: 64 2e 62 2c 20 0a 09 20 20 28 53 45 4c 45 43 54  d.b, ..  (SELECT
1020: 20 73 75 6d 28 61 29 20 46 52 4f 4d 20 74 62 6c   sum(a) FROM tbl
1030: 29 2c 20 28 53 45 4c 45 43 54 20 73 75 6d 28 62  ), (SELECT sum(b
1040: 29 20 46 52 4f 4d 20 74 62 6c 29 2c 20 0a 09 20  ) FROM tbl), .. 
1050: 20 30 2c 20 30 29 3b 0a 20 20 20 20 45 4e 44 3b   0, 0);.    END;
1060: 0a 20 20 7d 0a 20 20 64 6f 5f 74 65 73 74 20 74  .  }.  do_test t
1070: 72 69 67 2d 31 2e 32 2e 24 69 69 20 7b 0a 20 20  rig-1.2.$ii {.  
1080: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
1090: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 62    DELETE FROM tb
10a0: 6c 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  l;.      SELECT 
10b0: 2a 20 46 52 4f 4d 20 72 6c 6f 67 3b 0a 20 20 20  * FROM rlog;.   
10c0: 20 7d 0a 20 20 7d 20 5b 6c 69 73 74 20 31 20 31   }.  } [list 1 1
10d0: 30 30 20 31 30 30 20 34 30 30 20 33 30 30 20 30  00 100 400 300 0
10e0: 20 30 20 5c 0a 20 20 20 20 20 20 20 20 20 20 32   0 \.          2
10f0: 20 31 30 30 20 31 30 30 20 33 30 30 20 32 30 30   100 100 300 200
1100: 20 30 20 30 20 5c 0a 20 20 20 20 20 20 20 20 20   0 0 \.         
1110: 20 33 20 33 30 30 20 32 30 30 20 33 30 30 20 32   3 300 200 300 2
1120: 30 30 20 30 20 30 20 5c 0a 20 20 20 20 20 20 20  00 0 0 \.       
1130: 20 20 20 34 20 33 30 30 20 32 30 30 20 30 20 30     4 300 200 0 0
1140: 20 30 20 30 20 5d 0a 0a 20 20 65 78 65 63 73 71   0 0 ]..  execsq
1150: 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46  l {.    DELETE F
1160: 52 4f 4d 20 72 6c 6f 67 3b 0a 20 20 20 20 43 52  ROM rlog;.    CR
1170: 45 41 54 45 20 54 52 49 47 47 45 52 20 69 6e 73  EATE TRIGGER ins
1180: 65 72 74 5f 62 65 66 6f 72 65 5f 72 6f 77 20 42  ert_before_row B
1190: 45 46 4f 52 45 20 49 4e 53 45 52 54 20 4f 4e 20  EFORE INSERT ON 
11a0: 74 62 6c 20 46 4f 52 20 45 41 43 48 20 52 4f 57  tbl FOR EACH ROW
11b0: 0a 20 20 20 20 20 20 42 45 47 49 4e 0a 20 20 20  .      BEGIN.   
11c0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 72     INSERT INTO r
11d0: 6c 6f 67 20 56 41 4c 55 45 53 20 28 20 28 53 45  log VALUES ( (SE
11e0: 4c 45 43 54 20 63 6f 61 6c 65 73 63 65 28 6d 61  LECT coalesce(ma
11f0: 78 28 69 64 78 29 2c 30 29 20 2b 20 31 20 46 52  x(idx),0) + 1 FR
1200: 4f 4d 20 72 6c 6f 67 29 2c 20 0a 09 20 20 30 2c  OM rlog), ..  0,
1210: 20 30 2c 0a 09 20 20 28 53 45 4c 45 43 54 20 73   0,..  (SELECT s
1220: 75 6d 28 61 29 20 46 52 4f 4d 20 74 62 6c 29 2c  um(a) FROM tbl),
1230: 20 28 53 45 4c 45 43 54 20 73 75 6d 28 62 29 20   (SELECT sum(b) 
1240: 46 52 4f 4d 20 74 62 6c 29 2c 20 0a 09 20 20 6e  FROM tbl), ..  n
1250: 65 77 2e 61 2c 20 6e 65 77 2e 62 29 3b 0a 20 20  ew.a, new.b);.  
1260: 20 20 45 4e 44 3b 0a 0a 20 20 20 20 43 52 45 41    END;..    CREA
1270: 54 45 20 54 52 49 47 47 45 52 20 69 6e 73 65 72  TE TRIGGER inser
1280: 74 5f 61 66 74 65 72 5f 72 6f 77 20 41 46 54 45  t_after_row AFTE
1290: 52 20 49 4e 53 45 52 54 20 4f 4e 20 74 62 6c 20  R INSERT ON tbl 
12a0: 46 4f 52 20 45 41 43 48 20 52 4f 57 0a 20 20 20  FOR EACH ROW.   
12b0: 20 20 20 42 45 47 49 4e 0a 20 20 20 20 20 20 49     BEGIN.      I
12c0: 4e 53 45 52 54 20 49 4e 54 4f 20 72 6c 6f 67 20  NSERT INTO rlog 
12d0: 56 41 4c 55 45 53 20 28 20 28 53 45 4c 45 43 54  VALUES ( (SELECT
12e0: 20 63 6f 61 6c 65 73 63 65 28 6d 61 78 28 69 64   coalesce(max(id
12f0: 78 29 2c 30 29 20 2b 20 31 20 46 52 4f 4d 20 72  x),0) + 1 FROM r
1300: 6c 6f 67 29 2c 20 0a 09 20 20 30 2c 20 30 2c 0a  log), ..  0, 0,.
1310: 09 20 20 28 53 45 4c 45 43 54 20 73 75 6d 28 61  .  (SELECT sum(a
1320: 29 20 46 52 4f 4d 20 74 62 6c 29 2c 20 28 53 45  ) FROM tbl), (SE
1330: 4c 45 43 54 20 73 75 6d 28 62 29 20 46 52 4f 4d  LECT sum(b) FROM
1340: 20 74 62 6c 29 2c 20 0a 09 20 20 6e 65 77 2e 61   tbl), ..  new.a
1350: 2c 20 6e 65 77 2e 62 29 3b 0a 20 20 20 20 45 4e  , new.b);.    EN
1360: 44 3b 0a 20 20 7d 0a 20 20 64 6f 5f 74 65 73 74  D;.  }.  do_test
1370: 20 74 72 69 67 2d 31 2e 33 2e 24 69 69 20 7b 0a   trig-1.3.$ii {.
1380: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 0a 20      execsql {.. 
1390: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
13a0: 45 20 6f 74 68 65 72 5f 74 62 6c 28 61 2c 20 62  E other_tbl(a, b
13b0: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
13c0: 49 4e 54 4f 20 6f 74 68 65 72 5f 74 62 6c 20 56  INTO other_tbl V
13d0: 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20  ALUES(1, 2);.   
13e0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6f     INSERT INTO o
13f0: 74 68 65 72 5f 74 62 6c 20 56 41 4c 55 45 53 28  ther_tbl VALUES(
1400: 33 2c 20 34 29 3b 0a 20 20 20 20 20 20 2d 2d 20  3, 4);.      -- 
1410: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20  INSERT INTO tbl 
1420: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f 74  SELECT * FROM ot
1430: 68 65 72 5f 74 62 6c 3b 0a 20 20 20 20 20 20 49  her_tbl;.      I
1440: 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 56  NSERT INTO tbl V
1450: 41 4c 55 45 53 28 35 2c 20 36 29 3b 0a 20 20 20  ALUES(5, 6);.   
1460: 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 6f 74     DROP TABLE ot
1470: 68 65 72 5f 74 62 6c 3b 0a 0a 20 20 20 20 20 20  her_tbl;..      
1480: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 72 6c  SELECT * FROM rl
1490: 6f 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 5b 6c  og;.    }.  } [l
14a0: 69 73 74 20 31 20 30 20 30 20 30 20 30 20 35 20  ist 1 0 0 0 0 5 
14b0: 36 20 5c 0a 20 20 20 20 20 20 20 20 20 20 32 20  6 \.          2 
14c0: 30 20 30 20 35 20 36 20 35 20 36 20 5d 0a 7d 0a  0 0 5 6 5 6 ].}.
14d0: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 44 52 4f  catchsql {.  DRO
14e0: 50 20 54 41 42 4c 45 20 72 6c 6f 67 3b 0a 20 20  P TABLE rlog;.  
14f0: 44 52 4f 50 20 54 41 42 4c 45 20 63 6c 6f 67 3b  DROP TABLE clog;
1500: 0a 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74 62  .  DROP TABLE tb
1510: 6c 3b 0a 20 20 44 52 4f 50 20 54 41 42 4c 45 20  l;.  DROP TABLE 
1520: 6f 74 68 65 72 5f 74 62 6c 3b 0a 7d 0a 0a 23 20  other_tbl;.}..# 
1530: 32 2e 0a 73 65 74 20 69 69 20 30 0a 66 6f 72 65  2..set ii 0.fore
1540: 61 63 68 20 74 72 5f 70 72 6f 67 72 61 6d 20 5b  ach tr_program [
1550: 20 6c 69 73 74 20 5c 0a 20 20 20 7b 55 50 44 41   list \.   {UPDA
1560: 54 45 20 74 62 6c 20 53 45 54 20 62 20 3d 20 6f  TE tbl SET b = o
1570: 6c 64 2e 62 3b 7d 20 5c 0a 20 20 7b 49 4e 53 45  ld.b;} \.  {INSE
1580: 52 54 20 49 4e 54 4f 20 6c 6f 67 20 56 41 4c 55  RT INTO log VALU
1590: 45 53 28 6e 65 77 2e 63 2c 20 32 2c 20 33 29 3b  ES(new.c, 2, 3);
15a0: 7d 20 5c 0a 20 20 7b 44 45 4c 45 54 45 20 46 52  } \.  {DELETE FR
15b0: 4f 4d 20 6c 6f 67 20 57 48 45 52 45 20 61 20 3d  OM log WHERE a =
15c0: 20 31 3b 7d 20 5c 0a 20 20 7b 49 4e 53 45 52 54   1;} \.  {INSERT
15d0: 20 49 4e 54 4f 20 74 62 6c 20 56 41 4c 55 45 53   INTO tbl VALUES
15e0: 28 35 30 30 2c 20 6e 65 77 2e 62 20 2a 20 31 30  (500, new.b * 10
15f0: 2c 20 37 30 30 29 3b 20 0a 20 20 20 20 55 50 44  , 700); .    UPD
1600: 41 54 45 20 74 62 6c 20 53 45 54 20 63 20 3d 20  ATE tbl SET c = 
1610: 6f 6c 64 2e 63 3b 20 0a 20 20 20 20 44 45 4c 45  old.c; .    DELE
1620: 54 45 20 46 52 4f 4d 20 6c 6f 67 3b 7d 20 5c 0a  TE FROM log;} \.
1630: 20 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c    {INSERT INTO l
1640: 6f 67 20 73 65 6c 65 63 74 20 2a 20 66 72 6f 6d  og select * from
1650: 20 74 62 6c 3b 7d 20 0a 20 20 20 5d 20 5c 0a 7b   tbl;} .   ] \.{
1660: 0a 20 20 66 6f 72 65 61 63 68 20 74 65 73 74 5f  .  foreach test_
1670: 76 61 72 73 65 74 20 5b 20 6c 69 73 74 20 5c 0a  varset [ list \.
1680: 20 20 20 20 7b 0a 20 20 20 20 20 20 73 65 74 20      {.      set 
1690: 73 74 61 74 65 6d 65 6e 74 20 7b 55 50 44 41 54  statement {UPDAT
16a0: 45 20 74 62 6c 20 53 45 54 20 63 20 3d 20 31 30  E tbl SET c = 10
16b0: 20 57 48 45 52 45 20 61 20 3d 20 31 3b 7d 20 0a   WHERE a = 1;} .
16c0: 20 20 20 20 20 20 73 65 74 20 70 72 65 70 20 20        set prep  
16d0: 20 20 20 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f      {INSERT INTO
16e0: 20 74 62 6c 20 56 41 4c 55 45 53 28 31 2c 20 32   tbl VALUES(1, 2
16f0: 2c 20 33 29 3b 7d 0a 20 20 20 20 20 20 73 65 74  , 3);}.      set
1700: 20 6e 65 77 43 20 31 30 0a 20 20 20 20 20 20 73   newC 10.      s
1710: 65 74 20 6e 65 77 42 20 32 0a 20 20 20 20 20 20  et newB 2.      
1720: 73 65 74 20 6e 65 77 41 20 31 0a 20 20 20 20 20  set newA 1.     
1730: 20 73 65 74 20 6f 6c 64 41 20 31 0a 20 20 20 20   set oldA 1.    
1740: 20 20 73 65 74 20 6f 6c 64 42 20 32 0a 20 20 20    set oldB 2.   
1750: 20 20 20 73 65 74 20 6f 6c 64 43 20 33 0a 20 20     set oldC 3.  
1760: 20 20 7d 20 5c 0a 20 20 20 20 7b 0a 20 20 20 20    } \.    {.    
1770: 20 20 73 65 74 20 73 74 61 74 65 6d 65 6e 74 20    set statement 
1780: 7b 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 62 6c  {DELETE FROM tbl
1790: 20 57 48 45 52 45 20 61 20 3d 20 31 3b 7d 0a 20   WHERE a = 1;}. 
17a0: 20 20 20 20 20 73 65 74 20 70 72 65 70 20 20 20       set prep   
17b0: 20 20 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20     {INSERT INTO 
17c0: 74 62 6c 20 56 41 4c 55 45 53 28 31 2c 20 32 2c  tbl VALUES(1, 2,
17d0: 20 33 29 3b 7d 0a 20 20 20 20 20 20 73 65 74 20   3);}.      set 
17e0: 6f 6c 64 41 20 31 0a 20 20 20 20 20 20 73 65 74  oldA 1.      set
17f0: 20 6f 6c 64 42 20 32 0a 20 20 20 20 20 20 73 65   oldB 2.      se
1800: 74 20 6f 6c 64 43 20 33 0a 20 20 20 20 7d 20 5c  t oldC 3.    } \
1810: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 73 65 74  .    {.      set
1820: 20 73 74 61 74 65 6d 65 6e 74 20 7b 49 4e 53 45   statement {INSE
1830: 52 54 20 49 4e 54 4f 20 74 62 6c 20 56 41 4c 55  RT INTO tbl VALU
1840: 45 53 28 31 2c 20 32 2c 20 33 29 3b 7d 0a 20 20  ES(1, 2, 3);}.  
1850: 20 20 20 20 73 65 74 20 6e 65 77 41 20 31 0a 20      set newA 1. 
1860: 20 20 20 20 20 73 65 74 20 6e 65 77 42 20 32 0a       set newB 2.
1870: 20 20 20 20 20 20 73 65 74 20 6e 65 77 43 20 33        set newC 3
1880: 0a 20 20 20 20 7d 0a 20 20 5d 20 5c 0a 20 20 7b  .    }.  ] \.  {
1890: 0a 20 20 20 20 73 65 74 20 73 74 61 74 65 6d 65  .    set stateme
18a0: 6e 74 20 7b 7d 0a 20 20 20 20 73 65 74 20 70 72  nt {}.    set pr
18b0: 65 70 20 7b 7d 0a 20 20 20 20 73 65 74 20 6e 65  ep {}.    set ne
18c0: 77 41 20 7b 27 27 7d 0a 20 20 20 20 73 65 74 20  wA {''}.    set 
18d0: 6e 65 77 42 20 7b 27 27 7d 0a 20 20 20 20 73 65  newB {''}.    se
18e0: 74 20 6e 65 77 43 20 7b 27 27 7d 0a 20 20 20 20  t newC {''}.    
18f0: 73 65 74 20 6f 6c 64 41 20 7b 27 27 7d 0a 20 20  set oldA {''}.  
1900: 20 20 73 65 74 20 6f 6c 64 42 20 7b 27 27 7d 0a    set oldB {''}.
1910: 20 20 20 20 73 65 74 20 6f 6c 64 43 20 7b 27 27      set oldC {''
1920: 7d 0a 0a 20 20 20 20 69 6e 63 72 20 69 69 0a 0a  }..    incr ii..
1930: 20 20 20 20 65 76 61 6c 20 24 74 65 73 74 5f 76      eval $test_v
1940: 61 72 73 65 74 0a 0a 20 20 20 20 73 65 74 20 73  arset..    set s
1950: 74 61 74 65 6d 65 6e 74 5f 74 79 70 65 20 5b 73  tatement_type [s
1960: 74 72 69 6e 67 20 72 61 6e 67 65 20 24 73 74 61  tring range $sta
1970: 74 65 6d 65 6e 74 20 30 20 35 5d 0a 20 20 20 20  tement 0 5].    
1980: 73 65 74 20 74 72 5f 70 72 6f 67 72 61 6d 5f 66  set tr_program_f
1990: 69 78 65 64 20 24 74 72 5f 70 72 6f 67 72 61 6d  ixed $tr_program
19a0: 0a 20 20 20 20 69 66 20 7b 24 73 74 61 74 65 6d  .    if {$statem
19b0: 65 6e 74 5f 74 79 70 65 20 3d 3d 20 22 44 45 4c  ent_type == "DEL
19c0: 45 54 45 22 7d 20 7b 0a 20 20 20 20 20 20 72 65  ETE"} {.      re
19d0: 67 73 75 62 20 2d 61 6c 6c 20 6e 65 77 5c 2e 61  gsub -all new\.a
19e0: 20 24 74 72 5f 70 72 6f 67 72 61 6d 5f 66 69 78   $tr_program_fix
19f0: 65 64 20 7b 27 27 7d 20 74 72 5f 70 72 6f 67 72  ed {''} tr_progr
1a00: 61 6d 5f 66 69 78 65 64 20 0a 20 20 20 20 20 20  am_fixed .      
1a10: 72 65 67 73 75 62 20 2d 61 6c 6c 20 6e 65 77 5c  regsub -all new\
1a20: 2e 62 20 24 74 72 5f 70 72 6f 67 72 61 6d 5f 66  .b $tr_program_f
1a30: 69 78 65 64 20 7b 27 27 7d 20 74 72 5f 70 72 6f  ixed {''} tr_pro
1a40: 67 72 61 6d 5f 66 69 78 65 64 20 0a 20 20 20 20  gram_fixed .    
1a50: 20 20 72 65 67 73 75 62 20 2d 61 6c 6c 20 6e 65    regsub -all ne
1a60: 77 5c 2e 63 20 24 74 72 5f 70 72 6f 67 72 61 6d  w\.c $tr_program
1a70: 5f 66 69 78 65 64 20 7b 27 27 7d 20 74 72 5f 70  _fixed {''} tr_p
1a80: 72 6f 67 72 61 6d 5f 66 69 78 65 64 20 0a 20 20  rogram_fixed .  
1a90: 20 20 7d 0a 20 20 20 20 69 66 20 7b 24 73 74 61    }.    if {$sta
1aa0: 74 65 6d 65 6e 74 5f 74 79 70 65 20 3d 3d 20 22  tement_type == "
1ab0: 49 4e 53 45 52 54 22 7d 20 7b 0a 20 20 20 20 20  INSERT"} {.     
1ac0: 20 72 65 67 73 75 62 20 2d 61 6c 6c 20 6f 6c 64   regsub -all old
1ad0: 5c 2e 61 20 24 74 72 5f 70 72 6f 67 72 61 6d 5f  \.a $tr_program_
1ae0: 66 69 78 65 64 20 7b 27 27 7d 20 74 72 5f 70 72  fixed {''} tr_pr
1af0: 6f 67 72 61 6d 5f 66 69 78 65 64 20 0a 20 20 20  ogram_fixed .   
1b00: 20 20 20 72 65 67 73 75 62 20 2d 61 6c 6c 20 6f     regsub -all o
1b10: 6c 64 5c 2e 62 20 24 74 72 5f 70 72 6f 67 72 61  ld\.b $tr_progra
1b20: 6d 5f 66 69 78 65 64 20 7b 27 27 7d 20 74 72 5f  m_fixed {''} tr_
1b30: 70 72 6f 67 72 61 6d 5f 66 69 78 65 64 20 0a 20  program_fixed . 
1b40: 20 20 20 20 20 72 65 67 73 75 62 20 2d 61 6c 6c       regsub -all
1b50: 20 6f 6c 64 5c 2e 63 20 24 74 72 5f 70 72 6f 67   old\.c $tr_prog
1b60: 72 61 6d 5f 66 69 78 65 64 20 7b 27 27 7d 20 74  ram_fixed {''} t
1b70: 72 5f 70 72 6f 67 72 61 6d 5f 66 69 78 65 64 20  r_program_fixed 
1b80: 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 73 65 74  .    }...    set
1b90: 20 74 72 5f 70 72 6f 67 72 61 6d 5f 63 6f 6f 6b   tr_program_cook
1ba0: 65 64 20 24 74 72 5f 70 72 6f 67 72 61 6d 0a 20  ed $tr_program. 
1bb0: 20 20 20 72 65 67 73 75 62 20 2d 61 6c 6c 20 6e     regsub -all n
1bc0: 65 77 5c 2e 61 20 24 74 72 5f 70 72 6f 67 72 61  ew\.a $tr_progra
1bd0: 6d 5f 63 6f 6f 6b 65 64 20 24 6e 65 77 41 20 74  m_cooked $newA t
1be0: 72 5f 70 72 6f 67 72 61 6d 5f 63 6f 6f 6b 65 64  r_program_cooked
1bf0: 20 0a 20 20 20 20 72 65 67 73 75 62 20 2d 61 6c   .    regsub -al
1c00: 6c 20 6e 65 77 5c 2e 62 20 24 74 72 5f 70 72 6f  l new\.b $tr_pro
1c10: 67 72 61 6d 5f 63 6f 6f 6b 65 64 20 24 6e 65 77  gram_cooked $new
1c20: 42 20 74 72 5f 70 72 6f 67 72 61 6d 5f 63 6f 6f  B tr_program_coo
1c30: 6b 65 64 20 0a 20 20 20 20 72 65 67 73 75 62 20  ked .    regsub 
1c40: 2d 61 6c 6c 20 6e 65 77 5c 2e 63 20 24 74 72 5f  -all new\.c $tr_
1c50: 70 72 6f 67 72 61 6d 5f 63 6f 6f 6b 65 64 20 24  program_cooked $
1c60: 6e 65 77 43 20 74 72 5f 70 72 6f 67 72 61 6d 5f  newC tr_program_
1c70: 63 6f 6f 6b 65 64 20 0a 20 20 20 20 72 65 67 73  cooked .    regs
1c80: 75 62 20 2d 61 6c 6c 20 6f 6c 64 5c 2e 61 20 24  ub -all old\.a $
1c90: 74 72 5f 70 72 6f 67 72 61 6d 5f 63 6f 6f 6b 65  tr_program_cooke
1ca0: 64 20 24 6f 6c 64 41 20 74 72 5f 70 72 6f 67 72  d $oldA tr_progr
1cb0: 61 6d 5f 63 6f 6f 6b 65 64 20 0a 20 20 20 20 72  am_cooked .    r
1cc0: 65 67 73 75 62 20 2d 61 6c 6c 20 6f 6c 64 5c 2e  egsub -all old\.
1cd0: 62 20 24 74 72 5f 70 72 6f 67 72 61 6d 5f 63 6f  b $tr_program_co
1ce0: 6f 6b 65 64 20 24 6f 6c 64 42 20 74 72 5f 70 72  oked $oldB tr_pr
1cf0: 6f 67 72 61 6d 5f 63 6f 6f 6b 65 64 20 0a 20 20  ogram_cooked .  
1d00: 20 20 72 65 67 73 75 62 20 2d 61 6c 6c 20 6f 6c    regsub -all ol
1d10: 64 5c 2e 63 20 24 74 72 5f 70 72 6f 67 72 61 6d  d\.c $tr_program
1d20: 5f 63 6f 6f 6b 65 64 20 24 6f 6c 64 43 20 74 72  _cooked $oldC tr
1d30: 5f 70 72 6f 67 72 61 6d 5f 63 6f 6f 6b 65 64 20  _program_cooked 
1d40: 0a 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b  ..    catchsql {
1d50: 0a 20 20 20 20 20 20 44 52 4f 50 20 54 41 42 4c  .      DROP TABL
1d60: 45 20 74 62 6c 3b 0a 20 20 20 20 20 20 44 52 4f  E tbl;.      DRO
1d70: 50 20 54 41 42 4c 45 20 6c 6f 67 3b 0a 20 20 20  P TABLE log;.   
1d80: 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   }.    execsql {
1d90: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
1da0: 42 4c 45 20 74 62 6c 28 61 20 50 52 49 4d 41 52  BLE tbl(a PRIMAR
1db0: 59 20 4b 45 59 2c 20 62 2c 20 63 29 3b 0a 20 20  Y KEY, b, c);.  
1dc0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
1dd0: 20 6c 6f 67 28 61 2c 20 62 2c 20 63 29 3b 0a 20   log(a, b, c);. 
1de0: 20 20 20 7d 0a 0a 20 20 20 20 73 65 74 20 71 75     }..    set qu
1df0: 65 72 79 20 7b 53 45 4c 45 43 54 20 2a 20 46 52  ery {SELECT * FR
1e00: 4f 4d 20 74 62 6c 3b 20 53 45 4c 45 43 54 20 2a  OM tbl; SELECT *
1e10: 20 46 52 4f 4d 20 6c 6f 67 3b 7d 0a 20 20 20 20   FROM log;}.    
1e20: 73 65 74 20 70 72 65 70 20 22 24 70 72 65 70 3b  set prep "$prep;
1e30: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c 6f 67   INSERT INTO log
1e40: 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29   VALUES(1, 2, 3)
1e50: 3b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c 6f  ; INSERT INTO lo
1e60: 67 20 56 41 4c 55 45 53 28 31 30 2c 20 32 30 2c  g VALUES(10, 20,
1e70: 20 33 30 29 3b 22 0a 0a 23 20 43 68 65 63 6b 20   30);"..# Check 
1e80: 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 42 45 46  execution of BEF
1e90: 4f 52 45 20 70 72 6f 67 72 61 6d 73 3a 0a 0a 20  ORE programs:.. 
1ea0: 20 20 20 73 65 74 20 62 65 66 6f 72 65 5f 64 61     set before_da
1eb0: 74 61 20 5b 20 65 78 65 63 73 71 6c 20 22 24 70  ta [ execsql "$p
1ec0: 72 65 70 20 24 74 72 5f 70 72 6f 67 72 61 6d 5f  rep $tr_program_
1ed0: 63 6f 6f 6b 65 64 20 24 73 74 61 74 65 6d 65 6e  cooked $statemen
1ee0: 74 20 24 71 75 65 72 79 22 20 5d 0a 0a 20 20 20  t $query" ]..   
1ef0: 20 65 78 65 63 73 71 6c 20 22 44 45 4c 45 54 45   execsql "DELETE
1f00: 20 46 52 4f 4d 20 74 62 6c 3b 20 44 45 4c 45 54   FROM tbl; DELET
1f10: 45 20 46 52 4f 4d 20 6c 6f 67 3b 20 24 70 72 65  E FROM log; $pre
1f20: 70 22 3b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  p";.    execsql 
1f30: 22 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20  "CREATE TRIGGER 
1f40: 74 68 65 5f 74 72 69 67 67 65 72 20 42 45 46 4f  the_trigger BEFO
1f50: 52 45 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65  RE [string range
1f60: 20 24 73 74 61 74 65 6d 65 6e 74 20 30 20 36 5d   $statement 0 6]
1f70: 20 4f 4e 20 74 62 6c 20 42 45 47 49 4e 20 24 74   ON tbl BEGIN $t
1f80: 72 5f 70 72 6f 67 72 61 6d 5f 66 69 78 65 64 20  r_program_fixed 
1f90: 45 4e 44 3b 22 0a 0a 20 20 20 20 64 6f 5f 74 65  END;"..    do_te
1fa0: 73 74 20 74 72 69 67 2d 32 2d 24 69 69 2d 62 65  st trig-2-$ii-be
1fb0: 66 6f 72 65 20 22 65 78 65 63 73 71 6c 20 7b 24  fore "execsql {$
1fc0: 73 74 61 74 65 6d 65 6e 74 20 24 71 75 65 72 79  statement $query
1fd0: 7d 22 20 24 62 65 66 6f 72 65 5f 64 61 74 61 0a  }" $before_data.
1fe0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22 44 52  .    execsql "DR
1ff0: 4f 50 20 54 52 49 47 47 45 52 20 74 68 65 5f 74  OP TRIGGER the_t
2000: 72 69 67 67 65 72 3b 22 0a 20 20 20 20 65 78 65  rigger;".    exe
2010: 63 73 71 6c 20 22 44 45 4c 45 54 45 20 46 52 4f  csql "DELETE FRO
2020: 4d 20 74 62 6c 3b 20 44 45 4c 45 54 45 20 46 52  M tbl; DELETE FR
2030: 4f 4d 20 6c 6f 67 3b 22 0a 0a 23 20 43 68 65 63  OM log;"..# Chec
2040: 6b 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 41  k execution of A
2050: 46 54 45 52 20 70 72 6f 67 72 61 6d 73 0a 20 20  FTER programs.  
2060: 20 20 73 65 74 20 61 66 74 65 72 5f 64 61 74 61    set after_data
2070: 20 5b 20 65 78 65 63 73 71 6c 20 22 24 70 72 65   [ execsql "$pre
2080: 70 20 24 73 74 61 74 65 6d 65 6e 74 20 24 74 72  p $statement $tr
2090: 5f 70 72 6f 67 72 61 6d 5f 63 6f 6f 6b 65 64 20  _program_cooked 
20a0: 24 71 75 65 72 79 22 20 5d 0a 0a 20 20 20 20 65  $query" ]..    e
20b0: 78 65 63 73 71 6c 20 22 44 45 4c 45 54 45 20 46  xecsql "DELETE F
20c0: 52 4f 4d 20 74 62 6c 3b 20 44 45 4c 45 54 45 20  ROM tbl; DELETE 
20d0: 46 52 4f 4d 20 6c 6f 67 3b 20 24 70 72 65 70 22  FROM log; $prep"
20e0: 3b 0a 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22  ;..    execsql "
20f0: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74  CREATE TRIGGER t
2100: 68 65 5f 74 72 69 67 67 65 72 20 41 46 54 45 52  he_trigger AFTER
2110: 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24   [string range $
2120: 73 74 61 74 65 6d 65 6e 74 20 30 20 36 5d 20 4f  statement 0 6] O
2130: 4e 20 74 62 6c 20 42 45 47 49 4e 20 24 74 72 5f  N tbl BEGIN $tr_
2140: 70 72 6f 67 72 61 6d 5f 66 69 78 65 64 20 45 4e  program_fixed EN
2150: 44 3b 22 0a 0a 20 20 20 20 64 6f 5f 74 65 73 74  D;"..    do_test
2160: 20 74 72 69 67 2d 32 2d 24 69 69 2d 61 66 74 65   trig-2-$ii-afte
2170: 72 20 22 65 78 65 63 73 71 6c 20 7b 24 73 74 61  r "execsql {$sta
2180: 74 65 6d 65 6e 74 20 24 71 75 65 72 79 7d 22 20  tement $query}" 
2190: 24 61 66 74 65 72 5f 64 61 74 61 0a 20 20 20 20  $after_data.    
21a0: 65 78 65 63 73 71 6c 20 22 44 52 4f 50 20 54 52  execsql "DROP TR
21b0: 49 47 47 45 52 20 74 68 65 5f 74 72 69 67 67 65  IGGER the_trigge
21c0: 72 3b 22 0a 20 20 7d 0a 7d 0a 63 61 74 63 68 73  r;".  }.}.catchs
21d0: 71 6c 20 7b 0a 20 20 44 52 4f 50 20 54 41 42 4c  ql {.  DROP TABL
21e0: 45 20 74 62 6c 3b 0a 20 20 44 52 4f 50 20 54 41  E tbl;.  DROP TA
21f0: 42 4c 45 20 6c 6f 67 3b 0a 7d 0a 0a 23 20 33 2e  BLE log;.}..# 3.
2200: 0a 0a 23 20 74 72 69 67 2d 33 2e 31 3a 20 55 50  ..# trig-3.1: UP
2210: 44 41 54 45 20 4f 46 20 74 72 69 67 67 65 72 73  DATE OF triggers
2220: 0a 65 78 65 63 73 71 6c 20 7b 0a 20 20 43 52 45  .execsql {.  CRE
2230: 41 54 45 20 54 41 42 4c 45 20 74 62 6c 20 28 61  ATE TABLE tbl (a
2240: 2c 20 62 2c 20 63 2c 20 64 29 3b 0a 20 20 43 52  , b, c, d);.  CR
2250: 45 41 54 45 20 54 41 42 4c 45 20 6c 6f 67 20 28  EATE TABLE log (
2260: 61 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  a);.  INSERT INT
2270: 4f 20 6c 6f 67 20 56 41 4c 55 45 53 20 28 30 29  O log VALUES (0)
2280: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
2290: 74 62 6c 20 56 41 4c 55 45 53 20 28 30 2c 20 30  tbl VALUES (0, 0
22a0: 2c 20 30 2c 20 30 29 3b 0a 20 20 49 4e 53 45 52  , 0, 0);.  INSER
22b0: 54 20 49 4e 54 4f 20 74 62 6c 20 56 41 4c 55 45  T INTO tbl VALUE
22c0: 53 20 28 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  S (1, 0, 0, 0);.
22d0: 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52    CREATE TRIGGER
22e0: 20 74 62 6c 5f 61 66 74 65 72 5f 75 70 64 61 74   tbl_after_updat
22f0: 65 5f 63 64 20 42 45 46 4f 52 45 20 55 50 44 41  e_cd BEFORE UPDA
2300: 54 45 20 4f 46 20 63 2c 20 64 20 4f 4e 20 74 62  TE OF c, d ON tb
2310: 6c 0a 20 20 20 20 42 45 47 49 4e 0a 20 20 20 20  l.    BEGIN.    
2320: 20 20 55 50 44 41 54 45 20 6c 6f 67 20 53 45 54    UPDATE log SET
2330: 20 61 20 3d 20 61 20 2b 20 31 3b 0a 20 20 20 20   a = a + 1;.    
2340: 45 4e 44 3b 0a 7d 0a 64 6f 5f 74 65 73 74 20 74  END;.}.do_test t
2350: 72 69 67 2d 33 2e 31 20 7b 0a 20 20 65 78 65 63  rig-3.1 {.  exec
2360: 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45  sql {.    UPDATE
2370: 20 74 62 6c 20 53 45 54 20 62 20 3d 20 31 2c 20   tbl SET b = 1, 
2380: 63 20 3d 20 31 30 3b 20 2d 2d 20 32 0a 20 20 20  c = 10; -- 2.   
2390: 20 55 50 44 41 54 45 20 74 62 6c 20 53 45 54 20   UPDATE tbl SET 
23a0: 62 20 3d 20 31 30 3b 20 2d 2d 20 30 0a 20 20 20  b = 10; -- 0.   
23b0: 20 55 50 44 41 54 45 20 74 62 6c 20 53 45 54 20   UPDATE tbl SET 
23c0: 64 20 3d 20 34 20 57 48 45 52 45 20 61 20 3d 20  d = 4 WHERE a = 
23d0: 30 3b 20 2d 2d 31 0a 20 20 20 20 55 50 44 41 54  0; --1.    UPDAT
23e0: 45 20 74 62 6c 20 53 45 54 20 61 20 3d 20 34 2c  E tbl SET a = 4,
23f0: 20 62 20 3d 20 31 30 3b 20 2d 2d 30 0a 20 20 20   b = 10; --0.   
2400: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6c   SELECT * FROM l
2410: 6f 67 3b 0a 20 20 7d 0a 7d 20 7b 33 7d 0a 65 78  og;.  }.} {3}.ex
2420: 65 63 73 71 6c 20 7b 0a 20 20 44 52 4f 50 20 54  ecsql {.  DROP T
2430: 41 42 4c 45 20 74 62 6c 3b 0a 20 20 44 52 4f 50  ABLE tbl;.  DROP
2440: 20 54 41 42 4c 45 20 6c 6f 67 3b 0a 7d 0a 0a 23   TABLE log;.}..#
2450: 20 74 72 69 67 2d 33 2e 32 3a 20 57 48 45 4e 20   trig-3.2: WHEN 
2460: 63 6c 61 75 73 65 0a 73 65 74 20 77 68 65 6e 5f  clause.set when_
2470: 74 72 69 67 67 65 72 73 20 5b 20 6c 69 73 74 20  triggers [ list 
2480: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  \.             {
2490: 74 31 20 42 45 46 4f 52 45 20 49 4e 53 45 52 54  t1 BEFORE INSERT
24a0: 20 4f 4e 20 74 62 6c 20 57 48 45 4e 20 6e 65 77   ON tbl WHEN new
24b0: 2e 61 20 3e 20 32 30 7d 20 5c 0a 20 20 20 20 20  .a > 20} \.     
24c0: 20 20 20 20 20 20 20 20 7b 74 32 20 42 45 46 4f          {t2 BEFO
24d0: 52 45 20 49 4e 53 45 52 54 20 4f 4e 20 74 62 6c  RE INSERT ON tbl
24e0: 20 57 48 45 4e 20 28 53 45 4c 45 43 54 20 63 6f   WHEN (SELECT co
24f0: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 62 6c 29  unt(*) FROM tbl)
2500: 20 3d 20 30 7d 20 5d 0a 0a 65 78 65 63 73 71 6c   = 0} ]..execsql
2510: 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c   {.  CREATE TABL
2520: 45 20 74 62 6c 20 28 61 2c 20 62 2c 20 63 2c 20  E tbl (a, b, c, 
2530: 64 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42  d);.  CREATE TAB
2540: 4c 45 20 6c 6f 67 20 28 61 29 3b 0a 20 20 49 4e  LE log (a);.  IN
2550: 53 45 52 54 20 49 4e 54 4f 20 6c 6f 67 20 56 41  SERT INTO log VA
2560: 4c 55 45 53 20 28 30 29 3b 0a 7d 0a 0a 66 6f 72  LUES (0);.}..for
2570: 65 61 63 68 20 74 72 69 67 20 24 77 68 65 6e 5f  each trig $when_
2580: 74 72 69 67 67 65 72 73 20 7b 0a 20 20 65 78 65  triggers {.  exe
2590: 63 73 71 6c 20 22 43 52 45 41 54 45 20 54 52 49  csql "CREATE TRI
25a0: 47 47 45 52 20 24 74 72 69 67 20 42 45 47 49 4e  GGER $trig BEGIN
25b0: 20 55 50 44 41 54 45 20 6c 6f 67 20 73 65 74 20   UPDATE log set 
25c0: 61 20 3d 20 61 20 2b 20 31 3b 20 45 4e 44 3b 22  a = a + 1; END;"
25d0: 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 74 72 69 67  .}..do_test trig
25e0: 2d 33 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  -3.2 {.  execsql
25f0: 20 7b 20 0a 0a 20 20 20 20 49 4e 53 45 52 54 20   { ..    INSERT 
2600: 49 4e 54 4f 20 74 62 6c 20 56 41 4c 55 45 53 28  INTO tbl VALUES(
2610: 30 2c 20 30 2c 20 30 2c 20 30 29 3b 20 20 20 20  0, 0, 0, 0);    
2620: 20 2d 2d 20 31 0a 20 20 20 20 53 45 4c 45 43 54   -- 1.    SELECT
2630: 20 2a 20 46 52 4f 4d 20 6c 6f 67 3b 0a 20 20 20   * FROM log;.   
2640: 20 55 50 44 41 54 45 20 6c 6f 67 20 53 45 54 20   UPDATE log SET 
2650: 61 20 3d 20 30 3b 0a 0a 20 20 20 20 49 4e 53 45  a = 0;..    INSE
2660: 52 54 20 49 4e 54 4f 20 74 62 6c 20 56 41 4c 55  RT INTO tbl VALU
2670: 45 53 28 30 2c 20 30 2c 20 30 2c 20 30 29 3b 20  ES(0, 0, 0, 0); 
2680: 20 20 20 20 2d 2d 20 30 0a 20 20 20 20 53 45 4c      -- 0.    SEL
2690: 45 43 54 20 2a 20 46 52 4f 4d 20 6c 6f 67 3b 0a  ECT * FROM log;.
26a0: 20 20 20 20 55 50 44 41 54 45 20 6c 6f 67 20 53      UPDATE log S
26b0: 45 54 20 61 20 3d 20 30 3b 0a 0a 20 20 20 20 49  ET a = 0;..    I
26c0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 56  NSERT INTO tbl V
26d0: 41 4c 55 45 53 28 32 30 30 2c 20 30 2c 20 30 2c  ALUES(200, 0, 0,
26e0: 20 30 29 3b 20 20 20 20 20 2d 2d 20 31 0a 20 20   0);     -- 1.  
26f0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
2700: 6c 6f 67 3b 0a 20 20 20 20 55 50 44 41 54 45 20  log;.    UPDATE 
2710: 6c 6f 67 20 53 45 54 20 61 20 3d 20 30 3b 0a 20  log SET a = 0;. 
2720: 20 7d 0a 7d 20 7b 31 20 30 20 31 7d 0a 65 78 65   }.} {1 0 1}.exe
2730: 63 73 71 6c 20 7b 0a 20 20 44 52 4f 50 20 54 41  csql {.  DROP TA
2740: 42 4c 45 20 74 62 6c 3b 0a 20 20 44 52 4f 50 20  BLE tbl;.  DROP 
2750: 54 41 42 4c 45 20 6c 6f 67 3b 0a 7d 0a 0a 23 20  TABLE log;.}..# 
2760: 53 69 6d 70 6c 65 20 63 61 73 63 61 64 65 64 20  Simple cascaded 
2770: 74 72 69 67 67 65 72 0a 65 78 65 63 73 71 6c 20  trigger.execsql 
2780: 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  {.  CREATE TABLE
2790: 20 74 62 6c 41 28 61 2c 20 62 29 3b 0a 20 20 43   tblA(a, b);.  C
27a0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 62 6c 42  REATE TABLE tblB
27b0: 28 61 2c 20 62 29 3b 0a 20 20 43 52 45 41 54 45  (a, b);.  CREATE
27c0: 20 54 41 42 4c 45 20 74 62 6c 43 28 61 2c 20 62   TABLE tblC(a, b
27d0: 29 3b 0a 0a 20 20 43 52 45 41 54 45 20 54 52 49  );..  CREATE TRI
27e0: 47 47 45 52 20 74 72 31 20 42 45 46 4f 52 45 20  GGER tr1 BEFORE 
27f0: 49 4e 53 45 52 54 20 4f 4e 20 74 62 6c 41 20 42  INSERT ON tblA B
2800: 45 47 49 4e 0a 20 20 20 20 49 4e 53 45 52 54 20  EGIN.    INSERT 
2810: 49 4e 54 4f 20 74 62 6c 42 20 76 61 6c 75 65 73  INTO tblB values
2820: 28 6e 65 77 2e 61 2c 20 6e 65 77 2e 62 29 3b 0a  (new.a, new.b);.
2830: 20 20 45 4e 44 3b 0a 0a 20 20 43 52 45 41 54 45    END;..  CREATE
2840: 20 54 52 49 47 47 45 52 20 74 72 32 20 42 45 46   TRIGGER tr2 BEF
2850: 4f 52 45 20 49 4e 53 45 52 54 20 4f 4e 20 74 62  ORE INSERT ON tb
2860: 6c 42 20 42 45 47 49 4e 0a 20 20 20 20 49 4e 53  lB BEGIN.    INS
2870: 45 52 54 20 49 4e 54 4f 20 74 62 6c 43 20 76 61  ERT INTO tblC va
2880: 6c 75 65 73 28 6e 65 77 2e 61 2c 20 6e 65 77 2e  lues(new.a, new.
2890: 62 29 3b 0a 20 20 45 4e 44 3b 0a 7d 0a 64 6f 5f  b);.  END;.}.do_
28a0: 74 65 73 74 20 74 72 69 67 2d 34 2e 31 20 7b 0a  test trig-4.1 {.
28b0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
28c0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 41  INSERT INTO tblA
28d0: 20 76 61 6c 75 65 73 28 31 2c 20 32 29 3b 0a 20   values(1, 2);. 
28e0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
28f0: 20 74 62 6c 41 3b 0a 20 20 20 20 53 45 4c 45 43   tblA;.    SELEC
2900: 54 20 2a 20 46 52 4f 4d 20 74 62 6c 42 3b 0a 20  T * FROM tblB;. 
2910: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
2920: 20 74 62 6c 43 3b 0a 20 20 7d 0a 7d 20 7b 31 20   tblC;.  }.} {1 
2930: 32 20 31 20 32 20 31 20 32 7d 0a 65 78 65 63 73  2 1 2 1 2}.execs
2940: 71 6c 20 7b 0a 20 20 44 52 4f 50 20 54 41 42 4c  ql {.  DROP TABL
2950: 45 20 74 62 6c 41 3b 0a 20 20 44 52 4f 50 20 54  E tblA;.  DROP T
2960: 41 42 4c 45 20 74 62 6c 42 3b 0a 20 20 44 52 4f  ABLE tblB;.  DRO
2970: 50 20 54 41 42 4c 45 20 74 62 6c 43 3b 0a 7d 0a  P TABLE tblC;.}.
2980: 0a 23 20 53 69 6d 70 6c 65 20 72 65 63 75 72 73  .# Simple recurs
2990: 69 76 65 20 74 72 69 67 67 65 72 0a 65 78 65 63  ive trigger.exec
29a0: 73 71 6c 20 7b 0a 20 20 43 52 45 41 54 45 20 54  sql {.  CREATE T
29b0: 41 42 4c 45 20 74 62 6c 28 61 2c 20 62 2c 20 63  ABLE tbl(a, b, c
29c0: 29 3b 0a 20 20 43 52 45 41 54 45 20 54 52 49 47  );.  CREATE TRIG
29d0: 47 45 52 20 74 62 6c 5f 74 72 69 67 20 42 45 46  GER tbl_trig BEF
29e0: 4f 52 45 20 49 4e 53 45 52 54 20 4f 4e 20 74 62  ORE INSERT ON tb
29f0: 6c 20 0a 20 20 20 20 42 45 47 49 4e 0a 20 20 20  l .    BEGIN.   
2a00: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2a10: 62 6c 20 56 41 4c 55 45 53 20 28 6e 65 77 2e 61  bl VALUES (new.a
2a20: 2c 20 6e 65 77 2e 62 2c 20 6e 65 77 2e 63 29 3b  , new.b, new.c);
2a30: 0a 20 20 20 20 45 4e 44 3b 0a 7d 0a 64 6f 5f 74  .    END;.}.do_t
2a40: 65 73 74 20 74 72 69 67 2d 34 2e 32 20 7b 0a 20  est trig-4.2 {. 
2a50: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49   execsql {.    I
2a60: 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 56  NSERT INTO tbl V
2a70: 41 4c 55 45 53 20 28 31 2c 20 32 2c 20 33 29 3b  ALUES (1, 2, 3);
2a80: 0a 20 20 20 20 73 65 6c 65 63 74 20 2a 20 66 72  .    select * fr
2a90: 6f 6d 20 74 62 6c 3b 0a 20 20 7d 0a 7d 20 7b 31  om tbl;.  }.} {1
2aa0: 20 32 20 33 20 31 20 32 20 33 7d 0a 65 78 65 63   2 3 1 2 3}.exec
2ab0: 73 71 6c 20 7b 0a 20 20 44 52 4f 50 20 54 41 42  sql {.  DROP TAB
2ac0: 4c 45 20 74 62 6c 3b 0a 7d 0a 0a 23 20 35 2e 0a  LE tbl;.}..# 5..
2ad0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 43 52 45 41  execsql {.  CREA
2ae0: 54 45 20 54 41 42 4c 45 20 74 62 6c 28 61 2c 20  TE TABLE tbl(a, 
2af0: 62 2c 20 63 29 3b 0a 20 20 43 52 45 41 54 45 20  b, c);.  CREATE 
2b00: 54 52 49 47 47 45 52 20 74 62 6c 5f 74 72 69 67  TRIGGER tbl_trig
2b10: 20 42 45 46 4f 52 45 20 49 4e 53 45 52 54 20 4f   BEFORE INSERT O
2b20: 4e 20 74 62 6c 20 0a 20 20 20 20 42 45 47 49 4e  N tbl .    BEGIN
2b30: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
2b40: 54 4f 20 74 62 6c 20 56 41 4c 55 45 53 20 28 31  TO tbl VALUES (1
2b50: 2c 20 32 2c 20 33 29 3b 0a 20 20 20 20 20 20 49  , 2, 3);.      I
2b60: 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 56  NSERT INTO tbl V
2b70: 41 4c 55 45 53 20 28 32 2c 20 32 2c 20 33 29 3b  ALUES (2, 2, 3);
2b80: 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 74 62  .      UPDATE tb
2b90: 6c 20 73 65 74 20 62 20 3d 20 31 30 20 57 48 45  l set b = 10 WHE
2ba0: 52 45 20 61 20 3d 20 31 3b 0a 20 20 20 20 20 20  RE a = 1;.      
2bb0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 62 6c 20  DELETE FROM tbl 
2bc0: 57 48 45 52 45 20 61 20 3d 20 31 3b 0a 20 20 20  WHERE a = 1;.   
2bd0: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
2be0: 62 6c 3b 0a 20 20 20 20 45 4e 44 3b 0a 7d 0a 64  bl;.    END;.}.d
2bf0: 6f 5f 74 65 73 74 20 74 72 69 67 2d 35 20 7b 0a  o_test trig-5 {.
2c00: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
2c10: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20  INSERT INTO tbl 
2c20: 56 41 4c 55 45 53 28 31 30 30 2c 20 32 30 30 2c  VALUES(100, 200,
2c30: 20 33 30 30 29 3b 0a 20 20 7d 0a 20 20 64 62 20   300);.  }.  db 
2c40: 63 68 61 6e 67 65 73 0a 7d 20 7b 31 7d 0a 65 78  changes.} {1}.ex
2c50: 65 63 73 71 6c 20 7b 0a 20 20 44 52 4f 50 20 54  ecsql {.  DROP T
2c60: 41 42 4c 45 20 74 62 6c 3b 0a 7d 0a 0a 0a 23 20  ABLE tbl;.}...# 
2c70: 48 61 6e 64 6c 69 6e 67 20 6f 66 20 4f 4e 20 43  Handling of ON C
2c80: 4f 4e 46 4c 49 43 54 20 62 79 20 49 4e 53 45 52  ONFLICT by INSER
2c90: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73  T statements ins
2ca0: 69 64 65 20 74 72 69 67 67 65 72 73 0a 65 78 65  ide triggers.exe
2cb0: 63 73 71 6c 20 7b 0a 20 20 43 52 45 41 54 45 20  csql {.  CREATE 
2cc0: 54 41 42 4c 45 20 74 62 6c 20 28 61 20 70 72 69  TABLE tbl (a pri
2cd0: 6d 61 72 79 20 6b 65 79 2c 20 62 2c 20 63 29 3b  mary key, b, c);
2ce0: 0a 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45  .  CREATE TRIGGE
2cf0: 52 20 61 69 5f 74 62 6c 20 41 46 54 45 52 20 49  R ai_tbl AFTER I
2d00: 4e 53 45 52 54 20 4f 4e 20 74 62 6c 20 42 45 47  NSERT ON tbl BEG
2d10: 49 4e 0a 20 20 20 20 49 4e 53 45 52 54 20 4f 52  IN.    INSERT OR
2d20: 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20 74 62 6c   IGNORE INTO tbl
2d30: 20 76 61 6c 75 65 73 20 28 6e 65 77 2e 61 2c 20   values (new.a, 
2d40: 30 2c 20 30 29 3b 0a 20 20 45 4e 44 3b 0a 7d 0a  0, 0);.  END;.}.
2d50: 64 6f 5f 74 65 73 74 20 74 72 69 67 2d 36 2e 31  do_test trig-6.1
2d60: 61 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  a {.  execsql {.
2d70: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49      BEGIN;.    I
2d80: 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 76  NSERT INTO tbl v
2d90: 61 6c 75 65 73 20 28 31 2c 20 32 2c 20 33 29 3b  alues (1, 2, 3);
2da0: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 66 72  .    SELECT * fr
2db0: 6f 6d 20 74 62 6c 3b 0a 20 20 7d 0a 7d 20 7b 31  om tbl;.  }.} {1
2dc0: 20 32 20 33 7d 0a 64 6f 5f 74 65 73 74 20 74 72   2 3}.do_test tr
2dd0: 69 67 2d 36 2e 31 62 20 7b 0a 20 20 63 61 74 63  ig-6.1b {.  catc
2de0: 68 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52  hsql {.    INSER
2df0: 54 20 4f 52 20 41 42 4f 52 54 20 49 4e 54 4f 20  T OR ABORT INTO 
2e00: 74 62 6c 20 76 61 6c 75 65 73 20 28 32 2c 20 32  tbl values (2, 2
2e10: 2c 20 33 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b  , 3);.  }.} {1 {
2e20: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
2e30: 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67  d}}.do_test trig
2e40: 2d 36 2e 31 63 20 7b 0a 20 20 65 78 65 63 73 71  -6.1c {.  execsq
2e50: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  l {.    SELECT *
2e60: 20 66 72 6f 6d 20 74 62 6c 3b 0a 20 20 7d 0a 7d   from tbl;.  }.}
2e70: 20 7b 31 20 32 20 33 7d 0a 64 6f 5f 74 65 73 74   {1 2 3}.do_test
2e80: 20 74 72 69 67 2d 36 2e 31 64 20 7b 0a 20 20 63   trig-6.1d {.  c
2e90: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 49 4e  atchsql {.    IN
2ea0: 53 45 52 54 20 4f 52 20 46 41 49 4c 20 49 4e 54  SERT OR FAIL INT
2eb0: 4f 20 74 62 6c 20 76 61 6c 75 65 73 20 28 32 2c  O tbl values (2,
2ec0: 20 32 2c 20 33 29 3b 0a 20 20 7d 0a 7d 20 7b 31   2, 3);.  }.} {1
2ed0: 20 7b 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69   {constraint fai
2ee0: 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 72  led}}.do_test tr
2ef0: 69 67 2d 36 2e 31 65 20 7b 0a 20 20 65 78 65 63  ig-6.1e {.  exec
2f00: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
2f10: 20 2a 20 66 72 6f 6d 20 74 62 6c 3b 0a 20 20 7d   * from tbl;.  }
2f20: 0a 7d 20 7b 31 20 32 20 33 20 32 20 32 20 33 7d  .} {1 2 3 2 2 3}
2f30: 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 2d 36 2e  .do_test trig-6.
2f40: 31 66 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  1f {.  execsql {
2f50: 0a 20 20 20 20 49 4e 53 45 52 54 20 4f 52 20 52  .    INSERT OR R
2f60: 45 50 4c 41 43 45 20 49 4e 54 4f 20 74 62 6c 20  EPLACE INTO tbl 
2f70: 76 61 6c 75 65 73 20 28 32 2c 20 32 2c 20 33 29  values (2, 2, 3)
2f80: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 66  ;.    SELECT * f
2f90: 72 6f 6d 20 74 62 6c 3b 0a 20 20 7d 0a 7d 20 7b  rom tbl;.  }.} {
2fa0: 31 20 32 20 33 20 32 20 30 20 30 7d 0a 64 6f 5f  1 2 3 2 0 0}.do_
2fb0: 74 65 73 74 20 74 72 69 67 2d 36 2e 31 67 20 7b  test trig-6.1g {
2fc0: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .  catchsql {.  
2fd0: 20 20 49 4e 53 45 52 54 20 4f 52 20 52 4f 4c 4c    INSERT OR ROLL
2fe0: 42 41 43 4b 20 49 4e 54 4f 20 74 62 6c 20 76 61  BACK INTO tbl va
2ff0: 6c 75 65 73 20 28 33 2c 20 32 2c 20 33 29 3b 0a  lues (3, 2, 3);.
3000: 20 20 7d 0a 7d 20 7b 31 20 7b 63 6f 6e 73 74 72    }.} {1 {constr
3010: 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f  aint failed}}.do
3020: 5f 74 65 73 74 20 74 72 69 67 2d 36 2e 31 68 20  _test trig-6.1h 
3030: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
3040: 20 20 53 45 4c 45 43 54 20 2a 20 66 72 6f 6d 20    SELECT * from 
3050: 74 62 6c 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 0a  tbl;.  }.} {}...
3060: 23 20 48 61 6e 64 6c 69 6e 67 20 6f 66 20 4f 4e  # Handling of ON
3070: 20 43 4f 4e 46 4c 49 43 54 20 62 79 20 55 50 44   CONFLICT by UPD
3080: 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ATE statements i
3090: 6e 73 69 64 65 20 74 72 69 67 67 65 72 73 0a 65  nside triggers.e
30a0: 78 65 63 73 71 6c 20 7b 0a 20 20 49 4e 53 45 52  xecsql {.  INSER
30b0: 54 20 49 4e 54 4f 20 74 62 6c 20 76 61 6c 75 65  T INTO tbl value
30c0: 73 20 28 34 2c 20 32 2c 20 33 29 3b 0a 20 20 49  s (4, 2, 3);.  I
30d0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 76  NSERT INTO tbl v
30e0: 61 6c 75 65 73 20 28 36 2c 20 33 2c 20 34 29 3b  alues (6, 3, 4);
30f0: 0a 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45  .  CREATE TRIGGE
3100: 52 20 61 75 5f 74 62 6c 20 41 46 54 45 52 20 55  R au_tbl AFTER U
3110: 50 44 41 54 45 20 4f 4e 20 74 62 6c 20 42 45 47  PDATE ON tbl BEG
3120: 49 4e 0a 20 20 20 20 55 50 44 41 54 45 20 4f 52  IN.    UPDATE OR
3130: 20 49 47 4e 4f 52 45 20 74 62 6c 20 53 45 54 20   IGNORE tbl SET 
3140: 61 20 3d 20 6e 65 77 2e 61 2c 20 63 20 3d 20 31  a = new.a, c = 1
3150: 30 3b 0a 20 20 45 4e 44 3b 0a 7d 0a 64 6f 5f 74  0;.  END;.}.do_t
3160: 65 73 74 20 74 72 69 67 2d 36 2e 32 61 20 7b 0a  est trig-6.2a {.
3170: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
3180: 42 45 47 49 4e 3b 0a 20 20 20 20 55 50 44 41 54  BEGIN;.    UPDAT
3190: 45 20 74 62 6c 20 53 45 54 20 61 20 3d 20 31 20  E tbl SET a = 1 
31a0: 57 48 45 52 45 20 61 20 3d 20 34 3b 0a 20 20 20  WHERE a = 4;.   
31b0: 20 53 45 4c 45 43 54 20 2a 20 66 72 6f 6d 20 74   SELECT * from t
31c0: 62 6c 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 31  bl;.  }.} {1 2 1
31d0: 30 20 36 20 33 20 34 7d 0a 64 6f 5f 74 65 73 74  0 6 3 4}.do_test
31e0: 20 74 72 69 67 2d 36 2e 32 62 20 7b 0a 20 20 63   trig-6.2b {.  c
31f0: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 55 50  atchsql {.    UP
3200: 44 41 54 45 20 4f 52 20 41 42 4f 52 54 20 74 62  DATE OR ABORT tb
3210: 6c 20 53 45 54 20 61 20 3d 20 34 20 57 48 45 52  l SET a = 4 WHER
3220: 45 20 61 20 3d 20 31 3b 0a 20 20 7d 0a 7d 20 7b  E a = 1;.  }.} {
3230: 31 20 7b 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  1 {constraint fa
3240: 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 74  iled}}.do_test t
3250: 72 69 67 2d 36 2e 32 63 20 7b 0a 20 20 65 78 65  rig-6.2c {.  exe
3260: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
3270: 54 20 2a 20 66 72 6f 6d 20 74 62 6c 3b 0a 20 20  T * from tbl;.  
3280: 7d 0a 7d 20 7b 31 20 32 20 31 30 20 36 20 33 20  }.} {1 2 10 6 3 
3290: 34 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 2d  4}.do_test trig-
32a0: 36 2e 32 64 20 7b 0a 20 20 63 61 74 63 68 73 71  6.2d {.  catchsq
32b0: 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20 4f  l {.    UPDATE O
32c0: 52 20 46 41 49 4c 20 74 62 6c 20 53 45 54 20 61  R FAIL tbl SET a
32d0: 20 3d 20 34 20 57 48 45 52 45 20 61 20 3d 20 31   = 4 WHERE a = 1
32e0: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 63 6f 6e 73  ;.  }.} {1 {cons
32f0: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a  traint failed}}.
3300: 64 6f 5f 74 65 73 74 20 74 72 69 67 2d 36 2e 32  do_test trig-6.2
3310: 65 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  e {.  execsql {.
3320: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 66 72 6f      SELECT * fro
3330: 6d 20 74 62 6c 3b 0a 20 20 7d 0a 7d 20 7b 34 20  m tbl;.  }.} {4 
3340: 32 20 31 30 20 36 20 33 20 34 7d 0a 64 6f 5f 74  2 10 6 3 4}.do_t
3350: 65 73 74 20 74 72 69 67 2d 36 2e 32 66 20 7b 0a  est trig-6.2f {.
3360: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
3370: 55 50 44 41 54 45 20 4f 52 20 52 45 50 4c 41 43  UPDATE OR REPLAC
3380: 45 20 74 62 6c 20 53 45 54 20 61 20 3d 20 31 20  E tbl SET a = 1 
3390: 57 48 45 52 45 20 61 20 3d 20 34 3b 0a 20 20 20  WHERE a = 4;.   
33a0: 20 53 45 4c 45 43 54 20 2a 20 66 72 6f 6d 20 74   SELECT * from t
33b0: 62 6c 3b 0a 20 20 7d 0a 7d 20 7b 31 20 33 20 31  bl;.  }.} {1 3 1
33c0: 30 7d 0a 65 78 65 63 73 71 6c 20 7b 0a 20 20 49  0}.execsql {.  I
33d0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 56  NSERT INTO tbl V
33e0: 41 4c 55 45 53 20 28 32 2c 20 33 2c 20 34 29 3b  ALUES (2, 3, 4);
33f0: 0a 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 2d  .}.do_test trig-
3400: 36 2e 32 67 20 7b 0a 20 20 63 61 74 63 68 73 71  6.2g {.  catchsq
3410: 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20 4f  l {.    UPDATE O
3420: 52 20 52 4f 4c 4c 42 41 43 4b 20 74 62 6c 20 53  R ROLLBACK tbl S
3430: 45 54 20 61 20 3d 20 34 20 57 48 45 52 45 20 61  ET a = 4 WHERE a
3440: 20 3d 20 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b   = 1;.  }.} {1 {
3450: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
3460: 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67  d}}.do_test trig
3470: 2d 36 2e 32 68 20 7b 0a 20 20 65 78 65 63 73 71  -6.2h {.  execsq
3480: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  l {.    SELECT *
3490: 20 66 72 6f 6d 20 74 62 6c 3b 0a 20 20 7d 0a 7d   from tbl;.  }.}
34a0: 20 7b 34 20 32 20 33 20 36 20 33 20 34 7d 0a 65   {4 2 3 6 3 4}.e
34b0: 78 65 63 73 71 6c 20 7b 0a 20 20 44 52 4f 50 20  xecsql {.  DROP 
34c0: 54 41 42 4c 45 20 74 62 6c 3b 0a 7d 0a 0a 23 20  TABLE tbl;.}..# 
34d0: 37 2e 20 54 72 69 67 67 65 72 73 20 6f 6e 20 76  7. Triggers on v
34e0: 69 65 77 73 0a 64 6f 5f 74 65 73 74 20 74 72 69  iews.do_test tri
34f0: 67 2d 37 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  g-7.1 {.  execsq
3500: 6c 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42  l {.  CREATE TAB
3510: 4c 45 20 61 62 28 61 2c 20 62 29 3b 0a 20 20 43  LE ab(a, b);.  C
3520: 52 45 41 54 45 20 54 41 42 4c 45 20 63 64 28 63  REATE TABLE cd(c
3530: 2c 20 64 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  , d);.  INSERT I
3540: 4e 54 4f 20 61 62 20 56 41 4c 55 45 53 20 28 31  NTO ab VALUES (1
3550: 2c 20 32 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  , 2);.  INSERT I
3560: 4e 54 4f 20 61 62 20 56 41 4c 55 45 53 20 28 30  NTO ab VALUES (0
3570: 2c 20 30 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  , 0);.  INSERT I
3580: 4e 54 4f 20 63 64 20 56 41 4c 55 45 53 20 28 33  NTO cd VALUES (3
3590: 2c 20 34 29 3b 0a 0a 20 20 43 52 45 41 54 45 20  , 4);..  CREATE 
35a0: 54 41 42 4c 45 20 74 6c 6f 67 28 69 69 20 49 4e  TABLE tlog(ii IN
35b0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
35c0: 59 2c 20 0a 20 20 20 20 20 20 6f 6c 64 61 2c 20  Y, .      olda, 
35d0: 6f 6c 64 62 2c 20 6f 6c 64 63 2c 20 6f 6c 64 64  oldb, oldc, oldd
35e0: 2c 20 6e 65 77 61 2c 20 6e 65 77 62 2c 20 6e 65  , newa, newb, ne
35f0: 77 63 2c 20 6e 65 77 64 29 3b 0a 0a 20 20 43 52  wc, newd);..  CR
3600: 45 41 54 45 20 56 49 45 57 20 61 62 63 64 20 41  EATE VIEW abcd A
3610: 53 20 53 45 4c 45 43 54 20 61 2c 20 62 2c 20 63  S SELECT a, b, c
3620: 2c 20 64 20 46 52 4f 4d 20 61 62 2c 20 63 64 3b  , d FROM ab, cd;
3630: 0a 0a 20 20 43 52 45 41 54 45 20 54 52 49 47 47  ..  CREATE TRIGG
3640: 45 52 20 62 65 66 6f 72 65 5f 75 70 64 61 74 65  ER before_update
3650: 20 49 4e 53 54 45 41 44 20 4f 46 20 55 50 44 41   INSTEAD OF UPDA
3660: 54 45 20 4f 4e 20 61 62 63 64 20 42 45 47 49 4e  TE ON abcd BEGIN
3670: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
3680: 20 74 6c 6f 67 20 56 41 4c 55 45 53 28 4e 55 4c   tlog VALUES(NUL
3690: 4c 2c 20 0a 09 6f 6c 64 2e 61 2c 20 6f 6c 64 2e  L, ..old.a, old.
36a0: 62 2c 20 6f 6c 64 2e 63 2c 20 6f 6c 64 2e 64 2c  b, old.c, old.d,
36b0: 20 6e 65 77 2e 61 2c 20 6e 65 77 2e 62 2c 20 6e   new.a, new.b, n
36c0: 65 77 2e 63 2c 20 6e 65 77 2e 64 29 3b 0a 20 20  ew.c, new.d);.  
36d0: 45 4e 44 3b 0a 20 20 43 52 45 41 54 45 20 54 52  END;.  CREATE TR
36e0: 49 47 47 45 52 20 61 66 74 65 72 5f 75 70 64 61  IGGER after_upda
36f0: 74 65 20 49 4e 53 54 45 41 44 20 4f 46 20 55 50  te INSTEAD OF UP
3700: 44 41 54 45 20 4f 4e 20 61 62 63 64 20 42 45 47  DATE ON abcd BEG
3710: 49 4e 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  IN.    INSERT IN
3720: 54 4f 20 74 6c 6f 67 20 56 41 4c 55 45 53 28 4e  TO tlog VALUES(N
3730: 55 4c 4c 2c 20 0a 09 6f 6c 64 2e 61 2c 20 6f 6c  ULL, ..old.a, ol
3740: 64 2e 62 2c 20 6f 6c 64 2e 63 2c 20 6f 6c 64 2e  d.b, old.c, old.
3750: 64 2c 20 6e 65 77 2e 61 2c 20 6e 65 77 2e 62 2c  d, new.a, new.b,
3760: 20 6e 65 77 2e 63 2c 20 6e 65 77 2e 64 29 3b 0a   new.c, new.d);.
3770: 20 20 45 4e 44 3b 0a 0a 20 20 43 52 45 41 54 45    END;..  CREATE
3780: 20 54 52 49 47 47 45 52 20 62 65 66 6f 72 65 5f   TRIGGER before_
3790: 64 65 6c 65 74 65 20 49 4e 53 54 45 41 44 20 4f  delete INSTEAD O
37a0: 46 20 44 45 4c 45 54 45 20 4f 4e 20 61 62 63 64  F DELETE ON abcd
37b0: 20 42 45 47 49 4e 0a 20 20 20 20 49 4e 53 45 52   BEGIN.    INSER
37c0: 54 20 49 4e 54 4f 20 74 6c 6f 67 20 56 41 4c 55  T INTO tlog VALU
37d0: 45 53 28 4e 55 4c 4c 2c 20 0a 09 6f 6c 64 2e 61  ES(NULL, ..old.a
37e0: 2c 20 6f 6c 64 2e 62 2c 20 6f 6c 64 2e 63 2c 20  , old.b, old.c, 
37f0: 6f 6c 64 2e 64 2c 20 30 2c 20 30 2c 20 30 2c 20  old.d, 0, 0, 0, 
3800: 30 29 3b 0a 20 20 45 4e 44 3b 0a 20 20 43 52 45  0);.  END;.  CRE
3810: 41 54 45 20 54 52 49 47 47 45 52 20 61 66 74 65  ATE TRIGGER afte
3820: 72 5f 64 65 6c 65 74 65 20 49 4e 53 54 45 41 44  r_delete INSTEAD
3830: 20 4f 46 20 44 45 4c 45 54 45 20 4f 4e 20 61 62   OF DELETE ON ab
3840: 63 64 20 42 45 47 49 4e 0a 20 20 20 20 49 4e 53  cd BEGIN.    INS
3850: 45 52 54 20 49 4e 54 4f 20 74 6c 6f 67 20 56 41  ERT INTO tlog VA
3860: 4c 55 45 53 28 4e 55 4c 4c 2c 20 0a 09 6f 6c 64  LUES(NULL, ..old
3870: 2e 61 2c 20 6f 6c 64 2e 62 2c 20 6f 6c 64 2e 63  .a, old.b, old.c
3880: 2c 20 6f 6c 64 2e 64 2c 20 30 2c 20 30 2c 20 30  , old.d, 0, 0, 0
3890: 2c 20 30 29 3b 0a 20 20 45 4e 44 3b 0a 0a 20 20  , 0);.  END;..  
38a0: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 62  CREATE TRIGGER b
38b0: 65 66 6f 72 65 5f 69 6e 73 65 72 74 20 49 4e 53  efore_insert INS
38c0: 54 45 41 44 20 4f 46 20 49 4e 53 45 52 54 20 4f  TEAD OF INSERT O
38d0: 4e 20 61 62 63 64 20 42 45 47 49 4e 0a 20 20 20  N abcd BEGIN.   
38e0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 6c 6f   INSERT INTO tlo
38f0: 67 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 0a  g VALUES(NULL, .
3900: 09 30 2c 20 30 2c 20 30 2c 20 30 2c 20 6e 65 77  .0, 0, 0, 0, new
3910: 2e 61 2c 20 6e 65 77 2e 62 2c 20 6e 65 77 2e 63  .a, new.b, new.c
3920: 2c 20 6e 65 77 2e 64 29 3b 0a 20 20 45 4e 44 3b  , new.d);.  END;
3930: 0a 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47  .   CREATE TRIGG
3940: 45 52 20 61 66 74 65 72 5f 69 6e 73 65 72 74 20  ER after_insert 
3950: 49 4e 53 54 45 41 44 20 4f 46 20 49 4e 53 45 52  INSTEAD OF INSER
3960: 54 20 4f 4e 20 61 62 63 64 20 42 45 47 49 4e 0a  T ON abcd BEGIN.
3970: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3980: 74 6c 6f 67 20 56 41 4c 55 45 53 28 4e 55 4c 4c  tlog VALUES(NULL
3990: 2c 20 0a 09 30 2c 20 30 2c 20 30 2c 20 30 2c 20  , ..0, 0, 0, 0, 
39a0: 6e 65 77 2e 61 2c 20 6e 65 77 2e 62 2c 20 6e 65  new.a, new.b, ne
39b0: 77 2e 63 2c 20 6e 65 77 2e 64 29 3b 0a 20 20 20  w.c, new.d);.   
39c0: 45 4e 44 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64  END;.  }.} {}..d
39d0: 6f 5f 74 65 73 74 20 74 72 69 67 2d 37 2e 32 20  o_test trig-7.2 
39e0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
39f0: 20 20 55 50 44 41 54 45 20 61 62 63 64 20 53 45    UPDATE abcd SE
3a00: 54 20 61 20 3d 20 31 30 30 2c 20 62 20 3d 20 35  T a = 100, b = 5
3a10: 2a 35 20 57 48 45 52 45 20 61 20 3d 20 31 3b 0a  *5 WHERE a = 1;.
3a20: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
3a30: 61 62 63 64 20 57 48 45 52 45 20 61 20 3d 20 31  abcd WHERE a = 1
3a40: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
3a50: 4f 20 61 62 63 64 20 56 41 4c 55 45 53 28 31 30  O abcd VALUES(10
3a60: 2c 20 32 30 2c 20 33 30 2c 20 34 30 29 3b 0a 20  , 20, 30, 40);. 
3a70: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
3a80: 20 74 6c 6f 67 3b 0a 20 20 7d 0a 7d 20 5b 20 6c   tlog;.  }.} [ l
3a90: 69 73 74 20 31 20 31 20 32 20 33 20 34 20 31 30  ist 1 1 2 3 4 10
3aa0: 30 20 32 35 20 33 20 34 20 5c 0a 20 20 20 20 20  0 25 3 4 \.     
3ab0: 20 20 20 20 32 20 31 20 32 20 33 20 34 20 31 30      2 1 2 3 4 10
3ac0: 30 20 32 35 20 33 20 34 20 5c 0a 09 20 33 20 31  0 25 3 4 \.. 3 1
3ad0: 20 32 20 33 20 34 20 30 20 30 20 30 20 30 20 5c   2 3 4 0 0 0 0 \
3ae0: 0a 09 20 34 20 31 20 32 20 33 20 34 20 30 20 30  .. 4 1 2 3 4 0 0
3af0: 20 30 20 30 20 5c 0a 09 20 35 20 30 20 30 20 30   0 0 \.. 5 0 0 0
3b00: 20 30 20 31 30 20 32 30 20 33 30 20 34 30 20 5c   0 10 20 30 40 \
3b10: 0a 09 20 36 20 30 20 30 20 30 20 30 20 31 30 20  .. 6 0 0 0 0 10 
3b20: 32 30 20 33 30 20 34 30 20 5d 0a 0a 66 69 6e 69  20 30 40 ]..fini
3b30: 73 68 5f 74 65 73 74 0a                          sh_test.