/ Hex Artifact Content
Login

Artifact d75c3869f1d8249d54e67774e7a811391e8d2a9e:


0000: 23 20 32 30 31 35 20 4d 61 72 63 68 20 32 30 0a  # 2015 March 20.
0010: 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64  #.# The author d
0020: 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67  isclaims copyrig
0030: 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63  ht to this sourc
0040: 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63  e code.  In plac
0050: 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e  e of.# a legal n
0060: 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61  otice, here is a
0070: 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20   blessing:.#.#  
0080: 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f    May you do goo
0090: 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a  d and not evil..
00a0: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e  #    May you fin
00b0: 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f  d forgiveness fo
00c0: 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66  r yourself and f
00d0: 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23  orgive others..#
00e0: 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72      May you shar
00f0: 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20  e freely, never 
0100: 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  taking more than
0110: 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a   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 0a 23 0a 23 20 54 68 65 20 74 65  *****.#.# The te
0170: 73 74 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65  sts in this file
0180: 20 65 6e 73 75 72 65 20 74 68 61 74 20 73 6f 72   ensure that sor
0190: 74 65 72 20 6f 62 6a 65 63 74 73 20 61 72 65 20  ter objects are 
01a0: 75 73 65 64 20 62 79 20 0a 23 20 22 49 4e 53 45  used by .# "INSE
01b0: 52 54 20 49 4e 54 4f 20 2e 2e 2e 20 53 45 4c 45  RT INTO ... SELE
01c0: 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e  CT ..." statemen
01d0: 74 73 20 77 68 65 6e 20 70 6f 73 73 69 62 6c 65  ts when possible
01e0: 2e 0a 23 0a 0a 73 65 74 20 74 65 73 74 64 69 72  ..#..set testdir
01f0: 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24   [file dirname $
0200: 61 72 67 76 30 5d 0a 73 6f 75 72 63 65 20 24 74  argv0].source $t
0210: 65 73 74 64 69 72 2f 74 65 73 74 65 72 2e 74 63  estdir/tester.tc
0220: 6c 0a 73 65 74 20 74 65 73 74 70 72 65 66 69 78  l.set testprefix
0230: 20 69 6e 73 65 72 74 36 0a 0a 23 20 52 65 74 75   insert6..# Retu
0240: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
0250: 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20 69   OP_SorterOpen i
0260: 6e 73 74 72 75 63 74 69 6f 6e 73 20 69 6e 20 74  nstructions in t
0270: 68 65 20 53 51 4c 20 70 61 73 73 65 64 20 61 73  he SQL passed as
0280: 0a 23 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  .# the only argu
0290: 6d 65 6e 74 20 69 66 20 69 74 20 69 73 20 63 6f  ment if it is co
02a0: 6d 70 69 6c 65 64 20 75 73 69 6e 67 20 63 6f 6e  mpiled using con
02b0: 6e 65 63 74 69 6f 6e 20 5b 64 62 5d 2e 0a 23 0a  nection [db]..#.
02c0: 70 72 6f 63 20 73 6f 72 74 65 72 5f 63 6f 75 6e  proc sorter_coun
02d0: 74 20 7b 73 71 6c 7d 20 7b 0a 20 20 73 65 74 20  t {sql} {.  set 
02e0: 72 65 73 20 30 0a 20 20 64 62 20 63 61 63 68 65  res 0.  db cache
02f0: 20 66 6c 75 73 68 0a 20 20 64 62 20 65 76 61 6c   flush.  db eval
0300: 20 22 45 58 50 4c 41 49 4e 20 24 73 71 6c 22 20   "EXPLAIN $sql" 
0310: 78 20 7b 0a 20 20 20 20 69 66 20 7b 24 78 28 6f  x {.    if {$x(o
0320: 70 63 6f 64 65 29 20 3d 3d 20 22 53 6f 72 74 65  pcode) == "Sorte
0330: 72 4f 70 65 6e 22 7d 20 7b 20 69 6e 63 72 20 72  rOpen"} { incr r
0340: 65 73 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72  es }.  }.  retur
0350: 6e 20 24 72 65 73 0a 7d 0a 0a 0a 23 2d 2d 2d 2d  n $res.}...#----
0360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
03a0: 2d 2d 2d 2d 2d 0a 23 20 57 61 72 6d 20 62 6f 64  -----.# Warm bod
03b0: 79 20 74 65 73 74 2e 20 54 68 69 73 20 76 65 72  y test. This ver
03c0: 69 66 69 65 73 20 74 68 61 74 20 74 68 65 20 73  ifies that the s
03d0: 69 6d 70 6c 65 73 74 20 63 61 73 65 20 77 6f 72  implest case wor
03e0: 6b 73 20 66 6f 72 20 62 6f 74 68 0a 23 20 72 65  ks for both.# re
03f0: 67 75 6c 61 72 20 61 6e 64 20 57 49 54 48 4f 55  gular and WITHOU
0400: 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 2e 0a  T ROWID tables..
0410: 23 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  #.do_execsql_tes
0420: 74 20 31 2e 31 20 7b 0a 20 20 43 52 45 41 54 45  t 1.1 {.  CREATE
0430: 20 54 41 42 4c 45 20 74 32 28 78 20 55 4e 49 51   TABLE t2(x UNIQ
0440: 55 45 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 49  UE ON CONFLICT I
0450: 47 4e 4f 52 45 2c 20 79 2c 20 7a 29 3b 0a 20 20  GNORE, y, z);.  
0460: 57 49 54 48 20 63 6e 74 28 78 29 20 41 53 20 28  WITH cnt(x) AS (
0470: 20 53 45 4c 45 43 54 20 30 20 55 4e 49 4f 4e 20   SELECT 0 UNION 
0480: 41 4c 4c 20 53 45 4c 45 43 54 20 78 2b 31 20 46  ALL SELECT x+1 F
0490: 52 4f 4d 20 63 6e 74 20 57 48 45 52 45 20 78 3c  ROM cnt WHERE x<
04a0: 39 39 20 29 0a 20 20 49 4e 53 45 52 54 20 49 4e  99 ).  INSERT IN
04b0: 54 4f 20 74 32 20 53 45 4c 45 43 54 20 61 62 73  TO t2 SELECT abs
04c0: 28 72 61 6e 64 6f 6d 28 29 29 2c 20 61 62 73 28  (random()), abs(
04d0: 72 61 6e 64 6f 6d 28 29 29 2c 20 61 62 73 28 72  random()), abs(r
04e0: 61 6e 64 6f 6d 28 29 29 20 46 52 4f 4d 20 63 6e  andom()) FROM cn
04f0: 74 3b 0a 7d 0a 0a 66 6f 72 65 61 63 68 20 7b 74  t;.}..foreach {t
0500: 6e 20 6e 53 6f 72 74 20 73 63 68 65 6d 61 7d 20  n nSort schema} 
0510: 7b 0a 20 20 31 20 33 20 7b 20 43 52 45 41 54 45  {.  1 3 { CREATE
0520: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20   TABLE t1(a, b, 
0530: 63 29 20 7d 0a 20 20 32 20 34 20 7b 20 43 52 45  c) }.  2 4 { CRE
0540: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 50  ATE TABLE t1(a P
0550: 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 2c 20 63  RIMARY KEY, b, c
0560: 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  ) WITHOUT ROWID 
0570: 7d 0a 7d 20 7b 0a 0a 20 20 64 6f 5f 74 65 73 74  }.} {..  do_test
0580: 20 31 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 65   1.$tn.1 {.    e
0590: 78 65 63 73 71 6c 20 7b 20 44 52 4f 50 20 54 41  xecsql { DROP TA
05a0: 42 4c 45 20 49 46 20 45 58 49 53 54 53 20 74 31  BLE IF EXISTS t1
05b0: 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 24   }.    execsql $
05c0: 73 63 68 65 6d 61 20 0a 20 20 7d 20 7b 7d 0a 0a  schema .  } {}..
05d0: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
05e0: 74 20 31 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20  t 1.$tn.2 {.    
05f0: 43 52 45 41 54 45 20 49 4e 44 45 58 20 74 31 61  CREATE INDEX t1a
0600: 20 4f 4e 20 74 31 28 61 29 3b 0a 20 20 20 20 43   ON t1(a);.    C
0610: 52 45 41 54 45 20 49 4e 44 45 58 20 74 31 62 20  REATE INDEX t1b 
0620: 4f 4e 20 74 31 28 62 29 3b 0a 20 20 20 20 43 52  ON t1(b);.    CR
0630: 45 41 54 45 20 49 4e 44 45 58 20 74 31 63 20 4f  EATE INDEX t1c O
0640: 4e 20 74 31 28 63 29 3b 0a 20 20 7d 0a 0a 20 20  N t1(c);.  }..  
0650: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
0660: 31 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20 49 4e  1.$tn.3 {.    IN
0670: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
0680: 45 43 54 20 78 2c 20 79 2c 20 7a 20 46 52 4f 4d  ECT x, y, z FROM
0690: 20 74 32 3b 0a 20 20 20 20 50 52 41 47 4d 41 20   t2;.    PRAGMA 
06a0: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b  integrity_check;
06b0: 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  .    SELECT coun
06c0: 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  t(*) FROM t1;.  
06d0: 7d 20 7b 6f 6b 20 31 30 30 7d 0a 20 20 0a 20 20  } {ok 100}.  .  
06e0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
06f0: 31 2e 24 74 6e 2e 34 20 7b 0a 20 20 20 20 49 4e  1.$tn.4 {.    IN
0700: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
0710: 45 43 54 20 2d 78 2c 20 79 2c 20 7a 20 46 52 4f  ECT -x, y, z FRO
0720: 4d 20 74 32 3b 0a 20 20 20 20 50 52 41 47 4d 41  M t2;.    PRAGMA
0730: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
0740: 3b 0a 20 20 7d 20 7b 6f 6b 7d 0a 0a 20 20 64 6f  ;.  } {ok}..  do
0750: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 2e  _execsql_test 1.
0760: 24 74 6e 2e 35 20 7b 0a 20 20 20 20 53 45 4c 45  $tn.5 {.    SELE
0770: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
0780: 20 74 31 3b 0a 20 20 7d 20 7b 32 30 30 7d 0a 0a   t1;.  } {200}..
0790: 20 20 64 6f 5f 74 65 73 74 20 31 2e 24 74 6e 2e    do_test 1.$tn.
07a0: 36 20 7b 0a 20 20 20 20 73 6f 72 74 65 72 5f 63  6 {.    sorter_c
07b0: 6f 75 6e 74 20 7b 20 49 4e 53 45 52 54 20 49 4e  ount { INSERT IN
07c0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 2a 20 46  TO t1 SELECT * F
07d0: 52 4f 4d 20 74 32 20 7d 0a 20 20 7d 20 24 6e 53  ROM t2 }.  } $nS
07e0: 6f 72 74 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  ort.}..#--------
07f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0830: 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  -.# The followin
0840: 67 20 74 65 73 74 20 63 61 73 65 73 20 63 68 65  g test cases che
0850: 63 6b 20 74 68 61 74 20 74 68 65 20 73 6f 72 74  ck that the sort
0860: 65 72 73 20 61 72 65 20 64 69 73 61 62 6c 65 64  ers are disabled
0870: 20 69 66 20 61 6e 79 0a 23 20 6f 66 20 74 68 65   if any.# of the
0880: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
0890: 72 75 65 3a 0a 23 0a 23 20 20 20 32 2e 31 3a 20  rue:.#.#   2.1: 
08a0: 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 70  The statement sp
08b0: 65 63 69 66 69 65 73 20 22 4f 4e 20 43 4f 4e 46  ecifies "ON CONF
08c0: 4c 49 43 54 20 46 41 49 4c 22 2c 20 22 49 47 4e  LICT FAIL", "IGN
08d0: 4f 52 45 22 20 6f 72 20 22 52 45 50 4c 41 43 45  ORE" or "REPLACE
08e0: 22 2e 0a 23 0a 23 20 20 20 32 2e 32 3a 20 54 68  "..#.#   2.2: Th
08f0: 65 20 73 74 61 74 65 6d 65 6e 74 20 64 6f 65 73  e statement does
0900: 20 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c 79 20   not explicitly 
0910: 73 70 65 63 69 66 79 20 61 20 63 6f 6e 66 6c 69  specify a confli
0920: 63 74 20 6d 6f 64 65 20 61 6e 64 20 0a 23 20 20  ct mode and .#  
0930: 20 20 20 20 20 20 74 68 65 72 65 20 61 72 65 20        there are 
0940: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 50 52 49 4d  one or more PRIM
0950: 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55  ARY KEY or UNIQU
0960: 45 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 69  E constraints wi
0970: 74 68 20 0a 23 20 20 20 20 20 20 20 20 22 4f 52  th .#        "OR
0980: 20 46 41 49 4c 22 2c 20 22 4f 52 20 49 47 4e 4f   FAIL", "OR IGNO
0990: 52 45 22 20 6f 72 20 22 4f 52 20 52 45 50 4c 41  RE" or "OR REPLA
09a0: 43 45 22 20 61 73 20 74 68 65 20 63 6f 6e 66 6c  CE" as the confl
09b0: 69 63 74 20 68 61 6e 64 6c 69 6e 67 20 0a 23 20  ict handling .# 
09c0: 20 20 20 20 20 20 20 6d 6f 64 65 2e 0a 23 0a 23         mode..#.#
09d0: 20 20 20 32 2e 33 3a 20 54 68 65 72 65 20 61 72     2.3: There ar
09e0: 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 49 4e  e one or more IN
09f0: 53 45 52 54 20 74 72 69 67 67 65 72 73 20 6f 6e  SERT triggers on
0a00: 20 74 68 65 20 74 61 72 67 65 74 20 74 61 62 6c   the target tabl
0a10: 65 2e 0a 23 0a 23 20 20 20 32 2e 34 3a 20 54 68  e..#.#   2.4: Th
0a20: 65 20 74 61 72 67 65 74 20 74 61 62 6c 65 20 69  e target table i
0a30: 73 20 74 68 65 20 70 61 72 65 6e 74 20 6f 72 20  s the parent or 
0a40: 63 68 69 6c 64 20 6f 66 20 61 6e 20 46 4b 20 63  child of an FK c
0a50: 6f 6e 73 74 72 61 69 6e 74 2e 0a 23 0a 0a 64 6f  onstraint..#..do
0a60: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 32 2e  _execsql_test 2.
0a70: 31 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20 54  1.1 {.  CREATE T
0a80: 41 42 4c 45 20 78 31 28 61 2c 20 62 2c 20 63 29  ABLE x1(a, b, c)
0a90: 3b 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  ;.  CREATE INDEX
0aa0: 20 78 31 61 20 4f 4e 20 78 31 28 61 29 3b 0a 0a   x1a ON x1(a);..
0ab0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78    CREATE TABLE x
0ac0: 32 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20 43 52  2(a, b, c);.  CR
0ad0: 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45  EATE UNIQUE INDE
0ae0: 58 20 78 32 61 20 4f 4e 20 78 32 28 61 29 3b 0a  X x2a ON x2(a);.
0af0: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
0b00: 78 33 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59  x3(a PRIMARY KEY
0b10: 2c 20 62 2c 20 63 29 3b 0a 20 20 43 52 45 41 54  , b, c);.  CREAT
0b20: 45 20 54 41 42 4c 45 20 78 34 28 61 20 50 52 49  E TABLE x4(a PRI
0b30: 4d 41 52 59 20 4b 45 59 2c 20 62 2c 20 63 29 20  MARY KEY, b, c) 
0b40: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 3b 0a 7d  WITHOUT ROWID;.}
0b50: 0a 0a 64 6f 5f 74 65 73 74 20 32 2e 31 2e 32 20  ..do_test 2.1.2 
0b60: 7b 20 73 6f 72 74 65 72 5f 63 6f 75 6e 74 20 7b  { sorter_count {
0b70: 20 49 4e 53 45 52 54 20 4f 52 20 52 45 50 4c 41   INSERT OR REPLA
0b80: 43 45 20 49 4e 54 4f 20 78 31 20 53 45 4c 45 43  CE INTO x1 SELEC
0b90: 54 20 2a 20 46 52 4f 4d 20 74 32 20 7d 20 7d 20  T * FROM t2 } } 
0ba0: 30 0a 64 6f 5f 74 65 73 74 20 32 2e 31 2e 33 20  0.do_test 2.1.3 
0bb0: 7b 20 73 6f 72 74 65 72 5f 63 6f 75 6e 74 20 7b  { sorter_count {
0bc0: 20 49 4e 53 45 52 54 20 4f 52 20 52 45 50 4c 41   INSERT OR REPLA
0bd0: 43 45 20 49 4e 54 4f 20 78 32 20 53 45 4c 45 43  CE INTO x2 SELEC
0be0: 54 20 2a 20 46 52 4f 4d 20 74 32 20 7d 20 7d 20  T * FROM t2 } } 
0bf0: 30 0a 64 6f 5f 74 65 73 74 20 32 2e 31 2e 34 20  0.do_test 2.1.4 
0c00: 7b 20 73 6f 72 74 65 72 5f 63 6f 75 6e 74 20 7b  { sorter_count {
0c10: 20 49 4e 53 45 52 54 20 4f 52 20 52 45 50 4c 41   INSERT OR REPLA
0c20: 43 45 20 49 4e 54 4f 20 78 33 20 53 45 4c 45 43  CE INTO x3 SELEC
0c30: 54 20 2a 20 46 52 4f 4d 20 74 32 20 7d 20 7d 20  T * FROM t2 } } 
0c40: 30 0a 64 6f 5f 74 65 73 74 20 32 2e 31 2e 35 20  0.do_test 2.1.5 
0c50: 7b 20 73 6f 72 74 65 72 5f 63 6f 75 6e 74 20 7b  { sorter_count {
0c60: 20 49 4e 53 45 52 54 20 4f 52 20 52 45 50 4c 41   INSERT OR REPLA
0c70: 43 45 20 49 4e 54 4f 20 78 34 20 53 45 4c 45 43  CE INTO x4 SELEC
0c80: 54 20 2a 20 46 52 4f 4d 20 74 32 20 7d 20 7d 20  T * FROM t2 } } 
0c90: 30 0a 0a 64 6f 5f 74 65 73 74 20 32 2e 31 2e 36  0..do_test 2.1.6
0ca0: 20 7b 20 73 6f 72 74 65 72 5f 63 6f 75 6e 74 20   { sorter_count 
0cb0: 7b 20 49 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f  { INSERT OR IGNO
0cc0: 52 45 20 49 4e 54 4f 20 78 31 20 53 45 4c 45 43  RE INTO x1 SELEC
0cd0: 54 20 2a 20 46 52 4f 4d 20 74 32 20 7d 20 7d 20  T * FROM t2 } } 
0ce0: 30 0a 64 6f 5f 74 65 73 74 20 32 2e 31 2e 37 20  0.do_test 2.1.7 
0cf0: 7b 20 73 6f 72 74 65 72 5f 63 6f 75 6e 74 20 7b  { sorter_count {
0d00: 20 49 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52   INSERT OR IGNOR
0d10: 45 20 49 4e 54 4f 20 78 32 20 53 45 4c 45 43 54  E INTO x2 SELECT
0d20: 20 2a 20 46 52 4f 4d 20 74 32 20 7d 20 7d 20 30   * FROM t2 } } 0
0d30: 0a 64 6f 5f 74 65 73 74 20 32 2e 31 2e 38 20 7b  .do_test 2.1.8 {
0d40: 20 73 6f 72 74 65 72 5f 63 6f 75 6e 74 20 7b 20   sorter_count { 
0d50: 49 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45  INSERT OR IGNORE
0d60: 20 49 4e 54 4f 20 78 33 20 53 45 4c 45 43 54 20   INTO x3 SELECT 
0d70: 2a 20 46 52 4f 4d 20 74 32 20 7d 20 7d 20 30 0a  * FROM t2 } } 0.
0d80: 64 6f 5f 74 65 73 74 20 32 2e 31 2e 39 20 7b 20  do_test 2.1.9 { 
0d90: 73 6f 72 74 65 72 5f 63 6f 75 6e 74 20 7b 20 49  sorter_count { I
0da0: 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20  NSERT OR IGNORE 
0db0: 49 4e 54 4f 20 78 34 20 53 45 4c 45 43 54 20 2a  INTO x4 SELECT *
0dc0: 20 46 52 4f 4d 20 74 32 20 7d 20 7d 20 30 0a 0a   FROM t2 } } 0..
0dd0: 64 6f 5f 74 65 73 74 20 32 2e 31 2e 31 30 20 7b  do_test 2.1.10 {
0de0: 20 73 6f 72 74 65 72 5f 63 6f 75 6e 74 20 7b 20   sorter_count { 
0df0: 49 4e 53 45 52 54 20 4f 52 20 46 41 49 4c 20 49  INSERT OR FAIL I
0e00: 4e 54 4f 20 78 31 20 53 45 4c 45 43 54 20 2a 20  NTO x1 SELECT * 
0e10: 46 52 4f 4d 20 74 32 20 7d 20 7d 20 30 0a 64 6f  FROM t2 } } 0.do
0e20: 5f 74 65 73 74 20 32 2e 31 2e 31 31 20 7b 20 73  _test 2.1.11 { s
0e30: 6f 72 74 65 72 5f 63 6f 75 6e 74 20 7b 20 49 4e  orter_count { IN
0e40: 53 45 52 54 20 4f 52 20 46 41 49 4c 20 49 4e 54  SERT OR FAIL INT
0e50: 4f 20 78 32 20 53 45 4c 45 43 54 20 2a 20 46 52  O x2 SELECT * FR
0e60: 4f 4d 20 74 32 20 7d 20 7d 20 30 0a 64 6f 5f 74  OM t2 } } 0.do_t
0e70: 65 73 74 20 32 2e 31 2e 31 32 20 7b 20 73 6f 72  est 2.1.12 { sor
0e80: 74 65 72 5f 63 6f 75 6e 74 20 7b 20 49 4e 53 45  ter_count { INSE
0e90: 52 54 20 4f 52 20 46 41 49 4c 20 49 4e 54 4f 20  RT OR FAIL INTO 
0ea0: 78 33 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  x3 SELECT * FROM
0eb0: 20 74 32 20 7d 20 7d 20 30 0a 64 6f 5f 74 65 73   t2 } } 0.do_tes
0ec0: 74 20 32 2e 31 2e 31 33 20 7b 20 73 6f 72 74 65  t 2.1.13 { sorte
0ed0: 72 5f 63 6f 75 6e 74 20 7b 20 49 4e 53 45 52 54  r_count { INSERT
0ee0: 20 4f 52 20 46 41 49 4c 20 49 4e 54 4f 20 78 34   OR FAIL INTO x4
0ef0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0f00: 32 20 7d 20 7d 20 30 0a 0a 64 6f 5f 74 65 73 74  2 } } 0..do_test
0f10: 20 32 2e 31 2e 31 34 20 7b 20 73 6f 72 74 65 72   2.1.14 { sorter
0f20: 5f 63 6f 75 6e 74 20 7b 20 49 4e 53 45 52 54 20  _count { INSERT 
0f30: 4f 52 20 52 4f 4c 4c 42 41 43 4b 20 49 4e 54 4f  OR ROLLBACK INTO
0f40: 20 78 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   x1 SELECT * FRO
0f50: 4d 20 74 32 7d 20 7d 20 31 0a 64 6f 5f 74 65 73  M t2} } 1.do_tes
0f60: 74 20 32 2e 31 2e 31 35 20 7b 20 73 6f 72 74 65  t 2.1.15 { sorte
0f70: 72 5f 63 6f 75 6e 74 20 7b 20 49 4e 53 45 52 54  r_count { INSERT
0f80: 20 4f 52 20 52 4f 4c 4c 42 41 43 4b 20 49 4e 54   OR ROLLBACK INT
0f90: 4f 20 78 32 20 53 45 4c 45 43 54 20 2a 20 46 52  O x2 SELECT * FR
0fa0: 4f 4d 20 74 32 7d 20 7d 20 31 0a 64 6f 5f 74 65  OM t2} } 1.do_te
0fb0: 73 74 20 32 2e 31 2e 31 36 20 7b 20 73 6f 72 74  st 2.1.16 { sort
0fc0: 65 72 5f 63 6f 75 6e 74 20 7b 20 49 4e 53 45 52  er_count { INSER
0fd0: 54 20 4f 52 20 52 4f 4c 4c 42 41 43 4b 20 49 4e  T OR ROLLBACK IN
0fe0: 54 4f 20 78 33 20 53 45 4c 45 43 54 20 2a 20 46  TO x3 SELECT * F
0ff0: 52 4f 4d 20 74 32 7d 20 7d 20 31 0a 64 6f 5f 74  ROM t2} } 1.do_t
1000: 65 73 74 20 32 2e 31 2e 31 37 20 7b 20 73 6f 72  est 2.1.17 { sor
1010: 74 65 72 5f 63 6f 75 6e 74 20 7b 20 49 4e 53 45  ter_count { INSE
1020: 52 54 20 4f 52 20 52 4f 4c 4c 42 41 43 4b 20 49  RT OR ROLLBACK I
1030: 4e 54 4f 20 78 34 20 53 45 4c 45 43 54 20 2a 20  NTO x4 SELECT * 
1040: 46 52 4f 4d 20 74 32 7d 20 7d 20 31 0a 0a 64 6f  FROM t2} } 1..do
1050: 5f 74 65 73 74 20 32 2e 31 2e 31 38 20 7b 20 73  _test 2.1.18 { s
1060: 6f 72 74 65 72 5f 63 6f 75 6e 74 20 7b 20 49 4e  orter_count { IN
1070: 53 45 52 54 20 4f 52 20 41 42 4f 52 54 20 49 4e  SERT OR ABORT IN
1080: 54 4f 20 78 31 20 53 45 4c 45 43 54 20 2a 20 46  TO x1 SELECT * F
1090: 52 4f 4d 20 74 32 20 7d 20 7d 20 31 0a 64 6f 5f  ROM t2 } } 1.do_
10a0: 74 65 73 74 20 32 2e 31 2e 31 39 20 7b 20 73 6f  test 2.1.19 { so
10b0: 72 74 65 72 5f 63 6f 75 6e 74 20 7b 20 49 4e 53  rter_count { INS
10c0: 45 52 54 20 4f 52 20 41 42 4f 52 54 20 49 4e 54  ERT OR ABORT INT
10d0: 4f 20 78 32 20 53 45 4c 45 43 54 20 2a 20 46 52  O x2 SELECT * FR
10e0: 4f 4d 20 74 32 20 7d 20 7d 20 31 0a 64 6f 5f 74  OM t2 } } 1.do_t
10f0: 65 73 74 20 32 2e 31 2e 32 30 20 7b 20 73 6f 72  est 2.1.20 { sor
1100: 74 65 72 5f 63 6f 75 6e 74 20 7b 20 49 4e 53 45  ter_count { INSE
1110: 52 54 20 4f 52 20 41 42 4f 52 54 20 49 4e 54 4f  RT OR ABORT INTO
1120: 20 78 33 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   x3 SELECT * FRO
1130: 4d 20 74 32 20 7d 20 7d 20 31 0a 64 6f 5f 74 65  M t2 } } 1.do_te
1140: 73 74 20 32 2e 31 2e 32 31 20 7b 20 73 6f 72 74  st 2.1.21 { sort
1150: 65 72 5f 63 6f 75 6e 74 20 7b 20 49 4e 53 45 52  er_count { INSER
1160: 54 20 4f 52 20 41 42 4f 52 54 20 49 4e 54 4f 20  T OR ABORT INTO 
1170: 78 34 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  x4 SELECT * FROM
1180: 20 74 32 20 7d 20 7d 20 31 0a 0a 0a 66 6f 72 65   t2 } } 1...fore
1190: 61 63 68 20 7b 74 6e 20 73 63 6f 75 6e 74 20 73  ach {tn scount s
11a0: 63 68 65 6d 61 7d 20 7b 0a 20 20 32 2e 31 20 20  chema} {.  2.1  
11b0: 20 30 20 7b 20 43 52 45 41 54 45 20 54 41 42 4c   0 { CREATE TABL
11c0: 45 20 74 31 28 61 20 55 4e 49 51 55 45 20 4f 4e  E t1(a UNIQUE ON
11d0: 20 43 4f 4e 46 4c 49 43 54 20 46 41 49 4c 2c 20   CONFLICT FAIL, 
11e0: 62 2c 20 63 29 20 7d 0a 20 20 32 2e 32 20 20 20  b, c) }.  2.2   
11f0: 30 20 7b 20 43 52 45 41 54 45 20 54 41 42 4c 45  0 { CREATE TABLE
1200: 20 74 31 28 61 2c 20 62 20 55 4e 49 51 55 45 20   t1(a, b UNIQUE 
1210: 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 49 47 4e 4f  ON CONFLICT IGNO
1220: 52 45 2c 20 63 29 20 7d 0a 20 20 32 2e 33 20 20  RE, c) }.  2.3  
1230: 20 30 20 7b 20 43 52 45 41 54 45 20 54 41 42 4c   0 { CREATE TABL
1240: 45 20 74 31 28 61 2c 20 62 2c 20 63 20 55 4e 49  E t1(a, b, c UNI
1250: 51 55 45 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20  QUE ON CONFLICT 
1260: 52 45 50 4c 41 43 45 29 20 7d 0a 20 20 32 2e 34  REPLACE) }.  2.4
1270: 20 20 20 30 20 7b 20 43 52 45 41 54 45 20 54 41     0 { CREATE TA
1280: 42 4c 45 20 74 31 28 61 20 50 52 49 4d 41 52 59  BLE t1(a PRIMARY
1290: 20 4b 45 59 20 4f 4e 20 43 4f 4e 46 4c 49 43 54   KEY ON CONFLICT
12a0: 20 46 41 49 4c 2c 20 62 2c 20 63 29 20 7d 0a 20   FAIL, b, c) }. 
12b0: 20 32 2e 35 20 20 20 30 20 7b 20 43 52 45 41 54   2.5   0 { CREAT
12c0: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 20  E TABLE t1(a, b 
12d0: 50 52 49 4d 41 52 59 20 4b 45 59 20 4f 4e 20 43  PRIMARY KEY ON C
12e0: 4f 4e 46 4c 49 43 54 20 49 47 4e 4f 52 45 2c 20  ONFLICT IGNORE, 
12f0: 63 29 20 7d 0a 20 20 32 2e 36 20 20 20 30 20 7b  c) }.  2.6   0 {
1300: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
1310: 28 61 2c 20 62 2c 20 63 20 50 52 49 4d 41 52 59  (a, b, c PRIMARY
1320: 20 4b 45 59 20 4f 4e 20 43 4f 4e 46 4c 49 43 54   KEY ON CONFLICT
1330: 20 52 45 50 4c 41 43 45 29 20 7d 0a 20 20 32 2e   REPLACE) }.  2.
1340: 37 20 20 20 30 20 7b 20 0a 20 20 20 20 43 52 45  7   0 { .    CRE
1350: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 50  ATE TABLE t1(a P
1360: 52 49 4d 41 52 59 20 4b 45 59 20 4f 4e 20 43 4f  RIMARY KEY ON CO
1370: 4e 46 4c 49 43 54 20 46 41 49 4c 2c 20 62 2c 20  NFLICT FAIL, b, 
1380: 63 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  c) WITHOUT ROWID
1390: 0a 20 20 7d 0a 20 20 32 2e 38 20 20 20 30 20 7b  .  }.  2.8   0 {
13a0: 20 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42   .    CREATE TAB
13b0: 4c 45 20 74 31 28 61 2c 20 62 20 50 52 49 4d 41  LE t1(a, b PRIMA
13c0: 52 59 20 4b 45 59 20 4f 4e 20 43 4f 4e 46 4c 49  RY KEY ON CONFLI
13d0: 43 54 20 49 47 4e 4f 52 45 2c 20 63 29 20 57 49  CT IGNORE, c) WI
13e0: 54 48 4f 55 54 20 52 4f 57 49 44 0a 20 20 7d 0a  THOUT ROWID.  }.
13f0: 20 20 32 2e 39 20 20 20 30 20 7b 20 0a 20 20 20    2.9   0 { .   
1400: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
1410: 28 61 2c 20 62 2c 20 63 20 50 52 49 4d 41 52 59  (a, b, c PRIMARY
1420: 20 4b 45 59 20 4f 4e 20 43 4f 4e 46 4c 49 43 54   KEY ON CONFLICT
1430: 20 52 45 50 4c 41 43 45 29 20 57 49 54 48 4f 55   REPLACE) WITHOU
1440: 54 20 52 4f 57 49 44 0a 20 20 7d 0a 0a 20 20 33  T ROWID.  }..  3
1450: 2e 31 20 20 20 31 20 7b 0a 20 20 20 20 43 52 45  .1   1 {.    CRE
1460: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
1470: 62 2c 20 63 29 3b 0a 20 20 20 20 43 52 45 41 54  b, c);.    CREAT
1480: 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
1490: 28 61 29 3b 0a 20 20 7d 0a 20 20 33 2e 32 20 20  (a);.  }.  3.2  
14a0: 20 30 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20   0 {.    CREATE 
14b0: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 63  TABLE t1(a, b, c
14c0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e  );.    CREATE IN
14d0: 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 29 3b  DEX i1 ON t1(a);
14e0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 52 49 47  .    CREATE TRIG
14f0: 47 45 52 20 74 72 31 20 41 46 54 45 52 20 49 4e  GER tr1 AFTER IN
1500: 53 45 52 54 20 4f 4e 20 74 31 20 42 45 47 49 4e  SERT ON t1 BEGIN
1510: 20 53 45 4c 45 43 54 20 31 3b 20 45 4e 44 3b 0a   SELECT 1; END;.
1520: 20 20 7d 0a 20 20 33 2e 33 20 20 20 30 20 7b 0a    }.  3.3   0 {.
1530: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
1540: 20 74 31 28 61 2c 20 62 2c 20 63 29 3b 0a 20 20   t1(a, b, c);.  
1550: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
1560: 31 20 4f 4e 20 74 31 28 61 29 3b 0a 20 20 20 20  1 ON t1(a);.    
1570: 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20 74  CREATE TRIGGER t
1580: 72 32 20 42 45 46 4f 52 45 20 49 4e 53 45 52 54  r2 BEFORE INSERT
1590: 20 4f 4e 20 74 31 20 42 45 47 49 4e 20 53 45 4c   ON t1 BEGIN SEL
15a0: 45 43 54 20 31 3b 20 45 4e 44 3b 0a 20 20 7d 0a  ECT 1; END;.  }.
15b0: 0a 20 20 34 2e 31 20 20 20 32 20 7b 0a 20 20 20  .  4.1   2 {.   
15c0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
15d0: 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (a PRIMARY KEY, 
15e0: 62 2c 20 63 29 3b 0a 20 20 20 20 43 52 45 41 54  b, c);.    CREAT
15f0: 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
1600: 28 61 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  (a);.    CREATE 
1610: 54 41 42 4c 45 20 63 31 28 78 2c 20 79 20 52 45  TABLE c1(x, y RE
1620: 46 45 52 45 4e 43 45 53 20 74 31 20 44 45 46 45  FERENCES t1 DEFE
1630: 52 52 41 42 4c 45 20 49 4e 49 54 49 41 4c 4c 59  RRABLE INITIALLY
1640: 20 44 45 46 45 52 52 45 44 29 3b 0a 20 20 20 20   DEFERRED);.    
1650: 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b  PRAGMA foreign_k
1660: 65 79 73 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 34  eys = 0;.  }.  4
1670: 2e 32 20 20 20 30 20 7b 0a 20 20 20 20 43 52 45  .2   0 {.    CRE
1680: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 50  ATE TABLE t1(a P
1690: 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 2c 20 63  RIMARY KEY, b, c
16a0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e  );.    CREATE IN
16b0: 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 29 3b  DEX i1 ON t1(a);
16c0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
16d0: 45 20 63 31 28 78 2c 20 79 20 52 45 46 45 52 45  E c1(x, y REFERE
16e0: 4e 43 45 53 20 74 31 20 44 45 46 45 52 52 41 42  NCES t1 DEFERRAB
16f0: 4c 45 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46  LE INITIALLY DEF
1700: 45 52 52 45 44 29 3b 0a 20 20 20 20 50 52 41 47  ERRED);.    PRAG
1710: 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20  MA foreign_keys 
1720: 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 34 2e 33 20  = 1;.  }..  4.3 
1730: 20 20 31 20 7b 0a 20 20 20 20 43 52 45 41 54 45    1 {.    CREATE
1740: 20 54 41 42 4c 45 20 70 31 28 78 2c 20 79 20 55   TABLE p1(x, y U
1750: 4e 49 51 55 45 29 3b 0a 20 20 20 20 43 52 45 41  NIQUE);.    CREA
1760: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
1770: 2c 20 63 20 52 45 46 45 52 45 4e 43 45 53 20 70  , c REFERENCES p
1780: 31 28 79 29 29 3b 0a 20 20 20 20 43 52 45 41 54  1(y));.    CREAT
1790: 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
17a0: 28 61 29 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  (a);.    PRAGMA 
17b0: 66 6f 72 65 69 67 6e 5f 6b 65 79 73 20 3d 20 30  foreign_keys = 0
17c0: 3b 0a 20 20 7d 0a 20 20 34 2e 34 20 20 20 30 20  ;.  }.  4.4   0 
17d0: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
17e0: 4c 45 20 70 31 28 78 2c 20 79 20 55 4e 49 51 55  LE p1(x, y UNIQU
17f0: 45 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  E);.    CREATE T
1800: 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 63 20  ABLE t1(a, b, c 
1810: 52 45 46 45 52 45 4e 43 45 53 20 70 31 28 79 29  REFERENCES p1(y)
1820: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e  );.    CREATE IN
1830: 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 29 3b  DEX i1 ON t1(a);
1840: 0a 20 20 20 20 50 52 41 47 4d 41 20 66 6f 72 65  .    PRAGMA fore
1850: 69 67 6e 5f 6b 65 79 73 20 3d 20 31 3b 0a 20 20  ign_keys = 1;.  
1860: 7d 0a 0a 7d 20 7b 0a 20 20 65 78 65 63 73 71 6c  }..} {.  execsql
1870: 20 7b 20 0a 20 20 20 20 44 52 4f 50 20 54 41 42   { .    DROP TAB
1880: 4c 45 20 49 46 20 45 58 49 53 54 53 20 74 31 3b  LE IF EXISTS t1;
1890: 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20  .    DROP TABLE 
18a0: 49 46 20 45 58 49 53 54 53 20 63 31 3b 0a 20 20  IF EXISTS c1;.  
18b0: 20 20 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20    DROP TABLE IF 
18c0: 45 58 49 53 54 53 20 70 31 3b 0a 20 20 7d 0a 0a  EXISTS p1;.  }..
18d0: 20 20 64 6f 5f 74 65 73 74 20 32 2e 32 2e 24 74    do_test 2.2.$t
18e0: 6e 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  n {.    execsql 
18f0: 24 73 63 68 65 6d 61 0a 20 20 20 20 73 6f 72 74  $schema.    sort
1900: 65 72 5f 63 6f 75 6e 74 20 7b 20 49 4e 53 45 52  er_count { INSER
1910: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
1920: 20 2a 20 46 52 4f 4d 20 74 32 20 7d 0a 20 20 7d   * FROM t2 }.  }
1930: 20 24 73 63 6f 75 6e 74 0a 7d 0a 0a 23 2d 2d 2d   $scount.}..#---
1940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1980: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68  ------.# Test th
1990: 61 74 20 69 66 20 61 20 55 4e 49 51 55 45 20 63  at if a UNIQUE c
19a0: 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 76 69 6f  onstraint is vio
19b0: 6c 61 74 65 64 20 61 6e 64 20 74 68 65 20 6f 6e  lated and the on
19c0: 20 63 6f 6e 66 6c 69 63 74 20 6d 6f 64 65 0a 23   conflict mode.#
19d0: 20 69 73 20 65 69 74 68 65 72 20 41 42 4f 52 54   is either ABORT
19e0: 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 2c 20 74 68   or ROLLBACK, th
19f0: 65 20 63 6f 6e 66 6c 69 63 74 20 69 73 20 68 61  e conflict is ha
1a00: 6e 64 6c 65 64 20 63 6f 72 72 65 63 74 6c 79 2e  ndled correctly.
1a10: 0a 23 0a 23 20 20 20 33 2e 32 3a 20 43 68 65 63  .#.#   3.2: Chec
1a20: 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73  k that conflicts
1a30: 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 64 65   are actually de
1a40: 74 65 63 74 65 64 2e 20 0a 23 20 20 20 33 2e 33  tected. .#   3.3
1a50: 3a 20 43 68 65 63 6b 20 74 68 61 74 20 4f 52 20  : Check that OR 
1a60: 52 4f 4c 4c 42 41 43 4b 20 72 65 61 6c 6c 79 20  ROLLBACK really 
1a70: 64 6f 65 73 20 72 6f 6c 6c 62 61 63 6b 20 74 68  does rollback th
1a80: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 23  e transaction..#
1a90: 20 20 20 33 2e 34 3a 20 43 68 65 63 6b 20 74 68     3.4: Check th
1aa0: 61 74 20 4f 52 20 41 42 4f 52 54 20 64 6f 65 73  at OR ABORT does
1ab0: 20 6e 6f 74 2e 0a 23 0a 64 6f 5f 65 78 65 63 73   not..#.do_execs
1ac0: 71 6c 5f 74 65 73 74 20 33 2e 31 20 7b 0a 20 20  ql_test 3.1 {.  
1ad0: 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58  DROP TABLE IF EX
1ae0: 49 53 54 53 20 74 31 3b 0a 20 20 43 52 45 41 54  ISTS t1;.  CREAT
1af0: 45 20 54 41 42 4c 45 20 74 31 28 61 20 50 52 49  E TABLE t1(a PRI
1b00: 4d 41 52 59 20 4b 45 59 2c 20 62 2c 20 63 2c 20  MARY KEY, b, c, 
1b10: 55 4e 49 51 55 45 28 62 2c 20 63 29 29 3b 0a 20  UNIQUE(b, c));. 
1b20: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
1b30: 56 41 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 3b  VALUES(1, 2, 3);
1b40: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
1b50: 31 20 56 41 4c 55 45 53 28 34 2c 20 35 2c 20 36  1 VALUES(4, 5, 6
1b60: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
1b70: 20 74 31 20 56 41 4c 55 45 53 28 37 2c 20 38 2c   t1 VALUES(7, 8,
1b80: 20 39 29 3b 0a 20 20 43 52 45 41 54 45 20 54 41   9);.  CREATE TA
1b90: 42 4c 45 20 73 72 63 28 61 2c 20 62 2c 20 63 29  BLE src(a, b, c)
1ba0: 3b 0a 7d 0a 0a 64 6f 5f 63 61 74 63 68 73 71 6c  ;.}..do_catchsql
1bb0: 5f 74 65 73 74 20 33 2e 32 2e 31 20 7b 0a 20 20  _test 3.2.1 {.  
1bc0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 72 63 20  INSERT INTO src 
1bd0: 56 41 4c 55 45 53 20 28 31 30 2c 20 31 31 2c 20  VALUES (10, 11, 
1be0: 31 32 29 2c 20 28 37 2c 20 31 34 2c 20 31 32 29  12), (7, 14, 12)
1bf0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
1c00: 74 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  t1 SELECT * FROM
1c10: 20 73 72 63 3b 0a 7d 20 7b 31 20 7b 55 4e 49 51   src;.} {1 {UNIQ
1c20: 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  UE constraint fa
1c30: 69 6c 65 64 3a 20 74 31 2e 61 7d 7d 0a 0a 64 6f  iled: t1.a}}..do
1c40: 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20 33  _catchsql_test 3
1c50: 2e 32 2e 32 20 7b 0a 20 20 44 45 4c 45 54 45 20  .2.2 {.  DELETE 
1c60: 46 52 4f 4d 20 73 72 63 3b 0a 20 20 49 4e 53 45  FROM src;.  INSE
1c70: 52 54 20 49 4e 54 4f 20 73 72 63 20 56 41 4c 55  RT INTO src VALU
1c80: 45 53 20 28 31 30 2c 20 31 31 2c 20 31 32 29 2c  ES (10, 11, 12),
1c90: 20 28 31 33 2c 20 35 2c 20 36 29 3b 0a 20 20 49   (13, 5, 6);.  I
1ca0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
1cb0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 72 63 3b  LECT * FROM src;
1cc0: 0a 7d 20 7b 31 20 7b 55 4e 49 51 55 45 20 63 6f  .} {1 {UNIQUE co
1cd0: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 3a  nstraint failed:
1ce0: 20 74 31 2e 62 2c 20 74 31 2e 63 7d 7d 0a 0a 64   t1.b, t1.c}}..d
1cf0: 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20  o_catchsql_test 
1d00: 33 2e 32 2e 33 2e 31 20 7b 0a 20 20 43 52 45 41  3.2.3.1 {.  CREA
1d10: 54 45 20 54 41 42 4c 45 20 74 33 28 61 29 3b 0a  TE TABLE t3(a);.
1d20: 20 20 43 52 45 41 54 45 20 55 4e 49 51 55 45 20    CREATE UNIQUE 
1d30: 49 4e 44 45 58 20 74 33 61 20 4f 4e 20 74 33 28  INDEX t3a ON t3(
1d40: 61 29 3b 0a 0a 20 20 43 52 45 41 54 45 20 54 41  a);..  CREATE TA
1d50: 42 4c 45 20 74 33 73 72 63 28 61 29 3b 0a 20 20  BLE t3src(a);.  
1d60: 57 49 54 48 20 63 6e 74 28 78 29 20 41 53 20 28  WITH cnt(x) AS (
1d70: 20 53 45 4c 45 43 54 20 30 20 55 4e 49 4f 4e 20   SELECT 0 UNION 
1d80: 41 4c 4c 20 53 45 4c 45 43 54 20 78 2b 31 20 46  ALL SELECT x+1 F
1d90: 52 4f 4d 20 63 6e 74 20 57 48 45 52 45 20 78 3c  ROM cnt WHERE x<
1da0: 31 30 20 29 0a 20 20 49 4e 53 45 52 54 20 49 4e  10 ).  INSERT IN
1db0: 54 4f 20 74 33 73 72 63 20 53 45 4c 45 43 54 20  TO t3src SELECT 
1dc0: 27 61 62 63 27 20 46 52 4f 4d 20 63 6e 74 3b 0a  'abc' FROM cnt;.
1dd0: 7d 20 7b 30 20 7b 7d 7d 0a 0a 23 20 20 65 78 65  } {0 {}}..#  exe
1de0: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 76 64  csql { PRAGMA vd
1df0: 62 65 5f 74 72 61 63 65 20 3d 20 31 20 7d 0a 64  be_trace = 1 }.d
1e00: 6f 5f 63 61 74 63 68 73 71 6c 5f 74 65 73 74 20  o_catchsql_test 
1e10: 33 2e 32 2e 33 2e 32 20 7b 0a 20 20 49 4e 53 45  3.2.3.2 {.  INSE
1e20: 52 54 20 49 4e 54 4f 20 74 33 20 53 45 4c 45 43  RT INTO t3 SELEC
1e30: 54 20 2a 20 46 52 4f 4d 20 74 33 73 72 63 3b 0a  T * FROM t3src;.
1e40: 7d 20 7b 31 20 7b 55 4e 49 51 55 45 20 63 6f 6e  } {1 {UNIQUE con
1e50: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 3a 20  straint failed: 
1e60: 74 33 2e 61 7d 7d 0a 0a 64 6f 5f 63 61 74 63 68  t3.a}}..do_catch
1e70: 73 71 6c 5f 74 65 73 74 20 33 2e 33 2e 31 20 7b  sql_test 3.3.1 {
1e80: 0a 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 73  .  DELETE FROM s
1e90: 72 63 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20  rc;.  BEGIN;.   
1ea0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 72 63   INSERT INTO src
1eb0: 20 56 41 4c 55 45 53 20 28 31 30 2c 20 31 31 2c   VALUES (10, 11,
1ec0: 20 31 32 29 2c 20 28 37 2c 20 31 33 2c 20 31 34   12), (7, 13, 14
1ed0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 4f 52  );.    INSERT OR
1ee0: 20 52 4f 4c 4c 42 41 43 4b 20 49 4e 54 4f 20 74   ROLLBACK INTO t
1ef0: 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  1 SELECT * FROM 
1f00: 73 72 63 3b 0a 7d 20 7b 31 20 7b 55 4e 49 51 55  src;.} {1 {UNIQU
1f10: 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  E constraint fai
1f20: 6c 65 64 3a 20 74 31 2e 61 7d 7d 0a 64 6f 5f 63  led: t1.a}}.do_c
1f30: 61 74 63 68 73 71 6c 5f 74 65 73 74 20 33 2e 33  atchsql_test 3.3
1f40: 2e 32 20 7b 0a 20 20 44 45 4c 45 54 45 20 46 52  .2 {.  DELETE FR
1f50: 4f 4d 20 73 72 63 3b 0a 20 20 42 45 47 49 4e 3b  OM src;.  BEGIN;
1f60: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
1f70: 20 73 72 63 20 56 41 4c 55 45 53 20 28 31 30 2c   src VALUES (10,
1f80: 20 31 31 2c 20 31 32 29 2c 20 28 31 33 2c 20 35   11, 12), (13, 5
1f90: 2c 20 36 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , 6);.    INSERT
1fa0: 20 4f 52 20 52 4f 4c 4c 42 41 43 4b 20 49 4e 54   OR ROLLBACK INT
1fb0: 4f 20 74 31 20 53 45 4c 45 43 54 20 2a 20 46 52  O t1 SELECT * FR
1fc0: 4f 4d 20 73 72 63 3b 0a 7d 20 7b 31 20 7b 55 4e  OM src;.} {1 {UN
1fd0: 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  IQUE constraint 
1fe0: 66 61 69 6c 65 64 3a 20 74 31 2e 62 2c 20 74 31  failed: t1.b, t1
1ff0: 2e 63 7d 7d 0a 64 6f 5f 74 65 73 74 20 33 2e 33  .c}}.do_test 3.3
2000: 2e 33 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 67  .3 {.  sqlite3_g
2010: 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 20 64 62  et_autocommit db
2020: 0a 7d 20 31 0a 0a 64 6f 5f 63 61 74 63 68 73 71  .} 1..do_catchsq
2030: 6c 5f 74 65 73 74 20 33 2e 34 2e 31 20 7b 0a 20  l_test 3.4.1 {. 
2040: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 73 72 63   DELETE FROM src
2050: 3b 0a 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49  ;.  BEGIN;.    I
2060: 4e 53 45 52 54 20 49 4e 54 4f 20 73 72 63 20 56  NSERT INTO src V
2070: 41 4c 55 45 53 20 28 31 30 2c 20 31 31 2c 20 31  ALUES (10, 11, 1
2080: 32 29 2c 20 28 37 2c 20 31 34 2c 20 31 32 29 3b  2), (7, 14, 12);
2090: 0a 20 20 20 20 49 4e 53 45 52 54 20 4f 52 20 41  .    INSERT OR A
20a0: 42 4f 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  BORT INTO t1 SEL
20b0: 45 43 54 20 2a 20 46 52 4f 4d 20 73 72 63 3b 0a  ECT * FROM src;.
20c0: 7d 20 7b 31 20 7b 55 4e 49 51 55 45 20 63 6f 6e  } {1 {UNIQUE con
20d0: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 3a 20  straint failed: 
20e0: 74 31 2e 61 7d 7d 0a 64 6f 5f 63 61 74 63 68 73  t1.a}}.do_catchs
20f0: 71 6c 5f 74 65 73 74 20 33 2e 34 2e 32 20 7b 0a  ql_test 3.4.2 {.
2100: 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 44 45    ROLLBACK;.  DE
2110: 4c 45 54 45 20 46 52 4f 4d 20 73 72 63 3b 0a 20  LETE FROM src;. 
2120: 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45   BEGIN;.    INSE
2130: 52 54 20 49 4e 54 4f 20 73 72 63 20 56 41 4c 55  RT INTO src VALU
2140: 45 53 20 28 31 30 2c 20 31 31 2c 20 31 32 29 2c  ES (10, 11, 12),
2150: 20 28 31 33 2c 20 35 2c 20 36 29 3b 0a 20 20 20   (13, 5, 6);.   
2160: 20 49 4e 53 45 52 54 20 4f 52 20 41 42 4f 52 54   INSERT OR ABORT
2170: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
2180: 2a 20 46 52 4f 4d 20 73 72 63 3b 0a 7d 20 7b 31  * FROM src;.} {1
2190: 20 7b 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61   {UNIQUE constra
21a0: 69 6e 74 20 66 61 69 6c 65 64 3a 20 74 31 2e 62  int failed: t1.b
21b0: 2c 20 74 31 2e 63 7d 7d 0a 64 6f 5f 74 65 73 74  , t1.c}}.do_test
21c0: 20 33 2e 34 2e 33 20 7b 0a 20 20 73 71 6c 69 74   3.4.3 {.  sqlit
21d0: 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69  e3_get_autocommi
21e0: 74 20 64 62 0a 7d 20 30 0a 64 6f 5f 65 78 65 63  t db.} 0.do_exec
21f0: 73 71 6c 5f 74 65 73 74 20 33 2e 34 2e 34 20 7b  sql_test 3.4.4 {
2200: 20 52 4f 4c 4c 42 41 43 4b 20 7d 0a 0a 23 2d 2d   ROLLBACK }..#--
2210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2250: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f  -------.# The fo
2260: 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 20 2d 20  llowing tests - 
2270: 34 2e 2a 20 2d 20 63 68 65 63 6b 20 74 68 61 74  4.* - check that
2280: 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
2290: 6f 6e 20 69 73 20 61 63 74 75 61 6c 6c 79 0a 23  on is actually.#
22a0: 20 64 6f 69 6e 67 20 73 6f 6d 65 74 68 69 6e 67   doing something
22b0: 20 68 65 6c 70 66 75 6c 2e 20 54 68 65 79 20 64   helpful. They d
22c0: 6f 20 74 68 69 73 20 62 79 20 65 78 65 63 75 74  o this by execut
22d0: 69 6e 67 20 61 20 62 69 67 20 0a 23 20 22 49 4e  ing a big .# "IN
22e0: 53 45 52 54 20 49 4e 54 4f 20 53 45 4c 45 43 54  SERT INTO SELECT
22f0: 22 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 77  " statement in w
2300: 61 6c 20 6d 6f 64 65 20 77 69 74 68 20 61 20 73  al mode with a s
2310: 6d 61 6c 6c 20 70 61 67 65 72 20 63 61 63 68 65  mall pager cache
2320: 2e 0a 23 20 4f 6e 63 65 20 77 69 74 68 20 22 4f  ..# Once with "O
2330: 52 20 46 41 49 4c 22 20 28 73 6f 20 74 68 61 74  R FAIL" (so that
2340: 20 74 68 65 20 73 6f 72 74 65 72 73 20 61 72 65   the sorters are
2350: 20 6e 6f 74 20 75 73 65 64 29 20 61 6e 64 20 6f   not used) and o
2360: 6e 63 65 20 77 69 74 68 0a 23 20 74 68 65 20 64  nce with.# the d
2370: 65 66 61 75 6c 74 20 22 4f 52 20 41 42 4f 52 54  efault "OR ABORT
2380: 22 20 28 73 6f 20 74 68 61 74 20 74 68 65 79 20  " (so that they 
2390: 61 72 65 29 2e 0a 23 0a 23 20 49 66 20 74 68 65  are)..#.# If the
23a0: 20 73 6f 72 74 65 72 73 20 61 72 65 20 64 6f 69   sorters are doi
23b0: 6e 67 20 74 68 65 69 72 20 6a 6f 62 2c 20 74 68  ng their job, th
23c0: 65 20 77 61 6c 20 66 69 6c 65 20 67 65 6e 65 72  e wal file gener
23d0: 61 74 65 64 20 62 79 20 74 68 65 20 0a 23 20 22  ated by the .# "
23e0: 4f 52 20 41 42 4f 52 54 22 20 63 61 73 65 20 73  OR ABORT" case s
23f0: 68 6f 75 6c 64 20 62 65 20 6d 75 63 68 20 73 6d  hould be much sm
2400: 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 22  aller than the "
2410: 4f 52 20 46 41 49 4c 22 20 74 72 69 61 6c 2e 0a  OR FAIL" trial..
2420: 23 0a 0a 70 72 6f 63 20 6f 64 64 5f 63 6f 6c 6c  #..proc odd_coll
2430: 61 74 65 20 7b 6c 68 73 20 72 68 73 7d 20 7b 0a  ate {lhs rhs} {.
2440: 20 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 65    string compare
2450: 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24   [string range $
2460: 6c 68 73 20 36 20 65 6e 64 5d 20 5b 73 74 72 69  lhs 6 end] [stri
2470: 6e 67 20 72 61 6e 67 65 20 24 72 68 73 20 36 20  ng range $rhs 6 
2480: 65 6e 64 5d 0a 7d 0a 0a 70 72 6f 63 20 64 6f 5f  end].}..proc do_
2490: 69 6e 73 65 72 74 36 5f 34 5f 74 65 73 74 20 7b  insert6_4_test {
24a0: 74 6e 20 73 71 6c 7d 20 7b 0a 0a 20 20 72 65 73  tn sql} {..  res
24b0: 65 74 5f 64 62 0a 20 20 64 62 20 63 6f 6c 6c 61  et_db.  db colla
24c0: 74 65 20 6f 64 64 5f 63 6f 6c 6c 61 74 65 20 6f  te odd_collate o
24d0: 64 64 5f 63 6f 6c 6c 61 74 65 0a 20 20 65 78 65  dd_collate.  exe
24e0: 63 73 71 6c 20 24 73 71 6c 0a 20 20 64 62 5f 73  csql $sql.  db_s
24f0: 61 76 65 5f 61 6e 64 5f 63 6c 6f 73 65 0a 0a 20  ave_and_close.. 
2500: 20 66 6f 72 65 61 63 68 20 7b 74 6e 32 20 3a 3a   foreach {tn2 ::
2510: 6f 6e 65 72 72 6f 72 20 3a 3a 76 61 72 7d 20 7b  onerror ::var} {
2520: 0a 20 20 20 20 31 20 22 4f 52 20 41 42 4f 52 54  .    1 "OR ABORT
2530: 22 20 3a 3a 73 7a 31 0a 20 20 20 20 32 20 22 4f  " ::sz1.    2 "O
2540: 52 20 46 41 49 4c 22 20 20 3a 3a 73 7a 32 0a 20  R FAIL"  ::sz2. 
2550: 20 7d 20 7b 0a 20 20 20 20 64 6f 5f 74 65 73 74   } {.    do_test
2560: 20 24 74 6e 2e 24 74 6e 32 20 7b 0a 20 20 20 20   $tn.$tn2 {.    
2570: 20 20 64 62 5f 72 65 73 74 6f 72 65 5f 61 6e 64    db_restore_and
2580: 5f 72 65 6f 70 65 6e 0a 20 20 20 20 20 20 64 62  _reopen.      db
2590: 20 63 6f 6c 6c 61 74 65 20 6f 64 64 5f 63 6f 6c   collate odd_col
25a0: 6c 61 74 65 20 6f 64 64 5f 63 6f 6c 6c 61 74 65  late odd_collate
25b0: 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c 20 22  .      execsql "
25c0: 0a 20 20 20 20 20 20 20 20 50 52 41 47 4d 41 20  .        PRAGMA 
25d0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 77  journal_mode = w
25e0: 61 6c 3b 0a 20 20 20 20 20 20 20 20 50 52 41 47  al;.        PRAG
25f0: 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  MA cache_size = 
2600: 35 3b 0a 20 20 20 20 20 20 20 20 50 52 41 47 4d  5;.        PRAGM
2610: 41 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70  A wal_autocheckp
2620: 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  oint = 0;.      
2630: 20 20 49 4e 53 45 52 54 20 24 6f 6e 65 72 72 6f    INSERT $onerro
2640: 72 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  r INTO t1 SELECT
2650: 20 2a 20 46 52 4f 4d 20 73 72 63 3b 0a 20 20 20   * FROM src;.   
2660: 20 20 20 22 0a 20 20 20 20 20 20 73 65 74 20 24     ".      set $
2670: 76 61 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  var [file size t
2680: 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 20 20 20 20  est.db-wal].    
2690: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 20 20 7d    db close.    }
26a0: 20 7b 7d 0a 20 20 7d 0a 0a 20 20 64 6f 5f 74 65   {}.  }..  do_te
26b0: 73 74 20 24 74 6e 2e 33 2e 28 24 3a 3a 73 7a 31  st $tn.3.($::sz1
26c0: 3c 24 3a 3a 73 7a 32 29 20 7b 0a 20 20 20 20 65  <$::sz2) {.    e
26d0: 78 70 72 20 7b 24 73 7a 31 20 3c 20 28 24 73 7a  xpr {$sz1 < ($sz
26e0: 32 2f 32 29 7d 0a 20 20 7d 20 31 0a 0a 20 20 73  2/2)}.  } 1..  s
26f0: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
2700: 62 0a 20 20 64 62 20 63 6f 6c 6c 61 74 65 20 6f  b.  db collate o
2710: 64 64 5f 63 6f 6c 6c 61 74 65 20 6f 64 64 5f 63  dd_collate odd_c
2720: 6f 6c 6c 61 74 65 0a 20 20 69 6e 74 65 67 72 69  ollate.  integri
2730: 74 79 5f 63 68 65 63 6b 20 24 74 6e 2e 34 20 0a  ty_check $tn.4 .
2740: 7d 0a 0a 64 6f 5f 69 6e 73 65 72 74 36 5f 34 5f  }..do_insert6_4_
2750: 74 65 73 74 20 34 2e 31 20 7b 0a 20 20 43 52 45  test 4.1 {.  CRE
2760: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
2770: 62 2c 20 63 29 3b 0a 20 20 43 52 45 41 54 45 20  b, c);.  CREATE 
2780: 55 4e 49 51 55 45 20 49 4e 44 45 58 20 74 31 61  UNIQUE INDEX t1a
2790: 20 4f 4e 20 74 31 28 61 29 3b 0a 20 20 43 52 45   ON t1(a);.  CRE
27a0: 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45 58  ATE UNIQUE INDEX
27b0: 20 74 31 62 63 20 4f 4e 20 74 31 28 62 2c 20 63   t1bc ON t1(b, c
27c0: 29 3b 0a 0a 20 20 43 52 45 41 54 45 20 54 41 42  );..  CREATE TAB
27d0: 4c 45 20 73 72 63 28 78 2c 20 79 2c 20 7a 29 3b  LE src(x, y, z);
27e0: 0a 20 20 57 49 54 48 20 63 6e 74 28 78 29 20 41  .  WITH cnt(x) A
27f0: 53 20 28 20 53 45 4c 45 43 54 20 30 20 55 4e 49  S ( SELECT 0 UNI
2800: 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 78 2b  ON ALL SELECT x+
2810: 31 20 46 52 4f 4d 20 63 6e 74 20 57 48 45 52 45  1 FROM cnt WHERE
2820: 20 78 3c 32 39 39 39 20 29 0a 20 20 49 4e 53 45   x<2999 ).  INSE
2830: 52 54 20 49 4e 54 4f 20 73 72 63 20 0a 20 20 53  RT INTO src .  S
2840: 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62  ELECT randomblob
2850: 28 35 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  (50), randomblob
2860: 28 35 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  (50), randomblob
2870: 28 35 30 29 20 46 52 4f 4d 20 63 6e 74 3b 0a 7d  (50) FROM cnt;.}
2880: 0a 0a 64 6f 5f 69 6e 73 65 72 74 36 5f 34 5f 74  ..do_insert6_4_t
2890: 65 73 74 20 34 2e 32 20 7b 0a 20 20 43 52 45 41  est 4.2 {.  CREA
28a0: 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 49 4e  TE TABLE t1(a IN
28b0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
28c0: 59 2c 20 62 2c 20 78 29 3b 0a 20 20 43 52 45 41  Y, b, x);.  CREA
28d0: 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45 58 20  TE UNIQUE INDEX 
28e0: 74 31 62 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20  t1b ON t1(b);.  
28f0: 43 52 45 41 54 45 20 49 4e 44 45 58 20 74 31 78  CREATE INDEX t1x
2900: 31 20 4f 4e 20 74 31 28 78 29 3b 0a 20 20 43 52  1 ON t1(x);.  CR
2910: 45 41 54 45 20 49 4e 44 45 58 20 74 31 78 32 20  EATE INDEX t1x2 
2920: 4f 4e 20 74 31 28 78 29 3b 0a 20 20 43 52 45 41  ON t1(x);.  CREA
2930: 54 45 20 49 4e 44 45 58 20 74 31 78 33 20 4f 4e  TE INDEX t1x3 ON
2940: 20 74 31 28 78 29 3b 0a 20 20 43 52 45 41 54 45   t1(x);.  CREATE
2950: 20 49 4e 44 45 58 20 74 31 78 34 20 4f 4e 20 74   INDEX t1x4 ON t
2960: 31 28 78 29 3b 0a 0a 20 20 43 52 45 41 54 45 20  1(x);..  CREATE 
2970: 54 41 42 4c 45 20 73 72 63 28 61 2c 20 62 2c 20  TABLE src(a, b, 
2980: 78 29 3b 0a 20 20 57 49 54 48 20 63 6e 74 28 78  x);.  WITH cnt(x
2990: 29 20 41 53 20 28 20 53 45 4c 45 43 54 20 30 20  ) AS ( SELECT 0 
29a0: 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54  UNION ALL SELECT
29b0: 20 78 2b 31 20 46 52 4f 4d 20 63 6e 74 20 57 48   x+1 FROM cnt WH
29c0: 45 52 45 20 78 3c 32 39 39 39 20 29 0a 20 20 49  ERE x<2999 ).  I
29d0: 4e 53 45 52 54 20 49 4e 54 4f 20 73 72 63 20 0a  NSERT INTO src .
29e0: 20 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 28    SELECT random(
29f0: 29 2c 20 78 2c 20 7a 65 72 6f 62 6c 6f 62 28 35  ), x, zeroblob(5
2a00: 30 29 20 46 52 4f 4d 20 63 6e 74 3b 0a 7d 0a 0a  0) FROM cnt;.}..
2a10: 64 6f 5f 69 6e 73 65 72 74 36 5f 34 5f 74 65 73  do_insert6_4_tes
2a20: 74 20 34 2e 33 20 7b 0a 20 20 43 52 45 41 54 45  t 4.3 {.  CREATE
2a30: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20   TABLE t1(a, b, 
2a40: 63 29 3b 0a 20 20 43 52 45 41 54 45 20 55 4e 49  c);.  CREATE UNI
2a50: 51 55 45 20 49 4e 44 45 58 20 74 31 61 62 20 4f  QUE INDEX t1ab O
2a60: 4e 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 43 52  N t1(a, b);.  CR
2a70: 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45  EATE UNIQUE INDE
2a80: 58 20 74 31 61 63 20 4f 4e 20 74 31 28 61 2c 20  X t1ac ON t1(a, 
2a90: 63 29 3b 0a 0a 20 20 43 52 45 41 54 45 20 54 41  c);..  CREATE TA
2aa0: 42 4c 45 20 73 72 63 28 61 2c 20 62 2c 20 63 29  BLE src(a, b, c)
2ab0: 3b 0a 20 20 57 49 54 48 20 63 6e 74 28 78 29 20  ;.  WITH cnt(x) 
2ac0: 41 53 20 28 20 53 45 4c 45 43 54 20 30 20 55 4e  AS ( SELECT 0 UN
2ad0: 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 78  ION ALL SELECT x
2ae0: 2b 31 20 46 52 4f 4d 20 63 6e 74 20 57 48 45 52  +1 FROM cnt WHER
2af0: 45 20 78 3c 32 39 39 39 20 29 0a 20 20 49 4e 53  E x<2999 ).  INS
2b00: 45 52 54 20 49 4e 54 4f 20 73 72 63 20 0a 20 20  ERT INTO src .  
2b10: 53 45 4c 45 43 54 20 7a 65 72 6f 62 6c 6f 62 28  SELECT zeroblob(
2b20: 35 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  50), randomblob(
2b30: 35 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  50), randomblob(
2b40: 35 30 29 20 46 52 4f 4d 20 63 6e 74 3b 0a 7d 0a  50) FROM cnt;.}.
2b50: 0a 64 62 20 63 6f 6c 6c 61 74 65 20 6f 64 64 5f  .db collate odd_
2b60: 63 6f 6c 6c 61 74 65 20 6f 64 64 5f 63 6f 6c 6c  collate odd_coll
2b70: 61 74 65 0a 64 6f 5f 69 6e 73 65 72 74 36 5f 34  ate.do_insert6_4
2b80: 5f 74 65 73 74 20 34 2e 35 20 7b 0a 20 20 43 52  _test 4.5 {.  CR
2b90: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 74 20  EATE TABLE t1(t 
2ba0: 43 4f 4c 4c 41 54 45 20 6f 64 64 5f 63 6f 6c 6c  COLLATE odd_coll
2bb0: 61 74 65 2c 20 76 20 43 4f 4c 4c 41 54 45 20 6f  ate, v COLLATE o
2bc0: 64 64 5f 63 6f 6c 6c 61 74 65 29 3b 0a 20 20 43  dd_collate);.  C
2bd0: 52 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44  REATE UNIQUE IND
2be0: 45 58 20 74 31 74 20 4f 4e 20 74 31 28 74 29 3b  EX t1t ON t1(t);
2bf0: 0a 20 20 43 52 45 41 54 45 20 55 4e 49 51 55 45  .  CREATE UNIQUE
2c00: 20 49 4e 44 45 58 20 74 31 76 20 4f 4e 20 74 31   INDEX t1v ON t1
2c10: 28 76 29 3b 0a 0a 20 20 43 52 45 41 54 45 20 54  (v);..  CREATE T
2c20: 41 42 4c 45 20 73 72 63 28 74 2c 20 76 29 3b 0a  ABLE src(t, v);.
2c30: 20 20 57 49 54 48 20 63 6e 74 28 78 29 20 41 53    WITH cnt(x) AS
2c40: 20 28 20 53 45 4c 45 43 54 20 30 20 55 4e 49 4f   ( SELECT 0 UNIO
2c50: 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 78 2b 31  N ALL SELECT x+1
2c60: 20 46 52 4f 4d 20 63 6e 74 20 57 48 45 52 45 20   FROM cnt WHERE 
2c70: 78 3c 32 39 39 39 20 29 0a 20 20 49 4e 53 45 52  x<2999 ).  INSER
2c80: 54 20 49 4e 54 4f 20 73 72 63 20 0a 20 20 53 45  T INTO src .  SE
2c90: 4c 45 43 54 20 68 65 78 28 72 61 6e 64 6f 6d 62  LECT hex(randomb
2ca0: 6c 6f 62 28 35 30 29 29 2c 20 68 65 78 28 72 61  lob(50)), hex(ra
2cb0: 6e 64 6f 6d 62 6c 6f 62 28 35 30 29 29 20 46 52  ndomblob(50)) FR
2cc0: 4f 4d 20 63 6e 74 3b 0a 7d 0a 0a 64 62 20 63 6f  OM cnt;.}..db co
2cd0: 6c 6c 61 74 65 20 6f 64 64 5f 63 6f 6c 6c 61 74  llate odd_collat
2ce0: 65 20 6f 64 64 5f 63 6f 6c 6c 61 74 65 0a 64 6f  e odd_collate.do
2cf0: 5f 69 6e 73 65 72 74 36 5f 34 5f 74 65 73 74 20  _insert6_4_test 
2d00: 34 2e 36 20 7b 0a 20 20 43 52 45 41 54 45 20 54  4.6 {.  CREATE T
2d10: 41 42 4c 45 20 74 31 28 74 20 43 4f 4c 4c 41 54  ABLE t1(t COLLAT
2d20: 45 20 6f 64 64 5f 63 6f 6c 6c 61 74 65 20 50 52  E odd_collate PR
2d30: 49 4d 41 52 59 20 4b 45 59 29 20 57 49 54 48 4f  IMARY KEY) WITHO
2d40: 55 54 20 52 4f 57 49 44 3b 0a 20 20 43 52 45 41  UT ROWID;.  CREA
2d50: 54 45 20 54 41 42 4c 45 20 73 72 63 28 74 29 3b  TE TABLE src(t);
2d60: 0a 20 20 57 49 54 48 20 63 6e 74 28 78 29 20 41  .  WITH cnt(x) A
2d70: 53 20 28 20 53 45 4c 45 43 54 20 30 20 55 4e 49  S ( SELECT 0 UNI
2d80: 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 78 2b  ON ALL SELECT x+
2d90: 31 20 46 52 4f 4d 20 63 6e 74 20 57 48 45 52 45  1 FROM cnt WHERE
2da0: 20 78 3c 32 39 39 39 20 29 0a 20 20 49 4e 53 45   x<2999 ).  INSE
2db0: 52 54 20 49 4e 54 4f 20 73 72 63 20 0a 20 20 53  RT INTO src .  S
2dc0: 45 4c 45 43 54 20 68 65 78 28 72 61 6e 64 6f 6d  ELECT hex(random
2dd0: 62 6c 6f 62 28 35 30 29 29 20 46 52 4f 4d 20 63  blob(50)) FROM c
2de0: 6e 74 3b 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  nt;.}..#--------
2df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e30: 2d 0a 23 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74  -.# At one point
2e40: 20 74 68 65 20 73 6f 72 74 65 72 73 20 77 65 72   the sorters wer
2e50: 65 20 75 73 65 64 20 66 6f 72 20 49 4e 53 45 52  e used for INSER
2e60: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61  T statements tha
2e70: 74 20 73 70 65 63 69 66 79 0a 23 20 22 4f 52 20  t specify.# "OR 
2e80: 46 41 49 4c 22 2c 20 22 52 45 50 4c 41 43 45 22  FAIL", "REPLACE"
2e90: 20 6f 72 20 22 49 47 4e 4f 52 45 22 20 69 66 20   or "IGNORE" if 
2ea0: 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20 50 52  there were no PR
2eb0: 49 4d 41 52 59 20 4b 45 59 20 6f 72 0a 23 20 55  IMARY KEY or.# U
2ec0: 4e 49 51 55 45 20 69 6e 64 65 78 65 73 2e 20 54  NIQUE indexes. T
2ed0: 68 69 73 20 69 73 20 69 6e 63 6f 72 72 65 63 74  his is incorrect
2ee0: 2c 20 61 73 20 61 6c 6c 20 73 75 63 68 20 74 61  , as all such ta
2ef0: 62 6c 65 73 20 68 61 76 65 20 61 6e 20 69 6d 70  bles have an imp
2f00: 6c 69 63 69 74 0a 23 20 49 50 4b 20 63 6f 6c 75  licit.# IPK colu
2f10: 6d 6e 2e 20 53 6f 20 75 73 69 6e 67 20 74 68 65  mn. So using the
2f20: 20 73 6f 72 74 65 72 73 20 63 61 6e 20 63 61 75   sorters can cau
2f30: 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 54  se corruption. T
2f40: 68 69 73 20 74 65 73 74 20 63 68 65 63 6b 73 0a  his test checks.
2f50: 23 20 74 68 61 74 20 74 68 61 74 20 70 72 6f 62  # that that prob
2f60: 6c 65 6d 20 6e 6f 20 6c 6f 6e 67 65 72 20 65 78  lem no longer ex
2f70: 69 73 74 73 2e 0a 23 0a 72 65 73 65 74 5f 64 62  ists..#.reset_db
2f80: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
2f90: 20 35 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20   5.1 {.  CREATE 
2fa0: 54 41 42 4c 45 20 74 31 28 61 20 49 4e 54 45 47  TABLE t1(a INTEG
2fb0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
2fc0: 62 2c 20 63 29 3b 0a 20 20 43 52 45 41 54 45 20  b, c);.  CREATE 
2fd0: 49 4e 44 45 58 20 74 31 62 20 4f 4e 20 74 31 28  INDEX t1b ON t1(
2fe0: 62 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  b);.  INSERT INT
2ff0: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32  O t1 VALUES(1, 2
3000: 2c 20 33 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  , 3);.  INSERT I
3010: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 34 2c  NTO t1 VALUES(4,
3020: 20 35 2c 20 36 29 3b 0a 7d 0a 0a 64 6f 5f 63 61   5, 6);.}..do_ca
3030: 74 63 68 73 71 6c 5f 74 65 73 74 20 35 2e 32 20  tchsql_test 5.2 
3040: 7b 0a 20 20 49 4e 53 45 52 54 20 4f 52 20 46 41  {.  INSERT OR FA
3050: 49 4c 20 49 4e 54 4f 20 74 31 20 0a 20 20 53 45  IL INTO t1 .  SE
3060: 4c 45 43 54 20 32 2c 20 27 78 27 2c 20 27 78 27  LECT 2, 'x', 'x'
3070: 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43   UNION ALL SELEC
3080: 54 20 33 2c 20 27 78 27 2c 20 27 78 27 20 55 4e  T 3, 'x', 'x' UN
3090: 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 34  ION ALL SELECT 4
30a0: 2c 20 27 78 27 2c 20 27 78 27 3b 0a 7d 20 7b 31  , 'x', 'x';.} {1
30b0: 20 7b 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61   {UNIQUE constra
30c0: 69 6e 74 20 66 61 69 6c 65 64 3a 20 74 31 2e 61  int failed: t1.a
30d0: 7d 7d 0a 0a 69 6e 74 65 67 72 69 74 79 5f 63 68  }}..integrity_ch
30e0: 65 63 6b 20 35 2e 33 0a 0a 0a 66 69 6e 69 73 68  eck 5.3...finish
30f0: 5f 74 65 73 74 0a 0a                             _test..