/ Hex Artifact Content
Login

Artifact 7b4aaa4a8192fdec90e0a905984c92a688c51e48:


0000: 23 20 32 30 30 35 20 41 75 67 75 73 74 20 31 33  # 2005 August 13
0010: 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20  .#.# The author 
0020: 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69  disclaims copyri
0030: 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72  ght to this sour
0040: 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61  ce code.  In pla
0050: 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20  ce of.# a legal 
0060: 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20  notice, here is 
0070: 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20  a blessing:.#.# 
0080: 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f     May you do go
0090: 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e  od and not evil.
00a0: 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69  .#    May you fi
00b0: 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66  nd forgiveness f
00c0: 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20  or yourself and 
00d0: 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a  forgive others..
00e0: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61  #    May you sha
00f0: 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72  re freely, never
0100: 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61   taking more tha
0110: 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a  n 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 2a 2a 0a 23 20 54 68 69 73 20 66 69  ******.# This fi
0170: 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 72 65  le implements re
0180: 67 72 65 73 73 69 6f 6e 20 74 65 73 74 73 20 66  gression tests f
0190: 6f 72 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  or SQLite librar
01a0: 79 2e 20 20 54 68 65 0a 23 20 66 6f 63 75 73 20  y.  The.# focus 
01b0: 6f 66 20 74 68 69 73 20 66 69 6c 65 20 69 73 20  of this file is 
01c0: 74 65 73 74 69 6e 67 20 74 68 65 20 4c 49 4b 45  testing the LIKE
01d0: 20 61 6e 64 20 47 4c 4f 42 20 6f 70 65 72 61 74   and GLOB operat
01e0: 6f 72 73 20 61 6e 64 0a 23 20 69 6e 20 70 61 72  ors and.# in par
01f0: 74 69 63 75 6c 61 72 20 74 68 65 20 6f 70 74 69  ticular the opti
0200: 6d 69 7a 61 74 69 6f 6e 73 20 74 68 61 74 20 6f  mizations that o
0210: 63 63 75 72 20 74 6f 20 68 65 6c 70 20 74 68 6f  ccur to help tho
0220: 73 65 20 6f 70 65 72 61 74 6f 72 73 0a 23 20 72  se operators.# r
0230: 75 6e 20 66 61 73 74 65 72 2e 0a 23 0a 23 20 24  un faster..#.# $
0240: 49 64 3a 20 6c 69 6b 65 2e 74 65 73 74 2c 76 20  Id: like.test,v 
0250: 31 2e 31 33 20 32 30 30 39 2f 30 36 2f 30 37 20  1.13 2009/06/07 
0260: 32 33 3a 34 35 3a 31 31 20 64 72 68 20 45 78 70  23:45:11 drh Exp
0270: 20 24 0a 0a 73 65 74 20 74 65 73 74 64 69 72 20   $..set testdir 
0280: 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 61  [file dirname $a
0290: 72 67 76 30 5d 0a 73 6f 75 72 63 65 20 24 74 65  rgv0].source $te
02a0: 73 74 64 69 72 2f 74 65 73 74 65 72 2e 74 63 6c  stdir/tester.tcl
02b0: 0a 0a 23 20 43 72 65 61 74 65 20 73 6f 6d 65 20  ..# Create some 
02c0: 73 61 6d 70 6c 65 20 64 61 74 61 20 74 6f 20 77  sample data to w
02d0: 6f 72 6b 20 77 69 74 68 2e 0a 23 0a 64 6f 5f 74  ork with..#.do_t
02e0: 65 73 74 20 6c 69 6b 65 2d 31 2e 30 20 7b 0a 20  est like-1.0 {. 
02f0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
0300: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78  REATE TABLE t1(x
0310: 20 54 45 58 54 29 3b 0a 20 20 7d 0a 20 20 66 6f   TEXT);.  }.  fo
0320: 72 65 61 63 68 20 73 74 72 20 7b 0a 20 20 20 20  reach str {.    
0330: 61 0a 20 20 20 20 61 62 0a 20 20 20 20 61 62 63  a.    ab.    abc
0340: 0a 20 20 20 20 61 62 63 64 0a 0a 20 20 20 20 61  .    abcd..    a
0350: 63 64 0a 20 20 20 20 61 62 64 0a 20 20 20 20 62  cd.    abd.    b
0360: 63 0a 20 20 20 20 62 63 64 0a 0a 20 20 20 20 78  c.    bcd..    x
0370: 79 7a 0a 20 20 20 20 41 42 43 0a 20 20 20 20 43  yz.    ABC.    C
0380: 44 45 0a 20 20 20 20 7b 41 42 43 20 61 62 63 20  DE.    {ABC abc 
0390: 78 79 7a 7d 0a 20 20 7d 20 7b 0a 20 20 20 20 64  xyz}.  } {.    d
03a0: 62 20 65 76 61 6c 20 7b 49 4e 53 45 52 54 20 49  b eval {INSERT I
03b0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 3a 73  NTO t1 VALUES(:s
03c0: 74 72 29 7d 0a 20 20 7d 0a 20 20 65 78 65 63 73  tr)}.  }.  execs
03d0: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
03e0: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31  count(*) FROM t1
03f0: 3b 0a 20 20 7d 0a 7d 20 7b 31 32 7d 0a 0a 23 20  ;.  }.} {12}..# 
0400: 54 65 73 74 20 74 68 61 74 20 62 6f 74 68 20 63  Test that both c
0410: 61 73 65 20 73 65 6e 73 69 74 69 76 65 20 61 6e  ase sensitive an
0420: 64 20 69 6e 73 65 6e 73 69 74 69 76 65 20 76 65  d insensitive ve
0430: 72 73 69 6f 6e 20 6f 66 20 4c 49 4b 45 20 77 6f  rsion of LIKE wo
0440: 72 6b 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 6c 69  rk..#.do_test li
0450: 6b 65 2d 31 2e 31 20 7b 0a 20 20 65 78 65 63 73  ke-1.1 {.  execs
0460: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
0470: 78 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  x FROM t1 WHERE 
0480: 78 20 4c 49 4b 45 20 27 61 62 63 27 20 4f 52 44  x LIKE 'abc' ORD
0490: 45 52 20 42 59 20 31 3b 0a 20 20 7d 0a 7d 20 7b  ER BY 1;.  }.} {
04a0: 41 42 43 20 61 62 63 7d 0a 64 6f 5f 74 65 73 74  ABC abc}.do_test
04b0: 20 6c 69 6b 65 2d 31 2e 32 20 7b 0a 20 20 65 78   like-1.2 {.  ex
04c0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  ecsql {.    SELE
04d0: 43 54 20 78 20 46 52 4f 4d 20 74 31 20 57 48 45  CT x FROM t1 WHE
04e0: 52 45 20 78 20 47 4c 4f 42 20 27 61 62 63 27 20  RE x GLOB 'abc' 
04f0: 4f 52 44 45 52 20 42 59 20 31 3b 0a 20 20 7d 0a  ORDER BY 1;.  }.
0500: 7d 20 7b 61 62 63 7d 0a 64 6f 5f 74 65 73 74 20  } {abc}.do_test 
0510: 6c 69 6b 65 2d 31 2e 33 20 7b 0a 20 20 65 78 65  like-1.3 {.  exe
0520: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
0530: 54 20 78 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T x FROM t1 WHER
0540: 45 20 78 20 4c 49 4b 45 20 27 41 42 43 27 20 4f  E x LIKE 'ABC' O
0550: 52 44 45 52 20 42 59 20 31 3b 0a 20 20 7d 0a 7d  RDER BY 1;.  }.}
0560: 20 7b 41 42 43 20 61 62 63 7d 0a 64 6f 5f 74 65   {ABC abc}.do_te
0570: 73 74 20 6c 69 6b 65 2d 31 2e 34 20 7b 0a 20 20  st like-1.4 {.  
0580: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
0590: 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20 57  LECT x FROM t1 W
05a0: 48 45 52 45 20 78 20 4c 49 4b 45 20 27 61 42 63  HERE x LIKE 'aBc
05b0: 27 20 4f 52 44 45 52 20 42 59 20 31 3b 0a 20 20  ' ORDER BY 1;.  
05c0: 7d 0a 7d 20 7b 41 42 43 20 61 62 63 7d 0a 64 6f  }.} {ABC abc}.do
05d0: 5f 74 65 73 74 20 6c 69 6b 65 2d 31 2e 35 2e 31  _test like-1.5.1
05e0: 20 7b 0a 20 20 23 20 55 73 65 20 73 71 6c 69 74   {.  # Use sqlit
05f0: 65 33 5f 65 78 65 63 28 29 20 74 6f 20 76 65 72  e3_exec() to ver
0600: 69 66 79 20 66 69 78 20 66 6f 72 20 74 69 63 6b  ify fix for tick
0610: 65 74 20 5b 32 35 65 65 38 31 32 37 31 30 39 31  et [25ee81271091
0620: 5d 20 32 30 31 31 2d 30 36 2d 32 36 0a 20 20 73  ] 2011-06-26.  s
0630: 71 6c 69 74 65 33 5f 65 78 65 63 20 64 62 20 7b  qlite3_exec db {
0640: 50 52 41 47 4d 41 20 63 61 73 65 5f 73 65 6e 73  PRAGMA case_sens
0650: 69 74 69 76 65 5f 6c 69 6b 65 3d 6f 6e 7d 0a 7d  itive_like=on}.}
0660: 20 7b 30 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20   {0 {}}.do_test 
0670: 6c 69 6b 65 2d 31 2e 35 2e 32 20 7b 0a 20 20 65  like-1.5.2 {.  e
0680: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
0690: 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20 57 48  ECT x FROM t1 WH
06a0: 45 52 45 20 78 20 4c 49 4b 45 20 27 61 62 63 27  ERE x LIKE 'abc'
06b0: 20 4f 52 44 45 52 20 42 59 20 31 3b 0a 20 20 7d   ORDER BY 1;.  }
06c0: 0a 7d 20 7b 61 62 63 7d 0a 64 6f 5f 74 65 73 74  .} {abc}.do_test
06d0: 20 6c 69 6b 65 2d 31 2e 35 2e 33 20 7b 0a 20 20   like-1.5.3 {.  
06e0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
06f0: 41 47 4d 41 20 63 61 73 65 5f 73 65 6e 73 69 74  AGMA case_sensit
0700: 69 76 65 5f 6c 69 6b 65 3b 20 2d 2d 20 6e 6f 20  ive_like; -- no 
0710: 61 72 67 75 6d 65 6e 74 3b 20 64 6f 65 73 20 6e  argument; does n
0720: 6f 74 20 63 68 61 6e 67 65 20 73 65 74 74 69 6e  ot change settin
0730: 67 0a 20 20 20 20 53 45 4c 45 43 54 20 78 20 46  g.    SELECT x F
0740: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 78 20 4c  ROM t1 WHERE x L
0750: 49 4b 45 20 27 61 62 63 27 20 4f 52 44 45 52 20  IKE 'abc' ORDER 
0760: 42 59 20 31 3b 0a 20 20 7d 0a 7d 20 7b 61 62 63  BY 1;.  }.} {abc
0770: 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 31  }.do_test like-1
0780: 2e 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .6 {.  execsql {
0790: 0a 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52  .    SELECT x FR
07a0: 4f 4d 20 74 31 20 57 48 45 52 45 20 78 20 47 4c  OM t1 WHERE x GL
07b0: 4f 42 20 27 61 62 63 27 20 4f 52 44 45 52 20 42  OB 'abc' ORDER B
07c0: 59 20 31 3b 0a 20 20 7d 0a 7d 20 7b 61 62 63 7d  Y 1;.  }.} {abc}
07d0: 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 31 2e  .do_test like-1.
07e0: 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  7 {.  execsql {.
07f0: 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f      SELECT x FRO
0800: 4d 20 74 31 20 57 48 45 52 45 20 78 20 4c 49 4b  M t1 WHERE x LIK
0810: 45 20 27 41 42 43 27 20 4f 52 44 45 52 20 42 59  E 'ABC' ORDER BY
0820: 20 31 3b 0a 20 20 7d 0a 7d 20 7b 41 42 43 7d 0a   1;.  }.} {ABC}.
0830: 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 31 2e 38  do_test like-1.8
0840: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
0850: 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d     SELECT x FROM
0860: 20 74 31 20 57 48 45 52 45 20 78 20 4c 49 4b 45   t1 WHERE x LIKE
0870: 20 27 61 42 63 27 20 4f 52 44 45 52 20 42 59 20   'aBc' ORDER BY 
0880: 31 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  1;.  }.} {}.do_t
0890: 65 73 74 20 6c 69 6b 65 2d 31 2e 39 20 7b 0a 20  est like-1.9 {. 
08a0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
08b0: 52 41 47 4d 41 20 63 61 73 65 5f 73 65 6e 73 69  RAGMA case_sensi
08c0: 74 69 76 65 5f 6c 69 6b 65 3d 6f 66 66 3b 0a 20  tive_like=off;. 
08d0: 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d     SELECT x FROM
08e0: 20 74 31 20 57 48 45 52 45 20 78 20 4c 49 4b 45   t1 WHERE x LIKE
08f0: 20 27 61 62 63 27 20 4f 52 44 45 52 20 42 59 20   'abc' ORDER BY 
0900: 31 3b 0a 20 20 7d 0a 7d 20 7b 41 42 43 20 61 62  1;.  }.} {ABC ab
0910: 63 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d  c}.do_test like-
0920: 31 2e 31 30 20 7b 0a 20 20 65 78 65 63 73 71 6c  1.10 {.  execsql
0930: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61   {.    PRAGMA ca
0940: 73 65 5f 73 65 6e 73 69 74 69 76 65 5f 6c 69 6b  se_sensitive_lik
0950: 65 3b 20 20 2d 2d 20 4e 6f 20 61 72 67 75 6d 65  e;  -- No argume
0960: 6e 74 2c 20 64 6f 65 73 20 6e 6f 74 20 63 68 61  nt, does not cha
0970: 6e 67 65 20 73 65 74 74 69 6e 67 2e 0a 20 20 20  nge setting..   
0980: 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74   SELECT x FROM t
0990: 31 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27  1 WHERE x LIKE '
09a0: 61 62 63 27 20 4f 52 44 45 52 20 42 59 20 31 3b  abc' ORDER BY 1;
09b0: 0a 20 20 7d 0a 7d 20 7b 41 42 43 20 61 62 63 7d  .  }.} {ABC abc}
09c0: 0a 0a 23 20 54 65 73 74 73 20 6f 66 20 74 68 65  ..# Tests of the
09d0: 20 52 45 47 45 58 50 20 6f 70 65 72 61 74 6f 72   REGEXP operator
09e0: 0a 23 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d  .#.do_test like-
09f0: 32 2e 31 20 7b 0a 20 20 70 72 6f 63 20 74 65 73  2.1 {.  proc tes
0a00: 74 5f 72 65 67 65 78 70 20 7b 61 20 62 7d 20 7b  t_regexp {a b} {
0a10: 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 72 65 67  .    return [reg
0a20: 65 78 70 20 24 61 20 24 62 5d 0a 20 20 7d 0a 20  exp $a $b].  }. 
0a30: 20 64 62 20 66 75 6e 63 74 69 6f 6e 20 72 65 67   db function reg
0a40: 65 78 70 20 2d 61 72 67 63 6f 75 6e 74 20 32 20  exp -argcount 2 
0a50: 74 65 73 74 5f 72 65 67 65 78 70 0a 20 20 65 78  test_regexp.  ex
0a60: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  ecsql {.    SELE
0a70: 43 54 20 78 20 46 52 4f 4d 20 74 31 20 57 48 45  CT x FROM t1 WHE
0a80: 52 45 20 78 20 52 45 47 45 58 50 20 27 61 62 63  RE x REGEXP 'abc
0a90: 27 20 4f 52 44 45 52 20 42 59 20 31 3b 0a 20 20  ' ORDER BY 1;.  
0aa0: 7d 0a 7d 20 7b 7b 41 42 43 20 61 62 63 20 78 79  }.} {{ABC abc xy
0ab0: 7a 7d 20 61 62 63 20 61 62 63 64 7d 0a 64 6f 5f  z} abc abcd}.do_
0ac0: 74 65 73 74 20 6c 69 6b 65 2d 32 2e 32 20 7b 0a  test like-2.2 {.
0ad0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
0ae0: 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31  SELECT x FROM t1
0af0: 20 57 48 45 52 45 20 78 20 52 45 47 45 58 50 20   WHERE x REGEXP 
0b00: 27 5e 61 62 63 27 20 4f 52 44 45 52 20 42 59 20  '^abc' ORDER BY 
0b10: 31 3b 0a 20 20 7d 0a 7d 20 7b 61 62 63 20 61 62  1;.  }.} {abc ab
0b20: 63 64 7d 0a 0a 23 20 54 65 73 74 73 20 6f 66 20  cd}..# Tests of 
0b30: 74 68 65 20 4d 41 54 43 48 20 6f 70 65 72 61 74  the MATCH operat
0b40: 6f 72 0a 23 0a 64 6f 5f 74 65 73 74 20 6c 69 6b  or.#.do_test lik
0b50: 65 2d 32 2e 33 20 7b 0a 20 20 70 72 6f 63 20 74  e-2.3 {.  proc t
0b60: 65 73 74 5f 6d 61 74 63 68 20 7b 61 20 62 7d 20  est_match {a b} 
0b70: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 73 74  {.    return [st
0b80: 72 69 6e 67 20 6d 61 74 63 68 20 24 61 20 24 62  ring match $a $b
0b90: 5d 0a 20 20 7d 0a 20 20 64 62 20 66 75 6e 63 74  ].  }.  db funct
0ba0: 69 6f 6e 20 6d 61 74 63 68 20 2d 61 72 67 63 6f  ion match -argco
0bb0: 75 6e 74 20 32 20 74 65 73 74 5f 6d 61 74 63 68  unt 2 test_match
0bc0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
0bd0: 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74   SELECT x FROM t
0be0: 31 20 57 48 45 52 45 20 78 20 4d 41 54 43 48 20  1 WHERE x MATCH 
0bf0: 27 2a 61 62 63 2a 27 20 4f 52 44 45 52 20 42 59  '*abc*' ORDER BY
0c00: 20 31 3b 0a 20 20 7d 0a 7d 20 7b 7b 41 42 43 20   1;.  }.} {{ABC 
0c10: 61 62 63 20 78 79 7a 7d 20 61 62 63 20 61 62 63  abc xyz} abc abc
0c20: 64 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d  d}.do_test like-
0c30: 32 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.4 {.  execsql 
0c40: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 78 20 46  {.    SELECT x F
0c50: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 78 20 4d  ROM t1 WHERE x M
0c60: 41 54 43 48 20 27 61 62 63 2a 27 20 4f 52 44 45  ATCH 'abc*' ORDE
0c70: 52 20 42 59 20 31 3b 0a 20 20 7d 0a 7d 20 7b 61  R BY 1;.  }.} {a
0c80: 62 63 20 61 62 63 64 7d 0a 0a 23 20 46 6f 72 20  bc abcd}..# For 
0c90: 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 74 65  the remaining te
0ca0: 73 74 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20  sts, we need to 
0cb0: 68 61 76 65 20 74 68 65 20 6c 69 6b 65 20 6f 70  have the like op
0cc0: 74 69 6d 69 7a 61 74 69 6f 6e 73 0a 23 20 65 6e  timizations.# en
0cd0: 61 62 6c 65 64 2e 0a 23 0a 69 66 63 61 70 61 62  abled..#.ifcapab
0ce0: 6c 65 20 21 6c 69 6b 65 5f 6f 70 74 20 7b 0a 20  le !like_opt {. 
0cf0: 20 66 69 6e 69 73 68 5f 74 65 73 74 0a 20 20 72   finish_test.  r
0d00: 65 74 75 72 6e 0a 7d 20 0a 0a 23 20 54 68 69 73  eturn.} ..# This
0d10: 20 70 72 6f 63 65 64 75 72 65 20 65 78 65 63 75   procedure execu
0d20: 74 65 73 20 74 68 65 20 53 51 4c 2e 20 20 54 68  tes the SQL.  Th
0d30: 65 6e 20 69 74 20 61 70 70 65 6e 64 73 20 74 6f  en it appends to
0d40: 20 74 68 65 20 72 65 73 75 6c 74 20 74 68 65 0a   the result the.
0d50: 23 20 22 73 6f 72 74 22 20 6f 72 20 22 6e 6f 73  # "sort" or "nos
0d60: 6f 72 74 22 20 6b 65 79 77 6f 72 64 20 28 61 73  ort" keyword (as
0d70: 20 69 6e 20 74 68 65 20 63 6b 73 6f 72 74 20 70   in the cksort p
0d80: 72 6f 63 65 64 75 72 65 20 61 62 6f 76 65 29 20  rocedure above) 
0d90: 74 68 65 6e 0a 23 20 69 74 20 61 70 70 65 6e 64  then.# it append
0da0: 73 20 74 68 65 20 3a 3a 73 71 6c 69 74 65 5f 71  s the ::sqlite_q
0db0: 75 65 72 79 5f 70 6c 61 6e 20 76 61 72 69 61 62  uery_plan variab
0dc0: 6c 65 2e 0a 23 0a 70 72 6f 63 20 71 75 65 72 79  le..#.proc query
0dd0: 70 6c 61 6e 20 7b 73 71 6c 7d 20 7b 0a 20 20 73  plan {sql} {.  s
0de0: 65 74 20 3a 3a 73 71 6c 69 74 65 5f 73 6f 72 74  et ::sqlite_sort
0df0: 5f 63 6f 75 6e 74 20 30 0a 20 20 73 65 74 20 64  _count 0.  set d
0e00: 61 74 61 20 5b 65 78 65 63 73 71 6c 20 24 73 71  ata [execsql $sq
0e10: 6c 5d 0a 20 20 69 66 20 7b 24 3a 3a 73 71 6c 69  l].  if {$::sqli
0e20: 74 65 5f 73 6f 72 74 5f 63 6f 75 6e 74 7d 20 7b  te_sort_count} {
0e30: 73 65 74 20 78 20 73 6f 72 74 7d 20 7b 73 65 74  set x sort} {set
0e40: 20 78 20 6e 6f 73 6f 72 74 7d 0a 20 20 6c 61 70   x nosort}.  lap
0e50: 70 65 6e 64 20 64 61 74 61 20 24 78 0a 20 20 72  pend data $x.  r
0e60: 65 74 75 72 6e 20 5b 63 6f 6e 63 61 74 20 24 64  eturn [concat $d
0e70: 61 74 61 20 24 3a 3a 73 71 6c 69 74 65 5f 71 75  ata $::sqlite_qu
0e80: 65 72 79 5f 70 6c 61 6e 5d 0a 7d 0a 0a 23 20 50  ery_plan].}..# P
0e90: 65 72 66 6f 72 6d 20 74 65 73 74 73 20 6f 6e 20  erform tests on 
0ea0: 74 68 65 20 6c 69 6b 65 20 6f 70 74 69 6d 69 7a  the like optimiz
0eb0: 61 74 69 6f 6e 2e 0a 23 0a 23 20 57 69 74 68 20  ation..#.# With 
0ec0: 6e 6f 20 69 6e 64 65 78 20 6f 6e 20 74 31 2e 78  no index on t1.x
0ed0: 20 61 6e 64 20 77 69 74 68 20 63 61 73 65 20 73   and with case s
0ee0: 65 6e 73 69 74 69 76 69 74 79 20 74 75 72 6e 65  ensitivity turne
0ef0: 64 20 6f 66 66 2c 20 6e 6f 20 6f 70 74 69 6d 69  d off, no optimi
0f00: 7a 61 74 69 6f 6e 0a 23 20 69 73 20 70 65 72 66  zation.# is perf
0f10: 6f 72 6d 65 64 2e 0a 23 0a 64 6f 5f 74 65 73 74  ormed..#.do_test
0f20: 20 6c 69 6b 65 2d 33 2e 31 20 7b 0a 20 20 73 65   like-3.1 {.  se
0f30: 74 20 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f  t sqlite_like_co
0f40: 75 6e 74 20 30 0a 20 20 71 75 65 72 79 70 6c 61  unt 0.  querypla
0f50: 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 78  n {.    SELECT x
0f60: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 78   FROM t1 WHERE x
0f70: 20 4c 49 4b 45 20 27 61 62 63 25 27 20 4f 52 44   LIKE 'abc%' ORD
0f80: 45 52 20 42 59 20 31 3b 0a 20 20 7d 0a 7d 20 7b  ER BY 1;.  }.} {
0f90: 41 42 43 20 7b 41 42 43 20 61 62 63 20 78 79 7a  ABC {ABC abc xyz
0fa0: 7d 20 61 62 63 20 61 62 63 64 20 73 6f 72 74 20  } abc abcd sort 
0fb0: 74 31 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 6c  t1 {}}.do_test l
0fc0: 69 6b 65 2d 33 2e 32 20 7b 0a 20 20 73 65 74 20  ike-3.2 {.  set 
0fd0: 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e  sqlite_like_coun
0fe0: 74 0a 7d 20 7b 31 32 7d 0a 0a 23 20 57 69 74 68  t.} {12}..# With
0ff0: 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 74 31 2e   an index on t1.
1000: 78 20 61 6e 64 20 63 61 73 65 20 73 65 6e 73 69  x and case sensi
1010: 74 69 76 69 74 79 20 6f 6e 2c 20 6f 70 74 69 6d  tivity on, optim
1020: 69 7a 65 20 63 6f 6d 70 6c 65 74 65 6c 79 2e 0a  ize completely..
1030: 23 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 33  #.do_test like-3
1040: 2e 33 20 7b 0a 20 20 73 65 74 20 73 71 6c 69 74  .3 {.  set sqlit
1050: 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 20 30 0a 20  e_like_count 0. 
1060: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
1070: 52 41 47 4d 41 20 63 61 73 65 5f 73 65 6e 73 69  RAGMA case_sensi
1080: 74 69 76 65 5f 6c 69 6b 65 3d 6f 6e 3b 0a 20 20  tive_like=on;.  
1090: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
10a0: 31 20 4f 4e 20 74 31 28 78 29 3b 0a 20 20 7d 0a  1 ON t1(x);.  }.
10b0: 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20    queryplan {.  
10c0: 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20    SELECT x FROM 
10d0: 74 31 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20  t1 WHERE x LIKE 
10e0: 27 61 62 63 25 27 20 4f 52 44 45 52 20 42 59 20  'abc%' ORDER BY 
10f0: 31 3b 0a 20 20 7d 0a 7d 20 7b 61 62 63 20 61 62  1;.  }.} {abc ab
1100: 63 64 20 6e 6f 73 6f 72 74 20 7b 7d 20 69 31 7d  cd nosort {} i1}
1110: 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 33 2e  .do_test like-3.
1120: 34 20 7b 0a 20 20 73 65 74 20 73 71 6c 69 74 65  4 {.  set sqlite
1130: 5f 6c 69 6b 65 5f 63 6f 75 6e 74 0a 7d 20 30 0a  _like_count.} 0.
1140: 0a 23 20 54 68 65 20 4c 49 4b 45 20 6f 70 74 69  .# The LIKE opti
1150: 6d 69 7a 61 74 69 6f 6e 20 73 74 69 6c 6c 20 77  mization still w
1160: 6f 72 6b 73 20 77 68 65 6e 20 74 68 65 20 52 48  orks when the RH
1170: 53 20 69 73 20 61 20 73 74 72 69 6e 67 20 77 69  S is a string wi
1180: 74 68 20 6e 6f 0a 23 20 77 69 6c 64 63 61 72 64  th no.# wildcard
1190: 2e 20 20 54 69 63 6b 65 74 20 5b 65 30 39 30 31  .  Ticket [e0901
11a0: 38 33 35 33 31 66 63 32 37 34 37 5d 0a 23 0a 64  83531fc2747].#.d
11b0: 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 33 2e 34 2e  o_test like-3.4.
11c0: 32 20 7b 0a 20 20 71 75 65 72 79 70 6c 61 6e 20  2 {.  queryplan 
11d0: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 78 20 46  {.    SELECT x F
11e0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 78 20 4c  ROM t1 WHERE x L
11f0: 49 4b 45 20 27 61 27 20 4f 52 44 45 52 20 42 59  IKE 'a' ORDER BY
1200: 20 31 3b 0a 20 20 7d 0a 7d 20 7b 61 20 6e 6f 73   1;.  }.} {a nos
1210: 6f 72 74 20 7b 7d 20 69 31 7d 0a 64 6f 5f 74 65  ort {} i1}.do_te
1220: 73 74 20 6c 69 6b 65 2d 33 2e 34 2e 33 20 7b 0a  st like-3.4.3 {.
1230: 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20    queryplan {.  
1240: 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20    SELECT x FROM 
1250: 74 31 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20  t1 WHERE x LIKE 
1260: 27 61 62 27 20 4f 52 44 45 52 20 42 59 20 31 3b  'ab' ORDER BY 1;
1270: 0a 20 20 7d 0a 7d 20 7b 61 62 20 6e 6f 73 6f 72  .  }.} {ab nosor
1280: 74 20 7b 7d 20 69 31 7d 0a 64 6f 5f 74 65 73 74  t {} i1}.do_test
1290: 20 6c 69 6b 65 2d 33 2e 34 2e 34 20 7b 0a 20 20   like-3.4.4 {.  
12a0: 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20  queryplan {.    
12b0: 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31  SELECT x FROM t1
12c0: 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27 61   WHERE x LIKE 'a
12d0: 62 63 64 27 20 4f 52 44 45 52 20 42 59 20 31 3b  bcd' ORDER BY 1;
12e0: 0a 20 20 7d 0a 7d 20 7b 61 62 63 64 20 6e 6f 73  .  }.} {abcd nos
12f0: 6f 72 74 20 7b 7d 20 69 31 7d 0a 64 6f 5f 74 65  ort {} i1}.do_te
1300: 73 74 20 6c 69 6b 65 2d 33 2e 34 2e 35 20 7b 0a  st like-3.4.5 {.
1310: 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20    queryplan {.  
1320: 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20    SELECT x FROM 
1330: 74 31 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20  t1 WHERE x LIKE 
1340: 27 61 62 63 64 65 27 20 4f 52 44 45 52 20 42 59  'abcde' ORDER BY
1350: 20 31 3b 0a 20 20 7d 0a 7d 20 7b 6e 6f 73 6f 72   1;.  }.} {nosor
1360: 74 20 7b 7d 20 69 31 7d 0a 0a 0a 23 20 50 61 72  t {} i1}...# Par
1370: 74 69 61 6c 20 6f 70 74 69 6d 69 7a 61 74 69 6f  tial optimizatio
1380: 6e 20 77 68 65 6e 20 74 68 65 20 70 61 74 74 65  n when the patte
1390: 72 6e 20 64 6f 65 73 20 6e 6f 74 20 65 6e 64 20  rn does not end 
13a0: 69 6e 20 27 25 27 0a 23 0a 64 6f 5f 74 65 73 74  in '%'.#.do_test
13b0: 20 6c 69 6b 65 2d 33 2e 35 20 7b 0a 20 20 73 65   like-3.5 {.  se
13c0: 74 20 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f  t sqlite_like_co
13d0: 75 6e 74 20 30 0a 20 20 71 75 65 72 79 70 6c 61  unt 0.  querypla
13e0: 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 78  n {.    SELECT x
13f0: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 78   FROM t1 WHERE x
1400: 20 4c 49 4b 45 20 27 61 5f 63 27 20 4f 52 44 45   LIKE 'a_c' ORDE
1410: 52 20 42 59 20 31 3b 0a 20 20 7d 0a 7d 20 7b 61  R BY 1;.  }.} {a
1420: 62 63 20 6e 6f 73 6f 72 74 20 7b 7d 20 69 31 7d  bc nosort {} i1}
1430: 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 33 2e  .do_test like-3.
1440: 36 20 7b 0a 20 20 73 65 74 20 73 71 6c 69 74 65  6 {.  set sqlite
1450: 5f 6c 69 6b 65 5f 63 6f 75 6e 74 0a 7d 20 36 0a  _like_count.} 6.
1460: 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 33 2e 37  do_test like-3.7
1470: 20 7b 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f   {.  set sqlite_
1480: 6c 69 6b 65 5f 63 6f 75 6e 74 20 30 0a 20 20 71  like_count 0.  q
1490: 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53  ueryplan {.    S
14a0: 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20  ELECT x FROM t1 
14b0: 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27 61 62  WHERE x LIKE 'ab
14c0: 25 64 27 20 4f 52 44 45 52 20 42 59 20 31 3b 0a  %d' ORDER BY 1;.
14d0: 20 20 7d 0a 7d 20 7b 61 62 63 64 20 61 62 64 20    }.} {abcd abd 
14e0: 6e 6f 73 6f 72 74 20 7b 7d 20 69 31 7d 0a 64 6f  nosort {} i1}.do
14f0: 5f 74 65 73 74 20 6c 69 6b 65 2d 33 2e 38 20 7b  _test like-3.8 {
1500: 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f 6c 69  .  set sqlite_li
1510: 6b 65 5f 63 6f 75 6e 74 0a 7d 20 34 0a 64 6f 5f  ke_count.} 4.do_
1520: 74 65 73 74 20 6c 69 6b 65 2d 33 2e 39 20 7b 0a  test like-3.9 {.
1530: 20 20 73 65 74 20 73 71 6c 69 74 65 5f 6c 69 6b    set sqlite_lik
1540: 65 5f 63 6f 75 6e 74 20 30 0a 20 20 71 75 65 72  e_count 0.  quer
1550: 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45  yplan {.    SELE
1560: 43 54 20 78 20 46 52 4f 4d 20 74 31 20 57 48 45  CT x FROM t1 WHE
1570: 52 45 20 78 20 4c 49 4b 45 20 27 61 5f 63 25 27  RE x LIKE 'a_c%'
1580: 20 4f 52 44 45 52 20 42 59 20 31 3b 0a 20 20 7d   ORDER BY 1;.  }
1590: 0a 7d 20 7b 61 62 63 20 61 62 63 64 20 6e 6f 73  .} {abc abcd nos
15a0: 6f 72 74 20 7b 7d 20 69 31 7d 0a 64 6f 5f 74 65  ort {} i1}.do_te
15b0: 73 74 20 6c 69 6b 65 2d 33 2e 31 30 20 7b 0a 20  st like-3.10 {. 
15c0: 20 73 65 74 20 73 71 6c 69 74 65 5f 6c 69 6b 65   set sqlite_like
15d0: 5f 63 6f 75 6e 74 0a 7d 20 36 0a 0a 23 20 4e 6f  _count.} 6..# No
15e0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77 68   optimization wh
15f0: 65 6e 20 74 68 65 20 70 61 74 74 65 72 6e 20 62  en the pattern b
1600: 65 67 69 6e 73 20 77 69 74 68 20 61 20 77 69 6c  egins with a wil
1610: 64 63 61 72 64 2e 0a 23 20 4e 6f 74 65 20 74 68  dcard..# Note th
1620: 61 74 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  at the index is 
1630: 73 74 69 6c 6c 20 75 73 65 64 20 62 75 74 20 6f  still used but o
1640: 6e 6c 79 20 66 6f 72 20 73 6f 72 74 69 6e 67 2e  nly for sorting.
1650: 0a 23 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d  .#.do_test like-
1660: 33 2e 31 31 20 7b 0a 20 20 73 65 74 20 73 71 6c  3.11 {.  set sql
1670: 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 20 30  ite_like_count 0
1680: 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20  .  queryplan {. 
1690: 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d     SELECT x FROM
16a0: 20 74 31 20 57 48 45 52 45 20 78 20 4c 49 4b 45   t1 WHERE x LIKE
16b0: 20 27 25 62 63 64 27 20 4f 52 44 45 52 20 42 59   '%bcd' ORDER BY
16c0: 20 31 3b 0a 20 20 7d 0a 7d 20 7b 61 62 63 64 20   1;.  }.} {abcd 
16d0: 62 63 64 20 6e 6f 73 6f 72 74 20 7b 7d 20 69 31  bcd nosort {} i1
16e0: 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 33  }.do_test like-3
16f0: 2e 31 32 20 7b 0a 20 20 73 65 74 20 73 71 6c 69  .12 {.  set sqli
1700: 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 0a 7d 20  te_like_count.} 
1710: 31 32 0a 0a 23 20 4e 6f 20 6f 70 74 69 6d 69 7a  12..# No optimiz
1720: 61 74 69 6f 6e 20 66 6f 72 20 63 61 73 65 20 69  ation for case i
1730: 6e 73 65 6e 73 69 74 69 76 65 20 4c 49 4b 45 0a  nsensitive LIKE.
1740: 23 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 33  #.do_test like-3
1750: 2e 31 33 20 7b 0a 20 20 73 65 74 20 73 71 6c 69  .13 {.  set sqli
1760: 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 20 30 0a  te_like_count 0.
1770: 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20    queryplan {.  
1780: 20 20 50 52 41 47 4d 41 20 63 61 73 65 5f 73 65    PRAGMA case_se
1790: 6e 73 69 74 69 76 65 5f 6c 69 6b 65 3d 6f 66 66  nsitive_like=off
17a0: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 78 20 46  ;.    SELECT x F
17b0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 78 20 4c  ROM t1 WHERE x L
17c0: 49 4b 45 20 27 61 62 63 25 27 20 4f 52 44 45 52  IKE 'abc%' ORDER
17d0: 20 42 59 20 31 3b 0a 20 20 7d 0a 7d 20 7b 41 42   BY 1;.  }.} {AB
17e0: 43 20 7b 41 42 43 20 61 62 63 20 78 79 7a 7d 20  C {ABC abc xyz} 
17f0: 61 62 63 20 61 62 63 64 20 6e 6f 73 6f 72 74 20  abc abcd nosort 
1800: 7b 7d 20 69 31 7d 0a 64 6f 5f 74 65 73 74 20 6c  {} i1}.do_test l
1810: 69 6b 65 2d 33 2e 31 34 20 7b 0a 20 20 73 65 74  ike-3.14 {.  set
1820: 20 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75   sqlite_like_cou
1830: 6e 74 0a 7d 20 31 32 0a 0a 23 20 4e 6f 20 6f 70  nt.} 12..# No op
1840: 74 69 6d 69 7a 61 74 69 6f 6e 20 77 69 74 68 6f  timization witho
1850: 75 74 20 61 6e 20 69 6e 64 65 78 2e 0a 23 0a 64  ut an index..#.d
1860: 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 33 2e 31 35  o_test like-3.15
1870: 20 7b 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f   {.  set sqlite_
1880: 6c 69 6b 65 5f 63 6f 75 6e 74 20 30 0a 20 20 71  like_count 0.  q
1890: 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 50  ueryplan {.    P
18a0: 52 41 47 4d 41 20 63 61 73 65 5f 73 65 6e 73 69  RAGMA case_sensi
18b0: 74 69 76 65 5f 6c 69 6b 65 3d 6f 6e 3b 0a 20 20  tive_like=on;.  
18c0: 20 20 44 52 4f 50 20 49 4e 44 45 58 20 69 31 3b    DROP INDEX i1;
18d0: 0a 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52  .    SELECT x FR
18e0: 4f 4d 20 74 31 20 57 48 45 52 45 20 78 20 4c 49  OM t1 WHERE x LI
18f0: 4b 45 20 27 61 62 63 25 27 20 4f 52 44 45 52 20  KE 'abc%' ORDER 
1900: 42 59 20 31 3b 0a 20 20 7d 0a 7d 20 7b 61 62 63  BY 1;.  }.} {abc
1910: 20 61 62 63 64 20 73 6f 72 74 20 74 31 20 7b 7d   abcd sort t1 {}
1920: 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 33  }.do_test like-3
1930: 2e 31 36 20 7b 0a 20 20 73 65 74 20 73 71 6c 69  .16 {.  set sqli
1940: 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 0a 7d 20  te_like_count.} 
1950: 31 32 0a 0a 23 20 4e 6f 20 47 4c 4f 42 20 6f 70  12..# No GLOB op
1960: 74 69 6d 69 7a 61 74 69 6f 6e 20 77 69 74 68 6f  timization witho
1970: 75 74 20 61 6e 20 69 6e 64 65 78 2e 0a 23 0a 64  ut an index..#.d
1980: 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 33 2e 31 37  o_test like-3.17
1990: 20 7b 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f   {.  set sqlite_
19a0: 6c 69 6b 65 5f 63 6f 75 6e 74 20 30 0a 20 20 71  like_count 0.  q
19b0: 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53  ueryplan {.    S
19c0: 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20  ELECT x FROM t1 
19d0: 57 48 45 52 45 20 78 20 47 4c 4f 42 20 27 61 62  WHERE x GLOB 'ab
19e0: 63 2a 27 20 4f 52 44 45 52 20 42 59 20 31 3b 0a  c*' ORDER BY 1;.
19f0: 20 20 7d 0a 7d 20 7b 61 62 63 20 61 62 63 64 20    }.} {abc abcd 
1a00: 73 6f 72 74 20 74 31 20 7b 7d 7d 0a 64 6f 5f 74  sort t1 {}}.do_t
1a10: 65 73 74 20 6c 69 6b 65 2d 33 2e 31 38 20 7b 0a  est like-3.18 {.
1a20: 20 20 73 65 74 20 73 71 6c 69 74 65 5f 6c 69 6b    set sqlite_lik
1a30: 65 5f 63 6f 75 6e 74 0a 7d 20 31 32 0a 0a 23 20  e_count.} 12..# 
1a40: 47 4c 4f 42 20 69 73 20 6f 70 74 69 6d 69 7a 65  GLOB is optimize
1a50: 64 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  d regardless of 
1a60: 74 68 65 20 63 61 73 65 5f 73 65 6e 73 69 74 69  the case_sensiti
1a70: 76 65 5f 6c 69 6b 65 20 73 65 74 74 69 6e 67 2e  ve_like setting.
1a80: 0a 23 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d  .#.do_test like-
1a90: 33 2e 31 39 20 7b 0a 20 20 73 65 74 20 73 71 6c  3.19 {.  set sql
1aa0: 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 20 30  ite_like_count 0
1ab0: 0a 20 20 64 62 20 65 76 61 6c 20 7b 43 52 45 41  .  db eval {CREA
1ac0: 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74  TE INDEX i1 ON t
1ad0: 31 28 78 29 3b 7d 0a 20 20 71 75 65 72 79 70 6c  1(x);}.  querypl
1ae0: 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  an {.    SELECT 
1af0: 78 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  x FROM t1 WHERE 
1b00: 78 20 47 4c 4f 42 20 27 61 62 63 2a 27 20 4f 52  x GLOB 'abc*' OR
1b10: 44 45 52 20 42 59 20 31 3b 0a 20 20 7d 0a 7d 20  DER BY 1;.  }.} 
1b20: 7b 61 62 63 20 61 62 63 64 20 6e 6f 73 6f 72 74  {abc abcd nosort
1b30: 20 7b 7d 20 69 31 7d 0a 64 6f 5f 74 65 73 74 20   {} i1}.do_test 
1b40: 6c 69 6b 65 2d 33 2e 32 30 20 7b 0a 20 20 73 65  like-3.20 {.  se
1b50: 74 20 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f  t sqlite_like_co
1b60: 75 6e 74 0a 7d 20 30 0a 64 6f 5f 74 65 73 74 20  unt.} 0.do_test 
1b70: 6c 69 6b 65 2d 33 2e 32 31 20 7b 0a 20 20 73 65  like-3.21 {.  se
1b80: 74 20 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f  t sqlite_like_co
1b90: 75 6e 74 20 30 0a 20 20 71 75 65 72 79 70 6c 61  unt 0.  querypla
1ba0: 6e 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63  n {.    PRAGMA c
1bb0: 61 73 65 5f 73 65 6e 73 69 74 69 76 65 5f 6c 69  ase_sensitive_li
1bc0: 6b 65 3d 6f 6e 3b 0a 20 20 20 20 53 45 4c 45 43  ke=on;.    SELEC
1bd0: 54 20 78 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T x FROM t1 WHER
1be0: 45 20 78 20 47 4c 4f 42 20 27 61 62 63 2a 27 20  E x GLOB 'abc*' 
1bf0: 4f 52 44 45 52 20 42 59 20 31 3b 0a 20 20 7d 0a  ORDER BY 1;.  }.
1c00: 7d 20 7b 61 62 63 20 61 62 63 64 20 6e 6f 73 6f  } {abc abcd noso
1c10: 72 74 20 7b 7d 20 69 31 7d 0a 64 6f 5f 74 65 73  rt {} i1}.do_tes
1c20: 74 20 6c 69 6b 65 2d 33 2e 32 32 20 7b 0a 20 20  t like-3.22 {.  
1c30: 73 65 74 20 73 71 6c 69 74 65 5f 6c 69 6b 65 5f  set sqlite_like_
1c40: 63 6f 75 6e 74 0a 7d 20 30 0a 64 6f 5f 74 65 73  count.} 0.do_tes
1c50: 74 20 6c 69 6b 65 2d 33 2e 32 33 20 7b 0a 20 20  t like-3.23 {.  
1c60: 73 65 74 20 73 71 6c 69 74 65 5f 6c 69 6b 65 5f  set sqlite_like_
1c70: 63 6f 75 6e 74 20 30 0a 20 20 71 75 65 72 79 70  count 0.  queryp
1c80: 6c 61 6e 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  lan {.    PRAGMA
1c90: 20 63 61 73 65 5f 73 65 6e 73 69 74 69 76 65 5f   case_sensitive_
1ca0: 6c 69 6b 65 3d 6f 66 66 3b 0a 20 20 20 20 53 45  like=off;.    SE
1cb0: 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20 57  LECT x FROM t1 W
1cc0: 48 45 52 45 20 78 20 47 4c 4f 42 20 27 61 5b 62  HERE x GLOB 'a[b
1cd0: 63 5d 64 27 20 4f 52 44 45 52 20 42 59 20 31 3b  c]d' ORDER BY 1;
1ce0: 0a 20 20 7d 0a 7d 20 7b 61 62 64 20 61 63 64 20  .  }.} {abd acd 
1cf0: 6e 6f 73 6f 72 74 20 7b 7d 20 69 31 7d 0a 64 6f  nosort {} i1}.do
1d00: 5f 74 65 73 74 20 6c 69 6b 65 2d 33 2e 32 34 20  _test like-3.24 
1d10: 7b 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f 6c  {.  set sqlite_l
1d20: 69 6b 65 5f 63 6f 75 6e 74 0a 7d 20 36 0a 0a 23  ike_count.} 6..#
1d30: 20 47 4c 4f 42 20 6f 70 74 69 6d 69 7a 61 74 69   GLOB optimizati
1d40: 6f 6e 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  on when there is
1d50: 20 6e 6f 20 77 69 6c 64 63 61 72 64 2e 20 20 54   no wildcard.  T
1d60: 69 63 6b 65 74 20 5b 65 30 39 30 31 38 33 35 33  icket [e09018353
1d70: 31 66 63 32 37 34 37 5d 0a 23 0a 64 6f 5f 74 65  1fc2747].#.do_te
1d80: 73 74 20 6c 69 6b 65 2d 33 2e 32 35 20 7b 0a 20  st like-3.25 {. 
1d90: 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20   queryplan {.   
1da0: 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74   SELECT x FROM t
1db0: 31 20 57 48 45 52 45 20 78 20 47 4c 4f 42 20 27  1 WHERE x GLOB '
1dc0: 61 27 20 4f 52 44 45 52 20 42 59 20 31 3b 0a 20  a' ORDER BY 1;. 
1dd0: 20 7d 0a 7d 20 7b 61 20 6e 6f 73 6f 72 74 20 7b   }.} {a nosort {
1de0: 7d 20 69 31 7d 0a 64 6f 5f 74 65 73 74 20 6c 69  } i1}.do_test li
1df0: 6b 65 2d 33 2e 32 36 20 7b 0a 20 20 71 75 65 72  ke-3.26 {.  quer
1e00: 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45  yplan {.    SELE
1e10: 43 54 20 78 20 46 52 4f 4d 20 74 31 20 57 48 45  CT x FROM t1 WHE
1e20: 52 45 20 78 20 47 4c 4f 42 20 27 61 62 63 64 27  RE x GLOB 'abcd'
1e30: 20 4f 52 44 45 52 20 42 59 20 31 3b 0a 20 20 7d   ORDER BY 1;.  }
1e40: 0a 7d 20 7b 61 62 63 64 20 6e 6f 73 6f 72 74 20  .} {abcd nosort 
1e50: 7b 7d 20 69 31 7d 0a 64 6f 5f 74 65 73 74 20 6c  {} i1}.do_test l
1e60: 69 6b 65 2d 33 2e 32 37 20 7b 0a 20 20 71 75 65  ike-3.27 {.  que
1e70: 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c  ryplan {.    SEL
1e80: 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20 57 48  ECT x FROM t1 WH
1e90: 45 52 45 20 78 20 47 4c 4f 42 20 27 61 62 63 64  ERE x GLOB 'abcd
1ea0: 65 27 20 4f 52 44 45 52 20 42 59 20 31 3b 0a 20  e' ORDER BY 1;. 
1eb0: 20 7d 0a 7d 20 7b 6e 6f 73 6f 72 74 20 7b 7d 20   }.} {nosort {} 
1ec0: 69 31 7d 0a 0a 0a 0a 23 20 4e 6f 20 6f 70 74 69  i1}....# No opti
1ed0: 6d 69 7a 61 74 69 6f 6e 20 69 66 20 74 68 65 20  mization if the 
1ee0: 4c 48 53 20 6f 66 20 74 68 65 20 4c 49 4b 45 20  LHS of the LIKE 
1ef0: 69 73 20 6e 6f 74 20 61 20 63 6f 6c 75 6d 6e 20  is not a column 
1f00: 6e 61 6d 65 20 6f 72 0a 23 20 69 66 20 74 68 65  name or.# if the
1f10: 20 52 48 53 20 69 73 20 6e 6f 74 20 61 20 73 74   RHS is not a st
1f20: 72 69 6e 67 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  ring..#.do_test 
1f30: 6c 69 6b 65 2d 34 2e 31 20 7b 0a 20 20 65 78 65  like-4.1 {.  exe
1f40: 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 63 61 73  csql {PRAGMA cas
1f50: 65 5f 73 65 6e 73 69 74 69 76 65 5f 6c 69 6b 65  e_sensitive_like
1f60: 3d 6f 6e 7d 0a 20 20 73 65 74 20 73 71 6c 69 74  =on}.  set sqlit
1f70: 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 20 30 0a 20  e_like_count 0. 
1f80: 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20   queryplan {.   
1f90: 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74   SELECT x FROM t
1fa0: 31 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27  1 WHERE x LIKE '
1fb0: 61 62 63 25 27 20 4f 52 44 45 52 20 42 59 20 31  abc%' ORDER BY 1
1fc0: 0a 20 20 7d 0a 7d 20 7b 61 62 63 20 61 62 63 64  .  }.} {abc abcd
1fd0: 20 6e 6f 73 6f 72 74 20 7b 7d 20 69 31 7d 0a 64   nosort {} i1}.d
1fe0: 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 34 2e 32 20  o_test like-4.2 
1ff0: 7b 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f 6c  {.  set sqlite_l
2000: 69 6b 65 5f 63 6f 75 6e 74 0a 7d 20 30 0a 64 6f  ike_count.} 0.do
2010: 5f 74 65 73 74 20 6c 69 6b 65 2d 34 2e 33 20 7b  _test like-4.3 {
2020: 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f 6c 69  .  set sqlite_li
2030: 6b 65 5f 63 6f 75 6e 74 20 30 0a 20 20 71 75 65  ke_count 0.  que
2040: 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c  ryplan {.    SEL
2050: 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20 57 48  ECT x FROM t1 WH
2060: 45 52 45 20 2b 78 20 4c 49 4b 45 20 27 61 62 63  ERE +x LIKE 'abc
2070: 25 27 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20  %' ORDER BY 1.  
2080: 7d 0a 7d 20 7b 61 62 63 20 61 62 63 64 20 6e 6f  }.} {abc abcd no
2090: 73 6f 72 74 20 7b 7d 20 69 31 7d 0a 64 6f 5f 74  sort {} i1}.do_t
20a0: 65 73 74 20 6c 69 6b 65 2d 34 2e 34 20 7b 0a 20  est like-4.4 {. 
20b0: 20 73 65 74 20 73 71 6c 69 74 65 5f 6c 69 6b 65   set sqlite_like
20c0: 5f 63 6f 75 6e 74 0a 7d 20 31 32 0a 64 6f 5f 74  _count.} 12.do_t
20d0: 65 73 74 20 6c 69 6b 65 2d 34 2e 35 20 7b 0a 20  est like-4.5 {. 
20e0: 20 73 65 74 20 73 71 6c 69 74 65 5f 6c 69 6b 65   set sqlite_like
20f0: 5f 63 6f 75 6e 74 20 30 0a 20 20 71 75 65 72 79  _count 0.  query
2100: 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43  plan {.    SELEC
2110: 54 20 78 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T x FROM t1 WHER
2120: 45 20 78 20 4c 49 4b 45 20 28 27 61 62 27 20 7c  E x LIKE ('ab' |
2130: 7c 20 27 63 25 27 29 20 4f 52 44 45 52 20 42 59  | 'c%') ORDER BY
2140: 20 31 0a 20 20 7d 0a 7d 20 7b 61 62 63 20 61 62   1.  }.} {abc ab
2150: 63 64 20 6e 6f 73 6f 72 74 20 7b 7d 20 69 31 7d  cd nosort {} i1}
2160: 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 34 2e  .do_test like-4.
2170: 36 20 7b 0a 20 20 73 65 74 20 73 71 6c 69 74 65  6 {.  set sqlite
2180: 5f 6c 69 6b 65 5f 63 6f 75 6e 74 0a 7d 20 31 32  _like_count.} 12
2190: 0a 0a 23 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65  ..# Collating se
21a0: 71 75 65 6e 63 65 73 20 6f 6e 20 74 68 65 20 69  quences on the i
21b0: 6e 64 65 78 20 64 69 73 61 62 6c 65 20 74 68 65  ndex disable the
21c0: 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69   LIKE optimizati
21d0: 6f 6e 2e 0a 23 20 4f 72 20 69 66 20 74 68 65 20  on..# Or if the 
21e0: 4e 4f 43 41 53 45 20 63 6f 6c 6c 61 74 69 6e 67  NOCASE collating
21f0: 20 73 65 71 75 65 6e 63 65 20 69 73 20 75 73 65   sequence is use
2200: 64 2c 20 74 68 65 20 4c 49 4b 45 20 6f 70 74 69  d, the LIKE opti
2210: 6d 69 7a 61 74 69 6f 6e 0a 23 20 69 73 20 65 6e  mization.# is en
2220: 61 62 6c 65 64 20 77 68 65 6e 20 63 61 73 65 5f  abled when case_
2230: 73 65 6e 73 69 74 69 76 65 5f 6c 69 6b 65 20 69  sensitive_like i
2240: 73 20 4f 46 46 2e 0a 23 0a 64 6f 5f 74 65 73 74  s OFF..#.do_test
2250: 20 6c 69 6b 65 2d 35 2e 31 20 7b 0a 20 20 65 78   like-5.1 {.  ex
2260: 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 63 61  ecsql {PRAGMA ca
2270: 73 65 5f 73 65 6e 73 69 74 69 76 65 5f 6c 69 6b  se_sensitive_lik
2280: 65 3d 6f 66 66 7d 0a 20 20 73 65 74 20 73 71 6c  e=off}.  set sql
2290: 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 20 30  ite_like_count 0
22a0: 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20  .  queryplan {. 
22b0: 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d     SELECT x FROM
22c0: 20 74 31 20 57 48 45 52 45 20 78 20 4c 49 4b 45   t1 WHERE x LIKE
22d0: 20 27 61 62 63 25 27 20 4f 52 44 45 52 20 42 59   'abc%' ORDER BY
22e0: 20 31 0a 20 20 7d 0a 7d 20 7b 41 42 43 20 7b 41   1.  }.} {ABC {A
22f0: 42 43 20 61 62 63 20 78 79 7a 7d 20 61 62 63 20  BC abc xyz} abc 
2300: 61 62 63 64 20 6e 6f 73 6f 72 74 20 7b 7d 20 69  abcd nosort {} i
2310: 31 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d  1}.do_test like-
2320: 35 2e 32 20 7b 0a 20 20 73 65 74 20 73 71 6c 69  5.2 {.  set sqli
2330: 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 0a 7d 20  te_like_count.} 
2340: 31 32 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d  12.do_test like-
2350: 35 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  5.3 {.  execsql 
2360: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
2370: 4c 45 20 74 32 28 78 20 54 45 58 54 20 43 4f 4c  LE t2(x TEXT COL
2380: 4c 41 54 45 20 4e 4f 43 41 53 45 29 3b 0a 20 20  LATE NOCASE);.  
2390: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
23a0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
23b0: 31 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e  1;.    CREATE IN
23c0: 44 45 58 20 69 32 20 4f 4e 20 74 32 28 78 20 43  DEX i2 ON t2(x C
23d0: 4f 4c 4c 41 54 45 20 4e 4f 43 41 53 45 29 3b 0a  OLLATE NOCASE);.
23e0: 20 20 7d 0a 20 20 73 65 74 20 73 71 6c 69 74 65    }.  set sqlite
23f0: 5f 6c 69 6b 65 5f 63 6f 75 6e 74 20 30 0a 20 20  _like_count 0.  
2400: 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20  queryplan {.    
2410: 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 32  SELECT x FROM t2
2420: 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27 61   WHERE x LIKE 'a
2430: 62 63 25 27 20 4f 52 44 45 52 20 42 59 20 31 0a  bc%' ORDER BY 1.
2440: 20 20 7d 0a 7d 20 7b 61 62 63 20 41 42 43 20 7b    }.} {abc ABC {
2450: 41 42 43 20 61 62 63 20 78 79 7a 7d 20 61 62 63  ABC abc xyz} abc
2460: 64 20 6e 6f 73 6f 72 74 20 7b 7d 20 69 32 7d 0a  d nosort {} i2}.
2470: 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 35 2e 34  do_test like-5.4
2480: 20 7b 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f   {.  set sqlite_
2490: 6c 69 6b 65 5f 63 6f 75 6e 74 0a 7d 20 30 0a 64  like_count.} 0.d
24a0: 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 35 2e 35 20  o_test like-5.5 
24b0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
24c0: 20 20 50 52 41 47 4d 41 20 63 61 73 65 5f 73 65    PRAGMA case_se
24d0: 6e 73 69 74 69 76 65 5f 6c 69 6b 65 3d 6f 6e 3b  nsitive_like=on;
24e0: 0a 20 20 7d 0a 20 20 73 65 74 20 73 71 6c 69 74  .  }.  set sqlit
24f0: 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 20 30 0a 20  e_like_count 0. 
2500: 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20   queryplan {.   
2510: 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74   SELECT x FROM t
2520: 32 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27  2 WHERE x LIKE '
2530: 61 62 63 25 27 20 4f 52 44 45 52 20 42 59 20 31  abc%' ORDER BY 1
2540: 0a 20 20 7d 0a 7d 20 7b 61 62 63 20 61 62 63 64  .  }.} {abc abcd
2550: 20 6e 6f 73 6f 72 74 20 7b 7d 20 69 32 7d 0a 64   nosort {} i2}.d
2560: 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 35 2e 36 20  o_test like-5.6 
2570: 7b 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f 6c  {.  set sqlite_l
2580: 69 6b 65 5f 63 6f 75 6e 74 0a 7d 20 31 32 0a 64  ike_count.} 12.d
2590: 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 35 2e 37 20  o_test like-5.7 
25a0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
25b0: 20 20 50 52 41 47 4d 41 20 63 61 73 65 5f 73 65    PRAGMA case_se
25c0: 6e 73 69 74 69 76 65 5f 6c 69 6b 65 3d 6f 66 66  nsitive_like=off
25d0: 3b 0a 20 20 7d 0a 20 20 73 65 74 20 73 71 6c 69  ;.  }.  set sqli
25e0: 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 20 30 0a  te_like_count 0.
25f0: 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20    queryplan {.  
2600: 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20    SELECT x FROM 
2610: 74 32 20 57 48 45 52 45 20 78 20 47 4c 4f 42 20  t2 WHERE x GLOB 
2620: 27 61 62 63 2a 27 20 4f 52 44 45 52 20 42 59 20  'abc*' ORDER BY 
2630: 31 0a 20 20 7d 0a 7d 20 7b 61 62 63 20 61 62 63  1.  }.} {abc abc
2640: 64 20 6e 6f 73 6f 72 74 20 7b 7d 20 69 32 7d 0a  d nosort {} i2}.
2650: 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 35 2e 38  do_test like-5.8
2660: 20 7b 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f   {.  set sqlite_
2670: 6c 69 6b 65 5f 63 6f 75 6e 74 0a 7d 20 31 32 0a  like_count.} 12.
2680: 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 35 2e 31  do_test like-5.1
2690: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 50  1 {.  execsql {P
26a0: 52 41 47 4d 41 20 63 61 73 65 5f 73 65 6e 73 69  RAGMA case_sensi
26b0: 74 69 76 65 5f 6c 69 6b 65 3d 6f 66 66 7d 0a 20  tive_like=off}. 
26c0: 20 73 65 74 20 73 71 6c 69 74 65 5f 6c 69 6b 65   set sqlite_like
26d0: 5f 63 6f 75 6e 74 20 30 0a 20 20 71 75 65 72 79  _count 0.  query
26e0: 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43  plan {.    SELEC
26f0: 54 20 78 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T x FROM t1 WHER
2700: 45 20 78 20 4c 49 4b 45 20 27 41 42 43 25 27 20  E x LIKE 'ABC%' 
2710: 4f 52 44 45 52 20 42 59 20 31 0a 20 20 7d 0a 7d  ORDER BY 1.  }.}
2720: 20 7b 41 42 43 20 7b 41 42 43 20 61 62 63 20 78   {ABC {ABC abc x
2730: 79 7a 7d 20 61 62 63 20 61 62 63 64 20 6e 6f 73  yz} abc abcd nos
2740: 6f 72 74 20 7b 7d 20 69 31 7d 0a 64 6f 5f 74 65  ort {} i1}.do_te
2750: 73 74 20 6c 69 6b 65 2d 35 2e 31 32 20 7b 0a 20  st like-5.12 {. 
2760: 20 73 65 74 20 73 71 6c 69 74 65 5f 6c 69 6b 65   set sqlite_like
2770: 5f 63 6f 75 6e 74 0a 7d 20 31 32 0a 64 6f 5f 74  _count.} 12.do_t
2780: 65 73 74 20 6c 69 6b 65 2d 35 2e 31 33 20 7b 0a  est like-5.13 {.
2790: 20 20 73 65 74 20 73 71 6c 69 74 65 5f 6c 69 6b    set sqlite_lik
27a0: 65 5f 63 6f 75 6e 74 20 30 0a 20 20 71 75 65 72  e_count 0.  quer
27b0: 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45  yplan {.    SELE
27c0: 43 54 20 78 20 46 52 4f 4d 20 74 32 20 57 48 45  CT x FROM t2 WHE
27d0: 52 45 20 78 20 4c 49 4b 45 20 27 41 42 43 25 27  RE x LIKE 'ABC%'
27e0: 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 7d 0a   ORDER BY 1.  }.
27f0: 7d 20 7b 61 62 63 20 41 42 43 20 7b 41 42 43 20  } {abc ABC {ABC 
2800: 61 62 63 20 78 79 7a 7d 20 61 62 63 64 20 6e 6f  abc xyz} abcd no
2810: 73 6f 72 74 20 7b 7d 20 69 32 7d 0a 64 6f 5f 74  sort {} i2}.do_t
2820: 65 73 74 20 6c 69 6b 65 2d 35 2e 31 34 20 7b 0a  est like-5.14 {.
2830: 20 20 73 65 74 20 73 71 6c 69 74 65 5f 6c 69 6b    set sqlite_lik
2840: 65 5f 63 6f 75 6e 74 0a 7d 20 30 0a 64 6f 5f 74  e_count.} 0.do_t
2850: 65 73 74 20 6c 69 6b 65 2d 35 2e 31 35 20 7b 0a  est like-5.15 {.
2860: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
2870: 50 52 41 47 4d 41 20 63 61 73 65 5f 73 65 6e 73  PRAGMA case_sens
2880: 69 74 69 76 65 5f 6c 69 6b 65 3d 6f 6e 3b 0a 20  itive_like=on;. 
2890: 20 7d 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f   }.  set sqlite_
28a0: 6c 69 6b 65 5f 63 6f 75 6e 74 20 30 0a 20 20 71  like_count 0.  q
28b0: 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53  ueryplan {.    S
28c0: 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 32 20  ELECT x FROM t2 
28d0: 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27 41 42  WHERE x LIKE 'AB
28e0: 43 25 27 20 4f 52 44 45 52 20 42 59 20 31 0a 20  C%' ORDER BY 1. 
28f0: 20 7d 0a 7d 20 7b 41 42 43 20 7b 41 42 43 20 61   }.} {ABC {ABC a
2900: 62 63 20 78 79 7a 7d 20 6e 6f 73 6f 72 74 20 7b  bc xyz} nosort {
2910: 7d 20 69 32 7d 0a 64 6f 5f 74 65 73 74 20 6c 69  } i2}.do_test li
2920: 6b 65 2d 35 2e 31 36 20 7b 0a 20 20 73 65 74 20  ke-5.16 {.  set 
2930: 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e  sqlite_like_coun
2940: 74 0a 7d 20 31 32 0a 64 6f 5f 74 65 73 74 20 6c  t.} 12.do_test l
2950: 69 6b 65 2d 35 2e 31 37 20 7b 0a 20 20 65 78 65  ike-5.17 {.  exe
2960: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
2970: 41 20 63 61 73 65 5f 73 65 6e 73 69 74 69 76 65  A case_sensitive
2980: 5f 6c 69 6b 65 3d 6f 66 66 3b 0a 20 20 7d 0a 20  _like=off;.  }. 
2990: 20 73 65 74 20 73 71 6c 69 74 65 5f 6c 69 6b 65   set sqlite_like
29a0: 5f 63 6f 75 6e 74 20 30 0a 20 20 71 75 65 72 79  _count 0.  query
29b0: 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43  plan {.    SELEC
29c0: 54 20 78 20 46 52 4f 4d 20 74 32 20 57 48 45 52  T x FROM t2 WHER
29d0: 45 20 78 20 47 4c 4f 42 20 27 41 42 43 2a 27 20  E x GLOB 'ABC*' 
29e0: 4f 52 44 45 52 20 42 59 20 31 0a 20 20 7d 0a 7d  ORDER BY 1.  }.}
29f0: 20 7b 41 42 43 20 7b 41 42 43 20 61 62 63 20 78   {ABC {ABC abc x
2a00: 79 7a 7d 20 6e 6f 73 6f 72 74 20 7b 7d 20 69 32  yz} nosort {} i2
2a10: 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 35  }.do_test like-5
2a20: 2e 31 38 20 7b 0a 20 20 73 65 74 20 73 71 6c 69  .18 {.  set sqli
2a30: 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 0a 7d 20  te_like_count.} 
2a40: 31 32 0a 0a 23 20 42 6f 75 6e 64 61 72 79 20 63  12..# Boundary c
2a50: 61 73 65 2e 20 20 54 68 65 20 70 72 65 66 69 78  ase.  The prefix
2a60: 20 66 6f 72 20 61 20 4c 49 4b 45 20 63 6f 6d 70   for a LIKE comp
2a70: 61 72 69 73 6f 6e 20 69 73 20 72 6f 75 6e 64 65  arison is rounde
2a80: 64 20 75 70 0a 23 20 77 68 65 6e 20 63 6f 6e 73  d up.# when cons
2a90: 74 72 75 63 74 69 6e 67 20 74 68 65 20 63 6f 6d  tructing the com
2aa0: 70 61 72 69 73 6f 6e 2e 20 20 45 78 61 6d 70 6c  parison.  Exampl
2ab0: 65 3a 20 20 22 61 62 22 20 62 65 63 6f 6d 65 73  e:  "ab" becomes
2ac0: 20 22 61 63 22 2e 0a 23 20 49 6e 20 6f 74 68 65   "ac"..# In othe
2ad0: 72 20 77 6f 72 64 73 2c 20 74 68 65 20 6c 61 73  r words, the las
2ae0: 74 20 63 68 61 72 61 63 74 65 72 20 69 73 20 69  t character is i
2af0: 6e 63 72 65 61 73 65 64 20 62 79 20 6f 6e 65 2e  ncreased by one.
2b00: 0a 23 0a 23 20 4d 61 6b 65 20 73 75 72 65 20 74  .#.# Make sure t
2b10: 68 69 73 20 68 61 70 70 65 6e 73 20 63 6f 72 72  his happens corr
2b20: 65 63 74 6c 79 20 77 68 65 6e 20 74 68 65 20 6c  ectly when the l
2b30: 61 73 74 20 63 68 61 72 61 63 74 65 72 20 69 73  ast character is
2b40: 20 61 20 0a 23 20 22 7a 22 20 61 6e 64 20 77 65   a .# "z" and we
2b50: 20 61 72 65 20 64 6f 69 6e 67 20 63 61 73 65 2d   are doing case-
2b60: 69 6e 73 65 6e 73 69 74 69 76 65 20 63 6f 6d 70  insensitive comp
2b70: 61 72 69 73 6f 6e 73 2e 0a 23 0a 23 20 54 69 63  arisons..#.# Tic
2b80: 6b 65 74 20 23 32 39 35 39 0a 23 0a 64 6f 5f 74  ket #2959.#.do_t
2b90: 65 73 74 20 6c 69 6b 65 2d 35 2e 32 31 20 7b 0a  est like-5.21 {.
2ba0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
2bb0: 50 52 41 47 4d 41 20 63 61 73 65 5f 73 65 6e 73  PRAGMA case_sens
2bc0: 69 74 69 76 65 5f 6c 69 6b 65 3d 6f 66 66 3b 0a  itive_like=off;.
2bd0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2be0: 74 32 20 56 41 4c 55 45 53 28 27 5a 5a 2d 75 70  t2 VALUES('ZZ-up
2bf0: 70 65 72 2d 75 70 70 65 72 27 29 3b 0a 20 20 20  per-upper');.   
2c00: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
2c10: 56 41 4c 55 45 53 28 27 7a 5a 2d 6c 6f 77 65 72  VALUES('zZ-lower
2c20: 2d 75 70 70 65 72 27 29 3b 0a 20 20 20 20 49 4e  -upper');.    IN
2c30: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
2c40: 55 45 53 28 27 5a 7a 2d 75 70 70 65 72 2d 6c 6f  UES('Zz-upper-lo
2c50: 77 65 72 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  wer');.    INSER
2c60: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
2c70: 28 27 7a 7a 2d 6c 6f 77 65 72 2d 6c 6f 77 65 72  ('zz-lower-lower
2c80: 27 29 3b 0a 20 20 7d 0a 20 20 71 75 65 72 79 70  ');.  }.  queryp
2c90: 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  lan {.    SELECT
2ca0: 20 78 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45   x FROM t2 WHERE
2cb0: 20 78 20 4c 49 4b 45 20 27 7a 7a 25 27 3b 0a 20   x LIKE 'zz%';. 
2cc0: 20 7d 0a 7d 20 7b 7a 7a 2d 6c 6f 77 65 72 2d 6c   }.} {zz-lower-l
2cd0: 6f 77 65 72 20 7a 5a 2d 6c 6f 77 65 72 2d 75 70  ower zZ-lower-up
2ce0: 70 65 72 20 5a 7a 2d 75 70 70 65 72 2d 6c 6f 77  per Zz-upper-low
2cf0: 65 72 20 5a 5a 2d 75 70 70 65 72 2d 75 70 70 65  er ZZ-upper-uppe
2d00: 72 20 6e 6f 73 6f 72 74 20 7b 7d 20 69 32 7d 0a  r nosort {} i2}.
2d10: 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 35 2e 32  do_test like-5.2
2d20: 32 20 7b 0a 20 20 71 75 65 72 79 70 6c 61 6e 20  2 {.  queryplan 
2d30: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 78 20 46  {.    SELECT x F
2d40: 52 4f 4d 20 74 32 20 57 48 45 52 45 20 78 20 4c  ROM t2 WHERE x L
2d50: 49 4b 45 20 27 7a 5a 25 27 3b 0a 20 20 7d 0a 7d  IKE 'zZ%';.  }.}
2d60: 20 7b 7a 7a 2d 6c 6f 77 65 72 2d 6c 6f 77 65 72   {zz-lower-lower
2d70: 20 7a 5a 2d 6c 6f 77 65 72 2d 75 70 70 65 72 20   zZ-lower-upper 
2d80: 5a 7a 2d 75 70 70 65 72 2d 6c 6f 77 65 72 20 5a  Zz-upper-lower Z
2d90: 5a 2d 75 70 70 65 72 2d 75 70 70 65 72 20 6e 6f  Z-upper-upper no
2da0: 73 6f 72 74 20 7b 7d 20 69 32 7d 0a 64 6f 5f 74  sort {} i2}.do_t
2db0: 65 73 74 20 6c 69 6b 65 2d 35 2e 32 33 20 7b 0a  est like-5.23 {.
2dc0: 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20    queryplan {.  
2dd0: 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20    SELECT x FROM 
2de0: 74 32 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20  t2 WHERE x LIKE 
2df0: 27 5a 7a 25 27 3b 0a 20 20 7d 0a 7d 20 7b 7a 7a  'Zz%';.  }.} {zz
2e00: 2d 6c 6f 77 65 72 2d 6c 6f 77 65 72 20 7a 5a 2d  -lower-lower zZ-
2e10: 6c 6f 77 65 72 2d 75 70 70 65 72 20 5a 7a 2d 75  lower-upper Zz-u
2e20: 70 70 65 72 2d 6c 6f 77 65 72 20 5a 5a 2d 75 70  pper-lower ZZ-up
2e30: 70 65 72 2d 75 70 70 65 72 20 6e 6f 73 6f 72 74  per-upper nosort
2e40: 20 7b 7d 20 69 32 7d 0a 64 6f 5f 74 65 73 74 20   {} i2}.do_test 
2e50: 6c 69 6b 65 2d 35 2e 32 34 20 7b 0a 20 20 71 75  like-5.24 {.  qu
2e60: 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45  eryplan {.    SE
2e70: 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 32 20 57  LECT x FROM t2 W
2e80: 48 45 52 45 20 78 20 4c 49 4b 45 20 27 5a 5a 25  HERE x LIKE 'ZZ%
2e90: 27 3b 0a 20 20 7d 0a 7d 20 7b 7a 7a 2d 6c 6f 77  ';.  }.} {zz-low
2ea0: 65 72 2d 6c 6f 77 65 72 20 7a 5a 2d 6c 6f 77 65  er-lower zZ-lowe
2eb0: 72 2d 75 70 70 65 72 20 5a 7a 2d 75 70 70 65 72  r-upper Zz-upper
2ec0: 2d 6c 6f 77 65 72 20 5a 5a 2d 75 70 70 65 72 2d  -lower ZZ-upper-
2ed0: 75 70 70 65 72 20 6e 6f 73 6f 72 74 20 7b 7d 20  upper nosort {} 
2ee0: 69 32 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65  i2}.do_test like
2ef0: 2d 35 2e 32 35 20 7b 0a 20 20 64 62 20 65 76 61  -5.25 {.  db eva
2f00: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63  l {.    PRAGMA c
2f10: 61 73 65 5f 73 65 6e 73 69 74 69 76 65 5f 6c 69  ase_sensitive_li
2f20: 6b 65 3d 6f 6e 3b 0a 20 20 20 20 43 52 45 41 54  ke=on;.    CREAT
2f30: 45 20 54 41 42 4c 45 20 74 33 28 78 20 54 45 58  E TABLE t3(x TEX
2f40: 54 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49  T);.    CREATE I
2f50: 4e 44 45 58 20 69 33 20 4f 4e 20 74 33 28 78 29  NDEX i3 ON t3(x)
2f60: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
2f70: 4f 20 74 33 20 56 41 4c 55 45 53 28 27 5a 5a 2d  O t3 VALUES('ZZ-
2f80: 75 70 70 65 72 2d 75 70 70 65 72 27 29 3b 0a 20  upper-upper');. 
2f90: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2fa0: 33 20 56 41 4c 55 45 53 28 27 7a 5a 2d 6c 6f 77  3 VALUES('zZ-low
2fb0: 65 72 2d 75 70 70 65 72 27 29 3b 0a 20 20 20 20  er-upper');.    
2fc0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56  INSERT INTO t3 V
2fd0: 41 4c 55 45 53 28 27 5a 7a 2d 75 70 70 65 72 2d  ALUES('Zz-upper-
2fe0: 6c 6f 77 65 72 27 29 3b 0a 20 20 20 20 49 4e 53  lower');.    INS
2ff0: 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55  ERT INTO t3 VALU
3000: 45 53 28 27 7a 7a 2d 6c 6f 77 65 72 2d 6c 6f 77  ES('zz-lower-low
3010: 65 72 27 29 3b 0a 20 20 7d 0a 20 20 71 75 65 72  er');.  }.  quer
3020: 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45  yplan {.    SELE
3030: 43 54 20 78 20 46 52 4f 4d 20 74 33 20 57 48 45  CT x FROM t3 WHE
3040: 52 45 20 78 20 4c 49 4b 45 20 27 7a 7a 25 27 3b  RE x LIKE 'zz%';
3050: 0a 20 20 7d 0a 7d 20 7b 7a 7a 2d 6c 6f 77 65 72  .  }.} {zz-lower
3060: 2d 6c 6f 77 65 72 20 6e 6f 73 6f 72 74 20 7b 7d  -lower nosort {}
3070: 20 69 33 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b   i3}.do_test lik
3080: 65 2d 35 2e 32 36 20 7b 0a 20 20 71 75 65 72 79  e-5.26 {.  query
3090: 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43  plan {.    SELEC
30a0: 54 20 78 20 46 52 4f 4d 20 74 33 20 57 48 45 52  T x FROM t3 WHER
30b0: 45 20 78 20 4c 49 4b 45 20 27 7a 5a 25 27 3b 0a  E x LIKE 'zZ%';.
30c0: 20 20 7d 0a 7d 20 7b 7a 5a 2d 6c 6f 77 65 72 2d    }.} {zZ-lower-
30d0: 75 70 70 65 72 20 6e 6f 73 6f 72 74 20 7b 7d 20  upper nosort {} 
30e0: 69 33 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65  i3}.do_test like
30f0: 2d 35 2e 32 37 20 7b 0a 20 20 71 75 65 72 79 70  -5.27 {.  queryp
3100: 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  lan {.    SELECT
3110: 20 78 20 46 52 4f 4d 20 74 33 20 57 48 45 52 45   x FROM t3 WHERE
3120: 20 78 20 4c 49 4b 45 20 27 5a 7a 25 27 3b 0a 20   x LIKE 'Zz%';. 
3130: 20 7d 0a 7d 20 7b 5a 7a 2d 75 70 70 65 72 2d 6c   }.} {Zz-upper-l
3140: 6f 77 65 72 20 6e 6f 73 6f 72 74 20 7b 7d 20 69  ower nosort {} i
3150: 33 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d  3}.do_test like-
3160: 35 2e 32 38 20 7b 0a 20 20 71 75 65 72 79 70 6c  5.28 {.  querypl
3170: 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  an {.    SELECT 
3180: 78 20 46 52 4f 4d 20 74 33 20 57 48 45 52 45 20  x FROM t3 WHERE 
3190: 78 20 4c 49 4b 45 20 27 5a 5a 25 27 3b 0a 20 20  x LIKE 'ZZ%';.  
31a0: 7d 0a 7d 20 7b 5a 5a 2d 75 70 70 65 72 2d 75 70  }.} {ZZ-upper-up
31b0: 70 65 72 20 6e 6f 73 6f 72 74 20 7b 7d 20 69 33  per nosort {} i3
31c0: 7d 0a 0a 0a 23 20 74 69 63 6b 65 74 20 23 32 34  }...# ticket #24
31d0: 30 37 0a 23 0a 23 20 4d 61 6b 65 20 73 75 72 65  07.#.# Make sure
31e0: 20 74 68 65 20 4c 49 4b 45 20 70 72 65 66 69 78   the LIKE prefix
31f0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 64 6f   optimization do
3200: 65 73 20 6e 6f 74 20 73 74 72 69 70 20 6f 66 66  es not strip off
3210: 20 6c 65 61 64 69 6e 67 0a 23 20 63 68 61 72 61   leading.# chara
3220: 63 74 65 72 73 20 6f 66 20 74 68 65 20 6c 69 6b  cters of the lik
3230: 65 20 70 61 74 74 65 72 6e 20 74 68 61 74 20 68  e pattern that h
3240: 61 70 70 65 6e 20 74 6f 20 62 65 20 71 75 6f 74  appen to be quot
3250: 65 20 63 68 61 72 61 63 74 65 72 73 2e 0a 23 0a  e characters..#.
3260: 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 36 2e 31  do_test like-6.1
3270: 20 7b 0a 20 20 66 6f 72 65 61 63 68 20 78 20 7b   {.  foreach x {
3280: 20 27 61 62 63 20 27 62 63 64 20 27 64 65 66 20   'abc 'bcd 'def 
3290: 27 61 78 20 7d 20 7b 0a 20 20 20 20 73 65 74 20  'ax } {.    set 
32a0: 78 32 20 27 5b 73 74 72 69 6e 67 20 6d 61 70 20  x2 '[string map 
32b0: 7b 27 20 27 27 7d 20 24 78 5d 27 0a 20 20 20 20  {' ''} $x]'.    
32c0: 64 62 20 65 76 61 6c 20 22 49 4e 53 45 52 54 20  db eval "INSERT 
32d0: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 24  INTO t2 VALUES($
32e0: 78 32 29 22 0a 20 20 7d 0a 20 20 65 78 65 63 73  x2)".  }.  execs
32f0: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
3300: 2a 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20  * FROM t2 WHERE 
3310: 78 20 4c 49 4b 45 20 27 27 27 61 25 27 0a 20 20  x LIKE '''a%'.  
3320: 7d 0a 7d 20 7b 27 61 62 63 20 27 61 78 7d 0a 0a  }.} {'abc 'ax}..
3330: 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 37 2e 31  do_test like-7.1
3340: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
3350: 20 20 20 53 45 4c 45 43 54 20 72 6f 77 69 64 2c     SELECT rowid,
3360: 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
3370: 20 72 6f 77 69 64 20 47 4c 4f 42 20 27 31 2a 27   rowid GLOB '1*'
3380: 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 3b   ORDER BY rowid;
3390: 0a 20 20 7d 0a 7d 20 7b 31 20 61 20 31 30 20 41  .  }.} {1 a 10 A
33a0: 42 43 20 31 31 20 43 44 45 20 31 32 20 7b 41 42  BC 11 CDE 12 {AB
33b0: 43 20 61 62 63 20 78 79 7a 7d 7d 0a 0a 23 20 74  C abc xyz}}..# t
33c0: 69 63 6b 65 74 20 23 33 33 34 35 2e 0a 23 0a 23  icket #3345..#.#
33d0: 20 4f 76 65 72 6c 6f 61 64 69 6e 67 20 74 68 65   Overloading the
33e0: 20 4c 49 4b 45 20 66 75 6e 63 74 69 6f 6e 20 77   LIKE function w
33f0: 69 74 68 20 2d 31 20 66 6f 72 20 74 68 65 20 6e  ith -1 for the n
3400: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
3410: 74 73 0a 23 20 77 69 6c 6c 20 6f 76 65 72 6c 6f  ts.# will overlo
3420: 61 64 20 62 6f 74 68 20 74 68 65 20 32 2d 61 72  ad both the 2-ar
3430: 67 75 6d 65 6e 74 20 61 6e 64 20 74 68 65 20 33  gument and the 3
3440: 2d 61 72 67 75 6d 65 6e 74 20 4c 49 4b 45 2e 0a  -argument LIKE..
3450: 23 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 38  #.do_test like-8
3460: 2e 31 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b  .1 {.  db eval {
3470: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
3480: 45 20 74 38 28 78 29 3b 0a 20 20 20 20 49 4e 53  E t8(x);.    INS
3490: 45 52 54 20 49 4e 54 4f 20 74 38 20 56 41 4c 55  ERT INTO t8 VALU
34a0: 45 53 28 27 61 62 63 64 65 66 27 29 3b 0a 20 20  ES('abcdef');.  
34b0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 38    INSERT INTO t8
34c0: 20 56 41 4c 55 45 53 28 27 67 68 69 6a 6b 6c 27   VALUES('ghijkl'
34d0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
34e0: 54 4f 20 74 38 20 56 41 4c 55 45 53 28 27 6d 6e  TO t8 VALUES('mn
34f0: 6f 70 71 72 27 29 3b 0a 20 20 20 20 53 45 4c 45  opqr');.    SELE
3500: 43 54 20 31 2c 20 78 20 46 52 4f 4d 20 74 38 20  CT 1, x FROM t8 
3510: 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27 25 68  WHERE x LIKE '%h
3520: 25 27 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 32  %';.    SELECT 2
3530: 2c 20 78 20 46 52 4f 4d 20 74 38 20 57 48 45 52  , x FROM t8 WHER
3540: 45 20 78 20 4c 49 4b 45 20 27 25 68 25 27 20 45  E x LIKE '%h%' E
3550: 53 43 41 50 45 20 27 78 27 3b 0a 20 20 7d 0a 7d  SCAPE 'x';.  }.}
3560: 20 7b 31 20 67 68 69 6a 6b 6c 20 32 20 67 68 69   {1 ghijkl 2 ghi
3570: 6a 6b 6c 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b  jkl}.do_test lik
3580: 65 2d 38 2e 32 20 7b 0a 20 20 70 72 6f 63 20 6e  e-8.2 {.  proc n
3590: 65 77 6c 69 6b 65 20 7b 61 72 67 73 7d 20 7b 72  ewlike {args} {r
35a0: 65 74 75 72 6e 20 31 7d 20 3b 23 20 41 6c 74 65  eturn 1} ;# Alte
35b0: 72 6e 61 74 69 76 65 20 4c 49 4b 45 20 69 73 20  rnative LIKE is 
35c0: 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20 54 52  always return TR
35d0: 55 45 0a 20 20 64 62 20 66 75 6e 63 74 69 6f 6e  UE.  db function
35e0: 20 6c 69 6b 65 20 6e 65 77 6c 69 6b 65 20 20 20   like newlike   
35f0: 20 20 20 20 3b 23 20 55 73 65 73 20 2d 31 20 66      ;# Uses -1 f
3600: 6f 72 20 6e 41 72 67 20 69 6e 20 73 71 6c 69 74  or nArg in sqlit
3610: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
3620: 6f 6e 0a 20 20 64 62 20 63 61 63 68 65 20 66 6c  on.  db cache fl
3630: 75 73 68 0a 20 20 64 62 20 65 76 61 6c 20 7b 0a  ush.  db eval {.
3640: 20 20 20 20 53 45 4c 45 43 54 20 31 2c 20 78 20      SELECT 1, x 
3650: 46 52 4f 4d 20 74 38 20 57 48 45 52 45 20 78 20  FROM t8 WHERE x 
3660: 4c 49 4b 45 20 27 25 68 25 27 3b 0a 20 20 20 20  LIKE '%h%';.    
3670: 53 45 4c 45 43 54 20 32 2c 20 78 20 46 52 4f 4d  SELECT 2, x FROM
3680: 20 74 38 20 57 48 45 52 45 20 78 20 4c 49 4b 45   t8 WHERE x LIKE
3690: 20 27 25 68 25 27 20 45 53 43 41 50 45 20 27 78   '%h%' ESCAPE 'x
36a0: 27 3b 0a 20 20 7d 0a 7d 20 7b 31 20 67 68 69 6a  ';.  }.} {1 ghij
36b0: 6b 6c 20 32 20 67 68 69 6a 6b 6c 7d 0a 64 6f 5f  kl 2 ghijkl}.do_
36c0: 74 65 73 74 20 6c 69 6b 65 2d 38 2e 33 20 7b 0a  test like-8.3 {.
36d0: 20 20 64 62 20 66 75 6e 63 74 69 6f 6e 20 6c 69    db function li
36e0: 6b 65 20 2d 61 72 67 63 6f 75 6e 74 20 32 20 6e  ke -argcount 2 n
36f0: 65 77 6c 69 6b 65 0a 20 20 64 62 20 65 76 61 6c  ewlike.  db eval
3700: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 31 2c   {.    SELECT 1,
3710: 20 78 20 46 52 4f 4d 20 74 38 20 57 48 45 52 45   x FROM t8 WHERE
3720: 20 78 20 4c 49 4b 45 20 27 25 68 25 27 3b 0a 20   x LIKE '%h%';. 
3730: 20 20 20 53 45 4c 45 43 54 20 32 2c 20 78 20 46     SELECT 2, x F
3740: 52 4f 4d 20 74 38 20 57 48 45 52 45 20 78 20 4c  ROM t8 WHERE x L
3750: 49 4b 45 20 27 25 68 25 27 20 45 53 43 41 50 45  IKE '%h%' ESCAPE
3760: 20 27 78 27 3b 0a 20 20 7d 0a 7d 20 7b 31 20 61   'x';.  }.} {1 a
3770: 62 63 64 65 66 20 31 20 67 68 69 6a 6b 6c 20 31  bcdef 1 ghijkl 1
3780: 20 6d 6e 6f 70 71 72 20 32 20 67 68 69 6a 6b 6c   mnopqr 2 ghijkl
3790: 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 38  }.do_test like-8
37a0: 2e 34 20 7b 0a 20 20 64 62 20 66 75 6e 63 74 69  .4 {.  db functi
37b0: 6f 6e 20 6c 69 6b 65 20 2d 61 72 67 63 6f 75 6e  on like -argcoun
37c0: 74 20 33 20 6e 65 77 6c 69 6b 65 0a 20 20 64 62  t 3 newlike.  db
37d0: 20 65 76 61 6c 20 7b 0a 20 20 20 20 53 45 4c 45   eval {.    SELE
37e0: 43 54 20 31 2c 20 78 20 46 52 4f 4d 20 74 38 20  CT 1, x FROM t8 
37f0: 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27 25 68  WHERE x LIKE '%h
3800: 25 27 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 32  %';.    SELECT 2
3810: 2c 20 78 20 46 52 4f 4d 20 74 38 20 57 48 45 52  , x FROM t8 WHER
3820: 45 20 78 20 4c 49 4b 45 20 27 25 68 25 27 20 45  E x LIKE '%h%' E
3830: 53 43 41 50 45 20 27 78 27 3b 0a 20 20 7d 0a 7d  SCAPE 'x';.  }.}
3840: 20 7b 31 20 61 62 63 64 65 66 20 31 20 67 68 69   {1 abcdef 1 ghi
3850: 6a 6b 6c 20 31 20 6d 6e 6f 70 71 72 20 32 20 61  jkl 1 mnopqr 2 a
3860: 62 63 64 65 66 20 32 20 67 68 69 6a 6b 6c 20 32  bcdef 2 ghijkl 2
3870: 20 6d 6e 6f 70 71 72 7d 0a 0a 0a 69 66 63 61 70   mnopqr}...ifcap
3880: 61 62 6c 65 20 6c 69 6b 65 5f 6f 70 74 26 26 21  able like_opt&&!
3890: 69 63 75 20 7b 0a 20 20 23 20 45 76 61 6c 75 61  icu {.  # Evalua
38a0: 74 65 20 53 51 4c 2e 20 20 52 65 74 75 72 6e 20  te SQL.  Return 
38b0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 66  the result set f
38c0: 6f 6c 6c 6f 77 65 64 20 62 79 20 74 68 65 0a 20  ollowed by the. 
38d0: 20 23 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65   # and the numbe
38e0: 72 20 6f 66 20 66 75 6c 6c 2d 73 63 61 6e 20 73  r of full-scan s
38f0: 74 65 70 73 2e 0a 20 20 23 0a 20 20 64 62 20 63  teps..  #.  db c
3900: 6c 6f 73 65 0a 20 20 73 71 6c 69 74 65 33 20 64  lose.  sqlite3 d
3910: 62 20 74 65 73 74 2e 64 62 0a 20 20 70 72 6f 63  b test.db.  proc
3920: 20 63 6f 75 6e 74 5f 73 74 65 70 73 20 7b 73 71   count_steps {sq
3930: 6c 7d 20 7b 0a 20 20 20 20 73 65 74 20 72 20 5b  l} {.    set r [
3940: 64 62 20 65 76 61 6c 20 24 73 71 6c 5d 0a 20 20  db eval $sql].  
3950: 20 20 6c 61 70 70 65 6e 64 20 72 20 73 63 61 6e    lappend r scan
3960: 20 5b 64 62 20 73 74 61 74 75 73 20 73 74 65 70   [db status step
3970: 5d 20 73 6f 72 74 20 5b 64 62 20 73 74 61 74 75  ] sort [db statu
3980: 73 20 73 6f 72 74 5d 0a 20 20 7d 0a 20 20 64 6f  s sort].  }.  do
3990: 5f 74 65 73 74 20 6c 69 6b 65 2d 39 2e 31 20 7b  _test like-9.1 {
39a0: 0a 20 20 20 20 63 6f 75 6e 74 5f 73 74 65 70 73  .    count_steps
39b0: 20 7b 0a 20 20 20 20 20 20 20 53 45 4c 45 43 54   {.       SELECT
39c0: 20 78 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45   x FROM t2 WHERE
39d0: 20 78 20 4c 49 4b 45 20 27 78 25 27 0a 20 20 20   x LIKE 'x%'.   
39e0: 20 7d 0a 20 20 7d 20 7b 78 79 7a 20 73 63 61 6e   }.  } {xyz scan
39f0: 20 30 20 73 6f 72 74 20 30 7d 0a 20 20 64 6f 5f   0 sort 0}.  do_
3a00: 74 65 73 74 20 6c 69 6b 65 2d 39 2e 32 20 7b 0a  test like-9.2 {.
3a10: 20 20 20 20 63 6f 75 6e 74 5f 73 74 65 70 73 20      count_steps 
3a20: 7b 0a 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  {.       SELECT 
3a30: 78 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20  x FROM t2 WHERE 
3a40: 78 20 4c 49 4b 45 20 27 5f 79 25 27 0a 20 20 20  x LIKE '_y%'.   
3a50: 20 7d 0a 20 20 7d 20 7b 78 79 7a 20 73 63 61 6e   }.  } {xyz scan
3a60: 20 31 39 20 73 6f 72 74 20 30 7d 0a 20 20 64 6f   19 sort 0}.  do
3a70: 5f 74 65 73 74 20 6c 69 6b 65 2d 39 2e 33 2e 31  _test like-9.3.1
3a80: 20 7b 0a 20 20 20 20 73 65 74 20 72 65 73 20 5b   {.    set res [
3a90: 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 68 65 78  sqlite3_exec_hex
3aa0: 20 64 62 20 7b 0a 20 20 20 20 20 20 20 53 45 4c   db {.       SEL
3ab0: 45 43 54 20 78 20 46 52 4f 4d 20 74 32 20 57 48  ECT x FROM t2 WH
3ac0: 45 52 45 20 78 20 4c 49 4b 45 20 27 25 37 38 25  ERE x LIKE '%78%
3ad0: 32 35 27 0a 20 20 20 20 7d 5d 0a 20 20 7d 20 7b  25'.    }].  } {
3ae0: 30 20 7b 78 20 78 79 7a 7d 7d 0a 20 20 69 66 63  0 {x xyz}}.  ifc
3af0: 61 70 61 62 6c 65 20 65 78 70 6c 61 69 6e 20 7b  apable explain {
3b00: 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 6c 69 6b  .    do_test lik
3b10: 65 2d 39 2e 33 2e 32 20 7b 0a 20 20 20 20 20 20  e-9.3.2 {.      
3b20: 73 65 74 20 72 65 73 20 5b 73 71 6c 69 74 65 33  set res [sqlite3
3b30: 5f 65 78 65 63 5f 68 65 78 20 64 62 20 7b 0a 20  _exec_hex db {. 
3b40: 20 20 20 20 20 20 20 20 45 58 50 4c 41 49 4e 20          EXPLAIN 
3b50: 51 55 45 52 59 20 50 4c 41 4e 20 53 45 4c 45 43  QUERY PLAN SELEC
3b60: 54 20 78 20 46 52 4f 4d 20 74 32 20 57 48 45 52  T x FROM t2 WHER
3b70: 45 20 78 20 4c 49 4b 45 20 27 25 37 38 25 32 35  E x LIKE '%78%25
3b80: 27 0a 20 20 20 20 20 20 7d 5d 0a 20 20 20 20 20  '.      }].     
3b90: 20 72 65 67 65 78 70 20 7b 49 4e 44 45 58 20 69   regexp {INDEX i
3ba0: 32 7d 20 24 72 65 73 0a 20 20 20 20 7d 20 7b 31  2} $res.    } {1
3bb0: 7d 0a 20 20 7d 0a 20 20 64 6f 5f 74 65 73 74 20  }.  }.  do_test 
3bc0: 6c 69 6b 65 2d 39 2e 34 2e 31 20 7b 0a 20 20 20  like-9.4.1 {.   
3bd0: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 68 65   sqlite3_exec_he
3be0: 78 20 64 62 20 7b 49 4e 53 45 52 54 20 49 4e 54  x db {INSERT INT
3bf0: 4f 20 74 32 20 56 41 4c 55 45 53 28 27 25 66 66  O t2 VALUES('%ff
3c00: 68 65 6c 6c 6f 27 29 7d 0a 20 20 20 20 73 65 74  hello')}.    set
3c10: 20 72 65 73 20 5b 73 71 6c 69 74 65 33 5f 65 78   res [sqlite3_ex
3c20: 65 63 5f 68 65 78 20 64 62 20 7b 0a 20 20 20 20  ec_hex db {.    
3c30: 20 20 20 53 45 4c 45 43 54 20 73 75 62 73 74 72     SELECT substr
3c40: 28 78 2c 32 29 20 41 53 20 78 20 46 52 4f 4d 20  (x,2) AS x FROM 
3c50: 74 32 20 57 48 45 52 45 20 2b 78 20 4c 49 4b 45  t2 WHERE +x LIKE
3c60: 20 27 25 66 66 25 32 35 27 0a 20 20 20 20 7d 5d   '%ff%25'.    }]
3c70: 0a 20 20 7d 20 7b 30 20 7b 78 20 68 65 6c 6c 6f  .  } {0 {x hello
3c80: 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 6c 69 6b  }}.  do_test lik
3c90: 65 2d 39 2e 34 2e 32 20 7b 0a 20 20 20 20 73 65  e-9.4.2 {.    se
3ca0: 74 20 72 65 73 20 5b 73 71 6c 69 74 65 33 5f 65  t res [sqlite3_e
3cb0: 78 65 63 5f 68 65 78 20 64 62 20 7b 0a 20 20 20  xec_hex db {.   
3cc0: 20 20 20 20 53 45 4c 45 43 54 20 73 75 62 73 74      SELECT subst
3cd0: 72 28 78 2c 32 29 20 41 53 20 78 20 46 52 4f 4d  r(x,2) AS x FROM
3ce0: 20 74 32 20 57 48 45 52 45 20 78 20 4c 49 4b 45   t2 WHERE x LIKE
3cf0: 20 27 25 66 66 25 32 35 27 0a 20 20 20 20 7d 5d   '%ff%25'.    }]
3d00: 0a 20 20 7d 20 7b 30 20 7b 78 20 68 65 6c 6c 6f  .  } {0 {x hello
3d10: 7d 7d 0a 20 20 69 66 63 61 70 61 62 6c 65 20 65  }}.  ifcapable e
3d20: 78 70 6c 61 69 6e 20 7b 0a 20 20 20 20 64 6f 5f  xplain {.    do_
3d30: 74 65 73 74 20 6c 69 6b 65 2d 39 2e 34 2e 33 20  test like-9.4.3 
3d40: 7b 0a 20 20 20 20 20 20 73 65 74 20 72 65 73 20  {.      set res 
3d50: 5b 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 68 65  [sqlite3_exec_he
3d60: 78 20 64 62 20 7b 0a 20 20 20 20 20 20 20 20 20  x db {.         
3d70: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
3d80: 41 4e 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d  AN SELECT x FROM
3d90: 20 74 32 20 57 48 45 52 45 20 78 20 4c 49 4b 45   t2 WHERE x LIKE
3da0: 20 27 25 66 66 25 32 35 27 0a 20 20 20 20 20 20   '%ff%25'.      
3db0: 7d 5d 0a 20 20 20 20 20 20 72 65 67 65 78 70 20  }].      regexp 
3dc0: 7b 49 4e 44 45 58 20 69 32 7d 20 24 72 65 73 0a  {INDEX i2} $res.
3dd0: 20 20 20 20 7d 20 7b 30 7d 0a 20 20 7d 0a 20 20      } {0}.  }.  
3de0: 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 39 2e 35  do_test like-9.5
3df0: 2e 31 20 7b 0a 20 20 20 20 73 65 74 20 72 65 73  .1 {.    set res
3e00: 20 5b 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 68   [sqlite3_exec_h
3e10: 65 78 20 64 62 20 7b 0a 20 20 20 20 20 20 20 53  ex db {.       S
3e20: 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 32 20  ELECT x FROM t2 
3e30: 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27 25 66  WHERE x LIKE '%f
3e40: 65 25 32 35 27 0a 20 20 20 20 7d 5d 0a 20 20 7d  e%25'.    }].  }
3e50: 20 7b 30 20 7b 7d 7d 0a 20 20 69 66 63 61 70 61   {0 {}}.  ifcapa
3e60: 62 6c 65 20 65 78 70 6c 61 69 6e 20 7b 0a 20 20  ble explain {.  
3e70: 20 20 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 39    do_test like-9
3e80: 2e 35 2e 32 20 7b 0a 20 20 20 20 20 20 73 65 74  .5.2 {.      set
3e90: 20 72 65 73 20 5b 73 71 6c 69 74 65 33 5f 65 78   res [sqlite3_ex
3ea0: 65 63 5f 68 65 78 20 64 62 20 7b 0a 20 20 20 20  ec_hex db {.    
3eb0: 20 20 20 20 20 45 58 50 4c 41 49 4e 20 51 55 45       EXPLAIN QUE
3ec0: 52 59 20 50 4c 41 4e 20 53 45 4c 45 43 54 20 78  RY PLAN SELECT x
3ed0: 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 78   FROM t2 WHERE x
3ee0: 20 4c 49 4b 45 20 27 25 66 65 25 32 35 27 0a 20   LIKE '%fe%25'. 
3ef0: 20 20 20 20 20 7d 5d 0a 20 20 20 20 20 20 72 65       }].      re
3f00: 67 65 78 70 20 7b 49 4e 44 45 58 20 69 32 7d 20  gexp {INDEX i2} 
3f10: 24 72 65 73 0a 20 20 20 20 7d 20 7b 31 7d 0a 20  $res.    } {1}. 
3f20: 20 7d 0a 0a 20 20 23 20 44 6f 20 61 6e 20 53 51   }..  # Do an SQ
3f30: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 70  L statement.  Ap
3f40: 70 65 6e 64 20 74 68 65 20 73 65 61 72 63 68 20  pend the search 
3f50: 63 6f 75 6e 74 20 74 6f 20 74 68 65 20 65 6e 64  count to the end
3f60: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a   of the result..
3f70: 20 20 23 0a 20 20 70 72 6f 63 20 63 6f 75 6e 74    #.  proc count
3f80: 20 73 71 6c 20 7b 0a 20 20 20 20 73 65 74 20 3a   sql {.    set :
3f90: 3a 73 71 6c 69 74 65 5f 73 65 61 72 63 68 5f 63  :sqlite_search_c
3fa0: 6f 75 6e 74 20 30 0a 20 20 20 20 73 65 74 20 3a  ount 0.    set :
3fb0: 3a 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75  :sqlite_like_cou
3fc0: 6e 74 20 30 0a 20 20 20 20 72 65 74 75 72 6e 20  nt 0.    return 
3fd0: 5b 63 6f 6e 63 61 74 20 5b 65 78 65 63 73 71 6c  [concat [execsql
3fe0: 20 24 73 71 6c 5d 20 73 63 61 6e 20 24 3a 3a 73   $sql] scan $::s
3ff0: 71 6c 69 74 65 5f 73 65 61 72 63 68 5f 63 6f 75  qlite_search_cou
4000: 6e 74 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  nt \.           
4010: 20 20 6c 69 6b 65 20 24 3a 3a 73 71 6c 69 74 65    like $::sqlite
4020: 5f 6c 69 6b 65 5f 63 6f 75 6e 74 5d 0a 20 20 7d  _like_count].  }
4030: 0a 0a 20 20 23 20 54 68 65 20 4c 49 4b 45 20 61  ..  # The LIKE a
4040: 6e 64 20 47 4c 4f 42 20 6f 70 74 69 6d 69 7a 61  nd GLOB optimiza
4050: 74 69 6f 6e 73 20 64 6f 20 6e 6f 74 20 77 6f 72  tions do not wor
4060: 6b 20 6f 6e 20 63 6f 6c 75 6d 6e 73 20 77 69 74  k on columns wit
4070: 68 0a 20 20 23 20 61 66 66 69 6e 69 74 79 20 6f  h.  # affinity o
4080: 74 68 65 72 20 74 68 61 6e 20 54 45 58 54 2e 0a  ther than TEXT..
4090: 20 20 23 20 54 69 63 6b 65 74 20 23 33 39 30 31    # Ticket #3901
40a0: 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 6c  .  #.  do_test l
40b0: 69 6b 65 2d 31 30 2e 31 20 7b 0a 20 20 20 20 64  ike-10.1 {.    d
40c0: 62 20 63 6c 6f 73 65 0a 20 20 20 20 73 71 6c 69  b close.    sqli
40d0: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
40e0: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
40f0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
4100: 74 31 30 28 0a 20 20 20 20 20 20 20 20 61 20 49  t10(.        a I
4110: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
4120: 45 59 2c 0a 20 20 20 20 20 20 20 20 62 20 49 4e  EY,.        b IN
4130: 54 45 47 45 52 20 43 4f 4c 4c 41 54 45 20 6e 6f  TEGER COLLATE no
4140: 63 61 73 65 20 55 4e 49 51 55 45 2c 0a 20 20 20  case UNIQUE,.   
4150: 20 20 20 20 20 63 20 4e 55 4d 42 45 52 20 43 4f       c NUMBER CO
4160: 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 55 4e 49  LLATE nocase UNI
4170: 51 55 45 2c 0a 20 20 20 20 20 20 20 20 64 20 42  QUE,.        d B
4180: 4c 4f 42 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61  LOB COLLATE noca
4190: 73 65 20 55 4e 49 51 55 45 2c 0a 20 20 20 20 20  se UNIQUE,.     
41a0: 20 20 20 65 20 43 4f 4c 4c 41 54 45 20 6e 6f 63     e COLLATE noc
41b0: 61 73 65 20 55 4e 49 51 55 45 2c 0a 20 20 20 20  ase UNIQUE,.    
41c0: 20 20 20 20 66 20 54 45 58 54 20 43 4f 4c 4c 41      f TEXT COLLA
41d0: 54 45 20 6e 6f 63 61 73 65 20 55 4e 49 51 55 45  TE nocase UNIQUE
41e0: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
41f0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 30 20  INSERT INTO t10 
4200: 56 41 4c 55 45 53 28 31 2c 31 2c 31 2c 31 2c 31  VALUES(1,1,1,1,1
4210: 2c 31 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  ,1);.      INSER
4220: 54 20 49 4e 54 4f 20 74 31 30 20 56 41 4c 55 45  T INTO t10 VALUE
4230: 53 28 31 32 2c 31 32 2c 31 32 2c 31 32 2c 31 32  S(12,12,12,12,12
4240: 2c 31 32 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  ,12);.      INSE
4250: 52 54 20 49 4e 54 4f 20 74 31 30 20 56 41 4c 55  RT INTO t10 VALU
4260: 45 53 28 31 32 33 2c 31 32 33 2c 31 32 33 2c 31  ES(123,123,123,1
4270: 32 33 2c 31 32 33 2c 31 32 33 29 3b 0a 20 20 20  23,123,123);.   
4280: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
4290: 31 30 20 56 41 4c 55 45 53 28 32 33 34 2c 32 33  10 VALUES(234,23
42a0: 34 2c 32 33 34 2c 32 33 34 2c 32 33 34 2c 32 33  4,234,234,234,23
42b0: 34 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  4);.      INSERT
42c0: 20 49 4e 54 4f 20 74 31 30 20 56 41 4c 55 45 53   INTO t10 VALUES
42d0: 28 33 34 35 2c 33 34 35 2c 33 34 35 2c 33 34 35  (345,345,345,345
42e0: 2c 33 34 35 2c 33 34 35 29 3b 0a 20 20 20 20 20  ,345,345);.     
42f0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 30   INSERT INTO t10
4300: 20 56 41 4c 55 45 53 28 34 35 2c 34 35 2c 34 35   VALUES(45,45,45
4310: 2c 34 35 2c 34 35 2c 34 35 29 3b 0a 20 20 20 20  ,45,45,45);.    
4320: 7d 0a 20 20 20 20 63 6f 75 6e 74 20 7b 0a 20 20  }.    count {.  
4330: 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f      SELECT a FRO
4340: 4d 20 74 31 30 20 57 48 45 52 45 20 62 20 4c 49  M t10 WHERE b LI
4350: 4b 45 20 27 31 32 25 27 20 4f 52 44 45 52 20 42  KE '12%' ORDER B
4360: 59 20 2b 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  Y +a;.    }.  } 
4370: 7b 31 32 20 31 32 33 20 73 63 61 6e 20 35 20 6c  {12 123 scan 5 l
4380: 69 6b 65 20 36 7d 0a 20 20 64 6f 5f 74 65 73 74  ike 6}.  do_test
4390: 20 6c 69 6b 65 2d 31 30 2e 32 20 7b 0a 20 20 20   like-10.2 {.   
43a0: 20 63 6f 75 6e 74 20 7b 0a 20 20 20 20 20 20 53   count {.      S
43b0: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 30  ELECT a FROM t10
43c0: 20 57 48 45 52 45 20 63 20 4c 49 4b 45 20 27 31   WHERE c LIKE '1
43d0: 32 25 27 20 4f 52 44 45 52 20 42 59 20 2b 61 3b  2%' ORDER BY +a;
43e0: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 32 20 31  .    }.  } {12 1
43f0: 32 33 20 73 63 61 6e 20 35 20 6c 69 6b 65 20 36  23 scan 5 like 6
4400: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 6c 69 6b 65  }.  do_test like
4410: 2d 31 30 2e 33 20 7b 0a 20 20 20 20 63 6f 75 6e  -10.3 {.    coun
4420: 74 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  t {.      SELECT
4430: 20 61 20 46 52 4f 4d 20 74 31 30 20 57 48 45 52   a FROM t10 WHER
4440: 45 20 64 20 4c 49 4b 45 20 27 31 32 25 27 20 4f  E d LIKE '12%' O
4450: 52 44 45 52 20 42 59 20 2b 61 3b 0a 20 20 20 20  RDER BY +a;.    
4460: 7d 0a 20 20 7d 20 7b 31 32 20 31 32 33 20 73 63  }.  } {12 123 sc
4470: 61 6e 20 35 20 6c 69 6b 65 20 36 7d 0a 20 20 64  an 5 like 6}.  d
4480: 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 31 30 2e 34  o_test like-10.4
4490: 20 7b 0a 20 20 20 20 63 6f 75 6e 74 20 7b 0a 20   {.    count {. 
44a0: 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52       SELECT a FR
44b0: 4f 4d 20 74 31 30 20 57 48 45 52 45 20 65 20 4c  OM t10 WHERE e L
44c0: 49 4b 45 20 27 31 32 25 27 20 4f 52 44 45 52 20  IKE '12%' ORDER 
44d0: 42 59 20 2b 61 3b 0a 20 20 20 20 7d 0a 20 20 7d  BY +a;.    }.  }
44e0: 20 7b 31 32 20 31 32 33 20 73 63 61 6e 20 35 20   {12 123 scan 5 
44f0: 6c 69 6b 65 20 36 7d 0a 20 20 64 6f 5f 74 65 73  like 6}.  do_tes
4500: 74 20 6c 69 6b 65 2d 31 30 2e 35 20 7b 0a 20 20  t like-10.5 {.  
4510: 20 20 63 6f 75 6e 74 20 7b 0a 20 20 20 20 20 20    count {.      
4520: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
4530: 30 20 57 48 45 52 45 20 66 20 4c 49 4b 45 20 27  0 WHERE f LIKE '
4540: 31 32 25 27 20 4f 52 44 45 52 20 42 59 20 2b 61  12%' ORDER BY +a
4550: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 32 20  ;.    }.  } {12 
4560: 31 32 33 20 73 63 61 6e 20 33 20 6c 69 6b 65 20  123 scan 3 like 
4570: 30 7d 0a 20 20 64 6f 5f 74 65 73 74 20 6c 69 6b  0}.  do_test lik
4580: 65 2d 31 30 2e 36 20 7b 0a 20 20 20 20 63 6f 75  e-10.6 {.    cou
4590: 6e 74 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43  nt {.      SELEC
45a0: 54 20 61 20 46 52 4f 4d 20 74 31 30 20 57 48 45  T a FROM t10 WHE
45b0: 52 45 20 61 20 4c 49 4b 45 20 27 31 32 25 27 20  RE a LIKE '12%' 
45c0: 4f 52 44 45 52 20 42 59 20 2b 61 3b 0a 20 20 20  ORDER BY +a;.   
45d0: 20 7d 0a 20 20 7d 20 7b 31 32 20 31 32 33 20 73   }.  } {12 123 s
45e0: 63 61 6e 20 35 20 6c 69 6b 65 20 36 7d 0a 20 20  can 5 like 6}.  
45f0: 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 31 30 2e  do_test like-10.
4600: 31 30 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  10 {.    execsql
4610: 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20   {.      CREATE 
4620: 54 41 42 4c 45 20 74 31 30 62 28 0a 20 20 20 20  TABLE t10b(.    
4630: 20 20 20 20 61 20 49 4e 54 45 47 45 52 20 50 52      a INTEGER PR
4640: 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 20  IMARY KEY,.     
4650: 20 20 20 62 20 49 4e 54 45 47 45 52 20 55 4e 49     b INTEGER UNI
4660: 51 55 45 2c 0a 20 20 20 20 20 20 20 20 63 20 4e  QUE,.        c N
4670: 55 4d 42 45 52 20 55 4e 49 51 55 45 2c 0a 20 20  UMBER UNIQUE,.  
4680: 20 20 20 20 20 20 64 20 42 4c 4f 42 20 55 4e 49        d BLOB UNI
4690: 51 55 45 2c 0a 20 20 20 20 20 20 20 20 65 20 55  QUE,.        e U
46a0: 4e 49 51 55 45 2c 0a 20 20 20 20 20 20 20 20 66  NIQUE,.        f
46b0: 20 54 45 58 54 20 55 4e 49 51 55 45 0a 20 20 20   TEXT UNIQUE.   
46c0: 20 20 20 29 3b 0a 20 20 20 20 20 20 49 4e 53 45     );.      INSE
46d0: 52 54 20 49 4e 54 4f 20 74 31 30 62 20 53 45 4c  RT INTO t10b SEL
46e0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 30 3b 0a  ECT * FROM t10;.
46f0: 20 20 20 20 7d 0a 20 20 20 20 63 6f 75 6e 74 20      }.    count 
4700: 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 61  {.      SELECT a
4710: 20 46 52 4f 4d 20 74 31 30 62 20 57 48 45 52 45   FROM t10b WHERE
4720: 20 62 20 47 4c 4f 42 20 27 31 32 2a 27 20 4f 52   b GLOB '12*' OR
4730: 44 45 52 20 42 59 20 2b 61 3b 0a 20 20 20 20 7d  DER BY +a;.    }
4740: 0a 20 20 7d 20 7b 31 32 20 31 32 33 20 73 63 61  .  } {12 123 sca
4750: 6e 20 35 20 6c 69 6b 65 20 36 7d 0a 20 20 64 6f  n 5 like 6}.  do
4760: 5f 74 65 73 74 20 6c 69 6b 65 2d 31 30 2e 31 31  _test like-10.11
4770: 20 7b 0a 20 20 20 20 63 6f 75 6e 74 20 7b 0a 20   {.    count {. 
4780: 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52       SELECT a FR
4790: 4f 4d 20 74 31 30 62 20 57 48 45 52 45 20 63 20  OM t10b WHERE c 
47a0: 47 4c 4f 42 20 27 31 32 2a 27 20 4f 52 44 45 52  GLOB '12*' ORDER
47b0: 20 42 59 20 2b 61 3b 0a 20 20 20 20 7d 0a 20 20   BY +a;.    }.  
47c0: 7d 20 7b 31 32 20 31 32 33 20 73 63 61 6e 20 35  } {12 123 scan 5
47d0: 20 6c 69 6b 65 20 36 7d 0a 20 20 64 6f 5f 74 65   like 6}.  do_te
47e0: 73 74 20 6c 69 6b 65 2d 31 30 2e 31 32 20 7b 0a  st like-10.12 {.
47f0: 20 20 20 20 63 6f 75 6e 74 20 7b 0a 20 20 20 20      count {.    
4800: 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
4810: 74 31 30 62 20 57 48 45 52 45 20 64 20 47 4c 4f  t10b WHERE d GLO
4820: 42 20 27 31 32 2a 27 20 4f 52 44 45 52 20 42 59  B '12*' ORDER BY
4830: 20 2b 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b   +a;.    }.  } {
4840: 31 32 20 31 32 33 20 73 63 61 6e 20 35 20 6c 69  12 123 scan 5 li
4850: 6b 65 20 36 7d 0a 20 20 64 6f 5f 74 65 73 74 20  ke 6}.  do_test 
4860: 6c 69 6b 65 2d 31 30 2e 31 33 20 7b 0a 20 20 20  like-10.13 {.   
4870: 20 63 6f 75 6e 74 20 7b 0a 20 20 20 20 20 20 53   count {.      S
4880: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 30  ELECT a FROM t10
4890: 62 20 57 48 45 52 45 20 65 20 47 4c 4f 42 20 27  b WHERE e GLOB '
48a0: 31 32 2a 27 20 4f 52 44 45 52 20 42 59 20 2b 61  12*' ORDER BY +a
48b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 32 20  ;.    }.  } {12 
48c0: 31 32 33 20 73 63 61 6e 20 35 20 6c 69 6b 65 20  123 scan 5 like 
48d0: 36 7d 0a 20 20 64 6f 5f 74 65 73 74 20 6c 69 6b  6}.  do_test lik
48e0: 65 2d 31 30 2e 31 34 20 7b 0a 20 20 20 20 63 6f  e-10.14 {.    co
48f0: 75 6e 74 20 7b 0a 20 20 20 20 20 20 53 45 4c 45  unt {.      SELE
4900: 43 54 20 61 20 46 52 4f 4d 20 74 31 30 62 20 57  CT a FROM t10b W
4910: 48 45 52 45 20 66 20 47 4c 4f 42 20 27 31 32 2a  HERE f GLOB '12*
4920: 27 20 4f 52 44 45 52 20 42 59 20 2b 61 3b 0a 20  ' ORDER BY +a;. 
4930: 20 20 20 7d 0a 20 20 7d 20 7b 31 32 20 31 32 33     }.  } {12 123
4940: 20 73 63 61 6e 20 33 20 6c 69 6b 65 20 30 7d 0a   scan 3 like 0}.
4950: 20 20 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 31    do_test like-1
4960: 30 2e 31 35 20 7b 0a 20 20 20 20 63 6f 75 6e 74  0.15 {.    count
4970: 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20   {.      SELECT 
4980: 61 20 46 52 4f 4d 20 74 31 30 62 20 57 48 45 52  a FROM t10b WHER
4990: 45 20 61 20 47 4c 4f 42 20 27 31 32 2a 27 20 4f  E a GLOB '12*' O
49a0: 52 44 45 52 20 42 59 20 2b 61 3b 0a 20 20 20 20  RDER BY +a;.    
49b0: 7d 0a 20 20 7d 20 7b 31 32 20 31 32 33 20 73 63  }.  } {12 123 sc
49c0: 61 6e 20 35 20 6c 69 6b 65 20 36 7d 0a 7d 0a 0a  an 5 like 6}.}..
49d0: 23 20 4c 49 4b 45 20 61 6e 64 20 47 4c 4f 42 20  # LIKE and GLOB 
49e0: 77 68 65 72 65 20 74 68 65 20 64 65 66 61 75 6c  where the defaul
49f0: 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  t collating sequ
4a00: 65 6e 63 65 20 69 73 20 6e 6f 74 20 61 70 70 72  ence is not appr
4a10: 6f 70 72 69 61 74 65 0a 23 20 62 75 74 20 61 6e  opriate.# but an
4a20: 20 69 6e 64 65 78 20 77 69 74 68 20 74 68 65 20   index with the 
4a30: 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c  appropriate coll
4a40: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 65  ating sequence e
4a50: 78 69 73 74 73 2e 0a 23 0a 64 6f 5f 74 65 73 74  xists..#.do_test
4a60: 20 6c 69 6b 65 2d 31 31 2e 30 20 7b 0a 20 20 65   like-11.0 {.  e
4a70: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
4a80: 41 54 45 20 54 41 42 4c 45 20 74 31 31 28 0a 20  ATE TABLE t11(. 
4a90: 20 20 20 20 20 61 20 49 4e 54 45 47 45 52 20 50       a INTEGER P
4aa0: 52 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 20  RIMARY KEY,.    
4ab0: 20 20 62 20 54 45 58 54 20 43 4f 4c 4c 41 54 45    b TEXT COLLATE
4ac0: 20 6e 6f 63 61 73 65 2c 0a 20 20 20 20 20 20 63   nocase,.      c
4ad0: 20 54 45 58 54 20 43 4f 4c 4c 41 54 45 20 62 69   TEXT COLLATE bi
4ae0: 6e 61 72 79 0a 20 20 20 20 29 3b 0a 20 20 20 20  nary.    );.    
4af0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 31 20  INSERT INTO t11 
4b00: 56 41 4c 55 45 53 28 31 2c 20 27 61 27 2c 27 61  VALUES(1, 'a','a
4b10: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
4b20: 4e 54 4f 20 74 31 31 20 56 41 4c 55 45 53 28 32  NTO t11 VALUES(2
4b30: 2c 20 27 61 62 27 2c 27 61 62 27 29 3b 0a 20 20  , 'ab','ab');.  
4b40: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
4b50: 31 20 56 41 4c 55 45 53 28 33 2c 20 27 61 62 63  1 VALUES(3, 'abc
4b60: 27 2c 27 61 62 63 27 29 3b 0a 20 20 20 20 49 4e  ','abc');.    IN
4b70: 53 45 52 54 20 49 4e 54 4f 20 74 31 31 20 56 41  SERT INTO t11 VA
4b80: 4c 55 45 53 28 34 2c 20 27 61 62 63 64 27 2c 27  LUES(4, 'abcd','
4b90: 61 62 63 64 27 29 3b 0a 20 20 20 20 49 4e 53 45  abcd');.    INSE
4ba0: 52 54 20 49 4e 54 4f 20 74 31 31 20 56 41 4c 55  RT INTO t11 VALU
4bb0: 45 53 28 35 2c 20 27 41 27 2c 27 41 27 29 3b 0a  ES(5, 'A','A');.
4bc0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
4bd0: 74 31 31 20 56 41 4c 55 45 53 28 36 2c 20 27 41  t11 VALUES(6, 'A
4be0: 42 27 2c 27 41 42 27 29 3b 0a 20 20 20 20 49 4e  B','AB');.    IN
4bf0: 53 45 52 54 20 49 4e 54 4f 20 74 31 31 20 56 41  SERT INTO t11 VA
4c00: 4c 55 45 53 28 37 2c 20 27 41 42 43 27 2c 27 41  LUES(7, 'ABC','A
4c10: 42 43 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  BC');.    INSERT
4c20: 20 49 4e 54 4f 20 74 31 31 20 56 41 4c 55 45 53   INTO t11 VALUES
4c30: 28 38 2c 20 27 41 42 43 44 27 2c 27 41 42 43 44  (8, 'ABCD','ABCD
4c40: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
4c50: 4e 54 4f 20 74 31 31 20 56 41 4c 55 45 53 28 39  NTO t11 VALUES(9
4c60: 2c 20 27 78 27 2c 27 78 27 29 3b 0a 20 20 20 20  , 'x','x');.    
4c70: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 31 20  INSERT INTO t11 
4c80: 56 41 4c 55 45 53 28 31 30 2c 20 27 79 7a 27 2c  VALUES(10, 'yz',
4c90: 27 79 7a 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  'yz');.    INSER
4ca0: 54 20 49 4e 54 4f 20 74 31 31 20 56 41 4c 55 45  T INTO t11 VALUE
4cb0: 53 28 31 31 2c 20 27 58 27 2c 27 58 27 29 3b 0a  S(11, 'X','X');.
4cc0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
4cd0: 74 31 31 20 56 41 4c 55 45 53 28 31 32 2c 20 27  t11 VALUES(12, '
4ce0: 59 5a 27 2c 27 59 5a 27 29 3b 0a 20 20 20 20 53  YZ','YZ');.    S
4cf0: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
4d00: 52 4f 4d 20 74 31 31 3b 0a 20 20 7d 0a 7d 20 7b  ROM t11;.  }.} {
4d10: 31 32 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65  12}.do_test like
4d20: 2d 31 31 2e 31 20 7b 0a 20 20 71 75 65 72 79 70  -11.1 {.  queryp
4d30: 6c 61 6e 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  lan {.    PRAGMA
4d40: 20 63 61 73 65 5f 73 65 6e 73 69 74 69 76 65 5f   case_sensitive_
4d50: 6c 69 6b 65 3d 4f 46 46 3b 0a 20 20 20 20 53 45  like=OFF;.    SE
4d60: 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 31 31 20  LECT b FROM t11 
4d70: 57 48 45 52 45 20 62 20 4c 49 4b 45 20 27 61 62  WHERE b LIKE 'ab
4d80: 63 25 27 20 4f 52 44 45 52 20 42 59 20 61 3b 0a  c%' ORDER BY a;.
4d90: 20 20 7d 0a 7d 20 7b 61 62 63 20 61 62 63 64 20    }.} {abc abcd 
4da0: 41 42 43 20 41 42 43 44 20 6e 6f 73 6f 72 74 20  ABC ABCD nosort 
4db0: 74 31 31 20 2a 7d 0a 64 6f 5f 74 65 73 74 20 6c  t11 *}.do_test l
4dc0: 69 6b 65 2d 31 31 2e 32 20 7b 0a 20 20 71 75 65  ike-11.2 {.  que
4dd0: 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 50 52 41  ryplan {.    PRA
4de0: 47 4d 41 20 63 61 73 65 5f 73 65 6e 73 69 74 69  GMA case_sensiti
4df0: 76 65 5f 6c 69 6b 65 3d 4f 4e 3b 0a 20 20 20 20  ve_like=ON;.    
4e00: 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 31  SELECT b FROM t1
4e10: 31 20 57 48 45 52 45 20 62 20 4c 49 4b 45 20 27  1 WHERE b LIKE '
4e20: 61 62 63 25 27 20 4f 52 44 45 52 20 42 59 20 61  abc%' ORDER BY a
4e30: 3b 0a 20 20 7d 0a 7d 20 7b 61 62 63 20 61 62 63  ;.  }.} {abc abc
4e40: 64 20 6e 6f 73 6f 72 74 20 74 31 31 20 2a 7d 0a  d nosort t11 *}.
4e50: 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 31 31 2e  do_test like-11.
4e60: 33 20 7b 0a 20 20 71 75 65 72 79 70 6c 61 6e 20  3 {.  queryplan 
4e70: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61 73  {.    PRAGMA cas
4e80: 65 5f 73 65 6e 73 69 74 69 76 65 5f 6c 69 6b 65  e_sensitive_like
4e90: 3d 4f 46 46 3b 0a 20 20 20 20 43 52 45 41 54 45  =OFF;.    CREATE
4ea0: 20 49 4e 44 45 58 20 74 31 31 62 20 4f 4e 20 74   INDEX t11b ON t
4eb0: 31 31 28 62 29 3b 0a 20 20 20 20 53 45 4c 45 43  11(b);.    SELEC
4ec0: 54 20 62 20 46 52 4f 4d 20 74 31 31 20 57 48 45  T b FROM t11 WHE
4ed0: 52 45 20 62 20 4c 49 4b 45 20 27 61 62 63 25 27  RE b LIKE 'abc%'
4ee0: 20 4f 52 44 45 52 20 42 59 20 2b 61 3b 0a 20 20   ORDER BY +a;.  
4ef0: 7d 0a 7d 20 7b 61 62 63 20 61 62 63 64 20 41 42  }.} {abc abcd AB
4f00: 43 20 41 42 43 44 20 73 6f 72 74 20 7b 7d 20 74  C ABCD sort {} t
4f10: 31 31 62 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b  11b}.do_test lik
4f20: 65 2d 31 31 2e 34 20 7b 0a 20 20 71 75 65 72 79  e-11.4 {.  query
4f30: 70 6c 61 6e 20 7b 0a 20 20 20 20 50 52 41 47 4d  plan {.    PRAGM
4f40: 41 20 63 61 73 65 5f 73 65 6e 73 69 74 69 76 65  A case_sensitive
4f50: 5f 6c 69 6b 65 3d 4f 4e 3b 0a 20 20 20 20 53 45  _like=ON;.    SE
4f60: 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 31 31 20  LECT b FROM t11 
4f70: 57 48 45 52 45 20 62 20 4c 49 4b 45 20 27 61 62  WHERE b LIKE 'ab
4f80: 63 25 27 20 4f 52 44 45 52 20 42 59 20 61 3b 0a  c%' ORDER BY a;.
4f90: 20 20 7d 0a 7d 20 7b 61 62 63 20 61 62 63 64 20    }.} {abc abcd 
4fa0: 6e 6f 73 6f 72 74 20 74 31 31 20 2a 7d 0a 64 6f  nosort t11 *}.do
4fb0: 5f 74 65 73 74 20 6c 69 6b 65 2d 31 31 2e 35 20  _test like-11.5 
4fc0: 7b 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a  {.  queryplan {.
4fd0: 20 20 20 20 50 52 41 47 4d 41 20 63 61 73 65 5f      PRAGMA case_
4fe0: 73 65 6e 73 69 74 69 76 65 5f 6c 69 6b 65 3d 4f  sensitive_like=O
4ff0: 46 46 3b 0a 20 20 20 20 44 52 4f 50 20 49 4e 44  FF;.    DROP IND
5000: 45 58 20 74 31 31 62 3b 0a 20 20 20 20 43 52 45  EX t11b;.    CRE
5010: 41 54 45 20 49 4e 44 45 58 20 74 31 31 62 6e 63  ATE INDEX t11bnc
5020: 20 4f 4e 20 74 31 31 28 62 20 43 4f 4c 4c 41 54   ON t11(b COLLAT
5030: 45 20 6e 6f 63 61 73 65 29 3b 0a 20 20 20 20 53  E nocase);.    S
5040: 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 31 31  ELECT b FROM t11
5050: 20 57 48 45 52 45 20 62 20 4c 49 4b 45 20 27 61   WHERE b LIKE 'a
5060: 62 63 25 27 20 4f 52 44 45 52 20 42 59 20 2b 61  bc%' ORDER BY +a
5070: 3b 0a 20 20 7d 0a 7d 20 7b 61 62 63 20 61 62 63  ;.  }.} {abc abc
5080: 64 20 41 42 43 20 41 42 43 44 20 73 6f 72 74 20  d ABC ABCD sort 
5090: 7b 7d 20 74 31 31 62 6e 63 7d 0a 64 6f 5f 74 65  {} t11bnc}.do_te
50a0: 73 74 20 6c 69 6b 65 2d 31 31 2e 36 20 7b 0a 20  st like-11.6 {. 
50b0: 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20   queryplan {.   
50c0: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 74 31   CREATE INDEX t1
50d0: 31 62 62 20 4f 4e 20 74 31 31 28 62 20 43 4f 4c  1bb ON t11(b COL
50e0: 4c 41 54 45 20 62 69 6e 61 72 79 29 3b 0a 20 20  LATE binary);.  
50f0: 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20    SELECT b FROM 
5100: 74 31 31 20 57 48 45 52 45 20 62 20 4c 49 4b 45  t11 WHERE b LIKE
5110: 20 27 61 62 63 25 27 20 4f 52 44 45 52 20 42 59   'abc%' ORDER BY
5120: 20 2b 61 3b 0a 20 20 7d 0a 7d 20 7b 61 62 63 20   +a;.  }.} {abc 
5130: 61 62 63 64 20 41 42 43 20 41 42 43 44 20 73 6f  abcd ABC ABCD so
5140: 72 74 20 7b 7d 20 74 31 31 62 6e 63 7d 0a 64 6f  rt {} t11bnc}.do
5150: 5f 74 65 73 74 20 6c 69 6b 65 2d 31 31 2e 37 20  _test like-11.7 
5160: 7b 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a  {.  queryplan {.
5170: 20 20 20 20 50 52 41 47 4d 41 20 63 61 73 65 5f      PRAGMA case_
5180: 73 65 6e 73 69 74 69 76 65 5f 6c 69 6b 65 3d 4f  sensitive_like=O
5190: 4e 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 62 20  N;.    SELECT b 
51a0: 46 52 4f 4d 20 74 31 31 20 57 48 45 52 45 20 62  FROM t11 WHERE b
51b0: 20 4c 49 4b 45 20 27 61 62 63 25 27 20 4f 52 44   LIKE 'abc%' ORD
51c0: 45 52 20 42 59 20 2b 61 3b 0a 20 20 7d 0a 7d 20  ER BY +a;.  }.} 
51d0: 7b 61 62 63 20 61 62 63 64 20 73 6f 72 74 20 7b  {abc abcd sort {
51e0: 7d 20 74 31 31 62 62 7d 0a 64 6f 5f 74 65 73 74  } t11bb}.do_test
51f0: 20 6c 69 6b 65 2d 31 31 2e 38 20 7b 0a 20 20 71   like-11.8 {.  q
5200: 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 50  ueryplan {.    P
5210: 52 41 47 4d 41 20 63 61 73 65 5f 73 65 6e 73 69  RAGMA case_sensi
5220: 74 69 76 65 5f 6c 69 6b 65 3d 4f 46 46 3b 0a 20  tive_like=OFF;. 
5230: 20 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d     SELECT b FROM
5240: 20 74 31 31 20 57 48 45 52 45 20 62 20 47 4c 4f   t11 WHERE b GLO
5250: 42 20 27 61 62 63 2a 27 20 4f 52 44 45 52 20 42  B 'abc*' ORDER B
5260: 59 20 2b 61 3b 0a 20 20 7d 0a 7d 20 7b 61 62 63  Y +a;.  }.} {abc
5270: 20 61 62 63 64 20 73 6f 72 74 20 7b 7d 20 74 31   abcd sort {} t1
5280: 31 62 62 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b  1bb}.do_test lik
5290: 65 2d 31 31 2e 39 20 7b 0a 20 20 71 75 65 72 79  e-11.9 {.  query
52a0: 70 6c 61 6e 20 7b 0a 20 20 20 20 43 52 45 41 54  plan {.    CREAT
52b0: 45 20 49 4e 44 45 58 20 74 31 31 63 6e 63 20 4f  E INDEX t11cnc O
52c0: 4e 20 74 31 31 28 63 20 43 4f 4c 4c 41 54 45 20  N t11(c COLLATE 
52d0: 6e 6f 63 61 73 65 29 3b 0a 20 20 20 20 43 52 45  nocase);.    CRE
52e0: 41 54 45 20 49 4e 44 45 58 20 74 31 31 63 62 20  ATE INDEX t11cb 
52f0: 4f 4e 20 74 31 31 28 63 20 43 4f 4c 4c 41 54 45  ON t11(c COLLATE
5300: 20 62 69 6e 61 72 79 29 3b 0a 20 20 20 20 53 45   binary);.    SE
5310: 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 31 31 20  LECT c FROM t11 
5320: 57 48 45 52 45 20 63 20 4c 49 4b 45 20 27 61 62  WHERE c LIKE 'ab
5330: 63 25 27 20 4f 52 44 45 52 20 42 59 20 2b 61 3b  c%' ORDER BY +a;
5340: 0a 20 20 7d 0a 7d 20 7b 61 62 63 20 61 62 63 64  .  }.} {abc abcd
5350: 20 41 42 43 20 41 42 43 44 20 73 6f 72 74 20 7b   ABC ABCD sort {
5360: 7d 20 74 31 31 63 6e 63 7d 0a 64 6f 5f 74 65 73  } t11cnc}.do_tes
5370: 74 20 6c 69 6b 65 2d 31 31 2e 31 30 20 7b 0a 20  t like-11.10 {. 
5380: 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20   queryplan {.   
5390: 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74   SELECT c FROM t
53a0: 31 31 20 57 48 45 52 45 20 63 20 47 4c 4f 42 20  11 WHERE c GLOB 
53b0: 27 61 62 63 2a 27 20 4f 52 44 45 52 20 42 59 20  'abc*' ORDER BY 
53c0: 2b 61 3b 0a 20 20 7d 0a 7d 20 7b 61 62 63 20 61  +a;.  }.} {abc a
53d0: 62 63 64 20 73 6f 72 74 20 7b 7d 20 74 31 31 63  bcd sort {} t11c
53e0: 62 7d 0a 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74  b}...finish_test
53f0: 0a                                               .