]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Do not clear the MemPage.nFree variable when insertCell() adds an overflow cell to...
authordanielk1977 <danielk1977@noemail.net>
Tue, 9 Jun 2009 09:41:00 +0000 (09:41 +0000)
committerdanielk1977 <danielk1977@noemail.net>
Tue, 9 Jun 2009 09:41:00 +0000 (09:41 +0000)
FossilOrigin-Name: 8f1c1f61f7bc5270212725cf0a056872df983f49

manifest
manifest.uuid
src/btree.c

index 10ee8765b8bc1a75f44aef8735cabdaf5044a204..280c4449803c7a9264be1fc1fd5d84fc67484136 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Additional\scomments\sto\sclarify\sthe\soperation\sof\sthe\sLIKE\soptimizer\sin\nwhere.c.\s(CVS\s6731)
-D 2009-06-08T19:44:37
+C Do\snot\sclear\sthe\sMemPage.nFree\svariable\swhen\sinsertCell()\sadds\san\soverflow\scell\sto\sa\spage.\sNot\sdoing\sthis\smeans\sbalance_quick()\scan\savoid\sa\scall\sto\ssqlite3BtreeInitPage().\s(CVS\s6732)
+D 2009-06-09T09:41:00
 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
 F Makefile.in 8b8fb7823264331210cddf103831816c286ba446
 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
@@ -106,7 +106,7 @@ F src/auth.c 98db07c2088455797678eb1031f42d4d94d18a71
 F src/backup.c ff50af53184a5fd7bdee4d620b5dabef74717c79
 F src/bitvec.c 0ef0651714728055d43de7a4cdd95e703fac0119
 F src/btmutex.c 9b899c0d8df3bd68f527b0afe03088321b696d3c
-F src/btree.c 50716b7a8bd32b9101bd3238ed7bd61fafe5cd67
+F src/btree.c 53c5df7ff0df6b3d089d1f93888c85195e3fd367
 F src/btree.h f70b694e8c163227369a66863b01fbff9009f323
 F src/btreeInt.h df64030d632f8c8ac217ed52e8b6b3eacacb33a5
 F src/build.c 20e02fd72249159ff6829009f3029d16d59cdff5
@@ -733,7 +733,7 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
 F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
 F tool/vdbe-compress.tcl 672f81d693a03f80f5ae60bfefacd8a349e76746
-P 6b42dc3d04e98f91c203c277926ed6ead62a9270
-R 69d714b02afbfbf66f436fb2d5f497ad
-U drh
-Z 112608f13ef95b6e8bc2968c1b5cb3e1
+P cc9c12170c3f6f0f485977e47e7fbb75c50e82b1
+R d036fc96778854a1f95e2dd9e0b87a34
+U danielk1977
+Z ee3eb7d6cafebd45a9fd708a20a004b3
index e19caec276251018e9630a225f9b077003979bdf..571c8c50c9d804d01640a30836d65c6a6735bb39 100644 (file)
@@ -1 +1 @@
-cc9c12170c3f6f0f485977e47e7fbb75c50e82b1
\ No newline at end of file
+8f1c1f61f7bc5270212725cf0a056872df983f49
\ No newline at end of file
index 9430b578715dbee9e6289728c0f0ec88fa7bc934..218f23f8a70b4e34bd07f235578d15c1ff0777e6 100644 (file)
@@ -9,7 +9,7 @@
 **    May you share freely, never taking more than you give.
 **
 *************************************************************************
-** $Id: btree.c,v 1.620 2009/06/08 14:49:46 danielk1977 Exp $
+** $Id: btree.c,v 1.621 2009/06/09 09:41:00 danielk1977 Exp $
 **
 ** This file implements a external (disk-based) database using BTrees.
 ** See the header comment on "btreeInt.h" for additional information.
