/ Hex Artifact Content
Login

Artifact ed6baa9420a109d8be683dbef5d153d186f3690b:


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: 35 20 32 30 30 39 2f 30 32 2f 30 32 20 30 31 3a  5 2009/02/02 01:
0240: 35 30 3a 34 30 20 64 72 68 20 45 78 70 20 24 0a  50:40 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 64 61 74 61 20 5b 65 78 65 63 73 71 6c 20  t data [execsql 
06e0: 24 73 71 6c 5d 0a 20 20 69 66 20 7b 5b 64 62 20  $sql].  if {[db 
06f0: 73 74 61 74 75 73 20 73 6f 72 74 5d 7d 20 7b 73  status sort]} {s
0700: 65 74 20 78 20 73 6f 72 74 7d 20 7b 73 65 74 20  et x sort} {set 
0710: 78 20 6e 6f 73 6f 72 74 7d 0a 20 20 6c 61 70 70  x nosort}.  lapp
0720: 65 6e 64 20 64 61 74 61 20 24 78 0a 20 20 72 65  end data $x.  re
0730: 74 75 72 6e 20 24 64 61 74 61 0a 7d 0a 0a 23 20  turn $data.}..# 
0740: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 65  This procedure e
0750: 78 65 63 75 74 65 73 20 74 68 65 20 53 51 4c 2e  xecutes the SQL.
0760: 20 20 54 68 65 6e 20 69 74 20 61 70 70 65 6e 64    Then it append
0770: 73 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20  s to the result 
0780: 74 68 65 0a 23 20 22 73 6f 72 74 22 20 6f 72 20  the.# "sort" or 
0790: 22 6e 6f 73 6f 72 74 22 20 6b 65 79 77 6f 72 64  "nosort" keyword
07a0: 20 28 61 73 20 69 6e 20 74 68 65 20 63 6b 73 6f   (as in the ckso
07b0: 72 74 20 70 72 6f 63 65 64 75 72 65 20 61 62 6f  rt procedure abo
07c0: 76 65 29 20 74 68 65 6e 0a 23 20 69 74 20 61 70  ve) then.# it ap
07d0: 70 65 6e 64 73 20 74 68 65 20 6e 61 6d 65 20 6f  pends the name o
07e0: 66 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20  f the table and 
07f0: 69 6e 64 65 78 20 75 73 65 64 2e 0a 23 0a 70 72  index used..#.pr
0800: 6f 63 20 71 75 65 72 79 70 6c 61 6e 20 7b 73 71  oc queryplan {sq
0810: 6c 7d 20 7b 0a 20 20 73 65 74 20 3a 3a 73 71 6c  l} {.  set ::sql
0820: 69 74 65 5f 73 6f 72 74 5f 63 6f 75 6e 74 20 30  ite_sort_count 0
0830: 0a 20 20 73 65 74 20 64 61 74 61 20 5b 65 78 65  .  set data [exe
0840: 63 73 71 6c 20 24 73 71 6c 5d 0a 20 20 69 66 20  csql $sql].  if 
0850: 7b 24 3a 3a 73 71 6c 69 74 65 5f 73 6f 72 74 5f  {$::sqlite_sort_
0860: 63 6f 75 6e 74 7d 20 7b 73 65 74 20 78 20 73 6f  count} {set x so
0870: 72 74 7d 20 7b 73 65 74 20 78 20 6e 6f 73 6f 72  rt} {set x nosor
0880: 74 7d 0a 20 20 6c 61 70 70 65 6e 64 20 64 61 74  t}.  lappend dat
0890: 61 20 24 78 0a 20 20 73 65 74 20 65 71 70 20 5b  a $x.  set eqp [
08a0: 65 78 65 63 73 71 6c 20 22 45 58 50 4c 41 49 4e  execsql "EXPLAIN
08b0: 20 51 55 45 52 59 20 50 4c 41 4e 20 24 73 71 6c   QUERY PLAN $sql
08c0: 22 5d 0a 20 20 23 20 70 75 74 73 20 65 71 70 3d  "].  # puts eqp=
08d0: 24 65 71 70 0a 20 20 66 6f 72 65 61 63 68 20 7b  $eqp.  foreach {
08e0: 61 20 62 20 63 20 78 7d 20 24 65 71 70 20 7b 0a  a b c x} $eqp {.
08f0: 20 20 20 20 69 66 20 7b 5b 72 65 67 65 78 70 20      if {[regexp 
0900: 7b 20 54 41 42 4c 45 20 28 5c 77 2b 20 41 53 20  { TABLE (\w+ AS 
0910: 29 3f 28 5c 77 2b 29 20 55 53 49 4e 47 2e 2a 20  )?(\w+) USING.* 
0920: 49 4e 44 45 58 20 28 5c 77 2b 29 5c 79 7d 20 5c  INDEX (\w+)\y} \
0930: 0a 20 20 20 20 20 20 20 20 24 78 20 61 6c 6c 20  .        $x all 
0940: 61 73 20 74 61 62 20 69 64 78 5d 7d 20 7b 0a 20  as tab idx]} {. 
0950: 20 20 20 20 20 6c 61 70 70 65 6e 64 20 64 61 74       lappend dat
0960: 61 20 24 74 61 62 20 24 69 64 78 0a 20 20 20 20  a $tab $idx.    
0970: 7d 20 65 6c 73 65 69 66 20 7b 5b 72 65 67 65 78  } elseif {[regex
0980: 70 20 7b 20 54 41 42 4c 45 20 28 5c 77 2b 20 41  p { TABLE (\w+ A
0990: 53 20 29 3f 28 5c 77 2b 29 5c 79 7d 20 24 78 20  S )?(\w+)\y} $x 
09a0: 61 6c 6c 20 61 73 20 74 61 62 5d 7d 20 7b 0a 20  all as tab]} {. 
09b0: 20 20 20 20 20 6c 61 70 70 65 6e 64 20 64 61 74       lappend dat
09c0: 61 20 24 74 61 62 20 2a 0a 20 20 20 20 7d 0a 20  a $tab *.    }. 
09d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 24 64 61 74   }.  return $dat
09e0: 61 20 20 20 0a 7d 0a 0a 0a 23 20 50 72 65 66 65  a   .}...# Prefe
09f0: 72 20 61 20 55 4e 49 51 55 45 20 69 6e 64 65 78  r a UNIQUE index
0a00: 20 6f 76 65 72 20 61 6e 6f 74 68 65 72 20 69 6e   over another in
0a10: 64 65 78 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 77  dex..#.do_test w
0a20: 68 65 72 65 32 2d 31 2e 31 20 7b 0a 20 20 71 75  here2-1.1 {.  qu
0a30: 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45  eryplan {.    SE
0a40: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
0a50: 48 45 52 45 20 77 3d 38 35 20 41 4e 44 20 78 3d  HERE w=85 AND x=
0a60: 36 20 41 4e 44 20 79 3d 37 33 39 36 0a 20 20 7d  6 AND y=7396.  }
0a70: 0a 7d 20 7b 38 35 20 36 20 37 33 39 36 20 37 34  .} {85 6 7396 74
0a80: 30 32 20 6e 6f 73 6f 72 74 20 74 31 20 69 31 77  02 nosort t1 i1w
0a90: 7d 0a 0a 23 20 41 6c 77 61 79 73 20 70 72 65 66  }..# Always pref
0aa0: 65 72 20 61 20 72 6f 77 69 64 3d 3d 20 63 6f 6e  er a rowid== con
0ab0: 73 74 72 61 69 6e 74 20 6f 76 65 72 20 61 6e 79  straint over any
0ac0: 20 6f 74 68 65 72 20 69 6e 64 65 78 2e 0a 23 0a   other index..#.
0ad0: 64 6f 5f 74 65 73 74 20 77 68 65 72 65 32 2d 31  do_test where2-1
0ae0: 2e 33 20 7b 0a 20 20 71 75 65 72 79 70 6c 61 6e  .3 {.  queryplan
0af0: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   {.    SELECT * 
0b00: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 77 3d  FROM t1 WHERE w=
0b10: 38 35 20 41 4e 44 20 78 3d 36 20 41 4e 44 20 79  85 AND x=6 AND y
0b20: 3d 37 33 39 36 20 41 4e 44 20 72 6f 77 69 64 3d  =7396 AND rowid=
0b30: 38 35 0a 20 20 7d 0a 7d 20 7b 38 35 20 36 20 37  85.  }.} {85 6 7
0b40: 33 39 36 20 37 34 30 32 20 6e 6f 73 6f 72 74 20  396 7402 nosort 
0b50: 74 31 20 2a 7d 0a 0a 23 20 57 68 65 6e 20 63 6f  t1 *}..# When co
0b60: 6e 73 74 72 61 69 6e 65 64 20 62 79 20 61 20 55  nstrained by a U
0b70: 4e 49 51 55 45 20 69 6e 64 65 78 2c 20 74 68 65  NIQUE index, the
0b80: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
0b90: 20 69 73 20 61 6c 77 61 79 73 20 69 67 6e 6f 72   is always ignor
0ba0: 65 64 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 77 68  ed..#.do_test wh
0bb0: 65 72 65 32 2d 32 2e 31 20 7b 0a 20 20 71 75 65  ere2-2.1 {.  que
0bc0: 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c  ryplan {.    SEL
0bd0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
0be0: 45 52 45 20 77 3d 38 35 20 4f 52 44 45 52 20 42  ERE w=85 ORDER B
0bf0: 59 20 72 61 6e 64 6f 6d 28 29 3b 0a 20 20 7d 0a  Y random();.  }.
0c00: 7d 20 7b 38 35 20 36 20 37 33 39 36 20 37 34 30  } {85 6 7396 740
0c10: 32 20 6e 6f 73 6f 72 74 20 74 31 20 69 31 77 7d  2 nosort t1 i1w}
0c20: 0a 64 6f 5f 74 65 73 74 20 77 68 65 72 65 32 2d  .do_test where2-
0c30: 32 2e 32 20 7b 0a 20 20 71 75 65 72 79 70 6c 61  2.2 {.  querypla
0c40: 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  n {.    SELECT *
0c50: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 78   FROM t1 WHERE x
0c60: 3d 36 20 41 4e 44 20 79 3d 37 33 39 36 20 4f 52  =6 AND y=7396 OR
0c70: 44 45 52 20 42 59 20 72 61 6e 64 6f 6d 28 29 3b  DER BY random();
0c80: 0a 20 20 7d 0a 7d 20 7b 38 35 20 36 20 37 33 39  .  }.} {85 6 739
0c90: 36 20 37 34 30 32 20 73 6f 72 74 20 74 31 20 69  6 7402 sort t1 i
0ca0: 31 78 79 7d 0a 64 6f 5f 74 65 73 74 20 77 68 65  1xy}.do_test whe
0cb0: 72 65 32 2d 32 2e 33 20 7b 0a 20 20 71 75 65 72  re2-2.3 {.  quer
0cc0: 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45  yplan {.    SELE
0cd0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
0ce0: 52 45 20 72 6f 77 69 64 3d 38 35 20 41 4e 44 20  RE rowid=85 AND 
0cf0: 78 3d 36 20 41 4e 44 20 79 3d 37 33 39 36 20 4f  x=6 AND y=7396 O
0d00: 52 44 45 52 20 42 59 20 72 61 6e 64 6f 6d 28 29  RDER BY random()
0d10: 3b 0a 20 20 7d 0a 7d 20 7b 38 35 20 36 20 37 33  ;.  }.} {85 6 73
0d20: 39 36 20 37 34 30 32 20 6e 6f 73 6f 72 74 20 74  96 7402 nosort t
0d30: 31 20 2a 7d 0a 0a 0a 23 20 45 66 66 69 63 69 65  1 *}...# Efficie
0d40: 6e 74 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 66  nt handling of f
0d50: 6f 72 77 61 72 64 20 61 6e 64 20 72 65 76 65 72  orward and rever
0d60: 73 65 20 74 61 62 6c 65 20 73 63 61 6e 73 2e 0a  se table scans..
0d70: 23 0a 64 6f 5f 74 65 73 74 20 77 68 65 72 65 32  #.do_test where2
0d80: 2d 33 2e 31 20 7b 0a 20 20 71 75 65 72 79 70 6c  -3.1 {.  querypl
0d90: 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  an {.    SELECT 
0da0: 2a 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20  * FROM t1 ORDER 
0db0: 42 59 20 72 6f 77 69 64 20 4c 49 4d 49 54 20 32  BY rowid LIMIT 2
0dc0: 0a 20 20 7d 0a 7d 20 7b 31 20 30 20 34 20 34 20  .  }.} {1 0 4 4 
0dd0: 32 20 31 20 39 20 31 30 20 6e 6f 73 6f 72 74 20  2 1 9 10 nosort 
0de0: 74 31 20 2a 7d 0a 64 6f 5f 74 65 73 74 20 77 68  t1 *}.do_test wh
0df0: 65 72 65 32 2d 33 2e 32 20 7b 0a 20 20 71 75 65  ere2-3.2 {.  que
0e00: 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c  ryplan {.    SEL
0e10: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4f 52  ECT * FROM t1 OR
0e20: 44 45 52 20 42 59 20 72 6f 77 69 64 20 44 45 53  DER BY rowid DES
0e30: 43 20 4c 49 4d 49 54 20 32 0a 20 20 7d 0a 7d 20  C LIMIT 2.  }.} 
0e40: 7b 31 30 30 20 36 20 31 30 32 30 31 20 31 30 32  {100 6 10201 102
0e50: 30 37 20 39 39 20 36 20 31 30 30 30 30 20 31 30  07 99 6 10000 10
0e60: 30 30 36 20 6e 6f 73 6f 72 74 20 74 31 20 2a 7d  006 nosort t1 *}
0e70: 0a 0a 23 20 54 68 65 20 49 4e 20 6f 70 65 72 61  ..# The IN opera
0e80: 74 6f 72 20 63 61 6e 20 62 65 20 75 73 65 64 20  tor can be used 
0e90: 62 79 20 69 6e 64 69 63 65 73 20 61 74 20 6d 75  by indices at mu
0ea0: 6c 74 69 70 6c 65 20 6c 61 79 65 72 73 0a 23 0a  ltiple layers.#.
0eb0: 69 66 63 61 70 61 62 6c 65 20 73 75 62 71 75 65  ifcapable subque
0ec0: 72 79 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 77  ry {.  do_test w
0ed0: 68 65 72 65 32 2d 34 2e 31 20 7b 0a 20 20 20 20  here2-4.1 {.    
0ee0: 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20  queryplan {.    
0ef0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
0f00: 74 31 20 57 48 45 52 45 20 7a 20 49 4e 20 28 31  t1 WHERE z IN (1
0f10: 30 32 30 37 2c 31 30 30 30 36 29 20 41 4e 44 20  0207,10006) AND 
0f20: 79 20 49 4e 20 28 31 30 30 30 30 2c 31 30 32 30  y IN (10000,1020
0f30: 31 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1).             
0f40: 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 78 3e            AND x>
0f50: 30 20 41 4e 44 20 78 3c 31 30 0a 20 20 20 20 20  0 AND x<10.     
0f60: 20 4f 52 44 45 52 20 42 59 20 77 0a 20 20 20 20   ORDER BY w.    
0f70: 7d 0a 20 20 7d 20 7b 39 39 20 36 20 31 30 30 30  }.  } {99 6 1000
0f80: 30 20 31 30 30 30 36 20 31 30 30 20 36 20 31 30  0 10006 100 6 10
0f90: 32 30 31 20 31 30 32 30 37 20 73 6f 72 74 20 74  201 10207 sort t
0fa0: 31 20 69 31 7a 79 78 7d 0a 20 20 64 6f 5f 74 65  1 i1zyx}.  do_te
0fb0: 73 74 20 77 68 65 72 65 32 2d 34 2e 32 20 7b 0a  st where2-4.2 {.
0fc0: 20 20 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a      queryplan {.
0fd0: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
0fe0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 20 49  ROM t1 WHERE z I
0ff0: 4e 20 28 31 30 32 30 37 2c 31 30 30 30 36 29 20  N (10207,10006) 
1000: 41 4e 44 20 79 3d 31 30 30 30 30 0a 20 20 20 20  AND y=10000.    
1010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1020: 20 20 20 41 4e 44 20 78 3e 30 20 41 4e 44 20 78     AND x>0 AND x
1030: 3c 31 30 0a 20 20 20 20 20 20 4f 52 44 45 52 20  <10.      ORDER 
1040: 42 59 20 77 0a 20 20 20 20 7d 0a 20 20 7d 20 7b  BY w.    }.  } {
1050: 39 39 20 36 20 31 30 30 30 30 20 31 30 30 30 36  99 6 10000 10006
1060: 20 73 6f 72 74 20 74 31 20 69 31 7a 79 78 7d 0a   sort t1 i1zyx}.
1070: 20 20 64 6f 5f 74 65 73 74 20 77 68 65 72 65 32    do_test where2
1080: 2d 34 2e 33 20 7b 0a 20 20 20 20 71 75 65 72 79  -4.3 {.    query
1090: 70 6c 61 6e 20 7b 0a 20 20 20 20 20 20 53 45 4c  plan {.      SEL
10a0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
10b0: 45 52 45 20 7a 3d 31 30 30 30 36 20 41 4e 44 20  ERE z=10006 AND 
10c0: 79 20 49 4e 20 28 31 30 30 30 30 2c 31 30 32 30  y IN (10000,1020
10d0: 31 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1).             
10e0: 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 78 3e            AND x>
10f0: 30 20 41 4e 44 20 78 3c 31 30 0a 20 20 20 20 20  0 AND x<10.     
1100: 20 4f 52 44 45 52 20 42 59 20 77 0a 20 20 20 20   ORDER BY w.    
1110: 7d 0a 20 20 7d 20 7b 39 39 20 36 20 31 30 30 30  }.  } {99 6 1000
1120: 30 20 31 30 30 30 36 20 73 6f 72 74 20 74 31 20  0 10006 sort t1 
1130: 69 31 7a 79 78 7d 0a 20 20 69 66 63 61 70 61 62  i1zyx}.  ifcapab
1140: 6c 65 20 63 6f 6d 70 6f 75 6e 64 20 7b 0a 20 20  le compound {.  
1150: 20 20 64 6f 5f 74 65 73 74 20 77 68 65 72 65 32    do_test where2
1160: 2d 34 2e 34 20 7b 0a 20 20 20 20 20 20 71 75 65  -4.4 {.      que
1170: 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 20 20 20  ryplan {.       
1180: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1190: 31 20 57 48 45 52 45 20 7a 20 49 4e 20 28 53 45  1 WHERE z IN (SE
11a0: 4c 45 43 54 20 31 30 32 30 37 20 55 4e 49 4f 4e  LECT 10207 UNION
11b0: 20 53 45 4c 45 43 54 20 31 30 30 30 36 29 0a 20   SELECT 10006). 
11c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d0: 20 20 20 20 20 20 20 20 41 4e 44 20 79 20 49 4e          AND y IN
11e0: 20 28 31 30 30 30 30 2c 31 30 32 30 31 29 0a 20   (10000,10201). 
11f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1200: 20 20 20 20 20 20 20 20 41 4e 44 20 78 3e 30 20          AND x>0 
1210: 41 4e 44 20 78 3c 31 30 0a 20 20 20 20 20 20 20  AND x<10.       
1220: 20 4f 52 44 45 52 20 42 59 20 77 0a 20 20 20 20   ORDER BY w.    
1230: 20 20 7d 0a 20 20 20 20 7d 20 7b 39 39 20 36 20    }.    } {99 6 
1240: 31 30 30 30 30 20 31 30 30 30 36 20 31 30 30 20  10000 10006 100 
1250: 36 20 31 30 32 30 31 20 31 30 32 30 37 20 73 6f  6 10201 10207 so
1260: 72 74 20 74 31 20 69 31 7a 79 78 7d 0a 20 20 20  rt t1 i1zyx}.   
1270: 20 64 6f 5f 74 65 73 74 20 77 68 65 72 65 32 2d   do_test where2-
1280: 34 2e 35 20 7b 0a 20 20 20 20 20 20 71 75 65 72  4.5 {.      quer
1290: 79 70 6c 61 6e 20 7b 0a 20 20 20 20 20 20 20 20  yplan {.        
12a0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
12b0: 20 57 48 45 52 45 20 7a 20 49 4e 20 28 53 45 4c   WHERE z IN (SEL
12c0: 45 43 54 20 31 30 32 30 37 20 55 4e 49 4f 4e 20  ECT 10207 UNION 
12d0: 53 45 4c 45 43 54 20 31 30 30 30 36 29 0a 20 20  SELECT 10006).  
12e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f0: 20 20 20 20 20 20 20 41 4e 44 20 79 20 49 4e 20         AND y IN 
1300: 28 53 45 4c 45 43 54 20 31 30 30 30 30 20 55 4e  (SELECT 10000 UN
1310: 49 4f 4e 20 53 45 4c 45 43 54 20 31 30 32 30 31  ION SELECT 10201
1320: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
1330: 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 78             AND x
1340: 3e 30 20 41 4e 44 20 78 3c 31 30 0a 20 20 20 20  >0 AND x<10.    
1350: 20 20 20 20 4f 52 44 45 52 20 42 59 20 77 0a 20      ORDER BY w. 
1360: 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 7b 39 39       }.    } {99
1370: 20 36 20 31 30 30 30 30 20 31 30 30 30 36 20 31   6 10000 10006 1
1380: 30 30 20 36 20 31 30 32 30 31 20 31 30 32 30 37  00 6 10201 10207
1390: 20 73 6f 72 74 20 74 31 20 69 31 7a 79 78 7d 0a   sort t1 i1zyx}.
13a0: 20 20 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 68    }.  do_test wh
13b0: 65 72 65 32 2d 34 2e 36 61 20 7b 0a 20 20 20 20  ere2-4.6a {.    
13c0: 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20  queryplan {.    
13d0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
13e0: 74 31 0a 20 20 20 20 20 20 20 57 48 45 52 45 20  t1.       WHERE 
13f0: 78 20 49 4e 20 28 31 2c 32 2c 33 2c 34 2c 35 2c  x IN (1,2,3,4,5,
1400: 36 2c 37 2c 38 29 0a 20 20 20 20 20 20 20 20 20  6,7,8).         
1410: 41 4e 44 20 79 20 49 4e 20 28 31 30 30 30 30 2c  AND y IN (10000,
1420: 31 30 30 30 31 2c 31 30 30 30 32 2c 31 30 30 30  10001,10002,1000
1430: 33 2c 31 30 30 30 34 2c 31 30 30 30 35 29 0a 20  3,10004,10005). 
1440: 20 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 78        ORDER BY x
1450: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 39 39 20 36  .    }.  } {99 6
1460: 20 31 30 30 30 30 20 31 30 30 30 36 20 6e 6f 73   10000 10006 nos
1470: 6f 72 74 20 74 31 20 69 31 78 79 7d 0a 20 20 64  ort t1 i1xy}.  d
1480: 6f 5f 74 65 73 74 20 77 68 65 72 65 32 2d 34 2e  o_test where2-4.
1490: 36 62 20 7b 0a 20 20 20 20 71 75 65 72 79 70 6c  6b {.    querypl
14a0: 61 6e 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43  an {.      SELEC
14b0: 54 20 2a 20 46 52 4f 4d 20 74 31 0a 20 20 20 20  T * FROM t1.    
14c0: 20 20 20 57 48 45 52 45 20 78 20 49 4e 20 28 31     WHERE x IN (1
14d0: 2c 32 2c 33 2c 34 2c 35 2c 36 2c 37 2c 38 29 0a  ,2,3,4,5,6,7,8).
14e0: 20 20 20 20 20 20 20 20 20 41 4e 44 20 79 20 49           AND y I
14f0: 4e 20 28 31 30 30 30 30 2c 31 30 30 30 31 2c 31  N (10000,10001,1
1500: 30 30 30 32 2c 31 30 30 30 33 2c 31 30 30 30 34  0002,10003,10004
1510: 2c 31 30 30 30 35 29 0a 20 20 20 20 20 20 20 4f  ,10005).       O
1520: 52 44 45 52 20 42 59 20 78 20 44 45 53 43 0a 20  RDER BY x DESC. 
1530: 20 20 20 7d 0a 20 20 7d 20 7b 39 39 20 36 20 31     }.  } {99 6 1
1540: 30 30 30 30 20 31 30 30 30 36 20 6e 6f 73 6f 72  0000 10006 nosor
1550: 74 20 74 31 20 69 31 78 79 7d 0a 20 20 64 6f 5f  t t1 i1xy}.  do_
1560: 74 65 73 74 20 77 68 65 72 65 32 2d 34 2e 36 63  test where2-4.6c
1570: 20 7b 0a 20 20 20 20 71 75 65 72 79 70 6c 61 6e   {.    queryplan
1580: 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20   {.      SELECT 
1590: 2a 20 46 52 4f 4d 20 74 31 0a 20 20 20 20 20 20  * FROM t1.      
15a0: 20 57 48 45 52 45 20 78 20 49 4e 20 28 31 2c 32   WHERE x IN (1,2
15b0: 2c 33 2c 34 2c 35 2c 36 2c 37 2c 38 29 0a 20 20  ,3,4,5,6,7,8).  
15c0: 20 20 20 20 20 20 20 41 4e 44 20 79 20 49 4e 20         AND y IN 
15d0: 28 31 30 30 30 30 2c 31 30 30 30 31 2c 31 30 30  (10000,10001,100
15e0: 30 32 2c 31 30 30 30 33 2c 31 30 30 30 34 2c 31  02,10003,10004,1
15f0: 30 30 30 35 29 0a 20 20 20 20 20 20 20 4f 52 44  0005).       ORD
1600: 45 52 20 42 59 20 78 2c 20 79 0a 20 20 20 20 7d  ER BY x, y.    }
1610: 0a 20 20 7d 20 7b 39 39 20 36 20 31 30 30 30 30  .  } {99 6 10000
1620: 20 31 30 30 30 36 20 6e 6f 73 6f 72 74 20 74 31   10006 nosort t1
1630: 20 69 31 78 79 7d 0a 20 20 64 6f 5f 74 65 73 74   i1xy}.  do_test
1640: 20 77 68 65 72 65 32 2d 34 2e 36 64 20 7b 0a 20   where2-4.6d {. 
1650: 20 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20     queryplan {. 
1660: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
1670: 4f 4d 20 74 31 0a 20 20 20 20 20 20 20 57 48 45  OM t1.       WHE
1680: 52 45 20 78 20 49 4e 20 28 31 2c 32 2c 33 2c 34  RE x IN (1,2,3,4
1690: 2c 35 2c 36 2c 37 2c 38 29 0a 20 20 20 20 20 20  ,5,6,7,8).      
16a0: 20 20 20 41 4e 44 20 79 20 49 4e 20 28 31 30 30     AND y IN (100
16b0: 30 30 2c 31 30 30 30 31 2c 31 30 30 30 32 2c 31  00,10001,10002,1
16c0: 30 30 30 33 2c 31 30 30 30 34 2c 31 30 30 30 35  0003,10004,10005
16d0: 29 0a 20 20 20 20 20 20 20 4f 52 44 45 52 20 42  ).       ORDER B
16e0: 59 20 78 2c 20 79 20 44 45 53 43 0a 20 20 20 20  Y x, y DESC.    
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 78 79 7d 0a 0a 20 20 23 20 44 75 70 6c 69  i1xy}..  # Dupli
1720: 63 61 74 65 20 65 6e 74 69 72 65 73 20 6f 6e 20  cate entires on 
1730: 74 68 65 20 52 48 53 20 6f 66 20 61 6e 20 49 4e  the RHS of an IN
1740: 20 6f 70 65 72 61 74 6f 72 20 64 6f 20 6e 6f 74   operator do not
1750: 20 63 61 75 73 65 20 64 75 70 6c 69 63 61 74 65   cause duplicate
1760: 0a 20 20 23 20 6f 75 74 70 75 74 20 72 6f 77 73  .  # output rows
1770: 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20  ..  #.  do_test 
1780: 77 68 65 72 65 32 2d 34 2e 36 78 20 7b 0a 20 20  where2-4.6x {.  
1790: 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20    queryplan {.  
17a0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
17b0: 4d 20 74 31 20 57 48 45 52 45 20 7a 20 49 4e 20  M t1 WHERE z IN 
17c0: 28 31 30 32 30 37 2c 31 30 30 30 36 2c 31 30 30  (10207,10006,100
17d0: 30 36 2c 31 30 32 30 37 29 0a 20 20 20 20 20 20  06,10207).      
17e0: 4f 52 44 45 52 20 42 59 20 77 0a 20 20 20 20 7d  ORDER BY w.    }
17f0: 0a 20 20 7d 20 7b 39 39 20 36 20 31 30 30 30 30  .  } {99 6 10000
1800: 20 31 30 30 30 36 20 31 30 30 20 36 20 31 30 32   10006 100 6 102
1810: 30 31 20 31 30 32 30 37 20 73 6f 72 74 20 74 31  01 10207 sort t1
1820: 20 69 31 7a 79 78 7d 0a 20 20 64 6f 5f 74 65 73   i1zyx}.  do_tes
1830: 74 20 77 68 65 72 65 32 2d 34 2e 36 79 20 7b 0a  t where2-4.6y {.
1840: 20 20 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a      queryplan {.
1850: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
1860: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 20 49  ROM t1 WHERE z I
1870: 4e 20 28 31 30 32 30 37 2c 31 30 30 30 36 2c 31  N (10207,10006,1
1880: 30 30 30 36 2c 31 30 32 30 37 29 0a 20 20 20 20  0006,10207).    
1890: 20 20 4f 52 44 45 52 20 42 59 20 77 20 44 45 53    ORDER BY w DES
18a0: 43 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 30 30  C.    }.  } {100
18b0: 20 36 20 31 30 32 30 31 20 31 30 32 30 37 20 39   6 10201 10207 9
18c0: 39 20 36 20 31 30 30 30 30 20 31 30 30 30 36 20  9 6 10000 10006 
18d0: 73 6f 72 74 20 74 31 20 69 31 7a 79 78 7d 0a 20  sort t1 i1zyx}. 
18e0: 20 69 66 63 61 70 61 62 6c 65 20 63 6f 6d 70 6f   ifcapable compo
18f0: 75 6e 64 20 7b 0a 20 20 20 20 64 6f 5f 74 65 73  und {.    do_tes
1900: 74 20 77 68 65 72 65 32 2d 34 2e 37 20 7b 0a 20  t where2-4.7 {. 
1910: 20 20 20 20 20 71 75 65 72 79 70 6c 61 6e 20 7b       queryplan {
1920: 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  .        SELECT 
1930: 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
1940: 7a 20 49 4e 20 28 0a 20 20 20 20 20 20 20 20 20  z IN (.         
1950: 20 20 53 45 4c 45 43 54 20 31 30 32 30 37 20 55    SELECT 10207 U
1960: 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20  NION ALL SELECT 
1970: 31 30 30 30 36 0a 20 20 20 20 20 20 20 20 20 20  10006.          
1980: 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43   UNION ALL SELEC
1990: 54 20 31 30 30 30 36 20 55 4e 49 4f 4e 20 41 4c  T 10006 UNION AL
19a0: 4c 20 53 45 4c 45 43 54 20 31 30 32 30 37 29 0a  L SELECT 10207).
19b0: 20 20 20 20 20 20 20 20 4f 52 44 45 52 20 42 59          ORDER BY
19c0: 20 77 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   w.      }.    }
19d0: 20 7b 39 39 20 36 20 31 30 30 30 30 20 31 30 30   {99 6 10000 100
19e0: 30 36 20 31 30 30 20 36 20 31 30 32 30 31 20 31  06 100 6 10201 1
19f0: 30 32 30 37 20 73 6f 72 74 20 74 31 20 69 31 7a  0207 sort t1 i1z
1a00: 79 78 7d 0a 20 20 7d 0a 0a 7d 20 3b 23 20 69 66  yx}.  }..} ;# if
1a10: 63 61 70 61 62 6c 65 20 73 75 62 71 75 65 72 79  capable subquery
1a20: 0a 0a 23 20 54 68 65 20 75 73 65 20 6f 66 20 61  ..# The use of a
1a30: 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 64 69  n IN operator di
1a40: 73 61 62 6c 65 73 20 74 68 65 20 69 6e 64 65 78  sables the index
1a50: 20 61 73 20 61 20 73 6f 72 74 65 72 2e 0a 23 0a   as a sorter..#.
1a60: 64 6f 5f 74 65 73 74 20 77 68 65 72 65 32 2d 35  do_test where2-5
1a70: 2e 31 20 7b 0a 20 20 71 75 65 72 79 70 6c 61 6e  .1 {.  queryplan
1a80: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   {.    SELECT * 
1a90: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 77 3d  FROM t1 WHERE w=
1aa0: 39 39 20 4f 52 44 45 52 20 42 59 20 77 0a 20 20  99 ORDER BY w.  
1ab0: 7d 0a 7d 20 7b 39 39 20 36 20 31 30 30 30 30 20  }.} {99 6 10000 
1ac0: 31 30 30 30 36 20 6e 6f 73 6f 72 74 20 74 31 20  10006 nosort t1 
1ad0: 69 31 77 7d 0a 0a 69 66 63 61 70 61 62 6c 65 20  i1w}..ifcapable 
1ae0: 73 75 62 71 75 65 72 79 20 7b 0a 20 20 64 6f 5f  subquery {.  do_
1af0: 74 65 73 74 20 77 68 65 72 65 32 2d 35 2e 32 61  test where2-5.2a
1b00: 20 7b 0a 20 20 20 20 71 75 65 72 79 70 6c 61 6e   {.    queryplan
1b10: 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20   {.      SELECT 
1b20: 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
1b30: 77 20 49 4e 20 28 39 39 29 20 4f 52 44 45 52 20  w IN (99) ORDER 
1b40: 42 59 20 77 0a 20 20 20 20 7d 0a 20 20 7d 20 7b  BY w.    }.  } {
1b50: 39 39 20 36 20 31 30 30 30 30 20 31 30 30 30 36  99 6 10000 10006
1b60: 20 6e 6f 73 6f 72 74 20 74 31 20 69 31 77 7d 0a   nosort t1 i1w}.
1b70: 20 20 64 6f 5f 74 65 73 74 20 77 68 65 72 65 32    do_test where2
1b80: 2d 35 2e 32 62 20 7b 0a 20 20 20 20 71 75 65 72  -5.2b {.    quer
1b90: 79 70 6c 61 6e 20 7b 0a 20 20 20 20 20 20 53 45  yplan {.      SE
1ba0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
1bb0: 48 45 52 45 20 77 20 49 4e 20 28 39 39 29 20 4f  HERE w IN (99) O
1bc0: 52 44 45 52 20 42 59 20 77 20 44 45 53 43 0a 20  RDER BY w DESC. 
1bd0: 20 20 20 7d 0a 20 20 7d 20 7b 39 39 20 36 20 31     }.  } {99 6 1
1be0: 30 30 30 30 20 31 30 30 30 36 20 6e 6f 73 6f 72  0000 10006 nosor
1bf0: 74 20 74 31 20 69 31 77 7d 0a 7d 0a 0a 23 20 56  t t1 i1w}.}..# V
1c00: 65 72 69 66 79 20 74 68 61 74 20 4f 52 20 63 6c  erify that OR cl
1c10: 61 75 73 65 73 20 67 65 74 20 74 72 61 6e 73 6c  auses get transl
1c20: 61 74 65 64 20 69 6e 74 6f 20 49 4e 20 6f 70 65  ated into IN ope
1c30: 72 61 74 6f 72 73 2e 0a 23 0a 73 65 74 20 3a 3a  rators..#.set ::
1c40: 69 64 78 20 7b 7d 0a 69 66 63 61 70 61 62 6c 65  idx {}.ifcapable
1c50: 20 73 75 62 71 75 65 72 79 20 7b 73 65 74 20 3a   subquery {set :
1c60: 3a 69 64 78 20 69 31 77 7d 0a 64 6f 5f 74 65 73  :idx i1w}.do_tes
1c70: 74 20 77 68 65 72 65 32 2d 36 2e 31 2e 31 20 7b  t where2-6.1.1 {
1c80: 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20  .  queryplan {. 
1c90: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
1ca0: 20 74 31 20 57 48 45 52 45 20 77 3d 39 39 20 4f   t1 WHERE w=99 O
1cb0: 52 20 77 3d 31 30 30 20 4f 52 44 45 52 20 42 59  R w=100 ORDER BY
1cc0: 20 2b 77 0a 20 20 7d 0a 7d 20 5b 6c 69 73 74 20   +w.  }.} [list 
1cd0: 39 39 20 36 20 31 30 30 30 30 20 31 30 30 30 36  99 6 10000 10006
1ce0: 20 31 30 30 20 36 20 31 30 32 30 31 20 31 30 32   100 6 10201 102
1cf0: 30 37 20 73 6f 72 74 20 74 31 20 24 3a 3a 69 64  07 sort t1 $::id
1d00: 78 5d 0a 64 6f 5f 74 65 73 74 20 77 68 65 72 65  x].do_test where
1d10: 32 2d 36 2e 31 2e 32 20 7b 0a 20 20 71 75 65 72  2-6.1.2 {.  quer
1d20: 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45  yplan {.    SELE
1d30: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
1d40: 52 45 20 39 39 3d 77 20 4f 52 20 31 30 30 3d 77  RE 99=w OR 100=w
1d50: 20 4f 52 44 45 52 20 42 59 20 2b 77 0a 20 20 7d   ORDER BY +w.  }
1d60: 0a 7d 20 5b 6c 69 73 74 20 39 39 20 36 20 31 30  .} [list 99 6 10
1d70: 30 30 30 20 31 30 30 30 36 20 31 30 30 20 36 20  000 10006 100 6 
1d80: 31 30 32 30 31 20 31 30 32 30 37 20 73 6f 72 74  10201 10207 sort
1d90: 20 74 31 20 24 3a 3a 69 64 78 5d 0a 64 6f 5f 74   t1 $::idx].do_t
1da0: 65 73 74 20 77 68 65 72 65 32 2d 36 2e 32 20 7b  est where2-6.2 {
1db0: 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20  .  queryplan {. 
1dc0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
1dd0: 20 74 31 20 57 48 45 52 45 20 77 3d 39 39 20 4f   t1 WHERE w=99 O
1de0: 52 20 77 3d 31 30 30 20 4f 52 20 36 3d 77 20 4f  R w=100 OR 6=w O
1df0: 52 44 45 52 20 42 59 20 2b 77 0a 20 20 7d 0a 7d  RDER BY +w.  }.}
1e00: 20 5b 6c 69 73 74 20 36 20 32 20 34 39 20 35 31   [list 6 2 49 51
1e10: 20 39 39 20 36 20 31 30 30 30 30 20 31 30 30 30   99 6 10000 1000
1e20: 36 20 31 30 30 20 36 20 31 30 32 30 31 20 31 30  6 100 6 10201 10
1e30: 32 30 37 20 73 6f 72 74 20 74 31 20 24 3a 3a 69  207 sort t1 $::i
1e40: 64 78 5d 0a 0a 64 6f 5f 74 65 73 74 20 77 68 65  dx]..do_test whe
1e50: 72 65 32 2d 36 2e 33 20 7b 0a 20 20 71 75 65 72  re2-6.3 {.  quer
1e60: 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45  yplan {.    SELE
1e70: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
1e80: 52 45 20 77 3d 39 39 20 4f 52 20 77 3d 31 30 30  RE w=99 OR w=100
1e90: 20 4f 52 20 36 3d 2b 77 20 4f 52 44 45 52 20 42   OR 6=+w ORDER B
1ea0: 59 20 2b 77 0a 20 20 7d 0a 7d 20 7b 36 20 32 20  Y +w.  }.} {6 2 
1eb0: 34 39 20 35 31 20 39 39 20 36 20 31 30 30 30 30  49 51 99 6 10000
1ec0: 20 31 30 30 30 36 20 31 30 30 20 36 20 31 30 32   10006 100 6 102
1ed0: 30 31 20 31 30 32 30 37 20 73 6f 72 74 20 74 31  01 10207 sort t1
1ee0: 20 2a 7d 0a 64 6f 5f 74 65 73 74 20 77 68 65 72   *}.do_test wher
1ef0: 65 32 2d 36 2e 34 20 7b 0a 20 20 71 75 65 72 79  e2-6.4 {.  query
1f00: 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43  plan {.    SELEC
1f10: 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
1f20: 45 20 77 3d 39 39 20 4f 52 20 2b 77 3d 31 30 30  E w=99 OR +w=100
1f30: 20 4f 52 20 36 3d 77 20 4f 52 44 45 52 20 42 59   OR 6=w ORDER BY
1f40: 20 2b 77 0a 20 20 7d 0a 7d 20 7b 36 20 32 20 34   +w.  }.} {6 2 4
1f50: 39 20 35 31 20 39 39 20 36 20 31 30 30 30 30 20  9 51 99 6 10000 
1f60: 31 30 30 30 36 20 31 30 30 20 36 20 31 30 32 30  10006 100 6 1020
1f70: 31 20 31 30 32 30 37 20 73 6f 72 74 20 74 31 20  1 10207 sort t1 
1f80: 2a 7d 0a 0a 73 65 74 20 3a 3a 69 64 78 20 7b 7d  *}..set ::idx {}
1f90: 0a 69 66 63 61 70 61 62 6c 65 20 73 75 62 71 75  .ifcapable subqu
1fa0: 65 72 79 20 7b 73 65 74 20 3a 3a 69 64 78 20 69  ery {set ::idx i
1fb0: 31 7a 79 78 7d 0a 64 6f 5f 74 65 73 74 20 77 68  1zyx}.do_test wh
1fc0: 65 72 65 32 2d 36 2e 35 20 7b 0a 20 20 71 75 65  ere2-6.5 {.  que
1fd0: 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c  ryplan {.    SEL
1fe0: 45 43 54 20 62 2e 2a 20 46 52 4f 4d 20 74 31 20  ECT b.* FROM t1 
1ff0: 61 2c 20 74 31 20 62 0a 20 20 20 20 20 57 48 45  a, t1 b.     WHE
2000: 52 45 20 61 2e 77 3d 31 20 41 4e 44 20 28 61 2e  RE a.w=1 AND (a.
2010: 79 3d 62 2e 7a 20 4f 52 20 62 2e 7a 3d 31 30 29  y=b.z OR b.z=10)
2020: 0a 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 2b  .     ORDER BY +
2030: 62 2e 77 0a 20 20 7d 0a 7d 20 5b 6c 69 73 74 20  b.w.  }.} [list 
2040: 31 20 30 20 34 20 34 20 32 20 31 20 39 20 31 30  1 0 4 4 2 1 9 10
2050: 20 73 6f 72 74 20 61 20 69 31 77 20 62 20 24 3a   sort a i1w b $:
2060: 3a 69 64 78 5d 0a 64 6f 5f 74 65 73 74 20 77 68  :idx].do_test wh
2070: 65 72 65 32 2d 36 2e 36 20 7b 0a 20 20 71 75 65  ere2-6.6 {.  que
2080: 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c  ryplan {.    SEL
2090: 45 43 54 20 62 2e 2a 20 46 52 4f 4d 20 74 31 20  ECT b.* FROM t1 
20a0: 61 2c 20 74 31 20 62 0a 20 20 20 20 20 57 48 45  a, t1 b.     WHE
20b0: 52 45 20 61 2e 77 3d 31 20 41 4e 44 20 28 62 2e  RE a.w=1 AND (b.
20c0: 7a 3d 31 30 20 4f 52 20 61 2e 79 3d 62 2e 7a 20  z=10 OR a.y=b.z 
20d0: 4f 52 20 62 2e 7a 3d 31 30 29 0a 20 20 20 20 20  OR b.z=10).     
20e0: 4f 52 44 45 52 20 42 59 20 2b 62 2e 77 0a 20 20  ORDER BY +b.w.  
20f0: 7d 0a 7d 20 5b 6c 69 73 74 20 31 20 30 20 34 20  }.} [list 1 0 4 
2100: 34 20 32 20 31 20 39 20 31 30 20 73 6f 72 74 20  4 2 1 9 10 sort 
2110: 61 20 69 31 77 20 62 20 24 3a 3a 69 64 78 5d 0a  a i1w b $::idx].
2120: 0a 69 66 20 7b 5b 70 65 72 6d 75 74 61 74 69 6f  .if {[permutatio
2130: 6e 5d 20 21 3d 20 22 6e 6f 5f 6f 70 74 69 6d 69  n] != "no_optimi
2140: 7a 61 74 69 6f 6e 22 7d 20 7b 0a 0a 23 20 54 69  zation"} {..# Ti
2150: 63 6b 65 74 20 23 32 32 34 39 2e 20 20 4d 61 6b  cket #2249.  Mak
2160: 65 20 73 75 72 65 20 74 68 65 20 4f 52 20 6f 70  e sure the OR op
2170: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 6e 6f  timization is no
2180: 74 20 61 74 74 65 6d 70 74 65 64 20 69 66 0a 23  t attempted if.#
2190: 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 62 65 74   comparisons bet
21a0: 77 65 65 6e 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  ween columns of 
21b0: 64 69 66 66 65 72 65 6e 74 20 61 66 66 69 6e 69  different affini
21c0: 74 69 65 73 20 61 72 65 20 6e 65 65 64 65 64 2e  ties are needed.
21d0: 0a 23 0a 64 6f 5f 74 65 73 74 20 77 68 65 72 65  .#.do_test where
21e0: 32 2d 36 2e 37 20 7b 0a 20 20 65 78 65 63 73 71  2-6.7 {.  execsq
21f0: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
2200: 41 42 4c 45 20 74 32 32 34 39 61 28 61 20 54 45  ABLE t2249a(a TE
2210: 58 54 20 55 4e 49 51 55 45 2c 20 78 20 43 48 41  XT UNIQUE, x CHA
2220: 52 28 31 30 30 29 29 3b 0a 20 20 20 20 43 52 45  R(100));.    CRE
2230: 41 54 45 20 54 41 42 4c 45 20 74 32 32 34 39 62  ATE TABLE t2249b
2240: 28 62 20 49 4e 54 45 47 45 52 29 3b 0a 20 20 20  (b INTEGER);.   
2250: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 32   INSERT INTO t22
2260: 34 39 61 28 61 29 20 56 41 4c 55 45 53 28 27 30  49a(a) VALUES('0
2270: 31 32 33 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  123');.    INSER
2280: 54 20 49 4e 54 4f 20 74 32 32 34 39 62 20 56 41  T INTO t2249b VA
2290: 4c 55 45 53 28 31 32 33 29 3b 0a 20 20 7d 0a 20  LUES(123);.  }. 
22a0: 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20   queryplan {.   
22b0: 20 2d 2d 20 42 65 63 61 75 73 65 20 61 20 69 73   -- Because a is
22c0: 20 74 79 70 65 20 54 45 58 54 20 61 6e 64 20 62   type TEXT and b
22d0: 20 69 73 20 74 79 70 65 20 49 4e 54 45 47 45 52   is type INTEGER
22e0: 2c 20 62 6f 74 68 20 61 20 61 6e 64 20 62 0a 20  , both a and b. 
22f0: 20 20 20 2d 2d 20 77 69 6c 6c 20 61 74 74 65 6d     -- will attem
2300: 70 74 20 74 6f 20 63 6f 6e 76 65 72 74 20 74 6f  pt to convert to
2310: 20 4e 55 4d 45 52 49 43 20 62 65 66 6f 72 65 20   NUMERIC before 
2320: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a  the comparison..
2330: 20 20 20 20 2d 2d 20 54 68 65 79 20 77 69 6c 6c      -- They will
2340: 20 74 68 75 73 20 63 6f 6d 70 61 72 65 20 65 71   thus compare eq
2350: 75 61 6c 2e 0a 20 20 20 20 2d 2d 0a 20 20 20 20  ual..    --.    
2360: 53 45 4c 45 43 54 20 62 2c 61 20 46 52 4f 4d 20  SELECT b,a FROM 
2370: 74 32 32 34 39 62 20 43 52 4f 53 53 20 4a 4f 49  t2249b CROSS JOI
2380: 4e 20 74 32 32 34 39 61 20 57 48 45 52 45 20 61  N t2249a WHERE a
2390: 3d 62 3b 0a 20 20 7d 0a 7d 20 7b 31 32 33 20 30  =b;.  }.} {123 0
23a0: 31 32 33 20 6e 6f 73 6f 72 74 20 74 32 32 34 39  123 nosort t2249
23b0: 62 20 2a 20 74 32 32 34 39 61 20 73 71 6c 69 74  b * t2249a sqlit
23c0: 65 5f 61 75 74 6f 69 6e 64 65 78 5f 74 32 32 34  e_autoindex_t224
23d0: 39 61 5f 31 7d 0a 64 6f 5f 74 65 73 74 20 77 68  9a_1}.do_test wh
23e0: 65 72 65 32 2d 36 2e 39 20 7b 0a 20 20 71 75 65  ere2-6.9 {.  que
23f0: 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 2d 2d 20  ryplan {.    -- 
2400: 54 68 65 20 2b 20 6f 70 65 72 61 74 6f 72 20 72  The + operator r
2410: 65 6d 6f 76 65 73 20 61 66 66 69 6e 69 74 79 20  emoves affinity 
2420: 66 72 6f 6d 20 74 68 65 20 72 68 73 2e 20 20 4e  from the rhs.  N
2430: 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20 20  o conversions.  
2440: 20 20 2d 2d 20 6f 63 63 75 72 20 61 6e 64 20 74    -- occur and t
2450: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  he comparison is
2460: 20 66 61 6c 73 65 2e 20 20 54 68 65 20 72 65 73   false.  The res
2470: 75 6c 74 20 69 73 20 61 6e 20 65 6d 70 74 79 20  ult is an empty 
2480: 73 65 74 2e 0a 20 20 20 20 2d 2d 0a 20 20 20 20  set..    --.    
2490: 53 45 4c 45 43 54 20 62 2c 61 20 46 52 4f 4d 20  SELECT b,a FROM 
24a0: 74 32 32 34 39 62 20 43 52 4f 53 53 20 4a 4f 49  t2249b CROSS JOI
24b0: 4e 20 74 32 32 34 39 61 20 57 48 45 52 45 20 61  N t2249a WHERE a
24c0: 3d 2b 62 3b 0a 20 20 7d 0a 7d 20 7b 6e 6f 73 6f  =+b;.  }.} {noso
24d0: 72 74 20 74 32 32 34 39 62 20 2a 20 74 32 32 34  rt t2249b * t224
24e0: 39 61 20 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e  9a sqlite_autoin
24f0: 64 65 78 5f 74 32 32 34 39 61 5f 31 7d 0a 64 6f  dex_t2249a_1}.do
2500: 5f 74 65 73 74 20 77 68 65 72 65 32 2d 36 2e 39  _test where2-6.9
2510: 2e 32 20 7b 0a 20 20 23 20 54 68 65 20 73 61 6d  .2 {.  # The sam
2520: 65 20 74 68 69 6e 67 20 62 75 74 20 77 69 74 68  e thing but with
2530: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
2540: 66 6c 69 70 70 65 64 20 61 72 6f 75 6e 64 2e 0a  flipped around..
2550: 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20    queryplan {.  
2560: 20 20 53 45 4c 45 43 54 20 62 2c 61 20 46 52 4f    SELECT b,a FRO
2570: 4d 20 74 32 32 34 39 62 20 43 52 4f 53 53 20 4a  M t2249b CROSS J
2580: 4f 49 4e 20 74 32 32 34 39 61 20 57 48 45 52 45  OIN t2249a WHERE
2590: 20 2b 62 3d 61 0a 20 20 7d 0a 7d 20 7b 6e 6f 73   +b=a.  }.} {nos
25a0: 6f 72 74 20 74 32 32 34 39 62 20 2a 20 74 32 32  ort t2249b * t22
25b0: 34 39 61 20 73 71 6c 69 74 65 5f 61 75 74 6f 69  49a sqlite_autoi
25c0: 6e 64 65 78 5f 74 32 32 34 39 61 5f 31 7d 0a 64  ndex_t2249a_1}.d
25d0: 6f 5f 74 65 73 74 20 77 68 65 72 65 32 2d 36 2e  o_test where2-6.
25e0: 31 30 20 7b 0a 20 20 71 75 65 72 79 70 6c 61 6e  10 {.  queryplan
25f0: 20 7b 0a 20 20 20 20 2d 2d 20 55 73 65 20 2b 20   {.    -- Use + 
2600: 6f 6e 20 62 6f 74 68 20 73 69 64 65 73 20 6f 66  on both sides of
2610: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
2620: 74 6f 20 64 69 73 61 62 6c 65 20 69 6e 64 69 63  to disable indic
2630: 65 73 0a 20 20 20 20 2d 2d 20 63 6f 6d 70 6c 65  es.    -- comple
2640: 74 65 6c 79 2e 20 20 4d 61 6b 65 20 73 75 72 65  tely.  Make sure
2650: 20 77 65 20 67 65 74 20 74 68 65 20 73 61 6d 65   we get the same
2660: 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 2d 2d 0a   result..    --.
2670: 20 20 20 20 53 45 4c 45 43 54 20 62 2c 61 20 46      SELECT b,a F
2680: 52 4f 4d 20 74 32 32 34 39 62 20 43 52 4f 53 53  ROM t2249b CROSS
2690: 20 4a 4f 49 4e 20 74 32 32 34 39 61 20 57 48 45   JOIN t2249a WHE
26a0: 52 45 20 2b 61 3d 2b 62 3b 0a 20 20 7d 0a 7d 20  RE +a=+b;.  }.} 
26b0: 7b 6e 6f 73 6f 72 74 20 74 32 32 34 39 62 20 2a  {nosort t2249b *
26c0: 20 74 32 32 34 39 61 20 73 71 6c 69 74 65 5f 61   t2249a sqlite_a
26d0: 75 74 6f 69 6e 64 65 78 5f 74 32 32 34 39 61 5f  utoindex_t2249a_
26e0: 31 7d 0a 64 6f 5f 74 65 73 74 20 77 68 65 72 65  1}.do_test where
26f0: 32 2d 36 2e 31 31 20 7b 0a 20 20 23 20 54 68 69  2-6.11 {.  # Thi
2700: 73 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d  s will not attem
2710: 70 74 20 74 68 65 20 4f 52 20 6f 70 74 69 6d 69  pt the OR optimi
2720: 7a 61 74 69 6f 6e 20 62 65 63 61 75 73 65 20 6f  zation because o
2730: 66 20 74 68 65 20 61 3d 62 0a 20 20 23 20 63 6f  f the a=b.  # co
2740: 6d 70 61 72 69 73 6f 6e 2e 0a 20 20 71 75 65 72  mparison..  quer
2750: 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45  yplan {.    SELE
2760: 43 54 20 62 2c 61 20 46 52 4f 4d 20 74 32 32 34  CT b,a FROM t224
2770: 39 62 20 43 52 4f 53 53 20 4a 4f 49 4e 20 74 32  9b CROSS JOIN t2
2780: 32 34 39 61 20 57 48 45 52 45 20 61 3d 62 20 4f  249a WHERE a=b O
2790: 52 20 61 3d 27 68 65 6c 6c 6f 27 3b 0a 20 20 7d  R a='hello';.  }
27a0: 0a 7d 20 7b 31 32 33 20 30 31 32 33 20 6e 6f 73  .} {123 0123 nos
27b0: 6f 72 74 20 74 32 32 34 39 62 20 2a 20 74 32 32  ort t2249b * t22
27c0: 34 39 61 20 73 71 6c 69 74 65 5f 61 75 74 6f 69  49a sqlite_autoi
27d0: 6e 64 65 78 5f 74 32 32 34 39 61 5f 31 7d 0a 64  ndex_t2249a_1}.d
27e0: 6f 5f 74 65 73 74 20 77 68 65 72 65 32 2d 36 2e  o_test where2-6.
27f0: 31 31 2e 32 20 7b 0a 20 20 23 20 50 65 72 6d 75  11.2 {.  # Permu
2800: 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 65  tations of the e
2810: 78 70 72 65 73 73 69 6f 6e 20 74 65 72 6d 73 2e  xpression terms.
2820: 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20  .  queryplan {. 
2830: 20 20 20 53 45 4c 45 43 54 20 62 2c 61 20 46 52     SELECT b,a FR
2840: 4f 4d 20 74 32 32 34 39 62 20 43 52 4f 53 53 20  OM t2249b CROSS 
2850: 4a 4f 49 4e 20 74 32 32 34 39 61 20 57 48 45 52  JOIN t2249a WHER
2860: 45 20 62 3d 61 20 4f 52 20 61 3d 27 68 65 6c 6c  E b=a OR a='hell
2870: 6f 27 3b 0a 20 20 7d 0a 7d 20 7b 31 32 33 20 30  o';.  }.} {123 0
2880: 31 32 33 20 6e 6f 73 6f 72 74 20 74 32 32 34 39  123 nosort t2249
2890: 62 20 2a 20 74 32 32 34 39 61 20 73 71 6c 69 74  b * t2249a sqlit
28a0: 65 5f 61 75 74 6f 69 6e 64 65 78 5f 74 32 32 34  e_autoindex_t224
28b0: 39 61 5f 31 7d 0a 64 6f 5f 74 65 73 74 20 77 68  9a_1}.do_test wh
28c0: 65 72 65 32 2d 36 2e 31 31 2e 33 20 7b 0a 20 20  ere2-6.11.3 {.  
28d0: 23 20 50 65 72 6d 75 74 61 74 69 6f 6e 73 20 6f  # Permutations o
28e0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
28f0: 20 74 65 72 6d 73 2e 0a 20 20 71 75 65 72 79 70   terms..  queryp
2900: 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  lan {.    SELECT
2910: 20 62 2c 61 20 46 52 4f 4d 20 74 32 32 34 39 62   b,a FROM t2249b
2920: 20 43 52 4f 53 53 20 4a 4f 49 4e 20 74 32 32 34   CROSS JOIN t224
2930: 39 61 20 57 48 45 52 45 20 27 68 65 6c 6c 6f 27  9a WHERE 'hello'
2940: 3d 61 20 4f 52 20 62 3d 61 3b 0a 20 20 7d 0a 7d  =a OR b=a;.  }.}
2950: 20 7b 31 32 33 20 30 31 32 33 20 6e 6f 73 6f 72   {123 0123 nosor
2960: 74 20 74 32 32 34 39 62 20 2a 20 74 32 32 34 39  t t2249b * t2249
2970: 61 20 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64  a sqlite_autoind
2980: 65 78 5f 74 32 32 34 39 61 5f 31 7d 0a 64 6f 5f  ex_t2249a_1}.do_
2990: 74 65 73 74 20 77 68 65 72 65 32 2d 36 2e 31 31  test where2-6.11
29a0: 2e 34 20 7b 0a 20 20 23 20 50 65 72 6d 75 74 61  .4 {.  # Permuta
29b0: 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70  tions of the exp
29c0: 72 65 73 73 69 6f 6e 20 74 65 72 6d 73 2e 0a 20  ression terms.. 
29d0: 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20   queryplan {.   
29e0: 20 53 45 4c 45 43 54 20 62 2c 61 20 46 52 4f 4d   SELECT b,a FROM
29f0: 20 74 32 32 34 39 62 20 43 52 4f 53 53 20 4a 4f   t2249b CROSS JO
2a00: 49 4e 20 74 32 32 34 39 61 20 57 48 45 52 45 20  IN t2249a WHERE 
2a10: 61 3d 27 68 65 6c 6c 6f 27 20 4f 52 20 62 3d 61  a='hello' OR b=a
2a20: 3b 0a 20 20 7d 0a 7d 20 7b 31 32 33 20 30 31 32  ;.  }.} {123 012
2a30: 33 20 6e 6f 73 6f 72 74 20 74 32 32 34 39 62 20  3 nosort t2249b 
2a40: 2a 20 74 32 32 34 39 61 20 73 71 6c 69 74 65 5f  * t2249a sqlite_
2a50: 61 75 74 6f 69 6e 64 65 78 5f 74 32 32 34 39 61  autoindex_t2249a
2a60: 5f 31 7d 0a 69 66 63 61 70 61 62 6c 65 20 65 78  _1}.ifcapable ex
2a70: 70 6c 61 69 6e 26 26 73 75 62 71 75 65 72 79 20  plain&&subquery 
2a80: 7b 0a 20 20 23 20 54 68 65 73 65 20 74 65 73 74  {.  # These test
2a90: 73 20 61 72 65 20 6e 6f 74 20 72 75 6e 20 69 66  s are not run if
2aa0: 20 73 75 62 71 75 65 72 79 20 73 75 70 70 6f 72   subquery suppor
2ab0: 74 20 69 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65  t is not include
2ac0: 64 20 69 6e 20 74 68 65 0a 20 20 23 20 62 75 69  d in the.  # bui
2ad0: 6c 64 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  ld. This is beca
2ae0: 75 73 65 20 74 68 65 73 65 20 74 65 73 74 73 20  use these tests 
2af0: 74 65 73 74 20 74 68 65 20 22 61 20 3d 20 31 20  test the "a = 1 
2b00: 4f 52 20 61 20 3d 20 32 22 20 74 6f 0a 20 20 23  OR a = 2" to.  #
2b10: 20 22 61 20 49 4e 20 28 31 2c 20 32 29 22 20 6f   "a IN (1, 2)" o
2b20: 70 74 69 6d 69 73 61 74 69 6f 6e 20 74 72 61 6e  ptimisation tran
2b30: 73 66 6f 72 6d 61 74 69 6f 6e 2c 20 77 68 69 63  sformation, whic
2b40: 68 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64  h is not enabled
2b50: 20 69 66 0a 20 20 23 20 73 75 62 71 75 65 72 69   if.  # subqueri
2b60: 65 73 20 61 6e 64 20 74 68 65 20 49 4e 20 6f 70  es and the IN op
2b70: 65 72 61 74 6f 72 20 69 73 20 6e 6f 74 20 61 76  erator is not av
2b80: 61 69 6c 61 62 6c 65 2e 0a 20 20 23 0a 20 20 64  ailable..  #.  d
2b90: 6f 5f 74 65 73 74 20 77 68 65 72 65 32 2d 36 2e  o_test where2-6.
2ba0: 31 32 20 7b 0a 20 20 20 20 23 20 49 6e 20 74 68  12 {.    # In th
2bb0: 69 73 20 63 61 73 65 2c 20 74 68 65 20 2b 62 20  is case, the +b 
2bc0: 64 69 73 61 62 6c 65 73 20 74 68 65 20 61 66 66  disables the aff
2bd0: 69 6e 69 74 79 20 63 6f 6e 66 6c 69 63 74 20 61  inity conflict a
2be0: 6e 64 20 61 6c 6c 6f 77 73 0a 20 20 20 20 23 20  nd allows.    # 
2bf0: 74 68 65 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74  the OR optimizat
2c00: 69 6f 6e 20 74 6f 20 62 65 20 75 73 65 64 20 61  ion to be used a
2c10: 67 61 69 6e 2e 20 20 54 68 65 20 72 65 73 75 6c  gain.  The resul
2c20: 74 20 69 73 20 6e 6f 77 20 61 6e 20 65 6d 70 74  t is now an empt
2c30: 79 0a 20 20 20 20 23 20 73 65 74 2c 20 74 68 65  y.    # set, the
2c40: 20 73 61 6d 65 20 61 73 20 69 6e 20 77 68 65 72   same as in wher
2c50: 65 32 2d 36 2e 39 2e 0a 20 20 20 20 71 75 65 72  e2-6.9..    quer
2c60: 79 70 6c 61 6e 20 7b 0a 20 20 20 20 20 20 53 45  yplan {.      SE
2c70: 4c 45 43 54 20 62 2c 61 20 46 52 4f 4d 20 74 32  LECT b,a FROM t2
2c80: 32 34 39 62 20 43 52 4f 53 53 20 4a 4f 49 4e 20  249b CROSS JOIN 
2c90: 74 32 32 34 39 61 20 57 48 45 52 45 20 61 3d 2b  t2249a WHERE a=+
2ca0: 62 20 4f 52 20 61 3d 27 68 65 6c 6c 6f 27 3b 0a  b OR a='hello';.
2cb0: 20 20 20 20 7d 0a 20 20 7d 20 7b 6e 6f 73 6f 72      }.  } {nosor
2cc0: 74 20 74 32 32 34 39 62 20 2a 20 74 32 32 34 39  t t2249b * t2249
2cd0: 61 20 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64  a sqlite_autoind
2ce0: 65 78 5f 74 32 32 34 39 61 5f 31 7d 0a 20 20 64  ex_t2249a_1}.  d
2cf0: 6f 5f 74 65 73 74 20 77 68 65 72 65 32 2d 36 2e  o_test where2-6.
2d00: 31 32 2e 32 20 7b 0a 20 20 20 20 23 20 49 6e 20  12.2 {.    # In 
2d10: 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 2b  this case, the +
2d20: 62 20 64 69 73 61 62 6c 65 73 20 74 68 65 20 61  b disables the a
2d30: 66 66 69 6e 69 74 79 20 63 6f 6e 66 6c 69 63 74  ffinity conflict
2d40: 20 61 6e 64 20 61 6c 6c 6f 77 73 0a 20 20 20 20   and allows.    
2d50: 23 20 74 68 65 20 4f 52 20 6f 70 74 69 6d 69 7a  # the OR optimiz
2d60: 61 74 69 6f 6e 20 74 6f 20 62 65 20 75 73 65 64  ation to be used
2d70: 20 61 67 61 69 6e 2e 20 20 54 68 65 20 72 65 73   again.  The res
2d80: 75 6c 74 20 69 73 20 6e 6f 77 20 61 6e 20 65 6d  ult is now an em
2d90: 70 74 79 0a 20 20 20 20 23 20 73 65 74 2c 20 74  pty.    # set, t
2da0: 68 65 20 73 61 6d 65 20 61 73 20 69 6e 20 77 68  he same as in wh
2db0: 65 72 65 32 2d 36 2e 39 2e 0a 20 20 20 20 71 75  ere2-6.9..    qu
2dc0: 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 20 20  eryplan {.      
2dd0: 53 45 4c 45 43 54 20 62 2c 61 20 46 52 4f 4d 20  SELECT b,a FROM 
2de0: 74 32 32 34 39 62 20 43 52 4f 53 53 20 4a 4f 49  t2249b CROSS JOI
2df0: 4e 20 74 32 32 34 39 61 20 57 48 45 52 45 20 61  N t2249a WHERE a
2e00: 3d 27 68 65 6c 6c 6f 27 20 4f 52 20 2b 62 3d 61  ='hello' OR +b=a
2e10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 6e 6f 73  ;.    }.  } {nos
2e20: 6f 72 74 20 74 32 32 34 39 62 20 2a 20 74 32 32  ort t2249b * t22
2e30: 34 39 61 20 73 71 6c 69 74 65 5f 61 75 74 6f 69  49a sqlite_autoi
2e40: 6e 64 65 78 5f 74 32 32 34 39 61 5f 31 7d 0a 20  ndex_t2249a_1}. 
2e50: 20 64 6f 5f 74 65 73 74 20 77 68 65 72 65 32 2d   do_test where2-
2e60: 36 2e 31 32 2e 33 20 7b 0a 20 20 20 20 23 20 49  6.12.3 {.    # I
2e70: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65  n this case, the
2e80: 20 2b 62 20 64 69 73 61 62 6c 65 73 20 74 68 65   +b disables the
2e90: 20 61 66 66 69 6e 69 74 79 20 63 6f 6e 66 6c 69   affinity confli
2ea0: 63 74 20 61 6e 64 20 61 6c 6c 6f 77 73 0a 20 20  ct and allows.  
2eb0: 20 20 23 20 74 68 65 20 4f 52 20 6f 70 74 69 6d    # the OR optim
2ec0: 69 7a 61 74 69 6f 6e 20 74 6f 20 62 65 20 75 73  ization to be us
2ed0: 65 64 20 61 67 61 69 6e 2e 20 20 54 68 65 20 72  ed again.  The r
2ee0: 65 73 75 6c 74 20 69 73 20 6e 6f 77 20 61 6e 20  esult is now an 
2ef0: 65 6d 70 74 79 0a 20 20 20 20 23 20 73 65 74 2c  empty.    # set,
2f00: 20 74 68 65 20 73 61 6d 65 20 61 73 20 69 6e 20   the same as in 
2f10: 77 68 65 72 65 32 2d 36 2e 39 2e 0a 20 20 20 20  where2-6.9..    
2f20: 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20  queryplan {.    
2f30: 20 20 53 45 4c 45 43 54 20 62 2c 61 20 46 52 4f    SELECT b,a FRO
2f40: 4d 20 74 32 32 34 39 62 20 43 52 4f 53 53 20 4a  M t2249b CROSS J
2f50: 4f 49 4e 20 74 32 32 34 39 61 20 57 48 45 52 45  OIN t2249a WHERE
2f60: 20 2b 62 3d 61 20 4f 52 20 61 3d 27 68 65 6c 6c   +b=a OR a='hell
2f70: 6f 27 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 6e  o';.    }.  } {n
2f80: 6f 73 6f 72 74 20 74 32 32 34 39 62 20 2a 20 74  osort t2249b * t
2f90: 32 32 34 39 61 20 73 71 6c 69 74 65 5f 61 75 74  2249a sqlite_aut
2fa0: 6f 69 6e 64 65 78 5f 74 32 32 34 39 61 5f 31 7d  oindex_t2249a_1}
2fb0: 0a 20 20 64 6f 5f 74 65 73 74 20 77 68 65 72 65  .  do_test where
2fc0: 32 2d 36 2e 31 33 20 7b 0a 20 20 20 20 23 20 54  2-6.13 {.    # T
2fd0: 68 65 20 61 64 64 69 74 69 6f 6e 20 6f 66 20 2b  he addition of +
2fe0: 61 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20  a on the second 
2ff0: 74 65 72 6d 20 64 69 73 61 62 6c 65 64 20 74 68  term disabled th
3000: 65 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f  e OR optimizatio
3010: 6e 2e 0a 20 20 20 20 23 20 42 75 74 20 77 65 20  n..    # But we 
3020: 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20 67 65 74  should still get
3030: 20 74 68 65 20 73 61 6d 65 20 65 6d 70 74 79 2d   the same empty-
3040: 73 65 74 20 72 65 73 75 6c 74 20 61 73 20 69 6e  set result as in
3050: 20 77 68 65 72 65 32 2d 36 2e 39 2e 0a 20 20 20   where2-6.9..   
3060: 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20   queryplan {.   
3070: 20 20 20 53 45 4c 45 43 54 20 62 2c 61 20 46 52     SELECT b,a FR
3080: 4f 4d 20 74 32 32 34 39 62 20 43 52 4f 53 53 20  OM t2249b CROSS 
3090: 4a 4f 49 4e 20 74 32 32 34 39 61 20 57 48 45 52  JOIN t2249a WHER
30a0: 45 20 61 3d 2b 62 20 4f 52 20 2b 61 3d 27 68 65  E a=+b OR +a='he
30b0: 6c 6c 6f 27 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  llo';.    }.  } 
30c0: 7b 6e 6f 73 6f 72 74 20 74 32 32 34 39 62 20 2a  {nosort t2249b *
30d0: 20 74 32 32 34 39 61 20 73 71 6c 69 74 65 5f 61   t2249a sqlite_a
30e0: 75 74 6f 69 6e 64 65 78 5f 74 32 32 34 39 61 5f  utoindex_t2249a_
30f0: 31 7d 0a 7d 0a 0a 23 20 56 61 72 69 61 74 69 6f  1}.}..# Variatio
3100: 6e 73 20 6f 6e 20 74 68 65 20 6f 72 64 65 72 20  ns on the order 
3110: 6f 66 20 74 65 72 6d 73 20 69 6e 20 61 20 57 48  of terms in a WH
3120: 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20 6f 72  ERE clause in or
3130: 64 65 72 0a 23 20 74 6f 20 6d 61 6b 65 20 73 75  der.# to make su
3140: 72 65 20 74 68 65 20 4f 52 20 6f 70 74 69 6d 69  re the OR optimi
3150: 7a 65 72 20 63 61 6e 20 72 65 63 6f 67 6e 69 7a  zer can recogniz
3160: 65 20 74 68 65 6d 20 61 6c 6c 2e 0a 64 6f 5f 74  e them all..do_t
3170: 65 73 74 20 77 68 65 72 65 32 2d 36 2e 32 30 20  est where2-6.20 
3180: 7b 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a  {.  queryplan {.
3190: 20 20 20 20 53 45 4c 45 43 54 20 78 2e 61 2c 20      SELECT x.a, 
31a0: 79 2e 61 20 46 52 4f 4d 20 74 32 32 34 39 61 20  y.a FROM t2249a 
31b0: 78 20 43 52 4f 53 53 20 4a 4f 49 4e 20 74 32 32  x CROSS JOIN t22
31c0: 34 39 61 20 79 20 57 48 45 52 45 20 78 2e 61 3d  49a y WHERE x.a=
31d0: 79 2e 61 0a 20 20 7d 0a 7d 20 7b 30 31 32 33 20  y.a.  }.} {0123 
31e0: 30 31 32 33 20 6e 6f 73 6f 72 74 20 78 20 73 71  0123 nosort x sq
31f0: 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 74  lite_autoindex_t
3200: 32 32 34 39 61 5f 31 20 79 20 73 71 6c 69 74 65  2249a_1 y sqlite
3210: 5f 61 75 74 6f 69 6e 64 65 78 5f 74 32 32 34 39  _autoindex_t2249
3220: 61 5f 31 7d 0a 69 66 63 61 70 61 62 6c 65 20 65  a_1}.ifcapable e
3230: 78 70 6c 61 69 6e 26 26 73 75 62 71 75 65 72 79  xplain&&subquery
3240: 20 7b 0a 20 20 23 20 54 68 65 73 65 20 74 65 73   {.  # These tes
3250: 74 73 20 61 72 65 20 6e 6f 74 20 72 75 6e 20 69  ts are not run i
3260: 66 20 73 75 62 71 75 65 72 79 20 73 75 70 70 6f  f subquery suppo
3270: 72 74 20 69 73 20 6e 6f 74 20 69 6e 63 6c 75 64  rt is not includ
3280: 65 64 20 69 6e 20 74 68 65 0a 20 20 23 20 62 75  ed in the.  # bu
3290: 69 6c 64 2e 20 54 68 69 73 20 69 73 20 62 65 63  ild. This is bec
32a0: 61 75 73 65 20 74 68 65 73 65 20 74 65 73 74 73  ause these tests
32b0: 20 74 65 73 74 20 74 68 65 20 22 61 20 3d 20 31   test the "a = 1
32c0: 20 4f 52 20 61 20 3d 20 32 22 20 74 6f 0a 20 20   OR a = 2" to.  
32d0: 23 20 22 61 20 49 4e 20 28 31 2c 20 32 29 22 20  # "a IN (1, 2)" 
32e0: 6f 70 74 69 6d 69 73 61 74 69 6f 6e 20 74 72 61  optimisation tra
32f0: 6e 73 66 6f 72 6d 61 74 69 6f 6e 2c 20 77 68 69  nsformation, whi
3300: 63 68 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65  ch is not enable
3310: 64 20 69 66 0a 20 20 23 20 73 75 62 71 75 65 72  d if.  # subquer
3320: 69 65 73 20 61 6e 64 20 74 68 65 20 49 4e 20 6f  ies and the IN o
3330: 70 65 72 61 74 6f 72 20 69 73 20 6e 6f 74 20 61  perator is not a
3340: 76 61 69 6c 61 62 6c 65 2e 0a 20 20 23 0a 20 20  vailable..  #.  
3350: 64 6f 5f 74 65 73 74 20 77 68 65 72 65 32 2d 36  do_test where2-6
3360: 2e 32 31 20 7b 0a 20 20 20 20 71 75 65 72 79 70  .21 {.    queryp
3370: 6c 61 6e 20 7b 0a 20 20 20 20 20 20 53 45 4c 45  lan {.      SELE
3380: 43 54 20 78 2e 61 2c 79 2e 61 20 46 52 4f 4d 20  CT x.a,y.a FROM 
3390: 74 32 32 34 39 61 20 78 20 43 52 4f 53 53 20 4a  t2249a x CROSS J
33a0: 4f 49 4e 20 74 32 32 34 39 61 20 79 0a 20 20 20  OIN t2249a y.   
33b0: 20 20 20 20 57 48 45 52 45 20 78 2e 61 3d 79 2e      WHERE x.a=y.
33c0: 61 20 4f 52 20 79 2e 61 3d 27 68 65 6c 6c 6f 27  a OR y.a='hello'
33d0: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 30 31 32 33  .    }.  } {0123
33e0: 20 30 31 32 33 20 6e 6f 73 6f 72 74 20 78 20 73   0123 nosort x s
33f0: 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f  qlite_autoindex_
3400: 74 32 32 34 39 61 5f 31 20 79 20 73 71 6c 69 74  t2249a_1 y sqlit
3410: 65 5f 61 75 74 6f 69 6e 64 65 78 5f 74 32 32 34  e_autoindex_t224
3420: 39 61 5f 31 7d 0a 20 20 64 6f 5f 74 65 73 74 20  9a_1}.  do_test 
3430: 77 68 65 72 65 32 2d 36 2e 32 32 20 7b 0a 20 20  where2-6.22 {.  
3440: 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20    queryplan {.  
3450: 20 20 20 20 53 45 4c 45 43 54 20 78 2e 61 2c 79      SELECT x.a,y
3460: 2e 61 20 46 52 4f 4d 20 74 32 32 34 39 61 20 78  .a FROM t2249a x
3470: 20 43 52 4f 53 53 20 4a 4f 49 4e 20 74 32 32 34   CROSS JOIN t224
3480: 39 61 20 79 0a 20 20 20 20 20 20 20 57 48 45 52  9a y.       WHER
3490: 45 20 79 2e 61 3d 78 2e 61 20 4f 52 20 79 2e 61  E y.a=x.a OR y.a
34a0: 3d 27 68 65 6c 6c 6f 27 0a 20 20 20 20 7d 0a 20  ='hello'.    }. 
34b0: 20 7d 20 7b 30 31 32 33 20 30 31 32 33 20 6e 6f   } {0123 0123 no
34c0: 73 6f 72 74 20 78 20 73 71 6c 69 74 65 5f 61 75  sort x sqlite_au
34d0: 74 6f 69 6e 64 65 78 5f 74 32 32 34 39 61 5f 31  toindex_t2249a_1
34e0: 20 79 20 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e   y sqlite_autoin
34f0: 64 65 78 5f 74 32 32 34 39 61 5f 31 7d 0a 20 20  dex_t2249a_1}.  
3500: 64 6f 5f 74 65 73 74 20 77 68 65 72 65 32 2d 36  do_test where2-6
3510: 2e 32 33 20 7b 0a 20 20 20 20 71 75 65 72 79 70  .23 {.    queryp
3520: 6c 61 6e 20 7b 0a 20 20 20 20 20 20 53 45 4c 45  lan {.      SELE
3530: 43 54 20 78 2e 61 2c 79 2e 61 20 46 52 4f 4d 20  CT x.a,y.a FROM 
3540: 74 32 32 34 39 61 20 78 20 43 52 4f 53 53 20 4a  t2249a x CROSS J
3550: 4f 49 4e 20 74 32 32 34 39 61 20 79 0a 20 20 20  OIN t2249a y.   
3560: 20 20 20 20 57 48 45 52 45 20 79 2e 61 3d 27 68      WHERE y.a='h
3570: 65 6c 6c 6f 27 20 4f 52 20 78 2e 61 3d 79 2e 61  ello' OR x.a=y.a
3580: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 30 31 32 33  .    }.  } {0123
3590: 20 30 31 32 33 20 6e 6f 73 6f 72 74 20 78 20 73   0123 nosort x s
35a0: 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f  qlite_autoindex_
35b0: 74 32 32 34 39 61 5f 31 20 79 20 73 71 6c 69 74  t2249a_1 y sqlit
35c0: 65 5f 61 75 74 6f 69 6e 64 65 78 5f 74 32 32 34  e_autoindex_t224
35d0: 39 61 5f 31 7d 0a 7d 0a 0a 23 20 55 6e 69 71 75  9a_1}.}..# Uniqu
35e0: 65 20 71 75 65 72 69 65 73 20 28 71 75 65 72 69  e queries (queri
35f0: 65 73 20 74 68 61 74 20 61 72 65 20 67 75 61 72  es that are guar
3600: 61 6e 74 65 65 64 20 74 6f 20 72 65 74 75 72 6e  anteed to return
3610: 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 0a 23   only a single.#
3620: 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 29 20   row of result) 
3630: 64 6f 20 6e 6f 74 20 63 61 6c 6c 20 74 68 65 20  do not call the 
3640: 73 6f 72 74 65 72 2e 20 20 42 75 74 20 61 6c 6c  sorter.  But all
3650: 20 74 61 62 6c 65 73 20 6d 75 73 74 20 67 69 76   tables must giv
3660: 65 0a 23 20 61 20 75 6e 69 71 75 65 20 72 65 73  e.# a unique res
3670: 75 6c 74 2e 20 20 49 66 20 61 6e 79 20 6f 6e 65  ult.  If any one
3680: 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 6a 6f   table in the jo
3690: 69 6e 20 64 6f 65 73 20 6e 6f 74 20 67 69 76 65  in does not give
36a0: 20 61 20 75 6e 69 71 75 65 0a 23 20 72 65 73 75   a unique.# resu
36b0: 6c 74 20 74 68 65 6e 20 73 6f 72 74 69 6e 67 20  lt then sorting 
36c0: 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 23 0a  is necessary..#.
36d0: 64 6f 5f 74 65 73 74 20 77 68 65 72 65 32 2d 37  do_test where2-7
36e0: 2e 31 20 7b 0a 20 20 63 6b 73 6f 72 74 20 7b 0a  .1 {.  cksort {.
36f0: 20 20 20 20 63 72 65 61 74 65 20 74 61 62 6c 65      create table
3700: 20 74 38 28 61 20 75 6e 69 71 75 65 2c 20 62 2c   t8(a unique, b,
3710: 20 63 29 3b 0a 20 20 20 20 69 6e 73 65 72 74 20   c);.    insert 
3720: 69 6e 74 6f 20 74 38 20 76 61 6c 75 65 73 28 31  into t8 values(1
3730: 2c 32 2c 33 29 3b 0a 20 20 20 20 69 6e 73 65 72  ,2,3);.    inser
3740: 74 20 69 6e 74 6f 20 74 38 20 76 61 6c 75 65 73  t into t8 values
3750: 28 32 2c 33 2c 34 29 3b 0a 20 20 20 20 63 72 65  (2,3,4);.    cre
3760: 61 74 65 20 74 61 62 6c 65 20 74 39 28 78 2c 79  ate table t9(x,y
3770: 29 3b 0a 20 20 20 20 69 6e 73 65 72 74 20 69 6e  );.    insert in
3780: 74 6f 20 74 39 20 76 61 6c 75 65 73 28 32 2c 34  to t9 values(2,4
3790: 29 3b 0a 20 20 20 20 69 6e 73 65 72 74 20 69 6e  );.    insert in
37a0: 74 6f 20 74 39 20 76 61 6c 75 65 73 28 32 2c 33  to t9 values(2,3
37b0: 29 3b 0a 20 20 20 20 73 65 6c 65 63 74 20 79 20  );.    select y 
37c0: 66 72 6f 6d 20 74 38 2c 20 74 39 20 77 68 65 72  from t8, t9 wher
37d0: 65 20 61 3d 31 20 6f 72 64 65 72 20 62 79 20 61  e a=1 order by a
37e0: 2c 20 79 3b 0a 20 20 7d 0a 7d 20 7b 33 20 34 20  , y;.  }.} {3 4 
37f0: 73 6f 72 74 7d 0a 64 6f 5f 74 65 73 74 20 77 68  sort}.do_test wh
3800: 65 72 65 32 2d 37 2e 32 20 7b 0a 20 20 63 6b 73  ere2-7.2 {.  cks
3810: 6f 72 74 20 7b 0a 20 20 20 20 73 65 6c 65 63 74  ort {.    select
3820: 20 2a 20 66 72 6f 6d 20 74 38 20 77 68 65 72 65   * from t8 where
3830: 20 61 3d 31 20 6f 72 64 65 72 20 62 79 20 62 2c   a=1 order by b,
3840: 20 63 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 33 20   c.  }.} {1 2 3 
3850: 6e 6f 73 6f 72 74 7d 0a 64 6f 5f 74 65 73 74 20  nosort}.do_test 
3860: 77 68 65 72 65 32 2d 37 2e 33 20 7b 0a 20 20 63  where2-7.3 {.  c
3870: 6b 73 6f 72 74 20 7b 0a 20 20 20 20 73 65 6c 65  ksort {.    sele
3880: 63 74 20 2a 20 66 72 6f 6d 20 74 38 2c 20 74 39  ct * from t8, t9
3890: 20 77 68 65 72 65 20 61 3d 31 20 61 6e 64 20 79   where a=1 and y
38a0: 3d 33 20 6f 72 64 65 72 20 62 79 20 62 2c 20 78  =3 order by b, x
38b0: 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 33 20 32 20  .  }.} {1 2 3 2 
38c0: 33 20 73 6f 72 74 7d 0a 64 6f 5f 74 65 73 74 20  3 sort}.do_test 
38d0: 77 68 65 72 65 32 2d 37 2e 34 20 7b 0a 20 20 63  where2-7.4 {.  c
38e0: 6b 73 6f 72 74 20 7b 0a 20 20 20 20 63 72 65 61  ksort {.    crea
38f0: 74 65 20 75 6e 69 71 75 65 20 69 6e 64 65 78 20  te unique index 
3900: 69 39 79 20 6f 6e 20 74 39 28 79 29 3b 0a 20 20  i9y on t9(y);.  
3910: 20 20 73 65 6c 65 63 74 20 2a 20 66 72 6f 6d 20    select * from 
3920: 74 38 2c 20 74 39 20 77 68 65 72 65 20 61 3d 31  t8, t9 where a=1
3930: 20 61 6e 64 20 79 3d 33 20 6f 72 64 65 72 20 62   and y=3 order b
3940: 79 20 62 2c 20 78 0a 20 20 7d 0a 7d 20 7b 31 20  y b, x.  }.} {1 
3950: 32 20 33 20 32 20 33 20 6e 6f 73 6f 72 74 7d 0a  2 3 2 3 nosort}.
3960: 0a 7d 20 3b 23 20 69 66 20 7b 5b 70 65 72 6d 75  .} ;# if {[permu
3970: 74 61 74 69 6f 6e 5d 20 21 3d 20 22 6e 6f 5f 6f  tation] != "no_o
3980: 70 74 69 6d 69 7a 61 74 69 6f 6e 22 7d 0a 0a 23  ptimization"}..#
3990: 20 54 69 63 6b 65 74 20 23 31 38 30 37 2e 20 20   Ticket #1807.  
39a0: 55 73 69 6e 67 20 49 4e 20 63 6f 6e 73 74 72 61  Using IN constra
39b0: 69 6e 73 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20  ins on multiple 
39c0: 63 6f 6c 75 6d 6e 73 20 6f 66 0a 23 20 61 20 6d  columns of.# a m
39d0: 75 6c 74 69 2d 63 6f 6c 75 6d 6e 20 69 6e 64 65  ulti-column inde
39e0: 78 2e 0a 23 0a 69 66 63 61 70 61 62 6c 65 20 73  x..#.ifcapable s
39f0: 75 62 71 75 65 72 79 20 7b 0a 20 20 64 6f 5f 74  ubquery {.  do_t
3a00: 65 73 74 20 77 68 65 72 65 32 2d 38 2e 31 20 7b  est where2-8.1 {
3a10: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
3a20: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
3a30: 4f 4d 20 74 31 20 57 48 45 52 45 20 78 20 49 4e  OM t1 WHERE x IN
3a40: 20 28 32 30 2c 32 31 29 20 41 4e 44 20 79 20 49   (20,21) AND y I
3a50: 4e 20 28 31 2c 32 29 0a 20 20 20 20 7d 0a 20 20  N (1,2).    }.  
3a60: 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77  } {}.  do_test w
3a70: 68 65 72 65 32 2d 38 2e 32 20 7b 0a 20 20 20 20  here2-8.2 {.    
3a80: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
3a90: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
3aa0: 20 57 48 45 52 45 20 78 20 49 4e 20 28 31 2c 32   WHERE x IN (1,2
3ab0: 29 20 41 4e 44 20 79 20 49 4e 20 28 2d 35 2c 2d  ) AND y IN (-5,-
3ac0: 36 29 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a  6).    }.  } {}.
3ad0: 20 20 65 78 65 63 73 71 6c 20 7b 43 52 45 41 54    execsql {CREAT
3ae0: 45 20 54 41 42 4c 45 20 74 78 20 41 53 20 53 45  E TABLE tx AS SE
3af0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 7d 0a  LECT * FROM t1}.
3b00: 20 20 64 6f 5f 74 65 73 74 20 77 68 65 72 65 32    do_test where2
3b10: 2d 38 2e 33 20 7b 0a 20 20 20 20 65 78 65 63 73  -8.3 {.    execs
3b20: 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43  ql {.      SELEC
3b30: 54 20 77 20 46 52 4f 4d 20 74 31 0a 20 20 20 20  T w FROM t1.    
3b40: 20 20 20 57 48 45 52 45 20 78 20 49 4e 20 28 53     WHERE x IN (S
3b50: 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 78 20  ELECT x FROM tx 
3b60: 57 48 45 52 45 20 72 6f 77 69 64 3c 30 29 0a 20  WHERE rowid<0). 
3b70: 20 20 20 20 20 20 20 20 41 4e 44 20 2b 79 20 49          AND +y I
3b80: 4e 20 28 53 45 4c 45 43 54 20 79 20 46 52 4f 4d  N (SELECT y FROM
3b90: 20 74 78 20 57 48 45 52 45 20 72 6f 77 69 64 3d   tx WHERE rowid=
3ba0: 31 29 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a  1).    }.  } {}.
3bb0: 20 20 64 6f 5f 74 65 73 74 20 77 68 65 72 65 32    do_test where2
3bc0: 2d 38 2e 34 20 7b 0a 20 20 20 20 65 78 65 63 73  -8.4 {.    execs
3bd0: 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43  ql {.      SELEC
3be0: 54 20 77 20 46 52 4f 4d 20 74 31 0a 20 20 20 20  T w FROM t1.    
3bf0: 20 20 20 57 48 45 52 45 20 78 20 49 4e 20 28 53     WHERE x IN (S
3c00: 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 78 20  ELECT x FROM tx 
3c10: 57 48 45 52 45 20 72 6f 77 69 64 3d 31 29 0a 20  WHERE rowid=1). 
3c20: 20 20 20 20 20 20 20 20 41 4e 44 20 79 20 49 4e          AND y IN
3c30: 20 28 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20   (SELECT y FROM 
3c40: 74 78 20 57 48 45 52 45 20 72 6f 77 69 64 3c 30  tx WHERE rowid<0
3c50: 29 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20  ).    }.  } {}. 
3c60: 20 23 73 65 74 20 73 71 6c 69 74 65 5f 77 68 65   #set sqlite_whe
3c70: 72 65 5f 74 72 61 63 65 20 31 0a 20 20 64 6f 5f  re_trace 1.  do_
3c80: 74 65 73 74 20 77 68 65 72 65 32 2d 38 2e 35 20  test where2-8.5 
3c90: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  {.    execsql {.
3ca0: 20 20 20 20 20 20 43 52 45 41 54 45 20 49 4e 44        CREATE IND
3cb0: 45 58 20 74 78 5f 78 79 7a 20 4f 4e 20 74 78 28  EX tx_xyz ON tx(
3cc0: 78 2c 20 79 2c 20 7a 2c 20 77 29 3b 0a 20 20 20  x, y, z, w);.   
3cd0: 20 20 20 53 45 4c 45 43 54 20 77 20 46 52 4f 4d     SELECT w FROM
3ce0: 20 74 78 0a 20 20 20 20 20 20 20 57 48 45 52 45   tx.       WHERE
3cf0: 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 78 20   x IN (SELECT x 
3d00: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 77 20  FROM t1 WHERE w 
3d10: 42 45 54 57 45 45 4e 20 31 30 20 41 4e 44 20 32  BETWEEN 10 AND 2
3d20: 30 29 0a 20 20 20 20 20 20 20 20 20 41 4e 44 20  0).         AND 
3d30: 79 20 49 4e 20 28 53 45 4c 45 43 54 20 79 20 46  y IN (SELECT y F
3d40: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 77 20 42  ROM t1 WHERE w B
3d50: 45 54 57 45 45 4e 20 31 30 20 41 4e 44 20 32 30  ETWEEN 10 AND 20
3d60: 29 0a 20 20 20 20 20 20 20 20 20 41 4e 44 20 7a  ).         AND z
3d70: 20 49 4e 20 28 53 45 4c 45 43 54 20 7a 20 46 52   IN (SELECT z FR
3d80: 4f 4d 20 74 31 20 57 48 45 52 45 20 77 20 42 45  OM t1 WHERE w BE
3d90: 54 57 45 45 4e 20 31 32 20 41 4e 44 20 31 34 29  TWEEN 12 AND 14)
3da0: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 32 20 31  .    }.  } {12 1
3db0: 33 20 31 34 7d 0a 20 20 64 6f 5f 74 65 73 74 20  3 14}.  do_test 
3dc0: 77 68 65 72 65 32 2d 38 2e 36 20 7b 0a 20 20 20  where2-8.6 {.   
3dd0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
3de0: 20 53 45 4c 45 43 54 20 77 20 46 52 4f 4d 20 74   SELECT w FROM t
3df0: 78 0a 20 20 20 20 20 20 20 57 48 45 52 45 20 78  x.       WHERE x
3e00: 20 49 4e 20 28 53 45 4c 45 43 54 20 78 20 46 52   IN (SELECT x FR
3e10: 4f 4d 20 74 31 20 57 48 45 52 45 20 77 20 42 45  OM t1 WHERE w BE
3e20: 54 57 45 45 4e 20 31 30 20 41 4e 44 20 32 30 29  TWEEN 10 AND 20)
3e30: 0a 20 20 20 20 20 20 20 20 20 41 4e 44 20 79 20  .         AND y 
3e40: 49 4e 20 28 53 45 4c 45 43 54 20 79 20 46 52 4f  IN (SELECT y FRO
3e50: 4d 20 74 31 20 57 48 45 52 45 20 77 20 42 45 54  M t1 WHERE w BET
3e60: 57 45 45 4e 20 31 32 20 41 4e 44 20 31 34 29 0a  WEEN 12 AND 14).
3e70: 20 20 20 20 20 20 20 20 20 41 4e 44 20 7a 20 49           AND z I
3e80: 4e 20 28 53 45 4c 45 43 54 20 7a 20 46 52 4f 4d  N (SELECT z FROM
3e90: 20 74 31 20 57 48 45 52 45 20 77 20 42 45 54 57   t1 WHERE w BETW
3ea0: 45 45 4e 20 31 30 20 41 4e 44 20 32 30 29 0a 20  EEN 10 AND 20). 
3eb0: 20 20 20 7d 0a 20 20 7d 20 7b 31 32 20 31 33 20     }.  } {12 13 
3ec0: 31 34 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 68  14}.  do_test wh
3ed0: 65 72 65 32 2d 38 2e 37 20 7b 0a 20 20 20 20 65  ere2-8.7 {.    e
3ee0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53  xecsql {.      S
3ef0: 45 4c 45 43 54 20 77 20 46 52 4f 4d 20 74 78 0a  ELECT w FROM tx.
3f00: 20 20 20 20 20 20 20 57 48 45 52 45 20 78 20 49         WHERE x I
3f10: 4e 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d  N (SELECT x FROM
3f20: 20 74 31 20 57 48 45 52 45 20 77 20 42 45 54 57   t1 WHERE w BETW
3f30: 45 45 4e 20 31 32 20 41 4e 44 20 31 34 29 0a 20  EEN 12 AND 14). 
3f40: 20 20 20 20 20 20 20 20 41 4e 44 20 79 20 49 4e          AND y IN
3f50: 20 28 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20   (SELECT y FROM 
3f60: 74 31 20 57 48 45 52 45 20 77 20 42 45 54 57 45  t1 WHERE w BETWE
3f70: 45 4e 20 31 30 20 41 4e 44 20 32 30 29 0a 20 20  EN 10 AND 20).  
3f80: 20 20 20 20 20 20 20 41 4e 44 20 7a 20 49 4e 20         AND z IN 
3f90: 28 53 45 4c 45 43 54 20 7a 20 46 52 4f 4d 20 74  (SELECT z FROM t
3fa0: 31 20 57 48 45 52 45 20 77 20 42 45 54 57 45 45  1 WHERE w BETWEE
3fb0: 4e 20 31 30 20 41 4e 44 20 32 30 29 0a 20 20 20  N 10 AND 20).   
3fc0: 20 7d 0a 20 20 7d 20 7b 31 30 20 31 31 20 31 32   }.  } {10 11 12
3fd0: 20 31 33 20 31 34 20 31 35 7d 0a 20 20 64 6f 5f   13 14 15}.  do_
3fe0: 74 65 73 74 20 77 68 65 72 65 32 2d 38 2e 38 20  test where2-8.8 
3ff0: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  {.    execsql {.
4000: 20 20 20 20 20 20 53 45 4c 45 43 54 20 77 20 46        SELECT w F
4010: 52 4f 4d 20 74 78 0a 20 20 20 20 20 20 20 57 48  ROM tx.       WH
4020: 45 52 45 20 78 20 49 4e 20 28 53 45 4c 45 43 54  ERE x IN (SELECT
4030: 20 78 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   x FROM t1 WHERE
4040: 20 77 20 42 45 54 57 45 45 4e 20 31 30 20 41 4e   w BETWEEN 10 AN
4050: 44 20 32 30 29 0a 20 20 20 20 20 20 20 20 20 41  D 20).         A
4060: 4e 44 20 79 20 49 4e 20 28 53 45 4c 45 43 54 20  ND y IN (SELECT 
4070: 79 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  y FROM t1 WHERE 
4080: 77 20 42 45 54 57 45 45 4e 20 31 30 20 41 4e 44  w BETWEEN 10 AND
4090: 20 32 30 29 0a 20 20 20 20 20 20 20 20 20 41 4e   20).         AN
40a0: 44 20 7a 20 49 4e 20 28 53 45 4c 45 43 54 20 7a  D z IN (SELECT z
40b0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 77   FROM t1 WHERE w
40c0: 20 42 45 54 57 45 45 4e 20 31 30 20 41 4e 44 20   BETWEEN 10 AND 
40d0: 32 30 29 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31  20).    }.  } {1
40e0: 30 20 31 31 20 31 32 20 31 33 20 31 34 20 31 35  0 11 12 13 14 15
40f0: 20 31 36 20 31 37 20 31 38 20 31 39 20 32 30 7d   16 17 18 19 20}
4100: 0a 20 20 64 6f 5f 74 65 73 74 20 77 68 65 72 65  .  do_test where
4110: 32 2d 38 2e 39 20 7b 0a 20 20 20 20 65 78 65 63  2-8.9 {.    exec
4120: 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45  sql {.      SELE
4130: 43 54 20 77 20 46 52 4f 4d 20 74 78 0a 20 20 20  CT w FROM tx.   
4140: 20 20 20 20 57 48 45 52 45 20 78 20 49 4e 20 28      WHERE x IN (
4150: 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31  SELECT x FROM t1
4160: 20 57 48 45 52 45 20 77 20 42 45 54 57 45 45 4e   WHERE w BETWEEN
4170: 20 31 30 20 41 4e 44 20 32 30 29 0a 20 20 20 20   10 AND 20).    
4180: 20 20 20 20 20 41 4e 44 20 79 20 49 4e 20 28 53       AND y IN (S
4190: 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 31 20  ELECT y FROM t1 
41a0: 57 48 45 52 45 20 77 20 42 45 54 57 45 45 4e 20  WHERE w BETWEEN 
41b0: 31 30 20 41 4e 44 20 32 30 29 0a 20 20 20 20 20  10 AND 20).     
41c0: 20 20 20 20 41 4e 44 20 7a 20 49 4e 20 28 53 45      AND z IN (SE
41d0: 4c 45 43 54 20 7a 20 46 52 4f 4d 20 74 31 20 57  LECT z FROM t1 W
41e0: 48 45 52 45 20 77 20 42 45 54 57 45 45 4e 20 32  HERE w BETWEEN 2
41f0: 20 41 4e 44 20 34 29 0a 20 20 20 20 7d 0a 20 20   AND 4).    }.  
4200: 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77  } {}.  do_test w
4210: 68 65 72 65 32 2d 38 2e 31 30 20 7b 0a 20 20 20  here2-8.10 {.   
4220: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
4230: 20 53 45 4c 45 43 54 20 77 20 46 52 4f 4d 20 74   SELECT w FROM t
4240: 78 0a 20 20 20 20 20 20 20 57 48 45 52 45 20 78  x.       WHERE x
4250: 20 49 4e 20 28 53 45 4c 45 43 54 20 78 20 46 52   IN (SELECT x FR
4260: 4f 4d 20 74 31 20 57 48 45 52 45 20 77 20 42 45  OM t1 WHERE w BE
4270: 54 57 45 45 4e 20 31 30 20 41 4e 44 20 32 30 29  TWEEN 10 AND 20)
4280: 0a 20 20 20 20 20 20 20 20 20 41 4e 44 20 79 20  .         AND y 
4290: 49 4e 20 28 53 45 4c 45 43 54 20 79 20 46 52 4f  IN (SELECT y FRO
42a0: 4d 20 74 31 20 57 48 45 52 45 20 77 20 42 45 54  M t1 WHERE w BET
42b0: 57 45 45 4e 20 32 20 41 4e 44 20 34 29 0a 20 20  WEEN 2 AND 4).  
42c0: 20 20 20 20 20 20 20 41 4e 44 20 7a 20 49 4e 20         AND z IN 
42d0: 28 53 45 4c 45 43 54 20 7a 20 46 52 4f 4d 20 74  (SELECT z FROM t
42e0: 31 20 57 48 45 52 45 20 77 20 42 45 54 57 45 45  1 WHERE w BETWEE
42f0: 4e 20 31 30 20 41 4e 44 20 32 30 29 0a 20 20 20  N 10 AND 20).   
4300: 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74   }.  } {}.  do_t
4310: 65 73 74 20 77 68 65 72 65 32 2d 38 2e 31 31 20  est where2-8.11 
4320: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  {.    execsql {.
4330: 20 20 20 20 20 20 53 45 4c 45 43 54 20 77 20 46        SELECT w F
4340: 52 4f 4d 20 74 78 0a 20 20 20 20 20 20 20 57 48  ROM tx.       WH
4350: 45 52 45 20 78 20 49 4e 20 28 53 45 4c 45 43 54  ERE x IN (SELECT
4360: 20 78 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   x FROM t1 WHERE
4370: 20 77 20 42 45 54 57 45 45 4e 20 32 20 41 4e 44   w BETWEEN 2 AND
4380: 20 34 29 0a 20 20 20 20 20 20 20 20 20 41 4e 44   4).         AND
4390: 20 79 20 49 4e 20 28 53 45 4c 45 43 54 20 79 20   y IN (SELECT y 
43a0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 77 20  FROM t1 WHERE w 
43b0: 42 45 54 57 45 45 4e 20 31 30 20 41 4e 44 20 32  BETWEEN 10 AND 2
43c0: 30 29 0a 20 20 20 20 20 20 20 20 20 41 4e 44 20  0).         AND 
43d0: 7a 20 49 4e 20 28 53 45 4c 45 43 54 20 7a 20 46  z IN (SELECT z F
43e0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 77 20 42  ROM t1 WHERE w B
43f0: 45 54 57 45 45 4e 20 31 30 20 41 4e 44 20 32 30  ETWEEN 10 AND 20
4400: 29 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20  ).    }.  } {}. 
4410: 20 64 6f 5f 74 65 73 74 20 77 68 65 72 65 32 2d   do_test where2-
4420: 38 2e 31 32 20 7b 0a 20 20 20 20 65 78 65 63 73  8.12 {.    execs
4430: 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43  ql {.      SELEC
4440: 54 20 77 20 46 52 4f 4d 20 74 78 0a 20 20 20 20  T w FROM tx.    
4450: 20 20 20 57 48 45 52 45 20 78 20 49 4e 20 28 53     WHERE x IN (S
4460: 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20  ELECT x FROM t1 
4470: 57 48 45 52 45 20 77 20 42 45 54 57 45 45 4e 20  WHERE w BETWEEN 
4480: 31 30 20 41 4e 44 20 32 30 29 0a 20 20 20 20 20  10 AND 20).     
4490: 20 20 20 20 41 4e 44 20 79 20 49 4e 20 28 53 45      AND y IN (SE
44a0: 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 31 20 57  LECT y FROM t1 W
44b0: 48 45 52 45 20 77 20 42 45 54 57 45 45 4e 20 31  HERE w BETWEEN 1
44c0: 30 20 41 4e 44 20 32 30 29 0a 20 20 20 20 20 20  0 AND 20).      
44d0: 20 20 20 41 4e 44 20 7a 20 49 4e 20 28 53 45 4c     AND z IN (SEL
44e0: 45 43 54 20 7a 20 46 52 4f 4d 20 74 31 20 57 48  ECT z FROM t1 WH
44f0: 45 52 45 20 77 20 42 45 54 57 45 45 4e 20 2d 34  ERE w BETWEEN -4
4500: 20 41 4e 44 20 2d 32 29 0a 20 20 20 20 7d 0a 20   AND -2).    }. 
4510: 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20   } {}.  do_test 
4520: 77 68 65 72 65 32 2d 38 2e 31 33 20 7b 0a 20 20  where2-8.13 {.  
4530: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
4540: 20 20 53 45 4c 45 43 54 20 77 20 46 52 4f 4d 20    SELECT w FROM 
4550: 74 78 0a 20 20 20 20 20 20 20 57 48 45 52 45 20  tx.       WHERE 
4560: 78 20 49 4e 20 28 53 45 4c 45 43 54 20 78 20 46  x IN (SELECT x F
4570: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 77 20 42  ROM t1 WHERE w B
4580: 45 54 57 45 45 4e 20 31 30 20 41 4e 44 20 32 30  ETWEEN 10 AND 20
4590: 29 0a 20 20 20 20 20 20 20 20 20 41 4e 44 20 79  ).         AND y
45a0: 20 49 4e 20 28 53 45 4c 45 43 54 20 79 20 46 52   IN (SELECT y FR
45b0: 4f 4d 20 74 31 20 57 48 45 52 45 20 77 20 42 45  OM t1 WHERE w BE
45c0: 54 57 45 45 4e 20 2d 34 20 41 4e 44 20 2d 32 29  TWEEN -4 AND -2)
45d0: 0a 20 20 20 20 20 20 20 20 20 41 4e 44 20 7a 20  .         AND z 
45e0: 49 4e 20 28 53 45 4c 45 43 54 20 7a 20 46 52 4f  IN (SELECT z FRO
45f0: 4d 20 74 31 20 57 48 45 52 45 20 77 20 42 45 54  M t1 WHERE w BET
4600: 57 45 45 4e 20 31 30 20 41 4e 44 20 32 30 29 0a  WEEN 10 AND 20).
4610: 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64      }.  } {}.  d
4620: 6f 5f 74 65 73 74 20 77 68 65 72 65 32 2d 38 2e  o_test where2-8.
4630: 31 34 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  14 {.    execsql
4640: 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20   {.      SELECT 
4650: 77 20 46 52 4f 4d 20 74 78 0a 20 20 20 20 20 20  w FROM tx.      
4660: 20 57 48 45 52 45 20 78 20 49 4e 20 28 53 45 4c   WHERE x IN (SEL
4670: 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20 57 48  ECT x FROM t1 WH
4680: 45 52 45 20 77 20 42 45 54 57 45 45 4e 20 2d 34  ERE w BETWEEN -4
4690: 20 41 4e 44 20 2d 32 29 0a 20 20 20 20 20 20 20   AND -2).       
46a0: 20 20 41 4e 44 20 79 20 49 4e 20 28 53 45 4c 45    AND y IN (SELE
46b0: 43 54 20 79 20 46 52 4f 4d 20 74 31 20 57 48 45  CT y FROM t1 WHE
46c0: 52 45 20 77 20 42 45 54 57 45 45 4e 20 31 30 20  RE w BETWEEN 10 
46d0: 41 4e 44 20 32 30 29 0a 20 20 20 20 20 20 20 20  AND 20).        
46e0: 20 41 4e 44 20 7a 20 49 4e 20 28 53 45 4c 45 43   AND z IN (SELEC
46f0: 54 20 7a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T z FROM t1 WHER
4700: 45 20 77 20 42 45 54 57 45 45 4e 20 31 30 20 41  E w BETWEEN 10 A
4710: 4e 44 20 32 30 29 0a 20 20 20 20 7d 0a 20 20 7d  ND 20).    }.  }
4720: 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 68   {}.  do_test wh
4730: 65 72 65 32 2d 38 2e 31 35 20 7b 0a 20 20 20 20  ere2-8.15 {.    
4740: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
4750: 53 45 4c 45 43 54 20 77 20 46 52 4f 4d 20 74 78  SELECT w FROM tx
4760: 0a 20 20 20 20 20 20 20 57 48 45 52 45 20 78 20  .       WHERE x 
4770: 49 4e 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f  IN (SELECT x FRO
4780: 4d 20 74 31 20 57 48 45 52 45 20 77 20 42 45 54  M t1 WHERE w BET
4790: 57 45 45 4e 20 31 30 20 41 4e 44 20 32 30 29 0a  WEEN 10 AND 20).
47a0: 20 20 20 20 20 20 20 20 20 41 4e 44 20 79 20 49           AND y I
47b0: 4e 20 28 53 45 4c 45 43 54 20 79 20 46 52 4f 4d  N (SELECT y FROM
47c0: 20 74 31 20 57 48 45 52 45 20 77 20 42 45 54 57   t1 WHERE w BETW
47d0: 45 45 4e 20 31 30 20 41 4e 44 20 32 30 29 0a 20  EEN 10 AND 20). 
47e0: 20 20 20 20 20 20 20 20 41 4e 44 20 7a 20 49 4e          AND z IN
47f0: 20 28 53 45 4c 45 43 54 20 7a 20 46 52 4f 4d 20   (SELECT z FROM 
4800: 74 31 20 57 48 45 52 45 20 77 20 42 45 54 57 45  t1 WHERE w BETWE
4810: 45 4e 20 32 30 30 20 41 4e 44 20 33 30 30 29 0a  EN 200 AND 300).
4820: 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64      }.  } {}.  d
4830: 6f 5f 74 65 73 74 20 77 68 65 72 65 32 2d 38 2e  o_test where2-8.
4840: 31 36 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  16 {.    execsql
4850: 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20   {.      SELECT 
4860: 77 20 46 52 4f 4d 20 74 78 0a 20 20 20 20 20 20  w FROM tx.      
4870: 20 57 48 45 52 45 20 78 20 49 4e 20 28 53 45 4c   WHERE x IN (SEL
4880: 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20 57 48  ECT x FROM t1 WH
4890: 45 52 45 20 77 20 42 45 54 57 45 45 4e 20 31 30  ERE w BETWEEN 10
48a0: 20 41 4e 44 20 32 30 29 0a 20 20 20 20 20 20 20   AND 20).       
48b0: 20 20 41 4e 44 20 79 20 49 4e 20 28 53 45 4c 45    AND y IN (SELE
48c0: 43 54 20 79 20 46 52 4f 4d 20 74 31 20 57 48 45  CT y FROM t1 WHE
48d0: 52 45 20 77 20 42 45 54 57 45 45 4e 20 32 30 30  RE w BETWEEN 200
48e0: 20 41 4e 44 20 33 30 30 29 0a 20 20 20 20 20 20   AND 300).      
48f0: 20 20 20 41 4e 44 20 7a 20 49 4e 20 28 53 45 4c     AND z IN (SEL
4900: 45 43 54 20 7a 20 46 52 4f 4d 20 74 31 20 57 48  ECT z FROM t1 WH
4910: 45 52 45 20 77 20 42 45 54 57 45 45 4e 20 31 30  ERE w BETWEEN 10
4920: 20 41 4e 44 20 32 30 29 0a 20 20 20 20 7d 0a 20   AND 20).    }. 
4930: 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20   } {}.  do_test 
4940: 77 68 65 72 65 32 2d 38 2e 31 37 20 7b 0a 20 20  where2-8.17 {.  
4950: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
4960: 20 20 53 45 4c 45 43 54 20 77 20 46 52 4f 4d 20    SELECT w FROM 
4970: 74 78 0a 20 20 20 20 20 20 20 57 48 45 52 45 20  tx.       WHERE 
4980: 78 20 49 4e 20 28 53 45 4c 45 43 54 20 78 20 46  x IN (SELECT x F
4990: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 77 20 42  ROM t1 WHERE w B
49a0: 45 54 57 45 45 4e 20 32 30 30 20 41 4e 44 20 33  ETWEEN 200 AND 3
49b0: 30 30 29 0a 20 20 20 20 20 20 20 20 20 41 4e 44  00).         AND
49c0: 20 79 20 49 4e 20 28 53 45 4c 45 43 54 20 79 20   y IN (SELECT y 
49d0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 77 20  FROM t1 WHERE w 
49e0: 42 45 54 57 45 45 4e 20 31 30 20 41 4e 44 20 32  BETWEEN 10 AND 2
49f0: 30 29 0a 20 20 20 20 20 20 20 20 20 41 4e 44 20  0).         AND 
4a00: 7a 20 49 4e 20 28 53 45 4c 45 43 54 20 7a 20 46  z IN (SELECT z F
4a10: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 77 20 42  ROM t1 WHERE w B
4a20: 45 54 57 45 45 4e 20 31 30 20 41 4e 44 20 32 30  ETWEEN 10 AND 20
4a30: 29 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20  ).    }.  } {}. 
4a40: 20 64 6f 5f 74 65 73 74 20 77 68 65 72 65 32 2d   do_test where2-
4a50: 38 2e 31 38 20 7b 0a 20 20 20 20 65 78 65 63 73  8.18 {.    execs
4a60: 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43  ql {.      SELEC
4a70: 54 20 77 20 46 52 4f 4d 20 74 78 0a 20 20 20 20  T w FROM tx.    
4a80: 20 20 20 57 48 45 52 45 20 78 20 49 4e 20 28 53     WHERE x IN (S
4a90: 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20  ELECT x FROM t1 
4aa0: 57 48 45 52 45 20 2b 77 20 42 45 54 57 45 45 4e  WHERE +w BETWEEN
4ab0: 20 31 30 20 41 4e 44 20 32 30 29 0a 20 20 20 20   10 AND 20).    
4ac0: 20 20 20 20 20 41 4e 44 20 79 20 49 4e 20 28 53       AND y IN (S
4ad0: 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 31 20  ELECT y FROM t1 
4ae0: 57 48 45 52 45 20 2b 77 20 42 45 54 57 45 45 4e  WHERE +w BETWEEN
4af0: 20 31 30 20 41 4e 44 20 32 30 29 0a 20 20 20 20   10 AND 20).    
4b00: 20 20 20 20 20 41 4e 44 20 7a 20 49 4e 20 28 53       AND z IN (S
4b10: 45 4c 45 43 54 20 7a 20 46 52 4f 4d 20 74 31 20  ELECT z FROM t1 
4b20: 57 48 45 52 45 20 2b 77 20 42 45 54 57 45 45 4e  WHERE +w BETWEEN
4b30: 20 32 30 30 20 41 4e 44 20 33 30 30 29 0a 20 20   200 AND 300).  
4b40: 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f    }.  } {}.  do_
4b50: 74 65 73 74 20 77 68 65 72 65 32 2d 38 2e 31 39  test where2-8.19
4b60: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
4b70: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 77 20  .      SELECT w 
4b80: 46 52 4f 4d 20 74 78 0a 20 20 20 20 20 20 20 57  FROM tx.       W
4b90: 48 45 52 45 20 78 20 49 4e 20 28 53 45 4c 45 43  HERE x IN (SELEC
4ba0: 54 20 78 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T x FROM t1 WHER
4bb0: 45 20 2b 77 20 42 45 54 57 45 45 4e 20 31 30 20  E +w BETWEEN 10 
4bc0: 41 4e 44 20 32 30 29 0a 20 20 20 20 20 20 20 20  AND 20).        
4bd0: 20 41 4e 44 20 79 20 49 4e 20 28 53 45 4c 45 43   AND y IN (SELEC
4be0: 54 20 79 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T y FROM t1 WHER
4bf0: 45 20 2b 77 20 42 45 54 57 45 45 4e 20 32 30 30  E +w BETWEEN 200
4c00: 20 41 4e 44 20 33 30 30 29 0a 20 20 20 20 20 20   AND 300).      
4c10: 20 20 20 41 4e 44 20 7a 20 49 4e 20 28 53 45 4c     AND z IN (SEL
4c20: 45 43 54 20 7a 20 46 52 4f 4d 20 74 31 20 57 48  ECT z FROM t1 WH
4c30: 45 52 45 20 2b 77 20 42 45 54 57 45 45 4e 20 31  ERE +w BETWEEN 1
4c40: 30 20 41 4e 44 20 32 30 29 0a 20 20 20 20 7d 0a  0 AND 20).    }.
4c50: 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74    } {}.  do_test
4c60: 20 77 68 65 72 65 32 2d 38 2e 32 30 20 7b 0a 20   where2-8.20 {. 
4c70: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
4c80: 20 20 20 53 45 4c 45 43 54 20 77 20 46 52 4f 4d     SELECT w FROM
4c90: 20 74 78 0a 20 20 20 20 20 20 20 57 48 45 52 45   tx.       WHERE
4ca0: 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 78 20   x IN (SELECT x 
4cb0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 2b 77  FROM t1 WHERE +w
4cc0: 20 42 45 54 57 45 45 4e 20 32 30 30 20 41 4e 44   BETWEEN 200 AND
4cd0: 20 33 30 30 29 0a 20 20 20 20 20 20 20 20 20 41   300).         A
4ce0: 4e 44 20 79 20 49 4e 20 28 53 45 4c 45 43 54 20  ND y IN (SELECT 
4cf0: 79 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  y FROM t1 WHERE 
4d00: 2b 77 20 42 45 54 57 45 45 4e 20 31 30 20 41 4e  +w BETWEEN 10 AN
4d10: 44 20 32 30 29 0a 20 20 20 20 20 20 20 20 20 41  D 20).         A
4d20: 4e 44 20 7a 20 49 4e 20 28 53 45 4c 45 43 54 20  ND z IN (SELECT 
4d30: 7a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  z FROM t1 WHERE 
4d40: 2b 77 20 42 45 54 57 45 45 4e 20 31 30 20 41 4e  +w BETWEEN 10 AN
4d50: 44 20 32 30 29 0a 20 20 20 20 7d 0a 20 20 7d 20  D 20).    }.  } 
4d60: 7b 7d 0a 7d 20 20 0a 0a 23 20 4d 61 6b 65 20 73  {}.}  ..# Make s
4d70: 75 72 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ure WHERE clause
4d80: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 41 3d  s of the form A=
4d90: 31 20 41 4e 44 20 28 42 3d 32 20 4f 52 20 42 3d  1 AND (B=2 OR B=
4da0: 33 29 20 61 72 65 20 6f 70 74 69 6d 69 7a 65 64  3) are optimized
4db0: 0a 23 20 77 68 65 6e 20 77 65 20 68 61 76 65 20  .# when we have 
4dc0: 61 6e 20 69 6e 64 65 78 20 6f 6e 20 41 20 61 6e  an index on A an
4dd0: 64 20 42 2e 0a 23 0a 69 66 63 61 70 61 62 6c 65  d B..#.ifcapable
4de0: 20 6f 72 5f 6f 70 74 26 26 74 63 6c 76 61 72 20   or_opt&&tclvar 
4df0: 7b 0a 20 20 64 6f 5f 74 65 73 74 20 77 68 65 72  {.  do_test wher
4e00: 65 32 2d 39 2e 31 20 7b 0a 20 20 20 20 65 78 65  e2-9.1 {.    exe
4e10: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 42 45 47  csql {.      BEG
4e20: 49 4e 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45  IN;.      CREATE
4e30: 20 54 41 42 4c 45 20 74 31 30 28 61 2c 62 2c 63   TABLE t10(a,b,c
4e40: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
4e50: 49 4e 54 4f 20 74 31 30 20 56 41 4c 55 45 53 28  INTO t10 VALUES(
4e60: 31 2c 31 2c 31 29 3b 0a 20 20 20 20 20 20 49 4e  1,1,1);.      IN
4e70: 53 45 52 54 20 49 4e 54 4f 20 74 31 30 20 56 41  SERT INTO t10 VA
4e80: 4c 55 45 53 28 31 2c 32 2c 32 29 3b 0a 20 20 20  LUES(1,2,2);.   
4e90: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
4ea0: 31 30 20 56 41 4c 55 45 53 28 31 2c 33 2c 33 29  10 VALUES(1,3,3)
4eb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 20  ;.    }.    for 
4ec0: 7b 73 65 74 20 69 20 34 7d 20 7b 24 69 3c 3d 31  {set i 4} {$i<=1
4ed0: 30 30 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a  000} {incr i} {.
4ee0: 20 20 20 20 20 20 65 78 65 63 73 71 6c 20 7b 49        execsql {I
4ef0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 30 20 56  NSERT INTO t10 V
4f00: 41 4c 55 45 53 28 31 2c 24 69 2c 24 69 29 7d 0a  ALUES(1,$i,$i)}.
4f10: 20 20 20 20 7d 0a 20 20 20 20 65 78 65 63 73 71      }.    execsq
4f20: 6c 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54 45  l {.      CREATE
4f30: 20 49 4e 44 45 58 20 69 31 30 20 4f 4e 20 74 31   INDEX i10 ON t1
4f40: 30 28 61 2c 62 29 3b 0a 20 20 20 20 20 20 43 4f  0(a,b);.      CO
4f50: 4d 4d 49 54 3b 0a 20 20 20 20 20 20 53 45 4c 45  MMIT;.      SELE
4f60: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
4f70: 20 74 31 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 20   t10;.    }.  } 
4f80: 31 30 30 30 0a 20 20 69 66 63 61 70 61 62 6c 65  1000.  ifcapable
4f90: 20 73 75 62 71 75 65 72 79 20 7b 0a 20 20 20 20   subquery {.    
4fa0: 64 6f 5f 74 65 73 74 20 77 68 65 72 65 32 2d 39  do_test where2-9
4fb0: 2e 32 20 7b 0a 20 20 20 20 20 20 63 6f 75 6e 74  .2 {.      count
4fc0: 20 7b 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43   {.        SELEC
4fd0: 54 20 2a 20 46 52 4f 4d 20 74 31 30 20 57 48 45  T * FROM t10 WHE
4fe0: 52 45 20 61 3d 31 20 41 4e 44 20 28 62 3d 32 20  RE a=1 AND (b=2 
4ff0: 4f 52 20 62 3d 33 29 0a 20 20 20 20 20 20 7d 0a  OR b=3).      }.
5000: 20 20 20 20 7d 20 7b 31 20 32 20 32 20 31 20 33      } {1 2 2 1 3
5010: 20 33 20 37 7d 0a 20 20 7d 0a 7d 0a 0a 23 20 49   3 7}.  }.}..# I
5020: 6e 64 69 63 65 73 20 77 69 74 68 20 72 65 64 75  ndices with redu
5030: 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e 73 0a 23 0a  ndant columns.#.
5040: 64 6f 5f 74 65 73 74 20 77 68 65 72 65 32 2d 31  do_test where2-1
5050: 31 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.1 {.  execsql 
5060: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
5070: 4c 45 20 74 31 31 28 61 2c 62 2c 63 2c 64 29 3b  LE t11(a,b,c,d);
5080: 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  .    CREATE INDE
5090: 58 20 69 31 31 61 62 61 20 4f 4e 20 74 31 31 28  X i11aba ON t11(
50a0: 61 2c 62 2c 61 2c 63 29 3b 20 2d 2d 20 63 6f 6c  a,b,a,c); -- col
50b0: 75 6d 6e 20 41 20 6f 63 63 75 72 73 20 74 77 69  umn A occurs twi
50c0: 63 65 2e 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ce..    INSERT I
50d0: 4e 54 4f 20 74 31 31 20 56 41 4c 55 45 53 28 31  NTO t11 VALUES(1
50e0: 2c 32 2c 33 2c 34 29 3b 0a 20 20 20 20 49 4e 53  ,2,3,4);.    INS
50f0: 45 52 54 20 49 4e 54 4f 20 74 31 31 20 56 41 4c  ERT INTO t11 VAL
5100: 55 45 53 28 35 2c 36 2c 37 2c 38 29 3b 0a 20 20  UES(5,6,7,8);.  
5110: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
5120: 31 20 56 41 4c 55 45 53 28 31 2c 32 2c 39 2c 31  1 VALUES(1,2,9,1
5130: 30 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  0);.    INSERT I
5140: 4e 54 4f 20 74 31 31 20 56 41 4c 55 45 53 28 35  NTO t11 VALUES(5
5150: 2c 31 31 2c 31 32 2c 31 33 29 3b 0a 20 20 20 20  ,11,12,13);.    
5160: 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 31  SELECT c FROM t1
5170: 31 20 57 48 45 52 45 20 61 3d 31 20 41 4e 44 20  1 WHERE a=1 AND 
5180: 62 3d 32 20 4f 52 44 45 52 20 42 59 20 63 3b 0a  b=2 ORDER BY c;.
5190: 20 20 7d 0a 7d 20 7b 33 20 39 7d 0a 64 6f 5f 74    }.} {3 9}.do_t
51a0: 65 73 74 20 77 68 65 72 65 32 2d 31 31 2e 32 20  est where2-11.2 
51b0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
51c0: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
51d0: 31 31 63 63 63 63 63 63 63 63 20 4f 4e 20 74 31  11cccccccc ON t1
51e0: 31 28 63 2c 63 2c 63 2c 63 2c 63 2c 63 2c 63 2c  1(c,c,c,c,c,c,c,
51f0: 63 29 3b 20 2d 2d 20 72 65 70 65 61 74 65 64 20  c); -- repeated 
5200: 63 6f 6c 75 6d 6e 0a 20 20 20 20 53 45 4c 45 43  column.    SELEC
5210: 54 20 64 20 46 52 4f 4d 20 74 31 31 20 57 48 45  T d FROM t11 WHE
5220: 52 45 20 63 3d 39 3b 0a 20 20 7d 0a 7d 20 7b 31  RE c=9;.  }.} {1
5230: 30 7d 0a 64 6f 5f 74 65 73 74 20 77 68 65 72 65  0}.do_test where
5240: 32 2d 31 31 2e 33 20 7b 0a 20 20 65 78 65 63 73  2-11.3 {.  execs
5250: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
5260: 64 20 46 52 4f 4d 20 74 31 31 20 57 48 45 52 45  d FROM t11 WHERE
5270: 20 63 20 49 4e 20 28 31 2c 32 2c 33 2c 34 2c 35   c IN (1,2,3,4,5
5280: 29 3b 0a 20 20 7d 0a 7d 20 7b 34 7d 0a 64 6f 5f  );.  }.} {4}.do_
5290: 74 65 73 74 20 77 68 65 72 65 32 2d 31 31 2e 34  test where2-11.4
52a0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
52b0: 20 20 20 53 45 4c 45 43 54 20 64 20 46 52 4f 4d     SELECT d FROM
52c0: 20 74 31 31 20 57 48 45 52 45 20 63 3d 37 20 4f   t11 WHERE c=7 O
52d0: 52 20 28 61 3d 31 20 41 4e 44 20 62 3d 32 29 20  R (a=1 AND b=2) 
52e0: 4f 52 44 45 52 20 42 59 20 64 3b 0a 20 20 7d 0a  ORDER BY d;.  }.
52f0: 7d 20 7b 34 20 38 20 31 30 7d 0a 0a 23 20 56 65  } {4 8 10}..# Ve
5300: 72 69 66 79 20 74 68 61 74 20 74 68 65 20 4f 52  rify that the OR
5310: 20 63 6c 61 75 73 65 20 69 73 20 75 73 65 64 20   clause is used 
5320: 69 6e 20 61 6e 20 6f 75 74 65 72 20 6c 6f 6f 70  in an outer loop
5330: 20 65 76 65 6e 20 77 68 65 6e 0a 23 20 74 68 65   even when.# the
5340: 20 4f 52 20 63 6c 61 75 73 65 20 73 63 6f 72 65   OR clause score
5350: 73 20 73 6c 69 67 68 74 6c 79 20 62 65 74 74 65  s slightly bette
5360: 72 20 6f 6e 20 61 6e 20 69 6e 6e 65 72 20 6c 6f  r on an inner lo
5370: 6f 70 2e 0a 69 66 20 7b 5b 70 65 72 6d 75 74 61  op..if {[permuta
5380: 74 69 6f 6e 5d 20 21 3d 20 22 6e 6f 5f 6f 70 74  tion] != "no_opt
5390: 69 6d 69 7a 61 74 69 6f 6e 22 7d 20 7b 0a 64 6f  imization"} {.do
53a0: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 77 68  _execsql_test wh
53b0: 65 72 65 32 2d 31 32 2e 31 20 7b 0a 20 20 43 52  ere2-12.1 {.  CR
53c0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 32 28 78  EATE TABLE t12(x
53d0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
53e0: 20 4b 45 59 2c 20 79 20 49 4e 54 2c 20 7a 20 43   KEY, y INT, z C
53f0: 48 41 52 28 31 30 30 29 29 3b 0a 20 20 43 52 45  HAR(100));.  CRE
5400: 41 54 45 20 49 4e 44 45 58 20 74 31 32 79 20 4f  ATE INDEX t12y O
5410: 4e 20 74 31 32 28 79 29 3b 0a 20 20 45 58 50 4c  N t12(y);.  EXPL
5420: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a 20  AIN QUERY PLAN. 
5430: 20 20 20 53 45 4c 45 43 54 20 61 2e 78 2c 20 62     SELECT a.x, b
5440: 2e 78 0a 20 20 20 20 20 20 46 52 4f 4d 20 74 31  .x.      FROM t1
5450: 32 20 41 53 20 61 20 4a 4f 49 4e 20 74 31 32 20  2 AS a JOIN t12 
5460: 41 53 20 62 20 4f 4e 20 61 2e 79 3d 62 2e 78 0a  AS b ON a.y=b.x.
5470: 20 20 20 20 20 57 48 45 52 45 20 28 62 2e 78 3d       WHERE (b.x=
5480: 24 61 62 63 20 4f 52 20 62 2e 79 3d 24 61 62 63  $abc OR b.y=$abc
5490: 29 3b 0a 7d 20 7b 2f 2e 2a 53 45 41 52 43 48 20  );.} {/.*SEARCH 
54a0: 54 41 42 4c 45 20 74 31 32 20 41 53 20 62 20 2e  TABLE t12 AS b .
54b0: 2a 53 45 41 52 43 48 20 54 41 42 4c 45 20 74 31  *SEARCH TABLE t1
54c0: 32 20 41 53 20 62 20 2e 2a 2f 7d 0a 7d 0a 0a 0a  2 AS b .*/}.}...
54d0: 66 69 6e 69 73 68 5f 74 65 73 74 0a              finish_test.