pWriter->iAbsLevel = iAbsLevel;
pWriter->iIdx = iIdx;
+ for(i=nHeight+1; i<FTS_MAX_APPENDABLE_HEIGHT; i++){
+ pWriter->aLayer[i].iBlock = pWriter->iStart + i*pWriter->nLeafEst;
+ }
+
pLayer = &pWriter->aLayer[nHeight];
- pLayer->iBlock = pWriter->iStart + nHeight*FTS_MAX_APPENDABLE_HEIGHT;
+ pLayer->iBlock = pWriter->iStart;
+ pLayer->iBlock += pWriter->nLeafEst*FTS_MAX_APPENDABLE_HEIGHT;
blobGrowBuffer(&pLayer->block, MAX(nRoot, p->nNodeSize), &rc);
if( rc==SQLITE_OK ){
memcpy(pLayer->block.a, aRoot, nRoot);
pLayer->block.n = nRoot;
}
- for(i=(int)aRoot[0]; i>=0 && rc==SQLITE_OK; i--){
+ for(i=nHeight; i>=0 && rc==SQLITE_OK; i--){
pLayer = &pWriter->aLayer[i];
NodeReader reader;
rc = fts3WriteSegment(p, pWriter->iEnd, 0, 0);
}
+ pWriter->iAbsLevel = iAbsLevel;
+ pWriter->nLeafEst = nLeafEst;
+ pWriter->iIdx = iIdx;
+
/* Set up the array of LayerWriter objects */
for(i=0; i<FTS_MAX_APPENDABLE_HEIGHT; i++){
pWriter->aLayer[i].iBlock = pWriter->iStart + i*pWriter->nLeafEst;
}
-
- pWriter->iAbsLevel = iAbsLevel;
- pWriter->nLeafEst = nLeafEst;
- pWriter->iIdx = iIdx;
return SQLITE_OK;
}
}
}
+/*
+** The first two arguments are a pointer to and the size of a segment b-tree
+** node. The node may be a leaf or an internal node.
+**
+** This function creates a new node image in blob object *pNew by copying
+** all terms that are greater than or equal to zTerm/nTerm (for leaf nodes)
+** or greater than zTerm/nTerm (for internal nodes) from aNode/nNode.
+*/
static int fts3TruncateNode(
const char *aNode, /* Current node image */
int nNode, /* Size of aNode in bytes */
Blob prev = {0, 0, 0};
int rc = SQLITE_OK;
int bStarted = 0;
+ int bLeaf = aNode[0]=='\0'; /* True for a leaf node */
/* Allocate required output space */
blobGrowBuffer(pNew, nNode, &rc);
rc = nodeReaderNext(&reader)
){
if( bStarted==0 ){
- if( fts3TermCmp(reader.term.a, reader.term.n, zTerm, nTerm)<0 ) continue;
+ int res = fts3TermCmp(reader.term.a, reader.term.n, zTerm, nTerm);
+ if( res<0 || (bLeaf==0 && res==0) ) continue;
pNew->a[0] = aNode[0];
fts3StartNode(pNew, (int)aNode[0], reader.iChild);
*piBlock = reader.iChild;
assert( rc!=SQLITE_ABORT );
if( SQLITE_ROW==(rc = sqlite3Fts3SegReaderStep(p, &csr)) ){
rc = fts3IncrmergeWriter(p, iAbsLevel, csr.zTerm, csr.nTerm, &writer);
- assert( rc!=SQLITE_ABORT );
if( rc==SQLITE_OK ){
do {
rc = fts3IncrmergeAppend(p, &writer, &csr);
- assert( rc!=SQLITE_ABORT );
if( rc==SQLITE_OK ) rc = sqlite3Fts3SegReaderStep(p, &csr);
- assert( rc!=SQLITE_ABORT );
if( writer.nWork>=nRem && rc==SQLITE_ROW ) rc = SQLITE_OK;
}while( rc==SQLITE_ROW );
}
-C Minor\scommenting\sand\sstylistic\schanges\sonly.
-D 2012-03-09T12:52:43.195
+C Fix\ssome\sbugs\sin\sthe\sincremental\smerge\scode.\sSome\sremain.
+D 2012-03-13T19:56:34.883
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
F Makefile.in 3f79a373e57c3b92dabf76f40b065e719d31ac34
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
F ext/fts3/fts3_tokenizer.c 3da7254a9881f7e270ab28e2004e0d22b3212bce
F ext/fts3/fts3_tokenizer.h 66dec98e365854b6cd2d54f1a96bb6d428fc5a68
F ext/fts3/fts3_tokenizer1.c 0dde8f307b8045565cf63797ba9acfaff1c50c68
-F ext/fts3/fts3_write.c 80863b8ef7849c8c225071258e13326f30bf00f3
+F ext/fts3/fts3_write.c d26ef19833b4a5058f4bd0c8b9f00b3d197d0e28
F ext/fts3/fts3speed.tcl b54caf6a18d38174f1a6e84219950d85e98bb1e9
F ext/fts3/mkfts3amal.tcl 252ecb7fe6467854f2aa237bf2c390b74e71f100
F ext/icu/README.txt bf8461d8cdc6b8f514c080e4e10dc3b2bbdfefa9
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
F tool/warnings-clang.sh 9f406d66e750e8ac031c63a9ef3248aaa347ef2a
F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381
-P 741b8f897750eac3c9774fd65de7e40bb89781b1
-R ef47488babfef36b031a8c9c8f291bcb
-U drh
-Z 0b165accece5454f4134f86269851728
+P a1747086c5e0c152fcf4bd9fa80a61b6f03f4a94
+R 4dfb01ab70bf7b72368d08052c15c6ea
+U dan
+Z 2b44052e1e88ac3fc7ddfb07e6e262a4