/ Hex Artifact Content
Login

Artifact 302d8995f5ffe63bbc15053abb3ef7a39cf5a092:


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 73 65 74 20 74 65 73 74  ter.tcl.set test
01b0: 70 72 65 66 69 78 20 74 72 69 67 67 65 72 43 0a  prefix triggerC.
01c0: 69 66 63 61 70 61 62 6c 65 20 7b 21 74 72 69 67  ifcapable {!trig
01d0: 67 65 72 7d 20 7b 0a 20 20 66 69 6e 69 73 68 5f  ger} {.  finish_
01e0: 74 65 73 74 0a 20 20 72 65 74 75 72 6e 0a 7d 0a  test.  return.}.
01f0: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
0200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
0240: 73 74 20 6f 72 67 61 6e 69 7a 61 74 69 6f 6e 3a  st organization:
0250: 0a 23 0a 23 20 74 72 69 67 67 65 72 43 2d 31 2e  .#.# triggerC-1.
0260: 2a 3a 20 48 61 70 68 61 7a 61 72 64 6c 79 20 64  *: Haphazardly d
0270: 65 73 69 67 6e 65 64 20 74 72 69 67 67 65 72 20  esigned trigger 
0280: 72 65 6c 61 74 65 64 20 74 65 73 74 73 20 74 68  related tests th
0290: 61 74 20 77 65 72 65 20 75 73 65 66 75 6c 0a 23  at were useful.#
02a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
02b0: 75 72 69 6e 67 20 61 6e 20 75 70 67 72 61 64 65  uring an upgrade
02c0: 20 6f 66 20 74 68 65 20 74 72 69 67 67 65 72 73   of the triggers
02d0: 20 73 75 62 2d 73 79 73 74 65 6d 2e 0a 23 20 0a   sub-system..# .
02e0: 23 20 74 72 69 67 67 65 72 43 2d 32 2e 2a 3a 0a  # triggerC-2.*:.
02f0: 23 0a 23 20 74 72 69 67 67 65 72 43 2d 33 2e 2a  #.# triggerC-3.*
0300: 3a 0a 23 0a 23 20 74 72 69 67 67 65 72 43 2d 34  :.#.# triggerC-4
0310: 2e 2a 3a 0a 23 0a 23 20 74 72 69 67 67 65 72 43  .*:.#.# triggerC
0320: 2d 35 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20  -5.*: Test that 
0330: 77 68 65 6e 20 72 65 63 75 72 73 69 76 65 20 74  when recursive t
0340: 72 69 67 67 65 72 73 20 61 72 65 20 65 6e 61 62  riggers are enab
0350: 6c 65 64 20 44 45 4c 45 54 45 20 0a 23 20 20 20  led DELETE .#   
0360: 20 20 20 20 20 20 20 20 20 20 20 20 74 72 69 67              trig
0370: 67 65 72 73 20 61 72 65 20 66 69 72 65 64 20 77  gers are fired w
0380: 68 65 6e 20 72 6f 77 73 20 61 72 65 20 64 65 6c  hen rows are del
0390: 65 74 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  eted as part of 
03a0: 4f 52 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  OR.#            
03b0: 20 20 20 52 45 50 4c 41 43 45 20 63 6f 6e 66 6c     REPLACE confl
03c0: 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 20  ict resolution. 
03d0: 41 6e 64 20 74 68 61 74 20 74 68 65 79 20 61 72  And that they ar
03e0: 65 20 6e 6f 74 20 66 69 72 65 64 0a 23 20 20 20  e not fired.#   
03f0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 72              if r
0400: 65 63 75 72 73 69 76 65 20 74 72 69 67 67 65 72  ecursive trigger
0410: 73 20 61 72 65 20 6e 6f 74 20 65 6e 61 62 6c 65  s are not enable
0420: 64 2e 0a 23 0a 23 20 74 72 69 67 67 65 72 43 2d  d..#.# triggerC-
0430: 36 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20 74  6.*: Test that t
0440: 68 65 20 72 65 63 75 72 73 69 76 65 5f 74 72 69  he recursive_tri
0450: 67 67 65 72 73 20 70 72 61 67 6d 61 20 72 65 74  ggers pragma ret
0460: 75 72 6e 73 20 63 6f 72 72 65 63 74 0a 23 20 20  urns correct.#  
0470: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73               res
0480: 75 6c 74 73 20 77 68 65 6e 20 69 6e 76 6f 6b 65  ults when invoke
0490: 64 20 77 69 74 68 6f 75 74 20 61 6e 20 61 72 67  d without an arg
04a0: 75 6d 65 6e 74 2e 0a 23 0a 0a 23 20 45 6e 61 62  ument..#..# Enab
04b0: 6c 65 20 72 65 63 75 72 73 69 76 65 20 74 72 69  le recursive tri
04c0: 67 67 65 72 73 20 66 6f 72 20 74 68 69 73 20 66  ggers for this f
04d0: 69 6c 65 2e 0a 23 0a 65 78 65 63 73 71 6c 20 7b  ile..#.execsql {
04e0: 20 50 52 41 47 4d 41 20 72 65 63 75 72 73 69 76   PRAGMA recursiv
04f0: 65 5f 74 72 69 67 67 65 72 73 20 3d 20 6f 6e 20  e_triggers = on 
0500: 7d 0a 0a 23 73 71 6c 69 74 65 33 5f 64 62 5f 63  }..#sqlite3_db_c
0510: 6f 6e 66 69 67 5f 6c 6f 6f 6b 61 73 69 64 65 20  onfig_lookaside 
0520: 64 62 20 30 20 30 20 30 0a 0a 23 2d 2d 2d 2d 2d  db 0 0 0..#-----
0530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0570: 2d 2d 2d 2d 0a 23 20 54 68 69 73 20 62 6c 6f 63  ----.# This bloc
0580: 6b 20 6f 66 20 74 65 73 74 73 2c 20 74 72 69 67  k of tests, trig
0590: 67 65 72 43 2d 31 2e 2a 2c 20 61 72 65 20 6e 6f  gerC-1.*, are no
05a0: 74 20 61 69 6d 65 64 20 61 74 20 61 6e 79 20 73  t aimed at any s
05b0: 70 65 63 69 66 69 63 0a 23 20 70 72 6f 70 65 72  pecific.# proper
05c0: 74 79 20 6f 66 20 74 68 65 20 74 72 69 67 67 65  ty of the trigge
05d0: 72 73 20 73 75 62 2d 73 79 73 74 65 6d 2e 20 54  rs sub-system. T
05e0: 68 65 79 20 77 65 72 65 20 63 72 65 61 74 65 64  hey were created
05f0: 20 74 6f 20 64 65 62 75 67 0a 23 20 73 70 65 63   to debug.# spec
0600: 69 66 69 63 20 70 72 6f 62 6c 65 6d 73 20 77 68  ific problems wh
0610: 69 6c 65 20 6d 6f 64 69 66 79 69 6e 67 20 53 51  ile modifying SQ
0620: 4c 69 74 65 20 74 6f 20 73 75 70 70 6f 72 74 20  Lite to support 
0630: 72 65 63 75 72 73 69 76 65 0a 23 20 74 72 69 67  recursive.# trig
0640: 67 65 72 73 2e 20 54 68 65 79 20 61 72 65 20 6c  gers. They are l
0650: 65 66 74 20 68 65 72 65 20 69 6e 20 63 61 73 65  eft here in case
0660: 20 74 68 65 79 20 63 61 6e 20 68 65 6c 70 20 64   they can help d
0670: 65 62 75 67 20 74 68 65 0a 23 20 73 61 6d 65 20  ebug the.# same 
0680: 70 72 6f 62 6c 65 6d 73 20 61 67 61 69 6e 2e 0a  problems again..
0690: 23 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65  #.do_test trigge
06a0: 72 43 2d 31 2e 31 20 7b 0a 20 20 65 78 65 63 73  rC-1.1 {.  execs
06b0: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
06c0: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 63  TABLE t1(a, b, c
06d0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
06e0: 42 4c 45 20 6c 6f 67 28 74 2c 20 61 31 2c 20 62  BLE log(t, a1, b
06f0: 31 2c 20 63 31 2c 20 61 32 2c 20 62 32 2c 20 63  1, c1, a2, b2, c
0700: 32 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  2);.    CREATE T
0710: 52 49 47 47 45 52 20 74 72 69 67 31 20 42 45 46  RIGGER trig1 BEF
0720: 4f 52 45 20 49 4e 53 45 52 54 20 4f 4e 20 74 31  ORE INSERT ON t1
0730: 20 42 45 47 49 4e 0a 20 20 20 20 20 20 49 4e 53   BEGIN.      INS
0740: 45 52 54 20 49 4e 54 4f 20 6c 6f 67 20 56 41 4c  ERT INTO log VAL
0750: 55 45 53 28 27 62 65 66 6f 72 65 27 2c 20 4e 55  UES('before', NU
0760: 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  LL, NULL, NULL, 
0770: 6e 65 77 2e 61 2c 20 6e 65 77 2e 62 2c 20 6e 65  new.a, new.b, ne
0780: 77 2e 63 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20  w.c);.    END;. 
0790: 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45     CREATE TRIGGE
07a0: 52 20 74 72 69 67 32 20 41 46 54 45 52 20 49 4e  R trig2 AFTER IN
07b0: 53 45 52 54 20 4f 4e 20 74 31 20 42 45 47 49 4e  SERT ON t1 BEGIN
07c0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
07d0: 54 4f 20 6c 6f 67 20 56 41 4c 55 45 53 28 27 61  TO log VALUES('a
07e0: 66 74 65 72 27 2c 20 4e 55 4c 4c 2c 20 4e 55 4c  fter', NULL, NUL
07f0: 4c 2c 20 4e 55 4c 4c 2c 20 6e 65 77 2e 61 2c 20  L, NULL, new.a, 
0800: 6e 65 77 2e 62 2c 20 6e 65 77 2e 63 29 3b 0a 20  new.b, new.c);. 
0810: 20 20 20 45 4e 44 3b 0a 20 20 20 20 43 52 45 41     END;.    CREA
0820: 54 45 20 54 52 49 47 47 45 52 20 74 72 69 67 33  TE TRIGGER trig3
0830: 20 42 45 46 4f 52 45 20 55 50 44 41 54 45 20 4f   BEFORE UPDATE O
0840: 4e 20 74 31 20 42 45 47 49 4e 0a 20 20 20 20 20  N t1 BEGIN.     
0850: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c 6f 67   INSERT INTO log
0860: 20 56 41 4c 55 45 53 28 27 62 65 66 6f 72 65 27   VALUES('before'
0870: 2c 20 6f 6c 64 2e 61 2c 6f 6c 64 2e 62 2c 6f 6c  , old.a,old.b,ol
0880: 64 2e 63 2c 20 6e 65 77 2e 61 2c 6e 65 77 2e 62  d.c, new.a,new.b
0890: 2c 6e 65 77 2e 63 29 3b 0a 20 20 20 20 45 4e 44  ,new.c);.    END
08a0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49  ;.    CREATE TRI
08b0: 47 47 45 52 20 74 72 69 67 34 20 41 46 54 45 52  GGER trig4 AFTER
08c0: 20 55 50 44 41 54 45 20 4f 4e 20 74 31 20 42 45   UPDATE ON t1 BE
08d0: 47 49 4e 0a 20 20 20 20 20 20 49 4e 53 45 52 54  GIN.      INSERT
08e0: 20 49 4e 54 4f 20 6c 6f 67 20 56 41 4c 55 45 53   INTO log VALUES
08f0: 28 27 61 66 74 65 72 27 2c 20 6f 6c 64 2e 61 2c  ('after', old.a,
0900: 6f 6c 64 2e 62 2c 6f 6c 64 2e 63 2c 20 6e 65 77  old.b,old.c, new
0910: 2e 61 2c 6e 65 77 2e 62 2c 6e 65 77 2e 63 29 3b  .a,new.b,new.c);
0920: 0a 20 20 20 20 45 4e 44 3b 0a 0a 20 20 20 20 43  .    END;..    C
0930: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74 72  REATE TRIGGER tr
0940: 69 67 35 20 42 45 46 4f 52 45 20 44 45 4c 45 54  ig5 BEFORE DELET
0950: 45 20 4f 4e 20 74 31 20 42 45 47 49 4e 0a 20 20  E ON t1 BEGIN.  
0960: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0970: 6c 6f 67 20 56 41 4c 55 45 53 28 27 62 65 66 6f  log VALUES('befo
0980: 72 65 27 2c 20 6f 6c 64 2e 61 2c 6f 6c 64 2e 62  re', old.a,old.b
0990: 2c 6f 6c 64 2e 63 2c 20 4e 55 4c 4c 2c 4e 55 4c  ,old.c, NULL,NUL
09a0: 4c 2c 4e 55 4c 4c 29 3b 0a 20 20 20 20 45 4e 44  L,NULL);.    END
09b0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49  ;.    CREATE TRI
09c0: 47 47 45 52 20 74 72 69 67 36 20 41 46 54 45 52  GGER trig6 AFTER
09d0: 20 44 45 4c 45 54 45 20 4f 4e 20 74 31 20 42 45   DELETE ON t1 BE
09e0: 47 49 4e 0a 20 20 20 20 20 20 49 4e 53 45 52 54  GIN.      INSERT
09f0: 20 49 4e 54 4f 20 6c 6f 67 20 56 41 4c 55 45 53   INTO log VALUES
0a00: 28 27 61 66 74 65 72 27 2c 20 6f 6c 64 2e 61 2c  ('after', old.a,
0a10: 6f 6c 64 2e 62 2c 6f 6c 64 2e 63 2c 20 4e 55 4c  old.b,old.c, NUL
0a20: 4c 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 20 20  L,NULL,NULL);.  
0a30: 20 20 45 4e 44 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a    END;.  }.} {}.
0a40: 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 43  do_test triggerC
0a50: 2d 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  -1.2 {.  execsql
0a60: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
0a70: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 41 27  TO t1 VALUES('A'
0a80: 2c 20 27 42 27 2c 20 27 43 27 29 3b 0a 20 20 20  , 'B', 'C');.   
0a90: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6c   SELECT * FROM l
0aa0: 6f 67 3b 0a 20 20 7d 0a 7d 20 7b 62 65 66 6f 72  og;.  }.} {befor
0ab0: 65 20 7b 7d 20 7b 7d 20 7b 7d 20 41 20 42 20 43  e {} {} {} A B C
0ac0: 20 61 66 74 65 72 20 7b 7d 20 7b 7d 20 7b 7d 20   after {} {} {} 
0ad0: 41 20 42 20 43 7d 0a 64 6f 5f 74 65 73 74 20 74  A B C}.do_test t
0ae0: 72 69 67 67 65 72 43 2d 31 2e 33 20 7b 0a 20 20  riggerC-1.3 {.  
0af0: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
0b00: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b   * FROM t1 }.} {
0b10: 41 20 42 20 43 7d 0a 64 6f 5f 74 65 73 74 20 74  A B C}.do_test t
0b20: 72 69 67 67 65 72 43 2d 31 2e 34 20 7b 0a 20 20  riggerC-1.4 {.  
0b30: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45  execsql {.    DE
0b40: 4c 45 54 45 20 46 52 4f 4d 20 6c 6f 67 3b 0a 20  LETE FROM log;. 
0b50: 20 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54     UPDATE t1 SET
0b60: 20 61 20 3d 20 27 61 27 3b 0a 20 20 20 20 53 45   a = 'a';.    SE
0b70: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6c 6f 67 3b  LECT * FROM log;
0b80: 0a 20 20 7d 0a 7d 20 7b 62 65 66 6f 72 65 20 41  .  }.} {before A
0b90: 20 42 20 43 20 61 20 42 20 43 20 61 66 74 65 72   B C a B C after
0ba0: 20 41 20 42 20 43 20 61 20 42 20 43 7d 0a 64 6f   A B C a B C}.do
0bb0: 5f 74 65 73 74 20 74 72 69 67 67 65 72 43 2d 31  _test triggerC-1
0bc0: 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .5 {.  execsql {
0bd0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0be0: 31 20 7d 0a 7d 20 7b 61 20 42 20 43 7d 0a 64 6f  1 }.} {a B C}.do
0bf0: 5f 74 65 73 74 20 74 72 69 67 67 65 72 43 2d 31  _test triggerC-1
0c00: 2e 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .6 {.  execsql {
0c10: 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  .    DELETE FROM
0c20: 20 6c 6f 67 3b 0a 20 20 20 20 44 45 4c 45 54 45   log;.    DELETE
0c30: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 53 45   FROM t1;.    SE
0c40: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6c 6f 67 3b  LECT * FROM log;
0c50: 0a 20 20 7d 0a 7d 20 7b 62 65 66 6f 72 65 20 61  .  }.} {before a
0c60: 20 42 20 43 20 7b 7d 20 7b 7d 20 7b 7d 20 61 66   B C {} {} {} af
0c70: 74 65 72 20 61 20 42 20 43 20 7b 7d 20 7b 7d 20  ter a B C {} {} 
0c80: 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67  {}}.do_test trig
0c90: 67 65 72 43 2d 31 2e 37 20 7b 0a 20 20 65 78 65  gerC-1.7 {.  exe
0ca0: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
0cb0: 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 7d 0a 64  FROM t1 }.} {}.d
0cc0: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 43 2d  o_test triggerC-
0cd0: 31 2e 38 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.8 {.  execsql 
0ce0: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
0cf0: 4c 45 20 74 34 28 61 2c 20 62 29 3b 0a 20 20 20  LE t4(a, b);.   
0d00: 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20   CREATE TRIGGER 
0d10: 74 34 74 20 41 46 54 45 52 20 44 45 4c 45 54 45  t4t AFTER DELETE
0d20: 20 4f 4e 20 74 34 20 42 45 47 49 4e 0a 20 20 20   ON t4 BEGIN.   
0d30: 20 20 20 53 45 4c 45 43 54 20 52 41 49 53 45 28     SELECT RAISE(
0d40: 41 42 4f 52 54 2c 20 27 64 65 6c 65 74 65 20 69  ABORT, 'delete i
0d50: 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 27  s not supported'
0d60: 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 7d 0a  );.    END;.  }.
0d70: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69  } {}.do_test tri
0d80: 67 67 65 72 43 2d 31 2e 39 20 7b 0a 20 20 65 78  ggerC-1.9 {.  ex
0d90: 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
0da0: 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 31 2c  NTO t4 VALUES(1,
0db0: 20 32 29 20 7d 0a 20 20 63 61 74 63 68 73 71 6c   2) }.  catchsql
0dc0: 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74   { DELETE FROM t
0dd0: 34 20 7d 0a 7d 20 7b 31 20 7b 64 65 6c 65 74 65  4 }.} {1 {delete
0de0: 20 69 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 65   is not supporte
0df0: 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67  d}}.do_test trig
0e00: 67 65 72 43 2d 31 2e 31 30 20 7b 0a 20 20 65 78  gerC-1.10 {.  ex
0e10: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  ecsql { SELECT *
0e20: 20 46 52 4f 4d 20 74 34 20 7d 0a 7d 20 7b 31 20   FROM t4 }.} {1 
0e30: 32 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67  2}.do_test trigg
0e40: 65 72 43 2d 31 2e 31 31 20 7b 0a 20 20 65 78 65  erC-1.11 {.  exe
0e50: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
0e60: 45 20 54 41 42 4c 45 20 74 35 20 28 61 20 70 72  E TABLE t5 (a pr
0e70: 69 6d 61 72 79 20 6b 65 79 2c 20 62 2c 20 63 29  imary key, b, c)
0e80: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
0e90: 4f 20 74 35 20 76 61 6c 75 65 73 20 28 31 2c 20  O t5 values (1, 
0ea0: 32 2c 20 33 29 3b 0a 20 20 20 20 43 52 45 41 54  2, 3);.    CREAT
0eb0: 45 20 54 52 49 47 47 45 52 20 61 75 5f 74 62 6c  E TRIGGER au_tbl
0ec0: 20 41 46 54 45 52 20 55 50 44 41 54 45 20 4f 4e   AFTER UPDATE ON
0ed0: 20 74 35 20 42 45 47 49 4e 0a 20 20 20 20 20 20   t5 BEGIN.      
0ee0: 55 50 44 41 54 45 20 4f 52 20 49 47 4e 4f 52 45  UPDATE OR IGNORE
0ef0: 20 74 35 20 53 45 54 20 61 20 3d 20 6e 65 77 2e   t5 SET a = new.
0f00: 61 2c 20 63 20 3d 20 31 30 3b 0a 20 20 20 20 45  a, c = 10;.    E
0f10: 4e 44 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  ND;.  }.} {}.do_
0f20: 74 65 73 74 20 74 72 69 67 67 65 72 43 2d 31 2e  test triggerC-1.
0f30: 31 32 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  12 {.  catchsql 
0f40: 7b 20 55 50 44 41 54 45 20 4f 52 20 52 45 50 4c  { UPDATE OR REPL
0f50: 41 43 45 20 74 35 20 53 45 54 20 61 20 3d 20 34  ACE t5 SET a = 4
0f60: 20 57 48 45 52 45 20 61 20 3d 20 31 20 7d 0a 7d   WHERE a = 1 }.}
0f70: 20 7b 31 20 7b 74 6f 6f 20 6d 61 6e 79 20 6c 65   {1 {too many le
0f80: 76 65 6c 73 20 6f 66 20 74 72 69 67 67 65 72 20  vels of trigger 
0f90: 72 65 63 75 72 73 69 6f 6e 7d 7d 0a 64 6f 5f 74  recursion}}.do_t
0fa0: 65 73 74 20 74 72 69 67 67 65 72 43 2d 31 2e 31  est triggerC-1.1
0fb0: 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  3 {.  execsql {.
0fc0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
0fd0: 20 74 36 28 61 20 49 4e 54 45 47 45 52 20 50 52   t6(a INTEGER PR
0fe0: 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20  IMARY KEY, b);. 
0ff0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1000: 36 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a  6 VALUES(1, 2);.
1010: 20 20 20 20 63 72 65 61 74 65 20 74 72 69 67 67      create trigg
1020: 65 72 20 72 31 20 61 66 74 65 72 20 75 70 64 61  er r1 after upda
1030: 74 65 20 6f 6e 20 74 36 20 66 6f 72 20 65 61 63  te on t6 for eac
1040: 68 20 72 6f 77 20 62 65 67 69 6e 0a 20 20 20 20  h row begin.    
1050: 20 20 53 45 4c 45 43 54 20 31 3b 0a 20 20 20 20    SELECT 1;.    
1060: 65 6e 64 3b 0a 20 20 20 20 55 50 44 41 54 45 20  end;.    UPDATE 
1070: 74 36 20 53 45 54 20 61 3d 61 3b 20 0a 20 20 7d  t6 SET a=a; .  }
1080: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 74 72  .} {}.do_test tr
1090: 69 67 67 65 72 43 2d 31 2e 31 34 20 7b 0a 20 20  iggerC-1.14 {.  
10a0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 52  execsql {.    DR
10b0: 4f 50 20 54 41 42 4c 45 20 74 31 3b 0a 20 20 20  OP TABLE t1;.   
10c0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 6e   CREATE TABLE cn
10d0: 74 28 6e 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  t(n);.    INSERT
10e0: 20 49 4e 54 4f 20 63 6e 74 20 56 41 4c 55 45 53   INTO cnt VALUES
10f0: 28 30 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  (0);.    CREATE 
1100: 54 41 42 4c 45 20 74 31 28 61 20 49 4e 54 45 47  TABLE t1(a INTEG
1110: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
1120: 62 20 55 4e 49 51 55 45 2c 20 63 2c 20 64 2c 20  b UNIQUE, c, d, 
1130: 65 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49  e);.    CREATE I
1140: 4e 44 45 58 20 74 31 63 64 20 4f 4e 20 74 31 28  NDEX t1cd ON t1(
1150: 63 2c 64 29 3b 0a 20 20 20 20 43 52 45 41 54 45  c,d);.    CREATE
1160: 20 54 52 49 47 47 45 52 20 74 31 72 31 20 41 46   TRIGGER t1r1 AF
1170: 54 45 52 20 55 50 44 41 54 45 20 4f 4e 20 74 31  TER UPDATE ON t1
1180: 20 42 45 47 49 4e 20 55 50 44 41 54 45 20 63 6e   BEGIN UPDATE cn
1190: 74 20 53 45 54 20 6e 3d 6e 2b 31 3b 20 45 4e 44  t SET n=n+1; END
11a0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
11b0: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 32 2c  O t1 VALUES(1,2,
11c0: 33 2c 34 2c 35 29 3b 0a 20 20 20 20 49 4e 53 45  3,4,5);.    INSE
11d0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
11e0: 53 28 36 2c 37 2c 38 2c 39 2c 31 30 29 3b 0a 20  S(6,7,8,9,10);. 
11f0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1200: 31 20 56 41 4c 55 45 53 28 31 31 2c 31 32 2c 31  1 VALUES(11,12,1
1210: 33 2c 31 34 2c 31 35 29 3b 0a 20 20 7d 0a 7d 20  3,14,15);.  }.} 
1220: 7b 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67  {}.do_test trigg
1230: 65 72 43 2d 31 2e 31 35 20 7b 0a 20 20 63 61 74  erC-1.15 {.  cat
1240: 63 68 73 71 6c 20 7b 20 55 50 44 41 54 45 20 4f  chsql { UPDATE O
1250: 52 20 52 4f 4c 4c 42 41 43 4b 20 74 31 20 53 45  R ROLLBACK t1 SE
1260: 54 20 61 3d 31 30 30 20 7d 0a 7d 20 7b 31 20 7b  T a=100 }.} {1 {
1270: 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
1280: 74 20 66 61 69 6c 65 64 3a 20 74 31 2e 61 7d 7d  t failed: t1.a}}
1290: 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ...#------------
12a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
12e0: 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 74 65  This block of te
12f0: 73 74 73 2c 20 74 72 69 67 67 65 72 43 2d 32 2e  sts, triggerC-2.
1300: 2a 2c 20 74 65 73 74 73 20 74 68 61 74 20 72 65  *, tests that re
1310: 63 75 72 73 69 76 65 20 74 72 69 67 67 65 72 0a  cursive trigger.
1320: 23 20 70 72 6f 67 72 61 6d 73 20 28 74 72 69 67  # programs (trig
1330: 67 65 72 73 20 74 68 61 74 20 66 69 72 65 20 74  gers that fire t
1340: 68 65 6d 73 65 6c 76 65 73 29 20 77 6f 72 6b 2e  hemselves) work.
1350: 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63 61 6c   More specifical
1360: 6c 79 2c 0a 23 20 74 68 69 73 20 62 6c 6f 63 6b  ly,.# this block
1370: 20 66 6f 63 75 73 65 73 20 6f 6e 20 72 65 63 75   focuses on recu
1380: 72 73 69 76 65 20 49 4e 53 45 52 54 20 74 72 69  rsive INSERT tri
1390: 67 67 65 72 73 2e 0a 23 0a 64 6f 5f 74 65 73 74  ggers..#.do_test
13a0: 20 74 72 69 67 67 65 72 43 2d 32 2e 31 2e 30 20   triggerC-2.1.0 
13b0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
13c0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
13d0: 32 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 29  2(a PRIMARY KEY)
13e0: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 66 6f 72 65  ;.  }.} {}..fore
13f0: 61 63 68 20 7b 6e 20 74 64 65 66 6e 20 72 63 7d  ach {n tdefn rc}
1400: 20 7b 0a 20 20 31 20 7b 20 0a 20 20 20 20 43 52   {.  1 { .    CR
1410: 45 41 54 45 20 54 52 49 47 47 45 52 20 74 32 5f  EATE TRIGGER t2_
1420: 74 72 69 67 20 41 46 54 45 52 20 49 4e 53 45 52  trig AFTER INSER
1430: 54 20 4f 4e 20 74 32 20 57 48 45 4e 20 28 6e 65  T ON t2 WHEN (ne
1440: 77 2e 61 3e 30 29 20 42 45 47 49 4e 0a 20 20 20  w.a>0) BEGIN.   
1450: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1460: 32 20 56 41 4c 55 45 53 28 6e 65 77 2e 61 20 2d  2 VALUES(new.a -
1470: 20 31 29 3b 0a 20 20 20 20 45 4e 44 3b 20 0a 20   1);.    END; . 
1480: 20 7d 20 7b 30 20 7b 31 30 20 39 20 38 20 37 20   } {0 {10 9 8 7 
1490: 36 20 35 20 34 20 33 20 32 20 31 20 30 7d 7d 0a  6 5 4 3 2 1 0}}.
14a0: 0a 20 20 32 20 7b 0a 20 20 20 20 43 52 45 41 54  .  2 {.    CREAT
14b0: 45 20 54 52 49 47 47 45 52 20 74 32 5f 74 72 69  E TRIGGER t2_tri
14c0: 67 20 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f  g AFTER INSERT O
14d0: 4e 20 74 32 20 42 45 47 49 4e 0a 20 20 20 20 20  N t2 BEGIN.     
14e0: 20 53 45 4c 45 43 54 20 43 41 53 45 20 57 48 45   SELECT CASE WHE
14f0: 4e 20 6e 65 77 2e 61 3d 3d 32 20 54 48 45 4e 20  N new.a==2 THEN 
1500: 52 41 49 53 45 28 49 47 4e 4f 52 45 29 20 45 4c  RAISE(IGNORE) EL
1510: 53 45 20 4e 55 4c 4c 20 45 4e 44 3b 0a 20 20 20  SE NULL END;.   
1520: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1530: 32 20 56 41 4c 55 45 53 28 6e 65 77 2e 61 20 2d  2 VALUES(new.a -
1540: 20 31 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20   1);.    END;.  
1550: 7d 20 7b 30 20 7b 31 30 20 39 20 38 20 37 20 36  } {0 {10 9 8 7 6
1560: 20 35 20 34 20 33 20 32 7d 7d 0a 0a 20 20 33 20   5 4 3 2}}..  3 
1570: 7b 20 0a 20 20 20 20 43 52 45 41 54 45 20 54 52  { .    CREATE TR
1580: 49 47 47 45 52 20 74 32 5f 74 72 69 67 20 42 45  IGGER t2_trig BE
1590: 46 4f 52 45 20 49 4e 53 45 52 54 20 4f 4e 20 74  FORE INSERT ON t
15a0: 32 20 57 48 45 4e 20 28 6e 65 77 2e 61 3e 30 29  2 WHEN (new.a>0)
15b0: 20 42 45 47 49 4e 0a 20 20 20 20 20 20 49 4e 53   BEGIN.      INS
15c0: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
15d0: 45 53 28 6e 65 77 2e 61 20 2d 20 31 29 3b 0a 20  ES(new.a - 1);. 
15e0: 20 20 20 45 4e 44 3b 20 0a 20 20 7d 20 7b 30 20     END; .  } {0 
15f0: 7b 30 20 31 20 32 20 33 20 34 20 35 20 36 20 37  {0 1 2 3 4 5 6 7
1600: 20 38 20 39 20 31 30 7d 7d 0a 0a 20 20 34 20 7b   8 9 10}}..  4 {
1610: 20 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49   .    CREATE TRI
1620: 47 47 45 52 20 74 32 5f 74 72 69 67 20 42 45 46  GGER t2_trig BEF
1630: 4f 52 45 20 49 4e 53 45 52 54 20 4f 4e 20 74 32  ORE INSERT ON t2
1640: 20 42 45 47 49 4e 0a 20 20 20 20 20 20 53 45 4c   BEGIN.      SEL
1650: 45 43 54 20 43 41 53 45 20 57 48 45 4e 20 6e 65  ECT CASE WHEN ne
1660: 77 2e 61 3d 3d 32 20 54 48 45 4e 20 52 41 49 53  w.a==2 THEN RAIS
1670: 45 28 49 47 4e 4f 52 45 29 20 45 4c 53 45 20 4e  E(IGNORE) ELSE N
1680: 55 4c 4c 20 45 4e 44 3b 0a 20 20 20 20 20 20 49  ULL END;.      I
1690: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
16a0: 4c 55 45 53 28 6e 65 77 2e 61 20 2d 20 31 29 3b  LUES(new.a - 1);
16b0: 0a 20 20 20 20 45 4e 44 3b 0a 20 20 7d 20 7b 30  .    END;.  } {0
16c0: 20 7b 33 20 34 20 35 20 36 20 37 20 38 20 39 20   {3 4 5 6 7 8 9 
16d0: 31 30 7d 7d 0a 0a 20 20 35 20 7b 20 0a 20 20 20  10}}..  5 { .   
16e0: 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20   CREATE TRIGGER 
16f0: 74 32 5f 74 72 69 67 20 42 45 46 4f 52 45 20 49  t2_trig BEFORE I
1700: 4e 53 45 52 54 20 4f 4e 20 74 32 20 42 45 47 49  NSERT ON t2 BEGI
1710: 4e 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  N.      INSERT I
1720: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 6e 65  NTO t2 VALUES(ne
1730: 77 2e 61 20 2d 20 31 29 3b 0a 20 20 20 20 45 4e  w.a - 1);.    EN
1740: 44 3b 0a 20 20 7d 20 7b 31 20 7b 74 6f 6f 20 6d  D;.  } {1 {too m
1750: 61 6e 79 20 6c 65 76 65 6c 73 20 6f 66 20 74 72  any levels of tr
1760: 69 67 67 65 72 20 72 65 63 75 72 73 69 6f 6e 7d  igger recursion}
1770: 7d 0a 0a 20 20 36 20 7b 20 0a 20 20 20 20 43 52  }..  6 { .    CR
1780: 45 41 54 45 20 54 52 49 47 47 45 52 20 74 32 5f  EATE TRIGGER t2_
1790: 74 72 69 67 20 41 46 54 45 52 20 49 4e 53 45 52  trig AFTER INSER
17a0: 54 20 4f 4e 20 74 32 20 57 48 45 4e 20 28 6e 65  T ON t2 WHEN (ne
17b0: 77 2e 61 3e 30 29 20 42 45 47 49 4e 0a 20 20 20  w.a>0) BEGIN.   
17c0: 20 20 20 49 4e 53 45 52 54 20 4f 52 20 49 47 4e     INSERT OR IGN
17d0: 4f 52 45 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ORE INTO t2 VALU
17e0: 45 53 28 6e 65 77 2e 61 29 3b 0a 20 20 20 20 45  ES(new.a);.    E
17f0: 4e 44 3b 0a 20 20 7d 20 7b 30 20 31 30 7d 0a 0a  ND;.  } {0 10}..
1800: 20 20 37 20 7b 20 0a 20 20 20 20 43 52 45 41 54    7 { .    CREAT
1810: 45 20 54 52 49 47 47 45 52 20 74 32 5f 74 72 69  E TRIGGER t2_tri
1820: 67 20 42 45 46 4f 52 45 20 49 4e 53 45 52 54 20  g BEFORE INSERT 
1830: 4f 4e 20 74 32 20 57 48 45 4e 20 28 6e 65 77 2e  ON t2 WHEN (new.
1840: 61 3e 30 29 20 42 45 47 49 4e 0a 20 20 20 20 20  a>0) BEGIN.     
1850: 20 49 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52   INSERT OR IGNOR
1860: 45 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  E INTO t2 VALUES
1870: 28 6e 65 77 2e 61 29 3b 0a 20 20 20 20 45 4e 44  (new.a);.    END
1880: 3b 0a 20 20 7d 20 7b 31 20 7b 74 6f 6f 20 6d 61  ;.  } {1 {too ma
1890: 6e 79 20 6c 65 76 65 6c 73 20 6f 66 20 74 72 69  ny levels of tri
18a0: 67 67 65 72 20 72 65 63 75 72 73 69 6f 6e 7d 7d  gger recursion}}
18b0: 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 74  .} {.  do_test t
18c0: 72 69 67 67 65 72 43 2d 32 2e 31 2e 24 6e 20 7b  riggerC-2.1.$n {
18d0: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20  .    catchsql { 
18e0: 44 52 4f 50 20 54 52 49 47 47 45 52 20 74 32 5f  DROP TRIGGER t2_
18f0: 74 72 69 67 20 7d 0a 20 20 20 20 65 78 65 63 73  trig }.    execs
1900: 71 6c 20 20 7b 20 44 45 4c 45 54 45 20 46 52 4f  ql  { DELETE FRO
1910: 4d 20 74 32 20 7d 0a 20 20 20 20 65 78 65 63 73  M t2 }.    execs
1920: 71 6c 20 20 24 74 64 65 66 6e 0a 20 20 20 20 63  ql  $tdefn.    c
1930: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 20 20  atchsql {.      
1940: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
1950: 41 4c 55 45 53 28 31 30 29 3b 0a 20 20 20 20 20  ALUES(10);.     
1960: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1970: 32 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64  2 ORDER BY rowid
1980: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 24 72 63 0a  ;.    }.  } $rc.
1990: 7d 0a 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67  }..do_test trigg
19a0: 65 72 43 2d 32 2e 32 20 7b 0a 20 20 65 78 65 63  erC-2.2 {.  exec
19b0: 73 71 6c 20 22 0a 20 20 20 20 43 52 45 41 54 45  sql ".    CREATE
19c0: 20 54 41 42 4c 45 20 74 32 32 28 78 29 3b 0a 0a   TABLE t22(x);..
19d0: 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47      CREATE TRIGG
19e0: 45 52 20 74 32 32 61 20 41 46 54 45 52 20 49 4e  ER t22a AFTER IN
19f0: 53 45 52 54 20 4f 4e 20 74 32 32 20 42 45 47 49  SERT ON t22 BEGI
1a00: 4e 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  N.      INSERT I
1a10: 4e 54 4f 20 74 32 32 20 53 45 4c 45 43 54 20 78  NTO t22 SELECT x
1a20: 20 2b 20 28 53 45 4c 45 43 54 20 6d 61 78 28 78   + (SELECT max(x
1a30: 29 20 46 52 4f 4d 20 74 32 32 29 20 46 52 4f 4d  ) FROM t22) FROM
1a40: 20 74 32 32 3b 0a 20 20 20 20 45 4e 44 3b 0a 20   t22;.    END;. 
1a50: 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45     CREATE TRIGGE
1a60: 52 20 74 32 32 62 20 42 45 46 4f 52 45 20 49 4e  R t22b BEFORE IN
1a70: 53 45 52 54 20 4f 4e 20 74 32 32 20 42 45 47 49  SERT ON t22 BEGI
1a80: 4e 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 43  N.      SELECT C
1a90: 41 53 45 20 57 48 45 4e 20 28 53 45 4c 45 43 54  ASE WHEN (SELECT
1aa0: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
1ab0: 32 32 29 20 3e 3d 20 5b 65 78 70 72 20 24 53 51  22) >= [expr $SQ
1ac0: 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52  LITE_MAX_TRIGGER
1ad0: 5f 44 45 50 54 48 20 2f 20 32 5d 0a 20 20 20 20  _DEPTH / 2].    
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 48                TH
1af0: 45 4e 20 52 41 49 53 45 28 49 47 4e 4f 52 45 29  EN RAISE(IGNORE)
1b00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b10: 20 20 20 45 4c 53 45 20 4e 55 4c 4c 20 45 4e 44     ELSE NULL END
1b20: 3b 0a 20 20 20 20 45 4e 44 3b 0a 0a 20 20 20 20  ;.    END;..    
1b30: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 32 20  INSERT INTO t22 
1b40: 56 41 4c 55 45 53 28 31 29 3b 0a 20 20 20 20 53  VALUES(1);.    S
1b50: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
1b60: 52 4f 4d 20 74 32 32 3b 0a 20 20 22 0a 7d 20 5b  ROM t22;.  ".} [
1b70: 6c 69 73 74 20 5b 65 78 70 72 20 24 53 51 4c 49  list [expr $SQLI
1b80: 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44  TE_MAX_TRIGGER_D
1b90: 45 50 54 48 20 2f 20 32 5d 5d 0a 0a 64 6f 5f 74  EPTH / 2]]..do_t
1ba0: 65 73 74 20 74 72 69 67 67 65 72 43 2d 32 2e 33  est triggerC-2.3
1bb0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 22 0a 20   {.  execsql ". 
1bc0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
1bd0: 74 32 33 28 78 20 50 52 49 4d 41 52 59 20 4b 45  t23(x PRIMARY KE
1be0: 59 29 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20  Y);..    CREATE 
1bf0: 54 52 49 47 47 45 52 20 74 32 33 61 20 41 46 54  TRIGGER t23a AFT
1c00: 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 74 32 33  ER INSERT ON t23
1c10: 20 42 45 47 49 4e 0a 20 20 20 20 20 20 49 4e 53   BEGIN.      INS
1c20: 45 52 54 20 49 4e 54 4f 20 74 32 33 20 56 41 4c  ERT INTO t23 VAL
1c30: 55 45 53 28 6e 65 77 2e 78 20 2b 20 31 29 3b 0a  UES(new.x + 1);.
1c40: 20 20 20 20 45 4e 44 3b 0a 0a 20 20 20 20 43 52      END;..    CR
1c50: 45 41 54 45 20 54 52 49 47 47 45 52 20 74 32 33  EATE TRIGGER t23
1c60: 62 20 42 45 46 4f 52 45 20 49 4e 53 45 52 54 20  b BEFORE INSERT 
1c70: 4f 4e 20 74 32 33 20 42 45 47 49 4e 0a 20 20 20  ON t23 BEGIN.   
1c80: 20 20 20 53 45 4c 45 43 54 20 43 41 53 45 20 57     SELECT CASE W
1c90: 48 45 4e 20 6e 65 77 2e 78 3e 5b 65 78 70 72 20  HEN new.x>[expr 
1ca0: 24 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47  $SQLITE_MAX_TRIG
1cb0: 47 45 52 5f 44 45 50 54 48 20 2f 20 32 5d 0a 20  GER_DEPTH / 2]. 
1cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd0: 20 54 48 45 4e 20 52 41 49 53 45 28 49 47 4e 4f   THEN RAISE(IGNO
1ce0: 52 45 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  RE).            
1cf0: 20 20 20 20 20 20 45 4c 53 45 20 4e 55 4c 4c 20        ELSE NULL 
1d00: 45 4e 44 3b 0a 20 20 20 20 45 4e 44 3b 0a 0a 20  END;.    END;.. 
1d10: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1d20: 32 33 20 56 41 4c 55 45 53 28 31 29 3b 0a 20 20  23 VALUES(1);.  
1d30: 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
1d40: 29 20 46 52 4f 4d 20 74 32 33 3b 0a 20 20 22 0a  ) FROM t23;.  ".
1d50: 7d 20 5b 6c 69 73 74 20 5b 65 78 70 72 20 24 53  } [list [expr $S
1d60: 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45  QLITE_MAX_TRIGGE
1d70: 52 5f 44 45 50 54 48 20 2f 20 32 5d 5d 0a 20 0a  R_DEPTH / 2]]. .
1d80: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
1d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 69 73  ---------.# This
1dd0: 20 62 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73 2c   block of tests,
1de0: 20 74 72 69 67 67 65 72 43 2d 33 2e 2a 2c 20 74   triggerC-3.*, t
1df0: 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20  est that SQLite 
1e00: 74 68 72 6f 77 73 20 61 6e 20 65 78 63 65 70 74  throws an except
1e10: 69 6f 6e 0a 23 20 77 68 65 6e 20 69 74 20 64 65  ion.# when it de
1e20: 74 65 63 74 73 20 65 78 63 65 73 73 69 76 65 20  tects excessive 
1e30: 72 65 63 75 72 73 69 6f 6e 2e 0a 23 0a 64 6f 5f  recursion..#.do_
1e40: 74 65 73 74 20 74 72 69 67 67 65 72 43 2d 33 2e  test triggerC-3.
1e50: 31 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.1 {.  execsql 
1e60: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
1e70: 4c 45 20 74 33 28 61 2c 20 62 29 3b 0a 20 20 20  LE t3(a, b);.   
1e80: 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20   CREATE TRIGGER 
1e90: 74 33 69 20 41 46 54 45 52 20 49 4e 53 45 52 54  t3i AFTER INSERT
1ea0: 20 4f 4e 20 74 33 20 42 45 47 49 4e 0a 20 20 20   ON t3 BEGIN.   
1eb0: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
1ec0: 33 20 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20  3 WHERE rowid = 
1ed0: 6e 65 77 2e 72 6f 77 69 64 3b 0a 20 20 20 20 45  new.rowid;.    E
1ee0: 4e 44 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  ND;.    CREATE T
1ef0: 52 49 47 47 45 52 20 74 33 64 20 41 46 54 45 52  RIGGER t3d AFTER
1f00: 20 44 45 4c 45 54 45 20 4f 4e 20 74 33 20 42 45   DELETE ON t3 BE
1f10: 47 49 4e 0a 20 20 20 20 20 20 49 4e 53 45 52 54  GIN.      INSERT
1f20: 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28   INTO t3 VALUES(
1f30: 6f 6c 64 2e 61 2c 20 6f 6c 64 2e 62 29 3b 0a 20  old.a, old.b);. 
1f40: 20 20 20 45 4e 44 3b 0a 20 20 7d 0a 7d 20 7b 7d     END;.  }.} {}
1f50: 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72  .do_test trigger
1f60: 43 2d 33 2e 31 2e 32 20 7b 0a 20 20 63 61 74 63  C-3.1.2 {.  catc
1f70: 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  hsql { INSERT IN
1f80: 54 4f 20 74 33 20 56 41 4c 55 45 53 28 30 2c 30  TO t3 VALUES(0,0
1f90: 29 20 7d 0a 7d 20 7b 31 20 7b 74 6f 6f 20 6d 61  ) }.} {1 {too ma
1fa0: 6e 79 20 6c 65 76 65 6c 73 20 6f 66 20 74 72 69  ny levels of tri
1fb0: 67 67 65 72 20 72 65 63 75 72 73 69 6f 6e 7d 7d  gger recursion}}
1fc0: 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72  .do_test trigger
1fd0: 43 2d 33 2e 31 2e 33 20 7b 0a 20 20 65 78 65 63  C-3.1.3 {.  exec
1fe0: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
1ff0: 52 4f 4d 20 74 33 20 7d 0a 7d 20 7b 7d 0a 0a 64  ROM t3 }.} {}..d
2000: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 43 2d  o_test triggerC-
2010: 33 2e 32 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  3.2.1 {.  execsq
2020: 6c 20 22 0a 20 20 20 20 43 52 45 41 54 45 20 54  l ".    CREATE T
2030: 41 42 4c 45 20 74 33 62 28 78 29 3b 0a 20 20 20  ABLE t3b(x);.   
2040: 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20   CREATE TRIGGER 
2050: 74 33 62 69 20 41 46 54 45 52 20 49 4e 53 45 52  t3bi AFTER INSER
2060: 54 20 4f 4e 20 74 33 62 20 57 48 45 4e 20 6e 65  T ON t3b WHEN ne
2070: 77 2e 78 3c 5b 65 78 70 72 20 24 53 51 4c 49 54  w.x<[expr $SQLIT
2080: 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45  E_MAX_TRIGGER_DE
2090: 50 54 48 20 2a 20 32 5d 20 42 45 47 49 4e 0a 20  PTH * 2] BEGIN. 
20a0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
20b0: 20 74 33 62 20 56 41 4c 55 45 53 28 6e 65 77 2e   t3b VALUES(new.
20c0: 78 2b 31 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20  x+1);.    END;. 
20d0: 20 22 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a   ".  catchsql {.
20e0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
20f0: 74 33 62 20 56 41 4c 55 45 53 28 31 29 3b 0a 20  t3b VALUES(1);. 
2100: 20 7d 0a 7d 20 7b 31 20 7b 74 6f 6f 20 6d 61 6e   }.} {1 {too man
2110: 79 20 6c 65 76 65 6c 73 20 6f 66 20 74 72 69 67  y levels of trig
2120: 67 65 72 20 72 65 63 75 72 73 69 6f 6e 7d 7d 0a  ger recursion}}.
2130: 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 43  do_test triggerC
2140: 2d 33 2e 32 2e 32 20 7b 0a 20 20 64 62 20 65 76  -3.2.2 {.  db ev
2150: 61 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f  al {SELECT * FRO
2160: 4d 20 74 33 62 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f  M t3b}.} {}..do_
2170: 74 65 73 74 20 74 72 69 67 67 65 72 43 2d 33 2e  test triggerC-3.
2180: 33 2e 31 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  3.1 {.  catchsql
2190: 20 22 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   ".    INSERT IN
21a0: 54 4f 20 74 33 62 20 56 41 4c 55 45 53 28 5b 65  TO t3b VALUES([e
21b0: 78 70 72 20 24 53 51 4c 49 54 45 5f 4d 41 58 5f  xpr $SQLITE_MAX_
21c0: 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 2b 20  TRIGGER_DEPTH + 
21d0: 31 5d 29 3b 0a 20 20 22 0a 7d 20 7b 30 20 7b 7d  1]);.  ".} {0 {}
21e0: 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65  }.do_test trigge
21f0: 72 43 2d 33 2e 33 2e 32 20 7b 0a 20 20 64 62 20  rC-3.3.2 {.  db 
2200: 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 63 6f 75  eval {SELECT cou
2210: 6e 74 28 2a 29 2c 20 6d 61 78 28 78 29 2c 20 6d  nt(*), max(x), m
2220: 69 6e 28 78 29 20 46 52 4f 4d 20 74 33 62 7d 0a  in(x) FROM t3b}.
2230: 7d 20 5b 6c 69 73 74 20 24 53 51 4c 49 54 45 5f  } [list $SQLITE_
2240: 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MAX_TRIGGER_DEPT
2250: 48 20 5b 65 78 70 72 20 24 53 51 4c 49 54 45 5f  H [expr $SQLITE_
2260: 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MAX_TRIGGER_DEPT
2270: 48 20 2a 20 32 5d 20 5b 65 78 70 72 20 24 53 51  H * 2] [expr $SQ
2280: 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52  LITE_MAX_TRIGGER
2290: 5f 44 45 50 54 48 20 2b 20 31 5d 5d 0a 0a 64 6f  _DEPTH + 1]]..do
22a0: 5f 74 65 73 74 20 74 72 69 67 67 65 72 43 2d 33  _test triggerC-3
22b0: 2e 34 2e 31 20 7b 0a 20 20 63 61 74 63 68 73 71  .4.1 {.  catchsq
22c0: 6c 20 22 0a 20 20 20 20 44 45 4c 45 54 45 20 46  l ".    DELETE F
22d0: 52 4f 4d 20 74 33 62 3b 0a 20 20 20 20 49 4e 53  ROM t3b;.    INS
22e0: 45 52 54 20 49 4e 54 4f 20 74 33 62 20 56 41 4c  ERT INTO t3b VAL
22f0: 55 45 53 28 5b 65 78 70 72 20 24 53 51 4c 49 54  UES([expr $SQLIT
2300: 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45  E_MAX_TRIGGER_DE
2310: 50 54 48 20 2d 20 31 5d 29 3b 0a 20 20 22 0a 7d  PTH - 1]);.  ".}
2320: 20 7b 31 20 7b 74 6f 6f 20 6d 61 6e 79 20 6c 65   {1 {too many le
2330: 76 65 6c 73 20 6f 66 20 74 72 69 67 67 65 72 20  vels of trigger 
2340: 72 65 63 75 72 73 69 6f 6e 7d 7d 0a 64 6f 5f 74  recursion}}.do_t
2350: 65 73 74 20 74 72 69 67 67 65 72 43 2d 33 2e 34  est triggerC-3.4
2360: 2e 32 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b  .2 {.  db eval {
2370: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 2c  SELECT count(*),
2380: 20 6d 61 78 28 78 29 2c 20 6d 69 6e 28 78 29 20   max(x), min(x) 
2390: 46 52 4f 4d 20 74 33 62 7d 0a 7d 20 7b 30 20 7b  FROM t3b}.} {0 {
23a0: 7d 20 7b 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20 74  } {}}..do_test t
23b0: 72 69 67 67 65 72 43 2d 33 2e 35 2e 31 20 7b 0a  riggerC-3.5.1 {.
23c0: 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 20    sqlite3_limit 
23d0: 64 62 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  db SQLITE_LIMIT_
23e0: 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 20 5b  TRIGGER_DEPTH  [
23f0: 65 78 70 72 20 24 53 51 4c 49 54 45 5f 4d 41 58  expr $SQLITE_MAX
2400: 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 2f  _TRIGGER_DEPTH /
2410: 20 31 30 5d 0a 20 20 63 61 74 63 68 73 71 6c 20   10].  catchsql 
2420: 22 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ".    INSERT INT
2430: 4f 20 74 33 62 20 56 41 4c 55 45 53 28 5b 65 78  O t3b VALUES([ex
2440: 70 72 20 28 24 53 51 4c 49 54 45 5f 4d 41 58 5f  pr ($SQLITE_MAX_
2450: 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 2a 20  TRIGGER_DEPTH * 
2460: 32 29 20 2d 20 28 24 53 51 4c 49 54 45 5f 4d 41  2) - ($SQLITE_MA
2470: 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20  X_TRIGGER_DEPTH 
2480: 2f 20 31 30 29 20 2b 20 31 5d 29 3b 0a 20 20 22  / 10) + 1]);.  "
2490: 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 74 65 73  .} {0 {}}.do_tes
24a0: 74 20 74 72 69 67 67 65 72 43 2d 33 2e 35 2e 32  t triggerC-3.5.2
24b0: 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b 53 45   {.  db eval {SE
24c0: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 2c 20 6d  LECT count(*), m
24d0: 61 78 28 78 29 2c 20 6d 69 6e 28 78 29 20 46 52  ax(x), min(x) FR
24e0: 4f 4d 20 74 33 62 7d 0a 7d 20 5b 6c 69 73 74 20  OM t3b}.} [list 
24f0: 5b 65 78 70 72 20 24 53 51 4c 49 54 45 5f 4d 41  [expr $SQLITE_MA
2500: 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20  X_TRIGGER_DEPTH 
2510: 2f 20 31 30 5d 20 5b 65 78 70 72 20 24 53 51 4c  / 10] [expr $SQL
2520: 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f  ITE_MAX_TRIGGER_
2530: 44 45 50 54 48 20 2a 20 32 5d 20 5b 65 78 70 72  DEPTH * 2] [expr
2540: 20 28 24 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52   ($SQLITE_MAX_TR
2550: 49 47 47 45 52 5f 44 45 50 54 48 20 2a 20 32 29  IGGER_DEPTH * 2)
2560: 20 2d 20 28 24 53 51 4c 49 54 45 5f 4d 41 58 5f   - ($SQLITE_MAX_
2570: 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 2f 20  TRIGGER_DEPTH / 
2580: 31 30 29 20 2b 20 31 5d 5d 0a 0a 64 6f 5f 74 65  10) + 1]]..do_te
2590: 73 74 20 74 72 69 67 67 65 72 43 2d 33 2e 35 2e  st triggerC-3.5.
25a0: 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 22  3 {.  catchsql "
25b0: 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  .    DELETE FROM
25c0: 20 74 33 62 3b 0a 20 20 20 20 49 4e 53 45 52 54   t3b;.    INSERT
25d0: 20 49 4e 54 4f 20 74 33 62 20 56 41 4c 55 45 53   INTO t3b VALUES
25e0: 28 5b 65 78 70 72 20 28 24 53 51 4c 49 54 45 5f  ([expr ($SQLITE_
25f0: 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MAX_TRIGGER_DEPT
2600: 48 20 2a 20 32 29 20 2d 20 28 24 53 51 4c 49 54  H * 2) - ($SQLIT
2610: 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45  E_MAX_TRIGGER_DE
2620: 50 54 48 20 2f 20 31 30 29 5d 29 3b 0a 20 20 22  PTH / 10)]);.  "
2630: 0a 7d 20 7b 31 20 7b 74 6f 6f 20 6d 61 6e 79 20  .} {1 {too many 
2640: 6c 65 76 65 6c 73 20 6f 66 20 74 72 69 67 67 65  levels of trigge
2650: 72 20 72 65 63 75 72 73 69 6f 6e 7d 7d 0a 64 6f  r recursion}}.do
2660: 5f 74 65 73 74 20 74 72 69 67 67 65 72 43 2d 33  _test triggerC-3
2670: 2e 35 2e 34 20 7b 0a 20 20 64 62 20 65 76 61 6c  .5.4 {.  db eval
2680: 20 7b 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   {SELECT count(*
2690: 29 2c 20 6d 61 78 28 78 29 2c 20 6d 69 6e 28 78  ), max(x), min(x
26a0: 29 20 46 52 4f 4d 20 74 33 62 7d 0a 7d 20 7b 30  ) FROM t3b}.} {0
26b0: 20 7b 7d 20 7b 7d 7d 0a 0a 64 6f 5f 74 65 73 74   {} {}}..do_test
26c0: 20 74 72 69 67 67 65 72 43 2d 33 2e 36 2e 31 20   triggerC-3.6.1 
26d0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69  {.  sqlite3_limi
26e0: 74 20 64 62 20 53 51 4c 49 54 45 5f 4c 49 4d 49  t db SQLITE_LIMI
26f0: 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20  T_TRIGGER_DEPTH 
2700: 31 0a 20 20 63 61 74 63 68 73 71 6c 20 22 0a 20  1.  catchsql ". 
2710: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2720: 33 62 20 56 41 4c 55 45 53 28 5b 65 78 70 72 20  3b VALUES([expr 
2730: 24 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47  $SQLITE_MAX_TRIG
2740: 47 45 52 5f 44 45 50 54 48 20 2a 20 32 5d 29 3b  GER_DEPTH * 2]);
2750: 0a 20 20 22 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f  .  ".} {0 {}}.do
2760: 5f 74 65 73 74 20 74 72 69 67 67 65 72 43 2d 33  _test triggerC-3
2770: 2e 36 2e 32 20 7b 0a 20 20 64 62 20 65 76 61 6c  .6.2 {.  db eval
2780: 20 7b 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   {SELECT count(*
2790: 29 2c 20 6d 61 78 28 78 29 2c 20 6d 69 6e 28 78  ), max(x), min(x
27a0: 29 20 46 52 4f 4d 20 74 33 62 7d 0a 7d 20 5b 6c  ) FROM t3b}.} [l
27b0: 69 73 74 20 31 20 5b 65 78 70 72 20 24 53 51 4c  ist 1 [expr $SQL
27c0: 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f  ITE_MAX_TRIGGER_
27d0: 44 45 50 54 48 20 2a 20 32 5d 20 5b 65 78 70 72  DEPTH * 2] [expr
27e0: 20 24 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49   $SQLITE_MAX_TRI
27f0: 47 47 45 52 5f 44 45 50 54 48 20 2a 20 32 5d 5d  GGER_DEPTH * 2]]
2800: 0a 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65  ..do_test trigge
2810: 72 43 2d 33 2e 36 2e 33 20 7b 0a 20 20 63 61 74  rC-3.6.3 {.  cat
2820: 63 68 73 71 6c 20 22 0a 20 20 20 20 44 45 4c 45  chsql ".    DELE
2830: 54 45 20 46 52 4f 4d 20 74 33 62 3b 0a 20 20 20  TE FROM t3b;.   
2840: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 62   INSERT INTO t3b
2850: 20 56 41 4c 55 45 53 28 5b 65 78 70 72 20 28 24   VALUES([expr ($
2860: 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47  SQLITE_MAX_TRIGG
2870: 45 52 5f 44 45 50 54 48 20 2a 20 32 29 20 2d 20  ER_DEPTH * 2) - 
2880: 31 5d 29 3b 0a 20 20 22 0a 7d 20 7b 31 20 7b 74  1]);.  ".} {1 {t
2890: 6f 6f 20 6d 61 6e 79 20 6c 65 76 65 6c 73 20 6f  oo many levels o
28a0: 66 20 74 72 69 67 67 65 72 20 72 65 63 75 72 73  f trigger recurs
28b0: 69 6f 6e 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 72  ion}}.do_test tr
28c0: 69 67 67 65 72 43 2d 33 2e 36 2e 34 20 7b 0a 20  iggerC-3.6.4 {. 
28d0: 20 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54   db eval {SELECT
28e0: 20 63 6f 75 6e 74 28 2a 29 2c 20 6d 61 78 28 78   count(*), max(x
28f0: 29 2c 20 6d 69 6e 28 78 29 20 46 52 4f 4d 20 74  ), min(x) FROM t
2900: 33 62 7d 0a 7d 20 7b 30 20 7b 7d 20 7b 7d 7d 0a  3b}.} {0 {} {}}.
2910: 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 20 64 62  sqlite3_limit db
2920: 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52   SQLITE_LIMIT_TR
2930: 49 47 47 45 52 5f 44 45 50 54 48 20 24 53 51 4c  IGGER_DEPTH $SQL
2940: 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f  ITE_MAX_TRIGGER_
2950: 44 45 50 54 48 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  DEPTH...#-------
2960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
29a0: 0a 23 20 54 68 69 73 20 6e 65 78 74 20 62 6c 6f  .# This next blo
29b0: 63 6b 20 6f 66 20 74 65 73 74 73 2c 20 74 72 69  ck of tests, tri
29c0: 67 67 65 72 43 2d 34 2e 2a 2c 20 63 68 65 63 6b  ggerC-4.*, check
29d0: 73 20 74 68 61 74 20 61 66 66 69 6e 69 74 79 20  s that affinity 
29e0: 0a 23 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f  .# transformatio
29f0: 6e 73 20 61 6e 64 20 63 6f 6e 73 74 72 61 69 6e  ns and constrain
2a00: 74 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20  t processing is 
2a10: 70 65 72 66 6f 72 6d 65 64 20 61 74 20 74 68 65  performed at the
2a20: 20 63 6f 72 72 65 63 74 20 0a 23 20 74 69 6d 65   correct .# time
2a30: 73 20 72 65 6c 61 74 69 76 65 20 74 6f 20 42 45  s relative to BE
2a40: 46 4f 52 45 20 61 6e 64 20 41 46 54 45 52 20 74  FORE and AFTER t
2a50: 72 69 67 67 65 72 73 2e 0a 23 0a 23 20 46 6f 72  riggers..#.# For
2a60: 20 61 6e 20 49 4e 53 45 52 54 20 73 74 61 74 65   an INSERT state
2a70: 6d 65 6e 74 2c 20 66 6f 72 20 65 61 63 68 20 72  ment, for each r
2a80: 6f 77 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65  ow to be inserte
2a90: 64 3a 0a 23 0a 23 20 20 20 31 2e 20 41 70 70 6c  d:.#.#   1. Appl
2aa0: 79 20 61 66 66 69 6e 69 74 69 65 73 20 74 6f 20  y affinities to 
2ab0: 6e 6f 6e 2d 72 6f 77 69 64 20 76 61 6c 75 65 73  non-rowid values
2ac0: 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e   to be inserted.
2ad0: 0a 23 20 20 20 32 2e 20 46 69 72 65 20 42 45 46  .#   2. Fire BEF
2ae0: 4f 52 45 20 74 72 69 67 67 65 72 73 2e 0a 23 20  ORE triggers..# 
2af0: 20 20 33 2e 20 50 72 6f 63 65 73 73 20 63 6f 6e    3. Process con
2b00: 73 74 72 61 69 6e 74 73 2e 0a 23 20 20 20 34 2e  straints..#   4.
2b10: 20 49 6e 73 65 72 74 20 6e 65 77 20 72 65 63 6f   Insert new reco
2b20: 72 64 2e 0a 23 20 20 20 35 2e 20 46 69 72 65 20  rd..#   5. Fire 
2b30: 41 46 54 45 52 20 74 72 69 67 67 65 72 73 2e 0a  AFTER triggers..
2b40: 23 0a 23 20 49 66 20 74 68 65 20 76 61 6c 75 65  #.# If the value
2b50: 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 66 69   of the rowid fi
2b60: 65 6c 64 20 69 73 20 74 6f 20 62 65 20 61 75 74  eld is to be aut
2b70: 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 73 69 67  omatically assig
2b80: 6e 65 64 2c 20 69 74 20 69 73 0a 23 20 73 65 74  ned, it is.# set
2b90: 20 74 6f 20 2d 31 20 69 6e 20 74 68 65 20 6e 65   to -1 in the ne
2ba0: 77 2e 2a 20 72 65 63 6f 72 64 2e 20 45 76 65 6e  w.* record. Even
2bb0: 20 69 66 20 69 74 20 69 73 20 65 78 70 6c 69 63   if it is explic
2bc0: 69 74 6c 79 20 73 65 74 20 74 6f 20 4e 55 4c 4c  itly set to NULL
2bd0: 0a 23 20 62 79 20 74 68 65 20 49 4e 53 45 52 54  .# by the INSERT
2be0: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 23 0a 23 20   statement..#.# 
2bf0: 46 6f 72 20 61 6e 20 55 50 44 41 54 45 20 73 74  For an UPDATE st
2c00: 61 74 65 6d 65 6e 74 2c 20 66 6f 72 20 65 61 63  atement, for eac
2c10: 68 20 72 6f 77 20 74 6f 20 62 65 20 64 65 6c 65  h row to be dele
2c20: 74 65 64 3a 0a 23 0a 23 20 20 20 31 2e 20 41 70  ted:.#.#   1. Ap
2c30: 70 6c 79 20 61 66 66 69 6e 69 74 69 65 73 20 74  ply affinities t
2c40: 6f 20 6e 6f 6e 2d 72 6f 77 69 64 20 76 61 6c 75  o non-rowid valu
2c50: 65 73 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65  es to be inserte
2c60: 64 2e 0a 23 20 20 20 32 2e 20 46 69 72 65 20 42  d..#   2. Fire B
2c70: 45 46 4f 52 45 20 74 72 69 67 67 65 72 73 2e 0a  EFORE triggers..
2c80: 23 20 20 20 33 2e 20 50 72 6f 63 65 73 73 20 63  #   3. Process c
2c90: 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 23 20 20 20  onstraints..#   
2ca0: 34 2e 20 49 6e 73 65 72 74 20 6e 65 77 20 72 65  4. Insert new re
2cb0: 63 6f 72 64 2e 0a 23 20 20 20 35 2e 20 46 69 72  cord..#   5. Fir
2cc0: 65 20 41 46 54 45 52 20 74 72 69 67 67 65 72 73  e AFTER triggers
2cd0: 2e 0a 23 0a 23 20 46 6f 72 20 61 20 44 45 4c 45  ..#.# For a DELE
2ce0: 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 66 6f  TE statement, fo
2cf0: 72 20 65 61 63 68 20 72 6f 77 20 74 6f 20 62 65  r each row to be
2d00: 20 64 65 6c 65 74 65 64 3a 0a 23 0a 23 20 20 20   deleted:.#.#   
2d10: 31 2e 20 46 69 72 65 20 42 45 46 4f 52 45 20 74  1. Fire BEFORE t
2d20: 72 69 67 67 65 72 73 2e 0a 23 20 20 20 32 2e 20  riggers..#   2. 
2d30: 52 65 6d 6f 76 65 20 64 61 74 61 62 61 73 65 20  Remove database 
2d40: 72 65 63 6f 72 64 2e 0a 23 20 20 20 33 2e 20 46  record..#   3. F
2d50: 69 72 65 20 41 46 54 45 52 20 74 72 69 67 67 65  ire AFTER trigge
2d60: 72 73 2e 0a 23 0a 23 20 57 68 65 6e 20 61 20 6e  rs..#.# When a n
2d70: 75 6d 65 72 69 63 20 76 61 6c 75 65 20 74 68 61  umeric value tha
2d80: 74 20 61 73 20 61 6e 20 65 78 61 63 74 20 69 6e  t as an exact in
2d90: 74 65 67 65 72 20 72 65 70 72 65 73 65 6e 74 61  teger representa
2da0: 74 69 6f 6e 20 69 73 20 73 74 6f 72 65 64 0a 23  tion is stored.#
2db0: 20 69 6e 20 61 20 63 6f 6c 75 6d 6e 20 77 69 74   in a column wit
2dc0: 68 20 52 45 41 4c 20 61 66 66 69 6e 69 74 79 2c  h REAL affinity,
2dd0: 20 69 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20   it is actually 
2de0: 73 74 6f 72 65 64 20 61 73 20 61 6e 20 69 6e 74  stored as an int
2df0: 65 67 65 72 2e 0a 23 20 54 68 65 73 65 20 74 65  eger..# These te
2e00: 73 74 73 20 63 68 65 63 6b 20 74 68 61 74 20 74  sts check that t
2e10: 68 65 20 74 79 70 65 6f 66 28 29 20 73 75 63 68  he typeof() such
2e20: 20 76 61 6c 75 65 73 20 69 73 20 61 6c 77 61 79   values is alway
2e30: 73 20 27 72 65 61 6c 27 2c 0a 23 20 6e 6f 74 20  s 'real',.# not 
2e40: 27 69 6e 74 65 67 65 72 27 2e 0a 23 0a 23 20 74  'integer'..#.# t
2e50: 72 69 67 67 65 72 43 2d 34 2e 31 2e 2a 3a 20 43  riggerC-4.1.*: C
2e60: 68 65 63 6b 20 74 68 61 74 20 61 66 66 69 6e 69  heck that affini
2e70: 74 79 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f  ty transformatio
2e80: 6e 73 20 61 72 65 20 6d 61 64 65 20 62 65 66 6f  ns are made befo
2e90: 72 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  re.#            
2ea0: 20 20 20 20 20 74 72 69 67 67 65 72 73 20 61 72       triggers ar
2eb0: 65 20 69 6e 76 6f 6b 65 64 2e 0a 23 0a 64 6f 5f  e invoked..#.do_
2ec0: 74 65 73 74 20 74 72 69 67 67 65 72 43 2d 34 2e  test triggerC-4.
2ed0: 31 2e 31 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  1.1 {.  catchsql
2ee0: 20 7b 20 44 52 4f 50 20 54 41 42 4c 45 20 6c 6f   { DROP TABLE lo
2ef0: 67 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  g }.  catchsql {
2f00: 20 44 52 4f 50 20 54 41 42 4c 45 20 74 34 20 7d   DROP TABLE t4 }
2f10: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
2f20: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6c 6f   CREATE TABLE lo
2f30: 67 28 74 29 3b 0a 20 20 20 20 43 52 45 41 54 45  g(t);.    CREATE
2f40: 20 54 41 42 4c 45 20 74 34 28 61 20 54 45 58 54   TABLE t4(a TEXT
2f50: 2c 62 20 49 4e 54 45 47 45 52 2c 63 20 52 45 41  ,b INTEGER,c REA
2f60: 4c 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  L);.    CREATE T
2f70: 52 49 47 47 45 52 20 74 34 62 69 20 42 45 46 4f  RIGGER t4bi BEFO
2f80: 52 45 20 49 4e 53 45 52 54 20 4f 4e 20 74 34 20  RE INSERT ON t4 
2f90: 42 45 47 49 4e 0a 20 20 20 20 20 20 49 4e 53 45  BEGIN.      INSE
2fa0: 52 54 20 49 4e 54 4f 20 6c 6f 67 20 56 41 4c 55  RT INTO log VALU
2fb0: 45 53 28 6e 65 77 2e 72 6f 77 69 64 20 7c 7c 20  ES(new.rowid || 
2fc0: 27 20 27 20 7c 7c 20 74 79 70 65 6f 66 28 6e 65  ' ' || typeof(ne
2fd0: 77 2e 72 6f 77 69 64 29 20 7c 7c 20 27 20 27 20  w.rowid) || ' ' 
2fe0: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ||.             
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3000: 6e 65 77 2e 61 20 20 20 20 20 7c 7c 20 27 20 27  new.a     || ' '
3010: 20 7c 7c 20 74 79 70 65 6f 66 28 6e 65 77 2e 61   || typeof(new.a
3020: 29 20 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c 0a  )     || ' ' ||.
3030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3040: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 77               new
3050: 2e 62 20 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c  .b     || ' ' ||
3060: 20 74 79 70 65 6f 66 28 6e 65 77 2e 62 29 20 20   typeof(new.b)  
3070: 20 20 20 7c 7c 20 27 20 27 20 7c 7c 0a 20 20 20     || ' ' ||.   
3080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3090: 20 20 20 20 20 20 20 20 20 20 6e 65 77 2e 63 20            new.c 
30a0: 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c 20 74 79      || ' ' || ty
30b0: 70 65 6f 66 28 6e 65 77 2e 63 29 0a 20 20 20 20  peof(new.c).    
30c0: 20 20 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20    );.    END;.  
30d0: 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52    CREATE TRIGGER
30e0: 20 74 34 61 69 20 41 46 54 45 52 20 49 4e 53 45   t4ai AFTER INSE
30f0: 52 54 20 4f 4e 20 74 34 20 42 45 47 49 4e 0a 20  RT ON t4 BEGIN. 
3100: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
3110: 20 6c 6f 67 20 56 41 4c 55 45 53 28 6e 65 77 2e   log VALUES(new.
3120: 72 6f 77 69 64 20 7c 7c 20 27 20 27 20 7c 7c 20  rowid || ' ' || 
3130: 74 79 70 65 6f 66 28 6e 65 77 2e 72 6f 77 69 64  typeof(new.rowid
3140: 29 20 7c 7c 20 27 20 27 20 7c 7c 0a 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 20 20 6e 65 77 2e 61 20 20           new.a  
3170: 20 20 20 7c 7c 20 27 20 27 20 7c 7c 20 74 79 70     || ' ' || typ
3180: 65 6f 66 28 6e 65 77 2e 61 29 20 20 20 20 20 7c  eof(new.a)     |
3190: 7c 20 27 20 27 20 7c 7c 0a 20 20 20 20 20 20 20  | ' ' ||.       
31a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b0: 20 20 20 20 20 20 6e 65 77 2e 62 20 20 20 20 20        new.b     
31c0: 7c 7c 20 27 20 27 20 7c 7c 20 74 79 70 65 6f 66  || ' ' || typeof
31d0: 28 6e 65 77 2e 62 29 20 20 20 20 20 7c 7c 20 27  (new.b)     || '
31e0: 20 27 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20   ' ||.          
31f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3200: 20 20 20 6e 65 77 2e 63 20 20 20 20 20 7c 7c 20     new.c     || 
3210: 27 20 27 20 7c 7c 20 74 79 70 65 6f 66 28 6e 65  ' ' || typeof(ne
3220: 77 2e 63 29 0a 20 20 20 20 20 20 29 3b 0a 20 20  w.c).      );.  
3230: 20 20 45 4e 44 3b 0a 20 20 20 20 43 52 45 41 54    END;.    CREAT
3240: 45 20 54 52 49 47 47 45 52 20 74 34 62 64 20 42  E TRIGGER t4bd B
3250: 45 46 4f 52 45 20 44 45 4c 45 54 45 20 4f 4e 20  EFORE DELETE ON 
3260: 74 34 20 42 45 47 49 4e 0a 20 20 20 20 20 20 49  t4 BEGIN.      I
3270: 4e 53 45 52 54 20 49 4e 54 4f 20 6c 6f 67 20 56  NSERT INTO log V
3280: 41 4c 55 45 53 28 6f 6c 64 2e 72 6f 77 69 64 20  ALUES(old.rowid 
3290: 7c 7c 20 27 20 27 20 7c 7c 20 74 79 70 65 6f 66  || ' ' || typeof
32a0: 28 6f 6c 64 2e 72 6f 77 69 64 29 20 7c 7c 20 27  (old.rowid) || '
32b0: 20 27 20 7c 7c 0a 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: 20 20 20 6f 6c 64 2e 61 20 20 20 20 20 7c 7c 20     old.a     || 
32e0: 27 20 27 20 7c 7c 20 74 79 70 65 6f 66 28 6f 6c  ' ' || typeof(ol
32f0: 64 2e 61 29 20 20 20 20 20 7c 7c 20 27 20 27 20  d.a)     || ' ' 
3300: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ||.             
3310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3320: 6f 6c 64 2e 62 20 20 20 20 20 7c 7c 20 27 20 27  old.b     || ' '
3330: 20 7c 7c 20 74 79 70 65 6f 66 28 6f 6c 64 2e 62   || typeof(old.b
3340: 29 20 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c 0a  )     || ' ' ||.
3350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3360: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 6c 64               old
3370: 2e 63 20 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c  .c     || ' ' ||
3380: 20 74 79 70 65 6f 66 28 6f 6c 64 2e 63 29 0a 20   typeof(old.c). 
3390: 20 20 20 20 20 29 3b 0a 20 20 20 20 45 4e 44 3b       );.    END;
33a0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47  .    CREATE TRIG
33b0: 47 45 52 20 74 34 61 64 20 41 46 54 45 52 20 44  GER t4ad AFTER D
33c0: 45 4c 45 54 45 20 4f 4e 20 74 34 20 42 45 47 49  ELETE ON t4 BEGI
33d0: 4e 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  N.      INSERT I
33e0: 4e 54 4f 20 6c 6f 67 20 56 41 4c 55 45 53 28 6f  NTO log VALUES(o
33f0: 6c 64 2e 72 6f 77 69 64 20 7c 7c 20 27 20 27 20  ld.rowid || ' ' 
3400: 7c 7c 20 74 79 70 65 6f 66 28 6f 6c 64 2e 72 6f  || typeof(old.ro
3410: 77 69 64 29 20 7c 7c 20 27 20 27 20 7c 7c 0a 20  wid) || ' ' ||. 
3420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3430: 20 20 20 20 20 20 20 20 20 20 20 20 6f 6c 64 2e              old.
3440: 61 20 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c 20  a     || ' ' || 
3450: 74 79 70 65 6f 66 28 6f 6c 64 2e 61 29 20 20 20  typeof(old.a)   
3460: 20 20 7c 7c 20 27 20 27 20 7c 7c 0a 20 20 20 20    || ' ' ||.    
3470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3480: 20 20 20 20 20 20 20 20 20 6f 6c 64 2e 62 20 20           old.b  
3490: 20 20 20 7c 7c 20 27 20 27 20 7c 7c 20 74 79 70     || ' ' || typ
34a0: 65 6f 66 28 6f 6c 64 2e 62 29 20 20 20 20 20 7c  eof(old.b)     |
34b0: 7c 20 27 20 27 20 7c 7c 0a 20 20 20 20 20 20 20  | ' ' ||.       
34c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34d0: 20 20 20 20 20 20 6f 6c 64 2e 63 20 20 20 20 20        old.c     
34e0: 7c 7c 20 27 20 27 20 7c 7c 20 74 79 70 65 6f 66  || ' ' || typeof
34f0: 28 6f 6c 64 2e 63 29 0a 20 20 20 20 20 20 29 3b  (old.c).      );
3500: 0a 20 20 20 20 45 4e 44 3b 0a 20 20 20 20 43 52  .    END;.    CR
3510: 45 41 54 45 20 54 52 49 47 47 45 52 20 74 34 62  EATE TRIGGER t4b
3520: 75 20 42 45 46 4f 52 45 20 55 50 44 41 54 45 20  u BEFORE UPDATE 
3530: 4f 4e 20 74 34 20 42 45 47 49 4e 0a 20 20 20 20  ON t4 BEGIN.    
3540: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c 6f    INSERT INTO lo
3550: 67 20 56 41 4c 55 45 53 28 6f 6c 64 2e 72 6f 77  g VALUES(old.row
3560: 69 64 20 7c 7c 20 27 20 27 20 7c 7c 20 74 79 70  id || ' ' || typ
3570: 65 6f 66 28 6f 6c 64 2e 72 6f 77 69 64 29 20 7c  eof(old.rowid) |
3580: 7c 20 27 20 27 20 7c 7c 0a 20 20 20 20 20 20 20  | ' ' ||.       
3590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35a0: 20 20 20 20 20 20 6f 6c 64 2e 61 20 20 20 20 20        old.a     
35b0: 7c 7c 20 27 20 27 20 7c 7c 20 74 79 70 65 6f 66  || ' ' || typeof
35c0: 28 6f 6c 64 2e 61 29 20 20 20 20 20 7c 7c 20 27  (old.a)     || '
35d0: 20 27 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20   ' ||.          
35e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35f0: 20 20 20 6f 6c 64 2e 62 20 20 20 20 20 7c 7c 20     old.b     || 
3600: 27 20 27 20 7c 7c 20 74 79 70 65 6f 66 28 6f 6c  ' ' || typeof(ol
3610: 64 2e 62 29 20 20 20 20 20 7c 7c 20 27 20 27 20  d.b)     || ' ' 
3620: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ||.             
3630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3640: 6f 6c 64 2e 63 20 20 20 20 20 7c 7c 20 27 20 27  old.c     || ' '
3650: 20 7c 7c 20 74 79 70 65 6f 66 28 6f 6c 64 2e 63   || typeof(old.c
3660: 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  ).      );.     
3670: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c 6f 67   INSERT INTO log
3680: 20 56 41 4c 55 45 53 28 6e 65 77 2e 72 6f 77 69   VALUES(new.rowi
3690: 64 20 7c 7c 20 27 20 27 20 7c 7c 20 74 79 70 65  d || ' ' || type
36a0: 6f 66 28 6e 65 77 2e 72 6f 77 69 64 29 20 7c 7c  of(new.rowid) ||
36b0: 20 27 20 27 20 7c 7c 0a 20 20 20 20 20 20 20 20   ' ' ||.        
36c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36d0: 20 20 20 20 20 6e 65 77 2e 61 20 20 20 20 20 7c       new.a     |
36e0: 7c 20 27 20 27 20 7c 7c 20 74 79 70 65 6f 66 28  | ' ' || typeof(
36f0: 6e 65 77 2e 61 29 20 20 20 20 20 7c 7c 20 27 20  new.a)     || ' 
3700: 27 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  ' ||.           
3710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3720: 20 20 6e 65 77 2e 62 20 20 20 20 20 7c 7c 20 27    new.b     || '
3730: 20 27 20 7c 7c 20 74 79 70 65 6f 66 28 6e 65 77   ' || typeof(new
3740: 2e 62 29 20 20 20 20 20 7c 7c 20 27 20 27 20 7c  .b)     || ' ' |
3750: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
3760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
3770: 65 77 2e 63 20 20 20 20 20 7c 7c 20 27 20 27 20  ew.c     || ' ' 
3780: 7c 7c 20 74 79 70 65 6f 66 28 6e 65 77 2e 63 29  || typeof(new.c)
3790: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 45 4e  .      );.    EN
37a0: 44 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 52  D;.    CREATE TR
37b0: 49 47 47 45 52 20 74 34 61 75 20 41 46 54 45 52  IGGER t4au AFTER
37c0: 20 55 50 44 41 54 45 20 4f 4e 20 74 34 20 42 45   UPDATE ON t4 BE
37d0: 47 49 4e 0a 20 20 20 20 20 20 49 4e 53 45 52 54  GIN.      INSERT
37e0: 20 49 4e 54 4f 20 6c 6f 67 20 56 41 4c 55 45 53   INTO log VALUES
37f0: 28 6f 6c 64 2e 72 6f 77 69 64 20 7c 7c 20 27 20  (old.rowid || ' 
3800: 27 20 7c 7c 20 74 79 70 65 6f 66 28 6f 6c 64 2e  ' || typeof(old.
3810: 72 6f 77 69 64 29 20 7c 7c 20 27 20 27 20 7c 7c  rowid) || ' ' ||
3820: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 6c                ol
3840: 64 2e 61 20 20 20 20 20 7c 7c 20 27 20 27 20 7c  d.a     || ' ' |
3850: 7c 20 74 79 70 65 6f 66 28 6f 6c 64 2e 61 29 20  | typeof(old.a) 
3860: 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c 0a 20 20      || ' ' ||.  
3870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3880: 20 20 20 20 20 20 20 20 20 20 20 6f 6c 64 2e 62             old.b
3890: 20 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c 20 74       || ' ' || t
38a0: 79 70 65 6f 66 28 6f 6c 64 2e 62 29 20 20 20 20  ypeof(old.b)    
38b0: 20 7c 7c 20 27 20 27 20 7c 7c 0a 20 20 20 20 20   || ' ' ||.     
38c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38d0: 20 20 20 20 20 20 20 20 6f 6c 64 2e 63 20 20 20          old.c   
38e0: 20 20 7c 7c 20 27 20 27 20 7c 7c 20 74 79 70 65    || ' ' || type
38f0: 6f 66 28 6f 6c 64 2e 63 29 0a 20 20 20 20 20 20  of(old.c).      
3900: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
3910: 49 4e 54 4f 20 6c 6f 67 20 56 41 4c 55 45 53 28  INTO log VALUES(
3920: 6e 65 77 2e 72 6f 77 69 64 20 7c 7c 20 27 20 27  new.rowid || ' '
3930: 20 7c 7c 20 74 79 70 65 6f 66 28 6e 65 77 2e 72   || typeof(new.r
3940: 6f 77 69 64 29 20 7c 7c 20 27 20 27 20 7c 7c 0a  owid) || ' ' ||.
3950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3960: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 77               new
3970: 2e 61 20 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c  .a     || ' ' ||
3980: 20 74 79 70 65 6f 66 28 6e 65 77 2e 61 29 20 20   typeof(new.a)  
3990: 20 20 20 7c 7c 20 27 20 27 20 7c 7c 0a 20 20 20     || ' ' ||.   
39a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39b0: 20 20 20 20 20 20 20 20 20 20 6e 65 77 2e 62 20            new.b 
39c0: 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c 20 74 79      || ' ' || ty
39d0: 70 65 6f 66 28 6e 65 77 2e 62 29 20 20 20 20 20  peof(new.b)     
39e0: 7c 7c 20 27 20 27 20 7c 7c 0a 20 20 20 20 20 20  || ' ' ||.      
39f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a00: 20 20 20 20 20 20 20 6e 65 77 2e 63 20 20 20 20         new.c    
3a10: 20 7c 7c 20 27 20 27 20 7c 7c 20 74 79 70 65 6f   || ' ' || typeo
3a20: 66 28 6e 65 77 2e 63 29 0a 20 20 20 20 20 20 29  f(new.c).      )
3a30: 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 7d 0a 7d  ;.    END;.  }.}
3a40: 20 7b 7d 0a 66 6f 72 65 61 63 68 20 7b 6e 20 69   {}.foreach {n i
3a50: 6e 73 65 72 74 20 6c 6f 67 7d 20 7b 0a 0a 20 20  nsert log} {..  
3a60: 32 20 7b 20 0a 20 20 20 49 4e 53 45 52 54 20 49  2 { .   INSERT I
3a70: 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 27 31  NTO t4 VALUES('1
3a80: 27 2c 20 27 31 27 2c 20 27 31 27 29 3b 0a 20 20  ', '1', '1');.  
3a90: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 34 3b   DELETE FROM t4;
3aa0: 0a 20 20 7d 20 7b 0a 20 20 20 20 2d 31 20 69 6e  .  } {.    -1 in
3ab0: 74 65 67 65 72 20 31 20 74 65 78 74 20 31 20 69  teger 1 text 1 i
3ac0: 6e 74 65 67 65 72 20 31 2e 30 20 72 65 61 6c 20  nteger 1.0 real 
3ad0: 0a 20 20 20 20 20 31 20 69 6e 74 65 67 65 72 20  .     1 integer 
3ae0: 31 20 74 65 78 74 20 31 20 69 6e 74 65 67 65 72  1 text 1 integer
3af0: 20 31 2e 30 20 72 65 61 6c 0a 20 20 20 20 20 31   1.0 real.     1
3b00: 20 69 6e 74 65 67 65 72 20 31 20 74 65 78 74 20   integer 1 text 
3b10: 31 20 69 6e 74 65 67 65 72 20 31 2e 30 20 72 65  1 integer 1.0 re
3b20: 61 6c 20 0a 20 20 20 20 20 31 20 69 6e 74 65 67  al .     1 integ
3b30: 65 72 20 31 20 74 65 78 74 20 31 20 69 6e 74 65  er 1 text 1 inte
3b40: 67 65 72 20 31 2e 30 20 72 65 61 6c 0a 20 20 7d  ger 1.0 real.  }
3b50: 0a 0a 20 20 33 20 7b 20 0a 20 20 20 49 4e 53 45  ..  3 { .   INSE
3b60: 52 54 20 49 4e 54 4f 20 74 34 28 72 6f 77 69 64  RT INTO t4(rowid
3b70: 2c 61 2c 62 2c 63 29 20 56 41 4c 55 45 53 28 34  ,a,b,c) VALUES(4
3b80: 35 2c 20 34 35 2c 20 34 35 2c 20 34 35 29 3b 0a  5, 45, 45, 45);.
3b90: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
3ba0: 34 3b 0a 20 20 7d 20 7b 0a 20 20 20 20 34 35 20  4;.  } {.    45 
3bb0: 69 6e 74 65 67 65 72 20 34 35 20 74 65 78 74 20  integer 45 text 
3bc0: 34 35 20 69 6e 74 65 67 65 72 20 34 35 2e 30 20  45 integer 45.0 
3bd0: 72 65 61 6c 0a 20 20 20 20 34 35 20 69 6e 74 65  real.    45 inte
3be0: 67 65 72 20 34 35 20 74 65 78 74 20 34 35 20 69  ger 45 text 45 i
3bf0: 6e 74 65 67 65 72 20 34 35 2e 30 20 72 65 61 6c  nteger 45.0 real
3c00: 0a 20 20 20 20 34 35 20 69 6e 74 65 67 65 72 20  .    45 integer 
3c10: 34 35 20 74 65 78 74 20 34 35 20 69 6e 74 65 67  45 text 45 integ
3c20: 65 72 20 34 35 2e 30 20 72 65 61 6c 0a 20 20 20  er 45.0 real.   
3c30: 20 34 35 20 69 6e 74 65 67 65 72 20 34 35 20 74   45 integer 45 t
3c40: 65 78 74 20 34 35 20 69 6e 74 65 67 65 72 20 34  ext 45 integer 4
3c50: 35 2e 30 20 72 65 61 6c 0a 20 20 7d 0a 0a 20 20  5.0 real.  }..  
3c60: 34 20 7b 20 0a 20 20 20 49 4e 53 45 52 54 20 49  4 { .   INSERT I
3c70: 4e 54 4f 20 74 34 28 72 6f 77 69 64 2c 61 2c 62  NTO t4(rowid,a,b
3c80: 2c 63 29 20 56 41 4c 55 45 53 28 2d 34 32 2e 30  ,c) VALUES(-42.0
3c90: 2c 20 2d 34 32 2e 30 2c 20 2d 34 32 2e 30 2c 20  , -42.0, -42.0, 
3ca0: 2d 34 32 2e 30 29 3b 0a 20 20 20 44 45 4c 45 54  -42.0);.   DELET
3cb0: 45 20 46 52 4f 4d 20 74 34 3b 0a 20 20 7d 20 7b  E FROM t4;.  } {
3cc0: 0a 20 20 20 20 2d 34 32 20 69 6e 74 65 67 65 72  .    -42 integer
3cd0: 20 2d 34 32 2e 30 20 74 65 78 74 20 2d 34 32 20   -42.0 text -42 
3ce0: 69 6e 74 65 67 65 72 20 2d 34 32 2e 30 20 72 65  integer -42.0 re
3cf0: 61 6c 20 0a 20 20 20 20 2d 34 32 20 69 6e 74 65  al .    -42 inte
3d00: 67 65 72 20 2d 34 32 2e 30 20 74 65 78 74 20 2d  ger -42.0 text -
3d10: 34 32 20 69 6e 74 65 67 65 72 20 2d 34 32 2e 30  42 integer -42.0
3d20: 20 72 65 61 6c 0a 20 20 20 20 2d 34 32 20 69 6e   real.    -42 in
3d30: 74 65 67 65 72 20 2d 34 32 2e 30 20 74 65 78 74  teger -42.0 text
3d40: 20 2d 34 32 20 69 6e 74 65 67 65 72 20 2d 34 32   -42 integer -42
3d50: 2e 30 20 72 65 61 6c 20 0a 20 20 20 20 2d 34 32  .0 real .    -42
3d60: 20 69 6e 74 65 67 65 72 20 2d 34 32 2e 30 20 74   integer -42.0 t
3d70: 65 78 74 20 2d 34 32 20 69 6e 74 65 67 65 72 20  ext -42 integer 
3d80: 2d 34 32 2e 30 20 72 65 61 6c 0a 20 20 7d 0a 0a  -42.0 real.  }..
3d90: 20 20 35 20 7b 20 0a 20 20 20 49 4e 53 45 52 54    5 { .   INSERT
3da0: 20 49 4e 54 4f 20 74 34 28 72 6f 77 69 64 2c 61   INTO t4(rowid,a
3db0: 2c 62 2c 63 29 20 56 41 4c 55 45 53 28 4e 55 4c  ,b,c) VALUES(NUL
3dc0: 4c 2c 20 2d 34 32 2e 34 2c 20 2d 34 32 2e 34 2c  L, -42.4, -42.4,
3dd0: 20 2d 34 32 2e 34 29 3b 0a 20 20 20 44 45 4c 45   -42.4);.   DELE
3de0: 54 45 20 46 52 4f 4d 20 74 34 3b 0a 20 20 7d 20  TE FROM t4;.  } 
3df0: 7b 0a 20 20 20 20 2d 31 20 69 6e 74 65 67 65 72  {.    -1 integer
3e00: 20 2d 34 32 2e 34 20 74 65 78 74 20 2d 34 32 2e   -42.4 text -42.
3e10: 34 20 72 65 61 6c 20 2d 34 32 2e 34 20 72 65 61  4 real -42.4 rea
3e20: 6c 0a 20 20 20 20 20 31 20 69 6e 74 65 67 65 72  l.     1 integer
3e30: 20 2d 34 32 2e 34 20 74 65 78 74 20 2d 34 32 2e   -42.4 text -42.
3e40: 34 20 72 65 61 6c 20 2d 34 32 2e 34 20 72 65 61  4 real -42.4 rea
3e50: 6c 0a 20 20 20 20 20 31 20 69 6e 74 65 67 65 72  l.     1 integer
3e60: 20 2d 34 32 2e 34 20 74 65 78 74 20 2d 34 32 2e   -42.4 text -42.
3e70: 34 20 72 65 61 6c 20 2d 34 32 2e 34 20 72 65 61  4 real -42.4 rea
3e80: 6c 0a 20 20 20 20 20 31 20 69 6e 74 65 67 65 72  l.     1 integer
3e90: 20 2d 34 32 2e 34 20 74 65 78 74 20 2d 34 32 2e   -42.4 text -42.
3ea0: 34 20 72 65 61 6c 20 2d 34 32 2e 34 20 72 65 61  4 real -42.4 rea
3eb0: 6c 0a 20 20 7d 0a 0a 20 20 36 20 7b 20 0a 20 20  l.  }..  6 { .  
3ec0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20   INSERT INTO t4 
3ed0: 56 41 4c 55 45 53 28 37 2c 20 37 2c 20 37 29 3b  VALUES(7, 7, 7);
3ee0: 0a 20 20 20 55 50 44 41 54 45 20 74 34 20 53 45  .   UPDATE t4 SE
3ef0: 54 20 61 3d 38 2c 20 62 3d 38 2c 20 63 3d 38 3b  T a=8, b=8, c=8;
3f00: 0a 20 20 7d 20 7b 0a 20 20 20 20 2d 31 20 69 6e  .  } {.    -1 in
3f10: 74 65 67 65 72 20 37 20 74 65 78 74 20 37 20 69  teger 7 text 7 i
3f20: 6e 74 65 67 65 72 20 37 2e 30 20 72 65 61 6c 0a  nteger 7.0 real.
3f30: 20 20 20 20 20 31 20 69 6e 74 65 67 65 72 20 37       1 integer 7
3f40: 20 74 65 78 74 20 37 20 69 6e 74 65 67 65 72 20   text 7 integer 
3f50: 37 2e 30 20 72 65 61 6c 0a 20 20 20 20 20 31 20  7.0 real.     1 
3f60: 69 6e 74 65 67 65 72 20 37 20 74 65 78 74 20 37  integer 7 text 7
3f70: 20 69 6e 74 65 67 65 72 20 37 2e 30 20 72 65 61   integer 7.0 rea
3f80: 6c 0a 20 20 20 20 20 31 20 69 6e 74 65 67 65 72  l.     1 integer
3f90: 20 38 20 74 65 78 74 20 38 20 69 6e 74 65 67 65   8 text 8 intege
3fa0: 72 20 38 2e 30 20 72 65 61 6c 0a 20 20 20 20 20  r 8.0 real.     
3fb0: 31 20 69 6e 74 65 67 65 72 20 37 20 74 65 78 74  1 integer 7 text
3fc0: 20 37 20 69 6e 74 65 67 65 72 20 37 2e 30 20 72   7 integer 7.0 r
3fd0: 65 61 6c 0a 20 20 20 20 20 31 20 69 6e 74 65 67  eal.     1 integ
3fe0: 65 72 20 38 20 74 65 78 74 20 38 20 69 6e 74 65  er 8 text 8 inte
3ff0: 67 65 72 20 38 2e 30 20 72 65 61 6c 0a 20 20 7d  ger 8.0 real.  }
4000: 0a 0a 20 20 37 20 7b 20 0a 20 20 20 55 50 44 41  ..  7 { .   UPDA
4010: 54 45 20 74 34 20 53 45 54 20 72 6f 77 69 64 3d  TE t4 SET rowid=
4020: 32 3b 0a 20 20 7d 20 7b 0a 20 20 20 20 20 31 20  2;.  } {.     1 
4030: 69 6e 74 65 67 65 72 20 38 20 74 65 78 74 20 38  integer 8 text 8
4040: 20 69 6e 74 65 67 65 72 20 38 2e 30 20 72 65 61   integer 8.0 rea
4050: 6c 0a 20 20 20 20 20 32 20 69 6e 74 65 67 65 72  l.     2 integer
4060: 20 38 20 74 65 78 74 20 38 20 69 6e 74 65 67 65   8 text 8 intege
4070: 72 20 38 2e 30 20 72 65 61 6c 0a 20 20 20 20 20  r 8.0 real.     
4080: 31 20 69 6e 74 65 67 65 72 20 38 20 74 65 78 74  1 integer 8 text
4090: 20 38 20 69 6e 74 65 67 65 72 20 38 2e 30 20 72   8 integer 8.0 r
40a0: 65 61 6c 0a 20 20 20 20 20 32 20 69 6e 74 65 67  eal.     2 integ
40b0: 65 72 20 38 20 74 65 78 74 20 38 20 69 6e 74 65  er 8 text 8 inte
40c0: 67 65 72 20 38 2e 30 20 72 65 61 6c 0a 20 20 7d  ger 8.0 real.  }
40d0: 0a 0a 20 20 38 20 7b 20 0a 20 20 20 55 50 44 41  ..  8 { .   UPDA
40e0: 54 45 20 74 34 20 53 45 54 20 61 3d 27 39 27 2c  TE t4 SET a='9',
40f0: 20 62 3d 27 39 27 2c 20 63 3d 27 39 27 3b 0a 20   b='9', c='9';. 
4100: 20 7d 20 7b 0a 20 20 20 20 20 32 20 69 6e 74 65   } {.     2 inte
4110: 67 65 72 20 38 20 74 65 78 74 20 38 20 69 6e 74  ger 8 text 8 int
4120: 65 67 65 72 20 38 2e 30 20 72 65 61 6c 0a 20 20  eger 8.0 real.  
4130: 20 20 20 32 20 69 6e 74 65 67 65 72 20 39 20 74     2 integer 9 t
4140: 65 78 74 20 39 20 69 6e 74 65 67 65 72 20 39 2e  ext 9 integer 9.
4150: 30 20 72 65 61 6c 0a 20 20 20 20 20 32 20 69 6e  0 real.     2 in
4160: 74 65 67 65 72 20 38 20 74 65 78 74 20 38 20 69  teger 8 text 8 i
4170: 6e 74 65 67 65 72 20 38 2e 30 20 72 65 61 6c 0a  nteger 8.0 real.
4180: 20 20 20 20 20 32 20 69 6e 74 65 67 65 72 20 39       2 integer 9
4190: 20 74 65 78 74 20 39 20 69 6e 74 65 67 65 72 20   text 9 integer 
41a0: 39 2e 30 20 72 65 61 6c 0a 20 20 7d 0a 0a 20 20  9.0 real.  }..  
41b0: 39 20 7b 20 0a 20 20 20 55 50 44 41 54 45 20 74  9 { .   UPDATE t
41c0: 34 20 53 45 54 20 61 3d 27 39 2e 31 27 2c 20 62  4 SET a='9.1', b
41d0: 3d 27 39 2e 31 27 2c 20 63 3d 27 39 2e 31 27 3b  ='9.1', c='9.1';
41e0: 0a 20 20 7d 20 7b 0a 20 20 20 20 20 32 20 69 6e  .  } {.     2 in
41f0: 74 65 67 65 72 20 39 20 20 20 74 65 78 74 20 39  teger 9   text 9
4200: 20 20 20 69 6e 74 65 67 65 72 20 39 2e 30 20 72     integer 9.0 r
4210: 65 61 6c 0a 20 20 20 20 20 32 20 69 6e 74 65 67  eal.     2 integ
4220: 65 72 20 39 2e 31 20 74 65 78 74 20 39 2e 31 20  er 9.1 text 9.1 
4230: 72 65 61 6c 20 20 20 20 39 2e 31 20 72 65 61 6c  real    9.1 real
4240: 0a 20 20 20 20 20 32 20 69 6e 74 65 67 65 72 20  .     2 integer 
4250: 39 20 20 20 74 65 78 74 20 39 20 20 20 69 6e 74  9   text 9   int
4260: 65 67 65 72 20 39 2e 30 20 72 65 61 6c 0a 20 20  eger 9.0 real.  
4270: 20 20 20 32 20 69 6e 74 65 67 65 72 20 39 2e 31     2 integer 9.1
4280: 20 74 65 78 74 20 39 2e 31 20 72 65 61 6c 20 20   text 9.1 real  
4290: 20 20 39 2e 31 20 72 65 61 6c 0a 20 20 7d 0a 7d    9.1 real.  }.}
42a0: 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 74 72 69   {.  do_test tri
42b0: 67 67 65 72 43 2d 34 2e 31 2e 24 6e 20 7b 0a 20  ggerC-4.1.$n {. 
42c0: 20 20 20 65 76 61 6c 20 63 6f 6e 63 61 74 20 5b     eval concat [
42d0: 65 78 65 63 73 71 6c 20 22 20 0a 20 20 20 20 20  execsql " .     
42e0: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 6c 6f 67   DELETE FROM log
42f0: 3b 0a 20 20 20 20 20 20 24 69 6e 73 65 72 74 20  ;.      $insert 
4300: 3b 20 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  ; .      SELECT 
4310: 2a 20 46 52 4f 4d 20 6c 6f 67 20 4f 52 44 45 52  * FROM log ORDER
4320: 20 42 59 20 72 6f 77 69 64 3b 0a 20 20 20 20 22   BY rowid;.    "
4330: 5d 0a 20 20 7d 20 5b 6a 6f 69 6e 20 24 6c 6f 67  ].  } [join $log
4340: 20 22 20 22 5d 0a 7d 20 0a 0a 23 2d 2d 2d 2d 2d   " "].} ..#-----
4350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4390: 2d 2d 2d 2d 0a 23 20 54 68 69 73 20 62 6c 6f 63  ----.# This bloc
43a0: 6b 20 6f 66 20 74 65 73 74 73 2c 20 74 72 69 67  k of tests, trig
43b0: 67 65 72 43 2d 35 2e 2a 2c 20 74 65 73 74 20 74  gerC-5.*, test t
43c0: 68 61 74 20 44 45 4c 45 54 45 20 74 72 69 67 67  hat DELETE trigg
43d0: 65 72 73 20 61 72 65 20 66 69 72 65 64 0a 23 20  ers are fired.# 
43e0: 69 66 20 61 20 72 6f 77 20 69 73 20 64 65 6c 65  if a row is dele
43f0: 74 65 64 20 61 73 20 61 20 72 65 73 75 6c 74 20  ted as a result 
4400: 6f 66 20 4f 52 20 52 45 50 4c 41 43 45 20 63 6f  of OR REPLACE co
4410: 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
4420: 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 74 72 69  n..#.do_test tri
4430: 67 67 65 72 43 2d 35 2e 31 2e 30 20 7b 0a 20 20  ggerC-5.1.0 {.  
4440: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 52  execsql {.    DR
4450: 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 53  OP TABLE IF EXIS
4460: 54 53 20 74 35 3b 0a 20 20 20 20 43 52 45 41 54  TS t5;.    CREAT
4470: 45 20 54 41 42 4c 45 20 74 35 28 61 20 49 4e 54  E TABLE t5(a INT
4480: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
4490: 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , b);.    CREATE
44a0: 20 55 4e 49 51 55 45 20 49 4e 44 45 58 20 74 35   UNIQUE INDEX t5
44b0: 69 20 4f 4e 20 74 35 28 62 29 3b 0a 20 20 20 20  i ON t5(b);.    
44c0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 35 20 56  INSERT INTO t5 V
44d0: 41 4c 55 45 53 28 31 2c 20 27 61 27 29 3b 0a 20  ALUES(1, 'a');. 
44e0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
44f0: 35 20 56 41 4c 55 45 53 28 32 2c 20 27 62 27 29  5 VALUES(2, 'b')
4500: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
4510: 4f 20 74 35 20 56 41 4c 55 45 53 28 33 2c 20 27  O t5 VALUES(3, '
4520: 63 27 29 3b 0a 0a 20 20 20 20 43 52 45 41 54 45  c');..    CREATE
4530: 20 54 41 42 4c 45 20 74 35 67 28 61 2c 20 62 2c   TABLE t5g(a, b,
4540: 20 63 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   c);.    CREATE 
4550: 54 52 49 47 47 45 52 20 74 35 74 20 42 45 46 4f  TRIGGER t5t BEFO
4560: 52 45 20 44 45 4c 45 54 45 20 4f 4e 20 74 35 20  RE DELETE ON t5 
4570: 42 45 47 49 4e 0a 20 20 20 20 20 20 49 4e 53 45  BEGIN.      INSE
4580: 52 54 20 49 4e 54 4f 20 74 35 67 20 56 41 4c 55  RT INTO t5g VALU
4590: 45 53 28 6f 6c 64 2e 61 2c 20 6f 6c 64 2e 62 2c  ES(old.a, old.b,
45a0: 20 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   (SELECT count(*
45b0: 29 20 46 52 4f 4d 20 74 35 29 29 3b 0a 20 20 20  ) FROM t5));.   
45c0: 20 45 4e 44 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 66   END;.  }.} {}.f
45d0: 6f 72 65 61 63 68 20 7b 6e 20 64 6d 6c 20 74 35  oreach {n dml t5
45e0: 67 20 74 35 7d 20 7b 0a 20 20 31 20 22 44 45 4c  g t5} {.  1 "DEL
45f0: 45 54 45 20 46 52 4f 4d 20 74 35 20 57 48 45 52  ETE FROM t5 WHER
4600: 45 20 61 3d 32 22 20 20 20 20 20 20 20 20 20 20  E a=2"          
4610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 32                {2
4620: 20 62 20 33 7d 20 7b 31 20 61 20 33 20 63 7d 0a   b 3} {1 a 3 c}.
4630: 20 20 32 20 22 49 4e 53 45 52 54 20 4f 52 20 52    2 "INSERT OR R
4640: 45 50 4c 41 43 45 20 49 4e 54 4f 20 74 35 20 56  EPLACE INTO t5 V
4650: 41 4c 55 45 53 28 32 2c 20 27 64 27 29 22 20 20  ALUES(2, 'd')"  
4660: 20 20 20 20 20 20 7b 32 20 62 20 33 7d 20 7b 31        {2 b 3} {1
4670: 20 61 20 32 20 64 20 33 20 63 7d 0a 20 20 33 20   a 2 d 3 c}.  3 
4680: 22 55 50 44 41 54 45 20 4f 52 20 52 45 50 4c 41  "UPDATE OR REPLA
4690: 43 45 20 74 35 20 53 45 54 20 61 20 3d 20 32 20  CE t5 SET a = 2 
46a0: 57 48 45 52 45 20 61 20 3d 20 33 22 20 20 20 20  WHERE a = 3"    
46b0: 20 20 7b 32 20 62 20 33 7d 20 7b 31 20 61 20 32    {2 b 3} {1 a 2
46c0: 20 63 7d 0a 20 20 34 20 22 49 4e 53 45 52 54 20   c}.  4 "INSERT 
46d0: 4f 52 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20  OR REPLACE INTO 
46e0: 74 35 20 56 41 4c 55 45 53 28 34 2c 20 27 62 27  t5 VALUES(4, 'b'
46f0: 29 22 20 20 20 20 20 20 20 20 7b 32 20 62 20 33  )"        {2 b 3
4700: 7d 20 7b 31 20 61 20 33 20 63 20 34 20 62 7d 0a  } {1 a 3 c 4 b}.
4710: 20 20 35 20 22 55 50 44 41 54 45 20 4f 52 20 52    5 "UPDATE OR R
4720: 45 50 4c 41 43 45 20 74 35 20 53 45 54 20 62 20  EPLACE t5 SET b 
4730: 3d 20 27 62 27 20 57 48 45 52 45 20 62 20 3d 20  = 'b' WHERE b = 
4740: 27 63 27 22 20 20 7b 32 20 62 20 33 7d 20 7b 31  'c'"  {2 b 3} {1
4750: 20 61 20 33 20 62 7d 0a 20 20 36 20 22 49 4e 53   a 3 b}.  6 "INS
4760: 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20 49  ERT OR REPLACE I
4770: 4e 54 4f 20 74 35 20 56 41 4c 55 45 53 28 32 2c  NTO t5 VALUES(2,
4780: 20 27 63 27 29 22 20 20 20 20 20 20 20 20 7b 32   'c')"        {2
4790: 20 62 20 33 20 33 20 63 20 32 7d 20 7b 31 20 61   b 3 3 c 2} {1 a
47a0: 20 32 20 63 7d 0a 20 20 37 20 22 55 50 44 41 54   2 c}.  7 "UPDAT
47b0: 45 20 4f 52 20 52 45 50 4c 41 43 45 20 74 35 20  E OR REPLACE t5 
47c0: 53 45 54 20 61 3d 31 2c 20 62 3d 27 62 27 20 57  SET a=1, b='b' W
47d0: 48 45 52 45 20 61 20 3d 20 33 22 20 7b 31 20 61  HERE a = 3" {1 a
47e0: 20 33 20 32 20 62 20 32 7d 20 7b 31 20 62 7d 0a   3 2 b 2} {1 b}.
47f0: 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 74 72  } {.  do_test tr
4800: 69 67 67 65 72 43 2d 35 2e 31 2e 24 6e 20 7b 0a  iggerC-5.1.$n {.
4810: 20 20 20 20 65 78 65 63 73 71 6c 20 22 0a 20 20      execsql ".  
4820: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
4830: 20 20 20 24 64 6d 6c 20 3b 0a 20 20 20 20 20 20     $dml ;.      
4840: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
4850: 74 35 67 20 4f 52 44 45 52 20 42 59 20 72 6f 77  t5g ORDER BY row
4860: 69 64 3b 0a 20 20 20 20 20 20 20 20 53 45 4c 45  id;.        SELE
4870: 43 54 20 2a 20 46 52 4f 4d 20 74 35 20 4f 52 44  CT * FROM t5 ORD
4880: 45 52 20 42 59 20 72 6f 77 69 64 3b 0a 20 20 20  ER BY rowid;.   
4890: 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20     ROLLBACK;.   
48a0: 20 22 0a 20 20 7d 20 5b 63 6f 6e 63 61 74 20 24   ".  } [concat $
48b0: 74 35 67 20 24 74 35 5d 0a 7d 0a 64 6f 5f 74 65  t5g $t5].}.do_te
48c0: 73 74 20 74 72 69 67 67 65 72 43 2d 35 2e 32 2e  st triggerC-5.2.
48d0: 30 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  0 {.  execsql {.
48e0: 20 20 20 20 44 52 4f 50 20 54 52 49 47 47 45 52      DROP TRIGGER
48f0: 20 74 35 74 3b 0a 20 20 20 20 43 52 45 41 54 45   t5t;.    CREATE
4900: 20 54 52 49 47 47 45 52 20 74 35 74 20 41 46 54   TRIGGER t5t AFT
4910: 45 52 20 44 45 4c 45 54 45 20 4f 4e 20 74 35 20  ER DELETE ON t5 
4920: 42 45 47 49 4e 0a 20 20 20 20 20 20 49 4e 53 45  BEGIN.      INSE
4930: 52 54 20 49 4e 54 4f 20 74 35 67 20 56 41 4c 55  RT INTO t5g VALU
4940: 45 53 28 6f 6c 64 2e 61 2c 20 6f 6c 64 2e 62 2c  ES(old.a, old.b,
4950: 20 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   (SELECT count(*
4960: 29 20 46 52 4f 4d 20 74 35 29 29 3b 0a 20 20 20  ) FROM t5));.   
4970: 20 45 4e 44 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 66   END;.  }.} {}.f
4980: 6f 72 65 61 63 68 20 7b 6e 20 64 6d 6c 20 74 35  oreach {n dml t5
4990: 67 20 74 35 7d 20 7b 0a 20 20 31 20 22 44 45 4c  g t5} {.  1 "DEL
49a0: 45 54 45 20 46 52 4f 4d 20 74 35 20 57 48 45 52  ETE FROM t5 WHER
49b0: 45 20 61 3d 32 22 20 20 20 20 20 20 20 20 20 20  E a=2"          
49c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 32                {2
49d0: 20 62 20 32 7d 20 7b 31 20 61 20 33 20 63 7d 0a   b 2} {1 a 3 c}.
49e0: 20 20 32 20 22 49 4e 53 45 52 54 20 4f 52 20 52    2 "INSERT OR R
49f0: 45 50 4c 41 43 45 20 49 4e 54 4f 20 74 35 20 56  EPLACE INTO t5 V
4a00: 41 4c 55 45 53 28 32 2c 20 27 64 27 29 22 20 20  ALUES(2, 'd')"  
4a10: 20 20 20 20 20 20 7b 32 20 62 20 32 7d 20 7b 31        {2 b 2} {1
4a20: 20 61 20 32 20 64 20 33 20 63 7d 0a 20 20 33 20   a 2 d 3 c}.  3 
4a30: 22 55 50 44 41 54 45 20 4f 52 20 52 45 50 4c 41  "UPDATE OR REPLA
4a40: 43 45 20 74 35 20 53 45 54 20 61 20 3d 20 32 20  CE t5 SET a = 2 
4a50: 57 48 45 52 45 20 61 20 3d 20 33 22 20 20 20 20  WHERE a = 3"    
4a60: 20 20 7b 32 20 62 20 32 7d 20 7b 31 20 61 20 32    {2 b 2} {1 a 2
4a70: 20 63 7d 0a 20 20 34 20 22 49 4e 53 45 52 54 20   c}.  4 "INSERT 
4a80: 4f 52 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20  OR REPLACE INTO 
4a90: 74 35 20 56 41 4c 55 45 53 28 34 2c 20 27 62 27  t5 VALUES(4, 'b'
4aa0: 29 22 20 20 20 20 20 20 20 20 7b 32 20 62 20 32  )"        {2 b 2
4ab0: 7d 20 7b 31 20 61 20 33 20 63 20 34 20 62 7d 0a  } {1 a 3 c 4 b}.
4ac0: 20 20 35 20 22 55 50 44 41 54 45 20 4f 52 20 52    5 "UPDATE OR R
4ad0: 45 50 4c 41 43 45 20 74 35 20 53 45 54 20 62 20  EPLACE t5 SET b 
4ae0: 3d 20 27 62 27 20 57 48 45 52 45 20 62 20 3d 20  = 'b' WHERE b = 
4af0: 27 63 27 22 20 20 7b 32 20 62 20 32 7d 20 7b 31  'c'"  {2 b 2} {1
4b00: 20 61 20 33 20 62 7d 0a 20 20 36 20 22 49 4e 53   a 3 b}.  6 "INS
4b10: 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20 49  ERT OR REPLACE I
4b20: 4e 54 4f 20 74 35 20 56 41 4c 55 45 53 28 32 2c  NTO t5 VALUES(2,
4b30: 20 27 63 27 29 22 20 20 20 20 20 20 20 20 7b 32   'c')"        {2
4b40: 20 62 20 32 20 33 20 63 20 31 7d 20 7b 31 20 61   b 2 3 c 1} {1 a
4b50: 20 32 20 63 7d 0a 20 20 37 20 22 55 50 44 41 54   2 c}.  7 "UPDAT
4b60: 45 20 4f 52 20 52 45 50 4c 41 43 45 20 74 35 20  E OR REPLACE t5 
4b70: 53 45 54 20 61 3d 31 2c 20 62 3d 27 62 27 20 57  SET a=1, b='b' W
4b80: 48 45 52 45 20 61 20 3d 20 33 22 20 7b 31 20 61  HERE a = 3" {1 a
4b90: 20 32 20 32 20 62 20 31 7d 20 7b 31 20 62 7d 0a   2 2 b 1} {1 b}.
4ba0: 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 74 72  } {.  do_test tr
4bb0: 69 67 67 65 72 43 2d 35 2e 32 2e 24 6e 20 7b 0a  iggerC-5.2.$n {.
4bc0: 20 20 20 20 65 78 65 63 73 71 6c 20 22 0a 20 20      execsql ".  
4bd0: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
4be0: 20 20 20 24 64 6d 6c 20 3b 0a 20 20 20 20 20 20     $dml ;.      
4bf0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
4c00: 74 35 67 20 4f 52 44 45 52 20 42 59 20 72 6f 77  t5g ORDER BY row
4c10: 69 64 3b 0a 20 20 20 20 20 20 20 20 53 45 4c 45  id;.        SELE
4c20: 43 54 20 2a 20 46 52 4f 4d 20 74 35 20 4f 52 44  CT * FROM t5 ORD
4c30: 45 52 20 42 59 20 72 6f 77 69 64 3b 0a 20 20 20  ER BY rowid;.   
4c40: 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20     ROLLBACK;.   
4c50: 20 22 0a 20 20 7d 20 5b 63 6f 6e 63 61 74 20 24   ".  } [concat $
4c60: 74 35 67 20 24 74 35 5d 0a 7d 0a 64 6f 5f 74 65  t5g $t5].}.do_te
4c70: 73 74 20 74 72 69 67 67 65 72 43 2d 35 2e 33 2e  st triggerC-5.3.
4c80: 30 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  0 {.  execsql { 
4c90: 50 52 41 47 4d 41 20 72 65 63 75 72 73 69 76 65  PRAGMA recursive
4ca0: 5f 74 72 69 67 67 65 72 73 20 3d 20 6f 66 66 20  _triggers = off 
4cb0: 7d 0a 7d 20 7b 7d 0a 66 6f 72 65 61 63 68 20 7b  }.} {}.foreach {
4cc0: 6e 20 64 6d 6c 20 74 35 67 20 74 35 7d 20 7b 0a  n dml t5g t5} {.
4cd0: 20 20 31 20 22 44 45 4c 45 54 45 20 46 52 4f 4d    1 "DELETE FROM
4ce0: 20 74 35 20 57 48 45 52 45 20 61 3d 32 22 20 20   t5 WHERE a=2"  
4cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d00: 20 20 20 20 20 20 7b 32 20 62 20 32 7d 20 7b 31        {2 b 2} {1
4d10: 20 61 20 33 20 63 7d 0a 20 20 32 20 22 49 4e 53   a 3 c}.  2 "INS
4d20: 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20 49  ERT OR REPLACE I
4d30: 4e 54 4f 20 74 35 20 56 41 4c 55 45 53 28 32 2c  NTO t5 VALUES(2,
4d40: 20 27 64 27 29 22 20 20 20 20 20 20 20 20 7b 7d   'd')"        {}
4d50: 20 7b 31 20 61 20 32 20 64 20 33 20 63 7d 0a 20   {1 a 2 d 3 c}. 
4d60: 20 33 20 22 55 50 44 41 54 45 20 4f 52 20 52 45   3 "UPDATE OR RE
4d70: 50 4c 41 43 45 20 74 35 20 53 45 54 20 61 20 3d  PLACE t5 SET a =
4d80: 20 32 20 57 48 45 52 45 20 61 20 3d 20 33 22 20   2 WHERE a = 3" 
4d90: 20 20 20 20 20 7b 7d 20 7b 31 20 61 20 32 20 63       {} {1 a 2 c
4da0: 7d 0a 20 20 34 20 22 49 4e 53 45 52 54 20 4f 52  }.  4 "INSERT OR
4db0: 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 74 35   REPLACE INTO t5
4dc0: 20 56 41 4c 55 45 53 28 34 2c 20 27 62 27 29 22   VALUES(4, 'b')"
4dd0: 20 20 20 20 20 20 20 20 7b 7d 20 7b 31 20 61 20          {} {1 a 
4de0: 33 20 63 20 34 20 62 7d 0a 20 20 35 20 22 55 50  3 c 4 b}.  5 "UP
4df0: 44 41 54 45 20 4f 52 20 52 45 50 4c 41 43 45 20  DATE OR REPLACE 
4e00: 74 35 20 53 45 54 20 62 20 3d 20 27 62 27 20 57  t5 SET b = 'b' W
4e10: 48 45 52 45 20 62 20 3d 20 27 63 27 22 20 20 7b  HERE b = 'c'"  {
4e20: 7d 20 7b 31 20 61 20 33 20 62 7d 0a 20 20 36 20  } {1 a 3 b}.  6 
4e30: 22 49 4e 53 45 52 54 20 4f 52 20 52 45 50 4c 41  "INSERT OR REPLA
4e40: 43 45 20 49 4e 54 4f 20 74 35 20 56 41 4c 55 45  CE INTO t5 VALUE
4e50: 53 28 32 2c 20 27 63 27 29 22 20 20 20 20 20 20  S(2, 'c')"      
4e60: 20 20 7b 7d 20 7b 31 20 61 20 32 20 63 7d 0a 20    {} {1 a 2 c}. 
4e70: 20 37 20 22 55 50 44 41 54 45 20 4f 52 20 52 45   7 "UPDATE OR RE
4e80: 50 4c 41 43 45 20 74 35 20 53 45 54 20 61 3d 31  PLACE t5 SET a=1
4e90: 2c 20 62 3d 27 62 27 20 57 48 45 52 45 20 61 20  , b='b' WHERE a 
4ea0: 3d 20 33 22 20 7b 7d 20 7b 31 20 62 7d 0a 7d 20  = 3" {} {1 b}.} 
4eb0: 7b 0a 20 20 64 6f 5f 74 65 73 74 20 74 72 69 67  {.  do_test trig
4ec0: 67 65 72 43 2d 35 2e 33 2e 24 6e 20 7b 0a 20 20  gerC-5.3.$n {.  
4ed0: 20 20 65 78 65 63 73 71 6c 20 22 0a 20 20 20 20    execsql ".    
4ee0: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 20    BEGIN;.       
4ef0: 20 24 64 6d 6c 20 3b 0a 20 20 20 20 20 20 20 20   $dml ;.        
4f00: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 35  SELECT * FROM t5
4f10: 67 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64  g ORDER BY rowid
4f20: 3b 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  ;.        SELECT
4f30: 20 2a 20 46 52 4f 4d 20 74 35 20 4f 52 44 45 52   * FROM t5 ORDER
4f40: 20 42 59 20 72 6f 77 69 64 3b 0a 20 20 20 20 20   BY rowid;.     
4f50: 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 22   ROLLBACK;.    "
4f60: 0a 20 20 7d 20 5b 63 6f 6e 63 61 74 20 24 74 35  .  } [concat $t5
4f70: 67 20 24 74 35 5d 0a 7d 0a 64 6f 5f 74 65 73 74  g $t5].}.do_test
4f80: 20 74 72 69 67 67 65 72 43 2d 35 2e 33 2e 38 20   triggerC-5.3.8 
4f90: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52  {.  execsql { PR
4fa0: 41 47 4d 41 20 72 65 63 75 72 73 69 76 65 5f 74  AGMA recursive_t
4fb0: 72 69 67 67 65 72 73 20 3d 20 6f 6e 20 7d 0a 7d  riggers = on }.}
4fc0: 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   {}..#----------
4fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
5010: 23 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20  # This block of 
5020: 74 65 73 74 73 2c 20 74 72 69 67 67 65 72 43 2d  tests, triggerC-
5030: 36 2e 2a 2c 20 74 65 73 74 73 20 74 68 61 74 20  6.*, tests that 
5040: 22 50 52 41 47 4d 41 20 72 65 63 75 72 73 69 76  "PRAGMA recursiv
5050: 65 5f 74 72 69 67 67 65 72 73 22 0a 23 20 73 74  e_triggers".# st
5060: 61 74 65 6d 65 6e 74 73 20 72 65 74 75 72 6e 20  atements return 
5070: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
5080: 65 20 6f 66 20 74 68 65 20 72 65 63 75 72 73 69  e of the recursi
5090: 76 65 20 74 72 69 67 67 65 72 73 20 66 6c 61 67  ve triggers flag
50a0: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 74 72 69 67  ..#.do_test trig
50b0: 67 65 72 43 2d 36 2e 31 20 7b 0a 20 20 65 78 65  gerC-6.1 {.  exe
50c0: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 72 65  csql { PRAGMA re
50d0: 63 75 72 73 69 76 65 5f 74 72 69 67 67 65 72 73  cursive_triggers
50e0: 20 7d 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74   }.} {1}.do_test
50f0: 20 74 72 69 67 67 65 72 43 2d 36 2e 32 20 7b 0a   triggerC-6.2 {.
5100: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
5110: 20 50 52 41 47 4d 41 20 72 65 63 75 72 73 69 76   PRAGMA recursiv
5120: 65 5f 74 72 69 67 67 65 72 73 20 3d 20 6f 66 66  e_triggers = off
5130: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 72 65 63  ;.    PRAGMA rec
5140: 75 72 73 69 76 65 5f 74 72 69 67 67 65 72 73 3b  ursive_triggers;
5150: 0a 20 20 7d 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65  .  }.} {0}.do_te
5160: 73 74 20 74 72 69 67 67 65 72 43 2d 36 2e 33 20  st triggerC-6.3 
5170: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20  {.  execsql { . 
5180: 20 20 20 50 52 41 47 4d 41 20 72 65 63 75 72 73     PRAGMA recurs
5190: 69 76 65 5f 74 72 69 67 67 65 72 73 20 3d 20 6f  ive_triggers = o
51a0: 6e 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 72 65  n;.    PRAGMA re
51b0: 63 75 72 73 69 76 65 5f 74 72 69 67 67 65 72 73  cursive_triggers
51c0: 3b 0a 20 20 7d 0a 7d 20 7b 31 7d 0a 0a 23 2d 2d  ;.  }.} {1}..#--
51d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5210: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 73  -------.# Test s
5220: 6f 6d 65 20 6f 66 20 74 68 65 20 22 75 6e 64 65  ome of the "unde
5230: 66 69 6e 65 64 20 62 65 68 61 76 69 6f 75 72 22  fined behaviour"
5240: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
5250: 20 74 72 69 67 67 65 72 73 2e 20 54 68 65 0a 23   triggers. The.#
5260: 20 75 6e 64 65 66 69 6e 65 64 20 62 65 68 61 76   undefined behav
5270: 69 6f 75 72 20 6f 63 63 75 72 73 20 77 68 65 6e  iour occurs when
5280: 20 61 20 72 6f 77 20 62 65 69 6e 67 20 75 70 64   a row being upd
5290: 61 74 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20  ated or deleted 
52a0: 69 73 20 0a 23 20 6d 61 6e 69 70 75 6c 61 74 65  is .# manipulate
52b0: 64 20 62 79 20 61 20 42 45 46 4f 52 45 20 74 72  d by a BEFORE tr
52c0: 69 67 67 65 72 2e 0a 23 20 0a 64 6f 5f 74 65 73  igger..# .do_tes
52d0: 74 20 74 72 69 67 67 65 72 43 2d 37 2e 31 20 7b  t triggerC-7.1 {
52e0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
52f0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 38   CREATE TABLE t8
5300: 28 78 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  (x);.    CREATE 
5310: 54 41 42 4c 45 20 74 37 28 61 2c 20 62 29 3b 0a  TABLE t7(a, b);.
5320: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
5330: 74 37 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b  t7 VALUES(1, 2);
5340: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
5350: 20 74 37 20 56 41 4c 55 45 53 28 33 2c 20 34 29   t7 VALUES(3, 4)
5360: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
5370: 4f 20 74 37 20 56 41 4c 55 45 53 28 35 2c 20 36  O t7 VALUES(5, 6
5380: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 52  );.    CREATE TR
5390: 49 47 47 45 52 20 74 37 74 20 42 45 46 4f 52 45  IGGER t7t BEFORE
53a0: 20 55 50 44 41 54 45 20 4f 4e 20 74 37 20 42 45   UPDATE ON t7 BE
53b0: 47 49 4e 0a 20 20 20 20 20 20 44 45 4c 45 54 45  GIN.      DELETE
53c0: 20 46 52 4f 4d 20 74 37 20 57 48 45 52 45 20 61   FROM t7 WHERE a
53d0: 20 3d 20 31 3b 0a 20 20 20 20 45 4e 44 3b 0a 20   = 1;.    END;. 
53e0: 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45     CREATE TRIGGE
53f0: 52 20 74 37 74 61 20 41 46 54 45 52 20 55 50 44  R t7ta AFTER UPD
5400: 41 54 45 20 4f 4e 20 74 37 20 42 45 47 49 4e 0a  ATE ON t7 BEGIN.
5410: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
5420: 4f 20 74 38 20 56 41 4c 55 45 53 28 27 61 66 74  O t8 VALUES('aft
5430: 65 72 20 66 69 72 65 64 20 27 20 7c 7c 20 6f 6c  er fired ' || ol
5440: 64 2e 72 6f 77 69 64 20 7c 7c 20 27 2d 3e 27 20  d.rowid || '->' 
5450: 7c 7c 20 6e 65 77 2e 72 6f 77 69 64 29 3b 0a 20  || new.rowid);. 
5460: 20 20 20 45 4e 44 3b 0a 20 20 7d 0a 7d 20 7b 7d     END;.  }.} {}
5470: 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72  .do_test trigger
5480: 43 2d 37 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  C-7.2 {.  execsq
5490: 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  l {.    BEGIN;. 
54a0: 20 20 20 20 20 55 50 44 41 54 45 20 74 37 20 53       UPDATE t7 S
54b0: 45 54 20 62 3d 37 20 57 48 45 52 45 20 61 20 3d  ET b=7 WHERE a =
54c0: 20 35 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54   5;.      SELECT
54d0: 20 2a 20 46 52 4f 4d 20 74 37 3b 0a 20 20 20 20   * FROM t7;.    
54e0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
54f0: 74 38 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b  t8;.    ROLLBACK
5500: 3b 0a 20 20 7d 0a 7d 20 7b 33 20 34 20 35 20 37  ;.  }.} {3 4 5 7
5510: 20 7b 61 66 74 65 72 20 66 69 72 65 64 20 33 2d   {after fired 3-
5520: 3e 33 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69  >3}}.do_test tri
5530: 67 67 65 72 43 2d 37 2e 33 20 7b 0a 20 20 65 78  ggerC-7.3 {.  ex
5540: 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49  ecsql {.    BEGI
5550: 4e 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20  N;.      UPDATE 
5560: 74 37 20 53 45 54 20 62 3d 37 20 57 48 45 52 45  t7 SET b=7 WHERE
5570: 20 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 53 45   a = 1;.      SE
5580: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 37 3b 0a  LECT * FROM t7;.
5590: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
55a0: 52 4f 4d 20 74 38 3b 0a 20 20 20 20 52 4f 4c 4c  ROM t8;.    ROLL
55b0: 42 41 43 4b 3b 0a 20 20 7d 0a 7d 20 7b 33 20 34  BACK;.  }.} {3 4
55c0: 20 35 20 36 7d 0a 0a 64 6f 5f 74 65 73 74 20 74   5 6}..do_test t
55d0: 72 69 67 67 65 72 43 2d 37 2e 34 20 7b 0a 20 20  riggerC-7.4 {.  
55e0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 52  execsql {.    DR
55f0: 4f 50 20 54 52 49 47 47 45 52 20 74 37 74 3b 0a  OP TRIGGER t7t;.
5600: 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47      CREATE TRIGG
5610: 45 52 20 74 37 74 20 42 45 46 4f 52 45 20 55 50  ER t7t BEFORE UP
5620: 44 41 54 45 20 4f 4e 20 74 37 20 57 48 45 4e 20  DATE ON t7 WHEN 
5630: 28 6f 6c 64 2e 72 6f 77 69 64 21 3d 31 20 4f 52  (old.rowid!=1 OR
5640: 20 6e 65 77 2e 72 6f 77 69 64 21 3d 38 29 0a 20   new.rowid!=8). 
5650: 20 20 20 42 45 47 49 4e 0a 20 20 20 20 20 20 55     BEGIN.      U
5660: 50 44 41 54 45 20 74 37 20 73 65 74 20 72 6f 77  PDATE t7 set row
5670: 69 64 20 3d 20 38 20 57 48 45 52 45 20 72 6f 77  id = 8 WHERE row
5680: 69 64 3d 31 3b 0a 20 20 20 20 45 4e 44 3b 0a 20  id=1;.    END;. 
5690: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
56a0: 74 72 69 67 67 65 72 43 2d 37 2e 35 20 7b 0a 20  triggerC-7.5 {. 
56b0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
56c0: 45 47 49 4e 3b 0a 20 20 20 20 20 20 55 50 44 41  EGIN;.      UPDA
56d0: 54 45 20 74 37 20 53 45 54 20 62 3d 37 20 57 48  TE t7 SET b=7 WH
56e0: 45 52 45 20 61 20 3d 20 35 3b 0a 20 20 20 20 20  ERE a = 5;.     
56f0: 20 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a   SELECT rowid, *
5700: 20 46 52 4f 4d 20 74 37 3b 0a 20 20 20 20 20 20   FROM t7;.      
5710: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 38  SELECT * FROM t8
5720: 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a  ;.    ROLLBACK;.
5730: 20 20 7d 0a 7d 20 7b 32 20 33 20 34 20 33 20 35    }.} {2 3 4 3 5
5740: 20 37 20 38 20 31 20 32 20 7b 61 66 74 65 72 20   7 8 1 2 {after 
5750: 66 69 72 65 64 20 31 2d 3e 38 7d 20 7b 61 66 74  fired 1->8} {aft
5760: 65 72 20 66 69 72 65 64 20 33 2d 3e 33 7d 7d 0a  er fired 3->3}}.
5770: 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 43  do_test triggerC
5780: 2d 37 2e 36 20 7b 0a 20 20 65 78 65 63 73 71 6c  -7.6 {.  execsql
5790: 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20   {.    BEGIN;.  
57a0: 20 20 20 20 55 50 44 41 54 45 20 74 37 20 53 45      UPDATE t7 SE
57b0: 54 20 62 3d 37 20 57 48 45 52 45 20 61 20 3d 20  T b=7 WHERE a = 
57c0: 31 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  1;.      SELECT 
57d0: 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 74 37  rowid, * FROM t7
57e0: 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  ;.      SELECT *
57f0: 20 46 52 4f 4d 20 74 38 3b 0a 20 20 20 20 52 4f   FROM t8;.    RO
5800: 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a 7d 20 7b 32  LLBACK;.  }.} {2
5810: 20 33 20 34 20 33 20 35 20 36 20 38 20 31 20 32   3 4 3 5 6 8 1 2
5820: 20 7b 61 66 74 65 72 20 66 69 72 65 64 20 31 2d   {after fired 1-
5830: 3e 38 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20 74 72  >8}}..do_test tr
5840: 69 67 67 65 72 43 2d 37 2e 37 20 7b 0a 20 20 65  iggerC-7.7 {.  e
5850: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f  xecsql {.    DRO
5860: 50 20 54 52 49 47 47 45 52 20 74 37 74 3b 0a 20  P TRIGGER t7t;. 
5870: 20 20 20 44 52 4f 50 20 54 52 49 47 47 45 52 20     DROP TRIGGER 
5880: 74 37 74 61 3b 0a 20 20 20 20 43 52 45 41 54 45  t7ta;.    CREATE
5890: 20 54 52 49 47 47 45 52 20 74 37 74 20 42 45 46   TRIGGER t7t BEF
58a0: 4f 52 45 20 44 45 4c 45 54 45 20 4f 4e 20 74 37  ORE DELETE ON t7
58b0: 20 42 45 47 49 4e 0a 20 20 20 20 20 20 55 50 44   BEGIN.      UPD
58c0: 41 54 45 20 74 37 20 73 65 74 20 72 6f 77 69 64  ATE t7 set rowid
58d0: 20 3d 20 38 20 57 48 45 52 45 20 72 6f 77 69 64   = 8 WHERE rowid
58e0: 3d 31 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 20  =1;.    END;.   
58f0: 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20   CREATE TRIGGER 
5900: 74 37 74 61 20 41 46 54 45 52 20 44 45 4c 45 54  t7ta AFTER DELET
5910: 45 20 4f 4e 20 74 37 20 42 45 47 49 4e 0a 20 20  E ON t7 BEGIN.  
5920: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
5930: 74 38 20 56 41 4c 55 45 53 28 27 61 66 74 65 72  t8 VALUES('after
5940: 20 66 69 72 65 64 20 27 20 7c 7c 20 6f 6c 64 2e   fired ' || old.
5950: 72 6f 77 69 64 29 3b 0a 20 20 20 20 45 4e 44 3b  rowid);.    END;
5960: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
5970: 74 20 74 72 69 67 67 65 72 43 2d 37 2e 38 20 7b  t triggerC-7.8 {
5980: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
5990: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 44 45   BEGIN;.      DE
59a0: 4c 45 54 45 20 46 52 4f 4d 20 74 37 20 57 48 45  LETE FROM t7 WHE
59b0: 52 45 20 61 20 3d 20 33 3b 0a 20 20 20 20 20 20  RE a = 3;.      
59c0: 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20  SELECT rowid, * 
59d0: 46 52 4f 4d 20 74 37 3b 0a 20 20 20 20 20 20 53  FROM t7;.      S
59e0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 38 3b  ELECT * FROM t8;
59f0: 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20  .    ROLLBACK;. 
5a00: 20 7d 0a 7d 20 7b 33 20 35 20 36 20 38 20 31 20   }.} {3 5 6 8 1 
5a10: 32 20 7b 61 66 74 65 72 20 66 69 72 65 64 20 32  2 {after fired 2
5a20: 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67  }}.do_test trigg
5a30: 65 72 43 2d 37 2e 39 20 7b 0a 20 20 65 78 65 63  erC-7.9 {.  exec
5a40: 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b  sql {.    BEGIN;
5a50: 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52  .      DELETE FR
5a60: 4f 4d 20 74 37 20 57 48 45 52 45 20 61 20 3d 20  OM t7 WHERE a = 
5a70: 31 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  1;.      SELECT 
5a80: 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 74 37  rowid, * FROM t7
5a90: 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  ;.      SELECT *
5aa0: 20 46 52 4f 4d 20 74 38 3b 0a 20 20 20 20 52 4f   FROM t8;.    RO
5ab0: 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a 7d 20 7b 32  LLBACK;.  }.} {2
5ac0: 20 33 20 34 20 33 20 35 20 36 20 38 20 31 20 32   3 4 3 5 6 8 1 2
5ad0: 7d 0a 0a 23 20 54 69 63 6b 65 74 20 5b 65 32 35  }..# Ticket [e25
5ae0: 64 39 65 61 37 37 31 66 65 62 63 39 63 33 31 31  d9ea771febc9c311
5af0: 39 32 38 63 31 63 30 31 63 33 31 36 33 64 63 62  928c1c01c3163dcb
5b00: 32 36 36 34 33 5d 0a 23 20 0a 64 6f 5f 74 65 73  26643].# .do_tes
5b10: 74 20 74 72 69 67 67 65 72 43 2d 39 2e 31 20 7b  t triggerC-9.1 {
5b20: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
5b30: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 39   CREATE TABLE t9
5b40: 28 61 2c 62 29 3b 0a 20 20 20 20 43 52 45 41 54  (a,b);.    CREAT
5b50: 45 20 49 4e 44 45 58 20 74 39 62 20 4f 4e 20 74  E INDEX t9b ON t
5b60: 39 28 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  9(b);.    INSERT
5b70: 20 49 4e 54 4f 20 74 39 20 56 41 4c 55 45 53 28   INTO t9 VALUES(
5b80: 31 2c 30 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  1,0);.    INSERT
5b90: 20 49 4e 54 4f 20 74 39 20 56 41 4c 55 45 53 28   INTO t9 VALUES(
5ba0: 32 2c 31 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  2,1);.    INSERT
5bb0: 20 49 4e 54 4f 20 74 39 20 56 41 4c 55 45 53 28   INTO t9 VALUES(
5bc0: 33 2c 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  3,2);.    INSERT
5bd0: 20 49 4e 54 4f 20 74 39 20 53 45 4c 45 43 54 20   INTO t9 SELECT 
5be0: 61 2b 33 2c 20 61 2b 32 20 46 52 4f 4d 20 74 39  a+3, a+2 FROM t9
5bf0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
5c00: 4f 20 74 39 20 53 45 4c 45 43 54 20 61 2b 36 2c  O t9 SELECT a+6,
5c10: 20 61 2b 35 20 46 52 4f 4d 20 74 39 3b 0a 20 20   a+5 FROM t9;.  
5c20: 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
5c30: 74 39 20 4f 52 44 45 52 20 42 59 20 61 3b 0a 20  t9 ORDER BY a;. 
5c40: 20 7d 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20   }.} {1 2 3 4 5 
5c50: 36 20 37 20 38 20 39 20 31 30 20 31 31 20 31 32  6 7 8 9 10 11 12
5c60: 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65  }.do_test trigge
5c70: 72 43 2d 39 2e 32 20 7b 0a 20 20 65 78 65 63 73  rC-9.2 {.  execs
5c80: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
5c90: 54 52 49 47 47 45 52 20 74 39 72 31 20 41 46 54  TRIGGER t9r1 AFT
5ca0: 45 52 20 44 45 4c 45 54 45 20 4f 4e 20 74 39 20  ER DELETE ON t9 
5cb0: 42 45 47 49 4e 0a 20 20 20 20 20 20 44 45 4c 45  BEGIN.      DELE
5cc0: 54 45 20 46 52 4f 4d 20 74 39 20 57 48 45 52 45  TE FROM t9 WHERE
5cd0: 20 62 3d 6f 6c 64 2e 61 3b 0a 20 20 20 20 45 4e   b=old.a;.    EN
5ce0: 44 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52  D;.    DELETE FR
5cf0: 4f 4d 20 74 39 20 57 48 45 52 45 20 62 3d 34 3b  OM t9 WHERE b=4;
5d00: 0a 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52  .    SELECT a FR
5d10: 4f 4d 20 74 39 20 4f 52 44 45 52 20 42 59 20 61  OM t9 ORDER BY a
5d20: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 33 20 34  ;.  }.} {1 2 3 4
5d30: 7d 0a 0a 23 20 41 74 20 6f 6e 65 20 70 6f 69 6e  }..# At one poin
5d40: 74 20 28 62 65 74 77 65 65 6e 20 76 65 72 73 69  t (between versi
5d50: 6f 6e 73 20 33 2e 36 2e 31 38 20 61 6e 64 20 33  ons 3.6.18 and 3
5d60: 2e 36 2e 32 30 20 69 6e 63 6c 75 73 69 76 65 29  .6.20 inclusive)
5d70: 2c 20 61 6e 20 55 50 44 41 54 45 20 0a 23 20 74  , an UPDATE .# t
5d80: 68 61 74 20 66 69 72 65 64 20 61 20 42 45 46 4f  hat fired a BEFO
5d90: 52 45 20 74 72 69 67 67 65 72 20 74 68 61 74 20  RE trigger that 
5da0: 69 74 73 65 6c 66 20 75 70 64 61 74 65 64 20 74  itself updated t
5db0: 68 65 20 73 61 6d 65 20 72 6f 77 20 61 73 20 74  he same row as t
5dc0: 68 65 20 0a 23 20 73 74 61 74 65 6d 65 6e 74 20  he .# statement 
5dd0: 63 61 75 73 69 6e 67 20 69 74 20 74 6f 20 66 69  causing it to fi
5de0: 72 65 20 77 61 73 20 63 61 75 73 69 6e 67 20 61  re was causing a
5df0: 20 73 74 72 61 6e 67 65 20 73 69 64 65 2d 65 66   strange side-ef
5e00: 66 65 63 74 3a 20 54 68 65 20 0a 23 20 76 61 6c  fect: The .# val
5e10: 75 65 73 20 75 70 64 61 74 65 64 20 62 79 20 74  ues updated by t
5e20: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 77 69 74  he statement wit
5e30: 68 69 6e 20 74 68 65 20 74 72 69 67 67 65 72 20  hin the trigger 
5e40: 77 65 72 65 20 62 65 69 6e 67 20 6f 76 65 72 77  were being overw
5e50: 72 69 74 74 65 6e 20 0a 23 20 62 79 20 74 68 65  ritten .# by the
5e60: 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20 6e   values in the n
5e70: 65 77 2e 2a 20 61 72 72 61 79 2c 20 65 76 65 6e  ew.* array, even
5e80: 20 69 66 20 74 68 6f 73 65 20 76 61 6c 75 65 73   if those values
5e90: 20 77 65 72 65 20 6e 6f 74 20 0a 23 20 74 68 65   were not .# the
5ea0: 6d 73 65 6c 76 65 73 20 77 72 69 74 74 65 6e 20  mselves written 
5eb0: 62 79 20 74 68 65 20 70 61 72 65 6e 74 20 55 50  by the parent UP
5ec0: 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  DATE statement..
5ed0: 23 0a 23 20 54 65 63 68 6e 69 63 61 6c 6c 79 20  #.# Technically 
5ee0: 73 70 65 61 6b 69 6e 67 20 74 68 69 73 20 77 61  speaking this wa
5ef0: 73 20 6e 6f 74 20 61 20 62 75 67 2e 20 54 68 65  s not a bug. The
5f00: 20 53 51 4c 69 74 65 20 64 6f 63 75 6d 65 6e 74   SQLite document
5f10: 61 74 69 6f 6e 20 73 61 79 73 0a 23 20 74 68 61  ation says.# tha
5f20: 74 20 69 66 20 61 20 42 45 46 4f 52 45 20 55 50  t if a BEFORE UP
5f30: 44 41 54 45 20 6f 72 20 42 45 46 4f 52 45 20 44  DATE or BEFORE D
5f40: 45 4c 45 54 45 20 74 72 69 67 67 65 72 20 6d 6f  ELETE trigger mo
5f50: 64 69 66 69 65 73 20 6f 72 20 64 65 6c 65 74 65  difies or delete
5f60: 73 20 74 68 65 0a 23 20 72 6f 77 20 74 68 61 74  s the.# row that
5f70: 20 74 68 65 20 70 61 72 65 6e 74 20 73 74 61 74   the parent stat
5f80: 65 6d 65 6e 74 20 69 73 20 6f 70 65 72 61 74 69  ement is operati
5f90: 6e 67 20 6f 6e 20 74 68 65 20 72 65 73 75 6c 74  ng on the result
5fa0: 73 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e  s are undefined.
5fb0: 20 0a 23 20 42 75 74 20 61 73 20 6f 66 20 33 2e   .# But as of 3.
5fc0: 36 2e 32 31 20 62 65 68 61 76 69 6f 75 72 20 69  6.21 behaviour i
5fd0: 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 74 68  s restored to th
5fe0: 65 20 77 61 79 20 69 74 20 77 61 73 20 69 6e 20  e way it was in 
5ff0: 76 65 72 73 69 6f 6e 73 0a 23 20 33 2e 36 2e 31  versions.# 3.6.1
6000: 37 20 61 6e 64 20 65 61 72 6c 69 65 72 20 74 6f  7 and earlier to
6010: 20 61 76 6f 69 64 20 63 61 75 73 69 6e 67 20 75   avoid causing u
6020: 6e 6e 65 63 65 73 73 61 72 79 20 64 69 66 66 69  nnecessary diffi
6030: 63 75 6c 74 69 65 73 2e 0a 23 0a 64 6f 5f 74 65  culties..#.do_te
6040: 73 74 20 74 72 69 67 67 65 72 43 2d 31 30 2e 31  st triggerC-10.1
6050: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
6060: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
6070: 74 31 30 28 61 2c 20 75 70 64 61 74 65 63 6e 74  t10(a, updatecnt
6080: 20 44 45 46 41 55 4c 54 20 30 29 3b 0a 20 20 20   DEFAULT 0);.   
6090: 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20   CREATE TRIGGER 
60a0: 74 31 30 5f 62 75 20 42 45 46 4f 52 45 20 55 50  t10_bu BEFORE UP
60b0: 44 41 54 45 20 4f 46 20 61 20 4f 4e 20 74 31 30  DATE OF a ON t10
60c0: 20 42 45 47 49 4e 0a 20 20 20 20 20 20 55 50 44   BEGIN.      UPD
60d0: 41 54 45 20 74 31 30 20 53 45 54 20 75 70 64 61  ATE t10 SET upda
60e0: 74 65 63 6e 74 20 3d 20 75 70 64 61 74 65 63 6e  tecnt = updatecn
60f0: 74 2b 31 20 57 48 45 52 45 20 72 6f 77 69 64 20  t+1 WHERE rowid 
6100: 3d 20 6f 6c 64 2e 72 6f 77 69 64 3b 0a 20 20 20  = old.rowid;.   
6110: 20 45 4e 44 3b 0a 20 20 20 20 49 4e 53 45 52 54   END;.    INSERT
6120: 20 49 4e 54 4f 20 74 31 30 28 61 29 20 56 41 4c   INTO t10(a) VAL
6130: 55 45 53 28 27 68 65 6c 6c 6f 27 29 3b 0a 20 20  UES('hello');.  
6140: 7d 0a 0a 20 20 23 20 42 65 66 6f 72 65 20 74 68  }..  # Before th
6150: 65 20 70 72 6f 62 6c 65 6d 20 77 61 73 20 66 69  e problem was fi
6160: 78 65 64 2c 20 74 61 62 6c 65 20 74 31 30 20 77  xed, table t10 w
6170: 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 20 74 68 65  ould contain the
6180: 20 74 75 70 6c 65 20 0a 20 20 23 20 28 77 6f 72   tuple .  # (wor
6190: 6c 64 2c 20 30 29 20 61 66 74 65 72 20 72 75 6e  ld, 0) after run
61a0: 6e 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ning the followi
61b0: 6e 67 20 73 63 72 69 70 74 20 28 62 65 63 61 75  ng script (becau
61c0: 73 65 20 74 68 65 20 76 61 6c 75 65 0a 20 20 23  se the value.  #
61d0: 20 31 20 77 72 69 74 74 65 6e 20 74 6f 20 63 6f   1 written to co
61e0: 6c 75 6d 6e 20 22 75 70 64 61 74 65 63 6e 74 22  lumn "updatecnt"
61f0: 20 77 61 73 20 63 6c 6f 62 62 65 72 65 64 20 62   was clobbered b
6200: 79 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 20  y the old value 
6210: 30 29 2e 0a 20 20 23 0a 20 20 65 78 65 63 73 71  0)..  #.  execsq
6220: 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20 74  l {.    UPDATE t
6230: 31 30 20 53 45 54 20 61 20 3d 20 27 77 6f 72 6c  10 SET a = 'worl
6240: 64 27 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  d';.    SELECT *
6250: 20 46 52 4f 4d 20 74 31 30 3b 0a 20 20 7d 0a 7d   FROM t10;.  }.}
6260: 20 7b 77 6f 72 6c 64 20 31 7d 0a 0a 64 6f 5f 74   {world 1}..do_t
6270: 65 73 74 20 74 72 69 67 67 65 72 43 2d 31 30 2e  est triggerC-10.
6280: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  2 {.  execsql {.
6290: 20 20 20 20 55 50 44 41 54 45 20 74 31 30 20 53      UPDATE t10 S
62a0: 45 54 20 61 20 3d 20 27 74 63 6c 27 2c 20 75 70  ET a = 'tcl', up
62b0: 64 61 74 65 63 6e 74 20 3d 20 35 3b 0a 20 20 20  datecnt = 5;.   
62c0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
62d0: 31 30 3b 0a 20 20 7d 0a 7d 20 7b 74 63 6c 20 35  10;.  }.} {tcl 5
62e0: 7d 0a 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67  }..do_test trigg
62f0: 65 72 43 2d 31 30 2e 33 20 7b 0a 20 20 65 78 65  erC-10.3 {.  exe
6300: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
6310: 45 20 54 41 42 4c 45 20 74 31 31 28 0a 20 20 20  E TABLE t11(.   
6320: 20 20 20 63 31 2c 20 20 20 63 32 2c 20 20 63 33     c1,   c2,  c3
6330: 2c 20 20 63 34 2c 20 20 63 35 2c 20 20 63 36 2c  ,  c4,  c5,  c6,
6340: 20 20 63 37 2c 20 20 63 38 2c 20 20 63 39 2c 20    c7,  c8,  c9, 
6350: 63 31 30 2c 0a 20 20 20 20 20 20 63 31 31 2c 20  c10,.      c11, 
6360: 63 31 32 2c 20 63 31 33 2c 20 63 31 34 2c 20 63  c12, c13, c14, c
6370: 31 35 2c 20 63 31 36 2c 20 63 31 37 2c 20 63 31  15, c16, c17, c1
6380: 38 2c 20 63 31 39 2c 20 63 32 30 2c 0a 20 20 20  8, c19, c20,.   
6390: 20 20 20 63 32 31 2c 20 63 32 32 2c 20 63 32 33     c21, c22, c23
63a0: 2c 20 63 32 34 2c 20 63 32 35 2c 20 63 32 36 2c  , c24, c25, c26,
63b0: 20 63 32 37 2c 20 63 32 38 2c 20 63 32 39 2c 20   c27, c28, c29, 
63c0: 63 33 30 2c 0a 20 20 20 20 20 20 63 33 31 2c 20  c30,.      c31, 
63d0: 63 33 32 2c 20 63 33 33 2c 20 63 33 34 2c 20 63  c32, c33, c34, c
63e0: 33 35 2c 20 63 33 36 2c 20 63 33 37 2c 20 63 33  35, c36, c37, c3
63f0: 38 2c 20 63 33 39 2c 20 63 34 30 0a 20 20 20 20  8, c39, c40.    
6400: 29 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54  );..    CREATE T
6410: 52 49 47 47 45 52 20 74 31 31 5f 62 75 20 42 45  RIGGER t11_bu BE
6420: 46 4f 52 45 20 55 50 44 41 54 45 20 4f 46 20 63  FORE UPDATE OF c
6430: 31 20 4f 4e 20 74 31 31 20 42 45 47 49 4e 0a 20  1 ON t11 BEGIN. 
6440: 20 20 20 20 20 55 50 44 41 54 45 20 74 31 31 20       UPDATE t11 
6450: 53 45 54 20 63 33 31 20 3d 20 63 33 31 2b 31 2c  SET c31 = c31+1,
6460: 20 63 33 32 3d 63 33 32 2b 31 20 57 48 45 52 45   c32=c32+1 WHERE
6470: 20 72 6f 77 69 64 20 3d 20 6f 6c 64 2e 72 6f 77   rowid = old.row
6480: 69 64 3b 0a 20 20 20 20 45 4e 44 3b 0a 0a 20 20  id;.    END;..  
6490: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
64a0: 31 20 56 41 4c 55 45 53 28 0a 20 20 20 20 20 20  1 VALUES(.      
64b0: 31 2c 20 20 20 32 2c 20 20 33 2c 20 20 34 2c 20  1,   2,  3,  4, 
64c0: 20 35 2c 20 20 36 2c 20 20 37 2c 20 20 38 2c 20   5,  6,  7,  8, 
64d0: 20 39 2c 20 31 30 2c 0a 20 20 20 20 20 20 31 31   9, 10,.      11
64e0: 2c 20 31 32 2c 20 31 33 2c 20 31 34 2c 20 31 35  , 12, 13, 14, 15
64f0: 2c 20 31 36 2c 20 31 37 2c 20 31 38 2c 20 31 39  , 16, 17, 18, 19
6500: 2c 20 32 30 2c 0a 20 20 20 20 20 20 32 31 2c 20  , 20,.      21, 
6510: 32 32 2c 20 32 33 2c 20 32 34 2c 20 32 35 2c 20  22, 23, 24, 25, 
6520: 32 36 2c 20 32 37 2c 20 32 38 2c 20 32 39 2c 20  26, 27, 28, 29, 
6530: 33 30 2c 0a 20 20 20 20 20 20 33 31 2c 20 33 32  30,.      31, 32
6540: 2c 20 33 33 2c 20 33 34 2c 20 33 35 2c 20 33 36  , 33, 34, 35, 36
6550: 2c 20 33 37 2c 20 33 38 2c 20 33 39 2c 20 34 30  , 37, 38, 39, 40
6560: 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 23  .    );.  }..  #
6570: 20 42 65 66 6f 72 65 20 74 68 65 20 70 72 6f 62   Before the prob
6580: 6c 65 6d 20 77 61 73 20 66 69 78 65 64 2c 20 74  lem was fixed, t
6590: 61 62 6c 65 20 74 31 30 20 77 6f 75 6c 64 20 63  able t10 would c
65a0: 6f 6e 74 61 69 6e 20 74 68 65 20 74 75 70 6c 65  ontain the tuple
65b0: 20 0a 20 20 23 20 28 77 6f 72 6c 64 2c 20 30 29   .  # (world, 0)
65c0: 20 61 66 74 65 72 20 72 75 6e 6e 69 6e 67 20 74   after running t
65d0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 72  he following scr
65e0: 69 70 74 20 28 62 65 63 61 75 73 65 20 74 68 65  ipt (because the
65f0: 20 76 61 6c 75 65 0a 20 20 23 20 31 20 77 72 69   value.  # 1 wri
6600: 74 74 65 6e 20 74 6f 20 63 6f 6c 75 6d 6e 20 22  tten to column "
6610: 75 70 64 61 74 65 63 6e 74 22 20 77 61 73 20 63  updatecnt" was c
6620: 6c 6f 62 62 65 72 65 64 20 62 79 20 74 68 65 20  lobbered by the 
6630: 6f 6c 64 20 76 61 6c 75 65 20 30 29 2e 0a 20 20  old value 0)..  
6640: 23 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  #.  execsql {.  
6650: 20 20 55 50 44 41 54 45 20 74 31 31 20 53 45 54    UPDATE t11 SET
6660: 20 63 34 3d 33 35 2c 20 63 33 33 3d 32 32 2c 20   c4=35, c33=22, 
6670: 63 31 3d 35 3b 0a 20 20 20 20 53 45 4c 45 43 54  c1=5;.    SELECT
6680: 20 2a 20 46 52 4f 4d 20 74 31 31 3b 0a 20 20 7d   * FROM t11;.  }
6690: 20 0a 7d 20 7b 35 20 32 20 33 20 33 35 20 35 20   .} {5 2 3 35 5 
66a0: 36 20 37 20 38 20 39 20 31 30 20 31 31 20 31 32  6 7 8 9 10 11 12
66b0: 20 31 33 20 31 34 20 31 35 20 31 36 20 31 37 20   13 14 15 16 17 
66c0: 31 38 20 31 39 20 32 30 20 32 31 20 32 32 20 32  18 19 20 21 22 2
66d0: 33 20 32 34 20 32 35 20 32 36 20 32 37 20 32 38  3 24 25 26 27 28
66e0: 20 32 39 20 33 30 20 33 32 20 33 33 20 32 32 20   29 30 32 33 22 
66f0: 33 34 20 33 35 20 33 36 20 33 37 20 33 38 20 33  34 35 36 37 38 3
6700: 39 20 34 30 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  9 40}..#--------
6710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6750: 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 62 75  -.# Test that bu
6760: 67 20 5b 33 37 31 62 61 62 35 64 36 35 5d 20 68  g [371bab5d65] h
6770: 61 73 20 62 65 65 6e 20 66 69 78 65 64 2e 20 42  as been fixed. B
6780: 45 46 4f 52 45 20 49 4e 53 45 52 54 20 61 6e 64  EFORE INSERT and
6790: 20 49 4e 53 54 45 41 44 20 4f 46 0a 23 20 49 4e   INSTEAD OF.# IN
67a0: 53 45 52 54 20 74 72 69 67 67 65 72 73 20 77 69  SERT triggers wi
67b0: 74 68 20 74 68 65 20 44 45 46 41 55 4c 54 20 56  th the DEFAULT V
67c0: 41 4c 55 45 53 20 49 4e 53 45 52 54 20 73 79 6e  ALUES INSERT syn
67d0: 74 61 78 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 74  tax..#.do_test t
67e0: 72 69 67 67 65 72 43 2d 31 31 2e 30 20 7b 0a 20  riggerC-11.0 {. 
67f0: 20 63 61 74 63 68 73 71 6c 20 7b 20 44 52 4f 50   catchsql { DROP
6800: 20 54 41 42 4c 45 20 6c 6f 67 20 7d 0a 20 20 65   TABLE log }.  e
6810: 78 65 63 73 71 6c 20 20 7b 20 43 52 45 41 54 45  xecsql  { CREATE
6820: 20 54 41 42 4c 45 20 6c 6f 67 28 61 2c 20 62 29   TABLE log(a, b)
6830: 20 7d 0a 7d 20 7b 7d 0a 0a 66 6f 72 65 61 63 68   }.} {}..foreach
6840: 20 7b 74 65 73 74 6e 6f 20 74 62 6c 20 64 65 66   {testno tbl def
6850: 61 75 6c 74 73 7d 20 7b 0a 20 20 31 20 22 43 52  aults} {.  1 "CR
6860: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
6870: 20 62 29 22 20 20 20 20 20 20 20 20 20 20 20 20   b)"            
6880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 7b                {{
6890: 7d 20 7b 7d 7d 0a 20 20 32 20 22 43 52 45 41 54  } {}}.  2 "CREAT
68a0: 45 20 54 41 42 4c 45 20 74 31 28 61 20 44 45 46  E TABLE t1(a DEF
68b0: 41 55 4c 54 20 31 2c 20 62 20 44 45 46 41 55 4c  AULT 1, b DEFAUL
68c0: 54 20 27 61 62 63 27 29 22 20 20 7b 31 20 61 62  T 'abc')"  {1 ab
68d0: 63 7d 0a 20 20 33 20 22 43 52 45 41 54 45 20 54  c}.  3 "CREATE T
68e0: 41 42 4c 45 20 74 31 28 61 2c 20 62 20 44 45 46  ABLE t1(a, b DEF
68f0: 41 55 4c 54 20 34 2e 35 29 22 20 20 20 20 20 20  AULT 4.5)"      
6900: 20 20 20 20 20 20 20 20 7b 7b 7d 20 34 2e 35 7d          {{} 4.5}
6910: 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 74  .} {.  do_test t
6920: 72 69 67 67 65 72 43 2d 31 31 2e 24 74 65 73 74  riggerC-11.$test
6930: 6e 6f 2e 31 20 7b 0a 20 20 20 20 63 61 74 63 68  no.1 {.    catch
6940: 73 71 6c 20 7b 20 44 52 4f 50 20 54 41 42 4c 45  sql { DROP TABLE
6950: 20 74 31 20 7d 0a 20 20 20 20 65 78 65 63 73 71   t1 }.    execsq
6960: 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  l { DELETE FROM 
6970: 6c 6f 67 20 7d 0a 20 20 20 20 65 78 65 63 73 71  log }.    execsq
6980: 6c 20 24 74 62 6c 0a 20 20 20 20 65 78 65 63 73  l $tbl.    execs
6990: 71 6c 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54  ql {.      CREAT
69a0: 45 20 54 52 49 47 47 45 52 20 74 74 31 20 42 45  E TRIGGER tt1 BE
69b0: 46 4f 52 45 20 49 4e 53 45 52 54 20 4f 4e 20 74  FORE INSERT ON t
69c0: 31 20 42 45 47 49 4e 20 0a 20 20 20 20 20 20 20  1 BEGIN .       
69d0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c 6f 67   INSERT INTO log
69e0: 20 56 41 4c 55 45 53 28 6e 65 77 2e 61 2c 20 6e   VALUES(new.a, n
69f0: 65 77 2e 62 29 3b 0a 20 20 20 20 20 20 45 4e 44  ew.b);.      END
6a00: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
6a10: 4e 54 4f 20 74 31 20 44 45 46 41 55 4c 54 20 56  NTO t1 DEFAULT V
6a20: 41 4c 55 45 53 3b 0a 20 20 20 20 20 20 53 45 4c  ALUES;.      SEL
6a30: 45 43 54 20 2a 20 46 52 4f 4d 20 6c 6f 67 3b 0a  ECT * FROM log;.
6a40: 20 20 20 20 7d 0a 20 20 7d 20 24 64 65 66 61 75      }.  } $defau
6a50: 6c 74 73 0a 0a 20 20 64 6f 5f 74 65 73 74 20 74  lts..  do_test t
6a60: 72 69 67 67 65 72 43 2d 31 31 2e 24 74 65 73 74  riggerC-11.$test
6a70: 6e 6f 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73  no.2 {.    execs
6a80: 71 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d  ql { DELETE FROM
6a90: 20 6c 6f 67 20 7d 0a 20 20 20 20 65 78 65 63 73   log }.    execs
6aa0: 71 6c 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54  ql {.      CREAT
6ab0: 45 20 54 52 49 47 47 45 52 20 74 74 32 20 41 46  E TRIGGER tt2 AF
6ac0: 54 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 74 31  TER INSERT ON t1
6ad0: 20 42 45 47 49 4e 20 0a 20 20 20 20 20 20 20 20   BEGIN .        
6ae0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c 6f 67 20  INSERT INTO log 
6af0: 56 41 4c 55 45 53 28 6e 65 77 2e 61 2c 20 6e 65  VALUES(new.a, ne
6b00: 77 2e 62 29 3b 0a 20 20 20 20 20 20 45 4e 44 3b  w.b);.      END;
6b10: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
6b20: 54 4f 20 74 31 20 44 45 46 41 55 4c 54 20 56 41  TO t1 DEFAULT VA
6b30: 4c 55 45 53 3b 0a 20 20 20 20 20 20 53 45 4c 45  LUES;.      SELE
6b40: 43 54 20 2a 20 46 52 4f 4d 20 6c 6f 67 3b 0a 20  CT * FROM log;. 
6b50: 20 20 20 7d 0a 20 20 7d 20 5b 63 6f 6e 63 61 74     }.  } [concat
6b60: 20 24 64 65 66 61 75 6c 74 73 20 24 64 65 66 61   $defaults $defa
6b70: 75 6c 74 73 5d 0a 0a 20 20 64 6f 5f 74 65 73 74  ults]..  do_test
6b80: 20 74 72 69 67 67 65 72 43 2d 31 31 2e 24 74 65   triggerC-11.$te
6b90: 73 74 6e 6f 2e 33 20 7b 0a 20 20 20 20 65 78 65  stno.3 {.    exe
6ba0: 63 73 71 6c 20 7b 20 44 52 4f 50 20 54 52 49 47  csql { DROP TRIG
6bb0: 47 45 52 20 74 74 31 20 7d 0a 20 20 20 20 65 78  GER tt1 }.    ex
6bc0: 65 63 73 71 6c 20 7b 20 44 45 4c 45 54 45 20 46  ecsql { DELETE F
6bd0: 52 4f 4d 20 6c 6f 67 20 7d 0a 20 20 20 20 65 78  ROM log }.    ex
6be0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 49 4e  ecsql {.      IN
6bf0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 44 45 46  SERT INTO t1 DEF
6c00: 41 55 4c 54 20 56 41 4c 55 45 53 3b 0a 20 20 20  AULT VALUES;.   
6c10: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
6c20: 20 6c 6f 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 20   log;.    }.  } 
6c30: 24 64 65 66 61 75 6c 74 73 0a 7d 20 0a 64 6f 5f  $defaults.} .do_
6c40: 74 65 73 74 20 74 72 69 67 67 65 72 43 2d 31 31  test triggerC-11
6c50: 2e 34 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .4 {.  catchsql 
6c60: 7b 20 44 52 4f 50 20 54 41 42 4c 45 20 74 32 20  { DROP TABLE t2 
6c70: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  }.  execsql {.  
6c80: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 6c 6f    DELETE FROM lo
6c90: 67 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  g;.    CREATE TA
6ca0: 42 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a 20 20  BLE t2(a, b);.  
6cb0: 20 20 43 52 45 41 54 45 20 56 49 45 57 20 76 32    CREATE VIEW v2
6cc0: 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   AS SELECT * FRO
6cd0: 4d 20 74 32 3b 0a 20 20 20 20 43 52 45 41 54 45  M t2;.    CREATE
6ce0: 20 54 52 49 47 47 45 52 20 74 76 32 20 49 4e 53   TRIGGER tv2 INS
6cf0: 54 45 41 44 20 4f 46 20 49 4e 53 45 52 54 20 4f  TEAD OF INSERT O
6d00: 4e 20 76 32 20 42 45 47 49 4e 0a 20 20 20 20 20  N v2 BEGIN.     
6d10: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c 6f 67   INSERT INTO log
6d20: 20 56 41 4c 55 45 53 28 6e 65 77 2e 61 2c 20 6e   VALUES(new.a, n
6d30: 65 77 2e 62 29 3b 0a 20 20 20 20 45 4e 44 3b 0a  ew.b);.    END;.
6d40: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
6d50: 76 32 20 44 45 46 41 55 4c 54 20 56 41 4c 55 45  v2 DEFAULT VALUE
6d60: 53 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 61 2c  S;.    SELECT a,
6d70: 20 62 2c 20 61 20 49 53 20 4e 55 4c 4c 2c 20 62   b, a IS NULL, b
6d80: 20 49 53 20 4e 55 4c 4c 20 46 52 4f 4d 20 6c 6f   IS NULL FROM lo
6d90: 67 3b 0a 20 20 7d 0a 7d 20 7b 7b 7d 20 7b 7d 20  g;.  }.} {{} {} 
6da0: 31 20 31 7d 0a 0a 64 6f 5f 74 65 73 74 20 74 72  1 1}..do_test tr
6db0: 69 67 67 65 72 43 2d 31 32 2e 31 20 7b 0a 20 20  iggerC-12.1 {.  
6dc0: 64 62 20 63 6c 6f 73 65 0a 20 20 66 6f 72 63 65  db close.  force
6dd0: 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62 0a 20  delete test.db. 
6de0: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
6df0: 2e 64 62 0a 0a 20 20 65 78 65 63 73 71 6c 20 7b  .db..  execsql {
6e00: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
6e10: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
6e20: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
6e30: 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20  ALUES(1, 2);.   
6e40: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
6e50: 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20  VALUES(3, 4);.  
6e60: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
6e70: 20 56 41 4c 55 45 53 28 35 2c 20 36 29 3b 0a 20   VALUES(5, 6);. 
6e80: 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45     CREATE TRIGGE
6e90: 52 20 74 72 31 20 41 46 54 45 52 20 49 4e 53 45  R tr1 AFTER INSE
6ea0: 52 54 20 4f 4e 20 74 31 20 42 45 47 49 4e 20 53  RT ON t1 BEGIN S
6eb0: 45 4c 45 43 54 20 31 20 3b 20 45 4e 44 20 3b 0a  ELECT 1 ; END ;.
6ec0: 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74      SELECT count
6ed0: 28 2a 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  (*) FROM sqlite_
6ee0: 6d 61 73 74 65 72 3b 0a 20 20 7d 0a 7d 20 7b 32  master;.  }.} {2
6ef0: 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65  }.do_test trigge
6f00: 72 43 2d 31 32 2e 32 20 7b 0a 20 20 64 62 20 65  rC-12.2 {.  db e
6f10: 76 61 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  val { SELECT * F
6f20: 52 4f 4d 20 74 31 20 7d 20 7b 0a 20 20 20 20 69  ROM t1 } {.    i
6f30: 66 20 7b 24 61 20 3d 3d 20 33 7d 20 7b 20 65 78  f {$a == 3} { ex
6f40: 65 63 73 71 6c 20 7b 20 44 52 4f 50 20 54 52 49  ecsql { DROP TRI
6f50: 47 47 45 52 20 74 72 31 20 7d 20 7d 0a 20 20 7d  GGER tr1 } }.  }
6f60: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
6f70: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
6f80: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
6f90: 7d 0a 7d 20 7b 31 7d 0a 0a 64 6f 5f 65 78 65 63  }.} {1}..do_exec
6fa0: 73 71 6c 5f 74 65 73 74 20 74 72 69 67 67 65 72  sql_test trigger
6fb0: 43 2d 31 33 2e 31 20 7b 0a 20 20 50 52 41 47 4d  C-13.1 {.  PRAGM
6fc0: 41 20 72 65 63 75 72 73 69 76 65 5f 74 72 69 67  A recursive_trig
6fd0: 67 65 72 73 20 3d 20 4f 4e 3b 0a 20 20 43 52 45  gers = ON;.  CRE
6fe0: 41 54 45 20 54 41 42 4c 45 20 74 31 32 28 61 2c  ATE TABLE t12(a,
6ff0: 20 62 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e   b);.  INSERT IN
7000: 54 4f 20 74 31 32 20 56 41 4c 55 45 53 28 31 2c  TO t12 VALUES(1,
7010: 20 32 29 3b 0a 20 20 43 52 45 41 54 45 20 54 52   2);.  CREATE TR
7020: 49 47 47 45 52 20 74 72 31 32 20 41 46 54 45 52  IGGER tr12 AFTER
7030: 20 55 50 44 41 54 45 20 4f 4e 20 74 31 32 20 42   UPDATE ON t12 B
7040: 45 47 49 4e 0a 20 20 20 20 55 50 44 41 54 45 20  EGIN.    UPDATE 
7050: 74 31 32 20 53 45 54 20 61 3d 6e 65 77 2e 61 2b  t12 SET a=new.a+
7060: 31 2c 20 62 3d 6e 65 77 2e 62 2b 31 3b 0a 20 20  1, b=new.b+1;.  
7070: 45 4e 44 3b 0a 7d 20 7b 7d 0a 64 6f 5f 63 61 74  END;.} {}.do_cat
7080: 63 68 73 71 6c 5f 74 65 73 74 20 74 72 69 67 67  chsql_test trigg
7090: 65 72 43 2d 31 33 2e 32 20 7b 0a 20 20 55 50 44  erC-13.2 {.  UPD
70a0: 41 54 45 20 74 31 32 20 53 45 54 20 61 3d 61 2b  ATE t12 SET a=a+
70b0: 31 2c 20 62 3d 62 2b 31 3b 0a 7d 20 7b 31 20 7b  1, b=b+1;.} {1 {
70c0: 74 6f 6f 20 6d 61 6e 79 20 6c 65 76 65 6c 73 20  too many levels 
70d0: 6f 66 20 74 72 69 67 67 65 72 20 72 65 63 75 72  of trigger recur
70e0: 73 69 6f 6e 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  sion}}..#-------
70f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7130: 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69  --.# The followi
7140: 6e 67 20 74 65 73 74 73 20 73 65 65 6b 20 74 6f  ng tests seek to
7150: 20 76 65 72 69 66 79 20 74 68 61 74 20 63 6f 6e   verify that con
7160: 73 74 61 6e 74 20 76 61 6c 75 65 73 20 28 69 2e  stant values (i.
7170: 65 2e 20 6c 69 74 65 72 61 6c 73 29 0a 23 20 61  e. literals).# a
7180: 72 65 20 6e 6f 74 20 66 61 63 74 6f 72 65 64 20  re not factored 
7190: 6f 75 74 20 6f 66 20 6c 6f 6f 70 73 20 77 69 74  out of loops wit
71a0: 68 69 6e 20 74 72 69 67 67 65 72 20 70 72 6f 67  hin trigger prog
71b0: 72 61 6d 73 2e 20 53 51 4c 69 74 65 20 64 6f 65  rams. SQLite doe
71c0: 73 0a 23 20 6e 6f 74 20 66 61 63 74 6f 72 20 63  s.# not factor c
71d0: 6f 6e 73 74 61 6e 74 73 20 6f 75 74 20 6f 66 20  onstants out of 
71e0: 6c 6f 6f 70 73 20 77 69 74 68 69 6e 20 74 72 69  loops within tri
71f0: 67 67 65 72 20 70 72 6f 67 72 61 6d 73 20 61 73  gger programs as
7200: 20 69 74 20 6d 61 79 20 6f 6e 6c 79 0a 23 20 64   it may only.# d
7210: 6f 20 73 6f 20 69 6e 20 63 6f 64 65 20 67 65 6e  o so in code gen
7220: 65 72 61 74 65 64 20 62 65 66 6f 72 65 20 74 68  erated before th
7230: 65 20 66 69 72 73 74 20 74 61 62 6c 65 20 6f 72  e first table or
7240: 20 69 6e 64 65 78 20 69 73 20 6f 70 65 6e 65 64   index is opened
7250: 2e 20 41 6e 64 0a 23 20 62 79 20 74 68 65 20 74  . And.# by the t
7260: 69 6d 65 20 61 20 74 72 69 67 67 65 72 20 70 72  ime a trigger pr
7270: 6f 67 72 61 6d 20 69 73 20 63 6f 64 65 64 2c 20  ogram is coded, 
7280: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 74 61 62  at least one tab
7290: 6c 65 20 6f 72 20 69 6e 64 65 78 20 68 61 73 0a  le or index has.
72a0: 23 20 61 6c 77 61 79 73 20 62 65 65 6e 20 6f 70  # always been op
72b0: 65 6e 65 64 2e 0a 23 0a 23 20 41 74 20 6f 6e 65  ened..#.# At one
72c0: 20 70 6f 69 6e 74 2c 20 64 75 65 20 74 6f 20 61   point, due to a
72d0: 20 62 75 67 20 61 6c 6c 6f 77 69 6e 67 20 63 6f   bug allowing co
72e0: 6e 73 74 61 6e 74 20 66 61 63 74 6f 72 69 6e 67  nstant factoring
72f0: 20 77 69 74 68 69 6e 20 74 72 69 67 67 65 72 73   within triggers
7300: 2c 0a 23 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ,.# the followin
7310: 67 20 53 51 4c 20 77 6f 75 6c 64 20 70 72 6f 64  g SQL would prod
7320: 75 63 65 20 74 68 65 20 77 72 6f 6e 67 20 72 65  uce the wrong re
7330: 73 75 6c 74 2e 0a 23 0a 73 65 74 20 53 51 4c 20  sult..#.set SQL 
7340: 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  {.  CREATE TABLE
7350: 20 74 31 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20   t1(a, b, c);.  
7360: 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20  CREATE INDEX i1 
7370: 4f 4e 20 74 31 28 61 2c 20 63 29 3b 0a 20 20 43  ON t1(a, c);.  C
7380: 52 45 41 54 45 20 49 4e 44 45 58 20 69 32 20 4f  REATE INDEX i2 O
7390: 4e 20 74 31 28 62 2c 20 63 29 3b 0a 20 20 49 4e  N t1(b, c);.  IN
73a0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
73b0: 55 45 53 28 31 2c 20 32 2c 20 33 29 3b 0a 0a 20  UES(1, 2, 3);.. 
73c0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
73d0: 28 65 2c 20 66 29 3b 0a 20 20 43 52 45 41 54 45  (e, f);.  CREATE
73e0: 20 49 4e 44 45 58 20 69 33 20 4f 4e 20 74 32 28   INDEX i3 ON t2(
73f0: 65 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  e);.  INSERT INT
7400: 4f 20 74 32 20 56 41 4c 55 45 53 28 31 32 33 34  O t2 VALUES(1234
7410: 35 36 37 2c 20 33 29 3b 0a 0a 20 20 43 52 45 41  567, 3);..  CREA
7420: 54 45 20 54 41 42 4c 45 20 65 6d 70 74 79 28 78  TE TABLE empty(x
7430: 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  );.  CREATE TABL
7440: 45 20 6e 6f 74 5f 65 6d 70 74 79 28 78 29 3b 0a  E not_empty(x);.
7450: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6e 6f    INSERT INTO no
7460: 74 5f 65 6d 70 74 79 20 56 41 4c 55 45 53 28 32  t_empty VALUES(2
7470: 29 3b 0a 0a 20 20 43 52 45 41 54 45 20 54 41 42  );..  CREATE TAB
7480: 4c 45 20 74 34 28 78 29 3b 0a 20 20 43 52 45 41  LE t4(x);.  CREA
7490: 54 45 20 54 41 42 4c 45 20 74 35 28 67 2c 20 68  TE TABLE t5(g, h
74a0: 2c 20 69 29 3b 0a 0a 20 20 43 52 45 41 54 45 20  , i);..  CREATE 
74b0: 54 52 49 47 47 45 52 20 74 72 69 67 20 42 45 46  TRIGGER trig BEF
74c0: 4f 52 45 20 49 4e 53 45 52 54 20 4f 4e 20 74 34  ORE INSERT ON t4
74d0: 20 42 45 47 49 4e 0a 20 20 20 20 49 4e 53 45 52   BEGIN.    INSER
74e0: 54 20 49 4e 54 4f 20 74 35 20 53 45 4c 45 43 54  T INTO t5 SELECT
74f0: 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
7500: 20 0a 20 20 20 20 20 20 20 20 28 61 20 49 4e 20   .        (a IN 
7510: 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 65  (SELECT x FROM e
7520: 6d 70 74 79 29 20 4f 52 20 62 20 49 4e 20 28 53  mpty) OR b IN (S
7530: 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 6e 6f 74  ELECT x FROM not
7540: 5f 65 6d 70 74 79 29 29 20 0a 20 20 20 20 20 20  _empty)) .      
7550: 20 20 41 4e 44 20 63 20 49 4e 20 28 53 45 4c 45    AND c IN (SELE
7560: 43 54 20 66 20 46 52 4f 4d 20 74 32 20 57 48 45  CT f FROM t2 WHE
7570: 52 45 20 65 3d 31 32 33 34 35 36 37 29 3b 0a 20  RE e=1234567);. 
7580: 20 45 4e 44 3b 0a 0a 20 20 49 4e 53 45 52 54 20   END;..  INSERT 
7590: 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 30  INTO t4 VALUES(0
75a0: 29 3b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52  );.  SELECT * FR
75b0: 4f 4d 20 74 35 3b 0a 7d 0a 0a 72 65 73 65 74 5f  OM t5;.}..reset_
75c0: 64 62 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  db.do_execsql_te
75d0: 73 74 20 74 72 69 67 67 65 72 43 2d 31 34 2e 31  st triggerC-14.1
75e0: 20 24 53 51 4c 20 7b 31 20 32 20 33 7d 0a 72 65   $SQL {1 2 3}.re
75f0: 73 65 74 5f 64 62 0a 6f 70 74 69 6d 69 7a 61 74  set_db.optimizat
7600: 69 6f 6e 5f 63 6f 6e 74 72 6f 6c 20 64 62 20 66  ion_control db f
7610: 61 63 74 6f 72 2d 63 6f 6e 73 74 61 6e 74 73 20  actor-constants 
7620: 30 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  0.do_execsql_tes
7630: 74 20 74 72 69 67 67 65 72 43 2d 31 34 2e 32 20  t triggerC-14.2 
7640: 24 53 51 4c 20 7b 31 20 32 20 33 7d 0a 0a 23 2d  $SQL {1 2 3}..#-
7650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7690: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 43 68 65 63 6b  --------.# Check
76a0: 20 74 68 61 74 20 74 61 62 6c 65 20 6e 61 6d 65   that table name
76b0: 73 20 75 73 65 64 20 62 79 20 74 72 69 67 67 65  s used by trigge
76c0: 72 20 70 72 6f 67 72 61 6d 73 20 61 72 65 20 64  r programs are d
76d0: 65 71 75 6f 74 65 64 20 65 78 61 63 74 6c 79 0a  equoted exactly.
76e0: 23 20 6f 6e 63 65 2e 0a 23 0a 64 6f 5f 65 78 65  # once..#.do_exe
76f0: 63 73 71 6c 5f 74 65 73 74 20 31 35 2e 31 2e 31  csql_test 15.1.1
7700: 20 7b 0a 20 20 50 52 41 47 4d 41 20 72 65 63 75   {.  PRAGMA recu
7710: 72 73 69 76 65 5f 74 72 69 67 67 65 72 73 20 3d  rsive_triggers =
7720: 20 31 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42   1;.  CREATE TAB
7730: 4c 45 20 6e 6f 64 65 28 0a 20 20 20 20 20 20 69  LE node(.      i
7740: 64 20 69 6e 74 20 6e 6f 74 20 6e 75 6c 6c 20 70  d int not null p
7750: 72 69 6d 61 72 79 20 6b 65 79 2c 20 0a 20 20 20  rimary key, .   
7760: 20 20 20 70 69 64 20 69 6e 74 20 6e 6f 74 20 6e     pid int not n
7770: 75 6c 6c 20 64 65 66 61 75 6c 74 20 30 20 72 65  ull default 0 re
7780: 66 65 72 65 6e 63 65 73 20 6e 6f 64 65 2c 0a 20  ferences node,. 
7790: 20 20 20 20 20 6b 65 79 20 76 61 72 63 68 61 72       key varchar
77a0: 20 6e 6f 74 20 6e 75 6c 6c 2c 20 0a 20 20 20 20   not null, .    
77b0: 20 20 70 61 74 68 20 76 61 72 63 68 61 72 20 64    path varchar d
77c0: 65 66 61 75 6c 74 20 27 27 2c 0a 20 20 20 20 20  efault '',.     
77d0: 20 75 6e 69 71 75 65 28 70 69 64 2c 20 6b 65 79   unique(pid, key
77e0: 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 43 52 45  ).      );.  CRE
77f0: 41 54 45 20 54 52 49 47 47 45 52 20 6e 6f 64 65  ATE TRIGGER node
7800: 5f 64 65 6c 65 74 65 5f 72 65 66 65 72 65 6e 63  _delete_referenc
7810: 69 6e 67 20 41 46 54 45 52 20 44 45 4c 45 54 45  ing AFTER DELETE
7820: 20 4f 4e 20 22 6e 6f 64 65 22 0a 20 20 20 20 42   ON "node".    B
7830: 45 47 49 4e 0a 20 20 20 20 44 45 4c 45 54 45 20  EGIN.    DELETE 
7840: 46 52 4f 4d 20 22 6e 6f 64 65 22 20 57 48 45 52  FROM "node" WHER
7850: 45 20 70 69 64 20 3d 20 6f 6c 64 2e 22 69 64 22  E pid = old."id"
7860: 3b 0a 20 20 45 4e 44 3b 0a 7d 0a 64 6f 5f 65 78  ;.  END;.}.do_ex
7870: 65 63 73 71 6c 5f 74 65 73 74 20 31 35 2e 31 2e  ecsql_test 15.1.
7880: 32 20 7b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  2 {.  INSERT INT
7890: 4f 20 6e 6f 64 65 28 69 64 2c 20 70 69 64 2c 20  O node(id, pid, 
78a0: 6b 65 79 29 20 56 41 4c 55 45 53 28 39 2c 20 30  key) VALUES(9, 0
78b0: 2c 20 27 74 65 73 74 27 29 3b 0a 20 20 49 4e 53  , 'test');.  INS
78c0: 45 52 54 20 49 4e 54 4f 20 6e 6f 64 65 28 69 64  ERT INTO node(id
78d0: 2c 20 70 69 64 2c 20 6b 65 79 29 20 56 41 4c 55  , pid, key) VALU
78e0: 45 53 28 39 30 2c 20 39 2c 20 27 74 65 73 74 31  ES(90, 9, 'test1
78f0: 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ');.  INSERT INT
7900: 4f 20 6e 6f 64 65 28 69 64 2c 20 70 69 64 2c 20  O node(id, pid, 
7910: 6b 65 79 29 20 56 41 4c 55 45 53 28 39 30 30 2c  key) VALUES(900,
7920: 20 39 30 2c 20 27 74 65 73 74 32 27 29 3b 0a 20   90, 'test2');. 
7930: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 6e 6f 64   DELETE FROM nod
7940: 65 20 57 48 45 52 45 20 69 64 3d 39 3b 0a 20 20  e WHERE id=9;.  
7950: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6e 6f  SELECT * FROM no
7960: 64 65 3b 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71  de;.}..do_execsq
7970: 6c 5f 74 65 73 74 20 31 35 2e 32 2e 31 20 7b 0a  l_test 15.2.1 {.
7980: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 20    CREATE TABLE  
7990: 20 78 31 20 20 28 78 29 3b 0a 0a 20 20 43 52 45   x1  (x);..  CRE
79a0: 41 54 45 20 54 41 42 4c 45 20 20 20 78 32 20 20  ATE TABLE   x2  
79b0: 28 61 2c 20 62 29 3b 0a 20 20 43 52 45 41 54 45  (a, b);.  CREATE
79c0: 20 54 41 42 4c 45 20 27 22 78 32 22 27 28 61 2c   TABLE '"x2"'(a,
79d0: 20 62 29 3b 0a 0a 20 20 49 4e 53 45 52 54 20 49   b);..  INSERT I
79e0: 4e 54 4f 20 78 32 20 56 41 4c 55 45 53 28 31 2c  NTO x2 VALUES(1,
79f0: 20 32 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e   2);.  INSERT IN
7a00: 54 4f 20 78 32 20 56 41 4c 55 45 53 28 33 2c 20  TO x2 VALUES(3, 
7a10: 34 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  4);.  INSERT INT
7a20: 4f 20 27 22 78 32 22 27 20 53 45 4c 45 43 54 20  O '"x2"' SELECT 
7a30: 2a 20 46 52 4f 4d 20 78 32 3b 0a 0a 20 20 43 52  * FROM x2;..  CR
7a40: 45 41 54 45 20 54 52 49 47 47 45 52 20 78 31 61  EATE TRIGGER x1a
7a50: 69 20 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f  i AFTER INSERT O
7a60: 4e 20 78 31 20 42 45 47 49 4e 0a 20 20 20 20 49  N x1 BEGIN.    I
7a70: 4e 53 45 52 54 20 49 4e 54 4f 20 22 22 22 78 32  NSERT INTO """x2
7a80: 22 22 22 20 56 41 4c 55 45 53 28 27 78 27 2c 20  """ VALUES('x', 
7a90: 27 79 27 29 3b 0a 20 20 20 20 44 45 4c 45 54 45  'y');.    DELETE
7aa0: 20 46 52 4f 4d 20 22 22 22 78 32 22 22 22 20 57   FROM """x2""" W
7ab0: 48 45 52 45 20 61 3d 31 3b 0a 20 20 20 20 55 50  HERE a=1;.    UP
7ac0: 44 41 54 45 20 22 22 22 78 32 22 22 22 20 53 45  DATE """x2""" SE
7ad0: 54 20 62 20 3d 20 31 31 20 57 48 45 52 45 20 61  T b = 11 WHERE a
7ae0: 20 3d 20 33 3b 0a 20 20 45 4e 44 3b 0a 0a 20 20   = 3;.  END;..  
7af0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 31 20 56  INSERT INTO x1 V
7b00: 41 4c 55 45 53 28 27 67 6f 21 27 29 3b 0a 7d 0a  ALUES('go!');.}.
7b10: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
7b20: 20 31 35 2e 32 2e 32 20 7b 20 53 45 4c 45 43 54   15.2.2 { SELECT
7b30: 20 2a 20 46 52 4f 4d 20 78 32 3b 20 20 20 20 20   * FROM x2;     
7b40: 20 20 7d 20 7b 31 20 32 20 33 20 34 7d 0a 64 6f    } {1 2 3 4}.do
7b50: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 35  _execsql_test 15
7b60: 2e 32 2e 33 20 7b 20 53 45 4c 45 43 54 20 2a 20  .2.3 { SELECT * 
7b70: 46 52 4f 4d 20 22 22 22 78 32 22 22 22 3b 20 7d  FROM """x2"""; }
7b80: 20 7b 33 20 31 31 20 78 20 79 7d 0a 0a 66 69 6e   {3 11 x y}..fin
7b90: 69 73 68 5f 74 65 73 74 0a                       ish_test.