From: dan Date: Thu, 19 Nov 2009 00:15:27 +0000 (+0000) Subject: Fix problems introduced into fts3 as part of the refactoring. X-Git-Tag: fts3-refactor~2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5dc842ddf751da3be66e66f50cc632624ea26c58;p=thirdparty%2Fsqlite.git Fix problems introduced into fts3 as part of the refactoring. FossilOrigin-Name: fa0998e19d984ee57f4f506c34eb858026cc49c3 --- diff --git a/ext/fts3/fts3.c b/ext/fts3/fts3.c index 137f1e446d..effe0ba5c9 100644 --- a/ext/fts3/fts3.c +++ b/ext/fts3/fts3.c @@ -588,7 +588,7 @@ static int fts3CreateTables(Fts3Table *p){ zContentCols = sqlite3_mprintf("docid INTEGER PRIMARY KEY"); for(i=0; zContentCols && inColumn; i++){ char *z = p->azColumn[i]; - zContentCols = sqlite3_mprintf("%z, 'c%d%q'", zContentCols, i+1, z); + zContentCols = sqlite3_mprintf("%z, 'c%d%q'", zContentCols, i, z); } /* Create the whole SQL script */ @@ -934,10 +934,10 @@ static int fts3SelectLeaf( zCsr += sqlite3Fts3GetVarint(zCsr, &iChild); while( zCsrnTerm ? nTerm : nBuffer); - if( memcmp(zTerm, zBuffer, nMin)<0 ) break; + cmp = memcmp(zTerm, zBuffer, (nBuffer>nTerm ? nTerm : nBuffer)); + if( cmp<0 || (cmp==0 && nBuffer>nTerm) ) break; iChild++; }; @@ -1421,8 +1421,8 @@ static int fts3TermSelectCb( ){ TermSelect *pTS = (TermSelect *)pContext; int nNew = pTS->nOutput + nDoclist; - char *aNew = sqlite3_malloc(nNew); + if( !aNew ){ return SQLITE_NOMEM; } @@ -1507,7 +1507,7 @@ static int fts3TermSelect( sqlite3_int64 i1; rc = fts3SelectLeaf(p, zTerm, nTerm, zRoot, nRoot, &i1); if( rc==SQLITE_OK ){ - sqlite3_int64 i2 = sqlite3_column_int64(pStmt, 3); + sqlite3_int64 i2 = sqlite3_column_int64(pStmt, 2); rc = sqlite3Fts3SegReaderNew(p, iAge, i1, i2, 0, 0, 0, &pNew); } } @@ -1546,6 +1546,7 @@ static int fts3TermSelect( filter.iCol = iColumn; filter.zTerm = zTerm; filter.nTerm = nTerm; + rc = sqlite3Fts3SegReaderIterate(p, apSegment, nSegment, &filter, fts3TermSelectCb, (void *)&tsc ); diff --git a/ext/fts3/fts3_write.c b/ext/fts3/fts3_write.c index b65e05f2d4..34381a2ac7 100644 --- a/ext/fts3/fts3_write.c +++ b/ext/fts3/fts3_write.c @@ -152,30 +152,31 @@ static int fts3SqlStmt( sqlite3_value **apVal ){ const char *azSql[] = { - "DELETE FROM %Q.'%q_content' WHERE rowid = ?", - "SELECT NOT EXISTS(SELECT docid FROM %Q.'%q_content' WHERE rowid!=?)", - "DELETE FROM %Q.'%q_content'", - "DELETE FROM %Q.'%q_segments'", - "DELETE FROM %Q.'%q_segdir'", - "SELECT * FROM %Q.'%q_content' WHERE rowid=?", - "SELECT coalesce(max(idx)+1, 0) FROM %Q.'%q_segdir' WHERE level=?", - "INSERT INTO %Q.'%q_segments'(blockid, block) VALUES(?, ?)", - "SELECT coalesce(max(blockid)+1, 1) FROM %Q.'%q_segments'", - "INSERT INTO %Q.'%q_segdir' VALUES(?,?,?,?,?,?)", - - /* Return segments in order from oldest to newest.*/ - "SELECT idx, start_block, leaves_end_block, end_block, root " - "FROM %Q.'%q_segdir' WHERE level = ? ORDER BY idx ASC", - "SELECT idx, start_block, leaves_end_block, end_block, root " - "FROM %Q.'%q_segdir' ORDER BY level DESC, idx ASC", - - "SELECT count(*) FROM %Q.'%q_segdir' WHERE level = ?", - "SELECT count(*), max(level) FROM %Q.'%q_segdir'", - - "DELETE FROM %Q.'%q_segdir' WHERE level = ?", - "DELETE FROM %Q.'%q_segments' WHERE blockid BETWEEN ? AND ?", - 0, /* CONTENT_INSERT - generated elsewhere */ - "SELECT block FROM %Q.'%q_segments' WHERE blockid = ?", +/* 0 */ "DELETE FROM %Q.'%q_content' WHERE rowid = ?", +/* 1 */ "SELECT NOT EXISTS(SELECT docid FROM %Q.'%q_content' WHERE rowid!=?)", +/* 2 */ "DELETE FROM %Q.'%q_content'", +/* 3 */ "DELETE FROM %Q.'%q_segments'", +/* 4 */ "DELETE FROM %Q.'%q_segdir'", +/* 5 */ "SELECT * FROM %Q.'%q_content' WHERE rowid=?", +/* 6 */ "SELECT coalesce(max(idx)+1, 0) FROM %Q.'%q_segdir' WHERE level=?", +/* 7 */ "INSERT INTO %Q.'%q_segments'(blockid, block) VALUES(?, ?)", +/* 8 */ "SELECT coalesce(max(blockid)+1, 1) FROM %Q.'%q_segments'", +/* 9 */ "INSERT INTO %Q.'%q_segdir' VALUES(?,?,?,?,?,?)", + + /* Return segments in order from oldest to newest.*/ +/* 10 */ "SELECT idx, start_block, leaves_end_block, end_block, root " + "FROM %Q.'%q_segdir' WHERE level = ? ORDER BY idx ASC", +/* 11 */ "SELECT idx, start_block, leaves_end_block, end_block, root " + "FROM %Q.'%q_segdir' ORDER BY level DESC, idx ASC", + +/* 12 */ "SELECT count(*) FROM %Q.'%q_segdir' WHERE level = ?", +/* 13 */ "SELECT count(*), max(level) FROM %Q.'%q_segdir'", + +/* 14 */ "DELETE FROM %Q.'%q_segdir' WHERE level = ?", +/* 15 */ "DELETE FROM %Q.'%q_segments' WHERE blockid BETWEEN ? AND ?", +/* 16 */ 0, /* CONTENT_INSERT - generated elsewhere */ +/* 17 */ "SELECT block FROM %Q.'%q_segments' WHERE blockid = ?", + }; int rc = SQLITE_OK; sqlite3_stmt *pStmt; @@ -251,6 +252,14 @@ int sqlite3Fts3ReadBlock( ** ** There is only ever one instance of this SQL statement compiled for ** each FTS3 table. +** +** The statement returns the following columns from the %_segdir table: +** +** 0: idx +** 1: start_block +** 2: leaves_end_block +** 3: end_block +** 4: root */ int sqlite3Fts3AllSegdirs(Fts3Table *p, sqlite3_stmt **ppStmt){ return fts3SqlStmt(p, SQL_SELECT_ALL_LEVEL, ppStmt, 0); @@ -702,6 +711,7 @@ static int fts3SegReaderNext(Fts3SegReader *pReader){ pReader->nTerm = nPrefix+nSuffix; pNext += nSuffix; pNext += sqlite3Fts3GetVarint32(pNext, &pReader->nDoclist); + assert( pNext<&pReader->aNode[pReader->nNode] ); pReader->aDoclist = pNext; pReader->pOffsetList = 0; return SQLITE_OK; @@ -754,7 +764,7 @@ static void fts3SegReaderNextDocid( ** Fts3SegReader.pOffsetList to point to the next offset list before ** returning. */ - if( p==&pReader->aDoclist[pReader->nDoclist] ){ + if( p>=&pReader->aDoclist[pReader->nDoclist] ){ pReader->pOffsetList = 0; }else{ sqlite3_int64 iDelta; diff --git a/manifest b/manifest index fdc1a428da..985db36ac2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\ssome\smissing\scomments\sand\sfix\ssome\sother\sissues\sin\sfts3\scode. -D 2009-11-18T15:35:59 +C Fix\sproblems\sintroduced\sinto\sfts3\sas\spart\sof\sthe\srefactoring. +D 2009-11-19T00:15:28 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0 F Makefile.in 53f3dfa49f28ab5b80cb083fb7c9051e596bcfa1 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654 @@ -56,7 +56,7 @@ F ext/fts2/mkfts2amal.tcl 974d5d438cb3f7c4a652639262f82418c1e4cff0 F ext/fts3/README.syntax a19711dc5458c20734b8e485e75fb1981ec2427a F ext/fts3/README.tokenizers 998756696647400de63d5ba60e9655036cb966e9 F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d -F ext/fts3/fts3.c 2aa2c3f7b4d753f048af1c777b2c5fdd7e52c560 +F ext/fts3/fts3.c 3251d3c5e2304bcd2d8d92d1fa8fa204cfdcd28d F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe F ext/fts3/fts3Int.h f7488bbc9fd12bd3843f59265227321a92b39ed4 F ext/fts3/fts3_expr.c bdf11f3602f62f36f0e42823680bf22033dae0de @@ -68,7 +68,7 @@ F ext/fts3/fts3_snippet.c 8ea9619247ac61c79aca650fc3307b8b4097b5f3 F ext/fts3/fts3_tokenizer.c 185a212670a9bbdeb5cad6942305e681bce5c87b F ext/fts3/fts3_tokenizer.h 7ff73caa3327589bf6550f60d93ebdd1f6a0fb5c F ext/fts3/fts3_tokenizer1.c 0a5bcc579f35de5d24a9345d7908dc25ae403ee7 -F ext/fts3/fts3_write.c ec6bbf26bfa21e64b059535e46b3a8e57fb21f5c +F ext/fts3/fts3_write.c 041f6c4dda87db0248402245dc15c348ef8f7a99 F ext/fts3/mkfts3amal.tcl 252ecb7fe6467854f2aa237bf2c390b74e71f100 F ext/icu/README.txt 3b130aa66e7a681136f6add198b076a2f90d1e33 F ext/icu/icu.c 12e763d288d23b5a49de37caa30737b971a2f1e2 @@ -772,7 +772,7 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P 45c051e78651d8204c17cecdda2bde705698881f -R f882843f6b95cfb6a8f2fd130e122bb3 +P 2fe579e778b75fbf503c02e01e5424c1926f2b49 +R 876c3ff77bbdae620820b9bcd69de73e U dan -Z b8988750cf7cc171c22183eb295bebe6 +Z 2c58b81314d821564ee17bc92f6804a7 diff --git a/manifest.uuid b/manifest.uuid index 5563c3807c..fd7e454a36 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2fe579e778b75fbf503c02e01e5424c1926f2b49 \ No newline at end of file +fa0998e19d984ee57f4f506c34eb858026cc49c3 \ No newline at end of file