/ Hex Artifact Content
Login

Artifact ea9624cc1dae05645469df6119fa815f9e6f1e8c:


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 67 65 72 31 2d 31 2e 31 3a 20  # trigger1-1.1: 
0200: 45 72 72 6f 72 20 69 66 20 74 61 62 6c 65 20 64  Error if table d
0210: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 0a 23 20  oes not exist.# 
0220: 74 72 69 67 67 65 72 31 2d 31 2e 32 3a 20 45 72  trigger1-1.2: Er
0230: 72 6f 72 20 69 66 20 74 72 69 67 67 65 72 20 61  ror if trigger a
0240: 6c 72 65 61 64 79 20 65 78 69 73 74 73 0a 23 20  lready exists.# 
0250: 74 72 69 67 67 65 72 31 2d 31 2e 33 3a 20 43 72  trigger1-1.3: Cr
0260: 65 61 74 65 64 20 74 72 69 67 67 65 72 73 20 61  eated triggers a
0270: 72 65 20 64 65 6c 65 74 65 64 20 69 66 20 74 68  re deleted if th
0280: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
0290: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 23 20 74   rolled back.# t
02a0: 72 69 67 67 65 72 31 2d 31 2e 34 3a 20 44 52 4f  rigger1-1.4: DRO
02b0: 50 20 54 52 49 47 47 45 52 20 72 65 6d 6f 76 65  P TRIGGER remove
02c0: 73 20 74 72 69 67 67 65 72 0a 23 20 74 72 69 67  s trigger.# trig
02d0: 67 65 72 31 2d 31 2e 35 3a 20 44 72 6f 70 70 65  ger1-1.5: Droppe
02e0: 64 20 74 72 69 67 67 65 72 73 20 61 72 65 20 72  d triggers are r
02f0: 65 73 74 6f 72 65 64 20 69 66 20 74 68 65 20 74  estored if the t
0300: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
0310: 6c 6c 65 64 20 62 61 63 6b 0a 23 20 74 72 69 67  lled back.# trig
0320: 67 65 72 31 2d 31 2e 36 3a 20 45 72 72 6f 72 20  ger1-1.6: Error 
0330: 69 66 20 64 72 6f 70 70 65 64 20 74 72 69 67 67  if dropped trigg
0340: 65 72 20 64 6f 65 73 6e 27 74 20 65 78 69 73 74  er doesn't exist
0350: 0a 23 20 74 72 69 67 67 65 72 31 2d 31 2e 37 3a  .# trigger1-1.7:
0360: 20 44 72 6f 70 70 69 6e 67 20 74 68 65 20 74 61   Dropping the ta
0370: 62 6c 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ble automaticall
0380: 79 20 64 72 6f 70 73 20 61 6c 6c 20 74 72 69 67  y drops all trig
0390: 67 65 72 73 0a 23 20 74 72 69 67 67 65 72 31 2d  gers.# trigger1-
03a0: 31 2e 38 3a 20 41 20 74 72 69 67 67 65 72 20 63  1.8: A trigger c
03b0: 72 65 61 74 65 64 20 6f 6e 20 61 20 54 45 4d 50  reated on a TEMP
03c0: 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 69 6e   table is not in
03d0: 73 65 72 74 65 64 20 69 6e 74 6f 20 73 71 6c 69  serted into sqli
03e0: 74 65 5f 6d 61 73 74 65 72 0a 23 20 74 72 69 67  te_master.# trig
03f0: 67 65 72 31 2d 31 2e 39 3a 20 45 6e 73 75 72 65  ger1-1.9: Ensure
0400: 20 74 68 61 74 20 77 65 20 63 61 6e 6e 6f 74 20   that we cannot 
0410: 63 72 65 61 74 65 20 61 20 74 72 69 67 67 65 72  create a trigger
0420: 20 6f 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74 65   on sqlite_maste
0430: 72 0a 23 20 74 72 69 67 67 65 72 31 2d 31 2e 31  r.# trigger1-1.1
0440: 30 3a 0a 23 20 74 72 69 67 67 65 72 31 2d 31 2e  0:.# trigger1-1.
0450: 31 31 3a 0a 23 20 74 72 69 67 67 65 72 31 2d 31  11:.# trigger1-1
0460: 2e 31 32 3a 20 45 6e 73 75 72 65 20 74 68 61 74  .12: Ensure that
0470: 20 49 4e 53 54 45 41 44 20 4f 46 20 74 72 69 67   INSTEAD OF trig
0480: 67 65 72 73 20 63 61 6e 6e 6f 74 20 62 65 20 63  gers cannot be c
0490: 72 65 61 74 65 64 20 6f 6e 20 74 61 62 6c 65 73  reated on tables
04a0: 0a 23 20 74 72 69 67 67 65 72 31 2d 31 2e 31 33  .# trigger1-1.13
04b0: 3a 20 45 6e 73 75 72 65 20 74 68 61 74 20 41 46  : Ensure that AF
04c0: 54 45 52 20 74 72 69 67 67 65 72 73 20 63 61 6e  TER triggers can
04d0: 6e 6f 74 20 62 65 20 63 72 65 61 74 65 64 20 6f  not be created o
04e0: 6e 20 76 69 65 77 73 0a 23 20 74 72 69 67 67 65  n views.# trigge
04f0: 72 31 2d 31 2e 31 34 3a 20 45 6e 73 75 72 65 20  r1-1.14: Ensure 
0500: 74 68 61 74 20 42 45 46 4f 52 45 20 74 72 69 67  that BEFORE trig
0510: 67 65 72 73 20 63 61 6e 6e 6f 74 20 62 65 20 63  gers cannot be c
0520: 72 65 61 74 65 64 20 6f 6e 20 76 69 65 77 73 0a  reated on views.
0530: 23 0a 0a 73 65 74 20 74 65 73 74 64 69 72 20 5b  #..set testdir [
0540: 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 61 72  file dirname $ar
0550: 67 76 30 5d 0a 73 6f 75 72 63 65 20 24 74 65 73  gv0].source $tes
0560: 74 64 69 72 2f 74 65 73 74 65 72 2e 74 63 6c 0a  tdir/tester.tcl.
0570: 69 66 63 61 70 61 62 6c 65 20 21 74 72 69 67 67  ifcapable !trigg
0580: 65 72 7c 7c 21 63 6f 6d 70 6f 75 6e 64 20 7b 0a  er||!compound {.
0590: 20 20 66 69 6e 69 73 68 5f 74 65 73 74 0a 20 20    finish_test.  
05a0: 72 65 74 75 72 6e 0a 7d 0a 0a 64 6f 5f 74 65 73  return.}..do_tes
05b0: 74 20 74 72 69 67 67 65 72 31 2d 31 2e 31 2e 31  t trigger1-1.1.1
05c0: 20 7b 0a 20 20 20 63 61 74 63 68 73 71 6c 20 7b   {.   catchsql {
05d0: 0a 20 20 20 20 20 43 52 45 41 54 45 20 54 52 49  .     CREATE TRI
05e0: 47 47 45 52 20 74 72 69 67 20 55 50 44 41 54 45  GGER trig UPDATE
05f0: 20 4f 4e 20 6e 6f 5f 73 75 63 68 5f 74 61 62 6c   ON no_such_tabl
0600: 65 20 42 45 47 49 4e 0a 20 20 20 20 20 20 20 53  e BEGIN.       S
0610: 45 4c 45 43 54 20 2a 20 66 72 6f 6d 20 73 71 6c  ELECT * from sql
0620: 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 20 20  ite_master;.    
0630: 20 45 4e 44 3b 0a 20 20 20 7d 20 0a 7d 20 7b 31   END;.   } .} {1
0640: 20 7b 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a   {no such table:
0650: 20 6d 61 69 6e 2e 6e 6f 5f 73 75 63 68 5f 74 61   main.no_such_ta
0660: 62 6c 65 7d 7d 0a 0a 69 66 63 61 70 61 62 6c 65  ble}}..ifcapable
0670: 20 74 65 6d 70 64 62 20 7b 0a 20 20 64 6f 5f 74   tempdb {.  do_t
0680: 65 73 74 20 74 72 69 67 67 65 72 31 2d 31 2e 31  est trigger1-1.1
0690: 2e 32 20 7b 0a 20 20 20 20 20 63 61 74 63 68 73  .2 {.     catchs
06a0: 71 6c 20 7b 0a 20 20 20 20 20 20 20 43 52 45 41  ql {.       CREA
06b0: 54 45 20 54 45 4d 50 20 54 52 49 47 47 45 52 20  TE TEMP TRIGGER 
06c0: 74 72 69 67 20 55 50 44 41 54 45 20 4f 4e 20 6e  trig UPDATE ON n
06d0: 6f 5f 73 75 63 68 5f 74 61 62 6c 65 20 42 45 47  o_such_table BEG
06e0: 49 4e 0a 20 20 20 20 20 20 20 20 20 53 45 4c 45  IN.         SELE
06f0: 43 54 20 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65  CT * from sqlite
0700: 5f 6d 61 73 74 65 72 3b 0a 20 20 20 20 20 20 20  _master;.       
0710: 45 4e 44 3b 0a 20 20 20 20 20 7d 20 0a 20 20 7d  END;.     } .  }
0720: 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20 74 61 62   {1 {no such tab
0730: 6c 65 3a 20 6e 6f 5f 73 75 63 68 5f 74 61 62 6c  le: no_such_tabl
0740: 65 7d 7d 0a 7d 0a 0a 65 78 65 63 73 71 6c 20 7b  e}}.}..execsql {
0750: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
0760: 45 20 74 31 28 61 29 3b 0a 7d 0a 64 6f 5f 74 65  E t1(a);.}.do_te
0770: 73 74 20 74 72 69 67 67 65 72 31 2d 31 2e 31 2e  st trigger1-1.1.
0780: 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  3 {.  catchsql {
0790: 0a 20 20 20 20 20 43 52 45 41 54 45 20 54 52 49  .     CREATE TRI
07a0: 47 47 45 52 20 74 72 69 67 20 55 50 44 41 54 45  GGER trig UPDATE
07b0: 20 4f 4e 20 74 31 20 46 4f 52 20 45 41 43 48 20   ON t1 FOR EACH 
07c0: 53 54 41 54 45 4d 45 4e 54 20 42 45 47 49 4e 0a  STATEMENT BEGIN.
07d0: 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a          SELECT *
07e0: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
07f0: 74 65 72 3b 0a 20 20 20 20 20 45 4e 44 3b 0a 20  ter;.     END;. 
0800: 20 7d 0a 7d 20 7b 31 20 7b 6e 65 61 72 20 22 53   }.} {1 {near "S
0810: 54 41 54 45 4d 45 4e 54 22 3a 20 73 79 6e 74 61  TATEMENT": synta
0820: 78 20 65 72 72 6f 72 7d 7d 0a 65 78 65 63 73 71  x error}}.execsq
0830: 6c 20 7b 0a 20 20 20 20 20 20 20 20 43 52 45 41  l {.        CREA
0840: 54 45 20 54 52 49 47 47 45 52 20 74 72 31 20 49  TE TRIGGER tr1 I
0850: 4e 53 45 52 54 20 4f 4e 20 74 31 20 42 45 47 49  NSERT ON t1 BEGI
0860: 4e 0a 20 20 20 20 20 20 20 20 20 20 49 4e 53 45  N.          INSE
0870: 52 54 20 49 4e 54 4f 20 74 31 20 76 61 6c 75 65  RT INTO t1 value
0880: 73 28 31 29 3b 0a 20 20 20 20 20 20 20 20 20 45  s(1);.         E
0890: 4e 44 3b 0a 7d 0a 64 6f 5f 74 65 73 74 20 74 72  ND;.}.do_test tr
08a0: 69 67 67 65 72 31 2d 31 2e 32 2e 30 20 7b 0a 20  igger1-1.2.0 {. 
08b0: 20 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20     catchsql {.  
08c0: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 52 49        CREATE TRI
08d0: 47 47 45 52 20 49 46 20 4e 4f 54 20 45 58 49 53  GGER IF NOT EXIS
08e0: 54 53 20 74 72 31 20 44 45 4c 45 54 45 20 4f 4e  TS tr1 DELETE ON
08f0: 20 74 31 20 42 45 47 49 4e 0a 20 20 20 20 20 20   t1 BEGIN.      
0900: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
0910: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
0920: 72 3b 0a 20 20 20 20 20 20 20 20 20 45 4e 44 0a  r;.         END.
0930: 20 20 20 20 20 7d 0a 7d 20 7b 30 20 7b 7d 7d 0a       }.} {0 {}}.
0940: 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 31  do_test trigger1
0950: 2d 31 2e 32 2e 31 20 7b 0a 20 20 20 20 63 61 74  -1.2.1 {.    cat
0960: 63 68 73 71 6c 20 7b 0a 20 20 20 20 20 20 20 20  chsql {.        
0970: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74  CREATE TRIGGER t
0980: 72 31 20 44 45 4c 45 54 45 20 4f 4e 20 74 31 20  r1 DELETE ON t1 
0990: 42 45 47 49 4e 0a 20 20 20 20 20 20 20 20 20 20  BEGIN.          
09a0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
09b0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20  sqlite_master;. 
09c0: 20 20 20 20 20 20 20 20 45 4e 44 0a 20 20 20 20          END.    
09d0: 20 7d 0a 7d 20 7b 31 20 7b 74 72 69 67 67 65 72   }.} {1 {trigger
09e0: 20 74 72 31 20 61 6c 72 65 61 64 79 20 65 78 69   tr1 already exi
09f0: 73 74 73 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 72  sts}}.do_test tr
0a00: 69 67 67 65 72 31 2d 31 2e 32 2e 32 20 7b 0a 20  igger1-1.2.2 {. 
0a10: 20 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20     catchsql {.  
0a20: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 52 49        CREATE TRI
0a30: 47 47 45 52 20 22 74 72 31 22 20 44 45 4c 45 54  GGER "tr1" DELET
0a40: 45 20 4f 4e 20 74 31 20 42 45 47 49 4e 0a 20 20  E ON t1 BEGIN.  
0a50: 20 20 20 20 20 20 20 20 20 20 53 45 4c 45 43 54            SELECT
0a60: 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d   * FROM sqlite_m
0a70: 61 73 74 65 72 3b 0a 20 20 20 20 20 20 20 20 20  aster;.         
0a80: 45 4e 44 0a 20 20 20 20 20 7d 0a 7d 20 7b 31 20  END.     }.} {1 
0a90: 7b 74 72 69 67 67 65 72 20 22 74 72 31 22 20 61  {trigger "tr1" a
0aa0: 6c 72 65 61 64 79 20 65 78 69 73 74 73 7d 7d 0a  lready exists}}.
0ab0: 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 31  do_test trigger1
0ac0: 2d 31 2e 32 2e 33 20 7b 0a 20 20 20 20 63 61 74  -1.2.3 {.    cat
0ad0: 63 68 73 71 6c 20 7b 0a 20 20 20 20 20 20 20 20  chsql {.        
0ae0: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 5b  CREATE TRIGGER [
0af0: 74 72 31 5d 20 44 45 4c 45 54 45 20 4f 4e 20 74  tr1] DELETE ON t
0b00: 31 20 42 45 47 49 4e 0a 20 20 20 20 20 20 20 20  1 BEGIN.        
0b10: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
0b20: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b  M sqlite_master;
0b30: 0a 20 20 20 20 20 20 20 20 20 45 4e 44 0a 20 20  .         END.  
0b40: 20 20 20 7d 0a 7d 20 7b 31 20 7b 74 72 69 67 67     }.} {1 {trigg
0b50: 65 72 20 5b 74 72 31 5d 20 61 6c 72 65 61 64 79  er [tr1] already
0b60: 20 65 78 69 73 74 73 7d 7d 0a 0a 64 6f 5f 74 65   exists}}..do_te
0b70: 73 74 20 74 72 69 67 67 65 72 31 2d 31 2e 33 20  st trigger1-1.3 
0b80: 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b  {.    catchsql {
0b90: 0a 20 20 20 20 20 20 20 20 42 45 47 49 4e 3b 0a  .        BEGIN;.
0ba0: 20 20 20 20 20 20 20 20 43 52 45 41 54 45 20 54          CREATE T
0bb0: 52 49 47 47 45 52 20 74 72 32 20 49 4e 53 45 52  RIGGER tr2 INSER
0bc0: 54 20 4f 4e 20 74 31 20 42 45 47 49 4e 0a 20 20  T ON t1 BEGIN.  
0bd0: 20 20 20 20 20 20 20 20 20 20 53 45 4c 45 43 54            SELECT
0be0: 20 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d   * from sqlite_m
0bf0: 61 73 74 65 72 3b 20 45 4e 44 3b 0a 20 20 20 20  aster; END;.    
0c00: 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20      ROLLBACK;.  
0c10: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 52 49        CREATE TRI
0c20: 47 47 45 52 20 74 72 32 20 49 4e 53 45 52 54 20  GGER tr2 INSERT 
0c30: 4f 4e 20 74 31 20 42 45 47 49 4e 0a 20 20 20 20  ON t1 BEGIN.    
0c40: 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a          SELECT *
0c50: 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73   from sqlite_mas
0c60: 74 65 72 3b 20 45 4e 44 3b 0a 20 20 20 20 7d 0a  ter; END;.    }.
0c70: 7d 20 7b 30 20 7b 7d 7d 0a 0a 64 6f 5f 74 65 73  } {0 {}}..do_tes
0c80: 74 20 74 72 69 67 67 65 72 31 2d 31 2e 34 20 7b  t trigger1-1.4 {
0c90: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 0a  .    catchsql {.
0ca0: 20 20 20 20 20 20 20 20 44 52 4f 50 20 54 52 49          DROP TRI
0cb0: 47 47 45 52 20 49 46 20 45 58 49 53 54 53 20 74  GGER IF EXISTS t
0cc0: 72 31 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41  r1;.        CREA
0cd0: 54 45 20 54 52 49 47 47 45 52 20 74 72 31 20 44  TE TRIGGER tr1 D
0ce0: 45 4c 45 54 45 20 4f 4e 20 74 31 20 42 45 47 49  ELETE ON t1 BEGI
0cf0: 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 45  N.            SE
0d00: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69  LECT * FROM sqli
0d10: 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 20 20 20  te_master;.     
0d20: 20 20 20 45 4e 44 0a 20 20 20 20 7d 0a 7d 20 7b     END.    }.} {
0d30: 30 20 7b 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20 74  0 {}}..do_test t
0d40: 72 69 67 67 65 72 31 2d 31 2e 35 20 7b 0a 20 20  rigger1-1.5 {.  
0d50: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
0d60: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
0d70: 20 20 20 44 52 4f 50 20 54 52 49 47 47 45 52 20     DROP TRIGGER 
0d80: 74 72 32 3b 0a 20 20 20 20 20 20 20 20 52 4f 4c  tr2;.        ROL
0d90: 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 44  LBACK;.        D
0da0: 52 4f 50 20 54 52 49 47 47 45 52 20 74 72 32 3b  ROP TRIGGER tr2;
0db0: 0a 20 20 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f  .    }.} {}..do_
0dc0: 74 65 73 74 20 74 72 69 67 67 65 72 31 2d 31 2e  test trigger1-1.
0dd0: 36 2e 31 20 7b 0a 20 20 20 20 63 61 74 63 68 73  6.1 {.    catchs
0de0: 71 6c 20 7b 0a 20 20 20 20 20 20 20 20 44 52 4f  ql {.        DRO
0df0: 50 20 54 52 49 47 47 45 52 20 49 46 20 45 58 49  P TRIGGER IF EXI
0e00: 53 54 53 20 62 69 67 67 6c 65 73 3b 0a 20 20 20  STS biggles;.   
0e10: 20 7d 0a 7d 20 7b 30 20 7b 7d 7d 0a 0a 64 6f 5f   }.} {0 {}}..do_
0e20: 74 65 73 74 20 74 72 69 67 67 65 72 31 2d 31 2e  test trigger1-1.
0e30: 36 2e 32 20 7b 0a 20 20 20 20 63 61 74 63 68 73  6.2 {.    catchs
0e40: 71 6c 20 7b 0a 20 20 20 20 20 20 20 20 44 52 4f  ql {.        DRO
0e50: 50 20 54 52 49 47 47 45 52 20 62 69 67 67 6c 65  P TRIGGER biggle
0e60: 73 3b 0a 20 20 20 20 7d 0a 7d 20 7b 31 20 7b 6e  s;.    }.} {1 {n
0e70: 6f 20 73 75 63 68 20 74 72 69 67 67 65 72 3a 20  o such trigger: 
0e80: 62 69 67 67 6c 65 73 7d 7d 0a 0a 64 6f 5f 74 65  biggles}}..do_te
0e90: 73 74 20 74 72 69 67 67 65 72 31 2d 31 2e 37 20  st trigger1-1.7 
0ea0: 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b  {.    catchsql {
0eb0: 0a 20 20 20 20 20 20 20 20 44 52 4f 50 20 54 41  .        DROP TA
0ec0: 42 4c 45 20 74 31 3b 0a 20 20 20 20 20 20 20 20  BLE t1;.        
0ed0: 44 52 4f 50 20 54 52 49 47 47 45 52 20 74 72 31  DROP TRIGGER tr1
0ee0: 3b 0a 20 20 20 20 7d 0a 7d 20 7b 31 20 7b 6e 6f  ;.    }.} {1 {no
0ef0: 20 73 75 63 68 20 74 72 69 67 67 65 72 3a 20 74   such trigger: t
0f00: 72 31 7d 7d 0a 0a 69 66 63 61 70 61 62 6c 65 20  r1}}..ifcapable 
0f10: 74 65 6d 70 64 62 20 7b 0a 20 20 65 78 65 63 73  tempdb {.  execs
0f20: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
0f30: 54 45 4d 50 20 54 41 42 4c 45 20 74 65 6d 70 5f  TEMP TABLE temp_
0f40: 74 61 62 6c 65 28 61 29 3b 0a 20 20 7d 0a 20 20  table(a);.  }.  
0f50: 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 31  do_test trigger1
0f60: 2d 31 2e 38 20 7b 0a 20 20 20 20 65 78 65 63 73  -1.8 {.    execs
0f70: 71 6c 20 7b 0a 20 20 20 20 20 20 20 20 20 20 43  ql {.          C
0f80: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74 65  REATE TRIGGER te
0f90: 6d 70 5f 74 72 69 67 20 55 50 44 41 54 45 20 4f  mp_trig UPDATE O
0fa0: 4e 20 74 65 6d 70 5f 74 61 62 6c 65 20 42 45 47  N temp_table BEG
0fb0: 49 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  IN.             
0fc0: 20 53 45 4c 45 43 54 20 2a 20 66 72 6f 6d 20 73   SELECT * from s
0fd0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20  qlite_master;.  
0fe0: 20 20 20 20 20 20 20 20 45 4e 44 3b 0a 20 20 20          END;.   
0ff0: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f         SELECT co
1000: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 73 71 6c 69  unt(*) FROM sqli
1010: 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20  te_master WHERE 
1020: 6e 61 6d 65 20 3d 20 27 74 65 6d 70 5f 74 72 69  name = 'temp_tri
1030: 67 27 3b 0a 20 20 20 20 7d 20 0a 20 20 7d 20 7b  g';.    } .  } {
1040: 30 7d 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 74 72  0}.}..do_test tr
1050: 69 67 67 65 72 31 2d 31 2e 39 20 7b 0a 20 20 63  igger1-1.9 {.  c
1060: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 43 52  atchsql {.    CR
1070: 45 41 54 45 20 54 52 49 47 47 45 52 20 74 72 31  EATE TRIGGER tr1
1080: 20 41 46 54 45 52 20 55 50 44 41 54 45 20 4f 4e   AFTER UPDATE ON
1090: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 42   sqlite_master B
10a0: 45 47 49 4e 0a 20 20 20 20 20 20 20 53 45 4c 45  EGIN.       SELE
10b0: 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65  CT * FROM sqlite
10c0: 5f 6d 61 73 74 65 72 3b 0a 20 20 20 20 45 4e 44  _master;.    END
10d0: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 63 61 6e 6e  ;.  }.} {1 {cann
10e0: 6f 74 20 63 72 65 61 74 65 20 74 72 69 67 67 65  ot create trigge
10f0: 72 20 6f 6e 20 73 79 73 74 65 6d 20 74 61 62 6c  r on system tabl
1100: 65 7d 7d 0a 0a 23 20 43 68 65 63 6b 20 74 6f 20  e}}..# Check to 
1110: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 61  make sure that a
1120: 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
1130: 74 20 77 69 74 68 69 6e 20 74 68 65 20 62 6f 64  t within the bod
1140: 79 20 6f 66 0a 23 20 61 20 74 72 69 67 67 65 72  y of.# a trigger
1150: 20 64 6f 65 73 20 6e 6f 74 20 6d 65 73 73 20 75   does not mess u
1160: 70 20 74 68 65 20 44 45 4c 45 54 45 20 74 68 61  p the DELETE tha
1170: 74 20 63 61 75 73 65 64 20 74 68 65 20 74 72 69  t caused the tri
1180: 67 67 65 72 20 74 6f 0a 23 20 72 75 6e 20 69 6e  gger to.# run in
1190: 20 74 68 65 20 66 69 72 73 74 20 70 6c 61 63 65   the first place
11a0: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 74 72 69 67  ..#.do_test trig
11b0: 67 65 72 31 2d 31 2e 31 30 20 7b 0a 20 20 65 78  ger1-1.10 {.  ex
11c0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 63 72 65 61  ecsql {.    crea
11d0: 74 65 20 74 61 62 6c 65 20 74 31 28 61 2c 62 29  te table t1(a,b)
11e0: 3b 0a 20 20 20 20 69 6e 73 65 72 74 20 69 6e 74  ;.    insert int
11f0: 6f 20 74 31 20 76 61 6c 75 65 73 28 31 2c 27 61  o t1 values(1,'a
1200: 27 29 3b 0a 20 20 20 20 69 6e 73 65 72 74 20 69  ');.    insert i
1210: 6e 74 6f 20 74 31 20 76 61 6c 75 65 73 28 32 2c  nto t1 values(2,
1220: 27 62 27 29 3b 0a 20 20 20 20 69 6e 73 65 72 74  'b');.    insert
1230: 20 69 6e 74 6f 20 74 31 20 76 61 6c 75 65 73 28   into t1 values(
1240: 33 2c 27 63 27 29 3b 0a 20 20 20 20 69 6e 73 65  3,'c');.    inse
1250: 72 74 20 69 6e 74 6f 20 74 31 20 76 61 6c 75 65  rt into t1 value
1260: 73 28 34 2c 27 64 27 29 3b 0a 20 20 20 20 63 72  s(4,'d');.    cr
1270: 65 61 74 65 20 74 72 69 67 67 65 72 20 72 31 20  eate trigger r1 
1280: 61 66 74 65 72 20 64 65 6c 65 74 65 20 6f 6e 20  after delete on 
1290: 74 31 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20  t1 for each row 
12a0: 62 65 67 69 6e 0a 20 20 20 20 20 20 64 65 6c 65  begin.      dele
12b0: 74 65 20 66 72 6f 6d 20 74 31 20 57 48 45 52 45  te from t1 WHERE
12c0: 20 61 3d 6f 6c 64 2e 61 2b 32 3b 0a 20 20 20 20   a=old.a+2;.    
12d0: 65 6e 64 3b 0a 20 20 20 20 64 65 6c 65 74 65 20  end;.    delete 
12e0: 66 72 6f 6d 20 74 31 20 77 68 65 72 65 20 61 3d  from t1 where a=
12f0: 31 20 4f 52 20 61 3d 33 3b 0a 20 20 20 20 73 65  1 OR a=3;.    se
1300: 6c 65 63 74 20 2a 20 66 72 6f 6d 20 74 31 3b 0a  lect * from t1;.
1310: 20 20 20 20 64 72 6f 70 20 74 61 62 6c 65 20 74      drop table t
1320: 31 3b 0a 20 20 7d 0a 7d 20 7b 32 20 62 20 34 20  1;.  }.} {2 b 4 
1330: 64 7d 0a 0a 64 6f 5f 74 65 73 74 20 74 72 69 67  d}..do_test trig
1340: 67 65 72 31 2d 31 2e 31 31 20 7b 0a 20 20 65 78  ger1-1.11 {.  ex
1350: 65 63 73 71 6c 20 7b 0a 20 20 20 20 63 72 65 61  ecsql {.    crea
1360: 74 65 20 74 61 62 6c 65 20 74 31 28 61 2c 62 29  te table t1(a,b)
1370: 3b 0a 20 20 20 20 69 6e 73 65 72 74 20 69 6e 74  ;.    insert int
1380: 6f 20 74 31 20 76 61 6c 75 65 73 28 31 2c 27 61  o t1 values(1,'a
1390: 27 29 3b 0a 20 20 20 20 69 6e 73 65 72 74 20 69  ');.    insert i
13a0: 6e 74 6f 20 74 31 20 76 61 6c 75 65 73 28 32 2c  nto t1 values(2,
13b0: 27 62 27 29 3b 0a 20 20 20 20 69 6e 73 65 72 74  'b');.    insert
13c0: 20 69 6e 74 6f 20 74 31 20 76 61 6c 75 65 73 28   into t1 values(
13d0: 33 2c 27 63 27 29 3b 0a 20 20 20 20 69 6e 73 65  3,'c');.    inse
13e0: 72 74 20 69 6e 74 6f 20 74 31 20 76 61 6c 75 65  rt into t1 value
13f0: 73 28 34 2c 27 64 27 29 3b 0a 20 20 20 20 63 72  s(4,'d');.    cr
1400: 65 61 74 65 20 74 72 69 67 67 65 72 20 72 31 20  eate trigger r1 
1410: 61 66 74 65 72 20 75 70 64 61 74 65 20 6f 6e 20  after update on 
1420: 74 31 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20  t1 for each row 
1430: 62 65 67 69 6e 0a 20 20 20 20 20 20 64 65 6c 65  begin.      dele
1440: 74 65 20 66 72 6f 6d 20 74 31 20 57 48 45 52 45  te from t1 WHERE
1450: 20 61 3d 6f 6c 64 2e 61 2b 32 3b 0a 20 20 20 20   a=old.a+2;.    
1460: 65 6e 64 3b 0a 20 20 20 20 75 70 64 61 74 65 20  end;.    update 
1470: 74 31 20 73 65 74 20 62 3d 27 78 2d 27 20 7c 7c  t1 set b='x-' ||
1480: 20 62 20 77 68 65 72 65 20 61 3d 31 20 4f 52 20   b where a=1 OR 
1490: 61 3d 33 3b 0a 20 20 20 20 73 65 6c 65 63 74 20  a=3;.    select 
14a0: 2a 20 66 72 6f 6d 20 74 31 3b 0a 20 20 20 20 64  * from t1;.    d
14b0: 72 6f 70 20 74 61 62 6c 65 20 74 31 3b 0a 20 20  rop table t1;.  
14c0: 7d 0a 7d 20 7b 31 20 78 2d 61 20 32 20 62 20 34  }.} {1 x-a 2 b 4
14d0: 20 64 7d 0a 0a 23 20 45 6e 73 75 72 65 20 74 68   d}..# Ensure th
14e0: 61 74 20 77 65 20 63 61 6e 6e 6f 74 20 63 72 65  at we cannot cre
14f0: 61 74 65 20 49 4e 53 54 45 41 44 20 4f 46 20 74  ate INSTEAD OF t
1500: 72 69 67 67 65 72 73 20 6f 6e 20 74 61 62 6c 65  riggers on table
1510: 73 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65  s.do_test trigge
1520: 72 31 2d 31 2e 31 32 20 7b 0a 20 20 63 61 74 63  r1-1.12 {.  catc
1530: 68 73 71 6c 20 7b 0a 20 20 20 20 63 72 65 61 74  hsql {.    creat
1540: 65 20 74 61 62 6c 65 20 74 31 28 61 2c 62 29 3b  e table t1(a,b);
1550: 0a 20 20 20 20 63 72 65 61 74 65 20 74 72 69 67  .    create trig
1560: 67 65 72 20 74 31 74 20 69 6e 73 74 65 61 64 20  ger t1t instead 
1570: 6f 66 20 75 70 64 61 74 65 20 6f 6e 20 74 31 20  of update on t1 
1580: 66 6f 72 20 65 61 63 68 20 72 6f 77 20 62 65 67  for each row beg
1590: 69 6e 0a 20 20 20 20 20 20 64 65 6c 65 74 65 20  in.      delete 
15a0: 66 72 6f 6d 20 74 31 20 57 48 45 52 45 20 61 3d  from t1 WHERE a=
15b0: 6f 6c 64 2e 61 2b 32 3b 0a 20 20 20 20 65 6e 64  old.a+2;.    end
15c0: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 63 61 6e 6e  ;.  }.} {1 {cann
15d0: 6f 74 20 63 72 65 61 74 65 20 49 4e 53 54 45 41  ot create INSTEA
15e0: 44 20 4f 46 20 74 72 69 67 67 65 72 20 6f 6e 20  D OF trigger on 
15f0: 74 61 62 6c 65 3a 20 74 31 7d 7d 0a 0a 69 66 63  table: t1}}..ifc
1600: 61 70 61 62 6c 65 20 76 69 65 77 20 7b 0a 23 20  apable view {.# 
1610: 45 6e 73 75 72 65 20 74 68 61 74 20 77 65 20 63  Ensure that we c
1620: 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 42 45 46  annot create BEF
1630: 4f 52 45 20 74 72 69 67 67 65 72 73 20 6f 6e 20  ORE triggers on 
1640: 76 69 65 77 73 0a 64 6f 5f 74 65 73 74 20 74 72  views.do_test tr
1650: 69 67 67 65 72 31 2d 31 2e 31 33 20 7b 0a 20 20  igger1-1.13 {.  
1660: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 63  catchsql {.    c
1670: 72 65 61 74 65 20 76 69 65 77 20 76 31 20 61 73  reate view v1 as
1680: 20 73 65 6c 65 63 74 20 2a 20 66 72 6f 6d 20 74   select * from t
1690: 31 3b 0a 20 20 20 20 63 72 65 61 74 65 20 74 72  1;.    create tr
16a0: 69 67 67 65 72 20 76 31 74 20 62 65 66 6f 72 65  igger v1t before
16b0: 20 75 70 64 61 74 65 20 6f 6e 20 76 31 20 66 6f   update on v1 fo
16c0: 72 20 65 61 63 68 20 72 6f 77 20 62 65 67 69 6e  r each row begin
16d0: 0a 20 20 20 20 20 20 64 65 6c 65 74 65 20 66 72  .      delete fr
16e0: 6f 6d 20 74 31 20 57 48 45 52 45 20 61 3d 6f 6c  om t1 WHERE a=ol
16f0: 64 2e 61 2b 32 3b 0a 20 20 20 20 65 6e 64 3b 0a  d.a+2;.    end;.
1700: 20 20 7d 0a 7d 20 7b 31 20 7b 63 61 6e 6e 6f 74    }.} {1 {cannot
1710: 20 63 72 65 61 74 65 20 42 45 46 4f 52 45 20 74   create BEFORE t
1720: 72 69 67 67 65 72 20 6f 6e 20 76 69 65 77 3a 20  rigger on view: 
1730: 76 31 7d 7d 0a 23 20 45 6e 73 75 72 65 20 74 68  v1}}.# Ensure th
1740: 61 74 20 77 65 20 63 61 6e 6e 6f 74 20 63 72 65  at we cannot cre
1750: 61 74 65 20 41 46 54 45 52 20 74 72 69 67 67 65  ate AFTER trigge
1760: 72 73 20 6f 6e 20 76 69 65 77 73 0a 64 6f 5f 74  rs on views.do_t
1770: 65 73 74 20 74 72 69 67 67 65 72 31 2d 31 2e 31  est trigger1-1.1
1780: 34 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  4 {.  catchsql {
1790: 0a 20 20 20 20 64 72 6f 70 20 76 69 65 77 20 76  .    drop view v
17a0: 31 3b 0a 20 20 20 20 63 72 65 61 74 65 20 76 69  1;.    create vi
17b0: 65 77 20 76 31 20 61 73 20 73 65 6c 65 63 74 20  ew v1 as select 
17c0: 2a 20 66 72 6f 6d 20 74 31 3b 0a 20 20 20 20 63  * from t1;.    c
17d0: 72 65 61 74 65 20 74 72 69 67 67 65 72 20 76 31  reate trigger v1
17e0: 74 20 41 46 54 45 52 20 75 70 64 61 74 65 20 6f  t AFTER update o
17f0: 6e 20 76 31 20 66 6f 72 20 65 61 63 68 20 72 6f  n v1 for each ro
1800: 77 20 62 65 67 69 6e 0a 20 20 20 20 20 20 64 65  w begin.      de
1810: 6c 65 74 65 20 66 72 6f 6d 20 74 31 20 57 48 45  lete from t1 WHE
1820: 52 45 20 61 3d 6f 6c 64 2e 61 2b 32 3b 0a 20 20  RE a=old.a+2;.  
1830: 20 20 65 6e 64 3b 0a 20 20 7d 0a 7d 20 7b 31 20    end;.  }.} {1 
1840: 7b 63 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 41  {cannot create A
1850: 46 54 45 52 20 74 72 69 67 67 65 72 20 6f 6e 20  FTER trigger on 
1860: 76 69 65 77 3a 20 76 31 7d 7d 0a 7d 20 3b 23 20  view: v1}}.} ;# 
1870: 69 66 63 61 70 61 62 6c 65 20 76 69 65 77 0a 0a  ifcapable view..
1880: 23 20 43 68 65 63 6b 20 66 6f 72 20 6d 65 6d 6f  # Check for memo
1890: 72 79 20 6c 65 61 6b 73 20 69 6e 20 74 68 65 20  ry leaks in the 
18a0: 74 72 69 67 67 65 72 20 70 61 72 73 65 72 0a 23  trigger parser.#
18b0: 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72  .do_test trigger
18c0: 31 2d 32 2e 31 20 7b 0a 20 20 63 61 74 63 68 73  1-2.1 {.  catchs
18d0: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
18e0: 54 52 49 47 47 45 52 20 72 31 20 41 46 54 45 52  TRIGGER r1 AFTER
18f0: 20 49 4e 53 45 52 54 20 4f 4e 20 74 31 20 42 45   INSERT ON t1 BE
1900: 47 49 4e 0a 20 20 20 20 20 20 53 45 4c 45 43 54  GIN.      SELECT
1910: 20 2a 20 46 52 4f 4d 3b 20 20 2d 2d 20 53 79 6e   * FROM;  -- Syn
1920: 74 61 78 20 65 72 72 6f 72 0a 20 20 20 20 45 4e  tax error.    EN
1930: 44 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 6e 65 61  D;.  }.} {1 {nea
1940: 72 20 22 3b 22 3a 20 73 79 6e 74 61 78 20 65 72  r ";": syntax er
1950: 72 6f 72 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 72  ror}}.do_test tr
1960: 69 67 67 65 72 31 2d 32 2e 32 20 7b 0a 20 20 63  igger1-2.2 {.  c
1970: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 43 52  atchsql {.    CR
1980: 45 41 54 45 20 54 52 49 47 47 45 52 20 72 31 20  EATE TRIGGER r1 
1990: 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f 4e 20  AFTER INSERT ON 
19a0: 74 31 20 42 45 47 49 4e 0a 20 20 20 20 20 20 53  t1 BEGIN.      S
19b0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
19c0: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .      SELECT * 
19d0: 46 52 4f 4d 3b 20 20 2d 2d 20 53 79 6e 74 61 78  FROM;  -- Syntax
19e0: 20 65 72 72 6f 72 0a 20 20 20 20 45 4e 44 3b 0a   error.    END;.
19f0: 20 20 7d 0a 7d 20 7b 31 20 7b 6e 65 61 72 20 22    }.} {1 {near "
1a00: 3b 22 3a 20 73 79 6e 74 61 78 20 65 72 72 6f 72  ;": syntax error
1a10: 7d 7d 0a 0a 23 20 43 72 65 61 74 65 20 61 20 74  }}..# Create a t
1a20: 72 69 67 67 65 72 20 74 68 61 74 20 72 65 66 65  rigger that refe
1a30: 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20 74 68  rs to a table th
1a40: 61 74 20 6d 69 67 68 74 20 6e 6f 74 20 65 78 69  at might not exi
1a50: 73 74 2e 0a 23 0a 69 66 63 61 70 61 62 6c 65 20  st..#.ifcapable 
1a60: 74 65 6d 70 64 62 20 7b 0a 20 20 64 6f 5f 74 65  tempdb {.  do_te
1a70: 73 74 20 74 72 69 67 67 65 72 31 2d 33 2e 31 20  st trigger1-3.1 
1a80: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  {.    execsql {.
1a90: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 45 4d        CREATE TEM
1aa0: 50 20 54 41 42 4c 45 20 74 32 28 78 2c 79 29 3b  P TABLE t2(x,y);
1ab0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 74 63 68  .    }.    catch
1ac0: 73 71 6c 20 7b 0a 20 20 20 20 20 20 43 52 45 41  sql {.      CREA
1ad0: 54 45 20 54 52 49 47 47 45 52 20 72 31 20 41 46  TE TRIGGER r1 AF
1ae0: 54 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 74 31  TER INSERT ON t1
1af0: 20 42 45 47 49 4e 0a 20 20 20 20 20 20 20 20 49   BEGIN.        I
1b00: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
1b10: 4c 55 45 53 28 4e 45 57 2e 61 2c 4e 45 57 2e 62  LUES(NEW.a,NEW.b
1b20: 29 3b 0a 20 20 20 20 20 20 45 4e 44 3b 0a 20 20  );.      END;.  
1b30: 20 20 7d 0a 20 20 7d 20 7b 30 20 7b 7d 7d 0a 20    }.  } {0 {}}. 
1b40: 20 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72   do_test trigger
1b50: 31 2d 33 2e 32 20 7b 0a 20 20 20 20 63 61 74 63  1-3.2 {.    catc
1b60: 68 73 71 6c 20 7b 0a 20 20 20 20 20 20 49 4e 53  hsql {.      INS
1b70: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
1b80: 45 53 28 31 2c 32 29 3b 0a 20 20 20 20 20 20 53  ES(1,2);.      S
1b90: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b  ELECT * FROM t2;
1ba0: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20 7b 6e  .    }.  } {1 {n
1bb0: 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 6d 61  o such table: ma
1bc0: 69 6e 2e 74 32 7d 7d 0a 20 20 64 6f 5f 74 65 73  in.t2}}.  do_tes
1bd0: 74 20 74 72 69 67 67 65 72 31 2d 33 2e 33 20 7b  t trigger1-3.3 {
1be0: 0a 20 20 20 20 64 62 20 63 6c 6f 73 65 0a 20 20  .    db close.  
1bf0: 20 20 73 65 74 20 72 63 20 5b 63 61 74 63 68 20    set rc [catch 
1c00: 7b 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74  {sqlite3 db test
1c10: 2e 64 62 7d 20 65 72 72 5d 0a 20 20 20 20 69 66  .db} err].    if
1c20: 20 7b 24 72 63 7d 20 7b 6c 61 70 70 65 6e 64 20   {$rc} {lappend 
1c30: 72 63 20 24 65 72 72 7d 0a 20 20 20 20 73 65 74  rc $err}.    set
1c40: 20 72 63 0a 20 20 7d 20 7b 30 7d 0a 20 20 64 6f   rc.  } {0}.  do
1c50: 5f 74 65 73 74 20 74 72 69 67 67 65 72 31 2d 33  _test trigger1-3
1c60: 2e 34 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71  .4 {.    catchsq
1c70: 6c 20 7b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  l {.      INSERT
1c80: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
1c90: 31 2c 32 29 3b 0a 20 20 20 20 20 20 53 45 4c 45  1,2);.      SELE
1ca0: 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20  CT * FROM t2;.  
1cb0: 20 20 7d 0a 20 20 7d 20 7b 31 20 7b 6e 6f 20 73    }.  } {1 {no s
1cc0: 75 63 68 20 74 61 62 6c 65 3a 20 6d 61 69 6e 2e  uch table: main.
1cd0: 74 32 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 74  t2}}.  do_test t
1ce0: 72 69 67 67 65 72 31 2d 33 2e 35 20 7b 0a 20 20  rigger1-3.5 {.  
1cf0: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
1d00: 20 20 20 43 52 45 41 54 45 20 54 45 4d 50 20 54     CREATE TEMP T
1d10: 41 42 4c 45 20 74 32 28 78 2c 79 29 3b 0a 20 20  ABLE t2(x,y);.  
1d20: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1d30: 74 31 20 56 41 4c 55 45 53 28 31 2c 32 29 3b 0a  t1 VALUES(1,2);.
1d40: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
1d50: 52 4f 4d 20 74 32 3b 0a 20 20 20 20 7d 0a 20 20  ROM t2;.    }.  
1d60: 7d 20 7b 31 20 7b 6e 6f 20 73 75 63 68 20 74 61  } {1 {no such ta
1d70: 62 6c 65 3a 20 6d 61 69 6e 2e 74 32 7d 7d 0a 20  ble: main.t2}}. 
1d80: 20 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72   do_test trigger
1d90: 31 2d 33 2e 36 2e 31 20 7b 0a 20 20 20 20 63 61  1-3.6.1 {.    ca
1da0: 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 20 20 44  tchsql {.      D
1db0: 52 4f 50 20 54 52 49 47 47 45 52 20 72 31 3b 0a  ROP TRIGGER r1;.
1dc0: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 45 4d        CREATE TEM
1dd0: 50 20 54 52 49 47 47 45 52 20 72 31 20 41 46 54  P TRIGGER r1 AFT
1de0: 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 74 31 20  ER INSERT ON t1 
1df0: 42 45 47 49 4e 0a 20 20 20 20 20 20 20 20 49 4e  BEGIN.        IN
1e00: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
1e10: 55 45 53 28 4e 45 57 2e 61 2c 4e 45 57 2e 62 29  UES(NEW.a,NEW.b)
1e20: 2c 20 28 4e 45 57 2e 62 2a 31 30 30 2c 20 4e 45  , (NEW.b*100, NE
1e30: 57 2e 61 2a 31 30 30 29 3b 0a 20 20 20 20 20 20  W.a*100);.      
1e40: 45 4e 44 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  END;.      INSER
1e50: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
1e60: 28 31 2c 32 29 3b 0a 20 20 20 20 20 20 53 45 4c  (1,2);.      SEL
1e70: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20  ECT * FROM t2;. 
1e80: 20 20 20 7d 0a 20 20 7d 20 7b 30 20 7b 31 20 32     }.  } {0 {1 2
1e90: 20 32 30 30 20 31 30 30 7d 7d 0a 20 20 64 6f 5f   200 100}}.  do_
1ea0: 74 65 73 74 20 74 72 69 67 67 65 72 31 2d 33 2e  test trigger1-3.
1eb0: 36 2e 32 20 7b 0a 20 20 20 20 63 61 74 63 68 73  6.2 {.    catchs
1ec0: 71 6c 20 7b 0a 20 20 20 20 20 20 44 52 4f 50 20  ql {.      DROP 
1ed0: 54 52 49 47 47 45 52 20 72 31 3b 0a 20 20 20 20  TRIGGER r1;.    
1ee0: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31    DELETE FROM t1
1ef0: 3b 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46  ;.      DELETE F
1f00: 52 4f 4d 20 74 32 3b 0a 20 20 20 20 20 20 43 52  ROM t2;.      CR
1f10: 45 41 54 45 20 54 45 4d 50 20 54 52 49 47 47 45  EATE TEMP TRIGGE
1f20: 52 20 72 31 20 41 46 54 45 52 20 49 4e 53 45 52  R r1 AFTER INSER
1f30: 54 20 4f 4e 20 74 31 20 42 45 47 49 4e 0a 20 20  T ON t1 BEGIN.  
1f40: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
1f50: 4f 20 74 32 20 56 41 4c 55 45 53 28 4e 45 57 2e  O t2 VALUES(NEW.
1f60: 61 2c 4e 45 57 2e 62 29 3b 0a 20 20 20 20 20 20  a,NEW.b);.      
1f70: 45 4e 44 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  END;.      INSER
1f80: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
1f90: 28 31 2c 32 29 3b 0a 20 20 20 20 20 20 53 45 4c  (1,2);.      SEL
1fa0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20  ECT * FROM t2;. 
1fb0: 20 20 20 7d 0a 20 20 7d 20 7b 30 20 7b 31 20 32     }.  } {0 {1 2
1fc0: 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 74 72 69  }}.  do_test tri
1fd0: 67 67 65 72 31 2d 33 2e 37 20 7b 0a 20 20 20 20  gger1-3.7 {.    
1fe0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
1ff0: 44 52 4f 50 20 54 41 42 4c 45 20 74 32 3b 0a 20  DROP TABLE t2;. 
2000: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
2010: 45 20 74 32 28 78 2c 79 29 3b 0a 20 20 20 20 20  E t2(x,y);.     
2020: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
2030: 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a  2;.    }.  } {}.
2040: 0a 20 20 23 20 54 68 65 72 65 20 61 72 65 20 74  .  # There are t
2050: 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  wo versions of t
2060: 72 69 67 67 65 72 31 2d 33 2e 38 20 61 6e 64 20  rigger1-3.8 and 
2070: 74 72 69 67 67 65 72 31 2d 33 2e 39 2e 20 4f 6e  trigger1-3.9. On
2080: 65 20 74 68 61 74 20 75 73 65 73 0a 20 20 23 20  e that uses.  # 
2090: 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
20a0: 73 74 61 74 65 6d 65 6e 74 73 2c 20 61 6e 64 20  statements, and 
20b0: 61 6e 6f 74 68 65 72 20 74 68 61 74 20 64 6f 65  another that doe
20c0: 73 20 6e 6f 74 2e 0a 20 20 69 66 63 61 70 61 62  s not..  ifcapab
20d0: 6c 65 20 63 6f 6d 70 6f 75 6e 64 20 7b 0a 20 20  le compound {.  
20e0: 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 31  do_test trigger1
20f0: 2d 33 2e 38 20 7b 0a 20 20 20 20 65 78 65 63 73  -3.8 {.    execs
2100: 71 6c 20 7b 0a 20 20 20 20 20 20 49 4e 53 45 52  ql {.      INSER
2110: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
2120: 28 33 2c 34 29 3b 0a 20 20 20 20 20 20 53 45 4c  (3,4);.      SEL
2130: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 55 4e  ECT * FROM t1 UN
2140: 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 2a  ION ALL SELECT *
2150: 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 7d 0a   FROM t2;.    }.
2160: 20 20 7d 20 7b 31 20 32 20 33 20 34 20 33 20 34    } {1 2 3 4 3 4
2170: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 74 72 69 67  }.  do_test trig
2180: 67 65 72 31 2d 33 2e 39 20 7b 0a 20 20 20 20 64  ger1-3.9 {.    d
2190: 62 20 63 6c 6f 73 65 0a 20 20 20 20 73 71 6c 69  b close.    sqli
21a0: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
21b0: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
21c0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
21d0: 31 20 56 41 4c 55 45 53 28 35 2c 36 29 3b 0a 20  1 VALUES(5,6);. 
21e0: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
21f0: 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 41 4c 4c 20  OM t1 UNION ALL 
2200: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
2210: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20 32  ;.    }.  } {1 2
2220: 20 33 20 34 20 35 20 36 20 33 20 34 7d 0a 20 20   3 4 5 6 3 4}.  
2230: 7d 20 3b 23 20 69 66 63 61 70 61 62 6c 65 20 63  } ;# ifcapable c
2240: 6f 6d 70 6f 75 6e 64 0a 20 20 69 66 63 61 70 61  ompound.  ifcapa
2250: 62 6c 65 20 21 63 6f 6d 70 6f 75 6e 64 20 7b 0a  ble !compound {.
2260: 20 20 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65    do_test trigge
2270: 72 31 2d 33 2e 38 20 7b 0a 20 20 20 20 65 78 65  r1-3.8 {.    exe
2280: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 49 4e 53  csql {.      INS
2290: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
22a0: 45 53 28 33 2c 34 29 3b 0a 20 20 20 20 20 20 53  ES(3,4);.      S
22b0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
22c0: 20 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a   .      SELECT *
22d0: 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 7d 0a   FROM t2;.    }.
22e0: 20 20 7d 20 7b 31 20 32 20 33 20 34 20 33 20 34    } {1 2 3 4 3 4
22f0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 74 72 69 67  }.  do_test trig
2300: 67 65 72 31 2d 33 2e 39 20 7b 0a 20 20 20 20 64  ger1-3.9 {.    d
2310: 62 20 63 6c 6f 73 65 0a 20 20 20 20 73 71 6c 69  b close.    sqli
2320: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
2330: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
2340: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2350: 31 20 56 41 4c 55 45 53 28 35 2c 36 29 3b 0a 20  1 VALUES(5,6);. 
2360: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
2370: 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 53 45 4c  OM t1;.      SEL
2380: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20  ECT * FROM t2;. 
2390: 20 20 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20     }.  } {1 2 3 
23a0: 34 20 35 20 36 20 33 20 34 7d 0a 20 20 7d 20 3b  4 5 6 3 4}.  } ;
23b0: 23 20 69 66 63 61 70 61 62 6c 65 20 21 63 6f 6d  # ifcapable !com
23c0: 70 6f 75 6e 64 0a 0a 20 20 64 6f 5f 74 65 73 74  pound..  do_test
23d0: 20 74 72 69 67 67 65 72 31 2d 34 2e 31 20 7b 0a   trigger1-4.1 {.
23e0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
23f0: 20 20 20 20 43 52 45 41 54 45 20 54 45 4d 50 20      CREATE TEMP 
2400: 54 52 49 47 47 45 52 20 72 31 20 42 45 46 4f 52  TRIGGER r1 BEFOR
2410: 45 20 49 4e 53 45 52 54 20 4f 4e 20 74 31 20 42  E INSERT ON t1 B
2420: 45 47 49 4e 0a 20 20 20 20 20 20 20 20 49 4e 53  EGIN.        INS
2430: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
2440: 45 53 28 4e 45 57 2e 61 2c 4e 45 57 2e 62 29 3b  ES(NEW.a,NEW.b);
2450: 0a 20 20 20 20 20 20 45 4e 44 3b 0a 20 20 20 20  .      END;.    
2460: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
2470: 20 56 41 4c 55 45 53 28 37 2c 38 29 3b 0a 20 20   VALUES(7,8);.  
2480: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
2490: 4d 20 74 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  M t2;.    }.  } 
24a0: 7b 33 20 34 20 37 20 38 7d 0a 20 20 64 6f 5f 74  {3 4 7 8}.  do_t
24b0: 65 73 74 20 74 72 69 67 67 65 72 31 2d 34 2e 32  est trigger1-4.2
24c0: 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64   {.    sqlite3 d
24d0: 62 32 20 74 65 73 74 2e 64 62 0a 20 20 20 20 65  b2 test.db.    e
24e0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 49  xecsql {.      I
24f0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
2500: 4c 55 45 53 28 39 2c 31 30 29 3b 0a 20 20 20 20  LUES(9,10);.    
2510: 7d 20 64 62 32 3b 0a 20 20 20 20 64 62 32 20 63  } db2;.    db2 c
2520: 6c 6f 73 65 0a 20 20 20 20 65 78 65 63 73 71 6c  lose.    execsql
2530: 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20   {.      SELECT 
2540: 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 7d  * FROM t2;.    }
2550: 0a 20 20 7d 20 7b 33 20 34 20 37 20 38 7d 0a 20  .  } {3 4 7 8}. 
2560: 20 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72   do_test trigger
2570: 31 2d 34 2e 33 20 7b 0a 20 20 20 20 65 78 65 63  1-4.3 {.    exec
2580: 73 71 6c 20 7b 0a 20 20 20 20 20 20 44 52 4f 50  sql {.      DROP
2590: 20 54 41 42 4c 45 20 74 31 3b 0a 20 20 20 20 20   TABLE t1;.     
25a0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
25b0: 32 3b 0a 20 20 20 20 7d 3b 0a 20 20 7d 20 7b 33  2;.    };.  } {3
25c0: 20 34 20 37 20 38 7d 0a 20 20 64 6f 5f 74 65 73   4 7 8}.  do_tes
25d0: 74 20 74 72 69 67 67 65 72 31 2d 34 2e 34 20 7b  t trigger1-4.4 {
25e0: 0a 20 20 20 20 64 62 20 63 6c 6f 73 65 0a 20 20  .    db close.  
25f0: 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
2600: 74 2e 64 62 0a 20 20 20 20 65 78 65 63 73 71 6c  t.db.    execsql
2610: 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20   {.      SELECT 
2620: 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 7d  * FROM t2;.    }
2630: 3b 0a 20 20 7d 20 7b 33 20 34 20 37 20 38 7d 0a  ;.  } {3 4 7 8}.
2640: 7d 20 65 6c 73 65 20 7b 0a 20 20 65 78 65 63 73  } else {.  execs
2650: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
2660: 54 41 42 4c 45 20 74 32 28 78 2c 79 29 3b 0a 20  TABLE t2(x,y);. 
2670: 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74 31     DROP TABLE t1
2680: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
2690: 4f 20 74 32 20 56 41 4c 55 45 53 28 33 2c 20 34  O t2 VALUES(3, 4
26a0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
26b0: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 37 2c 20  TO t2 VALUES(7, 
26c0: 38 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 69 6e 74 65  8);.  }.}...inte
26d0: 67 72 69 74 79 5f 63 68 65 63 6b 20 74 72 69 67  grity_check trig
26e0: 67 65 72 31 2d 35 2e 31 0a 0a 23 20 43 72 65 61  ger1-5.1..# Crea
26f0: 74 65 20 61 20 74 72 69 67 67 65 72 20 77 69 74  te a trigger wit
2700: 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  h the same name 
2710: 61 73 20 61 20 74 61 62 6c 65 2e 20 20 4d 61 6b  as a table.  Mak
2720: 65 20 73 75 72 65 20 74 68 65 0a 23 20 74 72 69  e sure the.# tri
2730: 67 67 65 72 20 77 6f 72 6b 73 2e 20 20 54 68 65  gger works.  The
2740: 6e 20 64 72 6f 70 20 74 68 65 20 74 72 69 67 67  n drop the trigg
2750: 65 72 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74  er.  Make sure t
2760: 68 65 20 74 61 62 6c 65 20 69 73 0a 23 20 73 74  he table is.# st
2770: 69 6c 6c 20 74 68 65 72 65 2e 0a 23 0a 73 65 74  ill there..#.set
2780: 20 76 69 65 77 5f 76 31 20 7b 7d 0a 69 66 63 61   view_v1 {}.ifca
2790: 70 61 62 6c 65 20 76 69 65 77 20 7b 0a 20 20 73  pable view {.  s
27a0: 65 74 20 76 69 65 77 5f 76 31 20 7b 76 69 65 77  et view_v1 {view
27b0: 20 76 31 7d 0a 7d 0a 64 6f 5f 74 65 73 74 20 74   v1}.}.do_test t
27c0: 72 69 67 67 65 72 31 2d 36 2e 31 20 7b 0a 20 20  rigger1-6.1 {.  
27d0: 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54 20  execsql {SELECT 
27e0: 74 79 70 65 2c 20 6e 61 6d 65 20 46 52 4f 4d 20  type, name FROM 
27f0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 7d 0a 7d  sqlite_master}.}
2800: 20 5b 63 6f 6e 63 61 74 20 24 76 69 65 77 5f 76   [concat $view_v
2810: 31 20 7b 74 61 62 6c 65 20 74 32 7d 5d 0a 64 6f  1 {table t2}].do
2820: 5f 74 65 73 74 20 74 72 69 67 67 65 72 31 2d 36  _test trigger1-6
2830: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
2840: 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47  .    CREATE TRIG
2850: 47 45 52 20 74 32 20 42 45 46 4f 52 45 20 44 45  GER t2 BEFORE DE
2860: 4c 45 54 45 20 4f 4e 20 74 32 20 42 45 47 49 4e  LETE ON t2 BEGIN
2870: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 52 41  .      SELECT RA
2880: 49 53 45 28 41 42 4f 52 54 2c 27 64 65 6c 65 74  ISE(ABORT,'delet
2890: 65 73 20 61 72 65 20 6e 6f 74 20 70 65 72 6d 69  es are not permi
28a0: 74 74 65 64 27 29 3b 0a 20 20 20 20 45 4e 44 3b  tted');.    END;
28b0: 0a 20 20 20 20 53 45 4c 45 43 54 20 74 79 70 65  .    SELECT type
28c0: 2c 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69  , name FROM sqli
28d0: 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 7d 0a 7d  te_master;.  }.}
28e0: 20 5b 63 6f 6e 63 61 74 20 24 76 69 65 77 5f 76   [concat $view_v
28f0: 31 20 7b 74 61 62 6c 65 20 74 32 20 74 72 69 67  1 {table t2 trig
2900: 67 65 72 20 74 32 7d 5d 0a 64 6f 5f 74 65 73 74  ger t2}].do_test
2910: 20 74 72 69 67 67 65 72 31 2d 36 2e 33 20 7b 0a   trigger1-6.3 {.
2920: 20 20 63 61 74 63 68 73 71 6c 20 7b 44 45 4c 45    catchsql {DELE
2930: 54 45 20 46 52 4f 4d 20 74 32 7d 0a 7d 20 7b 31  TE FROM t2}.} {1
2940: 20 7b 64 65 6c 65 74 65 73 20 61 72 65 20 6e 6f   {deletes are no
2950: 74 20 70 65 72 6d 69 74 74 65 64 7d 7d 0a 76 65  t permitted}}.ve
2960: 72 69 66 79 5f 65 78 5f 65 72 72 63 6f 64 65 20  rify_ex_errcode 
2970: 74 72 69 67 67 65 72 31 2d 36 2e 33 62 20 53 51  trigger1-6.3b SQ
2980: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
2990: 54 52 49 47 47 45 52 0a 64 6f 5f 74 65 73 74 20  TRIGGER.do_test 
29a0: 74 72 69 67 67 65 72 31 2d 36 2e 34 20 7b 0a 20  trigger1-6.4 {. 
29b0: 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54   execsql {SELECT
29c0: 20 2a 20 46 52 4f 4d 20 74 32 7d 0a 7d 20 7b 33   * FROM t2}.} {3
29d0: 20 34 20 37 20 38 7d 0a 64 6f 5f 74 65 73 74 20   4 7 8}.do_test 
29e0: 74 72 69 67 67 65 72 31 2d 36 2e 35 20 7b 0a 20  trigger1-6.5 {. 
29f0: 20 64 62 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69   db close.  sqli
2a00: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
2a10: 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54   execsql {SELECT
2a20: 20 74 79 70 65 2c 20 6e 61 6d 65 20 46 52 4f 4d   type, name FROM
2a30: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 7d 0a   sqlite_master}.
2a40: 7d 20 5b 63 6f 6e 63 61 74 20 24 76 69 65 77 5f  } [concat $view_
2a50: 76 31 20 7b 74 61 62 6c 65 20 74 32 20 74 72 69  v1 {table t2 tri
2a60: 67 67 65 72 20 74 32 7d 5d 0a 64 6f 5f 74 65 73  gger t2}].do_tes
2a70: 74 20 74 72 69 67 67 65 72 31 2d 36 2e 36 20 7b  t trigger1-6.6 {
2a80: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
2a90: 20 44 52 4f 50 20 54 52 49 47 47 45 52 20 74 32   DROP TRIGGER t2
2aa0: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 74 79 70  ;.    SELECT typ
2ab0: 65 2c 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c  e, name FROM sql
2ac0: 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 7d 0a  ite_master;.  }.
2ad0: 7d 20 5b 63 6f 6e 63 61 74 20 24 76 69 65 77 5f  } [concat $view_
2ae0: 76 31 20 7b 74 61 62 6c 65 20 74 32 7d 5d 0a 64  v1 {table t2}].d
2af0: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 31 2d  o_test trigger1-
2b00: 36 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  6.7 {.  execsql 
2b10: 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  {SELECT * FROM t
2b20: 32 7d 0a 7d 20 7b 33 20 34 20 37 20 38 7d 0a 64  2}.} {3 4 7 8}.d
2b30: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 31 2d  o_test trigger1-
2b40: 36 2e 38 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65  6.8 {.  db close
2b50: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
2b60: 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20  st.db.  execsql 
2b70: 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  {SELECT * FROM t
2b80: 32 7d 0a 7d 20 7b 33 20 34 20 37 20 38 7d 0a 0a  2}.} {3 4 7 8}..
2b90: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
2ba0: 74 72 69 67 67 65 72 31 2d 37 2e 31 0a 0a 23 20  trigger1-7.1..# 
2bb0: 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75  Check to make su
2bc0: 72 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  re the name of a
2bd0: 20 74 72 69 67 67 65 72 20 63 61 6e 20 62 65 20   trigger can be 
2be0: 71 75 6f 74 65 64 20 73 6f 20 74 68 61 74 20 6b  quoted so that k
2bf0: 65 79 77 6f 72 64 73 0a 23 20 63 61 6e 20 62 65  eywords.# can be
2c00: 20 75 73 65 64 20 61 73 20 74 72 69 67 67 65 72   used as trigger
2c10: 20 6e 61 6d 65 73 2e 20 20 54 69 63 6b 65 74 20   names.  Ticket 
2c20: 23 34 36 38 0a 23 0a 64 6f 5f 74 65 73 74 20 74  #468.#.do_test t
2c30: 72 69 67 67 65 72 31 2d 38 2e 31 20 7b 0a 20 20  rigger1-8.1 {.  
2c40: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
2c50: 45 41 54 45 20 54 52 49 47 47 45 52 20 27 74 72  EATE TRIGGER 'tr
2c60: 69 67 67 65 72 27 20 41 46 54 45 52 20 49 4e 53  igger' AFTER INS
2c70: 45 52 54 20 4f 4e 20 74 32 20 42 45 47 49 4e 20  ERT ON t2 BEGIN 
2c80: 53 45 4c 45 43 54 20 31 3b 20 45 4e 44 3b 0a 20  SELECT 1; END;. 
2c90: 20 20 20 53 45 4c 45 43 54 20 6e 61 6d 65 20 46     SELECT name F
2ca0: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
2cb0: 72 20 57 48 45 52 45 20 74 79 70 65 3d 27 74 72  r WHERE type='tr
2cc0: 69 67 67 65 72 27 3b 0a 20 20 7d 0a 7d 20 7b 74  igger';.  }.} {t
2cd0: 72 69 67 67 65 72 7d 0a 64 6f 5f 74 65 73 74 20  rigger}.do_test 
2ce0: 74 72 69 67 67 65 72 31 2d 38 2e 32 20 7b 0a 20  trigger1-8.2 {. 
2cf0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44   execsql {.    D
2d00: 52 4f 50 20 54 52 49 47 47 45 52 20 27 74 72 69  ROP TRIGGER 'tri
2d10: 67 67 65 72 27 3b 0a 20 20 20 20 53 45 4c 45 43  gger';.    SELEC
2d20: 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69  T name FROM sqli
2d30: 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20  te_master WHERE 
2d40: 74 79 70 65 3d 27 74 72 69 67 67 65 72 27 3b 0a  type='trigger';.
2d50: 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
2d60: 20 74 72 69 67 67 65 72 31 2d 38 2e 33 20 7b 0a   trigger1-8.3 {.
2d70: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
2d80: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 22  CREATE TRIGGER "
2d90: 74 72 69 67 67 65 72 22 20 41 46 54 45 52 20 49  trigger" AFTER I
2da0: 4e 53 45 52 54 20 4f 4e 20 74 32 20 42 45 47 49  NSERT ON t2 BEGI
2db0: 4e 20 53 45 4c 45 43 54 20 31 3b 20 45 4e 44 3b  N SELECT 1; END;
2dc0: 0a 20 20 20 20 53 45 4c 45 43 54 20 6e 61 6d 65  .    SELECT name
2dd0: 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
2de0: 74 65 72 20 57 48 45 52 45 20 74 79 70 65 3d 27  ter WHERE type='
2df0: 74 72 69 67 67 65 72 27 3b 0a 20 20 7d 0a 7d 20  trigger';.  }.} 
2e00: 7b 74 72 69 67 67 65 72 7d 0a 64 6f 5f 74 65 73  {trigger}.do_tes
2e10: 74 20 74 72 69 67 67 65 72 31 2d 38 2e 34 20 7b  t trigger1-8.4 {
2e20: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
2e30: 20 44 52 4f 50 20 54 52 49 47 47 45 52 20 22 74   DROP TRIGGER "t
2e40: 72 69 67 67 65 72 22 3b 0a 20 20 20 20 53 45 4c  rigger";.    SEL
2e50: 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71  ECT name FROM sq
2e60: 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52  lite_master WHER
2e70: 45 20 74 79 70 65 3d 27 74 72 69 67 67 65 72 27  E type='trigger'
2e80: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
2e90: 73 74 20 74 72 69 67 67 65 72 31 2d 38 2e 35 20  st trigger1-8.5 
2ea0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
2eb0: 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52    CREATE TRIGGER
2ec0: 20 5b 74 72 69 67 67 65 72 5d 20 41 46 54 45 52   [trigger] AFTER
2ed0: 20 49 4e 53 45 52 54 20 4f 4e 20 74 32 20 42 45   INSERT ON t2 BE
2ee0: 47 49 4e 20 53 45 4c 45 43 54 20 31 3b 20 45 4e  GIN SELECT 1; EN
2ef0: 44 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 6e 61  D;.    SELECT na
2f00: 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  me FROM sqlite_m
2f10: 61 73 74 65 72 20 57 48 45 52 45 20 74 79 70 65  aster WHERE type
2f20: 3d 27 74 72 69 67 67 65 72 27 3b 0a 20 20 7d 0a  ='trigger';.  }.
2f30: 7d 20 7b 74 72 69 67 67 65 72 7d 0a 64 6f 5f 74  } {trigger}.do_t
2f40: 65 73 74 20 74 72 69 67 67 65 72 31 2d 38 2e 36  est trigger1-8.6
2f50: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
2f60: 20 20 20 44 52 4f 50 20 54 52 49 47 47 45 52 20     DROP TRIGGER 
2f70: 5b 74 72 69 67 67 65 72 5d 3b 0a 20 20 20 20 53  [trigger];.    S
2f80: 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20  ELECT name FROM 
2f90: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48  sqlite_master WH
2fa0: 45 52 45 20 74 79 70 65 3d 27 74 72 69 67 67 65  ERE type='trigge
2fb0: 72 27 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 69 66  r';.  }.} {}..if
2fc0: 63 61 70 61 62 6c 65 20 63 6f 6e 66 6c 69 63 74  capable conflict
2fd0: 20 7b 0a 20 20 23 20 4d 61 6b 65 20 73 75 72 65   {.  # Make sure
2fe0: 20 52 45 50 4c 41 43 45 20 77 6f 72 6b 73 20 69   REPLACE works i
2ff0: 6e 73 69 64 65 20 6f 66 20 74 72 69 67 67 65 72  nside of trigger
3000: 73 2e 0a 20 20 23 0a 20 20 23 20 54 68 65 72 65  s..  #.  # There
3010: 20 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e   are two version
3020: 73 20 6f 66 20 74 72 69 67 67 65 72 31 2d 39 2e  s of trigger1-9.
3030: 31 20 61 6e 64 20 74 72 69 67 67 65 72 31 2d 39  1 and trigger1-9
3040: 2e 32 2e 20 4f 6e 65 20 74 68 61 74 20 75 73 65  .2. One that use
3050: 73 0a 20 20 23 20 63 6f 6d 70 6f 75 6e 64 20 53  s.  # compound S
3060: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
3070: 2c 20 61 6e 64 20 61 6e 6f 74 68 65 72 20 74 68  , and another th
3080: 61 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 69  at does not..  i
3090: 66 63 61 70 61 62 6c 65 20 63 6f 6d 70 6f 75 6e  fcapable compoun
30a0: 64 20 7b 0a 20 20 20 20 64 6f 5f 74 65 73 74 20  d {.    do_test 
30b0: 74 72 69 67 67 65 72 31 2d 39 2e 31 20 7b 0a 20  trigger1-9.1 {. 
30c0: 20 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20       execsql {. 
30d0: 20 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41         CREATE TA
30e0: 42 4c 45 20 74 33 28 61 2c 62 29 3b 0a 20 20 20  BLE t3(a,b);.   
30f0: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
3100: 45 20 74 34 28 78 20 55 4e 49 51 55 45 2c 20 62  E t4(x UNIQUE, b
3110: 29 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41 54  );.        CREAT
3120: 45 20 54 52 49 47 47 45 52 20 72 33 34 20 41 46  E TRIGGER r34 AF
3130: 54 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 74 33  TER INSERT ON t3
3140: 20 42 45 47 49 4e 0a 20 20 20 20 20 20 20 20 20   BEGIN.         
3150: 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 74 34   REPLACE INTO t4
3160: 20 56 41 4c 55 45 53 28 6e 65 77 2e 61 2c 6e 65   VALUES(new.a,ne
3170: 77 2e 62 29 3b 0a 20 20 20 20 20 20 20 20 45 4e  w.b);.        EN
3180: 44 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52  D;.        INSER
3190: 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53  T INTO t3 VALUES
31a0: 28 31 2c 32 29 3b 0a 20 20 20 20 20 20 20 20 53  (1,2);.        S
31b0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 20  ELECT * FROM t3 
31c0: 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54  UNION ALL SELECT
31d0: 20 39 39 2c 20 39 39 20 55 4e 49 4f 4e 20 41 4c   99, 99 UNION AL
31e0: 4c 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  L SELECT * FROM 
31f0: 74 34 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t4;.      }.    
3200: 7d 20 7b 31 20 32 20 39 39 20 39 39 20 31 20 32  } {1 2 99 99 1 2
3210: 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 74 72  }.    do_test tr
3220: 69 67 67 65 72 31 2d 39 2e 32 20 7b 0a 20 20 20  igger1-9.2 {.   
3230: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
3240: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
3250: 20 74 33 20 56 41 4c 55 45 53 28 31 2c 33 29 3b   t3 VALUES(1,3);
3260: 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  .        SELECT 
3270: 2a 20 46 52 4f 4d 20 74 33 20 55 4e 49 4f 4e 20  * FROM t3 UNION 
3280: 41 4c 4c 20 53 45 4c 45 43 54 20 39 39 2c 20 39  ALL SELECT 99, 9
3290: 39 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45  9 UNION ALL SELE
32a0: 43 54 20 2a 20 46 52 4f 4d 20 74 34 3b 0a 20 20  CT * FROM t4;.  
32b0: 20 20 20 20 7d 0a 20 20 20 20 7d 20 7b 31 20 32      }.    } {1 2
32c0: 20 31 20 33 20 39 39 20 39 39 20 31 20 33 7d 0a   1 3 99 99 1 3}.
32d0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 64    } else {.    d
32e0: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 31 2d  o_test trigger1-
32f0: 39 2e 31 20 7b 0a 20 20 20 20 20 20 65 78 65 63  9.1 {.      exec
3300: 73 71 6c 20 7b 0a 20 20 20 20 20 20 20 20 43 52  sql {.        CR
3310: 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 61 2c  EATE TABLE t3(a,
3320: 62 29 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41  b);.        CREA
3330: 54 45 20 54 41 42 4c 45 20 74 34 28 78 20 55 4e  TE TABLE t4(x UN
3340: 49 51 55 45 2c 20 62 29 3b 0a 20 20 20 20 20 20  IQUE, b);.      
3350: 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52    CREATE TRIGGER
3360: 20 72 33 34 20 41 46 54 45 52 20 49 4e 53 45 52   r34 AFTER INSER
3370: 54 20 4f 4e 20 74 33 20 42 45 47 49 4e 0a 20 20  T ON t3 BEGIN.  
3380: 20 20 20 20 20 20 20 20 52 45 50 4c 41 43 45 20          REPLACE 
3390: 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 6e  INTO t4 VALUES(n
33a0: 65 77 2e 61 2c 6e 65 77 2e 62 29 3b 0a 20 20 20  ew.a,new.b);.   
33b0: 20 20 20 20 20 45 4e 44 3b 0a 20 20 20 20 20 20       END;.      
33c0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
33d0: 20 56 41 4c 55 45 53 28 31 2c 32 29 3b 0a 20 20   VALUES(1,2);.  
33e0: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
33f0: 52 4f 4d 20 74 33 3b 20 53 45 4c 45 43 54 20 39  ROM t3; SELECT 9
3400: 39 2c 20 39 39 3b 20 53 45 4c 45 43 54 20 2a 20  9, 99; SELECT * 
3410: 46 52 4f 4d 20 74 34 3b 0a 20 20 20 20 20 20 7d  FROM t4;.      }
3420: 0a 20 20 20 20 7d 20 7b 31 20 32 20 39 39 20 39  .    } {1 2 99 9
3430: 39 20 31 20 32 7d 0a 20 20 20 20 64 6f 5f 74 65  9 1 2}.    do_te
3440: 73 74 20 74 72 69 67 67 65 72 31 2d 39 2e 32 20  st trigger1-9.2 
3450: 7b 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c 20  {.      execsql 
3460: 7b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  {.        INSERT
3470: 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28   INTO t3 VALUES(
3480: 31 2c 33 29 3b 0a 20 20 20 20 20 20 20 20 53 45  1,3);.        SE
3490: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b 20  LECT * FROM t3; 
34a0: 53 45 4c 45 43 54 20 39 39 2c 20 39 39 3b 20 53  SELECT 99, 99; S
34b0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 34 3b  ELECT * FROM t4;
34c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 7b  .      }.    } {
34d0: 31 20 32 20 31 20 33 20 39 39 20 39 39 20 31 20  1 2 1 3 99 99 1 
34e0: 33 7d 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c  3}.  }.  execsql
34f0: 20 7b 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c   {.    DROP TABL
3500: 45 20 74 33 3b 0a 20 20 20 20 44 52 4f 50 20 54  E t3;.    DROP T
3510: 41 42 4c 45 20 74 34 3b 0a 20 20 7d 0a 7d 0a 0a  ABLE t4;.  }.}..
3520: 0a 23 20 54 69 63 6b 65 74 20 23 37 36 34 2e 20  .# Ticket #764. 
3530: 41 74 20 6f 6e 65 20 73 74 61 67 65 20 54 45 4d  At one stage TEM
3540: 50 20 74 72 69 67 67 65 72 73 20 77 6f 75 6c 64  P triggers would
3550: 20 66 61 69 6c 20 74 6f 20 72 65 2d 69 6e 73 74   fail to re-inst
3560: 61 6c 6c 20 77 68 65 6e 20 74 68 65 0a 23 20 73  all when the.# s
3570: 63 68 65 6d 61 20 77 61 73 20 72 65 6c 6f 61 64  chema was reload
3580: 65 64 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ed. The followin
3590: 67 20 74 65 73 74 73 20 65 6e 73 75 72 65 20 74  g tests ensure t
35a0: 68 61 74 20 54 45 4d 50 20 74 72 69 67 67 65 72  hat TEMP trigger
35b0: 73 20 61 72 65 0a 23 20 63 6f 72 72 65 63 74 6c  s are.# correctl
35c0: 79 20 72 65 2d 69 6e 73 74 61 6c 6c 65 64 2e 0a  y re-installed..
35d0: 23 0a 23 20 41 6c 73 6f 20 76 65 72 69 66 79 20  #.# Also verify 
35e0: 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73 20  that references 
35f0: 77 69 74 68 69 6e 20 74 72 69 67 67 65 72 20 70  within trigger p
3600: 72 6f 67 72 61 6d 73 20 61 72 65 20 72 65 73 6f  rograms are reso
3610: 6c 76 65 64 20 61 74 0a 23 20 73 74 61 74 65 6d  lved at.# statem
3620: 65 6e 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65  ent compile time
3630: 2c 20 6e 6f 74 20 74 72 69 67 67 65 72 20 69 6e  , not trigger in
3640: 73 74 61 6c 6c 61 74 69 6f 6e 20 74 69 6d 65 2e  stallation time.
3650: 20 54 68 69 73 20 6d 65 61 6e 73 2c 20 66 6f 72   This means, for
3660: 0a 23 20 65 78 61 6d 70 6c 65 2c 20 74 68 61 74  .# example, that
3670: 20 79 6f 75 20 63 61 6e 20 64 72 6f 70 20 61 6e   you can drop an
3680: 64 20 72 65 2d 63 72 65 61 74 65 20 74 61 62 6c  d re-create tabl
3690: 65 73 20 72 65 66 65 72 65 6e 63 65 64 20 62 79  es referenced by
36a0: 20 74 72 69 67 67 65 72 73 2e 20 0a 69 66 63 61   triggers. .ifca
36b0: 70 61 62 6c 65 20 74 65 6d 70 64 62 26 26 61 74  pable tempdb&&at
36c0: 74 61 63 68 20 7b 0a 20 20 64 6f 5f 74 65 73 74  tach {.  do_test
36d0: 20 74 72 69 67 67 65 72 31 2d 31 30 2e 30 20 7b   trigger1-10.0 {
36e0: 0a 20 20 20 20 66 6f 72 63 65 64 65 6c 65 74 65  .    forcedelete
36f0: 20 74 65 73 74 32 2e 64 62 0a 20 20 20 20 66 6f   test2.db.    fo
3700: 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 32 2e  rcedelete test2.
3710: 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 65  db-journal.    e
3720: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 41  xecsql {.      A
3730: 54 54 41 43 48 20 27 74 65 73 74 32 2e 64 62 27  TTACH 'test2.db'
3740: 20 41 53 20 61 75 78 3b 0a 20 20 20 20 7d 0a 20   AS aux;.    }. 
3750: 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20   } {}.  do_test 
3760: 74 72 69 67 67 65 72 31 2d 31 30 2e 31 20 7b 0a  trigger1-10.1 {.
3770: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
3780: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
3790: 20 6d 61 69 6e 2e 74 34 28 61 2c 20 62 2c 20 63   main.t4(a, b, c
37a0: 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  );.      CREATE 
37b0: 54 41 42 4c 45 20 74 65 6d 70 2e 74 34 28 61 2c  TABLE temp.t4(a,
37c0: 20 62 2c 20 63 29 3b 0a 20 20 20 20 20 20 43 52   b, c);.      CR
37d0: 45 41 54 45 20 54 41 42 4c 45 20 61 75 78 2e 74  EATE TABLE aux.t
37e0: 34 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20  4(a, b, c);.    
37f0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 69    CREATE TABLE i
3800: 6e 73 65 72 74 5f 6c 6f 67 28 64 62 2c 20 61 2c  nsert_log(db, a,
3810: 20 62 2c 20 63 29 3b 0a 20 20 20 20 7d 0a 20 20   b, c);.    }.  
3820: 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 74  } {}.  do_test t
3830: 72 69 67 67 65 72 31 2d 31 30 2e 32 20 7b 0a 20  rigger1-10.2 {. 
3840: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
3850: 20 20 20 43 52 45 41 54 45 20 54 45 4d 50 20 54     CREATE TEMP T
3860: 52 49 47 47 45 52 20 74 72 69 67 31 20 41 46 54  RIGGER trig1 AFT
3870: 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 6d 61 69  ER INSERT ON mai
3880: 6e 2e 74 34 20 42 45 47 49 4e 20 0a 20 20 20 20  n.t4 BEGIN .    
3890: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
38a0: 69 6e 73 65 72 74 5f 6c 6f 67 20 56 41 4c 55 45  insert_log VALUE
38b0: 53 28 27 6d 61 69 6e 27 2c 20 6e 65 77 2e 61 2c  S('main', new.a,
38c0: 20 6e 65 77 2e 62 2c 20 6e 65 77 2e 63 29 3b 0a   new.b, new.c);.
38d0: 20 20 20 20 20 20 45 4e 44 3b 0a 20 20 20 20 20        END;.     
38e0: 20 43 52 45 41 54 45 20 54 45 4d 50 20 54 52 49   CREATE TEMP TRI
38f0: 47 47 45 52 20 74 72 69 67 32 20 41 46 54 45 52  GGER trig2 AFTER
3900: 20 49 4e 53 45 52 54 20 4f 4e 20 74 65 6d 70 2e   INSERT ON temp.
3910: 74 34 20 42 45 47 49 4e 20 0a 20 20 20 20 20 20  t4 BEGIN .      
3920: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 69 6e    INSERT INTO in
3930: 73 65 72 74 5f 6c 6f 67 20 56 41 4c 55 45 53 28  sert_log VALUES(
3940: 27 74 65 6d 70 27 2c 20 6e 65 77 2e 61 2c 20 6e  'temp', new.a, n
3950: 65 77 2e 62 2c 20 6e 65 77 2e 63 29 3b 0a 20 20  ew.b, new.c);.  
3960: 20 20 20 20 45 4e 44 3b 0a 20 20 20 20 20 20 43      END;.      C
3970: 52 45 41 54 45 20 54 45 4d 50 20 54 52 49 47 47  REATE TEMP TRIGG
3980: 45 52 20 74 72 69 67 33 20 41 46 54 45 52 20 49  ER trig3 AFTER I
3990: 4e 53 45 52 54 20 4f 4e 20 61 75 78 2e 74 34 20  NSERT ON aux.t4 
39a0: 42 45 47 49 4e 20 0a 20 20 20 20 20 20 20 20 49  BEGIN .        I
39b0: 4e 53 45 52 54 20 49 4e 54 4f 20 69 6e 73 65 72  NSERT INTO inser
39c0: 74 5f 6c 6f 67 20 56 41 4c 55 45 53 28 27 61 75  t_log VALUES('au
39d0: 78 27 2c 20 6e 65 77 2e 61 2c 20 6e 65 77 2e 62  x', new.a, new.b
39e0: 2c 20 6e 65 77 2e 63 29 3b 0a 20 20 20 20 20 20  , new.c);.      
39f0: 45 4e 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b  END;.    }.  } {
3a00: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 74 72 69 67  }.  do_test trig
3a10: 67 65 72 31 2d 31 30 2e 33 20 7b 0a 20 20 20 20  ger1-10.3 {.    
3a20: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
3a30: 49 4e 53 45 52 54 20 49 4e 54 4f 20 6d 61 69 6e  INSERT INTO main
3a40: 2e 74 34 20 56 41 4c 55 45 53 28 31 2c 20 32 2c  .t4 VALUES(1, 2,
3a50: 20 33 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   3);.      INSER
3a60: 54 20 49 4e 54 4f 20 74 65 6d 70 2e 74 34 20 56  T INTO temp.t4 V
3a70: 41 4c 55 45 53 28 34 2c 20 35 2c 20 36 29 3b 0a  ALUES(4, 5, 6);.
3a80: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
3a90: 4f 20 61 75 78 2e 74 34 20 20 56 41 4c 55 45 53  O aux.t4  VALUES
3aa0: 28 37 2c 20 38 2c 20 39 29 3b 0a 20 20 20 20 7d  (7, 8, 9);.    }
3ab0: 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73  .  } {}.  do_tes
3ac0: 74 20 74 72 69 67 67 65 72 31 2d 31 30 2e 34 20  t trigger1-10.4 
3ad0: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  {.    execsql {.
3ae0: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
3af0: 52 4f 4d 20 69 6e 73 65 72 74 5f 6c 6f 67 3b 0a  ROM insert_log;.
3b00: 20 20 20 20 7d 0a 20 20 7d 20 7b 6d 61 69 6e 20      }.  } {main 
3b10: 31 20 32 20 33 20 74 65 6d 70 20 34 20 35 20 36  1 2 3 temp 4 5 6
3b20: 20 61 75 78 20 37 20 38 20 39 7d 0a 20 20 64 6f   aux 7 8 9}.  do
3b30: 5f 74 65 73 74 20 74 72 69 67 67 65 72 31 2d 31  _test trigger1-1
3b40: 30 2e 35 20 7b 0a 20 20 20 20 65 78 65 63 73 71  0.5 {.    execsq
3b50: 6c 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b  l {.      BEGIN;
3b60: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
3b70: 54 4f 20 6d 61 69 6e 2e 74 34 20 56 41 4c 55 45  TO main.t4 VALUE
3b80: 53 28 31 2c 20 32 2c 20 33 29 3b 0a 20 20 20 20  S(1, 2, 3);.    
3b90: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 65    INSERT INTO te
3ba0: 6d 70 2e 74 34 20 56 41 4c 55 45 53 28 34 2c 20  mp.t4 VALUES(4, 
3bb0: 35 2c 20 36 29 3b 0a 20 20 20 20 20 20 49 4e 53  5, 6);.      INS
3bc0: 45 52 54 20 49 4e 54 4f 20 61 75 78 2e 74 34 20  ERT INTO aux.t4 
3bd0: 20 56 41 4c 55 45 53 28 37 2c 20 38 2c 20 39 29   VALUES(7, 8, 9)
3be0: 3b 0a 20 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b  ;.      ROLLBACK
3bf0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20  ;.    }.  } {}. 
3c00: 20 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72   do_test trigger
3c10: 31 2d 31 30 2e 36 20 7b 0a 20 20 20 20 65 78 65  1-10.6 {.    exe
3c20: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c  csql {.      SEL
3c30: 45 43 54 20 2a 20 46 52 4f 4d 20 69 6e 73 65 72  ECT * FROM inser
3c40: 74 5f 6c 6f 67 3b 0a 20 20 20 20 7d 0a 20 20 7d  t_log;.    }.  }
3c50: 20 7b 6d 61 69 6e 20 31 20 32 20 33 20 74 65 6d   {main 1 2 3 tem
3c60: 70 20 34 20 35 20 36 20 61 75 78 20 37 20 38 20  p 4 5 6 aux 7 8 
3c70: 39 7d 0a 20 20 64 6f 5f 74 65 73 74 20 74 72 69  9}.  do_test tri
3c80: 67 67 65 72 31 2d 31 30 2e 37 20 7b 0a 20 20 20  gger1-10.7 {.   
3c90: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
3ca0: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 69 6e 73   DELETE FROM ins
3cb0: 65 72 74 5f 6c 6f 67 3b 0a 20 20 20 20 20 20 49  ert_log;.      I
3cc0: 4e 53 45 52 54 20 49 4e 54 4f 20 6d 61 69 6e 2e  NSERT INTO main.
3cd0: 74 34 20 56 41 4c 55 45 53 28 31 31 2c 20 31 32  t4 VALUES(11, 12
3ce0: 2c 20 31 33 29 3b 0a 20 20 20 20 20 20 49 4e 53  , 13);.      INS
3cf0: 45 52 54 20 49 4e 54 4f 20 74 65 6d 70 2e 74 34  ERT INTO temp.t4
3d00: 20 56 41 4c 55 45 53 28 31 34 2c 20 31 35 2c 20   VALUES(14, 15, 
3d10: 31 36 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  16);.      INSER
3d20: 54 20 49 4e 54 4f 20 61 75 78 2e 74 34 20 20 56  T INTO aux.t4  V
3d30: 41 4c 55 45 53 28 31 37 2c 20 31 38 2c 20 31 39  ALUES(17, 18, 19
3d40: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a  );.    }.  } {}.
3d50: 20 20 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65    do_test trigge
3d60: 72 31 2d 31 30 2e 38 20 7b 0a 20 20 20 20 65 78  r1-10.8 {.    ex
3d70: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45  ecsql {.      SE
3d80: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 69 6e 73 65  LECT * FROM inse
3d90: 72 74 5f 6c 6f 67 3b 0a 20 20 20 20 7d 0a 20 20  rt_log;.    }.  
3da0: 7d 20 7b 6d 61 69 6e 20 31 31 20 31 32 20 31 33  } {main 11 12 13
3db0: 20 74 65 6d 70 20 31 34 20 31 35 20 31 36 20 61   temp 14 15 16 a
3dc0: 75 78 20 31 37 20 31 38 20 31 39 7d 0a 20 20 64  ux 17 18 19}.  d
3dd0: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 31 2d  o_test trigger1-
3de0: 31 30 2e 39 20 7b 0a 20 20 23 20 44 72 6f 70 20  10.9 {.  # Drop 
3df0: 61 6e 64 20 72 65 2d 63 72 65 61 74 65 20 74 68  and re-create th
3e00: 65 20 69 6e 73 65 72 74 5f 6c 6f 67 20 74 61 62  e insert_log tab
3e10: 6c 65 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e  le in a differen
3e20: 74 20 64 61 74 61 62 61 73 65 2e 20 4e 6f 74 65  t database. Note
3e30: 0a 20 20 23 20 74 68 61 74 20 77 65 20 63 61 6e  .  # that we can
3e40: 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6c 75   change the colu
3e50: 6d 6e 20 6e 61 6d 65 73 20 62 65 63 61 75 73 65  mn names because
3e60: 20 74 68 65 20 74 72 69 67 67 65 72 20 70 72 6f   the trigger pro
3e70: 67 72 61 6d 73 20 64 6f 6e 27 74 0a 20 20 23 20  grams don't.  # 
3e80: 75 73 65 20 74 68 65 6d 20 65 78 70 6c 69 63 69  use them explici
3e90: 74 6c 79 2e 0a 20 20 20 20 65 78 65 63 73 71 6c  tly..    execsql
3ea0: 20 7b 0a 20 20 20 20 20 20 44 52 4f 50 20 54 41   {.      DROP TA
3eb0: 42 4c 45 20 69 6e 73 65 72 74 5f 6c 6f 67 3b 0a  BLE insert_log;.
3ec0: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
3ed0: 4c 45 20 61 75 78 2e 69 6e 73 65 72 74 5f 6c 6f  LE aux.insert_lo
3ee0: 67 28 64 62 2c 20 64 2c 20 65 2c 20 66 29 3b 0a  g(db, d, e, f);.
3ef0: 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64      }.  } {}.  d
3f00: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 31 2d  o_test trigger1-
3f10: 31 30 2e 31 30 20 7b 0a 20 20 20 20 65 78 65 63  10.10 {.    exec
3f20: 73 71 6c 20 7b 0a 20 20 20 20 20 20 49 4e 53 45  sql {.      INSE
3f30: 52 54 20 49 4e 54 4f 20 6d 61 69 6e 2e 74 34 20  RT INTO main.t4 
3f40: 56 41 4c 55 45 53 28 32 31 2c 20 32 32 2c 20 32  VALUES(21, 22, 2
3f50: 33 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  3);.      INSERT
3f60: 20 49 4e 54 4f 20 74 65 6d 70 2e 74 34 20 56 41   INTO temp.t4 VA
3f70: 4c 55 45 53 28 32 34 2c 20 32 35 2c 20 32 36 29  LUES(24, 25, 26)
3f80: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
3f90: 4e 54 4f 20 61 75 78 2e 74 34 20 20 56 41 4c 55  NTO aux.t4  VALU
3fa0: 45 53 28 32 37 2c 20 32 38 2c 20 32 39 29 3b 0a  ES(27, 28, 29);.
3fb0: 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64      }.  } {}.  d
3fc0: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 31 2d  o_test trigger1-
3fd0: 31 30 2e 31 31 20 7b 0a 20 20 20 20 65 78 65 63  10.11 {.    exec
3fe0: 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45  sql {.      SELE
3ff0: 43 54 20 2a 20 46 52 4f 4d 20 69 6e 73 65 72 74  CT * FROM insert
4000: 5f 6c 6f 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  _log;.    }.  } 
4010: 7b 6d 61 69 6e 20 32 31 20 32 32 20 32 33 20 74  {main 21 22 23 t
4020: 65 6d 70 20 32 34 20 32 35 20 32 36 20 61 75 78  emp 24 25 26 aux
4030: 20 32 37 20 32 38 20 32 39 7d 0a 7d 0a 0a 64 6f   27 28 29}.}..do
4040: 5f 74 65 73 74 20 74 72 69 67 67 65 72 31 2d 31  _test trigger1-1
4050: 31 2e 31 20 7b 0a 20 20 63 61 74 63 68 73 71 6c  1.1 {.  catchsql
4060: 20 7b 53 45 4c 45 43 54 20 72 61 69 73 65 28 61   {SELECT raise(a
4070: 62 6f 72 74 2c 27 6d 65 73 73 61 67 65 27 29 3b  bort,'message');
4080: 7d 0a 7d 20 7b 31 20 7b 52 41 49 53 45 28 29 20  }.} {1 {RAISE() 
4090: 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65 64  may only be used
40a0: 20 77 69 74 68 69 6e 20 61 20 74 72 69 67 67 65   within a trigge
40b0: 72 2d 70 72 6f 67 72 61 6d 7d 7d 0a 0a 64 6f 5f  r-program}}..do_
40c0: 74 65 73 74 20 74 72 69 67 67 65 72 31 2d 31 35  test trigger1-15
40d0: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
40e0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
40f0: 45 20 74 41 28 61 20 49 4e 54 45 47 45 52 20 50  E tA(a INTEGER P
4100: 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 2c 20 63  RIMARY KEY, b, c
4110: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 52  );.    CREATE TR
4120: 49 47 47 45 52 20 74 41 5f 74 72 69 67 67 65 72  IGGER tA_trigger
4130: 20 42 45 46 4f 52 45 20 55 50 44 41 54 45 20 4f   BEFORE UPDATE O
4140: 4e 20 22 74 41 22 20 42 45 47 49 4e 20 53 45 4c  N "tA" BEGIN SEL
4150: 45 43 54 20 31 3b 20 45 4e 44 3b 0a 20 20 20 20  ECT 1; END;.    
4160: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 41 20 56  INSERT INTO tA V
4170: 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 3b 0a  ALUES(1, 2, 3);.
4180: 20 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b    }.  catchsql {
4190: 20 55 50 44 41 54 45 20 74 41 20 53 45 54 20 61   UPDATE tA SET a
41a0: 20 3d 20 27 61 62 63 27 20 7d 0a 7d 20 7b 31 20   = 'abc' }.} {1 
41b0: 7b 64 61 74 61 74 79 70 65 20 6d 69 73 6d 61 74  {datatype mismat
41c0: 63 68 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69  ch}}.do_test tri
41d0: 67 67 65 72 31 2d 31 35 2e 32 20 7b 0a 20 20 63  gger1-15.2 {.  c
41e0: 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54  atchsql { INSERT
41f0: 20 49 4e 54 4f 20 74 41 20 56 41 4c 55 45 53 28   INTO tA VALUES(
4200: 27 61 62 63 27 2c 20 32 2c 20 33 29 20 7d 0a 7d  'abc', 2, 3) }.}
4210: 20 7b 31 20 7b 64 61 74 61 74 79 70 65 20 6d 69   {1 {datatype mi
4220: 73 6d 61 74 63 68 7d 7d 0a 0a 23 20 54 69 63 6b  smatch}}..# Tick
4230: 65 74 20 23 33 39 34 37 3a 20 20 44 6f 20 6e 6f  et #3947:  Do no
4240: 74 20 61 6c 6c 6f 77 20 71 75 61 6c 69 66 69 65  t allow qualifie
4250: 64 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 6f 6e  d table names on
4260: 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 2c   INSERT, UPDATE,
4270: 20 61 6e 64 0a 23 20 44 45 4c 45 54 45 20 73 74   and.# DELETE st
4280: 61 74 65 6d 65 6e 74 73 20 77 69 74 68 69 6e 20  atements within 
4290: 74 72 69 67 67 65 72 73 2e 20 20 41 63 74 75 61  triggers.  Actua
42a0: 6c 6c 79 2c 20 74 68 69 73 20 68 61 73 20 6e 65  lly, this has ne
42b0: 76 65 72 20 62 65 65 6e 20 61 6c 6c 6f 77 65 64  ver been allowed
42c0: 0a 23 20 62 79 20 74 68 65 20 67 72 61 6d 6d 61  .# by the gramma
42d0: 72 2e 20 20 42 75 74 20 74 68 65 20 65 72 72 6f  r.  But the erro
42e0: 72 20 6d 65 73 73 61 67 65 20 69 73 20 63 6f 6e  r message is con
42f0: 66 75 73 69 6e 67 3a 20 6f 6e 65 20 73 69 6d 70  fusing: one simp
4300: 6c 79 20 67 65 74 73 20 61 0a 23 20 22 73 79 6e  ly gets a.# "syn
4310: 74 61 78 20 65 72 72 6f 72 22 2e 20 20 54 68 61  tax error".  Tha
4320: 74 20 68 61 73 20 6e 6f 77 20 62 65 65 6e 20 63  t has now been c
4330: 68 61 6e 67 65 64 20 74 6f 20 67 69 76 65 20 61  hanged to give a
4340: 20 66 75 6c 6c 20 65 72 72 6f 72 20 6d 65 73 73   full error mess
4350: 61 67 65 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 74  age..#.do_test t
4360: 72 69 67 67 65 72 31 2d 31 36 2e 31 20 7b 0a 20  rigger1-16.1 {. 
4370: 20 64 62 20 65 76 61 6c 20 7b 0a 20 20 20 20 43   db eval {.    C
4380: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 36 28  REATE TABLE t16(
4390: 61 2c 62 2c 63 29 3b 0a 20 20 20 20 43 52 45 41  a,b,c);.    CREA
43a0: 54 45 20 49 4e 44 45 58 20 74 31 36 61 20 4f 4e  TE INDEX t16a ON
43b0: 20 74 31 36 28 61 29 3b 0a 20 20 20 20 43 52 45   t16(a);.    CRE
43c0: 41 54 45 20 49 4e 44 45 58 20 74 31 36 62 20 4f  ATE INDEX t16b O
43d0: 4e 20 74 31 36 28 62 29 3b 0a 20 20 7d 0a 20 20  N t16(b);.  }.  
43e0: 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 43  catchsql {.    C
43f0: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 6d 61  REATE TRIGGER ma
4400: 69 6e 2e 74 31 36 65 72 72 31 20 41 46 54 45 52  in.t16err1 AFTER
4410: 20 49 4e 53 45 52 54 20 4f 4e 20 74 41 20 42 45   INSERT ON tA BE
4420: 47 49 4e 0a 20 20 20 20 20 20 49 4e 53 45 52 54  GIN.      INSERT
4430: 20 49 4e 54 4f 20 6d 61 69 6e 2e 74 31 36 20 56   INTO main.t16 V
4440: 41 4c 55 45 53 28 31 2c 32 2c 33 29 3b 0a 20 20  ALUES(1,2,3);.  
4450: 20 20 45 4e 44 3b 0a 20 20 7d 0a 7d 20 7b 31 20    END;.  }.} {1 
4460: 7b 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65  {qualified table
4470: 20 6e 61 6d 65 73 20 61 72 65 20 6e 6f 74 20 61   names are not a
4480: 6c 6c 6f 77 65 64 20 6f 6e 20 49 4e 53 45 52 54  llowed on INSERT
4490: 2c 20 55 50 44 41 54 45 2c 20 61 6e 64 20 44 45  , UPDATE, and DE
44a0: 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20  LETE statements 
44b0: 77 69 74 68 69 6e 20 74 72 69 67 67 65 72 73 7d  within triggers}
44c0: 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65  }.do_test trigge
44d0: 72 31 2d 31 36 2e 32 20 7b 0a 20 20 63 61 74 63  r1-16.2 {.  catc
44e0: 68 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  hsql {.    CREAT
44f0: 45 20 54 52 49 47 47 45 52 20 6d 61 69 6e 2e 74  E TRIGGER main.t
4500: 31 36 65 72 72 32 20 41 46 54 45 52 20 49 4e 53  16err2 AFTER INS
4510: 45 52 54 20 4f 4e 20 74 41 20 42 45 47 49 4e 0a  ERT ON tA BEGIN.
4520: 20 20 20 20 20 20 55 50 44 41 54 45 20 6d 61 69        UPDATE mai
4530: 6e 2e 74 31 36 20 53 45 54 20 72 6f 77 69 64 3d  n.t16 SET rowid=
4540: 72 6f 77 69 64 2b 31 3b 0a 20 20 20 20 45 4e 44  rowid+1;.    END
4550: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 71 75 61 6c  ;.  }.} {1 {qual
4560: 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65  ified table name
4570: 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65  s are not allowe
4580: 64 20 6f 6e 20 49 4e 53 45 52 54 2c 20 55 50 44  d on INSERT, UPD
4590: 41 54 45 2c 20 61 6e 64 20 44 45 4c 45 54 45 20  ATE, and DELETE 
45a0: 73 74 61 74 65 6d 65 6e 74 73 20 77 69 74 68 69  statements withi
45b0: 6e 20 74 72 69 67 67 65 72 73 7d 7d 0a 64 6f 5f  n triggers}}.do_
45c0: 74 65 73 74 20 74 72 69 67 67 65 72 31 2d 31 36  test trigger1-16
45d0: 2e 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20  .3 {.  catchsql 
45e0: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49  {.    CREATE TRI
45f0: 47 47 45 52 20 6d 61 69 6e 2e 74 31 36 65 72 72  GGER main.t16err
4600: 33 20 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f  3 AFTER INSERT O
4610: 4e 20 74 41 20 42 45 47 49 4e 0a 20 20 20 20 20  N tA BEGIN.     
4620: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 6d 61 69   DELETE FROM mai
4630: 6e 2e 74 31 36 3b 0a 20 20 20 20 45 4e 44 3b 0a  n.t16;.    END;.
4640: 20 20 7d 0a 7d 20 7b 31 20 7b 71 75 61 6c 69 66    }.} {1 {qualif
4650: 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 73 20  ied table names 
4660: 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20  are not allowed 
4670: 6f 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54  on INSERT, UPDAT
4680: 45 2c 20 61 6e 64 20 44 45 4c 45 54 45 20 73 74  E, and DELETE st
4690: 61 74 65 6d 65 6e 74 73 20 77 69 74 68 69 6e 20  atements within 
46a0: 74 72 69 67 67 65 72 73 7d 7d 0a 64 6f 5f 74 65  triggers}}.do_te
46b0: 73 74 20 74 72 69 67 67 65 72 31 2d 31 36 2e 34  st trigger1-16.4
46c0: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a   {.  catchsql {.
46d0: 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47      CREATE TRIGG
46e0: 45 52 20 6d 61 69 6e 2e 74 31 36 65 72 72 34 20  ER main.t16err4 
46f0: 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f 4e 20  AFTER INSERT ON 
4700: 74 41 20 42 45 47 49 4e 0a 20 20 20 20 20 20 55  tA BEGIN.      U
4710: 50 44 41 54 45 20 74 31 36 20 4e 4f 54 20 49 4e  PDATE t16 NOT IN
4720: 44 45 58 45 44 20 53 45 54 20 72 6f 77 69 64 3d  DEXED SET rowid=
4730: 72 6f 77 69 64 2b 31 3b 0a 20 20 20 20 45 4e 44  rowid+1;.    END
4740: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 74 68 65 20  ;.  }.} {1 {the 
4750: 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75  NOT INDEXED clau
4760: 73 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  se is not allowe
4770: 64 20 6f 6e 20 55 50 44 41 54 45 20 6f 72 20 44  d on UPDATE or D
4780: 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 73  ELETE statements
4790: 20 77 69 74 68 69 6e 20 74 72 69 67 67 65 72 73   within triggers
47a0: 7d 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67  }}.do_test trigg
47b0: 65 72 31 2d 31 36 2e 35 20 7b 0a 20 20 63 61 74  er1-16.5 {.  cat
47c0: 63 68 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  chsql {.    CREA
47d0: 54 45 20 54 52 49 47 47 45 52 20 6d 61 69 6e 2e  TE TRIGGER main.
47e0: 74 31 36 65 72 72 35 20 41 46 54 45 52 20 49 4e  t16err5 AFTER IN
47f0: 53 45 52 54 20 4f 4e 20 74 41 20 42 45 47 49 4e  SERT ON tA BEGIN
4800: 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 74 31  .      UPDATE t1
4810: 36 20 49 4e 44 45 58 45 44 20 42 59 20 74 31 36  6 INDEXED BY t16
4820: 61 20 53 45 54 20 72 6f 77 69 64 3d 72 6f 77 69  a SET rowid=rowi
4830: 64 2b 31 20 57 48 45 52 45 20 61 3d 31 3b 0a 20  d+1 WHERE a=1;. 
4840: 20 20 20 45 4e 44 3b 0a 20 20 7d 0a 7d 20 7b 31     END;.  }.} {1
4850: 20 7b 74 68 65 20 49 4e 44 45 58 45 44 20 42 59   {the INDEXED BY
4860: 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61   clause is not a
4870: 6c 6c 6f 77 65 64 20 6f 6e 20 55 50 44 41 54 45  llowed on UPDATE
4880: 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65   or DELETE state
4890: 6d 65 6e 74 73 20 77 69 74 68 69 6e 20 74 72 69  ments within tri
48a0: 67 67 65 72 73 7d 7d 0a 64 6f 5f 74 65 73 74 20  ggers}}.do_test 
48b0: 74 72 69 67 67 65 72 31 2d 31 36 2e 36 20 7b 0a  trigger1-16.6 {.
48c0: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
48d0: 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20   CREATE TRIGGER 
48e0: 6d 61 69 6e 2e 74 31 36 65 72 72 36 20 41 46 54  main.t16err6 AFT
48f0: 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 74 41 20  ER INSERT ON tA 
4900: 42 45 47 49 4e 0a 20 20 20 20 20 20 44 45 4c 45  BEGIN.      DELE
4910: 54 45 20 46 52 4f 4d 20 74 31 36 20 4e 4f 54 20  TE FROM t16 NOT 
4920: 49 4e 44 45 58 45 44 20 57 48 45 52 45 20 61 3d  INDEXED WHERE a=
4930: 31 32 33 3b 0a 20 20 20 20 45 4e 44 3b 0a 20 20  123;.    END;.  
4940: 7d 0a 7d 20 7b 31 20 7b 74 68 65 20 4e 4f 54 20  }.} {1 {the NOT 
4950: 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65 20 69  INDEXED clause i
4960: 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e  s not allowed on
4970: 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
4980: 45 20 73 74 61 74 65 6d 65 6e 74 73 20 77 69 74  E statements wit
4990: 68 69 6e 20 74 72 69 67 67 65 72 73 7d 7d 0a 64  hin triggers}}.d
49a0: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 31 2d  o_test trigger1-
49b0: 31 36 2e 37 20 7b 0a 20 20 63 61 74 63 68 73 71  16.7 {.  catchsq
49c0: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
49d0: 52 49 47 47 45 52 20 6d 61 69 6e 2e 74 31 36 65  RIGGER main.t16e
49e0: 72 72 37 20 41 46 54 45 52 20 49 4e 53 45 52 54  rr7 AFTER INSERT
49f0: 20 4f 4e 20 74 41 20 42 45 47 49 4e 0a 20 20 20   ON tA BEGIN.   
4a00: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
4a10: 31 36 20 49 4e 44 45 58 45 44 20 42 59 20 74 31  16 INDEXED BY t1
4a20: 36 61 20 57 48 45 52 45 20 61 3d 31 32 33 3b 0a  6a WHERE a=123;.
4a30: 20 20 20 20 45 4e 44 3b 0a 20 20 7d 0a 7d 20 7b      END;.  }.} {
4a40: 31 20 7b 74 68 65 20 49 4e 44 45 58 45 44 20 42  1 {the INDEXED B
4a50: 59 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20  Y clause is not 
4a60: 61 6c 6c 6f 77 65 64 20 6f 6e 20 55 50 44 41 54  allowed on UPDAT
4a70: 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74  E or DELETE stat
4a80: 65 6d 65 6e 74 73 20 77 69 74 68 69 6e 20 74 72  ements within tr
4a90: 69 67 67 65 72 73 7d 7d 0a 0a 23 2d 2d 2d 2d 2d  iggers}}..#-----
4aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ae0: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74  ----.# Test that
4af0: 20 62 75 67 20 5b 33 34 63 64 35 35 64 36 38 65   bug [34cd55d68e
4b00: 30 65 36 65 37 63 5d 20 68 61 73 20 62 65 65 6e  0e6e7c] has been
4b10: 20 66 69 78 65 64 2e 0a 23 0a 64 6f 5f 65 78 65   fixed..#.do_exe
4b20: 63 73 71 6c 5f 74 65 73 74 20 74 72 69 67 67 65  csql_test trigge
4b30: 72 31 2d 31 37 2e 30 20 7b 0a 20 20 43 52 45 41  r1-17.0 {.  CREA
4b40: 54 45 20 54 41 42 4c 45 20 74 31 37 61 28 69 69  TE TABLE t17a(ii
4b50: 20 49 4e 54 29 3b 0a 20 20 43 52 45 41 54 45 20   INT);.  CREATE 
4b60: 54 41 42 4c 45 20 74 31 37 62 28 74 74 20 54 45  TABLE t17b(tt TE
4b70: 58 54 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  XT PRIMARY KEY, 
4b80: 73 73 29 3b 0a 20 20 43 52 45 41 54 45 20 54 52  ss);.  CREATE TR
4b90: 49 47 47 45 52 20 74 31 37 61 5f 61 69 20 41 46  IGGER t17a_ai AF
4ba0: 54 45 52 20 49 4e 53 45 52 54 20 4f 4e 20 74 31  TER INSERT ON t1
4bb0: 37 61 20 42 45 47 49 4e 0a 20 20 20 20 49 4e 53  7a BEGIN.    INS
4bc0: 45 52 54 20 49 4e 54 4f 20 74 31 37 62 28 74 74  ERT INTO t17b(tt
4bd0: 29 20 56 41 4c 55 45 53 28 6e 65 77 2e 69 69 29  ) VALUES(new.ii)
4be0: 3b 0a 20 20 45 4e 44 3b 0a 20 20 43 52 45 41 54  ;.  END;.  CREAT
4bf0: 45 20 54 52 49 47 47 45 52 20 74 31 37 62 5f 61  E TRIGGER t17b_a
4c00: 69 20 41 46 54 45 52 20 49 4e 53 45 52 54 20 4f  i AFTER INSERT O
4c10: 4e 20 74 31 37 62 20 42 45 47 49 4e 0a 20 20 20  N t17b BEGIN.   
4c20: 20 55 50 44 41 54 45 20 74 31 37 62 20 53 45 54   UPDATE t17b SET
4c30: 20 73 73 20 3d 20 34 3b 0a 20 20 45 4e 44 3b 0a   ss = 4;.  END;.
4c40: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
4c50: 37 61 28 69 69 29 20 56 41 4c 55 45 53 28 27 31  7a(ii) VALUES('1
4c60: 27 29 3b 0a 20 20 50 52 41 47 4d 41 20 69 6e 74  ');.  PRAGMA int
4c70: 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 7d 20  egrity_check;.} 
4c80: 7b 6f 6b 7d 0a 0a 66 69 6e 69 73 68 5f 74 65 73  {ok}..finish_tes
4c90: 74 0a                                            t.