SQLite4
Hex Artifact Content
Not logged in

Artifact 167a43b0def09e3c021dbc4bc005ad9bc1e81515:


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 0a 69 66 63 61 70 61 62 6c 65 20 21  tcl..ifcapable !
0270: 76 69 65 77 7c 7c 21 73 75 62 71 75 65 72 79 20  view||!subquery 
0280: 7b 0a 20 20 66 69 6e 69 73 68 5f 74 65 73 74 0a  {.  finish_test.
0290: 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 23 20 54 68    return.}..# Th
02a0: 65 20 73 71 6c 69 74 65 34 5f 78 66 65 72 6f 70  e sqlite4_xferop
02b0: 74 5f 63 6f 75 6e 74 20 76 61 72 69 61 62 6c 65  t_count variable
02c0: 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
02d0: 77 68 65 6e 65 76 65 72 20 74 68 65 20 0a 23 20  whenever the .# 
02e0: 69 6e 73 65 72 74 20 74 72 61 6e 73 66 65 72 20  insert transfer 
02f0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 61 70 70  optimization app
0300: 6c 69 65 73 2e 0a 23 0a 23 20 54 68 69 73 20 70  lies..#.# This p
0310: 72 6f 63 65 64 75 72 65 20 72 75 6e 73 20 61 20  rocedure runs a 
0320: 74 65 73 74 20 74 6f 20 73 65 65 20 69 66 20 74  test to see if t
0330: 68 65 20 73 71 6c 69 74 65 34 5f 78 66 65 72 6f  he sqlite4_xfero
0340: 70 74 5f 63 6f 75 6e 74 20 69 73 0a 23 20 73 65  pt_count is.# se
0350: 74 20 74 6f 20 4e 2e 0a 23 0a 70 72 6f 63 20 78  t to N..#.proc x
0360: 66 65 72 6f 70 74 5f 74 65 73 74 20 7b 74 65 73  feropt_test {tes
0370: 74 6e 61 6d 65 20 4e 7d 20 7b 0a 20 20 64 6f 5f  tname N} {.  do_
0380: 74 65 73 74 20 24 74 65 73 74 6e 61 6d 65 20 7b  test $testname {
0390: 73 65 74 20 3a 3a 73 71 6c 69 74 65 34 5f 78 66  set ::sqlite4_xf
03a0: 65 72 6f 70 74 5f 63 6f 75 6e 74 7d 20 24 4e 0a  eropt_count} $N.
03b0: 7d 0a 0a 23 20 43 72 65 61 74 65 20 74 61 62 6c  }..# Create tabl
03c0: 65 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  es used for test
03d0: 69 6e 67 2e 0a 23 0a 65 78 65 63 73 71 6c 20 7b  ing..#.execsql {
03e0: 0a 20 20 50 52 41 47 4d 41 20 6c 65 67 61 63 79  .  PRAGMA legacy
03f0: 5f 66 69 6c 65 5f 66 6f 72 6d 61 74 20 3d 20 30  _file_format = 0
0400: 3b 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  ;.  CREATE TABLE
0410: 20 74 31 28 61 20 69 6e 74 2c 20 62 20 69 6e 74   t1(a int, b int
0420: 2c 20 63 68 65 63 6b 28 62 3e 61 29 29 3b 0a 20  , check(b>a));. 
0430: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
0440: 28 78 20 69 6e 74 2c 20 79 20 69 6e 74 29 3b 0a  (x int, y int);.
0450: 20 20 43 52 45 41 54 45 20 56 49 45 57 20 76 32    CREATE VIEW v2
0460: 20 41 53 20 53 45 4c 45 43 54 20 79 2c 20 78 20   AS SELECT y, x 
0470: 46 52 4f 4d 20 74 32 3b 0a 20 20 43 52 45 41 54  FROM t2;.  CREAT
0480: 45 20 54 41 42 4c 45 20 74 33 28 61 20 69 6e 74  E TABLE t3(a int
0490: 2c 20 62 20 69 6e 74 29 3b 0a 7d 0a 0a 23 20 54  , b int);.}..# T
04a0: 69 63 6b 65 74 20 23 32 32 35 32 2e 20 20 4d 61  icket #2252.  Ma
04b0: 6b 65 20 73 75 72 65 20 74 68 65 20 61 6e 20 49  ke sure the an I
04c0: 4e 53 45 52 54 20 66 72 6f 6d 20 69 64 65 6e 74  NSERT from ident
04d0: 69 63 61 6c 20 74 61 62 6c 65 73 0a 23 20 64 6f  ical tables.# do
04e0: 65 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 20 63  es not violate c
04f0: 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 23 0a 64 6f  onstraints..#.do
0500: 5f 74 65 73 74 20 69 6e 73 65 72 74 34 2d 31 2e  _test insert4-1.
0510: 31 20 7b 0a 20 20 73 65 74 20 73 71 6c 69 74 65  1 {.  set sqlite
0520: 34 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74 20  4_xferopt_count 
0530: 30 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  0.  execsql {.  
0540: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31    DELETE FROM t1
0550: 3b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  ;.    DELETE FRO
0560: 4d 20 74 32 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t2;.    INSERT
0570: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
0580: 39 2c 31 29 3b 0a 20 20 7d 0a 20 20 63 61 74 63  9,1);.  }.  catc
0590: 68 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52  hsql {.    INSER
05a0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
05b0: 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a   * FROM t2;.  }.
05c0: 7d 20 7b 31 20 7b 63 6f 6e 73 74 72 61 69 6e 74  } {1 {constraint
05d0: 20 66 61 69 6c 65 64 7d 7d 0a 78 66 65 72 6f 70   failed}}.xferop
05e0: 74 5f 74 65 73 74 20 69 6e 73 65 72 74 34 2d 31  t_test insert4-1
05f0: 2e 32 20 30 0a 64 6f 5f 74 65 73 74 20 69 6e 73  .2 0.do_test ins
0600: 65 72 74 34 2d 31 2e 33 20 7b 0a 20 20 65 78 65  ert4-1.3 {.  exe
0610: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
0620: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d  T * FROM t1;.  }
0630: 0a 7d 20 7b 7d 0a 0a 23 20 54 65 73 74 73 20 74  .} {}..# Tests t
0640: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
0650: 20 74 68 65 20 74 72 61 6e 73 66 65 72 20 6f 70   the transfer op
0660: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 6e 6f  timization is no
0670: 74 20 6f 63 63 75 72 72 69 6e 67 0a 23 20 77 68  t occurring.# wh
0680: 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 61 20 76  en it is not a v
0690: 61 6c 69 64 20 6f 70 74 69 6d 69 7a 61 74 69 6f  alid optimizatio
06a0: 6e 2e 0a 23 0a 23 20 54 68 65 20 53 45 4c 45 43  n..#.# The SELEC
06b0: 54 20 6d 75 73 74 20 62 65 20 61 67 61 69 6e 73  T must be agains
06c0: 74 20 61 20 72 65 61 6c 20 74 61 62 6c 65 2e 0a  t a real table..
06d0: 64 6f 5f 74 65 73 74 20 69 6e 73 65 72 74 34 2d  do_test insert4-
06e0: 32 2e 31 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  2.1.1 {.  execsq
06f0: 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46  l {.    DELETE F
0700: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45  ROM t1;.    INSE
0710: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
0720: 54 20 34 2c 20 38 3b 0a 20 20 20 20 53 45 4c 45  T 4, 8;.    SELE
0730: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT * FROM t1;.  
0740: 7d 0a 7d 20 7b 34 20 38 7d 0a 78 66 65 72 6f 70  }.} {4 8}.xferop
0750: 74 5f 74 65 73 74 20 69 6e 73 65 72 74 34 2d 32  t_test insert4-2
0760: 2e 31 2e 32 20 20 30 0a 64 6f 5f 74 65 73 74 20  .1.2  0.do_test 
0770: 69 6e 73 65 72 74 34 2d 32 2e 32 2e 31 20 7b 0a  insert4-2.2.1 {.
0780: 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20 20    catchsql {.   
0790: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 3b   DELETE FROM t1;
07a0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
07b0: 20 74 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   t1 SELECT * FRO
07c0: 4d 20 76 32 3b 0a 20 20 20 20 53 45 4c 45 43 54  M v2;.    SELECT
07d0: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a   * FROM t1;.  }.
07e0: 7d 20 7b 30 20 7b 31 20 39 7d 7d 0a 78 66 65 72  } {0 {1 9}}.xfer
07f0: 6f 70 74 5f 74 65 73 74 20 69 6e 73 65 72 74 34  opt_test insert4
0800: 2d 32 2e 32 2e 32 20 30 0a 0a 23 20 44 6f 20 6e  -2.2.2 0..# Do n
0810: 6f 74 20 72 75 6e 20 74 68 65 20 74 72 61 6e 73  ot run the trans
0820: 66 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  fer optimization
0830: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 4c   if there is a L
0840: 49 4d 49 54 20 63 6c 61 75 73 65 0a 23 0a 64 6f  IMIT clause.#.do
0850: 5f 74 65 73 74 20 69 6e 73 65 72 74 34 2d 32 2e  _test insert4-2.
0860: 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  3.1 {.  execsql 
0870: 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f  {.    DELETE FRO
0880: 4d 20 74 32 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t2;.    INSERT
0890: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
08a0: 39 2c 31 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  9,1);.    INSERT
08b0: 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20   INTO t2 SELECT 
08c0: 79 2c 20 78 20 46 52 4f 4d 20 74 32 3b 0a 20 20  y, x FROM t2;.  
08d0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
08e0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
08f0: 32 20 4c 49 4d 49 54 20 31 3b 0a 20 20 20 20 53  2 LIMIT 1;.    S
0900: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b  ELECT * FROM t3;
0910: 0a 20 20 7d 0a 7d 20 7b 39 20 31 7d 0a 78 66 65  .  }.} {9 1}.xfe
0920: 72 6f 70 74 5f 74 65 73 74 20 69 6e 73 65 72 74  ropt_test insert
0930: 34 2d 32 2e 33 2e 32 20 20 30 0a 64 6f 5f 74 65  4-2.3.2  0.do_te
0940: 73 74 20 69 6e 73 65 72 74 34 2d 32 2e 33 2e 33  st insert4-2.3.3
0950: 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a   {.  catchsql {.
0960: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
0970: 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
0980: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 2a 20  NTO t1 SELECT * 
0990: 46 52 4f 4d 20 74 32 20 4c 49 4d 49 54 20 31 3b  FROM t2 LIMIT 1;
09a0: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
09b0: 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20  OM t1;.  }.} {1 
09c0: 7b 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c  {constraint fail
09d0: 65 64 7d 7d 0a 78 66 65 72 6f 70 74 5f 74 65 73  ed}}.xferopt_tes
09e0: 74 20 69 6e 73 65 72 74 34 2d 32 2e 33 2e 34 20  t insert4-2.3.4 
09f0: 30 0a 0a 23 20 44 6f 20 6e 6f 74 20 72 75 6e 20  0..# Do not run 
0a00: 74 68 65 20 74 72 61 6e 73 66 65 72 20 6f 70 74  the transfer opt
0a10: 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20 74 68 65  imization if the
0a20: 72 65 20 69 73 20 61 20 44 49 53 54 49 4e 43 54  re is a DISTINCT
0a30: 0a 23 0a 64 6f 5f 74 65 73 74 20 69 6e 73 65 72  .#.do_test inser
0a40: 74 34 2d 32 2e 34 2e 31 20 7b 0a 20 20 65 78 65  t4-2.4.1 {.  exe
0a50: 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54  csql {.    DELET
0a60: 45 20 46 52 4f 4d 20 74 33 3b 0a 20 20 20 20 49  E FROM t3;.    I
0a70: 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 53 45  NSERT INTO t3 SE
0a80: 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 2a 20  LECT DISTINCT * 
0a90: 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 53 45 4c  FROM t2;.    SEL
0aa0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 33 3b 0a 20  ECT * FROM t3;. 
0ab0: 20 7d 0a 7d 20 7b 39 20 31 20 31 20 39 7d 0a 78   }.} {9 1 1 9}.x
0ac0: 66 65 72 6f 70 74 5f 74 65 73 74 20 69 6e 73 65  feropt_test inse
0ad0: 72 74 34 2d 32 2e 34 2e 32 20 30 0a 64 6f 5f 74  rt4-2.4.2 0.do_t
0ae0: 65 73 74 20 69 6e 73 65 72 74 34 2d 32 2e 34 2e  est insert4-2.4.
0af0: 33 20 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  3 {.  catchsql {
0b00: 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  .    DELETE FROM
0b10: 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   t1;.    INSERT 
0b20: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 44  INTO t1 SELECT D
0b30: 49 53 54 49 4e 43 54 20 2a 20 46 52 4f 4d 20 74  ISTINCT * FROM t
0b40: 32 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 63 6f 6e  2;.  }.} {1 {con
0b50: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d  straint failed}}
0b60: 0a 78 66 65 72 6f 70 74 5f 74 65 73 74 20 69 6e  .xferopt_test in
0b70: 73 65 72 74 34 2d 32 2e 34 2e 34 20 30 0a 0a 23  sert4-2.4.4 0..#
0b80: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70   The following p
0b90: 72 6f 63 65 64 75 72 65 20 63 6f 6e 73 74 72 75  rocedure constru
0ba0: 63 74 73 20 74 77 6f 20 74 61 62 6c 65 73 20 74  cts two tables t
0bb0: 68 65 6e 20 74 72 69 65 73 20 74 6f 20 74 72 61  hen tries to tra
0bc0: 6e 73 66 65 72 0a 23 20 64 61 74 61 20 66 72 6f  nsfer.# data fro
0bd0: 6d 20 6f 6e 65 20 74 61 62 6c 65 20 74 6f 20 74  m one table to t
0be0: 68 65 20 6f 74 68 65 72 2e 20 20 43 68 65 63 6b  he other.  Check
0bf0: 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 6d 61  s are made to ma
0c00: 6b 65 20 73 75 72 65 20 74 68 65 0a 23 20 74 72  ke sure the.# tr
0c10: 61 6e 73 66 65 72 20 69 73 20 73 75 63 63 65 73  ansfer is succes
0c20: 73 66 75 6c 20 61 6e 64 20 74 68 61 74 20 74 68  sful and that th
0c30: 65 20 74 72 61 6e 73 66 65 72 20 6f 70 74 69 6d  e transfer optim
0c40: 69 7a 61 74 69 6f 6e 20 77 61 73 20 75 73 65 64  ization was used
0c50: 20 6f 72 0a 23 20 6e 6f 74 2c 20 61 73 20 61 70   or.# not, as ap
0c60: 70 72 6f 70 72 69 61 74 65 2e 0a 23 0a 23 20 20  propriate..#.#  
0c70: 20 20 20 78 66 65 72 5f 63 68 65 63 6b 20 54 45     xfer_check TE
0c80: 53 54 49 44 20 20 58 46 45 52 2d 55 53 45 44 20  STID  XFER-USED 
0c90: 20 20 49 4e 49 54 2d 44 41 54 41 20 20 20 44 45    INIT-DATA   DE
0ca0: 53 54 2d 53 43 48 45 4d 41 20 20 20 53 52 43 2d  ST-SCHEMA   SRC-
0cb0: 53 43 48 45 4d 41 20 0a 23 0a 23 20 54 68 65 20  SCHEMA .#.# The 
0cc0: 54 45 53 54 49 44 20 61 72 67 75 6d 65 6e 74 20  TESTID argument 
0cd0: 69 73 20 74 68 65 20 73 79 6d 62 6f 6c 69 63 20  is the symbolic 
0ce0: 6e 61 6d 65 20 66 6f 72 20 74 68 69 73 20 74 65  name for this te
0cf0: 73 74 2e 20 20 54 68 65 20 58 46 45 52 2d 55 53  st.  The XFER-US
0d00: 45 44 0a 23 20 61 72 67 75 6d 65 6e 74 20 69 73  ED.# argument is
0d10: 20 74 72 75 65 20 69 66 20 74 68 65 20 74 72 61   true if the tra
0d20: 6e 73 66 65 72 20 6f 70 74 69 6d 69 7a 61 74 69  nsfer optimizati
0d30: 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 65 6d 70  on should be emp
0d40: 6c 6f 79 65 64 20 61 6e 64 0a 23 20 66 61 6c 73  loyed and.# fals
0d50: 65 20 69 66 20 6e 6f 74 2e 20 20 49 4e 49 54 2d  e if not.  INIT-
0d60: 44 41 54 41 20 69 73 20 61 20 73 69 6e 67 6c 65  DATA is a single
0d70: 20 72 6f 77 20 6f 66 20 64 61 74 61 20 74 68 61   row of data tha
0d80: 74 20 69 73 20 74 6f 20 62 65 20 0a 23 20 74 72  t is to be .# tr
0d90: 61 6e 73 66 65 72 65 64 2e 20 20 44 45 53 54 2d  ansfered.  DEST-
0da0: 53 43 48 45 4d 41 20 61 6e 64 20 53 52 43 2d 53  SCHEMA and SRC-S
0db0: 43 48 45 4d 41 20 61 72 65 20 74 61 62 6c 65 20  CHEMA are table 
0dc0: 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 66 6f 72  declarations for
0dd0: 0a 23 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  .# the destinati
0de0: 6f 6e 20 61 6e 64 20 73 6f 75 72 63 65 20 74 61  on and source ta
0df0: 62 6c 65 73 2e 0a 23 0a 70 72 6f 63 20 78 66 65  bles..#.proc xfe
0e00: 72 5f 63 68 65 63 6b 20 7b 74 65 73 74 69 64 20  r_check {testid 
0e10: 78 66 65 72 75 73 65 64 20 69 6e 69 74 64 61 74  xferused initdat
0e20: 61 20 64 65 73 74 73 63 68 65 6d 61 20 73 72 63  a destschema src
0e30: 73 63 68 65 6d 61 7d 20 7b 0a 20 20 65 78 65 63  schema} {.  exec
0e40: 73 71 6c 20 22 43 52 45 41 54 45 20 54 41 42 4c  sql "CREATE TABL
0e50: 45 20 64 65 73 74 28 24 64 65 73 74 73 63 68 65  E dest($destsche
0e60: 6d 61 29 22 0a 20 20 65 78 65 63 73 71 6c 20 22  ma)".  execsql "
0e70: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 72 63  CREATE TABLE src
0e80: 28 24 73 72 63 73 63 68 65 6d 61 29 22 0a 20 20  ($srcschema)".  
0e90: 65 78 65 63 73 71 6c 20 22 49 4e 53 45 52 54 20  execsql "INSERT 
0ea0: 49 4e 54 4f 20 73 72 63 20 56 41 4c 55 45 53 28  INTO src VALUES(
0eb0: 5b 6a 6f 69 6e 20 24 69 6e 69 74 64 61 74 61 20  [join $initdata 
0ec0: 2c 5d 29 22 0a 20 20 73 65 74 20 3a 3a 73 71 6c  ,])".  set ::sql
0ed0: 69 74 65 34 5f 78 66 65 72 6f 70 74 5f 63 6f 75  ite4_xferopt_cou
0ee0: 6e 74 20 30 0a 20 20 64 6f 5f 74 65 73 74 20 24  nt 0.  do_test $
0ef0: 74 65 73 74 69 64 2e 31 20 7b 0a 20 20 20 20 65  testid.1 {.    e
0f00: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 49  xecsql {.      I
0f10: 4e 53 45 52 54 20 49 4e 54 4f 20 64 65 73 74 20  NSERT INTO dest 
0f20: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 72  SELECT * FROM sr
0f30: 63 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  c;.      SELECT 
0f40: 2a 20 46 52 4f 4d 20 64 65 73 74 3b 0a 20 20 20  * FROM dest;.   
0f50: 20 7d 0a 20 20 7d 20 24 69 6e 69 74 64 61 74 61   }.  } $initdata
0f60: 0a 20 20 64 6f 5f 74 65 73 74 20 24 74 65 73 74  .  do_test $test
0f70: 69 64 2e 32 20 7b 0a 20 20 20 20 73 65 74 20 3a  id.2 {.    set :
0f80: 3a 73 71 6c 69 74 65 34 5f 78 66 65 72 6f 70 74  :sqlite4_xferopt
0f90: 5f 63 6f 75 6e 74 0a 20 20 7d 20 24 78 66 65 72  _count.  } $xfer
0fa0: 75 73 65 64 0a 20 20 65 78 65 63 73 71 6c 20 7b  used.  execsql {
0fb0: 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20  .    DROP TABLE 
0fc0: 64 65 73 74 3b 0a 20 20 20 20 44 52 4f 50 20 54  dest;.    DROP T
0fd0: 41 42 4c 45 20 73 72 63 3b 0a 20 20 7d 0a 7d 0a  ABLE src;.  }.}.
0fe0: 0a 0a 23 20 44 6f 20 72 75 6e 20 74 68 65 20 74  ..# Do run the t
0ff0: 72 61 6e 73 66 65 72 20 6f 70 74 69 6d 69 7a 61  ransfer optimiza
1000: 74 69 6f 6e 20 69 66 20 74 61 62 6c 65 73 20 68  tion if tables h
1010: 61 76 65 20 69 64 65 6e 74 69 63 61 6c 0a 23 20  ave identical.# 
1020: 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
1030: 73 2e 0a 23 0a 78 66 65 72 5f 63 68 65 63 6b 20  s..#.xfer_check 
1040: 69 6e 73 65 72 74 34 2d 33 2e 31 20 31 20 7b 31  insert4-3.1 1 {1
1050: 20 39 7d 20 5c 0a 20 20 20 20 7b 61 20 69 6e 74   9} \.    {a int
1060: 2c 20 62 20 69 6e 74 20 43 48 45 43 4b 28 62 3e  , b int CHECK(b>
1070: 61 29 7d 20 5c 0a 20 20 20 20 7b 78 20 69 6e 74  a)} \.    {x int
1080: 2c 20 79 20 69 6e 74 20 43 48 45 43 4b 28 79 3e  , y int CHECK(y>
1090: 78 29 7d 0a 78 66 65 72 5f 63 68 65 63 6b 20 69  x)}.xfer_check i
10a0: 6e 73 65 72 74 34 2d 33 2e 32 20 31 20 7b 31 20  nsert4-3.2 1 {1 
10b0: 39 7d 20 5c 0a 20 20 20 20 7b 61 20 69 6e 74 2c  9} \.    {a int,
10c0: 20 62 20 69 6e 74 20 43 48 45 43 4b 28 62 3e 61   b int CHECK(b>a
10d0: 29 7d 20 5c 0a 20 20 20 20 7b 78 20 69 6e 74 20  )} \.    {x int 
10e0: 43 48 45 43 4b 28 79 3e 78 29 2c 20 79 20 69 6e  CHECK(y>x), y in
10f0: 74 7d 0a 0a 23 20 44 6f 20 72 75 6e 20 74 68 65  t}..# Do run the
1100: 20 74 72 61 6e 73 66 65 72 20 6f 70 74 69 6d 69   transfer optimi
1110: 7a 61 74 69 6f 6e 20 69 66 20 74 68 65 20 64 65  zation if the de
1120: 73 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20  stination table 
1130: 6c 61 63 6b 73 0a 23 20 61 6e 79 20 43 48 45 43  lacks.# any CHEC
1140: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72 65  K constraints re
1150: 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
1160: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 72 65  her or not there
1170: 20 61 72 65 20 43 48 45 43 4b 0a 23 20 63 6f 6e   are CHECK.# con
1180: 73 74 72 61 69 6e 74 73 20 6f 6e 20 74 68 65 20  straints on the 
1190: 73 6f 75 72 63 65 20 74 61 62 6c 65 2e 0a 23 0a  source table..#.
11a0: 78 66 65 72 5f 63 68 65 63 6b 20 69 6e 73 65 72  xfer_check inser
11b0: 74 34 2d 33 2e 33 20 31 20 7b 31 20 39 7d 20 5c  t4-3.3 1 {1 9} \
11c0: 0a 20 20 20 20 7b 61 20 69 6e 74 2c 20 62 20 69  .    {a int, b i
11d0: 6e 74 7d 20 5c 0a 20 20 20 20 7b 78 20 69 6e 74  nt} \.    {x int
11e0: 2c 20 79 20 69 6e 74 20 43 48 45 43 4b 28 79 3e  , y int CHECK(y>
11f0: 78 29 7d 0a 0a 23 20 44 6f 20 72 75 6e 20 74 68  x)}..# Do run th
1200: 65 20 74 72 61 6e 73 66 65 72 20 6f 70 74 69 6d  e transfer optim
1210: 69 7a 61 74 69 6f 6e 20 69 66 20 74 68 65 20 64  ization if the d
1220: 65 73 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65  estination table
1230: 20 6f 6d 69 74 73 0a 23 20 4e 4f 54 20 4e 55 4c   omits.# NOT NUL
1240: 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 68  L constraints th
1250: 61 74 20 74 68 65 20 73 6f 75 72 63 65 20 74 61  at the source ta
1260: 62 6c 65 20 68 61 73 2e 0a 23 0a 78 66 65 72 5f  ble has..#.xfer_
1270: 63 68 65 63 6b 20 69 6e 73 65 72 74 34 2d 33 2e  check insert4-3.
1280: 34 20 30 20 7b 31 20 39 7d 20 5c 0a 20 20 20 20  4 0 {1 9} \.    
1290: 7b 61 20 69 6e 74 2c 20 62 20 69 6e 74 20 43 48  {a int, b int CH
12a0: 45 43 4b 28 62 3e 61 29 7d 20 5c 0a 20 20 20 20  ECK(b>a)} \.    
12b0: 7b 78 20 69 6e 74 2c 20 79 20 69 6e 74 7d 0a 0a  {x int, y int}..
12c0: 23 20 44 6f 20 6e 6f 74 20 72 75 6e 20 74 68 65  # Do not run the
12d0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66   optimization if
12e0: 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
12f0: 20 68 61 73 20 4e 4f 54 20 4e 55 4c 4c 0a 23 20   has NOT NULL.# 
1300: 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 68 61 74  constraints that
1310: 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c   the source tabl
1320: 65 20 6c 61 63 6b 73 2e 0a 23 0a 78 66 65 72 5f  e lacks..#.xfer_
1330: 63 68 65 63 6b 20 69 6e 73 65 72 74 34 2d 33 2e  check insert4-3.
1340: 35 20 30 20 7b 31 20 39 7d 20 5c 0a 20 20 20 20  5 0 {1 9} \.    
1350: 7b 61 20 69 6e 74 2c 20 62 20 69 6e 74 20 4e 4f  {a int, b int NO
1360: 54 20 4e 55 4c 4c 7d 20 5c 0a 20 20 20 20 7b 78  T NULL} \.    {x
1370: 20 69 6e 74 2c 20 79 20 69 6e 74 7d 0a 78 66 65   int, y int}.xfe
1380: 72 5f 63 68 65 63 6b 20 69 6e 73 65 72 74 34 2d  r_check insert4-
1390: 33 2e 36 20 30 20 7b 31 20 39 7d 20 5c 0a 20 20  3.6 0 {1 9} \.  
13a0: 20 20 7b 61 20 69 6e 74 2c 20 62 20 69 6e 74 20    {a int, b int 
13b0: 4e 4f 54 20 4e 55 4c 4c 7d 20 5c 0a 20 20 20 20  NOT NULL} \.    
13c0: 7b 78 20 69 6e 74 20 4e 4f 54 20 4e 55 4c 4c 2c  {x int NOT NULL,
13d0: 20 79 20 69 6e 74 7d 0a 78 66 65 72 5f 63 68 65   y int}.xfer_che
13e0: 63 6b 20 69 6e 73 65 72 74 34 2d 33 2e 37 20 30  ck insert4-3.7 0
13f0: 20 7b 31 20 39 7d 20 5c 0a 20 20 20 20 7b 61 20   {1 9} \.    {a 
1400: 69 6e 74 20 4e 4f 54 20 4e 55 4c 4c 2c 20 62 20  int NOT NULL, b 
1410: 69 6e 74 20 4e 4f 54 20 4e 55 4c 4c 7d 20 5c 0a  int NOT NULL} \.
1420: 20 20 20 20 7b 78 20 69 6e 74 20 4e 4f 54 20 4e      {x int NOT N
1430: 55 4c 4c 2c 20 79 20 69 6e 74 7d 0a 78 66 65 72  ULL, y int}.xfer
1440: 5f 63 68 65 63 6b 20 69 6e 73 65 72 74 34 2d 33  _check insert4-3
1450: 2e 38 20 30 20 7b 31 20 39 7d 20 5c 0a 20 20 20  .8 0 {1 9} \.   
1460: 20 7b 61 20 69 6e 74 20 4e 4f 54 20 4e 55 4c 4c   {a int NOT NULL
1470: 2c 20 62 20 69 6e 74 7d 20 5c 0a 20 20 20 20 7b  , b int} \.    {
1480: 78 20 69 6e 74 2c 20 79 20 69 6e 74 7d 0a 0a 0a  x int, y int}...
1490: 23 20 44 6f 20 72 75 6e 20 74 68 65 20 74 72 61  # Do run the tra
14a0: 6e 73 66 65 72 20 6f 70 74 69 6d 69 7a 61 74 69  nsfer optimizati
14b0: 6f 6e 20 69 66 20 74 68 65 20 64 65 73 74 69 6e  on if the destin
14c0: 61 74 69 6f 6e 20 74 61 62 6c 65 20 61 6e 64 0a  ation table and.
14d0: 23 20 73 6f 75 72 63 65 20 74 61 62 6c 65 20 68  # source table h
14e0: 61 76 65 20 74 68 65 20 73 61 6d 65 20 4e 4f 54  ave the same NOT
14f0: 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
1500: 73 20 6f 72 20 69 66 20 74 68 65 20 0a 23 20 73  s or if the .# s
1510: 6f 75 72 63 65 20 74 61 62 6c 65 20 68 61 73 20  ource table has 
1520: 65 78 74 72 61 20 4e 4f 54 20 4e 55 4c 4c 20 63  extra NOT NULL c
1530: 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 23 0a 78 66  onstraints..#.xf
1540: 65 72 5f 63 68 65 63 6b 20 69 6e 73 65 72 74 34  er_check insert4
1550: 2d 33 2e 39 20 31 20 7b 31 20 39 7d 20 5c 0a 20  -3.9 1 {1 9} \. 
1560: 20 20 20 7b 61 20 69 6e 74 2c 20 62 20 69 6e 74     {a int, b int
1570: 7d 20 5c 0a 20 20 20 20 7b 78 20 69 6e 74 20 4e  } \.    {x int N
1580: 4f 54 20 4e 55 4c 4c 2c 20 79 20 69 6e 74 7d 0a  OT NULL, y int}.
1590: 78 66 65 72 5f 63 68 65 63 6b 20 69 6e 73 65 72  xfer_check inser
15a0: 74 34 2d 33 2e 31 30 20 31 20 7b 31 20 39 7d 20  t4-3.10 1 {1 9} 
15b0: 5c 0a 20 20 20 20 7b 61 20 69 6e 74 2c 20 62 20  \.    {a int, b 
15c0: 69 6e 74 7d 20 5c 0a 20 20 20 20 7b 78 20 69 6e  int} \.    {x in
15d0: 74 20 4e 4f 54 20 4e 55 4c 4c 2c 20 79 20 69 6e  t NOT NULL, y in
15e0: 74 20 4e 4f 54 20 4e 55 4c 4c 7d 0a 78 66 65 72  t NOT NULL}.xfer
15f0: 5f 63 68 65 63 6b 20 69 6e 73 65 72 74 34 2d 33  _check insert4-3
1600: 2e 31 31 20 31 20 7b 31 20 39 7d 20 5c 0a 20 20  .11 1 {1 9} \.  
1610: 20 20 7b 61 20 69 6e 74 20 4e 4f 54 20 4e 55 4c    {a int NOT NUL
1620: 4c 2c 20 62 20 69 6e 74 7d 20 5c 0a 20 20 20 20  L, b int} \.    
1630: 7b 78 20 69 6e 74 20 4e 4f 54 20 4e 55 4c 4c 2c  {x int NOT NULL,
1640: 20 79 20 69 6e 74 20 4e 4f 54 20 4e 55 4c 4c 7d   y int NOT NULL}
1650: 0a 78 66 65 72 5f 63 68 65 63 6b 20 69 6e 73 65  .xfer_check inse
1660: 72 74 34 2d 33 2e 31 32 20 31 20 7b 31 20 39 7d  rt4-3.12 1 {1 9}
1670: 20 5c 0a 20 20 20 20 7b 61 20 69 6e 74 2c 20 62   \.    {a int, b
1680: 20 69 6e 74 20 4e 4f 54 20 4e 55 4c 4c 7d 20 5c   int NOT NULL} \
1690: 0a 20 20 20 20 7b 78 20 69 6e 74 20 4e 4f 54 20  .    {x int NOT 
16a0: 4e 55 4c 4c 2c 20 79 20 69 6e 74 20 4e 4f 54 20  NULL, y int NOT 
16b0: 4e 55 4c 4c 7d 0a 0a 23 20 44 6f 20 6e 6f 74 20  NULL}..# Do not 
16c0: 72 75 6e 20 74 68 65 20 6f 70 74 69 6d 69 7a 61  run the optimiza
16d0: 74 69 6f 6e 20 69 66 20 61 6e 79 20 63 6f 72 72  tion if any corr
16e0: 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 0a  esponding table.
16f0: 23 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20 64  # columns have d
1700: 69 66 66 65 72 65 6e 74 20 61 66 66 69 6e 69 74  ifferent affinit
1710: 69 65 73 2e 0a 23 0a 78 66 65 72 5f 63 68 65 63  ies..#.xfer_chec
1720: 6b 20 69 6e 73 65 72 74 34 2d 33 2e 32 30 20 30  k insert4-3.20 0
1730: 20 7b 31 20 39 7d 20 5c 0a 20 20 20 20 7b 61 20   {1 9} \.    {a 
1740: 74 65 78 74 2c 20 62 20 69 6e 74 7d 20 5c 0a 20  text, b int} \. 
1750: 20 20 20 7b 78 20 69 6e 74 2c 20 62 20 69 6e 74     {x int, b int
1760: 7d 0a 78 66 65 72 5f 63 68 65 63 6b 20 69 6e 73  }.xfer_check ins
1770: 65 72 74 34 2d 33 2e 32 31 20 30 20 7b 31 20 39  ert4-3.21 0 {1 9
1780: 7d 20 5c 0a 20 20 20 20 7b 61 20 69 6e 74 2c 20  } \.    {a int, 
1790: 62 20 69 6e 74 7d 20 5c 0a 20 20 20 20 7b 78 20  b int} \.    {x 
17a0: 74 65 78 74 2c 20 62 20 69 6e 74 7d 0a 0a 23 20  text, b int}..# 
17b0: 22 69 6e 74 22 20 61 6e 64 20 22 69 6e 74 65 67  "int" and "integ
17c0: 65 72 22 20 61 72 65 20 65 71 75 69 76 61 6c 65  er" are equivale
17d0: 6e 74 20 73 6f 20 74 68 65 20 6f 70 74 69 6d 69  nt so the optimi
17e0: 7a 61 74 69 6f 6e 20 73 68 6f 75 6c 64 0a 23 20  zation should.# 
17f0: 72 75 6e 20 68 65 72 65 2e 0a 23 0a 78 66 65 72  run here..#.xfer
1800: 5f 63 68 65 63 6b 20 69 6e 73 65 72 74 34 2d 33  _check insert4-3
1810: 2e 32 32 20 31 20 7b 31 20 39 7d 20 5c 0a 20 20  .22 1 {1 9} \.  
1820: 20 20 7b 61 20 69 6e 74 2c 20 62 20 69 6e 74 7d    {a int, b int}
1830: 20 5c 0a 20 20 20 20 7b 78 20 69 6e 74 65 67 65   \.    {x intege
1840: 72 2c 20 62 20 69 6e 74 7d 0a 0a 23 20 54 69 63  r, b int}..# Tic
1850: 6b 65 74 20 23 32 32 39 31 2e 0a 23 0a 0a 64 6f  ket #2291..#..do
1860: 5f 74 65 73 74 20 69 6e 73 65 72 74 34 2d 34 2e  _test insert4-4.
1870: 31 61 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  1a {.  execsql {
1880: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 34 28  CREATE TABLE t4(
1890: 61 2c 20 62 2c 20 55 4e 49 51 55 45 28 61 2c 62  a, b, UNIQUE(a,b
18a0: 29 29 7d 0a 7d 20 7b 7d 0a 69 66 63 61 70 61 62  ))}.} {}.ifcapab
18b0: 6c 65 20 76 61 63 75 75 6d 20 7b 0a 20 20 64 6f  le vacuum {.  do
18c0: 5f 74 65 73 74 20 69 6e 73 65 72 74 34 2d 34 2e  _test insert4-4.
18d0: 31 62 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  1b {.    execsql
18e0: 20 7b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20   {.      INSERT 
18f0: 49 4e 54 4f 20 74 34 20 56 41 4c 55 45 53 28 4e  INTO t4 VALUES(N
1900: 55 4c 4c 2c 30 29 3b 0a 20 20 20 20 20 20 49 4e  ULL,0);.      IN
1910: 53 45 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c  SERT INTO t4 VAL
1920: 55 45 53 28 4e 55 4c 4c 2c 31 29 3b 0a 20 20 20  UES(NULL,1);.   
1930: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1940: 34 20 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 31 29  4 VALUES(NULL,1)
1950: 3b 0a 20 20 20 20 20 20 56 41 43 55 55 4d 3b 20  ;.      VACUUM; 
1960: 20 20 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a    .    }.  } {}.
1970: 7d 0a 0a 23 20 43 68 65 63 6b 20 73 6f 6d 65 20  }..# Check some 
1980: 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 73  error conditions
1990: 3a 0a 23 0a 64 6f 5f 74 65 73 74 20 69 6e 73 65  :.#.do_test inse
19a0: 72 74 34 2d 35 2e 31 20 7b 0a 20 20 23 20 54 61  rt4-5.1 {.  # Ta
19b0: 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ble does not exi
19c0: 73 74 2e 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  st..  catchsql {
19d0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
19e0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6e 6f  SELECT * FROM no
19f0: 73 75 63 68 74 61 62 6c 65 20 7d 0a 7d 20 7b 31  suchtable }.} {1
1a00: 20 7b 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a   {no such table:
1a10: 20 6e 6f 73 75 63 68 74 61 62 6c 65 7d 7d 0a 64   nosuchtable}}.d
1a20: 6f 5f 74 65 73 74 20 69 6e 73 65 72 74 34 2d 35  o_test insert4-5
1a30: 2e 32 20 7b 0a 20 20 23 20 4e 75 6d 62 65 72 20  .2 {.  # Number 
1a40: 6f 66 20 63 6f 6c 75 6d 6e 73 20 64 6f 65 73 20  of columns does 
1a50: 6e 6f 74 20 6d 61 74 63 68 2e 0a 20 20 63 61 74  not match..  cat
1a60: 63 68 73 71 6c 20 7b 20 0a 20 20 20 20 43 52 45  chsql { .    CRE
1a70: 41 54 45 20 54 41 42 4c 45 20 74 35 28 61 2c 20  ATE TABLE t5(a, 
1a80: 62 2c 20 63 29 3b 0a 20 20 20 20 49 4e 53 45 52  b, c);.    INSER
1a90: 54 20 49 4e 54 4f 20 74 34 20 53 45 4c 45 43 54  T INTO t4 SELECT
1aa0: 20 2a 20 46 52 4f 4d 20 74 35 3b 0a 20 20 7d 0a   * FROM t5;.  }.
1ab0: 7d 20 7b 31 20 7b 74 61 62 6c 65 20 74 34 20 68  } {1 {table t4 h
1ac0: 61 73 20 32 20 63 6f 6c 75 6d 6e 73 20 62 75 74  as 2 columns but
1ad0: 20 33 20 76 61 6c 75 65 73 20 77 65 72 65 20 73   3 values were s
1ae0: 75 70 70 6c 69 65 64 7d 7d 0a 0a 64 6f 5f 74 65  upplied}}..do_te
1af0: 73 74 20 69 6e 73 65 72 74 34 2d 36 2e 31 20 7b  st insert4-6.1 {
1b00: 0a 20 20 73 65 74 20 3a 3a 73 71 6c 69 74 65 34  .  set ::sqlite4
1b10: 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74 20 30  _xferopt_count 0
1b20: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
1b30: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 74 32   CREATE INDEX t2
1b40: 5f 69 32 20 4f 4e 20 74 32 28 78 2c 20 79 20 43  _i2 ON t2(x, y C
1b50: 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 29 3b 20  OLLATE nocase); 
1b60: 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  .    CREATE INDE
1b70: 58 20 74 32 5f 69 31 20 4f 4e 20 74 32 28 78 20  X t2_i1 ON t2(x 
1b80: 41 53 43 2c 20 79 20 44 45 53 43 29 3b 0a 20 20  ASC, y DESC);.  
1b90: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 74    CREATE INDEX t
1ba0: 33 5f 69 31 20 4f 4e 20 74 33 28 61 2c 20 62 29  3_i1 ON t3(a, b)
1bb0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
1bc0: 4f 20 74 32 20 53 45 4c 45 43 54 20 2a 20 46 52  O t2 SELECT * FR
1bd0: 4f 4d 20 74 33 3b 0a 20 20 7d 0a 20 20 73 65 74  OM t3;.  }.  set
1be0: 20 3a 3a 73 71 6c 69 74 65 34 5f 78 66 65 72 6f   ::sqlite4_xfero
1bf0: 70 74 5f 63 6f 75 6e 74 0a 7d 20 7b 30 7d 0a 64  pt_count.} {0}.d
1c00: 6f 5f 74 65 73 74 20 69 6e 73 65 72 74 34 2d 36  o_test insert4-6
1c10: 2e 32 20 7b 0a 20 20 73 65 74 20 3a 3a 73 71 6c  .2 {.  set ::sql
1c20: 69 74 65 34 5f 78 66 65 72 6f 70 74 5f 63 6f 75  ite4_xferopt_cou
1c30: 6e 74 20 30 0a 20 20 65 78 65 63 73 71 6c 20 7b  nt 0.  execsql {
1c40: 0a 20 20 20 20 44 52 4f 50 20 49 4e 44 45 58 20  .    DROP INDEX 
1c50: 74 32 5f 69 32 3b 0a 20 20 20 20 49 4e 53 45 52  t2_i2;.    INSER
1c60: 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54  T INTO t2 SELECT
1c70: 20 2a 20 46 52 4f 4d 20 74 33 3b 0a 20 20 7d 0a   * FROM t3;.  }.
1c80: 20 20 73 65 74 20 3a 3a 73 71 6c 69 74 65 34 5f    set ::sqlite4_
1c90: 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74 0a 7d 20  xferopt_count.} 
1ca0: 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 73 65  {0}.do_test inse
1cb0: 72 74 34 2d 36 2e 33 20 7b 0a 20 20 73 65 74 20  rt4-6.3 {.  set 
1cc0: 3a 3a 73 71 6c 69 74 65 34 5f 78 66 65 72 6f 70  ::sqlite4_xferop
1cd0: 74 5f 63 6f 75 6e 74 20 30 0a 20 20 65 78 65 63  t_count 0.  exec
1ce0: 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20 49  sql {.    DROP I
1cf0: 4e 44 45 58 20 74 32 5f 69 31 3b 0a 20 20 20 20  NDEX t2_i1;.    
1d00: 43 52 45 41 54 45 20 49 4e 44 45 58 20 74 32 5f  CREATE INDEX t2_
1d10: 69 31 20 4f 4e 20 74 32 28 78 20 41 53 43 2c 20  i1 ON t2(x ASC, 
1d20: 79 20 41 53 43 29 3b 0a 20 20 20 20 49 4e 53 45  y ASC);.    INSE
1d30: 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43  RT INTO t2 SELEC
1d40: 54 20 2a 20 46 52 4f 4d 20 74 33 3b 0a 20 20 7d  T * FROM t3;.  }
1d50: 0a 20 20 73 65 74 20 3a 3a 73 71 6c 69 74 65 34  .  set ::sqlite4
1d60: 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74 0a 7d  _xferopt_count.}
1d70: 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 73   {1}.do_test ins
1d80: 65 72 74 34 2d 36 2e 34 20 7b 0a 20 20 73 65 74  ert4-6.4 {.  set
1d90: 20 3a 3a 73 71 6c 69 74 65 34 5f 78 66 65 72 6f   ::sqlite4_xfero
1da0: 70 74 5f 63 6f 75 6e 74 20 30 0a 20 20 65 78 65  pt_count 0.  exe
1db0: 63 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20  csql {.    DROP 
1dc0: 49 4e 44 45 58 20 74 32 5f 69 31 3b 0a 20 20 20  INDEX t2_i1;.   
1dd0: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 74 32   CREATE INDEX t2
1de0: 5f 69 31 20 4f 4e 20 74 32 28 78 20 41 53 43 2c  _i1 ON t2(x ASC,
1df0: 20 79 20 43 4f 4c 4c 41 54 45 20 52 54 52 49 4d   y COLLATE RTRIM
1e00: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
1e10: 54 4f 20 74 32 20 53 45 4c 45 43 54 20 2a 20 46  TO t2 SELECT * F
1e20: 52 4f 4d 20 74 33 3b 0a 20 20 7d 0a 20 20 73 65  ROM t3;.  }.  se
1e30: 74 20 3a 3a 73 71 6c 69 74 65 34 5f 78 66 65 72  t ::sqlite4_xfer
1e40: 6f 70 74 5f 63 6f 75 6e 74 0a 7d 20 7b 30 7d 0a  opt_count.} {0}.
1e50: 0a 0a 64 6f 5f 74 65 73 74 20 69 6e 73 65 72 74  ..do_test insert
1e60: 34 2d 36 2e 35 20 7b 0a 20 20 65 78 65 63 73 71  4-6.5 {.  execsq
1e70: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
1e80: 41 42 4c 45 20 74 36 61 28 78 20 43 48 45 43 4b  ABLE t6a(x CHECK
1e90: 28 20 78 3c 3e 27 61 62 63 27 20 29 29 3b 0a 20  ( x<>'abc' ));. 
1ea0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1eb0: 36 61 20 56 41 4c 55 45 53 28 27 41 42 43 27 29  6a VALUES('ABC')
1ec0: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
1ed0: 52 4f 4d 20 74 36 61 3b 0a 20 20 7d 0a 7d 20 7b  ROM t6a;.  }.} {
1ee0: 41 42 43 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 73  ABC}.do_test ins
1ef0: 65 72 74 34 2d 36 2e 36 20 7b 0a 20 20 65 78 65  ert4-6.6 {.  exe
1f00: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
1f10: 45 20 54 41 42 4c 45 20 74 36 62 28 78 20 43 48  E TABLE t6b(x CH
1f20: 45 43 4b 28 20 78 3c 3e 27 61 62 63 27 20 43 4f  ECK( x<>'abc' CO
1f30: 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 29 29 3b  LLATE nocase ));
1f40: 0a 20 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20  .  }.  catchsql 
1f50: 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  {.    INSERT INT
1f60: 4f 20 74 36 62 20 53 45 4c 45 43 54 20 2a 20 46  O t6b SELECT * F
1f70: 52 4f 4d 20 74 36 61 3b 0a 20 20 7d 0a 7d 20 7b  ROM t6a;.  }.} {
1f80: 31 20 7b 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  1 {constraint fa
1f90: 69 6c 65 64 7d 7d 0a 64 6f 5f 74 65 73 74 20 69  iled}}.do_test i
1fa0: 6e 73 65 72 74 34 2d 36 2e 37 20 7b 0a 20 20 65  nsert4-6.7 {.  e
1fb0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f  xecsql {.    DRO
1fc0: 50 20 54 41 42 4c 45 20 74 36 62 3b 0a 20 20 20  P TABLE t6b;.   
1fd0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 36   CREATE TABLE t6
1fe0: 62 28 78 20 43 48 45 43 4b 28 20 78 20 43 4f 4c  b(x CHECK( x COL
1ff0: 4c 41 54 45 20 6e 6f 63 61 73 65 20 3c 3e 27 61  LATE nocase <>'a
2000: 62 63 27 20 29 29 3b 0a 20 20 7d 0a 20 20 63 61  bc' ));.  }.  ca
2010: 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53  tchsql {.    INS
2020: 45 52 54 20 49 4e 54 4f 20 74 36 62 20 53 45 4c  ERT INTO t6b SEL
2030: 45 43 54 20 2a 20 46 52 4f 4d 20 74 36 61 3b 0a  ECT * FROM t6a;.
2040: 20 20 7d 0a 7d 20 7b 31 20 7b 63 6f 6e 73 74 72    }.} {1 {constr
2050: 61 69 6e 74 20 66 61 69 6c 65 64 7d 7d 0a 0a 23  aint failed}}..#
2060: 20 54 69 63 6b 65 74 20 5b 36 32 38 34 64 66 38   Ticket [6284df8
2070: 39 64 65 62 64 66 61 36 31 64 62 38 30 37 33 65  9debdfa61db8073e
2080: 30 36 32 39 30 38 61 66 30 63 39 62 36 31 31 38  062908af0c9b6118
2090: 65 5d 0a 23 20 44 69 73 61 62 6c 65 20 74 68 65  e].# Disable the
20a0: 20 78 66 65 72 20 6f 70 74 69 6d 69 7a 61 74 69   xfer optimizati
20b0: 6f 6e 20 69 66 20 74 68 65 20 64 65 73 74 69 6e  on if the destin
20c0: 61 74 69 6f 6e 20 74 61 62 6c 65 20 63 6f 6e 74  ation table cont
20d0: 61 69 6e 73 0a 23 20 61 20 66 6f 72 65 69 67 6e  ains.# a foreign
20e0: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a   key constraint.
20f0: 23 0a 69 66 63 61 70 61 62 6c 65 20 66 6f 72 65  #.ifcapable fore
2100: 69 67 6e 6b 65 79 20 7b 0a 20 20 64 6f 5f 74 65  ignkey {.  do_te
2110: 73 74 20 69 6e 73 65 72 74 34 2d 37 2e 31 20 7b  st insert4-7.1 {
2120: 0a 20 20 20 20 73 65 74 20 3a 3a 73 71 6c 69 74  .    set ::sqlit
2130: 65 34 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74  e4_xferopt_count
2140: 20 30 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   0.    execsql {
2150: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
2160: 42 4c 45 20 74 37 61 28 78 20 49 4e 54 45 47 45  BLE t7a(x INTEGE
2170: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 20  R PRIMARY KEY); 
2180: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 37 61 20  INSERT INTO t7a 
2190: 56 41 4c 55 45 53 28 31 32 33 29 3b 0a 20 20 20  VALUES(123);.   
21a0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
21b0: 74 37 62 28 79 20 49 4e 54 45 47 45 52 20 52 45  t7b(y INTEGER RE
21c0: 46 45 52 45 4e 43 45 53 20 74 37 61 29 3b 0a 20  FERENCES t7a);. 
21d0: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
21e0: 45 20 74 37 63 28 7a 20 49 4e 54 29 3b 20 20 49  E t7c(z INT);  I
21f0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 37 63 20 56  NSERT INTO t7c V
2200: 41 4c 55 45 53 28 32 33 34 29 3b 0a 20 20 20 20  ALUES(234);.    
2210: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 37    INSERT INTO t7
2220: 62 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  b SELECT * FROM 
2230: 74 37 63 3b 0a 20 20 20 20 20 20 53 45 4c 45 43  t7c;.      SELEC
2240: 54 20 2a 20 46 52 4f 4d 20 74 37 62 3b 0a 20 20  T * FROM t7b;.  
2250: 20 20 7d 0a 20 20 7d 20 7b 32 33 34 7d 0a 20 20    }.  } {234}.  
2260: 64 6f 5f 74 65 73 74 20 69 6e 73 65 72 74 34 2d  do_test insert4-
2270: 37 2e 32 20 7b 0a 20 20 20 20 73 65 74 20 3a 3a  7.2 {.    set ::
2280: 73 71 6c 69 74 65 34 5f 78 66 65 72 6f 70 74 5f  sqlite4_xferopt_
2290: 63 6f 75 6e 74 0a 20 20 7d 20 7b 31 7d 0a 20 20  count.  } {1}.  
22a0: 64 6f 5f 74 65 73 74 20 69 6e 73 65 72 74 34 2d  do_test insert4-
22b0: 37 2e 33 20 7b 0a 20 20 20 20 73 65 74 20 3a 3a  7.3 {.    set ::
22c0: 73 71 6c 69 74 65 34 5f 78 66 65 72 6f 70 74 5f  sqlite4_xferopt_
22d0: 63 6f 75 6e 74 20 30 0a 20 20 20 20 65 78 65 63  count 0.    exec
22e0: 73 71 6c 20 7b 0a 20 20 20 20 20 20 44 45 4c 45  sql {.      DELE
22f0: 54 45 20 46 52 4f 4d 20 74 37 62 3b 0a 20 20 20  TE FROM t7b;.   
2300: 20 20 20 50 52 41 47 4d 41 20 66 6f 72 65 69 67     PRAGMA foreig
2310: 6e 5f 6b 65 79 73 3d 4f 4e 3b 0a 20 20 20 20 7d  n_keys=ON;.    }
2320: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 0a  .    catchsql {.
2330: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
2340: 4f 20 74 37 62 20 53 45 4c 45 43 54 20 2a 20 46  O t7b SELECT * F
2350: 52 4f 4d 20 74 37 63 3b 0a 20 20 20 20 7d 0a 20  ROM t7c;.    }. 
2360: 20 7d 20 7b 31 20 7b 66 6f 72 65 69 67 6e 20 6b   } {1 {foreign k
2370: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  ey constraint fa
2380: 69 6c 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74  iled}}.  do_test
2390: 20 69 6e 73 65 72 74 34 2d 37 2e 34 20 7b 0a 20   insert4-7.4 {. 
23a0: 20 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45     execsql {SELE
23b0: 43 54 20 2a 20 46 52 4f 4d 20 74 37 62 7d 0a 20  CT * FROM t7b}. 
23c0: 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20   } {}.  do_test 
23d0: 69 6e 73 65 72 74 34 2d 37 2e 35 20 7b 0a 20 20  insert4-7.5 {.  
23e0: 20 20 73 65 74 20 3a 3a 73 71 6c 69 74 65 34 5f    set ::sqlite4_
23f0: 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74 0a 20 20  xferopt_count.  
2400: 7d 20 7b 30 7d 0a 20 20 64 6f 5f 74 65 73 74 20  } {0}.  do_test 
2410: 69 6e 73 65 72 74 34 2d 37 2e 36 20 7b 0a 20 20  insert4-7.6 {.  
2420: 20 20 73 65 74 20 3a 3a 73 71 6c 69 74 65 34 5f    set ::sqlite4_
2430: 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74 20 30 0a  xferopt_count 0.
2440: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
2450: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
2460: 74 37 62 3b 20 44 45 4c 45 54 45 20 46 52 4f 4d  t7b; DELETE FROM
2470: 20 74 37 63 3b 0a 20 20 20 20 20 20 49 4e 53 45   t7c;.      INSE
2480: 52 54 20 49 4e 54 4f 20 74 37 63 20 56 41 4c 55  RT INTO t7c VALU
2490: 45 53 28 31 32 33 29 3b 0a 20 20 20 20 20 20 49  ES(123);.      I
24a0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 37 62 20 53  NSERT INTO t7b S
24b0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 37 63  ELECT * FROM t7c
24c0: 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  ;.      SELECT *
24d0: 20 46 52 4f 4d 20 74 37 62 3b 0a 20 20 20 20 7d   FROM t7b;.    }
24e0: 0a 20 20 7d 20 7b 31 32 33 7d 0a 20 20 64 6f 5f  .  } {123}.  do_
24f0: 74 65 73 74 20 69 6e 73 65 72 74 34 2d 37 2e 37  test insert4-7.7
2500: 20 7b 0a 20 20 20 20 73 65 74 20 3a 3a 73 71 6c   {.    set ::sql
2510: 69 74 65 34 5f 78 66 65 72 6f 70 74 5f 63 6f 75  ite4_xferopt_cou
2520: 6e 74 0a 20 20 7d 20 7b 30 7d 0a 20 20 64 6f 5f  nt.  } {0}.  do_
2530: 74 65 73 74 20 69 6e 73 65 72 74 34 2d 37 2e 37  test insert4-7.7
2540: 20 7b 0a 20 20 20 20 73 65 74 20 3a 3a 73 71 6c   {.    set ::sql
2550: 69 74 65 34 5f 78 66 65 72 6f 70 74 5f 63 6f 75  ite4_xferopt_cou
2560: 6e 74 20 30 0a 20 20 20 20 65 78 65 63 73 71 6c  nt 0.    execsql
2570: 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20   {.      PRAGMA 
2580: 66 6f 72 65 69 67 6e 5f 6b 65 79 73 3d 4f 46 46  foreign_keys=OFF
2590: 3b 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46  ;.      DELETE F
25a0: 52 4f 4d 20 74 37 62 3b 0a 20 20 20 20 20 20 49  ROM t7b;.      I
25b0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 37 62 20 53  NSERT INTO t7b S
25c0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 37 63  ELECT * FROM t7c
25d0: 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  ;.      SELECT *
25e0: 20 46 52 4f 4d 20 74 37 62 3b 0a 20 20 20 20 7d   FROM t7b;.    }
25f0: 0a 20 20 7d 20 7b 31 32 33 7d 0a 20 20 64 6f 5f  .  } {123}.  do_
2600: 74 65 73 74 20 69 6e 73 65 72 74 34 2d 37 2e 38  test insert4-7.8
2610: 20 7b 0a 20 20 20 20 73 65 74 20 3a 3a 73 71 6c   {.    set ::sql
2620: 69 74 65 34 5f 78 66 65 72 6f 70 74 5f 63 6f 75  ite4_xferopt_cou
2630: 6e 74 0a 20 20 7d 20 7b 31 7d 0a 7d 0a 0a 23 20  nt.  } {1}.}..# 
2640: 54 69 63 6b 65 74 20 5b 36 37 36 62 63 30 32 62  Ticket [676bc02b
2650: 38 37 31 37 36 31 32 35 36 33 35 63 62 31 37 34  87176125635cb174
2660: 64 31 31 30 62 34 33 31 35 38 31 39 31 32 62 62  d110b431581912bb
2670: 5d 0a 23 20 4d 61 6b 65 20 73 75 72 65 20 49 4e  ].# Make sure IN
2680: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
2690: 59 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 2e 2e  Y ON CONFLICT ..
26a0: 2e 20 77 6f 72 6b 73 20 77 69 74 68 20 74 68 65  . works with the
26b0: 20 78 66 65 72 0a 23 20 6f 70 74 69 6d 69 7a 61   xfer.# optimiza
26c0: 74 69 6f 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  tion..#.do_test 
26d0: 69 6e 73 65 72 74 34 2d 38 2e 31 20 7b 0a 20 20  insert4-8.1 {.  
26e0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 52  execsql {.    DR
26f0: 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 53  OP TABLE IF EXIS
2700: 54 53 20 74 31 3b 0a 20 20 20 20 44 52 4f 50 20  TS t1;.    DROP 
2710: 54 41 42 4c 45 20 49 46 20 45 58 49 53 54 53 20  TABLE IF EXISTS 
2720: 74 32 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  t2;.    CREATE T
2730: 41 42 4c 45 20 74 31 28 61 20 49 4e 54 45 47 45  ABLE t1(a INTEGE
2740: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 4f 4e  R PRIMARY KEY ON
2750: 20 43 4f 4e 46 4c 49 43 54 20 52 45 50 4c 41 43   CONFLICT REPLAC
2760: 45 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54  E, b);.    CREAT
2770: 45 20 54 41 42 4c 45 20 74 32 28 78 20 49 4e 54  E TABLE t2(x INT
2780: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
2790: 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 52 45 50   ON CONFLICT REP
27a0: 4c 41 43 45 2c 20 79 29 3b 0a 20 20 20 20 49 4e  LACE, y);.    IN
27b0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
27c0: 55 45 53 28 31 2c 32 29 3b 0a 20 20 20 20 49 4e  UES(1,2);.    IN
27d0: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
27e0: 55 45 53 28 31 2c 33 29 3b 0a 20 20 20 20 49 4e  UES(1,3);.    IN
27f0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
2800: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20  ECT * FROM t2;. 
2810: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
2820: 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 33 7d   t1;.  }.} {1 3}
2830: 0a 64 6f 5f 74 65 73 74 20 69 6e 73 65 72 74 34  .do_test insert4
2840: 2d 38 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  -8.2 {.  execsql
2850: 20 7b 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c   {.    DROP TABL
2860: 45 20 49 46 20 45 58 49 53 54 53 20 74 31 3b 0a  E IF EXISTS t1;.
2870: 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 49      DROP TABLE I
2880: 46 20 45 58 49 53 54 53 20 74 32 3b 0a 20 20 20  F EXISTS t2;.   
2890: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
28a0: 28 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  (a INTEGER PRIMA
28b0: 52 59 20 4b 45 59 20 4f 4e 20 43 4f 4e 46 4c 49  RY KEY ON CONFLI
28c0: 43 54 20 52 45 50 4c 41 43 45 2c 20 62 29 3b 0a  CT REPLACE, b);.
28d0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
28e0: 20 74 32 28 78 2c 20 79 29 3b 0a 20 20 20 20 49   t2(x, y);.    I
28f0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
2900: 4c 55 45 53 28 31 2c 32 29 3b 0a 20 20 20 20 49  LUES(1,2);.    I
2910: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
2920: 4c 55 45 53 28 31 2c 33 29 3b 0a 20 20 20 20 49  LUES(1,3);.    I
2930: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
2940: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a  LECT * FROM t2;.
2950: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
2960: 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 33  M t1;.  }.} {1 3
2970: 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 73 65 72 74  }.do_test insert
2980: 34 2d 38 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  4-8.3 {.  execsq
2990: 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20 54 41 42  l {.    DROP TAB
29a0: 4c 45 20 49 46 20 45 58 49 53 54 53 20 74 31 3b  LE IF EXISTS t1;
29b0: 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20  .    DROP TABLE 
29c0: 49 46 20 45 58 49 53 54 53 20 74 32 3b 0a 20 20  IF EXISTS t2;.  
29d0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
29e0: 31 28 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d  1(a INTEGER PRIM
29f0: 41 52 59 20 4b 45 59 20 4f 4e 20 43 4f 4e 46 4c  ARY KEY ON CONFL
2a00: 49 43 54 20 49 47 4e 4f 52 45 2c 20 62 29 3b 0a  ICT IGNORE, b);.
2a10: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
2a20: 20 74 32 28 78 20 49 4e 54 45 47 45 52 20 50 52   t2(x INTEGER PR
2a30: 49 4d 41 52 59 20 4b 45 59 20 4f 4e 20 43 4f 4e  IMARY KEY ON CON
2a40: 46 4c 49 43 54 20 49 47 4e 4f 52 45 2c 20 79 29  FLICT IGNORE, y)
2a50: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
2a60: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 32 29  O t1 VALUES(1,2)
2a70: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
2a80: 4f 20 74 32 20 56 41 4c 55 45 53 28 31 2c 33 29  O t2 VALUES(1,3)
2a90: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
2aa0: 4f 20 74 31 20 53 45 4c 45 43 54 20 2a 20 46 52  O t1 SELECT * FR
2ab0: 4f 4d 20 74 32 3b 0a 20 20 20 20 53 45 4c 45 43  OM t2;.    SELEC
2ac0: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d  T * FROM t1;.  }
2ad0: 0a 7d 20 7b 31 20 32 7d 0a 64 6f 5f 74 65 73 74  .} {1 2}.do_test
2ae0: 20 69 6e 73 65 72 74 34 2d 38 2e 34 20 7b 0a 20   insert4-8.4 {. 
2af0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44   execsql {.    D
2b00: 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49  ROP TABLE IF EXI
2b10: 53 54 53 20 74 31 3b 0a 20 20 20 20 44 52 4f 50  STS t1;.    DROP
2b20: 20 54 41 42 4c 45 20 49 46 20 45 58 49 53 54 53   TABLE IF EXISTS
2b30: 20 74 32 3b 0a 20 20 20 20 43 52 45 41 54 45 20   t2;.    CREATE 
2b40: 54 41 42 4c 45 20 74 31 28 61 20 49 4e 54 45 47  TABLE t1(a INTEG
2b50: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 4f  ER PRIMARY KEY O
2b60: 4e 20 43 4f 4e 46 4c 49 43 54 20 49 47 4e 4f 52  N CONFLICT IGNOR
2b70: 45 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54  E, b);.    CREAT
2b80: 45 20 54 41 42 4c 45 20 74 32 28 78 2c 20 79 29  E TABLE t2(x, y)
2b90: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
2ba0: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 32 29  O t1 VALUES(1,2)
2bb0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
2bc0: 4f 20 74 32 20 56 41 4c 55 45 53 28 31 2c 33 29  O t2 VALUES(1,3)
2bd0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
2be0: 4f 20 74 31 20 53 45 4c 45 43 54 20 2a 20 46 52  O t1 SELECT * FR
2bf0: 4f 4d 20 74 32 3b 0a 20 20 20 20 53 45 4c 45 43  OM t2;.    SELEC
2c00: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d  T * FROM t1;.  }
2c10: 0a 7d 20 7b 31 20 32 7d 0a 64 6f 5f 74 65 73 74  .} {1 2}.do_test
2c20: 20 69 6e 73 65 72 74 34 2d 38 2e 35 20 7b 0a 20   insert4-8.5 {. 
2c30: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44   execsql {.    D
2c40: 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49  ROP TABLE IF EXI
2c50: 53 54 53 20 74 31 3b 0a 20 20 20 20 44 52 4f 50  STS t1;.    DROP
2c60: 20 54 41 42 4c 45 20 49 46 20 45 58 49 53 54 53   TABLE IF EXISTS
2c70: 20 74 32 3b 0a 20 20 20 20 43 52 45 41 54 45 20   t2;.    CREATE 
2c80: 54 41 42 4c 45 20 74 31 28 61 20 49 4e 54 45 47  TABLE t1(a INTEG
2c90: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 4f  ER PRIMARY KEY O
2ca0: 4e 20 43 4f 4e 46 4c 49 43 54 20 46 41 49 4c 2c  N CONFLICT FAIL,
2cb0: 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   b);.    CREATE 
2cc0: 54 41 42 4c 45 20 74 32 28 78 20 49 4e 54 45 47  TABLE t2(x INTEG
2cd0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 4f  ER PRIMARY KEY O
2ce0: 4e 20 43 4f 4e 46 4c 49 43 54 20 46 41 49 4c 2c  N CONFLICT FAIL,
2cf0: 20 79 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   y);.    INSERT 
2d00: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
2d10: 2c 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  ,2);.    INSERT 
2d20: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 2d  INTO t2 VALUES(-
2d30: 39 39 2c 31 30 30 29 3b 0a 20 20 20 20 49 4e 53  99,100);.    INS
2d40: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
2d50: 45 53 28 31 2c 33 29 3b 0a 20 20 20 20 53 45 4c  ES(1,3);.    SEL
2d60: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20  ECT * FROM t1;. 
2d70: 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a   }.  catchsql {.
2d80: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2d90: 74 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  t1 SELECT * FROM
2da0: 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 50   t2;.  }.} {1 {P
2db0: 52 49 4d 41 52 59 20 4b 45 59 20 6d 75 73 74 20  RIMARY KEY must 
2dc0: 62 65 20 75 6e 69 71 75 65 7d 7d 0a 64 6f 5f 74  be unique}}.do_t
2dd0: 65 73 74 20 69 6e 73 65 72 74 34 2d 38 2e 36 20  est insert4-8.6 
2de0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
2df0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
2e00: 74 31 3b 0a 20 20 7d 0a 7d 20 7b 2d 39 39 20 31  t1;.  }.} {-99 1
2e10: 30 30 20 31 20 32 7d 20 0a 64 6f 5f 74 65 73 74  00 1 2} .do_test
2e20: 20 69 6e 73 65 72 74 34 2d 38 2e 37 20 7b 0a 20   insert4-8.7 {. 
2e30: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44   execsql {.    D
2e40: 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49  ROP TABLE IF EXI
2e50: 53 54 53 20 74 31 3b 0a 20 20 20 20 44 52 4f 50  STS t1;.    DROP
2e60: 20 54 41 42 4c 45 20 49 46 20 45 58 49 53 54 53   TABLE IF EXISTS
2e70: 20 74 32 3b 0a 20 20 20 20 43 52 45 41 54 45 20   t2;.    CREATE 
2e80: 54 41 42 4c 45 20 74 31 28 61 20 49 4e 54 45 47  TABLE t1(a INTEG
2e90: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 4f  ER PRIMARY KEY O
2ea0: 4e 20 43 4f 4e 46 4c 49 43 54 20 41 42 4f 52 54  N CONFLICT ABORT
2eb0: 2c 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , b);.    CREATE
2ec0: 20 54 41 42 4c 45 20 74 32 28 78 20 49 4e 54 45   TABLE t2(x INTE
2ed0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
2ee0: 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 41 42 4f 52  ON CONFLICT ABOR
2ef0: 54 2c 20 79 29 3b 0a 20 20 20 20 49 4e 53 45 52  T, y);.    INSER
2f00: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
2f10: 28 31 2c 32 29 3b 0a 20 20 20 20 49 4e 53 45 52  (1,2);.    INSER
2f20: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
2f30: 28 2d 39 39 2c 31 30 30 29 3b 0a 20 20 20 20 49  (-99,100);.    I
2f40: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
2f50: 4c 55 45 53 28 31 2c 33 29 3b 0a 20 20 20 20 53  LUES(1,3);.    S
2f60: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
2f70: 0a 20 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20  .  }.  catchsql 
2f80: 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  {.    INSERT INT
2f90: 4f 20 74 31 20 53 45 4c 45 43 54 20 2a 20 46 52  O t1 SELECT * FR
2fa0: 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 31 20  OM t2;.  }.} {1 
2fb0: 7b 50 52 49 4d 41 52 59 20 4b 45 59 20 6d 75 73  {PRIMARY KEY mus
2fc0: 74 20 62 65 20 75 6e 69 71 75 65 7d 7d 0a 64 6f  t be unique}}.do
2fd0: 5f 74 65 73 74 20 69 6e 73 65 72 74 34 2d 38 2e  _test insert4-8.
2fe0: 38 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  8 {.  execsql {.
2ff0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
3000: 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32  M t1;.  }.} {1 2
3010: 7d 20 0a 64 6f 5f 74 65 73 74 20 69 6e 73 65 72  } .do_test inser
3020: 74 34 2d 38 2e 39 20 7b 0a 20 20 65 78 65 63 73  t4-8.9 {.  execs
3030: 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20 54 41  ql {.    DROP TA
3040: 42 4c 45 20 49 46 20 45 58 49 53 54 53 20 74 31  BLE IF EXISTS t1
3050: 3b 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45  ;.    DROP TABLE
3060: 20 49 46 20 45 58 49 53 54 53 20 74 32 3b 0a 20   IF EXISTS t2;. 
3070: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
3080: 74 31 28 61 20 49 4e 54 45 47 45 52 20 50 52 49  t1(a INTEGER PRI
3090: 4d 41 52 59 20 4b 45 59 20 4f 4e 20 43 4f 4e 46  MARY KEY ON CONF
30a0: 4c 49 43 54 20 52 4f 4c 4c 42 41 43 4b 2c 20 62  LICT ROLLBACK, b
30b0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
30c0: 42 4c 45 20 74 32 28 78 20 49 4e 54 45 47 45 52  BLE t2(x INTEGER
30d0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 4f 4e 20   PRIMARY KEY ON 
30e0: 43 4f 4e 46 4c 49 43 54 20 52 4f 4c 4c 42 41 43  CONFLICT ROLLBAC
30f0: 4b 2c 20 79 29 3b 0a 20 20 20 20 49 4e 53 45 52  K, y);.    INSER
3100: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
3110: 28 31 2c 32 29 3b 0a 20 20 20 20 49 4e 53 45 52  (1,2);.    INSER
3120: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
3130: 28 2d 39 39 2c 31 30 30 29 3b 0a 20 20 20 20 49  (-99,100);.    I
3140: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
3150: 4c 55 45 53 28 31 2c 33 29 3b 0a 20 20 20 20 53  LUES(1,3);.    S
3160: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
3170: 0a 20 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20  .  }.  catchsql 
3180: 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  {.    BEGIN;.   
3190: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
31a0: 56 41 4c 55 45 53 28 32 2c 33 29 3b 0a 20 20 20  VALUES(2,3);.   
31b0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
31c0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
31d0: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 50 52 49 4d  ;.  }.} {1 {PRIM
31e0: 41 52 59 20 4b 45 59 20 6d 75 73 74 20 62 65 20  ARY KEY must be 
31f0: 75 6e 69 71 75 65 7d 7d 0a 64 6f 5f 74 65 73 74  unique}}.do_test
3200: 20 69 6e 73 65 72 74 34 2d 38 2e 31 30 20 7b 0a   insert4-8.10 {.
3210: 20 20 63 61 74 63 68 73 71 6c 20 7b 43 4f 4d 4d    catchsql {COMM
3220: 49 54 7d 0a 7d 20 7b 31 20 7b 63 61 6e 6e 6f 74  IT}.} {1 {cannot
3230: 20 63 6f 6d 6d 69 74 20 2d 20 6e 6f 20 74 72 61   commit - no tra
3240: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
3250: 76 65 7d 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 73  ve}}.do_test ins
3260: 65 72 74 34 2d 38 2e 31 31 20 7b 0a 20 20 65 78  ert4-8.11 {.  ex
3270: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  ecsql {.    SELE
3280: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT * FROM t1;.  
3290: 7d 0a 7d 20 7b 31 20 32 7d 20 0a 0a 64 6f 5f 74  }.} {1 2} ..do_t
32a0: 65 73 74 20 69 6e 73 65 72 74 34 2d 38 2e 32 31  est insert4-8.21
32b0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
32c0: 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 49 46     DROP TABLE IF
32d0: 20 45 58 49 53 54 53 20 74 31 3b 0a 20 20 20 20   EXISTS t1;.    
32e0: 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58  DROP TABLE IF EX
32f0: 49 53 54 53 20 74 32 3b 0a 20 20 20 20 43 52 45  ISTS t2;.    CRE
3300: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 49  ATE TABLE t1(a I
3310: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
3320: 45 59 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 52  EY ON CONFLICT R
3330: 45 50 4c 41 43 45 2c 20 62 29 3b 0a 20 20 20 20  EPLACE, b);.    
3340: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
3350: 78 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  x INTEGER PRIMAR
3360: 59 20 4b 45 59 20 4f 4e 20 43 4f 4e 46 4c 49 43  Y KEY ON CONFLIC
3370: 54 20 52 45 50 4c 41 43 45 2c 20 79 29 3b 0a 20  T REPLACE, y);. 
3380: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
3390: 32 20 56 41 4c 55 45 53 28 31 2c 33 29 3b 0a 20  2 VALUES(1,3);. 
33a0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
33b0: 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  1 SELECT * FROM 
33c0: 74 32 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  t2;.    SELECT *
33d0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20   FROM t1;.  }.} 
33e0: 7b 31 20 33 7d 0a 64 6f 5f 74 65 73 74 20 69 6e  {1 3}.do_test in
33f0: 73 65 72 74 34 2d 38 2e 32 32 20 7b 0a 20 20 65  sert4-8.22 {.  e
3400: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f  xecsql {.    DRO
3410: 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 53 54  P TABLE IF EXIST
3420: 53 20 74 31 3b 0a 20 20 20 20 44 52 4f 50 20 54  S t1;.    DROP T
3430: 41 42 4c 45 20 49 46 20 45 58 49 53 54 53 20 74  ABLE IF EXISTS t
3440: 32 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  2;.    CREATE TA
3450: 42 4c 45 20 74 31 28 61 20 49 4e 54 45 47 45 52  BLE t1(a INTEGER
3460: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 4f 4e 20   PRIMARY KEY ON 
3470: 43 4f 4e 46 4c 49 43 54 20 49 47 4e 4f 52 45 2c  CONFLICT IGNORE,
3480: 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   b);.    CREATE 
3490: 54 41 42 4c 45 20 74 32 28 78 20 49 4e 54 45 47  TABLE t2(x INTEG
34a0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 4f  ER PRIMARY KEY O
34b0: 4e 20 43 4f 4e 46 4c 49 43 54 20 49 47 4e 4f 52  N CONFLICT IGNOR
34c0: 45 2c 20 79 29 3b 0a 20 20 20 20 49 4e 53 45 52  E, y);.    INSER
34d0: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
34e0: 28 31 2c 33 29 3b 0a 20 20 20 20 49 4e 53 45 52  (1,3);.    INSER
34f0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
3500: 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20   * FROM t2;.    
3510: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
3520: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 33 7d 0a 64 6f  ;.  }.} {1 3}.do
3530: 5f 74 65 73 74 20 69 6e 73 65 72 74 34 2d 38 2e  _test insert4-8.
3540: 32 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  23 {.  execsql {
3550: 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20  .    DROP TABLE 
3560: 49 46 20 45 58 49 53 54 53 20 74 31 3b 0a 20 20  IF EXISTS t1;.  
3570: 20 20 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20    DROP TABLE IF 
3580: 45 58 49 53 54 53 20 74 32 3b 0a 20 20 20 20 43  EXISTS t2;.    C
3590: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
35a0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
35b0: 20 4b 45 59 20 4f 4e 20 43 4f 4e 46 4c 49 43 54   KEY ON CONFLICT
35c0: 20 41 42 4f 52 54 2c 20 62 29 3b 0a 20 20 20 20   ABORT, b);.    
35d0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
35e0: 78 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  x INTEGER PRIMAR
35f0: 59 20 4b 45 59 20 4f 4e 20 43 4f 4e 46 4c 49 43  Y KEY ON CONFLIC
3600: 54 20 41 42 4f 52 54 2c 20 79 29 3b 0a 20 20 20  T ABORT, y);.   
3610: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
3620: 56 41 4c 55 45 53 28 31 2c 33 29 3b 0a 20 20 20  VALUES(1,3);.   
3630: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
3640: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
3650: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
3660: 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31  ROM t1;.  }.} {1
3670: 20 33 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 73 65   3}.do_test inse
3680: 72 74 34 2d 38 2e 32 34 20 7b 0a 20 20 65 78 65  rt4-8.24 {.  exe
3690: 63 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20  csql {.    DROP 
36a0: 54 41 42 4c 45 20 49 46 20 45 58 49 53 54 53 20  TABLE IF EXISTS 
36b0: 74 31 3b 0a 20 20 20 20 44 52 4f 50 20 54 41 42  t1;.    DROP TAB
36c0: 4c 45 20 49 46 20 45 58 49 53 54 53 20 74 32 3b  LE IF EXISTS t2;
36d0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
36e0: 45 20 74 31 28 61 20 49 4e 54 45 47 45 52 20 50  E t1(a INTEGER P
36f0: 52 49 4d 41 52 59 20 4b 45 59 20 4f 4e 20 43 4f  RIMARY KEY ON CO
3700: 4e 46 4c 49 43 54 20 46 41 49 4c 2c 20 62 29 3b  NFLICT FAIL, b);
3710: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
3720: 45 20 74 32 28 78 20 49 4e 54 45 47 45 52 20 50  E t2(x INTEGER P
3730: 52 49 4d 41 52 59 20 4b 45 59 20 4f 4e 20 43 4f  RIMARY KEY ON CO
3740: 4e 46 4c 49 43 54 20 46 41 49 4c 2c 20 79 29 3b  NFLICT FAIL, y);
3750: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
3760: 20 74 32 20 56 41 4c 55 45 53 28 31 2c 33 29 3b   t2 VALUES(1,3);
3770: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
3780: 20 74 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   t1 SELECT * FRO
3790: 4d 20 74 32 3b 0a 20 20 20 20 53 45 4c 45 43 54  M t2;.    SELECT
37a0: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a   * FROM t1;.  }.
37b0: 7d 20 7b 31 20 33 7d 0a 64 6f 5f 74 65 73 74 20  } {1 3}.do_test 
37c0: 69 6e 73 65 72 74 34 2d 38 2e 32 35 20 7b 0a 20  insert4-8.25 {. 
37d0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44   execsql {.    D
37e0: 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49  ROP TABLE IF EXI
37f0: 53 54 53 20 74 31 3b 0a 20 20 20 20 44 52 4f 50  STS t1;.    DROP
3800: 20 54 41 42 4c 45 20 49 46 20 45 58 49 53 54 53   TABLE IF EXISTS
3810: 20 74 32 3b 0a 20 20 20 20 43 52 45 41 54 45 20   t2;.    CREATE 
3820: 54 41 42 4c 45 20 74 31 28 61 20 49 4e 54 45 47  TABLE t1(a INTEG
3830: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 4f  ER PRIMARY KEY O
3840: 4e 20 43 4f 4e 46 4c 49 43 54 20 52 4f 4c 4c 42  N CONFLICT ROLLB
3850: 41 43 4b 2c 20 62 29 3b 0a 20 20 20 20 43 52 45  ACK, b);.    CRE
3860: 41 54 45 20 54 41 42 4c 45 20 74 32 28 78 20 49  ATE TABLE t2(x I
3870: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
3880: 45 59 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 52  EY ON CONFLICT R
3890: 4f 4c 4c 42 41 43 4b 2c 20 79 29 3b 0a 20 20 20  OLLBACK, y);.   
38a0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
38b0: 56 41 4c 55 45 53 28 31 2c 33 29 3b 0a 20 20 20  VALUES(1,3);.   
38c0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
38d0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
38e0: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
38f0: 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31  ROM t1;.  }.} {1
3900: 20 33 7d 0a 0a 0a 66 69 6e 69 73 68 5f 74 65 73   3}...finish_tes
3910: 74 0a                                            t.