Fixes default log output to console for macOS
[sqlcipher.git] / ext / fts5 / test / fts5trigram.test
blob752686620c3ad1cf18bd538b697e61e3edc0009b
1 # 2020 September 30
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
19 do_execsql_test 1.0 {
20   CREATE VIRTUAL TABLE t1 USING fts5(y, tokenize=trigram);
21   INSERT INTO t1 VALUES('abcdefghijklm');
22   INSERT INTO t1 VALUES('กรุงเทพมหานคร');
25 foreach {tn s res} {
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)"
35 } {
36   do_execsql_test 1.1.$tn {
37     SELECT highlight(t1, 0, '(', ')') FROM t1($s)
38   } $res
41 do_execsql_test 1.2.0 {
42   SELECT fts5_expr('ABCD', 'tokenize=trigram')
43 } {{"abc" + "bcd"}}
45 do_execsql_test 1.2.1 {
46   SELECT * FROM t1 WHERE y LIKE ? ESCAPE 'a'
49 foreach {tn like res} {
50   1 {%cDef%}   1
51   2 {cDef%}    {}
52   3 {%f%}      1
53   4 {%f_h%}    1
54   5 {%f_g%}    {}
55   6 {abc%klm}  1
56   7 {ABCDEFG%} 1
57   8 {%รุงเ%}    2
58   9 {%งเ%}     2
59 } {
60   do_execsql_test 1.3.$tn {
61     SELECT rowid FROM t1 WHERE y LIKE $like
62   } $res
65 #-------------------------------------------------------------------------
66 reset_db
67 do_execsql_test 2.0 {
68   CREATE VIRTUAL TABLE t1 USING fts5(y, tokenize="trigram case_sensitive 1");
69   INSERT INTO t1 VALUES('abcdefghijklm');
70   INSERT INTO t1 VALUES('กรุงเทพมหานคร');
72 do_catchsql_test 2.0.1 {
73   CREATE VIRTUAL TABLE t2 USING fts5(z, tokenize='trigram case_sensitive');
74 } {1 {error in tokenizer constructor}}
76 foreach {tn s res} {
77   1 abc           "(abc)defghijklm"
78   2 defgh         "abc(defgh)ijklm"
79   3 abcdefghijklm "(abcdefghijklm)"
80   4 กรุ            "(กรุ)งเทพมหานคร"
81   5 งเทพมห        "กรุ(งเทพมห)านคร"
82   6 กรุงเทพมหานคร  "(กรุงเทพมหานคร)"
83   7 Abc           ""
84   8 deFgh         ""
85   9 aBcdefGhijKlm ""
86 } {
87   do_execsql_test 2.1.$tn {
88     SELECT highlight(t1, 0, '(', ')') FROM t1($s)
89   } $res
91 foreach {tn like res} {
92   1 {%cDef%}   1
93   2 {cDef%}    {}
94   3 {%f%}      1
95   4 {%f_h%}    1
96   5 {%f_g%}    {}
97   6 {abc%klm}  1
98   7 {ABCDEFG%} 1
99   8 {%รุงเ%}    2
100 } {
101   do_execsql_test 2.2.$tn {
102     SELECT rowid FROM t1 WHERE y LIKE $like
103   } $res
105 foreach {tn like res} {
106   1 {*cdef*}     1
107   2 {cdef*}      {}
108   3 {*f*}        1
109   4 {*f?h*}      1
110   5 {*f?g*}      {}
111   6 {abc*klm}    1
112   7 {abcdefg*}   1
113   8 {*รุงเ*}      2
114   9 {abc[d]efg*} 1
115  10 {abc[]d]efg*} 1
116  11 {abc[^]d]efg*} {}
117  12 {abc[^]XYZ]efg*} 1
118 } {
119   do_execsql_test 2.3.$tn {
120     SELECT rowid FROM t1 WHERE y GLOB $like
121   } $res
124 do_execsql_test 2.3.null.1 {
125   SELECT rowid FROM t1 WHERE y LIKE NULL
128 #-------------------------------------------------------------------------
129 reset_db
130 do_catchsql_test 3.1 {
131   CREATE VIRTUAL TABLE ttt USING fts5(c, tokenize="trigram case_sensitive 2");
132 } {1 {error in tokenizer constructor}}
133 do_catchsql_test 3.2 {
134   CREATE VIRTUAL TABLE ttt USING fts5(c, tokenize="trigram case_sensitive 11");
135 } {1 {error in tokenizer constructor}}
136 do_catchsql_test 3.3 {
137   CREATE VIRTUAL TABLE ttt USING fts5(c, "tokenize=trigram case_sensitive 1");
138 } {0 {}}
140 #-------------------------------------------------------------------------
141 reset_db
142 do_execsql_test 4.0 {
143   CREATE VIRTUAL TABLE t0 USING fts5(b, tokenize = "trigram");
145 do_execsql_test 4.1 {
146   INSERT INTO t0 VALUES (x'000b01');
148 do_execsql_test 4.2 {
149   INSERT INTO t0(t0) VALUES('integrity-check');
152 #-------------------------------------------------------------------------
153 reset_db
154 foreach_detail_mode $::testprefix {
155   foreach {ci} {0 1} {
156     reset_db
157     do_execsql_test 5.cs=$ci.0.1 "
158       CREATE VIRTUAL TABLE t1 USING fts5(
159           y, tokenize=\"trigram case_sensitive $ci\", detail=%DETAIL%
160       );
161     "
162     do_execsql_test 5.cs=$ci.0.2 {
163       INSERT INTO t1 VALUES('abcdefghijklm');
164       INSERT INTO t1 VALUES('กรุงเทพมหานคร');
165     }
167     foreach {tn like res} {
168       1 {%cDef%}   1
169       2 {cDef%}    {}
170       3 {%f%}      1
171       4 {%f_h%}    1
172       5 {%f_g%}    {}
173       6 {abc%klm}  1
174       7 {ABCDEFG%} 1
175       8 {%รุงเ%}    2
176     } {
177       do_execsql_test 5.cs=$ci.1.$tn {
178         SELECT rowid FROM t1 WHERE y LIKE $like
179       } $res
180     }
181   }
184 do_execsql_test 6.0 {
185   CREATE VIRTUAL TABLE ci0 USING fts5(x, tokenize="trigram");
186   CREATE VIRTUAL TABLE ci1 USING fts5(x, tokenize="trigram case_sensitive 1");
189 # LIKE and GLOB both work with case-insensitive tokenizers. Only GLOB works
190 # with case-sensitive.
191 do_eqp_test 6.1 {
192   SELECT * FROM ci0 WHERE x LIKE ?
193 } {VIRTUAL TABLE INDEX 0:L0}
194 do_eqp_test 6.2 {
195   SELECT * FROM ci0 WHERE x GLOB ?
196 } {VIRTUAL TABLE INDEX 0:G0}
197 do_eqp_test 6.3 {
198   SELECT * FROM ci1 WHERE x LIKE ?
199 } {{SCAN ci1 VIRTUAL TABLE INDEX 0:}}
200 do_eqp_test 6.4 {
201   SELECT * FROM ci1 WHERE x GLOB ?
202 } {VIRTUAL TABLE INDEX 0:G0}
204 reset_db
205 do_execsql_test 7.0 {
206   CREATE VIRTUAL TABLE f USING FTS5(filename, tokenize="trigram");
207   INSERT INTO f (rowid, filename) VALUES 
208       (10, "giraffe.png"), 
209       (20, "жираф.png"), 
210       (30, "cat.png"), 
211       (40, "кот.png"), 
212       (50, "misic-🎵-.mp3");
214 do_execsql_test 7.1 {
215   SELECT rowid FROM f WHERE +filename GLOB '*ир*';
216 } {20}
217 do_execsql_test 7.2 {
218   SELECT rowid FROM f WHERE filename GLOB '*ир*';
219 } {20}
222 #-------------------------------------------------------------------------
223 reset_db
224 do_execsql_test 8.0 {
225   CREATE VIRTUAL TABLE t1 USING fts5(y, tokenize=trigram);
226   INSERT INTO t1 VALUES('abcdefghijklm');
229 foreach {tn match res} {
230   1 "abc ghi"         "(abc)def(ghi)jklm"
231   2 "def ghi"         "abc(defghi)jklm"
232   3 "efg ghi"         "abcd(efghi)jklm"
233   4 "efghi"           "abcd(efghi)jklm"
234   5 "abcd jklm"       "(abcd)efghi(jklm)"
235   6 "ijkl jklm"       "abcdefgh(ijklm)"
236   7 "ijk ijkl hijk"   "abcdefg(hijkl)m"
238 } {
239   do_execsql_test 8.1.$tn {
240     SELECT highlight(t1, 0, '(', ')') FROM t1($match)
241   } $res
244 do_execsql_test 8.2 {
245   CREATE VIRTUAL TABLE ft2 USING fts5(a, tokenize="trigram");
246   INSERT INTO ft2 VALUES('abc x cde');
247   INSERT INTO ft2 VALUES('abc cde');
248   INSERT INTO ft2 VALUES('abcde');
251 do_execsql_test 8.3 {
252   SELECT highlight(ft2, 0, '[', ']') FROM ft2 WHERE ft2 MATCH 'abc AND cde';
253 } {
254   {[abc] x [cde]}
255   {[abc] [cde]}
256   {[abcde]}
259 finish_test