/ Hex Artifact Content
Login

Artifact 2f829007cc8d25d17b859f7fe882ef2bd2e2eb49:


0000: 23 20 32 30 30 37 20 4e 6f 76 65 6d 62 65 72 20  # 2007 November 
0010: 32 39 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f  29.#.# The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61  lace of.# a lega
0060: 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69  l notice, here i
0070: 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a  s a blessing:.#.
0080: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20  #    May you do 
0090: 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69  good and not evi
00a0: 6c 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20  l..#    May you 
00b0: 66 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73  find forgiveness
00c0: 20 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e   for yourself an
00d0: 64 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73  d forgive others
00e0: 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73  ..#    May you s
00f0: 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76  hare freely, nev
0100: 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74  er taking more t
0110: 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a  han you give..#.
0120: 23 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 2a 0a 23 20 54 68 69 73 20  ********.# This 
0170: 66 69 6c 65 20 74 65 73 74 73 20 74 68 65 20 6f  file tests the o
0180: 70 74 69 6d 69 73 61 74 69 6f 6e 73 20 6d 61 64  ptimisations mad
0190: 65 20 69 6e 20 4e 6f 76 65 6d 62 65 72 20 32 30  e in November 20
01a0: 30 37 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  07 of expression
01b0: 73 20 0a 23 20 6f 66 20 74 68 65 20 66 6f 6c 6c  s .# of the foll
01c0: 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 23 0a 23 20  owing form:.#.# 
01d0: 20 20 20 20 3c 76 61 6c 75 65 3e 20 49 4e 20 28      <value> IN (
01e0: 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20  SELECT <column> 
01f0: 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 29 0a 23 0a  FROM <table>).#.
0200: 23 20 24 49 64 3a 20 69 6e 33 2e 74 65 73 74 2c  # $Id: in3.test,
0210: 76 20 31 2e 33 20 32 30 30 38 2f 30 31 2f 31 37  v 1.3 2008/01/17
0220: 20 31 36 3a 32 32 3a 31 36 20 64 72 68 20 45 78   16:22:16 drh Ex
0230: 70 20 24 0a 0a 73 65 74 20 74 65 73 74 64 69 72  p $..set testdir
0240: 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24   [file dirname $
0250: 61 72 67 76 30 5d 0a 73 6f 75 72 63 65 20 24 74  argv0].source $t
0260: 65 73 74 64 69 72 2f 74 65 73 74 65 72 2e 74 63  estdir/tester.tc
0270: 6c 0a 0a 69 66 63 61 70 61 62 6c 65 20 21 73 75  l..ifcapable !su
0280: 62 71 75 65 72 79 20 7b 0a 20 20 66 69 6e 69 73  bquery {.  finis
0290: 68 5f 74 65 73 74 0a 20 20 72 65 74 75 72 6e 0a  h_test.  return.
02a0: 7d 0a 0a 23 20 52 65 74 75 72 6e 20 74 68 65 20  }..# Return the 
02b0: 6e 75 6d 62 65 72 20 6f 66 20 4f 70 65 6e 45 70  number of OpenEp
02c0: 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74  hemeral instruct
02d0: 69 6f 6e 73 20 75 73 65 64 20 69 6e 20 74 68 65  ions used in the
02e0: 0a 23 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  .# implementatio
02f0: 6e 20 6f 66 20 74 68 65 20 73 71 6c 20 73 74 61  n of the sql sta
0300: 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73  tement passed as
0310: 20 61 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a   a an argument..
0320: 23 0a 70 72 6f 63 20 6e 45 70 68 65 6d 65 72 61  #.proc nEphemera
0330: 6c 20 7b 73 71 6c 7d 20 7b 0a 20 20 73 65 74 20  l {sql} {.  set 
0340: 6e 45 70 68 20 30 0a 20 20 66 6f 72 65 61 63 68  nEph 0.  foreach
0350: 20 6f 70 20 5b 65 78 65 63 73 71 6c 20 22 45 58   op [execsql "EX
0360: 50 4c 41 49 4e 20 24 73 71 6c 22 5d 20 7b 0a 20  PLAIN $sql"] {. 
0370: 20 20 20 69 66 20 7b 24 6f 70 20 65 71 20 22 4f     if {$op eq "O
0380: 70 65 6e 45 70 68 65 6d 65 72 61 6c 22 7d 20 7b  penEphemeral"} {
0390: 69 6e 63 72 20 6e 45 70 68 7d 0a 20 20 7d 0a 20  incr nEph}.  }. 
03a0: 20 73 65 74 20 6e 45 70 68 0a 7d 0a 0a 23 20 54   set nEph.}..# T
03b0: 68 69 73 20 70 72 6f 63 20 77 6f 72 6b 73 20 74  his proc works t
03c0: 68 65 20 73 61 6d 65 20 77 61 79 20 61 73 20 65  he same way as e
03d0: 78 65 63 73 71 6c 2c 20 65 78 63 65 70 74 20 74  xecsql, except t
03e0: 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 0a 23  hat the number.#
03f0: 20 6f 66 20 4f 70 65 6e 45 70 68 65 6d 65 72 61   of OpenEphemera
0400: 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 75  l instructions u
0410: 73 65 64 20 69 6e 20 74 68 65 20 69 6d 70 6c 65  sed in the imple
0420: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
0430: 0a 23 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  .# statement is 
0440: 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68  inserted into th
0450: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72  e start of the r
0460: 65 74 75 72 6e 65 64 20 6c 69 73 74 2e 0a 23 0a  eturned list..#.
0470: 70 72 6f 63 20 65 78 65 63 5f 6e 65 70 68 20 7b  proc exec_neph {
0480: 73 71 6c 7d 20 7b 0a 20 20 72 65 74 75 72 6e 20  sql} {.  return 
0490: 5b 63 6f 6e 63 61 74 20 5b 6e 45 70 68 65 6d 65  [concat [nEpheme
04a0: 72 61 6c 20 24 73 71 6c 5d 20 5b 65 78 65 63 73  ral $sql] [execs
04b0: 71 6c 20 24 73 71 6c 5d 5d 0a 7d 0a 0a 64 6f 5f  ql $sql]].}..do_
04c0: 74 65 73 74 20 69 6e 33 2d 31 2e 31 20 7b 0a 20  test in3-1.1 {. 
04d0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
04e0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
04f0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29   PRIMARY KEY, b)
0500: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
0510: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32  O t1 VALUES(1, 2
0520: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
0530: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20  TO t1 VALUES(3, 
0540: 34 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  4);.    INSERT I
0550: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 35 2c  NTO t1 VALUES(5,
0560: 20 36 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23   6);.  }.} {}..#
0570: 20 41 6c 6c 20 6f 66 20 74 68 65 73 65 20 71 75   All of these qu
0580: 65 72 69 65 73 20 73 68 6f 75 6c 64 20 61 76 6f  eries should avo
0590: 69 64 20 75 73 69 6e 67 20 61 20 74 65 6d 70 2d  id using a temp-
05a0: 74 61 62 6c 65 3a 0a 23 0a 64 6f 5f 74 65 73 74  table:.#.do_test
05b0: 20 69 6e 33 2d 31 2e 32 20 7b 0a 20 20 65 78 65   in3-1.2 {.  exe
05c0: 63 5f 6e 65 70 68 20 7b 20 53 45 4c 45 43 54 20  c_neph { SELECT 
05d0: 72 6f 77 69 64 20 46 52 4f 4d 20 74 31 20 57 48  rowid FROM t1 WH
05e0: 45 52 45 20 72 6f 77 69 64 20 49 4e 20 28 53 45  ERE rowid IN (SE
05f0: 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20  LECT rowid FROM 
0600: 74 31 29 3b 20 7d 0a 7d 20 7b 30 20 31 20 32 20  t1); }.} {0 1 2 
0610: 33 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 33 2d 31  3}.do_test in3-1
0620: 2e 33 20 7b 0a 20 20 65 78 65 63 5f 6e 65 70 68  .3 {.  exec_neph
0630: 20 7b 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d   { SELECT a FROM
0640: 20 74 31 20 57 48 45 52 45 20 61 20 49 4e 20 28   t1 WHERE a IN (
0650: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
0660: 29 3b 20 7d 0a 7d 20 7b 30 20 31 20 33 20 35 7d  ); }.} {0 1 3 5}
0670: 0a 64 6f 5f 74 65 73 74 20 69 6e 33 2d 31 2e 34  .do_test in3-1.4
0680: 20 7b 0a 20 20 65 78 65 63 5f 6e 65 70 68 20 7b   {.  exec_neph {
0690: 20 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52   SELECT rowid FR
06a0: 4f 4d 20 74 31 20 57 48 45 52 45 20 72 6f 77 69  OM t1 WHERE rowi
06b0: 64 2b 30 20 49 4e 20 28 53 45 4c 45 43 54 20 72  d+0 IN (SELECT r
06c0: 6f 77 69 64 20 46 52 4f 4d 20 74 31 29 3b 20 7d  owid FROM t1); }
06d0: 0a 7d 20 7b 30 20 31 20 32 20 33 7d 0a 64 6f 5f  .} {0 1 2 3}.do_
06e0: 74 65 73 74 20 69 6e 33 2d 31 2e 35 20 7b 0a 20  test in3-1.5 {. 
06f0: 20 65 78 65 63 5f 6e 65 70 68 20 7b 20 53 45 4c   exec_neph { SEL
0700: 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 57 48  ECT a FROM t1 WH
0710: 45 52 45 20 61 2b 30 20 49 4e 20 28 53 45 4c 45  ERE a+0 IN (SELE
0720: 43 54 20 61 20 46 52 4f 4d 20 74 31 29 3b 20 7d  CT a FROM t1); }
0730: 0a 7d 20 7b 30 20 31 20 33 20 35 7d 0a 0a 23 20  .} {0 1 3 5}..# 
0740: 42 65 63 61 75 73 65 20 6e 6f 6e 65 20 6f 66 20  Because none of 
0750: 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20 71  the sub-select q
0760: 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 66 6f  ueries in the fo
0770: 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e  llowing statemen
0780: 74 73 0a 23 20 6d 61 74 63 68 20 74 68 65 20 70  ts.# match the p
0790: 61 74 74 65 72 6e 20 28 22 53 45 4c 45 43 54 20  attern ("SELECT 
07a0: 3c 63 6f 6c 75 6d 6e 3e 20 46 52 4f 4d 20 3c 74  <column> FROM <t
07b0: 61 62 6c 65 3e 22 29 2c 20 74 68 65 20 66 6f 6c  able>"), the fol
07c0: 6c 6f 77 69 6e 67 20 64 6f 20 0a 23 20 72 65 71  lowing do .# req
07d0: 75 69 72 65 20 61 20 74 65 6d 70 20 74 61 62 6c  uire a temp tabl
07e0: 65 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 69 6e 33  e..#.do_test in3
07f0: 2d 31 2e 36 20 7b 0a 20 20 65 78 65 63 5f 6e 65  -1.6 {.  exec_ne
0800: 70 68 20 7b 20 53 45 4c 45 43 54 20 72 6f 77 69  ph { SELECT rowi
0810: 64 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  d FROM t1 WHERE 
0820: 72 6f 77 69 64 20 49 4e 20 28 53 45 4c 45 43 54  rowid IN (SELECT
0830: 20 72 6f 77 69 64 2b 30 20 46 52 4f 4d 20 74 31   rowid+0 FROM t1
0840: 29 3b 20 7d 0a 7d 20 7b 31 20 31 20 32 20 33 7d  ); }.} {1 1 2 3}
0850: 0a 64 6f 5f 74 65 73 74 20 69 6e 33 2d 31 2e 37  .do_test in3-1.7
0860: 20 7b 0a 20 20 65 78 65 63 5f 6e 65 70 68 20 7b   {.  exec_neph {
0870: 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
0880: 31 20 57 48 45 52 45 20 61 20 49 4e 20 28 53 45  1 WHERE a IN (SE
0890: 4c 45 43 54 20 61 2b 30 20 46 52 4f 4d 20 74 31  LECT a+0 FROM t1
08a0: 29 3b 20 7d 0a 7d 20 7b 31 20 31 20 33 20 35 7d  ); }.} {1 1 3 5}
08b0: 0a 64 6f 5f 74 65 73 74 20 69 6e 33 2d 31 2e 38  .do_test in3-1.8
08c0: 20 7b 0a 20 20 65 78 65 63 5f 6e 65 70 68 20 7b   {.  exec_neph {
08d0: 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
08e0: 31 20 57 48 45 52 45 20 61 20 49 4e 20 28 53 45  1 WHERE a IN (SE
08f0: 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 57  LECT a FROM t1 W
0900: 48 45 52 45 20 31 29 3b 20 7d 0a 7d 20 7b 31 20  HERE 1); }.} {1 
0910: 31 20 33 20 35 7d 0a 64 6f 5f 74 65 73 74 20 69  1 3 5}.do_test i
0920: 6e 33 2d 31 2e 39 20 7b 0a 20 20 65 78 65 63 5f  n3-1.9 {.  exec_
0930: 6e 65 70 68 20 7b 20 53 45 4c 45 43 54 20 61 20  neph { SELECT a 
0940: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20  FROM t1 WHERE a 
0950: 49 4e 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f  IN (SELECT a FRO
0960: 4d 20 74 31 20 47 52 4f 55 50 20 42 59 20 61 29  M t1 GROUP BY a)
0970: 3b 20 7d 0a 7d 20 7b 31 20 31 20 33 20 35 7d 0a  ; }.} {1 1 3 5}.
0980: 0a 23 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e  .# This should n
0990: 6f 74 20 75 73 65 20 61 20 74 65 6d 70 2d 74 61  ot use a temp-ta
09a0: 62 6c 65 2e 20 45 76 65 6e 20 74 68 6f 75 67 68  ble. Even though
09b0: 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20   the sub-select 
09c0: 64 6f 65 73 0a 23 20 6e 6f 74 20 65 78 61 63 74  does.# not exact
09d0: 6c 79 20 6d 61 74 63 68 20 74 68 65 20 70 61 74  ly match the pat
09e0: 74 65 72 6e 20 22 53 45 4c 45 43 54 20 3c 63 6f  tern "SELECT <co
09f0: 6c 75 6d 6e 3e 20 46 52 4f 4d 20 3c 74 61 62 6c  lumn> FROM <tabl
0a00: 65 3e 22 2c 20 69 6e 0a 23 20 74 68 69 73 20 63  e>", in.# this c
0a10: 61 73 65 20 74 68 65 20 4f 52 44 45 52 20 42 59  ase the ORDER BY
0a20: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20   is a no-op and 
0a30: 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a  can be ignored..
0a40: 64 6f 5f 74 65 73 74 20 69 6e 33 2d 31 2e 31 30  do_test in3-1.10
0a50: 20 7b 0a 20 20 65 78 65 63 5f 6e 65 70 68 20 7b   {.  exec_neph {
0a60: 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
0a70: 31 20 57 48 45 52 45 20 61 20 49 4e 20 28 53 45  1 WHERE a IN (SE
0a80: 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 4f  LECT a FROM t1 O
0a90: 52 44 45 52 20 42 59 20 61 29 3b 20 7d 0a 7d 20  RDER BY a); }.} 
0aa0: 7b 30 20 31 20 33 20 35 7d 0a 0a 23 20 54 68 65  {0 1 3 5}..# The
0ab0: 73 65 20 64 6f 20 75 73 65 20 74 68 65 20 74 65  se do use the te
0ac0: 6d 70 2d 74 61 62 6c 65 2e 20 41 64 64 69 6e 67  mp-table. Adding
0ad0: 20 74 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   the LIMIT claus
0ae0: 65 20 6d 65 61 6e 73 20 74 68 65 20 0a 23 20 4f  e means the .# O
0af0: 52 44 45 52 20 42 59 20 63 61 6e 6e 6f 74 20 62  RDER BY cannot b
0b00: 65 20 69 67 6e 6f 72 65 64 2e 0a 64 6f 5f 74 65  e ignored..do_te
0b10: 73 74 20 69 6e 33 2d 31 2e 31 31 20 7b 0a 20 20  st in3-1.11 {.  
0b20: 65 78 65 63 5f 6e 65 70 68 20 7b 53 45 4c 45 43  exec_neph {SELEC
0b30: 54 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T a FROM t1 WHER
0b40: 45 20 61 20 49 4e 20 28 53 45 4c 45 43 54 20 61  E a IN (SELECT a
0b50: 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42   FROM t1 ORDER B
0b60: 59 20 61 20 4c 49 4d 49 54 20 31 29 7d 0a 7d 20  Y a LIMIT 1)}.} 
0b70: 7b 31 20 31 7d 0a 64 6f 5f 74 65 73 74 20 69 6e  {1 1}.do_test in
0b80: 33 2d 31 2e 31 32 20 7b 0a 20 20 65 78 65 63 5f  3-1.12 {.  exec_
0b90: 6e 65 70 68 20 7b 0a 20 20 20 20 53 45 4c 45 43  neph {.    SELEC
0ba0: 54 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T a FROM t1 WHER
0bb0: 45 20 61 20 49 4e 20 28 53 45 4c 45 43 54 20 61  E a IN (SELECT a
0bc0: 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42   FROM t1 ORDER B
0bd0: 59 20 61 20 4c 49 4d 49 54 20 31 20 4f 46 46 53  Y a LIMIT 1 OFFS
0be0: 45 54 20 31 29 0a 20 20 7d 0a 7d 20 7b 31 20 33  ET 1).  }.} {1 3
0bf0: 7d 0a 0a 23 20 48 61 73 20 74 6f 20 75 73 65 20  }..# Has to use 
0c00: 61 20 74 65 6d 70 2d 74 61 62 6c 65 20 62 65 63  a temp-table bec
0c10: 61 75 73 65 20 6f 66 20 74 68 65 20 63 6f 6d 70  ause of the comp
0c20: 6f 75 6e 64 20 73 75 62 2d 73 65 6c 65 63 74 2e  ound sub-select.
0c30: 0a 23 0a 64 6f 5f 74 65 73 74 20 69 6e 33 2d 31  .#.do_test in3-1
0c40: 2e 31 33 20 7b 0a 20 20 65 78 65 63 5f 6e 65 70  .13 {.  exec_nep
0c50: 68 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 61  h {.    SELECT a
0c60: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
0c70: 20 49 4e 20 28 0a 20 20 20 20 20 20 53 45 4c 45   IN (.      SELE
0c80: 43 54 20 61 20 46 52 4f 4d 20 74 31 20 55 4e 49  CT a FROM t1 UNI
0c90: 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 61 20  ON ALL SELECT a 
0ca0: 46 52 4f 4d 20 74 31 0a 20 20 20 20 29 0a 20 20  FROM t1.    ).  
0cb0: 7d 0a 7d 20 7b 31 20 31 20 33 20 35 7d 0a 0a 23  }.} {1 1 3 5}..#
0cc0: 20 54 68 65 20 66 69 72 73 74 20 6f 66 20 74 68   The first of th
0cd0: 65 73 65 20 71 75 65 72 69 65 73 20 68 61 73 20  ese queries has 
0ce0: 74 6f 20 75 73 65 20 74 68 65 20 74 65 6d 70 2d  to use the temp-
0cf0: 74 61 62 6c 65 2c 20 62 65 63 61 75 73 65 20 74  table, because t
0d00: 68 65 20 0a 23 20 63 6f 6c 6c 61 74 69 6f 6e 20  he .# collation 
0d10: 73 65 71 75 65 6e 63 65 20 75 73 65 64 20 66 6f  sequence used fo
0d20: 72 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 22  r the index on "
0d30: 74 31 2e 61 22 20 64 6f 65 73 20 6e 6f 74 20 6d  t1.a" does not m
0d40: 61 74 63 68 20 74 68 65 0a 23 20 63 6f 6c 6c 61  atch the.# colla
0d50: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73  tion sequence us
0d60: 65 64 20 62 79 20 74 68 65 20 22 49 4e 22 20 63  ed by the "IN" c
0d70: 6f 6d 70 61 72 69 73 6f 6e 2e 20 54 68 65 20 73  omparison. The s
0d80: 65 63 6f 6e 64 20 64 6f 65 73 20 6e 6f 74 0a 23  econd does not.#
0d90: 20 72 65 71 75 69 72 65 20 61 20 74 65 6d 70 2d   require a temp-
0da0: 74 61 62 6c 65 2c 20 62 65 63 61 75 73 65 20 74  table, because t
0db0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
0dc0: 75 65 6e 63 65 73 20 6d 61 74 63 68 2e 0a 23 0a  uences match..#.
0dd0: 64 6f 5f 74 65 73 74 20 69 6e 33 2d 31 2e 31 34  do_test in3-1.14
0de0: 20 7b 0a 20 20 65 78 65 63 5f 6e 65 70 68 20 7b   {.  exec_neph {
0df0: 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
0e00: 31 20 57 48 45 52 45 20 61 20 43 4f 4c 4c 41 54  1 WHERE a COLLAT
0e10: 45 20 6e 6f 63 61 73 65 20 49 4e 20 28 53 45 4c  E nocase IN (SEL
0e20: 45 43 54 20 61 20 46 52 4f 4d 20 74 31 29 20 7d  ECT a FROM t1) }
0e30: 0a 7d 20 7b 31 20 31 20 33 20 35 7d 0a 64 6f 5f  .} {1 1 3 5}.do_
0e40: 74 65 73 74 20 69 6e 33 2d 31 2e 31 35 20 7b 0a  test in3-1.15 {.
0e50: 20 20 65 78 65 63 5f 6e 65 70 68 20 7b 20 53 45    exec_neph { SE
0e60: 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 57  LECT a FROM t1 W
0e70: 48 45 52 45 20 61 20 43 4f 4c 4c 41 54 45 20 62  HERE a COLLATE b
0e80: 69 6e 61 72 79 20 49 4e 20 28 53 45 4c 45 43 54  inary IN (SELECT
0e90: 20 61 20 46 52 4f 4d 20 74 31 29 20 7d 0a 7d 20   a FROM t1) }.} 
0ea0: 7b 30 20 31 20 33 20 35 7d 0a 0a 23 20 4e 65 69  {0 1 3 5}..# Nei
0eb0: 74 68 65 72 20 6f 66 20 74 68 65 73 65 20 71 75  ther of these qu
0ec0: 65 72 69 65 73 20 72 65 71 75 69 72 65 20 61 20  eries require a 
0ed0: 74 65 6d 70 2d 74 61 62 6c 65 2e 20 54 68 65 20  temp-table. The 
0ee0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
0ef0: 63 65 0a 23 20 6d 61 6b 65 73 20 6e 6f 20 64 69  ce.# makes no di
0f00: 66 66 65 72 65 6e 63 65 20 77 68 65 6e 20 75 73  fference when us
0f10: 69 6e 67 20 61 20 72 6f 77 69 64 2e 0a 23 0a 64  ing a rowid..#.d
0f20: 6f 5f 74 65 73 74 20 69 6e 33 2d 31 2e 31 36 20  o_test in3-1.16 
0f30: 7b 0a 20 20 65 78 65 63 5f 6e 65 70 68 20 7b 53  {.  exec_neph {S
0f40: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20  ELECT a FROM t1 
0f50: 57 48 45 52 45 20 61 20 43 4f 4c 4c 41 54 45 20  WHERE a COLLATE 
0f60: 6e 6f 63 61 73 65 20 49 4e 20 28 53 45 4c 45 43  nocase IN (SELEC
0f70: 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 74 31 29  T rowid FROM t1)
0f80: 7d 0a 7d 20 7b 30 20 31 20 33 7d 0a 64 6f 5f 74  }.} {0 1 3}.do_t
0f90: 65 73 74 20 69 6e 33 2d 31 2e 31 37 20 7b 0a 20  est in3-1.17 {. 
0fa0: 20 65 78 65 63 5f 6e 65 70 68 20 7b 53 45 4c 45   exec_neph {SELE
0fb0: 43 54 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45  CT a FROM t1 WHE
0fc0: 52 45 20 61 20 43 4f 4c 4c 41 54 45 20 62 69 6e  RE a COLLATE bin
0fd0: 61 72 79 20 49 4e 20 28 53 45 4c 45 43 54 20 72  ary IN (SELECT r
0fe0: 6f 77 69 64 20 46 52 4f 4d 20 74 31 29 7d 0a 7d  owid FROM t1)}.}
0ff0: 20 7b 30 20 31 20 33 7d 0a 0a 23 20 54 68 65 20   {0 1 3}..# The 
1000: 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 20  following tests 
1010: 2d 20 69 6e 33 2e 32 2e 2a 20 2d 20 74 65 73 74  - in3.2.* - test
1020: 20 61 20 62 75 67 20 74 68 61 74 20 77 61 73 20   a bug that was 
1030: 64 69 66 66 69 63 75 6c 74 20 74 6f 20 74 72 61  difficult to tra
1040: 63 6b 0a 23 20 64 6f 77 6e 20 64 75 72 69 6e 67  ck.# down during
1050: 20 64 65 76 65 6c 6f 70 6d 65 6e 74 2e 20 54 68   development. Th
1060: 65 79 20 61 72 65 20 6e 6f 74 20 70 61 72 74 69  ey are not parti
1070: 63 75 6c 61 72 6c 79 20 77 65 6c 6c 20 66 6f 63  cularly well foc
1080: 75 73 65 64 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  used..#.do_test 
1090: 69 6e 33 2d 32 2e 31 20 7b 0a 20 20 65 78 65 63  in3-2.1 {.  exec
10a0: 73 71 6c 20 7b 0a 20 20 20 20 44 52 4f 50 20 54  sql {.    DROP T
10b0: 41 42 4c 45 20 49 46 20 45 58 49 53 54 53 20 74  ABLE IF EXISTS t
10c0: 31 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  1;.    CREATE TA
10d0: 42 4c 45 20 74 31 28 77 20 69 6e 74 2c 20 78 20  BLE t1(w int, x 
10e0: 69 6e 74 2c 20 79 20 69 6e 74 29 3b 0a 20 20 20  int, y int);.   
10f0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
1100: 28 70 20 69 6e 74 2c 20 71 20 69 6e 74 2c 20 72  (p int, q int, r
1110: 20 69 6e 74 2c 20 73 20 69 6e 74 29 3b 0a 20 20   int, s int);.  
1120: 7d 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20 31  }.  for {set i 1
1130: 7d 20 7b 24 69 3c 3d 31 30 30 7d 20 7b 69 6e 63  } {$i<=100} {inc
1140: 72 20 69 7d 20 7b 0a 20 20 20 20 73 65 74 20 77  r i} {.    set w
1150: 20 24 69 0a 20 20 20 20 73 65 74 20 78 20 5b 65   $i.    set x [e
1160: 78 70 72 20 7b 69 6e 74 28 6c 6f 67 28 24 69 29  xpr {int(log($i)
1170: 2f 6c 6f 67 28 32 29 29 7d 5d 0a 20 20 20 20 73  /log(2))}].    s
1180: 65 74 20 79 20 5b 65 78 70 72 20 7b 24 69 2a 24  et y [expr {$i*$
1190: 69 20 2b 20 32 2a 24 69 20 2b 20 31 7d 5d 0a 20  i + 2*$i + 1}]. 
11a0: 20 20 20 65 78 65 63 73 71 6c 20 22 49 4e 53 45     execsql "INSE
11b0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
11c0: 53 28 24 77 2c 24 78 2c 24 79 29 22 0a 20 20 7d  S($w,$x,$y)".  }
11d0: 0a 20 20 73 65 74 20 6d 61 78 79 20 5b 65 78 65  .  set maxy [exe
11e0: 63 73 71 6c 20 7b 73 65 6c 65 63 74 20 6d 61 78  csql {select max
11f0: 28 79 29 20 66 72 6f 6d 20 74 31 7d 5d 0a 20 20  (y) from t1}].  
1200: 64 62 20 65 76 61 6c 20 7b 20 49 4e 53 45 52 54  db eval { INSERT
1210: 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20   INTO t2 SELECT 
1220: 31 30 31 2d 77 2c 20 78 2c 20 24 6d 61 78 79 2b  101-w, x, $maxy+
1230: 31 2d 79 2c 20 79 20 46 52 4f 4d 20 74 31 20 7d  1-y, y FROM t1 }
1240: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 69 6e  .} {}.do_test in
1250: 33 2d 32 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  3-2.2 {.  execsq
1260: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 72  l {.    SELECT r
1270: 6f 77 69 64 20 0a 20 20 20 20 46 52 4f 4d 20 74  owid .    FROM t
1280: 31 20 0a 20 20 20 20 57 48 45 52 45 20 72 6f 77  1 .    WHERE row
1290: 69 64 20 49 4e 20 28 53 45 4c 45 43 54 20 72 6f  id IN (SELECT ro
12a0: 77 69 64 20 46 52 4f 4d 20 74 31 20 57 48 45 52  wid FROM t1 WHER
12b0: 45 20 72 6f 77 69 64 20 49 4e 20 28 31 2c 20 32  E rowid IN (1, 2
12c0: 29 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 7d 0a  ));.  }.} {1 2}.
12d0: 64 6f 5f 74 65 73 74 20 69 6e 33 2d 32 2e 33 20  do_test in3-2.3 
12e0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
12f0: 20 20 73 65 6c 65 63 74 20 72 6f 77 69 64 20 66    select rowid f
1300: 72 6f 6d 20 74 31 20 77 68 65 72 65 20 72 6f 77  rom t1 where row
1310: 69 64 20 49 4e 20 28 2d 31 2c 32 2c 34 29 0a 20  id IN (-1,2,4). 
1320: 20 7d 0a 7d 20 7b 32 20 34 7d 0a 64 6f 5f 74 65   }.} {2 4}.do_te
1330: 73 74 20 69 6e 33 2d 32 2e 34 20 7b 0a 20 20 65  st in3-2.4 {.  e
1340: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
1350: 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 74  ECT rowid FROM t
1360: 31 20 57 48 45 52 45 20 72 6f 77 69 64 20 49 4e  1 WHERE rowid IN
1370: 20 0a 20 20 20 20 20 20 20 28 73 65 6c 65 63 74   .       (select
1380: 20 72 6f 77 69 64 20 66 72 6f 6d 20 74 31 20 77   rowid from t1 w
1390: 68 65 72 65 20 72 6f 77 69 64 20 49 4e 20 28 2d  here rowid IN (-
13a0: 31 2c 32 2c 34 29 29 0a 20 20 7d 0a 7d 20 7b 32  1,2,4)).  }.} {2
13b0: 20 34 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   4}..#----------
13c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1400: 23 20 54 68 69 73 20 6e 65 78 74 20 62 6c 6f 63  # This next bloc
1410: 6b 20 6f 66 20 74 65 73 74 73 20 2d 20 69 6e 33  k of tests - in3
1420: 2d 33 2e 2a 20 2d 20 76 65 72 69 66 79 20 74 68  -3.* - verify th
1430: 61 74 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69  at column affini
1440: 74 79 20 69 73 0a 23 20 63 6f 72 72 65 63 74 6c  ty is.# correctl
1450: 79 20 68 61 6e 64 6c 65 64 20 69 6e 20 63 61 73  y handled in cas
1460: 65 73 20 77 68 65 72 65 20 61 6e 20 69 6e 64 65  es where an inde
1470: 78 20 6d 69 67 68 74 20 62 65 20 75 73 65 64 20  x might be used 
1480: 74 6f 20 6f 70 74 69 6d 69 73 65 0a 23 20 61 6e  to optimise.# an
1490: 20 49 4e 20 28 53 45 4c 45 43 54 29 20 65 78 70   IN (SELECT) exp
14a0: 72 65 73 73 69 6f 6e 2e 0a 23 0a 64 6f 5f 74 65  ression..#.do_te
14b0: 73 74 20 69 6e 33 2d 33 2e 31 20 7b 0a 20 20 63  st in3-3.1 {.  c
14c0: 61 74 63 68 20 7b 65 78 65 63 73 71 6c 20 7b 0a  atch {execsql {.
14d0: 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74      DROP TABLE t
14e0: 31 3b 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c  1;.    DROP TABL
14f0: 45 20 74 32 3b 0a 20 20 7d 7d 0a 0a 20 20 65 78  E t2;.  }}..  ex
1500: 65 63 73 71 6c 20 7b 0a 0a 20 20 20 20 43 52 45  ecsql {..    CRE
1510: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 42  ATE TABLE t1(a B
1520: 4c 4f 42 2c 20 62 20 4e 55 4d 42 45 52 20 2c 63  LOB, b NUMBER ,c
1530: 20 54 45 58 54 29 3b 0a 20 20 20 20 43 52 45 41   TEXT);.    CREA
1540: 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45 58 20  TE UNIQUE INDEX 
1550: 74 31 5f 69 31 20 4f 4e 20 74 31 28 61 29 3b 20  t1_i1 ON t1(a); 
1560: 20 20 20 20 20 20 20 2f 2a 20 6e 6f 20 61 66 66         /* no aff
1570: 69 6e 69 74 79 20 2a 2f 0a 20 20 20 20 43 52 45  inity */.    CRE
1580: 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45 58  ATE UNIQUE INDEX
1590: 20 74 31 5f 69 32 20 4f 4e 20 74 31 28 62 29 3b   t1_i2 ON t1(b);
15a0: 20 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d 65 72          /* numer
15b0: 69 63 20 61 66 66 69 6e 69 74 79 20 2a 2f 0a 20  ic affinity */. 
15c0: 20 20 20 43 52 45 41 54 45 20 55 4e 49 51 55 45     CREATE UNIQUE
15d0: 20 49 4e 44 45 58 20 74 31 5f 69 33 20 4f 4e 20   INDEX t1_i3 ON 
15e0: 74 31 28 63 29 3b 20 20 20 20 20 20 20 20 2f 2a  t1(c);        /*
15f0: 20 74 65 78 74 20 61 66 66 69 6e 69 74 79 20 2a   text affinity *
1600: 2f 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  /..    CREATE TA
1610: 42 4c 45 20 74 32 28 78 20 42 4c 4f 42 2c 20 79  BLE t2(x BLOB, y
1620: 20 4e 55 4d 42 45 52 2c 20 7a 20 54 45 58 54 29   NUMBER, z TEXT)
1630: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 55 4e 49  ;.    CREATE UNI
1640: 51 55 45 20 49 4e 44 45 58 20 74 32 5f 69 31 20  QUE INDEX t2_i1 
1650: 4f 4e 20 74 32 28 78 29 3b 20 20 20 20 20 20 20  ON t2(x);       
1660: 20 2f 2a 20 6e 6f 20 61 66 66 69 6e 69 74 79 20   /* no affinity 
1670: 2a 2f 0a 20 20 20 20 43 52 45 41 54 45 20 55 4e  */.    CREATE UN
1680: 49 51 55 45 20 49 4e 44 45 58 20 74 32 5f 69 32  IQUE INDEX t2_i2
1690: 20 4f 4e 20 74 32 28 79 29 3b 20 20 20 20 20 20   ON t2(y);      
16a0: 20 20 2f 2a 20 6e 75 6d 65 72 69 63 20 61 66 66    /* numeric aff
16b0: 69 6e 69 74 79 20 2a 2f 0a 20 20 20 20 43 52 45  inity */.    CRE
16c0: 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45 58  ATE UNIQUE INDEX
16d0: 20 74 32 5f 69 33 20 4f 4e 20 74 32 28 7a 29 3b   t2_i3 ON t2(z);
16e0: 20 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20          /* text 
16f0: 61 66 66 69 6e 69 74 79 20 2a 2f 0a 0a 20 20 20  affinity */..   
1700: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
1710: 56 41 4c 55 45 53 28 31 2c 20 31 2c 20 31 29 3b  VALUES(1, 1, 1);
1720: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
1730: 20 74 32 20 56 41 4c 55 45 53 28 27 31 27 2c 20   t2 VALUES('1', 
1740: 27 31 27 2c 20 27 31 27 29 3b 0a 20 20 7d 0a 7d  '1', '1');.  }.}
1750: 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 69 6e 33   {}..do_test in3
1760: 2d 33 2e 32 20 7b 0a 20 20 23 20 4e 6f 20 61 66  -3.2 {.  # No af
1770: 66 69 6e 69 74 79 20 69 73 20 61 70 70 6c 69 65  finity is applie
1780: 64 20 62 65 66 6f 72 65 20 63 6f 6d 70 61 72 69  d before compari
1790: 6e 67 20 22 78 22 20 61 6e 64 20 22 61 22 2e 20  ng "x" and "a". 
17a0: 54 68 65 72 65 66 6f 72 65 0a 20 20 23 20 74 68  Therefore.  # th
17b0: 65 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75  e index can be u
17c0: 73 65 64 20 28 74 68 65 20 63 6f 6d 70 61 72 69  sed (the compari
17d0: 73 6f 6e 20 69 73 20 66 61 6c 73 65 2c 20 74 65  son is false, te
17e0: 78 74 21 3d 6e 75 6d 62 65 72 29 2e 0a 20 20 65  xt!=number)..  e
17f0: 78 65 63 5f 6e 65 70 68 20 7b 20 53 45 4c 45 43  xec_neph { SELEC
1800: 54 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 61  T x IN (SELECT a
1810: 20 46 52 4f 4d 20 74 31 29 20 46 52 4f 4d 20 74   FROM t1) FROM t
1820: 32 20 7d 0a 7d 20 7b 30 20 30 7d 0a 64 6f 5f 74  2 }.} {0 0}.do_t
1830: 65 73 74 20 69 6e 33 2d 33 2e 33 20 7b 0a 20 20  est in3-3.3 {.  
1840: 23 20 4c 6f 67 69 63 61 6c 6c 79 2c 20 6e 75 6d  # Logically, num
1850: 65 72 69 63 20 61 66 66 69 6e 69 74 79 20 69 73  eric affinity is
1860: 20 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74 68   applied to both
1870: 20 73 69 64 65 73 20 62 65 66 6f 72 65 20 0a 20   sides before . 
1880: 20 23 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f   # the compariso
1890: 6e 2e 20 20 54 68 65 72 65 66 6f 72 65 20 69 74  n.  Therefore it
18a0: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
18b0: 75 73 65 20 69 6e 64 65 78 20 74 31 5f 69 32 2e  use index t1_i2.
18c0: 0a 20 20 65 78 65 63 5f 6e 65 70 68 20 7b 20 53  .  exec_neph { S
18d0: 45 4c 45 43 54 20 78 20 49 4e 20 28 53 45 4c 45  ELECT x IN (SELE
18e0: 43 54 20 62 20 46 52 4f 4d 20 74 31 29 20 46 52  CT b FROM t1) FR
18f0: 4f 4d 20 74 32 20 7d 0a 7d 20 7b 30 20 31 7d 0a  OM t2 }.} {0 1}.
1900: 64 6f 5f 74 65 73 74 20 69 6e 33 2d 33 2e 34 20  do_test in3-3.4 
1910: 7b 0a 20 20 23 20 4e 6f 20 61 66 66 69 6e 69 74  {.  # No affinit
1920: 79 20 69 73 20 61 70 70 6c 69 65 64 20 62 65 66  y is applied bef
1930: 6f 72 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73  ore the comparis
1940: 6f 6e 20 74 61 6b 65 73 20 70 6c 61 63 65 2e 20  on takes place. 
1950: 4d 61 6b 69 6e 67 0a 20 20 23 20 69 74 20 70 6f  Making.  # it po
1960: 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 69 6e  ssible to use in
1970: 64 65 78 20 74 31 5f 69 33 2e 0a 20 20 65 78 65  dex t1_i3..  exe
1980: 63 5f 6e 65 70 68 20 7b 20 53 45 4c 45 43 54 20  c_neph { SELECT 
1990: 78 20 49 4e 20 28 53 45 4c 45 43 54 20 63 20 46  x IN (SELECT c F
19a0: 52 4f 4d 20 74 31 29 20 46 52 4f 4d 20 74 32 20  ROM t1) FROM t2 
19b0: 7d 0a 7d 20 7b 30 20 31 7d 0a 0a 64 6f 5f 74 65  }.} {0 1}..do_te
19c0: 73 74 20 69 6e 33 2d 33 2e 35 20 7b 0a 20 20 23  st in3-3.5 {.  #
19d0: 20 4e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   Numeric affinit
19e0: 79 20 73 68 6f 75 6c 64 20 62 65 20 61 70 70 6c  y should be appl
19f0: 69 65 64 20 74 6f 20 65 61 63 68 20 73 69 64 65  ied to each side
1a00: 20 62 65 66 6f 72 65 20 74 68 65 20 63 6f 6d 70   before the comp
1a10: 61 72 69 73 6f 6e 0a 20 20 23 20 74 61 6b 65 73  arison.  # takes
1a20: 20 70 6c 61 63 65 2e 20 54 68 65 72 65 66 6f 72   place. Therefor
1a30: 65 20 77 65 20 63 61 6e 6e 6f 74 20 75 73 65 20  e we cannot use 
1a40: 69 6e 64 65 78 20 74 31 5f 69 31 2c 20 77 68 69  index t1_i1, whi
1a50: 63 68 20 68 61 73 20 6e 6f 20 61 66 66 69 6e 69  ch has no affini
1a60: 74 79 2e 0a 20 20 65 78 65 63 5f 6e 65 70 68 20  ty..  exec_neph 
1a70: 7b 20 53 45 4c 45 43 54 20 79 20 49 4e 20 28 53  { SELECT y IN (S
1a80: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 29  ELECT a FROM t1)
1a90: 20 46 52 4f 4d 20 74 32 20 7d 0a 7d 20 7b 31 20   FROM t2 }.} {1 
1aa0: 31 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 33 2d 33  1}.do_test in3-3
1ab0: 2e 36 20 7b 0a 20 20 23 20 4e 75 6d 65 72 69 63  .6 {.  # Numeric
1ac0: 20 61 66 66 69 6e 69 74 79 20 69 73 20 61 70 70   affinity is app
1ad0: 6c 69 65 64 20 74 6f 20 62 6f 74 68 20 73 69 64  lied to both sid
1ae0: 65 73 20 62 65 66 6f 72 65 20 0a 20 20 23 20 74  es before .  # t
1af0: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20  he comparison.  
1b00: 54 68 65 72 65 66 6f 72 65 20 69 74 20 69 73 20  Therefore it is 
1b10: 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20  possible to use 
1b20: 69 6e 64 65 78 20 74 31 5f 69 32 2e 0a 20 20 65  index t1_i2..  e
1b30: 78 65 63 5f 6e 65 70 68 20 7b 20 53 45 4c 45 43  xec_neph { SELEC
1b40: 54 20 79 20 49 4e 20 28 53 45 4c 45 43 54 20 62  T y IN (SELECT b
1b50: 20 46 52 4f 4d 20 74 31 29 20 46 52 4f 4d 20 74   FROM t1) FROM t
1b60: 32 20 7d 0a 7d 20 7b 30 20 31 7d 0a 64 6f 5f 74  2 }.} {0 1}.do_t
1b70: 65 73 74 20 69 6e 33 2d 33 2e 37 20 7b 0a 20 20  est in3-3.7 {.  
1b80: 23 20 4e 75 6d 65 72 69 63 20 61 66 66 69 6e 69  # Numeric affini
1b90: 74 79 20 69 73 20 61 70 70 6c 69 65 64 20 62 65  ty is applied be
1ba0: 66 6f 72 65 20 74 68 65 20 63 6f 6d 70 61 72 69  fore the compari
1bb0: 73 6f 6e 20 74 61 6b 65 73 20 70 6c 61 63 65 2e  son takes place.
1bc0: 20 0a 20 20 23 20 4d 61 6b 69 6e 67 20 69 74 20   .  # Making it 
1bd0: 69 6d 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73  impossible to us
1be0: 65 20 69 6e 64 65 78 20 74 31 5f 69 33 2e 0a 20  e index t1_i3.. 
1bf0: 20 65 78 65 63 5f 6e 65 70 68 20 7b 20 53 45 4c   exec_neph { SEL
1c00: 45 43 54 20 79 20 49 4e 20 28 53 45 4c 45 43 54  ECT y IN (SELECT
1c10: 20 63 20 46 52 4f 4d 20 74 31 29 20 46 52 4f 4d   c FROM t1) FROM
1c20: 20 74 32 20 7d 0a 7d 20 7b 31 20 31 7d 0a 0a 23   t2 }.} {1 1}..#
1c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c70: 2d 2d 2d 2d 2d 0a 23 0a 23 20 54 65 73 74 20 75  -----.#.# Test u
1c80: 73 69 6e 67 20 61 20 6d 75 6c 74 69 2d 63 6f 6c  sing a multi-col
1c90: 75 6d 6e 20 69 6e 64 65 78 2e 0a 23 0a 64 6f 5f  umn index..#.do_
1ca0: 74 65 73 74 20 69 6e 33 2d 34 2e 31 20 7b 0a 20  test in3-4.1 {. 
1cb0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
1cc0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 61  REATE TABLE t3(a
1cd0: 2c 20 62 2c 20 63 29 3b 0a 20 20 20 20 43 52 45  , b, c);.    CRE
1ce0: 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45 58  ATE UNIQUE INDEX
1cf0: 20 74 33 5f 69 20 4f 4e 20 74 33 28 62 2c 20 61   t3_i ON t3(b, a
1d00: 29 3b 0a 20 20 7d 0a 0a 20 20 65 78 65 63 73 71  );.  }..  execsq
1d10: 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  l {.    INSERT I
1d20: 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 31 2c  NTO t3 VALUES(1,
1d30: 20 27 6e 75 6d 65 72 69 63 27 2c 20 32 29 3b 0a   'numeric', 2);.
1d40: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1d50: 74 33 20 56 41 4c 55 45 53 28 32 2c 20 27 74 65  t3 VALUES(2, 'te
1d60: 78 74 27 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53  xt', 2);.    INS
1d70: 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55  ERT INTO t3 VALU
1d80: 45 53 28 33 2c 20 27 72 65 61 6c 27 2c 20 32 29  ES(3, 'real', 2)
1d90: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
1da0: 4f 20 74 33 20 56 41 4c 55 45 53 28 34 2c 20 27  O t3 VALUES(4, '
1db0: 6e 6f 6e 65 27 2c 20 32 29 3b 0a 20 20 7d 0a 7d  none', 2);.  }.}
1dc0: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 33 2d   {}.do_test in3-
1dd0: 34 2e 32 20 7b 0a 20 20 65 78 65 63 5f 6e 65 70  4.2 {.  exec_nep
1de0: 68 20 7b 20 53 45 4c 45 43 54 20 27 74 65 78 74  h { SELECT 'text
1df0: 27 20 49 4e 20 28 53 45 4c 45 43 54 20 62 20 46  ' IN (SELECT b F
1e00: 52 4f 4d 20 74 33 29 20 7d 0a 7d 20 7b 30 20 31  ROM t3) }.} {0 1
1e10: 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 33 2d 34 2e  }.do_test in3-4.
1e20: 33 20 7b 0a 20 20 65 78 65 63 5f 6e 65 70 68 20  3 {.  exec_neph 
1e30: 7b 20 53 45 4c 45 43 54 20 27 54 45 58 54 27 20  { SELECT 'TEXT' 
1e40: 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 49  COLLATE nocase I
1e50: 4e 20 28 53 45 4c 45 43 54 20 62 20 46 52 4f 4d  N (SELECT b FROM
1e60: 20 74 33 29 20 7d 0a 7d 20 7b 31 20 31 7d 0a 64   t3) }.} {1 1}.d
1e70: 6f 5f 74 65 73 74 20 69 6e 33 2d 34 2e 34 20 7b  o_test in3-4.4 {
1e80: 0a 20 20 23 20 41 20 74 65 6d 70 20 74 61 62 6c  .  # A temp tabl
1e90: 65 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 62  e must be used b
1ea0: 65 63 61 75 73 65 20 74 33 5f 69 2e 62 20 69 73  ecause t3_i.b is
1eb0: 20 6e 6f 74 20 67 75 61 72 61 6e 74 65 65 64 20   not guaranteed 
1ec0: 74 6f 20 62 65 20 75 6e 69 71 75 65 2e 0a 20 20  to be unique..  
1ed0: 65 78 65 63 5f 6e 65 70 68 20 7b 20 53 45 4c 45  exec_neph { SELE
1ee0: 43 54 20 62 20 46 52 4f 4d 20 74 33 20 57 48 45  CT b FROM t3 WHE
1ef0: 52 45 20 62 20 49 4e 20 28 53 45 4c 45 43 54 20  RE b IN (SELECT 
1f00: 62 20 46 52 4f 4d 20 74 33 29 20 7d 0a 7d 20 7b  b FROM t3) }.} {
1f10: 31 20 6e 6f 6e 65 20 6e 75 6d 65 72 69 63 20 72  1 none numeric r
1f20: 65 61 6c 20 74 65 78 74 7d 0a 64 6f 5f 74 65 73  eal text}.do_tes
1f30: 74 20 69 6e 33 2d 34 2e 35 20 7b 0a 20 20 65 78  t in3-4.5 {.  ex
1f40: 65 63 73 71 6c 20 7b 20 43 52 45 41 54 45 20 55  ecsql { CREATE U
1f50: 4e 49 51 55 45 20 49 4e 44 45 58 20 74 33 5f 69  NIQUE INDEX t3_i
1f60: 32 20 4f 4e 20 74 33 28 62 29 20 7d 0a 20 20 65  2 ON t3(b) }.  e
1f70: 78 65 63 5f 6e 65 70 68 20 7b 20 53 45 4c 45 43  xec_neph { SELEC
1f80: 54 20 62 20 46 52 4f 4d 20 74 33 20 57 48 45 52  T b FROM t3 WHER
1f90: 45 20 62 20 49 4e 20 28 53 45 4c 45 43 54 20 62  E b IN (SELECT b
1fa0: 20 46 52 4f 4d 20 74 33 29 20 7d 0a 7d 20 7b 30   FROM t3) }.} {0
1fb0: 20 6e 6f 6e 65 20 6e 75 6d 65 72 69 63 20 72 65   none numeric re
1fc0: 61 6c 20 74 65 78 74 7d 0a 64 6f 5f 74 65 73 74  al text}.do_test
1fd0: 20 69 6e 33 2d 34 2e 36 20 7b 0a 20 20 65 78 65   in3-4.6 {.  exe
1fe0: 63 73 71 6c 20 7b 20 44 52 4f 50 20 49 4e 44 45  csql { DROP INDE
1ff0: 58 20 74 33 5f 69 32 20 7d 0a 7d 20 7b 7d 0a 0a  X t3_i2 }.} {}..
2000: 66 69 6e 69 73 68 5f 74 65 73 74 0a              finish_test.