1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-08-08 14:02:16 +03:00

Remove an unused parameter from a function in vdbesort.c. Fix some comments and other details in the same file.

FossilOrigin-Name: 1a8498d8037a1b93e56951bbdbb76291bd5a4f87
This commit is contained in:
dan
2011-08-12 16:11:43 +00:00
parent 689ab89781
commit e6f7bc6379
5 changed files with 65 additions and 49 deletions

View File

@@ -1,5 +1,5 @@
C Add\sthe\sSQLITE_OMIT_MERGE_SORT\spre-processor\sdirective.\sTo\somit\sthe\scode\sin\svdbesort.c. C Remove\san\sunused\sparameter\sfrom\sa\sfunction\sin\svdbesort.c.\sFix\ssome\scomments\sand\sother\sdetails\sin\sthe\ssame\sfile.
D 2011-08-12T15:02:00.509 D 2011-08-12T16:11:43.093
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
F Makefile.in c1d7a7f4fd8da6b1815032efca950e3d5125407e F Makefile.in c1d7a7f4fd8da6b1815032efca950e3d5125407e
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -238,14 +238,14 @@ F src/update.c 74a6cfb34e9732c1e2a86278b229913b4b51eeec
F src/utf.c c53eb7404b3eb5c1cbb5655c6a7a0e0ce6bd50f0 F src/utf.c c53eb7404b3eb5c1cbb5655c6a7a0e0ce6bd50f0
F src/util.c 0f33bbbdfcc4a2d8cf20c3b2a16ffc3b57c58a70 F src/util.c 0f33bbbdfcc4a2d8cf20c3b2a16ffc3b57c58a70
F src/vacuum.c 05513dca036a1e7848fe18d5ed1265ac0b32365e F src/vacuum.c 05513dca036a1e7848fe18d5ed1265ac0b32365e
F src/vdbe.c eed17aa60343d7d19dc5110e0d4855695b7be9bb F src/vdbe.c 1f5bb8b8a0f24bd93e66958eaebd060ccee272a2
F src/vdbe.h 5cf09e7ee8a3f7d93bc51f196a96550786afe7a1 F src/vdbe.h 5cf09e7ee8a3f7d93bc51f196a96550786afe7a1
F src/vdbeInt.h 603b4ccc81ffd7e57f15e4bdecee6d593856eec7 F src/vdbeInt.h f9250326f264ca5f100acc19e9c07096bb889096
F src/vdbeapi.c 11dc47987abacb76ad016dcf5abc0dc422482a98 F src/vdbeapi.c 11dc47987abacb76ad016dcf5abc0dc422482a98
F src/vdbeaux.c 8fb978eb73a97b34d352dd3ef3bff35b1b3fa7e9 F src/vdbeaux.c 8fb978eb73a97b34d352dd3ef3bff35b1b3fa7e9
F src/vdbeblob.c f024f0bf420f36b070143c32b15cc7287341ffd3 F src/vdbeblob.c f024f0bf420f36b070143c32b15cc7287341ffd3
F src/vdbemem.c 0498796b6ffbe45e32960d6a1f5adfb6e419883b F src/vdbemem.c 0498796b6ffbe45e32960d6a1f5adfb6e419883b
F src/vdbesort.c b475ceede1837731f603f32ad28c3d59f07ec04e F src/vdbesort.c a756d20db3ff596dd3dd10f6a13fd832f5715540
F src/vdbetrace.c 5d0dc3d5fd54878cc8d6d28eb41deb8d5885b114 F src/vdbetrace.c 5d0dc3d5fd54878cc8d6d28eb41deb8d5885b114
F src/vtab.c 901791a47318c0562cd0c676a2c6ff1bc530e582 F src/vtab.c 901791a47318c0562cd0c676a2c6ff1bc530e582
F src/wal.c 0c70ad7b1cac6005fa5e2cbefd23ee05e391c290 F src/wal.c 0c70ad7b1cac6005fa5e2cbefd23ee05e391c290
@@ -955,7 +955,7 @@ F tool/symbols.sh caaf6ccc7300fd43353318b44524853e222557d5
F tool/tostr.awk 11760e1b94a5d3dcd42378f3cc18544c06cfa576 F tool/tostr.awk 11760e1b94a5d3dcd42378f3cc18544c06cfa576
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
F tool/warnings.sh 2ebae31e1eb352696f3c2f7706a34c084b28c262 F tool/warnings.sh 2ebae31e1eb352696f3c2f7706a34c084b28c262
P 87a15917d7d88285054e2a319506dd4a0cac9722 P 4ced2394b10d0a4f86422ff893bcdf3cf32591e3
R 8547f4d65e2fdae700fb2b829b9d1918 R ced8374c50fa0d83b7bc754994eec7c3
U dan U dan
Z 981ae6d6ebf67ae66ca60cea9244ff02 Z 2a841cd45d02eb2ca25a3f8996849530

