Make the sqlite3BtreeMoveto routine a no-op if the cursor is already pointing

at the cell we are trying to move to. (CVS 4938)

FossilOrigin-Name: 9b567ab61e7542141b7bc9c3c053c2d1180da92d
This commit is contained in:
drh 2008-03-29 16:01:04 +00:00
parent 907b46ca16
commit a2c20e433b
4 changed files with 46 additions and 12 deletions

View File

@ -1,5 +1,5 @@
C add\stwo\smissing\sinitializer\svalues\s(CVS\s4937)
D 2008-03-29T12:50:33
C Make\sthe\ssqlite3BtreeMoveto\sroutine\sa\sno-op\sif\sthe\scursor\sis\salready\spointing\nat\sthe\scell\swe\sare\strying\sto\smove\sto.\s(CVS\s4938)
D 2008-03-29T16:01:04
F Makefile.arm-wince-mingw32ce-gcc ac5f7b2cef0cd850d6f755ba6ee4ab961b1fadf7
F Makefile.in cf434ce8ca902e69126ae0f94fc9f7dc7428a5fa
F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
@ -86,9 +86,9 @@ F src/attach.c bdc75e759ca25a16f4dc7fbdbc6d37ad2561bb24
F src/auth.c c8b2ab5c8bad4bd90ed7c294694f48269162c627
F src/bitvec.c 49817d442e51e4123585f3cf3c2afc293a3c91e2
F src/btmutex.c 483ced3c52205b04b97df69161fadbf87f4f1ea2
F src/btree.c 6e60d634d236232efbb289b800dd76e72a5ecf9d
F src/btree.c 20d51e14297a249408d9cc4bea433e23a72ef125
F src/btree.h c66cb17c6fffa84a88926dbef173bab4ae692fd4
F src/btreeInt.h d232be68a7ab2a24376dc6332a869e717551b0bd
F src/btreeInt.h 8a2718652ed9413dc6acbb02a5c5a23a35a6e983
F src/build.c 4e6321d112f0ed1070c579677573e4eb76cda1fd
F src/callback.c 77b302b0d41468dcda78c70e706e5b84577f0fa0
F src/complete.c 4cf68fd75d60257524cbe74f87351b9848399131
@ -619,7 +619,7 @@ F www/tclsqlite.tcl 8be95ee6dba05eabcd27a9d91331c803f2ce2130
F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0
F www/version3.tcl 890248cf7b70e60c383b0e84d77d5132b3ead42b
F www/whentouse.tcl fc46eae081251c3c181bd79c5faef8195d7991a5
P d6a34d983e2181f1d1763bd3821a1e63f1e18818
R 205889753b1d77cef56f1f56cb8995e0
U rse
Z a5f43d0478b1df89fabbb68795899e63
P bf28f1c260b3efbec3b031edb97ccb7b4b039947
R d9c5da155dc2408c6037314f48ac3576
U drh
Z c9db9f5c48d0f08888b8f4af1ebe4788

View File

@ -1 +1 @@
bf28f1c260b3efbec3b031edb97ccb7b4b039947
9b567ab61e7542141b7bc9c3c053c2d1180da92d

View File

