/ Hex Artifact Content
Login

Artifact 5fa8e0a7899d906d114345c605250ebfa9d8ed28:


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: c3 84 20 c3 96 20 c3 9c 7d 20 7b 30 20 c3 a4 20  .. .. ..} {0 .. 
05a0: c3 84 20 31 20 c3 b6 20 c3 96 20 32 20 c3 bc 20  .. 1 .. .. 2 .. 
05b0: c3 9c 7d 0a 64 6f 5f 75 6e 69 63 6f 64 65 5f 74  ..}.do_unicode_t
05c0: 6f 6b 65 6e 5f 74 65 73 74 20 31 2e 32 20 7b 78  oken_test 1.2 {x
05d0: c3 84 78 20 78 c3 96 78 20 78 c3 9c 78 7d 20 7b  ..x x..x x..x} {
05e0: 30 20 78 c3 a4 78 20 78 c3 84 78 20 31 20 78 c3  0 x..x x..x 1 x.
05f0: b6 78 20 78 c3 96 78 20 32 20 78 c3 bc 78 20 78  .x x..x 2 x..x x
0600: c3 9c 78 7d 0a 0a 23 20 30 78 30 30 44 46 20 69  ..x}..# 0x00DF i
0610: 73 20 61 20 73 6d 61 6c 6c 20 22 73 68 61 72 70  s a small "sharp
0620: 20 73 22 2e 20 30 78 31 45 39 45 20 69 73 20 61   s". 0x1E9E is a
0630: 20 63 61 70 69 74 61 6c 20 73 68 61 72 70 20 73   capital sharp s
0640: 2e 0a 64 6f 5f 75 6e 69 63 6f 64 65 5f 74 6f 6b  ..do_unicode_tok
0650: 65 6e 5f 74 65 73 74 20 31 2e 33 20 22 5c 75 44  en_test 1.3 "\uD
0660: 46 22 20 22 30 20 5c 75 44 46 20 5c 75 44 46 22  F" "0 \uDF \uDF"
0670: 0a 64 6f 5f 75 6e 69 63 6f 64 65 5f 74 6f 6b 65  .do_unicode_toke
0680: 6e 5f 74 65 73 74 20 31 2e 34 20 22 5c 75 31 45  n_test 1.4 "\u1E
0690: 39 45 22 20 22 30 20 c3 9f 20 5c 75 31 45 39 45  9E" "0 .. \u1E9E
06a0: 22 0a 64 6f 5f 75 6e 69 63 6f 64 65 5f 74 6f 6b  ".do_unicode_tok
06b0: 65 6e 5f 74 65 73 74 20 31 2e 35 20 22 5c 75 31  en_test 1.5 "\u1
06c0: 45 39 45 22 20 22 30 20 5c 75 44 46 20 5c 75 31  E9E" "0 \uDF \u1
06d0: 45 39 45 22 0a 0a 64 6f 5f 75 6e 69 63 6f 64 65  E9E"..do_unicode
06e0: 5f 74 6f 6b 65 6e 5f 74 65 73 74 20 31 2e 36 20  _token_test 1.6 
06f0: 22 54 68 65 20 71 75 69 63 6b 20 62 72 6f 77 6e  "The quick brown
0700: 20 66 6f 78 22 20 7b 0a 20 20 30 20 74 68 65 20   fox" {.  0 the 
0710: 54 68 65 20 31 20 71 75 69 63 6b 20 71 75 69 63  The 1 quick quic
0720: 6b 20 32 20 62 72 6f 77 6e 20 62 72 6f 77 6e 20  k 2 brown brown 
0730: 33 20 66 6f 78 20 66 6f 78 0a 7d 0a 64 6f 5f 75  3 fox fox.}.do_u
0740: 6e 69 63 6f 64 65 5f 74 6f 6b 65 6e 5f 74 65 73  nicode_token_tes
0750: 74 20 31 2e 37 20 22 54 68 65 5c 75 30 30 62 66  t 1.7 "The\u00bf
0760: 71 75 69 63 6b 5c 75 32 32 34 65 62 72 6f 77 6e  quick\u224ebrown
0770: 5c 75 32 32 36 33 66 6f 78 22 20 7b 0a 20 20 30  \u2263fox" {.  0
0780: 20 74 68 65 20 54 68 65 20 31 20 71 75 69 63 6b   the The 1 quick
0790: 20 71 75 69 63 6b 20 32 20 62 72 6f 77 6e 20 62   quick 2 brown b
07a0: 72 6f 77 6e 20 33 20 66 6f 78 20 66 6f 78 0a 7d  rown 3 fox fox.}
07b0: 0a 0a 64 6f 5f 75 6e 69 63 6f 64 65 5f 74 6f 6b  ..do_unicode_tok
07c0: 65 6e 5f 74 65 73 74 32 20 31 2e 38 20 20 7b 61  en_test2 1.8  {a
07d0: 20 42 20 63 20 44 7d 20 7b 30 20 61 20 61 20 31   B c D} {0 a a 1
07e0: 20 62 20 42 20 32 20 63 20 63 20 33 20 64 20 44   b B 2 c c 3 d D
07f0: 7d 0a 64 6f 5f 75 6e 69 63 6f 64 65 5f 74 6f 6b  }.do_unicode_tok
0800: 65 6e 5f 74 65 73 74 32 20 31 2e 39 20 20 7b c3  en_test2 1.9  {.
0810: 84 20 c3 96 20 c3 9c 7d 20 7b 30 20 61 20 c3 84  . .. ..} {0 a ..
0820: 20 31 20 6f 20 c3 96 20 32 20 75 20 c3 9c 7d 0a   1 o .. 2 u ..}.
0830: 64 6f 5f 75 6e 69 63 6f 64 65 5f 74 6f 6b 65 6e  do_unicode_token
0840: 5f 74 65 73 74 32 20 31 2e 31 30 20 7b 78 c3 84  _test2 1.10 {x..
0850: 78 20 78 c3 96 78 20 78 c3 9c 78 7d 20 7b 30 20  x x..x x..x} {0 
0860: 78 61 78 20 78 c3 84 78 20 31 20 78 6f 78 20 78  xax x..x 1 xox x
0870: c3 96 78 20 32 20 78 75 78 20 78 c3 9c 78 7d 0a  ..x 2 xux x..x}.
0880: 0a 23 20 43 68 65 63 6b 20 74 68 61 74 20 64 69  .# Check that di
0890: 61 63 72 69 74 69 63 73 20 61 72 65 20 72 65 6d  acritics are rem
08a0: 6f 76 65 64 20 69 66 20 72 65 6d 6f 76 65 5f 64  oved if remove_d
08b0: 69 61 63 72 69 74 69 63 73 3d 31 20 69 73 20 73  iacritics=1 is s
08c0: 70 65 63 69 66 69 65 64 2e 0a 23 20 41 6e 64 20  pecified..# And 
08d0: 74 68 61 74 20 74 68 65 79 20 64 6f 20 6e 6f 74  that they do not
08e0: 20 62 72 65 61 6b 20 74 6f 6b 65 6e 73 2e 0a 64   break tokens..d
08f0: 6f 5f 75 6e 69 63 6f 64 65 5f 74 6f 6b 65 6e 5f  o_unicode_token_
0900: 74 65 73 74 32 20 31 2e 31 31 20 22 78 78 5c 75  test2 1.11 "xx\u
0910: 30 33 30 31 78 78 22 20 22 30 20 78 78 78 78 20  0301xx" "0 xxxx 
0920: 78 78 5c 75 33 30 31 78 78 22 0a 0a 23 20 54 69  xx\u301xx"..# Ti
0930: 74 6c 65 2d 63 61 73 65 20 6d 61 70 70 69 6e 67  tle-case mapping
0940: 73 20 77 6f 72 6b 0a 64 6f 5f 75 6e 69 63 6f 64  s work.do_unicod
0950: 65 5f 74 6f 6b 65 6e 5f 74 65 73 74 20 31 2e 31  e_token_test 1.1
0960: 32 20 22 5c 75 30 31 63 35 22 20 22 30 20 5c 75  2 "\u01c5" "0 \u
0970: 30 31 63 36 20 5c 75 30 31 63 35 22 0a 0a 23 2d  01c6 \u01c5"..#-
0980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09c0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 0a 73 65 74 20 64  --------.#.set d
09d0: 6f 63 73 20 5b 6c 69 73 74 20 7b 0a 20 20 45 6e  ocs [list {.  En
09e0: 68 61 6e 63 65 20 74 68 65 20 49 4e 53 45 52 54  hance the INSERT
09f0: 20 73 79 6e 74 61 78 20 74 6f 20 61 6c 6c 6f 77   syntax to allow
0a00: 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 74   multiple rows t
0a10: 6f 20 62 65 20 69 6e 73 65 72 74 65 64 20 76 69  o be inserted vi
0a20: 61 20 74 68 65 0a 20 20 56 41 4c 55 45 53 20 63  a the.  VALUES c
0a30: 6c 61 75 73 65 2e 0a 7d 20 7b 0a 20 20 45 6e 68  lause..} {.  Enh
0a40: 61 6e 63 65 20 74 68 65 20 43 52 45 41 54 45 20  ance the CREATE 
0a50: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 63 6f  VIRTUAL TABLE co
0a60: 6d 6d 61 6e 64 20 74 6f 20 73 75 70 70 6f 72 74  mmand to support
0a70: 20 74 68 65 20 49 46 20 4e 4f 54 20 45 58 49 53   the IF NOT EXIS
0a80: 54 53 20 63 6c 61 75 73 65 2e 0a 7d 20 7b 0a 20  TS clause..} {. 
0a90: 20 41 64 64 65 64 20 74 68 65 20 73 71 6c 69 74   Added the sqlit
0aa0: 65 33 5f 73 74 72 69 63 6d 70 28 29 20 69 6e 74  e3_stricmp() int
0ab0: 65 72 66 61 63 65 20 61 73 20 61 20 63 6f 75 6e  erface as a coun
0ac0: 74 65 72 70 61 72 74 20 74 6f 20 73 71 6c 69 74  terpart to sqlit
0ad0: 65 33 5f 73 74 72 6e 69 63 6d 70 28 29 2e 0a 7d  e3_strnicmp()..}
0ae0: 20 7b 0a 20 20 41 64 64 65 64 20 74 68 65 20 73   {.  Added the s
0af0: 71 6c 69 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e  qlite3_db_readon
0b00: 6c 79 28 29 20 69 6e 74 65 72 66 61 63 65 2e 0a  ly() interface..
0b10: 7d 20 7b 0a 20 20 41 64 64 65 64 20 74 68 65 20  } {.  Added the 
0b20: 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 52 41  SQLITE_FCNTL_PRA
0b30: 47 4d 41 20 66 69 6c 65 20 63 6f 6e 74 72 6f 6c  GMA file control
0b40: 2c 20 67 69 76 69 6e 67 20 56 46 53 20 69 6d 70  , giving VFS imp
0b50: 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 74 68 65  lementations the
0b60: 0a 20 20 61 62 69 6c 69 74 79 20 74 6f 20 61 64  .  ability to ad
0b70: 64 20 6e 65 77 20 50 52 41 47 4d 41 20 73 74 61  d new PRAGMA sta
0b80: 74 65 6d 65 6e 74 73 20 6f 72 20 74 6f 20 6f 76  tements or to ov
0b90: 65 72 72 69 64 65 20 62 75 69 6c 74 2d 69 6e 20  erride built-in 
0ba0: 50 52 41 47 4d 41 73 2e 20 20 0a 7d 20 7b 0a 20  PRAGMAs.  .} {. 
0bb0: 20 51 75 65 72 69 65 73 20 6f 66 20 74 68 65 20   Queries of the 
0bc0: 66 6f 72 6d 3a 20 22 53 45 4c 45 43 54 20 6d 61  form: "SELECT ma
0bd0: 78 28 78 29 2c 20 79 20 46 52 4f 4d 20 74 61 62  x(x), y FROM tab
0be0: 6c 65 22 20 72 65 74 75 72 6e 73 20 74 68 65 20  le" returns the 
0bf0: 76 61 6c 75 65 20 6f 66 20 79 20 6f 6e 0a 20 20  value of y on.  
0c00: 74 68 65 20 73 61 6d 65 20 72 6f 77 20 74 68 61  the same row tha
0c10: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6d  t contains the m
0c20: 61 78 69 6d 75 6d 20 78 20 76 61 6c 75 65 2e 0a  aximum x value..
0c30: 7d 20 7b 0a 20 20 41 64 64 65 64 20 73 75 70 70  } {.  Added supp
0c40: 6f 72 74 20 66 6f 72 20 74 68 65 20 46 54 53 34  ort for the FTS4
0c50: 20 6c 61 6e 67 75 61 67 65 69 64 20 6f 70 74 69   languageid opti
0c60: 6f 6e 2e 0a 7d 20 7b 0a 20 20 44 6f 63 75 6d 65  on..} {.  Docume
0c70: 6e 74 65 64 20 73 75 70 70 6f 72 74 20 66 6f 72  nted support for
0c80: 20 74 68 65 20 46 54 53 34 20 63 6f 6e 74 65 6e   the FTS4 conten
0c90: 74 20 6f 70 74 69 6f 6e 2e 20 54 68 69 73 20 66  t option. This f
0ca0: 65 61 74 75 72 65 20 68 61 73 20 61 63 74 75 61  eature has actua
0cb0: 6c 6c 79 0a 20 20 62 65 65 6e 20 69 6e 20 74 68  lly.  been in th
0cc0: 65 20 63 6f 64 65 20 73 69 6e 63 65 20 76 65 72  e code since ver
0cd0: 73 69 6f 6e 20 33 2e 37 2e 39 20 62 75 74 20 69  sion 3.7.9 but i
0ce0: 73 20 6f 6e 6c 79 20 6e 6f 77 20 63 6f 6e 73 69  s only now consi
0cf0: 64 65 72 65 64 20 74 6f 20 62 65 0a 20 20 6f 66  dered to be.  of
0d00: 66 69 63 69 61 6c 6c 79 20 73 75 70 70 6f 72 74  ficially support
0d10: 65 64 2e 20 20 0a 7d 20 7b 0a 20 20 50 65 6e 64  ed.  .} {.  Pend
0d20: 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20 6e  ing statements n
0d30: 6f 20 6c 6f 6e 67 65 72 20 62 6c 6f 63 6b 20 52  o longer block R
0d40: 4f 4c 4c 42 41 43 4b 2e 20 49 6e 73 74 65 61 64  OLLBACK. Instead
0d50: 2c 20 74 68 65 20 70 65 6e 64 69 6e 67 20 73 74  , the pending st
0d60: 61 74 65 6d 65 6e 74 0a 20 20 77 69 6c 6c 20 72  atement.  will r
0d70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f  eturn SQLITE_ABO
0d80: 52 54 20 75 70 6f 6e 20 6e 65 78 74 20 61 63 63  RT upon next acc
0d90: 65 73 73 20 61 66 74 65 72 20 74 68 65 20 52 4f  ess after the RO
0da0: 4c 4c 42 41 43 4b 2e 20 20 0a 7d 20 7b 0a 20 20  LLBACK.  .} {.  
0db0: 49 6d 70 72 6f 76 65 6d 65 6e 74 73 20 74 6f 20  Improvements to 
0dc0: 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66 20  the handling of 
0dd0: 43 53 56 20 69 6e 70 75 74 73 20 69 6e 20 74 68  CSV inputs in th
0de0: 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 73  e command-line s
0df0: 68 65 6c 6c 0a 7d 20 7b 0a 20 20 46 69 78 20 61  hell.} {.  Fix a
0e00: 20 62 75 67 20 69 6e 74 72 6f 64 75 63 65 64 20   bug introduced 
0e10: 69 6e 20 76 65 72 73 69 6f 6e 20 33 2e 37 2e 31  in version 3.7.1
0e20: 30 20 74 68 61 74 20 6d 69 67 68 74 20 63 61 75  0 that might cau
0e30: 73 65 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 74  se a LEFT JOIN t
0e40: 6f 20 62 65 0a 20 20 69 6e 63 6f 72 72 65 63 74  o be.  incorrect
0e50: 6c 79 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  ly converted int
0e60: 6f 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 20  o an INNER JOIN 
0e70: 69 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  if the WHERE cla
0e80: 75 73 65 20 69 6e 64 65 78 61 62 6c 65 20 74 65  use indexable te
0e90: 72 6d 73 0a 20 20 63 6f 6e 6e 65 63 74 65 64 20  rms.  connected 
0ea0: 62 79 20 4f 52 2e 20 20 0a 7d 5d 0a 0a 73 65 74  by OR.  .}]..set
0eb0: 20 6d 61 70 28 61 29 20 5b 6c 69 73 74 20 22 5c   map(a) [list "\
0ec0: 75 30 30 43 34 22 20 22 5c 75 30 30 45 34 22 5d  u00C4" "\u00E4"]
0ed0: 20 20 3b 20 23 20 4c 41 54 49 4e 20 4c 45 54 54    ; # LATIN LETT
0ee0: 45 52 20 41 20 57 49 54 48 20 44 49 41 45 52 45  ER A WITH DIAERE
0ef0: 53 49 53 0a 73 65 74 20 6d 61 70 28 65 29 20 5b  SIS.set map(e) [
0f00: 6c 69 73 74 20 22 5c 75 30 30 43 42 22 20 22 5c  list "\u00CB" "\
0f10: 75 30 30 45 42 22 5d 20 20 3b 20 23 20 4c 41 54  u00EB"]  ; # LAT
0f20: 49 4e 20 4c 45 54 54 45 52 20 45 20 57 49 54 48  IN LETTER E WITH
0f30: 20 44 49 41 45 52 45 53 49 53 0a 73 65 74 20 6d   DIAERESIS.set m
0f40: 61 70 28 69 29 20 5b 6c 69 73 74 20 22 5c 75 30  ap(i) [list "\u0
0f50: 30 43 46 22 20 22 5c 75 30 30 45 46 22 5d 20 20  0CF" "\u00EF"]  
0f60: 3b 20 23 20 4c 41 54 49 4e 20 4c 45 54 54 45 52  ; # LATIN LETTER
0f70: 20 49 20 57 49 54 48 20 44 49 41 45 52 45 53 49   I WITH DIAERESI
0f80: 53 0a 73 65 74 20 6d 61 70 28 6f 29 20 5b 6c 69  S.set map(o) [li
0f90: 73 74 20 22 5c 75 30 30 44 36 22 20 22 5c 75 30  st "\u00D6" "\u0
0fa0: 30 46 36 22 5d 20 20 3b 20 23 20 4c 41 54 49 4e  0F6"]  ; # LATIN
0fb0: 20 4c 45 54 54 45 52 20 4f 20 57 49 54 48 20 44   LETTER O WITH D
0fc0: 49 41 45 52 45 53 49 53 0a 73 65 74 20 6d 61 70  IAERESIS.set map
0fd0: 28 75 29 20 5b 6c 69 73 74 20 22 5c 75 30 30 44  (u) [list "\u00D
0fe0: 43 22 20 22 5c 75 30 30 46 43 22 5d 20 20 3b 20  C" "\u00FC"]  ; 
0ff0: 23 20 4c 41 54 49 4e 20 4c 45 54 54 45 52 20 55  # LATIN LETTER U
1000: 20 57 49 54 48 20 44 49 41 45 52 45 53 49 53 0a   WITH DIAERESIS.
1010: 73 65 74 20 6d 61 70 28 79 29 20 5b 6c 69 73 74  set map(y) [list
1020: 20 22 5c 75 30 31 37 38 22 20 22 5c 75 30 30 46   "\u0178" "\u00F
1030: 46 22 5d 20 20 3b 20 23 20 4c 41 54 49 4e 20 4c  F"]  ; # LATIN L
1040: 45 54 54 45 52 20 59 20 57 49 54 48 20 44 49 41  ETTER Y WITH DIA
1050: 45 52 45 53 49 53 0a 73 65 74 20 6d 61 70 28 68  ERESIS.set map(h
1060: 29 20 5b 6c 69 73 74 20 22 5c 75 31 45 32 36 22  ) [list "\u1E26"
1070: 20 22 5c 75 31 45 32 37 22 5d 20 20 3b 20 23 20   "\u1E27"]  ; # 
1080: 4c 41 54 49 4e 20 4c 45 54 54 45 52 20 48 20 57  LATIN LETTER H W
1090: 49 54 48 20 44 49 41 45 52 45 53 49 53 0a 73 65  ITH DIAERESIS.se
10a0: 74 20 6d 61 70 28 77 29 20 5b 6c 69 73 74 20 22  t map(w) [list "
10b0: 5c 75 31 45 38 34 22 20 22 5c 75 31 45 38 35 22  \u1E84" "\u1E85"
10c0: 5d 20 20 3b 20 23 20 4c 41 54 49 4e 20 4c 45 54  ]  ; # LATIN LET
10d0: 54 45 52 20 57 20 57 49 54 48 20 44 49 41 45 52  TER W WITH DIAER
10e0: 45 53 49 53 0a 73 65 74 20 6d 61 70 28 78 29 20  ESIS.set map(x) 
10f0: 5b 6c 69 73 74 20 22 5c 75 31 45 38 43 22 20 22  [list "\u1E8C" "
1100: 5c 75 31 45 38 44 22 5d 20 20 3b 20 23 20 4c 41  \u1E8D"]  ; # LA
1110: 54 49 4e 20 4c 45 54 54 45 52 20 58 20 57 49 54  TIN LETTER X WIT
1120: 48 20 44 49 41 45 52 45 53 49 53 0a 66 6f 72 65  H DIAERESIS.fore
1130: 61 63 68 20 6b 20 5b 61 72 72 61 79 20 6e 61 6d  ach k [array nam
1140: 65 73 20 6d 61 70 5d 20 7b 0a 20 20 6c 61 70 70  es map] {.  lapp
1150: 65 6e 64 20 6d 61 70 70 69 6e 67 73 20 5b 73 74  end mappings [st
1160: 72 69 6e 67 20 74 6f 75 70 70 65 72 20 24 6b 5d  ring toupper $k]
1170: 20 5b 6c 69 6e 64 65 78 20 24 6d 61 70 28 24 6b   [lindex $map($k
1180: 29 20 30 5d 20 0a 20 20 6c 61 70 70 65 6e 64 20  ) 0] .  lappend 
1190: 6d 61 70 70 69 6e 67 73 20 24 6b 20 5b 6c 69 6e  mappings $k [lin
11a0: 64 65 78 20 24 6d 61 70 28 24 6b 29 20 31 5d 0a  dex $map($k) 1].
11b0: 7d 0a 70 72 6f 63 20 6d 61 70 64 6f 63 20 7b 64  }.proc mapdoc {d
11c0: 6f 63 7d 20 7b 20 0a 20 20 73 65 74 20 64 6f 63  oc} { .  set doc
11d0: 20 5b 72 65 67 73 75 62 20 2d 61 6c 6c 20 7b 5b   [regsub -all {[
11e0: 5b 3a 73 70 61 63 65 3a 5d 5d 2b 7d 20 24 64 6f  [:space:]]+} $do
11f0: 63 20 22 20 22 5d 0a 20 20 73 74 72 69 6e 67 20  c " "].  string 
1200: 6d 61 70 20 24 3a 3a 6d 61 70 70 69 6e 67 73 20  map $::mappings 
1210: 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 24 64 6f  [string trim $do
1220: 63 5d 20 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 32  c] .}..do_test 2
1230: 2e 30 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .0 {.  execsql {
1240: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
1250: 54 41 42 4c 45 20 74 32 20 55 53 49 4e 47 20 66  TABLE t2 USING f
1260: 74 73 34 28 74 6f 6b 65 6e 69 7a 65 3d 75 6e 69  ts4(tokenize=uni
1270: 63 6f 64 65 36 31 2c 20 78 29 3b 20 7d 0a 20 20  code61, x); }.  
1280: 66 6f 72 65 61 63 68 20 64 6f 63 20 24 64 6f 63  foreach doc $doc
1290: 73 20 7b 0a 20 20 20 20 73 65 74 20 64 20 5b 6d  s {.    set d [m
12a0: 61 70 64 6f 63 20 24 64 6f 63 5d 0a 20 20 20 20  apdoc $doc].    
12b0: 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
12c0: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
12d0: 24 64 29 20 7d 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a  $d) }.  }.} {}..
12e0: 64 6f 5f 74 65 73 74 20 32 2e 31 20 7b 0a 20 20  do_test 2.1 {.  
12f0: 73 65 74 20 71 20 5b 6d 61 70 64 6f 63 20 22 72  set q [mapdoc "r
1300: 6f 77 22 5d 0a 20 20 65 78 65 63 73 71 6c 20 7b  ow"].  execsql {
1310: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1320: 32 20 57 48 45 52 45 20 74 32 20 4d 41 54 43 48  2 WHERE t2 MATCH
1330: 20 24 71 20 7d 0a 7d 20 5b 6c 69 73 74 20 5b 6d   $q }.} [list [m
1340: 61 70 64 6f 63 20 7b 0a 20 20 51 75 65 72 69 65  apdoc {.  Querie
1350: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 20 22  s of the form: "
1360: 53 45 4c 45 43 54 20 6d 61 78 28 78 29 2c 20 79  SELECT max(x), y
1370: 20 46 52 4f 4d 20 74 61 62 6c 65 22 20 72 65 74   FROM table" ret
1380: 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f  urns the value o
1390: 66 20 79 20 6f 6e 0a 20 20 74 68 65 20 73 61 6d  f y on.  the sam
13a0: 65 20 72 6f 77 20 74 68 61 74 20 63 6f 6e 74 61  e row that conta
13b0: 69 6e 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  ins the maximum 
13c0: 78 20 76 61 6c 75 65 2e 0a 7d 5d 5d 0a 0a 66 6f  x value..}]]..fo
13d0: 72 65 61 63 68 20 7b 74 6e 20 71 75 65 72 79 20  reach {tn query 
13e0: 73 6e 69 70 70 65 74 7d 20 7b 0a 20 20 32 20 22  snippet} {.  2 "
13f0: 72 6f 77 22 20 7b 0a 20 20 20 20 20 2e 2e 2e 72  row" {.     ...r
1400: 65 74 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65  eturns the value
1410: 20 6f 66 20 79 20 6f 6e 20 74 68 65 20 73 61 6d   of y on the sam
1420: 65 20 5b 72 6f 77 5d 20 74 68 61 74 20 63 6f 6e  e [row] that con
1430: 74 61 69 6e 73 20 0a 20 20 20 20 20 74 68 65 20  tains .     the 
1440: 6d 61 78 69 6d 75 6d 20 78 20 76 61 6c 75 65 2e  maximum x value.
1450: 0a 20 20 7d 0a 20 20 33 20 22 52 4f 57 22 20 7b  .  }.  3 "ROW" {
1460: 0a 20 20 20 20 20 2e 2e 2e 72 65 74 75 72 6e 73  .     ...returns
1470: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 79 20   the value of y 
1480: 6f 6e 20 74 68 65 20 73 61 6d 65 20 5b 72 6f 77  on the same [row
1490: 5d 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  ] that contains 
14a0: 0a 20 20 20 20 20 74 68 65 20 6d 61 78 69 6d 75  .     the maximu
14b0: 6d 20 78 20 76 61 6c 75 65 2e 0a 20 20 7d 0a 20  m x value..  }. 
14c0: 20 34 20 22 72 6f 6c 6c 62 61 63 6b 22 20 7b 0a   4 "rollback" {.
14d0: 20 20 20 20 20 2e 2e 2e 5b 52 4f 4c 4c 42 41 43       ...[ROLLBAC
14e0: 4b 5d 2e 20 49 6e 73 74 65 61 64 2c 20 74 68 65  K]. Instead, the
14f0: 20 70 65 6e 64 69 6e 67 20 73 74 61 74 65 6d 65   pending stateme
1500: 6e 74 0a 20 20 20 20 20 77 69 6c 6c 20 72 65 74  nt.     will ret
1510: 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  urn SQLITE_ABORT
1520: 20 75 70 6f 6e 20 6e 65 78 74 20 61 63 63 65 73   upon next acces
1530: 73 20 61 66 74 65 72 20 74 68 65 20 5b 52 4f 4c  s after the [ROL
1540: 4c 42 41 43 4b 5d 2e 0a 20 20 7d 0a 20 20 35 20  LBACK]..  }.  5 
1550: 22 72 4f 6c 6c 62 61 63 6b 22 20 7b 0a 20 20 20  "rOllback" {.   
1560: 20 20 2e 2e 2e 5b 52 4f 4c 4c 42 41 43 4b 5d 2e    ...[ROLLBACK].
1570: 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 70 65   Instead, the pe
1580: 6e 64 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 0a  nding statement.
1590: 20 20 20 20 20 77 69 6c 6c 20 72 65 74 75 72 6e       will return
15a0: 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 20 75 70   SQLITE_ABORT up
15b0: 6f 6e 20 6e 65 78 74 20 61 63 63 65 73 73 20 61  on next access a
15c0: 66 74 65 72 20 74 68 65 20 5b 52 4f 4c 4c 42 41  fter the [ROLLBA
15d0: 43 4b 5d 2e 0a 20 20 7d 0a 20 20 36 20 22 6c 61  CK]..  }.  6 "la
15e0: 6e 67 2a 22 20 7b 0a 20 20 20 20 20 41 64 64 65  ng*" {.     Adde
15f0: 64 20 73 75 70 70 6f 72 74 20 66 6f 72 20 74 68  d support for th
1600: 65 20 46 54 53 34 20 5b 6c 61 6e 67 75 61 67 65  e FTS4 [language
1610: 69 64 5d 20 6f 70 74 69 6f 6e 2e 0a 20 20 7d 0a  id] option..  }.
1620: 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 32 2e  } {.  do_test 2.
1630: 24 74 6e 20 7b 0a 20 20 20 20 73 65 74 20 71 20  $tn {.    set q 
1640: 5b 6d 61 70 64 6f 63 20 24 71 75 65 72 79 5d 0a  [mapdoc $query].
1650: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45      execsql { SE
1660: 4c 45 43 54 20 73 6e 69 70 70 65 74 28 74 32 2c  LECT snippet(t2,
1670: 20 27 5b 27 2c 20 27 5d 27 2c 20 27 2e 2e 2e 27   '[', ']', '...'
1680: 29 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20  ) FROM t2 WHERE 
1690: 74 32 20 4d 41 54 43 48 20 24 71 20 7d 0a 20 20  t2 MATCH $q }.  
16a0: 7d 20 5b 6c 69 73 74 20 5b 6d 61 70 64 6f 63 20  } [list [mapdoc 
16b0: 24 73 6e 69 70 70 65 74 5d 5d 0a 7d 0a 0a 23 2d  $snippet]].}..#-
16c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1700: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 4d 61 6b 65 20  --------.# Make 
1710: 73 75 72 65 20 74 68 65 20 75 6e 69 63 6f 64 65  sure the unicode
1720: 36 31 20 74 6f 6b 65 6e 69 7a 65 72 20 64 6f 65  61 tokenizer doe
1730: 73 20 6e 6f 74 20 63 72 61 73 68 20 69 66 20 69  s not crash if i
1740: 74 20 69 73 20 70 61 73 73 65 64 20 61 20 0a 23  t is passed a .#
1750: 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 72   NULL pointer..r
1760: 65 73 65 74 5f 64 62 0a 64 6f 5f 65 78 65 63 73  eset_db.do_execs
1770: 71 6c 5f 74 65 73 74 20 33 2e 31 20 7b 0a 20 20  ql_test 3.1 {.  
1780: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
1790: 41 42 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74  ABLE t1 USING ft
17a0: 73 34 28 74 6f 6b 65 6e 69 7a 65 3d 75 6e 69 63  s4(tokenize=unic
17b0: 6f 64 65 36 31 2c 20 78 2c 20 79 29 3b 0a 20 20  ode61, x, y);.  
17c0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
17d0: 41 4c 55 45 53 28 4e 55 4c 4c 2c 20 27 61 20 62  ALUES(NULL, 'a b
17e0: 20 63 27 29 3b 0a 7d 0a 0a 64 6f 5f 65 78 65 63   c');.}..do_exec
17f0: 73 71 6c 5f 74 65 73 74 20 33 2e 32 20 7b 0a 20  sql_test 3.2 {. 
1800: 20 53 45 4c 45 43 54 20 73 6e 69 70 70 65 74 28   SELECT snippet(
1810: 74 31 2c 20 27 5b 27 2c 20 27 5d 27 29 20 46 52  t1, '[', ']') FR
1820: 4f 4d 20 74 31 20 57 48 45 52 45 20 74 31 20 4d  OM t1 WHERE t1 M
1830: 41 54 43 48 20 27 62 27 0a 7d 20 7b 7b 61 20 5b  ATCH 'b'.} {{a [
1840: 62 5d 20 63 7d 7d 0a 0a 64 6f 5f 65 78 65 63 73  b] c}}..do_execs
1850: 71 6c 5f 74 65 73 74 20 33 2e 33 20 7b 0a 20 20  ql_test 3.3 {.  
1860: 42 45 47 49 4e 3b 0a 20 20 44 45 4c 45 54 45 20  BEGIN;.  DELETE 
1870: 46 52 4f 4d 20 74 31 3b 0a 20 20 49 4e 53 45 52  FROM t1;.  INSER
1880: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
1890: 28 27 62 20 62 20 62 20 62 20 62 20 62 20 62 20  ('b b b b b b b 
18a0: 62 20 62 20 62 20 62 27 2c 20 27 62 20 62 20 62  b b b b', 'b b b
18b0: 20 62 20 62 20 62 20 62 20 62 20 62 20 62 20 62   b b b b b b b b
18c0: 20 62 20 62 27 29 3b 0a 20 20 49 4e 53 45 52 54   b b');.  INSERT
18d0: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
18e0: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 49 4e 53  * FROM t1;.  INS
18f0: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
1900: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT * FROM t1;.  
1910: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
1920: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
1930: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
1940: 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  1 SELECT * FROM 
1950: 74 31 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  t1;.  INSERT INT
1960: 4f 20 74 31 20 53 45 4c 45 43 54 20 2a 20 46 52  O t1 SELECT * FR
1970: 4f 4d 20 74 31 3b 0a 20 20 49 4e 53 45 52 54 20  OM t1;.  INSERT 
1980: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 2a  INTO t1 SELECT *
1990: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 49 4e 53 45   FROM t1;.  INSE
19a0: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
19b0: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 49  T * FROM t1;.  I
19c0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
19d0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a  LECT * FROM t1;.
19e0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
19f0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1a00: 31 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  1;.  INSERT INTO
1a10: 20 74 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   t1 SELECT * FRO
1a20: 4d 20 74 31 3b 0a 20 20 49 4e 53 45 52 54 20 49  M t1;.  INSERT I
1a30: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 2a 20  NTO t1 SELECT * 
1a40: 46 52 4f 4d 20 74 31 3b 0a 20 20 49 4e 53 45 52  FROM t1;.  INSER
1a50: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
1a60: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 49 4e   * FROM t1;.  IN
1a70: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
1a80: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20  ECT * FROM t1;. 
1a90: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
1aa0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
1ab0: 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  ;.  INSERT INTO 
1ac0: 74 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  t1 SELECT * FROM
1ad0: 20 74 31 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e   t1;.  INSERT IN
1ae0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 2a 20 46  TO t1 SELECT * F
1af0: 52 4f 4d 20 74 31 3b 0a 20 20 49 4e 53 45 52 54  ROM t1;.  INSERT
1b00: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
1b10: 27 61 20 62 20 63 27 2c 20 4e 55 4c 4c 29 3b 0a  'a b c', NULL);.
1b20: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
1b30: 20 56 41 4c 55 45 53 28 27 61 20 78 20 63 27 2c   VALUES('a x c',
1b40: 20 4e 55 4c 4c 29 3b 0a 20 20 43 4f 4d 4d 49 54   NULL);.  COMMIT
1b50: 3b 0a 7d 0a 0a 64 6f 5f 65 78 65 63 73 71 6c 5f  ;.}..do_execsql_
1b60: 74 65 73 74 20 33 2e 34 20 7b 0a 20 20 53 45 4c  test 3.4 {.  SEL
1b70: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48  ECT * FROM t1 WH
1b80: 45 52 45 20 74 31 20 4d 41 54 43 48 20 27 61 20  ERE t1 MATCH 'a 
1b90: 62 27 3b 0a 7d 20 7b 7b 61 20 62 20 63 7d 20 7b  b';.} {{a b c} {
1ba0: 7d 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }}..#-----------
1bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
1bf0: 0a 72 65 73 65 74 5f 64 62 0a 0a 64 6f 5f 74 65  .reset_db..do_te
1c00: 73 74 20 34 2e 31 20 7b 0a 20 20 73 65 74 20 61  st 4.1 {.  set a
1c10: 20 22 61 62 63 5c 75 46 46 46 45 64 65 66 22 0a   "abc\uFFFEdef".
1c20: 20 20 73 65 74 20 62 20 22 61 62 63 5c 75 44 38    set b "abc\uD8
1c30: 30 30 64 65 66 22 0a 20 20 73 65 74 20 63 20 22  00def".  set c "
1c40: 5c 75 46 46 46 45 64 65 66 22 0a 20 20 73 65 74  \uFFFEdef".  set
1c50: 20 64 20 22 5c 75 44 38 30 30 64 65 66 22 0a 20   d "\uD800def". 
1c60: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
1c70: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
1c80: 42 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73  BLE t1 USING fts
1c90: 34 28 74 6f 6b 65 6e 69 7a 65 3d 75 6e 69 63 6f  4(tokenize=unico
1ca0: 64 65 36 31 2c 20 78 29 3b 0a 20 20 20 20 49 4e  de61, x);.    IN
1cb0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
1cc0: 55 45 53 28 24 61 29 3b 0a 20 20 20 20 49 4e 53  UES($a);.    INS
1cd0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
1ce0: 45 53 28 24 62 29 3b 0a 20 20 20 20 49 4e 53 45  ES($b);.    INSE
1cf0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
1d00: 53 28 24 63 29 3b 0a 20 20 20 20 49 4e 53 45 52  S($c);.    INSER
1d10: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
1d20: 28 24 64 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a  ($d);.  }.} {}..
1d30: 64 6f 5f 74 65 73 74 20 34 2e 32 20 7b 0a 20 20  do_test 4.2 {.  
1d40: 73 65 74 20 61 20 5b 62 69 6e 61 72 79 20 66 6f  set a [binary fo
1d50: 72 6d 61 74 20 63 2a 20 7b 30 78 36 31 20 30 78  rmat c* {0x61 0x
1d60: 46 37 20 30 78 42 46 20 30 78 42 46 20 30 78 42  F7 0xBF 0xBF 0xB
1d70: 46 20 30 78 36 32 7d 5d 0a 20 20 73 65 74 20 62  F 0x62}].  set b
1d80: 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d 61 74 20   [binary format 
1d90: 63 2a 20 7b 30 78 36 31 20 30 78 46 37 20 30 78  c* {0x61 0xF7 0x
1da0: 42 46 20 30 78 42 46 20 30 78 42 46 20 30 78 42  BF 0xBF 0xBF 0xB
1db0: 46 20 30 78 36 32 7d 5d 0a 20 20 73 65 74 20 63  F 0x62}].  set c
1dc0: 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d 61 74 20   [binary format 
1dd0: 63 2a 20 7b 30 78 36 31 20 30 78 46 37 20 30 78  c* {0x61 0xF7 0x
1de0: 42 46 20 30 78 42 46 20 30 78 42 46 20 30 78 42  BF 0xBF 0xBF 0xB
1df0: 46 20 30 78 42 46 20 30 78 36 32 7d 5d 0a 20 20  F 0xBF 0x62}].  
1e00: 73 65 74 20 64 20 5b 62 69 6e 61 72 79 20 66 6f  set d [binary fo
1e10: 72 6d 61 74 20 63 2a 20 7b 30 78 36 31 20 30 78  rmat c* {0x61 0x
1e20: 46 37 20 30 78 42 46 20 30 78 42 46 20 30 78 42  F7 0xBF 0xBF 0xB
1e30: 46 20 30 78 42 46 20 30 78 42 46 20 30 78 42 46  F 0xBF 0xBF 0xBF
1e40: 20 30 78 36 32 7d 5d 0a 20 20 65 78 65 63 73 71   0x62}].  execsq
1e50: 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  l {.    INSERT I
1e60: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 24 61  NTO t1 VALUES($a
1e70: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
1e80: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 24 62 29  TO t1 VALUES($b)
1e90: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
1ea0: 4f 20 74 31 20 56 41 4c 55 45 53 28 24 63 29 3b  O t1 VALUES($c);
1eb0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
1ec0: 20 74 31 20 56 41 4c 55 45 53 28 24 64 29 3b 0a   t1 VALUES($d);.
1ed0: 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73    }.} {}..do_tes
1ee0: 74 20 34 2e 33 20 7b 0a 20 20 73 65 74 20 61 20  t 4.3 {.  set a 
1ef0: 5b 62 69 6e 61 72 79 20 66 6f 72 6d 61 74 20 63  [binary format c
1f00: 2a 20 7b 30 78 46 37 20 30 78 42 46 20 30 78 42  * {0xF7 0xBF 0xB
1f10: 46 20 30 78 42 46 7d 5d 0a 20 20 73 65 74 20 62  F 0xBF}].  set b
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 7d 5d 0a 20  BF 0xBF 0xBF}]. 
1f50: 20 73 65 74 20 63 20 5b 62 69 6e 61 72 79 20 66   set c [binary f
1f60: 6f 72 6d 61 74 20 63 2a 20 7b 30 78 46 37 20 30  ormat c* {0xF7 0
1f70: 78 42 46 20 30 78 42 46 20 30 78 42 46 20 30 78  xBF 0xBF 0xBF 0x
1f80: 42 46 20 30 78 42 46 7d 5d 0a 20 20 73 65 74 20  BF 0xBF}].  set 
1f90: 64 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d 61 74  d [binary format
1fa0: 20 63 2a 20 7b 30 78 46 37 20 30 78 42 46 20 30   c* {0xF7 0xBF 0
1fb0: 78 42 46 20 30 78 42 46 20 30 78 42 46 20 30 78  xBF 0xBF 0xBF 0x
1fc0: 42 46 20 30 78 42 46 7d 5d 0a 20 20 65 78 65 63  BF 0xBF}].  exec
1fd0: 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54  sql {.    INSERT
1fe0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
1ff0: 24 61 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  $a);.    INSERT 
2000: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 24  INTO t1 VALUES($
2010: 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  b);.    INSERT I
2020: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 24 63  NTO t1 VALUES($c
2030: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
2040: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 24 64 29  TO t1 VALUES($d)
2050: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 2d 2d 2d  ;.  }.} {}..#---
2060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20a0: 2d 2d 2d 2d 2d 2d 0a 0a 64 6f 5f 75 6e 69 63 6f  ------..do_unico
20b0: 64 65 5f 74 6f 6b 65 6e 5f 74 65 73 74 33 20 35  de_token_test3 5
20c0: 2e 31 20 7b 74 6f 6b 65 6e 63 68 61 72 73 3d 7d  .1 {tokenchars=}
20d0: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73   {.  sqlite3_res
20e0: 65 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  et sqlite3_colum
20f0: 6e 5f 69 6e 74 0a 7d 20 7b 0a 20 20 30 20 73 71  n_int.} {.  0 sq
2100: 6c 69 74 65 33 20 73 71 6c 69 74 65 33 20 0a 20  lite3 sqlite3 . 
2110: 20 31 20 72 65 73 65 74 20 72 65 73 65 74 20 0a   1 reset reset .
2120: 20 20 32 20 73 71 6c 69 74 65 33 20 73 71 6c 69    2 sqlite3 sqli
2130: 74 65 33 20 0a 20 20 33 20 63 6f 6c 75 6d 6e 20  te3 .  3 column 
2140: 63 6f 6c 75 6d 6e 20 0a 20 20 34 20 69 6e 74 20  column .  4 int 
2150: 69 6e 74 0a 7d 0a 0a 64 6f 5f 75 6e 69 63 6f 64  int.}..do_unicod
2160: 65 5f 74 6f 6b 65 6e 5f 74 65 73 74 33 20 35 2e  e_token_test3 5.
2170: 32 20 7b 74 6f 6b 65 6e 63 68 61 72 73 3d 5f 7d  2 {tokenchars=_}
2180: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73   {.  sqlite3_res
2190: 65 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  et sqlite3_colum
21a0: 6e 5f 69 6e 74 0a 7d 20 7b 0a 20 20 30 20 73 71  n_int.} {.  0 sq
21b0: 6c 69 74 65 33 5f 72 65 73 65 74 20 73 71 6c 69  lite3_reset sqli
21c0: 74 65 33 5f 72 65 73 65 74 20 0a 20 20 31 20 73  te3_reset .  1 s
21d0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
21e0: 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  t sqlite3_column
21f0: 5f 69 6e 74 0a 7d 0a 0a 64 6f 5f 75 6e 69 63 6f  _int.}..do_unico
2200: 64 65 5f 74 6f 6b 65 6e 5f 74 65 73 74 33 20 35  de_token_test3 5
2210: 2e 33 20 7b 73 65 70 61 72 61 74 6f 72 73 3d 78  .3 {separators=x
2220: 79 7a 7d 20 7b 0a 20 20 4c 61 6f 74 69 61 6e 78  yz} {.  Laotianx
2230: 68 6f 72 73 65 79 72 75 6e 73 7a 66 61 73 74 0a  horseyrunszfast.
2240: 7d 20 7b 0a 20 20 30 20 6c 61 6f 74 69 61 6e 20  } {.  0 laotian 
2250: 4c 61 6f 74 69 61 6e 0a 20 20 31 20 68 6f 72 73  Laotian.  1 hors
2260: 65 20 68 6f 72 73 65 0a 20 20 32 20 72 75 6e 73  e horse.  2 runs
2270: 20 72 75 6e 73 0a 20 20 33 20 66 61 73 74 20 66   runs.  3 fast f
2280: 61 73 74 0a 7d 0a 0a 64 6f 5f 75 6e 69 63 6f 64  ast.}..do_unicod
2290: 65 5f 74 6f 6b 65 6e 5f 74 65 73 74 33 20 35 2e  e_token_test3 5.
22a0: 34 20 7b 74 6f 6b 65 6e 63 68 61 72 73 3d 78 79  4 {tokenchars=xy
22b0: 7a 7d 20 7b 0a 20 20 4c 61 6f 74 69 61 6e 78 68  z} {.  Laotianxh
22c0: 6f 72 73 65 79 72 75 6e 73 7a 66 61 73 74 0a 7d  orseyrunszfast.}
22d0: 20 7b 0a 20 20 30 20 6c 61 6f 74 69 61 6e 78 68   {.  0 laotianxh
22e0: 6f 72 73 65 79 72 75 6e 73 7a 66 61 73 74 20 4c  orseyrunszfast L
22f0: 61 6f 74 69 61 6e 78 68 6f 72 73 65 79 72 75 6e  aotianxhorseyrun
2300: 73 7a 66 61 73 74 0a 7d 0a 0a 64 6f 5f 75 6e 69  szfast.}..do_uni
2310: 63 6f 64 65 5f 74 6f 6b 65 6e 5f 74 65 73 74 33  code_token_test3
2320: 20 35 2e 35 20 7b 74 6f 6b 65 6e 63 68 61 72 73   5.5 {tokenchars
2330: 3d 5f 7d 20 7b 73 65 70 61 72 61 74 6f 72 73 3d  =_} {separators=
2340: 7a 79 78 7d 20 7b 0a 20 20 73 71 6c 69 74 65 33  zyx} {.  sqlite3
2350: 5f 72 65 73 65 74 78 73 71 6c 69 74 65 33 5f 63  _resetxsqlite3_c
2360: 6f 6c 75 6d 6e 5f 69 6e 74 79 68 6f 6e 64 61 5f  olumn_intyhonda_
2370: 70 68 61 6e 74 6f 6d 0a 7d 20 7b 0a 20 20 30 20  phantom.} {.  0 
2380: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 20 73 71  sqlite3_reset sq
2390: 6c 69 74 65 33 5f 72 65 73 65 74 20 0a 20 20 31  lite3_reset .  1
23a0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
23b0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  int sqlite3_colu
23c0: 6d 6e 5f 69 6e 74 0a 20 20 32 20 68 6f 6e 64 61  mn_int.  2 honda
23d0: 5f 70 68 61 6e 74 6f 6d 20 68 6f 6e 64 61 5f 70  _phantom honda_p
23e0: 68 61 6e 74 6f 6d 0a 7d 0a 0a 64 6f 5f 75 6e 69  hantom.}..do_uni
23f0: 63 6f 64 65 5f 74 6f 6b 65 6e 5f 74 65 73 74 33  code_token_test3
2400: 20 35 2e 36 20 22 73 65 70 61 72 61 74 6f 72 73   5.6 "separators
2410: 3d 5c 75 30 35 44 31 22 20 22 61 62 63 5c 75 30  =\u05D1" "abc\u0
2420: 35 44 31 64 65 66 22 20 7b 0a 20 20 30 20 61 62  5D1def" {.  0 ab
2430: 63 20 61 62 63 20 31 20 64 65 66 20 64 65 66 0a  c abc 1 def def.
2440: 7d 0a 0a 64 6f 5f 75 6e 69 63 6f 64 65 5f 74 6f  }..do_unicode_to
2450: 6b 65 6e 5f 74 65 73 74 33 20 35 2e 37 20 20 20  ken_test3 5.7   
2460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2470: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 22 74            \.  "t
2480: 6f 6b 65 6e 63 68 61 72 73 3d 5c 75 32 34 34 34  okenchars=\u2444
2490: 5c 75 32 34 34 35 22 20 20 20 20 20 20 20 20 20  \u2445"         
24a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b0: 20 20 20 5c 0a 20 20 22 73 65 70 61 72 61 74 6f     \.  "separato
24c0: 72 73 3d 5c 75 30 35 44 30 5c 75 30 35 44 31 5c  rs=\u05D0\u05D1\
24d0: 75 30 35 44 32 22 20 20 20 20 20 20 20 20 20 20  u05D2"          
24e0: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
24f0: 22 5c 75 32 34 34 34 66 72 65 5c 75 32 34 34 35  "\u2444fre\u2445
2500: 73 68 5c 75 30 35 44 30 77 61 74 65 72 5c 75 30  sh\u05D0water\u0
2510: 35 44 32 66 69 73 68 2e 5c 75 32 34 34 35 74 69  5D2fish.\u2445ti
2520: 6d 65 72 22 20 5c 0a 20 20 5b 6c 69 73 74 20 20  mer" \.  [list  
2530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 5c 0a                \.
2560: 20 20 20 20 30 20 5c 75 32 34 34 34 66 72 65 5c      0 \u2444fre\
2570: 75 32 34 34 35 73 68 20 5c 75 32 34 34 34 66 72  u2445sh \u2444fr
2580: 65 5c 75 32 34 34 35 73 68 20 20 20 20 20 20 20  e\u2445sh       
2590: 20 20 20 20 20 20 20 5c 0a 20 20 20 20 31 20 77         \.    1 w
25a0: 61 74 65 72 20 77 61 74 65 72 20 20 20 20 20 20  ater water      
25b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d0: 5c 0a 20 20 20 20 32 20 66 69 73 68 20 66 69 73  \.    2 fish fis
25e0: 68 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h               
25f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2600: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 33           \.    3
2610: 20 5c 75 32 34 34 35 74 69 6d 65 72 20 5c 75 32   \u2445timer \u2
2620: 34 34 35 74 69 6d 65 72 20 20 20 20 20 20 20 20  445timer        
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2640: 20 20 5c 0a 20 20 5d 0a 0a 23 20 43 68 65 63 6b    \.  ]..# Check
2650: 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
2660: 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20  possible to add 
2670: 61 20 73 74 61 6e 64 61 6c 6f 6e 65 20 64 69 61  a standalone dia
2680: 63 72 69 74 69 63 20 63 6f 64 65 70 6f 69 6e 74  critic codepoint
2690: 20 0a 23 20 74 6f 20 65 69 74 68 65 72 20 73 65   .# to either se
26a0: 70 61 72 61 74 6f 72 73 20 6f 72 20 74 6f 6b 65  parators or toke
26b0: 6e 63 68 61 72 73 2e 0a 64 6f 5f 75 6e 69 63 6f  nchars..do_unico
26c0: 64 65 5f 74 6f 6b 65 6e 5f 74 65 73 74 33 20 35  de_token_test3 5
26d0: 2e 38 20 22 73 65 70 61 72 61 74 6f 72 73 3d 5c  .8 "separators=\
26e0: 75 30 33 30 31 22 20 5c 0a 20 20 22 68 65 6c 6c  u0301" \.  "hell
26f0: 6f 5c 75 30 33 30 31 77 6f 72 6c 64 20 5c 75 30  o\u0301world \u0
2700: 33 30 31 68 65 6c 6c 6f 77 6f 72 6c 64 22 20 20  301helloworld"  
2710: 20 20 20 20 20 20 20 20 5c 0a 20 20 22 30 20 68          \.  "0 h
2720: 65 6c 6c 6f 77 6f 72 6c 64 20 68 65 6c 6c 6f 5c  elloworld hello\
2730: 75 30 33 30 31 77 6f 72 6c 64 20 31 20 68 65 6c  u0301world 1 hel
2740: 6c 6f 77 6f 72 6c 64 20 68 65 6c 6c 6f 77 6f 72  loworld hellowor
2750: 6c 64 22 0a 0a 64 6f 5f 75 6e 69 63 6f 64 65 5f  ld"..do_unicode_
2760: 74 6f 6b 65 6e 5f 74 65 73 74 33 20 35 2e 39 20  token_test3 5.9 
2770: 22 74 6f 6b 65 6e 63 68 61 72 73 3d 5c 75 30 33  "tokenchars=\u03
2780: 30 31 22 20 5c 0a 20 20 22 68 65 6c 6c 6f 5c 75  01" \.  "hello\u
2790: 30 33 30 31 77 6f 72 6c 64 20 5c 75 30 33 30 31  0301world \u0301
27a0: 68 65 6c 6c 6f 77 6f 72 6c 64 22 20 20 20 20 20  helloworld"     
27b0: 20 20 20 20 20 5c 0a 20 20 22 30 20 68 65 6c 6c       \.  "0 hell
27c0: 6f 77 6f 72 6c 64 20 68 65 6c 6c 6f 5c 75 30 33  oworld hello\u03
27d0: 30 31 77 6f 72 6c 64 20 31 20 68 65 6c 6c 6f 77  01world 1 hellow
27e0: 6f 72 6c 64 20 68 65 6c 6c 6f 77 6f 72 6c 64 22  orld helloworld"
27f0: 0a 0a 64 6f 5f 75 6e 69 63 6f 64 65 5f 74 6f 6b  ..do_unicode_tok
2800: 65 6e 5f 74 65 73 74 33 20 35 2e 31 30 20 22 73  en_test3 5.10 "s
2810: 65 70 61 72 61 74 6f 72 73 3d 5c 75 30 33 30 31  eparators=\u0301
2820: 22 20 5c 0a 20 20 22 72 65 6d 6f 76 65 5f 64 69  " \.  "remove_di
2830: 61 63 72 69 74 69 63 73 3d 30 22 20 20 20 20 20  acritics=0"     
2840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2850: 20 20 20 5c 0a 20 20 22 68 65 6c 6c 6f 5c 75 30     \.  "hello\u0
2860: 33 30 31 77 6f 72 6c 64 20 5c 75 30 33 30 31 68  301world \u0301h
2870: 65 6c 6c 6f 77 6f 72 6c 64 22 20 20 20 20 20 20  elloworld"      
2880: 20 20 20 20 5c 0a 20 20 22 30 20 68 65 6c 6c 6f      \.  "0 hello
2890: 5c 75 30 33 30 31 77 6f 72 6c 64 20 68 65 6c 6c  \u0301world hell
28a0: 6f 5c 75 30 33 30 31 77 6f 72 6c 64 20 31 20 68  o\u0301world 1 h
28b0: 65 6c 6c 6f 77 6f 72 6c 64 20 68 65 6c 6c 6f 77  elloworld hellow
28c0: 6f 72 6c 64 22 0a 0a 64 6f 5f 75 6e 69 63 6f 64  orld"..do_unicod
28d0: 65 5f 74 6f 6b 65 6e 5f 74 65 73 74 33 20 35 2e  e_token_test3 5.
28e0: 31 31 20 22 74 6f 6b 65 6e 63 68 61 72 73 3d 5c  11 "tokenchars=\
28f0: 75 30 33 30 31 22 20 5c 0a 20 20 22 72 65 6d 6f  u0301" \.  "remo
2900: 76 65 5f 64 69 61 63 72 69 74 69 63 73 3d 30 22  ve_diacritics=0"
2910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2920: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 22 68 65           \.  "he
2930: 6c 6c 6f 5c 75 30 33 30 31 77 6f 72 6c 64 20 5c  llo\u0301world \
2940: 75 30 33 30 31 68 65 6c 6c 6f 77 6f 72 6c 64 22  u0301helloworld"
2950: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 22             \.  "
2960: 30 20 68 65 6c 6c 6f 5c 75 30 33 30 31 77 6f 72  0 hello\u0301wor
2970: 6c 64 20 68 65 6c 6c 6f 5c 75 30 33 30 31 77 6f  ld hello\u0301wo
2980: 72 6c 64 20 31 20 68 65 6c 6c 6f 77 6f 72 6c 64  rld 1 helloworld
2990: 20 68 65 6c 6c 6f 77 6f 72 6c 64 22 0a 0a 0a 23   helloworld"...#
29a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
29b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
29c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
29d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
29e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 70 72 6f 63 20  ---------..proc 
29f0: 64 6f 5f 74 6f 6b 65 6e 69 7a 65 20 7b 74 6f 6b  do_tokenize {tok
2a00: 65 6e 69 7a 65 72 20 74 78 74 7d 20 7b 0a 20 20  enizer txt} {.  
2a10: 73 65 74 20 72 65 73 20 5b 6c 69 73 74 5d 0a 20  set res [list]. 
2a20: 20 66 6f 72 65 61 63 68 20 7b 61 20 62 20 63 7d   foreach {a b c}
2a30: 20 5b 64 62 20 6f 6e 65 20 7b 53 45 4c 45 43 54   [db one {SELECT
2a40: 20 66 74 73 33 5f 74 6f 6b 65 6e 69 7a 65 72 5f   fts3_tokenizer_
2a50: 74 65 73 74 28 24 74 6f 6b 65 6e 69 7a 65 72 2c  test($tokenizer,
2a60: 20 24 74 78 74 29 7d 5d 20 7b 0a 20 20 20 20 6c   $txt)}] {.    l
2a70: 61 70 70 65 6e 64 20 72 65 73 20 24 62 0a 20 20  append res $b.  
2a80: 7d 0a 20 20 73 65 74 20 72 65 73 0a 7d 0a 0a 23  }.  set res.}..#
2a90: 20 41 72 67 75 6d 65 6e 74 20 24 6c 43 6f 64 65   Argument $lCode
2aa0: 70 6f 69 6e 74 20 6d 75 73 74 20 62 65 20 61 20  point must be a 
2ab0: 6c 69 73 74 20 6f 66 20 63 6f 64 65 70 6f 69 6e  list of codepoin
2ac0: 74 73 20 28 69 6e 74 65 67 65 72 73 29 20 74 68  ts (integers) th
2ad0: 61 74 20 0a 23 20 63 6f 72 72 65 73 70 6f 6e 64  at .# correspond
2ae0: 20 74 6f 20 77 68 69 74 65 73 70 61 63 65 20 63   to whitespace c
2af0: 68 61 72 61 63 74 65 72 73 2e 20 54 68 69 73 20  haracters. This 
2b00: 63 6f 6d 6d 61 6e 64 20 63 72 65 61 74 65 73 20  command creates 
2b10: 61 20 73 74 72 69 6e 67 0a 23 20 24 57 20 66 72  a string.# $W fr
2b20: 6f 6d 20 74 68 65 20 63 6f 64 65 70 6f 69 6e 74  om the codepoint
2b30: 73 2c 20 74 68 65 6e 20 74 6f 6b 65 6e 69 7a 65  s, then tokenize
2b40: 73 20 22 24 7b 57 7d 68 65 6c 6c 6f 7b 24 57 7d  s "${W}hello{$W}
2b50: 77 6f 72 6c 64 24 7b 57 7d 22 20 0a 23 20 75 73  world${W}" .# us
2b60: 69 6e 67 20 74 6f 6b 65 6e 69 7a 65 72 20 24 74  ing tokenizer $t
2b70: 6f 6b 65 6e 69 7a 65 72 2e 20 54 68 65 20 74 65  okenizer. The te
2b80: 73 74 20 70 61 73 73 65 73 20 69 66 20 74 68 65  st passes if the
2b90: 20 74 6f 6b 65 6e 69 7a 65 72 20 73 75 63 63 65   tokenizer succe
2ba0: 73 73 66 75 6c 6c 79 0a 23 20 65 78 74 72 61 63  ssfully.# extrac
2bb0: 74 73 20 74 68 65 20 74 77 6f 20 35 20 63 68 61  ts the two 5 cha
2bc0: 72 61 63 74 65 72 20 74 6f 6b 65 6e 73 2e 0a 23  racter tokens..#
2bd0: 0a 70 72 6f 63 20 64 6f 5f 69 73 73 70 61 63 65  .proc do_isspace
2be0: 5f 74 65 73 74 20 7b 74 6e 20 74 6f 6b 65 6e 69  _test {tn tokeni
2bf0: 7a 65 72 20 6c 43 70 7d 20 7b 0a 20 20 73 65 74  zer lCp} {.  set
2c00: 20 77 68 69 74 65 73 70 61 63 65 20 5b 66 6f 72   whitespace [for
2c10: 6d 61 74 20 5b 73 74 72 69 6e 67 20 72 65 70 65  mat [string repe
2c20: 61 74 20 25 63 20 5b 6c 6c 65 6e 67 74 68 20 24  at %c [llength $
2c30: 6c 43 70 5d 5d 20 7b 2a 7d 24 6c 43 70 5d 20 0a  lCp]] {*}$lCp] .
2c40: 20 20 73 65 74 20 74 78 74 20 22 24 7b 77 68 69    set txt "${whi
2c50: 74 65 73 70 61 63 65 7d 68 65 6c 6c 6f 24 7b 77  tespace}hello${w
2c60: 68 69 74 65 73 70 61 63 65 7d 77 6f 72 6c 64 24  hitespace}world$
2c70: 7b 77 68 69 74 65 73 70 61 63 65 7d 22 0a 20 20  {whitespace}".  
2c80: 75 70 6c 65 76 65 6c 20 5b 6c 69 73 74 20 64 6f  uplevel [list do
2c90: 5f 74 65 73 74 20 24 74 6e 20 5b 6c 69 73 74 20  _test $tn [list 
2ca0: 64 6f 5f 74 6f 6b 65 6e 69 7a 65 20 24 74 6f 6b  do_tokenize $tok
2cb0: 65 6e 69 7a 65 72 20 24 74 78 74 5d 20 7b 68 65  enizer $txt] {he
2cc0: 6c 6c 6f 20 77 6f 72 6c 64 7d 5d 0a 7d 0a 0a 73  llo world}].}..s
2cd0: 65 74 20 74 6f 6b 65 6e 69 7a 65 72 73 20 5b 6c  et tokenizers [l
2ce0: 69 73 74 20 75 6e 69 63 6f 64 65 36 31 5d 0a 69  ist unicode61].i
2cf0: 66 63 61 70 61 62 6c 65 20 69 63 75 20 7b 20 6c  fcapable icu { l
2d00: 61 70 70 65 6e 64 20 74 6f 6b 65 6e 69 7a 65 72  append tokenizer
2d10: 73 20 69 63 75 20 7d 0a 0a 23 20 53 6f 6d 65 20  s icu }..# Some 
2d20: 74 65 73 74 73 20 74 6f 20 63 68 65 63 6b 20 74  tests to check t
2d30: 68 61 74 20 74 68 65 20 74 6f 6b 65 6e 69 7a 65  hat the tokenize
2d40: 72 73 20 63 61 6e 20 62 6f 74 68 20 69 64 65 6e  rs can both iden
2d50: 74 69 66 79 20 77 68 69 74 65 2d 73 70 61 63 65  tify white-space
2d60: 20 0a 23 20 63 6f 64 65 70 6f 69 6e 74 73 2e 20   .# codepoints. 
2d70: 41 6c 6c 20 63 6f 64 65 70 6f 69 6e 74 73 20 74  All codepoints t
2d80: 65 73 74 65 64 20 62 65 6c 6f 77 20 61 72 65 20  ested below are 
2d90: 6f 66 20 74 79 70 65 20 22 5a 73 22 20 69 6e 20  of type "Zs" in 
2da0: 74 68 65 0a 23 20 55 6e 69 63 6f 64 65 44 61 74  the.# UnicodeDat
2db0: 61 2e 74 78 74 20 66 69 6c 65 2e 0a 66 6f 72 65  a.txt file..fore
2dc0: 61 63 68 20 54 20 24 74 6f 6b 65 6e 69 7a 65 72  ach T $tokenizer
2dd0: 73 20 7b 0a 20 20 64 6f 5f 69 73 73 70 61 63 65  s {.  do_isspace
2de0: 5f 74 65 73 74 20 36 2e 24 54 2e 31 20 24 54 20  _test 6.$T.1 $T 
2df0: 20 20 20 33 32 0a 20 20 64 6f 5f 69 73 73 70 61     32.  do_isspa
2e00: 63 65 5f 74 65 73 74 20 36 2e 24 54 2e 32 20 24  ce_test 6.$T.2 $
2e10: 54 20 20 20 20 31 36 30 0a 20 20 64 6f 5f 69 73  T    160.  do_is
2e20: 73 70 61 63 65 5f 74 65 73 74 20 36 2e 24 54 2e  space_test 6.$T.
2e30: 33 20 24 54 20 20 20 20 35 37 36 30 0a 20 20 64  3 $T    5760.  d
2e40: 6f 5f 69 73 73 70 61 63 65 5f 74 65 73 74 20 36  o_isspace_test 6
2e50: 2e 24 54 2e 34 20 24 54 20 20 20 20 36 31 35 38  .$T.4 $T    6158
2e60: 0a 20 20 64 6f 5f 69 73 73 70 61 63 65 5f 74 65  .  do_isspace_te
2e70: 73 74 20 36 2e 24 54 2e 35 20 24 54 20 20 20 20  st 6.$T.5 $T    
2e80: 38 31 39 32 0a 20 20 64 6f 5f 69 73 73 70 61 63  8192.  do_isspac
2e90: 65 5f 74 65 73 74 20 36 2e 24 54 2e 36 20 24 54  e_test 6.$T.6 $T
2ea0: 20 20 20 20 38 31 39 33 0a 20 20 64 6f 5f 69 73      8193.  do_is
2eb0: 73 70 61 63 65 5f 74 65 73 74 20 36 2e 24 54 2e  space_test 6.$T.
2ec0: 37 20 24 54 20 20 20 20 38 31 39 34 0a 20 20 64  7 $T    8194.  d
2ed0: 6f 5f 69 73 73 70 61 63 65 5f 74 65 73 74 20 36  o_isspace_test 6
2ee0: 2e 24 54 2e 38 20 24 54 20 20 20 20 38 31 39 35  .$T.8 $T    8195
2ef0: 0a 20 20 64 6f 5f 69 73 73 70 61 63 65 5f 74 65  .  do_isspace_te
2f00: 73 74 20 36 2e 24 54 2e 39 20 24 54 20 20 20 20  st 6.$T.9 $T    
2f10: 38 31 39 36 0a 20 20 64 6f 5f 69 73 73 70 61 63  8196.  do_isspac
2f20: 65 5f 74 65 73 74 20 36 2e 24 54 2e 31 30 20 24  e_test 6.$T.10 $
2f30: 54 20 20 20 20 38 31 39 37 0a 20 20 64 6f 5f 69  T    8197.  do_i
2f40: 73 73 70 61 63 65 5f 74 65 73 74 20 36 2e 24 54  sspace_test 6.$T
2f50: 2e 31 31 20 24 54 20 20 20 20 38 31 39 38 0a 20  .11 $T    8198. 
2f60: 20 64 6f 5f 69 73 73 70 61 63 65 5f 74 65 73 74   do_isspace_test
2f70: 20 36 2e 24 54 2e 31 32 20 24 54 20 20 20 20 38   6.$T.12 $T    8
2f80: 31 39 39 0a 20 20 64 6f 5f 69 73 73 70 61 63 65  199.  do_isspace
2f90: 5f 74 65 73 74 20 36 2e 24 54 2e 31 33 20 24 54  _test 6.$T.13 $T
2fa0: 20 20 20 20 38 32 30 30 0a 20 20 64 6f 5f 69 73      8200.  do_is
2fb0: 73 70 61 63 65 5f 74 65 73 74 20 36 2e 24 54 2e  space_test 6.$T.
2fc0: 31 34 20 24 54 20 20 20 20 38 32 30 31 0a 20 20  14 $T    8201.  
2fd0: 64 6f 5f 69 73 73 70 61 63 65 5f 74 65 73 74 20  do_isspace_test 
2fe0: 36 2e 24 54 2e 31 35 20 24 54 20 20 20 20 38 32  6.$T.15 $T    82
2ff0: 30 32 0a 20 20 64 6f 5f 69 73 73 70 61 63 65 5f  02.  do_isspace_
3000: 74 65 73 74 20 36 2e 24 54 2e 31 36 20 24 54 20  test 6.$T.16 $T 
3010: 20 20 20 38 32 33 39 0a 20 20 64 6f 5f 69 73 73     8239.  do_iss
3020: 70 61 63 65 5f 74 65 73 74 20 36 2e 24 54 2e 31  pace_test 6.$T.1
3030: 37 20 24 54 20 20 20 20 38 32 38 37 0a 20 20 64  7 $T    8287.  d
3040: 6f 5f 69 73 73 70 61 63 65 5f 74 65 73 74 20 36  o_isspace_test 6
3050: 2e 24 54 2e 31 38 20 24 54 20 20 20 31 32 32 38  .$T.18 $T   1228
3060: 38 0a 0a 20 20 64 6f 5f 69 73 73 70 61 63 65 5f  8..  do_isspace_
3070: 74 65 73 74 20 36 2e 24 54 2e 31 39 20 24 54 20  test 6.$T.19 $T 
3080: 20 20 7b 33 32 20 31 36 30 20 35 37 36 30 20 36    {32 160 5760 6
3090: 31 35 38 7d 0a 20 20 64 6f 5f 69 73 73 70 61 63  158}.  do_isspac
30a0: 65 5f 74 65 73 74 20 36 2e 24 54 2e 31 39 20 24  e_test 6.$T.19 $
30b0: 54 20 20 20 7b 38 31 39 32 20 38 31 39 33 20 38  T   {8192 8193 8
30c0: 31 39 34 20 38 31 39 35 7d 0a 20 20 64 6f 5f 69  194 8195}.  do_i
30d0: 73 73 70 61 63 65 5f 74 65 73 74 20 36 2e 24 54  sspace_test 6.$T
30e0: 2e 31 39 20 24 54 20 20 20 7b 38 31 39 36 20 38  .19 $T   {8196 8
30f0: 31 39 37 20 38 31 39 38 20 38 31 39 39 7d 0a 20  197 8198 8199}. 
3100: 20 64 6f 5f 69 73 73 70 61 63 65 5f 74 65 73 74   do_isspace_test
3110: 20 36 2e 24 54 2e 31 39 20 24 54 20 20 20 7b 38   6.$T.19 $T   {8
3120: 32 30 30 20 38 32 30 31 20 38 32 30 32 20 38 32  200 8201 8202 82
3130: 33 39 7d 0a 20 20 64 6f 5f 69 73 73 70 61 63 65  39}.  do_isspace
3140: 5f 74 65 73 74 20 36 2e 24 54 2e 31 39 20 24 54  _test 6.$T.19 $T
3150: 20 20 20 7b 38 32 38 37 20 31 32 32 38 38 7d 0a     {8287 12288}.
3160: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
3170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
31a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
31b0: 54 65 73 74 20 74 68 61 74 20 74 68 65 20 70 72  Test that the pr
31c0: 69 76 61 74 65 20 75 73 65 20 72 61 6e 67 65 73  ivate use ranges
31d0: 20 61 72 65 20 74 72 65 61 74 65 64 20 61 73 20   are treated as 
31e0: 61 6c 70 68 61 6e 75 6d 65 72 69 63 2e 0a 23 0a  alphanumeric..#.
31f0: 62 72 65 61 6b 70 6f 69 6e 74 0a 66 6f 72 65 61  breakpoint.forea
3200: 63 68 20 7b 74 6e 31 20 63 7d 20 7b 0a 20 20 31  ch {tn1 c} {.  1
3210: 20 5c 75 65 30 30 30 20 32 20 5c 75 65 30 30 31   \ue000 2 \ue001
3220: 20 33 20 5c 75 66 30 30 30 20 34 20 5c 75 66 38   3 \uf000 4 \uf8
3230: 66 65 20 35 20 5c 75 66 38 66 66 0a 7d 20 7b 0a  fe 5 \uf8ff.} {.
3240: 20 20 66 6f 72 65 61 63 68 20 7b 74 6e 32 20 63    foreach {tn2 c
3250: 6f 6e 66 69 67 20 72 65 73 7d 20 7b 0a 20 20 20  onfig res} {.   
3260: 20 31 20 22 22 20 20 20 20 20 20 20 20 20 20 20   1 ""           
3270: 20 20 22 30 20 68 65 6c 6c 6f 2a 77 6f 72 6c 64    "0 hello*world
3280: 20 68 65 6c 6c 6f 2a 77 6f 72 6c 64 22 0a 20 20   hello*world".  
3290: 20 20 32 20 22 73 65 70 61 72 61 74 6f 72 73 3d    2 "separators=
32a0: 2a 22 20 22 30 20 68 65 6c 6c 6f 20 68 65 6c 6c  *" "0 hello hell
32b0: 6f 20 31 20 77 6f 72 6c 64 20 77 6f 72 6c 64 22  o 1 world world"
32c0: 0a 20 20 7d 20 7b 0a 20 20 20 20 73 65 74 20 63  .  } {.    set c
32d0: 6f 6e 66 69 67 20 5b 73 74 72 69 6e 67 20 6d 61  onfig [string ma
32e0: 70 20 5b 6c 69 73 74 20 2a 20 24 63 5d 20 24 63  p [list * $c] $c
32f0: 6f 6e 66 69 67 5d 0a 20 20 20 20 73 65 74 20 69  onfig].    set i
3300: 6e 70 75 74 20 20 5b 73 74 72 69 6e 67 20 6d 61  nput  [string ma
3310: 70 20 5b 6c 69 73 74 20 2a 20 24 63 5d 20 22 68  p [list * $c] "h
3320: 65 6c 6c 6f 2a 77 6f 72 6c 64 22 5d 0a 20 20 20  ello*world"].   
3330: 20 73 65 74 20 6f 75 74 70 75 74 20 5b 73 74 72   set output [str
3340: 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20 2a 20  ing map [list * 
3350: 24 63 5d 20 24 72 65 73 5d 0a 20 20 20 20 64 6f  $c] $res].    do
3360: 5f 75 6e 69 63 6f 64 65 5f 74 6f 6b 65 6e 5f 74  _unicode_token_t
3370: 65 73 74 33 20 37 2e 24 74 6e 31 2e 24 74 6e 32  est3 7.$tn1.$tn2
3380: 20 7b 2a 7d 24 63 6f 6e 66 69 67 20 24 69 6e 70   {*}$config $inp
3390: 75 74 20 24 6f 75 74 70 75 74 0a 20 20 7d 0a 7d  ut $output.  }.}
33a0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
33b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
33c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
33d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
33e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 43  ------------.# C
33f0: 75 72 73 6f 72 79 20 74 65 73 74 20 6f 66 20 72  ursory test of r
3400: 65 6d 6f 76 65 5f 64 69 61 63 72 69 74 69 63 73  emove_diacritics
3410: 3d 30 2e 0a 23 0a 23 20 30 30 43 34 3b 4c 41 54  =0..#.# 00C4;LAT
3420: 49 4e 20 43 41 50 49 54 41 4c 20 4c 45 54 54 45  IN CAPITAL LETTE
3430: 52 20 41 20 57 49 54 48 20 44 49 41 45 52 45 53  R A WITH DIAERES
3440: 49 53 0a 23 20 30 30 44 36 3b 4c 41 54 49 4e 20  IS.# 00D6;LATIN 
3450: 43 41 50 49 54 41 4c 20 4c 45 54 54 45 52 20 4f  CAPITAL LETTER O
3460: 20 57 49 54 48 20 44 49 41 45 52 45 53 49 53 0a   WITH DIAERESIS.
3470: 23 20 30 30 45 34 3b 4c 41 54 49 4e 20 53 4d 41  # 00E4;LATIN SMA
3480: 4c 4c 20 4c 45 54 54 45 52 20 41 20 57 49 54 48  LL LETTER A WITH
3490: 20 44 49 41 45 52 45 53 49 53 0a 23 20 30 30 46   DIAERESIS.# 00F
34a0: 36 3b 4c 41 54 49 4e 20 53 4d 41 4c 4c 20 4c 45  6;LATIN SMALL LE
34b0: 54 54 45 52 20 4f 20 57 49 54 48 20 44 49 41 45  TTER O WITH DIAE
34c0: 52 45 53 49 53 0a 23 0a 64 6f 5f 65 78 65 63 73  RESIS.#.do_execs
34d0: 71 6c 5f 74 65 73 74 20 38 2e 31 2e 31 20 22 0a  ql_test 8.1.1 ".
34e0: 20 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c    CREATE VIRTUAL
34f0: 20 54 41 42 4c 45 20 74 33 20 55 53 49 4e 47 20   TABLE t3 USING 
3500: 66 74 73 34 28 74 6f 6b 65 6e 69 7a 65 3d 75 6e  fts4(tokenize=un
3510: 69 63 6f 64 65 36 31 20 27 72 65 6d 6f 76 65 5f  icode61 'remove_
3520: 64 69 61 63 72 69 74 69 63 73 3d 31 27 29 3b 0a  diacritics=1');.
3530: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
3540: 20 56 41 4c 55 45 53 28 27 6f 27 29 3b 0a 20 20   VALUES('o');.  
3550: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56  INSERT INTO t3 V
3560: 41 4c 55 45 53 28 27 61 27 29 3b 0a 20 20 49 4e  ALUES('a');.  IN
3570: 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c  SERT INTO t3 VAL
3580: 55 45 53 28 27 4f 27 29 3b 0a 20 20 49 4e 53 45  UES('O');.  INSE
3590: 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45  RT INTO t3 VALUE
35a0: 53 28 27 41 27 29 3b 0a 20 20 49 4e 53 45 52 54  S('A');.  INSERT
35b0: 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28   INTO t3 VALUES(
35c0: 27 5c 78 44 36 27 29 3b 0a 20 20 49 4e 53 45 52  '\xD6');.  INSER
35d0: 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53  T INTO t3 VALUES
35e0: 28 27 5c 78 43 34 27 29 3b 0a 20 20 49 4e 53 45  ('\xC4');.  INSE
35f0: 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45  RT INTO t3 VALUE
3600: 53 28 27 5c 78 46 36 27 29 3b 0a 20 20 49 4e 53  S('\xF6');.  INS
3610: 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55  ERT INTO t3 VALU
3620: 45 53 28 27 5c 78 45 34 27 29 3b 0a 22 0a 64 6f  ES('\xE4');.".do
3630: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 38 2e  _execsql_test 8.
3640: 31 2e 32 20 7b 0a 20 20 53 45 4c 45 43 54 20 72  1.2 {.  SELECT r
3650: 6f 77 69 64 20 46 52 4f 4d 20 74 33 20 57 48 45  owid FROM t3 WHE
3660: 52 45 20 74 33 20 4d 41 54 43 48 20 27 6f 27 3b  RE t3 MATCH 'o';
3670: 0a 7d 20 7b 31 20 33 20 35 20 37 7d 0a 64 6f 5f  .} {1 3 5 7}.do_
3680: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 38 2e 31  execsql_test 8.1
3690: 2e 33 20 7b 0a 20 20 53 45 4c 45 43 54 20 72 6f  .3 {.  SELECT ro
36a0: 77 69 64 20 46 52 4f 4d 20 74 33 20 57 48 45 52  wid FROM t3 WHER
36b0: 45 20 74 33 20 4d 41 54 43 48 20 27 61 27 3b 0a  E t3 MATCH 'a';.
36c0: 7d 20 7b 32 20 34 20 36 20 38 7d 0a 64 6f 5f 65  } {2 4 6 8}.do_e
36d0: 78 65 63 73 71 6c 5f 74 65 73 74 20 38 2e 32 2e  xecsql_test 8.2.
36e0: 31 20 7b 0a 20 20 43 52 45 41 54 45 20 56 49 52  1 {.  CREATE VIR
36f0: 54 55 41 4c 20 54 41 42 4c 45 20 74 34 20 55 53  TUAL TABLE t4 US
3700: 49 4e 47 20 66 74 73 34 28 74 6f 6b 65 6e 69 7a  ING fts4(tokeniz
3710: 65 3d 75 6e 69 63 6f 64 65 36 31 20 22 72 65 6d  e=unicode61 "rem
3720: 6f 76 65 5f 64 69 61 63 72 69 74 69 63 73 3d 30  ove_diacritics=0
3730: 22 29 3b 0a 20 20 49 4e 53 45 52 54 20 49 4e 54  ");.  INSERT INT
3740: 4f 20 74 34 20 53 45 4c 45 43 54 20 2a 20 46 52  O t4 SELECT * FR
3750: 4f 4d 20 74 33 3b 0a 7d 0a 64 6f 5f 65 78 65 63  OM t3;.}.do_exec
3760: 73 71 6c 5f 74 65 73 74 20 38 2e 32 2e 32 20 7b  sql_test 8.2.2 {
3770: 0a 20 20 53 45 4c 45 43 54 20 72 6f 77 69 64 20  .  SELECT rowid 
3780: 46 52 4f 4d 20 74 34 20 57 48 45 52 45 20 74 34  FROM t4 WHERE t4
3790: 20 4d 41 54 43 48 20 27 6f 27 3b 0a 7d 20 7b 31   MATCH 'o';.} {1
37a0: 20 33 7d 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74   3}.do_execsql_t
37b0: 65 73 74 20 38 2e 32 2e 33 20 7b 0a 20 20 53 45  est 8.2.3 {.  SE
37c0: 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20  LECT rowid FROM 
37d0: 74 34 20 57 48 45 52 45 20 74 34 20 4d 41 54 43  t4 WHERE t4 MATC
37e0: 48 20 27 61 27 3b 0a 7d 20 7b 32 20 34 7d 0a 0a  H 'a';.} {2 4}..
37f0: 66 69 6e 69 73 68 5f 74 65 73 74 0a              finish_test.