SQLite4
Hex Artifact Content
Not logged in

Artifact 30fe94bda22292a120a73481106e724b494594cf:


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 35 20 32 30 30 38 2f 30 38 2f 30 34  v 1.5 2008/08/04
0220: 20 30 33 3a 35 31 3a 32 34 20 64 61 6e 69 65 6c   03:51:24 daniel
0230: 6b 31 39 37 37 20 45 78 70 20 24 0a 0a 73 65 74  k1977 Exp $..set
0240: 20 74 65 73 74 64 69 72 20 5b 66 69 6c 65 20 64   testdir [file d
0250: 69 72 6e 61 6d 65 20 24 61 72 67 76 30 5d 0a 73  irname $argv0].s
0260: 6f 75 72 63 65 20 24 74 65 73 74 64 69 72 2f 74  ource $testdir/t
0270: 65 73 74 65 72 2e 74 63 6c 0a 0a 69 66 63 61 70  ester.tcl..ifcap
0280: 61 62 6c 65 20 21 73 75 62 71 75 65 72 79 20 7b  able !subquery {
0290: 0a 20 20 66 69 6e 69 73 68 5f 74 65 73 74 0a 20  .  finish_test. 
02a0: 20 72 65 74 75 72 6e 0a 7d 0a 0a 23 20 52 65 74   return.}..# Ret
02b0: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
02c0: 66 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  f OpenEphemeral 
02d0: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 75 73 65  instructions use
02e0: 64 20 69 6e 20 74 68 65 0a 23 20 69 6d 70 6c 65  d in the.# imple
02f0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
0300: 20 73 71 6c 20 73 74 61 74 65 6d 65 6e 74 20 70   sql statement p
0310: 61 73 73 65 64 20 61 73 20 61 20 61 6e 20 61 72  assed as a an ar
0320: 67 75 6d 65 6e 74 2e 0a 23 0a 70 72 6f 63 20 6e  gument..#.proc n
0330: 45 70 68 65 6d 65 72 61 6c 20 7b 73 71 6c 7d 20  Ephemeral {sql} 
0340: 7b 0a 20 20 73 65 74 20 6e 45 70 68 20 30 0a 20  {.  set nEph 0. 
0350: 20 66 6f 72 65 61 63 68 20 6f 70 20 5b 65 78 65   foreach op [exe
0360: 63 73 71 6c 20 22 45 58 50 4c 41 49 4e 20 24 73  csql "EXPLAIN $s
0370: 71 6c 22 5d 20 7b 0a 20 20 20 20 69 66 20 7b 24  ql"] {.    if {$
0380: 6f 70 20 65 71 20 22 4f 70 65 6e 45 70 68 65 6d  op eq "OpenEphem
0390: 65 72 61 6c 22 7d 20 7b 69 6e 63 72 20 6e 45 70  eral"} {incr nEp
03a0: 68 7d 0a 20 20 7d 0a 20 20 73 65 74 20 6e 45 70  h}.  }.  set nEp
03b0: 68 0a 7d 0a 0a 23 20 54 68 69 73 20 70 72 6f 63  h.}..# This proc
03c0: 20 77 6f 72 6b 73 20 74 68 65 20 73 61 6d 65 20   works the same 
03d0: 77 61 79 20 61 73 20 65 78 65 63 73 71 6c 2c 20  way as execsql, 
03e0: 65 78 63 65 70 74 20 74 68 61 74 20 74 68 65 20  except that the 
03f0: 6e 75 6d 62 65 72 0a 23 20 6f 66 20 4f 70 65 6e  number.# of Open
0400: 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75  Ephemeral instru
0410: 63 74 69 6f 6e 73 20 75 73 65 64 20 69 6e 20 74  ctions used in t
0420: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
0430: 6e 20 6f 66 20 74 68 65 0a 23 20 73 74 61 74 65  n of the.# state
0440: 6d 65 6e 74 20 69 73 20 69 6e 73 65 72 74 65 64  ment is inserted
0450: 20 69 6e 74 6f 20 74 68 65 20 73 74 61 72 74 20   into the start 
0460: 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  of the returned 
0470: 6c 69 73 74 2e 0a 23 0a 70 72 6f 63 20 65 78 65  list..#.proc exe
0480: 63 5f 6e 65 70 68 20 7b 73 71 6c 7d 20 7b 0a 20  c_neph {sql} {. 
0490: 20 72 65 74 75 72 6e 20 5b 63 6f 6e 63 61 74 20   return [concat 
04a0: 5b 6e 45 70 68 65 6d 65 72 61 6c 20 24 73 71 6c  [nEphemeral $sql
04b0: 5d 20 5b 65 78 65 63 73 71 6c 20 24 73 71 6c 5d  ] [execsql $sql]
04c0: 5d 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 69 6e 33  ].}..do_test in3
04d0: 2d 31 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  -1.1 {.  execsql
04e0: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
04f0: 42 4c 45 20 74 31 28 61 20 50 52 49 4d 41 52 59  BLE t1(a PRIMARY
0500: 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20 49 4e   KEY, b);.    IN
0510: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
0520: 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 49  UES(1, 2);.    I
0530: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
0540: 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20 20 20  LUES(3, 4);.    
0550: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
0560: 41 4c 55 45 53 28 35 2c 20 36 29 3b 0a 0a 20 20  ALUES(5, 6);..  
0570: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
0580: 32 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53  2(a, b);.    INS
0590: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
05a0: 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 49 4e  ES(1, 2);.    IN
05b0: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
05c0: 55 45 53 28 33 2c 20 34 29 3b 0a 20 20 20 20 49  UES(3, 4);.    I
05d0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
05e0: 4c 55 45 53 28 35 2c 20 36 29 3b 0a 20 20 7d 0a  LUES(5, 6);.  }.
05f0: 7d 20 7b 7d 0a 0a 23 20 41 6c 6c 20 6f 66 20 74  } {}..# All of t
0600: 68 65 73 65 20 71 75 65 72 69 65 73 20 73 68 6f  hese queries sho
0610: 75 6c 64 20 61 76 6f 69 64 20 75 73 69 6e 67 20  uld avoid using 
0620: 61 20 74 65 6d 70 2d 74 61 62 6c 65 3a 0a 23 0a  a temp-table:.#.
0630: 64 6f 5f 74 65 73 74 20 69 6e 33 2d 31 2e 32 20  do_test in3-1.2 
0640: 7b 0a 20 20 65 78 65 63 5f 6e 65 70 68 20 7b 20  {.  exec_neph { 
0650: 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f  SELECT rowid FRO
0660: 4d 20 74 32 20 57 48 45 52 45 20 72 6f 77 69 64  M t2 WHERE rowid
0670: 20 49 4e 20 28 53 45 4c 45 43 54 20 72 6f 77 69   IN (SELECT rowi
0680: 64 20 46 52 4f 4d 20 74 32 29 3b 20 7d 0a 7d 20  d FROM t2); }.} 
0690: 7b 30 20 31 20 32 20 33 7d 0a 64 6f 5f 74 65 73  {0 1 2 3}.do_tes
06a0: 74 20 69 6e 33 2d 31 2e 33 20 7b 0a 20 20 65 78  t in3-1.3 {.  ex
06b0: 65 63 5f 6e 65 70 68 20 7b 20 53 45 4c 45 43 54  ec_neph { SELECT
06c0: 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   a FROM t1 WHERE
06d0: 20 61 20 49 4e 20 28 53 45 4c 45 43 54 20 61 20   a IN (SELECT a 
06e0: 46 52 4f 4d 20 74 31 29 3b 20 7d 0a 7d 20 7b 30  FROM t1); }.} {0
06f0: 20 31 20 33 20 35 7d 0a 64 6f 5f 74 65 73 74 20   1 3 5}.do_test 
0700: 69 6e 33 2d 31 2e 34 20 7b 0a 20 20 65 78 65 63  in3-1.4 {.  exec
0710: 5f 6e 65 70 68 20 7b 20 53 45 4c 45 43 54 20 72  _neph { SELECT r
0720: 6f 77 69 64 20 46 52 4f 4d 20 74 32 20 57 48 45  owid FROM t2 WHE
0730: 52 45 20 72 6f 77 69 64 2b 30 20 49 4e 20 28 53  RE rowid+0 IN (S
0740: 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d  ELECT rowid FROM
0750: 20 74 32 29 3b 20 7d 0a 7d 20 7b 30 20 31 20 32   t2); }.} {0 1 2
0760: 20 33 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 33 2d   3}.do_test in3-
0770: 31 2e 35 20 7b 0a 20 20 65 78 65 63 5f 6e 65 70  1.5 {.  exec_nep
0780: 68 20 7b 20 53 45 4c 45 43 54 20 61 20 46 52 4f  h { SELECT a FRO
0790: 4d 20 74 31 20 57 48 45 52 45 20 61 2b 30 20 49  M t1 WHERE a+0 I
07a0: 4e 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  N (SELECT a FROM
07b0: 20 74 31 29 3b 20 7d 0a 7d 20 7b 30 20 31 20 33   t1); }.} {0 1 3
07c0: 20 35 7d 0a 0a 23 20 42 65 63 61 75 73 65 20 6e   5}..# Because n
07d0: 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 2d 73  one of the sub-s
07e0: 65 6c 65 63 74 20 71 75 65 72 69 65 73 20 69 6e  elect queries in
07f0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
0800: 74 61 74 65 6d 65 6e 74 73 0a 23 20 6d 61 74 63  tatements.# matc
0810: 68 20 74 68 65 20 70 61 74 74 65 72 6e 20 28 22  h the pattern ("
0820: 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20  SELECT <column> 
0830: 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 22 29 2c 20  FROM <table>"), 
0840: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 6f  the following do
0850: 20 0a 23 20 72 65 71 75 69 72 65 20 61 20 74 65   .# require a te
0860: 6d 70 20 74 61 62 6c 65 2e 0a 23 0a 64 6f 5f 74  mp table..#.do_t
0870: 65 73 74 20 69 6e 33 2d 31 2e 36 20 7b 0a 20 20  est in3-1.6 {.  
0880: 65 78 65 63 5f 6e 65 70 68 20 7b 20 53 45 4c 45  exec_neph { SELE
0890: 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 74 32  CT rowid FROM t2
08a0: 20 57 48 45 52 45 20 72 6f 77 69 64 20 49 4e 20   WHERE rowid IN 
08b0: 28 53 45 4c 45 43 54 20 72 6f 77 69 64 2b 30 20  (SELECT rowid+0 
08c0: 46 52 4f 4d 20 74 32 29 3b 20 7d 0a 7d 20 7b 31  FROM t2); }.} {1
08d0: 20 31 20 32 20 33 7d 0a 64 6f 5f 74 65 73 74 20   1 2 3}.do_test 
08e0: 69 6e 33 2d 31 2e 37 20 7b 0a 20 20 65 78 65 63  in3-1.7 {.  exec
08f0: 5f 6e 65 70 68 20 7b 20 53 45 4c 45 43 54 20 61  _neph { SELECT a
0900: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
0910: 20 49 4e 20 28 53 45 4c 45 43 54 20 61 2b 30 20   IN (SELECT a+0 
0920: 46 52 4f 4d 20 74 31 29 3b 20 7d 0a 7d 20 7b 31  FROM t1); }.} {1
0930: 20 31 20 33 20 35 7d 0a 64 6f 5f 74 65 73 74 20   1 3 5}.do_test 
0940: 69 6e 33 2d 31 2e 38 20 7b 0a 20 20 65 78 65 63  in3-1.8 {.  exec
0950: 5f 6e 65 70 68 20 7b 20 53 45 4c 45 43 54 20 61  _neph { SELECT a
0960: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
0970: 20 49 4e 20 28 53 45 4c 45 43 54 20 61 20 46 52   IN (SELECT a FR
0980: 4f 4d 20 74 31 20 57 48 45 52 45 20 31 29 3b 20  OM t1 WHERE 1); 
0990: 7d 0a 7d 20 7b 31 20 31 20 33 20 35 7d 0a 64 6f  }.} {1 1 3 5}.do
09a0: 5f 74 65 73 74 20 69 6e 33 2d 31 2e 39 20 7b 0a  _test in3-1.9 {.
09b0: 20 20 65 78 65 63 5f 6e 65 70 68 20 7b 20 53 45    exec_neph { SE
09c0: 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 57  LECT a FROM t1 W
09d0: 48 45 52 45 20 61 20 49 4e 20 28 53 45 4c 45 43  HERE a IN (SELEC
09e0: 54 20 61 20 46 52 4f 4d 20 74 31 20 47 52 4f 55  T a FROM t1 GROU
09f0: 50 20 42 59 20 61 29 3b 20 7d 0a 7d 20 7b 31 20  P BY a); }.} {1 
0a00: 31 20 33 20 35 7d 0a 0a 23 20 54 68 69 73 20 73  1 3 5}..# This s
0a10: 68 6f 75 6c 64 20 6e 6f 74 20 75 73 65 20 61 20  hould not use a 
0a20: 74 65 6d 70 2d 74 61 62 6c 65 2e 20 45 76 65 6e  temp-table. Even
0a30: 20 74 68 6f 75 67 68 20 74 68 65 20 73 75 62 2d   though the sub-
0a40: 73 65 6c 65 63 74 20 64 6f 65 73 0a 23 20 6e 6f  select does.# no
0a50: 74 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 20  t exactly match 
0a60: 74 68 65 20 70 61 74 74 65 72 6e 20 22 53 45 4c  the pattern "SEL
0a70: 45 43 54 20 3c 63 6f 6c 75 6d 6e 3e 20 46 52 4f  ECT <column> FRO
0a80: 4d 20 3c 74 61 62 6c 65 3e 22 2c 20 69 6e 0a 23  M <table>", in.#
0a90: 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 4f   this case the O
0aa0: 52 44 45 52 20 42 59 20 69 73 20 61 20 6e 6f 2d  RDER BY is a no-
0ab0: 6f 70 20 61 6e 64 20 63 61 6e 20 62 65 20 69 67  op and can be ig
0ac0: 6e 6f 72 65 64 2e 0a 64 6f 5f 74 65 73 74 20 69  nored..do_test i
0ad0: 6e 33 2d 31 2e 31 30 20 7b 0a 20 20 65 78 65 63  n3-1.10 {.  exec
0ae0: 5f 6e 65 70 68 20 7b 20 53 45 4c 45 43 54 20 61  _neph { SELECT a
0af0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
0b00: 20 49 4e 20 28 53 45 4c 45 43 54 20 61 20 46 52   IN (SELECT a FR
0b10: 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 61  OM t1 ORDER BY a
0b20: 29 3b 20 7d 0a 7d 20 7b 30 20 31 20 33 20 35 7d  ); }.} {0 1 3 5}
0b30: 0a 0a 23 20 54 68 65 73 65 20 64 6f 20 75 73 65  ..# These do use
0b40: 20 74 68 65 20 74 65 6d 70 2d 74 61 62 6c 65 2e   the temp-table.
0b50: 20 41 64 64 69 6e 67 20 74 68 65 20 4c 49 4d 49   Adding the LIMI
0b60: 54 20 63 6c 61 75 73 65 20 6d 65 61 6e 73 20 74  T clause means t
0b70: 68 65 20 0a 23 20 4f 52 44 45 52 20 42 59 20 63  he .# ORDER BY c
0b80: 61 6e 6e 6f 74 20 62 65 20 69 67 6e 6f 72 65 64  annot be ignored
0b90: 2e 0a 64 6f 5f 74 65 73 74 20 69 6e 33 2d 31 2e  ..do_test in3-1.
0ba0: 31 31 20 7b 0a 20 20 65 78 65 63 5f 6e 65 70 68  11 {.  exec_neph
0bb0: 20 7b 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   {SELECT a FROM 
0bc0: 74 31 20 57 48 45 52 45 20 61 20 49 4e 20 28 53  t1 WHERE a IN (S
0bd0: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20  ELECT a FROM t1 
0be0: 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54  ORDER BY a LIMIT
0bf0: 20 31 29 7d 0a 7d 20 7b 31 20 31 7d 0a 64 6f 5f   1)}.} {1 1}.do_
0c00: 74 65 73 74 20 69 6e 33 2d 31 2e 31 32 20 7b 0a  test in3-1.12 {.
0c10: 20 20 65 78 65 63 5f 6e 65 70 68 20 7b 0a 20 20    exec_neph {.  
0c20: 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
0c30: 74 31 20 57 48 45 52 45 20 61 20 49 4e 20 28 53  t1 WHERE a IN (S
0c40: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20  ELECT a FROM t1 
0c50: 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49 54  ORDER BY a LIMIT
0c60: 20 31 20 4f 46 46 53 45 54 20 31 29 0a 20 20 7d   1 OFFSET 1).  }
0c70: 0a 7d 20 7b 31 20 33 7d 0a 0a 23 20 48 61 73 20  .} {1 3}..# Has 
0c80: 74 6f 20 75 73 65 20 61 20 74 65 6d 70 2d 74 61  to use a temp-ta
0c90: 62 6c 65 20 62 65 63 61 75 73 65 20 6f 66 20 74  ble because of t
0ca0: 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d  he compound sub-
0cb0: 73 65 6c 65 63 74 2e 0a 23 0a 69 66 63 61 70 61  select..#.ifcapa
0cc0: 62 6c 65 20 63 6f 6d 70 6f 75 6e 64 20 7b 0a 20  ble compound {. 
0cd0: 20 64 6f 5f 74 65 73 74 20 69 6e 33 2d 31 2e 31   do_test in3-1.1
0ce0: 33 20 7b 0a 20 20 20 20 65 78 65 63 5f 6e 65 70  3 {.    exec_nep
0cf0: 68 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  h {.      SELECT
0d00: 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   a FROM t1 WHERE
0d10: 20 61 20 49 4e 20 28 0a 20 20 20 20 20 20 20 20   a IN (.        
0d20: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
0d30: 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43   UNION ALL SELEC
0d40: 54 20 61 20 46 52 4f 4d 20 74 31 0a 20 20 20 20  T a FROM t1.    
0d50: 20 20 29 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31    ).    }.  } {1
0d60: 20 31 20 33 20 35 7d 0a 7d 0a 0a 23 20 54 68 65   1 3 5}.}..# The
0d70: 20 66 69 72 73 74 20 6f 66 20 74 68 65 73 65 20   first of these 
0d80: 71 75 65 72 69 65 73 20 68 61 73 20 74 6f 20 75  queries has to u
0d90: 73 65 20 74 68 65 20 74 65 6d 70 2d 74 61 62 6c  se the temp-tabl
0da0: 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 0a  e, because the .
0db0: 23 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  # collation sequ
0dc0: 65 6e 63 65 20 75 73 65 64 20 66 6f 72 20 74 68  ence used for th
0dd0: 65 20 69 6e 64 65 78 20 6f 6e 20 22 74 31 2e 61  e index on "t1.a
0de0: 22 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  " does not match
0df0: 20 74 68 65 0a 23 20 63 6f 6c 6c 61 74 69 6f 6e   the.# collation
0e00: 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20 62   sequence used b
0e10: 79 20 74 68 65 20 22 49 4e 22 20 63 6f 6d 70 61  y the "IN" compa
0e20: 72 69 73 6f 6e 2e 20 54 68 65 20 73 65 63 6f 6e  rison. The secon
0e30: 64 20 64 6f 65 73 20 6e 6f 74 0a 23 20 72 65 71  d does not.# req
0e40: 75 69 72 65 20 61 20 74 65 6d 70 2d 74 61 62 6c  uire a temp-tabl
0e50: 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 63  e, because the c
0e60: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
0e70: 65 73 20 6d 61 74 63 68 2e 0a 23 0a 64 6f 5f 74  es match..#.do_t
0e80: 65 73 74 20 69 6e 33 2d 31 2e 31 34 20 7b 0a 20  est in3-1.14 {. 
0e90: 20 65 78 65 63 5f 6e 65 70 68 20 7b 20 53 45 4c   exec_neph { SEL
0ea0: 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 57 48  ECT a FROM t1 WH
0eb0: 45 52 45 20 61 20 43 4f 4c 4c 41 54 45 20 6e 6f  ERE a COLLATE no
0ec0: 63 61 73 65 20 49 4e 20 28 53 45 4c 45 43 54 20  case IN (SELECT 
0ed0: 61 20 46 52 4f 4d 20 74 31 29 20 7d 0a 7d 20 7b  a FROM t1) }.} {
0ee0: 31 20 31 20 33 20 35 7d 0a 64 6f 5f 74 65 73 74  1 1 3 5}.do_test
0ef0: 20 69 6e 33 2d 31 2e 31 35 20 7b 0a 20 20 65 78   in3-1.15 {.  ex
0f00: 65 63 5f 6e 65 70 68 20 7b 20 53 45 4c 45 43 54  ec_neph { SELECT
0f10: 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   a FROM t1 WHERE
0f20: 20 61 20 43 4f 4c 4c 41 54 45 20 62 69 6e 61 72   a COLLATE binar
0f30: 79 20 49 4e 20 28 53 45 4c 45 43 54 20 61 20 46  y IN (SELECT a F
0f40: 52 4f 4d 20 74 31 29 20 7d 0a 7d 20 7b 30 20 31  ROM t1) }.} {0 1
0f50: 20 33 20 35 7d 0a 0a 23 20 54 68 65 20 66 6f 6c   3 5}..# The fol
0f60: 6c 6f 77 69 6e 67 20 74 65 73 74 73 20 2d 20 69  lowing tests - i
0f70: 6e 33 2e 32 2e 2a 20 2d 20 74 65 73 74 20 61 20  n3.2.* - test a 
0f80: 62 75 67 20 74 68 61 74 20 77 61 73 20 64 69 66  bug that was dif
0f90: 66 69 63 75 6c 74 20 74 6f 20 74 72 61 63 6b 0a  ficult to track.
0fa0: 23 20 64 6f 77 6e 20 64 75 72 69 6e 67 20 64 65  # down during de
0fb0: 76 65 6c 6f 70 6d 65 6e 74 2e 20 54 68 65 79 20  velopment. They 
0fc0: 61 72 65 20 6e 6f 74 20 70 61 72 74 69 63 75 6c  are not particul
0fd0: 61 72 6c 79 20 77 65 6c 6c 20 66 6f 63 75 73 65  arly well focuse
0fe0: 64 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 69 6e 33  d..#.do_test in3
0ff0: 2d 32 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  -2.1 {.  execsql
1000: 20 7b 0a 20 20 20 20 44 52 4f 50 20 54 41 42 4c   {.    DROP TABL
1010: 45 20 49 46 20 45 58 49 53 54 53 20 74 31 3b 0a  E IF EXISTS t1;.
1020: 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 49      DROP TABLE I
1030: 46 20 45 58 49 53 54 53 20 74 32 3b 0a 20 20 20  F EXISTS t2;.   
1040: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
1050: 28 77 20 69 6e 74 2c 20 78 20 69 6e 74 2c 20 79  (w int, x int, y
1060: 20 69 6e 74 29 3b 0a 20 20 20 20 43 52 45 41 54   int);.    CREAT
1070: 45 20 54 41 42 4c 45 20 74 32 28 70 20 69 6e 74  E TABLE t2(p int
1080: 2c 20 71 20 69 6e 74 2c 20 72 20 69 6e 74 2c 20  , q int, r int, 
1090: 73 20 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 66 6f  s int);.  }.  fo
10a0: 72 20 7b 73 65 74 20 69 20 31 7d 20 7b 24 69 3c  r {set i 1} {$i<
10b0: 3d 31 30 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b  =100} {incr i} {
10c0: 0a 20 20 20 20 73 65 74 20 77 20 24 69 0a 20 20  .    set w $i.  
10d0: 20 20 73 65 74 20 78 20 5b 65 78 70 72 20 7b 69    set x [expr {i
10e0: 6e 74 28 6c 6f 67 28 24 69 29 2f 6c 6f 67 28 32  nt(log($i)/log(2
10f0: 29 29 7d 5d 0a 20 20 20 20 73 65 74 20 79 20 5b  ))}].    set y [
1100: 65 78 70 72 20 7b 24 69 2a 24 69 20 2b 20 32 2a  expr {$i*$i + 2*
1110: 24 69 20 2b 20 31 7d 5d 0a 20 20 20 20 65 78 65  $i + 1}].    exe
1120: 63 73 71 6c 20 22 49 4e 53 45 52 54 20 49 4e 54  csql "INSERT INT
1130: 4f 20 74 31 20 56 41 4c 55 45 53 28 24 77 2c 24  O t1 VALUES($w,$
1140: 78 2c 24 79 29 22 0a 20 20 7d 0a 20 20 73 65 74  x,$y)".  }.  set
1150: 20 6d 61 78 79 20 5b 65 78 65 63 73 71 6c 20 7b   maxy [execsql {
1160: 73 65 6c 65 63 74 20 6d 61 78 28 79 29 20 66 72  select max(y) fr
1170: 6f 6d 20 74 31 7d 5d 0a 20 20 64 62 20 65 76 61  om t1}].  db eva
1180: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
1190: 74 32 20 53 45 4c 45 43 54 20 31 30 31 2d 77 2c  t2 SELECT 101-w,
11a0: 20 78 2c 20 24 6d 61 78 79 2b 31 2d 79 2c 20 79   x, $maxy+1-y, y
11b0: 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 7d 0a   FROM t1 }.} {}.
11c0: 64 6f 5f 74 65 73 74 20 69 6e 33 2d 32 2e 32 20  do_test in3-2.2 
11d0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
11e0: 20 20 53 45 4c 45 43 54 20 72 6f 77 69 64 20 0a    SELECT rowid .
11f0: 20 20 20 20 46 52 4f 4d 20 74 32 20 0a 20 20 20      FROM t2 .   
1200: 20 57 48 45 52 45 20 72 6f 77 69 64 20 49 4e 20   WHERE rowid IN 
1210: 28 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52  (SELECT rowid FR
1220: 4f 4d 20 74 32 20 57 48 45 52 45 20 72 6f 77 69  OM t2 WHERE rowi
1230: 64 20 49 4e 20 28 31 2c 20 32 29 29 3b 0a 20 20  d IN (1, 2));.  
1240: 7d 0a 7d 20 7b 31 20 32 7d 0a 64 6f 5f 74 65 73  }.} {1 2}.do_tes
1250: 74 20 69 6e 33 2d 32 2e 33 20 7b 0a 20 20 65 78  t in3-2.3 {.  ex
1260: 65 63 73 71 6c 20 7b 0a 20 20 20 20 73 65 6c 65  ecsql {.    sele
1270: 63 74 20 72 6f 77 69 64 20 66 72 6f 6d 20 74 32  ct rowid from t2
1280: 20 77 68 65 72 65 20 72 6f 77 69 64 20 49 4e 20   where rowid IN 
1290: 28 2d 31 2c 32 2c 34 29 0a 20 20 7d 0a 7d 20 7b  (-1,2,4).  }.} {
12a0: 32 20 34 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 33  2 4}.do_test in3
12b0: 2d 32 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c  -2.4 {.  execsql
12c0: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 72 6f   {.    SELECT ro
12d0: 77 69 64 20 46 52 4f 4d 20 74 32 20 57 48 45 52  wid FROM t2 WHER
12e0: 45 20 72 6f 77 69 64 20 49 4e 20 0a 20 20 20 20  E rowid IN .    
12f0: 20 20 20 28 73 65 6c 65 63 74 20 72 6f 77 69 64     (select rowid
1300: 20 66 72 6f 6d 20 74 32 20 77 68 65 72 65 20 72   from t2 where r
1310: 6f 77 69 64 20 49 4e 20 28 2d 31 2c 32 2c 34 29  owid IN (-1,2,4)
1320: 29 0a 20 20 7d 0a 7d 20 7b 32 20 34 7d 0a 0a 23  ).  }.} {2 4}..#
1330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 69 73  ---------.# This
1380: 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 74   next block of t
1390: 65 73 74 73 20 2d 20 69 6e 33 2d 33 2e 2a 20 2d  ests - in3-3.* -
13a0: 20 76 65 72 69 66 79 20 74 68 61 74 20 63 6f 6c   verify that col
13b0: 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 69 73 0a  umn affinity is.
13c0: 23 20 63 6f 72 72 65 63 74 6c 79 20 68 61 6e 64  # correctly hand
13d0: 6c 65 64 20 69 6e 20 63 61 73 65 73 20 77 68 65  led in cases whe
13e0: 72 65 20 61 6e 20 69 6e 64 65 78 20 6d 69 67 68  re an index migh
13f0: 74 20 62 65 20 75 73 65 64 20 74 6f 20 6f 70 74  t be used to opt
1400: 69 6d 69 73 65 0a 23 20 61 6e 20 49 4e 20 28 53  imise.# an IN (S
1410: 45 4c 45 43 54 29 20 65 78 70 72 65 73 73 69 6f  ELECT) expressio
1420: 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 69 6e 33  n..#.do_test in3
1430: 2d 33 2e 31 20 7b 0a 20 20 63 61 74 63 68 20 7b  -3.1 {.  catch {
1440: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 52  execsql {.    DR
1450: 4f 50 20 54 41 42 4c 45 20 74 31 3b 0a 20 20 20  OP TABLE t1;.   
1460: 20 44 52 4f 50 20 54 41 42 4c 45 20 74 32 3b 0a   DROP TABLE t2;.
1470: 20 20 7d 7d 0a 0a 20 20 65 78 65 63 73 71 6c 20    }}..  execsql 
1480: 7b 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  {..    CREATE TA
1490: 42 4c 45 20 74 31 28 61 20 42 4c 4f 42 2c 20 62  BLE t1(a BLOB, b
14a0: 20 4e 55 4d 42 45 52 20 2c 63 20 54 45 58 54 29   NUMBER ,c TEXT)
14b0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 55 4e 49  ;.    CREATE UNI
14c0: 51 55 45 20 49 4e 44 45 58 20 74 31 5f 69 31 20  QUE INDEX t1_i1 
14d0: 4f 4e 20 74 31 28 61 29 3b 20 20 20 20 20 20 20  ON t1(a);       
14e0: 20 2f 2a 20 6e 6f 20 61 66 66 69 6e 69 74 79 20   /* no affinity 
14f0: 2a 2f 0a 20 20 20 20 43 52 45 41 54 45 20 55 4e  */.    CREATE UN
1500: 49 51 55 45 20 49 4e 44 45 58 20 74 31 5f 69 32  IQUE INDEX t1_i2
1510: 20 4f 4e 20 74 31 28 62 29 3b 20 20 20 20 20 20   ON t1(b);      
1520: 20 20 2f 2a 20 6e 75 6d 65 72 69 63 20 61 66 66    /* numeric aff
1530: 69 6e 69 74 79 20 2a 2f 0a 20 20 20 20 43 52 45  inity */.    CRE
1540: 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45 58  ATE UNIQUE INDEX
1550: 20 74 31 5f 69 33 20 4f 4e 20 74 31 28 63 29 3b   t1_i3 ON t1(c);
1560: 20 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20          /* text 
1570: 61 66 66 69 6e 69 74 79 20 2a 2f 0a 0a 20 20 20  affinity */..   
1580: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
1590: 28 78 20 42 4c 4f 42 2c 20 79 20 4e 55 4d 42 45  (x BLOB, y NUMBE
15a0: 52 2c 20 7a 20 54 45 58 54 29 3b 0a 20 20 20 20  R, z TEXT);.    
15b0: 43 52 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e  CREATE UNIQUE IN
15c0: 44 45 58 20 74 32 5f 69 31 20 4f 4e 20 74 32 28  DEX t2_i1 ON t2(
15d0: 78 29 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f  x);        /* no
15e0: 20 61 66 66 69 6e 69 74 79 20 2a 2f 0a 20 20 20   affinity */.   
15f0: 20 43 52 45 41 54 45 20 55 4e 49 51 55 45 20 49   CREATE UNIQUE I
1600: 4e 44 45 58 20 74 32 5f 69 32 20 4f 4e 20 74 32  NDEX t2_i2 ON t2
1610: 28 79 29 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e  (y);        /* n
1620: 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 20  umeric affinity 
1630: 2a 2f 0a 20 20 20 20 43 52 45 41 54 45 20 55 4e  */.    CREATE UN
1640: 49 51 55 45 20 49 4e 44 45 58 20 74 32 5f 69 33  IQUE INDEX t2_i3
1650: 20 4f 4e 20 74 32 28 7a 29 3b 20 20 20 20 20 20   ON t2(z);      
1660: 20 20 2f 2a 20 74 65 78 74 20 61 66 66 69 6e 69    /* text affini
1670: 74 79 20 2a 2f 0a 0a 20 20 20 20 49 4e 53 45 52  ty */..    INSER
1680: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
1690: 28 31 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 49  (1, 1, 1);.    I
16a0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
16b0: 4c 55 45 53 28 27 31 27 2c 20 27 31 27 2c 20 27  LUES('1', '1', '
16c0: 31 27 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64  1');.  }.} {}..d
16d0: 6f 5f 74 65 73 74 20 69 6e 33 2d 33 2e 32 20 7b  o_test in3-3.2 {
16e0: 0a 20 20 23 20 4e 6f 20 61 66 66 69 6e 69 74 79  .  # No affinity
16f0: 20 69 73 20 61 70 70 6c 69 65 64 20 62 65 66 6f   is applied befo
1700: 72 65 20 63 6f 6d 70 61 72 69 6e 67 20 22 78 22  re comparing "x"
1710: 20 61 6e 64 20 22 61 22 2e 20 54 68 65 72 65 66   and "a". Theref
1720: 6f 72 65 0a 20 20 23 20 74 68 65 20 69 6e 64 65  ore.  # the inde
1730: 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 28 74  x can be used (t
1740: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  he comparison is
1750: 20 66 61 6c 73 65 2c 20 74 65 78 74 21 3d 6e 75   false, text!=nu
1760: 6d 62 65 72 29 2e 0a 20 20 65 78 65 63 5f 6e 65  mber)..  exec_ne
1770: 70 68 20 7b 20 53 45 4c 45 43 54 20 78 20 49 4e  ph { SELECT x IN
1780: 20 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20   (SELECT a FROM 
1790: 74 31 29 20 46 52 4f 4d 20 74 32 20 7d 0a 7d 20  t1) FROM t2 }.} 
17a0: 7b 30 20 30 7d 0a 64 6f 5f 74 65 73 74 20 69 6e  {0 0}.do_test in
17b0: 33 2d 33 2e 33 20 7b 0a 20 20 23 20 4c 6f 67 69  3-3.3 {.  # Logi
17c0: 63 61 6c 6c 79 2c 20 6e 75 6d 65 72 69 63 20 61  cally, numeric a
17d0: 66 66 69 6e 69 74 79 20 69 73 20 61 70 70 6c 69  ffinity is appli
17e0: 65 64 20 74 6f 20 62 6f 74 68 20 73 69 64 65 73  ed to both sides
17f0: 20 62 65 66 6f 72 65 20 0a 20 20 23 20 74 68 65   before .  # the
1800: 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68   comparison.  Th
1810: 65 72 65 66 6f 72 65 20 69 74 20 69 73 20 70 6f  erefore it is po
1820: 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 69 6e  ssible to use in
1830: 64 65 78 20 74 31 5f 69 32 2e 0a 20 20 65 78 65  dex t1_i2..  exe
1840: 63 5f 6e 65 70 68 20 7b 20 53 45 4c 45 43 54 20  c_neph { SELECT 
1850: 78 20 49 4e 20 28 53 45 4c 45 43 54 20 62 20 46  x IN (SELECT b F
1860: 52 4f 4d 20 74 31 29 20 46 52 4f 4d 20 74 32 20  ROM t1) FROM t2 
1870: 7d 0a 7d 20 7b 30 20 31 7d 0a 64 6f 5f 74 65 73  }.} {0 1}.do_tes
1880: 74 20 69 6e 33 2d 33 2e 34 20 7b 0a 20 20 23 20  t in3-3.4 {.  # 
1890: 4e 6f 20 61 66 66 69 6e 69 74 79 20 69 73 20 61  No affinity is a
18a0: 70 70 6c 69 65 64 20 62 65 66 6f 72 65 20 74 68  pplied before th
18b0: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 74 61 6b  e comparison tak
18c0: 65 73 20 70 6c 61 63 65 2e 20 4d 61 6b 69 6e 67  es place. Making
18d0: 0a 20 20 23 20 69 74 20 70 6f 73 73 69 62 6c 65  .  # it possible
18e0: 20 74 6f 20 75 73 65 20 69 6e 64 65 78 20 74 31   to use index t1
18f0: 5f 69 33 2e 0a 20 20 65 78 65 63 5f 6e 65 70 68  _i3..  exec_neph
1900: 20 7b 20 53 45 4c 45 43 54 20 78 20 49 4e 20 28   { SELECT x IN (
1910: 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 31  SELECT c FROM t1
1920: 29 20 46 52 4f 4d 20 74 32 20 7d 0a 7d 20 7b 30  ) FROM t2 }.} {0
1930: 20 31 7d 0a 0a 64 6f 5f 74 65 73 74 20 69 6e 33   1}..do_test in3
1940: 2d 33 2e 35 20 7b 0a 20 20 23 20 4e 75 6d 65 72  -3.5 {.  # Numer
1950: 69 63 20 61 66 66 69 6e 69 74 79 20 73 68 6f 75  ic affinity shou
1960: 6c 64 20 62 65 20 61 70 70 6c 69 65 64 20 74 6f  ld be applied to
1970: 20 65 61 63 68 20 73 69 64 65 20 62 65 66 6f 72   each side befor
1980: 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  e the comparison
1990: 0a 20 20 23 20 74 61 6b 65 73 20 70 6c 61 63 65  .  # takes place
19a0: 2e 20 54 68 65 72 65 66 6f 72 65 20 77 65 20 63  . Therefore we c
19b0: 61 6e 6e 6f 74 20 75 73 65 20 69 6e 64 65 78 20  annot use index 
19c0: 74 31 5f 69 31 2c 20 77 68 69 63 68 20 68 61 73  t1_i1, which has
19d0: 20 6e 6f 20 61 66 66 69 6e 69 74 79 2e 0a 20 20   no affinity..  
19e0: 65 78 65 63 5f 6e 65 70 68 20 7b 20 53 45 4c 45  exec_neph { SELE
19f0: 43 54 20 79 20 49 4e 20 28 53 45 4c 45 43 54 20  CT y IN (SELECT 
1a00: 61 20 46 52 4f 4d 20 74 31 29 20 46 52 4f 4d 20  a FROM t1) FROM 
1a10: 74 32 20 7d 0a 7d 20 7b 31 20 31 7d 0a 64 6f 5f  t2 }.} {1 1}.do_
1a20: 74 65 73 74 20 69 6e 33 2d 33 2e 36 20 7b 0a 20  test in3-3.6 {. 
1a30: 20 23 20 4e 75 6d 65 72 69 63 20 61 66 66 69 6e   # Numeric affin
1a40: 69 74 79 20 69 73 20 61 70 70 6c 69 65 64 20 74  ity is applied t
1a50: 6f 20 62 6f 74 68 20 73 69 64 65 73 20 62 65 66  o both sides bef
1a60: 6f 72 65 20 0a 20 20 23 20 74 68 65 20 63 6f 6d  ore .  # the com
1a70: 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 72 65 66  parison.  Theref
1a80: 6f 72 65 20 69 74 20 69 73 20 70 6f 73 73 69 62  ore it is possib
1a90: 6c 65 20 74 6f 20 75 73 65 20 69 6e 64 65 78 20  le to use index 
1aa0: 74 31 5f 69 32 2e 0a 20 20 65 78 65 63 5f 6e 65  t1_i2..  exec_ne
1ab0: 70 68 20 7b 20 53 45 4c 45 43 54 20 79 20 49 4e  ph { SELECT y IN
1ac0: 20 28 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20   (SELECT b FROM 
1ad0: 74 31 29 20 46 52 4f 4d 20 74 32 20 7d 0a 7d 20  t1) FROM t2 }.} 
1ae0: 7b 30 20 31 7d 0a 64 6f 5f 74 65 73 74 20 69 6e  {0 1}.do_test in
1af0: 33 2d 33 2e 37 20 7b 0a 20 20 23 20 4e 75 6d 65  3-3.7 {.  # Nume
1b00: 72 69 63 20 61 66 66 69 6e 69 74 79 20 69 73 20  ric affinity is 
1b10: 61 70 70 6c 69 65 64 20 62 65 66 6f 72 65 20 74  applied before t
1b20: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 74 61  he comparison ta
1b30: 6b 65 73 20 70 6c 61 63 65 2e 20 0a 20 20 23 20  kes place. .  # 
1b40: 4d 61 6b 69 6e 67 20 69 74 20 69 6d 70 6f 73 73  Making it imposs
1b50: 69 62 6c 65 20 74 6f 20 75 73 65 20 69 6e 64 65  ible to use inde
1b60: 78 20 74 31 5f 69 33 2e 0a 20 20 65 78 65 63 5f  x t1_i3..  exec_
1b70: 6e 65 70 68 20 7b 20 53 45 4c 45 43 54 20 79 20  neph { SELECT y 
1b80: 49 4e 20 28 53 45 4c 45 43 54 20 63 20 46 52 4f  IN (SELECT c FRO
1b90: 4d 20 74 31 29 20 46 52 4f 4d 20 74 32 20 7d 0a  M t1) FROM t2 }.
1ba0: 7d 20 7b 31 20 31 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  } {1 1}..#------
1bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1bf0: 23 0a 23 20 54 65 73 74 20 75 73 69 6e 67 20 61  #.# Test using a
1c00: 20 6d 75 6c 74 69 2d 63 6f 6c 75 6d 6e 20 69 6e   multi-column in
1c10: 64 65 78 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 69  dex..#.do_test i
1c20: 6e 33 2d 34 2e 31 20 7b 0a 20 20 65 78 65 63 73  n3-4.1 {.  execs
1c30: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
1c40: 54 41 42 4c 45 20 74 33 28 61 2c 20 62 2c 20 63  TABLE t3(a, b, c
1c50: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 55 4e  );.    CREATE UN
1c60: 49 51 55 45 20 49 4e 44 45 58 20 74 33 5f 69 20  IQUE INDEX t3_i 
1c70: 4f 4e 20 74 33 28 62 2c 20 61 29 3b 0a 20 20 7d  ON t3(b, a);.  }
1c80: 0a 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  ..  execsql {.  
1c90: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
1ca0: 20 56 41 4c 55 45 53 28 31 2c 20 27 6e 75 6d 65   VALUES(1, 'nume
1cb0: 72 69 63 27 2c 20 32 29 3b 0a 20 20 20 20 49 4e  ric', 2);.    IN
1cc0: 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c  SERT INTO t3 VAL
1cd0: 55 45 53 28 32 2c 20 27 74 65 78 74 27 2c 20 32  UES(2, 'text', 2
1ce0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
1cf0: 54 4f 20 74 33 20 56 41 4c 55 45 53 28 33 2c 20  TO t3 VALUES(3, 
1d00: 27 72 65 61 6c 27 2c 20 32 29 3b 0a 20 20 20 20  'real', 2);.    
1d10: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56  INSERT INTO t3 V
1d20: 41 4c 55 45 53 28 34 2c 20 27 6e 6f 6e 65 27 2c  ALUES(4, 'none',
1d30: 20 32 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f   2);.  }.} {}.do
1d40: 5f 74 65 73 74 20 69 6e 33 2d 34 2e 32 20 7b 0a  _test in3-4.2 {.
1d50: 20 20 65 78 65 63 5f 6e 65 70 68 20 7b 20 53 45    exec_neph { SE
1d60: 4c 45 43 54 20 27 74 65 78 74 27 20 49 4e 20 28  LECT 'text' IN (
1d70: 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 33  SELECT b FROM t3
1d80: 29 20 7d 0a 7d 20 7b 30 20 31 7d 0a 64 6f 5f 74  ) }.} {0 1}.do_t
1d90: 65 73 74 20 69 6e 33 2d 34 2e 33 20 7b 0a 20 20  est in3-4.3 {.  
1da0: 65 78 65 63 5f 6e 65 70 68 20 7b 20 53 45 4c 45  exec_neph { SELE
1db0: 43 54 20 27 54 45 58 54 27 20 43 4f 4c 4c 41 54  CT 'TEXT' COLLAT
1dc0: 45 20 6e 6f 63 61 73 65 20 49 4e 20 28 53 45 4c  E nocase IN (SEL
1dd0: 45 43 54 20 62 20 46 52 4f 4d 20 74 33 29 20 7d  ECT b FROM t3) }
1de0: 0a 7d 20 7b 31 20 31 7d 0a 64 6f 5f 74 65 73 74  .} {1 1}.do_test
1df0: 20 69 6e 33 2d 34 2e 34 20 7b 0a 20 20 23 20 41   in3-4.4 {.  # A
1e00: 20 74 65 6d 70 20 74 61 62 6c 65 20 6d 75 73 74   temp table must
1e10: 20 62 65 20 75 73 65 64 20 62 65 63 61 75 73 65   be used because
1e20: 20 74 33 5f 69 2e 62 20 69 73 20 6e 6f 74 20 67   t3_i.b is not g
1e30: 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
1e40: 75 6e 69 71 75 65 2e 0a 20 20 65 78 65 63 5f 6e  unique..  exec_n
1e50: 65 70 68 20 7b 20 53 45 4c 45 43 54 20 62 20 46  eph { SELECT b F
1e60: 52 4f 4d 20 74 33 20 57 48 45 52 45 20 62 20 49  ROM t3 WHERE b I
1e70: 4e 20 28 53 45 4c 45 43 54 20 62 20 46 52 4f 4d  N (SELECT b FROM
1e80: 20 74 33 29 20 7d 0a 7d 20 7b 31 20 6e 6f 6e 65   t3) }.} {1 none
1e90: 20 6e 75 6d 65 72 69 63 20 72 65 61 6c 20 74 65   numeric real te
1ea0: 78 74 7d 0a 64 6f 5f 74 65 73 74 20 69 6e 33 2d  xt}.do_test in3-
1eb0: 34 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  4.5 {.  execsql 
1ec0: 7b 20 43 52 45 41 54 45 20 55 4e 49 51 55 45 20  { CREATE UNIQUE 
1ed0: 49 4e 44 45 58 20 74 33 5f 69 32 20 4f 4e 20 74  INDEX t3_i2 ON t
1ee0: 33 28 62 29 20 43 4f 56 45 52 49 4e 47 20 28 62  3(b) COVERING (b
1ef0: 29 20 7d 0a 20 20 65 78 65 63 5f 6e 65 70 68 20  ) }.  exec_neph 
1f00: 7b 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20  { SELECT b FROM 
1f10: 74 33 20 57 48 45 52 45 20 62 20 49 4e 20 28 53  t3 WHERE b IN (S
1f20: 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 33 29  ELECT b FROM t3)
1f30: 20 4f 52 44 45 52 20 42 59 20 62 7d 0a 7d 20 7b   ORDER BY b}.} {
1f40: 30 20 6e 6f 6e 65 20 6e 75 6d 65 72 69 63 20 72  0 none numeric r
1f50: 65 61 6c 20 74 65 78 74 7d 0a 64 6f 5f 74 65 73  eal text}.do_tes
1f60: 74 20 69 6e 33 2d 34 2e 36 20 7b 0a 20 20 65 78  t in3-4.6 {.  ex
1f70: 65 63 73 71 6c 20 7b 20 44 52 4f 50 20 49 4e 44  ecsql { DROP IND
1f80: 45 58 20 74 33 5f 69 32 20 7d 0a 7d 20 7b 7d 0a  EX t3_i2 }.} {}.
1f90: 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .# The following
1fa0: 20 74 77 6f 20 74 65 73 74 20 63 61 73 65 73 20   two test cases 
1fb0: 76 65 72 69 66 79 20 74 68 61 74 20 74 69 63 6b  verify that tick
1fc0: 65 74 20 23 32 39 39 31 20 68 61 73 20 62 65 65  et #2991 has bee
1fd0: 6e 20 66 69 78 65 64 2e 0a 23 0a 64 6f 5f 74 65  n fixed..#.do_te
1fe0: 73 74 20 69 6e 33 2d 35 2e 31 20 7b 0a 20 20 65  st in3-5.1 {.  e
1ff0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
2000: 41 54 45 20 54 41 42 4c 45 20 46 6f 6c 64 65 72  ATE TABLE Folder
2010: 73 28 0a 20 20 20 20 20 20 66 6f 6c 64 65 72 69  s(.      folderi
2020: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  d INTEGER PRIMAR
2030: 59 20 4b 45 59 2c 20 0a 20 20 20 20 20 20 70 61  Y KEY, .      pa
2040: 72 65 6e 74 69 64 20 49 4e 54 45 47 45 52 2c 20  rentid INTEGER, 
2050: 0a 20 20 20 20 20 20 72 6f 6f 74 69 64 20 49 4e  .      rootid IN
2060: 54 45 47 45 52 2c 20 0a 20 20 20 20 20 20 70 61  TEGER, .      pa
2070: 74 68 20 56 41 52 43 48 41 52 28 32 35 35 29 0a  th VARCHAR(255).
2080: 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a      );.  }.} {}.
2090: 64 6f 5f 74 65 73 74 20 69 6e 33 2d 35 2e 32 20  do_test in3-5.2 
20a0: 7b 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 0a 20  {.  catchsql {. 
20b0: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 46     DELETE FROM F
20c0: 6f 6c 64 65 72 73 20 57 48 45 52 45 20 66 6f 6c  olders WHERE fol
20d0: 64 65 72 69 64 20 49 4e 0a 20 20 20 20 28 53 45  derid IN.    (SE
20e0: 4c 45 43 54 20 66 6f 6c 64 65 72 69 64 20 46 52  LECT folderid FR
20f0: 4f 4d 20 46 6f 6c 64 65 72 20 57 48 45 52 45 20  OM Folder WHERE 
2100: 70 61 74 68 20 4c 49 4b 45 20 27 43 3a 5c 4d 50  path LIKE 'C:\MP
2110: 33 5c 41 6c 62 75 6d 73 5c 27 20 7c 7c 20 27 25  3\Albums\' || '%
2120: 27 29 3b 0a 20 20 7d 0a 7d 20 7b 31 20 7b 6e 6f  ');.  }.} {1 {no
2130: 20 73 75 63 68 20 74 61 62 6c 65 3a 20 46 6f 6c   such table: Fol
2140: 64 65 72 7d 7d 0a 0a 66 69 6e 69 73 68 5f 74 65  der}}..finish_te
2150: 73 74 0a                                         st.