Lines Matching refs:pPage
483 static void releasePage(MemPage *pPage); /* Forward reference */
484 static void releasePageOne(MemPage *pPage); /* Forward reference */
485 static void releasePageNotNull(MemPage *pPage); /* Forward reference */
648 releasePageNotNull(pCur->pPage); in btreeReleaseAllCursorPages()
1114 MemPage *pPage, /* Page containing the cell */ in btreeParseCellAdjustSizeForOverflow() argument
1131 minLocal = pPage->minLocal; in btreeParseCellAdjustSizeForOverflow()
1132 maxLocal = pPage->maxLocal; in btreeParseCellAdjustSizeForOverflow()
1133 surplus = minLocal + (pInfo->nPayload - minLocal)%(pPage->pBt->usableSize-4); in btreeParseCellAdjustSizeForOverflow()
1148 static int btreePayloadToLocal(MemPage *pPage, i64 nPayload){ in btreePayloadToLocal() argument
1150 maxLocal = pPage->maxLocal; in btreePayloadToLocal()
1156 minLocal = pPage->minLocal; in btreePayloadToLocal()
1157 surplus = minLocal + (nPayload - minLocal)%(pPage->pBt->usableSize-4); in btreePayloadToLocal()
1177 MemPage *pPage, /* Page containing the cell */ in btreeParseCellPtrNoPayload() argument
1181 assert( sqlite3_mutex_held(pPage->pBt->mutex) ); in btreeParseCellPtrNoPayload()
1182 assert( pPage->leaf==0 ); in btreeParseCellPtrNoPayload()
1183 assert( pPage->childPtrSize==4 ); in btreeParseCellPtrNoPayload()
1185 UNUSED_PARAMETER(pPage); in btreeParseCellPtrNoPayload()
1194 MemPage *pPage, /* Page containing the cell */ in btreeParseCellPtr() argument
1202 assert( sqlite3_mutex_held(pPage->pBt->mutex) ); in btreeParseCellPtr()
1203 assert( pPage->leaf==0 || pPage->leaf==1 ); in btreeParseCellPtr()
1204 assert( pPage->intKeyLeaf ); in btreeParseCellPtr()
1205 assert( pPage->childPtrSize==0 ); in btreeParseCellPtr()
1262 testcase( nPayload==pPage->maxLocal ); in btreeParseCellPtr()
1263 testcase( nPayload==(u32)pPage->maxLocal+1 ); in btreeParseCellPtr()
1264 if( nPayload<=pPage->maxLocal ){ in btreeParseCellPtr()
1272 btreeParseCellAdjustSizeForOverflow(pPage, pCell, pInfo); in btreeParseCellPtr()
1276 MemPage *pPage, /* Page containing the cell */ in btreeParseCellPtrIndex() argument
1283 assert( sqlite3_mutex_held(pPage->pBt->mutex) ); in btreeParseCellPtrIndex()
1284 assert( pPage->leaf==0 || pPage->leaf==1 ); in btreeParseCellPtrIndex()
1285 assert( pPage->intKeyLeaf==0 ); in btreeParseCellPtrIndex()
1286 pIter = pCell + pPage->childPtrSize; in btreeParseCellPtrIndex()
1299 testcase( nPayload==pPage->maxLocal ); in btreeParseCellPtrIndex()
1300 testcase( nPayload==(u32)pPage->maxLocal+1 ); in btreeParseCellPtrIndex()
1301 if( nPayload<=pPage->maxLocal ){ in btreeParseCellPtrIndex()
1309 btreeParseCellAdjustSizeForOverflow(pPage, pCell, pInfo); in btreeParseCellPtrIndex()
1313 MemPage *pPage, /* Page containing the cell */ in btreeParseCell() argument
1317 pPage->xParseCell(pPage, findCell(pPage, iCell), pInfo); in btreeParseCell()
1333 static u16 cellSizePtr(MemPage *pPage, u8 *pCell){ in cellSizePtr() argument
1334 u8 *pIter = pCell + pPage->childPtrSize; /* For looping over bytes of pCell */ in cellSizePtr()
1344 pPage->xParseCell(pPage, pCell, &debuginfo); in cellSizePtr()
1356 testcase( nSize==pPage->maxLocal ); in cellSizePtr()
1357 testcase( nSize==(u32)pPage->maxLocal+1 ); in cellSizePtr()
1358 if( nSize<=pPage->maxLocal ){ in cellSizePtr()
1362 int minLocal = pPage->minLocal; in cellSizePtr()
1363 nSize = minLocal + (nSize - minLocal) % (pPage->pBt->usableSize - 4); in cellSizePtr()
1364 testcase( nSize==pPage->maxLocal ); in cellSizePtr()
1365 testcase( nSize==(u32)pPage->maxLocal+1 ); in cellSizePtr()
1366 if( nSize>pPage->maxLocal ){ in cellSizePtr()
1374 static u16 cellSizePtrNoPayload(MemPage *pPage, u8 *pCell){ in cellSizePtrNoPayload() argument
1384 pPage->xParseCell(pPage, pCell, &debuginfo); in cellSizePtrNoPayload()
1386 UNUSED_PARAMETER(pPage); in cellSizePtrNoPayload()
1389 assert( pPage->childPtrSize==4 ); in cellSizePtrNoPayload()
1395 static u16 cellSizePtrTableLeaf(MemPage *pPage, u8 *pCell){ in cellSizePtrTableLeaf() argument
1406 pPage->xParseCell(pPage, pCell, &debuginfo); in cellSizePtrTableLeaf()
1429 testcase( nSize==pPage->maxLocal ); in cellSizePtrTableLeaf()
1430 testcase( nSize==(u32)pPage->maxLocal+1 ); in cellSizePtrTableLeaf()
1431 if( nSize<=pPage->maxLocal ){ in cellSizePtrTableLeaf()
1435 int minLocal = pPage->minLocal; in cellSizePtrTableLeaf()
1436 nSize = minLocal + (nSize - minLocal) % (pPage->pBt->usableSize - 4); in cellSizePtrTableLeaf()
1437 testcase( nSize==pPage->maxLocal ); in cellSizePtrTableLeaf()
1438 testcase( nSize==(u32)pPage->maxLocal+1 ); in cellSizePtrTableLeaf()
1439 if( nSize>pPage->maxLocal ){ in cellSizePtrTableLeaf()
1452 static u16 cellSize(MemPage *pPage, int iCell){ in cellSize() argument
1453 return pPage->xCellSize(pPage, findCell(pPage, iCell)); in cellSize()
1464 static void ptrmapPutOvflPtr(MemPage *pPage, MemPage *pSrc, u8 *pCell,int *pRC){ in ptrmapPutOvflPtr() argument
1468 pPage->xParseCell(pPage, pCell, &info); in ptrmapPutOvflPtr()
1472 testcase( pSrc!=pPage ); in ptrmapPutOvflPtr()
1477 ptrmapPut(pPage->pBt, ovfl, PTRMAP_OVERFLOW1, pPage->pgno, pRC); in ptrmapPutOvflPtr()
1495 static int defragmentPage(MemPage *pPage, int nMaxFrag){ in defragmentPage() argument
1511 assert( sqlite3PagerIswriteable(pPage->pDbPage) ); in defragmentPage()
1512 assert( pPage->pBt!=0 ); in defragmentPage()
1513 assert( pPage->pBt->usableSize <= SQLITE_MAX_PAGE_SIZE ); in defragmentPage()
1514 assert( pPage->nOverflow==0 ); in defragmentPage()
1515 assert( sqlite3_mutex_held(pPage->pBt->mutex) ); in defragmentPage()
1516 data = pPage->aData; in defragmentPage()
1517 hdr = pPage->hdrOffset; in defragmentPage()
1518 cellOffset = pPage->cellOffset; in defragmentPage()
1519 nCell = pPage->nCell; in defragmentPage()
1522 usableSize = pPage->pBt->usableSize; in defragmentPage()
1531 if( iFree>usableSize-4 ) return SQLITE_CORRUPT_PAGE(pPage); in defragmentPage()
1534 if( iFree2>usableSize-4 ) return SQLITE_CORRUPT_PAGE(pPage); in defragmentPage()
1542 return SQLITE_CORRUPT_PAGE(pPage); in defragmentPage()
1545 if( iFree+sz>iFree2 ) return SQLITE_CORRUPT_PAGE(pPage); in defragmentPage()
1547 if( iFree2+sz2 > usableSize ) return SQLITE_CORRUPT_PAGE(pPage); in defragmentPage()
1551 return SQLITE_CORRUPT_PAGE(pPage); in defragmentPage()
1571 temp = sqlite3PagerTempSpace(pPage->pBt->pPager); in defragmentPage()
1584 return SQLITE_CORRUPT_PAGE(pPage); in defragmentPage()
1587 size = pPage->xCellSize(pPage, &src[pc]); in defragmentPage()
1590 return SQLITE_CORRUPT_PAGE(pPage); in defragmentPage()
1602 assert( pPage->nFree>=0 ); in defragmentPage()
1603 if( data[hdr+7]+cbrk-iCellFirst!=pPage->nFree ){ in defragmentPage()
1604 return SQLITE_CORRUPT_PAGE(pPage); in defragmentPage()
1611 assert( sqlite3PagerIswriteable(pPage->pDbPage) ); in defragmentPage()
1701 static int allocateSpace(MemPage *pPage, int nByte, int *pIdx){ in allocateSpace() argument
1702 const int hdr = pPage->hdrOffset; /* Local cache of pPage->hdrOffset */ in allocateSpace()
1703 u8 * const data = pPage->aData; /* Local cache of pPage->aData */ in allocateSpace()
1709 assert( sqlite3PagerIswriteable(pPage->pDbPage) ); in allocateSpace()
1710 assert( pPage->pBt ); in allocateSpace()
1711 assert( sqlite3_mutex_held(pPage->pBt->mutex) ); in allocateSpace()
1713 assert( pPage->nFree>=nByte ); in allocateSpace()
1714 assert( pPage->nOverflow==0 ); in allocateSpace()
1715 assert( nByte < (int)(pPage->pBt->usableSize-8) ); in allocateSpace()
1717 assert( pPage->cellOffset == hdr + 12 - 4*pPage->leaf ); in allocateSpace()
1718 gap = pPage->cellOffset + 2*pPage->nCell; in allocateSpace()
1727 assert( top<=(int)pPage->pBt->usableSize ); /* by btreeComputeFreeSpace() */ in allocateSpace()
1729 if( top==0 && pPage->pBt->usableSize==65536 ){ in allocateSpace()
1732 return SQLITE_CORRUPT_PAGE(pPage); in allocateSpace()
1744 u8 *pSpace = pageFindSlot(pPage, nByte, &rc); in allocateSpace()
1747 assert( pSpace+nByte<=data+pPage->pBt->usableSize ); in allocateSpace()
1750 return SQLITE_CORRUPT_PAGE(pPage); in allocateSpace()
1764 assert( pPage->nCell>0 || CORRUPT_DB ); in allocateSpace()
1765 assert( pPage->nFree>=0 ); in allocateSpace()
1766 rc = defragmentPage(pPage, MIN(4, pPage->nFree - (2+nByte))); in allocateSpace()
1781 assert( top+nByte <= (int)pPage->pBt->usableSize ); in allocateSpace()
1799 static int freeSpace(MemPage *pPage, u16 iStart, u16 iSize){ in freeSpace() argument
1807 unsigned char *data = pPage->aData; /* Page content */ in freeSpace()
1810 assert( pPage->pBt!=0 ); in freeSpace()
1811 assert( sqlite3PagerIswriteable(pPage->pDbPage) ); in freeSpace()
1812 assert( CORRUPT_DB || iStart>=pPage->hdrOffset+6+pPage->childPtrSize ); in freeSpace()
1813 assert( CORRUPT_DB || iEnd <= pPage->pBt->usableSize ); in freeSpace()
1814 assert( sqlite3_mutex_held(pPage->pBt->mutex) ); in freeSpace()
1816 assert( iStart<=pPage->pBt->usableSize-4 ); in freeSpace()
1821 hdr = pPage->hdrOffset; in freeSpace()
1829 return SQLITE_CORRUPT_PAGE(pPage); in freeSpace()
1833 if( iFreeBlk>pPage->pBt->usableSize-4 ){ /* TH3: corrupt081.100 */ in freeSpace()
1834 return SQLITE_CORRUPT_PAGE(pPage); in freeSpace()
1846 if( iEnd>iFreeBlk ) return SQLITE_CORRUPT_PAGE(pPage); in freeSpace()
1848 if( iEnd > pPage->pBt->usableSize ){ in freeSpace()
1849 return SQLITE_CORRUPT_PAGE(pPage); in freeSpace()
1862 if( iPtrEnd>iStart ) return SQLITE_CORRUPT_PAGE(pPage); in freeSpace()
1868 if( nFrag>data[hdr+7] ) return SQLITE_CORRUPT_PAGE(pPage); in freeSpace()
1877 if( iStart<x ) return SQLITE_CORRUPT_PAGE(pPage); in freeSpace()
1878 if( iPtr!=hdr+1 ) return SQLITE_CORRUPT_PAGE(pPage); in freeSpace()
1885 if( pPage->pBt->btsFlags & BTS_FAST_SECURE ){ in freeSpace()
1892 pPage->nFree += iOrigSize; in freeSpace()
1908 static int decodeFlags(MemPage *pPage, int flagByte){ in decodeFlags() argument
1911 assert( pPage->hdrOffset==(pPage->pgno==1 ? 100 : 0) ); in decodeFlags()
1912 assert( sqlite3_mutex_held(pPage->pBt->mutex) ); in decodeFlags()
1913 pPage->leaf = (u8)(flagByte>>3); assert( PTF_LEAF == 1<<3 ); in decodeFlags()
1915 pPage->childPtrSize = 4-4*pPage->leaf; in decodeFlags()
1916 pBt = pPage->pBt; in decodeFlags()
1924 pPage->intKey = 1; in decodeFlags()
1925 if( pPage->leaf ){ in decodeFlags()
1926 pPage->intKeyLeaf = 1; in decodeFlags()
1927 pPage->xCellSize = cellSizePtrTableLeaf; in decodeFlags()
1928 pPage->xParseCell = btreeParseCellPtr; in decodeFlags()
1930 pPage->intKeyLeaf = 0; in decodeFlags()
1931 pPage->xCellSize = cellSizePtrNoPayload; in decodeFlags()
1932 pPage->xParseCell = btreeParseCellPtrNoPayload; in decodeFlags()
1934 pPage->maxLocal = pBt->maxLeaf; in decodeFlags()
1935 pPage->minLocal = pBt->minLeaf; in decodeFlags()
1943 pPage->intKey = 0; in decodeFlags()
1944 pPage->intKeyLeaf = 0; in decodeFlags()
1945 pPage->xCellSize = cellSizePtr; in decodeFlags()
1946 pPage->xParseCell = btreeParseCellPtrIndex; in decodeFlags()
1947 pPage->maxLocal = pBt->maxLocal; in decodeFlags()
1948 pPage->minLocal = pBt->minLocal; in decodeFlags()
1952 pPage->intKey = 0; in decodeFlags()
1953 pPage->intKeyLeaf = 0; in decodeFlags()
1954 pPage->xCellSize = cellSizePtr; in decodeFlags()
1955 pPage->xParseCell = btreeParseCellPtrIndex; in decodeFlags()
1956 return SQLITE_CORRUPT_PAGE(pPage); in decodeFlags()
1958 pPage->max1bytePayload = pBt->max1bytePayload; in decodeFlags()
1966 static int btreeComputeFreeSpace(MemPage *pPage){ in btreeComputeFreeSpace() argument
1976 assert( pPage->pBt!=0 ); in btreeComputeFreeSpace()
1977 assert( pPage->pBt->db!=0 ); in btreeComputeFreeSpace()
1978 assert( sqlite3_mutex_held(pPage->pBt->mutex) ); in btreeComputeFreeSpace()
1979 assert( pPage->pgno==sqlite3PagerPagenumber(pPage->pDbPage) ); in btreeComputeFreeSpace()
1980 assert( pPage == sqlite3PagerGetExtra(pPage->pDbPage) ); in btreeComputeFreeSpace()
1981 assert( pPage->aData == sqlite3PagerGetData(pPage->pDbPage) ); in btreeComputeFreeSpace()
1982 assert( pPage->isInit==1 ); in btreeComputeFreeSpace()
1983 assert( pPage->nFree<0 ); in btreeComputeFreeSpace()
1985 usableSize = pPage->pBt->usableSize; in btreeComputeFreeSpace()
1986 hdr = pPage->hdrOffset; in btreeComputeFreeSpace()
1987 data = pPage->aData; in btreeComputeFreeSpace()
1992 iCellFirst = hdr + 8 + pPage->childPtrSize + 2*pPage->nCell; in btreeComputeFreeSpace()
2007 return SQLITE_CORRUPT_PAGE(pPage); in btreeComputeFreeSpace()
2012 return SQLITE_CORRUPT_PAGE(pPage); in btreeComputeFreeSpace()
2022 return SQLITE_CORRUPT_PAGE(pPage); in btreeComputeFreeSpace()
2026 return SQLITE_CORRUPT_PAGE(pPage); in btreeComputeFreeSpace()
2038 return SQLITE_CORRUPT_PAGE(pPage); in btreeComputeFreeSpace()
2040 pPage->nFree = (u16)(nFree - iCellFirst); in btreeComputeFreeSpace()
2048 static SQLITE_NOINLINE int btreeCellSizeCheck(MemPage *pPage){ in btreeCellSizeCheck() argument
2058 iCellFirst = pPage->cellOffset + 2*pPage->nCell; in btreeCellSizeCheck()
2059 usableSize = pPage->pBt->usableSize; in btreeCellSizeCheck()
2061 data = pPage->aData; in btreeCellSizeCheck()
2062 cellOffset = pPage->cellOffset; in btreeCellSizeCheck()
2063 if( !pPage->leaf ) iCellLast--; in btreeCellSizeCheck()
2064 for(i=0; i<pPage->nCell; i++){ in btreeCellSizeCheck()
2069 return SQLITE_CORRUPT_PAGE(pPage); in btreeCellSizeCheck()
2071 sz = pPage->xCellSize(pPage, &data[pc]); in btreeCellSizeCheck()
2074 return SQLITE_CORRUPT_PAGE(pPage); in btreeCellSizeCheck()
2089 static int btreeInitPage(MemPage *pPage){ in btreeInitPage() argument
2093 assert( pPage->pBt!=0 ); in btreeInitPage()
2094 assert( pPage->pBt->db!=0 ); in btreeInitPage()
2095 assert( sqlite3_mutex_held(pPage->pBt->mutex) ); in btreeInitPage()
2096 assert( pPage->pgno==sqlite3PagerPagenumber(pPage->pDbPage) ); in btreeInitPage()
2097 assert( pPage == sqlite3PagerGetExtra(pPage->pDbPage) ); in btreeInitPage()
2098 assert( pPage->aData == sqlite3PagerGetData(pPage->pDbPage) ); in btreeInitPage()
2099 assert( pPage->isInit==0 ); in btreeInitPage()
2101 pBt = pPage->pBt; in btreeInitPage()
2102 data = pPage->aData + pPage->hdrOffset; in btreeInitPage()
2105 if( decodeFlags(pPage, data[0]) ){ in btreeInitPage()
2106 return SQLITE_CORRUPT_PAGE(pPage); in btreeInitPage()
2109 pPage->maskPage = (u16)(pBt->pageSize - 1); in btreeInitPage()
2110 pPage->nOverflow = 0; in btreeInitPage()
2111 pPage->cellOffset = pPage->hdrOffset + 8 + pPage->childPtrSize; in btreeInitPage()
2112 pPage->aCellIdx = data + pPage->childPtrSize + 8; in btreeInitPage()
2113 pPage->aDataEnd = pPage->aData + pBt->pageSize; in btreeInitPage()
2114 pPage->aDataOfst = pPage->aData + pPage->childPtrSize; in btreeInitPage()
2117 pPage->nCell = get2byte(&data[3]); in btreeInitPage()
2118 if( pPage->nCell>MX_CELL(pBt) ){ in btreeInitPage()
2120 return SQLITE_CORRUPT_PAGE(pPage); in btreeInitPage()
2122 testcase( pPage->nCell==MX_CELL(pBt) ); in btreeInitPage()
2127 assert( pPage->nCell>0 in btreeInitPage()
2130 pPage->nFree = -1; /* Indicate that this value is yet uncomputed */ in btreeInitPage()
2131 pPage->isInit = 1; in btreeInitPage()
2133 return btreeCellSizeCheck(pPage); in btreeInitPage()
2142 static void zeroPage(MemPage *pPage, int flags){ in zeroPage() argument
2143 unsigned char *data = pPage->aData; in zeroPage()
2144 BtShared *pBt = pPage->pBt; in zeroPage()
2145 u8 hdr = pPage->hdrOffset; in zeroPage()
2148 assert( sqlite3PagerPagenumber(pPage->pDbPage)==pPage->pgno || CORRUPT_DB ); in zeroPage()
2149 assert( sqlite3PagerGetExtra(pPage->pDbPage) == (void*)pPage ); in zeroPage()
2150 assert( sqlite3PagerGetData(pPage->pDbPage) == data ); in zeroPage()
2151 assert( sqlite3PagerIswriteable(pPage->pDbPage) ); in zeroPage()
2161 pPage->nFree = (u16)(pBt->usableSize - first); in zeroPage()
2162 decodeFlags(pPage, flags); in zeroPage()
2163 pPage->cellOffset = first; in zeroPage()
2164 pPage->aDataEnd = &data[pBt->pageSize]; in zeroPage()
2165 pPage->aCellIdx = &data[first]; in zeroPage()
2166 pPage->aDataOfst = &data[pPage->childPtrSize]; in zeroPage()
2167 pPage->nOverflow = 0; in zeroPage()
2169 pPage->maskPage = (u16)(pBt->pageSize - 1); in zeroPage()
2170 pPage->nCell = 0; in zeroPage()
2171 pPage->isInit = 1; in zeroPage()
2180 MemPage *pPage = (MemPage*)sqlite3PagerGetExtra(pDbPage); in btreePageFromDbPage() local
2181 if( pgno!=pPage->pgno ){ in btreePageFromDbPage()
2182 pPage->aData = sqlite3PagerGetData(pDbPage); in btreePageFromDbPage()
2183 pPage->pDbPage = pDbPage; in btreePageFromDbPage()
2184 pPage->pBt = pBt; in btreePageFromDbPage()
2185 pPage->pgno = pgno; in btreePageFromDbPage()
2186 pPage->hdrOffset = pgno==1 ? 100 : 0; in btreePageFromDbPage()
2188 assert( pPage->aData==sqlite3PagerGetData(pDbPage) ); in btreePageFromDbPage()
2189 return pPage; in btreePageFromDbPage()
2270 assert( pCur==0 || ppPage==&pCur->pPage ); in getAndInitPage()
2306 pCur->pPage = pCur->apPage[pCur->iPage]; in getAndInitPage()
2319 static void releasePageNotNull(MemPage *pPage){ in releasePageNotNull() argument
2320 assert( pPage->aData ); in releasePageNotNull()
2321 assert( pPage->pBt ); in releasePageNotNull()
2322 assert( pPage->pDbPage!=0 ); in releasePageNotNull()
2323 assert( sqlite3PagerGetExtra(pPage->pDbPage) == (void*)pPage ); in releasePageNotNull()
2324 assert( sqlite3PagerGetData(pPage->pDbPage)==pPage->aData ); in releasePageNotNull()
2325 assert( sqlite3_mutex_held(pPage->pBt->mutex) ); in releasePageNotNull()
2326 sqlite3PagerUnrefNotNull(pPage->pDbPage); in releasePageNotNull()
2328 static void releasePage(MemPage *pPage){ in releasePage() argument
2329 if( pPage ) releasePageNotNull(pPage); in releasePage()
2331 static void releasePageOne(MemPage *pPage){ in releasePageOne() argument
2332 assert( pPage!=0 ); in releasePageOne()
2333 assert( pPage->aData ); in releasePageOne()
2334 assert( pPage->pBt ); in releasePageOne()
2335 assert( pPage->pDbPage!=0 ); in releasePageOne()
2336 assert( sqlite3PagerGetExtra(pPage->pDbPage) == (void*)pPage ); in releasePageOne()
2337 assert( sqlite3PagerGetData(pPage->pDbPage)==pPage->aData ); in releasePageOne()
2338 assert( sqlite3_mutex_held(pPage->pBt->mutex) ); in releasePageOne()
2339 sqlite3PagerUnrefPageOne(pPage->pDbPage); in releasePageOne()
2381 MemPage *pPage; in pageReinit() local
2382 pPage = (MemPage *)sqlite3PagerGetExtra(pData); in pageReinit()
2384 if( pPage->isInit ){ in pageReinit()
2385 assert( sqlite3_mutex_held(pPage->pBt->mutex) ); in pageReinit()
2386 pPage->isInit = 0; in pageReinit()
2394 btreeInitPage(pPage); in pageReinit()
3667 static int setChildPtrmaps(MemPage *pPage){ in setChildPtrmaps() argument
3671 BtShared *pBt = pPage->pBt; in setChildPtrmaps()
3672 Pgno pgno = pPage->pgno; in setChildPtrmaps()
3674 assert( sqlite3_mutex_held(pPage->pBt->mutex) ); in setChildPtrmaps()
3675 rc = pPage->isInit ? SQLITE_OK : btreeInitPage(pPage); in setChildPtrmaps()
3677 nCell = pPage->nCell; in setChildPtrmaps()
3680 u8 *pCell = findCell(pPage, i); in setChildPtrmaps()
3682 ptrmapPutOvflPtr(pPage, pPage, pCell, &rc); in setChildPtrmaps()
3684 if( !pPage->leaf ){ in setChildPtrmaps()
3690 if( !pPage->leaf ){ in setChildPtrmaps()
3691 Pgno childPgno = get4byte(&pPage->aData[pPage->hdrOffset+8]); in setChildPtrmaps()
3712 static int modifyPagePointer(MemPage *pPage, Pgno iFrom, Pgno iTo, u8 eType){ in modifyPagePointer() argument
3713 assert( sqlite3_mutex_held(pPage->pBt->mutex) ); in modifyPagePointer()
3714 assert( sqlite3PagerIswriteable(pPage->pDbPage) ); in modifyPagePointer()
3717 if( get4byte(pPage->aData)!=iFrom ){ in modifyPagePointer()
3718 return SQLITE_CORRUPT_PAGE(pPage); in modifyPagePointer()
3720 put4byte(pPage->aData, iTo); in modifyPagePointer()
3726 rc = pPage->isInit ? SQLITE_OK : btreeInitPage(pPage); in modifyPagePointer()
3728 nCell = pPage->nCell; in modifyPagePointer()
3731 u8 *pCell = findCell(pPage, i); in modifyPagePointer()
3734 pPage->xParseCell(pPage, pCell, &info); in modifyPagePointer()
3736 if( pCell+info.nSize > pPage->aData+pPage->pBt->usableSize ){ in modifyPagePointer()
3737 return SQLITE_CORRUPT_PAGE(pPage); in modifyPagePointer()
3745 if( pCell+4 > pPage->aData+pPage->pBt->usableSize ){ in modifyPagePointer()
3746 return SQLITE_CORRUPT_PAGE(pPage); in modifyPagePointer()
3757 get4byte(&pPage->aData[pPage->hdrOffset+8])!=iFrom ){ in modifyPagePointer()
3758 return SQLITE_CORRUPT_PAGE(pPage); in modifyPagePointer()
3760 put4byte(&pPage->aData[pPage->hdrOffset+8], iTo); in modifyPagePointer()
4698 btreeParseCell(pCur->pPage, pCur->ix, &info); in assertCellInfo()
4707 btreeParseCell(pCur->pPage,pCur->ix,&pCur->info); in getCellInfo()
4763 return (i64)pCur->pBt->pageSize*((i64)pCur->pPage->pgno - 1) + in sqlite3BtreeOffset()
4764 (i64)(pCur->info.pPayload - pCur->pPage->aData); in sqlite3BtreeOffset()
4829 MemPage *pPage = 0; in getOverflowPage() local
4863 rc = btreeGetPage(pBt, ovfl, &pPage, (ppPage==0) ? PAGER_GET_READONLY : 0); in getOverflowPage()
4864 assert( rc==SQLITE_OK || pPage==0 ); in getOverflowPage()
4866 next = get4byte(pPage->aData); in getOverflowPage()
4872 *ppPage = pPage; in getOverflowPage()
4874 releasePage(pPage); in getOverflowPage()
4950 MemPage *pPage = pCur->pPage; /* Btree page of current entry */ in accessPayload() local
4956 assert( pPage ); in accessPayload()
4959 if( pCur->ix>=pPage->nCell ){ in accessPayload()
4960 return SQLITE_CORRUPT_PAGE(pPage); in accessPayload()
4968 assert( aPayload > pPage->aData ); in accessPayload()
4969 if( (uptr)(aPayload - pPage->aData) > (pBt->usableSize - pCur->info.nLocal) ){ in accessPayload()
4975 return SQLITE_CORRUPT_PAGE(pPage); in accessPayload()
4984 rc = copyPayload(&aPayload[offset], pBuf, a, eOp, pPage->pDbPage); in accessPayload()
5122 return SQLITE_CORRUPT_PAGE(pPage); in accessPayload()
5147 assert( pCur->iPage>=0 && pCur->pPage ); in sqlite3BtreePayload()
5205 assert( pCur!=0 && pCur->iPage>=0 && pCur->pPage); in fetchPayload()
5209 assert( pCur->ix<pCur->pPage->nCell || CORRUPT_DB ); in fetchPayload()
5211 assert( pCur->info.pPayload>pCur->pPage->aData || CORRUPT_DB ); in fetchPayload()
5212 assert( pCur->info.pPayload<pCur->pPage->aDataEnd ||CORRUPT_DB); in fetchPayload()
5214 if( amt>(int)(pCur->pPage->aDataEnd - pCur->info.pPayload) ){ in fetchPayload()
5218 amt = MAX(0, (int)(pCur->pPage->aDataEnd - pCur->info.pPayload)); in fetchPayload()
5264 pCur->apPage[pCur->iPage] = pCur->pPage; in moveToChild()
5267 return getAndInitPage(pCur->pBt, newPgno, &pCur->pPage, pCur, in moveToChild()
5306 assert( pCur->pPage ); in moveToParent()
5310 pCur->pPage->pgno in moveToParent()
5316 pLeaf = pCur->pPage; in moveToParent()
5317 pCur->pPage = pCur->apPage[--pCur->iPage]; in moveToParent()
5355 releasePageNotNull(pCur->pPage); in moveToRoot()
5359 pRoot = pCur->pPage = pCur->apPage[0]; in moveToRoot()
5374 rc = getAndInitPage(pCur->pBt, pCur->pgnoRoot, &pCur->pPage, in moveToRoot()
5381 pCur->curIntKey = pCur->pPage->intKey; in moveToRoot()
5383 pRoot = pCur->pPage; in moveToRoot()
5398 return SQLITE_CORRUPT_PAGE(pCur->pPage); in moveToRoot()
5431 MemPage *pPage; in moveToLeftmost() local
5435 while( rc==SQLITE_OK && !(pPage = pCur->pPage)->leaf ){ in moveToLeftmost()
5436 assert( pCur->ix<pPage->nCell ); in moveToLeftmost()
5437 pgno = get4byte(findCell(pPage, pCur->ix)); in moveToLeftmost()
5456 MemPage *pPage = 0; in moveToRightmost() local
5460 while( !(pPage = pCur->pPage)->leaf ){ in moveToRightmost()
5461 pgno = get4byte(&pPage->aData[pPage->hdrOffset+8]); in moveToRightmost()
5462 pCur->ix = pPage->nCell; in moveToRightmost()
5466 pCur->ix = pPage->nCell-1; in moveToRightmost()
5483 assert( pCur->pPage->nCell>0 ); in sqlite3BtreeFirst()
5487 assert( pCur->pgnoRoot==0 || pCur->pPage->nCell==0 ); in sqlite3BtreeFirst()
5513 assert( pCur->ix==pCur->pPage->nCell-1 || CORRUPT_DB ); in sqlite3BtreeLast()
5514 testcase( pCur->ix!=pCur->pPage->nCell-1 ); in sqlite3BtreeLast()
5516 assert( pCur->pPage->leaf ); in sqlite3BtreeLast()
5533 assert( pCur->pgnoRoot==0 || pCur->pPage->nCell==0 ); in sqlite3BtreeLast()
5615 assert( pCur->pgnoRoot==0 || pCur->pPage->nCell==0 ); in sqlite3BtreeTableMoveto()
5621 assert( pCur->pPage ); in sqlite3BtreeTableMoveto()
5622 assert( pCur->pPage->isInit ); in sqlite3BtreeTableMoveto()
5624 assert( pCur->pPage->nCell > 0 ); in sqlite3BtreeTableMoveto()
5631 MemPage *pPage = pCur->pPage; in sqlite3BtreeTableMoveto() local
5640 assert( pPage->nCell>0 ); in sqlite3BtreeTableMoveto()
5641 assert( pPage->intKey ); in sqlite3BtreeTableMoveto()
5643 upr = pPage->nCell-1; in sqlite3BtreeTableMoveto()
5648 pCell = findCellPastPtr(pPage, idx); in sqlite3BtreeTableMoveto()
5649 if( pPage->intKeyLeaf ){ in sqlite3BtreeTableMoveto()
5651 if( pCell>=pPage->aDataEnd ){ in sqlite3BtreeTableMoveto()
5652 return SQLITE_CORRUPT_PAGE(pPage); in sqlite3BtreeTableMoveto()
5666 if( !pPage->leaf ){ in sqlite3BtreeTableMoveto()
5680 assert( lwr==upr+1 || !pPage->leaf ); in sqlite3BtreeTableMoveto()
5681 assert( pPage->isInit ); in sqlite3BtreeTableMoveto()
5682 if( pPage->leaf ){ in sqlite3BtreeTableMoveto()
5683 assert( pCur->ix<pCur->pPage->nCell ); in sqlite3BtreeTableMoveto()
5690 if( lwr>=pPage->nCell ){ in sqlite3BtreeTableMoveto()
5691 chldPg = get4byte(&pPage->aData[pPage->hdrOffset+8]); in sqlite3BtreeTableMoveto()
5693 chldPg = get4byte(findCell(pPage, lwr)); in sqlite3BtreeTableMoveto()
5727 MemPage *pPage = pCur->pPage; in indexCellCompare() local
5730 u8 *pCell = findCellPastPtr(pPage, idx); in indexCellCompare()
5733 if( nCell<=pPage->max1bytePayload ){ in indexCellCompare()
5737 testcase( pCell+nCell+1==pPage->aDataEnd ); in indexCellCompare()
5740 && (nCell = ((nCell&0x7f)<<7) + pCell[1])<=pPage->maxLocal in indexCellCompare()
5744 testcase( pCell+nCell+2==pPage->aDataEnd ); in indexCellCompare()
5762 MemPage *pPage = pCur->apPage[i]; in cursorOnLastPage() local
5763 if( pCur->aiIdx[i]<pPage->nCell ) return 0; in cursorOnLastPage()
5831 && pCur->pPage->leaf in sqlite3BtreeIndexMoveto()
5835 if( pCur->ix==pCur->pPage->nCell-1 in sqlite3BtreeIndexMoveto()
5847 if( !pCur->pPage->isInit ){ in sqlite3BtreeIndexMoveto()
5858 assert( pCur->pgnoRoot==0 || pCur->pPage->nCell==0 ); in sqlite3BtreeIndexMoveto()
5866 assert( pCur->pPage ); in sqlite3BtreeIndexMoveto()
5867 assert( pCur->pPage->isInit ); in sqlite3BtreeIndexMoveto()
5869 assert( pCur->pPage->nCell > 0 ); in sqlite3BtreeIndexMoveto()
5875 MemPage *pPage = pCur->pPage; in sqlite3BtreeIndexMoveto() local
5884 assert( pPage->nCell>0 ); in sqlite3BtreeIndexMoveto()
5885 assert( pPage->intKey==0 ); in sqlite3BtreeIndexMoveto()
5887 upr = pPage->nCell-1; in sqlite3BtreeIndexMoveto()
5891 pCell = findCellPastPtr(pPage, idx); in sqlite3BtreeIndexMoveto()
5902 if( nCell<=pPage->max1bytePayload ){ in sqlite3BtreeIndexMoveto()
5906 testcase( pCell+nCell+1==pPage->aDataEnd ); in sqlite3BtreeIndexMoveto()
5909 && (nCell = ((nCell&0x7f)<<7) + pCell[1])<=pPage->maxLocal in sqlite3BtreeIndexMoveto()
5913 testcase( pCell+nCell+2==pPage->aDataEnd ); in sqlite3BtreeIndexMoveto()
5926 u8 * const pCellBody = pCell - pPage->childPtrSize; in sqlite3BtreeIndexMoveto()
5928 pPage->xParseCell(pPage, pCellBody, &pCur->info); in sqlite3BtreeIndexMoveto()
5935 rc = SQLITE_CORRUPT_PAGE(pPage); in sqlite3BtreeIndexMoveto()
5974 assert( lwr==upr+1 || (pPage->intKey && !pPage->leaf) ); in sqlite3BtreeIndexMoveto()
5975 assert( pPage->isInit ); in sqlite3BtreeIndexMoveto()
5976 if( pPage->leaf ){ in sqlite3BtreeIndexMoveto()
5977 assert( pCur->ix<pCur->pPage->nCell || CORRUPT_DB ); in sqlite3BtreeIndexMoveto()
5983 if( lwr>=pPage->nCell ){ in sqlite3BtreeIndexMoveto()
5984 chldPg = get4byte(&pPage->aData[pPage->hdrOffset+8]); in sqlite3BtreeIndexMoveto()
5986 chldPg = get4byte(findCell(pPage, lwr)); in sqlite3BtreeIndexMoveto()
6030 if( NEVER(pCur->pPage->leaf==0) ) return -1; in sqlite3BtreeRowCountEst()
6032 n = pCur->pPage->nCell; in sqlite3BtreeRowCountEst()
6062 MemPage *pPage; in btreeNext() local
6080 pPage = pCur->pPage; in btreeNext()
6082 if( NEVER(!pPage->isInit) || sqlite3FaultSim(412) ){ in btreeNext()
6086 if( idx>=pPage->nCell ){ in btreeNext()
6087 if( !pPage->leaf ){ in btreeNext()
6088 rc = moveToChild(pCur, get4byte(&pPage->aData[pPage->hdrOffset+8])); in btreeNext()
6098 pPage = pCur->pPage; in btreeNext()
6099 }while( pCur->ix>=pPage->nCell ); in btreeNext()
6100 if( pPage->intKey ){ in btreeNext()
6106 if( pPage->leaf ){ in btreeNext()
6113 MemPage *pPage; in sqlite3BtreeNext() local
6120 pPage = pCur->pPage; in sqlite3BtreeNext()
6121 if( (++pCur->ix)>=pPage->nCell ){ in sqlite3BtreeNext()
6125 if( pPage->leaf ){ in sqlite3BtreeNext()
6154 MemPage *pPage; in btreePrevious() local
6173 pPage = pCur->pPage; in btreePrevious()
6174 assert( pPage->isInit ); in btreePrevious()
6175 if( !pPage->leaf ){ in btreePrevious()
6177 rc = moveToChild(pCur, get4byte(findCell(pPage, idx))); in btreePrevious()
6192 pPage = pCur->pPage; in btreePrevious()
6193 if( pPage->intKey && !pPage->leaf ){ in btreePrevious()
6209 || pCur->pPage->leaf==0 in sqlite3BtreePrevious()
6565 MemPage *pPage; /* Page being freed. May be NULL. */ in freePage2() local
6577 pPage = pMemPage; in freePage2()
6578 sqlite3PagerRef(pPage->pDbPage); in freePage2()
6580 pPage = btreePageLookup(pBt, iPage); in freePage2()
6593 if( (!pPage && ((rc = btreeGetPage(pBt, iPage, &pPage, 0))!=0) ) in freePage2()
6594 || ((rc = sqlite3PagerWrite(pPage->pDbPage))!=0) in freePage2()
6598 memset(pPage->aData, 0, pPage->pBt->pageSize); in freePage2()
6659 if( pPage && (pBt->btsFlags & BTS_SECURE_DELETE)==0 ){ in freePage2()
6660 sqlite3PagerDontWrite(pPage->pDbPage); in freePage2()
6664 TRACE(("FREE-PAGE: %d leaf on trunk page %d\n",pPage->pgno,pTrunk->pgno)); in freePage2()
6675 if( pPage==0 && SQLITE_OK!=(rc = btreeGetPage(pBt, iPage, &pPage, 0)) ){ in freePage2()
6678 rc = sqlite3PagerWrite(pPage->pDbPage); in freePage2()
6682 put4byte(pPage->aData, iTrunk); in freePage2()
6683 put4byte(&pPage->aData[4], 0); in freePage2()
6685 TRACE(("FREE-PAGE: %d new trunk page replacing %d\n", pPage->pgno, iTrunk)); in freePage2()
6688 if( pPage ){ in freePage2()
6689 pPage->isInit = 0; in freePage2()
6691 releasePage(pPage); in freePage2()
6695 static void freePage(MemPage *pPage, int *pRC){ in freePage() argument
6697 *pRC = freePage2(pPage->pBt, pPage, pPage->pgno); in freePage()
6705 MemPage *pPage, /* The page that contains the Cell */ in clearCellOverflow() argument
6715 assert( sqlite3_mutex_held(pPage->pBt->mutex) ); in clearCellOverflow()
6717 testcase( pCell + pInfo->nSize == pPage->aDataEnd ); in clearCellOverflow()
6718 testcase( pCell + (pInfo->nSize-1) == pPage->aDataEnd ); in clearCellOverflow()
6719 if( pCell + pInfo->nSize > pPage->aDataEnd ){ in clearCellOverflow()
6721 return SQLITE_CORRUPT_PAGE(pPage); in clearCellOverflow()
6724 pBt = pPage->pBt; in clearCellOverflow()
6778 #define BTREE_CLEAR_CELL(rc, pPage, pCell, sInfo) \ argument
6779 pPage->xParseCell(pPage, pCell, &sInfo); \
6781 rc = clearCellOverflow(pPage, pCell, &sInfo); \
6800 MemPage *pPage, /* The page that contains the cell */ in fillInCell() argument
6816 assert( sqlite3_mutex_held(pPage->pBt->mutex) ); in fillInCell()
6820 assert( pCell<pPage->aData || pCell>=&pPage->aData[pPage->pBt->pageSize] in fillInCell()
6821 || sqlite3PagerIswriteable(pPage->pDbPage) ); in fillInCell()
6824 nHeader = pPage->childPtrSize; in fillInCell()
6825 if( pPage->intKey ){ in fillInCell()
6829 assert( pPage->intKeyLeaf ); /* fillInCell() only called for leaves */ in fillInCell()
6841 if( nPayload<=pPage->maxLocal ){ in fillInCell()
6859 mn = pPage->minLocal; in fillInCell()
6860 n = mn + (nPayload - mn) % (pPage->pBt->usableSize - 4); in fillInCell()
6861 testcase( n==pPage->maxLocal ); in fillInCell()
6862 testcase( n==pPage->maxLocal+1 ); in fillInCell()
6863 if( n > pPage->maxLocal ) n = mn; in fillInCell()
6869 pBt = pPage->pBt; in fillInCell()
6886 pPage->xParseCell(pPage, pCell, &info); in fillInCell()
6905 assert( pPayload<pPage->aData || pPayload>=&pPage->aData[pBt->pageSize] in fillInCell()
6906 || sqlite3PagerIswriteable(pPage->pDbPage) ); in fillInCell()
6965 assert( pPrior<pPage->aData || pPrior>=&pPage->aData[pBt->pageSize] in fillInCell()
6966 || sqlite3PagerIswriteable(pPage->pDbPage) ); in fillInCell()
6989 static void dropCell(MemPage *pPage, int idx, int sz, int *pRC){ in dropCell() argument
6998 assert( idx<pPage->nCell ); in dropCell()
6999 assert( CORRUPT_DB || sz==cellSize(pPage, idx) ); in dropCell()
7000 assert( sqlite3PagerIswriteable(pPage->pDbPage) ); in dropCell()
7001 assert( sqlite3_mutex_held(pPage->pBt->mutex) ); in dropCell()
7002 assert( pPage->nFree>=0 ); in dropCell()
7003 data = pPage->aData; in dropCell()
7004 ptr = &pPage->aCellIdx[2*idx]; in dropCell()
7005 assert( pPage->pBt->usableSize > (u32)(ptr-data) ); in dropCell()
7007 hdr = pPage->hdrOffset; in dropCell()
7009 testcase( pc+sz==pPage->pBt->usableSize ); in dropCell()
7010 if( pc+sz > pPage->pBt->usableSize ){ in dropCell()
7014 rc = freeSpace(pPage, pc, sz); in dropCell()
7019 pPage->nCell--; in dropCell()
7020 if( pPage->nCell==0 ){ in dropCell()
7023 put2byte(&data[hdr+5], pPage->pBt->usableSize); in dropCell()
7024 pPage->nFree = pPage->pBt->usableSize - pPage->hdrOffset in dropCell()
7025 - pPage->childPtrSize - 8; in dropCell()
7027 memmove(ptr, ptr+2, 2*(pPage->nCell - idx)); in dropCell()
7028 put2byte(&data[hdr+3], pPage->nCell); in dropCell()
7029 pPage->nFree += 2; in dropCell()
7048 MemPage *pPage, /* Page into which we are copying */ in insertCell() argument
7062 assert( i>=0 && i<=pPage->nCell+pPage->nOverflow ); in insertCell()
7063 assert( MX_CELL(pPage->pBt)<=10921 ); in insertCell()
7064 assert( pPage->nCell<=MX_CELL(pPage->pBt) || CORRUPT_DB ); in insertCell()
7065 assert( pPage->nOverflow<=ArraySize(pPage->apOvfl) ); in insertCell()
7066 assert( ArraySize(pPage->apOvfl)==ArraySize(pPage->aiOvfl) ); in insertCell()
7067 assert( sqlite3_mutex_held(pPage->pBt->mutex) ); in insertCell()
7068 assert( sz==pPage->xCellSize(pPage, pCell) || CORRUPT_DB ); in insertCell()
7069 assert( pPage->nFree>=0 ); in insertCell()
7070 if( pPage->nOverflow || sz+2>pPage->nFree ){ in insertCell()
7078 j = pPage->nOverflow++; in insertCell()
7082 assert( j < ArraySize(pPage->apOvfl)-1 ); in insertCell()
7083 pPage->apOvfl[j] = pCell; in insertCell()
7084 pPage->aiOvfl[j] = (u16)i; in insertCell()
7091 assert( j==0 || pPage->aiOvfl[j-1]<(u16)i ); /* Overflows in sorted order */ in insertCell()
7092 assert( j==0 || i==pPage->aiOvfl[j-1]+1 ); /* Overflows are sequential */ in insertCell()
7094 int rc = sqlite3PagerWrite(pPage->pDbPage); in insertCell()
7099 assert( sqlite3PagerIswriteable(pPage->pDbPage) ); in insertCell()
7100 data = pPage->aData; in insertCell()
7101 assert( &data[pPage->cellOffset]==pPage->aCellIdx ); in insertCell()
7102 rc = allocateSpace(pPage, sz, &idx); in insertCell()
7107 assert( idx >= pPage->cellOffset+2*pPage->nCell+2 || CORRUPT_DB ); in insertCell()
7108 assert( idx+sz <= (int)pPage->pBt->usableSize ); in insertCell()
7109 pPage->nFree -= (u16)(2 + sz); in insertCell()
7121 pIns = pPage->aCellIdx + i*2; in insertCell()
7122 memmove(pIns+2, pIns, 2*(pPage->nCell - i)); in insertCell()
7124 pPage->nCell++; in insertCell()
7126 if( (++data[pPage->hdrOffset+4])==0 ) data[pPage->hdrOffset+3]++; in insertCell()
7127 assert( get2byte(&data[pPage->hdrOffset+3])==pPage->nCell || CORRUPT_DB ); in insertCell()
7129 if( pPage->pBt->autoVacuum ){ in insertCell()
7133 ptrmapPutOvflPtr(pPage, pPage, pCell, pRC); in insertCell()
7622 static int balance_quick(MemPage *pParent, MemPage *pPage, u8 *pSpace){ in balance_quick() argument
7623 BtShared *const pBt = pPage->pBt; /* B-Tree Database */ in balance_quick()
7628 assert( sqlite3_mutex_held(pPage->pBt->mutex) ); in balance_quick()
7630 assert( pPage->nOverflow==1 ); in balance_quick()
7632 if( pPage->nCell==0 ) return SQLITE_CORRUPT_BKPT; /* dbfuzz001.test */ in balance_quick()
7633 assert( pPage->nFree>=0 ); in balance_quick()
7645 u8 *pCell = pPage->apOvfl[0]; in balance_quick()
7646 u16 szCell = pPage->xCellSize(pPage, pCell); in balance_quick()
7651 assert( CORRUPT_DB || pPage->aData[0]==(PTF_INTKEY|PTF_LEAFDATA|PTF_LEAF) ); in balance_quick()
7654 b.pRef = pPage; in balance_quick()
7657 b.apEnd[0] = pPage->aDataEnd; in balance_quick()
7695 pCell = findCell(pPage, pPage->nCell-1); in balance_quick()
7704 0, pPage->pgno, &rc); in balance_quick()
7729 MemPage *pPage = apPage[i];
7730 BtShared *pBt = pPage->pBt;
7731 assert( pPage->isInit );
7733 for(j=0; j<pPage->nCell; j++){
7737 z = findCell(pPage, j);
7738 pPage->xParseCell(pPage, z, &info);
7742 assert( n==pPage->pgno && e==PTRMAP_OVERFLOW1 );
7744 if( !pPage->leaf ){
7747 assert( n==pPage->pgno && e==PTRMAP_BTREE );
7750 if( !pPage->leaf ){
7751 Pgno child = get4byte(&pPage->aData[pPage->hdrOffset+8]);
7753 assert( n==pPage->pgno && e==PTRMAP_BTREE );
8714 && pOther->pPage==pCur->pPage in anotherValidCursor()
8742 MemPage *pPage = pCur->pPage; in balance() local
8744 if( NEVER(pPage->nFree<0) && btreeComputeFreeSpace(pPage) ) break; in balance()
8745 if( pPage->nOverflow==0 && pPage->nFree*3<=(int)pCur->pBt->usableSize*2 ){ in balance()
8752 if( pPage->nOverflow && (rc = anotherValidCursor(pCur))==SQLITE_OK ){ in balance()
8760 rc = balance_deeper(pPage, &pCur->apPage[1]); in balance()
8765 pCur->apPage[0] = pPage; in balance()
8766 pCur->pPage = pCur->apPage[1]; in balance()
8767 assert( pCur->pPage->nOverflow ); in balance()
8772 }else if( sqlite3PagerPageRefcount(pPage->pDbPage)>1 ){ in balance()
8787 if( pPage->intKeyLeaf in balance()
8788 && pPage->nOverflow==1 in balance()
8789 && pPage->aiOvfl[0]==pPage->nCell in balance()
8808 rc = balance_quick(pParent, pPage, aBalanceQuickSpace); in balance()
8847 pPage->nOverflow = 0; in balance()
8850 releasePage(pPage); in balance()
8853 pCur->pPage = pCur->apPage[pCur->iPage]; in balance()
8867 MemPage *pPage, /* MemPage on which writing will occur */ in btreeOverwriteContent() argument
8879 int rc = sqlite3PagerWrite(pPage->pDbPage); in btreeOverwriteContent()
8887 int rc = btreeOverwriteContent(pPage, pDest+nData, pX, iOffset+nData, in btreeOverwriteContent()
8893 int rc = sqlite3PagerWrite(pPage->pDbPage); in btreeOverwriteContent()
8913 MemPage *pPage = pCur->pPage; /* Page being written */ in btreeOverwriteCell() local
8918 if( pCur->info.pPayload + pCur->info.nLocal > pPage->aDataEnd in btreeOverwriteCell()
8919 || pCur->info.pPayload < pPage->aData + pPage->cellOffset in btreeOverwriteCell()
8924 rc = btreeOverwriteContent(pPage, pCur->info.pPayload, pX, in btreeOverwriteCell()
8934 pBt = pPage->pBt; in btreeOverwriteCell()
8937 rc = btreeGetPage(pBt, ovflPgno, &pPage, 0); in btreeOverwriteCell()
8939 if( sqlite3PagerPageRefcount(pPage->pDbPage)!=1 || pPage->isInit ){ in btreeOverwriteCell()
8943 ovflPgno = get4byte(pPage->aData); in btreeOverwriteCell()
8947 rc = btreeOverwriteContent(pPage, pPage->aData+4, pX, in btreeOverwriteCell()
8950 sqlite3PagerUnref(pPage->pDbPage); in btreeOverwriteCell()
8998 MemPage *pPage; in sqlite3BtreeInsert() local
9144 pPage = pCur->pPage; in sqlite3BtreeInsert()
9145 assert( pPage->intKey || pX->nKey>=0 || (flags & BTREE_PREFORMAT) ); in sqlite3BtreeInsert()
9146 assert( pPage->leaf || !pPage->intKey ); in sqlite3BtreeInsert()
9147 if( pPage->nFree<0 ){ in sqlite3BtreeInsert()
9152 rc = btreeComputeFreeSpace(pPage); in sqlite3BtreeInsert()
9158 pCur->pgnoRoot, pX->nKey, pX->nData, pPage->pgno, in sqlite3BtreeInsert()
9160 assert( pPage->isInit || CORRUPT_DB ); in sqlite3BtreeInsert()
9167 if( ISAUTOVACUUM && szNew>pPage->maxLocal ){ in sqlite3BtreeInsert()
9169 pPage->xParseCell(pPage, newCell, &info); in sqlite3BtreeInsert()
9172 ptrmapPut(pBt, ovfl, PTRMAP_OVERFLOW1, pPage->pgno, &rc); in sqlite3BtreeInsert()
9176 rc = fillInCell(pPage, newCell, pX, &szNew); in sqlite3BtreeInsert()
9179 assert( szNew==pPage->xCellSize(pPage, newCell) ); in sqlite3BtreeInsert()
9185 if( idx>=pPage->nCell ){ in sqlite3BtreeInsert()
9188 rc = sqlite3PagerWrite(pPage->pDbPage); in sqlite3BtreeInsert()
9192 oldCell = findCell(pPage, idx); in sqlite3BtreeInsert()
9193 if( !pPage->leaf ){ in sqlite3BtreeInsert()
9196 BTREE_CLEAR_CELL(rc, pPage, oldCell, info); in sqlite3BtreeInsert()
9200 && (!ISAUTOVACUUM || szNew<pPage->minLocal) in sqlite3BtreeInsert()
9212 if( oldCell < pPage->aData+pPage->hdrOffset+10 ){ in sqlite3BtreeInsert()
9215 if( oldCell+szNew > pPage->aDataEnd ){ in sqlite3BtreeInsert()
9221 dropCell(pPage, idx, info.nSize, &rc); in sqlite3BtreeInsert()
9223 }else if( loc<0 && pPage->nCell>0 ){ in sqlite3BtreeInsert()
9224 assert( pPage->leaf ); in sqlite3BtreeInsert()
9228 assert( pPage->leaf ); in sqlite3BtreeInsert()
9230 insertCell(pPage, idx, newCell, szNew, 0, 0, &rc); in sqlite3BtreeInsert()
9231 assert( pPage->nOverflow==0 || rc==SQLITE_OK ); in sqlite3BtreeInsert()
9232 assert( rc!=SQLITE_OK || pPage->nCell>0 || pPage->nOverflow>0 ); in sqlite3BtreeInsert()
9255 if( pPage->nOverflow ){ in sqlite3BtreeInsert()
9264 pCur->pPage->nOverflow = 0; in sqlite3BtreeInsert()
9281 assert( pCur->iPage<0 || pCur->pPage->nOverflow==0 ); in sqlite3BtreeInsert()
9319 if( aIn+nIn>pSrc->pPage->aDataEnd ){ in sqlite3BtreeTransferRow()
9323 if( nIn==nRem && nIn<pDest->pPage->maxLocal ){ in sqlite3BtreeTransferRow()
9334 nOut = btreePayloadToLocal(pDest->pPage, pSrc->info.nPayload); in sqlite3BtreeTransferRow()
9342 if( aIn+nIn+4>pSrc->pPage->aDataEnd ){ in sqlite3BtreeTransferRow()
9420 MemPage *pPage; /* Page to delete cell from */ in sqlite3BtreeDelete() local
9447 pPage = pCur->pPage; in sqlite3BtreeDelete()
9448 if( pPage->nCell<=iCellIdx ){ in sqlite3BtreeDelete()
9451 pCell = findCell(pPage, iCellIdx); in sqlite3BtreeDelete()
9452 if( pPage->nFree<0 && btreeComputeFreeSpace(pPage) ){ in sqlite3BtreeDelete()
9474 if( !pPage->leaf in sqlite3BtreeDelete()
9475 || (pPage->nFree+pPage->xCellSize(pPage,pCell)+2) > in sqlite3BtreeDelete()
9477 || pPage->nCell==1 /* See dbfuzz001.test for a test case */ in sqlite3BtreeDelete()
9495 if( !pPage->leaf ){ in sqlite3BtreeDelete()
9517 rc = sqlite3PagerWrite(pPage->pDbPage); in sqlite3BtreeDelete()
9519 BTREE_CLEAR_CELL(rc, pPage, pCell, info); in sqlite3BtreeDelete()
9520 dropCell(pPage, iCellIdx, info.nSize, &rc); in sqlite3BtreeDelete()
9528 if( !pPage->leaf ){ in sqlite3BtreeDelete()
9529 MemPage *pLeaf = pCur->pPage; in sqlite3BtreeDelete()
9541 n = pCur->pPage->pgno; in sqlite3BtreeDelete()
9551 insertCell(pPage, iCellIdx, pCell-4, nCell+4, pTmp, n, &rc); in sqlite3BtreeDelete()
9572 assert( pCur->pPage->nOverflow==0 ); in sqlite3BtreeDelete()
9573 assert( pCur->pPage->nFree>=0 ); in sqlite3BtreeDelete()
9574 if( pCur->pPage->nFree*3<=(int)pCur->pBt->usableSize*2 ){ in sqlite3BtreeDelete()
9582 releasePageNotNull(pCur->pPage); in sqlite3BtreeDelete()
9587 pCur->pPage = pCur->apPage[pCur->iPage]; in sqlite3BtreeDelete()
9594 assert( pPage==pCur->pPage || CORRUPT_DB ); in sqlite3BtreeDelete()
9595 assert( (pPage->nCell>0 || CORRUPT_DB) && iCellIdx<=pPage->nCell ); in sqlite3BtreeDelete()
9597 if( iCellIdx>=pPage->nCell ){ in sqlite3BtreeDelete()
9599 pCur->ix = pPage->nCell-1; in sqlite3BtreeDelete()
9789 MemPage *pPage; in clearDatabasePage() local
9800 rc = getAndInitPage(pBt, pgno, &pPage, 0, 0); in clearDatabasePage()
9803 && sqlite3PagerPageRefcount(pPage->pDbPage) != (1 + (pgno==1)) in clearDatabasePage()
9808 hdr = pPage->hdrOffset; in clearDatabasePage()
9809 for(i=0; i<pPage->nCell; i++){ in clearDatabasePage()
9810 pCell = findCell(pPage, i); in clearDatabasePage()
9811 if( !pPage->leaf ){ in clearDatabasePage()
9815 BTREE_CLEAR_CELL(rc, pPage, pCell, info); in clearDatabasePage()
9818 if( !pPage->leaf ){ in clearDatabasePage()
9819 rc = clearDatabasePage(pBt, get4byte(&pPage->aData[hdr+8]), 1, pnChange); in clearDatabasePage()
9821 if( pPage->intKey ) pnChange = 0; in clearDatabasePage()
9824 testcase( !pPage->intKey ); in clearDatabasePage()
9825 *pnChange += pPage->nCell; in clearDatabasePage()
9828 freePage(pPage, &rc); in clearDatabasePage()
9829 }else if( (rc = sqlite3PagerWrite(pPage->pDbPage))==0 ){ in clearDatabasePage()
9830 zeroPage(pPage, pPage->aData[hdr] | PTF_LEAF); in clearDatabasePage()
9834 releasePage(pPage); in clearDatabasePage()
9902 MemPage *pPage = 0; in btreeDropTable() local
9914 rc = btreeGetPage(pBt, (Pgno)iTable, &pPage, 0); in btreeDropTable()
9916 releasePage(pPage); in btreeDropTable()
9923 freePage(pPage, &rc); in btreeDropTable()
9924 releasePage(pPage); in btreeDropTable()
9934 freePage(pPage, &rc); in btreeDropTable()
9935 releasePage(pPage); in btreeDropTable()
9945 releasePage(pPage); in btreeDropTable()
9979 freePage(pPage, &rc); in btreeDropTable()
9980 releasePage(pPage); in btreeDropTable()
10091 MemPage *pPage; /* Current page of the b-tree */ in sqlite3BtreeCount() local
10097 pPage = pCur->pPage; in sqlite3BtreeCount()
10098 if( pPage->leaf || !pPage->intKey ){ in sqlite3BtreeCount()
10099 nEntry += pPage->nCell; in sqlite3BtreeCount()
10112 if( pPage->leaf ){ in sqlite3BtreeCount()
10120 }while ( pCur->ix>=pCur->pPage->nCell ); in sqlite3BtreeCount()
10123 pPage = pCur->pPage; in sqlite3BtreeCount()
10130 if( iIdx==pPage->nCell ){ in sqlite3BtreeCount()
10131 rc = moveToChild(pCur, get4byte(&pPage->aData[pPage->hdrOffset+8])); in sqlite3BtreeCount()
10133 rc = moveToChild(pCur, get4byte(findCell(pPage, iIdx))); in sqlite3BtreeCount()
10393 MemPage *pPage = 0; /* The page being analyzed */ in checkTreePage() local
10427 if( (rc = btreeGetPage(pBt, iPage, &pPage, 0))!=0 ){ in checkTreePage()
10435 savedIsInit = pPage->isInit; in checkTreePage()
10436 pPage->isInit = 0; in checkTreePage()
10437 if( (rc = btreeInitPage(pPage))!=0 ){ in checkTreePage()
10443 if( (rc = btreeComputeFreeSpace(pPage))!=0 ){ in checkTreePage()
10448 data = pPage->aData; in checkTreePage()
10449 hdr = pPage->hdrOffset; in checkTreePage()
10459 assert( pPage->nCell==nCell ); in checkTreePage()
10463 cellStart = hdr + 12 - 4*pPage->leaf; in checkTreePage()
10464 assert( pPage->aCellIdx==&data[cellStart] ); in checkTreePage()
10467 if( !pPage->leaf ){ in checkTreePage()
10502 pPage->xParseCell(pPage, pCell, &info); in checkTreePage()
10510 if( pPage->intKey ){ in checkTreePage()
10533 if( !pPage->leaf ){ in checkTreePage()
10561 if( !pPage->leaf ){ in checkTreePage()
10567 size = pPage->xCellSize(pPage, &data[pc]); in checkTreePage()
10634 if( !doCoverageCheck ) pPage->isInit = savedIsInit; in checkTreePage()
10635 releasePage(pPage); in checkTreePage()
11005 assert( pCsr->pPage->intKey ); in sqlite3BtreePutData()