/ Hex Artifact Content
Login

Artifact b00ddf82d6d4f0a6f3999f42bb6a3c813ea70707:


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 33 5f 78 66 65 72 6f 70  e sqlite3_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 33 5f 78 66 65 72 6f  he sqlite3_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 33 5f 78 66  set ::sqlite3_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: 33 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74 20  3_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 43 48 45 43 4b 20 63 6f 6e 73  } {1 {CHECK cons
05d0: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 3a 20 74  traint failed: t
05e0: 31 7d 7d 0a 78 66 65 72 6f 70 74 5f 74 65 73 74  1}}.xferopt_test
05f0: 20 69 6e 73 65 72 74 34 2d 31 2e 32 20 30 0a 64   insert4-1.2 0.d
0600: 6f 5f 74 65 73 74 20 69 6e 73 65 72 74 34 2d 31  o_test insert4-1
0610: 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
0620: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
0630: 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  OM t1;.  }.} {}.
0640: 0a 23 20 54 65 73 74 73 20 74 6f 20 6d 61 6b 65  .# Tests to make
0650: 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 74   sure that the t
0660: 72 61 6e 73 66 65 72 20 6f 70 74 69 6d 69 7a 61  ransfer optimiza
0670: 74 69 6f 6e 20 69 73 20 6e 6f 74 20 6f 63 63 75  tion is not occu
0680: 72 72 69 6e 67 0a 23 20 77 68 65 6e 20 69 74 20  rring.# when it 
0690: 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 6f  is not a valid o
06a0: 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 23 0a 23  ptimization..#.#
06b0: 20 54 68 65 20 53 45 4c 45 43 54 20 6d 75 73 74   The SELECT must
06c0: 20 62 65 20 61 67 61 69 6e 73 74 20 61 20 72 65   be against a re
06d0: 61 6c 20 74 61 62 6c 65 2e 0a 64 6f 5f 74 65 73  al table..do_tes
06e0: 74 20 69 6e 73 65 72 74 34 2d 32 2e 31 2e 31 20  t insert4-2.1.1 
06f0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
0700: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31    DELETE FROM t1
0710: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
0720: 4f 20 74 31 20 53 45 4c 45 43 54 20 34 2c 20 38  O t1 SELECT 4, 8
0730: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
0740: 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 34  ROM t1;.  }.} {4
0750: 20 38 7d 0a 78 66 65 72 6f 70 74 5f 74 65 73 74   8}.xferopt_test
0760: 20 69 6e 73 65 72 74 34 2d 32 2e 31 2e 32 20 20   insert4-2.1.2  
0770: 30 0a 64 6f 5f 74 65 73 74 20 69 6e 73 65 72 74  0.do_test insert
0780: 34 2d 32 2e 32 2e 31 20 7b 0a 20 20 63 61 74 63  4-2.2.1 {.  catc
0790: 68 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54  hsql {.    DELET
07a0: 45 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49  E FROM t1;.    I
07b0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
07c0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 76 32 3b 0a  LECT * FROM v2;.
07d0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
07e0: 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 30 20 7b  M t1;.  }.} {0 {
07f0: 31 20 39 7d 7d 0a 78 66 65 72 6f 70 74 5f 74 65  1 9}}.xferopt_te
0800: 73 74 20 69 6e 73 65 72 74 34 2d 32 2e 32 2e 32  st insert4-2.2.2
0810: 20 30 0a 0a 23 20 44 6f 20 6e 6f 74 20 72 75 6e   0..# Do not run
0820: 20 74 68 65 20 74 72 61 6e 73 66 65 72 20 6f 70   the transfer op
0830: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20 74 68  timization if th
0840: 65 72 65 20 69 73 20 61 20 4c 49 4d 49 54 20 63  ere is a LIMIT c
0850: 6c 61 75 73 65 0a 23 0a 64 6f 5f 74 65 73 74 20  lause.#.do_test 
0860: 69 6e 73 65 72 74 34 2d 32 2e 33 2e 31 20 7b 0a  insert4-2.3.1 {.
0870: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
0880: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 32 3b 0a  DELETE FROM t2;.
0890: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
08a0: 74 32 20 56 41 4c 55 45 53 28 39 2c 31 29 3b 0a  t2 VALUES(9,1);.
08b0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
08c0: 74 32 20 53 45 4c 45 43 54 20 79 2c 20 78 20 46  t2 SELECT y, x F
08d0: 52 4f 4d 20 74 32 3b 0a 20 20 20 20 49 4e 53 45  ROM t2;.    INSE
08e0: 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43  RT INTO t3 SELEC
08f0: 54 20 2a 20 46 52 4f 4d 20 74 32 20 4c 49 4d 49  T * FROM t2 LIMI
0900: 54 20 31 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  T 1;.    SELECT 
0910: 2a 20 46 52 4f 4d 20 74 33 3b 0a 20 20 7d 0a 7d  * FROM t3;.  }.}
0920: 20 7b 39 20 31 7d 0a 78 66 65 72 6f 70 74 5f 74   {9 1}.xferopt_t
0930: 65 73 74 20 69 6e 73 65 72 74 34 2d 32 2e 33 2e  est insert4-2.3.
0940: 32 20 20 30 0a 64 6f 5f 74 65 73 74 20 69 6e 73  2  0.do_test ins
0950: 65 72 74 34 2d 32 2e 33 2e 33 20 7b 0a 20 20 63  ert4-2.3.3 {.  c
0960: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 44 45  atchsql {.    DE
0970: 4c 45 54 45 20 46 52 4f 4d 20 74 31 3b 0a 20 20  LETE FROM t1;.  
0980: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
0990: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
09a0: 32 20 4c 49 4d 49 54 20 31 3b 0a 20 20 20 20 53  2 LIMIT 1;.    S
09b0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
09c0: 0a 20 20 7d 0a 7d 20 7b 31 20 7b 43 48 45 43 4b  .  }.} {1 {CHECK
09d0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
09e0: 65 64 3a 20 74 31 7d 7d 0a 78 66 65 72 6f 70 74  ed: t1}}.xferopt
09f0: 5f 74 65 73 74 20 69 6e 73 65 72 74 34 2d 32 2e  _test insert4-2.
0a00: 33 2e 34 20 30 0a 0a 23 20 44 6f 20 6e 6f 74 20  3.4 0..# Do not 
0a10: 72 75 6e 20 74 68 65 20 74 72 61 6e 73 66 65 72  run the transfer
0a20: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66   optimization if
0a30: 20 74 68 65 72 65 20 69 73 20 61 20 44 49 53 54   there is a DIST
0a40: 49 4e 43 54 0a 23 0a 64 6f 5f 74 65 73 74 20 69  INCT.#.do_test i
0a50: 6e 73 65 72 74 34 2d 32 2e 34 2e 31 20 7b 0a 20  nsert4-2.4.1 {. 
0a60: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44   execsql {.    D
0a70: 45 4c 45 54 45 20 46 52 4f 4d 20 74 33 3b 0a 20  ELETE FROM t3;. 
0a80: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
0a90: 33 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43  3 SELECT DISTINC
0aa0: 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20  T * FROM t2;.   
0ab0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0ac0: 33 3b 0a 20 20 7d 0a 7d 20 7b 39 20 31 20 31 20  3;.  }.} {9 1 1 
0ad0: 39 7d 0a 78 66 65 72 6f 70 74 5f 74 65 73 74 20  9}.xferopt_test 
0ae0: 69 6e 73 65 72 74 34 2d 32 2e 34 2e 32 20 30 0a  insert4-2.4.2 0.
0af0: 64 6f 5f 74 65 73 74 20 69 6e 73 65 72 74 34 2d  do_test insert4-
0b00: 32 2e 34 2e 33 20 7b 0a 20 20 63 61 74 63 68 73  2.4.3 {.  catchs
0b10: 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20  ql {.    DELETE 
0b20: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53  FROM t1;.    INS
0b30: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
0b40: 43 54 20 44 49 53 54 49 4e 43 54 20 2a 20 46 52  CT DISTINCT * FR
0b50: 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 31 20  OM t2;.  }.} {1 
0b60: 7b 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e  {CHECK constrain
0b70: 74 20 66 61 69 6c 65 64 3a 20 74 31 7d 7d 0a 78  t failed: t1}}.x
0b80: 66 65 72 6f 70 74 5f 74 65 73 74 20 69 6e 73 65  feropt_test inse
0b90: 72 74 34 2d 32 2e 34 2e 34 20 30 0a 0a 23 20 54  rt4-2.4.4 0..# T
0ba0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f  he following pro
0bb0: 63 65 64 75 72 65 20 63 6f 6e 73 74 72 75 63 74  cedure construct
0bc0: 73 20 74 77 6f 20 74 61 62 6c 65 73 20 74 68 65  s two tables the
0bd0: 6e 20 74 72 69 65 73 20 74 6f 20 74 72 61 6e 73  n tries to trans
0be0: 66 65 72 0a 23 20 64 61 74 61 20 66 72 6f 6d 20  fer.# data from 
0bf0: 6f 6e 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65  one table to the
0c00: 20 6f 74 68 65 72 2e 20 20 43 68 65 63 6b 73 20   other.  Checks 
0c10: 61 72 65 20 6d 61 64 65 20 74 6f 20 6d 61 6b 65  are made to make
0c20: 20 73 75 72 65 20 74 68 65 0a 23 20 74 72 61 6e   sure the.# tran
0c30: 73 66 65 72 20 69 73 20 73 75 63 63 65 73 73 66  sfer is successf
0c40: 75 6c 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  ul and that the 
0c50: 74 72 61 6e 73 66 65 72 20 6f 70 74 69 6d 69 7a  transfer optimiz
0c60: 61 74 69 6f 6e 20 77 61 73 20 75 73 65 64 20 6f  ation was used o
0c70: 72 0a 23 20 6e 6f 74 2c 20 61 73 20 61 70 70 72  r.# not, as appr
0c80: 6f 70 72 69 61 74 65 2e 0a 23 0a 23 20 20 20 20  opriate..#.#    
0c90: 20 78 66 65 72 5f 63 68 65 63 6b 20 54 45 53 54   xfer_check TEST
0ca0: 49 44 20 20 58 46 45 52 2d 55 53 45 44 20 20 20  ID  XFER-USED   
0cb0: 49 4e 49 54 2d 44 41 54 41 20 20 20 44 45 53 54  INIT-DATA   DEST
0cc0: 2d 53 43 48 45 4d 41 20 20 20 53 52 43 2d 53 43  -SCHEMA   SRC-SC
0cd0: 48 45 4d 41 20 0a 23 0a 23 20 54 68 65 20 54 45  HEMA .#.# The TE
0ce0: 53 54 49 44 20 61 72 67 75 6d 65 6e 74 20 69 73  STID argument is
0cf0: 20 74 68 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61   the symbolic na
0d00: 6d 65 20 66 6f 72 20 74 68 69 73 20 74 65 73 74  me for this test
0d10: 2e 20 20 54 68 65 20 58 46 45 52 2d 55 53 45 44  .  The XFER-USED
0d20: 0a 23 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  .# argument is t
0d30: 72 75 65 20 69 66 20 74 68 65 20 74 72 61 6e 73  rue if the trans
0d40: 66 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  fer optimization
0d50: 20 73 68 6f 75 6c 64 20 62 65 20 65 6d 70 6c 6f   should be emplo
0d60: 79 65 64 20 61 6e 64 0a 23 20 66 61 6c 73 65 20  yed and.# false 
0d70: 69 66 20 6e 6f 74 2e 20 20 49 4e 49 54 2d 44 41  if not.  INIT-DA
0d80: 54 41 20 69 73 20 61 20 73 69 6e 67 6c 65 20 72  TA is a single r
0d90: 6f 77 20 6f 66 20 64 61 74 61 20 74 68 61 74 20  ow of data that 
0da0: 69 73 20 74 6f 20 62 65 20 0a 23 20 74 72 61 6e  is to be .# tran
0db0: 73 66 65 72 65 64 2e 20 20 44 45 53 54 2d 53 43  sfered.  DEST-SC
0dc0: 48 45 4d 41 20 61 6e 64 20 53 52 43 2d 53 43 48  HEMA and SRC-SCH
0dd0: 45 4d 41 20 61 72 65 20 74 61 62 6c 65 20 64 65  EMA are table de
0de0: 63 6c 61 72 61 74 69 6f 6e 73 20 66 6f 72 0a 23  clarations for.#
0df0: 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
0e00: 20 61 6e 64 20 73 6f 75 72 63 65 20 74 61 62 6c   and source tabl
0e10: 65 73 2e 0a 23 0a 70 72 6f 63 20 78 66 65 72 5f  es..#.proc xfer_
0e20: 63 68 65 63 6b 20 7b 74 65 73 74 69 64 20 78 66  check {testid xf
0e30: 65 72 75 73 65 64 20 69 6e 69 74 64 61 74 61 20  erused initdata 
0e40: 64 65 73 74 73 63 68 65 6d 61 20 73 72 63 73 63  destschema srcsc
0e50: 68 65 6d 61 7d 20 7b 0a 20 20 65 78 65 63 73 71  hema} {.  execsq
0e60: 6c 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  l "CREATE TABLE 
0e70: 64 65 73 74 28 24 64 65 73 74 73 63 68 65 6d 61  dest($destschema
0e80: 29 22 0a 20 20 65 78 65 63 73 71 6c 20 22 43 52  )".  execsql "CR
0e90: 45 41 54 45 20 54 41 42 4c 45 20 73 72 63 28 24  EATE TABLE src($
0ea0: 73 72 63 73 63 68 65 6d 61 29 22 0a 20 20 65 78  srcschema)".  ex
0eb0: 65 63 73 71 6c 20 22 49 4e 53 45 52 54 20 49 4e  ecsql "INSERT IN
0ec0: 54 4f 20 73 72 63 20 56 41 4c 55 45 53 28 5b 6a  TO src VALUES([j
0ed0: 6f 69 6e 20 24 69 6e 69 74 64 61 74 61 20 2c 5d  oin $initdata ,]
0ee0: 29 22 0a 20 20 73 65 74 20 3a 3a 73 71 6c 69 74  )".  set ::sqlit
0ef0: 65 33 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74  e3_xferopt_count
0f00: 20 30 0a 20 20 64 6f 5f 74 65 73 74 20 24 74 65   0.  do_test $te
0f10: 73 74 69 64 2e 31 20 7b 0a 20 20 20 20 65 78 65  stid.1 {.    exe
0f20: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 49 4e 53  csql {.      INS
0f30: 45 52 54 20 49 4e 54 4f 20 64 65 73 74 20 53 45  ERT INTO dest SE
0f40: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 72 63 3b  LECT * FROM src;
0f50: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .      SELECT * 
0f60: 46 52 4f 4d 20 64 65 73 74 3b 0a 20 20 20 20 7d  FROM dest;.    }
0f70: 0a 20 20 7d 20 24 69 6e 69 74 64 61 74 61 0a 20  .  } $initdata. 
0f80: 20 64 6f 5f 74 65 73 74 20 24 74 65 73 74 69 64   do_test $testid
0f90: 2e 32 20 7b 0a 20 20 20 20 73 65 74 20 3a 3a 73  .2 {.    set ::s
0fa0: 71 6c 69 74 65 33 5f 78 66 65 72 6f 70 74 5f 63  qlite3_xferopt_c
0fb0: 6f 75 6e 74 0a 20 20 7d 20 24 78 66 65 72 75 73  ount.  } $xferus
0fc0: 65 64 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  ed.  execsql {. 
0fd0: 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 64 65     DROP TABLE de
0fe0: 73 74 3b 0a 20 20 20 20 44 52 4f 50 20 54 41 42  st;.    DROP TAB
0ff0: 4c 45 20 73 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 0a  LE src;.  }.}...
1000: 23 20 44 6f 20 72 75 6e 20 74 68 65 20 74 72 61  # Do run the tra
1010: 6e 73 66 65 72 20 6f 70 74 69 6d 69 7a 61 74 69  nsfer optimizati
1020: 6f 6e 20 69 66 20 74 61 62 6c 65 73 20 68 61 76  on if tables hav
1030: 65 20 69 64 65 6e 74 69 63 61 6c 0a 23 20 43 48  e identical.# CH
1040: 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  ECK constraints.
1050: 0a 23 0a 78 66 65 72 5f 63 68 65 63 6b 20 69 6e  .#.xfer_check in
1060: 73 65 72 74 34 2d 33 2e 31 20 31 20 7b 31 20 39  sert4-3.1 1 {1 9
1070: 7d 20 5c 0a 20 20 20 20 7b 61 20 69 6e 74 2c 20  } \.    {a int, 
1080: 62 20 69 6e 74 20 43 48 45 43 4b 28 62 3e 61 29  b int CHECK(b>a)
1090: 7d 20 5c 0a 20 20 20 20 7b 78 20 69 6e 74 2c 20  } \.    {x int, 
10a0: 79 20 69 6e 74 20 43 48 45 43 4b 28 79 3e 78 29  y int CHECK(y>x)
10b0: 7d 0a 78 66 65 72 5f 63 68 65 63 6b 20 69 6e 73  }.xfer_check ins
10c0: 65 72 74 34 2d 33 2e 32 20 31 20 7b 31 20 39 7d  ert4-3.2 1 {1 9}
10d0: 20 5c 0a 20 20 20 20 7b 61 20 69 6e 74 2c 20 62   \.    {a int, b
10e0: 20 69 6e 74 20 43 48 45 43 4b 28 62 3e 61 29 7d   int CHECK(b>a)}
10f0: 20 5c 0a 20 20 20 20 7b 78 20 69 6e 74 20 43 48   \.    {x int CH
1100: 45 43 4b 28 79 3e 78 29 2c 20 79 20 69 6e 74 7d  ECK(y>x), y int}
1110: 0a 0a 23 20 44 6f 20 72 75 6e 20 74 68 65 20 74  ..# Do run the t
1120: 72 61 6e 73 66 65 72 20 6f 70 74 69 6d 69 7a 61  ransfer optimiza
1130: 74 69 6f 6e 20 69 66 20 74 68 65 20 64 65 73 74  tion if the dest
1140: 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20 6c 61  ination table la
1150: 63 6b 73 0a 23 20 61 6e 79 20 43 48 45 43 4b 20  cks.# any CHECK 
1160: 63 6f 6e 73 74 72 61 69 6e 74 73 20 72 65 67 61  constraints rega
1170: 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
1180: 72 20 6f 72 20 6e 6f 74 20 74 68 65 72 65 20 61  r or not there a
1190: 72 65 20 43 48 45 43 4b 0a 23 20 63 6f 6e 73 74  re CHECK.# const
11a0: 72 61 69 6e 74 73 20 6f 6e 20 74 68 65 20 73 6f  raints on the so
11b0: 75 72 63 65 20 74 61 62 6c 65 2e 0a 23 0a 78 66  urce table..#.xf
11c0: 65 72 5f 63 68 65 63 6b 20 69 6e 73 65 72 74 34  er_check insert4
11d0: 2d 33 2e 33 20 31 20 7b 31 20 39 7d 20 5c 0a 20  -3.3 1 {1 9} \. 
11e0: 20 20 20 7b 61 20 69 6e 74 2c 20 62 20 69 6e 74     {a int, b int
11f0: 7d 20 5c 0a 20 20 20 20 7b 78 20 69 6e 74 2c 20  } \.    {x int, 
1200: 79 20 69 6e 74 20 43 48 45 43 4b 28 79 3e 78 29  y int CHECK(y>x)
1210: 7d 0a 0a 23 20 44 6f 20 72 75 6e 20 74 68 65 20  }..# Do run the 
1220: 74 72 61 6e 73 66 65 72 20 6f 70 74 69 6d 69 7a  transfer optimiz
1230: 61 74 69 6f 6e 20 69 66 20 74 68 65 20 64 65 73  ation if the des
1240: 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20 6f  tination table o
1250: 6d 69 74 73 0a 23 20 4e 4f 54 20 4e 55 4c 4c 20  mits.# NOT NULL 
1260: 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 68 61 74  constraints that
1270: 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c   the source tabl
1280: 65 20 68 61 73 2e 0a 23 0a 78 66 65 72 5f 63 68  e has..#.xfer_ch
1290: 65 63 6b 20 69 6e 73 65 72 74 34 2d 33 2e 34 20  eck insert4-3.4 
12a0: 30 20 7b 31 20 39 7d 20 5c 0a 20 20 20 20 7b 61  0 {1 9} \.    {a
12b0: 20 69 6e 74 2c 20 62 20 69 6e 74 20 43 48 45 43   int, b int CHEC
12c0: 4b 28 62 3e 61 29 7d 20 5c 0a 20 20 20 20 7b 78  K(b>a)} \.    {x
12d0: 20 69 6e 74 2c 20 79 20 69 6e 74 7d 0a 0a 23 20   int, y int}..# 
12e0: 44 6f 20 6e 6f 74 20 72 75 6e 20 74 68 65 20 6f  Do not run the o
12f0: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20 74  ptimization if t
1300: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 68  he destination h
1310: 61 73 20 4e 4f 54 20 4e 55 4c 4c 0a 23 20 63 6f  as NOT NULL.# co
1320: 6e 73 74 72 61 69 6e 74 73 20 74 68 61 74 20 74  nstraints that t
1330: 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 20  he source table 
1340: 6c 61 63 6b 73 2e 0a 23 0a 78 66 65 72 5f 63 68  lacks..#.xfer_ch
1350: 65 63 6b 20 69 6e 73 65 72 74 34 2d 33 2e 35 20  eck insert4-3.5 
1360: 30 20 7b 31 20 39 7d 20 5c 0a 20 20 20 20 7b 61  0 {1 9} \.    {a
1370: 20 69 6e 74 2c 20 62 20 69 6e 74 20 4e 4f 54 20   int, b int NOT 
1380: 4e 55 4c 4c 7d 20 5c 0a 20 20 20 20 7b 78 20 69  NULL} \.    {x i
1390: 6e 74 2c 20 79 20 69 6e 74 7d 0a 78 66 65 72 5f  nt, y int}.xfer_
13a0: 63 68 65 63 6b 20 69 6e 73 65 72 74 34 2d 33 2e  check insert4-3.
13b0: 36 20 30 20 7b 31 20 39 7d 20 5c 0a 20 20 20 20  6 0 {1 9} \.    
13c0: 7b 61 20 69 6e 74 2c 20 62 20 69 6e 74 20 4e 4f  {a int, b int NO
13d0: 54 20 4e 55 4c 4c 7d 20 5c 0a 20 20 20 20 7b 78  T NULL} \.    {x
13e0: 20 69 6e 74 20 4e 4f 54 20 4e 55 4c 4c 2c 20 79   int NOT NULL, y
13f0: 20 69 6e 74 7d 0a 78 66 65 72 5f 63 68 65 63 6b   int}.xfer_check
1400: 20 69 6e 73 65 72 74 34 2d 33 2e 37 20 30 20 7b   insert4-3.7 0 {
1410: 31 20 39 7d 20 5c 0a 20 20 20 20 7b 61 20 69 6e  1 9} \.    {a in
1420: 74 20 4e 4f 54 20 4e 55 4c 4c 2c 20 62 20 69 6e  t NOT NULL, b in
1430: 74 20 4e 4f 54 20 4e 55 4c 4c 7d 20 5c 0a 20 20  t NOT NULL} \.  
1440: 20 20 7b 78 20 69 6e 74 20 4e 4f 54 20 4e 55 4c    {x int NOT NUL
1450: 4c 2c 20 79 20 69 6e 74 7d 0a 78 66 65 72 5f 63  L, y int}.xfer_c
1460: 68 65 63 6b 20 69 6e 73 65 72 74 34 2d 33 2e 38  heck insert4-3.8
1470: 20 30 20 7b 31 20 39 7d 20 5c 0a 20 20 20 20 7b   0 {1 9} \.    {
1480: 61 20 69 6e 74 20 4e 4f 54 20 4e 55 4c 4c 2c 20  a int NOT NULL, 
1490: 62 20 69 6e 74 7d 20 5c 0a 20 20 20 20 7b 78 20  b int} \.    {x 
14a0: 69 6e 74 2c 20 79 20 69 6e 74 7d 0a 0a 0a 23 20  int, y int}...# 
14b0: 44 6f 20 72 75 6e 20 74 68 65 20 74 72 61 6e 73  Do run the trans
14c0: 66 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  fer optimization
14d0: 20 69 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   if the destinat
14e0: 69 6f 6e 20 74 61 62 6c 65 20 61 6e 64 0a 23 20  ion table and.# 
14f0: 73 6f 75 72 63 65 20 74 61 62 6c 65 20 68 61 76  source table hav
1500: 65 20 74 68 65 20 73 61 6d 65 20 4e 4f 54 20 4e  e the same NOT N
1510: 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ULL constraints 
1520: 6f 72 20 69 66 20 74 68 65 20 0a 23 20 73 6f 75  or if the .# sou
1530: 72 63 65 20 74 61 62 6c 65 20 68 61 73 20 65 78  rce table has ex
1540: 74 72 61 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e  tra NOT NULL con
1550: 73 74 72 61 69 6e 74 73 2e 0a 23 0a 78 66 65 72  straints..#.xfer
1560: 5f 63 68 65 63 6b 20 69 6e 73 65 72 74 34 2d 33  _check insert4-3
1570: 2e 39 20 31 20 7b 31 20 39 7d 20 5c 0a 20 20 20  .9 1 {1 9} \.   
1580: 20 7b 61 20 69 6e 74 2c 20 62 20 69 6e 74 7d 20   {a int, b int} 
1590: 5c 0a 20 20 20 20 7b 78 20 69 6e 74 20 4e 4f 54  \.    {x int NOT
15a0: 20 4e 55 4c 4c 2c 20 79 20 69 6e 74 7d 0a 78 66   NULL, y int}.xf
15b0: 65 72 5f 63 68 65 63 6b 20 69 6e 73 65 72 74 34  er_check insert4
15c0: 2d 33 2e 31 30 20 31 20 7b 31 20 39 7d 20 5c 0a  -3.10 1 {1 9} \.
15d0: 20 20 20 20 7b 61 20 69 6e 74 2c 20 62 20 69 6e      {a int, b in
15e0: 74 7d 20 5c 0a 20 20 20 20 7b 78 20 69 6e 74 20  t} \.    {x int 
15f0: 4e 4f 54 20 4e 55 4c 4c 2c 20 79 20 69 6e 74 20  NOT NULL, y int 
1600: 4e 4f 54 20 4e 55 4c 4c 7d 0a 78 66 65 72 5f 63  NOT NULL}.xfer_c
1610: 68 65 63 6b 20 69 6e 73 65 72 74 34 2d 33 2e 31  heck insert4-3.1
1620: 31 20 31 20 7b 31 20 39 7d 20 5c 0a 20 20 20 20  1 1 {1 9} \.    
1630: 7b 61 20 69 6e 74 20 4e 4f 54 20 4e 55 4c 4c 2c  {a int NOT NULL,
1640: 20 62 20 69 6e 74 7d 20 5c 0a 20 20 20 20 7b 78   b int} \.    {x
1650: 20 69 6e 74 20 4e 4f 54 20 4e 55 4c 4c 2c 20 79   int NOT NULL, y
1660: 20 69 6e 74 20 4e 4f 54 20 4e 55 4c 4c 7d 0a 78   int NOT NULL}.x
1670: 66 65 72 5f 63 68 65 63 6b 20 69 6e 73 65 72 74  fer_check insert
1680: 34 2d 33 2e 31 32 20 31 20 7b 31 20 39 7d 20 5c  4-3.12 1 {1 9} \
1690: 0a 20 20 20 20 7b 61 20 69 6e 74 2c 20 62 20 69  .    {a int, b i
16a0: 6e 74 20 4e 4f 54 20 4e 55 4c 4c 7d 20 5c 0a 20  nt NOT NULL} \. 
16b0: 20 20 20 7b 78 20 69 6e 74 20 4e 4f 54 20 4e 55     {x int NOT NU
16c0: 4c 4c 2c 20 79 20 69 6e 74 20 4e 4f 54 20 4e 55  LL, y int NOT NU
16d0: 4c 4c 7d 0a 0a 23 20 44 6f 20 6e 6f 74 20 72 75  LL}..# Do not ru
16e0: 6e 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  n the optimizati
16f0: 6f 6e 20 69 66 20 61 6e 79 20 63 6f 72 72 65 73  on if any corres
1700: 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 0a 23 20  ponding table.# 
1710: 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20 64 69 66  columns have dif
1720: 66 65 72 65 6e 74 20 61 66 66 69 6e 69 74 69 65  ferent affinitie
1730: 73 2e 0a 23 0a 78 66 65 72 5f 63 68 65 63 6b 20  s..#.xfer_check 
1740: 69 6e 73 65 72 74 34 2d 33 2e 32 30 20 30 20 7b  insert4-3.20 0 {
1750: 31 20 39 7d 20 5c 0a 20 20 20 20 7b 61 20 74 65  1 9} \.    {a te
1760: 78 74 2c 20 62 20 69 6e 74 7d 20 5c 0a 20 20 20  xt, b int} \.   
1770: 20 7b 78 20 69 6e 74 2c 20 62 20 69 6e 74 7d 0a   {x int, b int}.
1780: 78 66 65 72 5f 63 68 65 63 6b 20 69 6e 73 65 72  xfer_check inser
1790: 74 34 2d 33 2e 32 31 20 30 20 7b 31 20 39 7d 20  t4-3.21 0 {1 9} 
17a0: 5c 0a 20 20 20 20 7b 61 20 69 6e 74 2c 20 62 20  \.    {a int, b 
17b0: 69 6e 74 7d 20 5c 0a 20 20 20 20 7b 78 20 74 65  int} \.    {x te
17c0: 78 74 2c 20 62 20 69 6e 74 7d 0a 0a 23 20 22 69  xt, b int}..# "i
17d0: 6e 74 22 20 61 6e 64 20 22 69 6e 74 65 67 65 72  nt" and "integer
17e0: 22 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74  " are equivalent
17f0: 20 73 6f 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   so the optimiza
1800: 74 69 6f 6e 20 73 68 6f 75 6c 64 0a 23 20 72 75  tion should.# ru
1810: 6e 20 68 65 72 65 2e 0a 23 0a 78 66 65 72 5f 63  n here..#.xfer_c
1820: 68 65 63 6b 20 69 6e 73 65 72 74 34 2d 33 2e 32  heck insert4-3.2
1830: 32 20 31 20 7b 31 20 39 7d 20 5c 0a 20 20 20 20  2 1 {1 9} \.    
1840: 7b 61 20 69 6e 74 2c 20 62 20 69 6e 74 7d 20 5c  {a int, b int} \
1850: 0a 20 20 20 20 7b 78 20 69 6e 74 65 67 65 72 2c  .    {x integer,
1860: 20 62 20 69 6e 74 7d 0a 0a 23 20 54 69 63 6b 65   b int}..# Ticke
1870: 74 20 23 32 32 39 31 2e 0a 23 0a 0a 64 6f 5f 74  t #2291..#..do_t
1880: 65 73 74 20 69 6e 73 65 72 74 34 2d 34 2e 31 61  est insert4-4.1a
1890: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 43 52   {.  execsql {CR
18a0: 45 41 54 45 20 54 41 42 4c 45 20 74 34 28 61 2c  EATE TABLE t4(a,
18b0: 20 62 2c 20 55 4e 49 51 55 45 28 61 2c 62 29 29   b, UNIQUE(a,b))
18c0: 7d 0a 7d 20 7b 7d 0a 69 66 63 61 70 61 62 6c 65  }.} {}.ifcapable
18d0: 20 76 61 63 75 75 6d 20 7b 0a 20 20 64 6f 5f 74   vacuum {.  do_t
18e0: 65 73 74 20 69 6e 73 65 72 74 34 2d 34 2e 31 62  est insert4-4.1b
18f0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
1900: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
1910: 54 4f 20 74 34 20 56 41 4c 55 45 53 28 4e 55 4c  TO t4 VALUES(NUL
1920: 4c 2c 30 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  L,0);.      INSE
1930: 52 54 20 49 4e 54 4f 20 74 34 20 56 41 4c 55 45  RT INTO t4 VALUE
1940: 53 28 4e 55 4c 4c 2c 31 29 3b 0a 20 20 20 20 20  S(NULL,1);.     
1950: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34 20   INSERT INTO t4 
1960: 56 41 4c 55 45 53 28 4e 55 4c 4c 2c 31 29 3b 0a  VALUES(NULL,1);.
1970: 20 20 20 20 20 20 56 41 43 55 55 4d 3b 20 20 20        VACUUM;   
1980: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 7d 0a  .    }.  } {}.}.
1990: 0a 23 20 43 68 65 63 6b 20 73 6f 6d 65 20 65 72  .# Check some er
19a0: 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 73 3a 0a  ror conditions:.
19b0: 23 0a 64 6f 5f 74 65 73 74 20 69 6e 73 65 72 74  #.do_test insert
19c0: 34 2d 35 2e 31 20 7b 0a 20 20 23 20 54 61 62 6c  4-5.1 {.  # Tabl
19d0: 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
19e0: 2e 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49  ..  catchsql { I
19f0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45  NSERT INTO t2 SE
1a00: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6e 6f 73 75  LECT * FROM nosu
1a10: 63 68 74 61 62 6c 65 20 7d 0a 7d 20 7b 31 20 7b  chtable }.} {1 {
1a20: 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 6e  no such table: n
1a30: 6f 73 75 63 68 74 61 62 6c 65 7d 7d 0a 64 6f 5f  osuchtable}}.do_
1a40: 74 65 73 74 20 69 6e 73 65 72 74 34 2d 35 2e 32  test insert4-5.2
1a50: 20 7b 0a 20 20 23 20 4e 75 6d 62 65 72 20 6f 66   {.  # Number of
1a60: 20 63 6f 6c 75 6d 6e 73 20 64 6f 65 73 20 6e 6f   columns does no
1a70: 74 20 6d 61 74 63 68 2e 0a 20 20 63 61 74 63 68  t match..  catch
1a80: 73 71 6c 20 7b 20 0a 20 20 20 20 43 52 45 41 54  sql { .    CREAT
1a90: 45 20 54 41 42 4c 45 20 74 35 28 61 2c 20 62 2c  E TABLE t5(a, b,
1aa0: 20 63 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   c);.    INSERT 
1ab0: 49 4e 54 4f 20 74 34 20 53 45 4c 45 43 54 20 2a  INTO t4 SELECT *
1ac0: 20 46 52 4f 4d 20 74 35 3b 0a 20 20 7d 0a 7d 20   FROM t5;.  }.} 
1ad0: 7b 31 20 7b 74 61 62 6c 65 20 74 34 20 68 61 73  {1 {table t4 has
1ae0: 20 32 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20 33   2 columns but 3
1af0: 20 76 61 6c 75 65 73 20 77 65 72 65 20 73 75 70   values were sup
1b00: 70 6c 69 65 64 7d 7d 0a 0a 64 6f 5f 74 65 73 74  plied}}..do_test
1b10: 20 69 6e 73 65 72 74 34 2d 36 2e 31 20 7b 0a 20   insert4-6.1 {. 
1b20: 20 73 65 74 20 3a 3a 73 71 6c 69 74 65 33 5f 78   set ::sqlite3_x
1b30: 66 65 72 6f 70 74 5f 63 6f 75 6e 74 20 30 0a 20  feropt_count 0. 
1b40: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
1b50: 52 45 41 54 45 20 49 4e 44 45 58 20 74 32 5f 69  REATE INDEX t2_i
1b60: 32 20 4f 4e 20 74 32 28 78 2c 20 79 20 43 4f 4c  2 ON t2(x, y COL
1b70: 4c 41 54 45 20 6e 6f 63 61 73 65 29 3b 20 0a 20  LATE nocase); . 
1b80: 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
1b90: 74 32 5f 69 31 20 4f 4e 20 74 32 28 78 20 41 53  t2_i1 ON t2(x AS
1ba0: 43 2c 20 79 20 44 45 53 43 29 3b 0a 20 20 20 20  C, y DESC);.    
1bb0: 43 52 45 41 54 45 20 49 4e 44 45 58 20 74 33 5f  CREATE INDEX t3_
1bc0: 69 31 20 4f 4e 20 74 33 28 61 2c 20 62 29 3b 0a  i1 ON t3(a, b);.
1bd0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1be0: 74 32 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  t2 SELECT * FROM
1bf0: 20 74 33 3b 0a 20 20 7d 0a 20 20 73 65 74 20 3a   t3;.  }.  set :
1c00: 3a 73 71 6c 69 74 65 33 5f 78 66 65 72 6f 70 74  :sqlite3_xferopt
1c10: 5f 63 6f 75 6e 74 0a 7d 20 7b 30 7d 0a 64 6f 5f  _count.} {0}.do_
1c20: 74 65 73 74 20 69 6e 73 65 72 74 34 2d 36 2e 32  test insert4-6.2
1c30: 20 7b 0a 20 20 73 65 74 20 3a 3a 73 71 6c 69 74   {.  set ::sqlit
1c40: 65 33 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74  e3_xferopt_count
1c50: 20 30 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   0.  execsql {. 
1c60: 20 20 20 44 52 4f 50 20 49 4e 44 45 58 20 74 32     DROP INDEX t2
1c70: 5f 69 32 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  _i2;.    INSERT 
1c80: 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20 2a  INTO t2 SELECT *
1c90: 20 46 52 4f 4d 20 74 33 3b 0a 20 20 7d 0a 20 20   FROM t3;.  }.  
1ca0: 73 65 74 20 3a 3a 73 71 6c 69 74 65 33 5f 78 66  set ::sqlite3_xf
1cb0: 65 72 6f 70 74 5f 63 6f 75 6e 74 0a 7d 20 7b 30  eropt_count.} {0
1cc0: 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 73 65 72 74  }.do_test insert
1cd0: 34 2d 36 2e 33 20 7b 0a 20 20 73 65 74 20 3a 3a  4-6.3 {.  set ::
1ce0: 73 71 6c 69 74 65 33 5f 78 66 65 72 6f 70 74 5f  sqlite3_xferopt_
1cf0: 63 6f 75 6e 74 20 30 0a 20 20 65 78 65 63 73 71  count 0.  execsq
1d00: 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20 49 4e 44  l {.    DROP IND
1d10: 45 58 20 74 32 5f 69 31 3b 0a 20 20 20 20 43 52  EX t2_i1;.    CR
1d20: 45 41 54 45 20 49 4e 44 45 58 20 74 32 5f 69 31  EATE INDEX t2_i1
1d30: 20 4f 4e 20 74 32 28 78 20 41 53 43 2c 20 79 20   ON t2(x ASC, y 
1d40: 41 53 43 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  ASC);.    INSERT
1d50: 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20   INTO t2 SELECT 
1d60: 2a 20 46 52 4f 4d 20 74 33 3b 0a 20 20 7d 0a 20  * FROM t3;.  }. 
1d70: 20 73 65 74 20 3a 3a 73 71 6c 69 74 65 33 5f 78   set ::sqlite3_x
1d80: 66 65 72 6f 70 74 5f 63 6f 75 6e 74 0a 7d 20 7b  feropt_count.} {
1d90: 31 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 73 65 72  1}.do_test inser
1da0: 74 34 2d 36 2e 34 20 7b 0a 20 20 73 65 74 20 3a  t4-6.4 {.  set :
1db0: 3a 73 71 6c 69 74 65 33 5f 78 66 65 72 6f 70 74  :sqlite3_xferopt
1dc0: 5f 63 6f 75 6e 74 20 30 0a 20 20 65 78 65 63 73  _count 0.  execs
1dd0: 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20 49 4e  ql {.    DROP IN
1de0: 44 45 58 20 74 32 5f 69 31 3b 0a 20 20 20 20 43  DEX t2_i1;.    C
1df0: 52 45 41 54 45 20 49 4e 44 45 58 20 74 32 5f 69  REATE INDEX t2_i
1e00: 31 20 4f 4e 20 74 32 28 78 20 41 53 43 2c 20 79  1 ON t2(x ASC, y
1e10: 20 43 4f 4c 4c 41 54 45 20 52 54 52 49 4d 29 3b   COLLATE RTRIM);
1e20: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
1e30: 20 74 32 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   t2 SELECT * FRO
1e40: 4d 20 74 33 3b 0a 20 20 7d 0a 20 20 73 65 74 20  M t3;.  }.  set 
1e50: 3a 3a 73 71 6c 69 74 65 33 5f 78 66 65 72 6f 70  ::sqlite3_xferop
1e60: 74 5f 63 6f 75 6e 74 0a 7d 20 7b 30 7d 0a 0a 0a  t_count.} {0}...
1e70: 64 6f 5f 74 65 73 74 20 69 6e 73 65 72 74 34 2d  do_test insert4-
1e80: 36 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  6.5 {.  execsql 
1e90: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
1ea0: 4c 45 20 74 36 61 28 78 20 43 48 45 43 4b 28 20  LE t6a(x CHECK( 
1eb0: 78 3c 3e 27 61 62 63 27 20 29 29 3b 0a 20 20 20  x<>'abc' ));.   
1ec0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 36 61   INSERT INTO t6a
1ed0: 20 56 41 4c 55 45 53 28 27 41 42 43 27 29 3b 0a   VALUES('ABC');.
1ee0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
1ef0: 4d 20 74 36 61 3b 0a 20 20 7d 0a 7d 20 7b 41 42  M t6a;.  }.} {AB
1f00: 43 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 73 65 72  C}.do_test inser
1f10: 74 34 2d 36 2e 36 20 7b 0a 20 20 65 78 65 63 73  t4-6.6 {.  execs
1f20: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
1f30: 54 41 42 4c 45 20 74 36 62 28 78 20 43 48 45 43  TABLE t6b(x CHEC
1f40: 4b 28 20 78 3c 3e 27 61 62 63 27 20 43 4f 4c 4c  K( x<>'abc' COLL
1f50: 41 54 45 20 6e 6f 63 61 73 65 20 29 29 3b 0a 20  ATE nocase ));. 
1f60: 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a   }.  catchsql {.
1f70: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1f80: 74 36 62 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  t6b SELECT * FRO
1f90: 4d 20 74 36 61 3b 0a 20 20 7d 0a 7d 20 7b 31 20  M t6a;.  }.} {1 
1fa0: 7b 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e  {CHECK constrain
1fb0: 74 20 66 61 69 6c 65 64 3a 20 74 36 62 7d 7d 0a  t failed: t6b}}.
1fc0: 64 6f 5f 74 65 73 74 20 69 6e 73 65 72 74 34 2d  do_test insert4-
1fd0: 36 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  6.7 {.  execsql 
1fe0: 7b 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45  {.    DROP TABLE
1ff0: 20 74 36 62 3b 0a 20 20 20 20 43 52 45 41 54 45   t6b;.    CREATE
2000: 20 54 41 42 4c 45 20 74 36 62 28 78 20 43 48 45   TABLE t6b(x CHE
2010: 43 4b 28 20 78 20 43 4f 4c 4c 41 54 45 20 6e 6f  CK( x COLLATE no
2020: 63 61 73 65 20 3c 3e 27 61 62 63 27 20 29 29 3b  case <>'abc' ));
2030: 0a 20 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20  .  }.  catchsql 
2040: 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  {.    INSERT INT
2050: 4f 20 74 36 62 20 53 45 4c 45 43 54 20 2a 20 46  O t6b SELECT * F
2060: 52 4f 4d 20 74 36 61 3b 0a 20 20 7d 0a 7d 20 7b  ROM t6a;.  }.} {
2070: 31 20 7b 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  1 {CHECK constra
2080: 69 6e 74 20 66 61 69 6c 65 64 3a 20 74 36 62 7d  int failed: t6b}
2090: 7d 0a 0a 23 20 54 69 63 6b 65 74 20 5b 36 32 38  }..# Ticket [628
20a0: 34 64 66 38 39 64 65 62 64 66 61 36 31 64 62 38  4df89debdfa61db8
20b0: 30 37 33 65 30 36 32 39 30 38 61 66 30 63 39 62  073e062908af0c9b
20c0: 36 31 31 38 65 5d 0a 23 20 44 69 73 61 62 6c 65  6118e].# Disable
20d0: 20 74 68 65 20 78 66 65 72 20 6f 70 74 69 6d 69   the xfer optimi
20e0: 7a 61 74 69 6f 6e 20 69 66 20 74 68 65 20 64 65  zation if the de
20f0: 73 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20  stination table 
2100: 63 6f 6e 74 61 69 6e 73 0a 23 20 61 20 66 6f 72  contains.# a for
2110: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
2120: 69 6e 74 0a 23 0a 69 66 63 61 70 61 62 6c 65 20  int.#.ifcapable 
2130: 66 6f 72 65 69 67 6e 6b 65 79 20 7b 0a 20 20 64  foreignkey {.  d
2140: 6f 5f 74 65 73 74 20 69 6e 73 65 72 74 34 2d 37  o_test insert4-7
2150: 2e 31 20 7b 0a 20 20 20 20 73 65 74 20 3a 3a 73  .1 {.    set ::s
2160: 71 6c 69 74 65 33 5f 78 66 65 72 6f 70 74 5f 63  qlite3_xferopt_c
2170: 6f 75 6e 74 20 30 0a 20 20 20 20 65 78 65 63 73  ount 0.    execs
2180: 71 6c 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54  ql {.      CREAT
2190: 45 20 54 41 42 4c 45 20 74 37 61 28 78 20 49 4e  E TABLE t7a(x IN
21a0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
21b0: 59 29 3b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  Y); INSERT INTO 
21c0: 74 37 61 20 56 41 4c 55 45 53 28 31 32 33 29 3b  t7a VALUES(123);
21d0: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
21e0: 42 4c 45 20 74 37 62 28 79 20 49 4e 54 45 47 45  BLE t7b(y INTEGE
21f0: 52 20 52 45 46 45 52 45 4e 43 45 53 20 74 37 61  R REFERENCES t7a
2200: 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  );.      CREATE 
2210: 54 41 42 4c 45 20 74 37 63 28 7a 20 49 4e 54 29  TABLE t7c(z INT)
2220: 3b 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  ;  INSERT INTO t
2230: 37 63 20 56 41 4c 55 45 53 28 32 33 34 29 3b 0a  7c VALUES(234);.
2240: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
2250: 4f 20 74 37 62 20 53 45 4c 45 43 54 20 2a 20 46  O t7b SELECT * F
2260: 52 4f 4d 20 74 37 63 3b 0a 20 20 20 20 20 20 53  ROM t7c;.      S
2270: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 37 62  ELECT * FROM t7b
2280: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 32 33 34  ;.    }.  } {234
2290: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 69 6e 73 65  }.  do_test inse
22a0: 72 74 34 2d 37 2e 32 20 7b 0a 20 20 20 20 73 65  rt4-7.2 {.    se
22b0: 74 20 3a 3a 73 71 6c 69 74 65 33 5f 78 66 65 72  t ::sqlite3_xfer
22c0: 6f 70 74 5f 63 6f 75 6e 74 0a 20 20 7d 20 7b 31  opt_count.  } {1
22d0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 69 6e 73 65  }.  do_test inse
22e0: 72 74 34 2d 37 2e 33 20 7b 0a 20 20 20 20 73 65  rt4-7.3 {.    se
22f0: 74 20 3a 3a 73 71 6c 69 74 65 33 5f 78 66 65 72  t ::sqlite3_xfer
2300: 6f 70 74 5f 63 6f 75 6e 74 20 30 0a 20 20 20 20  opt_count 0.    
2310: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
2320: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 37 62 3b  DELETE FROM t7b;
2330: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 66 6f  .      PRAGMA fo
2340: 72 65 69 67 6e 5f 6b 65 79 73 3d 4f 4e 3b 0a 20  reign_keys=ON;. 
2350: 20 20 20 7d 0a 20 20 20 20 63 61 74 63 68 73 71     }.    catchsq
2360: 6c 20 7b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  l {.      INSERT
2370: 20 49 4e 54 4f 20 74 37 62 20 53 45 4c 45 43 54   INTO t7b SELECT
2380: 20 2a 20 46 52 4f 4d 20 74 37 63 3b 0a 20 20 20   * FROM t7c;.   
2390: 20 7d 0a 20 20 7d 20 7b 31 20 7b 46 4f 52 45 49   }.  } {1 {FOREI
23a0: 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  GN KEY constrain
23b0: 74 20 66 61 69 6c 65 64 7d 7d 0a 20 20 64 6f 5f  t failed}}.  do_
23c0: 74 65 73 74 20 69 6e 73 65 72 74 34 2d 37 2e 34  test insert4-7.4
23d0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
23e0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 37  SELECT * FROM t7
23f0: 62 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74  b}.  } {}.  do_t
2400: 65 73 74 20 69 6e 73 65 72 74 34 2d 37 2e 35 20  est insert4-7.5 
2410: 7b 0a 20 20 20 20 73 65 74 20 3a 3a 73 71 6c 69  {.    set ::sqli
2420: 74 65 33 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e  te3_xferopt_coun
2430: 74 0a 20 20 7d 20 7b 30 7d 0a 20 20 64 6f 5f 74  t.  } {0}.  do_t
2440: 65 73 74 20 69 6e 73 65 72 74 34 2d 37 2e 36 20  est insert4-7.6 
2450: 7b 0a 20 20 20 20 73 65 74 20 3a 3a 73 71 6c 69  {.    set ::sqli
2460: 74 65 33 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e  te3_xferopt_coun
2470: 74 20 30 0a 20 20 20 20 65 78 65 63 73 71 6c 20  t 0.    execsql 
2480: 7b 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46  {.      DELETE F
2490: 52 4f 4d 20 74 37 62 3b 20 44 45 4c 45 54 45 20  ROM t7b; DELETE 
24a0: 46 52 4f 4d 20 74 37 63 3b 0a 20 20 20 20 20 20  FROM t7c;.      
24b0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 37 63 20  INSERT INTO t7c 
24c0: 56 41 4c 55 45 53 28 31 32 33 29 3b 0a 20 20 20  VALUES(123);.   
24d0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
24e0: 37 62 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  7b SELECT * FROM
24f0: 20 74 37 63 3b 0a 20 20 20 20 20 20 53 45 4c 45   t7c;.      SELE
2500: 43 54 20 2a 20 46 52 4f 4d 20 74 37 62 3b 0a 20  CT * FROM t7b;. 
2510: 20 20 20 7d 0a 20 20 7d 20 7b 31 32 33 7d 0a 20     }.  } {123}. 
2520: 20 64 6f 5f 74 65 73 74 20 69 6e 73 65 72 74 34   do_test insert4
2530: 2d 37 2e 37 20 7b 0a 20 20 20 20 73 65 74 20 3a  -7.7 {.    set :
2540: 3a 73 71 6c 69 74 65 33 5f 78 66 65 72 6f 70 74  :sqlite3_xferopt
2550: 5f 63 6f 75 6e 74 0a 20 20 7d 20 7b 30 7d 0a 20  _count.  } {0}. 
2560: 20 64 6f 5f 74 65 73 74 20 69 6e 73 65 72 74 34   do_test insert4
2570: 2d 37 2e 37 20 7b 0a 20 20 20 20 73 65 74 20 3a  -7.7 {.    set :
2580: 3a 73 71 6c 69 74 65 33 5f 78 66 65 72 6f 70 74  :sqlite3_xferopt
2590: 5f 63 6f 75 6e 74 20 30 0a 20 20 20 20 65 78 65  _count 0.    exe
25a0: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 50 52 41  csql {.      PRA
25b0: 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73  GMA foreign_keys
25c0: 3d 4f 46 46 3b 0a 20 20 20 20 20 20 44 45 4c 45  =OFF;.      DELE
25d0: 54 45 20 46 52 4f 4d 20 74 37 62 3b 0a 20 20 20  TE FROM t7b;.   
25e0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
25f0: 37 62 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  7b SELECT * FROM
2600: 20 74 37 63 3b 0a 20 20 20 20 20 20 53 45 4c 45   t7c;.      SELE
2610: 43 54 20 2a 20 46 52 4f 4d 20 74 37 62 3b 0a 20  CT * FROM t7b;. 
2620: 20 20 20 7d 0a 20 20 7d 20 7b 31 32 33 7d 0a 20     }.  } {123}. 
2630: 20 64 6f 5f 74 65 73 74 20 69 6e 73 65 72 74 34   do_test insert4
2640: 2d 37 2e 38 20 7b 0a 20 20 20 20 73 65 74 20 3a  -7.8 {.    set :
2650: 3a 73 71 6c 69 74 65 33 5f 78 66 65 72 6f 70 74  :sqlite3_xferopt
2660: 5f 63 6f 75 6e 74 0a 20 20 7d 20 7b 31 7d 0a 7d  _count.  } {1}.}
2670: 0a 0a 23 20 54 69 63 6b 65 74 20 5b 36 37 36 62  ..# Ticket [676b
2680: 63 30 32 62 38 37 31 37 36 31 32 35 36 33 35 63  c02b87176125635c
2690: 62 31 37 34 64 31 31 30 62 34 33 31 35 38 31 39  b174d110b4315819
26a0: 31 32 62 62 5d 0a 23 20 4d 61 6b 65 20 73 75 72  12bb].# Make sur
26b0: 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  e INTEGER PRIMAR
26c0: 59 20 4b 45 59 20 4f 4e 20 43 4f 4e 46 4c 49 43  Y KEY ON CONFLIC
26d0: 54 20 2e 2e 2e 20 77 6f 72 6b 73 20 77 69 74 68  T ... works with
26e0: 20 74 68 65 20 78 66 65 72 0a 23 20 6f 70 74 69   the xfer.# opti
26f0: 6d 69 7a 61 74 69 6f 6e 2e 0a 23 0a 64 6f 5f 74  mization..#.do_t
2700: 65 73 74 20 69 6e 73 65 72 74 34 2d 38 2e 31 20  est insert4-8.1 
2710: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
2720: 20 20 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20    DROP TABLE IF 
2730: 45 58 49 53 54 53 20 74 31 3b 0a 20 20 20 20 44  EXISTS t1;.    D
2740: 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49  ROP TABLE IF EXI
2750: 53 54 53 20 74 32 3b 0a 20 20 20 20 43 52 45 41  STS t2;.    CREA
2760: 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 49 4e  TE TABLE t1(a IN
2770: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
2780: 59 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 52 45  Y ON CONFLICT RE
2790: 50 4c 41 43 45 2c 20 62 29 3b 0a 20 20 20 20 43  PLACE, b);.    C
27a0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 78  REATE TABLE t2(x
27b0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
27c0: 20 4b 45 59 20 4f 4e 20 43 4f 4e 46 4c 49 43 54   KEY ON CONFLICT
27d0: 20 52 45 50 4c 41 43 45 2c 20 79 29 3b 0a 20 20   REPLACE, y);.  
27e0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
27f0: 20 56 41 4c 55 45 53 28 31 2c 32 29 3b 0a 20 20   VALUES(1,2);.  
2800: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
2810: 20 56 41 4c 55 45 53 28 31 2c 33 29 3b 0a 20 20   VALUES(1,3);.  
2820: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
2830: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
2840: 32 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  2;.    SELECT * 
2850: 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b  FROM t1;.  }.} {
2860: 31 20 33 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 73  1 3}.do_test ins
2870: 65 72 74 34 2d 38 2e 32 20 7b 0a 20 20 65 78 65  ert4-8.2 {.  exe
2880: 63 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20  csql {.    DROP 
2890: 54 41 42 4c 45 20 49 46 20 45 58 49 53 54 53 20  TABLE IF EXISTS 
28a0: 74 31 3b 0a 20 20 20 20 44 52 4f 50 20 54 41 42  t1;.    DROP TAB
28b0: 4c 45 20 49 46 20 45 58 49 53 54 53 20 74 32 3b  LE IF EXISTS t2;
28c0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
28d0: 45 20 74 31 28 61 20 49 4e 54 45 47 45 52 20 50  E t1(a INTEGER P
28e0: 52 49 4d 41 52 59 20 4b 45 59 20 4f 4e 20 43 4f  RIMARY KEY ON CO
28f0: 4e 46 4c 49 43 54 20 52 45 50 4c 41 43 45 2c 20  NFLICT REPLACE, 
2900: 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  b);.    CREATE T
2910: 41 42 4c 45 20 74 32 28 78 2c 20 79 29 3b 0a 20  ABLE t2(x, y);. 
2920: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2930: 31 20 56 41 4c 55 45 53 28 31 2c 32 29 3b 0a 20  1 VALUES(1,2);. 
2940: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2950: 32 20 56 41 4c 55 45 53 28 31 2c 33 29 3b 0a 20  2 VALUES(1,3);. 
2960: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2970: 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  1 SELECT * FROM 
2980: 74 32 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  t2;.    SELECT *
2990: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20   FROM t1;.  }.} 
29a0: 7b 31 20 33 7d 0a 64 6f 5f 74 65 73 74 20 69 6e  {1 3}.do_test in
29b0: 73 65 72 74 34 2d 38 2e 33 20 7b 0a 20 20 65 78  sert4-8.3 {.  ex
29c0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50  ecsql {.    DROP
29d0: 20 54 41 42 4c 45 20 49 46 20 45 58 49 53 54 53   TABLE IF EXISTS
29e0: 20 74 31 3b 0a 20 20 20 20 44 52 4f 50 20 54 41   t1;.    DROP TA
29f0: 42 4c 45 20 49 46 20 45 58 49 53 54 53 20 74 32  BLE IF EXISTS t2
2a00: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
2a10: 4c 45 20 74 31 28 61 20 49 4e 54 45 47 45 52 20  LE t1(a INTEGER 
2a20: 50 52 49 4d 41 52 59 20 4b 45 59 20 4f 4e 20 43  PRIMARY KEY ON C
2a30: 4f 4e 46 4c 49 43 54 20 49 47 4e 4f 52 45 2c 20  ONFLICT IGNORE, 
2a40: 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  b);.    CREATE T
2a50: 41 42 4c 45 20 74 32 28 78 20 49 4e 54 45 47 45  ABLE t2(x INTEGE
2a60: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 4f 4e  R PRIMARY KEY ON
2a70: 20 43 4f 4e 46 4c 49 43 54 20 49 47 4e 4f 52 45   CONFLICT IGNORE
2a80: 2c 20 79 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , y);.    INSERT
2a90: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
2aa0: 31 2c 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  1,2);.    INSERT
2ab0: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
2ac0: 31 2c 33 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  1,3);.    INSERT
2ad0: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
2ae0: 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 53  * FROM t2;.    S
2af0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
2b00: 0a 20 20 7d 0a 7d 20 7b 31 20 32 7d 0a 64 6f 5f  .  }.} {1 2}.do_
2b10: 74 65 73 74 20 69 6e 73 65 72 74 34 2d 38 2e 34  test insert4-8.4
2b20: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
2b30: 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 49 46     DROP TABLE IF
2b40: 20 45 58 49 53 54 53 20 74 31 3b 0a 20 20 20 20   EXISTS t1;.    
2b50: 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58  DROP TABLE IF EX
2b60: 49 53 54 53 20 74 32 3b 0a 20 20 20 20 43 52 45  ISTS t2;.    CRE
2b70: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 49  ATE TABLE t1(a I
2b80: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
2b90: 45 59 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 49  EY ON CONFLICT I
2ba0: 47 4e 4f 52 45 2c 20 62 29 3b 0a 20 20 20 20 43  GNORE, b);.    C
2bb0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 78  REATE TABLE t2(x
2bc0: 2c 20 79 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , y);.    INSERT
2bd0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
2be0: 31 2c 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  1,2);.    INSERT
2bf0: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
2c00: 31 2c 33 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  1,3);.    INSERT
2c10: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
2c20: 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 53  * FROM t2;.    S
2c30: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
2c40: 0a 20 20 7d 0a 7d 20 7b 31 20 32 7d 0a 64 6f 5f  .  }.} {1 2}.do_
2c50: 74 65 73 74 20 69 6e 73 65 72 74 34 2d 38 2e 35  test insert4-8.5
2c60: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
2c70: 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 49 46     DROP TABLE IF
2c80: 20 45 58 49 53 54 53 20 74 31 3b 0a 20 20 20 20   EXISTS t1;.    
2c90: 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58  DROP TABLE IF EX
2ca0: 49 53 54 53 20 74 32 3b 0a 20 20 20 20 43 52 45  ISTS t2;.    CRE
2cb0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 49  ATE TABLE t1(a I
2cc0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
2cd0: 45 59 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 46  EY ON CONFLICT F
2ce0: 41 49 4c 2c 20 62 29 3b 0a 20 20 20 20 43 52 45  AIL, b);.    CRE
2cf0: 41 54 45 20 54 41 42 4c 45 20 74 32 28 78 20 49  ATE TABLE t2(x I
2d00: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
2d10: 45 59 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 46  EY ON CONFLICT F
2d20: 41 49 4c 2c 20 79 29 3b 0a 20 20 20 20 49 4e 53  AIL, y);.    INS
2d30: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
2d40: 45 53 28 31 2c 32 29 3b 0a 20 20 20 20 49 4e 53  ES(1,2);.    INS
2d50: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
2d60: 45 53 28 2d 39 39 2c 31 30 30 29 3b 0a 20 20 20  ES(-99,100);.   
2d70: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
2d80: 56 41 4c 55 45 53 28 31 2c 33 29 3b 0a 20 20 20  VALUES(1,3);.   
2d90: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
2da0: 31 3b 0a 20 20 7d 0a 20 20 63 61 74 63 68 73 71  1;.  }.  catchsq
2db0: 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  l {.    INSERT I
2dc0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 2a 20  NTO t1 SELECT * 
2dd0: 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b  FROM t2;.  }.} {
2de0: 31 20 7b 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  1 {UNIQUE constr
2df0: 61 69 6e 74 20 66 61 69 6c 65 64 3a 20 74 31 2e  aint failed: t1.
2e00: 61 7d 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 73 65  a}}.do_test inse
2e10: 72 74 34 2d 38 2e 36 20 7b 0a 20 20 65 78 65 63  rt4-8.6 {.  exec
2e20: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
2e30: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a   * FROM t1;.  }.
2e40: 7d 20 7b 2d 39 39 20 31 30 30 20 31 20 32 7d 20  } {-99 100 1 2} 
2e50: 0a 64 6f 5f 74 65 73 74 20 69 6e 73 65 72 74 34  .do_test insert4
2e60: 2d 38 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c  -8.7 {.  execsql
2e70: 20 7b 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c   {.    DROP TABL
2e80: 45 20 49 46 20 45 58 49 53 54 53 20 74 31 3b 0a  E IF EXISTS t1;.
2e90: 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 49      DROP TABLE I
2ea0: 46 20 45 58 49 53 54 53 20 74 32 3b 0a 20 20 20  F EXISTS t2;.   
2eb0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
2ec0: 28 61 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  (a INTEGER PRIMA
2ed0: 52 59 20 4b 45 59 20 4f 4e 20 43 4f 4e 46 4c 49  RY KEY ON CONFLI
2ee0: 43 54 20 41 42 4f 52 54 2c 20 62 29 3b 0a 20 20  CT ABORT, b);.  
2ef0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
2f00: 32 28 78 20 49 4e 54 45 47 45 52 20 50 52 49 4d  2(x INTEGER PRIM
2f10: 41 52 59 20 4b 45 59 20 4f 4e 20 43 4f 4e 46 4c  ARY KEY ON CONFL
2f20: 49 43 54 20 41 42 4f 52 54 2c 20 79 29 3b 0a 20  ICT ABORT, y);. 
2f30: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2f40: 31 20 56 41 4c 55 45 53 28 31 2c 32 29 3b 0a 20  1 VALUES(1,2);. 
2f50: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2f60: 32 20 56 41 4c 55 45 53 28 2d 39 39 2c 31 30 30  2 VALUES(-99,100
2f70: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
2f80: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 31 2c 33  TO t2 VALUES(1,3
2f90: 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  );.    SELECT * 
2fa0: 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 20 20 63  FROM t1;.  }.  c
2fb0: 61 74 63 68 73 71 6c 20 7b 0a 20 20 20 20 49 4e  atchsql {.    IN
2fc0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
2fd0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20  ECT * FROM t2;. 
2fe0: 20 7d 0a 7d 20 7b 31 20 7b 55 4e 49 51 55 45 20   }.} {1 {UNIQUE 
2ff0: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
3000: 64 3a 20 74 31 2e 61 7d 7d 0a 64 6f 5f 74 65 73  d: t1.a}}.do_tes
3010: 74 20 69 6e 73 65 72 74 34 2d 38 2e 38 20 7b 0a  t insert4-8.8 {.
3020: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
3030: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
3040: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 7d 20 0a 64  ;.  }.} {1 2} .d
3050: 6f 5f 74 65 73 74 20 69 6e 73 65 72 74 34 2d 38  o_test insert4-8
3060: 2e 39 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .9 {.  execsql {
3070: 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20  .    DROP TABLE 
3080: 49 46 20 45 58 49 53 54 53 20 74 31 3b 0a 20 20  IF EXISTS t1;.  
3090: 20 20 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20    DROP TABLE IF 
30a0: 45 58 49 53 54 53 20 74 32 3b 0a 20 20 20 20 43  EXISTS t2;.    C
30b0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
30c0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
30d0: 20 4b 45 59 20 4f 4e 20 43 4f 4e 46 4c 49 43 54   KEY ON CONFLICT
30e0: 20 52 4f 4c 4c 42 41 43 4b 2c 20 62 29 3b 0a 20   ROLLBACK, b);. 
30f0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
3100: 74 32 28 78 20 49 4e 54 45 47 45 52 20 50 52 49  t2(x INTEGER PRI
3110: 4d 41 52 59 20 4b 45 59 20 4f 4e 20 43 4f 4e 46  MARY KEY ON CONF
3120: 4c 49 43 54 20 52 4f 4c 4c 42 41 43 4b 2c 20 79  LICT ROLLBACK, y
3130: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
3140: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 32  TO t1 VALUES(1,2
3150: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
3160: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 2d 39 39  TO t2 VALUES(-99
3170: 2c 31 30 30 29 3b 0a 20 20 20 20 49 4e 53 45 52  ,100);.    INSER
3180: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
3190: 28 31 2c 33 29 3b 0a 20 20 20 20 53 45 4c 45 43  (1,3);.    SELEC
31a0: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d  T * FROM t1;.  }
31b0: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20 20  .  catchsql {.  
31c0: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53    BEGIN;.    INS
31d0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
31e0: 45 53 28 32 2c 33 29 3b 0a 20 20 20 20 49 4e 53  ES(2,3);.    INS
31f0: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
3200: 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20  CT * FROM t2;.  
3210: 7d 0a 7d 20 7b 31 20 7b 55 4e 49 51 55 45 20 63  }.} {1 {UNIQUE c
3220: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
3230: 3a 20 74 31 2e 61 7d 7d 0a 64 6f 5f 74 65 73 74  : t1.a}}.do_test
3240: 20 69 6e 73 65 72 74 34 2d 38 2e 31 30 20 7b 0a   insert4-8.10 {.
3250: 20 20 63 61 74 63 68 73 71 6c 20 7b 43 4f 4d 4d    catchsql {COMM
3260: 49 54 7d 0a 7d 20 7b 31 20 7b 63 61 6e 6e 6f 74  IT}.} {1 {cannot
3270: 20 63 6f 6d 6d 69 74 20 2d 20 6e 6f 20 74 72 61   commit - no tra
3280: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
3290: 76 65 7d 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 73  ve}}.do_test ins
32a0: 65 72 74 34 2d 38 2e 31 31 20 7b 0a 20 20 65 78  ert4-8.11 {.  ex
32b0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  ecsql {.    SELE
32c0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT * FROM t1;.  
32d0: 7d 0a 7d 20 7b 31 20 32 7d 20 0a 0a 64 6f 5f 74  }.} {1 2} ..do_t
32e0: 65 73 74 20 69 6e 73 65 72 74 34 2d 38 2e 32 31  est insert4-8.21
32f0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
3300: 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 49 46     DROP TABLE IF
3310: 20 45 58 49 53 54 53 20 74 31 3b 0a 20 20 20 20   EXISTS t1;.    
3320: 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58  DROP TABLE IF EX
3330: 49 53 54 53 20 74 32 3b 0a 20 20 20 20 43 52 45  ISTS t2;.    CRE
3340: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 49  ATE TABLE t1(a I
3350: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
3360: 45 59 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 52  EY ON CONFLICT R
3370: 45 50 4c 41 43 45 2c 20 62 29 3b 0a 20 20 20 20  EPLACE, b);.    
3380: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
3390: 78 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  x INTEGER PRIMAR
33a0: 59 20 4b 45 59 20 4f 4e 20 43 4f 4e 46 4c 49 43  Y KEY ON CONFLIC
33b0: 54 20 52 45 50 4c 41 43 45 2c 20 79 29 3b 0a 20  T REPLACE, y);. 
33c0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
33d0: 32 20 56 41 4c 55 45 53 28 31 2c 33 29 3b 0a 20  2 VALUES(1,3);. 
33e0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
33f0: 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  1 SELECT * FROM 
3400: 74 32 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  t2;.    SELECT *
3410: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20   FROM t1;.  }.} 
3420: 7b 31 20 33 7d 0a 64 6f 5f 74 65 73 74 20 69 6e  {1 3}.do_test in
3430: 73 65 72 74 34 2d 38 2e 32 32 20 7b 0a 20 20 65  sert4-8.22 {.  e
3440: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f  xecsql {.    DRO
3450: 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 53 54  P TABLE IF EXIST
3460: 53 20 74 31 3b 0a 20 20 20 20 44 52 4f 50 20 54  S t1;.    DROP T
3470: 41 42 4c 45 20 49 46 20 45 58 49 53 54 53 20 74  ABLE IF EXISTS t
3480: 32 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  2;.    CREATE TA
3490: 42 4c 45 20 74 31 28 61 20 49 4e 54 45 47 45 52  BLE t1(a INTEGER
34a0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 4f 4e 20   PRIMARY KEY ON 
34b0: 43 4f 4e 46 4c 49 43 54 20 49 47 4e 4f 52 45 2c  CONFLICT IGNORE,
34c0: 20 62 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   b);.    CREATE 
34d0: 54 41 42 4c 45 20 74 32 28 78 20 49 4e 54 45 47  TABLE t2(x INTEG
34e0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 4f  ER PRIMARY KEY O
34f0: 4e 20 43 4f 4e 46 4c 49 43 54 20 49 47 4e 4f 52  N CONFLICT IGNOR
3500: 45 2c 20 79 29 3b 0a 20 20 20 20 49 4e 53 45 52  E, y);.    INSER
3510: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
3520: 28 31 2c 33 29 3b 0a 20 20 20 20 49 4e 53 45 52  (1,3);.    INSER
3530: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
3540: 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20   * FROM t2;.    
3550: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
3560: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 33 7d 0a 64 6f  ;.  }.} {1 3}.do
3570: 5f 74 65 73 74 20 69 6e 73 65 72 74 34 2d 38 2e  _test insert4-8.
3580: 32 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  23 {.  execsql {
3590: 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20  .    DROP TABLE 
35a0: 49 46 20 45 58 49 53 54 53 20 74 31 3b 0a 20 20  IF EXISTS t1;.  
35b0: 20 20 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20    DROP TABLE IF 
35c0: 45 58 49 53 54 53 20 74 32 3b 0a 20 20 20 20 43  EXISTS t2;.    C
35d0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
35e0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
35f0: 20 4b 45 59 20 4f 4e 20 43 4f 4e 46 4c 49 43 54   KEY ON CONFLICT
3600: 20 41 42 4f 52 54 2c 20 62 29 3b 0a 20 20 20 20   ABORT, b);.    
3610: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
3620: 78 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  x INTEGER PRIMAR
3630: 59 20 4b 45 59 20 4f 4e 20 43 4f 4e 46 4c 49 43  Y KEY ON CONFLIC
3640: 54 20 41 42 4f 52 54 2c 20 79 29 3b 0a 20 20 20  T ABORT, y);.   
3650: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
3660: 56 41 4c 55 45 53 28 31 2c 33 29 3b 0a 20 20 20  VALUES(1,3);.   
3670: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
3680: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
3690: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
36a0: 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31  ROM t1;.  }.} {1
36b0: 20 33 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 73 65   3}.do_test inse
36c0: 72 74 34 2d 38 2e 32 34 20 7b 0a 20 20 65 78 65  rt4-8.24 {.  exe
36d0: 63 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20  csql {.    DROP 
36e0: 54 41 42 4c 45 20 49 46 20 45 58 49 53 54 53 20  TABLE IF EXISTS 
36f0: 74 31 3b 0a 20 20 20 20 44 52 4f 50 20 54 41 42  t1;.    DROP TAB
3700: 4c 45 20 49 46 20 45 58 49 53 54 53 20 74 32 3b  LE IF EXISTS t2;
3710: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
3720: 45 20 74 31 28 61 20 49 4e 54 45 47 45 52 20 50  E t1(a 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 62 29 3b  NFLICT FAIL, b);
3750: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
3760: 45 20 74 32 28 78 20 49 4e 54 45 47 45 52 20 50  E t2(x INTEGER P
3770: 52 49 4d 41 52 59 20 4b 45 59 20 4f 4e 20 43 4f  RIMARY KEY ON CO
3780: 4e 46 4c 49 43 54 20 46 41 49 4c 2c 20 79 29 3b  NFLICT FAIL, y);
3790: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
37a0: 20 74 32 20 56 41 4c 55 45 53 28 31 2c 33 29 3b   t2 VALUES(1,3);
37b0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
37c0: 20 74 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   t1 SELECT * FRO
37d0: 4d 20 74 32 3b 0a 20 20 20 20 53 45 4c 45 43 54  M t2;.    SELECT
37e0: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a   * FROM t1;.  }.
37f0: 7d 20 7b 31 20 33 7d 0a 64 6f 5f 74 65 73 74 20  } {1 3}.do_test 
3800: 69 6e 73 65 72 74 34 2d 38 2e 32 35 20 7b 0a 20  insert4-8.25 {. 
3810: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44   execsql {.    D
3820: 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49  ROP TABLE IF EXI
3830: 53 54 53 20 74 31 3b 0a 20 20 20 20 44 52 4f 50  STS t1;.    DROP
3840: 20 54 41 42 4c 45 20 49 46 20 45 58 49 53 54 53   TABLE IF EXISTS
3850: 20 74 32 3b 0a 20 20 20 20 43 52 45 41 54 45 20   t2;.    CREATE 
3860: 54 41 42 4c 45 20 74 31 28 61 20 49 4e 54 45 47  TABLE t1(a INTEG
3870: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 4f  ER PRIMARY KEY O
3880: 4e 20 43 4f 4e 46 4c 49 43 54 20 52 4f 4c 4c 42  N CONFLICT ROLLB
3890: 41 43 4b 2c 20 62 29 3b 0a 20 20 20 20 43 52 45  ACK, b);.    CRE
38a0: 41 54 45 20 54 41 42 4c 45 20 74 32 28 78 20 49  ATE TABLE t2(x I
38b0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
38c0: 45 59 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 52  EY ON CONFLICT R
38d0: 4f 4c 4c 42 41 43 4b 2c 20 79 29 3b 0a 20 20 20  OLLBACK, y);.   
38e0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
38f0: 56 41 4c 55 45 53 28 31 2c 33 29 3b 0a 20 20 20  VALUES(1,3);.   
3900: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
3910: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
3920: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
3930: 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31  ROM t1;.  }.} {1
3940: 20 33 7d 0a 0a 0a 66 69 6e 69 73 68 5f 74 65 73   3}...finish_tes
3950: 74 0a                                            t.