From: drh Date: Mon, 28 Jul 2014 18:57:40 +0000 (+0000) Subject: In vdbesort.c, rename vdbeSorterDoCompare() to vdbeMergeEngineCompare() and X-Git-Tag: version-3.8.7~132^2~26 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8a4865f139e210ea92d41171b7f39a424d981f8e;p=thirdparty%2Fsqlite.git 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 --- diff --git a/manifest b/manifest index cd56be770f..9b892425af 100644 --- a/manifest +++ b/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 diff --git a/manifest.uuid b/manifest.uuid index 1b6e273eef..e77bb124e6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -518290a7fc0994f9593c5c3ba5b2610a1b86dae1 \ No newline at end of file +09d50d9f0fe7df26dadb0a332731683a07a89fde \ No newline at end of file diff --git a/src/vdbesort.c b/src/vdbesort.c index ce26e9acc8..d69a48618a 100644 --- a/src/vdbesort.c +++ b/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( iOutnTree && 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( iOutnTree && 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 && iaReadr[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; }