/ Hex Artifact Content
Login

Artifact 578b6a52dab819e63f28e3640e04b32c85aed320:


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 0a 20 20 30 20 30 20 30 20 7b 53  ;.} {.  0 0 0 {S
07b0: 43 41 4e 20 54 41 42 4c 45 20 74 31 20 56 49 52  CAN TABLE t1 VIR
07c0: 54 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45 58  TUAL TABLE INDEX
07d0: 20 30 3a 61 20 4c 49 4b 45 20 3f 7d 0a 7d 0a 0a   0:a LIKE ?}.}..
07e0: 64 6f 5f 65 71 70 5f 74 65 73 74 20 31 2e 32 20  do_eqp_test 1.2 
07f0: 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  {.  SELECT * FRO
0800: 4d 20 74 31 20 57 48 45 52 45 20 61 20 3d 20 27  M t1 WHERE a = '
0810: 61 62 63 27 3b 0a 7d 20 7b 0a 20 20 30 20 30 20  abc';.} {.  0 0 
0820: 30 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 31  0 {SCAN TABLE t1
0830: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 49   VIRTUAL TABLE I
0840: 4e 44 45 58 20 30 3a 61 20 45 51 20 3f 7d 0a 7d  NDEX 0:a EQ ?}.}
0850: 0a 0a 64 6f 5f 65 71 70 5f 74 65 73 74 20 31 2e  ..do_eqp_test 1.
0860: 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 2a 20 46  3 {.  SELECT * F
0870: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3d  ROM t1 WHERE a =
0880: 20 27 61 62 63 27 20 4f 52 20 62 20 3d 20 27 64   'abc' OR b = 'd
0890: 65 66 27 3b 0a 7d 20 7b 0a 20 20 30 20 30 20 30  ef';.} {.  0 0 0
08a0: 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 31 20   {SCAN TABLE t1 
08b0: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 49 4e  VIRTUAL TABLE IN
08c0: 44 45 58 20 30 3a 61 20 45 51 20 3f 7d 0a 20 20  DEX 0:a EQ ?}.  
08d0: 30 20 30 20 30 20 7b 53 43 41 4e 20 54 41 42 4c  0 0 0 {SCAN TABL
08e0: 45 20 74 31 20 56 49 52 54 55 41 4c 20 54 41 42  E t1 VIRTUAL TAB
08f0: 4c 45 20 49 4e 44 45 58 20 30 3a 62 20 45 51 20  LE INDEX 0:b EQ 
0900: 3f 7d 0a 7d 0a 0a 64 6f 5f 65 71 70 5f 74 65 73  ?}.}..do_eqp_tes
0910: 74 20 31 2e 34 20 7b 0a 20 20 53 45 4c 45 43 54  t 1.4 {.  SELECT
0920: 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
0930: 20 61 20 4c 49 4b 45 20 27 61 62 63 25 27 20 4f   a LIKE 'abc%' O
0940: 52 20 62 20 3d 20 27 64 65 66 27 3b 0a 7d 20 7b  R b = 'def';.} {
0950: 0a 20 20 30 20 30 20 30 20 7b 53 43 41 4e 20 54  .  0 0 0 {SCAN T
0960: 41 42 4c 45 20 74 31 20 56 49 52 54 55 41 4c 20  ABLE t1 VIRTUAL 
0970: 54 41 42 4c 45 20 49 4e 44 45 58 20 30 3a 61 20  TABLE INDEX 0:a 
0980: 4c 49 4b 45 20 3f 7d 0a 20 20 30 20 30 20 30 20  LIKE ?}.  0 0 0 
0990: 7b 53 43 41 4e 20 54 41 42 4c 45 20 74 31 20 56  {SCAN TABLE t1 V
09a0: 49 52 54 55 41 4c 20 54 41 42 4c 45 20 49 4e 44  IRTUAL TABLE IND
09b0: 45 58 20 30 3a 62 20 45 51 20 3f 7d 0a 7d 0a 0a  EX 0:b EQ ?}.}..
09c0: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
09d0: 31 2e 35 20 7b 0a 20 20 43 52 45 41 54 45 20 54  1.5 {.  CREATE T
09e0: 41 42 4c 45 20 74 74 74 28 61 2c 20 62 2c 20 63  ABLE ttt(a, b, c
09f0: 29 3b 0a 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  );..  INSERT INT
0a00: 4f 20 74 74 74 20 56 41 4c 55 45 53 28 31 2c 20  O ttt VALUES(1, 
0a10: 27 74 77 6f 27 2c 20 20 20 27 74 68 72 65 65 27  'two',   'three'
0a20: 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  );.  INSERT INTO
0a30: 20 74 74 74 20 56 41 4c 55 45 53 28 32 2c 20 27   ttt VALUES(2, '
0a40: 6f 6e 65 27 2c 20 20 20 27 74 77 6f 27 29 3b 0a  one',   'two');.
0a50: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 74    INSERT INTO tt
0a60: 74 20 56 41 4c 55 45 53 28 33 2c 20 27 74 68 72  t VALUES(3, 'thr
0a70: 65 65 27 2c 20 27 6f 6e 65 27 29 3b 0a 20 20 49  ee', 'one');.  I
0a80: 4e 53 45 52 54 20 49 4e 54 4f 20 74 74 74 20 56  NSERT INTO ttt V
0a90: 41 4c 55 45 53 28 34 2c 20 27 79 27 2c 20 20 20  ALUES(4, 'y',   
0aa0: 20 20 27 6f 6e 65 27 29 3b 0a 20 20 49 4e 53 45    'one');.  INSE
0ab0: 52 54 20 49 4e 54 4f 20 74 74 74 20 56 41 4c 55  RT INTO ttt VALU
0ac0: 45 53 28 35 2c 20 27 78 27 2c 20 20 20 20 20 27  ES(5, 'x',     '
0ad0: 74 77 6f 27 29 3b 0a 20 20 49 4e 53 45 52 54 20  two');.  INSERT 
0ae0: 49 4e 54 4f 20 74 74 74 20 56 41 4c 55 45 53 28  INTO ttt VALUES(
0af0: 36 2c 20 27 79 27 2c 20 20 20 20 20 27 74 68 72  6, 'y',     'thr
0b00: 65 65 27 29 3b 0a 7d 0a 0a 66 6f 72 65 61 63 68  ee');.}..foreach
0b10: 20 6f 6d 69 74 20 7b 30 20 31 7d 20 7b 0a 20 20   omit {0 1} {.  
0b20: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
0b30: 31 2e 36 2e 24 6f 6d 69 74 2e 30 20 22 0a 20 20  1.6.$omit.0 ".  
0b40: 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74 31 3b    DROP TABLE t1;
0b50: 0a 20 20 20 20 43 52 45 41 54 45 20 56 49 52 54  .    CREATE VIRT
0b60: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49  UAL TABLE t1 USI
0b70: 4e 47 20 74 63 6c 28 27 76 74 61 62 5f 63 6d 64  NG tcl('vtab_cmd
0b80: 20 24 6f 6d 69 74 27 29 3b 0a 20 20 22 0a 20 20   $omit');.  ".  
0b90: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
0ba0: 31 2e 36 2e 24 6f 6d 69 74 2e 31 20 7b 20 0a 20  1.6.$omit.1 { . 
0bb0: 20 20 20 53 45 4c 45 43 54 20 72 6f 77 69 64 20     SELECT rowid 
0bc0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 63 20  FROM t1 WHERE c 
0bd0: 4c 49 4b 45 20 27 6f 25 27 0a 20 20 7d 20 7b 33  LIKE 'o%'.  } {3
0be0: 20 34 7d 0a 0a 20 20 64 6f 5f 65 78 65 63 73 71   4}..  do_execsq
0bf0: 6c 5f 74 65 73 74 20 31 2e 36 2e 24 6f 6d 69 74  l_test 1.6.$omit
0c00: 2e 32 20 7b 20 0a 20 20 20 20 53 45 4c 45 43 54  .2 { .    SELECT
0c10: 20 72 6f 77 69 64 20 46 52 4f 4d 20 74 31 20 57   rowid FROM t1 W
0c20: 48 45 52 45 20 63 20 4c 49 4b 45 20 27 6f 25 27  HERE c LIKE 'o%'
0c30: 20 4f 52 20 62 3d 27 79 27 0a 20 20 7d 20 7b 33   OR b='y'.  } {3
0c40: 20 34 20 36 7d 0a 0a 20 20 64 6f 5f 65 78 65 63   4 6}..  do_exec
0c50: 73 71 6c 5f 74 65 73 74 20 31 2e 36 2e 24 6f 6d  sql_test 1.6.$om
0c60: 69 74 2e 33 20 7b 20 0a 20 20 20 20 53 45 4c 45  it.3 { .    SELE
0c70: 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 74 31  CT rowid FROM t1
0c80: 20 57 48 45 52 45 20 63 20 3d 20 27 74 68 72 65   WHERE c = 'thre
0c90: 65 27 20 4f 52 20 63 20 4c 49 4b 45 20 27 6f 25  e' OR c LIKE 'o%
0ca0: 27 0a 20 20 7d 20 7b 31 20 36 20 33 20 34 7d 0a  '.  } {1 6 3 4}.
0cb0: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
0cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
0d00: 54 65 73 74 20 74 68 65 20 73 61 6d 65 20 70 61  Test the same pa
0d10: 74 74 65 72 6e 20 77 6f 72 6b 73 20 77 69 74 68  ttern works with
0d20: 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 73   ordinary tables
0d30: 2e 0a 23 0a 23 20 54 68 69 73 20 74 65 73 74 20  ..#.# This test 
0d40: 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66  does not work if
0d50: 20 74 68 65 20 49 43 55 20 65 78 74 65 6e 73 69   the ICU extensi
0d60: 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49  on is enabled. I
0d70: 43 55 20 6f 76 65 72 72 69 64 65 73 0a 23 20 4c  CU overrides.# L
0d80: 49 4b 45 20 2d 20 61 6e 64 20 74 68 69 73 20 6f  IKE - and this o
0d90: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79  ptimization only
0da0: 20 77 6f 72 6b 73 20 77 69 74 68 20 74 68 65 20   works with the 
0db0: 62 75 69 6c 74 2d 69 6e 20 4c 49 4b 45 20 66 75  built-in LIKE fu
0dc0: 6e 63 74 69 6f 6e 2e 0a 23 0a 69 66 63 61 70 61  nction..#.ifcapa
0dd0: 62 6c 65 20 21 69 63 75 20 7b 0a 20 20 64 6f 5f  ble !icu {.  do_
0de0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 32 2e 31  execsql_test 2.1
0df0: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
0e00: 42 4c 45 20 74 32 28 78 20 54 45 58 54 20 43 4f  BLE t2(x TEXT CO
0e10: 4c 4c 41 54 45 20 6e 6f 63 61 73 65 2c 20 79 20  LLATE nocase, y 
0e20: 54 45 58 54 29 3b 0a 20 20 20 20 43 52 45 41 54  TEXT);.    CREAT
0e30: 45 20 49 4e 44 45 58 20 74 32 78 20 4f 4e 20 74  E INDEX t2x ON t
0e40: 32 28 78 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61  2(x COLLATE noca
0e50: 73 65 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20  se);.    CREATE 
0e60: 49 4e 44 45 58 20 74 32 79 20 4f 4e 20 74 32 28  INDEX t2y ON t2(
0e70: 79 29 3b 0a 20 20 7d 0a 0a 20 20 64 6f 5f 65 71  y);.  }..  do_eq
0e80: 70 5f 74 65 73 74 20 32 2e 32 20 7b 0a 20 20 20  p_test 2.2 {.   
0e90: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0ea0: 32 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27  2 WHERE x LIKE '
0eb0: 61 62 63 25 27 20 4f 52 20 79 20 3d 20 27 64 65  abc%' OR y = 'de
0ec0: 66 27 0a 20 20 7d 20 7b 0a 20 20 20 20 30 20 30  f'.  } {.    0 0
0ed0: 20 30 20 7b 53 45 41 52 43 48 20 54 41 42 4c 45   0 {SEARCH TABLE
0ee0: 20 74 32 20 55 53 49 4e 47 20 49 4e 44 45 58 20   t2 USING INDEX 
0ef0: 74 32 78 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f  t2x (x>? AND x<?
0f00: 29 7d 0a 20 20 20 20 30 20 30 20 30 20 7b 53 45  )}.    0 0 0 {SE
0f10: 41 52 43 48 20 54 41 42 4c 45 20 74 32 20 55 53  ARCH TABLE t2 US
0f20: 49 4e 47 20 49 4e 44 45 58 20 74 32 79 20 28 79  ING INDEX t2y (y
0f30: 3d 3f 29 7d 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d  =?)}.  }.}..#---
0f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f80: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68  ------.# Test th
0f90: 61 74 20 61 6e 79 20 50 52 49 4d 41 52 59 20 4b  at any PRIMARY K
0fa0: 45 59 20 77 69 74 68 69 6e 20 61 20 73 71 6c 69  EY within a sqli
0fb0: 74 65 33 5f 64 65 63 6c 5f 76 74 61 62 28 29 20  te3_decl_vtab() 
0fc0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 0a 23 20  CREATE TABLE .# 
0fd0: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 63 75 72  statement is cur
0fe0: 72 65 6e 74 6c 79 20 69 67 6e 6f 72 65 64 2e 0a  rently ignored..
0ff0: 23 0a 70 72 6f 63 20 76 76 76 5f 63 6f 6d 6d 61  #.proc vvv_comma
1000: 6e 64 20 7b 6d 65 74 68 6f 64 20 61 72 67 73 7d  nd {method args}
1010: 20 7b 0a 20 20 73 77 69 74 63 68 20 2d 2d 20 24   {.  switch -- $
1020: 6d 65 74 68 6f 64 20 7b 0a 20 20 20 20 78 43 6f  method {.    xCo
1030: 6e 6e 65 63 74 20 7b 20 72 65 74 75 72 6e 20 22  nnect { return "
1040: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
1050: 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62  a PRIMARY KEY, b
1060: 2c 20 63 29 22 20 7d 0a 20 20 7d 0a 7d 0a 70 72  , c)" }.  }.}.pr
1070: 6f 63 20 79 79 79 5f 63 6f 6d 6d 61 6e 64 20 7b  oc yyy_command {
1080: 6d 65 74 68 6f 64 20 61 72 67 73 7d 20 7b 0a 20  method args} {. 
1090: 20 73 77 69 74 63 68 20 2d 2d 20 24 6d 65 74 68   switch -- $meth
10a0: 6f 64 20 7b 0a 20 20 20 20 78 43 6f 6e 6e 65 63  od {.    xConnec
10b0: 74 20 7b 20 72 65 74 75 72 6e 20 22 43 52 45 41  t { return "CREA
10c0: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
10d0: 2c 20 63 2c 20 50 52 49 4d 41 52 59 20 4b 45 59  , c, PRIMARY KEY
10e0: 28 61 2c 20 62 29 29 22 20 7d 0a 20 20 7d 0a 7d  (a, b))" }.  }.}
10f0: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
1100: 74 20 33 2e 31 20 7b 20 43 52 45 41 54 45 20 56  t 3.1 { CREATE V
1110: 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74 33 20  IRTUAL TABLE t3 
1120: 55 53 49 4e 47 20 74 63 6c 28 27 76 76 76 5f 63  USING tcl('vvv_c
1130: 6f 6d 6d 61 6e 64 27 29 20 7d 0a 64 6f 5f 65 78  ommand') }.do_ex
1140: 65 63 73 71 6c 5f 74 65 73 74 20 33 2e 32 20 7b  ecsql_test 3.2 {
1150: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
1160: 54 41 42 4c 45 20 74 34 20 55 53 49 4e 47 20 74  TABLE t4 USING t
1170: 63 6c 28 27 79 79 79 5f 63 6f 6d 6d 61 6e 64 27  cl('yyy_command'
1180: 29 20 7d 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74  ) }..finish_test
1190: 0a                                               .