/ Hex Artifact Content
Login

Artifact cc43b4a62f447a0b0ec76ce511758c460c049c83:


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 72 65 63 75 72 73 69 76 65  PRAGMA recursive
0220: 5f 74 72 69 67 67 65 72 73 20 3d 20 6f 6e 20 7d  _triggers = on }
0230: 0a 0a 23 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f  ..#sqlite3_db_co
0240: 6e 66 69 67 5f 6c 6f 6f 6b 61 73 69 64 65 20 64  nfig_lookaside d
0250: 62 20 30 20 30 20 30 0a 0a 23 2d 2d 2d 2d 2d 2d  b 0 0 0..#------
0260: 2d 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 0a 23 20 54 68 69 73 20 62 6c 6f 63 6b  ---.# This block
02b0: 20 6f 66 20 74 65 73 74 73 2c 20 74 72 69 67 67   of tests, trigg
02c0: 65 72 43 2d 31 2e 2a 2c 20 61 72 65 20 6e 6f 74  erC-1.*, are not
02d0: 20 61 69 6d 65 64 20 61 74 20 61 6e 79 20 73 70   aimed at any sp
02e0: 65 63 69 66 69 63 0a 23 20 70 72 6f 70 65 72 74  ecific.# propert
02f0: 79 20 6f 66 20 74 68 65 20 74 72 69 67 67 65 72  y of the trigger
0300: 73 20 73 75 62 2d 73 79 73 74 65 6d 2e 20 54 68  s sub-system. Th
0310: 65 79 20 77 65 72 65 20 63 72 65 61 74 65 64 20  ey were created 
0320: 74 6f 20 64 65 62 75 67 0a 23 20 73 70 65 63 69  to debug.# speci
0330: 66 69 63 20 70 72 6f 62 6c 65 6d 73 20 77 68 69  fic problems whi
0340: 6c 65 20 6d 6f 64 69 66 79 69 6e 67 20 53 51 4c  le modifying SQL
0350: 69 74 65 20 74 6f 20 73 75 70 70 6f 72 74 20 72  ite to support r
0360: 65 63 75 72 73 69 76 65 0a 23 20 74 72 69 67 67  ecursive.# trigg
0370: 65 72 73 2e 20 54 68 65 79 20 61 72 65 20 6c 65  ers. They are le
0380: 66 74 20 68 65 72 65 20 69 6e 20 63 61 73 65 20  ft here in case 
0390: 74 68 65 79 20 63 61 6e 20 68 65 6c 70 20 64 65  they can help de
03a0: 62 75 67 20 74 68 65 0a 23 20 73 61 6d 65 20 70  bug the.# same p
03b0: 72 6f 62 6c 65 6d 73 20 61 67 61 69 6e 2e 0a 23  roblems again..#
03c0: 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72  .do_test trigger
03d0: 43 2d 31 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  C-1.1 {.  execsq
03e0: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
03f0: 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 63 29  ABLE t1(a, b, c)
0400: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
0410: 4c 45 20 6c 6f 67 28 74 2c 20 61 31 2c 20 62 31  LE log(t, a1, b1
0420: 2c 20 63 31 2c 20 61 32 2c 20 62 32 2c 20 63 32  , c1, a2, b2, c2
0430: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 52  );.    CREATE TR
0440: 49 47 47 45 52 20 74 72 69 67 31 20 42 45 46 4f  IGGER trig1 BEFO
0450: 52 45 20 49 4e 53 45 52 54 20 4f 4e 20 74 31 20  RE INSERT ON t1 
0460: 42 45 47 49 4e 0a 20 20 20 20 20 20 49 4e 53 45  BEGIN.      INSE
0470: 52 54 20 49 4e 54 4f 20 6c 6f 67 20 56 41 4c 55  RT INTO log VALU
0480: 45 53 28 27 62 65 66 6f 72 65 27 2c 20 4e 55 4c  ES('before', NUL
0490: 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 6e  L, NULL, NULL, n
04a0: 65 77 2e 61 2c 20 6e 65 77 2e 62 2c 20 6e 65 77  ew.a, new.b, new
04b0: 2e 63 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20  .c);.    END;.  
04c0: 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52    CREATE TRIGGER
04d0: 20 74 72 69 67 32 20 41 46 54 45 52 20 49 4e 53   trig2 AFTER INS
04e0: 45 52 54 20 4f 4e 20 74 31 20 42 45 47 49 4e 0a  ERT ON t1 BEGIN.
04f0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
0500: 4f 20 6c 6f 67 20 56 41 4c 55 45 53 28 27 61 66  O log VALUES('af
0510: 74 65 72 27 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  ter', NULL, NULL
0520: 2c 20 4e 55 4c 4c 2c 20 6e 65 77 2e 61 2c 20 6e  , NULL, new.a, n
0530: 65 77 2e 62 2c 20 6e 65 77 2e 63 29 3b 0a 20 20  ew.b, new.c);.  
0540: 20 20 45 4e 44 3b 0a 20 20 20 20 43 52 45 41 54    END;.    CREAT
0550: 45 20 54 52 49 47 47 45 52 20 74 72 69 67 33 20  E TRIGGER trig3 
0560: 42 45 46 4f 52 45 20 55 50 44 41 54 45 20 4f 4e  BEFORE UPDATE ON
0570: 20 74 31 20 42 45 47 49 4e 0a 20 20 20 20 20 20   t1 BEGIN.      
0580: 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c 6f 67 20  INSERT INTO log 
0590: 56 41 4c 55 45 53 28 27 62 65 66 6f 72 65 27 2c  VALUES('before',
05a0: 20 6f 6c 64 2e 61 2c 6f 6c 64 2e 62 2c 6f 6c 64   old.a,old.b,old
05b0: 2e 63 2c 20 6e 65 77 2e 61 2c 6e 65 77 2e 62 2c  .c, new.a,new.b,
05c0: 6e 65 77 2e 63 29 3b 0a 20 20 20 20 45 4e 44 3b  new.c);.    END;
05d0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47  .    CREATE TRIG
05e0: 47 45 52 20 74 72 69 67 34 20 41 46 54 45 52 20  GER trig4 AFTER 
05f0: 55 50 44 41 54 45 20 4f 4e 20 74 31 20 42 45 47  UPDATE ON t1 BEG
0600: 49 4e 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  IN.      INSERT 
0610: 49 4e 54 4f 20 6c 6f 67 20 56 41 4c 55 45 53 28  INTO log VALUES(
0620: 27 61 66 74 65 72 27 2c 20 6f 6c 64 2e 61 2c 6f  'after', old.a,o
0630: 6c 64 2e 62 2c 6f 6c 64 2e 63 2c 20 6e 65 77 2e  ld.b,old.c, new.
0640: 61 2c 6e 65 77 2e 62 2c 6e 65 77 2e 63 29 3b 0a  a,new.b,new.c);.
0650: 20 20 20 20 45 4e 44 3b 0a 0a 20 20 20 20 43 52      END;..    CR
0660: 45 41 54 45 20 54 52 49 47 47 45 52 20 74 72 69  EATE TRIGGER tri
0670: 67 35 20 42 45 46 4f 52 45 20 44 45 4c 45 54 45  g5 BEFORE DELETE
0680: 20 4f 4e 20 74 31 20 42 45 47 49 4e 0a 20 20 20   ON t1 BEGIN.   
0690: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c     INSERT INTO l
06a0: 6f 67 20 56 41 4c 55 45 53 28 27 62 65 66 6f 72  og VALUES('befor
06b0: 65 27 2c 20 6f 6c 64 2e 61 2c 6f 6c 64 2e 62 2c  e', old.a,old.b,
06c0: 6f 6c 64 2e 63 2c 20 4e 55 4c 4c 2c 4e 55 4c 4c  old.c, NULL,NULL
06d0: 2c 4e 55 4c 4c 29 3b 0a 20 20 20 20 45 4e 44 3b  ,NULL);.    END;
06e0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47  .    CREATE TRIG
06f0: 47 45 52 20 74 72 69 67 36 20 41 46 54 45 52 20  GER trig6 AFTER 
0700: 44 45 4c 45 54 45 20 4f 4e 20 74 31 20 42 45 47  DELETE ON t1 BEG
0710: 49 4e 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  IN.      INSERT 
0720: 49 4e 54 4f 20 6c 6f 67 20 56 41 4c 55 45 53 28  INTO log VALUES(
0730: 27 61 66 74 65 72 27 2c 20 6f 6c 64 2e 61 2c 6f  'after', old.a,o
0740: 6c 64 2e 62 2c 6f 6c 64 2e 63 2c 20 4e 55 4c 4c  ld.b,old.c, NULL
0750: 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 20 20 20  ,NULL,NULL);.   
0760: 20 45 4e 44 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64   END;.  }.} {}.d
0770: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 43 2d  o_test triggerC-
0780: 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.2 {.  execsql 
0790: 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  {.    INSERT INT
07a0: 4f 20 74 31 20 56 41 4c 55 45 53 28 27 41 27 2c  O t1 VALUES('A',
07b0: 20 27 42 27 2c 20 27 43 27 29 3b 0a 20 20 20 20   'B', 'C');.    
07c0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6c 6f  SELECT * FROM lo
07d0: 67 3b 0a 20 20 7d 0a 7d 20 7b 62 65 66 6f 72 65  g;.  }.} {before
07e0: 20 7b 7d 20 7b 7d 20 7b 7d 20 41 20 42 20 43 20   {} {} {} A B C 
07f0: 61 66 74 65 72 20 7b 7d 20 7b 7d 20 7b 7d 20 41  after {} {} {} A
0800: 20 42 20 43 7d 0a 64 6f 5f 74 65 73 74 20 74 72   B C}.do_test tr
0810: 69 67 67 65 72 43 2d 31 2e 33 20 7b 0a 20 20 65  iggerC-1.3 {.  e
0820: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
0830: 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 41  * FROM t1 }.} {A
0840: 20 42 20 43 7d 0a 64 6f 5f 74 65 73 74 20 74 72   B C}.do_test tr
0850: 69 67 67 65 72 43 2d 31 2e 34 20 7b 0a 20 20 65  iggerC-1.4 {.  e
0860: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c  xecsql {.    DEL
0870: 45 54 45 20 46 52 4f 4d 20 6c 6f 67 3b 0a 20 20  ETE FROM log;.  
0880: 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20    UPDATE t1 SET 
0890: 61 20 3d 20 27 61 27 3b 0a 20 20 20 20 53 45 4c  a = 'a';.    SEL
08a0: 45 43 54 20 2a 20 46 52 4f 4d 20 6c 6f 67 3b 0a  ECT * FROM log;.
08b0: 20 20 7d 0a 7d 20 7b 62 65 66 6f 72 65 20 41 20    }.} {before A 
08c0: 42 20 43 20 61 20 42 20 43 20 61 66 74 65 72 20  B C a B C after 
08d0: 41 20 42 20 43 20 61 20 42 20 43 7d 0a 64 6f 5f  A B C a B C}.do_
08e0: 74 65 73 74 20 74 72 69 67 67 65 72 43 2d 31 2e  test triggerC-1.
08f0: 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  5 {.  execsql { 
0900: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
0910: 20 7d 0a 7d 20 7b 61 20 42 20 43 7d 0a 64 6f 5f   }.} {a B C}.do_
0920: 74 65 73 74 20 74 72 69 67 67 65 72 43 2d 31 2e  test triggerC-1.
0930: 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  6 {.  execsql {.
0940: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
0950: 6c 6f 67 3b 0a 20 20 20 20 44 45 4c 45 54 45 20  log;.    DELETE 
0960: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 53 45 4c  FROM t1;.    SEL
0970: 45 43 54 20 2a 20 46 52 4f 4d 20 6c 6f 67 3b 0a  ECT * FROM log;.
0980: 20 20 7d 0a 7d 20 7b 62 65 66 6f 72 65 20 61 20    }.} {before a 
0990: 42 20 43 20 7b 7d 20 7b 7d 20 7b 7d 20 61 66 74  B C {} {} {} aft
09a0: 65 72 20 61 20 42 20 43 20 7b 7d 20 7b 7d 20 7b  er a B C {} {} {
09b0: 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67  }}.do_test trigg
09c0: 65 72 43 2d 31 2e 37 20 7b 0a 20 20 65 78 65 63  erC-1.7 {.  exec
09d0: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
09e0: 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 7d 0a 64 6f  ROM t1 }.} {}.do
09f0: 5f 74 65 73 74 20 74 72 69 67 67 65 72 43 2d 31  _test triggerC-1
0a00: 2e 38 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .8 {.  execsql {
0a10: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
0a20: 45 20 74 34 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t4(a, b);.    
0a30: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74  CREATE TRIGGER t
0a40: 34 74 20 41 46 54 45 52 20 44 45 4c 45 54 45 20  4t AFTER DELETE 
0a50: 4f 4e 20 74 34 20 42 45 47 49 4e 0a 20 20 20 20  ON t4 BEGIN.    
0a60: 20 20 53 45 4c 45 43 54 20 52 41 49 53 45 28 41    SELECT RAISE(A
0a70: 42 4f 52 54 2c 20 27 64 65 6c 65 74 65 20 69 73  BORT, 'delete is
0a80: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 27 29   not supported')
0a90: 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 7d 0a 7d  ;.    END;.  }.}
0aa0: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67   {}.do_test trig
0ab0: 67 65 72 43 2d 31 2e 39 20 7b 0a 20 20 65 78 65  gerC-1.9 {.  exe
0ac0: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
0ad0: 54 4f 20 74 34 20 56 41 4c 55 45 53 28 31 2c 20  TO t4 VALUES(1, 
0ae0: 32 29 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20  2) }.  catchsql 
0af0: 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 34  { DELETE FROM t4
0b00: 20 7d 0a 7d 20 7b 31 20 7b 64 65 6c 65 74 65 20   }.} {1 {delete 
0b10: 69 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  is not supported
0b20: 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67  }}.do_test trigg
0b30: 65 72 43 2d 31 2e 31 30 20 7b 0a 20 20 65 78 65  erC-1.10 {.  exe
0b40: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
0b50: 46 52 4f 4d 20 74 34 20 7d 0a 7d 20 7b 31 20 32  FROM t4 }.} {1 2
0b60: 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65  }.do_test trigge
0b70: 72 43 2d 31 2e 31 31 20 7b 0a 20 20 65 78 65 63  rC-1.11 {.  exec
0b80: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
0b90: 20 54 41 42 4c 45 20 74 35 20 28 61 20 70 72 69   TABLE t5 (a pri
0ba0: 6d 61 72 79 20 6b 65 79 2c 20 62 2c 20 63 29 3b  mary key, b, c);
0bb0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
0bc0: 20 74 35 20 76 61 6c 75 65 73 20 28 31 2c 20 32   t5 values (1, 2
0bd0: 2c 20 33 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , 3);.    CREATE
0be0: 20 54 52 49 47 47 45 52 20 61 75 5f 74 62 6c 20   TRIGGER au_tbl 
0bf0: 41 46 54 45 52 20 55 50 44 41 54 45 20 4f 4e 20  AFTER UPDATE ON 
0c00: 74 35 20 42 45 47 49 4e 0a 20 20 20 20 20 20 55  t5 BEGIN.      U
0c10: 50 44 41 54 45 20 4f 52 20 49 47 4e 4f 52 45 20  PDATE OR IGNORE 
0c20: 74 35 20 53 45 54 20 61 20 3d 20 6e 65 77 2e 61  t5 SET a = new.a
0c30: 2c 20 63 20 3d 20 31 30 3b 0a 20 20 20 20 45 4e  , c = 10;.    EN
0c40: 44 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  D;.  }.} {}.do_t
0c50: 65 73 74 20 74 72 69 67 67 65 72 43 2d 31 2e 31  est triggerC-1.1
0c60: 32 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  2 {.  catchsql {
0c70: 20 55 50 44 41 54 45 20 4f 52 20 52 45 50 4c 41   UPDATE OR REPLA
0c80: 43 45 20 74 35 20 53 45 54 20 61 20 3d 20 34 20  CE t5 SET a = 4 
0c90: 57 48 45 52 45 20 61 20 3d 20 31 20 7d 0a 7d 20  WHERE a = 1 }.} 
0ca0: 7b 31 20 7b 74 6f 6f 20 6d 61 6e 79 20 6c 65 76  {1 {too many lev
0cb0: 65 6c 73 20 6f 66 20 74 72 69 67 67 65 72 20 72  els of trigger r
0cc0: 65 63 75 72 73 69 6f 6e 7d 7d 0a 64 6f 5f 74 65  ecursion}}.do_te
0cd0: 73 74 20 74 72 69 67 67 65 72 43 2d 31 2e 31 33  st triggerC-1.13
0ce0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
0cf0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
0d00: 74 36 28 61 20 49 4e 54 45 47 45 52 20 50 52 49  t6(a INTEGER PRI
0d10: 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20  MARY KEY, b);.  
0d20: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 36    INSERT INTO t6
0d30: 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20   VALUES(1, 2);. 
0d40: 20 20 20 63 72 65 61 74 65 20 74 72 69 67 67 65     create trigge
0d50: 72 20 72 31 20 61 66 74 65 72 20 75 70 64 61 74  r r1 after updat
0d60: 65 20 6f 6e 20 74 36 20 66 6f 72 20 65 61 63 68  e on t6 for each
0d70: 20 72 6f 77 20 62 65 67 69 6e 0a 20 20 20 20 20   row begin.     
0d80: 20 53 45 4c 45 43 54 20 31 3b 0a 20 20 20 20 65   SELECT 1;.    e
0d90: 6e 64 3b 0a 20 20 20 20 55 50 44 41 54 45 20 74  nd;.    UPDATE t
0da0: 36 20 53 45 54 20 61 3d 61 3b 20 0a 20 20 7d 0a  6 SET a=a; .  }.
0db0: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69  } {}.do_test tri
0dc0: 67 67 65 72 43 2d 31 2e 31 34 20 7b 0a 20 20 65  ggerC-1.14 {.  e
0dd0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f  xecsql {.    DRO
0de0: 50 20 54 41 42 4c 45 20 74 31 3b 0a 20 20 20 20  P TABLE t1;.    
0df0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 6e 74  CREATE TABLE cnt
0e00: 28 6e 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  (n);.    INSERT 
0e10: 49 4e 54 4f 20 63 6e 74 20 56 41 4c 55 45 53 28  INTO cnt VALUES(
0e20: 30 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  0);.    CREATE T
0e30: 41 42 4c 45 20 74 31 28 61 20 49 4e 54 45 47 45  ABLE t1(a INTEGE
0e40: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  R PRIMARY KEY, b
0e50: 20 55 4e 49 51 55 45 2c 20 63 2c 20 64 2c 20 65   UNIQUE, c, d, e
0e60: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e  );.    CREATE IN
0e70: 44 45 58 20 74 31 63 64 20 4f 4e 20 74 31 28 63  DEX t1cd ON t1(c
0e80: 2c 64 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  ,d);.    CREATE 
0e90: 54 52 49 47 47 45 52 20 74 31 72 31 20 41 46 54  TRIGGER t1r1 AFT
0ea0: 45 52 20 55 50 44 41 54 45 20 4f 4e 20 74 31 20  ER UPDATE ON t1 
0eb0: 42 45 47 49 4e 20 55 50 44 41 54 45 20 63 6e 74  BEGIN UPDATE cnt
0ec0: 20 53 45 54 20 6e 3d 6e 2b 31 3b 20 45 4e 44 3b   SET n=n+1; END;
0ed0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
0ee0: 20 74 31 20 56 41 4c 55 45 53 28 31 2c 32 2c 33   t1 VALUES(1,2,3
0ef0: 2c 34 2c 35 29 3b 0a 20 20 20 20 49 4e 53 45 52  ,4,5);.    INSER
0f00: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
0f10: 28 36 2c 37 2c 38 2c 39 2c 31 30 29 3b 0a 20 20  (6,7,8,9,10);.  
0f20: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
0f30: 20 56 41 4c 55 45 53 28 31 31 2c 31 32 2c 31 33   VALUES(11,12,13
0f40: 2c 31 34 2c 31 35 29 3b 0a 20 20 7d 0a 7d 20 7b  ,14,15);.  }.} {
0f50: 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65  }.do_test trigge
0f60: 72 43 2d 31 2e 31 35 20 7b 0a 20 20 63 61 74 63  rC-1.15 {.  catc
0f70: 68 73 71 6c 20 7b 20 55 50 44 41 54 45 20 4f 52  hsql { UPDATE OR
0f80: 20 52 4f 4c 4c 42 41 43 4b 20 74 31 20 53 45 54   ROLLBACK t1 SET
0f90: 20 61 3d 31 30 30 20 7d 0a 7d 20 7b 31 20 7b 50   a=100 }.} {1 {P
0fa0: 52 49 4d 41 52 59 20 4b 45 59 20 6d 75 73 74 20  RIMARY KEY must 
0fb0: 62 65 20 75 6e 69 71 75 65 7d 7d 0a 0a 0a 23 2d  be unique}}...#-
0fc0: 2d 2d 2d 2d 2d 2d 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 0a 23 20 54 68 69 73 20  --------.# This 
1010: 62 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73 2c 20  block of tests, 
1020: 74 72 69 67 67 65 72 43 2d 32 2e 2a 2c 20 74 65  triggerC-2.*, te
1030: 73 74 73 20 74 68 61 74 20 72 65 63 75 72 73 69  sts that recursi
1040: 76 65 20 74 72 69 67 67 65 72 0a 23 20 70 72 6f  ve trigger.# pro
1050: 67 72 61 6d 73 20 28 74 72 69 67 67 65 72 73 20  grams (triggers 
1060: 74 68 61 74 20 66 69 72 65 20 74 68 65 6d 73 65  that fire themse
1070: 6c 76 65 73 29 20 77 6f 72 6b 2e 20 4d 6f 72 65  lves) work. More
1080: 20 73 70 65 63 69 66 69 63 61 6c 6c 79 2c 0a 23   specifically,.#
1090: 20 74 68 69 73 20 62 6c 6f 63 6b 20 66 6f 63 75   this block focu
10a0: 73 65 73 20 6f 6e 20 72 65 63 75 72 73 69 76 65  ses on recursive
10b0: 20 49 4e 53 45 52 54 20 74 72 69 67 67 65 72 73   INSERT triggers
10c0: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 74 72 69 67  ..#.do_test trig
10d0: 67 65 72 43 2d 32 2e 31 2e 30 20 7b 0a 20 20 65  gerC-2.1.0 {.  e
10e0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
10f0: 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 20 50  ATE TABLE t2(a P
1100: 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 7d  RIMARY KEY);.  }
1110: 0a 7d 20 7b 7d 0a 0a 66 6f 72 65 61 63 68 20 7b  .} {}..foreach {
1120: 6e 20 74 64 65 66 6e 20 72 63 7d 20 7b 0a 20 20  n tdefn rc} {.  
1130: 31 20 7b 20 0a 20 20 20 20 43 52 45 41 54 45 20  1 { .    CREATE 
1140: 54 52 49 47 47 45 52 20 74 32 5f 74 72 69 67 20  TRIGGER t2_trig 
1150: 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f 4e 20  AFTER INSERT ON 
1160: 74 32 20 57 48 45 4e 20 28 6e 65 77 2e 61 3e 30  t2 WHEN (new.a>0
1170: 29 20 42 45 47 49 4e 0a 20 20 20 20 20 20 49 4e  ) BEGIN.      IN
1180: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
1190: 55 45 53 28 6e 65 77 2e 61 20 2d 20 31 29 3b 0a  UES(new.a - 1);.
11a0: 20 20 20 20 45 4e 44 3b 20 0a 20 20 7d 20 7b 30      END; .  } {0
11b0: 20 7b 31 30 20 39 20 38 20 37 20 36 20 35 20 34   {10 9 8 7 6 5 4
11c0: 20 33 20 32 20 31 20 30 7d 7d 0a 0a 20 20 32 20   3 2 1 0}}..  2 
11d0: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49  {.    CREATE TRI
11e0: 47 47 45 52 20 74 32 5f 74 72 69 67 20 41 46 54  GGER t2_trig AFT
11f0: 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 74 32 20  ER INSERT ON t2 
1200: 42 45 47 49 4e 0a 20 20 20 20 20 20 53 45 4c 45  BEGIN.      SELE
1210: 43 54 20 43 41 53 45 20 57 48 45 4e 20 6e 65 77  CT CASE WHEN new
1220: 2e 61 3d 3d 32 20 54 48 45 4e 20 52 41 49 53 45  .a==2 THEN RAISE
1230: 28 49 47 4e 4f 52 45 29 20 45 4c 53 45 20 4e 55  (IGNORE) ELSE NU
1240: 4c 4c 20 45 4e 44 3b 0a 20 20 20 20 20 20 49 4e  LL END;.      IN
1250: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
1260: 55 45 53 28 6e 65 77 2e 61 20 2d 20 31 29 3b 0a  UES(new.a - 1);.
1270: 20 20 20 20 45 4e 44 3b 0a 20 20 7d 20 7b 30 20      END;.  } {0 
1280: 7b 31 30 20 39 20 38 20 37 20 36 20 35 20 34 20  {10 9 8 7 6 5 4 
1290: 33 20 32 7d 7d 0a 0a 20 20 33 20 7b 20 0a 20 20  3 2}}..  3 { .  
12a0: 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52    CREATE TRIGGER
12b0: 20 74 32 5f 74 72 69 67 20 42 45 46 4f 52 45 20   t2_trig BEFORE 
12c0: 49 4e 53 45 52 54 20 4f 4e 20 74 32 20 57 48 45  INSERT ON t2 WHE
12d0: 4e 20 28 6e 65 77 2e 61 3e 30 29 20 42 45 47 49  N (new.a>0) BEGI
12e0: 4e 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  N.      INSERT I
12f0: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 6e 65  NTO t2 VALUES(ne
1300: 77 2e 61 20 2d 20 31 29 3b 0a 20 20 20 20 45 4e  w.a - 1);.    EN
1310: 44 3b 20 0a 20 20 7d 20 7b 30 20 7b 30 20 31 20  D; .  } {0 {0 1 
1320: 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39 20  2 3 4 5 6 7 8 9 
1330: 31 30 7d 7d 0a 0a 20 20 34 20 7b 20 0a 20 20 20  10}}..  4 { .   
1340: 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20   CREATE TRIGGER 
1350: 74 32 5f 74 72 69 67 20 42 45 46 4f 52 45 20 49  t2_trig BEFORE I
1360: 4e 53 45 52 54 20 4f 4e 20 74 32 20 42 45 47 49  NSERT ON t2 BEGI
1370: 4e 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 43  N.      SELECT C
1380: 41 53 45 20 57 48 45 4e 20 6e 65 77 2e 61 3d 3d  ASE WHEN new.a==
1390: 32 20 54 48 45 4e 20 52 41 49 53 45 28 49 47 4e  2 THEN RAISE(IGN
13a0: 4f 52 45 29 20 45 4c 53 45 20 4e 55 4c 4c 20 45  ORE) ELSE NULL E
13b0: 4e 44 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ND;.      INSERT
13c0: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
13d0: 6e 65 77 2e 61 20 2d 20 31 29 3b 0a 20 20 20 20  new.a - 1);.    
13e0: 45 4e 44 3b 0a 20 20 7d 20 7b 30 20 7b 33 20 34  END;.  } {0 {3 4
13f0: 20 35 20 36 20 37 20 38 20 39 20 31 30 7d 7d 0a   5 6 7 8 9 10}}.
1400: 0a 20 20 35 20 7b 20 0a 20 20 20 20 43 52 45 41  .  5 { .    CREA
1410: 54 45 20 54 52 49 47 47 45 52 20 74 32 5f 74 72  TE TRIGGER t2_tr
1420: 69 67 20 42 45 46 4f 52 45 20 49 4e 53 45 52 54  ig BEFORE INSERT
1430: 20 4f 4e 20 74 32 20 42 45 47 49 4e 0a 20 20 20   ON t2 BEGIN.   
1440: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1450: 32 20 56 41 4c 55 45 53 28 6e 65 77 2e 61 20 2d  2 VALUES(new.a -
1460: 20 31 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20   1);.    END;.  
1470: 7d 20 7b 31 20 7b 74 6f 6f 20 6d 61 6e 79 20 6c  } {1 {too many l
1480: 65 76 65 6c 73 20 6f 66 20 74 72 69 67 67 65 72  evels of trigger
1490: 20 72 65 63 75 72 73 69 6f 6e 7d 7d 0a 0a 20 20   recursion}}..  
14a0: 36 20 7b 20 0a 20 20 20 20 43 52 45 41 54 45 20  6 { .    CREATE 
14b0: 54 52 49 47 47 45 52 20 74 32 5f 74 72 69 67 20  TRIGGER t2_trig 
14c0: 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f 4e 20  AFTER INSERT ON 
14d0: 74 32 20 57 48 45 4e 20 28 6e 65 77 2e 61 3e 30  t2 WHEN (new.a>0
14e0: 29 20 42 45 47 49 4e 0a 20 20 20 20 20 20 49 4e  ) BEGIN.      IN
14f0: 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49  SERT OR IGNORE I
1500: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 6e 65  NTO t2 VALUES(ne
1510: 77 2e 61 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20  w.a);.    END;. 
1520: 20 7d 20 7b 30 20 31 30 7d 0a 0a 20 20 37 20 7b   } {0 10}..  7 {
1530: 20 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49   .    CREATE TRI
1540: 47 47 45 52 20 74 32 5f 74 72 69 67 20 42 45 46  GGER t2_trig BEF
1550: 4f 52 45 20 49 4e 53 45 52 54 20 4f 4e 20 74 32  ORE INSERT ON t2
1560: 20 57 48 45 4e 20 28 6e 65 77 2e 61 3e 30 29 20   WHEN (new.a>0) 
1570: 42 45 47 49 4e 0a 20 20 20 20 20 20 49 4e 53 45  BEGIN.      INSE
1580: 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54  RT OR IGNORE INT
1590: 4f 20 74 32 20 56 41 4c 55 45 53 28 6e 65 77 2e  O t2 VALUES(new.
15a0: 61 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 7d  a);.    END;.  }
15b0: 20 7b 31 20 7b 74 6f 6f 20 6d 61 6e 79 20 6c 65   {1 {too many le
15c0: 76 65 6c 73 20 6f 66 20 74 72 69 67 67 65 72 20  vels of trigger 
15d0: 72 65 63 75 72 73 69 6f 6e 7d 7d 0a 7d 20 7b 0a  recursion}}.} {.
15e0: 20 20 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65    do_test trigge
15f0: 72 43 2d 32 2e 31 2e 24 6e 20 7b 0a 20 20 20 20  rC-2.1.$n {.    
1600: 63 61 74 63 68 73 71 6c 20 7b 20 44 52 4f 50 20  catchsql { DROP 
1610: 54 52 49 47 47 45 52 20 74 32 5f 74 72 69 67 20  TRIGGER t2_trig 
1620: 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 20 7b  }.    execsql  {
1630: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 32 20   DELETE FROM t2 
1640: 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 20 24  }.    execsql  $
1650: 74 64 65 66 6e 0a 20 20 20 20 63 61 74 63 68 73  tdefn.    catchs
1660: 71 6c 20 7b 0a 20 20 20 20 20 20 49 4e 53 45 52  ql {.      INSER
1670: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
1680: 28 31 30 29 3b 0a 20 20 20 20 20 20 53 45 4c 45  (10);.      SELE
1690: 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20  CT * FROM t2;.  
16a0: 20 20 7d 0a 20 20 7d 20 24 72 63 0a 7d 0a 0a 64    }.  } $rc.}..d
16b0: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 43 2d  o_test triggerC-
16c0: 32 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.2 {.  execsql 
16d0: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
16e0: 4c 45 20 74 32 32 28 78 29 3b 0a 0a 20 20 20 20  LE t22(x);..    
16f0: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74  CREATE TRIGGER t
1700: 32 32 61 20 41 46 54 45 52 20 49 4e 53 45 52 54  22a AFTER INSERT
1710: 20 4f 4e 20 74 32 32 20 42 45 47 49 4e 0a 20 20   ON t22 BEGIN.  
1720: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1730: 74 32 32 20 53 45 4c 45 43 54 20 78 20 2b 20 28  t22 SELECT x + (
1740: 53 45 4c 45 43 54 20 6d 61 78 28 78 29 20 46 52  SELECT max(x) FR
1750: 4f 4d 20 74 32 32 29 20 46 52 4f 4d 20 74 32 32  OM t22) FROM t22
1760: 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 20 20 43  ;.    END;.    C
1770: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74 32  REATE TRIGGER t2
1780: 32 62 20 42 45 46 4f 52 45 20 49 4e 53 45 52 54  2b BEFORE INSERT
1790: 20 4f 4e 20 74 32 32 20 42 45 47 49 4e 0a 20 20   ON t22 BEGIN.  
17a0: 20 20 20 20 53 45 4c 45 43 54 20 43 41 53 45 20      SELECT CASE 
17b0: 57 48 45 4e 20 28 53 45 4c 45 43 54 20 63 6f 75  WHEN (SELECT cou
17c0: 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 32 29 20  nt(*) FROM t22) 
17d0: 3e 3d 20 31 30 30 0a 20 20 20 20 20 20 20 20 20  >= 100.         
17e0: 20 20 20 20 20 20 20 20 20 54 48 45 4e 20 52 41           THEN RA
17f0: 49 53 45 28 49 47 4e 4f 52 45 29 0a 20 20 20 20  ISE(IGNORE).    
1800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 4c                EL
1810: 53 45 20 4e 55 4c 4c 20 45 4e 44 3b 0a 20 20 20  SE NULL END;.   
1820: 20 45 4e 44 3b 0a 0a 20 20 20 20 49 4e 53 45 52   END;..    INSER
1830: 54 20 49 4e 54 4f 20 74 32 32 20 56 41 4c 55 45  T INTO t22 VALUE
1840: 53 28 31 29 3b 0a 20 20 20 20 53 45 4c 45 43 54  S(1);.    SELECT
1850: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
1860: 32 32 3b 0a 20 20 7d 0a 7d 20 7b 31 30 30 7d 0a  22;.  }.} {100}.
1870: 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72  .do_test trigger
1880: 43 2d 32 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  C-2.3 {.  execsq
1890: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
18a0: 41 42 4c 45 20 74 32 33 28 78 20 50 52 49 4d 41  ABLE t23(x PRIMA
18b0: 52 59 20 4b 45 59 29 3b 0a 0a 20 20 20 20 43 52  RY KEY);..    CR
18c0: 45 41 54 45 20 54 52 49 47 47 45 52 20 74 32 33  EATE TRIGGER t23
18d0: 61 20 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f  a AFTER INSERT O
18e0: 4e 20 74 32 33 20 42 45 47 49 4e 0a 20 20 20 20  N t23 BEGIN.    
18f0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
1900: 33 20 56 41 4c 55 45 53 28 6e 65 77 2e 78 20 2b  3 VALUES(new.x +
1910: 20 31 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 0a 20   1);.    END;.. 
1920: 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45     CREATE TRIGGE
1930: 52 20 74 32 33 62 20 42 45 46 4f 52 45 20 49 4e  R t23b BEFORE IN
1940: 53 45 52 54 20 4f 4e 20 74 32 33 20 42 45 47 49  SERT ON t23 BEGI
1950: 4e 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 43  N.      SELECT C
1960: 41 53 45 20 57 48 45 4e 20 6e 65 77 2e 78 3e 35  ASE WHEN new.x>5
1970: 30 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  00.             
1980: 20 20 20 20 20 54 48 45 4e 20 52 41 49 53 45 28       THEN RAISE(
1990: 49 47 4e 4f 52 45 29 0a 20 20 20 20 20 20 20 20  IGNORE).        
19a0: 20 20 20 20 20 20 20 20 20 20 45 4c 53 45 20 4e            ELSE N
19b0: 55 4c 4c 20 45 4e 44 3b 0a 20 20 20 20 45 4e 44  ULL END;.    END
19c0: 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  ;..    INSERT IN
19d0: 54 4f 20 74 32 33 20 56 41 4c 55 45 53 28 31 29  TO t23 VALUES(1)
19e0: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75  ;.    SELECT cou
19f0: 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 33 3b 0a  nt(*) FROM t23;.
1a00: 20 20 7d 0a 7d 20 7b 35 30 30 7d 0a 20 0a 0a 23    }.} {500}. ..#
1a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 23 20 54 68 69 73 20 62  -------.# This b
1a60: 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73 2c 20 74  lock of tests, t
1a70: 72 69 67 67 65 72 43 2d 33 2e 2a 2c 20 74 65 73  riggerC-3.*, tes
1a80: 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 74 68  t that SQLite th
1a90: 72 6f 77 73 20 61 6e 20 65 78 63 65 70 74 69 6f  rows an exceptio
1aa0: 6e 0a 23 20 77 68 65 6e 20 69 74 20 64 65 74 65  n.# when it dete
1ab0: 63 74 73 20 65 78 63 65 73 73 69 76 65 20 72 65  cts excessive re
1ac0: 63 75 72 73 69 6f 6e 2e 0a 23 0a 64 6f 5f 74 65  cursion..#.do_te
1ad0: 73 74 20 74 72 69 67 67 65 72 43 2d 33 2e 31 2e  st triggerC-3.1.
1ae0: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
1af0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
1b00: 20 74 33 28 61 2c 20 62 29 3b 0a 20 20 20 20 43   t3(a, b);.    C
1b10: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74 33  REATE TRIGGER t3
1b20: 69 20 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f  i AFTER INSERT O
1b30: 4e 20 74 33 20 42 45 47 49 4e 0a 20 20 20 20 20  N t3 BEGIN.     
1b40: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 33 20   DELETE FROM t3 
1b50: 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20 6e 65  WHERE rowid = ne
1b60: 77 2e 72 6f 77 69 64 3b 0a 20 20 20 20 45 4e 44  w.rowid;.    END
1b70: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49  ;.    CREATE TRI
1b80: 47 47 45 52 20 74 33 64 20 41 46 54 45 52 20 44  GGER t3d AFTER D
1b90: 45 4c 45 54 45 20 4f 4e 20 74 33 20 42 45 47 49  ELETE ON t3 BEGI
1ba0: 4e 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  N.      INSERT I
1bb0: 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 6f 6c  NTO t3 VALUES(ol
1bc0: 64 2e 61 2c 20 6f 6c 64 2e 62 29 3b 0a 20 20 20  d.a, old.b);.   
1bd0: 20 45 4e 44 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64   END;.  }.} {}.d
1be0: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 43 2d  o_test triggerC-
1bf0: 33 2e 31 2e 32 20 7b 0a 20 20 63 61 74 63 68 73  3.1.2 {.  catchs
1c00: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
1c10: 20 74 33 20 56 41 4c 55 45 53 28 30 2c 30 29 20   t3 VALUES(0,0) 
1c20: 7d 0a 7d 20 7b 31 20 7b 74 6f 6f 20 6d 61 6e 79  }.} {1 {too many
1c30: 20 6c 65 76 65 6c 73 20 6f 66 20 74 72 69 67 67   levels of trigg
1c40: 65 72 20 72 65 63 75 72 73 69 6f 6e 7d 7d 0a 64  er recursion}}.d
1c50: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 43 2d  o_test triggerC-
1c60: 33 2e 31 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  3.1.3 {.  execsq
1c70: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
1c80: 4d 20 74 33 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f  M t3 }.} {}..do_
1c90: 74 65 73 74 20 74 72 69 67 67 65 72 43 2d 33 2e  test triggerC-3.
1ca0: 32 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.1 {.  execsql 
1cb0: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
1cc0: 4c 45 20 74 33 62 28 78 29 3b 0a 20 20 20 20 43  LE t3b(x);.    C
1cd0: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74 33  REATE TRIGGER t3
1ce0: 62 69 20 41 46 54 45 52 20 49 4e 53 45 52 54 20  bi AFTER INSERT 
1cf0: 4f 4e 20 74 33 62 20 57 48 45 4e 20 6e 65 77 2e  ON t3b WHEN new.
1d00: 78 3c 32 30 30 30 20 42 45 47 49 4e 0a 20 20 20  x<2000 BEGIN.   
1d10: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1d20: 33 62 20 56 41 4c 55 45 53 28 6e 65 77 2e 78 2b  3b VALUES(new.x+
1d30: 31 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 7d  1);.    END;.  }
1d40: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .  catchsql {.  
1d50: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
1d60: 62 20 56 41 4c 55 45 53 28 31 29 3b 0a 20 20 7d  b VALUES(1);.  }
1d70: 0a 7d 20 7b 31 20 7b 74 6f 6f 20 6d 61 6e 79 20  .} {1 {too many 
1d80: 6c 65 76 65 6c 73 20 6f 66 20 74 72 69 67 67 65  levels of trigge
1d90: 72 20 72 65 63 75 72 73 69 6f 6e 7d 7d 0a 64 6f  r recursion}}.do
1da0: 5f 74 65 73 74 20 74 72 69 67 67 65 72 43 2d 33  _test triggerC-3
1db0: 2e 32 2e 32 20 7b 0a 20 20 64 62 20 65 76 61 6c  .2.2 {.  db eval
1dc0: 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   {SELECT * FROM 
1dd0: 74 33 62 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65  t3b}.} {}..do_te
1de0: 73 74 20 74 72 69 67 67 65 72 43 2d 33 2e 33 2e  st triggerC-3.3.
1df0: 31 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  1 {.  catchsql {
1e00: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
1e10: 20 74 33 62 20 56 41 4c 55 45 53 28 31 30 30 30   t3b VALUES(1000
1e20: 29 3b 0a 20 20 7d 0a 7d 20 7b 30 20 7b 7d 7d 0a  );.  }.} {0 {}}.
1e30: 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 43  do_test triggerC
1e40: 2d 33 2e 33 2e 32 20 7b 0a 20 20 64 62 20 65 76  -3.3.2 {.  db ev
1e50: 61 6c 20 7b 53 45 4c 45 43 54 20 63 6f 75 6e 74  al {SELECT count
1e60: 28 2a 29 2c 20 6d 61 78 28 78 29 2c 20 6d 69 6e  (*), max(x), min
1e70: 28 78 29 20 46 52 4f 4d 20 74 33 62 7d 0a 7d 20  (x) FROM t3b}.} 
1e80: 7b 31 30 30 31 20 32 30 30 30 20 31 30 30 30 7d  {1001 2000 1000}
1e90: 0a 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65  ..do_test trigge
1ea0: 72 43 2d 33 2e 34 2e 31 20 7b 0a 20 20 63 61 74  rC-3.4.1 {.  cat
1eb0: 63 68 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45  chsql {.    DELE
1ec0: 54 45 20 46 52 4f 4d 20 74 33 62 3b 0a 20 20 20  TE FROM t3b;.   
1ed0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 62   INSERT INTO t3b
1ee0: 20 56 41 4c 55 45 53 28 39 39 39 29 3b 0a 20 20   VALUES(999);.  
1ef0: 7d 0a 7d 20 7b 31 20 7b 74 6f 6f 20 6d 61 6e 79  }.} {1 {too many
1f00: 20 6c 65 76 65 6c 73 20 6f 66 20 74 72 69 67 67   levels of trigg
1f10: 65 72 20 72 65 63 75 72 73 69 6f 6e 7d 7d 0a 64  er recursion}}.d
1f20: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 43 2d  o_test triggerC-
1f30: 33 2e 34 2e 32 20 7b 0a 20 20 64 62 20 65 76 61  3.4.2 {.  db eva
1f40: 6c 20 7b 53 45 4c 45 43 54 20 63 6f 75 6e 74 28  l {SELECT count(
1f50: 2a 29 2c 20 6d 61 78 28 78 29 2c 20 6d 69 6e 28  *), max(x), min(
1f60: 78 29 20 46 52 4f 4d 20 74 33 62 7d 0a 7d 20 7b  x) FROM t3b}.} {
1f70: 30 20 7b 7d 20 7b 7d 7d 0a 0a 64 6f 5f 74 65 73  0 {} {}}..do_tes
1f80: 74 20 74 72 69 67 67 65 72 43 2d 33 2e 35 2e 31  t triggerC-3.5.1
1f90: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d   {.  sqlite3_lim
1fa0: 69 74 20 64 62 20 53 51 4c 49 54 45 5f 4c 49 4d  it db SQLITE_LIM
1fb0: 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  IT_TRIGGER_DEPTH
1fc0: 20 31 30 30 0a 20 20 63 61 74 63 68 73 71 6c 20   100.  catchsql 
1fd0: 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  {.    INSERT INT
1fe0: 4f 20 74 33 62 20 56 41 4c 55 45 53 28 31 39 30  O t3b VALUES(190
1ff0: 30 29 3b 0a 20 20 7d 0a 7d 20 7b 30 20 7b 7d 7d  0);.  }.} {0 {}}
2000: 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72  .do_test trigger
2010: 43 2d 33 2e 35 2e 32 20 7b 0a 20 20 64 62 20 65  C-3.5.2 {.  db e
2020: 76 61 6c 20 7b 53 45 4c 45 43 54 20 63 6f 75 6e  val {SELECT coun
2030: 74 28 2a 29 2c 20 6d 61 78 28 78 29 2c 20 6d 69  t(*), max(x), mi
2040: 6e 28 78 29 20 46 52 4f 4d 20 74 33 62 7d 0a 7d  n(x) FROM t3b}.}
2050: 20 7b 31 30 31 20 32 30 30 30 20 31 39 30 30 7d   {101 2000 1900}
2060: 0a 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65  ..do_test trigge
2070: 72 43 2d 33 2e 35 2e 33 20 7b 0a 20 20 63 61 74  rC-3.5.3 {.  cat
2080: 63 68 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45  chsql {.    DELE
2090: 54 45 20 46 52 4f 4d 20 74 33 62 3b 0a 20 20 20  TE FROM t3b;.   
20a0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 62   INSERT INTO t3b
20b0: 20 56 41 4c 55 45 53 28 31 38 39 39 29 3b 0a 20   VALUES(1899);. 
20c0: 20 7d 0a 7d 20 7b 31 20 7b 74 6f 6f 20 6d 61 6e   }.} {1 {too man
20d0: 79 20 6c 65 76 65 6c 73 20 6f 66 20 74 72 69 67  y levels of trig
20e0: 67 65 72 20 72 65 63 75 72 73 69 6f 6e 7d 7d 0a  ger recursion}}.
20f0: 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 43  do_test triggerC
2100: 2d 33 2e 35 2e 34 20 7b 0a 20 20 64 62 20 65 76  -3.5.4 {.  db ev
2110: 61 6c 20 7b 53 45 4c 45 43 54 20 63 6f 75 6e 74  al {SELECT count
2120: 28 2a 29 2c 20 6d 61 78 28 78 29 2c 20 6d 69 6e  (*), max(x), min
2130: 28 78 29 20 46 52 4f 4d 20 74 33 62 7d 0a 7d 20  (x) FROM t3b}.} 
2140: 7b 30 20 7b 7d 20 7b 7d 7d 0a 0a 64 6f 5f 74 65  {0 {} {}}..do_te
2150: 73 74 20 74 72 69 67 67 65 72 43 2d 33 2e 36 2e  st triggerC-3.6.
2160: 31 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 69  1 {.  sqlite3_li
2170: 6d 69 74 20 64 62 20 53 51 4c 49 54 45 5f 4c 49  mit db SQLITE_LI
2180: 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MIT_TRIGGER_DEPT
2190: 48 20 31 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  H 1.  catchsql {
21a0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
21b0: 20 74 33 62 20 56 41 4c 55 45 53 28 31 39 39 39   t3b VALUES(1999
21c0: 29 3b 0a 20 20 7d 0a 7d 20 7b 30 20 7b 7d 7d 0a  );.  }.} {0 {}}.
21d0: 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 43  do_test triggerC
21e0: 2d 33 2e 36 2e 32 20 7b 0a 20 20 64 62 20 65 76  -3.6.2 {.  db ev
21f0: 61 6c 20 7b 53 45 4c 45 43 54 20 63 6f 75 6e 74  al {SELECT count
2200: 28 2a 29 2c 20 6d 61 78 28 78 29 2c 20 6d 69 6e  (*), max(x), min
2210: 28 78 29 20 46 52 4f 4d 20 74 33 62 7d 0a 7d 20  (x) FROM t3b}.} 
2220: 7b 32 20 32 30 30 30 20 31 39 39 39 7d 0a 0a 64  {2 2000 1999}..d
2230: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 43 2d  o_test triggerC-
2240: 33 2e 36 2e 33 20 7b 0a 20 20 63 61 74 63 68 73  3.6.3 {.  catchs
2250: 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20  ql {.    DELETE 
2260: 46 52 4f 4d 20 74 33 62 3b 0a 20 20 20 20 49 4e  FROM t3b;.    IN
2270: 53 45 52 54 20 49 4e 54 4f 20 74 33 62 20 56 41  SERT INTO t3b VA
2280: 4c 55 45 53 28 31 39 39 38 29 3b 0a 20 20 7d 0a  LUES(1998);.  }.
2290: 7d 20 7b 31 20 7b 74 6f 6f 20 6d 61 6e 79 20 6c  } {1 {too many l
22a0: 65 76 65 6c 73 20 6f 66 20 74 72 69 67 67 65 72  evels of trigger
22b0: 20 72 65 63 75 72 73 69 6f 6e 7d 7d 0a 64 6f 5f   recursion}}.do_
22c0: 74 65 73 74 20 74 72 69 67 67 65 72 43 2d 33 2e  test triggerC-3.
22d0: 36 2e 34 20 7b 0a 20 20 64 62 20 65 76 61 6c 20  6.4 {.  db eval 
22e0: 7b 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29  {SELECT count(*)
22f0: 2c 20 6d 61 78 28 78 29 2c 20 6d 69 6e 28 78 29  , max(x), min(x)
2300: 20 46 52 4f 4d 20 74 33 62 7d 0a 7d 20 7b 30 20   FROM t3b}.} {0 
2310: 7b 7d 20 7b 7d 7d 0a 73 71 6c 69 74 65 33 5f 6c  {} {}}.sqlite3_l
2320: 69 6d 69 74 20 64 62 20 53 51 4c 49 54 45 5f 4c  imit db SQLITE_L
2330: 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50  IMIT_TRIGGER_DEP
2340: 54 48 20 31 30 30 30 0a 20 20 20 20 20 20 0a 0a  TH 1000.      ..
2350: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
2360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2390: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 69 73 20  --------.# This 
23a0: 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 74 65  next block of te
23b0: 73 74 73 2c 20 74 72 69 67 67 65 72 43 2d 34 2e  sts, triggerC-4.
23c0: 2a 2c 20 63 68 65 63 6b 73 20 74 68 61 74 20 61  *, checks that a
23d0: 66 66 69 6e 69 74 79 20 0a 23 20 74 72 61 6e 73  ffinity .# trans
23e0: 66 6f 72 6d 61 74 69 6f 6e 73 20 61 6e 64 20 63  formations and c
23f0: 6f 6e 73 74 72 61 69 6e 74 20 70 72 6f 63 65 73  onstraint proces
2400: 73 69 6e 67 20 69 73 20 70 65 72 66 6f 72 6d 65  sing is performe
2410: 64 20 61 74 20 74 68 65 20 63 6f 72 72 65 63 74  d at the correct
2420: 20 0a 23 20 74 69 6d 65 73 20 72 65 6c 61 74 69   .# times relati
2430: 76 65 20 74 6f 20 42 45 46 4f 52 45 20 61 6e 64  ve to BEFORE and
2440: 20 41 46 54 45 52 20 74 72 69 67 67 65 72 73 2e   AFTER triggers.
2450: 0a 23 0a 23 20 46 6f 72 20 61 6e 20 49 4e 53 45  .#.# For an INSE
2460: 52 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 66 6f  RT statement, fo
2470: 72 20 65 61 63 68 20 72 6f 77 20 74 6f 20 62 65  r each row to be
2480: 20 69 6e 73 65 72 74 65 64 3a 0a 23 0a 23 20 20   inserted:.#.#  
2490: 20 31 2e 20 41 70 70 6c 79 20 61 66 66 69 6e 69   1. Apply affini
24a0: 74 69 65 73 20 74 6f 20 6e 6f 6e 2d 72 6f 77 69  ties to non-rowi
24b0: 64 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 69  d values to be i
24c0: 6e 73 65 72 74 65 64 2e 0a 23 20 20 20 32 2e 20  nserted..#   2. 
24d0: 46 69 72 65 20 42 45 46 4f 52 45 20 74 72 69 67  Fire BEFORE trig
24e0: 67 65 72 73 2e 0a 23 20 20 20 33 2e 20 50 72 6f  gers..#   3. Pro
24f0: 63 65 73 73 20 63 6f 6e 73 74 72 61 69 6e 74 73  cess constraints
2500: 2e 0a 23 20 20 20 34 2e 20 49 6e 73 65 72 74 20  ..#   4. Insert 
2510: 6e 65 77 20 72 65 63 6f 72 64 2e 0a 23 20 20 20  new record..#   
2520: 35 2e 20 46 69 72 65 20 41 46 54 45 52 20 74 72  5. Fire AFTER tr
2530: 69 67 67 65 72 73 2e 0a 23 0a 23 20 49 66 20 74  iggers..#.# If t
2540: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
2550: 72 6f 77 69 64 20 66 69 65 6c 64 20 69 73 20 74  rowid field is t
2560: 6f 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  o be automatical
2570: 6c 79 20 61 73 73 69 67 6e 65 64 2c 20 69 74 20  ly assigned, it 
2580: 69 73 0a 23 20 73 65 74 20 74 6f 20 2d 31 20 69  is.# set to -1 i
2590: 6e 20 74 68 65 20 6e 65 77 2e 2a 20 72 65 63 6f  n the new.* reco
25a0: 72 64 2e 20 45 76 65 6e 20 69 66 20 69 74 20 69  rd. Even if it i
25b0: 73 20 65 78 70 6c 69 63 69 74 6c 79 20 73 65 74  s explicitly set
25c0: 20 74 6f 20 4e 55 4c 4c 0a 23 20 62 79 20 74 68   to NULL.# by th
25d0: 65 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65  e INSERT stateme
25e0: 6e 74 2e 0a 23 0a 23 20 46 6f 72 20 61 6e 20 55  nt..#.# For an U
25f0: 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 2c  PDATE statement,
2600: 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 74 6f   for each row to
2610: 20 62 65 20 64 65 6c 65 74 65 64 3a 0a 23 0a 23   be deleted:.#.#
2620: 20 20 20 31 2e 20 41 70 70 6c 79 20 61 66 66 69     1. Apply affi
2630: 6e 69 74 69 65 73 20 74 6f 20 6e 6f 6e 2d 72 6f  nities to non-ro
2640: 77 69 64 20 76 61 6c 75 65 73 20 74 6f 20 62 65  wid values to be
2650: 20 69 6e 73 65 72 74 65 64 2e 0a 23 20 20 20 32   inserted..#   2
2660: 2e 20 46 69 72 65 20 42 45 46 4f 52 45 20 74 72  . Fire BEFORE tr
2670: 69 67 67 65 72 73 2e 0a 23 20 20 20 33 2e 20 50  iggers..#   3. P
2680: 72 6f 63 65 73 73 20 63 6f 6e 73 74 72 61 69 6e  rocess constrain
2690: 74 73 2e 0a 23 20 20 20 34 2e 20 49 6e 73 65 72  ts..#   4. Inser
26a0: 74 20 6e 65 77 20 72 65 63 6f 72 64 2e 0a 23 20  t new record..# 
26b0: 20 20 35 2e 20 46 69 72 65 20 41 46 54 45 52 20    5. Fire AFTER 
26c0: 74 72 69 67 67 65 72 73 2e 0a 23 0a 23 20 46 6f  triggers..#.# Fo
26d0: 72 20 61 20 44 45 4c 45 54 45 20 73 74 61 74 65  r a DELETE state
26e0: 6d 65 6e 74 2c 20 66 6f 72 20 65 61 63 68 20 72  ment, for each r
26f0: 6f 77 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  ow to be deleted
2700: 3a 0a 23 0a 23 20 20 20 31 2e 20 46 69 72 65 20  :.#.#   1. Fire 
2710: 42 45 46 4f 52 45 20 74 72 69 67 67 65 72 73 2e  BEFORE triggers.
2720: 0a 23 20 20 20 32 2e 20 52 65 6d 6f 76 65 20 64  .#   2. Remove d
2730: 61 74 61 62 61 73 65 20 72 65 63 6f 72 64 2e 0a  atabase record..
2740: 23 20 20 20 33 2e 20 46 69 72 65 20 41 46 54 45  #   3. Fire AFTE
2750: 52 20 74 72 69 67 67 65 72 73 2e 0a 23 0a 23 20  R triggers..#.# 
2760: 57 68 65 6e 20 61 20 6e 75 6d 65 72 69 63 20 76  When a numeric v
2770: 61 6c 75 65 20 74 68 61 74 20 61 73 20 61 6e 20  alue that as an 
2780: 65 78 61 63 74 20 69 6e 74 65 67 65 72 20 72 65  exact integer re
2790: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 73 20  presentation is 
27a0: 73 74 6f 72 65 64 0a 23 20 69 6e 20 61 20 63 6f  stored.# in a co
27b0: 6c 75 6d 6e 20 77 69 74 68 20 52 45 41 4c 20 61  lumn with REAL a
27c0: 66 66 69 6e 69 74 79 2c 20 69 74 20 69 73 20 61  ffinity, it is a
27d0: 63 74 75 61 6c 6c 79 20 73 74 6f 72 65 64 20 61  ctually stored a
27e0: 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 23 20  s an integer..# 
27f0: 54 68 65 73 65 20 74 65 73 74 73 20 63 68 65 63  These tests chec
2800: 6b 20 74 68 61 74 20 74 68 65 20 74 79 70 65 6f  k that the typeo
2810: 66 28 29 20 73 75 63 68 20 76 61 6c 75 65 73 20  f() such values 
2820: 69 73 20 61 6c 77 61 79 73 20 27 72 65 61 6c 27  is always 'real'
2830: 2c 0a 23 20 6e 6f 74 20 27 69 6e 74 65 67 65 72  ,.# not 'integer
2840: 27 2e 0a 23 0a 23 20 74 72 69 67 67 65 72 43 2d  '..#.# triggerC-
2850: 34 2e 31 2e 2a 3a 20 43 68 65 63 6b 20 74 68 61  4.1.*: Check tha
2860: 74 20 61 66 66 69 6e 69 74 79 20 74 72 61 6e 73  t affinity trans
2870: 66 6f 72 6d 61 74 69 6f 6e 73 20 61 72 65 20 6d  formations are m
2880: 61 64 65 20 62 65 66 6f 72 65 0a 23 20 20 20 20  ade before.#    
2890: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 69               tri
28a0: 67 67 65 72 73 20 61 72 65 20 69 6e 76 6f 6b 65  ggers are invoke
28b0: 64 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 74 72 69  d..#.do_test tri
28c0: 67 67 65 72 43 2d 34 2e 31 2e 31 20 7b 0a 20 20  ggerC-4.1.1 {.  
28d0: 63 61 74 63 68 73 71 6c 20 7b 20 44 52 4f 50 20  catchsql { DROP 
28e0: 54 41 42 4c 45 20 6c 6f 67 20 7d 0a 20 20 63 61  TABLE log }.  ca
28f0: 74 63 68 73 71 6c 20 7b 20 44 52 4f 50 20 54 41  tchsql { DROP TA
2900: 42 4c 45 20 74 34 20 7d 0a 20 20 65 78 65 63 73  BLE t4 }.  execs
2910: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
2920: 54 41 42 4c 45 20 6c 6f 67 28 74 29 3b 0a 20 20  TABLE log(t);.  
2930: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
2940: 34 28 61 20 54 45 58 54 2c 62 20 49 4e 54 45 47  4(a TEXT,b INTEG
2950: 45 52 2c 63 20 52 45 41 4c 29 3b 0a 20 20 20 20  ER,c REAL);.    
2960: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74  CREATE TRIGGER t
2970: 34 62 69 20 42 45 46 4f 52 45 20 49 4e 53 45 52  4bi BEFORE INSER
2980: 54 20 4f 4e 20 74 34 20 42 45 47 49 4e 0a 20 20  T ON t4 BEGIN.  
2990: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
29a0: 6c 6f 67 20 56 41 4c 55 45 53 28 6e 65 77 2e 72  log VALUES(new.r
29b0: 6f 77 69 64 20 7c 7c 20 27 20 27 20 7c 7c 20 74  owid || ' ' || t
29c0: 79 70 65 6f 66 28 6e 65 77 2e 72 6f 77 69 64 29  ypeof(new.rowid)
29d0: 20 7c 7c 20 27 20 27 20 7c 7c 0a 20 20 20 20 20   || ' ' ||.     
29e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f0: 20 20 20 20 20 20 20 20 6e 65 77 2e 61 20 20 20          new.a   
2a00: 20 20 7c 7c 20 27 20 27 20 7c 7c 20 74 79 70 65    || ' ' || type
2a10: 6f 66 28 6e 65 77 2e 61 29 20 20 20 20 20 7c 7c  of(new.a)     ||
2a20: 20 27 20 27 20 7c 7c 0a 20 20 20 20 20 20 20 20   ' ' ||.        
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a40: 20 20 20 20 20 6e 65 77 2e 62 20 20 20 20 20 7c       new.b     |
2a50: 7c 20 27 20 27 20 7c 7c 20 74 79 70 65 6f 66 28  | ' ' || typeof(
2a60: 6e 65 77 2e 62 29 20 20 20 20 20 7c 7c 20 27 20  new.b)     || ' 
2a70: 27 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  ' ||.           
2a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a90: 20 20 6e 65 77 2e 63 20 20 20 20 20 7c 7c 20 27    new.c     || '
2aa0: 20 27 20 7c 7c 20 74 79 70 65 6f 66 28 6e 65 77   ' || typeof(new
2ab0: 2e 63 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  .c).      );.   
2ac0: 20 45 4e 44 3b 0a 20 20 20 20 43 52 45 41 54 45   END;.    CREATE
2ad0: 20 54 52 49 47 47 45 52 20 74 34 61 69 20 41 46   TRIGGER t4ai AF
2ae0: 54 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 74 34  TER INSERT ON t4
2af0: 20 42 45 47 49 4e 0a 20 20 20 20 20 20 49 4e 53   BEGIN.      INS
2b00: 45 52 54 20 49 4e 54 4f 20 6c 6f 67 20 56 41 4c  ERT INTO log VAL
2b10: 55 45 53 28 6e 65 77 2e 72 6f 77 69 64 20 7c 7c  UES(new.rowid ||
2b20: 20 27 20 27 20 7c 7c 20 74 79 70 65 6f 66 28 6e   ' ' || typeof(n
2b30: 65 77 2e 72 6f 77 69 64 29 20 7c 7c 20 27 20 27  ew.rowid) || ' '
2b40: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ||.            
2b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b60: 20 6e 65 77 2e 61 20 20 20 20 20 7c 7c 20 27 20   new.a     || ' 
2b70: 27 20 7c 7c 20 74 79 70 65 6f 66 28 6e 65 77 2e  ' || typeof(new.
2b80: 61 29 20 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c  a)     || ' ' ||
2b90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65                ne
2bb0: 77 2e 62 20 20 20 20 20 7c 7c 20 27 20 27 20 7c  w.b     || ' ' |
2bc0: 7c 20 74 79 70 65 6f 66 28 6e 65 77 2e 62 29 20  | typeof(new.b) 
2bd0: 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c 0a 20 20      || ' ' ||.  
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf0: 20 20 20 20 20 20 20 20 20 20 20 6e 65 77 2e 63             new.c
2c00: 20 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c 20 74       || ' ' || t
2c10: 79 70 65 6f 66 28 6e 65 77 2e 63 29 0a 20 20 20  ypeof(new.c).   
2c20: 20 20 20 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20     );.    END;. 
2c30: 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45     CREATE TRIGGE
2c40: 52 20 74 34 62 64 20 42 45 46 4f 52 45 20 44 45  R t4bd BEFORE DE
2c50: 4c 45 54 45 20 4f 4e 20 74 34 20 42 45 47 49 4e  LETE ON t4 BEGIN
2c60: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
2c70: 54 4f 20 6c 6f 67 20 56 41 4c 55 45 53 28 6f 6c  TO log VALUES(ol
2c80: 64 2e 72 6f 77 69 64 20 7c 7c 20 27 20 27 20 7c  d.rowid || ' ' |
2c90: 7c 20 74 79 70 65 6f 66 28 6f 6c 64 2e 72 6f 77  | typeof(old.row
2ca0: 69 64 29 20 7c 7c 20 27 20 27 20 7c 7c 0a 20 20  id) || ' ' ||.  
2cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc0: 20 20 20 20 20 20 20 20 20 20 20 6f 6c 64 2e 61             old.a
2cd0: 20 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c 20 74       || ' ' || t
2ce0: 79 70 65 6f 66 28 6f 6c 64 2e 61 29 20 20 20 20  ypeof(old.a)    
2cf0: 20 7c 7c 20 27 20 27 20 7c 7c 0a 20 20 20 20 20   || ' ' ||.     
2d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d10: 20 20 20 20 20 20 20 20 6f 6c 64 2e 62 20 20 20          old.b   
2d20: 20 20 7c 7c 20 27 20 27 20 7c 7c 20 74 79 70 65    || ' ' || type
2d30: 6f 66 28 6f 6c 64 2e 62 29 20 20 20 20 20 7c 7c  of(old.b)     ||
2d40: 20 27 20 27 20 7c 7c 0a 20 20 20 20 20 20 20 20   ' ' ||.        
2d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d60: 20 20 20 20 20 6f 6c 64 2e 63 20 20 20 20 20 7c       old.c     |
2d70: 7c 20 27 20 27 20 7c 7c 20 74 79 70 65 6f 66 28  | ' ' || typeof(
2d80: 6f 6c 64 2e 63 29 0a 20 20 20 20 20 20 29 3b 0a  old.c).      );.
2d90: 20 20 20 20 45 4e 44 3b 0a 20 20 20 20 43 52 45      END;.    CRE
2da0: 41 54 45 20 54 52 49 47 47 45 52 20 74 34 61 64  ATE TRIGGER t4ad
2db0: 20 41 46 54 45 52 20 44 45 4c 45 54 45 20 4f 4e   AFTER DELETE ON
2dc0: 20 74 34 20 42 45 47 49 4e 0a 20 20 20 20 20 20   t4 BEGIN.      
2dd0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c 6f 67 20  INSERT INTO log 
2de0: 56 41 4c 55 45 53 28 6f 6c 64 2e 72 6f 77 69 64  VALUES(old.rowid
2df0: 20 7c 7c 20 27 20 27 20 7c 7c 20 74 79 70 65 6f   || ' ' || typeo
2e00: 66 28 6f 6c 64 2e 72 6f 77 69 64 29 20 7c 7c 20  f(old.rowid) || 
2e10: 27 20 27 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ' ' ||.         
2e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e30: 20 20 20 20 6f 6c 64 2e 61 20 20 20 20 20 7c 7c      old.a     ||
2e40: 20 27 20 27 20 7c 7c 20 74 79 70 65 6f 66 28 6f   ' ' || typeof(o
2e50: 6c 64 2e 61 29 20 20 20 20 20 7c 7c 20 27 20 27  ld.a)     || ' '
2e60: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ||.            
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e80: 20 6f 6c 64 2e 62 20 20 20 20 20 7c 7c 20 27 20   old.b     || ' 
2e90: 27 20 7c 7c 20 74 79 70 65 6f 66 28 6f 6c 64 2e  ' || typeof(old.
2ea0: 62 29 20 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c  b)     || ' ' ||
2eb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 6c                ol
2ed0: 64 2e 63 20 20 20 20 20 7c 7c 20 27 20 27 20 7c  d.c     || ' ' |
2ee0: 7c 20 74 79 70 65 6f 66 28 6f 6c 64 2e 63 29 0a  | typeof(old.c).
2ef0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 45 4e 44        );.    END
2f00: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49  ;.    CREATE TRI
2f10: 47 47 45 52 20 74 34 62 75 20 42 45 46 4f 52 45  GGER t4bu BEFORE
2f20: 20 55 50 44 41 54 45 20 4f 4e 20 74 34 20 42 45   UPDATE ON t4 BE
2f30: 47 49 4e 0a 20 20 20 20 20 20 49 4e 53 45 52 54  GIN.      INSERT
2f40: 20 49 4e 54 4f 20 6c 6f 67 20 56 41 4c 55 45 53   INTO log VALUES
2f50: 28 6f 6c 64 2e 72 6f 77 69 64 20 7c 7c 20 27 20  (old.rowid || ' 
2f60: 27 20 7c 7c 20 74 79 70 65 6f 66 28 6f 6c 64 2e  ' || typeof(old.
2f70: 72 6f 77 69 64 29 20 7c 7c 20 27 20 27 20 7c 7c  rowid) || ' ' ||
2f80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 6c                ol
2fa0: 64 2e 61 20 20 20 20 20 7c 7c 20 27 20 27 20 7c  d.a     || ' ' |
2fb0: 7c 20 74 79 70 65 6f 66 28 6f 6c 64 2e 61 29 20  | typeof(old.a) 
2fc0: 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c 0a 20 20      || ' ' ||.  
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe0: 20 20 20 20 20 20 20 20 20 20 20 6f 6c 64 2e 62             old.b
2ff0: 20 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c 20 74       || ' ' || t
3000: 79 70 65 6f 66 28 6f 6c 64 2e 62 29 20 20 20 20  ypeof(old.b)    
3010: 20 7c 7c 20 27 20 27 20 7c 7c 0a 20 20 20 20 20   || ' ' ||.     
3020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3030: 20 20 20 20 20 20 20 20 6f 6c 64 2e 63 20 20 20          old.c   
3040: 20 20 7c 7c 20 27 20 27 20 7c 7c 20 74 79 70 65    || ' ' || type
3050: 6f 66 28 6f 6c 64 2e 63 29 0a 20 20 20 20 20 20  of(old.c).      
3060: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
3070: 49 4e 54 4f 20 6c 6f 67 20 56 41 4c 55 45 53 28  INTO log VALUES(
3080: 6e 65 77 2e 72 6f 77 69 64 20 7c 7c 20 27 20 27  new.rowid || ' '
3090: 20 7c 7c 20 74 79 70 65 6f 66 28 6e 65 77 2e 72   || typeof(new.r
30a0: 6f 77 69 64 29 20 7c 7c 20 27 20 27 20 7c 7c 0a  owid) || ' ' ||.
30b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 77               new
30d0: 2e 61 20 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c  .a     || ' ' ||
30e0: 20 74 79 70 65 6f 66 28 6e 65 77 2e 61 29 20 20   typeof(new.a)  
30f0: 20 20 20 7c 7c 20 27 20 27 20 7c 7c 0a 20 20 20     || ' ' ||.   
3100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3110: 20 20 20 20 20 20 20 20 20 20 6e 65 77 2e 62 20            new.b 
3120: 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c 20 74 79      || ' ' || ty
3130: 70 65 6f 66 28 6e 65 77 2e 62 29 20 20 20 20 20  peof(new.b)     
3140: 7c 7c 20 27 20 27 20 7c 7c 0a 20 20 20 20 20 20  || ' ' ||.      
3150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3160: 20 20 20 20 20 20 20 6e 65 77 2e 63 20 20 20 20         new.c    
3170: 20 7c 7c 20 27 20 27 20 7c 7c 20 74 79 70 65 6f   || ' ' || typeo
3180: 66 28 6e 65 77 2e 63 29 0a 20 20 20 20 20 20 29  f(new.c).      )
3190: 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 20 20 43  ;.    END;.    C
31a0: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74 34  REATE TRIGGER t4
31b0: 61 75 20 41 46 54 45 52 20 55 50 44 41 54 45 20  au AFTER UPDATE 
31c0: 4f 4e 20 74 34 20 42 45 47 49 4e 0a 20 20 20 20  ON t4 BEGIN.    
31d0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c 6f    INSERT INTO lo
31e0: 67 20 56 41 4c 55 45 53 28 6f 6c 64 2e 72 6f 77  g VALUES(old.row
31f0: 69 64 20 7c 7c 20 27 20 27 20 7c 7c 20 74 79 70  id || ' ' || typ
3200: 65 6f 66 28 6f 6c 64 2e 72 6f 77 69 64 29 20 7c  eof(old.rowid) |
3210: 7c 20 27 20 27 20 7c 7c 0a 20 20 20 20 20 20 20  | ' ' ||.       
3220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3230: 20 20 20 20 20 20 6f 6c 64 2e 61 20 20 20 20 20        old.a     
3240: 7c 7c 20 27 20 27 20 7c 7c 20 74 79 70 65 6f 66  || ' ' || typeof
3250: 28 6f 6c 64 2e 61 29 20 20 20 20 20 7c 7c 20 27  (old.a)     || '
3260: 20 27 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20   ' ||.          
3270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3280: 20 20 20 6f 6c 64 2e 62 20 20 20 20 20 7c 7c 20     old.b     || 
3290: 27 20 27 20 7c 7c 20 74 79 70 65 6f 66 28 6f 6c  ' ' || typeof(ol
32a0: 64 2e 62 29 20 20 20 20 20 7c 7c 20 27 20 27 20  d.b)     || ' ' 
32b0: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ||.             
32c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32d0: 6f 6c 64 2e 63 20 20 20 20 20 7c 7c 20 27 20 27  old.c     || ' '
32e0: 20 7c 7c 20 74 79 70 65 6f 66 28 6f 6c 64 2e 63   || typeof(old.c
32f0: 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  ).      );.     
3300: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c 6f 67   INSERT INTO log
3310: 20 56 41 4c 55 45 53 28 6e 65 77 2e 72 6f 77 69   VALUES(new.rowi
3320: 64 20 7c 7c 20 27 20 27 20 7c 7c 20 74 79 70 65  d || ' ' || type
3330: 6f 66 28 6e 65 77 2e 72 6f 77 69 64 29 20 7c 7c  of(new.rowid) ||
3340: 20 27 20 27 20 7c 7c 0a 20 20 20 20 20 20 20 20   ' ' ||.        
3350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3360: 20 20 20 20 20 6e 65 77 2e 61 20 20 20 20 20 7c       new.a     |
3370: 7c 20 27 20 27 20 7c 7c 20 74 79 70 65 6f 66 28  | ' ' || typeof(
3380: 6e 65 77 2e 61 29 20 20 20 20 20 7c 7c 20 27 20  new.a)     || ' 
3390: 27 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  ' ||.           
33a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b0: 20 20 6e 65 77 2e 62 20 20 20 20 20 7c 7c 20 27    new.b     || '
33c0: 20 27 20 7c 7c 20 74 79 70 65 6f 66 28 6e 65 77   ' || typeof(new
33d0: 2e 62 29 20 20 20 20 20 7c 7c 20 27 20 27 20 7c  .b)     || ' ' |
33e0: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
33f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
3400: 65 77 2e 63 20 20 20 20 20 7c 7c 20 27 20 27 20  ew.c     || ' ' 
3410: 7c 7c 20 74 79 70 65 6f 66 28 6e 65 77 2e 63 29  || typeof(new.c)
3420: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 45 4e  .      );.    EN
3430: 44 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 66 6f 72 65  D;.  }.} {}.fore
3440: 61 63 68 20 7b 6e 20 69 6e 73 65 72 74 20 6c 6f  ach {n insert lo
3450: 67 7d 20 7b 0a 0a 20 20 32 20 7b 20 0a 20 20 20  g} {..  2 { .   
3460: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56  INSERT INTO t4 V
3470: 41 4c 55 45 53 28 27 31 27 2c 20 27 31 27 2c 20  ALUES('1', '1', 
3480: 27 31 27 29 3b 0a 20 20 20 44 45 4c 45 54 45 20  '1');.   DELETE 
3490: 46 52 4f 4d 20 74 34 3b 0a 20 20 7d 20 7b 0a 20  FROM t4;.  } {. 
34a0: 20 20 20 2d 31 20 69 6e 74 65 67 65 72 20 31 20     -1 integer 1 
34b0: 74 65 78 74 20 31 20 69 6e 74 65 67 65 72 20 31  text 1 integer 1
34c0: 2e 30 20 72 65 61 6c 20 0a 20 20 20 20 20 31 20  .0 real .     1 
34d0: 69 6e 74 65 67 65 72 20 31 20 74 65 78 74 20 31  integer 1 text 1
34e0: 20 69 6e 74 65 67 65 72 20 31 2e 30 20 72 65 61   integer 1.0 rea
34f0: 6c 0a 20 20 20 20 20 31 20 69 6e 74 65 67 65 72  l.     1 integer
3500: 20 31 20 74 65 78 74 20 31 20 69 6e 74 65 67 65   1 text 1 intege
3510: 72 20 31 2e 30 20 72 65 61 6c 20 0a 20 20 20 20  r 1.0 real .    
3520: 20 31 20 69 6e 74 65 67 65 72 20 31 20 74 65 78   1 integer 1 tex
3530: 74 20 31 20 69 6e 74 65 67 65 72 20 31 2e 30 20  t 1 integer 1.0 
3540: 72 65 61 6c 0a 20 20 7d 0a 0a 20 20 33 20 7b 20  real.  }..  3 { 
3550: 0a 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  .   INSERT INTO 
3560: 74 34 28 72 6f 77 69 64 2c 61 2c 62 2c 63 29 20  t4(rowid,a,b,c) 
3570: 56 41 4c 55 45 53 28 34 35 2c 20 34 35 2c 20 34  VALUES(45, 45, 4
3580: 35 2c 20 34 35 29 3b 0a 20 20 20 44 45 4c 45 54  5, 45);.   DELET
3590: 45 20 46 52 4f 4d 20 74 34 3b 0a 20 20 7d 20 7b  E FROM t4;.  } {
35a0: 0a 20 20 20 20 34 35 20 69 6e 74 65 67 65 72 20  .    45 integer 
35b0: 34 35 20 74 65 78 74 20 34 35 20 69 6e 74 65 67  45 text 45 integ
35c0: 65 72 20 34 35 2e 30 20 72 65 61 6c 0a 20 20 20  er 45.0 real.   
35d0: 20 34 35 20 69 6e 74 65 67 65 72 20 34 35 20 74   45 integer 45 t
35e0: 65 78 74 20 34 35 20 69 6e 74 65 67 65 72 20 34  ext 45 integer 4
35f0: 35 2e 30 20 72 65 61 6c 0a 20 20 20 20 34 35 20  5.0 real.    45 
3600: 69 6e 74 65 67 65 72 20 34 35 20 74 65 78 74 20  integer 45 text 
3610: 34 35 20 69 6e 74 65 67 65 72 20 34 35 2e 30 20  45 integer 45.0 
3620: 72 65 61 6c 0a 20 20 20 20 34 35 20 69 6e 74 65  real.    45 inte
3630: 67 65 72 20 34 35 20 74 65 78 74 20 34 35 20 69  ger 45 text 45 i
3640: 6e 74 65 67 65 72 20 34 35 2e 30 20 72 65 61 6c  nteger 45.0 real
3650: 0a 20 20 7d 0a 0a 20 20 34 20 7b 20 0a 20 20 20  .  }..  4 { .   
3660: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 28 72  INSERT INTO t4(r
3670: 6f 77 69 64 2c 61 2c 62 2c 63 29 20 56 41 4c 55  owid,a,b,c) VALU
3680: 45 53 28 2d 34 32 2e 30 2c 20 2d 34 32 2e 30 2c  ES(-42.0, -42.0,
3690: 20 2d 34 32 2e 30 2c 20 2d 34 32 2e 30 29 3b 0a   -42.0, -42.0);.
36a0: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
36b0: 34 3b 0a 20 20 7d 20 7b 0a 20 20 20 20 2d 34 32  4;.  } {.    -42
36c0: 20 69 6e 74 65 67 65 72 20 2d 34 32 2e 30 20 74   integer -42.0 t
36d0: 65 78 74 20 2d 34 32 20 69 6e 74 65 67 65 72 20  ext -42 integer 
36e0: 2d 34 32 2e 30 20 72 65 61 6c 20 0a 20 20 20 20  -42.0 real .    
36f0: 2d 34 32 20 69 6e 74 65 67 65 72 20 2d 34 32 2e  -42 integer -42.
3700: 30 20 74 65 78 74 20 2d 34 32 20 69 6e 74 65 67  0 text -42 integ
3710: 65 72 20 2d 34 32 2e 30 20 72 65 61 6c 0a 20 20  er -42.0 real.  
3720: 20 20 2d 34 32 20 69 6e 74 65 67 65 72 20 2d 34    -42 integer -4
3730: 32 2e 30 20 74 65 78 74 20 2d 34 32 20 69 6e 74  2.0 text -42 int
3740: 65 67 65 72 20 2d 34 32 2e 30 20 72 65 61 6c 20  eger -42.0 real 
3750: 0a 20 20 20 20 2d 34 32 20 69 6e 74 65 67 65 72  .    -42 integer
3760: 20 2d 34 32 2e 30 20 74 65 78 74 20 2d 34 32 20   -42.0 text -42 
3770: 69 6e 74 65 67 65 72 20 2d 34 32 2e 30 20 72 65  integer -42.0 re
3780: 61 6c 0a 20 20 7d 0a 0a 20 20 35 20 7b 20 0a 20  al.  }..  5 { . 
3790: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34    INSERT INTO t4
37a0: 28 72 6f 77 69 64 2c 61 2c 62 2c 63 29 20 56 41  (rowid,a,b,c) VA
37b0: 4c 55 45 53 28 4e 55 4c 4c 2c 20 2d 34 32 2e 34  LUES(NULL, -42.4
37c0: 2c 20 2d 34 32 2e 34 2c 20 2d 34 32 2e 34 29 3b  , -42.4, -42.4);
37d0: 0a 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  .   DELETE FROM 
37e0: 74 34 3b 0a 20 20 7d 20 7b 0a 20 20 20 20 2d 31  t4;.  } {.    -1
37f0: 20 69 6e 74 65 67 65 72 20 2d 34 32 2e 34 20 74   integer -42.4 t
3800: 65 78 74 20 2d 34 32 2e 34 20 72 65 61 6c 20 2d  ext -42.4 real -
3810: 34 32 2e 34 20 72 65 61 6c 0a 20 20 20 20 20 31  42.4 real.     1
3820: 20 69 6e 74 65 67 65 72 20 2d 34 32 2e 34 20 74   integer -42.4 t
3830: 65 78 74 20 2d 34 32 2e 34 20 72 65 61 6c 20 2d  ext -42.4 real -
3840: 34 32 2e 34 20 72 65 61 6c 0a 20 20 20 20 20 31  42.4 real.     1
3850: 20 69 6e 74 65 67 65 72 20 2d 34 32 2e 34 20 74   integer -42.4 t
3860: 65 78 74 20 2d 34 32 2e 34 20 72 65 61 6c 20 2d  ext -42.4 real -
3870: 34 32 2e 34 20 72 65 61 6c 0a 20 20 20 20 20 31  42.4 real.     1
3880: 20 69 6e 74 65 67 65 72 20 2d 34 32 2e 34 20 74   integer -42.4 t
3890: 65 78 74 20 2d 34 32 2e 34 20 72 65 61 6c 20 2d  ext -42.4 real -
38a0: 34 32 2e 34 20 72 65 61 6c 0a 20 20 7d 0a 0a 20  42.4 real.  }.. 
38b0: 20 36 20 7b 20 0a 20 20 20 49 4e 53 45 52 54 20   6 { .   INSERT 
38c0: 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 37  INTO t4 VALUES(7
38d0: 2c 20 37 2c 20 37 29 3b 0a 20 20 20 55 50 44 41  , 7, 7);.   UPDA
38e0: 54 45 20 74 34 20 53 45 54 20 61 3d 38 2c 20 62  TE t4 SET a=8, b
38f0: 3d 38 2c 20 63 3d 38 3b 0a 20 20 7d 20 7b 0a 20  =8, c=8;.  } {. 
3900: 20 20 20 2d 31 20 69 6e 74 65 67 65 72 20 37 20     -1 integer 7 
3910: 74 65 78 74 20 37 20 69 6e 74 65 67 65 72 20 37  text 7 integer 7
3920: 2e 30 20 72 65 61 6c 0a 20 20 20 20 20 31 20 69  .0 real.     1 i
3930: 6e 74 65 67 65 72 20 37 20 74 65 78 74 20 37 20  nteger 7 text 7 
3940: 69 6e 74 65 67 65 72 20 37 2e 30 20 72 65 61 6c  integer 7.0 real
3950: 0a 20 20 20 20 20 31 20 69 6e 74 65 67 65 72 20  .     1 integer 
3960: 37 20 74 65 78 74 20 37 20 69 6e 74 65 67 65 72  7 text 7 integer
3970: 20 37 2e 30 20 72 65 61 6c 0a 20 20 20 20 20 31   7.0 real.     1
3980: 20 69 6e 74 65 67 65 72 20 38 20 74 65 78 74 20   integer 8 text 
3990: 38 20 69 6e 74 65 67 65 72 20 38 2e 30 20 72 65  8 integer 8.0 re
39a0: 61 6c 0a 20 20 20 20 20 31 20 69 6e 74 65 67 65  al.     1 intege
39b0: 72 20 37 20 74 65 78 74 20 37 20 69 6e 74 65 67  r 7 text 7 integ
39c0: 65 72 20 37 2e 30 20 72 65 61 6c 0a 20 20 20 20  er 7.0 real.    
39d0: 20 31 20 69 6e 74 65 67 65 72 20 38 20 74 65 78   1 integer 8 tex
39e0: 74 20 38 20 69 6e 74 65 67 65 72 20 38 2e 30 20  t 8 integer 8.0 
39f0: 72 65 61 6c 0a 20 20 7d 0a 0a 20 20 37 20 7b 20  real.  }..  7 { 
3a00: 0a 20 20 20 55 50 44 41 54 45 20 74 34 20 53 45  .   UPDATE t4 SE
3a10: 54 20 72 6f 77 69 64 3d 32 3b 0a 20 20 7d 20 7b  T rowid=2;.  } {
3a20: 0a 20 20 20 20 20 31 20 69 6e 74 65 67 65 72 20  .     1 integer 
3a30: 38 20 74 65 78 74 20 38 20 69 6e 74 65 67 65 72  8 text 8 integer
3a40: 20 38 2e 30 20 72 65 61 6c 0a 20 20 20 20 20 32   8.0 real.     2
3a50: 20 69 6e 74 65 67 65 72 20 38 20 74 65 78 74 20   integer 8 text 
3a60: 38 20 69 6e 74 65 67 65 72 20 38 2e 30 20 72 65  8 integer 8.0 re
3a70: 61 6c 0a 20 20 20 20 20 31 20 69 6e 74 65 67 65  al.     1 intege
3a80: 72 20 38 20 74 65 78 74 20 38 20 69 6e 74 65 67  r 8 text 8 integ
3a90: 65 72 20 38 2e 30 20 72 65 61 6c 0a 20 20 20 20  er 8.0 real.    
3aa0: 20 32 20 69 6e 74 65 67 65 72 20 38 20 74 65 78   2 integer 8 tex
3ab0: 74 20 38 20 69 6e 74 65 67 65 72 20 38 2e 30 20  t 8 integer 8.0 
3ac0: 72 65 61 6c 0a 20 20 7d 0a 0a 20 20 38 20 7b 20  real.  }..  8 { 
3ad0: 0a 20 20 20 55 50 44 41 54 45 20 74 34 20 53 45  .   UPDATE t4 SE
3ae0: 54 20 61 3d 27 39 27 2c 20 62 3d 27 39 27 2c 20  T a='9', b='9', 
3af0: 63 3d 27 39 27 3b 0a 20 20 7d 20 7b 0a 20 20 20  c='9';.  } {.   
3b00: 20 20 32 20 69 6e 74 65 67 65 72 20 38 20 74 65    2 integer 8 te
3b10: 78 74 20 38 20 69 6e 74 65 67 65 72 20 38 2e 30  xt 8 integer 8.0
3b20: 20 72 65 61 6c 0a 20 20 20 20 20 32 20 69 6e 74   real.     2 int
3b30: 65 67 65 72 20 39 20 74 65 78 74 20 39 20 69 6e  eger 9 text 9 in
3b40: 74 65 67 65 72 20 39 2e 30 20 72 65 61 6c 0a 20  teger 9.0 real. 
3b50: 20 20 20 20 32 20 69 6e 74 65 67 65 72 20 38 20      2 integer 8 
3b60: 74 65 78 74 20 38 20 69 6e 74 65 67 65 72 20 38  text 8 integer 8
3b70: 2e 30 20 72 65 61 6c 0a 20 20 20 20 20 32 20 69  .0 real.     2 i
3b80: 6e 74 65 67 65 72 20 39 20 74 65 78 74 20 39 20  nteger 9 text 9 
3b90: 69 6e 74 65 67 65 72 20 39 2e 30 20 72 65 61 6c  integer 9.0 real
3ba0: 0a 20 20 7d 0a 0a 20 20 39 20 7b 20 0a 20 20 20  .  }..  9 { .   
3bb0: 55 50 44 41 54 45 20 74 34 20 53 45 54 20 61 3d  UPDATE t4 SET a=
3bc0: 27 39 2e 31 27 2c 20 62 3d 27 39 2e 31 27 2c 20  '9.1', b='9.1', 
3bd0: 63 3d 27 39 2e 31 27 3b 0a 20 20 7d 20 7b 0a 20  c='9.1';.  } {. 
3be0: 20 20 20 20 32 20 69 6e 74 65 67 65 72 20 39 20      2 integer 9 
3bf0: 20 20 74 65 78 74 20 39 20 20 20 69 6e 74 65 67    text 9   integ
3c00: 65 72 20 39 2e 30 20 72 65 61 6c 0a 20 20 20 20  er 9.0 real.    
3c10: 20 32 20 69 6e 74 65 67 65 72 20 39 2e 31 20 74   2 integer 9.1 t
3c20: 65 78 74 20 39 2e 31 20 72 65 61 6c 20 20 20 20  ext 9.1 real    
3c30: 39 2e 31 20 72 65 61 6c 0a 20 20 20 20 20 32 20  9.1 real.     2 
3c40: 69 6e 74 65 67 65 72 20 39 20 20 20 74 65 78 74  integer 9   text
3c50: 20 39 20 20 20 69 6e 74 65 67 65 72 20 39 2e 30   9   integer 9.0
3c60: 20 72 65 61 6c 0a 20 20 20 20 20 32 20 69 6e 74   real.     2 int
3c70: 65 67 65 72 20 39 2e 31 20 74 65 78 74 20 39 2e  eger 9.1 text 9.
3c80: 31 20 72 65 61 6c 20 20 20 20 39 2e 31 20 72 65  1 real    9.1 re
3c90: 61 6c 0a 20 20 7d 0a 7d 20 7b 0a 20 20 64 6f 5f  al.  }.} {.  do_
3ca0: 74 65 73 74 20 74 72 69 67 67 65 72 43 2d 34 2e  test triggerC-4.
3cb0: 31 2e 24 6e 20 7b 0a 20 20 20 20 65 76 61 6c 20  1.$n {.    eval 
3cc0: 63 6f 6e 63 61 74 20 5b 65 78 65 63 73 71 6c 20  concat [execsql 
3cd0: 22 20 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20  " .      DELETE 
3ce0: 46 52 4f 4d 20 6c 6f 67 3b 0a 20 20 20 20 20 20  FROM log;.      
3cf0: 24 69 6e 73 65 72 74 20 3b 20 0a 20 20 20 20 20  $insert ; .     
3d00: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6c   SELECT * FROM l
3d10: 6f 67 3b 0a 20 20 20 20 22 5d 0a 20 20 7d 20 5b  og;.    "].  } [
3d20: 6a 6f 69 6e 20 24 6c 6f 67 20 22 20 22 5d 0a 7d  join $log " "].}
3d30: 20 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a      ..finish_test.