]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Reduce the amount of memcpy() required by defragmentPage().
authordrh <drh@noemail.net>
Sat, 27 Sep 2014 05:00:25 +0000 (05:00 +0000)
committerdrh <drh@noemail.net>
Sat, 27 Sep 2014 05:00:25 +0000 (05:00 +0000)
FossilOrigin-Name: 3edab9957cc7bb90b52fd40b02613c2cb03fc166

manifest
manifest.uuid
src/btree.c

index 131d77b3a985c53d1169d55c49fc1030e041943d..574bfe2c8d7aae49a371e42a058d26cc6e296fe0 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sthe\s"PRAGMA\sintegrity_check"\scommand\sso\sthat\sit\savoids\sformatting\serror\nmessage\scontext\smessages\suntil\sit\sactually\sneeds\sto\sgenerate\san\serror\smessage.\nThis\savoids\smuch\sformatting,\sand\shence\sgreatly\simproves\sthe\sperformance\sof\n"PRAGMA\sintegrity_check"\sin\sthe\scommon\scase\swhen\sthere\sare\sno\serrors.\s\sIt\salso\nmakes\sthe\scode\sa\slittle\ssmaller.
-D 2014-09-26T02:41:05.726
+C Reduce\sthe\samount\sof\smemcpy()\srequired\sby\sdefragmentPage().
+D 2014-09-27T05:00:25.096
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in cf57f673d77606ab0f2d9627ca52a9ba1464146a
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -172,7 +172,7 @@ F src/auth.c d8abcde53426275dab6243b441256fcd8ccbebb2
 F src/backup.c a31809c65623cc41849b94d368917f8bb66e6a7e
 F src/bitvec.c 19a4ba637bd85f8f63fc8c9bae5ade9fb05ec1cb
 F src/btmutex.c 49ca66250c7dfa844a4d4cb8272b87420d27d3a5
-F src/btree.c 59f03e421dad3cb6e27cc7d2393d3a7459be4b5e
+F src/btree.c 95a942a6ebdb23eb2a5d925526d35169aa6742f6
 F src/btree.h a79aa6a71e7f1055f01052b7f821bd1c2dce95c8
 F src/btreeInt.h 1bd7957161a1346a914f1f09231610e777a8e58d
 F src/build.c bde83dd5cf812e310a7e5ad2846790a14745bef4
@@ -1200,7 +1200,10 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P e93aecc090c2a1d3c231bb2bde044886eff0bdf7
-R 32be19747fff5e8f2465eed0f224b45d
+P 83913515830aa850f9e38406f9422d7e88dcab66
+R 66a1e1f00a844450677737824735607d
+T *branch * defrag-opt
+T *sym-defrag-opt *
+T -sym-trunk *
 U drh
-Z f56b9000203c19d0f3a8172e8374b279
+Z f60a1f2e4650c574e91ad245c0c67dee
index b182c8c3165d23503859d16ed7d53ee378245b22..bf8d17f152f84a1ac844771e98281e6d749195c1 100644 (file)
@@ -1 +1 @@
-83913515830aa850f9e38406f9422d7e88dcab66
\ No newline at end of file
+3edab9957cc7bb90b52fd40b02613c2cb03fc166
\ No newline at end of file
index 135b40139f70a2aae9d10fd8b8282ad379e9b6af..c4832b4ee900e1c7359109f63c5e8c440f946782 100644 (file)
@@ -1151,6 +1151,7 @@ static int defragmentPage(MemPage *pPage){
   int nCell;                 /* Number of cells on the page */
   unsigned char *data;       /* The page data */
   unsigned char *temp;       /* Temp area for cell content */
+  unsigned char *src;        /* Source of content */
   int iCellFirst;            /* First allowable cell index */
   int iCellLast;             /* Last possible cell index */
 
@@ -1160,15 +1161,13 @@ static int defragmentPage(MemPage *pPage){
   assert( pPage->pBt->usableSize <= SQLITE_MAX_PAGE_SIZE );
   assert( pPage->nOverflow==0 );
   assert( sqlite3_mutex_held(pPage->pBt->mutex) );
-  temp = sqlite3PagerTempSpace(pPage->pBt->pPager);
-  data = pPage->aData;
+  temp = 0;
+  src = data = pPage->aData;
   hdr = pPage->hdrOffset;
   cellOffset = pPage->cellOffset;
   nCell = pPage->nCell;
   assert( nCell==get2byte(&data[hdr+3]) );
   usableSize = pPage->pBt->usableSize;
-  cbrk = get2byte(&data[hdr+5]);
-  memcpy(&temp[cbrk], &data[cbrk], usableSize - cbrk);
   cbrk = usableSize;
   iCellFirst = cellOffset + 2*nCell;
   iCellLast = usableSize - 4;
@@ -1187,7 +1186,7 @@ static int defragmentPage(MemPage *pPage){
     }
 #endif
     assert( pc>=iCellFirst && pc<=iCellLast );
-    size = cellSizePtr(pPage, &temp[pc]);
+    size = cellSizePtr(pPage, &src[pc]);
     cbrk -= size;
 #if defined(SQLITE_ENABLE_OVERSIZE_CELL_CHECK)
     if( cbrk<iCellFirst ){
@@ -1201,8 +1200,16 @@ static int defragmentPage(MemPage *pPage){
     assert( cbrk+size<=usableSize && cbrk>=iCellFirst );
     testcase( cbrk+size==usableSize );
     testcase( pc+size==usableSize );
-    memcpy(&data[cbrk], &temp[pc], size);
     put2byte(pAddr, cbrk);
+    if( temp==0 ){
+      int x;
+      if( cbrk==pc ) continue;
+      temp = sqlite3PagerTempSpace(pPage->pBt->pPager);
+      x = get2byte(&data[hdr+5]);
+      memcpy(&temp[x], &data[x], (cbrk+size) - x);
+      src = temp;
+    }
+    memcpy(&data[cbrk], &src[pc], size);
   }
   assert( cbrk>=iCellFirst );
   put2byte(&data[hdr+5], cbrk);
@@ -5955,13 +5962,13 @@ static void assemblePage(
   assert( pPage->nCell==0 );
   assert( get2byteNotZero(&data[hdr+5])==nUsable );
 
-  pCellptr = &pPage->aCellIdx[nCell*2];
+  pCellptr = pPage->aCellIdx;
   cellbody = nUsable;
-  for(i=nCell-1; i>=0; i--){
+  for(i=0; i<nCell; i++){
     u16 sz = aSize[i];
-    pCellptr -= 2;
     cellbody -= sz;
     put2byte(pCellptr, cellbody);
+    pCellptr += 2;
     memcpy(&data[cellbody], apCell[i], sz);
   }
   put2byte(&data[hdr+3], nCell);