/ Hex Artifact Content
Login

Artifact e191e536d0fcd722a6b965e7cd1ee0bfd12a5991:


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 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 31    do_test like-1
46f0: 30 2e 35 20 7b 0a 20 20 20 20 63 6f 75 6e 74 20  0.5 {.    count 
4700: 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 61  {.      SELECT a
4710: 20 46 52 4f 4d 20 74 31 30 20 57 48 45 52 45 20   FROM t10 WHERE 
4720: 66 20 4c 49 4b 45 20 27 31 32 25 27 20 4f 52 44  f LIKE '12%' ORD
4730: 45 52 20 42 59 20 2b 61 3b 0a 20 20 20 20 7d 0a  ER BY +a;.    }.
4740: 20 20 7d 20 7b 31 32 20 31 32 33 20 73 63 61 6e    } {12 123 scan
4750: 20 33 20 6c 69 6b 65 20 30 7d 0a 20 20 64 6f 5f   3 like 0}.  do_
4760: 74 65 73 74 20 6c 69 6b 65 2d 31 30 2e 36 20 7b  test like-10.6 {
4770: 0a 20 20 20 20 63 6f 75 6e 74 20 7b 0a 20 20 20  .    count {.   
4780: 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d     SELECT a FROM
4790: 20 74 31 30 20 57 48 45 52 45 20 61 20 4c 49 4b   t10 WHERE a LIK
47a0: 45 20 27 31 32 25 27 20 4f 52 44 45 52 20 42 59  E '12%' ORDER BY
47b0: 20 2b 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b   +a;.    }.  } {
47c0: 31 32 20 31 32 33 20 73 63 61 6e 20 35 20 6c 69  12 123 scan 5 li
47d0: 6b 65 20 36 7d 0a 20 20 64 6f 5f 74 65 73 74 20  ke 6}.  do_test 
47e0: 6c 69 6b 65 2d 31 30 2e 31 30 20 7b 0a 20 20 20  like-10.10 {.   
47f0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
4800: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
4810: 30 62 28 0a 20 20 20 20 20 20 20 20 61 20 49 4e  0b(.        a IN
4820: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
4830: 59 2c 0a 20 20 20 20 20 20 20 20 62 20 49 4e 54  Y,.        b INT
4840: 45 47 45 52 20 55 4e 49 51 55 45 2c 0a 20 20 20  EGER UNIQUE,.   
4850: 20 20 20 20 20 63 20 4e 55 4d 42 45 52 20 55 4e       c NUMBER UN
4860: 49 51 55 45 2c 0a 20 20 20 20 20 20 20 20 64 20  IQUE,.        d 
4870: 42 4c 4f 42 20 55 4e 49 51 55 45 2c 0a 20 20 20  BLOB UNIQUE,.   
4880: 20 20 20 20 20 65 20 55 4e 49 51 55 45 2c 0a 20       e UNIQUE,. 
4890: 20 20 20 20 20 20 20 66 20 54 45 58 54 20 55 4e         f TEXT UN
48a0: 49 51 55 45 0a 20 20 20 20 20 20 29 3b 0a 20 20  IQUE.      );.  
48b0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
48c0: 74 31 30 62 20 53 45 4c 45 43 54 20 2a 20 46 52  t10b SELECT * FR
48d0: 4f 4d 20 74 31 30 3b 0a 20 20 20 20 7d 0a 20 20  OM t10;.    }.  
48e0: 20 20 63 6f 75 6e 74 20 7b 0a 20 20 20 20 20 20    count {.      
48f0: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
4900: 30 62 20 57 48 45 52 45 20 62 20 47 4c 4f 42 20  0b WHERE b GLOB 
4910: 27 31 32 2a 27 20 4f 52 44 45 52 20 42 59 20 2b  '12*' ORDER BY +
4920: 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 32  a;.    }.  } {12
4930: 20 31 32 33 20 73 63 61 6e 20 35 20 6c 69 6b 65   123 scan 5 like
4940: 20 36 7d 0a 20 20 64 6f 5f 74 65 73 74 20 6c 69   6}.  do_test li
4950: 6b 65 2d 31 30 2e 31 31 20 7b 0a 20 20 20 20 63  ke-10.11 {.    c
4960: 6f 75 6e 74 20 7b 0a 20 20 20 20 20 20 53 45 4c  ount {.      SEL
4970: 45 43 54 20 61 20 46 52 4f 4d 20 74 31 30 62 20  ECT a FROM t10b 
4980: 57 48 45 52 45 20 63 20 47 4c 4f 42 20 27 31 32  WHERE c GLOB '12
4990: 2a 27 20 4f 52 44 45 52 20 42 59 20 2b 61 3b 0a  *' ORDER BY +a;.
49a0: 20 20 20 20 7d 0a 20 20 7d 20 7b 31 32 20 31 32      }.  } {12 12
49b0: 33 20 73 63 61 6e 20 35 20 6c 69 6b 65 20 36 7d  3 scan 5 like 6}
49c0: 0a 20 20 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d  .  do_test like-
49d0: 31 30 2e 31 32 20 7b 0a 20 20 20 20 63 6f 75 6e  10.12 {.    coun
49e0: 74 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  t {.      SELECT
49f0: 20 61 20 46 52 4f 4d 20 74 31 30 62 20 57 48 45   a FROM t10b WHE
4a00: 52 45 20 64 20 47 4c 4f 42 20 27 31 32 2a 27 20  RE d GLOB '12*' 
4a10: 4f 52 44 45 52 20 42 59 20 2b 61 3b 0a 20 20 20  ORDER BY +a;.   
4a20: 20 7d 0a 20 20 7d 20 7b 31 32 20 31 32 33 20 73   }.  } {12 123 s
4a30: 63 61 6e 20 35 20 6c 69 6b 65 20 36 7d 0a 20 20  can 5 like 6}.  
4a40: 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 31 30 2e  do_test like-10.
4a50: 31 33 20 7b 0a 20 20 20 20 63 6f 75 6e 74 20 7b  13 {.    count {
4a60: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 20  .      SELECT a 
4a70: 46 52 4f 4d 20 74 31 30 62 20 57 48 45 52 45 20  FROM t10b WHERE 
4a80: 65 20 47 4c 4f 42 20 27 31 32 2a 27 20 4f 52 44  e GLOB '12*' ORD
4a90: 45 52 20 42 59 20 2b 61 3b 0a 20 20 20 20 7d 0a  ER BY +a;.    }.
4aa0: 20 20 7d 20 7b 31 32 20 31 32 33 20 73 63 61 6e    } {12 123 scan
4ab0: 20 35 20 6c 69 6b 65 20 36 7d 0a 20 20 64 6f 5f   5 like 6}.  do_
4ac0: 74 65 73 74 20 6c 69 6b 65 2d 31 30 2e 31 34 20  test like-10.14 
4ad0: 7b 0a 20 20 20 20 63 6f 75 6e 74 20 7b 0a 20 20  {.    count {.  
4ae0: 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f      SELECT a FRO
4af0: 4d 20 74 31 30 62 20 57 48 45 52 45 20 66 20 47  M t10b WHERE f G
4b00: 4c 4f 42 20 27 31 32 2a 27 20 4f 52 44 45 52 20  LOB '12*' ORDER 
4b10: 42 59 20 2b 61 3b 0a 20 20 20 20 7d 0a 20 20 7d  BY +a;.    }.  }
4b20: 20 7b 31 32 20 31 32 33 20 73 63 61 6e 20 33 20   {12 123 scan 3 
4b30: 6c 69 6b 65 20 30 7d 0a 20 20 64 6f 5f 74 65 73  like 0}.  do_tes
4b40: 74 20 6c 69 6b 65 2d 31 30 2e 31 35 20 7b 0a 20  t like-10.15 {. 
4b50: 20 20 20 63 6f 75 6e 74 20 7b 0a 20 20 20 20 20     count {.     
4b60: 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
4b70: 31 30 62 20 57 48 45 52 45 20 61 20 47 4c 4f 42  10b WHERE a GLOB
4b80: 20 27 31 32 2a 27 20 4f 52 44 45 52 20 42 59 20   '12*' ORDER BY 
4b90: 2b 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31  +a;.    }.  } {1
4ba0: 32 20 31 32 33 20 73 63 61 6e 20 35 20 6c 69 6b  2 123 scan 5 lik
4bb0: 65 20 36 7d 0a 7d 0a 0a 23 20 4c 49 4b 45 20 61  e 6}.}..# LIKE a
4bc0: 6e 64 20 47 4c 4f 42 20 77 68 65 72 65 20 74 68  nd GLOB where th
4bd0: 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  e default collat
4be0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20  ing sequence is 
4bf0: 6e 6f 74 20 61 70 70 72 6f 70 72 69 61 74 65 0a  not appropriate.
4c00: 23 20 62 75 74 20 61 6e 20 69 6e 64 65 78 20 77  # but an index w
4c10: 69 74 68 20 74 68 65 20 61 70 70 72 6f 70 72 69  ith the appropri
4c20: 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ate collating se
4c30: 71 75 65 6e 63 65 20 65 78 69 73 74 73 2e 0a 23  quence exists..#
4c40: 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 31 31  .do_test like-11
4c50: 2e 30 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .0 {.  execsql {
4c60: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
4c70: 45 20 74 31 31 28 0a 20 20 20 20 20 20 61 20 49  E t11(.      a I
4c80: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
4c90: 45 59 2c 0a 20 20 20 20 20 20 62 20 54 45 58 54  EY,.      b TEXT
4ca0: 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 2c   COLLATE nocase,
4cb0: 0a 20 20 20 20 20 20 63 20 54 45 58 54 20 43 4f  .      c TEXT CO
4cc0: 4c 4c 41 54 45 20 62 69 6e 61 72 79 0a 20 20 20  LLATE binary.   
4cd0: 20 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49   );.    INSERT I
4ce0: 4e 54 4f 20 74 31 31 20 56 41 4c 55 45 53 28 31  NTO t11 VALUES(1
4cf0: 2c 20 27 61 27 2c 27 61 27 29 3b 0a 20 20 20 20  , 'a','a');.    
4d00: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 31 20  INSERT INTO t11 
4d10: 56 41 4c 55 45 53 28 32 2c 20 27 61 62 27 2c 27  VALUES(2, 'ab','
4d20: 61 62 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  ab');.    INSERT
4d30: 20 49 4e 54 4f 20 74 31 31 20 56 41 4c 55 45 53   INTO t11 VALUES
4d40: 28 33 2c 20 27 61 62 63 27 2c 27 61 62 63 27 29  (3, 'abc','abc')
4d50: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
4d60: 4f 20 74 31 31 20 56 41 4c 55 45 53 28 34 2c 20  O t11 VALUES(4, 
4d70: 27 61 62 63 64 27 2c 27 61 62 63 64 27 29 3b 0a  'abcd','abcd');.
4d80: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
4d90: 74 31 31 20 56 41 4c 55 45 53 28 35 2c 20 27 41  t11 VALUES(5, 'A
4da0: 27 2c 27 41 27 29 3b 0a 20 20 20 20 49 4e 53 45  ','A');.    INSE
4db0: 52 54 20 49 4e 54 4f 20 74 31 31 20 56 41 4c 55  RT INTO t11 VALU
4dc0: 45 53 28 36 2c 20 27 41 42 27 2c 27 41 42 27 29  ES(6, 'AB','AB')
4dd0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
4de0: 4f 20 74 31 31 20 56 41 4c 55 45 53 28 37 2c 20  O t11 VALUES(7, 
4df0: 27 41 42 43 27 2c 27 41 42 43 27 29 3b 0a 20 20  'ABC','ABC');.  
4e00: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
4e10: 31 20 56 41 4c 55 45 53 28 38 2c 20 27 41 42 43  1 VALUES(8, 'ABC
4e20: 44 27 2c 27 41 42 43 44 27 29 3b 0a 20 20 20 20  D','ABCD');.    
4e30: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 31 20  INSERT INTO t11 
4e40: 56 41 4c 55 45 53 28 39 2c 20 27 78 27 2c 27 78  VALUES(9, 'x','x
4e50: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
4e60: 4e 54 4f 20 74 31 31 20 56 41 4c 55 45 53 28 31  NTO t11 VALUES(1
4e70: 30 2c 20 27 79 7a 27 2c 27 79 7a 27 29 3b 0a 20  0, 'yz','yz');. 
4e80: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
4e90: 31 31 20 56 41 4c 55 45 53 28 31 31 2c 20 27 58  11 VALUES(11, 'X
4ea0: 27 2c 27 58 27 29 3b 0a 20 20 20 20 49 4e 53 45  ','X');.    INSE
4eb0: 52 54 20 49 4e 54 4f 20 74 31 31 20 56 41 4c 55  RT INTO t11 VALU
4ec0: 45 53 28 31 32 2c 20 27 59 5a 27 2c 27 59 5a 27  ES(12, 'YZ','YZ'
4ed0: 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f  );.    SELECT co
4ee0: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 31 3b  unt(*) FROM t11;
4ef0: 0a 20 20 7d 0a 7d 20 7b 31 32 7d 0a 64 6f 5f 74  .  }.} {12}.do_t
4f00: 65 73 74 20 6c 69 6b 65 2d 31 31 2e 31 20 7b 0a  est like-11.1 {.
4f10: 20 20 64 62 20 65 76 61 6c 20 7b 50 52 41 47 4d    db eval {PRAGM
4f20: 41 20 63 61 73 65 5f 73 65 6e 73 69 74 69 76 65  A case_sensitive
4f30: 5f 6c 69 6b 65 3d 4f 46 46 3b 7d 0a 20 20 71 75  _like=OFF;}.  qu
4f40: 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45  eryplan {.    SE
4f50: 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 31 31 20  LECT b FROM t11 
4f60: 57 48 45 52 45 20 62 20 4c 49 4b 45 20 27 61 62  WHERE b LIKE 'ab
4f70: 63 25 27 20 4f 52 44 45 52 20 42 59 20 61 3b 0a  c%' ORDER BY a;.
4f80: 20 20 7d 0a 7d 20 7b 61 62 63 20 61 62 63 64 20    }.} {abc abcd 
4f90: 41 42 43 20 41 42 43 44 20 6e 6f 73 6f 72 74 20  ABC ABCD nosort 
4fa0: 74 31 31 20 2a 7d 0a 64 6f 5f 74 65 73 74 20 6c  t11 *}.do_test l
4fb0: 69 6b 65 2d 31 31 2e 32 20 7b 0a 20 20 64 62 20  ike-11.2 {.  db 
4fc0: 65 76 61 6c 20 7b 50 52 41 47 4d 41 20 63 61 73  eval {PRAGMA cas
4fd0: 65 5f 73 65 6e 73 69 74 69 76 65 5f 6c 69 6b 65  e_sensitive_like
4fe0: 3d 4f 4e 3b 7d 0a 20 20 71 75 65 72 79 70 6c 61  =ON;}.  querypla
4ff0: 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 62  n {.    SELECT b
5000: 20 46 52 4f 4d 20 74 31 31 20 57 48 45 52 45 20   FROM t11 WHERE 
5010: 62 20 4c 49 4b 45 20 27 61 62 63 25 27 20 4f 52  b LIKE 'abc%' OR
5020: 44 45 52 20 42 59 20 61 3b 0a 20 20 7d 0a 7d 20  DER BY a;.  }.} 
5030: 7b 61 62 63 20 61 62 63 64 20 6e 6f 73 6f 72 74  {abc abcd nosort
5040: 20 74 31 31 20 2a 7d 0a 64 6f 5f 74 65 73 74 20   t11 *}.do_test 
5050: 6c 69 6b 65 2d 31 31 2e 33 20 7b 0a 20 20 64 62  like-11.3 {.  db
5060: 20 65 76 61 6c 20 7b 0a 20 20 20 20 50 52 41 47   eval {.    PRAG
5070: 4d 41 20 63 61 73 65 5f 73 65 6e 73 69 74 69 76  MA case_sensitiv
5080: 65 5f 6c 69 6b 65 3d 4f 46 46 3b 0a 20 20 20 20  e_like=OFF;.    
5090: 43 52 45 41 54 45 20 49 4e 44 45 58 20 74 31 31  CREATE INDEX t11
50a0: 62 20 4f 4e 20 74 31 31 28 62 29 3b 0a 20 20 7d  b ON t11(b);.  }
50b0: 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20  .  queryplan {. 
50c0: 20 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d     SELECT b FROM
50d0: 20 74 31 31 20 57 48 45 52 45 20 62 20 4c 49 4b   t11 WHERE b LIK
50e0: 45 20 27 61 62 63 25 27 20 4f 52 44 45 52 20 42  E 'abc%' ORDER B
50f0: 59 20 2b 61 3b 0a 20 20 7d 0a 7d 20 7b 61 62 63  Y +a;.  }.} {abc
5100: 20 61 62 63 64 20 41 42 43 20 41 42 43 44 20 73   abcd ABC ABCD s
5110: 6f 72 74 20 7b 7d 20 74 31 31 62 7d 0a 64 6f 5f  ort {} t11b}.do_
5120: 74 65 73 74 20 6c 69 6b 65 2d 31 31 2e 34 20 7b  test like-11.4 {
5130: 0a 20 20 64 62 20 65 76 61 6c 20 7b 50 52 41 47  .  db eval {PRAG
5140: 4d 41 20 63 61 73 65 5f 73 65 6e 73 69 74 69 76  MA case_sensitiv
5150: 65 5f 6c 69 6b 65 3d 4f 4e 3b 7d 0a 20 20 71 75  e_like=ON;}.  qu
5160: 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45  eryplan {.    SE
5170: 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 31 31 20  LECT b FROM t11 
5180: 57 48 45 52 45 20 62 20 4c 49 4b 45 20 27 61 62  WHERE b LIKE 'ab
5190: 63 25 27 20 4f 52 44 45 52 20 42 59 20 61 3b 0a  c%' ORDER BY a;.
51a0: 20 20 7d 0a 7d 20 7b 61 62 63 20 61 62 63 64 20    }.} {abc abcd 
51b0: 6e 6f 73 6f 72 74 20 74 31 31 20 2a 7d 0a 64 6f  nosort t11 *}.do
51c0: 5f 74 65 73 74 20 6c 69 6b 65 2d 31 31 2e 35 20  _test like-11.5 
51d0: 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b 0a 20 20  {.  db eval {.  
51e0: 20 20 50 52 41 47 4d 41 20 63 61 73 65 5f 73 65    PRAGMA case_se
51f0: 6e 73 69 74 69 76 65 5f 6c 69 6b 65 3d 4f 46 46  nsitive_like=OFF
5200: 3b 0a 20 20 20 20 44 52 4f 50 20 49 4e 44 45 58  ;.    DROP INDEX
5210: 20 74 31 31 62 3b 0a 20 20 20 20 43 52 45 41 54   t11b;.    CREAT
5220: 45 20 49 4e 44 45 58 20 74 31 31 62 6e 63 20 4f  E INDEX t11bnc O
5230: 4e 20 74 31 31 28 62 20 43 4f 4c 4c 41 54 45 20  N t11(b COLLATE 
5240: 6e 6f 63 61 73 65 29 3b 0a 20 20 7d 0a 20 20 71  nocase);.  }.  q
5250: 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53  ueryplan {.    S
5260: 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 31 31  ELECT b FROM t11
5270: 20 57 48 45 52 45 20 62 20 4c 49 4b 45 20 27 61   WHERE b LIKE 'a
5280: 62 63 25 27 20 4f 52 44 45 52 20 42 59 20 2b 61  bc%' ORDER BY +a
5290: 3b 0a 20 20 7d 0a 7d 20 7b 61 62 63 20 61 62 63  ;.  }.} {abc abc
52a0: 64 20 41 42 43 20 41 42 43 44 20 73 6f 72 74 20  d ABC ABCD sort 
52b0: 7b 7d 20 74 31 31 62 6e 63 7d 0a 64 6f 5f 74 65  {} t11bnc}.do_te
52c0: 73 74 20 6c 69 6b 65 2d 31 31 2e 36 20 7b 0a 20  st like-11.6 {. 
52d0: 20 64 62 20 65 76 61 6c 20 7b 43 52 45 41 54 45   db eval {CREATE
52e0: 20 49 4e 44 45 58 20 74 31 31 62 62 20 4f 4e 20   INDEX t11bb ON 
52f0: 74 31 31 28 62 20 43 4f 4c 4c 41 54 45 20 62 69  t11(b COLLATE bi
5300: 6e 61 72 79 29 3b 7d 0a 20 20 71 75 65 72 79 70  nary);}.  queryp
5310: 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  lan {.    SELECT
5320: 20 62 20 46 52 4f 4d 20 74 31 31 20 57 48 45 52   b FROM t11 WHER
5330: 45 20 62 20 4c 49 4b 45 20 27 61 62 63 25 27 20  E b LIKE 'abc%' 
5340: 4f 52 44 45 52 20 42 59 20 2b 61 3b 0a 20 20 7d  ORDER BY +a;.  }
5350: 0a 7d 20 7b 61 62 63 20 61 62 63 64 20 41 42 43  .} {abc abcd ABC
5360: 20 41 42 43 44 20 73 6f 72 74 20 7b 7d 20 74 31   ABCD sort {} t1
5370: 31 62 6e 63 7d 0a 64 6f 5f 74 65 73 74 20 6c 69  1bnc}.do_test li
5380: 6b 65 2d 31 31 2e 37 20 7b 0a 20 20 64 62 20 65  ke-11.7 {.  db e
5390: 76 61 6c 20 7b 50 52 41 47 4d 41 20 63 61 73 65  val {PRAGMA case
53a0: 5f 73 65 6e 73 69 74 69 76 65 5f 6c 69 6b 65 3d  _sensitive_like=
53b0: 4f 4e 3b 7d 0a 20 20 71 75 65 72 79 70 6c 61 6e  ON;}.  queryplan
53c0: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 62 20   {.    SELECT b 
53d0: 46 52 4f 4d 20 74 31 31 20 57 48 45 52 45 20 62  FROM t11 WHERE b
53e0: 20 4c 49 4b 45 20 27 61 62 63 25 27 20 4f 52 44   LIKE 'abc%' ORD
53f0: 45 52 20 42 59 20 2b 61 3b 0a 20 20 7d 0a 7d 20  ER BY +a;.  }.} 
5400: 7b 61 62 63 20 61 62 63 64 20 73 6f 72 74 20 7b  {abc abcd sort {
5410: 7d 20 74 31 31 62 62 7d 0a 64 6f 5f 74 65 73 74  } t11bb}.do_test
5420: 20 6c 69 6b 65 2d 31 31 2e 38 20 7b 0a 20 20 64   like-11.8 {.  d
5430: 62 20 65 76 61 6c 20 7b 50 52 41 47 4d 41 20 63  b eval {PRAGMA c
5440: 61 73 65 5f 73 65 6e 73 69 74 69 76 65 5f 6c 69  ase_sensitive_li
5450: 6b 65 3d 4f 46 46 3b 7d 0a 20 20 71 75 65 72 79  ke=OFF;}.  query
5460: 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43  plan {.    SELEC
5470: 54 20 62 20 46 52 4f 4d 20 74 31 31 20 57 48 45  T b FROM t11 WHE
5480: 52 45 20 62 20 47 4c 4f 42 20 27 61 62 63 2a 27  RE b GLOB 'abc*'
5490: 20 4f 52 44 45 52 20 42 59 20 2b 61 3b 0a 20 20   ORDER BY +a;.  
54a0: 7d 0a 7d 20 7b 61 62 63 20 61 62 63 64 20 73 6f  }.} {abc abcd so
54b0: 72 74 20 7b 7d 20 74 31 31 62 62 7d 0a 64 6f 5f  rt {} t11bb}.do_
54c0: 74 65 73 74 20 6c 69 6b 65 2d 31 31 2e 39 20 7b  test like-11.9 {
54d0: 0a 20 20 64 62 20 65 76 61 6c 20 7b 0a 20 20 20  .  db eval {.   
54e0: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 74 31   CREATE INDEX t1
54f0: 31 63 6e 63 20 4f 4e 20 74 31 31 28 63 20 43 4f  1cnc ON t11(c CO
5500: 4c 4c 41 54 45 20 6e 6f 63 61 73 65 29 3b 0a 20  LLATE nocase);. 
5510: 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
5520: 74 31 31 63 62 20 4f 4e 20 74 31 31 28 63 20 43  t11cb ON t11(c C
5530: 4f 4c 4c 41 54 45 20 62 69 6e 61 72 79 29 3b 0a  OLLATE binary);.
5540: 20 20 7d 0a 20 20 71 75 65 72 79 70 6c 61 6e 20    }.  queryplan 
5550: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 63 20 46  {.    SELECT c F
5560: 52 4f 4d 20 74 31 31 20 57 48 45 52 45 20 63 20  ROM t11 WHERE c 
5570: 4c 49 4b 45 20 27 61 62 63 25 27 20 4f 52 44 45  LIKE 'abc%' ORDE
5580: 52 20 42 59 20 2b 61 3b 0a 20 20 7d 0a 7d 20 7b  R BY +a;.  }.} {
5590: 61 62 63 20 61 62 63 64 20 41 42 43 20 41 42 43  abc abcd ABC ABC
55a0: 44 20 73 6f 72 74 20 7b 7d 20 74 31 31 63 6e 63  D sort {} t11cnc
55b0: 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 31  }.do_test like-1
55c0: 31 2e 31 30 20 7b 0a 20 20 71 75 65 72 79 70 6c  1.10 {.  querypl
55d0: 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  an {.    SELECT 
55e0: 63 20 46 52 4f 4d 20 74 31 31 20 57 48 45 52 45  c FROM t11 WHERE
55f0: 20 63 20 47 4c 4f 42 20 27 61 62 63 2a 27 20 4f   c GLOB 'abc*' O
5600: 52 44 45 52 20 42 59 20 2b 61 3b 0a 20 20 7d 0a  RDER BY +a;.  }.
5610: 7d 20 7b 61 62 63 20 61 62 63 64 20 73 6f 72 74  } {abc abcd sort
5620: 20 7b 7d 20 74 31 31 63 62 7d 0a 0a 23 20 41 20   {} t11cb}..# A 
5630: 43 4f 4c 4c 41 54 45 20 63 6c 61 75 73 65 20 6f  COLLATE clause o
5640: 6e 20 74 68 65 20 70 61 74 74 65 72 6e 20 64 6f  n the pattern do
5650: 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68  es not change th
5660: 65 20 72 65 73 75 6c 74 20 6f 66 20 61 0a 23 20  e result of a.# 
5670: 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 2e 0a 23  LIKE operator..#
5680: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
5690: 20 6c 69 6b 65 2d 31 32 2e 31 20 7b 0a 20 20 43   like-12.1 {.  C
56a0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 32 6e  REATE TABLE t12n
56b0: 63 28 69 64 20 49 4e 54 45 47 45 52 2c 20 78 20  c(id INTEGER, x 
56c0: 54 45 58 54 20 55 4e 49 51 55 45 20 43 4f 4c 4c  TEXT UNIQUE COLL
56d0: 41 54 45 20 6e 6f 63 61 73 65 29 3b 0a 20 20 49  ATE nocase);.  I
56e0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 32 6e 63  NSERT INTO t12nc
56f0: 20 56 41 4c 55 45 53 28 31 2c 27 61 62 63 64 65   VALUES(1,'abcde
5700: 27 29 2c 28 32 2c 27 75 76 77 78 79 27 29 2c 28  '),(2,'uvwxy'),(
5710: 33 2c 27 41 42 43 44 45 46 27 29 3b 0a 20 20 43  3,'ABCDEF');.  C
5720: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 32 62  REATE TABLE t12b
5730: 28 69 64 20 49 4e 54 45 47 45 52 2c 20 78 20 54  (id INTEGER, x T
5740: 45 58 54 20 55 4e 49 51 55 45 20 43 4f 4c 4c 41  EXT UNIQUE COLLA
5750: 54 45 20 62 69 6e 61 72 79 29 3b 0a 20 20 49 4e  TE binary);.  IN
5760: 53 45 52 54 20 49 4e 54 4f 20 74 31 32 62 20 56  SERT INTO t12b V
5770: 41 4c 55 45 53 28 31 2c 27 61 62 63 64 65 27 29  ALUES(1,'abcde')
5780: 2c 28 32 2c 27 75 76 77 78 79 27 29 2c 28 33 2c  ,(2,'uvwxy'),(3,
5790: 27 41 42 43 44 45 46 27 29 3b 0a 20 20 53 45 4c  'ABCDEF');.  SEL
57a0: 45 43 54 20 69 64 20 46 52 4f 4d 20 74 31 32 6e  ECT id FROM t12n
57b0: 63 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27  c WHERE x LIKE '
57c0: 61 62 63 25 27 20 4f 52 44 45 52 20 42 59 20 2b  abc%' ORDER BY +
57d0: 69 64 3b 0a 7d 20 7b 31 20 33 7d 0a 64 6f 5f 65  id;.} {1 3}.do_e
57e0: 78 65 63 73 71 6c 5f 74 65 73 74 20 6c 69 6b 65  xecsql_test like
57f0: 2d 31 32 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54  -12.2 {.  SELECT
5800: 20 69 64 20 46 52 4f 4d 20 74 31 32 62 20 57 48   id FROM t12b WH
5810: 45 52 45 20 78 20 4c 49 4b 45 20 27 61 62 63 25  ERE x LIKE 'abc%
5820: 27 20 4f 52 44 45 52 20 42 59 20 2b 69 64 3b 0a  ' ORDER BY +id;.
5830: 7d 20 7b 31 20 33 7d 0a 64 6f 5f 65 78 65 63 73  } {1 3}.do_execs
5840: 71 6c 5f 74 65 73 74 20 6c 69 6b 65 2d 31 32 2e  ql_test like-12.
5850: 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 69 64 20  3 {.  SELECT id 
5860: 46 52 4f 4d 20 74 31 32 6e 63 20 57 48 45 52 45  FROM t12nc WHERE
5870: 20 78 20 4c 49 4b 45 20 27 61 62 63 25 27 20 43   x LIKE 'abc%' C
5880: 4f 4c 4c 41 54 45 20 62 69 6e 61 72 79 20 4f 52  OLLATE binary OR
5890: 44 45 52 20 42 59 20 2b 69 64 3b 0a 7d 20 7b 31  DER BY +id;.} {1
58a0: 20 33 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74   3}.do_execsql_t
58b0: 65 73 74 20 6c 69 6b 65 2d 31 32 2e 34 20 7b 0a  est like-12.4 {.
58c0: 20 20 53 45 4c 45 43 54 20 69 64 20 46 52 4f 4d    SELECT id FROM
58d0: 20 74 31 32 62 20 57 48 45 52 45 20 78 20 4c 49   t12b WHERE x LI
58e0: 4b 45 20 27 61 62 63 25 27 20 43 4f 4c 4c 41 54  KE 'abc%' COLLAT
58f0: 45 20 62 69 6e 61 72 79 20 4f 52 44 45 52 20 42  E binary ORDER B
5900: 59 20 2b 69 64 3b 0a 7d 20 7b 31 20 33 7d 0a 64  Y +id;.} {1 3}.d
5910: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 6c  o_execsql_test l
5920: 69 6b 65 2d 31 32 2e 35 20 7b 0a 20 20 53 45 4c  ike-12.5 {.  SEL
5930: 45 43 54 20 69 64 20 46 52 4f 4d 20 74 31 32 6e  ECT id FROM t12n
5940: 63 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27  c WHERE x LIKE '
5950: 61 62 63 25 27 20 43 4f 4c 4c 41 54 45 20 6e 6f  abc%' COLLATE no
5960: 63 61 73 65 20 4f 52 44 45 52 20 42 59 20 2b 69  case ORDER BY +i
5970: 64 3b 0a 7d 20 7b 31 20 33 7d 0a 64 6f 5f 65 78  d;.} {1 3}.do_ex
5980: 65 63 73 71 6c 5f 74 65 73 74 20 6c 69 6b 65 2d  ecsql_test like-
5990: 31 32 2e 36 20 7b 0a 20 20 53 45 4c 45 43 54 20  12.6 {.  SELECT 
59a0: 69 64 20 46 52 4f 4d 20 74 31 32 62 20 57 48 45  id FROM t12b WHE
59b0: 52 45 20 78 20 4c 49 4b 45 20 27 61 62 63 25 27  RE x LIKE 'abc%'
59c0: 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20   COLLATE nocase 
59d0: 4f 52 44 45 52 20 42 59 20 2b 69 64 3b 0a 7d 20  ORDER BY +id;.} 
59e0: 7b 31 20 33 7d 0a 0a 23 20 41 64 64 69 6e 67 20  {1 3}..# Adding 
59f0: 61 20 43 4f 4c 4c 41 54 45 20 63 6c 61 75 73 65  a COLLATE clause
5a00: 20 74 6f 20 74 68 65 20 70 61 74 74 65 72 6e 20   to the pattern 
5a10: 6f 66 20 61 20 4c 49 4b 45 20 6f 70 65 72 61 74  of a LIKE operat
5a20: 6f 72 20 64 6f 65 73 20 6e 6f 74 68 69 6e 67 0a  or does nothing.
5a30: 23 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  # to change the 
5a40: 73 75 69 74 61 62 69 6c 69 74 79 20 6f 66 20 75  suitability of u
5a50: 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f  sing an index to
5a60: 20 73 61 74 69 73 66 79 20 74 68 61 74 20 4c 49   satisfy that LI
5a70: 4b 45 0a 23 20 6f 70 65 72 61 74 6f 72 2e 0a 23  KE.# operator..#
5a80: 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74  .do_execsql_test
5a90: 20 6c 69 6b 65 2d 31 32 2e 31 31 20 7b 0a 20 20   like-12.11 {.  
5aa0: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
5ab0: 41 4e 0a 20 20 53 45 4c 45 43 54 20 69 64 20 46  AN.  SELECT id F
5ac0: 52 4f 4d 20 74 31 32 6e 63 20 57 48 45 52 45 20  ROM t12nc WHERE 
5ad0: 78 20 4c 49 4b 45 20 27 61 62 63 25 27 20 4f 52  x LIKE 'abc%' OR
5ae0: 44 45 52 20 42 59 20 2b 69 64 3b 0a 7d 20 7b 2f  DER BY +id;.} {/
5af0: 53 45 41 52 43 48 2f 7d 0a 64 6f 5f 65 78 65 63  SEARCH/}.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 31 32 20 7b 0a 20 20 45 58 50 4c 41 49 4e 20  .12 {.  EXPLAIN 
5b20: 51 55 45 52 59 20 50 4c 41 4e 0a 20 20 53 45 4c  QUERY PLAN.  SEL
5b30: 45 43 54 20 69 64 20 46 52 4f 4d 20 74 31 32 62  ECT id FROM t12b
5b40: 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27 61   WHERE x LIKE 'a
5b50: 62 63 25 27 20 4f 52 44 45 52 20 42 59 20 2b 69  bc%' ORDER BY +i
5b60: 64 3b 0a 7d 20 7b 2f 53 43 41 4e 2f 7d 0a 64 6f  d;.} {/SCAN/}.do
5b70: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 6c 69  _execsql_test li
5b80: 6b 65 2d 31 32 2e 31 33 20 7b 0a 20 20 45 58 50  ke-12.13 {.  EXP
5b90: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a  LAIN QUERY PLAN.
5ba0: 20 20 53 45 4c 45 43 54 20 69 64 20 46 52 4f 4d    SELECT id FROM
5bb0: 20 74 31 32 6e 63 20 57 48 45 52 45 20 78 20 4c   t12nc WHERE x L
5bc0: 49 4b 45 20 27 61 62 63 25 27 20 43 4f 4c 4c 41  IKE 'abc%' COLLA
5bd0: 54 45 20 6e 6f 63 61 73 65 20 4f 52 44 45 52 20  TE nocase ORDER 
5be0: 42 59 20 2b 69 64 3b 0a 7d 20 7b 2f 53 45 41 52  BY +id;.} {/SEAR
5bf0: 43 48 2f 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  CH/}.do_execsql_
5c00: 74 65 73 74 20 6c 69 6b 65 2d 31 32 2e 31 34 20  test like-12.14 
5c10: 7b 0a 20 20 45 58 50 4c 41 49 4e 20 51 55 45 52  {.  EXPLAIN QUER
5c20: 59 20 50 4c 41 4e 0a 20 20 53 45 4c 45 43 54 20  Y PLAN.  SELECT 
5c30: 69 64 20 46 52 4f 4d 20 74 31 32 62 20 57 48 45  id FROM t12b WHE
5c40: 52 45 20 78 20 4c 49 4b 45 20 27 61 62 63 25 27  RE x LIKE 'abc%'
5c50: 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20   COLLATE nocase 
5c60: 4f 52 44 45 52 20 42 59 20 2b 69 64 3b 0a 7d 20  ORDER BY +id;.} 
5c70: 7b 2f 53 43 41 4e 2f 7d 0a 64 6f 5f 65 78 65 63  {/SCAN/}.do_exec
5c80: 73 71 6c 5f 74 65 73 74 20 6c 69 6b 65 2d 31 32  sql_test like-12
5c90: 2e 31 35 20 7b 0a 20 20 45 58 50 4c 41 49 4e 20  .15 {.  EXPLAIN 
5ca0: 51 55 45 52 59 20 50 4c 41 4e 0a 20 20 53 45 4c  QUERY PLAN.  SEL
5cb0: 45 43 54 20 69 64 20 46 52 4f 4d 20 74 31 32 6e  ECT id FROM t12n
5cc0: 63 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27  c WHERE x LIKE '
5cd0: 61 62 63 25 27 20 43 4f 4c 4c 41 54 45 20 62 69  abc%' COLLATE bi
5ce0: 6e 61 72 79 20 4f 52 44 45 52 20 42 59 20 2b 69  nary ORDER BY +i
5cf0: 64 3b 0a 7d 20 7b 2f 53 45 41 52 43 48 2f 7d 0a  d;.} {/SEARCH/}.
5d00: 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20  do_execsql_test 
5d10: 6c 69 6b 65 2d 31 32 2e 31 36 20 7b 0a 20 20 45  like-12.16 {.  E
5d20: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
5d30: 4e 0a 20 20 53 45 4c 45 43 54 20 69 64 20 46 52  N.  SELECT id FR
5d40: 4f 4d 20 74 31 32 62 20 57 48 45 52 45 20 78 20  OM t12b WHERE x 
5d50: 4c 49 4b 45 20 27 61 62 63 25 27 20 43 4f 4c 4c  LIKE 'abc%' COLL
5d60: 41 54 45 20 62 69 6e 61 72 79 20 4f 52 44 45 52  ATE binary ORDER
5d70: 20 42 59 20 2b 69 64 3b 0a 7d 20 7b 2f 53 43 41   BY +id;.} {/SCA
5d80: 4e 2f 7d 0a 0a 0a 66 69 6e 69 73 68 5f 74 65 73  N/}...finish_tes
5d90: 74 0a                                            t.