ApexBase v1.28.0
2026-08-06
- Fix
create_tablesilently rebuilding an existing table: table names are now managed by a per-database metadata registry (binary.apex_tablescatalog), so a fresh process callingcreate_tableon an existing table raisesTable already existsinstead of wiping data;CREATE/DROP/ALTERand cross-process creation are serialized by an exclusive catalog lock - Fix
WHERE+ORDER BY ... DESC LIMITreturning rows only from the first matching row group: filtered scans now read the full matching set before global top-k sorting, and non-projectedORDER BYcolumns (including_id) are read so sorting is always applied - Unify internal
_idvisibility: explicitly projecting_idreturns it consistently before and after flush, independent of which cached read path handles the query - Add a native batch numeric UPDATE path used by
execute_batchforUPDATE ... SET <numeric col> = <literal> WHERE _id = N, reducing a 10,000-row backfill from roughly 28-40 seconds to about 0.1 seconds, and expose a projected mmap row-read API on the Rust crate - Add general SQL parameter binding to the Python client: positional
?, named:name/@name/$name, IN-list expansion, string escaping, and arity/type validation, while keeping the TopK vector FFI fast path - Introduce a binary, memory-mapped table catalog with per-entry CRC tamper detection, generation-based snapshot caching, and legacy
*.apexbackfill; the registry is the authoritative source of table names across processes - Optimize core query routing: SQL classification results are cached in the core, and primary-key point/batch reads execute through a single combined FFI call on direct mmap readers, improving point lookups and projected ID batch reads
- Add cross-engine table-operation benchmarks (CREATE, DROP, CREATE+DROP, LIST, ALTER) and canary coverage, plus regression tests for the catalog, ORDER BY correctness, parameter binding, and batch updates
- Update the Rust crate and Python package version metadata to 1.28.0