Lines Matching refs:pSorter
298 VdbeSorter *pSorter; /* Sorter that owns this sub-task */ member
615 if( pFile->iEof<=(i64)(pTask->pSorter->db->nMaxSorterMmap) ){ in vdbeSorterMapFile()
651 int pgsz = pTask->pSorter->pgsz; in vdbePmaReaderSeek()
765 sqlite3VdbeRecordUnpack(pTask->pSorter->pKeyInfo, nKey2, pKey2, r2); in vdbeSorterCompareTail()
792 sqlite3VdbeRecordUnpack(pTask->pSorter->pKeyInfo, nKey2, pKey2, r2); in vdbeSorterCompare()
826 if( pTask->pSorter->pKeyInfo->nKeyField>1 ){ in vdbeSorterCompareText()
832 assert( !(pTask->pSorter->pKeyInfo->aSortFlags[0]&KEYINFO_ORDER_BIGNULL) ); in vdbeSorterCompareText()
833 if( pTask->pSorter->pKeyInfo->aSortFlags[0] ){ in vdbeSorterCompareText()
896 if( pTask->pSorter->pKeyInfo->nKeyField>1 ){ in vdbeSorterCompareInt()
901 }else if( pTask->pSorter->pKeyInfo->aSortFlags[0] ){ in vdbeSorterCompareInt()
902 assert( !(pTask->pSorter->pKeyInfo->aSortFlags[0]&KEYINFO_ORDER_BIGNULL) ); in vdbeSorterCompareInt()
935 VdbeSorter *pSorter; /* The new sorter */ in sqlite3VdbeSorterInit() local
969 pSorter = (VdbeSorter*)sqlite3DbMallocZero(db, sz + szKeyInfo); in sqlite3VdbeSorterInit()
970 pCsr->uc.pSorter = pSorter; in sqlite3VdbeSorterInit()
971 if( pSorter==0 ){ in sqlite3VdbeSorterInit()
975 pSorter->pKeyInfo = pKeyInfo = (KeyInfo*)((u8*)pSorter + sz); in sqlite3VdbeSorterInit()
982 pSorter->pgsz = pgsz = sqlite3BtreeGetPageSize(pBt); in sqlite3VdbeSorterInit()
984 pSorter->nTask = nWorker + 1; in sqlite3VdbeSorterInit()
985 pSorter->iPrev = (u8)(nWorker - 1); in sqlite3VdbeSorterInit()
986 pSorter->bUseThreads = (pSorter->nTask>1); in sqlite3VdbeSorterInit()
987 pSorter->db = db; in sqlite3VdbeSorterInit()
988 for(i=0; i<pSorter->nTask; i++){ in sqlite3VdbeSorterInit()
989 SortSubtask *pTask = &pSorter->aTask[i]; in sqlite3VdbeSorterInit()
990 pTask->pSorter = pSorter; in sqlite3VdbeSorterInit()
996 pSorter->mnPmaSize = szPma * pgsz; in sqlite3VdbeSorterInit()
1007 pSorter->mxPmaSize = MAX(pSorter->mnPmaSize, (int)mxCache); in sqlite3VdbeSorterInit()
1012 assert( pSorter->iMemory==0 ); in sqlite3VdbeSorterInit()
1013 pSorter->nMemory = pgsz; in sqlite3VdbeSorterInit()
1014 pSorter->list.aMemory = (u8*)sqlite3Malloc(pgsz); in sqlite3VdbeSorterInit()
1015 if( !pSorter->list.aMemory ) rc = SQLITE_NOMEM_BKPT; in sqlite3VdbeSorterInit()
1023 pSorter->typeMask = SORTER_TYPE_INTEGER | SORTER_TYPE_TEXT; in sqlite3VdbeSorterInit()
1072 int iTask = (pTask - pTask->pSorter->aTask); in vdbeSorterWorkDebug()
1073 sqlite3OsCurrentTimeInt64(pTask->pSorter->db->pVfs, &t); in vdbeSorterWorkDebug()
1087 int iTask = (pTask - pTask->pSorter->aTask); in vdbeSorterPopulateDebug()
1088 sqlite3OsCurrentTimeInt64(pTask->pSorter->db->pVfs, &t); in vdbeSorterPopulateDebug()
1098 sqlite3OsCurrentTimeInt64(pTask->pSorter->db->pVfs, &t); in vdbeSorterBlockDebug()
1147 static int vdbeSorterJoinAll(VdbeSorter *pSorter, int rcin){ in vdbeSorterJoinAll() argument
1158 for(i=pSorter->nTask-1; i>=0; i--){ in vdbeSorterJoinAll()
1159 SortSubtask *pTask = &pSorter->aTask[i]; in vdbeSorterJoinAll()
1231 void sqlite3VdbeSorterReset(sqlite3 *db, VdbeSorter *pSorter){ in sqlite3VdbeSorterReset() argument
1233 (void)vdbeSorterJoinAll(pSorter, SQLITE_OK); in sqlite3VdbeSorterReset()
1234 assert( pSorter->bUseThreads || pSorter->pReader==0 ); in sqlite3VdbeSorterReset()
1236 if( pSorter->pReader ){ in sqlite3VdbeSorterReset()
1237 vdbePmaReaderClear(pSorter->pReader); in sqlite3VdbeSorterReset()
1238 sqlite3DbFree(db, pSorter->pReader); in sqlite3VdbeSorterReset()
1239 pSorter->pReader = 0; in sqlite3VdbeSorterReset()
1242 vdbeMergeEngineFree(pSorter->pMerger); in sqlite3VdbeSorterReset()
1243 pSorter->pMerger = 0; in sqlite3VdbeSorterReset()
1244 for(i=0; i<pSorter->nTask; i++){ in sqlite3VdbeSorterReset()
1245 SortSubtask *pTask = &pSorter->aTask[i]; in sqlite3VdbeSorterReset()
1247 pTask->pSorter = pSorter; in sqlite3VdbeSorterReset()
1249 if( pSorter->list.aMemory==0 ){ in sqlite3VdbeSorterReset()
1250 vdbeSorterRecordFree(0, pSorter->list.pList); in sqlite3VdbeSorterReset()
1252 pSorter->list.pList = 0; in sqlite3VdbeSorterReset()
1253 pSorter->list.szPMA = 0; in sqlite3VdbeSorterReset()
1254 pSorter->bUsePMA = 0; in sqlite3VdbeSorterReset()
1255 pSorter->iMemory = 0; in sqlite3VdbeSorterReset()
1256 pSorter->mxKeysize = 0; in sqlite3VdbeSorterReset()
1257 sqlite3DbFree(db, pSorter->pUnpacked); in sqlite3VdbeSorterReset()
1258 pSorter->pUnpacked = 0; in sqlite3VdbeSorterReset()
1265 VdbeSorter *pSorter; in sqlite3VdbeSorterClose() local
1267 pSorter = pCsr->uc.pSorter; in sqlite3VdbeSorterClose()
1268 if( pSorter ){ in sqlite3VdbeSorterClose()
1269 sqlite3VdbeSorterReset(db, pSorter); in sqlite3VdbeSorterClose()
1270 sqlite3_free(pSorter->list.aMemory); in sqlite3VdbeSorterClose()
1271 sqlite3DbFree(db, pSorter); in sqlite3VdbeSorterClose()
1272 pCsr->uc.pSorter = 0; in sqlite3VdbeSorterClose()
1334 pTask->pUnpacked = sqlite3VdbeAllocUnpackedRecord(pTask->pSorter->pKeyInfo); in vdbeSortAllocUnpacked()
1336 pTask->pUnpacked->nField = pTask->pSorter->pKeyInfo->nKeyField; in vdbeSortAllocUnpacked()
1412 pTask->xCompare = vdbeSorterGetCompare(pTask->pSorter); in vdbeSorterSort()
1549 sqlite3 *db = pTask->pSorter->db; in vdbeSorterListToPMA()
1585 vdbePmaWriterInit(pTask->file.pFd, &writer, pTask->pSorter->pgsz, in vdbeSorterListToPMA()
1697 static int vdbeSorterFlushPMA(VdbeSorter *pSorter){ in vdbeSorterFlushPMA() argument
1699 pSorter->bUsePMA = 1; in vdbeSorterFlushPMA()
1700 return vdbeSorterListToPMA(&pSorter->aTask[0], &pSorter->list); in vdbeSorterFlushPMA()
1705 int nWorker = (pSorter->nTask-1); in vdbeSorterFlushPMA()
1709 pSorter->bUsePMA = 1; in vdbeSorterFlushPMA()
1720 int iTest = (pSorter->iPrev + i + 1) % nWorker; in vdbeSorterFlushPMA()
1721 pTask = &pSorter->aTask[iTest]; in vdbeSorterFlushPMA()
1731 rc = vdbeSorterListToPMA(&pSorter->aTask[nWorker], &pSorter->list); in vdbeSorterFlushPMA()
1740 assert( pTask->list.aMemory==0 || pSorter->list.aMemory!=0 ); in vdbeSorterFlushPMA()
1744 pSorter->iPrev = (u8)(pTask - pSorter->aTask); in vdbeSorterFlushPMA()
1745 pTask->list = pSorter->list; in vdbeSorterFlushPMA()
1746 pSorter->list.pList = 0; in vdbeSorterFlushPMA()
1747 pSorter->list.szPMA = 0; in vdbeSorterFlushPMA()
1749 pSorter->list.aMemory = aMem; in vdbeSorterFlushPMA()
1750 pSorter->nMemory = sqlite3MallocSize(aMem); in vdbeSorterFlushPMA()
1751 }else if( pSorter->list.aMemory ){ in vdbeSorterFlushPMA()
1752 pSorter->list.aMemory = sqlite3Malloc(pSorter->nMemory); in vdbeSorterFlushPMA()
1753 if( !pSorter->list.aMemory ) return SQLITE_NOMEM_BKPT; in vdbeSorterFlushPMA()
1771 VdbeSorter *pSorter; in sqlite3VdbeSorterWrite() local
1780 pSorter = pCsr->uc.pSorter; in sqlite3VdbeSorterWrite()
1783 pSorter->typeMask &= SORTER_TYPE_INTEGER; in sqlite3VdbeSorterWrite()
1785 pSorter->typeMask &= SORTER_TYPE_TEXT; in sqlite3VdbeSorterWrite()
1787 pSorter->typeMask = 0; in sqlite3VdbeSorterWrite()
1790 assert( pSorter ); in sqlite3VdbeSorterWrite()
1810 if( pSorter->mxPmaSize ){ in sqlite3VdbeSorterWrite()
1811 if( pSorter->list.aMemory ){ in sqlite3VdbeSorterWrite()
1812 bFlush = pSorter->iMemory && (pSorter->iMemory+nReq) > pSorter->mxPmaSize; in sqlite3VdbeSorterWrite()
1815 (pSorter->list.szPMA > pSorter->mxPmaSize) in sqlite3VdbeSorterWrite()
1816 || (pSorter->list.szPMA > pSorter->mnPmaSize && sqlite3HeapNearlyFull()) in sqlite3VdbeSorterWrite()
1820 rc = vdbeSorterFlushPMA(pSorter); in sqlite3VdbeSorterWrite()
1821 pSorter->list.szPMA = 0; in sqlite3VdbeSorterWrite()
1822 pSorter->iMemory = 0; in sqlite3VdbeSorterWrite()
1823 assert( rc!=SQLITE_OK || pSorter->list.pList==0 ); in sqlite3VdbeSorterWrite()
1827 pSorter->list.szPMA += nPMA; in sqlite3VdbeSorterWrite()
1828 if( nPMA>pSorter->mxKeysize ){ in sqlite3VdbeSorterWrite()
1829 pSorter->mxKeysize = nPMA; in sqlite3VdbeSorterWrite()
1832 if( pSorter->list.aMemory ){ in sqlite3VdbeSorterWrite()
1833 int nMin = pSorter->iMemory + nReq; in sqlite3VdbeSorterWrite()
1835 if( nMin>pSorter->nMemory ){ in sqlite3VdbeSorterWrite()
1837 sqlite3_int64 nNew = 2 * (sqlite3_int64)pSorter->nMemory; in sqlite3VdbeSorterWrite()
1839 if( pSorter->list.pList ){ in sqlite3VdbeSorterWrite()
1840 iListOff = (u8*)pSorter->list.pList - pSorter->list.aMemory; in sqlite3VdbeSorterWrite()
1843 if( nNew > pSorter->mxPmaSize ) nNew = pSorter->mxPmaSize; in sqlite3VdbeSorterWrite()
1845 aNew = sqlite3Realloc(pSorter->list.aMemory, nNew); in sqlite3VdbeSorterWrite()
1848 pSorter->list.pList = (SorterRecord*)&aNew[iListOff]; in sqlite3VdbeSorterWrite()
1850 pSorter->list.aMemory = aNew; in sqlite3VdbeSorterWrite()
1851 pSorter->nMemory = nNew; in sqlite3VdbeSorterWrite()
1854 pNew = (SorterRecord*)&pSorter->list.aMemory[pSorter->iMemory]; in sqlite3VdbeSorterWrite()
1855 pSorter->iMemory += ROUND8(nReq); in sqlite3VdbeSorterWrite()
1856 if( pSorter->list.pList ){ in sqlite3VdbeSorterWrite()
1857 pNew->u.iNext = (int)((u8*)(pSorter->list.pList) - pSorter->list.aMemory); in sqlite3VdbeSorterWrite()
1864 pNew->u.pNext = pSorter->list.pList; in sqlite3VdbeSorterWrite()
1869 pSorter->list.pList = pNew; in sqlite3VdbeSorterWrite()
1891 vdbePmaWriterInit(pOut->pFd, &writer, pTask->pSorter->pgsz, iStart); in vdbeIncrPopulate()
2005 pIncr->mxSz = MAX(pTask->pSorter->mxKeysize+9,pTask->pSorter->mxPmaSize/2); in vdbeIncrMergerNew()
2194 sqlite3 *db = pTask->pSorter->db; in vdbePmaReaderIncrMergeInit()
2422 VdbeSorter *pSorter, /* The VDBE cursor that implements the sort */ in vdbeSorterMergeTreeBuild() argument
2433 assert( pSorter->bUseThreads || pSorter->nTask==1 ); in vdbeSorterMergeTreeBuild()
2434 if( pSorter->nTask>1 ){ in vdbeSorterMergeTreeBuild()
2435 pMain = vdbeMergeEngineNew(pSorter->nTask); in vdbeSorterMergeTreeBuild()
2440 for(iTask=0; rc==SQLITE_OK && iTask<pSorter->nTask; iTask++){ in vdbeSorterMergeTreeBuild()
2441 SortSubtask *pTask = &pSorter->aTask[iTask]; in vdbeSorterMergeTreeBuild()
2500 static int vdbeSorterSetupMerge(VdbeSorter *pSorter){ in vdbeSorterSetupMerge() argument
2502 SortSubtask *pTask0 = &pSorter->aTask[0]; in vdbeSorterSetupMerge()
2505 sqlite3 *db = pTask0->pSorter->db; in vdbeSorterSetupMerge()
2507 SorterCompare xCompare = vdbeSorterGetCompare(pSorter); in vdbeSorterSetupMerge()
2508 for(i=0; i<pSorter->nTask; i++){ in vdbeSorterSetupMerge()
2509 pSorter->aTask[i].xCompare = xCompare; in vdbeSorterSetupMerge()
2513 rc = vdbeSorterMergeTreeBuild(pSorter, &pMain); in vdbeSorterSetupMerge()
2516 assert( pSorter->bUseThreads==0 || pSorter->nTask>1 ); in vdbeSorterSetupMerge()
2517 if( pSorter->bUseThreads ){ in vdbeSorterSetupMerge()
2520 SortSubtask *pLast = &pSorter->aTask[pSorter->nTask-1]; in vdbeSorterSetupMerge()
2524 pSorter->pReader = pReadr; in vdbeSorterSetupMerge()
2531 for(iTask=0; iTask<(pSorter->nTask-1); iTask++){ in vdbeSorterSetupMerge()
2538 for(iTask=0; rc==SQLITE_OK && iTask<pSorter->nTask; iTask++){ in vdbeSorterSetupMerge()
2550 (p->pIncr->pTask==&pSorter->aTask[iTask]) /* a */ in vdbeSorterSetupMerge()
2551 && (iTask!=pSorter->nTask-1 || p->pIncr->bUseThread==0) /* b */ in vdbeSorterSetupMerge()
2565 pSorter->pMerger = pMain; in vdbeSorterSetupMerge()
2583 VdbeSorter *pSorter; in sqlite3VdbeSorterRewind() local
2587 pSorter = pCsr->uc.pSorter; in sqlite3VdbeSorterRewind()
2588 assert( pSorter ); in sqlite3VdbeSorterRewind()
2593 if( pSorter->bUsePMA==0 ){ in sqlite3VdbeSorterRewind()
2594 if( pSorter->list.pList ){ in sqlite3VdbeSorterRewind()
2596 rc = vdbeSorterSort(&pSorter->aTask[0], &pSorter->list); in sqlite3VdbeSorterRewind()
2607 assert( pSorter->list.pList ); in sqlite3VdbeSorterRewind()
2608 rc = vdbeSorterFlushPMA(pSorter); in sqlite3VdbeSorterRewind()
2611 rc = vdbeSorterJoinAll(pSorter, rc); in sqlite3VdbeSorterRewind()
2617 assert( pSorter->pReader==0 ); in sqlite3VdbeSorterRewind()
2619 rc = vdbeSorterSetupMerge(pSorter); in sqlite3VdbeSorterRewind()
2635 VdbeSorter *pSorter; in sqlite3VdbeSorterNext() local
2639 pSorter = pCsr->uc.pSorter; in sqlite3VdbeSorterNext()
2640 assert( pSorter->bUsePMA || (pSorter->pReader==0 && pSorter->pMerger==0) ); in sqlite3VdbeSorterNext()
2641 if( pSorter->bUsePMA ){ in sqlite3VdbeSorterNext()
2642 assert( pSorter->pReader==0 || pSorter->pMerger==0 ); in sqlite3VdbeSorterNext()
2643 assert( pSorter->bUseThreads==0 || pSorter->pReader ); in sqlite3VdbeSorterNext()
2644 assert( pSorter->bUseThreads==1 || pSorter->pMerger ); in sqlite3VdbeSorterNext()
2646 if( pSorter->bUseThreads ){ in sqlite3VdbeSorterNext()
2647 rc = vdbePmaReaderNext(pSorter->pReader); in sqlite3VdbeSorterNext()
2648 if( rc==SQLITE_OK && pSorter->pReader->pFd==0 ) rc = SQLITE_DONE; in sqlite3VdbeSorterNext()
2653 assert( pSorter->pMerger!=0 ); in sqlite3VdbeSorterNext()
2654 assert( pSorter->pMerger->pTask==(&pSorter->aTask[0]) ); in sqlite3VdbeSorterNext()
2655 rc = vdbeMergeEngineStep(pSorter->pMerger, &res); in sqlite3VdbeSorterNext()
2659 SorterRecord *pFree = pSorter->list.pList; in sqlite3VdbeSorterNext()
2660 pSorter->list.pList = pFree->u.pNext; in sqlite3VdbeSorterNext()
2662 if( pSorter->list.aMemory==0 ) vdbeSorterRecordFree(db, pFree); in sqlite3VdbeSorterNext()
2663 rc = pSorter->list.pList ? SQLITE_OK : SQLITE_DONE; in sqlite3VdbeSorterNext()
2673 const VdbeSorter *pSorter, /* Sorter object */ in vdbeSorterRowkey() argument
2677 if( pSorter->bUsePMA ){ in vdbeSorterRowkey()
2680 if( pSorter->bUseThreads ){ in vdbeSorterRowkey()
2681 pReader = pSorter->pReader; in vdbeSorterRowkey()
2685 pReader = &pSorter->pMerger->aReadr[pSorter->pMerger->aTree[1]]; in vdbeSorterRowkey()
2690 *pnKey = pSorter->list.pList->nVal; in vdbeSorterRowkey()
2691 pKey = SRVAL(pSorter->list.pList); in vdbeSorterRowkey()
2700 VdbeSorter *pSorter; in sqlite3VdbeSorterRowkey() local
2704 pSorter = pCsr->uc.pSorter; in sqlite3VdbeSorterRowkey()
2705 pKey = vdbeSorterRowkey(pSorter, &nKey); in sqlite3VdbeSorterRowkey()
2738 VdbeSorter *pSorter; in sqlite3VdbeSorterCompare() local
2745 pSorter = pCsr->uc.pSorter; in sqlite3VdbeSorterCompare()
2746 r2 = pSorter->pUnpacked; in sqlite3VdbeSorterCompare()
2749 r2 = pSorter->pUnpacked = sqlite3VdbeAllocUnpackedRecord(pKeyInfo); in sqlite3VdbeSorterCompare()
2755 pKey = vdbeSorterRowkey(pSorter, &nKey); in sqlite3VdbeSorterCompare()