diff options
author | Ilia Alshanetsky <iliaa@php.net> | 2004-01-14 17:08:27 +0000 |
---|---|---|
committer | Ilia Alshanetsky <iliaa@php.net> | 2004-01-14 17:08:27 +0000 |
commit | 6e350b553bedcfe4694a7118d8b44f80266201f4 (patch) | |
tree | 8be4ab1f00c7a24b19cacbd527d83b6ec61aa265 /ext/sqlite/libsqlite/src/where.c | |
parent | 49b698c67ed0f8408c54d0754672e552376b7554 (diff) | |
download | php-git-6e350b553bedcfe4694a7118d8b44f80266201f4.tar.gz |
Upgraded bundled libsqlite to 2.8.11 (fixed critical bug of *NIX systems).
Diffstat (limited to 'ext/sqlite/libsqlite/src/where.c')
-rw-r--r-- | ext/sqlite/libsqlite/src/where.c | 40 |
1 files changed, 27 insertions, 13 deletions
diff --git a/ext/sqlite/libsqlite/src/where.c b/ext/sqlite/libsqlite/src/where.c index 32bc432d35..11358e413c 100644 --- a/ext/sqlite/libsqlite/src/where.c +++ b/ext/sqlite/libsqlite/src/where.c @@ -764,7 +764,7 @@ WhereInfo *sqliteWhereBegin( ){ if( pX->op==TK_EQ ){ sqliteExprCode(pParse, pX->pRight); - /* aExpr[k].p = 0; // See ticket #461 */ + aExpr[k].p = 0; break; } if( pX->op==TK_IN && nColumn==1 ){ @@ -781,7 +781,7 @@ WhereInfo *sqliteWhereBegin( pLevel->inOp = OP_Next; pLevel->inP1 = pX->iTable; } - /* aExpr[k].p = 0; // See ticket #461 */ + aExpr[k].p = 0; break; } } @@ -791,13 +791,16 @@ WhereInfo *sqliteWhereBegin( && aExpr[k].p->pRight->iColumn==pIdx->aiColumn[j] ){ sqliteExprCode(pParse, aExpr[k].p->pLeft); - /* aExpr[k].p = 0; // See ticket #461 */ + aExpr[k].p = 0; break; } } } pLevel->iMem = pParse->nMem++; cont = pLevel->cont = sqliteVdbeMakeLabel(v); + sqliteVdbeAddOp(v, OP_NotNull, -nColumn, sqliteVdbeCurrentAddr(v)+3); + sqliteVdbeAddOp(v, OP_Pop, nColumn, 0); + sqliteVdbeAddOp(v, OP_Goto, 0, brk); sqliteVdbeAddOp(v, OP_MakeKey, nColumn, 0); sqliteAddIdxKeyType(v, pIdx); if( nColumn==pIdx->nColumn || pLevel->bRev ){ @@ -815,16 +818,17 @@ WhereInfo *sqliteWhereBegin( sqliteVdbeAddOp(v, OP_MoveLt, pLevel->iCur, brk); start = sqliteVdbeAddOp(v, OP_MemLoad, pLevel->iMem, 0); sqliteVdbeAddOp(v, OP_IdxLT, pLevel->iCur, brk); - sqliteVdbeAddOp(v, OP_IdxRecno, pLevel->iCur, 0); pLevel->op = OP_Prev; }else{ /* Scan in the forward order */ sqliteVdbeAddOp(v, OP_MoveTo, pLevel->iCur, brk); start = sqliteVdbeAddOp(v, OP_MemLoad, pLevel->iMem, 0); sqliteVdbeAddOp(v, testOp, pLevel->iCur, brk); - sqliteVdbeAddOp(v, OP_IdxRecno, pLevel->iCur, 0); pLevel->op = OP_Next; } + sqliteVdbeAddOp(v, OP_RowKey, pLevel->iCur, 0); + sqliteVdbeAddOp(v, OP_IdxIsNull, nColumn, cont); + sqliteVdbeAddOp(v, OP_IdxRecno, pLevel->iCur, 0); if( i==pTabList->nSrc-1 && pushKey ){ haveKey = 1; }else{ @@ -933,7 +937,7 @@ WhereInfo *sqliteWhereBegin( && aExpr[k].p->pLeft->iColumn==pIdx->aiColumn[j] ){ sqliteExprCode(pParse, aExpr[k].p->pRight); - /* aExpr[k].p = 0; // See ticket #461 */ + aExpr[k].p = 0; break; } if( aExpr[k].idxRight==iCur @@ -942,7 +946,7 @@ WhereInfo *sqliteWhereBegin( && aExpr[k].p->pRight->iColumn==pIdx->aiColumn[j] ){ sqliteExprCode(pParse, aExpr[k].p->pLeft); - /* aExpr[k].p = 0; // See ticket #461 */ + aExpr[k].p = 0; break; } } @@ -979,7 +983,7 @@ WhereInfo *sqliteWhereBegin( ){ sqliteExprCode(pParse, pExpr->pRight); leFlag = pExpr->op==TK_LE; - /* aExpr[k].p = 0; // See ticket #461 */ + aExpr[k].p = 0; break; } if( aExpr[k].idxRight==iCur @@ -989,7 +993,7 @@ WhereInfo *sqliteWhereBegin( ){ sqliteExprCode(pParse, pExpr->pLeft); leFlag = pExpr->op==TK_GE; - /* aExpr[k].p = 0; // See ticket #461 */ + aExpr[k].p = 0; break; } } @@ -999,8 +1003,12 @@ WhereInfo *sqliteWhereBegin( leFlag = 1; } if( testOp!=OP_Noop ){ + int nCol = nEqColumn + (score & 1); pLevel->iMem = pParse->nMem++; - sqliteVdbeAddOp(v, OP_MakeKey, nEqColumn + (score & 1), 0); + sqliteVdbeAddOp(v, OP_NotNull, -nCol, sqliteVdbeCurrentAddr(v)+3); + sqliteVdbeAddOp(v, OP_Pop, nCol, 0); + sqliteVdbeAddOp(v, OP_Goto, 0, brk); + sqliteVdbeAddOp(v, OP_MakeKey, nCol, 0); sqliteAddIdxKeyType(v, pIdx); if( leFlag ){ sqliteVdbeAddOp(v, OP_IncrKey, 0, 0); @@ -1034,7 +1042,7 @@ WhereInfo *sqliteWhereBegin( ){ sqliteExprCode(pParse, pExpr->pRight); geFlag = pExpr->op==TK_GE; - /* aExpr[k].p = 0; // See ticket #461 */ + aExpr[k].p = 0; break; } if( aExpr[k].idxRight==iCur @@ -1044,7 +1052,7 @@ WhereInfo *sqliteWhereBegin( ){ sqliteExprCode(pParse, pExpr->pLeft); geFlag = pExpr->op==TK_LE; - /* aExpr[k].p = 0; // See ticket #461 */ + aExpr[k].p = 0; break; } } @@ -1052,7 +1060,11 @@ WhereInfo *sqliteWhereBegin( geFlag = 1; } if( nEqColumn>0 || (score&2)!=0 ){ - sqliteVdbeAddOp(v, OP_MakeKey, nEqColumn + ((score&2)!=0), 0); + int nCol = nEqColumn + ((score&2)!=0); + sqliteVdbeAddOp(v, OP_NotNull, -nCol, sqliteVdbeCurrentAddr(v)+3); + sqliteVdbeAddOp(v, OP_Pop, nCol, 0); + sqliteVdbeAddOp(v, OP_Goto, 0, brk); + sqliteVdbeAddOp(v, OP_MakeKey, nCol, 0); sqliteAddIdxKeyType(v, pIdx); if( !geFlag ){ sqliteVdbeAddOp(v, OP_IncrKey, 0, 0); @@ -1079,6 +1091,8 @@ WhereInfo *sqliteWhereBegin( sqliteVdbeAddOp(v, OP_MemLoad, pLevel->iMem, 0); sqliteVdbeAddOp(v, testOp, pLevel->iCur, brk); } + sqliteVdbeAddOp(v, OP_RowKey, pLevel->iCur, 0); + sqliteVdbeAddOp(v, OP_IdxIsNull, nEqColumn + (score & 1), cont); sqliteVdbeAddOp(v, OP_IdxRecno, pLevel->iCur, 0); if( i==pTabList->nSrc-1 && pushKey ){ haveKey = 1; |