/ Hex Artifact Content
Login

Artifact 7622e792ff2da16d262d3cea6ad914591ac4806d57ed128e6c940b7920b47b84:


0000: 23 20 32 30 31 36 20 4d 61 79 20 32 39 0a 23 0a  # 2016 May 29.#.
0010: 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 73  # The author dis
0020: 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74  claims copyright
0030: 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20   to this source 
0040: 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20  code.  In place 
0050: 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f 74  of.# a legal not
0060: 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20 62  ice, here is a b
0070: 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20 20  lessing:.#.#    
0080: 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20  May you do good 
0090: 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23 20  and not evil..# 
00a0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00b0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00c0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00d0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20 20  give others..#  
00e0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
00f0: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0100: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0110: 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a 2a  ou 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 0a 0a 73 65 74 20 74 65 73 74 64 69 72  ***..set testdir
0170: 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24   [file dirname $
0180: 61 72 67 76 30 5d 0a 73 6f 75 72 63 65 20 24 74  argv0].source $t
0190: 65 73 74 64 69 72 2f 74 65 73 74 65 72 2e 74 63  estdir/tester.tc
01a0: 6c 0a 73 65 74 20 74 65 73 74 70 72 65 66 69 78  l.set testprefix
01b0: 20 62 65 73 74 69 6e 64 65 78 33 0a 0a 69 66 63   bestindex3..ifc
01c0: 61 70 61 62 6c 65 20 21 76 74 61 62 20 7b 0a 20  apable !vtab {. 
01d0: 20 66 69 6e 69 73 68 5f 74 65 73 74 0a 20 20 72   finish_test.  r
01e0: 65 74 75 72 6e 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  eturn.}..#------
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 0a 23 20 56 69 72 74 75 61 6c 20 74 61  ---.# Virtual ta
0240: 62 6c 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  ble callback for
0250: 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
0260: 20 6e 61 6d 65 64 20 24 74 62 6c 2e 0a 23 0a 23   named $tbl..#.#
0270: 20 54 68 65 20 74 61 62 6c 65 20 63 72 65 61 74   The table creat
0280: 65 64 20 69 73 3a 0a 23 0a 23 20 20 20 20 20 20  ed is:.#.#      
0290: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31  "CREATE TABLE t1
02a0: 20 28 61 2c 20 62 2c 20 63 29 22 0a 23 0a 23 20   (a, b, c)".#.# 
02b0: 54 68 69 73 20 76 69 72 74 75 61 6c 20 74 61 62  This virtual tab
02c0: 6c 65 20 73 75 70 70 6f 72 74 73 20 62 6f 74 68  le supports both
02d0: 20 4c 49 4b 45 20 61 6e 64 20 3d 20 6f 70 65 72   LIKE and = oper
02e0: 61 74 6f 72 73 20 6f 6e 20 61 6c 6c 20 63 6f 6c  ators on all col
02f0: 75 6d 6e 73 2e 0a 23 20 20 0a 70 72 6f 63 20 76  umns..#  .proc v
0300: 74 61 62 5f 63 6d 64 20 7b 62 4f 6d 69 74 20 6d  tab_cmd {bOmit m
0310: 65 74 68 6f 64 20 61 72 67 73 7d 20 7b 0a 20 20  ethod args} {.  
0320: 73 77 69 74 63 68 20 2d 2d 20 24 6d 65 74 68 6f  switch -- $metho
0330: 64 20 7b 0a 20 20 20 20 78 43 6f 6e 6e 65 63 74  d {.    xConnect
0340: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
0350: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31  "CREATE TABLE t1
0360: 28 61 2c 20 62 2c 20 63 29 22 0a 20 20 20 20 7d  (a, b, c)".    }
0370: 0a 0a 20 20 20 20 78 42 65 73 74 49 6e 64 65 78  ..    xBestIndex
0380: 20 7b 0a 20 20 20 20 20 20 66 6f 72 65 61 63 68   {.      foreach
0390: 20 7b 63 6c 69 73 74 20 6f 72 64 65 72 62 79 20   {clist orderby 
03a0: 6d 61 73 6b 7d 20 24 61 72 67 73 20 7b 7d 0a 0a  mask} $args {}..
03b0: 20 20 20 20 20 20 73 65 74 20 72 65 74 20 5b 6c        set ret [l
03c0: 69 73 74 5d 0a 20 20 20 20 20 20 73 65 74 20 75  ist].      set u
03d0: 73 65 20 75 73 65 0a 20 20 20 20 20 20 69 66 20  se use.      if 
03e0: 7b 24 62 4f 6d 69 74 7d 20 7b 73 65 74 20 75 73  {$bOmit} {set us
03f0: 65 20 6f 6d 69 74 7d 0a 0a 20 20 20 20 20 20 66  e omit}..      f
0400: 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69  or {set i 0} {$i
0410: 20 3c 20 5b 6c 6c 65 6e 67 74 68 20 24 63 6c 69   < [llength $cli
0420: 73 74 5d 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a  st]} {incr i} {.
0430: 20 20 20 20 20 20 20 20 61 72 72 61 79 20 75 6e          array un
0440: 73 65 74 20 43 0a 20 20 20 20 20 20 20 20 61 72  set C.        ar
0450: 72 61 79 20 73 65 74 20 43 20 5b 6c 69 6e 64 65  ray set C [linde
0460: 78 20 24 63 6c 69 73 74 20 24 69 5d 0a 20 20 20  x $clist $i].   
0470: 20 20 20 20 20 69 66 20 7b 24 43 28 75 73 61 62       if {$C(usab
0480: 6c 65 29 20 26 26 20 28 24 43 28 6f 70 29 3d 3d  le) && ($C(op)==
0490: 22 6c 69 6b 65 22 20 7c 7c 20 24 43 28 6f 70 29  "like" || $C(op)
04a0: 3d 3d 22 65 71 22 29 7d 20 7b 0a 20 20 20 20 20  =="eq")} {.     
04b0: 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 74       lappend ret
04c0: 20 24 75 73 65 20 24 69 0a 20 20 20 20 20 20 20   $use $i.       
04d0: 20 20 20 6c 61 70 70 65 6e 64 20 72 65 74 20 69     lappend ret i
04e0: 64 78 73 74 72 20 0a 20 20 20 20 20 20 20 20 20  dxstr .         
04f0: 20 6c 61 70 70 65 6e 64 20 72 65 74 20 22 5b 6c   lappend ret "[l
0500: 69 6e 64 65 78 20 7b 61 20 62 20 63 7d 20 24 43  index {a b c} $C
0510: 28 63 6f 6c 75 6d 6e 29 5d 20 5b 73 74 72 69 6e  (column)] [strin
0520: 67 20 74 6f 75 70 70 65 72 20 24 43 28 6f 70 29  g toupper $C(op)
0530: 5d 20 3f 22 0a 20 20 20 20 20 20 20 20 20 20 62  ] ?".          b
0540: 72 65 61 6b 0a 20 20 20 20 20 20 20 20 7d 0a 20  reak.        }. 
0550: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
0560: 20 7b 24 72 65 74 3d 3d 22 22 7d 20 7b 0a 20 20   {$ret==""} {.  
0570: 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65        lappend re
0580: 74 20 63 6f 73 74 20 31 30 30 30 30 30 30 20 72  t cost 1000000 r
0590: 6f 77 73 20 31 30 30 30 30 30 30 0a 20 20 20 20  ows 1000000.    
05a0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
05b0: 20 20 20 6c 61 70 70 65 6e 64 20 72 65 74 20 63     lappend ret c
05c0: 6f 73 74 20 31 30 30 20 72 6f 77 73 20 31 30 0a  ost 100 rows 10.
05d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
05e0: 74 75 72 6e 20 24 72 65 74 0a 20 20 20 20 7d 0a  turn $ret.    }.
05f0: 0a 20 20 20 20 78 46 69 6c 74 65 72 20 7b 0a 20  .    xFilter {. 
0600: 20 20 20 20 20 66 6f 72 65 61 63 68 20 7b 69 64       foreach {id
0610: 78 6e 75 6d 20 69 64 78 73 74 72 20 70 61 72 61  xnum idxstr para
0620: 6d 7d 20 24 61 72 67 73 20 7b 7d 0a 20 20 20 20  m} $args {}.    
0630: 20 20 73 65 74 20 77 68 65 72 65 20 22 22 0a 20    set where "". 
0640: 20 20 20 20 20 69 66 20 7b 24 62 4f 6d 69 74 20       if {$bOmit 
0650: 26 26 20 24 69 64 78 73 74 72 20 21 3d 20 22 22  && $idxstr != ""
0660: 7d 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20  } {.        set 
0670: 77 68 65 72 65 20 22 20 57 48 45 52 45 20 5b 73  where " WHERE [s
0680: 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20  tring map [list 
0690: 3f 20 27 24 70 61 72 61 6d 27 20 45 51 20 3d 5d  ? '$param' EQ =]
06a0: 20 24 69 64 78 73 74 72 5d 22 0a 20 20 20 20 20   $idxstr]".     
06b0: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
06c0: 5b 6c 69 73 74 20 73 71 6c 20 22 53 45 4c 45 43  [list sql "SELEC
06d0: 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20  T rowid, * FROM 
06e0: 74 74 74 24 77 68 65 72 65 22 5d 0a 20 20 20 20  ttt$where"].    
06f0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22  }.  }.  return "
0700: 22 0a 7d 0a 0a 72 65 67 69 73 74 65 72 5f 74 63  ".}..register_tc
0710: 6c 5f 6d 6f 64 75 6c 65 20 64 62 0a 0a 64 6f 5f  l_module db..do_
0720: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 2e 30  execsql_test 1.0
0730: 20 7b 0a 20 20 43 52 45 41 54 45 20 56 49 52 54   {.  CREATE VIRT
0740: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49  UAL TABLE t1 USI
0750: 4e 47 20 74 63 6c 28 22 76 74 61 62 5f 63 6d 64  NG tcl("vtab_cmd
0760: 20 30 22 29 3b 0a 7d 0a 0a 64 6f 5f 65 71 70 5f   0");.}..do_eqp_
0770: 74 65 73 74 20 31 2e 31 20 7b 0a 20 20 53 45 4c  test 1.1 {.  SEL
0780: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
0790: 45 52 45 20 61 20 4c 49 4b 45 20 27 61 62 63 27  ERE a LIKE 'abc'
07a0: 3b 0a 7d 20 7b 53 43 41 4e 20 54 41 42 4c 45 20  ;.} {SCAN TABLE 
07b0: 74 31 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  t1 VIRTUAL TABLE
07c0: 20 49 4e 44 45 58 20 30 3a 61 20 4c 49 4b 45 20   INDEX 0:a LIKE 
07d0: 3f 7d 0a 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20  ?}..do_eqp_test 
07e0: 31 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a  1.2 {.  SELECT *
07f0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
0800: 20 3d 20 27 61 62 63 27 3b 0a 7d 20 7b 53 43 41   = 'abc';.} {SCA
0810: 4e 20 54 41 42 4c 45 20 74 31 20 56 49 52 54 55  N TABLE t1 VIRTU
0820: 41 4c 20 54 41 42 4c 45 20 49 4e 44 45 58 20 30  AL TABLE INDEX 0
0830: 3a 61 20 45 51 20 3f 7d 0a 0a 64 6f 5f 65 71 70  :a EQ ?}..do_eqp
0840: 5f 74 65 73 74 20 31 2e 33 20 7b 0a 20 20 53 45  _test 1.3 {.  SE
0850: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
0860: 48 45 52 45 20 61 20 3d 20 27 61 62 63 27 20 4f  HERE a = 'abc' O
0870: 52 20 62 20 3d 20 27 64 65 66 27 3b 0a 7d 20 7b  R b = 'def';.} {
0880: 0a 20 20 51 55 45 52 59 20 50 4c 41 4e 0a 20 20  .  QUERY PLAN.  
0890: 60 2d 2d 4d 55 4c 54 49 2d 49 4e 44 45 58 20 4f  `--MULTI-INDEX O
08a0: 52 0a 20 20 20 20 20 7c 2d 2d 49 4e 44 45 58 20  R.     |--INDEX 
08b0: 31 0a 20 20 20 20 20 7c 20 20 60 2d 2d 53 43 41  1.     |  `--SCA
08c0: 4e 20 54 41 42 4c 45 20 74 31 20 56 49 52 54 55  N TABLE t1 VIRTU
08d0: 41 4c 20 54 41 42 4c 45 20 49 4e 44 45 58 20 30  AL TABLE INDEX 0
08e0: 3a 61 20 45 51 20 3f 0a 20 20 20 20 20 60 2d 2d  :a EQ ?.     `--
08f0: 49 4e 44 45 58 20 32 0a 20 20 20 20 20 20 20 20  INDEX 2.        
0900: 60 2d 2d 53 43 41 4e 20 54 41 42 4c 45 20 74 31  `--SCAN TABLE t1
0910: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 49   VIRTUAL TABLE I
0920: 4e 44 45 58 20 30 3a 62 20 45 51 20 3f 0a 7d 0a  NDEX 0:b EQ ?.}.
0930: 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20 31 2e 34  .do_eqp_test 1.4
0940: 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52   {.  SELECT * FR
0950: 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 4c 49  OM t1 WHERE a LI
0960: 4b 45 20 27 61 62 63 25 27 20 4f 52 20 62 20 3d  KE 'abc%' OR b =
0970: 20 27 64 65 66 27 3b 0a 7d 20 7b 0a 20 20 51 55   'def';.} {.  QU
0980: 45 52 59 20 50 4c 41 4e 0a 20 20 60 2d 2d 4d 55  ERY PLAN.  `--MU
0990: 4c 54 49 2d 49 4e 44 45 58 20 4f 52 0a 20 20 20  LTI-INDEX OR.   
09a0: 20 20 7c 2d 2d 49 4e 44 45 58 20 31 0a 20 20 20    |--INDEX 1.   
09b0: 20 20 7c 20 20 60 2d 2d 53 43 41 4e 20 54 41 42    |  `--SCAN TAB
09c0: 4c 45 20 74 31 20 56 49 52 54 55 41 4c 20 54 41  LE t1 VIRTUAL TA
09d0: 42 4c 45 20 49 4e 44 45 58 20 30 3a 61 20 4c 49  BLE INDEX 0:a LI
09e0: 4b 45 20 3f 0a 20 20 20 20 20 60 2d 2d 49 4e 44  KE ?.     `--IND
09f0: 45 58 20 32 0a 20 20 20 20 20 20 20 20 60 2d 2d  EX 2.        `--
0a00: 53 43 41 4e 20 54 41 42 4c 45 20 74 31 20 56 49  SCAN TABLE t1 VI
0a10: 52 54 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45  RTUAL TABLE INDE
0a20: 58 20 30 3a 62 20 45 51 20 3f 0a 7d 0a 0a 64 6f  X 0:b EQ ?.}..do
0a30: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 2e  _execsql_test 1.
0a40: 35 20 7b 0a 20 20 43 52 45 41 54 45 20 54 41 42  5 {.  CREATE TAB
0a50: 4c 45 20 74 74 74 28 61 2c 20 62 2c 20 63 29 3b  LE ttt(a, b, c);
0a60: 0a 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ..  INSERT INTO 
0a70: 74 74 74 20 56 41 4c 55 45 53 28 31 2c 20 27 74  ttt VALUES(1, 't
0a80: 77 6f 27 2c 20 20 20 27 74 68 72 65 65 27 29 3b  wo',   'three');
0a90: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
0aa0: 74 74 20 56 41 4c 55 45 53 28 32 2c 20 27 6f 6e  tt VALUES(2, 'on
0ab0: 65 27 2c 20 20 20 27 74 77 6f 27 29 3b 0a 20 20  e',   'two');.  
0ac0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 74 74 20  INSERT INTO ttt 
0ad0: 56 41 4c 55 45 53 28 33 2c 20 27 74 68 72 65 65  VALUES(3, 'three
0ae0: 27 2c 20 27 6f 6e 65 27 29 3b 0a 20 20 49 4e 53  ', 'one');.  INS
0af0: 45 52 54 20 49 4e 54 4f 20 74 74 74 20 56 41 4c  ERT INTO ttt VAL
0b00: 55 45 53 28 34 2c 20 27 79 27 2c 20 20 20 20 20  UES(4, 'y',     
0b10: 27 6f 6e 65 27 29 3b 0a 20 20 49 4e 53 45 52 54  'one');.  INSERT
0b20: 20 49 4e 54 4f 20 74 74 74 20 56 41 4c 55 45 53   INTO ttt VALUES
0b30: 28 35 2c 20 27 78 27 2c 20 20 20 20 20 27 74 77  (5, 'x',     'tw
0b40: 6f 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  o');.  INSERT IN
0b50: 54 4f 20 74 74 74 20 56 41 4c 55 45 53 28 36 2c  TO ttt VALUES(6,
0b60: 20 27 79 27 2c 20 20 20 20 20 27 74 68 72 65 65   'y',     'three
0b70: 27 29 3b 0a 7d 0a 0a 66 6f 72 65 61 63 68 20 6f  ');.}..foreach o
0b80: 6d 69 74 20 7b 30 20 31 7d 20 7b 0a 20 20 64 6f  mit {0 1} {.  do
0b90: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 2e  _execsql_test 1.
0ba0: 36 2e 24 6f 6d 69 74 2e 30 20 22 0a 20 20 20 20  6.$omit.0 ".    
0bb0: 44 52 4f 50 20 54 41 42 4c 45 20 74 31 3b 0a 20  DROP TABLE t1;. 
0bc0: 20 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41     CREATE VIRTUA
0bd0: 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 4e 47  L TABLE t1 USING
0be0: 20 74 63 6c 28 27 76 74 61 62 5f 63 6d 64 20 24   tcl('vtab_cmd $
0bf0: 6f 6d 69 74 27 29 3b 0a 20 20 22 0a 20 20 64 6f  omit');.  ".  do
0c00: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 31 2e  _execsql_test 1.
0c10: 36 2e 24 6f 6d 69 74 2e 31 20 7b 20 0a 20 20 20  6.$omit.1 { .   
0c20: 20 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52   SELECT rowid FR
0c30: 4f 4d 20 74 31 20 57 48 45 52 45 20 63 20 4c 49  OM t1 WHERE c LI
0c40: 4b 45 20 27 6f 25 27 0a 20 20 7d 20 7b 33 20 34  KE 'o%'.  } {3 4
0c50: 7d 0a 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f  }..  do_execsql_
0c60: 74 65 73 74 20 31 2e 36 2e 24 6f 6d 69 74 2e 32  test 1.6.$omit.2
0c70: 20 7b 20 0a 20 20 20 20 53 45 4c 45 43 54 20 72   { .    SELECT r
0c80: 6f 77 69 64 20 46 52 4f 4d 20 74 31 20 57 48 45  owid FROM t1 WHE
0c90: 52 45 20 63 20 4c 49 4b 45 20 27 6f 25 27 20 4f  RE c LIKE 'o%' O
0ca0: 52 20 62 3d 27 79 27 0a 20 20 7d 20 7b 33 20 34  R b='y'.  } {3 4
0cb0: 20 36 7d 0a 0a 20 20 64 6f 5f 65 78 65 63 73 71   6}..  do_execsq
0cc0: 6c 5f 74 65 73 74 20 31 2e 36 2e 24 6f 6d 69 74  l_test 1.6.$omit
0cd0: 2e 33 20 7b 20 0a 20 20 20 20 53 45 4c 45 43 54  .3 { .    SELECT
0ce0: 20 72 6f 77 69 64 20 46 52 4f 4d 20 74 31 20 57   rowid FROM t1 W
0cf0: 48 45 52 45 20 63 20 3d 20 27 74 68 72 65 65 27  HERE c = 'three'
0d00: 20 4f 52 20 63 20 4c 49 4b 45 20 27 6f 25 27 0a   OR c LIKE 'o%'.
0d10: 20 20 7d 20 7b 31 20 36 20 33 20 34 7d 0a 7d 0a    } {1 6 3 4}.}.
0d20: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
0d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
0d70: 73 74 20 74 68 65 20 73 61 6d 65 20 70 61 74 74  st the same patt
0d80: 65 72 6e 20 77 6f 72 6b 73 20 77 69 74 68 20 6f  ern works with o
0d90: 72 64 69 6e 61 72 79 20 74 61 62 6c 65 73 2e 0a  rdinary tables..
0da0: 23 0a 23 20 54 68 69 73 20 74 65 73 74 20 64 6f  #.# This test do
0db0: 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 74  es not work if t
0dc0: 68 65 20 49 43 55 20 65 78 74 65 6e 73 69 6f 6e  he ICU extension
0dd0: 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 43 55   is enabled. ICU
0de0: 20 6f 76 65 72 72 69 64 65 73 0a 23 20 4c 49 4b   overrides.# LIK
0df0: 45 20 2d 20 61 6e 64 20 74 68 69 73 20 6f 70 74  E - and this opt
0e00: 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 20 77  imization only w
0e10: 6f 72 6b 73 20 77 69 74 68 20 74 68 65 20 62 75  orks with the bu
0e20: 69 6c 74 2d 69 6e 20 4c 49 4b 45 20 66 75 6e 63  ilt-in LIKE func
0e30: 74 69 6f 6e 2e 0a 23 0a 69 66 63 61 70 61 62 6c  tion..#.ifcapabl
0e40: 65 20 21 69 63 75 20 7b 0a 20 20 64 6f 5f 65 78  e !icu {.  do_ex
0e50: 65 63 73 71 6c 5f 74 65 73 74 20 32 2e 31 20 7b  ecsql_test 2.1 {
0e60: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
0e70: 45 20 74 32 28 78 20 54 45 58 54 20 43 4f 4c 4c  E t2(x TEXT COLL
0e80: 41 54 45 20 6e 6f 63 61 73 65 2c 20 79 20 54 45  ATE nocase, y TE
0e90: 58 54 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  XT);.    CREATE 
0ea0: 49 4e 44 45 58 20 74 32 78 20 4f 4e 20 74 32 28  INDEX t2x ON t2(
0eb0: 78 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65  x COLLATE nocase
0ec0: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e  );.    CREATE IN
0ed0: 44 45 58 20 74 32 79 20 4f 4e 20 74 32 28 79 29  DEX t2y ON t2(y)
0ee0: 3b 0a 20 20 7d 0a 0a 20 20 64 6f 5f 65 71 70 5f  ;.  }..  do_eqp_
0ef0: 74 65 73 74 20 32 2e 32 20 7b 0a 20 20 20 20 53  test 2.2 {.    S
0f00: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20  ELECT * FROM t2 
0f10: 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27 61 62  WHERE x LIKE 'ab
0f20: 63 25 27 20 4f 52 20 79 20 3d 20 27 64 65 66 27  c%' OR y = 'def'
0f30: 0a 20 20 7d 20 5b 73 74 72 69 6e 67 20 6d 61 70  .  } [string map
0f40: 20 7b 22 5c 6e 20 20 22 20 5c 6e 7d 20 7b 0a 20   {"\n  " \n} {. 
0f50: 20 20 20 51 55 45 52 59 20 50 4c 41 4e 0a 20 20     QUERY PLAN.  
0f60: 20 20 60 2d 2d 4d 55 4c 54 49 2d 49 4e 44 45 58    `--MULTI-INDEX
0f70: 20 4f 52 0a 20 20 20 20 20 20 20 7c 2d 2d 49 4e   OR.       |--IN
0f80: 44 45 58 20 31 0a 20 20 20 20 20 20 20 7c 20 20  DEX 1.       |  
0f90: 60 2d 2d 53 45 41 52 43 48 20 54 41 42 4c 45 20  `--SEARCH TABLE 
0fa0: 74 32 20 55 53 49 4e 47 20 49 4e 44 45 58 20 74  t2 USING INDEX t
0fb0: 32 78 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29  2x (x>? AND x<?)
0fc0: 0a 20 20 20 20 20 20 20 60 2d 2d 49 4e 44 45 58  .       `--INDEX
0fd0: 20 32 0a 20 20 20 20 20 20 20 20 20 20 60 2d 2d   2.          `--
0fe0: 53 45 41 52 43 48 20 54 41 42 4c 45 20 74 32 20  SEARCH TABLE t2 
0ff0: 55 53 49 4e 47 20 49 4e 44 45 58 20 74 32 79 20  USING INDEX t2y 
1000: 28 79 3d 3f 29 0a 20 20 7d 5d 0a 7d 0a 0a 23 2d  (y=?).  }].}..#-
1010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1050: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
1060: 74 68 61 74 20 61 6e 79 20 50 52 49 4d 41 52 59  that any PRIMARY
1070: 20 4b 45 59 20 77 69 74 68 69 6e 20 61 20 73 71   KEY within a sq
1080: 6c 69 74 65 33 5f 64 65 63 6c 5f 76 74 61 62 28  lite3_decl_vtab(
1090: 29 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 0a  ) CREATE TABLE .
10a0: 23 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 63  # statement is c
10b0: 75 72 72 65 6e 74 6c 79 20 69 67 6e 6f 72 65 64  urrently ignored
10c0: 2e 0a 23 0a 70 72 6f 63 20 76 76 76 5f 63 6f 6d  ..#.proc vvv_com
10d0: 6d 61 6e 64 20 7b 6d 65 74 68 6f 64 20 61 72 67  mand {method arg
10e0: 73 7d 20 7b 0a 20 20 73 77 69 74 63 68 20 2d 2d  s} {.  switch --
10f0: 20 24 6d 65 74 68 6f 64 20 7b 0a 20 20 20 20 78   $method {.    x
1100: 43 6f 6e 6e 65 63 74 20 7b 20 72 65 74 75 72 6e  Connect { return
1110: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 74   "CREATE TABLE t
1120: 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  1(a PRIMARY KEY,
1130: 20 62 2c 20 63 29 22 20 7d 0a 20 20 7d 0a 7d 0a   b, c)" }.  }.}.
1140: 70 72 6f 63 20 79 79 79 5f 63 6f 6d 6d 61 6e 64  proc yyy_command
1150: 20 7b 6d 65 74 68 6f 64 20 61 72 67 73 7d 20 7b   {method args} {
1160: 0a 20 20 73 77 69 74 63 68 20 2d 2d 20 24 6d 65  .  switch -- $me
1170: 74 68 6f 64 20 7b 0a 20 20 20 20 78 43 6f 6e 6e  thod {.    xConn
1180: 65 63 74 20 7b 20 72 65 74 75 72 6e 20 22 43 52  ect { return "CR
1190: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
11a0: 20 62 2c 20 63 2c 20 50 52 49 4d 41 52 59 20 4b   b, c, PRIMARY K
11b0: 45 59 28 61 2c 20 62 29 29 22 20 7d 0a 20 20 7d  EY(a, b))" }.  }
11c0: 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  .}..do_execsql_t
11d0: 65 73 74 20 33 2e 31 20 7b 20 43 52 45 41 54 45  est 3.1 { CREATE
11e0: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74   VIRTUAL TABLE t
11f0: 33 20 55 53 49 4e 47 20 74 63 6c 28 27 76 76 76  3 USING tcl('vvv
1200: 5f 63 6f 6d 6d 61 6e 64 27 29 20 7d 0a 64 6f 5f  _command') }.do_
1210: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 33 2e 32  execsql_test 3.2
1220: 20 7b 20 43 52 45 41 54 45 20 56 49 52 54 55 41   { CREATE VIRTUA
1230: 4c 20 54 41 42 4c 45 20 74 34 20 55 53 49 4e 47  L TABLE t4 USING
1240: 20 74 63 6c 28 27 79 79 79 5f 63 6f 6d 6d 61 6e   tcl('yyy_comman
1250: 64 27 29 20 7d 0a 0a 66 69 6e 69 73 68 5f 74 65  d') }..finish_te
1260: 73 74 0a                                         st.