]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Simplifications to the sorter to support full-coverage testing.
authordrh <drh@noemail.net>
Tue, 7 Aug 2012 22:53:01 +0000 (22:53 +0000)
committerdrh <drh@noemail.net>
Tue, 7 Aug 2012 22:53:01 +0000 (22:53 +0000)
FossilOrigin-Name: de804f4c90f02ca98991da185ed5e28bdd319e92

manifest
manifest.uuid
src/vdbesort.c

index 46bc3095bf24d9c88a156bc00d2c3d7245b142a6..792599b37a6d1f0befd2a85c9eae6a33e37ccbf0 100644 (file)
--- 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
index a2792cb79ea507dbf6abad74753296070a1f71ff..487875b94fbfa81c14ce9e8430f7c591f99d75f3 100644 (file)
@@ -1 +1 @@
-e380cd3ce34d509e184081ecccf27fda11ce1da7
\ No newline at end of file
+de804f4c90f02ca98991da185ed5e28bdd319e92
\ No newline at end of file
index 6ec30954aa66d577d3f414cf8499fe973c2eb66d..63288cfa6b9644223a4c4b8b8ac856381b0b1256 100644 (file)
@@ -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; i<sizeof(aVarint); i++){
-      u8 *a;
-      int rc = vdbeSorterIterRead(db, p, 1, &a);
+    u8 aVarint[16], *a;
+    int i = 0, rc;
+    do{
+      rc = vdbeSorterIterRead(db, p, 1, &a);
       if( rc ) return rc;
-      aVarint[i] = *a;
-      if( (aVarint[i] & 0x80)==0 ) break;
-    }
+      aVarint[(i++)&0xf] = a[0];
+    }while( (a[0]&0x80)!=0 );
     sqlite3GetVarint(aVarint, pnOut);
   }
 
@@ -614,7 +614,7 @@ static int vdbeSorterSort(const VdbeCursor *pCsr){
 /*
 ** Initialize a file-writer object.
 */
-static int fileWriterInit(
+static void fileWriterInit(
   sqlite3 *db,                    /* Database (for malloc) */
   sqlite3_file *pFile,            /* File to write to */
   FileWriter *p,                  /* Object to populate */
@@ -624,22 +624,23 @@ static int fileWriterInit(
 
   memset(p, 0, sizeof(FileWriter));
   p->aBuffer = (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 ){