diff options
author | danielk1977 <danielk1977@noemail.net> | 2004-05-17 10:48:57 +0000 |
---|---|---|
committer | danielk1977 <danielk1977@noemail.net> | 2004-05-17 10:48:57 +0000 |
commit | e014a83880e3064cbc202de5ff92a4059faa274c (patch) | |
tree | 97d34760fc860b91ffc1a174b4b7b65b34b0d049 /src/where.c | |
parent | 93edea938088fc2cab91224d76191bd912fb53b3 (diff) | |
download | sqlite-e014a83880e3064cbc202de5ff92a4059faa274c.tar.gz sqlite-e014a83880e3064cbc202de5ff92a4059faa274c.zip |
More changes to support the new types model. Compound SELECTs are currently
broken. (CVS 1389)
FossilOrigin-Name: 0f6c9b05e688e281fa168aacdd867db408df2863
Diffstat (limited to 'src/where.c')
-rw-r--r-- | src/where.c | 54 |
1 files changed, 25 insertions, 29 deletions
diff --git a/src/where.c b/src/where.c index aa3f3283b..e65362e82 100644 --- a/src/where.c +++ b/src/where.c @@ -12,7 +12,7 @@ ** This module contains C code that generates VDBE code used to process ** the WHERE clause of SQL statements. ** -** $Id: where.c,v 1.94 2004/05/16 11:15:41 danielk1977 Exp $ +** $Id: where.c,v 1.95 2004/05/17 10:48:58 danielk1977 Exp $ */ #include "sqliteInt.h" @@ -536,8 +536,10 @@ WhereInfo *sqlite3WhereBegin( && (aExpr[j].prereqRight & loopMask)==aExpr[j].prereqRight ){ int iColumn = aExpr[j].p->pLeft->iColumn; int k; + char idxaff = pIdx->pTable->aCol[iColumn].affinity; for(k=0; k<pIdx->nColumn; k++){ - if( pIdx->aiColumn[k]==iColumn ){ + if( pIdx->aiColumn[k]==iColumn + && sqlite3IndexAffinityOk(aExpr[j].p, idxaff) ){ switch( aExpr[j].p->op ){ case TK_IN: { if( k==0 ) inMask |= 1; @@ -571,8 +573,10 @@ WhereInfo *sqlite3WhereBegin( && (aExpr[j].prereqLeft & loopMask)==aExpr[j].prereqLeft ){ int iColumn = aExpr[j].p->pRight->iColumn; int k; + char idxaff = pIdx->pTable->aCol[iColumn].affinity; for(k=0; k<pIdx->nColumn; k++){ - if( pIdx->aiColumn[k]==iColumn ){ + if( pIdx->aiColumn[k]==iColumn + && sqlite3IndexAffinityOk(aExpr[j].p, idxaff) ){ switch( aExpr[j].p->op ){ case TK_EQ: { eqMask |= 1<<k; @@ -720,16 +724,10 @@ WhereInfo *sqlite3WhereBegin( Expr *pX = aExpr[k].p; if( pX->op!=TK_IN ){ sqlite3ExprCode(pParse, aExpr[k].p->pRight); - }else if( pX->pList ){ - sqlite3VdbeAddOp(v, OP_SetFirst, pX->iTable, brk); - pLevel->inOp = OP_SetNext; - pLevel->inP1 = pX->iTable; - pLevel->inP2 = sqlite3VdbeCurrentAddr(v); }else{ - assert( pX->pSelect ); sqlite3VdbeAddOp(v, OP_Rewind, pX->iTable, brk); sqlite3VdbeAddOp(v, OP_KeyAsData, pX->iTable, 1); - pLevel->inP2 = sqlite3VdbeAddOp(v, OP_FullKey, pX->iTable, 0); + pLevel->inP2 = sqlite3VdbeAddOp(v, OP_IdxColumn, pX->iTable, 0); pLevel->inOp = OP_Next; pLevel->inP1 = pX->iTable; } @@ -758,27 +756,22 @@ WhereInfo *sqlite3WhereBegin( && (aExpr[k].prereqRight & loopMask)==aExpr[k].prereqRight && pX->pLeft->iColumn==pIdx->aiColumn[j] ){ - if( pX->op==TK_EQ ){ - sqlite3ExprCode(pParse, pX->pRight); - aExpr[k].p = 0; - break; - } - if( pX->op==TK_IN && nColumn==1 ){ - if( pX->pList ){ - sqlite3VdbeAddOp(v, OP_SetFirst, pX->iTable, brk); - pLevel->inOp = OP_SetNext; - pLevel->inP1 = pX->iTable; - pLevel->inP2 = sqlite3VdbeCurrentAddr(v); - }else{ - assert( pX->pSelect ); + char idxaff = pIdx->pTable->aCol[pX->pLeft->iColumn].affinity; + if( sqlite3IndexAffinityOk(aExpr[k].p, idxaff) ){ + if( pX->op==TK_EQ ){ + sqlite3ExprCode(pParse, pX->pRight); + aExpr[k].p = 0; + break; + } + if( pX->op==TK_IN && nColumn==1 ){ sqlite3VdbeAddOp(v, OP_Rewind, pX->iTable, brk); sqlite3VdbeAddOp(v, OP_KeyAsData, pX->iTable, 1); - pLevel->inP2 = sqlite3VdbeAddOp(v, OP_FullKey, pX->iTable, 0); + pLevel->inP2 = sqlite3VdbeAddOp(v, OP_IdxColumn, pX->iTable, 0); pLevel->inOp = OP_Next; pLevel->inP1 = pX->iTable; + aExpr[k].p = 0; + break; } - aExpr[k].p = 0; - break; } } if( aExpr[k].idxRight==iCur @@ -786,9 +779,12 @@ WhereInfo *sqlite3WhereBegin( && (aExpr[k].prereqLeft & loopMask)==aExpr[k].prereqLeft && aExpr[k].p->pRight->iColumn==pIdx->aiColumn[j] ){ - sqlite3ExprCode(pParse, aExpr[k].p->pLeft); - aExpr[k].p = 0; - break; + char idxaff = pIdx->pTable->aCol[pX->pRight->iColumn].affinity; + if( sqlite3IndexAffinityOk(aExpr[k].p, idxaff) ){ + sqlite3ExprCode(pParse, aExpr[k].p->pLeft); + aExpr[k].p = 0; + break; + } } } } |