/ Hex Artifact Content
Login

Artifact 9cc5261d22f2108a27cedff8a972aa3284a4ba52:


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 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20  .  queryplan {. 
1ac0: 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
1ad0: 69 31 20 4f 4e 20 74 31 28 78 29 3b 0a 20 20 20  i1 ON t1(x);.   
1ae0: 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74   SELECT x FROM t
1af0: 31 20 57 48 45 52 45 20 78 20 47 4c 4f 42 20 27  1 WHERE x GLOB '
1b00: 61 62 63 2a 27 20 4f 52 44 45 52 20 42 59 20 31  abc*' ORDER BY 1
1b10: 3b 0a 20 20 7d 0a 7d 20 7b 61 62 63 20 61 62 63  ;.  }.} {abc abc
1b20: 64 20 6e 6f 73 6f 72 74 20 7b 7d 20 69 31 7d 0a  d nosort {} i1}.
1b30: 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 33 2e 32  do_test like-3.2
1b40: 30 20 7b 0a 20 20 73 65 74 20 73 71 6c 69 74 65  0 {.  set sqlite
1b50: 5f 6c 69 6b 65 5f 63 6f 75 6e 74 0a 7d 20 30 0a  _like_count.} 0.
1b60: 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 33 2e 32  do_test like-3.2
1b70: 31 20 7b 0a 20 20 73 65 74 20 73 71 6c 69 74 65  1 {.  set sqlite
1b80: 5f 6c 69 6b 65 5f 63 6f 75 6e 74 20 30 0a 20 20  _like_count 0.  
1b90: 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20  queryplan {.    
1ba0: 50 52 41 47 4d 41 20 63 61 73 65 5f 73 65 6e 73  PRAGMA case_sens
1bb0: 69 74 69 76 65 5f 6c 69 6b 65 3d 6f 6e 3b 0a 20  itive_like=on;. 
1bc0: 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d     SELECT x FROM
1bd0: 20 74 31 20 57 48 45 52 45 20 78 20 47 4c 4f 42   t1 WHERE x GLOB
1be0: 20 27 61 62 63 2a 27 20 4f 52 44 45 52 20 42 59   'abc*' ORDER BY
1bf0: 20 31 3b 0a 20 20 7d 0a 7d 20 7b 61 62 63 20 61   1;.  }.} {abc a
1c00: 62 63 64 20 6e 6f 73 6f 72 74 20 7b 7d 20 69 31  bcd nosort {} i1
1c10: 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 33  }.do_test like-3
1c20: 2e 32 32 20 7b 0a 20 20 73 65 74 20 73 71 6c 69  .22 {.  set sqli
1c30: 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 0a 7d 20  te_like_count.} 
1c40: 30 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 33  0.do_test like-3
1c50: 2e 32 33 20 7b 0a 20 20 73 65 74 20 73 71 6c 69  .23 {.  set sqli
1c60: 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 20 30 0a  te_like_count 0.
1c70: 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20    queryplan {.  
1c80: 20 20 50 52 41 47 4d 41 20 63 61 73 65 5f 73 65    PRAGMA case_se
1c90: 6e 73 69 74 69 76 65 5f 6c 69 6b 65 3d 6f 66 66  nsitive_like=off
1ca0: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 78 20 46  ;.    SELECT x F
1cb0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 78 20 47  ROM t1 WHERE x G
1cc0: 4c 4f 42 20 27 61 5b 62 63 5d 64 27 20 4f 52 44  LOB 'a[bc]d' ORD
1cd0: 45 52 20 42 59 20 31 3b 0a 20 20 7d 0a 7d 20 7b  ER BY 1;.  }.} {
1ce0: 61 62 64 20 61 63 64 20 6e 6f 73 6f 72 74 20 7b  abd acd nosort {
1cf0: 7d 20 69 31 7d 0a 64 6f 5f 74 65 73 74 20 6c 69  } i1}.do_test li
1d00: 6b 65 2d 33 2e 32 34 20 7b 0a 20 20 73 65 74 20  ke-3.24 {.  set 
1d10: 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e  sqlite_like_coun
1d20: 74 0a 7d 20 36 0a 0a 23 20 47 4c 4f 42 20 6f 70  t.} 6..# GLOB op
1d30: 74 69 6d 69 7a 61 74 69 6f 6e 20 77 68 65 6e 20  timization when 
1d40: 74 68 65 72 65 20 69 73 20 6e 6f 20 77 69 6c 64  there is no wild
1d50: 63 61 72 64 2e 20 20 54 69 63 6b 65 74 20 5b 65  card.  Ticket [e
1d60: 30 39 30 31 38 33 35 33 31 66 63 32 37 34 37 5d  090183531fc2747]
1d70: 0a 23 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d  .#.do_test like-
1d80: 33 2e 32 35 20 7b 0a 20 20 71 75 65 72 79 70 6c  3.25 {.  querypl
1d90: 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  an {.    SELECT 
1da0: 78 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  x FROM t1 WHERE 
1db0: 78 20 47 4c 4f 42 20 27 61 27 20 4f 52 44 45 52  x GLOB 'a' ORDER
1dc0: 20 42 59 20 31 3b 0a 20 20 7d 0a 7d 20 7b 61 20   BY 1;.  }.} {a 
1dd0: 6e 6f 73 6f 72 74 20 7b 7d 20 69 31 7d 0a 64 6f  nosort {} i1}.do
1de0: 5f 74 65 73 74 20 6c 69 6b 65 2d 33 2e 32 36 20  _test like-3.26 
1df0: 7b 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a  {.  queryplan {.
1e00: 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f      SELECT x FRO
1e10: 4d 20 74 31 20 57 48 45 52 45 20 78 20 47 4c 4f  M t1 WHERE x GLO
1e20: 42 20 27 61 62 63 64 27 20 4f 52 44 45 52 20 42  B 'abcd' ORDER B
1e30: 59 20 31 3b 0a 20 20 7d 0a 7d 20 7b 61 62 63 64  Y 1;.  }.} {abcd
1e40: 20 6e 6f 73 6f 72 74 20 7b 7d 20 69 31 7d 0a 64   nosort {} i1}.d
1e50: 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 33 2e 32 37  o_test like-3.27
1e60: 20 7b 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b   {.  queryplan {
1e70: 0a 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52  .    SELECT x FR
1e80: 4f 4d 20 74 31 20 57 48 45 52 45 20 78 20 47 4c  OM t1 WHERE x GL
1e90: 4f 42 20 27 61 62 63 64 65 27 20 4f 52 44 45 52  OB 'abcde' ORDER
1ea0: 20 42 59 20 31 3b 0a 20 20 7d 0a 7d 20 7b 6e 6f   BY 1;.  }.} {no
1eb0: 73 6f 72 74 20 7b 7d 20 69 31 7d 0a 0a 0a 0a 23  sort {} i1}....#
1ec0: 20 4e 6f 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   No optimization
1ed0: 20 69 66 20 74 68 65 20 4c 48 53 20 6f 66 20 74   if the LHS of t
1ee0: 68 65 20 4c 49 4b 45 20 69 73 20 6e 6f 74 20 61  he LIKE is not a
1ef0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6f 72 0a   column name or.
1f00: 23 20 69 66 20 74 68 65 20 52 48 53 20 69 73 20  # if the RHS is 
1f10: 6e 6f 74 20 61 20 73 74 72 69 6e 67 2e 0a 23 0a  not a string..#.
1f20: 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 34 2e 31  do_test like-4.1
1f30: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 50 52   {.  execsql {PR
1f40: 41 47 4d 41 20 63 61 73 65 5f 73 65 6e 73 69 74  AGMA case_sensit
1f50: 69 76 65 5f 6c 69 6b 65 3d 6f 6e 7d 0a 20 20 73  ive_like=on}.  s
1f60: 65 74 20 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63  et sqlite_like_c
1f70: 6f 75 6e 74 20 30 0a 20 20 71 75 65 72 79 70 6c  ount 0.  querypl
1f80: 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  an {.    SELECT 
1f90: 78 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  x FROM t1 WHERE 
1fa0: 78 20 4c 49 4b 45 20 27 61 62 63 25 27 20 4f 52  x LIKE 'abc%' OR
1fb0: 44 45 52 20 42 59 20 31 0a 20 20 7d 0a 7d 20 7b  DER BY 1.  }.} {
1fc0: 61 62 63 20 61 62 63 64 20 6e 6f 73 6f 72 74 20  abc abcd nosort 
1fd0: 7b 7d 20 69 31 7d 0a 64 6f 5f 74 65 73 74 20 6c  {} i1}.do_test l
1fe0: 69 6b 65 2d 34 2e 32 20 7b 0a 20 20 73 65 74 20  ike-4.2 {.  set 
1ff0: 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e  sqlite_like_coun
2000: 74 0a 7d 20 30 0a 64 6f 5f 74 65 73 74 20 6c 69  t.} 0.do_test li
2010: 6b 65 2d 34 2e 33 20 7b 0a 20 20 73 65 74 20 73  ke-4.3 {.  set s
2020: 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74  qlite_like_count
2030: 20 30 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b   0.  queryplan {
2040: 0a 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52  .    SELECT x FR
2050: 4f 4d 20 74 31 20 57 48 45 52 45 20 2b 78 20 4c  OM t1 WHERE +x L
2060: 49 4b 45 20 27 61 62 63 25 27 20 4f 52 44 45 52  IKE 'abc%' ORDER
2070: 20 42 59 20 31 0a 20 20 7d 0a 7d 20 7b 61 62 63   BY 1.  }.} {abc
2080: 20 61 62 63 64 20 6e 6f 73 6f 72 74 20 7b 7d 20   abcd nosort {} 
2090: 69 31 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65  i1}.do_test like
20a0: 2d 34 2e 34 20 7b 0a 20 20 73 65 74 20 73 71 6c  -4.4 {.  set sql
20b0: 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 0a 7d  ite_like_count.}
20c0: 20 31 32 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65   12.do_test like
20d0: 2d 34 2e 35 20 7b 0a 20 20 73 65 74 20 73 71 6c  -4.5 {.  set sql
20e0: 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 20 30  ite_like_count 0
20f0: 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20  .  queryplan {. 
2100: 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d     SELECT x FROM
2110: 20 74 31 20 57 48 45 52 45 20 78 20 4c 49 4b 45   t1 WHERE x LIKE
2120: 20 28 27 61 62 27 20 7c 7c 20 27 63 25 27 29 20   ('ab' || 'c%') 
2130: 4f 52 44 45 52 20 42 59 20 31 0a 20 20 7d 0a 7d  ORDER BY 1.  }.}
2140: 20 7b 61 62 63 20 61 62 63 64 20 6e 6f 73 6f 72   {abc abcd nosor
2150: 74 20 7b 7d 20 69 31 7d 0a 64 6f 5f 74 65 73 74  t {} i1}.do_test
2160: 20 6c 69 6b 65 2d 34 2e 36 20 7b 0a 20 20 73 65   like-4.6 {.  se
2170: 74 20 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f  t sqlite_like_co
2180: 75 6e 74 0a 7d 20 31 32 0a 0a 23 20 43 6f 6c 6c  unt.} 12..# Coll
2190: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20  ating sequences 
21a0: 6f 6e 20 74 68 65 20 69 6e 64 65 78 20 64 69 73  on the index dis
21b0: 61 62 6c 65 20 74 68 65 20 4c 49 4b 45 20 6f 70  able the LIKE op
21c0: 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 23 20 4f 72  timization..# Or
21d0: 20 69 66 20 74 68 65 20 4e 4f 43 41 53 45 20 63   if the NOCASE c
21e0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
21f0: 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 20 4c  e is used, the L
2200: 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  IKE optimization
2210: 0a 23 20 69 73 20 65 6e 61 62 6c 65 64 20 77 68  .# is enabled wh
2220: 65 6e 20 63 61 73 65 5f 73 65 6e 73 69 74 69 76  en case_sensitiv
2230: 65 5f 6c 69 6b 65 20 69 73 20 4f 46 46 2e 0a 23  e_like is OFF..#
2240: 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 35 2e  .do_test like-5.
2250: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 50  1 {.  execsql {P
2260: 52 41 47 4d 41 20 63 61 73 65 5f 73 65 6e 73 69  RAGMA case_sensi
2270: 74 69 76 65 5f 6c 69 6b 65 3d 6f 66 66 7d 0a 20  tive_like=off}. 
2280: 20 73 65 74 20 73 71 6c 69 74 65 5f 6c 69 6b 65   set sqlite_like
2290: 5f 63 6f 75 6e 74 20 30 0a 20 20 71 75 65 72 79  _count 0.  query
22a0: 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43  plan {.    SELEC
22b0: 54 20 78 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T x FROM t1 WHER
22c0: 45 20 78 20 4c 49 4b 45 20 27 61 62 63 25 27 20  E x LIKE 'abc%' 
22d0: 4f 52 44 45 52 20 42 59 20 31 0a 20 20 7d 0a 7d  ORDER BY 1.  }.}
22e0: 20 7b 41 42 43 20 7b 41 42 43 20 61 62 63 20 78   {ABC {ABC abc x
22f0: 79 7a 7d 20 61 62 63 20 61 62 63 64 20 6e 6f 73  yz} abc abcd nos
2300: 6f 72 74 20 7b 7d 20 69 31 7d 0a 64 6f 5f 74 65  ort {} i1}.do_te
2310: 73 74 20 6c 69 6b 65 2d 35 2e 32 20 7b 0a 20 20  st like-5.2 {.  
2320: 73 65 74 20 73 71 6c 69 74 65 5f 6c 69 6b 65 5f  set sqlite_like_
2330: 63 6f 75 6e 74 0a 7d 20 31 32 0a 64 6f 5f 74 65  count.} 12.do_te
2340: 73 74 20 6c 69 6b 65 2d 35 2e 33 20 7b 0a 20 20  st like-5.3 {.  
2350: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
2360: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 78 20  EATE TABLE t2(x 
2370: 54 45 58 54 20 43 4f 4c 4c 41 54 45 20 4e 4f 43  TEXT COLLATE NOC
2380: 41 53 45 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  ASE);.    INSERT
2390: 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20   INTO t2 SELECT 
23a0: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 43  * FROM t1;.    C
23b0: 52 45 41 54 45 20 49 4e 44 45 58 20 69 32 20 4f  REATE INDEX i2 O
23c0: 4e 20 74 32 28 78 20 43 4f 4c 4c 41 54 45 20 4e  N t2(x COLLATE N
23d0: 4f 43 41 53 45 29 3b 0a 20 20 7d 0a 20 20 73 65  OCASE);.  }.  se
23e0: 74 20 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f  t sqlite_like_co
23f0: 75 6e 74 20 30 0a 20 20 71 75 65 72 79 70 6c 61  unt 0.  querypla
2400: 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 78  n {.    SELECT x
2410: 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 78   FROM t2 WHERE x
2420: 20 4c 49 4b 45 20 27 61 62 63 25 27 20 4f 52 44   LIKE 'abc%' ORD
2430: 45 52 20 42 59 20 31 0a 20 20 7d 0a 7d 20 7b 61  ER BY 1.  }.} {a
2440: 62 63 20 41 42 43 20 7b 41 42 43 20 61 62 63 20  bc ABC {ABC abc 
2450: 78 79 7a 7d 20 61 62 63 64 20 6e 6f 73 6f 72 74  xyz} abcd nosort
2460: 20 7b 7d 20 69 32 7d 0a 64 6f 5f 74 65 73 74 20   {} i2}.do_test 
2470: 6c 69 6b 65 2d 35 2e 34 20 7b 0a 20 20 73 65 74  like-5.4 {.  set
2480: 20 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75   sqlite_like_cou
2490: 6e 74 0a 7d 20 30 0a 64 6f 5f 74 65 73 74 20 6c  nt.} 0.do_test l
24a0: 69 6b 65 2d 35 2e 35 20 7b 0a 20 20 65 78 65 63  ike-5.5 {.  exec
24b0: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
24c0: 20 63 61 73 65 5f 73 65 6e 73 69 74 69 76 65 5f   case_sensitive_
24d0: 6c 69 6b 65 3d 6f 6e 3b 0a 20 20 7d 0a 20 20 73  like=on;.  }.  s
24e0: 65 74 20 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63  et sqlite_like_c
24f0: 6f 75 6e 74 20 30 0a 20 20 71 75 65 72 79 70 6c  ount 0.  querypl
2500: 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  an {.    SELECT 
2510: 78 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20  x FROM t2 WHERE 
2520: 78 20 4c 49 4b 45 20 27 61 62 63 25 27 20 4f 52  x LIKE 'abc%' OR
2530: 44 45 52 20 42 59 20 31 0a 20 20 7d 0a 7d 20 7b  DER BY 1.  }.} {
2540: 61 62 63 20 61 62 63 64 20 6e 6f 73 6f 72 74 20  abc abcd nosort 
2550: 7b 7d 20 69 32 7d 0a 64 6f 5f 74 65 73 74 20 6c  {} i2}.do_test l
2560: 69 6b 65 2d 35 2e 36 20 7b 0a 20 20 73 65 74 20  ike-5.6 {.  set 
2570: 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e  sqlite_like_coun
2580: 74 0a 7d 20 31 32 0a 64 6f 5f 74 65 73 74 20 6c  t.} 12.do_test l
2590: 69 6b 65 2d 35 2e 37 20 7b 0a 20 20 65 78 65 63  ike-5.7 {.  exec
25a0: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
25b0: 20 63 61 73 65 5f 73 65 6e 73 69 74 69 76 65 5f   case_sensitive_
25c0: 6c 69 6b 65 3d 6f 66 66 3b 0a 20 20 7d 0a 20 20  like=off;.  }.  
25d0: 73 65 74 20 73 71 6c 69 74 65 5f 6c 69 6b 65 5f  set sqlite_like_
25e0: 63 6f 75 6e 74 20 30 0a 20 20 71 75 65 72 79 70  count 0.  queryp
25f0: 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  lan {.    SELECT
2600: 20 78 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45   x FROM t2 WHERE
2610: 20 78 20 47 4c 4f 42 20 27 61 62 63 2a 27 20 4f   x GLOB 'abc*' O
2620: 52 44 45 52 20 42 59 20 31 0a 20 20 7d 0a 7d 20  RDER BY 1.  }.} 
2630: 7b 61 62 63 20 61 62 63 64 20 6e 6f 73 6f 72 74  {abc abcd nosort
2640: 20 7b 7d 20 69 32 7d 0a 64 6f 5f 74 65 73 74 20   {} i2}.do_test 
2650: 6c 69 6b 65 2d 35 2e 38 20 7b 0a 20 20 73 65 74  like-5.8 {.  set
2660: 20 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75   sqlite_like_cou
2670: 6e 74 0a 7d 20 31 32 0a 64 6f 5f 74 65 73 74 20  nt.} 12.do_test 
2680: 6c 69 6b 65 2d 35 2e 31 31 20 7b 0a 20 20 65 78  like-5.11 {.  ex
2690: 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 63 61  ecsql {PRAGMA ca
26a0: 73 65 5f 73 65 6e 73 69 74 69 76 65 5f 6c 69 6b  se_sensitive_lik
26b0: 65 3d 6f 66 66 7d 0a 20 20 73 65 74 20 73 71 6c  e=off}.  set sql
26c0: 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 20 30  ite_like_count 0
26d0: 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20  .  queryplan {. 
26e0: 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d     SELECT x FROM
26f0: 20 74 31 20 57 48 45 52 45 20 78 20 4c 49 4b 45   t1 WHERE x LIKE
2700: 20 27 41 42 43 25 27 20 4f 52 44 45 52 20 42 59   'ABC%' ORDER BY
2710: 20 31 0a 20 20 7d 0a 7d 20 7b 41 42 43 20 7b 41   1.  }.} {ABC {A
2720: 42 43 20 61 62 63 20 78 79 7a 7d 20 61 62 63 20  BC abc xyz} abc 
2730: 61 62 63 64 20 6e 6f 73 6f 72 74 20 7b 7d 20 69  abcd nosort {} i
2740: 31 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d  1}.do_test like-
2750: 35 2e 31 32 20 7b 0a 20 20 73 65 74 20 73 71 6c  5.12 {.  set sql
2760: 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 0a 7d  ite_like_count.}
2770: 20 31 32 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65   12.do_test like
2780: 2d 35 2e 31 33 20 7b 0a 20 20 73 65 74 20 73 71  -5.13 {.  set sq
2790: 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 20  lite_like_count 
27a0: 30 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a  0.  queryplan {.
27b0: 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f      SELECT x FRO
27c0: 4d 20 74 32 20 57 48 45 52 45 20 78 20 4c 49 4b  M t2 WHERE x LIK
27d0: 45 20 27 41 42 43 25 27 20 4f 52 44 45 52 20 42  E 'ABC%' ORDER B
27e0: 59 20 31 0a 20 20 7d 0a 7d 20 7b 61 62 63 20 41  Y 1.  }.} {abc A
27f0: 42 43 20 7b 41 42 43 20 61 62 63 20 78 79 7a 7d  BC {ABC abc xyz}
2800: 20 61 62 63 64 20 6e 6f 73 6f 72 74 20 7b 7d 20   abcd nosort {} 
2810: 69 32 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65  i2}.do_test like
2820: 2d 35 2e 31 34 20 7b 0a 20 20 73 65 74 20 73 71  -5.14 {.  set sq
2830: 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 0a  lite_like_count.
2840: 7d 20 30 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65  } 0.do_test like
2850: 2d 35 2e 31 35 20 7b 0a 20 20 65 78 65 63 73 71  -5.15 {.  execsq
2860: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63  l {.    PRAGMA c
2870: 61 73 65 5f 73 65 6e 73 69 74 69 76 65 5f 6c 69  ase_sensitive_li
2880: 6b 65 3d 6f 6e 3b 0a 20 20 7d 0a 20 20 73 65 74  ke=on;.  }.  set
2890: 20 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75   sqlite_like_cou
28a0: 6e 74 20 30 0a 20 20 71 75 65 72 79 70 6c 61 6e  nt 0.  queryplan
28b0: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 78 20   {.    SELECT x 
28c0: 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 78 20  FROM t2 WHERE x 
28d0: 4c 49 4b 45 20 27 41 42 43 25 27 20 4f 52 44 45  LIKE 'ABC%' ORDE
28e0: 52 20 42 59 20 31 0a 20 20 7d 0a 7d 20 7b 41 42  R BY 1.  }.} {AB
28f0: 43 20 7b 41 42 43 20 61 62 63 20 78 79 7a 7d 20  C {ABC abc xyz} 
2900: 6e 6f 73 6f 72 74 20 7b 7d 20 69 32 7d 0a 64 6f  nosort {} i2}.do
2910: 5f 74 65 73 74 20 6c 69 6b 65 2d 35 2e 31 36 20  _test like-5.16 
2920: 7b 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f 6c  {.  set sqlite_l
2930: 69 6b 65 5f 63 6f 75 6e 74 0a 7d 20 31 32 0a 64  ike_count.} 12.d
2940: 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 35 2e 31 37  o_test like-5.17
2950: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
2960: 20 20 20 50 52 41 47 4d 41 20 63 61 73 65 5f 73     PRAGMA case_s
2970: 65 6e 73 69 74 69 76 65 5f 6c 69 6b 65 3d 6f 66  ensitive_like=of
2980: 66 3b 0a 20 20 7d 0a 20 20 73 65 74 20 73 71 6c  f;.  }.  set sql
2990: 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 20 30  ite_like_count 0
29a0: 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20  .  queryplan {. 
29b0: 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d     SELECT x FROM
29c0: 20 74 32 20 57 48 45 52 45 20 78 20 47 4c 4f 42   t2 WHERE x GLOB
29d0: 20 27 41 42 43 2a 27 20 4f 52 44 45 52 20 42 59   'ABC*' ORDER BY
29e0: 20 31 0a 20 20 7d 0a 7d 20 7b 41 42 43 20 7b 41   1.  }.} {ABC {A
29f0: 42 43 20 61 62 63 20 78 79 7a 7d 20 6e 6f 73 6f  BC abc xyz} noso
2a00: 72 74 20 7b 7d 20 69 32 7d 0a 64 6f 5f 74 65 73  rt {} i2}.do_tes
2a10: 74 20 6c 69 6b 65 2d 35 2e 31 38 20 7b 0a 20 20  t like-5.18 {.  
2a20: 73 65 74 20 73 71 6c 69 74 65 5f 6c 69 6b 65 5f  set sqlite_like_
2a30: 63 6f 75 6e 74 0a 7d 20 31 32 0a 0a 23 20 42 6f  count.} 12..# Bo
2a40: 75 6e 64 61 72 79 20 63 61 73 65 2e 20 20 54 68  undary case.  Th
2a50: 65 20 70 72 65 66 69 78 20 66 6f 72 20 61 20 4c  e prefix for a L
2a60: 49 4b 45 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  IKE comparison i
2a70: 73 20 72 6f 75 6e 64 65 64 20 75 70 0a 23 20 77  s rounded up.# w
2a80: 68 65 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67  hen constructing
2a90: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e   the comparison.
2aa0: 20 20 45 78 61 6d 70 6c 65 3a 20 20 22 61 62 22    Example:  "ab"
2ab0: 20 62 65 63 6f 6d 65 73 20 22 61 63 22 2e 0a 23   becomes "ac"..#
2ac0: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
2ad0: 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 61 63   the last charac
2ae0: 74 65 72 20 69 73 20 69 6e 63 72 65 61 73 65 64  ter is increased
2af0: 20 62 79 20 6f 6e 65 2e 0a 23 0a 23 20 4d 61 6b   by one..#.# Mak
2b00: 65 20 73 75 72 65 20 74 68 69 73 20 68 61 70 70  e sure this happ
2b10: 65 6e 73 20 63 6f 72 72 65 63 74 6c 79 20 77 68  ens correctly wh
2b20: 65 6e 20 74 68 65 20 6c 61 73 74 20 63 68 61 72  en the last char
2b30: 61 63 74 65 72 20 69 73 20 61 20 0a 23 20 22 7a  acter is a .# "z
2b40: 22 20 61 6e 64 20 77 65 20 61 72 65 20 64 6f 69  " and we are doi
2b50: 6e 67 20 63 61 73 65 2d 69 6e 73 65 6e 73 69 74  ng case-insensit
2b60: 69 76 65 20 63 6f 6d 70 61 72 69 73 6f 6e 73 2e  ive comparisons.
2b70: 0a 23 0a 23 20 54 69 63 6b 65 74 20 23 32 39 35  .#.# Ticket #295
2b80: 39 0a 23 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65  9.#.do_test like
2b90: 2d 35 2e 32 31 20 7b 0a 20 20 65 78 65 63 73 71  -5.21 {.  execsq
2ba0: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63  l {.    PRAGMA c
2bb0: 61 73 65 5f 73 65 6e 73 69 74 69 76 65 5f 6c 69  ase_sensitive_li
2bc0: 6b 65 3d 6f 66 66 3b 0a 20 20 20 20 49 4e 53 45  ke=off;.    INSE
2bd0: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
2be0: 53 28 27 5a 5a 2d 75 70 70 65 72 2d 75 70 70 65  S('ZZ-upper-uppe
2bf0: 72 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  r');.    INSERT 
2c00: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27  INTO t2 VALUES('
2c10: 7a 5a 2d 6c 6f 77 65 72 2d 75 70 70 65 72 27 29  zZ-lower-upper')
2c20: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
2c30: 4f 20 74 32 20 56 41 4c 55 45 53 28 27 5a 7a 2d  O t2 VALUES('Zz-
2c40: 75 70 70 65 72 2d 6c 6f 77 65 72 27 29 3b 0a 20  upper-lower');. 
2c50: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2c60: 32 20 56 41 4c 55 45 53 28 27 7a 7a 2d 6c 6f 77  2 VALUES('zz-low
2c70: 65 72 2d 6c 6f 77 65 72 27 29 3b 0a 20 20 7d 0a  er-lower');.  }.
2c80: 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20    queryplan {.  
2c90: 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20    SELECT x FROM 
2ca0: 74 32 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20  t2 WHERE x LIKE 
2cb0: 27 7a 7a 25 27 3b 0a 20 20 7d 0a 7d 20 7b 7a 7a  'zz%';.  }.} {zz
2cc0: 2d 6c 6f 77 65 72 2d 6c 6f 77 65 72 20 7a 5a 2d  -lower-lower zZ-
2cd0: 6c 6f 77 65 72 2d 75 70 70 65 72 20 5a 7a 2d 75  lower-upper Zz-u
2ce0: 70 70 65 72 2d 6c 6f 77 65 72 20 5a 5a 2d 75 70  pper-lower ZZ-up
2cf0: 70 65 72 2d 75 70 70 65 72 20 6e 6f 73 6f 72 74  per-upper nosort
2d00: 20 7b 7d 20 69 32 7d 0a 64 6f 5f 74 65 73 74 20   {} i2}.do_test 
2d10: 6c 69 6b 65 2d 35 2e 32 32 20 7b 0a 20 20 71 75  like-5.22 {.  qu
2d20: 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45  eryplan {.    SE
2d30: 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 32 20 57  LECT x FROM t2 W
2d40: 48 45 52 45 20 78 20 4c 49 4b 45 20 27 7a 5a 25  HERE x LIKE 'zZ%
2d50: 27 3b 0a 20 20 7d 0a 7d 20 7b 7a 7a 2d 6c 6f 77  ';.  }.} {zz-low
2d60: 65 72 2d 6c 6f 77 65 72 20 7a 5a 2d 6c 6f 77 65  er-lower zZ-lowe
2d70: 72 2d 75 70 70 65 72 20 5a 7a 2d 75 70 70 65 72  r-upper Zz-upper
2d80: 2d 6c 6f 77 65 72 20 5a 5a 2d 75 70 70 65 72 2d  -lower ZZ-upper-
2d90: 75 70 70 65 72 20 6e 6f 73 6f 72 74 20 7b 7d 20  upper nosort {} 
2da0: 69 32 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65  i2}.do_test like
2db0: 2d 35 2e 32 33 20 7b 0a 20 20 71 75 65 72 79 70  -5.23 {.  queryp
2dc0: 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  lan {.    SELECT
2dd0: 20 78 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45   x FROM t2 WHERE
2de0: 20 78 20 4c 49 4b 45 20 27 5a 7a 25 27 3b 0a 20   x LIKE 'Zz%';. 
2df0: 20 7d 0a 7d 20 7b 7a 7a 2d 6c 6f 77 65 72 2d 6c   }.} {zz-lower-l
2e00: 6f 77 65 72 20 7a 5a 2d 6c 6f 77 65 72 2d 75 70  ower zZ-lower-up
2e10: 70 65 72 20 5a 7a 2d 75 70 70 65 72 2d 6c 6f 77  per Zz-upper-low
2e20: 65 72 20 5a 5a 2d 75 70 70 65 72 2d 75 70 70 65  er ZZ-upper-uppe
2e30: 72 20 6e 6f 73 6f 72 74 20 7b 7d 20 69 32 7d 0a  r nosort {} i2}.
2e40: 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 35 2e 32  do_test like-5.2
2e50: 34 20 7b 0a 20 20 71 75 65 72 79 70 6c 61 6e 20  4 {.  queryplan 
2e60: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 78 20 46  {.    SELECT x F
2e70: 52 4f 4d 20 74 32 20 57 48 45 52 45 20 78 20 4c  ROM t2 WHERE x L
2e80: 49 4b 45 20 27 5a 5a 25 27 3b 0a 20 20 7d 0a 7d  IKE 'ZZ%';.  }.}
2e90: 20 7b 7a 7a 2d 6c 6f 77 65 72 2d 6c 6f 77 65 72   {zz-lower-lower
2ea0: 20 7a 5a 2d 6c 6f 77 65 72 2d 75 70 70 65 72 20   zZ-lower-upper 
2eb0: 5a 7a 2d 75 70 70 65 72 2d 6c 6f 77 65 72 20 5a  Zz-upper-lower Z
2ec0: 5a 2d 75 70 70 65 72 2d 75 70 70 65 72 20 6e 6f  Z-upper-upper no
2ed0: 73 6f 72 74 20 7b 7d 20 69 32 7d 0a 64 6f 5f 74  sort {} i2}.do_t
2ee0: 65 73 74 20 6c 69 6b 65 2d 35 2e 32 35 20 7b 0a  est like-5.25 {.
2ef0: 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20    queryplan {.  
2f00: 20 20 50 52 41 47 4d 41 20 63 61 73 65 5f 73 65    PRAGMA case_se
2f10: 6e 73 69 74 69 76 65 5f 6c 69 6b 65 3d 6f 6e 3b  nsitive_like=on;
2f20: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
2f30: 45 20 74 33 28 78 20 54 45 58 54 29 3b 0a 20 20  E t3(x TEXT);.  
2f40: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
2f50: 33 20 4f 4e 20 74 33 28 78 29 3b 0a 20 20 20 20  3 ON t3(x);.    
2f60: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56  INSERT INTO t3 V
2f70: 41 4c 55 45 53 28 27 5a 5a 2d 75 70 70 65 72 2d  ALUES('ZZ-upper-
2f80: 75 70 70 65 72 27 29 3b 0a 20 20 20 20 49 4e 53  upper');.    INS
2f90: 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55  ERT INTO t3 VALU
2fa0: 45 53 28 27 7a 5a 2d 6c 6f 77 65 72 2d 75 70 70  ES('zZ-lower-upp
2fb0: 65 72 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  er');.    INSERT
2fc0: 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28   INTO t3 VALUES(
2fd0: 27 5a 7a 2d 75 70 70 65 72 2d 6c 6f 77 65 72 27  'Zz-upper-lower'
2fe0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
2ff0: 54 4f 20 74 33 20 56 41 4c 55 45 53 28 27 7a 7a  TO t3 VALUES('zz
3000: 2d 6c 6f 77 65 72 2d 6c 6f 77 65 72 27 29 3b 0a  -lower-lower');.
3010: 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f      SELECT x FRO
3020: 4d 20 74 33 20 57 48 45 52 45 20 78 20 4c 49 4b  M t3 WHERE x LIK
3030: 45 20 27 7a 7a 25 27 3b 0a 20 20 7d 0a 7d 20 7b  E 'zz%';.  }.} {
3040: 7a 7a 2d 6c 6f 77 65 72 2d 6c 6f 77 65 72 20 6e  zz-lower-lower n
3050: 6f 73 6f 72 74 20 7b 7d 20 69 33 7d 0a 64 6f 5f  osort {} i3}.do_
3060: 74 65 73 74 20 6c 69 6b 65 2d 35 2e 32 36 20 7b  test like-5.26 {
3070: 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20  .  queryplan {. 
3080: 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d     SELECT x FROM
3090: 20 74 33 20 57 48 45 52 45 20 78 20 4c 49 4b 45   t3 WHERE x LIKE
30a0: 20 27 7a 5a 25 27 3b 0a 20 20 7d 0a 7d 20 7b 7a   'zZ%';.  }.} {z
30b0: 5a 2d 6c 6f 77 65 72 2d 75 70 70 65 72 20 6e 6f  Z-lower-upper no
30c0: 73 6f 72 74 20 7b 7d 20 69 33 7d 0a 64 6f 5f 74  sort {} i3}.do_t
30d0: 65 73 74 20 6c 69 6b 65 2d 35 2e 32 37 20 7b 0a  est like-5.27 {.
30e0: 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20    queryplan {.  
30f0: 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20    SELECT x FROM 
3100: 74 33 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20  t3 WHERE x LIKE 
3110: 27 5a 7a 25 27 3b 0a 20 20 7d 0a 7d 20 7b 5a 7a  'Zz%';.  }.} {Zz
3120: 2d 75 70 70 65 72 2d 6c 6f 77 65 72 20 6e 6f 73  -upper-lower nos
3130: 6f 72 74 20 7b 7d 20 69 33 7d 0a 64 6f 5f 74 65  ort {} i3}.do_te
3140: 73 74 20 6c 69 6b 65 2d 35 2e 32 38 20 7b 0a 20  st like-5.28 {. 
3150: 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20   queryplan {.   
3160: 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74   SELECT x FROM t
3170: 33 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27  3 WHERE x LIKE '
3180: 5a 5a 25 27 3b 0a 20 20 7d 0a 7d 20 7b 5a 5a 2d  ZZ%';.  }.} {ZZ-
3190: 75 70 70 65 72 2d 75 70 70 65 72 20 6e 6f 73 6f  upper-upper noso
31a0: 72 74 20 7b 7d 20 69 33 7d 0a 0a 0a 23 20 74 69  rt {} i3}...# ti
31b0: 63 6b 65 74 20 23 32 34 30 37 0a 23 0a 23 20 4d  cket #2407.#.# M
31c0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 4c 49 4b  ake sure the LIK
31d0: 45 20 70 72 65 66 69 78 20 6f 70 74 69 6d 69 7a  E prefix optimiz
31e0: 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 73  ation does not s
31f0: 74 72 69 70 20 6f 66 66 20 6c 65 61 64 69 6e 67  trip off leading
3200: 0a 23 20 63 68 61 72 61 63 74 65 72 73 20 6f 66  .# characters of
3210: 20 74 68 65 20 6c 69 6b 65 20 70 61 74 74 65 72   the like patter
3220: 6e 20 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f  n that happen to
3230: 20 62 65 20 71 75 6f 74 65 20 63 68 61 72 61 63   be quote charac
3240: 74 65 72 73 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  ters..#.do_test 
3250: 6c 69 6b 65 2d 36 2e 31 20 7b 0a 20 20 66 6f 72  like-6.1 {.  for
3260: 65 61 63 68 20 78 20 7b 20 27 61 62 63 20 27 62  each x { 'abc 'b
3270: 63 64 20 27 64 65 66 20 27 61 78 20 7d 20 7b 0a  cd 'def 'ax } {.
3280: 20 20 20 20 73 65 74 20 78 32 20 27 5b 73 74 72      set x2 '[str
3290: 69 6e 67 20 6d 61 70 20 7b 27 20 27 27 7d 20 24  ing map {' ''} $
32a0: 78 5d 27 0a 20 20 20 20 64 62 20 65 76 61 6c 20  x]'.    db eval 
32b0: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20  "INSERT INTO t2 
32c0: 56 41 4c 55 45 53 28 24 78 32 29 22 0a 20 20 7d  VALUES($x2)".  }
32d0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
32e0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
32f0: 32 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27  2 WHERE x LIKE '
3300: 27 27 61 25 27 0a 20 20 7d 0a 7d 20 7b 27 61 62  ''a%'.  }.} {'ab
3310: 63 20 27 61 78 7d 0a 0a 64 6f 5f 74 65 73 74 20  c 'ax}..do_test 
3320: 6c 69 6b 65 2d 37 2e 31 20 7b 0a 20 20 65 78 65  like-7.1 {.  exe
3330: 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43  csql {.    SELEC
3340: 54 20 72 6f 77 69 64 2c 20 2a 20 46 52 4f 4d 20  T rowid, * FROM 
3350: 74 31 20 57 48 45 52 45 20 72 6f 77 69 64 20 47  t1 WHERE rowid G
3360: 4c 4f 42 20 27 31 2a 27 20 4f 52 44 45 52 20 42  LOB '1*' ORDER B
3370: 59 20 72 6f 77 69 64 3b 0a 20 20 7d 0a 7d 20 7b  Y rowid;.  }.} {
3380: 31 20 61 20 31 30 20 41 42 43 20 31 31 20 43 44  1 a 10 ABC 11 CD
3390: 45 20 31 32 20 7b 41 42 43 20 61 62 63 20 78 79  E 12 {ABC abc xy
33a0: 7a 7d 7d 0a 0a 23 20 74 69 63 6b 65 74 20 23 33  z}}..# ticket #3
33b0: 33 34 35 2e 0a 23 0a 23 20 4f 76 65 72 6c 6f 61  345..#.# Overloa
33c0: 64 69 6e 67 20 74 68 65 20 4c 49 4b 45 20 66 75  ding the LIKE fu
33d0: 6e 63 74 69 6f 6e 20 77 69 74 68 20 2d 31 20 66  nction with -1 f
33e0: 6f 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  or the number of
33f0: 20 61 72 67 75 6d 65 6e 74 73 0a 23 20 77 69 6c   arguments.# wil
3400: 6c 20 6f 76 65 72 6c 6f 61 64 20 62 6f 74 68 20  l overload both 
3410: 74 68 65 20 32 2d 61 72 67 75 6d 65 6e 74 20 61  the 2-argument a
3420: 6e 64 20 74 68 65 20 33 2d 61 72 67 75 6d 65 6e  nd the 3-argumen
3430: 74 20 4c 49 4b 45 2e 0a 23 0a 64 6f 5f 74 65 73  t LIKE..#.do_tes
3440: 74 20 6c 69 6b 65 2d 38 2e 31 20 7b 0a 20 20 64  t like-8.1 {.  d
3450: 62 20 65 76 61 6c 20 7b 0a 20 20 20 20 43 52 45  b eval {.    CRE
3460: 41 54 45 20 54 41 42 4c 45 20 74 38 28 78 29 3b  ATE TABLE t8(x);
3470: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
3480: 20 74 38 20 56 41 4c 55 45 53 28 27 61 62 63 64   t8 VALUES('abcd
3490: 65 66 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  ef');.    INSERT
34a0: 20 49 4e 54 4f 20 74 38 20 56 41 4c 55 45 53 28   INTO t8 VALUES(
34b0: 27 67 68 69 6a 6b 6c 27 29 3b 0a 20 20 20 20 49  'ghijkl');.    I
34c0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 38 20 56 41  NSERT INTO t8 VA
34d0: 4c 55 45 53 28 27 6d 6e 6f 70 71 72 27 29 3b 0a  LUES('mnopqr');.
34e0: 20 20 20 20 53 45 4c 45 43 54 20 31 2c 20 78 20      SELECT 1, x 
34f0: 46 52 4f 4d 20 74 38 20 57 48 45 52 45 20 78 20  FROM t8 WHERE x 
3500: 4c 49 4b 45 20 27 25 68 25 27 3b 0a 20 20 20 20  LIKE '%h%';.    
3510: 53 45 4c 45 43 54 20 32 2c 20 78 20 46 52 4f 4d  SELECT 2, x FROM
3520: 20 74 38 20 57 48 45 52 45 20 78 20 4c 49 4b 45   t8 WHERE x LIKE
3530: 20 27 25 68 25 27 20 45 53 43 41 50 45 20 27 78   '%h%' ESCAPE 'x
3540: 27 3b 0a 20 20 7d 0a 7d 20 7b 31 20 67 68 69 6a  ';.  }.} {1 ghij
3550: 6b 6c 20 32 20 67 68 69 6a 6b 6c 7d 0a 64 6f 5f  kl 2 ghijkl}.do_
3560: 74 65 73 74 20 6c 69 6b 65 2d 38 2e 32 20 7b 0a  test like-8.2 {.
3570: 20 20 70 72 6f 63 20 6e 65 77 6c 69 6b 65 20 7b    proc newlike {
3580: 61 72 67 73 7d 20 7b 72 65 74 75 72 6e 20 31 7d  args} {return 1}
3590: 20 3b 23 20 41 6c 74 65 72 6e 61 74 69 76 65 20   ;# Alternative 
35a0: 4c 49 4b 45 20 69 73 20 61 6c 77 61 79 73 20 72  LIKE is always r
35b0: 65 74 75 72 6e 20 54 52 55 45 0a 20 20 64 62 20  eturn TRUE.  db 
35c0: 66 75 6e 63 74 69 6f 6e 20 6c 69 6b 65 20 6e 65  function like ne
35d0: 77 6c 69 6b 65 20 20 20 20 20 20 20 3b 23 20 55  wlike       ;# U
35e0: 73 65 73 20 2d 31 20 66 6f 72 20 6e 41 72 67 20  ses -1 for nArg 
35f0: 69 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  in sqlite3_creat
3600: 65 5f 66 75 6e 63 74 69 6f 6e 0a 20 20 64 62 20  e_function.  db 
3610: 63 61 63 68 65 20 66 6c 75 73 68 0a 20 20 64 62  cache flush.  db
3620: 20 65 76 61 6c 20 7b 0a 20 20 20 20 53 45 4c 45   eval {.    SELE
3630: 43 54 20 31 2c 20 78 20 46 52 4f 4d 20 74 38 20  CT 1, x FROM t8 
3640: 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27 25 68  WHERE x LIKE '%h
3650: 25 27 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 32  %';.    SELECT 2
3660: 2c 20 78 20 46 52 4f 4d 20 74 38 20 57 48 45 52  , x FROM t8 WHER
3670: 45 20 78 20 4c 49 4b 45 20 27 25 68 25 27 20 45  E x LIKE '%h%' E
3680: 53 43 41 50 45 20 27 78 27 3b 0a 20 20 7d 0a 7d  SCAPE 'x';.  }.}
3690: 20 7b 31 20 67 68 69 6a 6b 6c 20 32 20 67 68 69   {1 ghijkl 2 ghi
36a0: 6a 6b 6c 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b  jkl}.do_test lik
36b0: 65 2d 38 2e 33 20 7b 0a 20 20 64 62 20 66 75 6e  e-8.3 {.  db fun
36c0: 63 74 69 6f 6e 20 6c 69 6b 65 20 2d 61 72 67 63  ction like -argc
36d0: 6f 75 6e 74 20 32 20 6e 65 77 6c 69 6b 65 0a 20  ount 2 newlike. 
36e0: 20 64 62 20 65 76 61 6c 20 7b 0a 20 20 20 20 53   db eval {.    S
36f0: 45 4c 45 43 54 20 31 2c 20 78 20 46 52 4f 4d 20  ELECT 1, x FROM 
3700: 74 38 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20  t8 WHERE x LIKE 
3710: 27 25 68 25 27 3b 0a 20 20 20 20 53 45 4c 45 43  '%h%';.    SELEC
3720: 54 20 32 2c 20 78 20 46 52 4f 4d 20 74 38 20 57  T 2, x FROM t8 W
3730: 48 45 52 45 20 78 20 4c 49 4b 45 20 27 25 68 25  HERE x LIKE '%h%
3740: 27 20 45 53 43 41 50 45 20 27 78 27 3b 0a 20 20  ' ESCAPE 'x';.  
3750: 7d 0a 7d 20 7b 31 20 61 62 63 64 65 66 20 31 20  }.} {1 abcdef 1 
3760: 67 68 69 6a 6b 6c 20 31 20 6d 6e 6f 70 71 72 20  ghijkl 1 mnopqr 
3770: 32 20 67 68 69 6a 6b 6c 7d 0a 64 6f 5f 74 65 73  2 ghijkl}.do_tes
3780: 74 20 6c 69 6b 65 2d 38 2e 34 20 7b 0a 20 20 64  t like-8.4 {.  d
3790: 62 20 66 75 6e 63 74 69 6f 6e 20 6c 69 6b 65 20  b function like 
37a0: 2d 61 72 67 63 6f 75 6e 74 20 33 20 6e 65 77 6c  -argcount 3 newl
37b0: 69 6b 65 0a 20 20 64 62 20 65 76 61 6c 20 7b 0a  ike.  db eval {.
37c0: 20 20 20 20 53 45 4c 45 43 54 20 31 2c 20 78 20      SELECT 1, x 
37d0: 46 52 4f 4d 20 74 38 20 57 48 45 52 45 20 78 20  FROM t8 WHERE x 
37e0: 4c 49 4b 45 20 27 25 68 25 27 3b 0a 20 20 20 20  LIKE '%h%';.    
37f0: 53 45 4c 45 43 54 20 32 2c 20 78 20 46 52 4f 4d  SELECT 2, x FROM
3800: 20 74 38 20 57 48 45 52 45 20 78 20 4c 49 4b 45   t8 WHERE x LIKE
3810: 20 27 25 68 25 27 20 45 53 43 41 50 45 20 27 78   '%h%' ESCAPE 'x
3820: 27 3b 0a 20 20 7d 0a 7d 20 7b 31 20 61 62 63 64  ';.  }.} {1 abcd
3830: 65 66 20 31 20 67 68 69 6a 6b 6c 20 31 20 6d 6e  ef 1 ghijkl 1 mn
3840: 6f 70 71 72 20 32 20 61 62 63 64 65 66 20 32 20  opqr 2 abcdef 2 
3850: 67 68 69 6a 6b 6c 20 32 20 6d 6e 6f 70 71 72 7d  ghijkl 2 mnopqr}
3860: 0a 0a 0a 69 66 63 61 70 61 62 6c 65 20 6c 69 6b  ...ifcapable lik
3870: 65 5f 6f 70 74 26 26 21 69 63 75 20 7b 0a 20 20  e_opt&&!icu {.  
3880: 23 20 45 76 61 6c 75 61 74 65 20 53 51 4c 2e 20  # Evaluate SQL. 
3890: 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
38a0: 6c 74 20 73 65 74 20 66 6f 6c 6c 6f 77 65 64 20  lt set followed 
38b0: 62 79 20 74 68 65 0a 20 20 23 20 61 6e 64 20 74  by the.  # and t
38c0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c  he number of ful
38d0: 6c 2d 73 63 61 6e 20 73 74 65 70 73 2e 0a 20 20  l-scan steps..  
38e0: 23 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 73  #.  db close.  s
38f0: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
3900: 62 0a 20 20 70 72 6f 63 20 63 6f 75 6e 74 5f 73  b.  proc count_s
3910: 74 65 70 73 20 7b 73 71 6c 7d 20 7b 0a 20 20 20  teps {sql} {.   
3920: 20 73 65 74 20 72 20 5b 64 62 20 65 76 61 6c 20   set r [db eval 
3930: 24 73 71 6c 5d 0a 20 20 20 20 6c 61 70 70 65 6e  $sql].    lappen
3940: 64 20 72 20 73 63 61 6e 20 5b 64 62 20 73 74 61  d r scan [db sta
3950: 74 75 73 20 73 74 65 70 5d 20 73 6f 72 74 20 5b  tus step] sort [
3960: 64 62 20 73 74 61 74 75 73 20 73 6f 72 74 5d 0a  db status sort].
3970: 20 20 7d 0a 20 20 64 6f 5f 74 65 73 74 20 6c 69    }.  do_test li
3980: 6b 65 2d 39 2e 31 20 7b 0a 20 20 20 20 63 6f 75  ke-9.1 {.    cou
3990: 6e 74 5f 73 74 65 70 73 20 7b 0a 20 20 20 20 20  nt_steps {.     
39a0: 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20    SELECT x FROM 
39b0: 74 32 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20  t2 WHERE x LIKE 
39c0: 27 78 25 27 0a 20 20 20 20 7d 0a 20 20 7d 20 7b  'x%'.    }.  } {
39d0: 78 79 7a 20 73 63 61 6e 20 30 20 73 6f 72 74 20  xyz scan 0 sort 
39e0: 30 7d 0a 20 20 64 6f 5f 74 65 73 74 20 6c 69 6b  0}.  do_test lik
39f0: 65 2d 39 2e 32 20 7b 0a 20 20 20 20 63 6f 75 6e  e-9.2 {.    coun
3a00: 74 5f 73 74 65 70 73 20 7b 0a 20 20 20 20 20 20  t_steps {.      
3a10: 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74   SELECT x FROM t
3a20: 32 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27  2 WHERE x LIKE '
3a30: 5f 79 25 27 0a 20 20 20 20 7d 0a 20 20 7d 20 7b  _y%'.    }.  } {
3a40: 78 79 7a 20 73 63 61 6e 20 31 39 20 73 6f 72 74  xyz scan 19 sort
3a50: 20 30 7d 0a 20 20 64 6f 5f 74 65 73 74 20 6c 69   0}.  do_test li
3a60: 6b 65 2d 39 2e 33 2e 31 20 7b 0a 20 20 20 20 73  ke-9.3.1 {.    s
3a70: 65 74 20 72 65 73 20 5b 73 71 6c 69 74 65 33 5f  et res [sqlite3_
3a80: 65 78 65 63 5f 68 65 78 20 64 62 20 7b 0a 20 20  exec_hex db {.  
3a90: 20 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52       SELECT x FR
3aa0: 4f 4d 20 74 32 20 57 48 45 52 45 20 78 20 4c 49  OM t2 WHERE x LI
3ab0: 4b 45 20 27 25 37 38 25 32 35 27 0a 20 20 20 20  KE '%78%25'.    
3ac0: 7d 5d 0a 20 20 7d 20 7b 30 20 7b 78 20 78 79 7a  }].  } {0 {x xyz
3ad0: 7d 7d 0a 20 20 69 66 63 61 70 61 62 6c 65 20 65  }}.  ifcapable e
3ae0: 78 70 6c 61 69 6e 20 7b 0a 20 20 20 20 64 6f 5f  xplain {.    do_
3af0: 74 65 73 74 20 6c 69 6b 65 2d 39 2e 33 2e 32 20  test like-9.3.2 
3b00: 7b 0a 20 20 20 20 20 20 73 65 74 20 72 65 73 20  {.      set res 
3b10: 5b 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 68 65  [sqlite3_exec_he
3b20: 78 20 64 62 20 7b 0a 20 20 20 20 20 20 20 20 20  x db {.         
3b30: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
3b40: 41 4e 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d  AN SELECT x FROM
3b50: 20 74 32 20 57 48 45 52 45 20 78 20 4c 49 4b 45   t2 WHERE x LIKE
3b60: 20 27 25 37 38 25 32 35 27 0a 20 20 20 20 20 20   '%78%25'.      
3b70: 7d 5d 0a 20 20 20 20 20 20 72 65 67 65 78 70 20  }].      regexp 
3b80: 7b 49 4e 44 45 58 20 69 32 7d 20 24 72 65 73 0a  {INDEX i2} $res.
3b90: 20 20 20 20 7d 20 7b 31 7d 0a 20 20 7d 0a 20 20      } {1}.  }.  
3ba0: 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 39 2e 34  do_test like-9.4
3bb0: 2e 31 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  .1 {.    sqlite3
3bc0: 5f 65 78 65 63 5f 68 65 78 20 64 62 20 7b 49 4e  _exec_hex db {IN
3bd0: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
3be0: 55 45 53 28 27 25 66 66 68 65 6c 6c 6f 27 29 7d  UES('%ffhello')}
3bf0: 0a 20 20 20 20 73 65 74 20 72 65 73 20 5b 73 71  .    set res [sq
3c00: 6c 69 74 65 33 5f 65 78 65 63 5f 68 65 78 20 64  lite3_exec_hex d
3c10: 62 20 7b 0a 20 20 20 20 20 20 20 53 45 4c 45 43  b {.       SELEC
3c20: 54 20 73 75 62 73 74 72 28 78 2c 32 29 20 41 53  T substr(x,2) AS
3c30: 20 78 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45   x FROM t2 WHERE
3c40: 20 2b 78 20 4c 49 4b 45 20 27 25 66 66 25 32 35   +x LIKE '%ff%25
3c50: 27 0a 20 20 20 20 7d 5d 0a 20 20 7d 20 7b 30 20  '.    }].  } {0 
3c60: 7b 78 20 68 65 6c 6c 6f 7d 7d 0a 20 20 64 6f 5f  {x hello}}.  do_
3c70: 74 65 73 74 20 6c 69 6b 65 2d 39 2e 34 2e 32 20  test like-9.4.2 
3c80: 7b 0a 20 20 20 20 73 65 74 20 72 65 73 20 5b 73  {.    set res [s
3c90: 71 6c 69 74 65 33 5f 65 78 65 63 5f 68 65 78 20  qlite3_exec_hex 
3ca0: 64 62 20 7b 0a 20 20 20 20 20 20 20 53 45 4c 45  db {.       SELE
3cb0: 43 54 20 73 75 62 73 74 72 28 78 2c 32 29 20 41  CT substr(x,2) A
3cc0: 53 20 78 20 46 52 4f 4d 20 74 32 20 57 48 45 52  S x FROM t2 WHER
3cd0: 45 20 78 20 4c 49 4b 45 20 27 25 66 66 25 32 35  E x LIKE '%ff%25
3ce0: 27 0a 20 20 20 20 7d 5d 0a 20 20 7d 20 7b 30 20  '.    }].  } {0 
3cf0: 7b 78 20 68 65 6c 6c 6f 7d 7d 0a 20 20 69 66 63  {x hello}}.  ifc
3d00: 61 70 61 62 6c 65 20 65 78 70 6c 61 69 6e 20 7b  apable explain {
3d10: 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 6c 69 6b  .    do_test lik
3d20: 65 2d 39 2e 34 2e 33 20 7b 0a 20 20 20 20 20 20  e-9.4.3 {.      
3d30: 73 65 74 20 72 65 73 20 5b 73 71 6c 69 74 65 33  set res [sqlite3
3d40: 5f 65 78 65 63 5f 68 65 78 20 64 62 20 7b 0a 20  _exec_hex db {. 
3d50: 20 20 20 20 20 20 20 20 45 58 50 4c 41 49 4e 20          EXPLAIN 
3d60: 51 55 45 52 59 20 50 4c 41 4e 20 53 45 4c 45 43  QUERY PLAN SELEC
3d70: 54 20 78 20 46 52 4f 4d 20 74 32 20 57 48 45 52  T x FROM t2 WHER
3d80: 45 20 78 20 4c 49 4b 45 20 27 25 66 66 25 32 35  E x LIKE '%ff%25
3d90: 27 0a 20 20 20 20 20 20 7d 5d 0a 20 20 20 20 20  '.      }].     
3da0: 20 72 65 67 65 78 70 20 7b 49 4e 44 45 58 20 69   regexp {INDEX i
3db0: 32 7d 20 24 72 65 73 0a 20 20 20 20 7d 20 7b 30  2} $res.    } {0
3dc0: 7d 0a 20 20 7d 0a 20 20 64 6f 5f 74 65 73 74 20  }.  }.  do_test 
3dd0: 6c 69 6b 65 2d 39 2e 35 2e 31 20 7b 0a 20 20 20  like-9.5.1 {.   
3de0: 20 73 65 74 20 72 65 73 20 5b 73 71 6c 69 74 65   set res [sqlite
3df0: 33 5f 65 78 65 63 5f 68 65 78 20 64 62 20 7b 0a  3_exec_hex db {.
3e00: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 78 20         SELECT x 
3e10: 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 78 20  FROM t2 WHERE x 
3e20: 4c 49 4b 45 20 27 25 66 65 25 32 35 27 0a 20 20  LIKE '%fe%25'.  
3e30: 20 20 7d 5d 0a 20 20 7d 20 7b 30 20 7b 7d 7d 0a    }].  } {0 {}}.
3e40: 20 20 69 66 63 61 70 61 62 6c 65 20 65 78 70 6c    ifcapable expl
3e50: 61 69 6e 20 7b 0a 20 20 20 20 64 6f 5f 74 65 73  ain {.    do_tes
3e60: 74 20 6c 69 6b 65 2d 39 2e 35 2e 32 20 7b 0a 20  t like-9.5.2 {. 
3e70: 20 20 20 20 20 73 65 74 20 72 65 73 20 5b 73 71       set res [sq
3e80: 6c 69 74 65 33 5f 65 78 65 63 5f 68 65 78 20 64  lite3_exec_hex d
3e90: 62 20 7b 0a 20 20 20 20 20 20 20 20 20 45 58 50  b {.         EXP
3ea0: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
3eb0: 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 32  SELECT x FROM t2
3ec0: 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27 25   WHERE x LIKE '%
3ed0: 66 65 25 32 35 27 0a 20 20 20 20 20 20 7d 5d 0a  fe%25'.      }].
3ee0: 20 20 20 20 20 20 72 65 67 65 78 70 20 7b 49 4e        regexp {IN
3ef0: 44 45 58 20 69 32 7d 20 24 72 65 73 0a 20 20 20  DEX i2} $res.   
3f00: 20 7d 20 7b 31 7d 0a 20 20 7d 0a 0a 20 20 23 20   } {1}.  }..  # 
3f10: 44 6f 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d  Do an SQL statem
3f20: 65 6e 74 2e 20 20 41 70 70 65 6e 64 20 74 68 65  ent.  Append the
3f30: 20 73 65 61 72 63 68 20 63 6f 75 6e 74 20 74 6f   search count to
3f40: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
3f50: 72 65 73 75 6c 74 2e 0a 20 20 23 0a 20 20 70 72  result..  #.  pr
3f60: 6f 63 20 63 6f 75 6e 74 20 73 71 6c 20 7b 0a 20  oc count sql {. 
3f70: 20 20 20 73 65 74 20 3a 3a 73 71 6c 69 74 65 5f     set ::sqlite_
3f80: 73 65 61 72 63 68 5f 63 6f 75 6e 74 20 30 0a 20  search_count 0. 
3f90: 20 20 20 73 65 74 20 3a 3a 73 71 6c 69 74 65 5f     set ::sqlite_
3fa0: 6c 69 6b 65 5f 63 6f 75 6e 74 20 30 0a 20 20 20  like_count 0.   
3fb0: 20 72 65 74 75 72 6e 20 5b 63 6f 6e 63 61 74 20   return [concat 
3fc0: 5b 65 78 65 63 73 71 6c 20 24 73 71 6c 5d 20 73  [execsql $sql] s
3fd0: 63 61 6e 20 24 3a 3a 73 71 6c 69 74 65 5f 73 65  can $::sqlite_se
3fe0: 61 72 63 68 5f 63 6f 75 6e 74 20 5c 0a 20 20 20  arch_count \.   
3ff0: 20 20 20 20 20 20 20 20 20 20 6c 69 6b 65 20 24            like $
4000: 3a 3a 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f  ::sqlite_like_co
4010: 75 6e 74 5d 0a 20 20 7d 0a 0a 20 20 23 20 54 68  unt].  }..  # Th
4020: 65 20 4c 49 4b 45 20 61 6e 64 20 47 4c 4f 42 20  e LIKE and GLOB 
4030: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 64 6f  optimizations do
4040: 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 63 6f 6c   not work on col
4050: 75 6d 6e 73 20 77 69 74 68 0a 20 20 23 20 61 66  umns with.  # af
4060: 66 69 6e 69 74 79 20 6f 74 68 65 72 20 74 68 61  finity other tha
4070: 6e 20 54 45 58 54 2e 0a 20 20 23 20 54 69 63 6b  n TEXT..  # Tick
4080: 65 74 20 23 33 39 30 31 0a 20 20 23 0a 20 20 64  et #3901.  #.  d
4090: 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 31 30 2e 31  o_test like-10.1
40a0: 20 7b 0a 20 20 20 20 64 62 20 63 6c 6f 73 65 0a   {.    db close.
40b0: 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 20 74      sqlite3 db t
40c0: 65 73 74 2e 64 62 0a 20 20 20 20 65 78 65 63 73  est.db.    execs
40d0: 71 6c 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54  ql {.      CREAT
40e0: 45 20 54 41 42 4c 45 20 74 31 30 28 0a 20 20 20  E TABLE t10(.   
40f0: 20 20 20 20 20 61 20 49 4e 54 45 47 45 52 20 50       a INTEGER P
4100: 52 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 20  RIMARY KEY,.    
4110: 20 20 20 20 62 20 49 4e 54 45 47 45 52 20 43 4f      b INTEGER CO
4120: 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 55 4e 49  LLATE nocase UNI
4130: 51 55 45 2c 0a 20 20 20 20 20 20 20 20 63 20 4e  QUE,.        c N
4140: 55 4d 42 45 52 20 43 4f 4c 4c 41 54 45 20 6e 6f  UMBER COLLATE no
4150: 63 61 73 65 20 55 4e 49 51 55 45 2c 0a 20 20 20  case UNIQUE,.   
4160: 20 20 20 20 20 64 20 42 4c 4f 42 20 43 4f 4c 4c       d BLOB COLL
4170: 41 54 45 20 6e 6f 63 61 73 65 20 55 4e 49 51 55  ATE nocase UNIQU
4180: 45 2c 0a 20 20 20 20 20 20 20 20 65 20 43 4f 4c  E,.        e COL
4190: 4c 41 54 45 20 6e 6f 63 61 73 65 20 55 4e 49 51  LATE nocase UNIQ
41a0: 55 45 2c 0a 20 20 20 20 20 20 20 20 66 20 54 45  UE,.        f TE
41b0: 58 54 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73  XT COLLATE nocas
41c0: 65 20 55 4e 49 51 55 45 0a 20 20 20 20 20 20 29  e UNIQUE.      )
41d0: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
41e0: 4e 54 4f 20 74 31 30 20 56 41 4c 55 45 53 28 31  NTO t10 VALUES(1
41f0: 2c 31 2c 31 2c 31 2c 31 2c 31 29 3b 0a 20 20 20  ,1,1,1,1,1);.   
4200: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
4210: 31 30 20 56 41 4c 55 45 53 28 31 32 2c 31 32 2c  10 VALUES(12,12,
4220: 31 32 2c 31 32 2c 31 32 2c 31 32 29 3b 0a 20 20  12,12,12,12);.  
4230: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
4240: 74 31 30 20 56 41 4c 55 45 53 28 31 32 33 2c 31  t10 VALUES(123,1
4250: 32 33 2c 31 32 33 2c 31 32 33 2c 31 32 33 2c 31  23,123,123,123,1
4260: 32 33 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  23);.      INSER
4270: 54 20 49 4e 54 4f 20 74 31 30 20 56 41 4c 55 45  T INTO t10 VALUE
4280: 53 28 32 33 34 2c 32 33 34 2c 32 33 34 2c 32 33  S(234,234,234,23
4290: 34 2c 32 33 34 2c 32 33 34 29 3b 0a 20 20 20 20  4,234,234);.    
42a0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
42b0: 30 20 56 41 4c 55 45 53 28 33 34 35 2c 33 34 35  0 VALUES(345,345
42c0: 2c 33 34 35 2c 33 34 35 2c 33 34 35 2c 33 34 35  ,345,345,345,345
42d0: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
42e0: 49 4e 54 4f 20 74 31 30 20 56 41 4c 55 45 53 28  INTO t10 VALUES(
42f0: 34 35 2c 34 35 2c 34 35 2c 34 35 2c 34 35 2c 34  45,45,45,45,45,4
4300: 35 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f  5);.    }.    co
4310: 75 6e 74 20 7b 0a 20 20 20 20 20 20 53 45 4c 45  unt {.      SELE
4320: 43 54 20 61 20 46 52 4f 4d 20 74 31 30 20 57 48  CT a FROM t10 WH
4330: 45 52 45 20 62 20 4c 49 4b 45 20 27 31 32 25 27  ERE b LIKE '12%'
4340: 20 4f 52 44 45 52 20 42 59 20 2b 61 3b 0a 20 20   ORDER BY +a;.  
4350: 20 20 7d 0a 20 20 7d 20 7b 31 32 20 31 32 33 20    }.  } {12 123 
4360: 73 63 61 6e 20 35 20 6c 69 6b 65 20 36 7d 0a 20  scan 5 like 6}. 
4370: 20 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 31 30   do_test like-10
4380: 2e 32 20 7b 0a 20 20 20 20 63 6f 75 6e 74 20 7b  .2 {.    count {
4390: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 20  .      SELECT a 
43a0: 46 52 4f 4d 20 74 31 30 20 57 48 45 52 45 20 63  FROM t10 WHERE c
43b0: 20 4c 49 4b 45 20 27 31 32 25 27 20 4f 52 44 45   LIKE '12%' ORDE
43c0: 52 20 42 59 20 2b 61 3b 0a 20 20 20 20 7d 0a 20  R BY +a;.    }. 
43d0: 20 7d 20 7b 31 32 20 31 32 33 20 73 63 61 6e 20   } {12 123 scan 
43e0: 35 20 6c 69 6b 65 20 36 7d 0a 20 20 64 6f 5f 74  5 like 6}.  do_t
43f0: 65 73 74 20 6c 69 6b 65 2d 31 30 2e 33 20 7b 0a  est like-10.3 {.
4400: 20 20 20 20 63 6f 75 6e 74 20 7b 0a 20 20 20 20      count {.    
4410: 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
4420: 74 31 30 20 57 48 45 52 45 20 64 20 4c 49 4b 45  t10 WHERE d LIKE
4430: 20 27 31 32 25 27 20 4f 52 44 45 52 20 42 59 20   '12%' ORDER BY 
4440: 2b 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31  +a;.    }.  } {1
4450: 32 20 31 32 33 20 73 63 61 6e 20 35 20 6c 69 6b  2 123 scan 5 lik
4460: 65 20 36 7d 0a 20 20 64 6f 5f 74 65 73 74 20 6c  e 6}.  do_test l
4470: 69 6b 65 2d 31 30 2e 34 20 7b 0a 20 20 20 20 63  ike-10.4 {.    c
4480: 6f 75 6e 74 20 7b 0a 20 20 20 20 20 20 53 45 4c  ount {.      SEL
4490: 45 43 54 20 61 20 46 52 4f 4d 20 74 31 30 20 57  ECT a FROM t10 W
44a0: 48 45 52 45 20 65 20 4c 49 4b 45 20 27 31 32 25  HERE e LIKE '12%
44b0: 27 20 4f 52 44 45 52 20 42 59 20 2b 61 3b 0a 20  ' ORDER BY +a;. 
44c0: 20 20 20 7d 0a 20 20 7d 20 7b 31 32 20 31 32 33     }.  } {12 123
44d0: 20 73 63 61 6e 20 35 20 6c 69 6b 65 20 36 7d 0a   scan 5 like 6}.
44e0: 20 20 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 31    do_test like-1
44f0: 30 2e 35 20 7b 0a 20 20 20 20 63 6f 75 6e 74 20  0.5 {.    count 
4500: 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 61  {.      SELECT a
4510: 20 46 52 4f 4d 20 74 31 30 20 57 48 45 52 45 20   FROM t10 WHERE 
4520: 66 20 4c 49 4b 45 20 27 31 32 25 27 20 4f 52 44  f LIKE '12%' ORD
4530: 45 52 20 42 59 20 2b 61 3b 0a 20 20 20 20 7d 0a  ER BY +a;.    }.
4540: 20 20 7d 20 7b 31 32 20 31 32 33 20 73 63 61 6e    } {12 123 scan
4550: 20 33 20 6c 69 6b 65 20 30 7d 0a 20 20 64 6f 5f   3 like 0}.  do_
4560: 74 65 73 74 20 6c 69 6b 65 2d 31 30 2e 36 20 7b  test like-10.6 {
4570: 0a 20 20 20 20 63 6f 75 6e 74 20 7b 0a 20 20 20  .    count {.   
4580: 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d     SELECT a FROM
4590: 20 74 31 30 20 57 48 45 52 45 20 61 20 4c 49 4b   t10 WHERE a LIK
45a0: 45 20 27 31 32 25 27 20 4f 52 44 45 52 20 42 59  E '12%' ORDER BY
45b0: 20 2b 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b   +a;.    }.  } {
45c0: 31 32 20 31 32 33 20 73 63 61 6e 20 35 20 6c 69  12 123 scan 5 li
45d0: 6b 65 20 36 7d 0a 20 20 64 6f 5f 74 65 73 74 20  ke 6}.  do_test 
45e0: 6c 69 6b 65 2d 31 30 2e 31 30 20 7b 0a 20 20 20  like-10.10 {.   
45f0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
4600: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
4610: 30 62 28 0a 20 20 20 20 20 20 20 20 61 20 49 4e  0b(.        a IN
4620: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
4630: 59 2c 0a 20 20 20 20 20 20 20 20 62 20 49 4e 54  Y,.        b INT
4640: 45 47 45 52 20 55 4e 49 51 55 45 2c 0a 20 20 20  EGER UNIQUE,.   
4650: 20 20 20 20 20 63 20 4e 55 4d 42 45 52 20 55 4e       c NUMBER UN
4660: 49 51 55 45 2c 0a 20 20 20 20 20 20 20 20 64 20  IQUE,.        d 
4670: 42 4c 4f 42 20 55 4e 49 51 55 45 2c 0a 20 20 20  BLOB UNIQUE,.   
4680: 20 20 20 20 20 65 20 55 4e 49 51 55 45 2c 0a 20       e UNIQUE,. 
4690: 20 20 20 20 20 20 20 66 20 54 45 58 54 20 55 4e         f TEXT UN
46a0: 49 51 55 45 0a 20 20 20 20 20 20 29 3b 0a 20 20  IQUE.      );.  
46b0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
46c0: 74 31 30 62 20 53 45 4c 45 43 54 20 2a 20 46 52  t10b SELECT * FR
46d0: 4f 4d 20 74 31 30 3b 0a 20 20 20 20 7d 0a 20 20  OM t10;.    }.  
46e0: 20 20 63 6f 75 6e 74 20 7b 0a 20 20 20 20 20 20    count {.      
46f0: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
4700: 30 62 20 57 48 45 52 45 20 62 20 47 4c 4f 42 20  0b WHERE b GLOB 
4710: 27 31 32 2a 27 20 4f 52 44 45 52 20 42 59 20 2b  '12*' ORDER BY +
4720: 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 32  a;.    }.  } {12
4730: 20 31 32 33 20 73 63 61 6e 20 35 20 6c 69 6b 65   123 scan 5 like
4740: 20 36 7d 0a 20 20 64 6f 5f 74 65 73 74 20 6c 69   6}.  do_test li
4750: 6b 65 2d 31 30 2e 31 31 20 7b 0a 20 20 20 20 63  ke-10.11 {.    c
4760: 6f 75 6e 74 20 7b 0a 20 20 20 20 20 20 53 45 4c  ount {.      SEL
4770: 45 43 54 20 61 20 46 52 4f 4d 20 74 31 30 62 20  ECT a FROM t10b 
4780: 57 48 45 52 45 20 63 20 47 4c 4f 42 20 27 31 32  WHERE c GLOB '12
4790: 2a 27 20 4f 52 44 45 52 20 42 59 20 2b 61 3b 0a  *' ORDER BY +a;.
47a0: 20 20 20 20 7d 0a 20 20 7d 20 7b 31 32 20 31 32      }.  } {12 12
47b0: 33 20 73 63 61 6e 20 35 20 6c 69 6b 65 20 36 7d  3 scan 5 like 6}
47c0: 0a 20 20 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d  .  do_test like-
47d0: 31 30 2e 31 32 20 7b 0a 20 20 20 20 63 6f 75 6e  10.12 {.    coun
47e0: 74 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  t {.      SELECT
47f0: 20 61 20 46 52 4f 4d 20 74 31 30 62 20 57 48 45   a FROM t10b WHE
4800: 52 45 20 64 20 47 4c 4f 42 20 27 31 32 2a 27 20  RE d GLOB '12*' 
4810: 4f 52 44 45 52 20 42 59 20 2b 61 3b 0a 20 20 20  ORDER BY +a;.   
4820: 20 7d 0a 20 20 7d 20 7b 31 32 20 31 32 33 20 73   }.  } {12 123 s
4830: 63 61 6e 20 35 20 6c 69 6b 65 20 36 7d 0a 20 20  can 5 like 6}.  
4840: 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 31 30 2e  do_test like-10.
4850: 31 33 20 7b 0a 20 20 20 20 63 6f 75 6e 74 20 7b  13 {.    count {
4860: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 20  .      SELECT a 
4870: 46 52 4f 4d 20 74 31 30 62 20 57 48 45 52 45 20  FROM t10b WHERE 
4880: 65 20 47 4c 4f 42 20 27 31 32 2a 27 20 4f 52 44  e GLOB '12*' ORD
4890: 45 52 20 42 59 20 2b 61 3b 0a 20 20 20 20 7d 0a  ER BY +a;.    }.
48a0: 20 20 7d 20 7b 31 32 20 31 32 33 20 73 63 61 6e    } {12 123 scan
48b0: 20 35 20 6c 69 6b 65 20 36 7d 0a 20 20 64 6f 5f   5 like 6}.  do_
48c0: 74 65 73 74 20 6c 69 6b 65 2d 31 30 2e 31 34 20  test like-10.14 
48d0: 7b 0a 20 20 20 20 63 6f 75 6e 74 20 7b 0a 20 20  {.    count {.  
48e0: 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f      SELECT a FRO
48f0: 4d 20 74 31 30 62 20 57 48 45 52 45 20 66 20 47  M t10b WHERE f G
4900: 4c 4f 42 20 27 31 32 2a 27 20 4f 52 44 45 52 20  LOB '12*' ORDER 
4910: 42 59 20 2b 61 3b 0a 20 20 20 20 7d 0a 20 20 7d  BY +a;.    }.  }
4920: 20 7b 31 32 20 31 32 33 20 73 63 61 6e 20 33 20   {12 123 scan 3 
4930: 6c 69 6b 65 20 30 7d 0a 20 20 64 6f 5f 74 65 73  like 0}.  do_tes
4940: 74 20 6c 69 6b 65 2d 31 30 2e 31 35 20 7b 0a 20  t like-10.15 {. 
4950: 20 20 20 63 6f 75 6e 74 20 7b 0a 20 20 20 20 20     count {.     
4960: 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
4970: 31 30 62 20 57 48 45 52 45 20 61 20 47 4c 4f 42  10b WHERE a GLOB
4980: 20 27 31 32 2a 27 20 4f 52 44 45 52 20 42 59 20   '12*' ORDER BY 
4990: 2b 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31  +a;.    }.  } {1
49a0: 32 20 31 32 33 20 73 63 61 6e 20 35 20 6c 69 6b  2 123 scan 5 lik
49b0: 65 20 36 7d 0a 7d 0a 0a 23 20 4c 49 4b 45 20 61  e 6}.}..# LIKE a
49c0: 6e 64 20 47 4c 4f 42 20 77 68 65 72 65 20 74 68  nd GLOB where th
49d0: 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  e default collat
49e0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20  ing sequence is 
49f0: 6e 6f 74 20 61 70 70 72 6f 70 72 69 61 74 65 0a  not appropriate.
4a00: 23 20 62 75 74 20 61 6e 20 69 6e 64 65 78 20 77  # but an index w
4a10: 69 74 68 20 74 68 65 20 61 70 70 72 6f 70 72 69  ith the appropri
4a20: 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ate collating se
4a30: 71 75 65 6e 63 65 20 65 78 69 73 74 73 2e 0a 23  quence exists..#
4a40: 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 31 31  .do_test like-11
4a50: 2e 30 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .0 {.  execsql {
4a60: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
4a70: 45 20 74 31 31 28 0a 20 20 20 20 20 20 61 20 49  E t11(.      a I
4a80: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
4a90: 45 59 2c 0a 20 20 20 20 20 20 62 20 54 45 58 54  EY,.      b TEXT
4aa0: 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 2c   COLLATE nocase,
4ab0: 0a 20 20 20 20 20 20 63 20 54 45 58 54 20 43 4f  .      c TEXT CO
4ac0: 4c 4c 41 54 45 20 62 69 6e 61 72 79 0a 20 20 20  LLATE binary.   
4ad0: 20 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49   );.    INSERT I
4ae0: 4e 54 4f 20 74 31 31 20 56 41 4c 55 45 53 28 31  NTO t11 VALUES(1
4af0: 2c 20 27 61 27 2c 27 61 27 29 3b 0a 20 20 20 20  , 'a','a');.    
4b00: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 31 20  INSERT INTO t11 
4b10: 56 41 4c 55 45 53 28 32 2c 20 27 61 62 27 2c 27  VALUES(2, 'ab','
4b20: 61 62 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  ab');.    INSERT
4b30: 20 49 4e 54 4f 20 74 31 31 20 56 41 4c 55 45 53   INTO t11 VALUES
4b40: 28 33 2c 20 27 61 62 63 27 2c 27 61 62 63 27 29  (3, 'abc','abc')
4b50: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
4b60: 4f 20 74 31 31 20 56 41 4c 55 45 53 28 34 2c 20  O t11 VALUES(4, 
4b70: 27 61 62 63 64 27 2c 27 61 62 63 64 27 29 3b 0a  'abcd','abcd');.
4b80: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
4b90: 74 31 31 20 56 41 4c 55 45 53 28 35 2c 20 27 41  t11 VALUES(5, 'A
4ba0: 27 2c 27 41 27 29 3b 0a 20 20 20 20 49 4e 53 45  ','A');.    INSE
4bb0: 52 54 20 49 4e 54 4f 20 74 31 31 20 56 41 4c 55  RT INTO t11 VALU
4bc0: 45 53 28 36 2c 20 27 41 42 27 2c 27 41 42 27 29  ES(6, 'AB','AB')
4bd0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
4be0: 4f 20 74 31 31 20 56 41 4c 55 45 53 28 37 2c 20  O t11 VALUES(7, 
4bf0: 27 41 42 43 27 2c 27 41 42 43 27 29 3b 0a 20 20  'ABC','ABC');.  
4c00: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
4c10: 31 20 56 41 4c 55 45 53 28 38 2c 20 27 41 42 43  1 VALUES(8, 'ABC
4c20: 44 27 2c 27 41 42 43 44 27 29 3b 0a 20 20 20 20  D','ABCD');.    
4c30: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 31 20  INSERT INTO t11 
4c40: 56 41 4c 55 45 53 28 39 2c 20 27 78 27 2c 27 78  VALUES(9, 'x','x
4c50: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
4c60: 4e 54 4f 20 74 31 31 20 56 41 4c 55 45 53 28 31  NTO t11 VALUES(1
4c70: 30 2c 20 27 79 7a 27 2c 27 79 7a 27 29 3b 0a 20  0, 'yz','yz');. 
4c80: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
4c90: 31 31 20 56 41 4c 55 45 53 28 31 31 2c 20 27 58  11 VALUES(11, 'X
4ca0: 27 2c 27 58 27 29 3b 0a 20 20 20 20 49 4e 53 45  ','X');.    INSE
4cb0: 52 54 20 49 4e 54 4f 20 74 31 31 20 56 41 4c 55  RT INTO t11 VALU
4cc0: 45 53 28 31 32 2c 20 27 59 5a 27 2c 27 59 5a 27  ES(12, 'YZ','YZ'
4cd0: 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f  );.    SELECT co
4ce0: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 31 3b  unt(*) FROM t11;
4cf0: 0a 20 20 7d 0a 7d 20 7b 31 32 7d 0a 64 6f 5f 74  .  }.} {12}.do_t
4d00: 65 73 74 20 6c 69 6b 65 2d 31 31 2e 31 20 7b 0a  est like-11.1 {.
4d10: 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20    queryplan {.  
4d20: 20 20 50 52 41 47 4d 41 20 63 61 73 65 5f 73 65    PRAGMA case_se
4d30: 6e 73 69 74 69 76 65 5f 6c 69 6b 65 3d 4f 46 46  nsitive_like=OFF
4d40: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 62 20 46  ;.    SELECT b F
4d50: 52 4f 4d 20 74 31 31 20 57 48 45 52 45 20 62 20  ROM t11 WHERE b 
4d60: 4c 49 4b 45 20 27 61 62 63 25 27 20 4f 52 44 45  LIKE 'abc%' ORDE
4d70: 52 20 42 59 20 61 3b 0a 20 20 7d 0a 7d 20 7b 61  R BY a;.  }.} {a
4d80: 62 63 20 61 62 63 64 20 41 42 43 20 41 42 43 44  bc abcd ABC ABCD
4d90: 20 6e 6f 73 6f 72 74 20 74 31 31 20 2a 7d 0a 64   nosort t11 *}.d
4da0: 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 31 31 2e 32  o_test like-11.2
4db0: 20 7b 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b   {.  queryplan {
4dc0: 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61 73 65  .    PRAGMA case
4dd0: 5f 73 65 6e 73 69 74 69 76 65 5f 6c 69 6b 65 3d  _sensitive_like=
4de0: 4f 4e 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 62  ON;.    SELECT b
4df0: 20 46 52 4f 4d 20 74 31 31 20 57 48 45 52 45 20   FROM t11 WHERE 
4e00: 62 20 4c 49 4b 45 20 27 61 62 63 25 27 20 4f 52  b LIKE 'abc%' OR
4e10: 44 45 52 20 42 59 20 61 3b 0a 20 20 7d 0a 7d 20  DER BY a;.  }.} 
4e20: 7b 61 62 63 20 61 62 63 64 20 6e 6f 73 6f 72 74  {abc abcd nosort
4e30: 20 74 31 31 20 2a 7d 0a 64 6f 5f 74 65 73 74 20   t11 *}.do_test 
4e40: 6c 69 6b 65 2d 31 31 2e 33 20 7b 0a 20 20 71 75  like-11.3 {.  qu
4e50: 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 50 52  eryplan {.    PR
4e60: 41 47 4d 41 20 63 61 73 65 5f 73 65 6e 73 69 74  AGMA case_sensit
4e70: 69 76 65 5f 6c 69 6b 65 3d 4f 46 46 3b 0a 20 20  ive_like=OFF;.  
4e80: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 74    CREATE INDEX t
4e90: 31 31 62 20 4f 4e 20 74 31 31 28 62 29 3b 0a 20  11b ON t11(b);. 
4ea0: 20 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d     SELECT b FROM
4eb0: 20 74 31 31 20 57 48 45 52 45 20 62 20 4c 49 4b   t11 WHERE b LIK
4ec0: 45 20 27 61 62 63 25 27 20 4f 52 44 45 52 20 42  E 'abc%' ORDER B
4ed0: 59 20 2b 61 3b 0a 20 20 7d 0a 7d 20 7b 61 62 63  Y +a;.  }.} {abc
4ee0: 20 61 62 63 64 20 41 42 43 20 41 42 43 44 20 73   abcd ABC ABCD s
4ef0: 6f 72 74 20 7b 7d 20 74 31 31 62 7d 0a 64 6f 5f  ort {} t11b}.do_
4f00: 74 65 73 74 20 6c 69 6b 65 2d 31 31 2e 34 20 7b  test like-11.4 {
4f10: 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20  .  queryplan {. 
4f20: 20 20 20 50 52 41 47 4d 41 20 63 61 73 65 5f 73     PRAGMA case_s
4f30: 65 6e 73 69 74 69 76 65 5f 6c 69 6b 65 3d 4f 4e  ensitive_like=ON
4f40: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 62 20 46  ;.    SELECT b F
4f50: 52 4f 4d 20 74 31 31 20 57 48 45 52 45 20 62 20  ROM t11 WHERE b 
4f60: 4c 49 4b 45 20 27 61 62 63 25 27 20 4f 52 44 45  LIKE 'abc%' ORDE
4f70: 52 20 42 59 20 61 3b 0a 20 20 7d 0a 7d 20 7b 61  R BY a;.  }.} {a
4f80: 62 63 20 61 62 63 64 20 6e 6f 73 6f 72 74 20 74  bc abcd nosort t
4f90: 31 31 20 2a 7d 0a 64 6f 5f 74 65 73 74 20 6c 69  11 *}.do_test li
4fa0: 6b 65 2d 31 31 2e 35 20 7b 0a 20 20 71 75 65 72  ke-11.5 {.  quer
4fb0: 79 70 6c 61 6e 20 7b 0a 20 20 20 20 50 52 41 47  yplan {.    PRAG
4fc0: 4d 41 20 63 61 73 65 5f 73 65 6e 73 69 74 69 76  MA case_sensitiv
4fd0: 65 5f 6c 69 6b 65 3d 4f 46 46 3b 0a 20 20 20 20  e_like=OFF;.    
4fe0: 44 52 4f 50 20 49 4e 44 45 58 20 74 31 31 62 3b  DROP INDEX t11b;
4ff0: 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  .    CREATE INDE
5000: 58 20 74 31 31 62 6e 63 20 4f 4e 20 74 31 31 28  X t11bnc ON t11(
5010: 62 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65  b COLLATE nocase
5020: 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 62 20  );.    SELECT b 
5030: 46 52 4f 4d 20 74 31 31 20 57 48 45 52 45 20 62  FROM t11 WHERE b
5040: 20 4c 49 4b 45 20 27 61 62 63 25 27 20 4f 52 44   LIKE 'abc%' ORD
5050: 45 52 20 42 59 20 2b 61 3b 0a 20 20 7d 0a 7d 20  ER BY +a;.  }.} 
5060: 7b 61 62 63 20 61 62 63 64 20 41 42 43 20 41 42  {abc abcd ABC AB
5070: 43 44 20 73 6f 72 74 20 7b 7d 20 74 31 31 62 6e  CD sort {} t11bn
5080: 63 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d  c}.do_test like-
5090: 31 31 2e 36 20 7b 0a 20 20 71 75 65 72 79 70 6c  11.6 {.  querypl
50a0: 61 6e 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  an {.    CREATE 
50b0: 49 4e 44 45 58 20 74 31 31 62 62 20 4f 4e 20 74  INDEX t11bb ON t
50c0: 31 31 28 62 20 43 4f 4c 4c 41 54 45 20 62 69 6e  11(b COLLATE bin
50d0: 61 72 79 29 3b 0a 20 20 20 20 53 45 4c 45 43 54  ary);.    SELECT
50e0: 20 62 20 46 52 4f 4d 20 74 31 31 20 57 48 45 52   b FROM t11 WHER
50f0: 45 20 62 20 4c 49 4b 45 20 27 61 62 63 25 27 20  E b LIKE 'abc%' 
5100: 4f 52 44 45 52 20 42 59 20 2b 61 3b 0a 20 20 7d  ORDER BY +a;.  }
5110: 0a 7d 20 7b 61 62 63 20 61 62 63 64 20 41 42 43  .} {abc abcd ABC
5120: 20 41 42 43 44 20 73 6f 72 74 20 7b 7d 20 74 31   ABCD sort {} t1
5130: 31 62 6e 63 7d 0a 64 6f 5f 74 65 73 74 20 6c 69  1bnc}.do_test li
5140: 6b 65 2d 31 31 2e 37 20 7b 0a 20 20 71 75 65 72  ke-11.7 {.  quer
5150: 79 70 6c 61 6e 20 7b 0a 20 20 20 20 50 52 41 47  yplan {.    PRAG
5160: 4d 41 20 63 61 73 65 5f 73 65 6e 73 69 74 69 76  MA case_sensitiv
5170: 65 5f 6c 69 6b 65 3d 4f 4e 3b 0a 20 20 20 20 53  e_like=ON;.    S
5180: 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 31 31  ELECT b FROM t11
5190: 20 57 48 45 52 45 20 62 20 4c 49 4b 45 20 27 61   WHERE b LIKE 'a
51a0: 62 63 25 27 20 4f 52 44 45 52 20 42 59 20 2b 61  bc%' ORDER BY +a
51b0: 3b 0a 20 20 7d 0a 7d 20 7b 61 62 63 20 61 62 63  ;.  }.} {abc abc
51c0: 64 20 73 6f 72 74 20 7b 7d 20 74 31 31 62 62 7d  d sort {} t11bb}
51d0: 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 31 31  .do_test like-11
51e0: 2e 38 20 7b 0a 20 20 71 75 65 72 79 70 6c 61 6e  .8 {.  queryplan
51f0: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61   {.    PRAGMA ca
5200: 73 65 5f 73 65 6e 73 69 74 69 76 65 5f 6c 69 6b  se_sensitive_lik
5210: 65 3d 4f 46 46 3b 0a 20 20 20 20 53 45 4c 45 43  e=OFF;.    SELEC
5220: 54 20 62 20 46 52 4f 4d 20 74 31 31 20 57 48 45  T b FROM t11 WHE
5230: 52 45 20 62 20 47 4c 4f 42 20 27 61 62 63 2a 27  RE b GLOB 'abc*'
5240: 20 4f 52 44 45 52 20 42 59 20 2b 61 3b 0a 20 20   ORDER BY +a;.  
5250: 7d 0a 7d 20 7b 61 62 63 20 61 62 63 64 20 73 6f  }.} {abc abcd so
5260: 72 74 20 7b 7d 20 74 31 31 62 62 7d 0a 64 6f 5f  rt {} t11bb}.do_
5270: 74 65 73 74 20 6c 69 6b 65 2d 31 31 2e 39 20 7b  test like-11.9 {
5280: 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20  .  queryplan {. 
5290: 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
52a0: 74 31 31 63 6e 63 20 4f 4e 20 74 31 31 28 63 20  t11cnc ON t11(c 
52b0: 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 29 3b  COLLATE nocase);
52c0: 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  .    CREATE INDE
52d0: 58 20 74 31 31 63 62 20 4f 4e 20 74 31 31 28 63  X t11cb ON t11(c
52e0: 20 43 4f 4c 4c 41 54 45 20 62 69 6e 61 72 79 29   COLLATE binary)
52f0: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 63 20 46  ;.    SELECT c F
5300: 52 4f 4d 20 74 31 31 20 57 48 45 52 45 20 63 20  ROM t11 WHERE c 
5310: 4c 49 4b 45 20 27 61 62 63 25 27 20 4f 52 44 45  LIKE 'abc%' ORDE
5320: 52 20 42 59 20 2b 61 3b 0a 20 20 7d 0a 7d 20 7b  R BY +a;.  }.} {
5330: 61 62 63 20 61 62 63 64 20 41 42 43 20 41 42 43  abc abcd ABC ABC
5340: 44 20 73 6f 72 74 20 7b 7d 20 74 31 31 63 6e 63  D sort {} t11cnc
5350: 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 31  }.do_test like-1
5360: 31 2e 31 30 20 7b 0a 20 20 71 75 65 72 79 70 6c  1.10 {.  querypl
5370: 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  an {.    SELECT 
5380: 63 20 46 52 4f 4d 20 74 31 31 20 57 48 45 52 45  c FROM t11 WHERE
5390: 20 63 20 47 4c 4f 42 20 27 61 62 63 2a 27 20 4f   c GLOB 'abc*' O
53a0: 52 44 45 52 20 42 59 20 2b 61 3b 0a 20 20 7d 0a  RDER BY +a;.  }.
53b0: 7d 20 7b 61 62 63 20 61 62 63 64 20 73 6f 72 74  } {abc abcd sort
53c0: 20 7b 7d 20 74 31 31 63 62 7d 0a 0a 0a 66 69 6e   {} t11cb}...fin
53d0: 69 73 68 5f 74 65 73 74 0a                       ish_test.