Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Fix a problem in the new b-tree balancer that was causing corruption of the fragmentation count. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
f242394e079dd185aad90f2aee902a5e |
User & Date: | drh 2014-11-27 03:46:04.203 |
Context
2014-11-27
| ||
04:23 | More test cases for the balancer. (check-in: 358ea818f7 user: drh tags: trunk) | |
03:46 | Fix a problem in the new b-tree balancer that was causing corruption of the fragmentation count. (check-in: f242394e07 user: drh tags: trunk) | |
2014-11-25
| ||
18:59 | Fix an integer overflow bug in vdbesort.c. (check-in: 6238271925 user: dan tags: trunk) | |
Changes
Changes to src/btree.c.
︙ | ︙ | |||
6253 6254 6255 6256 6257 6258 6259 6260 6261 6262 6263 6264 6265 6266 | assert( pFree>aData && (pFree - aData)<65536 ); freeSpace(pPg, (u16)(pFree - aData), szFree); } return nRet; } /* ** The pPg->nFree field is invalid when this function returns. It is the ** responsibility of the caller to set it correctly. */ static void editPage( MemPage *pPg, /* Edit this page */ int iOld, /* Index of first cell currently on page */ int iNew, /* Index of new first cell on page */ | > > > > > > > > | 6253 6254 6255 6256 6257 6258 6259 6260 6261 6262 6263 6264 6265 6266 6267 6268 6269 6270 6271 6272 6273 6274 | assert( pFree>aData && (pFree - aData)<65536 ); freeSpace(pPg, (u16)(pFree - aData), szFree); } return nRet; } /* ** apCell[] and szCell[] contains pointers to and sizes of all cells in the ** pages being balanced. The current page, pPg, has pPg->nCell cells starting ** with apCell[iOld]. After balancing, this page should hold nNew cells ** starting at apCell[iNew]. ** ** This routine makes the necessary adjustments to pPg so that it contains ** the correct cells after being balanced. ** ** The pPg->nFree field is invalid when this function returns. It is the ** responsibility of the caller to set it correctly. */ static void editPage( MemPage *pPg, /* Edit this page */ int iOld, /* Index of first cell currently on page */ int iNew, /* Index of new first cell on page */ |
︙ | ︙ | |||
6293 6294 6295 6296 6297 6298 6299 | } if( iNewEnd < iOldEnd ){ nCell -= pageFreeArray( pPg, iOldEnd-iNewEnd, &apCell[iNewEnd], &szCell[iNewEnd] ); } | | | > | 6301 6302 6303 6304 6305 6306 6307 6308 6309 6310 6311 6312 6313 6314 6315 6316 6317 6318 6319 6320 6321 | } if( iNewEnd < iOldEnd ){ nCell -= pageFreeArray( pPg, iOldEnd-iNewEnd, &apCell[iNewEnd], &szCell[iNewEnd] ); } pData = &aData[get2byteNotZero(&aData[hdr+5])]; if( pData<pBegin ) goto editpage_fail; /* Add cells to the start of the page */ if( iNew<iOld ){ int nAdd = MIN(nNew,iOld-iNew); assert( (iOld-iNew)<nNew || nCell==0 || CORRUPT_DB ); pCellptr = pPg->aCellIdx; memmove(&pCellptr[nAdd*2], pCellptr, nCell*2); if( pageInsertArray( pPg, pBegin, &pData, pCellptr, nAdd, &apCell[iNew], &szCell[iNew] ) ) goto editpage_fail; nCell += nAdd; |
︙ | ︙ |
Added test/btree01.test.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | # 2014-11-27 # # The author disclaims copyright to this source code. In place of # a legal notice, here is a blessing: # # May you do good and not evil. # May you find forgiveness for yourself and forgive others. # May you share freely, never taking more than you give. # #*********************************************************************** # # This file contains test cases for b-tree logic. # set testdir [file dirname $argv0] source $testdir/tester.tcl set testprefix btree01 # The refactoring on the b-tree balance() routine in check-in # http://www.sqlite.org/src/info/face33bea1ba3a (2014-10-27) # caused the integrity_check on the following SQL to fail. # do_execsql_test btree01-1.1 { PRAGMA page_size=65536; CREATE TABLE t1(a INTEGER PRIMARY KEY, b BLOB); WITH RECURSIVE c(i) AS (VALUES(1) UNION ALL SELECT i+1 FROM c WHERE i<30) INSERT INTO t1(a,b) SELECT i, zeroblob(6500) FROM c; UPDATE t1 SET b=zeroblob(3000); UPDATE t1 SET b=zeroblob(64000) WHERE a=2; PRAGMA integrity_check; } {ok} finish_test |