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 | jdoh...@companioncorp.com 

_______________________________________________
sqlite-users mailing list
sqlite-users@mailinglists.sqlite.org
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to