/ Hex Artifact Content
Login

Artifact 02c690febf608ae20b9af86184a9867f79855b1d:


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 22 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 5b 65 78 70  ROM t22) >= [exp
1a90: 72 20 24 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52  r $SQLITE_MAX_TR
1aa0: 49 47 47 45 52 5f 44 45 50 54 48 20 2f 20 32 5d  IGGER_DEPTH / 2]
1ab0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ac0: 20 20 20 54 48 45 4e 20 52 41 49 53 45 28 49 47     THEN RAISE(IG
1ad0: 4e 4f 52 45 29 0a 20 20 20 20 20 20 20 20 20 20  NORE).          
1ae0: 20 20 20 20 20 20 20 20 45 4c 53 45 20 4e 55 4c          ELSE NUL
1af0: 4c 20 45 4e 44 3b 0a 20 20 20 20 45 4e 44 3b 0a  L END;.    END;.
1b00: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
1b10: 20 74 32 32 20 56 41 4c 55 45 53 28 31 29 3b 0a   t22 VALUES(1);.
1b20: 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74      SELECT count
1b30: 28 2a 29 20 46 52 4f 4d 20 74 32 32 3b 0a 20 20  (*) FROM t22;.  
1b40: 22 0a 7d 20 5b 6c 69 73 74 20 5b 65 78 70 72 20  ".} [list [expr 
1b50: 24 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47  $SQLITE_MAX_TRIG
1b60: 47 45 52 5f 44 45 50 54 48 20 2f 20 32 5d 5d 0a  GER_DEPTH / 2]].
1b70: 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72  .do_test trigger
1b80: 43 2d 32 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  C-2.3 {.  execsq
1b90: 6c 20 22 0a 20 20 20 20 43 52 45 41 54 45 20 54  l ".    CREATE T
1ba0: 41 42 4c 45 20 74 32 33 28 78 20 50 52 49 4d 41  ABLE t23(x PRIMA
1bb0: 52 59 20 4b 45 59 29 3b 0a 0a 20 20 20 20 43 52  RY KEY);..    CR
1bc0: 45 41 54 45 20 54 52 49 47 47 45 52 20 74 32 33  EATE TRIGGER t23
1bd0: 61 20 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f  a AFTER INSERT O
1be0: 4e 20 74 32 33 20 42 45 47 49 4e 0a 20 20 20 20  N t23 BEGIN.    
1bf0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
1c00: 33 20 56 41 4c 55 45 53 28 6e 65 77 2e 78 20 2b  3 VALUES(new.x +
1c10: 20 31 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 0a 20   1);.    END;.. 
1c20: 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45     CREATE TRIGGE
1c30: 52 20 74 32 33 62 20 42 45 46 4f 52 45 20 49 4e  R t23b BEFORE IN
1c40: 53 45 52 54 20 4f 4e 20 74 32 33 20 42 45 47 49  SERT ON t23 BEGI
1c50: 4e 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 43  N.      SELECT C
1c60: 41 53 45 20 57 48 45 4e 20 6e 65 77 2e 78 3e 5b  ASE WHEN new.x>[
1c70: 65 78 70 72 20 24 53 51 4c 49 54 45 5f 4d 41 58  expr $SQLITE_MAX
1c80: 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 2f  _TRIGGER_DEPTH /
1c90: 20 32 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20   2].            
1ca0: 20 20 20 20 20 20 54 48 45 4e 20 52 41 49 53 45        THEN RAISE
1cb0: 28 49 47 4e 4f 52 45 29 0a 20 20 20 20 20 20 20  (IGNORE).       
1cc0: 20 20 20 20 20 20 20 20 20 20 20 45 4c 53 45 20             ELSE 
1cd0: 4e 55 4c 4c 20 45 4e 44 3b 0a 20 20 20 20 45 4e  NULL END;.    EN
1ce0: 44 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54 20 49  D;..    INSERT I
1cf0: 4e 54 4f 20 74 32 33 20 56 41 4c 55 45 53 28 31  NTO t23 VALUES(1
1d00: 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f  );.    SELECT co
1d10: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 33 3b  unt(*) FROM t23;
1d20: 0a 20 20 22 0a 7d 20 5b 6c 69 73 74 20 5b 65 78  .  ".} [list [ex
1d30: 70 72 20 24 53 51 4c 49 54 45 5f 4d 41 58 5f 54  pr $SQLITE_MAX_T
1d40: 52 49 47 47 45 52 5f 44 45 50 54 48 20 2f 20 32  RIGGER_DEPTH / 2
1d50: 5d 5d 0a 20 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  ]]. ..#---------
1d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
1da0: 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 74   This block of t
1db0: 65 73 74 73 2c 20 74 72 69 67 67 65 72 43 2d 33  ests, triggerC-3
1dc0: 2e 2a 2c 20 74 65 73 74 20 74 68 61 74 20 53 51  .*, test that SQ
1dd0: 4c 69 74 65 20 74 68 72 6f 77 73 20 61 6e 20 65  Lite throws an e
1de0: 78 63 65 70 74 69 6f 6e 0a 23 20 77 68 65 6e 20  xception.# when 
1df0: 69 74 20 64 65 74 65 63 74 73 20 65 78 63 65 73  it detects exces
1e00: 73 69 76 65 20 72 65 63 75 72 73 69 6f 6e 2e 0a  sive recursion..
1e10: 23 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65  #.do_test trigge
1e20: 72 43 2d 33 2e 31 2e 31 20 7b 0a 20 20 65 78 65  rC-3.1.1 {.  exe
1e30: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
1e40: 45 20 54 41 42 4c 45 20 74 33 28 61 2c 20 62 29  E TABLE t3(a, b)
1e50: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49  ;.    CREATE TRI
1e60: 47 47 45 52 20 74 33 69 20 41 46 54 45 52 20 49  GGER t3i AFTER I
1e70: 4e 53 45 52 54 20 4f 4e 20 74 33 20 42 45 47 49  NSERT ON t3 BEGI
1e80: 4e 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46  N.      DELETE F
1e90: 52 4f 4d 20 74 33 20 57 48 45 52 45 20 72 6f 77  ROM t3 WHERE row
1ea0: 69 64 20 3d 20 6e 65 77 2e 72 6f 77 69 64 3b 0a  id = new.rowid;.
1eb0: 20 20 20 20 45 4e 44 3b 0a 20 20 20 20 43 52 45      END;.    CRE
1ec0: 41 54 45 20 54 52 49 47 47 45 52 20 74 33 64 20  ATE TRIGGER t3d 
1ed0: 41 46 54 45 52 20 44 45 4c 45 54 45 20 4f 4e 20  AFTER DELETE ON 
1ee0: 74 33 20 42 45 47 49 4e 0a 20 20 20 20 20 20 49  t3 BEGIN.      I
1ef0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41  NSERT INTO t3 VA
1f00: 4c 55 45 53 28 6f 6c 64 2e 61 2c 20 6f 6c 64 2e  LUES(old.a, old.
1f10: 62 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 7d  b);.    END;.  }
1f20: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 74 72  .} {}.do_test tr
1f30: 69 67 67 65 72 43 2d 33 2e 31 2e 32 20 7b 0a 20  iggerC-3.1.2 {. 
1f40: 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45   catchsql { INSE
1f50: 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45  RT INTO t3 VALUE
1f60: 53 28 30 2c 30 29 20 7d 0a 7d 20 7b 31 20 7b 74  S(0,0) }.} {1 {t
1f70: 6f 6f 20 6d 61 6e 79 20 6c 65 76 65 6c 73 20 6f  oo many levels o
1f80: 66 20 74 72 69 67 67 65 72 20 72 65 63 75 72 73  f trigger recurs
1f90: 69 6f 6e 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 72  ion}}.do_test tr
1fa0: 69 67 67 65 72 43 2d 33 2e 31 2e 33 20 7b 0a 20  iggerC-3.1.3 {. 
1fb0: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
1fc0: 54 20 2a 20 46 52 4f 4d 20 74 33 20 7d 0a 7d 20  T * FROM t3 }.} 
1fd0: 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 74 72 69 67  {}..do_test trig
1fe0: 67 65 72 43 2d 33 2e 32 2e 31 20 7b 0a 20 20 65  gerC-3.2.1 {.  e
1ff0: 78 65 63 73 71 6c 20 22 0a 20 20 20 20 43 52 45  xecsql ".    CRE
2000: 41 54 45 20 54 41 42 4c 45 20 74 33 62 28 78 29  ATE TABLE t3b(x)
2010: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49  ;.    CREATE TRI
2020: 47 47 45 52 20 74 33 62 69 20 41 46 54 45 52 20  GGER t3bi AFTER 
2030: 49 4e 53 45 52 54 20 4f 4e 20 74 33 62 20 57 48  INSERT ON t3b WH
2040: 45 4e 20 6e 65 77 2e 78 3c 5b 65 78 70 72 20 24  EN new.x<[expr $
2050: 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47  SQLITE_MAX_TRIGG
2060: 45 52 5f 44 45 50 54 48 20 2a 20 32 5d 20 42 45  ER_DEPTH * 2] BE
2070: 47 49 4e 0a 20 20 20 20 20 20 49 4e 53 45 52 54  GIN.      INSERT
2080: 20 49 4e 54 4f 20 74 33 62 20 56 41 4c 55 45 53   INTO t3b VALUES
2090: 28 6e 65 77 2e 78 2b 31 29 3b 0a 20 20 20 20 45  (new.x+1);.    E
20a0: 4e 44 3b 0a 20 20 22 0a 20 20 63 61 74 63 68 73  ND;.  ".  catchs
20b0: 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20  ql {.    INSERT 
20c0: 49 4e 54 4f 20 74 33 62 20 56 41 4c 55 45 53 28  INTO t3b VALUES(
20d0: 31 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 74 6f  1);.  }.} {1 {to
20e0: 6f 20 6d 61 6e 79 20 6c 65 76 65 6c 73 20 6f 66  o many levels of
20f0: 20 74 72 69 67 67 65 72 20 72 65 63 75 72 73 69   trigger recursi
2100: 6f 6e 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69  on}}.do_test tri
2110: 67 67 65 72 43 2d 33 2e 32 2e 32 20 7b 0a 20 20  ggerC-3.2.2 {.  
2120: 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20  db eval {SELECT 
2130: 2a 20 46 52 4f 4d 20 74 33 62 7d 0a 7d 20 7b 7d  * FROM t3b}.} {}
2140: 0a 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65  ..do_test trigge
2150: 72 43 2d 33 2e 33 2e 31 20 7b 0a 20 20 63 61 74  rC-3.3.1 {.  cat
2160: 63 68 73 71 6c 20 22 0a 20 20 20 20 49 4e 53 45  chsql ".    INSE
2170: 52 54 20 49 4e 54 4f 20 74 33 62 20 56 41 4c 55  RT INTO t3b VALU
2180: 45 53 28 5b 65 78 70 72 20 24 53 51 4c 49 54 45  ES([expr $SQLITE
2190: 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50  _MAX_TRIGGER_DEP
21a0: 54 48 20 2b 20 31 5d 29 3b 0a 20 20 22 0a 7d 20  TH + 1]);.  ".} 
21b0: 7b 30 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 74  {0 {}}.do_test t
21c0: 72 69 67 67 65 72 43 2d 33 2e 33 2e 32 20 7b 0a  riggerC-3.3.2 {.
21d0: 20 20 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43    db eval {SELEC
21e0: 54 20 63 6f 75 6e 74 28 2a 29 2c 20 6d 61 78 28  T count(*), max(
21f0: 78 29 2c 20 6d 69 6e 28 78 29 20 46 52 4f 4d 20  x), min(x) FROM 
2200: 74 33 62 7d 0a 7d 20 5b 6c 69 73 74 20 24 53 51  t3b}.} [list $SQ
2210: 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52  LITE_MAX_TRIGGER
2220: 5f 44 45 50 54 48 20 5b 65 78 70 72 20 24 53 51  _DEPTH [expr $SQ
2230: 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52  LITE_MAX_TRIGGER
2240: 5f 44 45 50 54 48 20 2a 20 32 5d 20 5b 65 78 70  _DEPTH * 2] [exp
2250: 72 20 24 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52  r $SQLITE_MAX_TR
2260: 49 47 47 45 52 5f 44 45 50 54 48 20 2b 20 31 5d  IGGER_DEPTH + 1]
2270: 5d 0a 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67  ]..do_test trigg
2280: 65 72 43 2d 33 2e 34 2e 31 20 7b 0a 20 20 63 61  erC-3.4.1 {.  ca
2290: 74 63 68 73 71 6c 20 22 0a 20 20 20 20 44 45 4c  tchsql ".    DEL
22a0: 45 54 45 20 46 52 4f 4d 20 74 33 62 3b 0a 20 20  ETE FROM t3b;.  
22b0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
22c0: 62 20 56 41 4c 55 45 53 28 5b 65 78 70 72 20 24  b VALUES([expr $
22d0: 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47  SQLITE_MAX_TRIGG
22e0: 45 52 5f 44 45 50 54 48 20 2d 20 31 5d 29 3b 0a  ER_DEPTH - 1]);.
22f0: 20 20 22 0a 7d 20 7b 31 20 7b 74 6f 6f 20 6d 61    ".} {1 {too ma
2300: 6e 79 20 6c 65 76 65 6c 73 20 6f 66 20 74 72 69  ny levels of tri
2310: 67 67 65 72 20 72 65 63 75 72 73 69 6f 6e 7d 7d  gger recursion}}
2320: 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72  .do_test trigger
2330: 43 2d 33 2e 34 2e 32 20 7b 0a 20 20 64 62 20 65  C-3.4.2 {.  db e
2340: 76 61 6c 20 7b 53 45 4c 45 43 54 20 63 6f 75 6e  val {SELECT coun
2350: 74 28 2a 29 2c 20 6d 61 78 28 78 29 2c 20 6d 69  t(*), max(x), mi
2360: 6e 28 78 29 20 46 52 4f 4d 20 74 33 62 7d 0a 7d  n(x) FROM t3b}.}
2370: 20 7b 30 20 7b 7d 20 7b 7d 7d 0a 0a 64 6f 5f 74   {0 {} {}}..do_t
2380: 65 73 74 20 74 72 69 67 67 65 72 43 2d 33 2e 35  est triggerC-3.5
2390: 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6c  .1 {.  sqlite3_l
23a0: 69 6d 69 74 20 64 62 20 53 51 4c 49 54 45 5f 4c  imit db SQLITE_L
23b0: 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50  IMIT_TRIGGER_DEP
23c0: 54 48 20 20 5b 65 78 70 72 20 24 53 51 4c 49 54  TH  [expr $SQLIT
23d0: 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45  E_MAX_TRIGGER_DE
23e0: 50 54 48 20 2f 20 31 30 5d 0a 20 20 63 61 74 63  PTH / 10].  catc
23f0: 68 73 71 6c 20 22 0a 20 20 20 20 49 4e 53 45 52  hsql ".    INSER
2400: 54 20 49 4e 54 4f 20 74 33 62 20 56 41 4c 55 45  T INTO t3b VALUE
2410: 53 28 5b 65 78 70 72 20 28 24 53 51 4c 49 54 45  S([expr ($SQLITE
2420: 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50  _MAX_TRIGGER_DEP
2430: 54 48 20 2a 20 32 29 20 2d 20 28 24 53 51 4c 49  TH * 2) - ($SQLI
2440: 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44  TE_MAX_TRIGGER_D
2450: 45 50 54 48 20 2f 20 31 30 29 20 2b 20 31 5d 29  EPTH / 10) + 1])
2460: 3b 0a 20 20 22 0a 7d 20 7b 30 20 7b 7d 7d 0a 64  ;.  ".} {0 {}}.d
2470: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 43 2d  o_test triggerC-
2480: 33 2e 35 2e 32 20 7b 0a 20 20 64 62 20 65 76 61  3.5.2 {.  db eva
2490: 6c 20 7b 53 45 4c 45 43 54 20 63 6f 75 6e 74 28  l {SELECT count(
24a0: 2a 29 2c 20 6d 61 78 28 78 29 2c 20 6d 69 6e 28  *), max(x), min(
24b0: 78 29 20 46 52 4f 4d 20 74 33 62 7d 0a 7d 20 5b  x) FROM t3b}.} [
24c0: 6c 69 73 74 20 5b 65 78 70 72 20 24 53 51 4c 49  list [expr $SQLI
24d0: 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44  TE_MAX_TRIGGER_D
24e0: 45 50 54 48 20 2f 20 31 30 5d 20 5b 65 78 70 72  EPTH / 10] [expr
24f0: 20 24 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49   $SQLITE_MAX_TRI
2500: 47 47 45 52 5f 44 45 50 54 48 20 2a 20 32 5d 20  GGER_DEPTH * 2] 
2510: 5b 65 78 70 72 20 28 24 53 51 4c 49 54 45 5f 4d  [expr ($SQLITE_M
2520: 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  AX_TRIGGER_DEPTH
2530: 20 2a 20 32 29 20 2d 20 28 24 53 51 4c 49 54 45   * 2) - ($SQLITE
2540: 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50  _MAX_TRIGGER_DEP
2550: 54 48 20 2f 20 31 30 29 20 2b 20 31 5d 5d 0a 0a  TH / 10) + 1]]..
2560: 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 43  do_test triggerC
2570: 2d 33 2e 35 2e 33 20 7b 0a 20 20 63 61 74 63 68  -3.5.3 {.  catch
2580: 73 71 6c 20 22 0a 20 20 20 20 44 45 4c 45 54 45  sql ".    DELETE
2590: 20 46 52 4f 4d 20 74 33 62 3b 0a 20 20 20 20 49   FROM t3b;.    I
25a0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 62 20 56  NSERT INTO t3b V
25b0: 41 4c 55 45 53 28 5b 65 78 70 72 20 28 24 53 51  ALUES([expr ($SQ
25c0: 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52  LITE_MAX_TRIGGER
25d0: 5f 44 45 50 54 48 20 2a 20 32 29 20 2d 20 28 24  _DEPTH * 2) - ($
25e0: 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47  SQLITE_MAX_TRIGG
25f0: 45 52 5f 44 45 50 54 48 20 2f 20 31 30 29 5d 29  ER_DEPTH / 10)])
2600: 3b 0a 20 20 22 0a 7d 20 7b 31 20 7b 74 6f 6f 20  ;.  ".} {1 {too 
2610: 6d 61 6e 79 20 6c 65 76 65 6c 73 20 6f 66 20 74  many levels of t
2620: 72 69 67 67 65 72 20 72 65 63 75 72 73 69 6f 6e  rigger recursion
2630: 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67  }}.do_test trigg
2640: 65 72 43 2d 33 2e 35 2e 34 20 7b 0a 20 20 64 62  erC-3.5.4 {.  db
2650: 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 63 6f   eval {SELECT co
2660: 75 6e 74 28 2a 29 2c 20 6d 61 78 28 78 29 2c 20  unt(*), max(x), 
2670: 6d 69 6e 28 78 29 20 46 52 4f 4d 20 74 33 62 7d  min(x) FROM t3b}
2680: 0a 7d 20 7b 30 20 7b 7d 20 7b 7d 7d 0a 0a 64 6f  .} {0 {} {}}..do
2690: 5f 74 65 73 74 20 74 72 69 67 67 65 72 43 2d 33  _test triggerC-3
26a0: 2e 36 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65 33  .6.1 {.  sqlite3
26b0: 5f 6c 69 6d 69 74 20 64 62 20 53 51 4c 49 54 45  _limit db SQLITE
26c0: 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44  _LIMIT_TRIGGER_D
26d0: 45 50 54 48 20 31 0a 20 20 63 61 74 63 68 73 71  EPTH 1.  catchsq
26e0: 6c 20 22 0a 20 20 20 20 49 4e 53 45 52 54 20 49  l ".    INSERT I
26f0: 4e 54 4f 20 74 33 62 20 56 41 4c 55 45 53 28 5b  NTO t3b VALUES([
2700: 65 78 70 72 20 24 53 51 4c 49 54 45 5f 4d 41 58  expr $SQLITE_MAX
2710: 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 2a  _TRIGGER_DEPTH *
2720: 20 32 5d 29 3b 0a 20 20 22 0a 7d 20 7b 30 20 7b   2]);.  ".} {0 {
2730: 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67  }}.do_test trigg
2740: 65 72 43 2d 33 2e 36 2e 32 20 7b 0a 20 20 64 62  erC-3.6.2 {.  db
2750: 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 63 6f   eval {SELECT co
2760: 75 6e 74 28 2a 29 2c 20 6d 61 78 28 78 29 2c 20  unt(*), max(x), 
2770: 6d 69 6e 28 78 29 20 46 52 4f 4d 20 74 33 62 7d  min(x) FROM t3b}
2780: 0a 7d 20 5b 6c 69 73 74 20 31 20 5b 65 78 70 72  .} [list 1 [expr
2790: 20 24 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49   $SQLITE_MAX_TRI
27a0: 47 47 45 52 5f 44 45 50 54 48 20 2a 20 32 5d 20  GGER_DEPTH * 2] 
27b0: 5b 65 78 70 72 20 24 53 51 4c 49 54 45 5f 4d 41  [expr $SQLITE_MA
27c0: 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20  X_TRIGGER_DEPTH 
27d0: 2a 20 32 5d 5d 0a 0a 64 6f 5f 74 65 73 74 20 74  * 2]]..do_test t
27e0: 72 69 67 67 65 72 43 2d 33 2e 36 2e 33 20 7b 0a  riggerC-3.6.3 {.
27f0: 20 20 63 61 74 63 68 73 71 6c 20 22 0a 20 20 20    catchsql ".   
2800: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 33 62   DELETE FROM t3b
2810: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
2820: 4f 20 74 33 62 20 56 41 4c 55 45 53 28 5b 65 78  O t3b VALUES([ex
2830: 70 72 20 28 24 53 51 4c 49 54 45 5f 4d 41 58 5f  pr ($SQLITE_MAX_
2840: 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 2a 20  TRIGGER_DEPTH * 
2850: 32 29 20 2d 20 31 5d 29 3b 0a 20 20 22 0a 7d 20  2) - 1]);.  ".} 
2860: 7b 31 20 7b 74 6f 6f 20 6d 61 6e 79 20 6c 65 76  {1 {too many lev
2870: 65 6c 73 20 6f 66 20 74 72 69 67 67 65 72 20 72  els of trigger r
2880: 65 63 75 72 73 69 6f 6e 7d 7d 0a 64 6f 5f 74 65  ecursion}}.do_te
2890: 73 74 20 74 72 69 67 67 65 72 43 2d 33 2e 36 2e  st triggerC-3.6.
28a0: 34 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b 53  4 {.  db eval {S
28b0: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 2c 20  ELECT count(*), 
28c0: 6d 61 78 28 78 29 2c 20 6d 69 6e 28 78 29 20 46  max(x), min(x) F
28d0: 52 4f 4d 20 74 33 62 7d 0a 7d 20 7b 30 20 7b 7d  ROM t3b}.} {0 {}
28e0: 20 7b 7d 7d 0a 73 71 6c 69 74 65 33 5f 6c 69 6d   {}}.sqlite3_lim
28f0: 69 74 20 64 62 20 53 51 4c 49 54 45 5f 4c 49 4d  it db SQLITE_LIM
2900: 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  IT_TRIGGER_DEPTH
2910: 20 24 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49   $SQLITE_MAX_TRI
2920: 47 47 45 52 5f 44 45 50 54 48 0a 0a 0a 23 2d 2d  GGER_DEPTH...#--
2930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2970: 2d 2d 2d 2d 2d 0a 23 20 54 68 69 73 20 6e 65 78  -----.# This nex
2980: 74 20 62 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73  t block of tests
2990: 2c 20 74 72 69 67 67 65 72 43 2d 34 2e 2a 2c 20  , triggerC-4.*, 
29a0: 63 68 65 63 6b 73 20 74 68 61 74 20 61 66 66 69  checks that affi
29b0: 6e 69 74 79 20 0a 23 20 74 72 61 6e 73 66 6f 72  nity .# transfor
29c0: 6d 61 74 69 6f 6e 73 20 61 6e 64 20 63 6f 6e 73  mations and cons
29d0: 74 72 61 69 6e 74 20 70 72 6f 63 65 73 73 69 6e  traint processin
29e0: 67 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 61  g is performed a
29f0: 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 0a 23  t the correct .#
2a00: 20 74 69 6d 65 73 20 72 65 6c 61 74 69 76 65 20   times relative 
2a10: 74 6f 20 42 45 46 4f 52 45 20 61 6e 64 20 41 46  to BEFORE and AF
2a20: 54 45 52 20 74 72 69 67 67 65 72 73 2e 0a 23 0a  TER triggers..#.
2a30: 23 20 46 6f 72 20 61 6e 20 49 4e 53 45 52 54 20  # For an INSERT 
2a40: 73 74 61 74 65 6d 65 6e 74 2c 20 66 6f 72 20 65  statement, for e
2a50: 61 63 68 20 72 6f 77 20 74 6f 20 62 65 20 69 6e  ach row to be in
2a60: 73 65 72 74 65 64 3a 0a 23 0a 23 20 20 20 31 2e  serted:.#.#   1.
2a70: 20 41 70 70 6c 79 20 61 66 66 69 6e 69 74 69 65   Apply affinitie
2a80: 73 20 74 6f 20 6e 6f 6e 2d 72 6f 77 69 64 20 76  s to non-rowid v
2a90: 61 6c 75 65 73 20 74 6f 20 62 65 20 69 6e 73 65  alues to be inse
2aa0: 72 74 65 64 2e 0a 23 20 20 20 32 2e 20 46 69 72  rted..#   2. Fir
2ab0: 65 20 42 45 46 4f 52 45 20 74 72 69 67 67 65 72  e BEFORE trigger
2ac0: 73 2e 0a 23 20 20 20 33 2e 20 50 72 6f 63 65 73  s..#   3. Proces
2ad0: 73 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 23  s constraints..#
2ae0: 20 20 20 34 2e 20 49 6e 73 65 72 74 20 6e 65 77     4. Insert new
2af0: 20 72 65 63 6f 72 64 2e 0a 23 20 20 20 35 2e 20   record..#   5. 
2b00: 46 69 72 65 20 41 46 54 45 52 20 74 72 69 67 67  Fire AFTER trigg
2b10: 65 72 73 2e 0a 23 0a 23 20 49 66 20 74 68 65 20  ers..#.# If the 
2b20: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 72 6f 77  value of the row
2b30: 69 64 20 66 69 65 6c 64 20 69 73 20 74 6f 20 62  id field is to b
2b40: 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
2b50: 61 73 73 69 67 6e 65 64 2c 20 69 74 20 69 73 0a  assigned, it is.
2b60: 23 20 73 65 74 20 74 6f 20 2d 31 20 69 6e 20 74  # set to -1 in t
2b70: 68 65 20 6e 65 77 2e 2a 20 72 65 63 6f 72 64 2e  he new.* record.
2b80: 20 45 76 65 6e 20 69 66 20 69 74 20 69 73 20 65   Even if it is e
2b90: 78 70 6c 69 63 69 74 6c 79 20 73 65 74 20 74 6f  xplicitly set to
2ba0: 20 4e 55 4c 4c 0a 23 20 62 79 20 74 68 65 20 49   NULL.# by the I
2bb0: 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 2e  NSERT statement.
2bc0: 0a 23 0a 23 20 46 6f 72 20 61 6e 20 55 50 44 41  .#.# For an UPDA
2bd0: 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 66 6f  TE statement, fo
2be0: 72 20 65 61 63 68 20 72 6f 77 20 74 6f 20 62 65  r each row to be
2bf0: 20 64 65 6c 65 74 65 64 3a 0a 23 0a 23 20 20 20   deleted:.#.#   
2c00: 31 2e 20 41 70 70 6c 79 20 61 66 66 69 6e 69 74  1. Apply affinit
2c10: 69 65 73 20 74 6f 20 6e 6f 6e 2d 72 6f 77 69 64  ies to non-rowid
2c20: 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 69 6e   values to be in
2c30: 73 65 72 74 65 64 2e 0a 23 20 20 20 32 2e 20 46  serted..#   2. F
2c40: 69 72 65 20 42 45 46 4f 52 45 20 74 72 69 67 67  ire BEFORE trigg
2c50: 65 72 73 2e 0a 23 20 20 20 33 2e 20 50 72 6f 63  ers..#   3. Proc
2c60: 65 73 73 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  ess constraints.
2c70: 0a 23 20 20 20 34 2e 20 49 6e 73 65 72 74 20 6e  .#   4. Insert n
2c80: 65 77 20 72 65 63 6f 72 64 2e 0a 23 20 20 20 35  ew record..#   5
2c90: 2e 20 46 69 72 65 20 41 46 54 45 52 20 74 72 69  . Fire AFTER tri
2ca0: 67 67 65 72 73 2e 0a 23 0a 23 20 46 6f 72 20 61  ggers..#.# For a
2cb0: 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
2cc0: 74 2c 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20  t, for each row 
2cd0: 74 6f 20 62 65 20 64 65 6c 65 74 65 64 3a 0a 23  to be deleted:.#
2ce0: 0a 23 20 20 20 31 2e 20 46 69 72 65 20 42 45 46  .#   1. Fire BEF
2cf0: 4f 52 45 20 74 72 69 67 67 65 72 73 2e 0a 23 20  ORE triggers..# 
2d00: 20 20 32 2e 20 52 65 6d 6f 76 65 20 64 61 74 61    2. Remove data
2d10: 62 61 73 65 20 72 65 63 6f 72 64 2e 0a 23 20 20  base record..#  
2d20: 20 33 2e 20 46 69 72 65 20 41 46 54 45 52 20 74   3. Fire AFTER t
2d30: 72 69 67 67 65 72 73 2e 0a 23 0a 23 20 57 68 65  riggers..#.# Whe
2d40: 6e 20 61 20 6e 75 6d 65 72 69 63 20 76 61 6c 75  n a numeric valu
2d50: 65 20 74 68 61 74 20 61 73 20 61 6e 20 65 78 61  e that as an exa
2d60: 63 74 20 69 6e 74 65 67 65 72 20 72 65 70 72 65  ct integer repre
2d70: 73 65 6e 74 61 74 69 6f 6e 20 69 73 20 73 74 6f  sentation is sto
2d80: 72 65 64 0a 23 20 69 6e 20 61 20 63 6f 6c 75 6d  red.# in a colum
2d90: 6e 20 77 69 74 68 20 52 45 41 4c 20 61 66 66 69  n with REAL affi
2da0: 6e 69 74 79 2c 20 69 74 20 69 73 20 61 63 74 75  nity, it is actu
2db0: 61 6c 6c 79 20 73 74 6f 72 65 64 20 61 73 20 61  ally stored as a
2dc0: 6e 20 69 6e 74 65 67 65 72 2e 0a 23 20 54 68 65  n integer..# The
2dd0: 73 65 20 74 65 73 74 73 20 63 68 65 63 6b 20 74  se tests check t
2de0: 68 61 74 20 74 68 65 20 74 79 70 65 6f 66 28 29  hat the typeof()
2df0: 20 73 75 63 68 20 76 61 6c 75 65 73 20 69 73 20   such values is 
2e00: 61 6c 77 61 79 73 20 27 72 65 61 6c 27 2c 0a 23  always 'real',.#
2e10: 20 6e 6f 74 20 27 69 6e 74 65 67 65 72 27 2e 0a   not 'integer'..
2e20: 23 0a 23 20 74 72 69 67 67 65 72 43 2d 34 2e 31  #.# triggerC-4.1
2e30: 2e 2a 3a 20 43 68 65 63 6b 20 74 68 61 74 20 61  .*: Check that a
2e40: 66 66 69 6e 69 74 79 20 74 72 61 6e 73 66 6f 72  ffinity transfor
2e50: 6d 61 74 69 6f 6e 73 20 61 72 65 20 6d 61 64 65  mations are made
2e60: 20 62 65 66 6f 72 65 0a 23 20 20 20 20 20 20 20   before.#       
2e70: 20 20 20 20 20 20 20 20 20 20 74 72 69 67 67 65            trigge
2e80: 72 73 20 61 72 65 20 69 6e 76 6f 6b 65 64 2e 0a  rs are invoked..
2e90: 23 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65  #.do_test trigge
2ea0: 72 43 2d 34 2e 31 2e 31 20 7b 0a 20 20 63 61 74  rC-4.1.1 {.  cat
2eb0: 63 68 73 71 6c 20 7b 20 44 52 4f 50 20 54 41 42  chsql { DROP TAB
2ec0: 4c 45 20 6c 6f 67 20 7d 0a 20 20 63 61 74 63 68  LE log }.  catch
2ed0: 73 71 6c 20 7b 20 44 52 4f 50 20 54 41 42 4c 45  sql { DROP TABLE
2ee0: 20 74 34 20 7d 0a 20 20 65 78 65 63 73 71 6c 20   t4 }.  execsql 
2ef0: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
2f00: 4c 45 20 6c 6f 67 28 74 29 3b 0a 20 20 20 20 43  LE log(t);.    C
2f10: 52 45 41 54 45 20 54 41 42 4c 45 20 74 34 28 61  REATE TABLE t4(a
2f20: 20 54 45 58 54 2c 62 20 49 4e 54 45 47 45 52 2c   TEXT,b INTEGER,
2f30: 63 20 52 45 41 4c 29 3b 0a 20 20 20 20 43 52 45  c REAL);.    CRE
2f40: 41 54 45 20 54 52 49 47 47 45 52 20 74 34 62 69  ATE TRIGGER t4bi
2f50: 20 42 45 46 4f 52 45 20 49 4e 53 45 52 54 20 4f   BEFORE INSERT O
2f60: 4e 20 74 34 20 42 45 47 49 4e 0a 20 20 20 20 20  N t4 BEGIN.     
2f70: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c 6f 67   INSERT INTO log
2f80: 20 56 41 4c 55 45 53 28 6e 65 77 2e 72 6f 77 69   VALUES(new.rowi
2f90: 64 20 7c 7c 20 27 20 27 20 7c 7c 20 74 79 70 65  d || ' ' || type
2fa0: 6f 66 28 6e 65 77 2e 72 6f 77 69 64 29 20 7c 7c  of(new.rowid) ||
2fb0: 20 27 20 27 20 7c 7c 0a 20 20 20 20 20 20 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 6e 65 77 2e 61 20 20 20 20 20 7c       new.a     |
2fe0: 7c 20 27 20 27 20 7c 7c 20 74 79 70 65 6f 66 28  | ' ' || typeof(
2ff0: 6e 65 77 2e 61 29 20 20 20 20 20 7c 7c 20 27 20  new.a)     || ' 
3000: 27 20 7c 7c 0a 20 20 20 20 20 20 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 6e 65 77 2e 62 20 20 20 20 20 7c 7c 20 27    new.b     || '
3030: 20 27 20 7c 7c 20 74 79 70 65 6f 66 28 6e 65 77   ' || typeof(new
3040: 2e 62 29 20 20 20 20 20 7c 7c 20 27 20 27 20 7c  .b)     || ' ' |
3050: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
3060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
3070: 65 77 2e 63 20 20 20 20 20 7c 7c 20 27 20 27 20  ew.c     || ' ' 
3080: 7c 7c 20 74 79 70 65 6f 66 28 6e 65 77 2e 63 29  || typeof(new.c)
3090: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 45 4e  .      );.    EN
30a0: 44 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 52  D;.    CREATE TR
30b0: 49 47 47 45 52 20 74 34 61 69 20 41 46 54 45 52  IGGER t4ai AFTER
30c0: 20 49 4e 53 45 52 54 20 4f 4e 20 74 34 20 42 45   INSERT ON t4 BE
30d0: 47 49 4e 0a 20 20 20 20 20 20 49 4e 53 45 52 54  GIN.      INSERT
30e0: 20 49 4e 54 4f 20 6c 6f 67 20 56 41 4c 55 45 53   INTO log VALUES
30f0: 28 6e 65 77 2e 72 6f 77 69 64 20 7c 7c 20 27 20  (new.rowid || ' 
3100: 27 20 7c 7c 20 74 79 70 65 6f 66 28 6e 65 77 2e  ' || typeof(new.
3110: 72 6f 77 69 64 29 20 7c 7c 20 27 20 27 20 7c 7c  rowid) || ' ' ||
3120: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65                ne
3140: 77 2e 61 20 20 20 20 20 7c 7c 20 27 20 27 20 7c  w.a     || ' ' |
3150: 7c 20 74 79 70 65 6f 66 28 6e 65 77 2e 61 29 20  | typeof(new.a) 
3160: 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c 0a 20 20      || ' ' ||.  
3170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3180: 20 20 20 20 20 20 20 20 20 20 20 6e 65 77 2e 62             new.b
3190: 20 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c 20 74       || ' ' || t
31a0: 79 70 65 6f 66 28 6e 65 77 2e 62 29 20 20 20 20  ypeof(new.b)    
31b0: 20 7c 7c 20 27 20 27 20 7c 7c 0a 20 20 20 20 20   || ' ' ||.     
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d0: 20 20 20 20 20 20 20 20 6e 65 77 2e 63 20 20 20          new.c   
31e0: 20 20 7c 7c 20 27 20 27 20 7c 7c 20 74 79 70 65    || ' ' || type
31f0: 6f 66 28 6e 65 77 2e 63 29 0a 20 20 20 20 20 20  of(new.c).      
3200: 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 20 20  );.    END;.    
3210: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74  CREATE TRIGGER t
3220: 34 62 64 20 42 45 46 4f 52 45 20 44 45 4c 45 54  4bd BEFORE DELET
3230: 45 20 4f 4e 20 74 34 20 42 45 47 49 4e 0a 20 20  E ON t4 BEGIN.  
3240: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3250: 6c 6f 67 20 56 41 4c 55 45 53 28 6f 6c 64 2e 72  log VALUES(old.r
3260: 6f 77 69 64 20 7c 7c 20 27 20 27 20 7c 7c 20 74  owid || ' ' || t
3270: 79 70 65 6f 66 28 6f 6c 64 2e 72 6f 77 69 64 29  ypeof(old.rowid)
3280: 20 7c 7c 20 27 20 27 20 7c 7c 0a 20 20 20 20 20   || ' ' ||.     
3290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32a0: 20 20 20 20 20 20 20 20 6f 6c 64 2e 61 20 20 20          old.a   
32b0: 20 20 7c 7c 20 27 20 27 20 7c 7c 20 74 79 70 65    || ' ' || type
32c0: 6f 66 28 6f 6c 64 2e 61 29 20 20 20 20 20 7c 7c  of(old.a)     ||
32d0: 20 27 20 27 20 7c 7c 0a 20 20 20 20 20 20 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 6f 6c 64 2e 62 20 20 20 20 20 7c       old.b     |
3300: 7c 20 27 20 27 20 7c 7c 20 74 79 70 65 6f 66 28  | ' ' || typeof(
3310: 6f 6c 64 2e 62 29 20 20 20 20 20 7c 7c 20 27 20  old.b)     || ' 
3320: 27 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  ' ||.           
3330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3340: 20 20 6f 6c 64 2e 63 20 20 20 20 20 7c 7c 20 27    old.c     || '
3350: 20 27 20 7c 7c 20 74 79 70 65 6f 66 28 6f 6c 64   ' || typeof(old
3360: 2e 63 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  .c).      );.   
3370: 20 45 4e 44 3b 0a 20 20 20 20 43 52 45 41 54 45   END;.    CREATE
3380: 20 54 52 49 47 47 45 52 20 74 34 61 64 20 41 46   TRIGGER t4ad AF
3390: 54 45 52 20 44 45 4c 45 54 45 20 4f 4e 20 74 34  TER DELETE ON t4
33a0: 20 42 45 47 49 4e 0a 20 20 20 20 20 20 49 4e 53   BEGIN.      INS
33b0: 45 52 54 20 49 4e 54 4f 20 6c 6f 67 20 56 41 4c  ERT INTO log VAL
33c0: 55 45 53 28 6f 6c 64 2e 72 6f 77 69 64 20 7c 7c  UES(old.rowid ||
33d0: 20 27 20 27 20 7c 7c 20 74 79 70 65 6f 66 28 6f   ' ' || typeof(o
33e0: 6c 64 2e 72 6f 77 69 64 29 20 7c 7c 20 27 20 27  ld.rowid) || ' '
33f0: 20 7c 7c 0a 20 20 20 20 20 20 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 6f 6c 64 2e 61 20 20 20 20 20 7c 7c 20 27 20   old.a     || ' 
3420: 27 20 7c 7c 20 74 79 70 65 6f 66 28 6f 6c 64 2e  ' || typeof(old.
3430: 61 29 20 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c  a)     || ' ' ||
3440: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 6c                ol
3460: 64 2e 62 20 20 20 20 20 7c 7c 20 27 20 27 20 7c  d.b     || ' ' |
3470: 7c 20 74 79 70 65 6f 66 28 6f 6c 64 2e 62 29 20  | typeof(old.b) 
3480: 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c 0a 20 20      || ' ' ||.  
3490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34a0: 20 20 20 20 20 20 20 20 20 20 20 6f 6c 64 2e 63             old.c
34b0: 20 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c 20 74       || ' ' || t
34c0: 79 70 65 6f 66 28 6f 6c 64 2e 63 29 0a 20 20 20  ypeof(old.c).   
34d0: 20 20 20 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20     );.    END;. 
34e0: 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45     CREATE TRIGGE
34f0: 52 20 74 34 62 75 20 42 45 46 4f 52 45 20 55 50  R t4bu BEFORE UP
3500: 44 41 54 45 20 4f 4e 20 74 34 20 42 45 47 49 4e  DATE ON t4 BEGIN
3510: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
3520: 54 4f 20 6c 6f 67 20 56 41 4c 55 45 53 28 6f 6c  TO log VALUES(ol
3530: 64 2e 72 6f 77 69 64 20 7c 7c 20 27 20 27 20 7c  d.rowid || ' ' |
3540: 7c 20 74 79 70 65 6f 66 28 6f 6c 64 2e 72 6f 77  | typeof(old.row
3550: 69 64 29 20 7c 7c 20 27 20 27 20 7c 7c 0a 20 20  id) || ' ' ||.  
3560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3570: 20 20 20 20 20 20 20 20 20 20 20 6f 6c 64 2e 61             old.a
3580: 20 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c 20 74       || ' ' || t
3590: 79 70 65 6f 66 28 6f 6c 64 2e 61 29 20 20 20 20  ypeof(old.a)    
35a0: 20 7c 7c 20 27 20 27 20 7c 7c 0a 20 20 20 20 20   || ' ' ||.     
35b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35c0: 20 20 20 20 20 20 20 20 6f 6c 64 2e 62 20 20 20          old.b   
35d0: 20 20 7c 7c 20 27 20 27 20 7c 7c 20 74 79 70 65    || ' ' || type
35e0: 6f 66 28 6f 6c 64 2e 62 29 20 20 20 20 20 7c 7c  of(old.b)     ||
35f0: 20 27 20 27 20 7c 7c 0a 20 20 20 20 20 20 20 20   ' ' ||.        
3600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3610: 20 20 20 20 20 6f 6c 64 2e 63 20 20 20 20 20 7c       old.c     |
3620: 7c 20 27 20 27 20 7c 7c 20 74 79 70 65 6f 66 28  | ' ' || typeof(
3630: 6f 6c 64 2e 63 29 0a 20 20 20 20 20 20 29 3b 0a  old.c).      );.
3640: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
3650: 4f 20 6c 6f 67 20 56 41 4c 55 45 53 28 6e 65 77  O log VALUES(new
3660: 2e 72 6f 77 69 64 20 7c 7c 20 27 20 27 20 7c 7c  .rowid || ' ' ||
3670: 20 74 79 70 65 6f 66 28 6e 65 77 2e 72 6f 77 69   typeof(new.rowi
3680: 64 29 20 7c 7c 20 27 20 27 20 7c 7c 0a 20 20 20  d) || ' ' ||.   
3690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36a0: 20 20 20 20 20 20 20 20 20 20 6e 65 77 2e 61 20            new.a 
36b0: 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c 20 74 79      || ' ' || ty
36c0: 70 65 6f 66 28 6e 65 77 2e 61 29 20 20 20 20 20  peof(new.a)     
36d0: 7c 7c 20 27 20 27 20 7c 7c 0a 20 20 20 20 20 20  || ' ' ||.      
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 6e 65 77 2e 62 20 20 20 20         new.b    
3700: 20 7c 7c 20 27 20 27 20 7c 7c 20 74 79 70 65 6f   || ' ' || typeo
3710: 66 28 6e 65 77 2e 62 29 20 20 20 20 20 7c 7c 20  f(new.b)     || 
3720: 27 20 27 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ' ' ||.         
3730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3740: 20 20 20 20 6e 65 77 2e 63 20 20 20 20 20 7c 7c      new.c     ||
3750: 20 27 20 27 20 7c 7c 20 74 79 70 65 6f 66 28 6e   ' ' || typeof(n
3760: 65 77 2e 63 29 0a 20 20 20 20 20 20 29 3b 0a 20  ew.c).      );. 
3770: 20 20 20 45 4e 44 3b 0a 20 20 20 20 43 52 45 41     END;.    CREA
3780: 54 45 20 54 52 49 47 47 45 52 20 74 34 61 75 20  TE TRIGGER t4au 
3790: 41 46 54 45 52 20 55 50 44 41 54 45 20 4f 4e 20  AFTER UPDATE ON 
37a0: 74 34 20 42 45 47 49 4e 0a 20 20 20 20 20 20 49  t4 BEGIN.      I
37b0: 4e 53 45 52 54 20 49 4e 54 4f 20 6c 6f 67 20 56  NSERT INTO log V
37c0: 41 4c 55 45 53 28 6f 6c 64 2e 72 6f 77 69 64 20  ALUES(old.rowid 
37d0: 7c 7c 20 27 20 27 20 7c 7c 20 74 79 70 65 6f 66  || ' ' || typeof
37e0: 28 6f 6c 64 2e 72 6f 77 69 64 29 20 7c 7c 20 27  (old.rowid) || '
37f0: 20 27 20 7c 7c 0a 20 20 20 20 20 20 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 6f 6c 64 2e 61 20 20 20 20 20 7c 7c 20     old.a     || 
3820: 27 20 27 20 7c 7c 20 74 79 70 65 6f 66 28 6f 6c  ' ' || typeof(ol
3830: 64 2e 61 29 20 20 20 20 20 7c 7c 20 27 20 27 20  d.a)     || ' ' 
3840: 7c 7c 0a 20 20 20 20 20 20 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: 6f 6c 64 2e 62 20 20 20 20 20 7c 7c 20 27 20 27  old.b     || ' '
3870: 20 7c 7c 20 74 79 70 65 6f 66 28 6f 6c 64 2e 62   || typeof(old.b
3880: 29 20 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c 0a  )     || ' ' ||.
3890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 6c 64               old
38b0: 2e 63 20 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c  .c     || ' ' ||
38c0: 20 74 79 70 65 6f 66 28 6f 6c 64 2e 63 29 0a 20   typeof(old.c). 
38d0: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 49 4e       );.      IN
38e0: 53 45 52 54 20 49 4e 54 4f 20 6c 6f 67 20 56 41  SERT INTO log VA
38f0: 4c 55 45 53 28 6e 65 77 2e 72 6f 77 69 64 20 7c  LUES(new.rowid |
3900: 7c 20 27 20 27 20 7c 7c 20 74 79 70 65 6f 66 28  | ' ' || typeof(
3910: 6e 65 77 2e 72 6f 77 69 64 29 20 7c 7c 20 27 20  new.rowid) || ' 
3920: 27 20 7c 7c 0a 20 20 20 20 20 20 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 6e 65 77 2e 61 20 20 20 20 20 7c 7c 20 27    new.a     || '
3950: 20 27 20 7c 7c 20 74 79 70 65 6f 66 28 6e 65 77   ' || typeof(new
3960: 2e 61 29 20 20 20 20 20 7c 7c 20 27 20 27 20 7c  .a)     || ' ' |
3970: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
3980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
3990: 65 77 2e 62 20 20 20 20 20 7c 7c 20 27 20 27 20  ew.b     || ' ' 
39a0: 7c 7c 20 74 79 70 65 6f 66 28 6e 65 77 2e 62 29  || typeof(new.b)
39b0: 20 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c 0a 20       || ' ' ||. 
39c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39d0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 77 2e              new.
39e0: 63 20 20 20 20 20 7c 7c 20 27 20 27 20 7c 7c 20  c     || ' ' || 
39f0: 74 79 70 65 6f 66 28 6e 65 77 2e 63 29 0a 20 20  typeof(new.c).  
3a00: 20 20 20 20 29 3b 0a 20 20 20 20 45 4e 44 3b 0a      );.    END;.
3a10: 20 20 7d 0a 7d 20 7b 7d 0a 66 6f 72 65 61 63 68    }.} {}.foreach
3a20: 20 7b 6e 20 69 6e 73 65 72 74 20 6c 6f 67 7d 20   {n insert log} 
3a30: 7b 0a 0a 20 20 32 20 7b 20 0a 20 20 20 49 4e 53  {..  2 { .   INS
3a40: 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c 55  ERT INTO t4 VALU
3a50: 45 53 28 27 31 27 2c 20 27 31 27 2c 20 27 31 27  ES('1', '1', '1'
3a60: 29 3b 0a 20 20 20 44 45 4c 45 54 45 20 46 52 4f  );.   DELETE FRO
3a70: 4d 20 74 34 3b 0a 20 20 7d 20 7b 0a 20 20 20 20  M t4;.  } {.    
3a80: 2d 31 20 69 6e 74 65 67 65 72 20 31 20 74 65 78  -1 integer 1 tex
3a90: 74 20 31 20 69 6e 74 65 67 65 72 20 31 2e 30 20  t 1 integer 1.0 
3aa0: 72 65 61 6c 20 0a 20 20 20 20 20 31 20 69 6e 74  real .     1 int
3ab0: 65 67 65 72 20 31 20 74 65 78 74 20 31 20 69 6e  eger 1 text 1 in
3ac0: 74 65 67 65 72 20 31 2e 30 20 72 65 61 6c 0a 20  teger 1.0 real. 
3ad0: 20 20 20 20 31 20 69 6e 74 65 67 65 72 20 31 20      1 integer 1 
3ae0: 74 65 78 74 20 31 20 69 6e 74 65 67 65 72 20 31  text 1 integer 1
3af0: 2e 30 20 72 65 61 6c 20 0a 20 20 20 20 20 31 20  .0 real .     1 
3b00: 69 6e 74 65 67 65 72 20 31 20 74 65 78 74 20 31  integer 1 text 1
3b10: 20 69 6e 74 65 67 65 72 20 31 2e 30 20 72 65 61   integer 1.0 rea
3b20: 6c 0a 20 20 7d 0a 0a 20 20 33 20 7b 20 0a 20 20  l.  }..  3 { .  
3b30: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 28   INSERT INTO t4(
3b40: 72 6f 77 69 64 2c 61 2c 62 2c 63 29 20 56 41 4c  rowid,a,b,c) VAL
3b50: 55 45 53 28 34 35 2c 20 34 35 2c 20 34 35 2c 20  UES(45, 45, 45, 
3b60: 34 35 29 3b 0a 20 20 20 44 45 4c 45 54 45 20 46  45);.   DELETE F
3b70: 52 4f 4d 20 74 34 3b 0a 20 20 7d 20 7b 0a 20 20  ROM t4;.  } {.  
3b80: 20 20 34 35 20 69 6e 74 65 67 65 72 20 34 35 20    45 integer 45 
3b90: 74 65 78 74 20 34 35 20 69 6e 74 65 67 65 72 20  text 45 integer 
3ba0: 34 35 2e 30 20 72 65 61 6c 0a 20 20 20 20 34 35  45.0 real.    45
3bb0: 20 69 6e 74 65 67 65 72 20 34 35 20 74 65 78 74   integer 45 text
3bc0: 20 34 35 20 69 6e 74 65 67 65 72 20 34 35 2e 30   45 integer 45.0
3bd0: 20 72 65 61 6c 0a 20 20 20 20 34 35 20 69 6e 74   real.    45 int
3be0: 65 67 65 72 20 34 35 20 74 65 78 74 20 34 35 20  eger 45 text 45 
3bf0: 69 6e 74 65 67 65 72 20 34 35 2e 30 20 72 65 61  integer 45.0 rea
3c00: 6c 0a 20 20 20 20 34 35 20 69 6e 74 65 67 65 72  l.    45 integer
3c10: 20 34 35 20 74 65 78 74 20 34 35 20 69 6e 74 65   45 text 45 inte
3c20: 67 65 72 20 34 35 2e 30 20 72 65 61 6c 0a 20 20  ger 45.0 real.  
3c30: 7d 0a 0a 20 20 34 20 7b 20 0a 20 20 20 49 4e 53  }..  4 { .   INS
3c40: 45 52 54 20 49 4e 54 4f 20 74 34 28 72 6f 77 69  ERT INTO t4(rowi
3c50: 64 2c 61 2c 62 2c 63 29 20 56 41 4c 55 45 53 28  d,a,b,c) VALUES(
3c60: 2d 34 32 2e 30 2c 20 2d 34 32 2e 30 2c 20 2d 34  -42.0, -42.0, -4
3c70: 32 2e 30 2c 20 2d 34 32 2e 30 29 3b 0a 20 20 20  2.0, -42.0);.   
3c80: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 34 3b 0a  DELETE FROM t4;.
3c90: 20 20 7d 20 7b 0a 20 20 20 20 2d 34 32 20 69 6e    } {.    -42 in
3ca0: 74 65 67 65 72 20 2d 34 32 2e 30 20 74 65 78 74  teger -42.0 text
3cb0: 20 2d 34 32 20 69 6e 74 65 67 65 72 20 2d 34 32   -42 integer -42
3cc0: 2e 30 20 72 65 61 6c 20 0a 20 20 20 20 2d 34 32  .0 real .    -42
3cd0: 20 69 6e 74 65 67 65 72 20 2d 34 32 2e 30 20 74   integer -42.0 t
3ce0: 65 78 74 20 2d 34 32 20 69 6e 74 65 67 65 72 20  ext -42 integer 
3cf0: 2d 34 32 2e 30 20 72 65 61 6c 0a 20 20 20 20 2d  -42.0 real.    -
3d00: 34 32 20 69 6e 74 65 67 65 72 20 2d 34 32 2e 30  42 integer -42.0
3d10: 20 74 65 78 74 20 2d 34 32 20 69 6e 74 65 67 65   text -42 intege
3d20: 72 20 2d 34 32 2e 30 20 72 65 61 6c 20 0a 20 20  r -42.0 real .  
3d30: 20 20 2d 34 32 20 69 6e 74 65 67 65 72 20 2d 34    -42 integer -4
3d40: 32 2e 30 20 74 65 78 74 20 2d 34 32 20 69 6e 74  2.0 text -42 int
3d50: 65 67 65 72 20 2d 34 32 2e 30 20 72 65 61 6c 0a  eger -42.0 real.
3d60: 20 20 7d 0a 0a 20 20 35 20 7b 20 0a 20 20 20 49    }..  5 { .   I
3d70: 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 28 72 6f  NSERT INTO t4(ro
3d80: 77 69 64 2c 61 2c 62 2c 63 29 20 56 41 4c 55 45  wid,a,b,c) VALUE
3d90: 53 28 4e 55 4c 4c 2c 20 2d 34 32 2e 34 2c 20 2d  S(NULL, -42.4, -
3da0: 34 32 2e 34 2c 20 2d 34 32 2e 34 29 3b 0a 20 20  42.4, -42.4);.  
3db0: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 34 3b   DELETE FROM t4;
3dc0: 0a 20 20 7d 20 7b 0a 20 20 20 20 2d 31 20 69 6e  .  } {.    -1 in
3dd0: 74 65 67 65 72 20 2d 34 32 2e 34 20 74 65 78 74  teger -42.4 text
3de0: 20 2d 34 32 2e 34 20 72 65 61 6c 20 2d 34 32 2e   -42.4 real -42.
3df0: 34 20 72 65 61 6c 0a 20 20 20 20 20 31 20 69 6e  4 real.     1 in
3e00: 74 65 67 65 72 20 2d 34 32 2e 34 20 74 65 78 74  teger -42.4 text
3e10: 20 2d 34 32 2e 34 20 72 65 61 6c 20 2d 34 32 2e   -42.4 real -42.
3e20: 34 20 72 65 61 6c 0a 20 20 20 20 20 31 20 69 6e  4 real.     1 in
3e30: 74 65 67 65 72 20 2d 34 32 2e 34 20 74 65 78 74  teger -42.4 text
3e40: 20 2d 34 32 2e 34 20 72 65 61 6c 20 2d 34 32 2e   -42.4 real -42.
3e50: 34 20 72 65 61 6c 0a 20 20 20 20 20 31 20 69 6e  4 real.     1 in
3e60: 74 65 67 65 72 20 2d 34 32 2e 34 20 74 65 78 74  teger -42.4 text
3e70: 20 2d 34 32 2e 34 20 72 65 61 6c 20 2d 34 32 2e   -42.4 real -42.
3e80: 34 20 72 65 61 6c 0a 20 20 7d 0a 0a 20 20 36 20  4 real.  }..  6 
3e90: 7b 20 0a 20 20 20 49 4e 53 45 52 54 20 49 4e 54  { .   INSERT INT
3ea0: 4f 20 74 34 20 56 41 4c 55 45 53 28 37 2c 20 37  O t4 VALUES(7, 7
3eb0: 2c 20 37 29 3b 0a 20 20 20 55 50 44 41 54 45 20  , 7);.   UPDATE 
3ec0: 74 34 20 53 45 54 20 61 3d 38 2c 20 62 3d 38 2c  t4 SET a=8, b=8,
3ed0: 20 63 3d 38 3b 0a 20 20 7d 20 7b 0a 20 20 20 20   c=8;.  } {.    
3ee0: 2d 31 20 69 6e 74 65 67 65 72 20 37 20 74 65 78  -1 integer 7 tex
3ef0: 74 20 37 20 69 6e 74 65 67 65 72 20 37 2e 30 20  t 7 integer 7.0 
3f00: 72 65 61 6c 0a 20 20 20 20 20 31 20 69 6e 74 65  real.     1 inte
3f10: 67 65 72 20 37 20 74 65 78 74 20 37 20 69 6e 74  ger 7 text 7 int
3f20: 65 67 65 72 20 37 2e 30 20 72 65 61 6c 0a 20 20  eger 7.0 real.  
3f30: 20 20 20 31 20 69 6e 74 65 67 65 72 20 37 20 74     1 integer 7 t
3f40: 65 78 74 20 37 20 69 6e 74 65 67 65 72 20 37 2e  ext 7 integer 7.
3f50: 30 20 72 65 61 6c 0a 20 20 20 20 20 31 20 69 6e  0 real.     1 in
3f60: 74 65 67 65 72 20 38 20 74 65 78 74 20 38 20 69  teger 8 text 8 i
3f70: 6e 74 65 67 65 72 20 38 2e 30 20 72 65 61 6c 0a  nteger 8.0 real.
3f80: 20 20 20 20 20 31 20 69 6e 74 65 67 65 72 20 37       1 integer 7
3f90: 20 74 65 78 74 20 37 20 69 6e 74 65 67 65 72 20   text 7 integer 
3fa0: 37 2e 30 20 72 65 61 6c 0a 20 20 20 20 20 31 20  7.0 real.     1 
3fb0: 69 6e 74 65 67 65 72 20 38 20 74 65 78 74 20 38  integer 8 text 8
3fc0: 20 69 6e 74 65 67 65 72 20 38 2e 30 20 72 65 61   integer 8.0 rea
3fd0: 6c 0a 20 20 7d 0a 0a 20 20 37 20 7b 20 0a 20 20  l.  }..  7 { .  
3fe0: 20 55 50 44 41 54 45 20 74 34 20 53 45 54 20 72   UPDATE t4 SET r
3ff0: 6f 77 69 64 3d 32 3b 0a 20 20 7d 20 7b 0a 20 20  owid=2;.  } {.  
4000: 20 20 20 31 20 69 6e 74 65 67 65 72 20 38 20 74     1 integer 8 t
4010: 65 78 74 20 38 20 69 6e 74 65 67 65 72 20 38 2e  ext 8 integer 8.
4020: 30 20 72 65 61 6c 0a 20 20 20 20 20 32 20 69 6e  0 real.     2 in
4030: 74 65 67 65 72 20 38 20 74 65 78 74 20 38 20 69  teger 8 text 8 i
4040: 6e 74 65 67 65 72 20 38 2e 30 20 72 65 61 6c 0a  nteger 8.0 real.
4050: 20 20 20 20 20 31 20 69 6e 74 65 67 65 72 20 38       1 integer 8
4060: 20 74 65 78 74 20 38 20 69 6e 74 65 67 65 72 20   text 8 integer 
4070: 38 2e 30 20 72 65 61 6c 0a 20 20 20 20 20 32 20  8.0 real.     2 
4080: 69 6e 74 65 67 65 72 20 38 20 74 65 78 74 20 38  integer 8 text 8
4090: 20 69 6e 74 65 67 65 72 20 38 2e 30 20 72 65 61   integer 8.0 rea
40a0: 6c 0a 20 20 7d 0a 0a 20 20 38 20 7b 20 0a 20 20  l.  }..  8 { .  
40b0: 20 55 50 44 41 54 45 20 74 34 20 53 45 54 20 61   UPDATE t4 SET a
40c0: 3d 27 39 27 2c 20 62 3d 27 39 27 2c 20 63 3d 27  ='9', b='9', c='
40d0: 39 27 3b 0a 20 20 7d 20 7b 0a 20 20 20 20 20 32  9';.  } {.     2
40e0: 20 69 6e 74 65 67 65 72 20 38 20 74 65 78 74 20   integer 8 text 
40f0: 38 20 69 6e 74 65 67 65 72 20 38 2e 30 20 72 65  8 integer 8.0 re
4100: 61 6c 0a 20 20 20 20 20 32 20 69 6e 74 65 67 65  al.     2 intege
4110: 72 20 39 20 74 65 78 74 20 39 20 69 6e 74 65 67  r 9 text 9 integ
4120: 65 72 20 39 2e 30 20 72 65 61 6c 0a 20 20 20 20  er 9.0 real.    
4130: 20 32 20 69 6e 74 65 67 65 72 20 38 20 74 65 78   2 integer 8 tex
4140: 74 20 38 20 69 6e 74 65 67 65 72 20 38 2e 30 20  t 8 integer 8.0 
4150: 72 65 61 6c 0a 20 20 20 20 20 32 20 69 6e 74 65  real.     2 inte
4160: 67 65 72 20 39 20 74 65 78 74 20 39 20 69 6e 74  ger 9 text 9 int
4170: 65 67 65 72 20 39 2e 30 20 72 65 61 6c 0a 20 20  eger 9.0 real.  
4180: 7d 0a 0a 20 20 39 20 7b 20 0a 20 20 20 55 50 44  }..  9 { .   UPD
4190: 41 54 45 20 74 34 20 53 45 54 20 61 3d 27 39 2e  ATE t4 SET a='9.
41a0: 31 27 2c 20 62 3d 27 39 2e 31 27 2c 20 63 3d 27  1', b='9.1', c='
41b0: 39 2e 31 27 3b 0a 20 20 7d 20 7b 0a 20 20 20 20  9.1';.  } {.    
41c0: 20 32 20 69 6e 74 65 67 65 72 20 39 20 20 20 74   2 integer 9   t
41d0: 65 78 74 20 39 20 20 20 69 6e 74 65 67 65 72 20  ext 9   integer 
41e0: 39 2e 30 20 72 65 61 6c 0a 20 20 20 20 20 32 20  9.0 real.     2 
41f0: 69 6e 74 65 67 65 72 20 39 2e 31 20 74 65 78 74  integer 9.1 text
4200: 20 39 2e 31 20 72 65 61 6c 20 20 20 20 39 2e 31   9.1 real    9.1
4210: 20 72 65 61 6c 0a 20 20 20 20 20 32 20 69 6e 74   real.     2 int
4220: 65 67 65 72 20 39 20 20 20 74 65 78 74 20 39 20  eger 9   text 9 
4230: 20 20 69 6e 74 65 67 65 72 20 39 2e 30 20 72 65    integer 9.0 re
4240: 61 6c 0a 20 20 20 20 20 32 20 69 6e 74 65 67 65  al.     2 intege
4250: 72 20 39 2e 31 20 74 65 78 74 20 39 2e 31 20 72  r 9.1 text 9.1 r
4260: 65 61 6c 20 20 20 20 39 2e 31 20 72 65 61 6c 0a  eal    9.1 real.
4270: 20 20 7d 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73    }.} {.  do_tes
4280: 74 20 74 72 69 67 67 65 72 43 2d 34 2e 31 2e 24  t triggerC-4.1.$
4290: 6e 20 7b 0a 20 20 20 20 65 76 61 6c 20 63 6f 6e  n {.    eval con
42a0: 63 61 74 20 5b 65 78 65 63 73 71 6c 20 22 20 0a  cat [execsql " .
42b0: 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f        DELETE FRO
42c0: 4d 20 6c 6f 67 3b 0a 20 20 20 20 20 20 24 69 6e  M log;.      $in
42d0: 73 65 72 74 20 3b 20 0a 20 20 20 20 20 20 53 45  sert ; .      SE
42e0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6c 6f 67 3b  LECT * FROM log;
42f0: 0a 20 20 20 20 22 5d 0a 20 20 7d 20 5b 6a 6f 69  .    "].  } [joi
4300: 6e 20 24 6c 6f 67 20 22 20 22 5d 0a 7d 20 0a 0a  n $log " "].} ..
4310: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
4320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 69  ----------.# Thi
4360: 73 20 62 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73  s block of tests
4370: 2c 20 74 72 69 67 67 65 72 43 2d 35 2e 2a 2c 20  , triggerC-5.*, 
4380: 74 65 73 74 20 74 68 61 74 20 44 45 4c 45 54 45  test that DELETE
4390: 20 74 72 69 67 67 65 72 73 20 61 72 65 20 66 69   triggers are fi
43a0: 72 65 64 0a 23 20 69 66 20 61 20 72 6f 77 20 69  red.# if a row i
43b0: 73 20 64 65 6c 65 74 65 64 20 61 73 20 61 20 72  s deleted as a r
43c0: 65 73 75 6c 74 20 6f 66 20 4f 52 20 52 45 50 4c  esult of OR REPL
43d0: 41 43 45 20 63 6f 6e 66 6c 69 63 74 20 72 65 73  ACE conflict res
43e0: 6f 6c 75 74 69 6f 6e 2e 0a 23 0a 64 6f 5f 74 65  olution..#.do_te
43f0: 73 74 20 74 72 69 67 67 65 72 43 2d 35 2e 31 2e  st triggerC-5.1.
4400: 30 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  0 {.  execsql {.
4410: 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 49      DROP TABLE I
4420: 46 20 45 58 49 53 54 53 20 74 35 3b 0a 20 20 20  F EXISTS t5;.   
4430: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 35   CREATE TABLE t5
4440: 28 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  (a INTEGER PRIMA
4450: 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20  RY KEY, b);.    
4460: 43 52 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e  CREATE UNIQUE IN
4470: 44 45 58 20 74 35 69 20 4f 4e 20 74 35 28 62 29  DEX t5i ON t5(b)
4480: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
4490: 4f 20 74 35 20 56 41 4c 55 45 53 28 31 2c 20 27  O t5 VALUES(1, '
44a0: 61 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  a');.    INSERT 
44b0: 49 4e 54 4f 20 74 35 20 56 41 4c 55 45 53 28 32  INTO t5 VALUES(2
44c0: 2c 20 27 62 27 29 3b 0a 20 20 20 20 49 4e 53 45  , 'b');.    INSE
44d0: 52 54 20 49 4e 54 4f 20 74 35 20 56 41 4c 55 45  RT INTO t5 VALUE
44e0: 53 28 33 2c 20 27 63 27 29 3b 0a 0a 20 20 20 20  S(3, 'c');..    
44f0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 35 67  CREATE TABLE t5g
4500: 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20 43  (a, b, c);.    C
4510: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74 35  REATE TRIGGER t5
4520: 74 20 42 45 46 4f 52 45 20 44 45 4c 45 54 45 20  t BEFORE DELETE 
4530: 4f 4e 20 74 35 20 42 45 47 49 4e 0a 20 20 20 20  ON t5 BEGIN.    
4540: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 35    INSERT INTO t5
4550: 67 20 56 41 4c 55 45 53 28 6f 6c 64 2e 61 2c 20  g VALUES(old.a, 
4560: 6f 6c 64 2e 62 2c 20 28 53 45 4c 45 43 54 20 63  old.b, (SELECT c
4570: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 35 29  ount(*) FROM t5)
4580: 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 7d 0a  );.    END;.  }.
4590: 7d 20 7b 7d 0a 66 6f 72 65 61 63 68 20 7b 6e 20  } {}.foreach {n 
45a0: 64 6d 6c 20 74 35 67 20 74 35 7d 20 7b 0a 20 20  dml t5g t5} {.  
45b0: 31 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74  1 "DELETE FROM t
45c0: 35 20 57 48 45 52 45 20 61 3d 32 22 20 20 20 20  5 WHERE a=2"    
45d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45e0: 20 20 20 20 7b 32 20 62 20 33 7d 20 7b 31 20 61      {2 b 3} {1 a
45f0: 20 33 20 63 7d 0a 20 20 32 20 22 49 4e 53 45 52   3 c}.  2 "INSER
4600: 54 20 4f 52 20 52 45 50 4c 41 43 45 20 49 4e 54  T OR REPLACE INT
4610: 4f 20 74 35 20 56 41 4c 55 45 53 28 32 2c 20 27  O t5 VALUES(2, '
4620: 64 27 29 22 20 20 20 20 20 20 20 20 7b 32 20 62  d')"        {2 b
4630: 20 33 7d 20 7b 31 20 61 20 32 20 64 20 33 20 63   3} {1 a 2 d 3 c
4640: 7d 0a 20 20 33 20 22 55 50 44 41 54 45 20 4f 52  }.  3 "UPDATE OR
4650: 20 52 45 50 4c 41 43 45 20 74 35 20 53 45 54 20   REPLACE t5 SET 
4660: 61 20 3d 20 32 20 57 48 45 52 45 20 61 20 3d 20  a = 2 WHERE a = 
4670: 33 22 20 20 20 20 20 20 7b 32 20 62 20 33 7d 20  3"      {2 b 3} 
4680: 7b 31 20 61 20 32 20 63 7d 0a 20 20 34 20 22 49  {1 a 2 c}.  4 "I
4690: 4e 53 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45  NSERT OR REPLACE
46a0: 20 49 4e 54 4f 20 74 35 20 56 41 4c 55 45 53 28   INTO t5 VALUES(
46b0: 34 2c 20 27 62 27 29 22 20 20 20 20 20 20 20 20  4, 'b')"        
46c0: 7b 32 20 62 20 33 7d 20 7b 31 20 61 20 33 20 63  {2 b 3} {1 a 3 c
46d0: 20 34 20 62 7d 0a 20 20 35 20 22 55 50 44 41 54   4 b}.  5 "UPDAT
46e0: 45 20 4f 52 20 52 45 50 4c 41 43 45 20 74 35 20  E OR REPLACE t5 
46f0: 53 45 54 20 62 20 3d 20 27 62 27 20 57 48 45 52  SET b = 'b' WHER
4700: 45 20 62 20 3d 20 27 63 27 22 20 20 7b 32 20 62  E b = 'c'"  {2 b
4710: 20 33 7d 20 7b 31 20 61 20 33 20 62 7d 0a 20 20   3} {1 a 3 b}.  
4720: 36 20 22 49 4e 53 45 52 54 20 4f 52 20 52 45 50  6 "INSERT OR REP
4730: 4c 41 43 45 20 49 4e 54 4f 20 74 35 20 56 41 4c  LACE INTO t5 VAL
4740: 55 45 53 28 32 2c 20 27 63 27 29 22 20 20 20 20  UES(2, 'c')"    
4750: 20 20 20 20 7b 32 20 62 20 33 20 33 20 63 20 32      {2 b 3 3 c 2
4760: 7d 20 7b 31 20 61 20 32 20 63 7d 0a 20 20 37 20  } {1 a 2 c}.  7 
4770: 22 55 50 44 41 54 45 20 4f 52 20 52 45 50 4c 41  "UPDATE OR REPLA
4780: 43 45 20 74 35 20 53 45 54 20 61 3d 31 2c 20 62  CE t5 SET a=1, b
4790: 3d 27 62 27 20 57 48 45 52 45 20 61 20 3d 20 33  ='b' WHERE a = 3
47a0: 22 20 7b 31 20 61 20 33 20 32 20 62 20 32 7d 20  " {1 a 3 2 b 2} 
47b0: 7b 31 20 62 7d 0a 7d 20 7b 0a 20 20 64 6f 5f 74  {1 b}.} {.  do_t
47c0: 65 73 74 20 74 72 69 67 67 65 72 43 2d 35 2e 31  est triggerC-5.1
47d0: 2e 24 6e 20 7b 0a 20 20 20 20 65 78 65 63 73 71  .$n {.    execsq
47e0: 6c 20 22 0a 20 20 20 20 20 20 42 45 47 49 4e 3b  l ".      BEGIN;
47f0: 0a 20 20 20 20 20 20 20 20 24 64 6d 6c 20 3b 0a  .        $dml ;.
4800: 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a          SELECT *
4810: 20 46 52 4f 4d 20 74 35 67 3b 0a 20 20 20 20 20   FROM t5g;.     
4820: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
4830: 20 74 35 3b 0a 20 20 20 20 20 20 52 4f 4c 4c 42   t5;.      ROLLB
4840: 41 43 4b 3b 0a 20 20 20 20 22 0a 20 20 7d 20 5b  ACK;.    ".  } [
4850: 63 6f 6e 63 61 74 20 24 74 35 67 20 24 74 35 5d  concat $t5g $t5]
4860: 0a 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67  .}.do_test trigg
4870: 65 72 43 2d 35 2e 32 2e 30 20 7b 0a 20 20 65 78  erC-5.2.0 {.  ex
4880: 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50  ecsql {.    DROP
4890: 20 54 52 49 47 47 45 52 20 74 35 74 3b 0a 20 20   TRIGGER t5t;.  
48a0: 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52    CREATE TRIGGER
48b0: 20 74 35 74 20 41 46 54 45 52 20 44 45 4c 45 54   t5t AFTER DELET
48c0: 45 20 4f 4e 20 74 35 20 42 45 47 49 4e 0a 20 20  E ON t5 BEGIN.  
48d0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
48e0: 74 35 67 20 56 41 4c 55 45 53 28 6f 6c 64 2e 61  t5g VALUES(old.a
48f0: 2c 20 6f 6c 64 2e 62 2c 20 28 53 45 4c 45 43 54  , old.b, (SELECT
4900: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
4910: 35 29 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20  5));.    END;.  
4920: 7d 0a 7d 20 7b 7d 0a 66 6f 72 65 61 63 68 20 7b  }.} {}.foreach {
4930: 6e 20 64 6d 6c 20 74 35 67 20 74 35 7d 20 7b 0a  n dml t5g t5} {.
4940: 20 20 31 20 22 44 45 4c 45 54 45 20 46 52 4f 4d    1 "DELETE FROM
4950: 20 74 35 20 57 48 45 52 45 20 61 3d 32 22 20 20   t5 WHERE a=2"  
4960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4970: 20 20 20 20 20 20 7b 32 20 62 20 32 7d 20 7b 31        {2 b 2} {1
4980: 20 61 20 33 20 63 7d 0a 20 20 32 20 22 49 4e 53   a 3 c}.  2 "INS
4990: 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20 49  ERT OR REPLACE I
49a0: 4e 54 4f 20 74 35 20 56 41 4c 55 45 53 28 32 2c  NTO t5 VALUES(2,
49b0: 20 27 64 27 29 22 20 20 20 20 20 20 20 20 7b 32   'd')"        {2
49c0: 20 62 20 32 7d 20 7b 31 20 61 20 32 20 64 20 33   b 2} {1 a 2 d 3
49d0: 20 63 7d 0a 20 20 33 20 22 55 50 44 41 54 45 20   c}.  3 "UPDATE 
49e0: 4f 52 20 52 45 50 4c 41 43 45 20 74 35 20 53 45  OR REPLACE t5 SE
49f0: 54 20 61 20 3d 20 32 20 57 48 45 52 45 20 61 20  T a = 2 WHERE a 
4a00: 3d 20 33 22 20 20 20 20 20 20 7b 32 20 62 20 32  = 3"      {2 b 2
4a10: 7d 20 7b 31 20 61 20 32 20 63 7d 0a 20 20 34 20  } {1 a 2 c}.  4 
4a20: 22 49 4e 53 45 52 54 20 4f 52 20 52 45 50 4c 41  "INSERT OR REPLA
4a30: 43 45 20 49 4e 54 4f 20 74 35 20 56 41 4c 55 45  CE INTO t5 VALUE
4a40: 53 28 34 2c 20 27 62 27 29 22 20 20 20 20 20 20  S(4, 'b')"      
4a50: 20 20 7b 32 20 62 20 32 7d 20 7b 31 20 61 20 33    {2 b 2} {1 a 3
4a60: 20 63 20 34 20 62 7d 0a 20 20 35 20 22 55 50 44   c 4 b}.  5 "UPD
4a70: 41 54 45 20 4f 52 20 52 45 50 4c 41 43 45 20 74  ATE OR REPLACE t
4a80: 35 20 53 45 54 20 62 20 3d 20 27 62 27 20 57 48  5 SET b = 'b' WH
4a90: 45 52 45 20 62 20 3d 20 27 63 27 22 20 20 7b 32  ERE b = 'c'"  {2
4aa0: 20 62 20 32 7d 20 7b 31 20 61 20 33 20 62 7d 0a   b 2} {1 a 3 b}.
4ab0: 20 20 36 20 22 49 4e 53 45 52 54 20 4f 52 20 52    6 "INSERT OR R
4ac0: 45 50 4c 41 43 45 20 49 4e 54 4f 20 74 35 20 56  EPLACE INTO t5 V
4ad0: 41 4c 55 45 53 28 32 2c 20 27 63 27 29 22 20 20  ALUES(2, 'c')"  
4ae0: 20 20 20 20 20 20 7b 32 20 62 20 32 20 33 20 63        {2 b 2 3 c
4af0: 20 31 7d 20 7b 31 20 61 20 32 20 63 7d 0a 20 20   1} {1 a 2 c}.  
4b00: 37 20 22 55 50 44 41 54 45 20 4f 52 20 52 45 50  7 "UPDATE OR REP
4b10: 4c 41 43 45 20 74 35 20 53 45 54 20 61 3d 31 2c  LACE t5 SET a=1,
4b20: 20 62 3d 27 62 27 20 57 48 45 52 45 20 61 20 3d   b='b' WHERE a =
4b30: 20 33 22 20 7b 31 20 61 20 32 20 32 20 62 20 31   3" {1 a 2 2 b 1
4b40: 7d 20 7b 31 20 62 7d 0a 7d 20 7b 0a 20 20 64 6f  } {1 b}.} {.  do
4b50: 5f 74 65 73 74 20 74 72 69 67 67 65 72 43 2d 35  _test triggerC-5
4b60: 2e 32 2e 24 6e 20 7b 0a 20 20 20 20 65 78 65 63  .2.$n {.    exec
4b70: 73 71 6c 20 22 0a 20 20 20 20 20 20 42 45 47 49  sql ".      BEGI
4b80: 4e 3b 0a 20 20 20 20 20 20 20 20 24 64 6d 6c 20  N;.        $dml 
4b90: 3b 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  ;.        SELECT
4ba0: 20 2a 20 46 52 4f 4d 20 74 35 67 3b 0a 20 20 20   * FROM t5g;.   
4bb0: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
4bc0: 4f 4d 20 74 35 3b 0a 20 20 20 20 20 20 52 4f 4c  OM t5;.      ROL
4bd0: 4c 42 41 43 4b 3b 0a 20 20 20 20 22 0a 20 20 7d  LBACK;.    ".  }
4be0: 20 5b 63 6f 6e 63 61 74 20 24 74 35 67 20 24 74   [concat $t5g $t
4bf0: 35 5d 0a 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69  5].}.do_test tri
4c00: 67 67 65 72 43 2d 35 2e 33 2e 30 20 7b 0a 20 20  ggerC-5.3.0 {.  
4c10: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
4c20: 20 72 65 63 75 72 73 69 76 65 5f 74 72 69 67 67   recursive_trigg
4c30: 65 72 73 20 3d 20 6f 66 66 20 7d 0a 7d 20 7b 7d  ers = off }.} {}
4c40: 0a 66 6f 72 65 61 63 68 20 7b 6e 20 64 6d 6c 20  .foreach {n dml 
4c50: 74 35 67 20 74 35 7d 20 7b 0a 20 20 31 20 22 44  t5g t5} {.  1 "D
4c60: 45 4c 45 54 45 20 46 52 4f 4d 20 74 35 20 57 48  ELETE FROM t5 WH
4c70: 45 52 45 20 61 3d 32 22 20 20 20 20 20 20 20 20  ERE a=2"        
4c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c90: 7b 32 20 62 20 32 7d 20 7b 31 20 61 20 33 20 63  {2 b 2} {1 a 3 c
4ca0: 7d 0a 20 20 32 20 22 49 4e 53 45 52 54 20 4f 52  }.  2 "INSERT OR
4cb0: 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 74 35   REPLACE INTO t5
4cc0: 20 56 41 4c 55 45 53 28 32 2c 20 27 64 27 29 22   VALUES(2, 'd')"
4cd0: 20 20 20 20 20 20 20 20 7b 7d 20 7b 31 20 61 20          {} {1 a 
4ce0: 32 20 64 20 33 20 63 7d 0a 20 20 33 20 22 55 50  2 d 3 c}.  3 "UP
4cf0: 44 41 54 45 20 4f 52 20 52 45 50 4c 41 43 45 20  DATE OR REPLACE 
4d00: 74 35 20 53 45 54 20 61 20 3d 20 32 20 57 48 45  t5 SET a = 2 WHE
4d10: 52 45 20 61 20 3d 20 33 22 20 20 20 20 20 20 7b  RE a = 3"      {
4d20: 7d 20 7b 31 20 61 20 32 20 63 7d 0a 20 20 34 20  } {1 a 2 c}.  4 
4d30: 22 49 4e 53 45 52 54 20 4f 52 20 52 45 50 4c 41  "INSERT OR REPLA
4d40: 43 45 20 49 4e 54 4f 20 74 35 20 56 41 4c 55 45  CE INTO t5 VALUE
4d50: 53 28 34 2c 20 27 62 27 29 22 20 20 20 20 20 20  S(4, 'b')"      
4d60: 20 20 7b 7d 20 7b 31 20 61 20 33 20 63 20 34 20    {} {1 a 3 c 4 
4d70: 62 7d 0a 20 20 35 20 22 55 50 44 41 54 45 20 4f  b}.  5 "UPDATE O
4d80: 52 20 52 45 50 4c 41 43 45 20 74 35 20 53 45 54  R REPLACE t5 SET
4d90: 20 62 20 3d 20 27 62 27 20 57 48 45 52 45 20 62   b = 'b' WHERE b
4da0: 20 3d 20 27 63 27 22 20 20 7b 7d 20 7b 31 20 61   = 'c'"  {} {1 a
4db0: 20 33 20 62 7d 0a 20 20 36 20 22 49 4e 53 45 52   3 b}.  6 "INSER
4dc0: 54 20 4f 52 20 52 45 50 4c 41 43 45 20 49 4e 54  T OR REPLACE INT
4dd0: 4f 20 74 35 20 56 41 4c 55 45 53 28 32 2c 20 27  O t5 VALUES(2, '
4de0: 63 27 29 22 20 20 20 20 20 20 20 20 7b 7d 20 7b  c')"        {} {
4df0: 31 20 61 20 32 20 63 7d 0a 20 20 37 20 22 55 50  1 a 2 c}.  7 "UP
4e00: 44 41 54 45 20 4f 52 20 52 45 50 4c 41 43 45 20  DATE OR REPLACE 
4e10: 74 35 20 53 45 54 20 61 3d 31 2c 20 62 3d 27 62  t5 SET a=1, b='b
4e20: 27 20 57 48 45 52 45 20 61 20 3d 20 33 22 20 7b  ' WHERE a = 3" {
4e30: 7d 20 7b 31 20 62 7d 0a 7d 20 7b 0a 20 20 64 6f  } {1 b}.} {.  do
4e40: 5f 74 65 73 74 20 74 72 69 67 67 65 72 43 2d 35  _test triggerC-5
4e50: 2e 33 2e 24 6e 20 7b 0a 20 20 20 20 65 78 65 63  .3.$n {.    exec
4e60: 73 71 6c 20 22 0a 20 20 20 20 20 20 42 45 47 49  sql ".      BEGI
4e70: 4e 3b 0a 20 20 20 20 20 20 20 20 24 64 6d 6c 20  N;.        $dml 
4e80: 3b 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  ;.        SELECT
4e90: 20 2a 20 46 52 4f 4d 20 74 35 67 3b 0a 20 20 20   * FROM t5g;.   
4ea0: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
4eb0: 4f 4d 20 74 35 3b 0a 20 20 20 20 20 20 52 4f 4c  OM t5;.      ROL
4ec0: 4c 42 41 43 4b 3b 0a 20 20 20 20 22 0a 20 20 7d  LBACK;.    ".  }
4ed0: 20 5b 63 6f 6e 63 61 74 20 24 74 35 67 20 24 74   [concat $t5g $t
4ee0: 35 5d 0a 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69  5].}.do_test tri
4ef0: 67 67 65 72 43 2d 35 2e 33 2e 38 20 7b 0a 20 20  ggerC-5.3.8 {.  
4f00: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
4f10: 20 72 65 63 75 72 73 69 76 65 5f 74 72 69 67 67   recursive_trigg
4f20: 65 72 73 20 3d 20 6f 6e 20 7d 0a 7d 20 7b 7d 0a  ers = on }.} {}.
4f30: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
4f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68  -----------.# Th
4f80: 69 73 20 62 6c 6f 63 6b 20 6f 66 20 74 65 73 74  is block of test
4f90: 73 2c 20 74 72 69 67 67 65 72 43 2d 36 2e 2a 2c  s, triggerC-6.*,
4fa0: 20 74 65 73 74 73 20 74 68 61 74 20 22 50 52 41   tests that "PRA
4fb0: 47 4d 41 20 72 65 63 75 72 73 69 76 65 5f 74 72  GMA recursive_tr
4fc0: 69 67 67 65 72 73 22 0a 23 20 73 74 61 74 65 6d  iggers".# statem
4fd0: 65 6e 74 73 20 72 65 74 75 72 6e 20 74 68 65 20  ents return the 
4fe0: 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  current value of
4ff0: 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20 74   the recursive t
5000: 72 69 67 67 65 72 73 20 66 6c 61 67 2e 0a 23 0a  riggers flag..#.
5010: 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 43  do_test triggerC
5020: 2d 36 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  -6.1 {.  execsql
5030: 20 7b 20 50 52 41 47 4d 41 20 72 65 63 75 72 73   { PRAGMA recurs
5040: 69 76 65 5f 74 72 69 67 67 65 72 73 20 7d 0a 7d  ive_triggers }.}
5050: 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69   {1}.do_test tri
5060: 67 67 65 72 43 2d 36 2e 32 20 7b 0a 20 20 65 78  ggerC-6.2 {.  ex
5070: 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 50 52 41  ecsql { .    PRA
5080: 47 4d 41 20 72 65 63 75 72 73 69 76 65 5f 74 72  GMA recursive_tr
5090: 69 67 67 65 72 73 20 3d 20 6f 66 66 3b 0a 20 20  iggers = off;.  
50a0: 20 20 50 52 41 47 4d 41 20 72 65 63 75 72 73 69    PRAGMA recursi
50b0: 76 65 5f 74 72 69 67 67 65 72 73 3b 0a 20 20 7d  ve_triggers;.  }
50c0: 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 74  .} {0}.do_test t
50d0: 72 69 67 67 65 72 43 2d 36 2e 33 20 7b 0a 20 20  riggerC-6.3 {.  
50e0: 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 50  execsql { .    P
50f0: 52 41 47 4d 41 20 72 65 63 75 72 73 69 76 65 5f  RAGMA recursive_
5100: 74 72 69 67 67 65 72 73 20 3d 20 6f 6e 3b 0a 20  triggers = on;. 
5110: 20 20 20 50 52 41 47 4d 41 20 72 65 63 75 72 73     PRAGMA recurs
5120: 69 76 65 5f 74 72 69 67 67 65 72 73 3b 0a 20 20  ive_triggers;.  
5130: 7d 0a 7d 20 7b 31 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  }.} {1}..#------
5140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5180: 2d 2d 2d 0a 23 20 54 65 73 74 20 73 6f 6d 65 20  ---.# Test some 
5190: 6f 66 20 74 68 65 20 22 75 6e 64 65 66 69 6e 65  of the "undefine
51a0: 64 20 62 65 68 61 76 69 6f 75 72 22 20 61 73 73  d behaviour" ass
51b0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 72 69  ociated with tri
51c0: 67 67 65 72 73 2e 20 54 68 65 0a 23 20 75 6e 64  ggers. The.# und
51d0: 65 66 69 6e 65 64 20 62 65 68 61 76 69 6f 75 72  efined behaviour
51e0: 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20 72   occurs when a r
51f0: 6f 77 20 62 65 69 6e 67 20 75 70 64 61 74 65 64  ow being updated
5200: 20 6f 72 20 64 65 6c 65 74 65 64 20 69 73 20 0a   or deleted is .
5210: 23 20 6d 61 6e 69 70 75 6c 61 74 65 64 20 62 79  # manipulated by
5220: 20 61 20 42 45 46 4f 52 45 20 74 72 69 67 67 65   a BEFORE trigge
5230: 72 2e 0a 23 20 0a 64 6f 5f 74 65 73 74 20 74 72  r..# .do_test tr
5240: 69 67 67 65 72 43 2d 37 2e 31 20 7b 0a 20 20 65  iggerC-7.1 {.  e
5250: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
5260: 41 54 45 20 54 41 42 4c 45 20 74 38 28 78 29 3b  ATE TABLE t8(x);
5270: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
5280: 45 20 74 37 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t7(a, b);.    
5290: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 37 20 56  INSERT INTO t7 V
52a0: 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20  ALUES(1, 2);.   
52b0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 37 20   INSERT INTO t7 
52c0: 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20  VALUES(3, 4);.  
52d0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 37    INSERT INTO t7
52e0: 20 56 41 4c 55 45 53 28 35 2c 20 36 29 3b 0a 20   VALUES(5, 6);. 
52f0: 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45     CREATE TRIGGE
5300: 52 20 74 37 74 20 42 45 46 4f 52 45 20 55 50 44  R t7t BEFORE UPD
5310: 41 54 45 20 4f 4e 20 74 37 20 42 45 47 49 4e 0a  ATE ON t7 BEGIN.
5320: 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f        DELETE FRO
5330: 4d 20 74 37 20 57 48 45 52 45 20 61 20 3d 20 31  M t7 WHERE a = 1
5340: 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 20 20 43  ;.    END;.    C
5350: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74 37  REATE TRIGGER t7
5360: 74 61 20 41 46 54 45 52 20 55 50 44 41 54 45 20  ta AFTER UPDATE 
5370: 4f 4e 20 74 37 20 42 45 47 49 4e 0a 20 20 20 20  ON t7 BEGIN.    
5380: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 38    INSERT INTO t8
5390: 20 56 41 4c 55 45 53 28 27 61 66 74 65 72 20 66   VALUES('after f
53a0: 69 72 65 64 20 27 20 7c 7c 20 6f 6c 64 2e 72 6f  ired ' || old.ro
53b0: 77 69 64 20 7c 7c 20 27 2d 3e 27 20 7c 7c 20 6e  wid || '->' || n
53c0: 65 77 2e 72 6f 77 69 64 29 3b 0a 20 20 20 20 45  ew.rowid);.    E
53d0: 4e 44 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  ND;.  }.} {}.do_
53e0: 74 65 73 74 20 74 72 69 67 67 65 72 43 2d 37 2e  test triggerC-7.
53f0: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  2 {.  execsql {.
5400: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
5410: 20 55 50 44 41 54 45 20 74 37 20 53 45 54 20 62   UPDATE t7 SET b
5420: 3d 37 20 57 48 45 52 45 20 61 20 3d 20 35 3b 0a  =7 WHERE a = 5;.
5430: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
5440: 52 4f 4d 20 74 37 3b 0a 20 20 20 20 20 20 53 45  ROM t7;.      SE
5450: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 38 3b 0a  LECT * FROM t8;.
5460: 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20      ROLLBACK;.  
5470: 7d 0a 7d 20 7b 33 20 34 20 35 20 37 20 7b 61 66  }.} {3 4 5 7 {af
5480: 74 65 72 20 66 69 72 65 64 20 33 2d 3e 33 7d 7d  ter fired 3->3}}
5490: 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72  .do_test trigger
54a0: 43 2d 37 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  C-7.3 {.  execsq
54b0: 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  l {.    BEGIN;. 
54c0: 20 20 20 20 20 55 50 44 41 54 45 20 74 37 20 53       UPDATE t7 S
54d0: 45 54 20 62 3d 37 20 57 48 45 52 45 20 61 20 3d  ET b=7 WHERE a =
54e0: 20 31 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54   1;.      SELECT
54f0: 20 2a 20 46 52 4f 4d 20 74 37 3b 0a 20 20 20 20   * FROM t7;.    
5500: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
5510: 74 38 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b  t8;.    ROLLBACK
5520: 3b 0a 20 20 7d 0a 7d 20 7b 33 20 34 20 35 20 36  ;.  }.} {3 4 5 6
5530: 7d 0a 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67  }..do_test trigg
5540: 65 72 43 2d 37 2e 34 20 7b 0a 20 20 65 78 65 63  erC-7.4 {.  exec
5550: 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20 54  sql {.    DROP T
5560: 52 49 47 47 45 52 20 74 37 74 3b 0a 20 20 20 20  RIGGER t7t;.    
5570: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74  CREATE TRIGGER t
5580: 37 74 20 42 45 46 4f 52 45 20 55 50 44 41 54 45  7t BEFORE UPDATE
5590: 20 4f 4e 20 74 37 20 57 48 45 4e 20 28 6f 6c 64   ON t7 WHEN (old
55a0: 2e 72 6f 77 69 64 21 3d 31 20 4f 52 20 6e 65 77  .rowid!=1 OR new
55b0: 2e 72 6f 77 69 64 21 3d 38 29 0a 20 20 20 20 42  .rowid!=8).    B
55c0: 45 47 49 4e 0a 20 20 20 20 20 20 55 50 44 41 54  EGIN.      UPDAT
55d0: 45 20 74 37 20 73 65 74 20 72 6f 77 69 64 20 3d  E t7 set rowid =
55e0: 20 38 20 57 48 45 52 45 20 72 6f 77 69 64 3d 31   8 WHERE rowid=1
55f0: 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 7d 0a 7d  ;.    END;.  }.}
5600: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67   {}.do_test trig
5610: 67 65 72 43 2d 37 2e 35 20 7b 0a 20 20 65 78 65  gerC-7.5 {.  exe
5620: 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e  csql {.    BEGIN
5630: 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 74  ;.      UPDATE t
5640: 37 20 53 45 54 20 62 3d 37 20 57 48 45 52 45 20  7 SET b=7 WHERE 
5650: 61 20 3d 20 35 3b 0a 20 20 20 20 20 20 53 45 4c  a = 5;.      SEL
5660: 45 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f  ECT rowid, * FRO
5670: 4d 20 74 37 3b 0a 20 20 20 20 20 20 53 45 4c 45  M t7;.      SELE
5680: 43 54 20 2a 20 46 52 4f 4d 20 74 38 3b 0a 20 20  CT * FROM t8;.  
5690: 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a    ROLLBACK;.  }.
56a0: 7d 20 7b 32 20 33 20 34 20 33 20 35 20 37 20 38  } {2 3 4 3 5 7 8
56b0: 20 31 20 32 20 7b 61 66 74 65 72 20 66 69 72 65   1 2 {after fire
56c0: 64 20 31 2d 3e 38 7d 20 7b 61 66 74 65 72 20 66  d 1->8} {after f
56d0: 69 72 65 64 20 33 2d 3e 33 7d 7d 0a 64 6f 5f 74  ired 3->3}}.do_t
56e0: 65 73 74 20 74 72 69 67 67 65 72 43 2d 37 2e 36  est triggerC-7.6
56f0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
5700: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
5710: 55 50 44 41 54 45 20 74 37 20 53 45 54 20 62 3d  UPDATE t7 SET b=
5720: 37 20 57 48 45 52 45 20 61 20 3d 20 31 3b 0a 20  7 WHERE a = 1;. 
5730: 20 20 20 20 20 53 45 4c 45 43 54 20 72 6f 77 69       SELECT rowi
5740: 64 2c 20 2a 20 46 52 4f 4d 20 74 37 3b 0a 20 20  d, * FROM t7;.  
5750: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
5760: 4d 20 74 38 3b 0a 20 20 20 20 52 4f 4c 4c 42 41  M t8;.    ROLLBA
5770: 43 4b 3b 0a 20 20 7d 0a 7d 20 7b 32 20 33 20 34  CK;.  }.} {2 3 4
5780: 20 33 20 35 20 36 20 38 20 31 20 32 20 7b 61 66   3 5 6 8 1 2 {af
5790: 74 65 72 20 66 69 72 65 64 20 31 2d 3e 38 7d 7d  ter fired 1->8}}
57a0: 0a 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65  ..do_test trigge
57b0: 72 43 2d 37 2e 37 20 7b 0a 20 20 65 78 65 63 73  rC-7.7 {.  execs
57c0: 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20 54 52  ql {.    DROP TR
57d0: 49 47 47 45 52 20 74 37 74 3b 0a 20 20 20 20 44  IGGER t7t;.    D
57e0: 52 4f 50 20 54 52 49 47 47 45 52 20 74 37 74 61  ROP TRIGGER t7ta
57f0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49  ;.    CREATE TRI
5800: 47 47 45 52 20 74 37 74 20 42 45 46 4f 52 45 20  GGER t7t BEFORE 
5810: 44 45 4c 45 54 45 20 4f 4e 20 74 37 20 42 45 47  DELETE ON t7 BEG
5820: 49 4e 0a 20 20 20 20 20 20 55 50 44 41 54 45 20  IN.      UPDATE 
5830: 74 37 20 73 65 74 20 72 6f 77 69 64 20 3d 20 38  t7 set rowid = 8
5840: 20 57 48 45 52 45 20 72 6f 77 69 64 3d 31 3b 0a   WHERE rowid=1;.
5850: 20 20 20 20 45 4e 44 3b 0a 20 20 20 20 43 52 45      END;.    CRE
5860: 41 54 45 20 54 52 49 47 47 45 52 20 74 37 74 61  ATE TRIGGER t7ta
5870: 20 41 46 54 45 52 20 44 45 4c 45 54 45 20 4f 4e   AFTER DELETE ON
5880: 20 74 37 20 42 45 47 49 4e 0a 20 20 20 20 20 20   t7 BEGIN.      
5890: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 38 20 56  INSERT INTO t8 V
58a0: 41 4c 55 45 53 28 27 61 66 74 65 72 20 66 69 72  ALUES('after fir
58b0: 65 64 20 27 20 7c 7c 20 6f 6c 64 2e 72 6f 77 69  ed ' || old.rowi
58c0: 64 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 7d  d);.    END;.  }
58d0: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 74 72  .} {}.do_test tr
58e0: 69 67 67 65 72 43 2d 37 2e 38 20 7b 0a 20 20 65  iggerC-7.8 {.  e
58f0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47  xecsql {.    BEG
5900: 49 4e 3b 0a 20 20 20 20 20 20 44 45 4c 45 54 45  IN;.      DELETE
5910: 20 46 52 4f 4d 20 74 37 20 57 48 45 52 45 20 61   FROM t7 WHERE a
5920: 20 3d 20 33 3b 0a 20 20 20 20 20 20 53 45 4c 45   = 3;.      SELE
5930: 43 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d  CT rowid, * FROM
5940: 20 74 37 3b 0a 20 20 20 20 20 20 53 45 4c 45 43   t7;.      SELEC
5950: 54 20 2a 20 46 52 4f 4d 20 74 38 3b 0a 20 20 20  T * FROM t8;.   
5960: 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a 7d   ROLLBACK;.  }.}
5970: 20 7b 33 20 35 20 36 20 38 20 31 20 32 20 7b 61   {3 5 6 8 1 2 {a
5980: 66 74 65 72 20 66 69 72 65 64 20 32 7d 7d 0a 64  fter fired 2}}.d
5990: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 43 2d  o_test triggerC-
59a0: 37 2e 39 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  7.9 {.  execsql 
59b0: 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  {.    BEGIN;.   
59c0: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
59d0: 37 20 57 48 45 52 45 20 61 20 3d 20 31 3b 0a 20  7 WHERE a = 1;. 
59e0: 20 20 20 20 20 53 45 4c 45 43 54 20 72 6f 77 69       SELECT rowi
59f0: 64 2c 20 2a 20 46 52 4f 4d 20 74 37 3b 0a 20 20  d, * FROM t7;.  
5a00: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
5a10: 4d 20 74 38 3b 0a 20 20 20 20 52 4f 4c 4c 42 41  M t8;.    ROLLBA
5a20: 43 4b 3b 0a 20 20 7d 0a 7d 20 7b 32 20 33 20 34  CK;.  }.} {2 3 4
5a30: 20 33 20 35 20 36 20 38 20 31 20 32 7d 0a 0a 23   3 5 6 8 1 2}..#
5a40: 20 54 69 63 6b 65 74 20 5b 65 32 35 64 39 65 61   Ticket [e25d9ea
5a50: 37 37 31 66 65 62 63 39 63 33 31 31 39 32 38 63  771febc9c311928c
5a60: 31 63 30 31 63 33 31 36 33 64 63 62 32 36 36 34  1c01c3163dcb2664
5a70: 33 5d 0a 23 20 0a 64 6f 5f 74 65 73 74 20 74 72  3].# .do_test tr
5a80: 69 67 67 65 72 43 2d 39 2e 31 20 7b 0a 20 20 65  iggerC-9.1 {.  e
5a90: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
5aa0: 41 54 45 20 54 41 42 4c 45 20 74 39 28 61 2c 62  ATE TABLE t9(a,b
5ab0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e  );.    CREATE IN
5ac0: 44 45 58 20 74 39 62 20 4f 4e 20 74 39 28 62 29  DEX t9b ON t9(b)
5ad0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
5ae0: 4f 20 74 39 20 56 41 4c 55 45 53 28 31 2c 30 29  O t9 VALUES(1,0)
5af0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
5b00: 4f 20 74 39 20 56 41 4c 55 45 53 28 32 2c 31 29  O t9 VALUES(2,1)
5b10: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
5b20: 4f 20 74 39 20 56 41 4c 55 45 53 28 33 2c 32 29  O t9 VALUES(3,2)
5b30: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
5b40: 4f 20 74 39 20 53 45 4c 45 43 54 20 61 2b 33 2c  O t9 SELECT a+3,
5b50: 20 61 2b 32 20 46 52 4f 4d 20 74 39 3b 0a 20 20   a+2 FROM t9;.  
5b60: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 39    INSERT INTO t9
5b70: 20 53 45 4c 45 43 54 20 61 2b 36 2c 20 61 2b 35   SELECT a+6, a+5
5b80: 20 46 52 4f 4d 20 74 39 3b 0a 20 20 20 20 53 45   FROM t9;.    SE
5b90: 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 39 20 4f  LECT a FROM t9 O
5ba0: 52 44 45 52 20 42 59 20 61 3b 0a 20 20 7d 0a 7d  RDER BY a;.  }.}
5bb0: 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37 20   {1 2 3 4 5 6 7 
5bc0: 38 20 39 20 31 30 20 31 31 20 31 32 7d 0a 64 6f  8 9 10 11 12}.do
5bd0: 5f 74 65 73 74 20 74 72 69 67 67 65 72 43 2d 39  _test triggerC-9
5be0: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
5bf0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47  .    CREATE TRIG
5c00: 47 45 52 20 74 39 72 31 20 41 46 54 45 52 20 44  GER t9r1 AFTER D
5c10: 45 4c 45 54 45 20 4f 4e 20 74 39 20 42 45 47 49  ELETE ON t9 BEGI
5c20: 4e 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46  N.      DELETE F
5c30: 52 4f 4d 20 74 39 20 57 48 45 52 45 20 62 3d 6f  ROM t9 WHERE b=o
5c40: 6c 64 2e 61 3b 0a 20 20 20 20 45 4e 44 3b 0a 20  ld.a;.    END;. 
5c50: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
5c60: 39 20 57 48 45 52 45 20 62 3d 34 3b 0a 20 20 20  9 WHERE b=4;.   
5c70: 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
5c80: 39 20 4f 52 44 45 52 20 42 59 20 61 3b 0a 20 20  9 ORDER BY a;.  
5c90: 7d 0a 7d 20 7b 31 20 32 20 33 20 34 7d 0a 0a 23  }.} {1 2 3 4}..#
5ca0: 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 28 62   At one point (b
5cb0: 65 74 77 65 65 6e 20 76 65 72 73 69 6f 6e 73 20  etween versions 
5cc0: 33 2e 36 2e 31 38 20 61 6e 64 20 33 2e 36 2e 32  3.6.18 and 3.6.2
5cd0: 30 20 69 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e  0 inclusive), an
5ce0: 20 55 50 44 41 54 45 20 0a 23 20 74 68 61 74 20   UPDATE .# that 
5cf0: 66 69 72 65 64 20 61 20 42 45 46 4f 52 45 20 74  fired a BEFORE t
5d00: 72 69 67 67 65 72 20 74 68 61 74 20 69 74 73 65  rigger that itse
5d10: 6c 66 20 75 70 64 61 74 65 64 20 74 68 65 20 73  lf updated the s
5d20: 61 6d 65 20 72 6f 77 20 61 73 20 74 68 65 20 0a  ame row as the .
5d30: 23 20 73 74 61 74 65 6d 65 6e 74 20 63 61 75 73  # statement caus
5d40: 69 6e 67 20 69 74 20 74 6f 20 66 69 72 65 20 77  ing it to fire w
5d50: 61 73 20 63 61 75 73 69 6e 67 20 61 20 73 74 72  as causing a str
5d60: 61 6e 67 65 20 73 69 64 65 2d 65 66 66 65 63 74  ange side-effect
5d70: 3a 20 54 68 65 20 0a 23 20 76 61 6c 75 65 73 20  : The .# values 
5d80: 75 70 64 61 74 65 64 20 62 79 20 74 68 65 20 73  updated by the s
5d90: 74 61 74 65 6d 65 6e 74 20 77 69 74 68 69 6e 20  tatement within 
5da0: 74 68 65 20 74 72 69 67 67 65 72 20 77 65 72 65  the trigger were
5db0: 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74   being overwritt
5dc0: 65 6e 20 0a 23 20 62 79 20 74 68 65 20 76 61 6c  en .# by the val
5dd0: 75 65 73 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a  ues in the new.*
5de0: 20 61 72 72 61 79 2c 20 65 76 65 6e 20 69 66 20   array, even if 
5df0: 74 68 6f 73 65 20 76 61 6c 75 65 73 20 77 65 72  those values wer
5e00: 65 20 6e 6f 74 20 0a 23 20 74 68 65 6d 73 65 6c  e not .# themsel
5e10: 76 65 73 20 77 72 69 74 74 65 6e 20 62 79 20 74  ves written by t
5e20: 68 65 20 70 61 72 65 6e 74 20 55 50 44 41 54 45  he parent UPDATE
5e30: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 23 0a 23 20   statement..#.# 
5e40: 54 65 63 68 6e 69 63 61 6c 6c 79 20 73 70 65 61  Technically spea
5e50: 6b 69 6e 67 20 74 68 69 73 20 77 61 73 20 6e 6f  king this was no
5e60: 74 20 61 20 62 75 67 2e 20 54 68 65 20 53 51 4c  t a bug. The SQL
5e70: 69 74 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f  ite documentatio
5e80: 6e 20 73 61 79 73 0a 23 20 74 68 61 74 20 69 66  n says.# that if
5e90: 20 61 20 42 45 46 4f 52 45 20 55 50 44 41 54 45   a BEFORE UPDATE
5ea0: 20 6f 72 20 42 45 46 4f 52 45 20 44 45 4c 45 54   or BEFORE DELET
5eb0: 45 20 74 72 69 67 67 65 72 20 6d 6f 64 69 66 69  E trigger modifi
5ec0: 65 73 20 6f 72 20 64 65 6c 65 74 65 73 20 74 68  es or deletes th
5ed0: 65 0a 23 20 72 6f 77 20 74 68 61 74 20 74 68 65  e.# row that the
5ee0: 20 70 61 72 65 6e 74 20 73 74 61 74 65 6d 65 6e   parent statemen
5ef0: 74 20 69 73 20 6f 70 65 72 61 74 69 6e 67 20 6f  t is operating o
5f00: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 61 72  n the results ar
5f10: 65 20 75 6e 64 65 66 69 6e 65 64 2e 20 0a 23 20  e undefined. .# 
5f20: 42 75 74 20 61 73 20 6f 66 20 33 2e 36 2e 32 31  But as of 3.6.21
5f30: 20 62 65 68 61 76 69 6f 75 72 20 69 73 20 72 65   behaviour is re
5f40: 73 74 6f 72 65 64 20 74 6f 20 74 68 65 20 77 61  stored to the wa
5f50: 79 20 69 74 20 77 61 73 20 69 6e 20 76 65 72 73  y it was in vers
5f60: 69 6f 6e 73 0a 23 20 33 2e 36 2e 31 37 20 61 6e  ions.# 3.6.17 an
5f70: 64 20 65 61 72 6c 69 65 72 20 74 6f 20 61 76 6f  d earlier to avo
5f80: 69 64 20 63 61 75 73 69 6e 67 20 75 6e 6e 65 63  id causing unnec
5f90: 65 73 73 61 72 79 20 64 69 66 66 69 63 75 6c 74  essary difficult
5fa0: 69 65 73 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 74  ies..#.do_test t
5fb0: 72 69 67 67 65 72 43 2d 31 30 2e 31 20 7b 0a 20  riggerC-10.1 {. 
5fc0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
5fd0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 30 28  REATE TABLE t10(
5fe0: 61 2c 20 75 70 64 61 74 65 63 6e 74 20 44 45 46  a, updatecnt DEF
5ff0: 41 55 4c 54 20 30 29 3b 0a 20 20 20 20 43 52 45  AULT 0);.    CRE
6000: 41 54 45 20 54 52 49 47 47 45 52 20 74 31 30 5f  ATE TRIGGER t10_
6010: 62 75 20 42 45 46 4f 52 45 20 55 50 44 41 54 45  bu BEFORE UPDATE
6020: 20 4f 46 20 61 20 4f 4e 20 74 31 30 20 42 45 47   OF a ON t10 BEG
6030: 49 4e 0a 20 20 20 20 20 20 55 50 44 41 54 45 20  IN.      UPDATE 
6040: 74 31 30 20 53 45 54 20 75 70 64 61 74 65 63 6e  t10 SET updatecn
6050: 74 20 3d 20 75 70 64 61 74 65 63 6e 74 2b 31 20  t = updatecnt+1 
6060: 57 48 45 52 45 20 72 6f 77 69 64 20 3d 20 6f 6c  WHERE rowid = ol
6070: 64 2e 72 6f 77 69 64 3b 0a 20 20 20 20 45 4e 44  d.rowid;.    END
6080: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
6090: 4f 20 74 31 30 28 61 29 20 56 41 4c 55 45 53 28  O t10(a) VALUES(
60a0: 27 68 65 6c 6c 6f 27 29 3b 0a 20 20 7d 0a 0a 20  'hello');.  }.. 
60b0: 20 23 20 42 65 66 6f 72 65 20 74 68 65 20 70 72   # Before the pr
60c0: 6f 62 6c 65 6d 20 77 61 73 20 66 69 78 65 64 2c  oblem was fixed,
60d0: 20 74 61 62 6c 65 20 74 31 30 20 77 6f 75 6c 64   table t10 would
60e0: 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 74 75 70   contain the tup
60f0: 6c 65 20 0a 20 20 23 20 28 77 6f 72 6c 64 2c 20  le .  # (world, 
6100: 30 29 20 61 66 74 65 72 20 72 75 6e 6e 69 6e 67  0) after running
6110: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
6120: 63 72 69 70 74 20 28 62 65 63 61 75 73 65 20 74  cript (because t
6130: 68 65 20 76 61 6c 75 65 0a 20 20 23 20 31 20 77  he value.  # 1 w
6140: 72 69 74 74 65 6e 20 74 6f 20 63 6f 6c 75 6d 6e  ritten to column
6150: 20 22 75 70 64 61 74 65 63 6e 74 22 20 77 61 73   "updatecnt" was
6160: 20 63 6c 6f 62 62 65 72 65 64 20 62 79 20 74 68   clobbered by th
6170: 65 20 6f 6c 64 20 76 61 6c 75 65 20 30 29 2e 0a  e old value 0)..
6180: 20 20 23 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a    #.  execsql {.
6190: 20 20 20 20 55 50 44 41 54 45 20 74 31 30 20 53      UPDATE t10 S
61a0: 45 54 20 61 20 3d 20 27 77 6f 72 6c 64 27 3b 0a  ET a = 'world';.
61b0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
61c0: 4d 20 74 31 30 3b 0a 20 20 7d 0a 7d 20 7b 77 6f  M t10;.  }.} {wo
61d0: 72 6c 64 20 31 7d 0a 0a 64 6f 5f 74 65 73 74 20  rld 1}..do_test 
61e0: 74 72 69 67 67 65 72 43 2d 31 30 2e 32 20 7b 0a  triggerC-10.2 {.
61f0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
6200: 55 50 44 41 54 45 20 74 31 30 20 53 45 54 20 61  UPDATE t10 SET a
6210: 20 3d 20 27 74 63 6c 27 2c 20 75 70 64 61 74 65   = 'tcl', update
6220: 63 6e 74 20 3d 20 35 3b 0a 20 20 20 20 53 45 4c  cnt = 5;.    SEL
6230: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 30 3b 0a  ECT * FROM t10;.
6240: 20 20 7d 0a 7d 20 7b 74 63 6c 20 35 7d 0a 0a 64    }.} {tcl 5}..d
6250: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 43 2d  o_test triggerC-
6260: 31 30 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  10.3 {.  execsql
6270: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
6280: 42 4c 45 20 74 31 31 28 0a 20 20 20 20 20 20 63  BLE t11(.      c
6290: 31 2c 20 20 20 63 32 2c 20 20 63 33 2c 20 20 63  1,   c2,  c3,  c
62a0: 34 2c 20 20 63 35 2c 20 20 63 36 2c 20 20 63 37  4,  c5,  c6,  c7
62b0: 2c 20 20 63 38 2c 20 20 63 39 2c 20 63 31 30 2c  ,  c8,  c9, c10,
62c0: 0a 20 20 20 20 20 20 63 31 31 2c 20 63 31 32 2c  .      c11, c12,
62d0: 20 63 31 33 2c 20 63 31 34 2c 20 63 31 35 2c 20   c13, c14, c15, 
62e0: 63 31 36 2c 20 63 31 37 2c 20 63 31 38 2c 20 63  c16, c17, c18, c
62f0: 31 39 2c 20 63 32 30 2c 0a 20 20 20 20 20 20 63  19, c20,.      c
6300: 32 31 2c 20 63 32 32 2c 20 63 32 33 2c 20 63 32  21, c22, c23, c2
6310: 34 2c 20 63 32 35 2c 20 63 32 36 2c 20 63 32 37  4, c25, c26, c27
6320: 2c 20 63 32 38 2c 20 63 32 39 2c 20 63 33 30 2c  , c28, c29, c30,
6330: 0a 20 20 20 20 20 20 63 33 31 2c 20 63 33 32 2c  .      c31, c32,
6340: 20 63 33 33 2c 20 63 33 34 2c 20 63 33 35 2c 20   c33, c34, c35, 
6350: 63 33 36 2c 20 63 33 37 2c 20 63 33 38 2c 20 63  c36, c37, c38, c
6360: 33 39 2c 20 63 34 30 0a 20 20 20 20 29 3b 0a 0a  39, c40.    );..
6370: 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47      CREATE TRIGG
6380: 45 52 20 74 31 31 5f 62 75 20 42 45 46 4f 52 45  ER t11_bu BEFORE
6390: 20 55 50 44 41 54 45 20 4f 46 20 63 31 20 4f 4e   UPDATE OF c1 ON
63a0: 20 74 31 31 20 42 45 47 49 4e 0a 20 20 20 20 20   t11 BEGIN.     
63b0: 20 55 50 44 41 54 45 20 74 31 31 20 53 45 54 20   UPDATE t11 SET 
63c0: 63 33 31 20 3d 20 63 33 31 2b 31 2c 20 63 33 32  c31 = c31+1, c32
63d0: 3d 63 33 32 2b 31 20 57 48 45 52 45 20 72 6f 77  =c32+1 WHERE row
63e0: 69 64 20 3d 20 6f 6c 64 2e 72 6f 77 69 64 3b 0a  id = old.rowid;.
63f0: 20 20 20 20 45 4e 44 3b 0a 0a 20 20 20 20 49 4e      END;..    IN
6400: 53 45 52 54 20 49 4e 54 4f 20 74 31 31 20 56 41  SERT INTO t11 VA
6410: 4c 55 45 53 28 0a 20 20 20 20 20 20 31 2c 20 20  LUES(.      1,  
6420: 20 32 2c 20 20 33 2c 20 20 34 2c 20 20 35 2c 20   2,  3,  4,  5, 
6430: 20 36 2c 20 20 37 2c 20 20 38 2c 20 20 39 2c 20   6,  7,  8,  9, 
6440: 31 30 2c 0a 20 20 20 20 20 20 31 31 2c 20 31 32  10,.      11, 12
6450: 2c 20 31 33 2c 20 31 34 2c 20 31 35 2c 20 31 36  , 13, 14, 15, 16
6460: 2c 20 31 37 2c 20 31 38 2c 20 31 39 2c 20 32 30  , 17, 18, 19, 20
6470: 2c 0a 20 20 20 20 20 20 32 31 2c 20 32 32 2c 20  ,.      21, 22, 
6480: 32 33 2c 20 32 34 2c 20 32 35 2c 20 32 36 2c 20  23, 24, 25, 26, 
6490: 32 37 2c 20 32 38 2c 20 32 39 2c 20 33 30 2c 0a  27, 28, 29, 30,.
64a0: 20 20 20 20 20 20 33 31 2c 20 33 32 2c 20 33 33        31, 32, 33
64b0: 2c 20 33 34 2c 20 33 35 2c 20 33 36 2c 20 33 37  , 34, 35, 36, 37
64c0: 2c 20 33 38 2c 20 33 39 2c 20 34 30 0a 20 20 20  , 38, 39, 40.   
64d0: 20 29 3b 0a 20 20 7d 0a 0a 20 20 23 20 42 65 66   );.  }..  # Bef
64e0: 6f 72 65 20 74 68 65 20 70 72 6f 62 6c 65 6d 20  ore the problem 
64f0: 77 61 73 20 66 69 78 65 64 2c 20 74 61 62 6c 65  was fixed, table
6500: 20 74 31 30 20 77 6f 75 6c 64 20 63 6f 6e 74 61   t10 would conta
6510: 69 6e 20 74 68 65 20 74 75 70 6c 65 20 0a 20 20  in the tuple .  
6520: 23 20 28 77 6f 72 6c 64 2c 20 30 29 20 61 66 74  # (world, 0) aft
6530: 65 72 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 66  er running the f
6540: 6f 6c 6c 6f 77 69 6e 67 20 73 63 72 69 70 74 20  ollowing script 
6550: 28 62 65 63 61 75 73 65 20 74 68 65 20 76 61 6c  (because the val
6560: 75 65 0a 20 20 23 20 31 20 77 72 69 74 74 65 6e  ue.  # 1 written
6570: 20 74 6f 20 63 6f 6c 75 6d 6e 20 22 75 70 64 61   to column "upda
6580: 74 65 63 6e 74 22 20 77 61 73 20 63 6c 6f 62 62  tecnt" was clobb
6590: 65 72 65 64 20 62 79 20 74 68 65 20 6f 6c 64 20  ered by the old 
65a0: 76 61 6c 75 65 20 30 29 2e 0a 20 20 23 0a 20 20  value 0)..  #.  
65b0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 55 50  execsql {.    UP
65c0: 44 41 54 45 20 74 31 31 20 53 45 54 20 63 34 3d  DATE t11 SET c4=
65d0: 33 35 2c 20 63 33 33 3d 32 32 2c 20 63 31 3d 35  35, c33=22, c1=5
65e0: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
65f0: 52 4f 4d 20 74 31 31 3b 0a 20 20 7d 20 0a 7d 20  ROM t11;.  } .} 
6600: 7b 35 20 32 20 33 20 33 35 20 35 20 36 20 37 20  {5 2 3 35 5 6 7 
6610: 38 20 39 20 31 30 20 31 31 20 31 32 20 31 33 20  8 9 10 11 12 13 
6620: 31 34 20 31 35 20 31 36 20 31 37 20 31 38 20 31  14 15 16 17 18 1
6630: 39 20 32 30 20 32 31 20 32 32 20 32 33 20 32 34  9 20 21 22 23 24
6640: 20 32 35 20 32 36 20 32 37 20 32 38 20 32 39 20   25 26 27 28 29 
6650: 33 30 20 33 32 20 33 33 20 32 32 20 33 34 20 33  30 32 33 22 34 3
6660: 35 20 33 36 20 33 37 20 33 38 20 33 39 20 34 30  5 36 37 38 39 40
6670: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
6680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
66a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
66b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
66c0: 54 65 73 74 20 74 68 61 74 20 62 75 67 20 5b 33  Test that bug [3
66d0: 37 31 62 61 62 35 64 36 35 5d 20 68 61 73 20 62  71bab5d65] has b
66e0: 65 65 6e 20 66 69 78 65 64 2e 20 42 45 46 4f 52  een fixed. BEFOR
66f0: 45 20 49 4e 53 45 52 54 20 61 6e 64 20 49 4e 53  E INSERT and INS
6700: 54 45 41 44 20 4f 46 0a 23 20 49 4e 53 45 52 54  TEAD OF.# INSERT
6710: 20 74 72 69 67 67 65 72 73 20 77 69 74 68 20 74   triggers with t
6720: 68 65 20 44 45 46 41 55 4c 54 20 56 41 4c 55 45  he DEFAULT VALUE
6730: 53 20 49 4e 53 45 52 54 20 73 79 6e 74 61 78 2e  S INSERT syntax.
6740: 0a 23 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67  .#.do_test trigg
6750: 65 72 43 2d 31 31 2e 30 20 7b 0a 20 20 63 61 74  erC-11.0 {.  cat
6760: 63 68 73 71 6c 20 7b 20 44 52 4f 50 20 54 41 42  chsql { DROP TAB
6770: 4c 45 20 6c 6f 67 20 7d 0a 20 20 65 78 65 63 73  LE log }.  execs
6780: 71 6c 20 20 7b 20 43 52 45 41 54 45 20 54 41 42  ql  { CREATE TAB
6790: 4c 45 20 6c 6f 67 28 61 2c 20 62 29 20 7d 0a 7d  LE log(a, b) }.}
67a0: 20 7b 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74 65   {}..foreach {te
67b0: 73 74 6e 6f 20 74 62 6c 20 64 65 66 61 75 6c 74  stno tbl default
67c0: 73 7d 20 7b 0a 20 20 31 20 22 43 52 45 41 54 45  s} {.  1 "CREATE
67d0: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 22   TABLE t1(a, b)"
67e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67f0: 20 20 20 20 20 20 20 20 20 20 7b 7b 7d 20 7b 7d            {{} {}
6800: 7d 0a 20 20 32 20 22 43 52 45 41 54 45 20 54 41  }.  2 "CREATE TA
6810: 42 4c 45 20 74 31 28 61 20 44 45 46 41 55 4c 54  BLE t1(a DEFAULT
6820: 20 31 2c 20 62 20 44 45 46 41 55 4c 54 20 27 61   1, b DEFAULT 'a
6830: 62 63 27 29 22 20 20 7b 31 20 61 62 63 7d 0a 20  bc')"  {1 abc}. 
6840: 20 33 20 22 43 52 45 41 54 45 20 54 41 42 4c 45   3 "CREATE TABLE
6850: 20 74 31 28 61 2c 20 62 20 44 45 46 41 55 4c 54   t1(a, b DEFAULT
6860: 20 34 2e 35 29 22 20 20 20 20 20 20 20 20 20 20   4.5)"          
6870: 20 20 20 20 7b 7b 7d 20 34 2e 35 7d 0a 7d 20 7b      {{} 4.5}.} {
6880: 0a 20 20 64 6f 5f 74 65 73 74 20 74 72 69 67 67  .  do_test trigg
6890: 65 72 43 2d 31 31 2e 24 74 65 73 74 6e 6f 2e 31  erC-11.$testno.1
68a0: 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20   {.    catchsql 
68b0: 7b 20 44 52 4f 50 20 54 41 42 4c 45 20 74 31 20  { DROP TABLE t1 
68c0: 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  }.    execsql { 
68d0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 6c 6f 67 20  DELETE FROM log 
68e0: 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 24 74  }.    execsql $t
68f0: 62 6c 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b  bl.    execsql {
6900: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 52  .      CREATE TR
6910: 49 47 47 45 52 20 74 74 31 20 42 45 46 4f 52 45  IGGER tt1 BEFORE
6920: 20 49 4e 53 45 52 54 20 4f 4e 20 74 31 20 42 45   INSERT ON t1 BE
6930: 47 49 4e 20 0a 20 20 20 20 20 20 20 20 49 4e 53  GIN .        INS
6940: 45 52 54 20 49 4e 54 4f 20 6c 6f 67 20 56 41 4c  ERT INTO log VAL
6950: 55 45 53 28 6e 65 77 2e 61 2c 20 6e 65 77 2e 62  UES(new.a, new.b
6960: 29 3b 0a 20 20 20 20 20 20 45 4e 44 3b 0a 20 20  );.      END;.  
6970: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
6980: 74 31 20 44 45 46 41 55 4c 54 20 56 41 4c 55 45  t1 DEFAULT VALUE
6990: 53 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  S;.      SELECT 
69a0: 2a 20 46 52 4f 4d 20 6c 6f 67 3b 0a 20 20 20 20  * FROM log;.    
69b0: 7d 0a 20 20 7d 20 24 64 65 66 61 75 6c 74 73 0a  }.  } $defaults.
69c0: 0a 20 20 64 6f 5f 74 65 73 74 20 74 72 69 67 67  .  do_test trigg
69d0: 65 72 43 2d 31 31 2e 24 74 65 73 74 6e 6f 2e 32  erC-11.$testno.2
69e0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
69f0: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 6c 6f 67   DELETE FROM log
6a00: 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   }.    execsql {
6a10: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 52  .      CREATE TR
6a20: 49 47 47 45 52 20 74 74 32 20 41 46 54 45 52 20  IGGER tt2 AFTER 
6a30: 49 4e 53 45 52 54 20 4f 4e 20 74 31 20 42 45 47  INSERT ON t1 BEG
6a40: 49 4e 20 0a 20 20 20 20 20 20 20 20 49 4e 53 45  IN .        INSE
6a50: 52 54 20 49 4e 54 4f 20 6c 6f 67 20 56 41 4c 55  RT INTO log VALU
6a60: 45 53 28 6e 65 77 2e 61 2c 20 6e 65 77 2e 62 29  ES(new.a, new.b)
6a70: 3b 0a 20 20 20 20 20 20 45 4e 44 3b 0a 20 20 20  ;.      END;.   
6a80: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
6a90: 31 20 44 45 46 41 55 4c 54 20 56 41 4c 55 45 53  1 DEFAULT VALUES
6aa0: 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  ;.      SELECT *
6ab0: 20 46 52 4f 4d 20 6c 6f 67 3b 0a 20 20 20 20 7d   FROM log;.    }
6ac0: 0a 20 20 7d 20 5b 63 6f 6e 63 61 74 20 24 64 65  .  } [concat $de
6ad0: 66 61 75 6c 74 73 20 24 64 65 66 61 75 6c 74 73  faults $defaults
6ae0: 5d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 74 72 69  ]..  do_test tri
6af0: 67 67 65 72 43 2d 31 31 2e 24 74 65 73 74 6e 6f  ggerC-11.$testno
6b00: 2e 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .3 {.    execsql
6b10: 20 7b 20 44 52 4f 50 20 54 52 49 47 47 45 52 20   { DROP TRIGGER 
6b20: 74 74 31 20 7d 0a 20 20 20 20 65 78 65 63 73 71  tt1 }.    execsq
6b30: 6c 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  l { DELETE FROM 
6b40: 6c 6f 67 20 7d 0a 20 20 20 20 65 78 65 63 73 71  log }.    execsq
6b50: 6c 20 7b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  l {.      INSERT
6b60: 20 49 4e 54 4f 20 74 31 20 44 45 46 41 55 4c 54   INTO t1 DEFAULT
6b70: 20 56 41 4c 55 45 53 3b 0a 20 20 20 20 20 20 53   VALUES;.      S
6b80: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6c 6f 67  ELECT * FROM log
6b90: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 24 64 65 66  ;.    }.  } $def
6ba0: 61 75 6c 74 73 0a 7d 20 0a 64 6f 5f 74 65 73 74  aults.} .do_test
6bb0: 20 74 72 69 67 67 65 72 43 2d 31 31 2e 34 20 7b   triggerC-11.4 {
6bc0: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 44 52  .  catchsql { DR
6bd0: 4f 50 20 54 41 42 4c 45 20 74 32 20 7d 0a 20 20  OP TABLE t2 }.  
6be0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45  execsql {.    DE
6bf0: 4c 45 54 45 20 46 52 4f 4d 20 6c 6f 67 3b 0a 20  LETE FROM log;. 
6c00: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
6c10: 74 32 28 61 2c 20 62 29 3b 0a 20 20 20 20 43 52  t2(a, b);.    CR
6c20: 45 41 54 45 20 56 49 45 57 20 76 32 20 41 53 20  EATE VIEW v2 AS 
6c30: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
6c40: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49  ;.    CREATE TRI
6c50: 47 47 45 52 20 74 76 32 20 49 4e 53 54 45 41 44  GGER tv2 INSTEAD
6c60: 20 4f 46 20 49 4e 53 45 52 54 20 4f 4e 20 76 32   OF INSERT ON v2
6c70: 20 42 45 47 49 4e 0a 20 20 20 20 20 20 49 4e 53   BEGIN.      INS
6c80: 45 52 54 20 49 4e 54 4f 20 6c 6f 67 20 56 41 4c  ERT INTO log VAL
6c90: 55 45 53 28 6e 65 77 2e 61 2c 20 6e 65 77 2e 62  UES(new.a, new.b
6ca0: 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20 20 20  );.    END;.    
6cb0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 76 32 20 44  INSERT INTO v2 D
6cc0: 45 46 41 55 4c 54 20 56 41 4c 55 45 53 3b 0a 20  EFAULT VALUES;. 
6cd0: 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62 2c 20     SELECT a, b, 
6ce0: 61 20 49 53 20 4e 55 4c 4c 2c 20 62 20 49 53 20  a IS NULL, b IS 
6cf0: 4e 55 4c 4c 20 46 52 4f 4d 20 6c 6f 67 3b 0a 20  NULL FROM log;. 
6d00: 20 7d 0a 7d 20 7b 7b 7d 20 7b 7d 20 31 20 31 7d   }.} {{} {} 1 1}
6d10: 0a 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65  ..do_test trigge
6d20: 72 43 2d 31 32 2e 31 20 7b 0a 20 20 64 62 20 63  rC-12.1 {.  db c
6d30: 6c 6f 73 65 0a 20 20 66 69 6c 65 20 64 65 6c 65  lose.  file dele
6d40: 74 65 20 2d 66 6f 72 63 65 20 74 65 73 74 2e 64  te -force test.d
6d50: 62 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  b.  sqlite3 db t
6d60: 65 73 74 2e 64 62 0a 0a 20 20 65 78 65 63 73 71  est.db..  execsq
6d70: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
6d80: 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
6d90: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
6da0: 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a  1 VALUES(1, 2);.
6db0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
6dc0: 74 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b  t1 VALUES(3, 4);
6dd0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
6de0: 20 74 31 20 56 41 4c 55 45 53 28 35 2c 20 36 29   t1 VALUES(5, 6)
6df0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49  ;.    CREATE TRI
6e00: 47 47 45 52 20 74 72 31 20 41 46 54 45 52 20 49  GGER tr1 AFTER I
6e10: 4e 53 45 52 54 20 4f 4e 20 74 31 20 42 45 47 49  NSERT ON t1 BEGI
6e20: 4e 20 53 45 4c 45 43 54 20 31 20 3b 20 45 4e 44  N SELECT 1 ; END
6e30: 20 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f   ;.    SELECT co
6e40: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 73 71 6c 69  unt(*) FROM sqli
6e50: 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 7d 0a 7d  te_master;.  }.}
6e60: 20 7b 32 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69   {2}.do_test tri
6e70: 67 67 65 72 43 2d 31 32 2e 32 20 7b 0a 20 20 64  ggerC-12.2 {.  d
6e80: 62 20 65 76 61 6c 20 7b 20 53 45 4c 45 43 54 20  b eval { SELECT 
6e90: 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7b 0a 20 20  * FROM t1 } {.  
6ea0: 20 20 69 66 20 7b 24 61 20 3d 3d 20 33 7d 20 7b    if {$a == 3} {
6eb0: 20 65 78 65 63 73 71 6c 20 7b 20 44 52 4f 50 20   execsql { DROP 
6ec0: 54 52 49 47 47 45 52 20 74 72 31 20 7d 20 7d 0a  TRIGGER tr1 } }.
6ed0: 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20    }.  execsql { 
6ee0: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
6ef0: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
6f00: 65 72 20 7d 0a 7d 20 7b 31 7d 0a 0a 64 6f 5f 65  er }.} {1}..do_e
6f10: 78 65 63 73 71 6c 5f 74 65 73 74 20 74 72 69 67  xecsql_test trig
6f20: 67 65 72 43 2d 31 33 2e 31 20 7b 0a 20 20 50 52  gerC-13.1 {.  PR
6f30: 41 47 4d 41 20 72 65 63 75 72 73 69 76 65 5f 74  AGMA recursive_t
6f40: 72 69 67 67 65 72 73 20 3d 20 4f 4e 3b 0a 20 20  riggers = ON;.  
6f50: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 32  CREATE TABLE t12
6f60: 28 61 2c 20 62 29 3b 0a 20 20 49 4e 53 45 52 54  (a, b);.  INSERT
6f70: 20 49 4e 54 4f 20 74 31 32 20 56 41 4c 55 45 53   INTO t12 VALUES
6f80: 28 31 2c 20 32 29 3b 0a 20 20 43 52 45 41 54 45  (1, 2);.  CREATE
6f90: 20 54 52 49 47 47 45 52 20 74 72 31 32 20 41 46   TRIGGER tr12 AF
6fa0: 54 45 52 20 55 50 44 41 54 45 20 4f 4e 20 74 31  TER UPDATE ON t1
6fb0: 32 20 42 45 47 49 4e 0a 20 20 20 20 55 50 44 41  2 BEGIN.    UPDA
6fc0: 54 45 20 74 31 32 20 53 45 54 20 61 3d 6e 65 77  TE t12 SET a=new
6fd0: 2e 61 2b 31 2c 20 62 3d 6e 65 77 2e 62 2b 31 3b  .a+1, b=new.b+1;
6fe0: 0a 20 20 45 4e 44 3b 0a 7d 20 7b 7d 0a 64 6f 5f  .  END;.} {}.do_
6ff0: 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 74 72  catchsql_test tr
7000: 69 67 67 65 72 43 2d 31 33 2e 32 20 7b 0a 20 20  iggerC-13.2 {.  
7010: 55 50 44 41 54 45 20 74 31 32 20 53 45 54 20 61  UPDATE t12 SET a
7020: 3d 61 2b 31 2c 20 62 3d 62 2b 31 3b 0a 7d 20 7b  =a+1, b=b+1;.} {
7030: 31 20 7b 74 6f 6f 20 6d 61 6e 79 20 6c 65 76 65  1 {too many leve
7040: 6c 73 20 6f 66 20 74 72 69 67 67 65 72 20 72 65  ls of trigger re
7050: 63 75 72 73 69 6f 6e 7d 7d 0a 0a 0a 0a 66 69 6e  cursion}}....fin
7060: 69 73 68 5f 74 65 73 74 0a                       ish_test.