/ Hex Artifact Content
Login

Artifact 00ceb8aff6bddd511bbac7c837af2863fa0c9cb4:


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 0a 23  ir/tester.tcl..#
0720: 20 31 2e 0a 73 65 74 20 69 69 20 30 0a 66 6f 72   1..set ii 0.for
0730: 65 61 63 68 20 74 62 6c 5f 64 65 66 6e 20 7b 0a  each tbl_defn {.
0740: 09 7b 43 52 45 41 54 45 20 54 45 4d 50 20 54 41  .{CREATE TEMP TA
0750: 42 4c 45 20 74 62 6c 20 28 61 2c 20 62 29 3b 7d  BLE tbl (a, b);}
0760: 20 0a 09 7b 43 52 45 41 54 45 20 54 41 42 4c 45   ..{CREATE TABLE
0770: 20 74 62 6c 20 28 61 2c 20 62 29 3b 7d 20 0a 09   tbl (a, b);} ..
0780: 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 62  {CREATE TABLE tb
0790: 6c 20 28 61 20 49 4e 54 45 47 45 52 20 50 52 49  l (a INTEGER PRI
07a0: 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 7d 20 0a  MARY KEY, b);} .
07b0: 09 7b 43 52 45 41 54 45 20 54 45 4d 50 4f 52 41  .{CREATE TEMPORA
07c0: 52 59 20 54 41 42 4c 45 20 74 62 6c 20 28 61 20  RY TABLE tbl (a 
07d0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
07e0: 4b 45 59 2c 20 62 29 3b 7d 20 0a 20 20 20 20 20  KEY, b);} .     
07f0: 20 20 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45     {CREATE TABLE
0800: 20 74 62 6c 20 28 61 2c 20 62 20 50 52 49 4d 41   tbl (a, b PRIMA
0810: 52 59 20 4b 45 59 29 3b 7d 20 0a 09 7b 43 52 45  RY KEY);} ..{CRE
0820: 41 54 45 20 54 41 42 4c 45 20 74 62 6c 20 28 61  ATE TABLE tbl (a
0830: 2c 20 62 29 3b 20 43 52 45 41 54 45 20 49 4e 44  , b); CREATE IND
0840: 45 58 20 74 62 6c 5f 69 64 78 20 4f 4e 20 74 62  EX tbl_idx ON tb
0850: 6c 28 62 29 3b 7d 20 0a 09 7b 43 52 45 41 54 45  l(b);} ..{CREATE
0860: 20 54 45 4d 50 20 54 41 42 4c 45 20 74 62 6c 20   TEMP TABLE tbl 
0870: 28 61 2c 20 62 29 3b 20 43 52 45 41 54 45 20 49  (a, b); CREATE I
0880: 4e 44 45 58 20 74 62 6c 5f 69 64 78 20 4f 4e 20  NDEX tbl_idx ON 
0890: 74 62 6c 28 62 29 3b 7d 20 0a 09 7b 43 52 45 41  tbl(b);} ..{CREA
08a0: 54 45 20 54 41 42 4c 45 20 74 62 6c 20 28 61 2c  TE TABLE tbl (a,
08b0: 20 62 29 3b 20 43 52 45 41 54 45 20 54 45 4d 50   b); CREATE TEMP
08c0: 20 49 4e 44 45 58 20 74 62 6c 5f 69 64 78 20 4f   INDEX tbl_idx O
08d0: 4e 20 74 62 6c 28 62 29 3b 7d 20 0a 7d 20 7b 0a  N tbl(b);} .} {.
08e0: 20 20 69 6e 63 72 20 69 69 0a 20 20 63 61 74 63    incr ii.  catc
08f0: 68 73 71 6c 20 7b 20 44 52 4f 50 20 49 4e 44 45  hsql { DROP INDE
0900: 58 20 74 62 6c 5f 69 64 78 3b 20 7d 0a 20 20 63  X tbl_idx; }.  c
0910: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 44 52  atchsql {.    DR
0920: 4f 50 20 54 41 42 4c 45 20 72 6c 6f 67 3b 0a 20  OP TABLE rlog;. 
0930: 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 63 6c     DROP TABLE cl
0940: 6f 67 3b 0a 20 20 20 20 44 52 4f 50 20 54 41 42  og;.    DROP TAB
0950: 4c 45 20 74 62 6c 3b 0a 20 20 20 20 44 52 4f 50  LE tbl;.    DROP
0960: 20 54 41 42 4c 45 20 6f 74 68 65 72 5f 74 62 6c   TABLE other_tbl
0970: 3b 0a 20 20 7d 0a 0a 20 20 65 78 65 63 73 71 6c  ;.  }..  execsql
0980: 20 24 74 62 6c 5f 64 65 66 6e 0a 0a 20 20 65 78   $tbl_defn..  ex
0990: 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45  ecsql {.    INSE
09a0: 52 54 20 49 4e 54 4f 20 74 62 6c 20 56 41 4c 55  RT INTO tbl VALU
09b0: 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 49 4e  ES(1, 2);.    IN
09c0: 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 56 41  SERT INTO tbl VA
09d0: 4c 55 45 53 28 33 2c 20 34 29 3b 0a 0a 20 20 20  LUES(3, 4);..   
09e0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 72 6c   CREATE TABLE rl
09f0: 6f 67 20 28 69 64 78 2c 20 6f 6c 64 5f 61 2c 20  og (idx, old_a, 
0a00: 6f 6c 64 5f 62 2c 20 64 62 5f 73 75 6d 5f 61 2c  old_b, db_sum_a,
0a10: 20 64 62 5f 73 75 6d 5f 62 2c 20 6e 65 77 5f 61   db_sum_b, new_a
0a20: 2c 20 6e 65 77 5f 62 29 3b 0a 20 20 20 20 43 52  , new_b);.    CR
0a30: 45 41 54 45 20 54 41 42 4c 45 20 63 6c 6f 67 20  EATE TABLE clog 
0a40: 28 69 64 78 2c 20 6f 6c 64 5f 61 2c 20 6f 6c 64  (idx, old_a, old
0a50: 5f 62 2c 20 64 62 5f 73 75 6d 5f 61 2c 20 64 62  _b, db_sum_a, db
0a60: 5f 73 75 6d 5f 62 2c 20 6e 65 77 5f 61 2c 20 6e  _sum_b, new_a, n
0a70: 65 77 5f 62 29 3b 0a 0a 20 20 20 20 43 52 45 41  ew_b);..    CREA
0a80: 54 45 20 54 52 49 47 47 45 52 20 62 65 66 6f 72  TE TRIGGER befor
0a90: 65 5f 75 70 64 61 74 65 5f 72 6f 77 20 42 45 46  e_update_row BEF
0aa0: 4f 52 45 20 55 50 44 41 54 45 20 4f 4e 20 74 62  ORE UPDATE ON tb
0ab0: 6c 20 46 4f 52 20 45 41 43 48 20 52 4f 57 20 0a  l FOR EACH ROW .
0ac0: 20 20 20 20 20 20 42 45 47 49 4e 0a 20 20 20 20        BEGIN.    
0ad0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 72 6c    INSERT INTO rl
0ae0: 6f 67 20 56 41 4c 55 45 53 20 28 20 28 53 45 4c  og VALUES ( (SEL
0af0: 45 43 54 20 63 6f 61 6c 65 73 63 65 28 6d 61 78  ECT coalesce(max
0b00: 28 69 64 78 29 2c 30 29 20 2b 20 31 20 46 52 4f  (idx),0) + 1 FRO
0b10: 4d 20 72 6c 6f 67 29 2c 20 0a 09 20 20 6f 6c 64  M rlog), ..  old
0b20: 2e 61 2c 20 6f 6c 64 2e 62 2c 20 0a 09 20 20 28  .a, old.b, ..  (
0b30: 53 45 4c 45 43 54 20 73 75 6d 28 61 29 20 46 52  SELECT sum(a) FR
0b40: 4f 4d 20 74 62 6c 29 2c 20 28 53 45 4c 45 43 54  OM tbl), (SELECT
0b50: 20 73 75 6d 28 62 29 20 46 52 4f 4d 20 74 62 6c   sum(b) FROM tbl
0b60: 29 2c 20 0a 09 20 20 6e 65 77 2e 61 2c 20 6e 65  ), ..  new.a, ne
0b70: 77 2e 62 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 0a  w.b);.    END;..
0b80: 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47      CREATE TRIGG
0b90: 45 52 20 61 66 74 65 72 5f 75 70 64 61 74 65 5f  ER after_update_
0ba0: 72 6f 77 20 41 46 54 45 52 20 55 50 44 41 54 45  row AFTER UPDATE
0bb0: 20 4f 4e 20 74 62 6c 20 46 4f 52 20 45 41 43 48   ON tbl FOR EACH
0bc0: 20 52 4f 57 20 0a 20 20 20 20 20 20 42 45 47 49   ROW .      BEGI
0bd0: 4e 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  N.      INSERT I
0be0: 4e 54 4f 20 72 6c 6f 67 20 56 41 4c 55 45 53 20  NTO rlog VALUES 
0bf0: 28 20 28 53 45 4c 45 43 54 20 63 6f 61 6c 65 73  ( (SELECT coales
0c00: 63 65 28 6d 61 78 28 69 64 78 29 2c 30 29 20 2b  ce(max(idx),0) +
0c10: 20 31 20 46 52 4f 4d 20 72 6c 6f 67 29 2c 20 0a   1 FROM rlog), .
0c20: 09 20 20 6f 6c 64 2e 61 2c 20 6f 6c 64 2e 62 2c  .  old.a, old.b,
0c30: 20 0a 09 20 20 28 53 45 4c 45 43 54 20 73 75 6d   ..  (SELECT sum
0c40: 28 61 29 20 46 52 4f 4d 20 74 62 6c 29 2c 20 28  (a) FROM tbl), (
0c50: 53 45 4c 45 43 54 20 73 75 6d 28 62 29 20 46 52  SELECT sum(b) FR
0c60: 4f 4d 20 74 62 6c 29 2c 20 0a 09 20 20 6e 65 77  OM tbl), ..  new
0c70: 2e 61 2c 20 6e 65 77 2e 62 29 3b 0a 20 20 20 20  .a, new.b);.    
0c80: 45 4e 44 3b 0a 0a 20 20 20 20 43 52 45 41 54 45  END;..    CREATE
0c90: 20 54 52 49 47 47 45 52 20 63 6f 6e 64 69 74 69   TRIGGER conditi
0ca0: 6f 6e 61 6c 5f 75 70 64 61 74 65 5f 72 6f 77 20  onal_update_row 
0cb0: 41 46 54 45 52 20 55 50 44 41 54 45 20 4f 4e 20  AFTER UPDATE ON 
0cc0: 74 62 6c 20 46 4f 52 20 45 41 43 48 20 52 4f 57  tbl FOR EACH ROW
0cd0: 0a 20 20 20 20 20 20 57 48 45 4e 20 6f 6c 64 2e  .      WHEN old.
0ce0: 61 20 3d 20 31 0a 20 20 20 20 20 20 42 45 47 49  a = 1.      BEGI
0cf0: 4e 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  N.      INSERT I
0d00: 4e 54 4f 20 63 6c 6f 67 20 56 41 4c 55 45 53 20  NTO clog VALUES 
0d10: 28 20 28 53 45 4c 45 43 54 20 63 6f 61 6c 65 73  ( (SELECT coales
0d20: 63 65 28 6d 61 78 28 69 64 78 29 2c 30 29 20 2b  ce(max(idx),0) +
0d30: 20 31 20 46 52 4f 4d 20 63 6c 6f 67 29 2c 20 0a   1 FROM clog), .
0d40: 09 20 20 6f 6c 64 2e 61 2c 20 6f 6c 64 2e 62 2c  .  old.a, old.b,
0d50: 20 0a 09 20 20 28 53 45 4c 45 43 54 20 73 75 6d   ..  (SELECT sum
0d60: 28 61 29 20 46 52 4f 4d 20 74 62 6c 29 2c 20 28  (a) FROM tbl), (
0d70: 53 45 4c 45 43 54 20 73 75 6d 28 62 29 20 46 52  SELECT sum(b) FR
0d80: 4f 4d 20 74 62 6c 29 2c 20 0a 09 20 20 6e 65 77  OM tbl), ..  new
0d90: 2e 61 2c 20 6e 65 77 2e 62 29 3b 0a 20 20 20 20  .a, new.b);.    
0da0: 45 4e 44 3b 0a 20 20 7d 0a 0a 20 20 64 6f 5f 74  END;.  }..  do_t
0db0: 65 73 74 20 74 72 69 67 67 65 72 32 2d 31 2e 24  est trigger2-1.$
0dc0: 69 69 2e 31 20 7b 0a 20 20 20 20 65 78 65 63 73  ii.1 {.    execs
0dd0: 71 6c 20 7b 20 0a 20 20 20 20 20 20 55 50 44 41  ql { .      UPDA
0de0: 54 45 20 74 62 6c 20 53 45 54 20 61 20 3d 20 61  TE tbl SET a = a
0df0: 20 2a 20 31 30 2c 20 62 20 3d 20 62 20 2a 20 31   * 10, b = b * 1
0e00: 30 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  0;.      SELECT 
0e10: 2a 20 46 52 4f 4d 20 72 6c 6f 67 20 4f 52 44 45  * FROM rlog ORDE
0e20: 52 20 42 59 20 69 64 78 3b 0a 20 20 20 20 20 20  R BY idx;.      
0e30: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 63 6c  SELECT * FROM cl
0e40: 6f 67 20 4f 52 44 45 52 20 42 59 20 69 64 78 3b  og ORDER BY idx;
0e50: 0a 20 20 20 20 7d 0a 20 20 7d 20 5b 6c 69 73 74  .    }.  } [list
0e60: 20 31 20 31 20 32 20 20 34 20 20 36 20 31 30 20   1 1 2  4  6 10 
0e70: 32 30 20 5c 0a 20 20 20 20 20 20 20 20 20 20 32  20 \.          2
0e80: 20 31 20 32 20 31 33 20 32 34 20 31 30 20 32 30   1 2 13 24 10 20
0e90: 20 5c 0a 09 20 20 33 20 33 20 34 20 31 33 20 32   \..  3 3 4 13 2
0ea0: 34 20 33 30 20 34 30 20 5c 0a 09 20 20 34 20 33  4 30 40 \..  4 3
0eb0: 20 34 20 34 30 20 36 30 20 33 30 20 34 30 20 5c   4 40 60 30 40 \
0ec0: 0a 20 20 20 20 20 20 20 20 20 20 31 20 31 20 32  .          1 1 2
0ed0: 20 31 33 20 32 34 20 31 30 20 32 30 20 5d 0a 0a   13 24 10 20 ]..
0ee0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
0ef0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 72 6c 6f 67  DELETE FROM rlog
0f00: 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  ;.    DELETE FRO
0f10: 4d 20 74 62 6c 3b 0a 20 20 20 20 49 4e 53 45 52  M tbl;.    INSER
0f20: 54 20 49 4e 54 4f 20 74 62 6c 20 56 41 4c 55 45  T INTO tbl VALUE
0f30: 53 20 28 31 30 30 2c 20 31 30 30 29 3b 0a 20 20  S (100, 100);.  
0f40: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62    INSERT INTO tb
0f50: 6c 20 56 41 4c 55 45 53 20 28 33 30 30 2c 20 32  l VALUES (300, 2
0f60: 30 30 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  00);.    CREATE 
0f70: 54 52 49 47 47 45 52 20 64 65 6c 65 74 65 5f 62  TRIGGER delete_b
0f80: 65 66 6f 72 65 5f 72 6f 77 20 42 45 46 4f 52 45  efore_row BEFORE
0f90: 20 44 45 4c 45 54 45 20 4f 4e 20 74 62 6c 20 46   DELETE ON tbl F
0fa0: 4f 52 20 45 41 43 48 20 52 4f 57 0a 20 20 20 20  OR EACH ROW.    
0fb0: 20 20 42 45 47 49 4e 0a 20 20 20 20 20 20 49 4e    BEGIN.      IN
0fc0: 53 45 52 54 20 49 4e 54 4f 20 72 6c 6f 67 20 56  SERT INTO rlog V
0fd0: 41 4c 55 45 53 20 28 20 28 53 45 4c 45 43 54 20  ALUES ( (SELECT 
0fe0: 63 6f 61 6c 65 73 63 65 28 6d 61 78 28 69 64 78  coalesce(max(idx
0ff0: 29 2c 30 29 20 2b 20 31 20 46 52 4f 4d 20 72 6c  ),0) + 1 FROM rl
1000: 6f 67 29 2c 20 0a 09 20 20 6f 6c 64 2e 61 2c 20  og), ..  old.a, 
1010: 6f 6c 64 2e 62 2c 20 0a 09 20 20 28 53 45 4c 45  old.b, ..  (SELE
1020: 43 54 20 73 75 6d 28 61 29 20 46 52 4f 4d 20 74  CT sum(a) FROM t
1030: 62 6c 29 2c 20 28 53 45 4c 45 43 54 20 73 75 6d  bl), (SELECT sum
1040: 28 62 29 20 46 52 4f 4d 20 74 62 6c 29 2c 20 0a  (b) FROM tbl), .
1050: 09 20 20 30 2c 20 30 29 3b 0a 20 20 20 20 45 4e  .  0, 0);.    EN
1060: 44 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54  D;..    CREATE T
1070: 52 49 47 47 45 52 20 64 65 6c 65 74 65 5f 61 66  RIGGER delete_af
1080: 74 65 72 5f 72 6f 77 20 41 46 54 45 52 20 44 45  ter_row AFTER DE
1090: 4c 45 54 45 20 4f 4e 20 74 62 6c 20 46 4f 52 20  LETE ON tbl FOR 
10a0: 45 41 43 48 20 52 4f 57 0a 20 20 20 20 20 20 42  EACH ROW.      B
10b0: 45 47 49 4e 0a 20 20 20 20 20 20 49 4e 53 45 52  EGIN.      INSER
10c0: 54 20 49 4e 54 4f 20 72 6c 6f 67 20 56 41 4c 55  T INTO rlog VALU
10d0: 45 53 20 28 20 28 53 45 4c 45 43 54 20 63 6f 61  ES ( (SELECT coa
10e0: 6c 65 73 63 65 28 6d 61 78 28 69 64 78 29 2c 30  lesce(max(idx),0
10f0: 29 20 2b 20 31 20 46 52 4f 4d 20 72 6c 6f 67 29  ) + 1 FROM rlog)
1100: 2c 20 0a 09 20 20 6f 6c 64 2e 61 2c 20 6f 6c 64  , ..  old.a, old
1110: 2e 62 2c 20 0a 09 20 20 28 53 45 4c 45 43 54 20  .b, ..  (SELECT 
1120: 73 75 6d 28 61 29 20 46 52 4f 4d 20 74 62 6c 29  sum(a) FROM tbl)
1130: 2c 20 28 53 45 4c 45 43 54 20 73 75 6d 28 62 29  , (SELECT sum(b)
1140: 20 46 52 4f 4d 20 74 62 6c 29 2c 20 0a 09 20 20   FROM tbl), ..  
1150: 30 2c 20 30 29 3b 0a 20 20 20 20 45 4e 44 3b 0a  0, 0);.    END;.
1160: 20 20 7d 0a 20 20 64 6f 5f 74 65 73 74 20 74 72    }.  do_test tr
1170: 69 67 67 65 72 32 2d 31 2e 24 69 69 2e 32 20 7b  igger2-1.$ii.2 {
1180: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
1190: 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d       DELETE FROM
11a0: 20 74 62 6c 3b 0a 20 20 20 20 20 20 53 45 4c 45   tbl;.      SELE
11b0: 43 54 20 2a 20 46 52 4f 4d 20 72 6c 6f 67 3b 0a  CT * FROM rlog;.
11c0: 20 20 20 20 7d 0a 20 20 7d 20 5b 6c 69 73 74 20      }.  } [list 
11d0: 31 20 31 30 30 20 31 30 30 20 34 30 30 20 33 30  1 100 100 400 30
11e0: 30 20 30 20 30 20 5c 0a 20 20 20 20 20 20 20 20  0 0 0 \.        
11f0: 20 20 32 20 31 30 30 20 31 30 30 20 33 30 30 20    2 100 100 300 
1200: 32 30 30 20 30 20 30 20 5c 0a 20 20 20 20 20 20  200 0 0 \.      
1210: 20 20 20 20 33 20 33 30 30 20 32 30 30 20 33 30      3 300 200 30
1220: 30 20 32 30 30 20 30 20 30 20 5c 0a 20 20 20 20  0 200 0 0 \.    
1230: 20 20 20 20 20 20 34 20 33 30 30 20 32 30 30 20        4 300 200 
1240: 30 20 30 20 30 20 30 20 5d 0a 0a 20 20 65 78 65  0 0 0 0 ]..  exe
1250: 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54  csql {.    DELET
1260: 45 20 46 52 4f 4d 20 72 6c 6f 67 3b 0a 20 20 20  E FROM rlog;.   
1270: 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20   CREATE TRIGGER 
1280: 69 6e 73 65 72 74 5f 62 65 66 6f 72 65 5f 72 6f  insert_before_ro
1290: 77 20 42 45 46 4f 52 45 20 49 4e 53 45 52 54 20  w BEFORE INSERT 
12a0: 4f 4e 20 74 62 6c 20 46 4f 52 20 45 41 43 48 20  ON tbl FOR EACH 
12b0: 52 4f 57 0a 20 20 20 20 20 20 42 45 47 49 4e 0a  ROW.      BEGIN.
12c0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
12d0: 4f 20 72 6c 6f 67 20 56 41 4c 55 45 53 20 28 20  O rlog VALUES ( 
12e0: 28 53 45 4c 45 43 54 20 63 6f 61 6c 65 73 63 65  (SELECT coalesce
12f0: 28 6d 61 78 28 69 64 78 29 2c 30 29 20 2b 20 31  (max(idx),0) + 1
1300: 20 46 52 4f 4d 20 72 6c 6f 67 29 2c 20 0a 09 20   FROM rlog), .. 
1310: 20 30 2c 20 30 2c 0a 09 20 20 28 53 45 4c 45 43   0, 0,..  (SELEC
1320: 54 20 73 75 6d 28 61 29 20 46 52 4f 4d 20 74 62  T sum(a) FROM tb
1330: 6c 29 2c 20 28 53 45 4c 45 43 54 20 73 75 6d 28  l), (SELECT sum(
1340: 62 29 20 46 52 4f 4d 20 74 62 6c 29 2c 20 0a 09  b) FROM tbl), ..
1350: 20 20 6e 65 77 2e 61 2c 20 6e 65 77 2e 62 29 3b    new.a, new.b);
1360: 0a 20 20 20 20 45 4e 44 3b 0a 0a 20 20 20 20 43  .    END;..    C
1370: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 69 6e  REATE TRIGGER in
1380: 73 65 72 74 5f 61 66 74 65 72 5f 72 6f 77 20 41  sert_after_row A
1390: 46 54 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 74  FTER INSERT ON t
13a0: 62 6c 20 46 4f 52 20 45 41 43 48 20 52 4f 57 0a  bl FOR EACH ROW.
13b0: 20 20 20 20 20 20 42 45 47 49 4e 0a 20 20 20 20        BEGIN.    
13c0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 72 6c    INSERT INTO rl
13d0: 6f 67 20 56 41 4c 55 45 53 20 28 20 28 53 45 4c  og VALUES ( (SEL
13e0: 45 43 54 20 63 6f 61 6c 65 73 63 65 28 6d 61 78  ECT coalesce(max
13f0: 28 69 64 78 29 2c 30 29 20 2b 20 31 20 46 52 4f  (idx),0) + 1 FRO
1400: 4d 20 72 6c 6f 67 29 2c 20 0a 09 20 20 30 2c 20  M rlog), ..  0, 
1410: 30 2c 0a 09 20 20 28 53 45 4c 45 43 54 20 73 75  0,..  (SELECT su
1420: 6d 28 61 29 20 46 52 4f 4d 20 74 62 6c 29 2c 20  m(a) FROM tbl), 
1430: 28 53 45 4c 45 43 54 20 73 75 6d 28 62 29 20 46  (SELECT sum(b) F
1440: 52 4f 4d 20 74 62 6c 29 2c 20 0a 09 20 20 6e 65  ROM tbl), ..  ne
1450: 77 2e 61 2c 20 6e 65 77 2e 62 29 3b 0a 20 20 20  w.a, new.b);.   
1460: 20 45 4e 44 3b 0a 20 20 7d 0a 20 20 64 6f 5f 74   END;.  }.  do_t
1470: 65 73 74 20 74 72 69 67 67 65 72 32 2d 31 2e 24  est trigger2-1.$
1480: 69 69 2e 33 20 7b 0a 20 20 20 20 65 78 65 63 73  ii.3 {.    execs
1490: 71 6c 20 7b 0a 0a 20 20 20 20 20 20 43 52 45 41  ql {..      CREA
14a0: 54 45 20 54 41 42 4c 45 20 6f 74 68 65 72 5f 74  TE TABLE other_t
14b0: 62 6c 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20  bl(a, b);.      
14c0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 6f 74 68 65  INSERT INTO othe
14d0: 72 5f 74 62 6c 20 56 41 4c 55 45 53 28 31 2c 20  r_tbl VALUES(1, 
14e0: 32 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  2);.      INSERT
14f0: 20 49 4e 54 4f 20 6f 74 68 65 72 5f 74 62 6c 20   INTO other_tbl 
1500: 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20  VALUES(3, 4);.  
1510: 20 20 20 20 2d 2d 20 49 4e 53 45 52 54 20 49 4e      -- INSERT IN
1520: 54 4f 20 74 62 6c 20 53 45 4c 45 43 54 20 2a 20  TO tbl SELECT * 
1530: 46 52 4f 4d 20 6f 74 68 65 72 5f 74 62 6c 3b 0a  FROM other_tbl;.
1540: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
1550: 4f 20 74 62 6c 20 56 41 4c 55 45 53 28 35 2c 20  O tbl VALUES(5, 
1560: 36 29 3b 0a 20 20 20 20 20 20 44 52 4f 50 20 54  6);.      DROP T
1570: 41 42 4c 45 20 6f 74 68 65 72 5f 74 62 6c 3b 0a  ABLE other_tbl;.
1580: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .      SELECT * 
1590: 46 52 4f 4d 20 72 6c 6f 67 3b 0a 20 20 20 20 7d  FROM rlog;.    }
15a0: 0a 20 20 7d 20 5b 6c 69 73 74 20 31 20 30 20 30  .  } [list 1 0 0
15b0: 20 30 20 30 20 35 20 36 20 5c 0a 20 20 20 20 20   0 0 5 6 \.     
15c0: 20 20 20 20 20 32 20 30 20 30 20 35 20 36 20 35       2 0 0 5 6 5
15d0: 20 36 20 5d 0a 0a 20 20 64 6f 5f 74 65 73 74 20   6 ]..  do_test 
15e0: 74 72 69 67 67 65 72 32 2d 31 2e 24 69 69 2e 34  trigger2-1.$ii.4
15f0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
1600: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 69 6e  .      PRAGMA in
1610: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20  tegrity_check;. 
1620: 20 20 20 7d 0a 20 20 7d 20 7b 6f 6b 20 6f 6b 7d     }.  } {ok ok}
1630: 0a 7d 0a 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .}.catchsql {.  
1640: 44 52 4f 50 20 54 41 42 4c 45 20 72 6c 6f 67 3b  DROP TABLE rlog;
1650: 0a 20 20 44 52 4f 50 20 54 41 42 4c 45 20 63 6c  .  DROP TABLE cl
1660: 6f 67 3b 0a 20 20 44 52 4f 50 20 54 41 42 4c 45  og;.  DROP TABLE
1670: 20 74 62 6c 3b 0a 20 20 44 52 4f 50 20 54 41 42   tbl;.  DROP TAB
1680: 4c 45 20 6f 74 68 65 72 5f 74 62 6c 3b 0a 7d 0a  LE other_tbl;.}.
1690: 0a 23 20 32 2e 0a 73 65 74 20 69 69 20 30 0a 66  .# 2..set ii 0.f
16a0: 6f 72 65 61 63 68 20 74 72 5f 70 72 6f 67 72 61  oreach tr_progra
16b0: 6d 20 7b 0a 20 20 7b 55 50 44 41 54 45 20 74 62  m {.  {UPDATE tb
16c0: 6c 20 53 45 54 20 62 20 3d 20 6f 6c 64 2e 62 3b  l SET b = old.b;
16d0: 7d 0a 20 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f  }.  {INSERT INTO
16e0: 20 6c 6f 67 20 56 41 4c 55 45 53 28 6e 65 77 2e   log VALUES(new.
16f0: 63 2c 20 32 2c 20 33 29 3b 7d 0a 20 20 7b 44 45  c, 2, 3);}.  {DE
1700: 4c 45 54 45 20 46 52 4f 4d 20 6c 6f 67 20 57 48  LETE FROM log WH
1710: 45 52 45 20 61 20 3d 20 31 3b 7d 0a 20 20 7b 49  ERE a = 1;}.  {I
1720: 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 56  NSERT INTO tbl V
1730: 41 4c 55 45 53 28 35 30 30 2c 20 6e 65 77 2e 62  ALUES(500, new.b
1740: 20 2a 20 31 30 2c 20 37 30 30 29 3b 20 0a 20 20   * 10, 700); .  
1750: 20 20 55 50 44 41 54 45 20 74 62 6c 20 53 45 54    UPDATE tbl SET
1760: 20 63 20 3d 20 6f 6c 64 2e 63 3b 20 0a 20 20 20   c = old.c; .   
1770: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 6c 6f 67   DELETE FROM log
1780: 3b 7d 0a 20 20 7b 49 4e 53 45 52 54 20 49 4e 54  ;}.  {INSERT INT
1790: 4f 20 6c 6f 67 20 73 65 6c 65 63 74 20 2a 20 66  O log select * f
17a0: 72 6f 6d 20 74 62 6c 3b 7d 20 0a 7d 20 7b 0a 20  rom tbl;} .} {. 
17b0: 20 66 6f 72 65 61 63 68 20 74 65 73 74 5f 76 61   foreach test_va
17c0: 72 73 65 74 20 5b 20 6c 69 73 74 20 5c 0a 20 20  rset [ list \.  
17d0: 20 20 7b 0a 20 20 20 20 20 20 73 65 74 20 73 74    {.      set st
17e0: 61 74 65 6d 65 6e 74 20 7b 55 50 44 41 54 45 20  atement {UPDATE 
17f0: 74 62 6c 20 53 45 54 20 63 20 3d 20 31 30 20 57  tbl SET c = 10 W
1800: 48 45 52 45 20 61 20 3d 20 31 3b 7d 20 0a 20 20  HERE a = 1;} .  
1810: 20 20 20 20 73 65 74 20 70 72 65 70 20 20 20 20      set prep    
1820: 20 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 74    {INSERT INTO t
1830: 62 6c 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20  bl VALUES(1, 2, 
1840: 33 29 3b 7d 0a 20 20 20 20 20 20 73 65 74 20 6e  3);}.      set n
1850: 65 77 43 20 31 30 0a 20 20 20 20 20 20 73 65 74  ewC 10.      set
1860: 20 6e 65 77 42 20 32 0a 20 20 20 20 20 20 73 65   newB 2.      se
1870: 74 20 6e 65 77 41 20 31 0a 20 20 20 20 20 20 73  t newA 1.      s
1880: 65 74 20 6f 6c 64 41 20 31 0a 20 20 20 20 20 20  et oldA 1.      
1890: 73 65 74 20 6f 6c 64 42 20 32 0a 20 20 20 20 20  set oldB 2.     
18a0: 20 73 65 74 20 6f 6c 64 43 20 33 0a 20 20 20 20   set oldC 3.    
18b0: 7d 20 5c 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  } \.    {.      
18c0: 73 65 74 20 73 74 61 74 65 6d 65 6e 74 20 7b 44  set statement {D
18d0: 45 4c 45 54 45 20 46 52 4f 4d 20 74 62 6c 20 57  ELETE FROM tbl W
18e0: 48 45 52 45 20 61 20 3d 20 31 3b 7d 0a 20 20 20  HERE a = 1;}.   
18f0: 20 20 20 73 65 74 20 70 72 65 70 20 20 20 20 20     set prep     
1900: 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62   {INSERT INTO tb
1910: 6c 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33  l VALUES(1, 2, 3
1920: 29 3b 7d 0a 20 20 20 20 20 20 73 65 74 20 6f 6c  );}.      set ol
1930: 64 41 20 31 0a 20 20 20 20 20 20 73 65 74 20 6f  dA 1.      set o
1940: 6c 64 42 20 32 0a 20 20 20 20 20 20 73 65 74 20  ldB 2.      set 
1950: 6f 6c 64 43 20 33 0a 20 20 20 20 7d 20 5c 0a 20  oldC 3.    } \. 
1960: 20 20 20 7b 0a 20 20 20 20 20 20 73 65 74 20 73     {.      set s
1970: 74 61 74 65 6d 65 6e 74 20 7b 49 4e 53 45 52 54  tatement {INSERT
1980: 20 49 4e 54 4f 20 74 62 6c 20 56 41 4c 55 45 53   INTO tbl VALUES
1990: 28 31 2c 20 32 2c 20 33 29 3b 7d 0a 20 20 20 20  (1, 2, 3);}.    
19a0: 20 20 73 65 74 20 6e 65 77 41 20 31 0a 20 20 20    set newA 1.   
19b0: 20 20 20 73 65 74 20 6e 65 77 42 20 32 0a 20 20     set newB 2.  
19c0: 20 20 20 20 73 65 74 20 6e 65 77 43 20 33 0a 20      set newC 3. 
19d0: 20 20 20 7d 0a 20 20 5d 20 5c 0a 20 20 7b 0a 20     }.  ] \.  {. 
19e0: 20 20 20 73 65 74 20 73 74 61 74 65 6d 65 6e 74     set statement
19f0: 20 7b 7d 0a 20 20 20 20 73 65 74 20 70 72 65 70   {}.    set prep
1a00: 20 7b 7d 0a 20 20 20 20 73 65 74 20 6e 65 77 41   {}.    set newA
1a10: 20 7b 27 27 7d 0a 20 20 20 20 73 65 74 20 6e 65   {''}.    set ne
1a20: 77 42 20 7b 27 27 7d 0a 20 20 20 20 73 65 74 20  wB {''}.    set 
1a30: 6e 65 77 43 20 7b 27 27 7d 0a 20 20 20 20 73 65  newC {''}.    se
1a40: 74 20 6f 6c 64 41 20 7b 27 27 7d 0a 20 20 20 20  t oldA {''}.    
1a50: 73 65 74 20 6f 6c 64 42 20 7b 27 27 7d 0a 20 20  set oldB {''}.  
1a60: 20 20 73 65 74 20 6f 6c 64 43 20 7b 27 27 7d 0a    set oldC {''}.
1a70: 0a 20 20 20 20 69 6e 63 72 20 69 69 0a 0a 20 20  .    incr ii..  
1a80: 20 20 65 76 61 6c 20 24 74 65 73 74 5f 76 61 72    eval $test_var
1a90: 73 65 74 0a 0a 20 20 20 20 73 65 74 20 73 74 61  set..    set sta
1aa0: 74 65 6d 65 6e 74 5f 74 79 70 65 20 5b 73 74 72  tement_type [str
1ab0: 69 6e 67 20 72 61 6e 67 65 20 24 73 74 61 74 65  ing range $state
1ac0: 6d 65 6e 74 20 30 20 35 5d 0a 20 20 20 20 73 65  ment 0 5].    se
1ad0: 74 20 74 72 5f 70 72 6f 67 72 61 6d 5f 66 69 78  t tr_program_fix
1ae0: 65 64 20 24 74 72 5f 70 72 6f 67 72 61 6d 0a 20  ed $tr_program. 
1af0: 20 20 20 69 66 20 7b 24 73 74 61 74 65 6d 65 6e     if {$statemen
1b00: 74 5f 74 79 70 65 20 3d 3d 20 22 44 45 4c 45 54  t_type == "DELET
1b10: 45 22 7d 20 7b 0a 20 20 20 20 20 20 72 65 67 73  E"} {.      regs
1b20: 75 62 20 2d 61 6c 6c 20 6e 65 77 5c 2e 61 20 24  ub -all new\.a $
1b30: 74 72 5f 70 72 6f 67 72 61 6d 5f 66 69 78 65 64  tr_program_fixed
1b40: 20 7b 27 27 7d 20 74 72 5f 70 72 6f 67 72 61 6d   {''} tr_program
1b50: 5f 66 69 78 65 64 20 0a 20 20 20 20 20 20 72 65  _fixed .      re
1b60: 67 73 75 62 20 2d 61 6c 6c 20 6e 65 77 5c 2e 62  gsub -all new\.b
1b70: 20 24 74 72 5f 70 72 6f 67 72 61 6d 5f 66 69 78   $tr_program_fix
1b80: 65 64 20 7b 27 27 7d 20 74 72 5f 70 72 6f 67 72  ed {''} tr_progr
1b90: 61 6d 5f 66 69 78 65 64 20 0a 20 20 20 20 20 20  am_fixed .      
1ba0: 72 65 67 73 75 62 20 2d 61 6c 6c 20 6e 65 77 5c  regsub -all new\
1bb0: 2e 63 20 24 74 72 5f 70 72 6f 67 72 61 6d 5f 66  .c $tr_program_f
1bc0: 69 78 65 64 20 7b 27 27 7d 20 74 72 5f 70 72 6f  ixed {''} tr_pro
1bd0: 67 72 61 6d 5f 66 69 78 65 64 20 0a 20 20 20 20  gram_fixed .    
1be0: 7d 0a 20 20 20 20 69 66 20 7b 24 73 74 61 74 65  }.    if {$state
1bf0: 6d 65 6e 74 5f 74 79 70 65 20 3d 3d 20 22 49 4e  ment_type == "IN
1c00: 53 45 52 54 22 7d 20 7b 0a 20 20 20 20 20 20 72  SERT"} {.      r
1c10: 65 67 73 75 62 20 2d 61 6c 6c 20 6f 6c 64 5c 2e  egsub -all old\.
1c20: 61 20 24 74 72 5f 70 72 6f 67 72 61 6d 5f 66 69  a $tr_program_fi
1c30: 78 65 64 20 7b 27 27 7d 20 74 72 5f 70 72 6f 67  xed {''} tr_prog
1c40: 72 61 6d 5f 66 69 78 65 64 20 0a 20 20 20 20 20  ram_fixed .     
1c50: 20 72 65 67 73 75 62 20 2d 61 6c 6c 20 6f 6c 64   regsub -all old
1c60: 5c 2e 62 20 24 74 72 5f 70 72 6f 67 72 61 6d 5f  \.b $tr_program_
1c70: 66 69 78 65 64 20 7b 27 27 7d 20 74 72 5f 70 72  fixed {''} tr_pr
1c80: 6f 67 72 61 6d 5f 66 69 78 65 64 20 0a 20 20 20  ogram_fixed .   
1c90: 20 20 20 72 65 67 73 75 62 20 2d 61 6c 6c 20 6f     regsub -all o
1ca0: 6c 64 5c 2e 63 20 24 74 72 5f 70 72 6f 67 72 61  ld\.c $tr_progra
1cb0: 6d 5f 66 69 78 65 64 20 7b 27 27 7d 20 74 72 5f  m_fixed {''} tr_
1cc0: 70 72 6f 67 72 61 6d 5f 66 69 78 65 64 20 0a 20  program_fixed . 
1cd0: 20 20 20 7d 0a 0a 0a 20 20 20 20 73 65 74 20 74     }...    set t
1ce0: 72 5f 70 72 6f 67 72 61 6d 5f 63 6f 6f 6b 65 64  r_program_cooked
1cf0: 20 24 74 72 5f 70 72 6f 67 72 61 6d 0a 20 20 20   $tr_program.   
1d00: 20 72 65 67 73 75 62 20 2d 61 6c 6c 20 6e 65 77   regsub -all new
1d10: 5c 2e 61 20 24 74 72 5f 70 72 6f 67 72 61 6d 5f  \.a $tr_program_
1d20: 63 6f 6f 6b 65 64 20 24 6e 65 77 41 20 74 72 5f  cooked $newA tr_
1d30: 70 72 6f 67 72 61 6d 5f 63 6f 6f 6b 65 64 20 0a  program_cooked .
1d40: 20 20 20 20 72 65 67 73 75 62 20 2d 61 6c 6c 20      regsub -all 
1d50: 6e 65 77 5c 2e 62 20 24 74 72 5f 70 72 6f 67 72  new\.b $tr_progr
1d60: 61 6d 5f 63 6f 6f 6b 65 64 20 24 6e 65 77 42 20  am_cooked $newB 
1d70: 74 72 5f 70 72 6f 67 72 61 6d 5f 63 6f 6f 6b 65  tr_program_cooke
1d80: 64 20 0a 20 20 20 20 72 65 67 73 75 62 20 2d 61  d .    regsub -a
1d90: 6c 6c 20 6e 65 77 5c 2e 63 20 24 74 72 5f 70 72  ll new\.c $tr_pr
1da0: 6f 67 72 61 6d 5f 63 6f 6f 6b 65 64 20 24 6e 65  ogram_cooked $ne
1db0: 77 43 20 74 72 5f 70 72 6f 67 72 61 6d 5f 63 6f  wC tr_program_co
1dc0: 6f 6b 65 64 20 0a 20 20 20 20 72 65 67 73 75 62  oked .    regsub
1dd0: 20 2d 61 6c 6c 20 6f 6c 64 5c 2e 61 20 24 74 72   -all old\.a $tr
1de0: 5f 70 72 6f 67 72 61 6d 5f 63 6f 6f 6b 65 64 20  _program_cooked 
1df0: 24 6f 6c 64 41 20 74 72 5f 70 72 6f 67 72 61 6d  $oldA tr_program
1e00: 5f 63 6f 6f 6b 65 64 20 0a 20 20 20 20 72 65 67  _cooked .    reg
1e10: 73 75 62 20 2d 61 6c 6c 20 6f 6c 64 5c 2e 62 20  sub -all old\.b 
1e20: 24 74 72 5f 70 72 6f 67 72 61 6d 5f 63 6f 6f 6b  $tr_program_cook
1e30: 65 64 20 24 6f 6c 64 42 20 74 72 5f 70 72 6f 67  ed $oldB tr_prog
1e40: 72 61 6d 5f 63 6f 6f 6b 65 64 20 0a 20 20 20 20  ram_cooked .    
1e50: 72 65 67 73 75 62 20 2d 61 6c 6c 20 6f 6c 64 5c  regsub -all old\
1e60: 2e 63 20 24 74 72 5f 70 72 6f 67 72 61 6d 5f 63  .c $tr_program_c
1e70: 6f 6f 6b 65 64 20 24 6f 6c 64 43 20 74 72 5f 70  ooked $oldC tr_p
1e80: 72 6f 67 72 61 6d 5f 63 6f 6f 6b 65 64 20 0a 0a  rogram_cooked ..
1e90: 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20      catchsql {. 
1ea0: 20 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20       DROP TABLE 
1eb0: 74 62 6c 3b 0a 20 20 20 20 20 20 44 52 4f 50 20  tbl;.      DROP 
1ec0: 54 41 42 4c 45 20 6c 6f 67 3b 0a 20 20 20 20 7d  TABLE log;.    }
1ed0: 0a 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  ..    execsql {.
1ee0: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
1ef0: 4c 45 20 74 62 6c 28 61 20 50 52 49 4d 41 52 59  LE tbl(a PRIMARY
1f00: 20 4b 45 59 2c 20 62 2c 20 63 29 3b 0a 20 20 20   KEY, b, c);.   
1f10: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
1f20: 6c 6f 67 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20  log(a, b, c);.  
1f30: 20 20 7d 0a 0a 20 20 20 20 73 65 74 20 71 75 65    }..    set que
1f40: 72 79 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f  ry {SELECT * FRO
1f50: 4d 20 74 62 6c 3b 20 53 45 4c 45 43 54 20 2a 20  M tbl; SELECT * 
1f60: 46 52 4f 4d 20 6c 6f 67 3b 7d 0a 20 20 20 20 73  FROM log;}.    s
1f70: 65 74 20 70 72 65 70 20 22 24 70 72 65 70 3b 20  et prep "$prep; 
1f80: 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c 6f 67 20  INSERT INTO log 
1f90: 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 3b  VALUES(1, 2, 3);
1fa0: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 49  \.             I
1fb0: 4e 53 45 52 54 20 49 4e 54 4f 20 6c 6f 67 20 56  NSERT INTO log V
1fc0: 41 4c 55 45 53 28 31 30 2c 20 32 30 2c 20 33 30  ALUES(10, 20, 30
1fd0: 29 3b 22 0a 0a 23 20 43 68 65 63 6b 20 65 78 65  );"..# Check exe
1fe0: 63 75 74 69 6f 6e 20 6f 66 20 42 45 46 4f 52 45  cution of BEFORE
1ff0: 20 70 72 6f 67 72 61 6d 73 3a 0a 0a 20 20 20 20   programs:..    
2000: 73 65 74 20 62 65 66 6f 72 65 5f 64 61 74 61 20  set before_data 
2010: 5b 20 65 78 65 63 73 71 6c 20 22 24 70 72 65 70  [ execsql "$prep
2020: 20 24 74 72 5f 70 72 6f 67 72 61 6d 5f 63 6f 6f   $tr_program_coo
2030: 6b 65 64 20 24 73 74 61 74 65 6d 65 6e 74 20 24  ked $statement $
2040: 71 75 65 72 79 22 20 5d 0a 0a 20 20 20 20 65 78  query" ]..    ex
2050: 65 63 73 71 6c 20 22 44 45 4c 45 54 45 20 46 52  ecsql "DELETE FR
2060: 4f 4d 20 74 62 6c 3b 20 44 45 4c 45 54 45 20 46  OM tbl; DELETE F
2070: 52 4f 4d 20 6c 6f 67 3b 20 24 70 72 65 70 22 3b  ROM log; $prep";
2080: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22 43 52  .    execsql "CR
2090: 45 41 54 45 20 54 52 49 47 47 45 52 20 74 68 65  EATE TRIGGER the
20a0: 5f 74 72 69 67 67 65 72 20 42 45 46 4f 52 45 20  _trigger BEFORE 
20b0: 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24 73  [string range $s
20c0: 74 61 74 65 6d 65 6e 74 20 30 20 36 5d 5c 0a 20  tatement 0 6]\. 
20d0: 20 20 20 20 20 20 20 20 20 20 20 20 4f 4e 20 74              ON t
20e0: 62 6c 20 42 45 47 49 4e 20 24 74 72 5f 70 72 6f  bl BEGIN $tr_pro
20f0: 67 72 61 6d 5f 66 69 78 65 64 20 45 4e 44 3b 22  gram_fixed END;"
2100: 0a 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 74 72  ..    do_test tr
2110: 69 67 67 65 72 32 2d 32 2e 24 69 69 2d 62 65 66  igger2-2.$ii-bef
2120: 6f 72 65 20 22 65 78 65 63 73 71 6c 20 7b 24 73  ore "execsql {$s
2130: 74 61 74 65 6d 65 6e 74 20 24 71 75 65 72 79 7d  tatement $query}
2140: 22 20 24 62 65 66 6f 72 65 5f 64 61 74 61 0a 0a  " $before_data..
2150: 20 20 20 20 65 78 65 63 73 71 6c 20 22 44 52 4f      execsql "DRO
2160: 50 20 54 52 49 47 47 45 52 20 74 68 65 5f 74 72  P TRIGGER the_tr
2170: 69 67 67 65 72 3b 22 0a 20 20 20 20 65 78 65 63  igger;".    exec
2180: 73 71 6c 20 22 44 45 4c 45 54 45 20 46 52 4f 4d  sql "DELETE FROM
2190: 20 74 62 6c 3b 20 44 45 4c 45 54 45 20 46 52 4f   tbl; DELETE FRO
21a0: 4d 20 6c 6f 67 3b 22 0a 0a 23 20 43 68 65 63 6b  M log;"..# Check
21b0: 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 41 46   execution of AF
21c0: 54 45 52 20 70 72 6f 67 72 61 6d 73 0a 20 20 20  TER programs.   
21d0: 20 73 65 74 20 61 66 74 65 72 5f 64 61 74 61 20   set after_data 
21e0: 5b 20 65 78 65 63 73 71 6c 20 22 24 70 72 65 70  [ execsql "$prep
21f0: 20 24 73 74 61 74 65 6d 65 6e 74 20 24 74 72 5f   $statement $tr_
2200: 70 72 6f 67 72 61 6d 5f 63 6f 6f 6b 65 64 20 24  program_cooked $
2210: 71 75 65 72 79 22 20 5d 0a 0a 20 20 20 20 65 78  query" ]..    ex
2220: 65 63 73 71 6c 20 22 44 45 4c 45 54 45 20 46 52  ecsql "DELETE FR
2230: 4f 4d 20 74 62 6c 3b 20 44 45 4c 45 54 45 20 46  OM tbl; DELETE F
2240: 52 4f 4d 20 6c 6f 67 3b 20 24 70 72 65 70 22 3b  ROM log; $prep";
2250: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22 43 52  .    execsql "CR
2260: 45 41 54 45 20 54 52 49 47 47 45 52 20 74 68 65  EATE TRIGGER the
2270: 5f 74 72 69 67 67 65 72 20 41 46 54 45 52 20 5b  _trigger AFTER [
2280: 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24 73 74  string range $st
2290: 61 74 65 6d 65 6e 74 20 30 20 36 5d 5c 0a 20 20  atement 0 6]\.  
22a0: 20 20 20 20 20 20 20 20 20 20 20 4f 4e 20 74 62             ON tb
22b0: 6c 20 42 45 47 49 4e 20 24 74 72 5f 70 72 6f 67  l BEGIN $tr_prog
22c0: 72 61 6d 5f 66 69 78 65 64 20 45 4e 44 3b 22 0a  ram_fixed END;".
22d0: 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 74 72 69  .    do_test tri
22e0: 67 67 65 72 32 2d 32 2e 24 69 69 2d 61 66 74 65  gger2-2.$ii-afte
22f0: 72 20 22 65 78 65 63 73 71 6c 20 7b 24 73 74 61  r "execsql {$sta
2300: 74 65 6d 65 6e 74 20 24 71 75 65 72 79 7d 22 20  tement $query}" 
2310: 24 61 66 74 65 72 5f 64 61 74 61 0a 20 20 20 20  $after_data.    
2320: 65 78 65 63 73 71 6c 20 22 44 52 4f 50 20 54 52  execsql "DROP TR
2330: 49 47 47 45 52 20 74 68 65 5f 74 72 69 67 67 65  IGGER the_trigge
2340: 72 3b 22 0a 0a 20 20 20 20 64 6f 5f 74 65 73 74  r;"..    do_test
2350: 20 74 72 69 67 67 65 72 32 2d 32 2e 24 69 69 2d   trigger2-2.$ii-
2360: 69 6e 74 65 67 72 69 74 79 20 7b 0a 20 20 20 20  integrity {.    
2370: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
2380: 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67      PRAGMA integ
2390: 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20 20 20  rity_check;.    
23a0: 20 20 7d 0a 20 20 20 20 7d 20 7b 6f 6b 20 6f 6b    }.    } {ok ok
23b0: 7d 0a 0a 20 20 7d 0a 7d 0a 63 61 74 63 68 73 71  }..  }.}.catchsq
23c0: 6c 20 7b 0a 20 20 44 52 4f 50 20 54 41 42 4c 45  l {.  DROP TABLE
23d0: 20 74 62 6c 3b 0a 20 20 44 52 4f 50 20 54 41 42   tbl;.  DROP TAB
23e0: 4c 45 20 6c 6f 67 3b 0a 7d 0a 0a 23 20 33 2e 0a  LE log;.}..# 3..
23f0: 0a 23 20 74 72 69 67 67 65 72 32 2d 33 2e 31 3a  .# trigger2-3.1:
2400: 20 55 50 44 41 54 45 20 4f 46 20 74 72 69 67 67   UPDATE OF trigg
2410: 65 72 73 0a 65 78 65 63 73 71 6c 20 7b 0a 20 20  ers.execsql {.  
2420: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 62 6c  CREATE TABLE tbl
2430: 20 28 61 2c 20 62 2c 20 63 2c 20 64 29 3b 0a 20   (a, b, c, d);. 
2440: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6c 6f   CREATE TABLE lo
2450: 67 20 28 61 29 3b 0a 20 20 49 4e 53 45 52 54 20  g (a);.  INSERT 
2460: 49 4e 54 4f 20 6c 6f 67 20 56 41 4c 55 45 53 20  INTO log VALUES 
2470: 28 30 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  (0);.  INSERT IN
2480: 54 4f 20 74 62 6c 20 56 41 4c 55 45 53 20 28 30  TO tbl VALUES (0
2490: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 49 4e  , 0, 0, 0);.  IN
24a0: 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 56 41  SERT INTO tbl VA
24b0: 4c 55 45 53 20 28 31 2c 20 30 2c 20 30 2c 20 30  LUES (1, 0, 0, 0
24c0: 29 3b 0a 20 20 43 52 45 41 54 45 20 54 52 49 47  );.  CREATE TRIG
24d0: 47 45 52 20 74 62 6c 5f 61 66 74 65 72 5f 75 70  GER tbl_after_up
24e0: 64 61 74 65 5f 63 64 20 42 45 46 4f 52 45 20 55  date_cd BEFORE U
24f0: 50 44 41 54 45 20 4f 46 20 63 2c 20 64 20 4f 4e  PDATE OF c, d ON
2500: 20 74 62 6c 0a 20 20 20 20 42 45 47 49 4e 0a 20   tbl.    BEGIN. 
2510: 20 20 20 20 20 55 50 44 41 54 45 20 6c 6f 67 20       UPDATE log 
2520: 53 45 54 20 61 20 3d 20 61 20 2b 20 31 3b 0a 20  SET a = a + 1;. 
2530: 20 20 20 45 4e 44 3b 0a 7d 0a 64 6f 5f 74 65 73     END;.}.do_tes
2540: 74 20 74 72 69 67 67 65 72 32 2d 33 2e 31 20 7b  t trigger2-3.1 {
2550: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
2560: 20 55 50 44 41 54 45 20 74 62 6c 20 53 45 54 20   UPDATE tbl SET 
2570: 62 20 3d 20 31 2c 20 63 20 3d 20 31 30 3b 20 2d  b = 1, c = 10; -
2580: 2d 20 32 0a 20 20 20 20 55 50 44 41 54 45 20 74  - 2.    UPDATE t
2590: 62 6c 20 53 45 54 20 62 20 3d 20 31 30 3b 20 2d  bl SET b = 10; -
25a0: 2d 20 30 0a 20 20 20 20 55 50 44 41 54 45 20 74  - 0.    UPDATE t
25b0: 62 6c 20 53 45 54 20 64 20 3d 20 34 20 57 48 45  bl SET d = 4 WHE
25c0: 52 45 20 61 20 3d 20 30 3b 20 2d 2d 31 0a 20 20  RE a = 0; --1.  
25d0: 20 20 55 50 44 41 54 45 20 74 62 6c 20 53 45 54    UPDATE tbl SET
25e0: 20 61 20 3d 20 34 2c 20 62 20 3d 20 31 30 3b 20   a = 4, b = 10; 
25f0: 2d 2d 30 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  --0.    SELECT *
2600: 20 46 52 4f 4d 20 6c 6f 67 3b 0a 20 20 7d 0a 7d   FROM log;.  }.}
2610: 20 7b 33 7d 0a 65 78 65 63 73 71 6c 20 7b 0a 20   {3}.execsql {. 
2620: 20 44 52 4f 50 20 54 41 42 4c 45 20 74 62 6c 3b   DROP TABLE tbl;
2630: 0a 20 20 44 52 4f 50 20 54 41 42 4c 45 20 6c 6f  .  DROP TABLE lo
2640: 67 3b 0a 7d 0a 0a 23 20 74 72 69 67 67 65 72 32  g;.}..# trigger2
2650: 2d 33 2e 32 3a 20 57 48 45 4e 20 63 6c 61 75 73  -3.2: WHEN claus
2660: 65 0a 73 65 74 20 77 68 65 6e 5f 74 72 69 67 67  e.set when_trigg
2670: 65 72 73 20 5b 20 6c 69 73 74 20 5c 0a 20 20 20  ers [ list \.   
2680: 20 20 20 20 20 20 20 20 20 20 7b 74 31 20 42 45            {t1 BE
2690: 46 4f 52 45 20 49 4e 53 45 52 54 20 4f 4e 20 74  FORE INSERT ON t
26a0: 62 6c 20 57 48 45 4e 20 6e 65 77 2e 61 20 3e 20  bl WHEN new.a > 
26b0: 32 30 7d 20 5c 0a 20 20 20 20 20 20 20 20 20 20  20} \.          
26c0: 20 20 20 7b 74 32 20 42 45 46 4f 52 45 20 49 4e     {t2 BEFORE IN
26d0: 53 45 52 54 20 4f 4e 20 74 62 6c 20 57 48 45 4e  SERT ON tbl WHEN
26e0: 20 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   (SELECT count(*
26f0: 29 20 46 52 4f 4d 20 74 62 6c 29 20 3d 20 30 7d  ) FROM tbl) = 0}
2700: 20 5d 0a 0a 65 78 65 63 73 71 6c 20 7b 0a 20 20   ]..execsql {.  
2710: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 62 6c  CREATE TABLE tbl
2720: 20 28 61 2c 20 62 2c 20 63 2c 20 64 29 3b 0a 20   (a, b, c, d);. 
2730: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6c 6f   CREATE TABLE lo
2740: 67 20 28 61 29 3b 0a 20 20 49 4e 53 45 52 54 20  g (a);.  INSERT 
2750: 49 4e 54 4f 20 6c 6f 67 20 56 41 4c 55 45 53 20  INTO log VALUES 
2760: 28 30 29 3b 0a 7d 0a 0a 66 6f 72 65 61 63 68 20  (0);.}..foreach 
2770: 74 72 69 67 20 24 77 68 65 6e 5f 74 72 69 67 67  trig $when_trigg
2780: 65 72 73 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  ers {.  execsql 
2790: 22 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20  "CREATE TRIGGER 
27a0: 24 74 72 69 67 20 42 45 47 49 4e 20 55 50 44 41  $trig BEGIN UPDA
27b0: 54 45 20 6c 6f 67 20 73 65 74 20 61 20 3d 20 61  TE log set a = a
27c0: 20 2b 20 31 3b 20 45 4e 44 3b 22 0a 7d 0a 0a 64   + 1; END;".}..d
27d0: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 32 2d  o_test trigger2-
27e0: 33 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  3.2 {.  execsql 
27f0: 7b 20 0a 0a 20 20 20 20 49 4e 53 45 52 54 20 49  { ..    INSERT I
2800: 4e 54 4f 20 74 62 6c 20 56 41 4c 55 45 53 28 30  NTO tbl VALUES(0
2810: 2c 20 30 2c 20 30 2c 20 30 29 3b 20 20 20 20 20  , 0, 0, 0);     
2820: 2d 2d 20 31 0a 20 20 20 20 53 45 4c 45 43 54 20  -- 1.    SELECT 
2830: 2a 20 46 52 4f 4d 20 6c 6f 67 3b 0a 20 20 20 20  * FROM log;.    
2840: 55 50 44 41 54 45 20 6c 6f 67 20 53 45 54 20 61  UPDATE log SET a
2850: 20 3d 20 30 3b 0a 0a 20 20 20 20 49 4e 53 45 52   = 0;..    INSER
2860: 54 20 49 4e 54 4f 20 74 62 6c 20 56 41 4c 55 45  T INTO tbl VALUE
2870: 53 28 30 2c 20 30 2c 20 30 2c 20 30 29 3b 20 20  S(0, 0, 0, 0);  
2880: 20 20 20 2d 2d 20 30 0a 20 20 20 20 53 45 4c 45     -- 0.    SELE
2890: 43 54 20 2a 20 46 52 4f 4d 20 6c 6f 67 3b 0a 20  CT * FROM log;. 
28a0: 20 20 20 55 50 44 41 54 45 20 6c 6f 67 20 53 45     UPDATE log SE
28b0: 54 20 61 20 3d 20 30 3b 0a 0a 20 20 20 20 49 4e  T a = 0;..    IN
28c0: 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 56 41  SERT INTO tbl VA
28d0: 4c 55 45 53 28 32 30 30 2c 20 30 2c 20 30 2c 20  LUES(200, 0, 0, 
28e0: 30 29 3b 20 20 20 20 20 2d 2d 20 31 0a 20 20 20  0);     -- 1.   
28f0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6c   SELECT * FROM l
2900: 6f 67 3b 0a 20 20 20 20 55 50 44 41 54 45 20 6c  og;.    UPDATE l
2910: 6f 67 20 53 45 54 20 61 20 3d 20 30 3b 0a 20 20  og SET a = 0;.  
2920: 7d 0a 7d 20 7b 31 20 30 20 31 7d 0a 65 78 65 63  }.} {1 0 1}.exec
2930: 73 71 6c 20 7b 0a 20 20 44 52 4f 50 20 54 41 42  sql {.  DROP TAB
2940: 4c 45 20 74 62 6c 3b 0a 20 20 44 52 4f 50 20 54  LE tbl;.  DROP T
2950: 41 42 4c 45 20 6c 6f 67 3b 0a 7d 0a 64 6f 5f 74  ABLE log;.}.do_t
2960: 65 73 74 20 74 72 69 67 67 65 72 32 2d 33 2e 33  est trigger2-3.3
2970: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
2980: 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72     PRAGMA integr
2990: 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d  ity_check;.  }.}
29a0: 20 7b 6f 6b 20 6f 6b 7d 0a 0a 23 20 53 69 6d 70   {ok ok}..# Simp
29b0: 6c 65 20 63 61 73 63 61 64 65 64 20 74 72 69 67  le cascaded trig
29c0: 67 65 72 0a 65 78 65 63 73 71 6c 20 7b 0a 20 20  ger.execsql {.  
29d0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 62 6c  CREATE TABLE tbl
29e0: 41 28 61 2c 20 62 29 3b 0a 20 20 43 52 45 41 54  A(a, b);.  CREAT
29f0: 45 20 54 41 42 4c 45 20 74 62 6c 42 28 61 2c 20  E TABLE tblB(a, 
2a00: 62 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42  b);.  CREATE TAB
2a10: 4c 45 20 74 62 6c 43 28 61 2c 20 62 29 3b 0a 0a  LE tblC(a, b);..
2a20: 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52    CREATE TRIGGER
2a30: 20 74 72 31 20 42 45 46 4f 52 45 20 49 4e 53 45   tr1 BEFORE INSE
2a40: 52 54 20 4f 4e 20 74 62 6c 41 20 42 45 47 49 4e  RT ON tblA BEGIN
2a50: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
2a60: 20 74 62 6c 42 20 76 61 6c 75 65 73 28 6e 65 77   tblB values(new
2a70: 2e 61 2c 20 6e 65 77 2e 62 29 3b 0a 20 20 45 4e  .a, new.b);.  EN
2a80: 44 3b 0a 0a 20 20 43 52 45 41 54 45 20 54 52 49  D;..  CREATE TRI
2a90: 47 47 45 52 20 74 72 32 20 42 45 46 4f 52 45 20  GGER tr2 BEFORE 
2aa0: 49 4e 53 45 52 54 20 4f 4e 20 74 62 6c 42 20 42  INSERT ON tblB B
2ab0: 45 47 49 4e 0a 20 20 20 20 49 4e 53 45 52 54 20  EGIN.    INSERT 
2ac0: 49 4e 54 4f 20 74 62 6c 43 20 76 61 6c 75 65 73  INTO tblC values
2ad0: 28 6e 65 77 2e 61 2c 20 6e 65 77 2e 62 29 3b 0a  (new.a, new.b);.
2ae0: 20 20 45 4e 44 3b 0a 7d 0a 64 6f 5f 74 65 73 74    END;.}.do_test
2af0: 20 74 72 69 67 67 65 72 32 2d 34 2e 31 20 7b 0a   trigger2-4.1 {.
2b00: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
2b10: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 41  INSERT INTO tblA
2b20: 20 76 61 6c 75 65 73 28 31 2c 20 32 29 3b 0a 20   values(1, 2);. 
2b30: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
2b40: 20 74 62 6c 41 3b 0a 20 20 20 20 53 45 4c 45 43   tblA;.    SELEC
2b50: 54 20 2a 20 46 52 4f 4d 20 74 62 6c 42 3b 0a 20  T * FROM tblB;. 
2b60: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
2b70: 20 74 62 6c 43 3b 0a 20 20 7d 0a 7d 20 7b 31 20   tblC;.  }.} {1 
2b80: 32 20 31 20 32 20 31 20 32 7d 0a 65 78 65 63 73  2 1 2 1 2}.execs
2b90: 71 6c 20 7b 0a 20 20 44 52 4f 50 20 54 41 42 4c  ql {.  DROP TABL
2ba0: 45 20 74 62 6c 41 3b 0a 20 20 44 52 4f 50 20 54  E tblA;.  DROP T
2bb0: 41 42 4c 45 20 74 62 6c 42 3b 0a 20 20 44 52 4f  ABLE tblB;.  DRO
2bc0: 50 20 54 41 42 4c 45 20 74 62 6c 43 3b 0a 7d 0a  P TABLE tblC;.}.
2bd0: 0a 23 20 53 69 6d 70 6c 65 20 72 65 63 75 72 73  .# Simple recurs
2be0: 69 76 65 20 74 72 69 67 67 65 72 0a 65 78 65 63  ive trigger.exec
2bf0: 73 71 6c 20 7b 0a 20 20 43 52 45 41 54 45 20 54  sql {.  CREATE T
2c00: 41 42 4c 45 20 74 62 6c 28 61 2c 20 62 2c 20 63  ABLE tbl(a, b, c
2c10: 29 3b 0a 20 20 43 52 45 41 54 45 20 54 52 49 47  );.  CREATE TRIG
2c20: 47 45 52 20 74 62 6c 5f 74 72 69 67 20 42 45 46  GER tbl_trig BEF
2c30: 4f 52 45 20 49 4e 53 45 52 54 20 4f 4e 20 74 62  ORE INSERT ON tb
2c40: 6c 20 0a 20 20 20 20 42 45 47 49 4e 0a 20 20 20  l .    BEGIN.   
2c50: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2c60: 62 6c 20 56 41 4c 55 45 53 20 28 6e 65 77 2e 61  bl VALUES (new.a
2c70: 2c 20 6e 65 77 2e 62 2c 20 6e 65 77 2e 63 29 3b  , new.b, new.c);
2c80: 0a 20 20 20 20 45 4e 44 3b 0a 7d 0a 64 6f 5f 74  .    END;.}.do_t
2c90: 65 73 74 20 74 72 69 67 67 65 72 32 2d 34 2e 32  est trigger2-4.2
2ca0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
2cb0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2cc0: 62 6c 20 56 41 4c 55 45 53 20 28 31 2c 20 32 2c  bl VALUES (1, 2,
2cd0: 20 33 29 3b 0a 20 20 20 20 73 65 6c 65 63 74 20   3);.    select 
2ce0: 2a 20 66 72 6f 6d 20 74 62 6c 3b 0a 20 20 7d 0a  * from tbl;.  }.
2cf0: 7d 20 7b 31 20 32 20 33 20 31 20 32 20 33 7d 0a  } {1 2 3 1 2 3}.
2d00: 65 78 65 63 73 71 6c 20 7b 0a 20 20 44 52 4f 50  execsql {.  DROP
2d10: 20 54 41 42 4c 45 20 74 62 6c 3b 0a 7d 0a 0a 23   TABLE tbl;.}..#
2d20: 20 35 2e 0a 65 78 65 63 73 71 6c 20 7b 0a 20 20   5..execsql {.  
2d30: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 62 6c  CREATE TABLE tbl
2d40: 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 43 52 45  (a, b, c);.  CRE
2d50: 41 54 45 20 54 52 49 47 47 45 52 20 74 62 6c 5f  ATE TRIGGER tbl_
2d60: 74 72 69 67 20 42 45 46 4f 52 45 20 49 4e 53 45  trig BEFORE INSE
2d70: 52 54 20 4f 4e 20 74 62 6c 20 0a 20 20 20 20 42  RT ON tbl .    B
2d80: 45 47 49 4e 0a 20 20 20 20 20 20 49 4e 53 45 52  EGIN.      INSER
2d90: 54 20 49 4e 54 4f 20 74 62 6c 20 56 41 4c 55 45  T INTO tbl VALUE
2da0: 53 20 28 31 2c 20 32 2c 20 33 29 3b 0a 20 20 20  S (1, 2, 3);.   
2db0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2dc0: 62 6c 20 56 41 4c 55 45 53 20 28 32 2c 20 32 2c  bl VALUES (2, 2,
2dd0: 20 33 29 3b 0a 20 20 20 20 20 20 55 50 44 41 54   3);.      UPDAT
2de0: 45 20 74 62 6c 20 73 65 74 20 62 20 3d 20 31 30  E tbl set b = 10
2df0: 20 57 48 45 52 45 20 61 20 3d 20 31 3b 0a 20 20   WHERE a = 1;.  
2e00: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
2e10: 74 62 6c 20 57 48 45 52 45 20 61 20 3d 20 31 3b  tbl WHERE a = 1;
2e20: 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52  .      DELETE FR
2e30: 4f 4d 20 74 62 6c 3b 0a 20 20 20 20 45 4e 44 3b  OM tbl;.    END;
2e40: 0a 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67  .}.do_test trigg
2e50: 65 72 32 2d 35 20 7b 0a 20 20 65 78 65 63 73 71  er2-5 {.  execsq
2e60: 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  l {.    INSERT I
2e70: 4e 54 4f 20 74 62 6c 20 56 41 4c 55 45 53 28 31  NTO tbl VALUES(1
2e80: 30 30 2c 20 32 30 30 2c 20 33 30 30 29 3b 0a 20  00, 200, 300);. 
2e90: 20 7d 0a 20 20 64 62 20 63 68 61 6e 67 65 73 0a   }.  db changes.
2ea0: 7d 20 7b 31 7d 0a 65 78 65 63 73 71 6c 20 7b 0a  } {1}.execsql {.
2eb0: 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74 62 6c    DROP TABLE tbl
2ec0: 3b 0a 7d 0a 0a 23 20 48 61 6e 64 6c 69 6e 67 20  ;.}..# Handling 
2ed0: 6f 66 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 62  of ON CONFLICT b
2ee0: 79 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65  y INSERT stateme
2ef0: 6e 74 73 20 69 6e 73 69 64 65 20 74 72 69 67 67  nts inside trigg
2f00: 65 72 73 0a 65 78 65 63 73 71 6c 20 7b 0a 20 20  ers.execsql {.  
2f10: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 62 6c  CREATE TABLE tbl
2f20: 20 28 61 20 70 72 69 6d 61 72 79 20 6b 65 79 2c   (a primary key,
2f30: 20 62 2c 20 63 29 3b 0a 20 20 43 52 45 41 54 45   b, c);.  CREATE
2f40: 20 54 52 49 47 47 45 52 20 61 69 5f 74 62 6c 20   TRIGGER ai_tbl 
2f50: 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f 4e 20  AFTER INSERT ON 
2f60: 74 62 6c 20 42 45 47 49 4e 0a 20 20 20 20 49 4e  tbl BEGIN.    IN
2f70: 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49  SERT OR IGNORE I
2f80: 4e 54 4f 20 74 62 6c 20 76 61 6c 75 65 73 20 28  NTO tbl values (
2f90: 6e 65 77 2e 61 2c 20 30 2c 20 30 29 3b 0a 20 20  new.a, 0, 0);.  
2fa0: 45 4e 44 3b 0a 7d 0a 64 6f 5f 74 65 73 74 20 74  END;.}.do_test t
2fb0: 72 69 67 67 65 72 32 2d 36 2e 31 61 20 7b 0a 20  rigger2-6.1a {. 
2fc0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
2fd0: 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54  EGIN;.    INSERT
2fe0: 20 49 4e 54 4f 20 74 62 6c 20 76 61 6c 75 65 73   INTO tbl values
2ff0: 20 28 31 2c 20 32 2c 20 33 29 3b 0a 20 20 20 20   (1, 2, 3);.    
3000: 53 45 4c 45 43 54 20 2a 20 66 72 6f 6d 20 74 62  SELECT * from tb
3010: 6c 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 33 7d  l;.  }.} {1 2 3}
3020: 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72  .do_test trigger
3030: 32 2d 36 2e 31 62 20 7b 0a 20 20 63 61 74 63 68  2-6.1b {.  catch
3040: 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54  sql {.    INSERT
3050: 20 4f 52 20 41 42 4f 52 54 20 49 4e 54 4f 20 74   OR ABORT INTO t
3060: 62 6c 20 76 61 6c 75 65 73 20 28 32 2c 20 32 2c  bl values (2, 2,
3070: 20 33 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 75   3);.  }.} {1 {u
3080: 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e 73 74 72  niqueness constr
3090: 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f  aint failed}}.do
30a0: 5f 74 65 73 74 20 74 72 69 67 67 65 72 32 2d 36  _test trigger2-6
30b0: 2e 31 63 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  .1c {.  execsql 
30c0: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 66  {.    SELECT * f
30d0: 72 6f 6d 20 74 62 6c 3b 0a 20 20 7d 0a 7d 20 7b  rom tbl;.  }.} {
30e0: 31 20 32 20 33 7d 0a 64 6f 5f 74 65 73 74 20 74  1 2 3}.do_test t
30f0: 72 69 67 67 65 72 32 2d 36 2e 31 64 20 7b 0a 20  rigger2-6.1d {. 
3100: 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20   catchsql {.    
3110: 49 4e 53 45 52 54 20 4f 52 20 46 41 49 4c 20 49  INSERT OR FAIL I
3120: 4e 54 4f 20 74 62 6c 20 76 61 6c 75 65 73 20 28  NTO tbl values (
3130: 32 2c 20 32 2c 20 33 29 3b 0a 20 20 7d 0a 7d 20  2, 2, 3);.  }.} 
3140: 7b 31 20 7b 75 6e 69 71 75 65 6e 65 73 73 20 63  {1 {uniqueness c
3150: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
3160: 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67  }}.do_test trigg
3170: 65 72 32 2d 36 2e 31 65 20 7b 0a 20 20 65 78 65  er2-6.1e {.  exe
3180: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
3190: 54 20 2a 20 66 72 6f 6d 20 74 62 6c 3b 0a 20 20  T * from tbl;.  
31a0: 7d 0a 7d 20 7b 31 20 32 20 33 20 32 20 32 20 33  }.} {1 2 3 2 2 3
31b0: 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65  }.do_test trigge
31c0: 72 32 2d 36 2e 31 66 20 7b 0a 20 20 65 78 65 63  r2-6.1f {.  exec
31d0: 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54  sql {.    INSERT
31e0: 20 4f 52 20 52 45 50 4c 41 43 45 20 49 4e 54 4f   OR REPLACE INTO
31f0: 20 74 62 6c 20 76 61 6c 75 65 73 20 28 32 2c 20   tbl values (2, 
3200: 32 2c 20 33 29 3b 0a 20 20 20 20 53 45 4c 45 43  2, 3);.    SELEC
3210: 54 20 2a 20 66 72 6f 6d 20 74 62 6c 3b 0a 20 20  T * from tbl;.  
3220: 7d 0a 7d 20 7b 31 20 32 20 33 20 32 20 30 20 30  }.} {1 2 3 2 0 0
3230: 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65  }.do_test trigge
3240: 72 32 2d 36 2e 31 67 20 7b 0a 20 20 63 61 74 63  r2-6.1g {.  catc
3250: 68 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52  hsql {.    INSER
3260: 54 20 4f 52 20 52 4f 4c 4c 42 41 43 4b 20 49 4e  T OR ROLLBACK IN
3270: 54 4f 20 74 62 6c 20 76 61 6c 75 65 73 20 28 33  TO tbl values (3
3280: 2c 20 32 2c 20 33 29 3b 0a 20 20 7d 0a 7d 20 7b  , 2, 3);.  }.} {
3290: 31 20 7b 75 6e 69 71 75 65 6e 65 73 73 20 63 6f  1 {uniqueness co
32a0: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d  nstraint failed}
32b0: 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65  }.do_test trigge
32c0: 72 32 2d 36 2e 31 68 20 7b 0a 20 20 65 78 65 63  r2-6.1h {.  exec
32d0: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
32e0: 20 2a 20 66 72 6f 6d 20 74 62 6c 3b 0a 20 20 7d   * from tbl;.  }
32f0: 0a 7d 20 7b 7d 0a 65 78 65 63 73 71 6c 20 7b 44  .} {}.execsql {D
3300: 45 4c 45 54 45 20 46 52 4f 4d 20 74 62 6c 7d 0a  ELETE FROM tbl}.
3310: 0a 0a 23 20 48 61 6e 64 6c 69 6e 67 20 6f 66 20  ..# Handling of 
3320: 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 62 79 20 55  ON CONFLICT by U
3330: 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73  PDATE statements
3340: 20 69 6e 73 69 64 65 20 74 72 69 67 67 65 72 73   inside triggers
3350: 0a 65 78 65 63 73 71 6c 20 7b 0a 20 20 49 4e 53  .execsql {.  INS
3360: 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 76 61 6c  ERT INTO tbl val
3370: 75 65 73 20 28 34 2c 20 32 2c 20 33 29 3b 0a 20  ues (4, 2, 3);. 
3380: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c   INSERT INTO tbl
3390: 20 76 61 6c 75 65 73 20 28 36 2c 20 33 2c 20 34   values (6, 3, 4
33a0: 29 3b 0a 20 20 43 52 45 41 54 45 20 54 52 49 47  );.  CREATE TRIG
33b0: 47 45 52 20 61 75 5f 74 62 6c 20 41 46 54 45 52  GER au_tbl AFTER
33c0: 20 55 50 44 41 54 45 20 4f 4e 20 74 62 6c 20 42   UPDATE ON tbl B
33d0: 45 47 49 4e 0a 20 20 20 20 55 50 44 41 54 45 20  EGIN.    UPDATE 
33e0: 4f 52 20 49 47 4e 4f 52 45 20 74 62 6c 20 53 45  OR IGNORE tbl SE
33f0: 54 20 61 20 3d 20 6e 65 77 2e 61 2c 20 63 20 3d  T a = new.a, c =
3400: 20 31 30 3b 0a 20 20 45 4e 44 3b 0a 7d 0a 64 6f   10;.  END;.}.do
3410: 5f 74 65 73 74 20 74 72 69 67 67 65 72 32 2d 36  _test trigger2-6
3420: 2e 32 61 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  .2a {.  execsql 
3430: 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  {.    BEGIN;.   
3440: 20 55 50 44 41 54 45 20 74 62 6c 20 53 45 54 20   UPDATE tbl SET 
3450: 61 20 3d 20 31 20 57 48 45 52 45 20 61 20 3d 20  a = 1 WHERE a = 
3460: 34 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  4;.    SELECT * 
3470: 66 72 6f 6d 20 74 62 6c 3b 0a 20 20 7d 0a 7d 20  from tbl;.  }.} 
3480: 7b 31 20 32 20 31 30 20 36 20 33 20 34 7d 0a 64  {1 2 10 6 3 4}.d
3490: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 32 2d  o_test trigger2-
34a0: 36 2e 32 62 20 7b 0a 20 20 63 61 74 63 68 73 71  6.2b {.  catchsq
34b0: 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20 4f  l {.    UPDATE O
34c0: 52 20 41 42 4f 52 54 20 74 62 6c 20 53 45 54 20  R ABORT tbl SET 
34d0: 61 20 3d 20 34 20 57 48 45 52 45 20 61 20 3d 20  a = 4 WHERE a = 
34e0: 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 75 6e 69  1;.  }.} {1 {uni
34f0: 71 75 65 6e 65 73 73 20 63 6f 6e 73 74 72 61 69  queness constrai
3500: 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74  nt failed}}.do_t
3510: 65 73 74 20 74 72 69 67 67 65 72 32 2d 36 2e 32  est trigger2-6.2
3520: 63 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  c {.  execsql {.
3530: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 66 72 6f      SELECT * fro
3540: 6d 20 74 62 6c 3b 0a 20 20 7d 0a 7d 20 7b 31 20  m tbl;.  }.} {1 
3550: 32 20 31 30 20 36 20 33 20 34 7d 0a 64 6f 5f 74  2 10 6 3 4}.do_t
3560: 65 73 74 20 74 72 69 67 67 65 72 32 2d 36 2e 32  est trigger2-6.2
3570: 64 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  d {.  catchsql {
3580: 0a 20 20 20 20 55 50 44 41 54 45 20 4f 52 20 46  .    UPDATE OR F
3590: 41 49 4c 20 74 62 6c 20 53 45 54 20 61 20 3d 20  AIL tbl SET a = 
35a0: 34 20 57 48 45 52 45 20 61 20 3d 20 31 3b 0a 20  4 WHERE a = 1;. 
35b0: 20 7d 0a 7d 20 7b 31 20 7b 75 6e 69 71 75 65 6e   }.} {1 {uniquen
35c0: 65 73 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  ess constraint f
35d0: 61 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20  ailed}}.do_test 
35e0: 74 72 69 67 67 65 72 32 2d 36 2e 32 65 20 7b 0a  trigger2-6.2e {.
35f0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
3600: 53 45 4c 45 43 54 20 2a 20 66 72 6f 6d 20 74 62  SELECT * from tb
3610: 6c 3b 0a 20 20 7d 0a 7d 20 7b 34 20 32 20 31 30  l;.  }.} {4 2 10
3620: 20 36 20 33 20 34 7d 0a 64 6f 5f 74 65 73 74 20   6 3 4}.do_test 
3630: 74 72 69 67 67 65 72 32 2d 36 2e 32 66 2e 31 20  trigger2-6.2f.1 
3640: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
3650: 20 20 55 50 44 41 54 45 20 4f 52 20 52 45 50 4c    UPDATE OR REPL
3660: 41 43 45 20 74 62 6c 20 53 45 54 20 61 20 3d 20  ACE tbl SET a = 
3670: 31 20 57 48 45 52 45 20 61 20 3d 20 34 3b 0a 20  1 WHERE a = 4;. 
3680: 20 20 20 53 45 4c 45 43 54 20 2a 20 66 72 6f 6d     SELECT * from
3690: 20 74 62 6c 3b 0a 20 20 7d 0a 7d 20 7b 31 20 33   tbl;.  }.} {1 3
36a0: 20 31 30 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69   10}.do_test tri
36b0: 67 67 65 72 32 2d 36 2e 32 66 2e 32 20 7b 0a 20  gger2-6.2f.2 {. 
36c0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49   execsql {.    I
36d0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 56  NSERT INTO tbl V
36e0: 41 4c 55 45 53 20 28 32 2c 20 33 2c 20 34 29 3b  ALUES (2, 3, 4);
36f0: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
3700: 4f 4d 20 74 62 6c 3b 0a 20 20 7d 0a 7d 20 7b 31  OM tbl;.  }.} {1
3710: 20 33 20 31 30 20 32 20 33 20 34 7d 0a 64 6f 5f   3 10 2 3 4}.do_
3720: 74 65 73 74 20 74 72 69 67 67 65 72 32 2d 36 2e  test trigger2-6.
3730: 32 67 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  2g {.  catchsql 
3740: 7b 0a 20 20 20 20 55 50 44 41 54 45 20 4f 52 20  {.    UPDATE OR 
3750: 52 4f 4c 4c 42 41 43 4b 20 74 62 6c 20 53 45 54  ROLLBACK tbl SET
3760: 20 61 20 3d 20 34 20 57 48 45 52 45 20 61 20 3d   a = 4 WHERE a =
3770: 20 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 75 6e   1;.  }.} {1 {un
3780: 69 71 75 65 6e 65 73 73 20 63 6f 6e 73 74 72 61  iqueness constra
3790: 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 64 6f 5f  int failed}}.do_
37a0: 74 65 73 74 20 74 72 69 67 67 65 72 32 2d 36 2e  test trigger2-6.
37b0: 32 68 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  2h {.  execsql {
37c0: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 66 72  .    SELECT * fr
37d0: 6f 6d 20 74 62 6c 3b 0a 20 20 7d 0a 7d 20 7b 34  om tbl;.  }.} {4
37e0: 20 32 20 33 20 36 20 33 20 34 7d 0a 65 78 65 63   2 3 6 3 4}.exec
37f0: 73 71 6c 20 7b 0a 20 20 44 52 4f 50 20 54 41 42  sql {.  DROP TAB
3800: 4c 45 20 74 62 6c 3b 0a 7d 0a 0a 23 20 37 2e 20  LE tbl;.}..# 7. 
3810: 54 72 69 67 67 65 72 73 20 6f 6e 20 76 69 65 77  Triggers on view
3820: 73 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65  s.do_test trigge
3830: 72 32 2d 37 2e 31 20 7b 0a 20 20 65 78 65 63 73  r2-7.1 {.  execs
3840: 71 6c 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41  ql {.  CREATE TA
3850: 42 4c 45 20 61 62 28 61 2c 20 62 29 3b 0a 20 20  BLE ab(a, b);.  
3860: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 64 28  CREATE TABLE cd(
3870: 63 2c 20 64 29 3b 0a 20 20 49 4e 53 45 52 54 20  c, d);.  INSERT 
3880: 49 4e 54 4f 20 61 62 20 56 41 4c 55 45 53 20 28  INTO ab VALUES (
3890: 31 2c 20 32 29 3b 0a 20 20 49 4e 53 45 52 54 20  1, 2);.  INSERT 
38a0: 49 4e 54 4f 20 61 62 20 56 41 4c 55 45 53 20 28  INTO ab VALUES (
38b0: 30 2c 20 30 29 3b 0a 20 20 49 4e 53 45 52 54 20  0, 0);.  INSERT 
38c0: 49 4e 54 4f 20 63 64 20 56 41 4c 55 45 53 20 28  INTO cd VALUES (
38d0: 33 2c 20 34 29 3b 0a 0a 20 20 43 52 45 41 54 45  3, 4);..  CREATE
38e0: 20 54 41 42 4c 45 20 74 6c 6f 67 28 69 69 20 49   TABLE tlog(ii I
38f0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
3900: 45 59 2c 20 0a 20 20 20 20 20 20 6f 6c 64 61 2c  EY, .      olda,
3910: 20 6f 6c 64 62 2c 20 6f 6c 64 63 2c 20 6f 6c 64   oldb, oldc, old
3920: 64 2c 20 6e 65 77 61 2c 20 6e 65 77 62 2c 20 6e  d, newa, newb, n
3930: 65 77 63 2c 20 6e 65 77 64 29 3b 0a 0a 20 20 43  ewc, newd);..  C
3940: 52 45 41 54 45 20 56 49 45 57 20 61 62 63 64 20  REATE VIEW abcd 
3950: 41 53 20 53 45 4c 45 43 54 20 61 2c 20 62 2c 20  AS SELECT a, b, 
3960: 63 2c 20 64 20 46 52 4f 4d 20 61 62 2c 20 63 64  c, d FROM ab, cd
3970: 3b 0a 0a 20 20 43 52 45 41 54 45 20 54 52 49 47  ;..  CREATE TRIG
3980: 47 45 52 20 62 65 66 6f 72 65 5f 75 70 64 61 74  GER before_updat
3990: 65 20 49 4e 53 54 45 41 44 20 4f 46 20 55 50 44  e INSTEAD OF UPD
39a0: 41 54 45 20 4f 4e 20 61 62 63 64 20 42 45 47 49  ATE ON abcd BEGI
39b0: 4e 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  N.    INSERT INT
39c0: 4f 20 74 6c 6f 67 20 56 41 4c 55 45 53 28 4e 55  O tlog VALUES(NU
39d0: 4c 4c 2c 20 0a 09 6f 6c 64 2e 61 2c 20 6f 6c 64  LL, ..old.a, old
39e0: 2e 62 2c 20 6f 6c 64 2e 63 2c 20 6f 6c 64 2e 64  .b, old.c, old.d
39f0: 2c 20 6e 65 77 2e 61 2c 20 6e 65 77 2e 62 2c 20  , new.a, new.b, 
3a00: 6e 65 77 2e 63 2c 20 6e 65 77 2e 64 29 3b 0a 20  new.c, new.d);. 
3a10: 20 45 4e 44 3b 0a 20 20 43 52 45 41 54 45 20 54   END;.  CREATE T
3a20: 52 49 47 47 45 52 20 61 66 74 65 72 5f 75 70 64  RIGGER after_upd
3a30: 61 74 65 20 49 4e 53 54 45 41 44 20 4f 46 20 55  ate INSTEAD OF U
3a40: 50 44 41 54 45 20 4f 4e 20 61 62 63 64 20 42 45  PDATE ON abcd BE
3a50: 47 49 4e 0a 20 20 20 20 49 4e 53 45 52 54 20 49  GIN.    INSERT I
3a60: 4e 54 4f 20 74 6c 6f 67 20 56 41 4c 55 45 53 28  NTO tlog VALUES(
3a70: 4e 55 4c 4c 2c 20 0a 09 6f 6c 64 2e 61 2c 20 6f  NULL, ..old.a, o
3a80: 6c 64 2e 62 2c 20 6f 6c 64 2e 63 2c 20 6f 6c 64  ld.b, old.c, old
3a90: 2e 64 2c 20 6e 65 77 2e 61 2c 20 6e 65 77 2e 62  .d, new.a, new.b
3aa0: 2c 20 6e 65 77 2e 63 2c 20 6e 65 77 2e 64 29 3b  , new.c, new.d);
3ab0: 0a 20 20 45 4e 44 3b 0a 0a 20 20 43 52 45 41 54  .  END;..  CREAT
3ac0: 45 20 54 52 49 47 47 45 52 20 62 65 66 6f 72 65  E TRIGGER before
3ad0: 5f 64 65 6c 65 74 65 20 49 4e 53 54 45 41 44 20  _delete INSTEAD 
3ae0: 4f 46 20 44 45 4c 45 54 45 20 4f 4e 20 61 62 63  OF DELETE ON abc
3af0: 64 20 42 45 47 49 4e 0a 20 20 20 20 49 4e 53 45  d BEGIN.    INSE
3b00: 52 54 20 49 4e 54 4f 20 74 6c 6f 67 20 56 41 4c  RT INTO tlog VAL
3b10: 55 45 53 28 4e 55 4c 4c 2c 20 0a 09 6f 6c 64 2e  UES(NULL, ..old.
3b20: 61 2c 20 6f 6c 64 2e 62 2c 20 6f 6c 64 2e 63 2c  a, old.b, old.c,
3b30: 20 6f 6c 64 2e 64 2c 20 30 2c 20 30 2c 20 30 2c   old.d, 0, 0, 0,
3b40: 20 30 29 3b 0a 20 20 45 4e 44 3b 0a 20 20 43 52   0);.  END;.  CR
3b50: 45 41 54 45 20 54 52 49 47 47 45 52 20 61 66 74  EATE TRIGGER aft
3b60: 65 72 5f 64 65 6c 65 74 65 20 49 4e 53 54 45 41  er_delete INSTEA
3b70: 44 20 4f 46 20 44 45 4c 45 54 45 20 4f 4e 20 61  D OF DELETE ON a
3b80: 62 63 64 20 42 45 47 49 4e 0a 20 20 20 20 49 4e  bcd BEGIN.    IN
3b90: 53 45 52 54 20 49 4e 54 4f 20 74 6c 6f 67 20 56  SERT INTO tlog V
3ba0: 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 0a 09 6f 6c  ALUES(NULL, ..ol
3bb0: 64 2e 61 2c 20 6f 6c 64 2e 62 2c 20 6f 6c 64 2e  d.a, old.b, old.
3bc0: 63 2c 20 6f 6c 64 2e 64 2c 20 30 2c 20 30 2c 20  c, old.d, 0, 0, 
3bd0: 30 2c 20 30 29 3b 0a 20 20 45 4e 44 3b 0a 0a 20  0, 0);.  END;.. 
3be0: 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20   CREATE TRIGGER 
3bf0: 62 65 66 6f 72 65 5f 69 6e 73 65 72 74 20 49 4e  before_insert IN
3c00: 53 54 45 41 44 20 4f 46 20 49 4e 53 45 52 54 20  STEAD OF INSERT 
3c10: 4f 4e 20 61 62 63 64 20 42 45 47 49 4e 0a 20 20  ON abcd BEGIN.  
3c20: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 6c    INSERT INTO tl
3c30: 6f 67 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20  og VALUES(NULL, 
3c40: 0a 09 30 2c 20 30 2c 20 30 2c 20 30 2c 20 6e 65  ..0, 0, 0, 0, ne
3c50: 77 2e 61 2c 20 6e 65 77 2e 62 2c 20 6e 65 77 2e  w.a, new.b, new.
3c60: 63 2c 20 6e 65 77 2e 64 29 3b 0a 20 20 45 4e 44  c, new.d);.  END
3c70: 3b 0a 20 20 20 43 52 45 41 54 45 20 54 52 49 47  ;.   CREATE TRIG
3c80: 47 45 52 20 61 66 74 65 72 5f 69 6e 73 65 72 74  GER after_insert
3c90: 20 49 4e 53 54 45 41 44 20 4f 46 20 49 4e 53 45   INSTEAD OF INSE
3ca0: 52 54 20 4f 4e 20 61 62 63 64 20 42 45 47 49 4e  RT ON abcd BEGIN
3cb0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
3cc0: 20 74 6c 6f 67 20 56 41 4c 55 45 53 28 4e 55 4c   tlog VALUES(NUL
3cd0: 4c 2c 20 0a 09 30 2c 20 30 2c 20 30 2c 20 30 2c  L, ..0, 0, 0, 0,
3ce0: 20 6e 65 77 2e 61 2c 20 6e 65 77 2e 62 2c 20 6e   new.a, new.b, n
3cf0: 65 77 2e 63 2c 20 6e 65 77 2e 64 29 3b 0a 20 20  ew.c, new.d);.  
3d00: 20 45 4e 44 3b 0a 20 20 7d 0a 7d 20 7b 7d 3b 0a   END;.  }.} {};.
3d10: 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72  .do_test trigger
3d20: 32 2d 37 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  2-7.2 {.  execsq
3d30: 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20 61  l {.    UPDATE a
3d40: 62 63 64 20 53 45 54 20 61 20 3d 20 31 30 30 2c  bcd SET a = 100,
3d50: 20 62 20 3d 20 35 2a 35 20 57 48 45 52 45 20 61   b = 5*5 WHERE a
3d60: 20 3d 20 31 3b 0a 20 20 20 20 44 45 4c 45 54 45   = 1;.    DELETE
3d70: 20 46 52 4f 4d 20 61 62 63 64 20 57 48 45 52 45   FROM abcd WHERE
3d80: 20 61 20 3d 20 31 3b 0a 20 20 20 20 49 4e 53 45   a = 1;.    INSE
3d90: 52 54 20 49 4e 54 4f 20 61 62 63 64 20 56 41 4c  RT INTO abcd VAL
3da0: 55 45 53 28 31 30 2c 20 32 30 2c 20 33 30 2c 20  UES(10, 20, 30, 
3db0: 34 30 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  40);.    SELECT 
3dc0: 2a 20 46 52 4f 4d 20 74 6c 6f 67 3b 0a 20 20 7d  * FROM tlog;.  }
3dd0: 0a 7d 20 5b 20 6c 69 73 74 20 31 20 31 20 32 20  .} [ list 1 1 2 
3de0: 33 20 34 20 31 30 30 20 32 35 20 33 20 34 20 5c  3 4 100 25 3 4 \
3df0: 0a 20 20 20 20 20 20 20 20 20 32 20 31 20 32 20  .         2 1 2 
3e00: 33 20 34 20 31 30 30 20 32 35 20 33 20 34 20 5c  3 4 100 25 3 4 \
3e10: 0a 09 20 33 20 31 20 32 20 33 20 34 20 30 20 30  .. 3 1 2 3 4 0 0
3e20: 20 30 20 30 20 5c 0a 09 20 34 20 31 20 32 20 33   0 0 \.. 4 1 2 3
3e30: 20 34 20 30 20 30 20 30 20 30 20 5c 0a 09 20 35   4 0 0 0 0 \.. 5
3e40: 20 30 20 30 20 30 20 30 20 31 30 20 32 30 20 33   0 0 0 0 10 20 3
3e50: 30 20 34 30 20 5c 0a 09 20 36 20 30 20 30 20 30  0 40 \.. 6 0 0 0
3e60: 20 30 20 31 30 20 32 30 20 33 30 20 34 30 20 5d   0 10 20 30 40 ]
3e70: 0a 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65  ..do_test trigge
3e80: 72 32 2d 37 2e 33 20 7b 0a 20 20 65 78 65 63 73  r2-7.3 {.  execs
3e90: 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20  ql {.    DELETE 
3ea0: 46 52 4f 4d 20 74 6c 6f 67 3b 0a 20 20 20 20 49  FROM tlog;.    I
3eb0: 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63 64 20  NSERT INTO abcd 
3ec0: 56 41 4c 55 45 53 28 31 30 2c 20 32 30 2c 20 33  VALUES(10, 20, 3
3ed0: 30 2c 20 34 30 29 3b 0a 20 20 20 20 55 50 44 41  0, 40);.    UPDA
3ee0: 54 45 20 61 62 63 64 20 53 45 54 20 61 20 3d 20  TE abcd SET a = 
3ef0: 31 30 30 2c 20 62 20 3d 20 35 2a 35 20 57 48 45  100, b = 5*5 WHE
3f00: 52 45 20 61 20 3d 20 31 3b 0a 20 20 20 20 44 45  RE a = 1;.    DE
3f10: 4c 45 54 45 20 46 52 4f 4d 20 61 62 63 64 20 57  LETE FROM abcd W
3f20: 48 45 52 45 20 61 20 3d 20 31 3b 0a 20 20 20 20  HERE a = 1;.    
3f30: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 6c  SELECT * FROM tl
3f40: 6f 67 3b 0a 20 20 7d 0a 7d 20 5b 20 6c 69 73 74  og;.  }.} [ list
3f50: 20 5c 0a 20 20 20 31 20 30 20 30 20 30 20 30 20   \.   1 0 0 0 0 
3f60: 31 30 20 32 30 20 33 30 20 34 30 20 5c 0a 20 20  10 20 30 40 \.  
3f70: 20 32 20 30 20 30 20 30 20 30 20 31 30 20 32 30   2 0 0 0 0 10 20
3f80: 20 33 30 20 34 30 20 5c 0a 20 20 20 33 20 31 20   30 40 \.   3 1 
3f90: 32 20 33 20 34 20 31 30 30 20 32 35 20 33 20 34  2 3 4 100 25 3 4
3fa0: 20 5c 0a 20 20 20 34 20 31 20 32 20 33 20 34 20   \.   4 1 2 3 4 
3fb0: 31 30 30 20 32 35 20 33 20 34 20 5c 0a 20 20 20  100 25 3 4 \.   
3fc0: 35 20 31 20 32 20 33 20 34 20 30 20 30 20 30 20  5 1 2 3 4 0 0 0 
3fd0: 30 20 5c 0a 20 20 20 36 20 31 20 32 20 33 20 34  0 \.   6 1 2 3 4
3fe0: 20 30 20 30 20 30 20 30 20 5c 0a 5d 0a 64 6f 5f   0 0 0 0 \.].do_
3ff0: 74 65 73 74 20 74 72 69 67 67 65 72 32 2d 37 2e  test trigger2-7.
4000: 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  4 {.  execsql {.
4010: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
4020: 74 6c 6f 67 3b 0a 20 20 20 20 44 45 4c 45 54 45  tlog;.    DELETE
4030: 20 46 52 4f 4d 20 61 62 63 64 20 57 48 45 52 45   FROM abcd WHERE
4040: 20 61 20 3d 20 31 3b 0a 20 20 20 20 49 4e 53 45   a = 1;.    INSE
4050: 52 54 20 49 4e 54 4f 20 61 62 63 64 20 56 41 4c  RT INTO abcd VAL
4060: 55 45 53 28 31 30 2c 20 32 30 2c 20 33 30 2c 20  UES(10, 20, 30, 
4070: 34 30 29 3b 0a 20 20 20 20 55 50 44 41 54 45 20  40);.    UPDATE 
4080: 61 62 63 64 20 53 45 54 20 61 20 3d 20 31 30 30  abcd SET a = 100
4090: 2c 20 62 20 3d 20 35 2a 35 20 57 48 45 52 45 20  , b = 5*5 WHERE 
40a0: 61 20 3d 20 31 3b 0a 20 20 20 20 53 45 4c 45 43  a = 1;.    SELEC
40b0: 54 20 2a 20 46 52 4f 4d 20 74 6c 6f 67 3b 0a 20  T * FROM tlog;. 
40c0: 20 7d 0a 7d 20 5b 20 6c 69 73 74 20 5c 0a 20 20   }.} [ list \.  
40d0: 20 31 20 31 20 32 20 33 20 34 20 30 20 30 20 30   1 1 2 3 4 0 0 0
40e0: 20 30 20 5c 0a 20 20 20 32 20 31 20 32 20 33 20   0 \.   2 1 2 3 
40f0: 34 20 30 20 30 20 30 20 30 20 5c 0a 20 20 20 33  4 0 0 0 0 \.   3
4100: 20 30 20 30 20 30 20 30 20 31 30 20 32 30 20 33   0 0 0 0 10 20 3
4110: 30 20 34 30 20 5c 0a 20 20 20 34 20 30 20 30 20  0 40 \.   4 0 0 
4120: 30 20 30 20 31 30 20 32 30 20 33 30 20 34 30 20  0 0 10 20 30 40 
4130: 5c 0a 20 20 20 35 20 31 20 32 20 33 20 34 20 31  \.   5 1 2 3 4 1
4140: 30 30 20 32 35 20 33 20 34 20 5c 0a 20 20 20 36  00 25 3 4 \.   6
4150: 20 31 20 32 20 33 20 34 20 31 30 30 20 32 35 20   1 2 3 4 100 25 
4160: 33 20 34 20 5c 0a 5d 0a 0a 64 6f 5f 74 65 73 74  3 4 \.]..do_test
4170: 20 74 72 69 67 67 65 72 32 2d 38 2e 31 20 7b 0a   trigger2-8.1 {.
4180: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
4190: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
41a0: 61 2c 62 2c 63 29 3b 0a 20 20 20 20 49 4e 53 45  a,b,c);.    INSE
41b0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
41c0: 53 28 31 2c 32 2c 33 29 3b 0a 20 20 20 20 43 52  S(1,2,3);.    CR
41d0: 45 41 54 45 20 56 49 45 57 20 76 31 20 41 53 0a  EATE VIEW v1 AS.
41e0: 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b 62        SELECT a+b
41f0: 20 41 53 20 78 2c 20 62 2b 63 20 41 53 20 79 2c   AS x, b+c AS y,
4200: 20 61 2b 63 20 41 53 20 7a 20 46 52 4f 4d 20 74   a+c AS z FROM t
4210: 31 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  1;.    SELECT * 
4220: 46 52 4f 4d 20 76 31 3b 0a 20 20 7d 0a 7d 20 7b  FROM v1;.  }.} {
4230: 33 20 35 20 34 7d 0a 64 6f 5f 74 65 73 74 20 74  3 5 4}.do_test t
4240: 72 69 67 67 65 72 32 2d 38 2e 32 20 7b 0a 20 20  rigger2-8.2 {.  
4250: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
4260: 45 41 54 45 20 54 41 42 4c 45 20 76 31 6c 6f 67  EATE TABLE v1log
4270: 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 3b 0a 20  (a,b,c,d,e,f);. 
4280: 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45     CREATE TRIGGE
4290: 52 20 72 31 20 49 4e 53 54 45 41 44 20 4f 46 20  R r1 INSTEAD OF 
42a0: 44 45 4c 45 54 45 20 4f 4e 20 76 31 20 42 45 47  DELETE ON v1 BEG
42b0: 49 4e 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  IN.      INSERT 
42c0: 49 4e 54 4f 20 76 31 6c 6f 67 20 56 41 4c 55 45  INTO v1log VALUE
42d0: 53 28 4f 4c 44 2e 78 2c 4e 55 4c 4c 2c 4f 4c 44  S(OLD.x,NULL,OLD
42e0: 2e 79 2c 4e 55 4c 4c 2c 4f 4c 44 2e 7a 2c 4e 55  .y,NULL,OLD.z,NU
42f0: 4c 4c 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20  LL);.    END;.  
4300: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 76 31    DELETE FROM v1
4310: 20 57 48 45 52 45 20 78 3d 31 3b 0a 20 20 20 20   WHERE x=1;.    
4320: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 76 31  SELECT * FROM v1
4330: 6c 6f 67 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f  log;.  }.} {}.do
4340: 5f 74 65 73 74 20 74 72 69 67 67 65 72 32 2d 38  _test trigger2-8
4350: 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
4360: 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  .    DELETE FROM
4370: 20 76 31 20 57 48 45 52 45 20 78 3d 33 3b 0a 20   v1 WHERE x=3;. 
4380: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
4390: 20 76 31 6c 6f 67 3b 0a 20 20 7d 0a 7d 20 7b 33   v1log;.  }.} {3
43a0: 20 7b 7d 20 35 20 7b 7d 20 34 20 7b 7d 7d 0a 64   {} 5 {} 4 {}}.d
43b0: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 32 2d  o_test trigger2-
43c0: 38 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  8.4 {.  execsql 
43d0: 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  {.    INSERT INT
43e0: 4f 20 74 31 20 56 41 4c 55 45 53 28 34 2c 35 2c  O t1 VALUES(4,5,
43f0: 36 29 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46  6);.    DELETE F
4400: 52 4f 4d 20 76 31 6c 6f 67 3b 0a 20 20 20 20 44  ROM v1log;.    D
4410: 45 4c 45 54 45 20 46 52 4f 4d 20 76 31 20 57 48  ELETE FROM v1 WH
4420: 45 52 45 20 79 3d 31 31 3b 0a 20 20 20 20 53 45  ERE y=11;.    SE
4430: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 76 31 6c 6f  LECT * FROM v1lo
4440: 67 3b 0a 20 20 7d 0a 7d 20 7b 39 20 7b 7d 20 31  g;.  }.} {9 {} 1
4450: 31 20 7b 7d 20 31 30 20 7b 7d 7d 0a 64 6f 5f 74  1 {} 10 {}}.do_t
4460: 65 73 74 20 74 72 69 67 67 65 72 32 2d 38 2e 35  est trigger2-8.5
4470: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
4480: 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45     CREATE TRIGGE
4490: 52 20 72 32 20 49 4e 53 54 45 41 44 20 4f 46 20  R r2 INSTEAD OF 
44a0: 49 4e 53 45 52 54 20 4f 4e 20 76 31 20 42 45 47  INSERT ON v1 BEG
44b0: 49 4e 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  IN.      INSERT 
44c0: 49 4e 54 4f 20 76 31 6c 6f 67 20 56 41 4c 55 45  INTO v1log VALUE
44d0: 53 28 4e 55 4c 4c 2c 4e 45 57 2e 78 2c 4e 55 4c  S(NULL,NEW.x,NUL
44e0: 4c 2c 4e 45 57 2e 79 2c 4e 55 4c 4c 2c 4e 45 57  L,NEW.y,NULL,NEW
44f0: 2e 7a 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20  .z);.    END;.  
4500: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 76 31    DELETE FROM v1
4510: 6c 6f 67 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  log;.    INSERT 
4520: 49 4e 54 4f 20 76 31 20 56 41 4c 55 45 53 28 31  INTO v1 VALUES(1
4530: 2c 32 2c 33 29 3b 0a 20 20 20 20 53 45 4c 45 43  ,2,3);.    SELEC
4540: 54 20 2a 20 46 52 4f 4d 20 76 31 6c 6f 67 3b 0a  T * FROM v1log;.
4550: 20 20 7d 0a 7d 20 7b 7b 7d 20 31 20 7b 7d 20 32    }.} {{} 1 {} 2
4560: 20 7b 7d 20 33 7d 0a 64 6f 5f 74 65 73 74 20 74   {} 3}.do_test t
4570: 72 69 67 67 65 72 32 2d 38 2e 36 20 7b 0a 20 20  rigger2-8.6 {.  
4580: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
4590: 45 41 54 45 20 54 52 49 47 47 45 52 20 72 33 20  EATE TRIGGER r3 
45a0: 49 4e 53 54 45 41 44 20 4f 46 20 55 50 44 41 54  INSTEAD OF UPDAT
45b0: 45 20 4f 4e 20 76 31 20 42 45 47 49 4e 0a 20 20  E ON v1 BEGIN.  
45c0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
45d0: 76 31 6c 6f 67 20 56 41 4c 55 45 53 28 4f 4c 44  v1log VALUES(OLD
45e0: 2e 78 2c 4e 45 57 2e 78 2c 4f 4c 44 2e 79 2c 4e  .x,NEW.x,OLD.y,N
45f0: 45 57 2e 79 2c 4f 4c 44 2e 7a 2c 4e 45 57 2e 7a  EW.y,OLD.z,NEW.z
4600: 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 20 20  );.    END;.    
4610: 44 45 4c 45 54 45 20 46 52 4f 4d 20 76 31 6c 6f  DELETE FROM v1lo
4620: 67 3b 0a 20 20 20 20 55 50 44 41 54 45 20 76 31  g;.    UPDATE v1
4630: 20 53 45 54 20 78 3d 78 2b 31 30 30 2c 20 79 3d   SET x=x+100, y=
4640: 79 2b 32 30 30 2c 20 7a 3d 7a 2b 33 30 30 3b 0a  y+200, z=z+300;.
4650: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
4660: 4d 20 76 31 6c 6f 67 3b 0a 20 20 7d 0a 7d 20 7b  M v1log;.  }.} {
4670: 33 20 31 30 33 20 35 20 32 30 35 20 34 20 33 30  3 103 5 205 4 30
4680: 34 20 39 20 31 30 39 20 31 31 20 32 31 31 20 31  4 9 109 11 211 1
4690: 30 20 33 31 30 7d 0a 0a 64 6f 5f 74 65 73 74 20  0 310}..do_test 
46a0: 74 72 69 67 67 65 72 32 2d 39 2e 39 20 7b 0a 20  trigger2-9.9 {. 
46b0: 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41   execsql {PRAGMA
46c0: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
46d0: 7d 0a 7d 20 7b 6f 6b 20 6f 6b 7d 0a 0a 66 69 6e  }.} {ok ok}..fin
46e0: 69 73 68 5f 74 65 73 74 0a                       ish_test.