Snapshot of upstream SQLite 3.42.0
[sqlcipher.git] / ext / fts5 / test / fts5trigram.test
blob951daf144089ae43b01a81163a666c986c07784a
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('กรุงเทพมหานคร');
73 foreach {tn s res} {
74   1 abc           "(abc)defghijklm"
75   2 defgh         "abc(defgh)ijklm"
76   3 abcdefghijklm "(abcdefghijklm)"
77   4 กรุ            "(กรุ)งเทพมหานคร"
78   5 งเทพมห        "กรุ(งเทพมห)านคร"
79   6 กรุงเทพมหานคร  "(กรุงเทพมหานคร)"
80   7 Abc           ""
81   8 deFgh         ""
82   9 aBcdefGhijKlm ""
83 } {
84   do_execsql_test 2.1.$tn {
85     SELECT highlight(t1, 0, '(', ')') FROM t1($s)
86   } $res
88 foreach {tn like res} {
89   1 {%cDef%}   1
90   2 {cDef%}    {}
91   3 {%f%}      1
92   4 {%f_h%}    1
93   5 {%f_g%}    {}
94   6 {abc%klm}  1
95   7 {ABCDEFG%} 1
96   8 {%รุงเ%}    2
97 } {
98   do_execsql_test 2.2.$tn {
99     SELECT rowid FROM t1 WHERE y LIKE $like
100   } $res
102 foreach {tn like res} {
103   1 {*cdef*}     1
104   2 {cdef*}      {}
105   3 {*f*}        1
106   4 {*f?h*}      1
107   5 {*f?g*}      {}
108   6 {abc*klm}    1
109   7 {abcdefg*}   1
110   8 {*รุงเ*}      2
111   9 {abc[d]efg*} 1
112  10 {abc[]d]efg*} 1
113  11 {abc[^]d]efg*} {}
114  12 {abc[^]XYZ]efg*} 1
115 } {
116   do_execsql_test 2.3.$tn {
117     SELECT rowid FROM t1 WHERE y GLOB $like
118   } $res
121 do_execsql_test 2.3.null.1 {
122   SELECT rowid FROM t1 WHERE y LIKE NULL
125 #-------------------------------------------------------------------------
126 reset_db
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");
135 } {0 {}}
137 #-------------------------------------------------------------------------
138 reset_db
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 #-------------------------------------------------------------------------
150 reset_db
151 foreach_detail_mode $::testprefix {
152   foreach {ci} {0 1} {
153     reset_db
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%
157       );
158     "
159     do_execsql_test 5.cs=$ci.0.2 {
160       INSERT INTO t1 VALUES('abcdefghijklm');
161       INSERT INTO t1 VALUES('กรุงเทพมหานคร');
162     }
164     foreach {tn like res} {
165       1 {%cDef%}   1
166       2 {cDef%}    {}
167       3 {%f%}      1
168       4 {%f_h%}    1
169       5 {%f_g%}    {}
170       6 {abc%klm}  1
171       7 {ABCDEFG%} 1
172       8 {%รุงเ%}    2
173     } {
174       do_execsql_test 5.cs=$ci.1.$tn {
175         SELECT rowid FROM t1 WHERE y LIKE $like
176       } $res
177     }
178   }
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.
188 do_eqp_test 6.1 {
189   SELECT * FROM ci0 WHERE x LIKE ?
190 } {VIRTUAL TABLE INDEX 0:L0}
191 do_eqp_test 6.2 {
192   SELECT * FROM ci0 WHERE x GLOB ?
193 } {VIRTUAL TABLE INDEX 0:G0}
194 do_eqp_test 6.3 {
195   SELECT * FROM ci1 WHERE x LIKE ?
196 } {{SCAN ci1 VIRTUAL TABLE INDEX 0:}}
197 do_eqp_test 6.4 {
198   SELECT * FROM ci1 WHERE x GLOB ?
199 } {VIRTUAL TABLE INDEX 0:G0}
201 reset_db
202 do_execsql_test 7.0 {
203   CREATE VIRTUAL TABLE f USING FTS5(filename, tokenize="trigram");
204   INSERT INTO f (rowid, filename) VALUES 
205       (10, "giraffe.png"), 
206       (20, "жираф.png"), 
207       (30, "cat.png"), 
208       (40, "кот.png"), 
209       (50, "misic-🎵-.mp3");
211 do_execsql_test 7.1 {
212   SELECT rowid FROM f WHERE +filename GLOB '*ир*';
213 } {20}
214 do_execsql_test 7.2 {
215   SELECT rowid FROM f WHERE filename GLOB '*ир*';
216 } {20}
218 finish_test