]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add the MemPage.noPayload boolean and use it to help
authordrh <drh@noemail.net>
Wed, 24 Sep 2014 00:59:08 +0000 (00:59 +0000)
committerdrh <drh@noemail.net>
Wed, 24 Sep 2014 00:59:08 +0000 (00:59 +0000)
cellSizePtr() and btreeParseCellPtr() run faster.

FossilOrigin-Name: 8e3375313ebbf26b68561f3ed31d2a488222e5d0

manifest
manifest.uuid
src/btree.c
src/btreeInt.h

index b80dfe9ce8c1c6525e7f68b8cc9fc3aed469ba1f..41868133a8eac4a5ca99d31ee569a0df4efca27d 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Remove\san\sunused\sC-preprocessor\smacro.\s\sNo\sfunctional\schanges\sto\sthe\scode.
-D 2014-09-23T23:12:53.118
+C Add\sthe\sMemPage.noPayload\sboolean\sand\suse\sit\sto\shelp\ncellSizePtr()\sand\sbtreeParseCellPtr()\srun\sfaster.
+D 2014-09-24T00:59:08.082
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in cf57f673d77606ab0f2d9627ca52a9ba1464146a
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -172,9 +172,9 @@ F src/auth.c d8abcde53426275dab6243b441256fcd8ccbebb2
 F src/backup.c a31809c65623cc41849b94d368917f8bb66e6a7e
 F src/bitvec.c 19a4ba637bd85f8f63fc8c9bae5ade9fb05ec1cb
 F src/btmutex.c 49ca66250c7dfa844a4d4cb8272b87420d27d3a5
-F src/btree.c b10d4c349e62faca4ff86f168a02ca9988d1fd6f
+F src/btree.c d64b3c5569bda0e7fbe9bc9388e17eaf70d63dec
 F src/btree.h a79aa6a71e7f1055f01052b7f821bd1c2dce95c8
-F src/btreeInt.h a5a869ec2c3e56ee9e214ee748d7942716be0340
+F src/btreeInt.h 9db0d303b203d18871dc9a1d78a3e1ae4d62c1ef
 F src/build.c 8dbca25988045fbf2a33c9631c42706fa6449e60
 F src/callback.c 7b44ce59674338ad48b0e84e7b72f935ea4f68b0
 F src/complete.c 535183afb3c75628b78ce82612931ac7cdf26f14
@@ -1200,7 +1200,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 4147f6671e3faa8ddffab8387a6c7d9b5b962fc8
-R ff3738f15db60d92a05b3981ec1f9ca5
+P f480582ccae0e9a917d4523191025bd16016ba64
+R a8f50a441085b36b058ddd2aec76446f
 U drh
