fts3.c
上传用户:sunhongbo
上传日期:2022-01-25
资源大小:3010k
文件大小:200k
源码类别:

数据库系统

开发平台:

C/C++

  1.       if( aTerm[i].nTerm>nToken ) continue;
  2.       if( !aTerm[i].isPrefix && aTerm[i].nTerm<nToken ) continue;
  3.       assert( aTerm[i].nTerm<=nToken );
  4.       if( memcmp(aTerm[i].pTerm, zToken, aTerm[i].nTerm) ) continue;
  5.       if( aTerm[i].iPhrase>1 && (prevMatch & (1<<i))==0 ) continue;
  6.       match |= 1<<i;
  7.       if( i==nTerm-1 || aTerm[i+1].iPhrase==1 ){
  8.         for(j=aTerm[i].iPhrase-1; j>=0; j--){
  9.           int k = (iRotor-j) & FTS3_ROTOR_MASK;
  10.           snippetAppendMatch(pSnippet, iColumn, i-j, iPos-j,
  11.                 iRotorBegin[k], iRotorLen[k]);
  12.         }
  13.       }
  14.     }
  15.     prevMatch = match<<1;
  16.     iRotor++;
  17.   }
  18.   pTModule->xClose(pTCursor);  
  19. }
  20. /*
  21. ** Remove entries from the pSnippet structure to account for the NEAR
  22. ** operator. When this is called, pSnippet contains the list of token 
  23. ** offsets produced by treating all NEAR operators as AND operators.
  24. ** This function removes any entries that should not be present after
  25. ** accounting for the NEAR restriction. For example, if the queried
  26. ** document is:
  27. **
  28. **     "A B C D E A"
  29. **
  30. ** and the query is:
  31. ** 
  32. **     A NEAR/0 E
  33. **
  34. ** then when this function is called the Snippet contains token offsets
  35. ** 0, 4 and 5. This function removes the "0" entry (because the first A
  36. ** is not near enough to an E).
  37. */
  38. static void trimSnippetOffsetsForNear(Query *pQuery, Snippet *pSnippet){
  39.   int ii;
  40.   int iDir = 1;
  41.   while(iDir>-2) {
  42.     assert( iDir==1 || iDir==-1 );
  43.     for(ii=0; ii<pSnippet->nMatch; ii++){
  44.       int jj;
  45.       int nNear;
  46.       struct snippetMatch *pMatch = &pSnippet->aMatch[ii];
  47.       QueryTerm *pQueryTerm = &pQuery->pTerms[pMatch->iTerm];
  48.       if( (pMatch->iTerm+iDir)<0 
  49.        || (pMatch->iTerm+iDir)>=pQuery->nTerms
  50.       ){
  51.         continue;
  52.       }
  53.      
  54.       nNear = pQueryTerm->nNear;
  55.       if( iDir<0 ){
  56.         nNear = pQueryTerm[-1].nNear;
  57.       }
  58.   
  59.       if( pMatch->iTerm>=0 && nNear ){
  60.         int isOk = 0;
  61.         int iNextTerm = pMatch->iTerm+iDir;
  62.         int iPrevTerm = iNextTerm;
  63.         int iEndToken;
  64.         int iStartToken;
  65.         if( iDir<0 ){
  66.           int nPhrase = 1;
  67.           iStartToken = pMatch->iToken;
  68.           while( (pMatch->iTerm+nPhrase)<pQuery->nTerms 
  69.               && pQuery->pTerms[pMatch->iTerm+nPhrase].iPhrase>1 
  70.           ){
  71.             nPhrase++;
  72.           }
  73.           iEndToken = iStartToken + nPhrase - 1;
  74.         }else{
  75.           iEndToken   = pMatch->iToken;
  76.           iStartToken = pMatch->iToken+1-pQueryTerm->iPhrase;
  77.         }
  78.         while( pQuery->pTerms[iNextTerm].iPhrase>1 ){
  79.           iNextTerm--;
  80.         }
  81.         while( (iPrevTerm+1)<pQuery->nTerms && 
  82.                pQuery->pTerms[iPrevTerm+1].iPhrase>1 
  83.         ){
  84.           iPrevTerm++;
  85.         }
  86.   
  87.         for(jj=0; isOk==0 && jj<pSnippet->nMatch; jj++){
  88.           struct snippetMatch *p = &pSnippet->aMatch[jj];
  89.           if( p->iCol==pMatch->iCol && ((
  90.                p->iTerm==iNextTerm && 
  91.                p->iToken>iEndToken && 
  92.                p->iToken<=iEndToken+nNear
  93.           ) || (
  94.                p->iTerm==iPrevTerm && 
  95.                p->iToken<iStartToken && 
  96.                p->iToken>=iStartToken-nNear
  97.           ))){
  98.             isOk = 1;
  99.           }
  100.         }
  101.         if( !isOk ){
  102.           for(jj=1-pQueryTerm->iPhrase; jj<=0; jj++){
  103.             pMatch[jj].iTerm = -1;
  104.           }
  105.           ii = -1;
  106.           iDir = 1;
  107.         }
  108.       }
  109.     }
  110.     iDir -= 2;
  111.   }
  112. }
  113. /*
  114. ** Compute all offsets for the current row of the query.  
  115. ** If the offsets have already been computed, this routine is a no-op.
  116. */
  117. static void snippetAllOffsets(fulltext_cursor *p){
  118.   int nColumn;
  119.   int iColumn, i;
  120.   int iFirst, iLast;
  121.   fulltext_vtab *pFts;
  122.   if( p->snippet.nMatch ) return;
  123.   if( p->q.nTerms==0 ) return;
  124.   pFts = p->q.pFts;
  125.   nColumn = pFts->nColumn;
  126.   iColumn = (p->iCursorType - QUERY_FULLTEXT);
  127.   if( iColumn<0 || iColumn>=nColumn ){
  128.     iFirst = 0;
  129.     iLast = nColumn-1;
  130.   }else{
  131.     iFirst = iColumn;
  132.     iLast = iColumn;
  133.   }
  134.   for(i=iFirst; i<=iLast; i++){
  135.     const char *zDoc;
  136.     int nDoc;
  137.     zDoc = (const char*)sqlite3_column_text(p->pStmt, i+1);
  138.     nDoc = sqlite3_column_bytes(p->pStmt, i+1);
  139.     snippetOffsetsOfColumn(&p->q, &p->snippet, i, zDoc, nDoc);
  140.   }
  141.   trimSnippetOffsetsForNear(&p->q, &p->snippet);
  142. }
  143. /*
  144. ** Convert the information in the aMatch[] array of the snippet
  145. ** into the string zOffset[0..nOffset-1].
  146. */
  147. static void snippetOffsetText(Snippet *p){
  148.   int i;
  149.   int cnt = 0;
  150.   StringBuffer sb;
  151.   char zBuf[200];
  152.   if( p->zOffset ) return;
  153.   initStringBuffer(&sb);
  154.   for(i=0; i<p->nMatch; i++){
  155.     struct snippetMatch *pMatch = &p->aMatch[i];
  156.     if( pMatch->iTerm>=0 ){
  157.       /* If snippetMatch.iTerm is less than 0, then the match was 
  158.       ** discarded as part of processing the NEAR operator (see the 
  159.       ** trimSnippetOffsetsForNear() function for details). Ignore 
  160.       ** it in this case
  161.       */
  162.       zBuf[0] = ' ';
  163.       sqlite3_snprintf(sizeof(zBuf)-1, &zBuf[cnt>0], "%d %d %d %d",
  164.           pMatch->iCol, pMatch->iTerm, pMatch->iStart, pMatch->nByte);
  165.       append(&sb, zBuf);
  166.       cnt++;
  167.     }
  168.   }
  169.   p->zOffset = stringBufferData(&sb);
  170.   p->nOffset = stringBufferLength(&sb);
  171. }
  172. /*
  173. ** zDoc[0..nDoc-1] is phrase of text.  aMatch[0..nMatch-1] are a set
  174. ** of matching words some of which might be in zDoc.  zDoc is column
  175. ** number iCol.
  176. **
  177. ** iBreak is suggested spot in zDoc where we could begin or end an
  178. ** excerpt.  Return a value similar to iBreak but possibly adjusted
  179. ** to be a little left or right so that the break point is better.
  180. */
  181. static int wordBoundary(
  182.   int iBreak,                   /* The suggested break point */
  183.   const char *zDoc,             /* Document text */
  184.   int nDoc,                     /* Number of bytes in zDoc[] */
  185.   struct snippetMatch *aMatch,  /* Matching words */
  186.   int nMatch,                   /* Number of entries in aMatch[] */
  187.   int iCol                      /* The column number for zDoc[] */
  188. ){
  189.   int i;
  190.   if( iBreak<=10 ){
  191.     return 0;
  192.   }
  193.   if( iBreak>=nDoc-10 ){
  194.     return nDoc;
  195.   }
  196.   for(i=0; i<nMatch && aMatch[i].iCol<iCol; i++){}
  197.   while( i<nMatch && aMatch[i].iStart+aMatch[i].nByte<iBreak ){ i++; }
  198.   if( i<nMatch ){
  199.     if( aMatch[i].iStart<iBreak+10 ){
  200.       return aMatch[i].iStart;
  201.     }
  202.     if( i>0 && aMatch[i-1].iStart+aMatch[i-1].nByte>=iBreak ){
  203.       return aMatch[i-1].iStart;
  204.     }
  205.   }
  206.   for(i=1; i<=10; i++){
  207.     if( safe_isspace(zDoc[iBreak-i]) ){
  208.       return iBreak - i + 1;
  209.     }
  210.     if( safe_isspace(zDoc[iBreak+i]) ){
  211.       return iBreak + i + 1;
  212.     }
  213.   }
  214.   return iBreak;
  215. }
  216. /*
  217. ** Allowed values for Snippet.aMatch[].snStatus
  218. */
  219. #define SNIPPET_IGNORE  0   /* It is ok to omit this match from the snippet */
  220. #define SNIPPET_DESIRED 1   /* We want to include this match in the snippet */
  221. /*
  222. ** Generate the text of a snippet.
  223. */
  224. static void snippetText(
  225.   fulltext_cursor *pCursor,   /* The cursor we need the snippet for */
  226.   const char *zStartMark,     /* Markup to appear before each match */
  227.   const char *zEndMark,       /* Markup to appear after each match */
  228.   const char *zEllipsis       /* Ellipsis mark */
  229. ){
  230.   int i, j;
  231.   struct snippetMatch *aMatch;
  232.   int nMatch;
  233.   int nDesired;
  234.   StringBuffer sb;
  235.   int tailCol;
  236.   int tailOffset;
  237.   int iCol;
  238.   int nDoc;
  239.   const char *zDoc;
  240.   int iStart, iEnd;
  241.   int tailEllipsis = 0;
  242.   int iMatch;
  243.   
  244.   sqlite3_free(pCursor->snippet.zSnippet);
  245.   pCursor->snippet.zSnippet = 0;
  246.   aMatch = pCursor->snippet.aMatch;
  247.   nMatch = pCursor->snippet.nMatch;
  248.   initStringBuffer(&sb);
  249.   for(i=0; i<nMatch; i++){
  250.     aMatch[i].snStatus = SNIPPET_IGNORE;
  251.   }
  252.   nDesired = 0;
  253.   for(i=0; i<pCursor->q.nTerms; i++){
  254.     for(j=0; j<nMatch; j++){
  255.       if( aMatch[j].iTerm==i ){
  256.         aMatch[j].snStatus = SNIPPET_DESIRED;
  257.         nDesired++;
  258.         break;
  259.       }
  260.     }
  261.   }
  262.   iMatch = 0;
  263.   tailCol = -1;
  264.   tailOffset = 0;
  265.   for(i=0; i<nMatch && nDesired>0; i++){
  266.     if( aMatch[i].snStatus!=SNIPPET_DESIRED ) continue;
  267.     nDesired--;
  268.     iCol = aMatch[i].iCol;
  269.     zDoc = (const char*)sqlite3_column_text(pCursor->pStmt, iCol+1);
  270.     nDoc = sqlite3_column_bytes(pCursor->pStmt, iCol+1);
  271.     iStart = aMatch[i].iStart - 40;
  272.     iStart = wordBoundary(iStart, zDoc, nDoc, aMatch, nMatch, iCol);
  273.     if( iStart<=10 ){
  274.       iStart = 0;
  275.     }
  276.     if( iCol==tailCol && iStart<=tailOffset+20 ){
  277.       iStart = tailOffset;
  278.     }
  279.     if( (iCol!=tailCol && tailCol>=0) || iStart!=tailOffset ){
  280.       trimWhiteSpace(&sb);
  281.       appendWhiteSpace(&sb);
  282.       append(&sb, zEllipsis);
  283.       appendWhiteSpace(&sb);
  284.     }
  285.     iEnd = aMatch[i].iStart + aMatch[i].nByte + 40;
  286.     iEnd = wordBoundary(iEnd, zDoc, nDoc, aMatch, nMatch, iCol);
  287.     if( iEnd>=nDoc-10 ){
  288.       iEnd = nDoc;
  289.       tailEllipsis = 0;
  290.     }else{
  291.       tailEllipsis = 1;
  292.     }
  293.     while( iMatch<nMatch && aMatch[iMatch].iCol<iCol ){ iMatch++; }
  294.     while( iStart<iEnd ){
  295.       while( iMatch<nMatch && aMatch[iMatch].iStart<iStart
  296.              && aMatch[iMatch].iCol<=iCol ){
  297.         iMatch++;
  298.       }
  299.       if( iMatch<nMatch && aMatch[iMatch].iStart<iEnd
  300.              && aMatch[iMatch].iCol==iCol ){
  301.         nappend(&sb, &zDoc[iStart], aMatch[iMatch].iStart - iStart);
  302.         iStart = aMatch[iMatch].iStart;
  303.         append(&sb, zStartMark);
  304.         nappend(&sb, &zDoc[iStart], aMatch[iMatch].nByte);
  305.         append(&sb, zEndMark);
  306.         iStart += aMatch[iMatch].nByte;
  307.         for(j=iMatch+1; j<nMatch; j++){
  308.           if( aMatch[j].iTerm==aMatch[iMatch].iTerm
  309.               && aMatch[j].snStatus==SNIPPET_DESIRED ){
  310.             nDesired--;
  311.             aMatch[j].snStatus = SNIPPET_IGNORE;
  312.           }
  313.         }
  314.       }else{
  315.         nappend(&sb, &zDoc[iStart], iEnd - iStart);
  316.         iStart = iEnd;
  317.       }
  318.     }
  319.     tailCol = iCol;
  320.     tailOffset = iEnd;
  321.   }
  322.   trimWhiteSpace(&sb);
  323.   if( tailEllipsis ){
  324.     appendWhiteSpace(&sb);
  325.     append(&sb, zEllipsis);
  326.   }
  327.   pCursor->snippet.zSnippet = stringBufferData(&sb);
  328.   pCursor->snippet.nSnippet = stringBufferLength(&sb);
  329. }
  330. /*
  331. ** Close the cursor.  For additional information see the documentation
  332. ** on the xClose method of the virtual table interface.
  333. */
  334. static int fulltextClose(sqlite3_vtab_cursor *pCursor){
  335.   fulltext_cursor *c = (fulltext_cursor *) pCursor;
  336.   FTSTRACE(("FTS3 Close %pn", c));
  337.   sqlite3_finalize(c->pStmt);
  338.   queryClear(&c->q);
  339.   snippetClear(&c->snippet);
  340.   if( c->result.nData!=0 ) dlrDestroy(&c->reader);
  341.   dataBufferDestroy(&c->result);
  342.   sqlite3_free(c);
  343.   return SQLITE_OK;
  344. }
  345. static int fulltextNext(sqlite3_vtab_cursor *pCursor){
  346.   fulltext_cursor *c = (fulltext_cursor *) pCursor;
  347.   int rc;
  348.   FTSTRACE(("FTS3 Next %pn", pCursor));
  349.   snippetClear(&c->snippet);
  350.   if( c->iCursorType < QUERY_FULLTEXT ){
  351.     /* TODO(shess) Handle SQLITE_SCHEMA AND SQLITE_BUSY. */
  352.     rc = sqlite3_step(c->pStmt);
  353.     switch( rc ){
  354.       case SQLITE_ROW:
  355.         c->eof = 0;
  356.         return SQLITE_OK;
  357.       case SQLITE_DONE:
  358.         c->eof = 1;
  359.         return SQLITE_OK;
  360.       default:
  361.         c->eof = 1;
  362.         return rc;
  363.     }
  364.   } else {  /* full-text query */
  365.     rc = sqlite3_reset(c->pStmt);
  366.     if( rc!=SQLITE_OK ) return rc;
  367.     if( c->result.nData==0 || dlrAtEnd(&c->reader) ){
  368.       c->eof = 1;
  369.       return SQLITE_OK;
  370.     }
  371.     rc = sqlite3_bind_int64(c->pStmt, 1, dlrDocid(&c->reader));
  372.     dlrStep(&c->reader);
  373.     if( rc!=SQLITE_OK ) return rc;
  374.     /* TODO(shess) Handle SQLITE_SCHEMA AND SQLITE_BUSY. */
  375.     rc = sqlite3_step(c->pStmt);
  376.     if( rc==SQLITE_ROW ){   /* the case we expect */
  377.       c->eof = 0;
  378.       return SQLITE_OK;
  379.     }
  380.     /* an error occurred; abort */
  381.     return rc==SQLITE_DONE ? SQLITE_ERROR : rc;
  382.   }
  383. }
  384. /* TODO(shess) If we pushed LeafReader to the top of the file, or to
  385. ** another file, term_select() could be pushed above
  386. ** docListOfTerm().
  387. */
  388. static int termSelect(fulltext_vtab *v, int iColumn,
  389.                       const char *pTerm, int nTerm, int isPrefix,
  390.                       DocListType iType, DataBuffer *out);
  391. /* Return a DocList corresponding to the query term *pTerm.  If *pTerm
  392. ** is the first term of a phrase query, go ahead and evaluate the phrase
  393. ** query and return the doclist for the entire phrase query.
  394. **
  395. ** The resulting DL_DOCIDS doclist is stored in pResult, which is
  396. ** overwritten.
  397. */
  398. static int docListOfTerm(
  399.   fulltext_vtab *v,    /* The full text index */
  400.   int iColumn,         /* column to restrict to.  No restriction if >=nColumn */
  401.   QueryTerm *pQTerm,   /* Term we are looking for, or 1st term of a phrase */
  402.   DataBuffer *pResult  /* Write the result here */
  403. ){
  404.   DataBuffer left, right, new;
  405.   int i, rc;
  406.   /* No phrase search if no position info. */
  407.   assert( pQTerm->nPhrase==0 || DL_DEFAULT!=DL_DOCIDS );
  408.   /* This code should never be called with buffered updates. */
  409.   assert( v->nPendingData<0 );
  410.   dataBufferInit(&left, 0);
  411.   rc = termSelect(v, iColumn, pQTerm->pTerm, pQTerm->nTerm, pQTerm->isPrefix,
  412.                   (0<pQTerm->nPhrase ? DL_POSITIONS : DL_DOCIDS), &left);
  413.   if( rc ) return rc;
  414.   for(i=1; i<=pQTerm->nPhrase && left.nData>0; i++){
  415.     /* If this token is connected to the next by a NEAR operator, and
  416.     ** the next token is the start of a phrase, then set nPhraseRight
  417.     ** to the number of tokens in the phrase. Otherwise leave it at 1.
  418.     */
  419.     int nPhraseRight = 1;
  420.     while( (i+nPhraseRight)<=pQTerm->nPhrase 
  421.         && pQTerm[i+nPhraseRight].nNear==0 
  422.     ){
  423.       nPhraseRight++;
  424.     }
  425.     dataBufferInit(&right, 0);
  426.     rc = termSelect(v, iColumn, pQTerm[i].pTerm, pQTerm[i].nTerm,
  427.                     pQTerm[i].isPrefix, DL_POSITIONS, &right);
  428.     if( rc ){
  429.       dataBufferDestroy(&left);
  430.       return rc;
  431.     }
  432.     dataBufferInit(&new, 0);
  433.     docListPhraseMerge(left.pData, left.nData, right.pData, right.nData,
  434.                        pQTerm[i-1].nNear, pQTerm[i-1].iPhrase + nPhraseRight,
  435.                        ((i<pQTerm->nPhrase) ? DL_POSITIONS : DL_DOCIDS),
  436.                        &new);
  437.     dataBufferDestroy(&left);
  438.     dataBufferDestroy(&right);
  439.     left = new;
  440.   }
  441.   *pResult = left;
  442.   return SQLITE_OK;
  443. }
  444. /* Add a new term pTerm[0..nTerm-1] to the query *q.
  445. */
  446. static void queryAdd(Query *q, const char *pTerm, int nTerm){
  447.   QueryTerm *t;
  448.   ++q->nTerms;
  449.   q->pTerms = sqlite3_realloc(q->pTerms, q->nTerms * sizeof(q->pTerms[0]));
  450.   if( q->pTerms==0 ){
  451.     q->nTerms = 0;
  452.     return;
  453.   }
  454.   t = &q->pTerms[q->nTerms - 1];
  455.   CLEAR(t);
  456.   t->pTerm = sqlite3_malloc(nTerm+1);
  457.   memcpy(t->pTerm, pTerm, nTerm);
  458.   t->pTerm[nTerm] = 0;
  459.   t->nTerm = nTerm;
  460.   t->isOr = q->nextIsOr;
  461.   t->isPrefix = 0;
  462.   q->nextIsOr = 0;
  463.   t->iColumn = q->nextColumn;
  464.   q->nextColumn = q->dfltColumn;
  465. }
  466. /*
  467. ** Check to see if the string zToken[0...nToken-1] matches any
  468. ** column name in the virtual table.   If it does,
  469. ** return the zero-indexed column number.  If not, return -1.
  470. */
  471. static int checkColumnSpecifier(
  472.   fulltext_vtab *pVtab,    /* The virtual table */
  473.   const char *zToken,      /* Text of the token */
  474.   int nToken               /* Number of characters in the token */
  475. ){
  476.   int i;
  477.   for(i=0; i<pVtab->nColumn; i++){
  478.     if( memcmp(pVtab->azColumn[i], zToken, nToken)==0
  479.         && pVtab->azColumn[i][nToken]==0 ){
  480.       return i;
  481.     }
  482.   }
  483.   return -1;
  484. }
  485. /*
  486. ** Parse the text at pSegment[0..nSegment-1].  Add additional terms
  487. ** to the query being assemblied in pQuery.
  488. **
  489. ** inPhrase is true if pSegment[0..nSegement-1] is contained within
  490. ** double-quotes.  If inPhrase is true, then the first term
  491. ** is marked with the number of terms in the phrase less one and
  492. ** OR and "-" syntax is ignored.  If inPhrase is false, then every
  493. ** term found is marked with nPhrase=0 and OR and "-" syntax is significant.
  494. */
  495. static int tokenizeSegment(
  496.   sqlite3_tokenizer *pTokenizer,          /* The tokenizer to use */
  497.   const char *pSegment, int nSegment,     /* Query expression being parsed */
  498.   int inPhrase,                           /* True if within "..." */
  499.   Query *pQuery                           /* Append results here */
  500. ){
  501.   const sqlite3_tokenizer_module *pModule = pTokenizer->pModule;
  502.   sqlite3_tokenizer_cursor *pCursor;
  503.   int firstIndex = pQuery->nTerms;
  504.   int iCol;
  505.   int nTerm = 1;
  506.   
  507.   int rc = pModule->xOpen(pTokenizer, pSegment, nSegment, &pCursor);
  508.   if( rc!=SQLITE_OK ) return rc;
  509.   pCursor->pTokenizer = pTokenizer;
  510.   while( 1 ){
  511.     const char *pToken;
  512.     int nToken, iBegin, iEnd, iPos;
  513.     rc = pModule->xNext(pCursor,
  514.                         &pToken, &nToken,
  515.                         &iBegin, &iEnd, &iPos);
  516.     if( rc!=SQLITE_OK ) break;
  517.     if( !inPhrase &&
  518.         pSegment[iEnd]==':' &&
  519.          (iCol = checkColumnSpecifier(pQuery->pFts, pToken, nToken))>=0 ){
  520.       pQuery->nextColumn = iCol;
  521.       continue;
  522.     }
  523.     if( !inPhrase && pQuery->nTerms>0 && nToken==2 
  524.      && pSegment[iBegin+0]=='O'
  525.      && pSegment[iBegin+1]=='R' 
  526.     ){
  527.       pQuery->nextIsOr = 1;
  528.       continue;
  529.     }
  530.     if( !inPhrase && pQuery->nTerms>0 && !pQuery->nextIsOr && nToken==4 
  531.       && pSegment[iBegin+0]=='N' 
  532.       && pSegment[iBegin+1]=='E' 
  533.       && pSegment[iBegin+2]=='A' 
  534.       && pSegment[iBegin+3]=='R' 
  535.     ){
  536.       QueryTerm *pTerm = &pQuery->pTerms[pQuery->nTerms-1];
  537.       if( (iBegin+6)<nSegment 
  538.        && pSegment[iBegin+4] == '/'
  539.        && pSegment[iBegin+5]>='0' && pSegment[iBegin+5]<='9'
  540.       ){
  541.         pTerm->nNear = (pSegment[iBegin+5] - '0');
  542.         nToken += 2;
  543.         if( pSegment[iBegin+6]>='0' && pSegment[iBegin+6]<=9 ){
  544.           pTerm->nNear = pTerm->nNear * 10 + (pSegment[iBegin+6] - '0');
  545.           iEnd++;
  546.         }
  547.         pModule->xNext(pCursor, &pToken, &nToken, &iBegin, &iEnd, &iPos);
  548.       } else {
  549.         pTerm->nNear = SQLITE_FTS3_DEFAULT_NEAR_PARAM;
  550.       }
  551.       pTerm->nNear++;
  552.       continue;
  553.     }
  554.     queryAdd(pQuery, pToken, nToken);
  555.     if( !inPhrase && iBegin>0 && pSegment[iBegin-1]=='-' ){
  556.       pQuery->pTerms[pQuery->nTerms-1].isNot = 1;
  557.     }
  558.     if( iEnd<nSegment && pSegment[iEnd]=='*' ){
  559.       pQuery->pTerms[pQuery->nTerms-1].isPrefix = 1;
  560.     }
  561.     pQuery->pTerms[pQuery->nTerms-1].iPhrase = nTerm;
  562.     if( inPhrase ){
  563.       nTerm++;
  564.     }
  565.   }
  566.   if( inPhrase && pQuery->nTerms>firstIndex ){
  567.     pQuery->pTerms[firstIndex].nPhrase = pQuery->nTerms - firstIndex - 1;
  568.   }
  569.   return pModule->xClose(pCursor);
  570. }
  571. /* Parse a query string, yielding a Query object pQuery.
  572. **
  573. ** The calling function will need to queryClear() to clean up
  574. ** the dynamically allocated memory held by pQuery.
  575. */
  576. static int parseQuery(
  577.   fulltext_vtab *v,        /* The fulltext index */
  578.   const char *zInput,      /* Input text of the query string */
  579.   int nInput,              /* Size of the input text */
  580.   int dfltColumn,          /* Default column of the index to match against */
  581.   Query *pQuery            /* Write the parse results here. */
  582. ){
  583.   int iInput, inPhrase = 0;
  584.   int ii;
  585.   QueryTerm *aTerm;
  586.   if( zInput==0 ) nInput = 0;
  587.   if( nInput<0 ) nInput = strlen(zInput);
  588.   pQuery->nTerms = 0;
  589.   pQuery->pTerms = NULL;
  590.   pQuery->nextIsOr = 0;
  591.   pQuery->nextColumn = dfltColumn;
  592.   pQuery->dfltColumn = dfltColumn;
  593.   pQuery->pFts = v;
  594.   for(iInput=0; iInput<nInput; ++iInput){
  595.     int i;
  596.     for(i=iInput; i<nInput && zInput[i]!='"'; ++i){}
  597.     if( i>iInput ){
  598.       tokenizeSegment(v->pTokenizer, zInput+iInput, i-iInput, inPhrase,
  599.                        pQuery);
  600.     }
  601.     iInput = i;
  602.     if( i<nInput ){
  603.       assert( zInput[i]=='"' );
  604.       inPhrase = !inPhrase;
  605.     }
  606.   }
  607.   if( inPhrase ){
  608.     /* unmatched quote */
  609.     queryClear(pQuery);
  610.     return SQLITE_ERROR;
  611.   }
  612.   /* Modify the values of the QueryTerm.nPhrase variables to account for
  613.   ** the NEAR operator. For the purposes of QueryTerm.nPhrase, phrases
  614.   ** and tokens connected by the NEAR operator are handled as a single
  615.   ** phrase. See comments above the QueryTerm structure for details.
  616.   */
  617.   aTerm = pQuery->pTerms;
  618.   for(ii=0; ii<pQuery->nTerms; ii++){
  619.     if( aTerm[ii].nNear || aTerm[ii].nPhrase ){
  620.       while (aTerm[ii+aTerm[ii].nPhrase].nNear) {
  621.         aTerm[ii].nPhrase += (1 + aTerm[ii+aTerm[ii].nPhrase+1].nPhrase);
  622.       }
  623.     }
  624.   }
  625.   return SQLITE_OK;
  626. }
  627. /* TODO(shess) Refactor the code to remove this forward decl. */
  628. static int flushPendingTerms(fulltext_vtab *v);
  629. /* Perform a full-text query using the search expression in
  630. ** zInput[0..nInput-1].  Return a list of matching documents
  631. ** in pResult.
  632. **
  633. ** Queries must match column iColumn.  Or if iColumn>=nColumn
  634. ** they are allowed to match against any column.
  635. */
  636. static int fulltextQuery(
  637.   fulltext_vtab *v,      /* The full text index */
  638.   int iColumn,           /* Match against this column by default */
  639.   const char *zInput,    /* The query string */
  640.   int nInput,            /* Number of bytes in zInput[] */
  641.   DataBuffer *pResult,   /* Write the result doclist here */
  642.   Query *pQuery          /* Put parsed query string here */
  643. ){
  644.   int i, iNext, rc;
  645.   DataBuffer left, right, or, new;
  646.   int nNot = 0;
  647.   QueryTerm *aTerm;
  648.   /* TODO(shess) Instead of flushing pendingTerms, we could query for
  649.   ** the relevant term and merge the doclist into what we receive from
  650.   ** the database.  Wait and see if this is a common issue, first.
  651.   **
  652.   ** A good reason not to flush is to not generate update-related
  653.   ** error codes from here.
  654.   */
  655.   /* Flush any buffered updates before executing the query. */
  656.   rc = flushPendingTerms(v);
  657.   if( rc!=SQLITE_OK ) return rc;
  658.   /* TODO(shess) I think that the queryClear() calls below are not
  659.   ** necessary, because fulltextClose() already clears the query.
  660.   */
  661.   rc = parseQuery(v, zInput, nInput, iColumn, pQuery);
  662.   if( rc!=SQLITE_OK ) return rc;
  663.   /* Empty or NULL queries return no results. */
  664.   if( pQuery->nTerms==0 ){
  665.     dataBufferInit(pResult, 0);
  666.     return SQLITE_OK;
  667.   }
  668.   /* Merge AND terms. */
  669.   /* TODO(shess) I think we can early-exit if( i>nNot && left.nData==0 ). */
  670.   aTerm = pQuery->pTerms;
  671.   for(i = 0; i<pQuery->nTerms; i=iNext){
  672.     if( aTerm[i].isNot ){
  673.       /* Handle all NOT terms in a separate pass */
  674.       nNot++;
  675.       iNext = i + aTerm[i].nPhrase+1;
  676.       continue;
  677.     }
  678.     iNext = i + aTerm[i].nPhrase + 1;
  679.     rc = docListOfTerm(v, aTerm[i].iColumn, &aTerm[i], &right);
  680.     if( rc ){
  681.       if( i!=nNot ) dataBufferDestroy(&left);
  682.       queryClear(pQuery);
  683.       return rc;
  684.     }
  685.     while( iNext<pQuery->nTerms && aTerm[iNext].isOr ){
  686.       rc = docListOfTerm(v, aTerm[iNext].iColumn, &aTerm[iNext], &or);
  687.       iNext += aTerm[iNext].nPhrase + 1;
  688.       if( rc ){
  689.         if( i!=nNot ) dataBufferDestroy(&left);
  690.         dataBufferDestroy(&right);
  691.         queryClear(pQuery);
  692.         return rc;
  693.       }
  694.       dataBufferInit(&new, 0);
  695.       docListOrMerge(right.pData, right.nData, or.pData, or.nData, &new);
  696.       dataBufferDestroy(&right);
  697.       dataBufferDestroy(&or);
  698.       right = new;
  699.     }
  700.     if( i==nNot ){           /* first term processed. */
  701.       left = right;
  702.     }else{
  703.       dataBufferInit(&new, 0);
  704.       docListAndMerge(left.pData, left.nData, right.pData, right.nData, &new);
  705.       dataBufferDestroy(&right);
  706.       dataBufferDestroy(&left);
  707.       left = new;
  708.     }
  709.   }
  710.   if( nNot==pQuery->nTerms ){
  711.     /* We do not yet know how to handle a query of only NOT terms */
  712.     return SQLITE_ERROR;
  713.   }
  714.   /* Do the EXCEPT terms */
  715.   for(i=0; i<pQuery->nTerms;  i += aTerm[i].nPhrase + 1){
  716.     if( !aTerm[i].isNot ) continue;
  717.     rc = docListOfTerm(v, aTerm[i].iColumn, &aTerm[i], &right);
  718.     if( rc ){
  719.       queryClear(pQuery);
  720.       dataBufferDestroy(&left);
  721.       return rc;
  722.     }
  723.     dataBufferInit(&new, 0);
  724.     docListExceptMerge(left.pData, left.nData, right.pData, right.nData, &new);
  725.     dataBufferDestroy(&right);
  726.     dataBufferDestroy(&left);
  727.     left = new;
  728.   }
  729.   *pResult = left;
  730.   return rc;
  731. }
  732. /*
  733. ** This is the xFilter interface for the virtual table.  See
  734. ** the virtual table xFilter method documentation for additional
  735. ** information.
  736. **
  737. ** If idxNum==QUERY_GENERIC then do a full table scan against
  738. ** the %_content table.
  739. **
  740. ** If idxNum==QUERY_DOCID then do a docid lookup for a single entry
  741. ** in the %_content table.
  742. **
  743. ** If idxNum>=QUERY_FULLTEXT then use the full text index.  The
  744. ** column on the left-hand side of the MATCH operator is column
  745. ** number idxNum-QUERY_FULLTEXT, 0 indexed.  argv[0] is the right-hand
  746. ** side of the MATCH operator.
  747. */
  748. /* TODO(shess) Upgrade the cursor initialization and destruction to
  749. ** account for fulltextFilter() being called multiple times on the
  750. ** same cursor.  The current solution is very fragile.  Apply fix to
  751. ** fts3 as appropriate.
  752. */
  753. static int fulltextFilter(
  754.   sqlite3_vtab_cursor *pCursor,     /* The cursor used for this query */
  755.   int idxNum, const char *idxStr,   /* Which indexing scheme to use */
  756.   int argc, sqlite3_value **argv    /* Arguments for the indexing scheme */
  757. ){
  758.   fulltext_cursor *c = (fulltext_cursor *) pCursor;
  759.   fulltext_vtab *v = cursor_vtab(c);
  760.   int rc;
  761.   StringBuffer sb;
  762.   FTSTRACE(("FTS3 Filter %pn",pCursor));
  763.   initStringBuffer(&sb);
  764.   append(&sb, "SELECT docid, ");
  765.   appendList(&sb, v->nColumn, v->azContentColumn);
  766.   append(&sb, " FROM %_content");
  767.   if( idxNum!=QUERY_GENERIC ) append(&sb, " WHERE docid = ?");
  768.   sqlite3_finalize(c->pStmt);
  769.   rc = sql_prepare(v->db, v->zDb, v->zName, &c->pStmt, stringBufferData(&sb));
  770.   stringBufferDestroy(&sb);
  771.   if( rc!=SQLITE_OK ) return rc;
  772.   c->iCursorType = idxNum;
  773.   switch( idxNum ){
  774.     case QUERY_GENERIC:
  775.       break;
  776.     case QUERY_DOCID:
  777.       rc = sqlite3_bind_int64(c->pStmt, 1, sqlite3_value_int64(argv[0]));
  778.       if( rc!=SQLITE_OK ) return rc;
  779.       break;
  780.     default:   /* full-text search */
  781.     {
  782.       const char *zQuery = (const char *)sqlite3_value_text(argv[0]);
  783.       assert( idxNum<=QUERY_FULLTEXT+v->nColumn);
  784.       assert( argc==1 );
  785.       queryClear(&c->q);
  786.       if( c->result.nData!=0 ){
  787.         /* This case happens if the same cursor is used repeatedly. */
  788.         dlrDestroy(&c->reader);
  789.         dataBufferReset(&c->result);
  790.       }else{
  791.         dataBufferInit(&c->result, 0);
  792.       }
  793.       rc = fulltextQuery(v, idxNum-QUERY_FULLTEXT, zQuery, -1, &c->result, &c->q);
  794.       if( rc!=SQLITE_OK ) return rc;
  795.       if( c->result.nData!=0 ){
  796.         dlrInit(&c->reader, DL_DOCIDS, c->result.pData, c->result.nData);
  797.       }
  798.       break;
  799.     }
  800.   }
  801.   return fulltextNext(pCursor);
  802. }
  803. /* This is the xEof method of the virtual table.  The SQLite core
  804. ** calls this routine to find out if it has reached the end of
  805. ** a query's results set.
  806. */
  807. static int fulltextEof(sqlite3_vtab_cursor *pCursor){
  808.   fulltext_cursor *c = (fulltext_cursor *) pCursor;
  809.   return c->eof;
  810. }
  811. /* This is the xColumn method of the virtual table.  The SQLite
  812. ** core calls this method during a query when it needs the value
  813. ** of a column from the virtual table.  This method needs to use
  814. ** one of the sqlite3_result_*() routines to store the requested
  815. ** value back in the pContext.
  816. */
  817. static int fulltextColumn(sqlite3_vtab_cursor *pCursor,
  818.                           sqlite3_context *pContext, int idxCol){
  819.   fulltext_cursor *c = (fulltext_cursor *) pCursor;
  820.   fulltext_vtab *v = cursor_vtab(c);
  821.   if( idxCol<v->nColumn ){
  822.     sqlite3_value *pVal = sqlite3_column_value(c->pStmt, idxCol+1);
  823.     sqlite3_result_value(pContext, pVal);
  824.   }else if( idxCol==v->nColumn ){
  825.     /* The extra column whose name is the same as the table.
  826.     ** Return a blob which is a pointer to the cursor
  827.     */
  828.     sqlite3_result_blob(pContext, &c, sizeof(c), SQLITE_TRANSIENT);
  829.   }else if( idxCol==v->nColumn+1 ){
  830.     /* The docid column, which is an alias for rowid. */
  831.     sqlite3_value *pVal = sqlite3_column_value(c->pStmt, 0);
  832.     sqlite3_result_value(pContext, pVal);
  833.   }
  834.   return SQLITE_OK;
  835. }
  836. /* This is the xRowid method.  The SQLite core calls this routine to
  837. ** retrieve the rowid for the current row of the result set.  fts3
  838. ** exposes %_content.docid as the rowid for the virtual table.  The
  839. ** rowid should be written to *pRowid.
  840. */
  841. static int fulltextRowid(sqlite3_vtab_cursor *pCursor, sqlite_int64 *pRowid){
  842.   fulltext_cursor *c = (fulltext_cursor *) pCursor;
  843.   *pRowid = sqlite3_column_int64(c->pStmt, 0);
  844.   return SQLITE_OK;
  845. }
  846. /* Add all terms in [zText] to pendingTerms table.  If [iColumn] > 0,
  847. ** we also store positions and offsets in the hash table using that
  848. ** column number.
  849. */
  850. static int buildTerms(fulltext_vtab *v, sqlite_int64 iDocid,
  851.                       const char *zText, int iColumn){
  852.   sqlite3_tokenizer *pTokenizer = v->pTokenizer;
  853.   sqlite3_tokenizer_cursor *pCursor;
  854.   const char *pToken;
  855.   int nTokenBytes;
  856.   int iStartOffset, iEndOffset, iPosition;
  857.   int rc;
  858.   rc = pTokenizer->pModule->xOpen(pTokenizer, zText, -1, &pCursor);
  859.   if( rc!=SQLITE_OK ) return rc;
  860.   pCursor->pTokenizer = pTokenizer;
  861.   while( SQLITE_OK==(rc=pTokenizer->pModule->xNext(pCursor,
  862.                                                    &pToken, &nTokenBytes,
  863.                                                    &iStartOffset, &iEndOffset,
  864.                                                    &iPosition)) ){
  865.     DLCollector *p;
  866.     int nData;                   /* Size of doclist before our update. */
  867.     /* Positions can't be negative; we use -1 as a terminator
  868.      * internally.  Token can't be NULL or empty. */
  869.     if( iPosition<0 || pToken == NULL || nTokenBytes == 0 ){
  870.       rc = SQLITE_ERROR;
  871.       break;
  872.     }
  873.     p = fts3HashFind(&v->pendingTerms, pToken, nTokenBytes);
  874.     if( p==NULL ){
  875.       nData = 0;
  876.       p = dlcNew(iDocid, DL_DEFAULT);
  877.       fts3HashInsert(&v->pendingTerms, pToken, nTokenBytes, p);
  878.       /* Overhead for our hash table entry, the key, and the value. */
  879.       v->nPendingData += sizeof(struct fts3HashElem)+sizeof(*p)+nTokenBytes;
  880.     }else{
  881.       nData = p->b.nData;
  882.       if( p->dlw.iPrevDocid!=iDocid ) dlcNext(p, iDocid);
  883.     }
  884.     if( iColumn>=0 ){
  885.       dlcAddPos(p, iColumn, iPosition, iStartOffset, iEndOffset);
  886.     }
  887.     /* Accumulate data added by dlcNew or dlcNext, and dlcAddPos. */
  888.     v->nPendingData += p->b.nData-nData;
  889.   }
  890.   /* TODO(shess) Check return?  Should this be able to cause errors at
  891.   ** this point?  Actually, same question about sqlite3_finalize(),
  892.   ** though one could argue that failure there means that the data is
  893.   ** not durable.  *ponder*
  894.   */
  895.   pTokenizer->pModule->xClose(pCursor);
  896.   if( SQLITE_DONE == rc ) return SQLITE_OK;
  897.   return rc;
  898. }
  899. /* Add doclists for all terms in [pValues] to pendingTerms table. */
  900. static int insertTerms(fulltext_vtab *v, sqlite_int64 iDocid,
  901.                        sqlite3_value **pValues){
  902.   int i;
  903.   for(i = 0; i < v->nColumn ; ++i){
  904.     char *zText = (char*)sqlite3_value_text(pValues[i]);
  905.     int rc = buildTerms(v, iDocid, zText, i);
  906.     if( rc!=SQLITE_OK ) return rc;
  907.   }
  908.   return SQLITE_OK;
  909. }
  910. /* Add empty doclists for all terms in the given row's content to
  911. ** pendingTerms.
  912. */
  913. static int deleteTerms(fulltext_vtab *v, sqlite_int64 iDocid){
  914.   const char **pValues;
  915.   int i, rc;
  916.   /* TODO(shess) Should we allow such tables at all? */
  917.   if( DL_DEFAULT==DL_DOCIDS ) return SQLITE_ERROR;
  918.   rc = content_select(v, iDocid, &pValues);
  919.   if( rc!=SQLITE_OK ) return rc;
  920.   for(i = 0 ; i < v->nColumn; ++i) {
  921.     rc = buildTerms(v, iDocid, pValues[i], -1);
  922.     if( rc!=SQLITE_OK ) break;
  923.   }
  924.   freeStringArray(v->nColumn, pValues);
  925.   return SQLITE_OK;
  926. }
  927. /* TODO(shess) Refactor the code to remove this forward decl. */
  928. static int initPendingTerms(fulltext_vtab *v, sqlite_int64 iDocid);
  929. /* Insert a row into the %_content table; set *piDocid to be the ID of the
  930. ** new row.  Add doclists for terms to pendingTerms.
  931. */
  932. static int index_insert(fulltext_vtab *v, sqlite3_value *pRequestDocid,
  933.                         sqlite3_value **pValues, sqlite_int64 *piDocid){
  934.   int rc;
  935.   rc = content_insert(v, pRequestDocid, pValues);  /* execute an SQL INSERT */
  936.   if( rc!=SQLITE_OK ) return rc;
  937.   /* docid column is an alias for rowid. */
  938.   *piDocid = sqlite3_last_insert_rowid(v->db);
  939.   rc = initPendingTerms(v, *piDocid);
  940.   if( rc!=SQLITE_OK ) return rc;
  941.   return insertTerms(v, *piDocid, pValues);
  942. }
  943. /* Delete a row from the %_content table; add empty doclists for terms
  944. ** to pendingTerms.
  945. */
  946. static int index_delete(fulltext_vtab *v, sqlite_int64 iRow){
  947.   int rc = initPendingTerms(v, iRow);
  948.   if( rc!=SQLITE_OK ) return rc;
  949.   rc = deleteTerms(v, iRow);
  950.   if( rc!=SQLITE_OK ) return rc;
  951.   return content_delete(v, iRow);  /* execute an SQL DELETE */
  952. }
  953. /* Update a row in the %_content table; add delete doclists to
  954. ** pendingTerms for old terms not in the new data, add insert doclists
  955. ** to pendingTerms for terms in the new data.
  956. */
  957. static int index_update(fulltext_vtab *v, sqlite_int64 iRow,
  958.                         sqlite3_value **pValues){
  959.   int rc = initPendingTerms(v, iRow);
  960.   if( rc!=SQLITE_OK ) return rc;
  961.   /* Generate an empty doclist for each term that previously appeared in this
  962.    * row. */
  963.   rc = deleteTerms(v, iRow);
  964.   if( rc!=SQLITE_OK ) return rc;
  965.   rc = content_update(v, pValues, iRow);  /* execute an SQL UPDATE */
  966.   if( rc!=SQLITE_OK ) return rc;
  967.   /* Now add positions for terms which appear in the updated row. */
  968.   return insertTerms(v, iRow, pValues);
  969. }
  970. /*******************************************************************/
  971. /* InteriorWriter is used to collect terms and block references into
  972. ** interior nodes in %_segments.  See commentary at top of file for
  973. ** format.
  974. */
  975. /* How large interior nodes can grow. */
  976. #define INTERIOR_MAX 2048
  977. /* Minimum number of terms per interior node (except the root). This
  978. ** prevents large terms from making the tree too skinny - must be >0
  979. ** so that the tree always makes progress.  Note that the min tree
  980. ** fanout will be INTERIOR_MIN_TERMS+1.
  981. */
  982. #define INTERIOR_MIN_TERMS 7
  983. #if INTERIOR_MIN_TERMS<1
  984. # error INTERIOR_MIN_TERMS must be greater than 0.
  985. #endif
  986. /* ROOT_MAX controls how much data is stored inline in the segment
  987. ** directory.
  988. */
  989. /* TODO(shess) Push ROOT_MAX down to whoever is writing things.  It's
  990. ** only here so that interiorWriterRootInfo() and leafWriterRootInfo()
  991. ** can both see it, but if the caller passed it in, we wouldn't even
  992. ** need a define.
  993. */
  994. #define ROOT_MAX 1024
  995. #if ROOT_MAX<VARINT_MAX*2
  996. # error ROOT_MAX must have enough space for a header.
  997. #endif
  998. /* InteriorBlock stores a linked-list of interior blocks while a lower
  999. ** layer is being constructed.
  1000. */
  1001. typedef struct InteriorBlock {
  1002.   DataBuffer term;           /* Leftmost term in block's subtree. */
  1003.   DataBuffer data;           /* Accumulated data for the block. */
  1004.   struct InteriorBlock *next;
  1005. } InteriorBlock;
  1006. static InteriorBlock *interiorBlockNew(int iHeight, sqlite_int64 iChildBlock,
  1007.                                        const char *pTerm, int nTerm){
  1008.   InteriorBlock *block = sqlite3_malloc(sizeof(InteriorBlock));
  1009.   char c[VARINT_MAX+VARINT_MAX];
  1010.   int n;
  1011.   if( block ){
  1012.     memset(block, 0, sizeof(*block));
  1013.     dataBufferInit(&block->term, 0);
  1014.     dataBufferReplace(&block->term, pTerm, nTerm);
  1015.     n = fts3PutVarint(c, iHeight);
  1016.     n += fts3PutVarint(c+n, iChildBlock);
  1017.     dataBufferInit(&block->data, INTERIOR_MAX);
  1018.     dataBufferReplace(&block->data, c, n);
  1019.   }
  1020.   return block;
  1021. }
  1022. #ifndef NDEBUG
  1023. /* Verify that the data is readable as an interior node. */
  1024. static void interiorBlockValidate(InteriorBlock *pBlock){
  1025.   const char *pData = pBlock->data.pData;
  1026.   int nData = pBlock->data.nData;
  1027.   int n, iDummy;
  1028.   sqlite_int64 iBlockid;
  1029.   assert( nData>0 );
  1030.   assert( pData!=0 );
  1031.   assert( pData+nData>pData );
  1032.   /* Must lead with height of node as a varint(n), n>0 */
  1033.   n = fts3GetVarint32(pData, &iDummy);
  1034.   assert( n>0 );
  1035.   assert( iDummy>0 );
  1036.   assert( n<nData );
  1037.   pData += n;
  1038.   nData -= n;
  1039.   /* Must contain iBlockid. */
  1040.   n = fts3GetVarint(pData, &iBlockid);
  1041.   assert( n>0 );
  1042.   assert( n<=nData );
  1043.   pData += n;
  1044.   nData -= n;
  1045.   /* Zero or more terms of positive length */
  1046.   if( nData!=0 ){
  1047.     /* First term is not delta-encoded. */
  1048.     n = fts3GetVarint32(pData, &iDummy);
  1049.     assert( n>0 );
  1050.     assert( iDummy>0 );
  1051.     assert( n+iDummy>0);
  1052.     assert( n+iDummy<=nData );
  1053.     pData += n+iDummy;
  1054.     nData -= n+iDummy;
  1055.     /* Following terms delta-encoded. */
  1056.     while( nData!=0 ){
  1057.       /* Length of shared prefix. */
  1058.       n = fts3GetVarint32(pData, &iDummy);
  1059.       assert( n>0 );
  1060.       assert( iDummy>=0 );
  1061.       assert( n<nData );
  1062.       pData += n;
  1063.       nData -= n;
  1064.       /* Length and data of distinct suffix. */
  1065.       n = fts3GetVarint32(pData, &iDummy);
  1066.       assert( n>0 );
  1067.       assert( iDummy>0 );
  1068.       assert( n+iDummy>0);
  1069.       assert( n+iDummy<=nData );
  1070.       pData += n+iDummy;
  1071.       nData -= n+iDummy;
  1072.     }
  1073.   }
  1074. }
  1075. #define ASSERT_VALID_INTERIOR_BLOCK(x) interiorBlockValidate(x)
  1076. #else
  1077. #define ASSERT_VALID_INTERIOR_BLOCK(x) assert( 1 )
  1078. #endif
  1079. typedef struct InteriorWriter {
  1080.   int iHeight;                   /* from 0 at leaves. */
  1081.   InteriorBlock *first, *last;
  1082.   struct InteriorWriter *parentWriter;
  1083.   DataBuffer term;               /* Last term written to block "last". */
  1084.   sqlite_int64 iOpeningChildBlock; /* First child block in block "last". */
  1085. #ifndef NDEBUG
  1086.   sqlite_int64 iLastChildBlock;  /* for consistency checks. */
  1087. #endif
  1088. } InteriorWriter;
  1089. /* Initialize an interior node where pTerm[nTerm] marks the leftmost
  1090. ** term in the tree.  iChildBlock is the leftmost child block at the
  1091. ** next level down the tree.
  1092. */
  1093. static void interiorWriterInit(int iHeight, const char *pTerm, int nTerm,
  1094.                                sqlite_int64 iChildBlock,
  1095.                                InteriorWriter *pWriter){
  1096.   InteriorBlock *block;
  1097.   assert( iHeight>0 );
  1098.   CLEAR(pWriter);
  1099.   pWriter->iHeight = iHeight;
  1100.   pWriter->iOpeningChildBlock = iChildBlock;
  1101. #ifndef NDEBUG
  1102.   pWriter->iLastChildBlock = iChildBlock;
  1103. #endif
  1104.   block = interiorBlockNew(iHeight, iChildBlock, pTerm, nTerm);
  1105.   pWriter->last = pWriter->first = block;
  1106.   ASSERT_VALID_INTERIOR_BLOCK(pWriter->last);
  1107.   dataBufferInit(&pWriter->term, 0);
  1108. }
  1109. /* Append the child node rooted at iChildBlock to the interior node,
  1110. ** with pTerm[nTerm] as the leftmost term in iChildBlock's subtree.
  1111. */
  1112. static void interiorWriterAppend(InteriorWriter *pWriter,
  1113.                                  const char *pTerm, int nTerm,
  1114.                                  sqlite_int64 iChildBlock){
  1115.   char c[VARINT_MAX+VARINT_MAX];
  1116.   int n, nPrefix = 0;
  1117.   ASSERT_VALID_INTERIOR_BLOCK(pWriter->last);
  1118.   /* The first term written into an interior node is actually
  1119.   ** associated with the second child added (the first child was added
  1120.   ** in interiorWriterInit, or in the if clause at the bottom of this
  1121.   ** function).  That term gets encoded straight up, with nPrefix left
  1122.   ** at 0.
  1123.   */
  1124.   if( pWriter->term.nData==0 ){
  1125.     n = fts3PutVarint(c, nTerm);
  1126.   }else{
  1127.     while( nPrefix<pWriter->term.nData &&
  1128.            pTerm[nPrefix]==pWriter->term.pData[nPrefix] ){
  1129.       nPrefix++;
  1130.     }
  1131.     n = fts3PutVarint(c, nPrefix);
  1132.     n += fts3PutVarint(c+n, nTerm-nPrefix);
  1133.   }
  1134. #ifndef NDEBUG
  1135.   pWriter->iLastChildBlock++;
  1136. #endif
  1137.   assert( pWriter->iLastChildBlock==iChildBlock );
  1138.   /* Overflow to a new block if the new term makes the current block
  1139.   ** too big, and the current block already has enough terms.
  1140.   */
  1141.   if( pWriter->last->data.nData+n+nTerm-nPrefix>INTERIOR_MAX &&
  1142.       iChildBlock-pWriter->iOpeningChildBlock>INTERIOR_MIN_TERMS ){
  1143.     pWriter->last->next = interiorBlockNew(pWriter->iHeight, iChildBlock,
  1144.                                            pTerm, nTerm);
  1145.     pWriter->last = pWriter->last->next;
  1146.     pWriter->iOpeningChildBlock = iChildBlock;
  1147.     dataBufferReset(&pWriter->term);
  1148.   }else{
  1149.     dataBufferAppend2(&pWriter->last->data, c, n,
  1150.                       pTerm+nPrefix, nTerm-nPrefix);
  1151.     dataBufferReplace(&pWriter->term, pTerm, nTerm);
  1152.   }
  1153.   ASSERT_VALID_INTERIOR_BLOCK(pWriter->last);
  1154. }
  1155. /* Free the space used by pWriter, including the linked-list of
  1156. ** InteriorBlocks, and parentWriter, if present.
  1157. */
  1158. static int interiorWriterDestroy(InteriorWriter *pWriter){
  1159.   InteriorBlock *block = pWriter->first;
  1160.   while( block!=NULL ){
  1161.     InteriorBlock *b = block;
  1162.     block = block->next;
  1163.     dataBufferDestroy(&b->term);
  1164.     dataBufferDestroy(&b->data);
  1165.     sqlite3_free(b);
  1166.   }
  1167.   if( pWriter->parentWriter!=NULL ){
  1168.     interiorWriterDestroy(pWriter->parentWriter);
  1169.     sqlite3_free(pWriter->parentWriter);
  1170.   }
  1171.   dataBufferDestroy(&pWriter->term);
  1172.   SCRAMBLE(pWriter);
  1173.   return SQLITE_OK;
  1174. }
  1175. /* If pWriter can fit entirely in ROOT_MAX, return it as the root info
  1176. ** directly, leaving *piEndBlockid unchanged.  Otherwise, flush
  1177. ** pWriter to %_segments, building a new layer of interior nodes, and
  1178. ** recursively ask for their root into.
  1179. */
  1180. static int interiorWriterRootInfo(fulltext_vtab *v, InteriorWriter *pWriter,
  1181.                                   char **ppRootInfo, int *pnRootInfo,
  1182.                                   sqlite_int64 *piEndBlockid){
  1183.   InteriorBlock *block = pWriter->first;
  1184.   sqlite_int64 iBlockid = 0;
  1185.   int rc;
  1186.   /* If we can fit the segment inline */
  1187.   if( block==pWriter->last && block->data.nData<ROOT_MAX ){
  1188.     *ppRootInfo = block->data.pData;
  1189.     *pnRootInfo = block->data.nData;
  1190.     return SQLITE_OK;
  1191.   }
  1192.   /* Flush the first block to %_segments, and create a new level of
  1193.   ** interior node.
  1194.   */
  1195.   ASSERT_VALID_INTERIOR_BLOCK(block);
  1196.   rc = block_insert(v, block->data.pData, block->data.nData, &iBlockid);
  1197.   if( rc!=SQLITE_OK ) return rc;
  1198.   *piEndBlockid = iBlockid;
  1199.   pWriter->parentWriter = sqlite3_malloc(sizeof(*pWriter->parentWriter));
  1200.   interiorWriterInit(pWriter->iHeight+1,
  1201.                      block->term.pData, block->term.nData,
  1202.                      iBlockid, pWriter->parentWriter);
  1203.   /* Flush additional blocks and append to the higher interior
  1204.   ** node.
  1205.   */
  1206.   for(block=block->next; block!=NULL; block=block->next){
  1207.     ASSERT_VALID_INTERIOR_BLOCK(block);
  1208.     rc = block_insert(v, block->data.pData, block->data.nData, &iBlockid);
  1209.     if( rc!=SQLITE_OK ) return rc;
  1210.     *piEndBlockid = iBlockid;
  1211.     interiorWriterAppend(pWriter->parentWriter,
  1212.                          block->term.pData, block->term.nData, iBlockid);
  1213.   }
  1214.   /* Parent node gets the chance to be the root. */
  1215.   return interiorWriterRootInfo(v, pWriter->parentWriter,
  1216.                                 ppRootInfo, pnRootInfo, piEndBlockid);
  1217. }
  1218. /****************************************************************/
  1219. /* InteriorReader is used to read off the data from an interior node
  1220. ** (see comment at top of file for the format).
  1221. */
  1222. typedef struct InteriorReader {
  1223.   const char *pData;
  1224.   int nData;
  1225.   DataBuffer term;          /* previous term, for decoding term delta. */
  1226.   sqlite_int64 iBlockid;
  1227. } InteriorReader;
  1228. static void interiorReaderDestroy(InteriorReader *pReader){
  1229.   dataBufferDestroy(&pReader->term);
  1230.   SCRAMBLE(pReader);
  1231. }
  1232. /* TODO(shess) The assertions are great, but what if we're in NDEBUG
  1233. ** and the blob is empty or otherwise contains suspect data?
  1234. */
  1235. static void interiorReaderInit(const char *pData, int nData,
  1236.                                InteriorReader *pReader){
  1237.   int n, nTerm;
  1238.   /* Require at least the leading flag byte */
  1239.   assert( nData>0 );
  1240.   assert( pData[0]!='' );
  1241.   CLEAR(pReader);
  1242.   /* Decode the base blockid, and set the cursor to the first term. */
  1243.   n = fts3GetVarint(pData+1, &pReader->iBlockid);
  1244.   assert( 1+n<=nData );
  1245.   pReader->pData = pData+1+n;
  1246.   pReader->nData = nData-(1+n);
  1247.   /* A single-child interior node (such as when a leaf node was too
  1248.   ** large for the segment directory) won't have any terms.
  1249.   ** Otherwise, decode the first term.
  1250.   */
  1251.   if( pReader->nData==0 ){
  1252.     dataBufferInit(&pReader->term, 0);
  1253.   }else{
  1254.     n = fts3GetVarint32(pReader->pData, &nTerm);
  1255.     dataBufferInit(&pReader->term, nTerm);
  1256.     dataBufferReplace(&pReader->term, pReader->pData+n, nTerm);
  1257.     assert( n+nTerm<=pReader->nData );
  1258.     pReader->pData += n+nTerm;
  1259.     pReader->nData -= n+nTerm;
  1260.   }
  1261. }
  1262. static int interiorReaderAtEnd(InteriorReader *pReader){
  1263.   return pReader->term.nData==0;
  1264. }
  1265. static sqlite_int64 interiorReaderCurrentBlockid(InteriorReader *pReader){
  1266.   return pReader->iBlockid;
  1267. }
  1268. static int interiorReaderTermBytes(InteriorReader *pReader){
  1269.   assert( !interiorReaderAtEnd(pReader) );
  1270.   return pReader->term.nData;
  1271. }
  1272. static const char *interiorReaderTerm(InteriorReader *pReader){
  1273.   assert( !interiorReaderAtEnd(pReader) );
  1274.   return pReader->term.pData;
  1275. }
  1276. /* Step forward to the next term in the node. */
  1277. static void interiorReaderStep(InteriorReader *pReader){
  1278.   assert( !interiorReaderAtEnd(pReader) );
  1279.   /* If the last term has been read, signal eof, else construct the
  1280.   ** next term.
  1281.   */
  1282.   if( pReader->nData==0 ){
  1283.     dataBufferReset(&pReader->term);
  1284.   }else{
  1285.     int n, nPrefix, nSuffix;
  1286.     n = fts3GetVarint32(pReader->pData, &nPrefix);
  1287.     n += fts3GetVarint32(pReader->pData+n, &nSuffix);
  1288.     /* Truncate the current term and append suffix data. */
  1289.     pReader->term.nData = nPrefix;
  1290.     dataBufferAppend(&pReader->term, pReader->pData+n, nSuffix);
  1291.     assert( n+nSuffix<=pReader->nData );
  1292.     pReader->pData += n+nSuffix;
  1293.     pReader->nData -= n+nSuffix;
  1294.   }
  1295.   pReader->iBlockid++;
  1296. }
  1297. /* Compare the current term to pTerm[nTerm], returning strcmp-style
  1298. ** results.  If isPrefix, equality means equal through nTerm bytes.
  1299. */
  1300. static int interiorReaderTermCmp(InteriorReader *pReader,
  1301.                                  const char *pTerm, int nTerm, int isPrefix){
  1302.   const char *pReaderTerm = interiorReaderTerm(pReader);
  1303.   int nReaderTerm = interiorReaderTermBytes(pReader);
  1304.   int c, n = nReaderTerm<nTerm ? nReaderTerm : nTerm;
  1305.   if( n==0 ){
  1306.     if( nReaderTerm>0 ) return -1;
  1307.     if( nTerm>0 ) return 1;
  1308.     return 0;
  1309.   }
  1310.   c = memcmp(pReaderTerm, pTerm, n);
  1311.   if( c!=0 ) return c;
  1312.   if( isPrefix && n==nTerm ) return 0;
  1313.   return nReaderTerm - nTerm;
  1314. }
  1315. /****************************************************************/
  1316. /* LeafWriter is used to collect terms and associated doclist data
  1317. ** into leaf blocks in %_segments (see top of file for format info).
  1318. ** Expected usage is:
  1319. **
  1320. ** LeafWriter writer;
  1321. ** leafWriterInit(0, 0, &writer);
  1322. ** while( sorted_terms_left_to_process ){
  1323. **   // data is doclist data for that term.
  1324. **   rc = leafWriterStep(v, &writer, pTerm, nTerm, pData, nData);
  1325. **   if( rc!=SQLITE_OK ) goto err;
  1326. ** }
  1327. ** rc = leafWriterFinalize(v, &writer);
  1328. **err:
  1329. ** leafWriterDestroy(&writer);
  1330. ** return rc;
  1331. **
  1332. ** leafWriterStep() may write a collected leaf out to %_segments.
  1333. ** leafWriterFinalize() finishes writing any buffered data and stores
  1334. ** a root node in %_segdir.  leafWriterDestroy() frees all buffers and
  1335. ** InteriorWriters allocated as part of writing this segment.
  1336. **
  1337. ** TODO(shess) Document leafWriterStepMerge().
  1338. */
  1339. /* Put terms with data this big in their own block. */
  1340. #define STANDALONE_MIN 1024
  1341. /* Keep leaf blocks below this size. */
  1342. #define LEAF_MAX 2048
  1343. typedef struct LeafWriter {
  1344.   int iLevel;
  1345.   int idx;
  1346.   sqlite_int64 iStartBlockid;     /* needed to create the root info */
  1347.   sqlite_int64 iEndBlockid;       /* when we're done writing. */
  1348.   DataBuffer term;                /* previous encoded term */
  1349.   DataBuffer data;                /* encoding buffer */
  1350.   /* bytes of first term in the current node which distinguishes that
  1351.   ** term from the last term of the previous node.
  1352.   */
  1353.   int nTermDistinct;
  1354.   InteriorWriter parentWriter;    /* if we overflow */
  1355.   int has_parent;
  1356. } LeafWriter;
  1357. static void leafWriterInit(int iLevel, int idx, LeafWriter *pWriter){
  1358.   CLEAR(pWriter);
  1359.   pWriter->iLevel = iLevel;
  1360.   pWriter->idx = idx;
  1361.   dataBufferInit(&pWriter->term, 32);
  1362.   /* Start out with a reasonably sized block, though it can grow. */
  1363.   dataBufferInit(&pWriter->data, LEAF_MAX);
  1364. }
  1365. #ifndef NDEBUG
  1366. /* Verify that the data is readable as a leaf node. */
  1367. static void leafNodeValidate(const char *pData, int nData){
  1368.   int n, iDummy;
  1369.   if( nData==0 ) return;
  1370.   assert( nData>0 );
  1371.   assert( pData!=0 );
  1372.   assert( pData+nData>pData );
  1373.   /* Must lead with a varint(0) */
  1374.   n = fts3GetVarint32(pData, &iDummy);
  1375.   assert( iDummy==0 );
  1376.   assert( n>0 );
  1377.   assert( n<nData );
  1378.   pData += n;
  1379.   nData -= n;
  1380.   /* Leading term length and data must fit in buffer. */
  1381.   n = fts3GetVarint32(pData, &iDummy);
  1382.   assert( n>0 );
  1383.   assert( iDummy>0 );
  1384.   assert( n+iDummy>0 );
  1385.   assert( n+iDummy<nData );
  1386.   pData += n+iDummy;
  1387.   nData -= n+iDummy;
  1388.   /* Leading term's doclist length and data must fit. */
  1389.   n = fts3GetVarint32(pData, &iDummy);
  1390.   assert( n>0 );
  1391.   assert( iDummy>0 );
  1392.   assert( n+iDummy>0 );
  1393.   assert( n+iDummy<=nData );
  1394.   ASSERT_VALID_DOCLIST(DL_DEFAULT, pData+n, iDummy, NULL);
  1395.   pData += n+iDummy;
  1396.   nData -= n+iDummy;
  1397.   /* Verify that trailing terms and doclists also are readable. */
  1398.   while( nData!=0 ){
  1399.     n = fts3GetVarint32(pData, &iDummy);
  1400.     assert( n>0 );
  1401.     assert( iDummy>=0 );
  1402.     assert( n<nData );
  1403.     pData += n;
  1404.     nData -= n;
  1405.     n = fts3GetVarint32(pData, &iDummy);
  1406.     assert( n>0 );
  1407.     assert( iDummy>0 );
  1408.     assert( n+iDummy>0 );
  1409.     assert( n+iDummy<nData );
  1410.     pData += n+iDummy;
  1411.     nData -= n+iDummy;
  1412.     n = fts3GetVarint32(pData, &iDummy);
  1413.     assert( n>0 );
  1414.     assert( iDummy>0 );
  1415.     assert( n+iDummy>0 );
  1416.     assert( n+iDummy<=nData );
  1417.     ASSERT_VALID_DOCLIST(DL_DEFAULT, pData+n, iDummy, NULL);
  1418.     pData += n+iDummy;
  1419.     nData -= n+iDummy;
  1420.   }
  1421. }
  1422. #define ASSERT_VALID_LEAF_NODE(p, n) leafNodeValidate(p, n)
  1423. #else
  1424. #define ASSERT_VALID_LEAF_NODE(p, n) assert( 1 )
  1425. #endif
  1426. /* Flush the current leaf node to %_segments, and adding the resulting
  1427. ** blockid and the starting term to the interior node which will
  1428. ** contain it.
  1429. */
  1430. static int leafWriterInternalFlush(fulltext_vtab *v, LeafWriter *pWriter,
  1431.                                    int iData, int nData){
  1432.   sqlite_int64 iBlockid = 0;
  1433.   const char *pStartingTerm;
  1434.   int nStartingTerm, rc, n;
  1435.   /* Must have the leading varint(0) flag, plus at least some
  1436.   ** valid-looking data.
  1437.   */
  1438.   assert( nData>2 );
  1439.   assert( iData>=0 );
  1440.   assert( iData+nData<=pWriter->data.nData );
  1441.   ASSERT_VALID_LEAF_NODE(pWriter->data.pData+iData, nData);
  1442.   rc = block_insert(v, pWriter->data.pData+iData, nData, &iBlockid);
  1443.   if( rc!=SQLITE_OK ) return rc;
  1444.   assert( iBlockid!=0 );
  1445.   /* Reconstruct the first term in the leaf for purposes of building
  1446.   ** the interior node.
  1447.   */
  1448.   n = fts3GetVarint32(pWriter->data.pData+iData+1, &nStartingTerm);
  1449.   pStartingTerm = pWriter->data.pData+iData+1+n;
  1450.   assert( pWriter->data.nData>iData+1+n+nStartingTerm );
  1451.   assert( pWriter->nTermDistinct>0 );
  1452.   assert( pWriter->nTermDistinct<=nStartingTerm );
  1453.   nStartingTerm = pWriter->nTermDistinct;
  1454.   if( pWriter->has_parent ){
  1455.     interiorWriterAppend(&pWriter->parentWriter,
  1456.                          pStartingTerm, nStartingTerm, iBlockid);
  1457.   }else{
  1458.     interiorWriterInit(1, pStartingTerm, nStartingTerm, iBlockid,
  1459.                        &pWriter->parentWriter);
  1460.     pWriter->has_parent = 1;
  1461.   }
  1462.   /* Track the span of this segment's leaf nodes. */
  1463.   if( pWriter->iEndBlockid==0 ){
  1464.     pWriter->iEndBlockid = pWriter->iStartBlockid = iBlockid;
  1465.   }else{
  1466.     pWriter->iEndBlockid++;
  1467.     assert( iBlockid==pWriter->iEndBlockid );
  1468.   }
  1469.   return SQLITE_OK;
  1470. }
  1471. static int leafWriterFlush(fulltext_vtab *v, LeafWriter *pWriter){
  1472.   int rc = leafWriterInternalFlush(v, pWriter, 0, pWriter->data.nData);
  1473.   if( rc!=SQLITE_OK ) return rc;
  1474.   /* Re-initialize the output buffer. */
  1475.   dataBufferReset(&pWriter->data);
  1476.   return SQLITE_OK;
  1477. }
  1478. /* Fetch the root info for the segment.  If the entire leaf fits
  1479. ** within ROOT_MAX, then it will be returned directly, otherwise it
  1480. ** will be flushed and the root info will be returned from the
  1481. ** interior node.  *piEndBlockid is set to the blockid of the last
  1482. ** interior or leaf node written to disk (0 if none are written at
  1483. ** all).
  1484. */
  1485. static int leafWriterRootInfo(fulltext_vtab *v, LeafWriter *pWriter,
  1486.                               char **ppRootInfo, int *pnRootInfo,
  1487.                               sqlite_int64 *piEndBlockid){
  1488.   /* we can fit the segment entirely inline */
  1489.   if( !pWriter->has_parent && pWriter->data.nData<ROOT_MAX ){
  1490.     *ppRootInfo = pWriter->data.pData;
  1491.     *pnRootInfo = pWriter->data.nData;
  1492.     *piEndBlockid = 0;
  1493.     return SQLITE_OK;
  1494.   }
  1495.   /* Flush remaining leaf data. */
  1496.   if( pWriter->data.nData>0 ){
  1497.     int rc = leafWriterFlush(v, pWriter);
  1498.     if( rc!=SQLITE_OK ) return rc;
  1499.   }
  1500.   /* We must have flushed a leaf at some point. */
  1501.   assert( pWriter->has_parent );
  1502.   /* Tenatively set the end leaf blockid as the end blockid.  If the
  1503.   ** interior node can be returned inline, this will be the final
  1504.   ** blockid, otherwise it will be overwritten by
  1505.   ** interiorWriterRootInfo().
  1506.   */
  1507.   *piEndBlockid = pWriter->iEndBlockid;
  1508.   return interiorWriterRootInfo(v, &pWriter->parentWriter,
  1509.                                 ppRootInfo, pnRootInfo, piEndBlockid);
  1510. }
  1511. /* Collect the rootInfo data and store it into the segment directory.
  1512. ** This has the effect of flushing the segment's leaf data to
  1513. ** %_segments, and also flushing any interior nodes to %_segments.
  1514. */
  1515. static int leafWriterFinalize(fulltext_vtab *v, LeafWriter *pWriter){
  1516.   sqlite_int64 iEndBlockid;
  1517.   char *pRootInfo;
  1518.   int rc, nRootInfo;
  1519.   rc = leafWriterRootInfo(v, pWriter, &pRootInfo, &nRootInfo, &iEndBlockid);
  1520.   if( rc!=SQLITE_OK ) return rc;
  1521.   /* Don't bother storing an entirely empty segment. */
  1522.   if( iEndBlockid==0 && nRootInfo==0 ) return SQLITE_OK;
  1523.   return segdir_set(v, pWriter->iLevel, pWriter->idx,
  1524.                     pWriter->iStartBlockid, pWriter->iEndBlockid,
  1525.                     iEndBlockid, pRootInfo, nRootInfo);
  1526. }
  1527. static void leafWriterDestroy(LeafWriter *pWriter){
  1528.   if( pWriter->has_parent ) interiorWriterDestroy(&pWriter->parentWriter);
  1529.   dataBufferDestroy(&pWriter->term);
  1530.   dataBufferDestroy(&pWriter->data);
  1531. }
  1532. /* Encode a term into the leafWriter, delta-encoding as appropriate.
  1533. ** Returns the length of the new term which distinguishes it from the
  1534. ** previous term, which can be used to set nTermDistinct when a node
  1535. ** boundary is crossed.
  1536. */
  1537. static int leafWriterEncodeTerm(LeafWriter *pWriter,
  1538.                                 const char *pTerm, int nTerm){
  1539.   char c[VARINT_MAX+VARINT_MAX];
  1540.   int n, nPrefix = 0;
  1541.   assert( nTerm>0 );
  1542.   while( nPrefix<pWriter->term.nData &&
  1543.          pTerm[nPrefix]==pWriter->term.pData[nPrefix] ){
  1544.     nPrefix++;
  1545.     /* Failing this implies that the terms weren't in order. */
  1546.     assert( nPrefix<nTerm );
  1547.   }
  1548.   if( pWriter->data.nData==0 ){
  1549.     /* Encode the node header and leading term as:
  1550.     **  varint(0)
  1551.     **  varint(nTerm)
  1552.     **  char pTerm[nTerm]
  1553.     */
  1554.     n = fts3PutVarint(c, '');
  1555.     n += fts3PutVarint(c+n, nTerm);
  1556.     dataBufferAppend2(&pWriter->data, c, n, pTerm, nTerm);
  1557.   }else{
  1558.     /* Delta-encode the term as:
  1559.     **  varint(nPrefix)
  1560.     **  varint(nSuffix)
  1561.     **  char pTermSuffix[nSuffix]
  1562.     */
  1563.     n = fts3PutVarint(c, nPrefix);
  1564.     n += fts3PutVarint(c+n, nTerm-nPrefix);
  1565.     dataBufferAppend2(&pWriter->data, c, n, pTerm+nPrefix, nTerm-nPrefix);
  1566.   }
  1567.   dataBufferReplace(&pWriter->term, pTerm, nTerm);
  1568.   return nPrefix+1;
  1569. }
  1570. /* Used to avoid a memmove when a large amount of doclist data is in
  1571. ** the buffer.  This constructs a node and term header before
  1572. ** iDoclistData and flushes the resulting complete node using
  1573. ** leafWriterInternalFlush().
  1574. */
  1575. static int leafWriterInlineFlush(fulltext_vtab *v, LeafWriter *pWriter,
  1576.                                  const char *pTerm, int nTerm,
  1577.                                  int iDoclistData){
  1578.   char c[VARINT_MAX+VARINT_MAX];
  1579.   int iData, n = fts3PutVarint(c, 0);
  1580.   n += fts3PutVarint(c+n, nTerm);
  1581.   /* There should always be room for the header.  Even if pTerm shared
  1582.   ** a substantial prefix with the previous term, the entire prefix
  1583.   ** could be constructed from earlier data in the doclist, so there
  1584.   ** should be room.
  1585.   */
  1586.   assert( iDoclistData>=n+nTerm );
  1587.   iData = iDoclistData-(n+nTerm);
  1588.   memcpy(pWriter->data.pData+iData, c, n);
  1589.   memcpy(pWriter->data.pData+iData+n, pTerm, nTerm);
  1590.   return leafWriterInternalFlush(v, pWriter, iData, pWriter->data.nData-iData);
  1591. }
  1592. /* Push pTerm[nTerm] along with the doclist data to the leaf layer of
  1593. ** %_segments.
  1594. */
  1595. static int leafWriterStepMerge(fulltext_vtab *v, LeafWriter *pWriter,
  1596.                                const char *pTerm, int nTerm,
  1597.                                DLReader *pReaders, int nReaders){
  1598.   char c[VARINT_MAX+VARINT_MAX];
  1599.   int iTermData = pWriter->data.nData, iDoclistData;
  1600.   int i, nData, n, nActualData, nActual, rc, nTermDistinct;
  1601.   ASSERT_VALID_LEAF_NODE(pWriter->data.pData, pWriter->data.nData);
  1602.   nTermDistinct = leafWriterEncodeTerm(pWriter, pTerm, nTerm);
  1603.   /* Remember nTermDistinct if opening a new node. */
  1604.   if( iTermData==0 ) pWriter->nTermDistinct = nTermDistinct;
  1605.   iDoclistData = pWriter->data.nData;
  1606.   /* Estimate the length of the merged doclist so we can leave space
  1607.   ** to encode it.
  1608.   */
  1609.   for(i=0, nData=0; i<nReaders; i++){
  1610.     nData += dlrAllDataBytes(&pReaders[i]);
  1611.   }
  1612.   n = fts3PutVarint(c, nData);
  1613.   dataBufferAppend(&pWriter->data, c, n);
  1614.   docListMerge(&pWriter->data, pReaders, nReaders);
  1615.   ASSERT_VALID_DOCLIST(DL_DEFAULT,
  1616.                        pWriter->data.pData+iDoclistData+n,
  1617.                        pWriter->data.nData-iDoclistData-n, NULL);
  1618.   /* The actual amount of doclist data at this point could be smaller
  1619.   ** than the length we encoded.  Additionally, the space required to
  1620.   ** encode this length could be smaller.  For small doclists, this is
  1621.   ** not a big deal, we can just use memmove() to adjust things.
  1622.   */
  1623.   nActualData = pWriter->data.nData-(iDoclistData+n);
  1624.   nActual = fts3PutVarint(c, nActualData);
  1625.   assert( nActualData<=nData );
  1626.   assert( nActual<=n );
  1627.   /* If the new doclist is big enough for force a standalone leaf
  1628.   ** node, we can immediately flush it inline without doing the
  1629.   ** memmove().
  1630.   */
  1631.   /* TODO(shess) This test matches leafWriterStep(), which does this
  1632.   ** test before it knows the cost to varint-encode the term and
  1633.   ** doclist lengths.  At some point, change to
  1634.   ** pWriter->data.nData-iTermData>STANDALONE_MIN.
  1635.   */
  1636.   if( nTerm+nActualData>STANDALONE_MIN ){
  1637.     /* Push leaf node from before this term. */
  1638.     if( iTermData>0 ){
  1639.       rc = leafWriterInternalFlush(v, pWriter, 0, iTermData);
  1640.       if( rc!=SQLITE_OK ) return rc;
  1641.       pWriter->nTermDistinct = nTermDistinct;
  1642.     }
  1643.     /* Fix the encoded doclist length. */
  1644.     iDoclistData += n - nActual;
  1645.     memcpy(pWriter->data.pData+iDoclistData, c, nActual);
  1646.     /* Push the standalone leaf node. */
  1647.     rc = leafWriterInlineFlush(v, pWriter, pTerm, nTerm, iDoclistData);
  1648.     if( rc!=SQLITE_OK ) return rc;
  1649.     /* Leave the node empty. */
  1650.     dataBufferReset(&pWriter->data);
  1651.     return rc;
  1652.   }
  1653.   /* At this point, we know that the doclist was small, so do the
  1654.   ** memmove if indicated.
  1655.   */
  1656.   if( nActual<n ){
  1657.     memmove(pWriter->data.pData+iDoclistData+nActual,
  1658.             pWriter->data.pData+iDoclistData+n,
  1659.             pWriter->data.nData-(iDoclistData+n));
  1660.     pWriter->data.nData -= n-nActual;
  1661.   }
  1662.   /* Replace written length with actual length. */
  1663.   memcpy(pWriter->data.pData+iDoclistData, c, nActual);
  1664.   /* If the node is too large, break things up. */
  1665.   /* TODO(shess) This test matches leafWriterStep(), which does this
  1666.   ** test before it knows the cost to varint-encode the term and
  1667.   ** doclist lengths.  At some point, change to
  1668.   ** pWriter->data.nData>LEAF_MAX.
  1669.   */
  1670.   if( iTermData+nTerm+nActualData>LEAF_MAX ){
  1671.     /* Flush out the leading data as a node */
  1672.     rc = leafWriterInternalFlush(v, pWriter, 0, iTermData);
  1673.     if( rc!=SQLITE_OK ) return rc;
  1674.     pWriter->nTermDistinct = nTermDistinct;
  1675.     /* Rebuild header using the current term */
  1676.     n = fts3PutVarint(pWriter->data.pData, 0);
  1677.     n += fts3PutVarint(pWriter->data.pData+n, nTerm);
  1678.     memcpy(pWriter->data.pData+n, pTerm, nTerm);
  1679.     n += nTerm;
  1680.     /* There should always be room, because the previous encoding
  1681.     ** included all data necessary to construct the term.
  1682.     */
  1683.     assert( n<iDoclistData );
  1684.     /* So long as STANDALONE_MIN is half or less of LEAF_MAX, the
  1685.     ** following memcpy() is safe (as opposed to needing a memmove).
  1686.     */
  1687.     assert( 2*STANDALONE_MIN<=LEAF_MAX );
  1688.     assert( n+pWriter->data.nData-iDoclistData<iDoclistData );
  1689.     memcpy(pWriter->data.pData+n,
  1690.            pWriter->data.pData+iDoclistData,
  1691.            pWriter->data.nData-iDoclistData);
  1692.     pWriter->data.nData -= iDoclistData-n;
  1693.   }
  1694.   ASSERT_VALID_LEAF_NODE(pWriter->data.pData, pWriter->data.nData);
  1695.   return SQLITE_OK;
  1696. }
  1697. /* Push pTerm[nTerm] along with the doclist data to the leaf layer of
  1698. ** %_segments.
  1699. */
  1700. /* TODO(shess) Revise writeZeroSegment() so that doclists are
  1701. ** constructed directly in pWriter->data.
  1702. */
  1703. static int leafWriterStep(fulltext_vtab *v, LeafWriter *pWriter,
  1704.                           const char *pTerm, int nTerm,
  1705.                           const char *pData, int nData){
  1706.   int rc;
  1707.   DLReader reader;
  1708.   dlrInit(&reader, DL_DEFAULT, pData, nData);
  1709.   rc = leafWriterStepMerge(v, pWriter, pTerm, nTerm, &reader, 1);
  1710.   dlrDestroy(&reader);
  1711.   return rc;
  1712. }
  1713. /****************************************************************/
  1714. /* LeafReader is used to iterate over an individual leaf node. */
  1715. typedef struct LeafReader {
  1716.   DataBuffer term;          /* copy of current term. */
  1717.   const char *pData;        /* data for current term. */
  1718.   int nData;
  1719. } LeafReader;
  1720. static void leafReaderDestroy(LeafReader *pReader){
  1721.   dataBufferDestroy(&pReader->term);
  1722.   SCRAMBLE(pReader);
  1723. }
  1724. static int leafReaderAtEnd(LeafReader *pReader){
  1725.   return pReader->nData<=0;
  1726. }
  1727. /* Access the current term. */
  1728. static int leafReaderTermBytes(LeafReader *pReader){
  1729.   return pReader->term.nData;
  1730. }
  1731. static const char *leafReaderTerm(LeafReader *pReader){
  1732.   assert( pReader->term.nData>0 );
  1733.   return pReader->term.pData;
  1734. }
  1735. /* Access the doclist data for the current term. */
  1736. static int leafReaderDataBytes(LeafReader *pReader){
  1737.   int nData;
  1738.   assert( pReader->term.nData>0 );
  1739.   fts3GetVarint32(pReader->pData, &nData);
  1740.   return nData;
  1741. }
  1742. static const char *leafReaderData(LeafReader *pReader){
  1743.   int n, nData;
  1744.   assert( pReader->term.nData>0 );
  1745.   n = fts3GetVarint32(pReader->pData, &nData);
  1746.   return pReader->pData+n;
  1747. }
  1748. static void leafReaderInit(const char *pData, int nData,
  1749.                            LeafReader *pReader){
  1750.   int nTerm, n;
  1751.   assert( nData>0 );
  1752.   assert( pData[0]=='' );
  1753.   CLEAR(pReader);
  1754.   /* Read the first term, skipping the header byte. */
  1755.   n = fts3GetVarint32(pData+1, &nTerm);
  1756.   dataBufferInit(&pReader->term, nTerm);
  1757.   dataBufferReplace(&pReader->term, pData+1+n, nTerm);
  1758.   /* Position after the first term. */
  1759.   assert( 1+n+nTerm<nData );
  1760.   pReader->pData = pData+1+n+nTerm;
  1761.   pReader->nData = nData-1-n-nTerm;
  1762. }
  1763. /* Step the reader forward to the next term. */
  1764. static void leafReaderStep(LeafReader *pReader){
  1765.   int n, nData, nPrefix, nSuffix;
  1766.   assert( !leafReaderAtEnd(pReader) );
  1767.   /* Skip previous entry's data block. */
  1768.   n = fts3GetVarint32(pReader->pData, &nData);
  1769.   assert( n+nData<=pReader->nData );
  1770.   pReader->pData += n+nData;
  1771.   pReader->nData -= n+nData;
  1772.   if( !leafReaderAtEnd(pReader) ){
  1773.     /* Construct the new term using a prefix from the old term plus a
  1774.     ** suffix from the leaf data.
  1775.     */
  1776.     n = fts3GetVarint32(pReader->pData, &nPrefix);
  1777.     n += fts3GetVarint32(pReader->pData+n, &nSuffix);
  1778.     assert( n+nSuffix<pReader->nData );
  1779.     pReader->term.nData = nPrefix;
  1780.     dataBufferAppend(&pReader->term, pReader->pData+n, nSuffix);
  1781.     pReader->pData += n+nSuffix;
  1782.     pReader->nData -= n+nSuffix;
  1783.   }
  1784. }
  1785. /* strcmp-style comparison of pReader's current term against pTerm.
  1786. ** If isPrefix, equality means equal through nTerm bytes.
  1787. */
  1788. static int leafReaderTermCmp(LeafReader *pReader,
  1789.                              const char *pTerm, int nTerm, int isPrefix){
  1790.   int c, n = pReader->term.nData<nTerm ? pReader->term.nData : nTerm;
  1791.   if( n==0 ){
  1792.     if( pReader->term.nData>0 ) return -1;
  1793.     if(nTerm>0 ) return 1;
  1794.     return 0;
  1795.   }
  1796.   c = memcmp(pReader->term.pData, pTerm, n);
  1797.   if( c!=0 ) return c;
  1798.   if( isPrefix && n==nTerm ) return 0;
  1799.   return pReader->term.nData - nTerm;
  1800. }
  1801. /****************************************************************/
  1802. /* LeavesReader wraps LeafReader to allow iterating over the entire
  1803. ** leaf layer of the tree.
  1804. */
  1805. typedef struct LeavesReader {
  1806.   int idx;                  /* Index within the segment. */
  1807.   sqlite3_stmt *pStmt;      /* Statement we're streaming leaves from. */
  1808.   int eof;                  /* we've seen SQLITE_DONE from pStmt. */
  1809.   LeafReader leafReader;    /* reader for the current leaf. */
  1810.   DataBuffer rootData;      /* root data for inline. */
  1811. } LeavesReader;
  1812. /* Access the current term. */
  1813. static int leavesReaderTermBytes(LeavesReader *pReader){
  1814.   assert( !pReader->eof );
  1815.   return leafReaderTermBytes(&pReader->leafReader);
  1816. }
  1817. static const char *leavesReaderTerm(LeavesReader *pReader){
  1818.   assert( !pReader->eof );
  1819.   return leafReaderTerm(&pReader->leafReader);
  1820. }
  1821. /* Access the doclist data for the current term. */
  1822. static int leavesReaderDataBytes(LeavesReader *pReader){
  1823.   assert( !pReader->eof );
  1824.   return leafReaderDataBytes(&pReader->leafReader);
  1825. }
  1826. static const char *leavesReaderData(LeavesReader *pReader){
  1827.   assert( !pReader->eof );
  1828.   return leafReaderData(&pReader->leafReader);
  1829. }
  1830. static int leavesReaderAtEnd(LeavesReader *pReader){
  1831.   return pReader->eof;
  1832. }
  1833. /* loadSegmentLeaves() may not read all the way to SQLITE_DONE, thus
  1834. ** leaving the statement handle open, which locks the table.
  1835. */
  1836. /* TODO(shess) This "solution" is not satisfactory.  Really, there
  1837. ** should be check-in function for all statement handles which
  1838. ** arranges to call sqlite3_reset().  This most likely will require
  1839. ** modification to control flow all over the place, though, so for now
  1840. ** just punt.
  1841. **
  1842. ** Note the the current system assumes that segment merges will run to
  1843. ** completion, which is why this particular probably hasn't arisen in
  1844. ** this case.  Probably a brittle assumption.
  1845. */
  1846. static int leavesReaderReset(LeavesReader *pReader){
  1847.   return sqlite3_reset(pReader->pStmt);
  1848. }
  1849. static void leavesReaderDestroy(LeavesReader *pReader){
  1850.   leafReaderDestroy(&pReader->leafReader);
  1851.   dataBufferDestroy(&pReader->rootData);
  1852.   SCRAMBLE(pReader);
  1853. }
  1854. /* Initialize pReader with the given root data (if iStartBlockid==0
  1855. ** the leaf data was entirely contained in the root), or from the
  1856. ** stream of blocks between iStartBlockid and iEndBlockid, inclusive.
  1857. */
  1858. static int leavesReaderInit(fulltext_vtab *v,
  1859.                             int idx,
  1860.                             sqlite_int64 iStartBlockid,
  1861.                             sqlite_int64 iEndBlockid,
  1862.                             const char *pRootData, int nRootData,
  1863.                             LeavesReader *pReader){
  1864.   CLEAR(pReader);
  1865.   pReader->idx = idx;
  1866.   dataBufferInit(&pReader->rootData, 0);
  1867.   if( iStartBlockid==0 ){
  1868.     /* Entire leaf level fit in root data. */
  1869.     dataBufferReplace(&pReader->rootData, pRootData, nRootData);
  1870.     leafReaderInit(pReader->rootData.pData, pReader->rootData.nData,
  1871.                    &pReader->leafReader);
  1872.   }else{
  1873.     sqlite3_stmt *s;
  1874.     int rc = sql_get_leaf_statement(v, idx, &s);
  1875.     if( rc!=SQLITE_OK ) return rc;
  1876.     rc = sqlite3_bind_int64(s, 1, iStartBlockid);
  1877.     if( rc!=SQLITE_OK ) return rc;
  1878.     rc = sqlite3_bind_int64(s, 2, iEndBlockid);
  1879.     if( rc!=SQLITE_OK ) return rc;
  1880.     rc = sqlite3_step(s);
  1881.     if( rc==SQLITE_DONE ){
  1882.       pReader->eof = 1;
  1883.       return SQLITE_OK;
  1884.     }
  1885.     if( rc!=SQLITE_ROW ) return rc;
  1886.     pReader->pStmt = s;
  1887.     leafReaderInit(sqlite3_column_blob(pReader->pStmt, 0),
  1888.                    sqlite3_column_bytes(pReader->pStmt, 0),
  1889.                    &pReader->leafReader);
  1890.   }
  1891.   return SQLITE_OK;
  1892. }
  1893. /* Step the current leaf forward to the next term.  If we reach the
  1894. ** end of the current leaf, step forward to the next leaf block.
  1895. */
  1896. static int leavesReaderStep(fulltext_vtab *v, LeavesReader *pReader){
  1897.   assert( !leavesReaderAtEnd(pReader) );
  1898.   leafReaderStep(&pReader->leafReader);
  1899.   if( leafReaderAtEnd(&pReader->leafReader) ){
  1900.     int rc;
  1901.     if( pReader->rootData.pData ){
  1902.       pReader->eof = 1;
  1903.       return SQLITE_OK;
  1904.     }
  1905.     rc = sqlite3_step(pReader->pStmt);
  1906.     if( rc!=SQLITE_ROW ){
  1907.       pReader->eof = 1;
  1908.       return rc==SQLITE_DONE ? SQLITE_OK : rc;
  1909.     }
  1910.     leafReaderDestroy(&pReader->leafReader);
  1911.     leafReaderInit(sqlite3_column_blob(pReader->pStmt, 0),
  1912.                    sqlite3_column_bytes(pReader->pStmt, 0),
  1913.                    &pReader->leafReader);
  1914.   }
  1915.   return SQLITE_OK;
  1916. }
  1917. /* Order LeavesReaders by their term, ignoring idx.  Readers at eof
  1918. ** always sort to the end.
  1919. */
  1920. static int leavesReaderTermCmp(LeavesReader *lr1, LeavesReader *lr2){
  1921.   if( leavesReaderAtEnd(lr1) ){
  1922.     if( leavesReaderAtEnd(lr2) ) return 0;
  1923.     return 1;
  1924.   }
  1925.   if( leavesReaderAtEnd(lr2) ) return -1;
  1926.   return leafReaderTermCmp(&lr1->leafReader,
  1927.                            leavesReaderTerm(lr2), leavesReaderTermBytes(lr2),
  1928.                            0);
  1929. }
  1930. /* Similar to leavesReaderTermCmp(), with additional ordering by idx
  1931. ** so that older segments sort before newer segments.
  1932. */
  1933. static int leavesReaderCmp(LeavesReader *lr1, LeavesReader *lr2){
  1934.   int c = leavesReaderTermCmp(lr1, lr2);
  1935.   if( c!=0 ) return c;
  1936.   return lr1->idx-lr2->idx;
  1937. }
  1938. /* Assume that pLr[1]..pLr[nLr] are sorted.  Bubble pLr[0] into its
  1939. ** sorted position.
  1940. */
  1941. static void leavesReaderReorder(LeavesReader *pLr, int nLr){
  1942.   while( nLr>1 && leavesReaderCmp(pLr, pLr+1)>0 ){
  1943.     LeavesReader tmp = pLr[0];
  1944.     pLr[0] = pLr[1];
  1945.     pLr[1] = tmp;
  1946.     nLr--;
  1947.     pLr++;
  1948.   }
  1949. }
  1950. /* Initializes pReaders with the segments from level iLevel, returning
  1951. ** the number of segments in *piReaders.  Leaves pReaders in sorted
  1952. ** order.
  1953. */
  1954. static int leavesReadersInit(fulltext_vtab *v, int iLevel,
  1955.                              LeavesReader *pReaders, int *piReaders){
  1956.   sqlite3_stmt *s;
  1957.   int i, rc = sql_get_statement(v, SEGDIR_SELECT_STMT, &s);
  1958.   if( rc!=SQLITE_OK ) return rc;
  1959.   rc = sqlite3_bind_int(s, 1, iLevel);
  1960.   if( rc!=SQLITE_OK ) return rc;
  1961.   i = 0;
  1962.   while( (rc = sqlite3_step(s))==SQLITE_ROW ){
  1963.     sqlite_int64 iStart = sqlite3_column_int64(s, 0);
  1964.     sqlite_int64 iEnd = sqlite3_column_int64(s, 1);
  1965.     const char *pRootData = sqlite3_column_blob(s, 2);
  1966.     int nRootData = sqlite3_column_bytes(s, 2);
  1967.     assert( i<MERGE_COUNT );
  1968.     rc = leavesReaderInit(v, i, iStart, iEnd, pRootData, nRootData,
  1969.                           &pReaders[i]);
  1970.     if( rc!=SQLITE_OK ) break;
  1971.     i++;
  1972.   }
  1973.   if( rc!=SQLITE_DONE ){
  1974.     while( i-->0 ){
  1975.       leavesReaderDestroy(&pReaders[i]);
  1976.     }
  1977.     return rc;
  1978.   }
  1979.   *piReaders = i;
  1980.   /* Leave our results sorted by term, then age. */
  1981.   while( i-- ){
  1982.     leavesReaderReorder(pReaders+i, *piReaders-i);
  1983.   }
  1984.   return SQLITE_OK;
  1985. }
  1986. /* Merge doclists from pReaders[nReaders] into a single doclist, which
  1987. ** is written to pWriter.  Assumes pReaders is ordered oldest to
  1988. ** newest.
  1989. */
  1990. /* TODO(shess) Consider putting this inline in segmentMerge(). */
  1991. static int leavesReadersMerge(fulltext_vtab *v,
  1992.                               LeavesReader *pReaders, int nReaders,
  1993.                               LeafWriter *pWriter){
  1994.   DLReader dlReaders[MERGE_COUNT];
  1995.   const char *pTerm = leavesReaderTerm(pReaders);
  1996.   int i, nTerm = leavesReaderTermBytes(pReaders);
  1997.   assert( nReaders<=MERGE_COUNT );
  1998.   for(i=0; i<nReaders; i++){
  1999.     dlrInit(&dlReaders[i], DL_DEFAULT,
  2000.             leavesReaderData(pReaders+i),
  2001.             leavesReaderDataBytes(pReaders+i));
  2002.   }
  2003.   return leafWriterStepMerge(v, pWriter, pTerm, nTerm, dlReaders, nReaders);
  2004. }
  2005. /* Forward ref due to mutual recursion with segdirNextIndex(). */
  2006. static int segmentMerge(fulltext_vtab *v, int iLevel);
  2007. /* Put the next available index at iLevel into *pidx.  If iLevel
  2008. ** already has MERGE_COUNT segments, they are merged to a higher
  2009. ** level to make room.
  2010. */
  2011. static int segdirNextIndex(fulltext_vtab *v, int iLevel, int *pidx){
  2012.   int rc = segdir_max_index(v, iLevel, pidx);
  2013.   if( rc==SQLITE_DONE ){              /* No segments at iLevel. */
  2014.     *pidx = 0;
  2015.   }else if( rc==SQLITE_ROW ){
  2016.     if( *pidx==(MERGE_COUNT-1) ){
  2017.       rc = segmentMerge(v, iLevel);
  2018.       if( rc!=SQLITE_OK ) return rc;
  2019.       *pidx = 0;
  2020.     }else{
  2021.       (*pidx)++;
  2022.     }
  2023.   }else{
  2024.     return rc;
  2025.   }
  2026.   return SQLITE_OK;
  2027. }
  2028. /* Merge MERGE_COUNT segments at iLevel into a new segment at
  2029. ** iLevel+1.  If iLevel+1 is already full of segments, those will be
  2030. ** merged to make room.
  2031. */
  2032. static int segmentMerge(fulltext_vtab *v, int iLevel){
  2033.   LeafWriter writer;
  2034.   LeavesReader lrs[MERGE_COUNT];
  2035.   int i, rc, idx = 0;
  2036.   /* Determine the next available segment index at the next level,
  2037.   ** merging as necessary.
  2038.   */
  2039.   rc = segdirNextIndex(v, iLevel+1, &idx);
  2040.   if( rc!=SQLITE_OK ) return rc;
  2041.   /* TODO(shess) This assumes that we'll always see exactly
  2042.   ** MERGE_COUNT segments to merge at a given level.  That will be
  2043.   ** broken if we allow the developer to request preemptive or
  2044.   ** deferred merging.
  2045.   */
  2046.   memset(&lrs, '', sizeof(lrs));
  2047.   rc = leavesReadersInit(v, iLevel, lrs, &i);
  2048.   if( rc!=SQLITE_OK ) return rc;
  2049.   assert( i==MERGE_COUNT );
  2050.   leafWriterInit(iLevel+1, idx, &writer);
  2051.   /* Since leavesReaderReorder() pushes readers at eof to the end,
  2052.   ** when the first reader is empty, all will be empty.
  2053.   */
  2054.   while( !leavesReaderAtEnd(lrs) ){
  2055.     /* Figure out how many readers share their next term. */
  2056.     for(i=1; i<MERGE_COUNT && !leavesReaderAtEnd(lrs+i); i++){
  2057.       if( 0!=leavesReaderTermCmp(lrs, lrs+i) ) break;
  2058.     }
  2059.     rc = leavesReadersMerge(v, lrs, i, &writer);
  2060.     if( rc!=SQLITE_OK ) goto err;
  2061.     /* Step forward those that were merged. */
  2062.     while( i-->0 ){
  2063.       rc = leavesReaderStep(v, lrs+i);
  2064.       if( rc!=SQLITE_OK ) goto err;
  2065.       /* Reorder by term, then by age. */
  2066.       leavesReaderReorder(lrs+i, MERGE_COUNT-i);
  2067.     }
  2068.   }
  2069.   for(i=0; i<MERGE_COUNT; i++){
  2070.     leavesReaderDestroy(&lrs[i]);
  2071.   }
  2072.   rc = leafWriterFinalize(v, &writer);
  2073.   leafWriterDestroy(&writer);
  2074.   if( rc!=SQLITE_OK ) return rc;
  2075.   /* Delete the merged segment data. */
  2076.   return segdir_delete(v, iLevel);
  2077.  err:
  2078.   for(i=0; i<MERGE_COUNT; i++){
  2079.     leavesReaderDestroy(&lrs[i]);
  2080.   }
  2081.   leafWriterDestroy(&writer);
  2082.   return rc;
  2083. }
  2084. /* Accumulate the union of *acc and *pData into *acc. */
  2085. static void docListAccumulateUnion(DataBuffer *acc,
  2086.                                    const char *pData, int nData) {
  2087.   DataBuffer tmp = *acc;
  2088.   dataBufferInit(acc, tmp.nData+nData);
  2089.   docListUnion(tmp.pData, tmp.nData, pData, nData, acc);
  2090.   dataBufferDestroy(&tmp);
  2091. }
  2092. /* TODO(shess) It might be interesting to explore different merge
  2093. ** strategies, here.  For instance, since this is a sorted merge, we
  2094. ** could easily merge many doclists in parallel.  With some
  2095. ** comprehension of the storage format, we could merge all of the
  2096. ** doclists within a leaf node directly from the leaf node's storage.
  2097. ** It may be worthwhile to merge smaller doclists before larger
  2098. ** doclists, since they can be traversed more quickly - but the
  2099. ** results may have less overlap, making them more expensive in a
  2100. ** different way.
  2101. */
  2102. /* Scan pReader for pTerm/nTerm, and merge the term's doclist over
  2103. ** *out (any doclists with duplicate docids overwrite those in *out).
  2104. ** Internal function for loadSegmentLeaf().
  2105. */
  2106. static int loadSegmentLeavesInt(fulltext_vtab *v, LeavesReader *pReader,
  2107.                                 const char *pTerm, int nTerm, int isPrefix,
  2108.                                 DataBuffer *out){
  2109.   /* doclist data is accumulated into pBuffers similar to how one does
  2110.   ** increment in binary arithmetic.  If index 0 is empty, the data is
  2111.   ** stored there.  If there is data there, it is merged and the
  2112.   ** results carried into position 1, with further merge-and-carry
  2113.   ** until an empty position is found.
  2114.   */
  2115.   DataBuffer *pBuffers = NULL;
  2116.   int nBuffers = 0, nMaxBuffers = 0, rc;
  2117.   assert( nTerm>0 );
  2118.   for(rc=SQLITE_OK; rc==SQLITE_OK && !leavesReaderAtEnd(pReader);
  2119.       rc=leavesReaderStep(v, pReader)){
  2120.     /* TODO(shess) Really want leavesReaderTermCmp(), but that name is
  2121.     ** already taken to compare the terms of two LeavesReaders.  Think
  2122.     ** on a better name.  [Meanwhile, break encapsulation rather than
  2123.     ** use a confusing name.]
  2124.     */
  2125.     int c = leafReaderTermCmp(&pReader->leafReader, pTerm, nTerm, isPrefix);
  2126.     if( c>0 ) break;      /* Past any possible matches. */
  2127.     if( c==0 ){
  2128.       const char *pData = leavesReaderData(pReader);
  2129.       int iBuffer, nData = leavesReaderDataBytes(pReader);
  2130.       /* Find the first empty buffer. */
  2131.       for(iBuffer=0; iBuffer<nBuffers; ++iBuffer){
  2132.         if( 0==pBuffers[iBuffer].nData ) break;
  2133.       }
  2134.       /* Out of buffers, add an empty one. */
  2135.       if( iBuffer==nBuffers ){
  2136.         if( nBuffers==nMaxBuffers ){
  2137.           DataBuffer *p;
  2138.           nMaxBuffers += 20;
  2139.           /* Manual realloc so we can handle NULL appropriately. */
  2140.           p = sqlite3_malloc(nMaxBuffers*sizeof(*pBuffers));
  2141.           if( p==NULL ){
  2142.             rc = SQLITE_NOMEM;
  2143.             break;
  2144.           }
  2145.           if( nBuffers>0 ){
  2146.             assert(pBuffers!=NULL);
  2147.             memcpy(p, pBuffers, nBuffers*sizeof(*pBuffers));
  2148.             sqlite3_free(pBuffers);
  2149.           }
  2150.           pBuffers = p;
  2151.         }
  2152.         dataBufferInit(&(pBuffers[nBuffers]), 0);
  2153.         nBuffers++;
  2154.       }
  2155.       /* At this point, must have an empty at iBuffer. */
  2156.       assert(iBuffer<nBuffers && pBuffers[iBuffer].nData==0);
  2157.       /* If empty was first buffer, no need for merge logic. */
  2158.       if( iBuffer==0 ){
  2159.         dataBufferReplace(&(pBuffers[0]), pData, nData);
  2160.       }else{
  2161.         /* pAcc is the empty buffer the merged data will end up in. */
  2162.         DataBuffer *pAcc = &(pBuffers[iBuffer]);
  2163.         DataBuffer *p = &(pBuffers[0]);
  2164.         /* Handle position 0 specially to avoid need to prime pAcc
  2165.         ** with pData/nData.
  2166.         */
  2167.         dataBufferSwap(p, pAcc);
  2168.         docListAccumulateUnion(pAcc, pData, nData);
  2169.         /* Accumulate remaining doclists into pAcc. */
  2170.         for(++p; p<pAcc; ++p){
  2171.           docListAccumulateUnion(pAcc, p->pData, p->nData);
  2172.           /* dataBufferReset() could allow a large doclist to blow up
  2173.           ** our memory requirements.
  2174.           */
  2175.           if( p->nCapacity<1024 ){
  2176.             dataBufferReset(p);
  2177.           }else{
  2178.             dataBufferDestroy(p);
  2179.             dataBufferInit(p, 0);
  2180.           }
  2181.         }
  2182.       }
  2183.     }
  2184.   }
  2185.   /* Union all the doclists together into *out. */
  2186.   /* TODO(shess) What if *out is big?  Sigh. */
  2187.   if( rc==SQLITE_OK && nBuffers>0 ){
  2188.     int iBuffer;
  2189.     for(iBuffer=0; iBuffer<nBuffers; ++iBuffer){
  2190.       if( pBuffers[iBuffer].nData>0 ){
  2191.         if( out->nData==0 ){
  2192.           dataBufferSwap(out, &(pBuffers[iBuffer]));
  2193.         }else{
  2194.           docListAccumulateUnion(out, pBuffers[iBuffer].pData,
  2195.                                  pBuffers[iBuffer].nData);
  2196.         }
  2197.       }
  2198.     }
  2199.   }
  2200.   while( nBuffers-- ){
  2201.     dataBufferDestroy(&(pBuffers[nBuffers]));
  2202.   }
  2203.   if( pBuffers!=NULL ) sqlite3_free(pBuffers);
  2204.   return rc;
  2205. }
  2206. /* Call loadSegmentLeavesInt() with pData/nData as input. */
  2207. static int loadSegmentLeaf(fulltext_vtab *v, const char *pData, int nData,
  2208.                            const char *pTerm, int nTerm, int isPrefix,
  2209.                            DataBuffer *out){
  2210.   LeavesReader reader;
  2211.   int rc;
  2212.   assert( nData>1 );
  2213.   assert( *pData=='' );
  2214.   rc = leavesReaderInit(v, 0, 0, 0, pData, nData, &reader);
  2215.   if( rc!=SQLITE_OK ) return rc;
  2216.   rc = loadSegmentLeavesInt(v, &reader, pTerm, nTerm, isPrefix, out);
  2217.   leavesReaderReset(&reader);
  2218.   leavesReaderDestroy(&reader);
  2219.   return rc;
  2220. }
  2221. /* Call loadSegmentLeavesInt() with the leaf nodes from iStartLeaf to
  2222. ** iEndLeaf (inclusive) as input, and merge the resulting doclist into
  2223. ** out.
  2224. */
  2225. static int loadSegmentLeaves(fulltext_vtab *v,
  2226.                              sqlite_int64 iStartLeaf, sqlite_int64 iEndLeaf,
  2227.                              const char *pTerm, int nTerm, int isPrefix,
  2228.                              DataBuffer *out){
  2229.   int rc;
  2230.   LeavesReader reader;
  2231.   assert( iStartLeaf<=iEndLeaf );
  2232.   rc = leavesReaderInit(v, 0, iStartLeaf, iEndLeaf, NULL, 0, &reader);
  2233.   if( rc!=SQLITE_OK ) return rc;
  2234.   rc = loadSegmentLeavesInt(v, &reader, pTerm, nTerm, isPrefix, out);
  2235.   leavesReaderReset(&reader);
  2236.   leavesReaderDestroy(&reader);
  2237.   return rc;
  2238. }
  2239. /* Taking pData/nData as an interior node, find the sequence of child
  2240. ** nodes which could include pTerm/nTerm/isPrefix.  Note that the
  2241. ** interior node terms logically come between the blocks, so there is
  2242. ** one more blockid than there are terms (that block contains terms >=
  2243. ** the last interior-node term).
  2244. */
  2245. /* TODO(shess) The calling code may already know that the end child is
  2246. ** not worth calculating, because the end may be in a later sibling
  2247. ** node.  Consider whether breaking symmetry is worthwhile.  I suspect
  2248. ** it is not worthwhile.
  2249. */
  2250. static void getChildrenContaining(const char *pData, int nData,
  2251.                                   const char *pTerm, int nTerm, int isPrefix,
  2252.                                   sqlite_int64 *piStartChild,
  2253.                                   sqlite_int64 *piEndChild){
  2254.   InteriorReader reader;
  2255.   assert( nData>1 );
  2256.   assert( *pData!='' );
  2257.   interiorReaderInit(pData, nData, &reader);
  2258.   /* Scan for the first child which could contain pTerm/nTerm. */
  2259.   while( !interiorReaderAtEnd(&reader) ){
  2260.     if( interiorReaderTermCmp(&reader, pTerm, nTerm, 0)>0 ) break;
  2261.     interiorReaderStep(&reader);
  2262.   }
  2263.   *piStartChild = interiorReaderCurrentBlockid(&reader);
  2264.   /* Keep scanning to find a term greater than our term, using prefix
  2265.   ** comparison if indicated.  If isPrefix is false, this will be the
  2266.   ** same blockid as the starting block.
  2267.   */
  2268.   while( !interiorReaderAtEnd(&reader) ){
  2269.     if( interiorReaderTermCmp(&reader, pTerm, nTerm, isPrefix)>0 ) break;
  2270.     interiorReaderStep(&reader);
  2271.   }
  2272.   *piEndChild = interiorReaderCurrentBlockid(&reader);
  2273.   interiorReaderDestroy(&reader);
  2274.   /* Children must ascend, and if !prefix, both must be the same. */
  2275.   assert( *piEndChild>=*piStartChild );
  2276.   assert( isPrefix || *piStartChild==*piEndChild );
  2277. }
  2278. /* Read block at iBlockid and pass it with other params to
  2279. ** getChildrenContaining().
  2280. */
  2281. static int loadAndGetChildrenContaining(
  2282.   fulltext_vtab *v,
  2283.   sqlite_int64 iBlockid,
  2284.   const char *pTerm, int nTerm, int isPrefix,
  2285.   sqlite_int64 *piStartChild, sqlite_int64 *piEndChild
  2286. ){
  2287.   sqlite3_stmt *s = NULL;
  2288.   int rc;
  2289.   assert( iBlockid!=0 );
  2290.   assert( pTerm!=NULL );
  2291.   assert( nTerm!=0 );        /* TODO(shess) Why not allow this? */
  2292.   assert( piStartChild!=NULL );
  2293.   assert( piEndChild!=NULL );
  2294.   rc = sql_get_statement(v, BLOCK_SELECT_STMT, &s);
  2295.   if( rc!=SQLITE_OK ) return rc;
  2296.   rc = sqlite3_bind_int64(s, 1, iBlockid);
  2297.   if( rc!=SQLITE_OK ) return rc;
  2298.   rc = sqlite3_step(s);
  2299.   if( rc==SQLITE_DONE ) return SQLITE_ERROR;
  2300.   if( rc!=SQLITE_ROW ) return rc;
  2301.   getChildrenContaining(sqlite3_column_blob(s, 0), sqlite3_column_bytes(s, 0),
  2302.                         pTerm, nTerm, isPrefix, piStartChild, piEndChild);
  2303.   /* We expect only one row.  We must execute another sqlite3_step()
  2304.    * to complete the iteration; otherwise the table will remain
  2305.    * locked. */
  2306.   rc = sqlite3_step(s);
  2307.   if( rc==SQLITE_ROW ) return SQLITE_ERROR;
  2308.   if( rc!=SQLITE_DONE ) return rc;
  2309.   return SQLITE_OK;
  2310. }
  2311. /* Traverse the tree represented by pData[nData] looking for
  2312. ** pTerm[nTerm], placing its doclist into *out.  This is internal to
  2313. ** loadSegment() to make error-handling cleaner.
  2314. */
  2315. static int loadSegmentInt(fulltext_vtab *v, const char *pData, int nData,
  2316.                           sqlite_int64 iLeavesEnd,
  2317.                           const char *pTerm, int nTerm, int isPrefix,
  2318.                           DataBuffer *out){
  2319.   /* Special case where root is a leaf. */
  2320.   if( *pData=='' ){
  2321.     return loadSegmentLeaf(v, pData, nData, pTerm, nTerm, isPrefix, out);
  2322.   }else{
  2323.     int rc;
  2324.     sqlite_int64 iStartChild, iEndChild;
  2325.     /* Process pData as an interior node, then loop down the tree
  2326.     ** until we find the set of leaf nodes to scan for the term.
  2327.     */
  2328.     getChildrenContaining(pData, nData, pTerm, nTerm, isPrefix,
  2329.                           &iStartChild, &iEndChild);
  2330.     while( iStartChild>iLeavesEnd ){
  2331.       sqlite_int64 iNextStart, iNextEnd;
  2332.       rc = loadAndGetChildrenContaining(v, iStartChild, pTerm, nTerm, isPrefix,
  2333.                                         &iNextStart, &iNextEnd);
  2334.       if( rc!=SQLITE_OK ) return rc;
  2335.       /* If we've branched, follow the end branch, too. */
  2336.       if( iStartChild!=iEndChild ){
  2337.         sqlite_int64 iDummy;
  2338.         rc = loadAndGetChildrenContaining(v, iEndChild, pTerm, nTerm, isPrefix,
  2339.                                           &iDummy, &iNextEnd);
  2340.         if( rc!=SQLITE_OK ) return rc;
  2341.       }
  2342.       assert( iNextStart<=iNextEnd );
  2343.       iStartChild = iNextStart;
  2344.       iEndChild = iNextEnd;
  2345.     }
  2346.     assert( iStartChild<=iLeavesEnd );
  2347.     assert( iEndChild<=iLeavesEnd );
  2348.     /* Scan through the leaf segments for doclists. */
  2349.     return loadSegmentLeaves(v, iStartChild, iEndChild,
  2350.                              pTerm, nTerm, isPrefix, out);
  2351.   }
  2352. }
  2353. /* Call loadSegmentInt() to collect the doclist for pTerm/nTerm, then
  2354. ** merge its doclist over *out (any duplicate doclists read from the
  2355. ** segment rooted at pData will overwrite those in *out).
  2356. */
  2357. /* TODO(shess) Consider changing this to determine the depth of the
  2358. ** leaves using either the first characters of interior nodes (when
  2359. ** ==1, we're one level above the leaves), or the first character of
  2360. ** the root (which will describe the height of the tree directly).
  2361. ** Either feels somewhat tricky to me.
  2362. */
  2363. /* TODO(shess) The current merge is likely to be slow for large
  2364. ** doclists (though it should process from newest/smallest to
  2365. ** oldest/largest, so it may not be that bad).  It might be useful to
  2366. ** modify things to allow for N-way merging.  This could either be
  2367. ** within a segment, with pairwise merges across segments, or across
  2368. ** all segments at once.
  2369. */
  2370. static int loadSegment(fulltext_vtab *v, const char *pData, int nData,
  2371.                        sqlite_int64 iLeavesEnd,
  2372.                        const char *pTerm, int nTerm, int isPrefix,
  2373.                        DataBuffer *out){
  2374.   DataBuffer result;
  2375.   int rc;
  2376.   assert( nData>1 );
  2377.   /* This code should never be called with buffered updates. */
  2378.   assert( v->nPendingData<0 );
  2379.   dataBufferInit(&result, 0);
  2380.   rc = loadSegmentInt(v, pData, nData, iLeavesEnd,
  2381.                       pTerm, nTerm, isPrefix, &result);
  2382.   if( rc==SQLITE_OK && result.nData>0 ){
  2383.     if( out->nData==0 ){
  2384.       DataBuffer tmp = *out;
  2385.       *out = result;
  2386.       result = tmp;
  2387.     }else{
  2388.       DataBuffer merged;
  2389.       DLReader readers[2];
  2390.       dlrInit(&readers[0], DL_DEFAULT, out->pData, out->nData);
  2391.       dlrInit(&readers[1], DL_DEFAULT, result.pData, result.nData);
  2392.       dataBufferInit(&merged, out->nData+result.nData);
  2393.       docListMerge(&merged, readers, 2);
  2394.       dataBufferDestroy(out);
  2395.       *out = merged;
  2396.       dlrDestroy(&readers[0]);
  2397.       dlrDestroy(&readers[1]);
  2398.     }
  2399.   }
  2400.   dataBufferDestroy(&result);
  2401.   return rc;
  2402. }
  2403. /* Scan the database and merge together the posting lists for the term
  2404. ** into *out.
  2405. */
  2406. static int termSelect(fulltext_vtab *v, int iColumn,
  2407.                       const char *pTerm, int nTerm, int isPrefix,
  2408.                       DocListType iType, DataBuffer *out){
  2409.   DataBuffer doclist;
  2410.   sqlite3_stmt *s;
  2411.   int rc = sql_get_statement(v, SEGDIR_SELECT_ALL_STMT, &s);
  2412.   if( rc!=SQLITE_OK ) return rc;
  2413.   /* This code should never be called with buffered updates. */
  2414.   assert( v->nPendingData<0 );
  2415.   dataBufferInit(&doclist, 0);
  2416.   /* Traverse the segments from oldest to newest so that newer doclist
  2417.   ** elements for given docids overwrite older elements.
  2418.   */
  2419.   while( (rc = sqlite3_step(s))==SQLITE_ROW ){
  2420.     const char *pData = sqlite3_column_blob(s, 0);
  2421.     const int nData = sqlite3_column_bytes(s, 0);
  2422.     const sqlite_int64 iLeavesEnd = sqlite3_column_int64(s, 1);
  2423.     rc = loadSegment(v, pData, nData, iLeavesEnd, pTerm, nTerm, isPrefix,
  2424.                      &doclist);
  2425.     if( rc!=SQLITE_OK ) goto err;
  2426.   }
  2427.   if( rc==SQLITE_DONE ){
  2428.     if( doclist.nData!=0 ){
  2429.       /* TODO(shess) The old term_select_all() code applied the column
  2430.       ** restrict as we merged segments, leading to smaller buffers.
  2431.       ** This is probably worthwhile to bring back, once the new storage
  2432.       ** system is checked in.
  2433.       */
  2434.       if( iColumn==v->nColumn) iColumn = -1;
  2435.       docListTrim(DL_DEFAULT, doclist.pData, doclist.nData,
  2436.                   iColumn, iType, out);
  2437.     }
  2438.     rc = SQLITE_OK;
  2439.   }
  2440.  err:
  2441.   dataBufferDestroy(&doclist);
  2442.   return rc;
  2443. }
  2444. /****************************************************************/
  2445. /* Used to hold hashtable data for sorting. */
  2446. typedef struct TermData {
  2447.   const char *pTerm;
  2448.   int nTerm;
  2449.   DLCollector *pCollector;
  2450. } TermData;
  2451. /* Orders TermData elements in strcmp fashion ( <0 for less-than, 0
  2452. ** for equal, >0 for greater-than).
  2453. */
  2454. static int termDataCmp(const void *av, const void *bv){
  2455.   const TermData *a = (const TermData *)av;
  2456.   const TermData *b = (const TermData *)bv;
  2457.   int n = a->nTerm<b->nTerm ? a->nTerm : b->nTerm;
  2458.   int c = memcmp(a->pTerm, b->pTerm, n);
  2459.   if( c!=0 ) return c;
  2460.   return a->nTerm-b->nTerm;
  2461. }
  2462. /* Order pTerms data by term, then write a new level 0 segment using
  2463. ** LeafWriter.
  2464. */
  2465. static int writeZeroSegment(fulltext_vtab *v, fts3Hash *pTerms){
  2466.   fts3HashElem *e;
  2467.   int idx, rc, i, n;
  2468.   TermData *pData;
  2469.   LeafWriter writer;
  2470.   DataBuffer dl;
  2471.   /* Determine the next index at level 0, merging as necessary. */
  2472.   rc = segdirNextIndex(v, 0, &idx);
  2473.   if( rc!=SQLITE_OK ) return rc;
  2474.   n = fts3HashCount(pTerms);
  2475.   pData = sqlite3_malloc(n*sizeof(TermData));
  2476.   for(i = 0, e = fts3HashFirst(pTerms); e; i++, e = fts3HashNext(e)){
  2477.     assert( i<n );
  2478.     pData[i].pTerm = fts3HashKey(e);
  2479.     pData[i].nTerm = fts3HashKeysize(e);
  2480.     pData[i].pCollector = fts3HashData(e);
  2481.   }
  2482.   assert( i==n );
  2483.   /* TODO(shess) Should we allow user-defined collation sequences,
  2484.   ** here?  I think we only need that once we support prefix searches.
  2485.   */
  2486.   if( n>1 ) qsort(pData, n, sizeof(*pData), termDataCmp);
  2487.   /* TODO(shess) Refactor so that we can write directly to the segment
  2488.   ** DataBuffer, as happens for segment merges.
  2489.   */
  2490.   leafWriterInit(0, idx, &writer);
  2491.   dataBufferInit(&dl, 0);
  2492.   for(i=0; i<n; i++){
  2493.     dataBufferReset(&dl);
  2494.     dlcAddDoclist(pData[i].pCollector, &dl);
  2495.     rc = leafWriterStep(v, &writer,
  2496.                         pData[i].pTerm, pData[i].nTerm, dl.pData, dl.nData);
  2497.     if( rc!=SQLITE_OK ) goto err;
  2498.   }
  2499.   rc = leafWriterFinalize(v, &writer);
  2500.  err:
  2501.   dataBufferDestroy(&dl);
  2502.   sqlite3_free(pData);
  2503.   leafWriterDestroy(&writer);
  2504.   return rc;
  2505. }
  2506. /* If pendingTerms has data, free it. */
  2507. static int clearPendingTerms(fulltext_vtab *v){
  2508.   if( v->nPendingData>=0 ){
  2509.     fts3HashElem *e;
  2510.     for(e=fts3HashFirst(&v->pendingTerms); e; e=fts3HashNext(e)){
  2511.       dlcDelete(fts3HashData(e));
  2512.     }
  2513.     fts3HashClear(&v->pendingTerms);
  2514.     v->nPendingData = -1;
  2515.   }
  2516.   return SQLITE_OK;
  2517. }
  2518. /* If pendingTerms has data, flush it to a level-zero segment, and
  2519. ** free it.
  2520. */
  2521. static int flushPendingTerms(fulltext_vtab *v){
  2522.   if( v->nPendingData>=0 ){
  2523.     int rc = writeZeroSegment(v, &v->pendingTerms);
  2524.     if( rc==SQLITE_OK ) clearPendingTerms(v);
  2525.     return rc;
  2526.   }
  2527.   return SQLITE_OK;
  2528. }
  2529. /* If pendingTerms is "too big", or docid is out of order, flush it.
  2530. ** Regardless, be certain that pendingTerms is initialized for use.
  2531. */
  2532. static int initPendingTerms(fulltext_vtab *v, sqlite_int64 iDocid){
  2533.   /* TODO(shess) Explore whether partially flushing the buffer on
  2534.   ** forced-flush would provide better performance.  I suspect that if
  2535.   ** we ordered the doclists by size and flushed the largest until the
  2536.   ** buffer was half empty, that would let the less frequent terms
  2537.   ** generate longer doclists.
  2538.   */
  2539.   if( iDocid<=v->iPrevDocid || v->nPendingData>kPendingThreshold ){
  2540.     int rc = flushPendingTerms(v);
  2541.     if( rc!=SQLITE_OK ) return rc;
  2542.   }
  2543.   if( v->nPendingData<0 ){
  2544.     fts3HashInit(&v->pendingTerms, FTS3_HASH_STRING, 1);
  2545.     v->nPendingData = 0;
  2546.   }
  2547.   v->iPrevDocid = iDocid;
  2548.   return SQLITE_OK;
  2549. }
  2550. /* This function implements the xUpdate callback; it is the top-level entry
  2551.  * point for inserting, deleting or updating a row in a full-text table. */
  2552. static int fulltextUpdate(sqlite3_vtab *pVtab, int nArg, sqlite3_value **ppArg,
  2553.                           sqlite_int64 *pRowid){
  2554.   fulltext_vtab *v = (fulltext_vtab *) pVtab;
  2555.   int rc;
  2556.   FTSTRACE(("FTS3 Update %pn", pVtab));
  2557.   if( nArg<2 ){
  2558.     rc = index_delete(v, sqlite3_value_int64(ppArg[0]));
  2559.   } else if( sqlite3_value_type(ppArg[0]) != SQLITE_NULL ){
  2560.     /* An update:
  2561.      * ppArg[0] = old rowid
  2562.      * ppArg[1] = new rowid
  2563.      * ppArg[2..2+v->nColumn-1] = values
  2564.      * ppArg[2+v->nColumn] = value for magic column (we ignore this)
  2565.      * ppArg[2+v->nColumn+1] = value for docid
  2566.      */
  2567.     sqlite_int64 rowid = sqlite3_value_int64(ppArg[0]);
  2568.     if( sqlite3_value_type(ppArg[1]) != SQLITE_INTEGER ||
  2569.         sqlite3_value_int64(ppArg[1]) != rowid ){
  2570.       rc = SQLITE_ERROR;  /* we don't allow changing the rowid */
  2571.     }else if( sqlite3_value_type(ppArg[2+v->nColumn+1]) != SQLITE_INTEGER ||
  2572.               sqlite3_value_int64(ppArg[2+v->nColumn+1]) != rowid ){
  2573.       rc = SQLITE_ERROR;  /* we don't allow changing the docid */
  2574.     }else{
  2575.       assert( nArg==2+v->nColumn+2);
  2576.       rc = index_update(v, rowid, &ppArg[2]);
  2577.     }
  2578.   } else {
  2579.     /* An insert:
  2580.      * ppArg[1] = requested rowid
  2581.      * ppArg[2..2+v->nColumn-1] = values
  2582.      * ppArg[2+v->nColumn] = value for magic column (we ignore this)
  2583.      * ppArg[2+v->nColumn+1] = value for docid
  2584.      */
  2585.     sqlite3_value *pRequestDocid = ppArg[2+v->nColumn+1];
  2586.     assert( nArg==2+v->nColumn+2);
  2587.     if( SQLITE_NULL != sqlite3_value_type(pRequestDocid) &&
  2588.         SQLITE_NULL != sqlite3_value_type(ppArg[1]) ){
  2589.       /* TODO(shess) Consider allowing this to work if the values are
  2590.       ** identical.  I'm inclined to discourage that usage, though,
  2591.       ** given that both rowid and docid are special columns.  Better
  2592.       ** would be to define one or the other as the default winner,
  2593.       ** but should it be fts3-centric (docid) or SQLite-centric
  2594.       ** (rowid)?
  2595.       */
  2596.       rc = SQLITE_ERROR;
  2597.     }else{
  2598.       if( SQLITE_NULL == sqlite3_value_type(pRequestDocid) ){
  2599.         pRequestDocid = ppArg[1];
  2600.       }
  2601.       rc = index_insert(v, pRequestDocid, &ppArg[2], pRowid);
  2602.     }
  2603.   }
  2604.   return rc;
  2605. }
  2606. static int fulltextSync(sqlite3_vtab *pVtab){
  2607.   FTSTRACE(("FTS3 xSync()n"));
  2608.   return flushPendingTerms((fulltext_vtab *)pVtab);
  2609. }
  2610. static int fulltextBegin(sqlite3_vtab *pVtab){
  2611.   fulltext_vtab *v = (fulltext_vtab *) pVtab;
  2612.   FTSTRACE(("FTS3 xBegin()n"));
  2613.   /* Any buffered updates should have been cleared by the previous
  2614.   ** transaction.
  2615.   */
  2616.   assert( v->nPendingData<0 );
  2617.   return clearPendingTerms(v);
  2618. }
  2619. static int fulltextCommit(sqlite3_vtab *pVtab){
  2620.   fulltext_vtab *v = (fulltext_vtab *) pVtab;
  2621.   FTSTRACE(("FTS3 xCommit()n"));
  2622.   /* Buffered updates should have been cleared by fulltextSync(). */
  2623.   assert( v->nPendingData<0 );
  2624.   return clearPendingTerms(v);
  2625. }
  2626. static int fulltextRollback(sqlite3_vtab *pVtab){
  2627.   FTSTRACE(("FTS3 xRollback()n"));
  2628.   return clearPendingTerms((fulltext_vtab *)pVtab);
  2629. }
  2630. /*
  2631. ** Implementation of the snippet() function for FTS3
  2632. */
  2633. static void snippetFunc(
  2634.   sqlite3_context *pContext,
  2635.   int argc,
  2636.   sqlite3_value **argv
  2637. ){
  2638.   fulltext_cursor *pCursor;
  2639.   if( argc<1 ) return;
  2640.   if( sqlite3_value_type(argv[0])!=SQLITE_BLOB ||
  2641.       sqlite3_value_bytes(argv[0])!=sizeof(pCursor) ){
  2642.     sqlite3_result_error(pContext, "illegal first argument to html_snippet",-1);
  2643.   }else{
  2644.     const char *zStart = "<b>";
  2645.     const char *zEnd = "</b>";
  2646.     const char *zEllipsis = "<b>...</b>";
  2647.     memcpy(&pCursor, sqlite3_value_blob(argv[0]), sizeof(pCursor));
  2648.     if( argc>=2 ){
  2649.       zStart = (const char*)sqlite3_value_text(argv[1]);
  2650.       if( argc>=3 ){
  2651.         zEnd = (const char*)sqlite3_value_text(argv[2]);
  2652.         if( argc>=4 ){
  2653.           zEllipsis = (const char*)sqlite3_value_text(argv[3]);
  2654.         }
  2655.       }
  2656.     }
  2657.     snippetAllOffsets(pCursor);
  2658.     snippetText(pCursor, zStart, zEnd, zEllipsis);
  2659.     sqlite3_result_text(pContext, pCursor->snippet.zSnippet,
  2660.                         pCursor->snippet.nSnippet, SQLITE_STATIC);
  2661.   }
  2662. }
  2663. /*
  2664. ** Implementation of the offsets() function for FTS3
  2665. */
  2666. static void snippetOffsetsFunc(
  2667.   sqlite3_context *pContext,
  2668.   int argc,
  2669.   sqlite3_value **argv
  2670. ){
  2671.   fulltext_cursor *pCursor;
  2672.   if( argc<1 ) return;
  2673.   if( sqlite3_value_type(argv[0])!=SQLITE_BLOB ||
  2674.       sqlite3_value_bytes(argv[0])!=sizeof(pCursor) ){
  2675.     sqlite3_result_error(pContext, "illegal first argument to offsets",-1);
  2676.   }else{
  2677.     memcpy(&pCursor, sqlite3_value_blob(argv[0]), sizeof(pCursor));
  2678.     snippetAllOffsets(pCursor);
  2679.     snippetOffsetText(&pCursor->snippet);
  2680.     sqlite3_result_text(pContext,
  2681.                         pCursor->snippet.zOffset, pCursor->snippet.nOffset,
  2682.                         SQLITE_STATIC);
  2683.   }
  2684. }
  2685. /*
  2686. ** This routine implements the xFindFunction method for the FTS3
  2687. ** virtual table.
  2688. */
  2689. static int fulltextFindFunction(
  2690.   sqlite3_vtab *pVtab,
  2691.   int nArg,
  2692.   const char *zName,
  2693.   void (**pxFunc)(sqlite3_context*,int,sqlite3_value**),
  2694.   void **ppArg
  2695. ){
  2696.   if( strcmp(zName,"snippet")==0 ){
  2697.     *pxFunc = snippetFunc;
  2698.     return 1;
  2699.   }else if( strcmp(zName,"offsets")==0 ){
  2700.     *pxFunc = snippetOffsetsFunc;
  2701.     return 1;
  2702.   }
  2703.   return 0;
  2704. }
  2705. /*
  2706. ** Rename an fts3 table.
  2707. */
  2708. static int fulltextRename(
  2709.   sqlite3_vtab *pVtab,
  2710.   const char *zName
  2711. ){
  2712.   fulltext_vtab *p = (fulltext_vtab *)pVtab;
  2713.   int rc = SQLITE_NOMEM;
  2714.   char *zSql = sqlite3_mprintf(
  2715.     "ALTER TABLE %Q.'%q_content'  RENAME TO '%q_content';"
  2716.     "ALTER TABLE %Q.'%q_segments' RENAME TO '%q_segments';"
  2717.     "ALTER TABLE %Q.'%q_segdir'   RENAME TO '%q_segdir';"
  2718.     , p->zDb, p->zName, zName 
  2719.     , p->zDb, p->zName, zName 
  2720.     , p->zDb, p->zName, zName
  2721.   );
  2722.   if( zSql ){
  2723.     rc = sqlite3_exec(p->db, zSql, 0, 0, 0);
  2724.     sqlite3_free(zSql);
  2725.   }
  2726.   return rc;
  2727. }
  2728. static const sqlite3_module fts3Module = {
  2729.   /* iVersion      */ 0,
  2730.   /* xCreate       */ fulltextCreate,
  2731.   /* xConnect      */ fulltextConnect,
  2732.   /* xBestIndex    */ fulltextBestIndex,
  2733.   /* xDisconnect   */ fulltextDisconnect,
  2734.   /* xDestroy      */ fulltextDestroy,
  2735.   /* xOpen         */ fulltextOpen,
  2736.   /* xClose        */ fulltextClose,
  2737.   /* xFilter       */ fulltextFilter,
  2738.   /* xNext         */ fulltextNext,
  2739.   /* xEof          */ fulltextEof,
  2740.   /* xColumn       */ fulltextColumn,
  2741.   /* xRowid        */ fulltextRowid,
  2742.   /* xUpdate       */ fulltextUpdate,
  2743.   /* xBegin        */ fulltextBegin,
  2744.   /* xSync         */ fulltextSync,
  2745.   /* xCommit       */ fulltextCommit,
  2746.   /* xRollback     */ fulltextRollback,
  2747.   /* xFindFunction */ fulltextFindFunction,
  2748.   /* xRename */       fulltextRename,
  2749. };
  2750. static void hashDestroy(void *p){
  2751.   fts3Hash *pHash = (fts3Hash *)p;
  2752.   sqlite3Fts3HashClear(pHash);
  2753.   sqlite3_free(pHash);
  2754. }
  2755. /*
  2756. ** The fts3 built-in tokenizers - "simple" and "porter" - are implemented
  2757. ** in files fts3_tokenizer1.c and fts3_porter.c respectively. The following
  2758. ** two forward declarations are for functions declared in these files
  2759. ** used to retrieve the respective implementations.
  2760. **
  2761. ** Calling sqlite3Fts3SimpleTokenizerModule() sets the value pointed
  2762. ** to by the argument to point a the "simple" tokenizer implementation.
  2763. ** Function ...PorterTokenizerModule() sets *pModule to point to the
  2764. ** porter tokenizer/stemmer implementation.
  2765. */
  2766. void sqlite3Fts3SimpleTokenizerModule(sqlite3_tokenizer_module const**ppModule);
  2767. void sqlite3Fts3PorterTokenizerModule(sqlite3_tokenizer_module const**ppModule);
  2768. void sqlite3Fts3IcuTokenizerModule(sqlite3_tokenizer_module const**ppModule);
  2769. int sqlite3Fts3InitHashTable(sqlite3 *, fts3Hash *, const char *);
  2770. /*
  2771. ** Initialise the fts3 extension. If this extension is built as part
  2772. ** of the sqlite library, then this function is called directly by
  2773. ** SQLite. If fts3 is built as a dynamically loadable extension, this
  2774. ** function is called by the sqlite3_extension_init() entry point.
  2775. */
  2776. int sqlite3Fts3Init(sqlite3 *db){
  2777.   int rc = SQLITE_OK;
  2778.   fts3Hash *pHash = 0;
  2779.   const sqlite3_tokenizer_module *pSimple = 0;
  2780.   const sqlite3_tokenizer_module *pPorter = 0;
  2781.   const sqlite3_tokenizer_module *pIcu = 0;
  2782.   sqlite3Fts3SimpleTokenizerModule(&pSimple);
  2783.   sqlite3Fts3PorterTokenizerModule(&pPorter);
  2784. #ifdef SQLITE_ENABLE_ICU
  2785.   sqlite3Fts3IcuTokenizerModule(&pIcu);
  2786. #endif
  2787.   /* Allocate and initialise the hash-table used to store tokenizers. */
  2788.   pHash = sqlite3_malloc(sizeof(fts3Hash));
  2789.   if( !pHash ){
  2790.     rc = SQLITE_NOMEM;
  2791.   }else{
  2792.     sqlite3Fts3HashInit(pHash, FTS3_HASH_STRING, 1);
  2793.   }
  2794.   /* Load the built-in tokenizers into the hash table */
  2795.   if( rc==SQLITE_OK ){
  2796.     if( sqlite3Fts3HashInsert(pHash, "simple", 7, (void *)pSimple)
  2797.      || sqlite3Fts3HashInsert(pHash, "porter", 7, (void *)pPorter) 
  2798.      || (pIcu && sqlite3Fts3HashInsert(pHash, "icu", 4, (void *)pIcu))
  2799.     ){
  2800.       rc = SQLITE_NOMEM;
  2801.     }
  2802.   }
  2803.   /* Create the virtual table wrapper around the hash-table and overload 
  2804.   ** the two scalar functions. If this is successful, register the
  2805.   ** module with sqlite.
  2806.   */
  2807.   if( SQLITE_OK==rc 
  2808.    && SQLITE_OK==(rc = sqlite3Fts3InitHashTable(db, pHash, "fts3_tokenizer"))
  2809.    && SQLITE_OK==(rc = sqlite3_overload_function(db, "snippet", -1))
  2810.    && SQLITE_OK==(rc = sqlite3_overload_function(db, "offsets", -1))
  2811.   ){
  2812.     return sqlite3_create_module_v2(
  2813.         db, "fts3", &fts3Module, (void *)pHash, hashDestroy
  2814.     );
  2815.   }
  2816.   /* An error has occured. Delete the hash table and return the error code. */
  2817.   assert( rc!=SQLITE_OK );
  2818.   if( pHash ){
  2819.     sqlite3Fts3HashClear(pHash);
  2820.     sqlite3_free(pHash);
  2821.   }
  2822.   return rc;
  2823. }
  2824. #if !SQLITE_CORE
  2825. int sqlite3_extension_init(
  2826.   sqlite3 *db, 
  2827.   char **pzErrMsg,
  2828.   const sqlite3_api_routines *pApi
  2829. ){
  2830.   SQLITE_EXTENSION_INIT2(pApi)
  2831.   return sqlite3Fts3Init(db);
  2832. }
  2833. #endif
  2834. #endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3) */