/ Hex Artifact Content
Login

Artifact 38524d80ac26c232d23ecec4b037eb60fb67eedd:


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 20 20 20 20 20 20 20 20 43 52 45 41 54   {.        CREAT
0800: 45 20 54 52 49 47 47 45 52 20 74 72 31 20 49 4e  E TRIGGER tr1 IN
0810: 53 45 52 54 20 4f 4e 20 74 31 20 42 45 47 49 4e  SERT ON t1 BEGIN
0820: 0a 20 20 20 20 20 20 20 20 20 20 49 4e 53 45 52  .          INSER
0830: 54 20 49 4e 54 4f 20 74 31 20 76 61 6c 75 65 73  T INTO t1 values
0840: 28 31 29 3b 0a 20 20 20 20 20 20 20 20 20 45 4e  (1);.         EN
0850: 44 3b 0a 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69  D;.}.do_test tri
0860: 67 67 65 72 31 2d 31 2e 32 2e 30 20 7b 0a 20 20  gger1-1.2.0 {.  
0870: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
0880: 20 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47       CREATE TRIG
0890: 47 45 52 20 49 46 20 4e 4f 54 20 45 58 49 53 54  GER IF NOT EXIST
08a0: 53 20 74 72 31 20 44 45 4c 45 54 45 20 4f 4e 20  S tr1 DELETE ON 
08b0: 74 31 20 42 45 47 49 4e 0a 20 20 20 20 20 20 20  t1 BEGIN.       
08c0: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
08d0: 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
08e0: 3b 0a 20 20 20 20 20 20 20 20 20 45 4e 44 0a 20  ;.         END. 
08f0: 20 20 20 20 7d 0a 7d 20 7b 30 20 7b 7d 7d 0a 64      }.} {0 {}}.d
0900: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 31 2d  o_test trigger1-
0910: 31 2e 32 2e 31 20 7b 0a 20 20 20 20 63 61 74 63  1.2.1 {.    catc
0920: 68 73 71 6c 20 7b 0a 20 20 20 20 20 20 20 20 43  hsql {.        C
0930: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74 72  REATE TRIGGER tr
0940: 31 20 44 45 4c 45 54 45 20 4f 4e 20 74 31 20 42  1 DELETE ON t1 B
0950: 45 47 49 4e 0a 20 20 20 20 20 20 20 20 20 20 20  EGIN.           
0960: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73   SELECT * FROM s
0970: 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20  qlite_master;.  
0980: 20 20 20 20 20 20 20 45 4e 44 0a 20 20 20 20 20         END.     
0990: 7d 0a 7d 20 7b 31 20 7b 74 72 69 67 67 65 72 20  }.} {1 {trigger 
09a0: 74 72 31 20 61 6c 72 65 61 64 79 20 65 78 69 73  tr1 already exis
09b0: 74 73 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69  ts}}.do_test tri
09c0: 67 67 65 72 31 2d 31 2e 32 2e 32 20 7b 0a 20 20  gger1-1.2.2 {.  
09d0: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
09e0: 20 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47       CREATE TRIG
09f0: 47 45 52 20 22 74 72 31 22 20 44 45 4c 45 54 45  GER "tr1" DELETE
0a00: 20 4f 4e 20 74 31 20 42 45 47 49 4e 0a 20 20 20   ON t1 BEGIN.   
0a10: 20 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20           SELECT 
0a20: 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  * FROM sqlite_ma
0a30: 73 74 65 72 3b 0a 20 20 20 20 20 20 20 20 20 45  ster;.         E
0a40: 4e 44 0a 20 20 20 20 20 7d 0a 7d 20 7b 31 20 7b  ND.     }.} {1 {
0a50: 74 72 69 67 67 65 72 20 22 74 72 31 22 20 61 6c  trigger "tr1" al
0a60: 72 65 61 64 79 20 65 78 69 73 74 73 7d 7d 0a 64  ready exists}}.d
0a70: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 31 2d  o_test trigger1-
0a80: 31 2e 32 2e 33 20 7b 0a 20 20 20 20 63 61 74 63  1.2.3 {.    catc
0a90: 68 73 71 6c 20 7b 0a 20 20 20 20 20 20 20 20 43  hsql {.        C
0aa0: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 5b 74  REATE TRIGGER [t
0ab0: 72 31 5d 20 44 45 4c 45 54 45 20 4f 4e 20 74 31  r1] DELETE ON t1
0ac0: 20 42 45 47 49 4e 0a 20 20 20 20 20 20 20 20 20   BEGIN.         
0ad0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
0ae0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a   sqlite_master;.
0af0: 20 20 20 20 20 20 20 20 20 45 4e 44 0a 20 20 20           END.   
0b00: 20 20 7d 0a 7d 20 7b 31 20 7b 74 72 69 67 67 65    }.} {1 {trigge
0b10: 72 20 5b 74 72 31 5d 20 61 6c 72 65 61 64 79 20  r [tr1] already 
0b20: 65 78 69 73 74 73 7d 7d 0a 0a 64 6f 5f 74 65 73  exists}}..do_tes
0b30: 74 20 74 72 69 67 67 65 72 31 2d 31 2e 33 20 7b  t trigger1-1.3 {
0b40: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 0a  .    catchsql {.
0b50: 20 20 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20          BEGIN;. 
0b60: 20 20 20 20 20 20 20 43 52 45 41 54 45 20 54 52         CREATE TR
0b70: 49 47 47 45 52 20 74 72 32 20 49 4e 53 45 52 54  IGGER tr2 INSERT
0b80: 20 4f 4e 20 74 31 20 42 45 47 49 4e 0a 20 20 20   ON t1 BEGIN.   
0b90: 20 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20           SELECT 
0ba0: 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61  * from sqlite_ma
0bb0: 73 74 65 72 3b 20 45 4e 44 3b 0a 20 20 20 20 20  ster; END;.     
0bc0: 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20     ROLLBACK;.   
0bd0: 20 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47       CREATE TRIG
0be0: 47 45 52 20 74 72 32 20 49 4e 53 45 52 54 20 4f  GER tr2 INSERT O
0bf0: 4e 20 74 31 20 42 45 47 49 4e 0a 20 20 20 20 20  N t1 BEGIN.     
0c00: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20         SELECT * 
0c10: 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74  from sqlite_mast
0c20: 65 72 3b 20 45 4e 44 3b 0a 20 20 20 20 7d 0a 7d  er; END;.    }.}
0c30: 20 7b 30 20 7b 7d 7d 0a 0a 64 6f 5f 74 65 73 74   {0 {}}..do_test
0c40: 20 74 72 69 67 67 65 72 31 2d 31 2e 34 20 7b 0a   trigger1-1.4 {.
0c50: 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20      catchsql {. 
0c60: 20 20 20 20 20 20 20 44 52 4f 50 20 54 52 49 47         DROP TRIG
0c70: 47 45 52 20 49 46 20 45 58 49 53 54 53 20 74 72  GER IF EXISTS tr
0c80: 31 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41 54  1;.        CREAT
0c90: 45 20 54 52 49 47 47 45 52 20 74 72 31 20 44 45  E TRIGGER tr1 DE
0ca0: 4c 45 54 45 20 4f 4e 20 74 31 20 42 45 47 49 4e  LETE ON t1 BEGIN
0cb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 45 4c  .            SEL
0cc0: 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74  ECT * FROM sqlit
0cd0: 65 5f 6d 61 73 74 65 72 3b 0a 20 20 20 20 20 20  e_master;.      
0ce0: 20 20 45 4e 44 0a 20 20 20 20 7d 0a 7d 20 7b 30    END.    }.} {0
0cf0: 20 7b 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20 74 72   {}}..do_test tr
0d00: 69 67 67 65 72 31 2d 31 2e 35 20 7b 0a 20 20 20  igger1-1.5 {.   
0d10: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
0d20: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
0d30: 20 20 44 52 4f 50 20 54 52 49 47 47 45 52 20 74    DROP TRIGGER t
0d40: 72 32 3b 0a 20 20 20 20 20 20 20 20 52 4f 4c 4c  r2;.        ROLL
0d50: 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 44 52  BACK;.        DR
0d60: 4f 50 20 54 52 49 47 47 45 52 20 74 72 32 3b 0a  OP TRIGGER tr2;.
0d70: 20 20 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74      }.} {}..do_t
0d80: 65 73 74 20 74 72 69 67 67 65 72 31 2d 31 2e 36  est trigger1-1.6
0d90: 2e 31 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71  .1 {.    catchsq
0da0: 6c 20 7b 0a 20 20 20 20 20 20 20 20 44 52 4f 50  l {.        DROP
0db0: 20 54 52 49 47 47 45 52 20 49 46 20 45 58 49 53   TRIGGER IF EXIS
0dc0: 54 53 20 62 69 67 67 6c 65 73 3b 0a 20 20 20 20  TS biggles;.    
0dd0: 7d 0a 7d 20 7b 30 20 7b 7d 7d 0a 0a 64 6f 5f 74  }.} {0 {}}..do_t
0de0: 65 73 74 20 74 72 69 67 67 65 72 31 2d 31 2e 36  est trigger1-1.6
0df0: 2e 32 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71  .2 {.    catchsq
0e00: 6c 20 7b 0a 20 20 20 20 20 20 20 20 44 52 4f 50  l {.        DROP
0e10: 20 54 52 49 47 47 45 52 20 62 69 67 67 6c 65 73   TRIGGER biggles
0e20: 3b 0a 20 20 20 20 7d 0a 7d 20 7b 31 20 7b 6e 6f  ;.    }.} {1 {no
0e30: 20 73 75 63 68 20 74 72 69 67 67 65 72 3a 20 62   such trigger: b
0e40: 69 67 67 6c 65 73 7d 7d 0a 0a 64 6f 5f 74 65 73  iggles}}..do_tes
0e50: 74 20 74 72 69 67 67 65 72 31 2d 31 2e 37 20 7b  t trigger1-1.7 {
0e60: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 0a  .    catchsql {.
0e70: 20 20 20 20 20 20 20 20 44 52 4f 50 20 54 41 42          DROP TAB
0e80: 4c 45 20 74 31 3b 0a 20 20 20 20 20 20 20 20 44  LE t1;.        D
0e90: 52 4f 50 20 54 52 49 47 47 45 52 20 74 72 31 3b  ROP TRIGGER tr1;
0ea0: 0a 20 20 20 20 7d 0a 7d 20 7b 31 20 7b 6e 6f 20  .    }.} {1 {no 
0eb0: 73 75 63 68 20 74 72 69 67 67 65 72 3a 20 74 72  such trigger: tr
0ec0: 31 7d 7d 0a 0a 69 66 63 61 70 61 62 6c 65 20 74  1}}..ifcapable t
0ed0: 65 6d 70 64 62 20 7b 0a 20 20 65 78 65 63 73 71  empdb {.  execsq
0ee0: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
0ef0: 45 4d 50 20 54 41 42 4c 45 20 74 65 6d 70 5f 74  EMP TABLE temp_t
0f00: 61 62 6c 65 28 61 29 3b 0a 20 20 7d 0a 20 20 64  able(a);.  }.  d
0f10: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 31 2d  o_test trigger1-
0f20: 31 2e 38 20 7b 0a 20 20 20 20 65 78 65 63 73 71  1.8 {.    execsq
0f30: 6c 20 7b 0a 20 20 20 20 20 20 20 20 20 20 43 52  l {.          CR
0f40: 45 41 54 45 20 54 52 49 47 47 45 52 20 74 65 6d  EATE TRIGGER tem
0f50: 70 5f 74 72 69 67 20 55 50 44 41 54 45 20 4f 4e  p_trig UPDATE ON
0f60: 20 74 65 6d 70 5f 74 61 62 6c 65 20 42 45 47 49   temp_table BEGI
0f70: 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N.              
0f80: 53 45 4c 45 43 54 20 2a 20 66 72 6f 6d 20 73 71  SELECT * from sq
0f90: 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 20  lite_master;.   
0fa0: 20 20 20 20 20 20 20 45 4e 44 3b 0a 20 20 20 20         END;.    
0fb0: 20 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75        SELECT cou
0fc0: 6e 74 28 2a 29 20 46 52 4f 4d 20 73 71 6c 69 74  nt(*) FROM sqlit
0fd0: 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20 6e  e_master WHERE n
0fe0: 61 6d 65 20 3d 20 27 74 65 6d 70 5f 74 72 69 67  ame = 'temp_trig
0ff0: 27 3b 0a 20 20 20 20 7d 20 0a 20 20 7d 20 7b 30  ';.    } .  } {0
1000: 7d 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 74 72 69  }.}..do_test tri
1010: 67 67 65 72 31 2d 31 2e 39 20 7b 0a 20 20 63 61  gger1-1.9 {.  ca
1020: 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  tchsql {.    CRE
1030: 41 54 45 20 54 52 49 47 47 45 52 20 74 72 31 20  ATE TRIGGER tr1 
1040: 41 46 54 45 52 20 55 50 44 41 54 45 20 4f 4e 20  AFTER UPDATE ON 
1050: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 42 45  sqlite_master BE
1060: 47 49 4e 0a 20 20 20 20 20 20 20 53 45 4c 45 43  GIN.       SELEC
1070: 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  T * FROM sqlite_
1080: 6d 61 73 74 65 72 3b 0a 20 20 20 20 45 4e 44 3b  master;.    END;
1090: 0a 20 20 7d 0a 7d 20 7b 31 20 7b 63 61 6e 6e 6f  .  }.} {1 {canno
10a0: 74 20 63 72 65 61 74 65 20 74 72 69 67 67 65 72  t create trigger
10b0: 20 6f 6e 20 73 79 73 74 65 6d 20 74 61 62 6c 65   on system table
10c0: 7d 7d 0a 0a 23 20 43 68 65 63 6b 20 74 6f 20 6d  }}..# Check to m
10d0: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 61 20  ake sure that a 
10e0: 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
10f0: 20 77 69 74 68 69 6e 20 74 68 65 20 62 6f 64 79   within the body
1100: 20 6f 66 0a 23 20 61 20 74 72 69 67 67 65 72 20   of.# a trigger 
1110: 64 6f 65 73 20 6e 6f 74 20 6d 65 73 73 20 75 70  does not mess up
1120: 20 74 68 65 20 44 45 4c 45 54 45 20 74 68 61 74   the DELETE that
1130: 20 63 61 75 73 65 64 20 74 68 65 20 74 72 69 67   caused the trig
1140: 67 65 72 20 74 6f 0a 23 20 72 75 6e 20 69 6e 20  ger to.# run in 
1150: 74 68 65 20 66 69 72 73 74 20 70 6c 61 63 65 2e  the first place.
1160: 0a 23 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67  .#.do_test trigg
1170: 65 72 31 2d 31 2e 31 30 20 7b 0a 20 20 65 78 65  er1-1.10 {.  exe
1180: 63 73 71 6c 20 7b 0a 20 20 20 20 63 72 65 61 74  csql {.    creat
1190: 65 20 74 61 62 6c 65 20 74 31 28 61 2c 62 29 3b  e table t1(a,b);
11a0: 0a 20 20 20 20 69 6e 73 65 72 74 20 69 6e 74 6f  .    insert into
11b0: 20 74 31 20 76 61 6c 75 65 73 28 31 2c 27 61 27   t1 values(1,'a'
11c0: 29 3b 0a 20 20 20 20 69 6e 73 65 72 74 20 69 6e  );.    insert in
11d0: 74 6f 20 74 31 20 76 61 6c 75 65 73 28 32 2c 27  to t1 values(2,'
11e0: 62 27 29 3b 0a 20 20 20 20 69 6e 73 65 72 74 20  b');.    insert 
11f0: 69 6e 74 6f 20 74 31 20 76 61 6c 75 65 73 28 33  into t1 values(3
1200: 2c 27 63 27 29 3b 0a 20 20 20 20 69 6e 73 65 72  ,'c');.    inser
1210: 74 20 69 6e 74 6f 20 74 31 20 76 61 6c 75 65 73  t into t1 values
1220: 28 34 2c 27 64 27 29 3b 0a 20 20 20 20 63 72 65  (4,'d');.    cre
1230: 61 74 65 20 74 72 69 67 67 65 72 20 72 31 20 61  ate trigger r1 a
1240: 66 74 65 72 20 64 65 6c 65 74 65 20 6f 6e 20 74  fter delete on t
1250: 31 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 62  1 for each row b
1260: 65 67 69 6e 0a 20 20 20 20 20 20 64 65 6c 65 74  egin.      delet
1270: 65 20 66 72 6f 6d 20 74 31 20 57 48 45 52 45 20  e from t1 WHERE 
1280: 61 3d 6f 6c 64 2e 61 2b 32 3b 0a 20 20 20 20 65  a=old.a+2;.    e
1290: 6e 64 3b 0a 20 20 20 20 64 65 6c 65 74 65 20 66  nd;.    delete f
12a0: 72 6f 6d 20 74 31 20 77 68 65 72 65 20 61 3d 31  rom t1 where a=1
12b0: 20 4f 52 20 61 3d 33 3b 0a 20 20 20 20 73 65 6c   OR a=3;.    sel
12c0: 65 63 74 20 2a 20 66 72 6f 6d 20 74 31 3b 0a 20  ect * from t1;. 
12d0: 20 20 20 64 72 6f 70 20 74 61 62 6c 65 20 74 31     drop table t1
12e0: 3b 0a 20 20 7d 0a 7d 20 7b 32 20 62 20 34 20 64  ;.  }.} {2 b 4 d
12f0: 7d 0a 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67  }..do_test trigg
1300: 65 72 31 2d 31 2e 31 31 20 7b 0a 20 20 65 78 65  er1-1.11 {.  exe
1310: 63 73 71 6c 20 7b 0a 20 20 20 20 63 72 65 61 74  csql {.    creat
1320: 65 20 74 61 62 6c 65 20 74 31 28 61 2c 62 29 3b  e table t1(a,b);
1330: 0a 20 20 20 20 69 6e 73 65 72 74 20 69 6e 74 6f  .    insert into
1340: 20 74 31 20 76 61 6c 75 65 73 28 31 2c 27 61 27   t1 values(1,'a'
1350: 29 3b 0a 20 20 20 20 69 6e 73 65 72 74 20 69 6e  );.    insert in
1360: 74 6f 20 74 31 20 76 61 6c 75 65 73 28 32 2c 27  to t1 values(2,'
1370: 62 27 29 3b 0a 20 20 20 20 69 6e 73 65 72 74 20  b');.    insert 
1380: 69 6e 74 6f 20 74 31 20 76 61 6c 75 65 73 28 33  into t1 values(3
1390: 2c 27 63 27 29 3b 0a 20 20 20 20 69 6e 73 65 72  ,'c');.    inser
13a0: 74 20 69 6e 74 6f 20 74 31 20 76 61 6c 75 65 73  t into t1 values
13b0: 28 34 2c 27 64 27 29 3b 0a 20 20 20 20 63 72 65  (4,'d');.    cre
13c0: 61 74 65 20 74 72 69 67 67 65 72 20 72 31 20 61  ate trigger r1 a
13d0: 66 74 65 72 20 75 70 64 61 74 65 20 6f 6e 20 74  fter update on t
13e0: 31 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 62  1 for each row b
13f0: 65 67 69 6e 0a 20 20 20 20 20 20 64 65 6c 65 74  egin.      delet
1400: 65 20 66 72 6f 6d 20 74 31 20 57 48 45 52 45 20  e from t1 WHERE 
1410: 61 3d 6f 6c 64 2e 61 2b 32 3b 0a 20 20 20 20 65  a=old.a+2;.    e
1420: 6e 64 3b 0a 20 20 20 20 75 70 64 61 74 65 20 74  nd;.    update t
1430: 31 20 73 65 74 20 62 3d 27 78 2d 27 20 7c 7c 20  1 set b='x-' || 
1440: 62 20 77 68 65 72 65 20 61 3d 31 20 4f 52 20 61  b where a=1 OR a
1450: 3d 33 3b 0a 20 20 20 20 73 65 6c 65 63 74 20 2a  =3;.    select *
1460: 20 66 72 6f 6d 20 74 31 3b 0a 20 20 20 20 64 72   from t1;.    dr
1470: 6f 70 20 74 61 62 6c 65 20 74 31 3b 0a 20 20 7d  op table t1;.  }
1480: 0a 7d 20 7b 31 20 78 2d 61 20 32 20 62 20 34 20  .} {1 x-a 2 b 4 
1490: 64 7d 0a 0a 23 20 45 6e 73 75 72 65 20 74 68 61  d}..# Ensure tha
14a0: 74 20 77 65 20 63 61 6e 6e 6f 74 20 63 72 65 61  t we cannot crea
14b0: 74 65 20 49 4e 53 54 45 41 44 20 4f 46 20 74 72  te INSTEAD OF tr
14c0: 69 67 67 65 72 73 20 6f 6e 20 74 61 62 6c 65 73  iggers on tables
14d0: 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72  .do_test trigger
14e0: 31 2d 31 2e 31 32 20 7b 0a 20 20 63 61 74 63 68  1-1.12 {.  catch
14f0: 73 71 6c 20 7b 0a 20 20 20 20 63 72 65 61 74 65  sql {.    create
1500: 20 74 61 62 6c 65 20 74 31 28 61 2c 62 29 3b 0a   table t1(a,b);.
1510: 20 20 20 20 63 72 65 61 74 65 20 74 72 69 67 67      create trigg
1520: 65 72 20 74 31 74 20 69 6e 73 74 65 61 64 20 6f  er t1t instead o
1530: 66 20 75 70 64 61 74 65 20 6f 6e 20 74 31 20 66  f update on t1 f
1540: 6f 72 20 65 61 63 68 20 72 6f 77 20 62 65 67 69  or each row begi
1550: 6e 0a 20 20 20 20 20 20 64 65 6c 65 74 65 20 66  n.      delete f
1560: 72 6f 6d 20 74 31 20 57 48 45 52 45 20 61 3d 6f  rom t1 WHERE a=o
1570: 6c 64 2e 61 2b 32 3b 0a 20 20 20 20 65 6e 64 3b  ld.a+2;.    end;
1580: 0a 20 20 7d 0a 7d 20 7b 31 20 7b 63 61 6e 6e 6f  .  }.} {1 {canno
1590: 74 20 63 72 65 61 74 65 20 49 4e 53 54 45 41 44  t create INSTEAD
15a0: 20 4f 46 20 74 72 69 67 67 65 72 20 6f 6e 20 74   OF trigger on t
15b0: 61 62 6c 65 3a 20 6d 61 69 6e 2e 74 31 7d 7d 0a  able: main.t1}}.
15c0: 0a 69 66 63 61 70 61 62 6c 65 20 76 69 65 77 20  .ifcapable view 
15d0: 7b 0a 23 20 45 6e 73 75 72 65 20 74 68 61 74 20  {.# Ensure that 
15e0: 77 65 20 63 61 6e 6e 6f 74 20 63 72 65 61 74 65  we cannot create
15f0: 20 42 45 46 4f 52 45 20 74 72 69 67 67 65 72 73   BEFORE triggers
1600: 20 6f 6e 20 76 69 65 77 73 0a 64 6f 5f 74 65 73   on views.do_tes
1610: 74 20 74 72 69 67 67 65 72 31 2d 31 2e 31 33 20  t trigger1-1.13 
1620: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20  {.  catchsql {. 
1630: 20 20 20 63 72 65 61 74 65 20 76 69 65 77 20 76     create view v
1640: 31 20 61 73 20 73 65 6c 65 63 74 20 2a 20 66 72  1 as select * fr
1650: 6f 6d 20 74 31 3b 0a 20 20 20 20 63 72 65 61 74  om t1;.    creat
1660: 65 20 74 72 69 67 67 65 72 20 76 31 74 20 62 65  e trigger v1t be
1670: 66 6f 72 65 20 75 70 64 61 74 65 20 6f 6e 20 76  fore update on v
1680: 31 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 62  1 for each row b
1690: 65 67 69 6e 0a 20 20 20 20 20 20 64 65 6c 65 74  egin.      delet
16a0: 65 20 66 72 6f 6d 20 74 31 20 57 48 45 52 45 20  e from t1 WHERE 
16b0: 61 3d 6f 6c 64 2e 61 2b 32 3b 0a 20 20 20 20 65  a=old.a+2;.    e
16c0: 6e 64 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 63 61  nd;.  }.} {1 {ca
16d0: 6e 6e 6f 74 20 63 72 65 61 74 65 20 42 45 46 4f  nnot create BEFO
16e0: 52 45 20 74 72 69 67 67 65 72 20 6f 6e 20 76 69  RE trigger on vi
16f0: 65 77 3a 20 6d 61 69 6e 2e 76 31 7d 7d 0a 23 20  ew: main.v1}}.# 
1700: 45 6e 73 75 72 65 20 74 68 61 74 20 77 65 20 63  Ensure that we c
1710: 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 41 46 54  annot create AFT
1720: 45 52 20 74 72 69 67 67 65 72 73 20 6f 6e 20 76  ER triggers on v
1730: 69 65 77 73 0a 64 6f 5f 74 65 73 74 20 74 72 69  iews.do_test tri
1740: 67 67 65 72 31 2d 31 2e 31 34 20 7b 0a 20 20 63  gger1-1.14 {.  c
1750: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 64 72  atchsql {.    dr
1760: 6f 70 20 76 69 65 77 20 76 31 3b 0a 20 20 20 20  op view v1;.    
1770: 63 72 65 61 74 65 20 76 69 65 77 20 76 31 20 61  create view v1 a
1780: 73 20 73 65 6c 65 63 74 20 2a 20 66 72 6f 6d 20  s select * from 
1790: 74 31 3b 0a 20 20 20 20 63 72 65 61 74 65 20 74  t1;.    create t
17a0: 72 69 67 67 65 72 20 76 31 74 20 41 46 54 45 52  rigger v1t AFTER
17b0: 20 75 70 64 61 74 65 20 6f 6e 20 76 31 20 66 6f   update on v1 fo
17c0: 72 20 65 61 63 68 20 72 6f 77 20 62 65 67 69 6e  r each row begin
17d0: 0a 20 20 20 20 20 20 64 65 6c 65 74 65 20 66 72  .      delete fr
17e0: 6f 6d 20 74 31 20 57 48 45 52 45 20 61 3d 6f 6c  om t1 WHERE a=ol
17f0: 64 2e 61 2b 32 3b 0a 20 20 20 20 65 6e 64 3b 0a  d.a+2;.    end;.
1800: 20 20 7d 0a 7d 20 7b 31 20 7b 63 61 6e 6e 6f 74    }.} {1 {cannot
1810: 20 63 72 65 61 74 65 20 41 46 54 45 52 20 74 72   create AFTER tr
1820: 69 67 67 65 72 20 6f 6e 20 76 69 65 77 3a 20 6d  igger on view: m
1830: 61 69 6e 2e 76 31 7d 7d 0a 7d 20 3b 23 20 69 66  ain.v1}}.} ;# if
1840: 63 61 70 61 62 6c 65 20 76 69 65 77 0a 0a 23 20  capable view..# 
1850: 43 68 65 63 6b 20 66 6f 72 20 6d 65 6d 6f 72 79  Check for memory
1860: 20 6c 65 61 6b 73 20 69 6e 20 74 68 65 20 74 72   leaks in the tr
1870: 69 67 67 65 72 20 70 61 72 73 65 72 0a 23 0a 64  igger parser.#.d
1880: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 31 2d  o_test trigger1-
1890: 32 2e 31 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  2.1 {.  catchsql
18a0: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 52   {.    CREATE TR
18b0: 49 47 47 45 52 20 72 31 20 41 46 54 45 52 20 49  IGGER r1 AFTER I
18c0: 4e 53 45 52 54 20 4f 4e 20 74 31 20 42 45 47 49  NSERT ON t1 BEGI
18d0: 4e 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  N.      SELECT *
18e0: 20 46 52 4f 4d 3b 20 20 2d 2d 20 53 79 6e 74 61   FROM;  -- Synta
18f0: 78 20 65 72 72 6f 72 0a 20 20 20 20 45 4e 44 3b  x error.    END;
1900: 0a 20 20 7d 0a 7d 20 7b 31 20 7b 6e 65 61 72 20  .  }.} {1 {near 
1910: 22 3b 22 3a 20 73 79 6e 74 61 78 20 65 72 72 6f  ";": syntax erro
1920: 72 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67  r}}.do_test trig
1930: 67 65 72 31 2d 32 2e 32 20 7b 0a 20 20 63 61 74  ger1-2.2 {.  cat
1940: 63 68 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  chsql {.    CREA
1950: 54 45 20 54 52 49 47 47 45 52 20 72 31 20 41 46  TE TRIGGER r1 AF
1960: 54 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 74 31  TER INSERT ON t1
1970: 20 42 45 47 49 4e 0a 20 20 20 20 20 20 53 45 4c   BEGIN.      SEL
1980: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20  ECT * FROM t1;. 
1990: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
19a0: 4f 4d 3b 20 20 2d 2d 20 53 79 6e 74 61 78 20 65  OM;  -- Syntax e
19b0: 72 72 6f 72 0a 20 20 20 20 45 4e 44 3b 0a 20 20  rror.    END;.  
19c0: 7d 0a 7d 20 7b 31 20 7b 6e 65 61 72 20 22 3b 22  }.} {1 {near ";"
19d0: 3a 20 73 79 6e 74 61 78 20 65 72 72 6f 72 7d 7d  : syntax error}}
19e0: 0a 0a 23 20 43 72 65 61 74 65 20 61 20 74 72 69  ..# Create a tri
19f0: 67 67 65 72 20 74 68 61 74 20 72 65 66 65 72 73  gger that refers
1a00: 20 74 6f 20 61 20 74 61 62 6c 65 20 74 68 61 74   to a table that
1a10: 20 6d 69 67 68 74 20 6e 6f 74 20 65 78 69 73 74   might not exist
1a20: 2e 0a 23 0a 69 66 63 61 70 61 62 6c 65 20 74 65  ..#.ifcapable te
1a30: 6d 70 64 62 20 7b 0a 20 20 64 6f 5f 74 65 73 74  mpdb {.  do_test
1a40: 20 74 72 69 67 67 65 72 31 2d 33 2e 31 20 7b 0a   trigger1-3.1 {.
1a50: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
1a60: 20 20 20 20 43 52 45 41 54 45 20 54 45 4d 50 20      CREATE TEMP 
1a70: 54 41 42 4c 45 20 74 32 28 78 2c 79 29 3b 0a 20  TABLE t2(x,y);. 
1a80: 20 20 20 7d 0a 20 20 20 20 63 61 74 63 68 73 71     }.    catchsq
1a90: 6c 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54 45  l {.      CREATE
1aa0: 20 54 52 49 47 47 45 52 20 72 31 20 41 46 54 45   TRIGGER r1 AFTE
1ab0: 52 20 49 4e 53 45 52 54 20 4f 4e 20 74 31 20 42  R INSERT ON t1 B
1ac0: 45 47 49 4e 0a 20 20 20 20 20 20 20 20 49 4e 53  EGIN.        INS
1ad0: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
1ae0: 45 53 28 4e 45 57 2e 61 2c 4e 45 57 2e 62 29 3b  ES(NEW.a,NEW.b);
1af0: 0a 20 20 20 20 20 20 45 4e 44 3b 0a 20 20 20 20  .      END;.    
1b00: 7d 0a 20 20 7d 20 7b 30 20 7b 7d 7d 0a 20 20 64  }.  } {0 {}}.  d
1b10: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 2d 33  o_test trigger-3
1b20: 2e 32 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71  .2 {.    catchsq
1b30: 6c 20 7b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  l {.      INSERT
1b40: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
1b50: 31 2c 32 29 3b 0a 20 20 20 20 20 20 53 45 4c 45  1,2);.      SELE
1b60: 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20  CT * FROM t2;.  
1b70: 20 20 7d 0a 20 20 7d 20 7b 31 20 7b 6e 6f 20 73    }.  } {1 {no s
1b80: 75 63 68 20 74 61 62 6c 65 3a 20 6d 61 69 6e 2e  uch table: main.
1b90: 74 32 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 74  t2}}.  do_test t
1ba0: 72 69 67 67 65 72 2d 33 2e 33 20 7b 0a 20 20 20  rigger-3.3 {.   
1bb0: 20 64 62 20 63 6c 6f 73 65 0a 20 20 20 20 73 65   db close.    se
1bc0: 74 20 72 63 20 5b 63 61 74 63 68 20 7b 73 71 6c  t rc [catch {sql
1bd0: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 7d  ite3 db test.db}
1be0: 20 65 72 72 5d 0a 20 20 20 20 69 66 20 7b 24 72   err].    if {$r
1bf0: 63 7d 20 7b 6c 61 70 70 65 6e 64 20 72 63 20 24  c} {lappend rc $
1c00: 65 72 72 7d 0a 20 20 20 20 73 65 74 20 72 63 0a  err}.    set rc.
1c10: 20 20 7d 20 7b 30 7d 0a 20 20 64 6f 5f 74 65 73    } {0}.  do_tes
1c20: 74 20 74 72 69 67 67 65 72 2d 33 2e 34 20 7b 0a  t trigger-3.4 {.
1c30: 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20      catchsql {. 
1c40: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
1c50: 20 74 31 20 56 41 4c 55 45 53 28 31 2c 32 29 3b   t1 VALUES(1,2);
1c60: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .      SELECT * 
1c70: 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 7d 0a 20  FROM t2;.    }. 
1c80: 20 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20 74   } {1 {no such t
1c90: 61 62 6c 65 3a 20 6d 61 69 6e 2e 74 32 7d 7d 0a  able: main.t2}}.
1ca0: 20 20 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65    do_test trigge
1cb0: 72 2d 33 2e 35 20 7b 0a 20 20 20 20 63 61 74 63  r-3.5 {.    catc
1cc0: 68 73 71 6c 20 7b 0a 20 20 20 20 20 20 43 52 45  hsql {.      CRE
1cd0: 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 74  ATE TEMP TABLE t
1ce0: 32 28 78 2c 79 29 3b 0a 20 20 20 20 20 20 49 4e  2(x,y);.      IN
1cf0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
1d00: 55 45 53 28 31 2c 32 29 3b 0a 20 20 20 20 20 20  UES(1,2);.      
1d10: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
1d20: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20 7b  ;.    }.  } {1 {
1d30: 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 6d  no such table: m
1d40: 61 69 6e 2e 74 32 7d 7d 0a 20 20 64 6f 5f 74 65  ain.t2}}.  do_te
1d50: 73 74 20 74 72 69 67 67 65 72 2d 33 2e 36 2e 31  st trigger-3.6.1
1d60: 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20   {.    catchsql 
1d70: 7b 0a 20 20 20 20 20 20 44 52 4f 50 20 54 52 49  {.      DROP TRI
1d80: 47 47 45 52 20 72 31 3b 0a 20 20 20 20 20 20 43  GGER r1;.      C
1d90: 52 45 41 54 45 20 54 45 4d 50 20 54 52 49 47 47  REATE TEMP TRIGG
1da0: 45 52 20 72 31 20 41 46 54 45 52 20 49 4e 53 45  ER r1 AFTER INSE
1db0: 52 54 20 4f 4e 20 74 31 20 42 45 47 49 4e 0a 20  RT ON t1 BEGIN. 
1dc0: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
1dd0: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 4e 45 57  TO t2 VALUES(NEW
1de0: 2e 61 2c 4e 45 57 2e 62 29 2c 20 28 4e 45 57 2e  .a,NEW.b), (NEW.
1df0: 62 2a 31 30 30 2c 20 4e 45 57 2e 61 2a 31 30 30  b*100, NEW.a*100
1e00: 29 3b 0a 20 20 20 20 20 20 45 4e 44 3b 0a 20 20  );.      END;.  
1e10: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1e20: 74 31 20 56 41 4c 55 45 53 28 31 2c 32 29 3b 0a  t1 VALUES(1,2);.
1e30: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
1e40: 52 4f 4d 20 74 32 3b 0a 20 20 20 20 7d 0a 20 20  ROM t2;.    }.  
1e50: 7d 20 7b 30 20 7b 31 20 32 20 32 30 30 20 31 30  } {0 {1 2 200 10
1e60: 30 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 74 72  0}}.  do_test tr
1e70: 69 67 67 65 72 2d 33 2e 36 2e 32 20 7b 0a 20 20  igger-3.6.2 {.  
1e80: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
1e90: 20 20 20 44 52 4f 50 20 54 52 49 47 47 45 52 20     DROP TRIGGER 
1ea0: 72 31 3b 0a 20 20 20 20 20 20 44 45 4c 45 54 45  r1;.      DELETE
1eb0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20   FROM t1;.      
1ec0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 32 3b 0a  DELETE FROM t2;.
1ed0: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 45 4d        CREATE TEM
1ee0: 50 20 54 52 49 47 47 45 52 20 72 31 20 41 46 54  P TRIGGER r1 AFT
1ef0: 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 74 31 20  ER INSERT ON t1 
1f00: 42 45 47 49 4e 0a 20 20 20 20 20 20 20 20 49 4e  BEGIN.        IN
1f10: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
1f20: 55 45 53 28 4e 45 57 2e 61 2c 4e 45 57 2e 62 29  UES(NEW.a,NEW.b)
1f30: 3b 0a 20 20 20 20 20 20 45 4e 44 3b 0a 20 20 20  ;.      END;.   
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 31 2c 32 29 3b 0a 20  1 VALUES(1,2);. 
1f60: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
1f70: 4f 4d 20 74 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  OM t2;.    }.  }
1f80: 20 7b 30 20 7b 31 20 32 7d 7d 0a 20 20 64 6f 5f   {0 {1 2}}.  do_
1f90: 74 65 73 74 20 74 72 69 67 67 65 72 2d 33 2e 37  test trigger-3.7
1fa0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
1fb0: 0a 20 20 20 20 20 20 44 52 4f 50 20 54 41 42 4c  .      DROP TABL
1fc0: 45 20 74 32 3b 0a 20 20 20 20 20 20 43 52 45 41  E t2;.      CREA
1fd0: 54 45 20 54 41 42 4c 45 20 74 32 28 78 2c 79 29  TE TABLE t2(x,y)
1fe0: 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  ;.      SELECT *
1ff0: 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 7d 0a   FROM t2;.    }.
2000: 20 20 7d 20 7b 7d 0a 0a 20 20 23 20 54 68 65 72    } {}..  # Ther
2010: 65 20 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f  e are two versio
2020: 6e 73 20 6f 66 20 74 72 69 67 67 65 72 2d 33 2e  ns of trigger-3.
2030: 38 20 61 6e 64 20 74 72 69 67 67 65 72 2d 33 2e  8 and trigger-3.
2040: 39 2e 20 4f 6e 65 20 74 68 61 74 20 75 73 65 73  9. One that uses
2050: 0a 20 20 23 20 63 6f 6d 70 6f 75 6e 64 20 53 45  .  # compound SE
2060: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2c  LECT statements,
2070: 20 61 6e 64 20 61 6e 6f 74 68 65 72 20 74 68 61   and another tha
2080: 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 69 66  t does not..  if
2090: 63 61 70 61 62 6c 65 20 63 6f 6d 70 6f 75 6e 64  capable compound
20a0: 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 74 72 69   {.  do_test tri
20b0: 67 67 65 72 31 2d 33 2e 38 20 7b 0a 20 20 20 20  gger1-3.8 {.    
20c0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
20d0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
20e0: 41 4c 55 45 53 28 33 2c 34 29 3b 0a 20 20 20 20  ALUES(3,4);.    
20f0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
2100: 74 31 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c  t1 UNION ALL SEL
2110: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20  ECT * FROM t2;. 
2120: 20 20 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20     }.  } {1 2 3 
2130: 34 20 33 20 34 7d 0a 20 20 64 6f 5f 74 65 73 74  4 3 4}.  do_test
2140: 20 74 72 69 67 67 65 72 31 2d 33 2e 39 20 7b 0a   trigger1-3.9 {.
2150: 20 20 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 20      db close.   
2160: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
2170: 2e 64 62 0a 20 20 20 20 65 78 65 63 73 71 6c 20  .db.    execsql 
2180: 7b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  {.      INSERT I
2190: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 35 2c  NTO t1 VALUES(5,
21a0: 36 29 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  6);.      SELECT
21b0: 20 2a 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e   * FROM t1 UNION
21c0: 20 41 4c 4c 20 53 45 4c 45 43 54 20 2a 20 46 52   ALL SELECT * FR
21d0: 4f 4d 20 74 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  OM t2;.    }.  }
21e0: 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 33 20   {1 2 3 4 5 6 3 
21f0: 34 7d 0a 20 20 7d 20 3b 23 20 69 66 63 61 70 61  4}.  } ;# ifcapa
2200: 62 6c 65 20 63 6f 6d 70 6f 75 6e 64 0a 20 20 69  ble compound.  i
2210: 66 63 61 70 61 62 6c 65 20 21 63 6f 6d 70 6f 75  fcapable !compou
2220: 6e 64 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 74  nd {.  do_test t
2230: 72 69 67 67 65 72 31 2d 33 2e 38 20 7b 0a 20 20  rigger1-3.8 {.  
2240: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
2250: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
2260: 20 56 41 4c 55 45 53 28 33 2c 34 29 3b 0a 20 20   VALUES(3,4);.  
2270: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
2280: 4d 20 74 31 3b 20 0a 20 20 20 20 20 20 53 45 4c  M t1; .      SEL
2290: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20  ECT * FROM t2;. 
22a0: 20 20 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20     }.  } {1 2 3 
22b0: 34 20 33 20 34 7d 0a 20 20 64 6f 5f 74 65 73 74  4 3 4}.  do_test
22c0: 20 74 72 69 67 67 65 72 31 2d 33 2e 39 20 7b 0a   trigger1-3.9 {.
22d0: 20 20 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 20      db close.   
22e0: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
22f0: 2e 64 62 0a 20 20 20 20 65 78 65 63 73 71 6c 20  .db.    execsql 
2300: 7b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  {.      INSERT I
2310: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 35 2c  NTO t1 VALUES(5,
2320: 36 29 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  6);.      SELECT
2330: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20   * FROM t1;.    
2340: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
2350: 74 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31  t2;.    }.  } {1
2360: 20 32 20 33 20 34 20 35 20 36 20 33 20 34 7d 0a   2 3 4 5 6 3 4}.
2370: 20 20 7d 20 3b 23 20 69 66 63 61 70 61 62 6c 65    } ;# ifcapable
2380: 20 21 63 6f 6d 70 6f 75 6e 64 0a 0a 20 20 64 6f   !compound..  do
2390: 5f 74 65 73 74 20 74 72 69 67 67 65 72 31 2d 34  _test trigger1-4
23a0: 2e 31 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .1 {.    execsql
23b0: 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20   {.      CREATE 
23c0: 54 45 4d 50 20 54 52 49 47 47 45 52 20 72 31 20  TEMP TRIGGER r1 
23d0: 42 45 46 4f 52 45 20 49 4e 53 45 52 54 20 4f 4e  BEFORE INSERT ON
23e0: 20 74 31 20 42 45 47 49 4e 0a 20 20 20 20 20 20   t1 BEGIN.      
23f0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
2400: 20 56 41 4c 55 45 53 28 4e 45 57 2e 61 2c 4e 45   VALUES(NEW.a,NE
2410: 57 2e 62 29 3b 0a 20 20 20 20 20 20 45 4e 44 3b  W.b);.      END;
2420: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
2430: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 37 2c 38  TO t1 VALUES(7,8
2440: 29 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  );.      SELECT 
2450: 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 7d  * FROM t2;.    }
2460: 0a 20 20 7d 20 7b 33 20 34 20 37 20 38 7d 0a 20  .  } {3 4 7 8}. 
2470: 20 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72   do_test trigger
2480: 31 2d 34 2e 32 20 7b 0a 20 20 20 20 73 71 6c 69  1-4.2 {.    sqli
2490: 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a  te3 db2 test.db.
24a0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
24b0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
24c0: 74 31 20 56 41 4c 55 45 53 28 39 2c 31 30 29 3b  t1 VALUES(9,10);
24d0: 0a 20 20 20 20 7d 20 64 62 32 3b 0a 20 20 20 20  .    } db2;.    
24e0: 64 62 32 20 63 6c 6f 73 65 0a 20 20 20 20 65 78  db2 close.    ex
24f0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45  ecsql {.      SE
2500: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a  LECT * FROM t2;.
2510: 20 20 20 20 7d 0a 20 20 7d 20 7b 33 20 34 20 37      }.  } {3 4 7
2520: 20 38 7d 0a 20 20 64 6f 5f 74 65 73 74 20 74 72   8}.  do_test tr
2530: 69 67 67 65 72 31 2d 34 2e 33 20 7b 0a 20 20 20  igger1-4.3 {.   
2540: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
2550: 20 44 52 4f 50 20 54 41 42 4c 45 20 74 31 3b 0a   DROP TABLE t1;.
2560: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
2570: 52 4f 4d 20 74 32 3b 0a 20 20 20 20 7d 3b 0a 20  ROM t2;.    };. 
2580: 20 7d 20 7b 33 20 34 20 37 20 38 7d 0a 20 20 64   } {3 4 7 8}.  d
2590: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 31 2d  o_test trigger1-
25a0: 34 2e 34 20 7b 0a 20 20 20 20 64 62 20 63 6c 6f  4.4 {.    db clo
25b0: 73 65 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64  se.    sqlite3 d
25c0: 62 20 74 65 73 74 2e 64 62 0a 20 20 20 20 65 78  b test.db.    ex
25d0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45  ecsql {.      SE
25e0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a  LECT * FROM t2;.
25f0: 20 20 20 20 7d 3b 0a 20 20 7d 20 7b 33 20 34 20      };.  } {3 4 
2600: 37 20 38 7d 0a 7d 20 65 6c 73 65 20 7b 0a 20 20  7 8}.} else {.  
2610: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
2620: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 78 2c  EATE TABLE t2(x,
2630: 79 29 3b 0a 20 20 20 20 44 52 4f 50 20 54 41 42  y);.    DROP TAB
2640: 4c 45 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  LE t1;.    INSER
2650: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
2660: 28 33 2c 20 34 29 3b 0a 20 20 20 20 49 4e 53 45  (3, 4);.    INSE
2670: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
2680: 53 28 37 2c 20 38 29 3b 0a 20 20 7d 0a 7d 0a 0a  S(7, 8);.  }.}..
2690: 0a 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b  .integrity_check
26a0: 20 74 72 69 67 67 65 72 31 2d 35 2e 31 0a 0a 23   trigger1-5.1..#
26b0: 20 43 72 65 61 74 65 20 61 20 74 72 69 67 67 65   Create a trigge
26c0: 72 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  r with the same 
26d0: 6e 61 6d 65 20 61 73 20 61 20 74 61 62 6c 65 2e  name as a table.
26e0: 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 0a    Make sure the.
26f0: 23 20 74 72 69 67 67 65 72 20 77 6f 72 6b 73 2e  # trigger works.
2700: 20 20 54 68 65 6e 20 64 72 6f 70 20 74 68 65 20    Then drop the 
2710: 74 72 69 67 67 65 72 2e 20 20 4d 61 6b 65 20 73  trigger.  Make s
2720: 75 72 65 20 74 68 65 20 74 61 62 6c 65 20 69 73  ure the table is
2730: 0a 23 20 73 74 69 6c 6c 20 74 68 65 72 65 2e 0a  .# still there..
2740: 23 0a 73 65 74 20 76 69 65 77 5f 76 31 20 7b 7d  #.set view_v1 {}
2750: 0a 69 66 63 61 70 61 62 6c 65 20 76 69 65 77 20  .ifcapable view 
2760: 7b 0a 20 20 73 65 74 20 76 69 65 77 5f 76 31 20  {.  set view_v1 
2770: 7b 76 69 65 77 20 76 31 7d 0a 7d 0a 64 6f 5f 74  {view v1}.}.do_t
2780: 65 73 74 20 74 72 69 67 67 65 72 31 2d 36 2e 31  est trigger1-6.1
2790: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45   {.  execsql {SE
27a0: 4c 45 43 54 20 74 79 70 65 2c 20 6e 61 6d 65 20  LECT type, name 
27b0: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
27c0: 65 72 7d 0a 7d 20 5b 63 6f 6e 63 61 74 20 24 76  er}.} [concat $v
27d0: 69 65 77 5f 76 31 20 7b 74 61 62 6c 65 20 74 32  iew_v1 {table t2
27e0: 7d 5d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67  }].do_test trigg
27f0: 65 72 31 2d 36 2e 32 20 7b 0a 20 20 65 78 65 63  er1-6.2 {.  exec
2800: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
2810: 20 54 52 49 47 47 45 52 20 74 32 20 42 45 46 4f   TRIGGER t2 BEFO
2820: 52 45 20 44 45 4c 45 54 45 20 4f 4e 20 74 32 20  RE DELETE ON t2 
2830: 42 45 47 49 4e 0a 20 20 20 20 20 20 53 45 4c 45  BEGIN.      SELE
2840: 43 54 20 52 41 49 53 45 28 41 42 4f 52 54 2c 27  CT RAISE(ABORT,'
2850: 64 65 6c 65 74 65 73 20 61 72 65 20 6e 6f 74 20  deletes are not 
2860: 70 65 72 6d 69 74 74 65 64 27 29 3b 0a 20 20 20  permitted');.   
2870: 20 45 4e 44 3b 0a 20 20 20 20 53 45 4c 45 43 54   END;.    SELECT
2880: 20 74 79 70 65 2c 20 6e 61 6d 65 20 46 52 4f 4d   type, name FROM
2890: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a   sqlite_master;.
28a0: 20 20 7d 0a 7d 20 5b 63 6f 6e 63 61 74 20 24 76    }.} [concat $v
28b0: 69 65 77 5f 76 31 20 7b 74 61 62 6c 65 20 74 32  iew_v1 {table t2
28c0: 20 74 72 69 67 67 65 72 20 74 32 7d 5d 0a 64 6f   trigger t2}].do
28d0: 5f 74 65 73 74 20 74 72 69 67 67 65 72 31 2d 36  _test trigger1-6
28e0: 2e 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .3 {.  catchsql 
28f0: 7b 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 32 7d  {DELETE FROM t2}
2900: 0a 7d 20 7b 31 20 7b 64 65 6c 65 74 65 73 20 61  .} {1 {deletes a
2910: 72 65 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64  re not permitted
2920: 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67  }}.do_test trigg
2930: 65 72 31 2d 36 2e 34 20 7b 0a 20 20 65 78 65 63  er1-6.4 {.  exec
2940: 73 71 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52  sql {SELECT * FR
2950: 4f 4d 20 74 32 7d 0a 7d 20 7b 33 20 34 20 37 20  OM t2}.} {3 4 7 
2960: 38 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67  8}.do_test trigg
2970: 65 72 31 2d 36 2e 35 20 7b 0a 20 20 64 62 20 63  er1-6.5 {.  db c
2980: 6c 6f 73 65 0a 20 20 73 71 6c 69 74 65 33 20 64  lose.  sqlite3 d
2990: 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63  b test.db.  exec
29a0: 73 71 6c 20 7b 53 45 4c 45 43 54 20 74 79 70 65  sql {SELECT type
29b0: 2c 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69  , name FROM sqli
29c0: 74 65 5f 6d 61 73 74 65 72 7d 0a 7d 20 5b 63 6f  te_master}.} [co
29d0: 6e 63 61 74 20 24 76 69 65 77 5f 76 31 20 7b 74  ncat $view_v1 {t
29e0: 61 62 6c 65 20 74 32 20 74 72 69 67 67 65 72 20  able t2 trigger 
29f0: 74 32 7d 5d 0a 64 6f 5f 74 65 73 74 20 74 72 69  t2}].do_test tri
2a00: 67 67 65 72 31 2d 36 2e 36 20 7b 0a 20 20 65 78  gger1-6.6 {.  ex
2a10: 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50  ecsql {.    DROP
2a20: 20 54 52 49 47 47 45 52 20 74 32 3b 0a 20 20 20   TRIGGER t2;.   
2a30: 20 53 45 4c 45 43 54 20 74 79 70 65 2c 20 6e 61   SELECT type, na
2a40: 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  me FROM sqlite_m
2a50: 61 73 74 65 72 3b 0a 20 20 7d 0a 7d 20 5b 63 6f  aster;.  }.} [co
2a60: 6e 63 61 74 20 24 76 69 65 77 5f 76 31 20 7b 74  ncat $view_v1 {t
2a70: 61 62 6c 65 20 74 32 7d 5d 0a 64 6f 5f 74 65 73  able t2}].do_tes
2a80: 74 20 74 72 69 67 67 65 72 31 2d 36 2e 37 20 7b  t trigger1-6.7 {
2a90: 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45  .  execsql {SELE
2aa0: 43 54 20 2a 20 46 52 4f 4d 20 74 32 7d 0a 7d 20  CT * FROM t2}.} 
2ab0: 7b 33 20 34 20 37 20 38 7d 0a 64 6f 5f 74 65 73  {3 4 7 8}.do_tes
2ac0: 74 20 74 72 69 67 67 65 72 31 2d 36 2e 38 20 7b  t trigger1-6.8 {
2ad0: 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 73 71  .  db close.  sq
2ae0: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
2af0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45  .  execsql {SELE
2b00: 43 54 20 2a 20 46 52 4f 4d 20 74 32 7d 0a 7d 20  CT * FROM t2}.} 
2b10: 7b 33 20 34 20 37 20 38 7d 0a 0a 69 6e 74 65 67  {3 4 7 8}..integ
2b20: 72 69 74 79 5f 63 68 65 63 6b 20 74 72 69 67 67  rity_check trigg
2b30: 65 72 2d 37 2e 31 0a 0a 23 20 43 68 65 63 6b 20  er-7.1..# Check 
2b40: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
2b50: 20 6e 61 6d 65 20 6f 66 20 61 20 74 72 69 67 67   name of a trigg
2b60: 65 72 20 63 61 6e 20 62 65 20 71 75 6f 74 65 64  er can be quoted
2b70: 20 73 6f 20 74 68 61 74 20 6b 65 79 77 6f 72 64   so that keyword
2b80: 73 0a 23 20 63 61 6e 20 62 65 20 75 73 65 64 20  s.# can be used 
2b90: 61 73 20 74 72 69 67 67 65 72 20 6e 61 6d 65 73  as trigger names
2ba0: 2e 20 20 54 69 63 6b 65 74 20 23 34 36 38 0a 23  .  Ticket #468.#
2bb0: 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72  .do_test trigger
2bc0: 31 2d 38 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  1-8.1 {.  execsq
2bd0: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
2be0: 52 49 47 47 45 52 20 27 74 72 69 67 67 65 72 27  RIGGER 'trigger'
2bf0: 20 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f 4e   AFTER INSERT ON
2c00: 20 74 32 20 42 45 47 49 4e 20 53 45 4c 45 43 54   t2 BEGIN SELECT
2c10: 20 31 3b 20 45 4e 44 3b 0a 20 20 20 20 53 45 4c   1; END;.    SEL
2c20: 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71  ECT name FROM sq
2c30: 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52  lite_master WHER
2c40: 45 20 74 79 70 65 3d 27 74 72 69 67 67 65 72 27  E type='trigger'
2c50: 3b 0a 20 20 7d 0a 7d 20 7b 74 72 69 67 67 65 72  ;.  }.} {trigger
2c60: 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65  }.do_test trigge
2c70: 72 31 2d 38 2e 32 20 7b 0a 20 20 65 78 65 63 73  r1-8.2 {.  execs
2c80: 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20 54 52  ql {.    DROP TR
2c90: 49 47 47 45 52 20 27 74 72 69 67 67 65 72 27 3b  IGGER 'trigger';
2ca0: 0a 20 20 20 20 53 45 4c 45 43 54 20 6e 61 6d 65  .    SELECT name
2cb0: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
2cc0: 74 65 72 20 57 48 45 52 45 20 74 79 70 65 3d 27  ter WHERE type='
2cd0: 74 72 69 67 67 65 72 27 3b 0a 20 20 7d 0a 7d 20  trigger';.  }.} 
2ce0: 7b 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67  {}.do_test trigg
2cf0: 65 72 31 2d 38 2e 33 20 7b 0a 20 20 65 78 65 63  er1-8.3 {.  exec
2d00: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
2d10: 20 54 52 49 47 47 45 52 20 22 74 72 69 67 67 65   TRIGGER "trigge
2d20: 72 22 20 41 46 54 45 52 20 49 4e 53 45 52 54 20  r" AFTER INSERT 
2d30: 4f 4e 20 74 32 20 42 45 47 49 4e 20 53 45 4c 45  ON t2 BEGIN SELE
2d40: 43 54 20 31 3b 20 45 4e 44 3b 0a 20 20 20 20 53  CT 1; END;.    S
2d50: 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20  ELECT name FROM 
2d60: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48  sqlite_master WH
2d70: 45 52 45 20 74 79 70 65 3d 27 74 72 69 67 67 65  ERE type='trigge
2d80: 72 27 3b 0a 20 20 7d 0a 7d 20 7b 74 72 69 67 67  r';.  }.} {trigg
2d90: 65 72 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67  er}.do_test trig
2da0: 67 65 72 31 2d 38 2e 34 20 7b 0a 20 20 65 78 65  ger1-8.4 {.  exe
2db0: 63 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20  csql {.    DROP 
2dc0: 54 52 49 47 47 45 52 20 22 74 72 69 67 67 65 72  TRIGGER "trigger
2dd0: 22 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 6e 61  ";.    SELECT na
2de0: 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  me FROM sqlite_m
2df0: 61 73 74 65 72 20 57 48 45 52 45 20 74 79 70 65  aster WHERE type
2e00: 3d 27 74 72 69 67 67 65 72 27 3b 0a 20 20 7d 0a  ='trigger';.  }.
2e10: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69  } {}.do_test tri
2e20: 67 67 65 72 31 2d 38 2e 35 20 7b 0a 20 20 65 78  gger1-8.5 {.  ex
2e30: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
2e40: 54 45 20 54 52 49 47 47 45 52 20 5b 74 72 69 67  TE TRIGGER [trig
2e50: 67 65 72 5d 20 41 46 54 45 52 20 49 4e 53 45 52  ger] AFTER INSER
2e60: 54 20 4f 4e 20 74 32 20 42 45 47 49 4e 20 53 45  T ON t2 BEGIN SE
2e70: 4c 45 43 54 20 31 3b 20 45 4e 44 3b 0a 20 20 20  LECT 1; END;.   
2e80: 20 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f   SELECT name FRO
2e90: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
2ea0: 57 48 45 52 45 20 74 79 70 65 3d 27 74 72 69 67  WHERE type='trig
2eb0: 67 65 72 27 3b 0a 20 20 7d 0a 7d 20 7b 74 72 69  ger';.  }.} {tri
2ec0: 67 67 65 72 7d 0a 64 6f 5f 74 65 73 74 20 74 72  gger}.do_test tr
2ed0: 69 67 67 65 72 31 2d 38 2e 36 20 7b 0a 20 20 65  igger1-8.6 {.  e
2ee0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f  xecsql {.    DRO
2ef0: 50 20 54 52 49 47 47 45 52 20 5b 74 72 69 67 67  P TRIGGER [trigg
2f00: 65 72 5d 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  er];.    SELECT 
2f10: 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65  name FROM sqlite
2f20: 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20 74 79  _master WHERE ty
2f30: 70 65 3d 27 74 72 69 67 67 65 72 27 3b 0a 20 20  pe='trigger';.  
2f40: 7d 0a 7d 20 7b 7d 0a 0a 69 66 63 61 70 61 62 6c  }.} {}..ifcapabl
2f50: 65 20 63 6f 6e 66 6c 69 63 74 20 7b 0a 20 20 23  e conflict {.  #
2f60: 20 4d 61 6b 65 20 73 75 72 65 20 52 45 50 4c 41   Make sure REPLA
2f70: 43 45 20 77 6f 72 6b 73 20 69 6e 73 69 64 65 20  CE works inside 
2f80: 6f 66 20 74 72 69 67 67 65 72 73 2e 0a 20 20 23  of triggers..  #
2f90: 0a 20 20 23 20 54 68 65 72 65 20 61 72 65 20 74  .  # There are t
2fa0: 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  wo versions of t
2fb0: 72 69 67 67 65 72 2d 39 2e 31 20 61 6e 64 20 74  rigger-9.1 and t
2fc0: 72 69 67 67 65 72 2d 39 2e 32 2e 20 4f 6e 65 20  rigger-9.2. One 
2fd0: 74 68 61 74 20 75 73 65 73 0a 20 20 23 20 63 6f  that uses.  # co
2fe0: 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74  mpound SELECT st
2ff0: 61 74 65 6d 65 6e 74 73 2c 20 61 6e 64 20 61 6e  atements, and an
3000: 6f 74 68 65 72 20 74 68 61 74 20 64 6f 65 73 20  other that does 
3010: 6e 6f 74 2e 0a 20 20 69 66 63 61 70 61 62 6c 65  not..  ifcapable
3020: 20 63 6f 6d 70 6f 75 6e 64 20 7b 0a 20 20 20 20   compound {.    
3030: 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 31  do_test trigger1
3040: 2d 39 2e 31 20 7b 0a 20 20 20 20 20 20 65 78 65  -9.1 {.      exe
3050: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 20 20 43  csql {.        C
3060: 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 61  REATE TABLE t3(a
3070: 2c 62 29 3b 0a 20 20 20 20 20 20 20 20 43 52 45  ,b);.        CRE
3080: 41 54 45 20 54 41 42 4c 45 20 74 34 28 78 20 55  ATE TABLE t4(x U
3090: 4e 49 51 55 45 2c 20 62 29 3b 0a 20 20 20 20 20  NIQUE, b);.     
30a0: 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45     CREATE TRIGGE
30b0: 52 20 72 33 34 20 41 46 54 45 52 20 49 4e 53 45  R r34 AFTER INSE
30c0: 52 54 20 4f 4e 20 74 33 20 42 45 47 49 4e 0a 20  RT ON t3 BEGIN. 
30d0: 20 20 20 20 20 20 20 20 20 52 45 50 4c 41 43 45           REPLACE
30e0: 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28   INTO t4 VALUES(
30f0: 6e 65 77 2e 61 2c 6e 65 77 2e 62 29 3b 0a 20 20  new.a,new.b);.  
3100: 20 20 20 20 20 20 45 4e 44 3b 0a 20 20 20 20 20        END;.     
3110: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
3120: 33 20 56 41 4c 55 45 53 28 31 2c 32 29 3b 0a 20  3 VALUES(1,2);. 
3130: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20         SELECT * 
3140: 46 52 4f 4d 20 74 33 20 55 4e 49 4f 4e 20 41 4c  FROM t3 UNION AL
3150: 4c 20 53 45 4c 45 43 54 20 39 39 2c 20 39 39 20  L SELECT 99, 99 
3160: 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54  UNION ALL SELECT
3170: 20 2a 20 46 52 4f 4d 20 74 34 3b 0a 20 20 20 20   * FROM t4;.    
3180: 20 20 7d 0a 20 20 20 20 7d 20 7b 31 20 32 20 39    }.    } {1 2 9
3190: 39 20 39 39 20 31 20 32 7d 0a 20 20 20 20 64 6f  9 99 1 2}.    do
31a0: 5f 74 65 73 74 20 74 72 69 67 67 65 72 31 2d 39  _test trigger1-9
31b0: 2e 32 20 7b 0a 20 20 20 20 20 20 65 78 65 63 73  .2 {.      execs
31c0: 71 6c 20 7b 0a 20 20 20 20 20 20 20 20 49 4e 53  ql {.        INS
31d0: 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55  ERT INTO t3 VALU
31e0: 45 53 28 31 2c 33 29 3b 0a 20 20 20 20 20 20 20  ES(1,3);.       
31f0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
3200: 33 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45  3 UNION ALL SELE
3210: 43 54 20 39 39 2c 20 39 39 20 55 4e 49 4f 4e 20  CT 99, 99 UNION 
3220: 41 4c 4c 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  ALL SELECT * FRO
3230: 4d 20 74 34 3b 0a 20 20 20 20 20 20 7d 0a 20 20  M t4;.      }.  
3240: 20 20 7d 20 7b 31 20 32 20 31 20 33 20 39 39 20    } {1 2 1 3 99 
3250: 39 39 20 31 20 33 7d 0a 20 20 7d 20 65 6c 73 65  99 1 3}.  } else
3260: 20 7b 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 74   {.    do_test t
3270: 72 69 67 67 65 72 31 2d 39 2e 31 20 7b 0a 20 20  rigger1-9.1 {.  
3280: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
3290: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
32a0: 4c 45 20 74 33 28 61 2c 62 29 3b 0a 20 20 20 20  LE t3(a,b);.    
32b0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
32c0: 20 74 34 28 78 20 55 4e 49 51 55 45 2c 20 62 29   t4(x UNIQUE, b)
32d0: 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41 54 45  ;.        CREATE
32e0: 20 54 52 49 47 47 45 52 20 72 33 34 20 41 46 54   TRIGGER r34 AFT
32f0: 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 74 33 20  ER INSERT ON t3 
3300: 42 45 47 49 4e 0a 20 20 20 20 20 20 20 20 20 20  BEGIN.          
3310: 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 74 34 20  REPLACE INTO t4 
3320: 56 41 4c 55 45 53 28 6e 65 77 2e 61 2c 6e 65 77  VALUES(new.a,new
3330: 2e 62 29 3b 0a 20 20 20 20 20 20 20 20 45 4e 44  .b);.        END
3340: 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  ;.        INSERT
3350: 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28   INTO t3 VALUES(
3360: 31 2c 32 29 3b 0a 20 20 20 20 20 20 20 20 53 45  1,2);.        SE
3370: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b 20  LECT * FROM t3; 
3380: 53 45 4c 45 43 54 20 39 39 2c 20 39 39 3b 20 53  SELECT 99, 99; S
3390: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 34 3b  ELECT * FROM t4;
33a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 7b  .      }.    } {
33b0: 31 20 32 20 39 39 20 39 39 20 31 20 32 7d 0a 20  1 2 99 99 1 2}. 
33c0: 20 20 20 64 6f 5f 74 65 73 74 20 74 72 69 67 67     do_test trigg
33d0: 65 72 31 2d 39 2e 32 20 7b 0a 20 20 20 20 20 20  er1-9.2 {.      
33e0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
33f0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
3400: 20 56 41 4c 55 45 53 28 31 2c 33 29 3b 0a 20 20   VALUES(1,3);.  
3410: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
3420: 52 4f 4d 20 74 33 3b 20 53 45 4c 45 43 54 20 39  ROM t3; SELECT 9
3430: 39 2c 20 39 39 3b 20 53 45 4c 45 43 54 20 2a 20  9, 99; SELECT * 
3440: 46 52 4f 4d 20 74 34 3b 0a 20 20 20 20 20 20 7d  FROM t4;.      }
3450: 0a 20 20 20 20 7d 20 7b 31 20 32 20 31 20 33 20  .    } {1 2 1 3 
3460: 39 39 20 39 39 20 31 20 33 7d 0a 20 20 7d 0a 20  99 99 1 3}.  }. 
3470: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44   execsql {.    D
3480: 52 4f 50 20 54 41 42 4c 45 20 74 33 3b 0a 20 20  ROP TABLE t3;.  
3490: 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74 34 3b    DROP TABLE t4;
34a0: 0a 20 20 7d 0a 7d 0a 0a 0a 23 20 54 69 63 6b 65  .  }.}...# Ticke
34b0: 74 20 23 37 36 34 2e 20 41 74 20 6f 6e 65 20 73  t #764. At one s
34c0: 74 61 67 65 20 54 45 4d 50 20 74 72 69 67 67 65  tage TEMP trigge
34d0: 72 73 20 77 6f 75 6c 64 20 66 61 69 6c 20 74 6f  rs would fail to
34e0: 20 72 65 2d 69 6e 73 74 61 6c 6c 20 77 68 65 6e   re-install when
34f0: 20 74 68 65 0a 23 20 73 63 68 65 6d 61 20 77 61   the.# schema wa
3500: 73 20 72 65 6c 6f 61 64 65 64 2e 20 54 68 65 20  s reloaded. The 
3510: 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 20  following tests 
3520: 65 6e 73 75 72 65 20 74 68 61 74 20 54 45 4d 50  ensure that TEMP
3530: 20 74 72 69 67 67 65 72 73 20 61 72 65 0a 23 20   triggers are.# 
3540: 63 6f 72 72 65 63 74 6c 79 20 72 65 2d 69 6e 73  correctly re-ins
3550: 74 61 6c 6c 65 64 2e 0a 23 0a 23 20 41 6c 73 6f  talled..#.# Also
3560: 20 76 65 72 69 66 79 20 74 68 61 74 20 72 65 66   verify that ref
3570: 65 72 65 6e 63 65 73 20 77 69 74 68 69 6e 20 74  erences within t
3580: 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 20  rigger programs 
3590: 61 72 65 20 72 65 73 6f 6c 76 65 64 20 61 74 0a  are resolved at.
35a0: 23 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d 70  # statement comp
35b0: 69 6c 65 20 74 69 6d 65 2c 20 6e 6f 74 20 74 72  ile time, not tr
35c0: 69 67 67 65 72 20 69 6e 73 74 61 6c 6c 61 74 69  igger installati
35d0: 6f 6e 20 74 69 6d 65 2e 20 54 68 69 73 20 6d 65  on time. This me
35e0: 61 6e 73 2c 20 66 6f 72 0a 23 20 65 78 61 6d 70  ans, for.# examp
35f0: 6c 65 2c 20 74 68 61 74 20 79 6f 75 20 63 61 6e  le, that you can
3600: 20 64 72 6f 70 20 61 6e 64 20 72 65 2d 63 72 65   drop and re-cre
3610: 61 74 65 20 74 61 62 6c 65 73 20 72 65 66 65 72  ate tables refer
3620: 65 6e 63 65 64 20 62 79 20 74 72 69 67 67 65 72  enced by trigger
3630: 73 2e 20 0a 69 66 63 61 70 61 62 6c 65 20 74 65  s. .ifcapable te
3640: 6d 70 64 62 26 26 61 74 74 61 63 68 20 7b 0a 20  mpdb&&attach {. 
3650: 20 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72   do_test trigger
3660: 31 2d 31 30 2e 30 20 7b 0a 20 20 20 20 66 6f 72  1-10.0 {.    for
3670: 63 65 64 65 6c 65 74 65 20 74 65 73 74 32 2e 64  cedelete test2.d
3680: 62 0a 20 20 20 20 66 6f 72 63 65 64 65 6c 65 74  b.    forcedelet
3690: 65 20 74 65 73 74 32 2e 64 62 2d 6a 6f 75 72 6e  e test2.db-journ
36a0: 61 6c 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b  al.    execsql {
36b0: 0a 20 20 20 20 20 20 41 54 54 41 43 48 20 27 74  .      ATTACH 't
36c0: 65 73 74 32 2e 64 62 27 20 41 53 20 61 75 78 3b  est2.db' AS aux;
36d0: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20  .    }.  } {}.  
36e0: 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 31  do_test trigger1
36f0: 2d 31 30 2e 31 20 7b 0a 20 20 20 20 65 78 65 63  -10.1 {.    exec
3700: 73 71 6c 20 7b 0a 20 20 20 20 20 20 43 52 45 41  sql {.      CREA
3710: 54 45 20 54 41 42 4c 45 20 6d 61 69 6e 2e 74 34  TE TABLE main.t4
3720: 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20 20  (a, b, c);.     
3730: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 65   CREATE TABLE te
3740: 6d 70 2e 74 34 28 61 2c 20 62 2c 20 63 29 3b 0a  mp.t4(a, b, c);.
3750: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
3760: 4c 45 20 61 75 78 2e 74 34 28 61 2c 20 62 2c 20  LE aux.t4(a, b, 
3770: 63 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45  c);.      CREATE
3780: 20 54 41 42 4c 45 20 69 6e 73 65 72 74 5f 6c 6f   TABLE insert_lo
3790: 67 28 64 62 2c 20 61 2c 20 62 2c 20 63 29 3b 0a  g(db, a, b, c);.
37a0: 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64      }.  } {}.  d
37b0: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 31 2d  o_test trigger1-
37c0: 31 30 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73  10.2 {.    execs
37d0: 71 6c 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54  ql {.      CREAT
37e0: 45 20 54 45 4d 50 20 54 52 49 47 47 45 52 20 74  E TEMP TRIGGER t
37f0: 72 69 67 31 20 41 46 54 45 52 20 49 4e 53 45 52  rig1 AFTER INSER
3800: 54 20 4f 4e 20 6d 61 69 6e 2e 74 34 20 42 45 47  T ON main.t4 BEG
3810: 49 4e 20 0a 20 20 20 20 20 20 20 20 49 4e 53 45  IN .        INSE
3820: 52 54 20 49 4e 54 4f 20 69 6e 73 65 72 74 5f 6c  RT INTO insert_l
3830: 6f 67 20 56 41 4c 55 45 53 28 27 6d 61 69 6e 27  og VALUES('main'
3840: 2c 20 6e 65 77 2e 61 2c 20 6e 65 77 2e 62 2c 20  , new.a, new.b, 
3850: 6e 65 77 2e 63 29 3b 0a 20 20 20 20 20 20 45 4e  new.c);.      EN
3860: 44 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  D;.      CREATE 
3870: 54 45 4d 50 20 54 52 49 47 47 45 52 20 74 72 69  TEMP TRIGGER tri
3880: 67 32 20 41 46 54 45 52 20 49 4e 53 45 52 54 20  g2 AFTER INSERT 
3890: 4f 4e 20 74 65 6d 70 2e 74 34 20 42 45 47 49 4e  ON temp.t4 BEGIN
38a0: 20 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54   .        INSERT
38b0: 20 49 4e 54 4f 20 69 6e 73 65 72 74 5f 6c 6f 67   INTO insert_log
38c0: 20 56 41 4c 55 45 53 28 27 74 65 6d 70 27 2c 20   VALUES('temp', 
38d0: 6e 65 77 2e 61 2c 20 6e 65 77 2e 62 2c 20 6e 65  new.a, new.b, ne
38e0: 77 2e 63 29 3b 0a 20 20 20 20 20 20 45 4e 44 3b  w.c);.      END;
38f0: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 45  .      CREATE TE
3900: 4d 50 20 54 52 49 47 47 45 52 20 74 72 69 67 33  MP TRIGGER trig3
3910: 20 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f 4e   AFTER INSERT ON
3920: 20 61 75 78 2e 74 34 20 42 45 47 49 4e 20 0a 20   aux.t4 BEGIN . 
3930: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
3940: 54 4f 20 69 6e 73 65 72 74 5f 6c 6f 67 20 56 41  TO insert_log VA
3950: 4c 55 45 53 28 27 61 75 78 27 2c 20 6e 65 77 2e  LUES('aux', new.
3960: 61 2c 20 6e 65 77 2e 62 2c 20 6e 65 77 2e 63 29  a, new.b, new.c)
3970: 3b 0a 20 20 20 20 20 20 45 4e 44 3b 0a 20 20 20  ;.      END;.   
3980: 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74   }.  } {}.  do_t
3990: 65 73 74 20 74 72 69 67 67 65 72 31 2d 31 30 2e  est trigger1-10.
39a0: 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  3 {.    execsql 
39b0: 7b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  {.      INSERT I
39c0: 4e 54 4f 20 6d 61 69 6e 2e 74 34 20 56 41 4c 55  NTO main.t4 VALU
39d0: 45 53 28 31 2c 20 32 2c 20 33 29 3b 0a 20 20 20  ES(1, 2, 3);.   
39e0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
39f0: 65 6d 70 2e 74 34 20 56 41 4c 55 45 53 28 34 2c  emp.t4 VALUES(4,
3a00: 20 35 2c 20 36 29 3b 0a 20 20 20 20 20 20 49 4e   5, 6);.      IN
3a10: 53 45 52 54 20 49 4e 54 4f 20 61 75 78 2e 74 34  SERT INTO aux.t4
3a20: 20 20 56 41 4c 55 45 53 28 37 2c 20 38 2c 20 39    VALUES(7, 8, 9
3a30: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a  );.    }.  } {}.
3a40: 20 20 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65    do_test trigge
3a50: 72 31 2d 31 30 2e 34 20 7b 0a 20 20 20 20 65 78  r1-10.4 {.    ex
3a60: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45  ecsql {.      SE
3a70: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 69 6e 73 65  LECT * FROM inse
3a80: 72 74 5f 6c 6f 67 3b 0a 20 20 20 20 7d 0a 20 20  rt_log;.    }.  
3a90: 7d 20 7b 6d 61 69 6e 20 31 20 32 20 33 20 74 65  } {main 1 2 3 te
3aa0: 6d 70 20 34 20 35 20 36 20 61 75 78 20 37 20 38  mp 4 5 6 aux 7 8
3ab0: 20 39 7d 0a 20 20 64 6f 5f 74 65 73 74 20 74 72   9}.  do_test tr
3ac0: 69 67 67 65 72 31 2d 31 30 2e 35 20 7b 0a 20 20  igger1-10.5 {.  
3ad0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
3ae0: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49    BEGIN;.      I
3af0: 4e 53 45 52 54 20 49 4e 54 4f 20 6d 61 69 6e 2e  NSERT INTO main.
3b00: 74 34 20 56 41 4c 55 45 53 28 31 2c 20 32 2c 20  t4 VALUES(1, 2, 
3b10: 33 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  3);.      INSERT
3b20: 20 49 4e 54 4f 20 74 65 6d 70 2e 74 34 20 56 41   INTO temp.t4 VA
3b30: 4c 55 45 53 28 34 2c 20 35 2c 20 36 29 3b 0a 20  LUES(4, 5, 6);. 
3b40: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
3b50: 20 61 75 78 2e 74 34 20 20 56 41 4c 55 45 53 28   aux.t4  VALUES(
3b60: 37 2c 20 38 2c 20 39 29 3b 0a 20 20 20 20 20 20  7, 8, 9);.      
3b70: 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 7d 0a  ROLLBACK;.    }.
3b80: 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74    } {}.  do_test
3b90: 20 74 72 69 67 67 65 72 31 2d 31 30 2e 36 20 7b   trigger1-10.6 {
3ba0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
3bb0: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
3bc0: 4f 4d 20 69 6e 73 65 72 74 5f 6c 6f 67 3b 0a 20  OM insert_log;. 
3bd0: 20 20 20 7d 0a 20 20 7d 20 7b 6d 61 69 6e 20 31     }.  } {main 1
3be0: 20 32 20 33 20 74 65 6d 70 20 34 20 35 20 36 20   2 3 temp 4 5 6 
3bf0: 61 75 78 20 37 20 38 20 39 7d 0a 20 20 64 6f 5f  aux 7 8 9}.  do_
3c00: 74 65 73 74 20 74 72 69 67 67 65 72 31 2d 31 30  test trigger1-10
3c10: 2e 37 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .7 {.    execsql
3c20: 20 7b 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20   {.      DELETE 
3c30: 46 52 4f 4d 20 69 6e 73 65 72 74 5f 6c 6f 67 3b  FROM insert_log;
3c40: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
3c50: 54 4f 20 6d 61 69 6e 2e 74 34 20 56 41 4c 55 45  TO main.t4 VALUE
3c60: 53 28 31 31 2c 20 31 32 2c 20 31 33 29 3b 0a 20  S(11, 12, 13);. 
3c70: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
3c80: 20 74 65 6d 70 2e 74 34 20 56 41 4c 55 45 53 28   temp.t4 VALUES(
3c90: 31 34 2c 20 31 35 2c 20 31 36 29 3b 0a 20 20 20  14, 15, 16);.   
3ca0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
3cb0: 75 78 2e 74 34 20 20 56 41 4c 55 45 53 28 31 37  ux.t4  VALUES(17
3cc0: 2c 20 31 38 2c 20 31 39 29 3b 0a 20 20 20 20 7d  , 18, 19);.    }
3cd0: 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73  .  } {}.  do_tes
3ce0: 74 20 74 72 69 67 67 65 72 31 2d 31 30 2e 38 20  t trigger1-10.8 
3cf0: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  {.    execsql {.
3d00: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
3d10: 52 4f 4d 20 69 6e 73 65 72 74 5f 6c 6f 67 3b 0a  ROM insert_log;.
3d20: 20 20 20 20 7d 0a 20 20 7d 20 7b 6d 61 69 6e 20      }.  } {main 
3d30: 31 31 20 31 32 20 31 33 20 74 65 6d 70 20 31 34  11 12 13 temp 14
3d40: 20 31 35 20 31 36 20 61 75 78 20 31 37 20 31 38   15 16 aux 17 18
3d50: 20 31 39 7d 0a 20 20 64 6f 5f 74 65 73 74 20 74   19}.  do_test t
3d60: 72 69 67 67 65 72 31 2d 31 30 2e 38 20 7b 0a 20  rigger1-10.8 {. 
3d70: 20 23 20 44 72 6f 70 20 61 6e 64 20 72 65 2d 63   # Drop and re-c
3d80: 72 65 61 74 65 20 74 68 65 20 69 6e 73 65 72 74  reate the insert
3d90: 5f 6c 6f 67 20 74 61 62 6c 65 20 69 6e 20 61 20  _log table in a 
3da0: 64 69 66 66 65 72 65 6e 74 20 64 61 74 61 62 61  different databa
3db0: 73 65 2e 20 4e 6f 74 65 0a 20 20 23 20 74 68 61  se. Note.  # tha
3dc0: 74 20 77 65 20 63 61 6e 20 63 68 61 6e 67 65 20  t we can change 
3dd0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
3de0: 20 62 65 63 61 75 73 65 20 74 68 65 20 74 72 69   because the tri
3df0: 67 67 65 72 20 70 72 6f 67 72 61 6d 73 20 64 6f  gger programs do
3e00: 6e 27 74 0a 20 20 23 20 75 73 65 20 74 68 65 6d  n't.  # use them
3e10: 20 65 78 70 6c 69 63 69 74 6c 79 2e 0a 20 20 20   explicitly..   
3e20: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
3e30: 20 44 52 4f 50 20 54 41 42 4c 45 20 69 6e 73 65   DROP TABLE inse
3e40: 72 74 5f 6c 6f 67 3b 0a 20 20 20 20 20 20 43 52  rt_log;.      CR
3e50: 45 41 54 45 20 54 41 42 4c 45 20 61 75 78 2e 69  EATE TABLE aux.i
3e60: 6e 73 65 72 74 5f 6c 6f 67 28 64 62 2c 20 64 2c  nsert_log(db, d,
3e70: 20 65 2c 20 66 29 3b 0a 20 20 20 20 7d 0a 20 20   e, f);.    }.  
3e80: 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 74  } {}.  do_test t
3e90: 72 69 67 67 65 72 31 2d 31 30 2e 31 30 20 7b 0a  rigger1-10.10 {.
3ea0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
3eb0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3ec0: 6d 61 69 6e 2e 74 34 20 56 41 4c 55 45 53 28 32  main.t4 VALUES(2
3ed0: 31 2c 20 32 32 2c 20 32 33 29 3b 0a 20 20 20 20  1, 22, 23);.    
3ee0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 65    INSERT INTO te
3ef0: 6d 70 2e 74 34 20 56 41 4c 55 45 53 28 32 34 2c  mp.t4 VALUES(24,
3f00: 20 32 35 2c 20 32 36 29 3b 0a 20 20 20 20 20 20   25, 26);.      
3f10: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 75 78 2e  INSERT INTO aux.
3f20: 74 34 20 20 56 41 4c 55 45 53 28 32 37 2c 20 32  t4  VALUES(27, 2
3f30: 38 2c 20 32 39 29 3b 0a 20 20 20 20 7d 0a 20 20  8, 29);.    }.  
3f40: 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 74  } {}.  do_test t
3f50: 72 69 67 67 65 72 31 2d 31 30 2e 31 31 20 7b 0a  rigger1-10.11 {.
3f60: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
3f70: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
3f80: 4d 20 69 6e 73 65 72 74 5f 6c 6f 67 3b 0a 20 20  M insert_log;.  
3f90: 20 20 7d 0a 20 20 7d 20 7b 6d 61 69 6e 20 32 31    }.  } {main 21
3fa0: 20 32 32 20 32 33 20 74 65 6d 70 20 32 34 20 32   22 23 temp 24 2
3fb0: 35 20 32 36 20 61 75 78 20 32 37 20 32 38 20 32  5 26 aux 27 28 2
3fc0: 39 7d 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 74 72  9}.}..do_test tr
3fd0: 69 67 67 65 72 31 2d 31 31 2e 31 20 7b 0a 20 20  igger1-11.1 {.  
3fe0: 63 61 74 63 68 73 71 6c 20 7b 53 45 4c 45 43 54  catchsql {SELECT
3ff0: 20 72 61 69 73 65 28 61 62 6f 72 74 2c 27 6d 65   raise(abort,'me
4000: 73 73 61 67 65 27 29 3b 7d 0a 7d 20 7b 31 20 7b  ssage');}.} {1 {
4010: 52 41 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79  RAISE() may only
4020: 20 62 65 20 75 73 65 64 20 77 69 74 68 69 6e 20   be used within 
4030: 61 20 74 72 69 67 67 65 72 2d 70 72 6f 67 72 61  a trigger-progra
4040: 6d 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20 74 72 69  m}}..do_test tri
4050: 67 67 65 72 31 2d 31 35 2e 31 20 7b 0a 20 20 65  gger1-15.1 {.  e
4060: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
4070: 41 54 45 20 54 41 42 4c 45 20 74 41 28 61 20 49  ATE TABLE tA(a I
4080: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
4090: 45 59 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20 43  EY, b, c);.    C
40a0: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74 41  REATE TRIGGER tA
40b0: 5f 74 72 69 67 67 65 72 20 42 45 46 4f 52 45 20  _trigger BEFORE 
40c0: 55 50 44 41 54 45 20 4f 4e 20 22 74 41 22 20 42  UPDATE ON "tA" B
40d0: 45 47 49 4e 20 53 45 4c 45 43 54 20 31 3b 20 45  EGIN SELECT 1; E
40e0: 4e 44 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ND;.    INSERT I
40f0: 4e 54 4f 20 74 41 20 56 41 4c 55 45 53 28 31 2c  NTO tA VALUES(1,
4100: 20 32 2c 20 33 29 3b 0a 20 20 7d 0a 20 20 63 61   2, 3);.  }.  ca
4110: 74 63 68 73 71 6c 20 7b 20 55 50 44 41 54 45 20  tchsql { UPDATE 
4120: 74 41 20 53 45 54 20 61 20 3d 20 27 61 62 63 27  tA SET a = 'abc'
4130: 20 7d 0a 7d 20 7b 31 20 7b 64 61 74 61 74 79 70   }.} {1 {datatyp
4140: 65 20 6d 69 73 6d 61 74 63 68 7d 7d 0a 64 6f 5f  e mismatch}}.do_
4150: 74 65 73 74 20 74 72 69 67 67 65 72 31 2d 31 35  test trigger1-15
4160: 2e 32 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .2 {.  catchsql 
4170: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 41  { INSERT INTO tA
4180: 20 56 41 4c 55 45 53 28 27 61 62 63 27 2c 20 32   VALUES('abc', 2
4190: 2c 20 33 29 20 7d 0a 7d 20 7b 31 20 7b 64 61 74  , 3) }.} {1 {dat
41a0: 61 74 79 70 65 20 6d 69 73 6d 61 74 63 68 7d 7d  atype mismatch}}
41b0: 0a 0a 23 20 54 69 63 6b 65 74 20 23 33 39 34 37  ..# Ticket #3947
41c0: 3a 20 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20  :  Do not allow 
41d0: 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20  qualified table 
41e0: 6e 61 6d 65 73 20 6f 6e 20 49 4e 53 45 52 54 2c  names on INSERT,
41f0: 20 55 50 44 41 54 45 2c 20 61 6e 64 0a 23 20 44   UPDATE, and.# D
4200: 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 73  ELETE statements
4210: 20 77 69 74 68 69 6e 20 74 72 69 67 67 65 72 73   within triggers
4220: 2e 20 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 69  .  Actually, thi
4230: 73 20 68 61 73 20 6e 65 76 65 72 20 62 65 65 6e  s has never been
4240: 20 61 6c 6c 6f 77 65 64 0a 23 20 62 79 20 74 68   allowed.# by th
4250: 65 20 67 72 61 6d 6d 61 72 2e 20 20 42 75 74 20  e grammar.  But 
4260: 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
4270: 65 20 69 73 20 63 6f 6e 66 75 73 69 6e 67 3a 20  e is confusing: 
4280: 6f 6e 65 20 73 69 6d 70 6c 79 20 67 65 74 73 20  one simply gets 
4290: 61 0a 23 20 22 73 79 6e 74 61 78 20 65 72 72 6f  a.# "syntax erro
42a0: 72 22 2e 20 20 54 68 61 74 20 68 61 73 20 6e 6f  r".  That has no
42b0: 77 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20 74  w been changed t
42c0: 6f 20 67 69 76 65 20 61 20 66 75 6c 6c 20 65 72  o give a full er
42d0: 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 23 0a 64  ror message..#.d
42e0: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 31 2d  o_test trigger1-
42f0: 31 36 2e 31 20 7b 0a 20 20 64 62 20 65 76 61 6c  16.1 {.  db eval
4300: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
4310: 42 4c 45 20 74 31 36 28 61 2c 62 2c 63 29 3b 0a  BLE t16(a,b,c);.
4320: 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58      CREATE INDEX
4330: 20 74 31 36 61 20 4f 4e 20 74 31 36 28 61 29 3b   t16a ON t16(a);
4340: 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  .    CREATE INDE
4350: 58 20 74 31 36 62 20 4f 4e 20 74 31 36 28 62 29  X t16b ON t16(b)
4360: 3b 0a 20 20 7d 0a 20 20 63 61 74 63 68 73 71 6c  ;.  }.  catchsql
4370: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 52   {.    CREATE TR
4380: 49 47 47 45 52 20 6d 61 69 6e 2e 74 31 36 65 72  IGGER main.t16er
4390: 72 31 20 41 46 54 45 52 20 49 4e 53 45 52 54 20  r1 AFTER INSERT 
43a0: 4f 4e 20 74 41 20 42 45 47 49 4e 0a 20 20 20 20  ON tA BEGIN.    
43b0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6d 61    INSERT INTO ma
43c0: 69 6e 2e 74 31 36 20 56 41 4c 55 45 53 28 31 2c  in.t16 VALUES(1,
43d0: 32 2c 33 29 3b 0a 20 20 20 20 45 4e 44 3b 0a 20  2,3);.    END;. 
43e0: 20 7d 0a 7d 20 7b 31 20 7b 71 75 61 6c 69 66 69   }.} {1 {qualifi
43f0: 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 61  ed table names a
4400: 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f  re not allowed o
4410: 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45  n INSERT, UPDATE
4420: 2c 20 61 6e 64 20 44 45 4c 45 54 45 20 73 74 61  , and DELETE sta
4430: 74 65 6d 65 6e 74 73 20 77 69 74 68 69 6e 20 74  tements within t
4440: 72 69 67 67 65 72 73 7d 7d 0a 64 6f 5f 74 65 73  riggers}}.do_tes
4450: 74 20 74 72 69 67 67 65 72 31 2d 31 36 2e 32 20  t trigger1-16.2 
4460: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20  {.  catchsql {. 
4470: 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45     CREATE TRIGGE
4480: 52 20 6d 61 69 6e 2e 74 31 36 65 72 72 32 20 41  R main.t16err2 A
4490: 46 54 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 74  FTER INSERT ON t
44a0: 41 20 42 45 47 49 4e 0a 20 20 20 20 20 20 55 50  A BEGIN.      UP
44b0: 44 41 54 45 20 6d 61 69 6e 2e 74 31 36 20 53 45  DATE main.t16 SE
44c0: 54 20 72 6f 77 69 64 3d 72 6f 77 69 64 2b 31 3b  T rowid=rowid+1;
44d0: 0a 20 20 20 20 45 4e 44 3b 0a 20 20 7d 0a 7d 20  .    END;.  }.} 
44e0: 7b 31 20 7b 71 75 61 6c 69 66 69 65 64 20 74 61  {1 {qualified ta
44f0: 62 6c 65 20 6e 61 6d 65 73 20 61 72 65 20 6e 6f  ble names are no
4500: 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 49 4e 53  t allowed on INS
4510: 45 52 54 2c 20 55 50 44 41 54 45 2c 20 61 6e 64  ERT, UPDATE, and
4520: 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
4530: 74 73 20 77 69 74 68 69 6e 20 74 72 69 67 67 65  ts within trigge
4540: 72 73 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69  rs}}.do_test tri
4550: 67 67 65 72 31 2d 31 36 2e 33 20 7b 0a 20 20 63  gger1-16.3 {.  c
4560: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 43 52  atchsql {.    CR
4570: 45 41 54 45 20 54 52 49 47 47 45 52 20 6d 61 69  EATE TRIGGER mai
4580: 6e 2e 74 31 36 65 72 72 33 20 41 46 54 45 52 20  n.t16err3 AFTER 
4590: 49 4e 53 45 52 54 20 4f 4e 20 74 41 20 42 45 47  INSERT ON tA BEG
45a0: 49 4e 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20  IN.      DELETE 
45b0: 46 52 4f 4d 20 6d 61 69 6e 2e 74 31 36 3b 0a 20  FROM main.t16;. 
45c0: 20 20 20 45 4e 44 3b 0a 20 20 7d 0a 7d 20 7b 31     END;.  }.} {1
45d0: 20 7b 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c   {qualified tabl
45e0: 65 20 6e 61 6d 65 73 20 61 72 65 20 6e 6f 74 20  e names are not 
45f0: 61 6c 6c 6f 77 65 64 20 6f 6e 20 49 4e 53 45 52  allowed on INSER
4600: 54 2c 20 55 50 44 41 54 45 2c 20 61 6e 64 20 44  T, UPDATE, and D
4610: 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 73  ELETE statements
4620: 20 77 69 74 68 69 6e 20 74 72 69 67 67 65 72 73   within triggers
4630: 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67  }}.do_test trigg
4640: 65 72 31 2d 31 36 2e 34 20 7b 0a 20 20 63 61 74  er1-16.4 {.  cat
4650: 63 68 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  chsql {.    CREA
4660: 54 45 20 54 52 49 47 47 45 52 20 6d 61 69 6e 2e  TE TRIGGER main.
4670: 74 31 36 65 72 72 34 20 41 46 54 45 52 20 49 4e  t16err4 AFTER IN
4680: 53 45 52 54 20 4f 4e 20 74 41 20 42 45 47 49 4e  SERT ON tA BEGIN
4690: 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 74 31  .      UPDATE t1
46a0: 36 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 53 45  6 NOT INDEXED SE
46b0: 54 20 72 6f 77 69 64 3d 72 6f 77 69 64 2b 31 3b  T rowid=rowid+1;
46c0: 0a 20 20 20 20 45 4e 44 3b 0a 20 20 7d 0a 7d 20  .    END;.  }.} 
46d0: 7b 31 20 7b 74 68 65 20 4e 4f 54 20 49 4e 44 45  {1 {the NOT INDE
46e0: 58 45 44 20 63 6c 61 75 73 65 20 69 73 20 6e 6f  XED clause is no
46f0: 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 55 50 44  t allowed on UPD
4700: 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74  ATE or DELETE st
4710: 61 74 65 6d 65 6e 74 73 20 77 69 74 68 69 6e 20  atements within 
4720: 74 72 69 67 67 65 72 73 7d 7d 0a 64 6f 5f 74 65  triggers}}.do_te
4730: 73 74 20 74 72 69 67 67 65 72 31 2d 31 36 2e 35  st trigger1-16.5
4740: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a   {.  catchsql {.
4750: 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47      CREATE TRIGG
4760: 45 52 20 6d 61 69 6e 2e 74 31 36 65 72 72 35 20  ER main.t16err5 
4770: 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f 4e 20  AFTER INSERT ON 
4780: 74 41 20 42 45 47 49 4e 0a 20 20 20 20 20 20 55  tA BEGIN.      U
4790: 50 44 41 54 45 20 74 31 36 20 49 4e 44 45 58 45  PDATE t16 INDEXE
47a0: 44 20 42 59 20 74 31 36 61 20 53 45 54 20 72 6f  D BY t16a SET ro
47b0: 77 69 64 3d 72 6f 77 69 64 2b 31 20 57 48 45 52  wid=rowid+1 WHER
47c0: 45 20 61 3d 31 3b 0a 20 20 20 20 45 4e 44 3b 0a  E a=1;.    END;.
47d0: 20 20 7d 0a 7d 20 7b 31 20 7b 74 68 65 20 49 4e    }.} {1 {the IN
47e0: 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 20  DEXED BY clause 
47f0: 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f  is not allowed o
4800: 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  n UPDATE or DELE
4810: 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 77 69  TE statements wi
4820: 74 68 69 6e 20 74 72 69 67 67 65 72 73 7d 7d 0a  thin triggers}}.
4830: 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 31  do_test trigger1
4840: 2d 31 36 2e 36 20 7b 0a 20 20 63 61 74 63 68 73  -16.6 {.  catchs
4850: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
4860: 54 52 49 47 47 45 52 20 6d 61 69 6e 2e 74 31 36  TRIGGER main.t16
4870: 65 72 72 36 20 41 46 54 45 52 20 49 4e 53 45 52  err6 AFTER INSER
4880: 54 20 4f 4e 20 74 41 20 42 45 47 49 4e 0a 20 20  T ON tA BEGIN.  
4890: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
48a0: 74 31 36 20 4e 4f 54 20 49 4e 44 45 58 45 44 20  t16 NOT INDEXED 
48b0: 57 48 45 52 45 20 61 3d 31 32 33 3b 0a 20 20 20  WHERE a=123;.   
48c0: 20 45 4e 44 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b   END;.  }.} {1 {
48d0: 74 68 65 20 4e 4f 54 20 49 4e 44 45 58 45 44 20  the NOT INDEXED 
48e0: 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61 6c  clause is not al
48f0: 6c 6f 77 65 64 20 6f 6e 20 55 50 44 41 54 45 20  lowed on UPDATE 
4900: 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  or DELETE statem
4910: 65 6e 74 73 20 77 69 74 68 69 6e 20 74 72 69 67  ents within trig
4920: 67 65 72 73 7d 7d 0a 64 6f 5f 74 65 73 74 20 74  gers}}.do_test t
4930: 72 69 67 67 65 72 31 2d 31 36 2e 37 20 7b 0a 20  rigger1-16.7 {. 
4940: 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20   catchsql {.    
4950: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 6d  CREATE TRIGGER m
4960: 61 69 6e 2e 74 31 36 65 72 72 37 20 41 46 54 45  ain.t16err7 AFTE
4970: 52 20 49 4e 53 45 52 54 20 4f 4e 20 74 41 20 42  R INSERT ON tA B
4980: 45 47 49 4e 0a 20 20 20 20 20 20 44 45 4c 45 54  EGIN.      DELET
4990: 45 20 46 52 4f 4d 20 74 31 36 20 49 4e 44 45 58  E FROM t16 INDEX
49a0: 45 44 20 42 59 20 74 31 36 61 20 57 48 45 52 45  ED BY t16a WHERE
49b0: 20 61 3d 31 32 33 3b 0a 20 20 20 20 45 4e 44 3b   a=123;.    END;
49c0: 0a 20 20 7d 0a 7d 20 7b 31 20 7b 74 68 65 20 49  .  }.} {1 {the I
49d0: 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
49e0: 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20   is not allowed 
49f0: 6f 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  on UPDATE or DEL
4a00: 45 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 77  ETE statements w
4a10: 69 74 68 69 6e 20 74 72 69 67 67 65 72 73 7d 7d  ithin triggers}}
4a20: 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a        ..finish_test.