Lines Matching refs:pIter

11087 SQLITE_API int sqlite3changeset_next(sqlite3_changeset_iter *pIter);
11122 sqlite3_changeset_iter *pIter, /* Iterator object */
11156 sqlite3_changeset_iter *pIter, /* Iterator object */
11187 sqlite3_changeset_iter *pIter, /* Changeset iterator */
11221 sqlite3_changeset_iter *pIter, /* Changeset iterator */
11249 sqlite3_changeset_iter *pIter, /* Changeset iterator */
11266 sqlite3_changeset_iter *pIter, /* Changeset iterator */
11301 SQLITE_API int sqlite3changeset_finalize(sqlite3_changeset_iter *pIter);
62420 WalIterator *pIter = 0; /* Wal iterator context */
62465 rc = walIteratorInit(pWal, pInfo->nBackfill, &pIter);
62466 assert( rc==SQLITE_OK || pIter==0 );
62469 if( pIter
62502 while( rc==SQLITE_OK && 0==walIteratorNext(pIter, &iDbpage, &iFrame) ){
62587 walIteratorFree(pIter);
65864 BtLock *pIter;
65891 for(pIter=pBt->pLock; pIter; pIter=pIter->pNext){
65901 assert( pIter->eLock==READ_LOCK || pIter->eLock==WRITE_LOCK );
65902 assert( eLock==READ_LOCK || pIter->pBtree==p || pIter->eLock==READ_LOCK);
65903 if( pIter->pBtree!=p && pIter->iTable==iTab && pIter->eLock!=eLock ){
65904 sqlite3ConnectionBlocked(p->db, pIter->pBtree->db);
65937 BtLock *pIter;
65955 for(pIter=pBt->pLock; pIter; pIter=pIter->pNext){
65956 if( pIter->iTable==iTable && pIter->pBtree==p ){
65957 pLock = pIter;
66772 u8 *pIter; /* For scanning through pCell */
66780 pIter = pCell;
66788 nPayload = *pIter;
66790 u8 *pEnd = &pIter[8];
66793 nPayload = (nPayload<<7) | (*++pIter & 0x7f);
66794 }while( (*pIter)>=0x80 && pIter<pEnd );
66796 pIter++;
66804 iKey = *pIter;
66806 u8 *pEnd = &pIter[7];
66809 iKey = (iKey<<7) | (*++pIter & 0x7f);
66810 if( (*pIter)<0x80 ) break;
66811 if( pIter>=pEnd ){
66812 iKey = (iKey<<8) | *++pIter;
66817 pIter++;
66821 pInfo->pPayload = pIter;
66828 pInfo->nSize = nPayload + (u16)(pIter - pCell);
66840 u8 *pIter; /* For scanning through pCell */
66846 pIter = pCell + pPage->childPtrSize;
66847 nPayload = *pIter;
66849 u8 *pEnd = &pIter[8];
66852 nPayload = (nPayload<<7) | (*++pIter & 0x7f);
66853 }while( *(pIter)>=0x80 && pIter<pEnd );
66855 pIter++;
66858 pInfo->pPayload = pIter;
66865 pInfo->nSize = nPayload + (u16)(pIter - pCell);
66893 u8 *pIter = pCell + pPage->childPtrSize; /* For looping over bytes of pCell */
66906 nSize = *pIter;
66908 pEnd = &pIter[8];
66911 nSize = (nSize<<7) | (*++pIter & 0x7f);
66912 }while( *(pIter)>=0x80 && pIter<pEnd );
66914 pIter++;
66919 pEnd = &pIter[9];
66920 while( (*pIter++)&0x80 && pIter<pEnd );
66925 nSize += (u32)(pIter - pCell);
66935 nSize += 4 + (u16)(pIter - pCell);
66941 u8 *pIter = pCell + 4; /* For looping over bytes of pCell */
66956 pEnd = pIter + 9;
66957 while( (*pIter++)&0x80 && pIter<pEnd );
66958 assert( debuginfo.nSize==(u16)(pIter - pCell) || CORRUPT_DB );
66959 return (u16)(pIter - pCell);
69019 BtLock *pIter;
69020 for(pIter=pBt->pLock; pIter; pIter=pIter->pNext){
69021 if( pIter->pBtree!=p ){
69022 pBlock = pIter->pBtree->db;
99022 FileChunk *pIter;
99024 for(pIter=pFirst; pIter; pIter=pNext){
99025 pNext = pIter->pNext;
99026 sqlite3_free(pIter);
99043 FileChunk *pIter;
99044 for(pIter=copy.pFirst; pIter; pIter=pIter->pNext){
99048 rc = sqlite3OsWrite(pReal, (u8*)pIter->zChunk, nChunk, iOff);
99150 FileChunk *pIter = 0;
99156 for(pIter=p->pFirst; ALWAYS(pIter) && iOff<size; pIter=pIter->pNext){
99159 if( ALWAYS(pIter) ){
99160 memjrnlFreeChunks(pIter->pNext);
99161 pIter->pNext = 0;
99165 p->endpoint.pChunk = pIter;
125531 static Index *indexIteratorFirst(IndexIterator *pIter, int *pIx){
125532 assert( pIter->i==0 );
125533 if( pIter->eType ){
125534 *pIx = pIter->u.ax.aIdx[0].ix;
125535 return pIter->u.ax.aIdx[0].p;
125538 return pIter->u.lx.pIdx;
125543 static Index *indexIteratorNext(IndexIterator *pIter, int *pIx){
125544 if( pIter->eType ){
125545 int i = ++pIter->i;
125546 if( i>=pIter->u.ax.nIdx ){
125550 *pIx = pIter->u.ax.aIdx[i].ix;
125551 return pIter->u.ax.aIdx[i].p;
125554 pIter->u.lx.pIdx = pIter->u.lx.pIdx->pNext;
125555 return pIter->u.lx.pIdx;
177201 char *pIter; /* Used to iterate through aAll */
177205 pIter = pDL->pNextDocid;
177206 assert( pDL->aAll!=0 || pIter==0 );
177208 pIter = pDL->aAll;
177211 if( pIter==0 || pIter>=(pEnd = pDL->aAll + pDL->nAll) ){
177216 pIter += sqlite3Fts3GetVarint(pIter, &iDelta);
177222 pDL->pList = pIter;
177223 fts3PoslistCopy(0, &pIter);
177224 pDL->nList = (int)(pIter - pDL->pList);
177232 while( pIter<pEnd && *pIter==0 ) pIter++;
177234 pDL->pNextDocid = pIter;
177235 assert( pIter>=&pDL->aAll[pDL->nAll] || *pIter );
178572 char *pIter;
178585 pIter = pPhrase->doclist.pList;
178640 pIter = pPh->pOrPoslist;
178644 (pIter >= (pPh->doclist.aAll + pPh->doclist.nAll));
178645 while( (pIter==0 || DOCID_CMP(iDocid, pCsr->iPrevId)<0 ) && bEof==0 ){
178648 &pIter, &iDocid, &bEof
178652 bEof = !pPh->doclist.nAll || (pIter && pIter<=pPh->doclist.aAll);
178653 while( (pIter==0 || DOCID_CMP(iDocid, pCsr->iPrevId)>0 ) && bEof==0 ){
178657 &pIter, &iDocid, &dummy, &bEof
178661 pPh->pOrPoslist = pIter;
178667 pIter = pPhrase->pOrPoslist;
178669 pIter = 0;
178672 if( pIter==0 ) return SQLITE_OK;
178674 if( *pIter==0x01 ){
178675 pIter++;
178676 pIter += fts3GetVarint32(pIter, &iThis);
178681 fts3ColumnlistCopy(0, &pIter);
178682 if( *pIter==0x00 ) return SQLITE_OK;
178683 pIter++;
178684 pIter += fts3GetVarint32(pIter, &iThis);
178686 if( *pIter==0x00 ){
178687 pIter = 0;
178690 *ppOut = ((iCol==iThis)?pIter:0);
180038 Fts3Expr *pIter = pNotBranch;
180039 while( pIter->pLeft ){
180040 pIter = pIter->pLeft;
180042 pIter->pLeft = pRet;
180043 pRet->pParent = pIter;
185053 SegmentNode *pIter;
185056 for(pIter=pTree->pLeftmost; pIter && rc==SQLITE_OK; pIter=pIter->pRight){
185057 int nStart = fts3TreeFinishNode(pIter, iHeight, iNextLeaf);
185058 int nWrite = pIter->nData - nStart;
185060 rc = fts3WriteSegment(p, iNextFree, &pIter->aData[nStart], nWrite);
185062 iNextLeaf += (pIter->nEntry+1);
189031 char *pIter = *ppIter;
189032 if( pIter ){
189036 if( 0==(*pIter & 0xFE) ){
189038 pIter = 0;
189041 fts3GetDeltaPosition(&pIter, &iIter);
189045 *ppIter = pIter;
189052 static int fts3SnippetNextCandidate(SnippetIter *pIter){
189055 if( pIter->iCurrent<0 ){
189060 pIter->iCurrent = 0;
189065 for(i=0; i<pIter->nPhrase; i++){
189066 SnippetPhrase *pPhrase = &pIter->aPhrase[i];
189067 fts3SnippetAdvance(&pPhrase->pHead, &pPhrase->iHead, pIter->nSnippet);
189073 for(i=0; i<pIter->nPhrase; i++){
189074 SnippetPhrase *pPhrase = &pIter->aPhrase[i];
189083 pIter->iCurrent = iStart = iEnd - pIter->nSnippet + 1;
189084 for(i=0; i<pIter->nPhrase; i++){
189085 SnippetPhrase *pPhrase = &pIter->aPhrase[i];
189099 SnippetIter *pIter, /* Snippet iterator */
189106 int iStart = pIter->iCurrent; /* First token of snippet */
189112 for(i=0; i<pIter->nPhrase; i++){
189113 SnippetPhrase *pPhrase = &pIter->aPhrase[i];
189118 while( iCsr<(iStart+pIter->nSnippet) && iCsr>=iStart ){
189552 char *pIter = pPhrase->doclist.pList;
189562 if( pIter ) while( 1 ){
189563 int nHit = fts3ColumnlistCount(&pIter);
189571 assert( *pIter==0x00 || *pIter==0x01 );
189572 if( *pIter!=0x01 ) break;
189573 pIter++;
189574 pIter += fts3GetVarint32(pIter, &iCol);
189793 static int fts3LcsIteratorAdvance(LcsIterator *pIter){
189798 if( NEVER(pIter==0) ) return 1;
189799 pRead = pIter->pRead;
189805 pIter->iPos += (int)(iRead-2);
189808 pIter->pRead = pRead;
189838 LcsIterator *pIter = &aIter[i];
189839 nToken -= pIter->pExpr->pPhrase->nToken;
189840 pIter->iPosOffset = nToken;
189867 LcsIterator *pIter = &aIter[i];
189868 if( pIter->pRead==0 ){
189872 if( pAdv==0 || pIter->iPos<pAdv->iPos ){
189873 pAdv = pIter;
189875 if( nThisLcs==0 || pIter->iPos==pIter[-1].iPos ){
200946 UBreakIterator *pIter; /* ICU break-iterator object */
201059 pCsr->pIter = ubrk_open(UBRK_WORD, p->zLocale, pCsr->aChar, iOut, &status);
201066 ubrk_first(pCsr->pIter);
201076 ubrk_close(pCsr->pIter);
201102 iStart = ubrk_current(pCsr->pIter);
201103 iEnd = ubrk_next(pCsr->pIter);
202576 static void rbuObjIterFreeCols(RbuObjIter *pIter){
202578 for(i=0; i<pIter->nTblCol; i++){
202579 sqlite3_free(pIter->azTblCol[i]);
202580 sqlite3_free(pIter->azTblType[i]);
202582 sqlite3_free(pIter->azTblCol);
202583 pIter->azTblCol = 0;
202584 pIter->azTblType = 0;
202585 pIter->aiSrcOrder = 0;
202586 pIter->abTblPk = 0;
202587 pIter->abNotNull = 0;
202588 pIter->nTblCol = 0;
202589 pIter->eType = 0; /* Invalid value */
202596 static void rbuObjIterClearStatements(RbuObjIter *pIter){
202599 sqlite3_finalize(pIter->pSelect);
202600 sqlite3_finalize(pIter->pInsert);
202601 sqlite3_finalize(pIter->pDelete);
202602 sqlite3_finalize(pIter->pTmpInsert);
202603 pUp = pIter->pRbuUpdate;
202610 sqlite3_free(pIter->aIdxCol);
202611 sqlite3_free(pIter->zIdxSql);
202613 pIter->pSelect = 0;
202614 pIter->pInsert = 0;
202615 pIter->pDelete = 0;
202616 pIter->pRbuUpdate = 0;
202617 pIter->pTmpInsert = 0;
202618 pIter->nCol = 0;
202619 pIter->nIdxCol = 0;
202620 pIter->aIdxCol = 0;
202621 pIter->zIdxSql = 0;
202628 static void rbuObjIterFinalize(RbuObjIter *pIter){
202629 rbuObjIterClearStatements(pIter);
202630 sqlite3_finalize(pIter->pTblIter);
202631 sqlite3_finalize(pIter->pIdxIter);
202632 rbuObjIterFreeCols(pIter);
202633 memset(pIter, 0, sizeof(RbuObjIter));
202644 static int rbuObjIterNext(sqlite3rbu *p, RbuObjIter *pIter){
202649 rbuObjIterClearStatements(pIter);
202650 if( pIter->zIdx==0 ){
202661 if( pIter->bCleanup ){
202662 rbuObjIterFreeCols(pIter);
202663 pIter->bCleanup = 0;
202664 rc = sqlite3_step(pIter->pTblIter);
202666 rc = resetAndCollectError(pIter->pTblIter, &p->zErrmsg);
202667 pIter->zTbl = 0;
202669 pIter->zTbl = (const char*)sqlite3_column_text(pIter->pTblIter, 0);
202670 pIter->zDataTbl = (const char*)sqlite3_column_text(pIter->pTblIter,1);
202671 rc = (pIter->zDataTbl && pIter->zTbl) ? SQLITE_OK : SQLITE_NOMEM;
202674 if( pIter->zIdx==0 ){
202675 sqlite3_stmt *pIdx = pIter->pIdxIter;
202676 rc = sqlite3_bind_text(pIdx, 1, pIter->zTbl, -1, SQLITE_STATIC);
202679 rc = sqlite3_step(pIter->pIdxIter);
202681 rc = resetAndCollectError(pIter->pIdxIter, &p->zErrmsg);
202682 pIter->bCleanup = 1;
202683 pIter->zIdx = 0;
202685 pIter->zIdx = (const char*)sqlite3_column_text(pIter->pIdxIter, 0);
202686 pIter->iTnum = sqlite3_column_int(pIter->pIdxIter, 1);
202687 pIter->bUnique = sqlite3_column_int(pIter->pIdxIter, 2);
202688 rc = pIter->zIdx ? SQLITE_OK : SQLITE_NOMEM;
202696 rbuObjIterFinalize(pIter);
202760 static int rbuObjIterFirst(sqlite3rbu *p, RbuObjIter *pIter){
202762 memset(pIter, 0, sizeof(RbuObjIter));
202764 rc = prepareFreeAndCollectError(p->dbRbu, &pIter->pTblIter, &p->zErrmsg,
202774 rc = prepareAndCollectError(p->dbMain, &pIter->pIdxIter, &p->zErrmsg,
202781 pIter->bCleanup = 1;
202783 return rbuObjIterNext(p, pIter);
202867 static void rbuAllocateIterArrays(sqlite3rbu *p, RbuObjIter *pIter, int nCol){
202873 pIter->azTblCol = azNew;
202874 pIter->azTblType = &azNew[nCol];
202875 pIter->aiSrcOrder = (int*)&pIter->azTblType[nCol];
202876 pIter->abTblPk = (u8*)&pIter->aiSrcOrder[nCol];
202877 pIter->abNotNull = (u8*)&pIter->abTblPk[nCol];
202878 pIter->abIndexed = (u8*)&pIter->abNotNull[nCol];
203051 static void rbuObjIterCacheIndexedCols(sqlite3rbu *p, RbuObjIter *pIter){
203056 memcpy(pIter->abIndexed, pIter->abTblPk, sizeof(u8)*pIter->nTblCol);
203058 sqlite3_mprintf("PRAGMA main.index_list = %Q", pIter->zTbl)
203062 pIter->nIndex = 0;
203069 memset(pIter->abIndexed, 0x01, sizeof(u8)*pIter->nTblCol);
203076 if( iCid>=0 ) pIter->abIndexed[iCid] = 1;
203078 memset(pIter->abIndexed, 0x01, sizeof(u8)*pIter->nTblCol);
203083 pIter->nIndex++;
203086 if( pIter->eType==RBU_PK_WITHOUT_ROWID ){
203088 pIter->nIndex--;
203092 if( bIndex==0 ) pIter->abIndexed = 0;
203105 static int rbuObjIterCacheTableInfo(sqlite3rbu *p, RbuObjIter *pIter){
203106 if( pIter->azTblCol==0 ){
203115 assert( pIter->eType==0 );
203116 rbuTableType(p, pIter->zTbl, &pIter->eType, &iTnum, &pIter->iPkTnum);
203117 if( p->rc==SQLITE_OK && pIter->eType==RBU_PK_NOTABLE ){
203119 p->zErrmsg = sqlite3_mprintf("no such table: %s", pIter->zTbl);
203122 if( pIter->zIdx==0 ) pIter->iTnum = iTnum;
203124 assert( pIter->eType==RBU_PK_NONE || pIter->eType==RBU_PK_IPK
203125 || pIter->eType==RBU_PK_EXTERNAL || pIter->eType==RBU_PK_WITHOUT_ROWID
203126 || pIter->eType==RBU_PK_VTAB
203133 sqlite3_mprintf("SELECT * FROM '%q'", pIter->zDataTbl)
203137 rbuAllocateIterArrays(p, pIter, nCol);
203143 pIter->aiSrcOrder[pIter->nTblCol] = pIter->nTblCol;
203144 pIter->azTblCol[pIter->nTblCol++] = zCopy;
203155 && bRbuRowid!=(pIter->eType==RBU_PK_VTAB || pIter->eType==RBU_PK_NONE)
203159 "table %q %s rbu_rowid column", pIter->zDataTbl,
203169 sqlite3_mprintf("PRAGMA table_info(%Q)", pIter->zTbl)
203175 for(i=iOrder; i<pIter->nTblCol; i++){
203176 if( 0==strcmp(zName, pIter->azTblCol[i]) ) break;
203178 if( i==pIter->nTblCol ){
203181 pIter->zDataTbl, zName
203189 SWAP(int, pIter->aiSrcOrder[i], pIter->aiSrcOrder[iOrder]);
203190 SWAP(char*, pIter->azTblCol[i], pIter->azTblCol[iOrder]);
203193 pIter->azTblType[iOrder] = rbuStrndup(zType, &p->rc);
203195 pIter->abTblPk[iOrder] = (u8)iPk;
203196 pIter->abNotNull[iOrder] = (u8)bNotNull || (iPk!=0);
203202 rbuObjIterCacheIndexedCols(p, pIter);
203203 assert( pIter->eType!=RBU_PK_VTAB || pIter->abIndexed==0 );
203204 assert( pIter->eType!=RBU_PK_VTAB || pIter->nIndex==0 );
203217 RbuObjIter *pIter /* Object iterator for column names */
203222 for(i=0; i<pIter->nTblCol; i++){
203223 const char *z = pIter->azTblCol[i];
203238 RbuObjIter *pIter, /* Object iterator for column names */
203248 for(i=0; i<pIter->nTblCol; i++){
203249 if( (int)pIter->abTblPk[i]==iPk ){
203250 const char *zCol = pIter->azTblCol[i];
203256 if( i==pIter->nTblCol ) break;
203283 RbuObjIter *pIter, /* RBU iterator object */
203292 "SELECT max(_rowid_) FROM \"%s%w\"", zWrite, pIter->zTbl
203301 char *zOrder = rbuObjIterGetPkList(p, pIter, "", ", ", " DESC");
203302 char *zSelect = rbuObjIterGetPkList(p, pIter, "quote(", "||','||", ")");
203303 char *zList = rbuObjIterGetPkList(p, pIter, "", ", ", "");
203309 zSelect, zWrite, pIter->zTbl, zOrder
203350 RbuObjIter *pIter /* RBU iterator object */
203363 sqlite3_mprintf("PRAGMA main.index_xinfo = %Q", pIter->zIdx)
203375 if( pIter->eType==RBU_PK_IPK ){
203377 for(i=0; pIter->abTblPk[i]==0; i++);
203378 assert( i<pIter->nTblCol );
203379 zCol = pIter->azTblCol[i];
203384 zCol = pIter->azTblCol[iCid];
203407 zSelect, pIter->zTbl, zOrder
203412 for(iCol=0; iCol<pIter->nCol; iCol++){
203465 RbuObjIter *pIter, /* Object iterator for column names */
203485 sqlite3_mprintf("PRAGMA main.index_xinfo = %Q", pIter->zIdx)
203499 pIter->aIdxCol[iSeq].nSpan, pIter->aIdxCol[iSeq].zSpan, zCollate
203506 if( pIter->eType==RBU_PK_IPK ){
203508 for(i=0; pIter->abTblPk[i]==0; i++);
203509 assert( i<pIter->nTblCol );
203510 zCol = pIter->azTblCol[i];
203518 zCol = pIter->azTblCol[iCid];
203519 zType = pIter->azTblType[iCid];
203524 if( pIter->bUnique==0 || sqlite3_column_int(pXInfo, 5) ){
203577 RbuObjIter *pIter,
203581 if( p->rc==SQLITE_OK && pIter->abIndexed ){
203584 for(i=0; i<pIter->nTblCol; i++){
203585 if( pIter->abIndexed[i] ){
203586 const char *zCol = pIter->azTblCol[i];
203599 if( pIter->eType==RBU_PK_EXTERNAL || pIter->eType==RBU_PK_NONE ){
203618 RbuObjIter *pIter
203621 if( pIter->eType==RBU_PK_VTAB || pIter->eType==RBU_PK_NONE ){
203622 zList = rbuMPrintf(p, "_rowid_ = ?%d", pIter->nTblCol+1);
203623 }else if( pIter->eType==RBU_PK_EXTERNAL ){
203626 for(i=0; i<pIter->nTblCol; i++){
203627 if( pIter->abTblPk[i] ){
203639 for(i=0; i<pIter->nTblCol; i++){
203640 if( pIter->abTblPk[i] ){
203641 const char *zCol = pIter->azTblCol[i];
203682 RbuObjIter *pIter,
203689 if( (int)strlen(zMask)!=pIter->nTblCol ){
203693 for(i=0; i<pIter->nTblCol; i++){
203694 char c = zMask[pIter->aiSrcOrder[i]];
203697 zList, zSep, pIter->azTblCol[i], i+1
203703 zList, zSep, pIter->azTblCol[i], pIter->azTblCol[i], i+1
203709 zList, zSep, pIter->azTblCol[i], pIter->azTblCol[i], i+1
203761 static char *rbuWithoutRowidPK(sqlite3rbu *p, RbuObjIter *pIter){
203763 assert( pIter->zIdx==0 );
203770 sqlite3_mprintf("PRAGMA main.index_list = %Q", pIter->zTbl)
203820 static void rbuCreateImposterTable2(sqlite3rbu *p, RbuObjIter *pIter){
203821 if( p->rc==SQLITE_OK && pIter->eType==RBU_PK_EXTERNAL ){
203822 int tnum = pIter->iPkTnum; /* Root page of PK index */
203856 iCid, pIter->azTblType[iCid], zCollate
203894 static void rbuCreateImposterTable(sqlite3rbu *p, RbuObjIter *pIter){
203895 if( p->rc==SQLITE_OK && pIter->eType!=RBU_PK_VTAB ){
203896 int tnum = pIter->iTnum;
203902 for(iCol=0; p->rc==SQLITE_OK && iCol<pIter->nTblCol; iCol++){
203904 const char *zCol = pIter->azTblCol[iCol];
203908 p->dbMain, "main", pIter->zTbl, zCol, 0, &zColl, 0, 0, 0
203911 if( pIter->eType==RBU_PK_IPK && pIter->abTblPk[iCol] ){
203917 zSql, zComma, zCol, pIter->azTblType[iCol], zPk, zColl,
203918 (pIter->abNotNull[iCol] ? " NOT NULL" : "")
203923 if( pIter->eType==RBU_PK_WITHOUT_ROWID ){
203924 char *zPk = rbuWithoutRowidPK(p, pIter);
203932 pIter->zTbl, zSql,
203933 (pIter->eType==RBU_PK_WITHOUT_ROWID ? " WITHOUT ROWID" : "")
203952 RbuObjIter *pIter,
203956 int bRbuRowid = (pIter->eType==RBU_PK_EXTERNAL || pIter->eType==RBU_PK_NONE);
203957 char *zBind = rbuObjIterGetBindlist(p, pIter->nTblCol + 1 + bRbuRowid);
203959 assert( pIter->pTmpInsert==0 );
203961 p->dbRbu, &pIter->pTmpInsert, &p->zErrmsg, sqlite3_mprintf(
203963 p->zStateDb, pIter->zDataTbl, zCollist, zRbuRowid, zBind
203998 static char *rbuObjIterGetIndexWhere(sqlite3rbu *p, RbuObjIter *pIter){
204003 assert( pIter->zIdxSql==0 && pIter->nIdxCol==0 && pIter->aIdxCol==0 );
204012 rc = sqlite3_bind_text(pStmt, 1, pIter->zIdx, -1, SQLITE_STATIC);
204016 pIter->zIdxSql = zSql = rbuStrndup(zSql, &rc);
204029 pIter->aIdxCol, (nIdxAlloc+16)*sizeof(RbuSpan)
204035 pIter->aIdxCol = aIdxCol;
204042 pIter->aIdxCol[0].zSpan = &zSql[i+1];
204049 int nSpan = &zSql[i] - pIter->aIdxCol[iIdxCol].zSpan;
204050 pIter->aIdxCol[iIdxCol++].nSpan = nSpan;
204055 int nSpan = &zSql[i] - pIter->aIdxCol[iIdxCol].zSpan;
204056 pIter->aIdxCol[iIdxCol++].nSpan = nSpan;
204057 pIter->aIdxCol[iIdxCol].zSpan = &zSql[i+1];
204081 pIter->nIdxCol = iIdxCol;
204100 RbuObjIter *pIter,
204103 assert( pIter->bCleanup==0 );
204104 if( pIter->pSelect==0 && rbuObjIterCacheTableInfo(p, pIter)==SQLITE_OK ){
204105 const int tnum = pIter->iTnum;
204108 const char *zIdx = pIter->zIdx;
204117 const char *zTbl = pIter->zTbl;
204125 assert( pIter->eType!=RBU_PK_VTAB );
204126 zPart = rbuObjIterGetIndexWhere(p, pIter);
204128 p, pIter, &zImposterCols, &zImposterPK, &zWhere, &nBind
204142 pIter->nCol = nBind;
204145 p->dbMain, &pIter->pInsert, &p->zErrmsg,
204153 p->dbMain, &pIter->pDelete, &p->zErrmsg,
204164 zStart = rbuVacuumIndexStart(p, pIter);
204174 pIter->zDataTbl,
204182 if( pIter->eType==RBU_PK_EXTERNAL || pIter->eType==RBU_PK_NONE ){
204185 zCollist, p->zStateDb, pIter->zDataTbl,
204195 zCollist, p->zStateDb, pIter->zDataTbl, zPart,
204196 zCollist, pIter->zDataTbl,
204203 p->rc = prepareFreeAndCollectError(p->dbRbu,&pIter->pSelect,pz,zSql);
204215 int bRbuRowid = (pIter->eType==RBU_PK_VTAB)
204216 ||(pIter->eType==RBU_PK_NONE)
204217 ||(pIter->eType==RBU_PK_EXTERNAL && rbuIsVacuum(p));
204218 const char *zTbl = pIter->zTbl; /* Table this step applies to */
204221 char *zBindings = rbuObjIterGetBindlist(p, pIter->nTblCol + bRbuRowid);
204222 char *zWhere = rbuObjIterGetWhere(p, pIter);
204223 char *zOldlist = rbuObjIterGetOldlist(p, pIter, "old");
204224 char *zNewlist = rbuObjIterGetOldlist(p, pIter, "new");
204226 zCollist = rbuObjIterGetCollist(p, pIter);
204227 pIter->nCol = pIter->nTblCol;
204230 rbuCreateImposterTable(p, pIter);
204231 rbuCreateImposterTable2(p, pIter);
204232 zWrite = (pIter->eType==RBU_PK_VTAB ? "" : "rbu_imp_");
204236 p->rc = prepareFreeAndCollectError(p->dbMain, &pIter->pInsert, pz,
204248 p->rc = prepareFreeAndCollectError(p->dbMain, &pIter->pDelete, pz,
204255 if( rbuIsVacuum(p)==0 && pIter->abIndexed ){
204257 if( pIter->eType==RBU_PK_EXTERNAL || pIter->eType==RBU_PK_NONE ){
204265 , p->zStateDb, pIter->zDataTbl
204266 , (pIter->eType==RBU_PK_EXTERNAL ? ", 0 AS rbu_rowid" : "")
204267 , pIter->zDataTbl
204290 if( pIter->eType==RBU_PK_EXTERNAL || pIter->eType==RBU_PK_NONE ){
204300 rbuObjIterPrepareTmpInsert(p, pIter, zCollist, zRbuRowid);
204314 zStart = rbuVacuumTableStart(p, pIter, bRbuRowid, zWrite);
204323 zOrder = rbuObjIterGetPkList(p, pIter, "", ", ", "");
204328 p->rc = prepareFreeAndCollectError(p->dbRbu, &pIter->pSelect, pz,
204334 pIter->zDataTbl, (zStart ? zStart : ""),
204367 RbuObjIter *pIter, /* Object iterator */
204382 for(pp=&pIter->pRbuUpdate; *pp; pp=&((*pp)->pNext)){
204386 pUp->pNext = pIter->pRbuUpdate;
204387 pIter->pRbuUpdate = pUp;
204396 for(pp=&pIter->pRbuUpdate; *pp!=pUp; pp=&((*pp)->pNext));
204401 pUp = (RbuUpdateStmt*)rbuMalloc(p, sizeof(RbuUpdateStmt)+pIter->nTblCol+1);
204405 char *zWhere = rbuObjIterGetWhere(p, pIter);
204406 char *zSet = rbuObjIterGetSetlist(p, pIter, zMask);
204410 memcpy(pUp->zMask, zMask, pIter->nTblCol);
204411 pUp->pNext = pIter->pRbuUpdate;
204412 pIter->pRbuUpdate = pUp;
204417 if( pIter->eType!=RBU_PK_VTAB ) zPrefix = "rbu_imp_";
204419 zPrefix, pIter->zTbl, zSet, zWhere
205146 RbuObjIter *pIter = &p->objiter;
205152 assert( eType!=RBU_DELETE || pIter->zIdx==0 );
205166 pWriter = pIter->pDelete;
205168 pWriter = pIter->pInsert;
205171 for(i=0; i<pIter->nCol; i++){
205176 && pIter->zIdx==0 && pIter->eType==RBU_PK_IPK && pIter->abTblPk[i]
205177 && sqlite3_column_type(pIter->pSelect, i)==SQLITE_NULL
205184 if( eType==RBU_DELETE && pIter->abTblPk[i]==0 ){
205188 pVal = sqlite3_column_value(pIter->pSelect, i);
205192 if( pIter->zIdx==0 ){
205193 if( pIter->eType==RBU_PK_VTAB
205194 || pIter->eType==RBU_PK_NONE
205195 || (pIter->eType==RBU_PK_EXTERNAL && rbuIsVacuum(p))
205204 assertColumnName(pIter->pSelect, pIter->nCol+1,
205207 pVal = sqlite3_column_value(pIter->pSelect, pIter->nCol+1);
205208 p->rc = sqlite3_bind_value(pWriter, pIter->nCol+1, pVal);
205229 RbuObjIter *pIter = &p->objiter;
205238 assert( eType!=RBU_UPDATE || pIter->zIdx==0 );
205240 if( pIter->zIdx==0 && (eType==RBU_IDX_DELETE || eType==RBU_IDX_INSERT) ){
205244 if( pIter->zIdx==0 ){
205258 rbuGetUpdateStmt(p, pIter, zMask, &pUpdate);
205261 for(i=0; p->rc==SQLITE_OK && i<pIter->nCol; i++){
205262 char c = zMask[pIter->aiSrcOrder[i]];
205263 pVal = sqlite3_column_value(pIter->pSelect, i);
205264 if( pIter->abTblPk[i] || c!='.' ){
205269 && (pIter->eType==RBU_PK_VTAB || pIter->eType==RBU_PK_NONE)
205272 assertColumnName(pIter->pSelect, pIter->nCol+1, "rbu_rowid");
205273 pVal = sqlite3_column_value(pIter->pSelect, pIter->nCol+1);
205274 p->rc = sqlite3_bind_value(pUpdate, pIter->nCol+1, pVal);
205461 RbuObjIter *pIter = &p->objiter;
205471 while( p->rc==SQLITE_OK && pIter->zTbl ){
205473 if( pIter->bCleanup ){
205477 if( rbuIsVacuum(p)==0 && pIter->abIndexed ){
205479 "DELETE FROM %s.'rbu_tmp_%q'", p->zStateDb, pIter->zDataTbl
205483 rbuObjIterPrepareAll(p, pIter, 0);
205487 int rc = sqlite3_step(pIter->pSelect);
205493 p->rc = sqlite3_reset(pIter->pSelect);
205498 rbuObjIterNext(p, pIter);
205502 assert( pIter->zTbl==0 );
205605 RbuObjIter *pIter = &p->objiter;
205608 while( rc==SQLITE_OK && pIter->zTbl && (pIter->bCleanup
205609 || rbuStrCompare(pIter->zIdx, pState->zIdx)
205610 || (pState->zDataTbl==0 && rbuStrCompare(pIter->zTbl, pState->zTbl))
205611 || (pState->zDataTbl && rbuStrCompare(pIter->zDataTbl, pState->zDataTbl))
205613 rc = rbuObjIterNext(p, pIter);
205616 if( rc==SQLITE_OK && !pIter->zTbl ){
206276 rbu_file *pIter;
206280 for(pIter=pRbuVfs->pMain; pIter; pIter=pIter->pMainNext);
206284 for(pIter=pRbuVfs->pMainRbu; pIter && pIter!=p; pIter=pIter->pMainRbuNext){}
206285 if( pIter==0 ){
211837 sqlite3_changeset_iter *pIter, /* Iterator handle */
211843 *pOp = pIter->op;
211844 *pnCol = pIter->nCol;
211845 *pzTab = pIter->zTab;
211846 if( pbIndirect ) *pbIndirect = pIter->bIndirect;
211857 sqlite3_changeset_iter *pIter, /* Iterator object */
211861 *pabPK = pIter->abPK;
211862 if( pnCol ) *pnCol = pIter->nCol;
211880 sqlite3_changeset_iter *pIter, /* Changeset iterator */
211884 if( pIter->op!=SQLITE_UPDATE && pIter->op!=SQLITE_DELETE ){
211887 if( iVal<0 || iVal>=pIter->nCol ){
211890 *ppValue = pIter->apValue[iVal];
211908 sqlite3_changeset_iter *pIter, /* Changeset iterator */
211912 if( pIter->op!=SQLITE_UPDATE && pIter->op!=SQLITE_INSERT ){
211915 if( iVal<0 || iVal>=pIter->nCol ){
211918 *ppValue = pIter->apValue[pIter->nCol+iVal];
211927 #define sessionChangesetNew(pIter, iVal) (pIter)->apValue[(pIter)->nCol+(iVal)]
211928 #define sessionChangesetOld(pIter, iVal) (pIter)->apValue[(iVal)]
211942 sqlite3_changeset_iter *pIter, /* Changeset iterator */
211946 if( !pIter->pConflict ){
211949 if( iVal<0 || iVal>=pIter->nCol ){
211952 *ppValue = sqlite3_column_value(pIter->pConflict, iVal);
211965 sqlite3_changeset_iter *pIter, /* Changeset iterator */
211968 if( pIter->pConflict || pIter->apValue ){
211971 *pnOut = pIter->nCol;
212232 sqlite3_changeset_iter *pIter,
212239 int nCol = pIter->nCol;
212240 int nU32 = (pIter->nCol+33)/32;
212253 for(ii=0; ii<pIter->nCol; ii++){
212254 if( sessionChangesetNew(pIter, ii) ){
212292 int bStat1 = (sqlite3_stricmp(pIter->zTab, "sqlite_stat1")==0);
212305 sessionAppendIdent(&buf, pIter->zTab, &rc);
212309 for(ii=0; ii<pIter->nCol; ii++){
212310 if( p->abPK[ii]==0 && sessionChangesetNew(pIter, ii) ){
212322 for(ii=0; ii<pIter->nCol; ii++){
212323 if( p->abPK[ii] || (bPatchset==0 && sessionChangesetOld(pIter, ii)) ){
212580 sqlite3_changeset_iter *pIter, /* Iterator to read values from */
212598 (void)xValue(pIter, i, &pVal);
212630 sqlite3_changeset_iter *pIter, /* Changeset iterator */
212639 sqlite3changeset_op(pIter, &zDummy, &nCol, &op, 0);
212640 rc = sessionBindRow(pIter,
212666 sqlite3_changeset_iter *pIter /* Iterator pointing at current change */
212671 int eOp = pIter->op;
212674 const char *zTab = pIter->zTab;
212692 sqlite3changeset_old(pIter, i, &pVal);
212694 sqlite3changeset_new(pIter, i, &pVal);
212740 sqlite3_changeset_iter *pIter, /* Changeset iterator */
212751 sqlite3changeset_op(pIter, &zDummy, &nCol, &op, 0);
212759 rc = sessionSeekToRow(p->db, pIter, p->abPK, p->pSelect);
212766 pIter->pConflict = p->pSelect;
212767 res = xConflict(pCtx, eType, pIter);
212768 pIter->pConflict = 0;
212774 u8 *aBlob = &pIter->in.aData[pIter->in.iCurrent];
212775 int nBlob = pIter->in.iNext - pIter->in.iCurrent;
212780 res = xConflict(pCtx, eType+1, pIter);
212804 rc = sessionRebaseAdd(p, res, pIter);
212836 sqlite3_changeset_iter *pIter, /* Changeset iterator */
212852 sqlite3changeset_op(pIter, &zDummy, &nCol, &op, 0);
212867 u8 *abPK = (pIter->bPatchset ? p->abPK : 0);
212868 rc = sessionBindRow(pIter, sqlite3changeset_old, nCol, abPK, p->pDelete);
212878 SQLITE_CHANGESET_DATA, p, pIter, xConflict, pCtx, pbRetry
212882 SQLITE_CHANGESET_CONFLICT, p, pIter, xConflict, pCtx, 0
212889 int bPatchset = (pbRetry==0 || pIter->bPatchset);
212891 rc = sessionUpdateFind(pIter, p, bPatchset, &pUp);
212895 sqlite3_value *pOld = sessionChangesetOld(pIter, i);
212896 sqlite3_value *pNew = sessionChangesetNew(pIter, i);
212917 SQLITE_CHANGESET_DATA, p, pIter, xConflict, pCtx, pbRetry
212923 SQLITE_CHANGESET_CONFLICT, p, pIter, xConflict, pCtx, 0
212933 rc = sessionSeekToRow(p->db, pIter, p->abPK, p->pSelect);
212941 rc = sessionBindRow(pIter, sqlite3changeset_new, nCol, 0, p->pInsert);
212950 SQLITE_CHANGESET_CONFLICT, p, pIter, xConflict, pCtx, pbReplace
212970 sqlite3_changeset_iter *pIter, /* Changeset iterator to read change from */
212979 rc = sessionApplyOneOp(pIter, pApply, xConflict, pCtx, &bReplace, &bRetry);
212989 assert( pIter->op==SQLITE_UPDATE || pIter->op==SQLITE_DELETE );
212990 rc = sessionApplyOneOp(pIter, pApply, xConflict, pCtx, 0, 0);
212999 assert( pIter->op==SQLITE_INSERT );
213002 rc = sessionBindRow(pIter,
213011 rc = sessionApplyOneOp(pIter, pApply, xConflict, pCtx, 0, 0);
213083 sqlite3_changeset_iter *pIter, /* Changeset to apply */
213106 pIter->in.bNoDiscard = 1;
213117 while( rc==SQLITE_OK && SQLITE_ROW==sqlite3changeset_next(pIter) ){
213122 sqlite3changeset_op(pIter, &zNew, &nCol, &op, 0);
213128 db, pIter->bPatchset, zTab, &sApply, xConflict, pCtx
213165 sqlite3changeset_pk(pIter, &abPK, 0);
213219 rc = sessionApplyOneWithRetry(db, pIter, &sApply, xConflict, pCtx);
213222 bPatchset = pIter->bPatchset;
213224 rc = sqlite3changeset_finalize(pIter);
213226 sqlite3changeset_finalize(pIter);
213296 sqlite3_changeset_iter *pIter; /* Iterator to skip through changeset */
213298 int rc = sessionChangesetStart(&pIter, 0, 0, nChangeset, pChangeset, bInv, 1);
213301 db, pIter, xFilter, xConflict, pCtx, ppRebase, pnRebase, flags
213354 sqlite3_changeset_iter *pIter; /* Iterator to skip through changeset */
213356 int rc = sessionChangesetStart(&pIter, xInput, pIn, 0, 0, bInverse, 1);
213359 db, pIter, xFilter, xConflict, pCtx, ppRebase, pnRebase, flags
213581 sqlite3_changeset_iter *pIter, /* Iterator to read from */
213590 while( SQLITE_ROW==sessionChangesetNext(pIter, &aRec, &nRec, 0) ){
213601 pGrp->bPatch = pIter->bPatchset;
213602 }else if( pIter->bPatchset!=pGrp->bPatch ){
213607 sqlite3changeset_op(pIter, &zNew, &nCol, &op, &bIndirect);
213613 sqlite3changeset_pk(pIter, &abPK, 0);
213644 if( sessionGrowHash(0, pIter->bPatchset, pTab) ){
213649 pTab, (pIter->bPatchset && op==SQLITE_DELETE), aRec, pTab->nChange
213658 if( pIter->bPatchset ){
213671 pIter->bPatchset, pExist, op, bIndirect, aRec, nRec, &pChange
213681 if( rc==SQLITE_OK ) rc = pIter->rc;
213772 sqlite3_changeset_iter *pIter; /* Iterator opened on pData/nData */
213775 rc = sqlite3changeset_start(&pIter, nData, pData);
213777 rc = sessionChangesetToHash(pIter, pGrp, 0);
213779 sqlite3changeset_finalize(pIter);
213803 sqlite3_changeset_iter *pIter; /* Iterator opened on pData/nData */
213806 rc = sqlite3changeset_start_strm(&pIter, xInput, pIn);
213808 rc = sessionChangesetToHash(pIter, pGrp, 0);
213810 sqlite3changeset_finalize(pIter);
213957 sqlite3_changeset_iter *pIter, /* Iterator pointed at local change */
213971 *pOut++ = pIter->bIndirect;
213972 for(i=0; i<pIter->nCol; i++){
213975 if( pIter->abPK[i] || a2[0]==0 ){
213976 if( !pIter->abPK[i] && a1[0] ) bData = 1;
213991 for(i=0; i<pIter->nCol; i++){
213994 if( pIter->abPK[i] || a2[0]!=0xFF ){
214025 sqlite3_changeset_iter *pIter, /* Input data */
214038 while( SQLITE_ROW==sessionChangesetNext(pIter, &aRec, &nRec, &bNew) ){
214043 const char *zTab = pIter->zTab;
214050 if( pIter->bPatchset ){
214055 sessionAppendByte(&sOut, pIter->bPatchset ? 'P' : 'T', &rc);
214056 sessionAppendVarint(&sOut, pIter->nCol, &rc);
214057 sessionAppendBlob(&sOut, pIter->abPK, pIter->nCol, &rc);
214058 sessionAppendBlob(&sOut,(u8*)pIter->zTab,(int)strlen(pIter->zTab)+1,&rc);
214073 switch( pIter->op ){
214079 sessionAppendByte(&sOut, pIter->bIndirect, &rc);
214091 sessionSkipRecord(&pCsr, pIter->nCol);
214093 sessionAppendByte(&sOut, pIter->bIndirect, &rc);
214094 sessionAppendRecordMerge(&sOut, pIter->nCol,
214100 sessionAppendPartialUpdate(&sOut, pIter,
214107 assert( pIter->op==SQLITE_DELETE );
214111 sessionAppendByte(&sOut, pIter->bIndirect, &rc);
214112 sessionAppendRecordMerge(&sOut, pIter->nCol,
214121 sessionAppendByte(&sOut, pIter->op, &rc);
214122 sessionAppendByte(&sOut, pIter->bIndirect, &rc);
214176 sqlite3_changeset_iter *pIter = 0; /* Iterator opened on pData/nData */
214178 rc = sqlite3changeset_start(&pIter, nRebase, (void*)pRebase);
214180 rc = sessionChangesetToHash(pIter, &p->grp, 1);
214182 sqlite3changeset_finalize(pIter);
214194 sqlite3_changeset_iter *pIter = 0; /* Iterator to skip through input */
214195 int rc = sqlite3changeset_start(&pIter, nIn, (void*)pIn);
214198 rc = sessionRebase(p, pIter, 0, 0, pnOut, ppOut);
214199 sqlite3changeset_finalize(pIter);
214215 sqlite3_changeset_iter *pIter = 0; /* Iterator to skip through input */
214216 int rc = sqlite3changeset_start_strm(&pIter, xInput, pIn);
214219 rc = sessionRebase(p, pIter, xOutput, pOut, 0, 0);
214220 sqlite3changeset_finalize(pIter);
215168 Fts5PoslistReader *pIter /* Iterator object to initialize */
217254 static int fts5CInstIterNext(CInstIter *pIter){
217256 pIter->iStart = -1;
217257 pIter->iEnd = -1;
217259 while( rc==SQLITE_OK && pIter->iInst<pIter->nInst ){
217261 rc = pIter->pApi->xInst(pIter->pFts, pIter->iInst, &ip, &ic, &io);
217263 if( ic==pIter->iCol ){
217264 int iEnd = io - 1 + pIter->pApi->xPhraseSize(pIter->pFts, ip);
217265 if( pIter->iStart<0 ){
217266 pIter->iStart = io;
217267 pIter->iEnd = iEnd;
217268 }else if( io<=pIter->iEnd ){
217269 if( iEnd>pIter->iEnd ) pIter->iEnd = iEnd;
217274 pIter->iInst++;
217289 CInstIter *pIter
217293 memset(pIter, 0, sizeof(CInstIter));
217294 pIter->pApi = pApi;
217295 pIter->pFts = pFts;
217296 pIter->iCol = iCol;
217297 rc = pApi->xInstCount(pFts, &pIter->nInst);
217300 rc = fts5CInstIterNext(pIter);
218124 static int sqlite3Fts5PoslistReaderNext(Fts5PoslistReader *pIter){
218125 if( sqlite3Fts5PoslistNext64(pIter->a, pIter->n, &pIter->i, &pIter->iPos) ){
218126 pIter->bEof = 1;
218128 return pIter->bEof;
218133 Fts5PoslistReader *pIter /* Iterator object to initialize */
218135 memset(pIter, 0, sizeof(*pIter));
218136 pIter->a = a;
218137 pIter->n = n;
218138 sqlite3Fts5PoslistReaderNext(pIter);
218139 return pIter->bEof;
219384 Fts5IndexIter *pIter; /* Iterator for this term */
219731 if( 0==sqlite3Fts5IterEof(p->pIter) ){
219732 i64 iRowid = p->pIter->iRowid;
219762 Fts5IndexIter *pIter = p->pIter;
219763 if( sqlite3Fts5IterEof(pIter)==0 && pIter->iRowid==iRowid ){
219764 if( pIter->nData==0 ) continue;
219777 sqlite3Fts5PoslistReaderInit(pIter->pData, pIter->nData, &aIter[nIter]);
219868 a = (u8*)pTerm->pIter->pData;
219869 n = pTerm->pIter->nData;
220068 Fts5IndexIter *pIter, /* Iterator to advance */
220077 iRowid = pIter->iRowid;
220079 int rc = sqlite3Fts5IterNextFrom(pIter, iLast);
220080 if( rc || sqlite3Fts5IterEof(pIter) ){
220085 iRowid = pIter->iRowid;
220105 if( sqlite3Fts5IterEof(p->pIter)==0 ){
220106 i64 iRowid = p->pIter->iRowid;
220108 rc = sqlite3Fts5IterNextFrom(p->pIter, iLast);
220136 Fts5IndexIter *pIter = pTerm->pIter;
220137 if( sqlite3Fts5IterEof(pIter)==0 ){
220138 if( pIter->iRowid==pNode->iRowid && pIter->nData>0 ){
220159 Fts5IndexIter *pIter = pPhrase->aTerm[0].pIter;
220160 fts5BufferSet(&rc, &pPhrase->poslist, pIter->nData, pIter->pData);
220204 if( p->pIter ){
220205 sqlite3Fts5IterClose(p->pIter);
220206 p->pIter = 0;
220213 &p->pIter
220215 assert( (rc==SQLITE_OK)==(p->pIter!=0) );
220217 if( 0==sqlite3Fts5IterEof(p->pIter) ){
220345 iLast = pLeft->aTerm[0].pIter->iRowid;
220364 Fts5IndexIter *pIter = pPhrase->aTerm[j].pIter;
220365 if( pIter->iRowid==iLast || pIter->bEof ) continue;
220367 if( fts5ExprAdvanceto(pIter, bDesc, &iLast, &rc, &pNode->bEof) ){
220409 if( sqlite3Fts5IterEof(p->pIter)==0 ){
220410 i64 ii = p->pIter->iRowid;
220415 rc = sqlite3Fts5IterNextFrom(p->pIter, iFrom);
220417 rc = sqlite3Fts5IterNext(p->pIter);
220420 if( sqlite3Fts5IterEof(p->pIter)==0 ){
220433 Fts5IndexIter *pIter = pTerm->pIter;
220437 rc = sqlite3Fts5IterNextFrom(pIter, iFrom);
220439 rc = sqlite3Fts5IterNext(pIter);
220442 pNode->bEof = (rc || sqlite3Fts5IterEof(pIter));
220464 Fts5IndexIter *pIter = pPhrase->aTerm[0].pIter;
220470 pPhrase->poslist.n = pIter->nData;
220472 pPhrase->poslist.p = (u8*)pIter->pData;
220474 pNode->iRowid = pIter->iRowid;
220489 Fts5IndexIter *pIter = pNode->pNear->apPhrase[0]->aTerm[0].pIter;
220493 rc = sqlite3Fts5IterNextFrom(pIter, iFrom);
220495 rc = sqlite3Fts5IterNext(pIter);
220497 if( rc==SQLITE_OK && sqlite3Fts5IterEof(pIter)==0 ){
220847 sqlite3Fts5IterClose(pTerm->pIter);
220850 sqlite3Fts5IterClose(pSyn->pIter);
222349 *ppCollist = pPhrase->aTerm[0].pIter->pData;
222350 *pnCollist = pPhrase->aTerm[0].pIter->nData;
222816 Fts5HashEntry *pIter;
222817 for(pIter=pHash->aSlot[iSlot]; pIter; pIter=pIter->pHashNext){
222819 || (pIter->nKey+1>=nTerm && 0==memcmp(fts5EntryKey(pIter), pTerm, nTerm))
222821 Fts5HashEntry *pEntry = pIter;
224285 static int fts5DlidxIterNextR(Fts5Index *p, Fts5DlidxIter *pIter, int iLvl){
224286 Fts5DlidxLvl *pLvl = &pIter->aLvl[iLvl];
224288 assert( iLvl<pIter->nLvl );
224290 if( (iLvl+1) < pIter->nLvl ){
224291 fts5DlidxIterNextR(p, pIter, iLvl+1);
224296 FTS5_DLIDX_ROWID(pIter->iSegid, iLvl, pLvl[1].iLeafPgno)
224303 return pIter->aLvl[0].bEof;
224305 static int fts5DlidxIterNext(Fts5Index *p, Fts5DlidxIter *pIter){
224306 return fts5DlidxIterNextR(p, pIter, 0);
224320 static int fts5DlidxIterFirst(Fts5DlidxIter *pIter){
224322 for(i=0; i<pIter->nLvl; i++){
224323 fts5DlidxLvlNext(&pIter->aLvl[i]);
224325 return pIter->aLvl[0].bEof;
224329 static int fts5DlidxIterEof(Fts5Index *p, Fts5DlidxIter *pIter){
224330 return p->rc!=SQLITE_OK || pIter->aLvl[0].bEof;
224333 static void fts5DlidxIterLast(Fts5Index *p, Fts5DlidxIter *pIter){
224337 for(i=pIter->nLvl-1; p->rc==SQLITE_OK && i>=0; i--){
224338 Fts5DlidxLvl *pLvl = &pIter->aLvl[i];
224347 FTS5_DLIDX_ROWID(pIter->iSegid, i-1, pLvl->iLeafPgno)
224405 static int fts5DlidxIterPrevR(Fts5Index *p, Fts5DlidxIter *pIter, int iLvl){
224406 Fts5DlidxLvl *pLvl = &pIter->aLvl[iLvl];
224408 assert( iLvl<pIter->nLvl );
224410 if( (iLvl+1) < pIter->nLvl ){
224411 fts5DlidxIterPrevR(p, pIter, iLvl+1);
224416 FTS5_DLIDX_ROWID(pIter->iSegid, iLvl, pLvl[1].iLeafPgno)
224426 return pIter->aLvl[0].bEof;
224428 static int fts5DlidxIterPrev(Fts5Index *p, Fts5DlidxIter *pIter){
224429 return fts5DlidxIterPrevR(p, pIter, 0);
224435 static void fts5DlidxIterFree(Fts5DlidxIter *pIter){
224436 if( pIter ){
224438 for(i=0; i<pIter->nLvl; i++){
224439 fts5DataRelease(pIter->aLvl[i].pData);
224441 sqlite3_free(pIter);
224451 Fts5DlidxIter *pIter = 0;
224459 pNew = (Fts5DlidxIter*)sqlite3_realloc64(pIter, nByte);
224465 pIter = pNew;
224471 pIter->nLvl = i+1;
224476 pIter->iSegid = iSegid;
224478 fts5DlidxIterFirst(pIter);
224480 fts5DlidxIterLast(p, pIter);
224485 fts5DlidxIterFree(pIter);
224486 pIter = 0;
224489 return pIter;
224492 static i64 fts5DlidxIterRowid(Fts5DlidxIter *pIter){
224493 return pIter->aLvl[0].iRowid;
224495 static int fts5DlidxIterPgno(Fts5DlidxIter *pIter){
224496 return pIter->aLvl[0].iLeafPgno;
224504 Fts5SegIter *pIter /* Iterator to advance to next page */
224507 Fts5StructureSegment *pSeg = pIter->pSeg;
224508 fts5DataRelease(pIter->pLeaf);
224509 pIter->iLeafPgno++;
224510 if( pIter->pNextLeaf ){
224511 pIter->pLeaf = pIter->pNextLeaf;
224512 pIter->pNextLeaf = 0;
224513 }else if( pIter->iLeafPgno<=pSeg->pgnoLast ){
224514 pIter->pLeaf = fts5LeafRead(p,
224515 FTS5_SEGMENT_ROWID(pSeg->iSegid, pIter->iLeafPgno)
224518 pIter->pLeaf = 0;
224520 pLeaf = pIter->pLeaf;
224523 pIter->iPgidxOff = pLeaf->szLeaf;
224525 pIter->iEndofDoclist = pLeaf->nn+1;
224527 pIter->iPgidxOff += fts5GetVarint32(&pLeaf->p[pIter->iPgidxOff],
224528 pIter->iEndofDoclist
224561 static void fts5SegIterLoadNPos(Fts5Index *p, Fts5SegIter *pIter){
224563 int iOff = pIter->iLeafOffset; /* Offset to read at */
224564 ASSERT_SZLEAF_OK(pIter->pLeaf);
224566 int iEod = MIN(pIter->iEndofDoclist, pIter->pLeaf->szLeaf);
224567 pIter->bDel = 0;
224568 pIter->nPos = 1;
224569 if( iOff<iEod && pIter->pLeaf->p[iOff]==0 ){
224570 pIter->bDel = 1;
224572 if( iOff<iEod && pIter->pLeaf->p[iOff]==0 ){
224573 pIter->nPos = 1;
224576 pIter->nPos = 0;
224581 fts5FastGetVarint32(pIter->pLeaf->p, iOff, nSz);
224582 pIter->bDel = (nSz & 0x0001);
224583 pIter->nPos = nSz>>1;
224584 assert_nc( pIter->nPos>=0 );
224586 pIter->iLeafOffset = iOff;
224590 static void fts5SegIterLoadRowid(Fts5Index *p, Fts5SegIter *pIter){
224591 u8 *a = pIter->pLeaf->p; /* Buffer to read data from */
224592 i64 iOff = pIter->iLeafOffset;
224594 ASSERT_SZLEAF_OK(pIter->pLeaf);
224595 if( iOff>=pIter->pLeaf->szLeaf ){
224596 fts5SegIterNextPage(p, pIter);
224597 if( pIter->pLeaf==0 ){
224602 a = pIter->pLeaf->p;
224604 iOff += sqlite3Fts5GetVarint(&a[iOff], (u64*)&pIter->iRowid);
224605 pIter->iLeafOffset = iOff;
224623 static void fts5SegIterLoadTerm(Fts5Index *p, Fts5SegIter *pIter, int nKeep){
224624 u8 *a = pIter->pLeaf->p; /* Buffer to read data from */
224625 i64 iOff = pIter->iLeafOffset; /* Offset to read at */
224629 if( iOff+nNew>pIter->pLeaf->szLeaf || nKeep>pIter->term.n || nNew==0 ){
224633 pIter->term.n = nKeep;
224634 fts5BufferAppendBlob(&p->rc, &pIter->term, nNew, &a[iOff]);
224635 assert( pIter->term.n<=pIter->term.nSpace );
224637 pIter->iTermLeafOffset = iOff;
224638 pIter->iTermLeafPgno = pIter->iLeafPgno;
224639 pIter->iLeafOffset = iOff;
224641 if( pIter->iPgidxOff>=pIter->pLeaf->nn ){
224642 pIter->iEndofDoclist = pIter->pLeaf->nn+1;
224645 pIter->iPgidxOff += fts5GetVarint32(&a[pIter->iPgidxOff], nExtra);
224646 pIter->iEndofDoclist += nExtra;
224649 fts5SegIterLoadRowid(p, pIter);
224656 static void fts5SegIterSetNext(Fts5Index *p, Fts5SegIter *pIter){
224657 if( pIter->flags & FTS5_SEGITER_REVERSE ){
224658 pIter->xNext = fts5SegIterNext_Reverse;
224660 pIter->xNext = fts5SegIterNext_None;
224662 pIter->xNext = fts5SegIterNext;
224677 Fts5SegIter *pIter /* Object to populate */
224685 assert( pIter->pLeaf==0 );
224690 memset(pIter, 0, sizeof(*pIter));
224691 fts5SegIterSetNext(p, pIter);
224692 pIter->pSeg = pSeg;
224693 pIter->iLeafPgno = pSeg->pgnoFirst-1;
224694 fts5SegIterNextPage(p, pIter);
224698 pIter->iLeafOffset = 4;
224699 assert( pIter->pLeaf!=0 );
224700 assert_nc( pIter->pLeaf->nn>4 );
224701 assert_nc( fts5LeafFirstTermOff(pIter->pLeaf)==4 );
224702 pIter->iPgidxOff = pIter->pLeaf->szLeaf+1;
224703 fts5SegIterLoadTerm(p, pIter, 0);
224704 fts5SegIterLoadNPos(p, pIter);
224723 static void fts5SegIterReverseInitPage(Fts5Index *p, Fts5SegIter *pIter){
224725 int n = pIter->pLeaf->szLeaf;
224726 int i = pIter->iLeafOffset;
224727 u8 *a = pIter->pLeaf->p;
224730 if( n>pIter->iEndofDoclist ){
224731 n = pIter->iEndofDoclist;
224734 ASSERT_SZLEAF_OK(pIter->pLeaf);
224752 pIter->iRowid += iDelta;
224755 if( iRowidOffset>=pIter->nRowidOffset ){
224756 int nNew = pIter->nRowidOffset + 8;
224757 int *aNew = (int*)sqlite3_realloc64(pIter->aRowidOffset,nNew*sizeof(int));
224762 pIter->aRowidOffset = aNew;
224763 pIter->nRowidOffset = nNew;
224766 pIter->aRowidOffset[iRowidOffset++] = pIter->iLeafOffset;
224767 pIter->iLeafOffset = i;
224769 pIter->iRowidOffset = iRowidOffset;
224770 fts5SegIterLoadNPos(p, pIter);
224776 static void fts5SegIterReverseNewPage(Fts5Index *p, Fts5SegIter *pIter){
224777 assert( pIter->flags & FTS5_SEGITER_REVERSE );
224778 assert( pIter->flags & FTS5_SEGITER_ONETERM );
224780 fts5DataRelease(pIter->pLeaf);
224781 pIter->pLeaf = 0;
224782 while( p->rc==SQLITE_OK && pIter->iLeafPgno>pIter->iTermLeafPgno ){
224784 pIter->iLeafPgno--;
224786 pIter->pSeg->iSegid, pIter->iLeafPgno
224792 if( pIter->iLeafPgno==pIter->iTermLeafPgno ){
224793 assert( pIter->pLeaf==0 );
224794 if( pIter->iTermLeafOffset<pNew->szLeaf ){
224795 pIter->pLeaf = pNew;
224796 pIter->iLeafOffset = pIter->iTermLeafOffset;
224805 pIter->pLeaf = pNew;
224806 pIter->iLeafOffset = iRowidOff;
224811 if( pIter->pLeaf ){
224812 u8 *a = &pIter->pLeaf->p[pIter->iLeafOffset];
224813 pIter->iLeafOffset += fts5GetVarint(a, (u64*)&pIter->iRowid);
224821 if( pIter->pLeaf ){
224822 pIter->iEndofDoclist = pIter->pLeaf->nn+1;
224823 fts5SegIterReverseInitPage(p, pIter);
224832 static int fts5MultiIterIsEmpty(Fts5Index *p, Fts5Iter *pIter){
224833 Fts5SegIter *pSeg = &pIter->aSeg[pIter->aFirst[1].iFirst];
224844 Fts5SegIter *pIter, /* Iterator to advance */
224847 assert( pIter->flags & FTS5_SEGITER_REVERSE );
224848 assert( pIter->pNextLeaf==0 );
224851 if( pIter->iRowidOffset>0 ){
224852 u8 *a = pIter->pLeaf->p;
224856 pIter->iRowidOffset--;
224857 pIter->iLeafOffset = pIter->aRowidOffset[pIter->iRowidOffset];
224858 fts5SegIterLoadNPos(p, pIter);
224859 iOff = pIter->iLeafOffset;
224861 iOff += pIter->nPos;
224864 pIter->iRowid -= iDelta;
224866 fts5SegIterReverseNewPage(p, pIter);
224878 Fts5SegIter *pIter, /* Iterator to advance */
224884 assert( (pIter->flags & FTS5_SEGITER_REVERSE)==0 );
224887 ASSERT_SZLEAF_OK(pIter->pLeaf);
224888 iOff = pIter->iLeafOffset;
224891 if( pIter->pSeg && iOff>=pIter->pLeaf->szLeaf ){
224892 fts5SegIterNextPage(p, pIter);
224893 if( p->rc || pIter->pLeaf==0 ) return;
224894 pIter->iRowid = 0;
224898 if( iOff<pIter->iEndofDoclist ){
224901 iOff += sqlite3Fts5GetVarint(&pIter->pLeaf->p[iOff], (u64*)&iDelta);
224902 pIter->iLeafOffset = iOff;
224903 pIter->iRowid += iDelta;
224904 }else if( (pIter->flags & FTS5_SEGITER_ONETERM)==0 ){
224905 if( pIter->pSeg ){
224907 if( iOff!=fts5LeafFirstTermOff(pIter->pLeaf) ){
224908 iOff += fts5GetVarint32(&pIter->pLeaf->p[iOff], nKeep);
224910 pIter->iLeafOffset = iOff;
224911 fts5SegIterLoadTerm(p, pIter, nKeep);
224919 pIter->pLeaf->p = (u8*)pList;
224920 pIter->pLeaf->nn = nList;
224921 pIter->pLeaf->szLeaf = nList;
224922 pIter->iEndofDoclist = nList;
224923 sqlite3Fts5BufferSet(&p->rc,&pIter->term, (int)strlen(zTerm), (u8*)zTerm);
224924 pIter->iLeafOffset = fts5GetVarint(pList, (u64*)&pIter->iRowid);
224932 fts5SegIterLoadNPos(p, pIter);
224936 fts5DataRelease(pIter->pLeaf);
224937 pIter->pLeaf = 0;
224950 Fts5SegIter *pIter, /* Iterator to advance */
224953 Fts5Data *pLeaf = pIter->pLeaf;
224968 iOff = pIter->iLeafOffset + pIter->nPos;
224972 assert_nc( iOff<=pIter->iEndofDoclist );
224973 if( iOff>=pIter->iEndofDoclist ){
224981 pIter->iRowid += iDelta;
224984 pIter->iLeafOffset = iOff;
224986 }else if( pIter->pSeg==0 ){
224990 assert( (pIter->flags & FTS5_SEGITER_ONETERM) || pbNewTerm );
224991 if( 0==(pIter->flags & FTS5_SEGITER_ONETERM) ){
224996 fts5DataRelease(pIter->pLeaf);
224997 pIter->pLeaf = 0;
224999 pIter->pLeaf->p = (u8*)pList;
225000 pIter->pLeaf->nn = nList;
225001 pIter->pLeaf->szLeaf = nList;
225002 pIter->iEndofDoclist = nList+1;
225003 sqlite3Fts5BufferSet(&p->rc, &pIter->term, (int)strlen(zTerm),
225005 pIter->iLeafOffset = fts5GetVarint(pList, (u64*)&pIter->iRowid);
225012 fts5SegIterNextPage(p, pIter);
225013 pLeaf = pIter->pLeaf;
225017 iOff += sqlite3Fts5GetVarint(&pLeaf->p[iOff], (u64*)&pIter->iRowid);
225018 pIter->iLeafOffset = iOff;
225021 pIter->iPgidxOff = pLeaf->szLeaf + fts5GetVarint32(
225022 &pLeaf->p[pLeaf->szLeaf], pIter->iEndofDoclist
225027 pIter->iPgidxOff = pLeaf->szLeaf + fts5GetVarint32(
225030 pIter->iLeafOffset = iOff;
225031 pIter->iEndofDoclist = iOff;
225043 if( pIter->pLeaf ){
225045 if( pIter->flags & FTS5_SEGITER_ONETERM ){
225046 fts5DataRelease(pIter->pLeaf);
225047 pIter->pLeaf = 0;
225049 fts5SegIterLoadTerm(p, pIter, nKeep);
225050 fts5SegIterLoadNPos(p, pIter);
225058 assert_nc( pIter->iLeafOffset<=pIter->pLeaf->nn );
225059 fts5FastGetVarint32(pIter->pLeaf->p, pIter->iLeafOffset, nSz);
225060 pIter->bDel = (nSz & 0x0001);
225061 pIter->nPos = nSz>>1;
225062 assert_nc( pIter->nPos>=0 );
225079 static void fts5SegIterReverse(Fts5Index *p, Fts5SegIter *pIter){
225080 Fts5DlidxIter *pDlidx = pIter->pDlidx;
225085 int iSegid = pIter->pSeg->iSegid;
225089 Fts5Data *pLeaf = pIter->pLeaf; /* Current leaf data */
225095 if( pIter->iTermLeafPgno==pIter->iLeafPgno ){
225096 iPoslist = pIter->iTermLeafOffset;
225101 pIter->iLeafOffset = iPoslist;
225106 if( pIter->iEndofDoclist>=pLeaf->szLeaf ){
225108 Fts5StructureSegment *pSeg = pIter->pSeg;
225112 for(pgno=pIter->iLeafPgno+1; !p->rc && pgno<=pSeg->pgnoLast; pgno++){
225141 fts5DataRelease(pIter->pLeaf);
225142 pIter->pLeaf = pLast;
225143 pIter->iLeafPgno = pgnoLast;
225149 iOff += fts5GetVarint(&pLast->p[iOff], (u64*)&pIter->iRowid);
225150 pIter->iLeafOffset = iOff;
225153 pIter->iEndofDoclist = pLast->nn+1;
225155 pIter->iEndofDoclist = fts5LeafFirstTermOff(pLast);
225159 fts5SegIterReverseInitPage(p, pIter);
225168 static void fts5SegIterLoadDlidx(Fts5Index *p, Fts5SegIter *pIter){
225169 int iSeg = pIter->pSeg->iSegid;
225170 int bRev = (pIter->flags & FTS5_SEGITER_REVERSE);
225171 Fts5Data *pLeaf = pIter->pLeaf; /* Current leaf data */
225173 assert( pIter->flags & FTS5_SEGITER_ONETERM );
225174 assert( pIter->pDlidx==0 );
225179 if( pIter->iTermLeafPgno==pIter->iLeafPgno
225180 && pIter->iEndofDoclist<pLeaf->szLeaf
225185 pIter->pDlidx = fts5DlidxIterInit(p, bRev, iSeg, pIter->iTermLeafPgno);
225205 Fts5SegIter *pIter, /* Iterator to seek */
225209 const u8 *a = pIter->pLeaf->p;
225210 u32 n = (u32)pIter->pLeaf->nn;
225221 iPgidx = (u32)pIter->pLeaf->szLeaf;
225278 fts5DataRelease(pIter->pLeaf);
225279 pIter->pLeaf = 0;
225283 fts5SegIterNextPage(p, pIter);
225284 if( pIter->pLeaf==0 ) return;
225285 a = pIter->pLeaf->p;
225286 if( fts5LeafIsTermless(pIter->pLeaf)==0 ){
225287 iPgidx = (u32)pIter->pLeaf->szLeaf;
225288 iPgidx += fts5GetVarint32(&pIter->pLeaf->p[iPgidx], iOff);
225289 if( iOff<4 || (i64)iOff>=pIter->pLeaf->szLeaf ){
225295 n = (u32)pIter->pLeaf->nn;
225308 pIter->iLeafOffset = iOff + nNew;
225309 pIter->iTermLeafOffset = pIter->iLeafOffset;
225310 pIter->iTermLeafPgno = pIter->iLeafPgno;
225312 fts5BufferSet(&p->rc, &pIter->term, nKeep, pTerm);
225313 fts5BufferAppendBlob(&p->rc, &pIter->term, nNew, &a[iOff]);
225316 pIter->iEndofDoclist = pIter->pLeaf->nn+1;
225320 pIter->iEndofDoclist = iTermOff + nExtra;
225322 pIter->iPgidxOff = iPgidx;
225324 fts5SegIterLoadRowid(p, pIter);
225325 fts5SegIterLoadNPos(p, pIter);
225352 Fts5SegIter *pIter /* Object to populate */
225361 memset(pIter, 0, sizeof(*pIter));
225362 pIter->pSeg = pSeg;
225383 pIter->iLeafPgno = iPg - 1;
225384 fts5SegIterNextPage(p, pIter);
225386 if( pIter->pLeaf ){
225387 fts5LeafSeek(p, bGe, pIter, pTerm, nTerm);
225391 pIter->flags |= FTS5_SEGITER_ONETERM;
225392 if( pIter->pLeaf ){
225394 pIter->flags |= FTS5_SEGITER_REVERSE;
225397 fts5SegIterLoadDlidx(p, pIter);
225400 fts5SegIterReverse(p, pIter);
225405 fts5SegIterSetNext(p, pIter);
225416 || pIter->pLeaf==0 /* 2 */
225417 || fts5BufferCompareBlob(&pIter->term, pTerm, nTerm)==0 /* 3 */
225418 || (bGe && fts5BufferCompareBlob(&pIter->term, pTerm, nTerm)>0) /* 4 */
225434 Fts5SegIter *pIter /* Object to populate */
225465 pIter->flags |= FTS5_SEGITER_ONETERM;
225469 sqlite3Fts5BufferSet(&p->rc, &pIter->term, n, z);
225471 pIter->pLeaf = pLeaf;
225472 pIter->iLeafOffset = fts5GetVarint(pLeaf->p, (u64*)&pIter->iRowid);
225473 pIter->iEndofDoclist = pLeaf->nn;
225476 pIter->flags |= FTS5_SEGITER_REVERSE;
225477 fts5SegIterReverseInitPage(p, pIter);
225479 fts5SegIterLoadNPos(p, pIter);
225483 fts5SegIterSetNext(p, pIter);
225489 static void fts5SegIterClear(Fts5SegIter *pIter){
225490 fts5BufferFree(&pIter->term);
225491 fts5DataRelease(pIter->pLeaf);
225492 fts5DataRelease(pIter->pNextLeaf);
225493 fts5DlidxIterFree(pIter->pDlidx);
225494 sqlite3_free(pIter->aRowidOffset);
225495 memset(pIter, 0, sizeof(Fts5SegIter));
225507 Fts5Iter *pIter,
225512 int i1 = p1 - pIter->aSeg;
225513 int i2 = p2 - pIter->aSeg;
225528 res = ((p1->iRowid > p2->iRowid)==pIter->bRev) ? -1 : 1;
225548 static void fts5AssertMultiIterSetup(Fts5Index *p, Fts5Iter *pIter){
225550 Fts5SegIter *pFirst = &pIter->aSeg[ pIter->aFirst[1].iFirst ];
225553 assert( (pFirst->pLeaf==0)==pIter->base.bEof );
225556 for(i=0; i<pIter->nSeg; i++){
225557 Fts5SegIter *p1 = &pIter->aSeg[i];
225561 || p1->iRowid==pIter->iSwitchRowid
225562 || (p1->iRowid<pIter->iSwitchRowid)==pIter->bRev
225566 for(i=0; i<pIter->nSeg; i+=2){
225567 Fts5SegIter *p1 = &pIter->aSeg[i];
225568 Fts5SegIter *p2 = &pIter->aSeg[i+1];
225569 Fts5CResult *pRes = &pIter->aFirst[(pIter->nSeg + i) / 2];
225570 fts5AssertComparisonResult(pIter, p1, p2, pRes);
225573 for(i=1; i<(pIter->nSeg / 2); i+=2){
225574 Fts5SegIter *p1 = &pIter->aSeg[ pIter->aFirst[i*2].iFirst ];
225575 Fts5SegIter *p2 = &pIter->aSeg[ pIter->aFirst[i*2+1].iFirst ];
225576 Fts5CResult *pRes = &pIter->aFirst[i];
225577 fts5AssertComparisonResult(pIter, p1, p2, pRes);
225593 static int fts5MultiIterDoCompare(Fts5Iter *pIter, int iOut){
225599 Fts5CResult *pRes = &pIter->aFirst[iOut];
225601 assert( iOut<pIter->nSeg && iOut>0 );
225602 assert( pIter->bRev==0 || pIter->bRev==1 );
225604 if( iOut>=(pIter->nSeg/2) ){
225605 i1 = (iOut - pIter->nSeg/2) * 2;
225608 i1 = pIter->aFirst[iOut*2].iFirst;
225609 i2 = pIter->aFirst[iOut*2+1].iFirst;
225611 p1 = &pIter->aSeg[i1];
225612 p2 = &pIter->aSeg[i2];
225629 res = ((p1->iRowid > p2->iRowid)==pIter->bRev) ? -1 : +1;
225649 Fts5SegIter *pIter, /* Iterator to advance */
225652 assert( iLeafPgno>pIter->iLeafPgno );
225654 if( iLeafPgno>pIter->pSeg->pgnoLast ){
225657 fts5DataRelease(pIter->pNextLeaf);
225658 pIter->pNextLeaf = 0;
225659 pIter->iLeafPgno = iLeafPgno-1;
225660 fts5SegIterNextPage(p, pIter);
225661 assert( p->rc!=SQLITE_OK || pIter->iLeafPgno==iLeafPgno );
225663 if( p->rc==SQLITE_OK && ALWAYS(pIter->pLeaf!=0) ){
225665 u8 *a = pIter->pLeaf->p;
225666 int n = pIter->pLeaf->szLeaf;
225668 iOff = fts5LeafFirstRowidOff(pIter->pLeaf);
225672 iOff += fts5GetVarint(&a[iOff], (u64*)&pIter->iRowid);
225673 pIter->iLeafOffset = iOff;
225674 fts5SegIterLoadNPos(p, pIter);
225687 Fts5SegIter *pIter, /* Iterator to advance */
225690 int bRev = (pIter->flags & FTS5_SEGITER_REVERSE);
225691 Fts5DlidxIter *pDlidx = pIter->pDlidx;
225692 int iLeafPgno = pIter->iLeafPgno;
225695 assert( pIter->flags & FTS5_SEGITER_ONETERM );
225696 assert( pIter->pDlidx );
225697 assert( pIter->pLeaf );
225704 assert_nc( iLeafPgno>=pIter->iLeafPgno || p->rc );
225705 if( iLeafPgno>pIter->iLeafPgno ){
225706 fts5SegIterGotoPage(p, pIter, iLeafPgno);
225710 assert( pIter->pNextLeaf==0 );
225711 assert( iMatch<pIter->iRowid );
225717 assert( fts5DlidxIterEof(p, pDlidx) || iLeafPgno<=pIter->iLeafPgno );
225719 if( iLeafPgno<pIter->iLeafPgno ){
225720 pIter->iLeafPgno = iLeafPgno+1;
225721 fts5SegIterReverseNewPage(p, pIter);
225727 if( bMove && p->rc==SQLITE_OK ) pIter->xNext(p, pIter, 0);
225728 if( pIter->pLeaf==0 ) break;
225729 if( bRev==0 && pIter->iRowid>=iMatch ) break;
225730 if( bRev!=0 && pIter->iRowid<=iMatch ) break;
225739 static void fts5MultiIterFree(Fts5Iter *pIter){
225740 if( pIter ){
225742 for(i=0; i<pIter->nSeg; i++){
225743 fts5SegIterClear(&pIter->aSeg[i]);
225745 fts5BufferFree(&pIter->poslist);
225746 sqlite3_free(pIter);
225752 Fts5Iter *pIter, /* Iterator to update aFirst[] array for */
225757 for(i=(pIter->nSeg+iChanged)/2; i>=iMinset && p->rc==SQLITE_OK; i=i/2){
225759 if( (iEq = fts5MultiIterDoCompare(pIter, i)) ){
225760 Fts5SegIter *pSeg = &pIter->aSeg[iEq];
225763 i = pIter->nSeg + iEq;
225779 Fts5Iter *pIter, /* Iterator to update aFirst[] array for */
225783 Fts5SegIter *pNew = &pIter->aSeg[iChanged];
225785 if( pNew->iRowid==pIter->iSwitchRowid
225786 || (pNew->iRowid<pIter->iSwitchRowid)==pIter->bRev
225789 Fts5SegIter *pOther = &pIter->aSeg[iChanged ^ 0x0001];
225790 pIter->iSwitchRowid = pIter->bRev ? SMALLEST_INT64 : LARGEST_INT64;
225791 for(i=(pIter->nSeg+iChanged)/2; 1; i=i/2){
225792 Fts5CResult *pRes = &pIter->aFirst[i];
225800 }else if( (pOther->iRowid>pNew->iRowid)==pIter->bRev ){
225801 pIter->iSwitchRowid = pOther->iRowid;
225803 }else if( (pOther->iRowid>pIter->iSwitchRowid)==pIter->bRev ){
225804 pIter->iSwitchRowid = pOther->iRowid;
225807 pRes->iFirst = (u16)(pNew - pIter->aSeg);
225810 pOther = &pIter->aSeg[ pIter->aFirst[i ^ 0x0001].iFirst ];
225821 static void fts5MultiIterSetEof(Fts5Iter *pIter){
225822 Fts5SegIter *pSeg = &pIter->aSeg[ pIter->aFirst[1].iFirst ];
225823 pIter->base.bEof = pSeg->pLeaf==0;
225824 pIter->iSwitchRowid = pSeg->iRowid;
225836 Fts5Iter *pIter,
225841 assert( pIter->base.bEof==0 );
225843 int iFirst = pIter->aFirst[1].iFirst;
225845 Fts5SegIter *pSeg = &pIter->aSeg[iFirst];
225854 || fts5MultiIterAdvanceRowid(pIter, iFirst, &pSeg)
225856 fts5MultiIterAdvanced(p, pIter, iFirst, 1);
225857 fts5MultiIterSetEof(pIter);
225858 pSeg = &pIter->aSeg[pIter->aFirst[1].iFirst];
225862 fts5AssertMultiIterSetup(p, pIter);
225863 assert( pSeg==&pIter->aSeg[pIter->aFirst[1].iFirst] && pSeg->pLeaf );
225864 if( pIter->bSkipEmpty==0 || pSeg->nPos ){
225865 pIter->xSetOutputs(pIter, pSeg);
225874 Fts5Iter *pIter,
225877 assert( pIter->bSkipEmpty );
225881 int iFirst = pIter->aFirst[1].iFirst;
225882 Fts5SegIter *pSeg = &pIter->aSeg[iFirst];
225888 || fts5MultiIterAdvanceRowid(pIter, iFirst, &pSeg)
225890 fts5MultiIterAdvanced(p, pIter, iFirst, 1);
225891 fts5MultiIterSetEof(pIter);
225894 fts5AssertMultiIterSetup(p, pIter);
225896 }while( fts5MultiIterIsEmpty(p, pIter) );
226138 Fts5Iter *pIter
226147 if( pColset->nCol>1 && sqlite3Fts5BufferSize(pRc, &pIter->poslist, nPos) ){
226155 pIter->base.pData = pIter->poslist.p;
226156 pIter->base.nData = pIter->poslist.n;
226169 pIter->base.pData = aCopy;
226170 pIter->base.nData = p-aCopy;
226173 fts5BufferSafeAppendBlob(&pIter->poslist, aCopy, p-aCopy);
226176 pIter->base.pData = pIter->poslist.p;
226177 pIter->base.nData = pIter->poslist.n;
226194 static void fts5IterSetOutputs_None(Fts5Iter *pIter, Fts5SegIter *pSeg){
226195 assert( pIter->pIndex->pConfig->eDetail==FTS5_DETAIL_NONE );
226196 pIter->base.iRowid = pSeg->iRowid;
226197 pIter->base.nData = pSeg->nPos;
226204 static void fts5IterSetOutputs_Nocolset(Fts5Iter *pIter, Fts5SegIter *pSeg){
226205 pIter->base.iRowid = pSeg->iRowid;
226206 pIter->base.nData = pSeg->nPos;
226208 assert( pIter->pIndex->pConfig->eDetail!=FTS5_DETAIL_NONE );
226209 assert( pIter->pColset==0 );
226214 pIter->base.pData = &pSeg->pLeaf->p[pSeg->iLeafOffset];
226219 fts5BufferZero(&pIter->poslist);
226220 fts5SegiterPoslist(pIter->pIndex, pSeg, 0, &pIter->poslist);
226221 pIter->base.pData = pIter->poslist.p;
226229 static void fts5IterSetOutputs_ZeroColset(Fts5Iter *pIter, Fts5SegIter *pSeg){
226231 pIter->base.nData = 0;
226239 static void fts5IterSetOutputs_Col(Fts5Iter *pIter, Fts5SegIter *pSeg){
226240 fts5BufferZero(&pIter->poslist);
226241 fts5SegiterPoslist(pIter->pIndex, pSeg, pIter->pColset, &pIter->poslist);
226242 pIter->base.iRowid = pSeg->iRowid;
226243 pIter->base.pData = pIter->poslist.p;
226244 pIter->base.nData = pIter->poslist.n;
226257 static void fts5IterSetOutputs_Col100(Fts5Iter *pIter, Fts5SegIter *pSeg){
226259 assert( pIter->pIndex->pConfig->eDetail==FTS5_DETAIL_COLUMNS );
226260 assert( pIter->pColset );
226263 fts5IterSetOutputs_Col(pIter, pSeg);
226268 int *aiCol = pIter->pColset->aiCol;
226269 int *aiColEnd = &aiCol[pIter->pColset->nCol];
226271 u8 *aOut = pIter->poslist.p;
226274 pIter->base.iRowid = pSeg->iRowid;
226289 pIter->base.pData = pIter->poslist.p;
226290 pIter->base.nData = aOut - pIter->poslist.p;
226297 static void fts5IterSetOutputs_Full(Fts5Iter *pIter, Fts5SegIter *pSeg){
226298 Fts5Colset *pColset = pIter->pColset;
226299 pIter->base.iRowid = pSeg->iRowid;
226301 assert( pIter->pIndex->pConfig->eDetail==FTS5_DETAIL_FULL );
226308 int *pRc = &pIter->pIndex->rc;
226309 fts5BufferZero(&pIter->poslist);
226310 fts5IndexExtractColset(pRc, pColset, a, pSeg->nPos, pIter);
226315 fts5BufferZero(&pIter->poslist);
226316 fts5SegiterPoslist(pIter->pIndex, pSeg, pColset, &pIter->poslist);
226317 pIter->base.pData = pIter->poslist.p;
226318 pIter->base.nData = pIter->poslist.n;
226322 static void fts5IterSetOutputCb(int *pRc, Fts5Iter *pIter){
226323 assert( pIter!=0 || (*pRc)!=SQLITE_OK );
226325 Fts5Config *pConfig = pIter->pIndex->pConfig;
226327 pIter->xSetOutputs = fts5IterSetOutputs_None;
226330 else if( pIter->pColset==0 ){
226331 pIter->xSetOutputs = fts5IterSetOutputs_Nocolset;
226334 else if( pIter->pColset->nCol==0 ){
226335 pIter->xSetOutputs = fts5IterSetOutputs_ZeroColset;
226339 pIter->xSetOutputs = fts5IterSetOutputs_Full;
226345 pIter->xSetOutputs = fts5IterSetOutputs_Col100;
226346 sqlite3Fts5BufferSize(pRc, &pIter->poslist, pConfig->nCol);
226348 pIter->xSetOutputs = fts5IterSetOutputs_Col;
226412 Fts5SegIter *pIter = &pNew->aSeg[iIter++];
226413 fts5SegIterHashInit(p, pTerm, nTerm, flags, pIter);
226418 Fts5SegIter *pIter = &pNew->aSeg[iIter++];
226420 fts5SegIterInit(p, pSeg, pIter);
226422 fts5SegIterSeekInit(p, pTerm, nTerm, flags, pSeg, pIter);
226481 Fts5SegIter *pIter = &pNew->aSeg[1];
226483 pIter->flags = FTS5_SEGITER_ONETERM;
226485 pIter->pLeaf = pData;
226486 pIter->iLeafOffset = fts5GetVarint(pData->p, (u64*)&pIter->iRowid);
226487 pIter->iEndofDoclist = pData->nn;
226491 pIter->flags |= FTS5_SEGITER_REVERSE;
226492 fts5SegIterReverseInitPage(p, pIter);
226494 fts5SegIterLoadNPos(p, pIter);
226500 fts5SegIterSetNext(p, pIter);
226512 static int fts5MultiIterEof(Fts5Index *p, Fts5Iter *pIter){
226513 assert( pIter!=0 || p->rc!=SQLITE_OK );
226515 || (pIter->aSeg[ pIter->aFirst[1].iFirst ].pLeaf==0)==pIter->base.bEof
226517 return (p->rc || pIter->base.bEof);
226525 static i64 fts5MultiIterRowid(Fts5Iter *pIter){
226526 assert( pIter->aSeg[ pIter->aFirst[1].iFirst ].pLeaf );
226527 return pIter->aSeg[ pIter->aFirst[1].iFirst ].iRowid;
226535 Fts5Iter *pIter,
226540 fts5MultiIterNext(p, pIter, 1, iMatch);
226541 if( fts5MultiIterEof(p, pIter) ) break;
226542 iRowid = fts5MultiIterRowid(pIter);
226543 if( pIter->bRev==0 && iRowid>=iMatch ) break;
226544 if( pIter->bRev!=0 && iRowid<=iMatch ) break;
226552 static const u8 *fts5MultiIterTerm(Fts5Iter *pIter, int *pn){
226553 Fts5SegIter *p = &pIter->aSeg[ pIter->aFirst[1].iFirst ];
227127 static void fts5TrimSegments(Fts5Index *p, Fts5Iter *pIter){
227131 for(i=0; i<pIter->nSeg && p->rc==SQLITE_OK; i++){
227132 Fts5SegIter *pSeg = &pIter->aSeg[i];
227214 Fts5Iter *pIter = 0; /* Iterator to read input data */
227268 for(fts5MultiIterNew(p, pStruct, flags, 0, 0, 0, iLvl, nInput, &pIter);
227269 fts5MultiIterEof(p, pIter)==0;
227270 fts5MultiIterNext(p, pIter, 0, 0)
227272 Fts5SegIter *pSegIter = &pIter->aSeg[ pIter->aFirst[1].iFirst ];
227277 pTerm = fts5MultiIterTerm(pIter, &nTerm);
227297 fts5WriteAppendRowid(p, &writer, fts5MultiIterRowid(pIter));
227318 assert( pIter!=0 || p->rc!=SQLITE_OK );
227319 if( fts5MultiIterEof(p, pIter) ){
227341 fts5TrimSegments(p, pIter);
227345 fts5MultiIterFree(pIter);
227800 static void fts5DoclistIterNext(Fts5DoclistIter *pIter){
227801 u8 *p = pIter->aPoslist + pIter->nSize + pIter->nPoslist;
227803 assert( pIter->aPoslist || (p==0 && pIter->aPoslist==0) );
227804 if( p>=pIter->aEof ){
227805 pIter->aPoslist = 0;
227810 pIter->iRowid += iDelta;
227815 pIter->nSize = fts5GetVarint32(p, nPos);
227816 pIter->nPoslist = (nPos>>1);
227818 pIter->nPoslist = ((int)(p[0])) >> 1;
227819 pIter->nSize = 1;
227822 pIter->aPoslist = p;
227823 if( &pIter->aPoslist[pIter->nPoslist]>pIter->aEof ){
227824 pIter->aPoslist = 0;
227831 Fts5DoclistIter *pIter
227833 memset(pIter, 0, sizeof(*pIter));
227835 pIter->aPoslist = pBuf->p;
227836 pIter->aEof = &pBuf->p[pBuf->n];
227837 fts5DoclistIterNext(pIter);
228560 Fts5Iter *pIter = (Fts5Iter*)pIndexIter;
228561 assert( pIter->pIndex->rc==SQLITE_OK );
228562 fts5MultiIterNext(pIter->pIndex, pIter, 0, 0);
228563 return fts5IndexReturn(pIter->pIndex);
228570 Fts5Iter *pIter = (Fts5Iter*)pIndexIter;
228571 Fts5Index *p = pIter->pIndex;
228573 assert( pIter->pIndex->rc==SQLITE_OK );
228575 fts5MultiIterNext(p, pIter, 0, 0);
228577 Fts5SegIter *pSeg = &pIter->aSeg[ pIter->aFirst[1].iFirst ];
228581 pIter->base.bEof = 1;
228585 return fts5IndexReturn(pIter->pIndex);
228594 Fts5Iter *pIter = (Fts5Iter*)pIndexIter;
228595 fts5MultiIterNextFrom(pIter->pIndex, pIter, iMatch);
228596 return fts5IndexReturn(pIter->pIndex);
228615 Fts5Iter *pIter = (Fts5Iter*)pIndexIter;
228616 Fts5Index *pIndex = pIter->pIndex;
228617 fts5MultiIterFree(pIter);
228782 Fts5IndexIter *pIter = 0;
228783 int rc = sqlite3Fts5IndexQuery(p, z, n, flags, 0, &pIter);
228785 while( rc==SQLITE_OK && ALWAYS(pIter!=0) && 0==sqlite3Fts5IterEof(pIter) ){
228786 i64 rowid = pIter->iRowid;
228792 for(sqlite3Fts5PoslistReaderInit(pIter->pData, pIter->nData, &sReader);
228802 rc = sqlite3Fts5IterNext(pIter);
228805 sqlite3Fts5IterClose(pIter);
229148 Fts5Iter *pIter; /* Used to iterate through entire index */
229187 for(fts5MultiIterNew(p, pStruct, flags, 0, 0, 0, -1, 0, &pIter);
229188 fts5MultiIterEof(p, pIter)==0;
229189 fts5MultiIterNext(p, pIter, 0, 0)
229194 i64 iRowid = fts5MultiIterRowid(pIter);
229195 char *z = (char*)fts5MultiIterTerm(pIter, &n);
229201 if( 0==fts5MultiIterIsEmpty(p, pIter) ){
229206 fts5SegiterPoslist(p, &pIter->aSeg[pIter->aFirst[1].iFirst], 0, &poslist);
229217 fts5MultiIterFree(pIter);
231895 Fts5PhraseIter *pIter,
231899 if( pIter->a>=pIter->b ){
231904 pIter->a += fts5GetVarint32(pIter->a, iVal);
231906 pIter->a += fts5GetVarint32(pIter->a, iVal);
231909 pIter->a += fts5GetVarint32(pIter->a, iVal);
231918 Fts5PhraseIter *pIter,
231923 int rc = fts5CsrPoslist(pCsr, iPhrase, &pIter->a, &n);
231925 assert( pIter->a || n==0 );
231926 pIter->b = (pIter->a ? &pIter->a[n] : 0);
231929 fts5ApiPhraseNext(pCtx, pIter, piCol, piOff);
231936 Fts5PhraseIter *pIter,
231943 if( pIter->a>=pIter->b ){
231947 pIter->a += fts5GetVarint32(&pIter->a[0], iIncr);
231953 if( pIter->a>=pIter->b ){
231957 if( pIter->a[0]==0x01 ) break;
231958 pIter->a += fts5GetVarint32(pIter->a, dummy);
231960 pIter->a += 1 + fts5GetVarint32(&pIter->a[1], *piCol);
231967 Fts5PhraseIter *pIter,
231980 pIter->a = &pSorter->aPoslist[i1];
231982 rc = sqlite3Fts5ExprPhraseCollist(pCsr->pExpr, iPhrase, &pIter->a, &n);
231985 assert( pIter->a || n==0 );
231986 pIter->b = (pIter->a ? &pIter->a[n] : 0);
231988 fts5ApiPhraseNextColumn(pCtx, pIter, piCol);
231992 rc = fts5CsrPoslist(pCsr, iPhrase, &pIter->a, &n);
231994 assert( pIter->a || n==0 );
231995 pIter->b = (pIter->a ? &pIter->a[n] : 0);
231998 }else if( pIter->a[0]==0x01 ){
231999 pIter->a += 1 + fts5GetVarint32(&pIter->a[1], *piCol);
236438 Fts5IndexIter *pIter; /* Term/rowid iterator object */
236772 sqlite3Fts5IterClose(pCsr->pIter);
236775 pCsr->pIter = 0;
236798 if( sqlite3Fts5IterEof(pCsr->pIter) ){
236803 zTerm = sqlite3Fts5IterTerm(pCsr->pIter, &nTerm);
236820 Fts5IndexIter *pIter = pCsr->pIter;
236824 assert( sqlite3Fts5IterEof(pIter)==0 );
236827 || sqlite3Fts5PoslistNext64(pIter->pData, pIter->nData, po, pp)
236832 rc = sqlite3Fts5IterNextScan(pCsr->pIter);
236870 if( sqlite3Fts5IterEof(pCsr->pIter) ){
236876 zTerm = sqlite3Fts5IterTerm(pCsr->pIter, &nTerm);
236899 pPos = pCsr->pIter->pData;
236900 nPos = pCsr->pIter->nData;
236948 rc = sqlite3Fts5IterNextScan(pCsr->pIter);
236953 zTerm = sqlite3Fts5IterTerm(pCsr->pIter, &nTerm);
236959 if( sqlite3Fts5IterEof(pCsr->pIter) ) break;
237029 rc = sqlite3Fts5IndexQuery(pIndex, zTerm, nTerm, f, 0, &pCsr->pIter);
237093 sqlite3_result_int64(pCtx, pCsr->pIter->iRowid);