/ Hex Artifact Content
Login

Artifact cbc8fe3775904d5b49ff26888aa39df7341fae7c:


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 26 20 38 2e  ents.#.# 7. & 8.
06c0: 20 54 72 69 67 67 65 72 73 20 6f 6e 20 76 69 65   Triggers on vie
06d0: 77 73 20 66 69 72 65 20 63 6f 72 72 65 63 74 6c  ws fire correctl
06e0: 79 2e 0a 23 0a 0a 73 65 74 20 74 65 73 74 64 69  y..#..set testdi
06f0: 72 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20  r [file dirname 
0700: 24 61 72 67 76 30 5d 0a 73 6f 75 72 63 65 20 24  $argv0].source $
0710: 74 65 73 74 64 69 72 2f 74 65 73 74 65 72 2e 74  testdir/tester.t
0720: 63 6c 0a 69 66 63 61 70 61 62 6c 65 20 7b 21 74  cl.ifcapable {!t
0730: 72 69 67 67 65 72 7d 20 7b 0a 20 20 66 69 6e 69  rigger} {.  fini
0740: 73 68 5f 74 65 73 74 0a 20 20 72 65 74 75 72 6e  sh_test.  return
0750: 0a 7d 0a 0a 23 20 31 2e 0a 69 66 63 61 70 61 62  .}..# 1..ifcapab
0760: 6c 65 20 73 75 62 71 75 65 72 79 20 7b 0a 20 20  le subquery {.  
0770: 73 65 74 20 69 69 20 30 0a 20 20 66 6f 72 65 61  set ii 0.  forea
0780: 63 68 20 74 62 6c 5f 64 65 66 6e 20 7b 0a 20 20  ch tbl_defn {.  
0790: 09 7b 43 52 45 41 54 45 20 54 45 4d 50 20 54 41  .{CREATE TEMP TA
07a0: 42 4c 45 20 74 62 6c 20 28 61 2c 20 62 29 3b 7d  BLE tbl (a, b);}
07b0: 20 0a 20 20 09 7b 43 52 45 41 54 45 20 54 41 42   .  .{CREATE TAB
07c0: 4c 45 20 74 62 6c 20 28 61 2c 20 62 29 3b 7d 20  LE tbl (a, b);} 
07d0: 0a 20 20 09 7b 43 52 45 41 54 45 20 54 41 42 4c  .  .{CREATE TABL
07e0: 45 20 74 62 6c 20 28 61 20 49 4e 54 45 47 45 52  E tbl (a INTEGER
07f0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29   PRIMARY KEY, b)
0800: 3b 7d 20 0a 20 20 09 7b 43 52 45 41 54 45 20 54  ;} .  .{CREATE T
0810: 45 4d 50 4f 52 41 52 59 20 54 41 42 4c 45 20 74  EMPORARY TABLE t
0820: 62 6c 20 28 61 20 49 4e 54 45 47 45 52 20 50 52  bl (a INTEGER PR
0830: 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 7d 20  IMARY KEY, b);} 
0840: 0a 20 20 20 20 20 20 20 20 20 20 7b 43 52 45 41  .          {CREA
0850: 54 45 20 54 41 42 4c 45 20 74 62 6c 20 28 61 2c  TE TABLE tbl (a,
0860: 20 62 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b   b PRIMARY KEY);
0870: 7d 20 0a 20 20 09 7b 43 52 45 41 54 45 20 54 41  } .  .{CREATE TA
0880: 42 4c 45 20 74 62 6c 20 28 61 2c 20 62 29 3b 20  BLE tbl (a, b); 
0890: 43 52 45 41 54 45 20 49 4e 44 45 58 20 74 62 6c  CREATE INDEX tbl
08a0: 5f 69 64 78 20 4f 4e 20 74 62 6c 28 62 29 3b 7d  _idx ON tbl(b);}
08b0: 20 0a 20 20 09 7b 43 52 45 41 54 45 20 54 45 4d   .  .{CREATE TEM
08c0: 50 20 54 41 42 4c 45 20 74 62 6c 20 28 61 2c 20  P TABLE tbl (a, 
08d0: 62 29 3b 20 43 52 45 41 54 45 20 49 4e 44 45 58  b); CREATE INDEX
08e0: 20 74 62 6c 5f 69 64 78 20 4f 4e 20 74 62 6c 28   tbl_idx ON tbl(
08f0: 62 29 3b 7d 20 0a 20 20 7d 20 7b 0a 20 20 20 20  b);} .  } {.    
0900: 69 6e 63 72 20 69 69 0a 20 20 20 20 63 61 74 63  incr ii.    catc
0910: 68 73 71 6c 20 7b 20 44 52 4f 50 20 49 4e 44 45  hsql { DROP INDE
0920: 58 20 74 62 6c 5f 69 64 78 3b 20 7d 0a 20 20 20  X tbl_idx; }.   
0930: 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20   catchsql {.    
0940: 20 20 44 52 4f 50 20 54 41 42 4c 45 20 72 6c 6f    DROP TABLE rlo
0950: 67 3b 0a 20 20 20 20 20 20 44 52 4f 50 20 54 41  g;.      DROP TA
0960: 42 4c 45 20 63 6c 6f 67 3b 0a 20 20 20 20 20 20  BLE clog;.      
0970: 44 52 4f 50 20 54 41 42 4c 45 20 74 62 6c 3b 0a  DROP TABLE tbl;.
0980: 20 20 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45        DROP TABLE
0990: 20 6f 74 68 65 72 5f 74 62 6c 3b 0a 20 20 20 20   other_tbl;.    
09a0: 7d 0a 20 20 0a 20 20 20 20 65 78 65 63 73 71 6c  }.  .    execsql
09b0: 20 24 74 62 6c 5f 64 65 66 6e 0a 20 20 0a 20 20   $tbl_defn.  .  
09c0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
09d0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62    INSERT INTO tb
09e0: 6c 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a  l VALUES(1, 2);.
09f0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
0a00: 4f 20 74 62 6c 20 56 41 4c 55 45 53 28 33 2c 20  O tbl VALUES(3, 
0a10: 34 29 3b 0a 20 20 0a 20 20 20 20 20 20 43 52 45  4);.  .      CRE
0a20: 41 54 45 20 54 41 42 4c 45 20 72 6c 6f 67 20 28  ATE TABLE rlog (
0a30: 69 64 78 2c 20 6f 6c 64 5f 61 2c 20 6f 6c 64 5f  idx, old_a, old_
0a40: 62 2c 20 64 62 5f 73 75 6d 5f 61 2c 20 64 62 5f  b, db_sum_a, db_
0a50: 73 75 6d 5f 62 2c 20 6e 65 77 5f 61 2c 20 6e 65  sum_b, new_a, ne
0a60: 77 5f 62 29 3b 0a 20 20 20 20 20 20 43 52 45 41  w_b);.      CREA
0a70: 54 45 20 54 41 42 4c 45 20 63 6c 6f 67 20 28 69  TE TABLE clog (i
0a80: 64 78 2c 20 6f 6c 64 5f 61 2c 20 6f 6c 64 5f 62  dx, old_a, old_b
0a90: 2c 20 64 62 5f 73 75 6d 5f 61 2c 20 64 62 5f 73  , db_sum_a, db_s
0aa0: 75 6d 5f 62 2c 20 6e 65 77 5f 61 2c 20 6e 65 77  um_b, new_a, new
0ab0: 5f 62 29 3b 0a 20 20 0a 20 20 20 20 20 20 43 52  _b);.  .      CR
0ac0: 45 41 54 45 20 54 52 49 47 47 45 52 20 62 65 66  EATE TRIGGER bef
0ad0: 6f 72 65 5f 75 70 64 61 74 65 5f 72 6f 77 20 42  ore_update_row B
0ae0: 45 46 4f 52 45 20 55 50 44 41 54 45 20 4f 4e 20  EFORE UPDATE ON 
0af0: 74 62 6c 20 46 4f 52 20 45 41 43 48 20 52 4f 57  tbl FOR EACH ROW
0b00: 20 0a 20 20 20 20 20 20 20 20 42 45 47 49 4e 0a   .        BEGIN.
0b10: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
0b20: 4e 54 4f 20 72 6c 6f 67 20 56 41 4c 55 45 53 20  NTO rlog VALUES 
0b30: 28 20 28 53 45 4c 45 43 54 20 63 6f 61 6c 65 73  ( (SELECT coales
0b40: 63 65 28 6d 61 78 28 69 64 78 29 2c 30 29 20 2b  ce(max(idx),0) +
0b50: 20 31 20 46 52 4f 4d 20 72 6c 6f 67 29 2c 20 0a   1 FROM rlog), .
0b60: 20 20 09 20 20 6f 6c 64 2e 61 2c 20 6f 6c 64 2e    .  old.a, old.
0b70: 62 2c 20 0a 20 20 09 20 20 28 53 45 4c 45 43 54  b, .  .  (SELECT
0b80: 20 73 75 6d 28 61 29 20 46 52 4f 4d 20 74 62 6c   sum(a) FROM tbl
0b90: 29 2c 20 28 53 45 4c 45 43 54 20 73 75 6d 28 62  ), (SELECT sum(b
0ba0: 29 20 46 52 4f 4d 20 74 62 6c 29 2c 20 0a 20 20  ) FROM tbl), .  
0bb0: 09 20 20 6e 65 77 2e 61 2c 20 6e 65 77 2e 62 29  .  new.a, new.b)
0bc0: 3b 0a 20 20 20 20 20 20 45 4e 44 3b 0a 20 20 0a  ;.      END;.  .
0bd0: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 52 49        CREATE TRI
0be0: 47 47 45 52 20 61 66 74 65 72 5f 75 70 64 61 74  GGER after_updat
0bf0: 65 5f 72 6f 77 20 41 46 54 45 52 20 55 50 44 41  e_row AFTER UPDA
0c00: 54 45 20 4f 4e 20 74 62 6c 20 46 4f 52 20 45 41  TE ON tbl FOR EA
0c10: 43 48 20 52 4f 57 20 0a 20 20 20 20 20 20 20 20  CH ROW .        
0c20: 42 45 47 49 4e 0a 20 20 20 20 20 20 20 20 49 4e  BEGIN.        IN
0c30: 53 45 52 54 20 49 4e 54 4f 20 72 6c 6f 67 20 56  SERT INTO rlog V
0c40: 41 4c 55 45 53 20 28 20 28 53 45 4c 45 43 54 20  ALUES ( (SELECT 
0c50: 63 6f 61 6c 65 73 63 65 28 6d 61 78 28 69 64 78  coalesce(max(idx
0c60: 29 2c 30 29 20 2b 20 31 20 46 52 4f 4d 20 72 6c  ),0) + 1 FROM rl
0c70: 6f 67 29 2c 20 0a 20 20 09 20 20 6f 6c 64 2e 61  og), .  .  old.a
0c80: 2c 20 6f 6c 64 2e 62 2c 20 0a 20 20 09 20 20 28  , old.b, .  .  (
0c90: 53 45 4c 45 43 54 20 73 75 6d 28 61 29 20 46 52  SELECT sum(a) FR
0ca0: 4f 4d 20 74 62 6c 29 2c 20 28 53 45 4c 45 43 54  OM tbl), (SELECT
0cb0: 20 73 75 6d 28 62 29 20 46 52 4f 4d 20 74 62 6c   sum(b) FROM tbl
0cc0: 29 2c 20 0a 20 20 09 20 20 6e 65 77 2e 61 2c 20  ), .  .  new.a, 
0cd0: 6e 65 77 2e 62 29 3b 0a 20 20 20 20 20 20 45 4e  new.b);.      EN
0ce0: 44 3b 0a 20 20 0a 20 20 20 20 20 20 43 52 45 41  D;.  .      CREA
0cf0: 54 45 20 54 52 49 47 47 45 52 20 63 6f 6e 64 69  TE TRIGGER condi
0d00: 74 69 6f 6e 61 6c 5f 75 70 64 61 74 65 5f 72 6f  tional_update_ro
0d10: 77 20 41 46 54 45 52 20 55 50 44 41 54 45 20 4f  w AFTER UPDATE O
0d20: 4e 20 74 62 6c 20 46 4f 52 20 45 41 43 48 20 52  N tbl FOR EACH R
0d30: 4f 57 0a 20 20 20 20 20 20 20 20 57 48 45 4e 20  OW.        WHEN 
0d40: 6f 6c 64 2e 61 20 3d 20 31 0a 20 20 20 20 20 20  old.a = 1.      
0d50: 20 20 42 45 47 49 4e 0a 20 20 20 20 20 20 20 20    BEGIN.        
0d60: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 6c 6f 67  INSERT INTO clog
0d70: 20 56 41 4c 55 45 53 20 28 20 28 53 45 4c 45 43   VALUES ( (SELEC
0d80: 54 20 63 6f 61 6c 65 73 63 65 28 6d 61 78 28 69  T coalesce(max(i
0d90: 64 78 29 2c 30 29 20 2b 20 31 20 46 52 4f 4d 20  dx),0) + 1 FROM 
0da0: 63 6c 6f 67 29 2c 20 0a 20 20 09 20 20 6f 6c 64  clog), .  .  old
0db0: 2e 61 2c 20 6f 6c 64 2e 62 2c 20 0a 20 20 09 20  .a, old.b, .  . 
0dc0: 20 28 53 45 4c 45 43 54 20 73 75 6d 28 61 29 20   (SELECT sum(a) 
0dd0: 46 52 4f 4d 20 74 62 6c 29 2c 20 28 53 45 4c 45  FROM tbl), (SELE
0de0: 43 54 20 73 75 6d 28 62 29 20 46 52 4f 4d 20 74  CT sum(b) FROM t
0df0: 62 6c 29 2c 20 0a 20 20 09 20 20 6e 65 77 2e 61  bl), .  .  new.a
0e00: 2c 20 6e 65 77 2e 62 29 3b 0a 20 20 20 20 20 20  , new.b);.      
0e10: 45 4e 44 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  END;.    }.  .  
0e20: 20 20 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65    do_test trigge
0e30: 72 32 2d 31 2e 24 69 69 2e 31 20 7b 0a 20 20 20  r2-1.$ii.1 {.   
0e40: 20 20 20 73 65 74 20 72 20 7b 7d 0a 20 20 20 20     set r {}.    
0e50: 20 20 66 6f 72 65 61 63 68 20 76 20 5b 65 78 65    foreach v [exe
0e60: 63 73 71 6c 20 7b 20 0a 20 20 20 20 20 20 20 20  csql { .        
0e70: 55 50 44 41 54 45 20 74 62 6c 20 53 45 54 20 61  UPDATE tbl SET a
0e80: 20 3d 20 61 20 2a 20 31 30 2c 20 62 20 3d 20 62   = a * 10, b = b
0e90: 20 2a 20 31 30 3b 0a 20 20 20 20 20 20 20 20 53   * 10;.        S
0ea0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 72 6c 6f  ELECT * FROM rlo
0eb0: 67 20 4f 52 44 45 52 20 42 59 20 69 64 78 3b 0a  g ORDER BY idx;.
0ec0: 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a          SELECT *
0ed0: 20 46 52 4f 4d 20 63 6c 6f 67 20 4f 52 44 45 52   FROM clog ORDER
0ee0: 20 42 59 20 69 64 78 3b 0a 20 20 20 20 20 20 7d   BY idx;.      }
0ef0: 5d 20 7b 0a 20 20 20 20 20 20 20 20 6c 61 70 70  ] {.        lapp
0f00: 65 6e 64 20 72 20 5b 65 78 70 72 20 7b 69 6e 74  end r [expr {int
0f10: 28 24 76 29 7d 5d 0a 20 20 20 20 20 20 7d 0a 20  ($v)}].      }. 
0f20: 20 20 20 20 20 73 65 74 20 72 0a 20 20 20 20 7d       set r.    }
0f30: 20 5b 6c 69 73 74 20 31 20 31 20 32 20 20 34 20   [list 1 1 2  4 
0f40: 20 36 20 31 30 20 32 30 20 5c 0a 20 20 20 20 20   6 10 20 \.     
0f50: 20 20 20 20 20 20 20 32 20 31 20 32 20 31 33 20         2 1 2 13 
0f60: 32 34 20 31 30 20 32 30 20 5c 0a 20 20 09 20 20  24 10 20 \.  .  
0f70: 20 20 33 20 33 20 34 20 31 33 20 32 34 20 33 30    3 3 4 13 24 30
0f80: 20 34 30 20 5c 0a 20 20 09 20 20 20 20 34 20 33   40 \.  .    4 3
0f90: 20 34 20 34 30 20 36 30 20 33 30 20 34 30 20 5c   4 40 60 30 40 \
0fa0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 31 20 31  .            1 1
0fb0: 20 32 20 31 33 20 32 34 20 31 30 20 32 30 20 5d   2 13 24 10 20 ]
0fc0: 0a 20 20 0a 20 20 20 20 65 78 65 63 73 71 6c 20  .  .    execsql 
0fd0: 7b 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46  {.      DELETE F
0fe0: 52 4f 4d 20 72 6c 6f 67 3b 0a 20 20 20 20 20 20  ROM rlog;.      
0ff0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 62 6c 3b  DELETE FROM tbl;
1000: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
1010: 54 4f 20 74 62 6c 20 56 41 4c 55 45 53 20 28 31  TO tbl VALUES (1
1020: 30 30 2c 20 31 30 30 29 3b 0a 20 20 20 20 20 20  00, 100);.      
1030: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20  INSERT INTO tbl 
1040: 56 41 4c 55 45 53 20 28 33 30 30 2c 20 32 30 30  VALUES (300, 200
1050: 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  );.      CREATE 
1060: 54 52 49 47 47 45 52 20 64 65 6c 65 74 65 5f 62  TRIGGER delete_b
1070: 65 66 6f 72 65 5f 72 6f 77 20 42 45 46 4f 52 45  efore_row BEFORE
1080: 20 44 45 4c 45 54 45 20 4f 4e 20 74 62 6c 20 46   DELETE ON tbl F
1090: 4f 52 20 45 41 43 48 20 52 4f 57 0a 20 20 20 20  OR EACH ROW.    
10a0: 20 20 20 20 42 45 47 49 4e 0a 20 20 20 20 20 20      BEGIN.      
10b0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 72 6c    INSERT INTO rl
10c0: 6f 67 20 56 41 4c 55 45 53 20 28 20 28 53 45 4c  og VALUES ( (SEL
10d0: 45 43 54 20 63 6f 61 6c 65 73 63 65 28 6d 61 78  ECT coalesce(max
10e0: 28 69 64 78 29 2c 30 29 20 2b 20 31 20 46 52 4f  (idx),0) + 1 FRO
10f0: 4d 20 72 6c 6f 67 29 2c 20 0a 20 20 09 20 20 6f  M rlog), .  .  o
1100: 6c 64 2e 61 2c 20 6f 6c 64 2e 62 2c 20 0a 20 20  ld.a, old.b, .  
1110: 09 20 20 28 53 45 4c 45 43 54 20 73 75 6d 28 61  .  (SELECT sum(a
1120: 29 20 46 52 4f 4d 20 74 62 6c 29 2c 20 28 53 45  ) FROM tbl), (SE
1130: 4c 45 43 54 20 73 75 6d 28 62 29 20 46 52 4f 4d  LECT sum(b) FROM
1140: 20 74 62 6c 29 2c 20 0a 20 20 09 20 20 30 2c 20   tbl), .  .  0, 
1150: 30 29 3b 0a 20 20 20 20 20 20 45 4e 44 3b 0a 20  0);.      END;. 
1160: 20 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54   .      CREATE T
1170: 52 49 47 47 45 52 20 64 65 6c 65 74 65 5f 61 66  RIGGER delete_af
1180: 74 65 72 5f 72 6f 77 20 41 46 54 45 52 20 44 45  ter_row AFTER DE
1190: 4c 45 54 45 20 4f 4e 20 74 62 6c 20 46 4f 52 20  LETE ON tbl FOR 
11a0: 45 41 43 48 20 52 4f 57 0a 20 20 20 20 20 20 20  EACH ROW.       
11b0: 20 42 45 47 49 4e 0a 20 20 20 20 20 20 20 20 49   BEGIN.        I
11c0: 4e 53 45 52 54 20 49 4e 54 4f 20 72 6c 6f 67 20  NSERT INTO rlog 
11d0: 56 41 4c 55 45 53 20 28 20 28 53 45 4c 45 43 54  VALUES ( (SELECT
11e0: 20 63 6f 61 6c 65 73 63 65 28 6d 61 78 28 69 64   coalesce(max(id
11f0: 78 29 2c 30 29 20 2b 20 31 20 46 52 4f 4d 20 72  x),0) + 1 FROM r
1200: 6c 6f 67 29 2c 20 0a 20 20 09 20 20 6f 6c 64 2e  log), .  .  old.
1210: 61 2c 20 6f 6c 64 2e 62 2c 20 0a 20 20 09 20 20  a, old.b, .  .  
1220: 28 53 45 4c 45 43 54 20 73 75 6d 28 61 29 20 46  (SELECT sum(a) F
1230: 52 4f 4d 20 74 62 6c 29 2c 20 28 53 45 4c 45 43  ROM tbl), (SELEC
1240: 54 20 73 75 6d 28 62 29 20 46 52 4f 4d 20 74 62  T sum(b) FROM tb
1250: 6c 29 2c 20 0a 20 20 09 20 20 30 2c 20 30 29 3b  l), .  .  0, 0);
1260: 0a 20 20 20 20 20 20 45 4e 44 3b 0a 20 20 20 20  .      END;.    
1270: 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 74 72  }.    do_test tr
1280: 69 67 67 65 72 32 2d 31 2e 24 69 69 2e 32 20 7b  igger2-1.$ii.2 {
1290: 0a 20 20 20 20 20 20 73 65 74 20 72 20 7b 7d 0a  .      set r {}.
12a0: 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 76 20        foreach v 
12b0: 5b 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20  [execsql {.     
12c0: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
12d0: 62 6c 3b 0a 20 20 20 20 20 20 20 20 53 45 4c 45  bl;.        SELE
12e0: 43 54 20 2a 20 46 52 4f 4d 20 72 6c 6f 67 3b 0a  CT * FROM rlog;.
12f0: 20 20 20 20 20 20 7d 5d 20 7b 0a 20 20 20 20 20        }] {.     
1300: 20 20 20 6c 61 70 70 65 6e 64 20 72 20 5b 65 78     lappend r [ex
1310: 70 72 20 7b 69 6e 74 28 24 76 29 7d 5d 0a 20 20  pr {int($v)}].  
1320: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 65 74 20      }.      set 
1330: 72 0a 20 20 20 20 7d 20 5b 6c 69 73 74 20 31 20  r.    } [list 1 
1340: 31 30 30 20 31 30 30 20 34 30 30 20 33 30 30 20  100 100 400 300 
1350: 30 20 30 20 5c 0a 20 20 20 20 20 20 20 20 20 20  0 0 \.          
1360: 20 20 32 20 31 30 30 20 31 30 30 20 33 30 30 20    2 100 100 300 
1370: 32 30 30 20 30 20 30 20 5c 0a 20 20 20 20 20 20  200 0 0 \.      
1380: 20 20 20 20 20 20 33 20 33 30 30 20 32 30 30 20        3 300 200 
1390: 33 30 30 20 32 30 30 20 30 20 30 20 5c 0a 20 20  300 200 0 0 \.  
13a0: 20 20 20 20 20 20 20 20 20 20 34 20 33 30 30 20            4 300 
13b0: 32 30 30 20 30 20 30 20 30 20 30 20 5d 0a 20 20  200 0 0 0 0 ].  
13c0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
13d0: 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d       DELETE FROM
13e0: 20 72 6c 6f 67 3b 0a 20 20 20 20 20 20 43 52 45   rlog;.      CRE
13f0: 41 54 45 20 54 52 49 47 47 45 52 20 69 6e 73 65  ATE TRIGGER inse
1400: 72 74 5f 62 65 66 6f 72 65 5f 72 6f 77 20 42 45  rt_before_row BE
1410: 46 4f 52 45 20 49 4e 53 45 52 54 20 4f 4e 20 74  FORE INSERT ON t
1420: 62 6c 20 46 4f 52 20 45 41 43 48 20 52 4f 57 0a  bl FOR EACH ROW.
1430: 20 20 20 20 20 20 20 20 42 45 47 49 4e 0a 20 20          BEGIN.  
1440: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
1450: 4f 20 72 6c 6f 67 20 56 41 4c 55 45 53 20 28 20  O rlog VALUES ( 
1460: 28 53 45 4c 45 43 54 20 63 6f 61 6c 65 73 63 65  (SELECT coalesce
1470: 28 6d 61 78 28 69 64 78 29 2c 30 29 20 2b 20 31  (max(idx),0) + 1
1480: 20 46 52 4f 4d 20 72 6c 6f 67 29 2c 20 0a 20 20   FROM rlog), .  
1490: 09 20 20 30 2c 20 30 2c 0a 20 20 09 20 20 28 53  .  0, 0,.  .  (S
14a0: 45 4c 45 43 54 20 73 75 6d 28 61 29 20 46 52 4f  ELECT sum(a) FRO
14b0: 4d 20 74 62 6c 29 2c 20 28 53 45 4c 45 43 54 20  M tbl), (SELECT 
14c0: 73 75 6d 28 62 29 20 46 52 4f 4d 20 74 62 6c 29  sum(b) FROM tbl)
14d0: 2c 20 0a 20 20 09 20 20 6e 65 77 2e 61 2c 20 6e  , .  .  new.a, n
14e0: 65 77 2e 62 29 3b 0a 20 20 20 20 20 20 45 4e 44  ew.b);.      END
14f0: 3b 0a 20 20 0a 20 20 20 20 20 20 43 52 45 41 54  ;.  .      CREAT
1500: 45 20 54 52 49 47 47 45 52 20 69 6e 73 65 72 74  E TRIGGER insert
1510: 5f 61 66 74 65 72 5f 72 6f 77 20 41 46 54 45 52  _after_row AFTER
1520: 20 49 4e 53 45 52 54 20 4f 4e 20 74 62 6c 20 46   INSERT ON tbl F
1530: 4f 52 20 45 41 43 48 20 52 4f 57 0a 20 20 20 20  OR EACH ROW.    
1540: 20 20 20 20 42 45 47 49 4e 0a 20 20 20 20 20 20      BEGIN.      
1550: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 72 6c    INSERT INTO rl
1560: 6f 67 20 56 41 4c 55 45 53 20 28 20 28 53 45 4c  og VALUES ( (SEL
1570: 45 43 54 20 63 6f 61 6c 65 73 63 65 28 6d 61 78  ECT coalesce(max
1580: 28 69 64 78 29 2c 30 29 20 2b 20 31 20 46 52 4f  (idx),0) + 1 FRO
1590: 4d 20 72 6c 6f 67 29 2c 20 0a 20 20 09 20 20 30  M rlog), .  .  0
15a0: 2c 20 30 2c 0a 20 20 09 20 20 28 53 45 4c 45 43  , 0,.  .  (SELEC
15b0: 54 20 73 75 6d 28 61 29 20 46 52 4f 4d 20 74 62  T sum(a) FROM tb
15c0: 6c 29 2c 20 28 53 45 4c 45 43 54 20 73 75 6d 28  l), (SELECT sum(
15d0: 62 29 20 46 52 4f 4d 20 74 62 6c 29 2c 20 0a 20  b) FROM tbl), . 
15e0: 20 09 20 20 6e 65 77 2e 61 2c 20 6e 65 77 2e 62   .  new.a, new.b
15f0: 29 3b 0a 20 20 20 20 20 20 45 4e 44 3b 0a 20 20  );.      END;.  
1600: 20 20 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74 20    }.    do_test 
1610: 74 72 69 67 67 65 72 32 2d 31 2e 24 69 69 2e 33  trigger2-1.$ii.3
1620: 20 7b 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c   {.      execsql
1630: 20 7b 0a 20 20 0a 20 20 20 20 20 20 20 20 43 52   {.  .        CR
1640: 45 41 54 45 20 54 41 42 4c 45 20 6f 74 68 65 72  EATE TABLE other
1650: 5f 74 62 6c 28 61 2c 20 62 29 3b 0a 20 20 20 20  _tbl(a, b);.    
1660: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1670: 6f 74 68 65 72 5f 74 62 6c 20 56 41 4c 55 45 53  other_tbl VALUES
1680: 28 31 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20  (1, 2);.        
1690: 49 4e 53 45 52 54 20 49 4e 54 4f 20 6f 74 68 65  INSERT INTO othe
16a0: 72 5f 74 62 6c 20 56 41 4c 55 45 53 28 33 2c 20  r_tbl VALUES(3, 
16b0: 34 29 3b 0a 20 20 20 20 20 20 20 20 2d 2d 20 49  4);.        -- I
16c0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 53  NSERT INTO tbl S
16d0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f 74 68  ELECT * FROM oth
16e0: 65 72 5f 74 62 6c 3b 0a 20 20 20 20 20 20 20 20  er_tbl;.        
16f0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20  INSERT INTO tbl 
1700: 56 41 4c 55 45 53 28 35 2c 20 36 29 3b 0a 20 20  VALUES(5, 6);.  
1710: 20 20 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45        DROP TABLE
1720: 20 6f 74 68 65 72 5f 74 62 6c 3b 0a 20 20 0a 20   other_tbl;.  . 
1730: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20         SELECT * 
1740: 46 52 4f 4d 20 72 6c 6f 67 3b 0a 20 20 20 20 20  FROM rlog;.     
1750: 20 7d 0a 20 20 20 20 7d 20 5b 6c 69 73 74 20 31   }.    } [list 1
1760: 20 30 20 30 20 30 2e 30 20 30 2e 30 20 35 20 36   0 0 0.0 0.0 5 6
1770: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 32   \.            2
1780: 20 30 20 30 20 35 2e 30 20 36 2e 30 20 35 20 36   0 0 5.0 6.0 5 6
1790: 20 5d 0a 20 20 0a 20 20 20 20 69 6e 74 65 67 72   ].  .    integr
17a0: 69 74 79 5f 63 68 65 63 6b 20 74 72 69 67 67 65  ity_check trigge
17b0: 72 32 2d 31 2e 24 69 69 2e 34 0a 20 20 7d 0a 20  r2-1.$ii.4.  }. 
17c0: 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20   catchsql {.    
17d0: 44 52 4f 50 20 54 41 42 4c 45 20 72 6c 6f 67 3b  DROP TABLE rlog;
17e0: 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20  .    DROP TABLE 
17f0: 63 6c 6f 67 3b 0a 20 20 20 20 44 52 4f 50 20 54  clog;.    DROP T
1800: 41 42 4c 45 20 74 62 6c 3b 0a 20 20 20 20 44 52  ABLE tbl;.    DR
1810: 4f 50 20 54 41 42 4c 45 20 6f 74 68 65 72 5f 74  OP TABLE other_t
1820: 62 6c 3b 0a 20 20 7d 0a 7d 0a 0a 23 20 32 2e 0a  bl;.  }.}..# 2..
1830: 73 65 74 20 69 69 20 30 0a 66 6f 72 65 61 63 68  set ii 0.foreach
1840: 20 74 72 5f 70 72 6f 67 72 61 6d 20 7b 0a 20 20   tr_program {.  
1850: 7b 55 50 44 41 54 45 20 74 62 6c 20 53 45 54 20  {UPDATE tbl SET 
1860: 62 20 3d 20 6f 6c 64 2e 62 3b 7d 0a 20 20 7b 49  b = old.b;}.  {I
1870: 4e 53 45 52 54 20 49 4e 54 4f 20 6c 6f 67 20 56  NSERT INTO log V
1880: 41 4c 55 45 53 28 6e 65 77 2e 63 2c 20 32 2c 20  ALUES(new.c, 2, 
1890: 33 29 3b 7d 0a 20 20 7b 44 45 4c 45 54 45 20 46  3);}.  {DELETE F
18a0: 52 4f 4d 20 6c 6f 67 20 57 48 45 52 45 20 61 20  ROM log WHERE a 
18b0: 3d 20 31 3b 7d 0a 20 20 7b 49 4e 53 45 52 54 20  = 1;}.  {INSERT 
18c0: 49 4e 54 4f 20 74 62 6c 20 56 41 4c 55 45 53 28  INTO tbl VALUES(
18d0: 35 30 30 2c 20 6e 65 77 2e 62 20 2a 20 31 30 2c  500, new.b * 10,
18e0: 20 37 30 30 29 3b 20 0a 20 20 20 20 55 50 44 41   700); .    UPDA
18f0: 54 45 20 74 62 6c 20 53 45 54 20 63 20 3d 20 6f  TE tbl SET c = o
1900: 6c 64 2e 63 3b 20 0a 20 20 20 20 44 45 4c 45 54  ld.c; .    DELET
1910: 45 20 46 52 4f 4d 20 6c 6f 67 3b 7d 0a 20 20 7b  E FROM log;}.  {
1920: 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c 6f 67 20  INSERT INTO log 
1930: 73 65 6c 65 63 74 20 2a 20 66 72 6f 6d 20 74 62  select * from tb
1940: 6c 3b 7d 20 0a 7d 20 7b 0a 20 20 66 6f 72 65 61  l;} .} {.  forea
1950: 63 68 20 74 65 73 74 5f 76 61 72 73 65 74 20 5b  ch test_varset [
1960: 20 6c 69 73 74 20 5c 0a 20 20 20 20 7b 0a 20 20   list \.    {.  
1970: 20 20 20 20 73 65 74 20 73 74 61 74 65 6d 65 6e      set statemen
1980: 74 20 7b 55 50 44 41 54 45 20 74 62 6c 20 53 45  t {UPDATE tbl SE
1990: 54 20 63 20 3d 20 31 30 20 57 48 45 52 45 20 61  T c = 10 WHERE a
19a0: 20 3d 20 31 3b 7d 20 0a 20 20 20 20 20 20 73 65   = 1;} .      se
19b0: 74 20 70 72 65 70 20 20 20 20 20 20 7b 49 4e 53  t prep      {INS
19c0: 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 56 41 4c  ERT INTO tbl VAL
19d0: 55 45 53 28 31 2c 20 32 2c 20 33 29 3b 7d 0a 20  UES(1, 2, 3);}. 
19e0: 20 20 20 20 20 73 65 74 20 6e 65 77 43 20 31 30       set newC 10
19f0: 0a 20 20 20 20 20 20 73 65 74 20 6e 65 77 42 20  .      set newB 
1a00: 32 0a 20 20 20 20 20 20 73 65 74 20 6e 65 77 41  2.      set newA
1a10: 20 31 0a 20 20 20 20 20 20 73 65 74 20 6f 6c 64   1.      set old
1a20: 41 20 31 0a 20 20 20 20 20 20 73 65 74 20 6f 6c  A 1.      set ol
1a30: 64 42 20 32 0a 20 20 20 20 20 20 73 65 74 20 6f  dB 2.      set o
1a40: 6c 64 43 20 33 0a 20 20 20 20 7d 20 5c 0a 20 20  ldC 3.    } \.  
1a50: 20 20 7b 0a 20 20 20 20 20 20 73 65 74 20 73 74    {.      set st
1a60: 61 74 65 6d 65 6e 74 20 7b 44 45 4c 45 54 45 20  atement {DELETE 
1a70: 46 52 4f 4d 20 74 62 6c 20 57 48 45 52 45 20 61  FROM tbl WHERE a
1a80: 20 3d 20 31 3b 7d 0a 20 20 20 20 20 20 73 65 74   = 1;}.      set
1a90: 20 70 72 65 70 20 20 20 20 20 20 7b 49 4e 53 45   prep      {INSE
1aa0: 52 54 20 49 4e 54 4f 20 74 62 6c 20 56 41 4c 55  RT INTO tbl VALU
1ab0: 45 53 28 31 2c 20 32 2c 20 33 29 3b 7d 0a 20 20  ES(1, 2, 3);}.  
1ac0: 20 20 20 20 73 65 74 20 6f 6c 64 41 20 31 0a 20      set oldA 1. 
1ad0: 20 20 20 20 20 73 65 74 20 6f 6c 64 42 20 32 0a       set oldB 2.
1ae0: 20 20 20 20 20 20 73 65 74 20 6f 6c 64 43 20 33        set oldC 3
1af0: 0a 20 20 20 20 7d 20 5c 0a 20 20 20 20 7b 0a 20  .    } \.    {. 
1b00: 20 20 20 20 20 73 65 74 20 73 74 61 74 65 6d 65       set stateme
1b10: 6e 74 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20  nt {INSERT INTO 
1b20: 74 62 6c 20 56 41 4c 55 45 53 28 31 2c 20 32 2c  tbl VALUES(1, 2,
1b30: 20 33 29 3b 7d 0a 20 20 20 20 20 20 73 65 74 20   3);}.      set 
1b40: 6e 65 77 41 20 31 0a 20 20 20 20 20 20 73 65 74  newA 1.      set
1b50: 20 6e 65 77 42 20 32 0a 20 20 20 20 20 20 73 65   newB 2.      se
1b60: 74 20 6e 65 77 43 20 33 0a 20 20 20 20 7d 0a 20  t newC 3.    }. 
1b70: 20 5d 20 5c 0a 20 20 7b 0a 20 20 20 20 73 65 74   ] \.  {.    set
1b80: 20 73 74 61 74 65 6d 65 6e 74 20 7b 7d 0a 20 20   statement {}.  
1b90: 20 20 73 65 74 20 70 72 65 70 20 7b 7d 0a 20 20    set prep {}.  
1ba0: 20 20 73 65 74 20 6e 65 77 41 20 7b 27 27 7d 0a    set newA {''}.
1bb0: 20 20 20 20 73 65 74 20 6e 65 77 42 20 7b 27 27      set newB {''
1bc0: 7d 0a 20 20 20 20 73 65 74 20 6e 65 77 43 20 7b  }.    set newC {
1bd0: 27 27 7d 0a 20 20 20 20 73 65 74 20 6f 6c 64 41  ''}.    set oldA
1be0: 20 7b 27 27 7d 0a 20 20 20 20 73 65 74 20 6f 6c   {''}.    set ol
1bf0: 64 42 20 7b 27 27 7d 0a 20 20 20 20 73 65 74 20  dB {''}.    set 
1c00: 6f 6c 64 43 20 7b 27 27 7d 0a 0a 20 20 20 20 69  oldC {''}..    i
1c10: 6e 63 72 20 69 69 0a 0a 20 20 20 20 65 76 61 6c  ncr ii..    eval
1c20: 20 24 74 65 73 74 5f 76 61 72 73 65 74 0a 0a 20   $test_varset.. 
1c30: 20 20 20 73 65 74 20 73 74 61 74 65 6d 65 6e 74     set statement
1c40: 5f 74 79 70 65 20 5b 73 74 72 69 6e 67 20 72 61  _type [string ra
1c50: 6e 67 65 20 24 73 74 61 74 65 6d 65 6e 74 20 30  nge $statement 0
1c60: 20 35 5d 0a 20 20 20 20 73 65 74 20 74 72 5f 70   5].    set tr_p
1c70: 72 6f 67 72 61 6d 5f 66 69 78 65 64 20 24 74 72  rogram_fixed $tr
1c80: 5f 70 72 6f 67 72 61 6d 0a 20 20 20 20 69 66 20  _program.    if 
1c90: 7b 24 73 74 61 74 65 6d 65 6e 74 5f 74 79 70 65  {$statement_type
1ca0: 20 3d 3d 20 22 44 45 4c 45 54 45 22 7d 20 7b 0a   == "DELETE"} {.
1cb0: 20 20 20 20 20 20 72 65 67 73 75 62 20 2d 61 6c        regsub -al
1cc0: 6c 20 6e 65 77 5c 2e 61 20 24 74 72 5f 70 72 6f  l new\.a $tr_pro
1cd0: 67 72 61 6d 5f 66 69 78 65 64 20 7b 27 27 7d 20  gram_fixed {''} 
1ce0: 74 72 5f 70 72 6f 67 72 61 6d 5f 66 69 78 65 64  tr_program_fixed
1cf0: 20 0a 20 20 20 20 20 20 72 65 67 73 75 62 20 2d   .      regsub -
1d00: 61 6c 6c 20 6e 65 77 5c 2e 62 20 24 74 72 5f 70  all new\.b $tr_p
1d10: 72 6f 67 72 61 6d 5f 66 69 78 65 64 20 7b 27 27  rogram_fixed {''
1d20: 7d 20 74 72 5f 70 72 6f 67 72 61 6d 5f 66 69 78  } tr_program_fix
1d30: 65 64 20 0a 20 20 20 20 20 20 72 65 67 73 75 62  ed .      regsub
1d40: 20 2d 61 6c 6c 20 6e 65 77 5c 2e 63 20 24 74 72   -all new\.c $tr
1d50: 5f 70 72 6f 67 72 61 6d 5f 66 69 78 65 64 20 7b  _program_fixed {
1d60: 27 27 7d 20 74 72 5f 70 72 6f 67 72 61 6d 5f 66  ''} tr_program_f
1d70: 69 78 65 64 20 0a 20 20 20 20 7d 0a 20 20 20 20  ixed .    }.    
1d80: 69 66 20 7b 24 73 74 61 74 65 6d 65 6e 74 5f 74  if {$statement_t
1d90: 79 70 65 20 3d 3d 20 22 49 4e 53 45 52 54 22 7d  ype == "INSERT"}
1da0: 20 7b 0a 20 20 20 20 20 20 72 65 67 73 75 62 20   {.      regsub 
1db0: 2d 61 6c 6c 20 6f 6c 64 5c 2e 61 20 24 74 72 5f  -all old\.a $tr_
1dc0: 70 72 6f 67 72 61 6d 5f 66 69 78 65 64 20 7b 27  program_fixed {'
1dd0: 27 7d 20 74 72 5f 70 72 6f 67 72 61 6d 5f 66 69  '} tr_program_fi
1de0: 78 65 64 20 0a 20 20 20 20 20 20 72 65 67 73 75  xed .      regsu
1df0: 62 20 2d 61 6c 6c 20 6f 6c 64 5c 2e 62 20 24 74  b -all old\.b $t
1e00: 72 5f 70 72 6f 67 72 61 6d 5f 66 69 78 65 64 20  r_program_fixed 
1e10: 7b 27 27 7d 20 74 72 5f 70 72 6f 67 72 61 6d 5f  {''} tr_program_
1e20: 66 69 78 65 64 20 0a 20 20 20 20 20 20 72 65 67  fixed .      reg
1e30: 73 75 62 20 2d 61 6c 6c 20 6f 6c 64 5c 2e 63 20  sub -all old\.c 
1e40: 24 74 72 5f 70 72 6f 67 72 61 6d 5f 66 69 78 65  $tr_program_fixe
1e50: 64 20 7b 27 27 7d 20 74 72 5f 70 72 6f 67 72 61  d {''} tr_progra
1e60: 6d 5f 66 69 78 65 64 20 0a 20 20 20 20 7d 0a 0a  m_fixed .    }..
1e70: 0a 20 20 20 20 73 65 74 20 74 72 5f 70 72 6f 67  .    set tr_prog
1e80: 72 61 6d 5f 63 6f 6f 6b 65 64 20 24 74 72 5f 70  ram_cooked $tr_p
1e90: 72 6f 67 72 61 6d 0a 20 20 20 20 72 65 67 73 75  rogram.    regsu
1ea0: 62 20 2d 61 6c 6c 20 6e 65 77 5c 2e 61 20 24 74  b -all new\.a $t
1eb0: 72 5f 70 72 6f 67 72 61 6d 5f 63 6f 6f 6b 65 64  r_program_cooked
1ec0: 20 24 6e 65 77 41 20 74 72 5f 70 72 6f 67 72 61   $newA tr_progra
1ed0: 6d 5f 63 6f 6f 6b 65 64 20 0a 20 20 20 20 72 65  m_cooked .    re
1ee0: 67 73 75 62 20 2d 61 6c 6c 20 6e 65 77 5c 2e 62  gsub -all new\.b
1ef0: 20 24 74 72 5f 70 72 6f 67 72 61 6d 5f 63 6f 6f   $tr_program_coo
1f00: 6b 65 64 20 24 6e 65 77 42 20 74 72 5f 70 72 6f  ked $newB tr_pro
1f10: 67 72 61 6d 5f 63 6f 6f 6b 65 64 20 0a 20 20 20  gram_cooked .   
1f20: 20 72 65 67 73 75 62 20 2d 61 6c 6c 20 6e 65 77   regsub -all new
1f30: 5c 2e 63 20 24 74 72 5f 70 72 6f 67 72 61 6d 5f  \.c $tr_program_
1f40: 63 6f 6f 6b 65 64 20 24 6e 65 77 43 20 74 72 5f  cooked $newC tr_
1f50: 70 72 6f 67 72 61 6d 5f 63 6f 6f 6b 65 64 20 0a  program_cooked .
1f60: 20 20 20 20 72 65 67 73 75 62 20 2d 61 6c 6c 20      regsub -all 
1f70: 6f 6c 64 5c 2e 61 20 24 74 72 5f 70 72 6f 67 72  old\.a $tr_progr
1f80: 61 6d 5f 63 6f 6f 6b 65 64 20 24 6f 6c 64 41 20  am_cooked $oldA 
1f90: 74 72 5f 70 72 6f 67 72 61 6d 5f 63 6f 6f 6b 65  tr_program_cooke
1fa0: 64 20 0a 20 20 20 20 72 65 67 73 75 62 20 2d 61  d .    regsub -a
1fb0: 6c 6c 20 6f 6c 64 5c 2e 62 20 24 74 72 5f 70 72  ll old\.b $tr_pr
1fc0: 6f 67 72 61 6d 5f 63 6f 6f 6b 65 64 20 24 6f 6c  ogram_cooked $ol
1fd0: 64 42 20 74 72 5f 70 72 6f 67 72 61 6d 5f 63 6f  dB tr_program_co
1fe0: 6f 6b 65 64 20 0a 20 20 20 20 72 65 67 73 75 62  oked .    regsub
1ff0: 20 2d 61 6c 6c 20 6f 6c 64 5c 2e 63 20 24 74 72   -all old\.c $tr
2000: 5f 70 72 6f 67 72 61 6d 5f 63 6f 6f 6b 65 64 20  _program_cooked 
2010: 24 6f 6c 64 43 20 74 72 5f 70 72 6f 67 72 61 6d  $oldC tr_program
2020: 5f 63 6f 6f 6b 65 64 20 0a 0a 20 20 20 20 63 61  _cooked ..    ca
2030: 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 20 20 44  tchsql {.      D
2040: 52 4f 50 20 54 41 42 4c 45 20 74 62 6c 3b 0a 20  ROP TABLE tbl;. 
2050: 20 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20       DROP TABLE 
2060: 6c 6f 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  log;.    }..    
2070: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
2080: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 62 6c  CREATE TABLE tbl
2090: 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (a PRIMARY KEY, 
20a0: 62 2c 20 63 29 3b 0a 20 20 20 20 20 20 43 52 45  b, c);.      CRE
20b0: 41 54 45 20 54 41 42 4c 45 20 6c 6f 67 28 61 2c  ATE TABLE log(a,
20c0: 20 62 2c 20 63 29 3b 0a 20 20 20 20 7d 0a 0a 20   b, c);.    }.. 
20d0: 20 20 20 73 65 74 20 71 75 65 72 79 20 7b 53 45     set query {SE
20e0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 62 6c 3b  LECT * FROM tbl;
20f0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6c   SELECT * FROM l
2100: 6f 67 3b 7d 0a 20 20 20 20 73 65 74 20 70 72 65  og;}.    set pre
2110: 70 20 22 24 70 72 65 70 3b 20 49 4e 53 45 52 54  p "$prep; INSERT
2120: 20 49 4e 54 4f 20 6c 6f 67 20 56 41 4c 55 45 53   INTO log VALUES
2130: 28 31 2c 20 32 2c 20 33 29 3b 5c 0a 20 20 20 20  (1, 2, 3);\.    
2140: 20 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20           INSERT 
2150: 49 4e 54 4f 20 6c 6f 67 20 56 41 4c 55 45 53 28  INTO log VALUES(
2160: 31 30 2c 20 32 30 2c 20 33 30 29 3b 22 0a 0a 23  10, 20, 30);"..#
2170: 20 43 68 65 63 6b 20 65 78 65 63 75 74 69 6f 6e   Check execution
2180: 20 6f 66 20 42 45 46 4f 52 45 20 70 72 6f 67 72   of BEFORE progr
2190: 61 6d 73 3a 0a 0a 20 20 20 20 73 65 74 20 62 65  ams:..    set be
21a0: 66 6f 72 65 5f 64 61 74 61 20 5b 20 65 78 65 63  fore_data [ exec
21b0: 73 71 6c 20 22 24 70 72 65 70 20 24 74 72 5f 70  sql "$prep $tr_p
21c0: 72 6f 67 72 61 6d 5f 63 6f 6f 6b 65 64 20 24 73  rogram_cooked $s
21d0: 74 61 74 65 6d 65 6e 74 20 24 71 75 65 72 79 22  tatement $query"
21e0: 20 5d 0a 0a 20 20 20 20 65 78 65 63 73 71 6c 20   ]..    execsql 
21f0: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 62 6c  "DELETE FROM tbl
2200: 3b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 6c 6f  ; DELETE FROM lo
2210: 67 3b 20 24 70 72 65 70 22 3b 0a 20 20 20 20 65  g; $prep";.    e
2220: 78 65 63 73 71 6c 20 22 43 52 45 41 54 45 20 54  xecsql "CREATE T
2230: 52 49 47 47 45 52 20 74 68 65 5f 74 72 69 67 67  RIGGER the_trigg
2240: 65 72 20 42 45 46 4f 52 45 20 5b 73 74 72 69 6e  er BEFORE [strin
2250: 67 20 72 61 6e 67 65 20 24 73 74 61 74 65 6d 65  g range $stateme
2260: 6e 74 20 30 20 36 5d 5c 0a 20 20 20 20 20 20 20  nt 0 6]\.       
2270: 20 20 20 20 20 20 4f 4e 20 74 62 6c 20 42 45 47        ON tbl BEG
2280: 49 4e 20 24 74 72 5f 70 72 6f 67 72 61 6d 5f 66  IN $tr_program_f
2290: 69 78 65 64 20 45 4e 44 3b 22 0a 0a 20 20 20 20  ixed END;"..    
22a0: 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 32  do_test trigger2
22b0: 2d 32 2e 24 69 69 2d 62 65 66 6f 72 65 20 22 65  -2.$ii-before "e
22c0: 78 65 63 73 71 6c 20 7b 24 73 74 61 74 65 6d 65  xecsql {$stateme
22d0: 6e 74 20 24 71 75 65 72 79 7d 22 20 24 62 65 66  nt $query}" $bef
22e0: 6f 72 65 5f 64 61 74 61 0a 0a 20 20 20 20 65 78  ore_data..    ex
22f0: 65 63 73 71 6c 20 22 44 52 4f 50 20 54 52 49 47  ecsql "DROP TRIG
2300: 47 45 52 20 74 68 65 5f 74 72 69 67 67 65 72 3b  GER the_trigger;
2310: 22 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22 44  ".    execsql "D
2320: 45 4c 45 54 45 20 46 52 4f 4d 20 74 62 6c 3b 20  ELETE FROM tbl; 
2330: 44 45 4c 45 54 45 20 46 52 4f 4d 20 6c 6f 67 3b  DELETE FROM log;
2340: 22 0a 0a 23 20 43 68 65 63 6b 20 65 78 65 63 75  "..# Check execu
2350: 74 69 6f 6e 20 6f 66 20 41 46 54 45 52 20 70 72  tion of AFTER pr
2360: 6f 67 72 61 6d 73 0a 20 20 20 20 73 65 74 20 61  ograms.    set a
2370: 66 74 65 72 5f 64 61 74 61 20 5b 20 65 78 65 63  fter_data [ exec
2380: 73 71 6c 20 22 24 70 72 65 70 20 24 73 74 61 74  sql "$prep $stat
2390: 65 6d 65 6e 74 20 24 74 72 5f 70 72 6f 67 72 61  ement $tr_progra
23a0: 6d 5f 63 6f 6f 6b 65 64 20 24 71 75 65 72 79 22  m_cooked $query"
23b0: 20 5d 0a 0a 20 20 20 20 65 78 65 63 73 71 6c 20   ]..    execsql 
23c0: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 62 6c  "DELETE FROM tbl
23d0: 3b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 6c 6f  ; DELETE FROM lo
23e0: 67 3b 20 24 70 72 65 70 22 3b 0a 20 20 20 20 65  g; $prep";.    e
23f0: 78 65 63 73 71 6c 20 22 43 52 45 41 54 45 20 54  xecsql "CREATE T
2400: 52 49 47 47 45 52 20 74 68 65 5f 74 72 69 67 67  RIGGER the_trigg
2410: 65 72 20 41 46 54 45 52 20 5b 73 74 72 69 6e 67  er AFTER [string
2420: 20 72 61 6e 67 65 20 24 73 74 61 74 65 6d 65 6e   range $statemen
2430: 74 20 30 20 36 5d 5c 0a 20 20 20 20 20 20 20 20  t 0 6]\.        
2440: 20 20 20 20 20 4f 4e 20 74 62 6c 20 42 45 47 49       ON tbl BEGI
2450: 4e 20 24 74 72 5f 70 72 6f 67 72 61 6d 5f 66 69  N $tr_program_fi
2460: 78 65 64 20 45 4e 44 3b 22 0a 0a 20 20 20 20 64  xed END;"..    d
2470: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 32 2d  o_test trigger2-
2480: 32 2e 24 69 69 2d 61 66 74 65 72 20 22 65 78 65  2.$ii-after "exe
2490: 63 73 71 6c 20 7b 24 73 74 61 74 65 6d 65 6e 74  csql {$statement
24a0: 20 24 71 75 65 72 79 7d 22 20 24 61 66 74 65 72   $query}" $after
24b0: 5f 64 61 74 61 0a 20 20 20 20 65 78 65 63 73 71  _data.    execsq
24c0: 6c 20 22 44 52 4f 50 20 54 52 49 47 47 45 52 20  l "DROP TRIGGER 
24d0: 74 68 65 5f 74 72 69 67 67 65 72 3b 22 0a 0a 20  the_trigger;".. 
24e0: 20 20 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65     integrity_che
24f0: 63 6b 20 74 72 69 67 67 65 72 32 2d 32 2e 24 69  ck trigger2-2.$i
2500: 69 2d 69 6e 74 65 67 72 69 74 79 0a 20 20 7d 0a  i-integrity.  }.
2510: 7d 0a 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 44  }.catchsql {.  D
2520: 52 4f 50 20 54 41 42 4c 45 20 74 62 6c 3b 0a 20  ROP TABLE tbl;. 
2530: 20 44 52 4f 50 20 54 41 42 4c 45 20 6c 6f 67 3b   DROP TABLE log;
2540: 0a 7d 0a 0a 23 20 33 2e 0a 0a 23 20 74 72 69 67  .}..# 3...# trig
2550: 67 65 72 32 2d 33 2e 31 3a 20 55 50 44 41 54 45  ger2-3.1: UPDATE
2560: 20 4f 46 20 74 72 69 67 67 65 72 73 0a 65 78 65   OF triggers.exe
2570: 63 73 71 6c 20 7b 0a 20 20 43 52 45 41 54 45 20  csql {.  CREATE 
2580: 54 41 42 4c 45 20 74 62 6c 20 28 61 2c 20 62 2c  TABLE tbl (a, b,
2590: 20 63 2c 20 64 29 3b 0a 20 20 43 52 45 41 54 45   c, d);.  CREATE
25a0: 20 54 41 42 4c 45 20 6c 6f 67 20 28 61 29 3b 0a   TABLE log (a);.
25b0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c 6f    INSERT INTO lo
25c0: 67 20 56 41 4c 55 45 53 20 28 30 29 3b 0a 20 20  g VALUES (0);.  
25d0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20  INSERT INTO tbl 
25e0: 56 41 4c 55 45 53 20 28 30 2c 20 30 2c 20 30 2c  VALUES (0, 0, 0,
25f0: 20 30 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e   0);.  INSERT IN
2600: 54 4f 20 74 62 6c 20 56 41 4c 55 45 53 20 28 31  TO tbl VALUES (1
2610: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 43 52  , 0, 0, 0);.  CR
2620: 45 41 54 45 20 54 52 49 47 47 45 52 20 74 62 6c  EATE TRIGGER tbl
2630: 5f 61 66 74 65 72 5f 75 70 64 61 74 65 5f 63 64  _after_update_cd
2640: 20 42 45 46 4f 52 45 20 55 50 44 41 54 45 20 4f   BEFORE UPDATE O
2650: 46 20 63 2c 20 64 20 4f 4e 20 74 62 6c 0a 20 20  F c, d ON tbl.  
2660: 20 20 42 45 47 49 4e 0a 20 20 20 20 20 20 55 50    BEGIN.      UP
2670: 44 41 54 45 20 6c 6f 67 20 53 45 54 20 61 20 3d  DATE log SET a =
2680: 20 61 20 2b 20 31 3b 0a 20 20 20 20 45 4e 44 3b   a + 1;.    END;
2690: 0a 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67  .}.do_test trigg
26a0: 65 72 32 2d 33 2e 31 20 7b 0a 20 20 65 78 65 63  er2-3.1 {.  exec
26b0: 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45  sql {.    UPDATE
26c0: 20 74 62 6c 20 53 45 54 20 62 20 3d 20 31 2c 20   tbl SET b = 1, 
26d0: 63 20 3d 20 31 30 3b 20 2d 2d 20 32 0a 20 20 20  c = 10; -- 2.   
26e0: 20 55 50 44 41 54 45 20 74 62 6c 20 53 45 54 20   UPDATE tbl SET 
26f0: 62 20 3d 20 31 30 3b 20 2d 2d 20 30 0a 20 20 20  b = 10; -- 0.   
2700: 20 55 50 44 41 54 45 20 74 62 6c 20 53 45 54 20   UPDATE tbl SET 
2710: 64 20 3d 20 34 20 57 48 45 52 45 20 61 20 3d 20  d = 4 WHERE a = 
2720: 30 3b 20 2d 2d 31 0a 20 20 20 20 55 50 44 41 54  0; --1.    UPDAT
2730: 45 20 74 62 6c 20 53 45 54 20 61 20 3d 20 34 2c  E tbl SET a = 4,
2740: 20 62 20 3d 20 31 30 3b 20 2d 2d 30 0a 20 20 20   b = 10; --0.   
2750: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6c   SELECT * FROM l
2760: 6f 67 3b 0a 20 20 7d 0a 7d 20 7b 33 7d 0a 65 78  og;.  }.} {3}.ex
2770: 65 63 73 71 6c 20 7b 0a 20 20 44 52 4f 50 20 54  ecsql {.  DROP T
2780: 41 42 4c 45 20 74 62 6c 3b 0a 20 20 44 52 4f 50  ABLE tbl;.  DROP
2790: 20 54 41 42 4c 45 20 6c 6f 67 3b 0a 7d 0a 0a 23   TABLE log;.}..#
27a0: 20 74 72 69 67 67 65 72 32 2d 33 2e 32 3a 20 57   trigger2-3.2: W
27b0: 48 45 4e 20 63 6c 61 75 73 65 0a 73 65 74 20 77  HEN clause.set w
27c0: 68 65 6e 5f 74 72 69 67 67 65 72 73 20 5b 6c 69  hen_triggers [li
27d0: 73 74 20 7b 74 31 20 42 45 46 4f 52 45 20 49 4e  st {t1 BEFORE IN
27e0: 53 45 52 54 20 4f 4e 20 74 62 6c 20 57 48 45 4e  SERT ON tbl WHEN
27f0: 20 6e 65 77 2e 61 20 3e 20 32 30 7d 5d 0a 69 66   new.a > 20}].if
2800: 63 61 70 61 62 6c 65 20 73 75 62 71 75 65 72 79  capable subquery
2810: 20 7b 0a 20 20 6c 61 70 70 65 6e 64 20 77 68 65   {.  lappend whe
2820: 6e 5f 74 72 69 67 67 65 72 73 20 5c 0a 20 20 20  n_triggers \.   
2830: 20 20 20 7b 74 32 20 42 45 46 4f 52 45 20 49 4e     {t2 BEFORE IN
2840: 53 45 52 54 20 4f 4e 20 74 62 6c 20 57 48 45 4e  SERT ON tbl WHEN
2850: 20 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   (SELECT count(*
2860: 29 20 46 52 4f 4d 20 74 62 6c 29 20 3d 20 30 7d  ) FROM tbl) = 0}
2870: 0a 7d 0a 0a 65 78 65 63 73 71 6c 20 7b 0a 20 20  .}..execsql {.  
2880: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 62 6c  CREATE TABLE tbl
2890: 20 28 61 2c 20 62 2c 20 63 2c 20 64 29 3b 0a 20   (a, b, c, d);. 
28a0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6c 6f   CREATE TABLE lo
28b0: 67 20 28 61 29 3b 0a 20 20 49 4e 53 45 52 54 20  g (a);.  INSERT 
28c0: 49 4e 54 4f 20 6c 6f 67 20 56 41 4c 55 45 53 20  INTO log VALUES 
28d0: 28 30 29 3b 0a 7d 0a 0a 66 6f 72 65 61 63 68 20  (0);.}..foreach 
28e0: 74 72 69 67 20 24 77 68 65 6e 5f 74 72 69 67 67  trig $when_trigg
28f0: 65 72 73 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  ers {.  execsql 
2900: 22 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20  "CREATE TRIGGER 
2910: 24 74 72 69 67 20 42 45 47 49 4e 20 55 50 44 41  $trig BEGIN UPDA
2920: 54 45 20 6c 6f 67 20 73 65 74 20 61 20 3d 20 61  TE log set a = a
2930: 20 2b 20 31 3b 20 45 4e 44 3b 22 0a 7d 0a 0a 69   + 1; END;".}..i
2940: 66 63 61 70 61 62 6c 65 20 73 75 62 71 75 65 72  fcapable subquer
2950: 79 20 7b 0a 20 20 73 65 74 20 74 32 33 32 20 7b  y {.  set t232 {
2960: 31 20 30 20 31 7d 0a 7d 20 65 6c 73 65 20 7b 0a  1 0 1}.} else {.
2970: 20 20 73 65 74 20 74 32 33 32 20 7b 30 20 30 20    set t232 {0 0 
2980: 31 7d 0a 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69  1}.}.do_test tri
2990: 67 67 65 72 32 2d 33 2e 32 20 7b 0a 20 20 65 78  gger2-3.2 {.  ex
29a0: 65 63 73 71 6c 20 7b 20 0a 0a 20 20 20 20 49 4e  ecsql { ..    IN
29b0: 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 20 56 41  SERT INTO tbl VA
29c0: 4c 55 45 53 28 30 2c 20 30 2c 20 30 2c 20 30 29  LUES(0, 0, 0, 0)
29d0: 3b 20 20 20 20 20 2d 2d 20 31 20 28 69 66 63 61  ;     -- 1 (ifca
29e0: 70 61 62 6c 65 20 73 75 62 71 75 65 72 79 29 0a  pable subquery).
29f0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
2a00: 4d 20 6c 6f 67 3b 0a 20 20 20 20 55 50 44 41 54  M log;.    UPDAT
2a10: 45 20 6c 6f 67 20 53 45 54 20 61 20 3d 20 30 3b  E log SET a = 0;
2a20: 0a 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ..    INSERT INT
2a30: 4f 20 74 62 6c 20 56 41 4c 55 45 53 28 30 2c 20  O tbl VALUES(0, 
2a40: 30 2c 20 30 2c 20 30 29 3b 20 20 20 20 20 2d 2d  0, 0, 0);     --
2a50: 20 30 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   0.    SELECT * 
2a60: 46 52 4f 4d 20 6c 6f 67 3b 0a 20 20 20 20 55 50  FROM log;.    UP
2a70: 44 41 54 45 20 6c 6f 67 20 53 45 54 20 61 20 3d  DATE log SET a =
2a80: 20 30 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54 20   0;..    INSERT 
2a90: 49 4e 54 4f 20 74 62 6c 20 56 41 4c 55 45 53 28  INTO tbl VALUES(
2aa0: 32 30 30 2c 20 30 2c 20 30 2c 20 30 29 3b 20 20  200, 0, 0, 0);  
2ab0: 20 20 20 2d 2d 20 31 0a 20 20 20 20 53 45 4c 45     -- 1.    SELE
2ac0: 43 54 20 2a 20 46 52 4f 4d 20 6c 6f 67 3b 0a 20  CT * FROM log;. 
2ad0: 20 20 20 55 50 44 41 54 45 20 6c 6f 67 20 53 45     UPDATE log SE
2ae0: 54 20 61 20 3d 20 30 3b 0a 20 20 7d 0a 7d 20 24  T a = 0;.  }.} $
2af0: 74 32 33 32 0a 65 78 65 63 73 71 6c 20 7b 0a 20  t232.execsql {. 
2b00: 20 44 52 4f 50 20 54 41 42 4c 45 20 74 62 6c 3b   DROP TABLE tbl;
2b10: 0a 20 20 44 52 4f 50 20 54 41 42 4c 45 20 6c 6f  .  DROP TABLE lo
2b20: 67 3b 0a 7d 0a 69 6e 74 65 67 72 69 74 79 5f 63  g;.}.integrity_c
2b30: 68 65 63 6b 20 74 72 69 67 67 65 72 32 2d 33 2e  heck trigger2-3.
2b40: 33 0a 0a 23 20 53 69 6d 70 6c 65 20 63 61 73 63  3..# Simple casc
2b50: 61 64 65 64 20 74 72 69 67 67 65 72 0a 65 78 65  aded trigger.exe
2b60: 63 73 71 6c 20 7b 0a 20 20 43 52 45 41 54 45 20  csql {.  CREATE 
2b70: 54 41 42 4c 45 20 74 62 6c 41 28 61 2c 20 62 29  TABLE tblA(a, b)
2b80: 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  ;.  CREATE TABLE
2b90: 20 74 62 6c 42 28 61 2c 20 62 29 3b 0a 20 20 43   tblB(a, b);.  C
2ba0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 62 6c 43  REATE TABLE tblC
2bb0: 28 61 2c 20 62 29 3b 0a 0a 20 20 43 52 45 41 54  (a, b);..  CREAT
2bc0: 45 20 54 52 49 47 47 45 52 20 74 72 31 20 42 45  E TRIGGER tr1 BE
2bd0: 46 4f 52 45 20 49 4e 53 45 52 54 20 4f 4e 20 74  FORE INSERT ON t
2be0: 62 6c 41 20 42 45 47 49 4e 0a 20 20 20 20 49 4e  blA BEGIN.    IN
2bf0: 53 45 52 54 20 49 4e 54 4f 20 74 62 6c 42 20 76  SERT INTO tblB v
2c00: 61 6c 75 65 73 28 6e 65 77 2e 61 2c 20 6e 65 77  alues(new.a, new
2c10: 2e 62 29 3b 0a 20 20 45 4e 44 3b 0a 0a 20 20 43  .b);.  END;..  C
2c20: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74 72  REATE TRIGGER tr
2c30: 32 20 42 45 46 4f 52 45 20 49 4e 53 45 52 54 20  2 BEFORE INSERT 
2c40: 4f 4e 20 74 62 6c 42 20 42 45 47 49 4e 0a 20 20  ON tblB BEGIN.  
2c50: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62    INSERT INTO tb
2c60: 6c 43 20 76 61 6c 75 65 73 28 6e 65 77 2e 61 2c  lC values(new.a,
2c70: 20 6e 65 77 2e 62 29 3b 0a 20 20 45 4e 44 3b 0a   new.b);.  END;.
2c80: 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65  }.do_test trigge
2c90: 72 32 2d 34 2e 31 20 7b 0a 20 20 65 78 65 63 73  r2-4.1 {.  execs
2ca0: 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20  ql {.    INSERT 
2cb0: 49 4e 54 4f 20 74 62 6c 41 20 76 61 6c 75 65 73  INTO tblA values
2cc0: 28 31 2c 20 32 29 3b 0a 20 20 20 20 53 45 4c 45  (1, 2);.    SELE
2cd0: 43 54 20 2a 20 46 52 4f 4d 20 74 62 6c 41 3b 0a  CT * FROM tblA;.
2ce0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
2cf0: 4d 20 74 62 6c 42 3b 0a 20 20 20 20 53 45 4c 45  M tblB;.    SELE
2d00: 43 54 20 2a 20 46 52 4f 4d 20 74 62 6c 43 3b 0a  CT * FROM tblC;.
2d10: 20 20 7d 0a 7d 20 7b 31 20 32 20 31 20 32 20 31    }.} {1 2 1 2 1
2d20: 20 32 7d 0a 65 78 65 63 73 71 6c 20 7b 0a 20 20   2}.execsql {.  
2d30: 44 52 4f 50 20 54 41 42 4c 45 20 74 62 6c 41 3b  DROP TABLE tblA;
2d40: 0a 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74 62  .  DROP TABLE tb
2d50: 6c 42 3b 0a 20 20 44 52 4f 50 20 54 41 42 4c 45  lB;.  DROP TABLE
2d60: 20 74 62 6c 43 3b 0a 7d 0a 0a 23 20 53 69 6d 70   tblC;.}..# Simp
2d70: 6c 65 20 72 65 63 75 72 73 69 76 65 20 74 72 69  le recursive tri
2d80: 67 67 65 72 0a 65 78 65 63 73 71 6c 20 7b 0a 20  gger.execsql {. 
2d90: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 62   CREATE TABLE tb
2da0: 6c 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 43 52  l(a, b, c);.  CR
2db0: 45 41 54 45 20 54 52 49 47 47 45 52 20 74 62 6c  EATE TRIGGER tbl
2dc0: 5f 74 72 69 67 20 42 45 46 4f 52 45 20 49 4e 53  _trig BEFORE INS
2dd0: 45 52 54 20 4f 4e 20 74 62 6c 20 0a 20 20 20 20  ERT ON tbl .    
2de0: 42 45 47 49 4e 0a 20 20 20 20 20 20 49 4e 53 45  BEGIN.      INSE
2df0: 52 54 20 49 4e 54 4f 20 74 62 6c 20 56 41 4c 55  RT INTO tbl VALU
2e00: 45 53 20 28 6e 65 77 2e 61 2c 20 6e 65 77 2e 62  ES (new.a, new.b
2e10: 2c 20 6e 65 77 2e 63 29 3b 0a 20 20 20 20 45 4e  , new.c);.    EN
2e20: 44 3b 0a 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69  D;.}.do_test tri
2e30: 67 67 65 72 32 2d 34 2e 32 20 7b 0a 20 20 65 78  gger2-4.2 {.  ex
2e40: 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45  ecsql {.    INSE
2e50: 52 54 20 49 4e 54 4f 20 74 62 6c 20 56 41 4c 55  RT INTO tbl VALU
2e60: 45 53 20 28 31 2c 20 32 2c 20 33 29 3b 0a 20 20  ES (1, 2, 3);.  
2e70: 20 20 73 65 6c 65 63 74 20 2a 20 66 72 6f 6d 20    select * from 
2e80: 74 62 6c 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 20  tbl;.  }.} {1 2 
2e90: 33 20 31 20 32 20 33 7d 0a 65 78 65 63 73 71 6c  3 1 2 3}.execsql
2ea0: 20 7b 0a 20 20 44 52 4f 50 20 54 41 42 4c 45 20   {.  DROP TABLE 
2eb0: 74 62 6c 3b 0a 7d 0a 0a 23 20 35 2e 0a 65 78 65  tbl;.}..# 5..exe
2ec0: 63 73 71 6c 20 7b 0a 20 20 43 52 45 41 54 45 20  csql {.  CREATE 
2ed0: 54 41 42 4c 45 20 74 62 6c 28 61 2c 20 62 2c 20  TABLE tbl(a, b, 
2ee0: 63 29 3b 0a 20 20 43 52 45 41 54 45 20 54 52 49  c);.  CREATE TRI
2ef0: 47 47 45 52 20 74 62 6c 5f 74 72 69 67 20 42 45  GGER tbl_trig BE
2f00: 46 4f 52 45 20 49 4e 53 45 52 54 20 4f 4e 20 74  FORE INSERT ON t
2f10: 62 6c 20 0a 20 20 20 20 42 45 47 49 4e 0a 20 20  bl .    BEGIN.  
2f20: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2f30: 74 62 6c 20 56 41 4c 55 45 53 20 28 31 2c 20 32  tbl VALUES (1, 2
2f40: 2c 20 33 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  , 3);.      INSE
2f50: 52 54 20 49 4e 54 4f 20 74 62 6c 20 56 41 4c 55  RT INTO tbl VALU
2f60: 45 53 20 28 32 2c 20 32 2c 20 33 29 3b 0a 20 20  ES (2, 2, 3);.  
2f70: 20 20 20 20 55 50 44 41 54 45 20 74 62 6c 20 73      UPDATE tbl s
2f80: 65 74 20 62 20 3d 20 31 30 20 57 48 45 52 45 20  et b = 10 WHERE 
2f90: 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 44 45 4c  a = 1;.      DEL
2fa0: 45 54 45 20 46 52 4f 4d 20 74 62 6c 20 57 48 45  ETE FROM tbl WHE
2fb0: 52 45 20 61 20 3d 20 31 3b 0a 20 20 20 20 20 20  RE a = 1;.      
2fc0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 62 6c 3b  DELETE FROM tbl;
2fd0: 0a 20 20 20 20 45 4e 44 3b 0a 7d 0a 64 6f 5f 74  .    END;.}.do_t
2fe0: 65 73 74 20 74 72 69 67 67 65 72 32 2d 35 20 7b  est trigger2-5 {
2ff0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
3000: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 62 6c   INSERT INTO tbl
3010: 20 56 41 4c 55 45 53 28 31 30 30 2c 20 32 30 30   VALUES(100, 200
3020: 2c 20 33 30 30 29 3b 0a 20 20 7d 0a 20 20 64 62  , 300);.  }.  db
3030: 20 63 68 61 6e 67 65 73 0a 7d 20 7b 31 7d 0a 65   changes.} {1}.e
3040: 78 65 63 73 71 6c 20 7b 0a 20 20 44 52 4f 50 20  xecsql {.  DROP 
3050: 54 41 42 4c 45 20 74 62 6c 3b 0a 7d 0a 0a 23 20  TABLE tbl;.}..# 
3060: 48 61 6e 64 6c 69 6e 67 20 6f 66 20 4f 4e 20 43  Handling of ON C
3070: 4f 4e 46 4c 49 43 54 20 62 79 20 49 4e 53 45 52  ONFLICT by INSER
3080: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73  T statements ins
3090: 69 64 65 20 74 72 69 67 67 65 72 73 0a 65 78 65  ide triggers.exe
30a0: 63 73 71 6c 20 7b 0a 20 20 43 52 45 41 54 45 20  csql {.  CREATE 
30b0: 54 41 42 4c 45 20 74 62 6c 20 28 61 20 70 72 69  TABLE tbl (a pri
30c0: 6d 61 72 79 20 6b 65 79 2c 20 62 2c 20 63 29 3b  mary key, b, c);
30d0: 0a 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45  .  CREATE TRIGGE
30e0: 52 20 61 69 5f 74 62 6c 20 41 46 54 45 52 20 49  R ai_tbl AFTER I
30f0: 4e 53 45 52 54 20 4f 4e 20 74 62 6c 20 42 45 47  NSERT ON tbl BEG
3100: 49 4e 0a 20 20 20 20 49 4e 53 45 52 54 20 4f 52  IN.    INSERT OR
3110: 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20 74 62 6c   IGNORE INTO tbl
3120: 20 76 61 6c 75 65 73 20 28 6e 65 77 2e 61 2c 20   values (new.a, 
3130: 30 2c 20 30 29 3b 0a 20 20 45 4e 44 3b 0a 7d 0a  0, 0);.  END;.}.
3140: 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 32  do_test trigger2
3150: 2d 36 2e 31 61 20 7b 0a 20 20 65 78 65 63 73 71  -6.1a {.  execsq
3160: 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  l {.    BEGIN;. 
3170: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
3180: 62 6c 20 76 61 6c 75 65 73 20 28 31 2c 20 32 2c  bl values (1, 2,
3190: 20 33 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20   3);.    SELECT 
31a0: 2a 20 66 72 6f 6d 20 74 62 6c 3b 0a 20 20 7d 0a  * from tbl;.  }.
31b0: 7d 20 7b 31 20 32 20 33 7d 0a 64 6f 5f 74 65 73  } {1 2 3}.do_tes
31c0: 74 20 74 72 69 67 67 65 72 32 2d 36 2e 31 62 20  t trigger2-6.1b 
31d0: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20  {.  catchsql {. 
31e0: 20 20 20 49 4e 53 45 52 54 20 4f 52 20 41 42 4f     INSERT OR ABO
31f0: 52 54 20 49 4e 54 4f 20 74 62 6c 20 76 61 6c 75  RT INTO tbl valu
3200: 65 73 20 28 32 2c 20 32 2c 20 33 29 3b 0a 20 20  es (2, 2, 3);.  
3210: 7d 0a 7d 20 7b 31 20 7b 63 6f 6c 75 6d 6e 20 61  }.} {1 {column a
3220: 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 7d 7d   is not unique}}
3230: 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72  .do_test trigger
3240: 32 2d 36 2e 31 63 20 7b 0a 20 20 65 78 65 63 73  2-6.1c {.  execs
3250: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
3260: 2a 20 66 72 6f 6d 20 74 62 6c 3b 0a 20 20 7d 0a  * from tbl;.  }.
3270: 7d 20 7b 31 20 32 20 33 7d 0a 64 6f 5f 74 65 73  } {1 2 3}.do_tes
3280: 74 20 74 72 69 67 67 65 72 32 2d 36 2e 31 64 20  t trigger2-6.1d 
3290: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20  {.  catchsql {. 
32a0: 20 20 20 49 4e 53 45 52 54 20 4f 52 20 46 41 49     INSERT OR FAI
32b0: 4c 20 49 4e 54 4f 20 74 62 6c 20 76 61 6c 75 65  L INTO tbl value
32c0: 73 20 28 32 2c 20 32 2c 20 33 29 3b 0a 20 20 7d  s (2, 2, 3);.  }
32d0: 0a 7d 20 7b 31 20 7b 63 6f 6c 75 6d 6e 20 61 20  .} {1 {column a 
32e0: 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 7d 7d 0a  is not unique}}.
32f0: 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 32  do_test trigger2
3300: 2d 36 2e 31 65 20 7b 0a 20 20 65 78 65 63 73 71  -6.1e {.  execsq
3310: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  l {.    SELECT *
3320: 20 66 72 6f 6d 20 74 62 6c 3b 0a 20 20 7d 0a 7d   from tbl;.  }.}
3330: 20 7b 31 20 32 20 33 20 32 20 32 20 33 7d 0a 64   {1 2 3 2 2 3}.d
3340: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 32 2d  o_test trigger2-
3350: 36 2e 31 66 20 7b 0a 20 20 65 78 65 63 73 71 6c  6.1f {.  execsql
3360: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 4f 52   {.    INSERT OR
3370: 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 74 62   REPLACE INTO tb
3380: 6c 20 76 61 6c 75 65 73 20 28 32 2c 20 32 2c 20  l values (2, 2, 
3390: 33 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  3);.    SELECT *
33a0: 20 66 72 6f 6d 20 74 62 6c 3b 0a 20 20 7d 0a 7d   from tbl;.  }.}
33b0: 20 7b 31 20 32 20 33 20 32 20 30 20 30 7d 0a 64   {1 2 3 2 0 0}.d
33c0: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 32 2d  o_test trigger2-
33d0: 36 2e 31 67 20 7b 0a 20 20 63 61 74 63 68 73 71  6.1g {.  catchsq
33e0: 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 4f  l {.    INSERT O
33f0: 52 20 52 4f 4c 4c 42 41 43 4b 20 49 4e 54 4f 20  R ROLLBACK INTO 
3400: 74 62 6c 20 76 61 6c 75 65 73 20 28 33 2c 20 32  tbl values (3, 2
3410: 2c 20 33 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b  , 3);.  }.} {1 {
3420: 63 6f 6c 75 6d 6e 20 61 20 69 73 20 6e 6f 74 20  column a is not 
3430: 75 6e 69 71 75 65 7d 7d 0a 64 6f 5f 74 65 73 74  unique}}.do_test
3440: 20 74 72 69 67 67 65 72 32 2d 36 2e 31 68 20 7b   trigger2-6.1h {
3450: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
3460: 20 53 45 4c 45 43 54 20 2a 20 66 72 6f 6d 20 74   SELECT * from t
3470: 62 6c 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 65 78 65  bl;.  }.} {}.exe
3480: 63 73 71 6c 20 7b 44 45 4c 45 54 45 20 46 52 4f  csql {DELETE FRO
3490: 4d 20 74 62 6c 7d 0a 0a 0a 23 20 48 61 6e 64 6c  M tbl}...# Handl
34a0: 69 6e 67 20 6f 66 20 4f 4e 20 43 4f 4e 46 4c 49  ing of ON CONFLI
34b0: 43 54 20 62 79 20 55 50 44 41 54 45 20 73 74 61  CT by UPDATE sta
34c0: 74 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 20 74  tements inside t
34d0: 72 69 67 67 65 72 73 0a 65 78 65 63 73 71 6c 20  riggers.execsql 
34e0: 7b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  {.  INSERT INTO 
34f0: 74 62 6c 20 76 61 6c 75 65 73 20 28 34 2c 20 32  tbl values (4, 2
3500: 2c 20 33 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  , 3);.  INSERT I
3510: 4e 54 4f 20 74 62 6c 20 76 61 6c 75 65 73 20 28  NTO tbl values (
3520: 36 2c 20 33 2c 20 34 29 3b 0a 20 20 43 52 45 41  6, 3, 4);.  CREA
3530: 54 45 20 54 52 49 47 47 45 52 20 61 75 5f 74 62  TE TRIGGER au_tb
3540: 6c 20 41 46 54 45 52 20 55 50 44 41 54 45 20 4f  l AFTER UPDATE O
3550: 4e 20 74 62 6c 20 42 45 47 49 4e 0a 20 20 20 20  N tbl BEGIN.    
3560: 55 50 44 41 54 45 20 4f 52 20 49 47 4e 4f 52 45  UPDATE OR IGNORE
3570: 20 74 62 6c 20 53 45 54 20 61 20 3d 20 6e 65 77   tbl SET a = new
3580: 2e 61 2c 20 63 20 3d 20 31 30 3b 0a 20 20 45 4e  .a, c = 10;.  EN
3590: 44 3b 0a 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69  D;.}.do_test tri
35a0: 67 67 65 72 32 2d 36 2e 32 61 20 7b 0a 20 20 65  gger2-6.2a {.  e
35b0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47  xecsql {.    BEG
35c0: 49 4e 3b 0a 20 20 20 20 55 50 44 41 54 45 20 74  IN;.    UPDATE t
35d0: 62 6c 20 53 45 54 20 61 20 3d 20 31 20 57 48 45  bl SET a = 1 WHE
35e0: 52 45 20 61 20 3d 20 34 3b 0a 20 20 20 20 53 45  RE a = 4;.    SE
35f0: 4c 45 43 54 20 2a 20 66 72 6f 6d 20 74 62 6c 3b  LECT * from tbl;
3600: 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 31 30 20 36  .  }.} {1 2 10 6
3610: 20 33 20 34 7d 0a 64 6f 5f 74 65 73 74 20 74 72   3 4}.do_test tr
3620: 69 67 67 65 72 32 2d 36 2e 32 62 20 7b 0a 20 20  igger2-6.2b {.  
3630: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 55  catchsql {.    U
3640: 50 44 41 54 45 20 4f 52 20 41 42 4f 52 54 20 74  PDATE OR ABORT t
3650: 62 6c 20 53 45 54 20 61 20 3d 20 34 20 57 48 45  bl SET a = 4 WHE
3660: 52 45 20 61 20 3d 20 31 3b 0a 20 20 7d 0a 7d 20  RE a = 1;.  }.} 
3670: 7b 31 20 7b 63 6f 6c 75 6d 6e 20 61 20 69 73 20  {1 {column a is 
3680: 6e 6f 74 20 75 6e 69 71 75 65 7d 7d 0a 64 6f 5f  not unique}}.do_
3690: 74 65 73 74 20 74 72 69 67 67 65 72 32 2d 36 2e  test trigger2-6.
36a0: 32 63 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  2c {.  execsql {
36b0: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 66 72  .    SELECT * fr
36c0: 6f 6d 20 74 62 6c 3b 0a 20 20 7d 0a 7d 20 7b 31  om tbl;.  }.} {1
36d0: 20 32 20 31 30 20 36 20 33 20 34 7d 0a 64 6f 5f   2 10 6 3 4}.do_
36e0: 74 65 73 74 20 74 72 69 67 67 65 72 32 2d 36 2e  test trigger2-6.
36f0: 32 64 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  2d {.  catchsql 
3700: 7b 0a 20 20 20 20 55 50 44 41 54 45 20 4f 52 20  {.    UPDATE OR 
3710: 46 41 49 4c 20 74 62 6c 20 53 45 54 20 61 20 3d  FAIL tbl SET a =
3720: 20 34 20 57 48 45 52 45 20 61 20 3d 20 31 3b 0a   4 WHERE a = 1;.
3730: 20 20 7d 0a 7d 20 7b 31 20 7b 63 6f 6c 75 6d 6e    }.} {1 {column
3740: 20 61 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65   a is not unique
3750: 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67  }}.do_test trigg
3760: 65 72 32 2d 36 2e 32 65 20 7b 0a 20 20 65 78 65  er2-6.2e {.  exe
3770: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
3780: 54 20 2a 20 66 72 6f 6d 20 74 62 6c 3b 0a 20 20  T * from tbl;.  
3790: 7d 0a 7d 20 7b 34 20 32 20 31 30 20 36 20 33 20  }.} {4 2 10 6 3 
37a0: 34 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67  4}.do_test trigg
37b0: 65 72 32 2d 36 2e 32 66 2e 31 20 7b 0a 20 20 65  er2-6.2f.1 {.  e
37c0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 50 44  xecsql {.    UPD
37d0: 41 54 45 20 4f 52 20 52 45 50 4c 41 43 45 20 74  ATE OR REPLACE t
37e0: 62 6c 20 53 45 54 20 61 20 3d 20 31 20 57 48 45  bl SET a = 1 WHE
37f0: 52 45 20 61 20 3d 20 34 3b 0a 20 20 20 20 53 45  RE a = 4;.    SE
3800: 4c 45 43 54 20 2a 20 66 72 6f 6d 20 74 62 6c 3b  LECT * from tbl;
3810: 0a 20 20 7d 0a 7d 20 7b 31 20 33 20 31 30 7d 0a  .  }.} {1 3 10}.
3820: 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 32  do_test trigger2
3830: 2d 36 2e 32 66 2e 32 20 7b 0a 20 20 65 78 65 63  -6.2f.2 {.  exec
3840: 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54  sql {.    INSERT
3850: 20 49 4e 54 4f 20 74 62 6c 20 56 41 4c 55 45 53   INTO tbl VALUES
3860: 20 28 32 2c 20 33 2c 20 34 29 3b 0a 20 20 20 20   (2, 3, 4);.    
3870: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 62  SELECT * FROM tb
3880: 6c 3b 0a 20 20 7d 0a 7d 20 7b 31 20 33 20 31 30  l;.  }.} {1 3 10
3890: 20 32 20 33 20 34 7d 0a 64 6f 5f 74 65 73 74 20   2 3 4}.do_test 
38a0: 74 72 69 67 67 65 72 32 2d 36 2e 32 67 20 7b 0a  trigger2-6.2g {.
38b0: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
38c0: 20 55 50 44 41 54 45 20 4f 52 20 52 4f 4c 4c 42   UPDATE OR ROLLB
38d0: 41 43 4b 20 74 62 6c 20 53 45 54 20 61 20 3d 20  ACK tbl SET a = 
38e0: 34 20 57 48 45 52 45 20 61 20 3d 20 31 3b 0a 20  4 WHERE a = 1;. 
38f0: 20 7d 0a 7d 20 7b 31 20 7b 63 6f 6c 75 6d 6e 20   }.} {1 {column 
3900: 61 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 7d  a is not unique}
3910: 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65  }.do_test trigge
3920: 72 32 2d 36 2e 32 68 20 7b 0a 20 20 65 78 65 63  r2-6.2h {.  exec
3930: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
3940: 20 2a 20 66 72 6f 6d 20 74 62 6c 3b 0a 20 20 7d   * from tbl;.  }
3950: 0a 7d 20 7b 34 20 32 20 33 20 36 20 33 20 34 7d  .} {4 2 3 6 3 4}
3960: 0a 65 78 65 63 73 71 6c 20 7b 0a 20 20 44 52 4f  .execsql {.  DRO
3970: 50 20 54 41 42 4c 45 20 74 62 6c 3b 0a 7d 0a 0a  P TABLE tbl;.}..
3980: 23 20 37 2e 20 54 72 69 67 67 65 72 73 20 6f 6e  # 7. Triggers on
3990: 20 76 69 65 77 73 0a 69 66 63 61 70 61 62 6c 65   views.ifcapable
39a0: 20 76 69 65 77 20 7b 0a 0a 64 6f 5f 74 65 73 74   view {..do_test
39b0: 20 74 72 69 67 67 65 72 32 2d 37 2e 31 20 7b 0a   trigger2-7.1 {.
39c0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 43 52    execsql {.  CR
39d0: 45 41 54 45 20 54 41 42 4c 45 20 61 62 28 61 2c  EATE TABLE ab(a,
39e0: 20 62 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41   b);.  CREATE TA
39f0: 42 4c 45 20 63 64 28 63 2c 20 64 29 3b 0a 20 20  BLE cd(c, d);.  
3a00: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20 56  INSERT INTO ab V
3a10: 41 4c 55 45 53 20 28 31 2c 20 32 29 3b 0a 20 20  ALUES (1, 2);.  
3a20: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 20 56  INSERT INTO ab V
3a30: 41 4c 55 45 53 20 28 30 2c 20 30 29 3b 0a 20 20  ALUES (0, 0);.  
3a40: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 64 20 56  INSERT INTO cd V
3a50: 41 4c 55 45 53 20 28 33 2c 20 34 29 3b 0a 0a 20  ALUES (3, 4);.. 
3a60: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 6c   CREATE TABLE tl
3a70: 6f 67 28 69 69 20 49 4e 54 45 47 45 52 20 50 52  og(ii INTEGER PR
3a80: 49 4d 41 52 59 20 4b 45 59 2c 20 0a 20 20 20 20  IMARY KEY, .    
3a90: 20 20 6f 6c 64 61 2c 20 6f 6c 64 62 2c 20 6f 6c    olda, oldb, ol
3aa0: 64 63 2c 20 6f 6c 64 64 2c 20 6e 65 77 61 2c 20  dc, oldd, newa, 
3ab0: 6e 65 77 62 2c 20 6e 65 77 63 2c 20 6e 65 77 64  newb, newc, newd
3ac0: 29 3b 0a 0a 20 20 43 52 45 41 54 45 20 56 49 45  );..  CREATE VIE
3ad0: 57 20 61 62 63 64 20 41 53 20 53 45 4c 45 43 54  W abcd AS SELECT
3ae0: 20 61 2c 20 62 2c 20 63 2c 20 64 20 46 52 4f 4d   a, b, c, d FROM
3af0: 20 61 62 2c 20 63 64 3b 0a 0a 20 20 43 52 45 41   ab, cd;..  CREA
3b00: 54 45 20 54 52 49 47 47 45 52 20 62 65 66 6f 72  TE TRIGGER befor
3b10: 65 5f 75 70 64 61 74 65 20 49 4e 53 54 45 41 44  e_update INSTEAD
3b20: 20 4f 46 20 55 50 44 41 54 45 20 4f 4e 20 61 62   OF UPDATE ON ab
3b30: 63 64 20 42 45 47 49 4e 0a 20 20 20 20 49 4e 53  cd BEGIN.    INS
3b40: 45 52 54 20 49 4e 54 4f 20 74 6c 6f 67 20 56 41  ERT INTO tlog VA
3b50: 4c 55 45 53 28 4e 55 4c 4c 2c 20 0a 09 6f 6c 64  LUES(NULL, ..old
3b60: 2e 61 2c 20 6f 6c 64 2e 62 2c 20 6f 6c 64 2e 63  .a, old.b, old.c
3b70: 2c 20 6f 6c 64 2e 64 2c 20 6e 65 77 2e 61 2c 20  , old.d, new.a, 
3b80: 6e 65 77 2e 62 2c 20 6e 65 77 2e 63 2c 20 6e 65  new.b, new.c, ne
3b90: 77 2e 64 29 3b 0a 20 20 45 4e 44 3b 0a 20 20 43  w.d);.  END;.  C
3ba0: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 61 66  REATE TRIGGER af
3bb0: 74 65 72 5f 75 70 64 61 74 65 20 49 4e 53 54 45  ter_update INSTE
3bc0: 41 44 20 4f 46 20 55 50 44 41 54 45 20 4f 4e 20  AD OF UPDATE ON 
3bd0: 61 62 63 64 20 42 45 47 49 4e 0a 20 20 20 20 49  abcd BEGIN.    I
3be0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 6c 6f 67 20  NSERT INTO tlog 
3bf0: 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 0a 09 6f  VALUES(NULL, ..o
3c00: 6c 64 2e 61 2c 20 6f 6c 64 2e 62 2c 20 6f 6c 64  ld.a, old.b, old
3c10: 2e 63 2c 20 6f 6c 64 2e 64 2c 20 6e 65 77 2e 61  .c, old.d, new.a
3c20: 2c 20 6e 65 77 2e 62 2c 20 6e 65 77 2e 63 2c 20  , new.b, new.c, 
3c30: 6e 65 77 2e 64 29 3b 0a 20 20 45 4e 44 3b 0a 0a  new.d);.  END;..
3c40: 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52    CREATE TRIGGER
3c50: 20 62 65 66 6f 72 65 5f 64 65 6c 65 74 65 20 49   before_delete I
3c60: 4e 53 54 45 41 44 20 4f 46 20 44 45 4c 45 54 45  NSTEAD OF DELETE
3c70: 20 4f 4e 20 61 62 63 64 20 42 45 47 49 4e 0a 20   ON abcd BEGIN. 
3c80: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
3c90: 6c 6f 67 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c  log VALUES(NULL,
3ca0: 20 0a 09 6f 6c 64 2e 61 2c 20 6f 6c 64 2e 62 2c   ..old.a, old.b,
3cb0: 20 6f 6c 64 2e 63 2c 20 6f 6c 64 2e 64 2c 20 30   old.c, old.d, 0
3cc0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 45 4e  , 0, 0, 0);.  EN
3cd0: 44 3b 0a 20 20 43 52 45 41 54 45 20 54 52 49 47  D;.  CREATE TRIG
3ce0: 47 45 52 20 61 66 74 65 72 5f 64 65 6c 65 74 65  GER after_delete
3cf0: 20 49 4e 53 54 45 41 44 20 4f 46 20 44 45 4c 45   INSTEAD OF DELE
3d00: 54 45 20 4f 4e 20 61 62 63 64 20 42 45 47 49 4e  TE ON abcd BEGIN
3d10: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
3d20: 20 74 6c 6f 67 20 56 41 4c 55 45 53 28 4e 55 4c   tlog VALUES(NUL
3d30: 4c 2c 20 0a 09 6f 6c 64 2e 61 2c 20 6f 6c 64 2e  L, ..old.a, old.
3d40: 62 2c 20 6f 6c 64 2e 63 2c 20 6f 6c 64 2e 64 2c  b, old.c, old.d,
3d50: 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   0, 0, 0, 0);.  
3d60: 45 4e 44 3b 0a 0a 20 20 43 52 45 41 54 45 20 54  END;..  CREATE T
3d70: 52 49 47 47 45 52 20 62 65 66 6f 72 65 5f 69 6e  RIGGER before_in
3d80: 73 65 72 74 20 49 4e 53 54 45 41 44 20 4f 46 20  sert INSTEAD OF 
3d90: 49 4e 53 45 52 54 20 4f 4e 20 61 62 63 64 20 42  INSERT ON abcd B
3da0: 45 47 49 4e 0a 20 20 20 20 49 4e 53 45 52 54 20  EGIN.    INSERT 
3db0: 49 4e 54 4f 20 74 6c 6f 67 20 56 41 4c 55 45 53  INTO tlog VALUES
3dc0: 28 4e 55 4c 4c 2c 20 0a 09 30 2c 20 30 2c 20 30  (NULL, ..0, 0, 0
3dd0: 2c 20 30 2c 20 6e 65 77 2e 61 2c 20 6e 65 77 2e  , 0, new.a, new.
3de0: 62 2c 20 6e 65 77 2e 63 2c 20 6e 65 77 2e 64 29  b, new.c, new.d)
3df0: 3b 0a 20 20 45 4e 44 3b 0a 20 20 20 43 52 45 41  ;.  END;.   CREA
3e00: 54 45 20 54 52 49 47 47 45 52 20 61 66 74 65 72  TE TRIGGER after
3e10: 5f 69 6e 73 65 72 74 20 49 4e 53 54 45 41 44 20  _insert INSTEAD 
3e20: 4f 46 20 49 4e 53 45 52 54 20 4f 4e 20 61 62 63  OF INSERT ON abc
3e30: 64 20 42 45 47 49 4e 0a 20 20 20 20 49 4e 53 45  d BEGIN.    INSE
3e40: 52 54 20 49 4e 54 4f 20 74 6c 6f 67 20 56 41 4c  RT INTO tlog VAL
3e50: 55 45 53 28 4e 55 4c 4c 2c 20 0a 09 30 2c 20 30  UES(NULL, ..0, 0
3e60: 2c 20 30 2c 20 30 2c 20 6e 65 77 2e 61 2c 20 6e  , 0, 0, new.a, n
3e70: 65 77 2e 62 2c 20 6e 65 77 2e 63 2c 20 6e 65 77  ew.b, new.c, new
3e80: 2e 64 29 3b 0a 20 20 20 45 4e 44 3b 0a 20 20 7d  .d);.   END;.  }
3e90: 0a 7d 20 7b 7d 3b 0a 0a 64 6f 5f 74 65 73 74 20  .} {};..do_test 
3ea0: 74 72 69 67 67 65 72 32 2d 37 2e 32 20 7b 0a 20  trigger2-7.2 {. 
3eb0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55   execsql {.    U
3ec0: 50 44 41 54 45 20 61 62 63 64 20 53 45 54 20 61  PDATE abcd SET a
3ed0: 20 3d 20 31 30 30 2c 20 62 20 3d 20 35 2a 35 20   = 100, b = 5*5 
3ee0: 57 48 45 52 45 20 61 20 3d 20 31 3b 0a 20 20 20  WHERE a = 1;.   
3ef0: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 61 62 63   DELETE FROM abc
3f00: 64 20 57 48 45 52 45 20 61 20 3d 20 31 3b 0a 20  d WHERE a = 1;. 
3f10: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
3f20: 62 63 64 20 56 41 4c 55 45 53 28 31 30 2c 20 32  bcd VALUES(10, 2
3f30: 30 2c 20 33 30 2c 20 34 30 29 3b 0a 20 20 20 20  0, 30, 40);.    
3f40: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 6c  SELECT * FROM tl
3f50: 6f 67 3b 0a 20 20 7d 0a 7d 20 5b 20 6c 69 73 74  og;.  }.} [ list
3f60: 20 31 20 31 20 32 20 33 20 34 20 31 30 30 20 32   1 1 2 3 4 100 2
3f70: 35 20 33 20 34 20 5c 0a 20 20 20 20 20 20 20 20  5 3 4 \.        
3f80: 20 32 20 31 20 32 20 33 20 34 20 31 30 30 20 32   2 1 2 3 4 100 2
3f90: 35 20 33 20 34 20 5c 0a 09 20 33 20 31 20 32 20  5 3 4 \.. 3 1 2 
3fa0: 33 20 34 20 30 20 30 20 30 20 30 20 5c 0a 09 20  3 4 0 0 0 0 \.. 
3fb0: 34 20 31 20 32 20 33 20 34 20 30 20 30 20 30 20  4 1 2 3 4 0 0 0 
3fc0: 30 20 5c 0a 09 20 35 20 30 20 30 20 30 20 30 20  0 \.. 5 0 0 0 0 
3fd0: 31 30 20 32 30 20 33 30 20 34 30 20 5c 0a 09 20  10 20 30 40 \.. 
3fe0: 36 20 30 20 30 20 30 20 30 20 31 30 20 32 30 20  6 0 0 0 0 10 20 
3ff0: 33 30 20 34 30 20 5d 0a 0a 64 6f 5f 74 65 73 74  30 40 ]..do_test
4000: 20 74 72 69 67 67 65 72 32 2d 37 2e 33 20 7b 0a   trigger2-7.3 {.
4010: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
4020: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 6c 6f 67  DELETE FROM tlog
4030: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
4040: 4f 20 61 62 63 64 20 56 41 4c 55 45 53 28 31 30  O abcd VALUES(10
4050: 2c 20 32 30 2c 20 33 30 2c 20 34 30 29 3b 0a 20  , 20, 30, 40);. 
4060: 20 20 20 55 50 44 41 54 45 20 61 62 63 64 20 53     UPDATE abcd S
4070: 45 54 20 61 20 3d 20 31 30 30 2c 20 62 20 3d 20  ET a = 100, b = 
4080: 35 2a 35 20 57 48 45 52 45 20 61 20 3d 20 31 3b  5*5 WHERE a = 1;
4090: 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  .    DELETE FROM
40a0: 20 61 62 63 64 20 57 48 45 52 45 20 61 20 3d 20   abcd WHERE a = 
40b0: 31 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  1;.    SELECT * 
40c0: 46 52 4f 4d 20 74 6c 6f 67 3b 0a 20 20 7d 0a 7d  FROM tlog;.  }.}
40d0: 20 5b 20 6c 69 73 74 20 5c 0a 20 20 20 31 20 30   [ list \.   1 0
40e0: 20 30 20 30 20 30 20 31 30 20 32 30 20 33 30 20   0 0 0 10 20 30 
40f0: 34 30 20 5c 0a 20 20 20 32 20 30 20 30 20 30 20  40 \.   2 0 0 0 
4100: 30 20 31 30 20 32 30 20 33 30 20 34 30 20 5c 0a  0 10 20 30 40 \.
4110: 20 20 20 33 20 31 20 32 20 33 20 34 20 31 30 30     3 1 2 3 4 100
4120: 20 32 35 20 33 20 34 20 5c 0a 20 20 20 34 20 31   25 3 4 \.   4 1
4130: 20 32 20 33 20 34 20 31 30 30 20 32 35 20 33 20   2 3 4 100 25 3 
4140: 34 20 5c 0a 20 20 20 35 20 31 20 32 20 33 20 34  4 \.   5 1 2 3 4
4150: 20 30 20 30 20 30 20 30 20 5c 0a 20 20 20 36 20   0 0 0 0 \.   6 
4160: 31 20 32 20 33 20 34 20 30 20 30 20 30 20 30 20  1 2 3 4 0 0 0 0 
4170: 5c 0a 5d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67  \.].do_test trig
4180: 67 65 72 32 2d 37 2e 34 20 7b 0a 20 20 65 78 65  ger2-7.4 {.  exe
4190: 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54  csql {.    DELET
41a0: 45 20 46 52 4f 4d 20 74 6c 6f 67 3b 0a 20 20 20  E FROM tlog;.   
41b0: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 61 62 63   DELETE FROM abc
41c0: 64 20 57 48 45 52 45 20 61 20 3d 20 31 3b 0a 20  d WHERE a = 1;. 
41d0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
41e0: 62 63 64 20 56 41 4c 55 45 53 28 31 30 2c 20 32  bcd VALUES(10, 2
41f0: 30 2c 20 33 30 2c 20 34 30 29 3b 0a 20 20 20 20  0, 30, 40);.    
4200: 55 50 44 41 54 45 20 61 62 63 64 20 53 45 54 20  UPDATE abcd SET 
4210: 61 20 3d 20 31 30 30 2c 20 62 20 3d 20 35 2a 35  a = 100, b = 5*5
4220: 20 57 48 45 52 45 20 61 20 3d 20 31 3b 0a 20 20   WHERE a = 1;.  
4230: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
4240: 74 6c 6f 67 3b 0a 20 20 7d 0a 7d 20 5b 20 6c 69  tlog;.  }.} [ li
4250: 73 74 20 5c 0a 20 20 20 31 20 31 20 32 20 33 20  st \.   1 1 2 3 
4260: 34 20 30 20 30 20 30 20 30 20 5c 0a 20 20 20 32  4 0 0 0 0 \.   2
4270: 20 31 20 32 20 33 20 34 20 30 20 30 20 30 20 30   1 2 3 4 0 0 0 0
4280: 20 5c 0a 20 20 20 33 20 30 20 30 20 30 20 30 20   \.   3 0 0 0 0 
4290: 31 30 20 32 30 20 33 30 20 34 30 20 5c 0a 20 20  10 20 30 40 \.  
42a0: 20 34 20 30 20 30 20 30 20 30 20 31 30 20 32 30   4 0 0 0 0 10 20
42b0: 20 33 30 20 34 30 20 5c 0a 20 20 20 35 20 31 20   30 40 \.   5 1 
42c0: 32 20 33 20 34 20 31 30 30 20 32 35 20 33 20 34  2 3 4 100 25 3 4
42d0: 20 5c 0a 20 20 20 36 20 31 20 32 20 33 20 34 20   \.   6 1 2 3 4 
42e0: 31 30 30 20 32 35 20 33 20 34 20 5c 0a 5d 0a 0a  100 25 3 4 \.]..
42f0: 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 32  do_test trigger2
4300: 2d 38 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  -8.1 {.  execsql
4310: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
4320: 42 4c 45 20 74 31 28 61 2c 62 2c 63 29 3b 0a 20  BLE t1(a,b,c);. 
4330: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
4340: 31 20 56 41 4c 55 45 53 28 31 2c 32 2c 33 29 3b  1 VALUES(1,2,3);
4350: 0a 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57  .    CREATE VIEW
4360: 20 76 31 20 41 53 0a 20 20 20 20 20 20 53 45 4c   v1 AS.      SEL
4370: 45 43 54 20 61 2b 62 20 41 53 20 78 2c 20 62 2b  ECT a+b AS x, b+
4380: 63 20 41 53 20 79 2c 20 61 2b 63 20 41 53 20 7a  c AS y, a+c AS z
4390: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 53 45   FROM t1;.    SE
43a0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 76 31 3b 0a  LECT * FROM v1;.
43b0: 20 20 7d 0a 7d 20 7b 33 20 35 20 34 7d 0a 64 6f    }.} {3 5 4}.do
43c0: 5f 74 65 73 74 20 74 72 69 67 67 65 72 32 2d 38  _test trigger2-8
43d0: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
43e0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
43f0: 45 20 76 31 6c 6f 67 28 61 2c 62 2c 63 2c 64 2c  E v1log(a,b,c,d,
4400: 65 2c 66 29 3b 0a 20 20 20 20 43 52 45 41 54 45  e,f);.    CREATE
4410: 20 54 52 49 47 47 45 52 20 72 31 20 49 4e 53 54   TRIGGER r1 INST
4420: 45 41 44 20 4f 46 20 44 45 4c 45 54 45 20 4f 4e  EAD OF DELETE ON
4430: 20 76 31 20 42 45 47 49 4e 0a 20 20 20 20 20 20   v1 BEGIN.      
4440: 49 4e 53 45 52 54 20 49 4e 54 4f 20 76 31 6c 6f  INSERT INTO v1lo
4450: 67 20 56 41 4c 55 45 53 28 4f 4c 44 2e 78 2c 4e  g VALUES(OLD.x,N
4460: 55 4c 4c 2c 4f 4c 44 2e 79 2c 4e 55 4c 4c 2c 4f  ULL,OLD.y,NULL,O
4470: 4c 44 2e 7a 2c 4e 55 4c 4c 29 3b 0a 20 20 20 20  LD.z,NULL);.    
4480: 45 4e 44 3b 0a 20 20 20 20 44 45 4c 45 54 45 20  END;.    DELETE 
4490: 46 52 4f 4d 20 76 31 20 57 48 45 52 45 20 78 3d  FROM v1 WHERE x=
44a0: 31 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  1;.    SELECT * 
44b0: 46 52 4f 4d 20 76 31 6c 6f 67 3b 0a 20 20 7d 0a  FROM v1log;.  }.
44c0: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69  } {}.do_test tri
44d0: 67 67 65 72 32 2d 38 2e 33 20 7b 0a 20 20 65 78  gger2-8.3 {.  ex
44e0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45  ecsql {.    DELE
44f0: 54 45 20 46 52 4f 4d 20 76 31 20 57 48 45 52 45  TE FROM v1 WHERE
4500: 20 78 3d 33 3b 0a 20 20 20 20 53 45 4c 45 43 54   x=3;.    SELECT
4510: 20 2a 20 46 52 4f 4d 20 76 31 6c 6f 67 3b 0a 20   * FROM v1log;. 
4520: 20 7d 0a 7d 20 7b 33 20 7b 7d 20 35 20 7b 7d 20   }.} {3 {} 5 {} 
4530: 34 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 72  4 {}}.do_test tr
4540: 69 67 67 65 72 32 2d 38 2e 34 20 7b 0a 20 20 65  igger2-8.4 {.  e
4550: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53  xecsql {.    INS
4560: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
4570: 45 53 28 34 2c 35 2c 36 29 3b 0a 20 20 20 20 44  ES(4,5,6);.    D
4580: 45 4c 45 54 45 20 46 52 4f 4d 20 76 31 6c 6f 67  ELETE FROM v1log
4590: 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  ;.    DELETE FRO
45a0: 4d 20 76 31 20 57 48 45 52 45 20 79 3d 31 31 3b  M v1 WHERE y=11;
45b0: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
45c0: 4f 4d 20 76 31 6c 6f 67 3b 0a 20 20 7d 0a 7d 20  OM v1log;.  }.} 
45d0: 7b 39 20 7b 7d 20 31 31 20 7b 7d 20 31 30 20 7b  {9 {} 11 {} 10 {
45e0: 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67  }}.do_test trigg
45f0: 65 72 32 2d 38 2e 35 20 7b 0a 20 20 65 78 65 63  er2-8.5 {.  exec
4600: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
4610: 20 54 52 49 47 47 45 52 20 72 32 20 49 4e 53 54   TRIGGER r2 INST
4620: 45 41 44 20 4f 46 20 49 4e 53 45 52 54 20 4f 4e  EAD OF INSERT ON
4630: 20 76 31 20 42 45 47 49 4e 0a 20 20 20 20 20 20   v1 BEGIN.      
4640: 49 4e 53 45 52 54 20 49 4e 54 4f 20 76 31 6c 6f  INSERT INTO v1lo
4650: 67 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 4e 45  g VALUES(NULL,NE
4660: 57 2e 78 2c 4e 55 4c 4c 2c 4e 45 57 2e 79 2c 4e  W.x,NULL,NEW.y,N
4670: 55 4c 4c 2c 4e 45 57 2e 7a 29 3b 0a 20 20 20 20  ULL,NEW.z);.    
4680: 45 4e 44 3b 0a 20 20 20 20 44 45 4c 45 54 45 20  END;.    DELETE 
4690: 46 52 4f 4d 20 76 31 6c 6f 67 3b 0a 20 20 20 20  FROM v1log;.    
46a0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 76 31 20 56  INSERT INTO v1 V
46b0: 41 4c 55 45 53 28 31 2c 32 2c 33 29 3b 0a 20 20  ALUES(1,2,3);.  
46c0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
46d0: 76 31 6c 6f 67 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d  v1log;.  }.} {{}
46e0: 20 31 20 7b 7d 20 32 20 7b 7d 20 33 7d 0a 64 6f   1 {} 2 {} 3}.do
46f0: 5f 74 65 73 74 20 74 72 69 67 67 65 72 32 2d 38  _test trigger2-8
4700: 2e 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .6 {.  execsql {
4710: 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47  .    CREATE TRIG
4720: 47 45 52 20 72 33 20 49 4e 53 54 45 41 44 20 4f  GER r3 INSTEAD O
4730: 46 20 55 50 44 41 54 45 20 4f 4e 20 76 31 20 42  F UPDATE ON v1 B
4740: 45 47 49 4e 0a 20 20 20 20 20 20 49 4e 53 45 52  EGIN.      INSER
4750: 54 20 49 4e 54 4f 20 76 31 6c 6f 67 20 56 41 4c  T INTO v1log VAL
4760: 55 45 53 28 4f 4c 44 2e 78 2c 4e 45 57 2e 78 2c  UES(OLD.x,NEW.x,
4770: 4f 4c 44 2e 79 2c 4e 45 57 2e 79 2c 4f 4c 44 2e  OLD.y,NEW.y,OLD.
4780: 7a 2c 4e 45 57 2e 7a 29 3b 0a 20 20 20 20 45 4e  z,NEW.z);.    EN
4790: 44 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52  D;.    DELETE FR
47a0: 4f 4d 20 76 31 6c 6f 67 3b 0a 20 20 20 20 55 50  OM v1log;.    UP
47b0: 44 41 54 45 20 76 31 20 53 45 54 20 78 3d 78 2b  DATE v1 SET x=x+
47c0: 31 30 30 2c 20 79 3d 79 2b 32 30 30 2c 20 7a 3d  100, y=y+200, z=
47d0: 7a 2b 33 30 30 3b 0a 20 20 20 20 53 45 4c 45 43  z+300;.    SELEC
47e0: 54 20 2a 20 46 52 4f 4d 20 76 31 6c 6f 67 3b 0a  T * FROM v1log;.
47f0: 20 20 7d 0a 7d 20 7b 33 20 31 30 33 20 35 20 32    }.} {3 103 5 2
4800: 30 35 20 34 20 33 30 34 20 39 20 31 30 39 20 31  05 4 304 9 109 1
4810: 31 20 32 31 31 20 31 30 20 33 31 30 7d 0a 0a 7d  1 211 10 310}..}
4820: 20 3b 23 20 69 66 63 61 70 61 62 6c 65 20 76 69   ;# ifcapable vi
4830: 65 77 0a 0a 69 6e 74 65 67 72 69 74 79 5f 63 68  ew..integrity_ch
4840: 65 63 6b 20 74 72 69 67 67 65 72 32 2d 39 2e 39  eck trigger2-9.9
4850: 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a        ..finish_test.