Changelog
All notable changes to SQL Anywhere are documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
0.5.2 - 2026-07-16
The substrate half of the Redis-free stack, made provable: the queue, cache and pub/sub contracts are now executable, CI-verified specs the Askr runtime builds its L2 drivers against.
Added
- Conformance-tested storage contracts (substrate × Askr runtime). The
queue, cache and pub/sub contracts in
docs/contracts/are now executable, CI-verified specs:sqlanywhere/tests/contract_conformance.rsruns the exact contract SQL and asserts the documented semantics (queue at-least-once claim / priority / delay / dead-letter / backlog; cache TTL / atomic increment / SETNX locks / tag invalidation; pub/sub monotonic tail / cursor / retention). This is the substrate half of the Redis-free stack (epic elyra-2); the Askr runtime (askr/docs/STORAGE_BACKEND.md) now builds its L2 drivers against a proven contract that cannot silently drift.
0.5.1 - 2026-07-16
Another chapter, not another product: the everyday storage primitives — a KV cache with TTL, a durable work queue, and pub/sub — shown to compose out of plain SQL over the replicated SQLite engine, with no Redis/SQS/Kafka alongside.
Added
- Storage primitives, as chapters not products. A KV cache with TTL, a
durable work queue, and pub/sub all compose out of plain SQL over the
replicated SQLite engine — no Redis/SQS/Kafka alongside. The cache is a table
with an expiry column (lazy-filtering view + periodic sweep); the queue is a
table with an atomic
UPDATE … RETURNINGclaim and a visibility timeout (at-least-once); pub/sub is an append-only topic tailed by cursor, carried across nodes by the replication log. Newdocs/STORAGE_PRIMITIVES.md; demonstrated (sqlanywhere/examples/storage_primitives.rs) and verified (sqlanywhere/tests/storage_primitives.rs, 3 tests).
0.5.0 - 2026-07-16
Search, made whole and made honest. Full-text, faceted, vector and hybrid search
are unified as one engine, one chapter — not a separate product; real
semantic embeddings become first-class via a pluggable Embedder trait (with a
worked neural example); and every published Docker image is now smoke-tested on
both architectures.
Added
- Search, unified as one chapter (not a product). Full-text (FTS5 inverted
index), faceted (
GROUP BYover the matched set), vector (DiskANN) and hybrid (RRF) search are the same engine composed in plain SQL — no separate search service. Newdocs/SEARCH.mdties them together; faceted search is demonstrated (sqlanywhere/examples/faceted_search.rs) and verified (sqlanywhere/tests/faceted_search.rs, 3 tests: full-text match, facet counts, drill-down). - Pluggable embeddings (
Embeddertrait). Bring your own semantic model (local ONNX/candle, or a hosted API) and feed it into the samevector32(...)storage andvector_top_ksearch path as the built-in embedder. The dependency-freeembed()is now theLexicalEmbedderimplementation of this trait; ato_vector_literal()helper formats any raw vector forvector32. Output ofembed()is unchanged (back-compatible). - Worked semantic-search example (
examples/semantic-search) plugging a real local sentence-transformer (all-MiniLM-L6-v2 via candle) into theEmbeddertrait — kept out of the main workspace so its ML dependencies never touch the core build. Demonstrates true semantic matching (finds "the cat sat on the mat" for "a small feline rested on a rug"). - Docker release smoke test.
scripts/smoke-test-docker.shboots a published image and asserts the HTTP API serves a real vector search (vector_top_kover a DiskANN index). Wired intodocker.ymlto run on bothamd64andarm64after the manifest is published, so a broken release image can never pass silently.
0.4.0 - 2026-07-08
The flagship collaborative, syncable vector index — CRDT offline merge ×
DiskANN vector search × inline embed() — plus multi-arch Docker images for
Ubuntu Intel and ARM alongside the prebuilt binaries.
Added
- Collaborative, syncable vector index (experimental). The flagship
combination of CRDT offline merge × DiskANN vector search × inline
embed(): several devices build a semantic index offline and independently, then merge conflict-free — afterwards every device can vector-search over every device's documents (the index is maintained as cr-sqlite applies merged rows). Verified bysqlanywhere/tests/collab_vector.rs(a doc indexed only on node B becomes the nearest neighbour on node A after merge) and demonstrated bysqlanywhere/examples/collab_vector.rs. Guide:docs/COLLABORATIVE_VECTOR.md. - Docker images. Multi-arch
sqldcontainer images (linux/amd64andlinux/arm64) are built and published toghcr.io/kwhorne/sqlanywhere-serveron each release, alongside the prebuilt binaries.
0.3.1 - 2026-07-02
Experimental CRDT offline merge via the vendored cr-sqlite extension — conflict-free multi-writer offline sync, the other half of a local-first stack alongside embedded replicas. Additive and opt-in.
Added
- CRDT offline merge (experimental). The vendored cr-sqlite extension
(
sqlanywhere-sqlite3/ext/crr) now builds into a loadable extension viascripts/build-crsqlite.sh, turning tables into conflict-free replicated relations withcrsql_as_crr(...). Multiple databases can be edited offline and merged deterministically by exchangingcrsql_changesrows. Verified end to end (two nodes converge; concurrent same-row edits resolve the same way on both sides). Guide:docs/CRDT.md; continuously built by thecrsqlite.ymlCI workflow. Not yet bundled intosqldor the prebuilt binaries. - CRDT via the Rust API.
sqlanywhere/examples/crdt_sync.rsdemonstrates offline multi-writer merge driven entirely through thesqlanywhereclient (load_extension+crsql_as_crr+crsql_changes), andsqlanywhere/tests/crdt.rsasserts it (gated onSQLANYWHERE_CRSQLITE, run in CI against a freshly built extension). Prebuilt extensions are attached to releases for macOS Apple Silicon and Ubuntu Intel/ARM.
0.3.0 - 2026-06-24
Theme: vector-native edge. SQL Anywhere is one of the few engines to ship native vector search and bi-directional edge replication in the same file-compatible SQLite fork. 0.3.0 leans into that: it turns the vector engine into a batteries-included toolkit for local-first / edge RAG — embed text inline, index it compactly, and retrieve with fused semantic + keyword ranking, all inside one embedded database.
Everything below is additive and opt-in; databases that don't use the new features remain byte-compatible with stock SQLite.
Added
-
Hybrid search (vector + FTS5). Fuse DiskANN vector similarity with SQLite FTS5 full-text relevance in a single query using Reciprocal Rank Fusion (RRF), so documents strong in both signals rank highest — the state-of-the-art retrieval pattern for RAG. No new engine code: it composes primitives the engine already ships. Documented in the README; covered by
sqlanywhere/tests/hybrid_search.rs(3 tests). -
Vector quantization for the edge. The DiskANN index now accepts
compress_neighbors=float16|float8|float1bitto quantize the neighbour vectors stored in the graph. Measured on 800×32-dim cosine vectors the on-disk index shrinks 1.9× / 2.8× / 5.5× respectively while search keeps working — a large win on memory-constrained devices. Covered bysqlanywhere/tests/vector.rs(2 tests). -
embed()reference text embedder.sqlanywhere::embed(text, dims)turns text into an L2-normalized vector literal for inlinevector32(embed(text, dims)), so you can build a vector column without a separate pre-compute step. Uses the hashing trick (FNV-1a bag-of-words), so it is deterministic and dependency-free. It is lexical, not semantic — for production semantic search, compute embeddings with a real model and store them the same way. Covered bysrc/embed.rs(5 unit tests + doctest) andsqlanywhere/tests/embed.rs(E2E). -
Local RAG capstone example.
sqlanywhere/examples/local_rag.rsis a runnable, end-to-end retrieval pipeline in a single embedded database:embed()→ quantized (float8) DiskANN index → FTS5 keyword index → hybrid RRF retrieval. Run it withcargo run -p sqlanywhere --example local_rag. -
docs/VECTOR_SEARCH.md— a why / how / examples guide for all of the above, anddocs/ROADMAP.md— direction for the release.
Verification
- New automated tests for hybrid search, quantization and
embed()all run in CI. Vector search and replication were re-verified end to end (seesqlanywhere/tests/vector.rs,sqlanywhere/tests/replication.rs, and the serverembedded_replicasuite).
Notes
- CRDT offline-merge (cr-sqlite) remains on the roadmap; it requires a pinned
nightly toolchain plus
build-stdand C linking and is tracked as a separate effort.
0.2.0 - 2026-06-23
The first stabilization release after the initial fork. Focuses on build reproducibility, full independence from upstream packages, fixing rebrand-era bugs, and getting CI green across Linux and Windows.
Fixed
- WASM user-defined functions: corrected a truncated internal table name
(
sqlanywhere_wasm_func_table) caused by a hard-coded string length left over from the rename. WASM UDFs failed withno such table: sqlanywhere_wasm_func_before this fix. Patched in bothsrc/and the bundled amalgamations. - Native library name: the SQLite-compatible C library now builds
consistently as
libsqlanywhere.{a,la,dylib}/sqlanywhere.lib. The rename had accidentally produced an invalidsqlite3.la(nolibprefix, rejected by libtool) and a mangledsqlanywhereite3target. - Autotools/MSVC build: regenerated
autoconf/Makefile.mscfromMakefile.mscsosrctree-checkpasses again. - P0 safety issues:
- Documented the
Send/Syncsoundness oflocal::Rows(SQLITE_THREADSAFE,Arcownership, single-taskRefCellaccess). - Hardened
bottomless::Replicator::wait_until_snapshottedwith explicit control flow and clear error semantics. - Removed a TOCTOU race in namespace fork (redundant existence check before the lock-guarded check).
- Documented the
- Applied
cargo fmtacross the workspace.
Changed
- Full independence from upstream crates.io packages: replaced the external
libsql-client(dev) andlibsql-wasmtime-bindingsdependencies. The bottomless integration test now dogfoods the in-treesqlanywhereclient, and the WASM runtime uses the in-treewasmtime-bindingscrate. - Renamed the C-binding crate
sql-experimental→sqlanywhere-experimental(outputlibsqlanywhere_experimental.a), removing the lastlibsql-looking artifact. - Modernized CI:
actions/checkoutv2/v3 → v4,actions/cachev3 → v4, replaced deprecatedactions-rs/cargo@v1with directcargocommands; Windows builds skip theencryptionfeature (no Visual Studio CMake generator on runners). - Added/normalized
Cargo.tomldescriptions and keywords for all crates. - Documentation links now point to https://elyracode.com/docs/sqlanywhere;
source links point to
github.com/kwhorne/sql-anywhere.
Added
CHANGELOG.md(this file).docs/TECH_DEBT.md— a categorized inventory of the inherited code markers (35 FIXME, 59 TODO, 1 HACK, 2 XXX) with recommended priorities.- Build prerequisites table in the README (Rust, C compiler, libclang, protoc,
cmake) with per-OS install commands; CI installs cmake where the
encryptionfeature is built. workflow_dispatchtriggers on the core CI workflows for manual runs.
CI status
Green on Linux and Windows for: Rust (fmt/check/test/encryption), C bindings, Extensions (vector, UDF, cr-sqlite), and the Makefile/WASM SQLite test suite.
0.1.0 - 2026-06-21
Initial release of SQL Anywhere — an embeddable, replication-ready SQL engine built on SQLite, maintained by Elyra.
Added
- Complete fork and rebrand to SQL Anywhere across the entire codebase: Rust crates, the SQLite C fork, FFI bindings, bundled amalgamations, and binary test fixtures (WASM modules and the DiskANN vector-index database).
- Embedded Rust API (
sqlanywhere), server (sqld/sqlanywhere-server), Hrana remote protocol, replication primitives, and bottomless S3-backed WAL replication. - Original project README, set the workspace and C-library version to
0.1.0, and published thev0.1.0tag and GitHub release.