]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix a minor performance regression in btreeMoveto().
authordan <dan@noemail.net>
Mon, 5 Sep 2011 20:16:38 +0000 (20:16 +0000)
committerdan <dan@noemail.net>
Mon, 5 Sep 2011 20:16:38 +0000 (20:16 +0000)
FossilOrigin-Name: d0712dfb24867a807c9cddcc12bd0aebe1d3e085

manifest
manifest.uuid
src/btree.c
src/vdbeaux.c
src/vdbesort.c

index 6146f80f7a661c223f9539424fe39b22c92bc847..8a2d5d5008675cabebaf82363d5c3a8524237f4f 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Refactor\sthe\ssqlite3VdbeRecordUnpack()\sinterface\sto\sbetter\saccommodate\sthe\svdbesort.c\smodule.
-D 2011-09-05T14:20:27.320
+C Fix\sa\sminor\sperformance\sregression\sin\sbtreeMoveto().
+D 2011-09-05T20:16:38.385
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in d314143fa6be24828021d3f583ad37d9afdce505
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -124,7 +124,7 @@ F src/auth.c 523da7fb4979469955d822ff9298352d6b31de34
 F src/backup.c 28a4fe55327ff708bfaf9d4326d02686f7a553c3
 F src/bitvec.c af50f1c8c0ff54d6bdb7a80e2fceca5a93670bef
 F src/btmutex.c 976f45a12e37293e32cae0281b15a21d48a8aaa7
-F src/btree.c 958f26c8f5ff001791ba1ba3825e69d1a383c2fd
+F src/btree.c 4cb13cf019d1978b62494b970d20e9555211094b
 F src/btree.h f5d775cd6cfc7ac32a2535b70e8d2af48ef5f2ce
 F src/btreeInt.h 67978c014fa4f7cc874032dd3aacadd8db656bc3
 F src/build.c 851e81f26a75abbb98bd99a7c5f10e8670d867bb
@@ -242,10 +242,10 @@ F src/vdbe.c 7008edbf8f608d82c035dcb1c56367ad85e68aaa
 F src/vdbe.h a10b360bf69474babc8aba8fcc64b824c5e97d38
 F src/vdbeInt.h 693d6ac6810298fc6b4c503cfbe3f99a240f40af
 F src/vdbeapi.c 11dc47987abacb76ad016dcf5abc0dc422482a98
-F src/vdbeaux.c 8546b9481d8c642f2403ae8ebf20823b54e00606
+F src/vdbeaux.c 079d37d4afac8359b2bbbf4af9876be04cc857b8
 F src/vdbeblob.c f024f0bf420f36b070143c32b15cc7287341ffd3
 F src/vdbemem.c 5e6effb96dd53d233361cbfaa3f0a43b9af689e9
-F src/vdbesort.c 4f3265707c3277011fbb0c09d3d8e6461152f639
+F src/vdbesort.c 667bc65254a9ebaf7bc466ebb7e58884933e351f
 F src/vdbetrace.c 5d0dc3d5fd54878cc8d6d28eb41deb8d5885b114
 F src/vtab.c 901791a47318c0562cd0c676a2c6ff1bc530e582
 F src/wal.c 3154756177d6219e233d84291d5b05f4e06ff5e9
@@ -961,7 +961,7 @@ F tool/symbols.sh caaf6ccc7300fd43353318b44524853e222557d5
 F tool/tostr.awk e75472c2f98dd76e06b8c9c1367f4ab07e122d06
 F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
 F tool/warnings.sh b7fdb2cc525f5ef4fa43c80e771636dd3690f9d2
-P 6b657ae75035eb10b0ad640998d3c9eadfdffa6e
-R 17c6c62caa602109512a646943ac3f7f
+P f115b2303509c678dbe83b2fa3d9c40d82882813
+R 8196c804bc92b1e392918585a079f317
 U dan
-Z 1812248ebcb21a3973c4b6e0222ea90b
+Z 34f3f7e2b2b4331a7d1652f52697a006
index ecb95ed2508b5755135edc1954b93df92ec619d7..ee13ef1682213f5bb6298a204fac3e02d2ff517e 100644 (file)
@@ -1 +1 @@
-f115b2303509c678dbe83b2fa3d9c40d82882813
\ No newline at end of file
+d0712dfb24867a807c9cddcc12bd0aebe1d3e085
\ No newline at end of file
index 014267cc8477ac56d7ad9c8974cf09650a30df07..130673cdcfc933575bf09ea1e849037e4a58fd88 100644 (file)
@@ -669,7 +669,7 @@ static int btreeMoveto(
     pIdxKey = 0;
   }
   rc = sqlite3BtreeMovetoUnpacked(pCur, pIdxKey, nKey, bias, pRes);