@@ -5089,7 +5089,6 @@ static int insertCell(
     assert( j<(int)(sizeof(pPage->aOvfl)/sizeof(pPage->aOvfl[0])) );
     pPage->aOvfl[j].pCell = pCell;
     pPage->aOvfl[j].idx = (u16)i;
-    pPage->nFree = 0;
   }else{
     int rc = sqlite3PagerWrite(pPage->pDbPage);
     if( rc!=SQLITE_OK ){
@@ -5292,23 +5291,6 @@ static int balance_quick(MemPage *pParent, MemPage *pPage, u8 *pSpace){
 
     /* Release the reference to the new page. */
     releasePage(pNew);
-
-    /* At this point the pPage->nFree variable is not set correctly with
-    ** respect to the content of the page (because it was set to 0 by 
-    ** insertCell). So call sqlite3BtreeInitPage() to make sure it is
-    ** correct.
-    **
-    ** This has to be done even if an error will be returned. Normally, if
-    ** an error occurs during tree balancing, the contents of MemPage are
-    ** not important, as they will be recalculated when the page is rolled
-    ** back. But here, in balance_quick(), it is possible that pPage has 
-    ** not yet been marked dirty or written into the journal file. Therefore
-    ** it will not be rolled back and so it is important to make sure that
-    ** the page data and contents of MemPage are consistent.
-    */
-    pPage->isInit = 0;
-    sqlite3BtreeInitPage(pPage);
-    assert( pPage->nOverflow==0 );
   }
 
   return rc;
@@ -5341,10 +5323,10 @@ static int balance_quick(MemPage *pParent, MemPage *pPage, u8 *pSpace){
 ** is called recursively on the parent.
 **
 ** If this routine fails for any reason, it might leave the database
-** in a corrupted state.  So if this routine fails, the database should
+** in a corrupted state. So if this routine fails, the database should
 ** be rolled back.
 */
-static int balance_nonroot(MemPage *pParent, int iParentIdx, u8 *aSpace2){
+static int balance_nonroot(MemPage *pParent, int iParentIdx, u8 *aOvflSpace){
   BtShared *pBt;               /* The whole database */
   int nCell = 0;               /* Number of cells in apCell[] */
   int nMaxCells = 0;           /* Allocated size of apCell, szCell, aFrom. */
@@ -5359,7 +5341,7 @@ static int balance_nonroot(MemPage *pParent, int iParentIdx, u8 *aSpace2){
   int pageFlags;               /* Value of pPage->aData[0] */
   int subtotal;                /* Subtotal of bytes in cells on one page */
   int iSpace1 = 0;             /* First unused byte of aSpace1[] */
-  int iSpace2 = 0;             /* First unused byte of aSpace2[] */
+  int iOvflSpace = 0;          /* First unused byte of aOvflSpace[] */
   int szScratch;               /* Size of scratch memory requested */
   MemPage *apOld[NB];          /* pPage and up to two siblings */
   Pgno pgnoOld[NB];            /* Page numbers for each page in apOld[] */
@@ -5426,7 +5408,7 @@ static int balance_nonroot(MemPage *pParent, int iParentIdx, u8 *aSpace2){
      + pBt->pageSize                               /* aSpace1 */
      + (ISAUTOVACUUM ? nMaxCells : 0);             /* aFrom */
   apCell = sqlite3ScratchMalloc( szScratch ); 
-  if( apCell==0 ){
+  if( apCell==0 || aOvflSpace==0 ){
     rc = SQLITE_NOMEM;
     goto balance_cleanup;
   }
@@ -5442,11 +5424,6 @@ static int balance_nonroot(MemPage *pParent, int iParentIdx, u8 *aSpace2){
   if( ISAUTOVACUUM ){
     aFrom = &aSpace1[pBt->pageSize];
   }
-  /* aSpace2 = sqlite3PageMalloc(pBt->pageSize); */
-  if( aSpace2==0 ){
-    rc = SQLITE_NOMEM;
-    goto balance_cleanup;
-  }
   
   /*
   ** Make copies of the content of pPage and its siblings into aOld[].
@@ -5736,7 +5713,7 @@ static int balance_nonroot(MemPage *pParent, int iParentIdx, u8 *aSpace2){
       assert( j<nMaxCells );
       pCell = apCell[j];
       sz = szCell[j] + leafCorrection;
-      pTemp = &aSpace2[iSpace2];
+      pTemp = &aOvflSpace[iOvflSpace];
       if( !pNew->leaf ){
         memcpy(&pNew->aData[8], pCell, 4);
         if( ISAUTOVACUUM 
@@ -5780,9 +5757,9 @@ static int balance_nonroot(MemPage *pParent, int iParentIdx, u8 *aSpace2){
           sz = cellSizePtr(pParent, pCell);
         }
       }
-      iSpace2 += sz;
+      iOvflSpace += sz;
       assert( sz<=pBt->pageSize/4 );
-      assert( iSpace2<=pBt->pageSize );
+      assert( iOvflSpace<=pBt->pageSize );
       rc = insertCell(pParent, nxDiv, pCell, sz, pTemp, 4);
       if( rc!=SQLITE_OK ) goto balance_cleanup;
       assert( sqlite3PagerIswriteable(pParent->pDbPage) );
@@ -5915,7 +5892,6 @@ static int copyNodeContent(MemPage *pFrom, MemPage *pTo){
 ** shallower by one level.
 */
 static int balance_shallower(MemPage *pRoot){
-
   /* The root page is empty but has one child.  Transfer the
   ** information from that one child into the root page if it 
   ** will fit.  This reduces the depth of the tree by one.
@@ -5944,7 +5920,7 @@ static int balance_shallower(MemPage *pRoot){
   if( rc==SQLITE_OK ){
     if( pChild->nFree>=hdr ){
       if( hdr ){
-            rc = defragmentPage(pChild);
+        rc = defragmentPage(pChild);
       }
       if( rc==SQLITE_OK ){
         rc = copyNodeContent(pChild, pRoot);
@@ -6015,7 +5991,6 @@ static int balance_deeper(MemPage *pRoot, MemPage **ppChild){
   /* Copy the overflow cells from pRoot to pChild */
   memcpy(pChild->aOvfl, pRoot->aOvfl, pRoot->nOverflow*sizeof(pRoot->aOvfl[0]));
   pChild->nOverflow = pRoot->nOverflow;
-  pChild->nFree = 0;
 
   /* Zero the contents of pRoot. Then install pChild as the right-child. */
   zeroPage(pRoot, pChild->aData[0] & ~PTF_LEAF);