In vdbesort.c, rename vdbeSorterDoCompare() to vdbeMergeEngineCompare() and
move it closer to the one place where it is called. Other minor comment changes. FossilOrigin-Name: 09d50d9f0fe7df26dadb0a332731683a07a89fde
This commit is contained in:
parent
a4c8ca049e
commit
8a4865f139
12
manifest
12
manifest
@ -1,5 +1,5 @@
|
||||
C In\svdbesort.c,\srename\sall\spointers\sto\ssqlite3_file\sobjects\s"pFd"\sand\suse\sthe\nname\s"pFile"\sonly\sfor\spointers\sto\sSortFile\sobjects.\s\sOther\scomment\senhancements.
|
||||
D 2014-07-28T17:18:28.406
|
||||
C In\svdbesort.c,\srename\svdbeSorterDoCompare()\sto\svdbeMergeEngineCompare()\sand\nmove\sit\scloser\sto\sthe\sone\splace\swhere\sit\sis\scalled.\s\sOther\sminor\scomment\nchanges.
|
||||
D 2014-07-28T18:57:40.217
|
||||
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
|
||||
F Makefile.in cf57f673d77606ab0f2d9627ca52a9ba1464146a
|
||||
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
|
||||
@ -291,7 +291,7 @@ F src/vdbeapi.c 24e40422382beb774daab11fe9fe9d37e8a04949
|
||||
F src/vdbeaux.c 3f1d2baa4a8cbdad33cb255a5f4fd1af7a414683
|
||||
F src/vdbeblob.c 9205ce9d3b064d9600f8418a897fc88b5687d9ac
|
||||
F src/vdbemem.c d90a1e8acf8b63dc9d14cbbea12bfec6cec31394
|
||||
F src/vdbesort.c cbd9f27e3521737ad87149550c6d30994f74df7a
|
||||
F src/vdbesort.c 2ee0867189cd40199e7d4ed944190b9453e82eec
|
||||
F src/vdbetrace.c 6f52bc0c51e144b7efdcfb2a8f771167a8816767
|
||||
F src/vtab.c 21b932841e51ebd7d075e2d0ad1415dce8d2d5fd
|
||||
F src/wal.c 264df50a1b33124130b23180ded2e2c5663c652a
|
||||
@ -1189,7 +1189,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
|
||||
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
|
||||
F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32
|
||||
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
|
||||
P 163c247bd8280ab14fe577329c631c8bd884707f
|
||||
R 502fd7906a0bc29e23e7a03a06d6bf2a
|
||||
P 518290a7fc0994f9593c5c3ba5b2610a1b86dae1
|
||||
R c47502cced56ced8e0a3892ddc45fd18
|
||||
U drh
|
||||
Z e1002bd8dfbb36530151cc4f8c9e6ac6
|
||||
Z 1aa9f494eefb9d25759f33de8d16a270
|
||||
|
@ -1 +1 @@
|
||||
518290a7fc0994f9593c5c3ba5b2610a1b86dae1
|
||||
09d50d9f0fe7df26dadb0a332731683a07a89fde
|
150
src/vdbesort.c
150
src/vdbesort.c
@ -609,7 +609,8 @@ static int vdbeSorterMapFile(SortSubtask *pTask, SorterFile *pFile, u8 **pp){
|
||||
}
|
||||
|
||||
/*
|
||||
** Seek PmaReader pReadr to offset iOff within file pFile. Return SQLITE_OK
|
||||
** Attach PmaReader pReadr to file pFile (if it is not already attached to
|
||||
** that file) and seek it to offset iOff within the file. Return SQLITE_OK
|
||||
** if successful, or an SQLite error code if an error occurs.
|
||||
*/
|
||||
static int vdbePmaReaderSeek(
|
||||
@ -759,56 +760,6 @@ static int vdbeSorterCompare(
|
||||
return sqlite3VdbeRecordCompare(nKey1, pKey1, r2, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
** This function is called to compare two PmaReader keys when merging
|
||||
** multiple b-tree segments. Parameter iOut is the index of the aTree[]
|
||||
** value to recalculate.
|
||||
*/
|
||||
static int vdbeSorterDoCompare(
|
||||
SortSubtask *pTask,
|
||||
MergeEngine *pMerger,
|
||||
int iOut
|
||||
){
|
||||
int i1;
|
||||
int i2;
|
||||
int iRes;
|
||||
PmaReader *p1;
|
||||
PmaReader *p2;
|
||||
|
||||
assert( iOut<pMerger->nTree && iOut>0 );
|
||||
|
||||
if( iOut>=(pMerger->nTree/2) ){
|
||||
i1 = (iOut - pMerger->nTree/2) * 2;
|
||||
i2 = i1 + 1;
|
||||
}else{
|
||||
i1 = pMerger->aTree[iOut*2];
|
||||
i2 = pMerger->aTree[iOut*2+1];
|
||||
}
|
||||
|
||||
p1 = &pMerger->aReadr[i1];
|
||||
p2 = &pMerger->aReadr[i2];
|
||||
|
||||
if( p1->pFd==0 ){
|
||||
iRes = i2;
|
||||
}else if( p2->pFd==0 ){
|
||||
iRes = i1;
|
||||
}else{
|
||||
int res;
|
||||
assert( pTask->pUnpacked!=0 ); /* allocated in vdbeSortSubtaskMain() */
|
||||
res = vdbeSorterCompare(
|
||||
pTask, p1->aKey, p1->nKey, p2->aKey, p2->nKey
|
||||
);
|
||||
if( res<=0 ){
|
||||
iRes = i1;
|
||||
}else{
|
||||
iRes = i2;
|
||||
}
|
||||
}
|
||||
|
||||
pMerger->aTree[iOut] = iRes;
|
||||
return SQLITE_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
** Initialize the temporary index cursor just opened as a sorter cursor.
|
||||
**
|
||||
@ -1859,10 +1810,69 @@ static void vdbeIncrSetThreads(IncrMerger *pIncr){
|
||||
}
|
||||
#endif /* SQLITE_MAX_WORKER_THREADS>0 */
|
||||
|
||||
|
||||
|
||||
/*
|
||||
** Recompute pMerger->aTree[iOut] by comparing the next keys on the
|
||||
** two PmaReaders that feed that entry. Neither of the PmaReaders
|
||||
** are advanced. This routine merely does the comparison.
|
||||
*/
|
||||
static void vdbeMergeEngineCompare(
|
||||
MergeEngine *pMerger, /* Merge engine containing PmaReaders to compare */
|
||||
int iOut /* Store the result in pMerger->aTree[iOut] */
|
||||
){
|
||||
int i1;
|
||||
int i2;
|
||||
int iRes;
|
||||
PmaReader *p1;
|
||||
PmaReader *p2;
|
||||
|
||||
assert( iOut<pMerger->nTree && iOut>0 );
|
||||
|
||||
if( iOut>=(pMerger->nTree/2) ){
|
||||
i1 = (iOut - pMerger->nTree/2) * 2;
|
||||
i2 = i1 + 1;
|
||||
}else{
|
||||
i1 = pMerger->aTree[iOut*2];
|
||||
i2 = pMerger->aTree[iOut*2+1];
|
||||
}
|
||||
|
||||
p1 = &pMerger->aReadr[i1];
|
||||
p2 = &pMerger->aReadr[i2];
|
||||
|
||||
if( p1->pFd==0 ){
|
||||
iRes = i2;
|
||||
}else if( p2->pFd==0 ){
|
||||
iRes = i1;
|
||||
}else{
|
||||
int res;
|
||||
assert( pMerger->pTask->pUnpacked!=0 ); /* from vdbeSortSubtaskMain() */
|
||||
res = vdbeSorterCompare(
|
||||
pMerger->pTask, p1->aKey, p1->nKey, p2->aKey, p2->nKey
|
||||
);
|
||||
if( res<=0 ){
|
||||
iRes = i1;
|
||||
}else{
|
||||
iRes = i2;
|
||||
}
|
||||
}
|
||||
|
||||
pMerger->aTree[iOut] = iRes;
|
||||
}
|
||||
|
||||
/*
|
||||
** Allowed values for the eMode parameter to vdbeIncrMergerInit()
|
||||
** and vdbePmaReaderIncrMergeInit().
|
||||
*/
|
||||
#define INCRINIT_NORMAL 0
|
||||
#define INCRINIT_TASK 1
|
||||
#define INCRINIT_ROOT 2
|
||||
static int vdbePmaReaderIncrInit(PmaReader *pReadr, int eMode);
|
||||
|
||||
/* Forward reference.
|
||||
** The vdbeIncrMergeInit() and vdbePmaReaderIncrMergeInit() routines call each
|
||||
** other (when building a merge tree).
|
||||
*/
|
||||
static int vdbePmaReaderIncrMergeInit(PmaReader *pReadr, int eMode);
|
||||
|
||||
/*
|
||||
** Initialize the MergeEngine object passed as the second argument. Once this
|
||||
@ -1877,12 +1887,12 @@ static int vdbePmaReaderIncrInit(PmaReader *pReadr, int eMode);
|
||||
** its first key.
|
||||
**
|
||||
** Otherwise, if eMode is any value other than INCRINIT_ROOT, then use
|
||||
** vdbePmaReaderIncrInit() to initialize each PmaReader that feeds data
|
||||
** vdbePmaReaderIncrMergeInit() to initialize each PmaReader that feeds data
|
||||
** to pMerger.
|
||||
**
|
||||
** SQLITE_OK is returned if successful, or an SQLite error code otherwise.
|
||||
*/
|
||||
static int vdbeIncrInitMerger(
|
||||
static int vdbeIncrMergerInit(
|
||||
SortSubtask *pTask, /* Thread that will run pMerger */
|
||||
MergeEngine *pMerger, /* MergeEngine to initialize */
|
||||
int eMode /* One of the INCRINIT_XXX constants */
|
||||
@ -1895,7 +1905,7 @@ static int vdbeIncrInitMerger(
|
||||
assert( pMerger->pTask==0 || pMerger->pTask==pTask );
|
||||
pMerger->pTask = pTask;
|
||||
|
||||
for(i=0; rc==SQLITE_OK && i<nTree; i++){
|
||||
for(i=0; i<nTree; i++){
|
||||
if( eMode==INCRINIT_ROOT ){
|
||||
/* PmaReaders should be normally initialized in order, as if they are
|
||||
** reading from the same temp file this makes for more linear file IO.
|
||||
@ -1906,18 +1916,20 @@ static int vdbeIncrInitMerger(
|
||||
** better advantage of multi-processor hardware. */
|
||||
rc = vdbePmaReaderNext(&pMerger->aReadr[nTree-i-1]);
|
||||
}else{
|
||||
rc = vdbePmaReaderIncrInit(&pMerger->aReadr[i], INCRINIT_NORMAL);
|
||||
rc = vdbePmaReaderIncrMergeInit(&pMerger->aReadr[i], INCRINIT_NORMAL);
|
||||
}
|
||||
if( rc!=SQLITE_OK ) return rc;
|
||||
}
|
||||
|
||||
for(i=pMerger->nTree-1; rc==SQLITE_OK && i>0; i--){
|
||||
rc = vdbeSorterDoCompare(pTask, pMerger, i);
|
||||
for(i=pMerger->nTree-1; i>0; i--){
|
||||
vdbeMergeEngineCompare(pMerger, i);
|
||||
}
|
||||
|
||||
return (rc==SQLITE_OK ? pTask->pUnpacked->errCode : rc);
|
||||
return pTask->pUnpacked->errCode;
|
||||
}
|
||||
|
||||
/*
|
||||
** Initialize the IncrMerge field of a PmaReader.
|
||||
**
|
||||
** If the PmaReader passed as the first argument is not an incremental-reader
|
||||
** (if pReadr->pIncr==0), then this function is a no-op. Otherwise, it serves
|
||||
** to open and/or initialize the temp file related fields of the IncrMerge
|
||||
@ -1950,14 +1962,14 @@ static int vdbeIncrInitMerger(
|
||||
**
|
||||
** SQLITE_OK is returned if successful, or an SQLite error code otherwise.
|
||||
*/
|
||||
static int vdbePmaReaderIncrInit(PmaReader *pReadr, int eMode){
|
||||
static int vdbePmaReaderIncrMergeInit(PmaReader *pReadr, int eMode){
|
||||
int rc = SQLITE_OK;
|
||||
IncrMerger *pIncr = pReadr->pIncr;
|
||||
if( pIncr ){
|
||||
SortSubtask *pTask = pIncr->pTask;
|
||||
sqlite3 *db = pTask->pSorter->db;
|
||||
|
||||
rc = vdbeIncrInitMerger(pTask, pIncr->pMerger, eMode);
|
||||
rc = vdbeIncrMergerInit(pTask, pIncr->pMerger, eMode);
|
||||
|
||||
/* Set up the required files for pIncr. A multi-theaded IncrMerge object
|
||||
** requires two temp files to itself, whereas a single-threaded object
|
||||
@ -2005,18 +2017,20 @@ static int vdbePmaReaderIncrInit(PmaReader *pReadr, int eMode){
|
||||
|
||||
#if SQLITE_MAX_WORKER_THREADS>0
|
||||
/*
|
||||
** The main routine for vdbePmaReaderIncrInit() operations run in
|
||||
** The main routine for vdbePmaReaderIncrMergeInit() operations run in
|
||||
** background threads.
|
||||
*/
|
||||
static void *vdbePmaReaderBgInit(void *pCtx){
|
||||
PmaReader *pReader = (PmaReader*)pCtx;
|
||||
void *pRet = SQLITE_INT_TO_PTR(vdbePmaReaderIncrInit(pReader,INCRINIT_TASK));
|
||||
void *pRet = SQLITE_INT_TO_PTR(
|
||||
vdbePmaReaderIncrMergeInit(pReader,INCRINIT_TASK)
|
||||
);
|
||||
pReader->pIncr->pTask->bDone = 1;
|
||||
return pRet;
|
||||
}
|
||||
|
||||
/*
|
||||
** Use a background thread to invoke vdbePmaReaderIncrInit(INCRINIT_TASK)
|
||||
** Use a background thread to invoke vdbePmaReaderIncrMergeInit(INCRINIT_TASK)
|
||||
** on the the PmaReader object passed as the first argument.
|
||||
**
|
||||
** This call will initialize the various fields of the pReadr->pIncr
|
||||
@ -2270,7 +2284,7 @@ static int vdbeSorterSetupMerge(VdbeSorter *pSorter){
|
||||
assert( p->pIncr==0 || p->pIncr->pTask==&pSorter->aTask[iTask] );
|
||||
if( p->pIncr ){
|
||||
if( iTask==pSorter->nTask-1 ){
|
||||
rc = vdbePmaReaderIncrInit(p, INCRINIT_TASK);
|
||||
rc = vdbePmaReaderIncrMergeInit(p, INCRINIT_TASK);
|
||||
}else{
|
||||
rc = vdbePmaReaderBgIncrInit(p);
|
||||
}
|
||||
@ -2280,12 +2294,12 @@ static int vdbeSorterSetupMerge(VdbeSorter *pSorter){
|
||||
pMain = 0;
|
||||
}
|
||||
if( rc==SQLITE_OK ){
|
||||
rc = vdbePmaReaderIncrInit(pReadr, INCRINIT_ROOT);
|
||||
rc = vdbePmaReaderIncrMergeInit(pReadr, INCRINIT_ROOT);
|
||||
}
|
||||
}else
|
||||
#endif
|
||||
{
|
||||
rc = vdbeIncrInitMerger(pTask0, pMain, INCRINIT_NORMAL);
|
||||
rc = vdbeIncrMergerInit(pTask0, pMain, INCRINIT_NORMAL);
|
||||
pSorter->pMerger = pMain;
|
||||
pMain = 0;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user