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