Annotation of embedaddon/sqlite3/src/btree.c, revision 1.1
1.1 ! misho 1: /*
! 2: ** 2004 April 6
! 3: **
! 4: ** The author disclaims copyright to this source code. In place of
! 5: ** a legal notice, here is a blessing:
! 6: **
! 7: ** May you do good and not evil.
! 8: ** May you find forgiveness for yourself and forgive others.
! 9: ** May you share freely, never taking more than you give.
! 10: **
! 11: *************************************************************************
! 12: ** This file implements a external (disk-based) database using BTrees.
! 13: ** See the header comment on "btreeInt.h" for additional information.
! 14: ** Including a description of file format and an overview of operation.
! 15: */
! 16: #include "btreeInt.h"
! 17:
! 18: /*
! 19: ** The header string that appears at the beginning of every
! 20: ** SQLite database.
! 21: */
! 22: static const char zMagicHeader[] = SQLITE_FILE_HEADER;
! 23:
! 24: /*
! 25: ** Set this global variable to 1 to enable tracing using the TRACE
! 26: ** macro.
! 27: */
! 28: #if 0
! 29: int sqlite3BtreeTrace=1; /* True to enable tracing */
! 30: # define TRACE(X) if(sqlite3BtreeTrace){printf X;fflush(stdout);}
! 31: #else
! 32: # define TRACE(X)
! 33: #endif
! 34:
! 35: /*
! 36: ** Extract a 2-byte big-endian integer from an array of unsigned bytes.
! 37: ** But if the value is zero, make it 65536.
! 38: **
! 39: ** This routine is used to extract the "offset to cell content area" value
! 40: ** from the header of a btree page. If the page size is 65536 and the page
! 41: ** is empty, the offset should be 65536, but the 2-byte value stores zero.
! 42: ** This routine makes the necessary adjustment to 65536.
! 43: */
! 44: #define get2byteNotZero(X) (((((int)get2byte(X))-1)&0xffff)+1)
! 45:
! 46: #ifndef SQLITE_OMIT_SHARED_CACHE
! 47: /*
! 48: ** A list of BtShared objects that are eligible for participation
! 49: ** in shared cache. This variable has file scope during normal builds,
! 50: ** but the test harness needs to access it so we make it global for
! 51: ** test builds.
! 52: **
! 53: ** Access to this variable is protected by SQLITE_MUTEX_STATIC_MASTER.
! 54: */
! 55: #ifdef SQLITE_TEST
! 56: BtShared *SQLITE_WSD sqlite3SharedCacheList = 0;
! 57: #else
! 58: static BtShared *SQLITE_WSD sqlite3SharedCacheList = 0;
! 59: #endif
! 60: #endif /* SQLITE_OMIT_SHARED_CACHE */
! 61:
! 62: #ifndef SQLITE_OMIT_SHARED_CACHE
! 63: /*
! 64: ** Enable or disable the shared pager and schema features.
! 65: **
! 66: ** This routine has no effect on existing database connections.
! 67: ** The shared cache setting effects only future calls to
! 68: ** sqlite3_open(), sqlite3_open16(), or sqlite3_open_v2().
! 69: */
! 70: int sqlite3_enable_shared_cache(int enable){
! 71: sqlite3GlobalConfig.sharedCacheEnabled = enable;
! 72: return SQLITE_OK;
! 73: }
! 74: #endif
! 75:
! 76:
! 77:
! 78: #ifdef SQLITE_OMIT_SHARED_CACHE
! 79: /*
! 80: ** The functions querySharedCacheTableLock(), setSharedCacheTableLock(),
! 81: ** and clearAllSharedCacheTableLocks()
! 82: ** manipulate entries in the BtShared.pLock linked list used to store
! 83: ** shared-cache table level locks. If the library is compiled with the
! 84: ** shared-cache feature disabled, then there is only ever one user
! 85: ** of each BtShared structure and so this locking is not necessary.
! 86: ** So define the lock related functions as no-ops.
! 87: */
! 88: #define querySharedCacheTableLock(a,b,c) SQLITE_OK
! 89: #define setSharedCacheTableLock(a,b,c) SQLITE_OK
! 90: #define clearAllSharedCacheTableLocks(a)
! 91: #define downgradeAllSharedCacheTableLocks(a)
! 92: #define hasSharedCacheTableLock(a,b,c,d) 1
! 93: #define hasReadConflicts(a, b) 0
! 94: #endif
! 95:
! 96: #ifndef SQLITE_OMIT_SHARED_CACHE
! 97:
! 98: #ifdef SQLITE_DEBUG
! 99: /*
! 100: **** This function is only used as part of an assert() statement. ***
! 101: **
! 102: ** Check to see if pBtree holds the required locks to read or write to the
! 103: ** table with root page iRoot. Return 1 if it does and 0 if not.
! 104: **
! 105: ** For example, when writing to a table with root-page iRoot via
! 106: ** Btree connection pBtree:
! 107: **
! 108: ** assert( hasSharedCacheTableLock(pBtree, iRoot, 0, WRITE_LOCK) );
! 109: **
! 110: ** When writing to an index that resides in a sharable database, the
! 111: ** caller should have first obtained a lock specifying the root page of
! 112: ** the corresponding table. This makes things a bit more complicated,
! 113: ** as this module treats each table as a separate structure. To determine
! 114: ** the table corresponding to the index being written, this
! 115: ** function has to search through the database schema.
! 116: **
! 117: ** Instead of a lock on the table/index rooted at page iRoot, the caller may
! 118: ** hold a write-lock on the schema table (root page 1). This is also
! 119: ** acceptable.
! 120: */
! 121: static int hasSharedCacheTableLock(
! 122: Btree *pBtree, /* Handle that must hold lock */
! 123: Pgno iRoot, /* Root page of b-tree */
! 124: int isIndex, /* True if iRoot is the root of an index b-tree */
! 125: int eLockType /* Required lock type (READ_LOCK or WRITE_LOCK) */
! 126: ){
! 127: Schema *pSchema = (Schema *)pBtree->pBt->pSchema;
! 128: Pgno iTab = 0;
! 129: BtLock *pLock;
! 130:
! 131: /* If this database is not shareable, or if the client is reading
! 132: ** and has the read-uncommitted flag set, then no lock is required.
! 133: ** Return true immediately.
! 134: */
! 135: if( (pBtree->sharable==0)
! 136: || (eLockType==READ_LOCK && (pBtree->db->flags & SQLITE_ReadUncommitted))
! 137: ){
! 138: return 1;
! 139: }
! 140:
! 141: /* If the client is reading or writing an index and the schema is
! 142: ** not loaded, then it is too difficult to actually check to see if
! 143: ** the correct locks are held. So do not bother - just return true.
! 144: ** This case does not come up very often anyhow.
! 145: */
! 146: if( isIndex && (!pSchema || (pSchema->flags&DB_SchemaLoaded)==0) ){
! 147: return 1;
! 148: }
! 149:
! 150: /* Figure out the root-page that the lock should be held on. For table
! 151: ** b-trees, this is just the root page of the b-tree being read or
! 152: ** written. For index b-trees, it is the root page of the associated
! 153: ** table. */
! 154: if( isIndex ){
! 155: HashElem *p;
! 156: for(p=sqliteHashFirst(&pSchema->idxHash); p; p=sqliteHashNext(p)){
! 157: Index *pIdx = (Index *)sqliteHashData(p);
! 158: if( pIdx->tnum==(int)iRoot ){
! 159: iTab = pIdx->pTable->tnum;
! 160: }
! 161: }
! 162: }else{
! 163: iTab = iRoot;
! 164: }
! 165:
! 166: /* Search for the required lock. Either a write-lock on root-page iTab, a
! 167: ** write-lock on the schema table, or (if the client is reading) a
! 168: ** read-lock on iTab will suffice. Return 1 if any of these are found. */
! 169: for(pLock=pBtree->pBt->pLock; pLock; pLock=pLock->pNext){
! 170: if( pLock->pBtree==pBtree
! 171: && (pLock->iTable==iTab || (pLock->eLock==WRITE_LOCK && pLock->iTable==1))
! 172: && pLock->eLock>=eLockType
! 173: ){
! 174: return 1;
! 175: }
! 176: }
! 177:
! 178: /* Failed to find the required lock. */
! 179: return 0;
! 180: }
! 181: #endif /* SQLITE_DEBUG */
! 182:
! 183: #ifdef SQLITE_DEBUG
! 184: /*
! 185: **** This function may be used as part of assert() statements only. ****
! 186: **
! 187: ** Return true if it would be illegal for pBtree to write into the
! 188: ** table or index rooted at iRoot because other shared connections are
! 189: ** simultaneously reading that same table or index.
! 190: **
! 191: ** It is illegal for pBtree to write if some other Btree object that
! 192: ** shares the same BtShared object is currently reading or writing
! 193: ** the iRoot table. Except, if the other Btree object has the
! 194: ** read-uncommitted flag set, then it is OK for the other object to
! 195: ** have a read cursor.
! 196: **
! 197: ** For example, before writing to any part of the table or index
! 198: ** rooted at page iRoot, one should call:
! 199: **
! 200: ** assert( !hasReadConflicts(pBtree, iRoot) );
! 201: */
! 202: static int hasReadConflicts(Btree *pBtree, Pgno iRoot){
! 203: BtCursor *p;
! 204: for(p=pBtree->pBt->pCursor; p; p=p->pNext){
! 205: if( p->pgnoRoot==iRoot
! 206: && p->pBtree!=pBtree
! 207: && 0==(p->pBtree->db->flags & SQLITE_ReadUncommitted)
! 208: ){
! 209: return 1;
! 210: }
! 211: }
! 212: return 0;
! 213: }
! 214: #endif /* #ifdef SQLITE_DEBUG */
! 215:
! 216: /*
! 217: ** Query to see if Btree handle p may obtain a lock of type eLock
! 218: ** (READ_LOCK or WRITE_LOCK) on the table with root-page iTab. Return
! 219: ** SQLITE_OK if the lock may be obtained (by calling
! 220: ** setSharedCacheTableLock()), or SQLITE_LOCKED if not.
! 221: */
! 222: static int querySharedCacheTableLock(Btree *p, Pgno iTab, u8 eLock){
! 223: BtShared *pBt = p->pBt;
! 224: BtLock *pIter;
! 225:
! 226: assert( sqlite3BtreeHoldsMutex(p) );
! 227: assert( eLock==READ_LOCK || eLock==WRITE_LOCK );
! 228: assert( p->db!=0 );
! 229: assert( !(p->db->flags&SQLITE_ReadUncommitted)||eLock==WRITE_LOCK||iTab==1 );
! 230:
! 231: /* If requesting a write-lock, then the Btree must have an open write
! 232: ** transaction on this file. And, obviously, for this to be so there
! 233: ** must be an open write transaction on the file itself.
! 234: */
! 235: assert( eLock==READ_LOCK || (p==pBt->pWriter && p->inTrans==TRANS_WRITE) );
! 236: assert( eLock==READ_LOCK || pBt->inTransaction==TRANS_WRITE );
! 237:
! 238: /* This routine is a no-op if the shared-cache is not enabled */
! 239: if( !p->sharable ){
! 240: return SQLITE_OK;
! 241: }
! 242:
! 243: /* If some other connection is holding an exclusive lock, the
! 244: ** requested lock may not be obtained.
! 245: */
! 246: if( pBt->pWriter!=p && (pBt->btsFlags & BTS_EXCLUSIVE)!=0 ){
! 247: sqlite3ConnectionBlocked(p->db, pBt->pWriter->db);
! 248: return SQLITE_LOCKED_SHAREDCACHE;
! 249: }
! 250:
! 251: for(pIter=pBt->pLock; pIter; pIter=pIter->pNext){
! 252: /* The condition (pIter->eLock!=eLock) in the following if(...)
! 253: ** statement is a simplification of:
! 254: **
! 255: ** (eLock==WRITE_LOCK || pIter->eLock==WRITE_LOCK)
! 256: **
! 257: ** since we know that if eLock==WRITE_LOCK, then no other connection
! 258: ** may hold a WRITE_LOCK on any table in this file (since there can
! 259: ** only be a single writer).
! 260: */
! 261: assert( pIter->eLock==READ_LOCK || pIter->eLock==WRITE_LOCK );
! 262: assert( eLock==READ_LOCK || pIter->pBtree==p || pIter->eLock==READ_LOCK);
! 263: if( pIter->pBtree!=p && pIter->iTable==iTab && pIter->eLock!=eLock ){
! 264: sqlite3ConnectionBlocked(p->db, pIter->pBtree->db);
! 265: if( eLock==WRITE_LOCK ){
! 266: assert( p==pBt->pWriter );
! 267: pBt->btsFlags |= BTS_PENDING;
! 268: }
! 269: return SQLITE_LOCKED_SHAREDCACHE;
! 270: }
! 271: }
! 272: return SQLITE_OK;
! 273: }
! 274: #endif /* !SQLITE_OMIT_SHARED_CACHE */
! 275:
! 276: #ifndef SQLITE_OMIT_SHARED_CACHE
! 277: /*
! 278: ** Add a lock on the table with root-page iTable to the shared-btree used
! 279: ** by Btree handle p. Parameter eLock must be either READ_LOCK or
! 280: ** WRITE_LOCK.
! 281: **
! 282: ** This function assumes the following:
! 283: **
! 284: ** (a) The specified Btree object p is connected to a sharable
! 285: ** database (one with the BtShared.sharable flag set), and
! 286: **
! 287: ** (b) No other Btree objects hold a lock that conflicts
! 288: ** with the requested lock (i.e. querySharedCacheTableLock() has
! 289: ** already been called and returned SQLITE_OK).
! 290: **
! 291: ** SQLITE_OK is returned if the lock is added successfully. SQLITE_NOMEM
! 292: ** is returned if a malloc attempt fails.
! 293: */
! 294: static int setSharedCacheTableLock(Btree *p, Pgno iTable, u8 eLock){
! 295: BtShared *pBt = p->pBt;
! 296: BtLock *pLock = 0;
! 297: BtLock *pIter;
! 298:
! 299: assert( sqlite3BtreeHoldsMutex(p) );
! 300: assert( eLock==READ_LOCK || eLock==WRITE_LOCK );
! 301: assert( p->db!=0 );
! 302:
! 303: /* A connection with the read-uncommitted flag set will never try to
! 304: ** obtain a read-lock using this function. The only read-lock obtained
! 305: ** by a connection in read-uncommitted mode is on the sqlite_master
! 306: ** table, and that lock is obtained in BtreeBeginTrans(). */
! 307: assert( 0==(p->db->flags&SQLITE_ReadUncommitted) || eLock==WRITE_LOCK );
! 308:
! 309: /* This function should only be called on a sharable b-tree after it
! 310: ** has been determined that no other b-tree holds a conflicting lock. */
! 311: assert( p->sharable );
! 312: assert( SQLITE_OK==querySharedCacheTableLock(p, iTable, eLock) );
! 313:
! 314: /* First search the list for an existing lock on this table. */
! 315: for(pIter=pBt->pLock; pIter; pIter=pIter->pNext){
! 316: if( pIter->iTable==iTable && pIter->pBtree==p ){
! 317: pLock = pIter;
! 318: break;
! 319: }
! 320: }
! 321:
! 322: /* If the above search did not find a BtLock struct associating Btree p
! 323: ** with table iTable, allocate one and link it into the list.
! 324: */
! 325: if( !pLock ){
! 326: pLock = (BtLock *)sqlite3MallocZero(sizeof(BtLock));
! 327: if( !pLock ){
! 328: return SQLITE_NOMEM;
! 329: }
! 330: pLock->iTable = iTable;
! 331: pLock->pBtree = p;
! 332: pLock->pNext = pBt->pLock;
! 333: pBt->pLock = pLock;
! 334: }
! 335:
! 336: /* Set the BtLock.eLock variable to the maximum of the current lock
! 337: ** and the requested lock. This means if a write-lock was already held
! 338: ** and a read-lock requested, we don't incorrectly downgrade the lock.
! 339: */
! 340: assert( WRITE_LOCK>READ_LOCK );
! 341: if( eLock>pLock->eLock ){
! 342: pLock->eLock = eLock;
! 343: }
! 344:
! 345: return SQLITE_OK;
! 346: }
! 347: #endif /* !SQLITE_OMIT_SHARED_CACHE */
! 348:
! 349: #ifndef SQLITE_OMIT_SHARED_CACHE
! 350: /*
! 351: ** Release all the table locks (locks obtained via calls to
! 352: ** the setSharedCacheTableLock() procedure) held by Btree object p.
! 353: **
! 354: ** This function assumes that Btree p has an open read or write
! 355: ** transaction. If it does not, then the BTS_PENDING flag
! 356: ** may be incorrectly cleared.
! 357: */
! 358: static void clearAllSharedCacheTableLocks(Btree *p){
! 359: BtShared *pBt = p->pBt;
! 360: BtLock **ppIter = &pBt->pLock;
! 361:
! 362: assert( sqlite3BtreeHoldsMutex(p) );
! 363: assert( p->sharable || 0==*ppIter );
! 364: assert( p->inTrans>0 );
! 365:
! 366: while( *ppIter ){
! 367: BtLock *pLock = *ppIter;
! 368: assert( (pBt->btsFlags & BTS_EXCLUSIVE)==0 || pBt->pWriter==pLock->pBtree );
! 369: assert( pLock->pBtree->inTrans>=pLock->eLock );
! 370: if( pLock->pBtree==p ){
! 371: *ppIter = pLock->pNext;
! 372: assert( pLock->iTable!=1 || pLock==&p->lock );
! 373: if( pLock->iTable!=1 ){
! 374: sqlite3_free(pLock);
! 375: }
! 376: }else{
! 377: ppIter = &pLock->pNext;
! 378: }
! 379: }
! 380:
! 381: assert( (pBt->btsFlags & BTS_PENDING)==0 || pBt->pWriter );
! 382: if( pBt->pWriter==p ){
! 383: pBt->pWriter = 0;
! 384: pBt->btsFlags &= ~(BTS_EXCLUSIVE|BTS_PENDING);
! 385: }else if( pBt->nTransaction==2 ){
! 386: /* This function is called when Btree p is concluding its
! 387: ** transaction. If there currently exists a writer, and p is not
! 388: ** that writer, then the number of locks held by connections other
! 389: ** than the writer must be about to drop to zero. In this case
! 390: ** set the BTS_PENDING flag to 0.
! 391: **
! 392: ** If there is not currently a writer, then BTS_PENDING must
! 393: ** be zero already. So this next line is harmless in that case.
! 394: */
! 395: pBt->btsFlags &= ~BTS_PENDING;
! 396: }
! 397: }
! 398:
! 399: /*
! 400: ** This function changes all write-locks held by Btree p into read-locks.
! 401: */
! 402: static void downgradeAllSharedCacheTableLocks(Btree *p){
! 403: BtShared *pBt = p->pBt;
! 404: if( pBt->pWriter==p ){
! 405: BtLock *pLock;
! 406: pBt->pWriter = 0;
! 407: pBt->btsFlags &= ~(BTS_EXCLUSIVE|BTS_PENDING);
! 408: for(pLock=pBt->pLock; pLock; pLock=pLock->pNext){
! 409: assert( pLock->eLock==READ_LOCK || pLock->pBtree==p );
! 410: pLock->eLock = READ_LOCK;
! 411: }
! 412: }
! 413: }
! 414:
! 415: #endif /* SQLITE_OMIT_SHARED_CACHE */
! 416:
! 417: static void releasePage(MemPage *pPage); /* Forward reference */
! 418:
! 419: /*
! 420: ***** This routine is used inside of assert() only ****
! 421: **
! 422: ** Verify that the cursor holds the mutex on its BtShared
! 423: */
! 424: #ifdef SQLITE_DEBUG
! 425: static int cursorHoldsMutex(BtCursor *p){
! 426: return sqlite3_mutex_held(p->pBt->mutex);
! 427: }
! 428: #endif
! 429:
! 430:
! 431: #ifndef SQLITE_OMIT_INCRBLOB
! 432: /*
! 433: ** Invalidate the overflow page-list cache for cursor pCur, if any.
! 434: */
! 435: static void invalidateOverflowCache(BtCursor *pCur){
! 436: assert( cursorHoldsMutex(pCur) );
! 437: sqlite3_free(pCur->aOverflow);
! 438: pCur->aOverflow = 0;
! 439: }
! 440:
! 441: /*
! 442: ** Invalidate the overflow page-list cache for all cursors opened
! 443: ** on the shared btree structure pBt.
! 444: */
! 445: static void invalidateAllOverflowCache(BtShared *pBt){
! 446: BtCursor *p;
! 447: assert( sqlite3_mutex_held(pBt->mutex) );
! 448: for(p=pBt->pCursor; p; p=p->pNext){
! 449: invalidateOverflowCache(p);
! 450: }
! 451: }
! 452:
! 453: /*
! 454: ** This function is called before modifying the contents of a table
! 455: ** to invalidate any incrblob cursors that are open on the
! 456: ** row or one of the rows being modified.
! 457: **
! 458: ** If argument isClearTable is true, then the entire contents of the
! 459: ** table is about to be deleted. In this case invalidate all incrblob
! 460: ** cursors open on any row within the table with root-page pgnoRoot.
! 461: **
! 462: ** Otherwise, if argument isClearTable is false, then the row with
! 463: ** rowid iRow is being replaced or deleted. In this case invalidate
! 464: ** only those incrblob cursors open on that specific row.
! 465: */
! 466: static void invalidateIncrblobCursors(
! 467: Btree *pBtree, /* The database file to check */
! 468: i64 iRow, /* The rowid that might be changing */
! 469: int isClearTable /* True if all rows are being deleted */
! 470: ){
! 471: BtCursor *p;
! 472: BtShared *pBt = pBtree->pBt;
! 473: assert( sqlite3BtreeHoldsMutex(pBtree) );
! 474: for(p=pBt->pCursor; p; p=p->pNext){
! 475: if( p->isIncrblobHandle && (isClearTable || p->info.nKey==iRow) ){
! 476: p->eState = CURSOR_INVALID;
! 477: }
! 478: }
! 479: }
! 480:
! 481: #else
! 482: /* Stub functions when INCRBLOB is omitted */
! 483: #define invalidateOverflowCache(x)
! 484: #define invalidateAllOverflowCache(x)
! 485: #define invalidateIncrblobCursors(x,y,z)
! 486: #endif /* SQLITE_OMIT_INCRBLOB */
! 487:
! 488: /*
! 489: ** Set bit pgno of the BtShared.pHasContent bitvec. This is called
! 490: ** when a page that previously contained data becomes a free-list leaf
! 491: ** page.
! 492: **
! 493: ** The BtShared.pHasContent bitvec exists to work around an obscure
! 494: ** bug caused by the interaction of two useful IO optimizations surrounding
! 495: ** free-list leaf pages:
! 496: **
! 497: ** 1) When all data is deleted from a page and the page becomes
! 498: ** a free-list leaf page, the page is not written to the database
! 499: ** (as free-list leaf pages contain no meaningful data). Sometimes
! 500: ** such a page is not even journalled (as it will not be modified,
! 501: ** why bother journalling it?).
! 502: **
! 503: ** 2) When a free-list leaf page is reused, its content is not read
! 504: ** from the database or written to the journal file (why should it
! 505: ** be, if it is not at all meaningful?).
! 506: **
! 507: ** By themselves, these optimizations work fine and provide a handy
! 508: ** performance boost to bulk delete or insert operations. However, if
! 509: ** a page is moved to the free-list and then reused within the same
! 510: ** transaction, a problem comes up. If the page is not journalled when
! 511: ** it is moved to the free-list and it is also not journalled when it
! 512: ** is extracted from the free-list and reused, then the original data
! 513: ** may be lost. In the event of a rollback, it may not be possible
! 514: ** to restore the database to its original configuration.
! 515: **
! 516: ** The solution is the BtShared.pHasContent bitvec. Whenever a page is
! 517: ** moved to become a free-list leaf page, the corresponding bit is
! 518: ** set in the bitvec. Whenever a leaf page is extracted from the free-list,
! 519: ** optimization 2 above is omitted if the corresponding bit is already
! 520: ** set in BtShared.pHasContent. The contents of the bitvec are cleared
! 521: ** at the end of every transaction.
! 522: */
! 523: static int btreeSetHasContent(BtShared *pBt, Pgno pgno){
! 524: int rc = SQLITE_OK;
! 525: if( !pBt->pHasContent ){
! 526: assert( pgno<=pBt->nPage );
! 527: pBt->pHasContent = sqlite3BitvecCreate(pBt->nPage);
! 528: if( !pBt->pHasContent ){
! 529: rc = SQLITE_NOMEM;
! 530: }
! 531: }
! 532: if( rc==SQLITE_OK && pgno<=sqlite3BitvecSize(pBt->pHasContent) ){
! 533: rc = sqlite3BitvecSet(pBt->pHasContent, pgno);
! 534: }
! 535: return rc;
! 536: }
! 537:
! 538: /*
! 539: ** Query the BtShared.pHasContent vector.
! 540: **
! 541: ** This function is called when a free-list leaf page is removed from the
! 542: ** free-list for reuse. It returns false if it is safe to retrieve the
! 543: ** page from the pager layer with the 'no-content' flag set. True otherwise.
! 544: */
! 545: static int btreeGetHasContent(BtShared *pBt, Pgno pgno){
! 546: Bitvec *p = pBt->pHasContent;
! 547: return (p && (pgno>sqlite3BitvecSize(p) || sqlite3BitvecTest(p, pgno)));
! 548: }
! 549:
! 550: /*
! 551: ** Clear (destroy) the BtShared.pHasContent bitvec. This should be
! 552: ** invoked at the conclusion of each write-transaction.
! 553: */
! 554: static void btreeClearHasContent(BtShared *pBt){
! 555: sqlite3BitvecDestroy(pBt->pHasContent);
! 556: pBt->pHasContent = 0;
! 557: }
! 558:
! 559: /*
! 560: ** Save the current cursor position in the variables BtCursor.nKey
! 561: ** and BtCursor.pKey. The cursor's state is set to CURSOR_REQUIRESEEK.
! 562: **
! 563: ** The caller must ensure that the cursor is valid (has eState==CURSOR_VALID)
! 564: ** prior to calling this routine.
! 565: */
! 566: static int saveCursorPosition(BtCursor *pCur){
! 567: int rc;
! 568:
! 569: assert( CURSOR_VALID==pCur->eState );
! 570: assert( 0==pCur->pKey );
! 571: assert( cursorHoldsMutex(pCur) );
! 572:
! 573: rc = sqlite3BtreeKeySize(pCur, &pCur->nKey);
! 574: assert( rc==SQLITE_OK ); /* KeySize() cannot fail */
! 575:
! 576: /* If this is an intKey table, then the above call to BtreeKeySize()
! 577: ** stores the integer key in pCur->nKey. In this case this value is
! 578: ** all that is required. Otherwise, if pCur is not open on an intKey
! 579: ** table, then malloc space for and store the pCur->nKey bytes of key
! 580: ** data.
! 581: */
! 582: if( 0==pCur->apPage[0]->intKey ){
! 583: void *pKey = sqlite3Malloc( (int)pCur->nKey );
! 584: if( pKey ){
! 585: rc = sqlite3BtreeKey(pCur, 0, (int)pCur->nKey, pKey);
! 586: if( rc==SQLITE_OK ){
! 587: pCur->pKey = pKey;
! 588: }else{
! 589: sqlite3_free(pKey);
! 590: }
! 591: }else{
! 592: rc = SQLITE_NOMEM;
! 593: }
! 594: }
! 595: assert( !pCur->apPage[0]->intKey || !pCur->pKey );
! 596:
! 597: if( rc==SQLITE_OK ){
! 598: int i;
! 599: for(i=0; i<=pCur->iPage; i++){
! 600: releasePage(pCur->apPage[i]);
! 601: pCur->apPage[i] = 0;
! 602: }
! 603: pCur->iPage = -1;
! 604: pCur->eState = CURSOR_REQUIRESEEK;
! 605: }
! 606:
! 607: invalidateOverflowCache(pCur);
! 608: return rc;
! 609: }
! 610:
! 611: /*
! 612: ** Save the positions of all cursors (except pExcept) that are open on
! 613: ** the table with root-page iRoot. Usually, this is called just before cursor
! 614: ** pExcept is used to modify the table (BtreeDelete() or BtreeInsert()).
! 615: */
! 616: static int saveAllCursors(BtShared *pBt, Pgno iRoot, BtCursor *pExcept){
! 617: BtCursor *p;
! 618: assert( sqlite3_mutex_held(pBt->mutex) );
! 619: assert( pExcept==0 || pExcept->pBt==pBt );
! 620: for(p=pBt->pCursor; p; p=p->pNext){
! 621: if( p!=pExcept && (0==iRoot || p->pgnoRoot==iRoot) &&
! 622: p->eState==CURSOR_VALID ){
! 623: int rc = saveCursorPosition(p);
! 624: if( SQLITE_OK!=rc ){
! 625: return rc;
! 626: }
! 627: }
! 628: }
! 629: return SQLITE_OK;
! 630: }
! 631:
! 632: /*
! 633: ** Clear the current cursor position.
! 634: */
! 635: void sqlite3BtreeClearCursor(BtCursor *pCur){
! 636: assert( cursorHoldsMutex(pCur) );
! 637: sqlite3_free(pCur->pKey);
! 638: pCur->pKey = 0;
! 639: pCur->eState = CURSOR_INVALID;
! 640: }
! 641:
! 642: /*
! 643: ** In this version of BtreeMoveto, pKey is a packed index record
! 644: ** such as is generated by the OP_MakeRecord opcode. Unpack the
! 645: ** record and then call BtreeMovetoUnpacked() to do the work.
! 646: */
! 647: static int btreeMoveto(
! 648: BtCursor *pCur, /* Cursor open on the btree to be searched */
! 649: const void *pKey, /* Packed key if the btree is an index */
! 650: i64 nKey, /* Integer key for tables. Size of pKey for indices */
! 651: int bias, /* Bias search to the high end */
! 652: int *pRes /* Write search results here */
! 653: ){
! 654: int rc; /* Status code */
! 655: UnpackedRecord *pIdxKey; /* Unpacked index key */
! 656: char aSpace[150]; /* Temp space for pIdxKey - to avoid a malloc */
! 657: char *pFree = 0;
! 658:
! 659: if( pKey ){
! 660: assert( nKey==(i64)(int)nKey );
! 661: pIdxKey = sqlite3VdbeAllocUnpackedRecord(
! 662: pCur->pKeyInfo, aSpace, sizeof(aSpace), &pFree
! 663: );
! 664: if( pIdxKey==0 ) return SQLITE_NOMEM;
! 665: sqlite3VdbeRecordUnpack(pCur->pKeyInfo, (int)nKey, pKey, pIdxKey);
! 666: }else{
! 667: pIdxKey = 0;
! 668: }
! 669: rc = sqlite3BtreeMovetoUnpacked(pCur, pIdxKey, nKey, bias, pRes);
! 670: if( pFree ){
! 671: sqlite3DbFree(pCur->pKeyInfo->db, pFree);
! 672: }
! 673: return rc;
! 674: }
! 675:
! 676: /*
! 677: ** Restore the cursor to the position it was in (or as close to as possible)
! 678: ** when saveCursorPosition() was called. Note that this call deletes the
! 679: ** saved position info stored by saveCursorPosition(), so there can be
! 680: ** at most one effective restoreCursorPosition() call after each
! 681: ** saveCursorPosition().
! 682: */
! 683: static int btreeRestoreCursorPosition(BtCursor *pCur){
! 684: int rc;
! 685: assert( cursorHoldsMutex(pCur) );
! 686: assert( pCur->eState>=CURSOR_REQUIRESEEK );
! 687: if( pCur->eState==CURSOR_FAULT ){
! 688: return pCur->skipNext;
! 689: }
! 690: pCur->eState = CURSOR_INVALID;
! 691: rc = btreeMoveto(pCur, pCur->pKey, pCur->nKey, 0, &pCur->skipNext);
! 692: if( rc==SQLITE_OK ){
! 693: sqlite3_free(pCur->pKey);
! 694: pCur->pKey = 0;
! 695: assert( pCur->eState==CURSOR_VALID || pCur->eState==CURSOR_INVALID );
! 696: }
! 697: return rc;
! 698: }
! 699:
! 700: #define restoreCursorPosition(p) \
! 701: (p->eState>=CURSOR_REQUIRESEEK ? \
! 702: btreeRestoreCursorPosition(p) : \
! 703: SQLITE_OK)
! 704:
! 705: /*
! 706: ** Determine whether or not a cursor has moved from the position it
! 707: ** was last placed at. Cursors can move when the row they are pointing
! 708: ** at is deleted out from under them.
! 709: **
! 710: ** This routine returns an error code if something goes wrong. The
! 711: ** integer *pHasMoved is set to one if the cursor has moved and 0 if not.
! 712: */
! 713: int sqlite3BtreeCursorHasMoved(BtCursor *pCur, int *pHasMoved){
! 714: int rc;
! 715:
! 716: rc = restoreCursorPosition(pCur);
! 717: if( rc ){
! 718: *pHasMoved = 1;
! 719: return rc;
! 720: }
! 721: if( pCur->eState!=CURSOR_VALID || pCur->skipNext!=0 ){
! 722: *pHasMoved = 1;
! 723: }else{
! 724: *pHasMoved = 0;
! 725: }
! 726: return SQLITE_OK;
! 727: }
! 728:
! 729: #ifndef SQLITE_OMIT_AUTOVACUUM
! 730: /*
! 731: ** Given a page number of a regular database page, return the page
! 732: ** number for the pointer-map page that contains the entry for the
! 733: ** input page number.
! 734: **
! 735: ** Return 0 (not a valid page) for pgno==1 since there is
! 736: ** no pointer map associated with page 1. The integrity_check logic
! 737: ** requires that ptrmapPageno(*,1)!=1.
! 738: */
! 739: static Pgno ptrmapPageno(BtShared *pBt, Pgno pgno){
! 740: int nPagesPerMapPage;
! 741: Pgno iPtrMap, ret;
! 742: assert( sqlite3_mutex_held(pBt->mutex) );
! 743: if( pgno<2 ) return 0;
! 744: nPagesPerMapPage = (pBt->usableSize/5)+1;
! 745: iPtrMap = (pgno-2)/nPagesPerMapPage;
! 746: ret = (iPtrMap*nPagesPerMapPage) + 2;
! 747: if( ret==PENDING_BYTE_PAGE(pBt) ){
! 748: ret++;
! 749: }
! 750: return ret;
! 751: }
! 752:
! 753: /*
! 754: ** Write an entry into the pointer map.
! 755: **
! 756: ** This routine updates the pointer map entry for page number 'key'
! 757: ** so that it maps to type 'eType' and parent page number 'pgno'.
! 758: **
! 759: ** If *pRC is initially non-zero (non-SQLITE_OK) then this routine is
! 760: ** a no-op. If an error occurs, the appropriate error code is written
! 761: ** into *pRC.
! 762: */
! 763: static void ptrmapPut(BtShared *pBt, Pgno key, u8 eType, Pgno parent, int *pRC){
! 764: DbPage *pDbPage; /* The pointer map page */
! 765: u8 *pPtrmap; /* The pointer map data */
! 766: Pgno iPtrmap; /* The pointer map page number */
! 767: int offset; /* Offset in pointer map page */
! 768: int rc; /* Return code from subfunctions */
! 769:
! 770: if( *pRC ) return;
! 771:
! 772: assert( sqlite3_mutex_held(pBt->mutex) );
! 773: /* The master-journal page number must never be used as a pointer map page */
! 774: assert( 0==PTRMAP_ISPAGE(pBt, PENDING_BYTE_PAGE(pBt)) );
! 775:
! 776: assert( pBt->autoVacuum );
! 777: if( key==0 ){
! 778: *pRC = SQLITE_CORRUPT_BKPT;
! 779: return;
! 780: }
! 781: iPtrmap = PTRMAP_PAGENO(pBt, key);
! 782: rc = sqlite3PagerGet(pBt->pPager, iPtrmap, &pDbPage);
! 783: if( rc!=SQLITE_OK ){
! 784: *pRC = rc;
! 785: return;
! 786: }
! 787: offset = PTRMAP_PTROFFSET(iPtrmap, key);
! 788: if( offset<0 ){
! 789: *pRC = SQLITE_CORRUPT_BKPT;
! 790: goto ptrmap_exit;
! 791: }
! 792: assert( offset <= (int)pBt->usableSize-5 );
! 793: pPtrmap = (u8 *)sqlite3PagerGetData(pDbPage);
! 794:
! 795: if( eType!=pPtrmap[offset] || get4byte(&pPtrmap[offset+1])!=parent ){
! 796: TRACE(("PTRMAP_UPDATE: %d->(%d,%d)\n", key, eType, parent));
! 797: *pRC= rc = sqlite3PagerWrite(pDbPage);
! 798: if( rc==SQLITE_OK ){
! 799: pPtrmap[offset] = eType;
! 800: put4byte(&pPtrmap[offset+1], parent);
! 801: }
! 802: }
! 803:
! 804: ptrmap_exit:
! 805: sqlite3PagerUnref(pDbPage);
! 806: }
! 807:
! 808: /*
! 809: ** Read an entry from the pointer map.
! 810: **
! 811: ** This routine retrieves the pointer map entry for page 'key', writing
! 812: ** the type and parent page number to *pEType and *pPgno respectively.
! 813: ** An error code is returned if something goes wrong, otherwise SQLITE_OK.
! 814: */
! 815: static int ptrmapGet(BtShared *pBt, Pgno key, u8 *pEType, Pgno *pPgno){
! 816: DbPage *pDbPage; /* The pointer map page */
! 817: int iPtrmap; /* Pointer map page index */
! 818: u8 *pPtrmap; /* Pointer map page data */
! 819: int offset; /* Offset of entry in pointer map */
! 820: int rc;
! 821:
! 822: assert( sqlite3_mutex_held(pBt->mutex) );
! 823:
! 824: iPtrmap = PTRMAP_PAGENO(pBt, key);
! 825: rc = sqlite3PagerGet(pBt->pPager, iPtrmap, &pDbPage);
! 826: if( rc!=0 ){
! 827: return rc;
! 828: }
! 829: pPtrmap = (u8 *)sqlite3PagerGetData(pDbPage);
! 830:
! 831: offset = PTRMAP_PTROFFSET(iPtrmap, key);
! 832: if( offset<0 ){
! 833: sqlite3PagerUnref(pDbPage);
! 834: return SQLITE_CORRUPT_BKPT;
! 835: }
! 836: assert( offset <= (int)pBt->usableSize-5 );
! 837: assert( pEType!=0 );
! 838: *pEType = pPtrmap[offset];
! 839: if( pPgno ) *pPgno = get4byte(&pPtrmap[offset+1]);
! 840:
! 841: sqlite3PagerUnref(pDbPage);
! 842: if( *pEType<1 || *pEType>5 ) return SQLITE_CORRUPT_BKPT;
! 843: return SQLITE_OK;
! 844: }
! 845:
! 846: #else /* if defined SQLITE_OMIT_AUTOVACUUM */
! 847: #define ptrmapPut(w,x,y,z,rc)
! 848: #define ptrmapGet(w,x,y,z) SQLITE_OK
! 849: #define ptrmapPutOvflPtr(x, y, rc)
! 850: #endif
! 851:
! 852: /*
! 853: ** Given a btree page and a cell index (0 means the first cell on
! 854: ** the page, 1 means the second cell, and so forth) return a pointer
! 855: ** to the cell content.
! 856: **
! 857: ** This routine works only for pages that do not contain overflow cells.
! 858: */
! 859: #define findCell(P,I) \
! 860: ((P)->aData + ((P)->maskPage & get2byte(&(P)->aCellIdx[2*(I)])))
! 861: #define findCellv2(D,M,O,I) (D+(M&get2byte(D+(O+2*(I)))))
! 862:
! 863:
! 864: /*
! 865: ** This a more complex version of findCell() that works for
! 866: ** pages that do contain overflow cells.
! 867: */
! 868: static u8 *findOverflowCell(MemPage *pPage, int iCell){
! 869: int i;
! 870: assert( sqlite3_mutex_held(pPage->pBt->mutex) );
! 871: for(i=pPage->nOverflow-1; i>=0; i--){
! 872: int k;
! 873: struct _OvflCell *pOvfl;
! 874: pOvfl = &pPage->aOvfl[i];
! 875: k = pOvfl->idx;
! 876: if( k<=iCell ){
! 877: if( k==iCell ){
! 878: return pOvfl->pCell;
! 879: }
! 880: iCell--;
! 881: }
! 882: }
! 883: return findCell(pPage, iCell);
! 884: }
! 885:
! 886: /*
! 887: ** Parse a cell content block and fill in the CellInfo structure. There
! 888: ** are two versions of this function. btreeParseCell() takes a
! 889: ** cell index as the second argument and btreeParseCellPtr()
! 890: ** takes a pointer to the body of the cell as its second argument.
! 891: **
! 892: ** Within this file, the parseCell() macro can be called instead of
! 893: ** btreeParseCellPtr(). Using some compilers, this will be faster.
! 894: */
! 895: static void btreeParseCellPtr(
! 896: MemPage *pPage, /* Page containing the cell */
! 897: u8 *pCell, /* Pointer to the cell text. */
! 898: CellInfo *pInfo /* Fill in this structure */
! 899: ){
! 900: u16 n; /* Number bytes in cell content header */
! 901: u32 nPayload; /* Number of bytes of cell payload */
! 902:
! 903: assert( sqlite3_mutex_held(pPage->pBt->mutex) );
! 904:
! 905: pInfo->pCell = pCell;
! 906: assert( pPage->leaf==0 || pPage->leaf==1 );
! 907: n = pPage->childPtrSize;
! 908: assert( n==4-4*pPage->leaf );
! 909: if( pPage->intKey ){
! 910: if( pPage->hasData ){
! 911: n += getVarint32(&pCell[n], nPayload);
! 912: }else{
! 913: nPayload = 0;
! 914: }
! 915: n += getVarint(&pCell[n], (u64*)&pInfo->nKey);
! 916: pInfo->nData = nPayload;
! 917: }else{
! 918: pInfo->nData = 0;
! 919: n += getVarint32(&pCell[n], nPayload);
! 920: pInfo->nKey = nPayload;
! 921: }
! 922: pInfo->nPayload = nPayload;
! 923: pInfo->nHeader = n;
! 924: testcase( nPayload==pPage->maxLocal );
! 925: testcase( nPayload==pPage->maxLocal+1 );
! 926: if( likely(nPayload<=pPage->maxLocal) ){
! 927: /* This is the (easy) common case where the entire payload fits
! 928: ** on the local page. No overflow is required.
! 929: */
! 930: if( (pInfo->nSize = (u16)(n+nPayload))<4 ) pInfo->nSize = 4;
! 931: pInfo->nLocal = (u16)nPayload;
! 932: pInfo->iOverflow = 0;
! 933: }else{
! 934: /* If the payload will not fit completely on the local page, we have
! 935: ** to decide how much to store locally and how much to spill onto
! 936: ** overflow pages. The strategy is to minimize the amount of unused
! 937: ** space on overflow pages while keeping the amount of local storage
! 938: ** in between minLocal and maxLocal.
! 939: **
! 940: ** Warning: changing the way overflow payload is distributed in any
! 941: ** way will result in an incompatible file format.
! 942: */
! 943: int minLocal; /* Minimum amount of payload held locally */
! 944: int maxLocal; /* Maximum amount of payload held locally */
! 945: int surplus; /* Overflow payload available for local storage */
! 946:
! 947: minLocal = pPage->minLocal;
! 948: maxLocal = pPage->maxLocal;
! 949: surplus = minLocal + (nPayload - minLocal)%(pPage->pBt->usableSize - 4);
! 950: testcase( surplus==maxLocal );
! 951: testcase( surplus==maxLocal+1 );
! 952: if( surplus <= maxLocal ){
! 953: pInfo->nLocal = (u16)surplus;
! 954: }else{
! 955: pInfo->nLocal = (u16)minLocal;
! 956: }
! 957: pInfo->iOverflow = (u16)(pInfo->nLocal + n);
! 958: pInfo->nSize = pInfo->iOverflow + 4;
! 959: }
! 960: }
! 961: #define parseCell(pPage, iCell, pInfo) \
! 962: btreeParseCellPtr((pPage), findCell((pPage), (iCell)), (pInfo))
! 963: static void btreeParseCell(
! 964: MemPage *pPage, /* Page containing the cell */
! 965: int iCell, /* The cell index. First cell is 0 */
! 966: CellInfo *pInfo /* Fill in this structure */
! 967: ){
! 968: parseCell(pPage, iCell, pInfo);
! 969: }
! 970:
! 971: /*
! 972: ** Compute the total number of bytes that a Cell needs in the cell
! 973: ** data area of the btree-page. The return number includes the cell
! 974: ** data header and the local payload, but not any overflow page or
! 975: ** the space used by the cell pointer.
! 976: */
! 977: static u16 cellSizePtr(MemPage *pPage, u8 *pCell){
! 978: u8 *pIter = &pCell[pPage->childPtrSize];
! 979: u32 nSize;
! 980:
! 981: #ifdef SQLITE_DEBUG
! 982: /* The value returned by this function should always be the same as
! 983: ** the (CellInfo.nSize) value found by doing a full parse of the
! 984: ** cell. If SQLITE_DEBUG is defined, an assert() at the bottom of
! 985: ** this function verifies that this invariant is not violated. */
! 986: CellInfo debuginfo;
! 987: btreeParseCellPtr(pPage, pCell, &debuginfo);
! 988: #endif
! 989:
! 990: if( pPage->intKey ){
! 991: u8 *pEnd;
! 992: if( pPage->hasData ){
! 993: pIter += getVarint32(pIter, nSize);
! 994: }else{
! 995: nSize = 0;
! 996: }
! 997:
! 998: /* pIter now points at the 64-bit integer key value, a variable length
! 999: ** integer. The following block moves pIter to point at the first byte
! 1000: ** past the end of the key value. */
! 1001: pEnd = &pIter[9];
! 1002: while( (*pIter++)&0x80 && pIter<pEnd );
! 1003: }else{
! 1004: pIter += getVarint32(pIter, nSize);
! 1005: }
! 1006:
! 1007: testcase( nSize==pPage->maxLocal );
! 1008: testcase( nSize==pPage->maxLocal+1 );
! 1009: if( nSize>pPage->maxLocal ){
! 1010: int minLocal = pPage->minLocal;
! 1011: nSize = minLocal + (nSize - minLocal) % (pPage->pBt->usableSize - 4);
! 1012: testcase( nSize==pPage->maxLocal );
! 1013: testcase( nSize==pPage->maxLocal+1 );
! 1014: if( nSize>pPage->maxLocal ){
! 1015: nSize = minLocal;
! 1016: }
! 1017: nSize += 4;
! 1018: }
! 1019: nSize += (u32)(pIter - pCell);
! 1020:
! 1021: /* The minimum size of any cell is 4 bytes. */
! 1022: if( nSize<4 ){
! 1023: nSize = 4;
! 1024: }
! 1025:
! 1026: assert( nSize==debuginfo.nSize );
! 1027: return (u16)nSize;
! 1028: }
! 1029:
! 1030: #ifdef SQLITE_DEBUG
! 1031: /* This variation on cellSizePtr() is used inside of assert() statements
! 1032: ** only. */
! 1033: static u16 cellSize(MemPage *pPage, int iCell){
! 1034: return cellSizePtr(pPage, findCell(pPage, iCell));
! 1035: }
! 1036: #endif
! 1037:
! 1038: #ifndef SQLITE_OMIT_AUTOVACUUM
! 1039: /*
! 1040: ** If the cell pCell, part of page pPage contains a pointer
! 1041: ** to an overflow page, insert an entry into the pointer-map
! 1042: ** for the overflow page.
! 1043: */
! 1044: static void ptrmapPutOvflPtr(MemPage *pPage, u8 *pCell, int *pRC){
! 1045: CellInfo info;
! 1046: if( *pRC ) return;
! 1047: assert( pCell!=0 );
! 1048: btreeParseCellPtr(pPage, pCell, &info);
! 1049: assert( (info.nData+(pPage->intKey?0:info.nKey))==info.nPayload );
! 1050: if( info.iOverflow ){
! 1051: Pgno ovfl = get4byte(&pCell[info.iOverflow]);
! 1052: ptrmapPut(pPage->pBt, ovfl, PTRMAP_OVERFLOW1, pPage->pgno, pRC);
! 1053: }
! 1054: }
! 1055: #endif
! 1056:
! 1057:
! 1058: /*
! 1059: ** Defragment the page given. All Cells are moved to the
! 1060: ** end of the page and all free space is collected into one
! 1061: ** big FreeBlk that occurs in between the header and cell
! 1062: ** pointer array and the cell content area.
! 1063: */
! 1064: static int defragmentPage(MemPage *pPage){
! 1065: int i; /* Loop counter */
! 1066: int pc; /* Address of a i-th cell */
! 1067: int hdr; /* Offset to the page header */
! 1068: int size; /* Size of a cell */
! 1069: int usableSize; /* Number of usable bytes on a page */
! 1070: int cellOffset; /* Offset to the cell pointer array */
! 1071: int cbrk; /* Offset to the cell content area */
! 1072: int nCell; /* Number of cells on the page */
! 1073: unsigned char *data; /* The page data */
! 1074: unsigned char *temp; /* Temp area for cell content */
! 1075: int iCellFirst; /* First allowable cell index */
! 1076: int iCellLast; /* Last possible cell index */
! 1077:
! 1078:
! 1079: assert( sqlite3PagerIswriteable(pPage->pDbPage) );
! 1080: assert( pPage->pBt!=0 );
! 1081: assert( pPage->pBt->usableSize <= SQLITE_MAX_PAGE_SIZE );
! 1082: assert( pPage->nOverflow==0 );
! 1083: assert( sqlite3_mutex_held(pPage->pBt->mutex) );
! 1084: temp = sqlite3PagerTempSpace(pPage->pBt->pPager);
! 1085: data = pPage->aData;
! 1086: hdr = pPage->hdrOffset;
! 1087: cellOffset = pPage->cellOffset;
! 1088: nCell = pPage->nCell;
! 1089: assert( nCell==get2byte(&data[hdr+3]) );
! 1090: usableSize = pPage->pBt->usableSize;
! 1091: cbrk = get2byte(&data[hdr+5]);
! 1092: memcpy(&temp[cbrk], &data[cbrk], usableSize - cbrk);
! 1093: cbrk = usableSize;
! 1094: iCellFirst = cellOffset + 2*nCell;
! 1095: iCellLast = usableSize - 4;
! 1096: for(i=0; i<nCell; i++){
! 1097: u8 *pAddr; /* The i-th cell pointer */
! 1098: pAddr = &data[cellOffset + i*2];
! 1099: pc = get2byte(pAddr);
! 1100: testcase( pc==iCellFirst );
! 1101: testcase( pc==iCellLast );
! 1102: #if !defined(SQLITE_ENABLE_OVERSIZE_CELL_CHECK)
! 1103: /* These conditions have already been verified in btreeInitPage()
! 1104: ** if SQLITE_ENABLE_OVERSIZE_CELL_CHECK is defined
! 1105: */
! 1106: if( pc<iCellFirst || pc>iCellLast ){
! 1107: return SQLITE_CORRUPT_BKPT;
! 1108: }
! 1109: #endif
! 1110: assert( pc>=iCellFirst && pc<=iCellLast );
! 1111: size = cellSizePtr(pPage, &temp[pc]);
! 1112: cbrk -= size;
! 1113: #if defined(SQLITE_ENABLE_OVERSIZE_CELL_CHECK)
! 1114: if( cbrk<iCellFirst ){
! 1115: return SQLITE_CORRUPT_BKPT;
! 1116: }
! 1117: #else
! 1118: if( cbrk<iCellFirst || pc+size>usableSize ){
! 1119: return SQLITE_CORRUPT_BKPT;
! 1120: }
! 1121: #endif
! 1122: assert( cbrk+size<=usableSize && cbrk>=iCellFirst );
! 1123: testcase( cbrk+size==usableSize );
! 1124: testcase( pc+size==usableSize );
! 1125: memcpy(&data[cbrk], &temp[pc], size);
! 1126: put2byte(pAddr, cbrk);
! 1127: }
! 1128: assert( cbrk>=iCellFirst );
! 1129: put2byte(&data[hdr+5], cbrk);
! 1130: data[hdr+1] = 0;
! 1131: data[hdr+2] = 0;
! 1132: data[hdr+7] = 0;
! 1133: memset(&data[iCellFirst], 0, cbrk-iCellFirst);
! 1134: assert( sqlite3PagerIswriteable(pPage->pDbPage) );
! 1135: if( cbrk-iCellFirst!=pPage->nFree ){
! 1136: return SQLITE_CORRUPT_BKPT;
! 1137: }
! 1138: return SQLITE_OK;
! 1139: }
! 1140:
! 1141: /*
! 1142: ** Allocate nByte bytes of space from within the B-Tree page passed
! 1143: ** as the first argument. Write into *pIdx the index into pPage->aData[]
! 1144: ** of the first byte of allocated space. Return either SQLITE_OK or
! 1145: ** an error code (usually SQLITE_CORRUPT).
! 1146: **
! 1147: ** The caller guarantees that there is sufficient space to make the
! 1148: ** allocation. This routine might need to defragment in order to bring
! 1149: ** all the space together, however. This routine will avoid using
! 1150: ** the first two bytes past the cell pointer area since presumably this
! 1151: ** allocation is being made in order to insert a new cell, so we will
! 1152: ** also end up needing a new cell pointer.
! 1153: */
! 1154: static int allocateSpace(MemPage *pPage, int nByte, int *pIdx){
! 1155: const int hdr = pPage->hdrOffset; /* Local cache of pPage->hdrOffset */
! 1156: u8 * const data = pPage->aData; /* Local cache of pPage->aData */
! 1157: int nFrag; /* Number of fragmented bytes on pPage */
! 1158: int top; /* First byte of cell content area */
! 1159: int gap; /* First byte of gap between cell pointers and cell content */
! 1160: int rc; /* Integer return code */
! 1161: int usableSize; /* Usable size of the page */
! 1162:
! 1163: assert( sqlite3PagerIswriteable(pPage->pDbPage) );
! 1164: assert( pPage->pBt );
! 1165: assert( sqlite3_mutex_held(pPage->pBt->mutex) );
! 1166: assert( nByte>=0 ); /* Minimum cell size is 4 */
! 1167: assert( pPage->nFree>=nByte );
! 1168: assert( pPage->nOverflow==0 );
! 1169: usableSize = pPage->pBt->usableSize;
! 1170: assert( nByte < usableSize-8 );
! 1171:
! 1172: nFrag = data[hdr+7];
! 1173: assert( pPage->cellOffset == hdr + 12 - 4*pPage->leaf );
! 1174: gap = pPage->cellOffset + 2*pPage->nCell;
! 1175: top = get2byteNotZero(&data[hdr+5]);
! 1176: if( gap>top ) return SQLITE_CORRUPT_BKPT;
! 1177: testcase( gap+2==top );
! 1178: testcase( gap+1==top );
! 1179: testcase( gap==top );
! 1180:
! 1181: if( nFrag>=60 ){
! 1182: /* Always defragment highly fragmented pages */
! 1183: rc = defragmentPage(pPage);
! 1184: if( rc ) return rc;
! 1185: top = get2byteNotZero(&data[hdr+5]);
! 1186: }else if( gap+2<=top ){
! 1187: /* Search the freelist looking for a free slot big enough to satisfy
! 1188: ** the request. The allocation is made from the first free slot in
! 1189: ** the list that is large enough to accomadate it.
! 1190: */
! 1191: int pc, addr;
! 1192: for(addr=hdr+1; (pc = get2byte(&data[addr]))>0; addr=pc){
! 1193: int size; /* Size of the free slot */
! 1194: if( pc>usableSize-4 || pc<addr+4 ){
! 1195: return SQLITE_CORRUPT_BKPT;
! 1196: }
! 1197: size = get2byte(&data[pc+2]);
! 1198: if( size>=nByte ){
! 1199: int x = size - nByte;
! 1200: testcase( x==4 );
! 1201: testcase( x==3 );
! 1202: if( x<4 ){
! 1203: /* Remove the slot from the free-list. Update the number of
! 1204: ** fragmented bytes within the page. */
! 1205: memcpy(&data[addr], &data[pc], 2);
! 1206: data[hdr+7] = (u8)(nFrag + x);
! 1207: }else if( size+pc > usableSize ){
! 1208: return SQLITE_CORRUPT_BKPT;
! 1209: }else{
! 1210: /* The slot remains on the free-list. Reduce its size to account
! 1211: ** for the portion used by the new allocation. */
! 1212: put2byte(&data[pc+2], x);
! 1213: }
! 1214: *pIdx = pc + x;
! 1215: return SQLITE_OK;
! 1216: }
! 1217: }
! 1218: }
! 1219:
! 1220: /* Check to make sure there is enough space in the gap to satisfy
! 1221: ** the allocation. If not, defragment.
! 1222: */
! 1223: testcase( gap+2+nByte==top );
! 1224: if( gap+2+nByte>top ){
! 1225: rc = defragmentPage(pPage);
! 1226: if( rc ) return rc;
! 1227: top = get2byteNotZero(&data[hdr+5]);
! 1228: assert( gap+nByte<=top );
! 1229: }
! 1230:
! 1231:
! 1232: /* Allocate memory from the gap in between the cell pointer array
! 1233: ** and the cell content area. The btreeInitPage() call has already
! 1234: ** validated the freelist. Given that the freelist is valid, there
! 1235: ** is no way that the allocation can extend off the end of the page.
! 1236: ** The assert() below verifies the previous sentence.
! 1237: */
! 1238: top -= nByte;
! 1239: put2byte(&data[hdr+5], top);
! 1240: assert( top+nByte <= (int)pPage->pBt->usableSize );
! 1241: *pIdx = top;
! 1242: return SQLITE_OK;
! 1243: }
! 1244:
! 1245: /*
! 1246: ** Return a section of the pPage->aData to the freelist.
! 1247: ** The first byte of the new free block is pPage->aDisk[start]
! 1248: ** and the size of the block is "size" bytes.
! 1249: **
! 1250: ** Most of the effort here is involved in coalesing adjacent
! 1251: ** free blocks into a single big free block.
! 1252: */
! 1253: static int freeSpace(MemPage *pPage, int start, int size){
! 1254: int addr, pbegin, hdr;
! 1255: int iLast; /* Largest possible freeblock offset */
! 1256: unsigned char *data = pPage->aData;
! 1257:
! 1258: assert( pPage->pBt!=0 );
! 1259: assert( sqlite3PagerIswriteable(pPage->pDbPage) );
! 1260: assert( start>=pPage->hdrOffset+6+pPage->childPtrSize );
! 1261: assert( (start + size) <= (int)pPage->pBt->usableSize );
! 1262: assert( sqlite3_mutex_held(pPage->pBt->mutex) );
! 1263: assert( size>=0 ); /* Minimum cell size is 4 */
! 1264:
! 1265: if( pPage->pBt->btsFlags & BTS_SECURE_DELETE ){
! 1266: /* Overwrite deleted information with zeros when the secure_delete
! 1267: ** option is enabled */
! 1268: memset(&data[start], 0, size);
! 1269: }
! 1270:
! 1271: /* Add the space back into the linked list of freeblocks. Note that
! 1272: ** even though the freeblock list was checked by btreeInitPage(),
! 1273: ** btreeInitPage() did not detect overlapping cells or
! 1274: ** freeblocks that overlapped cells. Nor does it detect when the
! 1275: ** cell content area exceeds the value in the page header. If these
! 1276: ** situations arise, then subsequent insert operations might corrupt
! 1277: ** the freelist. So we do need to check for corruption while scanning
! 1278: ** the freelist.
! 1279: */
! 1280: hdr = pPage->hdrOffset;
! 1281: addr = hdr + 1;
! 1282: iLast = pPage->pBt->usableSize - 4;
! 1283: assert( start<=iLast );
! 1284: while( (pbegin = get2byte(&data[addr]))<start && pbegin>0 ){
! 1285: if( pbegin<addr+4 ){
! 1286: return SQLITE_CORRUPT_BKPT;
! 1287: }
! 1288: addr = pbegin;
! 1289: }
! 1290: if( pbegin>iLast ){
! 1291: return SQLITE_CORRUPT_BKPT;
! 1292: }
! 1293: assert( pbegin>addr || pbegin==0 );
! 1294: put2byte(&data[addr], start);
! 1295: put2byte(&data[start], pbegin);
! 1296: put2byte(&data[start+2], size);
! 1297: pPage->nFree = pPage->nFree + (u16)size;
! 1298:
! 1299: /* Coalesce adjacent free blocks */
! 1300: addr = hdr + 1;
! 1301: while( (pbegin = get2byte(&data[addr]))>0 ){
! 1302: int pnext, psize, x;
! 1303: assert( pbegin>addr );
! 1304: assert( pbegin <= (int)pPage->pBt->usableSize-4 );
! 1305: pnext = get2byte(&data[pbegin]);
! 1306: psize = get2byte(&data[pbegin+2]);
! 1307: if( pbegin + psize + 3 >= pnext && pnext>0 ){
! 1308: int frag = pnext - (pbegin+psize);
! 1309: if( (frag<0) || (frag>(int)data[hdr+7]) ){
! 1310: return SQLITE_CORRUPT_BKPT;
! 1311: }
! 1312: data[hdr+7] -= (u8)frag;
! 1313: x = get2byte(&data[pnext]);
! 1314: put2byte(&data[pbegin], x);
! 1315: x = pnext + get2byte(&data[pnext+2]) - pbegin;
! 1316: put2byte(&data[pbegin+2], x);
! 1317: }else{
! 1318: addr = pbegin;
! 1319: }
! 1320: }
! 1321:
! 1322: /* If the cell content area begins with a freeblock, remove it. */
! 1323: if( data[hdr+1]==data[hdr+5] && data[hdr+2]==data[hdr+6] ){
! 1324: int top;
! 1325: pbegin = get2byte(&data[hdr+1]);
! 1326: memcpy(&data[hdr+1], &data[pbegin], 2);
! 1327: top = get2byte(&data[hdr+5]) + get2byte(&data[pbegin+2]);
! 1328: put2byte(&data[hdr+5], top);
! 1329: }
! 1330: assert( sqlite3PagerIswriteable(pPage->pDbPage) );
! 1331: return SQLITE_OK;
! 1332: }
! 1333:
! 1334: /*
! 1335: ** Decode the flags byte (the first byte of the header) for a page
! 1336: ** and initialize fields of the MemPage structure accordingly.
! 1337: **
! 1338: ** Only the following combinations are supported. Anything different
! 1339: ** indicates a corrupt database files:
! 1340: **
! 1341: ** PTF_ZERODATA
! 1342: ** PTF_ZERODATA | PTF_LEAF
! 1343: ** PTF_LEAFDATA | PTF_INTKEY
! 1344: ** PTF_LEAFDATA | PTF_INTKEY | PTF_LEAF
! 1345: */
! 1346: static int decodeFlags(MemPage *pPage, int flagByte){
! 1347: BtShared *pBt; /* A copy of pPage->pBt */
! 1348:
! 1349: assert( pPage->hdrOffset==(pPage->pgno==1 ? 100 : 0) );
! 1350: assert( sqlite3_mutex_held(pPage->pBt->mutex) );
! 1351: pPage->leaf = (u8)(flagByte>>3); assert( PTF_LEAF == 1<<3 );
! 1352: flagByte &= ~PTF_LEAF;
! 1353: pPage->childPtrSize = 4-4*pPage->leaf;
! 1354: pBt = pPage->pBt;
! 1355: if( flagByte==(PTF_LEAFDATA | PTF_INTKEY) ){
! 1356: pPage->intKey = 1;
! 1357: pPage->hasData = pPage->leaf;
! 1358: pPage->maxLocal = pBt->maxLeaf;
! 1359: pPage->minLocal = pBt->minLeaf;
! 1360: }else if( flagByte==PTF_ZERODATA ){
! 1361: pPage->intKey = 0;
! 1362: pPage->hasData = 0;
! 1363: pPage->maxLocal = pBt->maxLocal;
! 1364: pPage->minLocal = pBt->minLocal;
! 1365: }else{
! 1366: return SQLITE_CORRUPT_BKPT;
! 1367: }
! 1368: pPage->max1bytePayload = pBt->max1bytePayload;
! 1369: return SQLITE_OK;
! 1370: }
! 1371:
! 1372: /*
! 1373: ** Initialize the auxiliary information for a disk block.
! 1374: **
! 1375: ** Return SQLITE_OK on success. If we see that the page does
! 1376: ** not contain a well-formed database page, then return
! 1377: ** SQLITE_CORRUPT. Note that a return of SQLITE_OK does not
! 1378: ** guarantee that the page is well-formed. It only shows that
! 1379: ** we failed to detect any corruption.
! 1380: */
! 1381: static int btreeInitPage(MemPage *pPage){
! 1382:
! 1383: assert( pPage->pBt!=0 );
! 1384: assert( sqlite3_mutex_held(pPage->pBt->mutex) );
! 1385: assert( pPage->pgno==sqlite3PagerPagenumber(pPage->pDbPage) );
! 1386: assert( pPage == sqlite3PagerGetExtra(pPage->pDbPage) );
! 1387: assert( pPage->aData == sqlite3PagerGetData(pPage->pDbPage) );
! 1388:
! 1389: if( !pPage->isInit ){
! 1390: u16 pc; /* Address of a freeblock within pPage->aData[] */
! 1391: u8 hdr; /* Offset to beginning of page header */
! 1392: u8 *data; /* Equal to pPage->aData */
! 1393: BtShared *pBt; /* The main btree structure */
! 1394: int usableSize; /* Amount of usable space on each page */
! 1395: u16 cellOffset; /* Offset from start of page to first cell pointer */
! 1396: int nFree; /* Number of unused bytes on the page */
! 1397: int top; /* First byte of the cell content area */
! 1398: int iCellFirst; /* First allowable cell or freeblock offset */
! 1399: int iCellLast; /* Last possible cell or freeblock offset */
! 1400:
! 1401: pBt = pPage->pBt;
! 1402:
! 1403: hdr = pPage->hdrOffset;
! 1404: data = pPage->aData;
! 1405: if( decodeFlags(pPage, data[hdr]) ) return SQLITE_CORRUPT_BKPT;
! 1406: assert( pBt->pageSize>=512 && pBt->pageSize<=65536 );
! 1407: pPage->maskPage = (u16)(pBt->pageSize - 1);
! 1408: pPage->nOverflow = 0;
! 1409: usableSize = pBt->usableSize;
! 1410: pPage->cellOffset = cellOffset = hdr + 12 - 4*pPage->leaf;
! 1411: pPage->aDataEnd = &data[usableSize];
! 1412: pPage->aCellIdx = &data[cellOffset];
! 1413: top = get2byteNotZero(&data[hdr+5]);
! 1414: pPage->nCell = get2byte(&data[hdr+3]);
! 1415: if( pPage->nCell>MX_CELL(pBt) ){
! 1416: /* To many cells for a single page. The page must be corrupt */
! 1417: return SQLITE_CORRUPT_BKPT;
! 1418: }
! 1419: testcase( pPage->nCell==MX_CELL(pBt) );
! 1420:
! 1421: /* A malformed database page might cause us to read past the end
! 1422: ** of page when parsing a cell.
! 1423: **
! 1424: ** The following block of code checks early to see if a cell extends
! 1425: ** past the end of a page boundary and causes SQLITE_CORRUPT to be
! 1426: ** returned if it does.
! 1427: */
! 1428: iCellFirst = cellOffset + 2*pPage->nCell;
! 1429: iCellLast = usableSize - 4;
! 1430: #if defined(SQLITE_ENABLE_OVERSIZE_CELL_CHECK)
! 1431: {
! 1432: int i; /* Index into the cell pointer array */
! 1433: int sz; /* Size of a cell */
! 1434:
! 1435: if( !pPage->leaf ) iCellLast--;
! 1436: for(i=0; i<pPage->nCell; i++){
! 1437: pc = get2byte(&data[cellOffset+i*2]);
! 1438: testcase( pc==iCellFirst );
! 1439: testcase( pc==iCellLast );
! 1440: if( pc<iCellFirst || pc>iCellLast ){
! 1441: return SQLITE_CORRUPT_BKPT;
! 1442: }
! 1443: sz = cellSizePtr(pPage, &data[pc]);
! 1444: testcase( pc+sz==usableSize );
! 1445: if( pc+sz>usableSize ){
! 1446: return SQLITE_CORRUPT_BKPT;
! 1447: }
! 1448: }
! 1449: if( !pPage->leaf ) iCellLast++;
! 1450: }
! 1451: #endif
! 1452:
! 1453: /* Compute the total free space on the page */
! 1454: pc = get2byte(&data[hdr+1]);
! 1455: nFree = data[hdr+7] + top;
! 1456: while( pc>0 ){
! 1457: u16 next, size;
! 1458: if( pc<iCellFirst || pc>iCellLast ){
! 1459: /* Start of free block is off the page */
! 1460: return SQLITE_CORRUPT_BKPT;
! 1461: }
! 1462: next = get2byte(&data[pc]);
! 1463: size = get2byte(&data[pc+2]);
! 1464: if( (next>0 && next<=pc+size+3) || pc+size>usableSize ){
! 1465: /* Free blocks must be in ascending order. And the last byte of
! 1466: ** the free-block must lie on the database page. */
! 1467: return SQLITE_CORRUPT_BKPT;
! 1468: }
! 1469: nFree = nFree + size;
! 1470: pc = next;
! 1471: }
! 1472:
! 1473: /* At this point, nFree contains the sum of the offset to the start
! 1474: ** of the cell-content area plus the number of free bytes within
! 1475: ** the cell-content area. If this is greater than the usable-size
! 1476: ** of the page, then the page must be corrupted. This check also
! 1477: ** serves to verify that the offset to the start of the cell-content
! 1478: ** area, according to the page header, lies within the page.
! 1479: */
! 1480: if( nFree>usableSize ){
! 1481: return SQLITE_CORRUPT_BKPT;
! 1482: }
! 1483: pPage->nFree = (u16)(nFree - iCellFirst);
! 1484: pPage->isInit = 1;
! 1485: }
! 1486: return SQLITE_OK;
! 1487: }
! 1488:
! 1489: /*
! 1490: ** Set up a raw page so that it looks like a database page holding
! 1491: ** no entries.
! 1492: */
! 1493: static void zeroPage(MemPage *pPage, int flags){
! 1494: unsigned char *data = pPage->aData;
! 1495: BtShared *pBt = pPage->pBt;
! 1496: u8 hdr = pPage->hdrOffset;
! 1497: u16 first;
! 1498:
! 1499: assert( sqlite3PagerPagenumber(pPage->pDbPage)==pPage->pgno );
! 1500: assert( sqlite3PagerGetExtra(pPage->pDbPage) == (void*)pPage );
! 1501: assert( sqlite3PagerGetData(pPage->pDbPage) == data );
! 1502: assert( sqlite3PagerIswriteable(pPage->pDbPage) );
! 1503: assert( sqlite3_mutex_held(pBt->mutex) );
! 1504: if( pBt->btsFlags & BTS_SECURE_DELETE ){
! 1505: memset(&data[hdr], 0, pBt->usableSize - hdr);
! 1506: }
! 1507: data[hdr] = (char)flags;
! 1508: first = hdr + 8 + 4*((flags&PTF_LEAF)==0 ?1:0);
! 1509: memset(&data[hdr+1], 0, 4);
! 1510: data[hdr+7] = 0;
! 1511: put2byte(&data[hdr+5], pBt->usableSize);
! 1512: pPage->nFree = (u16)(pBt->usableSize - first);
! 1513: decodeFlags(pPage, flags);
! 1514: pPage->hdrOffset = hdr;
! 1515: pPage->cellOffset = first;
! 1516: pPage->aDataEnd = &data[pBt->usableSize];
! 1517: pPage->aCellIdx = &data[first];
! 1518: pPage->nOverflow = 0;
! 1519: assert( pBt->pageSize>=512 && pBt->pageSize<=65536 );
! 1520: pPage->maskPage = (u16)(pBt->pageSize - 1);
! 1521: pPage->nCell = 0;
! 1522: pPage->isInit = 1;
! 1523: }
! 1524:
! 1525:
! 1526: /*
! 1527: ** Convert a DbPage obtained from the pager into a MemPage used by
! 1528: ** the btree layer.
! 1529: */
! 1530: static MemPage *btreePageFromDbPage(DbPage *pDbPage, Pgno pgno, BtShared *pBt){
! 1531: MemPage *pPage = (MemPage*)sqlite3PagerGetExtra(pDbPage);
! 1532: pPage->aData = sqlite3PagerGetData(pDbPage);
! 1533: pPage->pDbPage = pDbPage;
! 1534: pPage->pBt = pBt;
! 1535: pPage->pgno = pgno;
! 1536: pPage->hdrOffset = pPage->pgno==1 ? 100 : 0;
! 1537: return pPage;
! 1538: }
! 1539:
! 1540: /*
! 1541: ** Get a page from the pager. Initialize the MemPage.pBt and
! 1542: ** MemPage.aData elements if needed.
! 1543: **
! 1544: ** If the noContent flag is set, it means that we do not care about
! 1545: ** the content of the page at this time. So do not go to the disk
! 1546: ** to fetch the content. Just fill in the content with zeros for now.
! 1547: ** If in the future we call sqlite3PagerWrite() on this page, that
! 1548: ** means we have started to be concerned about content and the disk
! 1549: ** read should occur at that point.
! 1550: */
! 1551: static int btreeGetPage(
! 1552: BtShared *pBt, /* The btree */
! 1553: Pgno pgno, /* Number of the page to fetch */
! 1554: MemPage **ppPage, /* Return the page in this parameter */
! 1555: int noContent /* Do not load page content if true */
! 1556: ){
! 1557: int rc;
! 1558: DbPage *pDbPage;
! 1559:
! 1560: assert( sqlite3_mutex_held(pBt->mutex) );
! 1561: rc = sqlite3PagerAcquire(pBt->pPager, pgno, (DbPage**)&pDbPage, noContent);
! 1562: if( rc ) return rc;
! 1563: *ppPage = btreePageFromDbPage(pDbPage, pgno, pBt);
! 1564: return SQLITE_OK;
! 1565: }
! 1566:
! 1567: /*
! 1568: ** Retrieve a page from the pager cache. If the requested page is not
! 1569: ** already in the pager cache return NULL. Initialize the MemPage.pBt and
! 1570: ** MemPage.aData elements if needed.
! 1571: */
! 1572: static MemPage *btreePageLookup(BtShared *pBt, Pgno pgno){
! 1573: DbPage *pDbPage;
! 1574: assert( sqlite3_mutex_held(pBt->mutex) );
! 1575: pDbPage = sqlite3PagerLookup(pBt->pPager, pgno);
! 1576: if( pDbPage ){
! 1577: return btreePageFromDbPage(pDbPage, pgno, pBt);
! 1578: }
! 1579: return 0;
! 1580: }
! 1581:
! 1582: /*
! 1583: ** Return the size of the database file in pages. If there is any kind of
! 1584: ** error, return ((unsigned int)-1).
! 1585: */
! 1586: static Pgno btreePagecount(BtShared *pBt){
! 1587: return pBt->nPage;
! 1588: }
! 1589: u32 sqlite3BtreeLastPage(Btree *p){
! 1590: assert( sqlite3BtreeHoldsMutex(p) );
! 1591: assert( ((p->pBt->nPage)&0x8000000)==0 );
! 1592: return (int)btreePagecount(p->pBt);
! 1593: }
! 1594:
! 1595: /*
! 1596: ** Get a page from the pager and initialize it. This routine is just a
! 1597: ** convenience wrapper around separate calls to btreeGetPage() and
! 1598: ** btreeInitPage().
! 1599: **
! 1600: ** If an error occurs, then the value *ppPage is set to is undefined. It
! 1601: ** may remain unchanged, or it may be set to an invalid value.
! 1602: */
! 1603: static int getAndInitPage(
! 1604: BtShared *pBt, /* The database file */
! 1605: Pgno pgno, /* Number of the page to get */
! 1606: MemPage **ppPage /* Write the page pointer here */
! 1607: ){
! 1608: int rc;
! 1609: assert( sqlite3_mutex_held(pBt->mutex) );
! 1610:
! 1611: if( pgno>btreePagecount(pBt) ){
! 1612: rc = SQLITE_CORRUPT_BKPT;
! 1613: }else{
! 1614: rc = btreeGetPage(pBt, pgno, ppPage, 0);
! 1615: if( rc==SQLITE_OK ){
! 1616: rc = btreeInitPage(*ppPage);
! 1617: if( rc!=SQLITE_OK ){
! 1618: releasePage(*ppPage);
! 1619: }
! 1620: }
! 1621: }
! 1622:
! 1623: testcase( pgno==0 );
! 1624: assert( pgno!=0 || rc==SQLITE_CORRUPT );
! 1625: return rc;
! 1626: }
! 1627:
! 1628: /*
! 1629: ** Release a MemPage. This should be called once for each prior
! 1630: ** call to btreeGetPage.
! 1631: */
! 1632: static void releasePage(MemPage *pPage){
! 1633: if( pPage ){
! 1634: assert( pPage->aData );
! 1635: assert( pPage->pBt );
! 1636: assert( sqlite3PagerGetExtra(pPage->pDbPage) == (void*)pPage );
! 1637: assert( sqlite3PagerGetData(pPage->pDbPage)==pPage->aData );
! 1638: assert( sqlite3_mutex_held(pPage->pBt->mutex) );
! 1639: sqlite3PagerUnref(pPage->pDbPage);
! 1640: }
! 1641: }
! 1642:
! 1643: /*
! 1644: ** During a rollback, when the pager reloads information into the cache
! 1645: ** so that the cache is restored to its original state at the start of
! 1646: ** the transaction, for each page restored this routine is called.
! 1647: **
! 1648: ** This routine needs to reset the extra data section at the end of the
! 1649: ** page to agree with the restored data.
! 1650: */
! 1651: static void pageReinit(DbPage *pData){
! 1652: MemPage *pPage;
! 1653: pPage = (MemPage *)sqlite3PagerGetExtra(pData);
! 1654: assert( sqlite3PagerPageRefcount(pData)>0 );
! 1655: if( pPage->isInit ){
! 1656: assert( sqlite3_mutex_held(pPage->pBt->mutex) );
! 1657: pPage->isInit = 0;
! 1658: if( sqlite3PagerPageRefcount(pData)>1 ){
! 1659: /* pPage might not be a btree page; it might be an overflow page
! 1660: ** or ptrmap page or a free page. In those cases, the following
! 1661: ** call to btreeInitPage() will likely return SQLITE_CORRUPT.
! 1662: ** But no harm is done by this. And it is very important that
! 1663: ** btreeInitPage() be called on every btree page so we make
! 1664: ** the call for every page that comes in for re-initing. */
! 1665: btreeInitPage(pPage);
! 1666: }
! 1667: }
! 1668: }
! 1669:
! 1670: /*
! 1671: ** Invoke the busy handler for a btree.
! 1672: */
! 1673: static int btreeInvokeBusyHandler(void *pArg){
! 1674: BtShared *pBt = (BtShared*)pArg;
! 1675: assert( pBt->db );
! 1676: assert( sqlite3_mutex_held(pBt->db->mutex) );
! 1677: return sqlite3InvokeBusyHandler(&pBt->db->busyHandler);
! 1678: }
! 1679:
! 1680: /*
! 1681: ** Open a database file.
! 1682: **
! 1683: ** zFilename is the name of the database file. If zFilename is NULL
! 1684: ** then an ephemeral database is created. The ephemeral database might
! 1685: ** be exclusively in memory, or it might use a disk-based memory cache.
! 1686: ** Either way, the ephemeral database will be automatically deleted
! 1687: ** when sqlite3BtreeClose() is called.
! 1688: **
! 1689: ** If zFilename is ":memory:" then an in-memory database is created
! 1690: ** that is automatically destroyed when it is closed.
! 1691: **
! 1692: ** The "flags" parameter is a bitmask that might contain bits
! 1693: ** BTREE_OMIT_JOURNAL and/or BTREE_NO_READLOCK. The BTREE_NO_READLOCK
! 1694: ** bit is also set if the SQLITE_NoReadlock flags is set in db->flags.
! 1695: ** These flags are passed through into sqlite3PagerOpen() and must
! 1696: ** be the same values as PAGER_OMIT_JOURNAL and PAGER_NO_READLOCK.
! 1697: **
! 1698: ** If the database is already opened in the same database connection
! 1699: ** and we are in shared cache mode, then the open will fail with an
! 1700: ** SQLITE_CONSTRAINT error. We cannot allow two or more BtShared
! 1701: ** objects in the same database connection since doing so will lead
! 1702: ** to problems with locking.
! 1703: */
! 1704: int sqlite3BtreeOpen(
! 1705: sqlite3_vfs *pVfs, /* VFS to use for this b-tree */
! 1706: const char *zFilename, /* Name of the file containing the BTree database */
! 1707: sqlite3 *db, /* Associated database handle */
! 1708: Btree **ppBtree, /* Pointer to new Btree object written here */
! 1709: int flags, /* Options */
! 1710: int vfsFlags /* Flags passed through to sqlite3_vfs.xOpen() */
! 1711: ){
! 1712: BtShared *pBt = 0; /* Shared part of btree structure */
! 1713: Btree *p; /* Handle to return */
! 1714: sqlite3_mutex *mutexOpen = 0; /* Prevents a race condition. Ticket #3537 */
! 1715: int rc = SQLITE_OK; /* Result code from this function */
! 1716: u8 nReserve; /* Byte of unused space on each page */
! 1717: unsigned char zDbHeader[100]; /* Database header content */
! 1718:
! 1719: /* True if opening an ephemeral, temporary database */
! 1720: const int isTempDb = zFilename==0 || zFilename[0]==0;
! 1721:
! 1722: /* Set the variable isMemdb to true for an in-memory database, or
! 1723: ** false for a file-based database.
! 1724: */
! 1725: #ifdef SQLITE_OMIT_MEMORYDB
! 1726: const int isMemdb = 0;
! 1727: #else
! 1728: const int isMemdb = (zFilename && strcmp(zFilename, ":memory:")==0)
! 1729: || (isTempDb && sqlite3TempInMemory(db));
! 1730: #endif
! 1731:
! 1732: assert( db!=0 );
! 1733: assert( pVfs!=0 );
! 1734: assert( sqlite3_mutex_held(db->mutex) );
! 1735: assert( (flags&0xff)==flags ); /* flags fit in 8 bits */
! 1736:
! 1737: /* Only a BTREE_SINGLE database can be BTREE_UNORDERED */
! 1738: assert( (flags & BTREE_UNORDERED)==0 || (flags & BTREE_SINGLE)!=0 );
! 1739:
! 1740: /* A BTREE_SINGLE database is always a temporary and/or ephemeral */
! 1741: assert( (flags & BTREE_SINGLE)==0 || isTempDb );
! 1742:
! 1743: if( db->flags & SQLITE_NoReadlock ){
! 1744: flags |= BTREE_NO_READLOCK;
! 1745: }
! 1746: if( isMemdb ){
! 1747: flags |= BTREE_MEMORY;
! 1748: }
! 1749: if( (vfsFlags & SQLITE_OPEN_MAIN_DB)!=0 && (isMemdb || isTempDb) ){
! 1750: vfsFlags = (vfsFlags & ~SQLITE_OPEN_MAIN_DB) | SQLITE_OPEN_TEMP_DB;
! 1751: }
! 1752: p = sqlite3MallocZero(sizeof(Btree));
! 1753: if( !p ){
! 1754: return SQLITE_NOMEM;
! 1755: }
! 1756: p->inTrans = TRANS_NONE;
! 1757: p->db = db;
! 1758: #ifndef SQLITE_OMIT_SHARED_CACHE
! 1759: p->lock.pBtree = p;
! 1760: p->lock.iTable = 1;
! 1761: #endif
! 1762:
! 1763: #if !defined(SQLITE_OMIT_SHARED_CACHE) && !defined(SQLITE_OMIT_DISKIO)
! 1764: /*
! 1765: ** If this Btree is a candidate for shared cache, try to find an
! 1766: ** existing BtShared object that we can share with
! 1767: */
! 1768: if( isMemdb==0 && isTempDb==0 ){
! 1769: if( vfsFlags & SQLITE_OPEN_SHAREDCACHE ){
! 1770: int nFullPathname = pVfs->mxPathname+1;
! 1771: char *zFullPathname = sqlite3Malloc(nFullPathname);
! 1772: MUTEX_LOGIC( sqlite3_mutex *mutexShared; )
! 1773: p->sharable = 1;
! 1774: if( !zFullPathname ){
! 1775: sqlite3_free(p);
! 1776: return SQLITE_NOMEM;
! 1777: }
! 1778: rc = sqlite3OsFullPathname(pVfs, zFilename, nFullPathname, zFullPathname);
! 1779: if( rc ){
! 1780: sqlite3_free(zFullPathname);
! 1781: sqlite3_free(p);
! 1782: return rc;
! 1783: }
! 1784: #if SQLITE_THREADSAFE
! 1785: mutexOpen = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_OPEN);
! 1786: sqlite3_mutex_enter(mutexOpen);
! 1787: mutexShared = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER);
! 1788: sqlite3_mutex_enter(mutexShared);
! 1789: #endif
! 1790: for(pBt=GLOBAL(BtShared*,sqlite3SharedCacheList); pBt; pBt=pBt->pNext){
! 1791: assert( pBt->nRef>0 );
! 1792: if( 0==strcmp(zFullPathname, sqlite3PagerFilename(pBt->pPager))
! 1793: && sqlite3PagerVfs(pBt->pPager)==pVfs ){
! 1794: int iDb;
! 1795: for(iDb=db->nDb-1; iDb>=0; iDb--){
! 1796: Btree *pExisting = db->aDb[iDb].pBt;
! 1797: if( pExisting && pExisting->pBt==pBt ){
! 1798: sqlite3_mutex_leave(mutexShared);
! 1799: sqlite3_mutex_leave(mutexOpen);
! 1800: sqlite3_free(zFullPathname);
! 1801: sqlite3_free(p);
! 1802: return SQLITE_CONSTRAINT;
! 1803: }
! 1804: }
! 1805: p->pBt = pBt;
! 1806: pBt->nRef++;
! 1807: break;
! 1808: }
! 1809: }
! 1810: sqlite3_mutex_leave(mutexShared);
! 1811: sqlite3_free(zFullPathname);
! 1812: }
! 1813: #ifdef SQLITE_DEBUG
! 1814: else{
! 1815: /* In debug mode, we mark all persistent databases as sharable
! 1816: ** even when they are not. This exercises the locking code and
! 1817: ** gives more opportunity for asserts(sqlite3_mutex_held())
! 1818: ** statements to find locking problems.
! 1819: */
! 1820: p->sharable = 1;
! 1821: }
! 1822: #endif
! 1823: }
! 1824: #endif
! 1825: if( pBt==0 ){
! 1826: /*
! 1827: ** The following asserts make sure that structures used by the btree are
! 1828: ** the right size. This is to guard against size changes that result
! 1829: ** when compiling on a different architecture.
! 1830: */
! 1831: assert( sizeof(i64)==8 || sizeof(i64)==4 );
! 1832: assert( sizeof(u64)==8 || sizeof(u64)==4 );
! 1833: assert( sizeof(u32)==4 );
! 1834: assert( sizeof(u16)==2 );
! 1835: assert( sizeof(Pgno)==4 );
! 1836:
! 1837: pBt = sqlite3MallocZero( sizeof(*pBt) );
! 1838: if( pBt==0 ){
! 1839: rc = SQLITE_NOMEM;
! 1840: goto btree_open_out;
! 1841: }
! 1842: rc = sqlite3PagerOpen(pVfs, &pBt->pPager, zFilename,
! 1843: EXTRA_SIZE, flags, vfsFlags, pageReinit);
! 1844: if( rc==SQLITE_OK ){
! 1845: rc = sqlite3PagerReadFileheader(pBt->pPager,sizeof(zDbHeader),zDbHeader);
! 1846: }
! 1847: if( rc!=SQLITE_OK ){
! 1848: goto btree_open_out;
! 1849: }
! 1850: pBt->openFlags = (u8)flags;
! 1851: pBt->db = db;
! 1852: sqlite3PagerSetBusyhandler(pBt->pPager, btreeInvokeBusyHandler, pBt);
! 1853: p->pBt = pBt;
! 1854:
! 1855: pBt->pCursor = 0;
! 1856: pBt->pPage1 = 0;
! 1857: if( sqlite3PagerIsreadonly(pBt->pPager) ) pBt->btsFlags |= BTS_READ_ONLY;
! 1858: #ifdef SQLITE_SECURE_DELETE
! 1859: pBt->btsFlags |= BTS_SECURE_DELETE;
! 1860: #endif
! 1861: pBt->pageSize = (zDbHeader[16]<<8) | (zDbHeader[17]<<16);
! 1862: if( pBt->pageSize<512 || pBt->pageSize>SQLITE_MAX_PAGE_SIZE
! 1863: || ((pBt->pageSize-1)&pBt->pageSize)!=0 ){
! 1864: pBt->pageSize = 0;
! 1865: #ifndef SQLITE_OMIT_AUTOVACUUM
! 1866: /* If the magic name ":memory:" will create an in-memory database, then
! 1867: ** leave the autoVacuum mode at 0 (do not auto-vacuum), even if
! 1868: ** SQLITE_DEFAULT_AUTOVACUUM is true. On the other hand, if
! 1869: ** SQLITE_OMIT_MEMORYDB has been defined, then ":memory:" is just a
! 1870: ** regular file-name. In this case the auto-vacuum applies as per normal.
! 1871: */
! 1872: if( zFilename && !isMemdb ){
! 1873: pBt->autoVacuum = (SQLITE_DEFAULT_AUTOVACUUM ? 1 : 0);
! 1874: pBt->incrVacuum = (SQLITE_DEFAULT_AUTOVACUUM==2 ? 1 : 0);
! 1875: }
! 1876: #endif
! 1877: nReserve = 0;
! 1878: }else{
! 1879: nReserve = zDbHeader[20];
! 1880: pBt->btsFlags |= BTS_PAGESIZE_FIXED;
! 1881: #ifndef SQLITE_OMIT_AUTOVACUUM
! 1882: pBt->autoVacuum = (get4byte(&zDbHeader[36 + 4*4])?1:0);
! 1883: pBt->incrVacuum = (get4byte(&zDbHeader[36 + 7*4])?1:0);
! 1884: #endif
! 1885: }
! 1886: rc = sqlite3PagerSetPagesize(pBt->pPager, &pBt->pageSize, nReserve);
! 1887: if( rc ) goto btree_open_out;
! 1888: pBt->usableSize = pBt->pageSize - nReserve;
! 1889: assert( (pBt->pageSize & 7)==0 ); /* 8-byte alignment of pageSize */
! 1890:
! 1891: #if !defined(SQLITE_OMIT_SHARED_CACHE) && !defined(SQLITE_OMIT_DISKIO)
! 1892: /* Add the new BtShared object to the linked list sharable BtShareds.
! 1893: */
! 1894: if( p->sharable ){
! 1895: MUTEX_LOGIC( sqlite3_mutex *mutexShared; )
! 1896: pBt->nRef = 1;
! 1897: MUTEX_LOGIC( mutexShared = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER);)
! 1898: if( SQLITE_THREADSAFE && sqlite3GlobalConfig.bCoreMutex ){
! 1899: pBt->mutex = sqlite3MutexAlloc(SQLITE_MUTEX_FAST);
! 1900: if( pBt->mutex==0 ){
! 1901: rc = SQLITE_NOMEM;
! 1902: db->mallocFailed = 0;
! 1903: goto btree_open_out;
! 1904: }
! 1905: }
! 1906: sqlite3_mutex_enter(mutexShared);
! 1907: pBt->pNext = GLOBAL(BtShared*,sqlite3SharedCacheList);
! 1908: GLOBAL(BtShared*,sqlite3SharedCacheList) = pBt;
! 1909: sqlite3_mutex_leave(mutexShared);
! 1910: }
! 1911: #endif
! 1912: }
! 1913:
! 1914: #if !defined(SQLITE_OMIT_SHARED_CACHE) && !defined(SQLITE_OMIT_DISKIO)
! 1915: /* If the new Btree uses a sharable pBtShared, then link the new
! 1916: ** Btree into the list of all sharable Btrees for the same connection.
! 1917: ** The list is kept in ascending order by pBt address.
! 1918: */
! 1919: if( p->sharable ){
! 1920: int i;
! 1921: Btree *pSib;
! 1922: for(i=0; i<db->nDb; i++){
! 1923: if( (pSib = db->aDb[i].pBt)!=0 && pSib->sharable ){
! 1924: while( pSib->pPrev ){ pSib = pSib->pPrev; }
! 1925: if( p->pBt<pSib->pBt ){
! 1926: p->pNext = pSib;
! 1927: p->pPrev = 0;
! 1928: pSib->pPrev = p;
! 1929: }else{
! 1930: while( pSib->pNext && pSib->pNext->pBt<p->pBt ){
! 1931: pSib = pSib->pNext;
! 1932: }
! 1933: p->pNext = pSib->pNext;
! 1934: p->pPrev = pSib;
! 1935: if( p->pNext ){
! 1936: p->pNext->pPrev = p;
! 1937: }
! 1938: pSib->pNext = p;
! 1939: }
! 1940: break;
! 1941: }
! 1942: }
! 1943: }
! 1944: #endif
! 1945: *ppBtree = p;
! 1946:
! 1947: btree_open_out:
! 1948: if( rc!=SQLITE_OK ){
! 1949: if( pBt && pBt->pPager ){
! 1950: sqlite3PagerClose(pBt->pPager);
! 1951: }
! 1952: sqlite3_free(pBt);
! 1953: sqlite3_free(p);
! 1954: *ppBtree = 0;
! 1955: }else{
! 1956: /* If the B-Tree was successfully opened, set the pager-cache size to the
! 1957: ** default value. Except, when opening on an existing shared pager-cache,
! 1958: ** do not change the pager-cache size.
! 1959: */
! 1960: if( sqlite3BtreeSchema(p, 0, 0)==0 ){
! 1961: sqlite3PagerSetCachesize(p->pBt->pPager, SQLITE_DEFAULT_CACHE_SIZE);
! 1962: }
! 1963: }
! 1964: if( mutexOpen ){
! 1965: assert( sqlite3_mutex_held(mutexOpen) );
! 1966: sqlite3_mutex_leave(mutexOpen);
! 1967: }
! 1968: return rc;
! 1969: }
! 1970:
! 1971: /*
! 1972: ** Decrement the BtShared.nRef counter. When it reaches zero,
! 1973: ** remove the BtShared structure from the sharing list. Return
! 1974: ** true if the BtShared.nRef counter reaches zero and return
! 1975: ** false if it is still positive.
! 1976: */
! 1977: static int removeFromSharingList(BtShared *pBt){
! 1978: #ifndef SQLITE_OMIT_SHARED_CACHE
! 1979: MUTEX_LOGIC( sqlite3_mutex *pMaster; )
! 1980: BtShared *pList;
! 1981: int removed = 0;
! 1982:
! 1983: assert( sqlite3_mutex_notheld(pBt->mutex) );
! 1984: MUTEX_LOGIC( pMaster = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); )
! 1985: sqlite3_mutex_enter(pMaster);
! 1986: pBt->nRef--;
! 1987: if( pBt->nRef<=0 ){
! 1988: if( GLOBAL(BtShared*,sqlite3SharedCacheList)==pBt ){
! 1989: GLOBAL(BtShared*,sqlite3SharedCacheList) = pBt->pNext;
! 1990: }else{
! 1991: pList = GLOBAL(BtShared*,sqlite3SharedCacheList);
! 1992: while( ALWAYS(pList) && pList->pNext!=pBt ){
! 1993: pList=pList->pNext;
! 1994: }
! 1995: if( ALWAYS(pList) ){
! 1996: pList->pNext = pBt->pNext;
! 1997: }
! 1998: }
! 1999: if( SQLITE_THREADSAFE ){
! 2000: sqlite3_mutex_free(pBt->mutex);
! 2001: }
! 2002: removed = 1;
! 2003: }
! 2004: sqlite3_mutex_leave(pMaster);
! 2005: return removed;
! 2006: #else
! 2007: return 1;
! 2008: #endif
! 2009: }
! 2010:
! 2011: /*
! 2012: ** Make sure pBt->pTmpSpace points to an allocation of
! 2013: ** MX_CELL_SIZE(pBt) bytes.
! 2014: */
! 2015: static void allocateTempSpace(BtShared *pBt){
! 2016: if( !pBt->pTmpSpace ){
! 2017: pBt->pTmpSpace = sqlite3PageMalloc( pBt->pageSize );
! 2018: }
! 2019: }
! 2020:
! 2021: /*
! 2022: ** Free the pBt->pTmpSpace allocation
! 2023: */
! 2024: static void freeTempSpace(BtShared *pBt){
! 2025: sqlite3PageFree( pBt->pTmpSpace);
! 2026: pBt->pTmpSpace = 0;
! 2027: }
! 2028:
! 2029: /*
! 2030: ** Close an open database and invalidate all cursors.
! 2031: */
! 2032: int sqlite3BtreeClose(Btree *p){
! 2033: BtShared *pBt = p->pBt;
! 2034: BtCursor *pCur;
! 2035:
! 2036: /* Close all cursors opened via this handle. */
! 2037: assert( sqlite3_mutex_held(p->db->mutex) );
! 2038: sqlite3BtreeEnter(p);
! 2039: pCur = pBt->pCursor;
! 2040: while( pCur ){
! 2041: BtCursor *pTmp = pCur;
! 2042: pCur = pCur->pNext;
! 2043: if( pTmp->pBtree==p ){
! 2044: sqlite3BtreeCloseCursor(pTmp);
! 2045: }
! 2046: }
! 2047:
! 2048: /* Rollback any active transaction and free the handle structure.
! 2049: ** The call to sqlite3BtreeRollback() drops any table-locks held by
! 2050: ** this handle.
! 2051: */
! 2052: sqlite3BtreeRollback(p);
! 2053: sqlite3BtreeLeave(p);
! 2054:
! 2055: /* If there are still other outstanding references to the shared-btree
! 2056: ** structure, return now. The remainder of this procedure cleans
! 2057: ** up the shared-btree.
! 2058: */
! 2059: assert( p->wantToLock==0 && p->locked==0 );
! 2060: if( !p->sharable || removeFromSharingList(pBt) ){
! 2061: /* The pBt is no longer on the sharing list, so we can access
! 2062: ** it without having to hold the mutex.
! 2063: **
! 2064: ** Clean out and delete the BtShared object.
! 2065: */
! 2066: assert( !pBt->pCursor );
! 2067: sqlite3PagerClose(pBt->pPager);
! 2068: if( pBt->xFreeSchema && pBt->pSchema ){
! 2069: pBt->xFreeSchema(pBt->pSchema);
! 2070: }
! 2071: sqlite3DbFree(0, pBt->pSchema);
! 2072: freeTempSpace(pBt);
! 2073: sqlite3_free(pBt);
! 2074: }
! 2075:
! 2076: #ifndef SQLITE_OMIT_SHARED_CACHE
! 2077: assert( p->wantToLock==0 );
! 2078: assert( p->locked==0 );
! 2079: if( p->pPrev ) p->pPrev->pNext = p->pNext;
! 2080: if( p->pNext ) p->pNext->pPrev = p->pPrev;
! 2081: #endif
! 2082:
! 2083: sqlite3_free(p);
! 2084: return SQLITE_OK;
! 2085: }
! 2086:
! 2087: /*
! 2088: ** Change the limit on the number of pages allowed in the cache.
! 2089: **
! 2090: ** The maximum number of cache pages is set to the absolute
! 2091: ** value of mxPage. If mxPage is negative, the pager will
! 2092: ** operate asynchronously - it will not stop to do fsync()s
! 2093: ** to insure data is written to the disk surface before
! 2094: ** continuing. Transactions still work if synchronous is off,
! 2095: ** and the database cannot be corrupted if this program
! 2096: ** crashes. But if the operating system crashes or there is
! 2097: ** an abrupt power failure when synchronous is off, the database
! 2098: ** could be left in an inconsistent and unrecoverable state.
! 2099: ** Synchronous is on by default so database corruption is not
! 2100: ** normally a worry.
! 2101: */
! 2102: int sqlite3BtreeSetCacheSize(Btree *p, int mxPage){
! 2103: BtShared *pBt = p->pBt;
! 2104: assert( sqlite3_mutex_held(p->db->mutex) );
! 2105: sqlite3BtreeEnter(p);
! 2106: sqlite3PagerSetCachesize(pBt->pPager, mxPage);
! 2107: sqlite3BtreeLeave(p);
! 2108: return SQLITE_OK;
! 2109: }
! 2110:
! 2111: /*
! 2112: ** Change the way data is synced to disk in order to increase or decrease
! 2113: ** how well the database resists damage due to OS crashes and power
! 2114: ** failures. Level 1 is the same as asynchronous (no syncs() occur and
! 2115: ** there is a high probability of damage) Level 2 is the default. There
! 2116: ** is a very low but non-zero probability of damage. Level 3 reduces the
! 2117: ** probability of damage to near zero but with a write performance reduction.
! 2118: */
! 2119: #ifndef SQLITE_OMIT_PAGER_PRAGMAS
! 2120: int sqlite3BtreeSetSafetyLevel(
! 2121: Btree *p, /* The btree to set the safety level on */
! 2122: int level, /* PRAGMA synchronous. 1=OFF, 2=NORMAL, 3=FULL */
! 2123: int fullSync, /* PRAGMA fullfsync. */
! 2124: int ckptFullSync /* PRAGMA checkpoint_fullfync */
! 2125: ){
! 2126: BtShared *pBt = p->pBt;
! 2127: assert( sqlite3_mutex_held(p->db->mutex) );
! 2128: assert( level>=1 && level<=3 );
! 2129: sqlite3BtreeEnter(p);
! 2130: sqlite3PagerSetSafetyLevel(pBt->pPager, level, fullSync, ckptFullSync);
! 2131: sqlite3BtreeLeave(p);
! 2132: return SQLITE_OK;
! 2133: }
! 2134: #endif
! 2135:
! 2136: /*
! 2137: ** Return TRUE if the given btree is set to safety level 1. In other
! 2138: ** words, return TRUE if no sync() occurs on the disk files.
! 2139: */
! 2140: int sqlite3BtreeSyncDisabled(Btree *p){
! 2141: BtShared *pBt = p->pBt;
! 2142: int rc;
! 2143: assert( sqlite3_mutex_held(p->db->mutex) );
! 2144: sqlite3BtreeEnter(p);
! 2145: assert( pBt && pBt->pPager );
! 2146: rc = sqlite3PagerNosync(pBt->pPager);
! 2147: sqlite3BtreeLeave(p);
! 2148: return rc;
! 2149: }
! 2150:
! 2151: /*
! 2152: ** Change the default pages size and the number of reserved bytes per page.
! 2153: ** Or, if the page size has already been fixed, return SQLITE_READONLY
! 2154: ** without changing anything.
! 2155: **
! 2156: ** The page size must be a power of 2 between 512 and 65536. If the page
! 2157: ** size supplied does not meet this constraint then the page size is not
! 2158: ** changed.
! 2159: **
! 2160: ** Page sizes are constrained to be a power of two so that the region
! 2161: ** of the database file used for locking (beginning at PENDING_BYTE,
! 2162: ** the first byte past the 1GB boundary, 0x40000000) needs to occur
! 2163: ** at the beginning of a page.
! 2164: **
! 2165: ** If parameter nReserve is less than zero, then the number of reserved
! 2166: ** bytes per page is left unchanged.
! 2167: **
! 2168: ** If the iFix!=0 then the BTS_PAGESIZE_FIXED flag is set so that the page size
! 2169: ** and autovacuum mode can no longer be changed.
! 2170: */
! 2171: int sqlite3BtreeSetPageSize(Btree *p, int pageSize, int nReserve, int iFix){
! 2172: int rc = SQLITE_OK;
! 2173: BtShared *pBt = p->pBt;
! 2174: assert( nReserve>=-1 && nReserve<=255 );
! 2175: sqlite3BtreeEnter(p);
! 2176: if( pBt->btsFlags & BTS_PAGESIZE_FIXED ){
! 2177: sqlite3BtreeLeave(p);
! 2178: return SQLITE_READONLY;
! 2179: }
! 2180: if( nReserve<0 ){
! 2181: nReserve = pBt->pageSize - pBt->usableSize;
! 2182: }
! 2183: assert( nReserve>=0 && nReserve<=255 );
! 2184: if( pageSize>=512 && pageSize<=SQLITE_MAX_PAGE_SIZE &&
! 2185: ((pageSize-1)&pageSize)==0 ){
! 2186: assert( (pageSize & 7)==0 );
! 2187: assert( !pBt->pPage1 && !pBt->pCursor );
! 2188: pBt->pageSize = (u32)pageSize;
! 2189: freeTempSpace(pBt);
! 2190: }
! 2191: rc = sqlite3PagerSetPagesize(pBt->pPager, &pBt->pageSize, nReserve);
! 2192: pBt->usableSize = pBt->pageSize - (u16)nReserve;
! 2193: if( iFix ) pBt->btsFlags |= BTS_PAGESIZE_FIXED;
! 2194: sqlite3BtreeLeave(p);
! 2195: return rc;
! 2196: }
! 2197:
! 2198: /*
! 2199: ** Return the currently defined page size
! 2200: */
! 2201: int sqlite3BtreeGetPageSize(Btree *p){
! 2202: return p->pBt->pageSize;
! 2203: }
! 2204:
! 2205: #if !defined(SQLITE_OMIT_PAGER_PRAGMAS) || !defined(SQLITE_OMIT_VACUUM)
! 2206: /*
! 2207: ** Return the number of bytes of space at the end of every page that
! 2208: ** are intentually left unused. This is the "reserved" space that is
! 2209: ** sometimes used by extensions.
! 2210: */
! 2211: int sqlite3BtreeGetReserve(Btree *p){
! 2212: int n;
! 2213: sqlite3BtreeEnter(p);
! 2214: n = p->pBt->pageSize - p->pBt->usableSize;
! 2215: sqlite3BtreeLeave(p);
! 2216: return n;
! 2217: }
! 2218:
! 2219: /*
! 2220: ** Set the maximum page count for a database if mxPage is positive.
! 2221: ** No changes are made if mxPage is 0 or negative.
! 2222: ** Regardless of the value of mxPage, return the maximum page count.
! 2223: */
! 2224: int sqlite3BtreeMaxPageCount(Btree *p, int mxPage){
! 2225: int n;
! 2226: sqlite3BtreeEnter(p);
! 2227: n = sqlite3PagerMaxPageCount(p->pBt->pPager, mxPage);
! 2228: sqlite3BtreeLeave(p);
! 2229: return n;
! 2230: }
! 2231:
! 2232: /*
! 2233: ** Set the BTS_SECURE_DELETE flag if newFlag is 0 or 1. If newFlag is -1,
! 2234: ** then make no changes. Always return the value of the BTS_SECURE_DELETE
! 2235: ** setting after the change.
! 2236: */
! 2237: int sqlite3BtreeSecureDelete(Btree *p, int newFlag){
! 2238: int b;
! 2239: if( p==0 ) return 0;
! 2240: sqlite3BtreeEnter(p);
! 2241: if( newFlag>=0 ){
! 2242: p->pBt->btsFlags &= ~BTS_SECURE_DELETE;
! 2243: if( newFlag ) p->pBt->btsFlags |= BTS_SECURE_DELETE;
! 2244: }
! 2245: b = (p->pBt->btsFlags & BTS_SECURE_DELETE)!=0;
! 2246: sqlite3BtreeLeave(p);
! 2247: return b;
! 2248: }
! 2249: #endif /* !defined(SQLITE_OMIT_PAGER_PRAGMAS) || !defined(SQLITE_OMIT_VACUUM) */
! 2250:
! 2251: /*
! 2252: ** Change the 'auto-vacuum' property of the database. If the 'autoVacuum'
! 2253: ** parameter is non-zero, then auto-vacuum mode is enabled. If zero, it
! 2254: ** is disabled. The default value for the auto-vacuum property is
! 2255: ** determined by the SQLITE_DEFAULT_AUTOVACUUM macro.
! 2256: */
! 2257: int sqlite3BtreeSetAutoVacuum(Btree *p, int autoVacuum){
! 2258: #ifdef SQLITE_OMIT_AUTOVACUUM
! 2259: return SQLITE_READONLY;
! 2260: #else
! 2261: BtShared *pBt = p->pBt;
! 2262: int rc = SQLITE_OK;
! 2263: u8 av = (u8)autoVacuum;
! 2264:
! 2265: sqlite3BtreeEnter(p);
! 2266: if( (pBt->btsFlags & BTS_PAGESIZE_FIXED)!=0 && (av ?1:0)!=pBt->autoVacuum ){
! 2267: rc = SQLITE_READONLY;
! 2268: }else{
! 2269: pBt->autoVacuum = av ?1:0;
! 2270: pBt->incrVacuum = av==2 ?1:0;
! 2271: }
! 2272: sqlite3BtreeLeave(p);
! 2273: return rc;
! 2274: #endif
! 2275: }
! 2276:
! 2277: /*
! 2278: ** Return the value of the 'auto-vacuum' property. If auto-vacuum is
! 2279: ** enabled 1 is returned. Otherwise 0.
! 2280: */
! 2281: int sqlite3BtreeGetAutoVacuum(Btree *p){
! 2282: #ifdef SQLITE_OMIT_AUTOVACUUM
! 2283: return BTREE_AUTOVACUUM_NONE;
! 2284: #else
! 2285: int rc;
! 2286: sqlite3BtreeEnter(p);
! 2287: rc = (
! 2288: (!p->pBt->autoVacuum)?BTREE_AUTOVACUUM_NONE:
! 2289: (!p->pBt->incrVacuum)?BTREE_AUTOVACUUM_FULL:
! 2290: BTREE_AUTOVACUUM_INCR
! 2291: );
! 2292: sqlite3BtreeLeave(p);
! 2293: return rc;
! 2294: #endif
! 2295: }
! 2296:
! 2297:
! 2298: /*
! 2299: ** Get a reference to pPage1 of the database file. This will
! 2300: ** also acquire a readlock on that file.
! 2301: **
! 2302: ** SQLITE_OK is returned on success. If the file is not a
! 2303: ** well-formed database file, then SQLITE_CORRUPT is returned.
! 2304: ** SQLITE_BUSY is returned if the database is locked. SQLITE_NOMEM
! 2305: ** is returned if we run out of memory.
! 2306: */
! 2307: static int lockBtree(BtShared *pBt){
! 2308: int rc; /* Result code from subfunctions */
! 2309: MemPage *pPage1; /* Page 1 of the database file */
! 2310: int nPage; /* Number of pages in the database */
! 2311: int nPageFile = 0; /* Number of pages in the database file */
! 2312: int nPageHeader; /* Number of pages in the database according to hdr */
! 2313:
! 2314: assert( sqlite3_mutex_held(pBt->mutex) );
! 2315: assert( pBt->pPage1==0 );
! 2316: rc = sqlite3PagerSharedLock(pBt->pPager);
! 2317: if( rc!=SQLITE_OK ) return rc;
! 2318: rc = btreeGetPage(pBt, 1, &pPage1, 0);
! 2319: if( rc!=SQLITE_OK ) return rc;
! 2320:
! 2321: /* Do some checking to help insure the file we opened really is
! 2322: ** a valid database file.
! 2323: */
! 2324: nPage = nPageHeader = get4byte(28+(u8*)pPage1->aData);
! 2325: sqlite3PagerPagecount(pBt->pPager, &nPageFile);
! 2326: if( nPage==0 || memcmp(24+(u8*)pPage1->aData, 92+(u8*)pPage1->aData,4)!=0 ){
! 2327: nPage = nPageFile;
! 2328: }
! 2329: if( nPage>0 ){
! 2330: u32 pageSize;
! 2331: u32 usableSize;
! 2332: u8 *page1 = pPage1->aData;
! 2333: rc = SQLITE_NOTADB;
! 2334: if( memcmp(page1, zMagicHeader, 16)!=0 ){
! 2335: goto page1_init_failed;
! 2336: }
! 2337:
! 2338: #ifdef SQLITE_OMIT_WAL
! 2339: if( page1[18]>1 ){
! 2340: pBt->btsFlags |= BTS_READ_ONLY;
! 2341: }
! 2342: if( page1[19]>1 ){
! 2343: goto page1_init_failed;
! 2344: }
! 2345: #else
! 2346: if( page1[18]>2 ){
! 2347: pBt->btsFlags |= BTS_READ_ONLY;
! 2348: }
! 2349: if( page1[19]>2 ){
! 2350: goto page1_init_failed;
! 2351: }
! 2352:
! 2353: /* If the write version is set to 2, this database should be accessed
! 2354: ** in WAL mode. If the log is not already open, open it now. Then
! 2355: ** return SQLITE_OK and return without populating BtShared.pPage1.
! 2356: ** The caller detects this and calls this function again. This is
! 2357: ** required as the version of page 1 currently in the page1 buffer
! 2358: ** may not be the latest version - there may be a newer one in the log
! 2359: ** file.
! 2360: */
! 2361: if( page1[19]==2 && (pBt->btsFlags & BTS_NO_WAL)==0 ){
! 2362: int isOpen = 0;
! 2363: rc = sqlite3PagerOpenWal(pBt->pPager, &isOpen);
! 2364: if( rc!=SQLITE_OK ){
! 2365: goto page1_init_failed;
! 2366: }else if( isOpen==0 ){
! 2367: releasePage(pPage1);
! 2368: return SQLITE_OK;
! 2369: }
! 2370: rc = SQLITE_NOTADB;
! 2371: }
! 2372: #endif
! 2373:
! 2374: /* The maximum embedded fraction must be exactly 25%. And the minimum
! 2375: ** embedded fraction must be 12.5% for both leaf-data and non-leaf-data.
! 2376: ** The original design allowed these amounts to vary, but as of
! 2377: ** version 3.6.0, we require them to be fixed.
! 2378: */
! 2379: if( memcmp(&page1[21], "\100\040\040",3)!=0 ){
! 2380: goto page1_init_failed;
! 2381: }
! 2382: pageSize = (page1[16]<<8) | (page1[17]<<16);
! 2383: if( ((pageSize-1)&pageSize)!=0
! 2384: || pageSize>SQLITE_MAX_PAGE_SIZE
! 2385: || pageSize<=256
! 2386: ){
! 2387: goto page1_init_failed;
! 2388: }
! 2389: assert( (pageSize & 7)==0 );
! 2390: usableSize = pageSize - page1[20];
! 2391: if( (u32)pageSize!=pBt->pageSize ){
! 2392: /* After reading the first page of the database assuming a page size
! 2393: ** of BtShared.pageSize, we have discovered that the page-size is
! 2394: ** actually pageSize. Unlock the database, leave pBt->pPage1 at
! 2395: ** zero and return SQLITE_OK. The caller will call this function
! 2396: ** again with the correct page-size.
! 2397: */
! 2398: releasePage(pPage1);
! 2399: pBt->usableSize = usableSize;
! 2400: pBt->pageSize = pageSize;
! 2401: freeTempSpace(pBt);
! 2402: rc = sqlite3PagerSetPagesize(pBt->pPager, &pBt->pageSize,
! 2403: pageSize-usableSize);
! 2404: return rc;
! 2405: }
! 2406: if( (pBt->db->flags & SQLITE_RecoveryMode)==0 && nPage>nPageFile ){
! 2407: rc = SQLITE_CORRUPT_BKPT;
! 2408: goto page1_init_failed;
! 2409: }
! 2410: if( usableSize<480 ){
! 2411: goto page1_init_failed;
! 2412: }
! 2413: pBt->pageSize = pageSize;
! 2414: pBt->usableSize = usableSize;
! 2415: #ifndef SQLITE_OMIT_AUTOVACUUM
! 2416: pBt->autoVacuum = (get4byte(&page1[36 + 4*4])?1:0);
! 2417: pBt->incrVacuum = (get4byte(&page1[36 + 7*4])?1:0);
! 2418: #endif
! 2419: }
! 2420:
! 2421: /* maxLocal is the maximum amount of payload to store locally for
! 2422: ** a cell. Make sure it is small enough so that at least minFanout
! 2423: ** cells can will fit on one page. We assume a 10-byte page header.
! 2424: ** Besides the payload, the cell must store:
! 2425: ** 2-byte pointer to the cell
! 2426: ** 4-byte child pointer
! 2427: ** 9-byte nKey value
! 2428: ** 4-byte nData value
! 2429: ** 4-byte overflow page pointer
! 2430: ** So a cell consists of a 2-byte pointer, a header which is as much as
! 2431: ** 17 bytes long, 0 to N bytes of payload, and an optional 4 byte overflow
! 2432: ** page pointer.
! 2433: */
! 2434: pBt->maxLocal = (u16)((pBt->usableSize-12)*64/255 - 23);
! 2435: pBt->minLocal = (u16)((pBt->usableSize-12)*32/255 - 23);
! 2436: pBt->maxLeaf = (u16)(pBt->usableSize - 35);
! 2437: pBt->minLeaf = (u16)((pBt->usableSize-12)*32/255 - 23);
! 2438: if( pBt->maxLocal>127 ){
! 2439: pBt->max1bytePayload = 127;
! 2440: }else{
! 2441: pBt->max1bytePayload = (u8)pBt->maxLocal;
! 2442: }
! 2443: assert( pBt->maxLeaf + 23 <= MX_CELL_SIZE(pBt) );
! 2444: pBt->pPage1 = pPage1;
! 2445: pBt->nPage = nPage;
! 2446: return SQLITE_OK;
! 2447:
! 2448: page1_init_failed:
! 2449: releasePage(pPage1);
! 2450: pBt->pPage1 = 0;
! 2451: return rc;
! 2452: }
! 2453:
! 2454: /*
! 2455: ** If there are no outstanding cursors and we are not in the middle
! 2456: ** of a transaction but there is a read lock on the database, then
! 2457: ** this routine unrefs the first page of the database file which
! 2458: ** has the effect of releasing the read lock.
! 2459: **
! 2460: ** If there is a transaction in progress, this routine is a no-op.
! 2461: */
! 2462: static void unlockBtreeIfUnused(BtShared *pBt){
! 2463: assert( sqlite3_mutex_held(pBt->mutex) );
! 2464: assert( pBt->pCursor==0 || pBt->inTransaction>TRANS_NONE );
! 2465: if( pBt->inTransaction==TRANS_NONE && pBt->pPage1!=0 ){
! 2466: assert( pBt->pPage1->aData );
! 2467: assert( sqlite3PagerRefcount(pBt->pPager)==1 );
! 2468: assert( pBt->pPage1->aData );
! 2469: releasePage(pBt->pPage1);
! 2470: pBt->pPage1 = 0;
! 2471: }
! 2472: }
! 2473:
! 2474: /*
! 2475: ** If pBt points to an empty file then convert that empty file
! 2476: ** into a new empty database by initializing the first page of
! 2477: ** the database.
! 2478: */
! 2479: static int newDatabase(BtShared *pBt){
! 2480: MemPage *pP1;
! 2481: unsigned char *data;
! 2482: int rc;
! 2483:
! 2484: assert( sqlite3_mutex_held(pBt->mutex) );
! 2485: if( pBt->nPage>0 ){
! 2486: return SQLITE_OK;
! 2487: }
! 2488: pP1 = pBt->pPage1;
! 2489: assert( pP1!=0 );
! 2490: data = pP1->aData;
! 2491: rc = sqlite3PagerWrite(pP1->pDbPage);
! 2492: if( rc ) return rc;
! 2493: memcpy(data, zMagicHeader, sizeof(zMagicHeader));
! 2494: assert( sizeof(zMagicHeader)==16 );
! 2495: data[16] = (u8)((pBt->pageSize>>8)&0xff);
! 2496: data[17] = (u8)((pBt->pageSize>>16)&0xff);
! 2497: data[18] = 1;
! 2498: data[19] = 1;
! 2499: assert( pBt->usableSize<=pBt->pageSize && pBt->usableSize+255>=pBt->pageSize);
! 2500: data[20] = (u8)(pBt->pageSize - pBt->usableSize);
! 2501: data[21] = 64;
! 2502: data[22] = 32;
! 2503: data[23] = 32;
! 2504: memset(&data[24], 0, 100-24);
! 2505: zeroPage(pP1, PTF_INTKEY|PTF_LEAF|PTF_LEAFDATA );
! 2506: pBt->btsFlags |= BTS_PAGESIZE_FIXED;
! 2507: #ifndef SQLITE_OMIT_AUTOVACUUM
! 2508: assert( pBt->autoVacuum==1 || pBt->autoVacuum==0 );
! 2509: assert( pBt->incrVacuum==1 || pBt->incrVacuum==0 );
! 2510: put4byte(&data[36 + 4*4], pBt->autoVacuum);
! 2511: put4byte(&data[36 + 7*4], pBt->incrVacuum);
! 2512: #endif
! 2513: pBt->nPage = 1;
! 2514: data[31] = 1;
! 2515: return SQLITE_OK;
! 2516: }
! 2517:
! 2518: /*
! 2519: ** Attempt to start a new transaction. A write-transaction
! 2520: ** is started if the second argument is nonzero, otherwise a read-
! 2521: ** transaction. If the second argument is 2 or more and exclusive
! 2522: ** transaction is started, meaning that no other process is allowed
! 2523: ** to access the database. A preexisting transaction may not be
! 2524: ** upgraded to exclusive by calling this routine a second time - the
! 2525: ** exclusivity flag only works for a new transaction.
! 2526: **
! 2527: ** A write-transaction must be started before attempting any
! 2528: ** changes to the database. None of the following routines
! 2529: ** will work unless a transaction is started first:
! 2530: **
! 2531: ** sqlite3BtreeCreateTable()
! 2532: ** sqlite3BtreeCreateIndex()
! 2533: ** sqlite3BtreeClearTable()
! 2534: ** sqlite3BtreeDropTable()
! 2535: ** sqlite3BtreeInsert()
! 2536: ** sqlite3BtreeDelete()
! 2537: ** sqlite3BtreeUpdateMeta()
! 2538: **
! 2539: ** If an initial attempt to acquire the lock fails because of lock contention
! 2540: ** and the database was previously unlocked, then invoke the busy handler
! 2541: ** if there is one. But if there was previously a read-lock, do not
! 2542: ** invoke the busy handler - just return SQLITE_BUSY. SQLITE_BUSY is
! 2543: ** returned when there is already a read-lock in order to avoid a deadlock.
! 2544: **
! 2545: ** Suppose there are two processes A and B. A has a read lock and B has
! 2546: ** a reserved lock. B tries to promote to exclusive but is blocked because
! 2547: ** of A's read lock. A tries to promote to reserved but is blocked by B.
! 2548: ** One or the other of the two processes must give way or there can be
! 2549: ** no progress. By returning SQLITE_BUSY and not invoking the busy callback
! 2550: ** when A already has a read lock, we encourage A to give up and let B
! 2551: ** proceed.
! 2552: */
! 2553: int sqlite3BtreeBeginTrans(Btree *p, int wrflag){
! 2554: sqlite3 *pBlock = 0;
! 2555: BtShared *pBt = p->pBt;
! 2556: int rc = SQLITE_OK;
! 2557:
! 2558: sqlite3BtreeEnter(p);
! 2559: btreeIntegrity(p);
! 2560:
! 2561: /* If the btree is already in a write-transaction, or it
! 2562: ** is already in a read-transaction and a read-transaction
! 2563: ** is requested, this is a no-op.
! 2564: */
! 2565: if( p->inTrans==TRANS_WRITE || (p->inTrans==TRANS_READ && !wrflag) ){
! 2566: goto trans_begun;
! 2567: }
! 2568:
! 2569: /* Write transactions are not possible on a read-only database */
! 2570: if( (pBt->btsFlags & BTS_READ_ONLY)!=0 && wrflag ){
! 2571: rc = SQLITE_READONLY;
! 2572: goto trans_begun;
! 2573: }
! 2574:
! 2575: #ifndef SQLITE_OMIT_SHARED_CACHE
! 2576: /* If another database handle has already opened a write transaction
! 2577: ** on this shared-btree structure and a second write transaction is
! 2578: ** requested, return SQLITE_LOCKED.
! 2579: */
! 2580: if( (wrflag && pBt->inTransaction==TRANS_WRITE)
! 2581: || (pBt->btsFlags & BTS_PENDING)!=0
! 2582: ){
! 2583: pBlock = pBt->pWriter->db;
! 2584: }else if( wrflag>1 ){
! 2585: BtLock *pIter;
! 2586: for(pIter=pBt->pLock; pIter; pIter=pIter->pNext){
! 2587: if( pIter->pBtree!=p ){
! 2588: pBlock = pIter->pBtree->db;
! 2589: break;
! 2590: }
! 2591: }
! 2592: }
! 2593: if( pBlock ){
! 2594: sqlite3ConnectionBlocked(p->db, pBlock);
! 2595: rc = SQLITE_LOCKED_SHAREDCACHE;
! 2596: goto trans_begun;
! 2597: }
! 2598: #endif
! 2599:
! 2600: /* Any read-only or read-write transaction implies a read-lock on
! 2601: ** page 1. So if some other shared-cache client already has a write-lock
! 2602: ** on page 1, the transaction cannot be opened. */
! 2603: rc = querySharedCacheTableLock(p, MASTER_ROOT, READ_LOCK);
! 2604: if( SQLITE_OK!=rc ) goto trans_begun;
! 2605:
! 2606: pBt->btsFlags &= ~BTS_INITIALLY_EMPTY;
! 2607: if( pBt->nPage==0 ) pBt->btsFlags |= BTS_INITIALLY_EMPTY;
! 2608: do {
! 2609: /* Call lockBtree() until either pBt->pPage1 is populated or
! 2610: ** lockBtree() returns something other than SQLITE_OK. lockBtree()
! 2611: ** may return SQLITE_OK but leave pBt->pPage1 set to 0 if after
! 2612: ** reading page 1 it discovers that the page-size of the database
! 2613: ** file is not pBt->pageSize. In this case lockBtree() will update
! 2614: ** pBt->pageSize to the page-size of the file on disk.
! 2615: */
! 2616: while( pBt->pPage1==0 && SQLITE_OK==(rc = lockBtree(pBt)) );
! 2617:
! 2618: if( rc==SQLITE_OK && wrflag ){
! 2619: if( (pBt->btsFlags & BTS_READ_ONLY)!=0 ){
! 2620: rc = SQLITE_READONLY;
! 2621: }else{
! 2622: rc = sqlite3PagerBegin(pBt->pPager,wrflag>1,sqlite3TempInMemory(p->db));
! 2623: if( rc==SQLITE_OK ){
! 2624: rc = newDatabase(pBt);
! 2625: }
! 2626: }
! 2627: }
! 2628:
! 2629: if( rc!=SQLITE_OK ){
! 2630: unlockBtreeIfUnused(pBt);
! 2631: }
! 2632: }while( (rc&0xFF)==SQLITE_BUSY && pBt->inTransaction==TRANS_NONE &&
! 2633: btreeInvokeBusyHandler(pBt) );
! 2634:
! 2635: if( rc==SQLITE_OK ){
! 2636: if( p->inTrans==TRANS_NONE ){
! 2637: pBt->nTransaction++;
! 2638: #ifndef SQLITE_OMIT_SHARED_CACHE
! 2639: if( p->sharable ){
! 2640: assert( p->lock.pBtree==p && p->lock.iTable==1 );
! 2641: p->lock.eLock = READ_LOCK;
! 2642: p->lock.pNext = pBt->pLock;
! 2643: pBt->pLock = &p->lock;
! 2644: }
! 2645: #endif
! 2646: }
! 2647: p->inTrans = (wrflag?TRANS_WRITE:TRANS_READ);
! 2648: if( p->inTrans>pBt->inTransaction ){
! 2649: pBt->inTransaction = p->inTrans;
! 2650: }
! 2651: if( wrflag ){
! 2652: MemPage *pPage1 = pBt->pPage1;
! 2653: #ifndef SQLITE_OMIT_SHARED_CACHE
! 2654: assert( !pBt->pWriter );
! 2655: pBt->pWriter = p;
! 2656: pBt->btsFlags &= ~BTS_EXCLUSIVE;
! 2657: if( wrflag>1 ) pBt->btsFlags |= BTS_EXCLUSIVE;
! 2658: #endif
! 2659:
! 2660: /* If the db-size header field is incorrect (as it may be if an old
! 2661: ** client has been writing the database file), update it now. Doing
! 2662: ** this sooner rather than later means the database size can safely
! 2663: ** re-read the database size from page 1 if a savepoint or transaction
! 2664: ** rollback occurs within the transaction.
! 2665: */
! 2666: if( pBt->nPage!=get4byte(&pPage1->aData[28]) ){
! 2667: rc = sqlite3PagerWrite(pPage1->pDbPage);
! 2668: if( rc==SQLITE_OK ){
! 2669: put4byte(&pPage1->aData[28], pBt->nPage);
! 2670: }
! 2671: }
! 2672: }
! 2673: }
! 2674:
! 2675:
! 2676: trans_begun:
! 2677: if( rc==SQLITE_OK && wrflag ){
! 2678: /* This call makes sure that the pager has the correct number of
! 2679: ** open savepoints. If the second parameter is greater than 0 and
! 2680: ** the sub-journal is not already open, then it will be opened here.
! 2681: */
! 2682: rc = sqlite3PagerOpenSavepoint(pBt->pPager, p->db->nSavepoint);
! 2683: }
! 2684:
! 2685: btreeIntegrity(p);
! 2686: sqlite3BtreeLeave(p);
! 2687: return rc;
! 2688: }
! 2689:
! 2690: #ifndef SQLITE_OMIT_AUTOVACUUM
! 2691:
! 2692: /*
! 2693: ** Set the pointer-map entries for all children of page pPage. Also, if
! 2694: ** pPage contains cells that point to overflow pages, set the pointer
! 2695: ** map entries for the overflow pages as well.
! 2696: */
! 2697: static int setChildPtrmaps(MemPage *pPage){
! 2698: int i; /* Counter variable */
! 2699: int nCell; /* Number of cells in page pPage */
! 2700: int rc; /* Return code */
! 2701: BtShared *pBt = pPage->pBt;
! 2702: u8 isInitOrig = pPage->isInit;
! 2703: Pgno pgno = pPage->pgno;
! 2704:
! 2705: assert( sqlite3_mutex_held(pPage->pBt->mutex) );
! 2706: rc = btreeInitPage(pPage);
! 2707: if( rc!=SQLITE_OK ){
! 2708: goto set_child_ptrmaps_out;
! 2709: }
! 2710: nCell = pPage->nCell;
! 2711:
! 2712: for(i=0; i<nCell; i++){
! 2713: u8 *pCell = findCell(pPage, i);
! 2714:
! 2715: ptrmapPutOvflPtr(pPage, pCell, &rc);
! 2716:
! 2717: if( !pPage->leaf ){
! 2718: Pgno childPgno = get4byte(pCell);
! 2719: ptrmapPut(pBt, childPgno, PTRMAP_BTREE, pgno, &rc);
! 2720: }
! 2721: }
! 2722:
! 2723: if( !pPage->leaf ){
! 2724: Pgno childPgno = get4byte(&pPage->aData[pPage->hdrOffset+8]);
! 2725: ptrmapPut(pBt, childPgno, PTRMAP_BTREE, pgno, &rc);
! 2726: }
! 2727:
! 2728: set_child_ptrmaps_out:
! 2729: pPage->isInit = isInitOrig;
! 2730: return rc;
! 2731: }
! 2732:
! 2733: /*
! 2734: ** Somewhere on pPage is a pointer to page iFrom. Modify this pointer so
! 2735: ** that it points to iTo. Parameter eType describes the type of pointer to
! 2736: ** be modified, as follows:
! 2737: **
! 2738: ** PTRMAP_BTREE: pPage is a btree-page. The pointer points at a child
! 2739: ** page of pPage.
! 2740: **
! 2741: ** PTRMAP_OVERFLOW1: pPage is a btree-page. The pointer points at an overflow
! 2742: ** page pointed to by one of the cells on pPage.
! 2743: **
! 2744: ** PTRMAP_OVERFLOW2: pPage is an overflow-page. The pointer points at the next
! 2745: ** overflow page in the list.
! 2746: */
! 2747: static int modifyPagePointer(MemPage *pPage, Pgno iFrom, Pgno iTo, u8 eType){
! 2748: assert( sqlite3_mutex_held(pPage->pBt->mutex) );
! 2749: assert( sqlite3PagerIswriteable(pPage->pDbPage) );
! 2750: if( eType==PTRMAP_OVERFLOW2 ){
! 2751: /* The pointer is always the first 4 bytes of the page in this case. */
! 2752: if( get4byte(pPage->aData)!=iFrom ){
! 2753: return SQLITE_CORRUPT_BKPT;
! 2754: }
! 2755: put4byte(pPage->aData, iTo);
! 2756: }else{
! 2757: u8 isInitOrig = pPage->isInit;
! 2758: int i;
! 2759: int nCell;
! 2760:
! 2761: btreeInitPage(pPage);
! 2762: nCell = pPage->nCell;
! 2763:
! 2764: for(i=0; i<nCell; i++){
! 2765: u8 *pCell = findCell(pPage, i);
! 2766: if( eType==PTRMAP_OVERFLOW1 ){
! 2767: CellInfo info;
! 2768: btreeParseCellPtr(pPage, pCell, &info);
! 2769: if( info.iOverflow
! 2770: && pCell+info.iOverflow+3<=pPage->aData+pPage->maskPage
! 2771: && iFrom==get4byte(&pCell[info.iOverflow])
! 2772: ){
! 2773: put4byte(&pCell[info.iOverflow], iTo);
! 2774: break;
! 2775: }
! 2776: }else{
! 2777: if( get4byte(pCell)==iFrom ){
! 2778: put4byte(pCell, iTo);
! 2779: break;
! 2780: }
! 2781: }
! 2782: }
! 2783:
! 2784: if( i==nCell ){
! 2785: if( eType!=PTRMAP_BTREE ||
! 2786: get4byte(&pPage->aData[pPage->hdrOffset+8])!=iFrom ){
! 2787: return SQLITE_CORRUPT_BKPT;
! 2788: }
! 2789: put4byte(&pPage->aData[pPage->hdrOffset+8], iTo);
! 2790: }
! 2791:
! 2792: pPage->isInit = isInitOrig;
! 2793: }
! 2794: return SQLITE_OK;
! 2795: }
! 2796:
! 2797:
! 2798: /*
! 2799: ** Move the open database page pDbPage to location iFreePage in the
! 2800: ** database. The pDbPage reference remains valid.
! 2801: **
! 2802: ** The isCommit flag indicates that there is no need to remember that
! 2803: ** the journal needs to be sync()ed before database page pDbPage->pgno
! 2804: ** can be written to. The caller has already promised not to write to that
! 2805: ** page.
! 2806: */
! 2807: static int relocatePage(
! 2808: BtShared *pBt, /* Btree */
! 2809: MemPage *pDbPage, /* Open page to move */
! 2810: u8 eType, /* Pointer map 'type' entry for pDbPage */
! 2811: Pgno iPtrPage, /* Pointer map 'page-no' entry for pDbPage */
! 2812: Pgno iFreePage, /* The location to move pDbPage to */
! 2813: int isCommit /* isCommit flag passed to sqlite3PagerMovepage */
! 2814: ){
! 2815: MemPage *pPtrPage; /* The page that contains a pointer to pDbPage */
! 2816: Pgno iDbPage = pDbPage->pgno;
! 2817: Pager *pPager = pBt->pPager;
! 2818: int rc;
! 2819:
! 2820: assert( eType==PTRMAP_OVERFLOW2 || eType==PTRMAP_OVERFLOW1 ||
! 2821: eType==PTRMAP_BTREE || eType==PTRMAP_ROOTPAGE );
! 2822: assert( sqlite3_mutex_held(pBt->mutex) );
! 2823: assert( pDbPage->pBt==pBt );
! 2824:
! 2825: /* Move page iDbPage from its current location to page number iFreePage */
! 2826: TRACE(("AUTOVACUUM: Moving %d to free page %d (ptr page %d type %d)\n",
! 2827: iDbPage, iFreePage, iPtrPage, eType));
! 2828: rc = sqlite3PagerMovepage(pPager, pDbPage->pDbPage, iFreePage, isCommit);
! 2829: if( rc!=SQLITE_OK ){
! 2830: return rc;
! 2831: }
! 2832: pDbPage->pgno = iFreePage;
! 2833:
! 2834: /* If pDbPage was a btree-page, then it may have child pages and/or cells
! 2835: ** that point to overflow pages. The pointer map entries for all these
! 2836: ** pages need to be changed.
! 2837: **
! 2838: ** If pDbPage is an overflow page, then the first 4 bytes may store a
! 2839: ** pointer to a subsequent overflow page. If this is the case, then
! 2840: ** the pointer map needs to be updated for the subsequent overflow page.
! 2841: */
! 2842: if( eType==PTRMAP_BTREE || eType==PTRMAP_ROOTPAGE ){
! 2843: rc = setChildPtrmaps(pDbPage);
! 2844: if( rc!=SQLITE_OK ){
! 2845: return rc;
! 2846: }
! 2847: }else{
! 2848: Pgno nextOvfl = get4byte(pDbPage->aData);
! 2849: if( nextOvfl!=0 ){
! 2850: ptrmapPut(pBt, nextOvfl, PTRMAP_OVERFLOW2, iFreePage, &rc);
! 2851: if( rc!=SQLITE_OK ){
! 2852: return rc;
! 2853: }
! 2854: }
! 2855: }
! 2856:
! 2857: /* Fix the database pointer on page iPtrPage that pointed at iDbPage so
! 2858: ** that it points at iFreePage. Also fix the pointer map entry for
! 2859: ** iPtrPage.
! 2860: */
! 2861: if( eType!=PTRMAP_ROOTPAGE ){
! 2862: rc = btreeGetPage(pBt, iPtrPage, &pPtrPage, 0);
! 2863: if( rc!=SQLITE_OK ){
! 2864: return rc;
! 2865: }
! 2866: rc = sqlite3PagerWrite(pPtrPage->pDbPage);
! 2867: if( rc!=SQLITE_OK ){
! 2868: releasePage(pPtrPage);
! 2869: return rc;
! 2870: }
! 2871: rc = modifyPagePointer(pPtrPage, iDbPage, iFreePage, eType);
! 2872: releasePage(pPtrPage);
! 2873: if( rc==SQLITE_OK ){
! 2874: ptrmapPut(pBt, iFreePage, eType, iPtrPage, &rc);
! 2875: }
! 2876: }
! 2877: return rc;
! 2878: }
! 2879:
! 2880: /* Forward declaration required by incrVacuumStep(). */
! 2881: static int allocateBtreePage(BtShared *, MemPage **, Pgno *, Pgno, u8);
! 2882:
! 2883: /*
! 2884: ** Perform a single step of an incremental-vacuum. If successful,
! 2885: ** return SQLITE_OK. If there is no work to do (and therefore no
! 2886: ** point in calling this function again), return SQLITE_DONE.
! 2887: **
! 2888: ** More specificly, this function attempts to re-organize the
! 2889: ** database so that the last page of the file currently in use
! 2890: ** is no longer in use.
! 2891: **
! 2892: ** If the nFin parameter is non-zero, this function assumes
! 2893: ** that the caller will keep calling incrVacuumStep() until
! 2894: ** it returns SQLITE_DONE or an error, and that nFin is the
! 2895: ** number of pages the database file will contain after this
! 2896: ** process is complete. If nFin is zero, it is assumed that
! 2897: ** incrVacuumStep() will be called a finite amount of times
! 2898: ** which may or may not empty the freelist. A full autovacuum
! 2899: ** has nFin>0. A "PRAGMA incremental_vacuum" has nFin==0.
! 2900: */
! 2901: static int incrVacuumStep(BtShared *pBt, Pgno nFin, Pgno iLastPg){
! 2902: Pgno nFreeList; /* Number of pages still on the free-list */
! 2903: int rc;
! 2904:
! 2905: assert( sqlite3_mutex_held(pBt->mutex) );
! 2906: assert( iLastPg>nFin );
! 2907:
! 2908: if( !PTRMAP_ISPAGE(pBt, iLastPg) && iLastPg!=PENDING_BYTE_PAGE(pBt) ){
! 2909: u8 eType;
! 2910: Pgno iPtrPage;
! 2911:
! 2912: nFreeList = get4byte(&pBt->pPage1->aData[36]);
! 2913: if( nFreeList==0 ){
! 2914: return SQLITE_DONE;
! 2915: }
! 2916:
! 2917: rc = ptrmapGet(pBt, iLastPg, &eType, &iPtrPage);
! 2918: if( rc!=SQLITE_OK ){
! 2919: return rc;
! 2920: }
! 2921: if( eType==PTRMAP_ROOTPAGE ){
! 2922: return SQLITE_CORRUPT_BKPT;
! 2923: }
! 2924:
! 2925: if( eType==PTRMAP_FREEPAGE ){
! 2926: if( nFin==0 ){
! 2927: /* Remove the page from the files free-list. This is not required
! 2928: ** if nFin is non-zero. In that case, the free-list will be
! 2929: ** truncated to zero after this function returns, so it doesn't
! 2930: ** matter if it still contains some garbage entries.
! 2931: */
! 2932: Pgno iFreePg;
! 2933: MemPage *pFreePg;
! 2934: rc = allocateBtreePage(pBt, &pFreePg, &iFreePg, iLastPg, 1);
! 2935: if( rc!=SQLITE_OK ){
! 2936: return rc;
! 2937: }
! 2938: assert( iFreePg==iLastPg );
! 2939: releasePage(pFreePg);
! 2940: }
! 2941: } else {
! 2942: Pgno iFreePg; /* Index of free page to move pLastPg to */
! 2943: MemPage *pLastPg;
! 2944:
! 2945: rc = btreeGetPage(pBt, iLastPg, &pLastPg, 0);
! 2946: if( rc!=SQLITE_OK ){
! 2947: return rc;
! 2948: }
! 2949:
! 2950: /* If nFin is zero, this loop runs exactly once and page pLastPg
! 2951: ** is swapped with the first free page pulled off the free list.
! 2952: **
! 2953: ** On the other hand, if nFin is greater than zero, then keep
! 2954: ** looping until a free-page located within the first nFin pages
! 2955: ** of the file is found.
! 2956: */
! 2957: do {
! 2958: MemPage *pFreePg;
! 2959: rc = allocateBtreePage(pBt, &pFreePg, &iFreePg, 0, 0);
! 2960: if( rc!=SQLITE_OK ){
! 2961: releasePage(pLastPg);
! 2962: return rc;
! 2963: }
! 2964: releasePage(pFreePg);
! 2965: }while( nFin!=0 && iFreePg>nFin );
! 2966: assert( iFreePg<iLastPg );
! 2967:
! 2968: rc = sqlite3PagerWrite(pLastPg->pDbPage);
! 2969: if( rc==SQLITE_OK ){
! 2970: rc = relocatePage(pBt, pLastPg, eType, iPtrPage, iFreePg, nFin!=0);
! 2971: }
! 2972: releasePage(pLastPg);
! 2973: if( rc!=SQLITE_OK ){
! 2974: return rc;
! 2975: }
! 2976: }
! 2977: }
! 2978:
! 2979: if( nFin==0 ){
! 2980: iLastPg--;
! 2981: while( iLastPg==PENDING_BYTE_PAGE(pBt)||PTRMAP_ISPAGE(pBt, iLastPg) ){
! 2982: if( PTRMAP_ISPAGE(pBt, iLastPg) ){
! 2983: MemPage *pPg;
! 2984: rc = btreeGetPage(pBt, iLastPg, &pPg, 0);
! 2985: if( rc!=SQLITE_OK ){
! 2986: return rc;
! 2987: }
! 2988: rc = sqlite3PagerWrite(pPg->pDbPage);
! 2989: releasePage(pPg);
! 2990: if( rc!=SQLITE_OK ){
! 2991: return rc;
! 2992: }
! 2993: }
! 2994: iLastPg--;
! 2995: }
! 2996: sqlite3PagerTruncateImage(pBt->pPager, iLastPg);
! 2997: pBt->nPage = iLastPg;
! 2998: }
! 2999: return SQLITE_OK;
! 3000: }
! 3001:
! 3002: /*
! 3003: ** A write-transaction must be opened before calling this function.
! 3004: ** It performs a single unit of work towards an incremental vacuum.
! 3005: **
! 3006: ** If the incremental vacuum is finished after this function has run,
! 3007: ** SQLITE_DONE is returned. If it is not finished, but no error occurred,
! 3008: ** SQLITE_OK is returned. Otherwise an SQLite error code.
! 3009: */
! 3010: int sqlite3BtreeIncrVacuum(Btree *p){
! 3011: int rc;
! 3012: BtShared *pBt = p->pBt;
! 3013:
! 3014: sqlite3BtreeEnter(p);
! 3015: assert( pBt->inTransaction==TRANS_WRITE && p->inTrans==TRANS_WRITE );
! 3016: if( !pBt->autoVacuum ){
! 3017: rc = SQLITE_DONE;
! 3018: }else{
! 3019: invalidateAllOverflowCache(pBt);
! 3020: rc = incrVacuumStep(pBt, 0, btreePagecount(pBt));
! 3021: if( rc==SQLITE_OK ){
! 3022: rc = sqlite3PagerWrite(pBt->pPage1->pDbPage);
! 3023: put4byte(&pBt->pPage1->aData[28], pBt->nPage);
! 3024: }
! 3025: }
! 3026: sqlite3BtreeLeave(p);
! 3027: return rc;
! 3028: }
! 3029:
! 3030: /*
! 3031: ** This routine is called prior to sqlite3PagerCommit when a transaction
! 3032: ** is commited for an auto-vacuum database.
! 3033: **
! 3034: ** If SQLITE_OK is returned, then *pnTrunc is set to the number of pages
! 3035: ** the database file should be truncated to during the commit process.
! 3036: ** i.e. the database has been reorganized so that only the first *pnTrunc
! 3037: ** pages are in use.
! 3038: */
! 3039: static int autoVacuumCommit(BtShared *pBt){
! 3040: int rc = SQLITE_OK;
! 3041: Pager *pPager = pBt->pPager;
! 3042: VVA_ONLY( int nRef = sqlite3PagerRefcount(pPager) );
! 3043:
! 3044: assert( sqlite3_mutex_held(pBt->mutex) );
! 3045: invalidateAllOverflowCache(pBt);
! 3046: assert(pBt->autoVacuum);
! 3047: if( !pBt->incrVacuum ){
! 3048: Pgno nFin; /* Number of pages in database after autovacuuming */
! 3049: Pgno nFree; /* Number of pages on the freelist initially */
! 3050: Pgno nPtrmap; /* Number of PtrMap pages to be freed */
! 3051: Pgno iFree; /* The next page to be freed */
! 3052: int nEntry; /* Number of entries on one ptrmap page */
! 3053: Pgno nOrig; /* Database size before freeing */
! 3054:
! 3055: nOrig = btreePagecount(pBt);
! 3056: if( PTRMAP_ISPAGE(pBt, nOrig) || nOrig==PENDING_BYTE_PAGE(pBt) ){
! 3057: /* It is not possible to create a database for which the final page
! 3058: ** is either a pointer-map page or the pending-byte page. If one
! 3059: ** is encountered, this indicates corruption.
! 3060: */
! 3061: return SQLITE_CORRUPT_BKPT;
! 3062: }
! 3063:
! 3064: nFree = get4byte(&pBt->pPage1->aData[36]);
! 3065: nEntry = pBt->usableSize/5;
! 3066: nPtrmap = (nFree-nOrig+PTRMAP_PAGENO(pBt, nOrig)+nEntry)/nEntry;
! 3067: nFin = nOrig - nFree - nPtrmap;
! 3068: if( nOrig>PENDING_BYTE_PAGE(pBt) && nFin<PENDING_BYTE_PAGE(pBt) ){
! 3069: nFin--;
! 3070: }
! 3071: while( PTRMAP_ISPAGE(pBt, nFin) || nFin==PENDING_BYTE_PAGE(pBt) ){
! 3072: nFin--;
! 3073: }
! 3074: if( nFin>nOrig ) return SQLITE_CORRUPT_BKPT;
! 3075:
! 3076: for(iFree=nOrig; iFree>nFin && rc==SQLITE_OK; iFree--){
! 3077: rc = incrVacuumStep(pBt, nFin, iFree);
! 3078: }
! 3079: if( (rc==SQLITE_DONE || rc==SQLITE_OK) && nFree>0 ){
! 3080: rc = sqlite3PagerWrite(pBt->pPage1->pDbPage);
! 3081: put4byte(&pBt->pPage1->aData[32], 0);
! 3082: put4byte(&pBt->pPage1->aData[36], 0);
! 3083: put4byte(&pBt->pPage1->aData[28], nFin);
! 3084: sqlite3PagerTruncateImage(pBt->pPager, nFin);
! 3085: pBt->nPage = nFin;
! 3086: }
! 3087: if( rc!=SQLITE_OK ){
! 3088: sqlite3PagerRollback(pPager);
! 3089: }
! 3090: }
! 3091:
! 3092: assert( nRef==sqlite3PagerRefcount(pPager) );
! 3093: return rc;
! 3094: }
! 3095:
! 3096: #else /* ifndef SQLITE_OMIT_AUTOVACUUM */
! 3097: # define setChildPtrmaps(x) SQLITE_OK
! 3098: #endif
! 3099:
! 3100: /*
! 3101: ** This routine does the first phase of a two-phase commit. This routine
! 3102: ** causes a rollback journal to be created (if it does not already exist)
! 3103: ** and populated with enough information so that if a power loss occurs
! 3104: ** the database can be restored to its original state by playing back
! 3105: ** the journal. Then the contents of the journal are flushed out to
! 3106: ** the disk. After the journal is safely on oxide, the changes to the
! 3107: ** database are written into the database file and flushed to oxide.
! 3108: ** At the end of this call, the rollback journal still exists on the
! 3109: ** disk and we are still holding all locks, so the transaction has not
! 3110: ** committed. See sqlite3BtreeCommitPhaseTwo() for the second phase of the
! 3111: ** commit process.
! 3112: **
! 3113: ** This call is a no-op if no write-transaction is currently active on pBt.
! 3114: **
! 3115: ** Otherwise, sync the database file for the btree pBt. zMaster points to
! 3116: ** the name of a master journal file that should be written into the
! 3117: ** individual journal file, or is NULL, indicating no master journal file
! 3118: ** (single database transaction).
! 3119: **
! 3120: ** When this is called, the master journal should already have been
! 3121: ** created, populated with this journal pointer and synced to disk.
! 3122: **
! 3123: ** Once this is routine has returned, the only thing required to commit
! 3124: ** the write-transaction for this database file is to delete the journal.
! 3125: */
! 3126: int sqlite3BtreeCommitPhaseOne(Btree *p, const char *zMaster){
! 3127: int rc = SQLITE_OK;
! 3128: if( p->inTrans==TRANS_WRITE ){
! 3129: BtShared *pBt = p->pBt;
! 3130: sqlite3BtreeEnter(p);
! 3131: #ifndef SQLITE_OMIT_AUTOVACUUM
! 3132: if( pBt->autoVacuum ){
! 3133: rc = autoVacuumCommit(pBt);
! 3134: if( rc!=SQLITE_OK ){
! 3135: sqlite3BtreeLeave(p);
! 3136: return rc;
! 3137: }
! 3138: }
! 3139: #endif
! 3140: rc = sqlite3PagerCommitPhaseOne(pBt->pPager, zMaster, 0);
! 3141: sqlite3BtreeLeave(p);
! 3142: }
! 3143: return rc;
! 3144: }
! 3145:
! 3146: /*
! 3147: ** This function is called from both BtreeCommitPhaseTwo() and BtreeRollback()
! 3148: ** at the conclusion of a transaction.
! 3149: */
! 3150: static void btreeEndTransaction(Btree *p){
! 3151: BtShared *pBt = p->pBt;
! 3152: assert( sqlite3BtreeHoldsMutex(p) );
! 3153:
! 3154: btreeClearHasContent(pBt);
! 3155: if( p->inTrans>TRANS_NONE && p->db->activeVdbeCnt>1 ){
! 3156: /* If there are other active statements that belong to this database
! 3157: ** handle, downgrade to a read-only transaction. The other statements
! 3158: ** may still be reading from the database. */
! 3159: downgradeAllSharedCacheTableLocks(p);
! 3160: p->inTrans = TRANS_READ;
! 3161: }else{
! 3162: /* If the handle had any kind of transaction open, decrement the
! 3163: ** transaction count of the shared btree. If the transaction count
! 3164: ** reaches 0, set the shared state to TRANS_NONE. The unlockBtreeIfUnused()
! 3165: ** call below will unlock the pager. */
! 3166: if( p->inTrans!=TRANS_NONE ){
! 3167: clearAllSharedCacheTableLocks(p);
! 3168: pBt->nTransaction--;
! 3169: if( 0==pBt->nTransaction ){
! 3170: pBt->inTransaction = TRANS_NONE;
! 3171: }
! 3172: }
! 3173:
! 3174: /* Set the current transaction state to TRANS_NONE and unlock the
! 3175: ** pager if this call closed the only read or write transaction. */
! 3176: p->inTrans = TRANS_NONE;
! 3177: unlockBtreeIfUnused(pBt);
! 3178: }
! 3179:
! 3180: btreeIntegrity(p);
! 3181: }
! 3182:
! 3183: /*
! 3184: ** Commit the transaction currently in progress.
! 3185: **
! 3186: ** This routine implements the second phase of a 2-phase commit. The
! 3187: ** sqlite3BtreeCommitPhaseOne() routine does the first phase and should
! 3188: ** be invoked prior to calling this routine. The sqlite3BtreeCommitPhaseOne()
! 3189: ** routine did all the work of writing information out to disk and flushing the
! 3190: ** contents so that they are written onto the disk platter. All this
! 3191: ** routine has to do is delete or truncate or zero the header in the
! 3192: ** the rollback journal (which causes the transaction to commit) and
! 3193: ** drop locks.
! 3194: **
! 3195: ** Normally, if an error occurs while the pager layer is attempting to
! 3196: ** finalize the underlying journal file, this function returns an error and
! 3197: ** the upper layer will attempt a rollback. However, if the second argument
! 3198: ** is non-zero then this b-tree transaction is part of a multi-file
! 3199: ** transaction. In this case, the transaction has already been committed
! 3200: ** (by deleting a master journal file) and the caller will ignore this
! 3201: ** functions return code. So, even if an error occurs in the pager layer,
! 3202: ** reset the b-tree objects internal state to indicate that the write
! 3203: ** transaction has been closed. This is quite safe, as the pager will have
! 3204: ** transitioned to the error state.
! 3205: **
! 3206: ** This will release the write lock on the database file. If there
! 3207: ** are no active cursors, it also releases the read lock.
! 3208: */
! 3209: int sqlite3BtreeCommitPhaseTwo(Btree *p, int bCleanup){
! 3210:
! 3211: if( p->inTrans==TRANS_NONE ) return SQLITE_OK;
! 3212: sqlite3BtreeEnter(p);
! 3213: btreeIntegrity(p);
! 3214:
! 3215: /* If the handle has a write-transaction open, commit the shared-btrees
! 3216: ** transaction and set the shared state to TRANS_READ.
! 3217: */
! 3218: if( p->inTrans==TRANS_WRITE ){
! 3219: int rc;
! 3220: BtShared *pBt = p->pBt;
! 3221: assert( pBt->inTransaction==TRANS_WRITE );
! 3222: assert( pBt->nTransaction>0 );
! 3223: rc = sqlite3PagerCommitPhaseTwo(pBt->pPager);
! 3224: if( rc!=SQLITE_OK && bCleanup==0 ){
! 3225: sqlite3BtreeLeave(p);
! 3226: return rc;
! 3227: }
! 3228: pBt->inTransaction = TRANS_READ;
! 3229: }
! 3230:
! 3231: btreeEndTransaction(p);
! 3232: sqlite3BtreeLeave(p);
! 3233: return SQLITE_OK;
! 3234: }
! 3235:
! 3236: /*
! 3237: ** Do both phases of a commit.
! 3238: */
! 3239: int sqlite3BtreeCommit(Btree *p){
! 3240: int rc;
! 3241: sqlite3BtreeEnter(p);
! 3242: rc = sqlite3BtreeCommitPhaseOne(p, 0);
! 3243: if( rc==SQLITE_OK ){
! 3244: rc = sqlite3BtreeCommitPhaseTwo(p, 0);
! 3245: }
! 3246: sqlite3BtreeLeave(p);
! 3247: return rc;
! 3248: }
! 3249:
! 3250: #ifndef NDEBUG
! 3251: /*
! 3252: ** Return the number of write-cursors open on this handle. This is for use
! 3253: ** in assert() expressions, so it is only compiled if NDEBUG is not
! 3254: ** defined.
! 3255: **
! 3256: ** For the purposes of this routine, a write-cursor is any cursor that
! 3257: ** is capable of writing to the databse. That means the cursor was
! 3258: ** originally opened for writing and the cursor has not be disabled
! 3259: ** by having its state changed to CURSOR_FAULT.
! 3260: */
! 3261: static int countWriteCursors(BtShared *pBt){
! 3262: BtCursor *pCur;
! 3263: int r = 0;
! 3264: for(pCur=pBt->pCursor; pCur; pCur=pCur->pNext){
! 3265: if( pCur->wrFlag && pCur->eState!=CURSOR_FAULT ) r++;
! 3266: }
! 3267: return r;
! 3268: }
! 3269: #endif
! 3270:
! 3271: /*
! 3272: ** This routine sets the state to CURSOR_FAULT and the error
! 3273: ** code to errCode for every cursor on BtShared that pBtree
! 3274: ** references.
! 3275: **
! 3276: ** Every cursor is tripped, including cursors that belong
! 3277: ** to other database connections that happen to be sharing
! 3278: ** the cache with pBtree.
! 3279: **
! 3280: ** This routine gets called when a rollback occurs.
! 3281: ** All cursors using the same cache must be tripped
! 3282: ** to prevent them from trying to use the btree after
! 3283: ** the rollback. The rollback may have deleted tables
! 3284: ** or moved root pages, so it is not sufficient to
! 3285: ** save the state of the cursor. The cursor must be
! 3286: ** invalidated.
! 3287: */
! 3288: void sqlite3BtreeTripAllCursors(Btree *pBtree, int errCode){
! 3289: BtCursor *p;
! 3290: sqlite3BtreeEnter(pBtree);
! 3291: for(p=pBtree->pBt->pCursor; p; p=p->pNext){
! 3292: int i;
! 3293: sqlite3BtreeClearCursor(p);
! 3294: p->eState = CURSOR_FAULT;
! 3295: p->skipNext = errCode;
! 3296: for(i=0; i<=p->iPage; i++){
! 3297: releasePage(p->apPage[i]);
! 3298: p->apPage[i] = 0;
! 3299: }
! 3300: }
! 3301: sqlite3BtreeLeave(pBtree);
! 3302: }
! 3303:
! 3304: /*
! 3305: ** Rollback the transaction in progress. All cursors will be
! 3306: ** invalided by this operation. Any attempt to use a cursor
! 3307: ** that was open at the beginning of this operation will result
! 3308: ** in an error.
! 3309: **
! 3310: ** This will release the write lock on the database file. If there
! 3311: ** are no active cursors, it also releases the read lock.
! 3312: */
! 3313: int sqlite3BtreeRollback(Btree *p){
! 3314: int rc;
! 3315: BtShared *pBt = p->pBt;
! 3316: MemPage *pPage1;
! 3317:
! 3318: sqlite3BtreeEnter(p);
! 3319: rc = saveAllCursors(pBt, 0, 0);
! 3320: #ifndef SQLITE_OMIT_SHARED_CACHE
! 3321: if( rc!=SQLITE_OK ){
! 3322: /* This is a horrible situation. An IO or malloc() error occurred whilst
! 3323: ** trying to save cursor positions. If this is an automatic rollback (as
! 3324: ** the result of a constraint, malloc() failure or IO error) then
! 3325: ** the cache may be internally inconsistent (not contain valid trees) so
! 3326: ** we cannot simply return the error to the caller. Instead, abort
! 3327: ** all queries that may be using any of the cursors that failed to save.
! 3328: */
! 3329: sqlite3BtreeTripAllCursors(p, rc);
! 3330: }
! 3331: #endif
! 3332: btreeIntegrity(p);
! 3333:
! 3334: if( p->inTrans==TRANS_WRITE ){
! 3335: int rc2;
! 3336:
! 3337: assert( TRANS_WRITE==pBt->inTransaction );
! 3338: rc2 = sqlite3PagerRollback(pBt->pPager);
! 3339: if( rc2!=SQLITE_OK ){
! 3340: rc = rc2;
! 3341: }
! 3342:
! 3343: /* The rollback may have destroyed the pPage1->aData value. So
! 3344: ** call btreeGetPage() on page 1 again to make
! 3345: ** sure pPage1->aData is set correctly. */
! 3346: if( btreeGetPage(pBt, 1, &pPage1, 0)==SQLITE_OK ){
! 3347: int nPage = get4byte(28+(u8*)pPage1->aData);
! 3348: testcase( nPage==0 );
! 3349: if( nPage==0 ) sqlite3PagerPagecount(pBt->pPager, &nPage);
! 3350: testcase( pBt->nPage!=nPage );
! 3351: pBt->nPage = nPage;
! 3352: releasePage(pPage1);
! 3353: }
! 3354: assert( countWriteCursors(pBt)==0 );
! 3355: pBt->inTransaction = TRANS_READ;
! 3356: }
! 3357:
! 3358: btreeEndTransaction(p);
! 3359: sqlite3BtreeLeave(p);
! 3360: return rc;
! 3361: }
! 3362:
! 3363: /*
! 3364: ** Start a statement subtransaction. The subtransaction can can be rolled
! 3365: ** back independently of the main transaction. You must start a transaction
! 3366: ** before starting a subtransaction. The subtransaction is ended automatically
! 3367: ** if the main transaction commits or rolls back.
! 3368: **
! 3369: ** Statement subtransactions are used around individual SQL statements
! 3370: ** that are contained within a BEGIN...COMMIT block. If a constraint
! 3371: ** error occurs within the statement, the effect of that one statement
! 3372: ** can be rolled back without having to rollback the entire transaction.
! 3373: **
! 3374: ** A statement sub-transaction is implemented as an anonymous savepoint. The
! 3375: ** value passed as the second parameter is the total number of savepoints,
! 3376: ** including the new anonymous savepoint, open on the B-Tree. i.e. if there
! 3377: ** are no active savepoints and no other statement-transactions open,
! 3378: ** iStatement is 1. This anonymous savepoint can be released or rolled back
! 3379: ** using the sqlite3BtreeSavepoint() function.
! 3380: */
! 3381: int sqlite3BtreeBeginStmt(Btree *p, int iStatement){
! 3382: int rc;
! 3383: BtShared *pBt = p->pBt;
! 3384: sqlite3BtreeEnter(p);
! 3385: assert( p->inTrans==TRANS_WRITE );
! 3386: assert( (pBt->btsFlags & BTS_READ_ONLY)==0 );
! 3387: assert( iStatement>0 );
! 3388: assert( iStatement>p->db->nSavepoint );
! 3389: assert( pBt->inTransaction==TRANS_WRITE );
! 3390: /* At the pager level, a statement transaction is a savepoint with
! 3391: ** an index greater than all savepoints created explicitly using
! 3392: ** SQL statements. It is illegal to open, release or rollback any
! 3393: ** such savepoints while the statement transaction savepoint is active.
! 3394: */
! 3395: rc = sqlite3PagerOpenSavepoint(pBt->pPager, iStatement);
! 3396: sqlite3BtreeLeave(p);
! 3397: return rc;
! 3398: }
! 3399:
! 3400: /*
! 3401: ** The second argument to this function, op, is always SAVEPOINT_ROLLBACK
! 3402: ** or SAVEPOINT_RELEASE. This function either releases or rolls back the
! 3403: ** savepoint identified by parameter iSavepoint, depending on the value
! 3404: ** of op.
! 3405: **
! 3406: ** Normally, iSavepoint is greater than or equal to zero. However, if op is
! 3407: ** SAVEPOINT_ROLLBACK, then iSavepoint may also be -1. In this case the
! 3408: ** contents of the entire transaction are rolled back. This is different
! 3409: ** from a normal transaction rollback, as no locks are released and the
! 3410: ** transaction remains open.
! 3411: */
! 3412: int sqlite3BtreeSavepoint(Btree *p, int op, int iSavepoint){
! 3413: int rc = SQLITE_OK;
! 3414: if( p && p->inTrans==TRANS_WRITE ){
! 3415: BtShared *pBt = p->pBt;
! 3416: assert( op==SAVEPOINT_RELEASE || op==SAVEPOINT_ROLLBACK );
! 3417: assert( iSavepoint>=0 || (iSavepoint==-1 && op==SAVEPOINT_ROLLBACK) );
! 3418: sqlite3BtreeEnter(p);
! 3419: rc = sqlite3PagerSavepoint(pBt->pPager, op, iSavepoint);
! 3420: if( rc==SQLITE_OK ){
! 3421: if( iSavepoint<0 && (pBt->btsFlags & BTS_INITIALLY_EMPTY)!=0 ){
! 3422: pBt->nPage = 0;
! 3423: }
! 3424: rc = newDatabase(pBt);
! 3425: pBt->nPage = get4byte(28 + pBt->pPage1->aData);
! 3426:
! 3427: /* The database size was written into the offset 28 of the header
! 3428: ** when the transaction started, so we know that the value at offset
! 3429: ** 28 is nonzero. */
! 3430: assert( pBt->nPage>0 );
! 3431: }
! 3432: sqlite3BtreeLeave(p);
! 3433: }
! 3434: return rc;
! 3435: }
! 3436:
! 3437: /*
! 3438: ** Create a new cursor for the BTree whose root is on the page
! 3439: ** iTable. If a read-only cursor is requested, it is assumed that
! 3440: ** the caller already has at least a read-only transaction open
! 3441: ** on the database already. If a write-cursor is requested, then
! 3442: ** the caller is assumed to have an open write transaction.
! 3443: **
! 3444: ** If wrFlag==0, then the cursor can only be used for reading.
! 3445: ** If wrFlag==1, then the cursor can be used for reading or for
! 3446: ** writing if other conditions for writing are also met. These
! 3447: ** are the conditions that must be met in order for writing to
! 3448: ** be allowed:
! 3449: **
! 3450: ** 1: The cursor must have been opened with wrFlag==1
! 3451: **
! 3452: ** 2: Other database connections that share the same pager cache
! 3453: ** but which are not in the READ_UNCOMMITTED state may not have
! 3454: ** cursors open with wrFlag==0 on the same table. Otherwise
! 3455: ** the changes made by this write cursor would be visible to
! 3456: ** the read cursors in the other database connection.
! 3457: **
! 3458: ** 3: The database must be writable (not on read-only media)
! 3459: **
! 3460: ** 4: There must be an active transaction.
! 3461: **
! 3462: ** No checking is done to make sure that page iTable really is the
! 3463: ** root page of a b-tree. If it is not, then the cursor acquired
! 3464: ** will not work correctly.
! 3465: **
! 3466: ** It is assumed that the sqlite3BtreeCursorZero() has been called
! 3467: ** on pCur to initialize the memory space prior to invoking this routine.
! 3468: */
! 3469: static int btreeCursor(
! 3470: Btree *p, /* The btree */
! 3471: int iTable, /* Root page of table to open */
! 3472: int wrFlag, /* 1 to write. 0 read-only */
! 3473: struct KeyInfo *pKeyInfo, /* First arg to comparison function */
! 3474: BtCursor *pCur /* Space for new cursor */
! 3475: ){
! 3476: BtShared *pBt = p->pBt; /* Shared b-tree handle */
! 3477:
! 3478: assert( sqlite3BtreeHoldsMutex(p) );
! 3479: assert( wrFlag==0 || wrFlag==1 );
! 3480:
! 3481: /* The following assert statements verify that if this is a sharable
! 3482: ** b-tree database, the connection is holding the required table locks,
! 3483: ** and that no other connection has any open cursor that conflicts with
! 3484: ** this lock. */
! 3485: assert( hasSharedCacheTableLock(p, iTable, pKeyInfo!=0, wrFlag+1) );
! 3486: assert( wrFlag==0 || !hasReadConflicts(p, iTable) );
! 3487:
! 3488: /* Assert that the caller has opened the required transaction. */
! 3489: assert( p->inTrans>TRANS_NONE );
! 3490: assert( wrFlag==0 || p->inTrans==TRANS_WRITE );
! 3491: assert( pBt->pPage1 && pBt->pPage1->aData );
! 3492:
! 3493: if( NEVER(wrFlag && (pBt->btsFlags & BTS_READ_ONLY)!=0) ){
! 3494: return SQLITE_READONLY;
! 3495: }
! 3496: if( iTable==1 && btreePagecount(pBt)==0 ){
! 3497: assert( wrFlag==0 );
! 3498: iTable = 0;
! 3499: }
! 3500:
! 3501: /* Now that no other errors can occur, finish filling in the BtCursor
! 3502: ** variables and link the cursor into the BtShared list. */
! 3503: pCur->pgnoRoot = (Pgno)iTable;
! 3504: pCur->iPage = -1;
! 3505: pCur->pKeyInfo = pKeyInfo;
! 3506: pCur->pBtree = p;
! 3507: pCur->pBt = pBt;
! 3508: pCur->wrFlag = (u8)wrFlag;
! 3509: pCur->pNext = pBt->pCursor;
! 3510: if( pCur->pNext ){
! 3511: pCur->pNext->pPrev = pCur;
! 3512: }
! 3513: pBt->pCursor = pCur;
! 3514: pCur->eState = CURSOR_INVALID;
! 3515: pCur->cachedRowid = 0;
! 3516: return SQLITE_OK;
! 3517: }
! 3518: int sqlite3BtreeCursor(
! 3519: Btree *p, /* The btree */
! 3520: int iTable, /* Root page of table to open */
! 3521: int wrFlag, /* 1 to write. 0 read-only */
! 3522: struct KeyInfo *pKeyInfo, /* First arg to xCompare() */
! 3523: BtCursor *pCur /* Write new cursor here */
! 3524: ){
! 3525: int rc;
! 3526: sqlite3BtreeEnter(p);
! 3527: rc = btreeCursor(p, iTable, wrFlag, pKeyInfo, pCur);
! 3528: sqlite3BtreeLeave(p);
! 3529: return rc;
! 3530: }
! 3531:
! 3532: /*
! 3533: ** Return the size of a BtCursor object in bytes.
! 3534: **
! 3535: ** This interfaces is needed so that users of cursors can preallocate
! 3536: ** sufficient storage to hold a cursor. The BtCursor object is opaque
! 3537: ** to users so they cannot do the sizeof() themselves - they must call
! 3538: ** this routine.
! 3539: */
! 3540: int sqlite3BtreeCursorSize(void){
! 3541: return ROUND8(sizeof(BtCursor));
! 3542: }
! 3543:
! 3544: /*
! 3545: ** Initialize memory that will be converted into a BtCursor object.
! 3546: **
! 3547: ** The simple approach here would be to memset() the entire object
! 3548: ** to zero. But it turns out that the apPage[] and aiIdx[] arrays
! 3549: ** do not need to be zeroed and they are large, so we can save a lot
! 3550: ** of run-time by skipping the initialization of those elements.
! 3551: */
! 3552: void sqlite3BtreeCursorZero(BtCursor *p){
! 3553: memset(p, 0, offsetof(BtCursor, iPage));
! 3554: }
! 3555:
! 3556: /*
! 3557: ** Set the cached rowid value of every cursor in the same database file
! 3558: ** as pCur and having the same root page number as pCur. The value is
! 3559: ** set to iRowid.
! 3560: **
! 3561: ** Only positive rowid values are considered valid for this cache.
! 3562: ** The cache is initialized to zero, indicating an invalid cache.
! 3563: ** A btree will work fine with zero or negative rowids. We just cannot
! 3564: ** cache zero or negative rowids, which means tables that use zero or
! 3565: ** negative rowids might run a little slower. But in practice, zero
! 3566: ** or negative rowids are very uncommon so this should not be a problem.
! 3567: */
! 3568: void sqlite3BtreeSetCachedRowid(BtCursor *pCur, sqlite3_int64 iRowid){
! 3569: BtCursor *p;
! 3570: for(p=pCur->pBt->pCursor; p; p=p->pNext){
! 3571: if( p->pgnoRoot==pCur->pgnoRoot ) p->cachedRowid = iRowid;
! 3572: }
! 3573: assert( pCur->cachedRowid==iRowid );
! 3574: }
! 3575:
! 3576: /*
! 3577: ** Return the cached rowid for the given cursor. A negative or zero
! 3578: ** return value indicates that the rowid cache is invalid and should be
! 3579: ** ignored. If the rowid cache has never before been set, then a
! 3580: ** zero is returned.
! 3581: */
! 3582: sqlite3_int64 sqlite3BtreeGetCachedRowid(BtCursor *pCur){
! 3583: return pCur->cachedRowid;
! 3584: }
! 3585:
! 3586: /*
! 3587: ** Close a cursor. The read lock on the database file is released
! 3588: ** when the last cursor is closed.
! 3589: */
! 3590: int sqlite3BtreeCloseCursor(BtCursor *pCur){
! 3591: Btree *pBtree = pCur->pBtree;
! 3592: if( pBtree ){
! 3593: int i;
! 3594: BtShared *pBt = pCur->pBt;
! 3595: sqlite3BtreeEnter(pBtree);
! 3596: sqlite3BtreeClearCursor(pCur);
! 3597: if( pCur->pPrev ){
! 3598: pCur->pPrev->pNext = pCur->pNext;
! 3599: }else{
! 3600: pBt->pCursor = pCur->pNext;
! 3601: }
! 3602: if( pCur->pNext ){
! 3603: pCur->pNext->pPrev = pCur->pPrev;
! 3604: }
! 3605: for(i=0; i<=pCur->iPage; i++){
! 3606: releasePage(pCur->apPage[i]);
! 3607: }
! 3608: unlockBtreeIfUnused(pBt);
! 3609: invalidateOverflowCache(pCur);
! 3610: /* sqlite3_free(pCur); */
! 3611: sqlite3BtreeLeave(pBtree);
! 3612: }
! 3613: return SQLITE_OK;
! 3614: }
! 3615:
! 3616: /*
! 3617: ** Make sure the BtCursor* given in the argument has a valid
! 3618: ** BtCursor.info structure. If it is not already valid, call
! 3619: ** btreeParseCell() to fill it in.
! 3620: **
! 3621: ** BtCursor.info is a cache of the information in the current cell.
! 3622: ** Using this cache reduces the number of calls to btreeParseCell().
! 3623: **
! 3624: ** 2007-06-25: There is a bug in some versions of MSVC that cause the
! 3625: ** compiler to crash when getCellInfo() is implemented as a macro.
! 3626: ** But there is a measureable speed advantage to using the macro on gcc
! 3627: ** (when less compiler optimizations like -Os or -O0 are used and the
! 3628: ** compiler is not doing agressive inlining.) So we use a real function
! 3629: ** for MSVC and a macro for everything else. Ticket #2457.
! 3630: */
! 3631: #ifndef NDEBUG
! 3632: static void assertCellInfo(BtCursor *pCur){
! 3633: CellInfo info;
! 3634: int iPage = pCur->iPage;
! 3635: memset(&info, 0, sizeof(info));
! 3636: btreeParseCell(pCur->apPage[iPage], pCur->aiIdx[iPage], &info);
! 3637: assert( memcmp(&info, &pCur->info, sizeof(info))==0 );
! 3638: }
! 3639: #else
! 3640: #define assertCellInfo(x)
! 3641: #endif
! 3642: #ifdef _MSC_VER
! 3643: /* Use a real function in MSVC to work around bugs in that compiler. */
! 3644: static void getCellInfo(BtCursor *pCur){
! 3645: if( pCur->info.nSize==0 ){
! 3646: int iPage = pCur->iPage;
! 3647: btreeParseCell(pCur->apPage[iPage],pCur->aiIdx[iPage],&pCur->info);
! 3648: pCur->validNKey = 1;
! 3649: }else{
! 3650: assertCellInfo(pCur);
! 3651: }
! 3652: }
! 3653: #else /* if not _MSC_VER */
! 3654: /* Use a macro in all other compilers so that the function is inlined */
! 3655: #define getCellInfo(pCur) \
! 3656: if( pCur->info.nSize==0 ){ \
! 3657: int iPage = pCur->iPage; \
! 3658: btreeParseCell(pCur->apPage[iPage],pCur->aiIdx[iPage],&pCur->info); \
! 3659: pCur->validNKey = 1; \
! 3660: }else{ \
! 3661: assertCellInfo(pCur); \
! 3662: }
! 3663: #endif /* _MSC_VER */
! 3664:
! 3665: #ifndef NDEBUG /* The next routine used only within assert() statements */
! 3666: /*
! 3667: ** Return true if the given BtCursor is valid. A valid cursor is one
! 3668: ** that is currently pointing to a row in a (non-empty) table.
! 3669: ** This is a verification routine is used only within assert() statements.
! 3670: */
! 3671: int sqlite3BtreeCursorIsValid(BtCursor *pCur){
! 3672: return pCur && pCur->eState==CURSOR_VALID;
! 3673: }
! 3674: #endif /* NDEBUG */
! 3675:
! 3676: /*
! 3677: ** Set *pSize to the size of the buffer needed to hold the value of
! 3678: ** the key for the current entry. If the cursor is not pointing
! 3679: ** to a valid entry, *pSize is set to 0.
! 3680: **
! 3681: ** For a table with the INTKEY flag set, this routine returns the key
! 3682: ** itself, not the number of bytes in the key.
! 3683: **
! 3684: ** The caller must position the cursor prior to invoking this routine.
! 3685: **
! 3686: ** This routine cannot fail. It always returns SQLITE_OK.
! 3687: */
! 3688: int sqlite3BtreeKeySize(BtCursor *pCur, i64 *pSize){
! 3689: assert( cursorHoldsMutex(pCur) );
! 3690: assert( pCur->eState==CURSOR_INVALID || pCur->eState==CURSOR_VALID );
! 3691: if( pCur->eState!=CURSOR_VALID ){
! 3692: *pSize = 0;
! 3693: }else{
! 3694: getCellInfo(pCur);
! 3695: *pSize = pCur->info.nKey;
! 3696: }
! 3697: return SQLITE_OK;
! 3698: }
! 3699:
! 3700: /*
! 3701: ** Set *pSize to the number of bytes of data in the entry the
! 3702: ** cursor currently points to.
! 3703: **
! 3704: ** The caller must guarantee that the cursor is pointing to a non-NULL
! 3705: ** valid entry. In other words, the calling procedure must guarantee
! 3706: ** that the cursor has Cursor.eState==CURSOR_VALID.
! 3707: **
! 3708: ** Failure is not possible. This function always returns SQLITE_OK.
! 3709: ** It might just as well be a procedure (returning void) but we continue
! 3710: ** to return an integer result code for historical reasons.
! 3711: */
! 3712: int sqlite3BtreeDataSize(BtCursor *pCur, u32 *pSize){
! 3713: assert( cursorHoldsMutex(pCur) );
! 3714: assert( pCur->eState==CURSOR_VALID );
! 3715: getCellInfo(pCur);
! 3716: *pSize = pCur->info.nData;
! 3717: return SQLITE_OK;
! 3718: }
! 3719:
! 3720: /*
! 3721: ** Given the page number of an overflow page in the database (parameter
! 3722: ** ovfl), this function finds the page number of the next page in the
! 3723: ** linked list of overflow pages. If possible, it uses the auto-vacuum
! 3724: ** pointer-map data instead of reading the content of page ovfl to do so.
! 3725: **
! 3726: ** If an error occurs an SQLite error code is returned. Otherwise:
! 3727: **
! 3728: ** The page number of the next overflow page in the linked list is
! 3729: ** written to *pPgnoNext. If page ovfl is the last page in its linked
! 3730: ** list, *pPgnoNext is set to zero.
! 3731: **
! 3732: ** If ppPage is not NULL, and a reference to the MemPage object corresponding
! 3733: ** to page number pOvfl was obtained, then *ppPage is set to point to that
! 3734: ** reference. It is the responsibility of the caller to call releasePage()
! 3735: ** on *ppPage to free the reference. In no reference was obtained (because
! 3736: ** the pointer-map was used to obtain the value for *pPgnoNext), then
! 3737: ** *ppPage is set to zero.
! 3738: */
! 3739: static int getOverflowPage(
! 3740: BtShared *pBt, /* The database file */
! 3741: Pgno ovfl, /* Current overflow page number */
! 3742: MemPage **ppPage, /* OUT: MemPage handle (may be NULL) */
! 3743: Pgno *pPgnoNext /* OUT: Next overflow page number */
! 3744: ){
! 3745: Pgno next = 0;
! 3746: MemPage *pPage = 0;
! 3747: int rc = SQLITE_OK;
! 3748:
! 3749: assert( sqlite3_mutex_held(pBt->mutex) );
! 3750: assert(pPgnoNext);
! 3751:
! 3752: #ifndef SQLITE_OMIT_AUTOVACUUM
! 3753: /* Try to find the next page in the overflow list using the
! 3754: ** autovacuum pointer-map pages. Guess that the next page in
! 3755: ** the overflow list is page number (ovfl+1). If that guess turns
! 3756: ** out to be wrong, fall back to loading the data of page
! 3757: ** number ovfl to determine the next page number.
! 3758: */
! 3759: if( pBt->autoVacuum ){
! 3760: Pgno pgno;
! 3761: Pgno iGuess = ovfl+1;
! 3762: u8 eType;
! 3763:
! 3764: while( PTRMAP_ISPAGE(pBt, iGuess) || iGuess==PENDING_BYTE_PAGE(pBt) ){
! 3765: iGuess++;
! 3766: }
! 3767:
! 3768: if( iGuess<=btreePagecount(pBt) ){
! 3769: rc = ptrmapGet(pBt, iGuess, &eType, &pgno);
! 3770: if( rc==SQLITE_OK && eType==PTRMAP_OVERFLOW2 && pgno==ovfl ){
! 3771: next = iGuess;
! 3772: rc = SQLITE_DONE;
! 3773: }
! 3774: }
! 3775: }
! 3776: #endif
! 3777:
! 3778: assert( next==0 || rc==SQLITE_DONE );
! 3779: if( rc==SQLITE_OK ){
! 3780: rc = btreeGetPage(pBt, ovfl, &pPage, 0);
! 3781: assert( rc==SQLITE_OK || pPage==0 );
! 3782: if( rc==SQLITE_OK ){
! 3783: next = get4byte(pPage->aData);
! 3784: }
! 3785: }
! 3786:
! 3787: *pPgnoNext = next;
! 3788: if( ppPage ){
! 3789: *ppPage = pPage;
! 3790: }else{
! 3791: releasePage(pPage);
! 3792: }
! 3793: return (rc==SQLITE_DONE ? SQLITE_OK : rc);
! 3794: }
! 3795:
! 3796: /*
! 3797: ** Copy data from a buffer to a page, or from a page to a buffer.
! 3798: **
! 3799: ** pPayload is a pointer to data stored on database page pDbPage.
! 3800: ** If argument eOp is false, then nByte bytes of data are copied
! 3801: ** from pPayload to the buffer pointed at by pBuf. If eOp is true,
! 3802: ** then sqlite3PagerWrite() is called on pDbPage and nByte bytes
! 3803: ** of data are copied from the buffer pBuf to pPayload.
! 3804: **
! 3805: ** SQLITE_OK is returned on success, otherwise an error code.
! 3806: */
! 3807: static int copyPayload(
! 3808: void *pPayload, /* Pointer to page data */
! 3809: void *pBuf, /* Pointer to buffer */
! 3810: int nByte, /* Number of bytes to copy */
! 3811: int eOp, /* 0 -> copy from page, 1 -> copy to page */
! 3812: DbPage *pDbPage /* Page containing pPayload */
! 3813: ){
! 3814: if( eOp ){
! 3815: /* Copy data from buffer to page (a write operation) */
! 3816: int rc = sqlite3PagerWrite(pDbPage);
! 3817: if( rc!=SQLITE_OK ){
! 3818: return rc;
! 3819: }
! 3820: memcpy(pPayload, pBuf, nByte);
! 3821: }else{
! 3822: /* Copy data from page to buffer (a read operation) */
! 3823: memcpy(pBuf, pPayload, nByte);
! 3824: }
! 3825: return SQLITE_OK;
! 3826: }
! 3827:
! 3828: /*
! 3829: ** This function is used to read or overwrite payload information
! 3830: ** for the entry that the pCur cursor is pointing to. If the eOp
! 3831: ** parameter is 0, this is a read operation (data copied into
! 3832: ** buffer pBuf). If it is non-zero, a write (data copied from
! 3833: ** buffer pBuf).
! 3834: **
! 3835: ** A total of "amt" bytes are read or written beginning at "offset".
! 3836: ** Data is read to or from the buffer pBuf.
! 3837: **
! 3838: ** The content being read or written might appear on the main page
! 3839: ** or be scattered out on multiple overflow pages.
! 3840: **
! 3841: ** If the BtCursor.isIncrblobHandle flag is set, and the current
! 3842: ** cursor entry uses one or more overflow pages, this function
! 3843: ** allocates space for and lazily popluates the overflow page-list
! 3844: ** cache array (BtCursor.aOverflow). Subsequent calls use this
! 3845: ** cache to make seeking to the supplied offset more efficient.
! 3846: **
! 3847: ** Once an overflow page-list cache has been allocated, it may be
! 3848: ** invalidated if some other cursor writes to the same table, or if
! 3849: ** the cursor is moved to a different row. Additionally, in auto-vacuum
! 3850: ** mode, the following events may invalidate an overflow page-list cache.
! 3851: **
! 3852: ** * An incremental vacuum,
! 3853: ** * A commit in auto_vacuum="full" mode,
! 3854: ** * Creating a table (may require moving an overflow page).
! 3855: */
! 3856: static int accessPayload(
! 3857: BtCursor *pCur, /* Cursor pointing to entry to read from */
! 3858: u32 offset, /* Begin reading this far into payload */
! 3859: u32 amt, /* Read this many bytes */
! 3860: unsigned char *pBuf, /* Write the bytes into this buffer */
! 3861: int eOp /* zero to read. non-zero to write. */
! 3862: ){
! 3863: unsigned char *aPayload;
! 3864: int rc = SQLITE_OK;
! 3865: u32 nKey;
! 3866: int iIdx = 0;
! 3867: MemPage *pPage = pCur->apPage[pCur->iPage]; /* Btree page of current entry */
! 3868: BtShared *pBt = pCur->pBt; /* Btree this cursor belongs to */
! 3869:
! 3870: assert( pPage );
! 3871: assert( pCur->eState==CURSOR_VALID );
! 3872: assert( pCur->aiIdx[pCur->iPage]<pPage->nCell );
! 3873: assert( cursorHoldsMutex(pCur) );
! 3874:
! 3875: getCellInfo(pCur);
! 3876: aPayload = pCur->info.pCell + pCur->info.nHeader;
! 3877: nKey = (pPage->intKey ? 0 : (int)pCur->info.nKey);
! 3878:
! 3879: if( NEVER(offset+amt > nKey+pCur->info.nData)
! 3880: || &aPayload[pCur->info.nLocal] > &pPage->aData[pBt->usableSize]
! 3881: ){
! 3882: /* Trying to read or write past the end of the data is an error */
! 3883: return SQLITE_CORRUPT_BKPT;
! 3884: }
! 3885:
! 3886: /* Check if data must be read/written to/from the btree page itself. */
! 3887: if( offset<pCur->info.nLocal ){
! 3888: int a = amt;
! 3889: if( a+offset>pCur->info.nLocal ){
! 3890: a = pCur->info.nLocal - offset;
! 3891: }
! 3892: rc = copyPayload(&aPayload[offset], pBuf, a, eOp, pPage->pDbPage);
! 3893: offset = 0;
! 3894: pBuf += a;
! 3895: amt -= a;
! 3896: }else{
! 3897: offset -= pCur->info.nLocal;
! 3898: }
! 3899:
! 3900: if( rc==SQLITE_OK && amt>0 ){
! 3901: const u32 ovflSize = pBt->usableSize - 4; /* Bytes content per ovfl page */
! 3902: Pgno nextPage;
! 3903:
! 3904: nextPage = get4byte(&aPayload[pCur->info.nLocal]);
! 3905:
! 3906: #ifndef SQLITE_OMIT_INCRBLOB
! 3907: /* If the isIncrblobHandle flag is set and the BtCursor.aOverflow[]
! 3908: ** has not been allocated, allocate it now. The array is sized at
! 3909: ** one entry for each overflow page in the overflow chain. The
! 3910: ** page number of the first overflow page is stored in aOverflow[0],
! 3911: ** etc. A value of 0 in the aOverflow[] array means "not yet known"
! 3912: ** (the cache is lazily populated).
! 3913: */
! 3914: if( pCur->isIncrblobHandle && !pCur->aOverflow ){
! 3915: int nOvfl = (pCur->info.nPayload-pCur->info.nLocal+ovflSize-1)/ovflSize;
! 3916: pCur->aOverflow = (Pgno *)sqlite3MallocZero(sizeof(Pgno)*nOvfl);
! 3917: /* nOvfl is always positive. If it were zero, fetchPayload would have
! 3918: ** been used instead of this routine. */
! 3919: if( ALWAYS(nOvfl) && !pCur->aOverflow ){
! 3920: rc = SQLITE_NOMEM;
! 3921: }
! 3922: }
! 3923:
! 3924: /* If the overflow page-list cache has been allocated and the
! 3925: ** entry for the first required overflow page is valid, skip
! 3926: ** directly to it.
! 3927: */
! 3928: if( pCur->aOverflow && pCur->aOverflow[offset/ovflSize] ){
! 3929: iIdx = (offset/ovflSize);
! 3930: nextPage = pCur->aOverflow[iIdx];
! 3931: offset = (offset%ovflSize);
! 3932: }
! 3933: #endif
! 3934:
! 3935: for( ; rc==SQLITE_OK && amt>0 && nextPage; iIdx++){
! 3936:
! 3937: #ifndef SQLITE_OMIT_INCRBLOB
! 3938: /* If required, populate the overflow page-list cache. */
! 3939: if( pCur->aOverflow ){
! 3940: assert(!pCur->aOverflow[iIdx] || pCur->aOverflow[iIdx]==nextPage);
! 3941: pCur->aOverflow[iIdx] = nextPage;
! 3942: }
! 3943: #endif
! 3944:
! 3945: if( offset>=ovflSize ){
! 3946: /* The only reason to read this page is to obtain the page
! 3947: ** number for the next page in the overflow chain. The page
! 3948: ** data is not required. So first try to lookup the overflow
! 3949: ** page-list cache, if any, then fall back to the getOverflowPage()
! 3950: ** function.
! 3951: */
! 3952: #ifndef SQLITE_OMIT_INCRBLOB
! 3953: if( pCur->aOverflow && pCur->aOverflow[iIdx+1] ){
! 3954: nextPage = pCur->aOverflow[iIdx+1];
! 3955: } else
! 3956: #endif
! 3957: rc = getOverflowPage(pBt, nextPage, 0, &nextPage);
! 3958: offset -= ovflSize;
! 3959: }else{
! 3960: /* Need to read this page properly. It contains some of the
! 3961: ** range of data that is being read (eOp==0) or written (eOp!=0).
! 3962: */
! 3963: #ifdef SQLITE_DIRECT_OVERFLOW_READ
! 3964: sqlite3_file *fd;
! 3965: #endif
! 3966: int a = amt;
! 3967: if( a + offset > ovflSize ){
! 3968: a = ovflSize - offset;
! 3969: }
! 3970:
! 3971: #ifdef SQLITE_DIRECT_OVERFLOW_READ
! 3972: /* If all the following are true:
! 3973: **
! 3974: ** 1) this is a read operation, and
! 3975: ** 2) data is required from the start of this overflow page, and
! 3976: ** 3) the database is file-backed, and
! 3977: ** 4) there is no open write-transaction, and
! 3978: ** 5) the database is not a WAL database,
! 3979: **
! 3980: ** then data can be read directly from the database file into the
! 3981: ** output buffer, bypassing the page-cache altogether. This speeds
! 3982: ** up loading large records that span many overflow pages.
! 3983: */
! 3984: if( eOp==0 /* (1) */
! 3985: && offset==0 /* (2) */
! 3986: && pBt->inTransaction==TRANS_READ /* (4) */
! 3987: && (fd = sqlite3PagerFile(pBt->pPager))->pMethods /* (3) */
! 3988: && pBt->pPage1->aData[19]==0x01 /* (5) */
! 3989: ){
! 3990: u8 aSave[4];
! 3991: u8 *aWrite = &pBuf[-4];
! 3992: memcpy(aSave, aWrite, 4);
! 3993: rc = sqlite3OsRead(fd, aWrite, a+4, (i64)pBt->pageSize*(nextPage-1));
! 3994: nextPage = get4byte(aWrite);
! 3995: memcpy(aWrite, aSave, 4);
! 3996: }else
! 3997: #endif
! 3998:
! 3999: {
! 4000: DbPage *pDbPage;
! 4001: rc = sqlite3PagerGet(pBt->pPager, nextPage, &pDbPage);
! 4002: if( rc==SQLITE_OK ){
! 4003: aPayload = sqlite3PagerGetData(pDbPage);
! 4004: nextPage = get4byte(aPayload);
! 4005: rc = copyPayload(&aPayload[offset+4], pBuf, a, eOp, pDbPage);
! 4006: sqlite3PagerUnref(pDbPage);
! 4007: offset = 0;
! 4008: }
! 4009: }
! 4010: amt -= a;
! 4011: pBuf += a;
! 4012: }
! 4013: }
! 4014: }
! 4015:
! 4016: if( rc==SQLITE_OK && amt>0 ){
! 4017: return SQLITE_CORRUPT_BKPT;
! 4018: }
! 4019: return rc;
! 4020: }
! 4021:
! 4022: /*
! 4023: ** Read part of the key associated with cursor pCur. Exactly
! 4024: ** "amt" bytes will be transfered into pBuf[]. The transfer
! 4025: ** begins at "offset".
! 4026: **
! 4027: ** The caller must ensure that pCur is pointing to a valid row
! 4028: ** in the table.
! 4029: **
! 4030: ** Return SQLITE_OK on success or an error code if anything goes
! 4031: ** wrong. An error is returned if "offset+amt" is larger than
! 4032: ** the available payload.
! 4033: */
! 4034: int sqlite3BtreeKey(BtCursor *pCur, u32 offset, u32 amt, void *pBuf){
! 4035: assert( cursorHoldsMutex(pCur) );
! 4036: assert( pCur->eState==CURSOR_VALID );
! 4037: assert( pCur->iPage>=0 && pCur->apPage[pCur->iPage] );
! 4038: assert( pCur->aiIdx[pCur->iPage]<pCur->apPage[pCur->iPage]->nCell );
! 4039: return accessPayload(pCur, offset, amt, (unsigned char*)pBuf, 0);
! 4040: }
! 4041:
! 4042: /*
! 4043: ** Read part of the data associated with cursor pCur. Exactly
! 4044: ** "amt" bytes will be transfered into pBuf[]. The transfer
! 4045: ** begins at "offset".
! 4046: **
! 4047: ** Return SQLITE_OK on success or an error code if anything goes
! 4048: ** wrong. An error is returned if "offset+amt" is larger than
! 4049: ** the available payload.
! 4050: */
! 4051: int sqlite3BtreeData(BtCursor *pCur, u32 offset, u32 amt, void *pBuf){
! 4052: int rc;
! 4053:
! 4054: #ifndef SQLITE_OMIT_INCRBLOB
! 4055: if ( pCur->eState==CURSOR_INVALID ){
! 4056: return SQLITE_ABORT;
! 4057: }
! 4058: #endif
! 4059:
! 4060: assert( cursorHoldsMutex(pCur) );
! 4061: rc = restoreCursorPosition(pCur);
! 4062: if( rc==SQLITE_OK ){
! 4063: assert( pCur->eState==CURSOR_VALID );
! 4064: assert( pCur->iPage>=0 && pCur->apPage[pCur->iPage] );
! 4065: assert( pCur->aiIdx[pCur->iPage]<pCur->apPage[pCur->iPage]->nCell );
! 4066: rc = accessPayload(pCur, offset, amt, pBuf, 0);
! 4067: }
! 4068: return rc;
! 4069: }
! 4070:
! 4071: /*
! 4072: ** Return a pointer to payload information from the entry that the
! 4073: ** pCur cursor is pointing to. The pointer is to the beginning of
! 4074: ** the key if skipKey==0 and it points to the beginning of data if
! 4075: ** skipKey==1. The number of bytes of available key/data is written
! 4076: ** into *pAmt. If *pAmt==0, then the value returned will not be
! 4077: ** a valid pointer.
! 4078: **
! 4079: ** This routine is an optimization. It is common for the entire key
! 4080: ** and data to fit on the local page and for there to be no overflow
! 4081: ** pages. When that is so, this routine can be used to access the
! 4082: ** key and data without making a copy. If the key and/or data spills
! 4083: ** onto overflow pages, then accessPayload() must be used to reassemble
! 4084: ** the key/data and copy it into a preallocated buffer.
! 4085: **
! 4086: ** The pointer returned by this routine looks directly into the cached
! 4087: ** page of the database. The data might change or move the next time
! 4088: ** any btree routine is called.
! 4089: */
! 4090: static const unsigned char *fetchPayload(
! 4091: BtCursor *pCur, /* Cursor pointing to entry to read from */
! 4092: int *pAmt, /* Write the number of available bytes here */
! 4093: int skipKey /* read beginning at data if this is true */
! 4094: ){
! 4095: unsigned char *aPayload;
! 4096: MemPage *pPage;
! 4097: u32 nKey;
! 4098: u32 nLocal;
! 4099:
! 4100: assert( pCur!=0 && pCur->iPage>=0 && pCur->apPage[pCur->iPage]);
! 4101: assert( pCur->eState==CURSOR_VALID );
! 4102: assert( cursorHoldsMutex(pCur) );
! 4103: pPage = pCur->apPage[pCur->iPage];
! 4104: assert( pCur->aiIdx[pCur->iPage]<pPage->nCell );
! 4105: if( NEVER(pCur->info.nSize==0) ){
! 4106: btreeParseCell(pCur->apPage[pCur->iPage], pCur->aiIdx[pCur->iPage],
! 4107: &pCur->info);
! 4108: }
! 4109: aPayload = pCur->info.pCell;
! 4110: aPayload += pCur->info.nHeader;
! 4111: if( pPage->intKey ){
! 4112: nKey = 0;
! 4113: }else{
! 4114: nKey = (int)pCur->info.nKey;
! 4115: }
! 4116: if( skipKey ){
! 4117: aPayload += nKey;
! 4118: nLocal = pCur->info.nLocal - nKey;
! 4119: }else{
! 4120: nLocal = pCur->info.nLocal;
! 4121: assert( nLocal<=nKey );
! 4122: }
! 4123: *pAmt = nLocal;
! 4124: return aPayload;
! 4125: }
! 4126:
! 4127:
! 4128: /*
! 4129: ** For the entry that cursor pCur is point to, return as
! 4130: ** many bytes of the key or data as are available on the local
! 4131: ** b-tree page. Write the number of available bytes into *pAmt.
! 4132: **
! 4133: ** The pointer returned is ephemeral. The key/data may move
! 4134: ** or be destroyed on the next call to any Btree routine,
! 4135: ** including calls from other threads against the same cache.
! 4136: ** Hence, a mutex on the BtShared should be held prior to calling
! 4137: ** this routine.
! 4138: **
! 4139: ** These routines is used to get quick access to key and data
! 4140: ** in the common case where no overflow pages are used.
! 4141: */
! 4142: const void *sqlite3BtreeKeyFetch(BtCursor *pCur, int *pAmt){
! 4143: const void *p = 0;
! 4144: assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) );
! 4145: assert( cursorHoldsMutex(pCur) );
! 4146: if( ALWAYS(pCur->eState==CURSOR_VALID) ){
! 4147: p = (const void*)fetchPayload(pCur, pAmt, 0);
! 4148: }
! 4149: return p;
! 4150: }
! 4151: const void *sqlite3BtreeDataFetch(BtCursor *pCur, int *pAmt){
! 4152: const void *p = 0;
! 4153: assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) );
! 4154: assert( cursorHoldsMutex(pCur) );
! 4155: if( ALWAYS(pCur->eState==CURSOR_VALID) ){
! 4156: p = (const void*)fetchPayload(pCur, pAmt, 1);
! 4157: }
! 4158: return p;
! 4159: }
! 4160:
! 4161:
! 4162: /*
! 4163: ** Move the cursor down to a new child page. The newPgno argument is the
! 4164: ** page number of the child page to move to.
! 4165: **
! 4166: ** This function returns SQLITE_CORRUPT if the page-header flags field of
! 4167: ** the new child page does not match the flags field of the parent (i.e.
! 4168: ** if an intkey page appears to be the parent of a non-intkey page, or
! 4169: ** vice-versa).
! 4170: */
! 4171: static int moveToChild(BtCursor *pCur, u32 newPgno){
! 4172: int rc;
! 4173: int i = pCur->iPage;
! 4174: MemPage *pNewPage;
! 4175: BtShared *pBt = pCur->pBt;
! 4176:
! 4177: assert( cursorHoldsMutex(pCur) );
! 4178: assert( pCur->eState==CURSOR_VALID );
! 4179: assert( pCur->iPage<BTCURSOR_MAX_DEPTH );
! 4180: if( pCur->iPage>=(BTCURSOR_MAX_DEPTH-1) ){
! 4181: return SQLITE_CORRUPT_BKPT;
! 4182: }
! 4183: rc = getAndInitPage(pBt, newPgno, &pNewPage);
! 4184: if( rc ) return rc;
! 4185: pCur->apPage[i+1] = pNewPage;
! 4186: pCur->aiIdx[i+1] = 0;
! 4187: pCur->iPage++;
! 4188:
! 4189: pCur->info.nSize = 0;
! 4190: pCur->validNKey = 0;
! 4191: if( pNewPage->nCell<1 || pNewPage->intKey!=pCur->apPage[i]->intKey ){
! 4192: return SQLITE_CORRUPT_BKPT;
! 4193: }
! 4194: return SQLITE_OK;
! 4195: }
! 4196:
! 4197: #if 0
! 4198: /*
! 4199: ** Page pParent is an internal (non-leaf) tree page. This function
! 4200: ** asserts that page number iChild is the left-child if the iIdx'th
! 4201: ** cell in page pParent. Or, if iIdx is equal to the total number of
! 4202: ** cells in pParent, that page number iChild is the right-child of
! 4203: ** the page.
! 4204: */
! 4205: static void assertParentIndex(MemPage *pParent, int iIdx, Pgno iChild){
! 4206: assert( iIdx<=pParent->nCell );
! 4207: if( iIdx==pParent->nCell ){
! 4208: assert( get4byte(&pParent->aData[pParent->hdrOffset+8])==iChild );
! 4209: }else{
! 4210: assert( get4byte(findCell(pParent, iIdx))==iChild );
! 4211: }
! 4212: }
! 4213: #else
! 4214: # define assertParentIndex(x,y,z)
! 4215: #endif
! 4216:
! 4217: /*
! 4218: ** Move the cursor up to the parent page.
! 4219: **
! 4220: ** pCur->idx is set to the cell index that contains the pointer
! 4221: ** to the page we are coming from. If we are coming from the
! 4222: ** right-most child page then pCur->idx is set to one more than
! 4223: ** the largest cell index.
! 4224: */
! 4225: static void moveToParent(BtCursor *pCur){
! 4226: assert( cursorHoldsMutex(pCur) );
! 4227: assert( pCur->eState==CURSOR_VALID );
! 4228: assert( pCur->iPage>0 );
! 4229: assert( pCur->apPage[pCur->iPage] );
! 4230:
! 4231: /* UPDATE: It is actually possible for the condition tested by the assert
! 4232: ** below to be untrue if the database file is corrupt. This can occur if
! 4233: ** one cursor has modified page pParent while a reference to it is held
! 4234: ** by a second cursor. Which can only happen if a single page is linked
! 4235: ** into more than one b-tree structure in a corrupt database. */
! 4236: #if 0
! 4237: assertParentIndex(
! 4238: pCur->apPage[pCur->iPage-1],
! 4239: pCur->aiIdx[pCur->iPage-1],
! 4240: pCur->apPage[pCur->iPage]->pgno
! 4241: );
! 4242: #endif
! 4243: testcase( pCur->aiIdx[pCur->iPage-1] > pCur->apPage[pCur->iPage-1]->nCell );
! 4244:
! 4245: releasePage(pCur->apPage[pCur->iPage]);
! 4246: pCur->iPage--;
! 4247: pCur->info.nSize = 0;
! 4248: pCur->validNKey = 0;
! 4249: }
! 4250:
! 4251: /*
! 4252: ** Move the cursor to point to the root page of its b-tree structure.
! 4253: **
! 4254: ** If the table has a virtual root page, then the cursor is moved to point
! 4255: ** to the virtual root page instead of the actual root page. A table has a
! 4256: ** virtual root page when the actual root page contains no cells and a
! 4257: ** single child page. This can only happen with the table rooted at page 1.
! 4258: **
! 4259: ** If the b-tree structure is empty, the cursor state is set to
! 4260: ** CURSOR_INVALID. Otherwise, the cursor is set to point to the first
! 4261: ** cell located on the root (or virtual root) page and the cursor state
! 4262: ** is set to CURSOR_VALID.
! 4263: **
! 4264: ** If this function returns successfully, it may be assumed that the
! 4265: ** page-header flags indicate that the [virtual] root-page is the expected
! 4266: ** kind of b-tree page (i.e. if when opening the cursor the caller did not
! 4267: ** specify a KeyInfo structure the flags byte is set to 0x05 or 0x0D,
! 4268: ** indicating a table b-tree, or if the caller did specify a KeyInfo
! 4269: ** structure the flags byte is set to 0x02 or 0x0A, indicating an index
! 4270: ** b-tree).
! 4271: */
! 4272: static int moveToRoot(BtCursor *pCur){
! 4273: MemPage *pRoot;
! 4274: int rc = SQLITE_OK;
! 4275: Btree *p = pCur->pBtree;
! 4276: BtShared *pBt = p->pBt;
! 4277:
! 4278: assert( cursorHoldsMutex(pCur) );
! 4279: assert( CURSOR_INVALID < CURSOR_REQUIRESEEK );
! 4280: assert( CURSOR_VALID < CURSOR_REQUIRESEEK );
! 4281: assert( CURSOR_FAULT > CURSOR_REQUIRESEEK );
! 4282: if( pCur->eState>=CURSOR_REQUIRESEEK ){
! 4283: if( pCur->eState==CURSOR_FAULT ){
! 4284: assert( pCur->skipNext!=SQLITE_OK );
! 4285: return pCur->skipNext;
! 4286: }
! 4287: sqlite3BtreeClearCursor(pCur);
! 4288: }
! 4289:
! 4290: if( pCur->iPage>=0 ){
! 4291: int i;
! 4292: for(i=1; i<=pCur->iPage; i++){
! 4293: releasePage(pCur->apPage[i]);
! 4294: }
! 4295: pCur->iPage = 0;
! 4296: }else if( pCur->pgnoRoot==0 ){
! 4297: pCur->eState = CURSOR_INVALID;
! 4298: return SQLITE_OK;
! 4299: }else{
! 4300: rc = getAndInitPage(pBt, pCur->pgnoRoot, &pCur->apPage[0]);
! 4301: if( rc!=SQLITE_OK ){
! 4302: pCur->eState = CURSOR_INVALID;
! 4303: return rc;
! 4304: }
! 4305: pCur->iPage = 0;
! 4306:
! 4307: /* If pCur->pKeyInfo is not NULL, then the caller that opened this cursor
! 4308: ** expected to open it on an index b-tree. Otherwise, if pKeyInfo is
! 4309: ** NULL, the caller expects a table b-tree. If this is not the case,
! 4310: ** return an SQLITE_CORRUPT error. */
! 4311: assert( pCur->apPage[0]->intKey==1 || pCur->apPage[0]->intKey==0 );
! 4312: if( (pCur->pKeyInfo==0)!=pCur->apPage[0]->intKey ){
! 4313: return SQLITE_CORRUPT_BKPT;
! 4314: }
! 4315: }
! 4316:
! 4317: /* Assert that the root page is of the correct type. This must be the
! 4318: ** case as the call to this function that loaded the root-page (either
! 4319: ** this call or a previous invocation) would have detected corruption
! 4320: ** if the assumption were not true, and it is not possible for the flags
! 4321: ** byte to have been modified while this cursor is holding a reference
! 4322: ** to the page. */
! 4323: pRoot = pCur->apPage[0];
! 4324: assert( pRoot->pgno==pCur->pgnoRoot );
! 4325: assert( pRoot->isInit && (pCur->pKeyInfo==0)==pRoot->intKey );
! 4326:
! 4327: pCur->aiIdx[0] = 0;
! 4328: pCur->info.nSize = 0;
! 4329: pCur->atLast = 0;
! 4330: pCur->validNKey = 0;
! 4331:
! 4332: if( pRoot->nCell==0 && !pRoot->leaf ){
! 4333: Pgno subpage;
! 4334: if( pRoot->pgno!=1 ) return SQLITE_CORRUPT_BKPT;
! 4335: subpage = get4byte(&pRoot->aData[pRoot->hdrOffset+8]);
! 4336: pCur->eState = CURSOR_VALID;
! 4337: rc = moveToChild(pCur, subpage);
! 4338: }else{
! 4339: pCur->eState = ((pRoot->nCell>0)?CURSOR_VALID:CURSOR_INVALID);
! 4340: }
! 4341: return rc;
! 4342: }
! 4343:
! 4344: /*
! 4345: ** Move the cursor down to the left-most leaf entry beneath the
! 4346: ** entry to which it is currently pointing.
! 4347: **
! 4348: ** The left-most leaf is the one with the smallest key - the first
! 4349: ** in ascending order.
! 4350: */
! 4351: static int moveToLeftmost(BtCursor *pCur){
! 4352: Pgno pgno;
! 4353: int rc = SQLITE_OK;
! 4354: MemPage *pPage;
! 4355:
! 4356: assert( cursorHoldsMutex(pCur) );
! 4357: assert( pCur->eState==CURSOR_VALID );
! 4358: while( rc==SQLITE_OK && !(pPage = pCur->apPage[pCur->iPage])->leaf ){
! 4359: assert( pCur->aiIdx[pCur->iPage]<pPage->nCell );
! 4360: pgno = get4byte(findCell(pPage, pCur->aiIdx[pCur->iPage]));
! 4361: rc = moveToChild(pCur, pgno);
! 4362: }
! 4363: return rc;
! 4364: }
! 4365:
! 4366: /*
! 4367: ** Move the cursor down to the right-most leaf entry beneath the
! 4368: ** page to which it is currently pointing. Notice the difference
! 4369: ** between moveToLeftmost() and moveToRightmost(). moveToLeftmost()
! 4370: ** finds the left-most entry beneath the *entry* whereas moveToRightmost()
! 4371: ** finds the right-most entry beneath the *page*.
! 4372: **
! 4373: ** The right-most entry is the one with the largest key - the last
! 4374: ** key in ascending order.
! 4375: */
! 4376: static int moveToRightmost(BtCursor *pCur){
! 4377: Pgno pgno;
! 4378: int rc = SQLITE_OK;
! 4379: MemPage *pPage = 0;
! 4380:
! 4381: assert( cursorHoldsMutex(pCur) );
! 4382: assert( pCur->eState==CURSOR_VALID );
! 4383: while( rc==SQLITE_OK && !(pPage = pCur->apPage[pCur->iPage])->leaf ){
! 4384: pgno = get4byte(&pPage->aData[pPage->hdrOffset+8]);
! 4385: pCur->aiIdx[pCur->iPage] = pPage->nCell;
! 4386: rc = moveToChild(pCur, pgno);
! 4387: }
! 4388: if( rc==SQLITE_OK ){
! 4389: pCur->aiIdx[pCur->iPage] = pPage->nCell-1;
! 4390: pCur->info.nSize = 0;
! 4391: pCur->validNKey = 0;
! 4392: }
! 4393: return rc;
! 4394: }
! 4395:
! 4396: /* Move the cursor to the first entry in the table. Return SQLITE_OK
! 4397: ** on success. Set *pRes to 0 if the cursor actually points to something
! 4398: ** or set *pRes to 1 if the table is empty.
! 4399: */
! 4400: int sqlite3BtreeFirst(BtCursor *pCur, int *pRes){
! 4401: int rc;
! 4402:
! 4403: assert( cursorHoldsMutex(pCur) );
! 4404: assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) );
! 4405: rc = moveToRoot(pCur);
! 4406: if( rc==SQLITE_OK ){
! 4407: if( pCur->eState==CURSOR_INVALID ){
! 4408: assert( pCur->pgnoRoot==0 || pCur->apPage[pCur->iPage]->nCell==0 );
! 4409: *pRes = 1;
! 4410: }else{
! 4411: assert( pCur->apPage[pCur->iPage]->nCell>0 );
! 4412: *pRes = 0;
! 4413: rc = moveToLeftmost(pCur);
! 4414: }
! 4415: }
! 4416: return rc;
! 4417: }
! 4418:
! 4419: /* Move the cursor to the last entry in the table. Return SQLITE_OK
! 4420: ** on success. Set *pRes to 0 if the cursor actually points to something
! 4421: ** or set *pRes to 1 if the table is empty.
! 4422: */
! 4423: int sqlite3BtreeLast(BtCursor *pCur, int *pRes){
! 4424: int rc;
! 4425:
! 4426: assert( cursorHoldsMutex(pCur) );
! 4427: assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) );
! 4428:
! 4429: /* If the cursor already points to the last entry, this is a no-op. */
! 4430: if( CURSOR_VALID==pCur->eState && pCur->atLast ){
! 4431: #ifdef SQLITE_DEBUG
! 4432: /* This block serves to assert() that the cursor really does point
! 4433: ** to the last entry in the b-tree. */
! 4434: int ii;
! 4435: for(ii=0; ii<pCur->iPage; ii++){
! 4436: assert( pCur->aiIdx[ii]==pCur->apPage[ii]->nCell );
! 4437: }
! 4438: assert( pCur->aiIdx[pCur->iPage]==pCur->apPage[pCur->iPage]->nCell-1 );
! 4439: assert( pCur->apPage[pCur->iPage]->leaf );
! 4440: #endif
! 4441: return SQLITE_OK;
! 4442: }
! 4443:
! 4444: rc = moveToRoot(pCur);
! 4445: if( rc==SQLITE_OK ){
! 4446: if( CURSOR_INVALID==pCur->eState ){
! 4447: assert( pCur->pgnoRoot==0 || pCur->apPage[pCur->iPage]->nCell==0 );
! 4448: *pRes = 1;
! 4449: }else{
! 4450: assert( pCur->eState==CURSOR_VALID );
! 4451: *pRes = 0;
! 4452: rc = moveToRightmost(pCur);
! 4453: pCur->atLast = rc==SQLITE_OK ?1:0;
! 4454: }
! 4455: }
! 4456: return rc;
! 4457: }
! 4458:
! 4459: /* Move the cursor so that it points to an entry near the key
! 4460: ** specified by pIdxKey or intKey. Return a success code.
! 4461: **
! 4462: ** For INTKEY tables, the intKey parameter is used. pIdxKey
! 4463: ** must be NULL. For index tables, pIdxKey is used and intKey
! 4464: ** is ignored.
! 4465: **
! 4466: ** If an exact match is not found, then the cursor is always
! 4467: ** left pointing at a leaf page which would hold the entry if it
! 4468: ** were present. The cursor might point to an entry that comes
! 4469: ** before or after the key.
! 4470: **
! 4471: ** An integer is written into *pRes which is the result of
! 4472: ** comparing the key with the entry to which the cursor is
! 4473: ** pointing. The meaning of the integer written into
! 4474: ** *pRes is as follows:
! 4475: **
! 4476: ** *pRes<0 The cursor is left pointing at an entry that
! 4477: ** is smaller than intKey/pIdxKey or if the table is empty
! 4478: ** and the cursor is therefore left point to nothing.
! 4479: **
! 4480: ** *pRes==0 The cursor is left pointing at an entry that
! 4481: ** exactly matches intKey/pIdxKey.
! 4482: **
! 4483: ** *pRes>0 The cursor is left pointing at an entry that
! 4484: ** is larger than intKey/pIdxKey.
! 4485: **
! 4486: */
! 4487: int sqlite3BtreeMovetoUnpacked(
! 4488: BtCursor *pCur, /* The cursor to be moved */
! 4489: UnpackedRecord *pIdxKey, /* Unpacked index key */
! 4490: i64 intKey, /* The table key */
! 4491: int biasRight, /* If true, bias the search to the high end */
! 4492: int *pRes /* Write search results here */
! 4493: ){
! 4494: int rc;
! 4495:
! 4496: assert( cursorHoldsMutex(pCur) );
! 4497: assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) );
! 4498: assert( pRes );
! 4499: assert( (pIdxKey==0)==(pCur->pKeyInfo==0) );
! 4500:
! 4501: /* If the cursor is already positioned at the point we are trying
! 4502: ** to move to, then just return without doing any work */
! 4503: if( pCur->eState==CURSOR_VALID && pCur->validNKey
! 4504: && pCur->apPage[0]->intKey
! 4505: ){
! 4506: if( pCur->info.nKey==intKey ){
! 4507: *pRes = 0;
! 4508: return SQLITE_OK;
! 4509: }
! 4510: if( pCur->atLast && pCur->info.nKey<intKey ){
! 4511: *pRes = -1;
! 4512: return SQLITE_OK;
! 4513: }
! 4514: }
! 4515:
! 4516: rc = moveToRoot(pCur);
! 4517: if( rc ){
! 4518: return rc;
! 4519: }
! 4520: assert( pCur->pgnoRoot==0 || pCur->apPage[pCur->iPage] );
! 4521: assert( pCur->pgnoRoot==0 || pCur->apPage[pCur->iPage]->isInit );
! 4522: assert( pCur->eState==CURSOR_INVALID || pCur->apPage[pCur->iPage]->nCell>0 );
! 4523: if( pCur->eState==CURSOR_INVALID ){
! 4524: *pRes = -1;
! 4525: assert( pCur->pgnoRoot==0 || pCur->apPage[pCur->iPage]->nCell==0 );
! 4526: return SQLITE_OK;
! 4527: }
! 4528: assert( pCur->apPage[0]->intKey || pIdxKey );
! 4529: for(;;){
! 4530: int lwr, upr, idx;
! 4531: Pgno chldPg;
! 4532: MemPage *pPage = pCur->apPage[pCur->iPage];
! 4533: int c;
! 4534:
! 4535: /* pPage->nCell must be greater than zero. If this is the root-page
! 4536: ** the cursor would have been INVALID above and this for(;;) loop
! 4537: ** not run. If this is not the root-page, then the moveToChild() routine
! 4538: ** would have already detected db corruption. Similarly, pPage must
! 4539: ** be the right kind (index or table) of b-tree page. Otherwise
! 4540: ** a moveToChild() or moveToRoot() call would have detected corruption. */
! 4541: assert( pPage->nCell>0 );
! 4542: assert( pPage->intKey==(pIdxKey==0) );
! 4543: lwr = 0;
! 4544: upr = pPage->nCell-1;
! 4545: if( biasRight ){
! 4546: pCur->aiIdx[pCur->iPage] = (u16)(idx = upr);
! 4547: }else{
! 4548: pCur->aiIdx[pCur->iPage] = (u16)(idx = (upr+lwr)/2);
! 4549: }
! 4550: for(;;){
! 4551: u8 *pCell; /* Pointer to current cell in pPage */
! 4552:
! 4553: assert( idx==pCur->aiIdx[pCur->iPage] );
! 4554: pCur->info.nSize = 0;
! 4555: pCell = findCell(pPage, idx) + pPage->childPtrSize;
! 4556: if( pPage->intKey ){
! 4557: i64 nCellKey;
! 4558: if( pPage->hasData ){
! 4559: u32 dummy;
! 4560: pCell += getVarint32(pCell, dummy);
! 4561: }
! 4562: getVarint(pCell, (u64*)&nCellKey);
! 4563: if( nCellKey==intKey ){
! 4564: c = 0;
! 4565: }else if( nCellKey<intKey ){
! 4566: c = -1;
! 4567: }else{
! 4568: assert( nCellKey>intKey );
! 4569: c = +1;
! 4570: }
! 4571: pCur->validNKey = 1;
! 4572: pCur->info.nKey = nCellKey;
! 4573: }else{
! 4574: /* The maximum supported page-size is 65536 bytes. This means that
! 4575: ** the maximum number of record bytes stored on an index B-Tree
! 4576: ** page is less than 16384 bytes and may be stored as a 2-byte
! 4577: ** varint. This information is used to attempt to avoid parsing
! 4578: ** the entire cell by checking for the cases where the record is
! 4579: ** stored entirely within the b-tree page by inspecting the first
! 4580: ** 2 bytes of the cell.
! 4581: */
! 4582: int nCell = pCell[0];
! 4583: if( nCell<=pPage->max1bytePayload
! 4584: /* && (pCell+nCell)<pPage->aDataEnd */
! 4585: ){
! 4586: /* This branch runs if the record-size field of the cell is a
! 4587: ** single byte varint and the record fits entirely on the main
! 4588: ** b-tree page. */
! 4589: testcase( pCell+nCell+1==pPage->aDataEnd );
! 4590: c = sqlite3VdbeRecordCompare(nCell, (void*)&pCell[1], pIdxKey);
! 4591: }else if( !(pCell[1] & 0x80)
! 4592: && (nCell = ((nCell&0x7f)<<7) + pCell[1])<=pPage->maxLocal
! 4593: /* && (pCell+nCell+2)<=pPage->aDataEnd */
! 4594: ){
! 4595: /* The record-size field is a 2 byte varint and the record
! 4596: ** fits entirely on the main b-tree page. */
! 4597: testcase( pCell+nCell+2==pPage->aDataEnd );
! 4598: c = sqlite3VdbeRecordCompare(nCell, (void*)&pCell[2], pIdxKey);
! 4599: }else{
! 4600: /* The record flows over onto one or more overflow pages. In
! 4601: ** this case the whole cell needs to be parsed, a buffer allocated
! 4602: ** and accessPayload() used to retrieve the record into the
! 4603: ** buffer before VdbeRecordCompare() can be called. */
! 4604: void *pCellKey;
! 4605: u8 * const pCellBody = pCell - pPage->childPtrSize;
! 4606: btreeParseCellPtr(pPage, pCellBody, &pCur->info);
! 4607: nCell = (int)pCur->info.nKey;
! 4608: pCellKey = sqlite3Malloc( nCell );
! 4609: if( pCellKey==0 ){
! 4610: rc = SQLITE_NOMEM;
! 4611: goto moveto_finish;
! 4612: }
! 4613: rc = accessPayload(pCur, 0, nCell, (unsigned char*)pCellKey, 0);
! 4614: if( rc ){
! 4615: sqlite3_free(pCellKey);
! 4616: goto moveto_finish;
! 4617: }
! 4618: c = sqlite3VdbeRecordCompare(nCell, pCellKey, pIdxKey);
! 4619: sqlite3_free(pCellKey);
! 4620: }
! 4621: }
! 4622: if( c==0 ){
! 4623: if( pPage->intKey && !pPage->leaf ){
! 4624: lwr = idx;
! 4625: break;
! 4626: }else{
! 4627: *pRes = 0;
! 4628: rc = SQLITE_OK;
! 4629: goto moveto_finish;
! 4630: }
! 4631: }
! 4632: if( c<0 ){
! 4633: lwr = idx+1;
! 4634: }else{
! 4635: upr = idx-1;
! 4636: }
! 4637: if( lwr>upr ){
! 4638: break;
! 4639: }
! 4640: pCur->aiIdx[pCur->iPage] = (u16)(idx = (lwr+upr)/2);
! 4641: }
! 4642: assert( lwr==upr+1 || (pPage->intKey && !pPage->leaf) );
! 4643: assert( pPage->isInit );
! 4644: if( pPage->leaf ){
! 4645: chldPg = 0;
! 4646: }else if( lwr>=pPage->nCell ){
! 4647: chldPg = get4byte(&pPage->aData[pPage->hdrOffset+8]);
! 4648: }else{
! 4649: chldPg = get4byte(findCell(pPage, lwr));
! 4650: }
! 4651: if( chldPg==0 ){
! 4652: assert( pCur->aiIdx[pCur->iPage]<pCur->apPage[pCur->iPage]->nCell );
! 4653: *pRes = c;
! 4654: rc = SQLITE_OK;
! 4655: goto moveto_finish;
! 4656: }
! 4657: pCur->aiIdx[pCur->iPage] = (u16)lwr;
! 4658: pCur->info.nSize = 0;
! 4659: pCur->validNKey = 0;
! 4660: rc = moveToChild(pCur, chldPg);
! 4661: if( rc ) goto moveto_finish;
! 4662: }
! 4663: moveto_finish:
! 4664: return rc;
! 4665: }
! 4666:
! 4667:
! 4668: /*
! 4669: ** Return TRUE if the cursor is not pointing at an entry of the table.
! 4670: **
! 4671: ** TRUE will be returned after a call to sqlite3BtreeNext() moves
! 4672: ** past the last entry in the table or sqlite3BtreePrev() moves past
! 4673: ** the first entry. TRUE is also returned if the table is empty.
! 4674: */
! 4675: int sqlite3BtreeEof(BtCursor *pCur){
! 4676: /* TODO: What if the cursor is in CURSOR_REQUIRESEEK but all table entries
! 4677: ** have been deleted? This API will need to change to return an error code
! 4678: ** as well as the boolean result value.
! 4679: */
! 4680: return (CURSOR_VALID!=pCur->eState);
! 4681: }
! 4682:
! 4683: /*
! 4684: ** Advance the cursor to the next entry in the database. If
! 4685: ** successful then set *pRes=0. If the cursor
! 4686: ** was already pointing to the last entry in the database before
! 4687: ** this routine was called, then set *pRes=1.
! 4688: */
! 4689: int sqlite3BtreeNext(BtCursor *pCur, int *pRes){
! 4690: int rc;
! 4691: int idx;
! 4692: MemPage *pPage;
! 4693:
! 4694: assert( cursorHoldsMutex(pCur) );
! 4695: rc = restoreCursorPosition(pCur);
! 4696: if( rc!=SQLITE_OK ){
! 4697: return rc;
! 4698: }
! 4699: assert( pRes!=0 );
! 4700: if( CURSOR_INVALID==pCur->eState ){
! 4701: *pRes = 1;
! 4702: return SQLITE_OK;
! 4703: }
! 4704: if( pCur->skipNext>0 ){
! 4705: pCur->skipNext = 0;
! 4706: *pRes = 0;
! 4707: return SQLITE_OK;
! 4708: }
! 4709: pCur->skipNext = 0;
! 4710:
! 4711: pPage = pCur->apPage[pCur->iPage];
! 4712: idx = ++pCur->aiIdx[pCur->iPage];
! 4713: assert( pPage->isInit );
! 4714:
! 4715: /* If the database file is corrupt, it is possible for the value of idx
! 4716: ** to be invalid here. This can only occur if a second cursor modifies
! 4717: ** the page while cursor pCur is holding a reference to it. Which can
! 4718: ** only happen if the database is corrupt in such a way as to link the
! 4719: ** page into more than one b-tree structure. */
! 4720: testcase( idx>pPage->nCell );
! 4721:
! 4722: pCur->info.nSize = 0;
! 4723: pCur->validNKey = 0;
! 4724: if( idx>=pPage->nCell ){
! 4725: if( !pPage->leaf ){
! 4726: rc = moveToChild(pCur, get4byte(&pPage->aData[pPage->hdrOffset+8]));
! 4727: if( rc ) return rc;
! 4728: rc = moveToLeftmost(pCur);
! 4729: *pRes = 0;
! 4730: return rc;
! 4731: }
! 4732: do{
! 4733: if( pCur->iPage==0 ){
! 4734: *pRes = 1;
! 4735: pCur->eState = CURSOR_INVALID;
! 4736: return SQLITE_OK;
! 4737: }
! 4738: moveToParent(pCur);
! 4739: pPage = pCur->apPage[pCur->iPage];
! 4740: }while( pCur->aiIdx[pCur->iPage]>=pPage->nCell );
! 4741: *pRes = 0;
! 4742: if( pPage->intKey ){
! 4743: rc = sqlite3BtreeNext(pCur, pRes);
! 4744: }else{
! 4745: rc = SQLITE_OK;
! 4746: }
! 4747: return rc;
! 4748: }
! 4749: *pRes = 0;
! 4750: if( pPage->leaf ){
! 4751: return SQLITE_OK;
! 4752: }
! 4753: rc = moveToLeftmost(pCur);
! 4754: return rc;
! 4755: }
! 4756:
! 4757:
! 4758: /*
! 4759: ** Step the cursor to the back to the previous entry in the database. If
! 4760: ** successful then set *pRes=0. If the cursor
! 4761: ** was already pointing to the first entry in the database before
! 4762: ** this routine was called, then set *pRes=1.
! 4763: */
! 4764: int sqlite3BtreePrevious(BtCursor *pCur, int *pRes){
! 4765: int rc;
! 4766: MemPage *pPage;
! 4767:
! 4768: assert( cursorHoldsMutex(pCur) );
! 4769: rc = restoreCursorPosition(pCur);
! 4770: if( rc!=SQLITE_OK ){
! 4771: return rc;
! 4772: }
! 4773: pCur->atLast = 0;
! 4774: if( CURSOR_INVALID==pCur->eState ){
! 4775: *pRes = 1;
! 4776: return SQLITE_OK;
! 4777: }
! 4778: if( pCur->skipNext<0 ){
! 4779: pCur->skipNext = 0;
! 4780: *pRes = 0;
! 4781: return SQLITE_OK;
! 4782: }
! 4783: pCur->skipNext = 0;
! 4784:
! 4785: pPage = pCur->apPage[pCur->iPage];
! 4786: assert( pPage->isInit );
! 4787: if( !pPage->leaf ){
! 4788: int idx = pCur->aiIdx[pCur->iPage];
! 4789: rc = moveToChild(pCur, get4byte(findCell(pPage, idx)));
! 4790: if( rc ){
! 4791: return rc;
! 4792: }
! 4793: rc = moveToRightmost(pCur);
! 4794: }else{
! 4795: while( pCur->aiIdx[pCur->iPage]==0 ){
! 4796: if( pCur->iPage==0 ){
! 4797: pCur->eState = CURSOR_INVALID;
! 4798: *pRes = 1;
! 4799: return SQLITE_OK;
! 4800: }
! 4801: moveToParent(pCur);
! 4802: }
! 4803: pCur->info.nSize = 0;
! 4804: pCur->validNKey = 0;
! 4805:
! 4806: pCur->aiIdx[pCur->iPage]--;
! 4807: pPage = pCur->apPage[pCur->iPage];
! 4808: if( pPage->intKey && !pPage->leaf ){
! 4809: rc = sqlite3BtreePrevious(pCur, pRes);
! 4810: }else{
! 4811: rc = SQLITE_OK;
! 4812: }
! 4813: }
! 4814: *pRes = 0;
! 4815: return rc;
! 4816: }
! 4817:
! 4818: /*
! 4819: ** Allocate a new page from the database file.
! 4820: **
! 4821: ** The new page is marked as dirty. (In other words, sqlite3PagerWrite()
! 4822: ** has already been called on the new page.) The new page has also
! 4823: ** been referenced and the calling routine is responsible for calling
! 4824: ** sqlite3PagerUnref() on the new page when it is done.
! 4825: **
! 4826: ** SQLITE_OK is returned on success. Any other return value indicates
! 4827: ** an error. *ppPage and *pPgno are undefined in the event of an error.
! 4828: ** Do not invoke sqlite3PagerUnref() on *ppPage if an error is returned.
! 4829: **
! 4830: ** If the "nearby" parameter is not 0, then a (feeble) effort is made to
! 4831: ** locate a page close to the page number "nearby". This can be used in an
! 4832: ** attempt to keep related pages close to each other in the database file,
! 4833: ** which in turn can make database access faster.
! 4834: **
! 4835: ** If the "exact" parameter is not 0, and the page-number nearby exists
! 4836: ** anywhere on the free-list, then it is guarenteed to be returned. This
! 4837: ** is only used by auto-vacuum databases when allocating a new table.
! 4838: */
! 4839: static int allocateBtreePage(
! 4840: BtShared *pBt,
! 4841: MemPage **ppPage,
! 4842: Pgno *pPgno,
! 4843: Pgno nearby,
! 4844: u8 exact
! 4845: ){
! 4846: MemPage *pPage1;
! 4847: int rc;
! 4848: u32 n; /* Number of pages on the freelist */
! 4849: u32 k; /* Number of leaves on the trunk of the freelist */
! 4850: MemPage *pTrunk = 0;
! 4851: MemPage *pPrevTrunk = 0;
! 4852: Pgno mxPage; /* Total size of the database file */
! 4853:
! 4854: assert( sqlite3_mutex_held(pBt->mutex) );
! 4855: pPage1 = pBt->pPage1;
! 4856: mxPage = btreePagecount(pBt);
! 4857: n = get4byte(&pPage1->aData[36]);
! 4858: testcase( n==mxPage-1 );
! 4859: if( n>=mxPage ){
! 4860: return SQLITE_CORRUPT_BKPT;
! 4861: }
! 4862: if( n>0 ){
! 4863: /* There are pages on the freelist. Reuse one of those pages. */
! 4864: Pgno iTrunk;
! 4865: u8 searchList = 0; /* If the free-list must be searched for 'nearby' */
! 4866:
! 4867: /* If the 'exact' parameter was true and a query of the pointer-map
! 4868: ** shows that the page 'nearby' is somewhere on the free-list, then
! 4869: ** the entire-list will be searched for that page.
! 4870: */
! 4871: #ifndef SQLITE_OMIT_AUTOVACUUM
! 4872: if( exact && nearby<=mxPage ){
! 4873: u8 eType;
! 4874: assert( nearby>0 );
! 4875: assert( pBt->autoVacuum );
! 4876: rc = ptrmapGet(pBt, nearby, &eType, 0);
! 4877: if( rc ) return rc;
! 4878: if( eType==PTRMAP_FREEPAGE ){
! 4879: searchList = 1;
! 4880: }
! 4881: *pPgno = nearby;
! 4882: }
! 4883: #endif
! 4884:
! 4885: /* Decrement the free-list count by 1. Set iTrunk to the index of the
! 4886: ** first free-list trunk page. iPrevTrunk is initially 1.
! 4887: */
! 4888: rc = sqlite3PagerWrite(pPage1->pDbPage);
! 4889: if( rc ) return rc;
! 4890: put4byte(&pPage1->aData[36], n-1);
! 4891:
! 4892: /* The code within this loop is run only once if the 'searchList' variable
! 4893: ** is not true. Otherwise, it runs once for each trunk-page on the
! 4894: ** free-list until the page 'nearby' is located.
! 4895: */
! 4896: do {
! 4897: pPrevTrunk = pTrunk;
! 4898: if( pPrevTrunk ){
! 4899: iTrunk = get4byte(&pPrevTrunk->aData[0]);
! 4900: }else{
! 4901: iTrunk = get4byte(&pPage1->aData[32]);
! 4902: }
! 4903: testcase( iTrunk==mxPage );
! 4904: if( iTrunk>mxPage ){
! 4905: rc = SQLITE_CORRUPT_BKPT;
! 4906: }else{
! 4907: rc = btreeGetPage(pBt, iTrunk, &pTrunk, 0);
! 4908: }
! 4909: if( rc ){
! 4910: pTrunk = 0;
! 4911: goto end_allocate_page;
! 4912: }
! 4913: assert( pTrunk!=0 );
! 4914: assert( pTrunk->aData!=0 );
! 4915:
! 4916: k = get4byte(&pTrunk->aData[4]); /* # of leaves on this trunk page */
! 4917: if( k==0 && !searchList ){
! 4918: /* The trunk has no leaves and the list is not being searched.
! 4919: ** So extract the trunk page itself and use it as the newly
! 4920: ** allocated page */
! 4921: assert( pPrevTrunk==0 );
! 4922: rc = sqlite3PagerWrite(pTrunk->pDbPage);
! 4923: if( rc ){
! 4924: goto end_allocate_page;
! 4925: }
! 4926: *pPgno = iTrunk;
! 4927: memcpy(&pPage1->aData[32], &pTrunk->aData[0], 4);
! 4928: *ppPage = pTrunk;
! 4929: pTrunk = 0;
! 4930: TRACE(("ALLOCATE: %d trunk - %d free pages left\n", *pPgno, n-1));
! 4931: }else if( k>(u32)(pBt->usableSize/4 - 2) ){
! 4932: /* Value of k is out of range. Database corruption */
! 4933: rc = SQLITE_CORRUPT_BKPT;
! 4934: goto end_allocate_page;
! 4935: #ifndef SQLITE_OMIT_AUTOVACUUM
! 4936: }else if( searchList && nearby==iTrunk ){
! 4937: /* The list is being searched and this trunk page is the page
! 4938: ** to allocate, regardless of whether it has leaves.
! 4939: */
! 4940: assert( *pPgno==iTrunk );
! 4941: *ppPage = pTrunk;
! 4942: searchList = 0;
! 4943: rc = sqlite3PagerWrite(pTrunk->pDbPage);
! 4944: if( rc ){
! 4945: goto end_allocate_page;
! 4946: }
! 4947: if( k==0 ){
! 4948: if( !pPrevTrunk ){
! 4949: memcpy(&pPage1->aData[32], &pTrunk->aData[0], 4);
! 4950: }else{
! 4951: rc = sqlite3PagerWrite(pPrevTrunk->pDbPage);
! 4952: if( rc!=SQLITE_OK ){
! 4953: goto end_allocate_page;
! 4954: }
! 4955: memcpy(&pPrevTrunk->aData[0], &pTrunk->aData[0], 4);
! 4956: }
! 4957: }else{
! 4958: /* The trunk page is required by the caller but it contains
! 4959: ** pointers to free-list leaves. The first leaf becomes a trunk
! 4960: ** page in this case.
! 4961: */
! 4962: MemPage *pNewTrunk;
! 4963: Pgno iNewTrunk = get4byte(&pTrunk->aData[8]);
! 4964: if( iNewTrunk>mxPage ){
! 4965: rc = SQLITE_CORRUPT_BKPT;
! 4966: goto end_allocate_page;
! 4967: }
! 4968: testcase( iNewTrunk==mxPage );
! 4969: rc = btreeGetPage(pBt, iNewTrunk, &pNewTrunk, 0);
! 4970: if( rc!=SQLITE_OK ){
! 4971: goto end_allocate_page;
! 4972: }
! 4973: rc = sqlite3PagerWrite(pNewTrunk->pDbPage);
! 4974: if( rc!=SQLITE_OK ){
! 4975: releasePage(pNewTrunk);
! 4976: goto end_allocate_page;
! 4977: }
! 4978: memcpy(&pNewTrunk->aData[0], &pTrunk->aData[0], 4);
! 4979: put4byte(&pNewTrunk->aData[4], k-1);
! 4980: memcpy(&pNewTrunk->aData[8], &pTrunk->aData[12], (k-1)*4);
! 4981: releasePage(pNewTrunk);
! 4982: if( !pPrevTrunk ){
! 4983: assert( sqlite3PagerIswriteable(pPage1->pDbPage) );
! 4984: put4byte(&pPage1->aData[32], iNewTrunk);
! 4985: }else{
! 4986: rc = sqlite3PagerWrite(pPrevTrunk->pDbPage);
! 4987: if( rc ){
! 4988: goto end_allocate_page;
! 4989: }
! 4990: put4byte(&pPrevTrunk->aData[0], iNewTrunk);
! 4991: }
! 4992: }
! 4993: pTrunk = 0;
! 4994: TRACE(("ALLOCATE: %d trunk - %d free pages left\n", *pPgno, n-1));
! 4995: #endif
! 4996: }else if( k>0 ){
! 4997: /* Extract a leaf from the trunk */
! 4998: u32 closest;
! 4999: Pgno iPage;
! 5000: unsigned char *aData = pTrunk->aData;
! 5001: if( nearby>0 ){
! 5002: u32 i;
! 5003: int dist;
! 5004: closest = 0;
! 5005: dist = sqlite3AbsInt32(get4byte(&aData[8]) - nearby);
! 5006: for(i=1; i<k; i++){
! 5007: int d2 = sqlite3AbsInt32(get4byte(&aData[8+i*4]) - nearby);
! 5008: if( d2<dist ){
! 5009: closest = i;
! 5010: dist = d2;
! 5011: }
! 5012: }
! 5013: }else{
! 5014: closest = 0;
! 5015: }
! 5016:
! 5017: iPage = get4byte(&aData[8+closest*4]);
! 5018: testcase( iPage==mxPage );
! 5019: if( iPage>mxPage ){
! 5020: rc = SQLITE_CORRUPT_BKPT;
! 5021: goto end_allocate_page;
! 5022: }
! 5023: testcase( iPage==mxPage );
! 5024: if( !searchList || iPage==nearby ){
! 5025: int noContent;
! 5026: *pPgno = iPage;
! 5027: TRACE(("ALLOCATE: %d was leaf %d of %d on trunk %d"
! 5028: ": %d more free pages\n",
! 5029: *pPgno, closest+1, k, pTrunk->pgno, n-1));
! 5030: rc = sqlite3PagerWrite(pTrunk->pDbPage);
! 5031: if( rc ) goto end_allocate_page;
! 5032: if( closest<k-1 ){
! 5033: memcpy(&aData[8+closest*4], &aData[4+k*4], 4);
! 5034: }
! 5035: put4byte(&aData[4], k-1);
! 5036: noContent = !btreeGetHasContent(pBt, *pPgno);
! 5037: rc = btreeGetPage(pBt, *pPgno, ppPage, noContent);
! 5038: if( rc==SQLITE_OK ){
! 5039: rc = sqlite3PagerWrite((*ppPage)->pDbPage);
! 5040: if( rc!=SQLITE_OK ){
! 5041: releasePage(*ppPage);
! 5042: }
! 5043: }
! 5044: searchList = 0;
! 5045: }
! 5046: }
! 5047: releasePage(pPrevTrunk);
! 5048: pPrevTrunk = 0;
! 5049: }while( searchList );
! 5050: }else{
! 5051: /* There are no pages on the freelist, so create a new page at the
! 5052: ** end of the file */
! 5053: rc = sqlite3PagerWrite(pBt->pPage1->pDbPage);
! 5054: if( rc ) return rc;
! 5055: pBt->nPage++;
! 5056: if( pBt->nPage==PENDING_BYTE_PAGE(pBt) ) pBt->nPage++;
! 5057:
! 5058: #ifndef SQLITE_OMIT_AUTOVACUUM
! 5059: if( pBt->autoVacuum && PTRMAP_ISPAGE(pBt, pBt->nPage) ){
! 5060: /* If *pPgno refers to a pointer-map page, allocate two new pages
! 5061: ** at the end of the file instead of one. The first allocated page
! 5062: ** becomes a new pointer-map page, the second is used by the caller.
! 5063: */
! 5064: MemPage *pPg = 0;
! 5065: TRACE(("ALLOCATE: %d from end of file (pointer-map page)\n", pBt->nPage));
! 5066: assert( pBt->nPage!=PENDING_BYTE_PAGE(pBt) );
! 5067: rc = btreeGetPage(pBt, pBt->nPage, &pPg, 1);
! 5068: if( rc==SQLITE_OK ){
! 5069: rc = sqlite3PagerWrite(pPg->pDbPage);
! 5070: releasePage(pPg);
! 5071: }
! 5072: if( rc ) return rc;
! 5073: pBt->nPage++;
! 5074: if( pBt->nPage==PENDING_BYTE_PAGE(pBt) ){ pBt->nPage++; }
! 5075: }
! 5076: #endif
! 5077: put4byte(28 + (u8*)pBt->pPage1->aData, pBt->nPage);
! 5078: *pPgno = pBt->nPage;
! 5079:
! 5080: assert( *pPgno!=PENDING_BYTE_PAGE(pBt) );
! 5081: rc = btreeGetPage(pBt, *pPgno, ppPage, 1);
! 5082: if( rc ) return rc;
! 5083: rc = sqlite3PagerWrite((*ppPage)->pDbPage);
! 5084: if( rc!=SQLITE_OK ){
! 5085: releasePage(*ppPage);
! 5086: }
! 5087: TRACE(("ALLOCATE: %d from end of file\n", *pPgno));
! 5088: }
! 5089:
! 5090: assert( *pPgno!=PENDING_BYTE_PAGE(pBt) );
! 5091:
! 5092: end_allocate_page:
! 5093: releasePage(pTrunk);
! 5094: releasePage(pPrevTrunk);
! 5095: if( rc==SQLITE_OK ){
! 5096: if( sqlite3PagerPageRefcount((*ppPage)->pDbPage)>1 ){
! 5097: releasePage(*ppPage);
! 5098: return SQLITE_CORRUPT_BKPT;
! 5099: }
! 5100: (*ppPage)->isInit = 0;
! 5101: }else{
! 5102: *ppPage = 0;
! 5103: }
! 5104: assert( rc!=SQLITE_OK || sqlite3PagerIswriteable((*ppPage)->pDbPage) );
! 5105: return rc;
! 5106: }
! 5107:
! 5108: /*
! 5109: ** This function is used to add page iPage to the database file free-list.
! 5110: ** It is assumed that the page is not already a part of the free-list.
! 5111: **
! 5112: ** The value passed as the second argument to this function is optional.
! 5113: ** If the caller happens to have a pointer to the MemPage object
! 5114: ** corresponding to page iPage handy, it may pass it as the second value.
! 5115: ** Otherwise, it may pass NULL.
! 5116: **
! 5117: ** If a pointer to a MemPage object is passed as the second argument,
! 5118: ** its reference count is not altered by this function.
! 5119: */
! 5120: static int freePage2(BtShared *pBt, MemPage *pMemPage, Pgno iPage){
! 5121: MemPage *pTrunk = 0; /* Free-list trunk page */
! 5122: Pgno iTrunk = 0; /* Page number of free-list trunk page */
! 5123: MemPage *pPage1 = pBt->pPage1; /* Local reference to page 1 */
! 5124: MemPage *pPage; /* Page being freed. May be NULL. */
! 5125: int rc; /* Return Code */
! 5126: int nFree; /* Initial number of pages on free-list */
! 5127:
! 5128: assert( sqlite3_mutex_held(pBt->mutex) );
! 5129: assert( iPage>1 );
! 5130: assert( !pMemPage || pMemPage->pgno==iPage );
! 5131:
! 5132: if( pMemPage ){
! 5133: pPage = pMemPage;
! 5134: sqlite3PagerRef(pPage->pDbPage);
! 5135: }else{
! 5136: pPage = btreePageLookup(pBt, iPage);
! 5137: }
! 5138:
! 5139: /* Increment the free page count on pPage1 */
! 5140: rc = sqlite3PagerWrite(pPage1->pDbPage);
! 5141: if( rc ) goto freepage_out;
! 5142: nFree = get4byte(&pPage1->aData[36]);
! 5143: put4byte(&pPage1->aData[36], nFree+1);
! 5144:
! 5145: if( pBt->btsFlags & BTS_SECURE_DELETE ){
! 5146: /* If the secure_delete option is enabled, then
! 5147: ** always fully overwrite deleted information with zeros.
! 5148: */
! 5149: if( (!pPage && ((rc = btreeGetPage(pBt, iPage, &pPage, 0))!=0) )
! 5150: || ((rc = sqlite3PagerWrite(pPage->pDbPage))!=0)
! 5151: ){
! 5152: goto freepage_out;
! 5153: }
! 5154: memset(pPage->aData, 0, pPage->pBt->pageSize);
! 5155: }
! 5156:
! 5157: /* If the database supports auto-vacuum, write an entry in the pointer-map
! 5158: ** to indicate that the page is free.
! 5159: */
! 5160: if( ISAUTOVACUUM ){
! 5161: ptrmapPut(pBt, iPage, PTRMAP_FREEPAGE, 0, &rc);
! 5162: if( rc ) goto freepage_out;
! 5163: }
! 5164:
! 5165: /* Now manipulate the actual database free-list structure. There are two
! 5166: ** possibilities. If the free-list is currently empty, or if the first
! 5167: ** trunk page in the free-list is full, then this page will become a
! 5168: ** new free-list trunk page. Otherwise, it will become a leaf of the
! 5169: ** first trunk page in the current free-list. This block tests if it
! 5170: ** is possible to add the page as a new free-list leaf.
! 5171: */
! 5172: if( nFree!=0 ){
! 5173: u32 nLeaf; /* Initial number of leaf cells on trunk page */
! 5174:
! 5175: iTrunk = get4byte(&pPage1->aData[32]);
! 5176: rc = btreeGetPage(pBt, iTrunk, &pTrunk, 0);
! 5177: if( rc!=SQLITE_OK ){
! 5178: goto freepage_out;
! 5179: }
! 5180:
! 5181: nLeaf = get4byte(&pTrunk->aData[4]);
! 5182: assert( pBt->usableSize>32 );
! 5183: if( nLeaf > (u32)pBt->usableSize/4 - 2 ){
! 5184: rc = SQLITE_CORRUPT_BKPT;
! 5185: goto freepage_out;
! 5186: }
! 5187: if( nLeaf < (u32)pBt->usableSize/4 - 8 ){
! 5188: /* In this case there is room on the trunk page to insert the page
! 5189: ** being freed as a new leaf.
! 5190: **
! 5191: ** Note that the trunk page is not really full until it contains
! 5192: ** usableSize/4 - 2 entries, not usableSize/4 - 8 entries as we have
! 5193: ** coded. But due to a coding error in versions of SQLite prior to
! 5194: ** 3.6.0, databases with freelist trunk pages holding more than
! 5195: ** usableSize/4 - 8 entries will be reported as corrupt. In order
! 5196: ** to maintain backwards compatibility with older versions of SQLite,
! 5197: ** we will continue to restrict the number of entries to usableSize/4 - 8
! 5198: ** for now. At some point in the future (once everyone has upgraded
! 5199: ** to 3.6.0 or later) we should consider fixing the conditional above
! 5200: ** to read "usableSize/4-2" instead of "usableSize/4-8".
! 5201: */
! 5202: rc = sqlite3PagerWrite(pTrunk->pDbPage);
! 5203: if( rc==SQLITE_OK ){
! 5204: put4byte(&pTrunk->aData[4], nLeaf+1);
! 5205: put4byte(&pTrunk->aData[8+nLeaf*4], iPage);
! 5206: if( pPage && (pBt->btsFlags & BTS_SECURE_DELETE)==0 ){
! 5207: sqlite3PagerDontWrite(pPage->pDbPage);
! 5208: }
! 5209: rc = btreeSetHasContent(pBt, iPage);
! 5210: }
! 5211: TRACE(("FREE-PAGE: %d leaf on trunk page %d\n",pPage->pgno,pTrunk->pgno));
! 5212: goto freepage_out;
! 5213: }
! 5214: }
! 5215:
! 5216: /* If control flows to this point, then it was not possible to add the
! 5217: ** the page being freed as a leaf page of the first trunk in the free-list.
! 5218: ** Possibly because the free-list is empty, or possibly because the
! 5219: ** first trunk in the free-list is full. Either way, the page being freed
! 5220: ** will become the new first trunk page in the free-list.
! 5221: */
! 5222: if( pPage==0 && SQLITE_OK!=(rc = btreeGetPage(pBt, iPage, &pPage, 0)) ){
! 5223: goto freepage_out;
! 5224: }
! 5225: rc = sqlite3PagerWrite(pPage->pDbPage);
! 5226: if( rc!=SQLITE_OK ){
! 5227: goto freepage_out;
! 5228: }
! 5229: put4byte(pPage->aData, iTrunk);
! 5230: put4byte(&pPage->aData[4], 0);
! 5231: put4byte(&pPage1->aData[32], iPage);
! 5232: TRACE(("FREE-PAGE: %d new trunk page replacing %d\n", pPage->pgno, iTrunk));
! 5233:
! 5234: freepage_out:
! 5235: if( pPage ){
! 5236: pPage->isInit = 0;
! 5237: }
! 5238: releasePage(pPage);
! 5239: releasePage(pTrunk);
! 5240: return rc;
! 5241: }
! 5242: static void freePage(MemPage *pPage, int *pRC){
! 5243: if( (*pRC)==SQLITE_OK ){
! 5244: *pRC = freePage2(pPage->pBt, pPage, pPage->pgno);
! 5245: }
! 5246: }
! 5247:
! 5248: /*
! 5249: ** Free any overflow pages associated with the given Cell.
! 5250: */
! 5251: static int clearCell(MemPage *pPage, unsigned char *pCell){
! 5252: BtShared *pBt = pPage->pBt;
! 5253: CellInfo info;
! 5254: Pgno ovflPgno;
! 5255: int rc;
! 5256: int nOvfl;
! 5257: u32 ovflPageSize;
! 5258:
! 5259: assert( sqlite3_mutex_held(pPage->pBt->mutex) );
! 5260: btreeParseCellPtr(pPage, pCell, &info);
! 5261: if( info.iOverflow==0 ){
! 5262: return SQLITE_OK; /* No overflow pages. Return without doing anything */
! 5263: }
! 5264: if( pCell+info.iOverflow+3 > pPage->aData+pPage->maskPage ){
! 5265: return SQLITE_CORRUPT; /* Cell extends past end of page */
! 5266: }
! 5267: ovflPgno = get4byte(&pCell[info.iOverflow]);
! 5268: assert( pBt->usableSize > 4 );
! 5269: ovflPageSize = pBt->usableSize - 4;
! 5270: nOvfl = (info.nPayload - info.nLocal + ovflPageSize - 1)/ovflPageSize;
! 5271: assert( ovflPgno==0 || nOvfl>0 );
! 5272: while( nOvfl-- ){
! 5273: Pgno iNext = 0;
! 5274: MemPage *pOvfl = 0;
! 5275: if( ovflPgno<2 || ovflPgno>btreePagecount(pBt) ){
! 5276: /* 0 is not a legal page number and page 1 cannot be an
! 5277: ** overflow page. Therefore if ovflPgno<2 or past the end of the
! 5278: ** file the database must be corrupt. */
! 5279: return SQLITE_CORRUPT_BKPT;
! 5280: }
! 5281: if( nOvfl ){
! 5282: rc = getOverflowPage(pBt, ovflPgno, &pOvfl, &iNext);
! 5283: if( rc ) return rc;
! 5284: }
! 5285:
! 5286: if( ( pOvfl || ((pOvfl = btreePageLookup(pBt, ovflPgno))!=0) )
! 5287: && sqlite3PagerPageRefcount(pOvfl->pDbPage)!=1
! 5288: ){
! 5289: /* There is no reason any cursor should have an outstanding reference
! 5290: ** to an overflow page belonging to a cell that is being deleted/updated.
! 5291: ** So if there exists more than one reference to this page, then it
! 5292: ** must not really be an overflow page and the database must be corrupt.
! 5293: ** It is helpful to detect this before calling freePage2(), as
! 5294: ** freePage2() may zero the page contents if secure-delete mode is
! 5295: ** enabled. If this 'overflow' page happens to be a page that the
! 5296: ** caller is iterating through or using in some other way, this
! 5297: ** can be problematic.
! 5298: */
! 5299: rc = SQLITE_CORRUPT_BKPT;
! 5300: }else{
! 5301: rc = freePage2(pBt, pOvfl, ovflPgno);
! 5302: }
! 5303:
! 5304: if( pOvfl ){
! 5305: sqlite3PagerUnref(pOvfl->pDbPage);
! 5306: }
! 5307: if( rc ) return rc;
! 5308: ovflPgno = iNext;
! 5309: }
! 5310: return SQLITE_OK;
! 5311: }
! 5312:
! 5313: /*
! 5314: ** Create the byte sequence used to represent a cell on page pPage
! 5315: ** and write that byte sequence into pCell[]. Overflow pages are
! 5316: ** allocated and filled in as necessary. The calling procedure
! 5317: ** is responsible for making sure sufficient space has been allocated
! 5318: ** for pCell[].
! 5319: **
! 5320: ** Note that pCell does not necessary need to point to the pPage->aData
! 5321: ** area. pCell might point to some temporary storage. The cell will
! 5322: ** be constructed in this temporary area then copied into pPage->aData
! 5323: ** later.
! 5324: */
! 5325: static int fillInCell(
! 5326: MemPage *pPage, /* The page that contains the cell */
! 5327: unsigned char *pCell, /* Complete text of the cell */
! 5328: const void *pKey, i64 nKey, /* The key */
! 5329: const void *pData,int nData, /* The data */
! 5330: int nZero, /* Extra zero bytes to append to pData */
! 5331: int *pnSize /* Write cell size here */
! 5332: ){
! 5333: int nPayload;
! 5334: const u8 *pSrc;
! 5335: int nSrc, n, rc;
! 5336: int spaceLeft;
! 5337: MemPage *pOvfl = 0;
! 5338: MemPage *pToRelease = 0;
! 5339: unsigned char *pPrior;
! 5340: unsigned char *pPayload;
! 5341: BtShared *pBt = pPage->pBt;
! 5342: Pgno pgnoOvfl = 0;
! 5343: int nHeader;
! 5344: CellInfo info;
! 5345:
! 5346: assert( sqlite3_mutex_held(pPage->pBt->mutex) );
! 5347:
! 5348: /* pPage is not necessarily writeable since pCell might be auxiliary
! 5349: ** buffer space that is separate from the pPage buffer area */
! 5350: assert( pCell<pPage->aData || pCell>=&pPage->aData[pBt->pageSize]
! 5351: || sqlite3PagerIswriteable(pPage->pDbPage) );
! 5352:
! 5353: /* Fill in the header. */
! 5354: nHeader = 0;
! 5355: if( !pPage->leaf ){
! 5356: nHeader += 4;
! 5357: }
! 5358: if( pPage->hasData ){
! 5359: nHeader += putVarint(&pCell[nHeader], nData+nZero);
! 5360: }else{
! 5361: nData = nZero = 0;
! 5362: }
! 5363: nHeader += putVarint(&pCell[nHeader], *(u64*)&nKey);
! 5364: btreeParseCellPtr(pPage, pCell, &info);
! 5365: assert( info.nHeader==nHeader );
! 5366: assert( info.nKey==nKey );
! 5367: assert( info.nData==(u32)(nData+nZero) );
! 5368:
! 5369: /* Fill in the payload */
! 5370: nPayload = nData + nZero;
! 5371: if( pPage->intKey ){
! 5372: pSrc = pData;
! 5373: nSrc = nData;
! 5374: nData = 0;
! 5375: }else{
! 5376: if( NEVER(nKey>0x7fffffff || pKey==0) ){
! 5377: return SQLITE_CORRUPT_BKPT;
! 5378: }
! 5379: nPayload += (int)nKey;
! 5380: pSrc = pKey;
! 5381: nSrc = (int)nKey;
! 5382: }
! 5383: *pnSize = info.nSize;
! 5384: spaceLeft = info.nLocal;
! 5385: pPayload = &pCell[nHeader];
! 5386: pPrior = &pCell[info.iOverflow];
! 5387:
! 5388: while( nPayload>0 ){
! 5389: if( spaceLeft==0 ){
! 5390: #ifndef SQLITE_OMIT_AUTOVACUUM
! 5391: Pgno pgnoPtrmap = pgnoOvfl; /* Overflow page pointer-map entry page */
! 5392: if( pBt->autoVacuum ){
! 5393: do{
! 5394: pgnoOvfl++;
! 5395: } while(
! 5396: PTRMAP_ISPAGE(pBt, pgnoOvfl) || pgnoOvfl==PENDING_BYTE_PAGE(pBt)
! 5397: );
! 5398: }
! 5399: #endif
! 5400: rc = allocateBtreePage(pBt, &pOvfl, &pgnoOvfl, pgnoOvfl, 0);
! 5401: #ifndef SQLITE_OMIT_AUTOVACUUM
! 5402: /* If the database supports auto-vacuum, and the second or subsequent
! 5403: ** overflow page is being allocated, add an entry to the pointer-map
! 5404: ** for that page now.
! 5405: **
! 5406: ** If this is the first overflow page, then write a partial entry
! 5407: ** to the pointer-map. If we write nothing to this pointer-map slot,
! 5408: ** then the optimistic overflow chain processing in clearCell()
! 5409: ** may misinterpret the uninitialised values and delete the
! 5410: ** wrong pages from the database.
! 5411: */
! 5412: if( pBt->autoVacuum && rc==SQLITE_OK ){
! 5413: u8 eType = (pgnoPtrmap?PTRMAP_OVERFLOW2:PTRMAP_OVERFLOW1);
! 5414: ptrmapPut(pBt, pgnoOvfl, eType, pgnoPtrmap, &rc);
! 5415: if( rc ){
! 5416: releasePage(pOvfl);
! 5417: }
! 5418: }
! 5419: #endif
! 5420: if( rc ){
! 5421: releasePage(pToRelease);
! 5422: return rc;
! 5423: }
! 5424:
! 5425: /* If pToRelease is not zero than pPrior points into the data area
! 5426: ** of pToRelease. Make sure pToRelease is still writeable. */
! 5427: assert( pToRelease==0 || sqlite3PagerIswriteable(pToRelease->pDbPage) );
! 5428:
! 5429: /* If pPrior is part of the data area of pPage, then make sure pPage
! 5430: ** is still writeable */
! 5431: assert( pPrior<pPage->aData || pPrior>=&pPage->aData[pBt->pageSize]
! 5432: || sqlite3PagerIswriteable(pPage->pDbPage) );
! 5433:
! 5434: put4byte(pPrior, pgnoOvfl);
! 5435: releasePage(pToRelease);
! 5436: pToRelease = pOvfl;
! 5437: pPrior = pOvfl->aData;
! 5438: put4byte(pPrior, 0);
! 5439: pPayload = &pOvfl->aData[4];
! 5440: spaceLeft = pBt->usableSize - 4;
! 5441: }
! 5442: n = nPayload;
! 5443: if( n>spaceLeft ) n = spaceLeft;
! 5444:
! 5445: /* If pToRelease is not zero than pPayload points into the data area
! 5446: ** of pToRelease. Make sure pToRelease is still writeable. */
! 5447: assert( pToRelease==0 || sqlite3PagerIswriteable(pToRelease->pDbPage) );
! 5448:
! 5449: /* If pPayload is part of the data area of pPage, then make sure pPage
! 5450: ** is still writeable */
! 5451: assert( pPayload<pPage->aData || pPayload>=&pPage->aData[pBt->pageSize]
! 5452: || sqlite3PagerIswriteable(pPage->pDbPage) );
! 5453:
! 5454: if( nSrc>0 ){
! 5455: if( n>nSrc ) n = nSrc;
! 5456: assert( pSrc );
! 5457: memcpy(pPayload, pSrc, n);
! 5458: }else{
! 5459: memset(pPayload, 0, n);
! 5460: }
! 5461: nPayload -= n;
! 5462: pPayload += n;
! 5463: pSrc += n;
! 5464: nSrc -= n;
! 5465: spaceLeft -= n;
! 5466: if( nSrc==0 ){
! 5467: nSrc = nData;
! 5468: pSrc = pData;
! 5469: }
! 5470: }
! 5471: releasePage(pToRelease);
! 5472: return SQLITE_OK;
! 5473: }
! 5474:
! 5475: /*
! 5476: ** Remove the i-th cell from pPage. This routine effects pPage only.
! 5477: ** The cell content is not freed or deallocated. It is assumed that
! 5478: ** the cell content has been copied someplace else. This routine just
! 5479: ** removes the reference to the cell from pPage.
! 5480: **
! 5481: ** "sz" must be the number of bytes in the cell.
! 5482: */
! 5483: static void dropCell(MemPage *pPage, int idx, int sz, int *pRC){
! 5484: u32 pc; /* Offset to cell content of cell being deleted */
! 5485: u8 *data; /* pPage->aData */
! 5486: u8 *ptr; /* Used to move bytes around within data[] */
! 5487: u8 *endPtr; /* End of loop */
! 5488: int rc; /* The return code */
! 5489: int hdr; /* Beginning of the header. 0 most pages. 100 page 1 */
! 5490:
! 5491: if( *pRC ) return;
! 5492:
! 5493: assert( idx>=0 && idx<pPage->nCell );
! 5494: assert( sz==cellSize(pPage, idx) );
! 5495: assert( sqlite3PagerIswriteable(pPage->pDbPage) );
! 5496: assert( sqlite3_mutex_held(pPage->pBt->mutex) );
! 5497: data = pPage->aData;
! 5498: ptr = &pPage->aCellIdx[2*idx];
! 5499: pc = get2byte(ptr);
! 5500: hdr = pPage->hdrOffset;
! 5501: testcase( pc==get2byte(&data[hdr+5]) );
! 5502: testcase( pc+sz==pPage->pBt->usableSize );
! 5503: if( pc < (u32)get2byte(&data[hdr+5]) || pc+sz > pPage->pBt->usableSize ){
! 5504: *pRC = SQLITE_CORRUPT_BKPT;
! 5505: return;
! 5506: }
! 5507: rc = freeSpace(pPage, pc, sz);
! 5508: if( rc ){
! 5509: *pRC = rc;
! 5510: return;
! 5511: }
! 5512: endPtr = &pPage->aCellIdx[2*pPage->nCell - 2];
! 5513: assert( (SQLITE_PTR_TO_INT(ptr)&1)==0 ); /* ptr is always 2-byte aligned */
! 5514: while( ptr<endPtr ){
! 5515: *(u16*)ptr = *(u16*)&ptr[2];
! 5516: ptr += 2;
! 5517: }
! 5518: pPage->nCell--;
! 5519: put2byte(&data[hdr+3], pPage->nCell);
! 5520: pPage->nFree += 2;
! 5521: }
! 5522:
! 5523: /*
! 5524: ** Insert a new cell on pPage at cell index "i". pCell points to the
! 5525: ** content of the cell.
! 5526: **
! 5527: ** If the cell content will fit on the page, then put it there. If it
! 5528: ** will not fit, then make a copy of the cell content into pTemp if
! 5529: ** pTemp is not null. Regardless of pTemp, allocate a new entry
! 5530: ** in pPage->aOvfl[] and make it point to the cell content (either
! 5531: ** in pTemp or the original pCell) and also record its index.
! 5532: ** Allocating a new entry in pPage->aCell[] implies that
! 5533: ** pPage->nOverflow is incremented.
! 5534: **
! 5535: ** If nSkip is non-zero, then do not copy the first nSkip bytes of the
! 5536: ** cell. The caller will overwrite them after this function returns. If
! 5537: ** nSkip is non-zero, then pCell may not point to an invalid memory location
! 5538: ** (but pCell+nSkip is always valid).
! 5539: */
! 5540: static void insertCell(
! 5541: MemPage *pPage, /* Page into which we are copying */
! 5542: int i, /* New cell becomes the i-th cell of the page */
! 5543: u8 *pCell, /* Content of the new cell */
! 5544: int sz, /* Bytes of content in pCell */
! 5545: u8 *pTemp, /* Temp storage space for pCell, if needed */
! 5546: Pgno iChild, /* If non-zero, replace first 4 bytes with this value */
! 5547: int *pRC /* Read and write return code from here */
! 5548: ){
! 5549: int idx = 0; /* Where to write new cell content in data[] */
! 5550: int j; /* Loop counter */
! 5551: int end; /* First byte past the last cell pointer in data[] */
! 5552: int ins; /* Index in data[] where new cell pointer is inserted */
! 5553: int cellOffset; /* Address of first cell pointer in data[] */
! 5554: u8 *data; /* The content of the whole page */
! 5555: u8 *ptr; /* Used for moving information around in data[] */
! 5556: u8 *endPtr; /* End of the loop */
! 5557:
! 5558: int nSkip = (iChild ? 4 : 0);
! 5559:
! 5560: if( *pRC ) return;
! 5561:
! 5562: assert( i>=0 && i<=pPage->nCell+pPage->nOverflow );
! 5563: assert( pPage->nCell<=MX_CELL(pPage->pBt) && MX_CELL(pPage->pBt)<=10921 );
! 5564: assert( pPage->nOverflow<=ArraySize(pPage->aOvfl) );
! 5565: assert( sqlite3_mutex_held(pPage->pBt->mutex) );
! 5566: /* The cell should normally be sized correctly. However, when moving a
! 5567: ** malformed cell from a leaf page to an interior page, if the cell size
! 5568: ** wanted to be less than 4 but got rounded up to 4 on the leaf, then size
! 5569: ** might be less than 8 (leaf-size + pointer) on the interior node. Hence
! 5570: ** the term after the || in the following assert(). */
! 5571: assert( sz==cellSizePtr(pPage, pCell) || (sz==8 && iChild>0) );
! 5572: if( pPage->nOverflow || sz+2>pPage->nFree ){
! 5573: if( pTemp ){
! 5574: memcpy(pTemp+nSkip, pCell+nSkip, sz-nSkip);
! 5575: pCell = pTemp;
! 5576: }
! 5577: if( iChild ){
! 5578: put4byte(pCell, iChild);
! 5579: }
! 5580: j = pPage->nOverflow++;
! 5581: assert( j<(int)(sizeof(pPage->aOvfl)/sizeof(pPage->aOvfl[0])) );
! 5582: pPage->aOvfl[j].pCell = pCell;
! 5583: pPage->aOvfl[j].idx = (u16)i;
! 5584: }else{
! 5585: int rc = sqlite3PagerWrite(pPage->pDbPage);
! 5586: if( rc!=SQLITE_OK ){
! 5587: *pRC = rc;
! 5588: return;
! 5589: }
! 5590: assert( sqlite3PagerIswriteable(pPage->pDbPage) );
! 5591: data = pPage->aData;
! 5592: cellOffset = pPage->cellOffset;
! 5593: end = cellOffset + 2*pPage->nCell;
! 5594: ins = cellOffset + 2*i;
! 5595: rc = allocateSpace(pPage, sz, &idx);
! 5596: if( rc ){ *pRC = rc; return; }
! 5597: /* The allocateSpace() routine guarantees the following two properties
! 5598: ** if it returns success */
! 5599: assert( idx >= end+2 );
! 5600: assert( idx+sz <= (int)pPage->pBt->usableSize );
! 5601: pPage->nCell++;
! 5602: pPage->nFree -= (u16)(2 + sz);
! 5603: memcpy(&data[idx+nSkip], pCell+nSkip, sz-nSkip);
! 5604: if( iChild ){
! 5605: put4byte(&data[idx], iChild);
! 5606: }
! 5607: ptr = &data[end];
! 5608: endPtr = &data[ins];
! 5609: assert( (SQLITE_PTR_TO_INT(ptr)&1)==0 ); /* ptr is always 2-byte aligned */
! 5610: while( ptr>endPtr ){
! 5611: *(u16*)ptr = *(u16*)&ptr[-2];
! 5612: ptr -= 2;
! 5613: }
! 5614: put2byte(&data[ins], idx);
! 5615: put2byte(&data[pPage->hdrOffset+3], pPage->nCell);
! 5616: #ifndef SQLITE_OMIT_AUTOVACUUM
! 5617: if( pPage->pBt->autoVacuum ){
! 5618: /* The cell may contain a pointer to an overflow page. If so, write
! 5619: ** the entry for the overflow page into the pointer map.
! 5620: */
! 5621: ptrmapPutOvflPtr(pPage, pCell, pRC);
! 5622: }
! 5623: #endif
! 5624: }
! 5625: }
! 5626:
! 5627: /*
! 5628: ** Add a list of cells to a page. The page should be initially empty.
! 5629: ** The cells are guaranteed to fit on the page.
! 5630: */
! 5631: static void assemblePage(
! 5632: MemPage *pPage, /* The page to be assemblied */
! 5633: int nCell, /* The number of cells to add to this page */
! 5634: u8 **apCell, /* Pointers to cell bodies */
! 5635: u16 *aSize /* Sizes of the cells */
! 5636: ){
! 5637: int i; /* Loop counter */
! 5638: u8 *pCellptr; /* Address of next cell pointer */
! 5639: int cellbody; /* Address of next cell body */
! 5640: u8 * const data = pPage->aData; /* Pointer to data for pPage */
! 5641: const int hdr = pPage->hdrOffset; /* Offset of header on pPage */
! 5642: const int nUsable = pPage->pBt->usableSize; /* Usable size of page */
! 5643:
! 5644: assert( pPage->nOverflow==0 );
! 5645: assert( sqlite3_mutex_held(pPage->pBt->mutex) );
! 5646: assert( nCell>=0 && nCell<=(int)MX_CELL(pPage->pBt)
! 5647: && (int)MX_CELL(pPage->pBt)<=10921);
! 5648: assert( sqlite3PagerIswriteable(pPage->pDbPage) );
! 5649:
! 5650: /* Check that the page has just been zeroed by zeroPage() */
! 5651: assert( pPage->nCell==0 );
! 5652: assert( get2byteNotZero(&data[hdr+5])==nUsable );
! 5653:
! 5654: pCellptr = &pPage->aCellIdx[nCell*2];
! 5655: cellbody = nUsable;
! 5656: for(i=nCell-1; i>=0; i--){
! 5657: u16 sz = aSize[i];
! 5658: pCellptr -= 2;
! 5659: cellbody -= sz;
! 5660: put2byte(pCellptr, cellbody);
! 5661: memcpy(&data[cellbody], apCell[i], sz);
! 5662: }
! 5663: put2byte(&data[hdr+3], nCell);
! 5664: put2byte(&data[hdr+5], cellbody);
! 5665: pPage->nFree -= (nCell*2 + nUsable - cellbody);
! 5666: pPage->nCell = (u16)nCell;
! 5667: }
! 5668:
! 5669: /*
! 5670: ** The following parameters determine how many adjacent pages get involved
! 5671: ** in a balancing operation. NN is the number of neighbors on either side
! 5672: ** of the page that participate in the balancing operation. NB is the
! 5673: ** total number of pages that participate, including the target page and
! 5674: ** NN neighbors on either side.
! 5675: **
! 5676: ** The minimum value of NN is 1 (of course). Increasing NN above 1
! 5677: ** (to 2 or 3) gives a modest improvement in SELECT and DELETE performance
! 5678: ** in exchange for a larger degradation in INSERT and UPDATE performance.
! 5679: ** The value of NN appears to give the best results overall.
! 5680: */
! 5681: #define NN 1 /* Number of neighbors on either side of pPage */
! 5682: #define NB (NN*2+1) /* Total pages involved in the balance */
! 5683:
! 5684:
! 5685: #ifndef SQLITE_OMIT_QUICKBALANCE
! 5686: /*
! 5687: ** This version of balance() handles the common special case where
! 5688: ** a new entry is being inserted on the extreme right-end of the
! 5689: ** tree, in other words, when the new entry will become the largest
! 5690: ** entry in the tree.
! 5691: **
! 5692: ** Instead of trying to balance the 3 right-most leaf pages, just add
! 5693: ** a new page to the right-hand side and put the one new entry in
! 5694: ** that page. This leaves the right side of the tree somewhat
! 5695: ** unbalanced. But odds are that we will be inserting new entries
! 5696: ** at the end soon afterwards so the nearly empty page will quickly
! 5697: ** fill up. On average.
! 5698: **
! 5699: ** pPage is the leaf page which is the right-most page in the tree.
! 5700: ** pParent is its parent. pPage must have a single overflow entry
! 5701: ** which is also the right-most entry on the page.
! 5702: **
! 5703: ** The pSpace buffer is used to store a temporary copy of the divider
! 5704: ** cell that will be inserted into pParent. Such a cell consists of a 4
! 5705: ** byte page number followed by a variable length integer. In other
! 5706: ** words, at most 13 bytes. Hence the pSpace buffer must be at
! 5707: ** least 13 bytes in size.
! 5708: */
! 5709: static int balance_quick(MemPage *pParent, MemPage *pPage, u8 *pSpace){
! 5710: BtShared *const pBt = pPage->pBt; /* B-Tree Database */
! 5711: MemPage *pNew; /* Newly allocated page */
! 5712: int rc; /* Return Code */
! 5713: Pgno pgnoNew; /* Page number of pNew */
! 5714:
! 5715: assert( sqlite3_mutex_held(pPage->pBt->mutex) );
! 5716: assert( sqlite3PagerIswriteable(pParent->pDbPage) );
! 5717: assert( pPage->nOverflow==1 );
! 5718:
! 5719: /* This error condition is now caught prior to reaching this function */
! 5720: if( pPage->nCell<=0 ) return SQLITE_CORRUPT_BKPT;
! 5721:
! 5722: /* Allocate a new page. This page will become the right-sibling of
! 5723: ** pPage. Make the parent page writable, so that the new divider cell
! 5724: ** may be inserted. If both these operations are successful, proceed.
! 5725: */
! 5726: rc = allocateBtreePage(pBt, &pNew, &pgnoNew, 0, 0);
! 5727:
! 5728: if( rc==SQLITE_OK ){
! 5729:
! 5730: u8 *pOut = &pSpace[4];
! 5731: u8 *pCell = pPage->aOvfl[0].pCell;
! 5732: u16 szCell = cellSizePtr(pPage, pCell);
! 5733: u8 *pStop;
! 5734:
! 5735: assert( sqlite3PagerIswriteable(pNew->pDbPage) );
! 5736: assert( pPage->aData[0]==(PTF_INTKEY|PTF_LEAFDATA|PTF_LEAF) );
! 5737: zeroPage(pNew, PTF_INTKEY|PTF_LEAFDATA|PTF_LEAF);
! 5738: assemblePage(pNew, 1, &pCell, &szCell);
! 5739:
! 5740: /* If this is an auto-vacuum database, update the pointer map
! 5741: ** with entries for the new page, and any pointer from the
! 5742: ** cell on the page to an overflow page. If either of these
! 5743: ** operations fails, the return code is set, but the contents
! 5744: ** of the parent page are still manipulated by thh code below.
! 5745: ** That is Ok, at this point the parent page is guaranteed to
! 5746: ** be marked as dirty. Returning an error code will cause a
! 5747: ** rollback, undoing any changes made to the parent page.
! 5748: */
! 5749: if( ISAUTOVACUUM ){
! 5750: ptrmapPut(pBt, pgnoNew, PTRMAP_BTREE, pParent->pgno, &rc);
! 5751: if( szCell>pNew->minLocal ){
! 5752: ptrmapPutOvflPtr(pNew, pCell, &rc);
! 5753: }
! 5754: }
! 5755:
! 5756: /* Create a divider cell to insert into pParent. The divider cell
! 5757: ** consists of a 4-byte page number (the page number of pPage) and
! 5758: ** a variable length key value (which must be the same value as the
! 5759: ** largest key on pPage).
! 5760: **
! 5761: ** To find the largest key value on pPage, first find the right-most
! 5762: ** cell on pPage. The first two fields of this cell are the
! 5763: ** record-length (a variable length integer at most 32-bits in size)
! 5764: ** and the key value (a variable length integer, may have any value).
! 5765: ** The first of the while(...) loops below skips over the record-length
! 5766: ** field. The second while(...) loop copies the key value from the
! 5767: ** cell on pPage into the pSpace buffer.
! 5768: */
! 5769: pCell = findCell(pPage, pPage->nCell-1);
! 5770: pStop = &pCell[9];
! 5771: while( (*(pCell++)&0x80) && pCell<pStop );
! 5772: pStop = &pCell[9];
! 5773: while( ((*(pOut++) = *(pCell++))&0x80) && pCell<pStop );
! 5774:
! 5775: /* Insert the new divider cell into pParent. */
! 5776: insertCell(pParent, pParent->nCell, pSpace, (int)(pOut-pSpace),
! 5777: 0, pPage->pgno, &rc);
! 5778:
! 5779: /* Set the right-child pointer of pParent to point to the new page. */
! 5780: put4byte(&pParent->aData[pParent->hdrOffset+8], pgnoNew);
! 5781:
! 5782: /* Release the reference to the new page. */
! 5783: releasePage(pNew);
! 5784: }
! 5785:
! 5786: return rc;
! 5787: }
! 5788: #endif /* SQLITE_OMIT_QUICKBALANCE */
! 5789:
! 5790: #if 0
! 5791: /*
! 5792: ** This function does not contribute anything to the operation of SQLite.
! 5793: ** it is sometimes activated temporarily while debugging code responsible
! 5794: ** for setting pointer-map entries.
! 5795: */
! 5796: static int ptrmapCheckPages(MemPage **apPage, int nPage){
! 5797: int i, j;
! 5798: for(i=0; i<nPage; i++){
! 5799: Pgno n;
! 5800: u8 e;
! 5801: MemPage *pPage = apPage[i];
! 5802: BtShared *pBt = pPage->pBt;
! 5803: assert( pPage->isInit );
! 5804:
! 5805: for(j=0; j<pPage->nCell; j++){
! 5806: CellInfo info;
! 5807: u8 *z;
! 5808:
! 5809: z = findCell(pPage, j);
! 5810: btreeParseCellPtr(pPage, z, &info);
! 5811: if( info.iOverflow ){
! 5812: Pgno ovfl = get4byte(&z[info.iOverflow]);
! 5813: ptrmapGet(pBt, ovfl, &e, &n);
! 5814: assert( n==pPage->pgno && e==PTRMAP_OVERFLOW1 );
! 5815: }
! 5816: if( !pPage->leaf ){
! 5817: Pgno child = get4byte(z);
! 5818: ptrmapGet(pBt, child, &e, &n);
! 5819: assert( n==pPage->pgno && e==PTRMAP_BTREE );
! 5820: }
! 5821: }
! 5822: if( !pPage->leaf ){
! 5823: Pgno child = get4byte(&pPage->aData[pPage->hdrOffset+8]);
! 5824: ptrmapGet(pBt, child, &e, &n);
! 5825: assert( n==pPage->pgno && e==PTRMAP_BTREE );
! 5826: }
! 5827: }
! 5828: return 1;
! 5829: }
! 5830: #endif
! 5831:
! 5832: /*
! 5833: ** This function is used to copy the contents of the b-tree node stored
! 5834: ** on page pFrom to page pTo. If page pFrom was not a leaf page, then
! 5835: ** the pointer-map entries for each child page are updated so that the
! 5836: ** parent page stored in the pointer map is page pTo. If pFrom contained
! 5837: ** any cells with overflow page pointers, then the corresponding pointer
! 5838: ** map entries are also updated so that the parent page is page pTo.
! 5839: **
! 5840: ** If pFrom is currently carrying any overflow cells (entries in the
! 5841: ** MemPage.aOvfl[] array), they are not copied to pTo.
! 5842: **
! 5843: ** Before returning, page pTo is reinitialized using btreeInitPage().
! 5844: **
! 5845: ** The performance of this function is not critical. It is only used by
! 5846: ** the balance_shallower() and balance_deeper() procedures, neither of
! 5847: ** which are called often under normal circumstances.
! 5848: */
! 5849: static void copyNodeContent(MemPage *pFrom, MemPage *pTo, int *pRC){
! 5850: if( (*pRC)==SQLITE_OK ){
! 5851: BtShared * const pBt = pFrom->pBt;
! 5852: u8 * const aFrom = pFrom->aData;
! 5853: u8 * const aTo = pTo->aData;
! 5854: int const iFromHdr = pFrom->hdrOffset;
! 5855: int const iToHdr = ((pTo->pgno==1) ? 100 : 0);
! 5856: int rc;
! 5857: int iData;
! 5858:
! 5859:
! 5860: assert( pFrom->isInit );
! 5861: assert( pFrom->nFree>=iToHdr );
! 5862: assert( get2byte(&aFrom[iFromHdr+5]) <= (int)pBt->usableSize );
! 5863:
! 5864: /* Copy the b-tree node content from page pFrom to page pTo. */
! 5865: iData = get2byte(&aFrom[iFromHdr+5]);
! 5866: memcpy(&aTo[iData], &aFrom[iData], pBt->usableSize-iData);
! 5867: memcpy(&aTo[iToHdr], &aFrom[iFromHdr], pFrom->cellOffset + 2*pFrom->nCell);
! 5868:
! 5869: /* Reinitialize page pTo so that the contents of the MemPage structure
! 5870: ** match the new data. The initialization of pTo can actually fail under
! 5871: ** fairly obscure circumstances, even though it is a copy of initialized
! 5872: ** page pFrom.
! 5873: */
! 5874: pTo->isInit = 0;
! 5875: rc = btreeInitPage(pTo);
! 5876: if( rc!=SQLITE_OK ){
! 5877: *pRC = rc;
! 5878: return;
! 5879: }
! 5880:
! 5881: /* If this is an auto-vacuum database, update the pointer-map entries
! 5882: ** for any b-tree or overflow pages that pTo now contains the pointers to.
! 5883: */
! 5884: if( ISAUTOVACUUM ){
! 5885: *pRC = setChildPtrmaps(pTo);
! 5886: }
! 5887: }
! 5888: }
! 5889:
! 5890: /*
! 5891: ** This routine redistributes cells on the iParentIdx'th child of pParent
! 5892: ** (hereafter "the page") and up to 2 siblings so that all pages have about the
! 5893: ** same amount of free space. Usually a single sibling on either side of the
! 5894: ** page are used in the balancing, though both siblings might come from one
! 5895: ** side if the page is the first or last child of its parent. If the page
! 5896: ** has fewer than 2 siblings (something which can only happen if the page
! 5897: ** is a root page or a child of a root page) then all available siblings
! 5898: ** participate in the balancing.
! 5899: **
! 5900: ** The number of siblings of the page might be increased or decreased by
! 5901: ** one or two in an effort to keep pages nearly full but not over full.
! 5902: **
! 5903: ** Note that when this routine is called, some of the cells on the page
! 5904: ** might not actually be stored in MemPage.aData[]. This can happen
! 5905: ** if the page is overfull. This routine ensures that all cells allocated
! 5906: ** to the page and its siblings fit into MemPage.aData[] before returning.
! 5907: **
! 5908: ** In the course of balancing the page and its siblings, cells may be
! 5909: ** inserted into or removed from the parent page (pParent). Doing so
! 5910: ** may cause the parent page to become overfull or underfull. If this
! 5911: ** happens, it is the responsibility of the caller to invoke the correct
! 5912: ** balancing routine to fix this problem (see the balance() routine).
! 5913: **
! 5914: ** If this routine fails for any reason, it might leave the database
! 5915: ** in a corrupted state. So if this routine fails, the database should
! 5916: ** be rolled back.
! 5917: **
! 5918: ** The third argument to this function, aOvflSpace, is a pointer to a
! 5919: ** buffer big enough to hold one page. If while inserting cells into the parent
! 5920: ** page (pParent) the parent page becomes overfull, this buffer is
! 5921: ** used to store the parent's overflow cells. Because this function inserts
! 5922: ** a maximum of four divider cells into the parent page, and the maximum
! 5923: ** size of a cell stored within an internal node is always less than 1/4
! 5924: ** of the page-size, the aOvflSpace[] buffer is guaranteed to be large
! 5925: ** enough for all overflow cells.
! 5926: **
! 5927: ** If aOvflSpace is set to a null pointer, this function returns
! 5928: ** SQLITE_NOMEM.
! 5929: */
! 5930: static int balance_nonroot(
! 5931: MemPage *pParent, /* Parent page of siblings being balanced */
! 5932: int iParentIdx, /* Index of "the page" in pParent */
! 5933: u8 *aOvflSpace, /* page-size bytes of space for parent ovfl */
! 5934: int isRoot /* True if pParent is a root-page */
! 5935: ){
! 5936: BtShared *pBt; /* The whole database */
! 5937: int nCell = 0; /* Number of cells in apCell[] */
! 5938: int nMaxCells = 0; /* Allocated size of apCell, szCell, aFrom. */
! 5939: int nNew = 0; /* Number of pages in apNew[] */
! 5940: int nOld; /* Number of pages in apOld[] */
! 5941: int i, j, k; /* Loop counters */
! 5942: int nxDiv; /* Next divider slot in pParent->aCell[] */
! 5943: int rc = SQLITE_OK; /* The return code */
! 5944: u16 leafCorrection; /* 4 if pPage is a leaf. 0 if not */
! 5945: int leafData; /* True if pPage is a leaf of a LEAFDATA tree */
! 5946: int usableSpace; /* Bytes in pPage beyond the header */
! 5947: int pageFlags; /* Value of pPage->aData[0] */
! 5948: int subtotal; /* Subtotal of bytes in cells on one page */
! 5949: int iSpace1 = 0; /* First unused byte of aSpace1[] */
! 5950: int iOvflSpace = 0; /* First unused byte of aOvflSpace[] */
! 5951: int szScratch; /* Size of scratch memory requested */
! 5952: MemPage *apOld[NB]; /* pPage and up to two siblings */
! 5953: MemPage *apCopy[NB]; /* Private copies of apOld[] pages */
! 5954: MemPage *apNew[NB+2]; /* pPage and up to NB siblings after balancing */
! 5955: u8 *pRight; /* Location in parent of right-sibling pointer */
! 5956: u8 *apDiv[NB-1]; /* Divider cells in pParent */
! 5957: int cntNew[NB+2]; /* Index in aCell[] of cell after i-th page */
! 5958: int szNew[NB+2]; /* Combined size of cells place on i-th page */
! 5959: u8 **apCell = 0; /* All cells begin balanced */
! 5960: u16 *szCell; /* Local size of all cells in apCell[] */
! 5961: u8 *aSpace1; /* Space for copies of dividers cells */
! 5962: Pgno pgno; /* Temp var to store a page number in */
! 5963:
! 5964: pBt = pParent->pBt;
! 5965: assert( sqlite3_mutex_held(pBt->mutex) );
! 5966: assert( sqlite3PagerIswriteable(pParent->pDbPage) );
! 5967:
! 5968: #if 0
! 5969: TRACE(("BALANCE: begin page %d child of %d\n", pPage->pgno, pParent->pgno));
! 5970: #endif
! 5971:
! 5972: /* At this point pParent may have at most one overflow cell. And if
! 5973: ** this overflow cell is present, it must be the cell with
! 5974: ** index iParentIdx. This scenario comes about when this function
! 5975: ** is called (indirectly) from sqlite3BtreeDelete().
! 5976: */
! 5977: assert( pParent->nOverflow==0 || pParent->nOverflow==1 );
! 5978: assert( pParent->nOverflow==0 || pParent->aOvfl[0].idx==iParentIdx );
! 5979:
! 5980: if( !aOvflSpace ){
! 5981: return SQLITE_NOMEM;
! 5982: }
! 5983:
! 5984: /* Find the sibling pages to balance. Also locate the cells in pParent
! 5985: ** that divide the siblings. An attempt is made to find NN siblings on
! 5986: ** either side of pPage. More siblings are taken from one side, however,
! 5987: ** if there are fewer than NN siblings on the other side. If pParent
! 5988: ** has NB or fewer children then all children of pParent are taken.
! 5989: **
! 5990: ** This loop also drops the divider cells from the parent page. This
! 5991: ** way, the remainder of the function does not have to deal with any
! 5992: ** overflow cells in the parent page, since if any existed they will
! 5993: ** have already been removed.
! 5994: */
! 5995: i = pParent->nOverflow + pParent->nCell;
! 5996: if( i<2 ){
! 5997: nxDiv = 0;
! 5998: nOld = i+1;
! 5999: }else{
! 6000: nOld = 3;
! 6001: if( iParentIdx==0 ){
! 6002: nxDiv = 0;
! 6003: }else if( iParentIdx==i ){
! 6004: nxDiv = i-2;
! 6005: }else{
! 6006: nxDiv = iParentIdx-1;
! 6007: }
! 6008: i = 2;
! 6009: }
! 6010: if( (i+nxDiv-pParent->nOverflow)==pParent->nCell ){
! 6011: pRight = &pParent->aData[pParent->hdrOffset+8];
! 6012: }else{
! 6013: pRight = findCell(pParent, i+nxDiv-pParent->nOverflow);
! 6014: }
! 6015: pgno = get4byte(pRight);
! 6016: while( 1 ){
! 6017: rc = getAndInitPage(pBt, pgno, &apOld[i]);
! 6018: if( rc ){
! 6019: memset(apOld, 0, (i+1)*sizeof(MemPage*));
! 6020: goto balance_cleanup;
! 6021: }
! 6022: nMaxCells += 1+apOld[i]->nCell+apOld[i]->nOverflow;
! 6023: if( (i--)==0 ) break;
! 6024:
! 6025: if( i+nxDiv==pParent->aOvfl[0].idx && pParent->nOverflow ){
! 6026: apDiv[i] = pParent->aOvfl[0].pCell;
! 6027: pgno = get4byte(apDiv[i]);
! 6028: szNew[i] = cellSizePtr(pParent, apDiv[i]);
! 6029: pParent->nOverflow = 0;
! 6030: }else{
! 6031: apDiv[i] = findCell(pParent, i+nxDiv-pParent->nOverflow);
! 6032: pgno = get4byte(apDiv[i]);
! 6033: szNew[i] = cellSizePtr(pParent, apDiv[i]);
! 6034:
! 6035: /* Drop the cell from the parent page. apDiv[i] still points to
! 6036: ** the cell within the parent, even though it has been dropped.
! 6037: ** This is safe because dropping a cell only overwrites the first
! 6038: ** four bytes of it, and this function does not need the first
! 6039: ** four bytes of the divider cell. So the pointer is safe to use
! 6040: ** later on.
! 6041: **
! 6042: ** But not if we are in secure-delete mode. In secure-delete mode,
! 6043: ** the dropCell() routine will overwrite the entire cell with zeroes.
! 6044: ** In this case, temporarily copy the cell into the aOvflSpace[]
! 6045: ** buffer. It will be copied out again as soon as the aSpace[] buffer
! 6046: ** is allocated. */
! 6047: if( pBt->btsFlags & BTS_SECURE_DELETE ){
! 6048: int iOff;
! 6049:
! 6050: iOff = SQLITE_PTR_TO_INT(apDiv[i]) - SQLITE_PTR_TO_INT(pParent->aData);
! 6051: if( (iOff+szNew[i])>(int)pBt->usableSize ){
! 6052: rc = SQLITE_CORRUPT_BKPT;
! 6053: memset(apOld, 0, (i+1)*sizeof(MemPage*));
! 6054: goto balance_cleanup;
! 6055: }else{
! 6056: memcpy(&aOvflSpace[iOff], apDiv[i], szNew[i]);
! 6057: apDiv[i] = &aOvflSpace[apDiv[i]-pParent->aData];
! 6058: }
! 6059: }
! 6060: dropCell(pParent, i+nxDiv-pParent->nOverflow, szNew[i], &rc);
! 6061: }
! 6062: }
! 6063:
! 6064: /* Make nMaxCells a multiple of 4 in order to preserve 8-byte
! 6065: ** alignment */
! 6066: nMaxCells = (nMaxCells + 3)&~3;
! 6067:
! 6068: /*
! 6069: ** Allocate space for memory structures
! 6070: */
! 6071: k = pBt->pageSize + ROUND8(sizeof(MemPage));
! 6072: szScratch =
! 6073: nMaxCells*sizeof(u8*) /* apCell */
! 6074: + nMaxCells*sizeof(u16) /* szCell */
! 6075: + pBt->pageSize /* aSpace1 */
! 6076: + k*nOld; /* Page copies (apCopy) */
! 6077: apCell = sqlite3ScratchMalloc( szScratch );
! 6078: if( apCell==0 ){
! 6079: rc = SQLITE_NOMEM;
! 6080: goto balance_cleanup;
! 6081: }
! 6082: szCell = (u16*)&apCell[nMaxCells];
! 6083: aSpace1 = (u8*)&szCell[nMaxCells];
! 6084: assert( EIGHT_BYTE_ALIGNMENT(aSpace1) );
! 6085:
! 6086: /*
! 6087: ** Load pointers to all cells on sibling pages and the divider cells
! 6088: ** into the local apCell[] array. Make copies of the divider cells
! 6089: ** into space obtained from aSpace1[] and remove the the divider Cells
! 6090: ** from pParent.
! 6091: **
! 6092: ** If the siblings are on leaf pages, then the child pointers of the
! 6093: ** divider cells are stripped from the cells before they are copied
! 6094: ** into aSpace1[]. In this way, all cells in apCell[] are without
! 6095: ** child pointers. If siblings are not leaves, then all cell in
! 6096: ** apCell[] include child pointers. Either way, all cells in apCell[]
! 6097: ** are alike.
! 6098: **
! 6099: ** leafCorrection: 4 if pPage is a leaf. 0 if pPage is not a leaf.
! 6100: ** leafData: 1 if pPage holds key+data and pParent holds only keys.
! 6101: */
! 6102: leafCorrection = apOld[0]->leaf*4;
! 6103: leafData = apOld[0]->hasData;
! 6104: for(i=0; i<nOld; i++){
! 6105: int limit;
! 6106:
! 6107: /* Before doing anything else, take a copy of the i'th original sibling
! 6108: ** The rest of this function will use data from the copies rather
! 6109: ** that the original pages since the original pages will be in the
! 6110: ** process of being overwritten. */
! 6111: MemPage *pOld = apCopy[i] = (MemPage*)&aSpace1[pBt->pageSize + k*i];
! 6112: memcpy(pOld, apOld[i], sizeof(MemPage));
! 6113: pOld->aData = (void*)&pOld[1];
! 6114: memcpy(pOld->aData, apOld[i]->aData, pBt->pageSize);
! 6115:
! 6116: limit = pOld->nCell+pOld->nOverflow;
! 6117: if( pOld->nOverflow>0 ){
! 6118: for(j=0; j<limit; j++){
! 6119: assert( nCell<nMaxCells );
! 6120: apCell[nCell] = findOverflowCell(pOld, j);
! 6121: szCell[nCell] = cellSizePtr(pOld, apCell[nCell]);
! 6122: nCell++;
! 6123: }
! 6124: }else{
! 6125: u8 *aData = pOld->aData;
! 6126: u16 maskPage = pOld->maskPage;
! 6127: u16 cellOffset = pOld->cellOffset;
! 6128: for(j=0; j<limit; j++){
! 6129: assert( nCell<nMaxCells );
! 6130: apCell[nCell] = findCellv2(aData, maskPage, cellOffset, j);
! 6131: szCell[nCell] = cellSizePtr(pOld, apCell[nCell]);
! 6132: nCell++;
! 6133: }
! 6134: }
! 6135: if( i<nOld-1 && !leafData){
! 6136: u16 sz = (u16)szNew[i];
! 6137: u8 *pTemp;
! 6138: assert( nCell<nMaxCells );
! 6139: szCell[nCell] = sz;
! 6140: pTemp = &aSpace1[iSpace1];
! 6141: iSpace1 += sz;
! 6142: assert( sz<=pBt->maxLocal+23 );
! 6143: assert( iSpace1 <= (int)pBt->pageSize );
! 6144: memcpy(pTemp, apDiv[i], sz);
! 6145: apCell[nCell] = pTemp+leafCorrection;
! 6146: assert( leafCorrection==0 || leafCorrection==4 );
! 6147: szCell[nCell] = szCell[nCell] - leafCorrection;
! 6148: if( !pOld->leaf ){
! 6149: assert( leafCorrection==0 );
! 6150: assert( pOld->hdrOffset==0 );
! 6151: /* The right pointer of the child page pOld becomes the left
! 6152: ** pointer of the divider cell */
! 6153: memcpy(apCell[nCell], &pOld->aData[8], 4);
! 6154: }else{
! 6155: assert( leafCorrection==4 );
! 6156: if( szCell[nCell]<4 ){
! 6157: /* Do not allow any cells smaller than 4 bytes. */
! 6158: szCell[nCell] = 4;
! 6159: }
! 6160: }
! 6161: nCell++;
! 6162: }
! 6163: }
! 6164:
! 6165: /*
! 6166: ** Figure out the number of pages needed to hold all nCell cells.
! 6167: ** Store this number in "k". Also compute szNew[] which is the total
! 6168: ** size of all cells on the i-th page and cntNew[] which is the index
! 6169: ** in apCell[] of the cell that divides page i from page i+1.
! 6170: ** cntNew[k] should equal nCell.
! 6171: **
! 6172: ** Values computed by this block:
! 6173: **
! 6174: ** k: The total number of sibling pages
! 6175: ** szNew[i]: Spaced used on the i-th sibling page.
! 6176: ** cntNew[i]: Index in apCell[] and szCell[] for the first cell to
! 6177: ** the right of the i-th sibling page.
! 6178: ** usableSpace: Number of bytes of space available on each sibling.
! 6179: **
! 6180: */
! 6181: usableSpace = pBt->usableSize - 12 + leafCorrection;
! 6182: for(subtotal=k=i=0; i<nCell; i++){
! 6183: assert( i<nMaxCells );
! 6184: subtotal += szCell[i] + 2;
! 6185: if( subtotal > usableSpace ){
! 6186: szNew[k] = subtotal - szCell[i];
! 6187: cntNew[k] = i;
! 6188: if( leafData ){ i--; }
! 6189: subtotal = 0;
! 6190: k++;
! 6191: if( k>NB+1 ){ rc = SQLITE_CORRUPT_BKPT; goto balance_cleanup; }
! 6192: }
! 6193: }
! 6194: szNew[k] = subtotal;
! 6195: cntNew[k] = nCell;
! 6196: k++;
! 6197:
! 6198: /*
! 6199: ** The packing computed by the previous block is biased toward the siblings
! 6200: ** on the left side. The left siblings are always nearly full, while the
! 6201: ** right-most sibling might be nearly empty. This block of code attempts
! 6202: ** to adjust the packing of siblings to get a better balance.
! 6203: **
! 6204: ** This adjustment is more than an optimization. The packing above might
! 6205: ** be so out of balance as to be illegal. For example, the right-most
! 6206: ** sibling might be completely empty. This adjustment is not optional.
! 6207: */
! 6208: for(i=k-1; i>0; i--){
! 6209: int szRight = szNew[i]; /* Size of sibling on the right */
! 6210: int szLeft = szNew[i-1]; /* Size of sibling on the left */
! 6211: int r; /* Index of right-most cell in left sibling */
! 6212: int d; /* Index of first cell to the left of right sibling */
! 6213:
! 6214: r = cntNew[i-1] - 1;
! 6215: d = r + 1 - leafData;
! 6216: assert( d<nMaxCells );
! 6217: assert( r<nMaxCells );
! 6218: while( szRight==0 || szRight+szCell[d]+2<=szLeft-(szCell[r]+2) ){
! 6219: szRight += szCell[d] + 2;
! 6220: szLeft -= szCell[r] + 2;
! 6221: cntNew[i-1]--;
! 6222: r = cntNew[i-1] - 1;
! 6223: d = r + 1 - leafData;
! 6224: }
! 6225: szNew[i] = szRight;
! 6226: szNew[i-1] = szLeft;
! 6227: }
! 6228:
! 6229: /* Either we found one or more cells (cntnew[0])>0) or pPage is
! 6230: ** a virtual root page. A virtual root page is when the real root
! 6231: ** page is page 1 and we are the only child of that page.
! 6232: **
! 6233: ** UPDATE: The assert() below is not necessarily true if the database
! 6234: ** file is corrupt. The corruption will be detected and reported later
! 6235: ** in this procedure so there is no need to act upon it now.
! 6236: */
! 6237: #if 0
! 6238: assert( cntNew[0]>0 || (pParent->pgno==1 && pParent->nCell==0) );
! 6239: #endif
! 6240:
! 6241: TRACE(("BALANCE: old: %d %d %d ",
! 6242: apOld[0]->pgno,
! 6243: nOld>=2 ? apOld[1]->pgno : 0,
! 6244: nOld>=3 ? apOld[2]->pgno : 0
! 6245: ));
! 6246:
! 6247: /*
! 6248: ** Allocate k new pages. Reuse old pages where possible.
! 6249: */
! 6250: if( apOld[0]->pgno<=1 ){
! 6251: rc = SQLITE_CORRUPT_BKPT;
! 6252: goto balance_cleanup;
! 6253: }
! 6254: pageFlags = apOld[0]->aData[0];
! 6255: for(i=0; i<k; i++){
! 6256: MemPage *pNew;
! 6257: if( i<nOld ){
! 6258: pNew = apNew[i] = apOld[i];
! 6259: apOld[i] = 0;
! 6260: rc = sqlite3PagerWrite(pNew->pDbPage);
! 6261: nNew++;
! 6262: if( rc ) goto balance_cleanup;
! 6263: }else{
! 6264: assert( i>0 );
! 6265: rc = allocateBtreePage(pBt, &pNew, &pgno, pgno, 0);
! 6266: if( rc ) goto balance_cleanup;
! 6267: apNew[i] = pNew;
! 6268: nNew++;
! 6269:
! 6270: /* Set the pointer-map entry for the new sibling page. */
! 6271: if( ISAUTOVACUUM ){
! 6272: ptrmapPut(pBt, pNew->pgno, PTRMAP_BTREE, pParent->pgno, &rc);
! 6273: if( rc!=SQLITE_OK ){
! 6274: goto balance_cleanup;
! 6275: }
! 6276: }
! 6277: }
! 6278: }
! 6279:
! 6280: /* Free any old pages that were not reused as new pages.
! 6281: */
! 6282: while( i<nOld ){
! 6283: freePage(apOld[i], &rc);
! 6284: if( rc ) goto balance_cleanup;
! 6285: releasePage(apOld[i]);
! 6286: apOld[i] = 0;
! 6287: i++;
! 6288: }
! 6289:
! 6290: /*
! 6291: ** Put the new pages in accending order. This helps to
! 6292: ** keep entries in the disk file in order so that a scan
! 6293: ** of the table is a linear scan through the file. That
! 6294: ** in turn helps the operating system to deliver pages
! 6295: ** from the disk more rapidly.
! 6296: **
! 6297: ** An O(n^2) insertion sort algorithm is used, but since
! 6298: ** n is never more than NB (a small constant), that should
! 6299: ** not be a problem.
! 6300: **
! 6301: ** When NB==3, this one optimization makes the database
! 6302: ** about 25% faster for large insertions and deletions.
! 6303: */
! 6304: for(i=0; i<k-1; i++){
! 6305: int minV = apNew[i]->pgno;
! 6306: int minI = i;
! 6307: for(j=i+1; j<k; j++){
! 6308: if( apNew[j]->pgno<(unsigned)minV ){
! 6309: minI = j;
! 6310: minV = apNew[j]->pgno;
! 6311: }
! 6312: }
! 6313: if( minI>i ){
! 6314: MemPage *pT;
! 6315: pT = apNew[i];
! 6316: apNew[i] = apNew[minI];
! 6317: apNew[minI] = pT;
! 6318: }
! 6319: }
! 6320: TRACE(("new: %d(%d) %d(%d) %d(%d) %d(%d) %d(%d)\n",
! 6321: apNew[0]->pgno, szNew[0],
! 6322: nNew>=2 ? apNew[1]->pgno : 0, nNew>=2 ? szNew[1] : 0,
! 6323: nNew>=3 ? apNew[2]->pgno : 0, nNew>=3 ? szNew[2] : 0,
! 6324: nNew>=4 ? apNew[3]->pgno : 0, nNew>=4 ? szNew[3] : 0,
! 6325: nNew>=5 ? apNew[4]->pgno : 0, nNew>=5 ? szNew[4] : 0));
! 6326:
! 6327: assert( sqlite3PagerIswriteable(pParent->pDbPage) );
! 6328: put4byte(pRight, apNew[nNew-1]->pgno);
! 6329:
! 6330: /*
! 6331: ** Evenly distribute the data in apCell[] across the new pages.
! 6332: ** Insert divider cells into pParent as necessary.
! 6333: */
! 6334: j = 0;
! 6335: for(i=0; i<nNew; i++){
! 6336: /* Assemble the new sibling page. */
! 6337: MemPage *pNew = apNew[i];
! 6338: assert( j<nMaxCells );
! 6339: zeroPage(pNew, pageFlags);
! 6340: assemblePage(pNew, cntNew[i]-j, &apCell[j], &szCell[j]);
! 6341: assert( pNew->nCell>0 || (nNew==1 && cntNew[0]==0) );
! 6342: assert( pNew->nOverflow==0 );
! 6343:
! 6344: j = cntNew[i];
! 6345:
! 6346: /* If the sibling page assembled above was not the right-most sibling,
! 6347: ** insert a divider cell into the parent page.
! 6348: */
! 6349: assert( i<nNew-1 || j==nCell );
! 6350: if( j<nCell ){
! 6351: u8 *pCell;
! 6352: u8 *pTemp;
! 6353: int sz;
! 6354:
! 6355: assert( j<nMaxCells );
! 6356: pCell = apCell[j];
! 6357: sz = szCell[j] + leafCorrection;
! 6358: pTemp = &aOvflSpace[iOvflSpace];
! 6359: if( !pNew->leaf ){
! 6360: memcpy(&pNew->aData[8], pCell, 4);
! 6361: }else if( leafData ){
! 6362: /* If the tree is a leaf-data tree, and the siblings are leaves,
! 6363: ** then there is no divider cell in apCell[]. Instead, the divider
! 6364: ** cell consists of the integer key for the right-most cell of
! 6365: ** the sibling-page assembled above only.
! 6366: */
! 6367: CellInfo info;
! 6368: j--;
! 6369: btreeParseCellPtr(pNew, apCell[j], &info);
! 6370: pCell = pTemp;
! 6371: sz = 4 + putVarint(&pCell[4], info.nKey);
! 6372: pTemp = 0;
! 6373: }else{
! 6374: pCell -= 4;
! 6375: /* Obscure case for non-leaf-data trees: If the cell at pCell was
! 6376: ** previously stored on a leaf node, and its reported size was 4
! 6377: ** bytes, then it may actually be smaller than this
! 6378: ** (see btreeParseCellPtr(), 4 bytes is the minimum size of
! 6379: ** any cell). But it is important to pass the correct size to
! 6380: ** insertCell(), so reparse the cell now.
! 6381: **
! 6382: ** Note that this can never happen in an SQLite data file, as all
! 6383: ** cells are at least 4 bytes. It only happens in b-trees used
! 6384: ** to evaluate "IN (SELECT ...)" and similar clauses.
! 6385: */
! 6386: if( szCell[j]==4 ){
! 6387: assert(leafCorrection==4);
! 6388: sz = cellSizePtr(pParent, pCell);
! 6389: }
! 6390: }
! 6391: iOvflSpace += sz;
! 6392: assert( sz<=pBt->maxLocal+23 );
! 6393: assert( iOvflSpace <= (int)pBt->pageSize );
! 6394: insertCell(pParent, nxDiv, pCell, sz, pTemp, pNew->pgno, &rc);
! 6395: if( rc!=SQLITE_OK ) goto balance_cleanup;
! 6396: assert( sqlite3PagerIswriteable(pParent->pDbPage) );
! 6397:
! 6398: j++;
! 6399: nxDiv++;
! 6400: }
! 6401: }
! 6402: assert( j==nCell );
! 6403: assert( nOld>0 );
! 6404: assert( nNew>0 );
! 6405: if( (pageFlags & PTF_LEAF)==0 ){
! 6406: u8 *zChild = &apCopy[nOld-1]->aData[8];
! 6407: memcpy(&apNew[nNew-1]->aData[8], zChild, 4);
! 6408: }
! 6409:
! 6410: if( isRoot && pParent->nCell==0 && pParent->hdrOffset<=apNew[0]->nFree ){
! 6411: /* The root page of the b-tree now contains no cells. The only sibling
! 6412: ** page is the right-child of the parent. Copy the contents of the
! 6413: ** child page into the parent, decreasing the overall height of the
! 6414: ** b-tree structure by one. This is described as the "balance-shallower"
! 6415: ** sub-algorithm in some documentation.
! 6416: **
! 6417: ** If this is an auto-vacuum database, the call to copyNodeContent()
! 6418: ** sets all pointer-map entries corresponding to database image pages
! 6419: ** for which the pointer is stored within the content being copied.
! 6420: **
! 6421: ** The second assert below verifies that the child page is defragmented
! 6422: ** (it must be, as it was just reconstructed using assemblePage()). This
! 6423: ** is important if the parent page happens to be page 1 of the database
! 6424: ** image. */
! 6425: assert( nNew==1 );
! 6426: assert( apNew[0]->nFree ==
! 6427: (get2byte(&apNew[0]->aData[5])-apNew[0]->cellOffset-apNew[0]->nCell*2)
! 6428: );
! 6429: copyNodeContent(apNew[0], pParent, &rc);
! 6430: freePage(apNew[0], &rc);
! 6431: }else if( ISAUTOVACUUM ){
! 6432: /* Fix the pointer-map entries for all the cells that were shifted around.
! 6433: ** There are several different types of pointer-map entries that need to
! 6434: ** be dealt with by this routine. Some of these have been set already, but
! 6435: ** many have not. The following is a summary:
! 6436: **
! 6437: ** 1) The entries associated with new sibling pages that were not
! 6438: ** siblings when this function was called. These have already
! 6439: ** been set. We don't need to worry about old siblings that were
! 6440: ** moved to the free-list - the freePage() code has taken care
! 6441: ** of those.
! 6442: **
! 6443: ** 2) The pointer-map entries associated with the first overflow
! 6444: ** page in any overflow chains used by new divider cells. These
! 6445: ** have also already been taken care of by the insertCell() code.
! 6446: **
! 6447: ** 3) If the sibling pages are not leaves, then the child pages of
! 6448: ** cells stored on the sibling pages may need to be updated.
! 6449: **
! 6450: ** 4) If the sibling pages are not internal intkey nodes, then any
! 6451: ** overflow pages used by these cells may need to be updated
! 6452: ** (internal intkey nodes never contain pointers to overflow pages).
! 6453: **
! 6454: ** 5) If the sibling pages are not leaves, then the pointer-map
! 6455: ** entries for the right-child pages of each sibling may need
! 6456: ** to be updated.
! 6457: **
! 6458: ** Cases 1 and 2 are dealt with above by other code. The next
! 6459: ** block deals with cases 3 and 4 and the one after that, case 5. Since
! 6460: ** setting a pointer map entry is a relatively expensive operation, this
! 6461: ** code only sets pointer map entries for child or overflow pages that have
! 6462: ** actually moved between pages. */
! 6463: MemPage *pNew = apNew[0];
! 6464: MemPage *pOld = apCopy[0];
! 6465: int nOverflow = pOld->nOverflow;
! 6466: int iNextOld = pOld->nCell + nOverflow;
! 6467: int iOverflow = (nOverflow ? pOld->aOvfl[0].idx : -1);
! 6468: j = 0; /* Current 'old' sibling page */
! 6469: k = 0; /* Current 'new' sibling page */
! 6470: for(i=0; i<nCell; i++){
! 6471: int isDivider = 0;
! 6472: while( i==iNextOld ){
! 6473: /* Cell i is the cell immediately following the last cell on old
! 6474: ** sibling page j. If the siblings are not leaf pages of an
! 6475: ** intkey b-tree, then cell i was a divider cell. */
! 6476: assert( j+1 < ArraySize(apCopy) );
! 6477: pOld = apCopy[++j];
! 6478: iNextOld = i + !leafData + pOld->nCell + pOld->nOverflow;
! 6479: if( pOld->nOverflow ){
! 6480: nOverflow = pOld->nOverflow;
! 6481: iOverflow = i + !leafData + pOld->aOvfl[0].idx;
! 6482: }
! 6483: isDivider = !leafData;
! 6484: }
! 6485:
! 6486: assert(nOverflow>0 || iOverflow<i );
! 6487: assert(nOverflow<2 || pOld->aOvfl[0].idx==pOld->aOvfl[1].idx-1);
! 6488: assert(nOverflow<3 || pOld->aOvfl[1].idx==pOld->aOvfl[2].idx-1);
! 6489: if( i==iOverflow ){
! 6490: isDivider = 1;
! 6491: if( (--nOverflow)>0 ){
! 6492: iOverflow++;
! 6493: }
! 6494: }
! 6495:
! 6496: if( i==cntNew[k] ){
! 6497: /* Cell i is the cell immediately following the last cell on new
! 6498: ** sibling page k. If the siblings are not leaf pages of an
! 6499: ** intkey b-tree, then cell i is a divider cell. */
! 6500: pNew = apNew[++k];
! 6501: if( !leafData ) continue;
! 6502: }
! 6503: assert( j<nOld );
! 6504: assert( k<nNew );
! 6505:
! 6506: /* If the cell was originally divider cell (and is not now) or
! 6507: ** an overflow cell, or if the cell was located on a different sibling
! 6508: ** page before the balancing, then the pointer map entries associated
! 6509: ** with any child or overflow pages need to be updated. */
! 6510: if( isDivider || pOld->pgno!=pNew->pgno ){
! 6511: if( !leafCorrection ){
! 6512: ptrmapPut(pBt, get4byte(apCell[i]), PTRMAP_BTREE, pNew->pgno, &rc);
! 6513: }
! 6514: if( szCell[i]>pNew->minLocal ){
! 6515: ptrmapPutOvflPtr(pNew, apCell[i], &rc);
! 6516: }
! 6517: }
! 6518: }
! 6519:
! 6520: if( !leafCorrection ){
! 6521: for(i=0; i<nNew; i++){
! 6522: u32 key = get4byte(&apNew[i]->aData[8]);
! 6523: ptrmapPut(pBt, key, PTRMAP_BTREE, apNew[i]->pgno, &rc);
! 6524: }
! 6525: }
! 6526:
! 6527: #if 0
! 6528: /* The ptrmapCheckPages() contains assert() statements that verify that
! 6529: ** all pointer map pages are set correctly. This is helpful while
! 6530: ** debugging. This is usually disabled because a corrupt database may
! 6531: ** cause an assert() statement to fail. */
! 6532: ptrmapCheckPages(apNew, nNew);
! 6533: ptrmapCheckPages(&pParent, 1);
! 6534: #endif
! 6535: }
! 6536:
! 6537: assert( pParent->isInit );
! 6538: TRACE(("BALANCE: finished: old=%d new=%d cells=%d\n",
! 6539: nOld, nNew, nCell));
! 6540:
! 6541: /*
! 6542: ** Cleanup before returning.
! 6543: */
! 6544: balance_cleanup:
! 6545: sqlite3ScratchFree(apCell);
! 6546: for(i=0; i<nOld; i++){
! 6547: releasePage(apOld[i]);
! 6548: }
! 6549: for(i=0; i<nNew; i++){
! 6550: releasePage(apNew[i]);
! 6551: }
! 6552:
! 6553: return rc;
! 6554: }
! 6555:
! 6556:
! 6557: /*
! 6558: ** This function is called when the root page of a b-tree structure is
! 6559: ** overfull (has one or more overflow pages).
! 6560: **
! 6561: ** A new child page is allocated and the contents of the current root
! 6562: ** page, including overflow cells, are copied into the child. The root
! 6563: ** page is then overwritten to make it an empty page with the right-child
! 6564: ** pointer pointing to the new page.
! 6565: **
! 6566: ** Before returning, all pointer-map entries corresponding to pages
! 6567: ** that the new child-page now contains pointers to are updated. The
! 6568: ** entry corresponding to the new right-child pointer of the root
! 6569: ** page is also updated.
! 6570: **
! 6571: ** If successful, *ppChild is set to contain a reference to the child
! 6572: ** page and SQLITE_OK is returned. In this case the caller is required
! 6573: ** to call releasePage() on *ppChild exactly once. If an error occurs,
! 6574: ** an error code is returned and *ppChild is set to 0.
! 6575: */
! 6576: static int balance_deeper(MemPage *pRoot, MemPage **ppChild){
! 6577: int rc; /* Return value from subprocedures */
! 6578: MemPage *pChild = 0; /* Pointer to a new child page */
! 6579: Pgno pgnoChild = 0; /* Page number of the new child page */
! 6580: BtShared *pBt = pRoot->pBt; /* The BTree */
! 6581:
! 6582: assert( pRoot->nOverflow>0 );
! 6583: assert( sqlite3_mutex_held(pBt->mutex) );
! 6584:
! 6585: /* Make pRoot, the root page of the b-tree, writable. Allocate a new
! 6586: ** page that will become the new right-child of pPage. Copy the contents
! 6587: ** of the node stored on pRoot into the new child page.
! 6588: */
! 6589: rc = sqlite3PagerWrite(pRoot->pDbPage);
! 6590: if( rc==SQLITE_OK ){
! 6591: rc = allocateBtreePage(pBt,&pChild,&pgnoChild,pRoot->pgno,0);
! 6592: copyNodeContent(pRoot, pChild, &rc);
! 6593: if( ISAUTOVACUUM ){
! 6594: ptrmapPut(pBt, pgnoChild, PTRMAP_BTREE, pRoot->pgno, &rc);
! 6595: }
! 6596: }
! 6597: if( rc ){
! 6598: *ppChild = 0;
! 6599: releasePage(pChild);
! 6600: return rc;
! 6601: }
! 6602: assert( sqlite3PagerIswriteable(pChild->pDbPage) );
! 6603: assert( sqlite3PagerIswriteable(pRoot->pDbPage) );
! 6604: assert( pChild->nCell==pRoot->nCell );
! 6605:
! 6606: TRACE(("BALANCE: copy root %d into %d\n", pRoot->pgno, pChild->pgno));
! 6607:
! 6608: /* Copy the overflow cells from pRoot to pChild */
! 6609: memcpy(pChild->aOvfl, pRoot->aOvfl, pRoot->nOverflow*sizeof(pRoot->aOvfl[0]));
! 6610: pChild->nOverflow = pRoot->nOverflow;
! 6611:
! 6612: /* Zero the contents of pRoot. Then install pChild as the right-child. */
! 6613: zeroPage(pRoot, pChild->aData[0] & ~PTF_LEAF);
! 6614: put4byte(&pRoot->aData[pRoot->hdrOffset+8], pgnoChild);
! 6615:
! 6616: *ppChild = pChild;
! 6617: return SQLITE_OK;
! 6618: }
! 6619:
! 6620: /*
! 6621: ** The page that pCur currently points to has just been modified in
! 6622: ** some way. This function figures out if this modification means the
! 6623: ** tree needs to be balanced, and if so calls the appropriate balancing
! 6624: ** routine. Balancing routines are:
! 6625: **
! 6626: ** balance_quick()
! 6627: ** balance_deeper()
! 6628: ** balance_nonroot()
! 6629: */
! 6630: static int balance(BtCursor *pCur){
! 6631: int rc = SQLITE_OK;
! 6632: const int nMin = pCur->pBt->usableSize * 2 / 3;
! 6633: u8 aBalanceQuickSpace[13];
! 6634: u8 *pFree = 0;
! 6635:
! 6636: TESTONLY( int balance_quick_called = 0 );
! 6637: TESTONLY( int balance_deeper_called = 0 );
! 6638:
! 6639: do {
! 6640: int iPage = pCur->iPage;
! 6641: MemPage *pPage = pCur->apPage[iPage];
! 6642:
! 6643: if( iPage==0 ){
! 6644: if( pPage->nOverflow ){
! 6645: /* The root page of the b-tree is overfull. In this case call the
! 6646: ** balance_deeper() function to create a new child for the root-page
! 6647: ** and copy the current contents of the root-page to it. The
! 6648: ** next iteration of the do-loop will balance the child page.
! 6649: */
! 6650: assert( (balance_deeper_called++)==0 );
! 6651: rc = balance_deeper(pPage, &pCur->apPage[1]);
! 6652: if( rc==SQLITE_OK ){
! 6653: pCur->iPage = 1;
! 6654: pCur->aiIdx[0] = 0;
! 6655: pCur->aiIdx[1] = 0;
! 6656: assert( pCur->apPage[1]->nOverflow );
! 6657: }
! 6658: }else{
! 6659: break;
! 6660: }
! 6661: }else if( pPage->nOverflow==0 && pPage->nFree<=nMin ){
! 6662: break;
! 6663: }else{
! 6664: MemPage * const pParent = pCur->apPage[iPage-1];
! 6665: int const iIdx = pCur->aiIdx[iPage-1];
! 6666:
! 6667: rc = sqlite3PagerWrite(pParent->pDbPage);
! 6668: if( rc==SQLITE_OK ){
! 6669: #ifndef SQLITE_OMIT_QUICKBALANCE
! 6670: if( pPage->hasData
! 6671: && pPage->nOverflow==1
! 6672: && pPage->aOvfl[0].idx==pPage->nCell
! 6673: && pParent->pgno!=1
! 6674: && pParent->nCell==iIdx
! 6675: ){
! 6676: /* Call balance_quick() to create a new sibling of pPage on which
! 6677: ** to store the overflow cell. balance_quick() inserts a new cell
! 6678: ** into pParent, which may cause pParent overflow. If this
! 6679: ** happens, the next interation of the do-loop will balance pParent
! 6680: ** use either balance_nonroot() or balance_deeper(). Until this
! 6681: ** happens, the overflow cell is stored in the aBalanceQuickSpace[]
! 6682: ** buffer.
! 6683: **
! 6684: ** The purpose of the following assert() is to check that only a
! 6685: ** single call to balance_quick() is made for each call to this
! 6686: ** function. If this were not verified, a subtle bug involving reuse
! 6687: ** of the aBalanceQuickSpace[] might sneak in.
! 6688: */
! 6689: assert( (balance_quick_called++)==0 );
! 6690: rc = balance_quick(pParent, pPage, aBalanceQuickSpace);
! 6691: }else
! 6692: #endif
! 6693: {
! 6694: /* In this case, call balance_nonroot() to redistribute cells
! 6695: ** between pPage and up to 2 of its sibling pages. This involves
! 6696: ** modifying the contents of pParent, which may cause pParent to
! 6697: ** become overfull or underfull. The next iteration of the do-loop
! 6698: ** will balance the parent page to correct this.
! 6699: **
! 6700: ** If the parent page becomes overfull, the overflow cell or cells
! 6701: ** are stored in the pSpace buffer allocated immediately below.
! 6702: ** A subsequent iteration of the do-loop will deal with this by
! 6703: ** calling balance_nonroot() (balance_deeper() may be called first,
! 6704: ** but it doesn't deal with overflow cells - just moves them to a
! 6705: ** different page). Once this subsequent call to balance_nonroot()
! 6706: ** has completed, it is safe to release the pSpace buffer used by
! 6707: ** the previous call, as the overflow cell data will have been
! 6708: ** copied either into the body of a database page or into the new
! 6709: ** pSpace buffer passed to the latter call to balance_nonroot().
! 6710: */
! 6711: u8 *pSpace = sqlite3PageMalloc(pCur->pBt->pageSize);
! 6712: rc = balance_nonroot(pParent, iIdx, pSpace, iPage==1);
! 6713: if( pFree ){
! 6714: /* If pFree is not NULL, it points to the pSpace buffer used
! 6715: ** by a previous call to balance_nonroot(). Its contents are
! 6716: ** now stored either on real database pages or within the
! 6717: ** new pSpace buffer, so it may be safely freed here. */
! 6718: sqlite3PageFree(pFree);
! 6719: }
! 6720:
! 6721: /* The pSpace buffer will be freed after the next call to
! 6722: ** balance_nonroot(), or just before this function returns, whichever
! 6723: ** comes first. */
! 6724: pFree = pSpace;
! 6725: }
! 6726: }
! 6727:
! 6728: pPage->nOverflow = 0;
! 6729:
! 6730: /* The next iteration of the do-loop balances the parent page. */
! 6731: releasePage(pPage);
! 6732: pCur->iPage--;
! 6733: }
! 6734: }while( rc==SQLITE_OK );
! 6735:
! 6736: if( pFree ){
! 6737: sqlite3PageFree(pFree);
! 6738: }
! 6739: return rc;
! 6740: }
! 6741:
! 6742:
! 6743: /*
! 6744: ** Insert a new record into the BTree. The key is given by (pKey,nKey)
! 6745: ** and the data is given by (pData,nData). The cursor is used only to
! 6746: ** define what table the record should be inserted into. The cursor
! 6747: ** is left pointing at a random location.
! 6748: **
! 6749: ** For an INTKEY table, only the nKey value of the key is used. pKey is
! 6750: ** ignored. For a ZERODATA table, the pData and nData are both ignored.
! 6751: **
! 6752: ** If the seekResult parameter is non-zero, then a successful call to
! 6753: ** MovetoUnpacked() to seek cursor pCur to (pKey, nKey) has already
! 6754: ** been performed. seekResult is the search result returned (a negative
! 6755: ** number if pCur points at an entry that is smaller than (pKey, nKey), or
! 6756: ** a positive value if pCur points at an etry that is larger than
! 6757: ** (pKey, nKey)).
! 6758: **
! 6759: ** If the seekResult parameter is non-zero, then the caller guarantees that
! 6760: ** cursor pCur is pointing at the existing copy of a row that is to be
! 6761: ** overwritten. If the seekResult parameter is 0, then cursor pCur may
! 6762: ** point to any entry or to no entry at all and so this function has to seek
! 6763: ** the cursor before the new key can be inserted.
! 6764: */
! 6765: int sqlite3BtreeInsert(
! 6766: BtCursor *pCur, /* Insert data into the table of this cursor */
! 6767: const void *pKey, i64 nKey, /* The key of the new record */
! 6768: const void *pData, int nData, /* The data of the new record */
! 6769: int nZero, /* Number of extra 0 bytes to append to data */
! 6770: int appendBias, /* True if this is likely an append */
! 6771: int seekResult /* Result of prior MovetoUnpacked() call */
! 6772: ){
! 6773: int rc;
! 6774: int loc = seekResult; /* -1: before desired location +1: after */
! 6775: int szNew = 0;
! 6776: int idx;
! 6777: MemPage *pPage;
! 6778: Btree *p = pCur->pBtree;
! 6779: BtShared *pBt = p->pBt;
! 6780: unsigned char *oldCell;
! 6781: unsigned char *newCell = 0;
! 6782:
! 6783: if( pCur->eState==CURSOR_FAULT ){
! 6784: assert( pCur->skipNext!=SQLITE_OK );
! 6785: return pCur->skipNext;
! 6786: }
! 6787:
! 6788: assert( cursorHoldsMutex(pCur) );
! 6789: assert( pCur->wrFlag && pBt->inTransaction==TRANS_WRITE
! 6790: && (pBt->btsFlags & BTS_READ_ONLY)==0 );
! 6791: assert( hasSharedCacheTableLock(p, pCur->pgnoRoot, pCur->pKeyInfo!=0, 2) );
! 6792:
! 6793: /* Assert that the caller has been consistent. If this cursor was opened
! 6794: ** expecting an index b-tree, then the caller should be inserting blob
! 6795: ** keys with no associated data. If the cursor was opened expecting an
! 6796: ** intkey table, the caller should be inserting integer keys with a
! 6797: ** blob of associated data. */
! 6798: assert( (pKey==0)==(pCur->pKeyInfo==0) );
! 6799:
! 6800: /* If this is an insert into a table b-tree, invalidate any incrblob
! 6801: ** cursors open on the row being replaced (assuming this is a replace
! 6802: ** operation - if it is not, the following is a no-op). */
! 6803: if( pCur->pKeyInfo==0 ){
! 6804: invalidateIncrblobCursors(p, nKey, 0);
! 6805: }
! 6806:
! 6807: /* Save the positions of any other cursors open on this table.
! 6808: **
! 6809: ** In some cases, the call to btreeMoveto() below is a no-op. For
! 6810: ** example, when inserting data into a table with auto-generated integer
! 6811: ** keys, the VDBE layer invokes sqlite3BtreeLast() to figure out the
! 6812: ** integer key to use. It then calls this function to actually insert the
! 6813: ** data into the intkey B-Tree. In this case btreeMoveto() recognizes
! 6814: ** that the cursor is already where it needs to be and returns without
! 6815: ** doing any work. To avoid thwarting these optimizations, it is important
! 6816: ** not to clear the cursor here.
! 6817: */
! 6818: rc = saveAllCursors(pBt, pCur->pgnoRoot, pCur);
! 6819: if( rc ) return rc;
! 6820: if( !loc ){
! 6821: rc = btreeMoveto(pCur, pKey, nKey, appendBias, &loc);
! 6822: if( rc ) return rc;
! 6823: }
! 6824: assert( pCur->eState==CURSOR_VALID || (pCur->eState==CURSOR_INVALID && loc) );
! 6825:
! 6826: pPage = pCur->apPage[pCur->iPage];
! 6827: assert( pPage->intKey || nKey>=0 );
! 6828: assert( pPage->leaf || !pPage->intKey );
! 6829:
! 6830: TRACE(("INSERT: table=%d nkey=%lld ndata=%d page=%d %s\n",
! 6831: pCur->pgnoRoot, nKey, nData, pPage->pgno,
! 6832: loc==0 ? "overwrite" : "new entry"));
! 6833: assert( pPage->isInit );
! 6834: allocateTempSpace(pBt);
! 6835: newCell = pBt->pTmpSpace;
! 6836: if( newCell==0 ) return SQLITE_NOMEM;
! 6837: rc = fillInCell(pPage, newCell, pKey, nKey, pData, nData, nZero, &szNew);
! 6838: if( rc ) goto end_insert;
! 6839: assert( szNew==cellSizePtr(pPage, newCell) );
! 6840: assert( szNew <= MX_CELL_SIZE(pBt) );
! 6841: idx = pCur->aiIdx[pCur->iPage];
! 6842: if( loc==0 ){
! 6843: u16 szOld;
! 6844: assert( idx<pPage->nCell );
! 6845: rc = sqlite3PagerWrite(pPage->pDbPage);
! 6846: if( rc ){
! 6847: goto end_insert;
! 6848: }
! 6849: oldCell = findCell(pPage, idx);
! 6850: if( !pPage->leaf ){
! 6851: memcpy(newCell, oldCell, 4);
! 6852: }
! 6853: szOld = cellSizePtr(pPage, oldCell);
! 6854: rc = clearCell(pPage, oldCell);
! 6855: dropCell(pPage, idx, szOld, &rc);
! 6856: if( rc ) goto end_insert;
! 6857: }else if( loc<0 && pPage->nCell>0 ){
! 6858: assert( pPage->leaf );
! 6859: idx = ++pCur->aiIdx[pCur->iPage];
! 6860: }else{
! 6861: assert( pPage->leaf );
! 6862: }
! 6863: insertCell(pPage, idx, newCell, szNew, 0, 0, &rc);
! 6864: assert( rc!=SQLITE_OK || pPage->nCell>0 || pPage->nOverflow>0 );
! 6865:
! 6866: /* If no error has occured and pPage has an overflow cell, call balance()
! 6867: ** to redistribute the cells within the tree. Since balance() may move
! 6868: ** the cursor, zero the BtCursor.info.nSize and BtCursor.validNKey
! 6869: ** variables.
! 6870: **
! 6871: ** Previous versions of SQLite called moveToRoot() to move the cursor
! 6872: ** back to the root page as balance() used to invalidate the contents
! 6873: ** of BtCursor.apPage[] and BtCursor.aiIdx[]. Instead of doing that,
! 6874: ** set the cursor state to "invalid". This makes common insert operations
! 6875: ** slightly faster.
! 6876: **
! 6877: ** There is a subtle but important optimization here too. When inserting
! 6878: ** multiple records into an intkey b-tree using a single cursor (as can
! 6879: ** happen while processing an "INSERT INTO ... SELECT" statement), it
! 6880: ** is advantageous to leave the cursor pointing to the last entry in
! 6881: ** the b-tree if possible. If the cursor is left pointing to the last
! 6882: ** entry in the table, and the next row inserted has an integer key
! 6883: ** larger than the largest existing key, it is possible to insert the
! 6884: ** row without seeking the cursor. This can be a big performance boost.
! 6885: */
! 6886: pCur->info.nSize = 0;
! 6887: pCur->validNKey = 0;
! 6888: if( rc==SQLITE_OK && pPage->nOverflow ){
! 6889: rc = balance(pCur);
! 6890:
! 6891: /* Must make sure nOverflow is reset to zero even if the balance()
! 6892: ** fails. Internal data structure corruption will result otherwise.
! 6893: ** Also, set the cursor state to invalid. This stops saveCursorPosition()
! 6894: ** from trying to save the current position of the cursor. */
! 6895: pCur->apPage[pCur->iPage]->nOverflow = 0;
! 6896: pCur->eState = CURSOR_INVALID;
! 6897: }
! 6898: assert( pCur->apPage[pCur->iPage]->nOverflow==0 );
! 6899:
! 6900: end_insert:
! 6901: return rc;
! 6902: }
! 6903:
! 6904: /*
! 6905: ** Delete the entry that the cursor is pointing to. The cursor
! 6906: ** is left pointing at a arbitrary location.
! 6907: */
! 6908: int sqlite3BtreeDelete(BtCursor *pCur){
! 6909: Btree *p = pCur->pBtree;
! 6910: BtShared *pBt = p->pBt;
! 6911: int rc; /* Return code */
! 6912: MemPage *pPage; /* Page to delete cell from */
! 6913: unsigned char *pCell; /* Pointer to cell to delete */
! 6914: int iCellIdx; /* Index of cell to delete */
! 6915: int iCellDepth; /* Depth of node containing pCell */
! 6916:
! 6917: assert( cursorHoldsMutex(pCur) );
! 6918: assert( pBt->inTransaction==TRANS_WRITE );
! 6919: assert( (pBt->btsFlags & BTS_READ_ONLY)==0 );
! 6920: assert( pCur->wrFlag );
! 6921: assert( hasSharedCacheTableLock(p, pCur->pgnoRoot, pCur->pKeyInfo!=0, 2) );
! 6922: assert( !hasReadConflicts(p, pCur->pgnoRoot) );
! 6923:
! 6924: if( NEVER(pCur->aiIdx[pCur->iPage]>=pCur->apPage[pCur->iPage]->nCell)
! 6925: || NEVER(pCur->eState!=CURSOR_VALID)
! 6926: ){
! 6927: return SQLITE_ERROR; /* Something has gone awry. */
! 6928: }
! 6929:
! 6930: /* If this is a delete operation to remove a row from a table b-tree,
! 6931: ** invalidate any incrblob cursors open on the row being deleted. */
! 6932: if( pCur->pKeyInfo==0 ){
! 6933: invalidateIncrblobCursors(p, pCur->info.nKey, 0);
! 6934: }
! 6935:
! 6936: iCellDepth = pCur->iPage;
! 6937: iCellIdx = pCur->aiIdx[iCellDepth];
! 6938: pPage = pCur->apPage[iCellDepth];
! 6939: pCell = findCell(pPage, iCellIdx);
! 6940:
! 6941: /* If the page containing the entry to delete is not a leaf page, move
! 6942: ** the cursor to the largest entry in the tree that is smaller than
! 6943: ** the entry being deleted. This cell will replace the cell being deleted
! 6944: ** from the internal node. The 'previous' entry is used for this instead
! 6945: ** of the 'next' entry, as the previous entry is always a part of the
! 6946: ** sub-tree headed by the child page of the cell being deleted. This makes
! 6947: ** balancing the tree following the delete operation easier. */
! 6948: if( !pPage->leaf ){
! 6949: int notUsed;
! 6950: rc = sqlite3BtreePrevious(pCur, ¬Used);
! 6951: if( rc ) return rc;
! 6952: }
! 6953:
! 6954: /* Save the positions of any other cursors open on this table before
! 6955: ** making any modifications. Make the page containing the entry to be
! 6956: ** deleted writable. Then free any overflow pages associated with the
! 6957: ** entry and finally remove the cell itself from within the page.
! 6958: */
! 6959: rc = saveAllCursors(pBt, pCur->pgnoRoot, pCur);
! 6960: if( rc ) return rc;
! 6961: rc = sqlite3PagerWrite(pPage->pDbPage);
! 6962: if( rc ) return rc;
! 6963: rc = clearCell(pPage, pCell);
! 6964: dropCell(pPage, iCellIdx, cellSizePtr(pPage, pCell), &rc);
! 6965: if( rc ) return rc;
! 6966:
! 6967: /* If the cell deleted was not located on a leaf page, then the cursor
! 6968: ** is currently pointing to the largest entry in the sub-tree headed
! 6969: ** by the child-page of the cell that was just deleted from an internal
! 6970: ** node. The cell from the leaf node needs to be moved to the internal
! 6971: ** node to replace the deleted cell. */
! 6972: if( !pPage->leaf ){
! 6973: MemPage *pLeaf = pCur->apPage[pCur->iPage];
! 6974: int nCell;
! 6975: Pgno n = pCur->apPage[iCellDepth+1]->pgno;
! 6976: unsigned char *pTmp;
! 6977:
! 6978: pCell = findCell(pLeaf, pLeaf->nCell-1);
! 6979: nCell = cellSizePtr(pLeaf, pCell);
! 6980: assert( MX_CELL_SIZE(pBt) >= nCell );
! 6981:
! 6982: allocateTempSpace(pBt);
! 6983: pTmp = pBt->pTmpSpace;
! 6984:
! 6985: rc = sqlite3PagerWrite(pLeaf->pDbPage);
! 6986: insertCell(pPage, iCellIdx, pCell-4, nCell+4, pTmp, n, &rc);
! 6987: dropCell(pLeaf, pLeaf->nCell-1, nCell, &rc);
! 6988: if( rc ) return rc;
! 6989: }
! 6990:
! 6991: /* Balance the tree. If the entry deleted was located on a leaf page,
! 6992: ** then the cursor still points to that page. In this case the first
! 6993: ** call to balance() repairs the tree, and the if(...) condition is
! 6994: ** never true.
! 6995: **
! 6996: ** Otherwise, if the entry deleted was on an internal node page, then
! 6997: ** pCur is pointing to the leaf page from which a cell was removed to
! 6998: ** replace the cell deleted from the internal node. This is slightly
! 6999: ** tricky as the leaf node may be underfull, and the internal node may
! 7000: ** be either under or overfull. In this case run the balancing algorithm
! 7001: ** on the leaf node first. If the balance proceeds far enough up the
! 7002: ** tree that we can be sure that any problem in the internal node has
! 7003: ** been corrected, so be it. Otherwise, after balancing the leaf node,
! 7004: ** walk the cursor up the tree to the internal node and balance it as
! 7005: ** well. */
! 7006: rc = balance(pCur);
! 7007: if( rc==SQLITE_OK && pCur->iPage>iCellDepth ){
! 7008: while( pCur->iPage>iCellDepth ){
! 7009: releasePage(pCur->apPage[pCur->iPage--]);
! 7010: }
! 7011: rc = balance(pCur);
! 7012: }
! 7013:
! 7014: if( rc==SQLITE_OK ){
! 7015: moveToRoot(pCur);
! 7016: }
! 7017: return rc;
! 7018: }
! 7019:
! 7020: /*
! 7021: ** Create a new BTree table. Write into *piTable the page
! 7022: ** number for the root page of the new table.
! 7023: **
! 7024: ** The type of type is determined by the flags parameter. Only the
! 7025: ** following values of flags are currently in use. Other values for
! 7026: ** flags might not work:
! 7027: **
! 7028: ** BTREE_INTKEY|BTREE_LEAFDATA Used for SQL tables with rowid keys
! 7029: ** BTREE_ZERODATA Used for SQL indices
! 7030: */
! 7031: static int btreeCreateTable(Btree *p, int *piTable, int createTabFlags){
! 7032: BtShared *pBt = p->pBt;
! 7033: MemPage *pRoot;
! 7034: Pgno pgnoRoot;
! 7035: int rc;
! 7036: int ptfFlags; /* Page-type flage for the root page of new table */
! 7037:
! 7038: assert( sqlite3BtreeHoldsMutex(p) );
! 7039: assert( pBt->inTransaction==TRANS_WRITE );
! 7040: assert( (pBt->btsFlags & BTS_READ_ONLY)==0 );
! 7041:
! 7042: #ifdef SQLITE_OMIT_AUTOVACUUM
! 7043: rc = allocateBtreePage(pBt, &pRoot, &pgnoRoot, 1, 0);
! 7044: if( rc ){
! 7045: return rc;
! 7046: }
! 7047: #else
! 7048: if( pBt->autoVacuum ){
! 7049: Pgno pgnoMove; /* Move a page here to make room for the root-page */
! 7050: MemPage *pPageMove; /* The page to move to. */
! 7051:
! 7052: /* Creating a new table may probably require moving an existing database
! 7053: ** to make room for the new tables root page. In case this page turns
! 7054: ** out to be an overflow page, delete all overflow page-map caches
! 7055: ** held by open cursors.
! 7056: */
! 7057: invalidateAllOverflowCache(pBt);
! 7058:
! 7059: /* Read the value of meta[3] from the database to determine where the
! 7060: ** root page of the new table should go. meta[3] is the largest root-page
! 7061: ** created so far, so the new root-page is (meta[3]+1).
! 7062: */
! 7063: sqlite3BtreeGetMeta(p, BTREE_LARGEST_ROOT_PAGE, &pgnoRoot);
! 7064: pgnoRoot++;
! 7065:
! 7066: /* The new root-page may not be allocated on a pointer-map page, or the
! 7067: ** PENDING_BYTE page.
! 7068: */
! 7069: while( pgnoRoot==PTRMAP_PAGENO(pBt, pgnoRoot) ||
! 7070: pgnoRoot==PENDING_BYTE_PAGE(pBt) ){
! 7071: pgnoRoot++;
! 7072: }
! 7073: assert( pgnoRoot>=3 );
! 7074:
! 7075: /* Allocate a page. The page that currently resides at pgnoRoot will
! 7076: ** be moved to the allocated page (unless the allocated page happens
! 7077: ** to reside at pgnoRoot).
! 7078: */
! 7079: rc = allocateBtreePage(pBt, &pPageMove, &pgnoMove, pgnoRoot, 1);
! 7080: if( rc!=SQLITE_OK ){
! 7081: return rc;
! 7082: }
! 7083:
! 7084: if( pgnoMove!=pgnoRoot ){
! 7085: /* pgnoRoot is the page that will be used for the root-page of
! 7086: ** the new table (assuming an error did not occur). But we were
! 7087: ** allocated pgnoMove. If required (i.e. if it was not allocated
! 7088: ** by extending the file), the current page at position pgnoMove
! 7089: ** is already journaled.
! 7090: */
! 7091: u8 eType = 0;
! 7092: Pgno iPtrPage = 0;
! 7093:
! 7094: releasePage(pPageMove);
! 7095:
! 7096: /* Move the page currently at pgnoRoot to pgnoMove. */
! 7097: rc = btreeGetPage(pBt, pgnoRoot, &pRoot, 0);
! 7098: if( rc!=SQLITE_OK ){
! 7099: return rc;
! 7100: }
! 7101: rc = ptrmapGet(pBt, pgnoRoot, &eType, &iPtrPage);
! 7102: if( eType==PTRMAP_ROOTPAGE || eType==PTRMAP_FREEPAGE ){
! 7103: rc = SQLITE_CORRUPT_BKPT;
! 7104: }
! 7105: if( rc!=SQLITE_OK ){
! 7106: releasePage(pRoot);
! 7107: return rc;
! 7108: }
! 7109: assert( eType!=PTRMAP_ROOTPAGE );
! 7110: assert( eType!=PTRMAP_FREEPAGE );
! 7111: rc = relocatePage(pBt, pRoot, eType, iPtrPage, pgnoMove, 0);
! 7112: releasePage(pRoot);
! 7113:
! 7114: /* Obtain the page at pgnoRoot */
! 7115: if( rc!=SQLITE_OK ){
! 7116: return rc;
! 7117: }
! 7118: rc = btreeGetPage(pBt, pgnoRoot, &pRoot, 0);
! 7119: if( rc!=SQLITE_OK ){
! 7120: return rc;
! 7121: }
! 7122: rc = sqlite3PagerWrite(pRoot->pDbPage);
! 7123: if( rc!=SQLITE_OK ){
! 7124: releasePage(pRoot);
! 7125: return rc;
! 7126: }
! 7127: }else{
! 7128: pRoot = pPageMove;
! 7129: }
! 7130:
! 7131: /* Update the pointer-map and meta-data with the new root-page number. */
! 7132: ptrmapPut(pBt, pgnoRoot, PTRMAP_ROOTPAGE, 0, &rc);
! 7133: if( rc ){
! 7134: releasePage(pRoot);
! 7135: return rc;
! 7136: }
! 7137:
! 7138: /* When the new root page was allocated, page 1 was made writable in
! 7139: ** order either to increase the database filesize, or to decrement the
! 7140: ** freelist count. Hence, the sqlite3BtreeUpdateMeta() call cannot fail.
! 7141: */
! 7142: assert( sqlite3PagerIswriteable(pBt->pPage1->pDbPage) );
! 7143: rc = sqlite3BtreeUpdateMeta(p, 4, pgnoRoot);
! 7144: if( NEVER(rc) ){
! 7145: releasePage(pRoot);
! 7146: return rc;
! 7147: }
! 7148:
! 7149: }else{
! 7150: rc = allocateBtreePage(pBt, &pRoot, &pgnoRoot, 1, 0);
! 7151: if( rc ) return rc;
! 7152: }
! 7153: #endif
! 7154: assert( sqlite3PagerIswriteable(pRoot->pDbPage) );
! 7155: if( createTabFlags & BTREE_INTKEY ){
! 7156: ptfFlags = PTF_INTKEY | PTF_LEAFDATA | PTF_LEAF;
! 7157: }else{
! 7158: ptfFlags = PTF_ZERODATA | PTF_LEAF;
! 7159: }
! 7160: zeroPage(pRoot, ptfFlags);
! 7161: sqlite3PagerUnref(pRoot->pDbPage);
! 7162: assert( (pBt->openFlags & BTREE_SINGLE)==0 || pgnoRoot==2 );
! 7163: *piTable = (int)pgnoRoot;
! 7164: return SQLITE_OK;
! 7165: }
! 7166: int sqlite3BtreeCreateTable(Btree *p, int *piTable, int flags){
! 7167: int rc;
! 7168: sqlite3BtreeEnter(p);
! 7169: rc = btreeCreateTable(p, piTable, flags);
! 7170: sqlite3BtreeLeave(p);
! 7171: return rc;
! 7172: }
! 7173:
! 7174: /*
! 7175: ** Erase the given database page and all its children. Return
! 7176: ** the page to the freelist.
! 7177: */
! 7178: static int clearDatabasePage(
! 7179: BtShared *pBt, /* The BTree that contains the table */
! 7180: Pgno pgno, /* Page number to clear */
! 7181: int freePageFlag, /* Deallocate page if true */
! 7182: int *pnChange /* Add number of Cells freed to this counter */
! 7183: ){
! 7184: MemPage *pPage;
! 7185: int rc;
! 7186: unsigned char *pCell;
! 7187: int i;
! 7188:
! 7189: assert( sqlite3_mutex_held(pBt->mutex) );
! 7190: if( pgno>btreePagecount(pBt) ){
! 7191: return SQLITE_CORRUPT_BKPT;
! 7192: }
! 7193:
! 7194: rc = getAndInitPage(pBt, pgno, &pPage);
! 7195: if( rc ) return rc;
! 7196: for(i=0; i<pPage->nCell; i++){
! 7197: pCell = findCell(pPage, i);
! 7198: if( !pPage->leaf ){
! 7199: rc = clearDatabasePage(pBt, get4byte(pCell), 1, pnChange);
! 7200: if( rc ) goto cleardatabasepage_out;
! 7201: }
! 7202: rc = clearCell(pPage, pCell);
! 7203: if( rc ) goto cleardatabasepage_out;
! 7204: }
! 7205: if( !pPage->leaf ){
! 7206: rc = clearDatabasePage(pBt, get4byte(&pPage->aData[8]), 1, pnChange);
! 7207: if( rc ) goto cleardatabasepage_out;
! 7208: }else if( pnChange ){
! 7209: assert( pPage->intKey );
! 7210: *pnChange += pPage->nCell;
! 7211: }
! 7212: if( freePageFlag ){
! 7213: freePage(pPage, &rc);
! 7214: }else if( (rc = sqlite3PagerWrite(pPage->pDbPage))==0 ){
! 7215: zeroPage(pPage, pPage->aData[0] | PTF_LEAF);
! 7216: }
! 7217:
! 7218: cleardatabasepage_out:
! 7219: releasePage(pPage);
! 7220: return rc;
! 7221: }
! 7222:
! 7223: /*
! 7224: ** Delete all information from a single table in the database. iTable is
! 7225: ** the page number of the root of the table. After this routine returns,
! 7226: ** the root page is empty, but still exists.
! 7227: **
! 7228: ** This routine will fail with SQLITE_LOCKED if there are any open
! 7229: ** read cursors on the table. Open write cursors are moved to the
! 7230: ** root of the table.
! 7231: **
! 7232: ** If pnChange is not NULL, then table iTable must be an intkey table. The
! 7233: ** integer value pointed to by pnChange is incremented by the number of
! 7234: ** entries in the table.
! 7235: */
! 7236: int sqlite3BtreeClearTable(Btree *p, int iTable, int *pnChange){
! 7237: int rc;
! 7238: BtShared *pBt = p->pBt;
! 7239: sqlite3BtreeEnter(p);
! 7240: assert( p->inTrans==TRANS_WRITE );
! 7241:
! 7242: /* Invalidate all incrblob cursors open on table iTable (assuming iTable
! 7243: ** is the root of a table b-tree - if it is not, the following call is
! 7244: ** a no-op). */
! 7245: invalidateIncrblobCursors(p, 0, 1);
! 7246:
! 7247: rc = saveAllCursors(pBt, (Pgno)iTable, 0);
! 7248: if( SQLITE_OK==rc ){
! 7249: rc = clearDatabasePage(pBt, (Pgno)iTable, 0, pnChange);
! 7250: }
! 7251: sqlite3BtreeLeave(p);
! 7252: return rc;
! 7253: }
! 7254:
! 7255: /*
! 7256: ** Erase all information in a table and add the root of the table to
! 7257: ** the freelist. Except, the root of the principle table (the one on
! 7258: ** page 1) is never added to the freelist.
! 7259: **
! 7260: ** This routine will fail with SQLITE_LOCKED if there are any open
! 7261: ** cursors on the table.
! 7262: **
! 7263: ** If AUTOVACUUM is enabled and the page at iTable is not the last
! 7264: ** root page in the database file, then the last root page
! 7265: ** in the database file is moved into the slot formerly occupied by
! 7266: ** iTable and that last slot formerly occupied by the last root page
! 7267: ** is added to the freelist instead of iTable. In this say, all
! 7268: ** root pages are kept at the beginning of the database file, which
! 7269: ** is necessary for AUTOVACUUM to work right. *piMoved is set to the
! 7270: ** page number that used to be the last root page in the file before
! 7271: ** the move. If no page gets moved, *piMoved is set to 0.
! 7272: ** The last root page is recorded in meta[3] and the value of
! 7273: ** meta[3] is updated by this procedure.
! 7274: */
! 7275: static int btreeDropTable(Btree *p, Pgno iTable, int *piMoved){
! 7276: int rc;
! 7277: MemPage *pPage = 0;
! 7278: BtShared *pBt = p->pBt;
! 7279:
! 7280: assert( sqlite3BtreeHoldsMutex(p) );
! 7281: assert( p->inTrans==TRANS_WRITE );
! 7282:
! 7283: /* It is illegal to drop a table if any cursors are open on the
! 7284: ** database. This is because in auto-vacuum mode the backend may
! 7285: ** need to move another root-page to fill a gap left by the deleted
! 7286: ** root page. If an open cursor was using this page a problem would
! 7287: ** occur.
! 7288: **
! 7289: ** This error is caught long before control reaches this point.
! 7290: */
! 7291: if( NEVER(pBt->pCursor) ){
! 7292: sqlite3ConnectionBlocked(p->db, pBt->pCursor->pBtree->db);
! 7293: return SQLITE_LOCKED_SHAREDCACHE;
! 7294: }
! 7295:
! 7296: rc = btreeGetPage(pBt, (Pgno)iTable, &pPage, 0);
! 7297: if( rc ) return rc;
! 7298: rc = sqlite3BtreeClearTable(p, iTable, 0);
! 7299: if( rc ){
! 7300: releasePage(pPage);
! 7301: return rc;
! 7302: }
! 7303:
! 7304: *piMoved = 0;
! 7305:
! 7306: if( iTable>1 ){
! 7307: #ifdef SQLITE_OMIT_AUTOVACUUM
! 7308: freePage(pPage, &rc);
! 7309: releasePage(pPage);
! 7310: #else
! 7311: if( pBt->autoVacuum ){
! 7312: Pgno maxRootPgno;
! 7313: sqlite3BtreeGetMeta(p, BTREE_LARGEST_ROOT_PAGE, &maxRootPgno);
! 7314:
! 7315: if( iTable==maxRootPgno ){
! 7316: /* If the table being dropped is the table with the largest root-page
! 7317: ** number in the database, put the root page on the free list.
! 7318: */
! 7319: freePage(pPage, &rc);
! 7320: releasePage(pPage);
! 7321: if( rc!=SQLITE_OK ){
! 7322: return rc;
! 7323: }
! 7324: }else{
! 7325: /* The table being dropped does not have the largest root-page
! 7326: ** number in the database. So move the page that does into the
! 7327: ** gap left by the deleted root-page.
! 7328: */
! 7329: MemPage *pMove;
! 7330: releasePage(pPage);
! 7331: rc = btreeGetPage(pBt, maxRootPgno, &pMove, 0);
! 7332: if( rc!=SQLITE_OK ){
! 7333: return rc;
! 7334: }
! 7335: rc = relocatePage(pBt, pMove, PTRMAP_ROOTPAGE, 0, iTable, 0);
! 7336: releasePage(pMove);
! 7337: if( rc!=SQLITE_OK ){
! 7338: return rc;
! 7339: }
! 7340: pMove = 0;
! 7341: rc = btreeGetPage(pBt, maxRootPgno, &pMove, 0);
! 7342: freePage(pMove, &rc);
! 7343: releasePage(pMove);
! 7344: if( rc!=SQLITE_OK ){
! 7345: return rc;
! 7346: }
! 7347: *piMoved = maxRootPgno;
! 7348: }
! 7349:
! 7350: /* Set the new 'max-root-page' value in the database header. This
! 7351: ** is the old value less one, less one more if that happens to
! 7352: ** be a root-page number, less one again if that is the
! 7353: ** PENDING_BYTE_PAGE.
! 7354: */
! 7355: maxRootPgno--;
! 7356: while( maxRootPgno==PENDING_BYTE_PAGE(pBt)
! 7357: || PTRMAP_ISPAGE(pBt, maxRootPgno) ){
! 7358: maxRootPgno--;
! 7359: }
! 7360: assert( maxRootPgno!=PENDING_BYTE_PAGE(pBt) );
! 7361:
! 7362: rc = sqlite3BtreeUpdateMeta(p, 4, maxRootPgno);
! 7363: }else{
! 7364: freePage(pPage, &rc);
! 7365: releasePage(pPage);
! 7366: }
! 7367: #endif
! 7368: }else{
! 7369: /* If sqlite3BtreeDropTable was called on page 1.
! 7370: ** This really never should happen except in a corrupt
! 7371: ** database.
! 7372: */
! 7373: zeroPage(pPage, PTF_INTKEY|PTF_LEAF );
! 7374: releasePage(pPage);
! 7375: }
! 7376: return rc;
! 7377: }
! 7378: int sqlite3BtreeDropTable(Btree *p, int iTable, int *piMoved){
! 7379: int rc;
! 7380: sqlite3BtreeEnter(p);
! 7381: rc = btreeDropTable(p, iTable, piMoved);
! 7382: sqlite3BtreeLeave(p);
! 7383: return rc;
! 7384: }
! 7385:
! 7386:
! 7387: /*
! 7388: ** This function may only be called if the b-tree connection already
! 7389: ** has a read or write transaction open on the database.
! 7390: **
! 7391: ** Read the meta-information out of a database file. Meta[0]
! 7392: ** is the number of free pages currently in the database. Meta[1]
! 7393: ** through meta[15] are available for use by higher layers. Meta[0]
! 7394: ** is read-only, the others are read/write.
! 7395: **
! 7396: ** The schema layer numbers meta values differently. At the schema
! 7397: ** layer (and the SetCookie and ReadCookie opcodes) the number of
! 7398: ** free pages is not visible. So Cookie[0] is the same as Meta[1].
! 7399: */
! 7400: void sqlite3BtreeGetMeta(Btree *p, int idx, u32 *pMeta){
! 7401: BtShared *pBt = p->pBt;
! 7402:
! 7403: sqlite3BtreeEnter(p);
! 7404: assert( p->inTrans>TRANS_NONE );
! 7405: assert( SQLITE_OK==querySharedCacheTableLock(p, MASTER_ROOT, READ_LOCK) );
! 7406: assert( pBt->pPage1 );
! 7407: assert( idx>=0 && idx<=15 );
! 7408:
! 7409: *pMeta = get4byte(&pBt->pPage1->aData[36 + idx*4]);
! 7410:
! 7411: /* If auto-vacuum is disabled in this build and this is an auto-vacuum
! 7412: ** database, mark the database as read-only. */
! 7413: #ifdef SQLITE_OMIT_AUTOVACUUM
! 7414: if( idx==BTREE_LARGEST_ROOT_PAGE && *pMeta>0 ){
! 7415: pBt->btsFlags |= BTS_READ_ONLY;
! 7416: }
! 7417: #endif
! 7418:
! 7419: sqlite3BtreeLeave(p);
! 7420: }
! 7421:
! 7422: /*
! 7423: ** Write meta-information back into the database. Meta[0] is
! 7424: ** read-only and may not be written.
! 7425: */
! 7426: int sqlite3BtreeUpdateMeta(Btree *p, int idx, u32 iMeta){
! 7427: BtShared *pBt = p->pBt;
! 7428: unsigned char *pP1;
! 7429: int rc;
! 7430: assert( idx>=1 && idx<=15 );
! 7431: sqlite3BtreeEnter(p);
! 7432: assert( p->inTrans==TRANS_WRITE );
! 7433: assert( pBt->pPage1!=0 );
! 7434: pP1 = pBt->pPage1->aData;
! 7435: rc = sqlite3PagerWrite(pBt->pPage1->pDbPage);
! 7436: if( rc==SQLITE_OK ){
! 7437: put4byte(&pP1[36 + idx*4], iMeta);
! 7438: #ifndef SQLITE_OMIT_AUTOVACUUM
! 7439: if( idx==BTREE_INCR_VACUUM ){
! 7440: assert( pBt->autoVacuum || iMeta==0 );
! 7441: assert( iMeta==0 || iMeta==1 );
! 7442: pBt->incrVacuum = (u8)iMeta;
! 7443: }
! 7444: #endif
! 7445: }
! 7446: sqlite3BtreeLeave(p);
! 7447: return rc;
! 7448: }
! 7449:
! 7450: #ifndef SQLITE_OMIT_BTREECOUNT
! 7451: /*
! 7452: ** The first argument, pCur, is a cursor opened on some b-tree. Count the
! 7453: ** number of entries in the b-tree and write the result to *pnEntry.
! 7454: **
! 7455: ** SQLITE_OK is returned if the operation is successfully executed.
! 7456: ** Otherwise, if an error is encountered (i.e. an IO error or database
! 7457: ** corruption) an SQLite error code is returned.
! 7458: */
! 7459: int sqlite3BtreeCount(BtCursor *pCur, i64 *pnEntry){
! 7460: i64 nEntry = 0; /* Value to return in *pnEntry */
! 7461: int rc; /* Return code */
! 7462:
! 7463: if( pCur->pgnoRoot==0 ){
! 7464: *pnEntry = 0;
! 7465: return SQLITE_OK;
! 7466: }
! 7467: rc = moveToRoot(pCur);
! 7468:
! 7469: /* Unless an error occurs, the following loop runs one iteration for each
! 7470: ** page in the B-Tree structure (not including overflow pages).
! 7471: */
! 7472: while( rc==SQLITE_OK ){
! 7473: int iIdx; /* Index of child node in parent */
! 7474: MemPage *pPage; /* Current page of the b-tree */
! 7475:
! 7476: /* If this is a leaf page or the tree is not an int-key tree, then
! 7477: ** this page contains countable entries. Increment the entry counter
! 7478: ** accordingly.
! 7479: */
! 7480: pPage = pCur->apPage[pCur->iPage];
! 7481: if( pPage->leaf || !pPage->intKey ){
! 7482: nEntry += pPage->nCell;
! 7483: }
! 7484:
! 7485: /* pPage is a leaf node. This loop navigates the cursor so that it
! 7486: ** points to the first interior cell that it points to the parent of
! 7487: ** the next page in the tree that has not yet been visited. The
! 7488: ** pCur->aiIdx[pCur->iPage] value is set to the index of the parent cell
! 7489: ** of the page, or to the number of cells in the page if the next page
! 7490: ** to visit is the right-child of its parent.
! 7491: **
! 7492: ** If all pages in the tree have been visited, return SQLITE_OK to the
! 7493: ** caller.
! 7494: */
! 7495: if( pPage->leaf ){
! 7496: do {
! 7497: if( pCur->iPage==0 ){
! 7498: /* All pages of the b-tree have been visited. Return successfully. */
! 7499: *pnEntry = nEntry;
! 7500: return SQLITE_OK;
! 7501: }
! 7502: moveToParent(pCur);
! 7503: }while ( pCur->aiIdx[pCur->iPage]>=pCur->apPage[pCur->iPage]->nCell );
! 7504:
! 7505: pCur->aiIdx[pCur->iPage]++;
! 7506: pPage = pCur->apPage[pCur->iPage];
! 7507: }
! 7508:
! 7509: /* Descend to the child node of the cell that the cursor currently
! 7510: ** points at. This is the right-child if (iIdx==pPage->nCell).
! 7511: */
! 7512: iIdx = pCur->aiIdx[pCur->iPage];
! 7513: if( iIdx==pPage->nCell ){
! 7514: rc = moveToChild(pCur, get4byte(&pPage->aData[pPage->hdrOffset+8]));
! 7515: }else{
! 7516: rc = moveToChild(pCur, get4byte(findCell(pPage, iIdx)));
! 7517: }
! 7518: }
! 7519:
! 7520: /* An error has occurred. Return an error code. */
! 7521: return rc;
! 7522: }
! 7523: #endif
! 7524:
! 7525: /*
! 7526: ** Return the pager associated with a BTree. This routine is used for
! 7527: ** testing and debugging only.
! 7528: */
! 7529: Pager *sqlite3BtreePager(Btree *p){
! 7530: return p->pBt->pPager;
! 7531: }
! 7532:
! 7533: #ifndef SQLITE_OMIT_INTEGRITY_CHECK
! 7534: /*
! 7535: ** Append a message to the error message string.
! 7536: */
! 7537: static void checkAppendMsg(
! 7538: IntegrityCk *pCheck,
! 7539: char *zMsg1,
! 7540: const char *zFormat,
! 7541: ...
! 7542: ){
! 7543: va_list ap;
! 7544: if( !pCheck->mxErr ) return;
! 7545: pCheck->mxErr--;
! 7546: pCheck->nErr++;
! 7547: va_start(ap, zFormat);
! 7548: if( pCheck->errMsg.nChar ){
! 7549: sqlite3StrAccumAppend(&pCheck->errMsg, "\n", 1);
! 7550: }
! 7551: if( zMsg1 ){
! 7552: sqlite3StrAccumAppend(&pCheck->errMsg, zMsg1, -1);
! 7553: }
! 7554: sqlite3VXPrintf(&pCheck->errMsg, 1, zFormat, ap);
! 7555: va_end(ap);
! 7556: if( pCheck->errMsg.mallocFailed ){
! 7557: pCheck->mallocFailed = 1;
! 7558: }
! 7559: }
! 7560: #endif /* SQLITE_OMIT_INTEGRITY_CHECK */
! 7561:
! 7562: #ifndef SQLITE_OMIT_INTEGRITY_CHECK
! 7563: /*
! 7564: ** Add 1 to the reference count for page iPage. If this is the second
! 7565: ** reference to the page, add an error message to pCheck->zErrMsg.
! 7566: ** Return 1 if there are 2 ore more references to the page and 0 if
! 7567: ** if this is the first reference to the page.
! 7568: **
! 7569: ** Also check that the page number is in bounds.
! 7570: */
! 7571: static int checkRef(IntegrityCk *pCheck, Pgno iPage, char *zContext){
! 7572: if( iPage==0 ) return 1;
! 7573: if( iPage>pCheck->nPage ){
! 7574: checkAppendMsg(pCheck, zContext, "invalid page number %d", iPage);
! 7575: return 1;
! 7576: }
! 7577: if( pCheck->anRef[iPage]==1 ){
! 7578: checkAppendMsg(pCheck, zContext, "2nd reference to page %d", iPage);
! 7579: return 1;
! 7580: }
! 7581: return (pCheck->anRef[iPage]++)>1;
! 7582: }
! 7583:
! 7584: #ifndef SQLITE_OMIT_AUTOVACUUM
! 7585: /*
! 7586: ** Check that the entry in the pointer-map for page iChild maps to
! 7587: ** page iParent, pointer type ptrType. If not, append an error message
! 7588: ** to pCheck.
! 7589: */
! 7590: static void checkPtrmap(
! 7591: IntegrityCk *pCheck, /* Integrity check context */
! 7592: Pgno iChild, /* Child page number */
! 7593: u8 eType, /* Expected pointer map type */
! 7594: Pgno iParent, /* Expected pointer map parent page number */
! 7595: char *zContext /* Context description (used for error msg) */
! 7596: ){
! 7597: int rc;
! 7598: u8 ePtrmapType;
! 7599: Pgno iPtrmapParent;
! 7600:
! 7601: rc = ptrmapGet(pCheck->pBt, iChild, &ePtrmapType, &iPtrmapParent);
! 7602: if( rc!=SQLITE_OK ){
! 7603: if( rc==SQLITE_NOMEM || rc==SQLITE_IOERR_NOMEM ) pCheck->mallocFailed = 1;
! 7604: checkAppendMsg(pCheck, zContext, "Failed to read ptrmap key=%d", iChild);
! 7605: return;
! 7606: }
! 7607:
! 7608: if( ePtrmapType!=eType || iPtrmapParent!=iParent ){
! 7609: checkAppendMsg(pCheck, zContext,
! 7610: "Bad ptr map entry key=%d expected=(%d,%d) got=(%d,%d)",
! 7611: iChild, eType, iParent, ePtrmapType, iPtrmapParent);
! 7612: }
! 7613: }
! 7614: #endif
! 7615:
! 7616: /*
! 7617: ** Check the integrity of the freelist or of an overflow page list.
! 7618: ** Verify that the number of pages on the list is N.
! 7619: */
! 7620: static void checkList(
! 7621: IntegrityCk *pCheck, /* Integrity checking context */
! 7622: int isFreeList, /* True for a freelist. False for overflow page list */
! 7623: int iPage, /* Page number for first page in the list */
! 7624: int N, /* Expected number of pages in the list */
! 7625: char *zContext /* Context for error messages */
! 7626: ){
! 7627: int i;
! 7628: int expected = N;
! 7629: int iFirst = iPage;
! 7630: while( N-- > 0 && pCheck->mxErr ){
! 7631: DbPage *pOvflPage;
! 7632: unsigned char *pOvflData;
! 7633: if( iPage<1 ){
! 7634: checkAppendMsg(pCheck, zContext,
! 7635: "%d of %d pages missing from overflow list starting at %d",
! 7636: N+1, expected, iFirst);
! 7637: break;
! 7638: }
! 7639: if( checkRef(pCheck, iPage, zContext) ) break;
! 7640: if( sqlite3PagerGet(pCheck->pPager, (Pgno)iPage, &pOvflPage) ){
! 7641: checkAppendMsg(pCheck, zContext, "failed to get page %d", iPage);
! 7642: break;
! 7643: }
! 7644: pOvflData = (unsigned char *)sqlite3PagerGetData(pOvflPage);
! 7645: if( isFreeList ){
! 7646: int n = get4byte(&pOvflData[4]);
! 7647: #ifndef SQLITE_OMIT_AUTOVACUUM
! 7648: if( pCheck->pBt->autoVacuum ){
! 7649: checkPtrmap(pCheck, iPage, PTRMAP_FREEPAGE, 0, zContext);
! 7650: }
! 7651: #endif
! 7652: if( n>(int)pCheck->pBt->usableSize/4-2 ){
! 7653: checkAppendMsg(pCheck, zContext,
! 7654: "freelist leaf count too big on page %d", iPage);
! 7655: N--;
! 7656: }else{
! 7657: for(i=0; i<n; i++){
! 7658: Pgno iFreePage = get4byte(&pOvflData[8+i*4]);
! 7659: #ifndef SQLITE_OMIT_AUTOVACUUM
! 7660: if( pCheck->pBt->autoVacuum ){
! 7661: checkPtrmap(pCheck, iFreePage, PTRMAP_FREEPAGE, 0, zContext);
! 7662: }
! 7663: #endif
! 7664: checkRef(pCheck, iFreePage, zContext);
! 7665: }
! 7666: N -= n;
! 7667: }
! 7668: }
! 7669: #ifndef SQLITE_OMIT_AUTOVACUUM
! 7670: else{
! 7671: /* If this database supports auto-vacuum and iPage is not the last
! 7672: ** page in this overflow list, check that the pointer-map entry for
! 7673: ** the following page matches iPage.
! 7674: */
! 7675: if( pCheck->pBt->autoVacuum && N>0 ){
! 7676: i = get4byte(pOvflData);
! 7677: checkPtrmap(pCheck, i, PTRMAP_OVERFLOW2, iPage, zContext);
! 7678: }
! 7679: }
! 7680: #endif
! 7681: iPage = get4byte(pOvflData);
! 7682: sqlite3PagerUnref(pOvflPage);
! 7683: }
! 7684: }
! 7685: #endif /* SQLITE_OMIT_INTEGRITY_CHECK */
! 7686:
! 7687: #ifndef SQLITE_OMIT_INTEGRITY_CHECK
! 7688: /*
! 7689: ** Do various sanity checks on a single page of a tree. Return
! 7690: ** the tree depth. Root pages return 0. Parents of root pages
! 7691: ** return 1, and so forth.
! 7692: **
! 7693: ** These checks are done:
! 7694: **
! 7695: ** 1. Make sure that cells and freeblocks do not overlap
! 7696: ** but combine to completely cover the page.
! 7697: ** NO 2. Make sure cell keys are in order.
! 7698: ** NO 3. Make sure no key is less than or equal to zLowerBound.
! 7699: ** NO 4. Make sure no key is greater than or equal to zUpperBound.
! 7700: ** 5. Check the integrity of overflow pages.
! 7701: ** 6. Recursively call checkTreePage on all children.
! 7702: ** 7. Verify that the depth of all children is the same.
! 7703: ** 8. Make sure this page is at least 33% full or else it is
! 7704: ** the root of the tree.
! 7705: */
! 7706: static int checkTreePage(
! 7707: IntegrityCk *pCheck, /* Context for the sanity check */
! 7708: int iPage, /* Page number of the page to check */
! 7709: char *zParentContext, /* Parent context */
! 7710: i64 *pnParentMinKey,
! 7711: i64 *pnParentMaxKey
! 7712: ){
! 7713: MemPage *pPage;
! 7714: int i, rc, depth, d2, pgno, cnt;
! 7715: int hdr, cellStart;
! 7716: int nCell;
! 7717: u8 *data;
! 7718: BtShared *pBt;
! 7719: int usableSize;
! 7720: char zContext[100];
! 7721: char *hit = 0;
! 7722: i64 nMinKey = 0;
! 7723: i64 nMaxKey = 0;
! 7724:
! 7725: sqlite3_snprintf(sizeof(zContext), zContext, "Page %d: ", iPage);
! 7726:
! 7727: /* Check that the page exists
! 7728: */
! 7729: pBt = pCheck->pBt;
! 7730: usableSize = pBt->usableSize;
! 7731: if( iPage==0 ) return 0;
! 7732: if( checkRef(pCheck, iPage, zParentContext) ) return 0;
! 7733: if( (rc = btreeGetPage(pBt, (Pgno)iPage, &pPage, 0))!=0 ){
! 7734: checkAppendMsg(pCheck, zContext,
! 7735: "unable to get the page. error code=%d", rc);
! 7736: return 0;
! 7737: }
! 7738:
! 7739: /* Clear MemPage.isInit to make sure the corruption detection code in
! 7740: ** btreeInitPage() is executed. */
! 7741: pPage->isInit = 0;
! 7742: if( (rc = btreeInitPage(pPage))!=0 ){
! 7743: assert( rc==SQLITE_CORRUPT ); /* The only possible error from InitPage */
! 7744: checkAppendMsg(pCheck, zContext,
! 7745: "btreeInitPage() returns error code %d", rc);
! 7746: releasePage(pPage);
! 7747: return 0;
! 7748: }
! 7749:
! 7750: /* Check out all the cells.
! 7751: */
! 7752: depth = 0;
! 7753: for(i=0; i<pPage->nCell && pCheck->mxErr; i++){
! 7754: u8 *pCell;
! 7755: u32 sz;
! 7756: CellInfo info;
! 7757:
! 7758: /* Check payload overflow pages
! 7759: */
! 7760: sqlite3_snprintf(sizeof(zContext), zContext,
! 7761: "On tree page %d cell %d: ", iPage, i);
! 7762: pCell = findCell(pPage,i);
! 7763: btreeParseCellPtr(pPage, pCell, &info);
! 7764: sz = info.nData;
! 7765: if( !pPage->intKey ) sz += (int)info.nKey;
! 7766: /* For intKey pages, check that the keys are in order.
! 7767: */
! 7768: else if( i==0 ) nMinKey = nMaxKey = info.nKey;
! 7769: else{
! 7770: if( info.nKey <= nMaxKey ){
! 7771: checkAppendMsg(pCheck, zContext,
! 7772: "Rowid %lld out of order (previous was %lld)", info.nKey, nMaxKey);
! 7773: }
! 7774: nMaxKey = info.nKey;
! 7775: }
! 7776: assert( sz==info.nPayload );
! 7777: if( (sz>info.nLocal)
! 7778: && (&pCell[info.iOverflow]<=&pPage->aData[pBt->usableSize])
! 7779: ){
! 7780: int nPage = (sz - info.nLocal + usableSize - 5)/(usableSize - 4);
! 7781: Pgno pgnoOvfl = get4byte(&pCell[info.iOverflow]);
! 7782: #ifndef SQLITE_OMIT_AUTOVACUUM
! 7783: if( pBt->autoVacuum ){
! 7784: checkPtrmap(pCheck, pgnoOvfl, PTRMAP_OVERFLOW1, iPage, zContext);
! 7785: }
! 7786: #endif
! 7787: checkList(pCheck, 0, pgnoOvfl, nPage, zContext);
! 7788: }
! 7789:
! 7790: /* Check sanity of left child page.
! 7791: */
! 7792: if( !pPage->leaf ){
! 7793: pgno = get4byte(pCell);
! 7794: #ifndef SQLITE_OMIT_AUTOVACUUM
! 7795: if( pBt->autoVacuum ){
! 7796: checkPtrmap(pCheck, pgno, PTRMAP_BTREE, iPage, zContext);
! 7797: }
! 7798: #endif
! 7799: d2 = checkTreePage(pCheck, pgno, zContext, &nMinKey, i==0 ? NULL : &nMaxKey);
! 7800: if( i>0 && d2!=depth ){
! 7801: checkAppendMsg(pCheck, zContext, "Child page depth differs");
! 7802: }
! 7803: depth = d2;
! 7804: }
! 7805: }
! 7806:
! 7807: if( !pPage->leaf ){
! 7808: pgno = get4byte(&pPage->aData[pPage->hdrOffset+8]);
! 7809: sqlite3_snprintf(sizeof(zContext), zContext,
! 7810: "On page %d at right child: ", iPage);
! 7811: #ifndef SQLITE_OMIT_AUTOVACUUM
! 7812: if( pBt->autoVacuum ){
! 7813: checkPtrmap(pCheck, pgno, PTRMAP_BTREE, iPage, zContext);
! 7814: }
! 7815: #endif
! 7816: checkTreePage(pCheck, pgno, zContext, NULL, !pPage->nCell ? NULL : &nMaxKey);
! 7817: }
! 7818:
! 7819: /* For intKey leaf pages, check that the min/max keys are in order
! 7820: ** with any left/parent/right pages.
! 7821: */
! 7822: if( pPage->leaf && pPage->intKey ){
! 7823: /* if we are a left child page */
! 7824: if( pnParentMinKey ){
! 7825: /* if we are the left most child page */
! 7826: if( !pnParentMaxKey ){
! 7827: if( nMaxKey > *pnParentMinKey ){
! 7828: checkAppendMsg(pCheck, zContext,
! 7829: "Rowid %lld out of order (max larger than parent min of %lld)",
! 7830: nMaxKey, *pnParentMinKey);
! 7831: }
! 7832: }else{
! 7833: if( nMinKey <= *pnParentMinKey ){
! 7834: checkAppendMsg(pCheck, zContext,
! 7835: "Rowid %lld out of order (min less than parent min of %lld)",
! 7836: nMinKey, *pnParentMinKey);
! 7837: }
! 7838: if( nMaxKey > *pnParentMaxKey ){
! 7839: checkAppendMsg(pCheck, zContext,
! 7840: "Rowid %lld out of order (max larger than parent max of %lld)",
! 7841: nMaxKey, *pnParentMaxKey);
! 7842: }
! 7843: *pnParentMinKey = nMaxKey;
! 7844: }
! 7845: /* else if we're a right child page */
! 7846: } else if( pnParentMaxKey ){
! 7847: if( nMinKey <= *pnParentMaxKey ){
! 7848: checkAppendMsg(pCheck, zContext,
! 7849: "Rowid %lld out of order (min less than parent max of %lld)",
! 7850: nMinKey, *pnParentMaxKey);
! 7851: }
! 7852: }
! 7853: }
! 7854:
! 7855: /* Check for complete coverage of the page
! 7856: */
! 7857: data = pPage->aData;
! 7858: hdr = pPage->hdrOffset;
! 7859: hit = sqlite3PageMalloc( pBt->pageSize );
! 7860: if( hit==0 ){
! 7861: pCheck->mallocFailed = 1;
! 7862: }else{
! 7863: int contentOffset = get2byteNotZero(&data[hdr+5]);
! 7864: assert( contentOffset<=usableSize ); /* Enforced by btreeInitPage() */
! 7865: memset(hit+contentOffset, 0, usableSize-contentOffset);
! 7866: memset(hit, 1, contentOffset);
! 7867: nCell = get2byte(&data[hdr+3]);
! 7868: cellStart = hdr + 12 - 4*pPage->leaf;
! 7869: for(i=0; i<nCell; i++){
! 7870: int pc = get2byte(&data[cellStart+i*2]);
! 7871: u32 size = 65536;
! 7872: int j;
! 7873: if( pc<=usableSize-4 ){
! 7874: size = cellSizePtr(pPage, &data[pc]);
! 7875: }
! 7876: if( (int)(pc+size-1)>=usableSize ){
! 7877: checkAppendMsg(pCheck, 0,
! 7878: "Corruption detected in cell %d on page %d",i,iPage);
! 7879: }else{
! 7880: for(j=pc+size-1; j>=pc; j--) hit[j]++;
! 7881: }
! 7882: }
! 7883: i = get2byte(&data[hdr+1]);
! 7884: while( i>0 ){
! 7885: int size, j;
! 7886: assert( i<=usableSize-4 ); /* Enforced by btreeInitPage() */
! 7887: size = get2byte(&data[i+2]);
! 7888: assert( i+size<=usableSize ); /* Enforced by btreeInitPage() */
! 7889: for(j=i+size-1; j>=i; j--) hit[j]++;
! 7890: j = get2byte(&data[i]);
! 7891: assert( j==0 || j>i+size ); /* Enforced by btreeInitPage() */
! 7892: assert( j<=usableSize-4 ); /* Enforced by btreeInitPage() */
! 7893: i = j;
! 7894: }
! 7895: for(i=cnt=0; i<usableSize; i++){
! 7896: if( hit[i]==0 ){
! 7897: cnt++;
! 7898: }else if( hit[i]>1 ){
! 7899: checkAppendMsg(pCheck, 0,
! 7900: "Multiple uses for byte %d of page %d", i, iPage);
! 7901: break;
! 7902: }
! 7903: }
! 7904: if( cnt!=data[hdr+7] ){
! 7905: checkAppendMsg(pCheck, 0,
! 7906: "Fragmentation of %d bytes reported as %d on page %d",
! 7907: cnt, data[hdr+7], iPage);
! 7908: }
! 7909: }
! 7910: sqlite3PageFree(hit);
! 7911: releasePage(pPage);
! 7912: return depth+1;
! 7913: }
! 7914: #endif /* SQLITE_OMIT_INTEGRITY_CHECK */
! 7915:
! 7916: #ifndef SQLITE_OMIT_INTEGRITY_CHECK
! 7917: /*
! 7918: ** This routine does a complete check of the given BTree file. aRoot[] is
! 7919: ** an array of pages numbers were each page number is the root page of
! 7920: ** a table. nRoot is the number of entries in aRoot.
! 7921: **
! 7922: ** A read-only or read-write transaction must be opened before calling
! 7923: ** this function.
! 7924: **
! 7925: ** Write the number of error seen in *pnErr. Except for some memory
! 7926: ** allocation errors, an error message held in memory obtained from
! 7927: ** malloc is returned if *pnErr is non-zero. If *pnErr==0 then NULL is
! 7928: ** returned. If a memory allocation error occurs, NULL is returned.
! 7929: */
! 7930: char *sqlite3BtreeIntegrityCheck(
! 7931: Btree *p, /* The btree to be checked */
! 7932: int *aRoot, /* An array of root pages numbers for individual trees */
! 7933: int nRoot, /* Number of entries in aRoot[] */
! 7934: int mxErr, /* Stop reporting errors after this many */
! 7935: int *pnErr /* Write number of errors seen to this variable */
! 7936: ){
! 7937: Pgno i;
! 7938: int nRef;
! 7939: IntegrityCk sCheck;
! 7940: BtShared *pBt = p->pBt;
! 7941: char zErr[100];
! 7942:
! 7943: sqlite3BtreeEnter(p);
! 7944: assert( p->inTrans>TRANS_NONE && pBt->inTransaction>TRANS_NONE );
! 7945: nRef = sqlite3PagerRefcount(pBt->pPager);
! 7946: sCheck.pBt = pBt;
! 7947: sCheck.pPager = pBt->pPager;
! 7948: sCheck.nPage = btreePagecount(sCheck.pBt);
! 7949: sCheck.mxErr = mxErr;
! 7950: sCheck.nErr = 0;
! 7951: sCheck.mallocFailed = 0;
! 7952: *pnErr = 0;
! 7953: if( sCheck.nPage==0 ){
! 7954: sqlite3BtreeLeave(p);
! 7955: return 0;
! 7956: }
! 7957: sCheck.anRef = sqlite3Malloc( (sCheck.nPage+1)*sizeof(sCheck.anRef[0]) );
! 7958: if( !sCheck.anRef ){
! 7959: *pnErr = 1;
! 7960: sqlite3BtreeLeave(p);
! 7961: return 0;
! 7962: }
! 7963: for(i=0; i<=sCheck.nPage; i++){ sCheck.anRef[i] = 0; }
! 7964: i = PENDING_BYTE_PAGE(pBt);
! 7965: if( i<=sCheck.nPage ){
! 7966: sCheck.anRef[i] = 1;
! 7967: }
! 7968: sqlite3StrAccumInit(&sCheck.errMsg, zErr, sizeof(zErr), 20000);
! 7969: sCheck.errMsg.useMalloc = 2;
! 7970:
! 7971: /* Check the integrity of the freelist
! 7972: */
! 7973: checkList(&sCheck, 1, get4byte(&pBt->pPage1->aData[32]),
! 7974: get4byte(&pBt->pPage1->aData[36]), "Main freelist: ");
! 7975:
! 7976: /* Check all the tables.
! 7977: */
! 7978: for(i=0; (int)i<nRoot && sCheck.mxErr; i++){
! 7979: if( aRoot[i]==0 ) continue;
! 7980: #ifndef SQLITE_OMIT_AUTOVACUUM
! 7981: if( pBt->autoVacuum && aRoot[i]>1 ){
! 7982: checkPtrmap(&sCheck, aRoot[i], PTRMAP_ROOTPAGE, 0, 0);
! 7983: }
! 7984: #endif
! 7985: checkTreePage(&sCheck, aRoot[i], "List of tree roots: ", NULL, NULL);
! 7986: }
! 7987:
! 7988: /* Make sure every page in the file is referenced
! 7989: */
! 7990: for(i=1; i<=sCheck.nPage && sCheck.mxErr; i++){
! 7991: #ifdef SQLITE_OMIT_AUTOVACUUM
! 7992: if( sCheck.anRef[i]==0 ){
! 7993: checkAppendMsg(&sCheck, 0, "Page %d is never used", i);
! 7994: }
! 7995: #else
! 7996: /* If the database supports auto-vacuum, make sure no tables contain
! 7997: ** references to pointer-map pages.
! 7998: */
! 7999: if( sCheck.anRef[i]==0 &&
! 8000: (PTRMAP_PAGENO(pBt, i)!=i || !pBt->autoVacuum) ){
! 8001: checkAppendMsg(&sCheck, 0, "Page %d is never used", i);
! 8002: }
! 8003: if( sCheck.anRef[i]!=0 &&
! 8004: (PTRMAP_PAGENO(pBt, i)==i && pBt->autoVacuum) ){
! 8005: checkAppendMsg(&sCheck, 0, "Pointer map page %d is referenced", i);
! 8006: }
! 8007: #endif
! 8008: }
! 8009:
! 8010: /* Make sure this analysis did not leave any unref() pages.
! 8011: ** This is an internal consistency check; an integrity check
! 8012: ** of the integrity check.
! 8013: */
! 8014: if( NEVER(nRef != sqlite3PagerRefcount(pBt->pPager)) ){
! 8015: checkAppendMsg(&sCheck, 0,
! 8016: "Outstanding page count goes from %d to %d during this analysis",
! 8017: nRef, sqlite3PagerRefcount(pBt->pPager)
! 8018: );
! 8019: }
! 8020:
! 8021: /* Clean up and report errors.
! 8022: */
! 8023: sqlite3BtreeLeave(p);
! 8024: sqlite3_free(sCheck.anRef);
! 8025: if( sCheck.mallocFailed ){
! 8026: sqlite3StrAccumReset(&sCheck.errMsg);
! 8027: *pnErr = sCheck.nErr+1;
! 8028: return 0;
! 8029: }
! 8030: *pnErr = sCheck.nErr;
! 8031: if( sCheck.nErr==0 ) sqlite3StrAccumReset(&sCheck.errMsg);
! 8032: return sqlite3StrAccumFinish(&sCheck.errMsg);
! 8033: }
! 8034: #endif /* SQLITE_OMIT_INTEGRITY_CHECK */
! 8035:
! 8036: /*
! 8037: ** Return the full pathname of the underlying database file.
! 8038: **
! 8039: ** The pager filename is invariant as long as the pager is
! 8040: ** open so it is safe to access without the BtShared mutex.
! 8041: */
! 8042: const char *sqlite3BtreeGetFilename(Btree *p){
! 8043: assert( p->pBt->pPager!=0 );
! 8044: return sqlite3PagerFilename(p->pBt->pPager);
! 8045: }
! 8046:
! 8047: /*
! 8048: ** Return the pathname of the journal file for this database. The return
! 8049: ** value of this routine is the same regardless of whether the journal file
! 8050: ** has been created or not.
! 8051: **
! 8052: ** The pager journal filename is invariant as long as the pager is
! 8053: ** open so it is safe to access without the BtShared mutex.
! 8054: */
! 8055: const char *sqlite3BtreeGetJournalname(Btree *p){
! 8056: assert( p->pBt->pPager!=0 );
! 8057: return sqlite3PagerJournalname(p->pBt->pPager);
! 8058: }
! 8059:
! 8060: /*
! 8061: ** Return non-zero if a transaction is active.
! 8062: */
! 8063: int sqlite3BtreeIsInTrans(Btree *p){
! 8064: assert( p==0 || sqlite3_mutex_held(p->db->mutex) );
! 8065: return (p && (p->inTrans==TRANS_WRITE));
! 8066: }
! 8067:
! 8068: #ifndef SQLITE_OMIT_WAL
! 8069: /*
! 8070: ** Run a checkpoint on the Btree passed as the first argument.
! 8071: **
! 8072: ** Return SQLITE_LOCKED if this or any other connection has an open
! 8073: ** transaction on the shared-cache the argument Btree is connected to.
! 8074: **
! 8075: ** Parameter eMode is one of SQLITE_CHECKPOINT_PASSIVE, FULL or RESTART.
! 8076: */
! 8077: int sqlite3BtreeCheckpoint(Btree *p, int eMode, int *pnLog, int *pnCkpt){
! 8078: int rc = SQLITE_OK;
! 8079: if( p ){
! 8080: BtShared *pBt = p->pBt;
! 8081: sqlite3BtreeEnter(p);
! 8082: if( pBt->inTransaction!=TRANS_NONE ){
! 8083: rc = SQLITE_LOCKED;
! 8084: }else{
! 8085: rc = sqlite3PagerCheckpoint(pBt->pPager, eMode, pnLog, pnCkpt);
! 8086: }
! 8087: sqlite3BtreeLeave(p);
! 8088: }
! 8089: return rc;
! 8090: }
! 8091: #endif
! 8092:
! 8093: /*
! 8094: ** Return non-zero if a read (or write) transaction is active.
! 8095: */
! 8096: int sqlite3BtreeIsInReadTrans(Btree *p){
! 8097: assert( p );
! 8098: assert( sqlite3_mutex_held(p->db->mutex) );
! 8099: return p->inTrans!=TRANS_NONE;
! 8100: }
! 8101:
! 8102: int sqlite3BtreeIsInBackup(Btree *p){
! 8103: assert( p );
! 8104: assert( sqlite3_mutex_held(p->db->mutex) );
! 8105: return p->nBackup!=0;
! 8106: }
! 8107:
! 8108: /*
! 8109: ** This function returns a pointer to a blob of memory associated with
! 8110: ** a single shared-btree. The memory is used by client code for its own
! 8111: ** purposes (for example, to store a high-level schema associated with
! 8112: ** the shared-btree). The btree layer manages reference counting issues.
! 8113: **
! 8114: ** The first time this is called on a shared-btree, nBytes bytes of memory
! 8115: ** are allocated, zeroed, and returned to the caller. For each subsequent
! 8116: ** call the nBytes parameter is ignored and a pointer to the same blob
! 8117: ** of memory returned.
! 8118: **
! 8119: ** If the nBytes parameter is 0 and the blob of memory has not yet been
! 8120: ** allocated, a null pointer is returned. If the blob has already been
! 8121: ** allocated, it is returned as normal.
! 8122: **
! 8123: ** Just before the shared-btree is closed, the function passed as the
! 8124: ** xFree argument when the memory allocation was made is invoked on the
! 8125: ** blob of allocated memory. The xFree function should not call sqlite3_free()
! 8126: ** on the memory, the btree layer does that.
! 8127: */
! 8128: void *sqlite3BtreeSchema(Btree *p, int nBytes, void(*xFree)(void *)){
! 8129: BtShared *pBt = p->pBt;
! 8130: sqlite3BtreeEnter(p);
! 8131: if( !pBt->pSchema && nBytes ){
! 8132: pBt->pSchema = sqlite3DbMallocZero(0, nBytes);
! 8133: pBt->xFreeSchema = xFree;
! 8134: }
! 8135: sqlite3BtreeLeave(p);
! 8136: return pBt->pSchema;
! 8137: }
! 8138:
! 8139: /*
! 8140: ** Return SQLITE_LOCKED_SHAREDCACHE if another user of the same shared
! 8141: ** btree as the argument handle holds an exclusive lock on the
! 8142: ** sqlite_master table. Otherwise SQLITE_OK.
! 8143: */
! 8144: int sqlite3BtreeSchemaLocked(Btree *p){
! 8145: int rc;
! 8146: assert( sqlite3_mutex_held(p->db->mutex) );
! 8147: sqlite3BtreeEnter(p);
! 8148: rc = querySharedCacheTableLock(p, MASTER_ROOT, READ_LOCK);
! 8149: assert( rc==SQLITE_OK || rc==SQLITE_LOCKED_SHAREDCACHE );
! 8150: sqlite3BtreeLeave(p);
! 8151: return rc;
! 8152: }
! 8153:
! 8154:
! 8155: #ifndef SQLITE_OMIT_SHARED_CACHE
! 8156: /*
! 8157: ** Obtain a lock on the table whose root page is iTab. The
! 8158: ** lock is a write lock if isWritelock is true or a read lock
! 8159: ** if it is false.
! 8160: */
! 8161: int sqlite3BtreeLockTable(Btree *p, int iTab, u8 isWriteLock){
! 8162: int rc = SQLITE_OK;
! 8163: assert( p->inTrans!=TRANS_NONE );
! 8164: if( p->sharable ){
! 8165: u8 lockType = READ_LOCK + isWriteLock;
! 8166: assert( READ_LOCK+1==WRITE_LOCK );
! 8167: assert( isWriteLock==0 || isWriteLock==1 );
! 8168:
! 8169: sqlite3BtreeEnter(p);
! 8170: rc = querySharedCacheTableLock(p, iTab, lockType);
! 8171: if( rc==SQLITE_OK ){
! 8172: rc = setSharedCacheTableLock(p, iTab, lockType);
! 8173: }
! 8174: sqlite3BtreeLeave(p);
! 8175: }
! 8176: return rc;
! 8177: }
! 8178: #endif
! 8179:
! 8180: #ifndef SQLITE_OMIT_INCRBLOB
! 8181: /*
! 8182: ** Argument pCsr must be a cursor opened for writing on an
! 8183: ** INTKEY table currently pointing at a valid table entry.
! 8184: ** This function modifies the data stored as part of that entry.
! 8185: **
! 8186: ** Only the data content may only be modified, it is not possible to
! 8187: ** change the length of the data stored. If this function is called with
! 8188: ** parameters that attempt to write past the end of the existing data,
! 8189: ** no modifications are made and SQLITE_CORRUPT is returned.
! 8190: */
! 8191: int sqlite3BtreePutData(BtCursor *pCsr, u32 offset, u32 amt, void *z){
! 8192: int rc;
! 8193: assert( cursorHoldsMutex(pCsr) );
! 8194: assert( sqlite3_mutex_held(pCsr->pBtree->db->mutex) );
! 8195: assert( pCsr->isIncrblobHandle );
! 8196:
! 8197: rc = restoreCursorPosition(pCsr);
! 8198: if( rc!=SQLITE_OK ){
! 8199: return rc;
! 8200: }
! 8201: assert( pCsr->eState!=CURSOR_REQUIRESEEK );
! 8202: if( pCsr->eState!=CURSOR_VALID ){
! 8203: return SQLITE_ABORT;
! 8204: }
! 8205:
! 8206: /* Check some assumptions:
! 8207: ** (a) the cursor is open for writing,
! 8208: ** (b) there is a read/write transaction open,
! 8209: ** (c) the connection holds a write-lock on the table (if required),
! 8210: ** (d) there are no conflicting read-locks, and
! 8211: ** (e) the cursor points at a valid row of an intKey table.
! 8212: */
! 8213: if( !pCsr->wrFlag ){
! 8214: return SQLITE_READONLY;
! 8215: }
! 8216: assert( (pCsr->pBt->btsFlags & BTS_READ_ONLY)==0
! 8217: && pCsr->pBt->inTransaction==TRANS_WRITE );
! 8218: assert( hasSharedCacheTableLock(pCsr->pBtree, pCsr->pgnoRoot, 0, 2) );
! 8219: assert( !hasReadConflicts(pCsr->pBtree, pCsr->pgnoRoot) );
! 8220: assert( pCsr->apPage[pCsr->iPage]->intKey );
! 8221:
! 8222: return accessPayload(pCsr, offset, amt, (unsigned char *)z, 1);
! 8223: }
! 8224:
! 8225: /*
! 8226: ** Set a flag on this cursor to cache the locations of pages from the
! 8227: ** overflow list for the current row. This is used by cursors opened
! 8228: ** for incremental blob IO only.
! 8229: **
! 8230: ** This function sets a flag only. The actual page location cache
! 8231: ** (stored in BtCursor.aOverflow[]) is allocated and used by function
! 8232: ** accessPayload() (the worker function for sqlite3BtreeData() and
! 8233: ** sqlite3BtreePutData()).
! 8234: */
! 8235: void sqlite3BtreeCacheOverflow(BtCursor *pCur){
! 8236: assert( cursorHoldsMutex(pCur) );
! 8237: assert( sqlite3_mutex_held(pCur->pBtree->db->mutex) );
! 8238: invalidateOverflowCache(pCur);
! 8239: pCur->isIncrblobHandle = 1;
! 8240: }
! 8241: #endif
! 8242:
! 8243: /*
! 8244: ** Set both the "read version" (single byte at byte offset 18) and
! 8245: ** "write version" (single byte at byte offset 19) fields in the database
! 8246: ** header to iVersion.
! 8247: */
! 8248: int sqlite3BtreeSetVersion(Btree *pBtree, int iVersion){
! 8249: BtShared *pBt = pBtree->pBt;
! 8250: int rc; /* Return code */
! 8251:
! 8252: assert( iVersion==1 || iVersion==2 );
! 8253:
! 8254: /* If setting the version fields to 1, do not automatically open the
! 8255: ** WAL connection, even if the version fields are currently set to 2.
! 8256: */
! 8257: pBt->btsFlags &= ~BTS_NO_WAL;
! 8258: if( iVersion==1 ) pBt->btsFlags |= BTS_NO_WAL;
! 8259:
! 8260: rc = sqlite3BtreeBeginTrans(pBtree, 0);
! 8261: if( rc==SQLITE_OK ){
! 8262: u8 *aData = pBt->pPage1->aData;
! 8263: if( aData[18]!=(u8)iVersion || aData[19]!=(u8)iVersion ){
! 8264: rc = sqlite3BtreeBeginTrans(pBtree, 2);
! 8265: if( rc==SQLITE_OK ){
! 8266: rc = sqlite3PagerWrite(pBt->pPage1->pDbPage);
! 8267: if( rc==SQLITE_OK ){
! 8268: aData[18] = (u8)iVersion;
! 8269: aData[19] = (u8)iVersion;
! 8270: }
! 8271: }
! 8272: }
! 8273: }
! 8274:
! 8275: pBt->btsFlags &= ~BTS_NO_WAL;
! 8276: return rc;
! 8277: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>