3 # The author disclaims copyright to this source code. In place of
4 # a legal notice, here is a blessing:
6 # May you do good and not evil.
7 # May you find forgiveness for yourself and forgive others.
8 # May you share freely, never taking more than you give.
10 #*************************************************************************
12 # Tests for the fts5 "trigram" tokenizer.
15 source [file join [file dirname [info script]] fts5_common.tcl]
16 ifcapable !fts5 { finish_test ; return }
17 set ::testprefix fts5trigram
20 CREATE VIRTUAL TABLE t1 USING fts5(y, tokenize=trigram);
21 INSERT INTO t1 VALUES('abcdefghijklm');
22 INSERT INTO t1 VALUES('กรุงเทพมหานคร');
26 1 abc "(abc)defghijklm"
27 2 defgh "abc(defgh)ijklm"
28 3 abcdefghijklm "(abcdefghijklm)"
29 4 กรุ "(กรุ)งเทพมหานคร"
30 5 งเทพมห "กรุ(งเทพมห)านคร"
31 6 กรุงเทพมหานคร "(กรุงเทพมหานคร)"
32 7 Abc "(abc)defghijklm"
33 8 deFgh "abc(defgh)ijklm"
34 9 aBcdefGhijKlm "(abcdefghijklm)"
36 do_execsql_test 1.1.$tn {
37 SELECT highlight(t1, 0, '(', ')') FROM t1($s)
41 do_execsql_test 1.2.0 {
42 SELECT fts5_expr('ABCD', 'tokenize=trigram')
45 do_execsql_test 1.2.1 {
46 SELECT * FROM t1 WHERE y LIKE ? ESCAPE 'a'
49 foreach {tn like res} {
60 do_execsql_test 1.3.$tn {
61 SELECT rowid FROM t1 WHERE y LIKE $like
65 #-------------------------------------------------------------------------
68 CREATE VIRTUAL TABLE t1 USING fts5(y, tokenize="trigram case_sensitive 1");
69 INSERT INTO t1 VALUES('abcdefghijklm');
70 INSERT INTO t1 VALUES('กรุงเทพมหานคร');
74 1 abc "(abc)defghijklm"
75 2 defgh "abc(defgh)ijklm"
76 3 abcdefghijklm "(abcdefghijklm)"
77 4 กรุ "(กรุ)งเทพมหานคร"
78 5 งเทพมห "กรุ(งเทพมห)านคร"
79 6 กรุงเทพมหานคร "(กรุงเทพมหานคร)"
84 do_execsql_test 2.1.$tn {
85 SELECT highlight(t1, 0, '(', ')') FROM t1($s)
88 foreach {tn like res} {
98 do_execsql_test 2.2.$tn {
99 SELECT rowid FROM t1 WHERE y LIKE $like
102 foreach {tn like res} {
114 12 {abc[^]XYZ]efg*} 1
116 do_execsql_test 2.3.$tn {
117 SELECT rowid FROM t1 WHERE y GLOB $like
121 do_execsql_test 2.3.null.1 {
122 SELECT rowid FROM t1 WHERE y LIKE NULL
125 #-------------------------------------------------------------------------
127 do_catchsql_test 3.1 {
128 CREATE VIRTUAL TABLE ttt USING fts5(c, tokenize="trigram case_sensitive 2");
129 } {1 {error in tokenizer constructor}}
130 do_catchsql_test 3.2 {
131 CREATE VIRTUAL TABLE ttt USING fts5(c, tokenize="trigram case_sensitive 11");
132 } {1 {error in tokenizer constructor}}
133 do_catchsql_test 3.3 {
134 CREATE VIRTUAL TABLE ttt USING fts5(c, "tokenize=trigram case_sensitive 1");
137 #-------------------------------------------------------------------------
139 do_execsql_test 4.0 {
140 CREATE VIRTUAL TABLE t0 USING fts5(b, tokenize = "trigram");
142 do_execsql_test 4.1 {
143 INSERT INTO t0 VALUES (x'000b01');
145 do_execsql_test 4.2 {
146 INSERT INTO t0(t0) VALUES('integrity-check');
149 #-------------------------------------------------------------------------
151 foreach_detail_mode $::testprefix {
154 do_execsql_test 5.cs=$ci.0.1 "
155 CREATE VIRTUAL TABLE t1 USING fts5(
156 y, tokenize=\"trigram case_sensitive $ci\", detail=%DETAIL%
159 do_execsql_test 5.cs=$ci.0.2 {
160 INSERT INTO t1 VALUES('abcdefghijklm');
161 INSERT INTO t1 VALUES('กรุงเทพมหานคร');
164 foreach {tn like res} {
174 do_execsql_test 5.cs=$ci.1.$tn {
175 SELECT rowid FROM t1 WHERE y LIKE $like
181 do_execsql_test 6.0 {
182 CREATE VIRTUAL TABLE ci0 USING fts5(x, tokenize="trigram");
183 CREATE VIRTUAL TABLE ci1 USING fts5(x, tokenize="trigram case_sensitive 1");
186 # LIKE and GLOB both work with case-insensitive tokenizers. Only GLOB works
187 # with case-sensitive.
189 SELECT * FROM ci0 WHERE x LIKE ?
190 } {VIRTUAL TABLE INDEX 0:L0}
192 SELECT * FROM ci0 WHERE x GLOB ?
193 } {VIRTUAL TABLE INDEX 0:G0}
195 SELECT * FROM ci1 WHERE x LIKE ?
196 } {{SCAN ci1 VIRTUAL TABLE INDEX 0:}}
198 SELECT * FROM ci1 WHERE x GLOB ?
199 } {VIRTUAL TABLE INDEX 0:G0}
202 do_execsql_test 7.0 {
203 CREATE VIRTUAL TABLE f USING FTS5(filename, tokenize="trigram");
204 INSERT INTO f (rowid, filename) VALUES
209 (50, "misic-🎵-.mp3");
211 do_execsql_test 7.1 {
212 SELECT rowid FROM f WHERE +filename GLOB '*ир*';
214 do_execsql_test 7.2 {
215 SELECT rowid FROM f WHERE filename GLOB '*ир*';