1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-07-29 08:01:23 +03:00

Fix problems introduced into fts3 as part of the refactoring.

FossilOrigin-Name: fa0998e19d984ee57f4f506c34eb858026cc49c3
This commit is contained in:
dan
2009-11-19 00:15:27 +00:00
parent bd61689382
commit 5dc842ddf7
4 changed files with 47 additions and 36 deletions

View File

@ -588,7 +588,7 @@ static int fts3CreateTables(Fts3Table *p){
zContentCols = sqlite3_mprintf("docid INTEGER PRIMARY KEY");
for(i=0; zContentCols && i<p->nColumn; 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( zCsr<zEnd ){
int cmp; /* memcmp() result */
int nSuffix; /* Size of term suffix */
int nPrefix = 0; /* Size of term prefix */
int nBuffer; /* Total term size */
int nMin; /* Minimum of nBuffer and nTerm */
/* Load the next term on the node into zBuffer */
if( zBuffer ){
@ -967,8 +967,8 @@ static int fts3SelectLeaf(
** If the interior node term is larger than the specified term, then
** the tree headed by iChild may contain the specified term.
*/
nMin = (nBuffer>nTerm ? 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
);

View File

@ -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(?,?,?,?,?,?)",
/* 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.*/
"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",
/* 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",
"SELECT count(*) FROM %Q.'%q_segdir' WHERE level = ?",
"SELECT count(*), max(level) FROM %Q.'%q_segdir'",
/* 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 = ?",
"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 = ?",
};
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;