xref: /sqlite-3.40.0/test/fts4langid.test (revision e88af017)
17fcb214bSdan# 2012 March 01
27fcb214bSdan#
37fcb214bSdan# The author disclaims copyright to this source code.  In place of
47fcb214bSdan# a legal notice, here is a blessing:
57fcb214bSdan#
67fcb214bSdan#    May you do good and not evil.
77fcb214bSdan#    May you find forgiveness for yourself and forgive others.
87fcb214bSdan#    May you share freely, never taking more than you give.
97fcb214bSdan#
107fcb214bSdan#*************************************************************************
117fcb214bSdan# This file implements regression tests for SQLite library.  The
127fcb214bSdan# focus of this script is testing the languageid=xxx FTS4 option.
137fcb214bSdan#
147fcb214bSdan
157fcb214bSdanset testdir [file dirname $argv0]
167fcb214bSdansource $testdir/tester.tcl
177fcb214bSdan
187fcb214bSdan# If SQLITE_ENABLE_FTS3 is defined, omit this file.
197fcb214bSdanifcapable !fts3 {
207fcb214bSdan  finish_test
217fcb214bSdan  return
227fcb214bSdan}
237fcb214bSdan
247fcb214bSdanset ::testprefix fts4langid
257fcb214bSdan
26e3ddd1acSdan#---------------------------------------------------------------------------
27e3ddd1acSdan# Test plan:
28e3ddd1acSdan#
29e3ddd1acSdan#   1.* - Warm-body tests created for specific purposes during development.
30e3ddd1acSdan#         Passing these doesn't really prove much.
31e3ddd1acSdan#
32c0db214bSdan#   2.1.* - Test that FTS queries only ever return rows associated with
33e3ddd1acSdan#           the requested language.
34e3ddd1acSdan#
35c0db214bSdan#   2.2.* - Same as 2.1.*, after an 'optimize' command.
36e3ddd1acSdan#
37c0db214bSdan#   2.3.* - Same as 2.1.*, after a 'rebuild' command.
38c0db214bSdan#
3973955990Sdan#   3.* - Tests with content= tables. Both where there is a real
4073955990Sdan#         underlying content table and where there is not.
4173955990Sdan#
4273955990Sdan#   4.* - Test that if one is provided, the tokenizer xLanguage method
43e3ddd1acSdan#         is called to configure the tokenizer before tokenizing query
44e3ddd1acSdan#         or document text.
45e3ddd1acSdan#
4673955990Sdan#   5.* - Test the fts4aux table when the associated FTS4 table contains
47e3ddd1acSdan#         multiple languages.
48e3ddd1acSdan#
497fcb214bSdan
507fcb214bSdando_execsql_test 1.1 {
517fcb214bSdan  CREATE VIRTUAL TABLE t1 USING fts4(a, b, languageid=lang_id);
527fcb214bSdan}
537fcb214bSdan
547fcb214bSdando_execsql_test 1.2 {
557fcb214bSdan  SELECT sql FROM sqlite_master WHERE name = 't1_content';
567fcb214bSdan} {{CREATE TABLE 't1_content'(docid INTEGER PRIMARY KEY, 'c0a', 'c1b', langid)}}
577fcb214bSdan
587fcb214bSdando_execsql_test 1.3 {SELECT docid FROM t1} {}
597fcb214bSdando_execsql_test 1.4 {SELECT lang_id FROM t1} {}
607fcb214bSdan
617fcb214bSdando_execsql_test 1.5 {INSERT INTO t1(a, b) VALUES('aaa', 'bbb')}
627fcb214bSdando_execsql_test 1.6 {SELECT lang_id FROM t1 } {0}
637fcb214bSdan
647fcb214bSdando_execsql_test 1.7 {INSERT INTO t1(a, b, lang_id) VALUES('aaa', 'bbb', 4)}
657fcb214bSdando_execsql_test 1.8 {SELECT lang_id FROM t1 } {0 4}
667fcb214bSdan
677fcb214bSdando_execsql_test 1.9  {INSERT INTO t1(a, b, lang_id) VALUES('aaa', 'bbb', 'xyz')}
687fcb214bSdando_execsql_test 1.10 {SELECT lang_id FROM t1} {0 4 0}
697fcb214bSdan
707fcb214bSdando_execsql_test 1.11 {
717fcb214bSdan  CREATE VIRTUAL TABLE t2 USING fts4;
727fcb214bSdan  INSERT INTO t2 VALUES('abc');
737fcb214bSdan}
747fcb214bSdando_execsql_test 1.12 { SELECT rowid FROM t2 WHERE content MATCH 'abc' } 1
757fcb214bSdan
767fcb214bSdando_execsql_test 1.13 {
777fcb214bSdan  DROP TABLE t1;
787fcb214bSdan  CREATE VIRTUAL TABLE t1 USING fts4(languageid=lang_id);
797fcb214bSdan  INSERT INTO t1(content)          VALUES('a b c');
807fcb214bSdan  INSERT INTO t1(content, lang_id) VALUES('a b c', 1);
817fcb214bSdan}
827fcb214bSdan
837fcb214bSdando_execsql_test 1.14 {
847fcb214bSdan  SELECT rowid FROM t1 WHERE t1 MATCH 'b';
857fcb214bSdan} {1}
867fcb214bSdando_execsql_test 1.15 {
877fcb214bSdan  SELECT rowid FROM t1 WHERE t1 MATCH 'b' AND lang_id = 0;
887fcb214bSdan} {1}
897fcb214bSdan
907fcb214bSdando_execsql_test 1.16 {
917fcb214bSdan  SELECT rowid FROM t1 WHERE t1 MATCH 'b' AND lang_id = 1;
927fcb214bSdan} {2}
937fcb214bSdan
947fcb214bSdando_catchsql_test 1.17 {
957fcb214bSdan  INSERT INTO t1(content, lang_id) VALUES('123', -1);
967fcb214bSdan} {1 {constraint failed}}
977fcb214bSdan
98e3ddd1acSdando_execsql_test 1.18 {
99e3ddd1acSdan  DROP TABLE t1;
100e3ddd1acSdan  CREATE VIRTUAL TABLE t1 USING fts4(languageid=lang_id);
101e3ddd1acSdan  INSERT INTO t1(content, lang_id) VALUES('A', 13);
102e3ddd1acSdan  INSERT INTO t1(content, lang_id) VALUES('B', 13);
103e3ddd1acSdan  INSERT INTO t1(content, lang_id) VALUES('C', 13);
104e3ddd1acSdan  INSERT INTO t1(content, lang_id) VALUES('D', 13);
105e3ddd1acSdan  INSERT INTO t1(content, lang_id) VALUES('E', 13);
106e3ddd1acSdan  INSERT INTO t1(content, lang_id) VALUES('F', 13);
107e3ddd1acSdan  INSERT INTO t1(content, lang_id) VALUES('G', 13);
108e3ddd1acSdan  INSERT INTO t1(content, lang_id) VALUES('H', 13);
109e3ddd1acSdan  INSERT INTO t1(content, lang_id) VALUES('I', 13);
110e3ddd1acSdan  INSERT INTO t1(content, lang_id) VALUES('J', 13);
111e3ddd1acSdan  INSERT INTO t1(content, lang_id) VALUES('K', 13);
112e3ddd1acSdan  INSERT INTO t1(content, lang_id) VALUES('L', 13);
113e3ddd1acSdan  INSERT INTO t1(content, lang_id) VALUES('M', 13);
114e3ddd1acSdan  INSERT INTO t1(content, lang_id) VALUES('N', 13);
115e3ddd1acSdan  INSERT INTO t1(content, lang_id) VALUES('O', 13);
116e3ddd1acSdan  INSERT INTO t1(content, lang_id) VALUES('P', 13);
117e3ddd1acSdan  INSERT INTO t1(content, lang_id) VALUES('Q', 13);
118e3ddd1acSdan  INSERT INTO t1(content, lang_id) VALUES('R', 13);
119e3ddd1acSdan  INSERT INTO t1(content, lang_id) VALUES('S', 13);
120e3ddd1acSdan  SELECT rowid FROM t1 WHERE t1 MATCH 'A';
121e3ddd1acSdan} {}
122e3ddd1acSdan
123e3ddd1acSdan
124e3ddd1acSdan#-------------------------------------------------------------------------
125e3ddd1acSdan# Test cases 2.*
126e3ddd1acSdan#
127e3ddd1acSdanproc build_multilingual_db_1 {db} {
128e3ddd1acSdan  $db eval { CREATE VIRTUAL TABLE t2 USING fts4(x, y, languageid=l) }
129e3ddd1acSdan
130e3ddd1acSdan  set xwords [list zero one two three four five six seven eight nine ten]
131e3ddd1acSdan  set ywords [list alpha beta gamma delta epsilon zeta eta theta iota kappa]
132e3ddd1acSdan
133e3ddd1acSdan  for {set i 0} {$i < 1000} {incr i} {
134e3ddd1acSdan    set iLangid [expr $i%9]
135e3ddd1acSdan    set x ""
136e3ddd1acSdan    set y ""
137e3ddd1acSdan
138e3ddd1acSdan    set x [list]
139e3ddd1acSdan    lappend x [lindex $xwords [expr ($i / 1000) % 10]]
140e3ddd1acSdan    lappend x [lindex $xwords [expr ($i / 100)  % 10]]
141e3ddd1acSdan    lappend x [lindex $xwords [expr ($i / 10)   % 10]]
142e3ddd1acSdan    lappend x [lindex $xwords [expr ($i / 1)   % 10]]
143e3ddd1acSdan
144e3ddd1acSdan    set y [list]
145e3ddd1acSdan    lappend y [lindex $ywords [expr ($i / 1000) % 10]]
146e3ddd1acSdan    lappend y [lindex $ywords [expr ($i / 100)  % 10]]
147e3ddd1acSdan    lappend y [lindex $ywords [expr ($i / 10)   % 10]]
148e3ddd1acSdan    lappend y [lindex $ywords [expr ($i / 1)   % 10]]
149e3ddd1acSdan
150e3ddd1acSdan    $db eval { INSERT INTO t2(docid, x, y, l) VALUES($i, $x, $y, $iLangid) }
151e3ddd1acSdan  }
15273955990Sdan
15373955990Sdan  $db eval {
15473955990Sdan    CREATE TABLE data(x, y, l);
15573955990Sdan    INSERT INTO data(rowid, x, y, l) SELECT docid, x, y, l FROM t2;
15673955990Sdan  }
157e3ddd1acSdan}
158e3ddd1acSdan
159e3ddd1acSdanproc rowid_list_set_langid {langid} {
160e3ddd1acSdan  set ::rowid_list_langid $langid
161e3ddd1acSdan}
162e3ddd1acSdanproc rowid_list {pattern} {
163e3ddd1acSdan  set langid $::rowid_list_langid
164e3ddd1acSdan  set res [list]
16573955990Sdan  db eval {SELECT rowid, x, y FROM data WHERE l = $langid ORDER BY rowid ASC} {
166e3ddd1acSdan    if {[string match "*$pattern*" $x] || [string match "*$pattern*" $y]} {
16773955990Sdan      lappend res $rowid
168e3ddd1acSdan    }
169e3ddd1acSdan  }
170e3ddd1acSdan  return $res
171e3ddd1acSdan}
172e3ddd1acSdan
173e3ddd1acSdanproc or_merge_list {list1 list2} {
174e3ddd1acSdan  set res [list]
175e3ddd1acSdan
176e3ddd1acSdan  set i1 0
177e3ddd1acSdan  set i2 0
178e3ddd1acSdan
179e3ddd1acSdan  set n1 [llength $list1]
180e3ddd1acSdan  set n2 [llength $list2]
181e3ddd1acSdan
182e3ddd1acSdan  while {$i1 < $n1 && $i2 < $n2} {
183e3ddd1acSdan    set e1 [lindex $list1 $i1]
184e3ddd1acSdan    set e2 [lindex $list2 $i2]
185e3ddd1acSdan
186e3ddd1acSdan    if {$e1==$e2} {
187e3ddd1acSdan      lappend res $e1
188e3ddd1acSdan      incr i1
189e3ddd1acSdan      incr i2
190e3ddd1acSdan    } elseif {$e1 < $e2} {
191e3ddd1acSdan      lappend res $e1
192e3ddd1acSdan      incr i1
193e3ddd1acSdan    } else {
194e3ddd1acSdan      lappend res $e2
195e3ddd1acSdan      incr i2
196e3ddd1acSdan    }
197e3ddd1acSdan  }
198e3ddd1acSdan
199e3ddd1acSdan  concat $res [lrange $list1 $i1 end] [lrange $list2 $i2 end]
200e3ddd1acSdan}
201e3ddd1acSdan
202e3ddd1acSdanproc or_merge_lists {args} {
203e3ddd1acSdan  set res [lindex $args 0]
204e3ddd1acSdan  for {set i 1} {$i < [llength $args]} {incr i} {
205e3ddd1acSdan    set res [or_merge_list $res [lindex $args $i]]
206e3ddd1acSdan  }
207e3ddd1acSdan  set res
208e3ddd1acSdan}
209e3ddd1acSdan
210e3ddd1acSdanproc and_merge_list {list1 list2} {
211e3ddd1acSdan  foreach i $list2 { set a($i) 1 }
212e3ddd1acSdan  set res [list]
213e3ddd1acSdan  foreach i $list1 {
214e3ddd1acSdan    if {[info exists a($i)]} {lappend res $i}
215e3ddd1acSdan  }
216e3ddd1acSdan  set res
217e3ddd1acSdan}
218e3ddd1acSdan
219e3ddd1acSdan
220e3ddd1acSdanproc and_merge_lists {args} {
221e3ddd1acSdan  set res [lindex $args 0]
222e3ddd1acSdan  for {set i 1} {$i < [llength $args]} {incr i} {
223e3ddd1acSdan    set res [and_merge_list $res [lindex $args $i]]
224e3ddd1acSdan  }
225e3ddd1acSdan  set res
226e3ddd1acSdan}
227e3ddd1acSdan
228e3ddd1acSdanproc filter_list {list langid} {
229e3ddd1acSdan  set res [list]
230e3ddd1acSdan  foreach i $list {
231e3ddd1acSdan    if {($i % 9) == $langid} {lappend res $i}
232e3ddd1acSdan  }
233e3ddd1acSdan  set res
234e3ddd1acSdan}
235e3ddd1acSdan
236e3ddd1acSdando_test 2.0 {
237e3ddd1acSdan  reset_db
238e3ddd1acSdan  build_multilingual_db_1 db
239e3ddd1acSdan} {}
240e3ddd1acSdan
24173955990Sdanproc do_test_query1 {tn query res_script} {
242e3ddd1acSdan  for {set langid 0} {$langid < 10} {incr langid} {
243e3ddd1acSdan    rowid_list_set_langid $langid
244e3ddd1acSdan    set res [eval $res_script]
245e3ddd1acSdan
246e3ddd1acSdan    set actual [
247e3ddd1acSdan      execsql {SELECT docid FROM t2 WHERE t2 MATCH $query AND l = $langid}
248e3ddd1acSdan    ]
24973955990Sdan    do_test $tn.$langid [list set {} $actual] $res
250e3ddd1acSdan  }
251e3ddd1acSdan}
252e3ddd1acSdan
2538fb662b0Sdan# Run some queries.
25473955990Sdando_test_query1 2.1.1  {delta}          { rowid_list delta }
25573955990Sdando_test_query1 2.1.2  {"zero one two"} { rowid_list "zero one two" }
25673955990Sdando_test_query1 2.1.3  {zero one two} {
257e3ddd1acSdan  and_merge_lists [rowid_list zero] [rowid_list one] [rowid_list two]
258e3ddd1acSdan}
25973955990Sdando_test_query1 2.1.4  {"zero one" OR "one two"} {
2608fb662b0Sdan  or_merge_lists [rowid_list "zero one"] [rowid_list "one two"]
2618fb662b0Sdan}
2628fb662b0Sdan
2638fb662b0Sdan# Now try the same tests as above, but after running the 'optimize'
2648fb662b0Sdan# command on the FTS table.
265c0db214bSdan#
2668fb662b0Sdando_execsql_test 2.2 {
2678fb662b0Sdan  INSERT INTO t2(t2) VALUES('optimize');
2688fb662b0Sdan  SELECT count(*) FROM t2_segdir;
2698fb662b0Sdan} {9}
27073955990Sdando_test_query1 2.2.1 {delta}          { rowid_list delta }
27173955990Sdando_test_query1 2.2.2 {"zero one two"} { rowid_list "zero one two" }
27273955990Sdando_test_query1 2.2.3 {zero one two} {
2738fb662b0Sdan  and_merge_lists [rowid_list zero] [rowid_list one] [rowid_list two]
2748fb662b0Sdan}
27573955990Sdando_test_query1 2.2.4 {"zero one" OR "one two"} {
276e3ddd1acSdan  or_merge_lists [rowid_list "zero one"] [rowid_list "one two"]
277e3ddd1acSdan}
278e3ddd1acSdan
279c0db214bSdan# And rebuild.
280c0db214bSdan#
281c0db214bSdando_test 2.3 {
282c0db214bSdan  reset_db
283c0db214bSdan  build_multilingual_db_1 db
284c0db214bSdan  execsql { INSERT INTO t2(t2) VALUES('rebuild') }
285c0db214bSdan} {}
28673955990Sdando_test_query1 2.3.1 {delta}          { rowid_list delta }
28773955990Sdando_test_query1 2.3.2 {"zero one two"} { rowid_list "zero one two" }
28873955990Sdando_test_query1 2.3.3 {zero one two} {
289c0db214bSdan  and_merge_lists [rowid_list zero] [rowid_list one] [rowid_list two]
290c0db214bSdan}
29173955990Sdando_test_query1 2.3.4 {"zero one" OR "one two"} {
292c0db214bSdan  or_merge_lists [rowid_list "zero one"] [rowid_list "one two"]
293c0db214bSdan}
294c0db214bSdan
29573955990Sdan#-------------------------------------------------------------------------
29673955990Sdan# Test cases 3.*
29773955990Sdan#
29873955990Sdando_test 3.0 {
29973955990Sdan  reset_db
30073955990Sdan  build_multilingual_db_1 db
30173955990Sdan  execsql {
30273955990Sdan    CREATE TABLE t3_data(l, x, y);
30373955990Sdan    INSERT INTO t3_data(rowid, l, x, y) SELECT docid, l, x, y FROM t2;
30473955990Sdan    DROP TABLE t2;
30573955990Sdan  }
30673955990Sdan} {}
30773955990Sdando_execsql_test 3.1 {
30873955990Sdan  CREATE VIRTUAL TABLE t2 USING fts4(content=t3_data, languageid=l);
30973955990Sdan  INSERT INTO t2(t2) VALUES('rebuild');
31073955990Sdan}
31173955990Sdan
31273955990Sdando_test_query1 3.1.1 {delta}          { rowid_list delta }
31373955990Sdando_test_query1 3.1.2 {"zero one two"} { rowid_list "zero one two" }
31473955990Sdando_test_query1 3.1.3 {zero one two} {
31573955990Sdan  and_merge_lists [rowid_list zero] [rowid_list one] [rowid_list two]
31673955990Sdan}
31773955990Sdando_test_query1 3.1.4 {"zero one" OR "one two"} {
31873955990Sdan  or_merge_lists [rowid_list "zero one"] [rowid_list "one two"]
31973955990Sdan}
32073955990Sdan
32173955990Sdando_execsql_test 3.2.1 {
32273955990Sdan  DROP TABLE t2;
32373955990Sdan  CREATE VIRTUAL TABLE t2 USING fts4(x, y, languageid=l, content=nosuchtable);
32473955990Sdan}
32573955990Sdan
32673955990Sdando_execsql_test 3.2.2 {
32773955990Sdan  INSERT INTO t2(docid, x, y, l) SELECT rowid, x, y, l FROM t3_data;
32873955990Sdan}
32973955990Sdan
33073955990Sdando_execsql_test 3.2.3 {
33173955990Sdan  DROP TABLE t3_data;
33273955990Sdan}
33373955990Sdan
33473955990Sdando_test_query1 3.3.1 {delta}          { rowid_list delta }
33573955990Sdando_test_query1 3.3.2 {"zero one two"} { rowid_list "zero one two" }
33673955990Sdando_test_query1 3.3.3 {zero one two} {
33773955990Sdan  and_merge_lists [rowid_list zero] [rowid_list one] [rowid_list two]
33873955990Sdan}
33973955990Sdando_test_query1 3.3.4 {"zero one" OR "one two"} {
34073955990Sdan  or_merge_lists [rowid_list "zero one"] [rowid_list "one two"]
34173955990Sdan}
34273955990Sdan
343ddf47470Sdando_execsql_test 3.4 {
344ddf47470Sdan  CREATE TABLE t8c(a, b);
345ddf47470Sdan  CREATE VIRTUAL TABLE t8 USING fts4(content=t8c, languageid=langid);
346ddf47470Sdan  INSERT INTO t8(docid, a, b) VALUES(-1, 'one two three', 'x y z');
347ddf47470Sdan  SELECT docid FROM t8 WHERE t8 MATCH 'one x' AND langid=0
348ddf47470Sdan} {-1}
349ddf47470Sdan
350996073b3Sdan#-------------------------------------------------------------------------
351996073b3Sdan# Test cases 4.*
352996073b3Sdan#
353996073b3Sdanproc build_multilingual_db_2 {db} {
354996073b3Sdan  $db eval {
355996073b3Sdan    CREATE VIRTUAL TABLE t4 USING fts4(
356996073b3Sdan        tokenize=testtokenizer,
357996073b3Sdan        languageid=lid
358996073b3Sdan    );
359996073b3Sdan  }
360996073b3Sdan  for {set i 0} {$i < 50} {incr i} {
361996073b3Sdan    execsql {
362996073b3Sdan      INSERT INTO t4(docid, content, lid) VALUES($i, 'The Quick Brown Fox', $i)
363996073b3Sdan    }
364996073b3Sdan  }
365996073b3Sdan}
36673955990Sdan
367996073b3Sdando_test 4.1.0 {
368996073b3Sdan  reset_db
369996073b3Sdan  set ptr [fts3_test_tokenizer]
370d42908fbSdrh  sqlite3_db_config db SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER 1
371996073b3Sdan  execsql { SELECT fts3_tokenizer('testtokenizer', $ptr) }
372996073b3Sdan  build_multilingual_db_2 db
373996073b3Sdan} {}
374996073b3Sdando_execsql_test 4.1.1 {
375996073b3Sdan  SELECT docid FROM t4 WHERE t4 MATCH 'quick';
376996073b3Sdan} {0}
377996073b3Sdando_execsql_test 4.1.2 {
378996073b3Sdan  SELECT docid FROM t4 WHERE t4 MATCH 'quick' AND lid=1;
379996073b3Sdan} {}
380996073b3Sdando_execsql_test 4.1.3 {
381996073b3Sdan  SELECT docid FROM t4 WHERE t4 MATCH 'Quick' AND lid=1;
382996073b3Sdan} {1}
383996073b3Sdanfor {set i 0} {$i < 50} {incr i} {
384996073b3Sdan  do_execsql_test 4.1.4.$i {
385996073b3Sdan    SELECT count(*) FROM t4 WHERE t4 MATCH 'fox' AND lid=$i;
386996073b3Sdan  } [expr 0==($i%2)]
387996073b3Sdan}
388996073b3Sdando_catchsql_test 4.1.5 {
389996073b3Sdan  INSERT INTO t4(content, lid) VALUES('hello world', 101)
390a690ff36Sdrh} {1 {SQL logic error}}
39173955990Sdan
39281b35dc6Sdan#-------------------------------------------------------------------------
39381b35dc6Sdan# Test cases 5.*
39481b35dc6Sdan#
39581b35dc6Sdan# The following test cases are designed to detect a 32-bit overflow bug
39681b35dc6Sdan# that existed at one point.
39781b35dc6Sdan#
39881b35dc6Sdanproc build_multilingual_db_3 {db} {
39981b35dc6Sdan  $db eval {
40081b35dc6Sdan    CREATE VIRTUAL TABLE t5 USING fts4(languageid=lid);
40181b35dc6Sdan  }
40281b35dc6Sdan  set languages [list 0 1 2 [expr 1<<30]]
40381b35dc6Sdan
40481b35dc6Sdan  foreach lid $languages {
40581b35dc6Sdan    execsql {
40681b35dc6Sdan      INSERT INTO t5(docid, content, lid) VALUES(
40781b35dc6Sdan          $lid, 'My language is ' || $lid, $lid
40881b35dc6Sdan      )
40981b35dc6Sdan    }
41081b35dc6Sdan  }
41181b35dc6Sdan}
41281b35dc6Sdan
41381b35dc6Sdando_test 5.1.0 {
41481b35dc6Sdan  reset_db
41581b35dc6Sdan  build_multilingual_db_3 db
41681b35dc6Sdan} {}
41781b35dc6Sdan
41881b35dc6Sdando_execsql_test 5.1.1 {
41981b35dc6Sdan  SELECT level FROM t5_segdir;
42081b35dc6Sdan} [list 0 1024 2048 [expr 1<<40]]
42181b35dc6Sdan
42281b35dc6Sdando_execsql_test 5.1.2 {SELECT docid FROM t5 WHERE t5 MATCH 'language'} 0
42381b35dc6Sdanforeach langid [list 0 1 2 [expr 1<<30]] {
42481b35dc6Sdan  do_execsql_test 5.2.$langid {
42581b35dc6Sdan    SELECT docid FROM t5 WHERE t5 MATCH 'language' AND lid = $langid
42681b35dc6Sdan  } $langid
42781b35dc6Sdan}
42881b35dc6Sdan
42981b35dc6Sdanset lid [expr 1<<30]
43081b35dc6Sdando_execsql_test 5.3.1 {
43181b35dc6Sdan  CREATE VIRTUAL TABLE t6 USING fts4(languageid=lid);
43281b35dc6Sdan  INSERT INTO t6 VALUES('I belong to language 0!');
43381b35dc6Sdan}
43481b35dc6Sdando_test 5.3.2 {
43581b35dc6Sdan  for {set i 0} {$i < 20} {incr i} {
43681b35dc6Sdan    execsql {
43781b35dc6Sdan      INSERT INTO t6(content, lid) VALUES(
43881b35dc6Sdan        'I (row '||$i||') belong to langauge N!', $lid
43981b35dc6Sdan      );
44081b35dc6Sdan    }
44181b35dc6Sdan  }
44281b35dc6Sdan  execsql { SELECT docid FROM t6 WHERE t6 MATCH 'belong' }
44381b35dc6Sdan} {1}
44481b35dc6Sdan
44581b35dc6Sdando_test 5.3.3 {
44681b35dc6Sdan  execsql { SELECT docid FROM t6 WHERE t6 MATCH 'belong' AND lid=$lid}
44781b35dc6Sdan} {2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21}
44881b35dc6Sdan
44981b35dc6Sdando_execsql_test 5.3.4 { INSERT INTO t6(t6) VALUES('optimize') } {}
45081b35dc6Sdando_execsql_test 5.3.5 { SELECT docid FROM t6 WHERE t6 MATCH 'belong' } {1}
45181b35dc6Sdando_execsql_test 5.3.6 {
45281b35dc6Sdan  SELECT docid FROM t6 WHERE t6 MATCH 'belong' AND lid=$lid
45381b35dc6Sdan} {2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21}
45481b35dc6Sdan
45581b35dc6Sdan
45681b35dc6Sdanset lid [expr 1<<30]
45781b35dc6Sdanforeach lid [list 4 [expr 1<<30]] {
45881b35dc6Sdan  do_execsql_test 5.4.$lid.1 {
45981b35dc6Sdan    DELETE FROM t6;
46081b35dc6Sdan    SELECT count(*) FROM t6_segdir;
46181b35dc6Sdan    SELECT count(*) FROM t6_segments;
46281b35dc6Sdan  } {0 0}
46381b35dc6Sdan  do_execsql_test 5.4.$lid.2 {
46481b35dc6Sdan    INSERT INTO t6(content, lid) VALUES('zero zero zero', $lid);
46581b35dc6Sdan    INSERT INTO t6(content, lid) VALUES('zero zero one', $lid);
46681b35dc6Sdan    INSERT INTO t6(content, lid) VALUES('zero one zero', $lid);
46781b35dc6Sdan    INSERT INTO t6(content, lid) VALUES('zero one one', $lid);
46881b35dc6Sdan    INSERT INTO t6(content, lid) VALUES('one zero zero', $lid);
46981b35dc6Sdan    INSERT INTO t6(content, lid) VALUES('one zero one', $lid);
47081b35dc6Sdan    INSERT INTO t6(content, lid) VALUES('one one zero', $lid);
47181b35dc6Sdan    INSERT INTO t6(content, lid) VALUES('one one one', $lid);
47281b35dc6Sdan
47381b35dc6Sdan    SELECT docid FROM t6 WHERE t6 MATCH '"zero zero"' AND lid=$lid;
47481b35dc6Sdan  } {1 2 5}
47581b35dc6Sdan
47681b35dc6Sdan  do_execsql_test 5.4.$lid.3 {
47781b35dc6Sdan    SELECT count(*) FROM t6_segdir;
47881b35dc6Sdan    SELECT count(*) FROM t6_segments;
47981b35dc6Sdan  } {8 0}
48081b35dc6Sdan
48181b35dc6Sdan  do_execsql_test 5.4.$lid.4 {
48281b35dc6Sdan    INSERT INTO t6(t6) VALUES('merge=100,3');
48381b35dc6Sdan    INSERT INTO t6(t6) VALUES('merge=100,3');
48481b35dc6Sdan    SELECT docid FROM t6 WHERE t6 MATCH '"zero zero"' AND lid=$lid;
48581b35dc6Sdan  } {1 2 5}
48681b35dc6Sdan
48781b35dc6Sdan  do_execsql_test 5.4.$lid.5 {
48881b35dc6Sdan    SELECT count(*) FROM t6_segdir;
48981b35dc6Sdan    SELECT count(*) FROM t6_segments;
490c7dbce0fSdan  } {1 2}
49181b35dc6Sdan}
492*e88af017Sdan
493*e88af017Sdanreset_db
494*e88af017Sdando_execsql_test 6.0 {
495*e88af017Sdan  CREATE VIRTUAL TABLE vt0 USING fts4(c0, languageid="lid");
496*e88af017Sdan  INSERT INTO vt0 VALUES ('a'), ('b');
497*e88af017Sdan  BEGIN;
498*e88af017Sdan    UPDATE vt0 SET lid = 1 WHERE lid=0;
499*e88af017Sdan}
500*e88af017Sdando_execsql_test 6.1 {
501*e88af017Sdan  INSERT INTO vt0(vt0) VALUES('integrity-check');
502*e88af017Sdan}
503*e88af017Sdando_execsql_test 6.2 {
504*e88af017Sdan  COMMIT;
505*e88af017Sdan  INSERT INTO vt0(vt0) VALUES('integrity-check');
506*e88af017Sdan}
5077fcb214bSdanfinish_test
508