# ... WHERE fts MATCH ? ORDER BY rank [ASC|DESC]
#
+foreach_detail_mode $testprefix {
+
do_execsql_test 1.0 {
- CREATE VIRTUAL TABLE t1 USING fts5(x, y, z);
+ CREATE VIRTUAL TABLE t1 USING fts5(x, y, z, detail=%DETAIL%);
}
do_test 1.1 {
2.3 c
2.4 d
- 2.5 {"m m"}
- 2.6 {e + s}
-
3.0 {a AND b}
3.1 {a OR b}
3.2 {b OR c AND d}
- 3.3 {NEAR(c d)}
} {
do_fts5ag_test $tn $expr
+}
- if {[set_test_counter errors]} break
+if {[detail_is_full]} {
+ foreach {tn expr} {
+ 4.1 {"m m"}
+ 4.2 {e + s}
+ 4.3 {NEAR(c d)}
+ } {
+ do_fts5ag_test $tn $expr
+ }
}
+} ;# foreach_detail_mode
finish_test
return
}
+foreach_detail_mode $testprefix {
+
#-------------------------------------------------------------------------
# This file contains tests for very large doclists.
#
+set Y [list]
+set W [list]
do_test 1.0 {
- execsql { CREATE VIRTUAL TABLE t1 USING fts5(a) }
+ execsql { CREATE VIRTUAL TABLE t1 USING fts5(a, detail=%DETAIL%) }
execsql { INSERT INTO t1(t1, rank) VALUES('pgsz', 128) }
set v {w w w w w w w w w w w w w w w w w w w w}
execsql { INSERT INTO t1(rowid, a) VALUES(0, $v) }
set nRead [reads]
execsql { SELECT rowid FROM t1 WHERE t1 MATCH 'x' }
set nReadX [expr [reads] - $nRead]
- expr $nReadX>1000
+ #puts -nonewline "(nReadX=$nReadX)"
+ if {[detail_is_full]} { set expect 1000 }
+ if {[detail_is_col]} { set expect 250 }
+ if {[detail_is_none]} { set expect 80 }
+
+ expr $nReadX>$expect
} {1}
do_test 1.5 {
3 { SELECT rowid FROM t1 WHERE t1 MATCH 'x AND w' } [list $W]
4 { SELECT rowid FROM t1 WHERE t1 MATCH 'y AND x' } [list $Y]
" {
+ if {[detail_is_full]==0 && ($tn==1 || $tn==2)} continue
+
+ if {[detail_is_full]} { set ratio 8 }
+ if {[detail_is_col]} { set ratio 4 }
+ if {[detail_is_none]} { set ratio 2 }
do_test 1.6.$tn.1 {
set n [execsql_reads $q]
#puts -nonewline "(n=$n nReadX=$nReadX)"
- expr {$n < ($nReadX / 8)}
+ expr {$n < ($nReadX / $ratio)}
} {1}
do_test 1.6.$tn.2 {
set n [execsql_reads "$q ORDER BY rowid DESC"]
#puts -nonewline "(n=$n nReadX=$nReadX)"
- expr {$n < ($nReadX / 8)}
+ expr {$n < ($nReadX / $ratio)}
} {1}
do_execsql_test 1.6.$tn.3 $q [lsort -int -incr $res]
# number of pages loaded from disk.
#
foreach {tn fraction tail cnt} {
- 1 0.6 {rowid > 5000} 5000
- 2 0.2 {rowid > 9000} 1000
- 3 0.2 {rowid < 1000} 999
- 4 0.2 {rowid BETWEEN 4000 AND 5000} 1001
- 5 0.6 {rowid >= 5000} 5001
- 6 0.2 {rowid >= 9000} 1001
- 7 0.2 {rowid <= 1000} 1000
- 8 0.6 {rowid > '5000'} 5000
- 9 0.2 {rowid > '9000'} 1000
+ 1 0.6 {rowid > 5000} 5000
+ 2 0.2 {rowid > 9000} 1000
+ 3 0.2 {rowid < 1000} 999
+ 4 0.2 {rowid BETWEEN 4000 AND 5000} 1001
+ 5 0.6 {rowid >= 5000} 5001
+ 6 0.2 {rowid >= 9000} 1001
+ 7 0.2 {rowid <= 1000} 1000
+ 8 0.6 {rowid > '5000'} 5000
+ 9 0.2 {rowid > '9000'} 1000
10 0.1 {rowid = 444} 1
} {
set q "SELECT rowid FROM t1 WHERE t1 MATCH 'x' AND $tail"
set n [execsql_reads $q]
set ret [llength [execsql $q]]
+ # Because the position lists for 'x' are quite long in this db, the
+ # advantage is a bit smaller in detail=none mode. Update $fraction to
+ # reflect this.
+ if {[detail_is_none] && $fraction<0.5} { set fraction [expr $fraction*2] }
+
do_test "1.7.$tn.asc.(n=$n ret=$ret)" {
expr {$n < ($fraction*$nReadX) && $ret==$cnt}
} {1}
SELECT count(*) FROM t1 WHERE t1 MATCH 'x' AND rowid < 'text';
} {10000}
+} ;# foreach_detail_mode
#db eval {SELECT rowid, fts5_decode(rowid, block) aS r FROM t1_data} {puts $r}
return
}
+foreach_detail_mode $testprefix {
+
do_execsql_test 1.0 {
- CREATE VIRTUAL TABLE t1 USING fts5(a);
+ CREATE VIRTUAL TABLE t1 USING fts5(a, detail=%DETAIL%);
} {}
do_execsql_test 1.1 {
do_execsql_test 1.2 {
INSERT INTO t1(t1) VALUES('integrity-check');
}
+}
finish_test
return
}
+foreach_detail_mode $testprefix {
+
do_execsql_test 1.1 {
- CREATE VIRTUAL TABLE ft1 USING fts5(x);
+ CREATE VIRTUAL TABLE ft1 USING fts5(x, detail=%DETAIL%);
INSERT INTO ft1 VALUES('i d d a g i b g d d');
INSERT INTO ft1 VALUES('h d b j c c g a c a');
INSERT INTO ft1 VALUES('e j a e f h b f h h');
INSERT INTO ft1 VALUES('i c c f a d g h j e');
INSERT INTO ft1 VALUES('i d i g c d c h b f');
INSERT INTO ft1 VALUES('g d a e h a b c f j');
+
+ CREATE VIRTUAL TABLE ft2 USING fts5(x, detail=%DETAIL%);
+ INSERT INTO ft2 VALUES('a b c d e f g h i j');
}
do_execsql_test 1.2 {
}
do_execsql_test 1.3 {
- SELECT highlight(ft1, 0, '[', ']') FROM ft1 WHERE ft1 MATCH 'h + d';
-} {
- {[h d] b j c c g a c a}
- {j f [h d] g h i b d f}
-}
-
-do_execsql_test 1.4 {
- SELECT highlight(ft1, 0, '[', ']') FROM ft1 WHERE ft1 MATCH 'd + d';
-} {
- {i [d d] a g i b g [d d]}
-}
-
-do_execsql_test 1.5 {
SELECT highlight(ft1, 0, '[', ']') FROM ft1 WHERE ft1 MATCH 'e e e'
} {
{[e] j a [e] f h b f h h}
{g d a [e] h a b c f j}
}
-do_execsql_test 1.6 {
- SELECT highlight(ft1, 0, '[', ']') FROM ft1 WHERE ft1 MATCH 'd + d d + d';
+do_execsql_test 1.4 {
+ SELECT highlight(ft2, 0, '[', ']') FROM ft2 WHERE ft2 MATCH 'f d'
} {
- {i [d d] a g i b g [d d]}
+ {a b c [d] e [f] g h i j}
+}
+
+do_execsql_test 1.5 {
+ SELECT highlight(ft2, 0, '[', ']') FROM ft2 WHERE ft2 MATCH 'd f'
+} {
+ {a b c [d] e [f] g h i j}
}
+#-------------------------------------------------------------------------
+# Tests below this point require detail=full.
+#-------------------------------------------------------------------------
+if {[detail_is_full]==0} continue
+
+
do_execsql_test 2.1 {
- CREATE VIRTUAL TABLE ft2 USING fts5(x);
- INSERT INTO ft2 VALUES('a b c d e f g h i j');
+ SELECT highlight(ft1, 0, '[', ']') FROM ft1 WHERE ft1 MATCH 'h + d';
+} {
+ {[h d] b j c c g a c a}
+ {j f [h d] g h i b d f}
}
do_execsql_test 2.2 {
+ SELECT highlight(ft1, 0, '[', ']') FROM ft1 WHERE ft1 MATCH 'd + d';
+} {
+ {i [d d] a g i b g [d d]}
+}
+
+do_execsql_test 2.3 {
+ SELECT highlight(ft1, 0, '[', ']') FROM ft1 WHERE ft1 MATCH 'd + d d + d';
+} {
+ {i [d d] a g i b g [d d]}
+}
+
+do_execsql_test 2.4 {
SELECT highlight(ft2, 0, '[', ']') FROM ft2 WHERE ft2 MATCH 'b+c+d c+d+e'
} {{a [b c d e] f g h i j}}
-do_execsql_test 2.3 {
+do_execsql_test 2.5 {
SELECT highlight(ft2, 0, '[', ']') FROM ft2 WHERE ft2 MATCH 'b+c+d e+f+g'
} {
{a [b c d] [e f g] h i j}
}
-do_execsql_test 2.4 {
+do_execsql_test 2.6 {
SELECT highlight(ft2, 0, '[', ']') FROM ft2 WHERE ft2 MATCH 'b+c+d c'
} {
{a [b c d] e f g h i j}
}
-do_execsql_test 2.5 {
+do_execsql_test 2.7 {
SELECT highlight(ft2, 0, '[', ']') FROM ft2 WHERE ft2 MATCH 'b+c c+d+e'
} {
{a [b c d e] f g h i j}
}
-do_execsql_test 2.6.1 {
- SELECT highlight(ft2, 0, '[', ']') FROM ft2 WHERE ft2 MATCH 'f d'
-} {
- {a b c [d] e [f] g h i j}
-}
-
-do_execsql_test 2.6.2 {
- SELECT highlight(ft2, 0, '[', ']') FROM ft2 WHERE ft2 MATCH 'd f'
-} {
- {a b c [d] e [f] g h i j}
-}
-
#-------------------------------------------------------------------------
# The example from the docs.
#
do_execsql_test 3.1 {
-- Assuming this:
- CREATE VIRTUAL TABLE ft USING fts5(a);
+ CREATE VIRTUAL TABLE ft USING fts5(a, detail=%DETAIL%);
INSERT INTO ft VALUES('a b c x c d e');
INSERT INTO ft VALUES('a b c c d e');
INSERT INTO ft VALUES('a b c d e');
{[a b c d e]}
}
+}
finish_test
return
}
+foreach_detail_mode $testprefix {
+
do_execsql_test 1.1 {
- CREATE VIRTUAL TABLE ft1 USING fts5(x);
+ CREATE VIRTUAL TABLE ft1 USING fts5(x, detail=%DETAIL%);
SELECT * FROM ft1_config;
} {version 4}
#
do_execsql_test 3.1 {
- CREATE VIRTUAL TABLE t1 USING fts5(x);
+ CREATE VIRTUAL TABLE t1 USING fts5(x, detail=%DETAIL%);
INSERT INTO t1 VALUES('q w e r t y');
INSERT INTO t1 VALUES('y t r e w q');
}
{{0 0 5}}
}
-do_execsql_test 3.4.2 {
- SELECT insttest(t1) FROM t1 WHERE t1 MATCH 'r+e OR w'
-} {
- {{1 0 1}}
- {{0 0 2} {1 0 4}}
+if {[detail_is_full]} {
+ do_execsql_test 3.4.2 {
+ SELECT insttest(t1) FROM t1 WHERE t1 MATCH 'r+e OR w'
+ } {
+ {{1 0 1}}
+ {{0 0 2} {1 0 4}}
+ }
}
proc coltest {cmd} {
#
do_execsql_test 4.0 {
- CREATE VIRTUAL TABLE t2 USING fts5(a, b);
+ CREATE VIRTUAL TABLE t2 USING fts5(a, b, detail=%DETAIL%);
INSERT INTO t2 VALUES('a s h g s b j m r h', 's b p a d b b a o e');
INSERT INTO t2 VALUES('r h n t a g r d d i', 'l d n j r c f t o q');
INSERT INTO t2 VALUES('q k n i k c a a e m', 'c h n j p g s c i t');
}
sqlite3_fts5_create_function db rowidplus rowidplus
-do_execsql_test 4.2.1 {
- INSERT INTO t2(t2, rank) VALUES('rank', 'rowidplus(100) ');
- SELECT rowid, rank FROM t2 WHERE t2 MATCH 'o + q + g'
-} {
- 10 110
-}
-do_execsql_test 4.2.2 {
- INSERT INTO t2(t2, rank) VALUES('rank', 'rowidplus(111) ');
- SELECT rowid, rank FROM t2 WHERE t2 MATCH 'o + q + g'
-} {
- 10 121
-}
+if {[detail_is_full]} {
+ do_execsql_test 4.2.1 {
+ INSERT INTO t2(t2, rank) VALUES('rank', 'rowidplus(100) ');
+ SELECT rowid, rank FROM t2 WHERE t2 MATCH 'o + q + g'
+ } {
+ 10 110
+ }
+ do_execsql_test 4.2.2 {
+ INSERT INTO t2(t2, rank) VALUES('rank', 'rowidplus(111) ');
+ SELECT rowid, rank FROM t2 WHERE t2 MATCH 'o + q + g'
+ } {
+ 10 121
+ }
-do_execsql_test 4.2.3 {
- SELECT rowid, rank FROM t2
- WHERE t2 MATCH 'o + q + g' AND rank MATCH 'rowidplus(112)'
-} {
- 10 122
+ do_execsql_test 4.2.3 {
+ SELECT rowid, rank FROM t2
+ WHERE t2 MATCH 'o + q + g' AND rank MATCH 'rowidplus(112)'
+ } {
+ 10 122
+ }
}
proc rowidmod {cmd imod} {
}
sqlite3_fts5_create_function db rowidmod rowidmod
do_execsql_test 4.3.1 {
- CREATE VIRTUAL TABLE t3 USING fts5(x);
+ CREATE VIRTUAL TABLE t3 USING fts5(x, detail=%DETAIL%);
INSERT INTO t3 VALUES('a one');
INSERT INTO t3 VALUES('a two');
INSERT INTO t3 VALUES('a three');
SELECT *, rank FROM t3 WHERE t3 MATCH 'a' AND rank MATCH NULL
} {1 {parse error in rank function: }}
+} ;# foreach_detail_mode
finish_test
-C Changes\sto\srun\smany\sfts5\stests\swith\sdetail=none\sand\sdetail=col\stables\sas\swell\sas\sthe\sdefault\sdetail=full.\sAlso\sfixes\sfor\sthe\sbugs\suncovered\sby\srunning\ssaid\stests.
-D 2016-01-02T19:01:56.026
+C Update\smore\sfts5\stests\sto\srun\sin\sdetail=none\sand\sdetail=column\smodes\sas\swell\sas\sthe\sdefault\sdetail=full.
+D 2016-01-04T16:19:51.421
F Makefile.in 28bcd6149e050dff35d4dcfd97e890cd387a499d
F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
F Makefile.msc 5fff077fcc46de7714ed6eebb6159a4c00eab751
F ext/fts5/test/fts5ad.test 049f7511a79c155d2d8dfd2ddcfeb640c50ad0dc
F ext/fts5/test/fts5ae.test 612dcb51f4069226791ff14c17dbfb3138c56f20
F ext/fts5/test/fts5af.test be858a96b1f5de66ba6d64f0021bd8b2408e126c
-F ext/fts5/test/fts5ag.test ec3e119b728196620a31507ef503c455a7a73505
-F ext/fts5/test/fts5ah.test e592c4978622dbc4de552cd0f9395df60ac5d54c
-F ext/fts5/test/fts5ai.test f20e53bbf0c55bc596f1fd47f2740dae028b8f37
+F ext/fts5/test/fts5ag.test 27180de76c03036be75ee80b93d8c5f540014071
+F ext/fts5/test/fts5ah.test dfb7897711dbcda1dacb038aec310daca139fcf5
+F ext/fts5/test/fts5ai.test 3909d0b949b2afcaae4d5795cd79153da75381df
F ext/fts5/test/fts5aj.test 05b569f5c16ea3098fb1984eec5cf50dbdaae5d8
-F ext/fts5/test/fts5ak.test 7b8c5df96df599293f920b7e5521ebc79f647592
-F ext/fts5/test/fts5al.test a1b7b6393376bc2adc216527a28f5ae5594069df
+F ext/fts5/test/fts5ak.test fb26389985407826f6076bb9f382c67d3db6b5d9
+F ext/fts5/test/fts5al.test 18c277f5986df0a3d9071dfd7128afeb16fe9d5d
F ext/fts5/test/fts5alter.test 6022c61467a82aa11c70822ccad22b328dcf0d04
F ext/fts5/test/fts5auto.test 2a6241673657b340427f521528f7809ddaa02a9e
F ext/fts5/test/fts5aux.test 8c687c948cc98e9a94be014df7d518acc1b3b74f
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 3a1df69e58e5830da1dff158eedbe3817743f58f
-R 584d5f1c8b7a15ac2eae2ab1ffe71c4a
+P 6322a1d984e7946735bace8a069ef24b31754b3b
+R 32e8694f89e6ec744ed1fb193a76a532
U dan
-Z cff9ad15204445a84003e93595871343
+Z 780f62d5b61ae786fb811bd6c42602f7
-6322a1d984e7946735bace8a069ef24b31754b3b
\ No newline at end of file
+3fcf3b1e24483b2cd1c1710f053ed8403e09106d
\ No newline at end of file