Index: third_party/sqlite/src/ext/fts5/test/fts5vocab.test |
diff --git a/third_party/sqlite/src/ext/fts5/test/fts5vocab.test b/third_party/sqlite/src/ext/fts5/test/fts5vocab.test |
index dc5099c6e33a704ae76417138546946be17413fe..5e0499fbf9479b0dc5ef31ba0b1e05c20a9134aa 100644 |
--- a/third_party/sqlite/src/ext/fts5/test/fts5vocab.test |
+++ b/third_party/sqlite/src/ext/fts5/test/fts5vocab.test |
@@ -21,9 +21,46 @@ ifcapable !fts5 { |
return |
} |
+foreach_detail_mode $testprefix { |
+ |
+proc null_list_entries {iFirst nInterval L} { |
+ for {set i $iFirst} {$i < [llength $L]} {incr i $nInterval} { |
+ lset L $i {} |
+ } |
+ return $L |
+} |
+ |
+proc star_from_row {L} { |
+ if {[detail_is_full]==0} { |
+ set L [null_list_entries 2 3 $L] |
+ } |
+ return $L |
+} |
+ |
+proc star_from_col {L} { |
+ if {[detail_is_col]} { |
+ set L [null_list_entries 3 4 $L] |
+ } |
+ if {[detail_is_none]} { |
+ set L [null_list_entries 1 4 $L] |
+ set L [null_list_entries 3 4 $L] |
+ } |
+ return $L |
+} |
+ |
+proc row_to_col {L} { |
+ if {[detail_is_none]==0} { error "this is for detail=none mode" } |
+ set ret [list] |
+ foreach {a b c} $L { |
+ lappend ret $a {} $b {} |
+ } |
+ set ret |
+} |
+ |
+if 1 { |
do_execsql_test 1.1.1 { |
- CREATE VIRTUAL TABLE t1 USING fts5(one, prefix=1); |
+ CREATE VIRTUAL TABLE t1 USING fts5(one, prefix=1, detail=%DETAIL%); |
CREATE VIRTUAL TABLE v1 USING fts5vocab(t1, 'row'); |
PRAGMA table_info = v1; |
} { |
@@ -52,32 +89,32 @@ do_execsql_test 1.3 { |
do_execsql_test 1.4.1 { |
SELECT * FROM v1; |
-} {x 2 4 y 1 1 z 1 1} |
+} [star_from_row {x 2 4 y 1 1 z 1 1}] |
do_execsql_test 1.4.2 { |
SELECT * FROM v2; |
-} {x one 2 4 y one 1 1 z one 1 1} |
+} [star_from_col {x one 2 4 y one 1 1 z one 1 1}] |
do_execsql_test 1.5.1 { |
BEGIN; |
INSERT INTO t1 VALUES('a b c'); |
SELECT * FROM v1 WHERE term<'d'; |
-} {a 1 1 b 1 1 c 1 1} |
+} [star_from_row {a 1 1 b 1 1 c 1 1}] |
do_execsql_test 1.5.2 { |
SELECT * FROM v2 WHERE term<'d'; |
COMMIT; |
-} {a one 1 1 b one 1 1 c one 1 1} |
+} [star_from_col {a one 1 1 b one 1 1 c one 1 1}] |
do_execsql_test 1.6 { |
DELETE FROM t1 WHERE one = 'a b c'; |
SELECT * FROM v1; |
-} {x 2 4 y 1 1 z 1 1} |
+} [star_from_row {x 2 4 y 1 1 z 1 1}] |
#------------------------------------------------------------------------- |
# |
do_execsql_test 2.0 { |
- CREATE VIRTUAL TABLE tt USING fts5(a, b); |
+ CREATE VIRTUAL TABLE tt USING fts5(a, b, detail=%DETAIL%); |
INSERT INTO tt VALUES('d g b f d f', 'f c e c d a'); |
INSERT INTO tt VALUES('f a e a a b', 'e d c f d d'); |
INSERT INTO tt VALUES('b c a a a b', 'f f c c b c'); |
@@ -90,7 +127,12 @@ do_execsql_test 2.0 { |
INSERT INTO tt VALUES('c c a a c f', 'd g a e b g'); |
} |
-set res_col { |
+set res_row [star_from_row { |
+ a 10 20 b 9 14 c 9 20 d 9 19 |
+ e 8 13 f 10 20 g 7 14 x 1 1 |
+ y 1 1 |
+}] |
+set res_col [star_from_col { |
a a 6 11 a b 7 9 |
b a 6 7 b b 7 7 |
c a 6 12 c b 5 8 |
@@ -99,11 +141,9 @@ set res_col { |
f a 9 10 f b 7 10 |
g a 5 7 g b 5 7 |
x a 1 1 y b 1 1 |
-} |
-set res_row { |
- a 10 20 b 9 14 c 9 20 d 9 19 |
- e 8 13 f 10 20 g 7 14 x 1 1 |
- y 1 1 |
+}] |
+if {[detail_is_none]} { |
+ set res_col [row_to_col $res_row] |
} |
foreach {tn tbl resname} { |
@@ -153,9 +193,9 @@ reset_db |
forcedelete test.db2 |
do_execsql_test 5.0 { |
ATTACH 'test.db2' AS aux; |
- CREATE VIRTUAL TABLE t1 USING fts5(x); |
- CREATE VIRTUAL TABLE temp.t1 USING fts5(x); |
- CREATE VIRTUAL TABLE aux.t1 USING fts5(x); |
+ CREATE VIRTUAL TABLE t1 USING fts5(x, detail=%DETAIL%); |
+ CREATE VIRTUAL TABLE temp.t1 USING fts5(x, detail=%DETAIL%); |
+ CREATE VIRTUAL TABLE aux.t1 USING fts5(x, detail=%DETAIL%); |
INSERT INTO main.t1 VALUES('a b c'); |
INSERT INTO main.t1 VALUES('d e f'); |
@@ -178,18 +218,18 @@ do_execsql_test 5.1 { |
CREATE VIRTUAL TABLE temp.va USING fts5vocab(aux, t1, row); |
} |
-do_execsql_test 5.2 { SELECT * FROM vm } { |
+do_execsql_test 5.2 { SELECT * FROM vm } [star_from_row { |
a 2 2 b 1 1 c 2 2 d 1 1 e 2 2 f 1 1 |
-} |
-do_execsql_test 5.3 { SELECT * FROM vt1 } { |
+}] |
+do_execsql_test 5.3 { SELECT * FROM vt1 } [star_from_row { |
1 2 2 2 1 1 3 2 2 4 1 1 5 2 2 6 1 1 |
-} |
-do_execsql_test 5.4 { SELECT * FROM vt2 } { |
+}] |
+do_execsql_test 5.4 { SELECT * FROM vt2 } [star_from_row { |
1 2 2 2 1 1 3 2 2 4 1 1 5 2 2 6 1 1 |
-} |
-do_execsql_test 5.5 { SELECT * FROM va } { |
+}] |
+do_execsql_test 5.5 { SELECT * FROM va } [star_from_row { |
m 1 1 n 2 2 o 1 1 x 2 2 y 1 1 z 2 2 |
-} |
+}] |
#------------------------------------------------------------------------- |
# |
@@ -218,7 +258,7 @@ do_catchsql_test 6.2 { |
# constraints in the WHERE clause). |
# |
do_execsql_test 7.0 { |
- CREATE VIRTUAL TABLE tx USING fts5(one, two); |
+ CREATE VIRTUAL TABLE tx USING fts5(one, two, detail=%DETAIL%); |
INSERT INTO tx VALUES('g a ggg g a b eee', 'cc d aa ff g ee'); |
INSERT INTO tx VALUES('dd fff i a i jjj', 'f fff hh jj e f'); |
INSERT INTO tx VALUES('ggg a f f fff dd aa', 'd ggg f f j gg ddd'); |
@@ -276,6 +316,10 @@ foreach {term} { |
if {[lindex $r2 2]==0} {set r2 [list]} |
set resc [concat $r1 $r2] |
+ |
+ set resc [star_from_col $resc] |
+ set resr [star_from_row $resr] |
+ if {[detail_is_none]} { set resc [row_to_col $resr] } |
do_execsql_test 7.$term.1 {SELECT * FROM txc WHERE term=$term} $resc |
do_execsql_test 7.$term.2 {SELECT * FROM txr WHERE term=$term} $resr |
} |
@@ -340,10 +384,102 @@ do_execsql_test 7.3.1 { |
SELECT count(*) FROM txr, txr_c WHERE txr.term = txr_c.term; |
} {30} |
-do_execsql_test 7.3.2 { |
- SELECT count(*) FROM txc, txc_c |
- WHERE txc.term = txc_c.term AND txc.col=txc_c.col; |
-} {57} |
+if {![detail_is_none]} { |
+ do_execsql_test 7.3.2 { |
+ SELECT count(*) FROM txc, txc_c |
+ WHERE txc.term = txc_c.term AND txc.col=txc_c.col; |
+ } {57} |
+} |
+ |
+} |
+ |
+#------------------------------------------------------------------------- |
+# Test the fts5vocab tables response to a specific types of corruption: |
+# where the fts5 index contains hits for columns that do not exist. |
+# |
+do_execsql_test 8.0 { |
+ CREATE VIRTUAL TABLE x1 USING fts5(a, b, c, detail=%DETAIL%); |
+ INSERT INTO x1 VALUES('a b c', 'd e f', 'g h i'); |
+ INSERT INTO x1 VALUES('g h i', 'a b c', 'd e f'); |
+ INSERT INTO x1 VALUES('d e f', 'g h i', 'a b c'); |
+ CREATE VIRTUAL TABLE x1_r USING fts5vocab(x1, row); |
+ CREATE VIRTUAL TABLE x1_c USING fts5vocab(x1, col); |
+} |
+ |
+set resr [star_from_row {a 3 3 b 3 3 c 3 3 d 3 3 e 3 3 f 3 3 g 3 3 h 3 3 i 3 3}] |
+set resc [star_from_col { |
+ a a 1 1 a b 1 1 a c 1 1 b a 1 1 |
+ b b 1 1 b c 1 1 c a 1 1 c b 1 1 |
+ c c 1 1 d a 1 1 d b 1 1 d c 1 1 |
+ e a 1 1 e b 1 1 e c 1 1 f a 1 1 |
+ f b 1 1 f c 1 1 g a 1 1 g b 1 1 |
+ g c 1 1 h a 1 1 h b 1 1 h c 1 1 |
+ i a 1 1 i b 1 1 i c 1 1 |
+}] |
+if {[detail_is_none]} { set resc [row_to_col $resr] } |
+ |
+do_execsql_test 8.1.1 { SELECT * FROM x1_r; } $resr |
+do_execsql_test 8.1.2 { SELECT * FROM x1_c } $resc |
+ |
+do_execsql_test 8.2 { |
+ PRAGMA writable_schema = 1; |
+ UPDATE sqlite_master |
+ SET sql = 'CREATE VIRTUAL TABLE x1 USING fts5(a, detail=%DETAIL%)' |
+ WHERE name = 'x1'; |
+} |
+db close |
+sqlite3 db test.db |
+sqlite3_fts5_may_be_corrupt 1 |
+ |
+do_execsql_test 8.2.1 { SELECT * FROM x1_r } $resr |
+ |
+if {[detail_is_none]} { |
+ do_execsql_test 8.2.2 { SELECT * FROM x1_c } $resc |
+} else { |
+ do_catchsql_test 8.2.2 { |
+ SELECT * FROM x1_c |
+ } {1 {database disk image is malformed}} |
+} |
+ |
+sqlite3_fts5_may_be_corrupt 0 |
+} |
+ |
+#------------------------------------------------------------------------- |
+# Test that both "ORDER BY term" and "ORDER BY term DESC" work. |
+# |
+reset_db |
+do_execsql_test 9.1 { |
+ CREATE VIRTUAL TABLE x1 USING fts5(x); |
+ INSERT INTO x1 VALUES('def ABC ghi'); |
+ INSERT INTO x1 VALUES('DEF abc GHI'); |
+} |
+ |
+do_execsql_test 9.2 { |
+ CREATE VIRTUAL TABLE rrr USING fts5vocab(x1, row); |
+ SELECT * FROM rrr |
+} { |
+ abc 2 2 def 2 2 ghi 2 2 |
+} |
+do_execsql_test 9.3 { |
+ SELECT * FROM rrr ORDER BY term ASC |
+} { |
+ abc 2 2 def 2 2 ghi 2 2 |
+} |
+do_execsql_test 9.4 { |
+ SELECT * FROM rrr ORDER BY term DESC |
+} { |
+ ghi 2 2 def 2 2 abc 2 2 |
+} |
+do_test 9.5 { |
+ set e2 [db eval { EXPLAIN SELECT * FROM rrr ORDER BY term ASC }] |
+ expr [lsearch $e2 SorterSort]<0 |
+} 1 |
+do_test 9.6 { |
+ set e2 [db eval { EXPLAIN SELECT * FROM rrr ORDER BY term DESC }] |
+ expr [lsearch $e2 SorterSort]<0 |
+} 0 |
+ |
+ |
finish_test |