- Normalize MMR diversity term so
mmr_lambdabehaves consistently across L2/L1/cosine (vlasky@8d4ef9e)
- MMR (Maximal Marginal Relevance) reranking for KNN queries (vlasky#6, rebased from asg017#267)
- New
mmr_lambdahidden column on vec0 tables balances relevance vs. diversity WHERE embedding MATCH ? AND k = 10 AND mmr_lambda = 0.5- Lambda range [0.0, 1.0]: 1.0 = pure relevance, 0.0 = pure diversity
- Supports all vector types (float32, int8, bit) and distance metrics
- Composes with distance constraints and partition keys
- Zero overhead when
mmr_lambdais not used
- New
- Fixed potential uninitialized memory read in MMR copy-back when fewer candidates are selected than requested
- Fixed non-deterministic
test_shadowsnapshot (missingORDER BYonpragma_table_list)
- Fixed Windows CI builds in
npm-release.yaml: corrected MSVC flags (removed invalid GCC flags), fixed DLL output path, added security hardening for both x64 and ARM64 - Removed unused upstream
release.yaml(would have erroneously published to PyPI/RubyGems/crates.io) - Cleaned up Makefile: removed dead variables and phantom targets, added
loadable-msvc-x64/loadable-msvc-arm64targets
- npm package renamed from
@mceachen/sqlite-vecto@photostructure/sqlite-vec
This package is a community fork of Alex Garcia's
excellent sqlite-vec, building on
Vlad Lasky's community fork which merged 15+
upstream PRs. We're grateful to both for their foundational work.
PhotoStructure depends on sqlite-vec for production vector search and is committed to maintaining this fork for as long as we need it. Our current focus is:
- Stability: Memory leak fixes, sanitizer-verified error paths, comprehensive test coverage
- Node.js packaging: Prebuilt binaries for all major platforms (including Alpine/musl and Windows ARM64), Electron support, no post-install scripts
The version was bumped to 1.0.0 to signal the package rename and avoid confusion
with the 0.x releases under the previous name. The underlying C extension is
unchanged from 0.4.1.
All code remains open source under the original MIT/Apache-2.0 dual license.
- Remaining memory leaks from upstream PR #258 (
c9be38c)vec_eachFilter: Fixed pzErrMsg leak when vector parsing fails with invalid inputvec_slice: Fixed vector cleanup leaks in INT8 and BIT cases on malloc failure- Changed early
returntogoto doneto ensure cleanup functions are called - These leaks only occurred in error paths (invalid input, OOM) not covered by existing tests
-
Rust example updates for zerocopy 0.8 (
53aeaeb)- Updated
examples/simple-rust/to use zerocopy 0.8 API - Changed
AsBytestrait toIntoBytes(renamed in zerocopy 0.8) - Updated documentation in
site/using/rust.md - Incorporates upstream PR #244
- Updated
-
Comprehensive error path test coverage (
95cc6c8)- New
tests/test-error-paths.pywith 30 tests targeting error-handling code paths - Tests exercise error conditions that previously went untested (invalid inputs, NULL values, mismatched types/dimensions)
- Covers
vec_each,vec_slice,vec_distance_*,vec_add,vec_sub, vec0 INSERT/KNN operations - Repeated error operations test (50 iterations) to stress-test cleanup paths
- Ensures sanitizers (ASan/LSan) will catch any reintroduced memory leaks in error paths
- New
This release completes the integration of upstream PR #258's memory leak fixes. Previous releases (0.3.2, 0.3.3) addressed most issues, but three error paths remained unfixed:
- Error message allocation in
vec_eachwith invalid vectors - Malloc failure handling in
vec_slicefor INT8/BIT vectors
These paths were not detected by sanitizers because they were never executed by the test suite. The new error path tests ensure these code paths are now covered.
- Electron support for packaged ASAR apps
getLoadablePath()now resolvesapp.asartoapp.asar.unpackedautomatically- Works transparently — no code changes needed in Electron apps
- Added README documentation with
electron-builderandelectron-forgeconfiguration examples
-
Parser logic bugs (
45f09c1)- Fixed
&&→||condition checks in token validation across multiple parsing functions - Affected:
vec0_parse_table_option,vec0_parse_partition_key_definition,vec0_parse_auxiliary_column_definition,vec0_parse_primary_key_definition,vec0_parse_vector_column
- Fixed
-
Float precision for f32 distance calculations (
45f09c1)- Use
sqrtf()instead ofsqrt()for f32 vectors to avoid unnecessary double precision - May result in minor floating-point differences in distance results
- Use
-
Memory leaks in metadata and insert operations (
f56fdeb)- Fixed zSql memory leaks in
vec0_write_metadata_value(never freed on any path) - Fixed zSql leak and missing
sqlite3_finalizeinvec0Update_Delete_ClearMetadata - Fixed potential crash from uninitialized function pointers on early error in
vec0Update_Insert - Fixed memory leak in
vec_static_blob_entriesClose(internal rowids/distances arrays)
- Fixed zSql memory leaks in
- KNN filtering documentation (
fd69fed)- New documentation explaining when filters are applied during vs. after KNN search
- Metadata columns, partition keys, and distance constraints filter DURING search
- JOIN filters and subqueries filter AFTER search (may return fewer than k results)
- Documented workarounds: use metadata columns or over-fetch with LIMIT
- Added clang-tidy static analysis configuration (
a39311f) - Expanded memory testing with UBSan/TSan support and multi-platform CI matrix (
de0edf3) - Fixed test infrastructure:
make test-alltarget, auto-detect pytest, fix test-unit linking (c39ada1)
- Memory testing framework (
c8654d0)- Valgrind and AddressSanitizer support via
make test-memory - Catches memory leaks, use-after-free, and buffer overflows
- Valgrind and AddressSanitizer support via
-
Memory leaks in KNN queries (
e4d3340,df2c2fc,f05a360)- Fixed leaks in
vec0Filter_knnmetadata IN clause processing - Fixed leaks and potential crashes in
vec_static_blob_entriesfilter - Ensured
knn_datais freed on error paths
- Fixed leaks in
-
Memory leaks in vtab lifecycle (
5f667d8,49dcce7)- Fixed leaks in
vec0_initandvec0Destroyerror paths - Added NULL check before blob read to prevent crashes
vec0_freenow properly frees partition, auxiliary, and metadata column names
- Fixed leaks in
-
Cosine distance with zero vectors (
5d1279b)- Returns 1.0 (max distance) instead of NaN for zero-magnitude vectors
-
Lua binding with IEEE 754 compliant float serialization (
1d3c258)- New
bindings/lua/sqlite_vec.luamodule for Lua 5.1+ serialize_f32()for IEEE 754 binary formatserialize_json()for JSON format- Example script in
examples/simple-lua/ - Incorporates upstream PR #237 with extensive bugfixes for float encoding
- New
-
Safer automated release workflow (
6d06b7d)prepare-releasejob creates a release branch before building- All builds use the release branch with correct version baked in
- Main branch only updated after successful npm publish
- If any step fails, main is untouched
-
Numpy header parsing: fixed
&&→||logic bug (90e0099) -
Go bindings patch updated for new SQLite source (
ceb488c)- Updated
bindings/go/ncruces/go-sqlite3.patchfor compatibility with latest SQLite
- Updated
-
npm-release workflow improvements
-
OIDC npm release workflow with bundled platform binaries (
f7ae5c0)- Single npm package contains all platform builds (prebuildify approach)
- Simpler, more secure, works offline and with disabled scripts
- Platform binaries: linux-x64, linux-arm64, darwin-x64, darwin-arm64, win32-x64, win32-arm64
-
Alpine/MUSL support (
f7ae5c0)- Added linux-x64-musl and linux-arm64-musl builds
- Uses node:20-alpine Docker images for compilation
- MSVC-compatible
__builtin_popcountlimplementation (fab929b)- Added fallback for MSVC which lacks GCC/Clang builtins
- Enables Windows ARM64 and x64 builds
- Node.js package renamed to
@mceachen/sqlite-vec(fe9f038)- Published to npm under scoped package name
- Updated documentation to reflect new package name
- All other language bindings will continue to reference upstream (vlasky/sqlite-vec)
- Updated GitHub Actions to pinned versions via pinact (
b904a1d) - Added
bash,curlandunzipto Alpine build dependencies (aa7f3e7,9c446c8) - Documentation fixes (
4d446f7,3a5b6d7)
Earlier releases are from https://github.com/vlasky/sqlite-vec
- Lua binding with IEEE 754 compliant float serialization (#237)
bindings/lua/sqlite_vec.luaprovidesload(),serialize_f32(), andserialize_json()functions- Lua 5.1+ compatible with lsqlite3
- IEEE 754 single-precision float encoding with round-half-to-even (banker's rounding)
- Proper handling of special values: NaN, Inf, -Inf, -0.0, subnormals
- Example script and runner in
/examples/simple-lua/
-
Android 16KB page support (#254)
- Added
LDFLAGSsupport to Makefile for passing linker-specific flags - Enables Android 15+ compatibility via
-Wl,-z,max-page-size=16384 - Required for Play Store app submissions on devices with 16KB memory pages
- Added
-
Improved shared library build and installation (#149)
- Configurable install paths via
INSTALL_PREFIX,INSTALL_LIB_DIR,INSTALL_INCLUDE_DIR,INSTALL_BIN_DIR - Hidden internal symbols with
-fvisibility=hidden, exposing only public API EXT_CFLAGScaptures user-providedCFLAGSandCPPFLAGS
- Configurable install paths via
-
Optimize/VACUUM integration test and documentation
- Added test demonstrating optimize command with VACUUM for full space reclamation
- Linux linking error with libm (#252)
- Moved
-lmflag fromCFLAGStoLDLIBSat end of linker command - Fixes "undefined symbol: sqrtf" errors on some Linux distributions
- Linker now correctly resolves math library symbols
- Moved
- Fixed incomplete KNN and Matryoshka guides (#208, #209)
- Completed unfinished sentence describing manual KNN method trade-offs
- Added paper citation and Matryoshka naming explanation
-
GLOB operator for text metadata columns (#191)
- Standard SQL pattern matching with
*(any characters) and?(single character) wildcards - Case-sensitive matching (unlike LIKE)
- Fast path optimization for prefix-only patterns (e.g.,
'prefix*') - Full pattern matching with
sqlite3_strglob()for complex patterns
- Standard SQL pattern matching with
-
IS/IS NOT/IS NULL/IS NOT NULL operators for metadata columns (#190)
- Note: sqlite-vec metadata columns do not currently support NULL values. These operators provide syntactic compatibility within this limitation.
ISbehaves like=(all metadata values are non-NULL)IS NOTbehaves like!=(all metadata values are non-NULL)IS NULLalways returns false (no NULL values exist in metadata)IS NOT NULLalways returns true (all metadata values are non-NULL)- Works on all metadata types: INTEGER, FLOAT, TEXT, and BOOLEAN
- All compilation warnings eliminated
- Fixed critical logic bug:
metadataInIdxtype corrected fromsize_ttoint(prevented -1 wrapping to SIZE_MAX) - Fixed 5 sign comparison warnings with proper type casts
- Fixed 7 uninitialized variable warnings by adding initializers and default cases
- Clean compilation with
-Wall -Wextra(zero warnings)
- Fixed critical logic bug:
- LIKE operator for text metadata columns (#197)
- Standard SQL pattern matching with
%and_wildcards - Case-insensitive matching (SQLite default)
- Standard SQL pattern matching with
-
Locale-dependent JSON parsing (#241)
- Custom locale-independent float parser fixes JSON parsing in non-C locales
- No platform dependencies, thread-safe
-
musl libc compilation (Alpine Linux)
- Removed non-portable preprocessor macros from vendored sqlite3.c
-
Distance constraints for KNN queries (#166)
- Support GT, GE, LT, LE operators on the
distancecolumn in KNN queries - Enables cursor-based pagination:
WHERE embedding MATCH ? AND k = 10 AND distance > 0.5 - Enables range queries:
WHERE embedding MATCH ? AND k = 100 AND distance BETWEEN 0.5 AND 1.0 - Works with all vector types (float32, int8, bit)
- Compatible with partition keys, metadata, and auxiliary columns
- Comprehensive test coverage (15 tests)
- Fixed variable shadowing issues from original PR
- Documented precision handling and pagination caveats
- Support GT, GE, LT, LE operators on the
-
Optimize command for space reclamation (#210)
- New special command:
INSERT INTO vec_table(vec_table) VALUES('optimize') - Reclaims disk space after DELETE operations by compacting shadow tables
- Rebuilds vector chunks with only valid rows
- Updates rowid mappings to maintain data integrity
- New special command:
-
Cosine distance support for binary vectors (#212)
- Added
distance_cosine_bit()function for binary quantized vectors - Enables cosine similarity metric on bit-packed vectors
- Useful for memory-efficient semantic search
- Added
-
ALTER TABLE RENAME support (#203)
- Implement
vec0Rename()callback for virtual table module - Allows renaming vec0 tables with standard SQL:
ALTER TABLE old_name RENAME TO new_name - Properly renames all shadow tables and internal metadata
- Implement
-
Language bindings and package configurations for GitHub installation
- Go CGO bindings (
bindings/go/cgo/) withAuto()and serialization helpers - Python package configuration (
pyproject.toml,setup.py) forpip install git+... - Node.js package configuration (
package.json) fornpm install vlasky/sqlite-vec - Ruby gem configuration (
sqlite-vec.gemspec) forgem installfrom git - Rust crate configuration (
Cargo.toml,src/lib.rs) forcargo add --git - All packages support installing from main branch or specific version tags
- Documentation in README with installation table for all languages
- Go CGO bindings (
-
Python loadable extension support documentation
- Added note about Python requiring
--enable-loadable-sqlite-extensionsbuild flag - Recommended using
uvfor virtual environments (uses system Python with extension support) - Documented workarounds for pyenv and custom Python builds
- Added note about Python requiring
-
Memory leak on DELETE operations (#243)
- Added
vec0Update_Delete_ClearRowid()to clear deleted rowids - Added
vec0Update_Delete_ClearVectors()to clear deleted vector data - Prevents memory accumulation from deleted rows
- Vectors and rowids now properly zeroed out on deletion
- Added
-
CI/CD build infrastructure (#228)
- Upgraded deprecated ubuntu-20.04 runners to ubuntu-latest
- Added native ARM64 builds using ubuntu-24.04-arm
- Removed cross-compilation dependencies (gcc-aarch64-linux-gnu)
- Fixed macOS link flags for undefined symbols
This fork is based on asg017/sqlite-vec v0.1.7-alpha.2.
All features and functionality from the original repository are preserved.
See the original documentation for complete usage information.