*/
static int fts5ExprNearNextRowidMatch(
Fts5Expr *pExpr, /* Expression pPhrase belongs to */
- Fts5ExprNode *pNode
+ Fts5ExprNode *pNode,
+ int bFromValid,
+ i64 iFrom
){
Fts5ExprNearset *pNear = pNode->pNear;
int rc = SQLITE_OK;
** minimum rowid. Or, if the iterator is "ORDER BY rowid ASC", then it
** means the maximum rowid. */
iLast = sqlite3Fts5IterRowid(pNear->apPhrase[0]->aTerm[0].pIter);
+ if( bFromValid && (iFrom>iLast)==(pExpr->bAsc!=0) ){
+ iLast = iFrom;
+ }
do {
bMatch = 1;
*/
static int fts5ExprNearNextMatch(
Fts5Expr *pExpr, /* Expression that pNear is a part of */
- Fts5ExprNode *pNode
+ Fts5ExprNode *pNode,
+ int bFromValid,
+ i64 iFrom
){
int rc = SQLITE_OK;
Fts5ExprNearset *pNear = pNode->pNear;
int i;
/* Advance the iterators until they all point to the same rowid */
- rc = fts5ExprNearNextRowidMatch(pExpr, pNode);
+ rc = fts5ExprNearNextRowidMatch(pExpr, pNode, bFromValid, iFrom);
if( pNode->bEof || rc!=SQLITE_OK ) break;
for(i=0; i<pNear->nPhrase; i++){
}
/* fts5ExprNodeNext() calls fts5ExprNodeNextMatch(). And vice-versa. */
-static int fts5ExprNodeNextMatch(Fts5Expr*, Fts5ExprNode*);
+static int fts5ExprNodeNextMatch(Fts5Expr*, Fts5ExprNode*, int, i64);
/*
** Compare the values currently indicated by the two nodes as follows:
}
}
-static int fts5ExprNodeNext(Fts5Expr *pExpr, Fts5ExprNode *pNode){
+/*
+** Advance node iterator pNode, part of expression pExpr. If argument
+** bFromValid is zero, then pNode is advanced exactly once. Or, if argument
+** bFromValid is non-zero, then pNode is advanced until it is at or past
+** rowid value iFrom. Whether "past" means "less than" or "greater than"
+** depends on whether this is an ASC or DESC iterator.
+*/
+static int fts5ExprNodeNext(
+ Fts5Expr *pExpr,
+ Fts5ExprNode *pNode,
+ int bFromValid,
+ i64 iFrom
+){
int rc = SQLITE_OK;
if( pNode->bEof==0 ){
};
case FTS5_AND: {
- rc = fts5ExprNodeNext(pExpr, pNode->pLeft);
- if( rc==SQLITE_OK ) rc = fts5ExprNodeNext(pExpr, pNode->pRight);
+ rc = fts5ExprNodeNext(pExpr, pNode->pLeft, bFromValid, iFrom);
+ if( rc==SQLITE_OK ){
+ /* todo: update (iFrom/bFromValid) here */
+ rc = fts5ExprNodeNext(pExpr, pNode->pRight, bFromValid, iFrom);
+ }
break;
}
int cmp = fts5NodeCompare(pExpr, p1, p2);
if( cmp==0 ){
- rc = fts5ExprNodeNext(pExpr, p1);
- if( rc==SQLITE_OK ) rc = fts5ExprNodeNext(pExpr, p2);
+ rc = fts5ExprNodeNext(pExpr, p1, bFromValid, iFrom);
+ if( rc==SQLITE_OK ){
+ rc = fts5ExprNodeNext(pExpr, p2, bFromValid, iFrom);
+ }
}else{
- rc = fts5ExprNodeNext(pExpr, (cmp < 0) ? p1 : p2);
+ rc = fts5ExprNodeNext(pExpr, (cmp < 0) ? p1 : p2, bFromValid, iFrom);
}
break;
}
default: assert( pNode->eType==FTS5_NOT ); {
- rc = fts5ExprNodeNext(pExpr, pNode->pLeft);
+ rc = fts5ExprNodeNext(pExpr, pNode->pLeft, bFromValid, iFrom);
break;
}
}
if( rc==SQLITE_OK ){
- rc = fts5ExprNodeNextMatch(pExpr, pNode);
+ rc = fts5ExprNodeNextMatch(pExpr, pNode, bFromValid, iFrom);
}
}
/*
**
*/
-static int fts5ExprNodeNextMatch(Fts5Expr *pExpr, Fts5ExprNode *pNode){
+static int fts5ExprNodeNextMatch(
+ Fts5Expr *pExpr,
+ Fts5ExprNode *pNode,
+ int bFromValid,
+ i64 iFrom
+){
int rc = SQLITE_OK;
if( pNode->bEof==0 ){
switch( pNode->eType ){
case FTS5_STRING: {
- rc = fts5ExprNearNextMatch(pExpr, pNode);
+ rc = fts5ExprNearNextMatch(pExpr, pNode, bFromValid, iFrom);
break;
}
Fts5ExprNode *p1 = pNode->pLeft;
Fts5ExprNode *p2 = pNode->pRight;
+
while( p1->bEof==0 && p2->bEof==0 && p2->iRowid!=p1->iRowid ){
Fts5ExprNode *pAdv;
- if( pExpr->bAsc ){
- pAdv = (p1->iRowid < p2->iRowid) ? p1 : p2;
+ assert( pExpr->bAsc==0 || pExpr->bAsc==1 );
+ if( pExpr->bAsc==(p1->iRowid < p2->iRowid) ){
+ pAdv = p1;
+ if( bFromValid==0 || pExpr->bAsc==(p2->iRowid > iFrom) ){
+ iFrom = p2->iRowid;
+ }
}else{
- pAdv = (p1->iRowid > p2->iRowid) ? p1 : p2;
+ pAdv = p2;
+ if( bFromValid==0 || pExpr->bAsc==(p1->iRowid > iFrom) ){
+ iFrom = p1->iRowid;
+ }
}
- rc = fts5ExprNodeNext(pExpr, pAdv);
+ rc = fts5ExprNodeNext(pExpr, pAdv, 1, iFrom);
if( rc!=SQLITE_OK ) break;
}
if( p1->bEof || p2->bEof ){
while( rc==SQLITE_OK ){
int cmp;
while( rc==SQLITE_OK && (cmp = fts5NodeCompare(pExpr, p1, p2))>0 ){
- rc = fts5ExprNodeNext(pExpr, p2);
+ rc = fts5ExprNodeNext(pExpr, p2, bFromValid, iFrom);
}
if( rc || cmp ) break;
- rc = fts5ExprNodeNext(pExpr, p1);
+ rc = fts5ExprNodeNext(pExpr, p1, bFromValid, iFrom);
}
pNode->bEof = p1->bEof;
pNode->iRowid = p1->iRowid;
/* Attempt to advance to the first match */
if( rc==SQLITE_OK && pNode->bEof==0 ){
- rc = fts5ExprNearNextMatch(pExpr, pNode);
+ rc = fts5ExprNearNextMatch(pExpr, pNode, 0, 0);
}
}else{
rc = fts5ExprNodeFirst(pExpr, pNode->pRight);
}
if( rc==SQLITE_OK ){
- rc = fts5ExprNodeNextMatch(pExpr, pNode);
+ rc = fts5ExprNodeNextMatch(pExpr, pNode, 0, 0);
}
}
return rc;
*/
int sqlite3Fts5ExprNext(Fts5Expr *p){
int rc;
- rc = fts5ExprNodeNext(p, p->pRoot);
+ rc = fts5ExprNodeNext(p, p->pRoot, 0, 0);
return rc;
}
-C Use\sdoclist-indexes\swith\s"ORDER\sBY\srowid\sASC"\sfts5\squeries\sas\swell.
-D 2014-08-05T19:00:22.438
+C Use\sdoclist\sindexes\sfor\sAND\squeries\sas\swell\sas\sphrases.
+D 2014-08-05T19:35:20.490
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
F Makefile.in b03432313a3aad96c706f8164fb9f5307eaf19f5
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
F ext/fts5/fts5_aux.c 366057c7186bc3615deb5ecc0ff61de50b6d2dbc
F ext/fts5/fts5_buffer.c 248c61ac9fec001602efc72a45704f3b8d367c00
F ext/fts5/fts5_config.c f4ebf143e141b8c77355e3b15aba81b7be51d710
-F ext/fts5/fts5_expr.c 9402474456732ddb5019f83a77907852f108a96a
+F ext/fts5/fts5_expr.c 7b8e380233176053841904a86006696ee8f6cd24
F ext/fts5/fts5_index.c 40d9086948d6f1420a078bd9fb0b5372e54ec791
F ext/fts5/fts5_storage.c 2866e7e1de9dc851756c3a9c76b6e1d75e0facb7
F ext/fts5/fts5parse.y 777da8e5819f75c217982c79c29d014c293acac9
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 90b82d3ef613b2915e0e280dc1d2e5a2b617d59c
-R 0266e2e08ce753d75d582fc91e12512e
+P d028ba6589f3122b635474c2683c0f93d5bc6c7c
+R df749c2987e3f7fa39a4c1c54f5a22e6
U dan
-Z 1a32a19af984c36e1b27a239a8950f8a
+Z 78f1e7641fc2b68987e4a3c99853c1c0