From: dan Date: Tue, 13 Mar 2012 19:56:34 +0000 (+0000) Subject: Fix some bugs in the incremental merge code. Some remain. X-Git-Tag: mountain-lion~3^2~9^2~39 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=604f58a686f0622295eaba8135fd05ba902c7acb;p=thirdparty%2Fsqlite.git Fix some bugs in the incremental merge code. Some remain. FossilOrigin-Name: bff21683705a61b8b8672e0b44c287d1dc7c32a9 --- diff --git a/ext/fts3/fts3_write.c b/ext/fts3/fts3_write.c index 302f284897..c7f61219b5 100644 --- a/ext/fts3/fts3_write.c +++ b/ext/fts3/fts3_write.c @@ -3721,15 +3721,20 @@ static int fts3IncrmergeLoad( pWriter->iAbsLevel = iAbsLevel; pWriter->iIdx = iIdx; + for(i=nHeight+1; iaLayer[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; @@ -3866,14 +3871,14 @@ static int fts3IncrmergeWriter( 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; iaLayer[i].iBlock = pWriter->iStart + i*pWriter->nLeafEst; } - - pWriter->iAbsLevel = iAbsLevel; - pWriter->nLeafEst = nLeafEst; - pWriter->iIdx = iIdx; return SQLITE_OK; } @@ -3962,6 +3967,14 @@ static void fts3StartNode(Blob *pNode, int iHeight, sqlite3_int64 iChild){ } } +/* +** 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 */ @@ -3974,6 +3987,7 @@ static int fts3TruncateNode( 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); @@ -3986,7 +4000,8 @@ static int fts3TruncateNode( 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; @@ -4180,13 +4195,10 @@ static int fts3Incrmerge(Fts3Table *p, int nMerge, int nMin){ 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 ); } diff --git a/manifest b/manifest index 4eabdd282c..2a7a5b68da 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -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 @@ -78,7 +78,7 @@ F ext/fts3/fts3_test.c 6b7cc68aef4efb084e1449f7d20c4b20d3bdf6b4 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 @@ -993,7 +993,7 @@ F tool/tostr.awk e75472c2f98dd76e06b8c9c1367f4ab07e122d06 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 diff --git a/manifest.uuid b/manifest.uuid index 046cc5983d..68a7e3aa67 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a1747086c5e0c152fcf4bd9fa80a61b6f03f4a94 \ No newline at end of file +bff21683705a61b8b8672e0b44c287d1dc7c32a9 \ No newline at end of file