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

Artifact 2226ec795a33b0460ab5cf8891e9054cc7edef41:


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 73 65 74 20 3a 3a 74 65 73 74 70 72 65 66 69  .set ::testprefi
0460: 78 20 74 72 69 67 67 65 72 39 0a 0a 70 72 6f 63  x trigger9..proc
0470: 20 68 61 73 5f 72 6f 77 64 61 74 61 20 7b 73 71   has_rowdata {sq
0480: 6c 7d 20 7b 0a 20 20 65 78 70 72 20 7b 5b 6c 73  l} {.  expr {[ls
0490: 65 61 72 63 68 20 5b 65 78 65 63 73 71 6c 20 22  earch [execsql "
04a0: 65 78 70 6c 61 69 6e 20 24 73 71 6c 22 5d 20 52  explain $sql"] R
04b0: 6f 77 44 61 74 61 5d 3e 3d 30 7d 0a 7d 0a 0a 64  owData]>=0}.}..d
04c0: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 39 2d  o_test trigger9-
04d0: 31 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.1 {.  execsql 
04e0: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67  {.    PRAGMA pag
04f0: 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20  e_size = 1024;. 
0500: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
0510: 74 31 28 78 2c 20 79 2c 20 7a 29 3b 0a 20 20 20  t1(x, y, z);.   
0520: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
0530: 56 41 4c 55 45 53 28 27 31 27 2c 20 72 61 6e 64  VALUES('1', rand
0540: 73 74 72 28 31 30 30 30 30 2c 31 30 30 30 30 29  str(10000,10000)
0550: 2c 20 27 32 27 29 3b 0a 20 20 20 20 49 4e 53 45  , '2');.    INSE
0560: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
0570: 53 28 27 32 27 2c 20 72 61 6e 64 73 74 72 28 31  S('2', randstr(1
0580: 30 30 30 30 2c 31 30 30 30 30 29 2c 20 27 34 27  0000,10000), '4'
0590: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
05a0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 33 27  TO t1 VALUES('3'
05b0: 2c 20 72 61 6e 64 73 74 72 28 31 30 30 30 30 2c  , randstr(10000,
05c0: 31 30 30 30 30 29 2c 20 27 36 27 29 3b 0a 20 20  10000), '6');.  
05d0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
05e0: 32 28 78 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a  2(x);.  }.} {}..
05f0: 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 39  do_test trigger9
0600: 2d 31 2e 32 2e 31 20 7b 0a 20 20 65 78 65 63 73  -1.2.1 {.  execs
0610: 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  ql {.    BEGIN;.
0620: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 52 49        CREATE TRI
0630: 47 47 45 52 20 74 72 69 67 31 20 42 45 46 4f 52  GGER trig1 BEFOR
0640: 45 20 44 45 4c 45 54 45 20 4f 4e 20 74 31 20 42  E DELETE ON t1 B
0650: 45 47 49 4e 0a 20 20 20 20 20 20 20 20 49 4e 53  EGIN.        INS
0660: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
0670: 45 53 28 6f 6c 64 2e 72 6f 77 69 64 29 3b 0a 20  ES(old.rowid);. 
0680: 20 20 20 20 20 45 4e 44 3b 0a 20 20 20 20 20 20       END;.      
0690: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 3b 0a  DELETE FROM t1;.
06a0: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
06b0: 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 31  ROM t2;.  }.} {1
06c0: 20 32 20 33 7d 0a 64 6f 5f 74 65 73 74 20 74 72   2 3}.do_test tr
06d0: 69 67 67 65 72 39 2d 31 2e 32 2e 33 20 7b 0a 20  igger9-1.2.3 {. 
06e0: 20 68 61 73 5f 72 6f 77 64 61 74 61 20 7b 44 45   has_rowdata {DE
06f0: 4c 45 54 45 20 46 52 4f 4d 20 74 31 7d 0a 7d 20  LETE FROM t1}.} 
0700: 30 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65  0.do_test trigge
0710: 72 39 2d 31 2e 32 2e 34 20 7b 20 65 78 65 63 73  r9-1.2.4 { execs
0720: 71 6c 20 7b 20 52 4f 4c 4c 42 41 43 4b 20 7d 20  ql { ROLLBACK } 
0730: 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 74 72  } {}..do_test tr
0740: 69 67 67 65 72 39 2d 31 2e 33 2e 31 20 7b 0a 20  igger9-1.3.1 {. 
0750: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
0760: 45 47 49 4e 3b 0a 20 20 20 20 20 20 43 52 45 41  EGIN;.      CREA
0770: 54 45 20 54 52 49 47 47 45 52 20 74 72 69 67 31  TE TRIGGER trig1
0780: 20 42 45 46 4f 52 45 20 44 45 4c 45 54 45 20 4f   BEFORE DELETE O
0790: 4e 20 74 31 20 42 45 47 49 4e 0a 20 20 20 20 20  N t1 BEGIN.     
07a0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
07b0: 32 20 56 41 4c 55 45 53 28 6f 6c 64 2e 78 29 3b  2 VALUES(old.x);
07c0: 0a 20 20 20 20 20 20 45 4e 44 3b 0a 20 20 20 20  .      END;.    
07d0: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31    DELETE FROM t1
07e0: 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  ;.      SELECT *
07f0: 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20   FROM t2;.  }.} 
0800: 7b 31 20 32 20 33 7d 0a 64 6f 5f 74 65 73 74 20  {1 2 3}.do_test 
0810: 74 72 69 67 67 65 72 39 2d 31 2e 33 2e 32 20 7b  trigger9-1.3.2 {
0820: 0a 20 20 68 61 73 5f 72 6f 77 64 61 74 61 20 7b  .  has_rowdata {
0830: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 7d 0a  DELETE FROM t1}.
0840: 7d 20 30 0a 64 6f 5f 74 65 73 74 20 74 72 69 67  } 0.do_test trig
0850: 67 65 72 39 2d 31 2e 33 2e 33 20 7b 20 65 78 65  ger9-1.3.3 { exe
0860: 63 73 71 6c 20 7b 20 52 4f 4c 4c 42 41 43 4b 20  csql { ROLLBACK 
0870: 7d 20 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20  } } {}..do_test 
0880: 74 72 69 67 67 65 72 39 2d 31 2e 34 2e 31 20 7b  trigger9-1.4.1 {
0890: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
08a0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 43 52   BEGIN;.      CR
08b0: 45 41 54 45 20 54 52 49 47 47 45 52 20 74 72 69  EATE TRIGGER tri
08c0: 67 31 20 42 45 46 4f 52 45 20 44 45 4c 45 54 45  g1 BEFORE DELETE
08d0: 20 4f 4e 20 74 31 20 57 48 45 4e 20 6f 6c 64 2e   ON t1 WHEN old.
08e0: 78 3d 27 31 27 20 42 45 47 49 4e 0a 20 20 20 20  x='1' BEGIN.    
08f0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0900: 74 32 20 56 41 4c 55 45 53 28 6f 6c 64 2e 72 6f  t2 VALUES(old.ro
0910: 77 69 64 29 3b 0a 20 20 20 20 20 20 45 4e 44 3b  wid);.      END;
0920: 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52  .      DELETE FR
0930: 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 53 45 4c  OM t1;.      SEL
0940: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20  ECT * FROM t2;. 
0950: 20 7d 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74   }.} {1}.do_test
0960: 20 74 72 69 67 67 65 72 39 2d 31 2e 34 2e 32 20   trigger9-1.4.2 
0970: 7b 0a 20 20 68 61 73 5f 72 6f 77 64 61 74 61 20  {.  has_rowdata 
0980: 7b 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 7d  {DELETE FROM t1}
0990: 0a 7d 20 30 0a 64 6f 5f 74 65 73 74 20 74 72 69  .} 0.do_test tri
09a0: 67 67 65 72 39 2d 31 2e 34 2e 33 20 7b 20 65 78  gger9-1.4.3 { ex
09b0: 65 63 73 71 6c 20 7b 20 52 4f 4c 4c 42 41 43 4b  ecsql { ROLLBACK
09c0: 20 7d 20 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74   } } {}..do_test
09d0: 20 74 72 69 67 67 65 72 39 2d 31 2e 35 2e 31 20   trigger9-1.5.1 
09e0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
09f0: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 43    BEGIN;.      C
0a00: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74 72  REATE TRIGGER tr
0a10: 69 67 31 20 42 45 46 4f 52 45 20 55 50 44 41 54  ig1 BEFORE UPDAT
0a20: 45 20 4f 4e 20 74 31 20 42 45 47 49 4e 0a 20 20  E ON t1 BEGIN.  
0a30: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
0a40: 4f 20 74 32 20 56 41 4c 55 45 53 28 6f 6c 64 2e  O t2 VALUES(old.
0a50: 72 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 45 4e  rowid);.      EN
0a60: 44 3b 0a 20 20 20 20 20 20 55 50 44 41 54 45 20  D;.      UPDATE 
0a70: 74 31 20 53 45 54 20 79 20 3d 20 27 27 3b 0a 20  t1 SET y = '';. 
0a80: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
0a90: 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 31 20  OM t2;.  }.} {1 
0aa0: 32 20 33 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69  2 3}.do_test tri
0ab0: 67 67 65 72 39 2d 31 2e 35 2e 32 20 7b 0a 20 20  gger9-1.5.2 {.  
0ac0: 68 61 73 5f 72 6f 77 64 61 74 61 20 7b 55 50 44  has_rowdata {UPD
0ad0: 41 54 45 20 74 31 20 53 45 54 20 79 20 3d 20 27  ATE t1 SET y = '
0ae0: 27 7d 0a 7d 20 30 0a 64 6f 5f 74 65 73 74 20 74  '}.} 0.do_test t
0af0: 72 69 67 67 65 72 39 2d 31 2e 35 2e 33 20 7b 20  rigger9-1.5.3 { 
0b00: 65 78 65 63 73 71 6c 20 7b 20 52 4f 4c 4c 42 41  execsql { ROLLBA
0b10: 43 4b 20 7d 20 7d 20 7b 7d 0a 0a 64 6f 5f 74 65  CK } } {}..do_te
0b20: 73 74 20 74 72 69 67 67 65 72 39 2d 31 2e 36 2e  st trigger9-1.6.
0b30: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
0b40: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
0b50: 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20   CREATE TRIGGER 
0b60: 74 72 69 67 31 20 42 45 46 4f 52 45 20 55 50 44  trig1 BEFORE UPD
0b70: 41 54 45 20 4f 4e 20 74 31 20 42 45 47 49 4e 0a  ATE ON t1 BEGIN.
0b80: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
0b90: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 6f 6c  NTO t2 VALUES(ol
0ba0: 64 2e 78 29 3b 0a 20 20 20 20 20 20 45 4e 44 3b  d.x);.      END;
0bb0: 0a 20 20 20 20 20 20 55 50 44 41 54 45 20 74 31  .      UPDATE t1
0bc0: 20 53 45 54 20 79 20 3d 20 27 27 3b 0a 20 20 20   SET y = '';.   
0bd0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
0be0: 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 20   t2;.  }.} {1 2 
0bf0: 33 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67  3}.do_test trigg
0c00: 65 72 39 2d 31 2e 36 2e 32 20 7b 0a 20 20 68 61  er9-1.6.2 {.  ha
0c10: 73 5f 72 6f 77 64 61 74 61 20 7b 55 50 44 41 54  s_rowdata {UPDAT
0c20: 45 20 74 31 20 53 45 54 20 79 20 3d 20 27 27 7d  E t1 SET y = ''}
0c30: 0a 7d 20 30 0a 64 6f 5f 74 65 73 74 20 74 72 69  .} 0.do_test tri
0c40: 67 67 65 72 39 2d 31 2e 36 2e 33 20 7b 20 65 78  gger9-1.6.3 { ex
0c50: 65 63 73 71 6c 20 7b 20 52 4f 4c 4c 42 41 43 4b  ecsql { ROLLBACK
0c60: 20 7d 20 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74   } } {}..do_test
0c70: 20 74 72 69 67 67 65 72 39 2d 31 2e 37 2e 31 20   trigger9-1.7.1 
0c80: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
0c90: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 43    BEGIN;.      C
0ca0: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74 72  REATE TRIGGER tr
0cb0: 69 67 31 20 42 45 46 4f 52 45 20 55 50 44 41 54  ig1 BEFORE UPDAT
0cc0: 45 20 4f 4e 20 74 31 20 57 48 45 4e 20 6f 6c 64  E ON t1 WHEN old
0cd0: 2e 78 3e 3d 27 32 27 20 42 45 47 49 4e 0a 20 20  .x>='2' BEGIN.  
0ce0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
0cf0: 4f 20 74 32 20 56 41 4c 55 45 53 28 6f 6c 64 2e  O t2 VALUES(old.
0d00: 78 29 3b 0a 20 20 20 20 20 20 45 4e 44 3b 0a 20  x);.      END;. 
0d10: 20 20 20 20 20 55 50 44 41 54 45 20 74 31 20 53       UPDATE t1 S
0d20: 45 54 20 79 20 3d 20 27 27 3b 0a 20 20 20 20 20  ET y = '';.     
0d30: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0d40: 32 3b 0a 20 20 7d 0a 7d 20 7b 32 20 33 7d 0a 64  2;.  }.} {2 3}.d
0d50: 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72 39 2d  o_test trigger9-
0d60: 31 2e 37 2e 32 20 7b 0a 20 20 68 61 73 5f 72 6f  1.7.2 {.  has_ro
0d70: 77 64 61 74 61 20 7b 55 50 44 41 54 45 20 74 31  wdata {UPDATE t1
0d80: 20 53 45 54 20 79 20 3d 20 27 27 7d 0a 7d 20 30   SET y = ''}.} 0
0d90: 0a 64 6f 5f 74 65 73 74 20 74 72 69 67 67 65 72  .do_test trigger
0da0: 39 2d 31 2e 37 2e 33 20 7b 20 65 78 65 63 73 71  9-1.7.3 { execsq
0db0: 6c 20 7b 20 52 4f 4c 4c 42 41 43 4b 20 7d 20 7d  l { ROLLBACK } }
0dc0: 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 74 72 69   {}..do_test tri
0dd0: 67 67 65 72 39 2d 33 2e 31 20 7b 0a 20 20 65 78  gger9-3.1 {.  ex
0de0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
0df0: 54 45 20 54 41 42 4c 45 20 74 33 28 61 2c 20 62  TE TABLE t3(a, b
0e00: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
0e10: 54 4f 20 74 33 20 56 41 4c 55 45 53 28 31 2c 20  TO t3 VALUES(1, 
0e20: 27 6f 6e 65 27 29 3b 0a 20 20 20 20 49 4e 53 45  'one');.    INSE
0e30: 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45  RT INTO t3 VALUE
0e40: 53 28 32 2c 20 27 74 77 6f 27 29 3b 0a 20 20 20  S(2, 'two');.   
0e50: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20   INSERT INTO t3 
0e60: 56 41 4c 55 45 53 28 33 2c 20 27 74 68 72 65 65  VALUES(3, 'three
0e70: 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  ');.  }.} {}.do_
0e80: 74 65 73 74 20 74 72 69 67 67 65 72 39 2d 33 2e  test trigger9-3.
0e90: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  2 {.  execsql {.
0ea0: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
0eb0: 20 43 52 45 41 54 45 20 56 49 45 57 20 76 31 20   CREATE VIEW v1 
0ec0: 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  AS SELECT * FROM
0ed0: 20 74 33 3b 0a 20 20 20 20 20 20 43 52 45 41 54   t3;.      CREAT
0ee0: 45 20 54 52 49 47 47 45 52 20 74 72 69 67 31 20  E TRIGGER trig1 
0ef0: 49 4e 53 54 45 41 44 20 4f 46 20 55 50 44 41 54  INSTEAD OF UPDAT
0f00: 45 20 4f 4e 20 76 31 20 42 45 47 49 4e 0a 20 20  E ON v1 BEGIN.  
0f10: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
0f20: 4f 20 74 32 20 56 41 4c 55 45 53 28 6f 6c 64 2e  O t2 VALUES(old.
0f30: 61 29 3b 0a 20 20 20 20 20 20 45 4e 44 3b 0a 20  a);.      END;. 
0f40: 20 20 20 20 20 55 50 44 41 54 45 20 76 31 20 53       UPDATE v1 S
0f50: 45 54 20 62 20 3d 20 27 68 65 6c 6c 6f 27 3b 0a  ET b = 'hello';.
0f60: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
0f70: 52 4f 4d 20 74 32 3b 0a 20 20 20 20 52 4f 4c 4c  ROM t2;.    ROLL
0f80: 42 41 43 4b 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32  BACK;.  }.} {1 2
0f90: 20 33 7d 0a 64 6f 5f 74 65 73 74 20 74 72 69 67   3}.do_test trig
0fa0: 67 65 72 39 2d 33 2e 33 20 7b 0a 20 20 23 20 49  ger9-3.3 {.  # I
0fb0: 6e 20 74 68 69 73 20 74 65 73 74 20 74 68 65 20  n this test the 
0fc0: 27 63 27 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  'c' column of th
0fd0: 65 20 76 69 65 77 20 69 73 20 6e 6f 74 20 72 65  e view is not re
0fe0: 71 75 69 72 65 64 20 62 79 0a 20 20 23 20 74 68  quired by.  # th
0ff0: 65 20 49 4e 53 54 45 41 44 20 4f 46 20 74 72 69  e INSTEAD OF tri
1000: 67 67 65 72 2c 20 62 75 74 20 74 68 65 20 65 78  gger, but the ex
1010: 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65 75 73  pression is reus
1020: 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 61 73  ed internally as
1030: 0a 20 20 23 20 70 61 72 74 20 6f 66 20 74 68 65  .  # part of the
1040: 20 76 69 65 77 27 73 20 57 48 45 52 45 20 63 6c   view's WHERE cl
1050: 61 75 73 65 2e 20 43 68 65 63 6b 20 74 68 61 74  ause. Check that
1060: 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 63   this does not c
1070: 61 75 73 65 0a 20 20 23 20 61 20 70 72 6f 62 6c  ause.  # a probl
1080: 65 6d 2e 0a 20 20 23 0a 20 20 65 78 65 63 73 71  em..  #.  execsq
1090: 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  l {.    BEGIN;. 
10a0: 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57       CREATE VIEW
10b0: 20 76 31 20 41 53 20 53 45 4c 45 43 54 20 61 2c   v1 AS SELECT a,
10c0: 20 62 20 41 53 20 63 20 46 52 4f 4d 20 74 33 20   b AS c FROM t3 
10d0: 57 48 45 52 45 20 63 20 3e 20 27 6f 6e 65 27 3b  WHERE c > 'one';
10e0: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 52  .      CREATE TR
10f0: 49 47 47 45 52 20 74 72 69 67 31 20 49 4e 53 54  IGGER trig1 INST
1100: 45 41 44 20 4f 46 20 55 50 44 41 54 45 20 4f 4e  EAD OF UPDATE ON
1110: 20 76 31 20 42 45 47 49 4e 0a 20 20 20 20 20 20   v1 BEGIN.      
1120: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
1130: 20 56 41 4c 55 45 53 28 6f 6c 64 2e 61 29 3b 0a   VALUES(old.a);.
1140: 20 20 20 20 20 20 45 4e 44 3b 0a 20 20 20 20 20        END;.     
1150: 20 55 50 44 41 54 45 20 76 31 20 53 45 54 20 63   UPDATE v1 SET c
1160: 20 3d 20 27 68 65 6c 6c 6f 27 3b 0a 20 20 20 20   = 'hello';.    
1170: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
1180: 74 32 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b  t2;.    ROLLBACK
1190: 3b 0a 20 20 7d 0a 7d 20 7b 32 20 33 7d 0a 64 6f  ;.  }.} {2 3}.do
11a0: 5f 74 65 73 74 20 74 72 69 67 67 65 72 39 2d 33  _test trigger9-3
11b0: 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .4 {.  execsql {
11c0: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
11d0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
11e0: 20 56 41 4c 55 45 53 28 33 2c 20 27 74 68 72 65   VALUES(3, 'thre
11f0: 65 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  e');.      INSER
1200: 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53  T INTO t3 VALUES
1210: 28 33 2c 20 27 66 6f 75 72 27 29 3b 0a 20 20 20  (3, 'four');.   
1220: 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20 76     CREATE VIEW v
1230: 31 20 41 53 20 53 45 4c 45 43 54 20 44 49 53 54  1 AS SELECT DIST
1240: 49 4e 43 54 20 61 2c 20 62 20 46 52 4f 4d 20 74  INCT a, b FROM t
1250: 33 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  3;.      CREATE 
1260: 54 52 49 47 47 45 52 20 74 72 69 67 31 20 49 4e  TRIGGER trig1 IN
1270: 53 54 45 41 44 20 4f 46 20 55 50 44 41 54 45 20  STEAD OF UPDATE 
1280: 4f 4e 20 76 31 20 42 45 47 49 4e 0a 20 20 20 20  ON v1 BEGIN.    
1290: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
12a0: 74 32 20 56 41 4c 55 45 53 28 6f 6c 64 2e 61 29  t2 VALUES(old.a)
12b0: 3b 0a 20 20 20 20 20 20 45 4e 44 3b 0a 20 20 20  ;.      END;.   
12c0: 20 20 20 55 50 44 41 54 45 20 76 31 20 53 45 54     UPDATE v1 SET
12d0: 20 62 20 3d 20 27 68 65 6c 6c 6f 27 3b 0a 20 20   b = 'hello';.  
12e0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
12f0: 4d 20 74 32 3b 0a 20 20 20 20 52 4f 4c 4c 42 41  M t2;.    ROLLBA
1300: 43 4b 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 33  CK;.  }.} {1 2 3
1310: 20 33 7d 0a 0a 69 66 63 61 70 61 62 6c 65 20 63   3}..ifcapable c
1320: 6f 6d 70 6f 75 6e 64 20 7b 0a 20 20 64 6f 5f 74  ompound {.  do_t
1330: 65 73 74 20 74 72 69 67 67 65 72 39 2d 33 2e 35  est trigger9-3.5
1340: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
1350: 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  .      BEGIN;.  
1360: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
1370: 4f 20 74 33 20 56 41 4c 55 45 53 28 31 2c 20 27  O t3 VALUES(1, '
1380: 75 6e 6f 27 29 3b 0a 20 20 20 20 20 20 20 20 43  uno');.        C
1390: 52 45 41 54 45 20 56 49 45 57 20 76 31 20 41 53  REATE VIEW v1 AS
13a0: 20 53 45 4c 45 43 54 20 61 2c 20 62 20 46 52 4f   SELECT a, b FRO
13b0: 4d 20 74 33 20 45 58 43 45 50 54 20 53 45 4c 45  M t3 EXCEPT SELE
13c0: 43 54 20 31 2c 20 27 6f 6e 65 27 3b 0a 20 20 20  CT 1, 'one';.   
13d0: 20 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47       CREATE TRIG
13e0: 47 45 52 20 74 72 69 67 31 20 49 4e 53 54 45 41  GER trig1 INSTEA
13f0: 44 20 4f 46 20 55 50 44 41 54 45 20 4f 4e 20 76  D OF UPDATE ON v
1400: 31 20 42 45 47 49 4e 0a 20 20 20 20 20 20 20 20  1 BEGIN.        
1410: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
1420: 20 56 41 4c 55 45 53 28 6f 6c 64 2e 61 29 3b 0a   VALUES(old.a);.
1430: 20 20 20 20 20 20 20 20 45 4e 44 3b 0a 20 20 20          END;.   
1440: 20 20 20 20 20 55 50 44 41 54 45 20 76 31 20 53       UPDATE v1 S
1450: 45 54 20 62 20 3d 20 27 68 65 6c 6c 6f 27 3b 0a  ET b = 'hello';.
1460: 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a          SELECT *
1470: 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 20 20   FROM t2;.      
1480: 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 7d 0a  ROLLBACK;.    }.
1490: 20 20 7d 20 7b 31 20 32 20 33 7d 0a 20 20 64 6f    } {1 2 3}.  do
14a0: 5f 74 65 73 74 20 74 72 69 67 67 65 72 39 2d 33  _test trigger9-3
14b0: 2e 36 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .6 {.    execsql
14c0: 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a   {.      BEGIN;.
14d0: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
14e0: 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 31 2c  NTO t3 VALUES(1,
14f0: 20 27 7a 65 72 6f 27 29 3b 0a 20 20 20 20 20 20   'zero');.      
1500: 20 20 43 52 45 41 54 45 20 56 49 45 57 20 76 31    CREATE VIEW v1
1510: 20 41 53 20 0a 20 20 20 20 20 20 20 20 20 20 53   AS .          S
1520: 45 4c 45 43 54 20 73 75 6d 28 61 29 20 41 53 20  ELECT sum(a) AS 
1530: 61 2c 20 6d 61 78 28 62 29 20 41 53 20 62 20 46  a, max(b) AS b F
1540: 52 4f 4d 20 74 33 20 47 52 4f 55 50 20 42 59 20  ROM t3 GROUP BY 
1550: 74 33 2e 61 20 48 41 56 49 4e 47 20 62 3e 27 74  t3.a HAVING b>'t
1560: 77 6f 27 3b 0a 20 20 20 20 20 20 20 20 43 52 45  wo';.        CRE
1570: 41 54 45 20 54 52 49 47 47 45 52 20 74 72 69 67  ATE TRIGGER trig
1580: 31 20 49 4e 53 54 45 41 44 20 4f 46 20 55 50 44  1 INSTEAD OF UPD
1590: 41 54 45 20 4f 4e 20 76 31 20 42 45 47 49 4e 0a  ATE ON v1 BEGIN.
15a0: 20 20 20 20 20 20 20 20 20 20 49 4e 53 45 52 54            INSERT
15b0: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
15c0: 6f 6c 64 2e 61 29 3b 0a 20 20 20 20 20 20 20 20  old.a);.        
15d0: 45 4e 44 3b 0a 20 20 20 20 20 20 20 20 55 50 44  END;.        UPD
15e0: 41 54 45 20 76 31 20 53 45 54 20 62 20 3d 20 27  ATE v1 SET b = '
15f0: 68 65 6c 6c 6f 27 3b 0a 20 20 20 20 20 20 20 20  hello';.        
1600: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
1610: 3b 0a 20 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b  ;.      ROLLBACK
1620: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 32 7d 0a  ;.    }.  } {2}.
1630: 7d 0a 0a 72 65 73 65 74 5f 64 62 0a 64 6f 5f 65  }..reset_db.do_e
1640: 78 65 63 73 71 6c 5f 74 65 73 74 20 34 2e 31 20  xecsql_test 4.1 
1650: 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  {.  CREATE TABLE
1660: 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 43 52 45   t1(a, b);.  CRE
1670: 41 54 45 20 54 41 42 4c 45 20 6c 6f 67 28 78 29  ATE TABLE log(x)
1680: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
1690: 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b  t1 VALUES(1, 2);
16a0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
16b0: 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a  1 VALUES(3, 4);.
16c0: 20 20 43 52 45 41 54 45 20 56 49 45 57 20 76 31    CREATE VIEW v1
16d0: 20 41 53 20 53 45 4c 45 43 54 20 61 2c 20 62 20   AS SELECT a, b 
16e0: 46 52 4f 4d 20 74 31 3b 0a 0a 20 20 43 52 45 41  FROM t1;..  CREA
16f0: 54 45 20 54 52 49 47 47 45 52 20 74 72 31 20 49  TE TRIGGER tr1 I
1700: 4e 53 54 45 41 44 20 4f 46 20 44 45 4c 45 54 45  NSTEAD OF DELETE
1710: 20 4f 4e 20 76 31 20 42 45 47 49 4e 0a 20 20 20   ON v1 BEGIN.   
1720: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c 6f 67   INSERT INTO log
1730: 20 56 41 4c 55 45 53 28 27 64 65 6c 65 74 65 27   VALUES('delete'
1740: 29 3b 0a 20 20 45 4e 44 3b 0a 0a 20 20 43 52 45  );.  END;..  CRE
1750: 41 54 45 20 54 52 49 47 47 45 52 20 74 72 32 20  ATE TRIGGER tr2 
1760: 49 4e 53 54 45 41 44 20 4f 46 20 55 50 44 41 54  INSTEAD OF UPDAT
1770: 45 20 4f 4e 20 76 31 20 42 45 47 49 4e 0a 20 20  E ON v1 BEGIN.  
1780: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c 6f    INSERT INTO lo
1790: 67 20 56 41 4c 55 45 53 28 27 75 70 64 61 74 65  g VALUES('update
17a0: 27 29 3b 0a 20 20 45 4e 44 3b 0a 0a 20 20 43 52  ');.  END;..  CR
17b0: 45 41 54 45 20 54 52 49 47 47 45 52 20 74 72 33  EATE TRIGGER tr3
17c0: 20 49 4e 53 54 45 41 44 20 4f 46 20 49 4e 53 45   INSTEAD OF INSE
17d0: 52 54 20 4f 4e 20 76 31 20 42 45 47 49 4e 0a 20  RT ON v1 BEGIN. 
17e0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c     INSERT INTO l
17f0: 6f 67 20 56 41 4c 55 45 53 28 27 69 6e 73 65 72  og VALUES('inser
1800: 74 27 29 3b 0a 20 20 45 4e 44 3b 0a 7d 0a 0a 64  t');.  END;.}..d
1810: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 34  o_execsql_test 4
1820: 2e 32 20 7b 0a 20 20 44 45 4c 45 54 45 20 46 52  .2 {.  DELETE FR
1830: 4f 4d 20 76 31 20 57 48 45 52 45 20 72 6f 77 69  OM v1 WHERE rowi
1840: 64 3d 31 3b 0a 7d 20 7b 7d 0a 0a 64 6f 5f 65 78  d=1;.} {}..do_ex
1850: 65 63 73 71 6c 5f 74 65 73 74 20 34 2e 33 20 7b  ecsql_test 4.3 {
1860: 0a 20 20 55 50 44 41 54 45 20 76 31 20 53 45 54  .  UPDATE v1 SET
1870: 20 61 3d 62 20 57 48 45 52 45 20 72 6f 77 69 64   a=b WHERE rowid
1880: 3d 32 3b 0a 7d 20 7b 7d 0a 0a 0a 0a 0a 66 69 6e  =2;.} {}.....fin
1890: 69 73 68 5f 74 65 73 74 0a                       ish_test.