Index: src/where.c ================================================================== --- src/where.c +++ src/where.c @@ -708,19 +708,10 @@ while( pScan->iEquiv<=pScan->nEquiv ){ iCur = pScan->aEquiv[pScan->iEquiv-2]; iColumn = pScan->aEquiv[pScan->iEquiv-1]; while( (pWC = pScan->pWC)!=0 ){ for(pTerm=pWC->a+pScan->k; pScan->knTerm; pScan->k++, pTerm++){ - if( pTerm->iParent>=0 ){ - WhereTerm *pParent = &pWC->a[pTerm->iParent]; - int j; - for(j=pScan->iEquiv-4; j>=0; j-=2 ){ - if( pParent->leftCursor==pScan->aEquiv[j] - && pParent->u.leftColumn==pScan->aEquiv[j+1] ) break; - } - if( j>=0 ) continue; - } if( pTerm->leftCursor==iCur && pTerm->u.leftColumn==iColumn ){ if( (pTerm->eOperator & WO_EQUIV)!=0 && pScan->nEquivaEquiv) ){ int j; @@ -751,10 +742,17 @@ pX->pLeft, pX->pRight); if( pColl==0 ) pColl = pWC->pParse->db->pDfltColl; if( sqlite3StrICmp(pColl->zName, pScan->zCollName) ){ continue; } + } + if( (pTerm->eOperator & WO_EQ)!=0 + && (pX = pTerm->pExpr->pRight)->op==TK_COLUMN + && pX->iTable==pScan->aEquiv[0] + && pX->iColumn==pScan->aEquiv[1] + ){ + continue; } pScan->pCurrent = pTerm; pScan->k++; return pTerm; } @@ -5056,17 +5054,18 @@ */ static void whereLoopPrint(WhereLoop *p, SrcList *pTabList){ int nb = 2*((pTabList->nSrc+15)/16); struct SrcList_item *pItem = pTabList->a + p->iTab; Table *pTab = pItem->pTab; - sqlite3DebugPrintf("%02d.%0*llx", p->iTab, nb, p->prereq); - sqlite3DebugPrintf(" %6s", + sqlite3DebugPrintf("%2d.%0*llx.%0*llx", + p->iTab, nb, p->maskSelf, nb, p->prereq); + sqlite3DebugPrintf(" %8s", pItem->zAlias ? pItem->zAlias : pTab->zName); if( p->pIndex ){ - sqlite3DebugPrintf(".%-8s %2d", p->pIndex->zName, p->nEq); + sqlite3DebugPrintf(".%-12s %2d", p->pIndex->zName, p->nEq); }else{ - sqlite3DebugPrintf("%12s",""); + sqlite3DebugPrintf("%16s",""); } sqlite3DebugPrintf(" fg %08x OB %d,%d N %2d", p->wsFlags, p->iOb, p->nOb, p->nTerm); sqlite3DebugPrintf(" cost %.4g,%.4g,%.4g\n", p->prereq, p->rSetup, p->rRun, p->nOut); @@ -5280,11 +5279,11 @@ WhereLoop *pNew; /* Template WhereLoop object */ pNew = pBuilder->pNew; db = pBuilder->db; pSrc = pBuilder->pTabList->a + iTab; - pNew->maskSelf = getMask(pBuilder->pWC->pMaskSet, iTab); + pNew->maskSelf = getMask(pBuilder->pWC->pMaskSet, pSrc->iCursor); if( pSrc->pIndex ){ /* An INDEXED BY clause specifies a particular index to use */ pProbe = pSrc->pIndex; }else{ @@ -5458,11 +5457,11 @@ if( jj>=nTo ){ if( nTo>=mxChoice && rCost>=mxCost ) continue; if( nTo=mxCost; jj++){ assert(jj>0); } + for(jj=nTo-1; aTo[jj].rCost>=mxCost; jj--){ assert(jj>0); } } pTo = &aTo[jj]; }else{ if( pTo->rCost<=rCost ) continue; }