View File

@@ -1 +1 @@
4ced2394b10d0a4f86422ff893bcdf3cf32591e3 1a8498d8037a1b93e56951bbdbb76291bd5a4f87

View File

@@ -4093,7 +4093,7 @@ case OP_RowData: {
if( isSorter(pC) ){ if( isSorter(pC) ){
assert( pOp->opcode==OP_RowKey ); assert( pOp->opcode==OP_RowKey );
rc = sqlite3VdbeSorterRowkey(db, pC, pOut); rc = sqlite3VdbeSorterRowkey(pC, pOut);
break; break;
} }

View File

@@ -396,14 +396,14 @@ void sqlite3VdbeMemStoreType(Mem *pMem);
# define sqlite3VdbeSorterInit(Y,Z) SQLITE_OK # define sqlite3VdbeSorterInit(Y,Z) SQLITE_OK
# define sqlite3VdbeSorterWrite(X,Y,Z) SQLITE_OK # define sqlite3VdbeSorterWrite(X,Y,Z) SQLITE_OK
# define sqlite3VdbeSorterClose(Y,Z) # define sqlite3VdbeSorterClose(Y,Z)
# define sqlite3VdbeSorterRowkey(X,Y,Z) SQLITE_OK # define sqlite3VdbeSorterRowkey(Y,Z) SQLITE_OK
# define sqlite3VdbeSorterRewind(X,Y,Z) SQLITE_OK # define sqlite3VdbeSorterRewind(X,Y,Z) SQLITE_OK
# define sqlite3VdbeSorterNext(X,Y,Z) SQLITE_OK # define sqlite3VdbeSorterNext(X,Y,Z) SQLITE_OK
#else #else
int sqlite3VdbeSorterInit(sqlite3 *, VdbeCursor *); int sqlite3VdbeSorterInit(sqlite3 *, VdbeCursor *);
int sqlite3VdbeSorterWrite(sqlite3 *, VdbeCursor *, int); int sqlite3VdbeSorterWrite(sqlite3 *, VdbeCursor *, int);
void sqlite3VdbeSorterClose(sqlite3 *, VdbeCursor *); void sqlite3VdbeSorterClose(sqlite3 *, VdbeCursor *);
int sqlite3VdbeSorterRowkey(sqlite3 *, VdbeCursor *, Mem *); int sqlite3VdbeSorterRowkey(VdbeCursor *, Mem *);
int sqlite3VdbeSorterRewind(sqlite3 *, VdbeCursor *, int *); int sqlite3VdbeSorterRewind(sqlite3 *, VdbeCursor *, int *);
int sqlite3VdbeSorterNext(sqlite3 *, VdbeCursor *, int *); int sqlite3VdbeSorterNext(sqlite3 *, VdbeCursor *, int *);
#endif #endif

View File

@@ -23,6 +23,8 @@
typedef struct VdbeSorterIter VdbeSorterIter; typedef struct VdbeSorterIter VdbeSorterIter;
/* /*
** NOTES ON DATA STRUCTURE USED FOR N-WAY MERGES:
**
** As keys are added to the sorter, they are written to disk in a series ** As keys are added to the sorter, they are written to disk in a series
** of sorted packed-memory-arrays (PMAs). The size of each PMA is roughly ** of sorted packed-memory-arrays (PMAs). The size of each PMA is roughly
** the same as the cache-size allowed for temporary databases. In order ** the same as the cache-size allowed for temporary databases. In order
@@ -116,7 +118,7 @@ struct VdbeSorterIter {
}; };
/* Minimum allowable value for the VdbeSorter.nWorking variable */ /* Minimum allowable value for the VdbeSorter.nWorking variable */
#define SORTER_MIN_SEGMENT_SIZE 10 #define SORTER_MIN_WORKING 10
/* Maximum number of segments to merge in a single pass. */ /* Maximum number of segments to merge in a single pass. */
#define SORTER_MAX_MERGE_COUNT 16 #define SORTER_MAX_MERGE_COUNT 16
@@ -131,20 +133,22 @@ static void vdbeSorterIterZero(sqlite3 *db, VdbeSorterIter *pIter){
} }
/* /*
** Advance iterator pIter to the next key in its PMA. ** Advance iterator pIter to the next key in its PMA. Return SQLITE_OK if
** no error occurs, or an SQLite error code if one does.
*/ */
static int vdbeSorterIterNext( static int vdbeSorterIterNext(
sqlite3 *db, /* Database handle (for sqlite3DbMalloc() ) */ sqlite3 *db, /* Database handle (for sqlite3DbMalloc() ) */
VdbeSorterIter *pIter /* Iterator to advance */ VdbeSorterIter *pIter /* Iterator to advance */
){ ){
int rc; int rc; /* Return Code */
int nRead; int nRead; /* Number of bytes read */
int nRec; int nRec; /* Size of record in bytes */
int iOff; int iOff; /* Size of serialized size varint in bytes */
nRead = pIter->iEof - pIter->iReadOff; nRead = pIter->iEof - pIter->iReadOff;
if( nRead>5 ) nRead = 5; if( nRead>5 ) nRead = 5;
if( nRead<=0 ){ if( nRead<=0 ){
/* This is an EOF condition */
vdbeSorterIterZero(db, pIter); vdbeSorterIterZero(db, pIter);
return SQLITE_OK; return SQLITE_OK;
} }
@@ -153,7 +157,7 @@ static int vdbeSorterIterNext(
iOff = getVarint32(pIter->aAlloc, nRec); iOff = getVarint32(pIter->aAlloc, nRec);
if( rc==SQLITE_OK && (iOff+nRec)>nRead ){ if( rc==SQLITE_OK && (iOff+nRec)>nRead ){
int nRead2; int nRead2; /* Number of extra bytes to read */
if( (iOff+nRec)>pIter->nAlloc ){ if( (iOff+nRec)>pIter->nAlloc ){
int nNew = pIter->nAlloc*2; int nNew = pIter->nAlloc*2;
while( (iOff+nRec)>nNew ) nNew = nNew*2; while( (iOff+nRec)>nNew ) nNew = nNew*2;
@@ -169,7 +173,6 @@ static int vdbeSorterIterNext(
} }
assert( nRec>0 || rc!=SQLITE_OK ); assert( nRec>0 || rc!=SQLITE_OK );
pIter->iReadOff += iOff+nRec; pIter->iReadOff += iOff+nRec;
pIter->nKey = nRec; pIter->nKey = nRec;
pIter->aKey = &pIter->aAlloc[iOff]; pIter->aKey = &pIter->aAlloc[iOff];
@@ -185,9 +188,9 @@ static int vdbeSorterIterNext(
** incremented by the number of bytes written. ** incremented by the number of bytes written.
*/ */
static int vdbeSorterWriteVarint( static int vdbeSorterWriteVarint(
sqlite3_file *pFile, sqlite3_file *pFile, /* File to write to */
i64 iVal, i64 iVal, /* Value to write as a varint */
i64 *piOffset i64 *piOffset /* IN/OUT: Write offset in file pFile */
){ ){
u8 aVarint[9]; /* Buffer large enough for a varint */ u8 aVarint[9]; /* Buffer large enough for a varint */
int nVarint; /* Number of used bytes in varint */ int nVarint; /* Number of used bytes in varint */
@@ -212,9 +215,9 @@ static int vdbeSorterWriteVarint(
** both *piOffset and *piVal are undefined. ** both *piOffset and *piVal are undefined.
*/ */
static int vdbeSorterReadVarint( static int vdbeSorterReadVarint(
sqlite3_file *pFile, sqlite3_file *pFile, /* File to read from */
i64 iEof, /* Total number of bytes in file */ i64 iEof, /* Total number of bytes in file */
i64 *piOffset, /* IN/OUT: Read offset */ i64 *piOffset, /* IN/OUT: Read offset in pFile */
i64 *piVal /* OUT: Value read from file */ i64 *piVal /* OUT: Value read from file */
){ ){
u8 aVarint[9]; /* Buffer large enough for a varint */ u8 aVarint[9]; /* Buffer large enough for a varint */
@@ -249,9 +252,8 @@ static int vdbeSorterIterInit(
i64 *pnByte /* IN/OUT: Increment this value by PMA size */ i64 *pnByte /* IN/OUT: Increment this value by PMA size */
){ ){
int rc; int rc;
i64 iEof = pSorter->iWriteOff;
assert( iEof>iStart ); assert( pSorter->iWriteOff>iStart );
assert( pIter->aAlloc==0 ); assert( pIter->aAlloc==0 );
pIter->pFile = pSorter->pTemp1; pIter->pFile = pSorter->pTemp1;
pIter->iReadOff = iStart; pIter->iReadOff = iStart;
@@ -260,7 +262,8 @@ static int vdbeSorterIterInit(
if( !pIter->aAlloc ){ if( !pIter->aAlloc ){
rc = SQLITE_NOMEM; rc = SQLITE_NOMEM;
}else{ }else{
i64 nByte; i64 iEof = pSorter->iWriteOff; /* EOF of file pSorter->pTemp1 */
i64 nByte; /* Total size of PMA in bytes */
rc = vdbeSorterReadVarint(pSorter->pTemp1, iEof, &pIter->iReadOff, &nByte); rc = vdbeSorterReadVarint(pSorter->pTemp1, iEof, &pIter->iReadOff, &nByte);
*pnByte += nByte; *pnByte += nByte;
pIter->iEof = pIter->iReadOff + nByte; pIter->iEof = pIter->iReadOff + nByte;
@@ -326,15 +329,9 @@ static int vdbeSorterDoCompare(VdbeCursor *pCsr, int iOut){
** Initialize the temporary index cursor just opened as a sorter cursor. ** Initialize the temporary index cursor just opened as a sorter cursor.
*/ */
int sqlite3VdbeSorterInit(sqlite3 *db, VdbeCursor *pCsr){ int sqlite3VdbeSorterInit(sqlite3 *db, VdbeCursor *pCsr){
VdbeSorter *pSorter; /* Allocated sorter object */
/* Cursor must be a temp cursor and not open on an intkey table */
assert( pCsr->pKeyInfo && pCsr->pBt ); assert( pCsr->pKeyInfo && pCsr->pBt );
pCsr->pSorter = sqlite3DbMallocZero(db, sizeof(VdbeSorter));
pSorter = sqlite3DbMallocZero(db, sizeof(VdbeSorter)); return (pCsr->pSorter ? SQLITE_NOMEM : SQLITE_OK);
if( !pSorter ) return SQLITE_NOMEM;
pCsr->pSorter = pSorter;
return SQLITE_OK;
} }
/* /*
@@ -376,17 +373,24 @@ static int vdbeSorterOpenTempFile(sqlite3 *db, sqlite3_file **ppFile){
/* /*
** Write the current contents of the b-tree to a PMA. Return SQLITE_OK ** Write the current contents of the b-tree to a PMA. Return SQLITE_OK
** if successful, or an SQLite error code otherwise. ** if successful, or an SQLite error code otherwise.
**
** The format of a PMA is:
**
** * A varint. This varint contains the total number of bytes of content
** in the PMA (not including the varint itself).
**
** * One or more records packed end-to-end in order of ascending keys.
** Each record consists of a varint followed by a blob of data (the
** key). The varint is the number of bytes in the blob of data.
*/ */
static int vdbeSorterBtreeToPMA(sqlite3 *db, VdbeCursor *pCsr){ static int vdbeSorterBtreeToPMA(sqlite3 *db, VdbeCursor *pCsr){
int rc = SQLITE_OK; /* Return code */ int rc = SQLITE_OK; /* Return code */
VdbeSorter *pSorter = pCsr->pSorter; VdbeSorter *pSorter = pCsr->pSorter;
i64 iWriteOff = pSorter->iWriteOff;
int res = 0; int res = 0;
void *aMalloc = 0;
int nMalloc = 0;
rc = sqlite3BtreeFirst(pCsr->pCursor, &res); rc = sqlite3BtreeFirst(pCsr->pCursor, &res);
if( rc!=SQLITE_OK || res ) return rc; if( rc!=SQLITE_OK || res ) return rc;
assert( pSorter->nBtree>0 );
/* If the first temporary PMA file has not been opened, open it now. */ /* If the first temporary PMA file has not been opened, open it now. */
if( pSorter->pTemp1==0 ){ if( pSorter->pTemp1==0 ){
@@ -397,12 +401,11 @@ static int vdbeSorterBtreeToPMA(sqlite3 *db, VdbeCursor *pCsr){
} }
if( rc==SQLITE_OK ){ if( rc==SQLITE_OK ){
i64 iWriteOff = pSorter->iWriteOff;
void *aMalloc = 0; /* Array used to hold a single record */
int nMalloc = 0; /* Allocated size of aMalloc[] in bytes */
pSorter->nPMA++; pSorter->nPMA++;
/* Write a varint containg the size of the PMA in bytes into the file. */
assert( pSorter->nBtree>0 );
for( for(
rc = vdbeSorterWriteVarint(pSorter->pTemp1, pSorter->nBtree, &iWriteOff); rc = vdbeSorterWriteVarint(pSorter->pTemp1, pSorter->nBtree, &iWriteOff);
rc==SQLITE_OK && res==0; rc==SQLITE_OK && res==0;
@@ -436,9 +439,13 @@ static int vdbeSorterBtreeToPMA(sqlite3 *db, VdbeCursor *pCsr){
if( rc!=SQLITE_OK ) break; if( rc!=SQLITE_OK ) break;
} }
/* This assert verifies that unless an error has occurred, the size of
** the PMA on disk is the same as the expected size stored in
** pSorter->nBtree. */
assert( rc!=SQLITE_OK || pSorter->nBtree==( assert( rc!=SQLITE_OK || pSorter->nBtree==(
iWriteOff-pSorter->iWriteOff-sqlite3VarintLen(pSorter->nBtree) iWriteOff-pSorter->iWriteOff-sqlite3VarintLen(pSorter->nBtree)
)); ));
pSorter->iWriteOff = iWriteOff; pSorter->iWriteOff = iWriteOff;
sqlite3DbFree(db, aMalloc); sqlite3DbFree(db, aMalloc);
} }
@@ -448,9 +455,17 @@ static int vdbeSorterBtreeToPMA(sqlite3 *db, VdbeCursor *pCsr){
} }
/* /*
** This function is called on a sorter cursor before each row is inserted. ** This function is called on a sorter cursor by the VDBE before each row
** If the current b-tree being constructed is already considered "full", ** is inserted into VdbeCursor.pCsr. Argument nKey is the size of the key, in
** a new tree is started. ** bytes, about to be inserted.
**
** If it is determined that the temporary b-tree accessed via VdbeCursor.pCsr
** is large enough, its contents are written to a sorted PMA on disk and the
** tree emptied. This prevents the b-tree (which must be small enough to
** fit entirely in the cache in order to support efficient inserts) from
** growing too large.
**
** An SQLite error code is returned if an error occurs. Otherwise, SQLITE_OK.
*/ */
int sqlite3VdbeSorterWrite(sqlite3 *db, VdbeCursor *pCsr, int nKey){ int sqlite3VdbeSorterWrite(sqlite3 *db, VdbeCursor *pCsr, int nKey){
int rc = SQLITE_OK; /* Return code */ int rc = SQLITE_OK; /* Return code */
@@ -459,6 +474,7 @@ int sqlite3VdbeSorterWrite(sqlite3 *db, VdbeCursor *pCsr, int nKey){
Pager *pPager = sqlite3BtreePager(pCsr->pBt); Pager *pPager = sqlite3BtreePager(pCsr->pBt);
int nPage; /* Current size of temporary file in pages */ int nPage; /* Current size of temporary file in pages */
/* Determine how many pages the temporary b-tree has grown to */
sqlite3PagerPagecount(pPager, &nPage); sqlite3PagerPagecount(pPager, &nPage);
/* If pSorter->nWorking is still zero, but the temporary file has been /* If pSorter->nWorking is still zero, but the temporary file has been
@@ -469,8 +485,8 @@ int sqlite3VdbeSorterWrite(sqlite3 *db, VdbeCursor *pCsr, int nKey){
** file in pages. */ ** file in pages. */
if( pSorter->nWorking==0 && sqlite3PagerFile(pPager)->pMethods ){ if( pSorter->nWorking==0 && sqlite3PagerFile(pPager)->pMethods ){
pSorter->nWorking = nPage-5; pSorter->nWorking = nPage-5;
if( pSorter->nWorking<SORTER_MIN_SEGMENT_SIZE ){ if( pSorter->nWorking<SORTER_MIN_WORKING ){
pSorter->nWorking = SORTER_MIN_SEGMENT_SIZE; pSorter->nWorking = SORTER_MIN_WORKING;
} }
} }
@@ -664,7 +680,7 @@ int sqlite3VdbeSorterNext(sqlite3 *db, VdbeCursor *pCsr, int *pbEof){
/* /*
** Copy the current sorter key into the memory cell pOut. ** Copy the current sorter key into the memory cell pOut.
*/ */
int sqlite3VdbeSorterRowkey(sqlite3 *db, VdbeCursor *pCsr, Mem *pOut){ int sqlite3VdbeSorterRowkey(VdbeCursor *pCsr, Mem *pOut){
VdbeSorter *pSorter = pCsr->pSorter; VdbeSorter *pSorter = pCsr->pSorter;
VdbeSorterIter *pIter; VdbeSorterIter *pIter;