/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 2c79e2bf76350811e362814e98779c120b6a9421:


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 65 78 65 63 73 71   t1(a);.}.execsq
0730: 6c 20 7b 0a 09 43 52 45 41 54 45 20 54 52 49 47  l {..CREATE TRIG
0740: 47 45 52 20 74 72 31 20 49 4e 53 45 52 54 20 4f  GER tr1 INSERT O
0750: 4e 20 74 31 20 42 45 47 49 4e 0a 09 20 20 49 4e  N t1 BEGIN..  IN
0760: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 76 61 6c  SERT INTO t1 val
0770: 75 65 73 28 31 29 3b 0a 20 09 45 4e 44 3b 0a 7d  ues(1);. .END;.}
0780: 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72  .do_test trigger
0790: 31 2d 31 2e 32 2e 30 20 7b 0a 20 20 20 20 63 61  1-1.2.0 {.    ca
07a0: 74 63 68 73 71 6c 20 7b 0a 09 43 52 45 41 54 45  tchsql {..CREATE
07b0: 20 54 52 49 47 47 45 52 20 49 46 20 4e 4f 54 20   TRIGGER IF NOT 
07c0: 45 58 49 53 54 53 20 74 72 31 20 44 45 4c 45 54  EXISTS tr1 DELET
07d0: 45 20 4f 4e 20 74 31 20 42 45 47 49 4e 0a 09 20  E ON t1 BEGIN.. 
07e0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
07f0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a   sqlite_master;.
0800: 20 09 45 4e 44 0a 20 20 20 20 20 7d 0a 7d 20 7b   .END.     }.} {
0810: 30 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 72  0 {}}.do_test tr
0820: 69 67 67 65 72 31 2d 31 2e 32 2e 31 20 7b 0a 20  igger1-1.2.1 {. 
0830: 20 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 09 43     catchsql {..C
0840: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74 72  REATE TRIGGER tr
0850: 31 20 44 45 4c 45 54 45 20 4f 4e 20 74 31 20 42  1 DELETE ON t1 B
0860: 45 47 49 4e 0a 09 20 20 20 20 53 45 4c 45 43 54  EGIN..    SELECT
0870: 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d   * FROM sqlite_m
0880: 61 73 74 65 72 3b 0a 20 09 45 4e 44 0a 20 20 20  aster;. .END.   
0890: 20 20 7d 0a 7d 20 7b 31 20 7b 74 72 69 67 67 65    }.} {1 {trigge
08a0: 72 20 74 72 31 20 61 6c 72 65 61 64 79 20 65 78  r tr1 already ex
08b0: 69 73 74 73 7d 7d 0a 64 6f 5f 74 65 73 74 20 74  ists}}.do_test t
08c0: 72 69 67 67 65 72 31 2d 31 2e 32 2e 32 20 7b 0a  rigger1-1.2.2 {.
08d0: 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 09      catchsql {..
08e0: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 22  CREATE TRIGGER "
08f0: 74 72 31 22 20 44 45 4c 45 54 45 20 4f 4e 20 74  tr1" DELETE ON t
0900: 31 20 42 45 47 49 4e 0a 09 20 20 20 20 53 45 4c  1 BEGIN..    SEL
0910: 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74  ECT * FROM sqlit
0920: 65 5f 6d 61 73 74 65 72 3b 0a 20 09 45 4e 44 0a  e_master;. .END.
0930: 20 20 20 20 20 7d 0a 7d 20 7b 31 20 7b 74 72 69       }.} {1 {tri
0940: 67 67 65 72 20 22 74 72 31 22 20 61 6c 72 65 61  gger "tr1" alrea
0950: 64 79 20 65 78 69 73 74 73 7d 7d 0a 64 6f 5f 74  dy exists}}.do_t
0960: 65 73 74 20 74 72 69 67 67 65 72 31 2d 31 2e 32  est trigger1-1.2
0970: 2e 33 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71  .3 {.    catchsq
0980: 6c 20 7b 0a 09 43 52 45 41 54 45 20 54 52 49 47  l {..CREATE TRIG
0990: 47 45 52 20 5b 74 72 31 5d 20 44 45 4c 45 54 45  GER [tr1] DELETE
09a0: 20 4f 4e 20 74 31 20 42 45 47 49 4e 0a 09 20 20   ON t1 BEGIN..  
09b0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
09c0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20  sqlite_master;. 
09d0: 09 45 4e 44 0a 20 20 20 20 20 7d 0a 7d 20 7b 31  .END.     }.} {1
09e0: 20 7b 74 72 69 67 67 65 72 20 5b 74 72 31 5d 20   {trigger [tr1] 
09f0: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 7d 7d  already exists}}
0a00: 0a 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65  ..do_test trigge
0a10: 72 31 2d 31 2e 33 20 7b 0a 20 20 20 20 63 61 74  r1-1.3 {.    cat
0a20: 63 68 73 71 6c 20 7b 0a 09 42 45 47 49 4e 3b 0a  chsql {..BEGIN;.
0a30: 09 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20  .CREATE TRIGGER 
0a40: 74 72 32 20 49 4e 53 45 52 54 20 4f 4e 20 74 31  tr2 INSERT ON t1
0a50: 20 42 45 47 49 4e 0a 09 20 20 20 20 53 45 4c 45   BEGIN..    SELE
0a60: 43 54 20 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65  CT * from sqlite
0a70: 5f 6d 61 73 74 65 72 3b 20 45 4e 44 3b 0a 20 20  _master; END;.  
0a80: 20 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a        ROLLBACK;.
0a90: 09 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20  .CREATE TRIGGER 
0aa0: 74 72 32 20 49 4e 53 45 52 54 20 4f 4e 20 74 31  tr2 INSERT ON t1
0ab0: 20 42 45 47 49 4e 0a 09 20 20 20 20 53 45 4c 45   BEGIN..    SELE
0ac0: 43 54 20 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65  CT * from sqlite
0ad0: 5f 6d 61 73 74 65 72 3b 20 45 4e 44 3b 0a 20 20  _master; END;.  
0ae0: 20 20 7d 0a 7d 20 7b 30 20 7b 7d 7d 0a 0a 64 6f    }.} {0 {}}..do
0af0: 5f 74 65 73 74 20 74 72 69 67 67 65 72 31 2d 31  _test trigger1-1
0b00: 2e 34 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71  .4 {.    catchsq
0b10: 6c 20 7b 0a 09 44 52 4f 50 20 54 52 49 47 47 45  l {..DROP TRIGGE
0b20: 52 20 49 46 20 45 58 49 53 54 53 20 74 72 31 3b  R IF EXISTS tr1;
0b30: 0a 09 43 52 45 41 54 45 20 54 52 49 47 47 45 52  ..CREATE TRIGGER
0b40: 20 74 72 31 20 44 45 4c 45 54 45 20 4f 4e 20 74   tr1 DELETE ON t
0b50: 31 20 42 45 47 49 4e 0a 09 20 20 20 20 53 45 4c  1 BEGIN..    SEL
0b60: 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74  ECT * FROM sqlit
0b70: 65 5f 6d 61 73 74 65 72 3b 0a 09 45 4e 44 0a 20  e_master;..END. 
0b80: 20 20 20 7d 0a 7d 20 7b 30 20 7b 7d 7d 0a 0a 64     }.} {0 {}}..d
0b90: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 31 2d  o_test trigger1-
0ba0: 31 2e 35 20 7b 0a 20 20 20 20 65 78 65 63 73 71  1.5 {.    execsq
0bb0: 6c 20 7b 0a 09 42 45 47 49 4e 3b 0a 09 44 52 4f  l {..BEGIN;..DRO
0bc0: 50 20 54 52 49 47 47 45 52 20 74 72 32 3b 0a 09  P TRIGGER tr2;..
0bd0: 52 4f 4c 4c 42 41 43 4b 3b 0a 09 44 52 4f 50 20  ROLLBACK;..DROP 
0be0: 54 52 49 47 47 45 52 20 74 72 32 3b 0a 20 20 20  TRIGGER tr2;.   
0bf0: 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74   }.} {}..do_test
0c00: 20 74 72 69 67 67 65 72 31 2d 31 2e 36 2e 31 20   trigger1-1.6.1 
0c10: 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b  {.    catchsql {
0c20: 0a 09 44 52 4f 50 20 54 52 49 47 47 45 52 20 49  ..DROP TRIGGER I
0c30: 46 20 45 58 49 53 54 53 20 62 69 67 67 6c 65 73  F EXISTS biggles
0c40: 3b 0a 20 20 20 20 7d 0a 7d 20 7b 30 20 7b 7d 7d  ;.    }.} {0 {}}
0c50: 0a 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65  ..do_test trigge
0c60: 72 31 2d 31 2e 36 2e 32 20 7b 0a 20 20 20 20 63  r1-1.6.2 {.    c
0c70: 61 74 63 68 73 71 6c 20 7b 0a 09 44 52 4f 50 20  atchsql {..DROP 
0c80: 54 52 49 47 47 45 52 20 62 69 67 67 6c 65 73 3b  TRIGGER biggles;
0c90: 0a 20 20 20 20 7d 0a 7d 20 7b 31 20 7b 6e 6f 20  .    }.} {1 {no 
0ca0: 73 75 63 68 20 74 72 69 67 67 65 72 3a 20 62 69  such trigger: bi
0cb0: 67 67 6c 65 73 7d 7d 0a 0a 64 6f 5f 74 65 73 74  ggles}}..do_test
0cc0: 20 74 72 69 67 67 65 72 31 2d 31 2e 37 20 7b 0a   trigger1-1.7 {.
0cd0: 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 09      catchsql {..
0ce0: 44 52 4f 50 20 54 41 42 4c 45 20 74 31 3b 0a 09  DROP TABLE t1;..
0cf0: 44 52 4f 50 20 54 52 49 47 47 45 52 20 74 72 31  DROP TRIGGER tr1
0d00: 3b 0a 20 20 20 20 7d 0a 7d 20 7b 31 20 7b 6e 6f  ;.    }.} {1 {no
0d10: 20 73 75 63 68 20 74 72 69 67 67 65 72 3a 20 74   such trigger: t
0d20: 72 31 7d 7d 0a 0a 69 66 63 61 70 61 62 6c 65 20  r1}}..ifcapable 
0d30: 74 65 6d 70 64 62 20 7b 0a 20 20 65 78 65 63 73  tempdb {.  execs
0d40: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
0d50: 54 45 4d 50 20 54 41 42 4c 45 20 74 65 6d 70 5f  TEMP TABLE temp_
0d60: 74 61 62 6c 65 28 61 29 3b 0a 20 20 7d 0a 20 20  table(a);.  }.  
0d70: 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 31  do_test trigger1
0d80: 2d 31 2e 38 20 7b 0a 20 20 20 20 65 78 65 63 73  -1.8 {.    execs
0d90: 71 6c 20 7b 0a 20 20 09 43 52 45 41 54 45 20 54  ql {.  .CREATE T
0da0: 52 49 47 47 45 52 20 74 65 6d 70 5f 74 72 69 67  RIGGER temp_trig
0db0: 20 55 50 44 41 54 45 20 4f 4e 20 74 65 6d 70 5f   UPDATE ON temp_
0dc0: 74 61 62 6c 65 20 42 45 47 49 4e 0a 20 20 09 20  table BEGIN.  . 
0dd0: 20 20 20 53 45 4c 45 43 54 20 2a 20 66 72 6f 6d     SELECT * from
0de0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a   sqlite_master;.
0df0: 20 20 09 45 4e 44 3b 0a 20 20 09 53 45 4c 45 43    .END;.  .SELEC
0e00: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
0e10: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48  sqlite_master WH
0e20: 45 52 45 20 6e 61 6d 65 20 3d 20 27 74 65 6d 70  ERE name = 'temp
0e30: 5f 74 72 69 67 27 3b 0a 20 20 20 20 7d 20 0a 20  _trig';.    } . 
0e40: 20 7d 20 7b 30 7d 0a 7d 0a 0a 64 6f 5f 74 65 73   } {0}.}..do_tes
0e50: 74 20 74 72 69 67 67 65 72 31 2d 31 2e 39 20 7b  t trigger1-1.9 {
0e60: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .  catchsql {.  
0e70: 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52    CREATE TRIGGER
0e80: 20 74 72 31 20 41 46 54 45 52 20 55 50 44 41 54   tr1 AFTER UPDAT
0e90: 45 20 4f 4e 20 73 71 6c 69 74 65 5f 6d 61 73 74  E ON sqlite_mast
0ea0: 65 72 20 42 45 47 49 4e 0a 20 20 20 20 20 20 20  er BEGIN.       
0eb0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71  SELECT * FROM sq
0ec0: 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 20  lite_master;.   
0ed0: 20 45 4e 44 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b   END;.  }.} {1 {
0ee0: 63 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 74 72  cannot create tr
0ef0: 69 67 67 65 72 20 6f 6e 20 73 79 73 74 65 6d 20  igger on system 
0f00: 74 61 62 6c 65 7d 7d 0a 0a 23 20 43 68 65 63 6b  table}}..# Check
0f10: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
0f20: 61 74 20 61 20 44 45 4c 45 54 45 20 73 74 61 74  at a DELETE stat
0f30: 65 6d 65 6e 74 20 77 69 74 68 69 6e 20 74 68 65  ement within the
0f40: 20 62 6f 64 79 20 6f 66 0a 23 20 61 20 74 72 69   body of.# a tri
0f50: 67 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 6d 65  gger does not me
0f60: 73 73 20 75 70 20 74 68 65 20 44 45 4c 45 54 45  ss up the DELETE
0f70: 20 74 68 61 74 20 63 61 75 73 65 64 20 74 68 65   that caused the
0f80: 20 74 72 69 67 67 65 72 20 74 6f 0a 23 20 72 75   trigger to.# ru
0f90: 6e 20 69 6e 20 74 68 65 20 66 69 72 73 74 20 70  n in the first p
0fa0: 6c 61 63 65 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  lace..#.do_test 
0fb0: 74 72 69 67 67 65 72 31 2d 31 2e 31 30 20 7b 0a  trigger1-1.10 {.
0fc0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
0fd0: 63 72 65 61 74 65 20 74 61 62 6c 65 20 74 31 28  create table t1(
0fe0: 61 2c 62 29 3b 0a 20 20 20 20 69 6e 73 65 72 74  a,b);.    insert
0ff0: 20 69 6e 74 6f 20 74 31 20 76 61 6c 75 65 73 28   into t1 values(
1000: 31 2c 27 61 27 29 3b 0a 20 20 20 20 69 6e 73 65  1,'a');.    inse
1010: 72 74 20 69 6e 74 6f 20 74 31 20 76 61 6c 75 65  rt into t1 value
1020: 73 28 32 2c 27 62 27 29 3b 0a 20 20 20 20 69 6e  s(2,'b');.    in
1030: 73 65 72 74 20 69 6e 74 6f 20 74 31 20 76 61 6c  sert into t1 val
1040: 75 65 73 28 33 2c 27 63 27 29 3b 0a 20 20 20 20  ues(3,'c');.    
1050: 69 6e 73 65 72 74 20 69 6e 74 6f 20 74 31 20 76  insert into t1 v
1060: 61 6c 75 65 73 28 34 2c 27 64 27 29 3b 0a 20 20  alues(4,'d');.  
1070: 20 20 63 72 65 61 74 65 20 74 72 69 67 67 65 72    create trigger
1080: 20 72 31 20 61 66 74 65 72 20 64 65 6c 65 74 65   r1 after delete
1090: 20 6f 6e 20 74 31 20 66 6f 72 20 65 61 63 68 20   on t1 for each 
10a0: 72 6f 77 20 62 65 67 69 6e 0a 20 20 20 20 20 20  row begin.      
10b0: 64 65 6c 65 74 65 20 66 72 6f 6d 20 74 31 20 57  delete from t1 W
10c0: 48 45 52 45 20 61 3d 6f 6c 64 2e 61 2b 32 3b 0a  HERE a=old.a+2;.
10d0: 20 20 20 20 65 6e 64 3b 0a 20 20 20 20 64 65 6c      end;.    del
10e0: 65 74 65 20 66 72 6f 6d 20 74 31 20 77 68 65 72  ete from t1 wher
10f0: 65 20 61 3d 31 20 4f 52 20 61 3d 33 3b 0a 20 20  e a=1 OR a=3;.  
1100: 20 20 73 65 6c 65 63 74 20 2a 20 66 72 6f 6d 20    select * from 
1110: 74 31 3b 0a 20 20 20 20 64 72 6f 70 20 74 61 62  t1;.    drop tab
1120: 6c 65 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 32 20  le t1;.  }.} {2 
1130: 62 20 34 20 64 7d 0a 0a 64 6f 5f 74 65 73 74 20  b 4 d}..do_test 
1140: 74 72 69 67 67 65 72 31 2d 31 2e 31 31 20 7b 0a  trigger1-1.11 {.
1150: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
1160: 63 72 65 61 74 65 20 74 61 62 6c 65 20 74 31 28  create table t1(
1170: 61 2c 62 29 3b 0a 20 20 20 20 69 6e 73 65 72 74  a,b);.    insert
1180: 20 69 6e 74 6f 20 74 31 20 76 61 6c 75 65 73 28   into t1 values(
1190: 31 2c 27 61 27 29 3b 0a 20 20 20 20 69 6e 73 65  1,'a');.    inse
11a0: 72 74 20 69 6e 74 6f 20 74 31 20 76 61 6c 75 65  rt into t1 value
11b0: 73 28 32 2c 27 62 27 29 3b 0a 20 20 20 20 69 6e  s(2,'b');.    in
11c0: 73 65 72 74 20 69 6e 74 6f 20 74 31 20 76 61 6c  sert into t1 val
11d0: 75 65 73 28 33 2c 27 63 27 29 3b 0a 20 20 20 20  ues(3,'c');.    
11e0: 69 6e 73 65 72 74 20 69 6e 74 6f 20 74 31 20 76  insert into t1 v
11f0: 61 6c 75 65 73 28 34 2c 27 64 27 29 3b 0a 20 20  alues(4,'d');.  
1200: 20 20 63 72 65 61 74 65 20 74 72 69 67 67 65 72    create trigger
1210: 20 72 31 20 61 66 74 65 72 20 75 70 64 61 74 65   r1 after update
1220: 20 6f 6e 20 74 31 20 66 6f 72 20 65 61 63 68 20   on t1 for each 
1230: 72 6f 77 20 62 65 67 69 6e 0a 20 20 20 20 20 20  row begin.      
1240: 64 65 6c 65 74 65 20 66 72 6f 6d 20 74 31 20 57  delete from t1 W
1250: 48 45 52 45 20 61 3d 6f 6c 64 2e 61 2b 32 3b 0a  HERE a=old.a+2;.
1260: 20 20 20 20 65 6e 64 3b 0a 20 20 20 20 75 70 64      end;.    upd
1270: 61 74 65 20 74 31 20 73 65 74 20 62 3d 27 78 2d  ate t1 set b='x-
1280: 27 20 7c 7c 20 62 20 77 68 65 72 65 20 61 3d 31  ' || b where a=1
1290: 20 4f 52 20 61 3d 33 3b 0a 20 20 20 20 73 65 6c   OR a=3;.    sel
12a0: 65 63 74 20 2a 20 66 72 6f 6d 20 74 31 3b 0a 20  ect * from t1;. 
12b0: 20 20 20 64 72 6f 70 20 74 61 62 6c 65 20 74 31     drop table t1
12c0: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 78 2d 61 20 32  ;.  }.} {1 x-a 2
12d0: 20 62 20 34 20 64 7d 0a 0a 23 20 45 6e 73 75 72   b 4 d}..# Ensur
12e0: 65 20 74 68 61 74 20 77 65 20 63 61 6e 6e 6f 74  e that we cannot
12f0: 20 63 72 65 61 74 65 20 49 4e 53 54 45 41 44 20   create INSTEAD 
1300: 4f 46 20 74 72 69 67 67 65 72 73 20 6f 6e 20 74  OF triggers on t
1310: 61 62 6c 65 73 0a 64 6f 5f 74 65 73 74 20 74 72  ables.do_test tr
1320: 69 67 67 65 72 31 2d 31 2e 31 32 20 7b 0a 20 20  igger1-1.12 {.  
1330: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 63  catchsql {.    c
1340: 72 65 61 74 65 20 74 61 62 6c 65 20 74 31 28 61  reate table t1(a
1350: 2c 62 29 3b 0a 20 20 20 20 63 72 65 61 74 65 20  ,b);.    create 
1360: 74 72 69 67 67 65 72 20 74 31 74 20 69 6e 73 74  trigger t1t inst
1370: 65 61 64 20 6f 66 20 75 70 64 61 74 65 20 6f 6e  ead of update on
1380: 20 74 31 20 66 6f 72 20 65 61 63 68 20 72 6f 77   t1 for each row
1390: 20 62 65 67 69 6e 0a 20 20 20 20 20 20 64 65 6c   begin.      del
13a0: 65 74 65 20 66 72 6f 6d 20 74 31 20 57 48 45 52  ete from t1 WHER
13b0: 45 20 61 3d 6f 6c 64 2e 61 2b 32 3b 0a 20 20 20  E a=old.a+2;.   
13c0: 20 65 6e 64 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b   end;.  }.} {1 {
13d0: 63 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 49 4e  cannot create IN
13e0: 53 54 45 41 44 20 4f 46 20 74 72 69 67 67 65 72  STEAD OF trigger
13f0: 20 6f 6e 20 74 61 62 6c 65 3a 20 6d 61 69 6e 2e   on table: main.
1400: 74 31 7d 7d 0a 0a 69 66 63 61 70 61 62 6c 65 20  t1}}..ifcapable 
1410: 76 69 65 77 20 7b 0a 23 20 45 6e 73 75 72 65 20  view {.# Ensure 
1420: 74 68 61 74 20 77 65 20 63 61 6e 6e 6f 74 20 63  that we cannot c
1430: 72 65 61 74 65 20 42 45 46 4f 52 45 20 74 72 69  reate BEFORE tri
1440: 67 67 65 72 73 20 6f 6e 20 76 69 65 77 73 0a 64  ggers on views.d
1450: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 31 2d  o_test trigger1-
1460: 31 2e 31 33 20 7b 0a 20 20 63 61 74 63 68 73 71  1.13 {.  catchsq
1470: 6c 20 7b 0a 20 20 20 20 63 72 65 61 74 65 20 76  l {.    create v
1480: 69 65 77 20 76 31 20 61 73 20 73 65 6c 65 63 74  iew v1 as select
1490: 20 2a 20 66 72 6f 6d 20 74 31 3b 0a 20 20 20 20   * from t1;.    
14a0: 63 72 65 61 74 65 20 74 72 69 67 67 65 72 20 76  create trigger v
14b0: 31 74 20 62 65 66 6f 72 65 20 75 70 64 61 74 65  1t before update
14c0: 20 6f 6e 20 76 31 20 66 6f 72 20 65 61 63 68 20   on v1 for each 
14d0: 72 6f 77 20 62 65 67 69 6e 0a 20 20 20 20 20 20  row begin.      
14e0: 64 65 6c 65 74 65 20 66 72 6f 6d 20 74 31 20 57  delete from t1 W
14f0: 48 45 52 45 20 61 3d 6f 6c 64 2e 61 2b 32 3b 0a  HERE a=old.a+2;.
1500: 20 20 20 20 65 6e 64 3b 0a 20 20 7d 0a 7d 20 7b      end;.  }.} {
1510: 31 20 7b 63 61 6e 6e 6f 74 20 63 72 65 61 74 65  1 {cannot create
1520: 20 42 45 46 4f 52 45 20 74 72 69 67 67 65 72 20   BEFORE trigger 
1530: 6f 6e 20 76 69 65 77 3a 20 6d 61 69 6e 2e 76 31  on view: main.v1
1540: 7d 7d 0a 23 20 45 6e 73 75 72 65 20 74 68 61 74  }}.# Ensure that
1550: 20 77 65 20 63 61 6e 6e 6f 74 20 63 72 65 61 74   we cannot creat
1560: 65 20 41 46 54 45 52 20 74 72 69 67 67 65 72 73  e AFTER triggers
1570: 20 6f 6e 20 76 69 65 77 73 0a 64 6f 5f 74 65 73   on views.do_tes
1580: 74 20 74 72 69 67 67 65 72 31 2d 31 2e 31 34 20  t trigger1-1.14 
1590: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20  {.  catchsql {. 
15a0: 20 20 20 64 72 6f 70 20 76 69 65 77 20 76 31 3b     drop view v1;
15b0: 0a 20 20 20 20 63 72 65 61 74 65 20 76 69 65 77  .    create view
15c0: 20 76 31 20 61 73 20 73 65 6c 65 63 74 20 2a 20   v1 as select * 
15d0: 66 72 6f 6d 20 74 31 3b 0a 20 20 20 20 63 72 65  from t1;.    cre
15e0: 61 74 65 20 74 72 69 67 67 65 72 20 76 31 74 20  ate trigger v1t 
15f0: 41 46 54 45 52 20 75 70 64 61 74 65 20 6f 6e 20  AFTER update on 
1600: 76 31 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20  v1 for each row 
1610: 62 65 67 69 6e 0a 20 20 20 20 20 20 64 65 6c 65  begin.      dele
1620: 74 65 20 66 72 6f 6d 20 74 31 20 57 48 45 52 45  te from t1 WHERE
1630: 20 61 3d 6f 6c 64 2e 61 2b 32 3b 0a 20 20 20 20   a=old.a+2;.    
1640: 65 6e 64 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 63  end;.  }.} {1 {c
1650: 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 41 46 54  annot create AFT
1660: 45 52 20 74 72 69 67 67 65 72 20 6f 6e 20 76 69  ER trigger on vi
1670: 65 77 3a 20 6d 61 69 6e 2e 76 31 7d 7d 0a 7d 20  ew: main.v1}}.} 
1680: 3b 23 20 69 66 63 61 70 61 62 6c 65 20 76 69 65  ;# ifcapable vie
1690: 77 0a 0a 23 20 43 68 65 63 6b 20 66 6f 72 20 6d  w..# Check for m
16a0: 65 6d 6f 72 79 20 6c 65 61 6b 73 20 69 6e 20 74  emory leaks in t
16b0: 68 65 20 74 72 69 67 67 65 72 20 70 61 72 73 65  he trigger parse
16c0: 72 0a 23 0a 64 6f 5f 74 65 73 74 20 74 72 69 67  r.#.do_test trig
16d0: 67 65 72 31 2d 32 2e 31 20 7b 0a 20 20 63 61 74  ger1-2.1 {.  cat
16e0: 63 68 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  chsql {.    CREA
16f0: 54 45 20 54 52 49 47 47 45 52 20 72 31 20 41 46  TE TRIGGER r1 AF
1700: 54 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 74 31  TER INSERT ON t1
1710: 20 42 45 47 49 4e 0a 20 20 20 20 20 20 53 45 4c   BEGIN.      SEL
1720: 45 43 54 20 2a 20 46 52 4f 4d 3b 20 20 2d 2d 20  ECT * FROM;  -- 
1730: 53 79 6e 74 61 78 20 65 72 72 6f 72 0a 20 20 20  Syntax error.   
1740: 20 45 4e 44 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b   END;.  }.} {1 {
1750: 6e 65 61 72 20 22 3b 22 3a 20 73 79 6e 74 61 78  near ";": syntax
1760: 20 65 72 72 6f 72 7d 7d 0a 64 6f 5f 74 65 73 74   error}}.do_test
1770: 20 74 72 69 67 67 65 72 31 2d 32 2e 32 20 7b 0a   trigger1-2.2 {.
1780: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
1790: 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20   CREATE TRIGGER 
17a0: 72 31 20 41 46 54 45 52 20 49 4e 53 45 52 54 20  r1 AFTER INSERT 
17b0: 4f 4e 20 74 31 20 42 45 47 49 4e 0a 20 20 20 20  ON t1 BEGIN.    
17c0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
17d0: 74 31 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  t1;.      SELECT
17e0: 20 2a 20 46 52 4f 4d 3b 20 20 2d 2d 20 53 79 6e   * FROM;  -- Syn
17f0: 74 61 78 20 65 72 72 6f 72 0a 20 20 20 20 45 4e  tax error.    EN
1800: 44 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 6e 65 61  D;.  }.} {1 {nea
1810: 72 20 22 3b 22 3a 20 73 79 6e 74 61 78 20 65 72  r ";": syntax er
1820: 72 6f 72 7d 7d 0a 0a 23 20 43 72 65 61 74 65 20  ror}}..# Create 
1830: 61 20 74 72 69 67 67 65 72 20 74 68 61 74 20 72  a trigger that r
1840: 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65  efers to a table
1850: 20 74 68 61 74 20 6d 69 67 68 74 20 6e 6f 74 20   that might not 
1860: 65 78 69 73 74 2e 0a 23 0a 69 66 63 61 70 61 62  exist..#.ifcapab
1870: 6c 65 20 74 65 6d 70 64 62 20 7b 0a 20 20 64 6f  le tempdb {.  do
1880: 5f 74 65 73 74 20 74 72 69 67 67 65 72 31 2d 33  _test trigger1-3
1890: 2e 31 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .1 {.    execsql
18a0: 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20   {.      CREATE 
18b0: 54 45 4d 50 20 54 41 42 4c 45 20 74 32 28 78 2c  TEMP TABLE t2(x,
18c0: 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  y);.    }.    ca
18d0: 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 20 20 43  tchsql {.      C
18e0: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 72 31  REATE TRIGGER r1
18f0: 20 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f 4e   AFTER INSERT ON
1900: 20 74 31 20 42 45 47 49 4e 0a 20 20 20 20 20 20   t1 BEGIN.      
1910: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
1920: 20 56 41 4c 55 45 53 28 4e 45 57 2e 61 2c 4e 45   VALUES(NEW.a,NE
1930: 57 2e 62 29 3b 0a 20 20 20 20 20 20 45 4e 44 3b  W.b);.      END;
1940: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 30 20 7b 7d  .    }.  } {0 {}
1950: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 74 72 69 67  }.  do_test trig
1960: 67 65 72 2d 33 2e 32 20 7b 0a 20 20 20 20 63 61  ger-3.2 {.    ca
1970: 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 20 20 49  tchsql {.      I
1980: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
1990: 4c 55 45 53 28 31 2c 32 29 3b 0a 20 20 20 20 20  LUES(1,2);.     
19a0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
19b0: 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20  2;.    }.  } {1 
19c0: 7b 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20  {no such table: 
19d0: 6d 61 69 6e 2e 74 32 7d 7d 0a 20 20 64 6f 5f 74  main.t2}}.  do_t
19e0: 65 73 74 20 74 72 69 67 67 65 72 2d 33 2e 33 20  est trigger-3.3 
19f0: 7b 0a 20 20 20 20 64 62 20 63 6c 6f 73 65 0a 20  {.    db close. 
1a00: 20 20 20 73 65 74 20 72 63 20 5b 63 61 74 63 68     set rc [catch
1a10: 20 7b 73 71 6c 69 74 65 33 20 64 62 20 74 65 73   {sqlite3 db tes
1a20: 74 2e 64 62 7d 20 65 72 72 5d 0a 20 20 20 20 69  t.db} err].    i
1a30: 66 20 7b 24 72 63 7d 20 7b 6c 61 70 70 65 6e 64  f {$rc} {lappend
1a40: 20 72 63 20 24 65 72 72 7d 0a 20 20 20 20 73 65   rc $err}.    se
1a50: 74 20 72 63 0a 20 20 7d 20 7b 30 7d 0a 20 20 64  t rc.  } {0}.  d
1a60: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 2d 33  o_test trigger-3
1a70: 2e 34 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71  .4 {.    catchsq
1a80: 6c 20 7b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  l {.      INSERT
1a90: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
1aa0: 31 2c 32 29 3b 0a 20 20 20 20 20 20 53 45 4c 45  1,2);.      SELE
1ab0: 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20  CT * FROM t2;.  
1ac0: 20 20 7d 0a 20 20 7d 20 7b 31 20 7b 6e 6f 20 73    }.  } {1 {no s
1ad0: 75 63 68 20 74 61 62 6c 65 3a 20 6d 61 69 6e 2e  uch table: main.
1ae0: 74 32 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 74  t2}}.  do_test t
1af0: 72 69 67 67 65 72 2d 33 2e 35 20 7b 0a 20 20 20  rigger-3.5 {.   
1b00: 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20   catchsql {.    
1b10: 20 20 43 52 45 41 54 45 20 54 45 4d 50 20 54 41    CREATE TEMP TA
1b20: 42 4c 45 20 74 32 28 78 2c 79 29 3b 0a 20 20 20  BLE t2(x,y);.   
1b30: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1b40: 31 20 56 41 4c 55 45 53 28 31 2c 32 29 3b 0a 20  1 VALUES(1,2);. 
1b50: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
1b60: 4f 4d 20 74 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  OM t2;.    }.  }
1b70: 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20 74 61 62   {1 {no such tab
1b80: 6c 65 3a 20 6d 61 69 6e 2e 74 32 7d 7d 0a 20 20  le: main.t2}}.  
1b90: 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 2d  do_test trigger-
1ba0: 33 2e 36 20 7b 0a 20 20 20 20 63 61 74 63 68 73  3.6 {.    catchs
1bb0: 71 6c 20 7b 0a 20 20 20 20 20 20 44 52 4f 50 20  ql {.      DROP 
1bc0: 54 52 49 47 47 45 52 20 72 31 3b 0a 20 20 20 20  TRIGGER r1;.    
1bd0: 20 20 43 52 45 41 54 45 20 54 45 4d 50 20 54 52    CREATE TEMP TR
1be0: 49 47 47 45 52 20 72 31 20 41 46 54 45 52 20 49  IGGER r1 AFTER I
1bf0: 4e 53 45 52 54 20 4f 4e 20 74 31 20 42 45 47 49  NSERT ON t1 BEGI
1c00: 4e 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  N.        INSERT
1c10: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
1c20: 4e 45 57 2e 61 2c 4e 45 57 2e 62 29 3b 0a 20 20  NEW.a,NEW.b);.  
1c30: 20 20 20 20 45 4e 44 3b 0a 20 20 20 20 20 20 49      END;.      I
1c40: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
1c50: 4c 55 45 53 28 31 2c 32 29 3b 0a 20 20 20 20 20  LUES(1,2);.     
1c60: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1c70: 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 30 20  2;.    }.  } {0 
1c80: 7b 31 20 32 7d 7d 0a 20 20 64 6f 5f 74 65 73 74  {1 2}}.  do_test
1c90: 20 74 72 69 67 67 65 72 2d 33 2e 37 20 7b 0a 20   trigger-3.7 {. 
1ca0: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
1cb0: 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74 32     DROP TABLE t2
1cc0: 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54  ;.      CREATE T
1cd0: 41 42 4c 45 20 74 32 28 78 2c 79 29 3b 0a 20 20  ABLE t2(x,y);.  
1ce0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
1cf0: 4d 20 74 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  M t2;.    }.  } 
1d00: 7b 7d 0a 0a 20 20 23 20 54 68 65 72 65 20 61 72  {}..  # There ar
1d10: 65 20 74 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f  e two versions o
1d20: 66 20 74 72 69 67 67 65 72 2d 33 2e 38 20 61 6e  f trigger-3.8 an
1d30: 64 20 74 72 69 67 67 65 72 2d 33 2e 39 2e 20 4f  d trigger-3.9. O
1d40: 6e 65 20 74 68 61 74 20 75 73 65 73 0a 20 20 23  ne that uses.  #
1d50: 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
1d60: 20 73 74 61 74 65 6d 65 6e 74 73 2c 20 61 6e 64   statements, and
1d70: 20 61 6e 6f 74 68 65 72 20 74 68 61 74 20 64 6f   another that do
1d80: 65 73 20 6e 6f 74 2e 0a 20 20 69 66 63 61 70 61  es not..  ifcapa
1d90: 62 6c 65 20 63 6f 6d 70 6f 75 6e 64 20 7b 0a 20  ble compound {. 
1da0: 20 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72   do_test trigger
1db0: 31 2d 33 2e 38 20 7b 0a 20 20 20 20 65 78 65 63  1-3.8 {.    exec
1dc0: 73 71 6c 20 7b 0a 20 20 20 20 20 20 49 4e 53 45  sql {.      INSE
1dd0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
1de0: 53 28 33 2c 34 29 3b 0a 20 20 20 20 20 20 53 45  S(3,4);.      SE
1df0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 55  LECT * FROM t1 U
1e00: 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20  NION ALL SELECT 
1e10: 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 7d  * FROM t2;.    }
1e20: 0a 20 20 7d 20 7b 31 20 32 20 33 20 34 20 33 20  .  } {1 2 3 4 3 
1e30: 34 7d 0a 20 20 64 6f 5f 74 65 73 74 20 74 72 69  4}.  do_test tri
1e40: 67 67 65 72 31 2d 33 2e 39 20 7b 0a 20 20 20 20  gger1-3.9 {.    
1e50: 64 62 20 63 6c 6f 73 65 0a 20 20 20 20 73 71 6c  db close.    sql
1e60: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
1e70: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
1e80: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1e90: 74 31 20 56 41 4c 55 45 53 28 35 2c 36 29 3b 0a  t1 VALUES(5,6);.
1ea0: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
1eb0: 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 41 4c 4c  ROM t1 UNION ALL
1ec0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1ed0: 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20  2;.    }.  } {1 
1ee0: 32 20 33 20 34 20 35 20 36 20 33 20 34 7d 0a 20  2 3 4 5 6 3 4}. 
1ef0: 20 7d 20 3b 23 20 69 66 63 61 70 61 62 6c 65 20   } ;# ifcapable 
1f00: 63 6f 6d 70 6f 75 6e 64 0a 20 20 69 66 63 61 70  compound.  ifcap
1f10: 61 62 6c 65 20 21 63 6f 6d 70 6f 75 6e 64 20 7b  able !compound {
1f20: 0a 20 20 64 6f 5f 74 65 73 74 20 74 72 69 67 67  .  do_test trigg
1f30: 65 72 31 2d 33 2e 38 20 7b 0a 20 20 20 20 65 78  er1-3.8 {.    ex
1f40: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 49 4e  ecsql {.      IN
1f50: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
1f60: 55 45 53 28 33 2c 34 29 3b 0a 20 20 20 20 20 20  UES(3,4);.      
1f70: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
1f80: 3b 20 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  ; .      SELECT 
1f90: 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 7d  * FROM t2;.    }
1fa0: 0a 20 20 7d 20 7b 31 20 32 20 33 20 34 20 33 20  .  } {1 2 3 4 3 
1fb0: 34 7d 0a 20 20 64 6f 5f 74 65 73 74 20 74 72 69  4}.  do_test tri
1fc0: 67 67 65 72 31 2d 33 2e 39 20 7b 0a 20 20 20 20  gger1-3.9 {.    
1fd0: 64 62 20 63 6c 6f 73 65 0a 20 20 20 20 73 71 6c  db close.    sql
1fe0: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
1ff0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
2000: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2010: 74 31 20 56 41 4c 55 45 53 28 35 2c 36 29 3b 0a  t1 VALUES(5,6);.
2020: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
2030: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 53 45  ROM t1;.      SE
2040: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a  LECT * FROM t2;.
2050: 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33      }.  } {1 2 3
2060: 20 34 20 35 20 36 20 33 20 34 7d 0a 20 20 7d 20   4 5 6 3 4}.  } 
2070: 3b 23 20 69 66 63 61 70 61 62 6c 65 20 21 63 6f  ;# ifcapable !co
2080: 6d 70 6f 75 6e 64 0a 0a 20 20 64 6f 5f 74 65 73  mpound..  do_tes
2090: 74 20 74 72 69 67 67 65 72 31 2d 34 2e 31 20 7b  t trigger1-4.1 {
20a0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
20b0: 20 20 20 20 20 43 52 45 41 54 45 20 54 45 4d 50       CREATE TEMP
20c0: 20 54 52 49 47 47 45 52 20 72 31 20 42 45 46 4f   TRIGGER r1 BEFO
20d0: 52 45 20 49 4e 53 45 52 54 20 4f 4e 20 74 31 20  RE INSERT ON t1 
20e0: 42 45 47 49 4e 0a 20 20 20 20 20 20 20 20 49 4e  BEGIN.        IN
20f0: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
2100: 55 45 53 28 4e 45 57 2e 61 2c 4e 45 57 2e 62 29  UES(NEW.a,NEW.b)
2110: 3b 0a 20 20 20 20 20 20 45 4e 44 3b 0a 20 20 20  ;.      END;.   
2120: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2130: 31 20 56 41 4c 55 45 53 28 37 2c 38 29 3b 0a 20  1 VALUES(7,8);. 
2140: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
2150: 4f 4d 20 74 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  OM t2;.    }.  }
2160: 20 7b 33 20 34 20 37 20 38 7d 0a 20 20 64 6f 5f   {3 4 7 8}.  do_
2170: 74 65 73 74 20 74 72 69 67 67 65 72 31 2d 34 2e  test trigger1-4.
2180: 32 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  2 {.    sqlite3 
2190: 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20 20 20  db2 test.db.    
21a0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
21b0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
21c0: 41 4c 55 45 53 28 39 2c 31 30 29 3b 0a 20 20 20  ALUES(9,10);.   
21d0: 20 7d 20 64 62 32 3b 0a 20 20 20 20 64 62 32 20   } db2;.    db2 
21e0: 63 6c 6f 73 65 0a 20 20 20 20 65 78 65 63 73 71  close.    execsq
21f0: 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  l {.      SELECT
2200: 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20   * FROM t2;.    
2210: 7d 0a 20 20 7d 20 7b 33 20 34 20 37 20 38 7d 0a  }.  } {3 4 7 8}.
2220: 20 20 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65    do_test trigge
2230: 72 31 2d 34 2e 33 20 7b 0a 20 20 20 20 65 78 65  r1-4.3 {.    exe
2240: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 44 52 4f  csql {.      DRO
2250: 50 20 54 41 42 4c 45 20 74 31 3b 0a 20 20 20 20  P TABLE t1;.    
2260: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
2270: 74 32 3b 0a 20 20 20 20 7d 3b 0a 20 20 7d 20 7b  t2;.    };.  } {
2280: 33 20 34 20 37 20 38 7d 0a 20 20 64 6f 5f 74 65  3 4 7 8}.  do_te
2290: 73 74 20 74 72 69 67 67 65 72 31 2d 34 2e 34 20  st trigger1-4.4 
22a0: 7b 0a 20 20 20 20 64 62 20 63 6c 6f 73 65 0a 20  {.    db close. 
22b0: 20 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65     sqlite3 db te
22c0: 73 74 2e 64 62 0a 20 20 20 20 65 78 65 63 73 71  st.db.    execsq
22d0: 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  l {.      SELECT
22e0: 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20   * FROM t2;.    
22f0: 7d 3b 0a 20 20 7d 20 7b 33 20 34 20 37 20 38 7d  };.  } {3 4 7 8}
2300: 0a 7d 20 65 6c 73 65 20 7b 0a 20 20 65 78 65 63  .} else {.  exec
2310: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
2320: 20 54 41 42 4c 45 20 74 32 28 78 2c 79 29 3b 0a   TABLE t2(x,y);.
2330: 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74      DROP TABLE t
2340: 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
2350: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 33 2c 20  TO t2 VALUES(3, 
2360: 34 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  4);.    INSERT I
2370: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 37 2c  NTO t2 VALUES(7,
2380: 20 38 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 69 6e 74   8);.  }.}...int
2390: 65 67 72 69 74 79 5f 63 68 65 63 6b 20 74 72 69  egrity_check tri
23a0: 67 67 65 72 31 2d 35 2e 31 0a 0a 23 20 43 72 65  gger1-5.1..# Cre
23b0: 61 74 65 20 61 20 74 72 69 67 67 65 72 20 77 69  ate a trigger wi
23c0: 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
23d0: 20 61 73 20 61 20 74 61 62 6c 65 2e 20 20 4d 61   as a table.  Ma
23e0: 6b 65 20 73 75 72 65 20 74 68 65 0a 23 20 74 72  ke sure the.# tr
23f0: 69 67 67 65 72 20 77 6f 72 6b 73 2e 20 20 54 68  igger works.  Th
2400: 65 6e 20 64 72 6f 70 20 74 68 65 20 74 72 69 67  en drop the trig
2410: 67 65 72 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ger.  Make sure 
2420: 74 68 65 20 74 61 62 6c 65 20 69 73 0a 23 20 73  the table is.# s
2430: 74 69 6c 6c 20 74 68 65 72 65 2e 0a 23 0a 73 65  till there..#.se
2440: 74 20 76 69 65 77 5f 76 31 20 7b 7d 0a 69 66 63  t view_v1 {}.ifc
2450: 61 70 61 62 6c 65 20 76 69 65 77 20 7b 0a 20 20  apable view {.  
2460: 73 65 74 20 76 69 65 77 5f 76 31 20 7b 76 69 65  set view_v1 {vie
2470: 77 20 76 31 7d 0a 7d 0a 64 6f 5f 74 65 73 74 20  w v1}.}.do_test 
2480: 74 72 69 67 67 65 72 31 2d 36 2e 31 20 7b 0a 20  trigger1-6.1 {. 
2490: 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54   execsql {SELECT
24a0: 20 74 79 70 65 2c 20 6e 61 6d 65 20 46 52 4f 4d   type, name FROM
24b0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 7d 0a   sqlite_master}.
24c0: 7d 20 5b 63 6f 6e 63 61 74 20 24 76 69 65 77 5f  } [concat $view_
24d0: 76 31 20 7b 74 61 62 6c 65 20 74 32 7d 5d 0a 64  v1 {table t2}].d
24e0: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 31 2d  o_test trigger1-
24f0: 36 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  6.2 {.  execsql 
2500: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49  {.    CREATE TRI
2510: 47 47 45 52 20 74 32 20 42 45 46 4f 52 45 20 44  GGER t2 BEFORE D
2520: 45 4c 45 54 45 20 4f 4e 20 74 32 20 42 45 47 49  ELETE ON t2 BEGI
2530: 4e 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 52  N.      SELECT R
2540: 41 49 53 45 28 41 42 4f 52 54 2c 27 64 65 6c 65  AISE(ABORT,'dele
2550: 74 65 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f  tes are not allo
2560: 77 73 27 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20  ws');.    END;. 
2570: 20 20 20 53 45 4c 45 43 54 20 74 79 70 65 2c 20     SELECT type, 
2580: 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65  name FROM sqlite
2590: 5f 6d 61 73 74 65 72 3b 0a 20 20 7d 0a 7d 20 5b  _master;.  }.} [
25a0: 63 6f 6e 63 61 74 20 24 76 69 65 77 5f 76 31 20  concat $view_v1 
25b0: 7b 74 61 62 6c 65 20 74 32 20 74 72 69 67 67 65  {table t2 trigge
25c0: 72 20 74 32 7d 5d 0a 64 6f 5f 74 65 73 74 20 74  r t2}].do_test t
25d0: 72 69 67 67 65 72 31 2d 36 2e 33 20 7b 0a 20 20  rigger1-6.3 {.  
25e0: 63 61 74 63 68 73 71 6c 20 7b 44 45 4c 45 54 45  catchsql {DELETE
25f0: 20 46 52 4f 4d 20 74 32 7d 0a 7d 20 7b 31 20 7b   FROM t2}.} {1 {
2600: 64 65 6c 65 74 65 73 20 61 72 65 20 6e 6f 74 20  deletes are not 
2610: 61 6c 6c 6f 77 73 7d 7d 0a 64 6f 5f 74 65 73 74  allows}}.do_test
2620: 20 74 72 69 67 67 65 72 31 2d 36 2e 34 20 7b 0a   trigger1-6.4 {.
2630: 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43    execsql {SELEC
2640: 54 20 2a 20 46 52 4f 4d 20 74 32 7d 0a 7d 20 7b  T * FROM t2}.} {
2650: 33 20 34 20 37 20 38 7d 0a 64 6f 5f 74 65 73 74  3 4 7 8}.do_test
2660: 20 74 72 69 67 67 65 72 31 2d 36 2e 35 20 7b 0a   trigger1-6.5 {.
2670: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 73 71 6c    db close.  sql
2680: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
2690: 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43    execsql {SELEC
26a0: 54 20 74 79 70 65 2c 20 6e 61 6d 65 20 46 52 4f  T type, name FRO
26b0: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 7d  M sqlite_master}
26c0: 0a 7d 20 5b 63 6f 6e 63 61 74 20 24 76 69 65 77  .} [concat $view
26d0: 5f 76 31 20 7b 74 61 62 6c 65 20 74 32 20 74 72  _v1 {table t2 tr
26e0: 69 67 67 65 72 20 74 32 7d 5d 0a 64 6f 5f 74 65  igger t2}].do_te
26f0: 73 74 20 74 72 69 67 67 65 72 31 2d 36 2e 36 20  st trigger1-6.6 
2700: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
2710: 20 20 44 52 4f 50 20 54 52 49 47 47 45 52 20 74    DROP TRIGGER t
2720: 32 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 74 79  2;.    SELECT ty
2730: 70 65 2c 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71  pe, name FROM sq
2740: 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 7d  lite_master;.  }
2750: 0a 7d 20 5b 63 6f 6e 63 61 74 20 24 76 69 65 77  .} [concat $view
2760: 5f 76 31 20 7b 74 61 62 6c 65 20 74 32 7d 5d 0a  _v1 {table t2}].
2770: 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 31  do_test trigger1
2780: 2d 36 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c  -6.7 {.  execsql
2790: 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   {SELECT * FROM 
27a0: 74 32 7d 0a 7d 20 7b 33 20 34 20 37 20 38 7d 0a  t2}.} {3 4 7 8}.
27b0: 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 31  do_test trigger1
27c0: 2d 36 2e 38 20 7b 0a 20 20 64 62 20 63 6c 6f 73  -6.8 {.  db clos
27d0: 65 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  e.  sqlite3 db t
27e0: 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c  est.db.  execsql
27f0: 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   {SELECT * FROM 
2800: 74 32 7d 0a 7d 20 7b 33 20 34 20 37 20 38 7d 0a  t2}.} {3 4 7 8}.
2810: 0a 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b  .integrity_check
2820: 20 74 72 69 67 67 65 72 2d 37 2e 31 0a 0a 23 20   trigger-7.1..# 
2830: 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75  Check to make su
2840: 72 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  re the name of a
2850: 20 74 72 69 67 67 65 72 20 63 61 6e 20 62 65 20   trigger can be 
2860: 71 75 6f 74 65 64 20 73 6f 20 74 68 61 74 20 6b  quoted so that k
2870: 65 79 77 6f 72 64 73 0a 23 20 63 61 6e 20 62 65  eywords.# can be
2880: 20 75 73 65 64 20 61 73 20 74 72 69 67 67 65 72   used as trigger
2890: 20 6e 61 6d 65 73 2e 20 20 54 69 63 6b 65 74 20   names.  Ticket 
28a0: 23 34 36 38 0a 23 0a 64 6f 5f 74 65 73 74 20 74  #468.#.do_test t
28b0: 72 69 67 67 65 72 31 2d 38 2e 31 20 7b 0a 20 20  rigger1-8.1 {.  
28c0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
28d0: 45 41 54 45 20 54 52 49 47 47 45 52 20 27 74 72  EATE TRIGGER 'tr
28e0: 69 67 67 65 72 27 20 41 46 54 45 52 20 49 4e 53  igger' AFTER INS
28f0: 45 52 54 20 4f 4e 20 74 32 20 42 45 47 49 4e 20  ERT ON t2 BEGIN 
2900: 53 45 4c 45 43 54 20 31 3b 20 45 4e 44 3b 0a 20  SELECT 1; END;. 
2910: 20 20 20 53 45 4c 45 43 54 20 6e 61 6d 65 20 46     SELECT name F
2920: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
2930: 72 20 57 48 45 52 45 20 74 79 70 65 3d 27 74 72  r WHERE type='tr
2940: 69 67 67 65 72 27 3b 0a 20 20 7d 0a 7d 20 7b 74  igger';.  }.} {t
2950: 72 69 67 67 65 72 7d 0a 64 6f 5f 74 65 73 74 20  rigger}.do_test 
2960: 74 72 69 67 67 65 72 31 2d 38 2e 32 20 7b 0a 20  trigger1-8.2 {. 
2970: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44   execsql {.    D
2980: 52 4f 50 20 54 52 49 47 47 45 52 20 27 74 72 69  ROP TRIGGER 'tri
2990: 67 67 65 72 27 3b 0a 20 20 20 20 53 45 4c 45 43  gger';.    SELEC
29a0: 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69  T name FROM sqli
29b0: 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20  te_master WHERE 
29c0: 74 79 70 65 3d 27 74 72 69 67 67 65 72 27 3b 0a  type='trigger';.
29d0: 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
29e0: 20 74 72 69 67 67 65 72 31 2d 38 2e 33 20 7b 0a   trigger1-8.3 {.
29f0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
2a00: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 22  CREATE TRIGGER "
2a10: 74 72 69 67 67 65 72 22 20 41 46 54 45 52 20 49  trigger" AFTER I
2a20: 4e 53 45 52 54 20 4f 4e 20 74 32 20 42 45 47 49  NSERT ON t2 BEGI
2a30: 4e 20 53 45 4c 45 43 54 20 31 3b 20 45 4e 44 3b  N SELECT 1; END;
2a40: 0a 20 20 20 20 53 45 4c 45 43 54 20 6e 61 6d 65  .    SELECT name
2a50: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
2a60: 74 65 72 20 57 48 45 52 45 20 74 79 70 65 3d 27  ter WHERE type='
2a70: 74 72 69 67 67 65 72 27 3b 0a 20 20 7d 0a 7d 20  trigger';.  }.} 
2a80: 7b 74 72 69 67 67 65 72 7d 0a 64 6f 5f 74 65 73  {trigger}.do_tes
2a90: 74 20 74 72 69 67 67 65 72 31 2d 38 2e 34 20 7b  t trigger1-8.4 {
2aa0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
2ab0: 20 44 52 4f 50 20 54 52 49 47 47 45 52 20 22 74   DROP TRIGGER "t
2ac0: 72 69 67 67 65 72 22 3b 0a 20 20 20 20 53 45 4c  rigger";.    SEL
2ad0: 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71  ECT name FROM sq
2ae0: 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52  lite_master WHER
2af0: 45 20 74 79 70 65 3d 27 74 72 69 67 67 65 72 27  E type='trigger'
2b00: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
2b10: 73 74 20 74 72 69 67 67 65 72 31 2d 38 2e 35 20  st trigger1-8.5 
2b20: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
2b30: 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52    CREATE TRIGGER
2b40: 20 5b 74 72 69 67 67 65 72 5d 20 41 46 54 45 52   [trigger] AFTER
2b50: 20 49 4e 53 45 52 54 20 4f 4e 20 74 32 20 42 45   INSERT ON t2 BE
2b60: 47 49 4e 20 53 45 4c 45 43 54 20 31 3b 20 45 4e  GIN SELECT 1; EN
2b70: 44 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 6e 61  D;.    SELECT na
2b80: 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  me FROM sqlite_m
2b90: 61 73 74 65 72 20 57 48 45 52 45 20 74 79 70 65  aster WHERE type
2ba0: 3d 27 74 72 69 67 67 65 72 27 3b 0a 20 20 7d 0a  ='trigger';.  }.
2bb0: 7d 20 7b 74 72 69 67 67 65 72 7d 0a 64 6f 5f 74  } {trigger}.do_t
2bc0: 65 73 74 20 74 72 69 67 67 65 72 31 2d 38 2e 36  est trigger1-8.6
2bd0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
2be0: 20 20 20 44 52 4f 50 20 54 52 49 47 47 45 52 20     DROP TRIGGER 
2bf0: 5b 74 72 69 67 67 65 72 5d 3b 0a 20 20 20 20 53  [trigger];.    S
2c00: 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20  ELECT name FROM 
2c10: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48  sqlite_master WH
2c20: 45 52 45 20 74 79 70 65 3d 27 74 72 69 67 67 65  ERE type='trigge
2c30: 72 27 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 69 66  r';.  }.} {}..if
2c40: 63 61 70 61 62 6c 65 20 63 6f 6e 66 6c 69 63 74  capable conflict
2c50: 20 7b 0a 20 20 23 20 4d 61 6b 65 20 73 75 72 65   {.  # Make sure
2c60: 20 52 45 50 4c 41 43 45 20 77 6f 72 6b 73 20 69   REPLACE works i
2c70: 6e 73 69 64 65 20 6f 66 20 74 72 69 67 67 65 72  nside of trigger
2c80: 73 2e 0a 20 20 23 0a 20 20 23 20 54 68 65 72 65  s..  #.  # There
2c90: 20 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e   are two version
2ca0: 73 20 6f 66 20 74 72 69 67 67 65 72 2d 39 2e 31  s of trigger-9.1
2cb0: 20 61 6e 64 20 74 72 69 67 67 65 72 2d 39 2e 32   and trigger-9.2
2cc0: 2e 20 4f 6e 65 20 74 68 61 74 20 75 73 65 73 0a  . One that uses.
2cd0: 20 20 23 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c    # compound SEL
2ce0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2c 20  ECT statements, 
2cf0: 61 6e 64 20 61 6e 6f 74 68 65 72 20 74 68 61 74  and another that
2d00: 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 69 66 63   does not..  ifc
2d10: 61 70 61 62 6c 65 20 63 6f 6d 70 6f 75 6e 64 20  apable compound 
2d20: 7b 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 74 72  {.    do_test tr
2d30: 69 67 67 65 72 31 2d 39 2e 31 20 7b 0a 20 20 20  igger1-9.1 {.   
2d40: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
2d50: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
2d60: 45 20 74 33 28 61 2c 62 29 3b 0a 20 20 20 20 20  E t3(a,b);.     
2d70: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
2d80: 74 34 28 78 20 55 4e 49 51 55 45 2c 20 62 29 3b  t4(x UNIQUE, b);
2d90: 0a 20 20 20 20 20 20 20 20 43 52 45 41 54 45 20  .        CREATE 
2da0: 54 52 49 47 47 45 52 20 72 33 34 20 41 46 54 45  TRIGGER r34 AFTE
2db0: 52 20 49 4e 53 45 52 54 20 4f 4e 20 74 33 20 42  R INSERT ON t3 B
2dc0: 45 47 49 4e 0a 20 20 20 20 20 20 20 20 20 20 52  EGIN.          R
2dd0: 45 50 4c 41 43 45 20 49 4e 54 4f 20 74 34 20 56  EPLACE INTO t4 V
2de0: 41 4c 55 45 53 28 6e 65 77 2e 61 2c 6e 65 77 2e  ALUES(new.a,new.
2df0: 62 29 3b 0a 20 20 20 20 20 20 20 20 45 4e 44 3b  b);.        END;
2e00: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
2e10: 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 31  INTO t3 VALUES(1
2e20: 2c 32 29 3b 0a 20 20 20 20 20 20 20 20 53 45 4c  ,2);.        SEL
2e30: 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 20 55 4e  ECT * FROM t3 UN
2e40: 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 39  ION ALL SELECT 9
2e50: 39 2c 20 39 39 20 55 4e 49 4f 4e 20 41 4c 4c 20  9, 99 UNION ALL 
2e60: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 34  SELECT * FROM t4
2e70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
2e80: 7b 31 20 32 20 39 39 20 39 39 20 31 20 32 7d 0a  {1 2 99 99 1 2}.
2e90: 20 20 20 20 64 6f 5f 74 65 73 74 20 74 72 69 67      do_test trig
2ea0: 67 65 72 31 2d 39 2e 32 20 7b 0a 20 20 20 20 20  ger1-9.2 {.     
2eb0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
2ec0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2ed0: 33 20 56 41 4c 55 45 53 28 31 2c 33 29 3b 0a 20  3 VALUES(1,3);. 
2ee0: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20         SELECT * 
2ef0: 46 52 4f 4d 20 74 33 20 55 4e 49 4f 4e 20 41 4c  FROM t3 UNION AL
2f00: 4c 20 53 45 4c 45 43 54 20 39 39 2c 20 39 39 20  L SELECT 99, 99 
2f10: 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54  UNION ALL SELECT
2f20: 20 2a 20 46 52 4f 4d 20 74 34 3b 0a 20 20 20 20   * FROM t4;.    
2f30: 20 20 7d 0a 20 20 20 20 7d 20 7b 31 20 32 20 31    }.    } {1 2 1
2f40: 20 33 20 39 39 20 39 39 20 31 20 33 7d 0a 20 20   3 99 99 1 3}.  
2f50: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 64 6f 5f  } else {.    do_
2f60: 74 65 73 74 20 74 72 69 67 67 65 72 31 2d 39 2e  test trigger1-9.
2f70: 31 20 7b 0a 20 20 20 20 20 20 65 78 65 63 73 71  1 {.      execsq
2f80: 6c 20 7b 0a 20 20 20 20 20 20 20 20 43 52 45 41  l {.        CREA
2f90: 54 45 20 54 41 42 4c 45 20 74 33 28 61 2c 62 29  TE TABLE t3(a,b)
2fa0: 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41 54 45  ;.        CREATE
2fb0: 20 54 41 42 4c 45 20 74 34 28 78 20 55 4e 49 51   TABLE t4(x UNIQ
2fc0: 55 45 2c 20 62 29 3b 0a 20 20 20 20 20 20 20 20  UE, b);.        
2fd0: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 72  CREATE TRIGGER r
2fe0: 33 34 20 41 46 54 45 52 20 49 4e 53 45 52 54 20  34 AFTER INSERT 
2ff0: 4f 4e 20 74 33 20 42 45 47 49 4e 0a 20 20 20 20  ON t3 BEGIN.    
3000: 20 20 20 20 20 20 52 45 50 4c 41 43 45 20 49 4e        REPLACE IN
3010: 54 4f 20 74 34 20 56 41 4c 55 45 53 28 6e 65 77  TO t4 VALUES(new
3020: 2e 61 2c 6e 65 77 2e 62 29 3b 0a 20 20 20 20 20  .a,new.b);.     
3030: 20 20 20 45 4e 44 3b 0a 20 20 20 20 20 20 20 20     END;.        
3040: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56  INSERT INTO t3 V
3050: 41 4c 55 45 53 28 31 2c 32 29 3b 0a 20 20 20 20  ALUES(1,2);.    
3060: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
3070: 4d 20 74 33 3b 20 53 45 4c 45 43 54 20 39 39 2c  M t3; SELECT 99,
3080: 20 39 39 3b 20 53 45 4c 45 43 54 20 2a 20 46 52   99; SELECT * FR
3090: 4f 4d 20 74 34 3b 0a 20 20 20 20 20 20 7d 0a 20  OM t4;.      }. 
30a0: 20 20 20 7d 20 7b 31 20 32 20 39 39 20 39 39 20     } {1 2 99 99 
30b0: 31 20 32 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74  1 2}.    do_test
30c0: 20 74 72 69 67 67 65 72 31 2d 39 2e 32 20 7b 0a   trigger1-9.2 {.
30d0: 20 20 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a        execsql {.
30e0: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
30f0: 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 31 2c  NTO t3 VALUES(1,
3100: 33 29 3b 0a 20 20 20 20 20 20 20 20 53 45 4c 45  3);.        SELE
3110: 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b 20 53 45  CT * FROM t3; SE
3120: 4c 45 43 54 20 39 39 2c 20 39 39 3b 20 53 45 4c  LECT 99, 99; SEL
3130: 45 43 54 20 2a 20 46 52 4f 4d 20 74 34 3b 0a 20  ECT * FROM t4;. 
3140: 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 7b 31 20       }.    } {1 
3150: 32 20 31 20 33 20 39 39 20 39 39 20 31 20 33 7d  2 1 3 99 99 1 3}
3160: 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  .  }.  execsql {
3170: 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20  .    DROP TABLE 
3180: 74 33 3b 0a 20 20 20 20 44 52 4f 50 20 54 41 42  t3;.    DROP TAB
3190: 4c 45 20 74 34 3b 0a 20 20 7d 0a 7d 0a 0a 0a 23  LE t4;.  }.}...#
31a0: 20 54 69 63 6b 65 74 20 23 37 36 34 2e 20 41 74   Ticket #764. At
31b0: 20 6f 6e 65 20 73 74 61 67 65 20 54 45 4d 50 20   one stage TEMP 
31c0: 74 72 69 67 67 65 72 73 20 77 6f 75 6c 64 20 66  triggers would f
31d0: 61 69 6c 20 74 6f 20 72 65 2d 69 6e 73 74 61 6c  ail to re-instal
31e0: 6c 20 77 68 65 6e 20 74 68 65 0a 23 20 73 63 68  l when the.# sch
31f0: 65 6d 61 20 77 61 73 20 72 65 6c 6f 61 64 65 64  ema was reloaded
3200: 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
3210: 74 65 73 74 73 20 65 6e 73 75 72 65 20 74 68 61  tests ensure tha
3220: 74 20 54 45 4d 50 20 74 72 69 67 67 65 72 73 20  t TEMP triggers 
3230: 61 72 65 0a 23 20 63 6f 72 72 65 63 74 6c 79 20  are.# correctly 
3240: 72 65 2d 69 6e 73 74 61 6c 6c 65 64 2e 0a 23 0a  re-installed..#.
3250: 23 20 41 6c 73 6f 20 76 65 72 69 66 79 20 74 68  # Also verify th
3260: 61 74 20 72 65 66 65 72 65 6e 63 65 73 20 77 69  at references wi
3270: 74 68 69 6e 20 74 72 69 67 67 65 72 20 70 72 6f  thin trigger pro
3280: 67 72 61 6d 73 20 61 72 65 20 72 65 73 6f 6c 76  grams are resolv
3290: 65 64 20 61 74 0a 23 20 73 74 61 74 65 6d 65 6e  ed at.# statemen
32a0: 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20  t compile time, 
32b0: 6e 6f 74 20 74 72 69 67 67 65 72 20 69 6e 73 74  not trigger inst
32c0: 61 6c 6c 61 74 69 6f 6e 20 74 69 6d 65 2e 20 54  allation time. T
32d0: 68 69 73 20 6d 65 61 6e 73 2c 20 66 6f 72 0a 23  his means, for.#
32e0: 20 65 78 61 6d 70 6c 65 2c 20 74 68 61 74 20 79   example, that y
32f0: 6f 75 20 63 61 6e 20 64 72 6f 70 20 61 6e 64 20  ou can drop and 
3300: 72 65 2d 63 72 65 61 74 65 20 74 61 62 6c 65 73  re-create tables
3310: 20 72 65 66 65 72 65 6e 63 65 64 20 62 79 20 74   referenced by t
3320: 72 69 67 67 65 72 73 2e 20 0a 69 66 63 61 70 61  riggers. .ifcapa
3330: 62 6c 65 20 74 65 6d 70 64 62 20 7b 0a 20 20 64  ble tempdb {.  d
3340: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 31 2d  o_test trigger1-
3350: 31 30 2e 30 20 7b 0a 20 20 20 20 66 69 6c 65 20  10.0 {.    file 
3360: 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 74 65  delete -force te
3370: 73 74 32 2e 64 62 0a 20 20 20 20 66 69 6c 65 20  st2.db.    file 
3380: 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 74 65  delete -force te
3390: 73 74 32 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20  st2.db-journal. 
33a0: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
33b0: 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74 32     ATTACH 'test2
33c0: 2e 64 62 27 20 41 53 20 61 75 78 3b 0a 20 20 20  .db' AS aux;.   
33d0: 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74   }.  } {}.  do_t
33e0: 65 73 74 20 74 72 69 67 67 65 72 31 2d 31 30 2e  est trigger1-10.
33f0: 31 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  1 {.    execsql 
3400: 7b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54  {.      CREATE T
3410: 41 42 4c 45 20 6d 61 69 6e 2e 74 34 28 61 2c 20  ABLE main.t4(a, 
3420: 62 2c 20 63 29 3b 0a 20 20 20 20 20 20 43 52 45  b, c);.      CRE
3430: 41 54 45 20 54 41 42 4c 45 20 74 65 6d 70 2e 74  ATE TABLE temp.t
3440: 34 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20  4(a, b, c);.    
3450: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61    CREATE TABLE a
3460: 75 78 2e 74 34 28 61 2c 20 62 2c 20 63 29 3b 0a  ux.t4(a, b, c);.
3470: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
3480: 4c 45 20 69 6e 73 65 72 74 5f 6c 6f 67 28 64 62  LE insert_log(db
3490: 2c 20 61 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20  , a, b, c);.    
34a0: 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  }.  } {}.  do_te
34b0: 73 74 20 74 72 69 67 67 65 72 31 2d 31 30 2e 32  st trigger1-10.2
34c0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
34d0: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 45  .      CREATE TE
34e0: 4d 50 20 54 52 49 47 47 45 52 20 74 72 69 67 31  MP TRIGGER trig1
34f0: 20 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f 4e   AFTER INSERT ON
3500: 20 6d 61 69 6e 2e 74 34 20 42 45 47 49 4e 20 0a   main.t4 BEGIN .
3510: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
3520: 4e 54 4f 20 69 6e 73 65 72 74 5f 6c 6f 67 20 56  NTO insert_log V
3530: 41 4c 55 45 53 28 27 6d 61 69 6e 27 2c 20 6e 65  ALUES('main', ne
3540: 77 2e 61 2c 20 6e 65 77 2e 62 2c 20 6e 65 77 2e  w.a, new.b, new.
3550: 63 29 3b 0a 20 20 20 20 20 20 45 4e 44 3b 0a 20  c);.      END;. 
3560: 20 20 20 20 20 43 52 45 41 54 45 20 54 45 4d 50       CREATE TEMP
3570: 20 54 52 49 47 47 45 52 20 74 72 69 67 32 20 41   TRIGGER trig2 A
3580: 46 54 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 74  FTER INSERT ON t
3590: 65 6d 70 2e 74 34 20 42 45 47 49 4e 20 0a 20 20  emp.t4 BEGIN .  
35a0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
35b0: 4f 20 69 6e 73 65 72 74 5f 6c 6f 67 20 56 41 4c  O insert_log VAL
35c0: 55 45 53 28 27 74 65 6d 70 27 2c 20 6e 65 77 2e  UES('temp', new.
35d0: 61 2c 20 6e 65 77 2e 62 2c 20 6e 65 77 2e 63 29  a, new.b, new.c)
35e0: 3b 0a 20 20 20 20 20 20 45 4e 44 3b 0a 20 20 20  ;.      END;.   
35f0: 20 20 20 43 52 45 41 54 45 20 54 45 4d 50 20 54     CREATE TEMP T
3600: 52 49 47 47 45 52 20 74 72 69 67 33 20 41 46 54  RIGGER trig3 AFT
3610: 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 61 75 78  ER INSERT ON aux
3620: 2e 74 34 20 42 45 47 49 4e 20 0a 20 20 20 20 20  .t4 BEGIN .     
3630: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 69     INSERT INTO i
3640: 6e 73 65 72 74 5f 6c 6f 67 20 56 41 4c 55 45 53  nsert_log VALUES
3650: 28 27 61 75 78 27 2c 20 6e 65 77 2e 61 2c 20 6e  ('aux', new.a, n
3660: 65 77 2e 62 2c 20 6e 65 77 2e 63 29 3b 0a 20 20  ew.b, new.c);.  
3670: 20 20 20 20 45 4e 44 3b 0a 20 20 20 20 7d 0a 20      END;.    }. 
3680: 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20   } {}.  do_test 
3690: 74 72 69 67 67 65 72 31 2d 31 30 2e 33 20 7b 0a  trigger1-10.3 {.
36a0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
36b0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
36c0: 6d 61 69 6e 2e 74 34 20 56 41 4c 55 45 53 28 31  main.t4 VALUES(1
36d0: 2c 20 32 2c 20 33 29 3b 0a 20 20 20 20 20 20 49  , 2, 3);.      I
36e0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 65 6d 70 2e  NSERT INTO temp.
36f0: 74 34 20 56 41 4c 55 45 53 28 34 2c 20 35 2c 20  t4 VALUES(4, 5, 
3700: 36 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  6);.      INSERT
3710: 20 49 4e 54 4f 20 61 75 78 2e 74 34 20 20 56 41   INTO aux.t4  VA
3720: 4c 55 45 53 28 37 2c 20 38 2c 20 39 29 3b 0a 20  LUES(7, 8, 9);. 
3730: 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f     }.  } {}.  do
3740: 5f 74 65 73 74 20 74 72 69 67 67 65 72 31 2d 31  _test trigger1-1
3750: 30 2e 34 20 7b 0a 20 20 20 20 65 78 65 63 73 71  0.4 {.    execsq
3760: 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  l {.      SELECT
3770: 20 2a 20 46 52 4f 4d 20 69 6e 73 65 72 74 5f 6c   * FROM insert_l
3780: 6f 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 6d  og;.    }.  } {m
3790: 61 69 6e 20 31 20 32 20 33 20 74 65 6d 70 20 34  ain 1 2 3 temp 4
37a0: 20 35 20 36 20 61 75 78 20 37 20 38 20 39 7d 0a   5 6 aux 7 8 9}.
37b0: 20 20 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65    do_test trigge
37c0: 72 31 2d 31 30 2e 35 20 7b 0a 20 20 20 20 65 78  r1-10.5 {.    ex
37d0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 42 45  ecsql {.      BE
37e0: 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  GIN;.      INSER
37f0: 54 20 49 4e 54 4f 20 6d 61 69 6e 2e 74 34 20 56  T INTO main.t4 V
3800: 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 3b 0a  ALUES(1, 2, 3);.
3810: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
3820: 4f 20 74 65 6d 70 2e 74 34 20 56 41 4c 55 45 53  O temp.t4 VALUES
3830: 28 34 2c 20 35 2c 20 36 29 3b 0a 20 20 20 20 20  (4, 5, 6);.     
3840: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 75 78   INSERT INTO aux
3850: 2e 74 34 20 20 56 41 4c 55 45 53 28 37 2c 20 38  .t4  VALUES(7, 8
3860: 2c 20 39 29 3b 0a 20 20 20 20 20 20 52 4f 4c 4c  , 9);.      ROLL
3870: 42 41 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  BACK;.    }.  } 
3880: 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 74 72 69  {}.  do_test tri
3890: 67 67 65 72 31 2d 31 30 2e 36 20 7b 0a 20 20 20  gger1-10.6 {.   
38a0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
38b0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 69   SELECT * FROM i
38c0: 6e 73 65 72 74 5f 6c 6f 67 3b 0a 20 20 20 20 7d  nsert_log;.    }
38d0: 0a 20 20 7d 20 7b 6d 61 69 6e 20 31 20 32 20 33  .  } {main 1 2 3
38e0: 20 74 65 6d 70 20 34 20 35 20 36 20 61 75 78 20   temp 4 5 6 aux 
38f0: 37 20 38 20 39 7d 0a 20 20 64 6f 5f 74 65 73 74  7 8 9}.  do_test
3900: 20 74 72 69 67 67 65 72 31 2d 31 30 2e 37 20 7b   trigger1-10.7 {
3910: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
3920: 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d       DELETE FROM
3930: 20 69 6e 73 65 72 74 5f 6c 6f 67 3b 0a 20 20 20   insert_log;.   
3940: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6d     INSERT INTO m
3950: 61 69 6e 2e 74 34 20 56 41 4c 55 45 53 28 31 31  ain.t4 VALUES(11
3960: 2c 20 31 32 2c 20 31 33 29 3b 0a 20 20 20 20 20  , 12, 13);.     
3970: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 65 6d   INSERT INTO tem
3980: 70 2e 74 34 20 56 41 4c 55 45 53 28 31 34 2c 20  p.t4 VALUES(14, 
3990: 31 35 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 49  15, 16);.      I
39a0: 4e 53 45 52 54 20 49 4e 54 4f 20 61 75 78 2e 74  NSERT INTO aux.t
39b0: 34 20 20 56 41 4c 55 45 53 28 31 37 2c 20 31 38  4  VALUES(17, 18
39c0: 2c 20 31 39 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  , 19);.    }.  }
39d0: 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 74 72   {}.  do_test tr
39e0: 69 67 67 65 72 31 2d 31 30 2e 38 20 7b 0a 20 20  igger1-10.8 {.  
39f0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
3a00: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
3a10: 69 6e 73 65 72 74 5f 6c 6f 67 3b 0a 20 20 20 20  insert_log;.    
3a20: 7d 0a 20 20 7d 20 7b 6d 61 69 6e 20 31 31 20 31  }.  } {main 11 1
3a30: 32 20 31 33 20 74 65 6d 70 20 31 34 20 31 35 20  2 13 temp 14 15 
3a40: 31 36 20 61 75 78 20 31 37 20 31 38 20 31 39 7d  16 aux 17 18 19}
3a50: 0a 20 20 64 6f 5f 74 65 73 74 20 74 72 69 67 67  .  do_test trigg
3a60: 65 72 31 2d 31 30 2e 38 20 7b 0a 20 20 23 20 44  er1-10.8 {.  # D
3a70: 72 6f 70 20 61 6e 64 20 72 65 2d 63 72 65 61 74  rop and re-creat
3a80: 65 20 74 68 65 20 69 6e 73 65 72 74 5f 6c 6f 67  e the insert_log
3a90: 20 74 61 62 6c 65 20 69 6e 20 61 20 64 69 66 66   table in a diff
3aa0: 65 72 65 6e 74 20 64 61 74 61 62 61 73 65 2e 20  erent database. 
3ab0: 4e 6f 74 65 0a 20 20 23 20 74 68 61 74 20 77 65  Note.  # that we
3ac0: 20 63 61 6e 20 63 68 61 6e 67 65 20 74 68 65 20   can change the 
3ad0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 62 65 63  column names bec
3ae0: 61 75 73 65 20 74 68 65 20 74 72 69 67 67 65 72  ause the trigger
3af0: 20 70 72 6f 67 72 61 6d 73 20 64 6f 6e 27 74 0a   programs don't.
3b00: 20 20 23 20 75 73 65 20 74 68 65 6d 20 65 78 70    # use them exp
3b10: 6c 69 63 69 74 6c 79 2e 0a 20 20 20 20 65 78 65  licitly..    exe
3b20: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 44 52 4f  csql {.      DRO
3b30: 50 20 54 41 42 4c 45 20 69 6e 73 65 72 74 5f 6c  P TABLE insert_l
3b40: 6f 67 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45  og;.      CREATE
3b50: 20 54 41 42 4c 45 20 61 75 78 2e 69 6e 73 65 72   TABLE aux.inser
3b60: 74 5f 6c 6f 67 28 64 62 2c 20 64 2c 20 65 2c 20  t_log(db, d, e, 
3b70: 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d  f);.    }.  } {}
3b80: 0a 20 20 64 6f 5f 74 65 73 74 20 74 72 69 67 67  .  do_test trigg
3b90: 65 72 31 2d 31 30 2e 31 30 20 7b 0a 20 20 20 20  er1-10.10 {.    
3ba0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
3bb0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 6d 61 69 6e  INSERT INTO main
3bc0: 2e 74 34 20 56 41 4c 55 45 53 28 32 31 2c 20 32  .t4 VALUES(21, 2
3bd0: 32 2c 20 32 33 29 3b 0a 20 20 20 20 20 20 49 4e  2, 23);.      IN
3be0: 53 45 52 54 20 49 4e 54 4f 20 74 65 6d 70 2e 74  SERT INTO temp.t
3bf0: 34 20 56 41 4c 55 45 53 28 32 34 2c 20 32 35 2c  4 VALUES(24, 25,
3c00: 20 32 36 29 3b 0a 20 20 20 20 20 20 49 4e 53 45   26);.      INSE
3c10: 52 54 20 49 4e 54 4f 20 61 75 78 2e 74 34 20 20  RT INTO aux.t4  
3c20: 56 41 4c 55 45 53 28 32 37 2c 20 32 38 2c 20 32  VALUES(27, 28, 2
3c30: 39 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d  9);.    }.  } {}
3c40: 0a 20 20 64 6f 5f 74 65 73 74 20 74 72 69 67 67  .  do_test trigg
3c50: 65 72 31 2d 31 30 2e 31 31 20 7b 0a 20 20 20 20  er1-10.11 {.    
3c60: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
3c70: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 69 6e  SELECT * FROM in
3c80: 73 65 72 74 5f 6c 6f 67 3b 0a 20 20 20 20 7d 0a  sert_log;.    }.
3c90: 20 20 7d 20 7b 6d 61 69 6e 20 32 31 20 32 32 20    } {main 21 22 
3ca0: 32 33 20 74 65 6d 70 20 32 34 20 32 35 20 32 36  23 temp 24 25 26
3cb0: 20 61 75 78 20 32 37 20 32 38 20 32 39 7d 0a 7d   aux 27 28 29}.}
3cc0: 0a 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65  ..do_test trigge
3cd0: 72 31 2d 31 31 2e 31 20 7b 0a 20 20 63 61 74 63  r1-11.1 {.  catc
3ce0: 68 73 71 6c 20 7b 53 45 4c 45 43 54 20 72 61 69  hsql {SELECT rai
3cf0: 73 65 28 61 62 6f 72 74 2c 27 6d 65 73 73 61 67  se(abort,'messag
3d00: 65 27 29 3b 7d 0a 7d 20 7b 31 20 7b 52 41 49 53  e');}.} {1 {RAIS
3d10: 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  E() may only be 
3d20: 75 73 65 64 20 77 69 74 68 69 6e 20 61 20 74 72  used within a tr
3d30: 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 7d 7d 0a  igger-program}}.
3d40: 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a        ..finish_test.