-Z 53dcb91c2d5e4a116ccba455c707085a
+Z b0d06d7ed20970cccde4605a2a98dc92
index 71bf446c8dda7cb0260a42146922c72387a57f32..dae8a6ddc008aa5c48639975267d89d3be99797d 100644 (file)
@@ -1 +1 @@
-f480582ccae0e9a917d4523191025bd16016ba64
\ No newline at end of file
+8e3375313ebbf26b68561f3ed31d2a488222e5d0
\ No newline at end of file
index 5a0fd4e18406d2a860b4c0920ca228a08a142581..8644538abba6f3876d0ebbf7f853ce24b83f5225 100644 (file)
@@ -974,20 +974,25 @@ static void btreeParseCellPtr(
   u8 *pCell,              /* Pointer to the cell text. */
   CellInfo *pInfo         /* Fill in this structure */
 ){
-  u8 *pIter = &pCell[pPage->childPtrSize];
+  u8 *pIter;              /* For scanning through pCell */
   u32 nPayload;           /* Number of bytes of cell payload */
 
   assert( sqlite3_mutex_held(pPage->pBt->mutex) );
   assert( pPage->leaf==0 || pPage->leaf==1 );
-  if( pPage->intKey ){
-    if( pPage->hasData ){
-      assert( pIter==pCell );
-      pIter += getVarint32(pIter, nPayload);
-    }else{
-      nPayload = 0;
-    }
+  if( pPage->intKeyLeaf ){
+    assert( pPage->childPtrSize==0 );
+    pIter = pCell + getVarint32(pCell, nPayload);
     pIter += getVarint(pIter, (u64*)&pInfo->nKey);
+  }else if( pPage->noPayload ){
+    assert( pPage->childPtrSize==4 );
+    pInfo->nSize = 4 + getVarint(&pCell[4], (u64*)&pInfo->nKey);
+    pInfo->nPayload = 0;
+    pInfo->nLocal = 0;
+    pInfo->iOverflow = 0;
+    pInfo->pPayload = 0;
+    return;
   }else{
+    pIter = pCell + pPage->childPtrSize;
     pIter += getVarint32(pIter, nPayload);
     pInfo->nKey = nPayload;
   }
@@ -1046,9 +1051,9 @@ static void btreeParseCell(
 ** the space used by the cell pointer.
 */
 static u16 cellSizePtr(MemPage *pPage, u8 *pCell){
-  u8 *pIter = &pCell[pPage->childPtrSize];
-  u8 *pEnd;
-  u32 nSize;
+  u8 *pIter = pCell + pPage->childPtrSize;   /* For looping over bytes of pCell */
+  u8 *pEnd;                                  /* End mark for a varint */
+  u32 nSize;                                 /* Size value to return */
 
 #ifdef SQLITE_DEBUG
   /* The value returned by this function should always be the same as
@@ -1059,19 +1064,21 @@ static u16 cellSizePtr(MemPage *pPage, u8 *pCell){
   btreeParseCellPtr(pPage, pCell, &debuginfo);
 #endif
 
-  if( pPage->intKey==0 || pPage->hasData ){
-    nSize = *pIter;
-    if( nSize>=0x80 ){
-      pEnd = &pIter[9];
-      nSize &= 0x7f;
-      do{
-        nSize = (nSize<<7) | (*++pIter & 0x7f);
-      }while( *(pIter)>=0x80 && pIter<pEnd );
-    }
-    pIter++;
-  }else{
-    nSize = 0;
+  if( pPage->noPayload ){
+    pEnd = &pIter[9];
+    while( (*pIter++)&0x80 && pIter<pEnd );
+    assert( pPage->childPtrSize==4 );
+    return (u16)(pIter - pCell);
   }
+  nSize = *pIter;
+  if( nSize>=0x80 ){
+    pEnd = &pIter[9];
+    nSize &= 0x7f;
+    do{
+      nSize = (nSize<<7) | (*++pIter & 0x7f);
+    }while( *(pIter)>=0x80 && pIter<pEnd );
+  }
+  pIter++;
   if( pPage->intKey ){
     /* pIter now points at the 64-bit integer key value, a variable length 
     ** integer. The following block moves pIter to point at the first byte
@@ -1079,10 +1086,12 @@ static u16 cellSizePtr(MemPage *pPage, u8 *pCell){
     pEnd = &pIter[9];
     while( (*pIter++)&0x80 && pIter<pEnd );
   }
-
   testcase( nSize==pPage->maxLocal );
   testcase( nSize==pPage->maxLocal+1 );
-  if( nSize>pPage->maxLocal ){
+  if( nSize<=pPage->maxLocal ){
+    nSize += (u32)(pIter - pCell);
+    if( nSize<4 ) nSize = 4;
+  }else{
     int minLocal = pPage->minLocal;
     nSize = minLocal + (nSize - minLocal) % (pPage->pBt->usableSize - 4);
     testcase( nSize==pPage->maxLocal );
@@ -1090,15 +1099,8 @@ static u16 cellSizePtr(MemPage *pPage, u8 *pCell){
     if( nSize>pPage->maxLocal ){
       nSize = minLocal;
     }
-    nSize += 4;
+    nSize += 4 + (u16)(pIter - pCell);
   }
-  nSize += (u32)(pIter - pCell);
-
-  /* The minimum size of any cell is 4 bytes. */
-  if( nSize<4 ){
-    nSize = 4;
-  }
-
   assert( nSize==debuginfo.nSize || CORRUPT_DB );
   return (u16)nSize;
 }
@@ -1442,12 +1444,14 @@ static int decodeFlags(MemPage *pPage, int flagByte){
   pBt = pPage->pBt;
   if( flagByte==(PTF_LEAFDATA | PTF_INTKEY) ){
     pPage->intKey = 1;
-    pPage->hasData = pPage->leaf;
+    pPage->intKeyLeaf = pPage->leaf;
+    pPage->noPayload = !pPage->leaf;
     pPage->maxLocal = pBt->maxLeaf;
     pPage->minLocal = pBt->minLeaf;
   }else if( flagByte==PTF_ZERODATA ){
     pPage->intKey = 0;
-    pPage->hasData = 0;
+    pPage->intKeyLeaf = 0;
+    pPage->noPayload = 0;
     pPage->maxLocal = pBt->maxLocal;
     pPage->minLocal = pBt->minLocal;
   }else{
@@ -3855,7 +3859,7 @@ int sqlite3BtreeKeySize(BtCursor *pCur, i64 *pSize){
 int sqlite3BtreeDataSize(BtCursor *pCur, u32 *pSize){
   assert( cursorHoldsMutex(pCur) );
   assert( pCur->eState==CURSOR_VALID );
-  assert( pCur->apPage[pCur->iPage]->intKey==1 );
+  assert( pCur->apPage[pCur->iPage]->intKeyLeaf==1 );
   getCellInfo(pCur);
   *pSize = pCur->info.nPayload;
   return SQLITE_OK;
@@ -4690,7 +4694,7 @@ int sqlite3BtreeMovetoUnpacked(
       for(;;){
         i64 nCellKey;
         pCell = findCell(pPage, idx) + pPage->childPtrSize;
-        if( pPage->hasData ){
+        if( pPage->intKeyLeaf ){
           while( 0x80 <= *(pCell++) ){
             if( pCell>=pPage->aDataEnd ) return SQLITE_CORRUPT_BKPT;
           }
@@ -5617,8 +5621,7 @@ static int fillInCell(
   /* Fill in the header. */
   nHeader = pPage->childPtrSize;
   nPayload = nData + nZero;
-  if( pPage->hasData ){
-    assert( pPage->intKey );
+  if( pPage->intKeyLeaf ){
     nHeader += putVarint32(&pCell[nHeader], nPayload);
   }else{
     assert( nData==0 );
@@ -6391,7 +6394,7 @@ static int balance_nonroot(
   **       leafData:  1 if pPage holds key+data and pParent holds only keys.
   */
   leafCorrection = apOld[0]->leaf*4;
-  leafData = apOld[0]->hasData;
+  leafData = apOld[0]->intKeyLeaf;
   for(i=0; i<nOld; i++){
     int limit;
     
@@ -6967,7 +6970,7 @@ static int balance(BtCursor *pCur){
       rc = sqlite3PagerWrite(pParent->pDbPage);
       if( rc==SQLITE_OK ){
 #ifndef SQLITE_OMIT_QUICKBALANCE
-        if( pPage->hasData
+        if( pPage->intKeyLeaf
          && pPage->nOverflow==1
          && pPage->aiOvfl[0]==pPage->nCell
          && pParent->pgno!=1
index c9ff79c90f6feab365ad8b885b15f3550ca3670e..df9684e8e99757ed7cf1d6014674ca2497af8509 100644 (file)
@@ -273,9 +273,10 @@ typedef struct BtLock BtLock;
 struct MemPage {
   u8 isInit;           /* True if previously initialized. MUST BE FIRST! */
   u8 nOverflow;        /* Number of overflow cell bodies in aCell[] */
-  u8 intKey;           /* True if intkey flag is set */
-  u8 leaf;             /* True if leaf flag is set */
-  u8 hasData;          /* True if this page stores data */
+  u8 intKey;           /* True if table b-trees.  False for index b-trees */
+  u8 intKeyLeaf;       /* True if the leaf of an intKey table */
+  u8 noPayload;        /* True if internal intKey page (thus w/o data) */
+  u8 leaf;             /* True if a leaf page */
   u8 hdrOffset;        /* 100 for page 1.  0 otherwise */
   u8 childPtrSize;     /* 0 if leaf==1.  4 if leaf==0 */
   u8 max1bytePayload;  /* min(maxLocal,127) */