-  if( pKey ){
+  if( pFree ){
     sqlite3DbFree(pCur->pKeyInfo->db, pFree);
   }
   return rc;
index 06ed06dfcb46e5db9066825cb1fe6edae6f38c4b..02fadabd87fe1781b8742087b113fc2fd1fa1fb1 100644 (file)
@@ -2859,18 +2859,19 @@ UnpackedRecord *sqlite3VdbeAllocUnpackedRecord(
   ** it by.  If pSpace is already 8-byte aligned, nOff should be zero.
   */
   nOff = (8 - (SQLITE_PTR_TO_INT(pSpace) & 7)) & 7;
-  pSpace += nOff;
-  szSpace -= nOff;
-
   nByte = ROUND8(sizeof(UnpackedRecord)) + sizeof(Mem)*(pKeyInfo->nField+1);
-  if( nByte>szSpace ){
+  if( nByte>szSpace+nOff ){
     p = (UnpackedRecord *)sqlite3DbMallocRaw(pKeyInfo->db, nByte);
     *ppFree = (char *)p;
+    if( !p ) return 0;
   }else{
-    p = (UnpackedRecord*)pSpace;
+    p = (UnpackedRecord*)&pSpace[nOff];
     *ppFree = 0;
   }
-  
+
+  p->aMem = (Mem*)&((char*)p)[ROUND8(sizeof(UnpackedRecord))];
+  p->pKeyInfo = pKeyInfo;
+  p->nField = pKeyInfo->nField + 1;
   return p;
 }
 
@@ -2890,12 +2891,9 @@ void sqlite3VdbeRecordUnpack(
   u32 idx;                        /* Offset in aKey[] to read from */
   u16 u;                          /* Unsigned loop counter */
   u32 szHdr;
-  Mem *pMem;
+  Mem *pMem = p->aMem;
 
   p->flags = 0;
-  p->pKeyInfo = pKeyInfo;
-  p->nField = pKeyInfo->nField + 1;
-  p->aMem = pMem = (Mem*)&((char*)p)[ROUND8(sizeof(UnpackedRecord))];
   assert( EIGHT_BYTE_ALIGNMENT(pMem) );
   idx = getVarint32(aKey, szHdr);
   d = szHdr;
index 79f17dcbc9236ad099f66278e4a8fd0e8eff05cd..ead2f453e4370e865bbd6acb5b7bbe69d64b7721 100644 (file)
@@ -310,28 +310,20 @@ static int vdbeSorterCompare(
   UnpackedRecord *r2 = pSorter->pUnpacked;
   int i;
 
-  if( r2==0 ){
-    char *pFree;
-    r2 = sqlite3VdbeAllocUnpackedRecord(pKeyInfo, 0, 0, &pFree);
-    if( r2==0 ) return SQLITE_NOMEM;
-    assert( pFree==(char *)r2 );
-    pSorter->pUnpacked = r2;
-  }
-
   if( pKey2 ){
     sqlite3VdbeRecordUnpack(pKeyInfo, nKey2, pKey2, r2);
   }
 
   if( bOmitRowid ){
-    for(i=0; i<r2->nField-1; i++){
+    r2->nField = pKeyInfo->nField;
+    assert( r2->nField>0 );
+    for(i=0; i<r2->nField; i++){
       if( r2->aMem[i].flags & MEM_Null ){
         *pRes = -1;
         return SQLITE_OK;
       }
     }
     r2->flags |= UNPACKED_PREFIX_MATCH;
-    r2->nField--;
-    assert( r2->nField>0 );
   }
 
   *pRes = sqlite3VdbeRecordCompare(nKey1, pKey1, r2);
@@ -397,12 +389,17 @@ int sqlite3VdbeSorterInit(sqlite3 *db, VdbeCursor *pCsr){
   int pgsz;                       /* Page size of main database */
   int mxCache;                    /* Cache size */
   VdbeSorter *pSorter;            /* The new sorter */
+  char *d;                        /* Dummy */
 
   assert( pCsr->pKeyInfo && pCsr->pBt==0 );
   pCsr->pSorter = pSorter = sqlite3DbMallocZero(db, sizeof(VdbeSorter));
   if( pSorter==0 ){
     return SQLITE_NOMEM;
   }
+  
+  pSorter->pUnpacked = sqlite3VdbeAllocUnpackedRecord(pCsr->pKeyInfo, 0, 0, &d);
+  if( pSorter->pUnpacked==0 ) return SQLITE_NOMEM;
+  assert( pSorter->pUnpacked==(UnpackedRecord *)d );
 
   if( !sqlite3TempInMemory(db) ){
     pgsz = sqlite3BtreeGetPageSize(db->aDb[0].pBt);