All notable changes to sqlite-vec-cpp will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- C++20/23 Modernization: Complete rewrite of sqlite-vec in modern C++
- Template-based distance metrics with concept constraints
std::spanfor zero-copy vector operationsstd::expectedfor type-safe error handling (C++23)- RAII wrappers for SQLite C API (Context, Value, VTab)
- Distance Metrics: L2 (Euclidean), L1 (Manhattan), Cosine, Hamming
- Full template support for
float,int8_t,int16_t - Conditional SIMD: AVX (x86_64), NEON (ARM64)
- Zero-cost abstractions validated via benchmarks
- Full template support for
- Batch Operations (Phase 2):
batch_distance(): 1 query vs N database vectorsbatch_distance_contiguous(): Optimized for contiguous memory layoutbatch_top_k(): Efficient top-K nearest neighbor searchbatch_distance_filtered(): Distance threshold filteringbatch_distance_parallel(): C++17 parallel algorithms (optional)
- vec0 Virtual Table Module: Complete SQLite virtual table implementation
- Shadow tables for metadata and row IDs
- Full CRUD operations with type-safe C++ API
- Integration with YAMS vector backend
- Comprehensive Testing:
- 22 unit tests (Concepts, Distance Metrics, Utils, SQLite Functions, Batch Ops)
- 100% pass rate, <0.1s execution time
- Benchmarking Suite:
- RAG Pipeline Benchmark: 13 scenarios (corpus size, K-value, dimensions, quantization)
- Batch Distance Benchmark: 8 scenarios (sequential vs batch, contiguous, int8)
- Google Benchmark integration with JSON output
- Sub-microsecond latency: 273 μs for 1K vectors (384d), 2.78 ms for 10K vectors
- Sustained throughput: 3.6M vectors/second across all corpus sizes
- Linear scaling: 2x dimensions → 2x latency (compute-bound)
- int8 quantization: 4x storage reduction at parity performance (1% faster)
- K-value independence: Top-K search overhead negligible (< 1%)
- Build System: Meson with C++20/23 auto-detection
- API Surface: Replaced raw pointers with
std::spanthroughout - Error Handling: Migrated from C error codes to
std::expected<T, E>
- HNSW Index (Phase 1 - Core Implementation) (Task 057-109):
- Header-only HNSW implementation with full C++20/23 support
- Hierarchical graph structure with exponential layer assignment
- Greedy search (upper layers) + Beam search with priority queues (layer 0)
- Bidirectional edge connections with M_max pruning
- Batch build support and configurable parameters (M, ef_construction)
- Files:
hnsw.hpp(327 lines),hnsw_node.hpp(61 lines)
- HNSW Persistence Layer (Partial):
- Serialization/deserialization for config and nodes
- Shadow table schema design (
_hnsw_meta,_hnsw_nodes) - Save function (90% complete)
- File:
hnsw_persistence.hpp(310+ lines)
- HNSW Benchmark Suite:
- Build time scaling (1K, 10K, 100K vectors)
- Search latency vs corpus size
- ef_search tuning (recall vs latency trade-off)
- Brute-force comparison for speedup validation
- File:
hnsw_benchmark.cpp(290 lines)
- Recall quality: 90-100% with ef_search=100-200 (10K vectors)
- Graph connectivity: 100% of nodes reachable from entry point
- Build throughput: ~1.6K vectors/sec (1K corpus), ~370 vectors/sec (10K corpus)
- Search latency: ~735 μs @ 10K vectors (ef=50)
- Expected speedup (vs brute-force):
- 10K vectors: ~2x (1.5ms vs 2.8ms)
- 100K vectors: ~14x (2ms vs 27.9ms)
- 1M vectors: ~56x (5ms vs 280ms estimated)
- Memory overhead: ~80 bytes/vector (M=16, avg 3 layers)
- SQLite Integration: Incomplete (60% done) - deserialization, query planner, incremental updates pending