/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 0603f4fa0dad50987f70032c05800cbfa8985302:


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 6e 61 6d 65 73 20 6f 66 20 74  s the names of t
0db0: 68 65 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64  he table and ind
0dc0: 65 78 20 75 73 65 64 2e 0a 23 0a 70 72 6f 63 20  ex used..#.proc 
0dd0: 71 75 65 72 79 70 6c 61 6e 20 7b 73 71 6c 7d 20  queryplan {sql} 
0de0: 7b 0a 20 20 73 65 74 20 3a 3a 73 71 6c 69 74 65  {.  set ::sqlite
0df0: 5f 73 6f 72 74 5f 63 6f 75 6e 74 20 30 0a 20 20  _sort_count 0.  
0e00: 73 65 74 20 64 61 74 61 20 5b 65 78 65 63 73 71  set data [execsq
0e10: 6c 20 24 73 71 6c 5d 0a 20 20 69 66 20 7b 24 3a  l $sql].  if {$:
0e20: 3a 73 71 6c 69 74 65 5f 73 6f 72 74 5f 63 6f 75  :sqlite_sort_cou
0e30: 6e 74 7d 20 7b 73 65 74 20 78 20 73 6f 72 74 7d  nt} {set x sort}
0e40: 20 7b 73 65 74 20 78 20 6e 6f 73 6f 72 74 7d 0a   {set x nosort}.
0e50: 20 20 6c 61 70 70 65 6e 64 20 64 61 74 61 20 24    lappend data $
0e60: 78 0a 20 20 73 65 74 20 65 71 70 20 5b 65 78 65  x.  set eqp [exe
0e70: 63 73 71 6c 20 22 45 58 50 4c 41 49 4e 20 51 55  csql "EXPLAIN QU
0e80: 45 52 59 20 50 4c 41 4e 20 24 73 71 6c 22 5d 0a  ERY PLAN $sql"].
0e90: 20 20 23 20 70 75 74 73 20 65 71 70 3d 24 65 71    # puts eqp=$eq
0ea0: 70 0a 20 20 66 6f 72 65 61 63 68 20 7b 61 20 62  p.  foreach {a b
0eb0: 20 63 20 78 7d 20 24 65 71 70 20 7b 0a 20 20 20   c x} $eqp {.   
0ec0: 20 69 66 20 7b 5b 72 65 67 65 78 70 20 7b 20 54   if {[regexp { T
0ed0: 41 42 4c 45 20 28 5c 77 2b 20 41 53 20 29 3f 28  ABLE (\w+ AS )?(
0ee0: 5c 77 2b 29 20 55 53 49 4e 47 20 43 4f 56 45 52  \w+) USING COVER
0ef0: 49 4e 47 20 49 4e 44 45 58 20 28 5c 77 2b 29 5c  ING INDEX (\w+)\
0f00: 79 7d 20 5c 0a 20 20 20 20 20 20 20 20 24 78 20  y} \.        $x 
0f10: 61 6c 6c 20 61 73 20 74 61 62 20 69 64 78 5d 7d  all as tab idx]}
0f20: 20 7b 0a 20 20 20 20 20 20 6c 61 70 70 65 6e 64   {.      lappend
0f30: 20 64 61 74 61 20 7b 7d 20 24 69 64 78 0a 20 20   data {} $idx.  
0f40: 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 72 65 67    } elseif {[reg
0f50: 65 78 70 20 7b 20 54 41 42 4c 45 20 28 5c 77 2b  exp { TABLE (\w+
0f60: 20 41 53 20 29 3f 28 5c 77 2b 29 20 55 53 49 4e   AS )?(\w+) USIN
0f70: 47 2e 2a 20 49 4e 44 45 58 20 28 5c 77 2b 29 5c  G.* INDEX (\w+)\
0f80: 79 7d 20 5c 0a 20 20 20 20 20 20 20 20 24 78 20  y} \.        $x 
0f90: 61 6c 6c 20 61 73 20 74 61 62 20 69 64 78 5d 7d  all as tab idx]}
0fa0: 20 7b 0a 20 20 20 20 20 20 6c 61 70 70 65 6e 64   {.      lappend
0fb0: 20 64 61 74 61 20 24 74 61 62 20 24 69 64 78 0a   data $tab $idx.
0fc0: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 72      } elseif {[r
0fd0: 65 67 65 78 70 20 7b 20 54 41 42 4c 45 20 28 5c  egexp { TABLE (\
0fe0: 77 2b 20 41 53 20 29 3f 28 5c 77 2b 29 5c 79 7d  w+ AS )?(\w+)\y}
0ff0: 20 24 78 20 61 6c 6c 20 61 73 20 74 61 62 5d 7d   $x all as tab]}
1000: 20 7b 0a 20 20 20 20 20 20 6c 61 70 70 65 6e 64   {.      lappend
1010: 20 64 61 74 61 20 24 74 61 62 20 2a 0a 20 20 20   data $tab *.   
1020: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1030: 24 64 61 74 61 20 20 20 0a 7d 0a 0a 23 20 50 65  $data   .}..# Pe
1040: 72 66 6f 72 6d 20 74 65 73 74 73 20 6f 6e 20 74  rform tests on t
1050: 68 65 20 6c 69 6b 65 20 6f 70 74 69 6d 69 7a 61  he like optimiza
1060: 74 69 6f 6e 2e 0a 23 0a 23 20 57 69 74 68 20 6e  tion..#.# With n
1070: 6f 20 69 6e 64 65 78 20 6f 6e 20 74 31 2e 78 20  o index on t1.x 
1080: 61 6e 64 20 77 69 74 68 20 63 61 73 65 20 73 65  and with case se
1090: 6e 73 69 74 69 76 69 74 79 20 74 75 72 6e 65 64  nsitivity turned
10a0: 20 6f 66 66 2c 20 6e 6f 20 6f 70 74 69 6d 69 7a   off, no optimiz
10b0: 61 74 69 6f 6e 0a 23 20 69 73 20 70 65 72 66 6f  ation.# is perfo
10c0: 72 6d 65 64 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  rmed..#.do_test 
10d0: 6c 69 6b 65 2d 33 2e 31 20 7b 0a 20 20 73 65 74  like-3.1 {.  set
10e0: 20 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75   sqlite_like_cou
10f0: 6e 74 20 30 0a 20 20 71 75 65 72 79 70 6c 61 6e  nt 0.  queryplan
1100: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 78 20   {.    SELECT x 
1110: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 78 20  FROM t1 WHERE x 
1120: 4c 49 4b 45 20 27 61 62 63 25 27 20 4f 52 44 45  LIKE 'abc%' ORDE
1130: 52 20 42 59 20 31 3b 0a 20 20 7d 0a 7d 20 7b 41  R BY 1;.  }.} {A
1140: 42 43 20 7b 41 42 43 20 61 62 63 20 78 79 7a 7d  BC {ABC abc xyz}
1150: 20 61 62 63 20 61 62 63 64 20 73 6f 72 74 20 74   abc abcd sort t
1160: 31 20 2a 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b  1 *}.do_test lik
1170: 65 2d 33 2e 32 20 7b 0a 20 20 73 65 74 20 73 71  e-3.2 {.  set sq
1180: 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 0a  lite_like_count.
1190: 7d 20 7b 31 32 7d 0a 0a 23 20 57 69 74 68 20 61  } {12}..# With a
11a0: 6e 20 69 6e 64 65 78 20 6f 6e 20 74 31 2e 78 20  n index on t1.x 
11b0: 61 6e 64 20 63 61 73 65 20 73 65 6e 73 69 74 69  and case sensiti
11c0: 76 69 74 79 20 6f 6e 2c 20 6f 70 74 69 6d 69 7a  vity on, optimiz
11d0: 65 20 63 6f 6d 70 6c 65 74 65 6c 79 2e 0a 23 0a  e completely..#.
11e0: 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 33 2e 33  do_test like-3.3
11f0: 20 7b 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f   {.  set sqlite_
1200: 6c 69 6b 65 5f 63 6f 75 6e 74 20 30 0a 20 20 65  like_count 0.  e
1210: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
1220: 47 4d 41 20 63 61 73 65 5f 73 65 6e 73 69 74 69  GMA case_sensiti
1230: 76 65 5f 6c 69 6b 65 3d 6f 6e 3b 0a 20 20 20 20  ve_like=on;.    
1240: 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20  CREATE INDEX i1 
1250: 4f 4e 20 74 31 28 78 29 3b 0a 20 20 7d 0a 20 20  ON t1(x);.  }.  
1260: 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20  queryplan {.    
1270: 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31  SELECT x FROM t1
1280: 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27 61   WHERE x LIKE 'a
1290: 62 63 25 27 20 4f 52 44 45 52 20 42 59 20 31 3b  bc%' ORDER BY 1;
12a0: 0a 20 20 7d 0a 7d 20 7b 61 62 63 20 61 62 63 64  .  }.} {abc abcd
12b0: 20 6e 6f 73 6f 72 74 20 7b 7d 20 69 31 7d 0a 64   nosort {} i1}.d
12c0: 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 33 2e 34 20  o_test like-3.4 
12d0: 7b 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f 6c  {.  set sqlite_l
12e0: 69 6b 65 5f 63 6f 75 6e 74 0a 7d 20 30 0a 0a 23  ike_count.} 0..#
12f0: 20 54 68 65 20 4c 49 4b 45 20 6f 70 74 69 6d 69   The LIKE optimi
1300: 7a 61 74 69 6f 6e 20 73 74 69 6c 6c 20 77 6f 72  zation still wor
1310: 6b 73 20 77 68 65 6e 20 74 68 65 20 52 48 53 20  ks when the RHS 
1320: 69 73 20 61 20 73 74 72 69 6e 67 20 77 69 74 68  is a string with
1330: 20 6e 6f 0a 23 20 77 69 6c 64 63 61 72 64 2e 20   no.# wildcard. 
1340: 20 54 69 63 6b 65 74 20 5b 65 30 39 30 31 38 33   Ticket [e090183
1350: 35 33 31 66 63 32 37 34 37 5d 0a 23 0a 64 6f 5f  531fc2747].#.do_
1360: 74 65 73 74 20 6c 69 6b 65 2d 33 2e 34 2e 32 20  test like-3.4.2 
1370: 7b 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a  {.  queryplan {.
1380: 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f      SELECT x FRO
1390: 4d 20 74 31 20 57 48 45 52 45 20 78 20 4c 49 4b  M t1 WHERE x LIK
13a0: 45 20 27 61 27 20 4f 52 44 45 52 20 42 59 20 31  E 'a' ORDER BY 1
13b0: 3b 0a 20 20 7d 0a 7d 20 7b 61 20 6e 6f 73 6f 72  ;.  }.} {a nosor
13c0: 74 20 7b 7d 20 69 31 7d 0a 64 6f 5f 74 65 73 74  t {} i1}.do_test
13d0: 20 6c 69 6b 65 2d 33 2e 34 2e 33 20 7b 0a 20 20   like-3.4.3 {.  
13e0: 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20  queryplan {.    
13f0: 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31  SELECT x FROM t1
1400: 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27 61   WHERE x LIKE 'a
1410: 62 27 20 4f 52 44 45 52 20 42 59 20 31 3b 0a 20  b' ORDER BY 1;. 
1420: 20 7d 0a 7d 20 7b 61 62 20 6e 6f 73 6f 72 74 20   }.} {ab nosort 
1430: 7b 7d 20 69 31 7d 0a 64 6f 5f 74 65 73 74 20 6c  {} i1}.do_test l
1440: 69 6b 65 2d 33 2e 34 2e 34 20 7b 0a 20 20 71 75  ike-3.4.4 {.  qu
1450: 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45  eryplan {.    SE
1460: 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20 57  LECT x FROM t1 W
1470: 48 45 52 45 20 78 20 4c 49 4b 45 20 27 61 62 63  HERE x LIKE 'abc
1480: 64 27 20 4f 52 44 45 52 20 42 59 20 31 3b 0a 20  d' ORDER BY 1;. 
1490: 20 7d 0a 7d 20 7b 61 62 63 64 20 6e 6f 73 6f 72   }.} {abcd nosor
14a0: 74 20 7b 7d 20 69 31 7d 0a 64 6f 5f 74 65 73 74  t {} i1}.do_test
14b0: 20 6c 69 6b 65 2d 33 2e 34 2e 35 20 7b 0a 20 20   like-3.4.5 {.  
14c0: 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20  queryplan {.    
14d0: 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31  SELECT x FROM t1
14e0: 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27 61   WHERE x LIKE 'a
14f0: 62 63 64 65 27 20 4f 52 44 45 52 20 42 59 20 31  bcde' ORDER BY 1
1500: 3b 0a 20 20 7d 0a 7d 20 7b 6e 6f 73 6f 72 74 20  ;.  }.} {nosort 
1510: 7b 7d 20 69 31 7d 0a 0a 0a 23 20 50 61 72 74 69  {} i1}...# Parti
1520: 61 6c 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  al optimization 
1530: 77 68 65 6e 20 74 68 65 20 70 61 74 74 65 72 6e  when the pattern
1540: 20 64 6f 65 73 20 6e 6f 74 20 65 6e 64 20 69 6e   does not end in
1550: 20 27 25 27 0a 23 0a 64 6f 5f 74 65 73 74 20 6c   '%'.#.do_test l
1560: 69 6b 65 2d 33 2e 35 20 7b 0a 20 20 73 65 74 20  ike-3.5 {.  set 
1570: 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e  sqlite_like_coun
1580: 74 20 30 0a 20 20 71 75 65 72 79 70 6c 61 6e 20  t 0.  queryplan 
1590: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 78 20 46  {.    SELECT x F
15a0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 78 20 4c  ROM t1 WHERE x L
15b0: 49 4b 45 20 27 61 5f 63 27 20 4f 52 44 45 52 20  IKE 'a_c' ORDER 
15c0: 42 59 20 31 3b 0a 20 20 7d 0a 7d 20 7b 61 62 63  BY 1;.  }.} {abc
15d0: 20 6e 6f 73 6f 72 74 20 7b 7d 20 69 31 7d 0a 64   nosort {} i1}.d
15e0: 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 33 2e 36 20  o_test like-3.6 
15f0: 7b 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f 6c  {.  set sqlite_l
1600: 69 6b 65 5f 63 6f 75 6e 74 0a 7d 20 36 0a 64 6f  ike_count.} 6.do
1610: 5f 74 65 73 74 20 6c 69 6b 65 2d 33 2e 37 20 7b  _test like-3.7 {
1620: 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f 6c 69  .  set sqlite_li
1630: 6b 65 5f 63 6f 75 6e 74 20 30 0a 20 20 71 75 65  ke_count 0.  que
1640: 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c  ryplan {.    SEL
1650: 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20 57 48  ECT x FROM t1 WH
1660: 45 52 45 20 78 20 4c 49 4b 45 20 27 61 62 25 64  ERE x LIKE 'ab%d
1670: 27 20 4f 52 44 45 52 20 42 59 20 31 3b 0a 20 20  ' ORDER BY 1;.  
1680: 7d 0a 7d 20 7b 61 62 63 64 20 61 62 64 20 6e 6f  }.} {abcd abd no
1690: 73 6f 72 74 20 7b 7d 20 69 31 7d 0a 64 6f 5f 74  sort {} i1}.do_t
16a0: 65 73 74 20 6c 69 6b 65 2d 33 2e 38 20 7b 0a 20  est like-3.8 {. 
16b0: 20 73 65 74 20 73 71 6c 69 74 65 5f 6c 69 6b 65   set sqlite_like
16c0: 5f 63 6f 75 6e 74 0a 7d 20 34 0a 64 6f 5f 74 65  _count.} 4.do_te
16d0: 73 74 20 6c 69 6b 65 2d 33 2e 39 20 7b 0a 20 20  st like-3.9 {.  
16e0: 73 65 74 20 73 71 6c 69 74 65 5f 6c 69 6b 65 5f  set sqlite_like_
16f0: 63 6f 75 6e 74 20 30 0a 20 20 71 75 65 72 79 70  count 0.  queryp
1700: 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  lan {.    SELECT
1710: 20 78 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   x FROM t1 WHERE
1720: 20 78 20 4c 49 4b 45 20 27 61 5f 63 25 27 20 4f   x LIKE 'a_c%' O
1730: 52 44 45 52 20 42 59 20 31 3b 0a 20 20 7d 0a 7d  RDER BY 1;.  }.}
1740: 20 7b 61 62 63 20 61 62 63 64 20 6e 6f 73 6f 72   {abc abcd nosor
1750: 74 20 7b 7d 20 69 31 7d 0a 64 6f 5f 74 65 73 74  t {} i1}.do_test
1760: 20 6c 69 6b 65 2d 33 2e 31 30 20 7b 0a 20 20 73   like-3.10 {.  s
1770: 65 74 20 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63  et sqlite_like_c
1780: 6f 75 6e 74 0a 7d 20 36 0a 0a 23 20 4e 6f 20 6f  ount.} 6..# No o
1790: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77 68 65 6e  ptimization when
17a0: 20 74 68 65 20 70 61 74 74 65 72 6e 20 62 65 67   the pattern beg
17b0: 69 6e 73 20 77 69 74 68 20 61 20 77 69 6c 64 63  ins with a wildc
17c0: 61 72 64 2e 0a 23 20 4e 6f 74 65 20 74 68 61 74  ard..# Note that
17d0: 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 73 74   the index is st
17e0: 69 6c 6c 20 75 73 65 64 20 62 75 74 20 6f 6e 6c  ill used but onl
17f0: 79 20 66 6f 72 20 73 6f 72 74 69 6e 67 2e 0a 23  y for sorting..#
1800: 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 33 2e  .do_test like-3.
1810: 31 31 20 7b 0a 20 20 73 65 74 20 73 71 6c 69 74  11 {.  set sqlit
1820: 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 20 30 0a 20  e_like_count 0. 
1830: 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20   queryplan {.   
1840: 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74   SELECT x FROM t
1850: 31 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27  1 WHERE x LIKE '
1860: 25 62 63 64 27 20 4f 52 44 45 52 20 42 59 20 31  %bcd' ORDER BY 1
1870: 3b 0a 20 20 7d 0a 7d 20 7b 61 62 63 64 20 62 63  ;.  }.} {abcd bc
1880: 64 20 6e 6f 73 6f 72 74 20 7b 7d 20 69 31 7d 0a  d nosort {} i1}.
1890: 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 33 2e 31  do_test like-3.1
18a0: 32 20 7b 0a 20 20 73 65 74 20 73 71 6c 69 74 65  2 {.  set sqlite
18b0: 5f 6c 69 6b 65 5f 63 6f 75 6e 74 0a 7d 20 31 32  _like_count.} 12
18c0: 0a 0a 23 20 4e 6f 20 6f 70 74 69 6d 69 7a 61 74  ..# No optimizat
18d0: 69 6f 6e 20 66 6f 72 20 63 61 73 65 20 69 6e 73  ion for case ins
18e0: 65 6e 73 69 74 69 76 65 20 4c 49 4b 45 0a 23 0a  ensitive LIKE.#.
18f0: 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 33 2e 31  do_test like-3.1
1900: 33 20 7b 0a 20 20 73 65 74 20 73 71 6c 69 74 65  3 {.  set sqlite
1910: 5f 6c 69 6b 65 5f 63 6f 75 6e 74 20 30 0a 20 20  _like_count 0.  
1920: 64 62 20 65 76 61 6c 20 7b 50 52 41 47 4d 41 20  db eval {PRAGMA 
1930: 63 61 73 65 5f 73 65 6e 73 69 74 69 76 65 5f 6c  case_sensitive_l
1940: 69 6b 65 3d 6f 66 66 3b 7d 0a 20 20 71 75 65 72  ike=off;}.  quer
1950: 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45  yplan {.    SELE
1960: 43 54 20 78 20 46 52 4f 4d 20 74 31 20 57 48 45  CT x FROM t1 WHE
1970: 52 45 20 78 20 4c 49 4b 45 20 27 61 62 63 25 27  RE x LIKE 'abc%'
1980: 20 4f 52 44 45 52 20 42 59 20 31 3b 0a 20 20 7d   ORDER BY 1;.  }
1990: 0a 7d 20 7b 41 42 43 20 7b 41 42 43 20 61 62 63  .} {ABC {ABC abc
19a0: 20 78 79 7a 7d 20 61 62 63 20 61 62 63 64 20 6e   xyz} abc abcd n
19b0: 6f 73 6f 72 74 20 7b 7d 20 69 31 7d 0a 64 6f 5f  osort {} i1}.do_
19c0: 74 65 73 74 20 6c 69 6b 65 2d 33 2e 31 34 20 7b  test like-3.14 {
19d0: 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f 6c 69  .  set sqlite_li
19e0: 6b 65 5f 63 6f 75 6e 74 0a 7d 20 31 32 0a 0a 23  ke_count.} 12..#
19f0: 20 4e 6f 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   No optimization
1a00: 20 77 69 74 68 6f 75 74 20 61 6e 20 69 6e 64 65   without an inde
1a10: 78 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 6c 69 6b  x..#.do_test lik
1a20: 65 2d 33 2e 31 35 20 7b 0a 20 20 73 65 74 20 73  e-3.15 {.  set s
1a30: 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74  qlite_like_count
1a40: 20 30 0a 20 20 64 62 20 65 76 61 6c 20 7b 0a 20   0.  db eval {. 
1a50: 20 20 20 50 52 41 47 4d 41 20 63 61 73 65 5f 73     PRAGMA case_s
1a60: 65 6e 73 69 74 69 76 65 5f 6c 69 6b 65 3d 6f 6e  ensitive_like=on
1a70: 3b 0a 20 20 20 20 44 52 4f 50 20 49 4e 44 45 58  ;.    DROP INDEX
1a80: 20 69 31 3b 0a 20 20 7d 0a 20 20 71 75 65 72 79   i1;.  }.  query
1a90: 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43  plan {.    SELEC
1aa0: 54 20 78 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T x FROM t1 WHER
1ab0: 45 20 78 20 4c 49 4b 45 20 27 61 62 63 25 27 20  E x LIKE 'abc%' 
1ac0: 4f 52 44 45 52 20 42 59 20 31 3b 0a 20 20 7d 0a  ORDER BY 1;.  }.
1ad0: 7d 20 7b 61 62 63 20 61 62 63 64 20 73 6f 72 74  } {abc abcd sort
1ae0: 20 74 31 20 2a 7d 0a 64 6f 5f 74 65 73 74 20 6c   t1 *}.do_test l
1af0: 69 6b 65 2d 33 2e 31 36 20 7b 0a 20 20 73 65 74  ike-3.16 {.  set
1b00: 20 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75   sqlite_like_cou
1b10: 6e 74 0a 7d 20 31 32 0a 0a 23 20 4e 6f 20 47 4c  nt.} 12..# No GL
1b20: 4f 42 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  OB optimization 
1b30: 77 69 74 68 6f 75 74 20 61 6e 20 69 6e 64 65 78  without an index
1b40: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65  ..#.do_test like
1b50: 2d 33 2e 31 37 20 7b 0a 20 20 73 65 74 20 73 71  -3.17 {.  set sq
1b60: 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 20  lite_like_count 
1b70: 30 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a  0.  queryplan {.
1b80: 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f      SELECT x FRO
1b90: 4d 20 74 31 20 57 48 45 52 45 20 78 20 47 4c 4f  M t1 WHERE x GLO
1ba0: 42 20 27 61 62 63 2a 27 20 4f 52 44 45 52 20 42  B 'abc*' ORDER B
1bb0: 59 20 31 3b 0a 20 20 7d 0a 7d 20 7b 61 62 63 20  Y 1;.  }.} {abc 
1bc0: 61 62 63 64 20 73 6f 72 74 20 74 31 20 2a 7d 0a  abcd sort t1 *}.
1bd0: 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 33 2e 31  do_test like-3.1
1be0: 38 20 7b 0a 20 20 73 65 74 20 73 71 6c 69 74 65  8 {.  set sqlite
1bf0: 5f 6c 69 6b 65 5f 63 6f 75 6e 74 0a 7d 20 31 32  _like_count.} 12
1c00: 0a 0a 23 20 47 4c 4f 42 20 69 73 20 6f 70 74 69  ..# GLOB is opti
1c10: 6d 69 7a 65 64 20 72 65 67 61 72 64 6c 65 73 73  mized regardless
1c20: 20 6f 66 20 74 68 65 20 63 61 73 65 5f 73 65 6e   of the case_sen
1c30: 73 69 74 69 76 65 5f 6c 69 6b 65 20 73 65 74 74  sitive_like sett
1c40: 69 6e 67 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 6c  ing..#.do_test l
1c50: 69 6b 65 2d 33 2e 31 39 20 7b 0a 20 20 73 65 74  ike-3.19 {.  set
1c60: 20 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75   sqlite_like_cou
1c70: 6e 74 20 30 0a 20 20 64 62 20 65 76 61 6c 20 7b  nt 0.  db eval {
1c80: 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20  CREATE INDEX i1 
1c90: 4f 4e 20 74 31 28 78 29 3b 7d 0a 20 20 71 75 65  ON t1(x);}.  que
1ca0: 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c  ryplan {.    SEL
1cb0: 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20 57 48  ECT x FROM t1 WH
1cc0: 45 52 45 20 78 20 47 4c 4f 42 20 27 61 62 63 2a  ERE x GLOB 'abc*
1cd0: 27 20 4f 52 44 45 52 20 42 59 20 31 3b 0a 20 20  ' ORDER BY 1;.  
1ce0: 7d 0a 7d 20 7b 61 62 63 20 61 62 63 64 20 6e 6f  }.} {abc abcd no
1cf0: 73 6f 72 74 20 7b 7d 20 69 31 7d 0a 64 6f 5f 74  sort {} i1}.do_t
1d00: 65 73 74 20 6c 69 6b 65 2d 33 2e 32 30 20 7b 0a  est like-3.20 {.
1d10: 20 20 73 65 74 20 73 71 6c 69 74 65 5f 6c 69 6b    set sqlite_lik
1d20: 65 5f 63 6f 75 6e 74 0a 7d 20 30 0a 64 6f 5f 74  e_count.} 0.do_t
1d30: 65 73 74 20 6c 69 6b 65 2d 33 2e 32 31 20 7b 0a  est like-3.21 {.
1d40: 20 20 73 65 74 20 73 71 6c 69 74 65 5f 6c 69 6b    set sqlite_lik
1d50: 65 5f 63 6f 75 6e 74 20 30 0a 20 20 64 62 20 65  e_count 0.  db e
1d60: 76 61 6c 20 7b 50 52 41 47 4d 41 20 63 61 73 65  val {PRAGMA case
1d70: 5f 73 65 6e 73 69 74 69 76 65 5f 6c 69 6b 65 3d  _sensitive_like=
1d80: 6f 6e 3b 7d 0a 20 20 71 75 65 72 79 70 6c 61 6e  on;}.  queryplan
1d90: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 78 20   {.    SELECT x 
1da0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 78 20  FROM t1 WHERE x 
1db0: 47 4c 4f 42 20 27 61 62 63 2a 27 20 4f 52 44 45  GLOB 'abc*' ORDE
1dc0: 52 20 42 59 20 31 3b 0a 20 20 7d 0a 7d 20 7b 61  R BY 1;.  }.} {a
1dd0: 62 63 20 61 62 63 64 20 6e 6f 73 6f 72 74 20 7b  bc abcd nosort {
1de0: 7d 20 69 31 7d 0a 64 6f 5f 74 65 73 74 20 6c 69  } i1}.do_test li
1df0: 6b 65 2d 33 2e 32 32 20 7b 0a 20 20 73 65 74 20  ke-3.22 {.  set 
1e00: 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e  sqlite_like_coun
1e10: 74 0a 7d 20 30 0a 64 6f 5f 74 65 73 74 20 6c 69  t.} 0.do_test li
1e20: 6b 65 2d 33 2e 32 33 20 7b 0a 20 20 73 65 74 20  ke-3.23 {.  set 
1e30: 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e  sqlite_like_coun
1e40: 74 20 30 0a 20 20 64 62 20 65 76 61 6c 20 7b 50  t 0.  db eval {P
1e50: 52 41 47 4d 41 20 63 61 73 65 5f 73 65 6e 73 69  RAGMA case_sensi
1e60: 74 69 76 65 5f 6c 69 6b 65 3d 6f 66 66 3b 7d 0a  tive_like=off;}.
1e70: 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20    queryplan {.  
1e80: 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20    SELECT x FROM 
1e90: 74 31 20 57 48 45 52 45 20 78 20 47 4c 4f 42 20  t1 WHERE x GLOB 
1ea0: 27 61 5b 62 63 5d 64 27 20 4f 52 44 45 52 20 42  'a[bc]d' ORDER B
1eb0: 59 20 31 3b 0a 20 20 7d 0a 7d 20 7b 61 62 64 20  Y 1;.  }.} {abd 
1ec0: 61 63 64 20 6e 6f 73 6f 72 74 20 7b 7d 20 69 31  acd nosort {} i1
1ed0: 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 33  }.do_test like-3
1ee0: 2e 32 34 20 7b 0a 20 20 73 65 74 20 73 71 6c 69  .24 {.  set sqli
1ef0: 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 0a 7d 20  te_like_count.} 
1f00: 36 0a 0a 23 20 47 4c 4f 42 20 6f 70 74 69 6d 69  6..# GLOB optimi
1f10: 7a 61 74 69 6f 6e 20 77 68 65 6e 20 74 68 65 72  zation when ther
1f20: 65 20 69 73 20 6e 6f 20 77 69 6c 64 63 61 72 64  e is no wildcard
1f30: 2e 20 20 54 69 63 6b 65 74 20 5b 65 30 39 30 31  .  Ticket [e0901
1f40: 38 33 35 33 31 66 63 32 37 34 37 5d 0a 23 0a 64  83531fc2747].#.d
1f50: 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 33 2e 32 35  o_test like-3.25
1f60: 20 7b 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b   {.  queryplan {
1f70: 0a 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52  .    SELECT x FR
1f80: 4f 4d 20 74 31 20 57 48 45 52 45 20 78 20 47 4c  OM t1 WHERE x GL
1f90: 4f 42 20 27 61 27 20 4f 52 44 45 52 20 42 59 20  OB 'a' ORDER BY 
1fa0: 31 3b 0a 20 20 7d 0a 7d 20 7b 61 20 6e 6f 73 6f  1;.  }.} {a noso
1fb0: 72 74 20 7b 7d 20 69 31 7d 0a 64 6f 5f 74 65 73  rt {} i1}.do_tes
1fc0: 74 20 6c 69 6b 65 2d 33 2e 32 36 20 7b 0a 20 20  t like-3.26 {.  
1fd0: 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20  queryplan {.    
1fe0: 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31  SELECT x FROM t1
1ff0: 20 57 48 45 52 45 20 78 20 47 4c 4f 42 20 27 61   WHERE x GLOB 'a
2000: 62 63 64 27 20 4f 52 44 45 52 20 42 59 20 31 3b  bcd' ORDER BY 1;
2010: 0a 20 20 7d 0a 7d 20 7b 61 62 63 64 20 6e 6f 73  .  }.} {abcd nos
2020: 6f 72 74 20 7b 7d 20 69 31 7d 0a 64 6f 5f 74 65  ort {} i1}.do_te
2030: 73 74 20 6c 69 6b 65 2d 33 2e 32 37 20 7b 0a 20  st like-3.27 {. 
2040: 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20   queryplan {.   
2050: 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74   SELECT x FROM t
2060: 31 20 57 48 45 52 45 20 78 20 47 4c 4f 42 20 27  1 WHERE x GLOB '
2070: 61 62 63 64 65 27 20 4f 52 44 45 52 20 42 59 20  abcde' ORDER BY 
2080: 31 3b 0a 20 20 7d 0a 7d 20 7b 6e 6f 73 6f 72 74  1;.  }.} {nosort
2090: 20 7b 7d 20 69 31 7d 0a 0a 0a 0a 23 20 4e 6f 20   {} i1}....# No 
20a0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20  optimization if 
20b0: 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 4c  the LHS of the L
20c0: 49 4b 45 20 69 73 20 6e 6f 74 20 61 20 63 6f 6c  IKE is not a col
20d0: 75 6d 6e 20 6e 61 6d 65 20 6f 72 0a 23 20 69 66  umn name or.# if
20e0: 20 74 68 65 20 52 48 53 20 69 73 20 6e 6f 74 20   the RHS is not 
20f0: 61 20 73 74 72 69 6e 67 2e 0a 23 0a 64 6f 5f 74  a string..#.do_t
2100: 65 73 74 20 6c 69 6b 65 2d 34 2e 31 20 7b 0a 20  est like-4.1 {. 
2110: 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41   execsql {PRAGMA
2120: 20 63 61 73 65 5f 73 65 6e 73 69 74 69 76 65 5f   case_sensitive_
2130: 6c 69 6b 65 3d 6f 6e 7d 0a 20 20 73 65 74 20 73  like=on}.  set s
2140: 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74  qlite_like_count
2150: 20 30 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b   0.  queryplan {
2160: 0a 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52  .    SELECT x FR
2170: 4f 4d 20 74 31 20 57 48 45 52 45 20 78 20 4c 49  OM t1 WHERE x LI
2180: 4b 45 20 27 61 62 63 25 27 20 4f 52 44 45 52 20  KE 'abc%' ORDER 
2190: 42 59 20 31 0a 20 20 7d 0a 7d 20 7b 61 62 63 20  BY 1.  }.} {abc 
21a0: 61 62 63 64 20 6e 6f 73 6f 72 74 20 7b 7d 20 69  abcd nosort {} i
21b0: 31 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d  1}.do_test like-
21c0: 34 2e 32 20 7b 0a 20 20 73 65 74 20 73 71 6c 69  4.2 {.  set sqli
21d0: 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 0a 7d 20  te_like_count.} 
21e0: 30 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 34  0.do_test like-4
21f0: 2e 33 20 7b 0a 20 20 73 65 74 20 73 71 6c 69 74  .3 {.  set sqlit
2200: 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 20 30 0a 20  e_like_count 0. 
2210: 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20   queryplan {.   
2220: 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74   SELECT x FROM t
2230: 31 20 57 48 45 52 45 20 2b 78 20 4c 49 4b 45 20  1 WHERE +x LIKE 
2240: 27 61 62 63 25 27 20 4f 52 44 45 52 20 42 59 20  'abc%' ORDER BY 
2250: 31 0a 20 20 7d 0a 7d 20 7b 61 62 63 20 61 62 63  1.  }.} {abc abc
2260: 64 20 6e 6f 73 6f 72 74 20 7b 7d 20 69 31 7d 0a  d nosort {} i1}.
2270: 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 34 2e 34  do_test like-4.4
2280: 20 7b 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f   {.  set sqlite_
2290: 6c 69 6b 65 5f 63 6f 75 6e 74 0a 7d 20 31 32 0a  like_count.} 12.
22a0: 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 34 2e 35  do_test like-4.5
22b0: 20 7b 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f   {.  set sqlite_
22c0: 6c 69 6b 65 5f 63 6f 75 6e 74 20 30 0a 20 20 71  like_count 0.  q
22d0: 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53  ueryplan {.    S
22e0: 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20  ELECT x FROM t1 
22f0: 57 48 45 52 45 20 78 20 4c 49 4b 45 20 28 27 61  WHERE x LIKE ('a
2300: 62 27 20 7c 7c 20 27 63 25 27 29 20 4f 52 44 45  b' || 'c%') ORDE
2310: 52 20 42 59 20 31 0a 20 20 7d 0a 7d 20 7b 61 62  R BY 1.  }.} {ab
2320: 63 20 61 62 63 64 20 6e 6f 73 6f 72 74 20 7b 7d  c abcd nosort {}
2330: 20 69 31 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b   i1}.do_test lik
2340: 65 2d 34 2e 36 20 7b 0a 20 20 73 65 74 20 73 71  e-4.6 {.  set sq
2350: 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 0a  lite_like_count.
2360: 7d 20 31 32 0a 0a 23 20 43 6f 6c 6c 61 74 69 6e  } 12..# Collatin
2370: 67 20 73 65 71 75 65 6e 63 65 73 20 6f 6e 20 74  g sequences on t
2380: 68 65 20 69 6e 64 65 78 20 64 69 73 61 62 6c 65  he index disable
2390: 20 74 68 65 20 4c 49 4b 45 20 6f 70 74 69 6d 69   the LIKE optimi
23a0: 7a 61 74 69 6f 6e 2e 0a 23 20 4f 72 20 69 66 20  zation..# Or if 
23b0: 74 68 65 20 4e 4f 43 41 53 45 20 63 6f 6c 6c 61  the NOCASE colla
23c0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  ting sequence is
23d0: 20 75 73 65 64 2c 20 74 68 65 20 4c 49 4b 45 20   used, the LIKE 
23e0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 23 20 69  optimization.# i
23f0: 73 20 65 6e 61 62 6c 65 64 20 77 68 65 6e 20 63  s enabled when c
2400: 61 73 65 5f 73 65 6e 73 69 74 69 76 65 5f 6c 69  ase_sensitive_li
2410: 6b 65 20 69 73 20 4f 46 46 2e 0a 23 0a 64 6f 5f  ke is OFF..#.do_
2420: 74 65 73 74 20 6c 69 6b 65 2d 35 2e 31 20 7b 0a  test like-5.1 {.
2430: 20 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d    execsql {PRAGM
2440: 41 20 63 61 73 65 5f 73 65 6e 73 69 74 69 76 65  A case_sensitive
2450: 5f 6c 69 6b 65 3d 6f 66 66 7d 0a 20 20 73 65 74  _like=off}.  set
2460: 20 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75   sqlite_like_cou
2470: 6e 74 20 30 0a 20 20 71 75 65 72 79 70 6c 61 6e  nt 0.  queryplan
2480: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 78 20   {.    SELECT x 
2490: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 78 20  FROM t1 WHERE x 
24a0: 4c 49 4b 45 20 27 61 62 63 25 27 20 4f 52 44 45  LIKE 'abc%' ORDE
24b0: 52 20 42 59 20 31 0a 20 20 7d 0a 7d 20 7b 41 42  R BY 1.  }.} {AB
24c0: 43 20 7b 41 42 43 20 61 62 63 20 78 79 7a 7d 20  C {ABC abc xyz} 
24d0: 61 62 63 20 61 62 63 64 20 6e 6f 73 6f 72 74 20  abc abcd nosort 
24e0: 7b 7d 20 69 31 7d 0a 64 6f 5f 74 65 73 74 20 6c  {} i1}.do_test l
24f0: 69 6b 65 2d 35 2e 32 20 7b 0a 20 20 73 65 74 20  ike-5.2 {.  set 
2500: 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e  sqlite_like_coun
2510: 74 0a 7d 20 31 32 0a 64 6f 5f 74 65 73 74 20 6c  t.} 12.do_test l
2520: 69 6b 65 2d 35 2e 33 20 7b 0a 20 20 65 78 65 63  ike-5.3 {.  exec
2530: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
2540: 20 54 41 42 4c 45 20 74 32 28 78 20 54 45 58 54   TABLE t2(x TEXT
2550: 20 43 4f 4c 4c 41 54 45 20 4e 4f 43 41 53 45 29   COLLATE NOCASE)
2560: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
2570: 4f 20 74 32 20 53 45 4c 45 43 54 20 2a 20 46 52  O t2 SELECT * FR
2580: 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 72  OM t1 ORDER BY r
2590: 6f 77 69 64 3b 0a 20 20 20 20 43 52 45 41 54 45  owid;.    CREATE
25a0: 20 49 4e 44 45 58 20 69 32 20 4f 4e 20 74 32 28   INDEX i2 ON t2(
25b0: 78 20 43 4f 4c 4c 41 54 45 20 4e 4f 43 41 53 45  x COLLATE NOCASE
25c0: 29 3b 0a 20 20 7d 0a 20 20 73 65 74 20 73 71 6c  );.  }.  set sql
25d0: 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 20 30  ite_like_count 0
25e0: 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20  .  queryplan {. 
25f0: 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d     SELECT x FROM
2600: 20 74 32 20 57 48 45 52 45 20 78 20 4c 49 4b 45   t2 WHERE x LIKE
2610: 20 27 61 62 63 25 27 20 4f 52 44 45 52 20 42 59   'abc%' ORDER BY
2620: 20 31 0a 20 20 7d 0a 7d 20 7b 61 62 63 20 41 42   1.  }.} {abc AB
2630: 43 20 7b 41 42 43 20 61 62 63 20 78 79 7a 7d 20  C {ABC abc xyz} 
2640: 61 62 63 64 20 6e 6f 73 6f 72 74 20 7b 7d 20 69  abcd nosort {} i
2650: 32 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d  2}.do_test like-
2660: 35 2e 34 20 7b 0a 20 20 73 65 74 20 73 71 6c 69  5.4 {.  set sqli
2670: 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 0a 7d 20  te_like_count.} 
2680: 30 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 35  0.do_test like-5
2690: 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .5 {.  execsql {
26a0: 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61 73 65  .    PRAGMA case
26b0: 5f 73 65 6e 73 69 74 69 76 65 5f 6c 69 6b 65 3d  _sensitive_like=
26c0: 6f 6e 3b 0a 20 20 7d 0a 20 20 73 65 74 20 73 71  on;.  }.  set sq
26d0: 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 20  lite_like_count 
26e0: 30 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a  0.  queryplan {.
26f0: 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f      SELECT x FRO
2700: 4d 20 74 32 20 57 48 45 52 45 20 78 20 4c 49 4b  M t2 WHERE x LIK
2710: 45 20 27 61 62 63 25 27 20 4f 52 44 45 52 20 42  E 'abc%' ORDER B
2720: 59 20 31 0a 20 20 7d 0a 7d 20 7b 61 62 63 20 61  Y 1.  }.} {abc a
2730: 62 63 64 20 6e 6f 73 6f 72 74 20 7b 7d 20 69 32  bcd nosort {} i2
2740: 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 35  }.do_test like-5
2750: 2e 36 20 7b 0a 20 20 73 65 74 20 73 71 6c 69 74  .6 {.  set sqlit
2760: 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 0a 7d 20 31  e_like_count.} 1
2770: 32 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 35  2.do_test like-5
2780: 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .7 {.  execsql {
2790: 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61 73 65  .    PRAGMA case
27a0: 5f 73 65 6e 73 69 74 69 76 65 5f 6c 69 6b 65 3d  _sensitive_like=
27b0: 6f 66 66 3b 0a 20 20 7d 0a 20 20 73 65 74 20 73  off;.  }.  set s
27c0: 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74  qlite_like_count
27d0: 20 30 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b   0.  queryplan {
27e0: 0a 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52  .    SELECT x FR
27f0: 4f 4d 20 74 32 20 57 48 45 52 45 20 78 20 47 4c  OM t2 WHERE x GL
2800: 4f 42 20 27 61 62 63 2a 27 20 4f 52 44 45 52 20  OB 'abc*' ORDER 
2810: 42 59 20 31 0a 20 20 7d 0a 7d 20 7b 61 62 63 20  BY 1.  }.} {abc 
2820: 61 62 63 64 20 6e 6f 73 6f 72 74 20 7b 7d 20 69  abcd nosort {} i
2830: 32 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d  2}.do_test like-
2840: 35 2e 38 20 7b 0a 20 20 73 65 74 20 73 71 6c 69  5.8 {.  set sqli
2850: 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 0a 7d 20  te_like_count.} 
2860: 31 32 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d  12.do_test like-
2870: 35 2e 31 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  5.11 {.  execsql
2880: 20 7b 50 52 41 47 4d 41 20 63 61 73 65 5f 73 65   {PRAGMA case_se
2890: 6e 73 69 74 69 76 65 5f 6c 69 6b 65 3d 6f 66 66  nsitive_like=off
28a0: 7d 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f 6c  }.  set sqlite_l
28b0: 69 6b 65 5f 63 6f 75 6e 74 20 30 0a 20 20 71 75  ike_count 0.  qu
28c0: 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45  eryplan {.    SE
28d0: 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20 57  LECT x FROM t1 W
28e0: 48 45 52 45 20 78 20 4c 49 4b 45 20 27 41 42 43  HERE x LIKE 'ABC
28f0: 25 27 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20  %' ORDER BY 1.  
2900: 7d 0a 7d 20 7b 41 42 43 20 7b 41 42 43 20 61 62  }.} {ABC {ABC ab
2910: 63 20 78 79 7a 7d 20 61 62 63 20 61 62 63 64 20  c xyz} abc abcd 
2920: 6e 6f 73 6f 72 74 20 7b 7d 20 69 31 7d 0a 64 6f  nosort {} i1}.do
2930: 5f 74 65 73 74 20 6c 69 6b 65 2d 35 2e 31 32 20  _test like-5.12 
2940: 7b 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f 6c  {.  set sqlite_l
2950: 69 6b 65 5f 63 6f 75 6e 74 0a 7d 20 31 32 0a 64  ike_count.} 12.d
2960: 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 35 2e 31 33  o_test like-5.13
2970: 20 7b 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f   {.  set sqlite_
2980: 6c 69 6b 65 5f 63 6f 75 6e 74 20 30 0a 20 20 71  like_count 0.  q
2990: 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53  ueryplan {.    S
29a0: 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 32 20  ELECT x FROM t2 
29b0: 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27 41 42  WHERE x LIKE 'AB
29c0: 43 25 27 20 4f 52 44 45 52 20 42 59 20 31 0a 20  C%' ORDER BY 1. 
29d0: 20 7d 0a 7d 20 7b 61 62 63 20 41 42 43 20 7b 41   }.} {abc ABC {A
29e0: 42 43 20 61 62 63 20 78 79 7a 7d 20 61 62 63 64  BC abc xyz} abcd
29f0: 20 6e 6f 73 6f 72 74 20 7b 7d 20 69 32 7d 0a 64   nosort {} i2}.d
2a00: 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 35 2e 31 34  o_test like-5.14
2a10: 20 7b 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f   {.  set sqlite_
2a20: 6c 69 6b 65 5f 63 6f 75 6e 74 0a 7d 20 30 0a 64  like_count.} 0.d
2a30: 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 35 2e 31 35  o_test like-5.15
2a40: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
2a50: 20 20 20 50 52 41 47 4d 41 20 63 61 73 65 5f 73     PRAGMA case_s
2a60: 65 6e 73 69 74 69 76 65 5f 6c 69 6b 65 3d 6f 6e  ensitive_like=on
2a70: 3b 0a 20 20 7d 0a 20 20 73 65 74 20 73 71 6c 69  ;.  }.  set sqli
2a80: 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 20 30 0a  te_like_count 0.
2a90: 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20    queryplan {.  
2aa0: 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20    SELECT x FROM 
2ab0: 74 32 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20  t2 WHERE x LIKE 
2ac0: 27 41 42 43 25 27 20 4f 52 44 45 52 20 42 59 20  'ABC%' ORDER BY 
2ad0: 31 0a 20 20 7d 0a 7d 20 7b 41 42 43 20 7b 41 42  1.  }.} {ABC {AB
2ae0: 43 20 61 62 63 20 78 79 7a 7d 20 6e 6f 73 6f 72  C abc xyz} nosor
2af0: 74 20 7b 7d 20 69 32 7d 0a 64 6f 5f 74 65 73 74  t {} i2}.do_test
2b00: 20 6c 69 6b 65 2d 35 2e 31 36 20 7b 0a 20 20 73   like-5.16 {.  s
2b10: 65 74 20 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63  et sqlite_like_c
2b20: 6f 75 6e 74 0a 7d 20 31 32 0a 64 6f 5f 74 65 73  ount.} 12.do_tes
2b30: 74 20 6c 69 6b 65 2d 35 2e 31 37 20 7b 0a 20 20  t like-5.17 {.  
2b40: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
2b50: 41 47 4d 41 20 63 61 73 65 5f 73 65 6e 73 69 74  AGMA case_sensit
2b60: 69 76 65 5f 6c 69 6b 65 3d 6f 66 66 3b 0a 20 20  ive_like=off;.  
2b70: 7d 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f 6c  }.  set sqlite_l
2b80: 69 6b 65 5f 63 6f 75 6e 74 20 30 0a 20 20 71 75  ike_count 0.  qu
2b90: 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45  eryplan {.    SE
2ba0: 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 32 20 57  LECT x FROM t2 W
2bb0: 48 45 52 45 20 78 20 47 4c 4f 42 20 27 41 42 43  HERE x GLOB 'ABC
2bc0: 2a 27 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20  *' ORDER BY 1.  
2bd0: 7d 0a 7d 20 7b 41 42 43 20 7b 41 42 43 20 61 62  }.} {ABC {ABC ab
2be0: 63 20 78 79 7a 7d 20 6e 6f 73 6f 72 74 20 7b 7d  c xyz} nosort {}
2bf0: 20 69 32 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b   i2}.do_test lik
2c00: 65 2d 35 2e 31 38 20 7b 0a 20 20 73 65 74 20 73  e-5.18 {.  set s
2c10: 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74  qlite_like_count
2c20: 0a 7d 20 31 32 0a 0a 23 20 42 6f 75 6e 64 61 72  .} 12..# Boundar
2c30: 79 20 63 61 73 65 2e 20 20 54 68 65 20 70 72 65  y case.  The pre
2c40: 66 69 78 20 66 6f 72 20 61 20 4c 49 4b 45 20 63  fix for a LIKE c
2c50: 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 72 6f 75  omparison is rou
2c60: 6e 64 65 64 20 75 70 0a 23 20 77 68 65 6e 20 63  nded up.# when c
2c70: 6f 6e 73 74 72 75 63 74 69 6e 67 20 74 68 65 20  onstructing the 
2c80: 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 45 78 61  comparison.  Exa
2c90: 6d 70 6c 65 3a 20 20 22 61 62 22 20 62 65 63 6f  mple:  "ab" beco
2ca0: 6d 65 73 20 22 61 63 22 2e 0a 23 20 49 6e 20 6f  mes "ac"..# In o
2cb0: 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20  ther words, the 
2cc0: 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20 69  last character i
2cd0: 73 20 69 6e 63 72 65 61 73 65 64 20 62 79 20 6f  s increased by o
2ce0: 6e 65 2e 0a 23 0a 23 20 4d 61 6b 65 20 73 75 72  ne..#.# Make sur
2cf0: 65 20 74 68 69 73 20 68 61 70 70 65 6e 73 20 63  e this happens c
2d00: 6f 72 72 65 63 74 6c 79 20 77 68 65 6e 20 74 68  orrectly when th
2d10: 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72  e last character
2d20: 20 69 73 20 61 20 0a 23 20 22 7a 22 20 61 6e 64   is a .# "z" and
2d30: 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 63 61   we are doing ca
2d40: 73 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 20 63  se-insensitive c
2d50: 6f 6d 70 61 72 69 73 6f 6e 73 2e 0a 23 0a 23 20  omparisons..#.# 
2d60: 54 69 63 6b 65 74 20 23 32 39 35 39 0a 23 0a 64  Ticket #2959.#.d
2d70: 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 35 2e 32 31  o_test like-5.21
2d80: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
2d90: 20 20 20 50 52 41 47 4d 41 20 63 61 73 65 5f 73     PRAGMA case_s
2da0: 65 6e 73 69 74 69 76 65 5f 6c 69 6b 65 3d 6f 66  ensitive_like=of
2db0: 66 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  f;.    INSERT IN
2dc0: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27 5a 5a  TO t2 VALUES('ZZ
2dd0: 2d 75 70 70 65 72 2d 75 70 70 65 72 27 29 3b 0a  -upper-upper');.
2de0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2df0: 74 32 20 56 41 4c 55 45 53 28 27 7a 5a 2d 6c 6f  t2 VALUES('zZ-lo
2e00: 77 65 72 2d 75 70 70 65 72 27 29 3b 0a 20 20 20  wer-upper');.   
2e10: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
2e20: 56 41 4c 55 45 53 28 27 5a 7a 2d 75 70 70 65 72  VALUES('Zz-upper
2e30: 2d 6c 6f 77 65 72 27 29 3b 0a 20 20 20 20 49 4e  -lower');.    IN
2e40: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
2e50: 55 45 53 28 27 7a 7a 2d 6c 6f 77 65 72 2d 6c 6f  UES('zz-lower-lo
2e60: 77 65 72 27 29 3b 0a 20 20 7d 0a 20 20 71 75 65  wer');.  }.  que
2e70: 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c  ryplan {.    SEL
2e80: 45 43 54 20 78 20 46 52 4f 4d 20 74 32 20 57 48  ECT x FROM t2 WH
2e90: 45 52 45 20 78 20 4c 49 4b 45 20 27 7a 7a 25 27  ERE x LIKE 'zz%'
2ea0: 3b 0a 20 20 7d 0a 7d 20 7b 7a 7a 2d 6c 6f 77 65  ;.  }.} {zz-lowe
2eb0: 72 2d 6c 6f 77 65 72 20 7a 5a 2d 6c 6f 77 65 72  r-lower zZ-lower
2ec0: 2d 75 70 70 65 72 20 5a 7a 2d 75 70 70 65 72 2d  -upper Zz-upper-
2ed0: 6c 6f 77 65 72 20 5a 5a 2d 75 70 70 65 72 2d 75  lower ZZ-upper-u
2ee0: 70 70 65 72 20 6e 6f 73 6f 72 74 20 7b 7d 20 69  pper nosort {} i
2ef0: 32 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d  2}.do_test like-
2f00: 35 2e 32 32 20 7b 0a 20 20 71 75 65 72 79 70 6c  5.22 {.  querypl
2f10: 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  an {.    SELECT 
2f20: 78 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20  x FROM t2 WHERE 
2f30: 78 20 4c 49 4b 45 20 27 7a 5a 25 27 3b 0a 20 20  x LIKE 'zZ%';.  
2f40: 7d 0a 7d 20 7b 7a 7a 2d 6c 6f 77 65 72 2d 6c 6f  }.} {zz-lower-lo
2f50: 77 65 72 20 7a 5a 2d 6c 6f 77 65 72 2d 75 70 70  wer zZ-lower-upp
2f60: 65 72 20 5a 7a 2d 75 70 70 65 72 2d 6c 6f 77 65  er Zz-upper-lowe
2f70: 72 20 5a 5a 2d 75 70 70 65 72 2d 75 70 70 65 72  r ZZ-upper-upper
2f80: 20 6e 6f 73 6f 72 74 20 7b 7d 20 69 32 7d 0a 64   nosort {} i2}.d
2f90: 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 35 2e 32 33  o_test like-5.23
2fa0: 20 7b 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b   {.  queryplan {
2fb0: 0a 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52  .    SELECT x FR
2fc0: 4f 4d 20 74 32 20 57 48 45 52 45 20 78 20 4c 49  OM t2 WHERE x LI
2fd0: 4b 45 20 27 5a 7a 25 27 3b 0a 20 20 7d 0a 7d 20  KE 'Zz%';.  }.} 
2fe0: 7b 7a 7a 2d 6c 6f 77 65 72 2d 6c 6f 77 65 72 20  {zz-lower-lower 
2ff0: 7a 5a 2d 6c 6f 77 65 72 2d 75 70 70 65 72 20 5a  zZ-lower-upper Z
3000: 7a 2d 75 70 70 65 72 2d 6c 6f 77 65 72 20 5a 5a  z-upper-lower ZZ
3010: 2d 75 70 70 65 72 2d 75 70 70 65 72 20 6e 6f 73  -upper-upper nos
3020: 6f 72 74 20 7b 7d 20 69 32 7d 0a 64 6f 5f 74 65  ort {} i2}.do_te
3030: 73 74 20 6c 69 6b 65 2d 35 2e 32 34 20 7b 0a 20  st like-5.24 {. 
3040: 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20   queryplan {.   
3050: 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74   SELECT x FROM t
3060: 32 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27  2 WHERE x LIKE '
3070: 5a 5a 25 27 3b 0a 20 20 7d 0a 7d 20 7b 7a 7a 2d  ZZ%';.  }.} {zz-
3080: 6c 6f 77 65 72 2d 6c 6f 77 65 72 20 7a 5a 2d 6c  lower-lower zZ-l
3090: 6f 77 65 72 2d 75 70 70 65 72 20 5a 7a 2d 75 70  ower-upper Zz-up
30a0: 70 65 72 2d 6c 6f 77 65 72 20 5a 5a 2d 75 70 70  per-lower ZZ-upp
30b0: 65 72 2d 75 70 70 65 72 20 6e 6f 73 6f 72 74 20  er-upper nosort 
30c0: 7b 7d 20 69 32 7d 0a 64 6f 5f 74 65 73 74 20 6c  {} i2}.do_test l
30d0: 69 6b 65 2d 35 2e 32 35 20 7b 0a 20 20 64 62 20  ike-5.25 {.  db 
30e0: 65 76 61 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  eval {.    PRAGM
30f0: 41 20 63 61 73 65 5f 73 65 6e 73 69 74 69 76 65  A case_sensitive
3100: 5f 6c 69 6b 65 3d 6f 6e 3b 0a 20 20 20 20 43 52  _like=on;.    CR
3110: 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 78 20  EATE TABLE t3(x 
3120: 54 45 58 54 29 3b 0a 20 20 20 20 43 52 45 41 54  TEXT);.    CREAT
3130: 45 20 49 4e 44 45 58 20 69 33 20 4f 4e 20 74 33  E INDEX i3 ON t3
3140: 28 78 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  (x);.    INSERT 
3150: 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 27  INTO t3 VALUES('
3160: 5a 5a 2d 75 70 70 65 72 2d 75 70 70 65 72 27 29  ZZ-upper-upper')
3170: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
3180: 4f 20 74 33 20 56 41 4c 55 45 53 28 27 7a 5a 2d  O t3 VALUES('zZ-
3190: 6c 6f 77 65 72 2d 75 70 70 65 72 27 29 3b 0a 20  lower-upper');. 
31a0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
31b0: 33 20 56 41 4c 55 45 53 28 27 5a 7a 2d 75 70 70  3 VALUES('Zz-upp
31c0: 65 72 2d 6c 6f 77 65 72 27 29 3b 0a 20 20 20 20  er-lower');.    
31d0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56  INSERT INTO t3 V
31e0: 41 4c 55 45 53 28 27 7a 7a 2d 6c 6f 77 65 72 2d  ALUES('zz-lower-
31f0: 6c 6f 77 65 72 27 29 3b 0a 20 20 7d 0a 20 20 71  lower');.  }.  q
3200: 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53  ueryplan {.    S
3210: 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 33 20  ELECT x FROM t3 
3220: 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27 7a 7a  WHERE x LIKE 'zz
3230: 25 27 3b 0a 20 20 7d 0a 7d 20 7b 7a 7a 2d 6c 6f  %';.  }.} {zz-lo
3240: 77 65 72 2d 6c 6f 77 65 72 20 6e 6f 73 6f 72 74  wer-lower nosort
3250: 20 7b 7d 20 69 33 7d 0a 64 6f 5f 74 65 73 74 20   {} i3}.do_test 
3260: 6c 69 6b 65 2d 35 2e 32 36 20 7b 0a 20 20 71 75  like-5.26 {.  qu
3270: 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45  eryplan {.    SE
3280: 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 33 20 57  LECT x FROM t3 W
3290: 48 45 52 45 20 78 20 4c 49 4b 45 20 27 7a 5a 25  HERE x LIKE 'zZ%
32a0: 27 3b 0a 20 20 7d 0a 7d 20 7b 7a 5a 2d 6c 6f 77  ';.  }.} {zZ-low
32b0: 65 72 2d 75 70 70 65 72 20 6e 6f 73 6f 72 74 20  er-upper nosort 
32c0: 7b 7d 20 69 33 7d 0a 64 6f 5f 74 65 73 74 20 6c  {} i3}.do_test l
32d0: 69 6b 65 2d 35 2e 32 37 20 7b 0a 20 20 71 75 65  ike-5.27 {.  que
32e0: 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c  ryplan {.    SEL
32f0: 45 43 54 20 78 20 46 52 4f 4d 20 74 33 20 57 48  ECT x FROM t3 WH
3300: 45 52 45 20 78 20 4c 49 4b 45 20 27 5a 7a 25 27  ERE x LIKE 'Zz%'
3310: 3b 0a 20 20 7d 0a 7d 20 7b 5a 7a 2d 75 70 70 65  ;.  }.} {Zz-uppe
3320: 72 2d 6c 6f 77 65 72 20 6e 6f 73 6f 72 74 20 7b  r-lower nosort {
3330: 7d 20 69 33 7d 0a 64 6f 5f 74 65 73 74 20 6c 69  } i3}.do_test li
3340: 6b 65 2d 35 2e 32 38 20 7b 0a 20 20 71 75 65 72  ke-5.28 {.  quer
3350: 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45  yplan {.    SELE
3360: 43 54 20 78 20 46 52 4f 4d 20 74 33 20 57 48 45  CT x FROM t3 WHE
3370: 52 45 20 78 20 4c 49 4b 45 20 27 5a 5a 25 27 3b  RE x LIKE 'ZZ%';
3380: 0a 20 20 7d 0a 7d 20 7b 5a 5a 2d 75 70 70 65 72  .  }.} {ZZ-upper
3390: 2d 75 70 70 65 72 20 6e 6f 73 6f 72 74 20 7b 7d  -upper nosort {}
33a0: 20 69 33 7d 0a 0a 0a 23 20 74 69 63 6b 65 74 20   i3}...# ticket 
33b0: 23 32 34 30 37 0a 23 0a 23 20 4d 61 6b 65 20 73  #2407.#.# Make s
33c0: 75 72 65 20 74 68 65 20 4c 49 4b 45 20 70 72 65  ure the LIKE pre
33d0: 66 69 78 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  fix optimization
33e0: 20 64 6f 65 73 20 6e 6f 74 20 73 74 72 69 70 20   does not strip 
33f0: 6f 66 66 20 6c 65 61 64 69 6e 67 0a 23 20 63 68  off leading.# ch
3400: 61 72 61 63 74 65 72 73 20 6f 66 20 74 68 65 20  aracters of the 
3410: 6c 69 6b 65 20 70 61 74 74 65 72 6e 20 74 68 61  like pattern tha
3420: 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65 20 71  t happen to be q
3430: 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 73 2e  uote characters.
3440: 0a 23 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d  .#.do_test like-
3450: 36 2e 31 20 7b 0a 20 20 66 6f 72 65 61 63 68 20  6.1 {.  foreach 
3460: 78 20 7b 20 27 61 62 63 20 27 62 63 64 20 27 64  x { 'abc 'bcd 'd
3470: 65 66 20 27 61 78 20 7d 20 7b 0a 20 20 20 20 73  ef 'ax } {.    s
3480: 65 74 20 78 32 20 27 5b 73 74 72 69 6e 67 20 6d  et x2 '[string m
3490: 61 70 20 7b 27 20 27 27 7d 20 24 78 5d 27 0a 20  ap {' ''} $x]'. 
34a0: 20 20 20 64 62 20 65 76 61 6c 20 22 49 4e 53 45     db eval "INSE
34b0: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
34c0: 53 28 24 78 32 29 22 0a 20 20 7d 0a 20 20 65 78  S($x2)".  }.  ex
34d0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  ecsql {.    SELE
34e0: 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 57 48 45  CT * FROM t2 WHE
34f0: 52 45 20 78 20 4c 49 4b 45 20 27 27 27 61 25 27  RE x LIKE '''a%'
3500: 0a 20 20 7d 0a 7d 20 7b 27 61 62 63 20 27 61 78  .  }.} {'abc 'ax
3510: 7d 0a 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d  }..do_test like-
3520: 37 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  7.1 {.  execsql 
3530: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 72 6f 77  {.    SELECT row
3540: 69 64 2c 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  id, * FROM t1 WH
3550: 45 52 45 20 72 6f 77 69 64 20 47 4c 4f 42 20 27  ERE rowid GLOB '
3560: 31 2a 27 20 4f 52 44 45 52 20 42 59 20 72 6f 77  1*' ORDER BY row
3570: 69 64 3b 0a 20 20 7d 0a 7d 20 7b 31 20 61 20 31  id;.  }.} {1 a 1
3580: 30 20 41 42 43 20 31 31 20 43 44 45 20 31 32 20  0 ABC 11 CDE 12 
3590: 7b 41 42 43 20 61 62 63 20 78 79 7a 7d 7d 0a 0a  {ABC abc xyz}}..
35a0: 23 20 74 69 63 6b 65 74 20 23 33 33 34 35 2e 0a  # ticket #3345..
35b0: 23 0a 23 20 4f 76 65 72 6c 6f 61 64 69 6e 67 20  #.# Overloading 
35c0: 74 68 65 20 4c 49 4b 45 20 66 75 6e 63 74 69 6f  the LIKE functio
35d0: 6e 20 77 69 74 68 20 2d 31 20 66 6f 72 20 74 68  n with -1 for th
35e0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  e number of argu
35f0: 6d 65 6e 74 73 0a 23 20 77 69 6c 6c 20 6f 76 65  ments.# will ove
3600: 72 6c 6f 61 64 20 62 6f 74 68 20 74 68 65 20 32  rload both the 2
3610: 2d 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 74 68  -argument and th
3620: 65 20 33 2d 61 72 67 75 6d 65 6e 74 20 4c 49 4b  e 3-argument LIK
3630: 45 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 6c 69 6b  E..#.do_test lik
3640: 65 2d 38 2e 31 20 7b 0a 20 20 64 62 20 65 76 61  e-8.1 {.  db eva
3650: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
3660: 41 42 4c 45 20 74 38 28 78 29 3b 0a 20 20 20 20  ABLE t8(x);.    
3670: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 38 20 56  INSERT INTO t8 V
3680: 41 4c 55 45 53 28 27 61 62 63 64 65 66 27 29 3b  ALUES('abcdef');
3690: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
36a0: 20 74 38 20 56 41 4c 55 45 53 28 27 67 68 69 6a   t8 VALUES('ghij
36b0: 6b 6c 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  kl');.    INSERT
36c0: 20 49 4e 54 4f 20 74 38 20 56 41 4c 55 45 53 28   INTO t8 VALUES(
36d0: 27 6d 6e 6f 70 71 72 27 29 3b 0a 20 20 20 20 53  'mnopqr');.    S
36e0: 45 4c 45 43 54 20 31 2c 20 78 20 46 52 4f 4d 20  ELECT 1, x FROM 
36f0: 74 38 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20  t8 WHERE x LIKE 
3700: 27 25 68 25 27 3b 0a 20 20 20 20 53 45 4c 45 43  '%h%';.    SELEC
3710: 54 20 32 2c 20 78 20 46 52 4f 4d 20 74 38 20 57  T 2, x FROM t8 W
3720: 48 45 52 45 20 78 20 4c 49 4b 45 20 27 25 68 25  HERE x LIKE '%h%
3730: 27 20 45 53 43 41 50 45 20 27 78 27 3b 0a 20 20  ' ESCAPE 'x';.  
3740: 7d 0a 7d 20 7b 31 20 67 68 69 6a 6b 6c 20 32 20  }.} {1 ghijkl 2 
3750: 67 68 69 6a 6b 6c 7d 0a 64 6f 5f 74 65 73 74 20  ghijkl}.do_test 
3760: 6c 69 6b 65 2d 38 2e 32 20 7b 0a 20 20 70 72 6f  like-8.2 {.  pro
3770: 63 20 6e 65 77 6c 69 6b 65 20 7b 61 72 67 73 7d  c newlike {args}
3780: 20 7b 72 65 74 75 72 6e 20 31 7d 20 3b 23 20 41   {return 1} ;# A
3790: 6c 74 65 72 6e 61 74 69 76 65 20 4c 49 4b 45 20  lternative LIKE 
37a0: 69 73 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e  is always return
37b0: 20 54 52 55 45 0a 20 20 64 62 20 66 75 6e 63 74   TRUE.  db funct
37c0: 69 6f 6e 20 6c 69 6b 65 20 6e 65 77 6c 69 6b 65  ion like newlike
37d0: 20 20 20 20 20 20 20 3b 23 20 55 73 65 73 20 2d         ;# Uses -
37e0: 31 20 66 6f 72 20 6e 41 72 67 20 69 6e 20 73 71  1 for nArg in sq
37f0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
3800: 63 74 69 6f 6e 0a 20 20 64 62 20 63 61 63 68 65  ction.  db cache
3810: 20 66 6c 75 73 68 0a 20 20 64 62 20 65 76 61 6c   flush.  db eval
3820: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 31 2c   {.    SELECT 1,
3830: 20 78 20 46 52 4f 4d 20 74 38 20 57 48 45 52 45   x FROM t8 WHERE
3840: 20 78 20 4c 49 4b 45 20 27 25 68 25 27 3b 0a 20   x LIKE '%h%';. 
3850: 20 20 20 53 45 4c 45 43 54 20 32 2c 20 78 20 46     SELECT 2, x F
3860: 52 4f 4d 20 74 38 20 57 48 45 52 45 20 78 20 4c  ROM t8 WHERE x L
3870: 49 4b 45 20 27 25 68 25 27 20 45 53 43 41 50 45  IKE '%h%' ESCAPE
3880: 20 27 78 27 3b 0a 20 20 7d 0a 7d 20 7b 31 20 67   'x';.  }.} {1 g
3890: 68 69 6a 6b 6c 20 32 20 67 68 69 6a 6b 6c 7d 0a  hijkl 2 ghijkl}.
38a0: 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 38 2e 33  do_test like-8.3
38b0: 20 7b 0a 20 20 64 62 20 66 75 6e 63 74 69 6f 6e   {.  db function
38c0: 20 6c 69 6b 65 20 2d 61 72 67 63 6f 75 6e 74 20   like -argcount 
38d0: 32 20 6e 65 77 6c 69 6b 65 0a 20 20 64 62 20 65  2 newlike.  db e
38e0: 76 61 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  val {.    SELECT
38f0: 20 31 2c 20 78 20 46 52 4f 4d 20 74 38 20 57 48   1, x FROM t8 WH
3900: 45 52 45 20 78 20 4c 49 4b 45 20 27 25 68 25 27  ERE x LIKE '%h%'
3910: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 32 2c 20  ;.    SELECT 2, 
3920: 78 20 46 52 4f 4d 20 74 38 20 57 48 45 52 45 20  x FROM t8 WHERE 
3930: 78 20 4c 49 4b 45 20 27 25 68 25 27 20 45 53 43  x LIKE '%h%' ESC
3940: 41 50 45 20 27 78 27 3b 0a 20 20 7d 0a 7d 20 7b  APE 'x';.  }.} {
3950: 31 20 61 62 63 64 65 66 20 31 20 67 68 69 6a 6b  1 abcdef 1 ghijk
3960: 6c 20 31 20 6d 6e 6f 70 71 72 20 32 20 67 68 69  l 1 mnopqr 2 ghi
3970: 6a 6b 6c 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b  jkl}.do_test lik
3980: 65 2d 38 2e 34 20 7b 0a 20 20 64 62 20 66 75 6e  e-8.4 {.  db fun
3990: 63 74 69 6f 6e 20 6c 69 6b 65 20 2d 61 72 67 63  ction like -argc
39a0: 6f 75 6e 74 20 33 20 6e 65 77 6c 69 6b 65 0a 20  ount 3 newlike. 
39b0: 20 64 62 20 65 76 61 6c 20 7b 0a 20 20 20 20 53   db eval {.    S
39c0: 45 4c 45 43 54 20 31 2c 20 78 20 46 52 4f 4d 20  ELECT 1, x FROM 
39d0: 74 38 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20  t8 WHERE x LIKE 
39e0: 27 25 68 25 27 3b 0a 20 20 20 20 53 45 4c 45 43  '%h%';.    SELEC
39f0: 54 20 32 2c 20 78 20 46 52 4f 4d 20 74 38 20 57  T 2, x FROM t8 W
3a00: 48 45 52 45 20 78 20 4c 49 4b 45 20 27 25 68 25  HERE x LIKE '%h%
3a10: 27 20 45 53 43 41 50 45 20 27 78 27 3b 0a 20 20  ' ESCAPE 'x';.  
3a20: 7d 0a 7d 20 7b 31 20 61 62 63 64 65 66 20 31 20  }.} {1 abcdef 1 
3a30: 67 68 69 6a 6b 6c 20 31 20 6d 6e 6f 70 71 72 20  ghijkl 1 mnopqr 
3a40: 32 20 61 62 63 64 65 66 20 32 20 67 68 69 6a 6b  2 abcdef 2 ghijk
3a50: 6c 20 32 20 6d 6e 6f 70 71 72 7d 0a 0a 0a 69 66  l 2 mnopqr}...if
3a60: 63 61 70 61 62 6c 65 20 6c 69 6b 65 5f 6f 70 74  capable like_opt
3a70: 26 26 21 69 63 75 20 7b 0a 20 20 23 20 45 76 61  &&!icu {.  # Eva
3a80: 6c 75 61 74 65 20 53 51 4c 2e 20 20 52 65 74 75  luate SQL.  Retu
3a90: 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  rn the result se
3aa0: 74 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 68  t followed by th
3ab0: 65 0a 20 20 23 20 61 6e 64 20 74 68 65 20 6e 75  e.  # and the nu
3ac0: 6d 62 65 72 20 6f 66 20 66 75 6c 6c 2d 73 63 61  mber of full-sca
3ad0: 6e 20 73 74 65 70 73 2e 0a 20 20 23 0a 20 20 64  n steps..  #.  d
3ae0: 62 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69 74 65  b close.  sqlite
3af0: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 70  3 db test.db.  p
3b00: 72 6f 63 20 63 6f 75 6e 74 5f 73 74 65 70 73 20  roc count_steps 
3b10: 7b 73 71 6c 7d 20 7b 0a 20 20 20 20 73 65 74 20  {sql} {.    set 
3b20: 72 20 5b 64 62 20 65 76 61 6c 20 24 73 71 6c 5d  r [db eval $sql]
3b30: 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 72 20 73  .    lappend r s
3b40: 63 61 6e 20 5b 64 62 20 73 74 61 74 75 73 20 73  can [db status s
3b50: 74 65 70 5d 20 73 6f 72 74 20 5b 64 62 20 73 74  tep] sort [db st
3b60: 61 74 75 73 20 73 6f 72 74 5d 0a 20 20 7d 0a 20  atus sort].  }. 
3b70: 20 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 39 2e   do_test like-9.
3b80: 31 20 7b 0a 20 20 20 20 63 6f 75 6e 74 5f 73 74  1 {.    count_st
3b90: 65 70 73 20 7b 0a 20 20 20 20 20 20 20 53 45 4c  eps {.       SEL
3ba0: 45 43 54 20 78 20 46 52 4f 4d 20 74 32 20 57 48  ECT x FROM t2 WH
3bb0: 45 52 45 20 78 20 4c 49 4b 45 20 27 78 25 27 0a  ERE x LIKE 'x%'.
3bc0: 20 20 20 20 7d 0a 20 20 7d 20 7b 78 79 7a 20 73      }.  } {xyz s
3bd0: 63 61 6e 20 30 20 73 6f 72 74 20 30 7d 0a 20 20  can 0 sort 0}.  
3be0: 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 39 2e 32  do_test like-9.2
3bf0: 20 7b 0a 20 20 20 20 63 6f 75 6e 74 5f 73 74 65   {.    count_ste
3c00: 70 73 20 7b 0a 20 20 20 20 20 20 20 53 45 4c 45  ps {.       SELE
3c10: 43 54 20 78 20 46 52 4f 4d 20 74 32 20 57 48 45  CT x FROM t2 WHE
3c20: 52 45 20 78 20 4c 49 4b 45 20 27 5f 79 25 27 0a  RE x LIKE '_y%'.
3c30: 20 20 20 20 7d 0a 20 20 7d 20 7b 78 79 7a 20 73      }.  } {xyz s
3c40: 63 61 6e 20 31 39 20 73 6f 72 74 20 30 7d 0a 20  can 19 sort 0}. 
3c50: 20 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 39 2e   do_test like-9.
3c60: 33 2e 31 20 7b 0a 20 20 20 20 73 65 74 20 72 65  3.1 {.    set re
3c70: 73 20 5b 73 71 6c 69 74 65 33 5f 65 78 65 63 5f  s [sqlite3_exec_
3c80: 68 65 78 20 64 62 20 7b 0a 20 20 20 20 20 20 20  hex db {.       
3c90: 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 32  SELECT x FROM t2
3ca0: 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27 25   WHERE x LIKE '%
3cb0: 37 38 25 32 35 27 0a 20 20 20 20 7d 5d 0a 20 20  78%25'.    }].  
3cc0: 7d 20 7b 30 20 7b 78 20 78 79 7a 7d 7d 0a 20 20  } {0 {x xyz}}.  
3cd0: 69 66 63 61 70 61 62 6c 65 20 65 78 70 6c 61 69  ifcapable explai
3ce0: 6e 20 7b 0a 20 20 20 20 64 6f 5f 74 65 73 74 20  n {.    do_test 
3cf0: 6c 69 6b 65 2d 39 2e 33 2e 32 20 7b 0a 20 20 20  like-9.3.2 {.   
3d00: 20 20 20 73 65 74 20 72 65 73 20 5b 73 71 6c 69     set res [sqli
3d10: 74 65 33 5f 65 78 65 63 5f 68 65 78 20 64 62 20  te3_exec_hex db 
3d20: 7b 0a 20 20 20 20 20 20 20 20 20 45 58 50 4c 41  {.         EXPLA
3d30: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 53 45  IN QUERY PLAN SE
3d40: 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 32 20 57  LECT x FROM t2 W
3d50: 48 45 52 45 20 78 20 4c 49 4b 45 20 27 25 37 38  HERE x LIKE '%78
3d60: 25 32 35 27 0a 20 20 20 20 20 20 7d 5d 0a 20 20  %25'.      }].  
3d70: 20 20 20 20 72 65 67 65 78 70 20 7b 49 4e 44 45      regexp {INDE
3d80: 58 20 69 32 7d 20 24 72 65 73 0a 20 20 20 20 7d  X i2} $res.    }
3d90: 20 7b 31 7d 0a 20 20 7d 0a 20 20 64 6f 5f 74 65   {1}.  }.  do_te
3da0: 73 74 20 6c 69 6b 65 2d 39 2e 34 2e 31 20 7b 0a  st like-9.4.1 {.
3db0: 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63      sqlite3_exec
3dc0: 5f 68 65 78 20 64 62 20 7b 49 4e 53 45 52 54 20  _hex db {INSERT 
3dd0: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27  INTO t2 VALUES('
3de0: 25 66 66 68 65 6c 6c 6f 27 29 7d 0a 20 20 20 20  %ffhello')}.    
3df0: 73 65 74 20 72 65 73 20 5b 73 71 6c 69 74 65 33  set res [sqlite3
3e00: 5f 65 78 65 63 5f 68 65 78 20 64 62 20 7b 0a 20  _exec_hex db {. 
3e10: 20 20 20 20 20 20 53 45 4c 45 43 54 20 73 75 62        SELECT sub
3e20: 73 74 72 28 78 2c 32 29 20 41 53 20 78 20 46 52  str(x,2) AS x FR
3e30: 4f 4d 20 74 32 20 57 48 45 52 45 20 2b 78 20 4c  OM t2 WHERE +x L
3e40: 49 4b 45 20 27 25 66 66 25 32 35 27 0a 20 20 20  IKE '%ff%25'.   
3e50: 20 7d 5d 0a 20 20 7d 20 7b 30 20 7b 78 20 68 65   }].  } {0 {x he
3e60: 6c 6c 6f 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20  llo}}.  do_test 
3e70: 6c 69 6b 65 2d 39 2e 34 2e 32 20 7b 0a 20 20 20  like-9.4.2 {.   
3e80: 20 73 65 74 20 72 65 73 20 5b 73 71 6c 69 74 65   set res [sqlite
3e90: 33 5f 65 78 65 63 5f 68 65 78 20 64 62 20 7b 0a  3_exec_hex db {.
3ea0: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 73 75         SELECT su
3eb0: 62 73 74 72 28 78 2c 32 29 20 41 53 20 78 20 46  bstr(x,2) AS x F
3ec0: 52 4f 4d 20 74 32 20 57 48 45 52 45 20 78 20 4c  ROM t2 WHERE x L
3ed0: 49 4b 45 20 27 25 66 66 25 32 35 27 0a 20 20 20  IKE '%ff%25'.   
3ee0: 20 7d 5d 0a 20 20 7d 20 7b 30 20 7b 78 20 68 65   }].  } {0 {x he
3ef0: 6c 6c 6f 7d 7d 0a 20 20 69 66 63 61 70 61 62 6c  llo}}.  ifcapabl
3f00: 65 20 65 78 70 6c 61 69 6e 20 7b 0a 20 20 20 20  e explain {.    
3f10: 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 39 2e 34  do_test like-9.4
3f20: 2e 33 20 7b 0a 20 20 20 20 20 20 73 65 74 20 72  .3 {.      set r
3f30: 65 73 20 5b 73 71 6c 69 74 65 33 5f 65 78 65 63  es [sqlite3_exec
3f40: 5f 68 65 78 20 64 62 20 7b 0a 20 20 20 20 20 20  _hex db {.      
3f50: 20 20 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59     EXPLAIN QUERY
3f60: 20 50 4c 41 4e 20 53 45 4c 45 43 54 20 78 20 46   PLAN SELECT x F
3f70: 52 4f 4d 20 74 32 20 57 48 45 52 45 20 78 20 4c  ROM t2 WHERE x L
3f80: 49 4b 45 20 27 25 66 66 25 32 35 27 0a 20 20 20  IKE '%ff%25'.   
3f90: 20 20 20 7d 5d 0a 20 20 20 20 20 20 72 65 67 65     }].      rege
3fa0: 78 70 20 7b 53 43 41 4e 20 54 41 42 4c 45 20 74  xp {SCAN TABLE t
3fb0: 32 7d 20 24 72 65 73 0a 20 20 20 20 7d 20 7b 31  2} $res.    } {1
3fc0: 7d 0a 20 20 7d 0a 20 20 64 6f 5f 74 65 73 74 20  }.  }.  do_test 
3fd0: 6c 69 6b 65 2d 39 2e 35 2e 31 20 7b 0a 20 20 20  like-9.5.1 {.   
3fe0: 20 73 65 74 20 72 65 73 20 5b 73 71 6c 69 74 65   set res [sqlite
3ff0: 33 5f 65 78 65 63 5f 68 65 78 20 64 62 20 7b 0a  3_exec_hex db {.
4000: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 78 20         SELECT x 
4010: 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 78 20  FROM t2 WHERE x 
4020: 4c 49 4b 45 20 27 25 66 65 25 32 35 27 0a 20 20  LIKE '%fe%25'.  
4030: 20 20 7d 5d 0a 20 20 7d 20 7b 30 20 7b 7d 7d 0a    }].  } {0 {}}.
4040: 20 20 69 66 63 61 70 61 62 6c 65 20 65 78 70 6c    ifcapable expl
4050: 61 69 6e 20 7b 0a 20 20 20 20 64 6f 5f 74 65 73  ain {.    do_tes
4060: 74 20 6c 69 6b 65 2d 39 2e 35 2e 32 20 7b 0a 20  t like-9.5.2 {. 
4070: 20 20 20 20 20 73 65 74 20 72 65 73 20 5b 73 71       set res [sq
4080: 6c 69 74 65 33 5f 65 78 65 63 5f 68 65 78 20 64  lite3_exec_hex d
4090: 62 20 7b 0a 20 20 20 20 20 20 20 20 20 45 58 50  b {.         EXP
40a0: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
40b0: 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 32  SELECT x FROM t2
40c0: 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27 25   WHERE x LIKE '%
40d0: 66 65 25 32 35 27 0a 20 20 20 20 20 20 7d 5d 0a  fe%25'.      }].
40e0: 20 20 20 20 20 20 72 65 67 65 78 70 20 7b 49 4e        regexp {IN
40f0: 44 45 58 20 69 32 7d 20 24 72 65 73 0a 20 20 20  DEX i2} $res.   
4100: 20 7d 20 7b 31 7d 0a 20 20 7d 0a 0a 20 20 23 20   } {1}.  }..  # 
4110: 44 6f 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d  Do an SQL statem
4120: 65 6e 74 2e 20 20 41 70 70 65 6e 64 20 74 68 65  ent.  Append the
4130: 20 73 65 61 72 63 68 20 63 6f 75 6e 74 20 74 6f   search count to
4140: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
4150: 72 65 73 75 6c 74 2e 0a 20 20 23 0a 20 20 70 72  result..  #.  pr
4160: 6f 63 20 63 6f 75 6e 74 20 73 71 6c 20 7b 0a 20  oc count sql {. 
4170: 20 20 20 73 65 74 20 3a 3a 73 71 6c 69 74 65 5f     set ::sqlite_
4180: 73 65 61 72 63 68 5f 63 6f 75 6e 74 20 30 0a 20  search_count 0. 
4190: 20 20 20 73 65 74 20 3a 3a 73 71 6c 69 74 65 5f     set ::sqlite_
41a0: 6c 69 6b 65 5f 63 6f 75 6e 74 20 30 0a 20 20 20  like_count 0.   
41b0: 20 72 65 74 75 72 6e 20 5b 63 6f 6e 63 61 74 20   return [concat 
41c0: 5b 65 78 65 63 73 71 6c 20 24 73 71 6c 5d 20 73  [execsql $sql] s
41d0: 63 61 6e 20 24 3a 3a 73 71 6c 69 74 65 5f 73 65  can $::sqlite_se
41e0: 61 72 63 68 5f 63 6f 75 6e 74 20 5c 0a 20 20 20  arch_count \.   
41f0: 20 20 20 20 20 20 20 20 20 20 6c 69 6b 65 20 24            like $
4200: 3a 3a 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f  ::sqlite_like_co
4210: 75 6e 74 5d 0a 20 20 7d 0a 0a 20 20 23 20 54 68  unt].  }..  # Th
4220: 65 20 4c 49 4b 45 20 61 6e 64 20 47 4c 4f 42 20  e LIKE and GLOB 
4230: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 64 6f  optimizations do
4240: 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 63 6f 6c   not work on col
4250: 75 6d 6e 73 20 77 69 74 68 0a 20 20 23 20 61 66  umns with.  # af
4260: 66 69 6e 69 74 79 20 6f 74 68 65 72 20 74 68 61  finity other tha
4270: 6e 20 54 45 58 54 2e 0a 20 20 23 20 54 69 63 6b  n TEXT..  # Tick
4280: 65 74 20 23 33 39 30 31 0a 20 20 23 0a 20 20 64  et #3901.  #.  d
4290: 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 31 30 2e 31  o_test like-10.1
42a0: 20 7b 0a 20 20 20 20 64 62 20 63 6c 6f 73 65 0a   {.    db close.
42b0: 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 20 74      sqlite3 db t
42c0: 65 73 74 2e 64 62 0a 20 20 20 20 65 78 65 63 73  est.db.    execs
42d0: 71 6c 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54  ql {.      CREAT
42e0: 45 20 54 41 42 4c 45 20 74 31 30 28 0a 20 20 20  E TABLE t10(.   
42f0: 20 20 20 20 20 61 20 49 4e 54 45 47 45 52 20 50       a INTEGER P
4300: 52 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 20  RIMARY KEY,.    
4310: 20 20 20 20 62 20 49 4e 54 45 47 45 52 20 43 4f      b INTEGER CO
4320: 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 55 4e 49  LLATE nocase UNI
4330: 51 55 45 2c 0a 20 20 20 20 20 20 20 20 63 20 4e  QUE,.        c N
4340: 55 4d 42 45 52 20 43 4f 4c 4c 41 54 45 20 6e 6f  UMBER COLLATE no
4350: 63 61 73 65 20 55 4e 49 51 55 45 2c 0a 20 20 20  case UNIQUE,.   
4360: 20 20 20 20 20 64 20 42 4c 4f 42 20 43 4f 4c 4c       d BLOB COLL
4370: 41 54 45 20 6e 6f 63 61 73 65 20 55 4e 49 51 55  ATE nocase UNIQU
4380: 45 2c 0a 20 20 20 20 20 20 20 20 65 20 43 4f 4c  E,.        e COL
4390: 4c 41 54 45 20 6e 6f 63 61 73 65 20 55 4e 49 51  LATE nocase UNIQ
43a0: 55 45 2c 0a 20 20 20 20 20 20 20 20 66 20 54 45  UE,.        f TE
43b0: 58 54 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73  XT COLLATE nocas
43c0: 65 20 55 4e 49 51 55 45 0a 20 20 20 20 20 20 29  e UNIQUE.      )
43d0: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
43e0: 4e 54 4f 20 74 31 30 20 56 41 4c 55 45 53 28 31  NTO t10 VALUES(1
43f0: 2c 31 2c 31 2c 31 2c 31 2c 31 29 3b 0a 20 20 20  ,1,1,1,1,1);.   
4400: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
4410: 31 30 20 56 41 4c 55 45 53 28 31 32 2c 31 32 2c  10 VALUES(12,12,
4420: 31 32 2c 31 32 2c 31 32 2c 31 32 29 3b 0a 20 20  12,12,12,12);.  
4430: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
4440: 74 31 30 20 56 41 4c 55 45 53 28 31 32 33 2c 31  t10 VALUES(123,1
4450: 32 33 2c 31 32 33 2c 31 32 33 2c 31 32 33 2c 31  23,123,123,123,1
4460: 32 33 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  23);.      INSER
4470: 54 20 49 4e 54 4f 20 74 31 30 20 56 41 4c 55 45  T INTO t10 VALUE
4480: 53 28 32 33 34 2c 32 33 34 2c 32 33 34 2c 32 33  S(234,234,234,23
4490: 34 2c 32 33 34 2c 32 33 34 29 3b 0a 20 20 20 20  4,234,234);.    
44a0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
44b0: 30 20 56 41 4c 55 45 53 28 33 34 35 2c 33 34 35  0 VALUES(345,345
44c0: 2c 33 34 35 2c 33 34 35 2c 33 34 35 2c 33 34 35  ,345,345,345,345
44d0: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
44e0: 49 4e 54 4f 20 74 31 30 20 56 41 4c 55 45 53 28  INTO t10 VALUES(
44f0: 34 35 2c 34 35 2c 34 35 2c 34 35 2c 34 35 2c 34  45,45,45,45,45,4
4500: 35 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f  5);.    }.    co
4510: 75 6e 74 20 7b 0a 20 20 20 20 20 20 53 45 4c 45  unt {.      SELE
4520: 43 54 20 61 20 46 52 4f 4d 20 74 31 30 20 57 48  CT a FROM t10 WH
4530: 45 52 45 20 62 20 4c 49 4b 45 20 27 31 32 25 27  ERE b LIKE '12%'
4540: 20 4f 52 44 45 52 20 42 59 20 2b 61 3b 0a 20 20   ORDER BY +a;.  
4550: 20 20 7d 0a 20 20 7d 20 7b 31 32 20 31 32 33 20    }.  } {12 123 
4560: 73 63 61 6e 20 35 20 6c 69 6b 65 20 36 7d 0a 20  scan 5 like 6}. 
4570: 20 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 31 30   do_test like-10
4580: 2e 32 20 7b 0a 20 20 20 20 63 6f 75 6e 74 20 7b  .2 {.    count {
4590: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 20  .      SELECT a 
45a0: 46 52 4f 4d 20 74 31 30 20 57 48 45 52 45 20 63  FROM t10 WHERE c
45b0: 20 4c 49 4b 45 20 27 31 32 25 27 20 4f 52 44 45   LIKE '12%' ORDE
45c0: 52 20 42 59 20 2b 61 3b 0a 20 20 20 20 7d 0a 20  R BY +a;.    }. 
45d0: 20 7d 20 7b 31 32 20 31 32 33 20 73 63 61 6e 20   } {12 123 scan 
45e0: 35 20 6c 69 6b 65 20 36 7d 0a 20 20 64 6f 5f 74  5 like 6}.  do_t
45f0: 65 73 74 20 6c 69 6b 65 2d 31 30 2e 33 20 7b 0a  est like-10.3 {.
4600: 20 20 20 20 63 6f 75 6e 74 20 7b 0a 20 20 20 20      count {.    
4610: 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
4620: 74 31 30 20 57 48 45 52 45 20 64 20 4c 49 4b 45  t10 WHERE d LIKE
4630: 20 27 31 32 25 27 20 4f 52 44 45 52 20 42 59 20   '12%' ORDER BY 
4640: 2b 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31  +a;.    }.  } {1
4650: 32 20 31 32 33 20 73 63 61 6e 20 35 20 6c 69 6b  2 123 scan 5 lik
4660: 65 20 36 7d 0a 20 20 64 6f 5f 74 65 73 74 20 6c  e 6}.  do_test l
4670: 69 6b 65 2d 31 30 2e 34 20 7b 0a 20 20 20 20 63  ike-10.4 {.    c
4680: 6f 75 6e 74 20 7b 0a 20 20 20 20 20 20 53 45 4c  ount {.      SEL
4690: 45 43 54 20 61 20 46 52 4f 4d 20 74 31 30 20 57  ECT a FROM t10 W
46a0: 48 45 52 45 20 65 20 4c 49 4b 45 20 27 31 32 25  HERE e LIKE '12%
46b0: 27 20 4f 52 44 45 52 20 42 59 20 2b 61 3b 0a 20  ' ORDER BY +a;. 
46c0: 20 20 20 7d 0a 20 20 7d 20 7b 31 32 20 31 32 33     }.  } {12 123
46d0: 20 73 63 61 6e 20 35 20 6c 69 6b 65 20 36 7d 0a   scan 5 like 6}.
46e0: 20 20 69 66 63 61 70 61 62 6c 65 20 6c 69 6b 65    ifcapable like
46f0: 5f 6d 61 74 63 68 5f 62 6c 6f 62 73 20 7b 0a 20  _match_blobs {. 
4700: 20 20 20 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d     do_test like-
4710: 31 30 2e 35 61 20 7b 0a 20 20 20 20 20 20 63 6f  10.5a {.      co
4720: 75 6e 74 20 7b 0a 20 20 20 20 20 20 20 20 53 45  unt {.        SE
4730: 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 30 20  LECT a FROM t10 
4740: 57 48 45 52 45 20 66 20 4c 49 4b 45 20 27 31 32  WHERE f LIKE '12
4750: 25 27 20 4f 52 44 45 52 20 42 59 20 2b 61 3b 0a  %' ORDER BY +a;.
4760: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 7b 31        }.    } {1
4770: 32 20 31 32 33 20 73 63 61 6e 20 34 20 6c 69 6b  2 123 scan 4 lik
4780: 65 20 30 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a  e 0}.  } else {.
4790: 20 20 20 20 64 6f 5f 74 65 73 74 20 6c 69 6b 65      do_test like
47a0: 2d 31 30 2e 35 62 20 7b 0a 20 20 20 20 20 20 63  -10.5b {.      c
47b0: 6f 75 6e 74 20 7b 0a 20 20 20 20 20 20 20 20 53  ount {.        S
47c0: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 30  ELECT a FROM t10
47d0: 20 57 48 45 52 45 20 66 20 4c 49 4b 45 20 27 31   WHERE f LIKE '1
47e0: 32 25 27 20 4f 52 44 45 52 20 42 59 20 2b 61 3b  2%' ORDER BY +a;
47f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 7b  .      }.    } {
4800: 31 32 20 31 32 33 20 73 63 61 6e 20 33 20 6c 69  12 123 scan 3 li
4810: 6b 65 20 30 7d 0a 20 20 7d 0a 20 20 64 6f 5f 74  ke 0}.  }.  do_t
4820: 65 73 74 20 6c 69 6b 65 2d 31 30 2e 36 20 7b 0a  est like-10.6 {.
4830: 20 20 20 20 63 6f 75 6e 74 20 7b 0a 20 20 20 20      count {.    
4840: 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
4850: 74 31 30 20 57 48 45 52 45 20 61 20 4c 49 4b 45  t10 WHERE a LIKE
4860: 20 27 31 32 25 27 20 4f 52 44 45 52 20 42 59 20   '12%' ORDER BY 
4870: 2b 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31  +a;.    }.  } {1
4880: 32 20 31 32 33 20 73 63 61 6e 20 35 20 6c 69 6b  2 123 scan 5 lik
4890: 65 20 36 7d 0a 20 20 64 6f 5f 74 65 73 74 20 6c  e 6}.  do_test l
48a0: 69 6b 65 2d 31 30 2e 31 30 20 7b 0a 20 20 20 20  ike-10.10 {.    
48b0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
48c0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 30  CREATE TABLE t10
48d0: 62 28 0a 20 20 20 20 20 20 20 20 61 20 49 4e 54  b(.        a INT
48e0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
48f0: 2c 0a 20 20 20 20 20 20 20 20 62 20 49 4e 54 45  ,.        b INTE
4900: 47 45 52 20 55 4e 49 51 55 45 2c 0a 20 20 20 20  GER UNIQUE,.    
4910: 20 20 20 20 63 20 4e 55 4d 42 45 52 20 55 4e 49      c NUMBER UNI
4920: 51 55 45 2c 0a 20 20 20 20 20 20 20 20 64 20 42  QUE,.        d B
4930: 4c 4f 42 20 55 4e 49 51 55 45 2c 0a 20 20 20 20  LOB UNIQUE,.    
4940: 20 20 20 20 65 20 55 4e 49 51 55 45 2c 0a 20 20      e UNIQUE,.  
4950: 20 20 20 20 20 20 66 20 54 45 58 54 20 55 4e 49        f TEXT UNI
4960: 51 55 45 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  QUE.      );.   
4970: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
4980: 31 30 62 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  10b SELECT * FRO
4990: 4d 20 74 31 30 3b 0a 20 20 20 20 7d 0a 20 20 20  M t10;.    }.   
49a0: 20 63 6f 75 6e 74 20 7b 0a 20 20 20 20 20 20 53   count {.      S
49b0: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 30  ELECT a FROM t10
49c0: 62 20 57 48 45 52 45 20 62 20 47 4c 4f 42 20 27  b WHERE b GLOB '
49d0: 31 32 2a 27 20 4f 52 44 45 52 20 42 59 20 2b 61  12*' ORDER BY +a
49e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 32 20  ;.    }.  } {12 
49f0: 31 32 33 20 73 63 61 6e 20 35 20 6c 69 6b 65 20  123 scan 5 like 
4a00: 36 7d 0a 20 20 64 6f 5f 74 65 73 74 20 6c 69 6b  6}.  do_test lik
4a10: 65 2d 31 30 2e 31 31 20 7b 0a 20 20 20 20 63 6f  e-10.11 {.    co
4a20: 75 6e 74 20 7b 0a 20 20 20 20 20 20 53 45 4c 45  unt {.      SELE
4a30: 43 54 20 61 20 46 52 4f 4d 20 74 31 30 62 20 57  CT a FROM t10b W
4a40: 48 45 52 45 20 63 20 47 4c 4f 42 20 27 31 32 2a  HERE c GLOB '12*
4a50: 27 20 4f 52 44 45 52 20 42 59 20 2b 61 3b 0a 20  ' ORDER BY +a;. 
4a60: 20 20 20 7d 0a 20 20 7d 20 7b 31 32 20 31 32 33     }.  } {12 123
4a70: 20 73 63 61 6e 20 35 20 6c 69 6b 65 20 36 7d 0a   scan 5 like 6}.
4a80: 20 20 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 31    do_test like-1
4a90: 30 2e 31 32 20 7b 0a 20 20 20 20 63 6f 75 6e 74  0.12 {.    count
4aa0: 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20   {.      SELECT 
4ab0: 61 20 46 52 4f 4d 20 74 31 30 62 20 57 48 45 52  a FROM t10b WHER
4ac0: 45 20 64 20 47 4c 4f 42 20 27 31 32 2a 27 20 4f  E d GLOB '12*' O
4ad0: 52 44 45 52 20 42 59 20 2b 61 3b 0a 20 20 20 20  RDER BY +a;.    
4ae0: 7d 0a 20 20 7d 20 7b 31 32 20 31 32 33 20 73 63  }.  } {12 123 sc
4af0: 61 6e 20 35 20 6c 69 6b 65 20 36 7d 0a 20 20 64  an 5 like 6}.  d
4b00: 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 31 30 2e 31  o_test like-10.1
4b10: 33 20 7b 0a 20 20 20 20 63 6f 75 6e 74 20 7b 0a  3 {.    count {.
4b20: 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46        SELECT a F
4b30: 52 4f 4d 20 74 31 30 62 20 57 48 45 52 45 20 65  ROM t10b WHERE e
4b40: 20 47 4c 4f 42 20 27 31 32 2a 27 20 4f 52 44 45   GLOB '12*' ORDE
4b50: 52 20 42 59 20 2b 61 3b 0a 20 20 20 20 7d 0a 20  R BY +a;.    }. 
4b60: 20 7d 20 7b 31 32 20 31 32 33 20 73 63 61 6e 20   } {12 123 scan 
4b70: 35 20 6c 69 6b 65 20 36 7d 0a 20 20 69 66 63 61  5 like 6}.  ifca
4b80: 70 61 62 6c 65 20 6c 69 6b 65 5f 6d 61 74 63 68  pable like_match
4b90: 5f 62 6c 6f 62 73 20 7b 0a 20 20 20 20 64 6f 5f  _blobs {.    do_
4ba0: 74 65 73 74 20 6c 69 6b 65 2d 31 30 2e 31 34 20  test like-10.14 
4bb0: 7b 0a 20 20 20 20 20 20 63 6f 75 6e 74 20 7b 0a  {.      count {.
4bc0: 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 61          SELECT a
4bd0: 20 46 52 4f 4d 20 74 31 30 62 20 57 48 45 52 45   FROM t10b WHERE
4be0: 20 66 20 47 4c 4f 42 20 27 31 32 2a 27 20 4f 52   f GLOB '12*' OR
4bf0: 44 45 52 20 42 59 20 2b 61 3b 0a 20 20 20 20 20  DER BY +a;.     
4c00: 20 7d 0a 20 20 20 20 7d 20 7b 31 32 20 31 32 33   }.    } {12 123
4c10: 20 73 63 61 6e 20 34 20 6c 69 6b 65 20 30 7d 0a   scan 4 like 0}.
4c20: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 64    } else {.    d
4c30: 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 31 30 2e 31  o_test like-10.1
4c40: 34 20 7b 0a 20 20 20 20 20 20 63 6f 75 6e 74 20  4 {.      count 
4c50: 7b 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  {.        SELECT
4c60: 20 61 20 46 52 4f 4d 20 74 31 30 62 20 57 48 45   a FROM t10b WHE
4c70: 52 45 20 66 20 47 4c 4f 42 20 27 31 32 2a 27 20  RE f GLOB '12*' 
4c80: 4f 52 44 45 52 20 42 59 20 2b 61 3b 0a 20 20 20  ORDER BY +a;.   
4c90: 20 20 20 7d 0a 20 20 20 20 7d 20 7b 31 32 20 31     }.    } {12 1
4ca0: 32 33 20 73 63 61 6e 20 33 20 6c 69 6b 65 20 30  23 scan 3 like 0
4cb0: 7d 0a 20 20 7d 0a 20 20 64 6f 5f 74 65 73 74 20  }.  }.  do_test 
4cc0: 6c 69 6b 65 2d 31 30 2e 31 35 20 7b 0a 20 20 20  like-10.15 {.   
4cd0: 20 63 6f 75 6e 74 20 7b 0a 20 20 20 20 20 20 53   count {.      S
4ce0: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 30  ELECT a FROM t10
4cf0: 62 20 57 48 45 52 45 20 61 20 47 4c 4f 42 20 27  b WHERE a GLOB '
4d00: 31 32 2a 27 20 4f 52 44 45 52 20 42 59 20 2b 61  12*' ORDER BY +a
4d10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 32 20  ;.    }.  } {12 
4d20: 31 32 33 20 73 63 61 6e 20 35 20 6c 69 6b 65 20  123 scan 5 like 
4d30: 36 7d 0a 7d 0a 0a 23 20 4c 49 4b 45 20 61 6e 64  6}.}..# LIKE and
4d40: 20 47 4c 4f 42 20 77 68 65 72 65 20 74 68 65 20   GLOB where the 
4d50: 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e  default collatin
4d60: 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 6e 6f  g sequence is no
4d70: 74 20 61 70 70 72 6f 70 72 69 61 74 65 0a 23 20  t appropriate.# 
4d80: 62 75 74 20 61 6e 20 69 6e 64 65 78 20 77 69 74  but an index wit
4d90: 68 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  h the appropriat
4da0: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
4db0: 65 6e 63 65 20 65 78 69 73 74 73 2e 0a 23 0a 64  ence exists..#.d
4dc0: 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 31 31 2e 30  o_test like-11.0
4dd0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
4de0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
4df0: 74 31 31 28 0a 20 20 20 20 20 20 61 20 49 4e 54  t11(.      a INT
4e00: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
4e10: 2c 0a 20 20 20 20 20 20 62 20 54 45 58 54 20 43  ,.      b TEXT C
4e20: 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 2c 0a 20  OLLATE nocase,. 
4e30: 20 20 20 20 20 63 20 54 45 58 54 20 43 4f 4c 4c       c TEXT COLL
4e40: 41 54 45 20 62 69 6e 61 72 79 0a 20 20 20 20 29  ATE binary.    )
4e50: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
4e60: 4f 20 74 31 31 20 56 41 4c 55 45 53 28 31 2c 20  O t11 VALUES(1, 
4e70: 27 61 27 2c 27 61 27 29 3b 0a 20 20 20 20 49 4e  'a','a');.    IN
4e80: 53 45 52 54 20 49 4e 54 4f 20 74 31 31 20 56 41  SERT INTO t11 VA
4e90: 4c 55 45 53 28 32 2c 20 27 61 62 27 2c 27 61 62  LUES(2, 'ab','ab
4ea0: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
4eb0: 4e 54 4f 20 74 31 31 20 56 41 4c 55 45 53 28 33  NTO t11 VALUES(3
4ec0: 2c 20 27 61 62 63 27 2c 27 61 62 63 27 29 3b 0a  , 'abc','abc');.
4ed0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
4ee0: 74 31 31 20 56 41 4c 55 45 53 28 34 2c 20 27 61  t11 VALUES(4, 'a
4ef0: 62 63 64 27 2c 27 61 62 63 64 27 29 3b 0a 20 20  bcd','abcd');.  
4f00: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
4f10: 31 20 56 41 4c 55 45 53 28 35 2c 20 27 41 27 2c  1 VALUES(5, 'A',
4f20: 27 41 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  'A');.    INSERT
4f30: 20 49 4e 54 4f 20 74 31 31 20 56 41 4c 55 45 53   INTO t11 VALUES
4f40: 28 36 2c 20 27 41 42 27 2c 27 41 42 27 29 3b 0a  (6, 'AB','AB');.
4f50: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
4f60: 74 31 31 20 56 41 4c 55 45 53 28 37 2c 20 27 41  t11 VALUES(7, 'A
4f70: 42 43 27 2c 27 41 42 43 27 29 3b 0a 20 20 20 20  BC','ABC');.    
4f80: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 31 20  INSERT INTO t11 
4f90: 56 41 4c 55 45 53 28 38 2c 20 27 41 42 43 44 27  VALUES(8, 'ABCD'
4fa0: 2c 27 41 42 43 44 27 29 3b 0a 20 20 20 20 49 4e  ,'ABCD');.    IN
4fb0: 53 45 52 54 20 49 4e 54 4f 20 74 31 31 20 56 41  SERT INTO t11 VA
4fc0: 4c 55 45 53 28 39 2c 20 27 78 27 2c 27 78 27 29  LUES(9, 'x','x')
4fd0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
4fe0: 4f 20 74 31 31 20 56 41 4c 55 45 53 28 31 30 2c  O t11 VALUES(10,
4ff0: 20 27 79 7a 27 2c 27 79 7a 27 29 3b 0a 20 20 20   'yz','yz');.   
5000: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 31   INSERT INTO t11
5010: 20 56 41 4c 55 45 53 28 31 31 2c 20 27 58 27 2c   VALUES(11, 'X',
5020: 27 58 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  'X');.    INSERT
5030: 20 49 4e 54 4f 20 74 31 31 20 56 41 4c 55 45 53   INTO t11 VALUES
5040: 28 31 32 2c 20 27 59 5a 27 2c 27 59 5a 27 29 3b  (12, 'YZ','YZ');
5050: 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  .    SELECT coun
5060: 74 28 2a 29 20 46 52 4f 4d 20 74 31 31 3b 0a 20  t(*) FROM t11;. 
5070: 20 7d 0a 7d 20 7b 31 32 7d 0a 64 6f 5f 74 65 73   }.} {12}.do_tes
5080: 74 20 6c 69 6b 65 2d 31 31 2e 31 20 7b 0a 20 20  t like-11.1 {.  
5090: 64 62 20 65 76 61 6c 20 7b 50 52 41 47 4d 41 20  db eval {PRAGMA 
50a0: 63 61 73 65 5f 73 65 6e 73 69 74 69 76 65 5f 6c  case_sensitive_l
50b0: 69 6b 65 3d 4f 46 46 3b 7d 0a 20 20 71 75 65 72  ike=OFF;}.  quer
50c0: 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45  yplan {.    SELE
50d0: 43 54 20 62 20 46 52 4f 4d 20 74 31 31 20 57 48  CT b FROM t11 WH
50e0: 45 52 45 20 62 20 4c 49 4b 45 20 27 61 62 63 25  ERE b LIKE 'abc%
50f0: 27 20 4f 52 44 45 52 20 42 59 20 61 3b 0a 20 20  ' ORDER BY a;.  
5100: 7d 0a 7d 20 7b 61 62 63 20 61 62 63 64 20 41 42  }.} {abc abcd AB
5110: 43 20 41 42 43 44 20 6e 6f 73 6f 72 74 20 74 31  C ABCD nosort t1
5120: 31 20 2a 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b  1 *}.do_test lik
5130: 65 2d 31 31 2e 32 20 7b 0a 20 20 64 62 20 65 76  e-11.2 {.  db ev
5140: 61 6c 20 7b 50 52 41 47 4d 41 20 63 61 73 65 5f  al {PRAGMA case_
5150: 73 65 6e 73 69 74 69 76 65 5f 6c 69 6b 65 3d 4f  sensitive_like=O
5160: 4e 3b 7d 0a 20 20 71 75 65 72 79 70 6c 61 6e 20  N;}.  queryplan 
5170: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 62 20 46  {.    SELECT b F
5180: 52 4f 4d 20 74 31 31 20 57 48 45 52 45 20 62 20  ROM t11 WHERE b 
5190: 4c 49 4b 45 20 27 61 62 63 25 27 20 4f 52 44 45  LIKE 'abc%' ORDE
51a0: 52 20 42 59 20 61 3b 0a 20 20 7d 0a 7d 20 7b 61  R BY a;.  }.} {a
51b0: 62 63 20 61 62 63 64 20 6e 6f 73 6f 72 74 20 74  bc abcd nosort t
51c0: 31 31 20 2a 7d 0a 64 6f 5f 74 65 73 74 20 6c 69  11 *}.do_test li
51d0: 6b 65 2d 31 31 2e 33 20 7b 0a 20 20 64 62 20 65  ke-11.3 {.  db e
51e0: 76 61 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  val {.    PRAGMA
51f0: 20 63 61 73 65 5f 73 65 6e 73 69 74 69 76 65 5f   case_sensitive_
5200: 6c 69 6b 65 3d 4f 46 46 3b 0a 20 20 20 20 43 52  like=OFF;.    CR
5210: 45 41 54 45 20 49 4e 44 45 58 20 74 31 31 62 20  EATE INDEX t11b 
5220: 4f 4e 20 74 31 31 28 62 29 3b 0a 20 20 7d 0a 20  ON t11(b);.  }. 
5230: 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20   queryplan {.   
5240: 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74   SELECT b FROM t
5250: 31 31 20 57 48 45 52 45 20 62 20 4c 49 4b 45 20  11 WHERE b LIKE 
5260: 27 61 62 63 25 27 20 4f 52 44 45 52 20 42 59 20  'abc%' ORDER BY 
5270: 2b 61 3b 0a 20 20 7d 0a 7d 20 7b 61 62 63 20 61  +a;.  }.} {abc a
5280: 62 63 64 20 41 42 43 20 41 42 43 44 20 73 6f 72  bcd ABC ABCD sor
5290: 74 20 7b 7d 20 74 31 31 62 7d 0a 64 6f 5f 74 65  t {} t11b}.do_te
52a0: 73 74 20 6c 69 6b 65 2d 31 31 2e 34 20 7b 0a 20  st like-11.4 {. 
52b0: 20 64 62 20 65 76 61 6c 20 7b 50 52 41 47 4d 41   db eval {PRAGMA
52c0: 20 63 61 73 65 5f 73 65 6e 73 69 74 69 76 65 5f   case_sensitive_
52d0: 6c 69 6b 65 3d 4f 4e 3b 7d 0a 20 20 71 75 65 72  like=ON;}.  quer
52e0: 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45  yplan {.    SELE
52f0: 43 54 20 62 20 46 52 4f 4d 20 74 31 31 20 57 48  CT b FROM t11 WH
5300: 45 52 45 20 62 20 4c 49 4b 45 20 27 61 62 63 25  ERE b LIKE 'abc%
5310: 27 20 4f 52 44 45 52 20 42 59 20 61 3b 0a 20 20  ' ORDER BY a;.  
5320: 7d 0a 7d 20 7b 61 62 63 20 61 62 63 64 20 6e 6f  }.} {abc abcd no
5330: 73 6f 72 74 20 74 31 31 20 2a 7d 0a 64 6f 5f 74  sort t11 *}.do_t
5340: 65 73 74 20 6c 69 6b 65 2d 31 31 2e 35 20 7b 0a  est like-11.5 {.
5350: 20 20 64 62 20 65 76 61 6c 20 7b 0a 20 20 20 20    db eval {.    
5360: 50 52 41 47 4d 41 20 63 61 73 65 5f 73 65 6e 73  PRAGMA case_sens
5370: 69 74 69 76 65 5f 6c 69 6b 65 3d 4f 46 46 3b 0a  itive_like=OFF;.
5380: 20 20 20 20 44 52 4f 50 20 49 4e 44 45 58 20 74      DROP INDEX t
5390: 31 31 62 3b 0a 20 20 20 20 43 52 45 41 54 45 20  11b;.    CREATE 
53a0: 49 4e 44 45 58 20 74 31 31 62 6e 63 20 4f 4e 20  INDEX t11bnc ON 
53b0: 74 31 31 28 62 20 43 4f 4c 4c 41 54 45 20 6e 6f  t11(b COLLATE no
53c0: 63 61 73 65 29 3b 0a 20 20 7d 0a 20 20 71 75 65  case);.  }.  que
53d0: 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c  ryplan {.    SEL
53e0: 45 43 54 20 62 20 46 52 4f 4d 20 74 31 31 20 57  ECT b FROM t11 W
53f0: 48 45 52 45 20 62 20 4c 49 4b 45 20 27 61 62 63  HERE b LIKE 'abc
5400: 25 27 20 4f 52 44 45 52 20 42 59 20 2b 61 3b 0a  %' ORDER BY +a;.
5410: 20 20 7d 0a 7d 20 7b 61 62 63 20 61 62 63 64 20    }.} {abc abcd 
5420: 41 42 43 20 41 42 43 44 20 73 6f 72 74 20 7b 7d  ABC ABCD sort {}
5430: 20 74 31 31 62 6e 63 7d 0a 64 6f 5f 74 65 73 74   t11bnc}.do_test
5440: 20 6c 69 6b 65 2d 31 31 2e 36 20 7b 0a 20 20 64   like-11.6 {.  d
5450: 62 20 65 76 61 6c 20 7b 43 52 45 41 54 45 20 49  b eval {CREATE I
5460: 4e 44 45 58 20 74 31 31 62 62 20 4f 4e 20 74 31  NDEX t11bb ON t1
5470: 31 28 62 20 43 4f 4c 4c 41 54 45 20 62 69 6e 61  1(b COLLATE bina
5480: 72 79 29 3b 7d 0a 20 20 71 75 65 72 79 70 6c 61  ry);}.  querypla
5490: 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 62  n {.    SELECT b
54a0: 20 46 52 4f 4d 20 74 31 31 20 57 48 45 52 45 20   FROM t11 WHERE 
54b0: 62 20 4c 49 4b 45 20 27 61 62 63 25 27 20 4f 52  b LIKE 'abc%' OR
54c0: 44 45 52 20 42 59 20 2b 61 3b 0a 20 20 7d 0a 7d  DER BY +a;.  }.}
54d0: 20 7b 61 62 63 20 61 62 63 64 20 41 42 43 20 41   {abc abcd ABC A
54e0: 42 43 44 20 73 6f 72 74 20 7b 7d 20 74 31 31 62  BCD sort {} t11b
54f0: 6e 63 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65  nc}.do_test like
5500: 2d 31 31 2e 37 20 7b 0a 20 20 64 62 20 65 76 61  -11.7 {.  db eva
5510: 6c 20 7b 50 52 41 47 4d 41 20 63 61 73 65 5f 73  l {PRAGMA case_s
5520: 65 6e 73 69 74 69 76 65 5f 6c 69 6b 65 3d 4f 4e  ensitive_like=ON
5530: 3b 7d 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b  ;}.  queryplan {
5540: 0a 20 20 20 20 53 45 4c 45 43 54 20 62 20 46 52  .    SELECT b FR
5550: 4f 4d 20 74 31 31 20 57 48 45 52 45 20 62 20 4c  OM t11 WHERE b L
5560: 49 4b 45 20 27 61 62 63 25 27 20 4f 52 44 45 52  IKE 'abc%' ORDER
5570: 20 42 59 20 2b 61 3b 0a 20 20 7d 0a 7d 20 7b 61   BY +a;.  }.} {a
5580: 62 63 20 61 62 63 64 20 73 6f 72 74 20 7b 7d 20  bc abcd sort {} 
5590: 74 31 31 62 62 7d 0a 64 6f 5f 74 65 73 74 20 6c  t11bb}.do_test l
55a0: 69 6b 65 2d 31 31 2e 38 20 7b 0a 20 20 64 62 20  ike-11.8 {.  db 
55b0: 65 76 61 6c 20 7b 50 52 41 47 4d 41 20 63 61 73  eval {PRAGMA cas
55c0: 65 5f 73 65 6e 73 69 74 69 76 65 5f 6c 69 6b 65  e_sensitive_like
55d0: 3d 4f 46 46 3b 7d 0a 20 20 71 75 65 72 79 70 6c  =OFF;}.  querypl
55e0: 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  an {.    SELECT 
55f0: 62 20 46 52 4f 4d 20 74 31 31 20 57 48 45 52 45  b FROM t11 WHERE
5600: 20 62 20 47 4c 4f 42 20 27 61 62 63 2a 27 20 4f   b GLOB 'abc*' O
5610: 52 44 45 52 20 42 59 20 2b 61 3b 0a 20 20 7d 0a  RDER BY +a;.  }.
5620: 7d 20 7b 61 62 63 20 61 62 63 64 20 73 6f 72 74  } {abc abcd sort
5630: 20 7b 7d 20 74 31 31 62 62 7d 0a 64 6f 5f 74 65   {} t11bb}.do_te
5640: 73 74 20 6c 69 6b 65 2d 31 31 2e 39 20 7b 0a 20  st like-11.9 {. 
5650: 20 64 62 20 65 76 61 6c 20 7b 0a 20 20 20 20 43   db eval {.    C
5660: 52 45 41 54 45 20 49 4e 44 45 58 20 74 31 31 63  REATE INDEX t11c
5670: 6e 63 20 4f 4e 20 74 31 31 28 63 20 43 4f 4c 4c  nc ON t11(c COLL
5680: 41 54 45 20 6e 6f 63 61 73 65 29 3b 0a 20 20 20  ATE nocase);.   
5690: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 74 31   CREATE INDEX t1
56a0: 31 63 62 20 4f 4e 20 74 31 31 28 63 20 43 4f 4c  1cb ON t11(c COL
56b0: 4c 41 54 45 20 62 69 6e 61 72 79 29 3b 0a 20 20  LATE binary);.  
56c0: 7d 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a  }.  queryplan {.
56d0: 20 20 20 20 53 45 4c 45 43 54 20 63 20 46 52 4f      SELECT c FRO
56e0: 4d 20 74 31 31 20 57 48 45 52 45 20 63 20 4c 49  M t11 WHERE c LI
56f0: 4b 45 20 27 61 62 63 25 27 20 4f 52 44 45 52 20  KE 'abc%' ORDER 
5700: 42 59 20 2b 61 3b 0a 20 20 7d 0a 7d 20 7b 61 62  BY +a;.  }.} {ab
5710: 63 20 61 62 63 64 20 41 42 43 20 41 42 43 44 20  c abcd ABC ABCD 
5720: 73 6f 72 74 20 7b 7d 20 74 31 31 63 6e 63 7d 0a  sort {} t11cnc}.
5730: 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 31 31 2e  do_test like-11.
5740: 31 30 20 7b 0a 20 20 71 75 65 72 79 70 6c 61 6e  10 {.  queryplan
5750: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 63 20   {.    SELECT c 
5760: 46 52 4f 4d 20 74 31 31 20 57 48 45 52 45 20 63  FROM t11 WHERE c
5770: 20 47 4c 4f 42 20 27 61 62 63 2a 27 20 4f 52 44   GLOB 'abc*' ORD
5780: 45 52 20 42 59 20 2b 61 3b 0a 20 20 7d 0a 7d 20  ER BY +a;.  }.} 
5790: 7b 61 62 63 20 61 62 63 64 20 73 6f 72 74 20 7b  {abc abcd sort {
57a0: 7d 20 74 31 31 63 62 7d 0a 0a 23 20 41 20 43 4f  } t11cb}..# A CO
57b0: 4c 4c 41 54 45 20 63 6c 61 75 73 65 20 6f 6e 20  LLATE clause on 
57c0: 74 68 65 20 70 61 74 74 65 72 6e 20 64 6f 65 73  the pattern does
57d0: 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20   not change the 
57e0: 72 65 73 75 6c 74 20 6f 66 20 61 0a 23 20 4c 49  result of a.# LI
57f0: 4b 45 20 6f 70 65 72 61 74 6f 72 2e 0a 23 0a 64  KE operator..#.d
5800: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 6c  o_execsql_test l
5810: 69 6b 65 2d 31 32 2e 31 20 7b 0a 20 20 43 52 45  ike-12.1 {.  CRE
5820: 41 54 45 20 54 41 42 4c 45 20 74 31 32 6e 63 28  ATE TABLE t12nc(
5830: 69 64 20 49 4e 54 45 47 45 52 2c 20 78 20 54 45  id INTEGER, x TE
5840: 58 54 20 55 4e 49 51 55 45 20 43 4f 4c 4c 41 54  XT UNIQUE COLLAT
5850: 45 20 6e 6f 63 61 73 65 29 3b 0a 20 20 49 4e 53  E nocase);.  INS
5860: 45 52 54 20 49 4e 54 4f 20 74 31 32 6e 63 20 56  ERT INTO t12nc V
5870: 41 4c 55 45 53 28 31 2c 27 61 62 63 64 65 27 29  ALUES(1,'abcde')
5880: 2c 28 32 2c 27 75 76 77 78 79 27 29 2c 28 33 2c  ,(2,'uvwxy'),(3,
5890: 27 41 42 43 44 45 46 27 29 3b 0a 20 20 43 52 45  'ABCDEF');.  CRE
58a0: 41 54 45 20 54 41 42 4c 45 20 74 31 32 62 28 69  ATE TABLE t12b(i
58b0: 64 20 49 4e 54 45 47 45 52 2c 20 78 20 54 45 58  d INTEGER, x TEX
58c0: 54 20 55 4e 49 51 55 45 20 43 4f 4c 4c 41 54 45  T UNIQUE COLLATE
58d0: 20 62 69 6e 61 72 79 29 3b 0a 20 20 49 4e 53 45   binary);.  INSE
58e0: 52 54 20 49 4e 54 4f 20 74 31 32 62 20 56 41 4c  RT INTO t12b VAL
58f0: 55 45 53 28 31 2c 27 61 62 63 64 65 27 29 2c 28  UES(1,'abcde'),(
5900: 32 2c 27 75 76 77 78 79 27 29 2c 28 33 2c 27 41  2,'uvwxy'),(3,'A
5910: 42 43 44 45 46 27 29 3b 0a 20 20 53 45 4c 45 43  BCDEF');.  SELEC
5920: 54 20 69 64 20 46 52 4f 4d 20 74 31 32 6e 63 20  T id FROM t12nc 
5930: 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27 61 62  WHERE x LIKE 'ab
5940: 63 25 27 20 4f 52 44 45 52 20 42 59 20 2b 69 64  c%' ORDER BY +id
5950: 3b 0a 7d 20 7b 31 20 33 7d 0a 64 6f 5f 65 78 65  ;.} {1 3}.do_exe
5960: 63 73 71 6c 5f 74 65 73 74 20 6c 69 6b 65 2d 31  csql_test like-1
5970: 32 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 69  2.2 {.  SELECT i
5980: 64 20 46 52 4f 4d 20 74 31 32 62 20 57 48 45 52  d FROM t12b WHER
5990: 45 20 78 20 4c 49 4b 45 20 27 61 62 63 25 27 20  E x LIKE 'abc%' 
59a0: 4f 52 44 45 52 20 42 59 20 2b 69 64 3b 0a 7d 20  ORDER BY +id;.} 
59b0: 7b 31 20 33 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  {1 3}.do_execsql
59c0: 5f 74 65 73 74 20 6c 69 6b 65 2d 31 32 2e 33 20  _test like-12.3 
59d0: 7b 0a 20 20 53 45 4c 45 43 54 20 69 64 20 46 52  {.  SELECT id FR
59e0: 4f 4d 20 74 31 32 6e 63 20 57 48 45 52 45 20 78  OM t12nc WHERE x
59f0: 20 4c 49 4b 45 20 27 61 62 63 25 27 20 43 4f 4c   LIKE 'abc%' COL
5a00: 4c 41 54 45 20 62 69 6e 61 72 79 20 4f 52 44 45  LATE binary ORDE
5a10: 52 20 42 59 20 2b 69 64 3b 0a 7d 20 7b 31 20 33  R BY +id;.} {1 3
5a20: 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73  }.do_execsql_tes
5a30: 74 20 6c 69 6b 65 2d 31 32 2e 34 20 7b 0a 20 20  t like-12.4 {.  
5a40: 53 45 4c 45 43 54 20 69 64 20 46 52 4f 4d 20 74  SELECT id FROM t
5a50: 31 32 62 20 57 48 45 52 45 20 78 20 4c 49 4b 45  12b WHERE x LIKE
5a60: 20 27 61 62 63 25 27 20 43 4f 4c 4c 41 54 45 20   'abc%' COLLATE 
5a70: 62 69 6e 61 72 79 20 4f 52 44 45 52 20 42 59 20  binary ORDER BY 
5a80: 2b 69 64 3b 0a 7d 20 7b 31 20 33 7d 0a 64 6f 5f  +id;.} {1 3}.do_
5a90: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 6c 69 6b  execsql_test lik
5aa0: 65 2d 31 32 2e 35 20 7b 0a 20 20 53 45 4c 45 43  e-12.5 {.  SELEC
5ab0: 54 20 69 64 20 46 52 4f 4d 20 74 31 32 6e 63 20  T id FROM t12nc 
5ac0: 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27 61 62  WHERE x LIKE 'ab
5ad0: 63 25 27 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61  c%' COLLATE noca
5ae0: 73 65 20 4f 52 44 45 52 20 42 59 20 2b 69 64 3b  se ORDER BY +id;
5af0: 0a 7d 20 7b 31 20 33 7d 0a 64 6f 5f 65 78 65 63  .} {1 3}.do_exec
5b00: 73 71 6c 5f 74 65 73 74 20 6c 69 6b 65 2d 31 32  sql_test like-12
5b10: 2e 36 20 7b 0a 20 20 53 45 4c 45 43 54 20 69 64  .6 {.  SELECT id
5b20: 20 46 52 4f 4d 20 74 31 32 62 20 57 48 45 52 45   FROM t12b WHERE
5b30: 20 78 20 4c 49 4b 45 20 27 61 62 63 25 27 20 43   x LIKE 'abc%' C
5b40: 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 4f 52  OLLATE nocase OR
5b50: 44 45 52 20 42 59 20 2b 69 64 3b 0a 7d 20 7b 31  DER BY +id;.} {1
5b60: 20 33 7d 0a 0a 23 20 41 64 64 69 6e 67 20 61 20   3}..# Adding a 
5b70: 43 4f 4c 4c 41 54 45 20 63 6c 61 75 73 65 20 74  COLLATE clause t
5b80: 6f 20 74 68 65 20 70 61 74 74 65 72 6e 20 6f 66  o the pattern of
5b90: 20 61 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72   a LIKE operator
5ba0: 20 64 6f 65 73 20 6e 6f 74 68 69 6e 67 0a 23 20   does nothing.# 
5bb0: 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 73 75  to change the su
5bc0: 69 74 61 62 69 6c 69 74 79 20 6f 66 20 75 73 69  itability of usi
5bd0: 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 73  ng an index to s
5be0: 61 74 69 73 66 79 20 74 68 61 74 20 4c 49 4b 45  atisfy that LIKE
5bf0: 0a 23 20 6f 70 65 72 61 74 6f 72 2e 0a 23 0a 64  .# operator..#.d
5c00: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 6c  o_execsql_test l
5c10: 69 6b 65 2d 31 32 2e 31 31 20 7b 0a 20 20 45 58  ike-12.11 {.  EX
5c20: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
5c30: 0a 20 20 53 45 4c 45 43 54 20 69 64 20 46 52 4f  .  SELECT id FRO
5c40: 4d 20 74 31 32 6e 63 20 57 48 45 52 45 20 78 20  M t12nc WHERE x 
5c50: 4c 49 4b 45 20 27 61 62 63 25 27 20 4f 52 44 45  LIKE 'abc%' ORDE
5c60: 52 20 42 59 20 2b 69 64 3b 0a 7d 20 7b 2f 53 45  R BY +id;.} {/SE
5c70: 41 52 43 48 2f 7d 0a 64 6f 5f 65 78 65 63 73 71  ARCH/}.do_execsq
5c80: 6c 5f 74 65 73 74 20 6c 69 6b 65 2d 31 32 2e 31  l_test like-12.1
5c90: 32 20 7b 0a 20 20 45 58 50 4c 41 49 4e 20 51 55  2 {.  EXPLAIN QU
5ca0: 45 52 59 20 50 4c 41 4e 0a 20 20 53 45 4c 45 43  ERY PLAN.  SELEC
5cb0: 54 20 69 64 20 46 52 4f 4d 20 74 31 32 62 20 57  T id FROM t12b W
5cc0: 48 45 52 45 20 78 20 4c 49 4b 45 20 27 61 62 63  HERE x LIKE 'abc
5cd0: 25 27 20 4f 52 44 45 52 20 42 59 20 2b 69 64 3b  %' ORDER BY +id;
5ce0: 0a 7d 20 7b 2f 53 43 41 4e 2f 7d 0a 64 6f 5f 65  .} {/SCAN/}.do_e
5cf0: 78 65 63 73 71 6c 5f 74 65 73 74 20 6c 69 6b 65  xecsql_test like
5d00: 2d 31 32 2e 31 33 20 7b 0a 20 20 45 58 50 4c 41  -12.13 {.  EXPLA
5d10: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a 20 20  IN QUERY PLAN.  
5d20: 53 45 4c 45 43 54 20 69 64 20 46 52 4f 4d 20 74  SELECT id FROM t
5d30: 31 32 6e 63 20 57 48 45 52 45 20 78 20 4c 49 4b  12nc WHERE x LIK
5d40: 45 20 27 61 62 63 25 27 20 43 4f 4c 4c 41 54 45  E 'abc%' COLLATE
5d50: 20 6e 6f 63 61 73 65 20 4f 52 44 45 52 20 42 59   nocase ORDER BY
5d60: 20 2b 69 64 3b 0a 7d 20 7b 2f 53 45 41 52 43 48   +id;.} {/SEARCH
5d70: 2f 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  /}.do_execsql_te
5d80: 73 74 20 6c 69 6b 65 2d 31 32 2e 31 34 20 7b 0a  st like-12.14 {.
5d90: 20 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20    EXPLAIN QUERY 
5da0: 50 4c 41 4e 0a 20 20 53 45 4c 45 43 54 20 69 64  PLAN.  SELECT id
5db0: 20 46 52 4f 4d 20 74 31 32 62 20 57 48 45 52 45   FROM t12b WHERE
5dc0: 20 78 20 4c 49 4b 45 20 27 61 62 63 25 27 20 43   x LIKE 'abc%' C
5dd0: 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 4f 52  OLLATE nocase OR
5de0: 44 45 52 20 42 59 20 2b 69 64 3b 0a 7d 20 7b 2f  DER BY +id;.} {/
5df0: 53 43 41 4e 2f 7d 0a 64 6f 5f 65 78 65 63 73 71  SCAN/}.do_execsq
5e00: 6c 5f 74 65 73 74 20 6c 69 6b 65 2d 31 32 2e 31  l_test like-12.1
5e10: 35 20 7b 0a 20 20 45 58 50 4c 41 49 4e 20 51 55  5 {.  EXPLAIN QU
5e20: 45 52 59 20 50 4c 41 4e 0a 20 20 53 45 4c 45 43  ERY PLAN.  SELEC
5e30: 54 20 69 64 20 46 52 4f 4d 20 74 31 32 6e 63 20  T id FROM t12nc 
5e40: 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27 61 62  WHERE x LIKE 'ab
5e50: 63 25 27 20 43 4f 4c 4c 41 54 45 20 62 69 6e 61  c%' COLLATE bina
5e60: 72 79 20 4f 52 44 45 52 20 42 59 20 2b 69 64 3b  ry ORDER BY +id;
5e70: 0a 7d 20 7b 2f 53 45 41 52 43 48 2f 7d 0a 64 6f  .} {/SEARCH/}.do
5e80: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 6c 69  _execsql_test li
5e90: 6b 65 2d 31 32 2e 31 36 20 7b 0a 20 20 45 58 50  ke-12.16 {.  EXP
5ea0: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a  LAIN QUERY PLAN.
5eb0: 20 20 53 45 4c 45 43 54 20 69 64 20 46 52 4f 4d    SELECT id FROM
5ec0: 20 74 31 32 62 20 57 48 45 52 45 20 78 20 4c 49   t12b WHERE x LI
5ed0: 4b 45 20 27 61 62 63 25 27 20 43 4f 4c 4c 41 54  KE 'abc%' COLLAT
5ee0: 45 20 62 69 6e 61 72 79 20 4f 52 44 45 52 20 42  E binary ORDER B
5ef0: 59 20 2b 69 64 3b 0a 7d 20 7b 2f 53 43 41 4e 2f  Y +id;.} {/SCAN/
5f00: 7d 0a 0a 23 20 54 69 63 6b 65 74 20 5b 68 74 74  }..# Ticket [htt
5f10: 70 73 3a 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e  ps://www.sqlite.
5f20: 6f 72 67 2f 73 72 63 2f 74 6b 74 76 69 65 77 2f  org/src/tktview/
5f30: 38 30 33 36 39 65 64 64 64 35 63 39 34 64 34 39  80369eddd5c94d49
5f40: 66 37 66 62 62 63 66 35 5d 0a 23 20 32 30 31 36  f7fbbcf5].# 2016
5f50: 2d 30 31 2d 32 30 0a 23 0a 64 6f 5f 65 78 65 63  -01-20.#.do_exec
5f60: 73 71 6c 5f 74 65 73 74 20 6c 69 6b 65 2d 31 33  sql_test like-13
5f70: 2e 31 20 7b 0a 20 20 53 45 4c 45 43 54 20 63 68  .1 {.  SELECT ch
5f80: 61 72 28 30 78 33 30 34 64 29 20 4c 49 4b 45 20  ar(0x304d) LIKE 
5f90: 63 68 61 72 28 30 78 33 30 36 64 29 3b 0a 7d 20  char(0x306d);.} 
5fa0: 7b 30 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  {0}.do_execsql_t
5fb0: 65 73 74 20 6c 69 6b 65 2d 31 33 2e 32 20 7b 0a  est like-13.2 {.
5fc0: 20 20 53 45 4c 45 43 54 20 63 68 61 72 28 30 78    SELECT char(0x
5fd0: 34 64 29 20 4c 49 4b 45 20 63 68 61 72 28 30 78  4d) LIKE char(0x
5fe0: 33 30 36 64 29 3b 0a 7d 20 7b 30 7d 0a 64 6f 5f  306d);.} {0}.do_
5ff0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 6c 69 6b  execsql_test lik
6000: 65 2d 31 33 2e 33 20 7b 0a 20 20 53 45 4c 45 43  e-13.3 {.  SELEC
6010: 54 20 63 68 61 72 28 30 78 33 30 34 64 29 20 4c  T char(0x304d) L
6020: 49 4b 45 20 63 68 61 72 28 30 78 36 64 29 3b 0a  IKE char(0x6d);.
6030: 7d 20 7b 30 7d 0a 64 6f 5f 65 78 65 63 73 71 6c  } {0}.do_execsql
6040: 5f 74 65 73 74 20 6c 69 6b 65 2d 31 33 2e 34 20  _test like-13.4 
6050: 7b 0a 20 20 53 45 4c 45 43 54 20 63 68 61 72 28  {.  SELECT char(
6060: 30 78 34 64 29 20 4c 49 4b 45 20 63 68 61 72 28  0x4d) LIKE char(
6070: 30 78 36 64 29 3b 0a 7d 20 7b 31 7d 0a 0a 23 20  0x6d);.} {1}..# 
6080: 50 65 72 66 6f 72 6d 61 6e 63 65 20 74 65 73 74  Performance test
6090: 69 6e 67 20 66 6f 72 20 70 61 74 74 65 72 6e 73  ing for patterns
60a0: 20 77 69 74 68 20 6d 61 6e 79 20 77 69 6c 64 63   with many wildc
60b0: 61 72 64 73 2e 20 20 54 68 65 73 65 20 4c 49 4b  ards.  These LIK
60c0: 45 20 61 6e 64 20 47 4c 4f 42 0a 23 20 70 61 74  E and GLOB.# pat
60d0: 74 65 72 6e 73 20 77 65 72 65 20 71 75 69 74 65  terns were quite
60e0: 20 73 6c 6f 77 20 77 69 74 68 20 53 51 4c 69 74   slow with SQLit
60f0: 65 20 33 2e 31 35 2e 32 20 61 6e 64 20 65 61 72  e 3.15.2 and ear
6100: 6c 69 65 72 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  lier..#.do_test 
6110: 6c 69 6b 65 2d 31 34 2e 31 20 7b 0a 20 20 73 65  like-14.1 {.  se
6120: 74 20 78 20 5b 6c 69 6e 64 65 78 20 5b 74 69 6d  t x [lindex [tim
6130: 65 20 7b 0a 20 20 20 20 64 62 20 6f 6e 65 20 7b  e {.    db one {
6140: 53 45 4c 45 43 54 20 27 61 61 61 61 61 61 61 61  SELECT 'aaaaaaaa
6150: 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61  aaaaaaaaaaaaaaaa
6160: 61 61 61 61 61 61 61 7a 27 47 4c 4f 42 27 2a 61  aaaaaaaz'GLOB'*a
6170: 2a 61 2a 61 2a 61 2a 61 2a 61 2a 61 2a 61 2a 79  *a*a*a*a*a*a*a*y
6180: 27 7d 0a 20 20 7d 5d 20 30 5d 0a 20 20 70 75 74  '}.  }] 0].  put
6190: 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 22 20 28  s -nonewline " (
61a0: 24 78 20 6d 73 20 2d 20 77 61 6e 74 20 6c 65 73  $x ms - want les
61b0: 73 20 74 68 61 6e 20 31 30 30 30 29 20 22 0a 20  s than 1000) ". 
61c0: 20 65 78 70 72 20 7b 24 78 3c 31 30 30 30 7d 0a   expr {$x<1000}.
61d0: 7d 20 7b 31 7d 0a 69 66 63 61 70 61 62 6c 65 20  } {1}.ifcapable 
61e0: 21 69 63 75 20 7b 0a 20 20 64 6f 5f 74 65 73 74  !icu {.  do_test
61f0: 20 6c 69 6b 65 2d 31 34 2e 32 20 7b 0a 20 20 20   like-14.2 {.   
6200: 20 73 65 74 20 78 20 5b 6c 69 6e 64 65 78 20 5b   set x [lindex [
6210: 74 69 6d 65 20 7b 0a 20 20 20 20 20 20 64 62 20  time {.      db 
6220: 6f 6e 65 20 7b 53 45 4c 45 43 54 20 27 61 61 61  one {SELECT 'aaa
6230: 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61  aaaaaaaaaaaaaaaa
6240: 61 61 61 61 61 61 61 61 61 61 61 61 7a 27 4c 49  aaaaaaaaaaaaz'LI
6250: 4b 45 27 25 61 25 61 25 61 25 61 25 61 25 61 25  KE'%a%a%a%a%a%a%
6260: 61 25 61 25 79 27 7d 0a 20 20 20 20 7d 5d 20 30  a%a%y'}.    }] 0
6270: 5d 0a 20 20 20 20 70 75 74 73 20 2d 6e 6f 6e 65  ].    puts -none
6280: 77 6c 69 6e 65 20 22 20 28 24 78 20 6d 73 20 2d  wline " ($x ms -
6290: 20 77 61 6e 74 20 6c 65 73 73 20 74 68 61 6e 20   want less than 
62a0: 31 30 30 30 29 20 22 0a 20 20 20 20 65 78 70 72  1000) ".    expr
62b0: 20 7b 24 78 3c 31 30 30 30 7d 0a 20 20 7d 20 7b   {$x<1000}.  } {
62c0: 31 7d 0a 7d 0a 0a 66 69 6e 69 73 68 5f 74 65 73  1}.}..finish_tes
62d0: 74 0a                                            t.