10f599faaSdan# 2011 May 04 20f599faaSdan# 30f599faaSdan# The author disclaims copyright to this source code. In place of 40f599faaSdan# a legal notice, here is a blessing: 50f599faaSdan# 60f599faaSdan# May you do good and not evil. 70f599faaSdan# May you find forgiveness for yourself and forgive others. 80f599faaSdan# May you share freely, never taking more than you give. 90f599faaSdan# 100f599faaSdan#************************************************************************* 110f599faaSdan# This file implements regression tests for SQLite library. The 120f599faaSdan# focus of this script is testing the FTS3 module. 130f599faaSdan# 140f599faaSdan 150f599faaSdanset testdir [file dirname $argv0] 160f599faaSdansource $testdir/tester.tcl 170f599faaSdan 180f599faaSdan# If SQLITE_ENABLE_FTS3 is defined, omit this file. 190f599faaSdanifcapable !fts3 { 200f599faaSdan finish_test 210f599faaSdan return 220f599faaSdan} 230f599faaSdan 240f599faaSdan 25b46ee917Sdanproc build_database {nRow param} { 260f599faaSdan db close 270f599faaSdan forcedelete test.db 280f599faaSdan sqlite3 db test.db 290f599faaSdan 300f599faaSdan set vocab [list aa ab ac ba bb bc ca cb cc da] 310f599faaSdan expr srand(0) 320f599faaSdan 33b46ee917Sdan execsql "CREATE VIRTUAL TABLE t1 USING fts4($param)" 340f599faaSdan for {set i 0} {$i < $nRow} {incr i} { 350f599faaSdan set v [expr int(rand()*1000000)] 360f599faaSdan set doc [list] 370f599faaSdan for {set div 1} {$div < 1000000} {set div [expr $div*10]} { 380f599faaSdan lappend doc [lindex $vocab [expr ($v/$div) % 10]] 390f599faaSdan } 400f599faaSdan execsql { INSERT INTO t1 VALUES($doc) } 410f599faaSdan } 420f599faaSdan} 430f599faaSdan 44b46ee917Sdanset testprefix fts3sort 45b46ee917Sdan 46b46ee917Sdanunset -nocomplain CONTROL 47b46ee917Sdanforeach {t param} { 48b46ee917Sdan 1 "" 49b46ee917Sdan 2 "order=asc" 50b46ee917Sdan 3 "order=desc" 51b46ee917Sdan} { 52b46ee917Sdan 53b46ee917Sdan set testprefix fts3sort-1.$t 54b46ee917Sdan 550f599faaSdan set nRow 1000 560f599faaSdan do_test 1.0 { 57b46ee917Sdan build_database $nRow $param 580f599faaSdan execsql { SELECT count(*) FROM t1 } 590f599faaSdan } $nRow 600f599faaSdan 610f599faaSdan foreach {tn query} { 620f599faaSdan 1 "SELECT docid, * FROM t1" 630f599faaSdan 2 "SELECT docid, * FROM t1 WHERE t1 MATCH 'aa'" 640f599faaSdan 3 "SELECT docid, * FROM t1 WHERE t1 MATCH 'a*'" 650f599faaSdan 4 "SELECT docid, quote(matchinfo(t1)) FROM t1 WHERE t1 MATCH 'a*'" 660f599faaSdan 5 "SELECT docid, quote(matchinfo(t1,'pcnxals')) FROM t1 WHERE t1 MATCH 'b*'" 670f599faaSdan 6 "SELECT docid, * FROM t1 WHERE t1 MATCH 'a* b* c*'" 680f599faaSdan 7 "SELECT docid, * FROM t1 WHERE t1 MATCH 'aa OR da'" 690f599faaSdan 8 "SELECT docid, * FROM t1 WHERE t1 MATCH 'nosuchtoken'" 700f599faaSdan 9 "SELECT docid, snippet(t1) FROM t1 WHERE t1 MATCH 'aa OR da'" 71e1c8e13bSdan 10 "SELECT docid, snippet(t1) FROM t1 WHERE t1 MATCH 'aa OR nosuchtoken'" 72b46ee917Sdan 11 "SELECT docid, snippet(t1) FROM t1 WHERE t1 MATCH 'aa NEAR bb'" 73b46ee917Sdan 12 "SELECT docid, snippet(t1) FROM t1 WHERE t1 MATCH '\"aa bb\"'" 74b46ee917Sdan 13 "SELECT docid, content FROM t1 WHERE t1 MATCH 'aa NEAR/2 bb NEAR/3 cc'" 75b46ee917Sdan 14 "SELECT docid, content FROM t1 WHERE t1 MATCH '\"aa bb cc\"'" 760f599faaSdan } { 770f599faaSdan 780f599faaSdan unset -nocomplain A B C D 790f599faaSdan set A_list [list] 800f599faaSdan set B_list [list] 810f599faaSdan set C_list [list] 820f599faaSdan set D_list [list] 830f599faaSdan 840f599faaSdan unset -nocomplain X 850f599faaSdan db eval "$query ORDER BY rowid ASC" X { 860f599faaSdan set A($X(docid)) [array get X] 870f599faaSdan lappend A_list $X(docid) 880f599faaSdan } 890f599faaSdan unset -nocomplain X 900f599faaSdan db eval "$query ORDER BY rowid DESC" X { 910f599faaSdan set B($X(docid)) [array get X] 920f599faaSdan lappend B_list $X(docid) 930f599faaSdan } 940f599faaSdan unset -nocomplain X 950f599faaSdan db eval "$query ORDER BY docid ASC" X { 960f599faaSdan set C($X(docid)) [array get X] 970f599faaSdan lappend C_list $X(docid) 980f599faaSdan } 990f599faaSdan unset -nocomplain X 1000f599faaSdan db eval "$query ORDER BY docid DESC" X { 1010f599faaSdan set D($X(docid)) [array get X] 1020f599faaSdan lappend D_list $X(docid) 1030f599faaSdan } 1040f599faaSdan 105b46ee917Sdan do_test $tn.1 { set A_list } [lsort -integer -increasing $A_list] 106b46ee917Sdan do_test $tn.2 { set B_list } [lsort -integer -decreasing $B_list] 107b46ee917Sdan do_test $tn.3 { set C_list } [lsort -integer -increasing $C_list] 108b46ee917Sdan do_test $tn.4 { set D_list } [lsort -integer -decreasing $D_list] 1090f599faaSdan 1100f599faaSdan unset -nocomplain DATA 1110f599faaSdan unset -nocomplain X 1120f599faaSdan db eval "$query" X { 1130f599faaSdan set DATA($X(docid)) [array get X] 1140f599faaSdan } 1150f599faaSdan 116b46ee917Sdan do_test $tn.5 { lsort [array get A] } [lsort [array get DATA]] 117b46ee917Sdan do_test $tn.6 { lsort [array get B] } [lsort [array get DATA]] 118b46ee917Sdan do_test $tn.7 { lsort [array get C] } [lsort [array get DATA]] 119b46ee917Sdan do_test $tn.8 { lsort [array get D] } [lsort [array get DATA]] 120b46ee917Sdan 121b46ee917Sdan if {[info exists CONTROL($tn)]} { 122b46ee917Sdan do_test $tn.9 { set CONTROL($tn) } [lsort [array get DATA]] 123b46ee917Sdan } else { 124b46ee917Sdan set CONTROL($tn) [lsort [array get DATA]] 125b46ee917Sdan } 126b46ee917Sdan } 127b46ee917Sdan} 128b46ee917Sdanunset -nocomplain CONTROL 129b46ee917Sdan 130b46ee917Sdanset testprefix fts3sort 131b46ee917Sdan 132b46ee917Sdan#------------------------------------------------------------------------- 133b46ee917Sdan# Tests for parsing the "order=asc" and "order=desc" directives. 134b46ee917Sdan# 135b46ee917Sdanforeach {tn param res} { 136b46ee917Sdan 1 "order=asc" {0 {}} 137b46ee917Sdan 2 "order=desc" {0 {}} 138b46ee917Sdan 3 "order=dec" {1 {unrecognized order: dec}} 1399aab0717Sdan 4 "order=xxx, order=asc" {1 {unrecognized order: xxx}} 1409aab0717Sdan 5 "order=desc, order=asc" {0 {}} 141*49fc3364Sdan 6 "order=xxxx, order=asc" {1 {unrecognized order: xxxx}} 142*49fc3364Sdan 7 "order=desk" {1 {unrecognized order: desk}} 143b46ee917Sdan} { 144b46ee917Sdan execsql { DROP TABLE IF EXISTS t1 } 145b46ee917Sdan do_catchsql_test 2.1.$tn " 146b46ee917Sdan CREATE VIRTUAL TABLE t1 USING fts4(a, b, $param) 147b46ee917Sdan " $res 1480f599faaSdan} 1490f599faaSdan 150b46ee917Sdando_execsql_test 2.2 { 151b46ee917Sdan BEGIN; 152b46ee917Sdan CREATE VIRTUAL TABLE t2 USING fts4(order=desc); 153b46ee917Sdan INSERT INTO t2 VALUES('aa bb'); 154b46ee917Sdan INSERT INTO t2 VALUES('bb cc'); 155b46ee917Sdan INSERT INTO t2 VALUES('cc aa'); 156b46ee917Sdan SELECT docid FROM t2 WHERE t2 MATCH 'aa'; 157b46ee917Sdan END; 158b46ee917Sdan} {3 1} 159b46ee917Sdando_execsql_test 2.3 { 160b46ee917Sdan SELECT docid FROM t2 WHERE t2 MATCH 'aa'; 161b46ee917Sdan} {3 1} 162*49fc3364Sdando_execsql_test 2.4 { 163*49fc3364Sdan SELECT docid FROM t2 WHERE t2 MATCH 'aa' ORDER BY content; 164*49fc3364Sdan} {1 3} 165b46ee917Sdan 166f9556a1aSdan#------------------------------------------------------------------------- 167f9556a1aSdan# Test that ticket [56be976859] has been fixed. 168f9556a1aSdan# 169f9556a1aSdando_execsql_test 3.1 { 170f9556a1aSdan CREATE VIRTUAL TABLE t3 USING fts4(x, order=DESC); 171f9556a1aSdan INSERT INTO t3(docid, x) VALUES(113382409004785664, 'aa'); 172f9556a1aSdan INSERT INTO t3(docid, x) VALUES(1, 'ab'); 173f9556a1aSdan SELECT rowid FROM t3 WHERE x MATCH 'a*' ORDER BY docid DESC; 174f9556a1aSdan} {113382409004785664 1} 175f9556a1aSdando_execsql_test 3.2 { 176f9556a1aSdan CREATE VIRTUAL TABLE t4 USING fts4(x); 177f9556a1aSdan INSERT INTO t4(docid, x) VALUES(-113382409004785664, 'aa'); 178f9556a1aSdan INSERT INTO t4(docid, x) VALUES(1, 'ab'); 179f9556a1aSdan SELECT rowid FROM t4 WHERE x MATCH 'a*'; 180f9556a1aSdan} {-113382409004785664 1} 181f9556a1aSdan 182f9556a1aSdan 183f9556a1aSdan 1840f599faaSdanfinish_test 185