/ Hex Artifact Content
Login

Artifact 5b0789f1c5c4600961f8e68511b825b87be53e31:


0000: 23 20 32 30 30 38 20 4a 61 6e 75 61 72 79 20 31  # 2008 January 1
0010: 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20  .#.# The author 
0020: 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69  disclaims copyri
0030: 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72  ght to this sour
0040: 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61  ce code.  In pla
0050: 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20  ce of.# a legal 
0060: 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20  notice, here is 
0070: 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20  a blessing:.#.# 
0080: 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f     May you do go
0090: 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e  od and not evil.
00a0: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69  .#    May you fi
00b0: 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66  nd forgiveness f
00c0: 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20  or yourself and 
00d0: 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a  forgive others..
00e0: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61  #    May you sha
00f0: 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72  re freely, never
0100: 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61   taking more tha
0110: 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a  n you give..#.#*
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 0a 23 20 54 68 69 73 20 66 69  ******.# This fi
0170: 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 72 65  le implements re
0180: 67 72 65 73 73 69 6f 6e 20 74 65 73 74 73 20 66  gression tests f
0190: 6f 72 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  or SQLite librar
01a0: 79 2e 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c  y. Specifically,
01b0: 0a 23 20 69 74 20 74 65 73 74 73 20 73 6f 6d 65  .# it tests some
01c0: 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69   compiler optimi
01d0: 7a 61 74 69 6f 6e 73 20 66 6f 72 20 53 51 4c 20  zations for SQL 
01e0: 73 74 61 74 65 6d 65 6e 74 73 20 66 65 61 74 75  statements featu
01f0: 72 69 6e 67 0a 23 20 74 72 69 67 67 65 72 73 3a  ring.# triggers:
0200: 0a 23 0a 23 0a 23 0a 0a 23 20 74 72 69 67 67 65  .#.#.#..# trigge
0210: 72 39 2d 31 2e 2a 20 2d 20 20 20 54 65 73 74 20  r9-1.* -   Test 
0220: 74 68 61 74 20 69 66 20 74 68 65 72 65 20 61 72  that if there ar
0230: 65 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 73 20  e no references 
0240: 74 6f 20 4f 4c 44 2e 2a 20 63 6f 6c 73 2c 20 6f  to OLD.* cols, o
0250: 72 20 61 0a 23 20 20 20 20 20 20 20 20 20 20 20  r a.#           
0260: 20 20 20 20 20 20 20 72 65 66 65 72 65 6e 63 65         reference
0270: 20 74 6f 20 6f 6e 6c 79 20 4f 4c 44 2e 72 6f 77   to only OLD.row
0280: 69 64 2c 20 74 68 65 20 64 61 74 61 20 69 73 20  id, the data is 
0290: 6e 6f 74 20 6c 6f 61 64 65 64 2e 0a 23 0a 23 20  not loaded..#.# 
02a0: 74 72 69 67 67 65 72 39 2d 32 2e 2a 20 2d 20 20  trigger9-2.* -  
02b0: 20 54 65 73 74 20 74 68 61 74 20 66 6f 72 20 4e   Test that for N
02c0: 45 57 2e 2a 20 72 65 63 6f 72 64 73 20 70 6f 70  EW.* records pop
02d0: 75 6c 61 74 65 64 20 62 79 20 55 50 44 41 54 45  ulated by UPDATE
02e0: 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20   .#             
02f0: 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 73 2c       statements,
0300: 20 75 6e 75 73 65 64 20 66 69 65 6c 64 73 20 61   unused fields a
0310: 72 65 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  re populated wit
0320: 68 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2e 20 0a  h NULL values. .
0330: 23 0a 23 20 74 72 69 67 67 65 72 39 2d 33 2e 2a  #.# trigger9-3.*
0340: 20 2d 20 20 20 54 65 73 74 20 74 68 61 74 20 74   -   Test that t
0350: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
0360: 6c 65 73 20 75 73 65 64 20 66 6f 72 20 4f 4c 44  les used for OLD
0370: 2e 2a 20 72 65 66 65 72 65 6e 63 65 73 0a 23 20  .* references.# 
0380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0390: 20 69 6e 20 22 49 4e 53 54 45 41 44 20 4f 46 22   in "INSTEAD OF"
03a0: 20 74 72 69 67 67 65 72 73 20 68 61 76 65 20 4e   triggers have N
03b0: 55 4c 4c 20 76 61 6c 75 65 73 20 69 6e 20 75 6e  ULL values in un
03c0: 75 73 65 64 20 0a 23 20 20 20 20 20 20 20 20 20  used .#         
03d0: 20 20 20 20 20 20 20 20 20 66 69 65 6c 64 73 2e           fields.
03e0: 0a 23 0a 0a 73 65 74 20 74 65 73 74 64 69 72 20  .#..set testdir 
03f0: 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 61  [file dirname $a
0400: 72 67 76 30 5d 0a 73 6f 75 72 63 65 20 24 74 65  rgv0].source $te
0410: 73 74 64 69 72 2f 74 65 73 74 65 72 2e 74 63 6c  stdir/tester.tcl
0420: 0a 69 66 63 61 70 61 62 6c 65 20 7b 21 74 72 69  .ifcapable {!tri
0430: 67 67 65 72 7d 20 7b 0a 20 20 66 69 6e 69 73 68  gger} {.  finish
0440: 5f 74 65 73 74 0a 20 20 72 65 74 75 72 6e 0a 7d  _test.  return.}
0450: 0a 0a 70 72 6f 63 20 68 61 73 5f 72 6f 77 64 61  ..proc has_rowda
0460: 74 61 20 7b 73 71 6c 7d 20 7b 0a 20 20 65 78 70  ta {sql} {.  exp
0470: 72 20 7b 5b 6c 73 65 61 72 63 68 20 5b 65 78 65  r {[lsearch [exe
0480: 63 73 71 6c 20 22 65 78 70 6c 61 69 6e 20 24 73  csql "explain $s
0490: 71 6c 22 5d 20 52 6f 77 44 61 74 61 5d 3e 3d 30  ql"] RowData]>=0
04a0: 7d 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 74 72 69  }.}..do_test tri
04b0: 67 67 65 72 39 2d 31 2e 31 20 7b 0a 20 20 65 78  gger9-1.1 {.  ex
04c0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
04d0: 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31  MA page_size = 1
04e0: 30 32 34 3b 0a 20 20 20 20 43 52 45 41 54 45 20  024;.    CREATE 
04f0: 54 41 42 4c 45 20 74 31 28 78 2c 20 79 2c 20 7a  TABLE t1(x, y, z
0500: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
0510: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 31 27  TO t1 VALUES('1'
0520: 2c 20 72 61 6e 64 73 74 72 28 31 30 30 30 30 2c  , randstr(10000,
0530: 31 30 30 30 30 29 2c 20 27 32 27 29 3b 0a 20 20  10000), '2');.  
0540: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
0550: 20 56 41 4c 55 45 53 28 27 32 27 2c 20 72 61 6e   VALUES('2', ran
0560: 64 73 74 72 28 31 30 30 30 30 2c 31 30 30 30 30  dstr(10000,10000
0570: 29 2c 20 27 34 27 29 3b 0a 20 20 20 20 49 4e 53  ), '4');.    INS
0580: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
0590: 45 53 28 27 33 27 2c 20 72 61 6e 64 73 74 72 28  ES('3', randstr(
05a0: 31 30 30 30 30 2c 31 30 30 30 30 29 2c 20 27 36  10000,10000), '6
05b0: 27 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  ');.    CREATE T
05c0: 41 42 4c 45 20 74 32 28 78 29 3b 0a 20 20 7d 0a  ABLE t2(x);.  }.
05d0: 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 74 72  } {}..do_test tr
05e0: 69 67 67 65 72 39 2d 31 2e 32 2e 31 20 7b 0a 20  igger9-1.2.1 {. 
05f0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
0600: 45 47 49 4e 3b 0a 20 20 20 20 20 20 43 52 45 41  EGIN;.      CREA
0610: 54 45 20 54 52 49 47 47 45 52 20 74 72 69 67 31  TE TRIGGER trig1
0620: 20 42 45 46 4f 52 45 20 44 45 4c 45 54 45 20 4f   BEFORE DELETE O
0630: 4e 20 74 31 20 42 45 47 49 4e 0a 20 20 20 20 20  N t1 BEGIN.     
0640: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
0650: 32 20 56 41 4c 55 45 53 28 6f 6c 64 2e 72 6f 77  2 VALUES(old.row
0660: 69 64 29 3b 0a 20 20 20 20 20 20 45 4e 44 3b 0a  id);.      END;.
0670: 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f        DELETE FRO
0680: 4d 20 74 31 3b 0a 20 20 20 20 20 20 53 45 4c 45  M t1;.      SELE
0690: 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20  CT * FROM t2;.  
06a0: 7d 0a 7d 20 7b 31 20 32 20 33 7d 0a 64 6f 5f 74  }.} {1 2 3}.do_t
06b0: 65 73 74 20 74 72 69 67 67 65 72 39 2d 31 2e 32  est trigger9-1.2
06c0: 2e 33 20 7b 0a 20 20 68 61 73 5f 72 6f 77 64 61  .3 {.  has_rowda
06d0: 74 61 20 7b 44 45 4c 45 54 45 20 46 52 4f 4d 20  ta {DELETE FROM 
06e0: 74 31 7d 0a 7d 20 30 0a 64 6f 5f 74 65 73 74 20  t1}.} 0.do_test 
06f0: 74 72 69 67 67 65 72 39 2d 31 2e 32 2e 34 20 7b  trigger9-1.2.4 {
0700: 20 65 78 65 63 73 71 6c 20 7b 20 52 4f 4c 4c 42   execsql { ROLLB
0710: 41 43 4b 20 7d 20 7d 20 7b 7d 0a 0a 64 6f 5f 74  ACK } } {}..do_t
0720: 65 73 74 20 74 72 69 67 67 65 72 39 2d 31 2e 33  est trigger9-1.3
0730: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
0740: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
0750: 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52    CREATE TRIGGER
0760: 20 74 72 69 67 31 20 42 45 46 4f 52 45 20 44 45   trig1 BEFORE DE
0770: 4c 45 54 45 20 4f 4e 20 74 31 20 42 45 47 49 4e  LETE ON t1 BEGIN
0780: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
0790: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 6f  INTO t2 VALUES(o
07a0: 6c 64 2e 78 29 3b 0a 20 20 20 20 20 20 45 4e 44  ld.x);.      END
07b0: 3b 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46  ;.      DELETE F
07c0: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 53 45  ROM t1;.      SE
07d0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a  LECT * FROM t2;.
07e0: 20 20 7d 0a 7d 20 7b 31 20 32 20 33 7d 0a 64 6f    }.} {1 2 3}.do
07f0: 5f 74 65 73 74 20 74 72 69 67 67 65 72 39 2d 31  _test trigger9-1
0800: 2e 33 2e 32 20 7b 0a 20 20 68 61 73 5f 72 6f 77  .3.2 {.  has_row
0810: 64 61 74 61 20 7b 44 45 4c 45 54 45 20 46 52 4f  data {DELETE FRO
0820: 4d 20 74 31 7d 0a 7d 20 30 0a 64 6f 5f 74 65 73  M t1}.} 0.do_tes
0830: 74 20 74 72 69 67 67 65 72 39 2d 31 2e 33 2e 33  t trigger9-1.3.3
0840: 20 7b 20 65 78 65 63 73 71 6c 20 7b 20 52 4f 4c   { execsql { ROL
0850: 4c 42 41 43 4b 20 7d 20 7d 20 7b 7d 0a 0a 64 6f  LBACK } } {}..do
0860: 5f 74 65 73 74 20 74 72 69 67 67 65 72 39 2d 31  _test trigger9-1
0870: 2e 34 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  .4.1 {.  execsql
0880: 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20   {.    BEGIN;.  
0890: 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47      CREATE TRIGG
08a0: 45 52 20 74 72 69 67 31 20 42 45 46 4f 52 45 20  ER trig1 BEFORE 
08b0: 44 45 4c 45 54 45 20 4f 4e 20 74 31 20 57 48 45  DELETE ON t1 WHE
08c0: 4e 20 6f 6c 64 2e 78 3d 27 31 27 20 42 45 47 49  N old.x='1' BEGI
08d0: 4e 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  N.        INSERT
08e0: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
08f0: 6f 6c 64 2e 72 6f 77 69 64 29 3b 0a 20 20 20 20  old.rowid);.    
0900: 20 20 45 4e 44 3b 0a 20 20 20 20 20 20 44 45 4c    END;.      DEL
0910: 45 54 45 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  ETE FROM t1;.   
0920: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
0930: 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 31 7d 0a 64   t2;.  }.} {1}.d
0940: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 39 2d  o_test trigger9-
0950: 31 2e 34 2e 32 20 7b 0a 20 20 68 61 73 5f 72 6f  1.4.2 {.  has_ro
0960: 77 64 61 74 61 20 7b 44 45 4c 45 54 45 20 46 52  wdata {DELETE FR
0970: 4f 4d 20 74 31 7d 0a 7d 20 30 0a 64 6f 5f 74 65  OM t1}.} 0.do_te
0980: 73 74 20 74 72 69 67 67 65 72 39 2d 31 2e 34 2e  st trigger9-1.4.
0990: 33 20 7b 20 65 78 65 63 73 71 6c 20 7b 20 52 4f  3 { execsql { RO
09a0: 4c 4c 42 41 43 4b 20 7d 20 7d 20 7b 7d 0a 0a 64  LLBACK } } {}..d
09b0: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 39 2d  o_test trigger9-
09c0: 31 2e 35 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  1.5.1 {.  execsq
09d0: 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  l {.    BEGIN;. 
09e0: 20 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47       CREATE TRIG
09f0: 47 45 52 20 74 72 69 67 31 20 42 45 46 4f 52 45  GER trig1 BEFORE
0a00: 20 55 50 44 41 54 45 20 4f 4e 20 74 31 20 42 45   UPDATE ON t1 BE
0a10: 47 49 4e 0a 20 20 20 20 20 20 20 20 49 4e 53 45  GIN.        INSE
0a20: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
0a30: 53 28 6f 6c 64 2e 72 6f 77 69 64 29 3b 0a 20 20  S(old.rowid);.  
0a40: 20 20 20 20 45 4e 44 3b 0a 20 20 20 20 20 20 55      END;.      U
0a50: 50 44 41 54 45 20 74 31 20 53 45 54 20 79 20 3d  PDATE t1 SET y =
0a60: 20 27 27 3b 0a 20 20 20 20 20 20 53 45 4c 45 43   '';.      SELEC
0a70: 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d  T * FROM t2;.  }
0a80: 0a 7d 20 7b 31 20 32 20 33 7d 0a 64 6f 5f 74 65  .} {1 2 3}.do_te
0a90: 73 74 20 74 72 69 67 67 65 72 39 2d 31 2e 35 2e  st trigger9-1.5.
0aa0: 32 20 7b 0a 20 20 68 61 73 5f 72 6f 77 64 61 74  2 {.  has_rowdat
0ab0: 61 20 7b 55 50 44 41 54 45 20 74 31 20 53 45 54  a {UPDATE t1 SET
0ac0: 20 79 20 3d 20 27 27 7d 0a 7d 20 30 0a 64 6f 5f   y = ''}.} 0.do_
0ad0: 74 65 73 74 20 74 72 69 67 67 65 72 39 2d 31 2e  test trigger9-1.
0ae0: 35 2e 33 20 7b 20 65 78 65 63 73 71 6c 20 7b 20  5.3 { execsql { 
0af0: 52 4f 4c 4c 42 41 43 4b 20 7d 20 7d 20 7b 7d 0a  ROLLBACK } } {}.
0b00: 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72  .do_test trigger
0b10: 39 2d 31 2e 36 2e 31 20 7b 0a 20 20 65 78 65 63  9-1.6.1 {.  exec
0b20: 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b  sql {.    BEGIN;
0b30: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 52  .      CREATE TR
0b40: 49 47 47 45 52 20 74 72 69 67 31 20 42 45 46 4f  IGGER trig1 BEFO
0b50: 52 45 20 55 50 44 41 54 45 20 4f 4e 20 74 31 20  RE UPDATE ON t1 
0b60: 42 45 47 49 4e 0a 20 20 20 20 20 20 20 20 49 4e  BEGIN.        IN
0b70: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
0b80: 55 45 53 28 6f 6c 64 2e 78 29 3b 0a 20 20 20 20  UES(old.x);.    
0b90: 20 20 45 4e 44 3b 0a 20 20 20 20 20 20 55 50 44    END;.      UPD
0ba0: 41 54 45 20 74 31 20 53 45 54 20 79 20 3d 20 27  ATE t1 SET y = '
0bb0: 27 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  ';.      SELECT 
0bc0: 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d  * FROM t2;.  }.}
0bd0: 20 7b 31 20 32 20 33 7d 0a 64 6f 5f 74 65 73 74   {1 2 3}.do_test
0be0: 20 74 72 69 67 67 65 72 39 2d 31 2e 36 2e 32 20   trigger9-1.6.2 
0bf0: 7b 0a 20 20 68 61 73 5f 72 6f 77 64 61 74 61 20  {.  has_rowdata 
0c00: 7b 55 50 44 41 54 45 20 74 31 20 53 45 54 20 79  {UPDATE t1 SET y
0c10: 20 3d 20 27 27 7d 0a 7d 20 30 0a 64 6f 5f 74 65   = ''}.} 0.do_te
0c20: 73 74 20 74 72 69 67 67 65 72 39 2d 31 2e 36 2e  st trigger9-1.6.
0c30: 33 20 7b 20 65 78 65 63 73 71 6c 20 7b 20 52 4f  3 { execsql { RO
0c40: 4c 4c 42 41 43 4b 20 7d 20 7d 20 7b 7d 0a 0a 64  LLBACK } } {}..d
0c50: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 39 2d  o_test trigger9-
0c60: 31 2e 37 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  1.7.1 {.  execsq
0c70: 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  l {.    BEGIN;. 
0c80: 20 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47       CREATE TRIG
0c90: 47 45 52 20 74 72 69 67 31 20 42 45 46 4f 52 45  GER trig1 BEFORE
0ca0: 20 55 50 44 41 54 45 20 4f 4e 20 74 31 20 57 48   UPDATE ON t1 WH
0cb0: 45 4e 20 6f 6c 64 2e 78 3e 3d 27 32 27 20 42 45  EN old.x>='2' BE
0cc0: 47 49 4e 0a 20 20 20 20 20 20 20 20 49 4e 53 45  GIN.        INSE
0cd0: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
0ce0: 53 28 6f 6c 64 2e 78 29 3b 0a 20 20 20 20 20 20  S(old.x);.      
0cf0: 45 4e 44 3b 0a 20 20 20 20 20 20 55 50 44 41 54  END;.      UPDAT
0d00: 45 20 74 31 20 53 45 54 20 79 20 3d 20 27 27 3b  E t1 SET y = '';
0d10: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .      SELECT * 
0d20: 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b  FROM t2;.  }.} {
0d30: 32 20 33 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69  2 3}.do_test tri
0d40: 67 67 65 72 39 2d 31 2e 37 2e 32 20 7b 0a 20 20  gger9-1.7.2 {.  
0d50: 68 61 73 5f 72 6f 77 64 61 74 61 20 7b 55 50 44  has_rowdata {UPD
0d60: 41 54 45 20 74 31 20 53 45 54 20 79 20 3d 20 27  ATE t1 SET y = '
0d70: 27 7d 0a 7d 20 30 0a 64 6f 5f 74 65 73 74 20 74  '}.} 0.do_test t
0d80: 72 69 67 67 65 72 39 2d 31 2e 37 2e 33 20 7b 20  rigger9-1.7.3 { 
0d90: 65 78 65 63 73 71 6c 20 7b 20 52 4f 4c 4c 42 41  execsql { ROLLBA
0da0: 43 4b 20 7d 20 7d 20 7b 7d 0a 0a 64 6f 5f 74 65  CK } } {}..do_te
0db0: 73 74 20 74 72 69 67 67 65 72 39 2d 33 2e 31 20  st trigger9-3.1 
0dc0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
0dd0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
0de0: 33 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53  3(a, b);.    INS
0df0: 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55  ERT INTO t3 VALU
0e00: 45 53 28 31 2c 20 27 6f 6e 65 27 29 3b 0a 20 20  ES(1, 'one');.  
0e10: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
0e20: 20 56 41 4c 55 45 53 28 32 2c 20 27 74 77 6f 27   VALUES(2, 'two'
0e30: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
0e40: 54 4f 20 74 33 20 56 41 4c 55 45 53 28 33 2c 20  TO t3 VALUES(3, 
0e50: 27 74 68 72 65 65 27 29 3b 0a 20 20 7d 0a 7d 20  'three');.  }.} 
0e60: 7b 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67  {}.do_test trigg
0e70: 65 72 39 2d 33 2e 32 20 7b 0a 20 20 65 78 65 63  er9-3.2 {.  exec
0e80: 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b  sql {.    BEGIN;
0e90: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 56 49  .      CREATE VI
0ea0: 45 57 20 76 31 20 41 53 20 53 45 4c 45 43 54 20  EW v1 AS SELECT 
0eb0: 2a 20 46 52 4f 4d 20 74 33 3b 0a 20 20 20 20 20  * FROM t3;.     
0ec0: 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20   CREATE TRIGGER 
0ed0: 74 72 69 67 31 20 49 4e 53 54 45 41 44 20 4f 46  trig1 INSTEAD OF
0ee0: 20 55 50 44 41 54 45 20 4f 4e 20 76 31 20 42 45   UPDATE ON v1 BE
0ef0: 47 49 4e 0a 20 20 20 20 20 20 20 20 49 4e 53 45  GIN.        INSE
0f00: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
0f10: 53 28 6f 6c 64 2e 61 29 3b 0a 20 20 20 20 20 20  S(old.a);.      
0f20: 45 4e 44 3b 0a 20 20 20 20 20 20 55 50 44 41 54  END;.      UPDAT
0f30: 45 20 76 31 20 53 45 54 20 62 20 3d 20 27 68 65  E v1 SET b = 'he
0f40: 6c 6c 6f 27 3b 0a 20 20 20 20 20 20 53 45 4c 45  llo';.      SELE
0f50: 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20  CT * FROM t2;.  
0f60: 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a    ROLLBACK;.  }.
0f70: 7d 20 7b 31 20 32 20 33 7d 0a 64 6f 5f 74 65 73  } {1 2 3}.do_tes
0f80: 74 20 74 72 69 67 67 65 72 39 2d 33 2e 33 20 7b  t trigger9-3.3 {
0f90: 0a 20 20 23 20 49 6e 20 74 68 69 73 20 74 65 73  .  # In this tes
0fa0: 74 20 74 68 65 20 27 63 27 20 63 6f 6c 75 6d 6e  t the 'c' column
0fb0: 20 6f 66 20 74 68 65 20 76 69 65 77 20 69 73 20   of the view is 
0fc0: 6e 6f 74 20 72 65 71 75 69 72 65 64 20 62 79 0a  not required by.
0fd0: 20 20 23 20 74 68 65 20 49 4e 53 54 45 41 44 20    # the INSTEAD 
0fe0: 4f 46 20 74 72 69 67 67 65 72 2c 20 62 75 74 20  OF trigger, but 
0ff0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
1000: 73 20 72 65 75 73 65 64 20 69 6e 74 65 72 6e 61  s reused interna
1010: 6c 6c 79 20 61 73 0a 20 20 23 20 70 61 72 74 20  lly as.  # part 
1020: 6f 66 20 74 68 65 20 76 69 65 77 27 73 20 57 48  of the view's WH
1030: 45 52 45 20 63 6c 61 75 73 65 2e 20 43 68 65 63  ERE clause. Chec
1040: 6b 20 74 68 61 74 20 74 68 69 73 20 64 6f 65 73  k that this does
1050: 20 6e 6f 74 20 63 61 75 73 65 0a 20 20 23 20 61   not cause.  # a
1060: 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 23 0a 20 20   problem..  #.  
1070: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45  execsql {.    BE
1080: 47 49 4e 3b 0a 20 20 20 20 20 20 43 52 45 41 54  GIN;.      CREAT
1090: 45 20 56 49 45 57 20 76 31 20 41 53 20 53 45 4c  E VIEW v1 AS SEL
10a0: 45 43 54 20 61 2c 20 62 20 41 53 20 63 20 46 52  ECT a, b AS c FR
10b0: 4f 4d 20 74 33 20 57 48 45 52 45 20 63 20 3e 20  OM t3 WHERE c > 
10c0: 27 6f 6e 65 27 3b 0a 20 20 20 20 20 20 43 52 45  'one';.      CRE
10d0: 41 54 45 20 54 52 49 47 47 45 52 20 74 72 69 67  ATE TRIGGER trig
10e0: 31 20 49 4e 53 54 45 41 44 20 4f 46 20 55 50 44  1 INSTEAD OF UPD
10f0: 41 54 45 20 4f 4e 20 76 31 20 42 45 47 49 4e 0a  ATE ON v1 BEGIN.
1100: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
1110: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 6f 6c  NTO t2 VALUES(ol
1120: 64 2e 61 29 3b 0a 20 20 20 20 20 20 45 4e 44 3b  d.a);.      END;
1130: 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 76 31  .      UPDATE v1
1140: 20 53 45 54 20 63 20 3d 20 27 68 65 6c 6c 6f 27   SET c = 'hello'
1150: 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  ;.      SELECT *
1160: 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 52 4f   FROM t2;.    RO
1170: 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a 7d 20 7b 32  LLBACK;.  }.} {2
1180: 20 33 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67   3}.do_test trig
1190: 67 65 72 39 2d 33 2e 34 20 7b 0a 20 20 65 78 65  ger9-3.4 {.  exe
11a0: 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e  csql {.    BEGIN
11b0: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
11c0: 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 33 2c  NTO t3 VALUES(3,
11d0: 20 27 74 68 72 65 65 27 29 3b 0a 20 20 20 20 20   'three');.     
11e0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20   INSERT INTO t3 
11f0: 56 41 4c 55 45 53 28 33 2c 20 27 66 6f 75 72 27  VALUES(3, 'four'
1200: 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  );.      CREATE 
1210: 56 49 45 57 20 76 31 20 41 53 20 53 45 4c 45 43  VIEW v1 AS SELEC
1220: 54 20 44 49 53 54 49 4e 43 54 20 61 2c 20 62 20  T DISTINCT a, b 
1230: 46 52 4f 4d 20 74 33 3b 0a 20 20 20 20 20 20 43  FROM t3;.      C
1240: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74 72  REATE TRIGGER tr
1250: 69 67 31 20 49 4e 53 54 45 41 44 20 4f 46 20 55  ig1 INSTEAD OF U
1260: 50 44 41 54 45 20 4f 4e 20 76 31 20 42 45 47 49  PDATE ON v1 BEGI
1270: 4e 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  N.        INSERT
1280: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
1290: 6f 6c 64 2e 61 29 3b 0a 20 20 20 20 20 20 45 4e  old.a);.      EN
12a0: 44 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20  D;.      UPDATE 
12b0: 76 31 20 53 45 54 20 62 20 3d 20 27 68 65 6c 6c  v1 SET b = 'hell
12c0: 6f 27 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  o';.      SELECT
12d0: 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20   * FROM t2;.    
12e0: 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 7d 0a 7d 20  ROLLBACK;.  }.} 
12f0: 7b 31 20 32 20 33 20 33 7d 0a 0a 69 66 63 61 70  {1 2 3 3}..ifcap
1300: 61 62 6c 65 20 63 6f 6d 70 6f 75 6e 64 20 7b 0a  able compound {.
1310: 20 20 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65    do_test trigge
1320: 72 39 2d 33 2e 35 20 7b 0a 20 20 20 20 65 78 65  r9-3.5 {.    exe
1330: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 42 45 47  csql {.      BEG
1340: 49 4e 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45  IN;.        INSE
1350: 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45  RT INTO t3 VALUE
1360: 53 28 31 2c 20 27 75 6e 6f 27 29 3b 0a 20 20 20  S(1, 'uno');.   
1370: 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57       CREATE VIEW
1380: 20 76 31 20 41 53 20 53 45 4c 45 43 54 20 61 2c   v1 AS SELECT a,
1390: 20 62 20 46 52 4f 4d 20 74 33 20 45 58 43 45 50   b FROM t3 EXCEP
13a0: 54 20 53 45 4c 45 43 54 20 31 2c 20 27 6f 6e 65  T SELECT 1, 'one
13b0: 27 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41 54  ';.        CREAT
13c0: 45 20 54 52 49 47 47 45 52 20 74 72 69 67 31 20  E TRIGGER trig1 
13d0: 49 4e 53 54 45 41 44 20 4f 46 20 55 50 44 41 54  INSTEAD OF UPDAT
13e0: 45 20 4f 4e 20 76 31 20 42 45 47 49 4e 0a 20 20  E ON v1 BEGIN.  
13f0: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
1400: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 6f 6c  NTO t2 VALUES(ol
1410: 64 2e 61 29 3b 0a 20 20 20 20 20 20 20 20 45 4e  d.a);.        EN
1420: 44 3b 0a 20 20 20 20 20 20 20 20 55 50 44 41 54  D;.        UPDAT
1430: 45 20 76 31 20 53 45 54 20 62 20 3d 20 27 68 65  E v1 SET b = 'he
1440: 6c 6c 6f 27 3b 0a 20 20 20 20 20 20 20 20 53 45  llo';.        SE
1450: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a  LECT * FROM t2;.
1460: 20 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a        ROLLBACK;.
1470: 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33      }.  } {1 2 3
1480: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 74 72 69 67  }.  do_test trig
1490: 67 65 72 39 2d 33 2e 36 20 7b 0a 20 20 20 20 65  ger9-3.6 {.    e
14a0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 42  xecsql {.      B
14b0: 45 47 49 4e 3b 0a 20 20 20 20 20 20 20 20 49 4e  EGIN;.        IN
14c0: 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c  SERT INTO t3 VAL
14d0: 55 45 53 28 31 2c 20 27 7a 65 72 6f 27 29 3b 0a  UES(1, 'zero');.
14e0: 20 20 20 20 20 20 20 20 43 52 45 41 54 45 20 56          CREATE V
14f0: 49 45 57 20 76 31 20 41 53 20 0a 20 20 20 20 20  IEW v1 AS .     
1500: 20 20 20 20 20 53 45 4c 45 43 54 20 73 75 6d 28       SELECT sum(
1510: 61 29 20 41 53 20 61 2c 20 6d 61 78 28 62 29 20  a) AS a, max(b) 
1520: 41 53 20 62 20 46 52 4f 4d 20 74 33 20 47 52 4f  AS b FROM t3 GRO
1530: 55 50 20 42 59 20 74 33 2e 61 20 48 41 56 49 4e  UP BY t3.a HAVIN
1540: 47 20 62 3e 27 74 77 6f 27 3b 0a 20 20 20 20 20  G b>'two';.     
1550: 20 20 20 43 52 45 41 54 45 20 54 52 49 47 47 45     CREATE TRIGGE
1560: 52 20 74 72 69 67 31 20 49 4e 53 54 45 41 44 20  R trig1 INSTEAD 
1570: 4f 46 20 55 50 44 41 54 45 20 4f 4e 20 76 31 20  OF UPDATE ON v1 
1580: 42 45 47 49 4e 0a 20 20 20 20 20 20 20 20 20 20  BEGIN.          
1590: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
15a0: 41 4c 55 45 53 28 6f 6c 64 2e 61 29 3b 0a 20 20  ALUES(old.a);.  
15b0: 20 20 20 20 20 20 45 4e 44 3b 0a 20 20 20 20 20        END;.     
15c0: 20 20 20 55 50 44 41 54 45 20 76 31 20 53 45 54     UPDATE v1 SET
15d0: 20 62 20 3d 20 27 68 65 6c 6c 6f 27 3b 0a 20 20   b = 'hello';.  
15e0: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
15f0: 52 4f 4d 20 74 32 3b 0a 20 20 20 20 20 20 52 4f  ROM t2;.      RO
1600: 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 7d 0a 20 20  LLBACK;.    }.  
1610: 7d 20 7b 32 7d 0a 7d 0a 0a 66 69 6e 69 73 68 5f  } {2}.}..finish_
1620: 74 65 73 74 0a                                   test.