@ -9,7 +9,7 @@
** May you share freely, never taking more than you give.
**
*************************************************************************
** $Id: btree.c,v 1.447 2008/03/25 17:23:33 drh Exp $
** $Id: btree.c,v 1.448 2008/03/29 16:01:04 drh Exp $
**
** This file implements a external (disk-based) database using BTrees.
** See the header comment on "btreeInt.h" for additional information.
@ -2847,6 +2847,7 @@ void sqlite3BtreeReleaseTempCursor(BtCursor *pCur){
static void getCellInfo(BtCursor *pCur){
if( pCur->info.nSize==0 ){
sqlite3BtreeParseCell(pCur->pPage, pCur->idx, &pCur->info);
pCur->validNKey = 1;
}else{
assertCellInfo(pCur);
}
@ -2856,6 +2857,7 @@ void sqlite3BtreeReleaseTempCursor(BtCursor *pCur){
#define getCellInfo(pCur) \
if( pCur->info.nSize==0 ){ \
sqlite3BtreeParseCell(pCur->pPage, pCur->idx, &pCur->info); \
pCur->validNKey = 1; \
}else{ \
assertCellInfo(pCur); \
}
@ -3349,6 +3351,7 @@ static int moveToChild(BtCursor *pCur, u32 newPgno){
pCur->pPage = pNewPage;
pCur->idx = 0;
pCur->info.nSize = 0;
pCur->validNKey = 0;
if( pNewPage->nCell<1 ){
return SQLITE_CORRUPT_BKPT;
}
@ -3400,6 +3403,7 @@ void sqlite3BtreeMoveToParent(BtCursor *pCur){
releasePage(pPage);
pCur->pPage = pParent;
pCur->info.nSize = 0;
pCur->validNKey = 0;
assert( pParent->idxShift==0 );
pCur->idx = idxParent;
}
@ -3438,6 +3442,8 @@ static int moveToRoot(BtCursor *pCur){
}
pCur->idx = 0;
pCur->info.nSize = 0;
pCur->atLast = 0;
pCur->validNKey = 0;
if( pRoot->nCell==0 && !pRoot->leaf ){
Pgno subpage;
assert( pRoot->pgno==1 );
@ -3497,6 +3503,7 @@ static int moveToRightmost(BtCursor *pCur){
if( rc==SQLITE_OK ){
pCur->idx = pPage->nCell - 1;
pCur->info.nSize = 0;
pCur->validNKey = 0;
}
return SQLITE_OK;
}
@ -3543,6 +3550,8 @@ int sqlite3BtreeLast(BtCursor *pCur, int *pRes){
assert( pCur->eState==CURSOR_VALID );
*pRes = 0;
rc = moveToRightmost(pCur);
getCellInfo(pCur);
pCur->atLast = rc==SQLITE_OK;
}
}
return rc;
@ -3589,6 +3598,21 @@ int sqlite3BtreeMoveto(
assert( cursorHoldsMutex(pCur) );
assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) );
/* If the cursor is already positioned at the point we are trying
** to move to, then just return without doing any work */
if( pCur->eState==CURSOR_VALID && pCur->validNKey && pCur->pPage->intKey ){
if( pCur->info.nKey==nKey ){
*pRes = 0;
return SQLITE_OK;
}
if( pCur->atLast && pCur->info.nKey<nKey ){
*pRes = -1;
return SQLITE_OK;
}
}
rc = moveToRoot(pCur);
if( rc ){
return rc;
@ -3638,6 +3662,7 @@ int sqlite3BtreeMoveto(
void *pCellKey;
i64 nCellKey;
pCur->info.nSize = 0;
pCur->validNKey = 1;
if( pPage->intKey ){
u8 *pCell;
pCell = findCell(pPage, pCur->idx) + pPage->childPtrSize;
@ -3645,7 +3670,7 @@ int sqlite3BtreeMoveto(
u32 dummy;
pCell += getVarint32(pCell, &dummy);
}
getVarint(pCell, (u64 *)&nCellKey);
getVarint(pCell, (u64*)&nCellKey);
if( nCellKey<nKey ){
c = -1;
}else if( nCellKey>nKey ){
@ -3672,6 +3697,7 @@ int sqlite3BtreeMoveto(
}
}
if( c==0 ){
pCur->info.nKey = nCellKey;
if( pPage->leafData && !pPage->leaf ){
lwr = pCur->idx;
upr = lwr - 1;
@ -3688,6 +3714,7 @@ int sqlite3BtreeMoveto(
upr = pCur->idx-1;
}
if( lwr>upr ){
pCur->info.nKey = nCellKey;
break;
}
pCur->idx = (lwr+upr)/2;
@ -3709,6 +3736,7 @@ int sqlite3BtreeMoveto(
}
pCur->idx = lwr;
pCur->info.nSize = 0;
pCur->validNKey = 0;
rc = moveToChild(pCur, chldPg);
if( rc ) goto moveto_finish;
}
@ -3778,6 +3806,7 @@ static int btreeNext(BtCursor *pCur, int *pRes){
pCur->idx++;
pCur->info.nSize = 0;
pCur->validNKey = 0;
if( pCur->idx>=pPage->nCell ){
if( !pPage->leaf ){
rc = moveToChild(pCur, get4byte(&pPage->aData[pPage->hdrOffset+8]));
@ -3834,6 +3863,7 @@ static int btreePrevious(BtCursor *pCur, int *pRes){
if( rc!=SQLITE_OK ){
return rc;
}
pCur->atLast = 0;
if( CURSOR_INVALID==pCur->eState ){
*pRes = 1;
return SQLITE_OK;
@ -3867,6 +3897,7 @@ static int btreePrevious(BtCursor *pCur, int *pRes){
}
pCur->idx--;
pCur->info.nSize = 0;
pCur->validNKey = 0;
if( pPage->leafData && !pPage->leaf ){
rc = sqlite3BtreePrevious(pCur, pRes);
}else{
@ -5673,6 +5704,7 @@ int sqlite3BtreeInsert(
assert( pPage->leaf );
pCur->idx++;
pCur->info.nSize = 0;
pCur->validNKey = 0;
}else{
assert( pPage->leaf );
}

View File

@ -9,7 +9,7 @@
** May you share freely, never taking more than you give.
**
*************************************************************************
** $Id: btreeInt.h,v 1.19 2008/03/25 14:24:57 danielk1977 Exp $
** $Id: btreeInt.h,v 1.20 2008/03/29 16:01:04 drh Exp $
**
** This file implements a external (disk-based) database using BTrees.
** For a detailed discussion of BTrees, refer to
@ -442,6 +442,8 @@ struct BtCursor {
int idx; /* Index of the entry in pPage->aCell[] */
CellInfo info; /* A parse of the cell we are pointing at */
u8 wrFlag; /* True if writable */
u8 atLast; /* Cursor pointing to the last entry */
u8 validNKey; /* True if info.nKey is valid */
u8 eState; /* One of the CURSOR_XXX constants (see below) */
void *pKey; /* Saved key that was cursor's last known position */
i64 nKey; /* Size of pKey, or last integer key */