1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-08-07 02:42:48 +03:00

Do not load the root-page of a b-tree table/index when opening a cursor. Instead, allow it to be loaded when the cursor is first used (in function moveToRoot()). Also move the root-page flags sanity checks that were a part of the OP_OpenRead/OpenWrite opcodes into the moveToRoot() function. (CVS 6856)

FossilOrigin-Name: 06dcfe72a6ff3f63639eeb00ec5b5022d10fc55b
This commit is contained in:
danielk1977
2009-07-07 15:47:12 +00:00
parent 75a4012765
commit 172114a02e
4 changed files with 38 additions and 57 deletions

View File

@@ -9,7 +9,7 @@
** May you share freely, never taking more than you give.
**
*************************************************************************
** $Id: btree.c,v 1.655 2009/07/07 11:39:59 drh Exp $
** $Id: btree.c,v 1.656 2009/07/07 15:47:12 danielk1977 Exp $
**
** This file implements a external (disk-based) database using BTrees.
** See the header comment on "btreeInt.h" for additional information.
@@ -3238,15 +3238,10 @@ static int btreeCursor(
return SQLITE_EMPTY;
}
pCur->pgnoRoot = (Pgno)iTable;
rc = getAndInitPage(pBt, pCur->pgnoRoot, &pCur->apPage[0]);
if( rc!=SQLITE_OK ){
assert( pCur->apPage[0]==0 );
return rc;
}
/* Now that no other errors can occur, finish filling in the BtCursor
** variables and link the cursor into the BtShared list. */
pCur->pgnoRoot = (Pgno)iTable;
pCur->iPage = -1;
pCur->pKeyInfo = pKeyInfo;
pCur->pBtree = p;
pCur->pBt = pBt;
@@ -3991,6 +3986,7 @@ static int moveToRoot(BtCursor *pCur){
for(i=1; i<=pCur->iPage; i++){
releasePage(pCur->apPage[i]);
}
pCur->iPage = 0;
}else{
if(
SQLITE_OK!=(rc = getAndInitPage(pBt, pCur->pgnoRoot, &pCur->apPage[0]))
@@ -3998,11 +3994,20 @@ static int moveToRoot(BtCursor *pCur){
pCur->eState = CURSOR_INVALID;
return rc;
}
pCur->iPage = 0;
/* If pCur->pKeyInfo is not NULL, then the caller that opened this cursor
** expected to open it on an index b-tree. Otherwise, if pKeyInfo is
** NULL, the caller expects a table b-tree. If this is not the case,
** return an SQLITE_CORRUPT error. */
assert( pCur->apPage[0]->intKey==1 || pCur->apPage[0]->intKey==0 );
if( (pCur->pKeyInfo==0)!=pCur->apPage[0]->intKey ){
return SQLITE_CORRUPT_BKPT;
}
}
pRoot = pCur->apPage[0];
assert( pRoot->pgno==pCur->pgnoRoot );
pCur->iPage = 0;
pCur->aiIdx[0] = 0;
pCur->info.nSize = 0;
pCur->atLast = 0;