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