fix: drop+recreate contentless FTS5 index instead of DELETE
The search_index is a contentless FTS5 table (content=''), which SQLite does not support DELETE on. ClearSearchIndex now drops and recreates the virtual table. Single-row DeleteSearchIndex becomes a no-op since contentless FTS5 also cannot delete individual rows; stale entries are harmless (search JOINs filter them out) and the index is fully rebuilt during FullRescan.
This commit is contained in:
@@ -160,22 +160,21 @@ func (l *Library) clearLibraryTables() error {
|
||||
)
|
||||
}
|
||||
|
||||
// Clear FTS5 search index.
|
||||
// SAFETY: FTS5 virtual table, see search.go:ClearSearchIndex. No parameters; unconditional delete.
|
||||
if _, err := tx.ExecContext(
|
||||
l.ctx, `DELETE FROM search_index`,
|
||||
); err != nil {
|
||||
return fmt.Errorf(
|
||||
"could not clear search index: %w", err,
|
||||
)
|
||||
}
|
||||
|
||||
if err := tx.Commit(); err != nil {
|
||||
return fmt.Errorf(
|
||||
"could not commit library clear transaction: %w", err,
|
||||
)
|
||||
}
|
||||
|
||||
// Clear FTS5 search index AFTER the transaction.
|
||||
// ClearSearchIndex drops and recreates the contentless FTS5
|
||||
// virtual table, which cannot run inside a transaction.
|
||||
if err := l.db.ClearSearchIndex(); err != nil {
|
||||
return fmt.Errorf(
|
||||
"could not clear search index: %w", err,
|
||||
)
|
||||
}
|
||||
|
||||
l.logger.Info("all library tables cleared")
|
||||
|
||||
return nil
|
||||
|
||||
Reference in New Issue
Block a user