/ Hex Artifact Content
Login

Artifact 3806d257b32e95ada0b230161ce9d36e4a7f335a:


0000: 23 20 32 30 30 39 20 41 75 67 75 73 74 20 32 34  # 2009 August 24
0010: 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20  .#.# The author 
0020: 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69  disclaims copyri
0030: 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72  ght to this sour
0040: 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61  ce code.  In pla
0050: 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20  ce of.# a legal 
0060: 6e 6f 74 69 63 65 27 2c 20 68 65 72 65 20 69 73  notice', here is
0070: 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23   a blessing:.#.#
0080: 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67      May you do g
0090: 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c  ood and not evil
00a0: 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66  ..#    May you f
00b0: 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20  ind forgiveness 
00c0: 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64  for yourself and
00d0: 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e   forgive others.
00e0: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68  .#    May you sh
00f0: 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65  are freely, neve
0100: 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68  r taking more th
0110: 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23  an you give..#.#
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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 0a 23 0a 0a 73 65 74 20 74  *******.#..set t
0170: 65 73 74 64 69 72 20 5b 66 69 6c 65 20 64 69 72  estdir [file dir
0180: 6e 61 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f 75  name $argv0].sou
0190: 72 63 65 20 24 74 65 73 74 64 69 72 2f 74 65 73  rce $testdir/tes
01a0: 74 65 72 2e 74 63 6c 0a 69 66 63 61 70 61 62 6c  ter.tcl.ifcapabl
01b0: 65 20 7b 21 74 72 69 67 67 65 72 7d 20 7b 0a 20  e {!trigger} {. 
01c0: 20 66 69 6e 69 73 68 5f 74 65 73 74 0a 20 20 72   finish_test.  r
01d0: 65 74 75 72 6e 0a 7d 0a 0a 23 20 45 6e 61 62 6c  eturn.}..# Enabl
01e0: 65 20 72 65 63 75 72 73 69 76 65 20 74 72 69 67  e recursive trig
01f0: 67 65 72 73 20 66 6f 72 20 74 68 69 73 20 66 69  gers for this fi
0200: 6c 65 2e 0a 23 0a 65 78 65 63 73 71 6c 20 7b 20  le..#.execsql { 
0210: 50 52 41 47 4d 41 20 64 69 73 61 62 6c 65 5f 72  PRAGMA disable_r
0220: 65 63 75 72 73 69 76 65 5f 74 72 69 67 67 65 72  ecursive_trigger
0230: 73 20 3d 20 30 20 7d 0a 0a 23 73 71 6c 69 74 65  s = 0 }..#sqlite
0240: 33 5f 64 62 5f 63 6f 6e 66 69 67 5f 6c 6f 6f 6b  3_db_config_look
0250: 61 73 69 64 65 20 64 62 20 30 20 30 20 30 0a 0a  aside db 0 0 0..
0260: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
0270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 69  ----------.# Thi
02b0: 73 20 62 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73  s block of tests
02c0: 2c 20 74 72 69 67 67 65 72 43 2d 31 2e 2a 2c 20  , triggerC-1.*, 
02d0: 61 72 65 20 6e 6f 74 20 61 69 6d 65 64 20 61 74  are not aimed at
02e0: 20 61 6e 79 20 73 70 65 63 69 66 69 63 0a 23 20   any specific.# 
02f0: 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20  property of the 
0300: 74 72 69 67 67 65 72 73 20 73 75 62 2d 73 79 73  triggers sub-sys
0310: 74 65 6d 2e 20 54 68 65 79 20 77 65 72 65 20 63  tem. They were c
0320: 72 65 61 74 65 64 20 74 6f 20 64 65 62 75 67 0a  reated to debug.
0330: 23 20 73 70 65 63 69 66 69 63 20 70 72 6f 62 6c  # specific probl
0340: 65 6d 73 20 77 68 69 6c 65 20 6d 6f 64 69 66 79  ems while modify
0350: 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20 73 75  ing SQLite to su
0360: 70 70 6f 72 74 20 72 65 63 75 72 73 69 76 65 0a  pport recursive.
0370: 23 20 74 72 69 67 67 65 72 73 2e 20 54 68 65 79  # triggers. They
0380: 20 61 72 65 20 6c 65 66 74 20 68 65 72 65 20 69   are left here i
0390: 6e 20 63 61 73 65 20 74 68 65 79 20 63 61 6e 20  n case they can 
03a0: 68 65 6c 70 20 64 65 62 75 67 20 74 68 65 0a 23  help debug the.#
03b0: 20 73 61 6d 65 20 70 72 6f 62 6c 65 6d 73 20 61   same problems a
03c0: 67 61 69 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  gain..#.do_test 
03d0: 74 72 69 67 67 65 72 43 2d 31 2e 31 20 7b 0a 20  triggerC-1.1 {. 
03e0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
03f0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
0400: 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20 43 52 45  , b, c);.    CRE
0410: 41 54 45 20 54 41 42 4c 45 20 6c 6f 67 28 74 2c  ATE TABLE log(t,
0420: 20 61 31 2c 20 62 31 2c 20 63 31 2c 20 61 32 2c   a1, b1, c1, a2,
0430: 20 62 32 2c 20 63 32 29 3b 0a 20 20 20 20 43 52   b2, c2);.    CR
0440: 45 41 54 45 20 54 52 49 47 47 45 52 20 74 72 69  EATE TRIGGER tri
0450: 67 31 20 42 45 46 4f 52 45 20 49 4e 53 45 52 54  g1 BEFORE INSERT
0460: 20 4f 4e 20 74 31 20 42 45 47 49 4e 0a 20 20 20   ON t1 BEGIN.   
0470: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c     INSERT INTO l
0480: 6f 67 20 56 41 4c 55 45 53 28 27 62 65 66 6f 72  og VALUES('befor
0490: 65 27 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  e', NULL, NULL, 
04a0: 4e 55 4c 4c 2c 20 6e 65 77 2e 61 2c 20 6e 65 77  NULL, new.a, new
04b0: 2e 62 2c 20 6e 65 77 2e 63 29 3b 0a 20 20 20 20  .b, new.c);.    
04c0: 45 4e 44 3b 0a 20 20 20 20 43 52 45 41 54 45 20  END;.    CREATE 
04d0: 54 52 49 47 47 45 52 20 74 72 69 67 32 20 41 46  TRIGGER trig2 AF
04e0: 54 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 74 31  TER INSERT ON t1
04f0: 20 42 45 47 49 4e 0a 20 20 20 20 20 20 49 4e 53   BEGIN.      INS
0500: 45 52 54 20 49 4e 54 4f 20 6c 6f 67 20 56 41 4c  ERT INTO log VAL
0510: 55 45 53 28 27 61 66 74 65 72 27 2c 20 4e 55 4c  UES('after', NUL
0520: 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 6e  L, NULL, NULL, n
0530: 65 77 2e 61 2c 20 6e 65 77 2e 62 2c 20 6e 65 77  ew.a, new.b, new
0540: 2e 63 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20  .c);.    END;.  
0550: 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52    CREATE TRIGGER
0560: 20 74 72 69 67 33 20 42 45 46 4f 52 45 20 55 50   trig3 BEFORE UP
0570: 44 41 54 45 20 4f 4e 20 74 31 20 42 45 47 49 4e  DATE ON t1 BEGIN
0580: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
0590: 54 4f 20 6c 6f 67 20 56 41 4c 55 45 53 28 27 62  TO log VALUES('b
05a0: 65 66 6f 72 65 27 2c 20 6f 6c 64 2e 61 2c 6f 6c  efore', old.a,ol
05b0: 64 2e 62 2c 6f 6c 64 2e 63 2c 20 6e 65 77 2e 61  d.b,old.c, new.a
05c0: 2c 6e 65 77 2e 62 2c 6e 65 77 2e 63 29 3b 0a 20  ,new.b,new.c);. 
05d0: 20 20 20 45 4e 44 3b 0a 20 20 20 20 43 52 45 41     END;.    CREA
05e0: 54 45 20 54 52 49 47 47 45 52 20 74 72 69 67 34  TE TRIGGER trig4
05f0: 20 41 46 54 45 52 20 55 50 44 41 54 45 20 4f 4e   AFTER UPDATE ON
0600: 20 74 31 20 42 45 47 49 4e 0a 20 20 20 20 20 20   t1 BEGIN.      
0610: 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c 6f 67 20  INSERT INTO log 
0620: 56 41 4c 55 45 53 28 27 61 66 74 65 72 27 2c 20  VALUES('after', 
0630: 6f 6c 64 2e 61 2c 6f 6c 64 2e 62 2c 6f 6c 64 2e  old.a,old.b,old.
0640: 63 2c 20 6e 65 77 2e 61 2c 6e 65 77 2e 62 2c 6e  c, new.a,new.b,n
0650: 65 77 2e 63 29 3b 0a 20 20 20 20 45 4e 44 3b 0a  ew.c);.    END;.
0660: 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47  .    CREATE TRIG
0670: 47 45 52 20 74 72 69 67 35 20 42 45 46 4f 52 45  GER trig5 BEFORE
0680: 20 44 45 4c 45 54 45 20 4f 4e 20 74 31 20 42 45   DELETE ON t1 BE
0690: 47 49 4e 0a 20 20 20 20 20 20 49 4e 53 45 52 54  GIN.      INSERT
06a0: 20 49 4e 54 4f 20 6c 6f 67 20 56 41 4c 55 45 53   INTO log VALUES
06b0: 28 27 62 65 66 6f 72 65 27 2c 20 6f 6c 64 2e 61  ('before', old.a
06c0: 2c 6f 6c 64 2e 62 2c 6f 6c 64 2e 63 2c 20 4e 55  ,old.b,old.c, NU
06d0: 4c 4c 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 20  LL,NULL,NULL);. 
06e0: 20 20 20 45 4e 44 3b 0a 20 20 20 20 43 52 45 41     END;.    CREA
06f0: 54 45 20 54 52 49 47 47 45 52 20 74 72 69 67 36  TE TRIGGER trig6
0700: 20 41 46 54 45 52 20 44 45 4c 45 54 45 20 4f 4e   AFTER DELETE ON
0710: 20 74 31 20 42 45 47 49 4e 0a 20 20 20 20 20 20   t1 BEGIN.      
0720: 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c 6f 67 20  INSERT INTO log 
0730: 56 41 4c 55 45 53 28 27 61 66 74 65 72 27 2c 20  VALUES('after', 
0740: 6f 6c 64 2e 61 2c 6f 6c 64 2e 62 2c 6f 6c 64 2e  old.a,old.b,old.
0750: 63 2c 20 4e 55 4c 4c 2c 4e 55 4c 4c 2c 4e 55 4c  c, NULL,NULL,NUL
0760: 4c 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 7d  L);.    END;.  }
0770: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 74 72  .} {}.do_test tr
0780: 69 67 67 65 72 43 2d 31 2e 32 20 7b 0a 20 20 65  iggerC-1.2 {.  e
0790: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53  xecsql {.    INS
07a0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
07b0: 45 53 28 27 41 27 2c 20 27 42 27 2c 20 27 43 27  ES('A', 'B', 'C'
07c0: 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  );.    SELECT * 
07d0: 46 52 4f 4d 20 6c 6f 67 3b 0a 20 20 7d 0a 7d 20  FROM log;.  }.} 
07e0: 7b 62 65 66 6f 72 65 20 7b 7d 20 7b 7d 20 7b 7d  {before {} {} {}
07f0: 20 41 20 42 20 43 20 61 66 74 65 72 20 7b 7d 20   A B C after {} 
0800: 7b 7d 20 7b 7d 20 41 20 42 20 43 7d 0a 64 6f 5f  {} {} A B C}.do_
0810: 74 65 73 74 20 74 72 69 67 67 65 72 43 2d 31 2e  test triggerC-1.
0820: 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  3 {.  execsql { 
0830: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
0840: 20 7d 0a 7d 20 7b 41 20 42 20 43 7d 0a 64 6f 5f   }.} {A B C}.do_
0850: 74 65 73 74 20 74 72 69 67 67 65 72 43 2d 31 2e  test triggerC-1.
0860: 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  4 {.  execsql {.
0870: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
0880: 6c 6f 67 3b 0a 20 20 20 20 55 50 44 41 54 45 20  log;.    UPDATE 
0890: 74 31 20 53 45 54 20 61 20 3d 20 27 61 27 3b 0a  t1 SET a = 'a';.
08a0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
08b0: 4d 20 6c 6f 67 3b 0a 20 20 7d 0a 7d 20 7b 62 65  M log;.  }.} {be
08c0: 66 6f 72 65 20 41 20 42 20 43 20 61 20 42 20 43  fore A B C a B C
08d0: 20 61 66 74 65 72 20 41 20 42 20 43 20 61 20 42   after A B C a B
08e0: 20 43 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67   C}.do_test trig
08f0: 67 65 72 43 2d 31 2e 35 20 7b 0a 20 20 65 78 65  gerC-1.5 {.  exe
0900: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
0910: 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 61 20 42  FROM t1 }.} {a B
0920: 20 43 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67   C}.do_test trig
0930: 67 65 72 43 2d 31 2e 36 20 7b 0a 20 20 65 78 65  gerC-1.6 {.  exe
0940: 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54  csql {.    DELET
0950: 45 20 46 52 4f 4d 20 6c 6f 67 3b 0a 20 20 20 20  E FROM log;.    
0960: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 3b 0a  DELETE FROM t1;.
0970: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
0980: 4d 20 6c 6f 67 3b 0a 20 20 7d 0a 7d 20 7b 62 65  M log;.  }.} {be
0990: 66 6f 72 65 20 61 20 42 20 43 20 7b 7d 20 7b 7d  fore a B C {} {}
09a0: 20 7b 7d 20 61 66 74 65 72 20 61 20 42 20 43 20   {} after a B C 
09b0: 7b 7d 20 7b 7d 20 7b 7d 7d 0a 64 6f 5f 74 65 73  {} {} {}}.do_tes
09c0: 74 20 74 72 69 67 67 65 72 43 2d 31 2e 37 20 7b  t triggerC-1.7 {
09d0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
09e0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a  ECT * FROM t1 }.
09f0: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69  } {}.do_test tri
0a00: 67 67 65 72 43 2d 31 2e 38 20 7b 0a 20 20 65 78  ggerC-1.8 {.  ex
0a10: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
0a20: 54 45 20 54 41 42 4c 45 20 74 34 28 61 2c 20 62  TE TABLE t4(a, b
0a30: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 52  );.    CREATE TR
0a40: 49 47 47 45 52 20 74 34 74 20 41 46 54 45 52 20  IGGER t4t AFTER 
0a50: 44 45 4c 45 54 45 20 4f 4e 20 74 34 20 42 45 47  DELETE ON t4 BEG
0a60: 49 4e 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  IN.      SELECT 
0a70: 52 41 49 53 45 28 41 42 4f 52 54 2c 20 27 64 65  RAISE(ABORT, 'de
0a80: 6c 65 74 65 20 69 73 20 6e 6f 74 20 73 75 70 70  lete is not supp
0a90: 6f 72 74 65 64 27 29 3b 0a 20 20 20 20 45 4e 44  orted');.    END
0aa0: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
0ab0: 73 74 20 74 72 69 67 67 65 72 43 2d 31 2e 39 20  st triggerC-1.9 
0ac0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e  {.  execsql { IN
0ad0: 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c  SERT INTO t4 VAL
0ae0: 55 45 53 28 31 2c 20 32 29 20 7d 0a 20 20 63 61  UES(1, 2) }.  ca
0af0: 74 63 68 73 71 6c 20 7b 20 44 45 4c 45 54 45 20  tchsql { DELETE 
0b00: 46 52 4f 4d 20 74 34 20 7d 0a 7d 20 7b 31 20 7b  FROM t4 }.} {1 {
0b10: 64 65 6c 65 74 65 20 69 73 20 6e 6f 74 20 73 75  delete is not su
0b20: 70 70 6f 72 74 65 64 7d 7d 0a 64 6f 5f 74 65 73  pported}}.do_tes
0b30: 74 20 74 72 69 67 67 65 72 43 2d 31 2e 31 30 20  t triggerC-1.10 
0b40: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  {.  execsql { SE
0b50: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 34 20 7d  LECT * FROM t4 }
0b60: 0a 7d 20 7b 31 20 32 7d 0a 64 6f 5f 74 65 73 74  .} {1 2}.do_test
0b70: 20 74 72 69 67 67 65 72 43 2d 31 2e 31 31 20 7b   triggerC-1.11 {
0b80: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
0b90: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 35   CREATE TABLE t5
0ba0: 20 28 61 20 70 72 69 6d 61 72 79 20 6b 65 79 2c   (a primary key,
0bb0: 20 62 2c 20 63 29 3b 0a 20 20 20 20 49 4e 53 45   b, c);.    INSE
0bc0: 52 54 20 49 4e 54 4f 20 74 35 20 76 61 6c 75 65  RT INTO t5 value
0bd0: 73 20 28 31 2c 20 32 2c 20 33 29 3b 0a 20 20 20  s (1, 2, 3);.   
0be0: 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20   CREATE TRIGGER 
0bf0: 61 75 5f 74 62 6c 20 41 46 54 45 52 20 55 50 44  au_tbl AFTER UPD
0c00: 41 54 45 20 4f 4e 20 74 35 20 42 45 47 49 4e 0a  ATE ON t5 BEGIN.
0c10: 20 20 20 20 20 20 55 50 44 41 54 45 20 4f 52 20        UPDATE OR 
0c20: 49 47 4e 4f 52 45 20 74 35 20 53 45 54 20 61 20  IGNORE t5 SET a 
0c30: 3d 20 6e 65 77 2e 61 2c 20 63 20 3d 20 31 30 3b  = new.a, c = 10;
0c40: 0a 20 20 20 20 45 4e 44 3b 0a 20 20 7d 0a 7d 20  .    END;.  }.} 
0c50: 7b 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67  {}.do_test trigg
0c60: 65 72 43 2d 31 2e 31 32 20 7b 0a 20 20 63 61 74  erC-1.12 {.  cat
0c70: 63 68 73 71 6c 20 7b 20 55 50 44 41 54 45 20 4f  chsql { UPDATE O
0c80: 52 20 52 45 50 4c 41 43 45 20 74 35 20 53 45 54  R REPLACE t5 SET
0c90: 20 61 20 3d 20 34 20 57 48 45 52 45 20 61 20 3d   a = 4 WHERE a =
0ca0: 20 31 20 7d 0a 7d 20 7b 31 20 7b 74 6f 6f 20 6d   1 }.} {1 {too m
0cb0: 61 6e 79 20 6c 65 76 65 6c 73 20 6f 66 20 74 72  any levels of tr
0cc0: 69 67 67 65 72 20 72 65 63 75 72 73 69 6f 6e 7d  igger recursion}
0cd0: 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65  }.do_test trigge
0ce0: 72 43 2d 31 2e 31 33 20 7b 0a 20 20 65 78 65 63  rC-1.13 {.  exec
0cf0: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
0d00: 20 54 41 42 4c 45 20 74 36 28 61 20 49 4e 54 45   TABLE t6(a INTE
0d10: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
0d20: 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   b);.    INSERT 
0d30: 49 4e 54 4f 20 74 36 20 56 41 4c 55 45 53 28 31  INTO t6 VALUES(1
0d40: 2c 20 32 29 3b 0a 20 20 20 20 63 72 65 61 74 65  , 2);.    create
0d50: 20 74 72 69 67 67 65 72 20 72 31 20 61 66 74 65   trigger r1 afte
0d60: 72 20 75 70 64 61 74 65 20 6f 6e 20 74 36 20 66  r update on t6 f
0d70: 6f 72 20 65 61 63 68 20 72 6f 77 20 62 65 67 69  or each row begi
0d80: 6e 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 31  n.      SELECT 1
0d90: 3b 0a 20 20 20 20 65 6e 64 3b 0a 20 20 20 20 55  ;.    end;.    U
0da0: 50 44 41 54 45 20 74 36 20 53 45 54 20 61 3d 61  PDATE t6 SET a=a
0db0: 3b 20 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  ; .  }.} {}.do_t
0dc0: 65 73 74 20 74 72 69 67 67 65 72 43 2d 31 2e 31  est triggerC-1.1
0dd0: 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  4 {.  execsql {.
0de0: 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74      DROP TABLE t
0df0: 31 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  1;.    CREATE TA
0e00: 42 4c 45 20 63 6e 74 28 6e 29 3b 0a 20 20 20 20  BLE cnt(n);.    
0e10: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 6e 74 20  INSERT INTO cnt 
0e20: 56 41 4c 55 45 53 28 30 29 3b 0a 20 20 20 20 43  VALUES(0);.    C
0e30: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
0e40: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
0e50: 20 4b 45 59 2c 20 62 20 55 4e 49 51 55 45 2c 20   KEY, b UNIQUE, 
0e60: 63 2c 20 64 2c 20 65 29 3b 0a 20 20 20 20 43 52  c, d, e);.    CR
0e70: 45 41 54 45 20 49 4e 44 45 58 20 74 31 63 64 20  EATE INDEX t1cd 
0e80: 4f 4e 20 74 31 28 63 2c 64 29 3b 0a 20 20 20 20  ON t1(c,d);.    
0e90: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74  CREATE TRIGGER t
0ea0: 31 72 31 20 41 46 54 45 52 20 55 50 44 41 54 45  1r1 AFTER UPDATE
0eb0: 20 4f 4e 20 74 31 20 42 45 47 49 4e 20 55 50 44   ON t1 BEGIN UPD
0ec0: 41 54 45 20 63 6e 74 20 53 45 54 20 6e 3d 6e 2b  ATE cnt SET n=n+
0ed0: 31 3b 20 45 4e 44 3b 0a 20 20 20 20 49 4e 53 45  1; END;.    INSE
0ee0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
0ef0: 53 28 31 2c 32 2c 33 2c 34 2c 35 29 3b 0a 20 20  S(1,2,3,4,5);.  
0f00: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
0f10: 20 56 41 4c 55 45 53 28 36 2c 37 2c 38 2c 39 2c   VALUES(6,7,8,9,
0f20: 31 30 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  10);.    INSERT 
0f30: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
0f40: 31 2c 31 32 2c 31 33 2c 31 34 2c 31 35 29 3b 0a  1,12,13,14,15);.
0f50: 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
0f60: 20 74 72 69 67 67 65 72 43 2d 31 2e 31 35 20 7b   triggerC-1.15 {
0f70: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 55 50  .  catchsql { UP
0f80: 44 41 54 45 20 4f 52 20 52 4f 4c 4c 42 41 43 4b  DATE OR ROLLBACK
0f90: 20 74 31 20 53 45 54 20 61 3d 31 30 30 20 7d 0a   t1 SET a=100 }.
0fa0: 7d 20 7b 31 20 7b 50 52 49 4d 41 52 59 20 4b 45  } {1 {PRIMARY KE
0fb0: 59 20 6d 75 73 74 20 62 65 20 75 6e 69 71 75 65  Y must be unique
0fc0: 7d 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }}...#----------
0fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1010: 23 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20  # This block of 
1020: 74 65 73 74 73 2c 20 74 72 69 67 67 65 72 43 2d  tests, triggerC-
1030: 32 2e 2a 2c 20 74 65 73 74 73 20 74 68 61 74 20  2.*, tests that 
1040: 72 65 63 75 72 73 69 76 65 20 74 72 69 67 67 65  recursive trigge
1050: 72 0a 23 20 70 72 6f 67 72 61 6d 73 20 28 74 72  r.# programs (tr
1060: 69 67 67 65 72 73 20 74 68 61 74 20 66 69 72 65  iggers that fire
1070: 20 74 68 65 6d 73 65 6c 76 65 73 29 20 77 6f 72   themselves) wor
1080: 6b 2e 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63  k. More specific
1090: 61 6c 6c 79 2c 0a 23 20 74 68 69 73 20 62 6c 6f  ally,.# this blo
10a0: 63 6b 20 66 6f 63 75 73 65 73 20 6f 6e 20 72 65  ck focuses on re
10b0: 63 75 72 73 69 76 65 20 49 4e 53 45 52 54 20 74  cursive INSERT t
10c0: 72 69 67 67 65 72 73 2e 0a 23 0a 64 6f 5f 74 65  riggers..#.do_te
10d0: 73 74 20 74 72 69 67 67 65 72 43 2d 32 2e 31 2e  st triggerC-2.1.
10e0: 30 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  0 {.  execsql {.
10f0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
1100: 20 74 32 28 61 20 50 52 49 4d 41 52 59 20 4b 45   t2(a PRIMARY KE
1110: 59 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 66 6f  Y);.  }.} {}..fo
1120: 72 65 61 63 68 20 7b 6e 20 74 64 65 66 6e 20 72  reach {n tdefn r
1130: 63 7d 20 7b 0a 20 20 31 20 7b 20 0a 20 20 20 20  c} {.  1 { .    
1140: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74  CREATE TRIGGER t
1150: 32 5f 74 72 69 67 20 41 46 54 45 52 20 49 4e 53  2_trig AFTER INS
1160: 45 52 54 20 4f 4e 20 74 32 20 57 48 45 4e 20 28  ERT ON t2 WHEN (
1170: 6e 65 77 2e 61 3e 30 29 20 42 45 47 49 4e 0a 20  new.a>0) BEGIN. 
1180: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
1190: 20 74 32 20 56 41 4c 55 45 53 28 6e 65 77 2e 61   t2 VALUES(new.a
11a0: 20 2d 20 31 29 3b 0a 20 20 20 20 45 4e 44 3b 20   - 1);.    END; 
11b0: 0a 20 20 7d 20 7b 30 20 7b 31 30 20 39 20 38 20  .  } {0 {10 9 8 
11c0: 37 20 36 20 35 20 34 20 33 20 32 20 31 20 30 7d  7 6 5 4 3 2 1 0}
11d0: 7d 0a 0a 20 20 32 20 7b 0a 20 20 20 20 43 52 45  }..  2 {.    CRE
11e0: 41 54 45 20 54 52 49 47 47 45 52 20 74 32 5f 74  ATE TRIGGER t2_t
11f0: 72 69 67 20 41 46 54 45 52 20 49 4e 53 45 52 54  rig AFTER INSERT
1200: 20 4f 4e 20 74 32 20 42 45 47 49 4e 0a 20 20 20   ON t2 BEGIN.   
1210: 20 20 20 53 45 4c 45 43 54 20 43 41 53 45 20 57     SELECT CASE W
1220: 48 45 4e 20 6e 65 77 2e 61 3d 3d 32 20 54 48 45  HEN new.a==2 THE
1230: 4e 20 52 41 49 53 45 28 49 47 4e 4f 52 45 29 20  N RAISE(IGNORE) 
1240: 45 4c 53 45 20 4e 55 4c 4c 20 45 4e 44 3b 0a 20  ELSE NULL END;. 
1250: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
1260: 20 74 32 20 56 41 4c 55 45 53 28 6e 65 77 2e 61   t2 VALUES(new.a
1270: 20 2d 20 31 29 3b 0a 20 20 20 20 45 4e 44 3b 0a   - 1);.    END;.
1280: 20 20 7d 20 7b 30 20 7b 31 30 20 39 20 38 20 37    } {0 {10 9 8 7
1290: 20 36 20 35 20 34 20 33 20 32 7d 7d 0a 0a 20 20   6 5 4 3 2}}..  
12a0: 33 20 7b 20 0a 20 20 20 20 43 52 45 41 54 45 20  3 { .    CREATE 
12b0: 54 52 49 47 47 45 52 20 74 32 5f 74 72 69 67 20  TRIGGER t2_trig 
12c0: 42 45 46 4f 52 45 20 49 4e 53 45 52 54 20 4f 4e  BEFORE INSERT ON
12d0: 20 74 32 20 57 48 45 4e 20 28 6e 65 77 2e 61 3e   t2 WHEN (new.a>
12e0: 30 29 20 42 45 47 49 4e 0a 20 20 20 20 20 20 49  0) BEGIN.      I
12f0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
1300: 4c 55 45 53 28 6e 65 77 2e 61 20 2d 20 31 29 3b  LUES(new.a - 1);
1310: 0a 20 20 20 20 45 4e 44 3b 20 0a 20 20 7d 20 7b  .    END; .  } {
1320: 30 20 7b 30 20 31 20 32 20 33 20 34 20 35 20 36  0 {0 1 2 3 4 5 6
1330: 20 37 20 38 20 39 20 31 30 7d 7d 0a 0a 20 20 34   7 8 9 10}}..  4
1340: 20 7b 20 0a 20 20 20 20 43 52 45 41 54 45 20 54   { .    CREATE T
1350: 52 49 47 47 45 52 20 74 32 5f 74 72 69 67 20 42  RIGGER t2_trig B
1360: 45 46 4f 52 45 20 49 4e 53 45 52 54 20 4f 4e 20  EFORE INSERT ON 
1370: 74 32 20 42 45 47 49 4e 0a 20 20 20 20 20 20 53  t2 BEGIN.      S
1380: 45 4c 45 43 54 20 43 41 53 45 20 57 48 45 4e 20  ELECT CASE WHEN 
1390: 6e 65 77 2e 61 3d 3d 32 20 54 48 45 4e 20 52 41  new.a==2 THEN RA
13a0: 49 53 45 28 49 47 4e 4f 52 45 29 20 45 4c 53 45  ISE(IGNORE) ELSE
13b0: 20 4e 55 4c 4c 20 45 4e 44 3b 0a 20 20 20 20 20   NULL END;.     
13c0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
13d0: 56 41 4c 55 45 53 28 6e 65 77 2e 61 20 2d 20 31  VALUES(new.a - 1
13e0: 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 7d 20  );.    END;.  } 
13f0: 7b 30 20 7b 33 20 34 20 35 20 36 20 37 20 38 20  {0 {3 4 5 6 7 8 
1400: 39 20 31 30 7d 7d 0a 0a 20 20 35 20 7b 20 0a 20  9 10}}..  5 { . 
1410: 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45     CREATE TRIGGE
1420: 52 20 74 32 5f 74 72 69 67 20 42 45 46 4f 52 45  R t2_trig BEFORE
1430: 20 49 4e 53 45 52 54 20 4f 4e 20 74 32 20 42 45   INSERT ON t2 BE
1440: 47 49 4e 0a 20 20 20 20 20 20 49 4e 53 45 52 54  GIN.      INSERT
1450: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
1460: 6e 65 77 2e 61 20 2d 20 31 29 3b 0a 20 20 20 20  new.a - 1);.    
1470: 45 4e 44 3b 0a 20 20 7d 20 7b 31 20 7b 74 6f 6f  END;.  } {1 {too
1480: 20 6d 61 6e 79 20 6c 65 76 65 6c 73 20 6f 66 20   many levels of 
1490: 74 72 69 67 67 65 72 20 72 65 63 75 72 73 69 6f  trigger recursio
14a0: 6e 7d 7d 0a 0a 20 20 36 20 7b 20 0a 20 20 20 20  n}}..  6 { .    
14b0: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74  CREATE TRIGGER t
14c0: 32 5f 74 72 69 67 20 41 46 54 45 52 20 49 4e 53  2_trig AFTER INS
14d0: 45 52 54 20 4f 4e 20 74 32 20 57 48 45 4e 20 28  ERT ON t2 WHEN (
14e0: 6e 65 77 2e 61 3e 30 29 20 42 45 47 49 4e 0a 20  new.a>0) BEGIN. 
14f0: 20 20 20 20 20 49 4e 53 45 52 54 20 4f 52 20 49       INSERT OR I
1500: 47 4e 4f 52 45 20 49 4e 54 4f 20 74 32 20 56 41  GNORE INTO t2 VA
1510: 4c 55 45 53 28 6e 65 77 2e 61 29 3b 0a 20 20 20  LUES(new.a);.   
1520: 20 45 4e 44 3b 0a 20 20 7d 20 7b 30 20 31 30 7d   END;.  } {0 10}
1530: 0a 0a 20 20 37 20 7b 20 0a 20 20 20 20 43 52 45  ..  7 { .    CRE
1540: 41 54 45 20 54 52 49 47 47 45 52 20 74 32 5f 74  ATE TRIGGER t2_t
1550: 72 69 67 20 42 45 46 4f 52 45 20 49 4e 53 45 52  rig BEFORE INSER
1560: 54 20 4f 4e 20 74 32 20 57 48 45 4e 20 28 6e 65  T ON t2 WHEN (ne
1570: 77 2e 61 3e 30 29 20 42 45 47 49 4e 0a 20 20 20  w.a>0) BEGIN.   
1580: 20 20 20 49 4e 53 45 52 54 20 4f 52 20 49 47 4e     INSERT OR IGN
1590: 4f 52 45 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ORE INTO t2 VALU
15a0: 45 53 28 6e 65 77 2e 61 29 3b 0a 20 20 20 20 45  ES(new.a);.    E
15b0: 4e 44 3b 0a 20 20 7d 20 7b 31 20 7b 74 6f 6f 20  ND;.  } {1 {too 
15c0: 6d 61 6e 79 20 6c 65 76 65 6c 73 20 6f 66 20 74  many levels of t
15d0: 72 69 67 67 65 72 20 72 65 63 75 72 73 69 6f 6e  rigger recursion
15e0: 7d 7d 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74  }}.} {.  do_test
15f0: 20 74 72 69 67 67 65 72 43 2d 32 2e 31 2e 24 6e   triggerC-2.1.$n
1600: 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20   {.    catchsql 
1610: 7b 20 44 52 4f 50 20 54 52 49 47 47 45 52 20 74  { DROP TRIGGER t
1620: 32 5f 74 72 69 67 20 7d 0a 20 20 20 20 65 78 65  2_trig }.    exe
1630: 63 73 71 6c 20 20 7b 20 44 45 4c 45 54 45 20 46  csql  { DELETE F
1640: 52 4f 4d 20 74 32 20 7d 0a 20 20 20 20 65 78 65  ROM t2 }.    exe
1650: 63 73 71 6c 20 20 24 74 64 65 66 6e 0a 20 20 20  csql  $tdefn.   
1660: 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20   catchsql {.    
1670: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
1680: 20 56 41 4c 55 45 53 28 31 30 29 3b 0a 20 20 20   VALUES(10);.   
1690: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
16a0: 20 74 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 24   t2;.    }.  } $
16b0: 72 63 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 74 72  rc.}..do_test tr
16c0: 69 67 67 65 72 43 2d 32 2e 32 20 7b 0a 20 20 65  iggerC-2.2 {.  e
16d0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
16e0: 41 54 45 20 54 41 42 4c 45 20 74 32 32 28 78 29  ATE TABLE t22(x)
16f0: 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54 52  ;..    CREATE TR
1700: 49 47 47 45 52 20 74 32 32 61 20 41 46 54 45 52  IGGER t22a AFTER
1710: 20 49 4e 53 45 52 54 20 4f 4e 20 74 32 32 20 42   INSERT ON t22 B
1720: 45 47 49 4e 0a 20 20 20 20 20 20 49 4e 53 45 52  EGIN.      INSER
1730: 54 20 49 4e 54 4f 20 74 32 32 20 53 45 4c 45 43  T INTO t22 SELEC
1740: 54 20 78 20 2b 20 28 53 45 4c 45 43 54 20 6d 61  T x + (SELECT ma
1750: 78 28 78 29 20 46 52 4f 4d 20 74 32 32 29 20 46  x(x) FROM t22) F
1760: 52 4f 4d 20 74 32 32 3b 0a 20 20 20 20 45 4e 44  ROM t22;.    END
1770: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49  ;.    CREATE TRI
1780: 47 47 45 52 20 74 32 32 62 20 42 45 46 4f 52 45  GGER t22b BEFORE
1790: 20 49 4e 53 45 52 54 20 4f 4e 20 74 32 32 20 42   INSERT ON t22 B
17a0: 45 47 49 4e 0a 20 20 20 20 20 20 53 45 4c 45 43  EGIN.      SELEC
17b0: 54 20 43 41 53 45 20 57 48 45 4e 20 28 53 45 4c  T CASE WHEN (SEL
17c0: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
17d0: 4d 20 74 32 32 29 20 3e 3d 20 31 30 30 0a 20 20  M t22) >= 100.  
17e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f0: 54 48 45 4e 20 52 41 49 53 45 28 49 47 4e 4f 52  THEN RAISE(IGNOR
1800: 45 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  E).             
1810: 20 20 20 20 20 45 4c 53 45 20 4e 55 4c 4c 20 45       ELSE NULL E
1820: 4e 44 3b 0a 20 20 20 20 45 4e 44 3b 0a 0a 20 20  ND;.    END;..  
1830: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
1840: 32 20 56 41 4c 55 45 53 28 31 29 3b 0a 20 20 20  2 VALUES(1);.   
1850: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
1860: 20 46 52 4f 4d 20 74 32 32 3b 0a 20 20 7d 0a 7d   FROM t22;.  }.}
1870: 20 7b 31 30 30 7d 0a 0a 64 6f 5f 74 65 73 74 20   {100}..do_test 
1880: 74 72 69 67 67 65 72 43 2d 32 2e 33 20 7b 0a 20  triggerC-2.3 {. 
1890: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
18a0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 33 28  REATE TABLE t23(
18b0: 78 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a  x PRIMARY KEY);.
18c0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47  .    CREATE TRIG
18d0: 47 45 52 20 74 32 33 61 20 41 46 54 45 52 20 49  GER t23a AFTER I
18e0: 4e 53 45 52 54 20 4f 4e 20 74 32 33 20 42 45 47  NSERT ON t23 BEG
18f0: 49 4e 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  IN.      INSERT 
1900: 49 4e 54 4f 20 74 32 33 20 56 41 4c 55 45 53 28  INTO t23 VALUES(
1910: 6e 65 77 2e 78 20 2b 20 31 29 3b 0a 20 20 20 20  new.x + 1);.    
1920: 45 4e 44 3b 0a 0a 20 20 20 20 43 52 45 41 54 45  END;..    CREATE
1930: 20 54 52 49 47 47 45 52 20 74 32 33 62 20 42 45   TRIGGER t23b BE
1940: 46 4f 52 45 20 49 4e 53 45 52 54 20 4f 4e 20 74  FORE INSERT ON t
1950: 32 33 20 42 45 47 49 4e 0a 20 20 20 20 20 20 53  23 BEGIN.      S
1960: 45 4c 45 43 54 20 43 41 53 45 20 57 48 45 4e 20  ELECT CASE WHEN 
1970: 6e 65 77 2e 78 3e 35 30 30 0a 20 20 20 20 20 20  new.x>500.      
1980: 20 20 20 20 20 20 20 20 20 20 20 20 54 48 45 4e              THEN
1990: 20 52 41 49 53 45 28 49 47 4e 4f 52 45 29 0a 20   RAISE(IGNORE). 
19a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b0: 20 45 4c 53 45 20 4e 55 4c 4c 20 45 4e 44 3b 0a   ELSE NULL END;.
19c0: 20 20 20 20 45 4e 44 3b 0a 0a 20 20 20 20 49 4e      END;..    IN
19d0: 53 45 52 54 20 49 4e 54 4f 20 74 32 33 20 56 41  SERT INTO t23 VA
19e0: 4c 55 45 53 28 31 29 3b 0a 20 20 20 20 53 45 4c  LUES(1);.    SEL
19f0: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
1a00: 4d 20 74 32 33 3b 0a 20 20 7d 0a 7d 20 7b 35 30  M t23;.  }.} {50
1a10: 30 7d 0a 20 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  0}. ..#---------
1a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
1a60: 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 74   This block of t
1a70: 65 73 74 73 2c 20 74 72 69 67 67 65 72 43 2d 33  ests, triggerC-3
1a80: 2e 2a 2c 20 74 65 73 74 20 74 68 61 74 20 53 51  .*, test that SQ
1a90: 4c 69 74 65 20 74 68 72 6f 77 73 20 61 6e 20 65  Lite throws an e
1aa0: 78 63 65 70 74 69 6f 6e 0a 23 20 77 68 65 6e 20  xception.# when 
1ab0: 69 74 20 64 65 74 65 63 74 73 20 65 78 63 65 73  it detects exces
1ac0: 73 69 76 65 20 72 65 63 75 72 73 69 6f 6e 2e 0a  sive recursion..
1ad0: 23 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65  #.do_test trigge
1ae0: 72 43 2d 33 2e 31 2e 31 20 7b 0a 20 20 65 78 65  rC-3.1.1 {.  exe
1af0: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
1b00: 45 20 54 41 42 4c 45 20 74 33 28 61 2c 20 62 29  E TABLE t3(a, b)
1b10: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49  ;.    CREATE TRI
1b20: 47 47 45 52 20 74 33 69 20 41 46 54 45 52 20 49  GGER t3i AFTER I
1b30: 4e 53 45 52 54 20 4f 4e 20 74 33 20 42 45 47 49  NSERT ON t3 BEGI
1b40: 4e 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46  N.      DELETE F
1b50: 52 4f 4d 20 74 33 20 57 48 45 52 45 20 72 6f 77  ROM t3 WHERE row
1b60: 69 64 20 3d 20 6e 65 77 2e 72 6f 77 69 64 3b 0a  id = new.rowid;.
1b70: 20 20 20 20 45 4e 44 3b 0a 20 20 20 20 43 52 45      END;.    CRE
1b80: 41 54 45 20 54 52 49 47 47 45 52 20 74 33 64 20  ATE TRIGGER t3d 
1b90: 41 46 54 45 52 20 44 45 4c 45 54 45 20 4f 4e 20  AFTER DELETE ON 
1ba0: 74 33 20 42 45 47 49 4e 0a 20 20 20 20 20 20 49  t3 BEGIN.      I
1bb0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41  NSERT INTO t3 VA
1bc0: 4c 55 45 53 28 6f 6c 64 2e 61 2c 20 6f 6c 64 2e  LUES(old.a, old.
1bd0: 62 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 7d  b);.    END;.  }
1be0: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 74 72  .} {}.do_test tr
1bf0: 69 67 67 65 72 43 2d 33 2e 31 2e 32 20 7b 0a 20  iggerC-3.1.2 {. 
1c00: 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45   catchsql { INSE
1c10: 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45  RT INTO t3 VALUE
1c20: 53 28 30 2c 30 29 20 7d 0a 7d 20 7b 31 20 7b 74  S(0,0) }.} {1 {t
1c30: 6f 6f 20 6d 61 6e 79 20 6c 65 76 65 6c 73 20 6f  oo many levels o
1c40: 66 20 74 72 69 67 67 65 72 20 72 65 63 75 72 73  f trigger recurs
1c50: 69 6f 6e 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 72  ion}}.do_test tr
1c60: 69 67 67 65 72 43 2d 33 2e 31 2e 33 20 7b 0a 20  iggerC-3.1.3 {. 
1c70: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
1c80: 54 20 2a 20 46 52 4f 4d 20 74 33 20 7d 0a 7d 20  T * FROM t3 }.} 
1c90: 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  {}..#-----------
1ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
1ce0: 68 69 73 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f  his next block o
1cf0: 66 20 74 65 73 74 73 2c 20 74 72 69 67 67 65 72  f tests, trigger
1d00: 43 2d 34 2e 2a 2c 20 63 68 65 63 6b 73 20 74 68  C-4.*, checks th
1d10: 61 74 20 61 66 66 69 6e 69 74 79 20 0a 23 20 74  at affinity .# t
1d20: 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 73 20 61  ransformations a
1d30: 6e 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 70 72  nd constraint pr
1d40: 6f 63 65 73 73 69 6e 67 20 69 73 20 70 65 72 66  ocessing is perf
1d50: 6f 72 6d 65 64 20 61 74 20 74 68 65 20 63 6f 72  ormed at the cor
1d60: 72 65 63 74 20 0a 23 20 74 69 6d 65 73 20 72 65  rect .# times re
1d70: 6c 61 74 69 76 65 20 74 6f 20 42 45 46 4f 52 45  lative to BEFORE
1d80: 20 61 6e 64 20 41 46 54 45 52 20 74 72 69 67 67   and AFTER trigg
1d90: 65 72 73 2e 0a 23 0a 23 20 46 6f 72 20 61 6e 20  ers..#.# For an 
1da0: 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74  INSERT statement
1db0: 2c 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 74  , for each row t
1dc0: 6f 20 62 65 20 69 6e 73 65 72 74 65 64 3a 0a 23  o be inserted:.#
1dd0: 0a 23 20 20 20 31 2e 20 41 70 70 6c 79 20 61 66  .#   1. Apply af
1de0: 66 69 6e 69 74 69 65 73 20 74 6f 20 6e 6f 6e 2d  finities to non-
1df0: 72 6f 77 69 64 20 76 61 6c 75 65 73 20 74 6f 20  rowid values to 
1e00: 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 23 20 20  be inserted..#  
1e10: 20 32 2e 20 46 69 72 65 20 42 45 46 4f 52 45 20   2. Fire BEFORE 
1e20: 74 72 69 67 67 65 72 73 2e 0a 23 20 20 20 33 2e  triggers..#   3.
1e30: 20 50 72 6f 63 65 73 73 20 63 6f 6e 73 74 72 61   Process constra
1e40: 69 6e 74 73 2e 0a 23 20 20 20 34 2e 20 49 6e 73  ints..#   4. Ins
1e50: 65 72 74 20 6e 65 77 20 72 65 63 6f 72 64 2e 0a  ert new record..
1e60: 23 20 20 20 35 2e 20 46 69 72 65 20 41 46 54 45  #   5. Fire AFTE
1e70: 52 20 74 72 69 67 67 65 72 73 2e 0a 23 0a 23 20  R triggers..#.# 
1e80: 49 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  If the value of 
1e90: 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c 64 20  the rowid field 
1ea0: 69 73 20 74 6f 20 62 65 20 61 75 74 6f 6d 61 74  is to be automat
1eb0: 69 63 61 6c 6c 79 20 61 73 73 69 67 6e 65 64 2c  ically assigned,
1ec0: 20 69 74 20 69 73 0a 23 20 73 65 74 20 74 6f 20   it is.# set to 
1ed0: 2d 31 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20  -1 in the new.* 
1ee0: 72 65 63 6f 72 64 2e 20 45 76 65 6e 20 69 66 20  record. Even if 
1ef0: 69 74 20 69 73 20 65 78 70 6c 69 63 69 74 6c 79  it is explicitly
1f00: 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 23 20 62   set to NULL.# b
1f10: 79 20 74 68 65 20 49 4e 53 45 52 54 20 73 74 61  y the INSERT sta
1f20: 74 65 6d 65 6e 74 2e 0a 23 0a 23 20 46 6f 72 20  tement..#.# For 
1f30: 61 6e 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  an UPDATE statem
1f40: 65 6e 74 2c 20 66 6f 72 20 65 61 63 68 20 72 6f  ent, for each ro
1f50: 77 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 3a  w to be deleted:
1f60: 0a 23 0a 23 20 20 20 31 2e 20 41 70 70 6c 79 20  .#.#   1. Apply 
1f70: 61 66 66 69 6e 69 74 69 65 73 20 74 6f 20 6e 6f  affinities to no
1f80: 6e 2d 72 6f 77 69 64 20 76 61 6c 75 65 73 20 74  n-rowid values t
1f90: 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 23  o be inserted..#
1fa0: 20 20 20 32 2e 20 46 69 72 65 20 42 45 46 4f 52     2. Fire BEFOR
1fb0: 45 20 74 72 69 67 67 65 72 73 2e 0a 23 20 20 20  E triggers..#   
1fc0: 33 2e 20 50 72 6f 63 65 73 73 20 63 6f 6e 73 74  3. Process const
1fd0: 72 61 69 6e 74 73 2e 0a 23 20 20 20 34 2e 20 49  raints..#   4. I
1fe0: 6e 73 65 72 74 20 6e 65 77 20 72 65 63 6f 72 64  nsert new record
1ff0: 2e 0a 23 20 20 20 35 2e 20 46 69 72 65 20 41 46  ..#   5. Fire AF
2000: 54 45 52 20 74 72 69 67 67 65 72 73 2e 0a 23 0a  TER triggers..#.
2010: 23 20 46 6f 72 20 61 20 44 45 4c 45 54 45 20 73  # For a DELETE s
2020: 74 61 74 65 6d 65 6e 74 2c 20 66 6f 72 20 65 61  tatement, for ea
2030: 63 68 20 72 6f 77 20 74 6f 20 62 65 20 64 65 6c  ch row to be del
2040: 65 74 65 64 3a 0a 23 0a 23 20 20 20 31 2e 20 46  eted:.#.#   1. F
2050: 69 72 65 20 42 45 46 4f 52 45 20 74 72 69 67 67  ire BEFORE trigg
2060: 65 72 73 2e 0a 23 20 20 20 32 2e 20 52 65 6d 6f  ers..#   2. Remo
2070: 76 65 20 64 61 74 61 62 61 73 65 20 72 65 63 6f  ve database reco
2080: 72 64 2e 0a 23 20 20 20 33 2e 20 46 69 72 65 20  rd..#   3. Fire 
2090: 41 46 54 45 52 20 74 72 69 67 67 65 72 73 2e 0a  AFTER triggers..
20a0: 23 0a 23 20 57 68 65 6e 20 61 20 6e 75 6d 65 72  #.# When a numer
20b0: 69 63 20 76 61 6c 75 65 20 74 68 61 74 20 61 73  ic value that as
20c0: 20 61 6e 20 65 78 61 63 74 20 69 6e 74 65 67 65   an exact intege
20d0: 72 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  r representation
20e0: 20 69 73 20 73 74 6f 72 65 64 0a 23 20 69 6e 20   is stored.# in 
20f0: 61 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 52 45  a column with RE
2100: 41 4c 20 61 66 66 69 6e 69 74 79 2c 20 69 74 20  AL affinity, it 
2110: 69 73 20 61 63 74 75 61 6c 6c 79 20 73 74 6f 72  is actually stor
2120: 65 64 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72  ed as an integer
2130: 2e 0a 23 20 54 68 65 73 65 20 74 65 73 74 73 20  ..# These tests 
2140: 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 74  check that the t
2150: 79 70 65 6f 66 28 29 20 73 75 63 68 20 76 61 6c  ypeof() such val
2160: 75 65 73 20 69 73 20 61 6c 77 61 79 73 20 27 72  ues is always 'r
2170: 65 61 6c 27 2c 0a 23 20 6e 6f 74 20 27 69 6e 74  eal',.# not 'int
2180: 65 67 65 72 27 2e 0a 23 0a 23 20 74 72 69 67 67  eger'..#.# trigg
2190: 65 72 43 2d 34 2e 31 2e 2a 3a 20 43 68 65 63 6b  erC-4.1.*: Check
21a0: 20 74 68 61 74 20 61 66 66 69 6e 69 74 79 20 74   that affinity t
21b0: 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 73 20 61  ransformations a
21c0: 72 65 20 6d 61 64 65 20 62 65 66 6f 72 65 0a 23  re made before.#
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e0: 20 74 72 69 67 67 65 72 73 20 61 72 65 20 69 6e   triggers are in
21f0: 76 6f 6b 65 64 2e 0a 23 0a 64 6f 5f 74 65 73 74  voked..#.do_test
2200: 20 74 72 69 67 67 65 72 43 2d 34 2e 31 2e 31 20   triggerC-4.1.1 
2210: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 44  {.  catchsql { D
2220: 52 4f 50 20 54 41 42 4c 45 20 6c 6f 67 20 7d 0a  ROP TABLE log }.
2230: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 44 52 4f    catchsql { DRO
2240: 50 20 54 41 42 4c 45 20 74 34 20 7d 0a 20 20 65  P TABLE t4 }.  e
2250: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
2260: 41 54 45 20 54 41 42 4c 45 20 6c 6f 67 28 74 29  ATE TABLE log(t)
2270: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
2280: 4c 45 20 74 34 28 61 20 54 45 58 54 2c 62 20 49  LE t4(a TEXT,b I
2290: 4e 54 45 47 45 52 2c 63 20 52 45 41 4c 29 3b 0a  NTEGER,c REAL);.
22a0: 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47      CREATE TRIGG
22b0: 45 52 20 74 34 62 69 20 42 45 46 4f 52 45 20 49  ER t4bi BEFORE I
22c0: 4e 53 45 52 54 20 4f 4e 20 74 34 20 42 45 47 49  NSERT ON t4 BEGI
22d0: 4e 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  N.      INSERT I
22e0: 4e 54 4f 20 6c 6f 67 20 56 41 4c 55 45 53 28 6e  NTO log VALUES(n
22f0: 65 77 2e 72 6f 77 69 64 20 7c 7c 20 27 20 27 20  ew.rowid || ' ' 
2300: 7c 7c 20 74 79 70 65 6f 66 28 6e 65 77 2e 72 6f  || typeof(new.ro
2310: 77 69 64 29 20 7c 7c 20 27 20 27 20 7c 7c 0a 20  wid) || ' ' ||. 
2320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2330: 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 77 2e              new.
2340: 61 20 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c 20  a     || ' ' || 
2350: 74 79 70 65 6f 66 28 6e 65 77 2e 61 29 20 20 20  typeof(new.a)   
2360: 20 20 7c 7c 20 27 20 27 20 7c 7c 0a 20 20 20 20    || ' ' ||.    
2370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2380: 20 20 20 20 20 20 20 20 20 6e 65 77 2e 62 20 20           new.b  
2390: 20 20 20 7c 7c 20 27 20 27 20 7c 7c 20 74 79 70     || ' ' || typ
23a0: 65 6f 66 28 6e 65 77 2e 62 29 20 20 20 20 20 7c  eof(new.b)     |
23b0: 7c 20 27 20 27 20 7c 7c 0a 20 20 20 20 20 20 20  | ' ' ||.       
23c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d0: 20 20 20 20 20 20 6e 65 77 2e 63 20 20 20 20 20        new.c     
23e0: 7c 7c 20 27 20 27 20 7c 7c 20 74 79 70 65 6f 66  || ' ' || typeof
23f0: 28 6e 65 77 2e 63 29 0a 20 20 20 20 20 20 29 3b  (new.c).      );
2400: 0a 20 20 20 20 45 4e 44 3b 0a 20 20 20 20 43 52  .    END;.    CR
2410: 45 41 54 45 20 54 52 49 47 47 45 52 20 74 34 61  EATE TRIGGER t4a
2420: 69 20 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f  i AFTER INSERT O
2430: 4e 20 74 34 20 42 45 47 49 4e 0a 20 20 20 20 20  N t4 BEGIN.     
2440: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c 6f 67   INSERT INTO log
2450: 20 56 41 4c 55 45 53 28 6e 65 77 2e 72 6f 77 69   VALUES(new.rowi
2460: 64 20 7c 7c 20 27 20 27 20 7c 7c 20 74 79 70 65  d || ' ' || type
2470: 6f 66 28 6e 65 77 2e 72 6f 77 69 64 29 20 7c 7c  of(new.rowid) ||
2480: 20 27 20 27 20 7c 7c 0a 20 20 20 20 20 20 20 20   ' ' ||.        
2490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a0: 20 20 20 20 20 6e 65 77 2e 61 20 20 20 20 20 7c       new.a     |
24b0: 7c 20 27 20 27 20 7c 7c 20 74 79 70 65 6f 66 28  | ' ' || typeof(
24c0: 6e 65 77 2e 61 29 20 20 20 20 20 7c 7c 20 27 20  new.a)     || ' 
24d0: 27 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  ' ||.           
24e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f0: 20 20 6e 65 77 2e 62 20 20 20 20 20 7c 7c 20 27    new.b     || '
2500: 20 27 20 7c 7c 20 74 79 70 65 6f 66 28 6e 65 77   ' || typeof(new
2510: 2e 62 29 20 20 20 20 20 7c 7c 20 27 20 27 20 7c  .b)     || ' ' |
2520: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
2530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
2540: 65 77 2e 63 20 20 20 20 20 7c 7c 20 27 20 27 20  ew.c     || ' ' 
2550: 7c 7c 20 74 79 70 65 6f 66 28 6e 65 77 2e 63 29  || typeof(new.c)
2560: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 45 4e  .      );.    EN
2570: 44 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 52  D;.    CREATE TR
2580: 49 47 47 45 52 20 74 34 62 64 20 42 45 46 4f 52  IGGER t4bd BEFOR
2590: 45 20 44 45 4c 45 54 45 20 4f 4e 20 74 34 20 42  E DELETE ON t4 B
25a0: 45 47 49 4e 0a 20 20 20 20 20 20 49 4e 53 45 52  EGIN.      INSER
25b0: 54 20 49 4e 54 4f 20 6c 6f 67 20 56 41 4c 55 45  T INTO log VALUE
25c0: 53 28 6f 6c 64 2e 72 6f 77 69 64 20 7c 7c 20 27  S(old.rowid || '
25d0: 20 27 20 7c 7c 20 74 79 70 65 6f 66 28 6f 6c 64   ' || typeof(old
25e0: 2e 72 6f 77 69 64 29 20 7c 7c 20 27 20 27 20 7c  .rowid) || ' ' |
25f0: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
2600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
2610: 6c 64 2e 61 20 20 20 20 20 7c 7c 20 27 20 27 20  ld.a     || ' ' 
2620: 7c 7c 20 74 79 70 65 6f 66 28 6f 6c 64 2e 61 29  || typeof(old.a)
2630: 20 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c 0a 20       || ' ' ||. 
2640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2650: 20 20 20 20 20 20 20 20 20 20 20 20 6f 6c 64 2e              old.
2660: 62 20 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c 20  b     || ' ' || 
2670: 74 79 70 65 6f 66 28 6f 6c 64 2e 62 29 20 20 20  typeof(old.b)   
2680: 20 20 7c 7c 20 27 20 27 20 7c 7c 0a 20 20 20 20    || ' ' ||.    
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a0: 20 20 20 20 20 20 20 20 20 6f 6c 64 2e 63 20 20           old.c  
26b0: 20 20 20 7c 7c 20 27 20 27 20 7c 7c 20 74 79 70     || ' ' || typ
26c0: 65 6f 66 28 6f 6c 64 2e 63 29 0a 20 20 20 20 20  eof(old.c).     
26d0: 20 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 20   );.    END;.   
26e0: 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20   CREATE TRIGGER 
26f0: 74 34 61 64 20 41 46 54 45 52 20 44 45 4c 45 54  t4ad AFTER DELET
2700: 45 20 4f 4e 20 74 34 20 42 45 47 49 4e 0a 20 20  E ON t4 BEGIN.  
2710: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2720: 6c 6f 67 20 56 41 4c 55 45 53 28 6f 6c 64 2e 72  log VALUES(old.r
2730: 6f 77 69 64 20 7c 7c 20 27 20 27 20 7c 7c 20 74  owid || ' ' || t
2740: 79 70 65 6f 66 28 6f 6c 64 2e 72 6f 77 69 64 29  ypeof(old.rowid)
2750: 20 7c 7c 20 27 20 27 20 7c 7c 0a 20 20 20 20 20   || ' ' ||.     
2760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2770: 20 20 20 20 20 20 20 20 6f 6c 64 2e 61 20 20 20          old.a   
2780: 20 20 7c 7c 20 27 20 27 20 7c 7c 20 74 79 70 65    || ' ' || type
2790: 6f 66 28 6f 6c 64 2e 61 29 20 20 20 20 20 7c 7c  of(old.a)     ||
27a0: 20 27 20 27 20 7c 7c 0a 20 20 20 20 20 20 20 20   ' ' ||.        
27b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c0: 20 20 20 20 20 6f 6c 64 2e 62 20 20 20 20 20 7c       old.b     |
27d0: 7c 20 27 20 27 20 7c 7c 20 74 79 70 65 6f 66 28  | ' ' || typeof(
27e0: 6f 6c 64 2e 62 29 20 20 20 20 20 7c 7c 20 27 20  old.b)     || ' 
27f0: 27 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  ' ||.           
2800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2810: 20 20 6f 6c 64 2e 63 20 20 20 20 20 7c 7c 20 27    old.c     || '
2820: 20 27 20 7c 7c 20 74 79 70 65 6f 66 28 6f 6c 64   ' || typeof(old
2830: 2e 63 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  .c).      );.   
2840: 20 45 4e 44 3b 0a 20 20 20 20 43 52 45 41 54 45   END;.    CREATE
2850: 20 54 52 49 47 47 45 52 20 74 34 62 75 20 42 45   TRIGGER t4bu BE
2860: 46 4f 52 45 20 55 50 44 41 54 45 20 4f 4e 20 74  FORE UPDATE ON t
2870: 34 20 42 45 47 49 4e 0a 20 20 20 20 20 20 49 4e  4 BEGIN.      IN
2880: 53 45 52 54 20 49 4e 54 4f 20 6c 6f 67 20 56 41  SERT INTO log VA
2890: 4c 55 45 53 28 6f 6c 64 2e 72 6f 77 69 64 20 7c  LUES(old.rowid |
28a0: 7c 20 27 20 27 20 7c 7c 20 74 79 70 65 6f 66 28  | ' ' || typeof(
28b0: 6f 6c 64 2e 72 6f 77 69 64 29 20 7c 7c 20 27 20  old.rowid) || ' 
28c0: 27 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  ' ||.           
28d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e0: 20 20 6f 6c 64 2e 61 20 20 20 20 20 7c 7c 20 27    old.a     || '
28f0: 20 27 20 7c 7c 20 74 79 70 65 6f 66 28 6f 6c 64   ' || typeof(old
2900: 2e 61 29 20 20 20 20 20 7c 7c 20 27 20 27 20 7c  .a)     || ' ' |
2910: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
2920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
2930: 6c 64 2e 62 20 20 20 20 20 7c 7c 20 27 20 27 20  ld.b     || ' ' 
2940: 7c 7c 20 74 79 70 65 6f 66 28 6f 6c 64 2e 62 29  || typeof(old.b)
2950: 20 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c 0a 20       || ' ' ||. 
2960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2970: 20 20 20 20 20 20 20 20 20 20 20 20 6f 6c 64 2e              old.
2980: 63 20 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c 20  c     || ' ' || 
2990: 74 79 70 65 6f 66 28 6f 6c 64 2e 63 29 0a 20 20  typeof(old.c).  
29a0: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 49 4e 53      );.      INS
29b0: 45 52 54 20 49 4e 54 4f 20 6c 6f 67 20 56 41 4c  ERT INTO log VAL
29c0: 55 45 53 28 6e 65 77 2e 72 6f 77 69 64 20 7c 7c  UES(new.rowid ||
29d0: 20 27 20 27 20 7c 7c 20 74 79 70 65 6f 66 28 6e   ' ' || typeof(n
29e0: 65 77 2e 72 6f 77 69 64 29 20 7c 7c 20 27 20 27  ew.rowid) || ' '
29f0: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ||.            
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a10: 20 6e 65 77 2e 61 20 20 20 20 20 7c 7c 20 27 20   new.a     || ' 
2a20: 27 20 7c 7c 20 74 79 70 65 6f 66 28 6e 65 77 2e  ' || typeof(new.
2a30: 61 29 20 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c  a)     || ' ' ||
2a40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65                ne
2a60: 77 2e 62 20 20 20 20 20 7c 7c 20 27 20 27 20 7c  w.b     || ' ' |
2a70: 7c 20 74 79 70 65 6f 66 28 6e 65 77 2e 62 29 20  | typeof(new.b) 
2a80: 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c 0a 20 20      || ' ' ||.  
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa0: 20 20 20 20 20 20 20 20 20 20 20 6e 65 77 2e 63             new.c
2ab0: 20 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c 20 74       || ' ' || t
2ac0: 79 70 65 6f 66 28 6e 65 77 2e 63 29 0a 20 20 20  ypeof(new.c).   
2ad0: 20 20 20 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20     );.    END;. 
2ae0: 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45     CREATE TRIGGE
2af0: 52 20 74 34 61 75 20 41 46 54 45 52 20 55 50 44  R t4au AFTER UPD
2b00: 41 54 45 20 4f 4e 20 74 34 20 42 45 47 49 4e 0a  ATE ON t4 BEGIN.
2b10: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
2b20: 4f 20 6c 6f 67 20 56 41 4c 55 45 53 28 6f 6c 64  O log VALUES(old
2b30: 2e 72 6f 77 69 64 20 7c 7c 20 27 20 27 20 7c 7c  .rowid || ' ' ||
2b40: 20 74 79 70 65 6f 66 28 6f 6c 64 2e 72 6f 77 69   typeof(old.rowi
2b50: 64 29 20 7c 7c 20 27 20 27 20 7c 7c 0a 20 20 20  d) || ' ' ||.   
2b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b70: 20 20 20 20 20 20 20 20 20 20 6f 6c 64 2e 61 20            old.a 
2b80: 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c 20 74 79      || ' ' || ty
2b90: 70 65 6f 66 28 6f 6c 64 2e 61 29 20 20 20 20 20  peof(old.a)     
2ba0: 7c 7c 20 27 20 27 20 7c 7c 0a 20 20 20 20 20 20  || ' ' ||.      
2bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc0: 20 20 20 20 20 20 20 6f 6c 64 2e 62 20 20 20 20         old.b    
2bd0: 20 7c 7c 20 27 20 27 20 7c 7c 20 74 79 70 65 6f   || ' ' || typeo
2be0: 66 28 6f 6c 64 2e 62 29 20 20 20 20 20 7c 7c 20  f(old.b)     || 
2bf0: 27 20 27 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ' ' ||.         
2c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c10: 20 20 20 20 6f 6c 64 2e 63 20 20 20 20 20 7c 7c      old.c     ||
2c20: 20 27 20 27 20 7c 7c 20 74 79 70 65 6f 66 28 6f   ' ' || typeof(o
2c30: 6c 64 2e 63 29 0a 20 20 20 20 20 20 29 3b 0a 20  ld.c).      );. 
2c40: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
2c50: 20 6c 6f 67 20 56 41 4c 55 45 53 28 6e 65 77 2e   log VALUES(new.
2c60: 72 6f 77 69 64 20 7c 7c 20 27 20 27 20 7c 7c 20  rowid || ' ' || 
2c70: 74 79 70 65 6f 66 28 6e 65 77 2e 72 6f 77 69 64  typeof(new.rowid
2c80: 29 20 7c 7c 20 27 20 27 20 7c 7c 0a 20 20 20 20  ) || ' ' ||.    
2c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca0: 20 20 20 20 20 20 20 20 20 6e 65 77 2e 61 20 20           new.a  
2cb0: 20 20 20 7c 7c 20 27 20 27 20 7c 7c 20 74 79 70     || ' ' || typ
2cc0: 65 6f 66 28 6e 65 77 2e 61 29 20 20 20 20 20 7c  eof(new.a)     |
2cd0: 7c 20 27 20 27 20 7c 7c 0a 20 20 20 20 20 20 20  | ' ' ||.       
2ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf0: 20 20 20 20 20 20 6e 65 77 2e 62 20 20 20 20 20        new.b     
2d00: 7c 7c 20 27 20 27 20 7c 7c 20 74 79 70 65 6f 66  || ' ' || typeof
2d10: 28 6e 65 77 2e 62 29 20 20 20 20 20 7c 7c 20 27  (new.b)     || '
2d20: 20 27 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20   ' ||.          
2d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d40: 20 20 20 6e 65 77 2e 63 20 20 20 20 20 7c 7c 20     new.c     || 
2d50: 27 20 27 20 7c 7c 20 74 79 70 65 6f 66 28 6e 65  ' ' || typeof(ne
2d60: 77 2e 63 29 0a 20 20 20 20 20 20 29 3b 0a 20 20  w.c).      );.  
2d70: 20 20 45 4e 44 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a    END;.  }.} {}.
2d80: 66 6f 72 65 61 63 68 20 7b 6e 20 69 6e 73 65 72  foreach {n inser
2d90: 74 20 6c 6f 67 7d 20 7b 0a 0a 20 20 32 20 7b 20  t log} {..  2 { 
2da0: 0a 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  .   INSERT INTO 
2db0: 74 34 20 56 41 4c 55 45 53 28 27 31 27 2c 20 27  t4 VALUES('1', '
2dc0: 31 27 2c 20 27 31 27 29 3b 0a 20 20 20 44 45 4c  1', '1');.   DEL
2dd0: 45 54 45 20 46 52 4f 4d 20 74 34 3b 0a 20 20 7d  ETE FROM t4;.  }
2de0: 20 7b 0a 20 20 20 20 2d 31 20 69 6e 74 65 67 65   {.    -1 intege
2df0: 72 20 31 20 74 65 78 74 20 31 20 69 6e 74 65 67  r 1 text 1 integ
2e00: 65 72 20 31 2e 30 20 72 65 61 6c 20 0a 20 20 20  er 1.0 real .   
2e10: 20 20 31 20 69 6e 74 65 67 65 72 20 31 20 74 65    1 integer 1 te
2e20: 78 74 20 31 20 69 6e 74 65 67 65 72 20 31 2e 30  xt 1 integer 1.0
2e30: 20 72 65 61 6c 0a 20 20 20 20 20 31 20 69 6e 74   real.     1 int
2e40: 65 67 65 72 20 31 20 74 65 78 74 20 31 20 69 6e  eger 1 text 1 in
2e50: 74 65 67 65 72 20 31 2e 30 20 72 65 61 6c 20 0a  teger 1.0 real .
2e60: 20 20 20 20 20 31 20 69 6e 74 65 67 65 72 20 31       1 integer 1
2e70: 20 74 65 78 74 20 31 20 69 6e 74 65 67 65 72 20   text 1 integer 
2e80: 31 2e 30 20 72 65 61 6c 0a 20 20 7d 0a 0a 20 20  1.0 real.  }..  
2e90: 33 20 7b 20 0a 20 20 20 49 4e 53 45 52 54 20 49  3 { .   INSERT I
2ea0: 4e 54 4f 20 74 34 28 72 6f 77 69 64 2c 61 2c 62  NTO t4(rowid,a,b
2eb0: 2c 63 29 20 56 41 4c 55 45 53 28 34 35 2c 20 34  ,c) VALUES(45, 4
2ec0: 35 2c 20 34 35 2c 20 34 35 29 3b 0a 20 20 20 44  5, 45, 45);.   D
2ed0: 45 4c 45 54 45 20 46 52 4f 4d 20 74 34 3b 0a 20  ELETE FROM t4;. 
2ee0: 20 7d 20 7b 0a 20 20 20 20 34 35 20 69 6e 74 65   } {.    45 inte
2ef0: 67 65 72 20 34 35 20 74 65 78 74 20 34 35 20 69  ger 45 text 45 i
2f00: 6e 74 65 67 65 72 20 34 35 2e 30 20 72 65 61 6c  nteger 45.0 real
2f10: 0a 20 20 20 20 34 35 20 69 6e 74 65 67 65 72 20  .    45 integer 
2f20: 34 35 20 74 65 78 74 20 34 35 20 69 6e 74 65 67  45 text 45 integ
2f30: 65 72 20 34 35 2e 30 20 72 65 61 6c 0a 20 20 20  er 45.0 real.   
2f40: 20 34 35 20 69 6e 74 65 67 65 72 20 34 35 20 74   45 integer 45 t
2f50: 65 78 74 20 34 35 20 69 6e 74 65 67 65 72 20 34  ext 45 integer 4
2f60: 35 2e 30 20 72 65 61 6c 0a 20 20 20 20 34 35 20  5.0 real.    45 
2f70: 69 6e 74 65 67 65 72 20 34 35 20 74 65 78 74 20  integer 45 text 
2f80: 34 35 20 69 6e 74 65 67 65 72 20 34 35 2e 30 20  45 integer 45.0 
2f90: 72 65 61 6c 0a 20 20 7d 0a 0a 20 20 34 20 7b 20  real.  }..  4 { 
2fa0: 0a 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  .   INSERT INTO 
2fb0: 74 34 28 72 6f 77 69 64 2c 61 2c 62 2c 63 29 20  t4(rowid,a,b,c) 
2fc0: 56 41 4c 55 45 53 28 2d 34 32 2e 30 2c 20 2d 34  VALUES(-42.0, -4
2fd0: 32 2e 30 2c 20 2d 34 32 2e 30 2c 20 2d 34 32 2e  2.0, -42.0, -42.
2fe0: 30 29 3b 0a 20 20 20 44 45 4c 45 54 45 20 46 52  0);.   DELETE FR
2ff0: 4f 4d 20 74 34 3b 0a 20 20 7d 20 7b 0a 20 20 20  OM t4;.  } {.   
3000: 20 2d 34 32 20 69 6e 74 65 67 65 72 20 2d 34 32   -42 integer -42
3010: 2e 30 20 74 65 78 74 20 2d 34 32 20 69 6e 74 65  .0 text -42 inte
3020: 67 65 72 20 2d 34 32 2e 30 20 72 65 61 6c 20 0a  ger -42.0 real .
3030: 20 20 20 20 2d 34 32 20 69 6e 74 65 67 65 72 20      -42 integer 
3040: 2d 34 32 2e 30 20 74 65 78 74 20 2d 34 32 20 69  -42.0 text -42 i
3050: 6e 74 65 67 65 72 20 2d 34 32 2e 30 20 72 65 61  nteger -42.0 rea
3060: 6c 0a 20 20 20 20 2d 34 32 20 69 6e 74 65 67 65  l.    -42 intege
3070: 72 20 2d 34 32 2e 30 20 74 65 78 74 20 2d 34 32  r -42.0 text -42
3080: 20 69 6e 74 65 67 65 72 20 2d 34 32 2e 30 20 72   integer -42.0 r
3090: 65 61 6c 20 0a 20 20 20 20 2d 34 32 20 69 6e 74  eal .    -42 int
30a0: 65 67 65 72 20 2d 34 32 2e 30 20 74 65 78 74 20  eger -42.0 text 
30b0: 2d 34 32 20 69 6e 74 65 67 65 72 20 2d 34 32 2e  -42 integer -42.
30c0: 30 20 72 65 61 6c 0a 20 20 7d 0a 0a 20 20 35 20  0 real.  }..  5 
30d0: 7b 20 0a 20 20 20 49 4e 53 45 52 54 20 49 4e 54  { .   INSERT INT
30e0: 4f 20 74 34 28 72 6f 77 69 64 2c 61 2c 62 2c 63  O t4(rowid,a,b,c
30f0: 29 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 2d  ) VALUES(NULL, -
3100: 34 32 2e 34 2c 20 2d 34 32 2e 34 2c 20 2d 34 32  42.4, -42.4, -42
3110: 2e 34 29 3b 0a 20 20 20 44 45 4c 45 54 45 20 46  .4);.   DELETE F
3120: 52 4f 4d 20 74 34 3b 0a 20 20 7d 20 7b 0a 20 20  ROM t4;.  } {.  
3130: 20 20 2d 31 20 69 6e 74 65 67 65 72 20 2d 34 32    -1 integer -42
3140: 2e 34 20 74 65 78 74 20 2d 34 32 2e 34 20 72 65  .4 text -42.4 re
3150: 61 6c 20 2d 34 32 2e 34 20 72 65 61 6c 0a 20 20  al -42.4 real.  
3160: 20 20 20 31 20 69 6e 74 65 67 65 72 20 2d 34 32     1 integer -42
3170: 2e 34 20 74 65 78 74 20 2d 34 32 2e 34 20 72 65  .4 text -42.4 re
3180: 61 6c 20 2d 34 32 2e 34 20 72 65 61 6c 0a 20 20  al -42.4 real.  
3190: 20 20 20 31 20 69 6e 74 65 67 65 72 20 2d 34 32     1 integer -42
31a0: 2e 34 20 74 65 78 74 20 2d 34 32 2e 34 20 72 65  .4 text -42.4 re
31b0: 61 6c 20 2d 34 32 2e 34 20 72 65 61 6c 0a 20 20  al -42.4 real.  
31c0: 20 20 20 31 20 69 6e 74 65 67 65 72 20 2d 34 32     1 integer -42
31d0: 2e 34 20 74 65 78 74 20 2d 34 32 2e 34 20 72 65  .4 text -42.4 re
31e0: 61 6c 20 2d 34 32 2e 34 20 72 65 61 6c 0a 20 20  al -42.4 real.  
31f0: 7d 0a 0a 20 20 36 20 7b 20 0a 20 20 20 49 4e 53  }..  6 { .   INS
3200: 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c 55  ERT INTO t4 VALU
3210: 45 53 28 37 2c 20 37 2c 20 37 29 3b 0a 20 20 20  ES(7, 7, 7);.   
3220: 55 50 44 41 54 45 20 74 34 20 53 45 54 20 61 3d  UPDATE t4 SET a=
3230: 38 2c 20 62 3d 38 2c 20 63 3d 38 3b 0a 20 20 7d  8, b=8, c=8;.  }
3240: 20 7b 0a 20 20 20 20 2d 31 20 69 6e 74 65 67 65   {.    -1 intege
3250: 72 20 37 20 74 65 78 74 20 37 20 69 6e 74 65 67  r 7 text 7 integ
3260: 65 72 20 37 2e 30 20 72 65 61 6c 0a 20 20 20 20  er 7.0 real.    
3270: 20 31 20 69 6e 74 65 67 65 72 20 37 20 74 65 78   1 integer 7 tex
3280: 74 20 37 20 69 6e 74 65 67 65 72 20 37 2e 30 20  t 7 integer 7.0 
3290: 72 65 61 6c 0a 20 20 20 20 20 31 20 69 6e 74 65  real.     1 inte
32a0: 67 65 72 20 37 20 74 65 78 74 20 37 20 69 6e 74  ger 7 text 7 int
32b0: 65 67 65 72 20 37 2e 30 20 72 65 61 6c 0a 20 20  eger 7.0 real.  
32c0: 20 20 20 31 20 69 6e 74 65 67 65 72 20 38 20 74     1 integer 8 t
32d0: 65 78 74 20 38 20 69 6e 74 65 67 65 72 20 38 2e  ext 8 integer 8.
32e0: 30 20 72 65 61 6c 0a 20 20 20 20 20 31 20 69 6e  0 real.     1 in
32f0: 74 65 67 65 72 20 37 20 74 65 78 74 20 37 20 69  teger 7 text 7 i
3300: 6e 74 65 67 65 72 20 37 2e 30 20 72 65 61 6c 0a  nteger 7.0 real.
3310: 20 20 20 20 20 31 20 69 6e 74 65 67 65 72 20 38       1 integer 8
3320: 20 74 65 78 74 20 38 20 69 6e 74 65 67 65 72 20   text 8 integer 
3330: 38 2e 30 20 72 65 61 6c 0a 20 20 7d 0a 0a 20 20  8.0 real.  }..  
3340: 37 20 7b 20 0a 20 20 20 55 50 44 41 54 45 20 74  7 { .   UPDATE t
3350: 34 20 53 45 54 20 72 6f 77 69 64 3d 32 3b 0a 20  4 SET rowid=2;. 
3360: 20 7d 20 7b 0a 20 20 20 20 20 31 20 69 6e 74 65   } {.     1 inte
3370: 67 65 72 20 38 20 74 65 78 74 20 38 20 69 6e 74  ger 8 text 8 int
3380: 65 67 65 72 20 38 2e 30 20 72 65 61 6c 0a 20 20  eger 8.0 real.  
3390: 20 20 20 32 20 69 6e 74 65 67 65 72 20 38 20 74     2 integer 8 t
33a0: 65 78 74 20 38 20 69 6e 74 65 67 65 72 20 38 2e  ext 8 integer 8.
33b0: 30 20 72 65 61 6c 0a 20 20 20 20 20 31 20 69 6e  0 real.     1 in
33c0: 74 65 67 65 72 20 38 20 74 65 78 74 20 38 20 69  teger 8 text 8 i
33d0: 6e 74 65 67 65 72 20 38 2e 30 20 72 65 61 6c 0a  nteger 8.0 real.
33e0: 20 20 20 20 20 32 20 69 6e 74 65 67 65 72 20 38       2 integer 8
33f0: 20 74 65 78 74 20 38 20 69 6e 74 65 67 65 72 20   text 8 integer 
3400: 38 2e 30 20 72 65 61 6c 0a 20 20 7d 0a 0a 20 20  8.0 real.  }..  
3410: 38 20 7b 20 0a 20 20 20 55 50 44 41 54 45 20 74  8 { .   UPDATE t
3420: 34 20 53 45 54 20 61 3d 27 39 27 2c 20 62 3d 27  4 SET a='9', b='
3430: 39 27 2c 20 63 3d 27 39 27 3b 0a 20 20 7d 20 7b  9', c='9';.  } {
3440: 0a 20 20 20 20 20 32 20 69 6e 74 65 67 65 72 20  .     2 integer 
3450: 38 20 74 65 78 74 20 38 20 69 6e 74 65 67 65 72  8 text 8 integer
3460: 20 38 2e 30 20 72 65 61 6c 0a 20 20 20 20 20 32   8.0 real.     2
3470: 20 69 6e 74 65 67 65 72 20 39 20 74 65 78 74 20   integer 9 text 
3480: 39 20 69 6e 74 65 67 65 72 20 39 2e 30 20 72 65  9 integer 9.0 re
3490: 61 6c 0a 20 20 20 20 20 32 20 69 6e 74 65 67 65  al.     2 intege
34a0: 72 20 38 20 74 65 78 74 20 38 20 69 6e 74 65 67  r 8 text 8 integ
34b0: 65 72 20 38 2e 30 20 72 65 61 6c 0a 20 20 20 20  er 8.0 real.    
34c0: 20 32 20 69 6e 74 65 67 65 72 20 39 20 74 65 78   2 integer 9 tex
34d0: 74 20 39 20 69 6e 74 65 67 65 72 20 39 2e 30 20  t 9 integer 9.0 
34e0: 72 65 61 6c 0a 20 20 7d 0a 0a 20 20 39 20 7b 20  real.  }..  9 { 
34f0: 0a 20 20 20 55 50 44 41 54 45 20 74 34 20 53 45  .   UPDATE t4 SE
3500: 54 20 61 3d 27 39 2e 31 27 2c 20 62 3d 27 39 2e  T a='9.1', b='9.
3510: 31 27 2c 20 63 3d 27 39 2e 31 27 3b 0a 20 20 7d  1', c='9.1';.  }
3520: 20 7b 0a 20 20 20 20 20 32 20 69 6e 74 65 67 65   {.     2 intege
3530: 72 20 39 20 20 20 74 65 78 74 20 39 20 20 20 69  r 9   text 9   i
3540: 6e 74 65 67 65 72 20 39 2e 30 20 72 65 61 6c 0a  nteger 9.0 real.
3550: 20 20 20 20 20 32 20 69 6e 74 65 67 65 72 20 39       2 integer 9
3560: 2e 31 20 74 65 78 74 20 39 2e 31 20 72 65 61 6c  .1 text 9.1 real
3570: 20 20 20 20 39 2e 31 20 72 65 61 6c 0a 20 20 20      9.1 real.   
3580: 20 20 32 20 69 6e 74 65 67 65 72 20 39 20 20 20    2 integer 9   
3590: 74 65 78 74 20 39 20 20 20 69 6e 74 65 67 65 72  text 9   integer
35a0: 20 39 2e 30 20 72 65 61 6c 0a 20 20 20 20 20 32   9.0 real.     2
35b0: 20 69 6e 74 65 67 65 72 20 39 2e 31 20 74 65 78   integer 9.1 tex
35c0: 74 20 39 2e 31 20 72 65 61 6c 20 20 20 20 39 2e  t 9.1 real    9.
35d0: 31 20 72 65 61 6c 0a 20 20 7d 0a 7d 20 7b 0a 20  1 real.  }.} {. 
35e0: 20 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72   do_test trigger
35f0: 43 2d 34 2e 31 2e 24 6e 20 7b 0a 20 20 20 20 65  C-4.1.$n {.    e
3600: 76 61 6c 20 63 6f 6e 63 61 74 20 5b 65 78 65 63  val concat [exec
3610: 73 71 6c 20 22 20 0a 20 20 20 20 20 20 44 45 4c  sql " .      DEL
3620: 45 54 45 20 46 52 4f 4d 20 6c 6f 67 3b 0a 20 20  ETE FROM log;.  
3630: 20 20 20 20 24 69 6e 73 65 72 74 20 3b 20 0a 20      $insert ; . 
3640: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
3650: 4f 4d 20 6c 6f 67 3b 0a 20 20 20 20 22 5d 0a 20  OM log;.    "]. 
3660: 20 7d 20 5b 6a 6f 69 6e 20 24 6c 6f 67 20 22 20   } [join $log " 
3670: 22 5d 0a 7d 20 0a 0a 66 69 6e 69 73 68 5f 74 65  "].} ..finish_te
3680: 73 74 0a 0a 0a                                   st...