Artifact
001788a114ad96d81d5154fe77c7f1e26e84b3a2b5635ca29e4f96f6decc534e:
- File
test/bestindex3.test
— part of check-in
[75ac7b4e]
at
2018-05-04 00:39:43
on branch trunk
— Make a separate limb in the EXPLAIN QUERY PLAN output for the various lines
associated with the OR-optimization.
(user:
drh
size: 4589)
[more...]
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.