/ Hex Artifact Content
Login

Artifact 4a06b8922ab2fd09434870da8d1cdf525aaf7060:


0000: 23 20 32 30 31 36 20 4d 61 72 63 68 20 33 0a 23  # 2016 March 3.#
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 0a 73 65 74 20 74 65 73 74 64 69  ****..set testdi
0170: 72 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20  r [file dirname 
0180: 24 61 72 67 76 30 5d 0a 73 6f 75 72 63 65 20 24  $argv0].source $
0190: 74 65 73 74 64 69 72 2f 74 65 73 74 65 72 2e 74  testdir/tester.t
01a0: 63 6c 0a 73 65 74 20 74 65 73 74 70 72 65 66 69  cl.set testprefi
01b0: 78 20 62 65 73 74 69 6e 64 65 78 32 0a 0a 69 66  x bestindex2..if
01c0: 63 61 70 61 62 6c 65 20 21 76 74 61 62 20 7b 0a  capable !vtab {.
01d0: 20 20 66 69 6e 69 73 68 5f 74 65 73 74 0a 20 20    finish_test.  
01e0: 72 65 74 75 72 6e 0a 7d 0a 0a 23 2d 2d 2d 2d 2d  return.}..#-----
01f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0230: 2d 2d 2d 2d 0a 23 20 56 69 72 74 75 61 6c 20 74  ----.# Virtual t
0240: 61 62 6c 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f  able callback fo
0250: 72 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 24 74  r table named $t
0260: 62 6c 2c 20 77 69 74 68 20 74 68 65 20 63 6f 6c  bl, with the col
0270: 75 6d 6e 73 20 73 70 65 63 69 66 69 65 64 0a 23  umns specified.#
0280: 20 62 79 20 6c 69 73 74 20 61 72 67 75 6d 65 6e   by list argumen
0290: 74 20 24 63 6f 6c 73 2e 20 65 2e 67 2e 20 69 66  t $cols. e.g. if
02a0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73   the function is
02b0: 20 69 6e 76 6f 6b 65 64 20 61 73 3a 0a 23 0a 23   invoked as:.#.#
02c0: 20 20 20 76 74 61 62 5f 63 6d 64 20 74 31 20 7b     vtab_cmd t1 {
02d0: 61 20 62 20 63 7d 20 2e 2e 2e 0a 23 0a 23 20 54  a b c} ....#.# T
02e0: 68 65 20 74 61 62 6c 65 20 63 72 65 61 74 65 64  he table created
02f0: 20 69 73 3a 0a 23 0a 23 20 20 20 20 20 20 22 43   is:.#.#      "C
0300: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 20 28  REATE TABLE t1 (
0310: 61 2c 20 62 2c 20 63 29 22 0a 23 0a 23 20 54 68  a, b, c)".#.# Th
0320: 65 20 74 61 62 6c 65 73 20 78 42 65 73 74 49 6e  e tables xBestIn
0330: 64 65 78 20 6d 65 74 68 6f 64 20 62 65 68 61 76  dex method behav
0340: 65 73 20 61 73 20 69 66 20 61 6c 6c 20 70 6f 73  es as if all pos
0350: 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74 69 6f  sible combinatio
0360: 6e 73 20 6f 66 0a 23 20 22 3d 22 20 63 6f 6e 73  ns of.# "=" cons
0370: 74 72 61 69 6e 74 73 20 28 62 75 74 20 6e 6f 20  traints (but no 
0380: 6f 74 68 65 72 73 29 20 6d 61 79 20 62 65 20 6f  others) may be o
0390: 70 74 69 6d 69 7a 65 64 2e 20 54 68 65 20 63 6f  ptimized. The co
03a0: 73 74 20 6f 66 20 61 20 66 75 6c 6c 20 74 61 62  st of a full tab
03b0: 6c 65 0a 23 20 73 63 61 6e 20 69 73 3a 0a 23 0a  le.# scan is:.#.
03c0: 23 20 20 20 20 20 20 22 57 48 45 52 45 20 31 22  #      "WHERE 1"
03d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
03e0: 22 63 6f 73 74 20 31 30 30 30 30 30 30 20 72 6f  "cost 1000000 ro
03f0: 77 73 20 31 30 30 30 30 30 30 22 0a 23 0a 23 20  ws 1000000".#.# 
0400: 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22  If one or more "
0410: 3d 22 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61  =" constraints a
0420: 72 65 20 69 6e 20 75 73 65 2c 20 74 68 65 20 63  re in use, the c
0430: 6f 73 74 20 61 6e 64 20 65 73 74 69 6d 61 74 65  ost and estimate
0440: 64 20 6e 75 6d 62 65 72 0a 23 20 6f 66 20 72 6f  d number.# of ro
0450: 77 73 20 72 65 74 75 72 6e 65 64 20 61 72 65 20  ws returned are 
0460: 62 6f 74 68 20 69 73 20 28 31 31 20 2d 20 6e 43  both is (11 - nC
0470: 6f 6e 73 29 2a 31 30 30 30 2c 20 77 68 65 72 65  ons)*1000, where
0480: 20 6e 43 6f 6e 73 20 69 73 20 74 68 65 20 6e 75   nCons is the nu
0490: 6d 62 65 72 0a 23 20 6f 66 20 63 6f 6e 73 74 72  mber.# of constr
04a0: 61 69 6e 74 73 20 75 73 65 64 2e 20 65 2e 67 2e  aints used. e.g.
04b0: 0a 23 0a 23 20 20 20 22 57 48 45 52 45 20 61 3d  .#.#   "WHERE a=
04c0: 3f 20 41 4e 44 20 62 3d 3f 22 20 20 20 20 2d 3e  ? AND b=?"    ->
04d0: 20 20 20 22 63 6f 73 74 20 20 39 30 30 20 72 6f     "cost  900 ro
04e0: 77 73 20 20 39 30 30 22 0a 23 20 20 20 22 57 48  ws  900".#   "WH
04f0: 45 52 45 20 63 3d 3f 20 41 4e 44 20 62 3c 3f 22  ERE c=? AND b<?"
0500: 20 20 20 20 2d 3e 20 20 20 22 63 6f 73 74 20 31      ->   "cost 1
0510: 30 30 30 20 72 6f 77 73 20 31 30 30 30 22 0a 23  000 rows 1000".#
0520: 20 20 0a 70 72 6f 63 20 76 74 61 62 5f 63 6d 64    .proc vtab_cmd
0530: 20 7b 74 62 6c 20 63 6f 6c 73 20 6d 65 74 68 6f   {tbl cols metho
0540: 64 20 61 72 67 73 7d 20 7b 0a 20 20 73 77 69 74  d args} {.  swit
0550: 63 68 20 2d 2d 20 24 6d 65 74 68 6f 64 20 7b 0a  ch -- $method {.
0560: 20 20 20 20 78 43 6f 6e 6e 65 63 74 20 7b 0a 20      xConnect {. 
0570: 20 20 20 20 20 72 65 74 75 72 6e 20 22 43 52 45       return "CRE
0580: 41 54 45 20 54 41 42 4c 45 20 24 74 62 6c 20 28  ATE TABLE $tbl (
0590: 5b 6a 6f 69 6e 20 24 63 6f 6c 73 20 2c 5d 29 22  [join $cols ,])"
05a0: 0a 20 20 20 20 7d 0a 20 20 20 20 78 42 65 73 74  .    }.    xBest
05b0: 49 6e 64 65 78 20 7b 0a 20 20 20 20 20 20 66 6f  Index {.      fo
05c0: 72 65 61 63 68 20 7b 63 6c 69 73 74 20 6f 72 64  reach {clist ord
05d0: 65 72 62 79 20 6d 61 73 6b 7d 20 24 61 72 67 73  erby mask} $args
05e0: 20 7b 7d 0a 0a 20 20 20 20 20 20 73 65 74 20 63   {}..      set c
05f0: 6f 6e 73 20 5b 6c 69 73 74 5d 0a 20 20 20 20 20  ons [list].     
0600: 20 73 65 74 20 75 73 65 64 20 5b 6c 69 73 74 5d   set used [list]
0610: 0a 0a 20 20 20 20 20 20 66 6f 72 20 7b 73 65 74  ..      for {set
0620: 20 69 20 30 7d 20 7b 24 69 20 3c 20 5b 6c 6c 65   i 0} {$i < [lle
0630: 6e 67 74 68 20 24 63 6c 69 73 74 5d 7d 20 7b 69  ngth $clist]} {i
0640: 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 20 20 20  ncr i} {.       
0650: 20 61 72 72 61 79 20 75 6e 73 65 74 20 43 0a 20   array unset C. 
0660: 20 20 20 20 20 20 20 61 72 72 61 79 20 73 65 74         array set
0670: 20 43 20 5b 6c 69 6e 64 65 78 20 24 63 6c 69 73   C [lindex $clis
0680: 74 20 24 69 5d 0a 20 20 20 20 20 20 20 20 69 66  t $i].        if
0690: 20 7b 24 43 28 6f 70 29 3d 3d 22 65 71 22 20 26   {$C(op)=="eq" &
06a0: 26 20 24 43 28 75 73 61 62 6c 65 29 20 26 26 20  & $C(usable) && 
06b0: 5b 6c 73 65 61 72 63 68 20 24 63 6f 6e 73 20 24  [lsearch $cons $
06c0: 43 28 63 6f 6c 75 6d 6e 29 5d 3c 30 7d 20 7b 0a  C(column)]<0} {.
06d0: 20 20 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e            lappen
06e0: 64 20 75 73 65 64 20 75 73 65 20 24 69 0a 20 20  d used use $i.  
06f0: 20 20 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20          lappend 
0700: 63 6f 6e 73 20 24 43 28 63 6f 6c 75 6d 6e 29 0a  cons $C(column).
0710: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
0720: 7d 0a 0a 20 20 20 20 20 20 73 65 74 20 6e 43 6f  }..      set nCo
0730: 6e 73 20 5b 6c 6c 65 6e 67 74 68 20 24 63 6f 6e  ns [llength $con
0740: 73 5d 0a 20 20 20 20 20 20 69 66 20 7b 24 6e 43  s].      if {$nC
0750: 6f 6e 73 3d 3d 30 7d 20 7b 0a 20 20 20 20 20 20  ons==0} {.      
0760: 20 20 72 65 74 75 72 6e 20 22 63 6f 73 74 20 31    return "cost 1
0770: 30 30 30 30 30 30 20 72 6f 77 73 20 31 30 30 30  000000 rows 1000
0780: 30 30 30 22 0a 20 20 20 20 20 20 7d 20 65 6c 73  000".      } els
0790: 65 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20  e {.        set 
07a0: 63 6f 73 74 20 5b 65 78 70 72 20 28 31 31 2d 24  cost [expr (11-$
07b0: 6e 43 6f 6e 73 29 20 2a 20 31 30 30 30 5d 0a 20  nCons) * 1000]. 
07c0: 20 20 20 20 20 20 20 73 65 74 20 72 65 74 20 5b         set ret [
07d0: 63 6f 6e 63 61 74 20 24 75 73 65 64 20 22 63 6f  concat $used "co
07e0: 73 74 20 24 63 6f 73 74 20 72 6f 77 73 20 24 63  st $cost rows $c
07f0: 6f 73 74 22 5d 0a 0a 20 20 20 20 20 20 20 20 73  ost"]..        s
0800: 65 74 20 74 78 74 20 5b 6c 69 73 74 5d 0a 20 20  et txt [list].  
0810: 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 63 20        foreach c 
0820: 24 63 6f 6e 73 20 7b 20 6c 61 70 70 65 6e 64 20  $cons { lappend 
0830: 74 78 74 20 22 5b 6c 69 6e 64 65 78 20 24 63 6f  txt "[lindex $co
0840: 6c 73 20 24 63 5d 3d 3f 22 20 7d 0a 20 20 20 20  ls $c]=?" }.    
0850: 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 74 20      lappend ret 
0860: 69 64 78 73 74 72 20 22 69 6e 64 65 78 65 64 28  idxstr "indexed(
0870: 5b 6a 6f 69 6e 20 24 74 78 74 20 7b 20 41 4e 44  [join $txt { AND
0880: 20 7d 5d 29 22 0a 0a 20 20 20 20 20 20 20 20 72   }])"..        r
0890: 65 74 75 72 6e 20 24 72 65 74 0a 20 20 20 20 20  eturn $ret.     
08a0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
08b0: 65 74 75 72 6e 20 22 22 0a 7d 0a 0a 72 65 67 69  eturn "".}..regi
08c0: 73 74 65 72 5f 74 63 6c 5f 6d 6f 64 75 6c 65 20  ster_tcl_module 
08d0: 64 62 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  db..do_execsql_t
08e0: 65 73 74 20 31 2e 30 20 7b 0a 20 20 43 52 45 41  est 1.0 {.  CREA
08f0: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
0900: 20 74 31 20 55 53 49 4e 47 20 74 63 6c 28 22 76   t1 USING tcl("v
0910: 74 61 62 5f 63 6d 64 20 74 31 20 7b 61 20 62 7d  tab_cmd t1 {a b}
0920: 22 29 3b 0a 20 20 43 52 45 41 54 45 20 56 49 52  ");.  CREATE VIR
0930: 54 55 41 4c 20 54 41 42 4c 45 20 74 32 20 55 53  TUAL TABLE t2 US
0940: 49 4e 47 20 74 63 6c 28 22 76 74 61 62 5f 63 6d  ING tcl("vtab_cm
0950: 64 20 74 32 20 7b 63 20 64 7d 22 29 3b 0a 20 20  d t2 {c d}");.  
0960: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
0970: 41 42 4c 45 20 74 33 20 55 53 49 4e 47 20 74 63  ABLE t3 USING tc
0980: 6c 28 22 76 74 61 62 5f 63 6d 64 20 74 33 20 7b  l("vtab_cmd t3 {
0990: 65 20 66 7d 22 29 3b 0a 7d 0a 0a 64 6f 5f 65 71  e f}");.}..do_eq
09a0: 70 5f 74 65 73 74 20 31 2e 31 20 7b 0a 20 20 53  p_test 1.1 {.  S
09b0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
09c0: 57 48 45 52 45 20 61 3d 27 61 62 63 27 0a 7d 20  WHERE a='abc'.} 
09d0: 7b 0a 20 20 30 20 30 20 30 20 7b 53 43 41 4e 20  {.  0 0 0 {SCAN 
09e0: 54 41 42 4c 45 20 74 31 20 56 49 52 54 55 41 4c  TABLE t1 VIRTUAL
09f0: 20 54 41 42 4c 45 20 49 4e 44 45 58 20 30 3a 69   TABLE INDEX 0:i
0a00: 6e 64 65 78 65 64 28 61 3d 3f 29 7d 0a 7d 0a 64  ndexed(a=?)}.}.d
0a10: 6f 5f 65 71 70 5f 74 65 73 74 20 31 2e 32 20 7b  o_eqp_test 1.2 {
0a20: 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  .  SELECT * FROM
0a30: 20 74 31 20 57 48 45 52 45 20 61 3d 27 61 62 63   t1 WHERE a='abc
0a40: 27 20 41 4e 44 20 62 3d 27 64 65 66 27 0a 7d 20  ' AND b='def'.} 
0a50: 7b 0a 20 20 30 20 30 20 30 20 7b 53 43 41 4e 20  {.  0 0 0 {SCAN 
0a60: 54 41 42 4c 45 20 74 31 20 56 49 52 54 55 41 4c  TABLE t1 VIRTUAL
0a70: 20 54 41 42 4c 45 20 49 4e 44 45 58 20 30 3a 69   TABLE INDEX 0:i
0a80: 6e 64 65 78 65 64 28 61 3d 3f 20 41 4e 44 20 62  ndexed(a=? AND b
0a90: 3d 3f 29 7d 0a 7d 0a 64 6f 5f 65 71 70 5f 74 65  =?)}.}.do_eqp_te
0aa0: 73 74 20 31 2e 33 20 7b 0a 20 20 53 45 4c 45 43  st 1.3 {.  SELEC
0ab0: 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
0ac0: 45 20 61 3d 27 61 62 63 27 20 41 4e 44 20 61 3d  E a='abc' AND a=
0ad0: 27 64 65 66 27 0a 7d 20 7b 0a 20 20 30 20 30 20  'def'.} {.  0 0 
0ae0: 30 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 31  0 {SCAN TABLE t1
0af0: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 49   VIRTUAL TABLE I
0b00: 4e 44 45 58 20 30 3a 69 6e 64 65 78 65 64 28 61  NDEX 0:indexed(a
0b10: 3d 3f 29 7d 0a 7d 0a 64 6f 5f 65 71 70 5f 74 65  =?)}.}.do_eqp_te
0b20: 73 74 20 31 2e 34 20 7b 0a 20 20 53 45 4c 45 43  st 1.4 {.  SELEC
0b30: 54 20 2a 20 46 52 4f 4d 20 74 31 2c 74 32 20 57  T * FROM t1,t2 W
0b40: 48 45 52 45 20 63 3d 61 0a 7d 20 7b 0a 20 20 30  HERE c=a.} {.  0
0b50: 20 30 20 30 20 7b 53 43 41 4e 20 54 41 42 4c 45   0 0 {SCAN TABLE
0b60: 20 74 31 20 56 49 52 54 55 41 4c 20 54 41 42 4c   t1 VIRTUAL TABL
0b70: 45 20 49 4e 44 45 58 20 30 3a 7d 20 0a 20 20 30  E INDEX 0:} .  0
0b80: 20 31 20 31 20 7b 53 43 41 4e 20 54 41 42 4c 45   1 1 {SCAN TABLE
0b90: 20 74 32 20 56 49 52 54 55 41 4c 20 54 41 42 4c   t2 VIRTUAL TABL
0ba0: 45 20 49 4e 44 45 58 20 30 3a 69 6e 64 65 78 65  E INDEX 0:indexe
0bb0: 64 28 63 3d 3f 29 7d 0a 7d 0a 0a 64 6f 5f 65 71  d(c=?)}.}..do_eq
0bc0: 70 5f 74 65 73 74 20 31 2e 35 20 7b 0a 20 20 53  p_test 1.5 {.  S
0bd0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c  ELECT * FROM t1,
0be0: 20 74 32 20 43 52 4f 53 53 20 4a 4f 49 4e 20 74   t2 CROSS JOIN t
0bf0: 33 20 57 48 45 52 45 20 74 32 2e 63 20 3d 20 2b  3 WHERE t2.c = +
0c00: 74 31 2e 62 20 41 4e 44 20 74 33 2e 65 3d 74 32  t1.b AND t3.e=t2
0c10: 2e 64 0a 7d 20 7b 0a 20 20 30 20 30 20 30 20 7b  .d.} {.  0 0 0 {
0c20: 53 43 41 4e 20 54 41 42 4c 45 20 74 31 20 56 49  SCAN TABLE t1 VI
0c30: 52 54 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45  RTUAL TABLE INDE
0c40: 58 20 30 3a 7d 20 0a 20 20 30 20 31 20 31 20 7b  X 0:} .  0 1 1 {
0c50: 53 43 41 4e 20 54 41 42 4c 45 20 74 32 20 56 49  SCAN TABLE t2 VI
0c60: 52 54 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45  RTUAL TABLE INDE
0c70: 58 20 30 3a 69 6e 64 65 78 65 64 28 63 3d 3f 29  X 0:indexed(c=?)
0c80: 7d 20 0a 20 20 30 20 32 20 32 20 7b 53 43 41 4e  } .  0 2 2 {SCAN
0c90: 20 54 41 42 4c 45 20 74 33 20 56 49 52 54 55 41   TABLE t3 VIRTUA
0ca0: 4c 20 54 41 42 4c 45 20 49 4e 44 45 58 20 30 3a  L TABLE INDEX 0:
0cb0: 69 6e 64 65 78 65 64 28 65 3d 3f 29 7d 0a 7d 0a  indexed(e=?)}.}.
0cc0: 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20 31 2e 36  .do_eqp_test 1.6
0cd0: 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52   {.  SELECT * FR
0ce0: 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48  OM t1, t2, t3 WH
0cf0: 45 52 45 20 74 32 2e 63 20 3d 20 2b 74 31 2e 62  ERE t2.c = +t1.b
0d00: 20 41 4e 44 20 74 33 2e 65 20 3d 20 74 32 2e 64   AND t3.e = t2.d
0d10: 0a 7d 20 7b 0a 20 20 30 20 30 20 30 20 7b 53 43  .} {.  0 0 0 {SC
0d20: 41 4e 20 54 41 42 4c 45 20 74 31 20 56 49 52 54  AN TABLE t1 VIRT
0d30: 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45 58 20  UAL TABLE INDEX 
0d40: 30 3a 7d 20 0a 20 20 30 20 31 20 31 20 7b 53 43  0:} .  0 1 1 {SC
0d50: 41 4e 20 54 41 42 4c 45 20 74 32 20 56 49 52 54  AN TABLE t2 VIRT
0d60: 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45 58 20  UAL TABLE INDEX 
0d70: 30 3a 69 6e 64 65 78 65 64 28 63 3d 3f 29 7d 20  0:indexed(c=?)} 
0d80: 0a 20 20 30 20 32 20 32 20 7b 53 43 41 4e 20 54  .  0 2 2 {SCAN T
0d90: 41 42 4c 45 20 74 33 20 56 49 52 54 55 41 4c 20  ABLE t3 VIRTUAL 
0da0: 54 41 42 4c 45 20 49 4e 44 45 58 20 30 3a 69 6e  TABLE INDEX 0:in
0db0: 64 65 78 65 64 28 65 3d 3f 29 7d 0a 7d 0a 0a 64  dexed(e=?)}.}..d
0dc0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31  o_execsql_test 1
0dd0: 2e 37 2e 31 20 7b 0a 20 20 43 52 45 41 54 45 20  .7.1 {.  CREATE 
0de0: 54 41 42 4c 45 20 78 31 28 61 2c 20 62 29 3b 0a  TABLE x1(a, b);.
0df0: 7d 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20 31 2e  }.do_eqp_test 1.
0e00: 37 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a  7.2 {.  SELECT *
0e10: 20 46 52 4f 4d 20 78 31 20 43 52 4f 53 53 20 4a   FROM x1 CROSS J
0e20: 4f 49 4e 20 74 31 2c 20 74 32 2c 20 74 33 20 0a  OIN t1, t2, t3 .
0e30: 20 20 20 20 57 48 45 52 45 20 74 31 2e 61 20 3d      WHERE t1.a =
0e40: 20 74 32 2e 63 20 41 4e 44 20 74 31 2e 62 20 3d   t2.c AND t1.b =
0e50: 20 74 33 2e 65 0a 7d 20 7b 0a 20 20 30 20 30 20   t3.e.} {.  0 0 
0e60: 30 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 78 31  0 {SCAN TABLE x1
0e70: 7d 20 0a 20 20 30 20 31 20 31 20 7b 53 43 41 4e  } .  0 1 1 {SCAN
0e80: 20 54 41 42 4c 45 20 74 31 20 56 49 52 54 55 41   TABLE t1 VIRTUA
0e90: 4c 20 54 41 42 4c 45 20 49 4e 44 45 58 20 30 3a  L TABLE INDEX 0:
0ea0: 7d 0a 20 20 30 20 32 20 32 20 7b 53 43 41 4e 20  }.  0 2 2 {SCAN 
0eb0: 54 41 42 4c 45 20 74 32 20 56 49 52 54 55 41 4c  TABLE t2 VIRTUAL
0ec0: 20 54 41 42 4c 45 20 49 4e 44 45 58 20 30 3a 69   TABLE INDEX 0:i
0ed0: 6e 64 65 78 65 64 28 63 3d 3f 29 7d 20 0a 20 20  ndexed(c=?)} .  
0ee0: 30 20 33 20 33 20 7b 53 43 41 4e 20 54 41 42 4c  0 3 3 {SCAN TABL
0ef0: 45 20 74 33 20 56 49 52 54 55 41 4c 20 54 41 42  E t3 VIRTUAL TAB
0f00: 4c 45 20 49 4e 44 45 58 20 30 3a 69 6e 64 65 78  LE INDEX 0:index
0f10: 65 64 28 65 3d 3f 29 7d 0a 7d 0a 0a 66 69 6e 69  ed(e=?)}.}..fini
0f20: 73 68 5f 74 65 73 74 0a                          sh_test.