xref: /sqlite-3.40.0/test/fts3sort.test (revision 5822d6fe)
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