Skip to content

fix(core): recover SQLite index rebuilds and large vector deletions - #1865

Merged
phernandez merged 3 commits into
mainfrom
fix/sqlite-index-recovery
Oct 25, 2026
Merged

phernandez merged 3 commits into
mainfrom
fix/sqlite-index-recovery

Conversation

@phernandez

Copy link
Copy Markdown
Member

Why

Two reported SQLite failures block reindexing or startup: deleting a large chunk manifest exceeds SQLite's expression-depth limit (#1850), and an interrupted script-ngram migration leaves a scratch table that prevents the next startup (#1853). Both reproduce on current main with the contributor's regression tests.

Fixes #1850. Fixes #1853.

What Changed

Implementation Details

Deletion retains the existing project, key, source-hash and pending-status guards in one transaction. Batching limits expression depth and bound parameters without changing the concurrency protocol.

The migration rebuilds from search_index; the scratch table has no authoritative state. Integration tests commit the interrupted state before opening a new transaction and verify preserved full-text matches afterward. They use Alembic's real Operations context and sqlite-vec without application mocks. Contributor workflow-evidence notes are omitted from the final diff.

Testing

  • Before fixes: the two new contributor regressions fail on main with Expression tree is too large and table search_index_rebuilt already exists.
  • uv run pytest tests/repository/test_sqlite_vector_search_repository.py tests/test_script_ngram_search_migration.py test-int/test_sqlite_index_recovery.py -q -o addopts= --tb=short: 46 passed.
  • just fast-check: lint, format and full typecheck passed.
  • just doctor: sandboxed write, index and search passed.
  • git diff --check: passed.

Risks / Follow-ups

Changes are SQLite-specific; PostgreSQL production paths are unchanged. The recovery assumes the original FTS table remains intact, matching the reported interrupted upgrade. #1861's watcher lifecycle changes are reviewed separately.

MbappeWU and others added 3 commits October 25, 2026 11:37
… limit

A single UPDATE with one 4-term AND predicate per pending chunk exceeds
SQLITE_MAX_EXPR_DEPTH above ~995 deletions. Delete in batches of 200 and
keep the pending-row match semantics. Add a 1200-row regression test.

Signed-off-by: MbappeWU <MbappeWU@users.noreply.github.com>
Signed-off-by: phernandez <paul@basicmachines.co>
Drop a leftover search_index_rebuilt before CREATE so an interrupted
d2e3f4a5b6c7 upgrade can retry instead of failing with table already
exists. Regression covers the empty leftover-table case from #1853.

Signed-off-by: MbappeWU <MbappeWU@users.noreply.github.com>
Signed-off-by: phernandez <paul@basicmachines.co>
Signed-off-by: phernandez <paul@basicmachines.co>
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 25, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-25T16:41:09.603951Z c639e50 PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@phernandez
phernandez merged commit b084bcc into main Oct 25, 2026
51 checks passed
@phernandez
phernandez deleted the fix/sqlite-index-recovery branch October 25, 2026 17:26
@CLAassistant

Copy link
Copy Markdown

CLA assistant check
Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you sign our Contributor License Agreement before we can accept your contribution.
You have signed the CLA already but the status is still pending? Let us recheck it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

3 participants