Skip to content

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_get over 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× its count(*) on the bare read path, 1.12× its SELECT * 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-flight feature, 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 cqlite catalog 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).

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).

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.

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.

Terminal window
brew install pmcfadin/cqlite/cqlite # CLI (macOS + Linux)
cargo add cqlite-core # Rust library
pip install cqlite-py # Python
npm install @cqlite/node # Node.js