CQLite v0.17.0
CQLite v0.17.0 — read correctness and read-path performance
Section titled “CQLite v0.17.0 — read correctness and read-path performance”The largest CQLite release so far: 97 issues across a read-correctness campaign against Cassandra-written bytes, a measured read-path performance program on the Arrow Flight server, a unified value and error contract across Python, Node and the CLI, and the platform-hygiene epics. It targets stock Cassandra 5.0 with no server-side changes. Full detail with every breaking change: release notes and the CHANGELOG.
🔍 Read correctness: refuse or decode, never invent
Section titled “🔍 Read correctness: refuse or decode, never invent”A family of silent-wrong-answer defects is closed. Row assembly no longer swallows a decode error
into a truncated row (#3721); a P0 misaligned cell offset on point reads is fixed (#3890); the BTI
Rows.db row-index root base matches Cassandra’s framing (#3002); empty map keys and empty set
members are kept, not dropped (#3747, #4106); nested types are bounds-checked at every level
(#3723, #3778, #3809, #3811); inet/time order as Cassandra orders them (#3790, #3935); and
frozen<scalar> — not declarable CQL — is refused instead of guessed (#4104), which exposed and
fixed a writer defect in the Statistics.db header type for frozen<UDT> (#4158). Two new parity
lanes pin JSON/CSV and Parquet output against the sstabledump goldens (#1490, #1491).
⚡ Read-path performance, measured before optimised
Section titled “⚡ Read-path performance, measured before optimised”- 3.06× per core on Flight
do_getover a single SSTable — the k-way merge is bypassed when there is nothing to merge (#3058). Head-to-head on one core against stock Cassandra reading the same SSTable: 1.25× itscount(*)on the bare read path, 1.12× itsSELECT *when shipping every row. - Admission default follows core count instead of a fixed 64 (#3225); byte-bounded Arrow batches and a wired per-stream budget (#2825, #2821).
- Box ceiling established at 2.73M rows/s on 6 physical cores (#3299); jemalloc measured +29%
to +61% (#3551) and ships as an opt-in
cqlite-flightfeature, default pending #4120. - On a 3-node Cassandra 5.0.9 cluster, a full-table analytic through CQLite cost the OLTP client
2.21× baseline p99 vs 5.61× through Cassandra’s own CQL path; the same Trino SQL ran
1.66× faster through the
cqlitecatalog than the stock connector. Single-pod results — see known issues.
🧩 One value and error contract across bindings
Section titled “🧩 One value and error contract across bindings”A shared authoritative error table (#1451), a 3-way golden parity harness where the same SELECT
through Python, Node and the CLI must agree (#1455), UDT identity carried out of band, and CI that
tests the claimed Python 3.9 and Node 18 floors (#1459).
🧹 Platform hygiene
Section titled “🧹 Platform hygiene”Correctness landmines closed (Epic AG), ~40 decorative config knobs deleted and Config::validate()
made honest (#1696, #1697), the four dead read metrics wired (#1701), pub mod benchmarks
un-exported and never-compiled code removed (Epic AK).
⚠️ Breaking changes
Section titled “⚠️ Breaking changes”Value::Empty added to cqlite-core’s Value enum; Config.storage is the single storage config;
CLI JSON renders decimal/varint unquoted, drops the injected UDT _type key and no longer
widens float; bindings carry UDT identity out of band and Python decimal has one rendering;
--max-concurrent-scans default derives from parallelism. Consumer guidance for each is in the
CHANGELOG.
Known issues
Section titled “Known issues”A scan over an unreadable SSTable still returns empty rather than an error (#4159, pre-existing,
fixed in 0.18). Field-found: an unbounded count(*) through the Trino cqlite catalog can stall
(#4170); scans are served by one Flight pod, so multi-node fan-out is unmeasured (#4175);
timeuuid maps to varchar (#4173). The Trino connector 0.17.0 is content-identical to 0.16.1.
Get it
Section titled “Get it”brew install pmcfadin/cqlite/cqlite # CLI (macOS + Linux)cargo add cqlite-core # Rust librarypip install cqlite-py # Pythonnpm install @cqlite/node # Node.js