return rc;
}
-/* Read pData[nData] as a leaf node, and if the doclist for
-** pTerm[nTerm] is present, merge it over *out (any duplicate doclists
-** read from pData will overwrite those in *out).
+/* Scan pReader for pTerm/nTerm, and merge the term's doclist over
+** *out (any doclists with duplicate docids overwrite those in *out).
+** Internal function for loadSegmentLeaf().
*/
-static int loadSegmentLeaf(fulltext_vtab *v, const char *pData, int nData,
- const char *pTerm, int nTerm, DataBuffer *out){
- LeafReader reader;
- assert( nData>1 );
- assert( *pData=='\0' );
-
- /* This code should never be called with buffered updates. */
- assert( v->nPendingData<0 );
+static int loadSegmentLeavesInt(fulltext_vtab *v, LeavesReader *pReader,
+ const char *pTerm, int nTerm, DataBuffer *out){
+ assert( nTerm>0 );
- leafReaderInit(pData, nData, &reader);
- while( !leafReaderAtEnd(&reader) ){
- int c = leafReaderTermCmp(&reader, pTerm, nTerm);
+ /* Process while the prefix matches. */
+ while( !leavesReaderAtEnd(pReader) ){
+ /* TODO(shess) Really want leavesReaderTermCmp(), but that name is
+ ** already taken to compare the terms of two LeavesReaders. Think
+ ** on a better name. [Meanwhile, break encapsulation rather than
+ ** use a confusing name.]
+ */
+ int rc, c = leafReaderTermCmp(&pReader->leafReader, pTerm, nTerm);
if( c==0 ){
+ const char *pData = leavesReaderData(pReader);
+ int nData = leavesReaderDataBytes(pReader);
if( out->nData==0 ){
- dataBufferReplace(out,
- leafReaderData(&reader), leafReaderDataBytes(&reader));
+ dataBufferReplace(out, pData, nData);
}else{
DLReader readers[2];
DataBuffer result;
dlrInit(&readers[0], DL_DEFAULT, out->pData, out->nData);
- dlrInit(&readers[1], DL_DEFAULT,
- leafReaderData(&reader), leafReaderDataBytes(&reader));
- dataBufferInit(&result, out->nData+leafReaderDataBytes(&reader));
+ dlrInit(&readers[1], DL_DEFAULT, pData, nData);
+ dataBufferInit(&result, out->nData+nData);
docListMerge(&result, readers, 2);
dataBufferDestroy(out);
*out = result;
+ dlrDestroy(&readers[0]);
+ dlrDestroy(&readers[1]);
}
- }
- if( c>=0 ) break;
- leafReaderStep(&reader);
+ }
+ if( c>=0 ) break; /* Past any possible matches. */
+
+ rc = leavesReaderStep(v, pReader);
+ if( rc!=SQLITE_OK ) return rc;
}
- leafReaderDestroy(&reader);
return SQLITE_OK;
}
+/* Call loadSegmentLeavesInt() with pData/nData as input. */
+static int loadSegmentLeaf(fulltext_vtab *v, const char *pData, int nData,
+ const char *pTerm, int nTerm, DataBuffer *out){
+ LeavesReader reader;
+ int rc;
+
+ assert( nData>1 );
+ assert( *pData=='\0' );
+ rc = leavesReaderInit(v, 0, 0, 0, pData, nData, &reader);
+ if( rc!=SQLITE_OK ) return rc;
+
+ rc = loadSegmentLeavesInt(v, &reader, pTerm, nTerm, out);
+ leavesReaderDestroy(&reader);
+ return rc;
+}
+
/* Traverse the tree represented by pData[nData] looking for
** pTerm[nTerm], merging its doclist over *out if found (any duplicate
** doclists read from the segment rooted at pData will overwrite those
-C Make\ssure\ssqlite3_value_bytes()\sdoes\snot\sreformat\sthe\scontent\safter\sa\ncall\sto\ssqlite3_value_blob().\s\sAdd\sdocumentation\sto\sexplain\sthis\shazard.\nAdd\smany\snew\stests.\s\sTicket\s#2321.\s(CVS\s3880)
-D 2007-04-27T17:16:20
+C Refactor\sfts2\sloadSegmentLeaf()\sin\spreparation\sfor\sprefix-searching.\nPrefix-searching\swill\swant\sto\saccumulate\sdata\sacross\smultiple\sleaves\nin\sthe\ssegment,\susing\sLeavesReader\sinstead\sof\sLeafReader\sis\sthe\sfirst\nstep\sin\sthat\sdirection.\s(CVS\s3881)
+D 2007-04-27T21:02:00
F Makefile.in 8cab54f7c9f5af8f22fd97ddf1ecfd1e1860de62
F Makefile.linux-gcc 2d8574d1ba75f129aba2019f0b959db380a90935
F README 9c4e2d6706bdcc3efdd773ce752a8cdab4f90028
F ext/fts1/simple_tokenizer.c 1844d72f7194c3fd3d7e4173053911bf0661b70d
F ext/fts1/tokenizer.h 0c53421b832366d20d720d21ea3e1f6e66a36ef9
F ext/fts2/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d
-F ext/fts2/fts2.c dd35df80f4b99181d610302c5a4ac71406a02fe0
+F ext/fts2/fts2.c 430ef1093f23691604fb6648c280159bc4465d74
F ext/fts2/fts2.h 591916a822cfb6426518fdbf6069359119bc46eb
F ext/fts2/fts2_hash.c b3f22116d4ef0bc8f2da6e3fdc435c86d0951a9b
F ext/fts2/fts2_hash.h e283308156018329f042816eb09334df714e105e
F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0
F www/version3.tcl 890248cf7b70e60c383b0e84d77d5132b3ead42b
F www/whentouse.tcl fc46eae081251c3c181bd79c5faef8195d7991a5
-P 40ba6493e9e8ba135552a2a0943ab499713ac001
-R ae6e82023418585801b4f01168703216
-U drh
-Z e4fdef4577a3571a48a38a52b01018a7
+P e92bd97a3726bbb7978489e2994747127c4aefcf
+R 5fb6880a5d72930ca95c09c7065e68ee
+U shess
+Z b6beaad154ccbe5f20864433f88b3cb0