mirror of
https://github.com/sqlite/sqlite.git
synced 2025-07-29 08:01:23 +03:00
Fix an fts4 matchinf() problem triggered by deferred tokens that are part of phrases that are part of AND expressions.
FossilOrigin-Name: f1e942a1dda496a509741e9cc2a17e8b4dac63a3
This commit is contained in:
@ -5074,7 +5074,7 @@ static int fts3EvalNearTrim(
|
||||
** 2. NEAR is treated as AND. If the expression is "x NEAR y", it is
|
||||
** advanced to point to the next row that matches "x AND y".
|
||||
**
|
||||
** See fts3EvalTestDeferredAndNear() for details on testing if a row is
|
||||
** See sqlite3Fts3EvalTestDeferred() for details on testing if a row is
|
||||
** really a match, taking into account deferred tokens and NEAR operators.
|
||||
*/
|
||||
static void fts3EvalNextRow(
|
||||
@ -5294,7 +5294,7 @@ static int fts3EvalNearTest(Fts3Expr *pExpr, int *pRc){
|
||||
}
|
||||
|
||||
/*
|
||||
** This function is a helper function for fts3EvalTestDeferredAndNear().
|
||||
** This function is a helper function for sqlite3Fts3EvalTestDeferred().
|
||||
** Assuming no error occurs or has occurred, It returns non-zero if the
|
||||
** expression passed as the second argument matches the row that pCsr
|
||||
** currently points to, or zero if it does not.
|
||||
@ -5415,7 +5415,7 @@ static int fts3EvalTestExpr(
|
||||
** Or, if no error occurs and it seems the current row does match the FTS
|
||||
** query, return 0.
|
||||
*/
|
||||
static int fts3EvalTestDeferredAndNear(Fts3Cursor *pCsr, int *pRc){
|
||||
int sqlite3Fts3EvalTestDeferred(Fts3Cursor *pCsr, int *pRc){
|
||||
int rc = *pRc;
|
||||
int bMiss = 0;
|
||||
if( rc==SQLITE_OK ){
|
||||
@ -5462,7 +5462,7 @@ static int fts3EvalNext(Fts3Cursor *pCsr){
|
||||
pCsr->isRequireSeek = 1;
|
||||
pCsr->isMatchinfoNeeded = 1;
|
||||
pCsr->iPrevId = pExpr->iDocid;
|
||||
}while( pCsr->isEof==0 && fts3EvalTestDeferredAndNear(pCsr, &rc) );
|
||||
}while( pCsr->isEof==0 && sqlite3Fts3EvalTestDeferred(pCsr, &rc) );
|
||||
}
|
||||
|
||||
/* Check if the cursor is past the end of the docid range specified
|
||||
@ -5623,7 +5623,7 @@ static int fts3EvalGatherStats(
|
||||
pCsr->iPrevId = pRoot->iDocid;
|
||||
}while( pCsr->isEof==0
|
||||
&& pRoot->eType==FTSQUERY_NEAR
|
||||
&& fts3EvalTestDeferredAndNear(pCsr, &rc)
|
||||
&& sqlite3Fts3EvalTestDeferred(pCsr, &rc)
|
||||
);
|
||||
|
||||
if( rc==SQLITE_OK && pCsr->isEof==0 ){
|
||||
@ -5648,7 +5648,6 @@ static int fts3EvalGatherStats(
|
||||
fts3EvalNextRow(pCsr, pRoot, &rc);
|
||||
assert( pRoot->bEof==0 );
|
||||
}while( pRoot->iDocid!=iDocid && rc==SQLITE_OK );
|
||||
fts3EvalTestDeferredAndNear(pCsr, &rc);
|
||||
}
|
||||
}
|
||||
return rc;
|
||||
|
@ -551,6 +551,7 @@ void sqlite3Fts3DoclistPrev(int,char*,int,char**,sqlite3_int64*,int*,u8*);
|
||||
int sqlite3Fts3EvalPhraseStats(Fts3Cursor *, Fts3Expr *, u32 *);
|
||||
int sqlite3Fts3FirstFilter(sqlite3_int64, char *, int, char *);
|
||||
void sqlite3Fts3CreateStatTable(int*, Fts3Table*);
|
||||
int sqlite3Fts3EvalTestDeferred(Fts3Cursor *pCsr, int *pRc);
|
||||
|
||||
/* fts3_tokenizer.c */
|
||||
const char *sqlite3Fts3NextToken(const char *, int *);
|
||||
|
@ -1288,6 +1288,7 @@ static int fts3MatchinfoValues(
|
||||
if( rc!=SQLITE_OK ) break;
|
||||
}
|
||||
rc = fts3ExprIterate(pExpr, fts3ExprGlobalHitsCb,(void*)pInfo);
|
||||
sqlite3Fts3EvalTestDeferred(pCsr, &rc);
|
||||
if( rc!=SQLITE_OK ) break;
|
||||
}
|
||||
(void)fts3ExprIterate(pExpr, fts3ExprLocalHitsCb,(void*)pInfo);
|
||||
|
Reference in New Issue
Block a user