/ Hex Artifact Content
Login

Artifact 001788a114ad96d81d5154fe77c7f1e26e84b3a2b5635ca29e4f96f6decc534e:


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 53 43 41 4e 20 54  R.     |--SCAN T
08b0: 41 42 4c 45 20 74 31 20 56 49 52 54 55 41 4c 20  ABLE t1 VIRTUAL 
08c0: 54 41 42 4c 45 20 49 4e 44 45 58 20 30 3a 61 20  TABLE INDEX 0:a 
08d0: 45 51 20 3f 0a 20 20 20 20 20 60 2d 2d 53 43 41  EQ ?.     `--SCA
08e0: 4e 20 54 41 42 4c 45 20 74 31 20 56 49 52 54 55  N TABLE t1 VIRTU
08f0: 41 4c 20 54 41 42 4c 45 20 49 4e 44 45 58 20 30  AL TABLE INDEX 0
0900: 3a 62 20 45 51 20 3f 0a 7d 0a 0a 64 6f 5f 65 71  :b EQ ?.}..do_eq
0910: 70 5f 74 65 73 74 20 31 2e 34 20 7b 0a 20 20 53  p_test 1.4 {.  S
0920: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
0930: 57 48 45 52 45 20 61 20 4c 49 4b 45 20 27 61 62  WHERE a LIKE 'ab
0940: 63 25 27 20 4f 52 20 62 20 3d 20 27 64 65 66 27  c%' OR b = 'def'
0950: 3b 0a 7d 20 7b 0a 20 20 51 55 45 52 59 20 50 4c  ;.} {.  QUERY PL
0960: 41 4e 0a 20 20 60 2d 2d 4d 55 4c 54 49 2d 49 4e  AN.  `--MULTI-IN
0970: 44 45 58 20 4f 52 0a 20 20 20 20 20 7c 2d 2d 53  DEX OR.     |--S
0980: 43 41 4e 20 54 41 42 4c 45 20 74 31 20 56 49 52  CAN TABLE t1 VIR
0990: 54 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45 58  TUAL TABLE INDEX
09a0: 20 30 3a 61 20 4c 49 4b 45 20 3f 0a 20 20 20 20   0:a LIKE ?.    
09b0: 20 60 2d 2d 53 43 41 4e 20 54 41 42 4c 45 20 74   `--SCAN TABLE t
09c0: 31 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  1 VIRTUAL TABLE 
09d0: 49 4e 44 45 58 20 30 3a 62 20 45 51 20 3f 0a 7d  INDEX 0:b EQ ?.}
09e0: 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  ..do_execsql_tes
09f0: 74 20 31 2e 35 20 7b 0a 20 20 43 52 45 41 54 45  t 1.5 {.  CREATE
0a00: 20 54 41 42 4c 45 20 74 74 74 28 61 2c 20 62 2c   TABLE ttt(a, b,
0a10: 20 63 29 3b 0a 0a 20 20 49 4e 53 45 52 54 20 49   c);..  INSERT I
0a20: 4e 54 4f 20 74 74 74 20 56 41 4c 55 45 53 28 31  NTO ttt VALUES(1
0a30: 2c 20 27 74 77 6f 27 2c 20 20 20 27 74 68 72 65  , 'two',   'thre
0a40: 65 27 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e  e');.  INSERT IN
0a50: 54 4f 20 74 74 74 20 56 41 4c 55 45 53 28 32 2c  TO ttt VALUES(2,
0a60: 20 27 6f 6e 65 27 2c 20 20 20 27 74 77 6f 27 29   'one',   'two')
0a70: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
0a80: 74 74 74 20 56 41 4c 55 45 53 28 33 2c 20 27 74  ttt VALUES(3, 't
0a90: 68 72 65 65 27 2c 20 27 6f 6e 65 27 29 3b 0a 20  hree', 'one');. 
0aa0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 74 74   INSERT INTO ttt
0ab0: 20 56 41 4c 55 45 53 28 34 2c 20 27 79 27 2c 20   VALUES(4, 'y', 
0ac0: 20 20 20 20 27 6f 6e 65 27 29 3b 0a 20 20 49 4e      'one');.  IN
0ad0: 53 45 52 54 20 49 4e 54 4f 20 74 74 74 20 56 41  SERT INTO ttt VA
0ae0: 4c 55 45 53 28 35 2c 20 27 78 27 2c 20 20 20 20  LUES(5, 'x',    
0af0: 20 27 74 77 6f 27 29 3b 0a 20 20 49 4e 53 45 52   'two');.  INSER
0b00: 54 20 49 4e 54 4f 20 74 74 74 20 56 41 4c 55 45  T INTO ttt VALUE
0b10: 53 28 36 2c 20 27 79 27 2c 20 20 20 20 20 27 74  S(6, 'y',     't
0b20: 68 72 65 65 27 29 3b 0a 7d 0a 0a 66 6f 72 65 61  hree');.}..forea
0b30: 63 68 20 6f 6d 69 74 20 7b 30 20 31 7d 20 7b 0a  ch omit {0 1} {.
0b40: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
0b50: 74 20 31 2e 36 2e 24 6f 6d 69 74 2e 30 20 22 0a  t 1.6.$omit.0 ".
0b60: 20 20 20 20 44 52 4f 50 20 54 41 42 4c 45 20 74      DROP TABLE t
0b70: 31 3b 0a 20 20 20 20 43 52 45 41 54 45 20 56 49  1;.    CREATE VI
0b80: 52 54 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55  RTUAL TABLE t1 U
0b90: 53 49 4e 47 20 74 63 6c 28 27 76 74 61 62 5f 63  SING tcl('vtab_c
0ba0: 6d 64 20 24 6f 6d 69 74 27 29 3b 0a 20 20 22 0a  md $omit');.  ".
0bb0: 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73    do_execsql_tes
0bc0: 74 20 31 2e 36 2e 24 6f 6d 69 74 2e 31 20 7b 20  t 1.6.$omit.1 { 
0bd0: 0a 20 20 20 20 53 45 4c 45 43 54 20 72 6f 77 69  .    SELECT rowi
0be0: 64 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  d FROM t1 WHERE 
0bf0: 63 20 4c 49 4b 45 20 27 6f 25 27 0a 20 20 7d 20  c LIKE 'o%'.  } 
0c00: 7b 33 20 34 7d 0a 0a 20 20 64 6f 5f 65 78 65 63  {3 4}..  do_exec
0c10: 73 71 6c 5f 74 65 73 74 20 31 2e 36 2e 24 6f 6d  sql_test 1.6.$om
0c20: 69 74 2e 32 20 7b 20 0a 20 20 20 20 53 45 4c 45  it.2 { .    SELE
0c30: 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 74 31  CT rowid FROM t1
0c40: 20 57 48 45 52 45 20 63 20 4c 49 4b 45 20 27 6f   WHERE c LIKE 'o
0c50: 25 27 20 4f 52 20 62 3d 27 79 27 0a 20 20 7d 20  %' OR b='y'.  } 
0c60: 7b 33 20 34 20 36 7d 0a 0a 20 20 64 6f 5f 65 78  {3 4 6}..  do_ex
0c70: 65 63 73 71 6c 5f 74 65 73 74 20 31 2e 36 2e 24  ecsql_test 1.6.$
0c80: 6f 6d 69 74 2e 33 20 7b 20 0a 20 20 20 20 53 45  omit.3 { .    SE
0c90: 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20  LECT rowid FROM 
0ca0: 74 31 20 57 48 45 52 45 20 63 20 3d 20 27 74 68  t1 WHERE c = 'th
0cb0: 72 65 65 27 20 4f 52 20 63 20 4c 49 4b 45 20 27  ree' OR c LIKE '
0cc0: 6f 25 27 0a 20 20 7d 20 7b 31 20 36 20 33 20 34  o%'.  } {1 6 3 4
0cd0: 7d 0a 7d 0a 0a 23 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 2d 2d 2d  ----------------
0d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
0d20: 23 20 54 65 73 74 20 74 68 65 20 73 61 6d 65 20  # Test the same 
0d30: 70 61 74 74 65 72 6e 20 77 6f 72 6b 73 20 77 69  pattern works wi
0d40: 74 68 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c  th ordinary tabl
0d50: 65 73 2e 0a 23 0a 23 20 54 68 69 73 20 74 65 73  es..#.# This tes
0d60: 74 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  t does not work 
0d70: 69 66 20 74 68 65 20 49 43 55 20 65 78 74 65 6e  if the ICU exten
0d80: 73 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2e  sion is enabled.
0d90: 20 49 43 55 20 6f 76 65 72 72 69 64 65 73 0a 23   ICU overrides.#
0da0: 20 4c 49 4b 45 20 2d 20 61 6e 64 20 74 68 69 73   LIKE - and this
0db0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e   optimization on
0dc0: 6c 79 20 77 6f 72 6b 73 20 77 69 74 68 20 74 68  ly works with th
0dd0: 65 20 62 75 69 6c 74 2d 69 6e 20 4c 49 4b 45 20  e built-in LIKE 
0de0: 66 75 6e 63 74 69 6f 6e 2e 0a 23 0a 69 66 63 61  function..#.ifca
0df0: 70 61 62 6c 65 20 21 69 63 75 20 7b 0a 20 20 64  pable !icu {.  d
0e00: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 32  o_execsql_test 2
0e10: 2e 31 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  .1 {.    CREATE 
0e20: 54 41 42 4c 45 20 74 32 28 78 20 54 45 58 54 20  TABLE t2(x TEXT 
0e30: 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 2c 20  COLLATE nocase, 
0e40: 79 20 54 45 58 54 29 3b 0a 20 20 20 20 43 52 45  y TEXT);.    CRE
0e50: 41 54 45 20 49 4e 44 45 58 20 74 32 78 20 4f 4e  ATE INDEX t2x ON
0e60: 20 74 32 28 78 20 43 4f 4c 4c 41 54 45 20 6e 6f   t2(x COLLATE no
0e70: 63 61 73 65 29 3b 0a 20 20 20 20 43 52 45 41 54  case);.    CREAT
0e80: 45 20 49 4e 44 45 58 20 74 32 79 20 4f 4e 20 74  E INDEX t2y ON t
0e90: 32 28 79 29 3b 0a 20 20 7d 0a 0a 20 20 64 6f 5f  2(y);.  }..  do_
0ea0: 65 71 70 5f 74 65 73 74 20 32 2e 32 20 7b 0a 20  eqp_test 2.2 {. 
0eb0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
0ec0: 20 74 32 20 57 48 45 52 45 20 78 20 4c 49 4b 45   t2 WHERE x LIKE
0ed0: 20 27 61 62 63 25 27 20 4f 52 20 79 20 3d 20 27   'abc%' OR y = '
0ee0: 64 65 66 27 0a 20 20 7d 20 5b 73 74 72 69 6e 67  def'.  } [string
0ef0: 20 6d 61 70 20 7b 22 5c 6e 20 20 22 20 5c 6e 7d   map {"\n  " \n}
0f00: 20 7b 0a 20 20 20 20 51 55 45 52 59 20 50 4c 41   {.    QUERY PLA
0f10: 4e 0a 20 20 20 20 60 2d 2d 4d 55 4c 54 49 2d 49  N.    `--MULTI-I
0f20: 4e 44 45 58 20 4f 52 0a 20 20 20 20 20 20 20 7c  NDEX OR.       |
0f30: 2d 2d 53 45 41 52 43 48 20 54 41 42 4c 45 20 74  --SEARCH TABLE t
0f40: 32 20 55 53 49 4e 47 20 49 4e 44 45 58 20 74 32  2 USING INDEX t2
0f50: 78 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 0a  x (x>? AND x<?).
0f60: 20 20 20 20 20 20 20 60 2d 2d 53 45 41 52 43 48         `--SEARCH
0f70: 20 54 41 42 4c 45 20 74 32 20 55 53 49 4e 47 20   TABLE t2 USING 
0f80: 49 4e 44 45 58 20 74 32 79 20 28 79 3d 3f 29 0a  INDEX t2y (y=?).
0f90: 20 20 7d 5d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d    }].}..#-------
0fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fe0: 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 61  --.# Test that a
0ff0: 6e 79 20 50 52 49 4d 41 52 59 20 4b 45 59 20 77  ny PRIMARY KEY w
1000: 69 74 68 69 6e 20 61 20 73 71 6c 69 74 65 33 5f  ithin a sqlite3_
1010: 64 65 63 6c 5f 76 74 61 62 28 29 20 43 52 45 41  decl_vtab() CREA
1020: 54 45 20 54 41 42 4c 45 20 0a 23 20 73 74 61 74  TE TABLE .# stat
1030: 65 6d 65 6e 74 20 69 73 20 63 75 72 72 65 6e 74  ement is current
1040: 6c 79 20 69 67 6e 6f 72 65 64 2e 0a 23 0a 70 72  ly ignored..#.pr
1050: 6f 63 20 76 76 76 5f 63 6f 6d 6d 61 6e 64 20 7b  oc vvv_command {
1060: 6d 65 74 68 6f 64 20 61 72 67 73 7d 20 7b 0a 20  method args} {. 
1070: 20 73 77 69 74 63 68 20 2d 2d 20 24 6d 65 74 68   switch -- $meth
1080: 6f 64 20 7b 0a 20 20 20 20 78 43 6f 6e 6e 65 63  od {.    xConnec
1090: 74 20 7b 20 72 65 74 75 72 6e 20 22 43 52 45 41  t { return "CREA
10a0: 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 50 52  TE TABLE t1(a PR
10b0: 49 4d 41 52 59 20 4b 45 59 2c 20 62 2c 20 63 29  IMARY KEY, b, c)
10c0: 22 20 7d 0a 20 20 7d 0a 7d 0a 70 72 6f 63 20 79  " }.  }.}.proc y
10d0: 79 79 5f 63 6f 6d 6d 61 6e 64 20 7b 6d 65 74 68  yy_command {meth
10e0: 6f 64 20 61 72 67 73 7d 20 7b 0a 20 20 73 77 69  od args} {.  swi
10f0: 74 63 68 20 2d 2d 20 24 6d 65 74 68 6f 64 20 7b  tch -- $method {
1100: 0a 20 20 20 20 78 43 6f 6e 6e 65 63 74 20 7b 20  .    xConnect { 
1110: 72 65 74 75 72 6e 20 22 43 52 45 41 54 45 20 54  return "CREATE T
1120: 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 63 2c  ABLE t1(a, b, c,
1130: 20 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 20   PRIMARY KEY(a, 
1140: 62 29 29 22 20 7d 0a 20 20 7d 0a 7d 0a 0a 64 6f  b))" }.  }.}..do
1150: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 33 2e  _execsql_test 3.
1160: 31 20 7b 20 43 52 45 41 54 45 20 56 49 52 54 55  1 { CREATE VIRTU
1170: 41 4c 20 54 41 42 4c 45 20 74 33 20 55 53 49 4e  AL TABLE t3 USIN
1180: 47 20 74 63 6c 28 27 76 76 76 5f 63 6f 6d 6d 61  G tcl('vvv_comma
1190: 6e 64 27 29 20 7d 0a 64 6f 5f 65 78 65 63 73 71  nd') }.do_execsq
11a0: 6c 5f 74 65 73 74 20 33 2e 32 20 7b 20 43 52 45  l_test 3.2 { CRE
11b0: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
11c0: 45 20 74 34 20 55 53 49 4e 47 20 74 63 6c 28 27  E t4 USING tcl('
11d0: 79 79 79 5f 63 6f 6d 6d 61 6e 64 27 29 20 7d 0a  yyy_command') }.
11e0: 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a           .finish_test.