/ Hex Artifact Content
Login

Artifact a68980c5955d62ee24be6f97129d824f199f9a4c:


0000: 23 20 32 30 30 39 20 41 75 67 75 73 74 20 32 34  # 2009 August 24
0010: 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20  .#.# The author 
0020: 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69  disclaims copyri
0030: 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72  ght to this sour
0040: 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61  ce code.  In pla
0050: 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20  ce of.# a legal 
0060: 6e 6f 74 69 63 65 27 2c 20 68 65 72 65 20 69 73  notice', here is
0070: 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23   a blessing:.#.#
0080: 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67      May you do g
0090: 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c  ood and not evil
00a0: 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66  ..#    May you f
00b0: 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20  ind forgiveness 
00c0: 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64  for yourself and
00d0: 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e   forgive others.
00e0: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68  .#    May you sh
00f0: 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65  are freely, neve
0100: 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68  r taking more th
0110: 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23  an you give..#.#
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 0a 23 0a 0a 73 65 74 20 74  *******.#..set t
0170: 65 73 74 64 69 72 20 5b 66 69 6c 65 20 64 69 72  estdir [file dir
0180: 6e 61 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f 75  name $argv0].sou
0190: 72 63 65 20 24 74 65 73 74 64 69 72 2f 74 65 73  rce $testdir/tes
01a0: 74 65 72 2e 74 63 6c 0a 69 66 63 61 70 61 62 6c  ter.tcl.ifcapabl
01b0: 65 20 7b 21 74 72 69 67 67 65 72 7d 20 7b 0a 20  e {!trigger} {. 
01c0: 20 66 69 6e 69 73 68 5f 74 65 73 74 0a 20 20 72   finish_test.  r
01d0: 65 74 75 72 6e 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  eturn.}..#------
01e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
01f0: 2d 2d 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 0a 23 20 54 65 73 74 20 6f 72 67 61 6e  ---.# Test organ
0230: 69 7a 61 74 69 6f 6e 3a 0a 23 0a 23 20 74 72 69  ization:.#.# tri
0240: 67 67 65 72 43 2d 31 2e 2a 3a 20 48 61 70 68 61  ggerC-1.*: Hapha
0250: 7a 61 72 64 6c 79 20 64 65 73 69 67 6e 65 64 20  zardly designed 
0260: 74 72 69 67 67 65 72 20 72 65 6c 61 74 65 64 20  trigger related 
0270: 74 65 73 74 73 20 74 68 61 74 20 77 65 72 65 20  tests that were 
0280: 75 73 65 66 75 6c 0a 23 20 20 20 20 20 20 20 20  useful.#        
0290: 20 20 20 20 20 20 20 64 75 72 69 6e 67 20 61 6e         during an
02a0: 20 75 70 67 72 61 64 65 20 6f 66 20 74 68 65 20   upgrade of the 
02b0: 74 72 69 67 67 65 72 73 20 73 75 62 2d 73 79 73  triggers sub-sys
02c0: 74 65 6d 2e 0a 23 20 0a 23 20 74 72 69 67 67 65  tem..# .# trigge
02d0: 72 43 2d 32 2e 2a 3a 0a 23 0a 23 20 74 72 69 67  rC-2.*:.#.# trig
02e0: 67 65 72 43 2d 33 2e 2a 3a 0a 23 0a 23 20 74 72  gerC-3.*:.#.# tr
02f0: 69 67 67 65 72 43 2d 34 2e 2a 3a 0a 23 0a 23 20  iggerC-4.*:.#.# 
0300: 74 72 69 67 67 65 72 43 2d 35 2e 2a 3a 20 54 65  triggerC-5.*: Te
0310: 73 74 20 74 68 61 74 20 77 68 65 6e 20 72 65 63  st that when rec
0320: 75 72 73 69 76 65 20 74 72 69 67 67 65 72 73 20  ursive triggers 
0330: 61 72 65 20 65 6e 61 62 6c 65 64 20 44 45 4c 45  are enabled DELE
0340: 54 45 20 0a 23 20 20 20 20 20 20 20 20 20 20 20  TE .#           
0350: 20 20 20 20 74 72 69 67 67 65 72 73 20 61 72 65      triggers are
0360: 20 66 69 72 65 64 20 77 68 65 6e 20 72 6f 77 73   fired when rows
0370: 20 61 72 65 20 64 65 6c 65 74 65 64 20 61 73 20   are deleted as 
0380: 70 61 72 74 20 6f 66 20 4f 52 0a 23 20 20 20 20  part of OR.#    
0390: 20 20 20 20 20 20 20 20 20 20 20 52 45 50 4c 41             REPLA
03a0: 43 45 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f  CE conflict reso
03b0: 6c 75 74 69 6f 6e 2e 20 41 6e 64 20 74 68 61 74  lution. And that
03c0: 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 66 69   they are not fi
03d0: 72 65 64 0a 23 20 20 20 20 20 20 20 20 20 20 20  red.#           
03e0: 20 20 20 20 69 66 20 72 65 63 75 72 73 69 76 65      if recursive
03f0: 20 74 72 69 67 67 65 72 73 20 61 72 65 20 6e 6f   triggers are no
0400: 74 20 65 6e 61 62 6c 65 64 2e 0a 23 0a 23 20 74  t enabled..#.# t
0410: 72 69 67 67 65 72 43 2d 36 2e 2a 3a 20 54 65 73  riggerC-6.*: Tes
0420: 74 20 74 68 61 74 20 74 68 65 20 72 65 63 75 72  t that the recur
0430: 73 69 76 65 5f 74 72 69 67 67 65 72 73 20 70 72  sive_triggers pr
0440: 61 67 6d 61 20 72 65 74 75 72 6e 73 20 63 6f 72  agma returns cor
0450: 72 65 63 74 0a 23 20 20 20 20 20 20 20 20 20 20  rect.#          
0460: 20 20 20 20 20 72 65 73 75 6c 74 73 20 77 68 65       results whe
0470: 6e 20 69 6e 76 6f 6b 65 64 20 77 69 74 68 6f 75  n invoked withou
0480: 74 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 23  t an argument..#
0490: 0a 0a 23 20 45 6e 61 62 6c 65 20 72 65 63 75 72  ..# Enable recur
04a0: 73 69 76 65 20 74 72 69 67 67 65 72 73 20 66 6f  sive triggers fo
04b0: 72 20 74 68 69 73 20 66 69 6c 65 2e 0a 23 0a 65  r this file..#.e
04c0: 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
04d0: 72 65 63 75 72 73 69 76 65 5f 74 72 69 67 67 65  recursive_trigge
04e0: 72 73 20 3d 20 6f 6e 20 7d 0a 0a 23 73 71 6c 69  rs = on }..#sqli
04f0: 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 5f 6c 6f  te3_db_config_lo
0500: 6f 6b 61 73 69 64 65 20 64 62 20 30 20 30 20 30  okaside db 0 0 0
0510: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
0520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 23 20 54  ------------.# T
0560: 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 74 65 73  his block of tes
0570: 74 73 2c 20 74 72 69 67 67 65 72 43 2d 31 2e 2a  ts, triggerC-1.*
0580: 2c 20 61 72 65 20 6e 6f 74 20 61 69 6d 65 64 20  , are not aimed 
0590: 61 74 20 61 6e 79 20 73 70 65 63 69 66 69 63 0a  at any specific.
05a0: 23 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68  # property of th
05b0: 65 20 74 72 69 67 67 65 72 73 20 73 75 62 2d 73  e triggers sub-s
05c0: 79 73 74 65 6d 2e 20 54 68 65 79 20 77 65 72 65  ystem. They were
05d0: 20 63 72 65 61 74 65 64 20 74 6f 20 64 65 62 75   created to debu
05e0: 67 0a 23 20 73 70 65 63 69 66 69 63 20 70 72 6f  g.# specific pro
05f0: 62 6c 65 6d 73 20 77 68 69 6c 65 20 6d 6f 64 69  blems while modi
0600: 66 79 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20  fying SQLite to 
0610: 73 75 70 70 6f 72 74 20 72 65 63 75 72 73 69 76  support recursiv
0620: 65 0a 23 20 74 72 69 67 67 65 72 73 2e 20 54 68  e.# triggers. Th
0630: 65 79 20 61 72 65 20 6c 65 66 74 20 68 65 72 65  ey are left here
0640: 20 69 6e 20 63 61 73 65 20 74 68 65 79 20 63 61   in case they ca
0650: 6e 20 68 65 6c 70 20 64 65 62 75 67 20 74 68 65  n help debug the
0660: 0a 23 20 73 61 6d 65 20 70 72 6f 62 6c 65 6d 73  .# same problems
0670: 20 61 67 61 69 6e 2e 0a 23 0a 64 6f 5f 74 65 73   again..#.do_tes
0680: 74 20 74 72 69 67 67 65 72 43 2d 31 2e 31 20 7b  t triggerC-1.1 {
0690: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
06a0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
06b0: 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20 43  (a, b, c);.    C
06c0: 52 45 41 54 45 20 54 41 42 4c 45 20 6c 6f 67 28  REATE TABLE log(
06d0: 74 2c 20 61 31 2c 20 62 31 2c 20 63 31 2c 20 61  t, a1, b1, c1, a
06e0: 32 2c 20 62 32 2c 20 63 32 29 3b 0a 20 20 20 20  2, b2, c2);.    
06f0: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74  CREATE TRIGGER t
0700: 72 69 67 31 20 42 45 46 4f 52 45 20 49 4e 53 45  rig1 BEFORE INSE
0710: 52 54 20 4f 4e 20 74 31 20 42 45 47 49 4e 0a 20  RT ON t1 BEGIN. 
0720: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
0730: 20 6c 6f 67 20 56 41 4c 55 45 53 28 27 62 65 66   log VALUES('bef
0740: 6f 72 65 27 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  ore', NULL, NULL
0750: 2c 20 4e 55 4c 4c 2c 20 6e 65 77 2e 61 2c 20 6e  , NULL, new.a, n
0760: 65 77 2e 62 2c 20 6e 65 77 2e 63 29 3b 0a 20 20  ew.b, new.c);.  
0770: 20 20 45 4e 44 3b 0a 20 20 20 20 43 52 45 41 54    END;.    CREAT
0780: 45 20 54 52 49 47 47 45 52 20 74 72 69 67 32 20  E TRIGGER trig2 
0790: 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f 4e 20  AFTER INSERT ON 
07a0: 74 31 20 42 45 47 49 4e 0a 20 20 20 20 20 20 49  t1 BEGIN.      I
07b0: 4e 53 45 52 54 20 49 4e 54 4f 20 6c 6f 67 20 56  NSERT INTO log V
07c0: 41 4c 55 45 53 28 27 61 66 74 65 72 27 2c 20 4e  ALUES('after', N
07d0: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c  ULL, NULL, NULL,
07e0: 20 6e 65 77 2e 61 2c 20 6e 65 77 2e 62 2c 20 6e   new.a, new.b, n
07f0: 65 77 2e 63 29 3b 0a 20 20 20 20 45 4e 44 3b 0a  ew.c);.    END;.
0800: 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47      CREATE TRIGG
0810: 45 52 20 74 72 69 67 33 20 42 45 46 4f 52 45 20  ER trig3 BEFORE 
0820: 55 50 44 41 54 45 20 4f 4e 20 74 31 20 42 45 47  UPDATE ON t1 BEG
0830: 49 4e 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  IN.      INSERT 
0840: 49 4e 54 4f 20 6c 6f 67 20 56 41 4c 55 45 53 28  INTO log VALUES(
0850: 27 62 65 66 6f 72 65 27 2c 20 6f 6c 64 2e 61 2c  'before', old.a,
0860: 6f 6c 64 2e 62 2c 6f 6c 64 2e 63 2c 20 6e 65 77  old.b,old.c, new
0870: 2e 61 2c 6e 65 77 2e 62 2c 6e 65 77 2e 63 29 3b  .a,new.b,new.c);
0880: 0a 20 20 20 20 45 4e 44 3b 0a 20 20 20 20 43 52  .    END;.    CR
0890: 45 41 54 45 20 54 52 49 47 47 45 52 20 74 72 69  EATE TRIGGER tri
08a0: 67 34 20 41 46 54 45 52 20 55 50 44 41 54 45 20  g4 AFTER UPDATE 
08b0: 4f 4e 20 74 31 20 42 45 47 49 4e 0a 20 20 20 20  ON t1 BEGIN.    
08c0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c 6f    INSERT INTO lo
08d0: 67 20 56 41 4c 55 45 53 28 27 61 66 74 65 72 27  g VALUES('after'
08e0: 2c 20 6f 6c 64 2e 61 2c 6f 6c 64 2e 62 2c 6f 6c  , old.a,old.b,ol
08f0: 64 2e 63 2c 20 6e 65 77 2e 61 2c 6e 65 77 2e 62  d.c, new.a,new.b
0900: 2c 6e 65 77 2e 63 29 3b 0a 20 20 20 20 45 4e 44  ,new.c);.    END
0910: 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54 52  ;..    CREATE TR
0920: 49 47 47 45 52 20 74 72 69 67 35 20 42 45 46 4f  IGGER trig5 BEFO
0930: 52 45 20 44 45 4c 45 54 45 20 4f 4e 20 74 31 20  RE DELETE ON t1 
0940: 42 45 47 49 4e 0a 20 20 20 20 20 20 49 4e 53 45  BEGIN.      INSE
0950: 52 54 20 49 4e 54 4f 20 6c 6f 67 20 56 41 4c 55  RT INTO log VALU
0960: 45 53 28 27 62 65 66 6f 72 65 27 2c 20 6f 6c 64  ES('before', old
0970: 2e 61 2c 6f 6c 64 2e 62 2c 6f 6c 64 2e 63 2c 20  .a,old.b,old.c, 
0980: 4e 55 4c 4c 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b  NULL,NULL,NULL);
0990: 0a 20 20 20 20 45 4e 44 3b 0a 20 20 20 20 43 52  .    END;.    CR
09a0: 45 41 54 45 20 54 52 49 47 47 45 52 20 74 72 69  EATE TRIGGER tri
09b0: 67 36 20 41 46 54 45 52 20 44 45 4c 45 54 45 20  g6 AFTER DELETE 
09c0: 4f 4e 20 74 31 20 42 45 47 49 4e 0a 20 20 20 20  ON t1 BEGIN.    
09d0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c 6f    INSERT INTO lo
09e0: 67 20 56 41 4c 55 45 53 28 27 61 66 74 65 72 27  g VALUES('after'
09f0: 2c 20 6f 6c 64 2e 61 2c 6f 6c 64 2e 62 2c 6f 6c  , old.a,old.b,ol
0a00: 64 2e 63 2c 20 4e 55 4c 4c 2c 4e 55 4c 4c 2c 4e  d.c, NULL,NULL,N
0a10: 55 4c 4c 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20  ULL);.    END;. 
0a20: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
0a30: 74 72 69 67 67 65 72 43 2d 31 2e 32 20 7b 0a 20  triggerC-1.2 {. 
0a40: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49   execsql {.    I
0a50: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
0a60: 4c 55 45 53 28 27 41 27 2c 20 27 42 27 2c 20 27  LUES('A', 'B', '
0a70: 43 27 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  C');.    SELECT 
0a80: 2a 20 46 52 4f 4d 20 6c 6f 67 3b 0a 20 20 7d 0a  * FROM log;.  }.
0a90: 7d 20 7b 62 65 66 6f 72 65 20 7b 7d 20 7b 7d 20  } {before {} {} 
0aa0: 7b 7d 20 41 20 42 20 43 20 61 66 74 65 72 20 7b  {} A B C after {
0ab0: 7d 20 7b 7d 20 7b 7d 20 41 20 42 20 43 7d 0a 64  } {} {} A B C}.d
0ac0: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 43 2d  o_test triggerC-
0ad0: 31 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.3 {.  execsql 
0ae0: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
0af0: 74 31 20 7d 0a 7d 20 7b 41 20 42 20 43 7d 0a 64  t1 }.} {A B C}.d
0b00: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 43 2d  o_test triggerC-
0b10: 31 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.4 {.  execsql 
0b20: 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  {.    DELETE FRO
0b30: 4d 20 6c 6f 67 3b 0a 20 20 20 20 55 50 44 41 54  M log;.    UPDAT
0b40: 45 20 74 31 20 53 45 54 20 61 20 3d 20 27 61 27  E t1 SET a = 'a'
0b50: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
0b60: 52 4f 4d 20 6c 6f 67 3b 0a 20 20 7d 0a 7d 20 7b  ROM log;.  }.} {
0b70: 62 65 66 6f 72 65 20 41 20 42 20 43 20 61 20 42  before A B C a B
0b80: 20 43 20 61 66 74 65 72 20 41 20 42 20 43 20 61   C after A B C a
0b90: 20 42 20 43 7d 0a 64 6f 5f 74 65 73 74 20 74 72   B C}.do_test tr
0ba0: 69 67 67 65 72 43 2d 31 2e 35 20 7b 0a 20 20 65  iggerC-1.5 {.  e
0bb0: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
0bc0: 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 61  * FROM t1 }.} {a
0bd0: 20 42 20 43 7d 0a 64 6f 5f 74 65 73 74 20 74 72   B C}.do_test tr
0be0: 69 67 67 65 72 43 2d 31 2e 36 20 7b 0a 20 20 65  iggerC-1.6 {.  e
0bf0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c  xecsql {.    DEL
0c00: 45 54 45 20 46 52 4f 4d 20 6c 6f 67 3b 0a 20 20  ETE FROM log;.  
0c10: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31    DELETE FROM t1
0c20: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
0c30: 52 4f 4d 20 6c 6f 67 3b 0a 20 20 7d 0a 7d 20 7b  ROM log;.  }.} {
0c40: 62 65 66 6f 72 65 20 61 20 42 20 43 20 7b 7d 20  before a B C {} 
0c50: 7b 7d 20 7b 7d 20 61 66 74 65 72 20 61 20 42 20  {} {} after a B 
0c60: 43 20 7b 7d 20 7b 7d 20 7b 7d 7d 0a 64 6f 5f 74  C {} {} {}}.do_t
0c70: 65 73 74 20 74 72 69 67 67 65 72 43 2d 31 2e 37  est triggerC-1.7
0c80: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53   {.  execsql { S
0c90: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
0ca0: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 74  }.} {}.do_test t
0cb0: 72 69 67 67 65 72 43 2d 31 2e 38 20 7b 0a 20 20  riggerC-1.8 {.  
0cc0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
0cd0: 45 41 54 45 20 54 41 42 4c 45 20 74 34 28 61 2c  EATE TABLE t4(a,
0ce0: 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   b);.    CREATE 
0cf0: 54 52 49 47 47 45 52 20 74 34 74 20 41 46 54 45  TRIGGER t4t AFTE
0d00: 52 20 44 45 4c 45 54 45 20 4f 4e 20 74 34 20 42  R DELETE ON t4 B
0d10: 45 47 49 4e 0a 20 20 20 20 20 20 53 45 4c 45 43  EGIN.      SELEC
0d20: 54 20 52 41 49 53 45 28 41 42 4f 52 54 2c 20 27  T RAISE(ABORT, '
0d30: 64 65 6c 65 74 65 20 69 73 20 6e 6f 74 20 73 75  delete is not su
0d40: 70 70 6f 72 74 65 64 27 29 3b 0a 20 20 20 20 45  pported');.    E
0d50: 4e 44 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  ND;.  }.} {}.do_
0d60: 74 65 73 74 20 74 72 69 67 67 65 72 43 2d 31 2e  test triggerC-1.
0d70: 39 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  9 {.  execsql { 
0d80: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56  INSERT INTO t4 V
0d90: 41 4c 55 45 53 28 31 2c 20 32 29 20 7d 0a 20 20  ALUES(1, 2) }.  
0da0: 63 61 74 63 68 73 71 6c 20 7b 20 44 45 4c 45 54  catchsql { DELET
0db0: 45 20 46 52 4f 4d 20 74 34 20 7d 0a 7d 20 7b 31  E FROM t4 }.} {1
0dc0: 20 7b 64 65 6c 65 74 65 20 69 73 20 6e 6f 74 20   {delete is not 
0dd0: 73 75 70 70 6f 72 74 65 64 7d 7d 0a 64 6f 5f 74  supported}}.do_t
0de0: 65 73 74 20 74 72 69 67 67 65 72 43 2d 31 2e 31  est triggerC-1.1
0df0: 30 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  0 {.  execsql { 
0e00: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 34  SELECT * FROM t4
0e10: 20 7d 0a 7d 20 7b 31 20 32 7d 0a 64 6f 5f 74 65   }.} {1 2}.do_te
0e20: 73 74 20 74 72 69 67 67 65 72 43 2d 31 2e 31 31  st triggerC-1.11
0e30: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
0e40: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
0e50: 74 35 20 28 61 20 70 72 69 6d 61 72 79 20 6b 65  t5 (a primary ke
0e60: 79 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20 49 4e  y, b, c);.    IN
0e70: 53 45 52 54 20 49 4e 54 4f 20 74 35 20 76 61 6c  SERT INTO t5 val
0e80: 75 65 73 20 28 31 2c 20 32 2c 20 33 29 3b 0a 20  ues (1, 2, 3);. 
0e90: 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45     CREATE TRIGGE
0ea0: 52 20 61 75 5f 74 62 6c 20 41 46 54 45 52 20 55  R au_tbl AFTER U
0eb0: 50 44 41 54 45 20 4f 4e 20 74 35 20 42 45 47 49  PDATE ON t5 BEGI
0ec0: 4e 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 4f  N.      UPDATE O
0ed0: 52 20 49 47 4e 4f 52 45 20 74 35 20 53 45 54 20  R IGNORE t5 SET 
0ee0: 61 20 3d 20 6e 65 77 2e 61 2c 20 63 20 3d 20 31  a = new.a, c = 1
0ef0: 30 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 7d 0a  0;.    END;.  }.
0f00: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69  } {}.do_test tri
0f10: 67 67 65 72 43 2d 31 2e 31 32 20 7b 0a 20 20 63  ggerC-1.12 {.  c
0f20: 61 74 63 68 73 71 6c 20 7b 20 55 50 44 41 54 45  atchsql { UPDATE
0f30: 20 4f 52 20 52 45 50 4c 41 43 45 20 74 35 20 53   OR REPLACE t5 S
0f40: 45 54 20 61 20 3d 20 34 20 57 48 45 52 45 20 61  ET a = 4 WHERE a
0f50: 20 3d 20 31 20 7d 0a 7d 20 7b 31 20 7b 74 6f 6f   = 1 }.} {1 {too
0f60: 20 6d 61 6e 79 20 6c 65 76 65 6c 73 20 6f 66 20   many levels of 
0f70: 74 72 69 67 67 65 72 20 72 65 63 75 72 73 69 6f  trigger recursio
0f80: 6e 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67  n}}.do_test trig
0f90: 67 65 72 43 2d 31 2e 31 33 20 7b 0a 20 20 65 78  gerC-1.13 {.  ex
0fa0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
0fb0: 54 45 20 54 41 42 4c 45 20 74 36 28 61 20 49 4e  TE TABLE t6(a IN
0fc0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
0fd0: 59 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52  Y, b);.    INSER
0fe0: 54 20 49 4e 54 4f 20 74 36 20 56 41 4c 55 45 53  T INTO t6 VALUES
0ff0: 28 31 2c 20 32 29 3b 0a 20 20 20 20 63 72 65 61  (1, 2);.    crea
1000: 74 65 20 74 72 69 67 67 65 72 20 72 31 20 61 66  te trigger r1 af
1010: 74 65 72 20 75 70 64 61 74 65 20 6f 6e 20 74 36  ter update on t6
1020: 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 62 65   for each row be
1030: 67 69 6e 0a 20 20 20 20 20 20 53 45 4c 45 43 54  gin.      SELECT
1040: 20 31 3b 0a 20 20 20 20 65 6e 64 3b 0a 20 20 20   1;.    end;.   
1050: 20 55 50 44 41 54 45 20 74 36 20 53 45 54 20 61   UPDATE t6 SET a
1060: 3d 61 3b 20 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f  =a; .  }.} {}.do
1070: 5f 74 65 73 74 20 74 72 69 67 67 65 72 43 2d 31  _test triggerC-1
1080: 2e 31 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  .14 {.  execsql 
1090: 7b 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45  {.    DROP TABLE
10a0: 20 74 31 3b 0a 20 20 20 20 43 52 45 41 54 45 20   t1;.    CREATE 
10b0: 54 41 42 4c 45 20 63 6e 74 28 6e 29 3b 0a 20 20  TABLE cnt(n);.  
10c0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 6e    INSERT INTO cn
10d0: 74 20 56 41 4c 55 45 53 28 30 29 3b 0a 20 20 20  t VALUES(0);.   
10e0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
10f0: 28 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  (a INTEGER PRIMA
1100: 52 59 20 4b 45 59 2c 20 62 20 55 4e 49 51 55 45  RY KEY, b UNIQUE
1110: 2c 20 63 2c 20 64 2c 20 65 29 3b 0a 20 20 20 20  , c, d, e);.    
1120: 43 52 45 41 54 45 20 49 4e 44 45 58 20 74 31 63  CREATE INDEX t1c
1130: 64 20 4f 4e 20 74 31 28 63 2c 64 29 3b 0a 20 20  d ON t1(c,d);.  
1140: 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52    CREATE TRIGGER
1150: 20 74 31 72 31 20 41 46 54 45 52 20 55 50 44 41   t1r1 AFTER UPDA
1160: 54 45 20 4f 4e 20 74 31 20 42 45 47 49 4e 20 55  TE ON t1 BEGIN U
1170: 50 44 41 54 45 20 63 6e 74 20 53 45 54 20 6e 3d  PDATE cnt SET n=
1180: 6e 2b 31 3b 20 45 4e 44 3b 0a 20 20 20 20 49 4e  n+1; END;.    IN
1190: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
11a0: 55 45 53 28 31 2c 32 2c 33 2c 34 2c 35 29 3b 0a  UES(1,2,3,4,5);.
11b0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
11c0: 74 31 20 56 41 4c 55 45 53 28 36 2c 37 2c 38 2c  t1 VALUES(6,7,8,
11d0: 39 2c 31 30 29 3b 0a 20 20 20 20 49 4e 53 45 52  9,10);.    INSER
11e0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
11f0: 28 31 31 2c 31 32 2c 31 33 2c 31 34 2c 31 35 29  (11,12,13,14,15)
1200: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
1210: 73 74 20 74 72 69 67 67 65 72 43 2d 31 2e 31 35  st triggerC-1.15
1220: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20   {.  catchsql { 
1230: 55 50 44 41 54 45 20 4f 52 20 52 4f 4c 4c 42 41  UPDATE OR ROLLBA
1240: 43 4b 20 74 31 20 53 45 54 20 61 3d 31 30 30 20  CK t1 SET a=100 
1250: 7d 0a 7d 20 7b 31 20 7b 55 4e 49 51 55 45 20 63  }.} {1 {UNIQUE c
1260: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
1270: 3a 20 74 31 2e 61 7d 7d 0a 0a 0a 23 2d 2d 2d 2d  : t1.a}}...#----
1280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1290: 2d 2d 2d 2d 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 0a 23 20 54 68 69 73 20 62 6c 6f  -----.# This blo
12d0: 63 6b 20 6f 66 20 74 65 73 74 73 2c 20 74 72 69  ck of tests, tri
12e0: 67 67 65 72 43 2d 32 2e 2a 2c 20 74 65 73 74 73  ggerC-2.*, tests
12f0: 20 74 68 61 74 20 72 65 63 75 72 73 69 76 65 20   that recursive 
1300: 74 72 69 67 67 65 72 0a 23 20 70 72 6f 67 72 61  trigger.# progra
1310: 6d 73 20 28 74 72 69 67 67 65 72 73 20 74 68 61  ms (triggers tha
1320: 74 20 66 69 72 65 20 74 68 65 6d 73 65 6c 76 65  t fire themselve
1330: 73 29 20 77 6f 72 6b 2e 20 4d 6f 72 65 20 73 70  s) work. More sp
1340: 65 63 69 66 69 63 61 6c 6c 79 2c 0a 23 20 74 68  ecifically,.# th
1350: 69 73 20 62 6c 6f 63 6b 20 66 6f 63 75 73 65 73  is block focuses
1360: 20 6f 6e 20 72 65 63 75 72 73 69 76 65 20 49 4e   on recursive IN
1370: 53 45 52 54 20 74 72 69 67 67 65 72 73 2e 0a 23  SERT triggers..#
1380: 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72  .do_test trigger
1390: 43 2d 32 2e 31 2e 30 20 7b 0a 20 20 65 78 65 63  C-2.1.0 {.  exec
13a0: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
13b0: 20 54 41 42 4c 45 20 74 32 28 61 20 50 52 49 4d   TABLE t2(a PRIM
13c0: 41 52 59 20 4b 45 59 29 3b 0a 20 20 7d 0a 7d 20  ARY KEY);.  }.} 
13d0: 7b 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 6e 20 74  {}..foreach {n t
13e0: 64 65 66 6e 20 72 63 7d 20 7b 0a 20 20 31 20 7b  defn rc} {.  1 {
13f0: 20 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49   .    CREATE TRI
1400: 47 47 45 52 20 74 32 5f 74 72 69 67 20 41 46 54  GGER t2_trig AFT
1410: 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 74 32 20  ER INSERT ON t2 
1420: 57 48 45 4e 20 28 6e 65 77 2e 61 3e 30 29 20 42  WHEN (new.a>0) B
1430: 45 47 49 4e 0a 20 20 20 20 20 20 49 4e 53 45 52  EGIN.      INSER
1440: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
1450: 28 6e 65 77 2e 61 20 2d 20 31 29 3b 0a 20 20 20  (new.a - 1);.   
1460: 20 45 4e 44 3b 20 0a 20 20 7d 20 7b 30 20 7b 31   END; .  } {0 {1
1470: 30 20 39 20 38 20 37 20 36 20 35 20 34 20 33 20  0 9 8 7 6 5 4 3 
1480: 32 20 31 20 30 7d 7d 0a 0a 20 20 32 20 7b 0a 20  2 1 0}}..  2 {. 
1490: 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45     CREATE TRIGGE
14a0: 52 20 74 32 5f 74 72 69 67 20 41 46 54 45 52 20  R t2_trig AFTER 
14b0: 49 4e 53 45 52 54 20 4f 4e 20 74 32 20 42 45 47  INSERT ON t2 BEG
14c0: 49 4e 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  IN.      SELECT 
14d0: 43 41 53 45 20 57 48 45 4e 20 6e 65 77 2e 61 3d  CASE WHEN new.a=
14e0: 3d 32 20 54 48 45 4e 20 52 41 49 53 45 28 49 47  =2 THEN RAISE(IG
14f0: 4e 4f 52 45 29 20 45 4c 53 45 20 4e 55 4c 4c 20  NORE) ELSE NULL 
1500: 45 4e 44 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  END;.      INSER
1510: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
1520: 28 6e 65 77 2e 61 20 2d 20 31 29 3b 0a 20 20 20  (new.a - 1);.   
1530: 20 45 4e 44 3b 0a 20 20 7d 20 7b 30 20 7b 31 30   END;.  } {0 {10
1540: 20 39 20 38 20 37 20 36 20 35 20 34 20 33 20 32   9 8 7 6 5 4 3 2
1550: 7d 7d 0a 0a 20 20 33 20 7b 20 0a 20 20 20 20 43  }}..  3 { .    C
1560: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74 32  REATE TRIGGER t2
1570: 5f 74 72 69 67 20 42 45 46 4f 52 45 20 49 4e 53  _trig BEFORE INS
1580: 45 52 54 20 4f 4e 20 74 32 20 57 48 45 4e 20 28  ERT ON t2 WHEN (
1590: 6e 65 77 2e 61 3e 30 29 20 42 45 47 49 4e 0a 20  new.a>0) BEGIN. 
15a0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
15b0: 20 74 32 20 56 41 4c 55 45 53 28 6e 65 77 2e 61   t2 VALUES(new.a
15c0: 20 2d 20 31 29 3b 0a 20 20 20 20 45 4e 44 3b 20   - 1);.    END; 
15d0: 0a 20 20 7d 20 7b 30 20 7b 30 20 31 20 32 20 33  .  } {0 {0 1 2 3
15e0: 20 34 20 35 20 36 20 37 20 38 20 39 20 31 30 7d   4 5 6 7 8 9 10}
15f0: 7d 0a 0a 20 20 34 20 7b 20 0a 20 20 20 20 43 52  }..  4 { .    CR
1600: 45 41 54 45 20 54 52 49 47 47 45 52 20 74 32 5f  EATE TRIGGER t2_
1610: 74 72 69 67 20 42 45 46 4f 52 45 20 49 4e 53 45  trig BEFORE INSE
1620: 52 54 20 4f 4e 20 74 32 20 42 45 47 49 4e 0a 20  RT ON t2 BEGIN. 
1630: 20 20 20 20 20 53 45 4c 45 43 54 20 43 41 53 45       SELECT CASE
1640: 20 57 48 45 4e 20 6e 65 77 2e 61 3d 3d 32 20 54   WHEN new.a==2 T
1650: 48 45 4e 20 52 41 49 53 45 28 49 47 4e 4f 52 45  HEN RAISE(IGNORE
1660: 29 20 45 4c 53 45 20 4e 55 4c 4c 20 45 4e 44 3b  ) ELSE NULL END;
1670: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
1680: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 6e 65 77  TO t2 VALUES(new
1690: 2e 61 20 2d 20 31 29 3b 0a 20 20 20 20 45 4e 44  .a - 1);.    END
16a0: 3b 0a 20 20 7d 20 7b 30 20 7b 33 20 34 20 35 20  ;.  } {0 {3 4 5 
16b0: 36 20 37 20 38 20 39 20 31 30 7d 7d 0a 0a 20 20  6 7 8 9 10}}..  
16c0: 35 20 7b 20 0a 20 20 20 20 43 52 45 41 54 45 20  5 { .    CREATE 
16d0: 54 52 49 47 47 45 52 20 74 32 5f 74 72 69 67 20  TRIGGER t2_trig 
16e0: 42 45 46 4f 52 45 20 49 4e 53 45 52 54 20 4f 4e  BEFORE INSERT ON
16f0: 20 74 32 20 42 45 47 49 4e 0a 20 20 20 20 20 20   t2 BEGIN.      
1700: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
1710: 41 4c 55 45 53 28 6e 65 77 2e 61 20 2d 20 31 29  ALUES(new.a - 1)
1720: 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 7d 20 7b  ;.    END;.  } {
1730: 31 20 7b 74 6f 6f 20 6d 61 6e 79 20 6c 65 76 65  1 {too many leve
1740: 6c 73 20 6f 66 20 74 72 69 67 67 65 72 20 72 65  ls of trigger re
1750: 63 75 72 73 69 6f 6e 7d 7d 0a 0a 20 20 36 20 7b  cursion}}..  6 {
1760: 20 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49   .    CREATE TRI
1770: 47 47 45 52 20 74 32 5f 74 72 69 67 20 41 46 54  GGER t2_trig AFT
1780: 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 74 32 20  ER INSERT ON t2 
1790: 57 48 45 4e 20 28 6e 65 77 2e 61 3e 30 29 20 42  WHEN (new.a>0) B
17a0: 45 47 49 4e 0a 20 20 20 20 20 20 49 4e 53 45 52  EGIN.      INSER
17b0: 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f  T OR IGNORE INTO
17c0: 20 74 32 20 56 41 4c 55 45 53 28 6e 65 77 2e 61   t2 VALUES(new.a
17d0: 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 7d 20  );.    END;.  } 
17e0: 7b 30 20 31 30 7d 0a 0a 20 20 37 20 7b 20 0a 20  {0 10}..  7 { . 
17f0: 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45     CREATE TRIGGE
1800: 52 20 74 32 5f 74 72 69 67 20 42 45 46 4f 52 45  R t2_trig BEFORE
1810: 20 49 4e 53 45 52 54 20 4f 4e 20 74 32 20 57 48   INSERT ON t2 WH
1820: 45 4e 20 28 6e 65 77 2e 61 3e 30 29 20 42 45 47  EN (new.a>0) BEG
1830: 49 4e 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  IN.      INSERT 
1840: 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20 74  OR IGNORE INTO t
1850: 32 20 56 41 4c 55 45 53 28 6e 65 77 2e 61 29 3b  2 VALUES(new.a);
1860: 0a 20 20 20 20 45 4e 44 3b 0a 20 20 7d 20 7b 31  .    END;.  } {1
1870: 20 7b 74 6f 6f 20 6d 61 6e 79 20 6c 65 76 65 6c   {too many level
1880: 73 20 6f 66 20 74 72 69 67 67 65 72 20 72 65 63  s of trigger rec
1890: 75 72 73 69 6f 6e 7d 7d 0a 7d 20 7b 0a 20 20 64  ursion}}.} {.  d
18a0: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 43 2d  o_test triggerC-
18b0: 32 2e 31 2e 24 6e 20 7b 0a 20 20 20 20 63 61 74  2.1.$n {.    cat
18c0: 63 68 73 71 6c 20 7b 20 44 52 4f 50 20 54 52 49  chsql { DROP TRI
18d0: 47 47 45 52 20 74 32 5f 74 72 69 67 20 7d 0a 20  GGER t2_trig }. 
18e0: 20 20 20 65 78 65 63 73 71 6c 20 20 7b 20 44 45     execsql  { DE
18f0: 4c 45 54 45 20 46 52 4f 4d 20 74 32 20 7d 0a 20  LETE FROM t2 }. 
1900: 20 20 20 65 78 65 63 73 71 6c 20 20 24 74 64 65     execsql  $tde
1910: 66 6e 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20  fn.    catchsql 
1920: 7b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  {.      INSERT I
1930: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 31 30  NTO t2 VALUES(10
1940: 29 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  );.      SELECT 
1950: 2a 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20  * FROM t2 ORDER 
1960: 42 59 20 72 6f 77 69 64 3b 0a 20 20 20 20 7d 0a  BY rowid;.    }.
1970: 20 20 7d 20 24 72 63 0a 7d 0a 0a 64 6f 5f 74 65    } $rc.}..do_te
1980: 73 74 20 74 72 69 67 67 65 72 43 2d 32 2e 32 20  st triggerC-2.2 
1990: 7b 0a 20 20 65 78 65 63 73 71 6c 20 22 0a 20 20  {.  execsql ".  
19a0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
19b0: 32 32 28 78 29 3b 0a 0a 20 20 20 20 43 52 45 41  22(x);..    CREA
19c0: 54 45 20 54 52 49 47 47 45 52 20 74 32 32 61 20  TE TRIGGER t22a 
19d0: 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f 4e 20  AFTER INSERT ON 
19e0: 74 32 32 20 42 45 47 49 4e 0a 20 20 20 20 20 20  t22 BEGIN.      
19f0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 32 20  INSERT INTO t22 
1a00: 53 45 4c 45 43 54 20 78 20 2b 20 28 53 45 4c 45  SELECT x + (SELE
1a10: 43 54 20 6d 61 78 28 78 29 20 46 52 4f 4d 20 74  CT max(x) FROM t
1a20: 32 32 29 20 46 52 4f 4d 20 74 32 32 3b 0a 20 20  22) FROM t22;.  
1a30: 20 20 45 4e 44 3b 0a 20 20 20 20 43 52 45 41 54    END;.    CREAT
1a40: 45 20 54 52 49 47 47 45 52 20 74 32 32 62 20 42  E TRIGGER t22b B
1a50: 45 46 4f 52 45 20 49 4e 53 45 52 54 20 4f 4e 20  EFORE INSERT ON 
1a60: 74 32 32 20 42 45 47 49 4e 0a 20 20 20 20 20 20  t22 BEGIN.      
1a70: 53 45 4c 45 43 54 20 43 41 53 45 20 57 48 45 4e  SELECT CASE WHEN
1a80: 20 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   (SELECT count(*
1a90: 29 20 46 52 4f 4d 20 74 32 32 29 20 3e 3d 20 5b  ) FROM t22) >= [
1aa0: 65 78 70 72 20 24 53 51 4c 49 54 45 5f 4d 41 58  expr $SQLITE_MAX
1ab0: 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 2f  _TRIGGER_DEPTH /
1ac0: 20 32 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20   2].            
1ad0: 20 20 20 20 20 20 54 48 45 4e 20 52 41 49 53 45        THEN RAISE
1ae0: 28 49 47 4e 4f 52 45 29 0a 20 20 20 20 20 20 20  (IGNORE).       
1af0: 20 20 20 20 20 20 20 20 20 20 20 45 4c 53 45 20             ELSE 
1b00: 4e 55 4c 4c 20 45 4e 44 3b 0a 20 20 20 20 45 4e  NULL END;.    EN
1b10: 44 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54 20 49  D;..    INSERT I
1b20: 4e 54 4f 20 74 32 32 20 56 41 4c 55 45 53 28 31  NTO t22 VALUES(1
1b30: 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f  );.    SELECT co
1b40: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 32 3b  unt(*) FROM t22;
1b50: 0a 20 20 22 0a 7d 20 5b 6c 69 73 74 20 5b 65 78  .  ".} [list [ex
1b60: 70 72 20 24 53 51 4c 49 54 45 5f 4d 41 58 5f 54  pr $SQLITE_MAX_T
1b70: 52 49 47 47 45 52 5f 44 45 50 54 48 20 2f 20 32  RIGGER_DEPTH / 2
1b80: 5d 5d 0a 0a 64 6f 5f 74 65 73 74 20 74 72 69 67  ]]..do_test trig
1b90: 67 65 72 43 2d 32 2e 33 20 7b 0a 20 20 65 78 65  gerC-2.3 {.  exe
1ba0: 63 73 71 6c 20 22 0a 20 20 20 20 43 52 45 41 54  csql ".    CREAT
1bb0: 45 20 54 41 42 4c 45 20 74 32 33 28 78 20 50 52  E TABLE t23(x PR
1bc0: 49 4d 41 52 59 20 4b 45 59 29 3b 0a 0a 20 20 20  IMARY KEY);..   
1bd0: 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20   CREATE TRIGGER 
1be0: 74 32 33 61 20 41 46 54 45 52 20 49 4e 53 45 52  t23a AFTER INSER
1bf0: 54 20 4f 4e 20 74 32 33 20 42 45 47 49 4e 0a 20  T ON t23 BEGIN. 
1c00: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
1c10: 20 74 32 33 20 56 41 4c 55 45 53 28 6e 65 77 2e   t23 VALUES(new.
1c20: 78 20 2b 20 31 29 3b 0a 20 20 20 20 45 4e 44 3b  x + 1);.    END;
1c30: 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49  ..    CREATE TRI
1c40: 47 47 45 52 20 74 32 33 62 20 42 45 46 4f 52 45  GGER t23b BEFORE
1c50: 20 49 4e 53 45 52 54 20 4f 4e 20 74 32 33 20 42   INSERT ON t23 B
1c60: 45 47 49 4e 0a 20 20 20 20 20 20 53 45 4c 45 43  EGIN.      SELEC
1c70: 54 20 43 41 53 45 20 57 48 45 4e 20 6e 65 77 2e  T CASE WHEN new.
1c80: 78 3e 5b 65 78 70 72 20 24 53 51 4c 49 54 45 5f  x>[expr $SQLITE_
1c90: 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MAX_TRIGGER_DEPT
1ca0: 48 20 2f 20 32 5d 0a 20 20 20 20 20 20 20 20 20  H / 2].         
1cb0: 20 20 20 20 20 20 20 20 20 54 48 45 4e 20 52 41           THEN RA
1cc0: 49 53 45 28 49 47 4e 4f 52 45 29 0a 20 20 20 20  ISE(IGNORE).    
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 4c                EL
1ce0: 53 45 20 4e 55 4c 4c 20 45 4e 44 3b 0a 20 20 20  SE NULL END;.   
1cf0: 20 45 4e 44 3b 0a 0a 20 20 20 20 49 4e 53 45 52   END;..    INSER
1d00: 54 20 49 4e 54 4f 20 74 32 33 20 56 41 4c 55 45  T INTO t23 VALUE
1d10: 53 28 31 29 3b 0a 20 20 20 20 53 45 4c 45 43 54  S(1);.    SELECT
1d20: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
1d30: 32 33 3b 0a 20 20 22 0a 7d 20 5b 6c 69 73 74 20  23;.  ".} [list 
1d40: 5b 65 78 70 72 20 24 53 51 4c 49 54 45 5f 4d 41  [expr $SQLITE_MA
1d50: 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20  X_TRIGGER_DEPTH 
1d60: 2f 20 32 5d 5d 0a 20 0a 0a 23 2d 2d 2d 2d 2d 2d  / 2]]. ..#------
1d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d80: 2d 2d 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 0a 23 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f  -.# This block o
1dc0: 66 20 74 65 73 74 73 2c 20 74 72 69 67 67 65 72  f tests, trigger
1dd0: 43 2d 33 2e 2a 2c 20 74 65 73 74 20 74 68 61 74  C-3.*, test that
1de0: 20 53 51 4c 69 74 65 20 74 68 72 6f 77 73 20 61   SQLite throws a
1df0: 6e 20 65 78 63 65 70 74 69 6f 6e 0a 23 20 77 68  n exception.# wh
1e00: 65 6e 20 69 74 20 64 65 74 65 63 74 73 20 65 78  en it detects ex
1e10: 63 65 73 73 69 76 65 20 72 65 63 75 72 73 69 6f  cessive recursio
1e20: 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 74 72 69  n..#.do_test tri
1e30: 67 67 65 72 43 2d 33 2e 31 2e 31 20 7b 0a 20 20  ggerC-3.1.1 {.  
1e40: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
1e50: 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 61 2c  EATE TABLE t3(a,
1e60: 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   b);.    CREATE 
1e70: 54 52 49 47 47 45 52 20 74 33 69 20 41 46 54 45  TRIGGER t3i AFTE
1e80: 52 20 49 4e 53 45 52 54 20 4f 4e 20 74 33 20 42  R INSERT ON t3 B
1e90: 45 47 49 4e 0a 20 20 20 20 20 20 44 45 4c 45 54  EGIN.      DELET
1ea0: 45 20 46 52 4f 4d 20 74 33 20 57 48 45 52 45 20  E FROM t3 WHERE 
1eb0: 72 6f 77 69 64 20 3d 20 6e 65 77 2e 72 6f 77 69  rowid = new.rowi
1ec0: 64 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 20 20  d;.    END;.    
1ed0: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74  CREATE TRIGGER t
1ee0: 33 64 20 41 46 54 45 52 20 44 45 4c 45 54 45 20  3d AFTER DELETE 
1ef0: 4f 4e 20 74 33 20 42 45 47 49 4e 0a 20 20 20 20  ON t3 BEGIN.    
1f00: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
1f10: 20 56 41 4c 55 45 53 28 6f 6c 64 2e 61 2c 20 6f   VALUES(old.a, o
1f20: 6c 64 2e 62 29 3b 0a 20 20 20 20 45 4e 44 3b 0a  ld.b);.    END;.
1f30: 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
1f40: 20 74 72 69 67 67 65 72 43 2d 33 2e 31 2e 32 20   triggerC-3.1.2 
1f50: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49  {.  catchsql { I
1f60: 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41  NSERT INTO t3 VA
1f70: 4c 55 45 53 28 30 2c 30 29 20 7d 0a 7d 20 7b 31  LUES(0,0) }.} {1
1f80: 20 7b 74 6f 6f 20 6d 61 6e 79 20 6c 65 76 65 6c   {too many level
1f90: 73 20 6f 66 20 74 72 69 67 67 65 72 20 72 65 63  s of trigger rec
1fa0: 75 72 73 69 6f 6e 7d 7d 0a 64 6f 5f 74 65 73 74  ursion}}.do_test
1fb0: 20 74 72 69 67 67 65 72 43 2d 33 2e 31 2e 33 20   triggerC-3.1.3 
1fc0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  {.  execsql { SE
1fd0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 20 7d  LECT * FROM t3 }
1fe0: 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 74  .} {}..do_test t
1ff0: 72 69 67 67 65 72 43 2d 33 2e 32 2e 31 20 7b 0a  riggerC-3.2.1 {.
2000: 20 20 65 78 65 63 73 71 6c 20 22 0a 20 20 20 20    execsql ".    
2010: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 62  CREATE TABLE t3b
2020: 28 78 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  (x);.    CREATE 
2030: 54 52 49 47 47 45 52 20 74 33 62 69 20 41 46 54  TRIGGER t3bi AFT
2040: 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 74 33 62  ER INSERT ON t3b
2050: 20 57 48 45 4e 20 6e 65 77 2e 78 3c 5b 65 78 70   WHEN new.x<[exp
2060: 72 20 24 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52  r $SQLITE_MAX_TR
2070: 49 47 47 45 52 5f 44 45 50 54 48 20 2a 20 32 5d  IGGER_DEPTH * 2]
2080: 20 42 45 47 49 4e 0a 20 20 20 20 20 20 49 4e 53   BEGIN.      INS
2090: 45 52 54 20 49 4e 54 4f 20 74 33 62 20 56 41 4c  ERT INTO t3b VAL
20a0: 55 45 53 28 6e 65 77 2e 78 2b 31 29 3b 0a 20 20  UES(new.x+1);.  
20b0: 20 20 45 4e 44 3b 0a 20 20 22 0a 20 20 63 61 74    END;.  ".  cat
20c0: 63 68 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45  chsql {.    INSE
20d0: 52 54 20 49 4e 54 4f 20 74 33 62 20 56 41 4c 55  RT INTO t3b VALU
20e0: 45 53 28 31 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20  ES(1);.  }.} {1 
20f0: 7b 74 6f 6f 20 6d 61 6e 79 20 6c 65 76 65 6c 73  {too many levels
2100: 20 6f 66 20 74 72 69 67 67 65 72 20 72 65 63 75   of trigger recu
2110: 72 73 69 6f 6e 7d 7d 0a 64 6f 5f 74 65 73 74 20  rsion}}.do_test 
2120: 74 72 69 67 67 65 72 43 2d 33 2e 32 2e 32 20 7b  triggerC-3.2.2 {
2130: 0a 20 20 64 62 20 65 76 61 6c 20 7b 53 45 4c 45  .  db eval {SELE
2140: 43 54 20 2a 20 46 52 4f 4d 20 74 33 62 7d 0a 7d  CT * FROM t3b}.}
2150: 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 74 72 69   {}..do_test tri
2160: 67 67 65 72 43 2d 33 2e 33 2e 31 20 7b 0a 20 20  ggerC-3.3.1 {.  
2170: 63 61 74 63 68 73 71 6c 20 22 0a 20 20 20 20 49  catchsql ".    I
2180: 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 62 20 56  NSERT INTO t3b V
2190: 41 4c 55 45 53 28 5b 65 78 70 72 20 24 53 51 4c  ALUES([expr $SQL
21a0: 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f  ITE_MAX_TRIGGER_
21b0: 44 45 50 54 48 20 2b 20 31 5d 29 3b 0a 20 20 22  DEPTH + 1]);.  "
21c0: 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 74 65 73  .} {0 {}}.do_tes
21d0: 74 20 74 72 69 67 67 65 72 43 2d 33 2e 33 2e 32  t triggerC-3.3.2
21e0: 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b 53 45   {.  db eval {SE
21f0: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 2c 20 6d  LECT count(*), m
2200: 61 78 28 78 29 2c 20 6d 69 6e 28 78 29 20 46 52  ax(x), min(x) FR
2210: 4f 4d 20 74 33 62 7d 0a 7d 20 5b 6c 69 73 74 20  OM t3b}.} [list 
2220: 24 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47  $SQLITE_MAX_TRIG
2230: 47 45 52 5f 44 45 50 54 48 20 5b 65 78 70 72 20  GER_DEPTH [expr 
2240: 24 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47  $SQLITE_MAX_TRIG
2250: 47 45 52 5f 44 45 50 54 48 20 2a 20 32 5d 20 5b  GER_DEPTH * 2] [
2260: 65 78 70 72 20 24 53 51 4c 49 54 45 5f 4d 41 58  expr $SQLITE_MAX
2270: 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 2b  _TRIGGER_DEPTH +
2280: 20 31 5d 5d 0a 0a 64 6f 5f 74 65 73 74 20 74 72   1]]..do_test tr
2290: 69 67 67 65 72 43 2d 33 2e 34 2e 31 20 7b 0a 20  iggerC-3.4.1 {. 
22a0: 20 63 61 74 63 68 73 71 6c 20 22 0a 20 20 20 20   catchsql ".    
22b0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 33 62 3b  DELETE FROM t3b;
22c0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
22d0: 20 74 33 62 20 56 41 4c 55 45 53 28 5b 65 78 70   t3b VALUES([exp
22e0: 72 20 24 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52  r $SQLITE_MAX_TR
22f0: 49 47 47 45 52 5f 44 45 50 54 48 20 2d 20 31 5d  IGGER_DEPTH - 1]
2300: 29 3b 0a 20 20 22 0a 7d 20 7b 31 20 7b 74 6f 6f  );.  ".} {1 {too
2310: 20 6d 61 6e 79 20 6c 65 76 65 6c 73 20 6f 66 20   many levels of 
2320: 74 72 69 67 67 65 72 20 72 65 63 75 72 73 69 6f  trigger recursio
2330: 6e 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67  n}}.do_test trig
2340: 67 65 72 43 2d 33 2e 34 2e 32 20 7b 0a 20 20 64  gerC-3.4.2 {.  d
2350: 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 63  b eval {SELECT c
2360: 6f 75 6e 74 28 2a 29 2c 20 6d 61 78 28 78 29 2c  ount(*), max(x),
2370: 20 6d 69 6e 28 78 29 20 46 52 4f 4d 20 74 33 62   min(x) FROM t3b
2380: 7d 0a 7d 20 7b 30 20 7b 7d 20 7b 7d 7d 0a 0a 64  }.} {0 {} {}}..d
2390: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 43 2d  o_test triggerC-
23a0: 33 2e 35 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65  3.5.1 {.  sqlite
23b0: 33 5f 6c 69 6d 69 74 20 64 62 20 53 51 4c 49 54  3_limit db SQLIT
23c0: 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f  E_LIMIT_TRIGGER_
23d0: 44 45 50 54 48 20 20 5b 65 78 70 72 20 24 53 51  DEPTH  [expr $SQ
23e0: 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52  LITE_MAX_TRIGGER
23f0: 5f 44 45 50 54 48 20 2f 20 31 30 5d 0a 20 20 63  _DEPTH / 10].  c
2400: 61 74 63 68 73 71 6c 20 22 0a 20 20 20 20 49 4e  atchsql ".    IN
2410: 53 45 52 54 20 49 4e 54 4f 20 74 33 62 20 56 41  SERT INTO t3b VA
2420: 4c 55 45 53 28 5b 65 78 70 72 20 28 24 53 51 4c  LUES([expr ($SQL
2430: 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f  ITE_MAX_TRIGGER_
2440: 44 45 50 54 48 20 2a 20 32 29 20 2d 20 28 24 53  DEPTH * 2) - ($S
2450: 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45  QLITE_MAX_TRIGGE
2460: 52 5f 44 45 50 54 48 20 2f 20 31 30 29 20 2b 20  R_DEPTH / 10) + 
2470: 31 5d 29 3b 0a 20 20 22 0a 7d 20 7b 30 20 7b 7d  1]);.  ".} {0 {}
2480: 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65  }.do_test trigge
2490: 72 43 2d 33 2e 35 2e 32 20 7b 0a 20 20 64 62 20  rC-3.5.2 {.  db 
24a0: 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 63 6f 75  eval {SELECT cou
24b0: 6e 74 28 2a 29 2c 20 6d 61 78 28 78 29 2c 20 6d  nt(*), max(x), m
24c0: 69 6e 28 78 29 20 46 52 4f 4d 20 74 33 62 7d 0a  in(x) FROM t3b}.
24d0: 7d 20 5b 6c 69 73 74 20 5b 65 78 70 72 20 24 53  } [list [expr $S
24e0: 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45  QLITE_MAX_TRIGGE
24f0: 52 5f 44 45 50 54 48 20 2f 20 31 30 5d 20 5b 65  R_DEPTH / 10] [e
2500: 78 70 72 20 24 53 51 4c 49 54 45 5f 4d 41 58 5f  xpr $SQLITE_MAX_
2510: 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 2a 20  TRIGGER_DEPTH * 
2520: 32 5d 20 5b 65 78 70 72 20 28 24 53 51 4c 49 54  2] [expr ($SQLIT
2530: 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45  E_MAX_TRIGGER_DE
2540: 50 54 48 20 2a 20 32 29 20 2d 20 28 24 53 51 4c  PTH * 2) - ($SQL
2550: 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f  ITE_MAX_TRIGGER_
2560: 44 45 50 54 48 20 2f 20 31 30 29 20 2b 20 31 5d  DEPTH / 10) + 1]
2570: 5d 0a 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67  ]..do_test trigg
2580: 65 72 43 2d 33 2e 35 2e 33 20 7b 0a 20 20 63 61  erC-3.5.3 {.  ca
2590: 74 63 68 73 71 6c 20 22 0a 20 20 20 20 44 45 4c  tchsql ".    DEL
25a0: 45 54 45 20 46 52 4f 4d 20 74 33 62 3b 0a 20 20  ETE FROM t3b;.  
25b0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
25c0: 62 20 56 41 4c 55 45 53 28 5b 65 78 70 72 20 28  b VALUES([expr (
25d0: 24 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47  $SQLITE_MAX_TRIG
25e0: 47 45 52 5f 44 45 50 54 48 20 2a 20 32 29 20 2d  GER_DEPTH * 2) -
25f0: 20 28 24 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52   ($SQLITE_MAX_TR
2600: 49 47 47 45 52 5f 44 45 50 54 48 20 2f 20 31 30  IGGER_DEPTH / 10
2610: 29 5d 29 3b 0a 20 20 22 0a 7d 20 7b 31 20 7b 74  )]);.  ".} {1 {t
2620: 6f 6f 20 6d 61 6e 79 20 6c 65 76 65 6c 73 20 6f  oo many levels o
2630: 66 20 74 72 69 67 67 65 72 20 72 65 63 75 72 73  f trigger recurs
2640: 69 6f 6e 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 72  ion}}.do_test tr
2650: 69 67 67 65 72 43 2d 33 2e 35 2e 34 20 7b 0a 20  iggerC-3.5.4 {. 
2660: 20 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54   db eval {SELECT
2670: 20 63 6f 75 6e 74 28 2a 29 2c 20 6d 61 78 28 78   count(*), max(x
2680: 29 2c 20 6d 69 6e 28 78 29 20 46 52 4f 4d 20 74  ), min(x) FROM t
2690: 33 62 7d 0a 7d 20 7b 30 20 7b 7d 20 7b 7d 7d 0a  3b}.} {0 {} {}}.
26a0: 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72  .do_test trigger
26b0: 43 2d 33 2e 36 2e 31 20 7b 0a 20 20 73 71 6c 69  C-3.6.1 {.  sqli
26c0: 74 65 33 5f 6c 69 6d 69 74 20 64 62 20 53 51 4c  te3_limit db SQL
26d0: 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45  ITE_LIMIT_TRIGGE
26e0: 52 5f 44 45 50 54 48 20 31 0a 20 20 63 61 74 63  R_DEPTH 1.  catc
26f0: 68 73 71 6c 20 22 0a 20 20 20 20 49 4e 53 45 52  hsql ".    INSER
2700: 54 20 49 4e 54 4f 20 74 33 62 20 56 41 4c 55 45  T INTO t3b VALUE
2710: 53 28 5b 65 78 70 72 20 24 53 51 4c 49 54 45 5f  S([expr $SQLITE_
2720: 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MAX_TRIGGER_DEPT
2730: 48 20 2a 20 32 5d 29 3b 0a 20 20 22 0a 7d 20 7b  H * 2]);.  ".} {
2740: 30 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 72  0 {}}.do_test tr
2750: 69 67 67 65 72 43 2d 33 2e 36 2e 32 20 7b 0a 20  iggerC-3.6.2 {. 
2760: 20 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54   db eval {SELECT
2770: 20 63 6f 75 6e 74 28 2a 29 2c 20 6d 61 78 28 78   count(*), max(x
2780: 29 2c 20 6d 69 6e 28 78 29 20 46 52 4f 4d 20 74  ), min(x) FROM t
2790: 33 62 7d 0a 7d 20 5b 6c 69 73 74 20 31 20 5b 65  3b}.} [list 1 [e
27a0: 78 70 72 20 24 53 51 4c 49 54 45 5f 4d 41 58 5f  xpr $SQLITE_MAX_
27b0: 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 2a 20  TRIGGER_DEPTH * 
27c0: 32 5d 20 5b 65 78 70 72 20 24 53 51 4c 49 54 45  2] [expr $SQLITE
27d0: 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50  _MAX_TRIGGER_DEP
27e0: 54 48 20 2a 20 32 5d 5d 0a 0a 64 6f 5f 74 65 73  TH * 2]]..do_tes
27f0: 74 20 74 72 69 67 67 65 72 43 2d 33 2e 36 2e 33  t triggerC-3.6.3
2800: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 22 0a   {.  catchsql ".
2810: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
2820: 74 33 62 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  t3b;.    INSERT 
2830: 49 4e 54 4f 20 74 33 62 20 56 41 4c 55 45 53 28  INTO t3b VALUES(
2840: 5b 65 78 70 72 20 28 24 53 51 4c 49 54 45 5f 4d  [expr ($SQLITE_M
2850: 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  AX_TRIGGER_DEPTH
2860: 20 2a 20 32 29 20 2d 20 31 5d 29 3b 0a 20 20 22   * 2) - 1]);.  "
2870: 0a 7d 20 7b 31 20 7b 74 6f 6f 20 6d 61 6e 79 20  .} {1 {too many 
2880: 6c 65 76 65 6c 73 20 6f 66 20 74 72 69 67 67 65  levels of trigge
2890: 72 20 72 65 63 75 72 73 69 6f 6e 7d 7d 0a 64 6f  r recursion}}.do
28a0: 5f 74 65 73 74 20 74 72 69 67 67 65 72 43 2d 33  _test triggerC-3
28b0: 2e 36 2e 34 20 7b 0a 20 20 64 62 20 65 76 61 6c  .6.4 {.  db eval
28c0: 20 7b 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   {SELECT count(*
28d0: 29 2c 20 6d 61 78 28 78 29 2c 20 6d 69 6e 28 78  ), max(x), min(x
28e0: 29 20 46 52 4f 4d 20 74 33 62 7d 0a 7d 20 7b 30  ) FROM t3b}.} {0
28f0: 20 7b 7d 20 7b 7d 7d 0a 73 71 6c 69 74 65 33 5f   {} {}}.sqlite3_
2900: 6c 69 6d 69 74 20 64 62 20 53 51 4c 49 54 45 5f  limit db SQLITE_
2910: 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45  LIMIT_TRIGGER_DE
2920: 50 54 48 20 24 53 51 4c 49 54 45 5f 4d 41 58 5f  PTH $SQLITE_MAX_
2930: 54 52 49 47 47 45 52 5f 44 45 50 54 48 0a 0a 0a  TRIGGER_DEPTH...
2940: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
2950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 23 20 54 68 69 73 20  --------.# This 
2990: 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 74 65  next block of te
29a0: 73 74 73 2c 20 74 72 69 67 67 65 72 43 2d 34 2e  sts, triggerC-4.
29b0: 2a 2c 20 63 68 65 63 6b 73 20 74 68 61 74 20 61  *, checks that a
29c0: 66 66 69 6e 69 74 79 20 0a 23 20 74 72 61 6e 73  ffinity .# trans
29d0: 66 6f 72 6d 61 74 69 6f 6e 73 20 61 6e 64 20 63  formations and c
29e0: 6f 6e 73 74 72 61 69 6e 74 20 70 72 6f 63 65 73  onstraint proces
29f0: 73 69 6e 67 20 69 73 20 70 65 72 66 6f 72 6d 65  sing is performe
2a00: 64 20 61 74 20 74 68 65 20 63 6f 72 72 65 63 74  d at the correct
2a10: 20 0a 23 20 74 69 6d 65 73 20 72 65 6c 61 74 69   .# times relati
2a20: 76 65 20 74 6f 20 42 45 46 4f 52 45 20 61 6e 64  ve to BEFORE and
2a30: 20 41 46 54 45 52 20 74 72 69 67 67 65 72 73 2e   AFTER triggers.
2a40: 0a 23 0a 23 20 46 6f 72 20 61 6e 20 49 4e 53 45  .#.# For an INSE
2a50: 52 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 66 6f  RT statement, fo
2a60: 72 20 65 61 63 68 20 72 6f 77 20 74 6f 20 62 65  r each row to be
2a70: 20 69 6e 73 65 72 74 65 64 3a 0a 23 0a 23 20 20   inserted:.#.#  
2a80: 20 31 2e 20 41 70 70 6c 79 20 61 66 66 69 6e 69   1. Apply affini
2a90: 74 69 65 73 20 74 6f 20 6e 6f 6e 2d 72 6f 77 69  ties to non-rowi
2aa0: 64 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 69  d values to be i
2ab0: 6e 73 65 72 74 65 64 2e 0a 23 20 20 20 32 2e 20  nserted..#   2. 
2ac0: 46 69 72 65 20 42 45 46 4f 52 45 20 74 72 69 67  Fire BEFORE trig
2ad0: 67 65 72 73 2e 0a 23 20 20 20 33 2e 20 50 72 6f  gers..#   3. Pro
2ae0: 63 65 73 73 20 63 6f 6e 73 74 72 61 69 6e 74 73  cess constraints
2af0: 2e 0a 23 20 20 20 34 2e 20 49 6e 73 65 72 74 20  ..#   4. Insert 
2b00: 6e 65 77 20 72 65 63 6f 72 64 2e 0a 23 20 20 20  new record..#   
2b10: 35 2e 20 46 69 72 65 20 41 46 54 45 52 20 74 72  5. Fire AFTER tr
2b20: 69 67 67 65 72 73 2e 0a 23 0a 23 20 49 66 20 74  iggers..#.# If t
2b30: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
2b40: 72 6f 77 69 64 20 66 69 65 6c 64 20 69 73 20 74  rowid field is t
2b50: 6f 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  o be automatical
2b60: 6c 79 20 61 73 73 69 67 6e 65 64 2c 20 69 74 20  ly assigned, it 
2b70: 69 73 0a 23 20 73 65 74 20 74 6f 20 2d 31 20 69  is.# set to -1 i
2b80: 6e 20 74 68 65 20 6e 65 77 2e 2a 20 72 65 63 6f  n the new.* reco
2b90: 72 64 2e 20 45 76 65 6e 20 69 66 20 69 74 20 69  rd. Even if it i
2ba0: 73 20 65 78 70 6c 69 63 69 74 6c 79 20 73 65 74  s explicitly set
2bb0: 20 74 6f 20 4e 55 4c 4c 0a 23 20 62 79 20 74 68   to NULL.# by th
2bc0: 65 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65  e INSERT stateme
2bd0: 6e 74 2e 0a 23 0a 23 20 46 6f 72 20 61 6e 20 55  nt..#.# For an U
2be0: 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 2c  PDATE statement,
2bf0: 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 74 6f   for each row to
2c00: 20 62 65 20 64 65 6c 65 74 65 64 3a 0a 23 0a 23   be deleted:.#.#
2c10: 20 20 20 31 2e 20 41 70 70 6c 79 20 61 66 66 69     1. Apply affi
2c20: 6e 69 74 69 65 73 20 74 6f 20 6e 6f 6e 2d 72 6f  nities to non-ro
2c30: 77 69 64 20 76 61 6c 75 65 73 20 74 6f 20 62 65  wid values to be
2c40: 20 69 6e 73 65 72 74 65 64 2e 0a 23 20 20 20 32   inserted..#   2
2c50: 2e 20 46 69 72 65 20 42 45 46 4f 52 45 20 74 72  . Fire BEFORE tr
2c60: 69 67 67 65 72 73 2e 0a 23 20 20 20 33 2e 20 50  iggers..#   3. P
2c70: 72 6f 63 65 73 73 20 63 6f 6e 73 74 72 61 69 6e  rocess constrain
2c80: 74 73 2e 0a 23 20 20 20 34 2e 20 49 6e 73 65 72  ts..#   4. Inser
2c90: 74 20 6e 65 77 20 72 65 63 6f 72 64 2e 0a 23 20  t new record..# 
2ca0: 20 20 35 2e 20 46 69 72 65 20 41 46 54 45 52 20    5. Fire AFTER 
2cb0: 74 72 69 67 67 65 72 73 2e 0a 23 0a 23 20 46 6f  triggers..#.# Fo
2cc0: 72 20 61 20 44 45 4c 45 54 45 20 73 74 61 74 65  r a DELETE state
2cd0: 6d 65 6e 74 2c 20 66 6f 72 20 65 61 63 68 20 72  ment, for each r
2ce0: 6f 77 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  ow to be deleted
2cf0: 3a 0a 23 0a 23 20 20 20 31 2e 20 46 69 72 65 20  :.#.#   1. Fire 
2d00: 42 45 46 4f 52 45 20 74 72 69 67 67 65 72 73 2e  BEFORE triggers.
2d10: 0a 23 20 20 20 32 2e 20 52 65 6d 6f 76 65 20 64  .#   2. Remove d
2d20: 61 74 61 62 61 73 65 20 72 65 63 6f 72 64 2e 0a  atabase record..
2d30: 23 20 20 20 33 2e 20 46 69 72 65 20 41 46 54 45  #   3. Fire AFTE
2d40: 52 20 74 72 69 67 67 65 72 73 2e 0a 23 0a 23 20  R triggers..#.# 
2d50: 57 68 65 6e 20 61 20 6e 75 6d 65 72 69 63 20 76  When a numeric v
2d60: 61 6c 75 65 20 74 68 61 74 20 61 73 20 61 6e 20  alue that as an 
2d70: 65 78 61 63 74 20 69 6e 74 65 67 65 72 20 72 65  exact integer re
2d80: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 73 20  presentation is 
2d90: 73 74 6f 72 65 64 0a 23 20 69 6e 20 61 20 63 6f  stored.# in a co
2da0: 6c 75 6d 6e 20 77 69 74 68 20 52 45 41 4c 20 61  lumn with REAL a
2db0: 66 66 69 6e 69 74 79 2c 20 69 74 20 69 73 20 61  ffinity, it is a
2dc0: 63 74 75 61 6c 6c 79 20 73 74 6f 72 65 64 20 61  ctually stored a
2dd0: 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 23 20  s an integer..# 
2de0: 54 68 65 73 65 20 74 65 73 74 73 20 63 68 65 63  These tests chec
2df0: 6b 20 74 68 61 74 20 74 68 65 20 74 79 70 65 6f  k that the typeo
2e00: 66 28 29 20 73 75 63 68 20 76 61 6c 75 65 73 20  f() such values 
2e10: 69 73 20 61 6c 77 61 79 73 20 27 72 65 61 6c 27  is always 'real'
2e20: 2c 0a 23 20 6e 6f 74 20 27 69 6e 74 65 67 65 72  ,.# not 'integer
2e30: 27 2e 0a 23 0a 23 20 74 72 69 67 67 65 72 43 2d  '..#.# triggerC-
2e40: 34 2e 31 2e 2a 3a 20 43 68 65 63 6b 20 74 68 61  4.1.*: Check tha
2e50: 74 20 61 66 66 69 6e 69 74 79 20 74 72 61 6e 73  t affinity trans
2e60: 66 6f 72 6d 61 74 69 6f 6e 73 20 61 72 65 20 6d  formations are m
2e70: 61 64 65 20 62 65 66 6f 72 65 0a 23 20 20 20 20  ade before.#    
2e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 69               tri
2e90: 67 67 65 72 73 20 61 72 65 20 69 6e 76 6f 6b 65  ggers are invoke
2ea0: 64 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 74 72 69  d..#.do_test tri
2eb0: 67 67 65 72 43 2d 34 2e 31 2e 31 20 7b 0a 20 20  ggerC-4.1.1 {.  
2ec0: 63 61 74 63 68 73 71 6c 20 7b 20 44 52 4f 50 20  catchsql { DROP 
2ed0: 54 41 42 4c 45 20 6c 6f 67 20 7d 0a 20 20 63 61  TABLE log }.  ca
2ee0: 74 63 68 73 71 6c 20 7b 20 44 52 4f 50 20 54 41  tchsql { DROP TA
2ef0: 42 4c 45 20 74 34 20 7d 0a 20 20 65 78 65 63 73  BLE t4 }.  execs
2f00: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
2f10: 54 41 42 4c 45 20 6c 6f 67 28 74 29 3b 0a 20 20  TABLE log(t);.  
2f20: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
2f30: 34 28 61 20 54 45 58 54 2c 62 20 49 4e 54 45 47  4(a TEXT,b INTEG
2f40: 45 52 2c 63 20 52 45 41 4c 29 3b 0a 20 20 20 20  ER,c REAL);.    
2f50: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74  CREATE TRIGGER t
2f60: 34 62 69 20 42 45 46 4f 52 45 20 49 4e 53 45 52  4bi BEFORE INSER
2f70: 54 20 4f 4e 20 74 34 20 42 45 47 49 4e 0a 20 20  T ON t4 BEGIN.  
2f80: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2f90: 6c 6f 67 20 56 41 4c 55 45 53 28 6e 65 77 2e 72  log VALUES(new.r
2fa0: 6f 77 69 64 20 7c 7c 20 27 20 27 20 7c 7c 20 74  owid || ' ' || t
2fb0: 79 70 65 6f 66 28 6e 65 77 2e 72 6f 77 69 64 29  ypeof(new.rowid)
2fc0: 20 7c 7c 20 27 20 27 20 7c 7c 0a 20 20 20 20 20   || ' ' ||.     
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe0: 20 20 20 20 20 20 20 20 6e 65 77 2e 61 20 20 20          new.a   
2ff0: 20 20 7c 7c 20 27 20 27 20 7c 7c 20 74 79 70 65    || ' ' || type
3000: 6f 66 28 6e 65 77 2e 61 29 20 20 20 20 20 7c 7c  of(new.a)     ||
3010: 20 27 20 27 20 7c 7c 0a 20 20 20 20 20 20 20 20   ' ' ||.        
3020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3030: 20 20 20 20 20 6e 65 77 2e 62 20 20 20 20 20 7c       new.b     |
3040: 7c 20 27 20 27 20 7c 7c 20 74 79 70 65 6f 66 28  | ' ' || typeof(
3050: 6e 65 77 2e 62 29 20 20 20 20 20 7c 7c 20 27 20  new.b)     || ' 
3060: 27 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  ' ||.           
3070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3080: 20 20 6e 65 77 2e 63 20 20 20 20 20 7c 7c 20 27    new.c     || '
3090: 20 27 20 7c 7c 20 74 79 70 65 6f 66 28 6e 65 77   ' || typeof(new
30a0: 2e 63 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  .c).      );.   
30b0: 20 45 4e 44 3b 0a 20 20 20 20 43 52 45 41 54 45   END;.    CREATE
30c0: 20 54 52 49 47 47 45 52 20 74 34 61 69 20 41 46   TRIGGER t4ai AF
30d0: 54 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 74 34  TER INSERT ON t4
30e0: 20 42 45 47 49 4e 0a 20 20 20 20 20 20 49 4e 53   BEGIN.      INS
30f0: 45 52 54 20 49 4e 54 4f 20 6c 6f 67 20 56 41 4c  ERT INTO log VAL
3100: 55 45 53 28 6e 65 77 2e 72 6f 77 69 64 20 7c 7c  UES(new.rowid ||
3110: 20 27 20 27 20 7c 7c 20 74 79 70 65 6f 66 28 6e   ' ' || typeof(n
3120: 65 77 2e 72 6f 77 69 64 29 20 7c 7c 20 27 20 27  ew.rowid) || ' '
3130: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ||.            
3140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3150: 20 6e 65 77 2e 61 20 20 20 20 20 7c 7c 20 27 20   new.a     || ' 
3160: 27 20 7c 7c 20 74 79 70 65 6f 66 28 6e 65 77 2e  ' || typeof(new.
3170: 61 29 20 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c  a)     || ' ' ||
3180: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65                ne
31a0: 77 2e 62 20 20 20 20 20 7c 7c 20 27 20 27 20 7c  w.b     || ' ' |
31b0: 7c 20 74 79 70 65 6f 66 28 6e 65 77 2e 62 29 20  | typeof(new.b) 
31c0: 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c 0a 20 20      || ' ' ||.  
31d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e0: 20 20 20 20 20 20 20 20 20 20 20 6e 65 77 2e 63             new.c
31f0: 20 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c 20 74       || ' ' || t
3200: 79 70 65 6f 66 28 6e 65 77 2e 63 29 0a 20 20 20  ypeof(new.c).   
3210: 20 20 20 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20     );.    END;. 
3220: 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45     CREATE TRIGGE
3230: 52 20 74 34 62 64 20 42 45 46 4f 52 45 20 44 45  R t4bd BEFORE DE
3240: 4c 45 54 45 20 4f 4e 20 74 34 20 42 45 47 49 4e  LETE ON t4 BEGIN
3250: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
3260: 54 4f 20 6c 6f 67 20 56 41 4c 55 45 53 28 6f 6c  TO log VALUES(ol
3270: 64 2e 72 6f 77 69 64 20 7c 7c 20 27 20 27 20 7c  d.rowid || ' ' |
3280: 7c 20 74 79 70 65 6f 66 28 6f 6c 64 2e 72 6f 77  | typeof(old.row
3290: 69 64 29 20 7c 7c 20 27 20 27 20 7c 7c 0a 20 20  id) || ' ' ||.  
32a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32b0: 20 20 20 20 20 20 20 20 20 20 20 6f 6c 64 2e 61             old.a
32c0: 20 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c 20 74       || ' ' || t
32d0: 79 70 65 6f 66 28 6f 6c 64 2e 61 29 20 20 20 20  ypeof(old.a)    
32e0: 20 7c 7c 20 27 20 27 20 7c 7c 0a 20 20 20 20 20   || ' ' ||.     
32f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3300: 20 20 20 20 20 20 20 20 6f 6c 64 2e 62 20 20 20          old.b   
3310: 20 20 7c 7c 20 27 20 27 20 7c 7c 20 74 79 70 65    || ' ' || type
3320: 6f 66 28 6f 6c 64 2e 62 29 20 20 20 20 20 7c 7c  of(old.b)     ||
3330: 20 27 20 27 20 7c 7c 0a 20 20 20 20 20 20 20 20   ' ' ||.        
3340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3350: 20 20 20 20 20 6f 6c 64 2e 63 20 20 20 20 20 7c       old.c     |
3360: 7c 20 27 20 27 20 7c 7c 20 74 79 70 65 6f 66 28  | ' ' || typeof(
3370: 6f 6c 64 2e 63 29 0a 20 20 20 20 20 20 29 3b 0a  old.c).      );.
3380: 20 20 20 20 45 4e 44 3b 0a 20 20 20 20 43 52 45      END;.    CRE
3390: 41 54 45 20 54 52 49 47 47 45 52 20 74 34 61 64  ATE TRIGGER t4ad
33a0: 20 41 46 54 45 52 20 44 45 4c 45 54 45 20 4f 4e   AFTER DELETE ON
33b0: 20 74 34 20 42 45 47 49 4e 0a 20 20 20 20 20 20   t4 BEGIN.      
33c0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c 6f 67 20  INSERT INTO log 
33d0: 56 41 4c 55 45 53 28 6f 6c 64 2e 72 6f 77 69 64  VALUES(old.rowid
33e0: 20 7c 7c 20 27 20 27 20 7c 7c 20 74 79 70 65 6f   || ' ' || typeo
33f0: 66 28 6f 6c 64 2e 72 6f 77 69 64 29 20 7c 7c 20  f(old.rowid) || 
3400: 27 20 27 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ' ' ||.         
3410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3420: 20 20 20 20 6f 6c 64 2e 61 20 20 20 20 20 7c 7c      old.a     ||
3430: 20 27 20 27 20 7c 7c 20 74 79 70 65 6f 66 28 6f   ' ' || typeof(o
3440: 6c 64 2e 61 29 20 20 20 20 20 7c 7c 20 27 20 27  ld.a)     || ' '
3450: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ||.            
3460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3470: 20 6f 6c 64 2e 62 20 20 20 20 20 7c 7c 20 27 20   old.b     || ' 
3480: 27 20 7c 7c 20 74 79 70 65 6f 66 28 6f 6c 64 2e  ' || typeof(old.
3490: 62 29 20 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c  b)     || ' ' ||
34a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
34b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 6c                ol
34c0: 64 2e 63 20 20 20 20 20 7c 7c 20 27 20 27 20 7c  d.c     || ' ' |
34d0: 7c 20 74 79 70 65 6f 66 28 6f 6c 64 2e 63 29 0a  | typeof(old.c).
34e0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 45 4e 44        );.    END
34f0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49  ;.    CREATE TRI
3500: 47 47 45 52 20 74 34 62 75 20 42 45 46 4f 52 45  GGER t4bu BEFORE
3510: 20 55 50 44 41 54 45 20 4f 4e 20 74 34 20 42 45   UPDATE ON t4 BE
3520: 47 49 4e 0a 20 20 20 20 20 20 49 4e 53 45 52 54  GIN.      INSERT
3530: 20 49 4e 54 4f 20 6c 6f 67 20 56 41 4c 55 45 53   INTO log VALUES
3540: 28 6f 6c 64 2e 72 6f 77 69 64 20 7c 7c 20 27 20  (old.rowid || ' 
3550: 27 20 7c 7c 20 74 79 70 65 6f 66 28 6f 6c 64 2e  ' || typeof(old.
3560: 72 6f 77 69 64 29 20 7c 7c 20 27 20 27 20 7c 7c  rowid) || ' ' ||
3570: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 6c                ol
3590: 64 2e 61 20 20 20 20 20 7c 7c 20 27 20 27 20 7c  d.a     || ' ' |
35a0: 7c 20 74 79 70 65 6f 66 28 6f 6c 64 2e 61 29 20  | typeof(old.a) 
35b0: 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c 0a 20 20      || ' ' ||.  
35c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35d0: 20 20 20 20 20 20 20 20 20 20 20 6f 6c 64 2e 62             old.b
35e0: 20 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c 20 74       || ' ' || t
35f0: 79 70 65 6f 66 28 6f 6c 64 2e 62 29 20 20 20 20  ypeof(old.b)    
3600: 20 7c 7c 20 27 20 27 20 7c 7c 0a 20 20 20 20 20   || ' ' ||.     
3610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3620: 20 20 20 20 20 20 20 20 6f 6c 64 2e 63 20 20 20          old.c   
3630: 20 20 7c 7c 20 27 20 27 20 7c 7c 20 74 79 70 65    || ' ' || type
3640: 6f 66 28 6f 6c 64 2e 63 29 0a 20 20 20 20 20 20  of(old.c).      
3650: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
3660: 49 4e 54 4f 20 6c 6f 67 20 56 41 4c 55 45 53 28  INTO log VALUES(
3670: 6e 65 77 2e 72 6f 77 69 64 20 7c 7c 20 27 20 27  new.rowid || ' '
3680: 20 7c 7c 20 74 79 70 65 6f 66 28 6e 65 77 2e 72   || typeof(new.r
3690: 6f 77 69 64 29 20 7c 7c 20 27 20 27 20 7c 7c 0a  owid) || ' ' ||.
36a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 77               new
36c0: 2e 61 20 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c  .a     || ' ' ||
36d0: 20 74 79 70 65 6f 66 28 6e 65 77 2e 61 29 20 20   typeof(new.a)  
36e0: 20 20 20 7c 7c 20 27 20 27 20 7c 7c 0a 20 20 20     || ' ' ||.   
36f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3700: 20 20 20 20 20 20 20 20 20 20 6e 65 77 2e 62 20            new.b 
3710: 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c 20 74 79      || ' ' || ty
3720: 70 65 6f 66 28 6e 65 77 2e 62 29 20 20 20 20 20  peof(new.b)     
3730: 7c 7c 20 27 20 27 20 7c 7c 0a 20 20 20 20 20 20  || ' ' ||.      
3740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3750: 20 20 20 20 20 20 20 6e 65 77 2e 63 20 20 20 20         new.c    
3760: 20 7c 7c 20 27 20 27 20 7c 7c 20 74 79 70 65 6f   || ' ' || typeo
3770: 66 28 6e 65 77 2e 63 29 0a 20 20 20 20 20 20 29  f(new.c).      )
3780: 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 20 20 43  ;.    END;.    C
3790: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74 34  REATE TRIGGER t4
37a0: 61 75 20 41 46 54 45 52 20 55 50 44 41 54 45 20  au AFTER UPDATE 
37b0: 4f 4e 20 74 34 20 42 45 47 49 4e 0a 20 20 20 20  ON t4 BEGIN.    
37c0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c 6f    INSERT INTO lo
37d0: 67 20 56 41 4c 55 45 53 28 6f 6c 64 2e 72 6f 77  g VALUES(old.row
37e0: 69 64 20 7c 7c 20 27 20 27 20 7c 7c 20 74 79 70  id || ' ' || typ
37f0: 65 6f 66 28 6f 6c 64 2e 72 6f 77 69 64 29 20 7c  eof(old.rowid) |
3800: 7c 20 27 20 27 20 7c 7c 0a 20 20 20 20 20 20 20  | ' ' ||.       
3810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3820: 20 20 20 20 20 20 6f 6c 64 2e 61 20 20 20 20 20        old.a     
3830: 7c 7c 20 27 20 27 20 7c 7c 20 74 79 70 65 6f 66  || ' ' || typeof
3840: 28 6f 6c 64 2e 61 29 20 20 20 20 20 7c 7c 20 27  (old.a)     || '
3850: 20 27 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20   ' ||.          
3860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3870: 20 20 20 6f 6c 64 2e 62 20 20 20 20 20 7c 7c 20     old.b     || 
3880: 27 20 27 20 7c 7c 20 74 79 70 65 6f 66 28 6f 6c  ' ' || typeof(ol
3890: 64 2e 62 29 20 20 20 20 20 7c 7c 20 27 20 27 20  d.b)     || ' ' 
38a0: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ||.             
38b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38c0: 6f 6c 64 2e 63 20 20 20 20 20 7c 7c 20 27 20 27  old.c     || ' '
38d0: 20 7c 7c 20 74 79 70 65 6f 66 28 6f 6c 64 2e 63   || typeof(old.c
38e0: 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  ).      );.     
38f0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c 6f 67   INSERT INTO log
3900: 20 56 41 4c 55 45 53 28 6e 65 77 2e 72 6f 77 69   VALUES(new.rowi
3910: 64 20 7c 7c 20 27 20 27 20 7c 7c 20 74 79 70 65  d || ' ' || type
3920: 6f 66 28 6e 65 77 2e 72 6f 77 69 64 29 20 7c 7c  of(new.rowid) ||
3930: 20 27 20 27 20 7c 7c 0a 20 20 20 20 20 20 20 20   ' ' ||.        
3940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3950: 20 20 20 20 20 6e 65 77 2e 61 20 20 20 20 20 7c       new.a     |
3960: 7c 20 27 20 27 20 7c 7c 20 74 79 70 65 6f 66 28  | ' ' || typeof(
3970: 6e 65 77 2e 61 29 20 20 20 20 20 7c 7c 20 27 20  new.a)     || ' 
3980: 27 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  ' ||.           
3990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39a0: 20 20 6e 65 77 2e 62 20 20 20 20 20 7c 7c 20 27    new.b     || '
39b0: 20 27 20 7c 7c 20 74 79 70 65 6f 66 28 6e 65 77   ' || typeof(new
39c0: 2e 62 29 20 20 20 20 20 7c 7c 20 27 20 27 20 7c  .b)     || ' ' |
39d0: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
39e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
39f0: 65 77 2e 63 20 20 20 20 20 7c 7c 20 27 20 27 20  ew.c     || ' ' 
3a00: 7c 7c 20 74 79 70 65 6f 66 28 6e 65 77 2e 63 29  || typeof(new.c)
3a10: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 45 4e  .      );.    EN
3a20: 44 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 66 6f 72 65  D;.  }.} {}.fore
3a30: 61 63 68 20 7b 6e 20 69 6e 73 65 72 74 20 6c 6f  ach {n insert lo
3a40: 67 7d 20 7b 0a 0a 20 20 32 20 7b 20 0a 20 20 20  g} {..  2 { .   
3a50: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56  INSERT INTO t4 V
3a60: 41 4c 55 45 53 28 27 31 27 2c 20 27 31 27 2c 20  ALUES('1', '1', 
3a70: 27 31 27 29 3b 0a 20 20 20 44 45 4c 45 54 45 20  '1');.   DELETE 
3a80: 46 52 4f 4d 20 74 34 3b 0a 20 20 7d 20 7b 0a 20  FROM t4;.  } {. 
3a90: 20 20 20 2d 31 20 69 6e 74 65 67 65 72 20 31 20     -1 integer 1 
3aa0: 74 65 78 74 20 31 20 69 6e 74 65 67 65 72 20 31  text 1 integer 1
3ab0: 2e 30 20 72 65 61 6c 20 0a 20 20 20 20 20 31 20  .0 real .     1 
3ac0: 69 6e 74 65 67 65 72 20 31 20 74 65 78 74 20 31  integer 1 text 1
3ad0: 20 69 6e 74 65 67 65 72 20 31 2e 30 20 72 65 61   integer 1.0 rea
3ae0: 6c 0a 20 20 20 20 20 31 20 69 6e 74 65 67 65 72  l.     1 integer
3af0: 20 31 20 74 65 78 74 20 31 20 69 6e 74 65 67 65   1 text 1 intege
3b00: 72 20 31 2e 30 20 72 65 61 6c 20 0a 20 20 20 20  r 1.0 real .    
3b10: 20 31 20 69 6e 74 65 67 65 72 20 31 20 74 65 78   1 integer 1 tex
3b20: 74 20 31 20 69 6e 74 65 67 65 72 20 31 2e 30 20  t 1 integer 1.0 
3b30: 72 65 61 6c 0a 20 20 7d 0a 0a 20 20 33 20 7b 20  real.  }..  3 { 
3b40: 0a 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  .   INSERT INTO 
3b50: 74 34 28 72 6f 77 69 64 2c 61 2c 62 2c 63 29 20  t4(rowid,a,b,c) 
3b60: 56 41 4c 55 45 53 28 34 35 2c 20 34 35 2c 20 34  VALUES(45, 45, 4
3b70: 35 2c 20 34 35 29 3b 0a 20 20 20 44 45 4c 45 54  5, 45);.   DELET
3b80: 45 20 46 52 4f 4d 20 74 34 3b 0a 20 20 7d 20 7b  E FROM t4;.  } {
3b90: 0a 20 20 20 20 34 35 20 69 6e 74 65 67 65 72 20  .    45 integer 
3ba0: 34 35 20 74 65 78 74 20 34 35 20 69 6e 74 65 67  45 text 45 integ
3bb0: 65 72 20 34 35 2e 30 20 72 65 61 6c 0a 20 20 20  er 45.0 real.   
3bc0: 20 34 35 20 69 6e 74 65 67 65 72 20 34 35 20 74   45 integer 45 t
3bd0: 65 78 74 20 34 35 20 69 6e 74 65 67 65 72 20 34  ext 45 integer 4
3be0: 35 2e 30 20 72 65 61 6c 0a 20 20 20 20 34 35 20  5.0 real.    45 
3bf0: 69 6e 74 65 67 65 72 20 34 35 20 74 65 78 74 20  integer 45 text 
3c00: 34 35 20 69 6e 74 65 67 65 72 20 34 35 2e 30 20  45 integer 45.0 
3c10: 72 65 61 6c 0a 20 20 20 20 34 35 20 69 6e 74 65  real.    45 inte
3c20: 67 65 72 20 34 35 20 74 65 78 74 20 34 35 20 69  ger 45 text 45 i
3c30: 6e 74 65 67 65 72 20 34 35 2e 30 20 72 65 61 6c  nteger 45.0 real
3c40: 0a 20 20 7d 0a 0a 20 20 34 20 7b 20 0a 20 20 20  .  }..  4 { .   
3c50: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 28 72  INSERT INTO t4(r
3c60: 6f 77 69 64 2c 61 2c 62 2c 63 29 20 56 41 4c 55  owid,a,b,c) VALU
3c70: 45 53 28 2d 34 32 2e 30 2c 20 2d 34 32 2e 30 2c  ES(-42.0, -42.0,
3c80: 20 2d 34 32 2e 30 2c 20 2d 34 32 2e 30 29 3b 0a   -42.0, -42.0);.
3c90: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
3ca0: 34 3b 0a 20 20 7d 20 7b 0a 20 20 20 20 2d 34 32  4;.  } {.    -42
3cb0: 20 69 6e 74 65 67 65 72 20 2d 34 32 2e 30 20 74   integer -42.0 t
3cc0: 65 78 74 20 2d 34 32 20 69 6e 74 65 67 65 72 20  ext -42 integer 
3cd0: 2d 34 32 2e 30 20 72 65 61 6c 20 0a 20 20 20 20  -42.0 real .    
3ce0: 2d 34 32 20 69 6e 74 65 67 65 72 20 2d 34 32 2e  -42 integer -42.
3cf0: 30 20 74 65 78 74 20 2d 34 32 20 69 6e 74 65 67  0 text -42 integ
3d00: 65 72 20 2d 34 32 2e 30 20 72 65 61 6c 0a 20 20  er -42.0 real.  
3d10: 20 20 2d 34 32 20 69 6e 74 65 67 65 72 20 2d 34    -42 integer -4
3d20: 32 2e 30 20 74 65 78 74 20 2d 34 32 20 69 6e 74  2.0 text -42 int
3d30: 65 67 65 72 20 2d 34 32 2e 30 20 72 65 61 6c 20  eger -42.0 real 
3d40: 0a 20 20 20 20 2d 34 32 20 69 6e 74 65 67 65 72  .    -42 integer
3d50: 20 2d 34 32 2e 30 20 74 65 78 74 20 2d 34 32 20   -42.0 text -42 
3d60: 69 6e 74 65 67 65 72 20 2d 34 32 2e 30 20 72 65  integer -42.0 re
3d70: 61 6c 0a 20 20 7d 0a 0a 20 20 35 20 7b 20 0a 20  al.  }..  5 { . 
3d80: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34    INSERT INTO t4
3d90: 28 72 6f 77 69 64 2c 61 2c 62 2c 63 29 20 56 41  (rowid,a,b,c) VA
3da0: 4c 55 45 53 28 4e 55 4c 4c 2c 20 2d 34 32 2e 34  LUES(NULL, -42.4
3db0: 2c 20 2d 34 32 2e 34 2c 20 2d 34 32 2e 34 29 3b  , -42.4, -42.4);
3dc0: 0a 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  .   DELETE FROM 
3dd0: 74 34 3b 0a 20 20 7d 20 7b 0a 20 20 20 20 2d 31  t4;.  } {.    -1
3de0: 20 69 6e 74 65 67 65 72 20 2d 34 32 2e 34 20 74   integer -42.4 t
3df0: 65 78 74 20 2d 34 32 2e 34 20 72 65 61 6c 20 2d  ext -42.4 real -
3e00: 34 32 2e 34 20 72 65 61 6c 0a 20 20 20 20 20 31  42.4 real.     1
3e10: 20 69 6e 74 65 67 65 72 20 2d 34 32 2e 34 20 74   integer -42.4 t
3e20: 65 78 74 20 2d 34 32 2e 34 20 72 65 61 6c 20 2d  ext -42.4 real -
3e30: 34 32 2e 34 20 72 65 61 6c 0a 20 20 20 20 20 31  42.4 real.     1
3e40: 20 69 6e 74 65 67 65 72 20 2d 34 32 2e 34 20 74   integer -42.4 t
3e50: 65 78 74 20 2d 34 32 2e 34 20 72 65 61 6c 20 2d  ext -42.4 real -
3e60: 34 32 2e 34 20 72 65 61 6c 0a 20 20 20 20 20 31  42.4 real.     1
3e70: 20 69 6e 74 65 67 65 72 20 2d 34 32 2e 34 20 74   integer -42.4 t
3e80: 65 78 74 20 2d 34 32 2e 34 20 72 65 61 6c 20 2d  ext -42.4 real -
3e90: 34 32 2e 34 20 72 65 61 6c 0a 20 20 7d 0a 0a 20  42.4 real.  }.. 
3ea0: 20 36 20 7b 20 0a 20 20 20 49 4e 53 45 52 54 20   6 { .   INSERT 
3eb0: 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 37  INTO t4 VALUES(7
3ec0: 2c 20 37 2c 20 37 29 3b 0a 20 20 20 55 50 44 41  , 7, 7);.   UPDA
3ed0: 54 45 20 74 34 20 53 45 54 20 61 3d 38 2c 20 62  TE t4 SET a=8, b
3ee0: 3d 38 2c 20 63 3d 38 3b 0a 20 20 7d 20 7b 0a 20  =8, c=8;.  } {. 
3ef0: 20 20 20 2d 31 20 69 6e 74 65 67 65 72 20 37 20     -1 integer 7 
3f00: 74 65 78 74 20 37 20 69 6e 74 65 67 65 72 20 37  text 7 integer 7
3f10: 2e 30 20 72 65 61 6c 0a 20 20 20 20 20 31 20 69  .0 real.     1 i
3f20: 6e 74 65 67 65 72 20 37 20 74 65 78 74 20 37 20  nteger 7 text 7 
3f30: 69 6e 74 65 67 65 72 20 37 2e 30 20 72 65 61 6c  integer 7.0 real
3f40: 0a 20 20 20 20 20 31 20 69 6e 74 65 67 65 72 20  .     1 integer 
3f50: 37 20 74 65 78 74 20 37 20 69 6e 74 65 67 65 72  7 text 7 integer
3f60: 20 37 2e 30 20 72 65 61 6c 0a 20 20 20 20 20 31   7.0 real.     1
3f70: 20 69 6e 74 65 67 65 72 20 38 20 74 65 78 74 20   integer 8 text 
3f80: 38 20 69 6e 74 65 67 65 72 20 38 2e 30 20 72 65  8 integer 8.0 re
3f90: 61 6c 0a 20 20 20 20 20 31 20 69 6e 74 65 67 65  al.     1 intege
3fa0: 72 20 37 20 74 65 78 74 20 37 20 69 6e 74 65 67  r 7 text 7 integ
3fb0: 65 72 20 37 2e 30 20 72 65 61 6c 0a 20 20 20 20  er 7.0 real.    
3fc0: 20 31 20 69 6e 74 65 67 65 72 20 38 20 74 65 78   1 integer 8 tex
3fd0: 74 20 38 20 69 6e 74 65 67 65 72 20 38 2e 30 20  t 8 integer 8.0 
3fe0: 72 65 61 6c 0a 20 20 7d 0a 0a 20 20 37 20 7b 20  real.  }..  7 { 
3ff0: 0a 20 20 20 55 50 44 41 54 45 20 74 34 20 53 45  .   UPDATE t4 SE
4000: 54 20 72 6f 77 69 64 3d 32 3b 0a 20 20 7d 20 7b  T rowid=2;.  } {
4010: 0a 20 20 20 20 20 31 20 69 6e 74 65 67 65 72 20  .     1 integer 
4020: 38 20 74 65 78 74 20 38 20 69 6e 74 65 67 65 72  8 text 8 integer
4030: 20 38 2e 30 20 72 65 61 6c 0a 20 20 20 20 20 32   8.0 real.     2
4040: 20 69 6e 74 65 67 65 72 20 38 20 74 65 78 74 20   integer 8 text 
4050: 38 20 69 6e 74 65 67 65 72 20 38 2e 30 20 72 65  8 integer 8.0 re
4060: 61 6c 0a 20 20 20 20 20 31 20 69 6e 74 65 67 65  al.     1 intege
4070: 72 20 38 20 74 65 78 74 20 38 20 69 6e 74 65 67  r 8 text 8 integ
4080: 65 72 20 38 2e 30 20 72 65 61 6c 0a 20 20 20 20  er 8.0 real.    
4090: 20 32 20 69 6e 74 65 67 65 72 20 38 20 74 65 78   2 integer 8 tex
40a0: 74 20 38 20 69 6e 74 65 67 65 72 20 38 2e 30 20  t 8 integer 8.0 
40b0: 72 65 61 6c 0a 20 20 7d 0a 0a 20 20 38 20 7b 20  real.  }..  8 { 
40c0: 0a 20 20 20 55 50 44 41 54 45 20 74 34 20 53 45  .   UPDATE t4 SE
40d0: 54 20 61 3d 27 39 27 2c 20 62 3d 27 39 27 2c 20  T a='9', b='9', 
40e0: 63 3d 27 39 27 3b 0a 20 20 7d 20 7b 0a 20 20 20  c='9';.  } {.   
40f0: 20 20 32 20 69 6e 74 65 67 65 72 20 38 20 74 65    2 integer 8 te
4100: 78 74 20 38 20 69 6e 74 65 67 65 72 20 38 2e 30  xt 8 integer 8.0
4110: 20 72 65 61 6c 0a 20 20 20 20 20 32 20 69 6e 74   real.     2 int
4120: 65 67 65 72 20 39 20 74 65 78 74 20 39 20 69 6e  eger 9 text 9 in
4130: 74 65 67 65 72 20 39 2e 30 20 72 65 61 6c 0a 20  teger 9.0 real. 
4140: 20 20 20 20 32 20 69 6e 74 65 67 65 72 20 38 20      2 integer 8 
4150: 74 65 78 74 20 38 20 69 6e 74 65 67 65 72 20 38  text 8 integer 8
4160: 2e 30 20 72 65 61 6c 0a 20 20 20 20 20 32 20 69  .0 real.     2 i
4170: 6e 74 65 67 65 72 20 39 20 74 65 78 74 20 39 20  nteger 9 text 9 
4180: 69 6e 74 65 67 65 72 20 39 2e 30 20 72 65 61 6c  integer 9.0 real
4190: 0a 20 20 7d 0a 0a 20 20 39 20 7b 20 0a 20 20 20  .  }..  9 { .   
41a0: 55 50 44 41 54 45 20 74 34 20 53 45 54 20 61 3d  UPDATE t4 SET a=
41b0: 27 39 2e 31 27 2c 20 62 3d 27 39 2e 31 27 2c 20  '9.1', b='9.1', 
41c0: 63 3d 27 39 2e 31 27 3b 0a 20 20 7d 20 7b 0a 20  c='9.1';.  } {. 
41d0: 20 20 20 20 32 20 69 6e 74 65 67 65 72 20 39 20      2 integer 9 
41e0: 20 20 74 65 78 74 20 39 20 20 20 69 6e 74 65 67    text 9   integ
41f0: 65 72 20 39 2e 30 20 72 65 61 6c 0a 20 20 20 20  er 9.0 real.    
4200: 20 32 20 69 6e 74 65 67 65 72 20 39 2e 31 20 74   2 integer 9.1 t
4210: 65 78 74 20 39 2e 31 20 72 65 61 6c 20 20 20 20  ext 9.1 real    
4220: 39 2e 31 20 72 65 61 6c 0a 20 20 20 20 20 32 20  9.1 real.     2 
4230: 69 6e 74 65 67 65 72 20 39 20 20 20 74 65 78 74  integer 9   text
4240: 20 39 20 20 20 69 6e 74 65 67 65 72 20 39 2e 30   9   integer 9.0
4250: 20 72 65 61 6c 0a 20 20 20 20 20 32 20 69 6e 74   real.     2 int
4260: 65 67 65 72 20 39 2e 31 20 74 65 78 74 20 39 2e  eger 9.1 text 9.
4270: 31 20 72 65 61 6c 20 20 20 20 39 2e 31 20 72 65  1 real    9.1 re
4280: 61 6c 0a 20 20 7d 0a 7d 20 7b 0a 20 20 64 6f 5f  al.  }.} {.  do_
4290: 74 65 73 74 20 74 72 69 67 67 65 72 43 2d 34 2e  test triggerC-4.
42a0: 31 2e 24 6e 20 7b 0a 20 20 20 20 65 76 61 6c 20  1.$n {.    eval 
42b0: 63 6f 6e 63 61 74 20 5b 65 78 65 63 73 71 6c 20  concat [execsql 
42c0: 22 20 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20  " .      DELETE 
42d0: 46 52 4f 4d 20 6c 6f 67 3b 0a 20 20 20 20 20 20  FROM log;.      
42e0: 24 69 6e 73 65 72 74 20 3b 20 0a 20 20 20 20 20  $insert ; .     
42f0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6c   SELECT * FROM l
4300: 6f 67 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69  og ORDER BY rowi
4310: 64 3b 0a 20 20 20 20 22 5d 0a 20 20 7d 20 5b 6a  d;.    "].  } [j
4320: 6f 69 6e 20 24 6c 6f 67 20 22 20 22 5d 0a 7d 20  oin $log " "].} 
4330: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
4340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 23 20 54  ------------.# T
4380: 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 74 65 73  his block of tes
4390: 74 73 2c 20 74 72 69 67 67 65 72 43 2d 35 2e 2a  ts, triggerC-5.*
43a0: 2c 20 74 65 73 74 20 74 68 61 74 20 44 45 4c 45  , test that DELE
43b0: 54 45 20 74 72 69 67 67 65 72 73 20 61 72 65 20  TE triggers are 
43c0: 66 69 72 65 64 0a 23 20 69 66 20 61 20 72 6f 77  fired.# if a row
43d0: 20 69 73 20 64 65 6c 65 74 65 64 20 61 73 20 61   is deleted as a
43e0: 20 72 65 73 75 6c 74 20 6f 66 20 4f 52 20 52 45   result of OR RE
43f0: 50 4c 41 43 45 20 63 6f 6e 66 6c 69 63 74 20 72  PLACE conflict r
4400: 65 73 6f 6c 75 74 69 6f 6e 2e 0a 23 0a 64 6f 5f  esolution..#.do_
4410: 74 65 73 74 20 74 72 69 67 67 65 72 43 2d 35 2e  test triggerC-5.
4420: 31 2e 30 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.0 {.  execsql 
4430: 7b 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45  {.    DROP TABLE
4440: 20 49 46 20 45 58 49 53 54 53 20 74 35 3b 0a 20   IF EXISTS t5;. 
4450: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
4460: 74 35 28 61 20 49 4e 54 45 47 45 52 20 50 52 49  t5(a INTEGER PRI
4470: 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20  MARY KEY, b);.  
4480: 20 20 43 52 45 41 54 45 20 55 4e 49 51 55 45 20    CREATE UNIQUE 
4490: 49 4e 44 45 58 20 74 35 69 20 4f 4e 20 74 35 28  INDEX t5i ON t5(
44a0: 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  b);.    INSERT I
44b0: 4e 54 4f 20 74 35 20 56 41 4c 55 45 53 28 31 2c  NTO t5 VALUES(1,
44c0: 20 27 61 27 29 3b 0a 20 20 20 20 49 4e 53 45 52   'a');.    INSER
44d0: 54 20 49 4e 54 4f 20 74 35 20 56 41 4c 55 45 53  T INTO t5 VALUES
44e0: 28 32 2c 20 27 62 27 29 3b 0a 20 20 20 20 49 4e  (2, 'b');.    IN
44f0: 53 45 52 54 20 49 4e 54 4f 20 74 35 20 56 41 4c  SERT INTO t5 VAL
4500: 55 45 53 28 33 2c 20 27 63 27 29 3b 0a 0a 20 20  UES(3, 'c');..  
4510: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
4520: 35 67 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 20  5g(a, b, c);.   
4530: 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20   CREATE TRIGGER 
4540: 74 35 74 20 42 45 46 4f 52 45 20 44 45 4c 45 54  t5t BEFORE DELET
4550: 45 20 4f 4e 20 74 35 20 42 45 47 49 4e 0a 20 20  E ON t5 BEGIN.  
4560: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
4570: 74 35 67 20 56 41 4c 55 45 53 28 6f 6c 64 2e 61  t5g VALUES(old.a
4580: 2c 20 6f 6c 64 2e 62 2c 20 28 53 45 4c 45 43 54  , old.b, (SELECT
4590: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
45a0: 35 29 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20  5));.    END;.  
45b0: 7d 0a 7d 20 7b 7d 0a 66 6f 72 65 61 63 68 20 7b  }.} {}.foreach {
45c0: 6e 20 64 6d 6c 20 74 35 67 20 74 35 7d 20 7b 0a  n dml t5g t5} {.
45d0: 20 20 31 20 22 44 45 4c 45 54 45 20 46 52 4f 4d    1 "DELETE FROM
45e0: 20 74 35 20 57 48 45 52 45 20 61 3d 32 22 20 20   t5 WHERE a=2"  
45f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4600: 20 20 20 20 20 20 7b 32 20 62 20 33 7d 20 7b 31        {2 b 3} {1
4610: 20 61 20 33 20 63 7d 0a 20 20 32 20 22 49 4e 53   a 3 c}.  2 "INS
4620: 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20 49  ERT OR REPLACE I
4630: 4e 54 4f 20 74 35 20 56 41 4c 55 45 53 28 32 2c  NTO t5 VALUES(2,
4640: 20 27 64 27 29 22 20 20 20 20 20 20 20 20 7b 32   'd')"        {2
4650: 20 62 20 33 7d 20 7b 31 20 61 20 32 20 64 20 33   b 3} {1 a 2 d 3
4660: 20 63 7d 0a 20 20 33 20 22 55 50 44 41 54 45 20   c}.  3 "UPDATE 
4670: 4f 52 20 52 45 50 4c 41 43 45 20 74 35 20 53 45  OR REPLACE t5 SE
4680: 54 20 61 20 3d 20 32 20 57 48 45 52 45 20 61 20  T a = 2 WHERE a 
4690: 3d 20 33 22 20 20 20 20 20 20 7b 32 20 62 20 33  = 3"      {2 b 3
46a0: 7d 20 7b 31 20 61 20 32 20 63 7d 0a 20 20 34 20  } {1 a 2 c}.  4 
46b0: 22 49 4e 53 45 52 54 20 4f 52 20 52 45 50 4c 41  "INSERT OR REPLA
46c0: 43 45 20 49 4e 54 4f 20 74 35 20 56 41 4c 55 45  CE INTO t5 VALUE
46d0: 53 28 34 2c 20 27 62 27 29 22 20 20 20 20 20 20  S(4, 'b')"      
46e0: 20 20 7b 32 20 62 20 33 7d 20 7b 31 20 61 20 33    {2 b 3} {1 a 3
46f0: 20 63 20 34 20 62 7d 0a 20 20 35 20 22 55 50 44   c 4 b}.  5 "UPD
4700: 41 54 45 20 4f 52 20 52 45 50 4c 41 43 45 20 74  ATE OR REPLACE t
4710: 35 20 53 45 54 20 62 20 3d 20 27 62 27 20 57 48  5 SET b = 'b' WH
4720: 45 52 45 20 62 20 3d 20 27 63 27 22 20 20 7b 32  ERE b = 'c'"  {2
4730: 20 62 20 33 7d 20 7b 31 20 61 20 33 20 62 7d 0a   b 3} {1 a 3 b}.
4740: 20 20 36 20 22 49 4e 53 45 52 54 20 4f 52 20 52    6 "INSERT OR R
4750: 45 50 4c 41 43 45 20 49 4e 54 4f 20 74 35 20 56  EPLACE INTO t5 V
4760: 41 4c 55 45 53 28 32 2c 20 27 63 27 29 22 20 20  ALUES(2, 'c')"  
4770: 20 20 20 20 20 20 7b 32 20 62 20 33 20 33 20 63        {2 b 3 3 c
4780: 20 32 7d 20 7b 31 20 61 20 32 20 63 7d 0a 20 20   2} {1 a 2 c}.  
4790: 37 20 22 55 50 44 41 54 45 20 4f 52 20 52 45 50  7 "UPDATE OR REP
47a0: 4c 41 43 45 20 74 35 20 53 45 54 20 61 3d 31 2c  LACE t5 SET a=1,
47b0: 20 62 3d 27 62 27 20 57 48 45 52 45 20 61 20 3d   b='b' WHERE a =
47c0: 20 33 22 20 7b 31 20 61 20 33 20 32 20 62 20 32   3" {1 a 3 2 b 2
47d0: 7d 20 7b 31 20 62 7d 0a 7d 20 7b 0a 20 20 64 6f  } {1 b}.} {.  do
47e0: 5f 74 65 73 74 20 74 72 69 67 67 65 72 43 2d 35  _test triggerC-5
47f0: 2e 31 2e 24 6e 20 7b 0a 20 20 20 20 65 78 65 63  .1.$n {.    exec
4800: 73 71 6c 20 22 0a 20 20 20 20 20 20 42 45 47 49  sql ".      BEGI
4810: 4e 3b 0a 20 20 20 20 20 20 20 20 24 64 6d 6c 20  N;.        $dml 
4820: 3b 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  ;.        SELECT
4830: 20 2a 20 46 52 4f 4d 20 74 35 67 20 4f 52 44 45   * FROM t5g ORDE
4840: 52 20 42 59 20 72 6f 77 69 64 3b 0a 20 20 20 20  R BY rowid;.    
4850: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
4860: 4d 20 74 35 20 4f 52 44 45 52 20 42 59 20 72 6f  M t5 ORDER BY ro
4870: 77 69 64 3b 0a 20 20 20 20 20 20 52 4f 4c 4c 42  wid;.      ROLLB
4880: 41 43 4b 3b 0a 20 20 20 20 22 0a 20 20 7d 20 5b  ACK;.    ".  } [
4890: 63 6f 6e 63 61 74 20 24 74 35 67 20 24 74 35 5d  concat $t5g $t5]
48a0: 0a 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67  .}.do_test trigg
48b0: 65 72 43 2d 35 2e 32 2e 30 20 7b 0a 20 20 65 78  erC-5.2.0 {.  ex
48c0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50  ecsql {.    DROP
48d0: 20 54 52 49 47 47 45 52 20 74 35 74 3b 0a 20 20   TRIGGER t5t;.  
48e0: 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52    CREATE TRIGGER
48f0: 20 74 35 74 20 41 46 54 45 52 20 44 45 4c 45 54   t5t AFTER DELET
4900: 45 20 4f 4e 20 74 35 20 42 45 47 49 4e 0a 20 20  E ON t5 BEGIN.  
4910: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
4920: 74 35 67 20 56 41 4c 55 45 53 28 6f 6c 64 2e 61  t5g VALUES(old.a
4930: 2c 20 6f 6c 64 2e 62 2c 20 28 53 45 4c 45 43 54  , old.b, (SELECT
4940: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
4950: 35 29 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20  5));.    END;.  
4960: 7d 0a 7d 20 7b 7d 0a 66 6f 72 65 61 63 68 20 7b  }.} {}.foreach {
4970: 6e 20 64 6d 6c 20 74 35 67 20 74 35 7d 20 7b 0a  n dml t5g t5} {.
4980: 20 20 31 20 22 44 45 4c 45 54 45 20 46 52 4f 4d    1 "DELETE FROM
4990: 20 74 35 20 57 48 45 52 45 20 61 3d 32 22 20 20   t5 WHERE a=2"  
49a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49b0: 20 20 20 20 20 20 7b 32 20 62 20 32 7d 20 7b 31        {2 b 2} {1
49c0: 20 61 20 33 20 63 7d 0a 20 20 32 20 22 49 4e 53   a 3 c}.  2 "INS
49d0: 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20 49  ERT OR REPLACE I
49e0: 4e 54 4f 20 74 35 20 56 41 4c 55 45 53 28 32 2c  NTO t5 VALUES(2,
49f0: 20 27 64 27 29 22 20 20 20 20 20 20 20 20 7b 32   'd')"        {2
4a00: 20 62 20 32 7d 20 7b 31 20 61 20 32 20 64 20 33   b 2} {1 a 2 d 3
4a10: 20 63 7d 0a 20 20 33 20 22 55 50 44 41 54 45 20   c}.  3 "UPDATE 
4a20: 4f 52 20 52 45 50 4c 41 43 45 20 74 35 20 53 45  OR REPLACE t5 SE
4a30: 54 20 61 20 3d 20 32 20 57 48 45 52 45 20 61 20  T a = 2 WHERE a 
4a40: 3d 20 33 22 20 20 20 20 20 20 7b 32 20 62 20 32  = 3"      {2 b 2
4a50: 7d 20 7b 31 20 61 20 32 20 63 7d 0a 20 20 34 20  } {1 a 2 c}.  4 
4a60: 22 49 4e 53 45 52 54 20 4f 52 20 52 45 50 4c 41  "INSERT OR REPLA
4a70: 43 45 20 49 4e 54 4f 20 74 35 20 56 41 4c 55 45  CE INTO t5 VALUE
4a80: 53 28 34 2c 20 27 62 27 29 22 20 20 20 20 20 20  S(4, 'b')"      
4a90: 20 20 7b 32 20 62 20 32 7d 20 7b 31 20 61 20 33    {2 b 2} {1 a 3
4aa0: 20 63 20 34 20 62 7d 0a 20 20 35 20 22 55 50 44   c 4 b}.  5 "UPD
4ab0: 41 54 45 20 4f 52 20 52 45 50 4c 41 43 45 20 74  ATE OR REPLACE t
4ac0: 35 20 53 45 54 20 62 20 3d 20 27 62 27 20 57 48  5 SET b = 'b' WH
4ad0: 45 52 45 20 62 20 3d 20 27 63 27 22 20 20 7b 32  ERE b = 'c'"  {2
4ae0: 20 62 20 32 7d 20 7b 31 20 61 20 33 20 62 7d 0a   b 2} {1 a 3 b}.
4af0: 20 20 36 20 22 49 4e 53 45 52 54 20 4f 52 20 52    6 "INSERT OR R
4b00: 45 50 4c 41 43 45 20 49 4e 54 4f 20 74 35 20 56  EPLACE INTO t5 V
4b10: 41 4c 55 45 53 28 32 2c 20 27 63 27 29 22 20 20  ALUES(2, 'c')"  
4b20: 20 20 20 20 20 20 7b 32 20 62 20 32 20 33 20 63        {2 b 2 3 c
4b30: 20 31 7d 20 7b 31 20 61 20 32 20 63 7d 0a 20 20   1} {1 a 2 c}.  
4b40: 37 20 22 55 50 44 41 54 45 20 4f 52 20 52 45 50  7 "UPDATE OR REP
4b50: 4c 41 43 45 20 74 35 20 53 45 54 20 61 3d 31 2c  LACE t5 SET a=1,
4b60: 20 62 3d 27 62 27 20 57 48 45 52 45 20 61 20 3d   b='b' WHERE a =
4b70: 20 33 22 20 7b 31 20 61 20 32 20 32 20 62 20 31   3" {1 a 2 2 b 1
4b80: 7d 20 7b 31 20 62 7d 0a 7d 20 7b 0a 20 20 64 6f  } {1 b}.} {.  do
4b90: 5f 74 65 73 74 20 74 72 69 67 67 65 72 43 2d 35  _test triggerC-5
4ba0: 2e 32 2e 24 6e 20 7b 0a 20 20 20 20 65 78 65 63  .2.$n {.    exec
4bb0: 73 71 6c 20 22 0a 20 20 20 20 20 20 42 45 47 49  sql ".      BEGI
4bc0: 4e 3b 0a 20 20 20 20 20 20 20 20 24 64 6d 6c 20  N;.        $dml 
4bd0: 3b 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  ;.        SELECT
4be0: 20 2a 20 46 52 4f 4d 20 74 35 67 20 4f 52 44 45   * FROM t5g ORDE
4bf0: 52 20 42 59 20 72 6f 77 69 64 3b 0a 20 20 20 20  R BY rowid;.    
4c00: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
4c10: 4d 20 74 35 20 4f 52 44 45 52 20 42 59 20 72 6f  M t5 ORDER BY ro
4c20: 77 69 64 3b 0a 20 20 20 20 20 20 52 4f 4c 4c 42  wid;.      ROLLB
4c30: 41 43 4b 3b 0a 20 20 20 20 22 0a 20 20 7d 20 5b  ACK;.    ".  } [
4c40: 63 6f 6e 63 61 74 20 24 74 35 67 20 24 74 35 5d  concat $t5g $t5]
4c50: 0a 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67  .}.do_test trigg
4c60: 65 72 43 2d 35 2e 33 2e 30 20 7b 0a 20 20 65 78  erC-5.3.0 {.  ex
4c70: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 72  ecsql { PRAGMA r
4c80: 65 63 75 72 73 69 76 65 5f 74 72 69 67 67 65 72  ecursive_trigger
4c90: 73 20 3d 20 6f 66 66 20 7d 0a 7d 20 7b 7d 0a 66  s = off }.} {}.f
4ca0: 6f 72 65 61 63 68 20 7b 6e 20 64 6d 6c 20 74 35  oreach {n dml t5
4cb0: 67 20 74 35 7d 20 7b 0a 20 20 31 20 22 44 45 4c  g t5} {.  1 "DEL
4cc0: 45 54 45 20 46 52 4f 4d 20 74 35 20 57 48 45 52  ETE FROM t5 WHER
4cd0: 45 20 61 3d 32 22 20 20 20 20 20 20 20 20 20 20  E a=2"          
4ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 32                {2
4cf0: 20 62 20 32 7d 20 7b 31 20 61 20 33 20 63 7d 0a   b 2} {1 a 3 c}.
4d00: 20 20 32 20 22 49 4e 53 45 52 54 20 4f 52 20 52    2 "INSERT OR R
4d10: 45 50 4c 41 43 45 20 49 4e 54 4f 20 74 35 20 56  EPLACE INTO t5 V
4d20: 41 4c 55 45 53 28 32 2c 20 27 64 27 29 22 20 20  ALUES(2, 'd')"  
4d30: 20 20 20 20 20 20 7b 7d 20 7b 31 20 61 20 32 20        {} {1 a 2 
4d40: 64 20 33 20 63 7d 0a 20 20 33 20 22 55 50 44 41  d 3 c}.  3 "UPDA
4d50: 54 45 20 4f 52 20 52 45 50 4c 41 43 45 20 74 35  TE OR REPLACE t5
4d60: 20 53 45 54 20 61 20 3d 20 32 20 57 48 45 52 45   SET a = 2 WHERE
4d70: 20 61 20 3d 20 33 22 20 20 20 20 20 20 7b 7d 20   a = 3"      {} 
4d80: 7b 31 20 61 20 32 20 63 7d 0a 20 20 34 20 22 49  {1 a 2 c}.  4 "I
4d90: 4e 53 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45  NSERT OR REPLACE
4da0: 20 49 4e 54 4f 20 74 35 20 56 41 4c 55 45 53 28   INTO t5 VALUES(
4db0: 34 2c 20 27 62 27 29 22 20 20 20 20 20 20 20 20  4, 'b')"        
4dc0: 7b 7d 20 7b 31 20 61 20 33 20 63 20 34 20 62 7d  {} {1 a 3 c 4 b}
4dd0: 0a 20 20 35 20 22 55 50 44 41 54 45 20 4f 52 20  .  5 "UPDATE OR 
4de0: 52 45 50 4c 41 43 45 20 74 35 20 53 45 54 20 62  REPLACE t5 SET b
4df0: 20 3d 20 27 62 27 20 57 48 45 52 45 20 62 20 3d   = 'b' WHERE b =
4e00: 20 27 63 27 22 20 20 7b 7d 20 7b 31 20 61 20 33   'c'"  {} {1 a 3
4e10: 20 62 7d 0a 20 20 36 20 22 49 4e 53 45 52 54 20   b}.  6 "INSERT 
4e20: 4f 52 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20  OR REPLACE INTO 
4e30: 74 35 20 56 41 4c 55 45 53 28 32 2c 20 27 63 27  t5 VALUES(2, 'c'
4e40: 29 22 20 20 20 20 20 20 20 20 7b 7d 20 7b 31 20  )"        {} {1 
4e50: 61 20 32 20 63 7d 0a 20 20 37 20 22 55 50 44 41  a 2 c}.  7 "UPDA
4e60: 54 45 20 4f 52 20 52 45 50 4c 41 43 45 20 74 35  TE OR REPLACE t5
4e70: 20 53 45 54 20 61 3d 31 2c 20 62 3d 27 62 27 20   SET a=1, b='b' 
4e80: 57 48 45 52 45 20 61 20 3d 20 33 22 20 7b 7d 20  WHERE a = 3" {} 
4e90: 7b 31 20 62 7d 0a 7d 20 7b 0a 20 20 64 6f 5f 74  {1 b}.} {.  do_t
4ea0: 65 73 74 20 74 72 69 67 67 65 72 43 2d 35 2e 33  est triggerC-5.3
4eb0: 2e 24 6e 20 7b 0a 20 20 20 20 65 78 65 63 73 71  .$n {.    execsq
4ec0: 6c 20 22 0a 20 20 20 20 20 20 42 45 47 49 4e 3b  l ".      BEGIN;
4ed0: 0a 20 20 20 20 20 20 20 20 24 64 6d 6c 20 3b 0a  .        $dml ;.
4ee0: 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a          SELECT *
4ef0: 20 46 52 4f 4d 20 74 35 67 20 4f 52 44 45 52 20   FROM t5g ORDER 
4f00: 42 59 20 72 6f 77 69 64 3b 0a 20 20 20 20 20 20  BY rowid;.      
4f10: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
4f20: 74 35 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69  t5 ORDER BY rowi
4f30: 64 3b 0a 20 20 20 20 20 20 52 4f 4c 4c 42 41 43  d;.      ROLLBAC
4f40: 4b 3b 0a 20 20 20 20 22 0a 20 20 7d 20 5b 63 6f  K;.    ".  } [co
4f50: 6e 63 61 74 20 24 74 35 67 20 24 74 35 5d 0a 7d  ncat $t5g $t5].}
4f60: 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72  .do_test trigger
4f70: 43 2d 35 2e 33 2e 38 20 7b 0a 20 20 65 78 65 63  C-5.3.8 {.  exec
4f80: 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 72 65 63  sql { PRAGMA rec
4f90: 75 72 73 69 76 65 5f 74 72 69 67 67 65 72 73 20  ursive_triggers 
4fa0: 3d 20 6f 6e 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d  = on }.} {}..#--
4fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4fc0: 2d 2d 2d 2d 2d 2d 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 0a 23 20 54 68 69 73 20 62  -------.# This b
5000: 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73 2c 20 74  lock of tests, t
5010: 72 69 67 67 65 72 43 2d 36 2e 2a 2c 20 74 65 73  riggerC-6.*, tes
5020: 74 73 20 74 68 61 74 20 22 50 52 41 47 4d 41 20  ts that "PRAGMA 
5030: 72 65 63 75 72 73 69 76 65 5f 74 72 69 67 67 65  recursive_trigge
5040: 72 73 22 0a 23 20 73 74 61 74 65 6d 65 6e 74 73  rs".# statements
5050: 20 72 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   return the curr
5060: 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65  ent value of the
5070: 20 72 65 63 75 72 73 69 76 65 20 74 72 69 67 67   recursive trigg
5080: 65 72 73 20 66 6c 61 67 2e 0a 23 0a 64 6f 5f 74  ers flag..#.do_t
5090: 65 73 74 20 74 72 69 67 67 65 72 43 2d 36 2e 31  est triggerC-6.1
50a0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50   {.  execsql { P
50b0: 52 41 47 4d 41 20 72 65 63 75 72 73 69 76 65 5f  RAGMA recursive_
50c0: 74 72 69 67 67 65 72 73 20 7d 0a 7d 20 7b 31 7d  triggers }.} {1}
50d0: 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72  .do_test trigger
50e0: 43 2d 36 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  C-6.2 {.  execsq
50f0: 6c 20 7b 20 0a 20 20 20 20 50 52 41 47 4d 41 20  l { .    PRAGMA 
5100: 72 65 63 75 72 73 69 76 65 5f 74 72 69 67 67 65  recursive_trigge
5110: 72 73 20 3d 20 6f 66 66 3b 0a 20 20 20 20 50 52  rs = off;.    PR
5120: 41 47 4d 41 20 72 65 63 75 72 73 69 76 65 5f 74  AGMA recursive_t
5130: 72 69 67 67 65 72 73 3b 0a 20 20 7d 0a 7d 20 7b  riggers;.  }.} {
5140: 30 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67  0}.do_test trigg
5150: 65 72 43 2d 36 2e 33 20 7b 0a 20 20 65 78 65 63  erC-6.3 {.  exec
5160: 73 71 6c 20 7b 20 0a 20 20 20 20 50 52 41 47 4d  sql { .    PRAGM
5170: 41 20 72 65 63 75 72 73 69 76 65 5f 74 72 69 67  A recursive_trig
5180: 67 65 72 73 20 3d 20 6f 6e 3b 0a 20 20 20 20 50  gers = on;.    P
5190: 52 41 47 4d 41 20 72 65 63 75 72 73 69 76 65 5f  RAGMA recursive_
51a0: 74 72 69 67 67 65 72 73 3b 0a 20 20 7d 0a 7d 20  triggers;.  }.} 
51b0: 7b 31 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  {1}..#----------
51c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a  ---------------.
5200: 23 20 54 65 73 74 20 73 6f 6d 65 20 6f 66 20 74  # Test some of t
5210: 68 65 20 22 75 6e 64 65 66 69 6e 65 64 20 62 65  he "undefined be
5220: 68 61 76 69 6f 75 72 22 20 61 73 73 6f 63 69 61  haviour" associa
5230: 74 65 64 20 77 69 74 68 20 74 72 69 67 67 65 72  ted with trigger
5240: 73 2e 20 54 68 65 0a 23 20 75 6e 64 65 66 69 6e  s. The.# undefin
5250: 65 64 20 62 65 68 61 76 69 6f 75 72 20 6f 63 63  ed behaviour occ
5260: 75 72 73 20 77 68 65 6e 20 61 20 72 6f 77 20 62  urs when a row b
5270: 65 69 6e 67 20 75 70 64 61 74 65 64 20 6f 72 20  eing updated or 
5280: 64 65 6c 65 74 65 64 20 69 73 20 0a 23 20 6d 61  deleted is .# ma
5290: 6e 69 70 75 6c 61 74 65 64 20 62 79 20 61 20 42  nipulated by a B
52a0: 45 46 4f 52 45 20 74 72 69 67 67 65 72 2e 0a 23  EFORE trigger..#
52b0: 20 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65   .do_test trigge
52c0: 72 43 2d 37 2e 31 20 7b 0a 20 20 65 78 65 63 73  rC-7.1 {.  execs
52d0: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
52e0: 54 41 42 4c 45 20 74 38 28 78 29 3b 0a 20 20 20  TABLE t8(x);.   
52f0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 37   CREATE TABLE t7
5300: 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45  (a, b);.    INSE
5310: 52 54 20 49 4e 54 4f 20 74 37 20 56 41 4c 55 45  RT INTO t7 VALUE
5320: 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53  S(1, 2);.    INS
5330: 45 52 54 20 49 4e 54 4f 20 74 37 20 56 41 4c 55  ERT INTO t7 VALU
5340: 45 53 28 33 2c 20 34 29 3b 0a 20 20 20 20 49 4e  ES(3, 4);.    IN
5350: 53 45 52 54 20 49 4e 54 4f 20 74 37 20 56 41 4c  SERT INTO t7 VAL
5360: 55 45 53 28 35 2c 20 36 29 3b 0a 20 20 20 20 43  UES(5, 6);.    C
5370: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74 37  REATE TRIGGER t7
5380: 74 20 42 45 46 4f 52 45 20 55 50 44 41 54 45 20  t BEFORE UPDATE 
5390: 4f 4e 20 74 37 20 42 45 47 49 4e 0a 20 20 20 20  ON t7 BEGIN.    
53a0: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 37    DELETE FROM t7
53b0: 20 57 48 45 52 45 20 61 20 3d 20 31 3b 0a 20 20   WHERE a = 1;.  
53c0: 20 20 45 4e 44 3b 0a 20 20 20 20 43 52 45 41 54    END;.    CREAT
53d0: 45 20 54 52 49 47 47 45 52 20 74 37 74 61 20 41  E TRIGGER t7ta A
53e0: 46 54 45 52 20 55 50 44 41 54 45 20 4f 4e 20 74  FTER UPDATE ON t
53f0: 37 20 42 45 47 49 4e 0a 20 20 20 20 20 20 49 4e  7 BEGIN.      IN
5400: 53 45 52 54 20 49 4e 54 4f 20 74 38 20 56 41 4c  SERT INTO t8 VAL
5410: 55 45 53 28 27 61 66 74 65 72 20 66 69 72 65 64  UES('after fired
5420: 20 27 20 7c 7c 20 6f 6c 64 2e 72 6f 77 69 64 20   ' || old.rowid 
5430: 7c 7c 20 27 2d 3e 27 20 7c 7c 20 6e 65 77 2e 72  || '->' || new.r
5440: 6f 77 69 64 29 3b 0a 20 20 20 20 45 4e 44 3b 0a  owid);.    END;.
5450: 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
5460: 20 74 72 69 67 67 65 72 43 2d 37 2e 32 20 7b 0a   triggerC-7.2 {.
5470: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
5480: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 55 50 44  BEGIN;.      UPD
5490: 41 54 45 20 74 37 20 53 45 54 20 62 3d 37 20 57  ATE t7 SET b=7 W
54a0: 48 45 52 45 20 61 20 3d 20 35 3b 0a 20 20 20 20  HERE a = 5;.    
54b0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
54c0: 74 37 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  t7;.      SELECT
54d0: 20 2a 20 46 52 4f 4d 20 74 38 3b 0a 20 20 20 20   * FROM t8;.    
54e0: 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a 7d 20  ROLLBACK;.  }.} 
54f0: 7b 33 20 34 20 35 20 37 20 7b 61 66 74 65 72 20  {3 4 5 7 {after 
5500: 66 69 72 65 64 20 33 2d 3e 33 7d 7d 0a 64 6f 5f  fired 3->3}}.do_
5510: 74 65 73 74 20 74 72 69 67 67 65 72 43 2d 37 2e  test triggerC-7.
5520: 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  3 {.  execsql {.
5530: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
5540: 20 55 50 44 41 54 45 20 74 37 20 53 45 54 20 62   UPDATE t7 SET b
5550: 3d 37 20 57 48 45 52 45 20 61 20 3d 20 31 3b 0a  =7 WHERE a = 1;.
5560: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
5570: 52 4f 4d 20 74 37 3b 0a 20 20 20 20 20 20 53 45  ROM t7;.      SE
5580: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 38 3b 0a  LECT * FROM t8;.
5590: 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20      ROLLBACK;.  
55a0: 7d 0a 7d 20 7b 33 20 34 20 35 20 36 7d 0a 0a 64  }.} {3 4 5 6}..d
55b0: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 43 2d  o_test triggerC-
55c0: 37 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  7.4 {.  execsql 
55d0: 7b 0a 20 20 20 20 44 52 4f 50 20 54 52 49 47 47  {.    DROP TRIGG
55e0: 45 52 20 74 37 74 3b 0a 20 20 20 20 43 52 45 41  ER t7t;.    CREA
55f0: 54 45 20 54 52 49 47 47 45 52 20 74 37 74 20 42  TE TRIGGER t7t B
5600: 45 46 4f 52 45 20 55 50 44 41 54 45 20 4f 4e 20  EFORE UPDATE ON 
5610: 74 37 20 57 48 45 4e 20 28 6f 6c 64 2e 72 6f 77  t7 WHEN (old.row
5620: 69 64 21 3d 31 20 4f 52 20 6e 65 77 2e 72 6f 77  id!=1 OR new.row
5630: 69 64 21 3d 38 29 0a 20 20 20 20 42 45 47 49 4e  id!=8).    BEGIN
5640: 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 74 37  .      UPDATE t7
5650: 20 73 65 74 20 72 6f 77 69 64 20 3d 20 38 20 57   set rowid = 8 W
5660: 48 45 52 45 20 72 6f 77 69 64 3d 31 3b 0a 20 20  HERE rowid=1;.  
5670: 20 20 45 4e 44 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a    END;.  }.} {}.
5680: 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 43  do_test triggerC
5690: 2d 37 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c  -7.5 {.  execsql
56a0: 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20   {.    BEGIN;.  
56b0: 20 20 20 20 55 50 44 41 54 45 20 74 37 20 53 45      UPDATE t7 SE
56c0: 54 20 62 3d 37 20 57 48 45 52 45 20 61 20 3d 20  T b=7 WHERE a = 
56d0: 35 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  5;.      SELECT 
56e0: 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 74 37  rowid, * FROM t7
56f0: 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  ;.      SELECT *
5700: 20 46 52 4f 4d 20 74 38 3b 0a 20 20 20 20 52 4f   FROM t8;.    RO
5710: 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a 7d 20 7b 32  LLBACK;.  }.} {2
5720: 20 33 20 34 20 33 20 35 20 37 20 38 20 31 20 32   3 4 3 5 7 8 1 2
5730: 20 7b 61 66 74 65 72 20 66 69 72 65 64 20 31 2d   {after fired 1-
5740: 3e 38 7d 20 7b 61 66 74 65 72 20 66 69 72 65 64  >8} {after fired
5750: 20 33 2d 3e 33 7d 7d 0a 64 6f 5f 74 65 73 74 20   3->3}}.do_test 
5760: 74 72 69 67 67 65 72 43 2d 37 2e 36 20 7b 0a 20  triggerC-7.6 {. 
5770: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
5780: 45 47 49 4e 3b 0a 20 20 20 20 20 20 55 50 44 41  EGIN;.      UPDA
5790: 54 45 20 74 37 20 53 45 54 20 62 3d 37 20 57 48  TE t7 SET b=7 WH
57a0: 45 52 45 20 61 20 3d 20 31 3b 0a 20 20 20 20 20  ERE a = 1;.     
57b0: 20 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a   SELECT rowid, *
57c0: 20 46 52 4f 4d 20 74 37 3b 0a 20 20 20 20 20 20   FROM t7;.      
57d0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 38  SELECT * FROM t8
57e0: 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a  ;.    ROLLBACK;.
57f0: 20 20 7d 0a 7d 20 7b 32 20 33 20 34 20 33 20 35    }.} {2 3 4 3 5
5800: 20 36 20 38 20 31 20 32 20 7b 61 66 74 65 72 20   6 8 1 2 {after 
5810: 66 69 72 65 64 20 31 2d 3e 38 7d 7d 0a 0a 64 6f  fired 1->8}}..do
5820: 5f 74 65 73 74 20 74 72 69 67 67 65 72 43 2d 37  _test triggerC-7
5830: 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .7 {.  execsql {
5840: 0a 20 20 20 20 44 52 4f 50 20 54 52 49 47 47 45  .    DROP TRIGGE
5850: 52 20 74 37 74 3b 0a 20 20 20 20 44 52 4f 50 20  R t7t;.    DROP 
5860: 54 52 49 47 47 45 52 20 74 37 74 61 3b 0a 20 20  TRIGGER t7ta;.  
5870: 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52    CREATE TRIGGER
5880: 20 74 37 74 20 42 45 46 4f 52 45 20 44 45 4c 45   t7t BEFORE DELE
5890: 54 45 20 4f 4e 20 74 37 20 42 45 47 49 4e 0a 20  TE ON t7 BEGIN. 
58a0: 20 20 20 20 20 55 50 44 41 54 45 20 74 37 20 73       UPDATE t7 s
58b0: 65 74 20 72 6f 77 69 64 20 3d 20 38 20 57 48 45  et rowid = 8 WHE
58c0: 52 45 20 72 6f 77 69 64 3d 31 3b 0a 20 20 20 20  RE rowid=1;.    
58d0: 45 4e 44 3b 0a 20 20 20 20 43 52 45 41 54 45 20  END;.    CREATE 
58e0: 54 52 49 47 47 45 52 20 74 37 74 61 20 41 46 54  TRIGGER t7ta AFT
58f0: 45 52 20 44 45 4c 45 54 45 20 4f 4e 20 74 37 20  ER DELETE ON t7 
5900: 42 45 47 49 4e 0a 20 20 20 20 20 20 49 4e 53 45  BEGIN.      INSE
5910: 52 54 20 49 4e 54 4f 20 74 38 20 56 41 4c 55 45  RT INTO t8 VALUE
5920: 53 28 27 61 66 74 65 72 20 66 69 72 65 64 20 27  S('after fired '
5930: 20 7c 7c 20 6f 6c 64 2e 72 6f 77 69 64 29 3b 0a   || old.rowid);.
5940: 20 20 20 20 45 4e 44 3b 0a 20 20 7d 0a 7d 20 7b      END;.  }.} {
5950: 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65  }.do_test trigge
5960: 72 43 2d 37 2e 38 20 7b 0a 20 20 65 78 65 63 73  rC-7.8 {.  execs
5970: 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  ql {.    BEGIN;.
5980: 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f        DELETE FRO
5990: 4d 20 74 37 20 57 48 45 52 45 20 61 20 3d 20 33  M t7 WHERE a = 3
59a0: 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 72  ;.      SELECT r
59b0: 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20 74 37 3b  owid, * FROM t7;
59c0: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .      SELECT * 
59d0: 46 52 4f 4d 20 74 38 3b 0a 20 20 20 20 52 4f 4c  FROM t8;.    ROL
59e0: 4c 42 41 43 4b 3b 0a 20 20 7d 0a 7d 20 7b 33 20  LBACK;.  }.} {3 
59f0: 35 20 36 20 38 20 31 20 32 20 7b 61 66 74 65 72  5 6 8 1 2 {after
5a00: 20 66 69 72 65 64 20 32 7d 7d 0a 64 6f 5f 74 65   fired 2}}.do_te
5a10: 73 74 20 74 72 69 67 67 65 72 43 2d 37 2e 39 20  st triggerC-7.9 
5a20: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
5a30: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 44    BEGIN;.      D
5a40: 45 4c 45 54 45 20 46 52 4f 4d 20 74 37 20 57 48  ELETE FROM t7 WH
5a50: 45 52 45 20 61 20 3d 20 31 3b 0a 20 20 20 20 20  ERE a = 1;.     
5a60: 20 53 45 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a   SELECT rowid, *
5a70: 20 46 52 4f 4d 20 74 37 3b 0a 20 20 20 20 20 20   FROM t7;.      
5a80: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 38  SELECT * FROM t8
5a90: 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a  ;.    ROLLBACK;.
5aa0: 20 20 7d 0a 7d 20 7b 32 20 33 20 34 20 33 20 35    }.} {2 3 4 3 5
5ab0: 20 36 20 38 20 31 20 32 7d 0a 0a 23 20 54 69 63   6 8 1 2}..# Tic
5ac0: 6b 65 74 20 5b 65 32 35 64 39 65 61 37 37 31 66  ket [e25d9ea771f
5ad0: 65 62 63 39 63 33 31 31 39 32 38 63 31 63 30 31  ebc9c311928c1c01
5ae0: 63 33 31 36 33 64 63 62 32 36 36 34 33 5d 0a 23  c3163dcb26643].#
5af0: 20 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65   .do_test trigge
5b00: 72 43 2d 39 2e 31 20 7b 0a 20 20 65 78 65 63 73  rC-9.1 {.  execs
5b10: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
5b20: 54 41 42 4c 45 20 74 39 28 61 2c 62 29 3b 0a 20  TABLE t9(a,b);. 
5b30: 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
5b40: 74 39 62 20 4f 4e 20 74 39 28 62 29 3b 0a 20 20  t9b ON t9(b);.  
5b50: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 39    INSERT INTO t9
5b60: 20 56 41 4c 55 45 53 28 31 2c 30 29 3b 0a 20 20   VALUES(1,0);.  
5b70: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 39    INSERT INTO t9
5b80: 20 56 41 4c 55 45 53 28 32 2c 31 29 3b 0a 20 20   VALUES(2,1);.  
5b90: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 39    INSERT INTO t9
5ba0: 20 56 41 4c 55 45 53 28 33 2c 32 29 3b 0a 20 20   VALUES(3,2);.  
5bb0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 39    INSERT INTO t9
5bc0: 20 53 45 4c 45 43 54 20 61 2b 33 2c 20 61 2b 32   SELECT a+3, a+2
5bd0: 20 46 52 4f 4d 20 74 39 3b 0a 20 20 20 20 49 4e   FROM t9;.    IN
5be0: 53 45 52 54 20 49 4e 54 4f 20 74 39 20 53 45 4c  SERT INTO t9 SEL
5bf0: 45 43 54 20 61 2b 36 2c 20 61 2b 35 20 46 52 4f  ECT a+6, a+5 FRO
5c00: 4d 20 74 39 3b 0a 20 20 20 20 53 45 4c 45 43 54  M t9;.    SELECT
5c10: 20 61 20 46 52 4f 4d 20 74 39 20 4f 52 44 45 52   a FROM t9 ORDER
5c20: 20 42 59 20 61 3b 0a 20 20 7d 0a 7d 20 7b 31 20   BY a;.  }.} {1 
5c30: 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39 20  2 3 4 5 6 7 8 9 
5c40: 31 30 20 31 31 20 31 32 7d 0a 64 6f 5f 74 65 73  10 11 12}.do_tes
5c50: 74 20 74 72 69 67 67 65 72 43 2d 39 2e 32 20 7b  t triggerC-9.2 {
5c60: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
5c70: 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20   CREATE TRIGGER 
5c80: 74 39 72 31 20 41 46 54 45 52 20 44 45 4c 45 54  t9r1 AFTER DELET
5c90: 45 20 4f 4e 20 74 39 20 42 45 47 49 4e 0a 20 20  E ON t9 BEGIN.  
5ca0: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
5cb0: 74 39 20 57 48 45 52 45 20 62 3d 6f 6c 64 2e 61  t9 WHERE b=old.a
5cc0: 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 20 20 44  ;.    END;.    D
5cd0: 45 4c 45 54 45 20 46 52 4f 4d 20 74 39 20 57 48  ELETE FROM t9 WH
5ce0: 45 52 45 20 62 3d 34 3b 0a 20 20 20 20 53 45 4c  ERE b=4;.    SEL
5cf0: 45 43 54 20 61 20 46 52 4f 4d 20 74 39 20 4f 52  ECT a FROM t9 OR
5d00: 44 45 52 20 42 59 20 61 3b 0a 20 20 7d 0a 7d 20  DER BY a;.  }.} 
5d10: 7b 31 20 32 20 33 20 34 7d 0a 0a 23 20 41 74 20  {1 2 3 4}..# At 
5d20: 6f 6e 65 20 70 6f 69 6e 74 20 28 62 65 74 77 65  one point (betwe
5d30: 65 6e 20 76 65 72 73 69 6f 6e 73 20 33 2e 36 2e  en versions 3.6.
5d40: 31 38 20 61 6e 64 20 33 2e 36 2e 32 30 20 69 6e  18 and 3.6.20 in
5d50: 63 6c 75 73 69 76 65 29 2c 20 61 6e 20 55 50 44  clusive), an UPD
5d60: 41 54 45 20 0a 23 20 74 68 61 74 20 66 69 72 65  ATE .# that fire
5d70: 64 20 61 20 42 45 46 4f 52 45 20 74 72 69 67 67  d a BEFORE trigg
5d80: 65 72 20 74 68 61 74 20 69 74 73 65 6c 66 20 75  er that itself u
5d90: 70 64 61 74 65 64 20 74 68 65 20 73 61 6d 65 20  pdated the same 
5da0: 72 6f 77 20 61 73 20 74 68 65 20 0a 23 20 73 74  row as the .# st
5db0: 61 74 65 6d 65 6e 74 20 63 61 75 73 69 6e 67 20  atement causing 
5dc0: 69 74 20 74 6f 20 66 69 72 65 20 77 61 73 20 63  it to fire was c
5dd0: 61 75 73 69 6e 67 20 61 20 73 74 72 61 6e 67 65  ausing a strange
5de0: 20 73 69 64 65 2d 65 66 66 65 63 74 3a 20 54 68   side-effect: Th
5df0: 65 20 0a 23 20 76 61 6c 75 65 73 20 75 70 64 61  e .# values upda
5e00: 74 65 64 20 62 79 20 74 68 65 20 73 74 61 74 65  ted by the state
5e10: 6d 65 6e 74 20 77 69 74 68 69 6e 20 74 68 65 20  ment within the 
5e20: 74 72 69 67 67 65 72 20 77 65 72 65 20 62 65 69  trigger were bei
5e30: 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 20 0a  ng overwritten .
5e40: 23 20 62 79 20 74 68 65 20 76 61 6c 75 65 73 20  # by the values 
5e50: 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 61 72 72  in the new.* arr
5e60: 61 79 2c 20 65 76 65 6e 20 69 66 20 74 68 6f 73  ay, even if thos
5e70: 65 20 76 61 6c 75 65 73 20 77 65 72 65 20 6e 6f  e values were no
5e80: 74 20 0a 23 20 74 68 65 6d 73 65 6c 76 65 73 20  t .# themselves 
5e90: 77 72 69 74 74 65 6e 20 62 79 20 74 68 65 20 70  written by the p
5ea0: 61 72 65 6e 74 20 55 50 44 41 54 45 20 73 74 61  arent UPDATE sta
5eb0: 74 65 6d 65 6e 74 2e 0a 23 0a 23 20 54 65 63 68  tement..#.# Tech
5ec0: 6e 69 63 61 6c 6c 79 20 73 70 65 61 6b 69 6e 67  nically speaking
5ed0: 20 74 68 69 73 20 77 61 73 20 6e 6f 74 20 61 20   this was not a 
5ee0: 62 75 67 2e 20 54 68 65 20 53 51 4c 69 74 65 20  bug. The SQLite 
5ef0: 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 73 61  documentation sa
5f00: 79 73 0a 23 20 74 68 61 74 20 69 66 20 61 20 42  ys.# that if a B
5f10: 45 46 4f 52 45 20 55 50 44 41 54 45 20 6f 72 20  EFORE UPDATE or 
5f20: 42 45 46 4f 52 45 20 44 45 4c 45 54 45 20 74 72  BEFORE DELETE tr
5f30: 69 67 67 65 72 20 6d 6f 64 69 66 69 65 73 20 6f  igger modifies o
5f40: 72 20 64 65 6c 65 74 65 73 20 74 68 65 0a 23 20  r deletes the.# 
5f50: 72 6f 77 20 74 68 61 74 20 74 68 65 20 70 61 72  row that the par
5f60: 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 69 73  ent statement is
5f70: 20 6f 70 65 72 61 74 69 6e 67 20 6f 6e 20 74 68   operating on th
5f80: 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 75 6e  e results are un
5f90: 64 65 66 69 6e 65 64 2e 20 0a 23 20 42 75 74 20  defined. .# But 
5fa0: 61 73 20 6f 66 20 33 2e 36 2e 32 31 20 62 65 68  as of 3.6.21 beh
5fb0: 61 76 69 6f 75 72 20 69 73 20 72 65 73 74 6f 72  aviour is restor
5fc0: 65 64 20 74 6f 20 74 68 65 20 77 61 79 20 69 74  ed to the way it
5fd0: 20 77 61 73 20 69 6e 20 76 65 72 73 69 6f 6e 73   was in versions
5fe0: 0a 23 20 33 2e 36 2e 31 37 20 61 6e 64 20 65 61  .# 3.6.17 and ea
5ff0: 72 6c 69 65 72 20 74 6f 20 61 76 6f 69 64 20 63  rlier to avoid c
6000: 61 75 73 69 6e 67 20 75 6e 6e 65 63 65 73 73 61  ausing unnecessa
6010: 72 79 20 64 69 66 66 69 63 75 6c 74 69 65 73 2e  ry difficulties.
6020: 0a 23 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67  .#.do_test trigg
6030: 65 72 43 2d 31 30 2e 31 20 7b 0a 20 20 65 78 65  erC-10.1 {.  exe
6040: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
6050: 45 20 54 41 42 4c 45 20 74 31 30 28 61 2c 20 75  E TABLE t10(a, u
6060: 70 64 61 74 65 63 6e 74 20 44 45 46 41 55 4c 54  pdatecnt DEFAULT
6070: 20 30 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   0);.    CREATE 
6080: 54 52 49 47 47 45 52 20 74 31 30 5f 62 75 20 42  TRIGGER t10_bu B
6090: 45 46 4f 52 45 20 55 50 44 41 54 45 20 4f 46 20  EFORE UPDATE OF 
60a0: 61 20 4f 4e 20 74 31 30 20 42 45 47 49 4e 0a 20  a ON t10 BEGIN. 
60b0: 20 20 20 20 20 55 50 44 41 54 45 20 74 31 30 20       UPDATE t10 
60c0: 53 45 54 20 75 70 64 61 74 65 63 6e 74 20 3d 20  SET updatecnt = 
60d0: 75 70 64 61 74 65 63 6e 74 2b 31 20 57 48 45 52  updatecnt+1 WHER
60e0: 45 20 72 6f 77 69 64 20 3d 20 6f 6c 64 2e 72 6f  E rowid = old.ro
60f0: 77 69 64 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20  wid;.    END;.  
6100: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
6110: 30 28 61 29 20 56 41 4c 55 45 53 28 27 68 65 6c  0(a) VALUES('hel
6120: 6c 6f 27 29 3b 0a 20 20 7d 0a 0a 20 20 23 20 42  lo');.  }..  # B
6130: 65 66 6f 72 65 20 74 68 65 20 70 72 6f 62 6c 65  efore the proble
6140: 6d 20 77 61 73 20 66 69 78 65 64 2c 20 74 61 62  m was fixed, tab
6150: 6c 65 20 74 31 30 20 77 6f 75 6c 64 20 63 6f 6e  le t10 would con
6160: 74 61 69 6e 20 74 68 65 20 74 75 70 6c 65 20 0a  tain the tuple .
6170: 20 20 23 20 28 77 6f 72 6c 64 2c 20 30 29 20 61    # (world, 0) a
6180: 66 74 65 72 20 72 75 6e 6e 69 6e 67 20 74 68 65  fter running the
6190: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 72 69 70   following scrip
61a0: 74 20 28 62 65 63 61 75 73 65 20 74 68 65 20 76  t (because the v
61b0: 61 6c 75 65 0a 20 20 23 20 31 20 77 72 69 74 74  alue.  # 1 writt
61c0: 65 6e 20 74 6f 20 63 6f 6c 75 6d 6e 20 22 75 70  en to column "up
61d0: 64 61 74 65 63 6e 74 22 20 77 61 73 20 63 6c 6f  datecnt" was clo
61e0: 62 62 65 72 65 64 20 62 79 20 74 68 65 20 6f 6c  bbered by the ol
61f0: 64 20 76 61 6c 75 65 20 30 29 2e 0a 20 20 23 0a  d value 0)..  #.
6200: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
6210: 55 50 44 41 54 45 20 74 31 30 20 53 45 54 20 61  UPDATE t10 SET a
6220: 20 3d 20 27 77 6f 72 6c 64 27 3b 0a 20 20 20 20   = 'world';.    
6230: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
6240: 30 3b 0a 20 20 7d 0a 7d 20 7b 77 6f 72 6c 64 20  0;.  }.} {world 
6250: 31 7d 0a 0a 64 6f 5f 74 65 73 74 20 74 72 69 67  1}..do_test trig
6260: 67 65 72 43 2d 31 30 2e 32 20 7b 0a 20 20 65 78  gerC-10.2 {.  ex
6270: 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41  ecsql {.    UPDA
6280: 54 45 20 74 31 30 20 53 45 54 20 61 20 3d 20 27  TE t10 SET a = '
6290: 74 63 6c 27 2c 20 75 70 64 61 74 65 63 6e 74 20  tcl', updatecnt 
62a0: 3d 20 35 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  = 5;.    SELECT 
62b0: 2a 20 46 52 4f 4d 20 74 31 30 3b 0a 20 20 7d 0a  * FROM t10;.  }.
62c0: 7d 20 7b 74 63 6c 20 35 7d 0a 0a 64 6f 5f 74 65  } {tcl 5}..do_te
62d0: 73 74 20 74 72 69 67 67 65 72 43 2d 31 30 2e 33  st triggerC-10.3
62e0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
62f0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
6300: 74 31 31 28 0a 20 20 20 20 20 20 63 31 2c 20 20  t11(.      c1,  
6310: 20 63 32 2c 20 20 63 33 2c 20 20 63 34 2c 20 20   c2,  c3,  c4,  
6320: 63 35 2c 20 20 63 36 2c 20 20 63 37 2c 20 20 63  c5,  c6,  c7,  c
6330: 38 2c 20 20 63 39 2c 20 63 31 30 2c 0a 20 20 20  8,  c9, c10,.   
6340: 20 20 20 63 31 31 2c 20 63 31 32 2c 20 63 31 33     c11, c12, c13
6350: 2c 20 63 31 34 2c 20 63 31 35 2c 20 63 31 36 2c  , c14, c15, c16,
6360: 20 63 31 37 2c 20 63 31 38 2c 20 63 31 39 2c 20   c17, c18, c19, 
6370: 63 32 30 2c 0a 20 20 20 20 20 20 63 32 31 2c 20  c20,.      c21, 
6380: 63 32 32 2c 20 63 32 33 2c 20 63 32 34 2c 20 63  c22, c23, c24, c
6390: 32 35 2c 20 63 32 36 2c 20 63 32 37 2c 20 63 32  25, c26, c27, c2
63a0: 38 2c 20 63 32 39 2c 20 63 33 30 2c 0a 20 20 20  8, c29, c30,.   
63b0: 20 20 20 63 33 31 2c 20 63 33 32 2c 20 63 33 33     c31, c32, c33
63c0: 2c 20 63 33 34 2c 20 63 33 35 2c 20 63 33 36 2c  , c34, c35, c36,
63d0: 20 63 33 37 2c 20 63 33 38 2c 20 63 33 39 2c 20   c37, c38, c39, 
63e0: 63 34 30 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20  c40.    );..    
63f0: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74  CREATE TRIGGER t
6400: 31 31 5f 62 75 20 42 45 46 4f 52 45 20 55 50 44  11_bu BEFORE UPD
6410: 41 54 45 20 4f 46 20 63 31 20 4f 4e 20 74 31 31  ATE OF c1 ON t11
6420: 20 42 45 47 49 4e 0a 20 20 20 20 20 20 55 50 44   BEGIN.      UPD
6430: 41 54 45 20 74 31 31 20 53 45 54 20 63 33 31 20  ATE t11 SET c31 
6440: 3d 20 63 33 31 2b 31 2c 20 63 33 32 3d 63 33 32  = c31+1, c32=c32
6450: 2b 31 20 57 48 45 52 45 20 72 6f 77 69 64 20 3d  +1 WHERE rowid =
6460: 20 6f 6c 64 2e 72 6f 77 69 64 3b 0a 20 20 20 20   old.rowid;.    
6470: 45 4e 44 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54  END;..    INSERT
6480: 20 49 4e 54 4f 20 74 31 31 20 56 41 4c 55 45 53   INTO t11 VALUES
6490: 28 0a 20 20 20 20 20 20 31 2c 20 20 20 32 2c 20  (.      1,   2, 
64a0: 20 33 2c 20 20 34 2c 20 20 35 2c 20 20 36 2c 20   3,  4,  5,  6, 
64b0: 20 37 2c 20 20 38 2c 20 20 39 2c 20 31 30 2c 0a   7,  8,  9, 10,.
64c0: 20 20 20 20 20 20 31 31 2c 20 31 32 2c 20 31 33        11, 12, 13
64d0: 2c 20 31 34 2c 20 31 35 2c 20 31 36 2c 20 31 37  , 14, 15, 16, 17
64e0: 2c 20 31 38 2c 20 31 39 2c 20 32 30 2c 0a 20 20  , 18, 19, 20,.  
64f0: 20 20 20 20 32 31 2c 20 32 32 2c 20 32 33 2c 20      21, 22, 23, 
6500: 32 34 2c 20 32 35 2c 20 32 36 2c 20 32 37 2c 20  24, 25, 26, 27, 
6510: 32 38 2c 20 32 39 2c 20 33 30 2c 0a 20 20 20 20  28, 29, 30,.    
6520: 20 20 33 31 2c 20 33 32 2c 20 33 33 2c 20 33 34    31, 32, 33, 34
6530: 2c 20 33 35 2c 20 33 36 2c 20 33 37 2c 20 33 38  , 35, 36, 37, 38
6540: 2c 20 33 39 2c 20 34 30 0a 20 20 20 20 29 3b 0a  , 39, 40.    );.
6550: 20 20 7d 0a 0a 20 20 23 20 42 65 66 6f 72 65 20    }..  # Before 
6560: 74 68 65 20 70 72 6f 62 6c 65 6d 20 77 61 73 20  the problem was 
6570: 66 69 78 65 64 2c 20 74 61 62 6c 65 20 74 31 30  fixed, table t10
6580: 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 20 74   would contain t
6590: 68 65 20 74 75 70 6c 65 20 0a 20 20 23 20 28 77  he tuple .  # (w
65a0: 6f 72 6c 64 2c 20 30 29 20 61 66 74 65 72 20 72  orld, 0) after r
65b0: 75 6e 6e 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f  unning the follo
65c0: 77 69 6e 67 20 73 63 72 69 70 74 20 28 62 65 63  wing script (bec
65d0: 61 75 73 65 20 74 68 65 20 76 61 6c 75 65 0a 20  ause the value. 
65e0: 20 23 20 31 20 77 72 69 74 74 65 6e 20 74 6f 20   # 1 written to 
65f0: 63 6f 6c 75 6d 6e 20 22 75 70 64 61 74 65 63 6e  column "updatecn
6600: 74 22 20 77 61 73 20 63 6c 6f 62 62 65 72 65 64  t" was clobbered
6610: 20 62 79 20 74 68 65 20 6f 6c 64 20 76 61 6c 75   by the old valu
6620: 65 20 30 29 2e 0a 20 20 23 0a 20 20 65 78 65 63  e 0)..  #.  exec
6630: 73 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45  sql {.    UPDATE
6640: 20 74 31 31 20 53 45 54 20 63 34 3d 33 35 2c 20   t11 SET c4=35, 
6650: 63 33 33 3d 32 32 2c 20 63 31 3d 35 3b 0a 20 20  c33=22, c1=5;.  
6660: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
6670: 74 31 31 3b 0a 20 20 7d 20 0a 7d 20 7b 35 20 32  t11;.  } .} {5 2
6680: 20 33 20 33 35 20 35 20 36 20 37 20 38 20 39 20   3 35 5 6 7 8 9 
6690: 31 30 20 31 31 20 31 32 20 31 33 20 31 34 20 31  10 11 12 13 14 1
66a0: 35 20 31 36 20 31 37 20 31 38 20 31 39 20 32 30  5 16 17 18 19 20
66b0: 20 32 31 20 32 32 20 32 33 20 32 34 20 32 35 20   21 22 23 24 25 
66c0: 32 36 20 32 37 20 32 38 20 32 39 20 33 30 20 33  26 27 28 29 30 3
66d0: 32 20 33 33 20 32 32 20 33 34 20 33 35 20 33 36  2 33 22 34 35 36
66e0: 20 33 37 20 33 38 20 33 39 20 34 30 7d 0a 0a 23   37 38 39 40}..#
66f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 23 20 54 65 73 74  ---------.# Test
6740: 20 74 68 61 74 20 62 75 67 20 5b 33 37 31 62 61   that bug [371ba
6750: 62 35 64 36 35 5d 20 68 61 73 20 62 65 65 6e 20  b5d65] has been 
6760: 66 69 78 65 64 2e 20 42 45 46 4f 52 45 20 49 4e  fixed. BEFORE IN
6770: 53 45 52 54 20 61 6e 64 20 49 4e 53 54 45 41 44  SERT and INSTEAD
6780: 20 4f 46 0a 23 20 49 4e 53 45 52 54 20 74 72 69   OF.# INSERT tri
6790: 67 67 65 72 73 20 77 69 74 68 20 74 68 65 20 44  ggers with the D
67a0: 45 46 41 55 4c 54 20 56 41 4c 55 45 53 20 49 4e  EFAULT VALUES IN
67b0: 53 45 52 54 20 73 79 6e 74 61 78 2e 0a 23 0a 64  SERT syntax..#.d
67c0: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 43 2d  o_test triggerC-
67d0: 31 31 2e 30 20 7b 0a 20 20 63 61 74 63 68 73 71  11.0 {.  catchsq
67e0: 6c 20 7b 20 44 52 4f 50 20 54 41 42 4c 45 20 6c  l { DROP TABLE l
67f0: 6f 67 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 20  og }.  execsql  
6800: 7b 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6c  { CREATE TABLE l
6810: 6f 67 28 61 2c 20 62 29 20 7d 0a 7d 20 7b 7d 0a  og(a, b) }.} {}.
6820: 0a 66 6f 72 65 61 63 68 20 7b 74 65 73 74 6e 6f  .foreach {testno
6830: 20 74 62 6c 20 64 65 66 61 75 6c 74 73 7d 20 7b   tbl defaults} {
6840: 0a 20 20 31 20 22 43 52 45 41 54 45 20 54 41 42  .  1 "CREATE TAB
6850: 4c 45 20 74 31 28 61 2c 20 62 29 22 20 20 20 20  LE t1(a, b)"    
6860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6870: 20 20 20 20 20 20 7b 7b 7d 20 7b 7d 7d 0a 20 20        {{} {}}.  
6880: 32 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  2 "CREATE TABLE 
6890: 74 31 28 61 20 44 45 46 41 55 4c 54 20 31 2c 20  t1(a DEFAULT 1, 
68a0: 62 20 44 45 46 41 55 4c 54 20 27 61 62 63 27 29  b DEFAULT 'abc')
68b0: 22 20 20 7b 31 20 61 62 63 7d 0a 20 20 33 20 22  "  {1 abc}.  3 "
68c0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
68d0: 61 2c 20 62 20 44 45 46 41 55 4c 54 20 34 2e 35  a, b DEFAULT 4.5
68e0: 29 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )"              
68f0: 7b 7b 7d 20 34 2e 35 7d 0a 7d 20 7b 0a 20 20 64  {{} 4.5}.} {.  d
6900: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 43 2d  o_test triggerC-
6910: 31 31 2e 24 74 65 73 74 6e 6f 2e 31 20 7b 0a 20  11.$testno.1 {. 
6920: 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 44 52     catchsql { DR
6930: 4f 50 20 54 41 42 4c 45 20 74 31 20 7d 0a 20 20  OP TABLE t1 }.  
6940: 20 20 65 78 65 63 73 71 6c 20 7b 20 44 45 4c 45    execsql { DELE
6950: 54 45 20 46 52 4f 4d 20 6c 6f 67 20 7d 0a 20 20  TE FROM log }.  
6960: 20 20 65 78 65 63 73 71 6c 20 24 74 62 6c 0a 20    execsql $tbl. 
6970: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
6980: 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45     CREATE TRIGGE
6990: 52 20 74 74 31 20 42 45 46 4f 52 45 20 49 4e 53  R tt1 BEFORE INS
69a0: 45 52 54 20 4f 4e 20 74 31 20 42 45 47 49 4e 20  ERT ON t1 BEGIN 
69b0: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
69c0: 49 4e 54 4f 20 6c 6f 67 20 56 41 4c 55 45 53 28  INTO log VALUES(
69d0: 6e 65 77 2e 61 2c 20 6e 65 77 2e 62 29 3b 0a 20  new.a, new.b);. 
69e0: 20 20 20 20 20 45 4e 44 3b 0a 20 20 20 20 20 20       END;.      
69f0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 44  INSERT INTO t1 D
6a00: 45 46 41 55 4c 54 20 56 41 4c 55 45 53 3b 0a 20  EFAULT VALUES;. 
6a10: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
6a20: 4f 4d 20 6c 6f 67 3b 0a 20 20 20 20 7d 0a 20 20  OM log;.    }.  
6a30: 7d 20 24 64 65 66 61 75 6c 74 73 0a 0a 20 20 64  } $defaults..  d
6a40: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 43 2d  o_test triggerC-
6a50: 31 31 2e 24 74 65 73 74 6e 6f 2e 32 20 7b 0a 20  11.$testno.2 {. 
6a60: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 44 45 4c     execsql { DEL
6a70: 45 54 45 20 46 52 4f 4d 20 6c 6f 67 20 7d 0a 20  ETE FROM log }. 
6a80: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
6a90: 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45     CREATE TRIGGE
6aa0: 52 20 74 74 32 20 41 46 54 45 52 20 49 4e 53 45  R tt2 AFTER INSE
6ab0: 52 54 20 4f 4e 20 74 31 20 42 45 47 49 4e 20 0a  RT ON t1 BEGIN .
6ac0: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
6ad0: 4e 54 4f 20 6c 6f 67 20 56 41 4c 55 45 53 28 6e  NTO log VALUES(n
6ae0: 65 77 2e 61 2c 20 6e 65 77 2e 62 29 3b 0a 20 20  ew.a, new.b);.  
6af0: 20 20 20 20 45 4e 44 3b 0a 20 20 20 20 20 20 49      END;.      I
6b00: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 44 45  NSERT INTO t1 DE
6b10: 46 41 55 4c 54 20 56 41 4c 55 45 53 3b 0a 20 20  FAULT VALUES;.  
6b20: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
6b30: 4d 20 6c 6f 67 3b 0a 20 20 20 20 7d 0a 20 20 7d  M log;.    }.  }
6b40: 20 5b 63 6f 6e 63 61 74 20 24 64 65 66 61 75 6c   [concat $defaul
6b50: 74 73 20 24 64 65 66 61 75 6c 74 73 5d 0a 0a 20  ts $defaults].. 
6b60: 20 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72   do_test trigger
6b70: 43 2d 31 31 2e 24 74 65 73 74 6e 6f 2e 33 20 7b  C-11.$testno.3 {
6b80: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 44  .    execsql { D
6b90: 52 4f 50 20 54 52 49 47 47 45 52 20 74 74 31 20  ROP TRIGGER tt1 
6ba0: 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  }.    execsql { 
6bb0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 6c 6f 67 20  DELETE FROM log 
6bc0: 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  }.    execsql {.
6bd0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
6be0: 4f 20 74 31 20 44 45 46 41 55 4c 54 20 56 41 4c  O t1 DEFAULT VAL
6bf0: 55 45 53 3b 0a 20 20 20 20 20 20 53 45 4c 45 43  UES;.      SELEC
6c00: 54 20 2a 20 46 52 4f 4d 20 6c 6f 67 3b 0a 20 20  T * FROM log;.  
6c10: 20 20 7d 0a 20 20 7d 20 24 64 65 66 61 75 6c 74    }.  } $default
6c20: 73 0a 7d 20 0a 64 6f 5f 74 65 73 74 20 74 72 69  s.} .do_test tri
6c30: 67 67 65 72 43 2d 31 31 2e 34 20 7b 0a 20 20 63  ggerC-11.4 {.  c
6c40: 61 74 63 68 73 71 6c 20 7b 20 44 52 4f 50 20 54  atchsql { DROP T
6c50: 41 42 4c 45 20 74 32 20 7d 0a 20 20 65 78 65 63  ABLE t2 }.  exec
6c60: 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45  sql {.    DELETE
6c70: 20 46 52 4f 4d 20 6c 6f 67 3b 0a 20 20 20 20 43   FROM log;.    C
6c80: 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61  REATE TABLE t2(a
6c90: 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , b);.    CREATE
6ca0: 20 56 49 45 57 20 76 32 20 41 53 20 53 45 4c 45   VIEW v2 AS SELE
6cb0: 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20  CT * FROM t2;.  
6cc0: 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52    CREATE TRIGGER
6cd0: 20 74 76 32 20 49 4e 53 54 45 41 44 20 4f 46 20   tv2 INSTEAD OF 
6ce0: 49 4e 53 45 52 54 20 4f 4e 20 76 32 20 42 45 47  INSERT ON v2 BEG
6cf0: 49 4e 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  IN.      INSERT 
6d00: 49 4e 54 4f 20 6c 6f 67 20 56 41 4c 55 45 53 28  INTO log VALUES(
6d10: 6e 65 77 2e 61 2c 20 6e 65 77 2e 62 29 3b 0a 20  new.a, new.b);. 
6d20: 20 20 20 45 4e 44 3b 0a 20 20 20 20 49 4e 53 45     END;.    INSE
6d30: 52 54 20 49 4e 54 4f 20 76 32 20 44 45 46 41 55  RT INTO v2 DEFAU
6d40: 4c 54 20 56 41 4c 55 45 53 3b 0a 20 20 20 20 53  LT VALUES;.    S
6d50: 45 4c 45 43 54 20 61 2c 20 62 2c 20 61 20 49 53  ELECT a, b, a IS
6d60: 20 4e 55 4c 4c 2c 20 62 20 49 53 20 4e 55 4c 4c   NULL, b IS NULL
6d70: 20 46 52 4f 4d 20 6c 6f 67 3b 0a 20 20 7d 0a 7d   FROM log;.  }.}
6d80: 20 7b 7b 7d 20 7b 7d 20 31 20 31 7d 0a 0a 64 6f   {{} {} 1 1}..do
6d90: 5f 74 65 73 74 20 74 72 69 67 67 65 72 43 2d 31  _test triggerC-1
6da0: 32 2e 31 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65  2.1 {.  db close
6db0: 0a 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20 74  .  forcedelete t
6dc0: 65 73 74 2e 64 62 0a 20 20 73 71 6c 69 74 65 33  est.db.  sqlite3
6dd0: 20 64 62 20 74 65 73 74 2e 64 62 0a 0a 20 20 65   db test.db..  e
6de0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
6df0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
6e00: 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  b);.    INSERT I
6e10: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c  NTO t1 VALUES(1,
6e20: 20 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   2);.    INSERT 
6e30: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33  INTO t1 VALUES(3
6e40: 2c 20 34 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , 4);.    INSERT
6e50: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
6e60: 35 2c 20 36 29 3b 0a 20 20 20 20 43 52 45 41 54  5, 6);.    CREAT
6e70: 45 20 54 52 49 47 47 45 52 20 74 72 31 20 41 46  E TRIGGER tr1 AF
6e80: 54 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 74 31  TER INSERT ON t1
6e90: 20 42 45 47 49 4e 20 53 45 4c 45 43 54 20 31 20   BEGIN SELECT 1 
6ea0: 3b 20 45 4e 44 20 3b 0a 20 20 20 20 53 45 4c 45  ; END ;.    SELE
6eb0: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
6ec0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a   sqlite_master;.
6ed0: 20 20 7d 0a 7d 20 7b 32 7d 0a 64 6f 5f 74 65 73    }.} {2}.do_tes
6ee0: 74 20 74 72 69 67 67 65 72 43 2d 31 32 2e 32 20  t triggerC-12.2 
6ef0: 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b 20 53 45  {.  db eval { SE
6f00: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
6f10: 20 7b 0a 20 20 20 20 69 66 20 7b 24 61 20 3d 3d   {.    if {$a ==
6f20: 20 33 7d 20 7b 20 65 78 65 63 73 71 6c 20 7b 20   3} { execsql { 
6f30: 44 52 4f 50 20 54 52 49 47 47 45 52 20 74 72 31  DROP TRIGGER tr1
6f40: 20 7d 20 7d 0a 20 20 7d 0a 20 20 65 78 65 63 73   } }.  }.  execs
6f50: 71 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e  ql { SELECT coun
6f60: 74 28 2a 29 20 46 52 4f 4d 20 73 71 6c 69 74 65  t(*) FROM sqlite
6f70: 5f 6d 61 73 74 65 72 20 7d 0a 7d 20 7b 31 7d 0a  _master }.} {1}.
6f80: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
6f90: 20 74 72 69 67 67 65 72 43 2d 31 33 2e 31 20 7b   triggerC-13.1 {
6fa0: 0a 20 20 50 52 41 47 4d 41 20 72 65 63 75 72 73  .  PRAGMA recurs
6fb0: 69 76 65 5f 74 72 69 67 67 65 72 73 20 3d 20 4f  ive_triggers = O
6fc0: 4e 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  N;.  CREATE TABL
6fd0: 45 20 74 31 32 28 61 2c 20 62 29 3b 0a 20 20 49  E t12(a, b);.  I
6fe0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 32 20 56  NSERT INTO t12 V
6ff0: 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 43  ALUES(1, 2);.  C
7000: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74 72  REATE TRIGGER tr
7010: 31 32 20 41 46 54 45 52 20 55 50 44 41 54 45 20  12 AFTER UPDATE 
7020: 4f 4e 20 74 31 32 20 42 45 47 49 4e 0a 20 20 20  ON t12 BEGIN.   
7030: 20 55 50 44 41 54 45 20 74 31 32 20 53 45 54 20   UPDATE t12 SET 
7040: 61 3d 6e 65 77 2e 61 2b 31 2c 20 62 3d 6e 65 77  a=new.a+1, b=new
7050: 2e 62 2b 31 3b 0a 20 20 45 4e 44 3b 0a 7d 20 7b  .b+1;.  END;.} {
7060: 7d 0a 64 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65  }.do_catchsql_te
7070: 73 74 20 74 72 69 67 67 65 72 43 2d 31 33 2e 32  st triggerC-13.2
7080: 20 7b 0a 20 20 55 50 44 41 54 45 20 74 31 32 20   {.  UPDATE t12 
7090: 53 45 54 20 61 3d 61 2b 31 2c 20 62 3d 62 2b 31  SET a=a+1, b=b+1
70a0: 3b 0a 7d 20 7b 31 20 7b 74 6f 6f 20 6d 61 6e 79  ;.} {1 {too many
70b0: 20 6c 65 76 65 6c 73 20 6f 66 20 74 72 69 67 67   levels of trigg
70c0: 65 72 20 72 65 63 75 72 73 69 6f 6e 7d 7d 0a 0a  er recursion}}..
70d0: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
70e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 23 20 54 68 65  ----------.# The
7120: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73   following tests
7130: 20 73 65 65 6b 20 74 6f 20 76 65 72 69 66 79 20   seek to verify 
7140: 74 68 61 74 20 63 6f 6e 73 74 61 6e 74 20 76 61  that constant va
7150: 6c 75 65 73 20 28 69 2e 65 2e 20 6c 69 74 65 72  lues (i.e. liter
7160: 61 6c 73 29 0a 23 20 61 72 65 20 6e 6f 74 20 66  als).# are not f
7170: 61 63 74 6f 72 65 64 20 6f 75 74 20 6f 66 20 6c  actored out of l
7180: 6f 6f 70 73 20 77 69 74 68 69 6e 20 74 72 69 67  oops within trig
7190: 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 20 53 51  ger programs. SQ
71a0: 4c 69 74 65 20 64 6f 65 73 0a 23 20 6e 6f 74 20  Lite does.# not 
71b0: 66 61 63 74 6f 72 20 63 6f 6e 73 74 61 6e 74 73  factor constants
71c0: 20 6f 75 74 20 6f 66 20 6c 6f 6f 70 73 20 77 69   out of loops wi
71d0: 74 68 69 6e 20 74 72 69 67 67 65 72 20 70 72 6f  thin trigger pro
71e0: 67 72 61 6d 73 20 61 73 20 69 74 20 6d 61 79 20  grams as it may 
71f0: 6f 6e 6c 79 0a 23 20 64 6f 20 73 6f 20 69 6e 20  only.# do so in 
7200: 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62  code generated b
7210: 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  efore the first 
7220: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69  table or index i
7230: 73 20 6f 70 65 6e 65 64 2e 20 41 6e 64 0a 23 20  s opened. And.# 
7240: 62 79 20 74 68 65 20 74 69 6d 65 20 61 20 74 72  by the time a tr
7250: 69 67 67 65 72 20 70 72 6f 67 72 61 6d 20 69 73  igger program is
7260: 20 63 6f 64 65 64 2c 20 61 74 20 6c 65 61 73 74   coded, at least
7270: 20 6f 6e 65 20 74 61 62 6c 65 20 6f 72 20 69 6e   one table or in
7280: 64 65 78 20 68 61 73 0a 23 20 61 6c 77 61 79 73  dex has.# always
7290: 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 23 0a   been opened..#.
72a0: 23 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 2c 20  # At one point, 
72b0: 64 75 65 20 74 6f 20 61 20 62 75 67 20 61 6c 6c  due to a bug all
72c0: 6f 77 69 6e 67 20 63 6f 6e 73 74 61 6e 74 20 66  owing constant f
72d0: 61 63 74 6f 72 69 6e 67 20 77 69 74 68 69 6e 20  actoring within 
72e0: 74 72 69 67 67 65 72 73 2c 0a 23 20 74 68 65 20  triggers,.# the 
72f0: 66 6f 6c 6c 6f 77 69 6e 67 20 53 51 4c 20 77 6f  following SQL wo
7300: 75 6c 64 20 70 72 6f 64 75 63 65 20 74 68 65 20  uld produce the 
7310: 77 72 6f 6e 67 20 72 65 73 75 6c 74 2e 0a 23 0a  wrong result..#.
7320: 73 65 74 20 53 51 4c 20 7b 0a 20 20 43 52 45 41  set SQL {.  CREA
7330: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
7340: 2c 20 63 29 3b 0a 20 20 43 52 45 41 54 45 20 49  , c);.  CREATE I
7350: 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 2c  NDEX i1 ON t1(a,
7360: 20 63 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e   c);.  CREATE IN
7370: 44 45 58 20 69 32 20 4f 4e 20 74 31 28 62 2c 20  DEX i2 ON t1(b, 
7380: 63 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  c);.  INSERT INT
7390: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32  O t1 VALUES(1, 2
73a0: 2c 20 33 29 3b 0a 0a 20 20 43 52 45 41 54 45 20  , 3);..  CREATE 
73b0: 54 41 42 4c 45 20 74 32 28 65 2c 20 66 29 3b 0a  TABLE t2(e, f);.
73c0: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
73d0: 33 20 4f 4e 20 74 32 28 65 29 3b 0a 20 20 49 4e  3 ON t2(e);.  IN
73e0: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
73f0: 55 45 53 28 31 32 33 34 35 36 37 2c 20 33 29 3b  UES(1234567, 3);
7400: 0a 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  ..  CREATE TABLE
7410: 20 65 6d 70 74 79 28 78 29 3b 0a 20 20 43 52 45   empty(x);.  CRE
7420: 41 54 45 20 54 41 42 4c 45 20 6e 6f 74 5f 65 6d  ATE TABLE not_em
7430: 70 74 79 28 78 29 3b 0a 20 20 49 4e 53 45 52 54  pty(x);.  INSERT
7440: 20 49 4e 54 4f 20 6e 6f 74 5f 65 6d 70 74 79 20   INTO not_empty 
7450: 56 41 4c 55 45 53 28 32 29 3b 0a 0a 20 20 43 52  VALUES(2);..  CR
7460: 45 41 54 45 20 54 41 42 4c 45 20 74 34 28 78 29  EATE TABLE t4(x)
7470: 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  ;.  CREATE TABLE
7480: 20 74 35 28 67 2c 20 68 2c 20 69 29 3b 0a 0a 20   t5(g, h, i);.. 
7490: 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20   CREATE TRIGGER 
74a0: 74 72 69 67 20 42 45 46 4f 52 45 20 49 4e 53 45  trig BEFORE INSE
74b0: 52 54 20 4f 4e 20 74 34 20 42 45 47 49 4e 0a 20  RT ON t4 BEGIN. 
74c0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
74d0: 35 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  5 SELECT * FROM 
74e0: 74 31 20 57 48 45 52 45 20 0a 20 20 20 20 20 20  t1 WHERE .      
74f0: 20 20 28 61 20 49 4e 20 28 53 45 4c 45 43 54 20    (a IN (SELECT 
7500: 78 20 46 52 4f 4d 20 65 6d 70 74 79 29 20 4f 52  x FROM empty) OR
7510: 20 62 20 49 4e 20 28 53 45 4c 45 43 54 20 78 20   b IN (SELECT x 
7520: 46 52 4f 4d 20 6e 6f 74 5f 65 6d 70 74 79 29 29  FROM not_empty))
7530: 20 0a 20 20 20 20 20 20 20 20 41 4e 44 20 63 20   .        AND c 
7540: 49 4e 20 28 53 45 4c 45 43 54 20 66 20 46 52 4f  IN (SELECT f FRO
7550: 4d 20 74 32 20 57 48 45 52 45 20 65 3d 31 32 33  M t2 WHERE e=123
7560: 34 35 36 37 29 3b 0a 20 20 45 4e 44 3b 0a 0a 20  4567);.  END;.. 
7570: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20   INSERT INTO t4 
7580: 56 41 4c 55 45 53 28 30 29 3b 0a 20 20 53 45 4c  VALUES(0);.  SEL
7590: 45 43 54 20 2a 20 46 52 4f 4d 20 74 35 3b 0a 7d  ECT * FROM t5;.}
75a0: 0a 0a 72 65 73 65 74 5f 64 62 0a 64 6f 5f 65 78  ..reset_db.do_ex
75b0: 65 63 73 71 6c 5f 74 65 73 74 20 74 72 69 67 67  ecsql_test trigg
75c0: 65 72 43 2d 31 34 2e 31 20 24 53 51 4c 20 7b 31  erC-14.1 $SQL {1
75d0: 20 32 20 33 7d 0a 72 65 73 65 74 5f 64 62 0a 6f   2 3}.reset_db.o
75e0: 70 74 69 6d 69 7a 61 74 69 6f 6e 5f 63 6f 6e 74  ptimization_cont
75f0: 72 6f 6c 20 64 62 20 66 61 63 74 6f 72 2d 63 6f  rol db factor-co
7600: 6e 73 74 61 6e 74 73 20 30 0a 64 6f 5f 65 78 65  nstants 0.do_exe
7610: 63 73 71 6c 5f 74 65 73 74 20 74 72 69 67 67 65  csql_test trigge
7620: 72 43 2d 31 34 2e 32 20 24 53 51 4c 20 7b 31 20  rC-14.2 $SQL {1 
7630: 32 20 33 7d 0a 0a 66 69 6e 69 73 68 5f 74 65 73  2 3}..finish_tes
7640: 74 0a                                            t.