-C Improved\sdetection\sof\sunnecessary\sORDER\sBY\sclauses.
-D 2013-05-31T12:43:55.143
+C Futher\senhancements\sto\sthe\sORDER\sBY\soptimizer.
+D 2013-05-31T13:36:32.993
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
F Makefile.in 5e41da95d92656a5004b03d3576e8b226858a28e
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
F src/wal.c 436bfceb141b9423c45119e68e444358ee0ed35d
F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4
F src/walker.c 4fa43583d0a84b48f93b1e88f11adf2065be4e73
-F src/where.c 0e1c41804f89dbfd48fbe8dfa68adc6b6d682a75
+F src/where.c 8e9922815b07290982cfc826497d128115ce358c
F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2
F test/aggnested.test 45c0201e28045ad38a530b5a144b73cd4aa2cfd6
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381
F tool/win/sqlite.vsix 97894c2790eda7b5bce3cc79cb2a8ec2fde9b3ac
-P 5e1e61399513b4a95fd93df2377a2603f1670063
-R 17288f799b200fcc6199a08359305634
+P 58805eb36b9975706e2c4e382689519454e9a504
+R d753e9381f16048231d3d54f23e54ee3
U drh
-Z 9542ccfa5fa5ec11248b1f41f8b389ee
+Z 2bef9deff008e88de89f5b60b513bb1c
WhereInfo *pWInfo, /* The WHERE clause */
WherePath *pPath, /* The WherePath to check */
int nLoop, /* Number of entries in pPath->aLoop[] */
+ int isLastLoop, /* True for the very last loop */
WhereLoop *pLast, /* Add this WhereLoop to the end of pPath->aLoop[] */
Bitmask *pRevMask /* Mask of WhereLoops to run in reverse order */
){
/* Sorting is always required if any term of the ORDER BY is not a
** column reference */
nOrderBy = pOrderBy->nExpr;
+#if 0
for(i=0; i<nOrderBy; i++){
pOBExpr = sqlite3ExprSkipCollate(pOrderBy->a[i].pExpr);
if( pOBExpr->op!=TK_COLUMN ) return 0;
}
+#endif
for(i=0; i<=nLoop && nUsed<nOrderBy; i++){
pLoop = i<nLoop ? pPath->aLoop[i] : pLast;
for(j=0; j<=nColumn && nUsed<nOrderBy; j++, nUsed++){
int skipable;
pOBExpr = sqlite3ExprSkipCollate(pOrderBy->a[nUsed].pExpr);
- assert( pOBExpr->op==TK_COLUMN );
+ if( pOBExpr->op!=TK_COLUMN ) return 0;
if( pOBExpr->iTable!=iCur ) break;
if( isOneRow ){ j--; continue; }
if( j<nColumn ){
revSet = 1;
}
}
- if( j>=nColumn-1 && isUniqueIdx ){ j--; isOneRow = 1; }
+ if( j>=nColumn-1 && isUniqueIdx ){
+ if( isLastLoop && i==nLoop ) break;
+ j--;
+ isOneRow = 1;
+ }
}
if( rev ) revMask |= ((Bitmask)1)<<i;
}
- if( nUsed==nOrderBy ){
+ if( isLastLoop || nUsed==nOrderBy ){
*pRevMask = revMask;
return 1;
}
rCost = pWLoop->rSetup + pWLoop->rRun*pFrom->nRow + pFrom->rCost;
maskNew = pFrom->maskLoop | pWLoop->maskSelf;
if( !isOrderedValid ){
- switch( wherePathSatisfiesOrderBy(pWInfo, pFrom, iLoop,
+ switch( wherePathSatisfiesOrderBy(pWInfo, pFrom, iLoop, iLoop==nLoop-1,
pWLoop, &revMask) ){
case 1: /* Yes. pFrom+pWLoop does satisfy the ORDER BY clause */
isOrdered = 1;