v0.18.52
v0.18.52
Parquet writer, scan, and ingest correctness hardening — eight data-corruption gaps, each found by an adversarial probe of a path that reported success while returning or storing wrong data, and each now made right or refused.
- Parquet writer: a float column with a leading or all-NaN run no longer writes NaN min/max statistics (which could mis-prune a row group). (#928)
- Parquet writer: a page whose bytes exceed the Parquet 2GB page-size limit is refused loudly instead of overflowing its size field and finalizing a corrupt file. (#929)
- Parquet: a nested MAP KEY of any type (DECIMAL, DATE, TIMESTAMP, IPv4/IPv6, MAC, UUID, CIDR, BYTES) round-trips exactly, instead of a decimal key being rescaled or a date/network/bytes key being lost. (#883)
- Scan: a decoded-cache hit applies the same DECIMAL precision/overflow check as a cold read, so an out-of-range value raises instead of being served from a warm cache. (#914)
- Scan: dictionary pruning reconciles a DECIMAL predicate and the file's dictionary to a common scale before comparing, so a file declaring a different scale can no longer prune a matching row group. (#916)
- Ingest: a partially-rejected batch no longer duplicates its accepted prefix on retry —
Ingestis all-or-nothing. (#917) - Ingest: buffered rows are deep-copied, so reusing or mutating the maps and byte slices you passed to
Ingestno longer corrupts not-yet-flushed rows. (#918) - Ingest: an ingester whose table was dropped and recreated no longer flushes its buffered rows into the new table; the stale flush is refused. (#919)