/ Hex Artifact Content
Login

Artifact 61d5b20d9bedc8788a773bbdc5b2ef887725928e:


0000: 23 20 32 30 30 35 20 4a 75 6c 79 20 32 38 0a 23  # 2005 July 28.#
0010: 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69  .# The author di
0020: 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68  sclaims copyrigh
0030: 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65  t to this source
0040: 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65   code.  In place
0050: 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f   of.# a legal no
0060: 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20  tice, here is a 
0070: 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20  blessing:.#.#   
0080: 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64   May you do good
0090: 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23   and not evil..#
00a0: 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64      May you find
00b0: 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72   forgiveness for
00c0: 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f   yourself and fo
00d0: 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20  rgive others..# 
00e0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
00f0: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0100: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0110: 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 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 0a 23 20 54 68 69 73 20 66 69 6c 65  ****.# This file
0170: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 72 65 67 72   implements regr
0180: 65 73 73 69 6f 6e 20 74 65 73 74 73 20 66 6f 72  ession tests for
0190: 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e   SQLite library.
01a0: 20 20 54 68 65 0a 23 20 66 6f 63 75 73 20 6f 66    The.# focus of
01b0: 20 74 68 69 73 20 66 69 6c 65 20 69 73 20 74 65   this file is te
01c0: 73 74 69 6e 67 20 74 68 65 20 75 73 65 20 6f 66  sting the use of
01d0: 20 69 6e 64 69 63 65 73 20 69 6e 20 57 48 45 52   indices in WHER
01e0: 45 20 63 6c 61 75 73 65 73 0a 23 20 62 61 73 65  E clauses.# base
01f0: 64 20 6f 6e 20 72 65 63 65 6e 74 20 63 68 61 6e  d on recent chan
0200: 67 65 73 20 74 6f 20 74 68 65 20 6f 70 74 69 6d  ges to the optim
0210: 69 7a 65 72 2e 0a 23 0a 23 20 24 49 64 3a 20 77  izer..#.# $Id: w
0220: 68 65 72 65 32 2e 74 65 73 74 2c 76 20 31 2e 31  here2.test,v 1.1
0230: 30 20 32 30 30 36 2f 31 31 2f 30 36 20 31 35 3a  0 2006/11/06 15:
0240: 31 30 3a 30 36 20 64 72 68 20 45 78 70 20 24 0a  10:06 drh Exp $.
0250: 0a 73 65 74 20 74 65 73 74 64 69 72 20 5b 66 69  .set testdir [fi
0260: 6c 65 20 64 69 72 6e 61 6d 65 20 24 61 72 67 76  le dirname $argv
0270: 30 5d 0a 73 6f 75 72 63 65 20 24 74 65 73 74 64  0].source $testd
0280: 69 72 2f 74 65 73 74 65 72 2e 74 63 6c 0a 0a 23  ir/tester.tcl..#
0290: 20 42 75 69 6c 64 20 73 6f 6d 65 20 74 65 73 74   Build some test
02a0: 20 64 61 74 61 0a 23 0a 64 6f 5f 74 65 73 74 20   data.#.do_test 
02b0: 77 68 65 72 65 32 2d 31 2e 30 20 7b 0a 20 20 65  where2-1.0 {.  e
02c0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47  xecsql {.    BEG
02d0: 49 4e 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  IN;.    CREATE T
02e0: 41 42 4c 45 20 74 31 28 77 20 69 6e 74 2c 20 78  ABLE t1(w int, x
02f0: 20 69 6e 74 2c 20 79 20 69 6e 74 2c 20 7a 20 69   int, y int, z i
0300: 6e 74 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 20 7b  nt);.  }.  for {
0310: 73 65 74 20 69 20 31 7d 20 7b 24 69 3c 3d 31 30  set i 1} {$i<=10
0320: 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20  0} {incr i} {.  
0330: 20 20 73 65 74 20 77 20 24 69 0a 20 20 20 20 73    set w $i.    s
0340: 65 74 20 78 20 5b 65 78 70 72 20 7b 69 6e 74 28  et x [expr {int(
0350: 6c 6f 67 28 24 69 29 2f 6c 6f 67 28 32 29 29 7d  log($i)/log(2))}
0360: 5d 0a 20 20 20 20 73 65 74 20 79 20 5b 65 78 70  ].    set y [exp
0370: 72 20 7b 24 69 2a 24 69 20 2b 20 32 2a 24 69 20  r {$i*$i + 2*$i 
0380: 2b 20 31 7d 5d 0a 20 20 20 20 73 65 74 20 7a 20  + 1}].    set z 
0390: 5b 65 78 70 72 20 7b 24 78 2b 24 79 7d 5d 0a 20  [expr {$x+$y}]. 
03a0: 20 20 20 69 66 63 61 70 61 62 6c 65 20 74 63 6c     ifcapable tcl
03b0: 76 61 72 20 7b 0a 20 20 20 20 20 20 65 78 65 63  var {.      exec
03c0: 73 71 6c 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f  sql {INSERT INTO
03d0: 20 74 31 20 56 41 4c 55 45 53 28 24 3a 3a 77 2c   t1 VALUES($::w,
03e0: 24 3a 3a 78 2c 24 3a 3a 79 2c 24 3a 3a 7a 29 7d  $::x,$::y,$::z)}
03f0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
0400: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 49 4e 53      execsql {INS
0410: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
0420: 45 53 28 3a 77 2c 3a 78 2c 3a 79 2c 3a 7a 29 7d  ES(:w,:x,:y,:z)}
0430: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 65 78 65  .    }.  }.  exe
0440: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
0450: 45 20 55 4e 49 51 55 45 20 49 4e 44 45 58 20 69  E UNIQUE INDEX i
0460: 31 77 20 4f 4e 20 74 31 28 77 29 3b 0a 20 20 20  1w ON t1(w);.   
0470: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
0480: 78 79 20 4f 4e 20 74 31 28 78 2c 79 29 3b 0a 20  xy ON t1(x,y);. 
0490: 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
04a0: 69 31 7a 79 78 20 4f 4e 20 74 31 28 7a 2c 79 2c  i1zyx ON t1(z,y,
04b0: 78 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  x);.    COMMIT;.
04c0: 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 20 44 6f 20 61    }.} {}..# Do a
04d0: 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  n SQL statement.
04e0: 20 20 41 70 70 65 6e 64 20 74 68 65 20 73 65 61    Append the sea
04f0: 72 63 68 20 63 6f 75 6e 74 20 74 6f 20 74 68 65  rch count to the
0500: 20 65 6e 64 20 6f 66 20 74 68 65 20 72 65 73 75   end of the resu
0510: 6c 74 2e 0a 23 0a 70 72 6f 63 20 63 6f 75 6e 74  lt..#.proc count
0520: 20 73 71 6c 20 7b 0a 20 20 73 65 74 20 3a 3a 73   sql {.  set ::s
0530: 71 6c 69 74 65 5f 73 65 61 72 63 68 5f 63 6f 75  qlite_search_cou
0540: 6e 74 20 30 0a 20 20 72 65 74 75 72 6e 20 5b 63  nt 0.  return [c
0550: 6f 6e 63 61 74 20 5b 65 78 65 63 73 71 6c 20 24  oncat [execsql $
0560: 73 71 6c 5d 20 24 3a 3a 73 71 6c 69 74 65 5f 73  sql] $::sqlite_s
0570: 65 61 72 63 68 5f 63 6f 75 6e 74 5d 0a 7d 0a 0a  earch_count].}..
0580: 23 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  # This procedure
0590: 20 65 78 65 63 75 74 65 73 20 74 68 65 20 53 51   executes the SQ
05a0: 4c 2e 20 20 54 68 65 6e 20 69 74 20 63 68 65 63  L.  Then it chec
05b0: 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ks to see if the
05c0: 20 4f 50 5f 53 6f 72 74 0a 23 20 6f 70 63 6f 64   OP_Sort.# opcod
05d0: 65 20 77 61 73 20 65 78 65 63 75 74 65 64 2e 20  e was executed. 
05e0: 20 49 66 20 61 6e 20 4f 50 5f 53 6f 72 74 20 64   If an OP_Sort d
05f0: 69 64 20 6f 63 63 75 72 2c 20 74 68 65 6e 20 22  id occur, then "
0600: 73 6f 72 74 22 20 69 73 20 61 70 70 65 6e 64 65  sort" is appende
0610: 64 0a 23 20 74 6f 20 74 68 65 20 72 65 73 75 6c  d.# to the resul
0620: 74 2e 20 20 49 66 20 6e 6f 20 4f 50 5f 53 6f 72  t.  If no OP_Sor
0630: 74 20 68 61 70 70 65 6e 65 64 2c 20 74 68 65 6e  t happened, then
0640: 20 22 6e 6f 73 6f 72 74 22 20 69 73 20 61 70 70   "nosort" is app
0650: 65 6e 64 65 64 2e 0a 23 0a 23 20 54 68 69 73 20  ended..#.# This 
0660: 70 72 6f 63 65 64 75 72 65 20 69 73 20 75 73 65  procedure is use
0670: 64 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 6d 61  d to check to ma
0680: 6b 65 20 73 75 72 65 20 73 6f 72 74 69 6e 67 20  ke sure sorting 
0690: 69 73 20 6f 72 20 69 73 20 6e 6f 74 0a 23 20 6f  is or is not.# o
06a0: 63 63 75 72 72 69 6e 67 20 61 73 20 65 78 70 65  ccurring as expe
06b0: 63 74 65 64 2e 0a 23 0a 70 72 6f 63 20 63 6b 73  cted..#.proc cks
06c0: 6f 72 74 20 7b 73 71 6c 7d 20 7b 0a 20 20 73 65  ort {sql} {.  se
06d0: 74 20 3a 3a 73 71 6c 69 74 65 5f 73 6f 72 74 5f  t ::sqlite_sort_
06e0: 63 6f 75 6e 74 20 30 0a 20 20 73 65 74 20 64 61  count 0.  set da
06f0: 74 61 20 5b 65 78 65 63 73 71 6c 20 24 73 71 6c  ta [execsql $sql
0700: 5d 0a 20 20 69 66 20 7b 24 3a 3a 73 71 6c 69 74  ].  if {$::sqlit
0710: 65 5f 73 6f 72 74 5f 63 6f 75 6e 74 7d 20 7b 73  e_sort_count} {s
0720: 65 74 20 78 20 73 6f 72 74 7d 20 7b 73 65 74 20  et x sort} {set 
0730: 78 20 6e 6f 73 6f 72 74 7d 0a 20 20 6c 61 70 70  x nosort}.  lapp
0740: 65 6e 64 20 64 61 74 61 20 24 78 0a 20 20 72 65  end data $x.  re
0750: 74 75 72 6e 20 24 64 61 74 61 0a 7d 0a 0a 23 20  turn $data.}..# 
0760: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 65  This procedure e
0770: 78 65 63 75 74 65 73 20 74 68 65 20 53 51 4c 2e  xecutes the SQL.
0780: 20 20 54 68 65 6e 20 69 74 20 61 70 70 65 6e 64    Then it append
0790: 73 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20  s to the result 
07a0: 74 68 65 0a 23 20 22 73 6f 72 74 22 20 6f 72 20  the.# "sort" or 
07b0: 22 6e 6f 73 6f 72 74 22 20 6b 65 79 77 6f 72 64  "nosort" keyword
07c0: 20 28 61 73 20 69 6e 20 74 68 65 20 63 6b 73 6f   (as in the ckso
07d0: 72 74 20 70 72 6f 63 65 64 75 72 65 20 61 62 6f  rt procedure abo
07e0: 76 65 29 20 74 68 65 6e 0a 23 20 69 74 20 61 70  ve) then.# it ap
07f0: 70 65 6e 64 73 20 74 68 65 20 3a 3a 73 71 6c 69  pends the ::sqli
0800: 74 65 5f 71 75 65 72 79 5f 70 6c 61 6e 20 76 61  te_query_plan va
0810: 72 69 61 62 6c 65 2e 0a 23 0a 70 72 6f 63 20 71  riable..#.proc q
0820: 75 65 72 79 70 6c 61 6e 20 7b 73 71 6c 7d 20 7b  ueryplan {sql} {
0830: 0a 20 20 73 65 74 20 3a 3a 73 71 6c 69 74 65 5f  .  set ::sqlite_
0840: 73 6f 72 74 5f 63 6f 75 6e 74 20 30 0a 20 20 73  sort_count 0.  s
0850: 65 74 20 64 61 74 61 20 5b 65 78 65 63 73 71 6c  et data [execsql
0860: 20 24 73 71 6c 5d 0a 20 20 69 66 20 7b 24 3a 3a   $sql].  if {$::
0870: 73 71 6c 69 74 65 5f 73 6f 72 74 5f 63 6f 75 6e  sqlite_sort_coun
0880: 74 7d 20 7b 73 65 74 20 78 20 73 6f 72 74 7d 20  t} {set x sort} 
0890: 7b 73 65 74 20 78 20 6e 6f 73 6f 72 74 7d 0a 20  {set x nosort}. 
08a0: 20 6c 61 70 70 65 6e 64 20 64 61 74 61 20 24 78   lappend data $x
08b0: 0a 20 20 72 65 74 75 72 6e 20 5b 63 6f 6e 63 61  .  return [conca
08c0: 74 20 24 64 61 74 61 20 24 3a 3a 73 71 6c 69 74  t $data $::sqlit
08d0: 65 5f 71 75 65 72 79 5f 70 6c 61 6e 5d 0a 7d 0a  e_query_plan].}.
08e0: 0a 0a 23 20 50 72 65 66 65 72 20 61 20 55 4e 49  ..# Prefer a UNI
08f0: 51 55 45 20 69 6e 64 65 78 20 6f 76 65 72 20 61  QUE index over a
0900: 6e 6f 74 68 65 72 20 69 6e 64 65 78 2e 0a 23 0a  nother index..#.
0910: 64 6f 5f 74 65 73 74 20 77 68 65 72 65 32 2d 31  do_test where2-1
0920: 2e 31 20 7b 0a 20 20 71 75 65 72 79 70 6c 61 6e  .1 {.  queryplan
0930: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   {.    SELECT * 
0940: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 77 3d  FROM t1 WHERE w=
0950: 38 35 20 41 4e 44 20 78 3d 36 20 41 4e 44 20 79  85 AND x=6 AND y
0960: 3d 37 33 39 36 0a 20 20 7d 0a 7d 20 7b 38 35 20  =7396.  }.} {85 
0970: 36 20 37 33 39 36 20 37 34 30 32 20 6e 6f 73 6f  6 7396 7402 noso
0980: 72 74 20 74 31 20 69 31 77 7d 0a 0a 23 20 41 6c  rt t1 i1w}..# Al
0990: 77 61 79 73 20 70 72 65 66 65 72 20 61 20 72 6f  ways prefer a ro
09a0: 77 69 64 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74  wid== constraint
09b0: 20 6f 76 65 72 20 61 6e 79 20 6f 74 68 65 72 20   over any other 
09c0: 69 6e 64 65 78 2e 0a 23 0a 64 6f 5f 74 65 73 74  index..#.do_test
09d0: 20 77 68 65 72 65 32 2d 31 2e 33 20 7b 0a 20 20   where2-1.3 {.  
09e0: 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20  queryplan {.    
09f0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
0a00: 20 57 48 45 52 45 20 77 3d 38 35 20 41 4e 44 20   WHERE w=85 AND 
0a10: 78 3d 36 20 41 4e 44 20 79 3d 37 33 39 36 20 41  x=6 AND y=7396 A
0a20: 4e 44 20 72 6f 77 69 64 3d 38 35 0a 20 20 7d 0a  ND rowid=85.  }.
0a30: 7d 20 7b 38 35 20 36 20 37 33 39 36 20 37 34 30  } {85 6 7396 740
0a40: 32 20 6e 6f 73 6f 72 74 20 74 31 20 2a 7d 0a 0a  2 nosort t1 *}..
0a50: 23 20 57 68 65 6e 20 63 6f 6e 73 74 72 61 69 6e  # When constrain
0a60: 65 64 20 62 79 20 61 20 55 4e 49 51 55 45 20 69  ed by a UNIQUE i
0a70: 6e 64 65 78 2c 20 74 68 65 20 4f 52 44 45 52 20  ndex, the ORDER 
0a80: 42 59 20 63 6c 61 75 73 65 20 69 73 20 61 6c 77  BY clause is alw
0a90: 61 79 73 20 69 67 6e 6f 72 65 64 2e 0a 23 0a 64  ays ignored..#.d
0aa0: 6f 5f 74 65 73 74 20 77 68 65 72 65 32 2d 32 2e  o_test where2-2.
0ab0: 31 20 7b 0a 20 20 71 75 65 72 79 70 6c 61 6e 20  1 {.  queryplan 
0ac0: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  {.    SELECT * F
0ad0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 77 3d 38  ROM t1 WHERE w=8
0ae0: 35 20 4f 52 44 45 52 20 42 59 20 72 61 6e 64 6f  5 ORDER BY rando
0af0: 6d 28 35 29 3b 0a 20 20 7d 0a 7d 20 7b 38 35 20  m(5);.  }.} {85 
0b00: 36 20 37 33 39 36 20 37 34 30 32 20 6e 6f 73 6f  6 7396 7402 noso
0b10: 72 74 20 74 31 20 69 31 77 7d 0a 64 6f 5f 74 65  rt t1 i1w}.do_te
0b20: 73 74 20 77 68 65 72 65 32 2d 32 2e 32 20 7b 0a  st where2-2.2 {.
0b30: 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20    queryplan {.  
0b40: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
0b50: 74 31 20 57 48 45 52 45 20 78 3d 36 20 41 4e 44  t1 WHERE x=6 AND
0b60: 20 79 3d 37 33 39 36 20 4f 52 44 45 52 20 42 59   y=7396 ORDER BY
0b70: 20 72 61 6e 64 6f 6d 28 35 29 3b 0a 20 20 7d 0a   random(5);.  }.
0b80: 7d 20 7b 38 35 20 36 20 37 33 39 36 20 37 34 30  } {85 6 7396 740
0b90: 32 20 73 6f 72 74 20 74 31 20 69 31 78 79 7d 0a  2 sort t1 i1xy}.
0ba0: 64 6f 5f 74 65 73 74 20 77 68 65 72 65 32 2d 32  do_test where2-2
0bb0: 2e 33 20 7b 0a 20 20 71 75 65 72 79 70 6c 61 6e  .3 {.  queryplan
0bc0: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   {.    SELECT * 
0bd0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 72 6f  FROM t1 WHERE ro
0be0: 77 69 64 3d 38 35 20 41 4e 44 20 78 3d 36 20 41  wid=85 AND x=6 A
0bf0: 4e 44 20 79 3d 37 33 39 36 20 4f 52 44 45 52 20  ND y=7396 ORDER 
0c00: 42 59 20 72 61 6e 64 6f 6d 28 35 29 3b 0a 20 20  BY random(5);.  
0c10: 7d 0a 7d 20 7b 38 35 20 36 20 37 33 39 36 20 37  }.} {85 6 7396 7
0c20: 34 30 32 20 6e 6f 73 6f 72 74 20 74 31 20 2a 7d  402 nosort t1 *}
0c30: 0a 0a 0a 23 20 45 66 66 69 63 69 65 6e 74 20 68  ...# Efficient h
0c40: 61 6e 64 6c 69 6e 67 20 6f 66 20 66 6f 72 77 61  andling of forwa
0c50: 72 64 20 61 6e 64 20 72 65 76 65 72 73 65 20 74  rd and reverse t
0c60: 61 62 6c 65 20 73 63 61 6e 73 2e 0a 23 0a 64 6f  able scans..#.do
0c70: 5f 74 65 73 74 20 77 68 65 72 65 32 2d 33 2e 31  _test where2-3.1
0c80: 20 7b 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b   {.  queryplan {
0c90: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
0ca0: 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 72  OM t1 ORDER BY r
0cb0: 6f 77 69 64 20 4c 49 4d 49 54 20 32 0a 20 20 7d  owid LIMIT 2.  }
0cc0: 0a 7d 20 7b 31 20 30 20 34 20 34 20 32 20 31 20  .} {1 0 4 4 2 1 
0cd0: 39 20 31 30 20 6e 6f 73 6f 72 74 20 74 31 20 2a  9 10 nosort t1 *
0ce0: 7d 0a 64 6f 5f 74 65 73 74 20 77 68 65 72 65 32  }.do_test where2
0cf0: 2d 33 2e 32 20 7b 0a 20 20 71 75 65 72 79 70 6c  -3.2 {.  querypl
0d00: 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  an {.    SELECT 
0d10: 2a 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20  * FROM t1 ORDER 
0d20: 42 59 20 72 6f 77 69 64 20 44 45 53 43 20 4c 49  BY rowid DESC LI
0d30: 4d 49 54 20 32 0a 20 20 7d 0a 7d 20 7b 31 30 30  MIT 2.  }.} {100
0d40: 20 36 20 31 30 32 30 31 20 31 30 32 30 37 20 39   6 10201 10207 9
0d50: 39 20 36 20 31 30 30 30 30 20 31 30 30 30 36 20  9 6 10000 10006 
0d60: 6e 6f 73 6f 72 74 20 74 31 20 2a 7d 0a 0a 23 20  nosort t1 *}..# 
0d70: 54 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  The IN operator 
0d80: 63 61 6e 20 62 65 20 75 73 65 64 20 62 79 20 69  can be used by i
0d90: 6e 64 69 63 65 73 20 61 74 20 6d 75 6c 74 69 70  ndices at multip
0da0: 6c 65 20 6c 61 79 65 72 73 0a 23 0a 69 66 63 61  le layers.#.ifca
0db0: 70 61 62 6c 65 20 73 75 62 71 75 65 72 79 20 7b  pable subquery {
0dc0: 0a 20 20 64 6f 5f 74 65 73 74 20 77 68 65 72 65  .  do_test where
0dd0: 32 2d 34 2e 31 20 7b 0a 20 20 20 20 71 75 65 72  2-4.1 {.    quer
0de0: 79 70 6c 61 6e 20 7b 0a 20 20 20 20 20 20 53 45  yplan {.      SE
0df0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
0e00: 48 45 52 45 20 7a 20 49 4e 20 28 31 30 32 30 37  HERE z IN (10207
0e10: 2c 31 30 30 30 36 29 20 41 4e 44 20 79 20 49 4e  ,10006) AND y IN
0e20: 20 28 31 30 30 30 30 2c 31 30 32 30 31 29 0a 20   (10000,10201). 
0e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e40: 20 20 20 20 20 20 41 4e 44 20 78 3e 30 20 41 4e        AND x>0 AN
0e50: 44 20 78 3c 31 30 0a 20 20 20 20 20 20 4f 52 44  D x<10.      ORD
0e60: 45 52 20 42 59 20 77 0a 20 20 20 20 7d 0a 20 20  ER BY w.    }.  
0e70: 7d 20 7b 39 39 20 36 20 31 30 30 30 30 20 31 30  } {99 6 10000 10
0e80: 30 30 36 20 31 30 30 20 36 20 31 30 32 30 31 20  006 100 6 10201 
0e90: 31 30 32 30 37 20 73 6f 72 74 20 74 31 20 69 31  10207 sort t1 i1
0ea0: 7a 79 78 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77  zyx}.  do_test w
0eb0: 68 65 72 65 32 2d 34 2e 32 20 7b 0a 20 20 20 20  here2-4.2 {.    
0ec0: 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20  queryplan {.    
0ed0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
0ee0: 74 31 20 57 48 45 52 45 20 7a 20 49 4e 20 28 31  t1 WHERE z IN (1
0ef0: 30 32 30 37 2c 31 30 30 30 36 29 20 41 4e 44 20  0207,10006) AND 
0f00: 79 3d 31 30 30 30 30 0a 20 20 20 20 20 20 20 20  y=10000.        
0f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41                 A
0f20: 4e 44 20 78 3e 30 20 41 4e 44 20 78 3c 31 30 0a  ND x>0 AND x<10.
0f30: 20 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 77        ORDER BY w
0f40: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 39 39 20 36  .    }.  } {99 6
0f50: 20 31 30 30 30 30 20 31 30 30 30 36 20 73 6f 72   10000 10006 sor
0f60: 74 20 74 31 20 69 31 7a 79 78 7d 0a 20 20 64 6f  t t1 i1zyx}.  do
0f70: 5f 74 65 73 74 20 77 68 65 72 65 32 2d 34 2e 33  _test where2-4.3
0f80: 20 7b 0a 20 20 20 20 71 75 65 72 79 70 6c 61 6e   {.    queryplan
0f90: 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20   {.      SELECT 
0fa0: 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
0fb0: 7a 3d 31 30 30 30 36 20 41 4e 44 20 79 20 49 4e  z=10006 AND y IN
0fc0: 20 28 31 30 30 30 30 2c 31 30 32 30 31 29 0a 20   (10000,10201). 
0fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fe0: 20 20 20 20 20 20 41 4e 44 20 78 3e 30 20 41 4e        AND x>0 AN
0ff0: 44 20 78 3c 31 30 0a 20 20 20 20 20 20 4f 52 44  D x<10.      ORD
1000: 45 52 20 42 59 20 77 0a 20 20 20 20 7d 0a 20 20  ER BY w.    }.  
1010: 7d 20 7b 39 39 20 36 20 31 30 30 30 30 20 31 30  } {99 6 10000 10
1020: 30 30 36 20 73 6f 72 74 20 74 31 20 69 31 7a 79  006 sort t1 i1zy
1030: 78 7d 0a 20 20 69 66 63 61 70 61 62 6c 65 20 63  x}.  ifcapable c
1040: 6f 6d 70 6f 75 6e 64 20 7b 0a 20 20 20 20 64 6f  ompound {.    do
1050: 5f 74 65 73 74 20 77 68 65 72 65 32 2d 34 2e 34  _test where2-4.4
1060: 20 7b 0a 20 20 20 20 20 20 71 75 65 72 79 70 6c   {.      querypl
1070: 61 6e 20 7b 0a 20 20 20 20 20 20 20 20 53 45 4c  an {.        SEL
1080: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
1090: 45 52 45 20 7a 20 49 4e 20 28 53 45 4c 45 43 54  ERE z IN (SELECT
10a0: 20 31 30 32 30 37 20 55 4e 49 4f 4e 20 53 45 4c   10207 UNION SEL
10b0: 45 43 54 20 31 30 30 30 36 29 0a 20 20 20 20 20  ECT 10006).     
10c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d0: 20 20 20 20 41 4e 44 20 79 20 49 4e 20 28 31 30      AND y IN (10
10e0: 30 30 30 2c 31 30 32 30 31 29 0a 20 20 20 20 20  000,10201).     
10f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1100: 20 20 20 20 41 4e 44 20 78 3e 30 20 41 4e 44 20      AND x>0 AND 
1110: 78 3c 31 30 0a 20 20 20 20 20 20 20 20 4f 52 44  x<10.        ORD
1120: 45 52 20 42 59 20 77 0a 20 20 20 20 20 20 7d 0a  ER BY w.      }.
1130: 20 20 20 20 7d 20 7b 39 39 20 36 20 31 30 30 30      } {99 6 1000
1140: 30 20 31 30 30 30 36 20 31 30 30 20 36 20 31 30  0 10006 100 6 10
1150: 32 30 31 20 31 30 32 30 37 20 73 6f 72 74 20 74  201 10207 sort t
1160: 31 20 69 31 7a 79 78 7d 0a 20 20 20 20 64 6f 5f  1 i1zyx}.    do_
1170: 74 65 73 74 20 77 68 65 72 65 32 2d 34 2e 35 20  test where2-4.5 
1180: 7b 0a 20 20 20 20 20 20 71 75 65 72 79 70 6c 61  {.      querypla
1190: 6e 20 7b 0a 20 20 20 20 20 20 20 20 53 45 4c 45  n {.        SELE
11a0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
11b0: 52 45 20 7a 20 49 4e 20 28 53 45 4c 45 43 54 20  RE z IN (SELECT 
11c0: 31 30 32 30 37 20 55 4e 49 4f 4e 20 53 45 4c 45  10207 UNION SELE
11d0: 43 54 20 31 30 30 30 36 29 0a 20 20 20 20 20 20  CT 10006).      
11e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f0: 20 20 20 41 4e 44 20 79 20 49 4e 20 28 53 45 4c     AND y IN (SEL
1200: 45 43 54 20 31 30 30 30 30 20 55 4e 49 4f 4e 20  ECT 10000 UNION 
1210: 53 45 4c 45 43 54 20 31 30 32 30 31 29 0a 20 20  SELECT 10201).  
1220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1230: 20 20 20 20 20 20 20 41 4e 44 20 78 3e 30 20 41         AND x>0 A
1240: 4e 44 20 78 3c 31 30 0a 20 20 20 20 20 20 20 20  ND x<10.        
1250: 4f 52 44 45 52 20 42 59 20 77 0a 20 20 20 20 20  ORDER BY w.     
1260: 20 7d 0a 20 20 20 20 7d 20 7b 39 39 20 36 20 31   }.    } {99 6 1
1270: 30 30 30 30 20 31 30 30 30 36 20 31 30 30 20 36  0000 10006 100 6
1280: 20 31 30 32 30 31 20 31 30 32 30 37 20 73 6f 72   10201 10207 sor
1290: 74 20 74 31 20 69 31 7a 79 78 7d 0a 20 20 7d 0a  t t1 i1zyx}.  }.
12a0: 20 20 64 6f 5f 74 65 73 74 20 77 68 65 72 65 32    do_test where2
12b0: 2d 34 2e 36 20 7b 0a 20 20 20 20 71 75 65 72 79  -4.6 {.    query
12c0: 70 6c 61 6e 20 7b 0a 20 20 20 20 20 20 53 45 4c  plan {.      SEL
12d0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 0a 20 20  ECT * FROM t1.  
12e0: 20 20 20 20 20 57 48 45 52 45 20 78 20 49 4e 20       WHERE x IN 
12f0: 28 31 2c 32 2c 33 2c 34 2c 35 2c 36 2c 37 2c 38  (1,2,3,4,5,6,7,8
1300: 29 0a 20 20 20 20 20 20 20 20 20 41 4e 44 20 79  ).         AND y
1310: 20 49 4e 20 28 31 30 30 30 30 2c 31 30 30 30 31   IN (10000,10001
1320: 2c 31 30 30 30 32 2c 31 30 30 30 33 2c 31 30 30  ,10002,10003,100
1330: 30 34 2c 31 30 30 30 35 29 0a 20 20 20 20 20 20  04,10005).      
1340: 20 4f 52 44 45 52 20 42 59 20 32 0a 20 20 20 20   ORDER BY 2.    
1350: 7d 0a 20 20 7d 20 7b 39 39 20 36 20 31 30 30 30  }.  } {99 6 1000
1360: 30 20 31 30 30 30 36 20 73 6f 72 74 20 74 31 20  0 10006 sort t1 
1370: 69 31 78 79 7d 0a 0a 20 20 23 20 44 75 70 6c 69  i1xy}..  # Dupli
1380: 63 61 74 65 20 65 6e 74 69 72 65 73 20 6f 6e 20  cate entires on 
1390: 74 68 65 20 52 48 53 20 6f 66 20 61 6e 20 49 4e  the RHS of an IN
13a0: 20 6f 70 65 72 61 74 6f 72 20 64 6f 20 6e 6f 74   operator do not
13b0: 20 63 61 75 73 65 20 64 75 70 6c 69 63 61 74 65   cause duplicate
13c0: 0a 20 20 23 20 6f 75 74 70 75 74 20 72 6f 77 73  .  # output rows
13d0: 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20  ..  #.  do_test 
13e0: 77 68 65 72 65 32 2d 34 2e 36 20 7b 0a 20 20 20  where2-4.6 {.   
13f0: 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20   queryplan {.   
1400: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
1410: 20 74 31 20 57 48 45 52 45 20 7a 20 49 4e 20 28   t1 WHERE z IN (
1420: 31 30 32 30 37 2c 31 30 30 30 36 2c 31 30 30 30  10207,10006,1000
1430: 36 2c 31 30 32 30 37 29 0a 20 20 20 20 20 20 4f  6,10207).      O
1440: 52 44 45 52 20 42 59 20 77 0a 20 20 20 20 7d 0a  RDER BY w.    }.
1450: 20 20 7d 20 7b 39 39 20 36 20 31 30 30 30 30 20    } {99 6 10000 
1460: 31 30 30 30 36 20 31 30 30 20 36 20 31 30 32 30  10006 100 6 1020
1470: 31 20 31 30 32 30 37 20 73 6f 72 74 20 74 31 20  1 10207 sort t1 
1480: 69 31 7a 79 78 7d 0a 20 20 69 66 63 61 70 61 62  i1zyx}.  ifcapab
1490: 6c 65 20 63 6f 6d 70 6f 75 6e 64 20 7b 0a 20 20  le compound {.  
14a0: 20 20 64 6f 5f 74 65 73 74 20 77 68 65 72 65 32    do_test where2
14b0: 2d 34 2e 37 20 7b 0a 20 20 20 20 20 20 71 75 65  -4.7 {.      que
14c0: 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 20 20 20  ryplan {.       
14d0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
14e0: 31 20 57 48 45 52 45 20 7a 20 49 4e 20 28 0a 20  1 WHERE z IN (. 
14f0: 20 20 20 20 20 20 20 20 20 20 53 45 4c 45 43 54            SELECT
1500: 20 31 30 32 30 37 20 55 4e 49 4f 4e 20 41 4c 4c   10207 UNION ALL
1510: 20 53 45 4c 45 43 54 20 31 30 30 30 36 0a 20 20   SELECT 10006.  
1520: 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41           UNION A
1530: 4c 4c 20 53 45 4c 45 43 54 20 31 30 30 30 36 20  LL SELECT 10006 
1540: 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54  UNION ALL SELECT
1550: 20 31 30 32 30 37 29 0a 20 20 20 20 20 20 20 20   10207).        
1560: 4f 52 44 45 52 20 42 59 20 77 0a 20 20 20 20 20  ORDER BY w.     
1570: 20 7d 0a 20 20 20 20 7d 20 7b 39 39 20 36 20 31   }.    } {99 6 1
1580: 30 30 30 30 20 31 30 30 30 36 20 31 30 30 20 36  0000 10006 100 6
1590: 20 31 30 32 30 31 20 31 30 32 30 37 20 73 6f 72   10201 10207 sor
15a0: 74 20 74 31 20 69 31 7a 79 78 7d 0a 20 20 7d 0a  t t1 i1zyx}.  }.
15b0: 0a 7d 20 3b 23 20 69 66 63 61 70 61 62 6c 65 20  .} ;# ifcapable 
15c0: 73 75 62 71 75 65 72 79 0a 0a 23 20 54 68 65 20  subquery..# The 
15d0: 75 73 65 20 6f 66 20 61 6e 20 49 4e 20 6f 70 65  use of an IN ope
15e0: 72 61 74 6f 72 20 64 69 73 61 62 6c 65 73 20 74  rator disables t
15f0: 68 65 20 69 6e 64 65 78 20 61 73 20 61 20 73 6f  he index as a so
1600: 72 74 65 72 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  rter..#.do_test 
1610: 77 68 65 72 65 32 2d 35 2e 31 20 7b 0a 20 20 71  where2-5.1 {.  q
1620: 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53  ueryplan {.    S
1630: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
1640: 57 48 45 52 45 20 77 3d 39 39 20 4f 52 44 45 52  WHERE w=99 ORDER
1650: 20 42 59 20 77 0a 20 20 7d 0a 7d 20 7b 39 39 20   BY w.  }.} {99 
1660: 36 20 31 30 30 30 30 20 31 30 30 30 36 20 6e 6f  6 10000 10006 no
1670: 73 6f 72 74 20 74 31 20 69 31 77 7d 0a 0a 69 66  sort t1 i1w}..if
1680: 63 61 70 61 62 6c 65 20 73 75 62 71 75 65 72 79  capable subquery
1690: 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 77 68 65   {.  do_test whe
16a0: 72 65 32 2d 35 2e 32 20 7b 0a 20 20 20 20 71 75  re2-5.2 {.    qu
16b0: 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 20 20  eryplan {.      
16c0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
16d0: 20 57 48 45 52 45 20 77 20 49 4e 20 28 39 39 29   WHERE w IN (99)
16e0: 20 4f 52 44 45 52 20 42 59 20 77 0a 20 20 20 20   ORDER BY w.    
16f0: 7d 0a 20 20 7d 20 7b 39 39 20 36 20 31 30 30 30  }.  } {99 6 1000
1700: 30 20 31 30 30 30 36 20 73 6f 72 74 20 74 31 20  0 10006 sort t1 
1710: 69 31 77 7d 0a 7d 0a 0a 23 20 56 65 72 69 66 79  i1w}.}..# Verify
1720: 20 74 68 61 74 20 4f 52 20 63 6c 61 75 73 65 73   that OR clauses
1730: 20 67 65 74 20 74 72 61 6e 73 6c 61 74 65 64 20   get translated 
1740: 69 6e 74 6f 20 49 4e 20 6f 70 65 72 61 74 6f 72  into IN operator
1750: 73 2e 0a 23 0a 73 65 74 20 3a 3a 69 64 78 20 7b  s..#.set ::idx {
1760: 7d 0a 69 66 63 61 70 61 62 6c 65 20 73 75 62 71  }.ifcapable subq
1770: 75 65 72 79 20 7b 73 65 74 20 3a 3a 69 64 78 20  uery {set ::idx 
1780: 69 31 77 7d 0a 64 6f 5f 74 65 73 74 20 77 68 65  i1w}.do_test whe
1790: 72 65 32 2d 36 2e 31 20 7b 0a 20 20 71 75 65 72  re2-6.1 {.  quer
17a0: 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45  yplan {.    SELE
17b0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
17c0: 52 45 20 77 3d 39 39 20 4f 52 20 77 3d 31 30 30  RE w=99 OR w=100
17d0: 20 4f 52 44 45 52 20 42 59 20 2b 77 0a 20 20 7d   ORDER BY +w.  }
17e0: 0a 7d 20 5b 6c 69 73 74 20 39 39 20 36 20 31 30  .} [list 99 6 10
17f0: 30 30 30 20 31 30 30 30 36 20 31 30 30 20 36 20  000 10006 100 6 
1800: 31 30 32 30 31 20 31 30 32 30 37 20 73 6f 72 74  10201 10207 sort
1810: 20 74 31 20 24 3a 3a 69 64 78 5d 0a 64 6f 5f 74   t1 $::idx].do_t
1820: 65 73 74 20 77 68 65 72 65 32 2d 36 2e 32 20 7b  est where2-6.2 {
1830: 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20  .  queryplan {. 
1840: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
1850: 20 74 31 20 57 48 45 52 45 20 77 3d 39 39 20 4f   t1 WHERE w=99 O
1860: 52 20 77 3d 31 30 30 20 4f 52 20 36 3d 77 20 4f  R w=100 OR 6=w O
1870: 52 44 45 52 20 42 59 20 2b 77 0a 20 20 7d 0a 7d  RDER BY +w.  }.}
1880: 20 5b 6c 69 73 74 20 36 20 32 20 34 39 20 35 31   [list 6 2 49 51
1890: 20 39 39 20 36 20 31 30 30 30 30 20 31 30 30 30   99 6 10000 1000
18a0: 36 20 31 30 30 20 36 20 31 30 32 30 31 20 31 30  6 100 6 10201 10
18b0: 32 30 37 20 73 6f 72 74 20 74 31 20 24 3a 3a 69  207 sort t1 $::i
18c0: 64 78 5d 0a 0a 64 6f 5f 74 65 73 74 20 77 68 65  dx]..do_test whe
18d0: 72 65 32 2d 36 2e 33 20 7b 0a 20 20 71 75 65 72  re2-6.3 {.  quer
18e0: 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45  yplan {.    SELE
18f0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
1900: 52 45 20 77 3d 39 39 20 4f 52 20 77 3d 31 30 30  RE w=99 OR w=100
1910: 20 4f 52 20 36 3d 2b 77 20 4f 52 44 45 52 20 42   OR 6=+w ORDER B
1920: 59 20 2b 77 0a 20 20 7d 0a 7d 20 7b 36 20 32 20  Y +w.  }.} {6 2 
1930: 34 39 20 35 31 20 39 39 20 36 20 31 30 30 30 30  49 51 99 6 10000
1940: 20 31 30 30 30 36 20 31 30 30 20 36 20 31 30 32   10006 100 6 102
1950: 30 31 20 31 30 32 30 37 20 73 6f 72 74 20 74 31  01 10207 sort t1
1960: 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 77 68 65   {}}.do_test whe
1970: 72 65 32 2d 36 2e 34 20 7b 0a 20 20 71 75 65 72  re2-6.4 {.  quer
1980: 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45  yplan {.    SELE
1990: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
19a0: 52 45 20 77 3d 39 39 20 4f 52 20 2b 77 3d 31 30  RE w=99 OR +w=10
19b0: 30 20 4f 52 20 36 3d 77 20 4f 52 44 45 52 20 42  0 OR 6=w ORDER B
19c0: 59 20 2b 77 0a 20 20 7d 0a 7d 20 7b 36 20 32 20  Y +w.  }.} {6 2 
19d0: 34 39 20 35 31 20 39 39 20 36 20 31 30 30 30 30  49 51 99 6 10000
19e0: 20 31 30 30 30 36 20 31 30 30 20 36 20 31 30 32   10006 100 6 102
19f0: 30 31 20 31 30 32 30 37 20 73 6f 72 74 20 74 31  01 10207 sort t1
1a00: 20 7b 7d 7d 0a 0a 73 65 74 20 3a 3a 69 64 78 20   {}}..set ::idx 
1a10: 7b 7d 0a 69 66 63 61 70 61 62 6c 65 20 73 75 62  {}.ifcapable sub
1a20: 71 75 65 72 79 20 7b 73 65 74 20 3a 3a 69 64 78  query {set ::idx
1a30: 20 69 31 7a 79 78 7d 0a 64 6f 5f 74 65 73 74 20   i1zyx}.do_test 
1a40: 77 68 65 72 65 32 2d 36 2e 35 20 7b 0a 20 20 71  where2-6.5 {.  q
1a50: 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53  ueryplan {.    S
1a60: 45 4c 45 43 54 20 62 2e 2a 20 46 52 4f 4d 20 74  ELECT b.* FROM t
1a70: 31 20 61 2c 20 74 31 20 62 0a 20 20 20 20 20 57  1 a, t1 b.     W
1a80: 48 45 52 45 20 61 2e 77 3d 31 20 41 4e 44 20 28  HERE a.w=1 AND (
1a90: 61 2e 79 3d 62 2e 7a 20 4f 52 20 62 2e 7a 3d 31  a.y=b.z OR b.z=1
1aa0: 30 29 0a 20 20 20 20 20 4f 52 44 45 52 20 42 59  0).     ORDER BY
1ab0: 20 2b 62 2e 77 0a 20 20 7d 0a 7d 20 5b 6c 69 73   +b.w.  }.} [lis
1ac0: 74 20 31 20 30 20 34 20 34 20 32 20 31 20 39 20  t 1 0 4 4 2 1 9 
1ad0: 31 30 20 73 6f 72 74 20 61 20 69 31 77 20 62 20  10 sort a i1w b 
1ae0: 24 3a 3a 69 64 78 5d 0a 64 6f 5f 74 65 73 74 20  $::idx].do_test 
1af0: 77 68 65 72 65 32 2d 36 2e 36 20 7b 0a 20 20 71  where2-6.6 {.  q
1b00: 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53  ueryplan {.    S
1b10: 45 4c 45 43 54 20 62 2e 2a 20 46 52 4f 4d 20 74  ELECT b.* FROM t
1b20: 31 20 61 2c 20 74 31 20 62 0a 20 20 20 20 20 57  1 a, t1 b.     W
1b30: 48 45 52 45 20 61 2e 77 3d 31 20 41 4e 44 20 28  HERE a.w=1 AND (
1b40: 62 2e 7a 3d 31 30 20 4f 52 20 61 2e 79 3d 62 2e  b.z=10 OR a.y=b.
1b50: 7a 20 4f 52 20 62 2e 7a 3d 31 30 29 0a 20 20 20  z OR b.z=10).   
1b60: 20 20 4f 52 44 45 52 20 42 59 20 2b 62 2e 77 0a    ORDER BY +b.w.
1b70: 20 20 7d 0a 7d 20 5b 6c 69 73 74 20 31 20 30 20    }.} [list 1 0 
1b80: 34 20 34 20 32 20 31 20 39 20 31 30 20 73 6f 72  4 4 2 1 9 10 sor
1b90: 74 20 61 20 69 31 77 20 62 20 24 3a 3a 69 64 78  t a i1w b $::idx
1ba0: 5d 0a 0a 23 20 55 6e 69 71 75 65 20 71 75 65 72  ]..# Unique quer
1bb0: 69 65 73 20 28 71 75 65 72 69 65 73 20 74 68 61  ies (queries tha
1bc0: 74 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64  t are guaranteed
1bd0: 20 74 6f 20 72 65 74 75 72 6e 20 6f 6e 6c 79 20   to return only 
1be0: 61 20 73 69 6e 67 6c 65 0a 23 20 72 6f 77 20 6f  a single.# row o
1bf0: 66 20 72 65 73 75 6c 74 29 20 64 6f 20 6e 6f 74  f result) do not
1c00: 20 63 61 6c 6c 20 74 68 65 20 73 6f 72 74 65 72   call the sorter
1c10: 2e 20 20 42 75 74 20 61 6c 6c 20 74 61 62 6c 65  .  But all table
1c20: 73 20 6d 75 73 74 20 67 69 76 65 0a 23 20 61 20  s must give.# a 
1c30: 75 6e 69 71 75 65 20 72 65 73 75 6c 74 2e 20 20  unique result.  
1c40: 49 66 20 61 6e 79 20 6f 6e 65 20 74 61 62 6c 65  If any one table
1c50: 20 69 6e 20 74 68 65 20 6a 6f 69 6e 20 64 6f 65   in the join doe
1c60: 73 20 6e 6f 74 20 67 69 76 65 20 61 20 75 6e 69  s not give a uni
1c70: 71 75 65 0a 23 20 72 65 73 75 6c 74 20 74 68 65  que.# result the
1c80: 6e 20 73 6f 72 74 69 6e 67 20 69 73 20 6e 65 63  n sorting is nec
1c90: 65 73 73 61 72 79 2e 0a 23 0a 64 6f 5f 74 65 73  essary..#.do_tes
1ca0: 74 20 77 68 65 72 65 32 2d 37 2e 31 20 7b 0a 20  t where2-7.1 {. 
1cb0: 20 63 6b 73 6f 72 74 20 7b 0a 20 20 20 20 63 72   cksort {.    cr
1cc0: 65 61 74 65 20 74 61 62 6c 65 20 74 38 28 61 20  eate table t8(a 
1cd0: 75 6e 69 71 75 65 2c 20 62 2c 20 63 29 3b 0a 20  unique, b, c);. 
1ce0: 20 20 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 74     insert into t
1cf0: 38 20 76 61 6c 75 65 73 28 31 2c 32 2c 33 29 3b  8 values(1,2,3);
1d00: 0a 20 20 20 20 69 6e 73 65 72 74 20 69 6e 74 6f  .    insert into
1d10: 20 74 38 20 76 61 6c 75 65 73 28 32 2c 33 2c 34   t8 values(2,3,4
1d20: 29 3b 0a 20 20 20 20 63 72 65 61 74 65 20 74 61  );.    create ta
1d30: 62 6c 65 20 74 39 28 78 2c 79 29 3b 0a 20 20 20  ble t9(x,y);.   
1d40: 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 74 39 20   insert into t9 
1d50: 76 61 6c 75 65 73 28 32 2c 34 29 3b 0a 20 20 20  values(2,4);.   
1d60: 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 74 39 20   insert into t9 
1d70: 76 61 6c 75 65 73 28 32 2c 33 29 3b 0a 20 20 20  values(2,3);.   
1d80: 20 73 65 6c 65 63 74 20 79 20 66 72 6f 6d 20 74   select y from t
1d90: 38 2c 20 74 39 20 77 68 65 72 65 20 61 3d 31 20  8, t9 where a=1 
1da0: 6f 72 64 65 72 20 62 79 20 61 2c 20 79 3b 0a 20  order by a, y;. 
1db0: 20 7d 0a 7d 20 7b 33 20 34 20 73 6f 72 74 7d 0a   }.} {3 4 sort}.
1dc0: 64 6f 5f 74 65 73 74 20 77 68 65 72 65 32 2d 37  do_test where2-7
1dd0: 2e 32 20 7b 0a 20 20 63 6b 73 6f 72 74 20 7b 0a  .2 {.  cksort {.
1de0: 20 20 20 20 73 65 6c 65 63 74 20 2a 20 66 72 6f      select * fro
1df0: 6d 20 74 38 20 77 68 65 72 65 20 61 3d 31 20 6f  m t8 where a=1 o
1e00: 72 64 65 72 20 62 79 20 62 2c 20 63 0a 20 20 7d  rder by b, c.  }
1e10: 0a 7d 20 7b 31 20 32 20 33 20 6e 6f 73 6f 72 74  .} {1 2 3 nosort
1e20: 7d 0a 64 6f 5f 74 65 73 74 20 77 68 65 72 65 32  }.do_test where2
1e30: 2d 37 2e 33 20 7b 0a 20 20 63 6b 73 6f 72 74 20  -7.3 {.  cksort 
1e40: 7b 0a 20 20 20 20 73 65 6c 65 63 74 20 2a 20 66  {.    select * f
1e50: 72 6f 6d 20 74 38 2c 20 74 39 20 77 68 65 72 65  rom t8, t9 where
1e60: 20 61 3d 31 20 61 6e 64 20 79 3d 33 20 6f 72 64   a=1 and y=3 ord
1e70: 65 72 20 62 79 20 62 2c 20 78 0a 20 20 7d 0a 7d  er by b, x.  }.}
1e80: 20 7b 31 20 32 20 33 20 32 20 33 20 73 6f 72 74   {1 2 3 2 3 sort
1e90: 7d 0a 64 6f 5f 74 65 73 74 20 77 68 65 72 65 32  }.do_test where2
1ea0: 2d 37 2e 34 20 7b 0a 20 20 63 6b 73 6f 72 74 20  -7.4 {.  cksort 
1eb0: 7b 0a 20 20 20 20 63 72 65 61 74 65 20 75 6e 69  {.    create uni
1ec0: 71 75 65 20 69 6e 64 65 78 20 69 39 79 20 6f 6e  que index i9y on
1ed0: 20 74 39 28 79 29 3b 0a 20 20 20 20 73 65 6c 65   t9(y);.    sele
1ee0: 63 74 20 2a 20 66 72 6f 6d 20 74 38 2c 20 74 39  ct * from t8, t9
1ef0: 20 77 68 65 72 65 20 61 3d 31 20 61 6e 64 20 79   where a=1 and y
1f00: 3d 33 20 6f 72 64 65 72 20 62 79 20 62 2c 20 78  =3 order by b, x
1f10: 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 33 20 32 20  .  }.} {1 2 3 2 
1f20: 33 20 6e 6f 73 6f 72 74 7d 0a 0a 23 20 54 69 63  3 nosort}..# Tic
1f30: 6b 65 74 20 23 31 38 30 37 2e 20 20 55 73 69 6e  ket #1807.  Usin
1f40: 67 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 73 20  g IN constrains 
1f50: 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 63 6f 6c 75  on multiple colu
1f60: 6d 6e 73 20 6f 66 0a 23 20 61 20 6d 75 6c 74 69  mns of.# a multi
1f70: 2d 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 2e 0a 23  -column index..#
1f80: 0a 69 66 63 61 70 61 62 6c 65 20 73 75 62 71 75  .ifcapable subqu
1f90: 65 72 79 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  ery {.  do_test 
1fa0: 77 68 65 72 65 32 2d 38 2e 31 20 7b 0a 20 20 20  where2-8.1 {.   
1fb0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
1fc0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1fd0: 31 20 57 48 45 52 45 20 78 20 49 4e 20 28 32 30  1 WHERE x IN (20
1fe0: 2c 32 31 29 20 41 4e 44 20 79 20 49 4e 20 28 31  ,21) AND y IN (1
1ff0: 2c 32 29 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d  ,2).    }.  } {}
2000: 0a 20 20 64 6f 5f 74 65 73 74 20 77 68 65 72 65  .  do_test where
2010: 32 2d 38 2e 32 20 7b 0a 20 20 20 20 65 78 65 63  2-8.2 {.    exec
2020: 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45  sql {.      SELE
2030: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
2040: 52 45 20 78 20 49 4e 20 28 31 2c 32 29 20 41 4e  RE x IN (1,2) AN
2050: 44 20 79 20 49 4e 20 28 2d 35 2c 2d 36 29 0a 20  D y IN (-5,-6). 
2060: 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 65 78     }.  } {}.  ex
2070: 65 63 73 71 6c 20 7b 43 52 45 41 54 45 20 54 41  ecsql {CREATE TA
2080: 42 4c 45 20 74 78 20 41 53 20 53 45 4c 45 43 54  BLE tx AS SELECT
2090: 20 2a 20 46 52 4f 4d 20 74 31 7d 0a 20 20 64 6f   * FROM t1}.  do
20a0: 5f 74 65 73 74 20 77 68 65 72 65 32 2d 38 2e 33  _test where2-8.3
20b0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
20c0: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 77 20  .      SELECT w 
20d0: 46 52 4f 4d 20 74 31 0a 20 20 20 20 20 20 20 57  FROM t1.       W
20e0: 48 45 52 45 20 78 20 49 4e 20 28 53 45 4c 45 43  HERE x IN (SELEC
20f0: 54 20 78 20 46 52 4f 4d 20 74 78 20 57 48 45 52  T x FROM tx WHER
2100: 45 20 72 6f 77 69 64 3c 30 29 0a 20 20 20 20 20  E rowid<0).     
2110: 20 20 20 20 41 4e 44 20 2b 79 20 49 4e 20 28 53      AND +y IN (S
2120: 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 78 20  ELECT y FROM tx 
2130: 57 48 45 52 45 20 72 6f 77 69 64 3d 31 29 0a 20  WHERE rowid=1). 
2140: 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f     }.  } {}.  do
2150: 5f 74 65 73 74 20 77 68 65 72 65 32 2d 38 2e 34  _test where2-8.4
2160: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
2170: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 77 20  .      SELECT w 
2180: 46 52 4f 4d 20 74 31 0a 20 20 20 20 20 20 20 57  FROM t1.       W
2190: 48 45 52 45 20 78 20 49 4e 20 28 53 45 4c 45 43  HERE x IN (SELEC
21a0: 54 20 78 20 46 52 4f 4d 20 74 78 20 57 48 45 52  T x FROM tx WHER
21b0: 45 20 72 6f 77 69 64 3d 31 29 0a 20 20 20 20 20  E rowid=1).     
21c0: 20 20 20 20 41 4e 44 20 79 20 49 4e 20 28 53 45      AND y IN (SE
21d0: 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 78 20 57  LECT y FROM tx W
21e0: 48 45 52 45 20 72 6f 77 69 64 3c 30 29 0a 20 20  HERE rowid<0).  
21f0: 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 23 73 65    }.  } {}.  #se
2200: 74 20 73 71 6c 69 74 65 5f 77 68 65 72 65 5f 74  t sqlite_where_t
2210: 72 61 63 65 20 31 0a 20 20 64 6f 5f 74 65 73 74  race 1.  do_test
2220: 20 77 68 65 72 65 32 2d 38 2e 35 20 7b 0a 20 20   where2-8.5 {.  
2230: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
2240: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 74    CREATE INDEX t
2250: 78 5f 78 79 7a 20 4f 4e 20 74 78 28 78 2c 20 79  x_xyz ON tx(x, y
2260: 2c 20 7a 2c 20 77 29 3b 0a 20 20 20 20 20 20 53  , z, w);.      S
2270: 45 4c 45 43 54 20 77 20 46 52 4f 4d 20 74 78 0a  ELECT w FROM tx.
2280: 20 20 20 20 20 20 20 57 48 45 52 45 20 78 20 49         WHERE x I
2290: 4e 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d  N (SELECT x FROM
22a0: 20 74 31 20 57 48 45 52 45 20 77 20 42 45 54 57   t1 WHERE w BETW
22b0: 45 45 4e 20 31 30 20 41 4e 44 20 32 30 29 0a 20  EEN 10 AND 20). 
22c0: 20 20 20 20 20 20 20 20 41 4e 44 20 79 20 49 4e          AND y IN
22d0: 20 28 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20   (SELECT y FROM 
22e0: 74 31 20 57 48 45 52 45 20 77 20 42 45 54 57 45  t1 WHERE w BETWE
22f0: 45 4e 20 31 30 20 41 4e 44 20 32 30 29 0a 20 20  EN 10 AND 20).  
2300: 20 20 20 20 20 20 20 41 4e 44 20 7a 20 49 4e 20         AND z IN 
2310: 28 53 45 4c 45 43 54 20 7a 20 46 52 4f 4d 20 74  (SELECT z FROM t
2320: 31 20 57 48 45 52 45 20 77 20 42 45 54 57 45 45  1 WHERE w BETWEE
2330: 4e 20 31 32 20 41 4e 44 20 31 34 29 0a 20 20 20  N 12 AND 14).   
2340: 20 7d 0a 20 20 7d 20 7b 31 32 20 31 33 20 31 34   }.  } {12 13 14
2350: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 68 65 72  }.  do_test wher
2360: 65 32 2d 38 2e 36 20 7b 0a 20 20 20 20 65 78 65  e2-8.6 {.    exe
2370: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c  csql {.      SEL
2380: 45 43 54 20 77 20 46 52 4f 4d 20 74 78 0a 20 20  ECT w FROM tx.  
2390: 20 20 20 20 20 57 48 45 52 45 20 78 20 49 4e 20       WHERE x IN 
23a0: 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74  (SELECT x FROM t
23b0: 31 20 57 48 45 52 45 20 77 20 42 45 54 57 45 45  1 WHERE w BETWEE
23c0: 4e 20 31 30 20 41 4e 44 20 32 30 29 0a 20 20 20  N 10 AND 20).   
23d0: 20 20 20 20 20 20 41 4e 44 20 79 20 49 4e 20 28        AND y IN (
23e0: 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 31  SELECT y FROM t1
23f0: 20 57 48 45 52 45 20 77 20 42 45 54 57 45 45 4e   WHERE w BETWEEN
2400: 20 31 32 20 41 4e 44 20 31 34 29 0a 20 20 20 20   12 AND 14).    
2410: 20 20 20 20 20 41 4e 44 20 7a 20 49 4e 20 28 53       AND z IN (S
2420: 45 4c 45 43 54 20 7a 20 46 52 4f 4d 20 74 31 20  ELECT z FROM t1 
2430: 57 48 45 52 45 20 77 20 42 45 54 57 45 45 4e 20  WHERE w BETWEEN 
2440: 31 30 20 41 4e 44 20 32 30 29 0a 20 20 20 20 7d  10 AND 20).    }
2450: 0a 20 20 7d 20 7b 31 32 20 31 33 20 31 34 7d 0a  .  } {12 13 14}.
2460: 20 20 64 6f 5f 74 65 73 74 20 77 68 65 72 65 32    do_test where2
2470: 2d 38 2e 37 20 7b 0a 20 20 20 20 65 78 65 63 73  -8.7 {.    execs
2480: 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43  ql {.      SELEC
2490: 54 20 77 20 46 52 4f 4d 20 74 78 0a 20 20 20 20  T w FROM tx.    
24a0: 20 20 20 57 48 45 52 45 20 78 20 49 4e 20 28 53     WHERE x IN (S
24b0: 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20  ELECT x FROM t1 
24c0: 57 48 45 52 45 20 77 20 42 45 54 57 45 45 4e 20  WHERE w BETWEEN 
24d0: 31 32 20 41 4e 44 20 31 34 29 0a 20 20 20 20 20  12 AND 14).     
24e0: 20 20 20 20 41 4e 44 20 79 20 49 4e 20 28 53 45      AND y IN (SE
24f0: 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 31 20 57  LECT y FROM t1 W
2500: 48 45 52 45 20 77 20 42 45 54 57 45 45 4e 20 31  HERE w BETWEEN 1
2510: 30 20 41 4e 44 20 32 30 29 0a 20 20 20 20 20 20  0 AND 20).      
2520: 20 20 20 41 4e 44 20 7a 20 49 4e 20 28 53 45 4c     AND z IN (SEL
2530: 45 43 54 20 7a 20 46 52 4f 4d 20 74 31 20 57 48  ECT z FROM t1 WH
2540: 45 52 45 20 77 20 42 45 54 57 45 45 4e 20 31 30  ERE w BETWEEN 10
2550: 20 41 4e 44 20 32 30 29 0a 20 20 20 20 7d 0a 20   AND 20).    }. 
2560: 20 7d 20 7b 31 30 20 31 31 20 31 32 20 31 33 20   } {10 11 12 13 
2570: 31 34 20 31 35 7d 0a 20 20 64 6f 5f 74 65 73 74  14 15}.  do_test
2580: 20 77 68 65 72 65 32 2d 38 2e 38 20 7b 0a 20 20   where2-8.8 {.  
2590: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
25a0: 20 20 53 45 4c 45 43 54 20 77 20 46 52 4f 4d 20    SELECT w FROM 
25b0: 74 78 0a 20 20 20 20 20 20 20 57 48 45 52 45 20  tx.       WHERE 
25c0: 78 20 49 4e 20 28 53 45 4c 45 43 54 20 78 20 46  x IN (SELECT x F
25d0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 77 20 42  ROM t1 WHERE w B
25e0: 45 54 57 45 45 4e 20 31 30 20 41 4e 44 20 32 30  ETWEEN 10 AND 20
25f0: 29 0a 20 20 20 20 20 20 20 20 20 41 4e 44 20 79  ).         AND y
2600: 20 49 4e 20 28 53 45 4c 45 43 54 20 79 20 46 52   IN (SELECT y FR
2610: 4f 4d 20 74 31 20 57 48 45 52 45 20 77 20 42 45  OM t1 WHERE w BE
2620: 54 57 45 45 4e 20 31 30 20 41 4e 44 20 32 30 29  TWEEN 10 AND 20)
2630: 0a 20 20 20 20 20 20 20 20 20 41 4e 44 20 7a 20  .         AND z 
2640: 49 4e 20 28 53 45 4c 45 43 54 20 7a 20 46 52 4f  IN (SELECT z FRO
2650: 4d 20 74 31 20 57 48 45 52 45 20 77 20 42 45 54  M t1 WHERE w BET
2660: 57 45 45 4e 20 31 30 20 41 4e 44 20 32 30 29 0a  WEEN 10 AND 20).
2670: 20 20 20 20 7d 0a 20 20 7d 20 7b 31 30 20 31 31      }.  } {10 11
2680: 20 31 32 20 31 33 20 31 34 20 31 35 20 31 36 20   12 13 14 15 16 
2690: 31 37 20 31 38 20 31 39 20 32 30 7d 0a 20 20 64  17 18 19 20}.  d
26a0: 6f 5f 74 65 73 74 20 77 68 65 72 65 32 2d 38 2e  o_test where2-8.
26b0: 39 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  9 {.    execsql 
26c0: 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 77  {.      SELECT w
26d0: 20 46 52 4f 4d 20 74 78 0a 20 20 20 20 20 20 20   FROM tx.       
26e0: 57 48 45 52 45 20 78 20 49 4e 20 28 53 45 4c 45  WHERE x IN (SELE
26f0: 43 54 20 78 20 46 52 4f 4d 20 74 31 20 57 48 45  CT x FROM t1 WHE
2700: 52 45 20 77 20 42 45 54 57 45 45 4e 20 31 30 20  RE w BETWEEN 10 
2710: 41 4e 44 20 32 30 29 0a 20 20 20 20 20 20 20 20  AND 20).        
2720: 20 41 4e 44 20 79 20 49 4e 20 28 53 45 4c 45 43   AND y IN (SELEC
2730: 54 20 79 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T y FROM t1 WHER
2740: 45 20 77 20 42 45 54 57 45 45 4e 20 31 30 20 41  E w BETWEEN 10 A
2750: 4e 44 20 32 30 29 0a 20 20 20 20 20 20 20 20 20  ND 20).         
2760: 41 4e 44 20 7a 20 49 4e 20 28 53 45 4c 45 43 54  AND z IN (SELECT
2770: 20 7a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   z FROM t1 WHERE
2780: 20 77 20 42 45 54 57 45 45 4e 20 32 20 41 4e 44   w BETWEEN 2 AND
2790: 20 34 29 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d   4).    }.  } {}
27a0: 0a 20 20 64 6f 5f 74 65 73 74 20 77 68 65 72 65  .  do_test where
27b0: 32 2d 38 2e 31 30 20 7b 0a 20 20 20 20 65 78 65  2-8.10 {.    exe
27c0: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c  csql {.      SEL
27d0: 45 43 54 20 77 20 46 52 4f 4d 20 74 78 0a 20 20  ECT w FROM tx.  
27e0: 20 20 20 20 20 57 48 45 52 45 20 78 20 49 4e 20       WHERE x IN 
27f0: 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74  (SELECT x FROM t
2800: 31 20 57 48 45 52 45 20 77 20 42 45 54 57 45 45  1 WHERE w BETWEE
2810: 4e 20 31 30 20 41 4e 44 20 32 30 29 0a 20 20 20  N 10 AND 20).   
2820: 20 20 20 20 20 20 41 4e 44 20 79 20 49 4e 20 28        AND y IN (
2830: 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 31  SELECT y FROM t1
2840: 20 57 48 45 52 45 20 77 20 42 45 54 57 45 45 4e   WHERE w BETWEEN
2850: 20 32 20 41 4e 44 20 34 29 0a 20 20 20 20 20 20   2 AND 4).      
2860: 20 20 20 41 4e 44 20 7a 20 49 4e 20 28 53 45 4c     AND z IN (SEL
2870: 45 43 54 20 7a 20 46 52 4f 4d 20 74 31 20 57 48  ECT z FROM t1 WH
2880: 45 52 45 20 77 20 42 45 54 57 45 45 4e 20 31 30  ERE w BETWEEN 10
2890: 20 41 4e 44 20 32 30 29 0a 20 20 20 20 7d 0a 20   AND 20).    }. 
28a0: 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20   } {}.  do_test 
28b0: 77 68 65 72 65 32 2d 38 2e 31 31 20 7b 0a 20 20  where2-8.11 {.  
28c0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
28d0: 20 20 53 45 4c 45 43 54 20 77 20 46 52 4f 4d 20    SELECT w FROM 
28e0: 74 78 0a 20 20 20 20 20 20 20 57 48 45 52 45 20  tx.       WHERE 
28f0: 78 20 49 4e 20 28 53 45 4c 45 43 54 20 78 20 46  x IN (SELECT x F
2900: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 77 20 42  ROM t1 WHERE w B
2910: 45 54 57 45 45 4e 20 32 20 41 4e 44 20 34 29 0a  ETWEEN 2 AND 4).
2920: 20 20 20 20 20 20 20 20 20 41 4e 44 20 79 20 49           AND y I
2930: 4e 20 28 53 45 4c 45 43 54 20 79 20 46 52 4f 4d  N (SELECT y FROM
2940: 20 74 31 20 57 48 45 52 45 20 77 20 42 45 54 57   t1 WHERE w BETW
2950: 45 45 4e 20 31 30 20 41 4e 44 20 32 30 29 0a 20  EEN 10 AND 20). 
2960: 20 20 20 20 20 20 20 20 41 4e 44 20 7a 20 49 4e          AND z IN
2970: 20 28 53 45 4c 45 43 54 20 7a 20 46 52 4f 4d 20   (SELECT z FROM 
2980: 74 31 20 57 48 45 52 45 20 77 20 42 45 54 57 45  t1 WHERE w BETWE
2990: 45 4e 20 31 30 20 41 4e 44 20 32 30 29 0a 20 20  EN 10 AND 20).  
29a0: 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f    }.  } {}.  do_
29b0: 74 65 73 74 20 77 68 65 72 65 32 2d 38 2e 31 32  test where2-8.12
29c0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
29d0: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 77 20  .      SELECT w 
29e0: 46 52 4f 4d 20 74 78 0a 20 20 20 20 20 20 20 57  FROM tx.       W
29f0: 48 45 52 45 20 78 20 49 4e 20 28 53 45 4c 45 43  HERE x IN (SELEC
2a00: 54 20 78 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T x FROM t1 WHER
2a10: 45 20 77 20 42 45 54 57 45 45 4e 20 31 30 20 41  E w BETWEEN 10 A
2a20: 4e 44 20 32 30 29 0a 20 20 20 20 20 20 20 20 20  ND 20).         
2a30: 41 4e 44 20 79 20 49 4e 20 28 53 45 4c 45 43 54  AND y IN (SELECT
2a40: 20 79 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   y FROM t1 WHERE
2a50: 20 77 20 42 45 54 57 45 45 4e 20 31 30 20 41 4e   w BETWEEN 10 AN
2a60: 44 20 32 30 29 0a 20 20 20 20 20 20 20 20 20 41  D 20).         A
2a70: 4e 44 20 7a 20 49 4e 20 28 53 45 4c 45 43 54 20  ND z IN (SELECT 
2a80: 7a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  z FROM t1 WHERE 
2a90: 77 20 42 45 54 57 45 45 4e 20 2d 34 20 41 4e 44  w BETWEEN -4 AND
2aa0: 20 2d 32 29 0a 20 20 20 20 7d 0a 20 20 7d 20 7b   -2).    }.  } {
2ab0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 68 65 72  }.  do_test wher
2ac0: 65 32 2d 38 2e 31 33 20 7b 0a 20 20 20 20 65 78  e2-8.13 {.    ex
2ad0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45  ecsql {.      SE
2ae0: 4c 45 43 54 20 77 20 46 52 4f 4d 20 74 78 0a 20  LECT w FROM tx. 
2af0: 20 20 20 20 20 20 57 48 45 52 45 20 78 20 49 4e        WHERE x IN
2b00: 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20   (SELECT x FROM 
2b10: 74 31 20 57 48 45 52 45 20 77 20 42 45 54 57 45  t1 WHERE w BETWE
2b20: 45 4e 20 31 30 20 41 4e 44 20 32 30 29 0a 20 20  EN 10 AND 20).  
2b30: 20 20 20 20 20 20 20 41 4e 44 20 79 20 49 4e 20         AND y IN 
2b40: 28 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74  (SELECT y FROM t
2b50: 31 20 57 48 45 52 45 20 77 20 42 45 54 57 45 45  1 WHERE w BETWEE
2b60: 4e 20 2d 34 20 41 4e 44 20 2d 32 29 0a 20 20 20  N -4 AND -2).   
2b70: 20 20 20 20 20 20 41 4e 44 20 7a 20 49 4e 20 28        AND z IN (
2b80: 53 45 4c 45 43 54 20 7a 20 46 52 4f 4d 20 74 31  SELECT z FROM t1
2b90: 20 57 48 45 52 45 20 77 20 42 45 54 57 45 45 4e   WHERE w BETWEEN
2ba0: 20 31 30 20 41 4e 44 20 32 30 29 0a 20 20 20 20   10 AND 20).    
2bb0: 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  }.  } {}.  do_te
2bc0: 73 74 20 77 68 65 72 65 32 2d 38 2e 31 34 20 7b  st where2-8.14 {
2bd0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
2be0: 20 20 20 20 20 53 45 4c 45 43 54 20 77 20 46 52       SELECT w FR
2bf0: 4f 4d 20 74 78 0a 20 20 20 20 20 20 20 57 48 45  OM tx.       WHE
2c00: 52 45 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20  RE x IN (SELECT 
2c10: 78 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  x FROM t1 WHERE 
2c20: 77 20 42 45 54 57 45 45 4e 20 2d 34 20 41 4e 44  w BETWEEN -4 AND
2c30: 20 2d 32 29 0a 20 20 20 20 20 20 20 20 20 41 4e   -2).         AN
2c40: 44 20 79 20 49 4e 20 28 53 45 4c 45 43 54 20 79  D y IN (SELECT y
2c50: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 77   FROM t1 WHERE w
2c60: 20 42 45 54 57 45 45 4e 20 31 30 20 41 4e 44 20   BETWEEN 10 AND 
2c70: 32 30 29 0a 20 20 20 20 20 20 20 20 20 41 4e 44  20).         AND
2c80: 20 7a 20 49 4e 20 28 53 45 4c 45 43 54 20 7a 20   z IN (SELECT z 
2c90: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 77 20  FROM t1 WHERE w 
2ca0: 42 45 54 57 45 45 4e 20 31 30 20 41 4e 44 20 32  BETWEEN 10 AND 2
2cb0: 30 29 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a  0).    }.  } {}.
2cc0: 20 20 64 6f 5f 74 65 73 74 20 77 68 65 72 65 32    do_test where2
2cd0: 2d 38 2e 31 35 20 7b 0a 20 20 20 20 65 78 65 63  -8.15 {.    exec
2ce0: 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45  sql {.      SELE
2cf0: 43 54 20 77 20 46 52 4f 4d 20 74 78 0a 20 20 20  CT w FROM tx.   
2d00: 20 20 20 20 57 48 45 52 45 20 78 20 49 4e 20 28      WHERE x IN (
2d10: 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31  SELECT x FROM t1
2d20: 20 57 48 45 52 45 20 77 20 42 45 54 57 45 45 4e   WHERE w BETWEEN
2d30: 20 31 30 20 41 4e 44 20 32 30 29 0a 20 20 20 20   10 AND 20).    
2d40: 20 20 20 20 20 41 4e 44 20 79 20 49 4e 20 28 53       AND y IN (S
2d50: 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 31 20  ELECT y FROM t1 
2d60: 57 48 45 52 45 20 77 20 42 45 54 57 45 45 4e 20  WHERE w BETWEEN 
2d70: 31 30 20 41 4e 44 20 32 30 29 0a 20 20 20 20 20  10 AND 20).     
2d80: 20 20 20 20 41 4e 44 20 7a 20 49 4e 20 28 53 45      AND z IN (SE
2d90: 4c 45 43 54 20 7a 20 46 52 4f 4d 20 74 31 20 57  LECT z FROM t1 W
2da0: 48 45 52 45 20 77 20 42 45 54 57 45 45 4e 20 32  HERE w BETWEEN 2
2db0: 30 30 20 41 4e 44 20 33 30 30 29 0a 20 20 20 20  00 AND 300).    
2dc0: 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  }.  } {}.  do_te
2dd0: 73 74 20 77 68 65 72 65 32 2d 38 2e 31 36 20 7b  st where2-8.16 {
2de0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
2df0: 20 20 20 20 20 53 45 4c 45 43 54 20 77 20 46 52       SELECT w FR
2e00: 4f 4d 20 74 78 0a 20 20 20 20 20 20 20 57 48 45  OM tx.       WHE
2e10: 52 45 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20  RE x IN (SELECT 
2e20: 78 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  x FROM t1 WHERE 
2e30: 77 20 42 45 54 57 45 45 4e 20 31 30 20 41 4e 44  w BETWEEN 10 AND
2e40: 20 32 30 29 0a 20 20 20 20 20 20 20 20 20 41 4e   20).         AN
2e50: 44 20 79 20 49 4e 20 28 53 45 4c 45 43 54 20 79  D y IN (SELECT y
2e60: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 77   FROM t1 WHERE w
2e70: 20 42 45 54 57 45 45 4e 20 32 30 30 20 41 4e 44   BETWEEN 200 AND
2e80: 20 33 30 30 29 0a 20 20 20 20 20 20 20 20 20 41   300).         A
2e90: 4e 44 20 7a 20 49 4e 20 28 53 45 4c 45 43 54 20  ND z IN (SELECT 
2ea0: 7a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  z FROM t1 WHERE 
2eb0: 77 20 42 45 54 57 45 45 4e 20 31 30 20 41 4e 44  w BETWEEN 10 AND
2ec0: 20 32 30 29 0a 20 20 20 20 7d 0a 20 20 7d 20 7b   20).    }.  } {
2ed0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 68 65 72  }.  do_test wher
2ee0: 65 32 2d 38 2e 31 37 20 7b 0a 20 20 20 20 65 78  e2-8.17 {.    ex
2ef0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45  ecsql {.      SE
2f00: 4c 45 43 54 20 77 20 46 52 4f 4d 20 74 78 0a 20  LECT w FROM tx. 
2f10: 20 20 20 20 20 20 57 48 45 52 45 20 78 20 49 4e        WHERE x IN
2f20: 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20   (SELECT x FROM 
2f30: 74 31 20 57 48 45 52 45 20 77 20 42 45 54 57 45  t1 WHERE w BETWE
2f40: 45 4e 20 32 30 30 20 41 4e 44 20 33 30 30 29 0a  EN 200 AND 300).
2f50: 20 20 20 20 20 20 20 20 20 41 4e 44 20 79 20 49           AND y I
2f60: 4e 20 28 53 45 4c 45 43 54 20 79 20 46 52 4f 4d  N (SELECT y FROM
2f70: 20 74 31 20 57 48 45 52 45 20 77 20 42 45 54 57   t1 WHERE w BETW
2f80: 45 45 4e 20 31 30 20 41 4e 44 20 32 30 29 0a 20  EEN 10 AND 20). 
2f90: 20 20 20 20 20 20 20 20 41 4e 44 20 7a 20 49 4e          AND z IN
2fa0: 20 28 53 45 4c 45 43 54 20 7a 20 46 52 4f 4d 20   (SELECT z FROM 
2fb0: 74 31 20 57 48 45 52 45 20 77 20 42 45 54 57 45  t1 WHERE w BETWE
2fc0: 45 4e 20 31 30 20 41 4e 44 20 32 30 29 0a 20 20  EN 10 AND 20).  
2fd0: 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f    }.  } {}.  do_
2fe0: 74 65 73 74 20 77 68 65 72 65 32 2d 38 2e 31 38  test where2-8.18
2ff0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
3000: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 77 20  .      SELECT w 
3010: 46 52 4f 4d 20 74 78 0a 20 20 20 20 20 20 20 57  FROM tx.       W
3020: 48 45 52 45 20 78 20 49 4e 20 28 53 45 4c 45 43  HERE x IN (SELEC
3030: 54 20 78 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T x FROM t1 WHER
3040: 45 20 2b 77 20 42 45 54 57 45 45 4e 20 31 30 20  E +w BETWEEN 10 
3050: 41 4e 44 20 32 30 29 0a 20 20 20 20 20 20 20 20  AND 20).        
3060: 20 41 4e 44 20 79 20 49 4e 20 28 53 45 4c 45 43   AND y IN (SELEC
3070: 54 20 79 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T y FROM t1 WHER
3080: 45 20 2b 77 20 42 45 54 57 45 45 4e 20 31 30 20  E +w BETWEEN 10 
3090: 41 4e 44 20 32 30 29 0a 20 20 20 20 20 20 20 20  AND 20).        
30a0: 20 41 4e 44 20 7a 20 49 4e 20 28 53 45 4c 45 43   AND z IN (SELEC
30b0: 54 20 7a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T z FROM t1 WHER
30c0: 45 20 2b 77 20 42 45 54 57 45 45 4e 20 32 30 30  E +w BETWEEN 200
30d0: 20 41 4e 44 20 33 30 30 29 0a 20 20 20 20 7d 0a   AND 300).    }.
30e0: 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74    } {}.  do_test
30f0: 20 77 68 65 72 65 32 2d 38 2e 31 39 20 7b 0a 20   where2-8.19 {. 
3100: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
3110: 20 20 20 53 45 4c 45 43 54 20 77 20 46 52 4f 4d     SELECT w FROM
3120: 20 74 78 0a 20 20 20 20 20 20 20 57 48 45 52 45   tx.       WHERE
3130: 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 78 20   x IN (SELECT x 
3140: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 2b 77  FROM t1 WHERE +w
3150: 20 42 45 54 57 45 45 4e 20 31 30 20 41 4e 44 20   BETWEEN 10 AND 
3160: 32 30 29 0a 20 20 20 20 20 20 20 20 20 41 4e 44  20).         AND
3170: 20 79 20 49 4e 20 28 53 45 4c 45 43 54 20 79 20   y IN (SELECT y 
3180: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 2b 77  FROM t1 WHERE +w
3190: 20 42 45 54 57 45 45 4e 20 32 30 30 20 41 4e 44   BETWEEN 200 AND
31a0: 20 33 30 30 29 0a 20 20 20 20 20 20 20 20 20 41   300).         A
31b0: 4e 44 20 7a 20 49 4e 20 28 53 45 4c 45 43 54 20  ND z IN (SELECT 
31c0: 7a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  z FROM t1 WHERE 
31d0: 2b 77 20 42 45 54 57 45 45 4e 20 31 30 20 41 4e  +w BETWEEN 10 AN
31e0: 44 20 32 30 29 0a 20 20 20 20 7d 0a 20 20 7d 20  D 20).    }.  } 
31f0: 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 68 65  {}.  do_test whe
3200: 72 65 32 2d 38 2e 32 30 20 7b 0a 20 20 20 20 65  re2-8.20 {.    e
3210: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53  xecsql {.      S
3220: 45 4c 45 43 54 20 77 20 46 52 4f 4d 20 74 78 0a  ELECT w FROM tx.
3230: 20 20 20 20 20 20 20 57 48 45 52 45 20 78 20 49         WHERE x I
3240: 4e 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d  N (SELECT x FROM
3250: 20 74 31 20 57 48 45 52 45 20 2b 77 20 42 45 54   t1 WHERE +w BET
3260: 57 45 45 4e 20 32 30 30 20 41 4e 44 20 33 30 30  WEEN 200 AND 300
3270: 29 0a 20 20 20 20 20 20 20 20 20 41 4e 44 20 79  ).         AND y
3280: 20 49 4e 20 28 53 45 4c 45 43 54 20 79 20 46 52   IN (SELECT y FR
3290: 4f 4d 20 74 31 20 57 48 45 52 45 20 2b 77 20 42  OM t1 WHERE +w B
32a0: 45 54 57 45 45 4e 20 31 30 20 41 4e 44 20 32 30  ETWEEN 10 AND 20
32b0: 29 0a 20 20 20 20 20 20 20 20 20 41 4e 44 20 7a  ).         AND z
32c0: 20 49 4e 20 28 53 45 4c 45 43 54 20 7a 20 46 52   IN (SELECT z FR
32d0: 4f 4d 20 74 31 20 57 48 45 52 45 20 2b 77 20 42  OM t1 WHERE +w B
32e0: 45 54 57 45 45 4e 20 31 30 20 41 4e 44 20 32 30  ETWEEN 10 AND 20
32f0: 29 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 7d  ).    }.  } {}.}
3300: 20 20 0a 0a 23 20 4d 61 6b 65 20 73 75 72 65 20    ..# Make sure 
3310: 57 48 45 52 45 20 63 6c 61 75 73 65 73 20 6f 66  WHERE clauses of
3320: 20 74 68 65 20 66 6f 72 6d 20 41 3d 31 20 41 4e   the form A=1 AN
3330: 44 20 28 42 3d 32 20 4f 52 20 42 3d 33 29 20 61  D (B=2 OR B=3) a
3340: 72 65 20 6f 70 74 69 6d 69 7a 65 64 0a 23 20 77  re optimized.# w
3350: 68 65 6e 20 77 65 20 68 61 76 65 20 61 6e 20 69  hen we have an i
3360: 6e 64 65 78 20 6f 6e 20 41 20 61 6e 64 20 42 2e  ndex on A and B.
3370: 0a 23 0a 69 66 63 61 70 61 62 6c 65 20 6f 72 5f  .#.ifcapable or_
3380: 6f 70 74 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  opt {.  do_test 
3390: 77 68 65 72 65 32 2d 39 2e 31 20 7b 0a 20 20 20  where2-9.1 {.   
33a0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
33b0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 43 52   BEGIN;.      CR
33c0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 30 28 61  EATE TABLE t10(a
33d0: 2c 62 2c 63 29 3b 0a 20 20 20 20 20 20 49 4e 53  ,b,c);.      INS
33e0: 45 52 54 20 49 4e 54 4f 20 74 31 30 20 56 41 4c  ERT INTO t10 VAL
33f0: 55 45 53 28 31 2c 31 2c 31 29 3b 0a 20 20 20 20  UES(1,1,1);.    
3400: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
3410: 30 20 56 41 4c 55 45 53 28 31 2c 32 2c 32 29 3b  0 VALUES(1,2,2);
3420: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
3430: 54 4f 20 74 31 30 20 56 41 4c 55 45 53 28 31 2c  TO t10 VALUES(1,
3440: 33 2c 33 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  3,3);.    }.    
3450: 66 6f 72 20 7b 73 65 74 20 69 20 34 7d 20 7b 24  for {set i 4} {$
3460: 69 3c 3d 31 30 30 30 7d 20 7b 69 6e 63 72 20 69  i<=1000} {incr i
3470: 7d 20 7b 0a 20 20 20 20 20 20 65 78 65 63 73 71  } {.      execsq
3480: 6c 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  l {INSERT INTO t
3490: 31 30 20 56 41 4c 55 45 53 28 31 2c 24 69 2c 24  10 VALUES(1,$i,$
34a0: 69 29 7d 0a 20 20 20 20 7d 0a 20 20 20 20 65 78  i)}.    }.    ex
34b0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 43 52  ecsql {.      CR
34c0: 45 41 54 45 20 49 4e 44 45 58 20 69 31 30 20 4f  EATE INDEX i10 O
34d0: 4e 20 74 31 30 28 61 2c 62 29 3b 0a 20 20 20 20  N t10(a,b);.    
34e0: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 20 20    COMMIT;.      
34f0: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
3500: 46 52 4f 4d 20 74 31 30 3b 0a 20 20 20 20 7d 0a  FROM t10;.    }.
3510: 20 20 7d 20 31 30 30 30 0a 20 20 64 6f 5f 74 65    } 1000.  do_te
3520: 73 74 20 77 68 65 72 65 32 2d 39 2e 32 20 7b 0a  st where2-9.2 {.
3530: 20 20 20 20 63 6f 75 6e 74 20 7b 0a 20 20 20 20      count {.    
3540: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
3550: 74 31 30 20 57 48 45 52 45 20 61 3d 31 20 41 4e  t10 WHERE a=1 AN
3560: 44 20 28 62 3d 32 20 4f 52 20 62 3d 33 29 0a 20  D (b=2 OR b=3). 
3570: 20 20 20 7d 0a 20 20 7d 20 7b 31 20 32 20 32 20     }.  } {1 2 2 
3580: 31 20 33 20 33 20 37 7d 0a 7d 0a 0a 66 69 6e 69  1 3 3 7}.}..fini
3590: 73 68 5f 74 65 73 74 0a                          sh_test.