/ Hex Artifact Content
Login

Artifact 0f64aeaed50b6e3ebaef3af0b3b8f894aed5acca:


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 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
05f0: 20 20 20 50 52 41 47 4d 41 20 63 61 73 65 5f 73     PRAGMA case_s
0600: 65 6e 73 69 74 69 76 65 5f 6c 69 6b 65 3d 6f 6e  ensitive_like=on
0610: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 78 20 46  ;.    SELECT x F
0620: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 78 20 4c  ROM t1 WHERE x L
0630: 49 4b 45 20 27 61 62 63 27 20 4f 52 44 45 52 20  IKE 'abc' ORDER 
0640: 42 59 20 31 3b 0a 20 20 7d 0a 7d 20 7b 61 62 63  BY 1;.  }.} {abc
0650: 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 31  }.do_test like-1
0660: 2e 35 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  .5.2 {.  execsql
0670: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61   {.    PRAGMA ca
0680: 73 65 5f 73 65 6e 73 69 74 69 76 65 5f 6c 69 6b  se_sensitive_lik
0690: 65 3b 20 2d 2d 20 6e 6f 20 61 72 67 75 6d 65 6e  e; -- no argumen
06a0: 74 3b 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e  t; does not chan
06b0: 67 65 20 73 65 74 74 69 6e 67 0a 20 20 20 20 53  ge setting.    S
06c0: 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20  ELECT x FROM t1 
06d0: 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27 61 62  WHERE x LIKE 'ab
06e0: 63 27 20 4f 52 44 45 52 20 42 59 20 31 3b 0a 20  c' ORDER BY 1;. 
06f0: 20 7d 0a 7d 20 7b 61 62 63 7d 0a 64 6f 5f 74 65   }.} {abc}.do_te
0700: 73 74 20 6c 69 6b 65 2d 31 2e 36 20 7b 0a 20 20  st like-1.6 {.  
0710: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
0720: 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20 57  LECT x FROM t1 W
0730: 48 45 52 45 20 78 20 47 4c 4f 42 20 27 61 62 63  HERE x GLOB 'abc
0740: 27 20 4f 52 44 45 52 20 42 59 20 31 3b 0a 20 20  ' ORDER BY 1;.  
0750: 7d 0a 7d 20 7b 61 62 63 7d 0a 64 6f 5f 74 65 73  }.} {abc}.do_tes
0760: 74 20 6c 69 6b 65 2d 31 2e 37 20 7b 0a 20 20 65  t like-1.7 {.  e
0770: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
0780: 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20 57 48  ECT x FROM t1 WH
0790: 45 52 45 20 78 20 4c 49 4b 45 20 27 41 42 43 27  ERE x LIKE 'ABC'
07a0: 20 4f 52 44 45 52 20 42 59 20 31 3b 0a 20 20 7d   ORDER BY 1;.  }
07b0: 0a 7d 20 7b 41 42 43 7d 0a 64 6f 5f 74 65 73 74  .} {ABC}.do_test
07c0: 20 6c 69 6b 65 2d 31 2e 38 20 7b 0a 20 20 65 78   like-1.8 {.  ex
07d0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  ecsql {.    SELE
07e0: 43 54 20 78 20 46 52 4f 4d 20 74 31 20 57 48 45  CT x FROM t1 WHE
07f0: 52 45 20 78 20 4c 49 4b 45 20 27 61 42 63 27 20  RE x LIKE 'aBc' 
0800: 4f 52 44 45 52 20 42 59 20 31 3b 0a 20 20 7d 0a  ORDER BY 1;.  }.
0810: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b  } {}.do_test lik
0820: 65 2d 31 2e 39 20 7b 0a 20 20 65 78 65 63 73 71  e-1.9 {.  execsq
0830: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63  l {.    PRAGMA c
0840: 61 73 65 5f 73 65 6e 73 69 74 69 76 65 5f 6c 69  ase_sensitive_li
0850: 6b 65 3d 6f 66 66 3b 0a 20 20 20 20 53 45 4c 45  ke=off;.    SELE
0860: 43 54 20 78 20 46 52 4f 4d 20 74 31 20 57 48 45  CT x FROM t1 WHE
0870: 52 45 20 78 20 4c 49 4b 45 20 27 61 62 63 27 20  RE x LIKE 'abc' 
0880: 4f 52 44 45 52 20 42 59 20 31 3b 0a 20 20 7d 0a  ORDER BY 1;.  }.
0890: 7d 20 7b 41 42 43 20 61 62 63 7d 0a 64 6f 5f 74  } {ABC abc}.do_t
08a0: 65 73 74 20 6c 69 6b 65 2d 31 2e 31 30 20 7b 0a  est like-1.10 {.
08b0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
08c0: 50 52 41 47 4d 41 20 63 61 73 65 5f 73 65 6e 73  PRAGMA case_sens
08d0: 69 74 69 76 65 5f 6c 69 6b 65 3b 20 20 2d 2d 20  itive_like;  -- 
08e0: 4e 6f 20 61 72 67 75 6d 65 6e 74 2c 20 64 6f 65  No argument, doe
08f0: 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 73 65 74  s not change set
0900: 74 69 6e 67 2e 0a 20 20 20 20 53 45 4c 45 43 54  ting..    SELECT
0910: 20 78 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   x FROM t1 WHERE
0920: 20 78 20 4c 49 4b 45 20 27 61 62 63 27 20 4f 52   x LIKE 'abc' OR
0930: 44 45 52 20 42 59 20 31 3b 0a 20 20 7d 0a 7d 20  DER BY 1;.  }.} 
0940: 7b 41 42 43 20 61 62 63 7d 0a 0a 23 20 54 65 73  {ABC abc}..# Tes
0950: 74 73 20 6f 66 20 74 68 65 20 52 45 47 45 58 50  ts of the REGEXP
0960: 20 6f 70 65 72 61 74 6f 72 0a 23 0a 64 6f 5f 74   operator.#.do_t
0970: 65 73 74 20 6c 69 6b 65 2d 32 2e 31 20 7b 0a 20  est like-2.1 {. 
0980: 20 70 72 6f 63 20 74 65 73 74 5f 72 65 67 65 78   proc test_regex
0990: 70 20 7b 61 20 62 7d 20 7b 0a 20 20 20 20 72 65  p {a b} {.    re
09a0: 74 75 72 6e 20 5b 72 65 67 65 78 70 20 24 61 20  turn [regexp $a 
09b0: 24 62 5d 0a 20 20 7d 0a 20 20 64 62 20 66 75 6e  $b].  }.  db fun
09c0: 63 74 69 6f 6e 20 72 65 67 65 78 70 20 2d 61 72  ction regexp -ar
09d0: 67 63 6f 75 6e 74 20 32 20 74 65 73 74 5f 72 65  gcount 2 test_re
09e0: 67 65 78 70 0a 20 20 65 78 65 63 73 71 6c 20 7b  gexp.  execsql {
09f0: 0a 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52  .    SELECT x FR
0a00: 4f 4d 20 74 31 20 57 48 45 52 45 20 78 20 52 45  OM t1 WHERE x RE
0a10: 47 45 58 50 20 27 61 62 63 27 20 4f 52 44 45 52  GEXP 'abc' ORDER
0a20: 20 42 59 20 31 3b 0a 20 20 7d 0a 7d 20 7b 7b 41   BY 1;.  }.} {{A
0a30: 42 43 20 61 62 63 20 78 79 7a 7d 20 61 62 63 20  BC abc xyz} abc 
0a40: 61 62 63 64 7d 0a 64 6f 5f 74 65 73 74 20 6c 69  abcd}.do_test li
0a50: 6b 65 2d 32 2e 32 20 7b 0a 20 20 65 78 65 63 73  ke-2.2 {.  execs
0a60: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
0a70: 78 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  x FROM t1 WHERE 
0a80: 78 20 52 45 47 45 58 50 20 27 5e 61 62 63 27 20  x REGEXP '^abc' 
0a90: 4f 52 44 45 52 20 42 59 20 31 3b 0a 20 20 7d 0a  ORDER BY 1;.  }.
0aa0: 7d 20 7b 61 62 63 20 61 62 63 64 7d 0a 0a 23 20  } {abc abcd}..# 
0ab0: 54 65 73 74 73 20 6f 66 20 74 68 65 20 4d 41 54  Tests of the MAT
0ac0: 43 48 20 6f 70 65 72 61 74 6f 72 0a 23 0a 64 6f  CH operator.#.do
0ad0: 5f 74 65 73 74 20 6c 69 6b 65 2d 32 2e 33 20 7b  _test like-2.3 {
0ae0: 0a 20 20 70 72 6f 63 20 74 65 73 74 5f 6d 61 74  .  proc test_mat
0af0: 63 68 20 7b 61 20 62 7d 20 7b 0a 20 20 20 20 72  ch {a b} {.    r
0b00: 65 74 75 72 6e 20 5b 73 74 72 69 6e 67 20 6d 61  eturn [string ma
0b10: 74 63 68 20 24 61 20 24 62 5d 0a 20 20 7d 0a 20  tch $a $b].  }. 
0b20: 20 64 62 20 66 75 6e 63 74 69 6f 6e 20 6d 61 74   db function mat
0b30: 63 68 20 2d 61 72 67 63 6f 75 6e 74 20 32 20 74  ch -argcount 2 t
0b40: 65 73 74 5f 6d 61 74 63 68 0a 20 20 65 78 65 63  est_match.  exec
0b50: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
0b60: 20 78 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   x FROM t1 WHERE
0b70: 20 78 20 4d 41 54 43 48 20 27 2a 61 62 63 2a 27   x MATCH '*abc*'
0b80: 20 4f 52 44 45 52 20 42 59 20 31 3b 0a 20 20 7d   ORDER BY 1;.  }
0b90: 0a 7d 20 7b 7b 41 42 43 20 61 62 63 20 78 79 7a  .} {{ABC abc xyz
0ba0: 7d 20 61 62 63 20 61 62 63 64 7d 0a 64 6f 5f 74  } abc abcd}.do_t
0bb0: 65 73 74 20 6c 69 6b 65 2d 32 2e 34 20 7b 0a 20  est like-2.4 {. 
0bc0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53   execsql {.    S
0bd0: 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20  ELECT x FROM t1 
0be0: 57 48 45 52 45 20 78 20 4d 41 54 43 48 20 27 61  WHERE x MATCH 'a
0bf0: 62 63 2a 27 20 4f 52 44 45 52 20 42 59 20 31 3b  bc*' ORDER BY 1;
0c00: 0a 20 20 7d 0a 7d 20 7b 61 62 63 20 61 62 63 64  .  }.} {abc abcd
0c10: 7d 0a 0a 23 20 46 6f 72 20 74 68 65 20 72 65 6d  }..# For the rem
0c20: 61 69 6e 69 6e 67 20 74 65 73 74 73 2c 20 77 65  aining tests, we
0c30: 20 6e 65 65 64 20 74 6f 20 68 61 76 65 20 74 68   need to have th
0c40: 65 20 6c 69 6b 65 20 6f 70 74 69 6d 69 7a 61 74  e like optimizat
0c50: 69 6f 6e 73 0a 23 20 65 6e 61 62 6c 65 64 2e 0a  ions.# enabled..
0c60: 23 0a 69 66 63 61 70 61 62 6c 65 20 21 6c 69 6b  #.ifcapable !lik
0c70: 65 5f 6f 70 74 20 7b 0a 20 20 66 69 6e 69 73 68  e_opt {.  finish
0c80: 5f 74 65 73 74 0a 20 20 72 65 74 75 72 6e 0a 7d  _test.  return.}
0c90: 20 0a 0a 23 20 54 68 69 73 20 70 72 6f 63 65 64   ..# This proced
0ca0: 75 72 65 20 65 78 65 63 75 74 65 73 20 74 68 65  ure executes the
0cb0: 20 53 51 4c 2e 20 20 54 68 65 6e 20 69 74 20 61   SQL.  Then it a
0cc0: 70 70 65 6e 64 73 20 74 6f 20 74 68 65 20 72 65  ppends to the re
0cd0: 73 75 6c 74 20 74 68 65 0a 23 20 22 73 6f 72 74  sult the.# "sort
0ce0: 22 20 6f 72 20 22 6e 6f 73 6f 72 74 22 20 6b 65  " or "nosort" ke
0cf0: 79 77 6f 72 64 20 28 61 73 20 69 6e 20 74 68 65  yword (as in the
0d00: 20 63 6b 73 6f 72 74 20 70 72 6f 63 65 64 75 72   cksort procedur
0d10: 65 20 61 62 6f 76 65 29 20 74 68 65 6e 0a 23 20  e above) then.# 
0d20: 69 74 20 61 70 70 65 6e 64 73 20 74 68 65 20 3a  it appends the :
0d30: 3a 73 71 6c 69 74 65 5f 71 75 65 72 79 5f 70 6c  :sqlite_query_pl
0d40: 61 6e 20 76 61 72 69 61 62 6c 65 2e 0a 23 0a 70  an variable..#.p
0d50: 72 6f 63 20 71 75 65 72 79 70 6c 61 6e 20 7b 73  roc queryplan {s
0d60: 71 6c 7d 20 7b 0a 20 20 73 65 74 20 3a 3a 73 71  ql} {.  set ::sq
0d70: 6c 69 74 65 5f 73 6f 72 74 5f 63 6f 75 6e 74 20  lite_sort_count 
0d80: 30 0a 20 20 73 65 74 20 64 61 74 61 20 5b 65 78  0.  set data [ex
0d90: 65 63 73 71 6c 20 24 73 71 6c 5d 0a 20 20 69 66  ecsql $sql].  if
0da0: 20 7b 24 3a 3a 73 71 6c 69 74 65 5f 73 6f 72 74   {$::sqlite_sort
0db0: 5f 63 6f 75 6e 74 7d 20 7b 73 65 74 20 78 20 73  _count} {set x s
0dc0: 6f 72 74 7d 20 7b 73 65 74 20 78 20 6e 6f 73 6f  ort} {set x noso
0dd0: 72 74 7d 0a 20 20 6c 61 70 70 65 6e 64 20 64 61  rt}.  lappend da
0de0: 74 61 20 24 78 0a 20 20 72 65 74 75 72 6e 20 5b  ta $x.  return [
0df0: 63 6f 6e 63 61 74 20 24 64 61 74 61 20 24 3a 3a  concat $data $::
0e00: 73 71 6c 69 74 65 5f 71 75 65 72 79 5f 70 6c 61  sqlite_query_pla
0e10: 6e 5d 0a 7d 0a 0a 23 20 50 65 72 66 6f 72 6d 20  n].}..# Perform 
0e20: 74 65 73 74 73 20 6f 6e 20 74 68 65 20 6c 69 6b  tests on the lik
0e30: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a  e optimization..
0e40: 23 0a 23 20 57 69 74 68 20 6e 6f 20 69 6e 64 65  #.# With no inde
0e50: 78 20 6f 6e 20 74 31 2e 78 20 61 6e 64 20 77 69  x on t1.x and wi
0e60: 74 68 20 63 61 73 65 20 73 65 6e 73 69 74 69 76  th case sensitiv
0e70: 69 74 79 20 74 75 72 6e 65 64 20 6f 66 66 2c 20  ity turned off, 
0e80: 6e 6f 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  no optimization.
0e90: 23 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a  # is performed..
0ea0: 23 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 33  #.do_test like-3
0eb0: 2e 31 20 7b 0a 20 20 73 65 74 20 73 71 6c 69 74  .1 {.  set sqlit
0ec0: 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 20 30 0a 20  e_like_count 0. 
0ed0: 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20   queryplan {.   
0ee0: 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74   SELECT x FROM t
0ef0: 31 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27  1 WHERE x LIKE '
0f00: 61 62 63 25 27 20 4f 52 44 45 52 20 42 59 20 31  abc%' ORDER BY 1
0f10: 3b 0a 20 20 7d 0a 7d 20 7b 41 42 43 20 7b 41 42  ;.  }.} {ABC {AB
0f20: 43 20 61 62 63 20 78 79 7a 7d 20 61 62 63 20 61  C abc xyz} abc a
0f30: 62 63 64 20 73 6f 72 74 20 74 31 20 7b 7d 7d 0a  bcd sort t1 {}}.
0f40: 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 33 2e 32  do_test like-3.2
0f50: 20 7b 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f   {.  set sqlite_
0f60: 6c 69 6b 65 5f 63 6f 75 6e 74 0a 7d 20 7b 31 32  like_count.} {12
0f70: 7d 0a 0a 23 20 57 69 74 68 20 61 6e 20 69 6e 64  }..# With an ind
0f80: 65 78 20 6f 6e 20 74 31 2e 78 20 61 6e 64 20 63  ex on t1.x and c
0f90: 61 73 65 20 73 65 6e 73 69 74 69 76 69 74 79 20  ase sensitivity 
0fa0: 6f 6e 2c 20 6f 70 74 69 6d 69 7a 65 20 63 6f 6d  on, optimize com
0fb0: 70 6c 65 74 65 6c 79 2e 0a 23 0a 64 6f 5f 74 65  pletely..#.do_te
0fc0: 73 74 20 6c 69 6b 65 2d 33 2e 33 20 7b 0a 20 20  st like-3.3 {.  
0fd0: 73 65 74 20 73 71 6c 69 74 65 5f 6c 69 6b 65 5f  set sqlite_like_
0fe0: 63 6f 75 6e 74 20 30 0a 20 20 65 78 65 63 73 71  count 0.  execsq
0ff0: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63  l {.    PRAGMA c
1000: 61 73 65 5f 73 65 6e 73 69 74 69 76 65 5f 6c 69  ase_sensitive_li
1010: 6b 65 3d 6f 6e 3b 0a 20 20 20 20 43 52 45 41 54  ke=on;.    CREAT
1020: 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31  E INDEX i1 ON t1
1030: 28 78 29 3b 0a 20 20 7d 0a 20 20 71 75 65 72 79  (x);.  }.  query
1040: 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43  plan {.    SELEC
1050: 54 20 78 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T x FROM t1 WHER
1060: 45 20 78 20 4c 49 4b 45 20 27 61 62 63 25 27 20  E x LIKE 'abc%' 
1070: 4f 52 44 45 52 20 42 59 20 31 3b 0a 20 20 7d 0a  ORDER BY 1;.  }.
1080: 7d 20 7b 61 62 63 20 61 62 63 64 20 6e 6f 73 6f  } {abc abcd noso
1090: 72 74 20 7b 7d 20 69 31 7d 0a 64 6f 5f 74 65 73  rt {} i1}.do_tes
10a0: 74 20 6c 69 6b 65 2d 33 2e 34 20 7b 0a 20 20 73  t like-3.4 {.  s
10b0: 65 74 20 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63  et sqlite_like_c
10c0: 6f 75 6e 74 0a 7d 20 30 0a 0a 23 20 54 68 65 20  ount.} 0..# The 
10d0: 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f  LIKE optimizatio
10e0: 6e 20 73 74 69 6c 6c 20 77 6f 72 6b 73 20 77 68  n still works wh
10f0: 65 6e 20 74 68 65 20 52 48 53 20 69 73 20 61 20  en the RHS is a 
1100: 73 74 72 69 6e 67 20 77 69 74 68 20 6e 6f 0a 23  string with no.#
1110: 20 77 69 6c 64 63 61 72 64 2e 20 20 54 69 63 6b   wildcard.  Tick
1120: 65 74 20 5b 65 30 39 30 31 38 33 35 33 31 66 63  et [e090183531fc
1130: 32 37 34 37 5d 0a 23 0a 64 6f 5f 74 65 73 74 20  2747].#.do_test 
1140: 6c 69 6b 65 2d 33 2e 34 2e 32 20 7b 0a 20 20 71  like-3.4.2 {.  q
1150: 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53  ueryplan {.    S
1160: 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20  ELECT x FROM t1 
1170: 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27 61 27  WHERE x LIKE 'a'
1180: 20 4f 52 44 45 52 20 42 59 20 31 3b 0a 20 20 7d   ORDER BY 1;.  }
1190: 0a 7d 20 7b 61 20 6e 6f 73 6f 72 74 20 7b 7d 20  .} {a nosort {} 
11a0: 69 31 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65  i1}.do_test like
11b0: 2d 33 2e 34 2e 33 20 7b 0a 20 20 71 75 65 72 79  -3.4.3 {.  query
11c0: 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43  plan {.    SELEC
11d0: 54 20 78 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T x FROM t1 WHER
11e0: 45 20 78 20 4c 49 4b 45 20 27 61 62 27 20 4f 52  E x LIKE 'ab' OR
11f0: 44 45 52 20 42 59 20 31 3b 0a 20 20 7d 0a 7d 20  DER BY 1;.  }.} 
1200: 7b 61 62 20 6e 6f 73 6f 72 74 20 7b 7d 20 69 31  {ab nosort {} i1
1210: 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 33  }.do_test like-3
1220: 2e 34 2e 34 20 7b 0a 20 20 71 75 65 72 79 70 6c  .4.4 {.  querypl
1230: 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  an {.    SELECT 
1240: 78 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  x FROM t1 WHERE 
1250: 78 20 4c 49 4b 45 20 27 61 62 63 64 27 20 4f 52  x LIKE 'abcd' OR
1260: 44 45 52 20 42 59 20 31 3b 0a 20 20 7d 0a 7d 20  DER BY 1;.  }.} 
1270: 7b 61 62 63 64 20 6e 6f 73 6f 72 74 20 7b 7d 20  {abcd nosort {} 
1280: 69 31 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65  i1}.do_test like
1290: 2d 33 2e 34 2e 35 20 7b 0a 20 20 71 75 65 72 79  -3.4.5 {.  query
12a0: 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43  plan {.    SELEC
12b0: 54 20 78 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T x FROM t1 WHER
12c0: 45 20 78 20 4c 49 4b 45 20 27 61 62 63 64 65 27  E x LIKE 'abcde'
12d0: 20 4f 52 44 45 52 20 42 59 20 31 3b 0a 20 20 7d   ORDER BY 1;.  }
12e0: 0a 7d 20 7b 6e 6f 73 6f 72 74 20 7b 7d 20 69 31  .} {nosort {} i1
12f0: 7d 0a 0a 0a 23 20 50 61 72 74 69 61 6c 20 6f 70  }...# Partial op
1300: 74 69 6d 69 7a 61 74 69 6f 6e 20 77 68 65 6e 20  timization when 
1310: 74 68 65 20 70 61 74 74 65 72 6e 20 64 6f 65 73  the pattern does
1320: 20 6e 6f 74 20 65 6e 64 20 69 6e 20 27 25 27 0a   not end in '%'.
1330: 23 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 33  #.do_test like-3
1340: 2e 35 20 7b 0a 20 20 73 65 74 20 73 71 6c 69 74  .5 {.  set sqlit
1350: 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 20 30 0a 20  e_like_count 0. 
1360: 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20   queryplan {.   
1370: 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74   SELECT x FROM t
1380: 31 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27  1 WHERE x LIKE '
1390: 61 5f 63 27 20 4f 52 44 45 52 20 42 59 20 31 3b  a_c' ORDER BY 1;
13a0: 0a 20 20 7d 0a 7d 20 7b 61 62 63 20 6e 6f 73 6f  .  }.} {abc noso
13b0: 72 74 20 7b 7d 20 69 31 7d 0a 64 6f 5f 74 65 73  rt {} i1}.do_tes
13c0: 74 20 6c 69 6b 65 2d 33 2e 36 20 7b 0a 20 20 73  t like-3.6 {.  s
13d0: 65 74 20 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63  et sqlite_like_c
13e0: 6f 75 6e 74 0a 7d 20 36 0a 64 6f 5f 74 65 73 74  ount.} 6.do_test
13f0: 20 6c 69 6b 65 2d 33 2e 37 20 7b 0a 20 20 73 65   like-3.7 {.  se
1400: 74 20 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f  t sqlite_like_co
1410: 75 6e 74 20 30 0a 20 20 71 75 65 72 79 70 6c 61  unt 0.  querypla
1420: 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 78  n {.    SELECT x
1430: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 78   FROM t1 WHERE x
1440: 20 4c 49 4b 45 20 27 61 62 25 64 27 20 4f 52 44   LIKE 'ab%d' ORD
1450: 45 52 20 42 59 20 31 3b 0a 20 20 7d 0a 7d 20 7b  ER BY 1;.  }.} {
1460: 61 62 63 64 20 61 62 64 20 6e 6f 73 6f 72 74 20  abcd abd nosort 
1470: 7b 7d 20 69 31 7d 0a 64 6f 5f 74 65 73 74 20 6c  {} i1}.do_test l
1480: 69 6b 65 2d 33 2e 38 20 7b 0a 20 20 73 65 74 20  ike-3.8 {.  set 
1490: 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e  sqlite_like_coun
14a0: 74 0a 7d 20 34 0a 64 6f 5f 74 65 73 74 20 6c 69  t.} 4.do_test li
14b0: 6b 65 2d 33 2e 39 20 7b 0a 20 20 73 65 74 20 73  ke-3.9 {.  set s
14c0: 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74  qlite_like_count
14d0: 20 30 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b   0.  queryplan {
14e0: 0a 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52  .    SELECT x FR
14f0: 4f 4d 20 74 31 20 57 48 45 52 45 20 78 20 4c 49  OM t1 WHERE x LI
1500: 4b 45 20 27 61 5f 63 25 27 20 4f 52 44 45 52 20  KE 'a_c%' ORDER 
1510: 42 59 20 31 3b 0a 20 20 7d 0a 7d 20 7b 61 62 63  BY 1;.  }.} {abc
1520: 20 61 62 63 64 20 6e 6f 73 6f 72 74 20 7b 7d 20   abcd nosort {} 
1530: 69 31 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65  i1}.do_test like
1540: 2d 33 2e 31 30 20 7b 0a 20 20 73 65 74 20 73 71  -3.10 {.  set sq
1550: 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 0a  lite_like_count.
1560: 7d 20 36 0a 0a 23 20 4e 6f 20 6f 70 74 69 6d 69  } 6..# No optimi
1570: 7a 61 74 69 6f 6e 20 77 68 65 6e 20 74 68 65 20  zation when the 
1580: 70 61 74 74 65 72 6e 20 62 65 67 69 6e 73 20 77  pattern begins w
1590: 69 74 68 20 61 20 77 69 6c 64 63 61 72 64 2e 0a  ith a wildcard..
15a0: 23 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  # Note that the 
15b0: 69 6e 64 65 78 20 69 73 20 73 74 69 6c 6c 20 75  index is still u
15c0: 73 65 64 20 62 75 74 20 6f 6e 6c 79 20 66 6f 72  sed but only for
15d0: 20 73 6f 72 74 69 6e 67 2e 0a 23 0a 64 6f 5f 74   sorting..#.do_t
15e0: 65 73 74 20 6c 69 6b 65 2d 33 2e 31 31 20 7b 0a  est like-3.11 {.
15f0: 20 20 73 65 74 20 73 71 6c 69 74 65 5f 6c 69 6b    set sqlite_lik
1600: 65 5f 63 6f 75 6e 74 20 30 0a 20 20 71 75 65 72  e_count 0.  quer
1610: 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45  yplan {.    SELE
1620: 43 54 20 78 20 46 52 4f 4d 20 74 31 20 57 48 45  CT x FROM t1 WHE
1630: 52 45 20 78 20 4c 49 4b 45 20 27 25 62 63 64 27  RE x LIKE '%bcd'
1640: 20 4f 52 44 45 52 20 42 59 20 31 3b 0a 20 20 7d   ORDER BY 1;.  }
1650: 0a 7d 20 7b 61 62 63 64 20 62 63 64 20 6e 6f 73  .} {abcd bcd nos
1660: 6f 72 74 20 7b 7d 20 69 31 7d 0a 64 6f 5f 74 65  ort {} i1}.do_te
1670: 73 74 20 6c 69 6b 65 2d 33 2e 31 32 20 7b 0a 20  st like-3.12 {. 
1680: 20 73 65 74 20 73 71 6c 69 74 65 5f 6c 69 6b 65   set sqlite_like
1690: 5f 63 6f 75 6e 74 0a 7d 20 31 32 0a 0a 23 20 4e  _count.} 12..# N
16a0: 6f 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66  o optimization f
16b0: 6f 72 20 63 61 73 65 20 69 6e 73 65 6e 73 69 74  or case insensit
16c0: 69 76 65 20 4c 49 4b 45 0a 23 0a 64 6f 5f 74 65  ive LIKE.#.do_te
16d0: 73 74 20 6c 69 6b 65 2d 33 2e 31 33 20 7b 0a 20  st like-3.13 {. 
16e0: 20 73 65 74 20 73 71 6c 69 74 65 5f 6c 69 6b 65   set sqlite_like
16f0: 5f 63 6f 75 6e 74 20 30 0a 20 20 71 75 65 72 79  _count 0.  query
1700: 70 6c 61 6e 20 7b 0a 20 20 20 20 50 52 41 47 4d  plan {.    PRAGM
1710: 41 20 63 61 73 65 5f 73 65 6e 73 69 74 69 76 65  A case_sensitive
1720: 5f 6c 69 6b 65 3d 6f 66 66 3b 0a 20 20 20 20 53  _like=off;.    S
1730: 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20  ELECT x FROM t1 
1740: 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27 61 62  WHERE x LIKE 'ab
1750: 63 25 27 20 4f 52 44 45 52 20 42 59 20 31 3b 0a  c%' ORDER BY 1;.
1760: 20 20 7d 0a 7d 20 7b 41 42 43 20 7b 41 42 43 20    }.} {ABC {ABC 
1770: 61 62 63 20 78 79 7a 7d 20 61 62 63 20 61 62 63  abc xyz} abc abc
1780: 64 20 6e 6f 73 6f 72 74 20 7b 7d 20 69 31 7d 0a  d nosort {} i1}.
1790: 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 33 2e 31  do_test like-3.1
17a0: 34 20 7b 0a 20 20 73 65 74 20 73 71 6c 69 74 65  4 {.  set sqlite
17b0: 5f 6c 69 6b 65 5f 63 6f 75 6e 74 0a 7d 20 31 32  _like_count.} 12
17c0: 0a 0a 23 20 4e 6f 20 6f 70 74 69 6d 69 7a 61 74  ..# No optimizat
17d0: 69 6f 6e 20 77 69 74 68 6f 75 74 20 61 6e 20 69  ion without an i
17e0: 6e 64 65 78 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  ndex..#.do_test 
17f0: 6c 69 6b 65 2d 33 2e 31 35 20 7b 0a 20 20 73 65  like-3.15 {.  se
1800: 74 20 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f  t sqlite_like_co
1810: 75 6e 74 20 30 0a 20 20 71 75 65 72 79 70 6c 61  unt 0.  querypla
1820: 6e 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63  n {.    PRAGMA c
1830: 61 73 65 5f 73 65 6e 73 69 74 69 76 65 5f 6c 69  ase_sensitive_li
1840: 6b 65 3d 6f 6e 3b 0a 20 20 20 20 44 52 4f 50 20  ke=on;.    DROP 
1850: 49 4e 44 45 58 20 69 31 3b 0a 20 20 20 20 53 45  INDEX i1;.    SE
1860: 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20 57  LECT x FROM t1 W
1870: 48 45 52 45 20 78 20 4c 49 4b 45 20 27 61 62 63  HERE x LIKE 'abc
1880: 25 27 20 4f 52 44 45 52 20 42 59 20 31 3b 0a 20  %' ORDER BY 1;. 
1890: 20 7d 0a 7d 20 7b 61 62 63 20 61 62 63 64 20 73   }.} {abc abcd s
18a0: 6f 72 74 20 74 31 20 7b 7d 7d 0a 64 6f 5f 74 65  ort t1 {}}.do_te
18b0: 73 74 20 6c 69 6b 65 2d 33 2e 31 36 20 7b 0a 20  st like-3.16 {. 
18c0: 20 73 65 74 20 73 71 6c 69 74 65 5f 6c 69 6b 65   set sqlite_like
18d0: 5f 63 6f 75 6e 74 0a 7d 20 31 32 0a 0a 23 20 4e  _count.} 12..# N
18e0: 6f 20 47 4c 4f 42 20 6f 70 74 69 6d 69 7a 61 74  o GLOB optimizat
18f0: 69 6f 6e 20 77 69 74 68 6f 75 74 20 61 6e 20 69  ion without an i
1900: 6e 64 65 78 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  ndex..#.do_test 
1910: 6c 69 6b 65 2d 33 2e 31 37 20 7b 0a 20 20 73 65  like-3.17 {.  se
1920: 74 20 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f  t sqlite_like_co
1930: 75 6e 74 20 30 0a 20 20 71 75 65 72 79 70 6c 61  unt 0.  querypla
1940: 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 78  n {.    SELECT x
1950: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 78   FROM t1 WHERE x
1960: 20 47 4c 4f 42 20 27 61 62 63 2a 27 20 4f 52 44   GLOB 'abc*' ORD
1970: 45 52 20 42 59 20 31 3b 0a 20 20 7d 0a 7d 20 7b  ER BY 1;.  }.} {
1980: 61 62 63 20 61 62 63 64 20 73 6f 72 74 20 74 31  abc abcd sort t1
1990: 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b   {}}.do_test lik
19a0: 65 2d 33 2e 31 38 20 7b 0a 20 20 73 65 74 20 73  e-3.18 {.  set s
19b0: 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74  qlite_like_count
19c0: 0a 7d 20 31 32 0a 0a 23 20 47 4c 4f 42 20 69 73  .} 12..# GLOB is
19d0: 20 6f 70 74 69 6d 69 7a 65 64 20 72 65 67 61 72   optimized regar
19e0: 64 6c 65 73 73 20 6f 66 20 74 68 65 20 63 61 73  dless of the cas
19f0: 65 5f 73 65 6e 73 69 74 69 76 65 5f 6c 69 6b 65  e_sensitive_like
1a00: 20 73 65 74 74 69 6e 67 2e 0a 23 0a 64 6f 5f 74   setting..#.do_t
1a10: 65 73 74 20 6c 69 6b 65 2d 33 2e 31 39 20 7b 0a  est like-3.19 {.
1a20: 20 20 73 65 74 20 73 71 6c 69 74 65 5f 6c 69 6b    set sqlite_lik
1a30: 65 5f 63 6f 75 6e 74 20 30 0a 20 20 71 75 65 72  e_count 0.  quer
1a40: 79 70 6c 61 6e 20 7b 0a 20 20 20 20 43 52 45 41  yplan {.    CREA
1a50: 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74  TE INDEX i1 ON t
1a60: 31 28 78 29 3b 0a 20 20 20 20 53 45 4c 45 43 54  1(x);.    SELECT
1a70: 20 78 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   x FROM t1 WHERE
1a80: 20 78 20 47 4c 4f 42 20 27 61 62 63 2a 27 20 4f   x GLOB 'abc*' O
1a90: 52 44 45 52 20 42 59 20 31 3b 0a 20 20 7d 0a 7d  RDER BY 1;.  }.}
1aa0: 20 7b 61 62 63 20 61 62 63 64 20 6e 6f 73 6f 72   {abc abcd nosor
1ab0: 74 20 7b 7d 20 69 31 7d 0a 64 6f 5f 74 65 73 74  t {} i1}.do_test
1ac0: 20 6c 69 6b 65 2d 33 2e 32 30 20 7b 0a 20 20 73   like-3.20 {.  s
1ad0: 65 74 20 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63  et sqlite_like_c
1ae0: 6f 75 6e 74 0a 7d 20 30 0a 64 6f 5f 74 65 73 74  ount.} 0.do_test
1af0: 20 6c 69 6b 65 2d 33 2e 32 31 20 7b 0a 20 20 73   like-3.21 {.  s
1b00: 65 74 20 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63  et sqlite_like_c
1b10: 6f 75 6e 74 20 30 0a 20 20 71 75 65 72 79 70 6c  ount 0.  querypl
1b20: 61 6e 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  an {.    PRAGMA 
1b30: 63 61 73 65 5f 73 65 6e 73 69 74 69 76 65 5f 6c  case_sensitive_l
1b40: 69 6b 65 3d 6f 6e 3b 0a 20 20 20 20 53 45 4c 45  ike=on;.    SELE
1b50: 43 54 20 78 20 46 52 4f 4d 20 74 31 20 57 48 45  CT x FROM t1 WHE
1b60: 52 45 20 78 20 47 4c 4f 42 20 27 61 62 63 2a 27  RE x GLOB 'abc*'
1b70: 20 4f 52 44 45 52 20 42 59 20 31 3b 0a 20 20 7d   ORDER BY 1;.  }
1b80: 0a 7d 20 7b 61 62 63 20 61 62 63 64 20 6e 6f 73  .} {abc abcd nos
1b90: 6f 72 74 20 7b 7d 20 69 31 7d 0a 64 6f 5f 74 65  ort {} i1}.do_te
1ba0: 73 74 20 6c 69 6b 65 2d 33 2e 32 32 20 7b 0a 20  st like-3.22 {. 
1bb0: 20 73 65 74 20 73 71 6c 69 74 65 5f 6c 69 6b 65   set sqlite_like
1bc0: 5f 63 6f 75 6e 74 0a 7d 20 30 0a 64 6f 5f 74 65  _count.} 0.do_te
1bd0: 73 74 20 6c 69 6b 65 2d 33 2e 32 33 20 7b 0a 20  st like-3.23 {. 
1be0: 20 73 65 74 20 73 71 6c 69 74 65 5f 6c 69 6b 65   set sqlite_like
1bf0: 5f 63 6f 75 6e 74 20 30 0a 20 20 71 75 65 72 79  _count 0.  query
1c00: 70 6c 61 6e 20 7b 0a 20 20 20 20 50 52 41 47 4d  plan {.    PRAGM
1c10: 41 20 63 61 73 65 5f 73 65 6e 73 69 74 69 76 65  A case_sensitive
1c20: 5f 6c 69 6b 65 3d 6f 66 66 3b 0a 20 20 20 20 53  _like=off;.    S
1c30: 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20  ELECT x FROM t1 
1c40: 57 48 45 52 45 20 78 20 47 4c 4f 42 20 27 61 5b  WHERE x GLOB 'a[
1c50: 62 63 5d 64 27 20 4f 52 44 45 52 20 42 59 20 31  bc]d' ORDER BY 1
1c60: 3b 0a 20 20 7d 0a 7d 20 7b 61 62 64 20 61 63 64  ;.  }.} {abd acd
1c70: 20 6e 6f 73 6f 72 74 20 7b 7d 20 69 31 7d 0a 64   nosort {} i1}.d
1c80: 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 33 2e 32 34  o_test like-3.24
1c90: 20 7b 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f   {.  set sqlite_
1ca0: 6c 69 6b 65 5f 63 6f 75 6e 74 0a 7d 20 36 0a 0a  like_count.} 6..
1cb0: 23 20 47 4c 4f 42 20 6f 70 74 69 6d 69 7a 61 74  # GLOB optimizat
1cc0: 69 6f 6e 20 77 68 65 6e 20 74 68 65 72 65 20 69  ion when there i
1cd0: 73 20 6e 6f 20 77 69 6c 64 63 61 72 64 2e 20 20  s no wildcard.  
1ce0: 54 69 63 6b 65 74 20 5b 65 30 39 30 31 38 33 35  Ticket [e0901835
1cf0: 33 31 66 63 32 37 34 37 5d 0a 23 0a 64 6f 5f 74  31fc2747].#.do_t
1d00: 65 73 74 20 6c 69 6b 65 2d 33 2e 32 35 20 7b 0a  est like-3.25 {.
1d10: 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20    queryplan {.  
1d20: 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20    SELECT x FROM 
1d30: 74 31 20 57 48 45 52 45 20 78 20 47 4c 4f 42 20  t1 WHERE x GLOB 
1d40: 27 61 27 20 4f 52 44 45 52 20 42 59 20 31 3b 0a  'a' ORDER BY 1;.
1d50: 20 20 7d 0a 7d 20 7b 61 20 6e 6f 73 6f 72 74 20    }.} {a nosort 
1d60: 7b 7d 20 69 31 7d 0a 64 6f 5f 74 65 73 74 20 6c  {} i1}.do_test l
1d70: 69 6b 65 2d 33 2e 32 36 20 7b 0a 20 20 71 75 65  ike-3.26 {.  que
1d80: 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c  ryplan {.    SEL
1d90: 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20 57 48  ECT x FROM t1 WH
1da0: 45 52 45 20 78 20 47 4c 4f 42 20 27 61 62 63 64  ERE x GLOB 'abcd
1db0: 27 20 4f 52 44 45 52 20 42 59 20 31 3b 0a 20 20  ' ORDER BY 1;.  
1dc0: 7d 0a 7d 20 7b 61 62 63 64 20 6e 6f 73 6f 72 74  }.} {abcd nosort
1dd0: 20 7b 7d 20 69 31 7d 0a 64 6f 5f 74 65 73 74 20   {} i1}.do_test 
1de0: 6c 69 6b 65 2d 33 2e 32 37 20 7b 0a 20 20 71 75  like-3.27 {.  qu
1df0: 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45  eryplan {.    SE
1e00: 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20 57  LECT x FROM t1 W
1e10: 48 45 52 45 20 78 20 47 4c 4f 42 20 27 61 62 63  HERE x GLOB 'abc
1e20: 64 65 27 20 4f 52 44 45 52 20 42 59 20 31 3b 0a  de' ORDER BY 1;.
1e30: 20 20 7d 0a 7d 20 7b 6e 6f 73 6f 72 74 20 7b 7d    }.} {nosort {}
1e40: 20 69 31 7d 0a 0a 0a 0a 23 20 4e 6f 20 6f 70 74   i1}....# No opt
1e50: 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20 74 68 65  imization if the
1e60: 20 4c 48 53 20 6f 66 20 74 68 65 20 4c 49 4b 45   LHS of the LIKE
1e70: 20 69 73 20 6e 6f 74 20 61 20 63 6f 6c 75 6d 6e   is not a column
1e80: 20 6e 61 6d 65 20 6f 72 0a 23 20 69 66 20 74 68   name or.# if th
1e90: 65 20 52 48 53 20 69 73 20 6e 6f 74 20 61 20 73  e RHS is not a s
1ea0: 74 72 69 6e 67 2e 0a 23 0a 64 6f 5f 74 65 73 74  tring..#.do_test
1eb0: 20 6c 69 6b 65 2d 34 2e 31 20 7b 0a 20 20 65 78   like-4.1 {.  ex
1ec0: 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 63 61  ecsql {PRAGMA ca
1ed0: 73 65 5f 73 65 6e 73 69 74 69 76 65 5f 6c 69 6b  se_sensitive_lik
1ee0: 65 3d 6f 6e 7d 0a 20 20 73 65 74 20 73 71 6c 69  e=on}.  set sqli
1ef0: 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 20 30 0a  te_like_count 0.
1f00: 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20    queryplan {.  
1f10: 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20    SELECT x FROM 
1f20: 74 31 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20  t1 WHERE x LIKE 
1f30: 27 61 62 63 25 27 20 4f 52 44 45 52 20 42 59 20  'abc%' ORDER BY 
1f40: 31 0a 20 20 7d 0a 7d 20 7b 61 62 63 20 61 62 63  1.  }.} {abc abc
1f50: 64 20 6e 6f 73 6f 72 74 20 7b 7d 20 69 31 7d 0a  d nosort {} i1}.
1f60: 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 34 2e 32  do_test like-4.2
1f70: 20 7b 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f   {.  set sqlite_
1f80: 6c 69 6b 65 5f 63 6f 75 6e 74 0a 7d 20 30 0a 64  like_count.} 0.d
1f90: 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 34 2e 33 20  o_test like-4.3 
1fa0: 7b 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f 6c  {.  set sqlite_l
1fb0: 69 6b 65 5f 63 6f 75 6e 74 20 30 0a 20 20 71 75  ike_count 0.  qu
1fc0: 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45  eryplan {.    SE
1fd0: 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20 57  LECT x FROM t1 W
1fe0: 48 45 52 45 20 2b 78 20 4c 49 4b 45 20 27 61 62  HERE +x LIKE 'ab
1ff0: 63 25 27 20 4f 52 44 45 52 20 42 59 20 31 0a 20  c%' ORDER BY 1. 
2000: 20 7d 0a 7d 20 7b 61 62 63 20 61 62 63 64 20 6e   }.} {abc abcd n
2010: 6f 73 6f 72 74 20 7b 7d 20 69 31 7d 0a 64 6f 5f  osort {} i1}.do_
2020: 74 65 73 74 20 6c 69 6b 65 2d 34 2e 34 20 7b 0a  test like-4.4 {.
2030: 20 20 73 65 74 20 73 71 6c 69 74 65 5f 6c 69 6b    set sqlite_lik
2040: 65 5f 63 6f 75 6e 74 0a 7d 20 31 32 0a 64 6f 5f  e_count.} 12.do_
2050: 74 65 73 74 20 6c 69 6b 65 2d 34 2e 35 20 7b 0a  test like-4.5 {.
2060: 20 20 73 65 74 20 73 71 6c 69 74 65 5f 6c 69 6b    set sqlite_lik
2070: 65 5f 63 6f 75 6e 74 20 30 0a 20 20 71 75 65 72  e_count 0.  quer
2080: 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45  yplan {.    SELE
2090: 43 54 20 78 20 46 52 4f 4d 20 74 31 20 57 48 45  CT x FROM t1 WHE
20a0: 52 45 20 78 20 4c 49 4b 45 20 28 27 61 62 27 20  RE x LIKE ('ab' 
20b0: 7c 7c 20 27 63 25 27 29 20 4f 52 44 45 52 20 42  || 'c%') ORDER B
20c0: 59 20 31 0a 20 20 7d 0a 7d 20 7b 61 62 63 20 61  Y 1.  }.} {abc a
20d0: 62 63 64 20 6e 6f 73 6f 72 74 20 7b 7d 20 69 31  bcd nosort {} i1
20e0: 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 34  }.do_test like-4
20f0: 2e 36 20 7b 0a 20 20 73 65 74 20 73 71 6c 69 74  .6 {.  set sqlit
2100: 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 0a 7d 20 31  e_like_count.} 1
2110: 32 0a 0a 23 20 43 6f 6c 6c 61 74 69 6e 67 20 73  2..# Collating s
2120: 65 71 75 65 6e 63 65 73 20 6f 6e 20 74 68 65 20  equences on the 
2130: 69 6e 64 65 78 20 64 69 73 61 62 6c 65 20 74 68  index disable th
2140: 65 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74  e LIKE optimizat
2150: 69 6f 6e 2e 0a 23 20 4f 72 20 69 66 20 74 68 65  ion..# Or if the
2160: 20 4e 4f 43 41 53 45 20 63 6f 6c 6c 61 74 69 6e   NOCASE collatin
2170: 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 75 73  g sequence is us
2180: 65 64 2c 20 74 68 65 20 4c 49 4b 45 20 6f 70 74  ed, the LIKE opt
2190: 69 6d 69 7a 61 74 69 6f 6e 0a 23 20 69 73 20 65  imization.# is e
21a0: 6e 61 62 6c 65 64 20 77 68 65 6e 20 63 61 73 65  nabled when case
21b0: 5f 73 65 6e 73 69 74 69 76 65 5f 6c 69 6b 65 20  _sensitive_like 
21c0: 69 73 20 4f 46 46 2e 0a 23 0a 64 6f 5f 74 65 73  is OFF..#.do_tes
21d0: 74 20 6c 69 6b 65 2d 35 2e 31 20 7b 0a 20 20 65  t like-5.1 {.  e
21e0: 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 63  xecsql {PRAGMA c
21f0: 61 73 65 5f 73 65 6e 73 69 74 69 76 65 5f 6c 69  ase_sensitive_li
2200: 6b 65 3d 6f 66 66 7d 0a 20 20 73 65 74 20 73 71  ke=off}.  set sq
2210: 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 20  lite_like_count 
2220: 30 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a  0.  queryplan {.
2230: 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f      SELECT x FRO
2240: 4d 20 74 31 20 57 48 45 52 45 20 78 20 4c 49 4b  M t1 WHERE x LIK
2250: 45 20 27 61 62 63 25 27 20 4f 52 44 45 52 20 42  E 'abc%' ORDER B
2260: 59 20 31 0a 20 20 7d 0a 7d 20 7b 41 42 43 20 7b  Y 1.  }.} {ABC {
2270: 41 42 43 20 61 62 63 20 78 79 7a 7d 20 61 62 63  ABC abc xyz} abc
2280: 20 61 62 63 64 20 6e 6f 73 6f 72 74 20 7b 7d 20   abcd nosort {} 
2290: 69 31 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65  i1}.do_test like
22a0: 2d 35 2e 32 20 7b 0a 20 20 73 65 74 20 73 71 6c  -5.2 {.  set sql
22b0: 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 0a 7d  ite_like_count.}
22c0: 20 31 32 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65   12.do_test like
22d0: 2d 35 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  -5.3 {.  execsql
22e0: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
22f0: 42 4c 45 20 74 32 28 78 20 54 45 58 54 20 43 4f  BLE t2(x TEXT CO
2300: 4c 4c 41 54 45 20 4e 4f 43 41 53 45 29 3b 0a 20  LLATE NOCASE);. 
2310: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2320: 32 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  2 SELECT * FROM 
2330: 74 31 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49  t1;.    CREATE I
2340: 4e 44 45 58 20 69 32 20 4f 4e 20 74 32 28 78 20  NDEX i2 ON t2(x 
2350: 43 4f 4c 4c 41 54 45 20 4e 4f 43 41 53 45 29 3b  COLLATE NOCASE);
2360: 0a 20 20 7d 0a 20 20 73 65 74 20 73 71 6c 69 74  .  }.  set sqlit
2370: 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 20 30 0a 20  e_like_count 0. 
2380: 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20   queryplan {.   
2390: 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74   SELECT x FROM t
23a0: 32 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27  2 WHERE x LIKE '
23b0: 61 62 63 25 27 20 4f 52 44 45 52 20 42 59 20 31  abc%' ORDER BY 1
23c0: 0a 20 20 7d 0a 7d 20 7b 61 62 63 20 41 42 43 20  .  }.} {abc ABC 
23d0: 7b 41 42 43 20 61 62 63 20 78 79 7a 7d 20 61 62  {ABC abc xyz} ab
23e0: 63 64 20 6e 6f 73 6f 72 74 20 7b 7d 20 69 32 7d  cd nosort {} i2}
23f0: 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 35 2e  .do_test like-5.
2400: 34 20 7b 0a 20 20 73 65 74 20 73 71 6c 69 74 65  4 {.  set sqlite
2410: 5f 6c 69 6b 65 5f 63 6f 75 6e 74 0a 7d 20 30 0a  _like_count.} 0.
2420: 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 35 2e 35  do_test like-5.5
2430: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
2440: 20 20 20 50 52 41 47 4d 41 20 63 61 73 65 5f 73     PRAGMA case_s
2450: 65 6e 73 69 74 69 76 65 5f 6c 69 6b 65 3d 6f 6e  ensitive_like=on
2460: 3b 0a 20 20 7d 0a 20 20 73 65 74 20 73 71 6c 69  ;.  }.  set sqli
2470: 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 20 30 0a  te_like_count 0.
2480: 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20    queryplan {.  
2490: 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20    SELECT x FROM 
24a0: 74 32 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20  t2 WHERE x LIKE 
24b0: 27 61 62 63 25 27 20 4f 52 44 45 52 20 42 59 20  'abc%' ORDER BY 
24c0: 31 0a 20 20 7d 0a 7d 20 7b 61 62 63 20 61 62 63  1.  }.} {abc abc
24d0: 64 20 6e 6f 73 6f 72 74 20 7b 7d 20 69 32 7d 0a  d nosort {} i2}.
24e0: 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 35 2e 36  do_test like-5.6
24f0: 20 7b 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f   {.  set sqlite_
2500: 6c 69 6b 65 5f 63 6f 75 6e 74 0a 7d 20 31 32 0a  like_count.} 12.
2510: 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 35 2e 37  do_test like-5.7
2520: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
2530: 20 20 20 50 52 41 47 4d 41 20 63 61 73 65 5f 73     PRAGMA case_s
2540: 65 6e 73 69 74 69 76 65 5f 6c 69 6b 65 3d 6f 66  ensitive_like=of
2550: 66 3b 0a 20 20 7d 0a 20 20 73 65 74 20 73 71 6c  f;.  }.  set sql
2560: 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 20 30  ite_like_count 0
2570: 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20  .  queryplan {. 
2580: 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d     SELECT x FROM
2590: 20 74 32 20 57 48 45 52 45 20 78 20 47 4c 4f 42   t2 WHERE x GLOB
25a0: 20 27 61 62 63 2a 27 20 4f 52 44 45 52 20 42 59   'abc*' ORDER BY
25b0: 20 31 0a 20 20 7d 0a 7d 20 7b 61 62 63 20 61 62   1.  }.} {abc ab
25c0: 63 64 20 6e 6f 73 6f 72 74 20 7b 7d 20 69 32 7d  cd nosort {} i2}
25d0: 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 35 2e  .do_test like-5.
25e0: 38 20 7b 0a 20 20 73 65 74 20 73 71 6c 69 74 65  8 {.  set sqlite
25f0: 5f 6c 69 6b 65 5f 63 6f 75 6e 74 0a 7d 20 31 32  _like_count.} 12
2600: 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 35 2e  .do_test like-5.
2610: 31 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  11 {.  execsql {
2620: 50 52 41 47 4d 41 20 63 61 73 65 5f 73 65 6e 73  PRAGMA case_sens
2630: 69 74 69 76 65 5f 6c 69 6b 65 3d 6f 66 66 7d 0a  itive_like=off}.
2640: 20 20 73 65 74 20 73 71 6c 69 74 65 5f 6c 69 6b    set sqlite_lik
2650: 65 5f 63 6f 75 6e 74 20 30 0a 20 20 71 75 65 72  e_count 0.  quer
2660: 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45  yplan {.    SELE
2670: 43 54 20 78 20 46 52 4f 4d 20 74 31 20 57 48 45  CT x FROM t1 WHE
2680: 52 45 20 78 20 4c 49 4b 45 20 27 41 42 43 25 27  RE x LIKE 'ABC%'
2690: 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 7d 0a   ORDER BY 1.  }.
26a0: 7d 20 7b 41 42 43 20 7b 41 42 43 20 61 62 63 20  } {ABC {ABC abc 
26b0: 78 79 7a 7d 20 61 62 63 20 61 62 63 64 20 6e 6f  xyz} abc abcd no
26c0: 73 6f 72 74 20 7b 7d 20 69 31 7d 0a 64 6f 5f 74  sort {} i1}.do_t
26d0: 65 73 74 20 6c 69 6b 65 2d 35 2e 31 32 20 7b 0a  est like-5.12 {.
26e0: 20 20 73 65 74 20 73 71 6c 69 74 65 5f 6c 69 6b    set sqlite_lik
26f0: 65 5f 63 6f 75 6e 74 0a 7d 20 31 32 0a 64 6f 5f  e_count.} 12.do_
2700: 74 65 73 74 20 6c 69 6b 65 2d 35 2e 31 33 20 7b  test like-5.13 {
2710: 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f 6c 69  .  set sqlite_li
2720: 6b 65 5f 63 6f 75 6e 74 20 30 0a 20 20 71 75 65  ke_count 0.  que
2730: 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c  ryplan {.    SEL
2740: 45 43 54 20 78 20 46 52 4f 4d 20 74 32 20 57 48  ECT x FROM t2 WH
2750: 45 52 45 20 78 20 4c 49 4b 45 20 27 41 42 43 25  ERE x LIKE 'ABC%
2760: 27 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 7d  ' ORDER BY 1.  }
2770: 0a 7d 20 7b 61 62 63 20 41 42 43 20 7b 41 42 43  .} {abc ABC {ABC
2780: 20 61 62 63 20 78 79 7a 7d 20 61 62 63 64 20 6e   abc xyz} abcd n
2790: 6f 73 6f 72 74 20 7b 7d 20 69 32 7d 0a 64 6f 5f  osort {} i2}.do_
27a0: 74 65 73 74 20 6c 69 6b 65 2d 35 2e 31 34 20 7b  test like-5.14 {
27b0: 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f 6c 69  .  set sqlite_li
27c0: 6b 65 5f 63 6f 75 6e 74 0a 7d 20 30 0a 64 6f 5f  ke_count.} 0.do_
27d0: 74 65 73 74 20 6c 69 6b 65 2d 35 2e 31 35 20 7b  test like-5.15 {
27e0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
27f0: 20 50 52 41 47 4d 41 20 63 61 73 65 5f 73 65 6e   PRAGMA case_sen
2800: 73 69 74 69 76 65 5f 6c 69 6b 65 3d 6f 6e 3b 0a  sitive_like=on;.
2810: 20 20 7d 0a 20 20 73 65 74 20 73 71 6c 69 74 65    }.  set sqlite
2820: 5f 6c 69 6b 65 5f 63 6f 75 6e 74 20 30 0a 20 20  _like_count 0.  
2830: 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20  queryplan {.    
2840: 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 32  SELECT x FROM t2
2850: 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27 41   WHERE x LIKE 'A
2860: 42 43 25 27 20 4f 52 44 45 52 20 42 59 20 31 0a  BC%' ORDER BY 1.
2870: 20 20 7d 0a 7d 20 7b 41 42 43 20 7b 41 42 43 20    }.} {ABC {ABC 
2880: 61 62 63 20 78 79 7a 7d 20 6e 6f 73 6f 72 74 20  abc xyz} nosort 
2890: 7b 7d 20 69 32 7d 0a 64 6f 5f 74 65 73 74 20 6c  {} i2}.do_test l
28a0: 69 6b 65 2d 35 2e 31 36 20 7b 0a 20 20 73 65 74  ike-5.16 {.  set
28b0: 20 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75   sqlite_like_cou
28c0: 6e 74 0a 7d 20 31 32 0a 64 6f 5f 74 65 73 74 20  nt.} 12.do_test 
28d0: 6c 69 6b 65 2d 35 2e 31 37 20 7b 0a 20 20 65 78  like-5.17 {.  ex
28e0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
28f0: 4d 41 20 63 61 73 65 5f 73 65 6e 73 69 74 69 76  MA case_sensitiv
2900: 65 5f 6c 69 6b 65 3d 6f 66 66 3b 0a 20 20 7d 0a  e_like=off;.  }.
2910: 20 20 73 65 74 20 73 71 6c 69 74 65 5f 6c 69 6b    set sqlite_lik
2920: 65 5f 63 6f 75 6e 74 20 30 0a 20 20 71 75 65 72  e_count 0.  quer
2930: 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45  yplan {.    SELE
2940: 43 54 20 78 20 46 52 4f 4d 20 74 32 20 57 48 45  CT x FROM t2 WHE
2950: 52 45 20 78 20 47 4c 4f 42 20 27 41 42 43 2a 27  RE x GLOB 'ABC*'
2960: 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 7d 0a   ORDER BY 1.  }.
2970: 7d 20 7b 41 42 43 20 7b 41 42 43 20 61 62 63 20  } {ABC {ABC abc 
2980: 78 79 7a 7d 20 6e 6f 73 6f 72 74 20 7b 7d 20 69  xyz} nosort {} i
2990: 32 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d  2}.do_test like-
29a0: 35 2e 31 38 20 7b 0a 20 20 73 65 74 20 73 71 6c  5.18 {.  set sql
29b0: 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 0a 7d  ite_like_count.}
29c0: 20 31 32 0a 0a 23 20 42 6f 75 6e 64 61 72 79 20   12..# Boundary 
29d0: 63 61 73 65 2e 20 20 54 68 65 20 70 72 65 66 69  case.  The prefi
29e0: 78 20 66 6f 72 20 61 20 4c 49 4b 45 20 63 6f 6d  x for a LIKE com
29f0: 70 61 72 69 73 6f 6e 20 69 73 20 72 6f 75 6e 64  parison is round
2a00: 65 64 20 75 70 0a 23 20 77 68 65 6e 20 63 6f 6e  ed up.# when con
2a10: 73 74 72 75 63 74 69 6e 67 20 74 68 65 20 63 6f  structing the co
2a20: 6d 70 61 72 69 73 6f 6e 2e 20 20 45 78 61 6d 70  mparison.  Examp
2a30: 6c 65 3a 20 20 22 61 62 22 20 62 65 63 6f 6d 65  le:  "ab" become
2a40: 73 20 22 61 63 22 2e 0a 23 20 49 6e 20 6f 74 68  s "ac"..# In oth
2a50: 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 6c 61  er words, the la
2a60: 73 74 20 63 68 61 72 61 63 74 65 72 20 69 73 20  st character is 
2a70: 69 6e 63 72 65 61 73 65 64 20 62 79 20 6f 6e 65  increased by one
2a80: 2e 0a 23 0a 23 20 4d 61 6b 65 20 73 75 72 65 20  ..#.# Make sure 
2a90: 74 68 69 73 20 68 61 70 70 65 6e 73 20 63 6f 72  this happens cor
2aa0: 72 65 63 74 6c 79 20 77 68 65 6e 20 74 68 65 20  rectly when the 
2ab0: 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20 69  last character i
2ac0: 73 20 61 20 0a 23 20 22 7a 22 20 61 6e 64 20 77  s a .# "z" and w
2ad0: 65 20 61 72 65 20 64 6f 69 6e 67 20 63 61 73 65  e are doing case
2ae0: 2d 69 6e 73 65 6e 73 69 74 69 76 65 20 63 6f 6d  -insensitive com
2af0: 70 61 72 69 73 6f 6e 73 2e 0a 23 0a 23 20 54 69  parisons..#.# Ti
2b00: 63 6b 65 74 20 23 32 39 35 39 0a 23 0a 64 6f 5f  cket #2959.#.do_
2b10: 74 65 73 74 20 6c 69 6b 65 2d 35 2e 32 31 20 7b  test like-5.21 {
2b20: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
2b30: 20 50 52 41 47 4d 41 20 63 61 73 65 5f 73 65 6e   PRAGMA case_sen
2b40: 73 69 74 69 76 65 5f 6c 69 6b 65 3d 6f 66 66 3b  sitive_like=off;
2b50: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
2b60: 20 74 32 20 56 41 4c 55 45 53 28 27 5a 5a 2d 75   t2 VALUES('ZZ-u
2b70: 70 70 65 72 2d 75 70 70 65 72 27 29 3b 0a 20 20  pper-upper');.  
2b80: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
2b90: 20 56 41 4c 55 45 53 28 27 7a 5a 2d 6c 6f 77 65   VALUES('zZ-lowe
2ba0: 72 2d 75 70 70 65 72 27 29 3b 0a 20 20 20 20 49  r-upper');.    I
2bb0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
2bc0: 4c 55 45 53 28 27 5a 7a 2d 75 70 70 65 72 2d 6c  LUES('Zz-upper-l
2bd0: 6f 77 65 72 27 29 3b 0a 20 20 20 20 49 4e 53 45  ower');.    INSE
2be0: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
2bf0: 53 28 27 7a 7a 2d 6c 6f 77 65 72 2d 6c 6f 77 65  S('zz-lower-lowe
2c00: 72 27 29 3b 0a 20 20 7d 0a 20 20 71 75 65 72 79  r');.  }.  query
2c10: 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43  plan {.    SELEC
2c20: 54 20 78 20 46 52 4f 4d 20 74 32 20 57 48 45 52  T x FROM t2 WHER
2c30: 45 20 78 20 4c 49 4b 45 20 27 7a 7a 25 27 3b 0a  E x LIKE 'zz%';.
2c40: 20 20 7d 0a 7d 20 7b 7a 7a 2d 6c 6f 77 65 72 2d    }.} {zz-lower-
2c50: 6c 6f 77 65 72 20 7a 5a 2d 6c 6f 77 65 72 2d 75  lower zZ-lower-u
2c60: 70 70 65 72 20 5a 7a 2d 75 70 70 65 72 2d 6c 6f  pper Zz-upper-lo
2c70: 77 65 72 20 5a 5a 2d 75 70 70 65 72 2d 75 70 70  wer ZZ-upper-upp
2c80: 65 72 20 6e 6f 73 6f 72 74 20 7b 7d 20 69 32 7d  er nosort {} i2}
2c90: 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 35 2e  .do_test like-5.
2ca0: 32 32 20 7b 0a 20 20 71 75 65 72 79 70 6c 61 6e  22 {.  queryplan
2cb0: 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 78 20   {.    SELECT x 
2cc0: 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 78 20  FROM t2 WHERE x 
2cd0: 4c 49 4b 45 20 27 7a 5a 25 27 3b 0a 20 20 7d 0a  LIKE 'zZ%';.  }.
2ce0: 7d 20 7b 7a 7a 2d 6c 6f 77 65 72 2d 6c 6f 77 65  } {zz-lower-lowe
2cf0: 72 20 7a 5a 2d 6c 6f 77 65 72 2d 75 70 70 65 72  r zZ-lower-upper
2d00: 20 5a 7a 2d 75 70 70 65 72 2d 6c 6f 77 65 72 20   Zz-upper-lower 
2d10: 5a 5a 2d 75 70 70 65 72 2d 75 70 70 65 72 20 6e  ZZ-upper-upper n
2d20: 6f 73 6f 72 74 20 7b 7d 20 69 32 7d 0a 64 6f 5f  osort {} i2}.do_
2d30: 74 65 73 74 20 6c 69 6b 65 2d 35 2e 32 33 20 7b  test like-5.23 {
2d40: 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20  .  queryplan {. 
2d50: 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d     SELECT x FROM
2d60: 20 74 32 20 57 48 45 52 45 20 78 20 4c 49 4b 45   t2 WHERE x LIKE
2d70: 20 27 5a 7a 25 27 3b 0a 20 20 7d 0a 7d 20 7b 7a   'Zz%';.  }.} {z
2d80: 7a 2d 6c 6f 77 65 72 2d 6c 6f 77 65 72 20 7a 5a  z-lower-lower zZ
2d90: 2d 6c 6f 77 65 72 2d 75 70 70 65 72 20 5a 7a 2d  -lower-upper Zz-
2da0: 75 70 70 65 72 2d 6c 6f 77 65 72 20 5a 5a 2d 75  upper-lower ZZ-u
2db0: 70 70 65 72 2d 75 70 70 65 72 20 6e 6f 73 6f 72  pper-upper nosor
2dc0: 74 20 7b 7d 20 69 32 7d 0a 64 6f 5f 74 65 73 74  t {} i2}.do_test
2dd0: 20 6c 69 6b 65 2d 35 2e 32 34 20 7b 0a 20 20 71   like-5.24 {.  q
2de0: 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53  ueryplan {.    S
2df0: 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 32 20  ELECT x FROM t2 
2e00: 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27 5a 5a  WHERE x LIKE 'ZZ
2e10: 25 27 3b 0a 20 20 7d 0a 7d 20 7b 7a 7a 2d 6c 6f  %';.  }.} {zz-lo
2e20: 77 65 72 2d 6c 6f 77 65 72 20 7a 5a 2d 6c 6f 77  wer-lower zZ-low
2e30: 65 72 2d 75 70 70 65 72 20 5a 7a 2d 75 70 70 65  er-upper Zz-uppe
2e40: 72 2d 6c 6f 77 65 72 20 5a 5a 2d 75 70 70 65 72  r-lower ZZ-upper
2e50: 2d 75 70 70 65 72 20 6e 6f 73 6f 72 74 20 7b 7d  -upper nosort {}
2e60: 20 69 32 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b   i2}.do_test lik
2e70: 65 2d 35 2e 32 35 20 7b 0a 20 20 71 75 65 72 79  e-5.25 {.  query
2e80: 70 6c 61 6e 20 7b 0a 20 20 20 20 50 52 41 47 4d  plan {.    PRAGM
2e90: 41 20 63 61 73 65 5f 73 65 6e 73 69 74 69 76 65  A case_sensitive
2ea0: 5f 6c 69 6b 65 3d 6f 6e 3b 0a 20 20 20 20 43 52  _like=on;.    CR
2eb0: 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 78 20  EATE TABLE t3(x 
2ec0: 54 45 58 54 29 3b 0a 20 20 20 20 43 52 45 41 54  TEXT);.    CREAT
2ed0: 45 20 49 4e 44 45 58 20 69 33 20 4f 4e 20 74 33  E INDEX i3 ON t3
2ee0: 28 78 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  (x);.    INSERT 
2ef0: 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 27  INTO t3 VALUES('
2f00: 5a 5a 2d 75 70 70 65 72 2d 75 70 70 65 72 27 29  ZZ-upper-upper')
2f10: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
2f20: 4f 20 74 33 20 56 41 4c 55 45 53 28 27 7a 5a 2d  O t3 VALUES('zZ-
2f30: 6c 6f 77 65 72 2d 75 70 70 65 72 27 29 3b 0a 20  lower-upper');. 
2f40: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2f50: 33 20 56 41 4c 55 45 53 28 27 5a 7a 2d 75 70 70  3 VALUES('Zz-upp
2f60: 65 72 2d 6c 6f 77 65 72 27 29 3b 0a 20 20 20 20  er-lower');.    
2f70: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56  INSERT INTO t3 V
2f80: 41 4c 55 45 53 28 27 7a 7a 2d 6c 6f 77 65 72 2d  ALUES('zz-lower-
2f90: 6c 6f 77 65 72 27 29 3b 0a 20 20 20 20 53 45 4c  lower');.    SEL
2fa0: 45 43 54 20 78 20 46 52 4f 4d 20 74 33 20 57 48  ECT x FROM t3 WH
2fb0: 45 52 45 20 78 20 4c 49 4b 45 20 27 7a 7a 25 27  ERE x LIKE 'zz%'
2fc0: 3b 0a 20 20 7d 0a 7d 20 7b 7a 7a 2d 6c 6f 77 65  ;.  }.} {zz-lowe
2fd0: 72 2d 6c 6f 77 65 72 20 6e 6f 73 6f 72 74 20 7b  r-lower nosort {
2fe0: 7d 20 69 33 7d 0a 64 6f 5f 74 65 73 74 20 6c 69  } i3}.do_test li
2ff0: 6b 65 2d 35 2e 32 36 20 7b 0a 20 20 71 75 65 72  ke-5.26 {.  quer
3000: 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45  yplan {.    SELE
3010: 43 54 20 78 20 46 52 4f 4d 20 74 33 20 57 48 45  CT x FROM t3 WHE
3020: 52 45 20 78 20 4c 49 4b 45 20 27 7a 5a 25 27 3b  RE x LIKE 'zZ%';
3030: 0a 20 20 7d 0a 7d 20 7b 7a 5a 2d 6c 6f 77 65 72  .  }.} {zZ-lower
3040: 2d 75 70 70 65 72 20 6e 6f 73 6f 72 74 20 7b 7d  -upper nosort {}
3050: 20 69 33 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b   i3}.do_test lik
3060: 65 2d 35 2e 32 37 20 7b 0a 20 20 71 75 65 72 79  e-5.27 {.  query
3070: 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43  plan {.    SELEC
3080: 54 20 78 20 46 52 4f 4d 20 74 33 20 57 48 45 52  T x FROM t3 WHER
3090: 45 20 78 20 4c 49 4b 45 20 27 5a 7a 25 27 3b 0a  E x LIKE 'Zz%';.
30a0: 20 20 7d 0a 7d 20 7b 5a 7a 2d 75 70 70 65 72 2d    }.} {Zz-upper-
30b0: 6c 6f 77 65 72 20 6e 6f 73 6f 72 74 20 7b 7d 20  lower nosort {} 
30c0: 69 33 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65  i3}.do_test like
30d0: 2d 35 2e 32 38 20 7b 0a 20 20 71 75 65 72 79 70  -5.28 {.  queryp
30e0: 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  lan {.    SELECT
30f0: 20 78 20 46 52 4f 4d 20 74 33 20 57 48 45 52 45   x FROM t3 WHERE
3100: 20 78 20 4c 49 4b 45 20 27 5a 5a 25 27 3b 0a 20   x LIKE 'ZZ%';. 
3110: 20 7d 0a 7d 20 7b 5a 5a 2d 75 70 70 65 72 2d 75   }.} {ZZ-upper-u
3120: 70 70 65 72 20 6e 6f 73 6f 72 74 20 7b 7d 20 69  pper nosort {} i
3130: 33 7d 0a 0a 0a 23 20 74 69 63 6b 65 74 20 23 32  3}...# ticket #2
3140: 34 30 37 0a 23 0a 23 20 4d 61 6b 65 20 73 75 72  407.#.# Make sur
3150: 65 20 74 68 65 20 4c 49 4b 45 20 70 72 65 66 69  e the LIKE prefi
3160: 78 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 64  x optimization d
3170: 6f 65 73 20 6e 6f 74 20 73 74 72 69 70 20 6f 66  oes not strip of
3180: 66 20 6c 65 61 64 69 6e 67 0a 23 20 63 68 61 72  f leading.# char
3190: 61 63 74 65 72 73 20 6f 66 20 74 68 65 20 6c 69  acters of the li
31a0: 6b 65 20 70 61 74 74 65 72 6e 20 74 68 61 74 20  ke pattern that 
31b0: 68 61 70 70 65 6e 20 74 6f 20 62 65 20 71 75 6f  happen to be quo
31c0: 74 65 20 63 68 61 72 61 63 74 65 72 73 2e 0a 23  te characters..#
31d0: 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 36 2e  .do_test like-6.
31e0: 31 20 7b 0a 20 20 66 6f 72 65 61 63 68 20 78 20  1 {.  foreach x 
31f0: 7b 20 27 61 62 63 20 27 62 63 64 20 27 64 65 66  { 'abc 'bcd 'def
3200: 20 27 61 78 20 7d 20 7b 0a 20 20 20 20 73 65 74   'ax } {.    set
3210: 20 78 32 20 27 5b 73 74 72 69 6e 67 20 6d 61 70   x2 '[string map
3220: 20 7b 27 20 27 27 7d 20 24 78 5d 27 0a 20 20 20   {' ''} $x]'.   
3230: 20 64 62 20 65 76 61 6c 20 22 49 4e 53 45 52 54   db eval "INSERT
3240: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
3250: 24 78 32 29 22 0a 20 20 7d 0a 20 20 65 78 65 63  $x2)".  }.  exec
3260: 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  sql {.    SELECT
3270: 20 2a 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45   * FROM t2 WHERE
3280: 20 78 20 4c 49 4b 45 20 27 27 27 61 25 27 0a 20   x LIKE '''a%'. 
3290: 20 7d 0a 7d 20 7b 27 61 62 63 20 27 61 78 7d 0a   }.} {'abc 'ax}.
32a0: 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 37 2e  .do_test like-7.
32b0: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
32c0: 20 20 20 20 53 45 4c 45 43 54 20 72 6f 77 69 64      SELECT rowid
32d0: 2c 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  , * FROM t1 WHER
32e0: 45 20 72 6f 77 69 64 20 47 4c 4f 42 20 27 31 2a  E rowid GLOB '1*
32f0: 27 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64  ' ORDER BY rowid
3300: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 61 20 31 30 20  ;.  }.} {1 a 10 
3310: 41 42 43 20 31 31 20 43 44 45 20 31 32 20 7b 41  ABC 11 CDE 12 {A
3320: 42 43 20 61 62 63 20 78 79 7a 7d 7d 0a 0a 23 20  BC abc xyz}}..# 
3330: 74 69 63 6b 65 74 20 23 33 33 34 35 2e 0a 23 0a  ticket #3345..#.
3340: 23 20 4f 76 65 72 6c 6f 61 64 69 6e 67 20 74 68  # Overloading th
3350: 65 20 4c 49 4b 45 20 66 75 6e 63 74 69 6f 6e 20  e LIKE function 
3360: 77 69 74 68 20 2d 31 20 66 6f 72 20 74 68 65 20  with -1 for the 
3370: 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
3380: 6e 74 73 0a 23 20 77 69 6c 6c 20 6f 76 65 72 6c  nts.# will overl
3390: 6f 61 64 20 62 6f 74 68 20 74 68 65 20 32 2d 61  oad both the 2-a
33a0: 72 67 75 6d 65 6e 74 20 61 6e 64 20 74 68 65 20  rgument and the 
33b0: 33 2d 61 72 67 75 6d 65 6e 74 20 4c 49 4b 45 2e  3-argument LIKE.
33c0: 0a 23 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d  .#.do_test like-
33d0: 38 2e 31 20 7b 0a 20 20 64 62 20 65 76 61 6c 20  8.1 {.  db eval 
33e0: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
33f0: 4c 45 20 74 38 28 78 29 3b 0a 20 20 20 20 49 4e  LE t8(x);.    IN
3400: 53 45 52 54 20 49 4e 54 4f 20 74 38 20 56 41 4c  SERT INTO t8 VAL
3410: 55 45 53 28 27 61 62 63 64 65 66 27 29 3b 0a 20  UES('abcdef');. 
3420: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
3430: 38 20 56 41 4c 55 45 53 28 27 67 68 69 6a 6b 6c  8 VALUES('ghijkl
3440: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
3450: 4e 54 4f 20 74 38 20 56 41 4c 55 45 53 28 27 6d  NTO t8 VALUES('m
3460: 6e 6f 70 71 72 27 29 3b 0a 20 20 20 20 53 45 4c  nopqr');.    SEL
3470: 45 43 54 20 31 2c 20 78 20 46 52 4f 4d 20 74 38  ECT 1, x FROM t8
3480: 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27 25   WHERE x LIKE '%
3490: 68 25 27 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  h%';.    SELECT 
34a0: 32 2c 20 78 20 46 52 4f 4d 20 74 38 20 57 48 45  2, x FROM t8 WHE
34b0: 52 45 20 78 20 4c 49 4b 45 20 27 25 68 25 27 20  RE x LIKE '%h%' 
34c0: 45 53 43 41 50 45 20 27 78 27 3b 0a 20 20 7d 0a  ESCAPE 'x';.  }.
34d0: 7d 20 7b 31 20 67 68 69 6a 6b 6c 20 32 20 67 68  } {1 ghijkl 2 gh
34e0: 69 6a 6b 6c 7d 0a 64 6f 5f 74 65 73 74 20 6c 69  ijkl}.do_test li
34f0: 6b 65 2d 38 2e 32 20 7b 0a 20 20 70 72 6f 63 20  ke-8.2 {.  proc 
3500: 6e 65 77 6c 69 6b 65 20 7b 61 72 67 73 7d 20 7b  newlike {args} {
3510: 72 65 74 75 72 6e 20 31 7d 20 3b 23 20 41 6c 74  return 1} ;# Alt
3520: 65 72 6e 61 74 69 76 65 20 4c 49 4b 45 20 69 73  ernative LIKE is
3530: 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20 54   always return T
3540: 52 55 45 0a 20 20 64 62 20 66 75 6e 63 74 69 6f  RUE.  db functio
3550: 6e 20 6c 69 6b 65 20 6e 65 77 6c 69 6b 65 20 20  n like newlike  
3560: 20 20 20 20 20 3b 23 20 55 73 65 73 20 2d 31 20       ;# Uses -1 
3570: 66 6f 72 20 6e 41 72 67 20 69 6e 20 73 71 6c 69  for nArg in sqli
3580: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
3590: 69 6f 6e 0a 20 20 64 62 20 63 61 63 68 65 20 66  ion.  db cache f
35a0: 6c 75 73 68 0a 20 20 64 62 20 65 76 61 6c 20 7b  lush.  db eval {
35b0: 0a 20 20 20 20 53 45 4c 45 43 54 20 31 2c 20 78  .    SELECT 1, x
35c0: 20 46 52 4f 4d 20 74 38 20 57 48 45 52 45 20 78   FROM t8 WHERE x
35d0: 20 4c 49 4b 45 20 27 25 68 25 27 3b 0a 20 20 20   LIKE '%h%';.   
35e0: 20 53 45 4c 45 43 54 20 32 2c 20 78 20 46 52 4f   SELECT 2, x FRO
35f0: 4d 20 74 38 20 57 48 45 52 45 20 78 20 4c 49 4b  M t8 WHERE x LIK
3600: 45 20 27 25 68 25 27 20 45 53 43 41 50 45 20 27  E '%h%' ESCAPE '
3610: 78 27 3b 0a 20 20 7d 0a 7d 20 7b 31 20 67 68 69  x';.  }.} {1 ghi
3620: 6a 6b 6c 20 32 20 67 68 69 6a 6b 6c 7d 0a 64 6f  jkl 2 ghijkl}.do
3630: 5f 74 65 73 74 20 6c 69 6b 65 2d 38 2e 33 20 7b  _test like-8.3 {
3640: 0a 20 20 64 62 20 66 75 6e 63 74 69 6f 6e 20 6c  .  db function l
3650: 69 6b 65 20 2d 61 72 67 63 6f 75 6e 74 20 32 20  ike -argcount 2 
3660: 6e 65 77 6c 69 6b 65 0a 20 20 64 62 20 65 76 61  newlike.  db eva
3670: 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 31  l {.    SELECT 1
3680: 2c 20 78 20 46 52 4f 4d 20 74 38 20 57 48 45 52  , x FROM t8 WHER
3690: 45 20 78 20 4c 49 4b 45 20 27 25 68 25 27 3b 0a  E x LIKE '%h%';.
36a0: 20 20 20 20 53 45 4c 45 43 54 20 32 2c 20 78 20      SELECT 2, x 
36b0: 46 52 4f 4d 20 74 38 20 57 48 45 52 45 20 78 20  FROM t8 WHERE x 
36c0: 4c 49 4b 45 20 27 25 68 25 27 20 45 53 43 41 50  LIKE '%h%' ESCAP
36d0: 45 20 27 78 27 3b 0a 20 20 7d 0a 7d 20 7b 31 20  E 'x';.  }.} {1 
36e0: 61 62 63 64 65 66 20 31 20 67 68 69 6a 6b 6c 20  abcdef 1 ghijkl 
36f0: 31 20 6d 6e 6f 70 71 72 20 32 20 67 68 69 6a 6b  1 mnopqr 2 ghijk
3700: 6c 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d  l}.do_test like-
3710: 38 2e 34 20 7b 0a 20 20 64 62 20 66 75 6e 63 74  8.4 {.  db funct
3720: 69 6f 6e 20 6c 69 6b 65 20 2d 61 72 67 63 6f 75  ion like -argcou
3730: 6e 74 20 33 20 6e 65 77 6c 69 6b 65 0a 20 20 64  nt 3 newlike.  d
3740: 62 20 65 76 61 6c 20 7b 0a 20 20 20 20 53 45 4c  b eval {.    SEL
3750: 45 43 54 20 31 2c 20 78 20 46 52 4f 4d 20 74 38  ECT 1, x FROM t8
3760: 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27 25   WHERE x LIKE '%
3770: 68 25 27 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  h%';.    SELECT 
3780: 32 2c 20 78 20 46 52 4f 4d 20 74 38 20 57 48 45  2, x FROM t8 WHE
3790: 52 45 20 78 20 4c 49 4b 45 20 27 25 68 25 27 20  RE x LIKE '%h%' 
37a0: 45 53 43 41 50 45 20 27 78 27 3b 0a 20 20 7d 0a  ESCAPE 'x';.  }.
37b0: 7d 20 7b 31 20 61 62 63 64 65 66 20 31 20 67 68  } {1 abcdef 1 gh
37c0: 69 6a 6b 6c 20 31 20 6d 6e 6f 70 71 72 20 32 20  ijkl 1 mnopqr 2 
37d0: 61 62 63 64 65 66 20 32 20 67 68 69 6a 6b 6c 20  abcdef 2 ghijkl 
37e0: 32 20 6d 6e 6f 70 71 72 7d 0a 0a 0a 69 66 63 61  2 mnopqr}...ifca
37f0: 70 61 62 6c 65 20 6c 69 6b 65 5f 6f 70 74 26 26  pable like_opt&&
3800: 21 69 63 75 20 7b 0a 20 20 23 20 45 76 61 6c 75  !icu {.  # Evalu
3810: 61 74 65 20 53 51 4c 2e 20 20 52 65 74 75 72 6e  ate SQL.  Return
3820: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
3830: 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 68 65 0a  followed by the.
3840: 20 20 23 20 61 6e 64 20 74 68 65 20 6e 75 6d 62    # and the numb
3850: 65 72 20 6f 66 20 66 75 6c 6c 2d 73 63 61 6e 20  er of full-scan 
3860: 73 74 65 70 73 2e 0a 20 20 23 0a 20 20 64 62 20  steps..  #.  db 
3870: 63 6c 6f 73 65 0a 20 20 73 71 6c 69 74 65 33 20  close.  sqlite3 
3880: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 70 72 6f  db test.db.  pro
3890: 63 20 63 6f 75 6e 74 5f 73 74 65 70 73 20 7b 73  c count_steps {s
38a0: 71 6c 7d 20 7b 0a 20 20 20 20 73 65 74 20 72 20  ql} {.    set r 
38b0: 5b 64 62 20 65 76 61 6c 20 24 73 71 6c 5d 0a 20  [db eval $sql]. 
38c0: 20 20 20 6c 61 70 70 65 6e 64 20 72 20 73 63 61     lappend r sca
38d0: 6e 20 5b 64 62 20 73 74 61 74 75 73 20 73 74 65  n [db status ste
38e0: 70 5d 20 73 6f 72 74 20 5b 64 62 20 73 74 61 74  p] sort [db stat
38f0: 75 73 20 73 6f 72 74 5d 0a 20 20 7d 0a 20 20 64  us sort].  }.  d
3900: 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 39 2e 31 20  o_test like-9.1 
3910: 7b 0a 20 20 20 20 63 6f 75 6e 74 5f 73 74 65 70  {.    count_step
3920: 73 20 7b 0a 20 20 20 20 20 20 20 53 45 4c 45 43  s {.       SELEC
3930: 54 20 78 20 46 52 4f 4d 20 74 32 20 57 48 45 52  T x FROM t2 WHER
3940: 45 20 78 20 4c 49 4b 45 20 27 78 25 27 0a 20 20  E x LIKE 'x%'.  
3950: 20 20 7d 0a 20 20 7d 20 7b 78 79 7a 20 73 63 61    }.  } {xyz sca
3960: 6e 20 30 20 73 6f 72 74 20 30 7d 0a 20 20 64 6f  n 0 sort 0}.  do
3970: 5f 74 65 73 74 20 6c 69 6b 65 2d 39 2e 32 20 7b  _test like-9.2 {
3980: 0a 20 20 20 20 63 6f 75 6e 74 5f 73 74 65 70 73  .    count_steps
3990: 20 7b 0a 20 20 20 20 20 20 20 53 45 4c 45 43 54   {.       SELECT
39a0: 20 78 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45   x FROM t2 WHERE
39b0: 20 78 20 4c 49 4b 45 20 27 5f 79 25 27 0a 20 20   x LIKE '_y%'.  
39c0: 20 20 7d 0a 20 20 7d 20 7b 78 79 7a 20 73 63 61    }.  } {xyz sca
39d0: 6e 20 31 39 20 73 6f 72 74 20 30 7d 0a 20 20 64  n 19 sort 0}.  d
39e0: 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 39 2e 33 2e  o_test like-9.3.
39f0: 31 20 7b 0a 20 20 20 20 73 65 74 20 72 65 73 20  1 {.    set res 
3a00: 5b 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 68 65  [sqlite3_exec_he
3a10: 78 20 64 62 20 7b 0a 20 20 20 20 20 20 20 53 45  x db {.       SE
3a20: 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 32 20 57  LECT x FROM t2 W
3a30: 48 45 52 45 20 78 20 4c 49 4b 45 20 27 25 37 38  HERE x LIKE '%78
3a40: 25 32 35 27 0a 20 20 20 20 7d 5d 0a 20 20 7d 20  %25'.    }].  } 
3a50: 7b 30 20 7b 78 20 78 79 7a 7d 7d 0a 20 20 69 66  {0 {x xyz}}.  if
3a60: 63 61 70 61 62 6c 65 20 65 78 70 6c 61 69 6e 20  capable explain 
3a70: 7b 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 6c 69  {.    do_test li
3a80: 6b 65 2d 39 2e 33 2e 32 20 7b 0a 20 20 20 20 20  ke-9.3.2 {.     
3a90: 20 73 65 74 20 72 65 73 20 5b 73 71 6c 69 74 65   set res [sqlite
3aa0: 33 5f 65 78 65 63 5f 68 65 78 20 64 62 20 7b 0a  3_exec_hex db {.
3ab0: 20 20 20 20 20 20 20 20 20 45 58 50 4c 41 49 4e           EXPLAIN
3ac0: 20 51 55 45 52 59 20 50 4c 41 4e 20 53 45 4c 45   QUERY PLAN SELE
3ad0: 43 54 20 78 20 46 52 4f 4d 20 74 32 20 57 48 45  CT x FROM t2 WHE
3ae0: 52 45 20 78 20 4c 49 4b 45 20 27 25 37 38 25 32  RE x LIKE '%78%2
3af0: 35 27 0a 20 20 20 20 20 20 7d 5d 0a 20 20 20 20  5'.      }].    
3b00: 20 20 72 65 67 65 78 70 20 7b 49 4e 44 45 58 20    regexp {INDEX 
3b10: 69 32 7d 20 24 72 65 73 0a 20 20 20 20 7d 20 7b  i2} $res.    } {
3b20: 31 7d 0a 20 20 7d 0a 20 20 64 6f 5f 74 65 73 74  1}.  }.  do_test
3b30: 20 6c 69 6b 65 2d 39 2e 34 2e 31 20 7b 0a 20 20   like-9.4.1 {.  
3b40: 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 68    sqlite3_exec_h
3b50: 65 78 20 64 62 20 7b 49 4e 53 45 52 54 20 49 4e  ex db {INSERT IN
3b60: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27 25 66  TO t2 VALUES('%f
3b70: 66 68 65 6c 6c 6f 27 29 7d 0a 20 20 20 20 73 65  fhello')}.    se
3b80: 74 20 72 65 73 20 5b 73 71 6c 69 74 65 33 5f 65  t res [sqlite3_e
3b90: 78 65 63 5f 68 65 78 20 64 62 20 7b 0a 20 20 20  xec_hex db {.   
3ba0: 20 20 20 20 53 45 4c 45 43 54 20 73 75 62 73 74      SELECT subst
3bb0: 72 28 78 2c 32 29 20 41 53 20 78 20 46 52 4f 4d  r(x,2) AS x FROM
3bc0: 20 74 32 20 57 48 45 52 45 20 2b 78 20 4c 49 4b   t2 WHERE +x LIK
3bd0: 45 20 27 25 66 66 25 32 35 27 0a 20 20 20 20 7d  E '%ff%25'.    }
3be0: 5d 0a 20 20 7d 20 7b 30 20 7b 78 20 68 65 6c 6c  ].  } {0 {x hell
3bf0: 6f 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 6c 69  o}}.  do_test li
3c00: 6b 65 2d 39 2e 34 2e 32 20 7b 0a 20 20 20 20 73  ke-9.4.2 {.    s
3c10: 65 74 20 72 65 73 20 5b 73 71 6c 69 74 65 33 5f  et res [sqlite3_
3c20: 65 78 65 63 5f 68 65 78 20 64 62 20 7b 0a 20 20  exec_hex db {.  
3c30: 20 20 20 20 20 53 45 4c 45 43 54 20 73 75 62 73       SELECT subs
3c40: 74 72 28 78 2c 32 29 20 41 53 20 78 20 46 52 4f  tr(x,2) AS x FRO
3c50: 4d 20 74 32 20 57 48 45 52 45 20 78 20 4c 49 4b  M t2 WHERE x LIK
3c60: 45 20 27 25 66 66 25 32 35 27 0a 20 20 20 20 7d  E '%ff%25'.    }
3c70: 5d 0a 20 20 7d 20 7b 30 20 7b 78 20 68 65 6c 6c  ].  } {0 {x hell
3c80: 6f 7d 7d 0a 20 20 69 66 63 61 70 61 62 6c 65 20  o}}.  ifcapable 
3c90: 65 78 70 6c 61 69 6e 20 7b 0a 20 20 20 20 64 6f  explain {.    do
3ca0: 5f 74 65 73 74 20 6c 69 6b 65 2d 39 2e 34 2e 33  _test like-9.4.3
3cb0: 20 7b 0a 20 20 20 20 20 20 73 65 74 20 72 65 73   {.      set res
3cc0: 20 5b 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 68   [sqlite3_exec_h
3cd0: 65 78 20 64 62 20 7b 0a 20 20 20 20 20 20 20 20  ex db {.        
3ce0: 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
3cf0: 4c 41 4e 20 53 45 4c 45 43 54 20 78 20 46 52 4f  LAN SELECT x FRO
3d00: 4d 20 74 32 20 57 48 45 52 45 20 78 20 4c 49 4b  M t2 WHERE x LIK
3d10: 45 20 27 25 66 66 25 32 35 27 0a 20 20 20 20 20  E '%ff%25'.     
3d20: 20 7d 5d 0a 20 20 20 20 20 20 72 65 67 65 78 70   }].      regexp
3d30: 20 7b 49 4e 44 45 58 20 69 32 7d 20 24 72 65 73   {INDEX i2} $res
3d40: 0a 20 20 20 20 7d 20 7b 30 7d 0a 20 20 7d 0a 20  .    } {0}.  }. 
3d50: 20 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 39 2e   do_test like-9.
3d60: 35 2e 31 20 7b 0a 20 20 20 20 73 65 74 20 72 65  5.1 {.    set re
3d70: 73 20 5b 73 71 6c 69 74 65 33 5f 65 78 65 63 5f  s [sqlite3_exec_
3d80: 68 65 78 20 64 62 20 7b 0a 20 20 20 20 20 20 20  hex db {.       
3d90: 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 32  SELECT x FROM t2
3da0: 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27 25   WHERE x LIKE '%
3db0: 66 65 25 32 35 27 0a 20 20 20 20 7d 5d 0a 20 20  fe%25'.    }].  
3dc0: 7d 20 7b 30 20 7b 7d 7d 0a 20 20 69 66 63 61 70  } {0 {}}.  ifcap
3dd0: 61 62 6c 65 20 65 78 70 6c 61 69 6e 20 7b 0a 20  able explain {. 
3de0: 20 20 20 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d     do_test like-
3df0: 39 2e 35 2e 32 20 7b 0a 20 20 20 20 20 20 73 65  9.5.2 {.      se
3e00: 74 20 72 65 73 20 5b 73 71 6c 69 74 65 33 5f 65  t res [sqlite3_e
3e10: 78 65 63 5f 68 65 78 20 64 62 20 7b 0a 20 20 20  xec_hex db {.   
3e20: 20 20 20 20 20 20 45 58 50 4c 41 49 4e 20 51 55        EXPLAIN QU
3e30: 45 52 59 20 50 4c 41 4e 20 53 45 4c 45 43 54 20  ERY PLAN SELECT 
3e40: 78 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20  x FROM t2 WHERE 
3e50: 78 20 4c 49 4b 45 20 27 25 66 65 25 32 35 27 0a  x LIKE '%fe%25'.
3e60: 20 20 20 20 20 20 7d 5d 0a 20 20 20 20 20 20 72        }].      r
3e70: 65 67 65 78 70 20 7b 49 4e 44 45 58 20 69 32 7d  egexp {INDEX i2}
3e80: 20 24 72 65 73 0a 20 20 20 20 7d 20 7b 31 7d 0a   $res.    } {1}.
3e90: 20 20 7d 0a 0a 20 20 23 20 44 6f 20 61 6e 20 53    }..  # Do an S
3ea0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41  QL statement.  A
3eb0: 70 70 65 6e 64 20 74 68 65 20 73 65 61 72 63 68  ppend the search
3ec0: 20 63 6f 75 6e 74 20 74 6f 20 74 68 65 20 65 6e   count to the en
3ed0: 64 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e  d of the result.
3ee0: 0a 20 20 23 0a 20 20 70 72 6f 63 20 63 6f 75 6e  .  #.  proc coun
3ef0: 74 20 73 71 6c 20 7b 0a 20 20 20 20 73 65 74 20  t sql {.    set 
3f00: 3a 3a 73 71 6c 69 74 65 5f 73 65 61 72 63 68 5f  ::sqlite_search_
3f10: 63 6f 75 6e 74 20 30 0a 20 20 20 20 73 65 74 20  count 0.    set 
3f20: 3a 3a 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f  ::sqlite_like_co
3f30: 75 6e 74 20 30 0a 20 20 20 20 72 65 74 75 72 6e  unt 0.    return
3f40: 20 5b 63 6f 6e 63 61 74 20 5b 65 78 65 63 73 71   [concat [execsq
3f50: 6c 20 24 73 71 6c 5d 20 73 63 61 6e 20 24 3a 3a  l $sql] scan $::
3f60: 73 71 6c 69 74 65 5f 73 65 61 72 63 68 5f 63 6f  sqlite_search_co
3f70: 75 6e 74 20 5c 0a 20 20 20 20 20 20 20 20 20 20  unt \.          
3f80: 20 20 20 6c 69 6b 65 20 24 3a 3a 73 71 6c 69 74     like $::sqlit
3f90: 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 5d 0a 20 20  e_like_count].  
3fa0: 7d 0a 0a 20 20 23 20 54 68 65 20 4c 49 4b 45 20  }..  # The LIKE 
3fb0: 61 6e 64 20 47 4c 4f 42 20 6f 70 74 69 6d 69 7a  and GLOB optimiz
3fc0: 61 74 69 6f 6e 73 20 64 6f 20 6e 6f 74 20 77 6f  ations do not wo
3fd0: 72 6b 20 6f 6e 20 63 6f 6c 75 6d 6e 73 20 77 69  rk on columns wi
3fe0: 74 68 0a 20 20 23 20 61 66 66 69 6e 69 74 79 20  th.  # affinity 
3ff0: 6f 74 68 65 72 20 74 68 61 6e 20 54 45 58 54 2e  other than TEXT.
4000: 0a 20 20 23 20 54 69 63 6b 65 74 20 23 33 39 30  .  # Ticket #390
4010: 31 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20  1.  #.  do_test 
4020: 6c 69 6b 65 2d 31 30 2e 31 20 7b 0a 20 20 20 20  like-10.1 {.    
4030: 64 62 20 63 6c 6f 73 65 0a 20 20 20 20 73 71 6c  db close.    sql
4040: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
4050: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
4060: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
4070: 20 74 31 30 28 0a 20 20 20 20 20 20 20 20 61 20   t10(.        a 
4080: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
4090: 4b 45 59 2c 0a 20 20 20 20 20 20 20 20 62 20 49  KEY,.        b I
40a0: 4e 54 45 47 45 52 20 43 4f 4c 4c 41 54 45 20 6e  NTEGER COLLATE n
40b0: 6f 63 61 73 65 20 55 4e 49 51 55 45 2c 0a 20 20  ocase UNIQUE,.  
40c0: 20 20 20 20 20 20 63 20 4e 55 4d 42 45 52 20 43        c NUMBER C
40d0: 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 55 4e  OLLATE nocase UN
40e0: 49 51 55 45 2c 0a 20 20 20 20 20 20 20 20 64 20  IQUE,.        d 
40f0: 42 4c 4f 42 20 43 4f 4c 4c 41 54 45 20 6e 6f 63  BLOB COLLATE noc
4100: 61 73 65 20 55 4e 49 51 55 45 2c 0a 20 20 20 20  ase UNIQUE,.    
4110: 20 20 20 20 65 20 43 4f 4c 4c 41 54 45 20 6e 6f      e COLLATE no
4120: 63 61 73 65 20 55 4e 49 51 55 45 2c 0a 20 20 20  case UNIQUE,.   
4130: 20 20 20 20 20 66 20 54 45 58 54 20 43 4f 4c 4c       f TEXT COLL
4140: 41 54 45 20 6e 6f 63 61 73 65 20 55 4e 49 51 55  ATE nocase UNIQU
4150: 45 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  E.      );.     
4160: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 30   INSERT INTO t10
4170: 20 56 41 4c 55 45 53 28 31 2c 31 2c 31 2c 31 2c   VALUES(1,1,1,1,
4180: 31 2c 31 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  1,1);.      INSE
4190: 52 54 20 49 4e 54 4f 20 74 31 30 20 56 41 4c 55  RT INTO t10 VALU
41a0: 45 53 28 31 32 2c 31 32 2c 31 32 2c 31 32 2c 31  ES(12,12,12,12,1
41b0: 32 2c 31 32 29 3b 0a 20 20 20 20 20 20 49 4e 53  2,12);.      INS
41c0: 45 52 54 20 49 4e 54 4f 20 74 31 30 20 56 41 4c  ERT INTO t10 VAL
41d0: 55 45 53 28 31 32 33 2c 31 32 33 2c 31 32 33 2c  UES(123,123,123,
41e0: 31 32 33 2c 31 32 33 2c 31 32 33 29 3b 0a 20 20  123,123,123);.  
41f0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
4200: 74 31 30 20 56 41 4c 55 45 53 28 32 33 34 2c 32  t10 VALUES(234,2
4210: 33 34 2c 32 33 34 2c 32 33 34 2c 32 33 34 2c 32  34,234,234,234,2
4220: 33 34 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  34);.      INSER
4230: 54 20 49 4e 54 4f 20 74 31 30 20 56 41 4c 55 45  T INTO t10 VALUE
4240: 53 28 33 34 35 2c 33 34 35 2c 33 34 35 2c 33 34  S(345,345,345,34
4250: 35 2c 33 34 35 2c 33 34 35 29 3b 0a 20 20 20 20  5,345,345);.    
4260: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
4270: 30 20 56 41 4c 55 45 53 28 34 35 2c 34 35 2c 34  0 VALUES(45,45,4
4280: 35 2c 34 35 2c 34 35 2c 34 35 29 3b 0a 20 20 20  5,45,45,45);.   
4290: 20 7d 0a 20 20 20 20 63 6f 75 6e 74 20 7b 0a 20   }.    count {. 
42a0: 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52       SELECT a FR
42b0: 4f 4d 20 74 31 30 20 57 48 45 52 45 20 62 20 4c  OM t10 WHERE b L
42c0: 49 4b 45 20 27 31 32 25 27 20 4f 52 44 45 52 20  IKE '12%' ORDER 
42d0: 42 59 20 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  BY a;.    }.  } 
42e0: 7b 31 32 20 31 32 33 20 73 63 61 6e 20 35 20 6c  {12 123 scan 5 l
42f0: 69 6b 65 20 36 7d 0a 20 20 64 6f 5f 74 65 73 74  ike 6}.  do_test
4300: 20 6c 69 6b 65 2d 31 30 2e 32 20 7b 0a 20 20 20   like-10.2 {.   
4310: 20 63 6f 75 6e 74 20 7b 0a 20 20 20 20 20 20 53   count {.      S
4320: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 30  ELECT a FROM t10
4330: 20 57 48 45 52 45 20 63 20 4c 49 4b 45 20 27 31   WHERE c LIKE '1
4340: 32 25 27 20 4f 52 44 45 52 20 42 59 20 61 3b 0a  2%' ORDER BY a;.
4350: 20 20 20 20 7d 0a 20 20 7d 20 7b 31 32 20 31 32      }.  } {12 12
4360: 33 20 73 63 61 6e 20 35 20 6c 69 6b 65 20 36 7d  3 scan 5 like 6}
4370: 0a 20 20 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d  .  do_test like-
4380: 31 30 2e 33 20 7b 0a 20 20 20 20 63 6f 75 6e 74  10.3 {.    count
4390: 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20   {.      SELECT 
43a0: 61 20 46 52 4f 4d 20 74 31 30 20 57 48 45 52 45  a FROM t10 WHERE
43b0: 20 64 20 4c 49 4b 45 20 27 31 32 25 27 20 4f 52   d LIKE '12%' OR
43c0: 44 45 52 20 42 59 20 61 3b 0a 20 20 20 20 7d 0a  DER BY a;.    }.
43d0: 20 20 7d 20 7b 31 32 20 31 32 33 20 73 63 61 6e    } {12 123 scan
43e0: 20 35 20 6c 69 6b 65 20 36 7d 0a 20 20 64 6f 5f   5 like 6}.  do_
43f0: 74 65 73 74 20 6c 69 6b 65 2d 31 30 2e 34 20 7b  test like-10.4 {
4400: 0a 20 20 20 20 63 6f 75 6e 74 20 7b 0a 20 20 20  .    count {.   
4410: 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d     SELECT a FROM
4420: 20 74 31 30 20 57 48 45 52 45 20 65 20 4c 49 4b   t10 WHERE e LIK
4430: 45 20 27 31 32 25 27 20 4f 52 44 45 52 20 42 59  E '12%' ORDER BY
4440: 20 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31   a;.    }.  } {1
4450: 32 20 31 32 33 20 73 63 61 6e 20 35 20 6c 69 6b  2 123 scan 5 lik
4460: 65 20 36 7d 0a 20 20 64 6f 5f 74 65 73 74 20 6c  e 6}.  do_test l
4470: 69 6b 65 2d 31 30 2e 35 20 7b 0a 20 20 20 20 63  ike-10.5 {.    c
4480: 6f 75 6e 74 20 7b 0a 20 20 20 20 20 20 53 45 4c  ount {.      SEL
4490: 45 43 54 20 61 20 46 52 4f 4d 20 74 31 30 20 57  ECT a FROM t10 W
44a0: 48 45 52 45 20 66 20 4c 49 4b 45 20 27 31 32 25  HERE f LIKE '12%
44b0: 27 20 4f 52 44 45 52 20 42 59 20 61 3b 0a 20 20  ' ORDER BY a;.  
44c0: 20 20 7d 0a 20 20 7d 20 7b 31 32 20 31 32 33 20    }.  } {12 123 
44d0: 73 63 61 6e 20 33 20 6c 69 6b 65 20 30 7d 0a 20  scan 3 like 0}. 
44e0: 20 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 31 30   do_test like-10
44f0: 2e 36 20 7b 0a 20 20 20 20 63 6f 75 6e 74 20 7b  .6 {.    count {
4500: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 20  .      SELECT a 
4510: 46 52 4f 4d 20 74 31 30 20 57 48 45 52 45 20 61  FROM t10 WHERE a
4520: 20 4c 49 4b 45 20 27 31 32 25 27 20 4f 52 44 45   LIKE '12%' ORDE
4530: 52 20 42 59 20 61 3b 0a 20 20 20 20 7d 0a 20 20  R BY a;.    }.  
4540: 7d 20 7b 31 32 20 31 32 33 20 73 63 61 6e 20 35  } {12 123 scan 5
4550: 20 6c 69 6b 65 20 36 7d 0a 20 20 64 6f 5f 74 65   like 6}.  do_te
4560: 73 74 20 6c 69 6b 65 2d 31 30 2e 31 30 20 7b 0a  st like-10.10 {.
4570: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
4580: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
4590: 20 74 31 30 62 28 0a 20 20 20 20 20 20 20 20 61   t10b(.        a
45a0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
45b0: 20 4b 45 59 2c 0a 20 20 20 20 20 20 20 20 62 20   KEY,.        b 
45c0: 49 4e 54 45 47 45 52 20 55 4e 49 51 55 45 2c 0a  INTEGER UNIQUE,.
45d0: 20 20 20 20 20 20 20 20 63 20 4e 55 4d 42 45 52          c NUMBER
45e0: 20 55 4e 49 51 55 45 2c 0a 20 20 20 20 20 20 20   UNIQUE,.       
45f0: 20 64 20 42 4c 4f 42 20 55 4e 49 51 55 45 2c 0a   d BLOB UNIQUE,.
4600: 20 20 20 20 20 20 20 20 65 20 55 4e 49 51 55 45          e UNIQUE
4610: 2c 0a 20 20 20 20 20 20 20 20 66 20 54 45 58 54  ,.        f TEXT
4620: 20 55 4e 49 51 55 45 0a 20 20 20 20 20 20 29 3b   UNIQUE.      );
4630: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
4640: 54 4f 20 74 31 30 62 20 53 45 4c 45 43 54 20 2a  TO t10b SELECT *
4650: 20 46 52 4f 4d 20 74 31 30 3b 0a 20 20 20 20 7d   FROM t10;.    }
4660: 0a 20 20 20 20 63 6f 75 6e 74 20 7b 0a 20 20 20  .    count {.   
4670: 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d     SELECT a FROM
4680: 20 74 31 30 62 20 57 48 45 52 45 20 62 20 47 4c   t10b WHERE b GL
4690: 4f 42 20 27 31 32 2a 27 20 4f 52 44 45 52 20 42  OB '12*' ORDER B
46a0: 59 20 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b  Y a;.    }.  } {
46b0: 31 32 20 31 32 33 20 73 63 61 6e 20 35 20 6c 69  12 123 scan 5 li
46c0: 6b 65 20 36 7d 0a 20 20 64 6f 5f 74 65 73 74 20  ke 6}.  do_test 
46d0: 6c 69 6b 65 2d 31 30 2e 31 31 20 7b 0a 20 20 20  like-10.11 {.   
46e0: 20 63 6f 75 6e 74 20 7b 0a 20 20 20 20 20 20 53   count {.      S
46f0: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 30  ELECT a FROM t10
4700: 62 20 57 48 45 52 45 20 63 20 47 4c 4f 42 20 27  b WHERE c GLOB '
4710: 31 32 2a 27 20 4f 52 44 45 52 20 42 59 20 61 3b  12*' ORDER BY a;
4720: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 32 20 31  .    }.  } {12 1
4730: 32 33 20 73 63 61 6e 20 35 20 6c 69 6b 65 20 36  23 scan 5 like 6
4740: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 6c 69 6b 65  }.  do_test like
4750: 2d 31 30 2e 31 32 20 7b 0a 20 20 20 20 63 6f 75  -10.12 {.    cou
4760: 6e 74 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43  nt {.      SELEC
4770: 54 20 61 20 46 52 4f 4d 20 74 31 30 62 20 57 48  T a FROM t10b WH
4780: 45 52 45 20 64 20 47 4c 4f 42 20 27 31 32 2a 27  ERE d GLOB '12*'
4790: 20 4f 52 44 45 52 20 42 59 20 61 3b 0a 20 20 20   ORDER BY a;.   
47a0: 20 7d 0a 20 20 7d 20 7b 31 32 20 31 32 33 20 73   }.  } {12 123 s
47b0: 63 61 6e 20 35 20 6c 69 6b 65 20 36 7d 0a 20 20  can 5 like 6}.  
47c0: 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 31 30 2e  do_test like-10.
47d0: 31 33 20 7b 0a 20 20 20 20 63 6f 75 6e 74 20 7b  13 {.    count {
47e0: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 20  .      SELECT a 
47f0: 46 52 4f 4d 20 74 31 30 62 20 57 48 45 52 45 20  FROM t10b WHERE 
4800: 65 20 47 4c 4f 42 20 27 31 32 2a 27 20 4f 52 44  e GLOB '12*' ORD
4810: 45 52 20 42 59 20 61 3b 0a 20 20 20 20 7d 0a 20  ER BY a;.    }. 
4820: 20 7d 20 7b 31 32 20 31 32 33 20 73 63 61 6e 20   } {12 123 scan 
4830: 35 20 6c 69 6b 65 20 36 7d 0a 20 20 64 6f 5f 74  5 like 6}.  do_t
4840: 65 73 74 20 6c 69 6b 65 2d 31 30 2e 31 34 20 7b  est like-10.14 {
4850: 0a 20 20 20 20 63 6f 75 6e 74 20 7b 0a 20 20 20  .    count {.   
4860: 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d     SELECT a FROM
4870: 20 74 31 30 62 20 57 48 45 52 45 20 66 20 47 4c   t10b WHERE f GL
4880: 4f 42 20 27 31 32 2a 27 20 4f 52 44 45 52 20 42  OB '12*' ORDER B
4890: 59 20 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b  Y a;.    }.  } {
48a0: 31 32 20 31 32 33 20 73 63 61 6e 20 33 20 6c 69  12 123 scan 3 li
48b0: 6b 65 20 30 7d 0a 20 20 64 6f 5f 74 65 73 74 20  ke 0}.  do_test 
48c0: 6c 69 6b 65 2d 31 30 2e 31 35 20 7b 0a 20 20 20  like-10.15 {.   
48d0: 20 63 6f 75 6e 74 20 7b 0a 20 20 20 20 20 20 53   count {.      S
48e0: 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 30  ELECT a FROM t10
48f0: 62 20 57 48 45 52 45 20 61 20 47 4c 4f 42 20 27  b WHERE a GLOB '
4900: 31 32 2a 27 20 4f 52 44 45 52 20 42 59 20 61 3b  12*' ORDER BY a;
4910: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 32 20 31  .    }.  } {12 1
4920: 32 33 20 73 63 61 6e 20 35 20 6c 69 6b 65 20 36  23 scan 5 like 6
4930: 7d 0a 7d 0a 0a 23 20 4c 49 4b 45 20 61 6e 64 20  }.}..# LIKE and 
4940: 47 4c 4f 42 20 77 68 65 72 65 20 74 68 65 20 64  GLOB where the d
4950: 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67  efault collating
4960: 20 73 65 71 75 65 6e 63 65 20 69 73 20 6e 6f 74   sequence is not
4970: 20 61 70 70 72 6f 70 72 69 61 74 65 0a 23 20 62   appropriate.# b
4980: 75 74 20 61 6e 20 69 6e 64 65 78 20 77 69 74 68  ut an index with
4990: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
49a0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
49b0: 6e 63 65 20 65 78 69 73 74 73 2e 0a 23 0a 64 6f  nce exists..#.do
49c0: 5f 74 65 73 74 20 6c 69 6b 65 2d 31 31 2e 30 20  _test like-11.0 
49d0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
49e0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
49f0: 31 31 28 0a 20 20 20 20 20 20 61 20 49 4e 54 45  11(.      a INTE
4a00: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
4a10: 0a 20 20 20 20 20 20 62 20 54 45 58 54 20 43 4f  .      b TEXT CO
4a20: 4c 4c 41 54 45 20 6e 6f 63 61 73 65 2c 0a 20 20  LLATE nocase,.  
4a30: 20 20 20 20 63 20 54 45 58 54 20 43 4f 4c 4c 41      c TEXT COLLA
4a40: 54 45 20 62 69 6e 61 72 79 0a 20 20 20 20 29 3b  TE binary.    );
4a50: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
4a60: 20 74 31 31 20 56 41 4c 55 45 53 28 31 2c 20 27   t11 VALUES(1, '
4a70: 61 27 2c 27 61 27 29 3b 0a 20 20 20 20 49 4e 53  a','a');.    INS
4a80: 45 52 54 20 49 4e 54 4f 20 74 31 31 20 56 41 4c  ERT INTO t11 VAL
4a90: 55 45 53 28 32 2c 20 27 61 62 27 2c 27 61 62 27  UES(2, 'ab','ab'
4aa0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
4ab0: 54 4f 20 74 31 31 20 56 41 4c 55 45 53 28 33 2c  TO t11 VALUES(3,
4ac0: 20 27 61 62 63 27 2c 27 61 62 63 27 29 3b 0a 20   'abc','abc');. 
4ad0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
4ae0: 31 31 20 56 41 4c 55 45 53 28 34 2c 20 27 61 62  11 VALUES(4, 'ab
4af0: 63 64 27 2c 27 61 62 63 64 27 29 3b 0a 20 20 20  cd','abcd');.   
4b00: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 31   INSERT INTO t11
4b10: 20 56 41 4c 55 45 53 28 35 2c 20 27 41 27 2c 27   VALUES(5, 'A','
4b20: 41 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  A');.    INSERT 
4b30: 49 4e 54 4f 20 74 31 31 20 56 41 4c 55 45 53 28  INTO t11 VALUES(
4b40: 36 2c 20 27 41 42 27 2c 27 41 42 27 29 3b 0a 20  6, 'AB','AB');. 
4b50: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
4b60: 31 31 20 56 41 4c 55 45 53 28 37 2c 20 27 41 42  11 VALUES(7, 'AB
4b70: 43 27 2c 27 41 42 43 27 29 3b 0a 20 20 20 20 49  C','ABC');.    I
4b80: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 31 20 56  NSERT INTO t11 V
4b90: 41 4c 55 45 53 28 38 2c 20 27 41 42 43 44 27 2c  ALUES(8, 'ABCD',
4ba0: 27 41 42 43 44 27 29 3b 0a 20 20 20 20 49 4e 53  'ABCD');.    INS
4bb0: 45 52 54 20 49 4e 54 4f 20 74 31 31 20 56 41 4c  ERT INTO t11 VAL
4bc0: 55 45 53 28 39 2c 20 27 78 27 2c 27 78 27 29 3b  UES(9, 'x','x');
4bd0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
4be0: 20 74 31 31 20 56 41 4c 55 45 53 28 31 30 2c 20   t11 VALUES(10, 
4bf0: 27 79 7a 27 2c 27 79 7a 27 29 3b 0a 20 20 20 20  'yz','yz');.    
4c00: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 31 20  INSERT INTO t11 
4c10: 56 41 4c 55 45 53 28 31 31 2c 20 27 58 27 2c 27  VALUES(11, 'X','
4c20: 58 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  X');.    INSERT 
4c30: 49 4e 54 4f 20 74 31 31 20 56 41 4c 55 45 53 28  INTO t11 VALUES(
4c40: 31 32 2c 20 27 59 5a 27 2c 27 59 5a 27 29 3b 0a  12, 'YZ','YZ');.
4c50: 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74      SELECT count
4c60: 28 2a 29 20 46 52 4f 4d 20 74 31 31 3b 0a 20 20  (*) FROM t11;.  
4c70: 7d 0a 7d 20 7b 31 32 7d 0a 64 6f 5f 74 65 73 74  }.} {12}.do_test
4c80: 20 6c 69 6b 65 2d 31 31 2e 31 20 7b 0a 20 20 71   like-11.1 {.  q
4c90: 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 50  ueryplan {.    P
4ca0: 52 41 47 4d 41 20 63 61 73 65 5f 73 65 6e 73 69  RAGMA case_sensi
4cb0: 74 69 76 65 5f 6c 69 6b 65 3d 4f 46 46 3b 0a 20  tive_like=OFF;. 
4cc0: 20 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d     SELECT b FROM
4cd0: 20 74 31 31 20 57 48 45 52 45 20 62 20 4c 49 4b   t11 WHERE b LIK
4ce0: 45 20 27 61 62 63 25 27 20 4f 52 44 45 52 20 42  E 'abc%' ORDER B
4cf0: 59 20 61 3b 0a 20 20 7d 0a 7d 20 7b 61 62 63 20  Y a;.  }.} {abc 
4d00: 61 62 63 64 20 41 42 43 20 41 42 43 44 20 6e 6f  abcd ABC ABCD no
4d10: 73 6f 72 74 20 74 31 31 20 2a 7d 0a 64 6f 5f 74  sort t11 *}.do_t
4d20: 65 73 74 20 6c 69 6b 65 2d 31 31 2e 32 20 7b 0a  est like-11.2 {.
4d30: 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20    queryplan {.  
4d40: 20 20 50 52 41 47 4d 41 20 63 61 73 65 5f 73 65    PRAGMA case_se
4d50: 6e 73 69 74 69 76 65 5f 6c 69 6b 65 3d 4f 4e 3b  nsitive_like=ON;
4d60: 0a 20 20 20 20 53 45 4c 45 43 54 20 62 20 46 52  .    SELECT b FR
4d70: 4f 4d 20 74 31 31 20 57 48 45 52 45 20 62 20 4c  OM t11 WHERE b L
4d80: 49 4b 45 20 27 61 62 63 25 27 20 4f 52 44 45 52  IKE 'abc%' ORDER
4d90: 20 42 59 20 61 3b 0a 20 20 7d 0a 7d 20 7b 61 62   BY a;.  }.} {ab
4da0: 63 20 61 62 63 64 20 6e 6f 73 6f 72 74 20 74 31  c abcd nosort t1
4db0: 31 20 2a 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b  1 *}.do_test lik
4dc0: 65 2d 31 31 2e 33 20 7b 0a 20 20 71 75 65 72 79  e-11.3 {.  query
4dd0: 70 6c 61 6e 20 7b 0a 20 20 20 20 50 52 41 47 4d  plan {.    PRAGM
4de0: 41 20 63 61 73 65 5f 73 65 6e 73 69 74 69 76 65  A case_sensitive
4df0: 5f 6c 69 6b 65 3d 4f 46 46 3b 0a 20 20 20 20 43  _like=OFF;.    C
4e00: 52 45 41 54 45 20 49 4e 44 45 58 20 74 31 31 62  REATE INDEX t11b
4e10: 20 4f 4e 20 74 31 31 28 62 29 3b 0a 20 20 20 20   ON t11(b);.    
4e20: 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 31  SELECT b FROM t1
4e30: 31 20 57 48 45 52 45 20 62 20 4c 49 4b 45 20 27  1 WHERE b LIKE '
4e40: 61 62 63 25 27 20 4f 52 44 45 52 20 42 59 20 61  abc%' ORDER BY a
4e50: 3b 0a 20 20 7d 0a 7d 20 7b 61 62 63 20 61 62 63  ;.  }.} {abc abc
4e60: 64 20 41 42 43 20 41 42 43 44 20 73 6f 72 74 20  d ABC ABCD sort 
4e70: 7b 7d 20 74 31 31 62 7d 0a 64 6f 5f 74 65 73 74  {} t11b}.do_test
4e80: 20 6c 69 6b 65 2d 31 31 2e 34 20 7b 0a 20 20 71   like-11.4 {.  q
4e90: 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 50  ueryplan {.    P
4ea0: 52 41 47 4d 41 20 63 61 73 65 5f 73 65 6e 73 69  RAGMA case_sensi
4eb0: 74 69 76 65 5f 6c 69 6b 65 3d 4f 4e 3b 0a 20 20  tive_like=ON;.  
4ec0: 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20    SELECT b FROM 
4ed0: 74 31 31 20 57 48 45 52 45 20 62 20 4c 49 4b 45  t11 WHERE b LIKE
4ee0: 20 27 61 62 63 25 27 20 4f 52 44 45 52 20 42 59   'abc%' ORDER BY
4ef0: 20 61 3b 0a 20 20 7d 0a 7d 20 7b 61 62 63 20 61   a;.  }.} {abc a
4f00: 62 63 64 20 6e 6f 73 6f 72 74 20 74 31 31 20 2a  bcd nosort t11 *
4f10: 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 31  }.do_test like-1
4f20: 31 2e 35 20 7b 0a 20 20 71 75 65 72 79 70 6c 61  1.5 {.  querypla
4f30: 6e 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63  n {.    PRAGMA c
4f40: 61 73 65 5f 73 65 6e 73 69 74 69 76 65 5f 6c 69  ase_sensitive_li
4f50: 6b 65 3d 4f 46 46 3b 0a 20 20 20 20 44 52 4f 50  ke=OFF;.    DROP
4f60: 20 49 4e 44 45 58 20 74 31 31 62 3b 0a 20 20 20   INDEX t11b;.   
4f70: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 74 31   CREATE INDEX t1
4f80: 31 62 6e 63 20 4f 4e 20 74 31 31 28 62 20 43 4f  1bnc ON t11(b CO
4f90: 4c 4c 41 54 45 20 6e 6f 63 61 73 65 29 3b 0a 20  LLATE nocase);. 
4fa0: 20 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d     SELECT b FROM
4fb0: 20 74 31 31 20 57 48 45 52 45 20 62 20 4c 49 4b   t11 WHERE b LIK
4fc0: 45 20 27 61 62 63 25 27 20 4f 52 44 45 52 20 42  E 'abc%' ORDER B
4fd0: 59 20 61 3b 0a 20 20 7d 0a 7d 20 7b 61 62 63 20  Y a;.  }.} {abc 
4fe0: 61 62 63 64 20 41 42 43 20 41 42 43 44 20 73 6f  abcd ABC ABCD so
4ff0: 72 74 20 7b 7d 20 74 31 31 62 6e 63 7d 0a 64 6f  rt {} t11bnc}.do
5000: 5f 74 65 73 74 20 6c 69 6b 65 2d 31 31 2e 36 20  _test like-11.6 
5010: 7b 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a  {.  queryplan {.
5020: 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58      CREATE INDEX
5030: 20 74 31 31 62 62 20 4f 4e 20 74 31 31 28 62 20   t11bb ON t11(b 
5040: 43 4f 4c 4c 41 54 45 20 62 69 6e 61 72 79 29 3b  COLLATE binary);
5050: 0a 20 20 20 20 53 45 4c 45 43 54 20 62 20 46 52  .    SELECT b FR
5060: 4f 4d 20 74 31 31 20 57 48 45 52 45 20 62 20 4c  OM t11 WHERE b L
5070: 49 4b 45 20 27 61 62 63 25 27 20 4f 52 44 45 52  IKE 'abc%' ORDER
5080: 20 42 59 20 61 3b 0a 20 20 7d 0a 7d 20 7b 61 62   BY a;.  }.} {ab
5090: 63 20 61 62 63 64 20 41 42 43 20 41 42 43 44 20  c abcd ABC ABCD 
50a0: 73 6f 72 74 20 7b 7d 20 74 31 31 62 6e 63 7d 0a  sort {} t11bnc}.
50b0: 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 31 31 2e  do_test like-11.
50c0: 37 20 7b 0a 20 20 71 75 65 72 79 70 6c 61 6e 20  7 {.  queryplan 
50d0: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61 73  {.    PRAGMA cas
50e0: 65 5f 73 65 6e 73 69 74 69 76 65 5f 6c 69 6b 65  e_sensitive_like
50f0: 3d 4f 4e 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  =ON;.    SELECT 
5100: 62 20 46 52 4f 4d 20 74 31 31 20 57 48 45 52 45  b FROM t11 WHERE
5110: 20 62 20 4c 49 4b 45 20 27 61 62 63 25 27 20 4f   b LIKE 'abc%' O
5120: 52 44 45 52 20 42 59 20 61 3b 0a 20 20 7d 0a 7d  RDER BY a;.  }.}
5130: 20 7b 61 62 63 20 61 62 63 64 20 73 6f 72 74 20   {abc abcd sort 
5140: 7b 7d 20 74 31 31 62 62 7d 0a 64 6f 5f 74 65 73  {} t11bb}.do_tes
5150: 74 20 6c 69 6b 65 2d 31 31 2e 38 20 7b 0a 20 20  t like-11.8 {.  
5160: 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20  queryplan {.    
5170: 50 52 41 47 4d 41 20 63 61 73 65 5f 73 65 6e 73  PRAGMA case_sens
5180: 69 74 69 76 65 5f 6c 69 6b 65 3d 4f 46 46 3b 0a  itive_like=OFF;.
5190: 20 20 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f      SELECT b FRO
51a0: 4d 20 74 31 31 20 57 48 45 52 45 20 62 20 47 4c  M t11 WHERE b GL
51b0: 4f 42 20 27 61 62 63 2a 27 20 4f 52 44 45 52 20  OB 'abc*' ORDER 
51c0: 42 59 20 61 3b 0a 20 20 7d 0a 7d 20 7b 61 62 63  BY a;.  }.} {abc
51d0: 20 61 62 63 64 20 73 6f 72 74 20 7b 7d 20 74 31   abcd sort {} t1
51e0: 31 62 62 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b  1bb}.do_test lik
51f0: 65 2d 31 31 2e 39 20 7b 0a 20 20 71 75 65 72 79  e-11.9 {.  query
5200: 70 6c 61 6e 20 7b 0a 20 20 20 20 43 52 45 41 54  plan {.    CREAT
5210: 45 20 49 4e 44 45 58 20 74 31 31 63 6e 63 20 4f  E INDEX t11cnc O
5220: 4e 20 74 31 31 28 63 20 43 4f 4c 4c 41 54 45 20  N t11(c COLLATE 
5230: 6e 6f 63 61 73 65 29 3b 0a 20 20 20 20 43 52 45  nocase);.    CRE
5240: 41 54 45 20 49 4e 44 45 58 20 74 31 31 63 62 20  ATE INDEX t11cb 
5250: 4f 4e 20 74 31 31 28 63 20 43 4f 4c 4c 41 54 45  ON t11(c COLLATE
5260: 20 62 69 6e 61 72 79 29 3b 0a 20 20 20 20 53 45   binary);.    SE
5270: 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 31 31 20  LECT c FROM t11 
5280: 57 48 45 52 45 20 63 20 4c 49 4b 45 20 27 61 62  WHERE c LIKE 'ab
5290: 63 25 27 20 4f 52 44 45 52 20 42 59 20 61 3b 0a  c%' ORDER BY a;.
52a0: 20 20 7d 0a 7d 20 7b 61 62 63 20 61 62 63 64 20    }.} {abc abcd 
52b0: 41 42 43 20 41 42 43 44 20 73 6f 72 74 20 7b 7d  ABC ABCD sort {}
52c0: 20 74 31 31 63 6e 63 7d 0a 64 6f 5f 74 65 73 74   t11cnc}.do_test
52d0: 20 6c 69 6b 65 2d 31 31 2e 31 30 20 7b 0a 20 20   like-11.10 {.  
52e0: 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20  queryplan {.    
52f0: 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 31  SELECT c FROM t1
5300: 31 20 57 48 45 52 45 20 63 20 47 4c 4f 42 20 27  1 WHERE c GLOB '
5310: 61 62 63 2a 27 20 4f 52 44 45 52 20 42 59 20 61  abc*' ORDER BY a
5320: 3b 0a 20 20 7d 0a 7d 20 7b 61 62 63 20 61 62 63  ;.  }.} {abc abc
5330: 64 20 73 6f 72 74 20 7b 7d 20 74 31 31 63 62 7d  d sort {} t11cb}
5340: 0a 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a     ...finish_test.