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:
@ -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
|
||||
);
|
||||
|
@ -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;
|
||||
|
Reference in New Issue
Block a user