Index: third_party/sqlite/src/ext/fts5/test/fts5ac.test |
diff --git a/third_party/sqlite/src/ext/fts5/test/fts5ac.test b/third_party/sqlite/src/ext/fts5/test/fts5ac.test |
index 0de4848145531b377c6d6de5390e01b129d0b501..61b323077261866ccb321db500e2e3b2671220db 100644 |
--- a/third_party/sqlite/src/ext/fts5/test/fts5ac.test |
+++ b/third_party/sqlite/src/ext/fts5/test/fts5ac.test |
@@ -22,6 +22,8 @@ ifcapable !fts5 { |
return |
} |
+foreach_detail_mode $testprefix { |
+ |
set data { |
0 {p o q e z k z p n f y u z y n y} {l o o l v v k} |
1 {p k h h p y l l h i p v n} {p p l u r i f a j g e r r x w} |
@@ -125,80 +127,21 @@ set data { |
99 {r c v w i v h a t a c v c r e} {h h u m g o f b a e o} |
} |
-# Argument $expr is an FTS5 match expression designed to be executed against |
-# an FTS5 table with the following schema: |
-# |
-# CREATE VIRTUAL TABLE xy USING fts5(x, y); |
-# |
-# Assuming the table contains the same records as stored int the global |
-# $::data array (see above), this function returns a list containing one |
-# element for each match in the dataset. The elements are themselves lists |
-# formatted as follows: |
-# |
-# <rowid> {<phrase 0 matches> <phrase 1 matches>...} |
-# |
-# where each <phrase X matches> element is a list of phrase matches in the |
-# same form as returned by auxiliary scalar function fts5_test(). |
-# |
-proc matchdata {bPos expr {bAsc 1}} { |
- |
- set tclexpr [db one { |
- SELECT fts5_expr_tcl($expr, 'nearset $cols -pc ::pc', 'x', 'y') |
- }] |
- set res [list] |
- |
- #puts $tclexpr |
- foreach {id x y} $::data { |
- set cols [list $x $y] |
- set ::pc 0 |
- #set hits [lsort -command instcompare [eval $tclexpr]] |
- set hits [eval $tclexpr] |
- if {[llength $hits]>0} { |
- if {$bPos} { |
- lappend res [list $id $hits] |
- } else { |
- lappend res $id |
- } |
- } |
- } |
- |
- if {$bAsc} { |
- set res [lsort -integer -increasing -index 0 $res] |
- } else { |
- set res [lsort -integer -decreasing -index 0 $res] |
- } |
- |
- return [concat {*}$res] |
-} |
- |
-# |
-# End of test code |
-#------------------------------------------------------------------------- |
- |
-proc fts5_test_poslist {cmd} { |
- set res [list] |
- for {set i 0} {$i < [$cmd xInstCount]} {incr i} { |
- lappend res [string map {{ } .} [$cmd xInst $i]] |
- } |
- set res |
-} |
- |
- |
foreach {tn2 sql} { |
1 {} |
2 {BEGIN} |
} { |
reset_db |
- sqlite3_fts5_create_function db fts5_test_poslist fts5_test_poslist |
+ fts5_aux_test_functions db |
- do_execsql_test 1.0 { |
- CREATE VIRTUAL TABLE xx USING fts5(x,y); |
+ do_execsql_test 1.$tn2.0 { |
+ CREATE VIRTUAL TABLE xx USING fts5(x,y, detail=%DETAIL%); |
INSERT INTO xx(xx, rank) VALUES('pgsz', 32); |
} |
execsql $sql |
- do_test $tn2.1.1 { |
+ do_test 1.$tn2.1.1 { |
foreach {id x y} $data { |
execsql { INSERT INTO xx(rowid, x, y) VALUES($id, $x, $y) } |
} |
@@ -207,153 +150,130 @@ foreach {tn2 sql} { |
#------------------------------------------------------------------------- |
- # Test phrase queries. |
# |
- foreach {tn phrase} { |
- 1 "o" |
- 2 "b q" |
- 3 "e a e" |
- 4 "m d g q q b k b w f q q p p" |
- 5 "l o o l v v k" |
- 6 "a" |
- 7 "b" |
- 8 "c" |
- 9 "no" |
- 10 "L O O L V V K" |
- } { |
- set expr "\"$phrase\"" |
- set res [matchdata 1 $expr] |
- |
- do_execsql_test $tn2.1.2.$tn.[llength $res] { |
- SELECT rowid, fts5_test_poslist(xx) FROM xx WHERE xx match $expr |
- } $res |
+ do_execsql_test 1.$tn2.integrity { |
+ INSERT INTO xx(xx) VALUES('integrity-check'); |
} |
#------------------------------------------------------------------------- |
- # Test some AND and OR queries. |
# |
foreach {tn expr} { |
1.1 "a AND b" |
- 1.2 "a+b AND c" |
- 1.3 "d+c AND u" |
- 1.4 "d+c AND u+d" |
+ 1.2 "a OR b" |
+ 1.3 "o" |
+ 1.4 "b q" |
+ 1.5 "e a e" |
+ 1.6 "m d g q q b k b w f q q p p" |
+ 1.7 "l o o l v v k" |
+ 1.8 "a" |
+ 1.9 "b" |
+ 1.10 "c" |
+ 1.11 "no" |
+ 1.12 "L O O L V V K" |
+ 1.13 "a AND b AND c" |
+ 1.14 "x:a" |
- 2.1 "a OR b" |
- 2.2 "a+b OR c" |
- 2.3 "d+c OR u" |
- 2.4 "d+c OR u+d" |
+ 2.1 "x:a" |
+ 2.2 "y:a" |
+ 2.3 "x:b" |
+ 2.4 "y:b" |
- 3.1 { a AND b AND c } |
- } { |
- set res [matchdata 1 $expr] |
- do_execsql_test $tn2.2.$tn.[llength $res] { |
- SELECT rowid, fts5_test_poslist(xx) FROM xx WHERE xx match $expr |
- } $res |
- } |
+ 3.1 "{x}:a" |
+ 3.2 "{y}:a" |
+ 3.3 "{x}:b" |
+ 3.4 "{y}:b" |
- #------------------------------------------------------------------------- |
- # Queries on a specific column. |
- # |
- foreach {tn expr} { |
- 1.1 "x:a" |
- 1.2 "y:a" |
- 1.3 "x:b" |
- 1.4 "y:b" |
- 2.1 "{x}:a" |
- 2.2 "{y}:a" |
- 2.3 "{x}:b" |
- 2.4 "{y}:b" |
+ 4.1 "{x y}:a" |
+ 4.2 "{y x}:a" |
+ 4.3 "{x x}:b" |
+ 4.4 "{y y}:b" |
- 3.1 "{x y}:a" |
- 3.2 "{y x}:a" |
- 3.3 "{x x}:b" |
- 3.4 "{y y}:b" |
+ 5.1 {{"x" "y"}:a} |
+ 5.2 {{"y" x}:a} |
+ 5.3 {{x "x"}:b} |
+ 5.4 {{"y" y}:b} |
- 4.1 {{"x" "y"}:a} |
- 4.2 {{"y" x}:a} |
- 4.3 {{x "x"}:b} |
- 4.4 {{"y" y}:b} |
- } { |
- set res [matchdata 1 $expr] |
- do_execsql_test $tn2.3.$tn.[llength $res] { |
- SELECT rowid, fts5_test_poslist(xx) FROM xx WHERE xx match $expr |
- } $res |
- } |
+ 6.1 "b + q" |
+ 6.2 "e + a + e" |
+ 6.3 "m + d + g + q + q + b + k + b + w + f + q + q + p + p" |
+ 6.4 "l + o + o + l + v + v + k" |
+ 6.5 "L + O + O + L + V + V + K" |
- #------------------------------------------------------------------------- |
- # Some NEAR queries. |
- # |
- foreach {tn expr} { |
- 1 "NEAR(a b)" |
- 2 "NEAR(r c)" |
- 2 { NEAR(r c, 5) } |
- 3 { NEAR(r c, 3) } |
- 4 { NEAR(r c, 2) } |
- 5 { NEAR(r c, 0) } |
- 6 { NEAR(a b c) } |
- 7 { NEAR(a b c, 8) } |
- 8 { x : NEAR(r c) } |
- 9 { y : NEAR(r c) } |
- } { |
- set res [matchdata 1 $expr] |
- do_execsql_test $tn2.4.1.$tn.[llength $res] { |
- SELECT rowid, fts5_test_poslist(xx) FROM xx WHERE xx match $expr |
- } $res |
- } |
+ 7.1 "a+b AND c" |
+ 7.2 "d+c AND u" |
+ 7.3 "d+c AND u+d" |
+ 7.4 "a+b OR c" |
+ 7.5 "d+c OR u" |
+ 7.6 "d+c OR u+d" |
- do_test $tn2.4.1 { nearset {{a b c}} -- a } {0.0.0} |
- do_test $tn2.4.2 { nearset {{a b c}} -- c } {0.0.2} |
+ 8.1 "NEAR(a b)" |
+ 8.2 "NEAR(r c)" |
+ 8.2 { NEAR(r c, 5) } |
+ 8.3 { NEAR(r c, 3) } |
+ 8.4 { NEAR(r c, 2) } |
+ 8.5 { NEAR(r c, 0) } |
+ 8.6 { NEAR(a b c) } |
+ 8.7 { NEAR(a b c, 8) } |
+ 8.8 { x : NEAR(r c) } |
+ 8.9 { y : NEAR(r c) } |
- foreach {tn expr tclexpr} { |
- 1 {a b} {AND [N $x -- {a}] [N $x -- {b}]} |
+ 9.1 { NEAR(r c) } |
+ 9.2 { NEAR(r c, 5) } |
+ 9.3 { NEAR(r c, 3) } |
+ 9.4 { NEAR(r c, 2) } |
+ 9.5 { NEAR(r c, 0) } |
+ 9.6 { NEAR(a b c) } |
+ 9.7 { NEAR(a b c, 8) } |
+ 9.8 { x : NEAR(r c) } |
+ 9.9 { y : NEAR(r c) } |
+ 9.10 { x : "r c" } |
+ 9.11 { y : "r c" } |
+ 9.12 { a AND b } |
+ 9.13 { a AND b AND c } |
+ 9.14a { a } |
+ 9.14b { a OR b } |
+ 9.15 { a OR b AND c } |
+ 9.16 { c AND b OR a } |
+ 9.17 { c AND (b OR a) } |
+ 9.18 { c NOT (b OR a) } |
+ 9.19 { (c NOT b) OR (a AND d) } |
} { |
- do_execsql_test $tn2.5.$tn { |
- SELECT fts5_expr_tcl($expr, 'N $x') |
- } [list $tclexpr] |
- } |
- #------------------------------------------------------------------------- |
- # |
- do_execsql_test $tn2.6.integrity { |
- INSERT INTO xx(xx) VALUES('integrity-check'); |
- } |
- #db eval {SELECT rowid, fts5_decode(rowid, block) aS r FROM xx_data} {puts $r} |
- foreach {bAsc sql} { |
- 1 {SELECT rowid FROM xx WHERE xx MATCH $expr} |
- 0 {SELECT rowid FROM xx WHERE xx MATCH $expr ORDER BY rowid DESC} |
- } { |
- foreach {tn expr} { |
- 0.1 x |
- 1 { NEAR(r c) } |
- 2 { NEAR(r c, 5) } |
- 3 { NEAR(r c, 3) } |
- 4 { NEAR(r c, 2) } |
- 5 { NEAR(r c, 0) } |
- 6 { NEAR(a b c) } |
- 7 { NEAR(a b c, 8) } |
- 8 { x : NEAR(r c) } |
- 9 { y : NEAR(r c) } |
- 10 { x : "r c" } |
- 11 { y : "r c" } |
- 12 { a AND b } |
- 13 { a AND b AND c } |
- 14a { a } |
- 14b { a OR b } |
- 15 { a OR b AND c } |
- 16 { c AND b OR a } |
- 17 { c AND (b OR a) } |
- 18 { c NOT (b OR a) } |
- 19 { c NOT b OR a AND d } |
- } { |
- set res [matchdata 0 $expr $bAsc] |
- do_execsql_test $tn2.6.$bAsc.$tn.[llength $res] $sql $res |
+ if {[fts5_expr_ok $expr xx]==0} { |
+ do_test 1.$tn2.$tn.OMITTED { list } [list] |
+ continue |
} |
+ |
+ set res [fts5_query_data $expr xx] |
+ do_execsql_test 1.$tn2.$tn.[llength $res].asc { |
+ SELECT rowid, fts5_test_poslist(xx), fts5_test_collist(xx) |
+ FROM xx WHERE xx match $expr |
+ } $res |
+ |
+ set res [fts5_query_data $expr xx DESC] |
+ do_execsql_test 1.$tn2.$tn.[llength $res].desc { |
+ SELECT rowid, fts5_test_poslist(xx), fts5_test_collist(xx) |
+ FROM xx WHERE xx match $expr ORDER BY 1 DESC |
+ } $res |
} |
} |
-do_execsql_test 3.1 { |
+} |
+ |
+do_execsql_test 2.1 { |
SELECT fts5_expr_tcl('a AND b'); |
} {{AND [nearset -- {a}] [nearset -- {b}]}} |
+do_test 2.2.1 { nearset {{a b c}} -- a } {0.0.0} |
+do_test 2.2.2 { nearset {{a b c}} -- c } {0.0.2} |
+ |
+foreach {tn expr tclexpr} { |
+ 1 {a b} {AND [N $x -- {a}] [N $x -- {b}]} |
+} { |
+ do_execsql_test 2.3.$tn { |
+ SELECT fts5_expr_tcl($expr, 'N $x') |
+ } [list $tclexpr] |
+} |
+ |
finish_test |