I am encountering errors or crashes when using FTS5 and MATCH expressions
involving
<query>OR <query>
combined with
ORDER BY rank
=========================
Simplest example [using SQLite program]:
-----------------------------------------------
DROP TABLE IF EXISTS VTest;
CREATE virtual TABLE VTest USING FTS5(Title, AUthor, tokenize ='porter
unicode61 remove_diacritics 1', columnsize='1', detail=full);
INSERT INTO VTest (Title, Author) VALUES ('wrinkle in time', 'Bill Smith');
SELECT * FROM VTest;
OK
SELECT * FROM VTest WHERE VTest MATCH 'wrinkle in time OR a wrinkle in time';
OK
SELECT * FROM VTest WHERE VTest MATCH 'wrinkle in time' ORDER BY rank
OK
SELECT * FROM VTest WHERE VTest MATCH 'wrinkle in time OR a wrinkle in time'
ORDER BY rank;
ERROR
Error: database disk image is malformed
Note that the error [or commonly a crash in my system with a real table/data]
seems to occur when the OR is combined with ORDER BY
These [simplified] results were obtained with the SQLite shell program built
with SQLite 3.13.
=========================
SQLite build: [Windows 10, VS 2015] Preprocessor flags:
-----------------------------------------------
WIN32
_DEBUG
_WINDOWS
SQLITE_THREADSAFE=2
SQLITE_ALLOW_COVERING_INDEX_SCAN=1
SQLITE_ENABLE_STAT4=1
SQLITE_TEMP_STORE=2
SQLITE_ENABLE_FTS5=1
SQLITE_ENABLE_FTS4=1
SQLITE_ENABLE_FTS3=1
SQLITE_ENABLE_FTS3_PARENTHESIS=1
----------------------------------------------------------------
I also see this kind of problem in SQLiteStudio with SQLite 3.12.2 and [most
importantly to us] in our application built with SQLite3.13 [with same flags
above]
I assume that I misunderstood something about the syntax or flags, but
reviewing the SQLite docs on FTS5 I don't see where I went wrong.
=========================
Further details:
-----------------------------------------------
In our program [32-bit debug build with above flags] with VS 2015 debugger set
to trap exceptions we see this stack trace
00000000() Unknown
[Frames below may be incorrect and/or missing]
Alexandria.exe!fts5MultiIterNext(Fts5Index * p, Fts5Iter * pIter, int
bFrom, __int64 iFrom) Line 186755 C
Alexandria.exe!fts5MultiIterNextFrom(Fts5Index * p, Fts5Iter * pIter,
__int64 iMatch) Line 187418 C
Alexandria.exe!sqlite3Fts5IterNextFrom(Fts5IndexIter * pIndexIter, __int64
iMatch) Line 189325 C
Alexandria.exe!fts5ExprNodeNext_TERM(Fts5Expr * pExpr, Fts5ExprNode *
pNode, int bFromValid, __int64 iFrom) Line 181773 C
Alexandria.exe!fts5ExprNodeTest_AND(Fts5Expr * pExpr, Fts5ExprNode * pAnd)
Line 181852 C
Alexandria.exe!fts5ExprNodeNext_AND(Fts5Expr * pExpr, Fts5ExprNode *
pNode, int bFromValid, __int64 iFrom) Line 181891 C
Alexandria.exe!fts5ExprNodeNext_OR(Fts5Expr * pExpr, Fts5ExprNode * pNode,
int bFromValid, __int64 iFrom) Line 181821 C
Alexandria.exe!sqlite3Fts5ExprNext(Fts5Expr * p, __int64 iLast) Line
182079 C
Alexandria.exe!fts5NextMethod(sqlite3_vtab_cursor * pCursor) Line 191208
C
Alexandria.exe!sqlite3VdbeExec(Vdbe * p) Line 83260 C
Alexandria.exe!sqlite3Step(Vdbe * p) Line 75131 C
Alexandria.exe!sqlite3_step(sqlite3_stmt * pStmt) Line 75193 C
Alexandria.exe!fts5SorterNext(Fts5Cursor * pCsr) Line 191102 C
Alexandria.exe!fts5CursorFirstSorted(Fts5Table * pTab, Fts5Cursor * pCsr,
int bDesc) Line 191303 C
Alexandria.exe!fts5FilterMethod(sqlite3_vtab_cursor * pCursor, int idxNum,
const char * zUnused, int nVal, Mem * * apVal) Line 191588 C
Alexandria.exe!sqlite3VdbeExec(Vdbe * p) Line 83174 C
Alexandria.exe!sqlite3Step(Vdbe * p) Line 75131 C
Alexandria.exe!sqlite3_step(sqlite3_stmt * pStmt) Line 75193 C
Alexandria.exe!nsFTS5SearchService::`anonymous
namespace'::DB_Worker::operator()(const
std::basic_string<char,std::char_traits<char>,std::allocator<char> > & csQuery,
unsigned int nMaxToFind,
std::vector<nsFTS5SearchService::SearchResponse::SearchRecord,std::allocator<nsFTS5SearchService::SearchResponse::SearchRecord>
> & vecResp) Line 76 C++
With this query:
SELECT T2TFTSrsn FROM T2TitleFTS WHERE T2TitleFTS MATCH '{T2TFTStitle
T2TFTSseries}:a wrinkle in time OR wrinkle in time' ORDER BY rank LIMIT 50;
=========================
Julian Dohmen | developer
Evelyn Manufacturing | Alexandria & KeepnTrack
801.943.7277 ext 565 | [email protected]
_______________________________________________
sqlite-users mailing list
[email protected]
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users