From: drh Date: Tue, 7 Aug 2012 22:53:01 +0000 (+0000) Subject: Simplifications to the sorter to support full-coverage testing. X-Git-Tag: version-3.7.14~40 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=07f547923ec911eaa3890db70f31d146b6b2053b;p=thirdparty%2Fsqlite.git Simplifications to the sorter to support full-coverage testing. FossilOrigin-Name: de804f4c90f02ca98991da185ed5e28bdd319e92 --- diff --git a/manifest b/manifest index 46bc3095bf..792599b37a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sextra\stests\sfor\ssecure-delete\smode. -D 2012-08-07T17:41:50.005 +C Simplifications\sto\sthe\ssorter\sto\ssupport\sfull-coverage\stesting. +D 2012-08-07T22:53:01.615 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in abd5c10d21d1395f140d9e50ea999df8fa4d6376 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -244,7 +244,7 @@ F src/vdbeapi.c 88ea823bbcb4320f5a6607f39cd7c2d3cc4c26b1 F src/vdbeaux.c dce80038c3c41f2680e5ab4dd0f7e0d8b7ff9071 F src/vdbeblob.c 32f2a4899d67f69634ea4dd93e3f651936d732cb F src/vdbemem.c cb55e84b8e2c15704968ee05f0fae25883299b74 -F src/vdbesort.c 4897215f0a0c4e731aa5ac5fc0317b62a4919e79 +F src/vdbesort.c bd5ce83f9314bfb632c8c653e9e81db31928a753 F src/vdbetrace.c 8bd5da325fc90f28464335e4cc4ad1407fe30835 F src/vtab.c bb8ea3a26608bb1357538a5d2fc72beba6638998 F src/wal.c 9294df6f96aae5909ae1a9b733fd1e1b4736978b @@ -1010,7 +1010,7 @@ F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381 F tool/win/sqlite.vsix 67d8a99aceb56384a81b3f30d6c71743146d2cc9 -P 17cb5e951e419b1221ae4595d20059d90a361a39 -R 2919015ca9831fb481e06469c7639f64 -U dan -Z af24cb62793571f094423bbb394787f8 +P e380cd3ce34d509e184081ecccf27fda11ce1da7 +R 01110266752aaa08ec8ada6a46e26710 +U drh +Z df7269861f33304988982e4a40d635e7 diff --git a/manifest.uuid b/manifest.uuid index a2792cb79e..487875b94f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e380cd3ce34d509e184081ecccf27fda11ce1da7 \ No newline at end of file +de804f4c90f02ca98991da185ed5e28bdd319e92 \ No newline at end of file diff --git a/src/vdbesort.c b/src/vdbesort.c index 6ec30954aa..63288cfa6b 100644 --- a/src/vdbesort.c +++ b/src/vdbesort.c @@ -125,11 +125,13 @@ struct VdbeSorterIter { }; /* -** An instance of this structure is used to separate the stream of records +** An instance of this structure is used to organize the stream of records ** being written to files by the merge-sort code into aligned, page-sized -** blocks. +** blocks. Doing all I/O in aligned page-sized blocks helps I/O to go +** faster on many operating systems. */ struct FileWriter { + int eFWErr; /* Non-zero if in an error state */ u8 *aBuffer; /* Pointer to write buffer */ int nBuffer; /* Size of write buffer in bytes */ int iBufStart; /* First byte of buffer to write */ @@ -264,15 +266,13 @@ static int vdbeSorterIterVarint(sqlite3 *db, VdbeSorterIter *p, u64 *pnOut){ if( iBuf && (p->nBuffer-iBuf)>=9 ){ p->iReadOff += sqlite3GetVarint(&p->aBuffer[iBuf], pnOut); }else{ - u8 aVarint[9]; - int i; - for(i=0; iaBuffer = (u8 *)sqlite3DbMallocRaw(db, nBuf); - if( !p->aBuffer ) return SQLITE_NOMEM; - - p->iBufEnd = p->iBufStart = (iStart % nBuf); - p->iWriteOff = iStart - p->iBufStart; - p->nBuffer = nBuf; - p->pFile = pFile; - return SQLITE_OK; + if( !p->aBuffer ){ + p->eFWErr = SQLITE_NOMEM; + }else{ + p->iBufEnd = p->iBufStart = (iStart % nBuf); + p->iWriteOff = iStart - p->iBufStart; + p->nBuffer = nBuf; + p->pFile = pFile; + } } /* ** Write nData bytes of data to the file-write object. Return SQLITE_OK ** if successful, or an SQLite error code if an error occurs. */ -static int fileWriterWrite(FileWriter *p, u8 *pData, int nData){ +static void fileWriterWrite(FileWriter *p, u8 *pData, int nData){ int nRem = nData; - while( nRem>0 ){ + while( nRem>0 && p->eFWErr==0 ){ int nCopy = nRem; if( nCopy>(p->nBuffer - p->iBufEnd) ){ nCopy = p->nBuffer - p->iBufEnd; @@ -648,11 +649,10 @@ static int fileWriterWrite(FileWriter *p, u8 *pData, int nData){ memcpy(&p->aBuffer[p->iBufEnd], &pData[nData-nRem], nCopy); p->iBufEnd += nCopy; if( p->iBufEnd==p->nBuffer ){ - int rc = sqlite3OsWrite(p->pFile, + p->eFWErr = sqlite3OsWrite(p->pFile, &p->aBuffer[p->iBufStart], p->iBufEnd - p->iBufStart, p->iWriteOff + p->iBufStart ); - if( rc!=SQLITE_OK ) return rc; p->iBufStart = p->iBufEnd = 0; p->iWriteOff += p->nBuffer; } @@ -660,8 +660,6 @@ static int fileWriterWrite(FileWriter *p, u8 *pData, int nData){ nRem -= nCopy; } - - return SQLITE_OK; } /* @@ -674,15 +672,16 @@ static int fileWriterWrite(FileWriter *p, u8 *pData, int nData){ ** last byte written to the file. */ static int fileWriterFinish(sqlite3 *db, FileWriter *p, i64 *piEof){ - int rc = SQLITE_OK; - if( p->aBuffer && p->iBufEnd>p->iBufStart ){ - rc = sqlite3OsWrite(p->pFile, + int rc; + if( p->eFWErr==0 && ALWAYS(p->aBuffer) && p->iBufEnd>p->iBufStart ){ + p->eFWErr = sqlite3OsWrite(p->pFile, &p->aBuffer[p->iBufStart], p->iBufEnd - p->iBufStart, p->iWriteOff + p->iBufStart ); } *piEof = (p->iWriteOff + p->iBufEnd); sqlite3DbFree(db, p->aBuffer); + rc = p->eFWErr; memset(p, 0, sizeof(FileWriter)); return rc; } @@ -691,11 +690,11 @@ static int fileWriterFinish(sqlite3 *db, FileWriter *p, i64 *piEof){ ** Write value iVal encoded as a varint to the file-write object. Return ** SQLITE_OK if successful, or an SQLite error code if an error occurs. */ -static int fileWriterWriteVarint(FileWriter *p, u64 iVal){ +static void fileWriterWriteVarint(FileWriter *p, u64 iVal){ int nByte; u8 aByte[10]; nByte = sqlite3PutVarint(aByte, iVal); - return fileWriterWrite(p, aByte, nByte); + fileWriterWrite(p, aByte, nByte); } /* @@ -713,7 +712,6 @@ static int fileWriterWriteVarint(FileWriter *p, u64 iVal){ */ static int vdbeSorterListToPMA(sqlite3 *db, const VdbeCursor *pCsr){ int rc = SQLITE_OK; /* Return code */ - int rc2; /* fileWriterFinish return code */ VdbeSorter *pSorter = pCsr->pSorter; FileWriter writer; @@ -734,33 +732,23 @@ static int vdbeSorterListToPMA(sqlite3 *db, const VdbeCursor *pCsr){ assert( pSorter->nPMA==0 ); } - if( rc==SQLITE_OK ){ - rc = fileWriterInit(db, pSorter->pTemp1, &writer, pSorter->iWriteOff); - } - if( rc==SQLITE_OK ){ SorterRecord *p; SorterRecord *pNext = 0; - + fileWriterInit(db, pSorter->pTemp1, &writer, pSorter->iWriteOff); pSorter->nPMA++; - rc = fileWriterWriteVarint(&writer, pSorter->nInMemory); - for(p=pSorter->pRecord; rc==SQLITE_OK && p; p=pNext){ + fileWriterWriteVarint(&writer, pSorter->nInMemory); + for(p=pSorter->pRecord; p; p=pNext){ pNext = p->pNext; - rc = fileWriterWriteVarint(&writer, p->nVal); - if( rc==SQLITE_OK ){ - rc = fileWriterWrite(&writer, p->pVal, p->nVal); - } - + fileWriterWriteVarint(&writer, p->nVal); + fileWriterWrite(&writer, p->pVal, p->nVal); sqlite3DbFree(db, p); } - pSorter->pRecord = p; + rc = fileWriterFinish(db, &writer, &pSorter->iWriteOff); } - rc2 = fileWriterFinish(db, &writer, &pSorter->iWriteOff); - if( rc==SQLITE_OK ) rc = rc2; - return rc; } @@ -920,31 +908,21 @@ int sqlite3VdbeSorterRewind(sqlite3 *db, const VdbeCursor *pCsr, int *pbEof){ rc = vdbeSorterOpenTempFile(db, &pTemp2); } - if( rc==SQLITE_OK ){ - rc = fileWriterInit(db, pTemp2, &writer, iWrite2); - } - if( rc==SQLITE_OK ){ - rc = fileWriterWriteVarint(&writer, nWrite); - } - if( rc==SQLITE_OK ){ int bEof = 0; + fileWriterInit(db, pTemp2, &writer, iWrite2); + fileWriterWriteVarint(&writer, nWrite); while( rc==SQLITE_OK && bEof==0 ){ VdbeSorterIter *pIter = &pSorter->aIter[ pSorter->aTree[1] ]; assert( pIter->pFile ); - rc = fileWriterWriteVarint(&writer, pIter->nKey); - if( rc==SQLITE_OK ){ - rc = fileWriterWrite(&writer, pIter->aKey, pIter->nKey); - } - if( rc==SQLITE_OK ){ - rc = sqlite3VdbeSorterNext(db, pCsr, &bEof); - } + fileWriterWriteVarint(&writer, pIter->nKey); + fileWriterWrite(&writer, pIter->aKey, pIter->nKey); + rc = sqlite3VdbeSorterNext(db, pCsr, &bEof); } + rc2 = fileWriterFinish(db, &writer, &iWrite2); + if( rc==SQLITE_OK ) rc = rc2; } - - rc2 = fileWriterFinish(db, &writer, &iWrite2); - if( rc==SQLITE_OK ) rc = rc2; } if( pSorter->nPMA<=SORTER_MAX_MERGE_COUNT ){