1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-11-18 10:21:03 +03:00

Fix problems with reverse order sorting and indexes in the LIKE optimization.

FossilOrigin-Name: 564b8fe79475d7584a21078e6098840b8ce6a6e1
This commit is contained in:
drh
2015-03-07 02:51:59 +00:00
parent 16897072b5
commit b7c60ba668
4 changed files with 48 additions and 12 deletions

View File

@@ -3370,7 +3370,11 @@ static Bitmask codeOneLoopStart(
&& (pRangeEnd->wtFlags & TERM_LIKEOPT)!=0
){
pLevel->iLikeRepCntr = ++pParse->nMem;
sqlite3VdbeAddOp2(v, OP_Integer, 0, pLevel->iLikeRepCntr);
testcase( bRev );
testcase( pIdx->aSortOrder[nEq]==SQLITE_SO_DESC );
sqlite3VdbeAddOp2(v, OP_Integer,
bRev ^ (pIdx->aSortOrder[nEq]==SQLITE_SO_DESC),
pLevel->iLikeRepCntr);
VdbeComment((v, "LIKE loop counter"));
pLevel->addrLikeRep = sqlite3VdbeCurrentAddr(v);
}
@@ -3401,9 +3405,11 @@ static Bitmask codeOneLoopStart(
){
SWAP(WhereTerm *, pRangeEnd, pRangeStart);
SWAP(u8, bSeekPastNull, bStopAtNull);
#if 0
if( pLevel->addrLikeRep ){
sqlite3VdbeChangeP1(v, pLevel->addrLikeRep-1, 1);
}
#endif
}
testcase( pRangeStart && (pRangeStart->eOperator & WO_LE)!=0 );
@@ -6682,9 +6688,13 @@ void sqlite3WhereEnd(WhereInfo *pWInfo){
sqlite3VdbeJumpHere(v, pLevel->addrSkip-2);
}
if( pLevel->addrLikeRep ){
sqlite3VdbeAddOp2(v,
pLevel->op==OP_Prev ? OP_DecrJumpZero : OP_JumpZeroIncr,
pLevel->iLikeRepCntr, pLevel->addrLikeRep);
int op;
if( sqlite3VdbeGetOp(v, pLevel->addrLikeRep-1)->p1 ){
op = OP_DecrJumpZero;
}else{
op = OP_JumpZeroIncr;
}
sqlite3VdbeAddOp2(v, op, pLevel->iLikeRepCntr, pLevel->addrLikeRep);
VdbeCoverage(v);
}
if( pLevel->iLeftJoin ){