/ Hex Artifact Content
Login

Artifact 45eacc126aabb37959a387aa83e59ce1f1f03820:


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 3a 3a 73 71 6c 69  pends the ::sqli
07e0: 74 65 5f 71 75 65 72 79 5f 70 6c 61 6e 20 76 61  te_query_plan va
07f0: 72 69 61 62 6c 65 2e 0a 23 0a 70 72 6f 63 20 71  riable..#.proc q
0800: 75 65 72 79 70 6c 61 6e 20 7b 73 71 6c 7d 20 7b  ueryplan {sql} {
0810: 0a 20 20 73 65 74 20 3a 3a 73 71 6c 69 74 65 5f  .  set ::sqlite_
0820: 73 6f 72 74 5f 63 6f 75 6e 74 20 30 0a 20 20 73  sort_count 0.  s
0830: 65 74 20 64 61 74 61 20 5b 65 78 65 63 73 71 6c  et data [execsql
0840: 20 24 73 71 6c 5d 0a 20 20 69 66 20 7b 24 3a 3a   $sql].  if {$::
0850: 73 71 6c 69 74 65 5f 73 6f 72 74 5f 63 6f 75 6e  sqlite_sort_coun
0860: 74 7d 20 7b 73 65 74 20 78 20 73 6f 72 74 7d 20  t} {set x sort} 
0870: 7b 73 65 74 20 78 20 6e 6f 73 6f 72 74 7d 0a 20  {set x nosort}. 
0880: 20 6c 61 70 70 65 6e 64 20 64 61 74 61 20 24 78   lappend data $x
0890: 0a 20 20 72 65 74 75 72 6e 20 5b 63 6f 6e 63 61  .  return [conca
08a0: 74 20 24 64 61 74 61 20 24 3a 3a 73 71 6c 69 74  t $data $::sqlit
08b0: 65 5f 71 75 65 72 79 5f 70 6c 61 6e 5d 0a 7d 0a  e_query_plan].}.
08c0: 0a 0a 23 20 50 72 65 66 65 72 20 61 20 55 4e 49  ..# Prefer a UNI
08d0: 51 55 45 20 69 6e 64 65 78 20 6f 76 65 72 20 61  QUE index over a
08e0: 6e 6f 74 68 65 72 20 69 6e 64 65 78 2e 0a 23 0a  nother index..#.
08f0: 64 6f 5f 74 65 73 74 20 77 68 65 72 65 32 2d 31  do_test where2-1
0900: 2e 31 20 7b 0a 20 20 71 75 65 72 79 70 6c 61 6e  .1 {.  queryplan
0910: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20   {.    SELECT * 
0920: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 77 3d  FROM t1 WHERE w=
0930: 38 35 20 41 4e 44 20 78 3d 36 20 41 4e 44 20 79  85 AND x=6 AND y
0940: 3d 37 33 39 36 0a 20 20 7d 0a 7d 20 7b 38 35 20  =7396.  }.} {85 
0950: 36 20 37 33 39 36 20 37 34 30 32 20 6e 6f 73 6f  6 7396 7402 noso
0960: 72 74 20 74 31 20 69 31 77 7d 0a 0a 23 20 41 6c  rt t1 i1w}..# Al
0970: 77 61 79 73 20 70 72 65 66 65 72 20 61 20 72 6f  ways prefer a ro
0980: 77 69 64 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74  wid== constraint
0990: 20 6f 76 65 72 20 61 6e 79 20 6f 74 68 65 72 20   over any other 
09a0: 69 6e 64 65 78 2e 0a 23 0a 64 6f 5f 74 65 73 74  index..#.do_test
09b0: 20 77 68 65 72 65 32 2d 31 2e 33 20 7b 0a 20 20   where2-1.3 {.  
09c0: 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20  queryplan {.    
09d0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
09e0: 20 57 48 45 52 45 20 77 3d 38 35 20 41 4e 44 20   WHERE w=85 AND 
09f0: 78 3d 36 20 41 4e 44 20 79 3d 37 33 39 36 20 41  x=6 AND y=7396 A
0a00: 4e 44 20 72 6f 77 69 64 3d 38 35 0a 20 20 7d 0a  ND rowid=85.  }.
0a10: 7d 20 7b 38 35 20 36 20 37 33 39 36 20 37 34 30  } {85 6 7396 740
0a20: 32 20 6e 6f 73 6f 72 74 20 74 31 20 2a 7d 0a 0a  2 nosort t1 *}..
0a30: 23 20 57 68 65 6e 20 63 6f 6e 73 74 72 61 69 6e  # When constrain
0a40: 65 64 20 62 79 20 61 20 55 4e 49 51 55 45 20 69  ed by a UNIQUE i
0a50: 6e 64 65 78 2c 20 74 68 65 20 4f 52 44 45 52 20  ndex, the ORDER 
0a60: 42 59 20 63 6c 61 75 73 65 20 69 73 20 61 6c 77  BY clause is alw
0a70: 61 79 73 20 69 67 6e 6f 72 65 64 2e 0a 23 0a 64  ays ignored..#.d
0a80: 6f 5f 74 65 73 74 20 77 68 65 72 65 32 2d 32 2e  o_test where2-2.
0a90: 31 20 7b 0a 20 20 71 75 65 72 79 70 6c 61 6e 20  1 {.  queryplan 
0aa0: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  {.    SELECT * F
0ab0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 77 3d 38  ROM t1 WHERE w=8
0ac0: 35 20 4f 52 44 45 52 20 42 59 20 72 61 6e 64 6f  5 ORDER BY rando
0ad0: 6d 28 29 3b 0a 20 20 7d 0a 7d 20 7b 38 35 20 36  m();.  }.} {85 6
0ae0: 20 37 33 39 36 20 37 34 30 32 20 6e 6f 73 6f 72   7396 7402 nosor
0af0: 74 20 74 31 20 69 31 77 7d 0a 64 6f 5f 74 65 73  t t1 i1w}.do_tes
0b00: 74 20 77 68 65 72 65 32 2d 32 2e 32 20 7b 0a 20  t where2-2.2 {. 
0b10: 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20   queryplan {.   
0b20: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0b30: 31 20 57 48 45 52 45 20 78 3d 36 20 41 4e 44 20  1 WHERE x=6 AND 
0b40: 79 3d 37 33 39 36 20 4f 52 44 45 52 20 42 59 20  y=7396 ORDER BY 
0b50: 72 61 6e 64 6f 6d 28 29 3b 0a 20 20 7d 0a 7d 20  random();.  }.} 
0b60: 7b 38 35 20 36 20 37 33 39 36 20 37 34 30 32 20  {85 6 7396 7402 
0b70: 73 6f 72 74 20 74 31 20 69 31 78 79 7d 0a 64 6f  sort t1 i1xy}.do
0b80: 5f 74 65 73 74 20 77 68 65 72 65 32 2d 32 2e 33  _test where2-2.3
0b90: 20 7b 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b   {.  queryplan {
0ba0: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
0bb0: 4f 4d 20 74 31 20 57 48 45 52 45 20 72 6f 77 69  OM t1 WHERE rowi
0bc0: 64 3d 38 35 20 41 4e 44 20 78 3d 36 20 41 4e 44  d=85 AND x=6 AND
0bd0: 20 79 3d 37 33 39 36 20 4f 52 44 45 52 20 42 59   y=7396 ORDER BY
0be0: 20 72 61 6e 64 6f 6d 28 29 3b 0a 20 20 7d 0a 7d   random();.  }.}
0bf0: 20 7b 38 35 20 36 20 37 33 39 36 20 37 34 30 32   {85 6 7396 7402
0c00: 20 6e 6f 73 6f 72 74 20 74 31 20 2a 7d 0a 0a 0a   nosort t1 *}...
0c10: 23 20 45 66 66 69 63 69 65 6e 74 20 68 61 6e 64  # Efficient hand
0c20: 6c 69 6e 67 20 6f 66 20 66 6f 72 77 61 72 64 20  ling of forward 
0c30: 61 6e 64 20 72 65 76 65 72 73 65 20 74 61 62 6c  and reverse tabl
0c40: 65 20 73 63 61 6e 73 2e 0a 23 0a 64 6f 5f 74 65  e scans..#.do_te
0c50: 73 74 20 77 68 65 72 65 32 2d 33 2e 31 20 7b 0a  st where2-3.1 {.
0c60: 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20    queryplan {.  
0c70: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
0c80: 74 31 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69  t1 ORDER BY rowi
0c90: 64 20 4c 49 4d 49 54 20 32 0a 20 20 7d 0a 7d 20  d LIMIT 2.  }.} 
0ca0: 7b 31 20 30 20 34 20 34 20 32 20 31 20 39 20 31  {1 0 4 4 2 1 9 1
0cb0: 30 20 6e 6f 73 6f 72 74 20 74 31 20 2a 7d 0a 64  0 nosort t1 *}.d
0cc0: 6f 5f 74 65 73 74 20 77 68 65 72 65 32 2d 33 2e  o_test where2-3.
0cd0: 32 20 7b 0a 20 20 71 75 65 72 79 70 6c 61 6e 20  2 {.  queryplan 
0ce0: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  {.    SELECT * F
0cf0: 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20  ROM t1 ORDER BY 
0d00: 72 6f 77 69 64 20 44 45 53 43 20 4c 49 4d 49 54  rowid DESC LIMIT
0d10: 20 32 0a 20 20 7d 0a 7d 20 7b 31 30 30 20 36 20   2.  }.} {100 6 
0d20: 31 30 32 30 31 20 31 30 32 30 37 20 39 39 20 36  10201 10207 99 6
0d30: 20 31 30 30 30 30 20 31 30 30 30 36 20 6e 6f 73   10000 10006 nos
0d40: 6f 72 74 20 74 31 20 2a 7d 0a 0a 23 20 54 68 65  ort t1 *}..# The
0d50: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 63 61 6e   IN operator can
0d60: 20 62 65 20 75 73 65 64 20 62 79 20 69 6e 64 69   be used by indi
0d70: 63 65 73 20 61 74 20 6d 75 6c 74 69 70 6c 65 20  ces at multiple 
0d80: 6c 61 79 65 72 73 0a 23 0a 69 66 63 61 70 61 62  layers.#.ifcapab
0d90: 6c 65 20 73 75 62 71 75 65 72 79 20 7b 0a 20 20  le subquery {.  
0da0: 64 6f 5f 74 65 73 74 20 77 68 65 72 65 32 2d 34  do_test where2-4
0db0: 2e 31 20 7b 0a 20 20 20 20 71 75 65 72 79 70 6c  .1 {.    querypl
0dc0: 61 6e 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43  an {.      SELEC
0dd0: 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
0de0: 45 20 7a 20 49 4e 20 28 31 30 32 30 37 2c 31 30  E z IN (10207,10
0df0: 30 30 36 29 20 41 4e 44 20 79 20 49 4e 20 28 31  006) AND y IN (1
0e00: 30 30 30 30 2c 31 30 32 30 31 29 0a 20 20 20 20  0000,10201).    
0e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e20: 20 20 20 41 4e 44 20 78 3e 30 20 41 4e 44 20 78     AND x>0 AND x
0e30: 3c 31 30 0a 20 20 20 20 20 20 4f 52 44 45 52 20  <10.      ORDER 
0e40: 42 59 20 77 0a 20 20 20 20 7d 0a 20 20 7d 20 7b  BY w.    }.  } {
0e50: 39 39 20 36 20 31 30 30 30 30 20 31 30 30 30 36  99 6 10000 10006
0e60: 20 31 30 30 20 36 20 31 30 32 30 31 20 31 30 32   100 6 10201 102
0e70: 30 37 20 73 6f 72 74 20 74 31 20 69 31 7a 79 78  07 sort t1 i1zyx
0e80: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 68 65 72  }.  do_test wher
0e90: 65 32 2d 34 2e 32 20 7b 0a 20 20 20 20 71 75 65  e2-4.2 {.    que
0ea0: 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 20 20 53  ryplan {.      S
0eb0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
0ec0: 57 48 45 52 45 20 7a 20 49 4e 20 28 31 30 32 30  WHERE z IN (1020
0ed0: 37 2c 31 30 30 30 36 29 20 41 4e 44 20 79 3d 31  7,10006) AND y=1
0ee0: 30 30 30 30 0a 20 20 20 20 20 20 20 20 20 20 20  0000.           
0ef0: 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20              AND 
0f00: 78 3e 30 20 41 4e 44 20 78 3c 31 30 0a 20 20 20  x>0 AND x<10.   
0f10: 20 20 20 4f 52 44 45 52 20 42 59 20 77 0a 20 20     ORDER BY w.  
0f20: 20 20 7d 0a 20 20 7d 20 7b 39 39 20 36 20 31 30    }.  } {99 6 10
0f30: 30 30 30 20 31 30 30 30 36 20 73 6f 72 74 20 74  000 10006 sort t
0f40: 31 20 69 31 7a 79 78 7d 0a 20 20 64 6f 5f 74 65  1 i1zyx}.  do_te
0f50: 73 74 20 77 68 65 72 65 32 2d 34 2e 33 20 7b 0a  st where2-4.3 {.
0f60: 20 20 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a      queryplan {.
0f70: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
0f80: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3d 31  ROM t1 WHERE z=1
0f90: 30 30 30 36 20 41 4e 44 20 79 20 49 4e 20 28 31  0006 AND y IN (1
0fa0: 30 30 30 30 2c 31 30 32 30 31 29 0a 20 20 20 20  0000,10201).    
0fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fc0: 20 20 20 41 4e 44 20 78 3e 30 20 41 4e 44 20 78     AND x>0 AND x
0fd0: 3c 31 30 0a 20 20 20 20 20 20 4f 52 44 45 52 20  <10.      ORDER 
0fe0: 42 59 20 77 0a 20 20 20 20 7d 0a 20 20 7d 20 7b  BY w.    }.  } {
0ff0: 39 39 20 36 20 31 30 30 30 30 20 31 30 30 30 36  99 6 10000 10006
1000: 20 73 6f 72 74 20 74 31 20 69 31 7a 79 78 7d 0a   sort t1 i1zyx}.
1010: 20 20 69 66 63 61 70 61 62 6c 65 20 63 6f 6d 70    ifcapable comp
1020: 6f 75 6e 64 20 7b 0a 20 20 20 20 64 6f 5f 74 65  ound {.    do_te
1030: 73 74 20 77 68 65 72 65 32 2d 34 2e 34 20 7b 0a  st where2-4.4 {.
1040: 20 20 20 20 20 20 71 75 65 72 79 70 6c 61 6e 20        queryplan 
1050: 7b 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  {.        SELECT
1060: 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
1070: 20 7a 20 49 4e 20 28 53 45 4c 45 43 54 20 31 30   z IN (SELECT 10
1080: 32 30 37 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54  207 UNION SELECT
1090: 20 31 30 30 30 36 29 0a 20 20 20 20 20 20 20 20   10006).        
10a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b0: 20 41 4e 44 20 79 20 49 4e 20 28 31 30 30 30 30   AND y IN (10000
10c0: 2c 31 30 32 30 31 29 0a 20 20 20 20 20 20 20 20  ,10201).        
10d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e0: 20 41 4e 44 20 78 3e 30 20 41 4e 44 20 78 3c 31   AND x>0 AND x<1
10f0: 30 0a 20 20 20 20 20 20 20 20 4f 52 44 45 52 20  0.        ORDER 
1100: 42 59 20 77 0a 20 20 20 20 20 20 7d 0a 20 20 20  BY w.      }.   
1110: 20 7d 20 7b 39 39 20 36 20 31 30 30 30 30 20 31   } {99 6 10000 1
1120: 30 30 30 36 20 31 30 30 20 36 20 31 30 32 30 31  0006 100 6 10201
1130: 20 31 30 32 30 37 20 73 6f 72 74 20 74 31 20 69   10207 sort t1 i
1140: 31 7a 79 78 7d 0a 20 20 20 20 64 6f 5f 74 65 73  1zyx}.    do_tes
1150: 74 20 77 68 65 72 65 32 2d 34 2e 35 20 7b 0a 20  t where2-4.5 {. 
1160: 20 20 20 20 20 71 75 65 72 79 70 6c 61 6e 20 7b       queryplan {
1170: 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  .        SELECT 
1180: 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
1190: 7a 20 49 4e 20 28 53 45 4c 45 43 54 20 31 30 32  z IN (SELECT 102
11a0: 30 37 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20  07 UNION SELECT 
11b0: 31 30 30 30 36 29 0a 20 20 20 20 20 20 20 20 20  10006).         
11c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d0: 41 4e 44 20 79 20 49 4e 20 28 53 45 4c 45 43 54  AND y IN (SELECT
11e0: 20 31 30 30 30 30 20 55 4e 49 4f 4e 20 53 45 4c   10000 UNION SEL
11f0: 45 43 54 20 31 30 32 30 31 29 0a 20 20 20 20 20  ECT 10201).     
1200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1210: 20 20 20 20 41 4e 44 20 78 3e 30 20 41 4e 44 20      AND x>0 AND 
1220: 78 3c 31 30 0a 20 20 20 20 20 20 20 20 4f 52 44  x<10.        ORD
1230: 45 52 20 42 59 20 77 0a 20 20 20 20 20 20 7d 0a  ER BY w.      }.
1240: 20 20 20 20 7d 20 7b 39 39 20 36 20 31 30 30 30      } {99 6 1000
1250: 30 20 31 30 30 30 36 20 31 30 30 20 36 20 31 30  0 10006 100 6 10
1260: 32 30 31 20 31 30 32 30 37 20 73 6f 72 74 20 74  201 10207 sort t
1270: 31 20 69 31 7a 79 78 7d 0a 20 20 7d 0a 20 20 64  1 i1zyx}.  }.  d
1280: 6f 5f 74 65 73 74 20 77 68 65 72 65 32 2d 34 2e  o_test where2-4.
1290: 36 20 7b 0a 20 20 20 20 71 75 65 72 79 70 6c 61  6 {.    querypla
12a0: 6e 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  n {.      SELECT
12b0: 20 2a 20 46 52 4f 4d 20 74 31 0a 20 20 20 20 20   * FROM t1.     
12c0: 20 20 57 48 45 52 45 20 78 20 49 4e 20 28 31 2c    WHERE x IN (1,
12d0: 32 2c 33 2c 34 2c 35 2c 36 2c 37 2c 38 29 0a 20  2,3,4,5,6,7,8). 
12e0: 20 20 20 20 20 20 20 20 41 4e 44 20 79 20 49 4e          AND y IN
12f0: 20 28 31 30 30 30 30 2c 31 30 30 30 31 2c 31 30   (10000,10001,10
1300: 30 30 32 2c 31 30 30 30 33 2c 31 30 30 30 34 2c  002,10003,10004,
1310: 31 30 30 30 35 29 0a 20 20 20 20 20 20 20 4f 52  10005).       OR
1320: 44 45 52 20 42 59 20 32 0a 20 20 20 20 7d 0a 20  DER BY 2.    }. 
1330: 20 7d 20 7b 39 39 20 36 20 31 30 30 30 30 20 31   } {99 6 10000 1
1340: 30 30 30 36 20 73 6f 72 74 20 74 31 20 69 31 78  0006 sort t1 i1x
1350: 79 7d 0a 0a 20 20 23 20 44 75 70 6c 69 63 61 74  y}..  # Duplicat
1360: 65 20 65 6e 74 69 72 65 73 20 6f 6e 20 74 68 65  e entires on the
1370: 20 52 48 53 20 6f 66 20 61 6e 20 49 4e 20 6f 70   RHS of an IN op
1380: 65 72 61 74 6f 72 20 64 6f 20 6e 6f 74 20 63 61  erator do not ca
1390: 75 73 65 20 64 75 70 6c 69 63 61 74 65 0a 20 20  use duplicate.  
13a0: 23 20 6f 75 74 70 75 74 20 72 6f 77 73 2e 0a 20  # output rows.. 
13b0: 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 77 68 65   #.  do_test whe
13c0: 72 65 32 2d 34 2e 36 20 7b 0a 20 20 20 20 71 75  re2-4.6 {.    qu
13d0: 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 20 20  eryplan {.      
13e0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
13f0: 20 57 48 45 52 45 20 7a 20 49 4e 20 28 31 30 32   WHERE z IN (102
1400: 30 37 2c 31 30 30 30 36 2c 31 30 30 30 36 2c 31  07,10006,10006,1
1410: 30 32 30 37 29 0a 20 20 20 20 20 20 4f 52 44 45  0207).      ORDE
1420: 52 20 42 59 20 77 0a 20 20 20 20 7d 0a 20 20 7d  R BY w.    }.  }
1430: 20 7b 39 39 20 36 20 31 30 30 30 30 20 31 30 30   {99 6 10000 100
1440: 30 36 20 31 30 30 20 36 20 31 30 32 30 31 20 31  06 100 6 10201 1
1450: 30 32 30 37 20 73 6f 72 74 20 74 31 20 69 31 7a  0207 sort t1 i1z
1460: 79 78 7d 0a 20 20 69 66 63 61 70 61 62 6c 65 20  yx}.  ifcapable 
1470: 63 6f 6d 70 6f 75 6e 64 20 7b 0a 20 20 20 20 64  compound {.    d
1480: 6f 5f 74 65 73 74 20 77 68 65 72 65 32 2d 34 2e  o_test where2-4.
1490: 37 20 7b 0a 20 20 20 20 20 20 71 75 65 72 79 70  7 {.      queryp
14a0: 6c 61 6e 20 7b 0a 20 20 20 20 20 20 20 20 53 45  lan {.        SE
14b0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
14c0: 48 45 52 45 20 7a 20 49 4e 20 28 0a 20 20 20 20  HERE z IN (.    
14d0: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 31 30         SELECT 10
14e0: 32 30 37 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45  207 UNION ALL SE
14f0: 4c 45 43 54 20 31 30 30 30 36 0a 20 20 20 20 20  LECT 10006.     
1500: 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20        UNION ALL 
1510: 53 45 4c 45 43 54 20 31 30 30 30 36 20 55 4e 49  SELECT 10006 UNI
1520: 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 31 30  ON ALL SELECT 10
1530: 32 30 37 29 0a 20 20 20 20 20 20 20 20 4f 52 44  207).        ORD
1540: 45 52 20 42 59 20 77 0a 20 20 20 20 20 20 7d 0a  ER BY w.      }.
1550: 20 20 20 20 7d 20 7b 39 39 20 36 20 31 30 30 30      } {99 6 1000
1560: 30 20 31 30 30 30 36 20 31 30 30 20 36 20 31 30  0 10006 100 6 10
1570: 32 30 31 20 31 30 32 30 37 20 73 6f 72 74 20 74  201 10207 sort t
1580: 31 20 69 31 7a 79 78 7d 0a 20 20 7d 0a 0a 7d 20  1 i1zyx}.  }..} 
1590: 3b 23 20 69 66 63 61 70 61 62 6c 65 20 73 75 62  ;# ifcapable sub
15a0: 71 75 65 72 79 0a 0a 23 20 54 68 65 20 75 73 65  query..# The use
15b0: 20 6f 66 20 61 6e 20 49 4e 20 6f 70 65 72 61 74   of an IN operat
15c0: 6f 72 20 64 69 73 61 62 6c 65 73 20 74 68 65 20  or disables the 
15d0: 69 6e 64 65 78 20 61 73 20 61 20 73 6f 72 74 65  index as a sorte
15e0: 72 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 77 68 65  r..#.do_test whe
15f0: 72 65 32 2d 35 2e 31 20 7b 0a 20 20 71 75 65 72  re2-5.1 {.  quer
1600: 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45  yplan {.    SELE
1610: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
1620: 52 45 20 77 3d 39 39 20 4f 52 44 45 52 20 42 59  RE w=99 ORDER BY
1630: 20 77 0a 20 20 7d 0a 7d 20 7b 39 39 20 36 20 31   w.  }.} {99 6 1
1640: 30 30 30 30 20 31 30 30 30 36 20 6e 6f 73 6f 72  0000 10006 nosor
1650: 74 20 74 31 20 69 31 77 7d 0a 0a 69 66 63 61 70  t t1 i1w}..ifcap
1660: 61 62 6c 65 20 73 75 62 71 75 65 72 79 20 7b 0a  able subquery {.
1670: 20 20 64 6f 5f 74 65 73 74 20 77 68 65 72 65 32    do_test where2
1680: 2d 35 2e 32 20 7b 0a 20 20 20 20 71 75 65 72 79  -5.2 {.    query
1690: 70 6c 61 6e 20 7b 0a 20 20 20 20 20 20 53 45 4c  plan {.      SEL
16a0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
16b0: 45 52 45 20 77 20 49 4e 20 28 39 39 29 20 4f 52  ERE w IN (99) OR
16c0: 44 45 52 20 42 59 20 77 0a 20 20 20 20 7d 0a 20  DER BY w.    }. 
16d0: 20 7d 20 7b 39 39 20 36 20 31 30 30 30 30 20 31   } {99 6 10000 1
16e0: 30 30 30 36 20 73 6f 72 74 20 74 31 20 69 31 77  0006 sort t1 i1w
16f0: 7d 0a 7d 0a 0a 23 20 56 65 72 69 66 79 20 74 68  }.}..# Verify th
1700: 61 74 20 4f 52 20 63 6c 61 75 73 65 73 20 67 65  at OR clauses ge
1710: 74 20 74 72 61 6e 73 6c 61 74 65 64 20 69 6e 74  t translated int
1720: 6f 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 2e 0a  o IN operators..
1730: 23 0a 73 65 74 20 3a 3a 69 64 78 20 7b 7d 0a 69  #.set ::idx {}.i
1740: 66 63 61 70 61 62 6c 65 20 73 75 62 71 75 65 72  fcapable subquer
1750: 79 20 7b 73 65 74 20 3a 3a 69 64 78 20 69 31 77  y {set ::idx i1w
1760: 7d 0a 64 6f 5f 74 65 73 74 20 77 68 65 72 65 32  }.do_test where2
1770: 2d 36 2e 31 2e 31 20 7b 0a 20 20 71 75 65 72 79  -6.1.1 {.  query
1780: 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43  plan {.    SELEC
1790: 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
17a0: 45 20 77 3d 39 39 20 4f 52 20 77 3d 31 30 30 20  E w=99 OR w=100 
17b0: 4f 52 44 45 52 20 42 59 20 2b 77 0a 20 20 7d 0a  ORDER BY +w.  }.
17c0: 7d 20 5b 6c 69 73 74 20 39 39 20 36 20 31 30 30  } [list 99 6 100
17d0: 30 30 20 31 30 30 30 36 20 31 30 30 20 36 20 31  00 10006 100 6 1
17e0: 30 32 30 31 20 31 30 32 30 37 20 73 6f 72 74 20  0201 10207 sort 
17f0: 74 31 20 24 3a 3a 69 64 78 5d 0a 64 6f 5f 74 65  t1 $::idx].do_te
1800: 73 74 20 77 68 65 72 65 32 2d 36 2e 31 2e 32 20  st where2-6.1.2 
1810: 7b 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a  {.  queryplan {.
1820: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
1830: 4d 20 74 31 20 57 48 45 52 45 20 39 39 3d 77 20  M t1 WHERE 99=w 
1840: 4f 52 20 31 30 30 3d 77 20 4f 52 44 45 52 20 42  OR 100=w ORDER B
1850: 59 20 2b 77 0a 20 20 7d 0a 7d 20 5b 6c 69 73 74  Y +w.  }.} [list
1860: 20 39 39 20 36 20 31 30 30 30 30 20 31 30 30 30   99 6 10000 1000
1870: 36 20 31 30 30 20 36 20 31 30 32 30 31 20 31 30  6 100 6 10201 10
1880: 32 30 37 20 73 6f 72 74 20 74 31 20 24 3a 3a 69  207 sort t1 $::i
1890: 64 78 5d 0a 64 6f 5f 74 65 73 74 20 77 68 65 72  dx].do_test wher
18a0: 65 32 2d 36 2e 32 20 7b 0a 20 20 71 75 65 72 79  e2-6.2 {.  query
18b0: 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43  plan {.    SELEC
18c0: 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
18d0: 45 20 77 3d 39 39 20 4f 52 20 77 3d 31 30 30 20  E w=99 OR w=100 
18e0: 4f 52 20 36 3d 77 20 4f 52 44 45 52 20 42 59 20  OR 6=w ORDER BY 
18f0: 2b 77 0a 20 20 7d 0a 7d 20 5b 6c 69 73 74 20 36  +w.  }.} [list 6
1900: 20 32 20 34 39 20 35 31 20 39 39 20 36 20 31 30   2 49 51 99 6 10
1910: 30 30 30 20 31 30 30 30 36 20 31 30 30 20 36 20  000 10006 100 6 
1920: 31 30 32 30 31 20 31 30 32 30 37 20 73 6f 72 74  10201 10207 sort
1930: 20 74 31 20 24 3a 3a 69 64 78 5d 0a 0a 64 6f 5f   t1 $::idx]..do_
1940: 74 65 73 74 20 77 68 65 72 65 32 2d 36 2e 33 20  test where2-6.3 
1950: 7b 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a  {.  queryplan {.
1960: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
1970: 4d 20 74 31 20 57 48 45 52 45 20 77 3d 39 39 20  M t1 WHERE w=99 
1980: 4f 52 20 77 3d 31 30 30 20 4f 52 20 36 3d 2b 77  OR w=100 OR 6=+w
1990: 20 4f 52 44 45 52 20 42 59 20 2b 77 0a 20 20 7d   ORDER BY +w.  }
19a0: 0a 7d 20 7b 36 20 32 20 34 39 20 35 31 20 39 39  .} {6 2 49 51 99
19b0: 20 36 20 31 30 30 30 30 20 31 30 30 30 36 20 31   6 10000 10006 1
19c0: 30 30 20 36 20 31 30 32 30 31 20 31 30 32 30 37  00 6 10201 10207
19d0: 20 73 6f 72 74 20 74 31 20 7b 7d 7d 0a 64 6f 5f   sort t1 {}}.do_
19e0: 74 65 73 74 20 77 68 65 72 65 32 2d 36 2e 34 20  test where2-6.4 
19f0: 7b 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a  {.  queryplan {.
1a00: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
1a10: 4d 20 74 31 20 57 48 45 52 45 20 77 3d 39 39 20  M t1 WHERE w=99 
1a20: 4f 52 20 2b 77 3d 31 30 30 20 4f 52 20 36 3d 77  OR +w=100 OR 6=w
1a30: 20 4f 52 44 45 52 20 42 59 20 2b 77 0a 20 20 7d   ORDER BY +w.  }
1a40: 0a 7d 20 7b 36 20 32 20 34 39 20 35 31 20 39 39  .} {6 2 49 51 99
1a50: 20 36 20 31 30 30 30 30 20 31 30 30 30 36 20 31   6 10000 10006 1
1a60: 30 30 20 36 20 31 30 32 30 31 20 31 30 32 30 37  00 6 10201 10207
1a70: 20 73 6f 72 74 20 74 31 20 7b 7d 7d 0a 0a 73 65   sort t1 {}}..se
1a80: 74 20 3a 3a 69 64 78 20 7b 7d 0a 69 66 63 61 70  t ::idx {}.ifcap
1a90: 61 62 6c 65 20 73 75 62 71 75 65 72 79 20 7b 73  able subquery {s
1aa0: 65 74 20 3a 3a 69 64 78 20 69 31 7a 79 78 7d 0a  et ::idx i1zyx}.
1ab0: 64 6f 5f 74 65 73 74 20 77 68 65 72 65 32 2d 36  do_test where2-6
1ac0: 2e 35 20 7b 0a 20 20 71 75 65 72 79 70 6c 61 6e  .5 {.  queryplan
1ad0: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 62 2e   {.    SELECT b.
1ae0: 2a 20 46 52 4f 4d 20 74 31 20 61 2c 20 74 31 20  * FROM t1 a, t1 
1af0: 62 0a 20 20 20 20 20 57 48 45 52 45 20 61 2e 77  b.     WHERE a.w
1b00: 3d 31 20 41 4e 44 20 28 61 2e 79 3d 62 2e 7a 20  =1 AND (a.y=b.z 
1b10: 4f 52 20 62 2e 7a 3d 31 30 29 0a 20 20 20 20 20  OR b.z=10).     
1b20: 4f 52 44 45 52 20 42 59 20 2b 62 2e 77 0a 20 20  ORDER BY +b.w.  
1b30: 7d 0a 7d 20 5b 6c 69 73 74 20 31 20 30 20 34 20  }.} [list 1 0 4 
1b40: 34 20 32 20 31 20 39 20 31 30 20 73 6f 72 74 20  4 2 1 9 10 sort 
1b50: 61 20 69 31 77 20 62 20 24 3a 3a 69 64 78 5d 0a  a i1w b $::idx].
1b60: 64 6f 5f 74 65 73 74 20 77 68 65 72 65 32 2d 36  do_test where2-6
1b70: 2e 36 20 7b 0a 20 20 71 75 65 72 79 70 6c 61 6e  .6 {.  queryplan
1b80: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 62 2e   {.    SELECT b.
1b90: 2a 20 46 52 4f 4d 20 74 31 20 61 2c 20 74 31 20  * FROM t1 a, t1 
1ba0: 62 0a 20 20 20 20 20 57 48 45 52 45 20 61 2e 77  b.     WHERE a.w
1bb0: 3d 31 20 41 4e 44 20 28 62 2e 7a 3d 31 30 20 4f  =1 AND (b.z=10 O
1bc0: 52 20 61 2e 79 3d 62 2e 7a 20 4f 52 20 62 2e 7a  R a.y=b.z OR b.z
1bd0: 3d 31 30 29 0a 20 20 20 20 20 4f 52 44 45 52 20  =10).     ORDER 
1be0: 42 59 20 2b 62 2e 77 0a 20 20 7d 0a 7d 20 5b 6c  BY +b.w.  }.} [l
1bf0: 69 73 74 20 31 20 30 20 34 20 34 20 32 20 31 20  ist 1 0 4 4 2 1 
1c00: 39 20 31 30 20 73 6f 72 74 20 61 20 69 31 77 20  9 10 sort a i1w 
1c10: 62 20 24 3a 3a 69 64 78 5d 0a 0a 23 20 54 69 63  b $::idx]..# Tic
1c20: 6b 65 74 20 23 32 32 34 39 2e 20 20 4d 61 6b 65  ket #2249.  Make
1c30: 20 73 75 72 65 20 74 68 65 20 4f 52 20 6f 70 74   sure the OR opt
1c40: 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 6e 6f 74  imization is not
1c50: 20 61 74 74 65 6d 70 74 65 64 20 69 66 0a 23 20   attempted if.# 
1c60: 63 6f 6d 70 61 72 69 73 6f 6e 73 20 62 65 74 77  comparisons betw
1c70: 65 65 6e 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64  een columns of d
1c80: 69 66 66 65 72 65 6e 74 20 61 66 66 69 6e 69 74  ifferent affinit
1c90: 69 65 73 20 61 72 65 20 6e 65 65 64 65 64 2e 0a  ies are needed..
1ca0: 23 0a 64 6f 5f 74 65 73 74 20 77 68 65 72 65 32  #.do_test where2
1cb0: 2d 36 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c  -6.7 {.  execsql
1cc0: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
1cd0: 42 4c 45 20 74 32 32 34 39 61 28 61 20 54 45 58  BLE t2249a(a TEX
1ce0: 54 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20 43  T UNIQUE);.    C
1cf0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 32 34  REATE TABLE t224
1d00: 39 62 28 62 20 49 4e 54 45 47 45 52 29 3b 0a 20  9b(b INTEGER);. 
1d10: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1d20: 32 32 34 39 61 20 56 41 4c 55 45 53 28 27 30 31  2249a VALUES('01
1d30: 32 33 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  23');.    INSERT
1d40: 20 49 4e 54 4f 20 74 32 32 34 39 62 20 56 41 4c   INTO t2249b VAL
1d50: 55 45 53 28 31 32 33 29 3b 0a 20 20 7d 0a 20 20  UES(123);.  }.  
1d60: 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20  queryplan {.    
1d70: 2d 2d 20 42 65 63 61 75 73 65 20 61 20 69 73 20  -- Because a is 
1d80: 74 79 70 65 20 54 45 58 54 20 61 6e 64 20 62 20  type TEXT and b 
1d90: 69 73 20 74 79 70 65 20 49 4e 54 45 47 45 52 2c  is type INTEGER,
1da0: 20 62 6f 74 68 20 61 20 61 6e 64 20 62 0a 20 20   both a and b.  
1db0: 20 20 2d 2d 20 77 69 6c 6c 20 61 74 74 65 6d 70    -- will attemp
1dc0: 74 20 74 6f 20 63 6f 6e 76 65 72 74 20 74 6f 20  t to convert to 
1dd0: 4e 55 4d 45 52 49 43 20 62 65 66 6f 72 65 20 74  NUMERIC before t
1de0: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 20  he comparison.. 
1df0: 20 20 20 2d 2d 20 54 68 65 79 20 77 69 6c 6c 20     -- They will 
1e00: 74 68 75 73 20 63 6f 6d 70 61 72 65 20 65 71 75  thus compare equ
1e10: 61 6c 2e 0a 20 20 20 20 2d 2d 0a 20 20 20 20 53  al..    --.    S
1e20: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 32  ELECT * FROM t22
1e30: 34 39 62 20 43 52 4f 53 53 20 4a 4f 49 4e 20 74  49b CROSS JOIN t
1e40: 32 32 34 39 61 20 57 48 45 52 45 20 61 3d 62 3b  2249a WHERE a=b;
1e50: 0a 20 20 7d 0a 7d 20 7b 31 32 33 20 30 31 32 33  .  }.} {123 0123
1e60: 20 6e 6f 73 6f 72 74 20 74 32 32 34 39 62 20 7b   nosort t2249b {
1e70: 7d 20 74 32 32 34 39 61 20 7b 7d 7d 0a 64 6f 5f  } t2249a {}}.do_
1e80: 74 65 73 74 20 77 68 65 72 65 32 2d 36 2e 39 20  test where2-6.9 
1e90: 7b 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a  {.  queryplan {.
1ea0: 20 20 20 20 2d 2d 20 54 68 65 20 2b 20 6f 70 65      -- The + ope
1eb0: 72 61 74 6f 72 20 72 65 6d 6f 76 65 73 20 61 66  rator removes af
1ec0: 66 69 6e 69 74 79 20 66 72 6f 6d 20 74 68 65 20  finity from the 
1ed0: 72 68 73 2e 20 20 4e 6f 20 63 6f 6e 76 65 72 73  rhs.  No convers
1ee0: 69 6f 6e 73 0a 20 20 20 20 2d 2d 20 6f 63 63 75  ions.    -- occu
1ef0: 72 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 61 72  r and the compar
1f00: 69 73 6f 6e 20 69 73 20 66 61 6c 73 65 2e 20 20  ison is false.  
1f10: 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 6e  The result is an
1f20: 20 65 6d 70 74 79 20 73 65 74 2e 0a 20 20 20 20   empty set..    
1f30: 2d 2d 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  --.    SELECT * 
1f40: 46 52 4f 4d 20 74 32 32 34 39 62 20 43 52 4f 53  FROM t2249b CROS
1f50: 53 20 4a 4f 49 4e 20 74 32 32 34 39 61 20 57 48  S JOIN t2249a WH
1f60: 45 52 45 20 61 3d 2b 62 3b 0a 20 20 7d 0a 7d 20  ERE a=+b;.  }.} 
1f70: 7b 6e 6f 73 6f 72 74 20 74 32 32 34 39 62 20 7b  {nosort t2249b {
1f80: 7d 20 7b 7d 20 73 71 6c 69 74 65 5f 61 75 74 6f  } {} sqlite_auto
1f90: 69 6e 64 65 78 5f 74 32 32 34 39 61 5f 31 7d 0a  index_t2249a_1}.
1fa0: 64 6f 5f 74 65 73 74 20 77 68 65 72 65 32 2d 36  do_test where2-6
1fb0: 2e 39 2e 32 20 7b 0a 20 20 23 20 54 68 65 20 73  .9.2 {.  # The s
1fc0: 61 6d 65 20 74 68 69 6e 67 20 62 75 74 20 77 69  ame thing but wi
1fd0: 74 68 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  th the expressio
1fe0: 6e 20 66 6c 69 70 70 65 64 20 61 72 6f 75 6e 64  n flipped around
1ff0: 2e 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a  ..  queryplan {.
2000: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
2010: 4d 20 74 32 32 34 39 62 20 43 52 4f 53 53 20 4a  M t2249b CROSS J
2020: 4f 49 4e 20 74 32 32 34 39 61 20 57 48 45 52 45  OIN t2249a WHERE
2030: 20 2b 62 3d 61 0a 20 20 7d 0a 7d 20 7b 6e 6f 73   +b=a.  }.} {nos
2040: 6f 72 74 20 74 32 32 34 39 62 20 7b 7d 20 7b 7d  ort t2249b {} {}
2050: 20 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65   sqlite_autoinde
2060: 78 5f 74 32 32 34 39 61 5f 31 7d 0a 64 6f 5f 74  x_t2249a_1}.do_t
2070: 65 73 74 20 77 68 65 72 65 32 2d 36 2e 31 30 20  est where2-6.10 
2080: 7b 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a  {.  queryplan {.
2090: 20 20 20 20 2d 2d 20 55 73 65 20 2b 20 6f 6e 20      -- Use + on 
20a0: 62 6f 74 68 20 73 69 64 65 73 20 6f 66 20 74 68  both sides of th
20b0: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 74 6f 20  e comparison to 
20c0: 64 69 73 61 62 6c 65 20 69 6e 64 69 63 65 73 0a  disable indices.
20d0: 20 20 20 20 2d 2d 20 63 6f 6d 70 6c 65 74 65 6c      -- completel
20e0: 79 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 77 65  y.  Make sure we
20f0: 20 67 65 74 20 74 68 65 20 73 61 6d 65 20 72 65   get the same re
2100: 73 75 6c 74 2e 0a 20 20 20 20 2d 2d 0a 20 20 20  sult..    --.   
2110: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
2120: 32 32 34 39 62 20 43 52 4f 53 53 20 4a 4f 49 4e  2249b CROSS JOIN
2130: 20 74 32 32 34 39 61 20 57 48 45 52 45 20 2b 61   t2249a WHERE +a
2140: 3d 2b 62 3b 0a 20 20 7d 0a 7d 20 7b 6e 6f 73 6f  =+b;.  }.} {noso
2150: 72 74 20 74 32 32 34 39 62 20 7b 7d 20 74 32 32  rt t2249b {} t22
2160: 34 39 61 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20  49a {}}.do_test 
2170: 77 68 65 72 65 32 2d 36 2e 31 31 20 7b 0a 20 20  where2-6.11 {.  
2180: 23 20 54 68 69 73 20 77 69 6c 6c 20 6e 6f 74 20  # This will not 
2190: 61 74 74 65 6d 70 74 20 74 68 65 20 4f 52 20 6f  attempt the OR o
21a0: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 62 65 63 61  ptimization beca
21b0: 75 73 65 20 6f 66 20 74 68 65 20 61 3d 62 0a 20  use of the a=b. 
21c0: 20 23 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 20   # comparison.. 
21d0: 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20   queryplan {.   
21e0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
21f0: 32 32 34 39 62 20 43 52 4f 53 53 20 4a 4f 49 4e  2249b CROSS JOIN
2200: 20 74 32 32 34 39 61 20 57 48 45 52 45 20 61 3d   t2249a WHERE a=
2210: 62 20 4f 52 20 61 3d 27 68 65 6c 6c 6f 27 3b 0a  b OR a='hello';.
2220: 20 20 7d 0a 7d 20 7b 31 32 33 20 30 31 32 33 20    }.} {123 0123 
2230: 6e 6f 73 6f 72 74 20 74 32 32 34 39 62 20 7b 7d  nosort t2249b {}
2240: 20 74 32 32 34 39 61 20 7b 7d 7d 0a 64 6f 5f 74   t2249a {}}.do_t
2250: 65 73 74 20 77 68 65 72 65 32 2d 36 2e 31 31 2e  est where2-6.11.
2260: 32 20 7b 0a 20 20 23 20 50 65 72 6d 75 74 61 74  2 {.  # Permutat
2270: 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70 72  ions of the expr
2280: 65 73 73 69 6f 6e 20 74 65 72 6d 73 2e 0a 20 20  ession terms..  
2290: 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20  queryplan {.    
22a0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
22b0: 32 34 39 62 20 43 52 4f 53 53 20 4a 4f 49 4e 20  249b CROSS JOIN 
22c0: 74 32 32 34 39 61 20 57 48 45 52 45 20 62 3d 61  t2249a WHERE b=a
22d0: 20 4f 52 20 61 3d 27 68 65 6c 6c 6f 27 3b 0a 20   OR a='hello';. 
22e0: 20 7d 0a 7d 20 7b 31 32 33 20 30 31 32 33 20 6e   }.} {123 0123 n
22f0: 6f 73 6f 72 74 20 74 32 32 34 39 62 20 7b 7d 20  osort t2249b {} 
2300: 74 32 32 34 39 61 20 7b 7d 7d 0a 64 6f 5f 74 65  t2249a {}}.do_te
2310: 73 74 20 77 68 65 72 65 32 2d 36 2e 31 31 2e 33  st where2-6.11.3
2320: 20 7b 0a 20 20 23 20 50 65 72 6d 75 74 61 74 69   {.  # Permutati
2330: 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70 72 65  ons of the expre
2340: 73 73 69 6f 6e 20 74 65 72 6d 73 2e 0a 20 20 71  ssion terms..  q
2350: 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53  ueryplan {.    S
2360: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 32  ELECT * FROM t22
2370: 34 39 62 20 43 52 4f 53 53 20 4a 4f 49 4e 20 74  49b CROSS JOIN t
2380: 32 32 34 39 61 20 57 48 45 52 45 20 27 68 65 6c  2249a WHERE 'hel
2390: 6c 6f 27 3d 61 20 4f 52 20 62 3d 61 3b 0a 20 20  lo'=a OR b=a;.  
23a0: 7d 0a 7d 20 7b 31 32 33 20 30 31 32 33 20 6e 6f  }.} {123 0123 no
23b0: 73 6f 72 74 20 74 32 32 34 39 62 20 7b 7d 20 74  sort t2249b {} t
23c0: 32 32 34 39 61 20 7b 7d 7d 0a 64 6f 5f 74 65 73  2249a {}}.do_tes
23d0: 74 20 77 68 65 72 65 32 2d 36 2e 31 31 2e 34 20  t where2-6.11.4 
23e0: 7b 0a 20 20 23 20 50 65 72 6d 75 74 61 74 69 6f  {.  # Permutatio
23f0: 6e 73 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ns of the expres
2400: 73 69 6f 6e 20 74 65 72 6d 73 2e 0a 20 20 71 75  sion terms..  qu
2410: 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45  eryplan {.    SE
2420: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 32 34  LECT * FROM t224
2430: 39 62 20 43 52 4f 53 53 20 4a 4f 49 4e 20 74 32  9b CROSS JOIN t2
2440: 32 34 39 61 20 57 48 45 52 45 20 61 3d 27 68 65  249a WHERE a='he
2450: 6c 6c 6f 27 20 4f 52 20 62 3d 61 3b 0a 20 20 7d  llo' OR b=a;.  }
2460: 0a 7d 20 7b 31 32 33 20 30 31 32 33 20 6e 6f 73  .} {123 0123 nos
2470: 6f 72 74 20 74 32 32 34 39 62 20 7b 7d 20 74 32  ort t2249b {} t2
2480: 32 34 39 61 20 7b 7d 7d 0a 69 66 63 61 70 61 62  249a {}}.ifcapab
2490: 6c 65 20 65 78 70 6c 61 69 6e 26 26 73 75 62 71  le explain&&subq
24a0: 75 65 72 79 20 7b 0a 20 20 23 20 54 68 65 73 65  uery {.  # These
24b0: 20 74 65 73 74 73 20 61 72 65 20 6e 6f 74 20 72   tests are not r
24c0: 75 6e 20 69 66 20 73 75 62 71 75 65 72 79 20 73  un if subquery s
24d0: 75 70 70 6f 72 74 20 69 73 20 6e 6f 74 20 69 6e  upport is not in
24e0: 63 6c 75 64 65 64 20 69 6e 20 74 68 65 0a 20 20  cluded in the.  
24f0: 23 20 62 75 69 6c 64 2e 20 54 68 69 73 20 69 73  # build. This is
2500: 20 62 65 63 61 75 73 65 20 74 68 65 73 65 20 74   because these t
2510: 65 73 74 73 20 74 65 73 74 20 74 68 65 20 22 61  ests test the "a
2520: 20 3d 20 31 20 4f 52 20 61 20 3d 20 32 22 20 74   = 1 OR a = 2" t
2530: 6f 0a 20 20 23 20 22 61 20 49 4e 20 28 31 2c 20  o.  # "a IN (1, 
2540: 32 29 22 20 6f 70 74 69 6d 69 73 61 74 69 6f 6e  2)" optimisation
2550: 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 2c   transformation,
2560: 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20 65 6e   which is not en
2570: 61 62 6c 65 64 20 69 66 0a 20 20 23 20 73 75 62  abled if.  # sub
2580: 71 75 65 72 69 65 73 20 61 6e 64 20 74 68 65 20  queries and the 
2590: 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 6e  IN operator is n
25a0: 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 0a 20 20  ot available..  
25b0: 23 0a 20 20 64 6f 5f 74 65 73 74 20 77 68 65 72  #.  do_test wher
25c0: 65 32 2d 36 2e 31 32 20 7b 0a 20 20 20 20 23 20  e2-6.12 {.    # 
25d0: 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68  In this case, th
25e0: 65 20 2b 62 20 64 69 73 61 62 6c 65 73 20 74 68  e +b disables th
25f0: 65 20 61 66 66 69 6e 69 74 79 20 63 6f 6e 66 6c  e affinity confl
2600: 69 63 74 20 61 6e 64 20 61 6c 6c 6f 77 73 0a 20  ict and allows. 
2610: 20 20 20 23 20 74 68 65 20 4f 52 20 6f 70 74 69     # the OR opti
2620: 6d 69 7a 61 74 69 6f 6e 20 74 6f 20 62 65 20 75  mization to be u
2630: 73 65 64 20 61 67 61 69 6e 2e 20 20 54 68 65 20  sed again.  The 
2640: 72 65 73 75 6c 74 20 69 73 20 6e 6f 77 20 61 6e  result is now an
2650: 20 65 6d 70 74 79 0a 20 20 20 20 23 20 73 65 74   empty.    # set
2660: 2c 20 74 68 65 20 73 61 6d 65 20 61 73 20 69 6e  , the same as in
2670: 20 77 68 65 72 65 32 2d 36 2e 39 2e 0a 20 20 20   where2-6.9..   
2680: 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20   queryplan {.   
2690: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
26a0: 20 74 32 32 34 39 62 20 43 52 4f 53 53 20 4a 4f   t2249b CROSS JO
26b0: 49 4e 20 74 32 32 34 39 61 20 57 48 45 52 45 20  IN t2249a WHERE 
26c0: 61 3d 2b 62 20 4f 52 20 61 3d 27 68 65 6c 6c 6f  a=+b OR a='hello
26d0: 27 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 6e 6f  ';.    }.  } {no
26e0: 73 6f 72 74 20 74 32 32 34 39 62 20 7b 7d 20 7b  sort t2249b {} {
26f0: 7d 20 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64  } sqlite_autoind
2700: 65 78 5f 74 32 32 34 39 61 5f 31 7d 0a 20 20 64  ex_t2249a_1}.  d
2710: 6f 5f 74 65 73 74 20 77 68 65 72 65 32 2d 36 2e  o_test where2-6.
2720: 31 32 2e 32 20 7b 0a 20 20 20 20 23 20 49 6e 20  12.2 {.    # In 
2730: 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 2b  this case, the +
2740: 62 20 64 69 73 61 62 6c 65 73 20 74 68 65 20 61  b disables the a
2750: 66 66 69 6e 69 74 79 20 63 6f 6e 66 6c 69 63 74  ffinity conflict
2760: 20 61 6e 64 20 61 6c 6c 6f 77 73 0a 20 20 20 20   and allows.    
2770: 23 20 74 68 65 20 4f 52 20 6f 70 74 69 6d 69 7a  # the OR optimiz
2780: 61 74 69 6f 6e 20 74 6f 20 62 65 20 75 73 65 64  ation to be used
2790: 20 61 67 61 69 6e 2e 20 20 54 68 65 20 72 65 73   again.  The res
27a0: 75 6c 74 20 69 73 20 6e 6f 77 20 61 6e 20 65 6d  ult is now an em
27b0: 70 74 79 0a 20 20 20 20 23 20 73 65 74 2c 20 74  pty.    # set, t
27c0: 68 65 20 73 61 6d 65 20 61 73 20 69 6e 20 77 68  he same as in wh
27d0: 65 72 65 32 2d 36 2e 39 2e 0a 20 20 20 20 71 75  ere2-6.9..    qu
27e0: 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 20 20  eryplan {.      
27f0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
2800: 32 34 39 62 20 43 52 4f 53 53 20 4a 4f 49 4e 20  249b CROSS JOIN 
2810: 74 32 32 34 39 61 20 57 48 45 52 45 20 61 3d 27  t2249a WHERE a='
2820: 68 65 6c 6c 6f 27 20 4f 52 20 2b 62 3d 61 3b 0a  hello' OR +b=a;.
2830: 20 20 20 20 7d 0a 20 20 7d 20 7b 6e 6f 73 6f 72      }.  } {nosor
2840: 74 20 74 32 32 34 39 62 20 7b 7d 20 7b 7d 20 73  t t2249b {} {} s
2850: 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f  qlite_autoindex_
2860: 74 32 32 34 39 61 5f 31 7d 0a 20 20 64 6f 5f 74  t2249a_1}.  do_t
2870: 65 73 74 20 77 68 65 72 65 32 2d 36 2e 31 32 2e  est where2-6.12.
2880: 33 20 7b 0a 20 20 20 20 23 20 49 6e 20 74 68 69  3 {.    # In thi
2890: 73 20 63 61 73 65 2c 20 74 68 65 20 2b 62 20 64  s case, the +b d
28a0: 69 73 61 62 6c 65 73 20 74 68 65 20 61 66 66 69  isables the affi
28b0: 6e 69 74 79 20 63 6f 6e 66 6c 69 63 74 20 61 6e  nity conflict an
28c0: 64 20 61 6c 6c 6f 77 73 0a 20 20 20 20 23 20 74  d allows.    # t
28d0: 68 65 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69  he OR optimizati
28e0: 6f 6e 20 74 6f 20 62 65 20 75 73 65 64 20 61 67  on to be used ag
28f0: 61 69 6e 2e 20 20 54 68 65 20 72 65 73 75 6c 74  ain.  The result
2900: 20 69 73 20 6e 6f 77 20 61 6e 20 65 6d 70 74 79   is now an empty
2910: 0a 20 20 20 20 23 20 73 65 74 2c 20 74 68 65 20  .    # set, the 
2920: 73 61 6d 65 20 61 73 20 69 6e 20 77 68 65 72 65  same as in where
2930: 32 2d 36 2e 39 2e 0a 20 20 20 20 71 75 65 72 79  2-6.9..    query
2940: 70 6c 61 6e 20 7b 0a 20 20 20 20 20 20 53 45 4c  plan {.      SEL
2950: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 32 34 39  ECT * FROM t2249
2960: 62 20 43 52 4f 53 53 20 4a 4f 49 4e 20 74 32 32  b CROSS JOIN t22
2970: 34 39 61 20 57 48 45 52 45 20 2b 62 3d 61 20 4f  49a WHERE +b=a O
2980: 52 20 61 3d 27 68 65 6c 6c 6f 27 3b 0a 20 20 20  R a='hello';.   
2990: 20 7d 0a 20 20 7d 20 7b 6e 6f 73 6f 72 74 20 74   }.  } {nosort t
29a0: 32 32 34 39 62 20 7b 7d 20 7b 7d 20 73 71 6c 69  2249b {} {} sqli
29b0: 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 74 32 32  te_autoindex_t22
29c0: 34 39 61 5f 31 7d 0a 20 20 64 6f 5f 74 65 73 74  49a_1}.  do_test
29d0: 20 77 68 65 72 65 32 2d 36 2e 31 33 20 7b 0a 20   where2-6.13 {. 
29e0: 20 20 20 23 20 54 68 65 20 61 64 64 69 74 69 6f     # The additio
29f0: 6e 20 6f 66 20 2b 61 20 6f 6e 20 74 68 65 20 73  n of +a on the s
2a00: 65 63 6f 6e 64 20 74 65 72 6d 20 64 69 73 61 62  econd term disab
2a10: 6c 65 64 20 74 68 65 20 4f 52 20 6f 70 74 69 6d  led the OR optim
2a20: 69 7a 61 74 69 6f 6e 2e 0a 20 20 20 20 23 20 42  ization..    # B
2a30: 75 74 20 77 65 20 73 68 6f 75 6c 64 20 73 74 69  ut we should sti
2a40: 6c 6c 20 67 65 74 20 74 68 65 20 73 61 6d 65 20  ll get the same 
2a50: 65 6d 70 74 79 2d 73 65 74 20 72 65 73 75 6c 74  empty-set result
2a60: 20 61 73 20 69 6e 20 77 68 65 72 65 32 2d 36 2e   as in where2-6.
2a70: 39 2e 0a 20 20 20 20 71 75 65 72 79 70 6c 61 6e  9..    queryplan
2a80: 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20   {.      SELECT 
2a90: 2a 20 46 52 4f 4d 20 74 32 32 34 39 62 20 43 52  * FROM t2249b CR
2aa0: 4f 53 53 20 4a 4f 49 4e 20 74 32 32 34 39 61 20  OSS JOIN t2249a 
2ab0: 57 48 45 52 45 20 61 3d 2b 62 20 4f 52 20 2b 61  WHERE a=+b OR +a
2ac0: 3d 27 68 65 6c 6c 6f 27 3b 0a 20 20 20 20 7d 0a  ='hello';.    }.
2ad0: 20 20 7d 20 7b 6e 6f 73 6f 72 74 20 74 32 32 34    } {nosort t224
2ae0: 39 62 20 7b 7d 20 74 32 32 34 39 61 20 7b 7d 7d  9b {} t2249a {}}
2af0: 0a 7d 0a 0a 23 20 56 61 72 69 61 74 69 6f 6e 73  .}..# Variations
2b00: 20 6f 6e 20 74 68 65 20 6f 72 64 65 72 20 6f 66   on the order of
2b10: 20 74 65 72 6d 73 20 69 6e 20 61 20 57 48 45 52   terms in a WHER
2b20: 45 20 63 6c 61 75 73 65 20 69 6e 20 6f 72 64 65  E clause in orde
2b30: 72 0a 23 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  r.# to make sure
2b40: 20 74 68 65 20 4f 52 20 6f 70 74 69 6d 69 7a 65   the OR optimize
2b50: 72 20 63 61 6e 20 72 65 63 6f 67 6e 69 7a 65 20  r can recognize 
2b60: 74 68 65 6d 20 61 6c 6c 2e 0a 64 6f 5f 74 65 73  them all..do_tes
2b70: 74 20 77 68 65 72 65 32 2d 36 2e 32 30 20 7b 0a  t where2-6.20 {.
2b80: 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20    queryplan {.  
2b90: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
2ba0: 74 32 32 34 39 61 20 78 20 43 52 4f 53 53 20 4a  t2249a x CROSS J
2bb0: 4f 49 4e 20 74 32 32 34 39 61 20 79 20 57 48 45  OIN t2249a y WHE
2bc0: 52 45 20 78 2e 61 3d 79 2e 61 0a 20 20 7d 0a 7d  RE x.a=y.a.  }.}
2bd0: 20 7b 30 31 32 33 20 30 31 32 33 20 6e 6f 73 6f   {0123 0123 noso
2be0: 72 74 20 78 20 7b 7d 20 7b 7d 20 73 71 6c 69 74  rt x {} {} sqlit
2bf0: 65 5f 61 75 74 6f 69 6e 64 65 78 5f 74 32 32 34  e_autoindex_t224
2c00: 39 61 5f 31 7d 0a 69 66 63 61 70 61 62 6c 65 20  9a_1}.ifcapable 
2c10: 65 78 70 6c 61 69 6e 26 26 73 75 62 71 75 65 72  explain&&subquer
2c20: 79 20 7b 0a 20 20 23 20 54 68 65 73 65 20 74 65  y {.  # These te
2c30: 73 74 73 20 61 72 65 20 6e 6f 74 20 72 75 6e 20  sts are not run 
2c40: 69 66 20 73 75 62 71 75 65 72 79 20 73 75 70 70  if subquery supp
2c50: 6f 72 74 20 69 73 20 6e 6f 74 20 69 6e 63 6c 75  ort is not inclu
2c60: 64 65 64 20 69 6e 20 74 68 65 0a 20 20 23 20 62  ded in the.  # b
2c70: 75 69 6c 64 2e 20 54 68 69 73 20 69 73 20 62 65  uild. This is be
2c80: 63 61 75 73 65 20 74 68 65 73 65 20 74 65 73 74  cause these test
2c90: 73 20 74 65 73 74 20 74 68 65 20 22 61 20 3d 20  s test the "a = 
2ca0: 31 20 4f 52 20 61 20 3d 20 32 22 20 74 6f 0a 20  1 OR a = 2" to. 
2cb0: 20 23 20 22 61 20 49 4e 20 28 31 2c 20 32 29 22   # "a IN (1, 2)"
2cc0: 20 6f 70 74 69 6d 69 73 61 74 69 6f 6e 20 74 72   optimisation tr
2cd0: 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 2c 20 77 68  ansformation, wh
2ce0: 69 63 68 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c  ich is not enabl
2cf0: 65 64 20 69 66 0a 20 20 23 20 73 75 62 71 75 65  ed if.  # subque
2d00: 72 69 65 73 20 61 6e 64 20 74 68 65 20 49 4e 20  ries and the IN 
2d10: 6f 70 65 72 61 74 6f 72 20 69 73 20 6e 6f 74 20  operator is not 
2d20: 61 76 61 69 6c 61 62 6c 65 2e 0a 20 20 23 0a 20  available..  #. 
2d30: 20 64 6f 5f 74 65 73 74 20 77 68 65 72 65 32 2d   do_test where2-
2d40: 36 2e 32 31 20 7b 0a 20 20 20 20 71 75 65 72 79  6.21 {.    query
2d50: 70 6c 61 6e 20 7b 0a 20 20 20 20 20 20 53 45 4c  plan {.      SEL
2d60: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 32 34 39  ECT * FROM t2249
2d70: 61 20 78 20 43 52 4f 53 53 20 4a 4f 49 4e 20 74  a x CROSS JOIN t
2d80: 32 32 34 39 61 20 79 20 57 48 45 52 45 20 78 2e  2249a y WHERE x.
2d90: 61 3d 79 2e 61 20 4f 52 20 79 2e 61 3d 27 68 65  a=y.a OR y.a='he
2da0: 6c 6c 6f 27 0a 20 20 20 20 7d 0a 20 20 7d 20 7b  llo'.    }.  } {
2db0: 30 31 32 33 20 30 31 32 33 20 6e 6f 73 6f 72 74  0123 0123 nosort
2dc0: 20 78 20 7b 7d 20 7b 7d 20 73 71 6c 69 74 65 5f   x {} {} sqlite_
2dd0: 61 75 74 6f 69 6e 64 65 78 5f 74 32 32 34 39 61  autoindex_t2249a
2de0: 5f 31 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 68  _1}.  do_test wh
2df0: 65 72 65 32 2d 36 2e 32 32 20 7b 0a 20 20 20 20  ere2-6.22 {.    
2e00: 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20  queryplan {.    
2e10: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
2e20: 74 32 32 34 39 61 20 78 20 43 52 4f 53 53 20 4a  t2249a x CROSS J
2e30: 4f 49 4e 20 74 32 32 34 39 61 20 79 20 57 48 45  OIN t2249a y WHE
2e40: 52 45 20 79 2e 61 3d 78 2e 61 20 4f 52 20 79 2e  RE y.a=x.a OR y.
2e50: 61 3d 27 68 65 6c 6c 6f 27 0a 20 20 20 20 7d 0a  a='hello'.    }.
2e60: 20 20 7d 20 7b 30 31 32 33 20 30 31 32 33 20 6e    } {0123 0123 n
2e70: 6f 73 6f 72 74 20 78 20 7b 7d 20 7b 7d 20 73 71  osort x {} {} sq
2e80: 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 74  lite_autoindex_t
2e90: 32 32 34 39 61 5f 31 7d 0a 20 20 64 6f 5f 74 65  2249a_1}.  do_te
2ea0: 73 74 20 77 68 65 72 65 32 2d 36 2e 32 33 20 7b  st where2-6.23 {
2eb0: 0a 20 20 20 20 71 75 65 72 79 70 6c 61 6e 20 7b  .    queryplan {
2ec0: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .      SELECT * 
2ed0: 46 52 4f 4d 20 74 32 32 34 39 61 20 78 20 43 52  FROM t2249a x CR
2ee0: 4f 53 53 20 4a 4f 49 4e 20 74 32 32 34 39 61 20  OSS JOIN t2249a 
2ef0: 79 20 57 48 45 52 45 20 79 2e 61 3d 27 68 65 6c  y WHERE y.a='hel
2f00: 6c 6f 27 20 4f 52 20 78 2e 61 3d 79 2e 61 0a 20  lo' OR x.a=y.a. 
2f10: 20 20 20 7d 0a 20 20 7d 20 7b 30 31 32 33 20 30     }.  } {0123 0
2f20: 31 32 33 20 6e 6f 73 6f 72 74 20 78 20 7b 7d 20  123 nosort x {} 
2f30: 7b 7d 20 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e  {} sqlite_autoin
2f40: 64 65 78 5f 74 32 32 34 39 61 5f 31 7d 0a 7d 0a  dex_t2249a_1}.}.
2f50: 0a 23 20 55 6e 69 71 75 65 20 71 75 65 72 69 65  .# Unique querie
2f60: 73 20 28 71 75 65 72 69 65 73 20 74 68 61 74 20  s (queries that 
2f70: 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74  are guaranteed t
2f80: 6f 20 72 65 74 75 72 6e 20 6f 6e 6c 79 20 61 20  o return only a 
2f90: 73 69 6e 67 6c 65 0a 23 20 72 6f 77 20 6f 66 20  single.# row of 
2fa0: 72 65 73 75 6c 74 29 20 64 6f 20 6e 6f 74 20 63  result) do not c
2fb0: 61 6c 6c 20 74 68 65 20 73 6f 72 74 65 72 2e 20  all the sorter. 
2fc0: 20 42 75 74 20 61 6c 6c 20 74 61 62 6c 65 73 20   But all tables 
2fd0: 6d 75 73 74 20 67 69 76 65 0a 23 20 61 20 75 6e  must give.# a un
2fe0: 69 71 75 65 20 72 65 73 75 6c 74 2e 20 20 49 66  ique result.  If
2ff0: 20 61 6e 79 20 6f 6e 65 20 74 61 62 6c 65 20 69   any one table i
3000: 6e 20 74 68 65 20 6a 6f 69 6e 20 64 6f 65 73 20  n the join does 
3010: 6e 6f 74 20 67 69 76 65 20 61 20 75 6e 69 71 75  not give a uniqu
3020: 65 0a 23 20 72 65 73 75 6c 74 20 74 68 65 6e 20  e.# result then 
3030: 73 6f 72 74 69 6e 67 20 69 73 20 6e 65 63 65 73  sorting is neces
3040: 73 61 72 79 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  sary..#.do_test 
3050: 77 68 65 72 65 32 2d 37 2e 31 20 7b 0a 20 20 63  where2-7.1 {.  c
3060: 6b 73 6f 72 74 20 7b 0a 20 20 20 20 63 72 65 61  ksort {.    crea
3070: 74 65 20 74 61 62 6c 65 20 74 38 28 61 20 75 6e  te table t8(a un
3080: 69 71 75 65 2c 20 62 2c 20 63 29 3b 0a 20 20 20  ique, b, c);.   
3090: 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 74 38 20   insert into t8 
30a0: 76 61 6c 75 65 73 28 31 2c 32 2c 33 29 3b 0a 20  values(1,2,3);. 
30b0: 20 20 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 74     insert into t
30c0: 38 20 76 61 6c 75 65 73 28 32 2c 33 2c 34 29 3b  8 values(2,3,4);
30d0: 0a 20 20 20 20 63 72 65 61 74 65 20 74 61 62 6c  .    create tabl
30e0: 65 20 74 39 28 78 2c 79 29 3b 0a 20 20 20 20 69  e t9(x,y);.    i
30f0: 6e 73 65 72 74 20 69 6e 74 6f 20 74 39 20 76 61  nsert into t9 va
3100: 6c 75 65 73 28 32 2c 34 29 3b 0a 20 20 20 20 69  lues(2,4);.    i
3110: 6e 73 65 72 74 20 69 6e 74 6f 20 74 39 20 76 61  nsert into t9 va
3120: 6c 75 65 73 28 32 2c 33 29 3b 0a 20 20 20 20 73  lues(2,3);.    s
3130: 65 6c 65 63 74 20 79 20 66 72 6f 6d 20 74 38 2c  elect y from t8,
3140: 20 74 39 20 77 68 65 72 65 20 61 3d 31 20 6f 72   t9 where a=1 or
3150: 64 65 72 20 62 79 20 61 2c 20 79 3b 0a 20 20 7d  der by a, y;.  }
3160: 0a 7d 20 7b 33 20 34 20 73 6f 72 74 7d 0a 64 6f  .} {3 4 sort}.do
3170: 5f 74 65 73 74 20 77 68 65 72 65 32 2d 37 2e 32  _test where2-7.2
3180: 20 7b 0a 20 20 63 6b 73 6f 72 74 20 7b 0a 20 20   {.  cksort {.  
3190: 20 20 73 65 6c 65 63 74 20 2a 20 66 72 6f 6d 20    select * from 
31a0: 74 38 20 77 68 65 72 65 20 61 3d 31 20 6f 72 64  t8 where a=1 ord
31b0: 65 72 20 62 79 20 62 2c 20 63 0a 20 20 7d 0a 7d  er by b, c.  }.}
31c0: 20 7b 31 20 32 20 33 20 6e 6f 73 6f 72 74 7d 0a   {1 2 3 nosort}.
31d0: 64 6f 5f 74 65 73 74 20 77 68 65 72 65 32 2d 37  do_test where2-7
31e0: 2e 33 20 7b 0a 20 20 63 6b 73 6f 72 74 20 7b 0a  .3 {.  cksort {.
31f0: 20 20 20 20 73 65 6c 65 63 74 20 2a 20 66 72 6f      select * fro
3200: 6d 20 74 38 2c 20 74 39 20 77 68 65 72 65 20 61  m t8, t9 where a
3210: 3d 31 20 61 6e 64 20 79 3d 33 20 6f 72 64 65 72  =1 and y=3 order
3220: 20 62 79 20 62 2c 20 78 0a 20 20 7d 0a 7d 20 7b   by b, x.  }.} {
3230: 31 20 32 20 33 20 32 20 33 20 73 6f 72 74 7d 0a  1 2 3 2 3 sort}.
3240: 64 6f 5f 74 65 73 74 20 77 68 65 72 65 32 2d 37  do_test where2-7
3250: 2e 34 20 7b 0a 20 20 63 6b 73 6f 72 74 20 7b 0a  .4 {.  cksort {.
3260: 20 20 20 20 63 72 65 61 74 65 20 75 6e 69 71 75      create uniqu
3270: 65 20 69 6e 64 65 78 20 69 39 79 20 6f 6e 20 74  e index i9y on t
3280: 39 28 79 29 3b 0a 20 20 20 20 73 65 6c 65 63 74  9(y);.    select
3290: 20 2a 20 66 72 6f 6d 20 74 38 2c 20 74 39 20 77   * from t8, t9 w
32a0: 68 65 72 65 20 61 3d 31 20 61 6e 64 20 79 3d 33  here a=1 and y=3
32b0: 20 6f 72 64 65 72 20 62 79 20 62 2c 20 78 0a 20   order by b, x. 
32c0: 20 7d 0a 7d 20 7b 31 20 32 20 33 20 32 20 33 20   }.} {1 2 3 2 3 
32d0: 6e 6f 73 6f 72 74 7d 0a 0a 23 20 54 69 63 6b 65  nosort}..# Ticke
32e0: 74 20 23 31 38 30 37 2e 20 20 55 73 69 6e 67 20  t #1807.  Using 
32f0: 49 4e 20 63 6f 6e 73 74 72 61 69 6e 73 20 6f 6e  IN constrains on
3300: 20 6d 75 6c 74 69 70 6c 65 20 63 6f 6c 75 6d 6e   multiple column
3310: 73 20 6f 66 0a 23 20 61 20 6d 75 6c 74 69 2d 63  s of.# a multi-c
3320: 6f 6c 75 6d 6e 20 69 6e 64 65 78 2e 0a 23 0a 69  olumn index..#.i
3330: 66 63 61 70 61 62 6c 65 20 73 75 62 71 75 65 72  fcapable subquer
3340: 79 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 77 68  y {.  do_test wh
3350: 65 72 65 32 2d 38 2e 31 20 7b 0a 20 20 20 20 65  ere2-8.1 {.    e
3360: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53  xecsql {.      S
3370: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
3380: 57 48 45 52 45 20 78 20 49 4e 20 28 32 30 2c 32  WHERE x IN (20,2
3390: 31 29 20 41 4e 44 20 79 20 49 4e 20 28 31 2c 32  1) AND y IN (1,2
33a0: 29 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20  ).    }.  } {}. 
33b0: 20 64 6f 5f 74 65 73 74 20 77 68 65 72 65 32 2d   do_test where2-
33c0: 38 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71  8.2 {.    execsq
33d0: 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  l {.      SELECT
33e0: 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
33f0: 20 78 20 49 4e 20 28 31 2c 32 29 20 41 4e 44 20   x IN (1,2) AND 
3400: 79 20 49 4e 20 28 2d 35 2c 2d 36 29 0a 20 20 20  y IN (-5,-6).   
3410: 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 65 78 65 63   }.  } {}.  exec
3420: 73 71 6c 20 7b 43 52 45 41 54 45 20 54 41 42 4c  sql {CREATE TABL
3430: 45 20 74 78 20 41 53 20 53 45 4c 45 43 54 20 2a  E tx AS SELECT *
3440: 20 46 52 4f 4d 20 74 31 7d 0a 20 20 64 6f 5f 74   FROM t1}.  do_t
3450: 65 73 74 20 77 68 65 72 65 32 2d 38 2e 33 20 7b  est where2-8.3 {
3460: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
3470: 20 20 20 20 20 53 45 4c 45 43 54 20 77 20 46 52       SELECT w FR
3480: 4f 4d 20 74 31 0a 20 20 20 20 20 20 20 57 48 45  OM t1.       WHE
3490: 52 45 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20  RE x IN (SELECT 
34a0: 78 20 46 52 4f 4d 20 74 78 20 57 48 45 52 45 20  x FROM tx WHERE 
34b0: 72 6f 77 69 64 3c 30 29 0a 20 20 20 20 20 20 20  rowid<0).       
34c0: 20 20 41 4e 44 20 2b 79 20 49 4e 20 28 53 45 4c    AND +y IN (SEL
34d0: 45 43 54 20 79 20 46 52 4f 4d 20 74 78 20 57 48  ECT y FROM tx WH
34e0: 45 52 45 20 72 6f 77 69 64 3d 31 29 0a 20 20 20  ERE rowid=1).   
34f0: 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74   }.  } {}.  do_t
3500: 65 73 74 20 77 68 65 72 65 32 2d 38 2e 34 20 7b  est where2-8.4 {
3510: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
3520: 20 20 20 20 20 53 45 4c 45 43 54 20 77 20 46 52       SELECT w FR
3530: 4f 4d 20 74 31 0a 20 20 20 20 20 20 20 57 48 45  OM t1.       WHE
3540: 52 45 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20  RE x IN (SELECT 
3550: 78 20 46 52 4f 4d 20 74 78 20 57 48 45 52 45 20  x FROM tx WHERE 
3560: 72 6f 77 69 64 3d 31 29 0a 20 20 20 20 20 20 20  rowid=1).       
3570: 20 20 41 4e 44 20 79 20 49 4e 20 28 53 45 4c 45    AND y IN (SELE
3580: 43 54 20 79 20 46 52 4f 4d 20 74 78 20 57 48 45  CT y FROM tx WHE
3590: 52 45 20 72 6f 77 69 64 3c 30 29 0a 20 20 20 20  RE rowid<0).    
35a0: 7d 0a 20 20 7d 20 7b 7d 0a 20 20 23 73 65 74 20  }.  } {}.  #set 
35b0: 73 71 6c 69 74 65 5f 77 68 65 72 65 5f 74 72 61  sqlite_where_tra
35c0: 63 65 20 31 0a 20 20 64 6f 5f 74 65 73 74 20 77  ce 1.  do_test w
35d0: 68 65 72 65 32 2d 38 2e 35 20 7b 0a 20 20 20 20  here2-8.5 {.    
35e0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
35f0: 43 52 45 41 54 45 20 49 4e 44 45 58 20 74 78 5f  CREATE INDEX tx_
3600: 78 79 7a 20 4f 4e 20 74 78 28 78 2c 20 79 2c 20  xyz ON tx(x, y, 
3610: 7a 2c 20 77 29 3b 0a 20 20 20 20 20 20 53 45 4c  z, w);.      SEL
3620: 45 43 54 20 77 20 46 52 4f 4d 20 74 78 0a 20 20  ECT w FROM tx.  
3630: 20 20 20 20 20 57 48 45 52 45 20 78 20 49 4e 20       WHERE x IN 
3640: 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74  (SELECT x FROM t
3650: 31 20 57 48 45 52 45 20 77 20 42 45 54 57 45 45  1 WHERE w BETWEE
3660: 4e 20 31 30 20 41 4e 44 20 32 30 29 0a 20 20 20  N 10 AND 20).   
3670: 20 20 20 20 20 20 41 4e 44 20 79 20 49 4e 20 28        AND y IN (
3680: 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 31  SELECT y FROM t1
3690: 20 57 48 45 52 45 20 77 20 42 45 54 57 45 45 4e   WHERE w BETWEEN
36a0: 20 31 30 20 41 4e 44 20 32 30 29 0a 20 20 20 20   10 AND 20).    
36b0: 20 20 20 20 20 41 4e 44 20 7a 20 49 4e 20 28 53       AND z IN (S
36c0: 45 4c 45 43 54 20 7a 20 46 52 4f 4d 20 74 31 20  ELECT z FROM t1 
36d0: 57 48 45 52 45 20 77 20 42 45 54 57 45 45 4e 20  WHERE w BETWEEN 
36e0: 31 32 20 41 4e 44 20 31 34 29 0a 20 20 20 20 7d  12 AND 14).    }
36f0: 0a 20 20 7d 20 7b 31 32 20 31 33 20 31 34 7d 0a  .  } {12 13 14}.
3700: 20 20 64 6f 5f 74 65 73 74 20 77 68 65 72 65 32    do_test where2
3710: 2d 38 2e 36 20 7b 0a 20 20 20 20 65 78 65 63 73  -8.6 {.    execs
3720: 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43  ql {.      SELEC
3730: 54 20 77 20 46 52 4f 4d 20 74 78 0a 20 20 20 20  T w FROM tx.    
3740: 20 20 20 57 48 45 52 45 20 78 20 49 4e 20 28 53     WHERE x IN (S
3750: 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20  ELECT x FROM t1 
3760: 57 48 45 52 45 20 77 20 42 45 54 57 45 45 4e 20  WHERE w BETWEEN 
3770: 31 30 20 41 4e 44 20 32 30 29 0a 20 20 20 20 20  10 AND 20).     
3780: 20 20 20 20 41 4e 44 20 79 20 49 4e 20 28 53 45      AND y IN (SE
3790: 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 31 20 57  LECT y FROM t1 W
37a0: 48 45 52 45 20 77 20 42 45 54 57 45 45 4e 20 31  HERE w BETWEEN 1
37b0: 32 20 41 4e 44 20 31 34 29 0a 20 20 20 20 20 20  2 AND 14).      
37c0: 20 20 20 41 4e 44 20 7a 20 49 4e 20 28 53 45 4c     AND z IN (SEL
37d0: 45 43 54 20 7a 20 46 52 4f 4d 20 74 31 20 57 48  ECT z FROM t1 WH
37e0: 45 52 45 20 77 20 42 45 54 57 45 45 4e 20 31 30  ERE w BETWEEN 10
37f0: 20 41 4e 44 20 32 30 29 0a 20 20 20 20 7d 0a 20   AND 20).    }. 
3800: 20 7d 20 7b 31 32 20 31 33 20 31 34 7d 0a 20 20   } {12 13 14}.  
3810: 64 6f 5f 74 65 73 74 20 77 68 65 72 65 32 2d 38  do_test where2-8
3820: 2e 37 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .7 {.    execsql
3830: 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20   {.      SELECT 
3840: 77 20 46 52 4f 4d 20 74 78 0a 20 20 20 20 20 20  w FROM tx.      
3850: 20 57 48 45 52 45 20 78 20 49 4e 20 28 53 45 4c   WHERE x IN (SEL
3860: 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20 57 48  ECT x FROM t1 WH
3870: 45 52 45 20 77 20 42 45 54 57 45 45 4e 20 31 32  ERE w BETWEEN 12
3880: 20 41 4e 44 20 31 34 29 0a 20 20 20 20 20 20 20   AND 14).       
3890: 20 20 41 4e 44 20 79 20 49 4e 20 28 53 45 4c 45    AND y IN (SELE
38a0: 43 54 20 79 20 46 52 4f 4d 20 74 31 20 57 48 45  CT y FROM t1 WHE
38b0: 52 45 20 77 20 42 45 54 57 45 45 4e 20 31 30 20  RE w BETWEEN 10 
38c0: 41 4e 44 20 32 30 29 0a 20 20 20 20 20 20 20 20  AND 20).        
38d0: 20 41 4e 44 20 7a 20 49 4e 20 28 53 45 4c 45 43   AND z IN (SELEC
38e0: 54 20 7a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T z FROM t1 WHER
38f0: 45 20 77 20 42 45 54 57 45 45 4e 20 31 30 20 41  E w BETWEEN 10 A
3900: 4e 44 20 32 30 29 0a 20 20 20 20 7d 0a 20 20 7d  ND 20).    }.  }
3910: 20 7b 31 30 20 31 31 20 31 32 20 31 33 20 31 34   {10 11 12 13 14
3920: 20 31 35 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77   15}.  do_test w
3930: 68 65 72 65 32 2d 38 2e 38 20 7b 0a 20 20 20 20  here2-8.8 {.    
3940: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
3950: 53 45 4c 45 43 54 20 77 20 46 52 4f 4d 20 74 78  SELECT w FROM tx
3960: 0a 20 20 20 20 20 20 20 57 48 45 52 45 20 78 20  .       WHERE x 
3970: 49 4e 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f  IN (SELECT x FRO
3980: 4d 20 74 31 20 57 48 45 52 45 20 77 20 42 45 54  M t1 WHERE w BET
3990: 57 45 45 4e 20 31 30 20 41 4e 44 20 32 30 29 0a  WEEN 10 AND 20).
39a0: 20 20 20 20 20 20 20 20 20 41 4e 44 20 79 20 49           AND y I
39b0: 4e 20 28 53 45 4c 45 43 54 20 79 20 46 52 4f 4d  N (SELECT y FROM
39c0: 20 74 31 20 57 48 45 52 45 20 77 20 42 45 54 57   t1 WHERE w BETW
39d0: 45 45 4e 20 31 30 20 41 4e 44 20 32 30 29 0a 20  EEN 10 AND 20). 
39e0: 20 20 20 20 20 20 20 20 41 4e 44 20 7a 20 49 4e          AND z IN
39f0: 20 28 53 45 4c 45 43 54 20 7a 20 46 52 4f 4d 20   (SELECT z FROM 
3a00: 74 31 20 57 48 45 52 45 20 77 20 42 45 54 57 45  t1 WHERE w BETWE
3a10: 45 4e 20 31 30 20 41 4e 44 20 32 30 29 0a 20 20  EN 10 AND 20).  
3a20: 20 20 7d 0a 20 20 7d 20 7b 31 30 20 31 31 20 31    }.  } {10 11 1
3a30: 32 20 31 33 20 31 34 20 31 35 20 31 36 20 31 37  2 13 14 15 16 17
3a40: 20 31 38 20 31 39 20 32 30 7d 0a 20 20 64 6f 5f   18 19 20}.  do_
3a50: 74 65 73 74 20 77 68 65 72 65 32 2d 38 2e 39 20  test where2-8.9 
3a60: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  {.    execsql {.
3a70: 20 20 20 20 20 20 53 45 4c 45 43 54 20 77 20 46        SELECT w F
3a80: 52 4f 4d 20 74 78 0a 20 20 20 20 20 20 20 57 48  ROM tx.       WH
3a90: 45 52 45 20 78 20 49 4e 20 28 53 45 4c 45 43 54  ERE x IN (SELECT
3aa0: 20 78 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   x FROM t1 WHERE
3ab0: 20 77 20 42 45 54 57 45 45 4e 20 31 30 20 41 4e   w BETWEEN 10 AN
3ac0: 44 20 32 30 29 0a 20 20 20 20 20 20 20 20 20 41  D 20).         A
3ad0: 4e 44 20 79 20 49 4e 20 28 53 45 4c 45 43 54 20  ND y IN (SELECT 
3ae0: 79 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  y FROM t1 WHERE 
3af0: 77 20 42 45 54 57 45 45 4e 20 31 30 20 41 4e 44  w BETWEEN 10 AND
3b00: 20 32 30 29 0a 20 20 20 20 20 20 20 20 20 41 4e   20).         AN
3b10: 44 20 7a 20 49 4e 20 28 53 45 4c 45 43 54 20 7a  D z IN (SELECT z
3b20: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 77   FROM t1 WHERE w
3b30: 20 42 45 54 57 45 45 4e 20 32 20 41 4e 44 20 34   BETWEEN 2 AND 4
3b40: 29 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20  ).    }.  } {}. 
3b50: 20 64 6f 5f 74 65 73 74 20 77 68 65 72 65 32 2d   do_test where2-
3b60: 38 2e 31 30 20 7b 0a 20 20 20 20 65 78 65 63 73  8.10 {.    execs
3b70: 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43  ql {.      SELEC
3b80: 54 20 77 20 46 52 4f 4d 20 74 78 0a 20 20 20 20  T w FROM tx.    
3b90: 20 20 20 57 48 45 52 45 20 78 20 49 4e 20 28 53     WHERE x IN (S
3ba0: 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20  ELECT x FROM t1 
3bb0: 57 48 45 52 45 20 77 20 42 45 54 57 45 45 4e 20  WHERE w BETWEEN 
3bc0: 31 30 20 41 4e 44 20 32 30 29 0a 20 20 20 20 20  10 AND 20).     
3bd0: 20 20 20 20 41 4e 44 20 79 20 49 4e 20 28 53 45      AND y IN (SE
3be0: 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 31 20 57  LECT y FROM t1 W
3bf0: 48 45 52 45 20 77 20 42 45 54 57 45 45 4e 20 32  HERE w BETWEEN 2
3c00: 20 41 4e 44 20 34 29 0a 20 20 20 20 20 20 20 20   AND 4).        
3c10: 20 41 4e 44 20 7a 20 49 4e 20 28 53 45 4c 45 43   AND z IN (SELEC
3c20: 54 20 7a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T z FROM t1 WHER
3c30: 45 20 77 20 42 45 54 57 45 45 4e 20 31 30 20 41  E w BETWEEN 10 A
3c40: 4e 44 20 32 30 29 0a 20 20 20 20 7d 0a 20 20 7d  ND 20).    }.  }
3c50: 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 68   {}.  do_test wh
3c60: 65 72 65 32 2d 38 2e 31 31 20 7b 0a 20 20 20 20  ere2-8.11 {.    
3c70: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
3c80: 53 45 4c 45 43 54 20 77 20 46 52 4f 4d 20 74 78  SELECT w FROM tx
3c90: 0a 20 20 20 20 20 20 20 57 48 45 52 45 20 78 20  .       WHERE x 
3ca0: 49 4e 20 28 53 45 4c 45 43 54 20 78 20 46 52 4f  IN (SELECT x FRO
3cb0: 4d 20 74 31 20 57 48 45 52 45 20 77 20 42 45 54  M t1 WHERE w BET
3cc0: 57 45 45 4e 20 32 20 41 4e 44 20 34 29 0a 20 20  WEEN 2 AND 4).  
3cd0: 20 20 20 20 20 20 20 41 4e 44 20 79 20 49 4e 20         AND y IN 
3ce0: 28 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74  (SELECT y FROM t
3cf0: 31 20 57 48 45 52 45 20 77 20 42 45 54 57 45 45  1 WHERE w BETWEE
3d00: 4e 20 31 30 20 41 4e 44 20 32 30 29 0a 20 20 20  N 10 AND 20).   
3d10: 20 20 20 20 20 20 41 4e 44 20 7a 20 49 4e 20 28        AND z IN (
3d20: 53 45 4c 45 43 54 20 7a 20 46 52 4f 4d 20 74 31  SELECT z FROM t1
3d30: 20 57 48 45 52 45 20 77 20 42 45 54 57 45 45 4e   WHERE w BETWEEN
3d40: 20 31 30 20 41 4e 44 20 32 30 29 0a 20 20 20 20   10 AND 20).    
3d50: 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  }.  } {}.  do_te
3d60: 73 74 20 77 68 65 72 65 32 2d 38 2e 31 32 20 7b  st where2-8.12 {
3d70: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
3d80: 20 20 20 20 20 53 45 4c 45 43 54 20 77 20 46 52       SELECT w FR
3d90: 4f 4d 20 74 78 0a 20 20 20 20 20 20 20 57 48 45  OM tx.       WHE
3da0: 52 45 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20  RE x IN (SELECT 
3db0: 78 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  x FROM t1 WHERE 
3dc0: 77 20 42 45 54 57 45 45 4e 20 31 30 20 41 4e 44  w BETWEEN 10 AND
3dd0: 20 32 30 29 0a 20 20 20 20 20 20 20 20 20 41 4e   20).         AN
3de0: 44 20 79 20 49 4e 20 28 53 45 4c 45 43 54 20 79  D y IN (SELECT y
3df0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 77   FROM t1 WHERE w
3e00: 20 42 45 54 57 45 45 4e 20 31 30 20 41 4e 44 20   BETWEEN 10 AND 
3e10: 32 30 29 0a 20 20 20 20 20 20 20 20 20 41 4e 44  20).         AND
3e20: 20 7a 20 49 4e 20 28 53 45 4c 45 43 54 20 7a 20   z IN (SELECT z 
3e30: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 77 20  FROM t1 WHERE w 
3e40: 42 45 54 57 45 45 4e 20 2d 34 20 41 4e 44 20 2d  BETWEEN -4 AND -
3e50: 32 29 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a  2).    }.  } {}.
3e60: 20 20 64 6f 5f 74 65 73 74 20 77 68 65 72 65 32    do_test where2
3e70: 2d 38 2e 31 33 20 7b 0a 20 20 20 20 65 78 65 63  -8.13 {.    exec
3e80: 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45  sql {.      SELE
3e90: 43 54 20 77 20 46 52 4f 4d 20 74 78 0a 20 20 20  CT w FROM tx.   
3ea0: 20 20 20 20 57 48 45 52 45 20 78 20 49 4e 20 28      WHERE x IN (
3eb0: 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31  SELECT x FROM t1
3ec0: 20 57 48 45 52 45 20 77 20 42 45 54 57 45 45 4e   WHERE w BETWEEN
3ed0: 20 31 30 20 41 4e 44 20 32 30 29 0a 20 20 20 20   10 AND 20).    
3ee0: 20 20 20 20 20 41 4e 44 20 79 20 49 4e 20 28 53       AND y IN (S
3ef0: 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74 31 20  ELECT y FROM t1 
3f00: 57 48 45 52 45 20 77 20 42 45 54 57 45 45 4e 20  WHERE w BETWEEN 
3f10: 2d 34 20 41 4e 44 20 2d 32 29 0a 20 20 20 20 20  -4 AND -2).     
3f20: 20 20 20 20 41 4e 44 20 7a 20 49 4e 20 28 53 45      AND z IN (SE
3f30: 4c 45 43 54 20 7a 20 46 52 4f 4d 20 74 31 20 57  LECT z FROM t1 W
3f40: 48 45 52 45 20 77 20 42 45 54 57 45 45 4e 20 31  HERE w BETWEEN 1
3f50: 30 20 41 4e 44 20 32 30 29 0a 20 20 20 20 7d 0a  0 AND 20).    }.
3f60: 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74    } {}.  do_test
3f70: 20 77 68 65 72 65 32 2d 38 2e 31 34 20 7b 0a 20   where2-8.14 {. 
3f80: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
3f90: 20 20 20 53 45 4c 45 43 54 20 77 20 46 52 4f 4d     SELECT w FROM
3fa0: 20 74 78 0a 20 20 20 20 20 20 20 57 48 45 52 45   tx.       WHERE
3fb0: 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 78 20   x IN (SELECT x 
3fc0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 77 20  FROM t1 WHERE w 
3fd0: 42 45 54 57 45 45 4e 20 2d 34 20 41 4e 44 20 2d  BETWEEN -4 AND -
3fe0: 32 29 0a 20 20 20 20 20 20 20 20 20 41 4e 44 20  2).         AND 
3ff0: 79 20 49 4e 20 28 53 45 4c 45 43 54 20 79 20 46  y IN (SELECT y F
4000: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 77 20 42  ROM t1 WHERE w B
4010: 45 54 57 45 45 4e 20 31 30 20 41 4e 44 20 32 30  ETWEEN 10 AND 20
4020: 29 0a 20 20 20 20 20 20 20 20 20 41 4e 44 20 7a  ).         AND z
4030: 20 49 4e 20 28 53 45 4c 45 43 54 20 7a 20 46 52   IN (SELECT z FR
4040: 4f 4d 20 74 31 20 57 48 45 52 45 20 77 20 42 45  OM t1 WHERE w BE
4050: 54 57 45 45 4e 20 31 30 20 41 4e 44 20 32 30 29  TWEEN 10 AND 20)
4060: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20  .    }.  } {}.  
4070: 64 6f 5f 74 65 73 74 20 77 68 65 72 65 32 2d 38  do_test where2-8
4080: 2e 31 35 20 7b 0a 20 20 20 20 65 78 65 63 73 71  .15 {.    execsq
4090: 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  l {.      SELECT
40a0: 20 77 20 46 52 4f 4d 20 74 78 0a 20 20 20 20 20   w FROM tx.     
40b0: 20 20 57 48 45 52 45 20 78 20 49 4e 20 28 53 45    WHERE x IN (SE
40c0: 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20 57  LECT x FROM t1 W
40d0: 48 45 52 45 20 77 20 42 45 54 57 45 45 4e 20 31  HERE w BETWEEN 1
40e0: 30 20 41 4e 44 20 32 30 29 0a 20 20 20 20 20 20  0 AND 20).      
40f0: 20 20 20 41 4e 44 20 79 20 49 4e 20 28 53 45 4c     AND y IN (SEL
4100: 45 43 54 20 79 20 46 52 4f 4d 20 74 31 20 57 48  ECT y FROM t1 WH
4110: 45 52 45 20 77 20 42 45 54 57 45 45 4e 20 31 30  ERE w BETWEEN 10
4120: 20 41 4e 44 20 32 30 29 0a 20 20 20 20 20 20 20   AND 20).       
4130: 20 20 41 4e 44 20 7a 20 49 4e 20 28 53 45 4c 45    AND z IN (SELE
4140: 43 54 20 7a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT z FROM t1 WHE
4150: 52 45 20 77 20 42 45 54 57 45 45 4e 20 32 30 30  RE w BETWEEN 200
4160: 20 41 4e 44 20 33 30 30 29 0a 20 20 20 20 7d 0a   AND 300).    }.
4170: 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74    } {}.  do_test
4180: 20 77 68 65 72 65 32 2d 38 2e 31 36 20 7b 0a 20   where2-8.16 {. 
4190: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
41a0: 20 20 20 53 45 4c 45 43 54 20 77 20 46 52 4f 4d     SELECT w FROM
41b0: 20 74 78 0a 20 20 20 20 20 20 20 57 48 45 52 45   tx.       WHERE
41c0: 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 78 20   x IN (SELECT x 
41d0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 77 20  FROM t1 WHERE w 
41e0: 42 45 54 57 45 45 4e 20 31 30 20 41 4e 44 20 32  BETWEEN 10 AND 2
41f0: 30 29 0a 20 20 20 20 20 20 20 20 20 41 4e 44 20  0).         AND 
4200: 79 20 49 4e 20 28 53 45 4c 45 43 54 20 79 20 46  y IN (SELECT y F
4210: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 77 20 42  ROM t1 WHERE w B
4220: 45 54 57 45 45 4e 20 32 30 30 20 41 4e 44 20 33  ETWEEN 200 AND 3
4230: 30 30 29 0a 20 20 20 20 20 20 20 20 20 41 4e 44  00).         AND
4240: 20 7a 20 49 4e 20 28 53 45 4c 45 43 54 20 7a 20   z IN (SELECT z 
4250: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 77 20  FROM t1 WHERE w 
4260: 42 45 54 57 45 45 4e 20 31 30 20 41 4e 44 20 32  BETWEEN 10 AND 2
4270: 30 29 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a  0).    }.  } {}.
4280: 20 20 64 6f 5f 74 65 73 74 20 77 68 65 72 65 32    do_test where2
4290: 2d 38 2e 31 37 20 7b 0a 20 20 20 20 65 78 65 63  -8.17 {.    exec
42a0: 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45  sql {.      SELE
42b0: 43 54 20 77 20 46 52 4f 4d 20 74 78 0a 20 20 20  CT w FROM tx.   
42c0: 20 20 20 20 57 48 45 52 45 20 78 20 49 4e 20 28      WHERE x IN (
42d0: 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31  SELECT x FROM t1
42e0: 20 57 48 45 52 45 20 77 20 42 45 54 57 45 45 4e   WHERE w BETWEEN
42f0: 20 32 30 30 20 41 4e 44 20 33 30 30 29 0a 20 20   200 AND 300).  
4300: 20 20 20 20 20 20 20 41 4e 44 20 79 20 49 4e 20         AND y IN 
4310: 28 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20 74  (SELECT y FROM t
4320: 31 20 57 48 45 52 45 20 77 20 42 45 54 57 45 45  1 WHERE w BETWEE
4330: 4e 20 31 30 20 41 4e 44 20 32 30 29 0a 20 20 20  N 10 AND 20).   
4340: 20 20 20 20 20 20 41 4e 44 20 7a 20 49 4e 20 28        AND z IN (
4350: 53 45 4c 45 43 54 20 7a 20 46 52 4f 4d 20 74 31  SELECT z FROM t1
4360: 20 57 48 45 52 45 20 77 20 42 45 54 57 45 45 4e   WHERE w BETWEEN
4370: 20 31 30 20 41 4e 44 20 32 30 29 0a 20 20 20 20   10 AND 20).    
4380: 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  }.  } {}.  do_te
4390: 73 74 20 77 68 65 72 65 32 2d 38 2e 31 38 20 7b  st where2-8.18 {
43a0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
43b0: 20 20 20 20 20 53 45 4c 45 43 54 20 77 20 46 52       SELECT w FR
43c0: 4f 4d 20 74 78 0a 20 20 20 20 20 20 20 57 48 45  OM tx.       WHE
43d0: 52 45 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20  RE x IN (SELECT 
43e0: 78 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  x FROM t1 WHERE 
43f0: 2b 77 20 42 45 54 57 45 45 4e 20 31 30 20 41 4e  +w BETWEEN 10 AN
4400: 44 20 32 30 29 0a 20 20 20 20 20 20 20 20 20 41  D 20).         A
4410: 4e 44 20 79 20 49 4e 20 28 53 45 4c 45 43 54 20  ND y IN (SELECT 
4420: 79 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  y FROM t1 WHERE 
4430: 2b 77 20 42 45 54 57 45 45 4e 20 31 30 20 41 4e  +w BETWEEN 10 AN
4440: 44 20 32 30 29 0a 20 20 20 20 20 20 20 20 20 41  D 20).         A
4450: 4e 44 20 7a 20 49 4e 20 28 53 45 4c 45 43 54 20  ND z IN (SELECT 
4460: 7a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  z FROM t1 WHERE 
4470: 2b 77 20 42 45 54 57 45 45 4e 20 32 30 30 20 41  +w BETWEEN 200 A
4480: 4e 44 20 33 30 30 29 0a 20 20 20 20 7d 0a 20 20  ND 300).    }.  
4490: 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77  } {}.  do_test w
44a0: 68 65 72 65 32 2d 38 2e 31 39 20 7b 0a 20 20 20  here2-8.19 {.   
44b0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
44c0: 20 53 45 4c 45 43 54 20 77 20 46 52 4f 4d 20 74   SELECT w FROM t
44d0: 78 0a 20 20 20 20 20 20 20 57 48 45 52 45 20 78  x.       WHERE x
44e0: 20 49 4e 20 28 53 45 4c 45 43 54 20 78 20 46 52   IN (SELECT x FR
44f0: 4f 4d 20 74 31 20 57 48 45 52 45 20 2b 77 20 42  OM t1 WHERE +w B
4500: 45 54 57 45 45 4e 20 31 30 20 41 4e 44 20 32 30  ETWEEN 10 AND 20
4510: 29 0a 20 20 20 20 20 20 20 20 20 41 4e 44 20 79  ).         AND y
4520: 20 49 4e 20 28 53 45 4c 45 43 54 20 79 20 46 52   IN (SELECT y FR
4530: 4f 4d 20 74 31 20 57 48 45 52 45 20 2b 77 20 42  OM t1 WHERE +w B
4540: 45 54 57 45 45 4e 20 32 30 30 20 41 4e 44 20 33  ETWEEN 200 AND 3
4550: 30 30 29 0a 20 20 20 20 20 20 20 20 20 41 4e 44  00).         AND
4560: 20 7a 20 49 4e 20 28 53 45 4c 45 43 54 20 7a 20   z IN (SELECT z 
4570: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 2b 77  FROM t1 WHERE +w
4580: 20 42 45 54 57 45 45 4e 20 31 30 20 41 4e 44 20   BETWEEN 10 AND 
4590: 32 30 29 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 7d  20).    }.  } {}
45a0: 0a 20 20 64 6f 5f 74 65 73 74 20 77 68 65 72 65  .  do_test where
45b0: 32 2d 38 2e 32 30 20 7b 0a 20 20 20 20 65 78 65  2-8.20 {.    exe
45c0: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c  csql {.      SEL
45d0: 45 43 54 20 77 20 46 52 4f 4d 20 74 78 0a 20 20  ECT w FROM tx.  
45e0: 20 20 20 20 20 57 48 45 52 45 20 78 20 49 4e 20       WHERE x IN 
45f0: 28 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74  (SELECT x FROM t
4600: 31 20 57 48 45 52 45 20 2b 77 20 42 45 54 57 45  1 WHERE +w BETWE
4610: 45 4e 20 32 30 30 20 41 4e 44 20 33 30 30 29 0a  EN 200 AND 300).
4620: 20 20 20 20 20 20 20 20 20 41 4e 44 20 79 20 49           AND y I
4630: 4e 20 28 53 45 4c 45 43 54 20 79 20 46 52 4f 4d  N (SELECT y FROM
4640: 20 74 31 20 57 48 45 52 45 20 2b 77 20 42 45 54   t1 WHERE +w BET
4650: 57 45 45 4e 20 31 30 20 41 4e 44 20 32 30 29 0a  WEEN 10 AND 20).
4660: 20 20 20 20 20 20 20 20 20 41 4e 44 20 7a 20 49           AND z I
4670: 4e 20 28 53 45 4c 45 43 54 20 7a 20 46 52 4f 4d  N (SELECT z FROM
4680: 20 74 31 20 57 48 45 52 45 20 2b 77 20 42 45 54   t1 WHERE +w BET
4690: 57 45 45 4e 20 31 30 20 41 4e 44 20 32 30 29 0a  WEEN 10 AND 20).
46a0: 20 20 20 20 7d 0a 20 20 7d 20 7b 7d 0a 7d 20 20      }.  } {}.}  
46b0: 0a 0a 23 20 4d 61 6b 65 20 73 75 72 65 20 57 48  ..# Make sure WH
46c0: 45 52 45 20 63 6c 61 75 73 65 73 20 6f 66 20 74  ERE clauses of t
46d0: 68 65 20 66 6f 72 6d 20 41 3d 31 20 41 4e 44 20  he form A=1 AND 
46e0: 28 42 3d 32 20 4f 52 20 42 3d 33 29 20 61 72 65  (B=2 OR B=3) are
46f0: 20 6f 70 74 69 6d 69 7a 65 64 0a 23 20 77 68 65   optimized.# whe
4700: 6e 20 77 65 20 68 61 76 65 20 61 6e 20 69 6e 64  n we have an ind
4710: 65 78 20 6f 6e 20 41 20 61 6e 64 20 42 2e 0a 23  ex on A and B..#
4720: 0a 69 66 63 61 70 61 62 6c 65 20 6f 72 5f 6f 70  .ifcapable or_op
4730: 74 26 26 74 63 6c 76 61 72 20 7b 0a 20 20 64 6f  t&&tclvar {.  do
4740: 5f 74 65 73 74 20 77 68 65 72 65 32 2d 39 2e 31  _test where2-9.1
4750: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
4760: 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  .      BEGIN;.  
4770: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
4780: 20 74 31 30 28 61 2c 62 2c 63 29 3b 0a 20 20 20   t10(a,b,c);.   
4790: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
47a0: 31 30 20 56 41 4c 55 45 53 28 31 2c 31 2c 31 29  10 VALUES(1,1,1)
47b0: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
47c0: 4e 54 4f 20 74 31 30 20 56 41 4c 55 45 53 28 31  NTO t10 VALUES(1
47d0: 2c 32 2c 32 29 3b 0a 20 20 20 20 20 20 49 4e 53  ,2,2);.      INS
47e0: 45 52 54 20 49 4e 54 4f 20 74 31 30 20 56 41 4c  ERT INTO t10 VAL
47f0: 55 45 53 28 31 2c 33 2c 33 29 3b 0a 20 20 20 20  UES(1,3,3);.    
4800: 7d 0a 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69  }.    for {set i
4810: 20 34 7d 20 7b 24 69 3c 3d 31 30 30 30 7d 20 7b   4} {$i<=1000} {
4820: 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 20 20  incr i} {.      
4830: 65 78 65 63 73 71 6c 20 7b 49 4e 53 45 52 54 20  execsql {INSERT 
4840: 49 4e 54 4f 20 74 31 30 20 56 41 4c 55 45 53 28  INTO t10 VALUES(
4850: 31 2c 24 69 2c 24 69 29 7d 0a 20 20 20 20 7d 0a  1,$i,$i)}.    }.
4860: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
4870: 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58      CREATE INDEX
4880: 20 69 31 30 20 4f 4e 20 74 31 30 28 61 2c 62 29   i10 ON t10(a,b)
4890: 3b 0a 20 20 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  ;.      COMMIT;.
48a0: 20 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75        SELECT cou
48b0: 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 30 3b 0a  nt(*) FROM t10;.
48c0: 20 20 20 20 7d 0a 20 20 7d 20 31 30 30 30 0a 20      }.  } 1000. 
48d0: 20 69 66 63 61 70 61 62 6c 65 20 73 75 62 71 75   ifcapable subqu
48e0: 65 72 79 20 7b 0a 20 20 20 20 64 6f 5f 74 65 73  ery {.    do_tes
48f0: 74 20 77 68 65 72 65 32 2d 39 2e 32 20 7b 0a 20  t where2-9.2 {. 
4900: 20 20 20 20 20 63 6f 75 6e 74 20 7b 0a 20 20 20       count {.   
4910: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
4920: 4f 4d 20 74 31 30 20 57 48 45 52 45 20 61 3d 31  OM t10 WHERE a=1
4930: 20 41 4e 44 20 28 62 3d 32 20 4f 52 20 62 3d 33   AND (b=2 OR b=3
4940: 29 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ).      }.    } 
4950: 7b 31 20 32 20 32 20 31 20 33 20 33 20 37 7d 0a  {1 2 2 1 3 3 7}.
4960: 20 20 7d 0a 7d 0a 0a 66 69 6e 69 73 68 5f 74 65    }.}..finish_te
4970: 73 74 0a                                         st.