/ Hex Artifact Content
Login

Artifact 46bead5f39e181850ee56adcf49d3a3157c460c52249211714612ac89fe34835:


0000: 23 20 32 30 30 37 20 4a 61 6e 75 61 72 79 20 32  # 2007 January 2
0010: 34 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72  4.#.# The author
0020: 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72   disclaims copyr
0030: 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75  ight to this sou
0040: 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c  rce code.  In pl
0050: 61 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c  ace of.# a legal
0060: 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73   notice, here is
0070: 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23   a blessing:.#.#
0080: 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67      May you do g
0090: 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c  ood and not evil
00a0: 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66  ..#    May you f
00b0: 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20  ind forgiveness 
00c0: 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64  for yourself and
00d0: 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e   forgive others.
00e0: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68  .#    May you sh
00f0: 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65  are freely, neve
0100: 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68  r taking more th
0110: 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23  an 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 2a 0a 23 20 54 68 69 73 20 66  *******.# This f
0170: 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 72  ile implements r
0180: 65 67 72 65 73 73 69 6f 6e 20 74 65 73 74 73 20  egression tests 
0190: 66 6f 72 20 53 51 4c 69 74 65 20 6c 69 62 72 61  for SQLite libra
01a0: 72 79 2e 20 20 54 68 65 0a 23 20 66 6f 63 75 73  ry.  The.# focus
01b0: 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20 69 73   of this file is
01c0: 20 74 65 73 74 69 6e 67 20 74 68 65 20 49 4e 53   testing the INS
01d0: 45 52 54 20 74 72 61 6e 73 66 65 72 20 6f 70 74  ERT transfer opt
01e0: 69 6d 69 7a 61 74 69 6f 6e 2e 0a 23 0a 23 20 24  imization..#.# $
01f0: 49 64 3a 20 69 6e 73 65 72 74 34 2e 74 65 73 74  Id: insert4.test
0200: 2c 76 20 31 2e 31 30 20 32 30 30 38 2f 30 31 2f  ,v 1.10 2008/01/
0210: 32 31 20 31 36 3a 32 32 3a 34 36 20 64 72 68 20  21 16:22:46 drh 
0220: 45 78 70 20 24 0a 0a 73 65 74 20 74 65 73 74 64  Exp $..set testd
0230: 69 72 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65  ir [file dirname
0240: 20 24 61 72 67 76 30 5d 0a 73 6f 75 72 63 65 20   $argv0].source 
0250: 24 74 65 73 74 64 69 72 2f 74 65 73 74 65 72 2e  $testdir/tester.
0260: 74 63 6c 0a 73 65 74 20 74 65 73 74 70 72 65 66  tcl.set testpref
0270: 69 78 20 69 6e 73 65 72 74 34 0a 0a 69 66 63 61  ix insert4..ifca
0280: 70 61 62 6c 65 20 21 76 69 65 77 7c 7c 21 73 75  pable !view||!su
0290: 62 71 75 65 72 79 20 7b 0a 20 20 66 69 6e 69 73  bquery {.  finis
02a0: 68 5f 74 65 73 74 0a 20 20 72 65 74 75 72 6e 0a  h_test.  return.
02b0: 7d 0a 0a 23 20 54 68 65 20 73 71 6c 69 74 65 33  }..# The sqlite3
02c0: 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74 20 76  _xferopt_count v
02d0: 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65  ariable is incre
02e0: 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20  mented whenever 
02f0: 74 68 65 20 0a 23 20 69 6e 73 65 72 74 20 74 72  the .# insert tr
0300: 61 6e 73 66 65 72 20 6f 70 74 69 6d 69 7a 61 74  ansfer optimizat
0310: 69 6f 6e 20 61 70 70 6c 69 65 73 2e 0a 23 0a 23  ion applies..#.#
0320: 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   This procedure 
0330: 72 75 6e 73 20 61 20 74 65 73 74 20 74 6f 20 73  runs a test to s
0340: 65 65 20 69 66 20 74 68 65 20 73 71 6c 69 74 65  ee if the sqlite
0350: 33 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74 20  3_xferopt_count 
0360: 69 73 0a 23 20 73 65 74 20 74 6f 20 4e 2e 0a 23  is.# set to N..#
0370: 0a 70 72 6f 63 20 78 66 65 72 6f 70 74 5f 74 65  .proc xferopt_te
0380: 73 74 20 7b 74 65 73 74 6e 61 6d 65 20 4e 7d 20  st {testname N} 
0390: 7b 0a 20 20 64 6f 5f 74 65 73 74 20 24 74 65 73  {.  do_test $tes
03a0: 74 6e 61 6d 65 20 7b 73 65 74 20 3a 3a 73 71 6c  tname {set ::sql
03b0: 69 74 65 33 5f 78 66 65 72 6f 70 74 5f 63 6f 75  ite3_xferopt_cou
03c0: 6e 74 7d 20 24 4e 0a 7d 0a 0a 23 20 43 72 65 61  nt} $N.}..# Crea
03d0: 74 65 20 74 61 62 6c 65 73 20 75 73 65 64 20 66  te tables used f
03e0: 6f 72 20 74 65 73 74 69 6e 67 2e 0a 23 0a 65 78  or testing..#.ex
03f0: 65 63 73 71 6c 20 7b 0a 20 20 50 52 41 47 4d 41  ecsql {.  PRAGMA
0400: 20 6c 65 67 61 63 79 5f 66 69 6c 65 5f 66 6f 72   legacy_file_for
0410: 6d 61 74 20 3d 20 30 3b 0a 20 20 43 52 45 41 54  mat = 0;.  CREAT
0420: 45 20 54 41 42 4c 45 20 74 31 28 61 20 69 6e 74  E TABLE t1(a int
0430: 2c 20 62 20 69 6e 74 2c 20 63 68 65 63 6b 28 62  , b int, check(b
0440: 3e 61 29 29 3b 0a 20 20 43 52 45 41 54 45 20 54  >a));.  CREATE T
0450: 41 42 4c 45 20 74 32 28 78 20 69 6e 74 2c 20 79  ABLE t2(x int, y
0460: 20 69 6e 74 29 3b 0a 20 20 43 52 45 41 54 45 20   int);.  CREATE 
0470: 56 49 45 57 20 76 32 20 41 53 20 53 45 4c 45 43  VIEW v2 AS SELEC
0480: 54 20 79 2c 20 78 20 46 52 4f 4d 20 74 32 3b 0a  T y, x FROM t2;.
0490: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
04a0: 33 28 61 20 69 6e 74 2c 20 62 20 69 6e 74 29 3b  3(a int, b int);
04b0: 0a 7d 0a 0a 23 20 54 69 63 6b 65 74 20 23 32 32  .}..# Ticket #22
04c0: 35 32 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74  52.  Make sure t
04d0: 68 65 20 61 6e 20 49 4e 53 45 52 54 20 66 72 6f  he an INSERT fro
04e0: 6d 20 69 64 65 6e 74 69 63 61 6c 20 74 61 62 6c  m identical tabl
04f0: 65 73 0a 23 20 64 6f 65 73 20 6e 6f 74 20 76 69  es.# does not vi
0500: 6f 6c 61 74 65 20 63 6f 6e 73 74 72 61 69 6e 74  olate constraint
0510: 73 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 69 6e 73  s..#.do_test ins
0520: 65 72 74 34 2d 31 2e 31 20 7b 0a 20 20 73 65 74  ert4-1.1 {.  set
0530: 20 73 71 6c 69 74 65 33 5f 78 66 65 72 6f 70 74   sqlite3_xferopt
0540: 5f 63 6f 75 6e 74 20 30 0a 20 20 65 78 65 63 73  _count 0.  execs
0550: 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20  ql {.    DELETE 
0560: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 44 45 4c  FROM t1;.    DEL
0570: 45 54 45 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20  ETE FROM t2;.   
0580: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
0590: 56 41 4c 55 45 53 28 39 2c 31 29 3b 0a 20 20 7d  VALUES(9,1);.  }
05a0: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .  catchsql {.  
05b0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
05c0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
05d0: 32 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 43 48 45  2;.  }.} {1 {CHE
05e0: 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  CK constraint fa
05f0: 69 6c 65 64 3a 20 74 31 7d 7d 0a 78 66 65 72 6f  iled: t1}}.xfero
0600: 70 74 5f 74 65 73 74 20 69 6e 73 65 72 74 34 2d  pt_test insert4-
0610: 31 2e 32 20 30 0a 64 6f 5f 74 65 73 74 20 69 6e  1.2 0.do_test in
0620: 73 65 72 74 34 2d 31 2e 33 20 7b 0a 20 20 65 78  sert4-1.3 {.  ex
0630: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  ecsql {.    SELE
0640: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT * FROM t1;.  
0650: 7d 0a 7d 20 7b 7d 0a 0a 23 20 54 65 73 74 73 20  }.} {}..# Tests 
0660: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
0670: 74 20 74 68 65 20 74 72 61 6e 73 66 65 72 20 6f  t the transfer o
0680: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 6e  ptimization is n
0690: 6f 74 20 6f 63 63 75 72 72 69 6e 67 0a 23 20 77  ot occurring.# w
06a0: 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 61 20  hen it is not a 
06b0: 76 61 6c 69 64 20 6f 70 74 69 6d 69 7a 61 74 69  valid optimizati
06c0: 6f 6e 2e 0a 23 0a 23 20 54 68 65 20 53 45 4c 45  on..#.# The SELE
06d0: 43 54 20 6d 75 73 74 20 62 65 20 61 67 61 69 6e  CT must be again
06e0: 73 74 20 61 20 72 65 61 6c 20 74 61 62 6c 65 2e  st a real table.
06f0: 0a 64 6f 5f 74 65 73 74 20 69 6e 73 65 72 74 34  .do_test insert4
0700: 2d 32 2e 31 2e 31 20 7b 0a 20 20 65 78 65 63 73  -2.1.1 {.  execs
0710: 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20  ql {.    DELETE 
0720: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53  FROM t1;.    INS
0730: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
0740: 43 54 20 34 2c 20 38 3b 0a 20 20 20 20 53 45 4c  CT 4, 8;.    SEL
0750: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20  ECT * FROM t1;. 
0760: 20 7d 0a 7d 20 7b 34 20 38 7d 0a 78 66 65 72 6f   }.} {4 8}.xfero
0770: 70 74 5f 74 65 73 74 20 69 6e 73 65 72 74 34 2d  pt_test insert4-
0780: 32 2e 31 2e 32 20 20 30 0a 64 6f 5f 74 65 73 74  2.1.2  0.do_test
0790: 20 69 6e 73 65 72 74 34 2d 32 2e 32 2e 31 20 7b   insert4-2.2.1 {
07a0: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .  catchsql {.  
07b0: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31    DELETE FROM t1
07c0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
07d0: 4f 20 74 31 20 53 45 4c 45 43 54 20 2a 20 46 52  O t1 SELECT * FR
07e0: 4f 4d 20 76 32 3b 0a 20 20 20 20 53 45 4c 45 43  OM v2;.    SELEC
07f0: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d  T * FROM t1;.  }
0800: 0a 7d 20 7b 30 20 7b 31 20 39 7d 7d 0a 78 66 65  .} {0 {1 9}}.xfe
0810: 72 6f 70 74 5f 74 65 73 74 20 69 6e 73 65 72 74  ropt_test insert
0820: 34 2d 32 2e 32 2e 32 20 30 0a 0a 23 20 44 6f 20  4-2.2.2 0..# Do 
0830: 6e 6f 74 20 72 75 6e 20 74 68 65 20 74 72 61 6e  not run the tran
0840: 73 66 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f  sfer optimizatio
0850: 6e 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  n if there is a 
0860: 4c 49 4d 49 54 20 63 6c 61 75 73 65 0a 23 0a 64  LIMIT clause.#.d
0870: 6f 5f 74 65 73 74 20 69 6e 73 65 72 74 34 2d 32  o_test insert4-2
0880: 2e 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  .3.1 {.  execsql
0890: 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52   {.    DELETE FR
08a0: 4f 4d 20 74 32 3b 0a 20 20 20 20 49 4e 53 45 52  OM t2;.    INSER
08b0: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
08c0: 28 39 2c 31 29 3b 0a 20 20 20 20 49 4e 53 45 52  (9,1);.    INSER
08d0: 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54  T INTO t2 SELECT
08e0: 20 79 2c 20 78 20 46 52 4f 4d 20 74 32 3b 0a 20   y, x FROM t2;. 
08f0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
0900: 33 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  3 SELECT * FROM 
0910: 74 32 20 4c 49 4d 49 54 20 31 3b 0a 20 20 20 20  t2 LIMIT 1;.    
0920: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33  SELECT * FROM t3
0930: 3b 0a 20 20 7d 0a 7d 20 7b 39 20 31 7d 0a 78 66  ;.  }.} {9 1}.xf
0940: 65 72 6f 70 74 5f 74 65 73 74 20 69 6e 73 65 72  eropt_test inser
0950: 74 34 2d 32 2e 33 2e 32 20 20 30 0a 64 6f 5f 74  t4-2.3.2  0.do_t
0960: 65 73 74 20 69 6e 73 65 72 74 34 2d 32 2e 33 2e  est insert4-2.3.
0970: 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  3 {.  catchsql {
0980: 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  .    DELETE FROM
0990: 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   t1;.    INSERT 
09a0: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 2a  INTO t1 SELECT *
09b0: 20 46 52 4f 4d 20 74 32 20 4c 49 4d 49 54 20 31   FROM t2 LIMIT 1
09c0: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
09d0: 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31  ROM t1;.  }.} {1
09e0: 20 7b 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69   {CHECK constrai
09f0: 6e 74 20 66 61 69 6c 65 64 3a 20 74 31 7d 7d 0a  nt failed: t1}}.
0a00: 78 66 65 72 6f 70 74 5f 74 65 73 74 20 69 6e 73  xferopt_test ins
0a10: 65 72 74 34 2d 32 2e 33 2e 34 20 30 0a 0a 23 20  ert4-2.3.4 0..# 
0a20: 44 6f 20 6e 6f 74 20 72 75 6e 20 74 68 65 20 74  Do not run the t
0a30: 72 61 6e 73 66 65 72 20 6f 70 74 69 6d 69 7a 61  ransfer optimiza
0a40: 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69 73  tion if there is
0a50: 20 61 20 44 49 53 54 49 4e 43 54 0a 23 0a 64 6f   a DISTINCT.#.do
0a60: 5f 74 65 73 74 20 69 6e 73 65 72 74 34 2d 32 2e  _test insert4-2.
0a70: 34 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  4.1 {.  execsql 
0a80: 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  {.    DELETE FRO
0a90: 4d 20 74 33 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t3;.    INSERT
0aa0: 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43 54 20   INTO t3 SELECT 
0ab0: 44 49 53 54 49 4e 43 54 20 2a 20 46 52 4f 4d 20  DISTINCT * FROM 
0ac0: 74 32 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  t2;.    SELECT *
0ad0: 20 46 52 4f 4d 20 74 33 3b 0a 20 20 7d 0a 7d 20   FROM t3;.  }.} 
0ae0: 7b 39 20 31 20 31 20 39 7d 0a 78 66 65 72 6f 70  {9 1 1 9}.xferop
0af0: 74 5f 74 65 73 74 20 69 6e 73 65 72 74 34 2d 32  t_test insert4-2
0b00: 2e 34 2e 32 20 30 0a 64 6f 5f 74 65 73 74 20 69  .4.2 0.do_test i
0b10: 6e 73 65 72 74 34 2d 32 2e 34 2e 33 20 7b 0a 20  nsert4-2.4.3 {. 
0b20: 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20   catchsql {.    
0b30: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 3b 0a  DELETE FROM t1;.
0b40: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0b50: 74 31 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e  t1 SELECT DISTIN
0b60: 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20  CT * FROM t2;.  
0b70: 7d 0a 7d 20 7b 31 20 7b 43 48 45 43 4b 20 63 6f  }.} {1 {CHECK co
0b80: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 3a  nstraint failed:
0b90: 20 74 31 7d 7d 0a 78 66 65 72 6f 70 74 5f 74 65   t1}}.xferopt_te
0ba0: 73 74 20 69 6e 73 65 72 74 34 2d 32 2e 34 2e 34  st insert4-2.4.4
0bb0: 20 30 0a 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77   0..# The follow
0bc0: 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 63 6f  ing procedure co
0bd0: 6e 73 74 72 75 63 74 73 20 74 77 6f 20 74 61 62  nstructs two tab
0be0: 6c 65 73 20 74 68 65 6e 20 74 72 69 65 73 20 74  les then tries t
0bf0: 6f 20 74 72 61 6e 73 66 65 72 0a 23 20 64 61 74  o transfer.# dat
0c00: 61 20 66 72 6f 6d 20 6f 6e 65 20 74 61 62 6c 65  a from one table
0c10: 20 74 6f 20 74 68 65 20 6f 74 68 65 72 2e 20 20   to the other.  
0c20: 43 68 65 63 6b 73 20 61 72 65 20 6d 61 64 65 20  Checks are made 
0c30: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
0c40: 0a 23 20 74 72 61 6e 73 66 65 72 20 69 73 20 73  .# transfer is s
0c50: 75 63 63 65 73 73 66 75 6c 20 61 6e 64 20 74 68  uccessful and th
0c60: 61 74 20 74 68 65 20 74 72 61 6e 73 66 65 72 20  at the transfer 
0c70: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77 61 73  optimization was
0c80: 20 75 73 65 64 20 6f 72 0a 23 20 6e 6f 74 2c 20   used or.# not, 
0c90: 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a  as appropriate..
0ca0: 23 0a 23 20 20 20 20 20 78 66 65 72 5f 63 68 65  #.#     xfer_che
0cb0: 63 6b 20 54 45 53 54 49 44 20 20 58 46 45 52 2d  ck TESTID  XFER-
0cc0: 55 53 45 44 20 20 20 49 4e 49 54 2d 44 41 54 41  USED   INIT-DATA
0cd0: 20 20 20 44 45 53 54 2d 53 43 48 45 4d 41 20 20     DEST-SCHEMA  
0ce0: 20 53 52 43 2d 53 43 48 45 4d 41 20 0a 23 0a 23   SRC-SCHEMA .#.#
0cf0: 20 54 68 65 20 54 45 53 54 49 44 20 61 72 67 75   The TESTID argu
0d00: 6d 65 6e 74 20 69 73 20 74 68 65 20 73 79 6d 62  ment is the symb
0d10: 6f 6c 69 63 20 6e 61 6d 65 20 66 6f 72 20 74 68  olic name for th
0d20: 69 73 20 74 65 73 74 2e 20 20 54 68 65 20 58 46  is test.  The XF
0d30: 45 52 2d 55 53 45 44 0a 23 20 61 72 67 75 6d 65  ER-USED.# argume
0d40: 6e 74 20 69 73 20 74 72 75 65 20 69 66 20 74 68  nt is true if th
0d50: 65 20 74 72 61 6e 73 66 65 72 20 6f 70 74 69 6d  e transfer optim
0d60: 69 7a 61 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62  ization should b
0d70: 65 20 65 6d 70 6c 6f 79 65 64 20 61 6e 64 0a 23  e employed and.#
0d80: 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 20 20   false if not.  
0d90: 49 4e 49 54 2d 44 41 54 41 20 69 73 20 61 20 73  INIT-DATA is a s
0da0: 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 64 61 74  ingle row of dat
0db0: 61 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20  a that is to be 
0dc0: 0a 23 20 74 72 61 6e 73 66 65 72 65 64 2e 20 20  .# transfered.  
0dd0: 44 45 53 54 2d 53 43 48 45 4d 41 20 61 6e 64 20  DEST-SCHEMA and 
0de0: 53 52 43 2d 53 43 48 45 4d 41 20 61 72 65 20 74  SRC-SCHEMA are t
0df0: 61 62 6c 65 20 64 65 63 6c 61 72 61 74 69 6f 6e  able declaration
0e00: 73 20 66 6f 72 0a 23 20 74 68 65 20 64 65 73 74  s for.# the dest
0e10: 69 6e 61 74 69 6f 6e 20 61 6e 64 20 73 6f 75 72  ination and sour
0e20: 63 65 20 74 61 62 6c 65 73 2e 0a 23 0a 70 72 6f  ce tables..#.pro
0e30: 63 20 78 66 65 72 5f 63 68 65 63 6b 20 7b 74 65  c xfer_check {te
0e40: 73 74 69 64 20 78 66 65 72 75 73 65 64 20 69 6e  stid xferused in
0e50: 69 74 64 61 74 61 20 64 65 73 74 73 63 68 65 6d  itdata destschem
0e60: 61 20 73 72 63 73 63 68 65 6d 61 7d 20 7b 0a 20  a srcschema} {. 
0e70: 20 65 78 65 63 73 71 6c 20 22 43 52 45 41 54 45   execsql "CREATE
0e80: 20 54 41 42 4c 45 20 64 65 73 74 28 24 64 65 73   TABLE dest($des
0e90: 74 73 63 68 65 6d 61 29 22 0a 20 20 65 78 65 63  tschema)".  exec
0ea0: 73 71 6c 20 22 43 52 45 41 54 45 20 54 41 42 4c  sql "CREATE TABL
0eb0: 45 20 73 72 63 28 24 73 72 63 73 63 68 65 6d 61  E src($srcschema
0ec0: 29 22 0a 20 20 65 78 65 63 73 71 6c 20 22 49 4e  )".  execsql "IN
0ed0: 53 45 52 54 20 49 4e 54 4f 20 73 72 63 20 56 41  SERT INTO src VA
0ee0: 4c 55 45 53 28 5b 6a 6f 69 6e 20 24 69 6e 69 74  LUES([join $init
0ef0: 64 61 74 61 20 2c 5d 29 22 0a 20 20 73 65 74 20  data ,])".  set 
0f00: 3a 3a 73 71 6c 69 74 65 33 5f 78 66 65 72 6f 70  ::sqlite3_xferop
0f10: 74 5f 63 6f 75 6e 74 20 30 0a 20 20 64 6f 5f 74  t_count 0.  do_t
0f20: 65 73 74 20 24 74 65 73 74 69 64 2e 31 20 7b 0a  est $testid.1 {.
0f30: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
0f40: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0f50: 64 65 73 74 20 53 45 4c 45 43 54 20 2a 20 46 52  dest SELECT * FR
0f60: 4f 4d 20 73 72 63 3b 0a 20 20 20 20 20 20 53 45  OM src;.      SE
0f70: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 65 73 74  LECT * FROM dest
0f80: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 24 69 6e 69  ;.    }.  } $ini
0f90: 74 64 61 74 61 0a 20 20 64 6f 5f 74 65 73 74 20  tdata.  do_test 
0fa0: 24 74 65 73 74 69 64 2e 32 20 7b 0a 20 20 20 20  $testid.2 {.    
0fb0: 73 65 74 20 3a 3a 73 71 6c 69 74 65 33 5f 78 66  set ::sqlite3_xf
0fc0: 65 72 6f 70 74 5f 63 6f 75 6e 74 0a 20 20 7d 20  eropt_count.  } 
0fd0: 24 78 66 65 72 75 73 65 64 0a 20 20 65 78 65 63  $xferused.  exec
0fe0: 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20 54  sql {.    DROP T
0ff0: 41 42 4c 45 20 64 65 73 74 3b 0a 20 20 20 20 44  ABLE dest;.    D
1000: 52 4f 50 20 54 41 42 4c 45 20 73 72 63 3b 0a 20  ROP TABLE src;. 
1010: 20 7d 0a 7d 0a 0a 0a 23 20 44 6f 20 72 75 6e 20   }.}...# Do run 
1020: 74 68 65 20 74 72 61 6e 73 66 65 72 20 6f 70 74  the transfer opt
1030: 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20 74 61 62  imization if tab
1040: 6c 65 73 20 68 61 76 65 20 69 64 65 6e 74 69 63  les have identic
1050: 61 6c 0a 23 20 43 48 45 43 4b 20 63 6f 6e 73 74  al.# CHECK const
1060: 72 61 69 6e 74 73 2e 0a 23 0a 78 66 65 72 5f 63  raints..#.xfer_c
1070: 68 65 63 6b 20 69 6e 73 65 72 74 34 2d 33 2e 31  heck insert4-3.1
1080: 20 31 20 7b 31 20 39 7d 20 5c 0a 20 20 20 20 7b   1 {1 9} \.    {
1090: 61 20 69 6e 74 2c 20 62 20 69 6e 74 20 43 48 45  a int, b int CHE
10a0: 43 4b 28 62 3e 61 29 7d 20 5c 0a 20 20 20 20 7b  CK(b>a)} \.    {
10b0: 78 20 69 6e 74 2c 20 79 20 69 6e 74 20 43 48 45  x int, y int CHE
10c0: 43 4b 28 79 3e 78 29 7d 0a 78 66 65 72 5f 63 68  CK(y>x)}.xfer_ch
10d0: 65 63 6b 20 69 6e 73 65 72 74 34 2d 33 2e 32 20  eck insert4-3.2 
10e0: 31 20 7b 31 20 39 7d 20 5c 0a 20 20 20 20 7b 61  1 {1 9} \.    {a
10f0: 20 69 6e 74 2c 20 62 20 69 6e 74 20 43 48 45 43   int, b int CHEC
1100: 4b 28 62 3e 61 29 7d 20 5c 0a 20 20 20 20 7b 78  K(b>a)} \.    {x
1110: 20 69 6e 74 20 43 48 45 43 4b 28 79 3e 78 29 2c   int CHECK(y>x),
1120: 20 79 20 69 6e 74 7d 0a 0a 23 20 44 6f 20 72 75   y int}..# Do ru
1130: 6e 20 74 68 65 20 74 72 61 6e 73 66 65 72 20 6f  n the transfer o
1140: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20 74  ptimization if t
1150: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74  he destination t
1160: 61 62 6c 65 20 6c 61 63 6b 73 0a 23 20 61 6e 79  able lacks.# any
1170: 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
1180: 74 73 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  ts regardless of
1190: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
11a0: 74 68 65 72 65 20 61 72 65 20 43 48 45 43 4b 0a  there are CHECK.
11b0: 23 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e  # constraints on
11c0: 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c   the source tabl
11d0: 65 2e 0a 23 0a 78 66 65 72 5f 63 68 65 63 6b 20  e..#.xfer_check 
11e0: 69 6e 73 65 72 74 34 2d 33 2e 33 20 31 20 7b 31  insert4-3.3 1 {1
11f0: 20 39 7d 20 5c 0a 20 20 20 20 7b 61 20 69 6e 74   9} \.    {a int
1200: 2c 20 62 20 69 6e 74 7d 20 5c 0a 20 20 20 20 7b  , b int} \.    {
1210: 78 20 69 6e 74 2c 20 79 20 69 6e 74 20 43 48 45  x int, y int CHE
1220: 43 4b 28 79 3e 78 29 7d 0a 0a 23 20 44 6f 20 72  CK(y>x)}..# Do r
1230: 75 6e 20 74 68 65 20 74 72 61 6e 73 66 65 72 20  un the transfer 
1240: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20  optimization if 
1250: 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
1260: 74 61 62 6c 65 20 6f 6d 69 74 73 0a 23 20 4e 4f  table omits.# NO
1270: 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e  T NULL constrain
1280: 74 73 20 74 68 61 74 20 74 68 65 20 73 6f 75 72  ts that the sour
1290: 63 65 20 74 61 62 6c 65 20 68 61 73 2e 0a 23 0a  ce table has..#.
12a0: 78 66 65 72 5f 63 68 65 63 6b 20 69 6e 73 65 72  xfer_check inser
12b0: 74 34 2d 33 2e 34 20 30 20 7b 31 20 39 7d 20 5c  t4-3.4 0 {1 9} \
12c0: 0a 20 20 20 20 7b 61 20 69 6e 74 2c 20 62 20 69  .    {a int, b i
12d0: 6e 74 20 43 48 45 43 4b 28 62 3e 61 29 7d 20 5c  nt CHECK(b>a)} \
12e0: 0a 20 20 20 20 7b 78 20 69 6e 74 2c 20 79 20 69  .    {x int, y i
12f0: 6e 74 7d 0a 0a 23 20 44 6f 20 6e 6f 74 20 72 75  nt}..# Do not ru
1300: 6e 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  n the optimizati
1310: 6f 6e 20 69 66 20 74 68 65 20 64 65 73 74 69 6e  on if the destin
1320: 61 74 69 6f 6e 20 68 61 73 20 4e 4f 54 20 4e 55  ation has NOT NU
1330: 4c 4c 0a 23 20 63 6f 6e 73 74 72 61 69 6e 74 73  LL.# constraints
1340: 20 74 68 61 74 20 74 68 65 20 73 6f 75 72 63 65   that the source
1350: 20 74 61 62 6c 65 20 6c 61 63 6b 73 2e 0a 23 0a   table lacks..#.
1360: 78 66 65 72 5f 63 68 65 63 6b 20 69 6e 73 65 72  xfer_check inser
1370: 74 34 2d 33 2e 35 20 30 20 7b 31 20 39 7d 20 5c  t4-3.5 0 {1 9} \
1380: 0a 20 20 20 20 7b 61 20 69 6e 74 2c 20 62 20 69  .    {a int, b i
1390: 6e 74 20 4e 4f 54 20 4e 55 4c 4c 7d 20 5c 0a 20  nt NOT NULL} \. 
13a0: 20 20 20 7b 78 20 69 6e 74 2c 20 79 20 69 6e 74     {x int, y int
13b0: 7d 0a 78 66 65 72 5f 63 68 65 63 6b 20 69 6e 73  }.xfer_check ins
13c0: 65 72 74 34 2d 33 2e 36 20 30 20 7b 31 20 39 7d  ert4-3.6 0 {1 9}
13d0: 20 5c 0a 20 20 20 20 7b 61 20 69 6e 74 2c 20 62   \.    {a int, b
13e0: 20 69 6e 74 20 4e 4f 54 20 4e 55 4c 4c 7d 20 5c   int NOT NULL} \
13f0: 0a 20 20 20 20 7b 78 20 69 6e 74 20 4e 4f 54 20  .    {x int NOT 
1400: 4e 55 4c 4c 2c 20 79 20 69 6e 74 7d 0a 78 66 65  NULL, y int}.xfe
1410: 72 5f 63 68 65 63 6b 20 69 6e 73 65 72 74 34 2d  r_check insert4-
1420: 33 2e 37 20 30 20 7b 31 20 39 7d 20 5c 0a 20 20  3.7 0 {1 9} \.  
1430: 20 20 7b 61 20 69 6e 74 20 4e 4f 54 20 4e 55 4c    {a int NOT NUL
1440: 4c 2c 20 62 20 69 6e 74 20 4e 4f 54 20 4e 55 4c  L, b int NOT NUL
1450: 4c 7d 20 5c 0a 20 20 20 20 7b 78 20 69 6e 74 20  L} \.    {x int 
1460: 4e 4f 54 20 4e 55 4c 4c 2c 20 79 20 69 6e 74 7d  NOT NULL, y int}
1470: 0a 78 66 65 72 5f 63 68 65 63 6b 20 69 6e 73 65  .xfer_check inse
1480: 72 74 34 2d 33 2e 38 20 30 20 7b 31 20 39 7d 20  rt4-3.8 0 {1 9} 
1490: 5c 0a 20 20 20 20 7b 61 20 69 6e 74 20 4e 4f 54  \.    {a int NOT
14a0: 20 4e 55 4c 4c 2c 20 62 20 69 6e 74 7d 20 5c 0a   NULL, b int} \.
14b0: 20 20 20 20 7b 78 20 69 6e 74 2c 20 79 20 69 6e      {x int, y in
14c0: 74 7d 0a 0a 0a 23 20 44 6f 20 72 75 6e 20 74 68  t}...# Do run th
14d0: 65 20 74 72 61 6e 73 66 65 72 20 6f 70 74 69 6d  e transfer optim
14e0: 69 7a 61 74 69 6f 6e 20 69 66 20 74 68 65 20 64  ization if the d
14f0: 65 73 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65  estination table
1500: 20 61 6e 64 0a 23 20 73 6f 75 72 63 65 20 74 61   and.# source ta
1510: 62 6c 65 20 68 61 76 65 20 74 68 65 20 73 61 6d  ble have the sam
1520: 65 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74  e NOT NULL const
1530: 72 61 69 6e 74 73 20 6f 72 20 69 66 20 74 68 65  raints or if the
1540: 20 0a 23 20 73 6f 75 72 63 65 20 74 61 62 6c 65   .# source table
1550: 20 68 61 73 20 65 78 74 72 61 20 4e 4f 54 20 4e   has extra NOT N
1560: 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  ULL constraints.
1570: 0a 23 0a 78 66 65 72 5f 63 68 65 63 6b 20 69 6e  .#.xfer_check in
1580: 73 65 72 74 34 2d 33 2e 39 20 31 20 7b 31 20 39  sert4-3.9 1 {1 9
1590: 7d 20 5c 0a 20 20 20 20 7b 61 20 69 6e 74 2c 20  } \.    {a int, 
15a0: 62 20 69 6e 74 7d 20 5c 0a 20 20 20 20 7b 78 20  b int} \.    {x 
15b0: 69 6e 74 20 4e 4f 54 20 4e 55 4c 4c 2c 20 79 20  int NOT NULL, y 
15c0: 69 6e 74 7d 0a 78 66 65 72 5f 63 68 65 63 6b 20  int}.xfer_check 
15d0: 69 6e 73 65 72 74 34 2d 33 2e 31 30 20 31 20 7b  insert4-3.10 1 {
15e0: 31 20 39 7d 20 5c 0a 20 20 20 20 7b 61 20 69 6e  1 9} \.    {a in
15f0: 74 2c 20 62 20 69 6e 74 7d 20 5c 0a 20 20 20 20  t, b int} \.    
1600: 7b 78 20 69 6e 74 20 4e 4f 54 20 4e 55 4c 4c 2c  {x int NOT NULL,
1610: 20 79 20 69 6e 74 20 4e 4f 54 20 4e 55 4c 4c 7d   y int NOT NULL}
1620: 0a 78 66 65 72 5f 63 68 65 63 6b 20 69 6e 73 65  .xfer_check inse
1630: 72 74 34 2d 33 2e 31 31 20 31 20 7b 31 20 39 7d  rt4-3.11 1 {1 9}
1640: 20 5c 0a 20 20 20 20 7b 61 20 69 6e 74 20 4e 4f   \.    {a int NO
1650: 54 20 4e 55 4c 4c 2c 20 62 20 69 6e 74 7d 20 5c  T NULL, b int} \
1660: 0a 20 20 20 20 7b 78 20 69 6e 74 20 4e 4f 54 20  .    {x int NOT 
1670: 4e 55 4c 4c 2c 20 79 20 69 6e 74 20 4e 4f 54 20  NULL, y int NOT 
1680: 4e 55 4c 4c 7d 0a 78 66 65 72 5f 63 68 65 63 6b  NULL}.xfer_check
1690: 20 69 6e 73 65 72 74 34 2d 33 2e 31 32 20 31 20   insert4-3.12 1 
16a0: 7b 31 20 39 7d 20 5c 0a 20 20 20 20 7b 61 20 69  {1 9} \.    {a i
16b0: 6e 74 2c 20 62 20 69 6e 74 20 4e 4f 54 20 4e 55  nt, b int NOT NU
16c0: 4c 4c 7d 20 5c 0a 20 20 20 20 7b 78 20 69 6e 74  LL} \.    {x int
16d0: 20 4e 4f 54 20 4e 55 4c 4c 2c 20 79 20 69 6e 74   NOT NULL, y int
16e0: 20 4e 4f 54 20 4e 55 4c 4c 7d 0a 0a 23 20 44 6f   NOT NULL}..# Do
16f0: 20 6e 6f 74 20 72 75 6e 20 74 68 65 20 6f 70 74   not run the opt
1700: 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20 61 6e 79  imization if any
1710: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1720: 61 62 6c 65 0a 23 20 63 6f 6c 75 6d 6e 73 20 68  able.# columns h
1730: 61 76 65 20 64 69 66 66 65 72 65 6e 74 20 61 66  ave different af
1740: 66 69 6e 69 74 69 65 73 2e 0a 23 0a 78 66 65 72  finities..#.xfer
1750: 5f 63 68 65 63 6b 20 69 6e 73 65 72 74 34 2d 33  _check insert4-3
1760: 2e 32 30 20 30 20 7b 31 20 39 7d 20 5c 0a 20 20  .20 0 {1 9} \.  
1770: 20 20 7b 61 20 74 65 78 74 2c 20 62 20 69 6e 74    {a text, b int
1780: 7d 20 5c 0a 20 20 20 20 7b 78 20 69 6e 74 2c 20  } \.    {x int, 
1790: 62 20 69 6e 74 7d 0a 78 66 65 72 5f 63 68 65 63  b int}.xfer_chec
17a0: 6b 20 69 6e 73 65 72 74 34 2d 33 2e 32 31 20 30  k insert4-3.21 0
17b0: 20 7b 31 20 39 7d 20 5c 0a 20 20 20 20 7b 61 20   {1 9} \.    {a 
17c0: 69 6e 74 2c 20 62 20 69 6e 74 7d 20 5c 0a 20 20  int, b int} \.  
17d0: 20 20 7b 78 20 74 65 78 74 2c 20 62 20 69 6e 74    {x text, b int
17e0: 7d 0a 0a 23 20 22 69 6e 74 22 20 61 6e 64 20 22  }..# "int" and "
17f0: 69 6e 74 65 67 65 72 22 20 61 72 65 20 65 71 75  integer" are equ
1800: 69 76 61 6c 65 6e 74 20 73 6f 20 74 68 65 20 6f  ivalent so the o
1810: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 73 68 6f 75  ptimization shou
1820: 6c 64 0a 23 20 72 75 6e 20 68 65 72 65 2e 0a 23  ld.# run here..#
1830: 0a 78 66 65 72 5f 63 68 65 63 6b 20 69 6e 73 65  .xfer_check inse
1840: 72 74 34 2d 33 2e 32 32 20 31 20 7b 31 20 39 7d  rt4-3.22 1 {1 9}
1850: 20 5c 0a 20 20 20 20 7b 61 20 69 6e 74 2c 20 62   \.    {a int, b
1860: 20 69 6e 74 7d 20 5c 0a 20 20 20 20 7b 78 20 69   int} \.    {x i
1870: 6e 74 65 67 65 72 2c 20 62 20 69 6e 74 7d 0a 0a  nteger, b int}..
1880: 23 20 54 69 63 6b 65 74 20 23 32 32 39 31 2e 0a  # Ticket #2291..
1890: 23 0a 0a 64 6f 5f 74 65 73 74 20 69 6e 73 65 72  #..do_test inser
18a0: 74 34 2d 34 2e 31 61 20 7b 0a 20 20 65 78 65 63  t4-4.1a {.  exec
18b0: 73 71 6c 20 7b 43 52 45 41 54 45 20 54 41 42 4c  sql {CREATE TABL
18c0: 45 20 74 34 28 61 2c 20 62 2c 20 55 4e 49 51 55  E t4(a, b, UNIQU
18d0: 45 28 61 2c 62 29 29 7d 0a 7d 20 7b 7d 0a 69 66  E(a,b))}.} {}.if
18e0: 63 61 70 61 62 6c 65 20 76 61 63 75 75 6d 20 7b  capable vacuum {
18f0: 0a 20 20 64 6f 5f 74 65 73 74 20 69 6e 73 65 72  .  do_test inser
1900: 74 34 2d 34 2e 31 62 20 7b 0a 20 20 20 20 65 78  t4-4.1b {.    ex
1910: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 49 4e  ecsql {.      IN
1920: 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c  SERT INTO t4 VAL
1930: 55 45 53 28 4e 55 4c 4c 2c 30 29 3b 0a 20 20 20  UES(NULL,0);.   
1940: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1950: 34 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 31 29  4 VALUES(NULL,1)
1960: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
1970: 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 4e 55  NTO t4 VALUES(NU
1980: 4c 4c 2c 31 29 3b 0a 20 20 20 20 20 20 56 41 43  LL,1);.      VAC
1990: 55 55 4d 3b 20 20 20 0a 20 20 20 20 7d 0a 20 20  UUM;   .    }.  
19a0: 7d 20 7b 7d 0a 7d 0a 0a 23 20 43 68 65 63 6b 20  } {}.}..# Check 
19b0: 73 6f 6d 65 20 65 72 72 6f 72 20 63 6f 6e 64 69  some error condi
19c0: 74 69 6f 6e 73 3a 0a 23 0a 64 6f 5f 74 65 73 74  tions:.#.do_test
19d0: 20 69 6e 73 65 72 74 34 2d 35 2e 31 20 7b 0a 20   insert4-5.1 {. 
19e0: 20 23 20 54 61 62 6c 65 20 64 6f 65 73 20 6e 6f   # Table does no
19f0: 74 20 65 78 69 73 74 2e 0a 20 20 63 61 74 63 68  t exist..  catch
1a00: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
1a10: 4f 20 74 32 20 53 45 4c 45 43 54 20 61 2c 20 62  O t2 SELECT a, b
1a20: 20 46 52 4f 4d 20 6e 6f 73 75 63 68 74 61 62 6c   FROM nosuchtabl
1a30: 65 20 7d 0a 7d 20 7b 31 20 7b 6e 6f 20 73 75 63  e }.} {1 {no suc
1a40: 68 20 74 61 62 6c 65 3a 20 6e 6f 73 75 63 68 74  h table: nosucht
1a50: 61 62 6c 65 7d 7d 0a 64 6f 5f 74 65 73 74 20 69  able}}.do_test i
1a60: 6e 73 65 72 74 34 2d 35 2e 32 20 7b 0a 20 20 23  nsert4-5.2 {.  #
1a70: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
1a80: 6e 73 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  ns does not matc
1a90: 68 2e 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20  h..  catchsql { 
1aa0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
1ab0: 45 20 74 35 28 61 2c 20 62 2c 20 63 29 3b 0a 20  E t5(a, b, c);. 
1ac0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1ad0: 34 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  4 SELECT * FROM 
1ae0: 74 35 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 74 61  t5;.  }.} {1 {ta
1af0: 62 6c 65 20 74 34 20 68 61 73 20 32 20 63 6f 6c  ble t4 has 2 col
1b00: 75 6d 6e 73 20 62 75 74 20 33 20 76 61 6c 75 65  umns but 3 value
1b10: 73 20 77 65 72 65 20 73 75 70 70 6c 69 65 64 7d  s were supplied}
1b20: 7d 0a 0a 64 6f 5f 74 65 73 74 20 69 6e 73 65 72  }..do_test inser
1b30: 74 34 2d 36 2e 31 20 7b 0a 20 20 73 65 74 20 3a  t4-6.1 {.  set :
1b40: 3a 73 71 6c 69 74 65 33 5f 78 66 65 72 6f 70 74  :sqlite3_xferopt
1b50: 5f 63 6f 75 6e 74 20 30 0a 20 20 65 78 65 63 73  _count 0.  execs
1b60: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
1b70: 49 4e 44 45 58 20 74 32 5f 69 32 20 4f 4e 20 74  INDEX t2_i2 ON t
1b80: 32 28 78 2c 20 79 20 43 4f 4c 4c 41 54 45 20 6e  2(x, y COLLATE n
1b90: 6f 63 61 73 65 29 3b 20 0a 20 20 20 20 43 52 45  ocase); .    CRE
1ba0: 41 54 45 20 49 4e 44 45 58 20 74 32 5f 69 31 20  ATE INDEX t2_i1 
1bb0: 4f 4e 20 74 32 28 78 20 41 53 43 2c 20 79 20 44  ON t2(x ASC, y D
1bc0: 45 53 43 29 3b 0a 20 20 20 20 43 52 45 41 54 45  ESC);.    CREATE
1bd0: 20 49 4e 44 45 58 20 74 33 5f 69 31 20 4f 4e 20   INDEX t3_i1 ON 
1be0: 74 33 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e  t3(a, b);.    IN
1bf0: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c  SERT INTO t2 SEL
1c00: 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b 0a 20  ECT * FROM t3;. 
1c10: 20 7d 0a 20 20 73 65 74 20 3a 3a 73 71 6c 69 74   }.  set ::sqlit
1c20: 65 33 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74  e3_xferopt_count
1c30: 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 69  .} {0}.do_test i
1c40: 6e 73 65 72 74 34 2d 36 2e 32 20 7b 0a 20 20 73  nsert4-6.2 {.  s
1c50: 65 74 20 3a 3a 73 71 6c 69 74 65 33 5f 78 66 65  et ::sqlite3_xfe
1c60: 72 6f 70 74 5f 63 6f 75 6e 74 20 30 0a 20 20 65  ropt_count 0.  e
1c70: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f  xecsql {.    DRO
1c80: 50 20 49 4e 44 45 58 20 74 32 5f 69 32 3b 0a 20  P INDEX t2_i2;. 
1c90: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1ca0: 32 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  2 SELECT * FROM 
1cb0: 74 33 3b 0a 20 20 7d 0a 20 20 73 65 74 20 3a 3a  t3;.  }.  set ::
1cc0: 73 71 6c 69 74 65 33 5f 78 66 65 72 6f 70 74 5f  sqlite3_xferopt_
1cd0: 63 6f 75 6e 74 0a 7d 20 7b 30 7d 0a 64 6f 5f 74  count.} {0}.do_t
1ce0: 65 73 74 20 69 6e 73 65 72 74 34 2d 36 2e 33 20  est insert4-6.3 
1cf0: 7b 0a 20 20 73 65 74 20 3a 3a 73 71 6c 69 74 65  {.  set ::sqlite
1d00: 33 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74 20  3_xferopt_count 
1d10: 30 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  0.  execsql {.  
1d20: 20 20 44 52 4f 50 20 49 4e 44 45 58 20 74 32 5f    DROP INDEX t2_
1d30: 69 31 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49  i1;.    CREATE I
1d40: 4e 44 45 58 20 74 32 5f 69 31 20 4f 4e 20 74 32  NDEX t2_i1 ON t2
1d50: 28 78 20 41 53 43 2c 20 79 20 41 53 43 29 3b 0a  (x ASC, y ASC);.
1d60: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1d70: 74 32 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  t2 SELECT * FROM
1d80: 20 74 33 3b 0a 20 20 7d 0a 20 20 73 65 74 20 3a   t3;.  }.  set :
1d90: 3a 73 71 6c 69 74 65 33 5f 78 66 65 72 6f 70 74  :sqlite3_xferopt
1da0: 5f 63 6f 75 6e 74 0a 7d 20 7b 31 7d 0a 64 6f 5f  _count.} {1}.do_
1db0: 74 65 73 74 20 69 6e 73 65 72 74 34 2d 36 2e 34  test insert4-6.4
1dc0: 20 7b 0a 20 20 73 65 74 20 3a 3a 73 71 6c 69 74   {.  set ::sqlit
1dd0: 65 33 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74  e3_xferopt_count
1de0: 20 30 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   0.  execsql {. 
1df0: 20 20 20 44 52 4f 50 20 49 4e 44 45 58 20 74 32     DROP INDEX t2
1e00: 5f 69 31 3b 0a 20 20 20 20 43 52 45 41 54 45 20  _i1;.    CREATE 
1e10: 49 4e 44 45 58 20 74 32 5f 69 31 20 4f 4e 20 74  INDEX t2_i1 ON t
1e20: 32 28 78 20 41 53 43 2c 20 79 20 43 4f 4c 4c 41  2(x ASC, y COLLA
1e30: 54 45 20 52 54 52 49 4d 29 3b 0a 20 20 20 20 49  TE RTRIM);.    I
1e40: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45  NSERT INTO t2 SE
1e50: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b 0a  LECT * FROM t3;.
1e60: 20 20 7d 0a 20 20 73 65 74 20 3a 3a 73 71 6c 69    }.  set ::sqli
1e70: 74 65 33 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e  te3_xferopt_coun
1e80: 74 0a 7d 20 7b 30 7d 0a 0a 0a 64 6f 5f 74 65 73  t.} {0}...do_tes
1e90: 74 20 69 6e 73 65 72 74 34 2d 36 2e 35 20 7b 0a  t insert4-6.5 {.
1ea0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
1eb0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 36 61  CREATE TABLE t6a
1ec0: 28 78 20 43 48 45 43 4b 28 20 78 3c 3e 27 61 62  (x CHECK( x<>'ab
1ed0: 63 27 20 29 29 3b 0a 20 20 20 20 49 4e 53 45 52  c' ));.    INSER
1ee0: 54 20 49 4e 54 4f 20 74 36 61 20 56 41 4c 55 45  T INTO t6a VALUE
1ef0: 53 28 27 41 42 43 27 29 3b 0a 20 20 20 20 53 45  S('ABC');.    SE
1f00: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 36 61 3b  LECT * FROM t6a;
1f10: 0a 20 20 7d 0a 7d 20 7b 41 42 43 7d 0a 64 6f 5f  .  }.} {ABC}.do_
1f20: 74 65 73 74 20 69 6e 73 65 72 74 34 2d 36 2e 36  test insert4-6.6
1f30: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
1f40: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
1f50: 74 36 62 28 78 20 43 48 45 43 4b 28 20 78 3c 3e  t6b(x CHECK( x<>
1f60: 27 61 62 63 27 20 43 4f 4c 4c 41 54 45 20 6e 6f  'abc' COLLATE no
1f70: 63 61 73 65 20 29 29 3b 0a 20 20 7d 0a 20 20 63  case ));.  }.  c
1f80: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 49 4e  atchsql {.    IN
1f90: 53 45 52 54 20 49 4e 54 4f 20 74 36 62 20 53 45  SERT INTO t6b SE
1fa0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 36 61 3b  LECT * FROM t6a;
1fb0: 0a 20 20 7d 0a 7d 20 7b 31 20 7b 43 48 45 43 4b  .  }.} {1 {CHECK
1fc0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
1fd0: 65 64 3a 20 74 36 62 7d 7d 0a 64 6f 5f 74 65 73  ed: t6b}}.do_tes
1fe0: 74 20 69 6e 73 65 72 74 34 2d 36 2e 37 20 7b 0a  t insert4-6.7 {.
1ff0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
2000: 44 52 4f 50 20 54 41 42 4c 45 20 74 36 62 3b 0a  DROP TABLE t6b;.
2010: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
2020: 20 74 36 62 28 78 20 43 48 45 43 4b 28 20 78 20   t6b(x CHECK( x 
2030: 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 3c  COLLATE nocase <
2040: 3e 27 61 62 63 27 20 29 29 3b 0a 20 20 7d 0a 20  >'abc' ));.  }. 
2050: 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20   catchsql {.    
2060: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 36 62 20  INSERT INTO t6b 
2070: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 36  SELECT * FROM t6
2080: 61 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 43 48 45  a;.  }.} {1 {CHE
2090: 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  CK constraint fa
20a0: 69 6c 65 64 3a 20 74 36 62 7d 7d 0a 0a 23 20 54  iled: t6b}}..# T
20b0: 69 63 6b 65 74 20 5b 36 32 38 34 64 66 38 39 64  icket [6284df89d
20c0: 65 62 64 66 61 36 31 64 62 38 30 37 33 65 30 36  ebdfa61db8073e06
20d0: 32 39 30 38 61 66 30 63 39 62 36 31 31 38 65 5d  2908af0c9b6118e]
20e0: 0a 23 20 44 69 73 61 62 6c 65 20 74 68 65 20 78  .# Disable the x
20f0: 66 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  fer optimization
2100: 20 69 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   if the destinat
2110: 69 6f 6e 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  ion table contai
2120: 6e 73 0a 23 20 61 20 66 6f 72 65 69 67 6e 20 6b  ns.# a foreign k
2130: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a 23 0a  ey constraint.#.
2140: 69 66 63 61 70 61 62 6c 65 20 66 6f 72 65 69 67  ifcapable foreig
2150: 6e 6b 65 79 20 7b 0a 20 20 64 6f 5f 74 65 73 74  nkey {.  do_test
2160: 20 69 6e 73 65 72 74 34 2d 37 2e 31 20 7b 0a 20   insert4-7.1 {. 
2170: 20 20 20 73 65 74 20 3a 3a 73 71 6c 69 74 65 33     set ::sqlite3
2180: 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74 20 30  _xferopt_count 0
2190: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
21a0: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
21b0: 45 20 74 37 61 28 78 20 49 4e 54 45 47 45 52 20  E t7a(x INTEGER 
21c0: 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 20 49 4e  PRIMARY KEY); IN
21d0: 53 45 52 54 20 49 4e 54 4f 20 74 37 61 20 56 41  SERT INTO t7a VA
21e0: 4c 55 45 53 28 31 32 33 29 3b 0a 20 20 20 20 20  LUES(123);.     
21f0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 37   CREATE TABLE t7
2200: 62 28 79 20 49 4e 54 45 47 45 52 20 52 45 46 45  b(y INTEGER REFE
2210: 52 45 4e 43 45 53 20 74 37 61 29 3b 0a 20 20 20  RENCES t7a);.   
2220: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
2230: 74 37 63 28 7a 20 49 4e 54 29 3b 20 20 49 4e 53  t7c(z INT);  INS
2240: 45 52 54 20 49 4e 54 4f 20 74 37 63 20 56 41 4c  ERT INTO t7c VAL
2250: 55 45 53 28 32 33 34 29 3b 0a 20 20 20 20 20 20  UES(234);.      
2260: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 37 62 20  INSERT INTO t7b 
2270: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 37  SELECT * FROM t7
2280: 63 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  c;.      SELECT 
2290: 2a 20 46 52 4f 4d 20 74 37 62 3b 0a 20 20 20 20  * FROM t7b;.    
22a0: 7d 0a 20 20 7d 20 7b 32 33 34 7d 0a 20 20 64 6f  }.  } {234}.  do
22b0: 5f 74 65 73 74 20 69 6e 73 65 72 74 34 2d 37 2e  _test insert4-7.
22c0: 32 20 7b 0a 20 20 20 20 73 65 74 20 3a 3a 73 71  2 {.    set ::sq
22d0: 6c 69 74 65 33 5f 78 66 65 72 6f 70 74 5f 63 6f  lite3_xferopt_co
22e0: 75 6e 74 0a 20 20 7d 20 7b 31 7d 0a 20 20 64 6f  unt.  } {1}.  do
22f0: 5f 74 65 73 74 20 69 6e 73 65 72 74 34 2d 37 2e  _test insert4-7.
2300: 33 20 7b 0a 20 20 20 20 73 65 74 20 3a 3a 73 71  3 {.    set ::sq
2310: 6c 69 74 65 33 5f 78 66 65 72 6f 70 74 5f 63 6f  lite3_xferopt_co
2320: 75 6e 74 20 30 0a 20 20 20 20 65 78 65 63 73 71  unt 0.    execsq
2330: 6c 20 7b 0a 20 20 20 20 20 20 44 45 4c 45 54 45  l {.      DELETE
2340: 20 46 52 4f 4d 20 74 37 62 3b 0a 20 20 20 20 20   FROM t7b;.     
2350: 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f   PRAGMA foreign_
2360: 6b 65 79 73 3d 4f 4e 3b 0a 20 20 20 20 7d 0a 20  keys=ON;.    }. 
2370: 20 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20     catchsql {.  
2380: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2390: 74 37 62 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  t7b SELECT * FRO
23a0: 4d 20 74 37 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  M t7c;.    }.  }
23b0: 20 7b 31 20 7b 46 4f 52 45 49 47 4e 20 4b 45 59   {1 {FOREIGN KEY
23c0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
23d0: 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 69  ed}}.  do_test i
23e0: 6e 73 65 72 74 34 2d 37 2e 34 20 7b 0a 20 20 20  nsert4-7.4 {.   
23f0: 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54   execsql {SELECT
2400: 20 2a 20 46 52 4f 4d 20 74 37 62 7d 0a 20 20 7d   * FROM t7b}.  }
2410: 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 69 6e   {}.  do_test in
2420: 73 65 72 74 34 2d 37 2e 35 20 7b 0a 20 20 20 20  sert4-7.5 {.    
2430: 73 65 74 20 3a 3a 73 71 6c 69 74 65 33 5f 78 66  set ::sqlite3_xf
2440: 65 72 6f 70 74 5f 63 6f 75 6e 74 0a 20 20 7d 20  eropt_count.  } 
2450: 7b 30 7d 0a 20 20 64 6f 5f 74 65 73 74 20 69 6e  {0}.  do_test in
2460: 73 65 72 74 34 2d 37 2e 36 20 7b 0a 20 20 20 20  sert4-7.6 {.    
2470: 73 65 74 20 3a 3a 73 71 6c 69 74 65 33 5f 78 66  set ::sqlite3_xf
2480: 65 72 6f 70 74 5f 63 6f 75 6e 74 20 30 0a 20 20  eropt_count 0.  
2490: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
24a0: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 37    DELETE FROM t7
24b0: 62 3b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74  b; DELETE FROM t
24c0: 37 63 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  7c;.      INSERT
24d0: 20 49 4e 54 4f 20 74 37 63 20 56 41 4c 55 45 53   INTO t7c VALUES
24e0: 28 31 32 33 29 3b 0a 20 20 20 20 20 20 49 4e 53  (123);.      INS
24f0: 45 52 54 20 49 4e 54 4f 20 74 37 62 20 53 45 4c  ERT INTO t7b SEL
2500: 45 43 54 20 2a 20 46 52 4f 4d 20 74 37 63 3b 0a  ECT * FROM t7c;.
2510: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
2520: 52 4f 4d 20 74 37 62 3b 0a 20 20 20 20 7d 0a 20  ROM t7b;.    }. 
2530: 20 7d 20 7b 31 32 33 7d 0a 20 20 64 6f 5f 74 65   } {123}.  do_te
2540: 73 74 20 69 6e 73 65 72 74 34 2d 37 2e 37 20 7b  st insert4-7.7 {
2550: 0a 20 20 20 20 73 65 74 20 3a 3a 73 71 6c 69 74  .    set ::sqlit
2560: 65 33 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74  e3_xferopt_count
2570: 0a 20 20 7d 20 7b 30 7d 0a 20 20 64 6f 5f 74 65  .  } {0}.  do_te
2580: 73 74 20 69 6e 73 65 72 74 34 2d 37 2e 37 20 7b  st insert4-7.7 {
2590: 0a 20 20 20 20 73 65 74 20 3a 3a 73 71 6c 69 74  .    set ::sqlit
25a0: 65 33 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74  e3_xferopt_count
25b0: 20 30 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   0.    execsql {
25c0: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 66 6f  .      PRAGMA fo
25d0: 72 65 69 67 6e 5f 6b 65 79 73 3d 4f 46 46 3b 0a  reign_keys=OFF;.
25e0: 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f        DELETE FRO
25f0: 4d 20 74 37 62 3b 0a 20 20 20 20 20 20 49 4e 53  M t7b;.      INS
2600: 45 52 54 20 49 4e 54 4f 20 74 37 62 20 53 45 4c  ERT INTO t7b SEL
2610: 45 43 54 20 2a 20 46 52 4f 4d 20 74 37 63 3b 0a  ECT * FROM t7c;.
2620: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
2630: 52 4f 4d 20 74 37 62 3b 0a 20 20 20 20 7d 0a 20  ROM t7b;.    }. 
2640: 20 7d 20 7b 31 32 33 7d 0a 20 20 64 6f 5f 74 65   } {123}.  do_te
2650: 73 74 20 69 6e 73 65 72 74 34 2d 37 2e 38 20 7b  st insert4-7.8 {
2660: 0a 20 20 20 20 73 65 74 20 3a 3a 73 71 6c 69 74  .    set ::sqlit
2670: 65 33 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74  e3_xferopt_count
2680: 0a 20 20 7d 20 7b 31 7d 0a 7d 0a 0a 23 20 54 69  .  } {1}.}..# Ti
2690: 63 6b 65 74 20 5b 36 37 36 62 63 30 32 62 38 37  cket [676bc02b87
26a0: 31 37 36 31 32 35 36 33 35 63 62 31 37 34 64 31  176125635cb174d1
26b0: 31 30 62 34 33 31 35 38 31 39 31 32 62 62 5d 0a  10b431581912bb].
26c0: 23 20 4d 61 6b 65 20 73 75 72 65 20 49 4e 54 45  # Make sure INTE
26d0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
26e0: 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 2e 2e 2e 20  ON CONFLICT ... 
26f0: 77 6f 72 6b 73 20 77 69 74 68 20 74 68 65 20 78  works with the x
2700: 66 65 72 0a 23 20 6f 70 74 69 6d 69 7a 61 74 69  fer.# optimizati
2710: 6f 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 69 6e  on..#.do_test in
2720: 73 65 72 74 34 2d 38 2e 31 20 7b 0a 20 20 65 78  sert4-8.1 {.  ex
2730: 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50  ecsql {.    DROP
2740: 20 54 41 42 4c 45 20 49 46 20 45 58 49 53 54 53   TABLE IF EXISTS
2750: 20 74 31 3b 0a 20 20 20 20 44 52 4f 50 20 54 41   t1;.    DROP TA
2760: 42 4c 45 20 49 46 20 45 58 49 53 54 53 20 74 32  BLE IF EXISTS t2
2770: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
2780: 4c 45 20 74 31 28 61 20 49 4e 54 45 47 45 52 20  LE t1(a INTEGER 
2790: 50 52 49 4d 41 52 59 20 4b 45 59 20 4f 4e 20 43  PRIMARY KEY ON C
27a0: 4f 4e 46 4c 49 43 54 20 52 45 50 4c 41 43 45 2c  ONFLICT REPLACE,
27b0: 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   b);.    CREATE 
27c0: 54 41 42 4c 45 20 74 32 28 78 20 49 4e 54 45 47  TABLE t2(x INTEG
27d0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 4f  ER PRIMARY KEY O
27e0: 4e 20 43 4f 4e 46 4c 49 43 54 20 52 45 50 4c 41  N CONFLICT REPLA
27f0: 43 45 2c 20 79 29 3b 0a 20 20 20 20 49 4e 53 45  CE, y);.    INSE
2800: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
2810: 53 28 31 2c 32 29 3b 0a 20 20 20 20 49 4e 53 45  S(1,2);.    INSE
2820: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
2830: 53 28 31 2c 33 29 3b 0a 20 20 20 20 49 4e 53 45  S(1,3);.    INSE
2840: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
2850: 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20  T * FROM t2;.   
2860: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
2870: 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 33 7d 0a 64  1;.  }.} {1 3}.d
2880: 6f 5f 74 65 73 74 20 69 6e 73 65 72 74 34 2d 38  o_test insert4-8
2890: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
28a0: 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20  .    DROP TABLE 
28b0: 49 46 20 45 58 49 53 54 53 20 74 31 3b 0a 20 20  IF EXISTS t1;.  
28c0: 20 20 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20    DROP TABLE IF 
28d0: 45 58 49 53 54 53 20 74 32 3b 0a 20 20 20 20 43  EXISTS t2;.    C
28e0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
28f0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
2900: 20 4b 45 59 20 4f 4e 20 43 4f 4e 46 4c 49 43 54   KEY ON CONFLICT
2910: 20 52 45 50 4c 41 43 45 2c 20 62 29 3b 0a 20 20   REPLACE, b);.  
2920: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
2930: 32 28 78 2c 20 79 29 3b 0a 20 20 20 20 49 4e 53  2(x, y);.    INS
2940: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
2950: 45 53 28 31 2c 32 29 3b 0a 20 20 20 20 49 4e 53  ES(1,2);.    INS
2960: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
2970: 45 53 28 31 2c 33 29 3b 0a 20 20 20 20 49 4e 53  ES(1,3);.    INS
2980: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
2990: 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20  CT * FROM t2;.  
29a0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
29b0: 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 33 7d 0a  t1;.  }.} {1 3}.
29c0: 64 6f 5f 74 65 73 74 20 69 6e 73 65 72 74 34 2d  do_test insert4-
29d0: 38 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  8.3 {.  execsql 
29e0: 7b 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45  {.    DROP TABLE
29f0: 20 49 46 20 45 58 49 53 54 53 20 74 31 3b 0a 20   IF EXISTS t1;. 
2a00: 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 49 46     DROP TABLE IF
2a10: 20 45 58 49 53 54 53 20 74 32 3b 0a 20 20 20 20   EXISTS t2;.    
2a20: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
2a30: 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  a INTEGER PRIMAR
2a40: 59 20 4b 45 59 20 4f 4e 20 43 4f 4e 46 4c 49 43  Y KEY ON CONFLIC
2a50: 54 20 49 47 4e 4f 52 45 2c 20 62 29 3b 0a 20 20  T IGNORE, b);.  
2a60: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
2a70: 32 28 78 20 49 4e 54 45 47 45 52 20 50 52 49 4d  2(x INTEGER PRIM
2a80: 41 52 59 20 4b 45 59 20 4f 4e 20 43 4f 4e 46 4c  ARY KEY ON CONFL
2a90: 49 43 54 20 49 47 4e 4f 52 45 2c 20 79 29 3b 0a  ICT IGNORE, y);.
2aa0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2ab0: 74 31 20 56 41 4c 55 45 53 28 31 2c 32 29 3b 0a  t1 VALUES(1,2);.
2ac0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2ad0: 74 32 20 56 41 4c 55 45 53 28 31 2c 33 29 3b 0a  t2 VALUES(1,3);.
2ae0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2af0: 74 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  t1 SELECT * FROM
2b00: 20 74 32 3b 0a 20 20 20 20 53 45 4c 45 43 54 20   t2;.    SELECT 
2b10: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d  * FROM t1;.  }.}
2b20: 20 7b 31 20 32 7d 0a 64 6f 5f 74 65 73 74 20 69   {1 2}.do_test i
2b30: 6e 73 65 72 74 34 2d 38 2e 34 20 7b 0a 20 20 65  nsert4-8.4 {.  e
2b40: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f  xecsql {.    DRO
2b50: 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 53 54  P TABLE IF EXIST
2b60: 53 20 74 31 3b 0a 20 20 20 20 44 52 4f 50 20 54  S t1;.    DROP T
2b70: 41 42 4c 45 20 49 46 20 45 58 49 53 54 53 20 74  ABLE IF EXISTS t
2b80: 32 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  2;.    CREATE TA
2b90: 42 4c 45 20 74 31 28 61 20 49 4e 54 45 47 45 52  BLE t1(a INTEGER
2ba0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 4f 4e 20   PRIMARY KEY ON 
2bb0: 43 4f 4e 46 4c 49 43 54 20 49 47 4e 4f 52 45 2c  CONFLICT IGNORE,
2bc0: 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   b);.    CREATE 
2bd0: 54 41 42 4c 45 20 74 32 28 78 2c 20 79 29 3b 0a  TABLE t2(x, y);.
2be0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2bf0: 74 31 20 56 41 4c 55 45 53 28 31 2c 32 29 3b 0a  t1 VALUES(1,2);.
2c00: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2c10: 74 32 20 56 41 4c 55 45 53 28 31 2c 33 29 3b 0a  t2 VALUES(1,3);.
2c20: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2c30: 74 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  t1 SELECT * FROM
2c40: 20 74 32 3b 0a 20 20 20 20 53 45 4c 45 43 54 20   t2;.    SELECT 
2c50: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d  * FROM t1;.  }.}
2c60: 20 7b 31 20 32 7d 0a 64 6f 5f 74 65 73 74 20 69   {1 2}.do_test i
2c70: 6e 73 65 72 74 34 2d 38 2e 35 20 7b 0a 20 20 65  nsert4-8.5 {.  e
2c80: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f  xecsql {.    DRO
2c90: 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 53 54  P TABLE IF EXIST
2ca0: 53 20 74 31 3b 0a 20 20 20 20 44 52 4f 50 20 54  S t1;.    DROP T
2cb0: 41 42 4c 45 20 49 46 20 45 58 49 53 54 53 20 74  ABLE IF EXISTS t
2cc0: 32 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  2;.    CREATE TA
2cd0: 42 4c 45 20 74 31 28 61 20 49 4e 54 45 47 45 52  BLE t1(a INTEGER
2ce0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 4f 4e 20   PRIMARY KEY ON 
2cf0: 43 4f 4e 46 4c 49 43 54 20 46 41 49 4c 2c 20 62  CONFLICT FAIL, b
2d00: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
2d10: 42 4c 45 20 74 32 28 78 20 49 4e 54 45 47 45 52  BLE t2(x INTEGER
2d20: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 4f 4e 20   PRIMARY KEY ON 
2d30: 43 4f 4e 46 4c 49 43 54 20 46 41 49 4c 2c 20 79  CONFLICT FAIL, y
2d40: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
2d50: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 32  TO t1 VALUES(1,2
2d60: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
2d70: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 2d 39 39  TO t2 VALUES(-99
2d80: 2c 31 30 30 29 3b 0a 20 20 20 20 49 4e 53 45 52  ,100);.    INSER
2d90: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
2da0: 28 31 2c 33 29 3b 0a 20 20 20 20 53 45 4c 45 43  (1,3);.    SELEC
2db0: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d  T * FROM t1;.  }
2dc0: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .  catchsql {.  
2dd0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
2de0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
2df0: 32 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 55 4e 49  2;.  }.} {1 {UNI
2e00: 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  QUE constraint f
2e10: 61 69 6c 65 64 3a 20 74 31 2e 61 7d 7d 0a 64 6f  ailed: t1.a}}.do
2e20: 5f 74 65 73 74 20 69 6e 73 65 72 74 34 2d 38 2e  _test insert4-8.
2e30: 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  6 {.  execsql {.
2e40: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
2e50: 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 2d 39 39  M t1;.  }.} {-99
2e60: 20 31 30 30 20 31 20 32 7d 20 0a 64 6f 5f 74 65   100 1 2} .do_te
2e70: 73 74 20 69 6e 73 65 72 74 34 2d 38 2e 37 20 7b  st insert4-8.7 {
2e80: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
2e90: 20 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45   DROP TABLE IF E
2ea0: 58 49 53 54 53 20 74 31 3b 0a 20 20 20 20 44 52  XISTS t1;.    DR
2eb0: 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 53  OP TABLE IF EXIS
2ec0: 54 53 20 74 32 3b 0a 20 20 20 20 43 52 45 41 54  TS t2;.    CREAT
2ed0: 45 20 54 41 42 4c 45 20 74 31 28 61 20 49 4e 54  E TABLE t1(a INT
2ee0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
2ef0: 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 41 42 4f   ON CONFLICT ABO
2f00: 52 54 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41  RT, b);.    CREA
2f10: 54 45 20 54 41 42 4c 45 20 74 32 28 78 20 49 4e  TE TABLE t2(x IN
2f20: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
2f30: 59 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 41 42  Y ON CONFLICT AB
2f40: 4f 52 54 2c 20 79 29 3b 0a 20 20 20 20 49 4e 53  ORT, y);.    INS
2f50: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
2f60: 45 53 28 31 2c 32 29 3b 0a 20 20 20 20 49 4e 53  ES(1,2);.    INS
2f70: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
2f80: 45 53 28 2d 39 39 2c 31 30 30 29 3b 0a 20 20 20  ES(-99,100);.   
2f90: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
2fa0: 56 41 4c 55 45 53 28 31 2c 33 29 3b 0a 20 20 20  VALUES(1,3);.   
2fb0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
2fc0: 31 3b 0a 20 20 7d 0a 20 20 63 61 74 63 68 73 71  1;.  }.  catchsq
2fd0: 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  l {.    INSERT I
2fe0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 2a 20  NTO t1 SELECT * 
2ff0: 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b  FROM t2;.  }.} {
3000: 31 20 7b 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  1 {UNIQUE constr
3010: 61 69 6e 74 20 66 61 69 6c 65 64 3a 20 74 31 2e  aint failed: t1.
3020: 61 7d 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 73 65  a}}.do_test inse
3030: 72 74 34 2d 38 2e 38 20 7b 0a 20 20 65 78 65 63  rt4-8.8 {.  exec
3040: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
3050: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a   * FROM t1;.  }.
3060: 7d 20 7b 31 20 32 7d 20 0a 64 6f 5f 74 65 73 74  } {1 2} .do_test
3070: 20 69 6e 73 65 72 74 34 2d 38 2e 39 20 7b 0a 20   insert4-8.9 {. 
3080: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44   execsql {.    D
3090: 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49  ROP TABLE IF EXI
30a0: 53 54 53 20 74 31 3b 0a 20 20 20 20 44 52 4f 50  STS t1;.    DROP
30b0: 20 54 41 42 4c 45 20 49 46 20 45 58 49 53 54 53   TABLE IF EXISTS
30c0: 20 74 32 3b 0a 20 20 20 20 43 52 45 41 54 45 20   t2;.    CREATE 
30d0: 54 41 42 4c 45 20 74 31 28 61 20 49 4e 54 45 47  TABLE t1(a INTEG
30e0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 4f  ER PRIMARY KEY O
30f0: 4e 20 43 4f 4e 46 4c 49 43 54 20 52 4f 4c 4c 42  N CONFLICT ROLLB
3100: 41 43 4b 2c 20 62 29 3b 0a 20 20 20 20 43 52 45  ACK, b);.    CRE
3110: 41 54 45 20 54 41 42 4c 45 20 74 32 28 78 20 49  ATE TABLE t2(x I
3120: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
3130: 45 59 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 52  EY ON CONFLICT R
3140: 4f 4c 4c 42 41 43 4b 2c 20 79 29 3b 0a 20 20 20  OLLBACK, y);.   
3150: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
3160: 56 41 4c 55 45 53 28 31 2c 32 29 3b 0a 20 20 20  VALUES(1,2);.   
3170: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
3180: 56 41 4c 55 45 53 28 2d 39 39 2c 31 30 30 29 3b  VALUES(-99,100);
3190: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
31a0: 20 74 32 20 56 41 4c 55 45 53 28 31 2c 33 29 3b   t2 VALUES(1,3);
31b0: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
31c0: 4f 4d 20 74 31 3b 0a 20 20 7d 0a 20 20 63 61 74  OM t1;.  }.  cat
31d0: 63 68 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49  chsql {.    BEGI
31e0: 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  N;.    INSERT IN
31f0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32 2c 33  TO t1 VALUES(2,3
3200: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
3210: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 2a 20 46  TO t1 SELECT * F
3220: 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 31  ROM t2;.  }.} {1
3230: 20 7b 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61   {UNIQUE constra
3240: 69 6e 74 20 66 61 69 6c 65 64 3a 20 74 31 2e 61  int failed: t1.a
3250: 7d 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 73 65 72  }}.do_test inser
3260: 74 34 2d 38 2e 31 30 20 7b 0a 20 20 63 61 74 63  t4-8.10 {.  catc
3270: 68 73 71 6c 20 7b 43 4f 4d 4d 49 54 7d 0a 7d 20  hsql {COMMIT}.} 
3280: 7b 31 20 7b 63 61 6e 6e 6f 74 20 63 6f 6d 6d 69  {1 {cannot commi
3290: 74 20 2d 20 6e 6f 20 74 72 61 6e 73 61 63 74 69  t - no transacti
32a0: 6f 6e 20 69 73 20 61 63 74 69 76 65 7d 7d 0a 64  on is active}}.d
32b0: 6f 5f 74 65 73 74 20 69 6e 73 65 72 74 34 2d 38  o_test insert4-8
32c0: 2e 31 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  .11 {.  execsql 
32d0: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  {.    SELECT * F
32e0: 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31  ROM t1;.  }.} {1
32f0: 20 32 7d 20 0a 0a 64 6f 5f 74 65 73 74 20 69 6e   2} ..do_test in
3300: 73 65 72 74 34 2d 38 2e 32 31 20 7b 0a 20 20 65  sert4-8.21 {.  e
3310: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f  xecsql {.    DRO
3320: 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 53 54  P TABLE IF EXIST
3330: 53 20 74 31 3b 0a 20 20 20 20 44 52 4f 50 20 54  S t1;.    DROP T
3340: 41 42 4c 45 20 49 46 20 45 58 49 53 54 53 20 74  ABLE IF EXISTS t
3350: 32 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  2;.    CREATE TA
3360: 42 4c 45 20 74 31 28 61 20 49 4e 54 45 47 45 52  BLE t1(a INTEGER
3370: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 4f 4e 20   PRIMARY KEY ON 
3380: 43 4f 4e 46 4c 49 43 54 20 52 45 50 4c 41 43 45  CONFLICT REPLACE
3390: 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , b);.    CREATE
33a0: 20 54 41 42 4c 45 20 74 32 28 78 20 49 4e 54 45   TABLE t2(x INTE
33b0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
33c0: 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 52 45 50 4c  ON CONFLICT REPL
33d0: 41 43 45 2c 20 79 29 3b 0a 20 20 20 20 49 4e 53  ACE, y);.    INS
33e0: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
33f0: 45 53 28 31 2c 33 29 3b 0a 20 20 20 20 49 4e 53  ES(1,3);.    INS
3400: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
3410: 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20  CT * FROM t2;.  
3420: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
3430: 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 33 7d 0a  t1;.  }.} {1 3}.
3440: 64 6f 5f 74 65 73 74 20 69 6e 73 65 72 74 34 2d  do_test insert4-
3450: 38 2e 32 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  8.22 {.  execsql
3460: 20 7b 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c   {.    DROP TABL
3470: 45 20 49 46 20 45 58 49 53 54 53 20 74 31 3b 0a  E IF EXISTS t1;.
3480: 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 49      DROP TABLE I
3490: 46 20 45 58 49 53 54 53 20 74 32 3b 0a 20 20 20  F EXISTS t2;.   
34a0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
34b0: 28 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  (a INTEGER PRIMA
34c0: 52 59 20 4b 45 59 20 4f 4e 20 43 4f 4e 46 4c 49  RY KEY ON CONFLI
34d0: 43 54 20 49 47 4e 4f 52 45 2c 20 62 29 3b 0a 20  CT IGNORE, b);. 
34e0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
34f0: 74 32 28 78 20 49 4e 54 45 47 45 52 20 50 52 49  t2(x INTEGER PRI
3500: 4d 41 52 59 20 4b 45 59 20 4f 4e 20 43 4f 4e 46  MARY KEY ON CONF
3510: 4c 49 43 54 20 49 47 4e 4f 52 45 2c 20 79 29 3b  LICT IGNORE, y);
3520: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
3530: 20 74 32 20 56 41 4c 55 45 53 28 31 2c 33 29 3b   t2 VALUES(1,3);
3540: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
3550: 20 74 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   t1 SELECT * FRO
3560: 4d 20 74 32 3b 0a 20 20 20 20 53 45 4c 45 43 54  M t2;.    SELECT
3570: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a   * FROM t1;.  }.
3580: 7d 20 7b 31 20 33 7d 0a 64 6f 5f 74 65 73 74 20  } {1 3}.do_test 
3590: 69 6e 73 65 72 74 34 2d 38 2e 32 33 20 7b 0a 20  insert4-8.23 {. 
35a0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44   execsql {.    D
35b0: 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49  ROP TABLE IF EXI
35c0: 53 54 53 20 74 31 3b 0a 20 20 20 20 44 52 4f 50  STS t1;.    DROP
35d0: 20 54 41 42 4c 45 20 49 46 20 45 58 49 53 54 53   TABLE IF EXISTS
35e0: 20 74 32 3b 0a 20 20 20 20 43 52 45 41 54 45 20   t2;.    CREATE 
35f0: 54 41 42 4c 45 20 74 31 28 61 20 49 4e 54 45 47  TABLE t1(a INTEG
3600: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 4f  ER PRIMARY KEY O
3610: 4e 20 43 4f 4e 46 4c 49 43 54 20 41 42 4f 52 54  N CONFLICT ABORT
3620: 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , b);.    CREATE
3630: 20 54 41 42 4c 45 20 74 32 28 78 20 49 4e 54 45   TABLE t2(x INTE
3640: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
3650: 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 41 42 4f 52  ON CONFLICT ABOR
3660: 54 2c 20 79 29 3b 0a 20 20 20 20 49 4e 53 45 52  T, y);.    INSER
3670: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
3680: 28 31 2c 33 29 3b 0a 20 20 20 20 49 4e 53 45 52  (1,3);.    INSER
3690: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
36a0: 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20   * FROM t2;.    
36b0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
36c0: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 33 7d 0a 64 6f  ;.  }.} {1 3}.do
36d0: 5f 74 65 73 74 20 69 6e 73 65 72 74 34 2d 38 2e  _test insert4-8.
36e0: 32 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  24 {.  execsql {
36f0: 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20  .    DROP TABLE 
3700: 49 46 20 45 58 49 53 54 53 20 74 31 3b 0a 20 20  IF EXISTS t1;.  
3710: 20 20 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20    DROP TABLE IF 
3720: 45 58 49 53 54 53 20 74 32 3b 0a 20 20 20 20 43  EXISTS t2;.    C
3730: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
3740: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
3750: 20 4b 45 59 20 4f 4e 20 43 4f 4e 46 4c 49 43 54   KEY ON CONFLICT
3760: 20 46 41 49 4c 2c 20 62 29 3b 0a 20 20 20 20 43   FAIL, b);.    C
3770: 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 78  REATE TABLE t2(x
3780: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
3790: 20 4b 45 59 20 4f 4e 20 43 4f 4e 46 4c 49 43 54   KEY ON CONFLICT
37a0: 20 46 41 49 4c 2c 20 79 29 3b 0a 20 20 20 20 49   FAIL, y);.    I
37b0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
37c0: 4c 55 45 53 28 31 2c 33 29 3b 0a 20 20 20 20 49  LUES(1,3);.    I
37d0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
37e0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a  LECT * FROM t2;.
37f0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
3800: 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 33  M t1;.  }.} {1 3
3810: 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 73 65 72 74  }.do_test insert
3820: 34 2d 38 2e 32 35 20 7b 0a 20 20 65 78 65 63 73  4-8.25 {.  execs
3830: 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20 54 41  ql {.    DROP TA
3840: 42 4c 45 20 49 46 20 45 58 49 53 54 53 20 74 31  BLE IF EXISTS t1
3850: 3b 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45  ;.    DROP TABLE
3860: 20 49 46 20 45 58 49 53 54 53 20 74 32 3b 0a 20   IF EXISTS t2;. 
3870: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
3880: 74 31 28 61 20 49 4e 54 45 47 45 52 20 50 52 49  t1(a INTEGER PRI
3890: 4d 41 52 59 20 4b 45 59 20 4f 4e 20 43 4f 4e 46  MARY KEY ON CONF
38a0: 4c 49 43 54 20 52 4f 4c 4c 42 41 43 4b 2c 20 62  LICT ROLLBACK, b
38b0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
38c0: 42 4c 45 20 74 32 28 78 20 49 4e 54 45 47 45 52  BLE t2(x INTEGER
38d0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 4f 4e 20   PRIMARY KEY ON 
38e0: 43 4f 4e 46 4c 49 43 54 20 52 4f 4c 4c 42 41 43  CONFLICT ROLLBAC
38f0: 4b 2c 20 79 29 3b 0a 20 20 20 20 49 4e 53 45 52  K, y);.    INSER
3900: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
3910: 28 31 2c 33 29 3b 0a 20 20 20 20 49 4e 53 45 52  (1,3);.    INSER
3920: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
3930: 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20   * FROM t2;.    
3940: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
3950: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 33 7d 0a 0a 64  ;.  }.} {1 3}..d
3960: 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20  o_catchsql_test 
3970: 69 6e 73 65 72 74 34 2d 39 2e 31 20 7b 0a 20 20  insert4-9.1 {.  
3980: 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58  DROP TABLE IF EX
3990: 49 53 54 53 20 74 31 3b 0a 20 20 43 52 45 41 54  ISTS t1;.  CREAT
39a0: 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b 0a 20  E TABLE t1(x);. 
39b0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 28   INSERT INTO t1(
39c0: 78 29 20 56 41 4c 55 45 53 28 35 20 43 4f 4c 4c  x) VALUES(5 COLL
39d0: 41 54 45 20 78 79 7a 7a 79 29 20 55 4e 49 4f 4e  ATE xyzzy) UNION
39e0: 20 53 45 4c 45 43 54 20 30 3b 0a 7d 20 7b 31 20   SELECT 0;.} {1 
39f0: 7b 6e 6f 20 73 75 63 68 20 63 6f 6c 6c 61 74 69  {no such collati
3a00: 6f 6e 20 73 65 71 75 65 6e 63 65 3a 20 78 79 7a  on sequence: xyz
3a10: 7a 79 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  zy}}..#---------
3a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a60: 0a 23 20 43 68 65 63 6b 20 74 68 61 74 20 72 75  .# Check that ru
3a70: 6e 6e 69 6e 67 20 61 6e 20 69 6e 74 65 67 72 69  nning an integri
3a80: 74 79 2d 63 68 65 63 6b 20 64 6f 65 73 20 6e 6f  ty-check does no
3a90: 74 20 64 69 73 61 62 6c 65 20 74 68 65 20 78 66  t disable the xf
3aa0: 65 72 20 0a 23 20 6f 70 74 69 6d 69 7a 61 74 69  er .# optimizati
3ab0: 6f 6e 20 66 6f 72 20 74 61 62 6c 65 73 20 77 69  on for tables wi
3ac0: 74 68 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  th CHECK constra
3ad0: 69 6e 74 73 2e 0a 23 0a 64 6f 5f 65 78 65 63 73  ints..#.do_execs
3ae0: 71 6c 5f 74 65 73 74 20 31 30 2e 31 20 7b 0a 20  ql_test 10.1 {. 
3af0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 38   CREATE TABLE t8
3b00: 28 0a 20 20 20 20 72 69 64 20 49 4e 54 45 47 45  (.    rid INTEGE
3b10: 52 2c 0a 20 20 20 20 70 69 64 20 49 4e 54 45 47  R,.    pid INTEG
3b20: 45 52 2c 0a 20 20 20 20 6d 69 64 20 49 4e 54 45  ER,.    mid INTE
3b30: 47 45 52 2c 0a 20 20 20 20 70 78 20 49 4e 54 45  GER,.    px INTE
3b40: 47 45 52 20 44 45 46 41 55 4c 54 28 30 29 20 43  GER DEFAULT(0) C
3b50: 48 45 43 4b 28 70 78 20 49 4e 28 30 2c 20 31 29  HECK(px IN(0, 1)
3b60: 29 0a 20 20 29 3b 0a 20 20 43 52 45 41 54 45 20  ).  );.  CREATE 
3b70: 54 45 4d 50 20 54 41 42 4c 45 20 78 28 0a 20 20  TEMP TABLE x(.  
3b80: 20 20 72 69 64 20 49 4e 54 45 47 45 52 2c 0a 20    rid INTEGER,. 
3b90: 20 20 20 70 69 64 20 49 4e 54 45 47 45 52 2c 0a     pid INTEGER,.
3ba0: 20 20 20 20 6d 69 64 20 49 4e 54 45 47 45 52 2c      mid INTEGER,
3bb0: 0a 20 20 20 20 70 78 20 49 4e 54 45 47 45 52 20  .    px INTEGER 
3bc0: 44 45 46 41 55 4c 54 28 30 29 20 43 48 45 43 4b  DEFAULT(0) CHECK
3bd0: 28 70 78 20 49 4e 28 30 2c 20 31 29 29 0a 20 20  (px IN(0, 1)).  
3be0: 29 3b 0a 7d 0a 64 6f 5f 74 65 73 74 20 31 30 2e  );.}.do_test 10.
3bf0: 32 20 7b 0a 20 20 73 65 74 20 73 71 6c 69 74 65  2 {.  set sqlite
3c00: 33 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74 20  3_xferopt_count 
3c10: 30 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e  0.  execsql { IN
3c20: 53 45 52 54 20 49 4e 54 4f 20 78 20 53 45 4c 45  SERT INTO x SELE
3c30: 43 54 20 2a 20 46 52 4f 4d 20 74 38 20 7d 0a 20  CT * FROM t8 }. 
3c40: 20 73 65 74 20 73 71 6c 69 74 65 33 5f 78 66 65   set sqlite3_xfe
3c50: 72 6f 70 74 5f 63 6f 75 6e 74 0a 7d 20 7b 31 7d  ropt_count.} {1}
3c60: 0a 0a 64 6f 5f 74 65 73 74 20 31 30 2e 33 20 7b  ..do_test 10.3 {
3c70: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41  .  execsql { PRA
3c80: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
3c90: 65 63 6b 20 7d 0a 20 20 73 65 74 20 73 71 6c 69  eck }.  set sqli
3ca0: 74 65 33 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e  te3_xferopt_coun
3cb0: 74 20 30 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  t 0.  execsql { 
3cc0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 78 20 20 20  INSERT INTO x   
3cd0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
3ce0: 74 38 20 7d 0a 20 20 73 65 74 20 73 71 6c 69 74  t8 }.  set sqlit
3cf0: 65 33 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74  e3_xferopt_count
3d00: 0a 7d 20 7b 31 7d 0a 0a 0a 66 69 6e 69 73 68 5f  .} {1}...finish_
3d10: 74 65 73 74 0a                                   test.