Changelog

v0.4.0 (2026-09-12)

  • Filtering multiple files without --columns failed when a column was null in one file and int32 in another. It now combines compatible column types automatically and retains all columns.

  • Numeric types depended on the first file. For example, uint8 followed by double could fail on fractional values; both orders now use double.

  • A column present only in a later file was omitted from output and could not be filtered. It is now available in either file order, with nulls where absent.

  • Stored pandas dtypes could narrow promoted values, and a missing earlier column could round 2**53 + 1. Nullable integer widening and newly inserted nulls now preserve 64-bit integer values in pqfilt.read().

  • Increase the minimum PyArrow version from 10 to 14 for numeric schema promotion.

v0.3.1 (2026-09-07)

  • Save output atomically: failures preserve existing files; overwrite=False also protects files created during the scan.

  • Reject hard links to input files as streaming output destinations.

  • Expand glob patterns in source lists and accept literal filenames containing brackets. Read each file once, including repeated paths and file aliases.

  • Preserve Arrow’s unknown result for DataFrame comparisons against None, including negated comparisons.

  • Validate release versions and installed distributions before publishing. Select CI Python versions explicitly and exclude local planning files from sdists.

v0.3.0 (2026-07-14)

v0.2.2 (2026-06-19)

  • Critical bug in CLI: per_file option was removed in 0.2.0 but CLI still referenced it, causing a crash. Fixed.

v0.2.1 (2026-06-15)

  • Exported to_pyarrow_expr in the public API (previously internal).

v0.2.0 (2026-06-15)

  • Breaking: removed per_file parameter from read().

  • Added is null / is not null operators.

  • Added ~ prefix negation (NotExpr).

  • Fixed quoted literals ('a|b', 'a&b', etc.) being split on structural characters.

  • Fixed in/not in list items with commas inside quotes (desig in 'a,b', 'c').

  • Fixed boolean column filtering: True/False strings now coerce to bool before pyarrow pushdown.

  • Multi-file reads now use a single ds.dataset(files) call (parallel I/O).

  • Parquet output now uses pq.write_table to preserve Arrow type fidelity.

  • Added filter_df(df, filters) to apply the same filter syntax to an already-loaded DataFrame.

v0.1.6 (2026-04-29)

  • True/False string literals (case-insensitive) are now converted to Python bool before pyarrow, preventing type-mismatch errors on boolean columns.

v0.1.5 (2026-02-23)

  • list/tuple: in/not in value lists now accept bracket/parenthesis enclosures. * "desig in [1, 2, 3]" and "desig in (1, 2, 3)" work in addition to the bare comma-separated form.

  • Bugfix a few edge cases.

v0.1.4 (2026-02-23)

  • Similar fix as 0.1.3: Fixed in/not in value parsing * "desig in '356', '3200'" are preserved as strings.

v0.1.3 (2026-02-23)

  • Fixed quoted scalar values * "name == '42'" now correctly preserves '42' as a string instead of coercing it to the integer 42.

v0.1.2 (2026-02-21)

  • version bump only.

v0.1.1 (2026-02-21)

  • Added Python 3.9 support.

  • Fixed Sphinx documentation build warnings.

v0.1.0 (2026-02-21)

  • Initial release.

  • Core read() function with predicate-pushdown via pyarrow.dataset.

  • Expression parser supporting &, |, parentheses, in/not in.

  • Backtick quoting for column names with special characters.

  • Tuple and DNF filter syntax.

  • CLI tool (pqfilt) with -f expression option.

  • Multi-file and glob support.

  • Output to Parquet or CSV.