-C Fix\sfor\sticket\s#78:\sAvoid\san\sassertion\sfailure\swhen\ssqlite_close()\sto\sbe\ncalled\sin\sthe\smiddle\sof\sa\stransaction.\s(CVS\s634)
-D 2002-06-21T11:55:49
+C Fix\sfor\sticket\s#76:\sFix\sa\sdatabase\scorruption\sthat\smight\soccur\swhen\ndropping\stables\sor\sindices.\s(CVS\s635)
+D 2002-06-21T13:09:17
F Makefile.in 6291a33b87d2a395aafd7646ee1ed562c6f2c28c
F Makefile.template 4e11752e0b5c7a043ca50af4296ec562857ba495
F README a4c0ba11354ef6ba0776b400d057c59da47a4cc0
F spec.template 238f7db425a78dc1bb7682e56e3834c7270a3f5e
F sqlite.1 83f4a9d37bdf2b7ef079a82d54eaf2e3509ee6ea
F src/TODO af7f3cab0228e34149cf98e073aa83d45878e7e6
-F src/btree.c 8b86be8f234c1c5dab3186f69cee2544ec9d7257
+F src/btree.c 6aaa67d7eab70c2531dc13e5d9eb87e626c0b4d7
F src/btree.h 8abeabfe6e0b1a990b64fa457592a6482f6674f3
F src/build.c 95eac6ce4ae2871388d49066c78dd0657ce40a1f
F src/delete.c 44c45460b1e03033756e35adc6d569ffbf30b725
F www/sqlite.tcl 8b5884354cb615049aed83039f8dfe1552a44279
F www/tclsqlite.tcl 1db15abeb446aad0caf0b95b8b9579720e4ea331
F www/vdbe.tcl 2013852c27a02a091d39a766bc87cff329f21218
-P d28a2ecc91c0a6d64725887dcf2758f69553eb59
-R 7c501d6833981a37701d9630a4f2a397
+P 2532792a5875f9cc0f7d8eaf90dd49d1f6025ca3
+R 3fe0ffaffb77713981828251190bdd81
U drh
-Z 04318c7b992ec9784c65132ba98bdc91
+Z 08d058b9c9d8b8b2fa6e6514672f1243
** May you share freely, never taking more than you give.
**
*************************************************************************
-** $Id: btree.c,v 1.62 2002/06/06 23:16:05 drh Exp $
+** $Id: btree.c,v 1.63 2002/06/21 13:09:17 drh Exp $
**
** This file implements a external (disk-based) database using BTrees.
** For a detailed discussion of BTrees, refer to
char newPage[SQLITE_PAGE_SIZE];
assert( sqlitepager_iswriteable(pPage) );
+ assert( pPage->isInit );
pc = sizeof(PageHdr);
pPage->u.hdr.firstCell = pc;
memcpy(newPage, pPage->u.aDisk, pc);
assert( sqlitepager_iswriteable(pPage) );
assert( nByte==ROUNDUP(nByte) );
+ assert( pPage->isInit );
if( pPage->nFree<nByte || pPage->isOverfull ) return 0;
pIdx = &pPage->u.hdr.firstFree;
p = (FreeBlk*)&pPage->u.aDisk[*pIdx];
assert( sqlitepager_iswriteable(pPage) );
assert( size == ROUNDUP(size) );
assert( start == ROUNDUP(start) );
+ assert( pPage->isInit );
pIdx = &pPage->u.hdr.firstFree;
idx = *pIdx;
while( idx!=0 && idx<start ){
if( pCur->pPage==0 ) return SQLITE_ABORT;
rc = moveToRoot(pCur);
if( rc ) return rc;
+ assert( pCur->pPage->isInit );
if( pCur->pPage->nCell==0 ){
*pRes = 1;
return SQLITE_OK;
}
}
assert( lwr==upr+1 );
+ assert( pPage->isInit );
if( lwr>=pPage->nCell ){
chldPg = pPage->u.hdr.rightChild;
}else{
if( pRes ) *pRes = 1;
return SQLITE_ABORT;
}
+ assert( pCur->pPage->isInit );
if( pCur->bSkipNext && pCur->idx<pCur->pPage->nCell ){
pCur->bSkipNext = 0;
if( pRes ) *pRes = 0;
if( pParent==0 ){
Pgno pgnoChild;
MemPage *pChild;
+ assert( pPage->isInit );
if( pPage->nCell==0 ){
if( pPage->u.hdr.rightChild ){
/*
}
rc = sqlitepager_write(pParent);
if( rc ) return rc;
+ assert( pParent->isInit );
/*
** Find the Cell in the parent page whose h.leftChild points back
rc = sqliteBtreeMoveto(pCur, pKey, nKey, &loc);
if( rc ) return rc;
pPage = pCur->pPage;
+ assert( pPage->isInit );
rc = sqlitepager_write(pPage);
if( rc ) return rc;
rc = fillInCell(pBt, &newCell, pKey, nKey, pData, nData);
int rc;
Pgno pgnoChild;
+ assert( pPage->isInit );
if( pCur->pPage==0 ){
return SQLITE_ABORT; /* A rollback destroyed this cursor */
}
if( rc ) return rc;
rc = sqlitepager_write(pPage);
if( rc ) return rc;
+ rc = initPage(pPage, pgno, 0);
+ if( rc ) return rc;
idx = pPage->u.hdr.firstCell;
while( idx>0 ){
pCell = (Cell*)&pPage->u.aDisk[idx];