Repository navigation
Releases: bryanhelmig/turbovec-sqlite
Releases · bryanhelmig/turbovec-sqlite
Release list
turbovec-sqlite sqlite-v0.3.0
0.3.0 — 2026-10-11
- Commit inserts and deletes without loading the compressed index. A new
<name>_idsshadow table answers rowid conflict checks, rowid lookups, full
rowid scans, andcount(*); a new<name>_inforow holds the row count and
delta counts a commit needs. Connecting reads that one row. The index loads on
the first search, or when a commit compacts. On a 1,000,000-row,
1,536-dimensional index (745 MiB base), a one-row delete-and-insert commit
from a fresh process fell from 468 ms and 830 MiB peak RSS to 0.8 ms and
24.5 MiB, with a warm page cache. The first search costs what it did. - Upgrade 0.2.0 storage in place on its first write: the commit creates
_info
and_idsfrom the index it already loaded and empties<name>_meta. This
took 1.1 s on the index above. Reads alone do not upgrade. The upgrade is
one-way: 0.2.0 then refuses the index with "Query returned no rows", including
a connection opened before the upgrade, so it cannot write without
maintaining_ids. Chunk and delta formats are unchanged. - Record a storage format number in
_infoand refuse an unknown one by
number. - Fix a savepoint rollback that lost a replaced row. On a base under 1 MiB, an
insert after anINSERT OR REPLACEdropped its vector, so a later delete took
its destructive checkpoint after the replacement, and rolling back past the
checkpoint undid the replacement by removing the row. Inserts now keep their
vectors after any delete or replacement. 0.2.0 has this bug. The test script now
runs the transaction model check for 300 seeds of 30 steps, which reproduces
it; the previous 20 seeds of 20 did not. - Pin the extension on Windows so it stays loaded after its last connection
closes. SQLite unloads it then, but every search starts TurboVec's rayon
worker threads, which keep running code from the library and fault once
Windows unmaps it. Linux and macOS already keep it loaded. 0.2.0 has this
too; a test now checks that the library outlives its connections. PRAGMA integrity_checkcompares_idsand the_infocounts with the
index. A load checks the index's row count against_info.- Each insert and delete writes one
_idsrow, whichtotal_changes()counts.
A 100,000-row bulk insert in one transaction took 11% longer (1.29 s to
1.43 s).
turbovec-sqlite sqlite-v0.2.0
0.2.0 — 2026-09-26
- Bring a warm reader forward by replaying only the delta batches other
connections committed, instead of rebuilding the whole index. A reader's first
query after a concurrent one-row commit dropped from 7.6–12.3 ms to about
1.4 ms on a 20,000-row by 1,536-dimension index; the saving grows with index
size. A compaction, a gap in the delta chain, or any other surprise still
falls back to the full read. - Cap the delta budget at the base image. A high-dimensional index pays a fixed
rotation and codebook cost — an empty 1,536-dimension base already serializes
to 1.67 MiB — so the 16 MiB floor alone let small tables accumulate raw
float32 deltas several times larger than the 4-bit base they described. A
fresh 2,000-row by 1,536-dimension table now stores 3.21 MiB instead of
13.97 MiB, and its cold open plus first query fell from 27 ms to 1 ms. Small
commits on a large index are unchanged. - Stream base chunks straight into TurboVec's loader instead of materializing
the image first.IdMapIndex::from_bytescopies what it is handed, so opening
an index held two full copies; peak growth on a 48.5 MiB image fell from
104 MiB to 61 MiB. - Plan joins whose
MATCHis unusable in one loop order.xBestIndexnow
declines those orders instead of failing the statement, so batch KNN over a
table of queries works:queries q join v on v.embedding match q.embedding and v.k=n. A query no order can serve reports SQLite's "no query solution"
rather than a tailored message. - Report the planned top-k as the KNN plan's estimated row count instead of a
fixed 10, and keepxBestIndexoff the blocking path when another statement
holds the warm index. - Free the previous virtual-table error message before replacing it. SQLite's
savepoint callbacks never reclaim it, so a failingxSavepoint,xRelease,
orxRollbackToleaked its message. - Fail the build if a future
libsqlite3-sysgrowssqlite3_module, which
would silently stopPRAGMA integrity_checkfrom reachingturbovec0. - Assert in the transaction model check that each rowid holds the vector version
the model expects, not only that the rowid exists. Exerciseturbovec0
creation, insertion, search, and damaged-storage reporting from the
statically linked C smoke test. - Say why
turbovec0is unavailable on a host below SQLite 3.38, naming the
required and found versions, instead of reporting a missing internal callback.
A statically linked build inherits whateverlibsqlite3it was linked
against, so this is the message that path produces; the scalarturbovec_*
functions keep working there.
turbovec-sqlite sqlite-v0.1.6
0.1.6 — 2026-09-22
- Make small commits proportional to changed vectors instead of total index
size. Commits append checksummed operation batches; bounded lazy compaction
occasionally folds them into the existing format v7 base image. - Remove the full-index copy from ordinary deletes and replacements. Actual
destructive savepoint rollback rebuilds from committed storage and replays
the retained transaction prefix. - Extend
turbovec_info()with base, delta, and pending-operation byte counts. - Add a 700,000-row by 1,536-dimension WAL benchmark. It times mutation and
commit separately, compares released and candidate search results exactly,
and covers single edits, scattered and neighboring deletes, replacements,
and repeated churn. - Existing index files open without rebuilding. A database with unmerged 0.1.6
deltas intentionally refuses to open in 0.1.5 or older instead of silently
returning stale results.
turbovec-sqlite sqlite-v0.1.5
0.1.5 — 2026-09-15
- Upgrade from 0.1.4 without rebuilding indexes. The SQL API and TurboVec
format v7, revision 2 remain compatible. - Reject invalid shadow-table lengths, chunk sequences, and chunk types before
allocating an index read buffer; report allocation failure as a SQLite error. - Preserve
last_insert_rowid()across shadow-table writes, including failed
commits that have already written some chunks. - Let SQLite handle duplicate
INSERT OR IGNOREconstraints so affected-row
counts and last-insert rowids reflect successful inserts only. Document the
host SQLiteRETURNINGlimitation and a query that avoids it. - Stream committed indexes through a 4 MiB buffer and compare one old chunk at
a time. Preserve the serialized bytes and changed-byte-span writes. Commit
work still scales with index size; the full rollback checkpoint for destructive
writes is unchanged. - Add storage regressions for corruption, duplicate bookkeeping, chunk growth
and shrinkage, byte compatibility, WAL snapshots, and partial commit failures.
turbovec-sqlite sqlite-v0.1.4
0.1.4 — 2026-08-24
- Prepared the repository and install path for public use.
- Added a private security-reporting policy and third-party license notices.
- Made the static-link smoke portable across Apple and GNU archive tools.
- Reduced routine pull-request CI to Linux quality and SQLite compatibility
gates; tags and manual runs retain the complete five-platform release matrix. - Normalized contributor identity display through
.mailmap.
turbovec-sqlite sqlite-v0.1.3
0.1.3 — 2026-08-24
- Added
turbovec_info(table)diagnostics and explicit format v7 revision 2
checks alongsideturbovec_version(). - Added static libraries, a C header, and a static-registration smoke test.
- Added a fixed real-embedding recall gate using a public-domain GloVe fixture.
- Updated the Go client to load every pooled connection with
ConnectHookand
demonstrate filtered KNN. - Reworked the README around install, core SQL, operating costs, drift recovery,
compatibility, and release consumption. - Moved architecture and benchmark notes under
docs/and the CLI demo under
examples/.
turbovec-sqlite sqlite-v0.1.2
0.1.2 — 2026-08-24
- Made
xBeginandxSavepointmetadata-only for insert transactions. - Added change-log rollback for inserts and lazy checkpoints for deletes and
replacements. - Added nested swap-and-pop rollback coverage and an FTS5 savepoint-cost gate.
- Fixed
OR FAILand other conflict policies by passing SQLite's required
SQLITE_VTAB_CONSTRAINT_SUPPORTargument explicitly.
turbovec-sqlite sqlite-v0.1.1
Changelog
0.1.1 — 2026-08-24
- Added writable
turbovec0virtual tables backed by SQLite shadow tables. - Added transaction, WAL, savepoint, integrity, rename, and reopen coverage.
- Added native
rowid IN (...)pushdown for filtered nearest-neighbor search. - Added repeatable correctness, performance, and
sqlite-veccomparison tools. - Added Python, JavaScript, and Go examples plus native release packaging.
- Fixed extension loading against the supported SQLite 3.44 runtime API.
- Improved planner errors and documented the supported KNN query shapes.