/ Hex Artifact Content
Login

Artifact 22f7857f9d7da7ff5061ded8806c43a6271109fc:


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 32 20 32 30 30 39 2f 30 31 2f 30 39 20  1.12 2009/01/09 
0260: 32 31 3a 34 31 3a 31 37 20 64 72 68 20 45 78 70  21:41:17 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 74 65 73  ction regexp tes
09d0: 74 5f 72 65 67 65 78 70 0a 20 20 65 78 65 63 73  t_regexp.  execs
09e0: 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  ql {.    SELECT 
09f0: 78 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  x FROM t1 WHERE 
0a00: 78 20 52 45 47 45 58 50 20 27 61 62 63 27 20 4f  x REGEXP 'abc' O
0a10: 52 44 45 52 20 42 59 20 31 3b 0a 20 20 7d 0a 7d  RDER BY 1;.  }.}
0a20: 20 7b 7b 41 42 43 20 61 62 63 20 78 79 7a 7d 20   {{ABC abc xyz} 
0a30: 61 62 63 20 61 62 63 64 7d 0a 64 6f 5f 74 65 73  abc abcd}.do_tes
0a40: 74 20 6c 69 6b 65 2d 32 2e 32 20 7b 0a 20 20 65  t like-2.2 {.  e
0a50: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c  xecsql {.    SEL
0a60: 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20 57 48  ECT x FROM t1 WH
0a70: 45 52 45 20 78 20 52 45 47 45 58 50 20 27 5e 61  ERE x REGEXP '^a
0a80: 62 63 27 20 4f 52 44 45 52 20 42 59 20 31 3b 0a  bc' ORDER BY 1;.
0a90: 20 20 7d 0a 7d 20 7b 61 62 63 20 61 62 63 64 7d    }.} {abc abcd}
0aa0: 0a 0a 23 20 54 65 73 74 73 20 6f 66 20 74 68 65  ..# Tests of the
0ab0: 20 4d 41 54 43 48 20 6f 70 65 72 61 74 6f 72 0a   MATCH operator.
0ac0: 23 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 32  #.do_test like-2
0ad0: 2e 33 20 7b 0a 20 20 70 72 6f 63 20 74 65 73 74  .3 {.  proc test
0ae0: 5f 6d 61 74 63 68 20 7b 61 20 62 7d 20 7b 0a 20  _match {a b} {. 
0af0: 20 20 20 72 65 74 75 72 6e 20 5b 73 74 72 69 6e     return [strin
0b00: 67 20 6d 61 74 63 68 20 24 61 20 24 62 5d 0a 20  g match $a $b]. 
0b10: 20 7d 0a 20 20 64 62 20 66 75 6e 63 74 69 6f 6e   }.  db function
0b20: 20 6d 61 74 63 68 20 2d 61 72 67 63 6f 75 6e 74   match -argcount
0b30: 20 32 20 74 65 73 74 5f 6d 61 74 63 68 0a 20 20   2 test_match.  
0b40: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45  execsql {.    SE
0b50: 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20 57  LECT x FROM t1 W
0b60: 48 45 52 45 20 78 20 4d 41 54 43 48 20 27 2a 61  HERE x MATCH '*a
0b70: 62 63 2a 27 20 4f 52 44 45 52 20 42 59 20 31 3b  bc*' ORDER BY 1;
0b80: 0a 20 20 7d 0a 7d 20 7b 7b 41 42 43 20 61 62 63  .  }.} {{ABC abc
0b90: 20 78 79 7a 7d 20 61 62 63 20 61 62 63 64 7d 0a   xyz} abc abcd}.
0ba0: 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 32 2e 34  do_test like-2.4
0bb0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
0bc0: 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d     SELECT x FROM
0bd0: 20 74 31 20 57 48 45 52 45 20 78 20 4d 41 54 43   t1 WHERE x MATC
0be0: 48 20 27 61 62 63 2a 27 20 4f 52 44 45 52 20 42  H 'abc*' ORDER B
0bf0: 59 20 31 3b 0a 20 20 7d 0a 7d 20 7b 61 62 63 20  Y 1;.  }.} {abc 
0c00: 61 62 63 64 7d 0a 0a 23 20 46 6f 72 20 74 68 65  abcd}..# For the
0c10: 20 72 65 6d 61 69 6e 69 6e 67 20 74 65 73 74 73   remaining tests
0c20: 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 68 61 76  , we need to hav
0c30: 65 20 74 68 65 20 6c 69 6b 65 20 6f 70 74 69 6d  e the like optim
0c40: 69 7a 61 74 69 6f 6e 73 0a 23 20 65 6e 61 62 6c  izations.# enabl
0c50: 65 64 2e 0a 23 0a 69 66 63 61 70 61 62 6c 65 20  ed..#.ifcapable 
0c60: 21 6c 69 6b 65 5f 6f 70 74 20 7b 0a 20 20 66 69  !like_opt {.  fi
0c70: 6e 69 73 68 5f 74 65 73 74 0a 20 20 72 65 74 75  nish_test.  retu
0c80: 72 6e 0a 7d 20 0a 0a 23 20 54 68 69 73 20 70 72  rn.} ..# This pr
0c90: 6f 63 65 64 75 72 65 20 65 78 65 63 75 74 65 73  ocedure executes
0ca0: 20 74 68 65 20 53 51 4c 2e 20 20 54 68 65 6e 20   the SQL.  Then 
0cb0: 69 74 20 61 70 70 65 6e 64 73 20 74 6f 20 74 68  it appends to th
0cc0: 65 20 72 65 73 75 6c 74 20 74 68 65 0a 23 20 22  e result the.# "
0cd0: 73 6f 72 74 22 20 6f 72 20 22 6e 6f 73 6f 72 74  sort" or "nosort
0ce0: 22 20 6b 65 79 77 6f 72 64 20 28 61 73 20 69 6e  " keyword (as in
0cf0: 20 74 68 65 20 63 6b 73 6f 72 74 20 70 72 6f 63   the cksort proc
0d00: 65 64 75 72 65 20 61 62 6f 76 65 29 20 74 68 65  edure above) the
0d10: 6e 0a 23 20 69 74 20 61 70 70 65 6e 64 73 20 74  n.# it appends t
0d20: 68 65 20 3a 3a 73 71 6c 69 74 65 5f 71 75 65 72  he ::sqlite_quer
0d30: 79 5f 70 6c 61 6e 20 76 61 72 69 61 62 6c 65 2e  y_plan variable.
0d40: 0a 23 0a 70 72 6f 63 20 71 75 65 72 79 70 6c 61  .#.proc querypla
0d50: 6e 20 7b 73 71 6c 7d 20 7b 0a 20 20 73 65 74 20  n {sql} {.  set 
0d60: 3a 3a 73 71 6c 69 74 65 5f 73 6f 72 74 5f 63 6f  ::sqlite_sort_co
0d70: 75 6e 74 20 30 0a 20 20 73 65 74 20 64 61 74 61  unt 0.  set data
0d80: 20 5b 65 78 65 63 73 71 6c 20 24 73 71 6c 5d 0a   [execsql $sql].
0d90: 20 20 69 66 20 7b 24 3a 3a 73 71 6c 69 74 65 5f    if {$::sqlite_
0da0: 73 6f 72 74 5f 63 6f 75 6e 74 7d 20 7b 73 65 74  sort_count} {set
0db0: 20 78 20 73 6f 72 74 7d 20 7b 73 65 74 20 78 20   x sort} {set x 
0dc0: 6e 6f 73 6f 72 74 7d 0a 20 20 6c 61 70 70 65 6e  nosort}.  lappen
0dd0: 64 20 64 61 74 61 20 24 78 0a 20 20 72 65 74 75  d data $x.  retu
0de0: 72 6e 20 5b 63 6f 6e 63 61 74 20 24 64 61 74 61  rn [concat $data
0df0: 20 24 3a 3a 73 71 6c 69 74 65 5f 71 75 65 72 79   $::sqlite_query
0e00: 5f 70 6c 61 6e 5d 0a 7d 0a 0a 23 20 50 65 72 66  _plan].}..# Perf
0e10: 6f 72 6d 20 74 65 73 74 73 20 6f 6e 20 74 68 65  orm tests on the
0e20: 20 6c 69 6b 65 20 6f 70 74 69 6d 69 7a 61 74 69   like optimizati
0e30: 6f 6e 2e 0a 23 0a 23 20 57 69 74 68 20 6e 6f 20  on..#.# With no 
0e40: 69 6e 64 65 78 20 6f 6e 20 74 31 2e 78 20 61 6e  index on t1.x an
0e50: 64 20 77 69 74 68 20 63 61 73 65 20 73 65 6e 73  d with case sens
0e60: 69 74 69 76 69 74 79 20 74 75 72 6e 65 64 20 6f  itivity turned o
0e70: 66 66 2c 20 6e 6f 20 6f 70 74 69 6d 69 7a 61 74  ff, no optimizat
0e80: 69 6f 6e 0a 23 20 69 73 20 70 65 72 66 6f 72 6d  ion.# is perform
0e90: 65 64 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 6c 69  ed..#.do_test li
0ea0: 6b 65 2d 33 2e 31 20 7b 0a 20 20 73 65 74 20 73  ke-3.1 {.  set s
0eb0: 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74  qlite_like_count
0ec0: 20 30 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b   0.  queryplan {
0ed0: 0a 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52  .    SELECT x FR
0ee0: 4f 4d 20 74 31 20 57 48 45 52 45 20 78 20 4c 49  OM t1 WHERE x LI
0ef0: 4b 45 20 27 61 62 63 25 27 20 4f 52 44 45 52 20  KE 'abc%' ORDER 
0f00: 42 59 20 31 3b 0a 20 20 7d 0a 7d 20 7b 41 42 43  BY 1;.  }.} {ABC
0f10: 20 7b 41 42 43 20 61 62 63 20 78 79 7a 7d 20 61   {ABC abc xyz} a
0f20: 62 63 20 61 62 63 64 20 73 6f 72 74 20 74 31 20  bc abcd sort t1 
0f30: 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65  {}}.do_test like
0f40: 2d 33 2e 32 20 7b 0a 20 20 73 65 74 20 73 71 6c  -3.2 {.  set sql
0f50: 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 0a 7d  ite_like_count.}
0f60: 20 7b 31 32 7d 0a 0a 23 20 57 69 74 68 20 61 6e   {12}..# With an
0f70: 20 69 6e 64 65 78 20 6f 6e 20 74 31 2e 78 20 61   index on t1.x a
0f80: 6e 64 20 63 61 73 65 20 73 65 6e 73 69 74 69 76  nd case sensitiv
0f90: 69 74 79 20 6f 6e 2c 20 6f 70 74 69 6d 69 7a 65  ity on, optimize
0fa0: 20 63 6f 6d 70 6c 65 74 65 6c 79 2e 0a 23 0a 64   completely..#.d
0fb0: 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 33 2e 33 20  o_test like-3.3 
0fc0: 7b 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f 6c  {.  set sqlite_l
0fd0: 69 6b 65 5f 63 6f 75 6e 74 20 30 0a 20 20 65 78  ike_count 0.  ex
0fe0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
0ff0: 4d 41 20 63 61 73 65 5f 73 65 6e 73 69 74 69 76  MA case_sensitiv
1000: 65 5f 6c 69 6b 65 3d 6f 6e 3b 0a 20 20 20 20 43  e_like=on;.    C
1010: 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f  REATE INDEX i1 O
1020: 4e 20 74 31 28 78 29 3b 0a 20 20 7d 0a 20 20 71  N t1(x);.  }.  q
1030: 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53  ueryplan {.    S
1040: 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20  ELECT x FROM t1 
1050: 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27 61 62  WHERE x LIKE 'ab
1060: 63 25 27 20 4f 52 44 45 52 20 42 59 20 31 3b 0a  c%' ORDER BY 1;.
1070: 20 20 7d 0a 7d 20 7b 61 62 63 20 61 62 63 64 20    }.} {abc abcd 
1080: 6e 6f 73 6f 72 74 20 7b 7d 20 69 31 7d 0a 64 6f  nosort {} i1}.do
1090: 5f 74 65 73 74 20 6c 69 6b 65 2d 33 2e 34 20 7b  _test like-3.4 {
10a0: 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f 6c 69  .  set sqlite_li
10b0: 6b 65 5f 63 6f 75 6e 74 0a 7d 20 30 0a 0a 23 20  ke_count.} 0..# 
10c0: 50 61 72 74 69 61 6c 20 6f 70 74 69 6d 69 7a 61  Partial optimiza
10d0: 74 69 6f 6e 20 77 68 65 6e 20 74 68 65 20 70 61  tion when the pa
10e0: 74 74 65 72 6e 20 64 6f 65 73 20 6e 6f 74 20 65  ttern does not e
10f0: 6e 64 20 69 6e 20 27 25 27 0a 23 0a 64 6f 5f 74  nd in '%'.#.do_t
1100: 65 73 74 20 6c 69 6b 65 2d 33 2e 35 20 7b 0a 20  est like-3.5 {. 
1110: 20 73 65 74 20 73 71 6c 69 74 65 5f 6c 69 6b 65   set sqlite_like
1120: 5f 63 6f 75 6e 74 20 30 0a 20 20 71 75 65 72 79  _count 0.  query
1130: 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43  plan {.    SELEC
1140: 54 20 78 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T x FROM t1 WHER
1150: 45 20 78 20 4c 49 4b 45 20 27 61 5f 63 27 20 4f  E x LIKE 'a_c' O
1160: 52 44 45 52 20 42 59 20 31 3b 0a 20 20 7d 0a 7d  RDER BY 1;.  }.}
1170: 20 7b 61 62 63 20 6e 6f 73 6f 72 74 20 7b 7d 20   {abc nosort {} 
1180: 69 31 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65  i1}.do_test like
1190: 2d 33 2e 36 20 7b 0a 20 20 73 65 74 20 73 71 6c  -3.6 {.  set sql
11a0: 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 0a 7d  ite_like_count.}
11b0: 20 36 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d   6.do_test like-
11c0: 33 2e 37 20 7b 0a 20 20 73 65 74 20 73 71 6c 69  3.7 {.  set sqli
11d0: 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 20 30 0a  te_like_count 0.
11e0: 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20    queryplan {.  
11f0: 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20    SELECT x FROM 
1200: 74 31 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20  t1 WHERE x LIKE 
1210: 27 61 62 25 64 27 20 4f 52 44 45 52 20 42 59 20  'ab%d' ORDER BY 
1220: 31 3b 0a 20 20 7d 0a 7d 20 7b 61 62 63 64 20 61  1;.  }.} {abcd a
1230: 62 64 20 6e 6f 73 6f 72 74 20 7b 7d 20 69 31 7d  bd nosort {} i1}
1240: 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 33 2e  .do_test like-3.
1250: 38 20 7b 0a 20 20 73 65 74 20 73 71 6c 69 74 65  8 {.  set sqlite
1260: 5f 6c 69 6b 65 5f 63 6f 75 6e 74 0a 7d 20 34 0a  _like_count.} 4.
1270: 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 33 2e 39  do_test like-3.9
1280: 20 7b 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f   {.  set sqlite_
1290: 6c 69 6b 65 5f 63 6f 75 6e 74 20 30 0a 20 20 71  like_count 0.  q
12a0: 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53  ueryplan {.    S
12b0: 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20  ELECT x FROM t1 
12c0: 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27 61 5f  WHERE x LIKE 'a_
12d0: 63 25 27 20 4f 52 44 45 52 20 42 59 20 31 3b 0a  c%' ORDER BY 1;.
12e0: 20 20 7d 0a 7d 20 7b 61 62 63 20 61 62 63 64 20    }.} {abc abcd 
12f0: 6e 6f 73 6f 72 74 20 7b 7d 20 69 31 7d 0a 64 6f  nosort {} i1}.do
1300: 5f 74 65 73 74 20 6c 69 6b 65 2d 33 2e 31 30 20  _test like-3.10 
1310: 7b 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f 6c  {.  set sqlite_l
1320: 69 6b 65 5f 63 6f 75 6e 74 0a 7d 20 36 0a 0a 23  ike_count.} 6..#
1330: 20 4e 6f 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   No optimization
1340: 20 77 68 65 6e 20 74 68 65 20 70 61 74 74 65 72   when the patter
1350: 6e 20 62 65 67 69 6e 73 20 77 69 74 68 20 61 20  n begins with a 
1360: 77 69 6c 64 63 61 72 64 2e 0a 23 20 4e 6f 74 65  wildcard..# Note
1370: 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20   that the index 
1380: 69 73 20 73 74 69 6c 6c 20 75 73 65 64 20 62 75  is still used bu
1390: 74 20 6f 6e 6c 79 20 66 6f 72 20 73 6f 72 74 69  t only for sorti
13a0: 6e 67 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 6c 69  ng..#.do_test li
13b0: 6b 65 2d 33 2e 31 31 20 7b 0a 20 20 73 65 74 20  ke-3.11 {.  set 
13c0: 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e  sqlite_like_coun
13d0: 74 20 30 0a 20 20 71 75 65 72 79 70 6c 61 6e 20  t 0.  queryplan 
13e0: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 78 20 46  {.    SELECT x F
13f0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 78 20 4c  ROM t1 WHERE x L
1400: 49 4b 45 20 27 25 62 63 64 27 20 4f 52 44 45 52  IKE '%bcd' ORDER
1410: 20 42 59 20 31 3b 0a 20 20 7d 0a 7d 20 7b 61 62   BY 1;.  }.} {ab
1420: 63 64 20 62 63 64 20 6e 6f 73 6f 72 74 20 7b 7d  cd bcd nosort {}
1430: 20 69 31 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b   i1}.do_test lik
1440: 65 2d 33 2e 31 32 20 7b 0a 20 20 73 65 74 20 73  e-3.12 {.  set s
1450: 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74  qlite_like_count
1460: 0a 7d 20 31 32 0a 0a 23 20 4e 6f 20 6f 70 74 69  .} 12..# No opti
1470: 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 63 61 73  mization for cas
1480: 65 20 69 6e 73 65 6e 73 69 74 69 76 65 20 4c 49  e insensitive LI
1490: 4b 45 0a 23 0a 64 6f 5f 74 65 73 74 20 6c 69 6b  KE.#.do_test lik
14a0: 65 2d 33 2e 31 33 20 7b 0a 20 20 73 65 74 20 73  e-3.13 {.  set s
14b0: 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74  qlite_like_count
14c0: 20 30 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b   0.  queryplan {
14d0: 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61 73 65  .    PRAGMA case
14e0: 5f 73 65 6e 73 69 74 69 76 65 5f 6c 69 6b 65 3d  _sensitive_like=
14f0: 6f 66 66 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  off;.    SELECT 
1500: 78 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  x FROM t1 WHERE 
1510: 78 20 4c 49 4b 45 20 27 61 62 63 25 27 20 4f 52  x LIKE 'abc%' OR
1520: 44 45 52 20 42 59 20 31 3b 0a 20 20 7d 0a 7d 20  DER BY 1;.  }.} 
1530: 7b 41 42 43 20 7b 41 42 43 20 61 62 63 20 78 79  {ABC {ABC abc xy
1540: 7a 7d 20 61 62 63 20 61 62 63 64 20 6e 6f 73 6f  z} abc abcd noso
1550: 72 74 20 7b 7d 20 69 31 7d 0a 64 6f 5f 74 65 73  rt {} i1}.do_tes
1560: 74 20 6c 69 6b 65 2d 33 2e 31 34 20 7b 0a 20 20  t like-3.14 {.  
1570: 73 65 74 20 73 71 6c 69 74 65 5f 6c 69 6b 65 5f  set sqlite_like_
1580: 63 6f 75 6e 74 0a 7d 20 31 32 0a 0a 23 20 4e 6f  count.} 12..# No
1590: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77 69   optimization wi
15a0: 74 68 6f 75 74 20 61 6e 20 69 6e 64 65 78 2e 0a  thout an index..
15b0: 23 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 33  #.do_test like-3
15c0: 2e 31 35 20 7b 0a 20 20 73 65 74 20 73 71 6c 69  .15 {.  set sqli
15d0: 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 20 30 0a  te_like_count 0.
15e0: 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20    queryplan {.  
15f0: 20 20 50 52 41 47 4d 41 20 63 61 73 65 5f 73 65    PRAGMA case_se
1600: 6e 73 69 74 69 76 65 5f 6c 69 6b 65 3d 6f 6e 3b  nsitive_like=on;
1610: 0a 20 20 20 20 44 52 4f 50 20 49 4e 44 45 58 20  .    DROP INDEX 
1620: 69 31 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 78  i1;.    SELECT x
1630: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 78   FROM t1 WHERE x
1640: 20 4c 49 4b 45 20 27 61 62 63 25 27 20 4f 52 44   LIKE 'abc%' ORD
1650: 45 52 20 42 59 20 31 3b 0a 20 20 7d 0a 7d 20 7b  ER BY 1;.  }.} {
1660: 61 62 63 20 61 62 63 64 20 73 6f 72 74 20 74 31  abc abcd sort t1
1670: 20 7b 7d 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b   {}}.do_test lik
1680: 65 2d 33 2e 31 36 20 7b 0a 20 20 73 65 74 20 73  e-3.16 {.  set s
1690: 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74  qlite_like_count
16a0: 0a 7d 20 31 32 0a 0a 23 20 4e 6f 20 47 4c 4f 42  .} 12..# No GLOB
16b0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77 69   optimization wi
16c0: 74 68 6f 75 74 20 61 6e 20 69 6e 64 65 78 2e 0a  thout an index..
16d0: 23 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 33  #.do_test like-3
16e0: 2e 31 37 20 7b 0a 20 20 73 65 74 20 73 71 6c 69  .17 {.  set sqli
16f0: 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 20 30 0a  te_like_count 0.
1700: 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20    queryplan {.  
1710: 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20    SELECT x FROM 
1720: 74 31 20 57 48 45 52 45 20 78 20 47 4c 4f 42 20  t1 WHERE x GLOB 
1730: 27 61 62 63 2a 27 20 4f 52 44 45 52 20 42 59 20  'abc*' ORDER BY 
1740: 31 3b 0a 20 20 7d 0a 7d 20 7b 61 62 63 20 61 62  1;.  }.} {abc ab
1750: 63 64 20 73 6f 72 74 20 74 31 20 7b 7d 7d 0a 64  cd sort t1 {}}.d
1760: 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 33 2e 31 38  o_test like-3.18
1770: 20 7b 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f   {.  set sqlite_
1780: 6c 69 6b 65 5f 63 6f 75 6e 74 0a 7d 20 31 32 0a  like_count.} 12.
1790: 0a 23 20 47 4c 4f 42 20 69 73 20 6f 70 74 69 6d  .# GLOB is optim
17a0: 69 7a 65 64 20 72 65 67 61 72 64 6c 65 73 73 20  ized regardless 
17b0: 6f 66 20 74 68 65 20 63 61 73 65 5f 73 65 6e 73  of the case_sens
17c0: 69 74 69 76 65 5f 6c 69 6b 65 20 73 65 74 74 69  itive_like setti
17d0: 6e 67 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 6c 69  ng..#.do_test li
17e0: 6b 65 2d 33 2e 31 39 20 7b 0a 20 20 73 65 74 20  ke-3.19 {.  set 
17f0: 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e  sqlite_like_coun
1800: 74 20 30 0a 20 20 71 75 65 72 79 70 6c 61 6e 20  t 0.  queryplan 
1810: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e 44  {.    CREATE IND
1820: 45 58 20 69 31 20 4f 4e 20 74 31 28 78 29 3b 0a  EX i1 ON t1(x);.
1830: 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f      SELECT x FRO
1840: 4d 20 74 31 20 57 48 45 52 45 20 78 20 47 4c 4f  M t1 WHERE x GLO
1850: 42 20 27 61 62 63 2a 27 20 4f 52 44 45 52 20 42  B 'abc*' ORDER B
1860: 59 20 31 3b 0a 20 20 7d 0a 7d 20 7b 61 62 63 20  Y 1;.  }.} {abc 
1870: 61 62 63 64 20 6e 6f 73 6f 72 74 20 7b 7d 20 69  abcd nosort {} i
1880: 31 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d  1}.do_test like-
1890: 33 2e 32 30 20 7b 0a 20 20 73 65 74 20 73 71 6c  3.20 {.  set sql
18a0: 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 0a 7d  ite_like_count.}
18b0: 20 30 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d   0.do_test like-
18c0: 33 2e 32 31 20 7b 0a 20 20 73 65 74 20 73 71 6c  3.21 {.  set sql
18d0: 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 20 30  ite_like_count 0
18e0: 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20  .  queryplan {. 
18f0: 20 20 20 50 52 41 47 4d 41 20 63 61 73 65 5f 73     PRAGMA case_s
1900: 65 6e 73 69 74 69 76 65 5f 6c 69 6b 65 3d 6f 6e  ensitive_like=on
1910: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 78 20 46  ;.    SELECT x F
1920: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 78 20 47  ROM t1 WHERE x G
1930: 4c 4f 42 20 27 61 62 63 2a 27 20 4f 52 44 45 52  LOB 'abc*' ORDER
1940: 20 42 59 20 31 3b 0a 20 20 7d 0a 7d 20 7b 61 62   BY 1;.  }.} {ab
1950: 63 20 61 62 63 64 20 6e 6f 73 6f 72 74 20 7b 7d  c abcd nosort {}
1960: 20 69 31 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b   i1}.do_test lik
1970: 65 2d 33 2e 32 32 20 7b 0a 20 20 73 65 74 20 73  e-3.22 {.  set s
1980: 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74  qlite_like_count
1990: 0a 7d 20 30 0a 64 6f 5f 74 65 73 74 20 6c 69 6b  .} 0.do_test lik
19a0: 65 2d 33 2e 32 33 20 7b 0a 20 20 73 65 74 20 73  e-3.23 {.  set s
19b0: 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74  qlite_like_count
19c0: 20 30 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b   0.  queryplan {
19d0: 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61 73 65  .    PRAGMA case
19e0: 5f 73 65 6e 73 69 74 69 76 65 5f 6c 69 6b 65 3d  _sensitive_like=
19f0: 6f 66 66 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  off;.    SELECT 
1a00: 78 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  x FROM t1 WHERE 
1a10: 78 20 47 4c 4f 42 20 27 61 5b 62 63 5d 64 27 20  x GLOB 'a[bc]d' 
1a20: 4f 52 44 45 52 20 42 59 20 31 3b 0a 20 20 7d 0a  ORDER BY 1;.  }.
1a30: 7d 20 7b 61 62 64 20 61 63 64 20 6e 6f 73 6f 72  } {abd acd nosor
1a40: 74 20 7b 7d 20 69 31 7d 0a 64 6f 5f 74 65 73 74  t {} i1}.do_test
1a50: 20 6c 69 6b 65 2d 33 2e 32 34 20 7b 0a 20 20 73   like-3.24 {.  s
1a60: 65 74 20 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63  et sqlite_like_c
1a70: 6f 75 6e 74 0a 7d 20 36 0a 0a 23 20 4e 6f 20 6f  ount.} 6..# No o
1a80: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20 74  ptimization if t
1a90: 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 4c 49  he LHS of the LI
1aa0: 4b 45 20 69 73 20 6e 6f 74 20 61 20 63 6f 6c 75  KE is not a colu
1ab0: 6d 6e 20 6e 61 6d 65 20 6f 72 0a 23 20 69 66 20  mn name or.# if 
1ac0: 74 68 65 20 52 48 53 20 69 73 20 6e 6f 74 20 61  the RHS is not a
1ad0: 20 73 74 72 69 6e 67 2e 0a 23 0a 64 6f 5f 74 65   string..#.do_te
1ae0: 73 74 20 6c 69 6b 65 2d 34 2e 31 20 7b 0a 20 20  st like-4.1 {.  
1af0: 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20  execsql {PRAGMA 
1b00: 63 61 73 65 5f 73 65 6e 73 69 74 69 76 65 5f 6c  case_sensitive_l
1b10: 69 6b 65 3d 6f 6e 7d 0a 20 20 73 65 74 20 73 71  ike=on}.  set sq
1b20: 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 20  lite_like_count 
1b30: 30 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a  0.  queryplan {.
1b40: 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f      SELECT x FRO
1b50: 4d 20 74 31 20 57 48 45 52 45 20 78 20 4c 49 4b  M t1 WHERE x LIK
1b60: 45 20 27 61 62 63 25 27 20 4f 52 44 45 52 20 42  E 'abc%' ORDER B
1b70: 59 20 31 0a 20 20 7d 0a 7d 20 7b 61 62 63 20 61  Y 1.  }.} {abc a
1b80: 62 63 64 20 6e 6f 73 6f 72 74 20 7b 7d 20 69 31  bcd nosort {} i1
1b90: 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 34  }.do_test like-4
1ba0: 2e 32 20 7b 0a 20 20 73 65 74 20 73 71 6c 69 74  .2 {.  set sqlit
1bb0: 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 0a 7d 20 30  e_like_count.} 0
1bc0: 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 34 2e  .do_test like-4.
1bd0: 33 20 7b 0a 20 20 73 65 74 20 73 71 6c 69 74 65  3 {.  set sqlite
1be0: 5f 6c 69 6b 65 5f 63 6f 75 6e 74 20 30 0a 20 20  _like_count 0.  
1bf0: 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20  queryplan {.    
1c00: 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31  SELECT x FROM t1
1c10: 20 57 48 45 52 45 20 2b 78 20 4c 49 4b 45 20 27   WHERE +x LIKE '
1c20: 61 62 63 25 27 20 4f 52 44 45 52 20 42 59 20 31  abc%' ORDER BY 1
1c30: 0a 20 20 7d 0a 7d 20 7b 61 62 63 20 61 62 63 64  .  }.} {abc abcd
1c40: 20 6e 6f 73 6f 72 74 20 7b 7d 20 69 31 7d 0a 64   nosort {} i1}.d
1c50: 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 34 2e 34 20  o_test like-4.4 
1c60: 7b 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f 6c  {.  set sqlite_l
1c70: 69 6b 65 5f 63 6f 75 6e 74 0a 7d 20 31 32 0a 64  ike_count.} 12.d
1c80: 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 34 2e 35 20  o_test like-4.5 
1c90: 7b 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f 6c  {.  set sqlite_l
1ca0: 69 6b 65 5f 63 6f 75 6e 74 20 30 0a 20 20 71 75  ike_count 0.  qu
1cb0: 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45  eryplan {.    SE
1cc0: 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31 20 57  LECT x FROM t1 W
1cd0: 48 45 52 45 20 78 20 4c 49 4b 45 20 28 27 61 62  HERE x LIKE ('ab
1ce0: 27 20 7c 7c 20 27 63 25 27 29 20 4f 52 44 45 52  ' || 'c%') ORDER
1cf0: 20 42 59 20 31 0a 20 20 7d 0a 7d 20 7b 61 62 63   BY 1.  }.} {abc
1d00: 20 61 62 63 64 20 6e 6f 73 6f 72 74 20 7b 7d 20   abcd nosort {} 
1d10: 69 31 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65  i1}.do_test like
1d20: 2d 34 2e 36 20 7b 0a 20 20 73 65 74 20 73 71 6c  -4.6 {.  set sql
1d30: 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 0a 7d  ite_like_count.}
1d40: 20 31 32 0a 0a 23 20 43 6f 6c 6c 61 74 69 6e 67   12..# Collating
1d50: 20 73 65 71 75 65 6e 63 65 73 20 6f 6e 20 74 68   sequences on th
1d60: 65 20 69 6e 64 65 78 20 64 69 73 61 62 6c 65 20  e index disable 
1d70: 74 68 65 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a  the LIKE optimiz
1d80: 61 74 69 6f 6e 2e 0a 23 20 4f 72 20 69 66 20 74  ation..# Or if t
1d90: 68 65 20 4e 4f 43 41 53 45 20 63 6f 6c 6c 61 74  he NOCASE collat
1da0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20  ing sequence is 
1db0: 75 73 65 64 2c 20 74 68 65 20 4c 49 4b 45 20 6f  used, the LIKE o
1dc0: 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 23 20 69 73  ptimization.# is
1dd0: 20 65 6e 61 62 6c 65 64 20 77 68 65 6e 20 63 61   enabled when ca
1de0: 73 65 5f 73 65 6e 73 69 74 69 76 65 5f 6c 69 6b  se_sensitive_lik
1df0: 65 20 69 73 20 4f 46 46 2e 0a 23 0a 64 6f 5f 74  e is OFF..#.do_t
1e00: 65 73 74 20 6c 69 6b 65 2d 35 2e 31 20 7b 0a 20  est like-5.1 {. 
1e10: 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41   execsql {PRAGMA
1e20: 20 63 61 73 65 5f 73 65 6e 73 69 74 69 76 65 5f   case_sensitive_
1e30: 6c 69 6b 65 3d 6f 66 66 7d 0a 20 20 73 65 74 20  like=off}.  set 
1e40: 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e  sqlite_like_coun
1e50: 74 20 30 0a 20 20 71 75 65 72 79 70 6c 61 6e 20  t 0.  queryplan 
1e60: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 78 20 46  {.    SELECT x F
1e70: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 78 20 4c  ROM t1 WHERE x L
1e80: 49 4b 45 20 27 61 62 63 25 27 20 4f 52 44 45 52  IKE 'abc%' ORDER
1e90: 20 42 59 20 31 0a 20 20 7d 0a 7d 20 7b 41 42 43   BY 1.  }.} {ABC
1ea0: 20 7b 41 42 43 20 61 62 63 20 78 79 7a 7d 20 61   {ABC abc xyz} a
1eb0: 62 63 20 61 62 63 64 20 6e 6f 73 6f 72 74 20 7b  bc abcd nosort {
1ec0: 7d 20 69 31 7d 0a 64 6f 5f 74 65 73 74 20 6c 69  } i1}.do_test li
1ed0: 6b 65 2d 35 2e 32 20 7b 0a 20 20 73 65 74 20 73  ke-5.2 {.  set s
1ee0: 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74  qlite_like_count
1ef0: 0a 7d 20 31 32 0a 64 6f 5f 74 65 73 74 20 6c 69  .} 12.do_test li
1f00: 6b 65 2d 35 2e 33 20 7b 0a 20 20 65 78 65 63 73  ke-5.3 {.  execs
1f10: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
1f20: 54 41 42 4c 45 20 74 32 28 78 20 43 4f 4c 4c 41  TABLE t2(x COLLA
1f30: 54 45 20 4e 4f 43 41 53 45 29 3b 0a 20 20 20 20  TE NOCASE);.    
1f40: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53  INSERT INTO t2 S
1f50: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
1f60: 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  .    CREATE INDE
1f70: 58 20 69 32 20 4f 4e 20 74 32 28 78 20 43 4f 4c  X i2 ON t2(x COL
1f80: 4c 41 54 45 20 4e 4f 43 41 53 45 29 3b 0a 20 20  LATE NOCASE);.  
1f90: 7d 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f 6c  }.  set sqlite_l
1fa0: 69 6b 65 5f 63 6f 75 6e 74 20 30 0a 20 20 71 75  ike_count 0.  qu
1fb0: 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45  eryplan {.    SE
1fc0: 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 32 20 57  LECT x FROM t2 W
1fd0: 48 45 52 45 20 78 20 4c 49 4b 45 20 27 61 62 63  HERE x LIKE 'abc
1fe0: 25 27 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20  %' ORDER BY 1.  
1ff0: 7d 0a 7d 20 7b 61 62 63 20 41 42 43 20 7b 41 42  }.} {abc ABC {AB
2000: 43 20 61 62 63 20 78 79 7a 7d 20 61 62 63 64 20  C abc xyz} abcd 
2010: 6e 6f 73 6f 72 74 20 7b 7d 20 69 32 7d 0a 64 6f  nosort {} i2}.do
2020: 5f 74 65 73 74 20 6c 69 6b 65 2d 35 2e 34 20 7b  _test like-5.4 {
2030: 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f 6c 69  .  set sqlite_li
2040: 6b 65 5f 63 6f 75 6e 74 0a 7d 20 30 0a 64 6f 5f  ke_count.} 0.do_
2050: 74 65 73 74 20 6c 69 6b 65 2d 35 2e 35 20 7b 0a  test like-5.5 {.
2060: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
2070: 50 52 41 47 4d 41 20 63 61 73 65 5f 73 65 6e 73  PRAGMA case_sens
2080: 69 74 69 76 65 5f 6c 69 6b 65 3d 6f 6e 3b 0a 20  itive_like=on;. 
2090: 20 7d 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f   }.  set sqlite_
20a0: 6c 69 6b 65 5f 63 6f 75 6e 74 20 30 0a 20 20 71  like_count 0.  q
20b0: 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53  ueryplan {.    S
20c0: 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 32 20  ELECT x FROM t2 
20d0: 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27 61 62  WHERE x LIKE 'ab
20e0: 63 25 27 20 4f 52 44 45 52 20 42 59 20 31 0a 20  c%' ORDER BY 1. 
20f0: 20 7d 0a 7d 20 7b 61 62 63 20 61 62 63 64 20 6e   }.} {abc abcd n
2100: 6f 73 6f 72 74 20 7b 7d 20 69 32 7d 0a 64 6f 5f  osort {} i2}.do_
2110: 74 65 73 74 20 6c 69 6b 65 2d 35 2e 36 20 7b 0a  test like-5.6 {.
2120: 20 20 73 65 74 20 73 71 6c 69 74 65 5f 6c 69 6b    set sqlite_lik
2130: 65 5f 63 6f 75 6e 74 0a 7d 20 31 32 0a 64 6f 5f  e_count.} 12.do_
2140: 74 65 73 74 20 6c 69 6b 65 2d 35 2e 37 20 7b 0a  test like-5.7 {.
2150: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
2160: 50 52 41 47 4d 41 20 63 61 73 65 5f 73 65 6e 73  PRAGMA case_sens
2170: 69 74 69 76 65 5f 6c 69 6b 65 3d 6f 66 66 3b 0a  itive_like=off;.
2180: 20 20 7d 0a 20 20 73 65 74 20 73 71 6c 69 74 65    }.  set sqlite
2190: 5f 6c 69 6b 65 5f 63 6f 75 6e 74 20 30 0a 20 20  _like_count 0.  
21a0: 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20  queryplan {.    
21b0: 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 32  SELECT x FROM t2
21c0: 20 57 48 45 52 45 20 78 20 47 4c 4f 42 20 27 61   WHERE x GLOB 'a
21d0: 62 63 2a 27 20 4f 52 44 45 52 20 42 59 20 31 0a  bc*' ORDER BY 1.
21e0: 20 20 7d 0a 7d 20 7b 61 62 63 20 61 62 63 64 20    }.} {abc abcd 
21f0: 6e 6f 73 6f 72 74 20 7b 7d 20 69 32 7d 0a 64 6f  nosort {} i2}.do
2200: 5f 74 65 73 74 20 6c 69 6b 65 2d 35 2e 38 20 7b  _test like-5.8 {
2210: 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f 6c 69  .  set sqlite_li
2220: 6b 65 5f 63 6f 75 6e 74 0a 7d 20 31 32 0a 64 6f  ke_count.} 12.do
2230: 5f 74 65 73 74 20 6c 69 6b 65 2d 35 2e 31 31 20  _test like-5.11 
2240: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 50 52 41  {.  execsql {PRA
2250: 47 4d 41 20 63 61 73 65 5f 73 65 6e 73 69 74 69  GMA case_sensiti
2260: 76 65 5f 6c 69 6b 65 3d 6f 66 66 7d 0a 20 20 73  ve_like=off}.  s
2270: 65 74 20 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63  et sqlite_like_c
2280: 6f 75 6e 74 20 30 0a 20 20 71 75 65 72 79 70 6c  ount 0.  querypl
2290: 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  an {.    SELECT 
22a0: 78 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  x FROM t1 WHERE 
22b0: 78 20 4c 49 4b 45 20 27 41 42 43 25 27 20 4f 52  x LIKE 'ABC%' OR
22c0: 44 45 52 20 42 59 20 31 0a 20 20 7d 0a 7d 20 7b  DER BY 1.  }.} {
22d0: 41 42 43 20 7b 41 42 43 20 61 62 63 20 78 79 7a  ABC {ABC abc xyz
22e0: 7d 20 61 62 63 20 61 62 63 64 20 6e 6f 73 6f 72  } abc abcd nosor
22f0: 74 20 7b 7d 20 69 31 7d 0a 64 6f 5f 74 65 73 74  t {} i1}.do_test
2300: 20 6c 69 6b 65 2d 35 2e 31 32 20 7b 0a 20 20 73   like-5.12 {.  s
2310: 65 74 20 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63  et sqlite_like_c
2320: 6f 75 6e 74 0a 7d 20 31 32 0a 64 6f 5f 74 65 73  ount.} 12.do_tes
2330: 74 20 6c 69 6b 65 2d 35 2e 31 33 20 7b 0a 20 20  t like-5.13 {.  
2340: 73 65 74 20 73 71 6c 69 74 65 5f 6c 69 6b 65 5f  set sqlite_like_
2350: 63 6f 75 6e 74 20 30 0a 20 20 71 75 65 72 79 70  count 0.  queryp
2360: 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43 54  lan {.    SELECT
2370: 20 78 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45   x FROM t2 WHERE
2380: 20 78 20 4c 49 4b 45 20 27 41 42 43 25 27 20 4f   x LIKE 'ABC%' O
2390: 52 44 45 52 20 42 59 20 31 0a 20 20 7d 0a 7d 20  RDER BY 1.  }.} 
23a0: 7b 61 62 63 20 41 42 43 20 7b 41 42 43 20 61 62  {abc ABC {ABC ab
23b0: 63 20 78 79 7a 7d 20 61 62 63 64 20 6e 6f 73 6f  c xyz} abcd noso
23c0: 72 74 20 7b 7d 20 69 32 7d 0a 64 6f 5f 74 65 73  rt {} i2}.do_tes
23d0: 74 20 6c 69 6b 65 2d 35 2e 31 34 20 7b 0a 20 20  t like-5.14 {.  
23e0: 73 65 74 20 73 71 6c 69 74 65 5f 6c 69 6b 65 5f  set sqlite_like_
23f0: 63 6f 75 6e 74 0a 7d 20 30 0a 64 6f 5f 74 65 73  count.} 0.do_tes
2400: 74 20 6c 69 6b 65 2d 35 2e 31 35 20 7b 0a 20 20  t like-5.15 {.  
2410: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
2420: 41 47 4d 41 20 63 61 73 65 5f 73 65 6e 73 69 74  AGMA case_sensit
2430: 69 76 65 5f 6c 69 6b 65 3d 6f 6e 3b 0a 20 20 7d  ive_like=on;.  }
2440: 0a 20 20 73 65 74 20 73 71 6c 69 74 65 5f 6c 69  .  set sqlite_li
2450: 6b 65 5f 63 6f 75 6e 74 20 30 0a 20 20 71 75 65  ke_count 0.  que
2460: 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c  ryplan {.    SEL
2470: 45 43 54 20 78 20 46 52 4f 4d 20 74 32 20 57 48  ECT x FROM t2 WH
2480: 45 52 45 20 78 20 4c 49 4b 45 20 27 41 42 43 25  ERE x LIKE 'ABC%
2490: 27 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 7d  ' ORDER BY 1.  }
24a0: 0a 7d 20 7b 41 42 43 20 7b 41 42 43 20 61 62 63  .} {ABC {ABC abc
24b0: 20 78 79 7a 7d 20 6e 6f 73 6f 72 74 20 7b 7d 20   xyz} nosort {} 
24c0: 69 32 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65  i2}.do_test like
24d0: 2d 35 2e 31 36 20 7b 0a 20 20 73 65 74 20 73 71  -5.16 {.  set sq
24e0: 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 0a  lite_like_count.
24f0: 7d 20 31 32 0a 64 6f 5f 74 65 73 74 20 6c 69 6b  } 12.do_test lik
2500: 65 2d 35 2e 31 37 20 7b 0a 20 20 65 78 65 63 73  e-5.17 {.  execs
2510: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
2520: 63 61 73 65 5f 73 65 6e 73 69 74 69 76 65 5f 6c  case_sensitive_l
2530: 69 6b 65 3d 6f 66 66 3b 0a 20 20 7d 0a 20 20 73  ike=off;.  }.  s
2540: 65 74 20 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63  et sqlite_like_c
2550: 6f 75 6e 74 20 30 0a 20 20 71 75 65 72 79 70 6c  ount 0.  querypl
2560: 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  an {.    SELECT 
2570: 78 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20  x FROM t2 WHERE 
2580: 78 20 47 4c 4f 42 20 27 41 42 43 2a 27 20 4f 52  x GLOB 'ABC*' OR
2590: 44 45 52 20 42 59 20 31 0a 20 20 7d 0a 7d 20 7b  DER BY 1.  }.} {
25a0: 41 42 43 20 7b 41 42 43 20 61 62 63 20 78 79 7a  ABC {ABC abc xyz
25b0: 7d 20 6e 6f 73 6f 72 74 20 7b 7d 20 69 32 7d 0a  } nosort {} i2}.
25c0: 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 35 2e 31  do_test like-5.1
25d0: 38 20 7b 0a 20 20 73 65 74 20 73 71 6c 69 74 65  8 {.  set sqlite
25e0: 5f 6c 69 6b 65 5f 63 6f 75 6e 74 0a 7d 20 31 32  _like_count.} 12
25f0: 0a 0a 23 20 42 6f 75 6e 64 61 72 79 20 63 61 73  ..# Boundary cas
2600: 65 2e 20 20 54 68 65 20 70 72 65 66 69 78 20 66  e.  The prefix f
2610: 6f 72 20 61 20 4c 49 4b 45 20 63 6f 6d 70 61 72  or a LIKE compar
2620: 69 73 6f 6e 20 69 73 20 72 6f 75 6e 64 65 64 20  ison is rounded 
2630: 75 70 0a 23 20 77 68 65 6e 20 63 6f 6e 73 74 72  up.# when constr
2640: 75 63 74 69 6e 67 20 74 68 65 20 63 6f 6d 70 61  ucting the compa
2650: 72 69 73 6f 6e 2e 20 20 45 78 61 6d 70 6c 65 3a  rison.  Example:
2660: 20 20 22 61 62 22 20 62 65 63 6f 6d 65 73 20 22    "ab" becomes "
2670: 61 63 22 2e 0a 23 20 49 6e 20 6f 74 68 65 72 20  ac"..# In other 
2680: 77 6f 72 64 73 2c 20 74 68 65 20 6c 61 73 74 20  words, the last 
2690: 63 68 61 72 61 63 74 65 72 20 69 73 20 69 6e 63  character is inc
26a0: 72 65 61 73 65 64 20 62 79 20 6f 6e 65 2e 0a 23  reased by one..#
26b0: 0a 23 20 4d 61 6b 65 20 73 75 72 65 20 74 68 69  .# Make sure thi
26c0: 73 20 68 61 70 70 65 6e 73 20 63 6f 72 72 65 63  s happens correc
26d0: 74 6c 79 20 77 68 65 6e 20 74 68 65 20 6c 61 73  tly when the las
26e0: 74 20 63 68 61 72 61 63 74 65 72 20 69 73 20 61  t character is a
26f0: 20 0a 23 20 22 7a 22 20 61 6e 64 20 77 65 20 61   .# "z" and we a
2700: 72 65 20 64 6f 69 6e 67 20 63 61 73 65 2d 69 6e  re doing case-in
2710: 73 65 6e 73 69 74 69 76 65 20 63 6f 6d 70 61 72  sensitive compar
2720: 69 73 6f 6e 73 2e 0a 23 0a 23 20 54 69 63 6b 65  isons..#.# Ticke
2730: 74 20 23 32 39 35 39 0a 23 0a 64 6f 5f 74 65 73  t #2959.#.do_tes
2740: 74 20 6c 69 6b 65 2d 35 2e 32 31 20 7b 0a 20 20  t like-5.21 {.  
2750: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
2760: 41 47 4d 41 20 63 61 73 65 5f 73 65 6e 73 69 74  AGMA case_sensit
2770: 69 76 65 5f 6c 69 6b 65 3d 6f 66 66 3b 0a 20 20  ive_like=off;.  
2780: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
2790: 20 56 41 4c 55 45 53 28 27 5a 5a 2d 75 70 70 65   VALUES('ZZ-uppe
27a0: 72 2d 75 70 70 65 72 27 29 3b 0a 20 20 20 20 49  r-upper');.    I
27b0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
27c0: 4c 55 45 53 28 27 7a 5a 2d 6c 6f 77 65 72 2d 75  LUES('zZ-lower-u
27d0: 70 70 65 72 27 29 3b 0a 20 20 20 20 49 4e 53 45  pper');.    INSE
27e0: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
27f0: 53 28 27 5a 7a 2d 75 70 70 65 72 2d 6c 6f 77 65  S('Zz-upper-lowe
2800: 72 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  r');.    INSERT 
2810: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27  INTO t2 VALUES('
2820: 7a 7a 2d 6c 6f 77 65 72 2d 6c 6f 77 65 72 27 29  zz-lower-lower')
2830: 3b 0a 20 20 7d 0a 20 20 71 75 65 72 79 70 6c 61  ;.  }.  querypla
2840: 6e 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 78  n {.    SELECT x
2850: 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 78   FROM t2 WHERE x
2860: 20 4c 49 4b 45 20 27 7a 7a 25 27 3b 0a 20 20 7d   LIKE 'zz%';.  }
2870: 0a 7d 20 7b 7a 7a 2d 6c 6f 77 65 72 2d 6c 6f 77  .} {zz-lower-low
2880: 65 72 20 7a 5a 2d 6c 6f 77 65 72 2d 75 70 70 65  er zZ-lower-uppe
2890: 72 20 5a 7a 2d 75 70 70 65 72 2d 6c 6f 77 65 72  r Zz-upper-lower
28a0: 20 5a 5a 2d 75 70 70 65 72 2d 75 70 70 65 72 20   ZZ-upper-upper 
28b0: 6e 6f 73 6f 72 74 20 7b 7d 20 69 32 7d 0a 64 6f  nosort {} i2}.do
28c0: 5f 74 65 73 74 20 6c 69 6b 65 2d 35 2e 32 32 20  _test like-5.22 
28d0: 7b 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a  {.  queryplan {.
28e0: 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f      SELECT x FRO
28f0: 4d 20 74 32 20 57 48 45 52 45 20 78 20 4c 49 4b  M t2 WHERE x LIK
2900: 45 20 27 7a 5a 25 27 3b 0a 20 20 7d 0a 7d 20 7b  E 'zZ%';.  }.} {
2910: 7a 7a 2d 6c 6f 77 65 72 2d 6c 6f 77 65 72 20 7a  zz-lower-lower z
2920: 5a 2d 6c 6f 77 65 72 2d 75 70 70 65 72 20 5a 7a  Z-lower-upper Zz
2930: 2d 75 70 70 65 72 2d 6c 6f 77 65 72 20 5a 5a 2d  -upper-lower ZZ-
2940: 75 70 70 65 72 2d 75 70 70 65 72 20 6e 6f 73 6f  upper-upper noso
2950: 72 74 20 7b 7d 20 69 32 7d 0a 64 6f 5f 74 65 73  rt {} i2}.do_tes
2960: 74 20 6c 69 6b 65 2d 35 2e 32 33 20 7b 0a 20 20  t like-5.23 {.  
2970: 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20 20 20  queryplan {.    
2980: 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 32  SELECT x FROM t2
2990: 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27 5a   WHERE x LIKE 'Z
29a0: 7a 25 27 3b 0a 20 20 7d 0a 7d 20 7b 7a 7a 2d 6c  z%';.  }.} {zz-l
29b0: 6f 77 65 72 2d 6c 6f 77 65 72 20 7a 5a 2d 6c 6f  ower-lower zZ-lo
29c0: 77 65 72 2d 75 70 70 65 72 20 5a 7a 2d 75 70 70  wer-upper Zz-upp
29d0: 65 72 2d 6c 6f 77 65 72 20 5a 5a 2d 75 70 70 65  er-lower ZZ-uppe
29e0: 72 2d 75 70 70 65 72 20 6e 6f 73 6f 72 74 20 7b  r-upper nosort {
29f0: 7d 20 69 32 7d 0a 64 6f 5f 74 65 73 74 20 6c 69  } i2}.do_test li
2a00: 6b 65 2d 35 2e 32 34 20 7b 0a 20 20 71 75 65 72  ke-5.24 {.  quer
2a10: 79 70 6c 61 6e 20 7b 0a 20 20 20 20 53 45 4c 45  yplan {.    SELE
2a20: 43 54 20 78 20 46 52 4f 4d 20 74 32 20 57 48 45  CT x FROM t2 WHE
2a30: 52 45 20 78 20 4c 49 4b 45 20 27 5a 5a 25 27 3b  RE x LIKE 'ZZ%';
2a40: 0a 20 20 7d 0a 7d 20 7b 7a 7a 2d 6c 6f 77 65 72  .  }.} {zz-lower
2a50: 2d 6c 6f 77 65 72 20 7a 5a 2d 6c 6f 77 65 72 2d  -lower zZ-lower-
2a60: 75 70 70 65 72 20 5a 7a 2d 75 70 70 65 72 2d 6c  upper Zz-upper-l
2a70: 6f 77 65 72 20 5a 5a 2d 75 70 70 65 72 2d 75 70  ower ZZ-upper-up
2a80: 70 65 72 20 6e 6f 73 6f 72 74 20 7b 7d 20 69 32  per nosort {} i2
2a90: 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 35  }.do_test like-5
2aa0: 2e 32 35 20 7b 0a 20 20 71 75 65 72 79 70 6c 61  .25 {.  querypla
2ab0: 6e 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63  n {.    PRAGMA c
2ac0: 61 73 65 5f 73 65 6e 73 69 74 69 76 65 5f 6c 69  ase_sensitive_li
2ad0: 6b 65 3d 6f 6e 3b 0a 20 20 20 20 43 52 45 41 54  ke=on;.    CREAT
2ae0: 45 20 54 41 42 4c 45 20 74 33 28 78 29 3b 0a 20  E TABLE t3(x);. 
2af0: 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
2b00: 69 33 20 4f 4e 20 74 33 28 78 29 3b 0a 20 20 20  i3 ON t3(x);.   
2b10: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20   INSERT INTO t3 
2b20: 56 41 4c 55 45 53 28 27 5a 5a 2d 75 70 70 65 72  VALUES('ZZ-upper
2b30: 2d 75 70 70 65 72 27 29 3b 0a 20 20 20 20 49 4e  -upper');.    IN
2b40: 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c  SERT INTO t3 VAL
2b50: 55 45 53 28 27 7a 5a 2d 6c 6f 77 65 72 2d 75 70  UES('zZ-lower-up
2b60: 70 65 72 27 29 3b 0a 20 20 20 20 49 4e 53 45 52  per');.    INSER
2b70: 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53  T INTO t3 VALUES
2b80: 28 27 5a 7a 2d 75 70 70 65 72 2d 6c 6f 77 65 72  ('Zz-upper-lower
2b90: 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ');.    INSERT I
2ba0: 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 27 7a  NTO t3 VALUES('z
2bb0: 7a 2d 6c 6f 77 65 72 2d 6c 6f 77 65 72 27 29 3b  z-lower-lower');
2bc0: 0a 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52  .    SELECT x FR
2bd0: 4f 4d 20 74 33 20 57 48 45 52 45 20 78 20 4c 49  OM t3 WHERE x LI
2be0: 4b 45 20 27 7a 7a 25 27 3b 0a 20 20 7d 0a 7d 20  KE 'zz%';.  }.} 
2bf0: 7b 7a 7a 2d 6c 6f 77 65 72 2d 6c 6f 77 65 72 20  {zz-lower-lower 
2c00: 6e 6f 73 6f 72 74 20 7b 7d 20 69 33 7d 0a 64 6f  nosort {} i3}.do
2c10: 5f 74 65 73 74 20 6c 69 6b 65 2d 35 2e 32 36 20  _test like-5.26 
2c20: 7b 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a  {.  queryplan {.
2c30: 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f      SELECT x FRO
2c40: 4d 20 74 33 20 57 48 45 52 45 20 78 20 4c 49 4b  M t3 WHERE x LIK
2c50: 45 20 27 7a 5a 25 27 3b 0a 20 20 7d 0a 7d 20 7b  E 'zZ%';.  }.} {
2c60: 7a 5a 2d 6c 6f 77 65 72 2d 75 70 70 65 72 20 6e  zZ-lower-upper n
2c70: 6f 73 6f 72 74 20 7b 7d 20 69 33 7d 0a 64 6f 5f  osort {} i3}.do_
2c80: 74 65 73 74 20 6c 69 6b 65 2d 35 2e 32 37 20 7b  test like-5.27 {
2c90: 0a 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20  .  queryplan {. 
2ca0: 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d     SELECT x FROM
2cb0: 20 74 33 20 57 48 45 52 45 20 78 20 4c 49 4b 45   t3 WHERE x LIKE
2cc0: 20 27 5a 7a 25 27 3b 0a 20 20 7d 0a 7d 20 7b 5a   'Zz%';.  }.} {Z
2cd0: 7a 2d 75 70 70 65 72 2d 6c 6f 77 65 72 20 6e 6f  z-upper-lower no
2ce0: 73 6f 72 74 20 7b 7d 20 69 33 7d 0a 64 6f 5f 74  sort {} i3}.do_t
2cf0: 65 73 74 20 6c 69 6b 65 2d 35 2e 32 38 20 7b 0a  est like-5.28 {.
2d00: 20 20 71 75 65 72 79 70 6c 61 6e 20 7b 0a 20 20    queryplan {.  
2d10: 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20    SELECT x FROM 
2d20: 74 33 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20  t3 WHERE x LIKE 
2d30: 27 5a 5a 25 27 3b 0a 20 20 7d 0a 7d 20 7b 5a 5a  'ZZ%';.  }.} {ZZ
2d40: 2d 75 70 70 65 72 2d 75 70 70 65 72 20 6e 6f 73  -upper-upper nos
2d50: 6f 72 74 20 7b 7d 20 69 33 7d 0a 0a 0a 23 20 74  ort {} i3}...# t
2d60: 69 63 6b 65 74 20 23 32 34 30 37 0a 23 0a 23 20  icket #2407.#.# 
2d70: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 4c 49  Make sure the LI
2d80: 4b 45 20 70 72 65 66 69 78 20 6f 70 74 69 6d 69  KE prefix optimi
2d90: 7a 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  zation does not 
2da0: 73 74 72 69 70 20 6f 66 66 20 6c 65 61 64 69 6e  strip off leadin
2db0: 67 0a 23 20 63 68 61 72 61 63 74 65 72 73 20 6f  g.# characters o
2dc0: 66 20 74 68 65 20 6c 69 6b 65 20 70 61 74 74 65  f the like patte
2dd0: 72 6e 20 74 68 61 74 20 68 61 70 70 65 6e 20 74  rn that happen t
2de0: 6f 20 62 65 20 71 75 6f 74 65 20 63 68 61 72 61  o be quote chara
2df0: 63 74 65 72 73 2e 0a 23 0a 64 6f 5f 74 65 73 74  cters..#.do_test
2e00: 20 6c 69 6b 65 2d 36 2e 31 20 7b 0a 20 20 66 6f   like-6.1 {.  fo
2e10: 72 65 61 63 68 20 78 20 7b 20 27 61 62 63 20 27  reach x { 'abc '
2e20: 62 63 64 20 27 64 65 66 20 27 61 78 20 7d 20 7b  bcd 'def 'ax } {
2e30: 0a 20 20 20 20 73 65 74 20 78 32 20 27 5b 73 74  .    set x2 '[st
2e40: 72 69 6e 67 20 6d 61 70 20 7b 27 20 27 27 7d 20  ring map {' ''} 
2e50: 24 78 5d 27 0a 20 20 20 20 64 62 20 65 76 61 6c  $x]'.    db eval
2e60: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32   "INSERT INTO t2
2e70: 20 56 41 4c 55 45 53 28 24 78 32 29 22 0a 20 20   VALUES($x2)".  
2e80: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  }.  execsql {.  
2e90: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
2ea0: 74 32 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20  t2 WHERE x LIKE 
2eb0: 27 27 27 61 25 27 0a 20 20 7d 0a 7d 20 7b 27 61  '''a%'.  }.} {'a
2ec0: 62 63 20 27 61 78 7d 0a 0a 64 6f 5f 74 65 73 74  bc 'ax}..do_test
2ed0: 20 6c 69 6b 65 2d 37 2e 31 20 7b 0a 20 20 65 78   like-7.1 {.  ex
2ee0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 53 45 4c 45  ecsql {.    SELE
2ef0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
2f00: 52 45 20 72 6f 77 69 64 20 47 4c 4f 42 20 27 31  RE rowid GLOB '1
2f10: 2a 27 3b 0a 20 20 7d 0a 7d 20 7b 61 7d 0a 0a 23  *';.  }.} {a}..#
2f20: 20 74 69 63 6b 65 74 20 23 33 33 34 35 2e 0a 23   ticket #3345..#
2f30: 0a 23 20 4f 76 65 72 6c 6f 61 64 69 6e 67 20 74  .# Overloading t
2f40: 68 65 20 4c 49 4b 45 20 66 75 6e 63 74 69 6f 6e  he LIKE function
2f50: 20 77 69 74 68 20 2d 31 20 66 6f 72 20 74 68 65   with -1 for the
2f60: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
2f70: 65 6e 74 73 0a 23 20 77 69 6c 6c 20 6f 76 65 72  ents.# will over
2f80: 6c 6f 61 64 20 62 6f 74 68 20 74 68 65 20 32 2d  load both the 2-
2f90: 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 74 68 65  argument and the
2fa0: 20 33 2d 61 72 67 75 6d 65 6e 74 20 4c 49 4b 45   3-argument LIKE
2fb0: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65  ..#.do_test like
2fc0: 2d 38 2e 31 20 7b 0a 20 20 64 62 20 65 76 61 6c  -8.1 {.  db eval
2fd0: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
2fe0: 42 4c 45 20 74 38 28 78 29 3b 0a 20 20 20 20 49  BLE t8(x);.    I
2ff0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 38 20 56 41  NSERT INTO t8 VA
3000: 4c 55 45 53 28 27 61 62 63 64 65 66 27 29 3b 0a  LUES('abcdef');.
3010: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3020: 74 38 20 56 41 4c 55 45 53 28 27 67 68 69 6a 6b  t8 VALUES('ghijk
3030: 6c 27 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  l');.    INSERT 
3040: 49 4e 54 4f 20 74 38 20 56 41 4c 55 45 53 28 27  INTO t8 VALUES('
3050: 6d 6e 6f 70 71 72 27 29 3b 0a 20 20 20 20 53 45  mnopqr');.    SE
3060: 4c 45 43 54 20 31 2c 20 78 20 46 52 4f 4d 20 74  LECT 1, x FROM t
3070: 38 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27  8 WHERE x LIKE '
3080: 25 68 25 27 3b 0a 20 20 20 20 53 45 4c 45 43 54  %h%';.    SELECT
3090: 20 32 2c 20 78 20 46 52 4f 4d 20 74 38 20 57 48   2, x FROM t8 WH
30a0: 45 52 45 20 78 20 4c 49 4b 45 20 27 25 68 25 27  ERE x LIKE '%h%'
30b0: 20 45 53 43 41 50 45 20 27 78 27 3b 0a 20 20 7d   ESCAPE 'x';.  }
30c0: 0a 7d 20 7b 31 20 67 68 69 6a 6b 6c 20 32 20 67  .} {1 ghijkl 2 g
30d0: 68 69 6a 6b 6c 7d 0a 64 6f 5f 74 65 73 74 20 6c  hijkl}.do_test l
30e0: 69 6b 65 2d 38 2e 32 20 7b 0a 20 20 70 72 6f 63  ike-8.2 {.  proc
30f0: 20 6e 65 77 6c 69 6b 65 20 7b 61 72 67 73 7d 20   newlike {args} 
3100: 7b 72 65 74 75 72 6e 20 31 7d 20 3b 23 20 41 6c  {return 1} ;# Al
3110: 74 65 72 6e 61 74 69 76 65 20 4c 49 4b 45 20 69  ternative LIKE i
3120: 73 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20  s always return 
3130: 54 52 55 45 0a 20 20 64 62 20 66 75 6e 63 74 69  TRUE.  db functi
3140: 6f 6e 20 6c 69 6b 65 20 6e 65 77 6c 69 6b 65 20  on like newlike 
3150: 20 20 20 20 20 20 3b 23 20 55 73 65 73 20 2d 31        ;# Uses -1
3160: 20 66 6f 72 20 6e 41 72 67 20 69 6e 20 73 71 6c   for nArg in sql
3170: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
3180: 74 69 6f 6e 0a 20 20 64 62 20 63 61 63 68 65 20  tion.  db cache 
3190: 66 6c 75 73 68 0a 20 20 64 62 20 65 76 61 6c 20  flush.  db eval 
31a0: 7b 0a 20 20 20 20 53 45 4c 45 43 54 20 31 2c 20  {.    SELECT 1, 
31b0: 78 20 46 52 4f 4d 20 74 38 20 57 48 45 52 45 20  x FROM t8 WHERE 
31c0: 78 20 4c 49 4b 45 20 27 25 68 25 27 3b 0a 20 20  x LIKE '%h%';.  
31d0: 20 20 53 45 4c 45 43 54 20 32 2c 20 78 20 46 52    SELECT 2, x FR
31e0: 4f 4d 20 74 38 20 57 48 45 52 45 20 78 20 4c 49  OM t8 WHERE x LI
31f0: 4b 45 20 27 25 68 25 27 20 45 53 43 41 50 45 20  KE '%h%' ESCAPE 
3200: 27 78 27 3b 0a 20 20 7d 0a 7d 20 7b 31 20 67 68  'x';.  }.} {1 gh
3210: 69 6a 6b 6c 20 32 20 67 68 69 6a 6b 6c 7d 0a 64  ijkl 2 ghijkl}.d
3220: 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 38 2e 33 20  o_test like-8.3 
3230: 7b 0a 20 20 64 62 20 66 75 6e 63 74 69 6f 6e 20  {.  db function 
3240: 6c 69 6b 65 20 2d 61 72 67 63 6f 75 6e 74 20 32  like -argcount 2
3250: 20 6e 65 77 6c 69 6b 65 0a 20 20 64 62 20 65 76   newlike.  db ev
3260: 61 6c 20 7b 0a 20 20 20 20 53 45 4c 45 43 54 20  al {.    SELECT 
3270: 31 2c 20 78 20 46 52 4f 4d 20 74 38 20 57 48 45  1, x FROM t8 WHE
3280: 52 45 20 78 20 4c 49 4b 45 20 27 25 68 25 27 3b  RE x LIKE '%h%';
3290: 0a 20 20 20 20 53 45 4c 45 43 54 20 32 2c 20 78  .    SELECT 2, x
32a0: 20 46 52 4f 4d 20 74 38 20 57 48 45 52 45 20 78   FROM t8 WHERE x
32b0: 20 4c 49 4b 45 20 27 25 68 25 27 20 45 53 43 41   LIKE '%h%' ESCA
32c0: 50 45 20 27 78 27 3b 0a 20 20 7d 0a 7d 20 7b 31  PE 'x';.  }.} {1
32d0: 20 61 62 63 64 65 66 20 31 20 67 68 69 6a 6b 6c   abcdef 1 ghijkl
32e0: 20 31 20 6d 6e 6f 70 71 72 20 32 20 67 68 69 6a   1 mnopqr 2 ghij
32f0: 6b 6c 7d 0a 64 6f 5f 74 65 73 74 20 6c 69 6b 65  kl}.do_test like
3300: 2d 38 2e 34 20 7b 0a 20 20 64 62 20 66 75 6e 63  -8.4 {.  db func
3310: 74 69 6f 6e 20 6c 69 6b 65 20 2d 61 72 67 63 6f  tion like -argco
3320: 75 6e 74 20 33 20 6e 65 77 6c 69 6b 65 0a 20 20  unt 3 newlike.  
3330: 64 62 20 65 76 61 6c 20 7b 0a 20 20 20 20 53 45  db eval {.    SE
3340: 4c 45 43 54 20 31 2c 20 78 20 46 52 4f 4d 20 74  LECT 1, x FROM t
3350: 38 20 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27  8 WHERE x LIKE '
3360: 25 68 25 27 3b 0a 20 20 20 20 53 45 4c 45 43 54  %h%';.    SELECT
3370: 20 32 2c 20 78 20 46 52 4f 4d 20 74 38 20 57 48   2, x FROM t8 WH
3380: 45 52 45 20 78 20 4c 49 4b 45 20 27 25 68 25 27  ERE x LIKE '%h%'
3390: 20 45 53 43 41 50 45 20 27 78 27 3b 0a 20 20 7d   ESCAPE 'x';.  }
33a0: 0a 7d 20 7b 31 20 61 62 63 64 65 66 20 31 20 67  .} {1 abcdef 1 g
33b0: 68 69 6a 6b 6c 20 31 20 6d 6e 6f 70 71 72 20 32  hijkl 1 mnopqr 2
33c0: 20 61 62 63 64 65 66 20 32 20 67 68 69 6a 6b 6c   abcdef 2 ghijkl
33d0: 20 32 20 6d 6e 6f 70 71 72 7d 0a 0a 0a 69 66 63   2 mnopqr}...ifc
33e0: 61 70 61 62 6c 65 20 6c 69 6b 65 5f 6f 70 74 20  apable like_opt 
33f0: 7b 0a 20 20 23 20 45 76 61 6c 75 61 74 65 20 53  {.  # Evaluate S
3400: 51 4c 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  QL.  Return the 
3410: 72 65 73 75 6c 74 20 73 65 74 20 66 6f 6c 6c 6f  result set follo
3420: 77 65 64 20 62 79 20 74 68 65 0a 20 20 23 20 61  wed by the.  # a
3430: 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nd the number of
3440: 20 66 75 6c 6c 2d 73 63 61 6e 20 73 74 65 70 73   full-scan steps
3450: 2e 0a 20 20 23 0a 20 20 64 62 20 63 6c 6f 73 65  ..  #.  db close
3460: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
3470: 73 74 2e 64 62 0a 20 20 70 72 6f 63 20 63 6f 75  st.db.  proc cou
3480: 6e 74 5f 73 74 65 70 73 20 7b 73 71 6c 7d 20 7b  nt_steps {sql} {
3490: 0a 20 20 20 20 73 65 74 20 72 20 5b 64 62 20 65  .    set r [db e
34a0: 76 61 6c 20 24 73 71 6c 5d 0a 20 20 20 20 6c 61  val $sql].    la
34b0: 70 70 65 6e 64 20 72 20 73 63 61 6e 20 5b 64 62  ppend r scan [db
34c0: 20 73 74 61 74 75 73 20 73 74 65 70 5d 20 73 6f   status step] so
34d0: 72 74 20 5b 64 62 20 73 74 61 74 75 73 20 73 6f  rt [db status so
34e0: 72 74 5d 0a 20 20 7d 0a 20 20 64 6f 5f 74 65 73  rt].  }.  do_tes
34f0: 74 20 6c 69 6b 65 2d 39 2e 31 20 7b 0a 20 20 20  t like-9.1 {.   
3500: 20 63 6f 75 6e 74 5f 73 74 65 70 73 20 7b 0a 20   count_steps {. 
3510: 20 20 20 20 20 20 53 45 4c 45 43 54 20 78 20 46        SELECT x F
3520: 52 4f 4d 20 74 32 20 57 48 45 52 45 20 78 20 4c  ROM t2 WHERE x L
3530: 49 4b 45 20 27 78 25 27 0a 20 20 20 20 7d 0a 20  IKE 'x%'.    }. 
3540: 20 7d 20 7b 78 79 7a 20 73 63 61 6e 20 30 20 73   } {xyz scan 0 s
3550: 6f 72 74 20 30 7d 0a 20 20 64 6f 5f 74 65 73 74  ort 0}.  do_test
3560: 20 6c 69 6b 65 2d 39 2e 32 20 7b 0a 20 20 20 20   like-9.2 {.    
3570: 63 6f 75 6e 74 5f 73 74 65 70 73 20 7b 0a 20 20  count_steps {.  
3580: 20 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52       SELECT x FR
3590: 4f 4d 20 74 32 20 57 48 45 52 45 20 78 20 4c 49  OM t2 WHERE x LI
35a0: 4b 45 20 27 5f 79 25 27 0a 20 20 20 20 7d 0a 20  KE '_y%'.    }. 
35b0: 20 7d 20 7b 78 79 7a 20 73 63 61 6e 20 31 39 20   } {xyz scan 19 
35c0: 73 6f 72 74 20 30 7d 0a 20 20 64 6f 5f 74 65 73  sort 0}.  do_tes
35d0: 74 20 6c 69 6b 65 2d 39 2e 33 2e 31 20 7b 0a 20  t like-9.3.1 {. 
35e0: 20 20 20 73 65 74 20 72 65 73 20 5b 73 71 6c 69     set res [sqli
35f0: 74 65 33 5f 65 78 65 63 5f 68 65 78 20 64 62 20  te3_exec_hex db 
3600: 7b 0a 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  {.       SELECT 
3610: 78 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20  x FROM t2 WHERE 
3620: 78 20 4c 49 4b 45 20 27 25 37 38 25 32 35 27 0a  x LIKE '%78%25'.
3630: 20 20 20 20 7d 5d 0a 20 20 7d 20 7b 30 20 7b 78      }].  } {0 {x
3640: 20 78 79 7a 7d 7d 0a 20 20 69 66 63 61 70 61 62   xyz}}.  ifcapab
3650: 6c 65 20 65 78 70 6c 61 69 6e 20 7b 0a 20 20 20  le explain {.   
3660: 20 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 39 2e   do_test like-9.
3670: 33 2e 32 20 7b 0a 20 20 20 20 20 20 73 65 74 20  3.2 {.      set 
3680: 72 65 73 20 5b 73 71 6c 69 74 65 33 5f 65 78 65  res [sqlite3_exe
3690: 63 5f 68 65 78 20 64 62 20 7b 0a 20 20 20 20 20  c_hex db {.     
36a0: 20 20 20 20 45 58 50 4c 41 49 4e 20 51 55 45 52      EXPLAIN QUER
36b0: 59 20 50 4c 41 4e 20 53 45 4c 45 43 54 20 78 20  Y PLAN SELECT x 
36c0: 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 78 20  FROM t2 WHERE x 
36d0: 4c 49 4b 45 20 27 25 37 38 25 32 35 27 0a 20 20  LIKE '%78%25'.  
36e0: 20 20 20 20 7d 5d 0a 20 20 20 20 20 20 72 65 67      }].      reg
36f0: 65 78 70 20 7b 49 4e 44 45 58 20 69 32 7d 20 24  exp {INDEX i2} $
3700: 72 65 73 0a 20 20 20 20 7d 20 7b 31 7d 0a 20 20  res.    } {1}.  
3710: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 6c 69 6b 65  }.  do_test like
3720: 2d 39 2e 34 2e 31 20 7b 0a 20 20 20 20 73 71 6c  -9.4.1 {.    sql
3730: 69 74 65 33 5f 65 78 65 63 5f 68 65 78 20 64 62  ite3_exec_hex db
3740: 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32   {INSERT INTO t2
3750: 20 56 41 4c 55 45 53 28 27 25 66 66 68 65 6c 6c   VALUES('%ffhell
3760: 6f 27 29 7d 0a 20 20 20 20 73 65 74 20 72 65 73  o')}.    set res
3770: 20 5b 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 68   [sqlite3_exec_h
3780: 65 78 20 64 62 20 7b 0a 20 20 20 20 20 20 20 53  ex db {.       S
3790: 45 4c 45 43 54 20 73 75 62 73 74 72 28 78 2c 32  ELECT substr(x,2
37a0: 29 20 41 53 20 78 20 46 52 4f 4d 20 74 32 20 57  ) AS x FROM t2 W
37b0: 48 45 52 45 20 2b 78 20 4c 49 4b 45 20 27 25 66  HERE +x LIKE '%f
37c0: 66 25 32 35 27 0a 20 20 20 20 7d 5d 0a 20 20 7d  f%25'.    }].  }
37d0: 20 7b 30 20 7b 78 20 68 65 6c 6c 6f 7d 7d 0a 20   {0 {x hello}}. 
37e0: 20 64 6f 5f 74 65 73 74 20 6c 69 6b 65 2d 39 2e   do_test like-9.
37f0: 34 2e 32 20 7b 0a 20 20 20 20 73 65 74 20 72 65  4.2 {.    set re
3800: 73 20 5b 73 71 6c 69 74 65 33 5f 65 78 65 63 5f  s [sqlite3_exec_
3810: 68 65 78 20 64 62 20 7b 0a 20 20 20 20 20 20 20  hex db {.       
3820: 53 45 4c 45 43 54 20 73 75 62 73 74 72 28 78 2c  SELECT substr(x,
3830: 32 29 20 41 53 20 78 20 46 52 4f 4d 20 74 32 20  2) AS x FROM t2 
3840: 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27 25 66  WHERE x LIKE '%f
3850: 66 25 32 35 27 0a 20 20 20 20 7d 5d 0a 20 20 7d  f%25'.    }].  }
3860: 20 7b 30 20 7b 78 20 68 65 6c 6c 6f 7d 7d 0a 20   {0 {x hello}}. 
3870: 20 69 66 63 61 70 61 62 6c 65 20 65 78 70 6c 61   ifcapable expla
3880: 69 6e 20 7b 0a 20 20 20 20 64 6f 5f 74 65 73 74  in {.    do_test
3890: 20 6c 69 6b 65 2d 39 2e 34 2e 33 20 7b 0a 20 20   like-9.4.3 {.  
38a0: 20 20 20 20 73 65 74 20 72 65 73 20 5b 73 71 6c      set res [sql
38b0: 69 74 65 33 5f 65 78 65 63 5f 68 65 78 20 64 62  ite3_exec_hex db
38c0: 20 7b 0a 20 20 20 20 20 20 20 20 20 45 58 50 4c   {.         EXPL
38d0: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 53  AIN QUERY PLAN S
38e0: 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 32 20  ELECT x FROM t2 
38f0: 57 48 45 52 45 20 78 20 4c 49 4b 45 20 27 25 66  WHERE x LIKE '%f
3900: 66 25 32 35 27 0a 20 20 20 20 20 20 7d 5d 0a 20  f%25'.      }]. 
3910: 20 20 20 20 20 72 65 67 65 78 70 20 7b 49 4e 44       regexp {IND
3920: 45 58 20 69 32 7d 20 24 72 65 73 0a 20 20 20 20  EX i2} $res.    
3930: 7d 20 7b 30 7d 0a 20 20 7d 0a 20 20 64 6f 5f 74  } {0}.  }.  do_t
3940: 65 73 74 20 6c 69 6b 65 2d 39 2e 35 2e 31 20 7b  est like-9.5.1 {
3950: 0a 20 20 20 20 73 65 74 20 72 65 73 20 5b 73 71  .    set res [sq
3960: 6c 69 74 65 33 5f 65 78 65 63 5f 68 65 78 20 64  lite3_exec_hex d
3970: 62 20 7b 0a 20 20 20 20 20 20 20 53 45 4c 45 43  b {.       SELEC
3980: 54 20 78 20 46 52 4f 4d 20 74 32 20 57 48 45 52  T x FROM t2 WHER
3990: 45 20 78 20 4c 49 4b 45 20 27 25 66 65 25 32 35  E x LIKE '%fe%25
39a0: 27 0a 20 20 20 20 7d 5d 0a 20 20 7d 20 7b 30 20  '.    }].  } {0 
39b0: 7b 7d 7d 0a 20 20 69 66 63 61 70 61 62 6c 65 20  {}}.  ifcapable 
39c0: 65 78 70 6c 61 69 6e 20 7b 0a 20 20 20 20 64 6f  explain {.    do
39d0: 5f 74 65 73 74 20 6c 69 6b 65 2d 39 2e 35 2e 32  _test like-9.5.2
39e0: 20 7b 0a 20 20 20 20 20 20 73 65 74 20 72 65 73   {.      set res
39f0: 20 5b 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 68   [sqlite3_exec_h
3a00: 65 78 20 64 62 20 7b 0a 20 20 20 20 20 20 20 20  ex db {.        
3a10: 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
3a20: 4c 41 4e 20 53 45 4c 45 43 54 20 78 20 46 52 4f  LAN SELECT x FRO
3a30: 4d 20 74 32 20 57 48 45 52 45 20 78 20 4c 49 4b  M t2 WHERE x LIK
3a40: 45 20 27 25 66 65 25 32 35 27 0a 20 20 20 20 20  E '%fe%25'.     
3a50: 20 7d 5d 0a 20 20 20 20 20 20 72 65 67 65 78 70   }].      regexp
3a60: 20 7b 49 4e 44 45 58 20 69 32 7d 20 24 72 65 73   {INDEX i2} $res
3a70: 0a 20 20 20 20 7d 20 7b 31 7d 0a 20 20 7d 0a 7d  .    } {1}.  }.}
3a80: 0a 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a     ...finish_test.