/ Hex Artifact Content
Login

Artifact 7c13f39ca36f529bf856e05c7d004fc0531d48b4:


0000: 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 73  # The author dis
0010: 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74  claims copyright
0020: 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20   to this source 
0030: 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20  code.  In place 
0040: 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f 74  of.# a legal not
0050: 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20 62  ice, here is a b
0060: 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20 20  lessing:.#.#    
0070: 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20  May you do good 
0080: 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23 20  and not evil..# 
0090: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00a0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00b0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00c0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20 20  give others..#  
00d0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
00e0: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
00f0: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0100: 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a 2a  ou give..#.#****
0110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 0a 23 0a 23 20 54 68 69 73 20 66 69 6c  ***.#.# This fil
0160: 65 20 74 65 73 74 73 20 63 72 65 61 74 69 6e 67  e tests creating
0170: 20 61 6e 64 20 64 72 6f 70 70 69 6e 67 20 74 72   and dropping tr
0180: 69 67 67 65 72 73 2c 20 61 6e 64 20 69 6e 74 65  iggers, and inte
0190: 72 61 63 74 69 6f 6e 20 74 68 65 72 65 6f 66 0a  raction thereof.
01a0: 23 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  # with the datab
01b0: 61 73 65 20 43 4f 4d 4d 49 54 2f 52 4f 4c 4c 42  ase COMMIT/ROLLB
01c0: 41 43 4b 20 6c 6f 67 69 63 2e 0a 23 0a 23 20 31  ACK logic..#.# 1
01d0: 2e 20 43 52 45 41 54 45 20 61 6e 64 20 44 52 4f  . CREATE and DRO
01e0: 50 20 54 52 49 47 47 45 52 20 74 65 73 74 73 0a  P TRIGGER tests.
01f0: 23 20 74 72 69 67 2d 31 2e 31 3a 20 45 72 72 6f  # trig-1.1: Erro
0200: 72 20 69 66 20 74 61 62 6c 65 20 64 6f 65 73 20  r if table does 
0210: 6e 6f 74 20 65 78 69 73 74 0a 23 20 74 72 69 67  not exist.# trig
0220: 2d 31 2e 32 3a 20 45 72 72 6f 72 20 69 66 20 74  -1.2: Error if t
0230: 72 69 67 67 65 72 20 61 6c 72 65 61 64 79 20 65  rigger already e
0240: 78 69 73 74 73 0a 23 20 74 72 69 67 2d 31 2e 33  xists.# trig-1.3
0250: 3a 20 43 72 65 61 74 65 64 20 74 72 69 67 67 65  : Created trigge
0260: 72 73 20 61 72 65 20 64 65 6c 65 74 65 64 20 69  rs are deleted i
0270: 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
0280: 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
0290: 0a 23 20 74 72 69 67 2d 31 2e 34 3a 20 44 52 4f  .# trig-1.4: DRO
02a0: 50 20 54 52 49 47 47 45 52 20 72 65 6d 6f 76 65  P TRIGGER remove
02b0: 73 20 74 72 69 67 67 65 72 0a 23 20 74 72 69 67  s trigger.# trig
02c0: 2d 31 2e 35 3a 20 44 72 6f 70 70 65 64 20 74 72  -1.5: Dropped tr
02d0: 69 67 67 65 72 73 20 61 72 65 20 72 65 73 74 6f  iggers are resto
02e0: 72 65 64 20 69 66 20 74 68 65 20 74 72 61 6e 73  red if the trans
02f0: 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
0300: 20 62 61 63 6b 0a 23 20 74 72 69 67 2d 31 2e 36   back.# trig-1.6
0310: 3a 20 45 72 72 6f 72 20 69 66 20 64 72 6f 70 70  : Error if dropp
0320: 65 64 20 74 72 69 67 67 65 72 20 64 6f 65 73 6e  ed trigger doesn
0330: 27 74 20 65 78 69 73 74 0a 23 20 74 72 69 67 2d  't exist.# trig-
0340: 31 2e 37 3a 20 44 72 6f 70 70 69 6e 67 20 74 68  1.7: Dropping th
0350: 65 20 74 61 62 6c 65 20 61 75 74 6f 6d 61 74 69  e table automati
0360: 63 61 6c 6c 79 20 64 72 6f 70 73 20 61 6c 6c 20  cally drops all 
0370: 74 72 69 67 67 65 72 73 0a 23 20 74 72 69 67 2d  triggers.# trig-
0380: 31 2e 38 3a 20 41 20 74 72 69 67 67 65 72 20 63  1.8: A trigger c
0390: 72 65 61 74 65 64 20 6f 6e 20 61 20 54 45 4d 50  reated on a TEMP
03a0: 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 69 6e   table is not in
03b0: 73 65 72 74 65 64 20 69 6e 74 6f 20 73 71 6c 69  serted into sqli
03c0: 74 65 5f 6d 61 73 74 65 72 0a 23 20 74 72 69 67  te_master.# trig
03d0: 2d 31 2e 39 3a 20 45 6e 73 75 72 65 20 74 68 61  -1.9: Ensure tha
03e0: 74 20 77 65 20 63 61 6e 6e 6f 74 20 63 72 65 61  t we cannot crea
03f0: 74 65 20 61 20 74 72 69 67 67 65 72 20 6f 6e 20  te a trigger on 
0400: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 23 20  sqlite_master.# 
0410: 74 72 69 67 2d 31 2e 31 30 3a 0a 23 20 74 72 69  trig-1.10:.# tri
0420: 67 2d 31 2e 31 31 3a 0a 23 20 74 72 69 67 2d 31  g-1.11:.# trig-1
0430: 2e 31 32 3a 20 45 6e 73 75 72 65 20 74 68 61 74  .12: Ensure that
0440: 20 49 4e 53 54 45 41 44 20 4f 46 20 74 72 69 67   INSTEAD OF trig
0450: 67 65 72 73 20 63 61 6e 6e 6f 74 20 62 65 20 63  gers cannot be c
0460: 72 65 61 74 65 64 20 6f 6e 20 74 61 62 6c 65 73  reated on tables
0470: 0a 23 20 74 72 69 67 2d 31 2e 31 33 3a 20 45 6e  .# trig-1.13: En
0480: 73 75 72 65 20 74 68 61 74 20 41 46 54 45 52 20  sure that AFTER 
0490: 74 72 69 67 67 65 72 73 20 63 61 6e 6e 6f 74 20  triggers cannot 
04a0: 62 65 20 63 72 65 61 74 65 64 20 6f 6e 20 76 69  be created on vi
04b0: 65 77 73 0a 23 20 74 72 69 67 2d 31 2e 31 34 3a  ews.# trig-1.14:
04c0: 20 45 6e 73 75 72 65 20 74 68 61 74 20 42 45 46   Ensure that BEF
04d0: 4f 52 45 20 74 72 69 67 67 65 72 73 20 63 61 6e  ORE triggers can
04e0: 6e 6f 74 20 62 65 20 63 72 65 61 74 65 64 20 6f  not be created o
04f0: 6e 20 76 69 65 77 73 0a 23 0a 0a 73 65 74 20 74  n views.#..set t
0500: 65 73 74 64 69 72 20 5b 66 69 6c 65 20 64 69 72  estdir [file dir
0510: 6e 61 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f 75  name $argv0].sou
0520: 72 63 65 20 24 74 65 73 74 64 69 72 2f 74 65 73  rce $testdir/tes
0530: 74 65 72 2e 74 63 6c 0a 69 66 63 61 70 61 62 6c  ter.tcl.ifcapabl
0540: 65 20 7b 21 74 72 69 67 67 65 72 7d 20 7b 0a 20  e {!trigger} {. 
0550: 20 66 69 6e 69 73 68 5f 74 65 73 74 0a 20 20 72   finish_test.  r
0560: 65 74 75 72 6e 0a 7d 0a 0a 64 6f 5f 74 65 73 74  eturn.}..do_test
0570: 20 74 72 69 67 67 65 72 31 2d 31 2e 31 2e 31 20   trigger1-1.1.1 
0580: 7b 0a 20 20 20 63 61 74 63 68 73 71 6c 20 7b 0a  {.   catchsql {.
0590: 20 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47       CREATE TRIG
05a0: 47 45 52 20 74 72 69 67 20 55 50 44 41 54 45 20  GER trig UPDATE 
05b0: 4f 4e 20 6e 6f 5f 73 75 63 68 5f 74 61 62 6c 65  ON no_such_table
05c0: 20 42 45 47 49 4e 0a 20 20 20 20 20 20 20 53 45   BEGIN.       SE
05d0: 4c 45 43 54 20 2a 20 66 72 6f 6d 20 73 71 6c 69  LECT * from sqli
05e0: 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 20 20 20  te_master;.     
05f0: 45 4e 44 3b 0a 20 20 20 7d 20 0a 7d 20 7b 31 20  END;.   } .} {1 
0600: 7b 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20  {no such table: 
0610: 6d 61 69 6e 2e 6e 6f 5f 73 75 63 68 5f 74 61 62  main.no_such_tab
0620: 6c 65 7d 7d 0a 0a 69 66 63 61 70 61 62 6c 65 20  le}}..ifcapable 
0630: 74 65 6d 70 64 62 20 7b 0a 20 20 64 6f 5f 74 65  tempdb {.  do_te
0640: 73 74 20 74 72 69 67 67 65 72 31 2d 31 2e 31 2e  st trigger1-1.1.
0650: 32 20 7b 0a 20 20 20 20 20 63 61 74 63 68 73 71  2 {.     catchsq
0660: 6c 20 7b 0a 20 20 20 20 20 20 20 43 52 45 41 54  l {.       CREAT
0670: 45 20 54 45 4d 50 20 54 52 49 47 47 45 52 20 74  E TEMP TRIGGER t
0680: 72 69 67 20 55 50 44 41 54 45 20 4f 4e 20 6e 6f  rig UPDATE ON no
0690: 5f 73 75 63 68 5f 74 61 62 6c 65 20 42 45 47 49  _such_table BEGI
06a0: 4e 0a 20 20 20 20 20 20 20 20 20 53 45 4c 45 43  N.         SELEC
06b0: 54 20 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f  T * from sqlite_
06c0: 6d 61 73 74 65 72 3b 0a 20 20 20 20 20 20 20 45  master;.       E
06d0: 4e 44 3b 0a 20 20 20 20 20 7d 20 0a 20 20 7d 20  ND;.     } .  } 
06e0: 7b 31 20 7b 6e 6f 20 73 75 63 68 20 74 61 62 6c  {1 {no such tabl
06f0: 65 3a 20 6e 6f 5f 73 75 63 68 5f 74 61 62 6c 65  e: no_such_table
0700: 7d 7d 0a 7d 0a 0a 65 78 65 63 73 71 6c 20 7b 0a  }}.}..execsql {.
0710: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
0720: 20 74 31 28 61 29 3b 0a 7d 0a 64 6f 5f 74 65 73   t1(a);.}.do_tes
0730: 74 20 74 72 69 67 67 65 72 31 2d 31 2e 31 2e 33  t trigger1-1.1.3
0740: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a   {.  catchsql {.
0750: 20 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47       CREATE TRIG
0760: 47 45 52 20 74 72 69 67 20 55 50 44 41 54 45 20  GER trig UPDATE 
0770: 4f 4e 20 74 31 20 46 4f 52 20 45 41 43 48 20 53  ON t1 FOR EACH S
0780: 54 41 54 45 4d 45 4e 54 20 42 45 47 49 4e 0a 20  TATEMENT BEGIN. 
0790: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20         SELECT * 
07a0: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
07b0: 65 72 3b 0a 20 20 20 20 20 45 4e 44 3b 0a 20 20  er;.     END;.  
07c0: 7d 0a 7d 20 7b 31 20 7b 6e 65 61 72 20 22 53 54  }.} {1 {near "ST
07d0: 41 54 45 4d 45 4e 54 22 3a 20 73 79 6e 74 61 78  ATEMENT": syntax
07e0: 20 65 72 72 6f 72 7d 7d 0a 65 78 65 63 73 71 6c   error}}.execsql
07f0: 20 7b 0a 09 43 52 45 41 54 45 20 54 52 49 47 47   {..CREATE TRIGG
0800: 45 52 20 74 72 31 20 49 4e 53 45 52 54 20 4f 4e  ER tr1 INSERT ON
0810: 20 74 31 20 42 45 47 49 4e 0a 09 20 20 49 4e 53   t1 BEGIN..  INS
0820: 45 52 54 20 49 4e 54 4f 20 74 31 20 76 61 6c 75  ERT INTO t1 valu
0830: 65 73 28 31 29 3b 0a 20 09 45 4e 44 3b 0a 7d 0a  es(1);. .END;.}.
0840: 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 31  do_test trigger1
0850: 2d 31 2e 32 2e 30 20 7b 0a 20 20 20 20 63 61 74  -1.2.0 {.    cat
0860: 63 68 73 71 6c 20 7b 0a 09 43 52 45 41 54 45 20  chsql {..CREATE 
0870: 54 52 49 47 47 45 52 20 49 46 20 4e 4f 54 20 45  TRIGGER IF NOT E
0880: 58 49 53 54 53 20 74 72 31 20 44 45 4c 45 54 45  XISTS tr1 DELETE
0890: 20 4f 4e 20 74 31 20 42 45 47 49 4e 0a 09 20 20   ON t1 BEGIN..  
08a0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
08b0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20  sqlite_master;. 
08c0: 09 45 4e 44 0a 20 20 20 20 20 7d 0a 7d 20 7b 30  .END.     }.} {0
08d0: 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69   {}}.do_test tri
08e0: 67 67 65 72 31 2d 31 2e 32 2e 31 20 7b 0a 20 20  gger1-1.2.1 {.  
08f0: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 09 43 52    catchsql {..CR
0900: 45 41 54 45 20 54 52 49 47 47 45 52 20 74 72 31  EATE TRIGGER tr1
0910: 20 44 45 4c 45 54 45 20 4f 4e 20 74 31 20 42 45   DELETE ON t1 BE
0920: 47 49 4e 0a 09 20 20 20 20 53 45 4c 45 43 54 20  GIN..    SELECT 
0930: 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  * FROM sqlite_ma
0940: 73 74 65 72 3b 0a 20 09 45 4e 44 0a 20 20 20 20  ster;. .END.    
0950: 20 7d 0a 7d 20 7b 31 20 7b 74 72 69 67 67 65 72   }.} {1 {trigger
0960: 20 74 72 31 20 61 6c 72 65 61 64 79 20 65 78 69   tr1 already exi
0970: 73 74 73 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 72  sts}}.do_test tr
0980: 69 67 67 65 72 31 2d 31 2e 32 2e 32 20 7b 0a 20  igger1-1.2.2 {. 
0990: 20 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 09 43     catchsql {..C
09a0: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 22 74  REATE TRIGGER "t
09b0: 72 31 22 20 44 45 4c 45 54 45 20 4f 4e 20 74 31  r1" DELETE ON t1
09c0: 20 42 45 47 49 4e 0a 09 20 20 20 20 53 45 4c 45   BEGIN..    SELE
09d0: 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65  CT * FROM sqlite
09e0: 5f 6d 61 73 74 65 72 3b 0a 20 09 45 4e 44 0a 20  _master;. .END. 
09f0: 20 20 20 20 7d 0a 7d 20 7b 31 20 7b 74 72 69 67      }.} {1 {trig
0a00: 67 65 72 20 22 74 72 31 22 20 61 6c 72 65 61 64  ger "tr1" alread
0a10: 79 20 65 78 69 73 74 73 7d 7d 0a 64 6f 5f 74 65  y exists}}.do_te
0a20: 73 74 20 74 72 69 67 67 65 72 31 2d 31 2e 32 2e  st trigger1-1.2.
0a30: 33 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c  3 {.    catchsql
0a40: 20 7b 0a 09 43 52 45 41 54 45 20 54 52 49 47 47   {..CREATE TRIGG
0a50: 45 52 20 5b 74 72 31 5d 20 44 45 4c 45 54 45 20  ER [tr1] DELETE 
0a60: 4f 4e 20 74 31 20 42 45 47 49 4e 0a 09 20 20 20  ON t1 BEGIN..   
0a70: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73   SELECT * FROM s
0a80: 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20 09  qlite_master;. .
0a90: 45 4e 44 0a 20 20 20 20 20 7d 0a 7d 20 7b 31 20  END.     }.} {1 
0aa0: 7b 74 72 69 67 67 65 72 20 5b 74 72 31 5d 20 61  {trigger [tr1] a
0ab0: 6c 72 65 61 64 79 20 65 78 69 73 74 73 7d 7d 0a  lready exists}}.
0ac0: 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72  .do_test trigger
0ad0: 31 2d 31 2e 33 20 7b 0a 20 20 20 20 63 61 74 63  1-1.3 {.    catc
0ae0: 68 73 71 6c 20 7b 0a 09 42 45 47 49 4e 3b 0a 09  hsql {..BEGIN;..
0af0: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74  CREATE TRIGGER t
0b00: 72 32 20 49 4e 53 45 52 54 20 4f 4e 20 74 31 20  r2 INSERT ON t1 
0b10: 42 45 47 49 4e 0a 09 20 20 20 20 53 45 4c 45 43  BEGIN..    SELEC
0b20: 54 20 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f  T * from sqlite_
0b30: 6d 61 73 74 65 72 3b 20 45 4e 44 3b 0a 20 20 20  master; END;.   
0b40: 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 09       ROLLBACK;..
0b50: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74  CREATE TRIGGER t
0b60: 72 32 20 49 4e 53 45 52 54 20 4f 4e 20 74 31 20  r2 INSERT ON t1 
0b70: 42 45 47 49 4e 0a 09 20 20 20 20 53 45 4c 45 43  BEGIN..    SELEC
0b80: 54 20 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f  T * from sqlite_
0b90: 6d 61 73 74 65 72 3b 20 45 4e 44 3b 0a 20 20 20  master; END;.   
0ba0: 20 7d 0a 7d 20 7b 30 20 7b 7d 7d 0a 0a 64 6f 5f   }.} {0 {}}..do_
0bb0: 74 65 73 74 20 74 72 69 67 67 65 72 31 2d 31 2e  test trigger1-1.
0bc0: 34 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c  4 {.    catchsql
0bd0: 20 7b 0a 09 44 52 4f 50 20 54 52 49 47 47 45 52   {..DROP TRIGGER
0be0: 20 49 46 20 45 58 49 53 54 53 20 74 72 31 3b 0a   IF EXISTS tr1;.
0bf0: 09 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20  .CREATE TRIGGER 
0c00: 74 72 31 20 44 45 4c 45 54 45 20 4f 4e 20 74 31  tr1 DELETE ON t1
0c10: 20 42 45 47 49 4e 0a 09 20 20 20 20 53 45 4c 45   BEGIN..    SELE
0c20: 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65  CT * FROM sqlite
0c30: 5f 6d 61 73 74 65 72 3b 0a 09 45 4e 44 0a 20 20  _master;..END.  
0c40: 20 20 7d 0a 7d 20 7b 30 20 7b 7d 7d 0a 0a 64 6f    }.} {0 {}}..do
0c50: 5f 74 65 73 74 20 74 72 69 67 67 65 72 31 2d 31  _test trigger1-1
0c60: 2e 35 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .5 {.    execsql
0c70: 20 7b 0a 09 42 45 47 49 4e 3b 0a 09 44 52 4f 50   {..BEGIN;..DROP
0c80: 20 54 52 49 47 47 45 52 20 74 72 32 3b 0a 09 52   TRIGGER tr2;..R
0c90: 4f 4c 4c 42 41 43 4b 3b 0a 09 44 52 4f 50 20 54  OLLBACK;..DROP T
0ca0: 52 49 47 47 45 52 20 74 72 32 3b 0a 20 20 20 20  RIGGER tr2;.    
0cb0: 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20  }.} {}..do_test 
0cc0: 74 72 69 67 67 65 72 31 2d 31 2e 36 2e 31 20 7b  trigger1-1.6.1 {
0cd0: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 0a  .    catchsql {.
0ce0: 09 44 52 4f 50 20 54 52 49 47 47 45 52 20 49 46  .DROP TRIGGER IF
0cf0: 20 45 58 49 53 54 53 20 62 69 67 67 6c 65 73 3b   EXISTS biggles;
0d00: 0a 20 20 20 20 7d 0a 7d 20 7b 30 20 7b 7d 7d 0a  .    }.} {0 {}}.
0d10: 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72  .do_test trigger
0d20: 31 2d 31 2e 36 2e 32 20 7b 0a 20 20 20 20 63 61  1-1.6.2 {.    ca
0d30: 74 63 68 73 71 6c 20 7b 0a 09 44 52 4f 50 20 54  tchsql {..DROP T
0d40: 52 49 47 47 45 52 20 62 69 67 67 6c 65 73 3b 0a  RIGGER biggles;.
0d50: 20 20 20 20 7d 0a 7d 20 7b 31 20 7b 6e 6f 20 73      }.} {1 {no s
0d60: 75 63 68 20 74 72 69 67 67 65 72 3a 20 62 69 67  uch trigger: big
0d70: 67 6c 65 73 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20  gles}}..do_test 
0d80: 74 72 69 67 67 65 72 31 2d 31 2e 37 20 7b 0a 20  trigger1-1.7 {. 
0d90: 20 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 09 44     catchsql {..D
0da0: 52 4f 50 20 54 41 42 4c 45 20 74 31 3b 0a 09 44  ROP TABLE t1;..D
0db0: 52 4f 50 20 54 52 49 47 47 45 52 20 74 72 31 3b  ROP TRIGGER tr1;
0dc0: 0a 20 20 20 20 7d 0a 7d 20 7b 31 20 7b 6e 6f 20  .    }.} {1 {no 
0dd0: 73 75 63 68 20 74 72 69 67 67 65 72 3a 20 74 72  such trigger: tr
0de0: 31 7d 7d 0a 0a 69 66 63 61 70 61 62 6c 65 20 74  1}}..ifcapable t
0df0: 65 6d 70 64 62 20 7b 0a 20 20 65 78 65 63 73 71  empdb {.  execsq
0e00: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
0e10: 45 4d 50 20 54 41 42 4c 45 20 74 65 6d 70 5f 74  EMP TABLE temp_t
0e20: 61 62 6c 65 28 61 29 3b 0a 20 20 7d 0a 20 20 64  able(a);.  }.  d
0e30: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 31 2d  o_test trigger1-
0e40: 31 2e 38 20 7b 0a 20 20 20 20 65 78 65 63 73 71  1.8 {.    execsq
0e50: 6c 20 7b 0a 20 20 09 43 52 45 41 54 45 20 54 52  l {.  .CREATE TR
0e60: 49 47 47 45 52 20 74 65 6d 70 5f 74 72 69 67 20  IGGER temp_trig 
0e70: 55 50 44 41 54 45 20 4f 4e 20 74 65 6d 70 5f 74  UPDATE ON temp_t
0e80: 61 62 6c 65 20 42 45 47 49 4e 0a 20 20 09 20 20  able BEGIN.  .  
0e90: 20 20 53 45 4c 45 43 54 20 2a 20 66 72 6f 6d 20    SELECT * from 
0ea0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20  sqlite_master;. 
0eb0: 20 09 45 4e 44 3b 0a 20 20 09 53 45 4c 45 43 54   .END;.  .SELECT
0ec0: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 73   count(*) FROM s
0ed0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45  qlite_master WHE
0ee0: 52 45 20 6e 61 6d 65 20 3d 20 27 74 65 6d 70 5f  RE name = 'temp_
0ef0: 74 72 69 67 27 3b 0a 20 20 20 20 7d 20 0a 20 20  trig';.    } .  
0f00: 7d 20 7b 30 7d 0a 7d 0a 0a 64 6f 5f 74 65 73 74  } {0}.}..do_test
0f10: 20 74 72 69 67 67 65 72 31 2d 31 2e 39 20 7b 0a   trigger1-1.9 {.
0f20: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
0f30: 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20   CREATE TRIGGER 
0f40: 74 72 31 20 41 46 54 45 52 20 55 50 44 41 54 45  tr1 AFTER UPDATE
0f50: 20 4f 4e 20 73 71 6c 69 74 65 5f 6d 61 73 74 65   ON sqlite_maste
0f60: 72 20 42 45 47 49 4e 0a 20 20 20 20 20 20 20 53  r BEGIN.       S
0f70: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c  ELECT * FROM sql
0f80: 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 20 20  ite_master;.    
0f90: 45 4e 44 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 63  END;.  }.} {1 {c
0fa0: 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 74 72 69  annot create tri
0fb0: 67 67 65 72 20 6f 6e 20 73 79 73 74 65 6d 20 74  gger on system t
0fc0: 61 62 6c 65 7d 7d 0a 0a 23 20 43 68 65 63 6b 20  able}}..# Check 
0fd0: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
0fe0: 74 20 61 20 44 45 4c 45 54 45 20 73 74 61 74 65  t a DELETE state
0ff0: 6d 65 6e 74 20 77 69 74 68 69 6e 20 74 68 65 20  ment within the 
1000: 62 6f 64 79 20 6f 66 0a 23 20 61 20 74 72 69 67  body of.# a trig
1010: 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 6d 65 73  ger does not mes
1020: 73 20 75 70 20 74 68 65 20 44 45 4c 45 54 45 20  s up the DELETE 
1030: 74 68 61 74 20 63 61 75 73 65 64 20 74 68 65 20  that caused the 
1040: 74 72 69 67 67 65 72 20 74 6f 0a 23 20 72 75 6e  trigger to.# run
1050: 20 69 6e 20 74 68 65 20 66 69 72 73 74 20 70 6c   in the first pl
1060: 61 63 65 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 74  ace..#.do_test t
1070: 72 69 67 67 65 72 31 2d 31 2e 31 30 20 7b 0a 20  rigger1-1.10 {. 
1080: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 63   execsql {.    c
1090: 72 65 61 74 65 20 74 61 62 6c 65 20 74 31 28 61  reate table t1(a
10a0: 2c 62 29 3b 0a 20 20 20 20 69 6e 73 65 72 74 20  ,b);.    insert 
10b0: 69 6e 74 6f 20 74 31 20 76 61 6c 75 65 73 28 31  into t1 values(1
10c0: 2c 27 61 27 29 3b 0a 20 20 20 20 69 6e 73 65 72  ,'a');.    inser
10d0: 74 20 69 6e 74 6f 20 74 31 20 76 61 6c 75 65 73  t into t1 values
10e0: 28 32 2c 27 62 27 29 3b 0a 20 20 20 20 69 6e 73  (2,'b');.    ins
10f0: 65 72 74 20 69 6e 74 6f 20 74 31 20 76 61 6c 75  ert into t1 valu
1100: 65 73 28 33 2c 27 63 27 29 3b 0a 20 20 20 20 69  es(3,'c');.    i
1110: 6e 73 65 72 74 20 69 6e 74 6f 20 74 31 20 76 61  nsert into t1 va
1120: 6c 75 65 73 28 34 2c 27 64 27 29 3b 0a 20 20 20  lues(4,'d');.   
1130: 20 63 72 65 61 74 65 20 74 72 69 67 67 65 72 20   create trigger 
1140: 72 31 20 61 66 74 65 72 20 64 65 6c 65 74 65 20  r1 after delete 
1150: 6f 6e 20 74 31 20 66 6f 72 20 65 61 63 68 20 72  on t1 for each r
1160: 6f 77 20 62 65 67 69 6e 0a 20 20 20 20 20 20 64  ow begin.      d
1170: 65 6c 65 74 65 20 66 72 6f 6d 20 74 31 20 57 48  elete from t1 WH
1180: 45 52 45 20 61 3d 6f 6c 64 2e 61 2b 32 3b 0a 20  ERE a=old.a+2;. 
1190: 20 20 20 65 6e 64 3b 0a 20 20 20 20 64 65 6c 65     end;.    dele
11a0: 74 65 20 66 72 6f 6d 20 74 31 20 77 68 65 72 65  te from t1 where
11b0: 20 61 3d 31 20 4f 52 20 61 3d 33 3b 0a 20 20 20   a=1 OR a=3;.   
11c0: 20 73 65 6c 65 63 74 20 2a 20 66 72 6f 6d 20 74   select * from t
11d0: 31 3b 0a 20 20 20 20 64 72 6f 70 20 74 61 62 6c  1;.    drop tabl
11e0: 65 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 32 20 62  e t1;.  }.} {2 b
11f0: 20 34 20 64 7d 0a 0a 64 6f 5f 74 65 73 74 20 74   4 d}..do_test t
1200: 72 69 67 67 65 72 31 2d 31 2e 31 31 20 7b 0a 20  rigger1-1.11 {. 
1210: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 63   execsql {.    c
1220: 72 65 61 74 65 20 74 61 62 6c 65 20 74 31 28 61  reate table t1(a
1230: 2c 62 29 3b 0a 20 20 20 20 69 6e 73 65 72 74 20  ,b);.    insert 
1240: 69 6e 74 6f 20 74 31 20 76 61 6c 75 65 73 28 31  into t1 values(1
1250: 2c 27 61 27 29 3b 0a 20 20 20 20 69 6e 73 65 72  ,'a');.    inser
1260: 74 20 69 6e 74 6f 20 74 31 20 76 61 6c 75 65 73  t into t1 values
1270: 28 32 2c 27 62 27 29 3b 0a 20 20 20 20 69 6e 73  (2,'b');.    ins
1280: 65 72 74 20 69 6e 74 6f 20 74 31 20 76 61 6c 75  ert into t1 valu
1290: 65 73 28 33 2c 27 63 27 29 3b 0a 20 20 20 20 69  es(3,'c');.    i
12a0: 6e 73 65 72 74 20 69 6e 74 6f 20 74 31 20 76 61  nsert into t1 va
12b0: 6c 75 65 73 28 34 2c 27 64 27 29 3b 0a 20 20 20  lues(4,'d');.   
12c0: 20 63 72 65 61 74 65 20 74 72 69 67 67 65 72 20   create trigger 
12d0: 72 31 20 61 66 74 65 72 20 75 70 64 61 74 65 20  r1 after update 
12e0: 6f 6e 20 74 31 20 66 6f 72 20 65 61 63 68 20 72  on t1 for each r
12f0: 6f 77 20 62 65 67 69 6e 0a 20 20 20 20 20 20 64  ow begin.      d
1300: 65 6c 65 74 65 20 66 72 6f 6d 20 74 31 20 57 48  elete from t1 WH
1310: 45 52 45 20 61 3d 6f 6c 64 2e 61 2b 32 3b 0a 20  ERE a=old.a+2;. 
1320: 20 20 20 65 6e 64 3b 0a 20 20 20 20 75 70 64 61     end;.    upda
1330: 74 65 20 74 31 20 73 65 74 20 62 3d 27 78 2d 27  te t1 set b='x-'
1340: 20 7c 7c 20 62 20 77 68 65 72 65 20 61 3d 31 20   || b where a=1 
1350: 4f 52 20 61 3d 33 3b 0a 20 20 20 20 73 65 6c 65  OR a=3;.    sele
1360: 63 74 20 2a 20 66 72 6f 6d 20 74 31 3b 0a 20 20  ct * from t1;.  
1370: 20 20 64 72 6f 70 20 74 61 62 6c 65 20 74 31 3b    drop table t1;
1380: 0a 20 20 7d 0a 7d 20 7b 31 20 78 2d 61 20 32 20  .  }.} {1 x-a 2 
1390: 62 20 34 20 64 7d 0a 0a 23 20 45 6e 73 75 72 65  b 4 d}..# Ensure
13a0: 20 74 68 61 74 20 77 65 20 63 61 6e 6e 6f 74 20   that we cannot 
13b0: 63 72 65 61 74 65 20 49 4e 53 54 45 41 44 20 4f  create INSTEAD O
13c0: 46 20 74 72 69 67 67 65 72 73 20 6f 6e 20 74 61  F triggers on ta
13d0: 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 74 72 69  bles.do_test tri
13e0: 67 67 65 72 31 2d 31 2e 31 32 20 7b 0a 20 20 63  gger1-1.12 {.  c
13f0: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 63 72  atchsql {.    cr
1400: 65 61 74 65 20 74 61 62 6c 65 20 74 31 28 61 2c  eate table t1(a,
1410: 62 29 3b 0a 20 20 20 20 63 72 65 61 74 65 20 74  b);.    create t
1420: 72 69 67 67 65 72 20 74 31 74 20 69 6e 73 74 65  rigger t1t inste
1430: 61 64 20 6f 66 20 75 70 64 61 74 65 20 6f 6e 20  ad of update on 
1440: 74 31 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20  t1 for each row 
1450: 62 65 67 69 6e 0a 20 20 20 20 20 20 64 65 6c 65  begin.      dele
1460: 74 65 20 66 72 6f 6d 20 74 31 20 57 48 45 52 45  te from t1 WHERE
1470: 20 61 3d 6f 6c 64 2e 61 2b 32 3b 0a 20 20 20 20   a=old.a+2;.    
1480: 65 6e 64 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 63  end;.  }.} {1 {c
1490: 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 49 4e 53  annot create INS
14a0: 54 45 41 44 20 4f 46 20 74 72 69 67 67 65 72 20  TEAD OF trigger 
14b0: 6f 6e 20 74 61 62 6c 65 3a 20 6d 61 69 6e 2e 74  on table: main.t
14c0: 31 7d 7d 0a 0a 69 66 63 61 70 61 62 6c 65 20 76  1}}..ifcapable v
14d0: 69 65 77 20 7b 0a 23 20 45 6e 73 75 72 65 20 74  iew {.# Ensure t
14e0: 68 61 74 20 77 65 20 63 61 6e 6e 6f 74 20 63 72  hat we cannot cr
14f0: 65 61 74 65 20 42 45 46 4f 52 45 20 74 72 69 67  eate BEFORE trig
1500: 67 65 72 73 20 6f 6e 20 76 69 65 77 73 0a 64 6f  gers on views.do
1510: 5f 74 65 73 74 20 74 72 69 67 67 65 72 31 2d 31  _test trigger1-1
1520: 2e 31 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  .13 {.  catchsql
1530: 20 7b 0a 20 20 20 20 63 72 65 61 74 65 20 76 69   {.    create vi
1540: 65 77 20 76 31 20 61 73 20 73 65 6c 65 63 74 20  ew v1 as select 
1550: 2a 20 66 72 6f 6d 20 74 31 3b 0a 20 20 20 20 63  * from t1;.    c
1560: 72 65 61 74 65 20 74 72 69 67 67 65 72 20 76 31  reate trigger v1
1570: 74 20 62 65 66 6f 72 65 20 75 70 64 61 74 65 20  t before update 
1580: 6f 6e 20 76 31 20 66 6f 72 20 65 61 63 68 20 72  on v1 for each r
1590: 6f 77 20 62 65 67 69 6e 0a 20 20 20 20 20 20 64  ow begin.      d
15a0: 65 6c 65 74 65 20 66 72 6f 6d 20 74 31 20 57 48  elete from t1 WH
15b0: 45 52 45 20 61 3d 6f 6c 64 2e 61 2b 32 3b 0a 20  ERE a=old.a+2;. 
15c0: 20 20 20 65 6e 64 3b 0a 20 20 7d 0a 7d 20 7b 31     end;.  }.} {1
15d0: 20 7b 63 61 6e 6e 6f 74 20 63 72 65 61 74 65 20   {cannot create 
15e0: 42 45 46 4f 52 45 20 74 72 69 67 67 65 72 20 6f  BEFORE trigger o
15f0: 6e 20 76 69 65 77 3a 20 6d 61 69 6e 2e 76 31 7d  n view: main.v1}
1600: 7d 0a 23 20 45 6e 73 75 72 65 20 74 68 61 74 20  }.# Ensure that 
1610: 77 65 20 63 61 6e 6e 6f 74 20 63 72 65 61 74 65  we cannot create
1620: 20 41 46 54 45 52 20 74 72 69 67 67 65 72 73 20   AFTER triggers 
1630: 6f 6e 20 76 69 65 77 73 0a 64 6f 5f 74 65 73 74  on views.do_test
1640: 20 74 72 69 67 67 65 72 31 2d 31 2e 31 34 20 7b   trigger1-1.14 {
1650: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .  catchsql {.  
1660: 20 20 64 72 6f 70 20 76 69 65 77 20 76 31 3b 0a    drop view v1;.
1670: 20 20 20 20 63 72 65 61 74 65 20 76 69 65 77 20      create view 
1680: 76 31 20 61 73 20 73 65 6c 65 63 74 20 2a 20 66  v1 as select * f
1690: 72 6f 6d 20 74 31 3b 0a 20 20 20 20 63 72 65 61  rom t1;.    crea
16a0: 74 65 20 74 72 69 67 67 65 72 20 76 31 74 20 41  te trigger v1t A
16b0: 46 54 45 52 20 75 70 64 61 74 65 20 6f 6e 20 76  FTER update on v
16c0: 31 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 62  1 for each row b
16d0: 65 67 69 6e 0a 20 20 20 20 20 20 64 65 6c 65 74  egin.      delet
16e0: 65 20 66 72 6f 6d 20 74 31 20 57 48 45 52 45 20  e from t1 WHERE 
16f0: 61 3d 6f 6c 64 2e 61 2b 32 3b 0a 20 20 20 20 65  a=old.a+2;.    e
1700: 6e 64 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 63 61  nd;.  }.} {1 {ca
1710: 6e 6e 6f 74 20 63 72 65 61 74 65 20 41 46 54 45  nnot create AFTE
1720: 52 20 74 72 69 67 67 65 72 20 6f 6e 20 76 69 65  R trigger on vie
1730: 77 3a 20 6d 61 69 6e 2e 76 31 7d 7d 0a 7d 20 3b  w: main.v1}}.} ;
1740: 23 20 69 66 63 61 70 61 62 6c 65 20 76 69 65 77  # ifcapable view
1750: 0a 0a 23 20 43 68 65 63 6b 20 66 6f 72 20 6d 65  ..# Check for me
1760: 6d 6f 72 79 20 6c 65 61 6b 73 20 69 6e 20 74 68  mory leaks in th
1770: 65 20 74 72 69 67 67 65 72 20 70 61 72 73 65 72  e trigger parser
1780: 0a 23 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67  .#.do_test trigg
1790: 65 72 31 2d 32 2e 31 20 7b 0a 20 20 63 61 74 63  er1-2.1 {.  catc
17a0: 68 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  hsql {.    CREAT
17b0: 45 20 54 52 49 47 47 45 52 20 72 31 20 41 46 54  E TRIGGER r1 AFT
17c0: 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 74 31 20  ER INSERT ON t1 
17d0: 42 45 47 49 4e 0a 20 20 20 20 20 20 53 45 4c 45  BEGIN.      SELE
17e0: 43 54 20 2a 20 46 52 4f 4d 3b 20 20 2d 2d 20 53  CT * FROM;  -- S
17f0: 79 6e 74 61 78 20 65 72 72 6f 72 0a 20 20 20 20  yntax error.    
1800: 45 4e 44 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 6e  END;.  }.} {1 {n
1810: 65 61 72 20 22 3b 22 3a 20 73 79 6e 74 61 78 20  ear ";": syntax 
1820: 65 72 72 6f 72 7d 7d 0a 64 6f 5f 74 65 73 74 20  error}}.do_test 
1830: 74 72 69 67 67 65 72 31 2d 32 2e 32 20 7b 0a 20  trigger1-2.2 {. 
1840: 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20   catchsql {.    
1850: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 72  CREATE TRIGGER r
1860: 31 20 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f  1 AFTER INSERT O
1870: 4e 20 74 31 20 42 45 47 49 4e 0a 20 20 20 20 20  N t1 BEGIN.     
1880: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1890: 31 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  1;.      SELECT 
18a0: 2a 20 46 52 4f 4d 3b 20 20 2d 2d 20 53 79 6e 74  * FROM;  -- Synt
18b0: 61 78 20 65 72 72 6f 72 0a 20 20 20 20 45 4e 44  ax error.    END
18c0: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 6e 65 61 72  ;.  }.} {1 {near
18d0: 20 22 3b 22 3a 20 73 79 6e 74 61 78 20 65 72 72   ";": syntax err
18e0: 6f 72 7d 7d 0a 0a 23 20 43 72 65 61 74 65 20 61  or}}..# Create a
18f0: 20 74 72 69 67 67 65 72 20 74 68 61 74 20 72 65   trigger that re
1900: 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20  fers to a table 
1910: 74 68 61 74 20 6d 69 67 68 74 20 6e 6f 74 20 65  that might not e
1920: 78 69 73 74 2e 0a 23 0a 69 66 63 61 70 61 62 6c  xist..#.ifcapabl
1930: 65 20 74 65 6d 70 64 62 20 7b 0a 20 20 64 6f 5f  e tempdb {.  do_
1940: 74 65 73 74 20 74 72 69 67 67 65 72 31 2d 33 2e  test trigger1-3.
1950: 31 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  1 {.    execsql 
1960: 7b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54  {.      CREATE T
1970: 45 4d 50 20 54 41 42 4c 45 20 74 32 28 78 2c 79  EMP TABLE t2(x,y
1980: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 74  );.    }.    cat
1990: 63 68 73 71 6c 20 7b 0a 20 20 20 20 20 20 43 52  chsql {.      CR
19a0: 45 41 54 45 20 54 52 49 47 47 45 52 20 72 31 20  EATE TRIGGER r1 
19b0: 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f 4e 20  AFTER INSERT ON 
19c0: 74 31 20 42 45 47 49 4e 0a 20 20 20 20 20 20 20  t1 BEGIN.       
19d0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
19e0: 56 41 4c 55 45 53 28 4e 45 57 2e 61 2c 4e 45 57  VALUES(NEW.a,NEW
19f0: 2e 62 29 3b 0a 20 20 20 20 20 20 45 4e 44 3b 0a  .b);.      END;.
1a00: 20 20 20 20 7d 0a 20 20 7d 20 7b 30 20 7b 7d 7d      }.  } {0 {}}
1a10: 0a 20 20 64 6f 5f 74 65 73 74 20 74 72 69 67 67  .  do_test trigg
1a20: 65 72 2d 33 2e 32 20 7b 0a 20 20 20 20 63 61 74  er-3.2 {.    cat
1a30: 63 68 73 71 6c 20 7b 0a 20 20 20 20 20 20 49 4e  chsql {.      IN
1a40: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
1a50: 55 45 53 28 31 2c 32 29 3b 0a 20 20 20 20 20 20  UES(1,2);.      
1a60: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
1a70: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20 7b  ;.    }.  } {1 {
1a80: 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 6d  no such table: m
1a90: 61 69 6e 2e 74 32 7d 7d 0a 20 20 64 6f 5f 74 65  ain.t2}}.  do_te
1aa0: 73 74 20 74 72 69 67 67 65 72 2d 33 2e 33 20 7b  st trigger-3.3 {
1ab0: 0a 20 20 20 20 64 62 20 63 6c 6f 73 65 0a 20 20  .    db close.  
1ac0: 20 20 73 65 74 20 72 63 20 5b 63 61 74 63 68 20    set rc [catch 
1ad0: 7b 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74  {sqlite3 db test
1ae0: 2e 64 62 7d 20 65 72 72 5d 0a 20 20 20 20 69 66  .db} err].    if
1af0: 20 7b 24 72 63 7d 20 7b 6c 61 70 70 65 6e 64 20   {$rc} {lappend 
1b00: 72 63 20 24 65 72 72 7d 0a 20 20 20 20 73 65 74  rc $err}.    set
1b10: 20 72 63 0a 20 20 7d 20 7b 30 7d 0a 20 20 64 6f   rc.  } {0}.  do
1b20: 5f 74 65 73 74 20 74 72 69 67 67 65 72 2d 33 2e  _test trigger-3.
1b30: 34 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c  4 {.    catchsql
1b40: 20 7b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20   {.      INSERT 
1b50: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
1b60: 2c 32 29 3b 0a 20 20 20 20 20 20 53 45 4c 45 43  ,2);.      SELEC
1b70: 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20  T * FROM t2;.   
1b80: 20 7d 0a 20 20 7d 20 7b 31 20 7b 6e 6f 20 73 75   }.  } {1 {no su
1b90: 63 68 20 74 61 62 6c 65 3a 20 6d 61 69 6e 2e 74  ch table: main.t
1ba0: 32 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 74 72  2}}.  do_test tr
1bb0: 69 67 67 65 72 2d 33 2e 35 20 7b 0a 20 20 20 20  igger-3.5 {.    
1bc0: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 20  catchsql {.     
1bd0: 20 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42   CREATE TEMP TAB
1be0: 4c 45 20 74 32 28 78 2c 79 29 3b 0a 20 20 20 20  LE t2(x,y);.    
1bf0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
1c00: 20 56 41 4c 55 45 53 28 31 2c 32 29 3b 0a 20 20   VALUES(1,2);.  
1c10: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
1c20: 4d 20 74 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  M t2;.    }.  } 
1c30: 7b 31 20 7b 6e 6f 20 73 75 63 68 20 74 61 62 6c  {1 {no such tabl
1c40: 65 3a 20 6d 61 69 6e 2e 74 32 7d 7d 0a 20 20 64  e: main.t2}}.  d
1c50: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 2d 33  o_test trigger-3
1c60: 2e 36 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71  .6 {.    catchsq
1c70: 6c 20 7b 0a 20 20 20 20 20 20 44 52 4f 50 20 54  l {.      DROP T
1c80: 52 49 47 47 45 52 20 72 31 3b 0a 20 20 20 20 20  RIGGER r1;.     
1c90: 20 43 52 45 41 54 45 20 54 45 4d 50 20 54 52 49   CREATE TEMP TRI
1ca0: 47 47 45 52 20 72 31 20 41 46 54 45 52 20 49 4e  GGER r1 AFTER IN
1cb0: 53 45 52 54 20 4f 4e 20 74 31 20 42 45 47 49 4e  SERT ON t1 BEGIN
1cc0: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
1cd0: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 4e  INTO t2 VALUES(N
1ce0: 45 57 2e 61 2c 4e 45 57 2e 62 29 3b 0a 20 20 20  EW.a,NEW.b);.   
1cf0: 20 20 20 45 4e 44 3b 0a 20 20 20 20 20 20 49 4e     END;.      IN
1d00: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
1d10: 55 45 53 28 31 2c 32 29 3b 0a 20 20 20 20 20 20  UES(1,2);.      
1d20: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
1d30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 30 20 7b  ;.    }.  } {0 {
1d40: 31 20 32 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20  1 2}}.  do_test 
1d50: 74 72 69 67 67 65 72 2d 33 2e 37 20 7b 0a 20 20  trigger-3.7 {.  
1d60: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
1d70: 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74 32 3b    DROP TABLE t2;
1d80: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
1d90: 42 4c 45 20 74 32 28 78 2c 79 29 3b 0a 20 20 20  BLE t2(x,y);.   
1da0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
1db0: 20 74 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b   t2;.    }.  } {
1dc0: 7d 0a 0a 20 20 23 20 54 68 65 72 65 20 61 72 65  }..  # There are
1dd0: 20 74 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66   two versions of
1de0: 20 74 72 69 67 67 65 72 2d 33 2e 38 20 61 6e 64   trigger-3.8 and
1df0: 20 74 72 69 67 67 65 72 2d 33 2e 39 2e 20 4f 6e   trigger-3.9. On
1e00: 65 20 74 68 61 74 20 75 73 65 73 0a 20 20 23 20  e that uses.  # 
1e10: 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
1e20: 73 74 61 74 65 6d 65 6e 74 73 2c 20 61 6e 64 20  statements, and 
1e30: 61 6e 6f 74 68 65 72 20 74 68 61 74 20 64 6f 65  another that doe
1e40: 73 20 6e 6f 74 2e 0a 20 20 69 66 63 61 70 61 62  s not..  ifcapab
1e50: 6c 65 20 63 6f 6d 70 6f 75 6e 64 20 7b 0a 20 20  le compound {.  
1e60: 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 31  do_test trigger1
1e70: 2d 33 2e 38 20 7b 0a 20 20 20 20 65 78 65 63 73  -3.8 {.    execs
1e80: 71 6c 20 7b 0a 20 20 20 20 20 20 49 4e 53 45 52  ql {.      INSER
1e90: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
1ea0: 28 33 2c 34 29 3b 0a 20 20 20 20 20 20 53 45 4c  (3,4);.      SEL
1eb0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 55 4e  ECT * FROM t1 UN
1ec0: 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 2a  ION ALL SELECT *
1ed0: 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 7d 0a   FROM t2;.    }.
1ee0: 20 20 7d 20 7b 31 20 32 20 33 20 34 20 33 20 34    } {1 2 3 4 3 4
1ef0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 74 72 69 67  }.  do_test trig
1f00: 67 65 72 31 2d 33 2e 39 20 7b 0a 20 20 20 20 64  ger1-3.9 {.    d
1f10: 62 20 63 6c 6f 73 65 0a 20 20 20 20 73 71 6c 69  b close.    sqli
1f20: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
1f30: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
1f40: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1f50: 31 20 56 41 4c 55 45 53 28 35 2c 36 29 3b 0a 20  1 VALUES(5,6);. 
1f60: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
1f70: 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 41 4c 4c 20  OM t1 UNION ALL 
1f80: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
1f90: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20 32  ;.    }.  } {1 2
1fa0: 20 33 20 34 20 35 20 36 20 33 20 34 7d 0a 20 20   3 4 5 6 3 4}.  
1fb0: 7d 20 3b 23 20 69 66 63 61 70 61 62 6c 65 20 63  } ;# ifcapable c
1fc0: 6f 6d 70 6f 75 6e 64 0a 20 20 69 66 63 61 70 61  ompound.  ifcapa
1fd0: 62 6c 65 20 21 63 6f 6d 70 6f 75 6e 64 20 7b 0a  ble !compound {.
1fe0: 20 20 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65    do_test trigge
1ff0: 72 31 2d 33 2e 38 20 7b 0a 20 20 20 20 65 78 65  r1-3.8 {.    exe
2000: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 49 4e 53  csql {.      INS
2010: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
2020: 45 53 28 33 2c 34 29 3b 0a 20 20 20 20 20 20 53  ES(3,4);.      S
2030: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
2040: 20 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a   .      SELECT *
2050: 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 7d 0a   FROM t2;.    }.
2060: 20 20 7d 20 7b 31 20 32 20 33 20 34 20 33 20 34    } {1 2 3 4 3 4
2070: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 74 72 69 67  }.  do_test trig
2080: 67 65 72 31 2d 33 2e 39 20 7b 0a 20 20 20 20 64  ger1-3.9 {.    d
2090: 62 20 63 6c 6f 73 65 0a 20 20 20 20 73 71 6c 69  b close.    sqli
20a0: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
20b0: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
20c0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
20d0: 31 20 56 41 4c 55 45 53 28 35 2c 36 29 3b 0a 20  1 VALUES(5,6);. 
20e0: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
20f0: 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 53 45 4c  OM t1;.      SEL
2100: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20  ECT * FROM t2;. 
2110: 20 20 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20     }.  } {1 2 3 
2120: 34 20 35 20 36 20 33 20 34 7d 0a 20 20 7d 20 3b  4 5 6 3 4}.  } ;
2130: 23 20 69 66 63 61 70 61 62 6c 65 20 21 63 6f 6d  # ifcapable !com
2140: 70 6f 75 6e 64 0a 0a 20 20 64 6f 5f 74 65 73 74  pound..  do_test
2150: 20 74 72 69 67 67 65 72 31 2d 34 2e 31 20 7b 0a   trigger1-4.1 {.
2160: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
2170: 20 20 20 20 43 52 45 41 54 45 20 54 45 4d 50 20      CREATE TEMP 
2180: 54 52 49 47 47 45 52 20 72 31 20 42 45 46 4f 52  TRIGGER r1 BEFOR
2190: 45 20 49 4e 53 45 52 54 20 4f 4e 20 74 31 20 42  E INSERT ON t1 B
21a0: 45 47 49 4e 0a 20 20 20 20 20 20 20 20 49 4e 53  EGIN.        INS
21b0: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
21c0: 45 53 28 4e 45 57 2e 61 2c 4e 45 57 2e 62 29 3b  ES(NEW.a,NEW.b);
21d0: 0a 20 20 20 20 20 20 45 4e 44 3b 0a 20 20 20 20  .      END;.    
21e0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
21f0: 20 56 41 4c 55 45 53 28 37 2c 38 29 3b 0a 20 20   VALUES(7,8);.  
2200: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
2210: 4d 20 74 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  M t2;.    }.  } 
2220: 7b 33 20 34 20 37 20 38 7d 0a 20 20 64 6f 5f 74  {3 4 7 8}.  do_t
2230: 65 73 74 20 74 72 69 67 67 65 72 31 2d 34 2e 32  est trigger1-4.2
2240: 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64   {.    sqlite3 d
2250: 62 32 20 74 65 73 74 2e 64 62 0a 20 20 20 20 65  b2 test.db.    e
2260: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 49  xecsql {.      I
2270: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
2280: 4c 55 45 53 28 39 2c 31 30 29 3b 0a 20 20 20 20  LUES(9,10);.    
2290: 7d 20 64 62 32 3b 0a 20 20 20 20 64 62 32 20 63  } db2;.    db2 c
22a0: 6c 6f 73 65 0a 20 20 20 20 65 78 65 63 73 71 6c  lose.    execsql
22b0: 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20   {.      SELECT 
22c0: 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 7d  * FROM t2;.    }
22d0: 0a 20 20 7d 20 7b 33 20 34 20 37 20 38 7d 0a 20  .  } {3 4 7 8}. 
22e0: 20 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72   do_test trigger
22f0: 31 2d 34 2e 33 20 7b 0a 20 20 20 20 65 78 65 63  1-4.3 {.    exec
2300: 73 71 6c 20 7b 0a 20 20 20 20 20 20 44 52 4f 50  sql {.      DROP
2310: 20 54 41 42 4c 45 20 74 31 3b 0a 20 20 20 20 20   TABLE t1;.     
2320: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
2330: 32 3b 0a 20 20 20 20 7d 3b 0a 20 20 7d 20 7b 33  2;.    };.  } {3
2340: 20 34 20 37 20 38 7d 0a 20 20 64 6f 5f 74 65 73   4 7 8}.  do_tes
2350: 74 20 74 72 69 67 67 65 72 31 2d 34 2e 34 20 7b  t trigger1-4.4 {
2360: 0a 20 20 20 20 64 62 20 63 6c 6f 73 65 0a 20 20  .    db close.  
2370: 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
2380: 74 2e 64 62 0a 20 20 20 20 65 78 65 63 73 71 6c  t.db.    execsql
2390: 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20   {.      SELECT 
23a0: 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 7d  * FROM t2;.    }
23b0: 3b 0a 20 20 7d 20 7b 33 20 34 20 37 20 38 7d 0a  ;.  } {3 4 7 8}.
23c0: 7d 20 65 6c 73 65 20 7b 0a 20 20 65 78 65 63 73  } else {.  execs
23d0: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
23e0: 54 41 42 4c 45 20 74 32 28 78 2c 79 29 3b 0a 20  TABLE t2(x,y);. 
23f0: 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74 31     DROP TABLE t1
2400: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
2410: 4f 20 74 32 20 56 41 4c 55 45 53 28 33 2c 20 34  O t2 VALUES(3, 4
2420: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
2430: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 37 2c 20  TO t2 VALUES(7, 
2440: 38 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 69 6e 74 65  8);.  }.}...inte
2450: 67 72 69 74 79 5f 63 68 65 63 6b 20 74 72 69 67  grity_check trig
2460: 67 65 72 31 2d 35 2e 31 0a 0a 23 20 43 72 65 61  ger1-5.1..# Crea
2470: 74 65 20 61 20 74 72 69 67 67 65 72 20 77 69 74  te a trigger wit
2480: 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  h the same name 
2490: 61 73 20 61 20 74 61 62 6c 65 2e 20 20 4d 61 6b  as a table.  Mak
24a0: 65 20 73 75 72 65 20 74 68 65 0a 23 20 74 72 69  e sure the.# tri
24b0: 67 67 65 72 20 77 6f 72 6b 73 2e 20 20 54 68 65  gger works.  The
24c0: 6e 20 64 72 6f 70 20 74 68 65 20 74 72 69 67 67  n drop the trigg
24d0: 65 72 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74  er.  Make sure t
24e0: 68 65 20 74 61 62 6c 65 20 69 73 0a 23 20 73 74  he table is.# st
24f0: 69 6c 6c 20 74 68 65 72 65 2e 0a 23 0a 73 65 74  ill there..#.set
2500: 20 76 69 65 77 5f 76 31 20 7b 7d 0a 69 66 63 61   view_v1 {}.ifca
2510: 70 61 62 6c 65 20 76 69 65 77 20 7b 0a 20 20 73  pable view {.  s
2520: 65 74 20 76 69 65 77 5f 76 31 20 7b 76 69 65 77  et view_v1 {view
2530: 20 76 31 7d 0a 7d 0a 64 6f 5f 74 65 73 74 20 74   v1}.}.do_test t
2540: 72 69 67 67 65 72 31 2d 36 2e 31 20 7b 0a 20 20  rigger1-6.1 {.  
2550: 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20  execsql {SELECT 
2560: 74 79 70 65 2c 20 6e 61 6d 65 20 46 52 4f 4d 20  type, name FROM 
2570: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 7d 0a 7d  sqlite_master}.}
2580: 20 5b 63 6f 6e 63 61 74 20 24 76 69 65 77 5f 76   [concat $view_v
2590: 31 20 7b 74 61 62 6c 65 20 74 32 7d 5d 0a 64 6f  1 {table t2}].do
25a0: 5f 74 65 73 74 20 74 72 69 67 67 65 72 31 2d 36  _test trigger1-6
25b0: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
25c0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47  .    CREATE TRIG
25d0: 47 45 52 20 74 32 20 42 45 46 4f 52 45 20 44 45  GER t2 BEFORE DE
25e0: 4c 45 54 45 20 4f 4e 20 74 32 20 42 45 47 49 4e  LETE ON t2 BEGIN
25f0: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 52 41  .      SELECT RA
2600: 49 53 45 28 41 42 4f 52 54 2c 27 64 65 6c 65 74  ISE(ABORT,'delet
2610: 65 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77  es are not allow
2620: 73 27 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20  s');.    END;.  
2630: 20 20 53 45 4c 45 43 54 20 74 79 70 65 2c 20 6e    SELECT type, n
2640: 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  ame FROM sqlite_
2650: 6d 61 73 74 65 72 3b 0a 20 20 7d 0a 7d 20 5b 63  master;.  }.} [c
2660: 6f 6e 63 61 74 20 24 76 69 65 77 5f 76 31 20 7b  oncat $view_v1 {
2670: 74 61 62 6c 65 20 74 32 20 74 72 69 67 67 65 72  table t2 trigger
2680: 20 74 32 7d 5d 0a 64 6f 5f 74 65 73 74 20 74 72   t2}].do_test tr
2690: 69 67 67 65 72 31 2d 36 2e 33 20 7b 0a 20 20 63  igger1-6.3 {.  c
26a0: 61 74 63 68 73 71 6c 20 7b 44 45 4c 45 54 45 20  atchsql {DELETE 
26b0: 46 52 4f 4d 20 74 32 7d 0a 7d 20 7b 31 20 7b 64  FROM t2}.} {1 {d
26c0: 65 6c 65 74 65 73 20 61 72 65 20 6e 6f 74 20 61  eletes are not a
26d0: 6c 6c 6f 77 73 7d 7d 0a 64 6f 5f 74 65 73 74 20  llows}}.do_test 
26e0: 74 72 69 67 67 65 72 31 2d 36 2e 34 20 7b 0a 20  trigger1-6.4 {. 
26f0: 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54   execsql {SELECT
2700: 20 2a 20 46 52 4f 4d 20 74 32 7d 0a 7d 20 7b 33   * FROM t2}.} {3
2710: 20 34 20 37 20 38 7d 0a 64 6f 5f 74 65 73 74 20   4 7 8}.do_test 
2720: 74 72 69 67 67 65 72 31 2d 36 2e 35 20 7b 0a 20  trigger1-6.5 {. 
2730: 20 64 62 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69   db close.  sqli
2740: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
2750: 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54   execsql {SELECT
2760: 20 74 79 70 65 2c 20 6e 61 6d 65 20 46 52 4f 4d   type, name FROM
2770: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 7d 0a   sqlite_master}.
2780: 7d 20 5b 63 6f 6e 63 61 74 20 24 76 69 65 77 5f  } [concat $view_
2790: 76 31 20 7b 74 61 62 6c 65 20 74 32 20 74 72 69  v1 {table t2 tri
27a0: 67 67 65 72 20 74 32 7d 5d 0a 64 6f 5f 74 65 73  gger t2}].do_tes
27b0: 74 20 74 72 69 67 67 65 72 31 2d 36 2e 36 20 7b  t trigger1-6.6 {
27c0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
27d0: 20 44 52 4f 50 20 54 52 49 47 47 45 52 20 74 32   DROP TRIGGER t2
27e0: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 74 79 70  ;.    SELECT typ
27f0: 65 2c 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c  e, name FROM sql
2800: 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 7d 0a  ite_master;.  }.
2810: 7d 20 5b 63 6f 6e 63 61 74 20 24 76 69 65 77 5f  } [concat $view_
2820: 76 31 20 7b 74 61 62 6c 65 20 74 32 7d 5d 0a 64  v1 {table t2}].d
2830: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 31 2d  o_test trigger1-
2840: 36 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  6.7 {.  execsql 
2850: 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  {SELECT * FROM t
2860: 32 7d 0a 7d 20 7b 33 20 34 20 37 20 38 7d 0a 64  2}.} {3 4 7 8}.d
2870: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 31 2d  o_test trigger1-
2880: 36 2e 38 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65  6.8 {.  db close
2890: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
28a0: 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20  st.db.  execsql 
28b0: 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  {SELECT * FROM t
28c0: 32 7d 0a 7d 20 7b 33 20 34 20 37 20 38 7d 0a 0a  2}.} {3 4 7 8}..
28d0: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
28e0: 74 72 69 67 67 65 72 2d 37 2e 31 0a 0a 23 20 43  trigger-7.1..# C
28f0: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
2900: 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  e the name of a 
2910: 74 72 69 67 67 65 72 20 63 61 6e 20 62 65 20 71  trigger can be q
2920: 75 6f 74 65 64 20 73 6f 20 74 68 61 74 20 6b 65  uoted so that ke
2930: 79 77 6f 72 64 73 0a 23 20 63 61 6e 20 62 65 20  ywords.# can be 
2940: 75 73 65 64 20 61 73 20 74 72 69 67 67 65 72 20  used as trigger 
2950: 6e 61 6d 65 73 2e 20 20 54 69 63 6b 65 74 20 23  names.  Ticket #
2960: 34 36 38 0a 23 0a 64 6f 5f 74 65 73 74 20 74 72  468.#.do_test tr
2970: 69 67 67 65 72 31 2d 38 2e 31 20 7b 0a 20 20 65  igger1-8.1 {.  e
2980: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
2990: 41 54 45 20 54 52 49 47 47 45 52 20 27 74 72 69  ATE TRIGGER 'tri
29a0: 67 67 65 72 27 20 41 46 54 45 52 20 49 4e 53 45  gger' AFTER INSE
29b0: 52 54 20 4f 4e 20 74 32 20 42 45 47 49 4e 20 53  RT ON t2 BEGIN S
29c0: 45 4c 45 43 54 20 31 3b 20 45 4e 44 3b 0a 20 20  ELECT 1; END;.  
29d0: 20 20 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52    SELECT name FR
29e0: 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
29f0: 20 57 48 45 52 45 20 74 79 70 65 3d 27 74 72 69   WHERE type='tri
2a00: 67 67 65 72 27 3b 0a 20 20 7d 0a 7d 20 7b 74 72  gger';.  }.} {tr
2a10: 69 67 67 65 72 7d 0a 64 6f 5f 74 65 73 74 20 74  igger}.do_test t
2a20: 72 69 67 67 65 72 31 2d 38 2e 32 20 7b 0a 20 20  rigger1-8.2 {.  
2a30: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 52  execsql {.    DR
2a40: 4f 50 20 54 52 49 47 47 45 52 20 27 74 72 69 67  OP TRIGGER 'trig
2a50: 67 65 72 27 3b 0a 20 20 20 20 53 45 4c 45 43 54  ger';.    SELECT
2a60: 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74   name FROM sqlit
2a70: 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20 74  e_master WHERE t
2a80: 79 70 65 3d 27 74 72 69 67 67 65 72 27 3b 0a 20  ype='trigger';. 
2a90: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
2aa0: 74 72 69 67 67 65 72 31 2d 38 2e 33 20 7b 0a 20  trigger1-8.3 {. 
2ab0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
2ac0: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 22 74  REATE TRIGGER "t
2ad0: 72 69 67 67 65 72 22 20 41 46 54 45 52 20 49 4e  rigger" AFTER IN
2ae0: 53 45 52 54 20 4f 4e 20 74 32 20 42 45 47 49 4e  SERT ON t2 BEGIN
2af0: 20 53 45 4c 45 43 54 20 31 3b 20 45 4e 44 3b 0a   SELECT 1; END;.
2b00: 20 20 20 20 53 45 4c 45 43 54 20 6e 61 6d 65 20      SELECT name 
2b10: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
2b20: 65 72 20 57 48 45 52 45 20 74 79 70 65 3d 27 74  er WHERE type='t
2b30: 72 69 67 67 65 72 27 3b 0a 20 20 7d 0a 7d 20 7b  rigger';.  }.} {
2b40: 74 72 69 67 67 65 72 7d 0a 64 6f 5f 74 65 73 74  trigger}.do_test
2b50: 20 74 72 69 67 67 65 72 31 2d 38 2e 34 20 7b 0a   trigger1-8.4 {.
2b60: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
2b70: 44 52 4f 50 20 54 52 49 47 47 45 52 20 22 74 72  DROP TRIGGER "tr
2b80: 69 67 67 65 72 22 3b 0a 20 20 20 20 53 45 4c 45  igger";.    SELE
2b90: 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c  CT name FROM sql
2ba0: 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45  ite_master WHERE
2bb0: 20 74 79 70 65 3d 27 74 72 69 67 67 65 72 27 3b   type='trigger';
2bc0: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
2bd0: 74 20 74 72 69 67 67 65 72 31 2d 38 2e 35 20 7b  t trigger1-8.5 {
2be0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
2bf0: 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20   CREATE TRIGGER 
2c00: 5b 74 72 69 67 67 65 72 5d 20 41 46 54 45 52 20  [trigger] AFTER 
2c10: 49 4e 53 45 52 54 20 4f 4e 20 74 32 20 42 45 47  INSERT ON t2 BEG
2c20: 49 4e 20 53 45 4c 45 43 54 20 31 3b 20 45 4e 44  IN SELECT 1; END
2c30: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 6e 61 6d  ;.    SELECT nam
2c40: 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  e FROM sqlite_ma
2c50: 73 74 65 72 20 57 48 45 52 45 20 74 79 70 65 3d  ster WHERE type=
2c60: 27 74 72 69 67 67 65 72 27 3b 0a 20 20 7d 0a 7d  'trigger';.  }.}
2c70: 20 7b 74 72 69 67 67 65 72 7d 0a 64 6f 5f 74 65   {trigger}.do_te
2c80: 73 74 20 74 72 69 67 67 65 72 31 2d 38 2e 36 20  st trigger1-8.6 
2c90: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
2ca0: 20 20 44 52 4f 50 20 54 52 49 47 47 45 52 20 5b    DROP TRIGGER [
2cb0: 74 72 69 67 67 65 72 5d 3b 0a 20 20 20 20 53 45  trigger];.    SE
2cc0: 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73  LECT name FROM s
2cd0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45  qlite_master WHE
2ce0: 52 45 20 74 79 70 65 3d 27 74 72 69 67 67 65 72  RE type='trigger
2cf0: 27 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 69 66 63  ';.  }.} {}..ifc
2d00: 61 70 61 62 6c 65 20 63 6f 6e 66 6c 69 63 74 20  apable conflict 
2d10: 7b 0a 20 20 23 20 4d 61 6b 65 20 73 75 72 65 20  {.  # Make sure 
2d20: 52 45 50 4c 41 43 45 20 77 6f 72 6b 73 20 69 6e  REPLACE works in
2d30: 73 69 64 65 20 6f 66 20 74 72 69 67 67 65 72 73  side of triggers
2d40: 2e 0a 20 20 23 0a 20 20 23 20 54 68 65 72 65 20  ..  #.  # There 
2d50: 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e 73  are two versions
2d60: 20 6f 66 20 74 72 69 67 67 65 72 2d 39 2e 31 20   of trigger-9.1 
2d70: 61 6e 64 20 74 72 69 67 67 65 72 2d 39 2e 32 2e  and trigger-9.2.
2d80: 20 4f 6e 65 20 74 68 61 74 20 75 73 65 73 0a 20   One that uses. 
2d90: 20 23 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   # compound SELE
2da0: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2c 20 61  CT statements, a
2db0: 6e 64 20 61 6e 6f 74 68 65 72 20 74 68 61 74 20  nd another that 
2dc0: 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 69 66 63 61  does not..  ifca
2dd0: 70 61 62 6c 65 20 63 6f 6d 70 6f 75 6e 64 20 7b  pable compound {
2de0: 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 74 72 69  .    do_test tri
2df0: 67 67 65 72 31 2d 39 2e 31 20 7b 0a 20 20 20 20  gger1-9.1 {.    
2e00: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
2e10: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
2e20: 20 74 33 28 61 2c 62 29 3b 0a 20 20 20 20 20 20   t3(a,b);.      
2e30: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
2e40: 34 28 78 20 55 4e 49 51 55 45 2c 20 62 29 3b 0a  4(x UNIQUE, b);.
2e50: 20 20 20 20 20 20 20 20 43 52 45 41 54 45 20 54          CREATE T
2e60: 52 49 47 47 45 52 20 72 33 34 20 41 46 54 45 52  RIGGER r34 AFTER
2e70: 20 49 4e 53 45 52 54 20 4f 4e 20 74 33 20 42 45   INSERT ON t3 BE
2e80: 47 49 4e 0a 20 20 20 20 20 20 20 20 20 20 52 45  GIN.          RE
2e90: 50 4c 41 43 45 20 49 4e 54 4f 20 74 34 20 56 41  PLACE INTO t4 VA
2ea0: 4c 55 45 53 28 6e 65 77 2e 61 2c 6e 65 77 2e 62  LUES(new.a,new.b
2eb0: 29 3b 0a 20 20 20 20 20 20 20 20 45 4e 44 3b 0a  );.        END;.
2ec0: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
2ed0: 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 31 2c  NTO t3 VALUES(1,
2ee0: 32 29 3b 0a 20 20 20 20 20 20 20 20 53 45 4c 45  2);.        SELE
2ef0: 43 54 20 2a 20 46 52 4f 4d 20 74 33 20 55 4e 49  CT * FROM t3 UNI
2f00: 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 39 39  ON ALL SELECT 99
2f10: 2c 20 39 39 20 55 4e 49 4f 4e 20 41 4c 4c 20 53  , 99 UNION ALL S
2f20: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 34 3b  ELECT * FROM t4;
2f30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 7b  .      }.    } {
2f40: 31 20 32 20 39 39 20 39 39 20 31 20 32 7d 0a 20  1 2 99 99 1 2}. 
2f50: 20 20 20 64 6f 5f 74 65 73 74 20 74 72 69 67 67     do_test trigg
2f60: 65 72 31 2d 39 2e 32 20 7b 0a 20 20 20 20 20 20  er1-9.2 {.      
2f70: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
2f80: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
2f90: 20 56 41 4c 55 45 53 28 31 2c 33 29 3b 0a 20 20   VALUES(1,3);.  
2fa0: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
2fb0: 52 4f 4d 20 74 33 20 55 4e 49 4f 4e 20 41 4c 4c  ROM t3 UNION ALL
2fc0: 20 53 45 4c 45 43 54 20 39 39 2c 20 39 39 20 55   SELECT 99, 99 U
2fd0: 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20  NION ALL SELECT 
2fe0: 2a 20 46 52 4f 4d 20 74 34 3b 0a 20 20 20 20 20  * FROM t4;.     
2ff0: 20 7d 0a 20 20 20 20 7d 20 7b 31 20 32 20 31 20   }.    } {1 2 1 
3000: 33 20 39 39 20 39 39 20 31 20 33 7d 0a 20 20 7d  3 99 99 1 3}.  }
3010: 20 65 6c 73 65 20 7b 0a 20 20 20 20 64 6f 5f 74   else {.    do_t
3020: 65 73 74 20 74 72 69 67 67 65 72 31 2d 39 2e 31  est trigger1-9.1
3030: 20 7b 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c   {.      execsql
3040: 20 7b 0a 20 20 20 20 20 20 20 20 43 52 45 41 54   {.        CREAT
3050: 45 20 54 41 42 4c 45 20 74 33 28 61 2c 62 29 3b  E TABLE t3(a,b);
3060: 0a 20 20 20 20 20 20 20 20 43 52 45 41 54 45 20  .        CREATE 
3070: 54 41 42 4c 45 20 74 34 28 78 20 55 4e 49 51 55  TABLE t4(x UNIQU
3080: 45 2c 20 62 29 3b 0a 20 20 20 20 20 20 20 20 43  E, b);.        C
3090: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 72 33  REATE TRIGGER r3
30a0: 34 20 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f  4 AFTER INSERT O
30b0: 4e 20 74 33 20 42 45 47 49 4e 0a 20 20 20 20 20  N t3 BEGIN.     
30c0: 20 20 20 20 20 52 45 50 4c 41 43 45 20 49 4e 54       REPLACE INT
30d0: 4f 20 74 34 20 56 41 4c 55 45 53 28 6e 65 77 2e  O t4 VALUES(new.
30e0: 61 2c 6e 65 77 2e 62 29 3b 0a 20 20 20 20 20 20  a,new.b);.      
30f0: 20 20 45 4e 44 3b 0a 20 20 20 20 20 20 20 20 49    END;.        I
3100: 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41  NSERT INTO t3 VA
3110: 4c 55 45 53 28 31 2c 32 29 3b 0a 20 20 20 20 20  LUES(1,2);.     
3120: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
3130: 20 74 33 3b 20 53 45 4c 45 43 54 20 39 39 2c 20   t3; SELECT 99, 
3140: 39 39 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  99; SELECT * FRO
3150: 4d 20 74 34 3b 0a 20 20 20 20 20 20 7d 0a 20 20  M t4;.      }.  
3160: 20 20 7d 20 7b 31 20 32 20 39 39 20 39 39 20 31    } {1 2 99 99 1
3170: 20 32 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74 20   2}.    do_test 
3180: 74 72 69 67 67 65 72 31 2d 39 2e 32 20 7b 0a 20  trigger1-9.2 {. 
3190: 20 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20       execsql {. 
31a0: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
31b0: 54 4f 20 74 33 20 56 41 4c 55 45 53 28 31 2c 33  TO t3 VALUES(1,3
31c0: 29 3b 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43  );.        SELEC
31d0: 54 20 2a 20 46 52 4f 4d 20 74 33 3b 20 53 45 4c  T * FROM t3; SEL
31e0: 45 43 54 20 39 39 2c 20 39 39 3b 20 53 45 4c 45  ECT 99, 99; SELE
31f0: 43 54 20 2a 20 46 52 4f 4d 20 74 34 3b 0a 20 20  CT * FROM t4;.  
3200: 20 20 20 20 7d 0a 20 20 20 20 7d 20 7b 31 20 32      }.    } {1 2
3210: 20 31 20 33 20 39 39 20 39 39 20 31 20 33 7d 0a   1 3 99 99 1 3}.
3220: 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a    }.  execsql {.
3230: 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74      DROP TABLE t
3240: 33 3b 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c  3;.    DROP TABL
3250: 45 20 74 34 3b 0a 20 20 7d 0a 7d 0a 0a 0a 23 20  E t4;.  }.}...# 
3260: 54 69 63 6b 65 74 20 23 37 36 34 2e 20 41 74 20  Ticket #764. At 
3270: 6f 6e 65 20 73 74 61 67 65 20 54 45 4d 50 20 74  one stage TEMP t
3280: 72 69 67 67 65 72 73 20 77 6f 75 6c 64 20 66 61  riggers would fa
3290: 69 6c 20 74 6f 20 72 65 2d 69 6e 73 74 61 6c 6c  il to re-install
32a0: 20 77 68 65 6e 20 74 68 65 0a 23 20 73 63 68 65   when the.# sche
32b0: 6d 61 20 77 61 73 20 72 65 6c 6f 61 64 65 64 2e  ma was reloaded.
32c0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
32d0: 65 73 74 73 20 65 6e 73 75 72 65 20 74 68 61 74  ests ensure that
32e0: 20 54 45 4d 50 20 74 72 69 67 67 65 72 73 20 61   TEMP triggers a
32f0: 72 65 0a 23 20 63 6f 72 72 65 63 74 6c 79 20 72  re.# correctly r
3300: 65 2d 69 6e 73 74 61 6c 6c 65 64 2e 0a 23 0a 23  e-installed..#.#
3310: 20 41 6c 73 6f 20 76 65 72 69 66 79 20 74 68 61   Also verify tha
3320: 74 20 72 65 66 65 72 65 6e 63 65 73 20 77 69 74  t references wit
3330: 68 69 6e 20 74 72 69 67 67 65 72 20 70 72 6f 67  hin trigger prog
3340: 72 61 6d 73 20 61 72 65 20 72 65 73 6f 6c 76 65  rams are resolve
3350: 64 20 61 74 0a 23 20 73 74 61 74 65 6d 65 6e 74  d at.# statement
3360: 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 6e   compile time, n
3370: 6f 74 20 74 72 69 67 67 65 72 20 69 6e 73 74 61  ot trigger insta
3380: 6c 6c 61 74 69 6f 6e 20 74 69 6d 65 2e 20 54 68  llation time. Th
3390: 69 73 20 6d 65 61 6e 73 2c 20 66 6f 72 0a 23 20  is means, for.# 
33a0: 65 78 61 6d 70 6c 65 2c 20 74 68 61 74 20 79 6f  example, that yo
33b0: 75 20 63 61 6e 20 64 72 6f 70 20 61 6e 64 20 72  u can drop and r
33c0: 65 2d 63 72 65 61 74 65 20 74 61 62 6c 65 73 20  e-create tables 
33d0: 72 65 66 65 72 65 6e 63 65 64 20 62 79 20 74 72  referenced by tr
33e0: 69 67 67 65 72 73 2e 20 0a 69 66 63 61 70 61 62  iggers. .ifcapab
33f0: 6c 65 20 74 65 6d 70 64 62 26 26 61 74 74 61 63  le tempdb&&attac
3400: 68 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 74 72  h {.  do_test tr
3410: 69 67 67 65 72 31 2d 31 30 2e 30 20 7b 0a 20 20  igger1-10.0 {.  
3420: 20 20 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66    file delete -f
3430: 6f 72 63 65 20 74 65 73 74 32 2e 64 62 0a 20 20  orce test2.db.  
3440: 20 20 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66    file delete -f
3450: 6f 72 63 65 20 74 65 73 74 32 2e 64 62 2d 6a 6f  orce test2.db-jo
3460: 75 72 6e 61 6c 0a 20 20 20 20 65 78 65 63 73 71  urnal.    execsq
3470: 6c 20 7b 0a 20 20 20 20 20 20 41 54 54 41 43 48  l {.      ATTACH
3480: 20 27 74 65 73 74 32 2e 64 62 27 20 41 53 20 61   'test2.db' AS a
3490: 75 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d  ux;.    }.  } {}
34a0: 0a 20 20 64 6f 5f 74 65 73 74 20 74 72 69 67 67  .  do_test trigg
34b0: 65 72 31 2d 31 30 2e 31 20 7b 0a 20 20 20 20 65  er1-10.1 {.    e
34c0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 43  xecsql {.      C
34d0: 52 45 41 54 45 20 54 41 42 4c 45 20 6d 61 69 6e  REATE TABLE main
34e0: 2e 74 34 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20  .t4(a, b, c);.  
34f0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
3500: 20 74 65 6d 70 2e 74 34 28 61 2c 20 62 2c 20 63   temp.t4(a, b, c
3510: 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  );.      CREATE 
3520: 54 41 42 4c 45 20 61 75 78 2e 74 34 28 61 2c 20  TABLE aux.t4(a, 
3530: 62 2c 20 63 29 3b 0a 20 20 20 20 20 20 43 52 45  b, c);.      CRE
3540: 41 54 45 20 54 41 42 4c 45 20 69 6e 73 65 72 74  ATE TABLE insert
3550: 5f 6c 6f 67 28 64 62 2c 20 61 2c 20 62 2c 20 63  _log(db, a, b, c
3560: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a  );.    }.  } {}.
3570: 20 20 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65    do_test trigge
3580: 72 31 2d 31 30 2e 32 20 7b 0a 20 20 20 20 65 78  r1-10.2 {.    ex
3590: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 43 52  ecsql {.      CR
35a0: 45 41 54 45 20 54 45 4d 50 20 54 52 49 47 47 45  EATE TEMP TRIGGE
35b0: 52 20 74 72 69 67 31 20 41 46 54 45 52 20 49 4e  R trig1 AFTER IN
35c0: 53 45 52 54 20 4f 4e 20 6d 61 69 6e 2e 74 34 20  SERT ON main.t4 
35d0: 42 45 47 49 4e 20 0a 20 20 20 20 20 20 20 20 49  BEGIN .        I
35e0: 4e 53 45 52 54 20 49 4e 54 4f 20 69 6e 73 65 72  NSERT INTO inser
35f0: 74 5f 6c 6f 67 20 56 41 4c 55 45 53 28 27 6d 61  t_log VALUES('ma
3600: 69 6e 27 2c 20 6e 65 77 2e 61 2c 20 6e 65 77 2e  in', new.a, new.
3610: 62 2c 20 6e 65 77 2e 63 29 3b 0a 20 20 20 20 20  b, new.c);.     
3620: 20 45 4e 44 3b 0a 20 20 20 20 20 20 43 52 45 41   END;.      CREA
3630: 54 45 20 54 45 4d 50 20 54 52 49 47 47 45 52 20  TE TEMP TRIGGER 
3640: 74 72 69 67 32 20 41 46 54 45 52 20 49 4e 53 45  trig2 AFTER INSE
3650: 52 54 20 4f 4e 20 74 65 6d 70 2e 74 34 20 42 45  RT ON temp.t4 BE
3660: 47 49 4e 20 0a 20 20 20 20 20 20 20 20 49 4e 53  GIN .        INS
3670: 45 52 54 20 49 4e 54 4f 20 69 6e 73 65 72 74 5f  ERT INTO insert_
3680: 6c 6f 67 20 56 41 4c 55 45 53 28 27 74 65 6d 70  log VALUES('temp
3690: 27 2c 20 6e 65 77 2e 61 2c 20 6e 65 77 2e 62 2c  ', new.a, new.b,
36a0: 20 6e 65 77 2e 63 29 3b 0a 20 20 20 20 20 20 45   new.c);.      E
36b0: 4e 44 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45  ND;.      CREATE
36c0: 20 54 45 4d 50 20 54 52 49 47 47 45 52 20 74 72   TEMP TRIGGER tr
36d0: 69 67 33 20 41 46 54 45 52 20 49 4e 53 45 52 54  ig3 AFTER INSERT
36e0: 20 4f 4e 20 61 75 78 2e 74 34 20 42 45 47 49 4e   ON aux.t4 BEGIN
36f0: 20 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54   .        INSERT
3700: 20 49 4e 54 4f 20 69 6e 73 65 72 74 5f 6c 6f 67   INTO insert_log
3710: 20 56 41 4c 55 45 53 28 27 61 75 78 27 2c 20 6e   VALUES('aux', n
3720: 65 77 2e 61 2c 20 6e 65 77 2e 62 2c 20 6e 65 77  ew.a, new.b, new
3730: 2e 63 29 3b 0a 20 20 20 20 20 20 45 4e 44 3b 0a  .c);.      END;.
3740: 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64      }.  } {}.  d
3750: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 31 2d  o_test trigger1-
3760: 31 30 2e 33 20 7b 0a 20 20 20 20 65 78 65 63 73  10.3 {.    execs
3770: 71 6c 20 7b 0a 20 20 20 20 20 20 49 4e 53 45 52  ql {.      INSER
3780: 54 20 49 4e 54 4f 20 6d 61 69 6e 2e 74 34 20 56  T INTO main.t4 V
3790: 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 3b 0a  ALUES(1, 2, 3);.
37a0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
37b0: 4f 20 74 65 6d 70 2e 74 34 20 56 41 4c 55 45 53  O temp.t4 VALUES
37c0: 28 34 2c 20 35 2c 20 36 29 3b 0a 20 20 20 20 20  (4, 5, 6);.     
37d0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 75 78   INSERT INTO aux
37e0: 2e 74 34 20 20 56 41 4c 55 45 53 28 37 2c 20 38  .t4  VALUES(7, 8
37f0: 2c 20 39 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  , 9);.    }.  } 
3800: 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 74 72 69  {}.  do_test tri
3810: 67 67 65 72 31 2d 31 30 2e 34 20 7b 0a 20 20 20  gger1-10.4 {.   
3820: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
3830: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 69   SELECT * FROM i
3840: 6e 73 65 72 74 5f 6c 6f 67 3b 0a 20 20 20 20 7d  nsert_log;.    }
3850: 0a 20 20 7d 20 7b 6d 61 69 6e 20 31 20 32 20 33  .  } {main 1 2 3
3860: 20 74 65 6d 70 20 34 20 35 20 36 20 61 75 78 20   temp 4 5 6 aux 
3870: 37 20 38 20 39 7d 0a 20 20 64 6f 5f 74 65 73 74  7 8 9}.  do_test
3880: 20 74 72 69 67 67 65 72 31 2d 31 30 2e 35 20 7b   trigger1-10.5 {
3890: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
38a0: 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20       BEGIN;.    
38b0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6d 61    INSERT INTO ma
38c0: 69 6e 2e 74 34 20 56 41 4c 55 45 53 28 31 2c 20  in.t4 VALUES(1, 
38d0: 32 2c 20 33 29 3b 0a 20 20 20 20 20 20 49 4e 53  2, 3);.      INS
38e0: 45 52 54 20 49 4e 54 4f 20 74 65 6d 70 2e 74 34  ERT INTO temp.t4
38f0: 20 56 41 4c 55 45 53 28 34 2c 20 35 2c 20 36 29   VALUES(4, 5, 6)
3900: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
3910: 4e 54 4f 20 61 75 78 2e 74 34 20 20 56 41 4c 55  NTO aux.t4  VALU
3920: 45 53 28 37 2c 20 38 2c 20 39 29 3b 0a 20 20 20  ES(7, 8, 9);.   
3930: 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20     ROLLBACK;.   
3940: 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74   }.  } {}.  do_t
3950: 65 73 74 20 74 72 69 67 67 65 72 31 2d 31 30 2e  est trigger1-10.
3960: 36 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  6 {.    execsql 
3970: 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  {.      SELECT *
3980: 20 46 52 4f 4d 20 69 6e 73 65 72 74 5f 6c 6f 67   FROM insert_log
3990: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 6d 61 69  ;.    }.  } {mai
39a0: 6e 20 31 20 32 20 33 20 74 65 6d 70 20 34 20 35  n 1 2 3 temp 4 5
39b0: 20 36 20 61 75 78 20 37 20 38 20 39 7d 0a 20 20   6 aux 7 8 9}.  
39c0: 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 31  do_test trigger1
39d0: 2d 31 30 2e 37 20 7b 0a 20 20 20 20 65 78 65 63  -10.7 {.    exec
39e0: 73 71 6c 20 7b 0a 20 20 20 20 20 20 44 45 4c 45  sql {.      DELE
39f0: 54 45 20 46 52 4f 4d 20 69 6e 73 65 72 74 5f 6c  TE FROM insert_l
3a00: 6f 67 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  og;.      INSERT
3a10: 20 49 4e 54 4f 20 6d 61 69 6e 2e 74 34 20 56 41   INTO main.t4 VA
3a20: 4c 55 45 53 28 31 31 2c 20 31 32 2c 20 31 33 29  LUES(11, 12, 13)
3a30: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
3a40: 4e 54 4f 20 74 65 6d 70 2e 74 34 20 56 41 4c 55  NTO temp.t4 VALU
3a50: 45 53 28 31 34 2c 20 31 35 2c 20 31 36 29 3b 0a  ES(14, 15, 16);.
3a60: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
3a70: 4f 20 61 75 78 2e 74 34 20 20 56 41 4c 55 45 53  O aux.t4  VALUES
3a80: 28 31 37 2c 20 31 38 2c 20 31 39 29 3b 0a 20 20  (17, 18, 19);.  
3a90: 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f    }.  } {}.  do_
3aa0: 74 65 73 74 20 74 72 69 67 67 65 72 31 2d 31 30  test trigger1-10
3ab0: 2e 38 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .8 {.    execsql
3ac0: 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20   {.      SELECT 
3ad0: 2a 20 46 52 4f 4d 20 69 6e 73 65 72 74 5f 6c 6f  * FROM insert_lo
3ae0: 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 6d 61  g;.    }.  } {ma
3af0: 69 6e 20 31 31 20 31 32 20 31 33 20 74 65 6d 70  in 11 12 13 temp
3b00: 20 31 34 20 31 35 20 31 36 20 61 75 78 20 31 37   14 15 16 aux 17
3b10: 20 31 38 20 31 39 7d 0a 20 20 64 6f 5f 74 65 73   18 19}.  do_tes
3b20: 74 20 74 72 69 67 67 65 72 31 2d 31 30 2e 38 20  t trigger1-10.8 
3b30: 7b 0a 20 20 23 20 44 72 6f 70 20 61 6e 64 20 72  {.  # Drop and r
3b40: 65 2d 63 72 65 61 74 65 20 74 68 65 20 69 6e 73  e-create the ins
3b50: 65 72 74 5f 6c 6f 67 20 74 61 62 6c 65 20 69 6e  ert_log table in
3b60: 20 61 20 64 69 66 66 65 72 65 6e 74 20 64 61 74   a different dat
3b70: 61 62 61 73 65 2e 20 4e 6f 74 65 0a 20 20 23 20  abase. Note.  # 
3b80: 74 68 61 74 20 77 65 20 63 61 6e 20 63 68 61 6e  that we can chan
3b90: 67 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ge the column na
3ba0: 6d 65 73 20 62 65 63 61 75 73 65 20 74 68 65 20  mes because the 
3bb0: 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73  trigger programs
3bc0: 20 64 6f 6e 27 74 0a 20 20 23 20 75 73 65 20 74   don't.  # use t
3bd0: 68 65 6d 20 65 78 70 6c 69 63 69 74 6c 79 2e 0a  hem explicitly..
3be0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
3bf0: 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 69      DROP TABLE i
3c00: 6e 73 65 72 74 5f 6c 6f 67 3b 0a 20 20 20 20 20  nsert_log;.     
3c10: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 75   CREATE TABLE au
3c20: 78 2e 69 6e 73 65 72 74 5f 6c 6f 67 28 64 62 2c  x.insert_log(db,
3c30: 20 64 2c 20 65 2c 20 66 29 3b 0a 20 20 20 20 7d   d, e, f);.    }
3c40: 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73  .  } {}.  do_tes
3c50: 74 20 74 72 69 67 67 65 72 31 2d 31 30 2e 31 30  t trigger1-10.10
3c60: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
3c70: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
3c80: 54 4f 20 6d 61 69 6e 2e 74 34 20 56 41 4c 55 45  TO main.t4 VALUE
3c90: 53 28 32 31 2c 20 32 32 2c 20 32 33 29 3b 0a 20  S(21, 22, 23);. 
3ca0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
3cb0: 20 74 65 6d 70 2e 74 34 20 56 41 4c 55 45 53 28   temp.t4 VALUES(
3cc0: 32 34 2c 20 32 35 2c 20 32 36 29 3b 0a 20 20 20  24, 25, 26);.   
3cd0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
3ce0: 75 78 2e 74 34 20 20 56 41 4c 55 45 53 28 32 37  ux.t4  VALUES(27
3cf0: 2c 20 32 38 2c 20 32 39 29 3b 0a 20 20 20 20 7d  , 28, 29);.    }
3d00: 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73  .  } {}.  do_tes
3d10: 74 20 74 72 69 67 67 65 72 31 2d 31 30 2e 31 31  t trigger1-10.11
3d20: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
3d30: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .      SELECT * 
3d40: 46 52 4f 4d 20 69 6e 73 65 72 74 5f 6c 6f 67 3b  FROM insert_log;
3d50: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 6d 61 69 6e  .    }.  } {main
3d60: 20 32 31 20 32 32 20 32 33 20 74 65 6d 70 20 32   21 22 23 temp 2
3d70: 34 20 32 35 20 32 36 20 61 75 78 20 32 37 20 32  4 25 26 aux 27 2
3d80: 38 20 32 39 7d 0a 7d 0a 0a 64 6f 5f 74 65 73 74  8 29}.}..do_test
3d90: 20 74 72 69 67 67 65 72 31 2d 31 31 2e 31 20 7b   trigger1-11.1 {
3da0: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 53 45 4c  .  catchsql {SEL
3db0: 45 43 54 20 72 61 69 73 65 28 61 62 6f 72 74 2c  ECT raise(abort,
3dc0: 27 6d 65 73 73 61 67 65 27 29 3b 7d 0a 7d 20 7b  'message');}.} {
3dd0: 31 20 7b 52 41 49 53 45 28 29 20 6d 61 79 20 6f  1 {RAISE() may o
3de0: 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68  nly be used with
3df0: 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72 6f  in a trigger-pro
3e00: 67 72 61 6d 7d 7d 0a 0a 0a 66 69 6e 69 73 68 5f  gram}}...finish_
3e10: 74 65 73 74 0a                                   test.