/ Hex Artifact Content
Login

Artifact b12ee5809d3e63aeb83238dd501a7bca7fd72c10:


0000: 23 20 32 30 31 31 20 4d 61 79 20 30 36 0a 23 0a  # 2011 May 06.#.
0010: 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 73  # The author dis
0020: 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74  claims copyright
0030: 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20   to this source 
0040: 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20  code.  In place 
0050: 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f 74  of.# a legal not
0060: 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20 62  ice, here is a b
0070: 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20 20  lessing:.#.#    
0080: 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20  May you do good 
0090: 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23 20  and not evil..# 
00a0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00b0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00c0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00d0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20 20  give others..#  
00e0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
00f0: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0100: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0110: 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a 2a  ou 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 0a 23 0a 0a 73 65 74 20 74 65 73 74 64  ***.#..set testd
0170: 69 72 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65  ir [file dirname
0180: 20 24 61 72 67 76 30 5d 0a 73 6f 75 72 63 65 20   $argv0].source 
0190: 24 74 65 73 74 64 69 72 2f 74 65 73 74 65 72 2e  $testdir/tester.
01a0: 74 63 6c 0a 73 65 74 20 74 65 73 74 70 72 65 66  tcl.set testpref
01b0: 69 78 20 65 5f 74 6f 74 61 6c 63 68 61 6e 67 65  ix e_totalchange
01c0: 73 0a 0a 23 20 4c 69 6b 65 20 5b 64 6f 5f 65 78  s..# Like [do_ex
01d0: 65 63 73 71 6c 5f 74 65 73 74 5d 2c 20 65 78 63  ecsql_test], exc
01e0: 65 70 74 20 69 74 20 61 70 70 65 6e 64 73 20 74  ept it appends t
01f0: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
0200: 64 20 62 79 20 0a 23 20 5b 64 62 20 74 6f 74 61  d by .# [db tota
0210: 6c 5f 63 68 61 6e 67 65 73 5d 20 74 6f 20 74 68  l_changes] to th
0220: 65 20 72 65 73 75 6c 74 20 6f 66 20 65 78 65 63  e result of exec
0230: 75 74 69 6e 67 20 74 68 65 20 53 51 4c 20 73 63  uting the SQL sc
0240: 72 69 70 74 2e 0a 23 0a 70 72 6f 63 20 64 6f 5f  ript..#.proc do_
0250: 74 63 5f 74 65 73 74 20 7b 74 6e 20 73 71 6c 20  tc_test {tn sql 
0260: 72 65 73 7d 20 7b 0a 20 20 75 70 6c 65 76 65 6c  res} {.  uplevel
0270: 20 5b 6c 69 73 74 20 5c 0a 20 20 20 20 64 6f 5f   [list \.    do_
0280: 74 65 73 74 20 24 74 6e 20 22 63 6f 6e 63 61 74  test $tn "concat
0290: 20 5c 5b 65 78 65 63 73 71 6c 20 7b 24 73 71 6c   \[execsql {$sql
02a0: 7d 5c 5d 20 5c 5b 64 62 20 74 6f 74 61 6c 5f 63  }\] \[db total_c
02b0: 68 61 6e 67 65 73 5c 5d 22 20 24 72 65 73 0a 20  hanges\]" $res. 
02c0: 20 5d 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c   ].}..do_execsql
02d0: 5f 74 65 73 74 20 31 2e 30 20 7b 0a 20 20 43 52  _test 1.0 {.  CR
02e0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
02f0: 20 62 29 3b 0a 20 20 43 52 45 41 54 45 20 49 4e   b);.  CREATE IN
0300: 44 45 58 20 74 31 5f 62 20 4f 4e 20 74 31 28 62  DEX t1_b ON t1(b
0310: 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c  );.  CREATE TABL
0320: 45 20 74 32 28 78 2c 20 79 2c 20 50 52 49 4d 41  E t2(x, y, PRIMA
0330: 52 59 20 4b 45 59 28 78 2c 20 79 29 29 20 57 49  RY KEY(x, y)) WI
0340: 54 48 4f 55 54 20 52 4f 57 49 44 3b 0a 20 20 43  THOUT ROWID;.  C
0350: 52 45 41 54 45 20 49 4e 44 45 58 20 74 32 5f 79  REATE INDEX t2_y
0360: 20 4f 4e 20 74 32 28 79 29 3b 0a 7d 0a 0a 0a 23   ON t2(y);.}...#
0370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
03a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
03b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 56 49  ----------.# EVI
03c0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 35 34 33  DENCE-OF: R-6543
03d0: 38 2d 32 36 32 35 38 20 54 68 69 73 20 66 75 6e  8-26258 This fun
03e0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
03f0: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
0400: 66 0a 23 20 72 6f 77 73 20 69 6e 73 65 72 74 65  f.# rows inserte
0410: 64 2c 20 6d 6f 64 69 66 69 65 64 20 6f 72 20 64  d, modified or d
0420: 65 6c 65 74 65 64 20 62 79 20 61 6c 6c 20 49 4e  eleted by all IN
0430: 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20  SERT, UPDATE or 
0440: 44 45 4c 45 54 45 0a 23 20 73 74 61 74 65 6d 65  DELETE.# stateme
0450: 6e 74 73 20 63 6f 6d 70 6c 65 74 65 64 20 73 69  nts completed si
0460: 6e 63 65 20 74 68 65 20 64 61 74 61 62 61 73 65  nce the database
0470: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20   connection was 
0480: 6f 70 65 6e 65 64 2c 0a 23 20 69 6e 63 6c 75 64  opened,.# includ
0490: 69 6e 67 20 74 68 6f 73 65 20 65 78 65 63 75 74  ing those execut
04a0: 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 72  ed as part of tr
04b0: 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 0a  igger programs..
04c0: 23 0a 23 20 20 20 31 2e 31 2e 2a 3a 20 64 69 66  #.#   1.1.*: dif
04d0: 66 65 72 65 6e 74 20 74 79 70 65 73 20 6f 66 20  ferent types of 
04e0: 49 2f 55 2f 44 20 73 74 61 74 65 6d 65 6e 74 73  I/U/D statements
04f0: 2c 0a 23 20 20 20 31 2e 32 2e 2a 3a 20 74 72 69  ,.#   1.2.*: tri
0500: 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 0a 23  gger programs..#
0510: 0a 64 6f 5f 74 63 5f 74 65 73 74 20 31 2e 31 2e  .do_tc_test 1.1.
0520: 31 20 7b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  1 {.  INSERT INT
0530: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32  O t1 VALUES(1, 2
0540: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
0550: 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29   t1 VALUES(3, 4)
0560: 3b 0a 20 20 55 50 44 41 54 45 20 74 31 20 53 45  ;.  UPDATE t1 SE
0570: 54 20 61 20 3d 20 61 2b 31 3b 0a 20 20 44 45 4c  T a = a+1;.  DEL
0580: 45 54 45 20 46 52 4f 4d 20 74 31 3b 0a 7d 20 7b  ETE FROM t1;.} {
0590: 36 7d 0a 64 6f 5f 74 63 5f 74 65 73 74 20 31 2e  6}.do_tc_test 1.
05a0: 31 2e 32 20 7b 0a 20 20 44 45 4c 45 54 45 20 46  1.2 {.  DELETE F
05b0: 52 4f 4d 20 74 31 0a 7d 20 7b 36 7d 0a 0a 64 6f  ROM t1.} {6}..do
05c0: 5f 74 63 5f 74 65 73 74 20 31 2e 31 2e 33 20 7b  _tc_test 1.1.3 {
05d0: 0a 20 20 57 49 54 48 20 64 61 74 61 28 61 2c 62  .  WITH data(a,b
05e0: 29 20 41 53 20 28 0a 20 20 20 20 20 20 53 45 4c  ) AS (.      SEL
05f0: 45 43 54 20 30 2c 20 30 20 55 4e 49 4f 4e 20 41  ECT 0, 0 UNION A
0600: 4c 4c 20 53 45 4c 45 43 54 20 61 2b 31 2c 20 62  LL SELECT a+1, b
0610: 2b 31 20 46 52 4f 4d 20 64 61 74 61 20 57 48 45  +1 FROM data WHE
0620: 52 45 20 61 3c 39 39 0a 20 20 29 0a 20 20 49 4e  RE a<99.  ).  IN
0630: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
0640: 45 43 54 20 2a 20 46 52 4f 4d 20 64 61 74 61 3b  ECT * FROM data;
0650: 0a 7d 20 7b 31 30 36 7d 0a 0a 64 6f 5f 74 63 5f  .} {106}..do_tc_
0660: 74 65 73 74 20 31 2e 31 2e 34 20 7b 0a 20 20 49  test 1.1.4 {.  I
0670: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45  NSERT INTO t2 SE
0680: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
0690: 48 45 52 45 20 61 3c 35 30 3b 0a 20 20 55 50 44  HERE a<50;.  UPD
06a0: 41 54 45 20 74 32 20 53 45 54 20 79 3d 79 2b 31  ATE t2 SET y=y+1
06b0: 3b 0a 7d 20 7b 32 30 36 7d 0a 0a 64 6f 5f 74 63  ;.} {206}..do_tc
06c0: 5f 74 65 73 74 20 31 2e 31 2e 35 20 7b 0a 20 20  _test 1.1.5 {.  
06d0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 32 20 57  DELETE FROM t2 W
06e0: 48 45 52 45 20 79 3c 3d 32 35 0a 7d 20 7b 32 33  HERE y<=25.} {23
06f0: 31 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  1}..do_execsql_t
0700: 65 73 74 20 31 2e 32 2e 31 20 7b 0a 20 20 44 45  est 1.2.1 {.  DE
0710: 4c 45 54 45 20 46 52 4f 4d 20 74 31 3b 0a 20 20  LETE FROM t1;.  
0720: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 32 3b 0a  DELETE FROM t2;.
0730: 7d 0a 73 71 6c 69 74 65 33 20 64 62 20 74 65 73  }.sqlite3 db tes
0740: 74 2e 64 62 20 20 20 20 20 3b 20 23 20 54 6f 20  t.db     ; # To 
0750: 72 65 73 65 74 20 74 6f 74 61 6c 5f 63 68 61 6e  reset total_chan
0760: 67 65 73 0a 64 6f 5f 74 63 5f 74 65 73 74 20 31  ges.do_tc_test 1
0770: 2e 32 2e 32 20 7b 0a 20 20 43 52 45 41 54 45 20  .2.2 {.  CREATE 
0780: 54 41 42 4c 45 20 6c 6f 67 28 64 65 74 61 69 6c  TABLE log(detail
0790: 29 3b 0a 20 20 43 52 45 41 54 45 20 54 52 49 47  );.  CREATE TRIG
07a0: 47 45 52 20 74 31 5f 61 66 74 65 72 5f 69 6e 73  GER t1_after_ins
07b0: 65 72 74 20 41 46 54 45 52 20 49 4e 53 45 52 54  ert AFTER INSERT
07c0: 20 4f 4e 20 74 31 20 42 45 47 49 4e 20 0a 20 20   ON t1 BEGIN .  
07d0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c 6f    INSERT INTO lo
07e0: 67 20 56 41 4c 55 45 53 28 27 69 6e 73 65 72 74  g VALUES('insert
07f0: 65 64 20 69 6e 74 6f 20 74 31 27 29 3b 0a 20 20  ed into t1');.  
0800: 45 4e 44 3b 0a 0a 20 20 43 52 45 41 54 45 20 54  END;..  CREATE T
0810: 52 49 47 47 45 52 20 74 31 5f 62 65 66 6f 72 65  RIGGER t1_before
0820: 5f 64 65 6c 65 74 65 20 42 45 46 4f 52 45 20 44  _delete BEFORE D
0830: 45 4c 45 54 45 20 4f 4e 20 74 31 20 42 45 47 49  ELETE ON t1 BEGI
0840: 4e 20 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  N .    INSERT IN
0850: 54 4f 20 6c 6f 67 20 56 41 4c 55 45 53 28 27 64  TO log VALUES('d
0860: 65 6c 65 74 69 6e 67 20 66 72 6f 6d 20 74 31 27  eleting from t1'
0870: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
0880: 54 4f 20 6c 6f 67 20 56 41 4c 55 45 53 28 27 68  TO log VALUES('h
0890: 65 72 65 20 77 65 20 67 6f 21 27 29 3b 0a 20 20  ere we go!');.  
08a0: 45 4e 44 3b 0a 0a 20 20 43 52 45 41 54 45 20 54  END;..  CREATE T
08b0: 52 49 47 47 45 52 20 74 31 5f 61 66 74 65 72 5f  RIGGER t1_after_
08c0: 75 70 64 61 74 65 20 41 46 54 45 52 20 55 50 44  update AFTER UPD
08d0: 41 54 45 20 4f 4e 20 74 31 20 42 45 47 49 4e 20  ATE ON t1 BEGIN 
08e0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
08f0: 20 6c 6f 67 20 56 41 4c 55 45 53 28 27 75 70 64   log VALUES('upd
0900: 61 74 65 27 29 3b 0a 20 20 20 20 44 45 4c 45 54  ate');.    DELET
0910: 45 20 46 52 4f 4d 20 6c 6f 67 3b 0a 20 20 45 4e  E FROM log;.  EN
0920: 44 3b 0a 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  D;..  INSERT INT
0930: 4f 20 74 31 20 56 41 4c 55 45 53 28 27 61 27 2c  O t1 VALUES('a',
0940: 20 27 62 27 29 3b 20 20 20 2d 2d 20 31 20 2b 20   'b');   -- 1 + 
0950: 31 0a 20 20 55 50 44 41 54 45 20 74 31 20 53 45  1.  UPDATE t1 SE
0960: 54 20 62 3d 27 63 27 3b 20 20 20 20 20 20 20 20  T b='c';        
0970: 20 20 20 20 20 20 20 2d 2d 20 31 20 2b 20 31 20         -- 1 + 1 
0980: 2b 20 32 0a 20 20 44 45 4c 45 54 45 20 46 52 4f  + 2.  DELETE FRO
0990: 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 20 20  M t1;           
09a0: 20 20 20 20 20 20 20 20 20 2d 2d 20 31 20 2b 20           -- 1 + 
09b0: 31 20 2b 20 31 0a 7d 20 7b 39 7d 0a 0a 23 2d 2d  1 + 1.} {9}..#--
09c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a00: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 56 49 44 45  --------.# EVIDE
0a10: 4e 43 45 2d 4f 46 3a 20 52 2d 36 31 37 36 36 2d  NCE-OF: R-61766-
0a20: 31 35 32 35 33 20 45 78 65 63 75 74 69 6e 67 20  15253 Executing 
0a30: 61 6e 79 20 6f 74 68 65 72 20 74 79 70 65 20 6f  any other type o
0a40: 66 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 0a  f SQL statement.
0a50: 23 20 64 6f 65 73 20 6e 6f 74 20 61 66 66 65 63  # does not affec
0a60: 74 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  t the value retu
0a70: 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  rned by sqlite3_
0a80: 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 29 2e  total_changes().
0a90: 0a 64 6f 5f 74 63 5f 74 65 73 74 20 32 2e 31 20  .do_tc_test 2.1 
0aa0: 7b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  {.  INSERT INTO 
0ab0: 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 2c  t1 VALUES(1, 2),
0ac0: 20 28 33 2c 20 34 29 3b 0a 20 20 49 4e 53 45 52   (3, 4);.  INSER
0ad0: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
0ae0: 28 31 2c 20 32 29 2c 20 28 33 2c 20 34 29 3b 0a  (1, 2), (3, 4);.
0af0: 7d 20 7b 31 35 7d 0a 64 6f 5f 74 63 5f 74 65 73  } {15}.do_tc_tes
0b00: 74 20 32 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54  t 2.2 {.  SELECT
0b10: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
0b20: 31 3b 0a 7d 20 7b 32 20 31 35 7d 0a 64 6f 5f 74  1;.} {2 15}.do_t
0b30: 63 5f 74 65 73 74 20 32 2e 33 20 7b 0a 20 20 43  c_test 2.3 {.  C
0b40: 52 45 41 54 45 20 54 41 42 4c 45 20 74 34 28 61  REATE TABLE t4(a
0b50: 2c 20 62 29 3b 0a 20 20 41 4c 54 45 52 20 54 41  , b);.  ALTER TA
0b60: 42 4c 45 20 74 34 20 41 44 44 20 43 4f 4c 55 4d  BLE t4 ADD COLUM
0b70: 4e 20 63 3b 0a 20 20 43 52 45 41 54 45 20 49 4e  N c;.  CREATE IN
0b80: 44 45 58 20 69 34 20 4f 4e 20 74 34 28 63 29 3b  DEX i4 ON t4(c);
0b90: 0a 20 20 41 4c 54 45 52 20 54 41 42 4c 45 20 74  .  ALTER TABLE t
0ba0: 34 20 52 45 4e 41 4d 45 20 54 4f 20 74 35 3b 0a  4 RENAME TO t5;.
0bb0: 20 20 41 4e 41 4c 59 5a 45 3b 0a 20 20 42 45 47    ANALYZE;.  BEG
0bc0: 49 4e 3b 0a 20 20 44 52 4f 50 20 54 41 42 4c 45  IN;.  DROP TABLE
0bd0: 20 74 32 3b 0a 20 20 52 4f 4c 4c 42 41 43 4b 3b   t2;.  ROLLBACK;
0be0: 0a 20 20 56 41 43 55 55 4d 3b 0a 7d 20 7b 31 35  .  VACUUM;.} {15
0bf0: 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }...#-----------
0c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
0c40: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
0c50: 2d 33 36 30 34 33 2d 31 30 35 39 30 20 43 68 61  -36043-10590 Cha
0c60: 6e 67 65 73 20 6d 61 64 65 20 61 73 20 70 61 72  nges made as par
0c70: 74 20 6f 66 20 66 6f 72 65 69 67 6e 20 6b 65 79  t of foreign key
0c80: 0a 23 20 61 63 74 69 6f 6e 73 20 61 72 65 20 69  .# actions are i
0c90: 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 63  ncluded in the c
0ca0: 6f 75 6e 74 2c 20 62 75 74 20 74 68 6f 73 65 20  ount, but those 
0cb0: 6d 61 64 65 20 61 73 20 70 61 72 74 20 6f 66 20  made as part of 
0cc0: 52 45 50 4c 41 43 45 0a 23 20 63 6f 6e 73 74 72  REPLACE.# constr
0cd0: 61 69 6e 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  aint resolution 
0ce0: 61 72 65 20 6e 6f 74 2e 0a 23 0a 23 20 20 20 33  are not..#.#   3
0cf0: 2e 31 2e 2a 3a 20 66 6f 72 65 69 67 6e 20 6b 65  .1.*: foreign ke
0d00: 79 20 61 63 74 69 6f 6e 73 0a 23 20 20 20 33 2e  y actions.#   3.
0d10: 32 2e 2a 3a 20 52 45 50 4c 41 43 45 20 63 6f 6e  2.*: REPLACE con
0d20: 73 74 72 61 69 6e 74 73 2e 0a 23 0a 73 71 6c 69  straints..#.sqli
0d30: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 20 20  te3 db test.db  
0d40: 20 20 20 3b 20 23 20 54 6f 20 72 65 73 65 74 20     ; # To reset 
0d50: 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 0a 64 6f  total_changes.do
0d60: 5f 74 63 5f 74 65 73 74 20 33 2e 31 2e 31 20 7b  _tc_test 3.1.1 {
0d70: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
0d80: 70 31 28 63 20 50 52 49 4d 41 52 59 20 4b 45 59  p1(c PRIMARY KEY
0d90: 2c 20 64 29 3b 0a 20 20 43 52 45 41 54 45 20 54  , d);.  CREATE T
0da0: 41 42 4c 45 20 63 31 28 61 2c 20 62 2c 20 46 4f  ABLE c1(a, b, FO
0db0: 52 45 49 47 4e 20 4b 45 59 28 61 29 20 52 45 46  REIGN KEY(a) REF
0dc0: 45 52 45 4e 43 45 53 20 70 31 20 4f 4e 20 44 45  ERENCES p1 ON DE
0dd0: 4c 45 54 45 20 53 45 54 20 4e 55 4c 4c 29 3b 0a  LETE SET NULL);.
0de0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63    CREATE TABLE c
0df0: 32 28 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e 20  2(a, b, FOREIGN 
0e00: 4b 45 59 28 61 29 20 52 45 46 45 52 45 4e 43 45  KEY(a) REFERENCE
0e10: 53 20 70 31 20 4f 4e 20 44 45 4c 45 54 45 20 43  S p1 ON DELETE C
0e20: 41 53 43 41 44 45 29 3b 0a 20 20 43 52 45 41 54  ASCADE);.  CREAT
0e30: 45 20 54 41 42 4c 45 20 63 33 28 61 2c 20 62 2c  E TABLE c3(a, b,
0e40: 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 61 29 20   FOREIGN KEY(a) 
0e50: 52 45 46 45 52 45 4e 43 45 53 20 70 31 20 4f 4e  REFERENCES p1 ON
0e60: 20 44 45 4c 45 54 45 20 53 45 54 20 44 45 46 41   DELETE SET DEFA
0e70: 55 4c 54 29 3b 0a 0a 20 20 49 4e 53 45 52 54 20  ULT);..  INSERT 
0e80: 49 4e 54 4f 20 70 31 20 56 41 4c 55 45 53 28 31  INTO p1 VALUES(1
0e90: 2c 20 27 6f 6e 65 27 29 3b 0a 20 20 49 4e 53 45  , 'one');.  INSE
0ea0: 52 54 20 49 4e 54 4f 20 70 31 20 56 41 4c 55 45  RT INTO p1 VALUE
0eb0: 53 28 32 2c 20 27 74 77 6f 27 29 3b 0a 20 20 49  S(2, 'two');.  I
0ec0: 4e 53 45 52 54 20 49 4e 54 4f 20 70 31 20 56 41  NSERT INTO p1 VA
0ed0: 4c 55 45 53 28 33 2c 20 27 74 68 72 65 65 27 29  LUES(3, 'three')
0ee0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
0ef0: 70 31 20 56 41 4c 55 45 53 28 34 2c 20 27 66 6f  p1 VALUES(4, 'fo
0f00: 75 72 27 29 3b 0a 0a 20 20 49 4e 53 45 52 54 20  ur');..  INSERT 
0f10: 49 4e 54 4f 20 63 31 20 56 41 4c 55 45 53 28 31  INTO c1 VALUES(1
0f20: 2c 20 27 69 27 29 3b 0a 20 20 49 4e 53 45 52 54  , 'i');.  INSERT
0f30: 20 49 4e 54 4f 20 63 32 20 56 41 4c 55 45 53 28   INTO c2 VALUES(
0f40: 32 2c 20 27 69 69 27 29 3b 0a 20 20 49 4e 53 45  2, 'ii');.  INSE
0f50: 52 54 20 49 4e 54 4f 20 63 33 20 56 41 4c 55 45  RT INTO c3 VALUE
0f60: 53 28 33 2c 20 27 69 69 69 27 29 3b 0a 20 20 50  S(3, 'iii');.  P
0f70: 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65  RAGMA foreign_ke
0f80: 79 73 20 3d 20 4f 4e 3b 0a 7d 20 7b 37 7d 0a 0a  ys = ON;.} {7}..
0f90: 64 6f 5f 74 63 5f 74 65 73 74 20 33 2e 31 2e 32  do_tc_test 3.1.2
0fa0: 20 7b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 70   { DELETE FROM p
0fb0: 31 20 57 48 45 52 45 20 63 3d 31 3b 20 7d 20 7b  1 WHERE c=1; } {
0fc0: 39 7d 0a 64 6f 5f 74 63 5f 74 65 73 74 20 33 2e  9}.do_tc_test 3.
0fd0: 31 2e 33 20 7b 20 44 45 4c 45 54 45 20 46 52 4f  1.3 { DELETE FRO
0fe0: 4d 20 70 31 20 57 48 45 52 45 20 63 3d 32 3b 20  M p1 WHERE c=2; 
0ff0: 7d 20 7b 31 31 7d 0a 64 6f 5f 74 63 5f 74 65 73  } {11}.do_tc_tes
1000: 74 20 33 2e 31 2e 34 20 7b 20 44 45 4c 45 54 45  t 3.1.4 { DELETE
1010: 20 46 52 4f 4d 20 70 31 20 57 48 45 52 45 20 63   FROM p1 WHERE c
1020: 3d 33 3b 20 7d 20 7b 31 33 7d 0a 64 6f 5f 74 63  =3; } {13}.do_tc
1030: 5f 74 65 73 74 20 33 2e 31 2e 35 20 7b 20 44 45  _test 3.1.5 { DE
1040: 4c 45 54 45 20 46 52 4f 4d 20 70 31 20 57 48 45  LETE FROM p1 WHE
1050: 52 45 20 63 3d 34 3b 20 7d 20 7b 31 34 7d 20 20  RE c=4; } {14}  
1060: 3b 20 23 20 6f 6e 6c 79 20 31 20 74 68 69 73 20  ; # only 1 this 
1070: 74 69 6d 65 2e 0a 0a 73 71 6c 69 74 65 33 20 64  time...sqlite3 d
1080: 62 20 74 65 73 74 2e 64 62 20 20 20 20 20 3b 20  b test.db     ; 
1090: 23 20 54 6f 20 72 65 73 65 74 20 74 6f 74 61 6c  # To reset total
10a0: 5f 63 68 61 6e 67 65 73 0a 64 6f 5f 74 63 5f 74  _changes.do_tc_t
10b0: 65 73 74 20 33 2e 31 2e 36 20 7b 0a 20 20 44 52  est 3.1.6 {.  DR
10c0: 4f 50 20 54 41 42 4c 45 20 63 31 3b 0a 20 20 44  OP TABLE c1;.  D
10d0: 52 4f 50 20 54 41 42 4c 45 20 63 32 3b 0a 20 20  ROP TABLE c2;.  
10e0: 44 52 4f 50 20 54 41 42 4c 45 20 63 33 3b 0a 20  DROP TABLE c3;. 
10f0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 31   CREATE TABLE c1
1100: 28 61 2c 20 62 2c 20 46 4f 52 45 49 47 4e 20 4b  (a, b, FOREIGN K
1110: 45 59 28 61 29 20 52 45 46 45 52 45 4e 43 45 53  EY(a) REFERENCES
1120: 20 70 31 20 4f 4e 20 55 50 44 41 54 45 20 53 45   p1 ON UPDATE SE
1130: 54 20 4e 55 4c 4c 29 3b 0a 20 20 43 52 45 41 54  T NULL);.  CREAT
1140: 45 20 54 41 42 4c 45 20 63 32 28 61 2c 20 62 2c  E TABLE c2(a, b,
1150: 20 46 4f 52 45 49 47 4e 20 4b 45 59 28 61 29 20   FOREIGN KEY(a) 
1160: 52 45 46 45 52 45 4e 43 45 53 20 70 31 20 4f 4e  REFERENCES p1 ON
1170: 20 55 50 44 41 54 45 20 43 41 53 43 41 44 45 29   UPDATE CASCADE)
1180: 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  ;.  CREATE TABLE
1190: 20 63 33 28 61 2c 20 62 2c 20 46 4f 52 45 49 47   c3(a, b, FOREIG
11a0: 4e 20 4b 45 59 28 61 29 20 52 45 46 45 52 45 4e  N KEY(a) REFEREN
11b0: 43 45 53 20 70 31 20 4f 4e 20 55 50 44 41 54 45  CES p1 ON UPDATE
11c0: 20 53 45 54 20 44 45 46 41 55 4c 54 29 3b 0a 0a   SET DEFAULT);..
11d0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 70 31    INSERT INTO p1
11e0: 20 56 41 4c 55 45 53 28 31 2c 20 27 6f 6e 65 27   VALUES(1, 'one'
11f0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
1200: 20 70 31 20 56 41 4c 55 45 53 28 32 2c 20 27 74   p1 VALUES(2, 't
1210: 77 6f 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  wo');.  INSERT I
1220: 4e 54 4f 20 70 31 20 56 41 4c 55 45 53 28 33 2c  NTO p1 VALUES(3,
1230: 20 27 74 68 72 65 65 27 29 3b 0a 20 20 49 4e 53   'three');.  INS
1240: 45 52 54 20 49 4e 54 4f 20 70 31 20 56 41 4c 55  ERT INTO p1 VALU
1250: 45 53 28 34 2c 20 27 66 6f 75 72 27 29 3b 0a 0a  ES(4, 'four');..
1260: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 31    INSERT INTO c1
1270: 20 56 41 4c 55 45 53 28 31 2c 20 27 69 27 29 3b   VALUES(1, 'i');
1280: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63  .  INSERT INTO c
1290: 32 20 56 41 4c 55 45 53 28 32 2c 20 27 69 69 27  2 VALUES(2, 'ii'
12a0: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
12b0: 20 63 33 20 56 41 4c 55 45 53 28 33 2c 20 27 69   c3 VALUES(3, 'i
12c0: 69 69 27 29 3b 0a 20 20 50 52 41 47 4d 41 20 66  ii');.  PRAGMA f
12d0: 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 4f 4e  oreign_keys = ON
12e0: 3b 0a 7d 20 7b 37 7d 0a 0a 64 6f 5f 74 63 5f 74  ;.} {7}..do_tc_t
12f0: 65 73 74 20 33 2e 31 2e 37 20 20 7b 20 55 50 44  est 3.1.7  { UPD
1300: 41 54 45 20 70 31 20 53 45 54 20 63 3d 63 2b 34  ATE p1 SET c=c+4
1310: 20 57 48 45 52 45 20 63 3d 31 3b 20 7d 20 7b 39   WHERE c=1; } {9
1320: 7d 0a 64 6f 5f 74 63 5f 74 65 73 74 20 33 2e 31  }.do_tc_test 3.1
1330: 2e 38 20 20 7b 20 55 50 44 41 54 45 20 70 31 20  .8  { UPDATE p1 
1340: 53 45 54 20 63 3d 63 2b 34 20 57 48 45 52 45 20  SET c=c+4 WHERE 
1350: 63 3d 32 3b 20 7d 20 7b 31 31 7d 0a 64 6f 5f 74  c=2; } {11}.do_t
1360: 63 5f 74 65 73 74 20 33 2e 31 2e 39 20 20 7b 20  c_test 3.1.9  { 
1370: 55 50 44 41 54 45 20 70 31 20 53 45 54 20 63 3d  UPDATE p1 SET c=
1380: 63 2b 34 20 57 48 45 52 45 20 63 3d 33 3b 20 7d  c+4 WHERE c=3; }
1390: 20 7b 31 33 7d 0a 64 6f 5f 74 63 5f 74 65 73 74   {13}.do_tc_test
13a0: 20 33 2e 31 2e 31 30 20 7b 20 55 50 44 41 54 45   3.1.10 { UPDATE
13b0: 20 70 31 20 53 45 54 20 63 3d 63 2b 34 20 57 48   p1 SET c=c+4 WH
13c0: 45 52 45 20 63 3d 34 3b 20 7d 20 7b 31 34 7d 20  ERE c=4; } {14} 
13d0: 20 3b 20 23 20 6f 6e 6c 79 20 31 20 74 68 69 73   ; # only 1 this
13e0: 20 74 69 6d 65 2e 0a 0a 73 71 6c 69 74 65 33 20   time...sqlite3 
13f0: 64 62 20 74 65 73 74 2e 64 62 20 20 20 20 20 3b  db test.db     ;
1400: 20 23 20 54 6f 20 72 65 73 65 74 20 74 6f 74 61   # To reset tota
1410: 6c 5f 63 68 61 6e 67 65 73 0a 64 6f 5f 74 63 5f  l_changes.do_tc_
1420: 74 65 73 74 20 33 2e 32 2e 31 20 7b 0a 20 20 43  test 3.2.1 {.  C
1430: 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 61  REATE TABLE t3(a
1440: 20 55 4e 49 51 55 45 2c 20 62 20 55 4e 49 51 55   UNIQUE, b UNIQU
1450: 45 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  E);.  INSERT INT
1460: 4f 20 74 33 20 56 41 4c 55 45 53 28 27 6f 6e 65  O t3 VALUES('one
1470: 27 2c 20 27 6f 6e 65 27 29 3b 0a 20 20 49 4e 53  ', 'one');.  INS
1480: 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55  ERT INTO t3 VALU
1490: 45 53 28 27 74 77 6f 27 2c 20 27 74 77 6f 27 29  ES('two', 'two')
14a0: 3b 0a 20 20 49 4e 53 45 52 54 20 4f 52 20 52 45  ;.  INSERT OR RE
14b0: 50 4c 41 43 45 20 49 4e 54 4f 20 74 33 20 56 41  PLACE INTO t3 VA
14c0: 4c 55 45 53 28 27 6f 6e 65 27 2c 20 27 74 77 6f  LUES('one', 'two
14d0: 27 29 3b 0a 7d 20 7b 33 7d 0a 0a 64 6f 5f 74 63  ');.} {3}..do_tc
14e0: 5f 74 65 73 74 20 33 2e 32 2e 32 20 7b 0a 20 20  _test 3.2.2 {.  
14f0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56  INSERT INTO t3 V
1500: 41 4c 55 45 53 28 27 74 68 72 65 65 27 2c 20 27  ALUES('three', '
1510: 6f 6e 65 27 29 3b 0a 20 20 55 50 44 41 54 45 20  one');.  UPDATE 
1520: 4f 52 20 52 45 50 4c 41 43 45 20 74 33 20 53 45  OR REPLACE t3 SE
1530: 54 20 62 3d 27 74 77 6f 27 20 57 48 45 52 45 20  T b='two' WHERE 
1540: 62 3d 27 6f 6e 65 27 3b 0a 20 20 53 45 4c 45 43  b='one';.  SELEC
1550: 54 20 2a 20 46 52 4f 4d 20 74 33 3b 0a 7d 20 7b  T * FROM t3;.} {
1560: 74 68 72 65 65 20 74 77 6f 20 35 7d 0a 0a 23 2d  three two 5}..#-
1570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 45 56 49 44  ---------.# EVID
15c0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 34 38 37 32  ENCE-OF: R-54872
15d0: 2d 30 38 37 34 31 20 43 68 61 6e 67 65 73 20 74  -08741 Changes t
15e0: 6f 20 61 20 76 69 65 77 20 74 68 61 74 20 61 72  o a view that ar
15f0: 65 20 69 6e 74 65 72 63 65 70 74 65 64 20 62 79  e intercepted by
1600: 0a 23 20 49 4e 53 54 45 41 44 20 4f 46 20 74 72  .# INSTEAD OF tr
1610: 69 67 67 65 72 73 20 61 72 65 20 6e 6f 74 20 63  iggers are not c
1620: 6f 75 6e 74 65 64 2e 0a 23 0a 73 71 6c 69 74 65  ounted..#.sqlite
1630: 33 20 64 62 20 74 65 73 74 2e 64 62 20 20 20 20  3 db test.db    
1640: 20 3b 20 23 20 54 6f 20 72 65 73 65 74 20 74 6f   ; # To reset to
1650: 74 61 6c 5f 63 68 61 6e 67 65 73 0a 64 6f 5f 74  tal_changes.do_t
1660: 63 5f 74 65 73 74 20 34 2e 31 20 7b 0a 20 20 43  c_test 4.1 {.  C
1670: 52 45 41 54 45 20 54 41 42 4c 45 20 74 36 28 78  REATE TABLE t6(x
1680: 29 3b 0a 20 20 43 52 45 41 54 45 20 56 49 45 57  );.  CREATE VIEW
1690: 20 76 31 20 41 53 20 53 45 4c 45 43 54 20 2a 20   v1 AS SELECT * 
16a0: 46 52 4f 4d 20 74 36 3b 0a 20 20 43 52 45 41 54  FROM t6;.  CREAT
16b0: 45 20 54 52 49 47 47 45 52 20 76 31 5f 74 72 31  E TRIGGER v1_tr1
16c0: 20 49 4e 53 54 45 41 44 20 4f 46 20 49 4e 53 45   INSTEAD OF INSE
16d0: 52 54 20 4f 4e 20 76 31 20 42 45 47 49 4e 0a 20  RT ON v1 BEGIN. 
16e0: 20 20 20 53 45 4c 45 43 54 20 27 6e 6f 2d 6f 70     SELECT 'no-op
16f0: 27 3b 0a 20 20 45 4e 44 3b 0a 0a 20 20 49 4e 53  ';.  END;..  INS
1700: 45 52 54 20 49 4e 54 4f 20 76 31 20 56 41 4c 55  ERT INTO v1 VALU
1710: 45 53 28 27 61 27 29 3b 0a 20 20 49 4e 53 45 52  ES('a');.  INSER
1720: 54 20 49 4e 54 4f 20 76 31 20 56 41 4c 55 45 53  T INTO v1 VALUES
1730: 28 27 62 27 29 3b 0a 7d 20 7b 30 7d 0a 64 6f 5f  ('b');.} {0}.do_
1740: 74 63 5f 74 65 73 74 20 34 2e 32 20 7b 0a 20 20  tc_test 4.2 {.  
1750: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 76  CREATE TRIGGER v
1760: 31 5f 74 72 32 20 49 4e 53 54 45 41 44 20 4f 46  1_tr2 INSTEAD OF
1770: 20 49 4e 53 45 52 54 20 4f 4e 20 76 31 20 42 45   INSERT ON v1 BE
1780: 47 49 4e 0a 20 20 20 20 49 4e 53 45 52 54 20 49  GIN.    INSERT I
1790: 4e 54 4f 20 74 36 20 56 41 4c 55 45 53 28 6e 65  NTO t6 VALUES(ne
17a0: 77 2e 78 29 3b 0a 20 20 45 4e 44 3b 0a 0a 20 20  w.x);.  END;..  
17b0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 76 31 20 56  INSERT INTO v1 V
17c0: 41 4c 55 45 53 28 27 63 27 29 3b 0a 20 20 49 4e  ALUES('c');.  IN
17d0: 53 45 52 54 20 49 4e 54 4f 20 76 31 20 56 41 4c  SERT INTO v1 VAL
17e0: 55 45 53 28 27 64 27 29 3b 0a 7d 20 7b 32 7d 0a  UES('d');.} {2}.
17f0: 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a        ..finish_test.