Skip to content

v0.18.52

Choose a tag to compare

@derekmwright derekmwright released this 06 Sep 17:02

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 — Ingest is all-or-nothing. (#917)
  • Ingest: buffered rows are deep-copied, so reusing or mutating the maps and byte slices you passed to Ingest no 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)