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

Improvements to the ORDER BY suppressor in the NGQP.

FossilOrigin-Name: 24a2e9ddcecd3926817d77abbb75d068ee7140ad
This commit is contained in:
drh
2013-05-30 23:21:20 +00:00
parent 1b0f026dbb
commit dc3cd4b020
3 changed files with 20 additions and 14 deletions

View File

@@ -4588,6 +4588,7 @@ static int wherePathSatisfiesOrderBy(
j = 0;
revSet = rev = 0;
for(j=0; j<=nColumn && nUsed<nOrderBy; j++, nUsed++){
int skipable;
pOBExpr = sqlite3ExprSkipCollate(pOrderBy->a[nUsed].pExpr);
assert( pOBExpr->op==TK_COLUMN );
if( pOBExpr->iTable!=iCur ) break;
@@ -4602,20 +4603,25 @@ static int wherePathSatisfiesOrderBy(
iColumn = -1;
revIdx = 0;
}
skipable = j<pLoop->u.btree.nEq && pLoop->aTerm[j]->eOperator!=WO_IN;
if( pOBExpr->iColumn!=iColumn ){
if( j<pLoop->u.btree.nEq ){ nUsed--; continue; }
if( skipable ){ nUsed--; continue; }
return 0;
}
if( iColumn>=0 ){
pColl = sqlite3ExprCollSeq(pWInfo->pParse, pOrderBy->a[nUsed].pExpr);
if( !pColl ) pColl = db->pDfltColl;
if( sqlite3StrICmp(pColl->zName, pIndex->azColl[j])!=0 ) return 0;
if( sqlite3StrICmp(pColl->zName, pIndex->azColl[j])!=0 ){
return 0;
}
}
if( revSet ){
if( (rev ^ revIdx)!=pOrderBy->a[nUsed].sortOrder ) return 0;
}else{
rev = revIdx ^ pOrderBy->a[nUsed].sortOrder;
revSet = 1;
if( !skipable ){
if( revSet ){
if( (rev ^ revIdx)!=pOrderBy->a[nUsed].sortOrder ) return 0;
}else{
rev = revIdx ^ pOrderBy->a[nUsed].sortOrder;
revSet = 1;
}
}
}
if( rev ) revMask |= ((Bitmask)1)<<i;