/ Hex Artifact Content
Login

Artifact 811ab569af9e6fc894afbcc0d77d14500b2406c5:


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 50 52 49 4d 41 52 59 20  }.} {1 {PRIMARY 
1260: 4b 45 59 20 6d 75 73 74 20 62 65 20 75 6e 69 71  KEY must be uniq
1270: 75 65 7d 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  ue}}...#--------
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 0a 23 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f  -.# This block o
12d0: 66 20 74 65 73 74 73 2c 20 74 72 69 67 67 65 72  f tests, trigger
12e0: 43 2d 32 2e 2a 2c 20 74 65 73 74 73 20 74 68 61  C-2.*, tests tha
12f0: 74 20 72 65 63 75 72 73 69 76 65 20 74 72 69 67  t recursive trig
1300: 67 65 72 0a 23 20 70 72 6f 67 72 61 6d 73 20 28  ger.# programs (
1310: 74 72 69 67 67 65 72 73 20 74 68 61 74 20 66 69  triggers that fi
1320: 72 65 20 74 68 65 6d 73 65 6c 76 65 73 29 20 77  re themselves) w
1330: 6f 72 6b 2e 20 4d 6f 72 65 20 73 70 65 63 69 66  ork. More specif
1340: 69 63 61 6c 6c 79 2c 0a 23 20 74 68 69 73 20 62  ically,.# this b
1350: 6c 6f 63 6b 20 66 6f 63 75 73 65 73 20 6f 6e 20  lock focuses on 
1360: 72 65 63 75 72 73 69 76 65 20 49 4e 53 45 52 54  recursive INSERT
1370: 20 74 72 69 67 67 65 72 73 2e 0a 23 0a 64 6f 5f   triggers..#.do_
1380: 74 65 73 74 20 74 72 69 67 67 65 72 43 2d 32 2e  test triggerC-2.
1390: 31 2e 30 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.0 {.  execsql 
13a0: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
13b0: 4c 45 20 74 32 28 61 20 50 52 49 4d 41 52 59 20  LE t2(a PRIMARY 
13c0: 4b 45 59 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a  KEY);.  }.} {}..
13d0: 66 6f 72 65 61 63 68 20 7b 6e 20 74 64 65 66 6e  foreach {n tdefn
13e0: 20 72 63 7d 20 7b 0a 20 20 31 20 7b 20 0a 20 20   rc} {.  1 { .  
13f0: 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52    CREATE TRIGGER
1400: 20 74 32 5f 74 72 69 67 20 41 46 54 45 52 20 49   t2_trig AFTER I
1410: 4e 53 45 52 54 20 4f 4e 20 74 32 20 57 48 45 4e  NSERT ON t2 WHEN
1420: 20 28 6e 65 77 2e 61 3e 30 29 20 42 45 47 49 4e   (new.a>0) BEGIN
1430: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
1440: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 6e 65 77  TO t2 VALUES(new
1450: 2e 61 20 2d 20 31 29 3b 0a 20 20 20 20 45 4e 44  .a - 1);.    END
1460: 3b 20 0a 20 20 7d 20 7b 30 20 7b 31 30 20 39 20  ; .  } {0 {10 9 
1470: 38 20 37 20 36 20 35 20 34 20 33 20 32 20 31 20  8 7 6 5 4 3 2 1 
1480: 30 7d 7d 0a 0a 20 20 32 20 7b 0a 20 20 20 20 43  0}}..  2 {.    C
1490: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74 32  REATE TRIGGER t2
14a0: 5f 74 72 69 67 20 41 46 54 45 52 20 49 4e 53 45  _trig AFTER INSE
14b0: 52 54 20 4f 4e 20 74 32 20 42 45 47 49 4e 0a 20  RT ON t2 BEGIN. 
14c0: 20 20 20 20 20 53 45 4c 45 43 54 20 43 41 53 45       SELECT CASE
14d0: 20 57 48 45 4e 20 6e 65 77 2e 61 3d 3d 32 20 54   WHEN new.a==2 T
14e0: 48 45 4e 20 52 41 49 53 45 28 49 47 4e 4f 52 45  HEN RAISE(IGNORE
14f0: 29 20 45 4c 53 45 20 4e 55 4c 4c 20 45 4e 44 3b  ) ELSE NULL END;
1500: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
1510: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 6e 65 77  TO t2 VALUES(new
1520: 2e 61 20 2d 20 31 29 3b 0a 20 20 20 20 45 4e 44  .a - 1);.    END
1530: 3b 0a 20 20 7d 20 7b 30 20 7b 31 30 20 39 20 38  ;.  } {0 {10 9 8
1540: 20 37 20 36 20 35 20 34 20 33 20 32 7d 7d 0a 0a   7 6 5 4 3 2}}..
1550: 20 20 33 20 7b 20 0a 20 20 20 20 43 52 45 41 54    3 { .    CREAT
1560: 45 20 54 52 49 47 47 45 52 20 74 32 5f 74 72 69  E TRIGGER t2_tri
1570: 67 20 42 45 46 4f 52 45 20 49 4e 53 45 52 54 20  g BEFORE INSERT 
1580: 4f 4e 20 74 32 20 57 48 45 4e 20 28 6e 65 77 2e  ON t2 WHEN (new.
1590: 61 3e 30 29 20 42 45 47 49 4e 0a 20 20 20 20 20  a>0) BEGIN.     
15a0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
15b0: 56 41 4c 55 45 53 28 6e 65 77 2e 61 20 2d 20 31  VALUES(new.a - 1
15c0: 29 3b 0a 20 20 20 20 45 4e 44 3b 20 0a 20 20 7d  );.    END; .  }
15d0: 20 7b 30 20 7b 30 20 31 20 32 20 33 20 34 20 35   {0 {0 1 2 3 4 5
15e0: 20 36 20 37 20 38 20 39 20 31 30 7d 7d 0a 0a 20   6 7 8 9 10}}.. 
15f0: 20 34 20 7b 20 0a 20 20 20 20 43 52 45 41 54 45   4 { .    CREATE
1600: 20 54 52 49 47 47 45 52 20 74 32 5f 74 72 69 67   TRIGGER t2_trig
1610: 20 42 45 46 4f 52 45 20 49 4e 53 45 52 54 20 4f   BEFORE INSERT O
1620: 4e 20 74 32 20 42 45 47 49 4e 0a 20 20 20 20 20  N t2 BEGIN.     
1630: 20 53 45 4c 45 43 54 20 43 41 53 45 20 57 48 45   SELECT CASE WHE
1640: 4e 20 6e 65 77 2e 61 3d 3d 32 20 54 48 45 4e 20  N new.a==2 THEN 
1650: 52 41 49 53 45 28 49 47 4e 4f 52 45 29 20 45 4c  RAISE(IGNORE) EL
1660: 53 45 20 4e 55 4c 4c 20 45 4e 44 3b 0a 20 20 20  SE NULL END;.   
1670: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1680: 32 20 56 41 4c 55 45 53 28 6e 65 77 2e 61 20 2d  2 VALUES(new.a -
1690: 20 31 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20   1);.    END;.  
16a0: 7d 20 7b 30 20 7b 33 20 34 20 35 20 36 20 37 20  } {0 {3 4 5 6 7 
16b0: 38 20 39 20 31 30 7d 7d 0a 0a 20 20 35 20 7b 20  8 9 10}}..  5 { 
16c0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47  .    CREATE TRIG
16d0: 47 45 52 20 74 32 5f 74 72 69 67 20 42 45 46 4f  GER t2_trig BEFO
16e0: 52 45 20 49 4e 53 45 52 54 20 4f 4e 20 74 32 20  RE INSERT ON t2 
16f0: 42 45 47 49 4e 0a 20 20 20 20 20 20 49 4e 53 45  BEGIN.      INSE
1700: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
1710: 53 28 6e 65 77 2e 61 20 2d 20 31 29 3b 0a 20 20  S(new.a - 1);.  
1720: 20 20 45 4e 44 3b 0a 20 20 7d 20 7b 31 20 7b 74    END;.  } {1 {t
1730: 6f 6f 20 6d 61 6e 79 20 6c 65 76 65 6c 73 20 6f  oo many levels o
1740: 66 20 74 72 69 67 67 65 72 20 72 65 63 75 72 73  f trigger recurs
1750: 69 6f 6e 7d 7d 0a 0a 20 20 36 20 7b 20 0a 20 20  ion}}..  6 { .  
1760: 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52    CREATE TRIGGER
1770: 20 74 32 5f 74 72 69 67 20 41 46 54 45 52 20 49   t2_trig AFTER I
1780: 4e 53 45 52 54 20 4f 4e 20 74 32 20 57 48 45 4e  NSERT ON t2 WHEN
1790: 20 28 6e 65 77 2e 61 3e 30 29 20 42 45 47 49 4e   (new.a>0) BEGIN
17a0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 4f 52  .      INSERT OR
17b0: 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20 74 32 20   IGNORE INTO t2 
17c0: 56 41 4c 55 45 53 28 6e 65 77 2e 61 29 3b 0a 20  VALUES(new.a);. 
17d0: 20 20 20 45 4e 44 3b 0a 20 20 7d 20 7b 30 20 31     END;.  } {0 1
17e0: 30 7d 0a 0a 20 20 37 20 7b 20 0a 20 20 20 20 43  0}..  7 { .    C
17f0: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74 32  REATE TRIGGER t2
1800: 5f 74 72 69 67 20 42 45 46 4f 52 45 20 49 4e 53  _trig BEFORE INS
1810: 45 52 54 20 4f 4e 20 74 32 20 57 48 45 4e 20 28  ERT ON t2 WHEN (
1820: 6e 65 77 2e 61 3e 30 29 20 42 45 47 49 4e 0a 20  new.a>0) BEGIN. 
1830: 20 20 20 20 20 49 4e 53 45 52 54 20 4f 52 20 49       INSERT OR I
1840: 47 4e 4f 52 45 20 49 4e 54 4f 20 74 32 20 56 41  GNORE INTO t2 VA
1850: 4c 55 45 53 28 6e 65 77 2e 61 29 3b 0a 20 20 20  LUES(new.a);.   
1860: 20 45 4e 44 3b 0a 20 20 7d 20 7b 31 20 7b 74 6f   END;.  } {1 {to
1870: 6f 20 6d 61 6e 79 20 6c 65 76 65 6c 73 20 6f 66  o many levels of
1880: 20 74 72 69 67 67 65 72 20 72 65 63 75 72 73 69   trigger recursi
1890: 6f 6e 7d 7d 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65  on}}.} {.  do_te
18a0: 73 74 20 74 72 69 67 67 65 72 43 2d 32 2e 31 2e  st triggerC-2.1.
18b0: 24 6e 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71  $n {.    catchsq
18c0: 6c 20 7b 20 44 52 4f 50 20 54 52 49 47 47 45 52  l { DROP TRIGGER
18d0: 20 74 32 5f 74 72 69 67 20 7d 0a 20 20 20 20 65   t2_trig }.    e
18e0: 78 65 63 73 71 6c 20 20 7b 20 44 45 4c 45 54 45  xecsql  { DELETE
18f0: 20 46 52 4f 4d 20 74 32 20 7d 0a 20 20 20 20 65   FROM t2 }.    e
1900: 78 65 63 73 71 6c 20 20 24 74 64 65 66 6e 0a 20  xecsql  $tdefn. 
1910: 20 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20     catchsql {.  
1920: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1930: 74 32 20 56 41 4c 55 45 53 28 31 30 29 3b 0a 20  t2 VALUES(10);. 
1940: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
1950: 4f 4d 20 74 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  OM t2;.    }.  }
1960: 20 24 72 63 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20   $rc.}..do_test 
1970: 74 72 69 67 67 65 72 43 2d 32 2e 32 20 7b 0a 20  triggerC-2.2 {. 
1980: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
1990: 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 32 28  REATE TABLE t22(
19a0: 78 29 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20  x);..    CREATE 
19b0: 54 52 49 47 47 45 52 20 74 32 32 61 20 41 46 54  TRIGGER t22a AFT
19c0: 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 74 32 32  ER INSERT ON t22
19d0: 20 42 45 47 49 4e 0a 20 20 20 20 20 20 49 4e 53   BEGIN.      INS
19e0: 45 52 54 20 49 4e 54 4f 20 74 32 32 20 53 45 4c  ERT INTO t22 SEL
19f0: 45 43 54 20 78 20 2b 20 28 53 45 4c 45 43 54 20  ECT x + (SELECT 
1a00: 6d 61 78 28 78 29 20 46 52 4f 4d 20 74 32 32 29  max(x) FROM t22)
1a10: 20 46 52 4f 4d 20 74 32 32 3b 0a 20 20 20 20 45   FROM t22;.    E
1a20: 4e 44 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  ND;.    CREATE T
1a30: 52 49 47 47 45 52 20 74 32 32 62 20 42 45 46 4f  RIGGER t22b BEFO
1a40: 52 45 20 49 4e 53 45 52 54 20 4f 4e 20 74 32 32  RE INSERT ON t22
1a50: 20 42 45 47 49 4e 0a 20 20 20 20 20 20 53 45 4c   BEGIN.      SEL
1a60: 45 43 54 20 43 41 53 45 20 57 48 45 4e 20 28 53  ECT CASE WHEN (S
1a70: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
1a80: 52 4f 4d 20 74 32 32 29 20 3e 3d 20 31 30 30 0a  ROM t22) >= 100.
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa0: 20 20 54 48 45 4e 20 52 41 49 53 45 28 49 47 4e    THEN RAISE(IGN
1ab0: 4f 52 45 29 0a 20 20 20 20 20 20 20 20 20 20 20  ORE).           
1ac0: 20 20 20 20 20 20 20 45 4c 53 45 20 4e 55 4c 4c         ELSE NULL
1ad0: 20 45 4e 44 3b 0a 20 20 20 20 45 4e 44 3b 0a 0a   END;.    END;..
1ae0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1af0: 74 32 32 20 56 41 4c 55 45 53 28 31 29 3b 0a 20  t22 VALUES(1);. 
1b00: 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
1b10: 2a 29 20 46 52 4f 4d 20 74 32 32 3b 0a 20 20 7d  *) FROM t22;.  }
1b20: 0a 7d 20 7b 31 30 30 7d 0a 0a 64 6f 5f 74 65 73  .} {100}..do_tes
1b30: 74 20 74 72 69 67 67 65 72 43 2d 32 2e 33 20 7b  t triggerC-2.3 {
1b40: 0a 20 20 65 78 65 63 73 71 6c 20 22 0a 20 20 20  .  execsql ".   
1b50: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
1b60: 33 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 29  3(x PRIMARY KEY)
1b70: 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54 52  ;..    CREATE TR
1b80: 49 47 47 45 52 20 74 32 33 61 20 41 46 54 45 52  IGGER t23a AFTER
1b90: 20 49 4e 53 45 52 54 20 4f 4e 20 74 32 33 20 42   INSERT ON t23 B
1ba0: 45 47 49 4e 0a 20 20 20 20 20 20 49 4e 53 45 52  EGIN.      INSER
1bb0: 54 20 49 4e 54 4f 20 74 32 33 20 56 41 4c 55 45  T INTO t23 VALUE
1bc0: 53 28 6e 65 77 2e 78 20 2b 20 31 29 3b 0a 20 20  S(new.x + 1);.  
1bd0: 20 20 45 4e 44 3b 0a 0a 20 20 20 20 43 52 45 41    END;..    CREA
1be0: 54 45 20 54 52 49 47 47 45 52 20 74 32 33 62 20  TE TRIGGER t23b 
1bf0: 42 45 46 4f 52 45 20 49 4e 53 45 52 54 20 4f 4e  BEFORE INSERT ON
1c00: 20 74 32 33 20 42 45 47 49 4e 0a 20 20 20 20 20   t23 BEGIN.     
1c10: 20 53 45 4c 45 43 54 20 43 41 53 45 20 57 48 45   SELECT CASE WHE
1c20: 4e 20 6e 65 77 2e 78 3e 5b 65 78 70 72 20 24 53  N new.x>[expr $S
1c30: 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45  QLITE_MAX_TRIGGE
1c40: 52 5f 44 45 50 54 48 20 2f 20 32 5d 0a 20 20 20  R_DEPTH / 2].   
1c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
1c60: 48 45 4e 20 52 41 49 53 45 28 49 47 4e 4f 52 45  HEN RAISE(IGNORE
1c70: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
1c80: 20 20 20 20 45 4c 53 45 20 4e 55 4c 4c 20 45 4e      ELSE NULL EN
1c90: 44 3b 0a 20 20 20 20 45 4e 44 3b 0a 0a 20 20 20  D;.    END;..   
1ca0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 33   INSERT INTO t23
1cb0: 20 56 41 4c 55 45 53 28 31 29 3b 0a 20 20 20 20   VALUES(1);.    
1cc0: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
1cd0: 46 52 4f 4d 20 74 32 33 3b 0a 20 20 22 0a 7d 20  FROM t23;.  ".} 
1ce0: 5b 6c 69 73 74 20 5b 65 78 70 72 20 24 53 51 4c  [list [expr $SQL
1cf0: 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f  ITE_MAX_TRIGGER_
1d00: 44 45 50 54 48 20 2f 20 32 5d 5d 0a 20 0a 0a 23  DEPTH / 2]]. ..#
1d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d50: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 69 73 20 62  -------.# This b
1d60: 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73 2c 20 74  lock of tests, t
1d70: 72 69 67 67 65 72 43 2d 33 2e 2a 2c 20 74 65 73  riggerC-3.*, tes
1d80: 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 74 68  t that SQLite th
1d90: 72 6f 77 73 20 61 6e 20 65 78 63 65 70 74 69 6f  rows an exceptio
1da0: 6e 0a 23 20 77 68 65 6e 20 69 74 20 64 65 74 65  n.# when it dete
1db0: 63 74 73 20 65 78 63 65 73 73 69 76 65 20 72 65  cts excessive re
1dc0: 63 75 72 73 69 6f 6e 2e 0a 23 0a 64 6f 5f 74 65  cursion..#.do_te
1dd0: 73 74 20 74 72 69 67 67 65 72 43 2d 33 2e 31 2e  st triggerC-3.1.
1de0: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
1df0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
1e00: 20 74 33 28 61 2c 20 62 29 3b 0a 20 20 20 20 43   t3(a, b);.    C
1e10: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74 33  REATE TRIGGER t3
1e20: 69 20 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f  i AFTER INSERT O
1e30: 4e 20 74 33 20 42 45 47 49 4e 0a 20 20 20 20 20  N t3 BEGIN.     
1e40: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 33 20   DELETE FROM t3 
1e50: 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20 6e 65  WHERE rowid = ne
1e60: 77 2e 72 6f 77 69 64 3b 0a 20 20 20 20 45 4e 44  w.rowid;.    END
1e70: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49  ;.    CREATE TRI
1e80: 47 47 45 52 20 74 33 64 20 41 46 54 45 52 20 44  GGER t3d AFTER D
1e90: 45 4c 45 54 45 20 4f 4e 20 74 33 20 42 45 47 49  ELETE ON t3 BEGI
1ea0: 4e 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  N.      INSERT I
1eb0: 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 6f 6c  NTO t3 VALUES(ol
1ec0: 64 2e 61 2c 20 6f 6c 64 2e 62 29 3b 0a 20 20 20  d.a, old.b);.   
1ed0: 20 45 4e 44 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64   END;.  }.} {}.d
1ee0: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 43 2d  o_test triggerC-
1ef0: 33 2e 31 2e 32 20 7b 0a 20 20 63 61 74 63 68 73  3.1.2 {.  catchs
1f00: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
1f10: 20 74 33 20 56 41 4c 55 45 53 28 30 2c 30 29 20   t3 VALUES(0,0) 
1f20: 7d 0a 7d 20 7b 31 20 7b 74 6f 6f 20 6d 61 6e 79  }.} {1 {too many
1f30: 20 6c 65 76 65 6c 73 20 6f 66 20 74 72 69 67 67   levels of trigg
1f40: 65 72 20 72 65 63 75 72 73 69 6f 6e 7d 7d 0a 64  er recursion}}.d
1f50: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 43 2d  o_test triggerC-
1f60: 33 2e 31 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  3.1.3 {.  execsq
1f70: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
1f80: 4d 20 74 33 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f  M t3 }.} {}..do_
1f90: 74 65 73 74 20 74 72 69 67 67 65 72 43 2d 33 2e  test triggerC-3.
1fa0: 32 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.1 {.  execsql 
1fb0: 22 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ".    CREATE TAB
1fc0: 4c 45 20 74 33 62 28 78 29 3b 0a 20 20 20 20 43  LE t3b(x);.    C
1fd0: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74 33  REATE TRIGGER t3
1fe0: 62 69 20 41 46 54 45 52 20 49 4e 53 45 52 54 20  bi AFTER INSERT 
1ff0: 4f 4e 20 74 33 62 20 57 48 45 4e 20 6e 65 77 2e  ON t3b WHEN new.
2000: 78 3c 5b 65 78 70 72 20 24 53 51 4c 49 54 45 5f  x<[expr $SQLITE_
2010: 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MAX_TRIGGER_DEPT
2020: 48 20 2a 20 32 5d 20 42 45 47 49 4e 0a 20 20 20  H * 2] BEGIN.   
2030: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2040: 33 62 20 56 41 4c 55 45 53 28 6e 65 77 2e 78 2b  3b VALUES(new.x+
2050: 31 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 22  1);.    END;.  "
2060: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .  catchsql {.  
2070: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
2080: 62 20 56 41 4c 55 45 53 28 31 29 3b 0a 20 20 7d  b VALUES(1);.  }
2090: 0a 7d 20 7b 31 20 7b 74 6f 6f 20 6d 61 6e 79 20  .} {1 {too many 
20a0: 6c 65 76 65 6c 73 20 6f 66 20 74 72 69 67 67 65  levels of trigge
20b0: 72 20 72 65 63 75 72 73 69 6f 6e 7d 7d 0a 64 6f  r recursion}}.do
20c0: 5f 74 65 73 74 20 74 72 69 67 67 65 72 43 2d 33  _test triggerC-3
20d0: 2e 32 2e 32 20 7b 0a 20 20 64 62 20 65 76 61 6c  .2.2 {.  db eval
20e0: 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   {SELECT * FROM 
20f0: 74 33 62 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65  t3b}.} {}..do_te
2100: 73 74 20 74 72 69 67 67 65 72 43 2d 33 2e 33 2e  st triggerC-3.3.
2110: 31 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 22  1 {.  catchsql "
2120: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
2130: 20 74 33 62 20 56 41 4c 55 45 53 28 5b 65 78 70   t3b VALUES([exp
2140: 72 20 24 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52  r $SQLITE_MAX_TR
2150: 49 47 47 45 52 5f 44 45 50 54 48 20 2b 20 31 5d  IGGER_DEPTH + 1]
2160: 29 3b 0a 20 20 22 0a 7d 20 7b 30 20 7b 7d 7d 0a  );.  ".} {0 {}}.
2170: 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 43  do_test triggerC
2180: 2d 33 2e 33 2e 32 20 7b 0a 20 20 64 62 20 65 76  -3.3.2 {.  db ev
2190: 61 6c 20 7b 53 45 4c 45 43 54 20 63 6f 75 6e 74  al {SELECT count
21a0: 28 2a 29 2c 20 6d 61 78 28 78 29 2c 20 6d 69 6e  (*), max(x), min
21b0: 28 78 29 20 46 52 4f 4d 20 74 33 62 7d 0a 7d 20  (x) FROM t3b}.} 
21c0: 5b 6c 69 73 74 20 24 53 51 4c 49 54 45 5f 4d 41  [list $SQLITE_MA
21d0: 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20  X_TRIGGER_DEPTH 
21e0: 5b 65 78 70 72 20 24 53 51 4c 49 54 45 5f 4d 41  [expr $SQLITE_MA
21f0: 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20  X_TRIGGER_DEPTH 
2200: 2a 20 32 5d 20 5b 65 78 70 72 20 24 53 51 4c 49  * 2] [expr $SQLI
2210: 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44  TE_MAX_TRIGGER_D
2220: 45 50 54 48 20 2b 20 31 5d 5d 0a 0a 64 6f 5f 74  EPTH + 1]]..do_t
2230: 65 73 74 20 74 72 69 67 67 65 72 43 2d 33 2e 34  est triggerC-3.4
2240: 2e 31 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .1 {.  catchsql 
2250: 22 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  ".    DELETE FRO
2260: 4d 20 74 33 62 3b 0a 20 20 20 20 49 4e 53 45 52  M t3b;.    INSER
2270: 54 20 49 4e 54 4f 20 74 33 62 20 56 41 4c 55 45  T INTO t3b VALUE
2280: 53 28 5b 65 78 70 72 20 24 53 51 4c 49 54 45 5f  S([expr $SQLITE_
2290: 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MAX_TRIGGER_DEPT
22a0: 48 20 2d 20 31 5d 29 3b 0a 20 20 22 0a 7d 20 7b  H - 1]);.  ".} {
22b0: 31 20 7b 74 6f 6f 20 6d 61 6e 79 20 6c 65 76 65  1 {too many leve
22c0: 6c 73 20 6f 66 20 74 72 69 67 67 65 72 20 72 65  ls of trigger re
22d0: 63 75 72 73 69 6f 6e 7d 7d 0a 64 6f 5f 74 65 73  cursion}}.do_tes
22e0: 74 20 74 72 69 67 67 65 72 43 2d 33 2e 34 2e 32  t triggerC-3.4.2
22f0: 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b 53 45   {.  db eval {SE
2300: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 2c 20 6d  LECT count(*), m
2310: 61 78 28 78 29 2c 20 6d 69 6e 28 78 29 20 46 52  ax(x), min(x) FR
2320: 4f 4d 20 74 33 62 7d 0a 7d 20 7b 30 20 7b 7d 20  OM t3b}.} {0 {} 
2330: 7b 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20 74 72 69  {}}..do_test tri
2340: 67 67 65 72 43 2d 33 2e 35 2e 31 20 7b 0a 20 20  ggerC-3.5.1 {.  
2350: 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 20 64 62  sqlite3_limit db
2360: 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52   SQLITE_LIMIT_TR
2370: 49 47 47 45 52 5f 44 45 50 54 48 20 20 5b 65 78  IGGER_DEPTH  [ex
2380: 70 72 20 24 53 51 4c 49 54 45 5f 4d 41 58 5f 54  pr $SQLITE_MAX_T
2390: 52 49 47 47 45 52 5f 44 45 50 54 48 20 2f 20 31  RIGGER_DEPTH / 1
23a0: 30 5d 0a 20 20 63 61 74 63 68 73 71 6c 20 22 0a  0].  catchsql ".
23b0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
23c0: 74 33 62 20 56 41 4c 55 45 53 28 5b 65 78 70 72  t3b VALUES([expr
23d0: 20 28 24 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52   ($SQLITE_MAX_TR
23e0: 49 47 47 45 52 5f 44 45 50 54 48 20 2a 20 32 29  IGGER_DEPTH * 2)
23f0: 20 2d 20 28 24 53 51 4c 49 54 45 5f 4d 41 58 5f   - ($SQLITE_MAX_
2400: 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 2f 20  TRIGGER_DEPTH / 
2410: 31 30 29 20 2b 20 31 5d 29 3b 0a 20 20 22 0a 7d  10) + 1]);.  ".}
2420: 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20   {0 {}}.do_test 
2430: 74 72 69 67 67 65 72 43 2d 33 2e 35 2e 32 20 7b  triggerC-3.5.2 {
2440: 0a 20 20 64 62 20 65 76 61 6c 20 7b 53 45 4c 45  .  db eval {SELE
2450: 43 54 20 63 6f 75 6e 74 28 2a 29 2c 20 6d 61 78  CT count(*), max
2460: 28 78 29 2c 20 6d 69 6e 28 78 29 20 46 52 4f 4d  (x), min(x) FROM
2470: 20 74 33 62 7d 0a 7d 20 5b 6c 69 73 74 20 5b 65   t3b}.} [list [e
2480: 78 70 72 20 24 53 51 4c 49 54 45 5f 4d 41 58 5f  xpr $SQLITE_MAX_
2490: 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 2f 20  TRIGGER_DEPTH / 
24a0: 31 30 5d 20 5b 65 78 70 72 20 24 53 51 4c 49 54  10] [expr $SQLIT
24b0: 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45  E_MAX_TRIGGER_DE
24c0: 50 54 48 20 2a 20 32 5d 20 5b 65 78 70 72 20 28  PTH * 2] [expr (
24d0: 24 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47  $SQLITE_MAX_TRIG
24e0: 47 45 52 5f 44 45 50 54 48 20 2a 20 32 29 20 2d  GER_DEPTH * 2) -
24f0: 20 28 24 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52   ($SQLITE_MAX_TR
2500: 49 47 47 45 52 5f 44 45 50 54 48 20 2f 20 31 30  IGGER_DEPTH / 10
2510: 29 20 2b 20 31 5d 5d 0a 0a 64 6f 5f 74 65 73 74  ) + 1]]..do_test
2520: 20 74 72 69 67 67 65 72 43 2d 33 2e 35 2e 33 20   triggerC-3.5.3 
2530: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 22 0a 20  {.  catchsql ". 
2540: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
2550: 33 62 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  3b;.    INSERT I
2560: 4e 54 4f 20 74 33 62 20 56 41 4c 55 45 53 28 5b  NTO t3b VALUES([
2570: 65 78 70 72 20 28 24 53 51 4c 49 54 45 5f 4d 41  expr ($SQLITE_MA
2580: 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20  X_TRIGGER_DEPTH 
2590: 2a 20 32 29 20 2d 20 28 24 53 51 4c 49 54 45 5f  * 2) - ($SQLITE_
25a0: 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MAX_TRIGGER_DEPT
25b0: 48 20 2f 20 31 30 29 5d 29 3b 0a 20 20 22 0a 7d  H / 10)]);.  ".}
25c0: 20 7b 31 20 7b 74 6f 6f 20 6d 61 6e 79 20 6c 65   {1 {too many le
25d0: 76 65 6c 73 20 6f 66 20 74 72 69 67 67 65 72 20  vels of trigger 
25e0: 72 65 63 75 72 73 69 6f 6e 7d 7d 0a 64 6f 5f 74  recursion}}.do_t
25f0: 65 73 74 20 74 72 69 67 67 65 72 43 2d 33 2e 35  est triggerC-3.5
2600: 2e 34 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b  .4 {.  db eval {
2610: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 2c  SELECT count(*),
2620: 20 6d 61 78 28 78 29 2c 20 6d 69 6e 28 78 29 20   max(x), min(x) 
2630: 46 52 4f 4d 20 74 33 62 7d 0a 7d 20 7b 30 20 7b  FROM t3b}.} {0 {
2640: 7d 20 7b 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20 74  } {}}..do_test t
2650: 72 69 67 67 65 72 43 2d 33 2e 36 2e 31 20 7b 0a  riggerC-3.6.1 {.
2660: 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 20    sqlite3_limit 
2670: 64 62 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  db SQLITE_LIMIT_
2680: 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 31 0a  TRIGGER_DEPTH 1.
2690: 20 20 63 61 74 63 68 73 71 6c 20 22 0a 20 20 20    catchsql ".   
26a0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 62   INSERT INTO t3b
26b0: 20 56 41 4c 55 45 53 28 5b 65 78 70 72 20 24 53   VALUES([expr $S
26c0: 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45  QLITE_MAX_TRIGGE
26d0: 52 5f 44 45 50 54 48 20 2a 20 32 5d 29 3b 0a 20  R_DEPTH * 2]);. 
26e0: 20 22 0a 7d 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 74   ".} {0 {}}.do_t
26f0: 65 73 74 20 74 72 69 67 67 65 72 43 2d 33 2e 36  est triggerC-3.6
2700: 2e 32 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b  .2 {.  db eval {
2710: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 2c  SELECT count(*),
2720: 20 6d 61 78 28 78 29 2c 20 6d 69 6e 28 78 29 20   max(x), min(x) 
2730: 46 52 4f 4d 20 74 33 62 7d 0a 7d 20 5b 6c 69 73  FROM t3b}.} [lis
2740: 74 20 31 20 5b 65 78 70 72 20 24 53 51 4c 49 54  t 1 [expr $SQLIT
2750: 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45  E_MAX_TRIGGER_DE
2760: 50 54 48 20 2a 20 32 5d 20 5b 65 78 70 72 20 24  PTH * 2] [expr $
2770: 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47  SQLITE_MAX_TRIGG
2780: 45 52 5f 44 45 50 54 48 20 2a 20 32 5d 5d 0a 0a  ER_DEPTH * 2]]..
2790: 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 43  do_test triggerC
27a0: 2d 33 2e 36 2e 33 20 7b 0a 20 20 63 61 74 63 68  -3.6.3 {.  catch
27b0: 73 71 6c 20 22 0a 20 20 20 20 44 45 4c 45 54 45  sql ".    DELETE
27c0: 20 46 52 4f 4d 20 74 33 62 3b 0a 20 20 20 20 49   FROM t3b;.    I
27d0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 62 20 56  NSERT INTO t3b V
27e0: 41 4c 55 45 53 28 5b 65 78 70 72 20 28 24 53 51  ALUES([expr ($SQ
27f0: 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52  LITE_MAX_TRIGGER
2800: 5f 44 45 50 54 48 20 2a 20 32 29 20 2d 20 31 5d  _DEPTH * 2) - 1]
2810: 29 3b 0a 20 20 22 0a 7d 20 7b 31 20 7b 74 6f 6f  );.  ".} {1 {too
2820: 20 6d 61 6e 79 20 6c 65 76 65 6c 73 20 6f 66 20   many levels of 
2830: 74 72 69 67 67 65 72 20 72 65 63 75 72 73 69 6f  trigger recursio
2840: 6e 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67  n}}.do_test trig
2850: 67 65 72 43 2d 33 2e 36 2e 34 20 7b 0a 20 20 64  gerC-3.6.4 {.  d
2860: 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 63  b eval {SELECT c
2870: 6f 75 6e 74 28 2a 29 2c 20 6d 61 78 28 78 29 2c  ount(*), max(x),
2880: 20 6d 69 6e 28 78 29 20 46 52 4f 4d 20 74 33 62   min(x) FROM t3b
2890: 7d 0a 7d 20 7b 30 20 7b 7d 20 7b 7d 7d 0a 73 71  }.} {0 {} {}}.sq
28a0: 6c 69 74 65 33 5f 6c 69 6d 69 74 20 64 62 20 53  lite3_limit db S
28b0: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47  QLITE_LIMIT_TRIG
28c0: 47 45 52 5f 44 45 50 54 48 20 24 53 51 4c 49 54  GER_DEPTH $SQLIT
28d0: 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45  E_MAX_TRIGGER_DE
28e0: 50 54 48 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  PTH...#---------
28f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
2930: 20 54 68 69 73 20 6e 65 78 74 20 62 6c 6f 63 6b   This next block
2940: 20 6f 66 20 74 65 73 74 73 2c 20 74 72 69 67 67   of tests, trigg
2950: 65 72 43 2d 34 2e 2a 2c 20 63 68 65 63 6b 73 20  erC-4.*, checks 
2960: 74 68 61 74 20 61 66 66 69 6e 69 74 79 20 0a 23  that affinity .#
2970: 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 73   transformations
2980: 20 61 6e 64 20 63 6f 6e 73 74 72 61 69 6e 74 20   and constraint 
2990: 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20 70 65  processing is pe
29a0: 72 66 6f 72 6d 65 64 20 61 74 20 74 68 65 20 63  rformed at the c
29b0: 6f 72 72 65 63 74 20 0a 23 20 74 69 6d 65 73 20  orrect .# times 
29c0: 72 65 6c 61 74 69 76 65 20 74 6f 20 42 45 46 4f  relative to BEFO
29d0: 52 45 20 61 6e 64 20 41 46 54 45 52 20 74 72 69  RE and AFTER tri
29e0: 67 67 65 72 73 2e 0a 23 0a 23 20 46 6f 72 20 61  ggers..#.# For a
29f0: 6e 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65  n INSERT stateme
2a00: 6e 74 2c 20 66 6f 72 20 65 61 63 68 20 72 6f 77  nt, for each row
2a10: 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 3a   to be inserted:
2a20: 0a 23 0a 23 20 20 20 31 2e 20 41 70 70 6c 79 20  .#.#   1. Apply 
2a30: 61 66 66 69 6e 69 74 69 65 73 20 74 6f 20 6e 6f  affinities to no
2a40: 6e 2d 72 6f 77 69 64 20 76 61 6c 75 65 73 20 74  n-rowid values t
2a50: 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 23  o be inserted..#
2a60: 20 20 20 32 2e 20 46 69 72 65 20 42 45 46 4f 52     2. Fire BEFOR
2a70: 45 20 74 72 69 67 67 65 72 73 2e 0a 23 20 20 20  E triggers..#   
2a80: 33 2e 20 50 72 6f 63 65 73 73 20 63 6f 6e 73 74  3. Process const
2a90: 72 61 69 6e 74 73 2e 0a 23 20 20 20 34 2e 20 49  raints..#   4. I
2aa0: 6e 73 65 72 74 20 6e 65 77 20 72 65 63 6f 72 64  nsert new record
2ab0: 2e 0a 23 20 20 20 35 2e 20 46 69 72 65 20 41 46  ..#   5. Fire AF
2ac0: 54 45 52 20 74 72 69 67 67 65 72 73 2e 0a 23 0a  TER triggers..#.
2ad0: 23 20 49 66 20 74 68 65 20 76 61 6c 75 65 20 6f  # If the value o
2ae0: 66 20 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c  f the rowid fiel
2af0: 64 20 69 73 20 74 6f 20 62 65 20 61 75 74 6f 6d  d is to be autom
2b00: 61 74 69 63 61 6c 6c 79 20 61 73 73 69 67 6e 65  atically assigne
2b10: 64 2c 20 69 74 20 69 73 0a 23 20 73 65 74 20 74  d, it is.# set t
2b20: 6f 20 2d 31 20 69 6e 20 74 68 65 20 6e 65 77 2e  o -1 in the new.
2b30: 2a 20 72 65 63 6f 72 64 2e 20 45 76 65 6e 20 69  * record. Even i
2b40: 66 20 69 74 20 69 73 20 65 78 70 6c 69 63 69 74  f it is explicit
2b50: 6c 79 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 23  ly set to NULL.#
2b60: 20 62 79 20 74 68 65 20 49 4e 53 45 52 54 20 73   by the INSERT s
2b70: 74 61 74 65 6d 65 6e 74 2e 0a 23 0a 23 20 46 6f  tatement..#.# Fo
2b80: 72 20 61 6e 20 55 50 44 41 54 45 20 73 74 61 74  r an UPDATE stat
2b90: 65 6d 65 6e 74 2c 20 66 6f 72 20 65 61 63 68 20  ement, for each 
2ba0: 72 6f 77 20 74 6f 20 62 65 20 64 65 6c 65 74 65  row to be delete
2bb0: 64 3a 0a 23 0a 23 20 20 20 31 2e 20 41 70 70 6c  d:.#.#   1. Appl
2bc0: 79 20 61 66 66 69 6e 69 74 69 65 73 20 74 6f 20  y affinities to 
2bd0: 6e 6f 6e 2d 72 6f 77 69 64 20 76 61 6c 75 65 73  non-rowid values
2be0: 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e   to be inserted.
2bf0: 0a 23 20 20 20 32 2e 20 46 69 72 65 20 42 45 46  .#   2. Fire BEF
2c00: 4f 52 45 20 74 72 69 67 67 65 72 73 2e 0a 23 20  ORE triggers..# 
2c10: 20 20 33 2e 20 50 72 6f 63 65 73 73 20 63 6f 6e    3. Process con
2c20: 73 74 72 61 69 6e 74 73 2e 0a 23 20 20 20 34 2e  straints..#   4.
2c30: 20 49 6e 73 65 72 74 20 6e 65 77 20 72 65 63 6f   Insert new reco
2c40: 72 64 2e 0a 23 20 20 20 35 2e 20 46 69 72 65 20  rd..#   5. Fire 
2c50: 41 46 54 45 52 20 74 72 69 67 67 65 72 73 2e 0a  AFTER triggers..
2c60: 23 0a 23 20 46 6f 72 20 61 20 44 45 4c 45 54 45  #.# For a DELETE
2c70: 20 73 74 61 74 65 6d 65 6e 74 2c 20 66 6f 72 20   statement, for 
2c80: 65 61 63 68 20 72 6f 77 20 74 6f 20 62 65 20 64  each row to be d
2c90: 65 6c 65 74 65 64 3a 0a 23 0a 23 20 20 20 31 2e  eleted:.#.#   1.
2ca0: 20 46 69 72 65 20 42 45 46 4f 52 45 20 74 72 69   Fire BEFORE tri
2cb0: 67 67 65 72 73 2e 0a 23 20 20 20 32 2e 20 52 65  ggers..#   2. Re
2cc0: 6d 6f 76 65 20 64 61 74 61 62 61 73 65 20 72 65  move database re
2cd0: 63 6f 72 64 2e 0a 23 20 20 20 33 2e 20 46 69 72  cord..#   3. Fir
2ce0: 65 20 41 46 54 45 52 20 74 72 69 67 67 65 72 73  e AFTER triggers
2cf0: 2e 0a 23 0a 23 20 57 68 65 6e 20 61 20 6e 75 6d  ..#.# When a num
2d00: 65 72 69 63 20 76 61 6c 75 65 20 74 68 61 74 20  eric value that 
2d10: 61 73 20 61 6e 20 65 78 61 63 74 20 69 6e 74 65  as an exact inte
2d20: 67 65 72 20 72 65 70 72 65 73 65 6e 74 61 74 69  ger representati
2d30: 6f 6e 20 69 73 20 73 74 6f 72 65 64 0a 23 20 69  on is stored.# i
2d40: 6e 20 61 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20  n a column with 
2d50: 52 45 41 4c 20 61 66 66 69 6e 69 74 79 2c 20 69  REAL affinity, i
2d60: 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20 73 74  t is actually st
2d70: 6f 72 65 64 20 61 73 20 61 6e 20 69 6e 74 65 67  ored as an integ
2d80: 65 72 2e 0a 23 20 54 68 65 73 65 20 74 65 73 74  er..# These test
2d90: 73 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  s check that the
2da0: 20 74 79 70 65 6f 66 28 29 20 73 75 63 68 20 76   typeof() such v
2db0: 61 6c 75 65 73 20 69 73 20 61 6c 77 61 79 73 20  alues is always 
2dc0: 27 72 65 61 6c 27 2c 0a 23 20 6e 6f 74 20 27 69  'real',.# not 'i
2dd0: 6e 74 65 67 65 72 27 2e 0a 23 0a 23 20 74 72 69  nteger'..#.# tri
2de0: 67 67 65 72 43 2d 34 2e 31 2e 2a 3a 20 43 68 65  ggerC-4.1.*: Che
2df0: 63 6b 20 74 68 61 74 20 61 66 66 69 6e 69 74 79  ck that affinity
2e00: 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 73   transformations
2e10: 20 61 72 65 20 6d 61 64 65 20 62 65 66 6f 72 65   are made before
2e20: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
2e30: 20 20 20 74 72 69 67 67 65 72 73 20 61 72 65 20     triggers are 
2e40: 69 6e 76 6f 6b 65 64 2e 0a 23 0a 64 6f 5f 74 65  invoked..#.do_te
2e50: 73 74 20 74 72 69 67 67 65 72 43 2d 34 2e 31 2e  st triggerC-4.1.
2e60: 31 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  1 {.  catchsql {
2e70: 20 44 52 4f 50 20 54 41 42 4c 45 20 6c 6f 67 20   DROP TABLE log 
2e80: 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 44  }.  catchsql { D
2e90: 52 4f 50 20 54 41 42 4c 45 20 74 34 20 7d 0a 20  ROP TABLE t4 }. 
2ea0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
2eb0: 52 45 41 54 45 20 54 41 42 4c 45 20 6c 6f 67 28  REATE TABLE log(
2ec0: 74 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  t);.    CREATE T
2ed0: 41 42 4c 45 20 74 34 28 61 20 54 45 58 54 2c 62  ABLE t4(a TEXT,b
2ee0: 20 49 4e 54 45 47 45 52 2c 63 20 52 45 41 4c 29   INTEGER,c REAL)
2ef0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49  ;.    CREATE TRI
2f00: 47 47 45 52 20 74 34 62 69 20 42 45 46 4f 52 45  GGER t4bi BEFORE
2f10: 20 49 4e 53 45 52 54 20 4f 4e 20 74 34 20 42 45   INSERT ON t4 BE
2f20: 47 49 4e 0a 20 20 20 20 20 20 49 4e 53 45 52 54  GIN.      INSERT
2f30: 20 49 4e 54 4f 20 6c 6f 67 20 56 41 4c 55 45 53   INTO log VALUES
2f40: 28 6e 65 77 2e 72 6f 77 69 64 20 7c 7c 20 27 20  (new.rowid || ' 
2f50: 27 20 7c 7c 20 74 79 70 65 6f 66 28 6e 65 77 2e  ' || typeof(new.
2f60: 72 6f 77 69 64 29 20 7c 7c 20 27 20 27 20 7c 7c  rowid) || ' ' ||
2f70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65                ne
2f90: 77 2e 61 20 20 20 20 20 7c 7c 20 27 20 27 20 7c  w.a     || ' ' |
2fa0: 7c 20 74 79 70 65 6f 66 28 6e 65 77 2e 61 29 20  | typeof(new.a) 
2fb0: 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c 0a 20 20      || ' ' ||.  
2fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fd0: 20 20 20 20 20 20 20 20 20 20 20 6e 65 77 2e 62             new.b
2fe0: 20 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c 20 74       || ' ' || t
2ff0: 79 70 65 6f 66 28 6e 65 77 2e 62 29 20 20 20 20  ypeof(new.b)    
3000: 20 7c 7c 20 27 20 27 20 7c 7c 0a 20 20 20 20 20   || ' ' ||.     
3010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3020: 20 20 20 20 20 20 20 20 6e 65 77 2e 63 20 20 20          new.c   
3030: 20 20 7c 7c 20 27 20 27 20 7c 7c 20 74 79 70 65    || ' ' || type
3040: 6f 66 28 6e 65 77 2e 63 29 0a 20 20 20 20 20 20  of(new.c).      
3050: 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 20 20  );.    END;.    
3060: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74  CREATE TRIGGER t
3070: 34 61 69 20 41 46 54 45 52 20 49 4e 53 45 52 54  4ai AFTER INSERT
3080: 20 4f 4e 20 74 34 20 42 45 47 49 4e 0a 20 20 20   ON t4 BEGIN.   
3090: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c     INSERT INTO l
30a0: 6f 67 20 56 41 4c 55 45 53 28 6e 65 77 2e 72 6f  og VALUES(new.ro
30b0: 77 69 64 20 7c 7c 20 27 20 27 20 7c 7c 20 74 79  wid || ' ' || ty
30c0: 70 65 6f 66 28 6e 65 77 2e 72 6f 77 69 64 29 20  peof(new.rowid) 
30d0: 7c 7c 20 27 20 27 20 7c 7c 0a 20 20 20 20 20 20  || ' ' ||.      
30e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30f0: 20 20 20 20 20 20 20 6e 65 77 2e 61 20 20 20 20         new.a    
3100: 20 7c 7c 20 27 20 27 20 7c 7c 20 74 79 70 65 6f   || ' ' || typeo
3110: 66 28 6e 65 77 2e 61 29 20 20 20 20 20 7c 7c 20  f(new.a)     || 
3120: 27 20 27 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ' ' ||.         
3130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3140: 20 20 20 20 6e 65 77 2e 62 20 20 20 20 20 7c 7c      new.b     ||
3150: 20 27 20 27 20 7c 7c 20 74 79 70 65 6f 66 28 6e   ' ' || typeof(n
3160: 65 77 2e 62 29 20 20 20 20 20 7c 7c 20 27 20 27  ew.b)     || ' '
3170: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ||.            
3180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3190: 20 6e 65 77 2e 63 20 20 20 20 20 7c 7c 20 27 20   new.c     || ' 
31a0: 27 20 7c 7c 20 74 79 70 65 6f 66 28 6e 65 77 2e  ' || typeof(new.
31b0: 63 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  c).      );.    
31c0: 45 4e 44 3b 0a 20 20 20 20 43 52 45 41 54 45 20  END;.    CREATE 
31d0: 54 52 49 47 47 45 52 20 74 34 62 64 20 42 45 46  TRIGGER t4bd BEF
31e0: 4f 52 45 20 44 45 4c 45 54 45 20 4f 4e 20 74 34  ORE DELETE ON t4
31f0: 20 42 45 47 49 4e 0a 20 20 20 20 20 20 49 4e 53   BEGIN.      INS
3200: 45 52 54 20 49 4e 54 4f 20 6c 6f 67 20 56 41 4c  ERT INTO log VAL
3210: 55 45 53 28 6f 6c 64 2e 72 6f 77 69 64 20 7c 7c  UES(old.rowid ||
3220: 20 27 20 27 20 7c 7c 20 74 79 70 65 6f 66 28 6f   ' ' || typeof(o
3230: 6c 64 2e 72 6f 77 69 64 29 20 7c 7c 20 27 20 27  ld.rowid) || ' '
3240: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ||.            
3250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3260: 20 6f 6c 64 2e 61 20 20 20 20 20 7c 7c 20 27 20   old.a     || ' 
3270: 27 20 7c 7c 20 74 79 70 65 6f 66 28 6f 6c 64 2e  ' || typeof(old.
3280: 61 29 20 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c  a)     || ' ' ||
3290: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 6c                ol
32b0: 64 2e 62 20 20 20 20 20 7c 7c 20 27 20 27 20 7c  d.b     || ' ' |
32c0: 7c 20 74 79 70 65 6f 66 28 6f 6c 64 2e 62 29 20  | typeof(old.b) 
32d0: 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c 0a 20 20      || ' ' ||.  
32e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32f0: 20 20 20 20 20 20 20 20 20 20 20 6f 6c 64 2e 63             old.c
3300: 20 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c 20 74       || ' ' || t
3310: 79 70 65 6f 66 28 6f 6c 64 2e 63 29 0a 20 20 20  ypeof(old.c).   
3320: 20 20 20 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20     );.    END;. 
3330: 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45     CREATE TRIGGE
3340: 52 20 74 34 61 64 20 41 46 54 45 52 20 44 45 4c  R t4ad AFTER DEL
3350: 45 54 45 20 4f 4e 20 74 34 20 42 45 47 49 4e 0a  ETE ON t4 BEGIN.
3360: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
3370: 4f 20 6c 6f 67 20 56 41 4c 55 45 53 28 6f 6c 64  O log VALUES(old
3380: 2e 72 6f 77 69 64 20 7c 7c 20 27 20 27 20 7c 7c  .rowid || ' ' ||
3390: 20 74 79 70 65 6f 66 28 6f 6c 64 2e 72 6f 77 69   typeof(old.rowi
33a0: 64 29 20 7c 7c 20 27 20 27 20 7c 7c 0a 20 20 20  d) || ' ' ||.   
33b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33c0: 20 20 20 20 20 20 20 20 20 20 6f 6c 64 2e 61 20            old.a 
33d0: 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c 20 74 79      || ' ' || ty
33e0: 70 65 6f 66 28 6f 6c 64 2e 61 29 20 20 20 20 20  peof(old.a)     
33f0: 7c 7c 20 27 20 27 20 7c 7c 0a 20 20 20 20 20 20  || ' ' ||.      
3400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3410: 20 20 20 20 20 20 20 6f 6c 64 2e 62 20 20 20 20         old.b    
3420: 20 7c 7c 20 27 20 27 20 7c 7c 20 74 79 70 65 6f   || ' ' || typeo
3430: 66 28 6f 6c 64 2e 62 29 20 20 20 20 20 7c 7c 20  f(old.b)     || 
3440: 27 20 27 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ' ' ||.         
3450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3460: 20 20 20 20 6f 6c 64 2e 63 20 20 20 20 20 7c 7c      old.c     ||
3470: 20 27 20 27 20 7c 7c 20 74 79 70 65 6f 66 28 6f   ' ' || typeof(o
3480: 6c 64 2e 63 29 0a 20 20 20 20 20 20 29 3b 0a 20  ld.c).      );. 
3490: 20 20 20 45 4e 44 3b 0a 20 20 20 20 43 52 45 41     END;.    CREA
34a0: 54 45 20 54 52 49 47 47 45 52 20 74 34 62 75 20  TE TRIGGER t4bu 
34b0: 42 45 46 4f 52 45 20 55 50 44 41 54 45 20 4f 4e  BEFORE UPDATE ON
34c0: 20 74 34 20 42 45 47 49 4e 0a 20 20 20 20 20 20   t4 BEGIN.      
34d0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c 6f 67 20  INSERT INTO log 
34e0: 56 41 4c 55 45 53 28 6f 6c 64 2e 72 6f 77 69 64  VALUES(old.rowid
34f0: 20 7c 7c 20 27 20 27 20 7c 7c 20 74 79 70 65 6f   || ' ' || typeo
3500: 66 28 6f 6c 64 2e 72 6f 77 69 64 29 20 7c 7c 20  f(old.rowid) || 
3510: 27 20 27 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ' ' ||.         
3520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3530: 20 20 20 20 6f 6c 64 2e 61 20 20 20 20 20 7c 7c      old.a     ||
3540: 20 27 20 27 20 7c 7c 20 74 79 70 65 6f 66 28 6f   ' ' || typeof(o
3550: 6c 64 2e 61 29 20 20 20 20 20 7c 7c 20 27 20 27  ld.a)     || ' '
3560: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20   ||.            
3570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3580: 20 6f 6c 64 2e 62 20 20 20 20 20 7c 7c 20 27 20   old.b     || ' 
3590: 27 20 7c 7c 20 74 79 70 65 6f 66 28 6f 6c 64 2e  ' || typeof(old.
35a0: 62 29 20 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c  b)     || ' ' ||
35b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
35c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 6c                ol
35d0: 64 2e 63 20 20 20 20 20 7c 7c 20 27 20 27 20 7c  d.c     || ' ' |
35e0: 7c 20 74 79 70 65 6f 66 28 6f 6c 64 2e 63 29 0a  | typeof(old.c).
35f0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 49        );.      I
3600: 4e 53 45 52 54 20 49 4e 54 4f 20 6c 6f 67 20 56  NSERT INTO log V
3610: 41 4c 55 45 53 28 6e 65 77 2e 72 6f 77 69 64 20  ALUES(new.rowid 
3620: 7c 7c 20 27 20 27 20 7c 7c 20 74 79 70 65 6f 66  || ' ' || typeof
3630: 28 6e 65 77 2e 72 6f 77 69 64 29 20 7c 7c 20 27  (new.rowid) || '
3640: 20 27 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20   ' ||.          
3650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3660: 20 20 20 6e 65 77 2e 61 20 20 20 20 20 7c 7c 20     new.a     || 
3670: 27 20 27 20 7c 7c 20 74 79 70 65 6f 66 28 6e 65  ' ' || typeof(ne
3680: 77 2e 61 29 20 20 20 20 20 7c 7c 20 27 20 27 20  w.a)     || ' ' 
3690: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ||.             
36a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36b0: 6e 65 77 2e 62 20 20 20 20 20 7c 7c 20 27 20 27  new.b     || ' '
36c0: 20 7c 7c 20 74 79 70 65 6f 66 28 6e 65 77 2e 62   || typeof(new.b
36d0: 29 20 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c 0a  )     || ' ' ||.
36e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 77               new
3700: 2e 63 20 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c  .c     || ' ' ||
3710: 20 74 79 70 65 6f 66 28 6e 65 77 2e 63 29 0a 20   typeof(new.c). 
3720: 20 20 20 20 20 29 3b 0a 20 20 20 20 45 4e 44 3b       );.    END;
3730: 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47  .    CREATE TRIG
3740: 47 45 52 20 74 34 61 75 20 41 46 54 45 52 20 55  GER t4au AFTER U
3750: 50 44 41 54 45 20 4f 4e 20 74 34 20 42 45 47 49  PDATE ON t4 BEGI
3760: 4e 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  N.      INSERT I
3770: 4e 54 4f 20 6c 6f 67 20 56 41 4c 55 45 53 28 6f  NTO log VALUES(o
3780: 6c 64 2e 72 6f 77 69 64 20 7c 7c 20 27 20 27 20  ld.rowid || ' ' 
3790: 7c 7c 20 74 79 70 65 6f 66 28 6f 6c 64 2e 72 6f  || typeof(old.ro
37a0: 77 69 64 29 20 7c 7c 20 27 20 27 20 7c 7c 0a 20  wid) || ' ' ||. 
37b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37c0: 20 20 20 20 20 20 20 20 20 20 20 20 6f 6c 64 2e              old.
37d0: 61 20 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c 20  a     || ' ' || 
37e0: 74 79 70 65 6f 66 28 6f 6c 64 2e 61 29 20 20 20  typeof(old.a)   
37f0: 20 20 7c 7c 20 27 20 27 20 7c 7c 0a 20 20 20 20    || ' ' ||.    
3800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3810: 20 20 20 20 20 20 20 20 20 6f 6c 64 2e 62 20 20           old.b  
3820: 20 20 20 7c 7c 20 27 20 27 20 7c 7c 20 74 79 70     || ' ' || typ
3830: 65 6f 66 28 6f 6c 64 2e 62 29 20 20 20 20 20 7c  eof(old.b)     |
3840: 7c 20 27 20 27 20 7c 7c 0a 20 20 20 20 20 20 20  | ' ' ||.       
3850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3860: 20 20 20 20 20 20 6f 6c 64 2e 63 20 20 20 20 20        old.c     
3870: 7c 7c 20 27 20 27 20 7c 7c 20 74 79 70 65 6f 66  || ' ' || typeof
3880: 28 6f 6c 64 2e 63 29 0a 20 20 20 20 20 20 29 3b  (old.c).      );
3890: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
38a0: 54 4f 20 6c 6f 67 20 56 41 4c 55 45 53 28 6e 65  TO log VALUES(ne
38b0: 77 2e 72 6f 77 69 64 20 7c 7c 20 27 20 27 20 7c  w.rowid || ' ' |
38c0: 7c 20 74 79 70 65 6f 66 28 6e 65 77 2e 72 6f 77  | typeof(new.row
38d0: 69 64 29 20 7c 7c 20 27 20 27 20 7c 7c 0a 20 20  id) || ' ' ||.  
38e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38f0: 20 20 20 20 20 20 20 20 20 20 20 6e 65 77 2e 61             new.a
3900: 20 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c 20 74       || ' ' || t
3910: 79 70 65 6f 66 28 6e 65 77 2e 61 29 20 20 20 20  ypeof(new.a)    
3920: 20 7c 7c 20 27 20 27 20 7c 7c 0a 20 20 20 20 20   || ' ' ||.     
3930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3940: 20 20 20 20 20 20 20 20 6e 65 77 2e 62 20 20 20          new.b   
3950: 20 20 7c 7c 20 27 20 27 20 7c 7c 20 74 79 70 65    || ' ' || type
3960: 6f 66 28 6e 65 77 2e 62 29 20 20 20 20 20 7c 7c  of(new.b)     ||
3970: 20 27 20 27 20 7c 7c 0a 20 20 20 20 20 20 20 20   ' ' ||.        
3980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3990: 20 20 20 20 20 6e 65 77 2e 63 20 20 20 20 20 7c       new.c     |
39a0: 7c 20 27 20 27 20 7c 7c 20 74 79 70 65 6f 66 28  | ' ' || typeof(
39b0: 6e 65 77 2e 63 29 0a 20 20 20 20 20 20 29 3b 0a  new.c).      );.
39c0: 20 20 20 20 45 4e 44 3b 0a 20 20 7d 0a 7d 20 7b      END;.  }.} {
39d0: 7d 0a 66 6f 72 65 61 63 68 20 7b 6e 20 69 6e 73  }.foreach {n ins
39e0: 65 72 74 20 6c 6f 67 7d 20 7b 0a 0a 20 20 32 20  ert log} {..  2 
39f0: 7b 20 0a 20 20 20 49 4e 53 45 52 54 20 49 4e 54  { .   INSERT INT
3a00: 4f 20 74 34 20 56 41 4c 55 45 53 28 27 31 27 2c  O t4 VALUES('1',
3a10: 20 27 31 27 2c 20 27 31 27 29 3b 0a 20 20 20 44   '1', '1');.   D
3a20: 45 4c 45 54 45 20 46 52 4f 4d 20 74 34 3b 0a 20  ELETE FROM t4;. 
3a30: 20 7d 20 7b 0a 20 20 20 20 2d 31 20 69 6e 74 65   } {.    -1 inte
3a40: 67 65 72 20 31 20 74 65 78 74 20 31 20 69 6e 74  ger 1 text 1 int
3a50: 65 67 65 72 20 31 2e 30 20 72 65 61 6c 20 0a 20  eger 1.0 real . 
3a60: 20 20 20 20 31 20 69 6e 74 65 67 65 72 20 31 20      1 integer 1 
3a70: 74 65 78 74 20 31 20 69 6e 74 65 67 65 72 20 31  text 1 integer 1
3a80: 2e 30 20 72 65 61 6c 0a 20 20 20 20 20 31 20 69  .0 real.     1 i
3a90: 6e 74 65 67 65 72 20 31 20 74 65 78 74 20 31 20  nteger 1 text 1 
3aa0: 69 6e 74 65 67 65 72 20 31 2e 30 20 72 65 61 6c  integer 1.0 real
3ab0: 20 0a 20 20 20 20 20 31 20 69 6e 74 65 67 65 72   .     1 integer
3ac0: 20 31 20 74 65 78 74 20 31 20 69 6e 74 65 67 65   1 text 1 intege
3ad0: 72 20 31 2e 30 20 72 65 61 6c 0a 20 20 7d 0a 0a  r 1.0 real.  }..
3ae0: 20 20 33 20 7b 20 0a 20 20 20 49 4e 53 45 52 54    3 { .   INSERT
3af0: 20 49 4e 54 4f 20 74 34 28 72 6f 77 69 64 2c 61   INTO t4(rowid,a
3b00: 2c 62 2c 63 29 20 56 41 4c 55 45 53 28 34 35 2c  ,b,c) VALUES(45,
3b10: 20 34 35 2c 20 34 35 2c 20 34 35 29 3b 0a 20 20   45, 45, 45);.  
3b20: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 34 3b   DELETE FROM t4;
3b30: 0a 20 20 7d 20 7b 0a 20 20 20 20 34 35 20 69 6e  .  } {.    45 in
3b40: 74 65 67 65 72 20 34 35 20 74 65 78 74 20 34 35  teger 45 text 45
3b50: 20 69 6e 74 65 67 65 72 20 34 35 2e 30 20 72 65   integer 45.0 re
3b60: 61 6c 0a 20 20 20 20 34 35 20 69 6e 74 65 67 65  al.    45 intege
3b70: 72 20 34 35 20 74 65 78 74 20 34 35 20 69 6e 74  r 45 text 45 int
3b80: 65 67 65 72 20 34 35 2e 30 20 72 65 61 6c 0a 20  eger 45.0 real. 
3b90: 20 20 20 34 35 20 69 6e 74 65 67 65 72 20 34 35     45 integer 45
3ba0: 20 74 65 78 74 20 34 35 20 69 6e 74 65 67 65 72   text 45 integer
3bb0: 20 34 35 2e 30 20 72 65 61 6c 0a 20 20 20 20 34   45.0 real.    4
3bc0: 35 20 69 6e 74 65 67 65 72 20 34 35 20 74 65 78  5 integer 45 tex
3bd0: 74 20 34 35 20 69 6e 74 65 67 65 72 20 34 35 2e  t 45 integer 45.
3be0: 30 20 72 65 61 6c 0a 20 20 7d 0a 0a 20 20 34 20  0 real.  }..  4 
3bf0: 7b 20 0a 20 20 20 49 4e 53 45 52 54 20 49 4e 54  { .   INSERT INT
3c00: 4f 20 74 34 28 72 6f 77 69 64 2c 61 2c 62 2c 63  O t4(rowid,a,b,c
3c10: 29 20 56 41 4c 55 45 53 28 2d 34 32 2e 30 2c 20  ) VALUES(-42.0, 
3c20: 2d 34 32 2e 30 2c 20 2d 34 32 2e 30 2c 20 2d 34  -42.0, -42.0, -4
3c30: 32 2e 30 29 3b 0a 20 20 20 44 45 4c 45 54 45 20  2.0);.   DELETE 
3c40: 46 52 4f 4d 20 74 34 3b 0a 20 20 7d 20 7b 0a 20  FROM t4;.  } {. 
3c50: 20 20 20 2d 34 32 20 69 6e 74 65 67 65 72 20 2d     -42 integer -
3c60: 34 32 2e 30 20 74 65 78 74 20 2d 34 32 20 69 6e  42.0 text -42 in
3c70: 74 65 67 65 72 20 2d 34 32 2e 30 20 72 65 61 6c  teger -42.0 real
3c80: 20 0a 20 20 20 20 2d 34 32 20 69 6e 74 65 67 65   .    -42 intege
3c90: 72 20 2d 34 32 2e 30 20 74 65 78 74 20 2d 34 32  r -42.0 text -42
3ca0: 20 69 6e 74 65 67 65 72 20 2d 34 32 2e 30 20 72   integer -42.0 r
3cb0: 65 61 6c 0a 20 20 20 20 2d 34 32 20 69 6e 74 65  eal.    -42 inte
3cc0: 67 65 72 20 2d 34 32 2e 30 20 74 65 78 74 20 2d  ger -42.0 text -
3cd0: 34 32 20 69 6e 74 65 67 65 72 20 2d 34 32 2e 30  42 integer -42.0
3ce0: 20 72 65 61 6c 20 0a 20 20 20 20 2d 34 32 20 69   real .    -42 i
3cf0: 6e 74 65 67 65 72 20 2d 34 32 2e 30 20 74 65 78  nteger -42.0 tex
3d00: 74 20 2d 34 32 20 69 6e 74 65 67 65 72 20 2d 34  t -42 integer -4
3d10: 32 2e 30 20 72 65 61 6c 0a 20 20 7d 0a 0a 20 20  2.0 real.  }..  
3d20: 35 20 7b 20 0a 20 20 20 49 4e 53 45 52 54 20 49  5 { .   INSERT I
3d30: 4e 54 4f 20 74 34 28 72 6f 77 69 64 2c 61 2c 62  NTO t4(rowid,a,b
3d40: 2c 63 29 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c  ,c) VALUES(NULL,
3d50: 20 2d 34 32 2e 34 2c 20 2d 34 32 2e 34 2c 20 2d   -42.4, -42.4, -
3d60: 34 32 2e 34 29 3b 0a 20 20 20 44 45 4c 45 54 45  42.4);.   DELETE
3d70: 20 46 52 4f 4d 20 74 34 3b 0a 20 20 7d 20 7b 0a   FROM t4;.  } {.
3d80: 20 20 20 20 2d 31 20 69 6e 74 65 67 65 72 20 2d      -1 integer -
3d90: 34 32 2e 34 20 74 65 78 74 20 2d 34 32 2e 34 20  42.4 text -42.4 
3da0: 72 65 61 6c 20 2d 34 32 2e 34 20 72 65 61 6c 0a  real -42.4 real.
3db0: 20 20 20 20 20 31 20 69 6e 74 65 67 65 72 20 2d       1 integer -
3dc0: 34 32 2e 34 20 74 65 78 74 20 2d 34 32 2e 34 20  42.4 text -42.4 
3dd0: 72 65 61 6c 20 2d 34 32 2e 34 20 72 65 61 6c 0a  real -42.4 real.
3de0: 20 20 20 20 20 31 20 69 6e 74 65 67 65 72 20 2d       1 integer -
3df0: 34 32 2e 34 20 74 65 78 74 20 2d 34 32 2e 34 20  42.4 text -42.4 
3e00: 72 65 61 6c 20 2d 34 32 2e 34 20 72 65 61 6c 0a  real -42.4 real.
3e10: 20 20 20 20 20 31 20 69 6e 74 65 67 65 72 20 2d       1 integer -
3e20: 34 32 2e 34 20 74 65 78 74 20 2d 34 32 2e 34 20  42.4 text -42.4 
3e30: 72 65 61 6c 20 2d 34 32 2e 34 20 72 65 61 6c 0a  real -42.4 real.
3e40: 20 20 7d 0a 0a 20 20 36 20 7b 20 0a 20 20 20 49    }..  6 { .   I
3e50: 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41  NSERT INTO t4 VA
3e60: 4c 55 45 53 28 37 2c 20 37 2c 20 37 29 3b 0a 20  LUES(7, 7, 7);. 
3e70: 20 20 55 50 44 41 54 45 20 74 34 20 53 45 54 20    UPDATE t4 SET 
3e80: 61 3d 38 2c 20 62 3d 38 2c 20 63 3d 38 3b 0a 20  a=8, b=8, c=8;. 
3e90: 20 7d 20 7b 0a 20 20 20 20 2d 31 20 69 6e 74 65   } {.    -1 inte
3ea0: 67 65 72 20 37 20 74 65 78 74 20 37 20 69 6e 74  ger 7 text 7 int
3eb0: 65 67 65 72 20 37 2e 30 20 72 65 61 6c 0a 20 20  eger 7.0 real.  
3ec0: 20 20 20 31 20 69 6e 74 65 67 65 72 20 37 20 74     1 integer 7 t
3ed0: 65 78 74 20 37 20 69 6e 74 65 67 65 72 20 37 2e  ext 7 integer 7.
3ee0: 30 20 72 65 61 6c 0a 20 20 20 20 20 31 20 69 6e  0 real.     1 in
3ef0: 74 65 67 65 72 20 37 20 74 65 78 74 20 37 20 69  teger 7 text 7 i
3f00: 6e 74 65 67 65 72 20 37 2e 30 20 72 65 61 6c 0a  nteger 7.0 real.
3f10: 20 20 20 20 20 31 20 69 6e 74 65 67 65 72 20 38       1 integer 8
3f20: 20 74 65 78 74 20 38 20 69 6e 74 65 67 65 72 20   text 8 integer 
3f30: 38 2e 30 20 72 65 61 6c 0a 20 20 20 20 20 31 20  8.0 real.     1 
3f40: 69 6e 74 65 67 65 72 20 37 20 74 65 78 74 20 37  integer 7 text 7
3f50: 20 69 6e 74 65 67 65 72 20 37 2e 30 20 72 65 61   integer 7.0 rea
3f60: 6c 0a 20 20 20 20 20 31 20 69 6e 74 65 67 65 72  l.     1 integer
3f70: 20 38 20 74 65 78 74 20 38 20 69 6e 74 65 67 65   8 text 8 intege
3f80: 72 20 38 2e 30 20 72 65 61 6c 0a 20 20 7d 0a 0a  r 8.0 real.  }..
3f90: 20 20 37 20 7b 20 0a 20 20 20 55 50 44 41 54 45    7 { .   UPDATE
3fa0: 20 74 34 20 53 45 54 20 72 6f 77 69 64 3d 32 3b   t4 SET rowid=2;
3fb0: 0a 20 20 7d 20 7b 0a 20 20 20 20 20 31 20 69 6e  .  } {.     1 in
3fc0: 74 65 67 65 72 20 38 20 74 65 78 74 20 38 20 69  teger 8 text 8 i
3fd0: 6e 74 65 67 65 72 20 38 2e 30 20 72 65 61 6c 0a  nteger 8.0 real.
3fe0: 20 20 20 20 20 32 20 69 6e 74 65 67 65 72 20 38       2 integer 8
3ff0: 20 74 65 78 74 20 38 20 69 6e 74 65 67 65 72 20   text 8 integer 
4000: 38 2e 30 20 72 65 61 6c 0a 20 20 20 20 20 31 20  8.0 real.     1 
4010: 69 6e 74 65 67 65 72 20 38 20 74 65 78 74 20 38  integer 8 text 8
4020: 20 69 6e 74 65 67 65 72 20 38 2e 30 20 72 65 61   integer 8.0 rea
4030: 6c 0a 20 20 20 20 20 32 20 69 6e 74 65 67 65 72  l.     2 integer
4040: 20 38 20 74 65 78 74 20 38 20 69 6e 74 65 67 65   8 text 8 intege
4050: 72 20 38 2e 30 20 72 65 61 6c 0a 20 20 7d 0a 0a  r 8.0 real.  }..
4060: 20 20 38 20 7b 20 0a 20 20 20 55 50 44 41 54 45    8 { .   UPDATE
4070: 20 74 34 20 53 45 54 20 61 3d 27 39 27 2c 20 62   t4 SET a='9', b
4080: 3d 27 39 27 2c 20 63 3d 27 39 27 3b 0a 20 20 7d  ='9', c='9';.  }
4090: 20 7b 0a 20 20 20 20 20 32 20 69 6e 74 65 67 65   {.     2 intege
40a0: 72 20 38 20 74 65 78 74 20 38 20 69 6e 74 65 67  r 8 text 8 integ
40b0: 65 72 20 38 2e 30 20 72 65 61 6c 0a 20 20 20 20  er 8.0 real.    
40c0: 20 32 20 69 6e 74 65 67 65 72 20 39 20 74 65 78   2 integer 9 tex
40d0: 74 20 39 20 69 6e 74 65 67 65 72 20 39 2e 30 20  t 9 integer 9.0 
40e0: 72 65 61 6c 0a 20 20 20 20 20 32 20 69 6e 74 65  real.     2 inte
40f0: 67 65 72 20 38 20 74 65 78 74 20 38 20 69 6e 74  ger 8 text 8 int
4100: 65 67 65 72 20 38 2e 30 20 72 65 61 6c 0a 20 20  eger 8.0 real.  
4110: 20 20 20 32 20 69 6e 74 65 67 65 72 20 39 20 74     2 integer 9 t
4120: 65 78 74 20 39 20 69 6e 74 65 67 65 72 20 39 2e  ext 9 integer 9.
4130: 30 20 72 65 61 6c 0a 20 20 7d 0a 0a 20 20 39 20  0 real.  }..  9 
4140: 7b 20 0a 20 20 20 55 50 44 41 54 45 20 74 34 20  { .   UPDATE t4 
4150: 53 45 54 20 61 3d 27 39 2e 31 27 2c 20 62 3d 27  SET a='9.1', b='
4160: 39 2e 31 27 2c 20 63 3d 27 39 2e 31 27 3b 0a 20  9.1', c='9.1';. 
4170: 20 7d 20 7b 0a 20 20 20 20 20 32 20 69 6e 74 65   } {.     2 inte
4180: 67 65 72 20 39 20 20 20 74 65 78 74 20 39 20 20  ger 9   text 9  
4190: 20 69 6e 74 65 67 65 72 20 39 2e 30 20 72 65 61   integer 9.0 rea
41a0: 6c 0a 20 20 20 20 20 32 20 69 6e 74 65 67 65 72  l.     2 integer
41b0: 20 39 2e 31 20 74 65 78 74 20 39 2e 31 20 72 65   9.1 text 9.1 re
41c0: 61 6c 20 20 20 20 39 2e 31 20 72 65 61 6c 0a 20  al    9.1 real. 
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 7d 0a 7d 20 7b  9.1 real.  }.} {
4230: 0a 20 20 64 6f 5f 74 65 73 74 20 74 72 69 67 67  .  do_test trigg
4240: 65 72 43 2d 34 2e 31 2e 24 6e 20 7b 0a 20 20 20  erC-4.1.$n {.   
4250: 20 65 76 61 6c 20 63 6f 6e 63 61 74 20 5b 65 78   eval concat [ex
4260: 65 63 73 71 6c 20 22 20 0a 20 20 20 20 20 20 44  ecsql " .      D
4270: 45 4c 45 54 45 20 46 52 4f 4d 20 6c 6f 67 3b 0a  ELETE FROM log;.
4280: 20 20 20 20 20 20 24 69 6e 73 65 72 74 20 3b 20        $insert ; 
4290: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .      SELECT * 
42a0: 46 52 4f 4d 20 6c 6f 67 3b 0a 20 20 20 20 22 5d  FROM log;.    "]
42b0: 0a 20 20 7d 20 5b 6a 6f 69 6e 20 24 6c 6f 67 20  .  } [join $log 
42c0: 22 20 22 5d 0a 7d 20 0a 0a 23 2d 2d 2d 2d 2d 2d  " "].} ..#------
42d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4310: 2d 2d 2d 0a 23 20 54 68 69 73 20 62 6c 6f 63 6b  ---.# This block
4320: 20 6f 66 20 74 65 73 74 73 2c 20 74 72 69 67 67   of tests, trigg
4330: 65 72 43 2d 35 2e 2a 2c 20 74 65 73 74 20 74 68  erC-5.*, test th
4340: 61 74 20 44 45 4c 45 54 45 20 74 72 69 67 67 65  at DELETE trigge
4350: 72 73 20 61 72 65 20 66 69 72 65 64 0a 23 20 69  rs are fired.# i
4360: 66 20 61 20 72 6f 77 20 69 73 20 64 65 6c 65 74  f a row is delet
4370: 65 64 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ed as a result o
4380: 66 20 4f 52 20 52 45 50 4c 41 43 45 20 63 6f 6e  f OR REPLACE con
4390: 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e  flict resolution
43a0: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 74 72 69 67  ..#.do_test trig
43b0: 67 65 72 43 2d 35 2e 31 2e 30 20 7b 0a 20 20 65  gerC-5.1.0 {.  e
43c0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f  xecsql {.    DRO
43d0: 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 53 54  P TABLE IF EXIST
43e0: 53 20 74 35 3b 0a 20 20 20 20 43 52 45 41 54 45  S t5;.    CREATE
43f0: 20 54 41 42 4c 45 20 74 35 28 61 20 49 4e 54 45   TABLE t5(a INTE
4400: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
4410: 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   b);.    CREATE 
4420: 55 4e 49 51 55 45 20 49 4e 44 45 58 20 74 35 69  UNIQUE INDEX t5i
4430: 20 4f 4e 20 74 35 28 62 29 3b 0a 20 20 20 20 49   ON t5(b);.    I
4440: 4e 53 45 52 54 20 49 4e 54 4f 20 74 35 20 56 41  NSERT INTO t5 VA
4450: 4c 55 45 53 28 31 2c 20 27 61 27 29 3b 0a 20 20  LUES(1, 'a');.  
4460: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 35    INSERT INTO t5
4470: 20 56 41 4c 55 45 53 28 32 2c 20 27 62 27 29 3b   VALUES(2, 'b');
4480: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
4490: 20 74 35 20 56 41 4c 55 45 53 28 33 2c 20 27 63   t5 VALUES(3, 'c
44a0: 27 29 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20  ');..    CREATE 
44b0: 54 41 42 4c 45 20 74 35 67 28 61 2c 20 62 2c 20  TABLE t5g(a, b, 
44c0: 63 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  c);.    CREATE T
44d0: 52 49 47 47 45 52 20 74 35 74 20 42 45 46 4f 52  RIGGER t5t BEFOR
44e0: 45 20 44 45 4c 45 54 45 20 4f 4e 20 74 35 20 42  E DELETE ON t5 B
44f0: 45 47 49 4e 0a 20 20 20 20 20 20 49 4e 53 45 52  EGIN.      INSER
4500: 54 20 49 4e 54 4f 20 74 35 67 20 56 41 4c 55 45  T INTO t5g VALUE
4510: 53 28 6f 6c 64 2e 61 2c 20 6f 6c 64 2e 62 2c 20  S(old.a, old.b, 
4520: 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29  (SELECT count(*)
4530: 20 46 52 4f 4d 20 74 35 29 29 3b 0a 20 20 20 20   FROM t5));.    
4540: 45 4e 44 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 66 6f  END;.  }.} {}.fo
4550: 72 65 61 63 68 20 7b 6e 20 64 6d 6c 20 74 35 67  reach {n dml t5g
4560: 20 74 35 7d 20 7b 0a 20 20 31 20 22 44 45 4c 45   t5} {.  1 "DELE
4570: 54 45 20 46 52 4f 4d 20 74 35 20 57 48 45 52 45  TE FROM t5 WHERE
4580: 20 61 3d 32 22 20 20 20 20 20 20 20 20 20 20 20   a=2"           
4590: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 32 20               {2 
45a0: 62 20 33 7d 20 7b 31 20 61 20 33 20 63 7d 0a 20  b 3} {1 a 3 c}. 
45b0: 20 32 20 22 49 4e 53 45 52 54 20 4f 52 20 52 45   2 "INSERT OR RE
45c0: 50 4c 41 43 45 20 49 4e 54 4f 20 74 35 20 56 41  PLACE INTO t5 VA
45d0: 4c 55 45 53 28 32 2c 20 27 64 27 29 22 20 20 20  LUES(2, 'd')"   
45e0: 20 20 20 20 20 7b 32 20 62 20 33 7d 20 7b 31 20       {2 b 3} {1 
45f0: 61 20 32 20 64 20 33 20 63 7d 0a 20 20 33 20 22  a 2 d 3 c}.  3 "
4600: 55 50 44 41 54 45 20 4f 52 20 52 45 50 4c 41 43  UPDATE OR REPLAC
4610: 45 20 74 35 20 53 45 54 20 61 20 3d 20 32 20 57  E t5 SET a = 2 W
4620: 48 45 52 45 20 61 20 3d 20 33 22 20 20 20 20 20  HERE a = 3"     
4630: 20 7b 32 20 62 20 33 7d 20 7b 31 20 61 20 32 20   {2 b 3} {1 a 2 
4640: 63 7d 0a 20 20 34 20 22 49 4e 53 45 52 54 20 4f  c}.  4 "INSERT O
4650: 52 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 74  R REPLACE INTO t
4660: 35 20 56 41 4c 55 45 53 28 34 2c 20 27 62 27 29  5 VALUES(4, 'b')
4670: 22 20 20 20 20 20 20 20 20 7b 32 20 62 20 33 7d  "        {2 b 3}
4680: 20 7b 31 20 61 20 33 20 63 20 34 20 62 7d 0a 20   {1 a 3 c 4 b}. 
4690: 20 35 20 22 55 50 44 41 54 45 20 4f 52 20 52 45   5 "UPDATE OR RE
46a0: 50 4c 41 43 45 20 74 35 20 53 45 54 20 62 20 3d  PLACE t5 SET b =
46b0: 20 27 62 27 20 57 48 45 52 45 20 62 20 3d 20 27   'b' WHERE b = '
46c0: 63 27 22 20 20 7b 32 20 62 20 33 7d 20 7b 31 20  c'"  {2 b 3} {1 
46d0: 61 20 33 20 62 7d 0a 20 20 36 20 22 49 4e 53 45  a 3 b}.  6 "INSE
46e0: 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20 49 4e  RT OR REPLACE IN
46f0: 54 4f 20 74 35 20 56 41 4c 55 45 53 28 32 2c 20  TO t5 VALUES(2, 
4700: 27 63 27 29 22 20 20 20 20 20 20 20 20 7b 32 20  'c')"        {2 
4710: 62 20 33 20 33 20 63 20 32 7d 20 7b 31 20 61 20  b 3 3 c 2} {1 a 
4720: 32 20 63 7d 0a 20 20 37 20 22 55 50 44 41 54 45  2 c}.  7 "UPDATE
4730: 20 4f 52 20 52 45 50 4c 41 43 45 20 74 35 20 53   OR REPLACE t5 S
4740: 45 54 20 61 3d 31 2c 20 62 3d 27 62 27 20 57 48  ET a=1, b='b' WH
4750: 45 52 45 20 61 20 3d 20 33 22 20 7b 31 20 61 20  ERE a = 3" {1 a 
4760: 33 20 32 20 62 20 32 7d 20 7b 31 20 62 7d 0a 7d  3 2 b 2} {1 b}.}
4770: 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 74 72 69   {.  do_test tri
4780: 67 67 65 72 43 2d 35 2e 31 2e 24 6e 20 7b 0a 20  ggerC-5.1.$n {. 
4790: 20 20 20 65 78 65 63 73 71 6c 20 22 0a 20 20 20     execsql ".   
47a0: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
47b0: 20 20 24 64 6d 6c 20 3b 0a 20 20 20 20 20 20 20    $dml ;.       
47c0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
47d0: 35 67 3b 0a 20 20 20 20 20 20 20 20 53 45 4c 45  5g;.        SELE
47e0: 43 54 20 2a 20 46 52 4f 4d 20 74 35 3b 0a 20 20  CT * FROM t5;.  
47f0: 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20      ROLLBACK;.  
4800: 20 20 22 0a 20 20 7d 20 5b 63 6f 6e 63 61 74 20    ".  } [concat 
4810: 24 74 35 67 20 24 74 35 5d 0a 7d 0a 64 6f 5f 74  $t5g $t5].}.do_t
4820: 65 73 74 20 74 72 69 67 67 65 72 43 2d 35 2e 32  est triggerC-5.2
4830: 2e 30 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .0 {.  execsql {
4840: 0a 20 20 20 20 44 52 4f 50 20 54 52 49 47 47 45  .    DROP TRIGGE
4850: 52 20 74 35 74 3b 0a 20 20 20 20 43 52 45 41 54  R t5t;.    CREAT
4860: 45 20 54 52 49 47 47 45 52 20 74 35 74 20 41 46  E TRIGGER t5t AF
4870: 54 45 52 20 44 45 4c 45 54 45 20 4f 4e 20 74 35  TER DELETE ON t5
4880: 20 42 45 47 49 4e 0a 20 20 20 20 20 20 49 4e 53   BEGIN.      INS
4890: 45 52 54 20 49 4e 54 4f 20 74 35 67 20 56 41 4c  ERT INTO t5g VAL
48a0: 55 45 53 28 6f 6c 64 2e 61 2c 20 6f 6c 64 2e 62  UES(old.a, old.b
48b0: 2c 20 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28  , (SELECT count(
48c0: 2a 29 20 46 52 4f 4d 20 74 35 29 29 3b 0a 20 20  *) FROM t5));.  
48d0: 20 20 45 4e 44 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a    END;.  }.} {}.
48e0: 66 6f 72 65 61 63 68 20 7b 6e 20 64 6d 6c 20 74  foreach {n dml t
48f0: 35 67 20 74 35 7d 20 7b 0a 20 20 31 20 22 44 45  5g t5} {.  1 "DE
4900: 4c 45 54 45 20 46 52 4f 4d 20 74 35 20 57 48 45  LETE FROM t5 WHE
4910: 52 45 20 61 3d 32 22 20 20 20 20 20 20 20 20 20  RE a=2"         
4920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
4930: 32 20 62 20 32 7d 20 7b 31 20 61 20 33 20 63 7d  2 b 2} {1 a 3 c}
4940: 0a 20 20 32 20 22 49 4e 53 45 52 54 20 4f 52 20  .  2 "INSERT OR 
4950: 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 74 35 20  REPLACE INTO t5 
4960: 56 41 4c 55 45 53 28 32 2c 20 27 64 27 29 22 20  VALUES(2, 'd')" 
4970: 20 20 20 20 20 20 20 7b 32 20 62 20 32 7d 20 7b         {2 b 2} {
4980: 31 20 61 20 32 20 64 20 33 20 63 7d 0a 20 20 33  1 a 2 d 3 c}.  3
4990: 20 22 55 50 44 41 54 45 20 4f 52 20 52 45 50 4c   "UPDATE OR REPL
49a0: 41 43 45 20 74 35 20 53 45 54 20 61 20 3d 20 32  ACE t5 SET a = 2
49b0: 20 57 48 45 52 45 20 61 20 3d 20 33 22 20 20 20   WHERE a = 3"   
49c0: 20 20 20 7b 32 20 62 20 32 7d 20 7b 31 20 61 20     {2 b 2} {1 a 
49d0: 32 20 63 7d 0a 20 20 34 20 22 49 4e 53 45 52 54  2 c}.  4 "INSERT
49e0: 20 4f 52 20 52 45 50 4c 41 43 45 20 49 4e 54 4f   OR REPLACE INTO
49f0: 20 74 35 20 56 41 4c 55 45 53 28 34 2c 20 27 62   t5 VALUES(4, 'b
4a00: 27 29 22 20 20 20 20 20 20 20 20 7b 32 20 62 20  ')"        {2 b 
4a10: 32 7d 20 7b 31 20 61 20 33 20 63 20 34 20 62 7d  2} {1 a 3 c 4 b}
4a20: 0a 20 20 35 20 22 55 50 44 41 54 45 20 4f 52 20  .  5 "UPDATE OR 
4a30: 52 45 50 4c 41 43 45 20 74 35 20 53 45 54 20 62  REPLACE t5 SET b
4a40: 20 3d 20 27 62 27 20 57 48 45 52 45 20 62 20 3d   = 'b' WHERE b =
4a50: 20 27 63 27 22 20 20 7b 32 20 62 20 32 7d 20 7b   'c'"  {2 b 2} {
4a60: 31 20 61 20 33 20 62 7d 0a 20 20 36 20 22 49 4e  1 a 3 b}.  6 "IN
4a70: 53 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20  SERT OR REPLACE 
4a80: 49 4e 54 4f 20 74 35 20 56 41 4c 55 45 53 28 32  INTO t5 VALUES(2
4a90: 2c 20 27 63 27 29 22 20 20 20 20 20 20 20 20 7b  , 'c')"        {
4aa0: 32 20 62 20 32 20 33 20 63 20 31 7d 20 7b 31 20  2 b 2 3 c 1} {1 
4ab0: 61 20 32 20 63 7d 0a 20 20 37 20 22 55 50 44 41  a 2 c}.  7 "UPDA
4ac0: 54 45 20 4f 52 20 52 45 50 4c 41 43 45 20 74 35  TE OR REPLACE t5
4ad0: 20 53 45 54 20 61 3d 31 2c 20 62 3d 27 62 27 20   SET a=1, b='b' 
4ae0: 57 48 45 52 45 20 61 20 3d 20 33 22 20 7b 31 20  WHERE a = 3" {1 
4af0: 61 20 32 20 32 20 62 20 31 7d 20 7b 31 20 62 7d  a 2 2 b 1} {1 b}
4b00: 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 74  .} {.  do_test t
4b10: 72 69 67 67 65 72 43 2d 35 2e 32 2e 24 6e 20 7b  riggerC-5.2.$n {
4b20: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22 0a 20  .    execsql ". 
4b30: 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20       BEGIN;.    
4b40: 20 20 20 20 24 64 6d 6c 20 3b 0a 20 20 20 20 20      $dml ;.     
4b50: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
4b60: 20 74 35 67 3b 0a 20 20 20 20 20 20 20 20 53 45   t5g;.        SE
4b70: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 35 3b 0a  LECT * FROM t5;.
4b80: 20 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a        ROLLBACK;.
4b90: 20 20 20 20 22 0a 20 20 7d 20 5b 63 6f 6e 63 61      ".  } [conca
4ba0: 74 20 24 74 35 67 20 24 74 35 5d 0a 7d 0a 64 6f  t $t5g $t5].}.do
4bb0: 5f 74 65 73 74 20 74 72 69 67 67 65 72 43 2d 35  _test triggerC-5
4bc0: 2e 33 2e 30 20 7b 0a 20 20 65 78 65 63 73 71 6c  .3.0 {.  execsql
4bd0: 20 7b 20 50 52 41 47 4d 41 20 72 65 63 75 72 73   { PRAGMA recurs
4be0: 69 76 65 5f 74 72 69 67 67 65 72 73 20 3d 20 6f  ive_triggers = o
4bf0: 66 66 20 7d 0a 7d 20 7b 7d 0a 66 6f 72 65 61 63  ff }.} {}.foreac
4c00: 68 20 7b 6e 20 64 6d 6c 20 74 35 67 20 74 35 7d  h {n dml t5g t5}
4c10: 20 7b 0a 20 20 31 20 22 44 45 4c 45 54 45 20 46   {.  1 "DELETE F
4c20: 52 4f 4d 20 74 35 20 57 48 45 52 45 20 61 3d 32  ROM t5 WHERE a=2
4c30: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
4c40: 20 20 20 20 20 20 20 20 20 7b 32 20 62 20 32 7d           {2 b 2}
4c50: 20 7b 31 20 61 20 33 20 63 7d 0a 20 20 32 20 22   {1 a 3 c}.  2 "
4c60: 49 4e 53 45 52 54 20 4f 52 20 52 45 50 4c 41 43  INSERT OR REPLAC
4c70: 45 20 49 4e 54 4f 20 74 35 20 56 41 4c 55 45 53  E INTO t5 VALUES
4c80: 28 32 2c 20 27 64 27 29 22 20 20 20 20 20 20 20  (2, 'd')"       
4c90: 20 7b 7d 20 7b 31 20 61 20 32 20 64 20 33 20 63   {} {1 a 2 d 3 c
4ca0: 7d 0a 20 20 33 20 22 55 50 44 41 54 45 20 4f 52  }.  3 "UPDATE OR
4cb0: 20 52 45 50 4c 41 43 45 20 74 35 20 53 45 54 20   REPLACE t5 SET 
4cc0: 61 20 3d 20 32 20 57 48 45 52 45 20 61 20 3d 20  a = 2 WHERE a = 
4cd0: 33 22 20 20 20 20 20 20 7b 7d 20 7b 31 20 61 20  3"      {} {1 a 
4ce0: 32 20 63 7d 0a 20 20 34 20 22 49 4e 53 45 52 54  2 c}.  4 "INSERT
4cf0: 20 4f 52 20 52 45 50 4c 41 43 45 20 49 4e 54 4f   OR REPLACE INTO
4d00: 20 74 35 20 56 41 4c 55 45 53 28 34 2c 20 27 62   t5 VALUES(4, 'b
4d10: 27 29 22 20 20 20 20 20 20 20 20 7b 7d 20 7b 31  ')"        {} {1
4d20: 20 61 20 33 20 63 20 34 20 62 7d 0a 20 20 35 20   a 3 c 4 b}.  5 
4d30: 22 55 50 44 41 54 45 20 4f 52 20 52 45 50 4c 41  "UPDATE OR REPLA
4d40: 43 45 20 74 35 20 53 45 54 20 62 20 3d 20 27 62  CE t5 SET b = 'b
4d50: 27 20 57 48 45 52 45 20 62 20 3d 20 27 63 27 22  ' WHERE b = 'c'"
4d60: 20 20 7b 7d 20 7b 31 20 61 20 33 20 62 7d 0a 20    {} {1 a 3 b}. 
4d70: 20 36 20 22 49 4e 53 45 52 54 20 4f 52 20 52 45   6 "INSERT OR RE
4d80: 50 4c 41 43 45 20 49 4e 54 4f 20 74 35 20 56 41  PLACE INTO t5 VA
4d90: 4c 55 45 53 28 32 2c 20 27 63 27 29 22 20 20 20  LUES(2, 'c')"   
4da0: 20 20 20 20 20 7b 7d 20 7b 31 20 61 20 32 20 63       {} {1 a 2 c
4db0: 7d 0a 20 20 37 20 22 55 50 44 41 54 45 20 4f 52  }.  7 "UPDATE OR
4dc0: 20 52 45 50 4c 41 43 45 20 74 35 20 53 45 54 20   REPLACE t5 SET 
4dd0: 61 3d 31 2c 20 62 3d 27 62 27 20 57 48 45 52 45  a=1, b='b' WHERE
4de0: 20 61 20 3d 20 33 22 20 7b 7d 20 7b 31 20 62 7d   a = 3" {} {1 b}
4df0: 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 74  .} {.  do_test t
4e00: 72 69 67 67 65 72 43 2d 35 2e 33 2e 24 6e 20 7b  riggerC-5.3.$n {
4e10: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 22 0a 20  .    execsql ". 
4e20: 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20       BEGIN;.    
4e30: 20 20 20 20 24 64 6d 6c 20 3b 0a 20 20 20 20 20      $dml ;.     
4e40: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
4e50: 20 74 35 67 3b 0a 20 20 20 20 20 20 20 20 53 45   t5g;.        SE
4e60: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 35 3b 0a  LECT * FROM t5;.
4e70: 20 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a        ROLLBACK;.
4e80: 20 20 20 20 22 0a 20 20 7d 20 5b 63 6f 6e 63 61      ".  } [conca
4e90: 74 20 24 74 35 67 20 24 74 35 5d 0a 7d 0a 64 6f  t $t5g $t5].}.do
4ea0: 5f 74 65 73 74 20 74 72 69 67 67 65 72 43 2d 35  _test triggerC-5
4eb0: 2e 33 2e 38 20 7b 0a 20 20 65 78 65 63 73 71 6c  .3.8 {.  execsql
4ec0: 20 7b 20 50 52 41 47 4d 41 20 72 65 63 75 72 73   { PRAGMA recurs
4ed0: 69 76 65 5f 74 72 69 67 67 65 72 73 20 3d 20 6f  ive_triggers = o
4ee0: 6e 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d 2d  n }.} {}..#-----
4ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4f30: 2d 2d 2d 2d 0a 23 20 54 68 69 73 20 62 6c 6f 63  ----.# This bloc
4f40: 6b 20 6f 66 20 74 65 73 74 73 2c 20 74 72 69 67  k of tests, trig
4f50: 67 65 72 43 2d 36 2e 2a 2c 20 74 65 73 74 73 20  gerC-6.*, tests 
4f60: 74 68 61 74 20 22 50 52 41 47 4d 41 20 72 65 63  that "PRAGMA rec
4f70: 75 72 73 69 76 65 5f 74 72 69 67 67 65 72 73 22  ursive_triggers"
4f80: 0a 23 20 73 74 61 74 65 6d 65 6e 74 73 20 72 65  .# statements re
4f90: 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
4fa0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 72 65   value of the re
4fb0: 63 75 72 73 69 76 65 20 74 72 69 67 67 65 72 73  cursive triggers
4fc0: 20 66 6c 61 67 2e 0a 23 0a 64 6f 5f 74 65 73 74   flag..#.do_test
4fd0: 20 74 72 69 67 67 65 72 43 2d 36 2e 31 20 7b 0a   triggerC-6.1 {.
4fe0: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
4ff0: 4d 41 20 72 65 63 75 72 73 69 76 65 5f 74 72 69  MA recursive_tri
5000: 67 67 65 72 73 20 7d 0a 7d 20 7b 31 7d 0a 64 6f  ggers }.} {1}.do
5010: 5f 74 65 73 74 20 74 72 69 67 67 65 72 43 2d 36  _test triggerC-6
5020: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
5030: 20 0a 20 20 20 20 50 52 41 47 4d 41 20 72 65 63   .    PRAGMA rec
5040: 75 72 73 69 76 65 5f 74 72 69 67 67 65 72 73 20  ursive_triggers 
5050: 3d 20 6f 66 66 3b 0a 20 20 20 20 50 52 41 47 4d  = off;.    PRAGM
5060: 41 20 72 65 63 75 72 73 69 76 65 5f 74 72 69 67  A recursive_trig
5070: 67 65 72 73 3b 0a 20 20 7d 0a 7d 20 7b 30 7d 0a  gers;.  }.} {0}.
5080: 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 43  do_test triggerC
5090: 2d 36 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  -6.3 {.  execsql
50a0: 20 7b 20 0a 20 20 20 20 50 52 41 47 4d 41 20 72   { .    PRAGMA r
50b0: 65 63 75 72 73 69 76 65 5f 74 72 69 67 67 65 72  ecursive_trigger
50c0: 73 20 3d 20 6f 6e 3b 0a 20 20 20 20 50 52 41 47  s = on;.    PRAG
50d0: 4d 41 20 72 65 63 75 72 73 69 76 65 5f 74 72 69  MA recursive_tri
50e0: 67 67 65 72 73 3b 0a 20 20 7d 0a 7d 20 7b 31 7d  ggers;.  }.} {1}
50f0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
5100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
5140: 65 73 74 20 73 6f 6d 65 20 6f 66 20 74 68 65 20  est some of the 
5150: 22 75 6e 64 65 66 69 6e 65 64 20 62 65 68 61 76  "undefined behav
5160: 69 6f 75 72 22 20 61 73 73 6f 63 69 61 74 65 64  iour" associated
5170: 20 77 69 74 68 20 74 72 69 67 67 65 72 73 2e 20   with triggers. 
5180: 54 68 65 0a 23 20 75 6e 64 65 66 69 6e 65 64 20  The.# undefined 
5190: 62 65 68 61 76 69 6f 75 72 20 6f 63 63 75 72 73  behaviour occurs
51a0: 20 77 68 65 6e 20 61 20 72 6f 77 20 62 65 69 6e   when a row bein
51b0: 67 20 75 70 64 61 74 65 64 20 6f 72 20 64 65 6c  g updated or del
51c0: 65 74 65 64 20 69 73 20 0a 23 20 6d 61 6e 69 70  eted is .# manip
51d0: 75 6c 61 74 65 64 20 62 79 20 61 20 42 45 46 4f  ulated by a BEFO
51e0: 52 45 20 74 72 69 67 67 65 72 2e 0a 23 20 0a 64  RE trigger..# .d
51f0: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 43 2d  o_test triggerC-
5200: 37 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  7.1 {.  execsql 
5210: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
5220: 4c 45 20 74 38 28 78 29 3b 0a 20 20 20 20 43 52  LE t8(x);.    CR
5230: 45 41 54 45 20 54 41 42 4c 45 20 74 37 28 61 2c  EATE TABLE t7(a,
5240: 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   b);.    INSERT 
5250: 49 4e 54 4f 20 74 37 20 56 41 4c 55 45 53 28 31  INTO t7 VALUES(1
5260: 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , 2);.    INSERT
5270: 20 49 4e 54 4f 20 74 37 20 56 41 4c 55 45 53 28   INTO t7 VALUES(
5280: 33 2c 20 34 29 3b 0a 20 20 20 20 49 4e 53 45 52  3, 4);.    INSER
5290: 54 20 49 4e 54 4f 20 74 37 20 56 41 4c 55 45 53  T INTO t7 VALUES
52a0: 28 35 2c 20 36 29 3b 0a 20 20 20 20 43 52 45 41  (5, 6);.    CREA
52b0: 54 45 20 54 52 49 47 47 45 52 20 74 37 74 20 42  TE TRIGGER t7t B
52c0: 45 46 4f 52 45 20 55 50 44 41 54 45 20 4f 4e 20  EFORE UPDATE ON 
52d0: 74 37 20 42 45 47 49 4e 0a 20 20 20 20 20 20 44  t7 BEGIN.      D
52e0: 45 4c 45 54 45 20 46 52 4f 4d 20 74 37 20 57 48  ELETE FROM t7 WH
52f0: 45 52 45 20 61 20 3d 20 31 3b 0a 20 20 20 20 45  ERE a = 1;.    E
5300: 4e 44 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  ND;.    CREATE T
5310: 52 49 47 47 45 52 20 74 37 74 61 20 41 46 54 45  RIGGER t7ta AFTE
5320: 52 20 55 50 44 41 54 45 20 4f 4e 20 74 37 20 42  R UPDATE ON t7 B
5330: 45 47 49 4e 0a 20 20 20 20 20 20 49 4e 53 45 52  EGIN.      INSER
5340: 54 20 49 4e 54 4f 20 74 38 20 56 41 4c 55 45 53  T INTO t8 VALUES
5350: 28 27 61 66 74 65 72 20 66 69 72 65 64 20 27 20  ('after fired ' 
5360: 7c 7c 20 6f 6c 64 2e 72 6f 77 69 64 20 7c 7c 20  || old.rowid || 
5370: 27 2d 3e 27 20 7c 7c 20 6e 65 77 2e 72 6f 77 69  '->' || new.rowi
5380: 64 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 7d  d);.    END;.  }
5390: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 74 72  .} {}.do_test tr
53a0: 69 67 67 65 72 43 2d 37 2e 32 20 7b 0a 20 20 65  iggerC-7.2 {.  e
53b0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47  xecsql {.    BEG
53c0: 49 4e 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45  IN;.      UPDATE
53d0: 20 74 37 20 53 45 54 20 62 3d 37 20 57 48 45 52   t7 SET b=7 WHER
53e0: 45 20 61 20 3d 20 35 3b 0a 20 20 20 20 20 20 53  E a = 5;.      S
53f0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 37 3b  ELECT * FROM t7;
5400: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .      SELECT * 
5410: 46 52 4f 4d 20 74 38 3b 0a 20 20 20 20 52 4f 4c  FROM t8;.    ROL
5420: 4c 42 41 43 4b 3b 0a 20 20 7d 0a 7d 20 7b 33 20  LBACK;.  }.} {3 
5430: 34 20 35 20 37 20 7b 61 66 74 65 72 20 66 69 72  4 5 7 {after fir
5440: 65 64 20 33 2d 3e 33 7d 7d 0a 64 6f 5f 74 65 73  ed 3->3}}.do_tes
5450: 74 20 74 72 69 67 67 65 72 43 2d 37 2e 33 20 7b  t triggerC-7.3 {
5460: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
5470: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 55 50   BEGIN;.      UP
5480: 44 41 54 45 20 74 37 20 53 45 54 20 62 3d 37 20  DATE t7 SET b=7 
5490: 57 48 45 52 45 20 61 20 3d 20 31 3b 0a 20 20 20  WHERE a = 1;.   
54a0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
54b0: 20 74 37 3b 0a 20 20 20 20 20 20 53 45 4c 45 43   t7;.      SELEC
54c0: 54 20 2a 20 46 52 4f 4d 20 74 38 3b 0a 20 20 20  T * FROM t8;.   
54d0: 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a 7d   ROLLBACK;.  }.}
54e0: 20 7b 33 20 34 20 35 20 36 7d 0a 0a 64 6f 5f 74   {3 4 5 6}..do_t
54f0: 65 73 74 20 74 72 69 67 67 65 72 43 2d 37 2e 34  est triggerC-7.4
5500: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
5510: 20 20 20 44 52 4f 50 20 54 52 49 47 47 45 52 20     DROP TRIGGER 
5520: 74 37 74 3b 0a 20 20 20 20 43 52 45 41 54 45 20  t7t;.    CREATE 
5530: 54 52 49 47 47 45 52 20 74 37 74 20 42 45 46 4f  TRIGGER t7t BEFO
5540: 52 45 20 55 50 44 41 54 45 20 4f 4e 20 74 37 20  RE UPDATE ON t7 
5550: 57 48 45 4e 20 28 6f 6c 64 2e 72 6f 77 69 64 21  WHEN (old.rowid!
5560: 3d 31 20 4f 52 20 6e 65 77 2e 72 6f 77 69 64 21  =1 OR new.rowid!
5570: 3d 38 29 0a 20 20 20 20 42 45 47 49 4e 0a 20 20  =8).    BEGIN.  
5580: 20 20 20 20 55 50 44 41 54 45 20 74 37 20 73 65      UPDATE t7 se
5590: 74 20 72 6f 77 69 64 20 3d 20 38 20 57 48 45 52  t rowid = 8 WHER
55a0: 45 20 72 6f 77 69 64 3d 31 3b 0a 20 20 20 20 45  E rowid=1;.    E
55b0: 4e 44 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  ND;.  }.} {}.do_
55c0: 74 65 73 74 20 74 72 69 67 67 65 72 43 2d 37 2e  test triggerC-7.
55d0: 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  5 {.  execsql {.
55e0: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
55f0: 20 55 50 44 41 54 45 20 74 37 20 53 45 54 20 62   UPDATE t7 SET b
5600: 3d 37 20 57 48 45 52 45 20 61 20 3d 20 35 3b 0a  =7 WHERE a = 5;.
5610: 20 20 20 20 20 20 53 45 4c 45 43 54 20 72 6f 77        SELECT row
5620: 69 64 2c 20 2a 20 46 52 4f 4d 20 74 37 3b 0a 20  id, * FROM t7;. 
5630: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
5640: 4f 4d 20 74 38 3b 0a 20 20 20 20 52 4f 4c 4c 42  OM t8;.    ROLLB
5650: 41 43 4b 3b 0a 20 20 7d 0a 7d 20 7b 32 20 33 20  ACK;.  }.} {2 3 
5660: 34 20 33 20 35 20 37 20 38 20 31 20 32 20 7b 61  4 3 5 7 8 1 2 {a
5670: 66 74 65 72 20 66 69 72 65 64 20 31 2d 3e 38 7d  fter fired 1->8}
5680: 20 7b 61 66 74 65 72 20 66 69 72 65 64 20 33 2d   {after fired 3-
5690: 3e 33 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69  >3}}.do_test tri
56a0: 67 67 65 72 43 2d 37 2e 36 20 7b 0a 20 20 65 78  ggerC-7.6 {.  ex
56b0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49  ecsql {.    BEGI
56c0: 4e 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20  N;.      UPDATE 
56d0: 74 37 20 53 45 54 20 62 3d 37 20 57 48 45 52 45  t7 SET b=7 WHERE
56e0: 20 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 53 45   a = 1;.      SE
56f0: 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52  LECT rowid, * FR
5700: 4f 4d 20 74 37 3b 0a 20 20 20 20 20 20 53 45 4c  OM t7;.      SEL
5710: 45 43 54 20 2a 20 46 52 4f 4d 20 74 38 3b 0a 20  ECT * FROM t8;. 
5720: 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d     ROLLBACK;.  }
5730: 0a 7d 20 7b 32 20 33 20 34 20 33 20 35 20 36 20  .} {2 3 4 3 5 6 
5740: 38 20 31 20 32 20 7b 61 66 74 65 72 20 66 69 72  8 1 2 {after fir
5750: 65 64 20 31 2d 3e 38 7d 7d 0a 0a 64 6f 5f 74 65  ed 1->8}}..do_te
5760: 73 74 20 74 72 69 67 67 65 72 43 2d 37 2e 37 20  st triggerC-7.7 
5770: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
5780: 20 20 44 52 4f 50 20 54 52 49 47 47 45 52 20 74    DROP TRIGGER t
5790: 37 74 3b 0a 20 20 20 20 44 52 4f 50 20 54 52 49  7t;.    DROP TRI
57a0: 47 47 45 52 20 74 37 74 61 3b 0a 20 20 20 20 43  GGER t7ta;.    C
57b0: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74 37  REATE TRIGGER t7
57c0: 74 20 42 45 46 4f 52 45 20 44 45 4c 45 54 45 20  t BEFORE DELETE 
57d0: 4f 4e 20 74 37 20 42 45 47 49 4e 0a 20 20 20 20  ON t7 BEGIN.    
57e0: 20 20 55 50 44 41 54 45 20 74 37 20 73 65 74 20    UPDATE t7 set 
57f0: 72 6f 77 69 64 20 3d 20 38 20 57 48 45 52 45 20  rowid = 8 WHERE 
5800: 72 6f 77 69 64 3d 31 3b 0a 20 20 20 20 45 4e 44  rowid=1;.    END
5810: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49  ;.    CREATE TRI
5820: 47 47 45 52 20 74 37 74 61 20 41 46 54 45 52 20  GGER t7ta AFTER 
5830: 44 45 4c 45 54 45 20 4f 4e 20 74 37 20 42 45 47  DELETE ON t7 BEG
5840: 49 4e 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  IN.      INSERT 
5850: 49 4e 54 4f 20 74 38 20 56 41 4c 55 45 53 28 27  INTO t8 VALUES('
5860: 61 66 74 65 72 20 66 69 72 65 64 20 27 20 7c 7c  after fired ' ||
5870: 20 6f 6c 64 2e 72 6f 77 69 64 29 3b 0a 20 20 20   old.rowid);.   
5880: 20 45 4e 44 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64   END;.  }.} {}.d
5890: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 43 2d  o_test triggerC-
58a0: 37 2e 38 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  7.8 {.  execsql 
58b0: 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  {.    BEGIN;.   
58c0: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
58d0: 37 20 57 48 45 52 45 20 61 20 3d 20 33 3b 0a 20  7 WHERE a = 3;. 
58e0: 20 20 20 20 20 53 45 4c 45 43 54 20 72 6f 77 69       SELECT rowi
58f0: 64 2c 20 2a 20 46 52 4f 4d 20 74 37 3b 0a 20 20  d, * FROM t7;.  
5900: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
5910: 4d 20 74 38 3b 0a 20 20 20 20 52 4f 4c 4c 42 41  M t8;.    ROLLBA
5920: 43 4b 3b 0a 20 20 7d 0a 7d 20 7b 33 20 35 20 36  CK;.  }.} {3 5 6
5930: 20 38 20 31 20 32 20 7b 61 66 74 65 72 20 66 69   8 1 2 {after fi
5940: 72 65 64 20 32 7d 7d 0a 64 6f 5f 74 65 73 74 20  red 2}}.do_test 
5950: 74 72 69 67 67 65 72 43 2d 37 2e 39 20 7b 0a 20  triggerC-7.9 {. 
5960: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
5970: 45 47 49 4e 3b 0a 20 20 20 20 20 20 44 45 4c 45  EGIN;.      DELE
5980: 54 45 20 46 52 4f 4d 20 74 37 20 57 48 45 52 45  TE FROM t7 WHERE
5990: 20 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 53 45   a = 1;.      SE
59a0: 4c 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52  LECT rowid, * FR
59b0: 4f 4d 20 74 37 3b 0a 20 20 20 20 20 20 53 45 4c  OM t7;.      SEL
59c0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 38 3b 0a 20  ECT * FROM t8;. 
59d0: 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d     ROLLBACK;.  }
59e0: 0a 7d 20 7b 32 20 33 20 34 20 33 20 35 20 36 20  .} {2 3 4 3 5 6 
59f0: 38 20 31 20 32 7d 0a 0a 23 20 54 69 63 6b 65 74  8 1 2}..# Ticket
5a00: 20 5b 65 32 35 64 39 65 61 37 37 31 66 65 62 63   [e25d9ea771febc
5a10: 39 63 33 31 31 39 32 38 63 31 63 30 31 63 33 31  9c311928c1c01c31
5a20: 36 33 64 63 62 32 36 36 34 33 5d 0a 23 20 0a 64  63dcb26643].# .d
5a30: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 43 2d  o_test triggerC-
5a40: 39 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  9.1 {.  execsql 
5a50: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
5a60: 4c 45 20 74 39 28 61 2c 62 29 3b 0a 20 20 20 20  LE t9(a,b);.    
5a70: 43 52 45 41 54 45 20 49 4e 44 45 58 20 74 39 62  CREATE INDEX t9b
5a80: 20 4f 4e 20 74 39 28 62 29 3b 0a 20 20 20 20 49   ON t9(b);.    I
5a90: 4e 53 45 52 54 20 49 4e 54 4f 20 74 39 20 56 41  NSERT INTO t9 VA
5aa0: 4c 55 45 53 28 31 2c 30 29 3b 0a 20 20 20 20 49  LUES(1,0);.    I
5ab0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 39 20 56 41  NSERT INTO t9 VA
5ac0: 4c 55 45 53 28 32 2c 31 29 3b 0a 20 20 20 20 49  LUES(2,1);.    I
5ad0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 39 20 56 41  NSERT INTO t9 VA
5ae0: 4c 55 45 53 28 33 2c 32 29 3b 0a 20 20 20 20 49  LUES(3,2);.    I
5af0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 39 20 53 45  NSERT INTO t9 SE
5b00: 4c 45 43 54 20 61 2b 33 2c 20 61 2b 32 20 46 52  LECT a+3, a+2 FR
5b10: 4f 4d 20 74 39 3b 0a 20 20 20 20 49 4e 53 45 52  OM t9;.    INSER
5b20: 54 20 49 4e 54 4f 20 74 39 20 53 45 4c 45 43 54  T INTO t9 SELECT
5b30: 20 61 2b 36 2c 20 61 2b 35 20 46 52 4f 4d 20 74   a+6, a+5 FROM t
5b40: 39 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 61 20  9;.    SELECT a 
5b50: 46 52 4f 4d 20 74 39 20 4f 52 44 45 52 20 42 59  FROM t9 ORDER BY
5b60: 20 61 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 33   a;.  }.} {1 2 3
5b70: 20 34 20 35 20 36 20 37 20 38 20 39 20 31 30 20   4 5 6 7 8 9 10 
5b80: 31 31 20 31 32 7d 0a 64 6f 5f 74 65 73 74 20 74  11 12}.do_test t
5b90: 72 69 67 67 65 72 43 2d 39 2e 32 20 7b 0a 20 20  riggerC-9.2 {.  
5ba0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
5bb0: 45 41 54 45 20 54 52 49 47 47 45 52 20 74 39 72  EATE TRIGGER t9r
5bc0: 31 20 41 46 54 45 52 20 44 45 4c 45 54 45 20 4f  1 AFTER DELETE O
5bd0: 4e 20 74 39 20 42 45 47 49 4e 0a 20 20 20 20 20  N t9 BEGIN.     
5be0: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 39 20   DELETE FROM t9 
5bf0: 57 48 45 52 45 20 62 3d 6f 6c 64 2e 61 3b 0a 20  WHERE b=old.a;. 
5c00: 20 20 20 45 4e 44 3b 0a 20 20 20 20 44 45 4c 45     END;.    DELE
5c10: 54 45 20 46 52 4f 4d 20 74 39 20 57 48 45 52 45  TE FROM t9 WHERE
5c20: 20 62 3d 34 3b 0a 20 20 20 20 53 45 4c 45 43 54   b=4;.    SELECT
5c30: 20 61 20 46 52 4f 4d 20 74 39 20 4f 52 44 45 52   a FROM t9 ORDER
5c40: 20 42 59 20 61 3b 0a 20 20 7d 0a 7d 20 7b 31 20   BY a;.  }.} {1 
5c50: 32 20 33 20 34 7d 0a 0a 23 20 41 74 20 6f 6e 65  2 3 4}..# At one
5c60: 20 70 6f 69 6e 74 20 28 62 65 74 77 65 65 6e 20   point (between 
5c70: 76 65 72 73 69 6f 6e 73 20 33 2e 36 2e 31 38 20  versions 3.6.18 
5c80: 61 6e 64 20 33 2e 36 2e 32 30 20 69 6e 63 6c 75  and 3.6.20 inclu
5c90: 73 69 76 65 29 2c 20 61 6e 20 55 50 44 41 54 45  sive), an UPDATE
5ca0: 20 0a 23 20 74 68 61 74 20 66 69 72 65 64 20 61   .# that fired a
5cb0: 20 42 45 46 4f 52 45 20 74 72 69 67 67 65 72 20   BEFORE trigger 
5cc0: 74 68 61 74 20 69 74 73 65 6c 66 20 75 70 64 61  that itself upda
5cd0: 74 65 64 20 74 68 65 20 73 61 6d 65 20 72 6f 77  ted the same row
5ce0: 20 61 73 20 74 68 65 20 0a 23 20 73 74 61 74 65   as the .# state
5cf0: 6d 65 6e 74 20 63 61 75 73 69 6e 67 20 69 74 20  ment causing it 
5d00: 74 6f 20 66 69 72 65 20 77 61 73 20 63 61 75 73  to fire was caus
5d10: 69 6e 67 20 61 20 73 74 72 61 6e 67 65 20 73 69  ing a strange si
5d20: 64 65 2d 65 66 66 65 63 74 3a 20 54 68 65 20 0a  de-effect: The .
5d30: 23 20 76 61 6c 75 65 73 20 75 70 64 61 74 65 64  # values updated
5d40: 20 62 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e   by the statemen
5d50: 74 20 77 69 74 68 69 6e 20 74 68 65 20 74 72 69  t within the tri
5d60: 67 67 65 72 20 77 65 72 65 20 62 65 69 6e 67 20  gger were being 
5d70: 6f 76 65 72 77 72 69 74 74 65 6e 20 0a 23 20 62  overwritten .# b
5d80: 79 20 74 68 65 20 76 61 6c 75 65 73 20 69 6e 20  y the values in 
5d90: 74 68 65 20 6e 65 77 2e 2a 20 61 72 72 61 79 2c  the new.* array,
5da0: 20 65 76 65 6e 20 69 66 20 74 68 6f 73 65 20 76   even if those v
5db0: 61 6c 75 65 73 20 77 65 72 65 20 6e 6f 74 20 0a  alues were not .
5dc0: 23 20 74 68 65 6d 73 65 6c 76 65 73 20 77 72 69  # themselves wri
5dd0: 74 74 65 6e 20 62 79 20 74 68 65 20 70 61 72 65  tten by the pare
5de0: 6e 74 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  nt UPDATE statem
5df0: 65 6e 74 2e 0a 23 0a 23 20 54 65 63 68 6e 69 63  ent..#.# Technic
5e00: 61 6c 6c 79 20 73 70 65 61 6b 69 6e 67 20 74 68  ally speaking th
5e10: 69 73 20 77 61 73 20 6e 6f 74 20 61 20 62 75 67  is was not a bug
5e20: 2e 20 54 68 65 20 53 51 4c 69 74 65 20 64 6f 63  . The SQLite doc
5e30: 75 6d 65 6e 74 61 74 69 6f 6e 20 73 61 79 73 0a  umentation says.
5e40: 23 20 74 68 61 74 20 69 66 20 61 20 42 45 46 4f  # that if a BEFO
5e50: 52 45 20 55 50 44 41 54 45 20 6f 72 20 42 45 46  RE UPDATE or BEF
5e60: 4f 52 45 20 44 45 4c 45 54 45 20 74 72 69 67 67  ORE DELETE trigg
5e70: 65 72 20 6d 6f 64 69 66 69 65 73 20 6f 72 20 64  er modifies or d
5e80: 65 6c 65 74 65 73 20 74 68 65 0a 23 20 72 6f 77  eletes the.# row
5e90: 20 74 68 61 74 20 74 68 65 20 70 61 72 65 6e 74   that the parent
5ea0: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 70   statement is op
5eb0: 65 72 61 74 69 6e 67 20 6f 6e 20 74 68 65 20 72  erating on the r
5ec0: 65 73 75 6c 74 73 20 61 72 65 20 75 6e 64 65 66  esults are undef
5ed0: 69 6e 65 64 2e 20 0a 23 20 42 75 74 20 61 73 20  ined. .# But as 
5ee0: 6f 66 20 33 2e 36 2e 32 31 20 62 65 68 61 76 69  of 3.6.21 behavi
5ef0: 6f 75 72 20 69 73 20 72 65 73 74 6f 72 65 64 20  our is restored 
5f00: 74 6f 20 74 68 65 20 77 61 79 20 69 74 20 77 61  to the way it wa
5f10: 73 20 69 6e 20 76 65 72 73 69 6f 6e 73 0a 23 20  s in versions.# 
5f20: 33 2e 36 2e 31 37 20 61 6e 64 20 65 61 72 6c 69  3.6.17 and earli
5f30: 65 72 20 74 6f 20 61 76 6f 69 64 20 63 61 75 73  er to avoid caus
5f40: 69 6e 67 20 75 6e 6e 65 63 65 73 73 61 72 79 20  ing unnecessary 
5f50: 64 69 66 66 69 63 75 6c 74 69 65 73 2e 0a 23 0a  difficulties..#.
5f60: 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 43  do_test triggerC
5f70: 2d 31 30 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  -10.1 {.  execsq
5f80: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
5f90: 41 42 4c 45 20 74 31 30 28 61 2c 20 75 70 64 61  ABLE t10(a, upda
5fa0: 74 65 63 6e 74 20 44 45 46 41 55 4c 54 20 30 29  tecnt DEFAULT 0)
5fb0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49  ;.    CREATE TRI
5fc0: 47 47 45 52 20 74 31 30 5f 62 75 20 42 45 46 4f  GGER t10_bu BEFO
5fd0: 52 45 20 55 50 44 41 54 45 20 4f 46 20 61 20 4f  RE UPDATE OF a O
5fe0: 4e 20 74 31 30 20 42 45 47 49 4e 0a 20 20 20 20  N t10 BEGIN.    
5ff0: 20 20 55 50 44 41 54 45 20 74 31 30 20 53 45 54    UPDATE t10 SET
6000: 20 75 70 64 61 74 65 63 6e 74 20 3d 20 75 70 64   updatecnt = upd
6010: 61 74 65 63 6e 74 2b 31 20 57 48 45 52 45 20 72  atecnt+1 WHERE r
6020: 6f 77 69 64 20 3d 20 6f 6c 64 2e 72 6f 77 69 64  owid = old.rowid
6030: 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 20 20 49  ;.    END;.    I
6040: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 30 28 61  NSERT INTO t10(a
6050: 29 20 56 41 4c 55 45 53 28 27 68 65 6c 6c 6f 27  ) VALUES('hello'
6060: 29 3b 0a 20 20 7d 0a 0a 20 20 23 20 42 65 66 6f  );.  }..  # Befo
6070: 72 65 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 77  re the problem w
6080: 61 73 20 66 69 78 65 64 2c 20 74 61 62 6c 65 20  as fixed, table 
6090: 74 31 30 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69  t10 would contai
60a0: 6e 20 74 68 65 20 74 75 70 6c 65 20 0a 20 20 23  n the tuple .  #
60b0: 20 28 77 6f 72 6c 64 2c 20 30 29 20 61 66 74 65   (world, 0) afte
60c0: 72 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 66 6f  r running the fo
60d0: 6c 6c 6f 77 69 6e 67 20 73 63 72 69 70 74 20 28  llowing script (
60e0: 62 65 63 61 75 73 65 20 74 68 65 20 76 61 6c 75  because the valu
60f0: 65 0a 20 20 23 20 31 20 77 72 69 74 74 65 6e 20  e.  # 1 written 
6100: 74 6f 20 63 6f 6c 75 6d 6e 20 22 75 70 64 61 74  to column "updat
6110: 65 63 6e 74 22 20 77 61 73 20 63 6c 6f 62 62 65  ecnt" was clobbe
6120: 72 65 64 20 62 79 20 74 68 65 20 6f 6c 64 20 76  red by the old v
6130: 61 6c 75 65 20 30 29 2e 0a 20 20 23 0a 20 20 65  alue 0)..  #.  e
6140: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 50 44  xecsql {.    UPD
6150: 41 54 45 20 74 31 30 20 53 45 54 20 61 20 3d 20  ATE t10 SET a = 
6160: 27 77 6f 72 6c 64 27 3b 0a 20 20 20 20 53 45 4c  'world';.    SEL
6170: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 30 3b 0a  ECT * FROM t10;.
6180: 20 20 7d 0a 7d 20 7b 77 6f 72 6c 64 20 31 7d 0a    }.} {world 1}.
6190: 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72  .do_test trigger
61a0: 43 2d 31 30 2e 32 20 7b 0a 20 20 65 78 65 63 73  C-10.2 {.  execs
61b0: 71 6c 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20  ql {.    UPDATE 
61c0: 74 31 30 20 53 45 54 20 61 20 3d 20 27 74 63 6c  t10 SET a = 'tcl
61d0: 27 2c 20 75 70 64 61 74 65 63 6e 74 20 3d 20 35  ', updatecnt = 5
61e0: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
61f0: 52 4f 4d 20 74 31 30 3b 0a 20 20 7d 0a 7d 20 7b  ROM t10;.  }.} {
6200: 74 63 6c 20 35 7d 0a 0a 64 6f 5f 74 65 73 74 20  tcl 5}..do_test 
6210: 74 72 69 67 67 65 72 43 2d 31 30 2e 33 20 7b 0a  triggerC-10.3 {.
6220: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
6230: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 31  CREATE TABLE t11
6240: 28 0a 20 20 20 20 20 20 63 31 2c 20 20 20 63 32  (.      c1,   c2
6250: 2c 20 20 63 33 2c 20 20 63 34 2c 20 20 63 35 2c  ,  c3,  c4,  c5,
6260: 20 20 63 36 2c 20 20 63 37 2c 20 20 63 38 2c 20    c6,  c7,  c8, 
6270: 20 63 39 2c 20 63 31 30 2c 0a 20 20 20 20 20 20   c9, c10,.      
6280: 63 31 31 2c 20 63 31 32 2c 20 63 31 33 2c 20 63  c11, c12, c13, c
6290: 31 34 2c 20 63 31 35 2c 20 63 31 36 2c 20 63 31  14, c15, c16, c1
62a0: 37 2c 20 63 31 38 2c 20 63 31 39 2c 20 63 32 30  7, c18, c19, c20
62b0: 2c 0a 20 20 20 20 20 20 63 32 31 2c 20 63 32 32  ,.      c21, c22
62c0: 2c 20 63 32 33 2c 20 63 32 34 2c 20 63 32 35 2c  , c23, c24, c25,
62d0: 20 63 32 36 2c 20 63 32 37 2c 20 63 32 38 2c 20   c26, c27, c28, 
62e0: 63 32 39 2c 20 63 33 30 2c 0a 20 20 20 20 20 20  c29, c30,.      
62f0: 63 33 31 2c 20 63 33 32 2c 20 63 33 33 2c 20 63  c31, c32, c33, c
6300: 33 34 2c 20 63 33 35 2c 20 63 33 36 2c 20 63 33  34, c35, c36, c3
6310: 37 2c 20 63 33 38 2c 20 63 33 39 2c 20 63 34 30  7, c38, c39, c40
6320: 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 43 52 45  .    );..    CRE
6330: 41 54 45 20 54 52 49 47 47 45 52 20 74 31 31 5f  ATE TRIGGER t11_
6340: 62 75 20 42 45 46 4f 52 45 20 55 50 44 41 54 45  bu BEFORE UPDATE
6350: 20 4f 46 20 63 31 20 4f 4e 20 74 31 31 20 42 45   OF c1 ON t11 BE
6360: 47 49 4e 0a 20 20 20 20 20 20 55 50 44 41 54 45  GIN.      UPDATE
6370: 20 74 31 31 20 53 45 54 20 63 33 31 20 3d 20 63   t11 SET c31 = c
6380: 33 31 2b 31 2c 20 63 33 32 3d 63 33 32 2b 31 20  31+1, c32=c32+1 
6390: 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20 6f 6c  WHERE rowid = ol
63a0: 64 2e 72 6f 77 69 64 3b 0a 20 20 20 20 45 4e 44  d.rowid;.    END
63b0: 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  ;..    INSERT IN
63c0: 54 4f 20 74 31 31 20 56 41 4c 55 45 53 28 0a 20  TO t11 VALUES(. 
63d0: 20 20 20 20 20 31 2c 20 20 20 32 2c 20 20 33 2c       1,   2,  3,
63e0: 20 20 34 2c 20 20 35 2c 20 20 36 2c 20 20 37 2c    4,  5,  6,  7,
63f0: 20 20 38 2c 20 20 39 2c 20 31 30 2c 0a 20 20 20    8,  9, 10,.   
6400: 20 20 20 31 31 2c 20 31 32 2c 20 31 33 2c 20 31     11, 12, 13, 1
6410: 34 2c 20 31 35 2c 20 31 36 2c 20 31 37 2c 20 31  4, 15, 16, 17, 1
6420: 38 2c 20 31 39 2c 20 32 30 2c 0a 20 20 20 20 20  8, 19, 20,.     
6430: 20 32 31 2c 20 32 32 2c 20 32 33 2c 20 32 34 2c   21, 22, 23, 24,
6440: 20 32 35 2c 20 32 36 2c 20 32 37 2c 20 32 38 2c   25, 26, 27, 28,
6450: 20 32 39 2c 20 33 30 2c 0a 20 20 20 20 20 20 33   29, 30,.      3
6460: 31 2c 20 33 32 2c 20 33 33 2c 20 33 34 2c 20 33  1, 32, 33, 34, 3
6470: 35 2c 20 33 36 2c 20 33 37 2c 20 33 38 2c 20 33  5, 36, 37, 38, 3
6480: 39 2c 20 34 30 0a 20 20 20 20 29 3b 0a 20 20 7d  9, 40.    );.  }
6490: 0a 0a 20 20 23 20 42 65 66 6f 72 65 20 74 68 65  ..  # Before the
64a0: 20 70 72 6f 62 6c 65 6d 20 77 61 73 20 66 69 78   problem was fix
64b0: 65 64 2c 20 74 61 62 6c 65 20 74 31 30 20 77 6f  ed, table t10 wo
64c0: 75 6c 64 20 63 6f 6e 74 61 69 6e 20 74 68 65 20  uld contain the 
64d0: 74 75 70 6c 65 20 0a 20 20 23 20 28 77 6f 72 6c  tuple .  # (worl
64e0: 64 2c 20 30 29 20 61 66 74 65 72 20 72 75 6e 6e  d, 0) after runn
64f0: 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ing the followin
6500: 67 20 73 63 72 69 70 74 20 28 62 65 63 61 75 73  g script (becaus
6510: 65 20 74 68 65 20 76 61 6c 75 65 0a 20 20 23 20  e the value.  # 
6520: 31 20 77 72 69 74 74 65 6e 20 74 6f 20 63 6f 6c  1 written to col
6530: 75 6d 6e 20 22 75 70 64 61 74 65 63 6e 74 22 20  umn "updatecnt" 
6540: 77 61 73 20 63 6c 6f 62 62 65 72 65 64 20 62 79  was clobbered by
6550: 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 20 30   the old value 0
6560: 29 2e 0a 20 20 23 0a 20 20 65 78 65 63 73 71 6c  )..  #.  execsql
6570: 20 7b 0a 20 20 20 20 55 50 44 41 54 45 20 74 31   {.    UPDATE t1
6580: 31 20 53 45 54 20 63 34 3d 33 35 2c 20 63 33 33  1 SET c4=35, c33
6590: 3d 32 32 2c 20 63 31 3d 35 3b 0a 20 20 20 20 53  =22, c1=5;.    S
65a0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 31  ELECT * FROM t11
65b0: 3b 0a 20 20 7d 20 0a 7d 20 7b 35 20 32 20 33 20  ;.  } .} {5 2 3 
65c0: 33 35 20 35 20 36 20 37 20 38 20 39 20 31 30 20  35 5 6 7 8 9 10 
65d0: 31 31 20 31 32 20 31 33 20 31 34 20 31 35 20 31  11 12 13 14 15 1
65e0: 36 20 31 37 20 31 38 20 31 39 20 32 30 20 32 31  6 17 18 19 20 21
65f0: 20 32 32 20 32 33 20 32 34 20 32 35 20 32 36 20   22 23 24 25 26 
6600: 32 37 20 32 38 20 32 39 20 33 30 20 33 32 20 33  27 28 29 30 32 3
6610: 33 20 32 32 20 33 34 20 33 35 20 33 36 20 33 37  3 22 34 35 36 37
6620: 20 33 38 20 33 39 20 34 30 7d 0a 0a 23 2d 2d 2d   38 39 40}..#---
6630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6670: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68  ------.# Test th
6680: 61 74 20 62 75 67 20 5b 33 37 31 62 61 62 35 64  at bug [371bab5d
6690: 36 35 5d 20 68 61 73 20 62 65 65 6e 20 66 69 78  65] has been fix
66a0: 65 64 2e 20 42 45 46 4f 52 45 20 49 4e 53 45 52  ed. BEFORE INSER
66b0: 54 20 61 6e 64 20 49 4e 53 54 45 41 44 20 4f 46  T and INSTEAD OF
66c0: 0a 23 20 49 4e 53 45 52 54 20 74 72 69 67 67 65  .# INSERT trigge
66d0: 72 73 20 77 69 74 68 20 74 68 65 20 44 45 46 41  rs with the DEFA
66e0: 55 4c 54 20 56 41 4c 55 45 53 20 49 4e 53 45 52  ULT VALUES INSER
66f0: 54 20 73 79 6e 74 61 78 2e 0a 23 0a 64 6f 5f 74  T syntax..#.do_t
6700: 65 73 74 20 74 72 69 67 67 65 72 43 2d 31 31 2e  est triggerC-11.
6710: 30 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  0 {.  catchsql {
6720: 20 44 52 4f 50 20 54 41 42 4c 45 20 6c 6f 67 20   DROP TABLE log 
6730: 7d 0a 20 20 65 78 65 63 73 71 6c 20 20 7b 20 43  }.  execsql  { C
6740: 52 45 41 54 45 20 54 41 42 4c 45 20 6c 6f 67 28  REATE TABLE log(
6750: 61 2c 20 62 29 20 7d 0a 7d 20 7b 7d 0a 0a 66 6f  a, b) }.} {}..fo
6760: 72 65 61 63 68 20 7b 74 65 73 74 6e 6f 20 74 62  reach {testno tb
6770: 6c 20 64 65 66 61 75 6c 74 73 7d 20 7b 0a 20 20  l defaults} {.  
6780: 31 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  1 "CREATE TABLE 
6790: 74 31 28 61 2c 20 62 29 22 20 20 20 20 20 20 20  t1(a, b)"       
67a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67b0: 20 20 20 7b 7b 7d 20 7b 7d 7d 0a 20 20 32 20 22     {{} {}}.  2 "
67c0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
67d0: 61 20 44 45 46 41 55 4c 54 20 31 2c 20 62 20 44  a DEFAULT 1, b D
67e0: 45 46 41 55 4c 54 20 27 61 62 63 27 29 22 20 20  EFAULT 'abc')"  
67f0: 7b 31 20 61 62 63 7d 0a 20 20 33 20 22 43 52 45  {1 abc}.  3 "CRE
6800: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
6810: 62 20 44 45 46 41 55 4c 54 20 34 2e 35 29 22 20  b DEFAULT 4.5)" 
6820: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 7b 7d               {{}
6830: 20 34 2e 35 7d 0a 7d 20 7b 0a 20 20 64 6f 5f 74   4.5}.} {.  do_t
6840: 65 73 74 20 74 72 69 67 67 65 72 43 2d 31 31 2e  est triggerC-11.
6850: 24 74 65 73 74 6e 6f 2e 31 20 7b 0a 20 20 20 20  $testno.1 {.    
6860: 63 61 74 63 68 73 71 6c 20 7b 20 44 52 4f 50 20  catchsql { DROP 
6870: 54 41 42 4c 45 20 74 31 20 7d 0a 20 20 20 20 65  TABLE t1 }.    e
6880: 78 65 63 73 71 6c 20 7b 20 44 45 4c 45 54 45 20  xecsql { DELETE 
6890: 46 52 4f 4d 20 6c 6f 67 20 7d 0a 20 20 20 20 65  FROM log }.    e
68a0: 78 65 63 73 71 6c 20 24 74 62 6c 0a 20 20 20 20  xecsql $tbl.    
68b0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
68c0: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74  CREATE TRIGGER t
68d0: 74 31 20 42 45 46 4f 52 45 20 49 4e 53 45 52 54  t1 BEFORE INSERT
68e0: 20 4f 4e 20 74 31 20 42 45 47 49 4e 20 0a 20 20   ON t1 BEGIN .  
68f0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
6900: 4f 20 6c 6f 67 20 56 41 4c 55 45 53 28 6e 65 77  O log VALUES(new
6910: 2e 61 2c 20 6e 65 77 2e 62 29 3b 0a 20 20 20 20  .a, new.b);.    
6920: 20 20 45 4e 44 3b 0a 20 20 20 20 20 20 49 4e 53    END;.      INS
6930: 45 52 54 20 49 4e 54 4f 20 74 31 20 44 45 46 41  ERT INTO t1 DEFA
6940: 55 4c 54 20 56 41 4c 55 45 53 3b 0a 20 20 20 20  ULT VALUES;.    
6950: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
6960: 6c 6f 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 24  log;.    }.  } $
6970: 64 65 66 61 75 6c 74 73 0a 0a 20 20 64 6f 5f 74  defaults..  do_t
6980: 65 73 74 20 74 72 69 67 67 65 72 43 2d 31 31 2e  est triggerC-11.
6990: 24 74 65 73 74 6e 6f 2e 32 20 7b 0a 20 20 20 20  $testno.2 {.    
69a0: 65 78 65 63 73 71 6c 20 7b 20 44 45 4c 45 54 45  execsql { DELETE
69b0: 20 46 52 4f 4d 20 6c 6f 67 20 7d 0a 20 20 20 20   FROM log }.    
69c0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
69d0: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74  CREATE TRIGGER t
69e0: 74 32 20 41 46 54 45 52 20 49 4e 53 45 52 54 20  t2 AFTER INSERT 
69f0: 4f 4e 20 74 31 20 42 45 47 49 4e 20 0a 20 20 20  ON t1 BEGIN .   
6a00: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
6a10: 20 6c 6f 67 20 56 41 4c 55 45 53 28 6e 65 77 2e   log VALUES(new.
6a20: 61 2c 20 6e 65 77 2e 62 29 3b 0a 20 20 20 20 20  a, new.b);.     
6a30: 20 45 4e 44 3b 0a 20 20 20 20 20 20 49 4e 53 45   END;.      INSE
6a40: 52 54 20 49 4e 54 4f 20 74 31 20 44 45 46 41 55  RT INTO t1 DEFAU
6a50: 4c 54 20 56 41 4c 55 45 53 3b 0a 20 20 20 20 20  LT VALUES;.     
6a60: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6c   SELECT * FROM l
6a70: 6f 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 5b 63  og;.    }.  } [c
6a80: 6f 6e 63 61 74 20 24 64 65 66 61 75 6c 74 73 20  oncat $defaults 
6a90: 24 64 65 66 61 75 6c 74 73 5d 0a 0a 20 20 64 6f  $defaults]..  do
6aa0: 5f 74 65 73 74 20 74 72 69 67 67 65 72 43 2d 31  _test triggerC-1
6ab0: 31 2e 24 74 65 73 74 6e 6f 2e 33 20 7b 0a 20 20  1.$testno.3 {.  
6ac0: 20 20 65 78 65 63 73 71 6c 20 7b 20 44 52 4f 50    execsql { DROP
6ad0: 20 54 52 49 47 47 45 52 20 74 74 31 20 7d 0a 20   TRIGGER tt1 }. 
6ae0: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 44 45 4c     execsql { DEL
6af0: 45 54 45 20 46 52 4f 4d 20 6c 6f 67 20 7d 0a 20  ETE FROM log }. 
6b00: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
6b10: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
6b20: 31 20 44 45 46 41 55 4c 54 20 56 41 4c 55 45 53  1 DEFAULT VALUES
6b30: 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  ;.      SELECT *
6b40: 20 46 52 4f 4d 20 6c 6f 67 3b 0a 20 20 20 20 7d   FROM log;.    }
6b50: 0a 20 20 7d 20 24 64 65 66 61 75 6c 74 73 0a 7d  .  } $defaults.}
6b60: 20 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65   .do_test trigge
6b70: 72 43 2d 31 31 2e 34 20 7b 0a 20 20 63 61 74 63  rC-11.4 {.  catc
6b80: 68 73 71 6c 20 7b 20 44 52 4f 50 20 54 41 42 4c  hsql { DROP TABL
6b90: 45 20 74 32 20 7d 0a 20 20 65 78 65 63 73 71 6c  E t2 }.  execsql
6ba0: 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52   {.    DELETE FR
6bb0: 4f 4d 20 6c 6f 67 3b 0a 20 20 20 20 43 52 45 41  OM log;.    CREA
6bc0: 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62  TE TABLE t2(a, b
6bd0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 56 49  );.    CREATE VI
6be0: 45 57 20 76 32 20 41 53 20 53 45 4c 45 43 54 20  EW v2 AS SELECT 
6bf0: 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 43  * FROM t2;.    C
6c00: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74 76  REATE TRIGGER tv
6c10: 32 20 49 4e 53 54 45 41 44 20 4f 46 20 49 4e 53  2 INSTEAD OF INS
6c20: 45 52 54 20 4f 4e 20 76 32 20 42 45 47 49 4e 0a  ERT ON v2 BEGIN.
6c30: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
6c40: 4f 20 6c 6f 67 20 56 41 4c 55 45 53 28 6e 65 77  O log VALUES(new
6c50: 2e 61 2c 20 6e 65 77 2e 62 29 3b 0a 20 20 20 20  .a, new.b);.    
6c60: 45 4e 44 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  END;.    INSERT 
6c70: 49 4e 54 4f 20 76 32 20 44 45 46 41 55 4c 54 20  INTO v2 DEFAULT 
6c80: 56 41 4c 55 45 53 3b 0a 20 20 20 20 53 45 4c 45  VALUES;.    SELE
6c90: 43 54 20 61 2c 20 62 2c 20 61 20 49 53 20 4e 55  CT a, b, a IS NU
6ca0: 4c 4c 2c 20 62 20 49 53 20 4e 55 4c 4c 20 46 52  LL, b IS NULL FR
6cb0: 4f 4d 20 6c 6f 67 3b 0a 20 20 7d 0a 7d 20 7b 7b  OM log;.  }.} {{
6cc0: 7d 20 7b 7d 20 31 20 31 7d 0a 0a 64 6f 5f 74 65  } {} 1 1}..do_te
6cd0: 73 74 20 74 72 69 67 67 65 72 43 2d 31 32 2e 31  st triggerC-12.1
6ce0: 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20   {.  db close.  
6cf0: 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72  file delete -for
6d00: 63 65 20 74 65 73 74 2e 64 62 0a 20 20 73 71 6c  ce test.db.  sql
6d10: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
6d20: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
6d30: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
6d40: 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45  (a, b);.    INSE
6d50: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
6d60: 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53  S(1, 2);.    INS
6d70: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
6d80: 45 53 28 33 2c 20 34 29 3b 0a 20 20 20 20 49 4e  ES(3, 4);.    IN
6d90: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
6da0: 55 45 53 28 35 2c 20 36 29 3b 0a 20 20 20 20 43  UES(5, 6);.    C
6db0: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74 72  REATE TRIGGER tr
6dc0: 31 20 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f  1 AFTER INSERT O
6dd0: 4e 20 74 31 20 42 45 47 49 4e 20 53 45 4c 45 43  N t1 BEGIN SELEC
6de0: 54 20 31 20 3b 20 45 4e 44 20 3b 0a 20 20 20 20  T 1 ; END ;.    
6df0: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
6e00: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
6e10: 65 72 3b 0a 20 20 7d 0a 7d 20 7b 32 7d 0a 64 6f  er;.  }.} {2}.do
6e20: 5f 74 65 73 74 20 74 72 69 67 67 65 72 43 2d 31  _test triggerC-1
6e30: 32 2e 32 20 7b 0a 20 20 64 62 20 65 76 61 6c 20  2.2 {.  db eval 
6e40: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
6e50: 74 31 20 7d 20 7b 0a 20 20 20 20 69 66 20 7b 24  t1 } {.    if {$
6e60: 61 20 3d 3d 20 33 7d 20 7b 20 65 78 65 63 73 71  a == 3} { execsq
6e70: 6c 20 7b 20 44 52 4f 50 20 54 52 49 47 47 45 52  l { DROP TRIGGER
6e80: 20 74 72 31 20 7d 20 7d 0a 20 20 7d 0a 20 20 65   tr1 } }.  }.  e
6e90: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
6ea0: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 73 71  count(*) FROM sq
6eb0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 7d 0a 7d 20  lite_master }.} 
6ec0: 7b 31 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  {1}..do_execsql_
6ed0: 74 65 73 74 20 74 72 69 67 67 65 72 43 2d 31 33  test triggerC-13
6ee0: 2e 31 20 7b 0a 20 20 50 52 41 47 4d 41 20 72 65  .1 {.  PRAGMA re
6ef0: 63 75 72 73 69 76 65 5f 74 72 69 67 67 65 72 73  cursive_triggers
6f00: 20 3d 20 4f 4e 3b 0a 20 20 43 52 45 41 54 45 20   = ON;.  CREATE 
6f10: 54 41 42 4c 45 20 74 31 32 28 61 2c 20 62 29 3b  TABLE t12(a, b);
6f20: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
6f30: 31 32 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b  12 VALUES(1, 2);
6f40: 0a 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45  .  CREATE TRIGGE
6f50: 52 20 74 72 31 32 20 41 46 54 45 52 20 55 50 44  R tr12 AFTER UPD
6f60: 41 54 45 20 4f 4e 20 74 31 32 20 42 45 47 49 4e  ATE ON t12 BEGIN
6f70: 0a 20 20 20 20 55 50 44 41 54 45 20 74 31 32 20  .    UPDATE t12 
6f80: 53 45 54 20 61 3d 6e 65 77 2e 61 2b 31 2c 20 62  SET a=new.a+1, b
6f90: 3d 6e 65 77 2e 62 2b 31 3b 0a 20 20 45 4e 44 3b  =new.b+1;.  END;
6fa0: 0a 7d 20 7b 7d 0a 64 6f 5f 63 61 74 63 68 73 71  .} {}.do_catchsq
6fb0: 6c 5f 74 65 73 74 20 74 72 69 67 67 65 72 43 2d  l_test triggerC-
6fc0: 31 33 2e 32 20 7b 0a 20 20 55 50 44 41 54 45 20  13.2 {.  UPDATE 
6fd0: 74 31 32 20 53 45 54 20 61 3d 61 2b 31 2c 20 62  t12 SET a=a+1, b
6fe0: 3d 62 2b 31 3b 0a 7d 20 7b 31 20 7b 74 6f 6f 20  =b+1;.} {1 {too 
6ff0: 6d 61 6e 79 20 6c 65 76 65 6c 73 20 6f 66 20 74  many levels of t
7000: 72 69 67 67 65 72 20 72 65 63 75 72 73 69 6f 6e  rigger recursion
7010: 7d 7d 0a 0a 0a 0a 66 69 6e 69 73 68 5f 74 65 73  }}....finish_tes
7020: 74 0a                                            t.