/ Hex Artifact Content
Login

Artifact cac41fe31adc1abb9fa08532762fc2b4f662ab03:


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