Index: third_party/sqlite/src/ext/fts3/fts3_write.c |
diff --git a/third_party/sqlite/src/ext/fts3/fts3_write.c b/third_party/sqlite/src/ext/fts3/fts3_write.c |
index d5a408222ec790eb3ed7c9a32c33182fd954039e..3ff481b0b081cdc70a18ee89b70cbb0a6189941e 100644 |
--- a/third_party/sqlite/src/ext/fts3/fts3_write.c |
+++ b/third_party/sqlite/src/ext/fts3/fts3_write.c |
@@ -333,7 +333,8 @@ static int fts3SqlStmt( |
** of the oldest level in the db that contains at least ? segments. Or, |
** if no level in the FTS index contains more than ? segments, the statement |
** returns zero rows. */ |
-/* 28 */ "SELECT level FROM %Q.'%q_segdir' GROUP BY level HAVING count(*)>=?" |
+/* 28 */ "SELECT level, count(*) AS cnt FROM %Q.'%q_segdir' " |
+ " GROUP BY level HAVING cnt>=?" |
" ORDER BY (level %% 1024) ASC LIMIT 1", |
/* Estimate the upper limit on the number of leaf nodes in a new segment |
@@ -3194,7 +3195,7 @@ static int fts3SegmentMerge( |
** segment. The level of the new segment is equal to the numerically |
** greatest segment level currently present in the database for this |
** index. The idx of the new segment is always 0. */ |
- if( csr.nSegment==1 ){ |
+ if( csr.nSegment==1 && 0==fts3SegReaderIsPending(csr.apSegment[0]) ){ |
rc = SQLITE_DONE; |
goto finished; |
} |
@@ -4836,10 +4837,11 @@ int sqlite3Fts3Incrmerge(Fts3Table *p, int nMerge, int nMin){ |
** set nSeg to -1. |
*/ |
rc = fts3SqlStmt(p, SQL_FIND_MERGE_LEVEL, &pFindLevel, 0); |
- sqlite3_bind_int(pFindLevel, 1, nMin); |
+ sqlite3_bind_int(pFindLevel, 1, MAX(2, nMin)); |
if( sqlite3_step(pFindLevel)==SQLITE_ROW ){ |
iAbsLevel = sqlite3_column_int64(pFindLevel, 0); |
- nSeg = nMin; |
+ nSeg = sqlite3_column_int(pFindLevel, 1); |
+ assert( nSeg>=2 ); |
}else{ |
nSeg = -1; |
} |