/ Hex Artifact Content
Login

Artifact aad033abdcfa0f87ce5f56468f59fdf2a0acbcef:


0000: 23 20 32 30 31 32 20 4d 61 79 20 32 35 0a 23 0a  # 2012 May 25.#.
0010: 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 73  # The author dis
0020: 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74  claims copyright
0030: 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20   to this source 
0040: 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20  code.  In place 
0050: 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f 74  of.# a legal not
0060: 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20 62  ice, here is a b
0070: 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20 20  lessing:.#.#    
0080: 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20  May you do good 
0090: 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23 20  and not evil..# 
00a0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00b0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00c0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00d0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20 20  give others..#  
00e0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
00f0: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0100: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0110: 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a 2a  ou 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 0a 23 0a 23 20 54 68 65 20 74 65  *****.#.# The te
0170: 73 74 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65  sts in this file
0180: 20 66 6f 63 75 73 20 6f 6e 20 74 65 73 74 69 6e   focus on testin
0190: 67 20 74 68 65 20 22 75 6e 69 63 6f 64 65 22 20  g the "unicode" 
01a0: 46 54 53 20 74 6f 6b 65 6e 69 7a 65 72 2e 0a 23  FTS tokenizer..#
01b0: 0a 0a 73 65 74 20 74 65 73 74 64 69 72 20 5b 66  ..set testdir [f
01c0: 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 61 72 67  ile dirname $arg
01d0: 76 30 5d 0a 73 6f 75 72 63 65 20 24 74 65 73 74  v0].source $test
01e0: 64 69 72 2f 74 65 73 74 65 72 2e 74 63 6c 0a 69  dir/tester.tcl.i
01f0: 66 63 61 70 61 62 6c 65 20 21 66 74 73 33 5f 75  fcapable !fts3_u
0200: 6e 69 63 6f 64 65 20 7b 20 66 69 6e 69 73 68 5f  nicode { finish_
0210: 74 65 73 74 20 3b 20 72 65 74 75 72 6e 20 7d 0a  test ; return }.
0220: 73 65 74 20 3a 3a 74 65 73 74 70 72 65 66 69 78  set ::testprefix
0230: 20 66 74 73 34 75 6e 69 63 6f 64 65 0a 0a 70 72   fts4unicode..pr
0240: 6f 63 20 64 6f 5f 75 6e 69 63 6f 64 65 5f 74 6f  oc do_unicode_to
0250: 6b 65 6e 5f 74 65 73 74 20 7b 74 6e 20 69 6e 70  ken_test {tn inp
0260: 75 74 20 72 65 73 7d 20 7b 0a 20 20 73 65 74 20  ut res} {.  set 
0270: 69 6e 70 75 74 20 5b 73 74 72 69 6e 67 20 6d 61  input [string ma
0280: 70 20 7b 27 20 27 27 7d 20 24 69 6e 70 75 74 5d  p {' ''} $input]
0290: 0a 20 20 75 70 6c 65 76 65 6c 20 5b 6c 69 73 74  .  uplevel [list
02a0: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
02b0: 20 24 74 6e 20 22 0a 20 20 20 20 53 45 4c 45 43   $tn ".    SELEC
02c0: 54 20 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72  T fts3_tokenizer
02d0: 5f 74 65 73 74 28 27 75 6e 69 63 6f 64 65 36 31  _test('unicode61
02e0: 27 2c 20 27 72 65 6d 6f 76 65 5f 64 69 61 63 72  ', 'remove_diacr
02f0: 69 74 69 63 73 3d 30 27 2c 20 27 24 69 6e 70 75  itics=0', '$inpu
0300: 74 27 29 3b 0a 20 20 22 20 5b 6c 69 73 74 20 5b  t');.  " [list [
0310: 6c 69 73 74 20 7b 2a 7d 24 72 65 73 5d 5d 5d 0a  list {*}$res]]].
0320: 7d 0a 0a 70 72 6f 63 20 64 6f 5f 75 6e 69 63 6f  }..proc do_unico
0330: 64 65 5f 74 6f 6b 65 6e 5f 74 65 73 74 32 20 7b  de_token_test2 {
0340: 74 6e 20 69 6e 70 75 74 20 72 65 73 7d 20 7b 0a  tn input res} {.
0350: 20 20 73 65 74 20 69 6e 70 75 74 20 5b 73 74 72    set input [str
0360: 69 6e 67 20 6d 61 70 20 7b 27 20 27 27 7d 20 24  ing map {' ''} $
0370: 69 6e 70 75 74 5d 0a 20 20 75 70 6c 65 76 65 6c  input].  uplevel
0380: 20 5b 6c 69 73 74 20 64 6f 5f 65 78 65 63 73 71   [list do_execsq
0390: 6c 5f 74 65 73 74 20 24 74 6e 20 22 0a 20 20 20  l_test $tn ".   
03a0: 20 53 45 4c 45 43 54 20 66 74 73 33 5f 74 6f 6b   SELECT fts3_tok
03b0: 65 6e 69 7a 65 72 5f 74 65 73 74 28 27 75 6e 69  enizer_test('uni
03c0: 63 6f 64 65 36 31 27 2c 20 27 24 69 6e 70 75 74  code61', '$input
03d0: 27 29 3b 0a 20 20 22 20 5b 6c 69 73 74 20 5b 6c  ');.  " [list [l
03e0: 69 73 74 20 7b 2a 7d 24 72 65 73 5d 5d 5d 0a 7d  ist {*}$res]]].}
03f0: 0a 0a 70 72 6f 63 20 64 6f 5f 75 6e 69 63 6f 64  ..proc do_unicod
0400: 65 5f 74 6f 6b 65 6e 5f 74 65 73 74 33 20 7b 74  e_token_test3 {t
0410: 6e 20 61 72 67 73 7d 20 7b 0a 20 20 73 65 74 20  n args} {.  set 
0420: 72 65 73 20 20 20 5b 6c 69 6e 64 65 78 20 24 61  res   [lindex $a
0430: 72 67 73 20 65 6e 64 5d 0a 20 20 73 65 74 20 73  rgs end].  set s
0440: 71 6c 20 22 53 45 4c 45 43 54 20 66 74 73 33 5f  ql "SELECT fts3_
0450: 74 6f 6b 65 6e 69 7a 65 72 5f 74 65 73 74 28 27  tokenizer_test('
0460: 75 6e 69 63 6f 64 65 36 31 27 22 0a 20 20 66 6f  unicode61'".  fo
0470: 72 65 61 63 68 20 61 20 5b 6c 72 61 6e 67 65 20  reach a [lrange 
0480: 24 61 72 67 73 20 30 20 65 6e 64 2d 31 5d 20 7b  $args 0 end-1] {
0490: 0a 20 20 20 20 61 70 70 65 6e 64 20 73 71 6c 20  .    append sql 
04a0: 22 2c 20 27 22 0a 20 20 20 20 61 70 70 65 6e 64  ", '".    append
04b0: 20 73 71 6c 20 5b 73 74 72 69 6e 67 20 6d 61 70   sql [string map
04c0: 20 7b 27 20 27 27 7d 20 24 61 5d 0a 20 20 20 20   {' ''} $a].    
04d0: 61 70 70 65 6e 64 20 73 71 6c 20 22 27 22 0a 20  append sql "'". 
04e0: 20 7d 0a 20 20 61 70 70 65 6e 64 20 73 71 6c 20   }.  append sql 
04f0: 22 29 22 0a 20 20 75 70 6c 65 76 65 6c 20 5b 6c  ")".  uplevel [l
0500: 69 73 74 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74  ist do_execsql_t
0510: 65 73 74 20 24 74 6e 20 24 73 71 6c 20 5b 6c 69  est $tn $sql [li
0520: 73 74 20 5b 6c 69 73 74 20 7b 2a 7d 24 72 65 73  st [list {*}$res
0530: 5d 5d 5d 0a 7d 0a 0a 64 6f 5f 75 6e 69 63 6f 64  ]]].}..do_unicod
0540: 65 5f 74 6f 6b 65 6e 5f 74 65 73 74 20 31 2e 30  e_token_test 1.0
0550: 20 7b 61 20 42 20 63 20 44 7d 20 7b 30 20 61 20   {a B c D} {0 a 
0560: 61 20 31 20 62 20 42 20 32 20 63 20 63 20 33 20  a 1 b B 2 c c 3 
0570: 64 20 44 7d 0a 64 6f 5f 75 6e 69 63 6f 64 65 5f  d D}.do_unicode_
0580: 74 6f 6b 65 6e 5f 74 65 73 74 20 31 2e 31 20 7b  token_test 1.1 {
0590: c4 20 d6 20 dc 7d 20 7b 30 20 e4 20 c4 20 31 20  . . .} {0 . . 1 
05a0: f6 20 d6 20 32 20 fc 20 dc 7d 0a 64 6f 5f 75 6e  . . 2 . .}.do_un
05b0: 69 63 6f 64 65 5f 74 6f 6b 65 6e 5f 74 65 73 74  icode_token_test
05c0: 20 31 2e 32 20 7b 78 c4 78 20 78 d6 78 20 78 dc   1.2 {x.x x.x x.
05d0: 78 7d 20 7b 30 20 78 e4 78 20 78 c4 78 20 31 20  x} {0 x.x x.x 1 
05e0: 78 f6 78 20 78 d6 78 20 32 20 78 fc 78 20 78 dc  x.x x.x 2 x.x x.
05f0: 78 7d 0a 0a 23 20 30 78 30 30 44 46 20 69 73 20  x}..# 0x00DF is 
0600: 61 20 73 6d 61 6c 6c 20 22 73 68 61 72 70 20 73  a small "sharp s
0610: 22 2e 20 30 78 31 45 39 45 20 69 73 20 61 20 63  ". 0x1E9E is a c
0620: 61 70 69 74 61 6c 20 73 68 61 72 70 20 73 2e 0a  apital sharp s..
0630: 64 6f 5f 75 6e 69 63 6f 64 65 5f 74 6f 6b 65 6e  do_unicode_token
0640: 5f 74 65 73 74 20 31 2e 33 20 22 5c 75 44 46 22  _test 1.3 "\uDF"
0650: 20 22 30 20 5c 75 44 46 20 5c 75 44 46 22 0a 64   "0 \uDF \uDF".d
0660: 6f 5f 75 6e 69 63 6f 64 65 5f 74 6f 6b 65 6e 5f  o_unicode_token_
0670: 74 65 73 74 20 31 2e 34 20 22 5c 75 31 45 39 45  test 1.4 "\u1E9E
0680: 22 20 22 30 20 df 20 5c 75 31 45 39 45 22 0a 64  " "0 . \u1E9E".d
0690: 6f 5f 75 6e 69 63 6f 64 65 5f 74 6f 6b 65 6e 5f  o_unicode_token_
06a0: 74 65 73 74 20 31 2e 35 20 22 5c 75 31 45 39 45  test 1.5 "\u1E9E
06b0: 22 20 22 30 20 5c 75 44 46 20 5c 75 31 45 39 45  " "0 \uDF \u1E9E
06c0: 22 0a 0a 64 6f 5f 75 6e 69 63 6f 64 65 5f 74 6f  "..do_unicode_to
06d0: 6b 65 6e 5f 74 65 73 74 20 31 2e 36 20 22 54 68  ken_test 1.6 "Th
06e0: 65 20 71 75 69 63 6b 20 62 72 6f 77 6e 20 66 6f  e quick brown fo
06f0: 78 22 20 7b 0a 20 20 30 20 74 68 65 20 54 68 65  x" {.  0 the The
0700: 20 31 20 71 75 69 63 6b 20 71 75 69 63 6b 20 32   1 quick quick 2
0710: 20 62 72 6f 77 6e 20 62 72 6f 77 6e 20 33 20 66   brown brown 3 f
0720: 6f 78 20 66 6f 78 0a 7d 0a 64 6f 5f 75 6e 69 63  ox fox.}.do_unic
0730: 6f 64 65 5f 74 6f 6b 65 6e 5f 74 65 73 74 20 31  ode_token_test 1
0740: 2e 37 20 22 54 68 65 5c 75 30 30 62 66 71 75 69  .7 "The\u00bfqui
0750: 63 6b 5c 75 32 32 34 65 62 72 6f 77 6e 5c 75 32  ck\u224ebrown\u2
0760: 32 36 33 66 6f 78 22 20 7b 0a 20 20 30 20 74 68  263fox" {.  0 th
0770: 65 20 54 68 65 20 31 20 71 75 69 63 6b 20 71 75  e The 1 quick qu
0780: 69 63 6b 20 32 20 62 72 6f 77 6e 20 62 72 6f 77  ick 2 brown brow
0790: 6e 20 33 20 66 6f 78 20 66 6f 78 0a 7d 0a 0a 64  n 3 fox fox.}..d
07a0: 6f 5f 75 6e 69 63 6f 64 65 5f 74 6f 6b 65 6e 5f  o_unicode_token_
07b0: 74 65 73 74 32 20 31 2e 38 20 20 7b 61 20 42 20  test2 1.8  {a B 
07c0: 63 20 44 7d 20 7b 30 20 61 20 61 20 31 20 62 20  c D} {0 a a 1 b 
07d0: 42 20 32 20 63 20 63 20 33 20 64 20 44 7d 0a 64  B 2 c c 3 d D}.d
07e0: 6f 5f 75 6e 69 63 6f 64 65 5f 74 6f 6b 65 6e 5f  o_unicode_token_
07f0: 74 65 73 74 32 20 31 2e 39 20 20 7b c4 20 d6 20  test2 1.9  {. . 
0800: dc 7d 20 7b 30 20 61 20 c4 20 31 20 6f 20 d6 20  .} {0 a . 1 o . 
0810: 32 20 75 20 dc 7d 0a 64 6f 5f 75 6e 69 63 6f 64  2 u .}.do_unicod
0820: 65 5f 74 6f 6b 65 6e 5f 74 65 73 74 32 20 31 2e  e_token_test2 1.
0830: 31 30 20 7b 78 c4 78 20 78 d6 78 20 78 dc 78 7d  10 {x.x x.x x.x}
0840: 20 7b 30 20 78 61 78 20 78 c4 78 20 31 20 78 6f   {0 xax x.x 1 xo
0850: 78 20 78 d6 78 20 32 20 78 75 78 20 78 dc 78 7d  x x.x 2 xux x.x}
0860: 0a 0a 23 20 43 68 65 63 6b 20 74 68 61 74 20 64  ..# Check that d
0870: 69 61 63 72 69 74 69 63 73 20 61 72 65 20 72 65  iacritics are re
0880: 6d 6f 76 65 64 20 69 66 20 72 65 6d 6f 76 65 5f  moved if remove_
0890: 64 69 61 63 72 69 74 69 63 73 3d 31 20 69 73 20  diacritics=1 is 
08a0: 73 70 65 63 69 66 69 65 64 2e 0a 23 20 41 6e 64  specified..# And
08b0: 20 74 68 61 74 20 74 68 65 79 20 64 6f 20 6e 6f   that they do no
08c0: 74 20 62 72 65 61 6b 20 74 6f 6b 65 6e 73 2e 0a  t break tokens..
08d0: 64 6f 5f 75 6e 69 63 6f 64 65 5f 74 6f 6b 65 6e  do_unicode_token
08e0: 5f 74 65 73 74 32 20 31 2e 31 30 20 22 78 78 5c  _test2 1.10 "xx\
08f0: 75 30 33 30 31 78 78 22 20 22 30 20 78 78 78 78  u0301xx" "0 xxxx
0900: 20 78 78 5c 75 33 30 31 78 78 22 0a 0a 23 2d 2d   xx\u301xx"..#--
0910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0950: 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 73 65 74 20 64 6f  -------.#.set do
0960: 63 73 20 5b 6c 69 73 74 20 7b 0a 20 20 45 6e 68  cs [list {.  Enh
0970: 61 6e 63 65 20 74 68 65 20 49 4e 53 45 52 54 20  ance the INSERT 
0980: 73 79 6e 74 61 78 20 74 6f 20 61 6c 6c 6f 77 20  syntax to allow 
0990: 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 74 6f  multiple rows to
09a0: 20 62 65 20 69 6e 73 65 72 74 65 64 20 76 69 61   be inserted via
09b0: 20 74 68 65 0a 20 20 56 41 4c 55 45 53 20 63 6c   the.  VALUES cl
09c0: 61 75 73 65 2e 0a 7d 20 7b 0a 20 20 45 6e 68 61  ause..} {.  Enha
09d0: 6e 63 65 20 74 68 65 20 43 52 45 41 54 45 20 56  nce the CREATE V
09e0: 49 52 54 55 41 4c 20 54 41 42 4c 45 20 63 6f 6d  IRTUAL TABLE com
09f0: 6d 61 6e 64 20 74 6f 20 73 75 70 70 6f 72 74 20  mand to support 
0a00: 74 68 65 20 49 46 20 4e 4f 54 20 45 58 49 53 54  the IF NOT EXIST
0a10: 53 20 63 6c 61 75 73 65 2e 0a 7d 20 7b 0a 20 20  S clause..} {.  
0a20: 41 64 64 65 64 20 74 68 65 20 73 71 6c 69 74 65  Added the sqlite
0a30: 33 5f 73 74 72 69 63 6d 70 28 29 20 69 6e 74 65  3_stricmp() inte
0a40: 72 66 61 63 65 20 61 73 20 61 20 63 6f 75 6e 74  rface as a count
0a50: 65 72 70 61 72 74 20 74 6f 20 73 71 6c 69 74 65  erpart to sqlite
0a60: 33 5f 73 74 72 6e 69 63 6d 70 28 29 2e 0a 7d 20  3_strnicmp()..} 
0a70: 7b 0a 20 20 41 64 64 65 64 20 74 68 65 20 73 71  {.  Added the sq
0a80: 6c 69 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c  lite3_db_readonl
0a90: 79 28 29 20 69 6e 74 65 72 66 61 63 65 2e 0a 7d  y() interface..}
0aa0: 20 7b 0a 20 20 41 64 64 65 64 20 74 68 65 20 53   {.  Added the S
0ab0: 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 52 41 47  QLITE_FCNTL_PRAG
0ac0: 4d 41 20 66 69 6c 65 20 63 6f 6e 74 72 6f 6c 2c  MA file control,
0ad0: 20 67 69 76 69 6e 67 20 56 46 53 20 69 6d 70 6c   giving VFS impl
0ae0: 65 6d 65 6e 74 61 74 69 6f 6e 73 20 74 68 65 0a  ementations the.
0af0: 20 20 61 62 69 6c 69 74 79 20 74 6f 20 61 64 64    ability to add
0b00: 20 6e 65 77 20 50 52 41 47 4d 41 20 73 74 61 74   new PRAGMA stat
0b10: 65 6d 65 6e 74 73 20 6f 72 20 74 6f 20 6f 76 65  ements or to ove
0b20: 72 72 69 64 65 20 62 75 69 6c 74 2d 69 6e 20 50  rride built-in P
0b30: 52 41 47 4d 41 73 2e 20 20 0a 7d 20 7b 0a 20 20  RAGMAs.  .} {.  
0b40: 51 75 65 72 69 65 73 20 6f 66 20 74 68 65 20 66  Queries of the f
0b50: 6f 72 6d 3a 20 22 53 45 4c 45 43 54 20 6d 61 78  orm: "SELECT max
0b60: 28 78 29 2c 20 79 20 46 52 4f 4d 20 74 61 62 6c  (x), y FROM tabl
0b70: 65 22 20 72 65 74 75 72 6e 73 20 74 68 65 20 76  e" returns the v
0b80: 61 6c 75 65 20 6f 66 20 79 20 6f 6e 0a 20 20 74  alue of y on.  t
0b90: 68 65 20 73 61 6d 65 20 72 6f 77 20 74 68 61 74  he same row that
0ba0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6d 61   contains the ma
0bb0: 78 69 6d 75 6d 20 78 20 76 61 6c 75 65 2e 0a 7d  ximum x value..}
0bc0: 20 7b 0a 20 20 41 64 64 65 64 20 73 75 70 70 6f   {.  Added suppo
0bd0: 72 74 20 66 6f 72 20 74 68 65 20 46 54 53 34 20  rt for the FTS4 
0be0: 6c 61 6e 67 75 61 67 65 69 64 20 6f 70 74 69 6f  languageid optio
0bf0: 6e 2e 0a 7d 20 7b 0a 20 20 44 6f 63 75 6d 65 6e  n..} {.  Documen
0c00: 74 65 64 20 73 75 70 70 6f 72 74 20 66 6f 72 20  ted support for 
0c10: 74 68 65 20 46 54 53 34 20 63 6f 6e 74 65 6e 74  the FTS4 content
0c20: 20 6f 70 74 69 6f 6e 2e 20 54 68 69 73 20 66 65   option. This fe
0c30: 61 74 75 72 65 20 68 61 73 20 61 63 74 75 61 6c  ature has actual
0c40: 6c 79 0a 20 20 62 65 65 6e 20 69 6e 20 74 68 65  ly.  been in the
0c50: 20 63 6f 64 65 20 73 69 6e 63 65 20 76 65 72 73   code since vers
0c60: 69 6f 6e 20 33 2e 37 2e 39 20 62 75 74 20 69 73  ion 3.7.9 but is
0c70: 20 6f 6e 6c 79 20 6e 6f 77 20 63 6f 6e 73 69 64   only now consid
0c80: 65 72 65 64 20 74 6f 20 62 65 0a 20 20 6f 66 66  ered to be.  off
0c90: 69 63 69 61 6c 6c 79 20 73 75 70 70 6f 72 74 65  icially supporte
0ca0: 64 2e 20 20 0a 7d 20 7b 0a 20 20 50 65 6e 64 69  d.  .} {.  Pendi
0cb0: 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20 6e 6f  ng statements no
0cc0: 20 6c 6f 6e 67 65 72 20 62 6c 6f 63 6b 20 52 4f   longer block RO
0cd0: 4c 4c 42 41 43 4b 2e 20 49 6e 73 74 65 61 64 2c  LLBACK. Instead,
0ce0: 20 74 68 65 20 70 65 6e 64 69 6e 67 20 73 74 61   the pending sta
0cf0: 74 65 6d 65 6e 74 0a 20 20 77 69 6c 6c 20 72 65  tement.  will re
0d00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52  turn SQLITE_ABOR
0d10: 54 20 75 70 6f 6e 20 6e 65 78 74 20 61 63 63 65  T upon next acce
0d20: 73 73 20 61 66 74 65 72 20 74 68 65 20 52 4f 4c  ss after the ROL
0d30: 4c 42 41 43 4b 2e 20 20 0a 7d 20 7b 0a 20 20 49  LBACK.  .} {.  I
0d40: 6d 70 72 6f 76 65 6d 65 6e 74 73 20 74 6f 20 74  mprovements to t
0d50: 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20 43  he handling of C
0d60: 53 56 20 69 6e 70 75 74 73 20 69 6e 20 74 68 65  SV inputs in the
0d70: 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 73 68   command-line sh
0d80: 65 6c 6c 0a 7d 20 7b 0a 20 20 46 69 78 20 61 20  ell.} {.  Fix a 
0d90: 62 75 67 20 69 6e 74 72 6f 64 75 63 65 64 20 69  bug introduced i
0da0: 6e 20 76 65 72 73 69 6f 6e 20 33 2e 37 2e 31 30  n version 3.7.10
0db0: 20 74 68 61 74 20 6d 69 67 68 74 20 63 61 75 73   that might caus
0dc0: 65 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 74 6f  e a LEFT JOIN to
0dd0: 20 62 65 0a 20 20 69 6e 63 6f 72 72 65 63 74 6c   be.  incorrectl
0de0: 79 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  y converted into
0df0: 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 20 69   an INNER JOIN i
0e00: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
0e10: 73 65 20 69 6e 64 65 78 61 62 6c 65 20 74 65 72  se indexable ter
0e20: 6d 73 0a 20 20 63 6f 6e 6e 65 63 74 65 64 20 62  ms.  connected b
0e30: 79 20 4f 52 2e 20 20 0a 7d 5d 0a 0a 73 65 74 20  y OR.  .}]..set 
0e40: 6d 61 70 28 61 29 20 5b 6c 69 73 74 20 22 5c 75  map(a) [list "\u
0e50: 30 30 43 34 22 20 22 5c 75 30 30 45 34 22 5d 20  00C4" "\u00E4"] 
0e60: 20 3b 20 23 20 4c 41 54 49 4e 20 4c 45 54 54 45   ; # LATIN LETTE
0e70: 52 20 41 20 57 49 54 48 20 44 49 41 45 52 45 53  R A WITH DIAERES
0e80: 49 53 0a 73 65 74 20 6d 61 70 28 65 29 20 5b 6c  IS.set map(e) [l
0e90: 69 73 74 20 22 5c 75 30 30 43 42 22 20 22 5c 75  ist "\u00CB" "\u
0ea0: 30 30 45 42 22 5d 20 20 3b 20 23 20 4c 41 54 49  00EB"]  ; # LATI
0eb0: 4e 20 4c 45 54 54 45 52 20 45 20 57 49 54 48 20  N LETTER E WITH 
0ec0: 44 49 41 45 52 45 53 49 53 0a 73 65 74 20 6d 61  DIAERESIS.set ma
0ed0: 70 28 69 29 20 5b 6c 69 73 74 20 22 5c 75 30 30  p(i) [list "\u00
0ee0: 43 46 22 20 22 5c 75 30 30 45 46 22 5d 20 20 3b  CF" "\u00EF"]  ;
0ef0: 20 23 20 4c 41 54 49 4e 20 4c 45 54 54 45 52 20   # LATIN LETTER 
0f00: 49 20 57 49 54 48 20 44 49 41 45 52 45 53 49 53  I WITH DIAERESIS
0f10: 0a 73 65 74 20 6d 61 70 28 6f 29 20 5b 6c 69 73  .set map(o) [lis
0f20: 74 20 22 5c 75 30 30 44 36 22 20 22 5c 75 30 30  t "\u00D6" "\u00
0f30: 46 36 22 5d 20 20 3b 20 23 20 4c 41 54 49 4e 20  F6"]  ; # LATIN 
0f40: 4c 45 54 54 45 52 20 4f 20 57 49 54 48 20 44 49  LETTER O WITH DI
0f50: 41 45 52 45 53 49 53 0a 73 65 74 20 6d 61 70 28  AERESIS.set map(
0f60: 75 29 20 5b 6c 69 73 74 20 22 5c 75 30 30 44 43  u) [list "\u00DC
0f70: 22 20 22 5c 75 30 30 46 43 22 5d 20 20 3b 20 23  " "\u00FC"]  ; #
0f80: 20 4c 41 54 49 4e 20 4c 45 54 54 45 52 20 55 20   LATIN LETTER U 
0f90: 57 49 54 48 20 44 49 41 45 52 45 53 49 53 0a 73  WITH DIAERESIS.s
0fa0: 65 74 20 6d 61 70 28 79 29 20 5b 6c 69 73 74 20  et map(y) [list 
0fb0: 22 5c 75 30 31 37 38 22 20 22 5c 75 30 30 46 46  "\u0178" "\u00FF
0fc0: 22 5d 20 20 3b 20 23 20 4c 41 54 49 4e 20 4c 45  "]  ; # LATIN LE
0fd0: 54 54 45 52 20 59 20 57 49 54 48 20 44 49 41 45  TTER Y WITH DIAE
0fe0: 52 45 53 49 53 0a 73 65 74 20 6d 61 70 28 68 29  RESIS.set map(h)
0ff0: 20 5b 6c 69 73 74 20 22 5c 75 31 45 32 36 22 20   [list "\u1E26" 
1000: 22 5c 75 31 45 32 37 22 5d 20 20 3b 20 23 20 4c  "\u1E27"]  ; # L
1010: 41 54 49 4e 20 4c 45 54 54 45 52 20 48 20 57 49  ATIN LETTER H WI
1020: 54 48 20 44 49 41 45 52 45 53 49 53 0a 73 65 74  TH DIAERESIS.set
1030: 20 6d 61 70 28 77 29 20 5b 6c 69 73 74 20 22 5c   map(w) [list "\
1040: 75 31 45 38 34 22 20 22 5c 75 31 45 38 35 22 5d  u1E84" "\u1E85"]
1050: 20 20 3b 20 23 20 4c 41 54 49 4e 20 4c 45 54 54    ; # LATIN LETT
1060: 45 52 20 57 20 57 49 54 48 20 44 49 41 45 52 45  ER W WITH DIAERE
1070: 53 49 53 0a 73 65 74 20 6d 61 70 28 78 29 20 5b  SIS.set map(x) [
1080: 6c 69 73 74 20 22 5c 75 31 45 38 43 22 20 22 5c  list "\u1E8C" "\
1090: 75 31 45 38 44 22 5d 20 20 3b 20 23 20 4c 41 54  u1E8D"]  ; # LAT
10a0: 49 4e 20 4c 45 54 54 45 52 20 58 20 57 49 54 48  IN LETTER X WITH
10b0: 20 44 49 41 45 52 45 53 49 53 0a 66 6f 72 65 61   DIAERESIS.forea
10c0: 63 68 20 6b 20 5b 61 72 72 61 79 20 6e 61 6d 65  ch k [array name
10d0: 73 20 6d 61 70 5d 20 7b 0a 20 20 6c 61 70 70 65  s map] {.  lappe
10e0: 6e 64 20 6d 61 70 70 69 6e 67 73 20 5b 73 74 72  nd mappings [str
10f0: 69 6e 67 20 74 6f 75 70 70 65 72 20 24 6b 5d 20  ing toupper $k] 
1100: 5b 6c 69 6e 64 65 78 20 24 6d 61 70 28 24 6b 29  [lindex $map($k)
1110: 20 30 5d 20 0a 20 20 6c 61 70 70 65 6e 64 20 6d   0] .  lappend m
1120: 61 70 70 69 6e 67 73 20 24 6b 20 5b 6c 69 6e 64  appings $k [lind
1130: 65 78 20 24 6d 61 70 28 24 6b 29 20 31 5d 0a 7d  ex $map($k) 1].}
1140: 0a 70 72 6f 63 20 6d 61 70 64 6f 63 20 7b 64 6f  .proc mapdoc {do
1150: 63 7d 20 7b 20 0a 20 20 73 65 74 20 64 6f 63 20  c} { .  set doc 
1160: 5b 72 65 67 73 75 62 20 2d 61 6c 6c 20 7b 5b 5b  [regsub -all {[[
1170: 3a 73 70 61 63 65 3a 5d 5d 2b 7d 20 24 64 6f 63  :space:]]+} $doc
1180: 20 22 20 22 5d 0a 20 20 73 74 72 69 6e 67 20 6d   " "].  string m
1190: 61 70 20 24 3a 3a 6d 61 70 70 69 6e 67 73 20 5b  ap $::mappings [
11a0: 73 74 72 69 6e 67 20 74 72 69 6d 20 24 64 6f 63  string trim $doc
11b0: 5d 20 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 32 2e  ] .}..do_test 2.
11c0: 30 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  0 {.  execsql { 
11d0: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
11e0: 41 42 4c 45 20 74 32 20 55 53 49 4e 47 20 66 74  ABLE t2 USING ft
11f0: 73 34 28 74 6f 6b 65 6e 69 7a 65 3d 75 6e 69 63  s4(tokenize=unic
1200: 6f 64 65 36 31 2c 20 78 29 3b 20 7d 0a 20 20 66  ode61, x); }.  f
1210: 6f 72 65 61 63 68 20 64 6f 63 20 24 64 6f 63 73  oreach doc $docs
1220: 20 7b 0a 20 20 20 20 73 65 74 20 64 20 5b 6d 61   {.    set d [ma
1230: 70 64 6f 63 20 24 64 6f 63 5d 0a 20 20 20 20 65  pdoc $doc].    e
1240: 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  xecsql { INSERT 
1250: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 24  INTO t2 VALUES($
1260: 64 29 20 7d 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64  d) }.  }.} {}..d
1270: 6f 5f 74 65 73 74 20 32 2e 31 20 7b 0a 20 20 73  o_test 2.1 {.  s
1280: 65 74 20 71 20 5b 6d 61 70 64 6f 63 20 22 72 6f  et q [mapdoc "ro
1290: 77 22 5d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  w"].  execsql { 
12a0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
12b0: 20 57 48 45 52 45 20 74 32 20 4d 41 54 43 48 20   WHERE t2 MATCH 
12c0: 24 71 20 7d 0a 7d 20 5b 6c 69 73 74 20 5b 6d 61  $q }.} [list [ma
12d0: 70 64 6f 63 20 7b 0a 20 20 51 75 65 72 69 65 73  pdoc {.  Queries
12e0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 22 53   of the form: "S
12f0: 45 4c 45 43 54 20 6d 61 78 28 78 29 2c 20 79 20  ELECT max(x), y 
1300: 46 52 4f 4d 20 74 61 62 6c 65 22 20 72 65 74 75  FROM table" retu
1310: 72 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66  rns the value of
1320: 20 79 20 6f 6e 0a 20 20 74 68 65 20 73 61 6d 65   y on.  the same
1330: 20 72 6f 77 20 74 68 61 74 20 63 6f 6e 74 61 69   row that contai
1340: 6e 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 78  ns the maximum x
1350: 20 76 61 6c 75 65 2e 0a 7d 5d 5d 0a 0a 66 6f 72   value..}]]..for
1360: 65 61 63 68 20 7b 74 6e 20 71 75 65 72 79 20 73  each {tn query s
1370: 6e 69 70 70 65 74 7d 20 7b 0a 20 20 32 20 22 72  nippet} {.  2 "r
1380: 6f 77 22 20 7b 0a 20 20 20 20 20 2e 2e 2e 72 65  ow" {.     ...re
1390: 74 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65 20  turns the value 
13a0: 6f 66 20 79 20 6f 6e 20 74 68 65 20 73 61 6d 65  of y on the same
13b0: 20 5b 72 6f 77 5d 20 74 68 61 74 20 63 6f 6e 74   [row] that cont
13c0: 61 69 6e 73 20 0a 20 20 20 20 20 74 68 65 20 6d  ains .     the m
13d0: 61 78 69 6d 75 6d 20 78 20 76 61 6c 75 65 2e 0a  aximum x value..
13e0: 20 20 7d 0a 20 20 33 20 22 52 4f 57 22 20 7b 0a    }.  3 "ROW" {.
13f0: 20 20 20 20 20 2e 2e 2e 72 65 74 75 72 6e 73 20       ...returns 
1400: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 79 20 6f  the value of y o
1410: 6e 20 74 68 65 20 73 61 6d 65 20 5b 72 6f 77 5d  n the same [row]
1420: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 0a   that contains .
1430: 20 20 20 20 20 74 68 65 20 6d 61 78 69 6d 75 6d       the maximum
1440: 20 78 20 76 61 6c 75 65 2e 0a 20 20 7d 0a 20 20   x value..  }.  
1450: 34 20 22 72 6f 6c 6c 62 61 63 6b 22 20 7b 0a 20  4 "rollback" {. 
1460: 20 20 20 20 2e 2e 2e 5b 52 4f 4c 4c 42 41 43 4b      ...[ROLLBACK
1470: 5d 2e 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20  ]. Instead, the 
1480: 70 65 6e 64 69 6e 67 20 73 74 61 74 65 6d 65 6e  pending statemen
1490: 74 0a 20 20 20 20 20 77 69 6c 6c 20 72 65 74 75  t.     will retu
14a0: 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 20  rn SQLITE_ABORT 
14b0: 75 70 6f 6e 20 6e 65 78 74 20 61 63 63 65 73 73  upon next access
14c0: 20 61 66 74 65 72 20 74 68 65 20 5b 52 4f 4c 4c   after the [ROLL
14d0: 42 41 43 4b 5d 2e 0a 20 20 7d 0a 20 20 35 20 22  BACK]..  }.  5 "
14e0: 72 4f 6c 6c 62 61 63 6b 22 20 7b 0a 20 20 20 20  rOllback" {.    
14f0: 20 2e 2e 2e 5b 52 4f 4c 4c 42 41 43 4b 5d 2e 20   ...[ROLLBACK]. 
1500: 49 6e 73 74 65 61 64 2c 20 74 68 65 20 70 65 6e  Instead, the pen
1510: 64 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 0a 20  ding statement. 
1520: 20 20 20 20 77 69 6c 6c 20 72 65 74 75 72 6e 20      will return 
1530: 53 51 4c 49 54 45 5f 41 42 4f 52 54 20 75 70 6f  SQLITE_ABORT upo
1540: 6e 20 6e 65 78 74 20 61 63 63 65 73 73 20 61 66  n next access af
1550: 74 65 72 20 74 68 65 20 5b 52 4f 4c 4c 42 41 43  ter the [ROLLBAC
1560: 4b 5d 2e 0a 20 20 7d 0a 20 20 36 20 22 6c 61 6e  K]..  }.  6 "lan
1570: 67 2a 22 20 7b 0a 20 20 20 20 20 41 64 64 65 64  g*" {.     Added
1580: 20 73 75 70 70 6f 72 74 20 66 6f 72 20 74 68 65   support for the
1590: 20 46 54 53 34 20 5b 6c 61 6e 67 75 61 67 65 69   FTS4 [languagei
15a0: 64 5d 20 6f 70 74 69 6f 6e 2e 0a 20 20 7d 0a 7d  d] option..  }.}
15b0: 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 32 2e 24   {.  do_test 2.$
15c0: 74 6e 20 7b 0a 20 20 20 20 73 65 74 20 71 20 5b  tn {.    set q [
15d0: 6d 61 70 64 6f 63 20 24 71 75 65 72 79 5d 0a 20  mapdoc $query]. 
15e0: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c     execsql { SEL
15f0: 45 43 54 20 73 6e 69 70 70 65 74 28 74 32 2c 20  ECT snippet(t2, 
1600: 27 5b 27 2c 20 27 5d 27 2c 20 27 2e 2e 2e 27 29  '[', ']', '...')
1610: 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 74   FROM t2 WHERE t
1620: 32 20 4d 41 54 43 48 20 24 71 20 7d 0a 20 20 7d  2 MATCH $q }.  }
1630: 20 5b 6c 69 73 74 20 5b 6d 61 70 64 6f 63 20 24   [list [mapdoc $
1640: 73 6e 69 70 70 65 74 5d 5d 0a 7d 0a 0a 23 2d 2d  snippet]].}..#--
1650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1690: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 4d 61 6b 65 20 73  -------.# Make s
16a0: 75 72 65 20 74 68 65 20 75 6e 69 63 6f 64 65 36  ure the unicode6
16b0: 31 20 74 6f 6b 65 6e 69 7a 65 72 20 64 6f 65 73  1 tokenizer does
16c0: 20 6e 6f 74 20 63 72 61 73 68 20 69 66 20 69 74   not crash if it
16d0: 20 69 73 20 70 61 73 73 65 64 20 61 20 0a 23 20   is passed a .# 
16e0: 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 72 65  NULL pointer..re
16f0: 73 65 74 5f 64 62 0a 64 6f 5f 65 78 65 63 73 71  set_db.do_execsq
1700: 6c 5f 74 65 73 74 20 33 2e 31 20 7b 0a 20 20 43  l_test 3.1 {.  C
1710: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
1720: 42 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73  BLE t1 USING fts
1730: 34 28 74 6f 6b 65 6e 69 7a 65 3d 75 6e 69 63 6f  4(tokenize=unico
1740: 64 65 36 31 2c 20 78 2c 20 79 29 3b 0a 20 20 49  de61, x, y);.  I
1750: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
1760: 4c 55 45 53 28 4e 55 4c 4c 2c 20 27 61 20 62 20  LUES(NULL, 'a b 
1770: 63 27 29 3b 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73  c');.}..do_execs
1780: 71 6c 5f 74 65 73 74 20 33 2e 32 20 7b 0a 20 20  ql_test 3.2 {.  
1790: 53 45 4c 45 43 54 20 73 6e 69 70 70 65 74 28 74  SELECT snippet(t
17a0: 31 2c 20 27 5b 27 2c 20 27 5d 27 29 20 46 52 4f  1, '[', ']') FRO
17b0: 4d 20 74 31 20 57 48 45 52 45 20 74 31 20 4d 41  M t1 WHERE t1 MA
17c0: 54 43 48 20 27 62 27 0a 7d 20 7b 7b 61 20 5b 62  TCH 'b'.} {{a [b
17d0: 5d 20 63 7d 7d 0a 0a 64 6f 5f 65 78 65 63 73 71  ] c}}..do_execsq
17e0: 6c 5f 74 65 73 74 20 33 2e 33 20 7b 0a 20 20 42  l_test 3.3 {.  B
17f0: 45 47 49 4e 3b 0a 20 20 44 45 4c 45 54 45 20 46  EGIN;.  DELETE F
1800: 52 4f 4d 20 74 31 3b 0a 20 20 49 4e 53 45 52 54  ROM t1;.  INSERT
1810: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
1820: 27 62 20 62 20 62 20 62 20 62 20 62 20 62 20 62  'b b b b b b b b
1830: 20 62 20 62 20 62 27 2c 20 27 62 20 62 20 62 20   b b b', 'b b b 
1840: 62 20 62 20 62 20 62 20 62 20 62 20 62 20 62 20  b b b b b b b b 
1850: 62 20 62 27 29 3b 0a 20 20 49 4e 53 45 52 54 20  b b');.  INSERT 
1860: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 2a  INTO t1 SELECT *
1870: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 49 4e 53 45   FROM t1;.  INSE
1880: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
1890: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 49  T * FROM t1;.  I
18a0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
18b0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a  LECT * FROM t1;.
18c0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
18d0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
18e0: 31 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  1;.  INSERT INTO
18f0: 20 74 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   t1 SELECT * FRO
1900: 4d 20 74 31 3b 0a 20 20 49 4e 53 45 52 54 20 49  M t1;.  INSERT I
1910: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 2a 20  NTO t1 SELECT * 
1920: 46 52 4f 4d 20 74 31 3b 0a 20 20 49 4e 53 45 52  FROM t1;.  INSER
1930: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
1940: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 49 4e   * FROM t1;.  IN
1950: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
1960: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20  ECT * FROM t1;. 
1970: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
1980: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
1990: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
19a0: 74 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  t1 SELECT * FROM
19b0: 20 74 31 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e   t1;.  INSERT IN
19c0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 2a 20 46  TO t1 SELECT * F
19d0: 52 4f 4d 20 74 31 3b 0a 20 20 49 4e 53 45 52 54  ROM t1;.  INSERT
19e0: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
19f0: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 49 4e 53  * FROM t1;.  INS
1a00: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
1a10: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT * FROM t1;.  
1a20: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
1a30: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
1a40: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
1a50: 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  1 SELECT * FROM 
1a60: 74 31 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  t1;.  INSERT INT
1a70: 4f 20 74 31 20 53 45 4c 45 43 54 20 2a 20 46 52  O t1 SELECT * FR
1a80: 4f 4d 20 74 31 3b 0a 20 20 49 4e 53 45 52 54 20  OM t1;.  INSERT 
1a90: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
1aa0: 61 20 62 20 63 27 2c 20 4e 55 4c 4c 29 3b 0a 20  a b c', NULL);. 
1ab0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
1ac0: 56 41 4c 55 45 53 28 27 61 20 78 20 63 27 2c 20  VALUES('a x c', 
1ad0: 4e 55 4c 4c 29 3b 0a 20 20 43 4f 4d 4d 49 54 3b  NULL);.  COMMIT;
1ae0: 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  .}..do_execsql_t
1af0: 65 73 74 20 33 2e 34 20 7b 0a 20 20 53 45 4c 45  est 3.4 {.  SELE
1b00: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
1b10: 52 45 20 74 31 20 4d 41 54 43 48 20 27 61 20 62  RE t1 MATCH 'a b
1b20: 27 3b 0a 7d 20 7b 7b 61 20 62 20 63 7d 20 7b 7d  ';.} {{a b c} {}
1b30: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
1b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a  -------------.#.
1b80: 72 65 73 65 74 5f 64 62 0a 0a 64 6f 5f 74 65 73  reset_db..do_tes
1b90: 74 20 34 2e 31 20 7b 0a 20 20 73 65 74 20 61 20  t 4.1 {.  set a 
1ba0: 22 61 62 63 5c 75 46 46 46 45 64 65 66 22 0a 20  "abc\uFFFEdef". 
1bb0: 20 73 65 74 20 62 20 22 61 62 63 5c 75 44 38 30   set b "abc\uD80
1bc0: 30 64 65 66 22 0a 20 20 73 65 74 20 63 20 22 5c  0def".  set c "\
1bd0: 75 46 46 46 45 64 65 66 22 0a 20 20 73 65 74 20  uFFFEdef".  set 
1be0: 64 20 22 5c 75 44 38 30 30 64 65 66 22 0a 20 20  d "\uD800def".  
1bf0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
1c00: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
1c10: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 34  LE t1 USING fts4
1c20: 28 74 6f 6b 65 6e 69 7a 65 3d 75 6e 69 63 6f 64  (tokenize=unicod
1c30: 65 36 31 2c 20 78 29 3b 0a 20 20 20 20 49 4e 53  e61, x);.    INS
1c40: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
1c50: 45 53 28 24 61 29 3b 0a 20 20 20 20 49 4e 53 45  ES($a);.    INSE
1c60: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
1c70: 53 28 24 62 29 3b 0a 20 20 20 20 49 4e 53 45 52  S($b);.    INSER
1c80: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
1c90: 28 24 63 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  ($c);.    INSERT
1ca0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
1cb0: 24 64 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 64  $d);.  }.} {}..d
1cc0: 6f 5f 74 65 73 74 20 34 2e 32 20 7b 0a 20 20 73  o_test 4.2 {.  s
1cd0: 65 74 20 61 20 5b 62 69 6e 61 72 79 20 66 6f 72  et a [binary for
1ce0: 6d 61 74 20 63 2a 20 7b 30 78 36 31 20 30 78 46  mat c* {0x61 0xF
1cf0: 37 20 30 78 42 46 20 30 78 42 46 20 30 78 42 46  7 0xBF 0xBF 0xBF
1d00: 20 30 78 36 32 7d 5d 0a 20 20 73 65 74 20 62 20   0x62}].  set b 
1d10: 5b 62 69 6e 61 72 79 20 66 6f 72 6d 61 74 20 63  [binary format c
1d20: 2a 20 7b 30 78 36 31 20 30 78 46 37 20 30 78 42  * {0x61 0xF7 0xB
1d30: 46 20 30 78 42 46 20 30 78 42 46 20 30 78 42 46  F 0xBF 0xBF 0xBF
1d40: 20 30 78 36 32 7d 5d 0a 20 20 73 65 74 20 63 20   0x62}].  set c 
1d50: 5b 62 69 6e 61 72 79 20 66 6f 72 6d 61 74 20 63  [binary format c
1d60: 2a 20 7b 30 78 36 31 20 30 78 46 37 20 30 78 42  * {0x61 0xF7 0xB
1d70: 46 20 30 78 42 46 20 30 78 42 46 20 30 78 42 46  F 0xBF 0xBF 0xBF
1d80: 20 30 78 42 46 20 30 78 36 32 7d 5d 0a 20 20 73   0xBF 0x62}].  s
1d90: 65 74 20 64 20 5b 62 69 6e 61 72 79 20 66 6f 72  et d [binary for
1da0: 6d 61 74 20 63 2a 20 7b 30 78 36 31 20 30 78 46  mat c* {0x61 0xF
1db0: 37 20 30 78 42 46 20 30 78 42 46 20 30 78 42 46  7 0xBF 0xBF 0xBF
1dc0: 20 30 78 42 46 20 30 78 42 46 20 30 78 42 46 20   0xBF 0xBF 0xBF 
1dd0: 30 78 36 32 7d 5d 0a 20 20 65 78 65 63 73 71 6c  0x62}].  execsql
1de0: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
1df0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 24 61 29  TO t1 VALUES($a)
1e00: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
1e10: 4f 20 74 31 20 56 41 4c 55 45 53 28 24 62 29 3b  O t1 VALUES($b);
1e20: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
1e30: 20 74 31 20 56 41 4c 55 45 53 28 24 63 29 3b 0a   t1 VALUES($c);.
1e40: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1e50: 74 31 20 56 41 4c 55 45 53 28 24 64 29 3b 0a 20  t1 VALUES($d);. 
1e60: 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74   }.} {}..do_test
1e70: 20 34 2e 33 20 7b 0a 20 20 73 65 74 20 61 20 5b   4.3 {.  set a [
1e80: 62 69 6e 61 72 79 20 66 6f 72 6d 61 74 20 63 2a  binary format c*
1e90: 20 7b 30 78 46 37 20 30 78 42 46 20 30 78 42 46   {0xF7 0xBF 0xBF
1ea0: 20 30 78 42 46 7d 5d 0a 20 20 73 65 74 20 62 20   0xBF}].  set b 
1eb0: 5b 62 69 6e 61 72 79 20 66 6f 72 6d 61 74 20 63  [binary format c
1ec0: 2a 20 7b 30 78 46 37 20 30 78 42 46 20 30 78 42  * {0xF7 0xBF 0xB
1ed0: 46 20 30 78 42 46 20 30 78 42 46 7d 5d 0a 20 20  F 0xBF 0xBF}].  
1ee0: 73 65 74 20 63 20 5b 62 69 6e 61 72 79 20 66 6f  set c [binary fo
1ef0: 72 6d 61 74 20 63 2a 20 7b 30 78 46 37 20 30 78  rmat c* {0xF7 0x
1f00: 42 46 20 30 78 42 46 20 30 78 42 46 20 30 78 42  BF 0xBF 0xBF 0xB
1f10: 46 20 30 78 42 46 7d 5d 0a 20 20 73 65 74 20 64  F 0xBF}].  set d
1f20: 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d 61 74 20   [binary format 
1f30: 63 2a 20 7b 30 78 46 37 20 30 78 42 46 20 30 78  c* {0xF7 0xBF 0x
1f40: 42 46 20 30 78 42 46 20 30 78 42 46 20 30 78 42  BF 0xBF 0xBF 0xB
1f50: 46 20 30 78 42 46 7d 5d 0a 20 20 65 78 65 63 73  F 0xBF}].  execs
1f60: 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20  ql {.    INSERT 
1f70: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 24  INTO t1 VALUES($
1f80: 61 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  a);.    INSERT I
1f90: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 24 62  NTO t1 VALUES($b
1fa0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
1fb0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 24 63 29  TO t1 VALUES($c)
1fc0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
1fd0: 4f 20 74 31 20 56 41 4c 55 45 53 28 24 64 29 3b  O t1 VALUES($d);
1fe0: 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d 2d  .  }.} {}..#----
1ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2030: 2d 2d 2d 2d 2d 0a 0a 64 6f 5f 75 6e 69 63 6f 64  -----..do_unicod
2040: 65 5f 74 6f 6b 65 6e 5f 74 65 73 74 33 20 35 2e  e_token_test3 5.
2050: 31 20 7b 74 6f 6b 65 6e 63 68 61 72 73 3d 7d 20  1 {tokenchars=} 
2060: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65  {.  sqlite3_rese
2070: 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  t sqlite3_column
2080: 5f 69 6e 74 0a 7d 20 7b 0a 20 20 30 20 73 71 6c  _int.} {.  0 sql
2090: 69 74 65 33 20 73 71 6c 69 74 65 33 20 0a 20 20  ite3 sqlite3 .  
20a0: 31 20 72 65 73 65 74 20 72 65 73 65 74 20 0a 20  1 reset reset . 
20b0: 20 32 20 73 71 6c 69 74 65 33 20 73 71 6c 69 74   2 sqlite3 sqlit
20c0: 65 33 20 0a 20 20 33 20 63 6f 6c 75 6d 6e 20 63  e3 .  3 column c
20d0: 6f 6c 75 6d 6e 20 0a 20 20 34 20 69 6e 74 20 69  olumn .  4 int i
20e0: 6e 74 0a 7d 0a 0a 64 6f 5f 75 6e 69 63 6f 64 65  nt.}..do_unicode
20f0: 5f 74 6f 6b 65 6e 5f 74 65 73 74 33 20 35 2e 32  _token_test3 5.2
2100: 20 7b 74 6f 6b 65 6e 63 68 61 72 73 3d 5f 7d 20   {tokenchars=_} 
2110: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65  {.  sqlite3_rese
2120: 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  t sqlite3_column
2130: 5f 69 6e 74 0a 7d 20 7b 0a 20 20 30 20 73 71 6c  _int.} {.  0 sql
2140: 69 74 65 33 5f 72 65 73 65 74 20 73 71 6c 69 74  ite3_reset sqlit
2150: 65 33 5f 72 65 73 65 74 20 0a 20 20 31 20 73 71  e3_reset .  1 sq
2160: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
2170: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
2180: 69 6e 74 0a 7d 0a 0a 64 6f 5f 75 6e 69 63 6f 64  int.}..do_unicod
2190: 65 5f 74 6f 6b 65 6e 5f 74 65 73 74 33 20 35 2e  e_token_test3 5.
21a0: 33 20 7b 73 65 70 61 72 61 74 6f 72 73 3d 78 79  3 {separators=xy
21b0: 7a 7d 20 7b 0a 20 20 4c 61 6f 74 69 61 6e 78 68  z} {.  Laotianxh
21c0: 6f 72 73 65 79 72 75 6e 73 7a 66 61 73 74 0a 7d  orseyrunszfast.}
21d0: 20 7b 0a 20 20 30 20 6c 61 6f 74 69 61 6e 20 4c   {.  0 laotian L
21e0: 61 6f 74 69 61 6e 0a 20 20 31 20 68 6f 72 73 65  aotian.  1 horse
21f0: 20 68 6f 72 73 65 0a 20 20 32 20 72 75 6e 73 20   horse.  2 runs 
2200: 72 75 6e 73 0a 20 20 33 20 66 61 73 74 20 66 61  runs.  3 fast fa
2210: 73 74 0a 7d 0a 0a 64 6f 5f 75 6e 69 63 6f 64 65  st.}..do_unicode
2220: 5f 74 6f 6b 65 6e 5f 74 65 73 74 33 20 35 2e 34  _token_test3 5.4
2230: 20 7b 74 6f 6b 65 6e 63 68 61 72 73 3d 78 79 7a   {tokenchars=xyz
2240: 7d 20 7b 0a 20 20 4c 61 6f 74 69 61 6e 78 68 6f  } {.  Laotianxho
2250: 72 73 65 79 72 75 6e 73 7a 66 61 73 74 0a 7d 20  rseyrunszfast.} 
2260: 7b 0a 20 20 30 20 6c 61 6f 74 69 61 6e 78 68 6f  {.  0 laotianxho
2270: 72 73 65 79 72 75 6e 73 7a 66 61 73 74 20 4c 61  rseyrunszfast La
2280: 6f 74 69 61 6e 78 68 6f 72 73 65 79 72 75 6e 73  otianxhorseyruns
2290: 7a 66 61 73 74 0a 7d 0a 0a 64 6f 5f 75 6e 69 63  zfast.}..do_unic
22a0: 6f 64 65 5f 74 6f 6b 65 6e 5f 74 65 73 74 33 20  ode_token_test3 
22b0: 35 2e 35 20 7b 74 6f 6b 65 6e 63 68 61 72 73 3d  5.5 {tokenchars=
22c0: 5f 7d 20 7b 73 65 70 61 72 61 74 6f 72 73 3d 7a  _} {separators=z
22d0: 79 78 7d 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  yx} {.  sqlite3_
22e0: 72 65 73 65 74 78 73 71 6c 69 74 65 33 5f 63 6f  resetxsqlite3_co
22f0: 6c 75 6d 6e 5f 69 6e 74 79 68 6f 6e 64 61 5f 70  lumn_intyhonda_p
2300: 68 61 6e 74 6f 6d 0a 7d 20 7b 0a 20 20 30 20 73  hantom.} {.  0 s
2310: 71 6c 69 74 65 33 5f 72 65 73 65 74 20 73 71 6c  qlite3_reset sql
2320: 69 74 65 33 5f 72 65 73 65 74 20 0a 20 20 31 20  ite3_reset .  1 
2330: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
2340: 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  nt sqlite3_colum
2350: 6e 5f 69 6e 74 0a 20 20 32 20 68 6f 6e 64 61 5f  n_int.  2 honda_
2360: 70 68 61 6e 74 6f 6d 20 68 6f 6e 64 61 5f 70 68  phantom honda_ph
2370: 61 6e 74 6f 6d 0a 7d 0a 0a 64 6f 5f 75 6e 69 63  antom.}..do_unic
2380: 6f 64 65 5f 74 6f 6b 65 6e 5f 74 65 73 74 33 20  ode_token_test3 
2390: 35 2e 36 20 22 73 65 70 61 72 61 74 6f 72 73 3d  5.6 "separators=
23a0: 5c 75 30 35 44 31 22 20 22 61 62 63 5c 75 30 35  \u05D1" "abc\u05
23b0: 44 31 64 65 66 22 20 7b 0a 20 20 30 20 61 62 63  D1def" {.  0 abc
23c0: 20 61 62 63 20 31 20 64 65 66 20 64 65 66 0a 7d   abc 1 def def.}
23d0: 0a 0a 64 6f 5f 75 6e 69 63 6f 64 65 5f 74 6f 6b  ..do_unicode_tok
23e0: 65 6e 5f 74 65 73 74 33 20 35 2e 37 20 20 20 20  en_test3 5.7    
23f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2400: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 22 74 6f           \.  "to
2410: 6b 65 6e 63 68 61 72 73 3d 5c 75 32 34 34 34 5c  kenchars=\u2444\
2420: 75 32 34 34 35 22 20 20 20 20 20 20 20 20 20 20  u2445"          
2430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2440: 20 20 5c 0a 20 20 22 73 65 70 61 72 61 74 6f 72    \.  "separator
2450: 73 3d 5c 75 30 35 44 30 5c 75 30 35 44 31 5c 75  s=\u05D0\u05D1\u
2460: 30 35 44 32 22 20 20 20 20 20 20 20 20 20 20 20  05D2"           
2470: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 22             \.  "
2480: 5c 75 32 34 34 34 66 72 65 5c 75 32 34 34 35 73  \u2444fre\u2445s
2490: 68 5c 75 30 35 44 30 77 61 74 65 72 5c 75 30 35  h\u05D0water\u05
24a0: 44 32 66 69 73 68 2e 5c 75 32 34 34 35 74 69 6d  D2fish.\u2445tim
24b0: 65 72 22 20 5c 0a 20 20 5b 6c 69 73 74 20 20 20  er" \.  [list   
24c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
24f0: 20 20 20 30 20 5c 75 32 34 34 34 66 72 65 5c 75     0 \u2444fre\u
2500: 32 34 34 35 73 68 20 5c 75 32 34 34 34 66 72 65  2445sh \u2444fre
2510: 5c 75 32 34 34 35 73 68 20 20 20 20 20 20 20 20  \u2445sh        
2520: 20 20 20 20 20 20 5c 0a 20 20 20 20 31 20 77 61        \.    1 wa
2530: 74 65 72 20 77 61 74 65 72 20 20 20 20 20 20 20  ter water       
2540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
2560: 0a 20 20 20 20 32 20 66 69 73 68 20 66 69 73 68  .    2 fish fish
2570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2590: 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 33 20          \.    3 
25a0: 5c 75 32 34 34 35 74 69 6d 65 72 20 5c 75 32 34  \u2445timer \u24
25b0: 34 35 74 69 6d 65 72 20 20 20 20 20 20 20 20 20  45timer         
25c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d0: 20 5c 0a 20 20 5d 0a 0a 23 20 43 68 65 63 6b 20   \.  ]..# Check 
25e0: 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 70  that it is not p
25f0: 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20 61  ossible to add a
2600: 20 73 74 61 6e 64 61 6c 6f 6e 65 20 64 69 61 63   standalone diac
2610: 72 69 74 69 63 20 63 6f 64 65 70 6f 69 6e 74 20  ritic codepoint 
2620: 0a 23 20 74 6f 20 65 69 74 68 65 72 20 73 65 70  .# to either sep
2630: 61 72 61 74 6f 72 73 20 6f 72 20 74 6f 6b 65 6e  arators or token
2640: 63 68 61 72 73 2e 0a 64 6f 5f 75 6e 69 63 6f 64  chars..do_unicod
2650: 65 5f 74 6f 6b 65 6e 5f 74 65 73 74 33 20 35 2e  e_token_test3 5.
2660: 38 20 22 73 65 70 61 72 61 74 6f 72 73 3d 5c 75  8 "separators=\u
2670: 30 33 30 31 22 20 5c 0a 20 20 22 68 65 6c 6c 6f  0301" \.  "hello
2680: 5c 75 30 33 30 31 77 6f 72 6c 64 20 5c 75 30 33  \u0301world \u03
2690: 30 31 68 65 6c 6c 6f 77 6f 72 6c 64 22 20 20 20  01helloworld"   
26a0: 20 20 20 20 20 20 20 5c 0a 20 20 22 30 20 68 65         \.  "0 he
26b0: 6c 6c 6f 77 6f 72 6c 64 20 68 65 6c 6c 6f 5c 75  lloworld hello\u
26c0: 30 33 30 31 77 6f 72 6c 64 20 31 20 68 65 6c 6c  0301world 1 hell
26d0: 6f 77 6f 72 6c 64 20 68 65 6c 6c 6f 77 6f 72 6c  oworld helloworl
26e0: 64 22 0a 0a 64 6f 5f 75 6e 69 63 6f 64 65 5f 74  d"..do_unicode_t
26f0: 6f 6b 65 6e 5f 74 65 73 74 33 20 35 2e 39 20 22  oken_test3 5.9 "
2700: 74 6f 6b 65 6e 63 68 61 72 73 3d 5c 75 30 33 30  tokenchars=\u030
2710: 31 22 20 5c 0a 20 20 22 68 65 6c 6c 6f 5c 75 30  1" \.  "hello\u0
2720: 33 30 31 77 6f 72 6c 64 20 5c 75 30 33 30 31 68  301world \u0301h
2730: 65 6c 6c 6f 77 6f 72 6c 64 22 20 20 20 20 20 20  elloworld"      
2740: 20 20 20 20 5c 0a 20 20 22 30 20 68 65 6c 6c 6f      \.  "0 hello
2750: 77 6f 72 6c 64 20 68 65 6c 6c 6f 5c 75 30 33 30  world hello\u030
2760: 31 77 6f 72 6c 64 20 31 20 68 65 6c 6c 6f 77 6f  1world 1 hellowo
2770: 72 6c 64 20 68 65 6c 6c 6f 77 6f 72 6c 64 22 0a  rld helloworld".
2780: 0a 64 6f 5f 75 6e 69 63 6f 64 65 5f 74 6f 6b 65  .do_unicode_toke
2790: 6e 5f 74 65 73 74 33 20 35 2e 31 30 20 22 73 65  n_test3 5.10 "se
27a0: 70 61 72 61 74 6f 72 73 3d 5c 75 30 33 30 31 22  parators=\u0301"
27b0: 20 5c 0a 20 20 22 72 65 6d 6f 76 65 5f 64 69 61   \.  "remove_dia
27c0: 63 72 69 74 69 63 73 3d 30 22 20 20 20 20 20 20  critics=0"      
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e0: 20 20 5c 0a 20 20 22 68 65 6c 6c 6f 5c 75 30 33    \.  "hello\u03
27f0: 30 31 77 6f 72 6c 64 20 5c 75 30 33 30 31 68 65  01world \u0301he
2800: 6c 6c 6f 77 6f 72 6c 64 22 20 20 20 20 20 20 20  lloworld"       
2810: 20 20 20 5c 0a 20 20 22 30 20 68 65 6c 6c 6f 5c     \.  "0 hello\
2820: 75 30 33 30 31 77 6f 72 6c 64 20 68 65 6c 6c 6f  u0301world hello
2830: 5c 75 30 33 30 31 77 6f 72 6c 64 20 31 20 68 65  \u0301world 1 he
2840: 6c 6c 6f 77 6f 72 6c 64 20 68 65 6c 6c 6f 77 6f  lloworld hellowo
2850: 72 6c 64 22 0a 0a 64 6f 5f 75 6e 69 63 6f 64 65  rld"..do_unicode
2860: 5f 74 6f 6b 65 6e 5f 74 65 73 74 33 20 35 2e 31  _token_test3 5.1
2870: 31 20 22 74 6f 6b 65 6e 63 68 61 72 73 3d 5c 75  1 "tokenchars=\u
2880: 30 33 30 31 22 20 5c 0a 20 20 22 72 65 6d 6f 76  0301" \.  "remov
2890: 65 5f 64 69 61 63 72 69 74 69 63 73 3d 30 22 20  e_diacritics=0" 
28a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b0: 20 20 20 20 20 20 20 20 5c 0a 20 20 22 68 65 6c          \.  "hel
28c0: 6c 6f 5c 75 30 33 30 31 77 6f 72 6c 64 20 5c 75  lo\u0301world \u
28d0: 30 33 30 31 68 65 6c 6c 6f 77 6f 72 6c 64 22 20  0301helloworld" 
28e0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 22 30            \.  "0
28f0: 20 68 65 6c 6c 6f 5c 75 30 33 30 31 77 6f 72 6c   hello\u0301worl
2900: 64 20 68 65 6c 6c 6f 5c 75 30 33 30 31 77 6f 72  d hello\u0301wor
2910: 6c 64 20 31 20 68 65 6c 6c 6f 77 6f 72 6c 64 20  ld 1 helloworld 
2920: 68 65 6c 6c 6f 77 6f 72 6c 64 22 0a 0a 0a 23 2d  helloworld"...#-
2930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2970: 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 70 72 6f 63 20 64  --------..proc d
2980: 6f 5f 74 6f 6b 65 6e 69 7a 65 20 7b 74 6f 6b 65  o_tokenize {toke
2990: 6e 69 7a 65 72 20 74 78 74 7d 20 7b 0a 20 20 73  nizer txt} {.  s
29a0: 65 74 20 72 65 73 20 5b 6c 69 73 74 5d 0a 20 20  et res [list].  
29b0: 66 6f 72 65 61 63 68 20 7b 61 20 62 20 63 7d 20  foreach {a b c} 
29c0: 5b 64 62 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20  [db one {SELECT 
29d0: 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f 74  fts3_tokenizer_t
29e0: 65 73 74 28 24 74 6f 6b 65 6e 69 7a 65 72 2c 20  est($tokenizer, 
29f0: 24 74 78 74 29 7d 5d 20 7b 0a 20 20 20 20 6c 61  $txt)}] {.    la
2a00: 70 70 65 6e 64 20 72 65 73 20 24 62 0a 20 20 7d  ppend res $b.  }
2a10: 0a 20 20 73 65 74 20 72 65 73 0a 7d 0a 0a 23 20  .  set res.}..# 
2a20: 41 72 67 75 6d 65 6e 74 20 24 6c 43 6f 64 65 70  Argument $lCodep
2a30: 6f 69 6e 74 20 6d 75 73 74 20 62 65 20 61 20 6c  oint must be a l
2a40: 69 73 74 20 6f 66 20 63 6f 64 65 70 6f 69 6e 74  ist of codepoint
2a50: 73 20 28 69 6e 74 65 67 65 72 73 29 20 74 68 61  s (integers) tha
2a60: 74 20 0a 23 20 63 6f 72 72 65 73 70 6f 6e 64 20  t .# correspond 
2a70: 74 6f 20 77 68 69 74 65 73 70 61 63 65 20 63 68  to whitespace ch
2a80: 61 72 61 63 74 65 72 73 2e 20 54 68 69 73 20 63  aracters. This c
2a90: 6f 6d 6d 61 6e 64 20 63 72 65 61 74 65 73 20 61  ommand creates a
2aa0: 20 73 74 72 69 6e 67 0a 23 20 24 57 20 66 72 6f   string.# $W fro
2ab0: 6d 20 74 68 65 20 63 6f 64 65 70 6f 69 6e 74 73  m the codepoints
2ac0: 2c 20 74 68 65 6e 20 74 6f 6b 65 6e 69 7a 65 73  , then tokenizes
2ad0: 20 22 24 7b 57 7d 68 65 6c 6c 6f 7b 24 57 7d 77   "${W}hello{$W}w
2ae0: 6f 72 6c 64 24 7b 57 7d 22 20 0a 23 20 75 73 69  orld${W}" .# usi
2af0: 6e 67 20 74 6f 6b 65 6e 69 7a 65 72 20 24 74 6f  ng tokenizer $to
2b00: 6b 65 6e 69 7a 65 72 2e 20 54 68 65 20 74 65 73  kenizer. The tes
2b10: 74 20 70 61 73 73 65 73 20 69 66 20 74 68 65 20  t passes if the 
2b20: 74 6f 6b 65 6e 69 7a 65 72 20 73 75 63 63 65 73  tokenizer succes
2b30: 73 66 75 6c 6c 79 0a 23 20 65 78 74 72 61 63 74  sfully.# extract
2b40: 73 20 74 68 65 20 74 77 6f 20 35 20 63 68 61 72  s the two 5 char
2b50: 61 63 74 65 72 20 74 6f 6b 65 6e 73 2e 0a 23 0a  acter tokens..#.
2b60: 70 72 6f 63 20 64 6f 5f 69 73 73 70 61 63 65 5f  proc do_isspace_
2b70: 74 65 73 74 20 7b 74 6e 20 74 6f 6b 65 6e 69 7a  test {tn tokeniz
2b80: 65 72 20 6c 43 70 7d 20 7b 0a 20 20 73 65 74 20  er lCp} {.  set 
2b90: 77 68 69 74 65 73 70 61 63 65 20 5b 66 6f 72 6d  whitespace [form
2ba0: 61 74 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61  at [string repea
2bb0: 74 20 25 63 20 5b 6c 6c 65 6e 67 74 68 20 24 6c  t %c [llength $l
2bc0: 43 70 5d 5d 20 7b 2a 7d 24 6c 43 70 5d 20 0a 20  Cp]] {*}$lCp] . 
2bd0: 20 73 65 74 20 74 78 74 20 22 24 7b 77 68 69 74   set txt "${whit
2be0: 65 73 70 61 63 65 7d 68 65 6c 6c 6f 24 7b 77 68  espace}hello${wh
2bf0: 69 74 65 73 70 61 63 65 7d 77 6f 72 6c 64 24 7b  itespace}world${
2c00: 77 68 69 74 65 73 70 61 63 65 7d 22 0a 20 20 75  whitespace}".  u
2c10: 70 6c 65 76 65 6c 20 5b 6c 69 73 74 20 64 6f 5f  plevel [list do_
2c20: 74 65 73 74 20 24 74 6e 20 5b 6c 69 73 74 20 64  test $tn [list d
2c30: 6f 5f 74 6f 6b 65 6e 69 7a 65 20 24 74 6f 6b 65  o_tokenize $toke
2c40: 6e 69 7a 65 72 20 24 74 78 74 5d 20 7b 68 65 6c  nizer $txt] {hel
2c50: 6c 6f 20 77 6f 72 6c 64 7d 5d 0a 7d 0a 0a 73 65  lo world}].}..se
2c60: 74 20 74 6f 6b 65 6e 69 7a 65 72 73 20 5b 6c 69  t tokenizers [li
2c70: 73 74 20 75 6e 69 63 6f 64 65 36 31 5d 0a 69 66  st unicode61].if
2c80: 63 61 70 61 62 6c 65 20 69 63 75 20 7b 20 6c 61  capable icu { la
2c90: 70 70 65 6e 64 20 74 6f 6b 65 6e 69 7a 65 72 73  ppend tokenizers
2ca0: 20 69 63 75 20 7d 0a 0a 23 20 53 6f 6d 65 20 74   icu }..# Some t
2cb0: 65 73 74 73 20 74 6f 20 63 68 65 63 6b 20 74 68  ests to check th
2cc0: 61 74 20 74 68 65 20 74 6f 6b 65 6e 69 7a 65 72  at the tokenizer
2cd0: 73 20 63 61 6e 20 62 6f 74 68 20 69 64 65 6e 74  s can both ident
2ce0: 69 66 79 20 77 68 69 74 65 2d 73 70 61 63 65 20  ify white-space 
2cf0: 0a 23 20 63 6f 64 65 70 6f 69 6e 74 73 2e 20 41  .# codepoints. A
2d00: 6c 6c 20 63 6f 64 65 70 6f 69 6e 74 73 20 74 65  ll codepoints te
2d10: 73 74 65 64 20 62 65 6c 6f 77 20 61 72 65 20 6f  sted below are o
2d20: 66 20 74 79 70 65 20 22 5a 73 22 20 69 6e 20 74  f type "Zs" in t
2d30: 68 65 0a 23 20 55 6e 69 63 6f 64 65 44 61 74 61  he.# UnicodeData
2d40: 2e 74 78 74 20 66 69 6c 65 2e 0a 66 6f 72 65 61  .txt file..forea
2d50: 63 68 20 54 20 24 74 6f 6b 65 6e 69 7a 65 72 73  ch T $tokenizers
2d60: 20 7b 0a 20 20 64 6f 5f 69 73 73 70 61 63 65 5f   {.  do_isspace_
2d70: 74 65 73 74 20 36 2e 24 54 2e 31 20 24 54 20 20  test 6.$T.1 $T  
2d80: 20 20 33 32 0a 20 20 64 6f 5f 69 73 73 70 61 63    32.  do_isspac
2d90: 65 5f 74 65 73 74 20 36 2e 24 54 2e 32 20 24 54  e_test 6.$T.2 $T
2da0: 20 20 20 20 31 36 30 0a 20 20 64 6f 5f 69 73 73      160.  do_iss
2db0: 70 61 63 65 5f 74 65 73 74 20 36 2e 24 54 2e 33  pace_test 6.$T.3
2dc0: 20 24 54 20 20 20 20 35 37 36 30 0a 20 20 64 6f   $T    5760.  do
2dd0: 5f 69 73 73 70 61 63 65 5f 74 65 73 74 20 36 2e  _isspace_test 6.
2de0: 24 54 2e 34 20 24 54 20 20 20 20 36 31 35 38 0a  $T.4 $T    6158.
2df0: 20 20 64 6f 5f 69 73 73 70 61 63 65 5f 74 65 73    do_isspace_tes
2e00: 74 20 36 2e 24 54 2e 35 20 24 54 20 20 20 20 38  t 6.$T.5 $T    8
2e10: 31 39 32 0a 20 20 64 6f 5f 69 73 73 70 61 63 65  192.  do_isspace
2e20: 5f 74 65 73 74 20 36 2e 24 54 2e 36 20 24 54 20  _test 6.$T.6 $T 
2e30: 20 20 20 38 31 39 33 0a 20 20 64 6f 5f 69 73 73     8193.  do_iss
2e40: 70 61 63 65 5f 74 65 73 74 20 36 2e 24 54 2e 37  pace_test 6.$T.7
2e50: 20 24 54 20 20 20 20 38 31 39 34 0a 20 20 64 6f   $T    8194.  do
2e60: 5f 69 73 73 70 61 63 65 5f 74 65 73 74 20 36 2e  _isspace_test 6.
2e70: 24 54 2e 38 20 24 54 20 20 20 20 38 31 39 35 0a  $T.8 $T    8195.
2e80: 20 20 64 6f 5f 69 73 73 70 61 63 65 5f 74 65 73    do_isspace_tes
2e90: 74 20 36 2e 24 54 2e 39 20 24 54 20 20 20 20 38  t 6.$T.9 $T    8
2ea0: 31 39 36 0a 20 20 64 6f 5f 69 73 73 70 61 63 65  196.  do_isspace
2eb0: 5f 74 65 73 74 20 36 2e 24 54 2e 31 30 20 24 54  _test 6.$T.10 $T
2ec0: 20 20 20 20 38 31 39 37 0a 20 20 64 6f 5f 69 73      8197.  do_is
2ed0: 73 70 61 63 65 5f 74 65 73 74 20 36 2e 24 54 2e  space_test 6.$T.
2ee0: 31 31 20 24 54 20 20 20 20 38 31 39 38 0a 20 20  11 $T    8198.  
2ef0: 64 6f 5f 69 73 73 70 61 63 65 5f 74 65 73 74 20  do_isspace_test 
2f00: 36 2e 24 54 2e 31 32 20 24 54 20 20 20 20 38 31  6.$T.12 $T    81
2f10: 39 39 0a 20 20 64 6f 5f 69 73 73 70 61 63 65 5f  99.  do_isspace_
2f20: 74 65 73 74 20 36 2e 24 54 2e 31 33 20 24 54 20  test 6.$T.13 $T 
2f30: 20 20 20 38 32 30 30 0a 20 20 64 6f 5f 69 73 73     8200.  do_iss
2f40: 70 61 63 65 5f 74 65 73 74 20 36 2e 24 54 2e 31  pace_test 6.$T.1
2f50: 34 20 24 54 20 20 20 20 38 32 30 31 0a 20 20 64  4 $T    8201.  d
2f60: 6f 5f 69 73 73 70 61 63 65 5f 74 65 73 74 20 36  o_isspace_test 6
2f70: 2e 24 54 2e 31 35 20 24 54 20 20 20 20 38 32 30  .$T.15 $T    820
2f80: 32 0a 20 20 64 6f 5f 69 73 73 70 61 63 65 5f 74  2.  do_isspace_t
2f90: 65 73 74 20 36 2e 24 54 2e 31 36 20 24 54 20 20  est 6.$T.16 $T  
2fa0: 20 20 38 32 33 39 0a 20 20 64 6f 5f 69 73 73 70    8239.  do_issp
2fb0: 61 63 65 5f 74 65 73 74 20 36 2e 24 54 2e 31 37  ace_test 6.$T.17
2fc0: 20 24 54 20 20 20 20 38 32 38 37 0a 20 20 64 6f   $T    8287.  do
2fd0: 5f 69 73 73 70 61 63 65 5f 74 65 73 74 20 36 2e  _isspace_test 6.
2fe0: 24 54 2e 31 38 20 24 54 20 20 20 31 32 32 38 38  $T.18 $T   12288
2ff0: 0a 0a 20 20 64 6f 5f 69 73 73 70 61 63 65 5f 74  ..  do_isspace_t
3000: 65 73 74 20 36 2e 24 54 2e 31 39 20 24 54 20 20  est 6.$T.19 $T  
3010: 20 7b 33 32 20 31 36 30 20 35 37 36 30 20 36 31   {32 160 5760 61
3020: 35 38 7d 0a 20 20 64 6f 5f 69 73 73 70 61 63 65  58}.  do_isspace
3030: 5f 74 65 73 74 20 36 2e 24 54 2e 31 39 20 24 54  _test 6.$T.19 $T
3040: 20 20 20 7b 38 31 39 32 20 38 31 39 33 20 38 31     {8192 8193 81
3050: 39 34 20 38 31 39 35 7d 0a 20 20 64 6f 5f 69 73  94 8195}.  do_is
3060: 73 70 61 63 65 5f 74 65 73 74 20 36 2e 24 54 2e  space_test 6.$T.
3070: 31 39 20 24 54 20 20 20 7b 38 31 39 36 20 38 31  19 $T   {8196 81
3080: 39 37 20 38 31 39 38 20 38 31 39 39 7d 0a 20 20  97 8198 8199}.  
3090: 64 6f 5f 69 73 73 70 61 63 65 5f 74 65 73 74 20  do_isspace_test 
30a0: 36 2e 24 54 2e 31 39 20 24 54 20 20 20 7b 38 32  6.$T.19 $T   {82
30b0: 30 30 20 38 32 30 31 20 38 32 30 32 20 38 32 33  00 8201 8202 823
30c0: 39 7d 0a 20 20 64 6f 5f 69 73 73 70 61 63 65 5f  9}.  do_isspace_
30d0: 74 65 73 74 20 36 2e 24 54 2e 31 39 20 24 54 20  test 6.$T.19 $T 
30e0: 20 20 7b 38 32 38 37 20 31 32 32 38 38 7d 0a 7d    {8287 12288}.}
30f0: 0a 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a 0a  ...finish_test..
3100: 0a                                               .