v0.16.1
Patch release.
Fixed
filter-pushdown: drop a fully-degraded AND instead of emitting WHERE () (#e3c50a6)
An AND whose children all failed to parse produced AndFilter(children=()), which rendered as (). Callers appending WHERE {clause} when the clause is truthy then built a syntactically invalid statement:
ParserException: syntax error at or near ")"
... "trade_canceled", "_partition_date" FROM src WHERE () LIMIT 50000
_parse_filter returns None for a join-key filter whose keys column cannot be resolved (graceful degradation — DuckDB filters client-side). Dropping such a child from an AND is safe on its own, but when every child dropped the conjunction was left empty. Triggering it required a query joining against a pushdown-enabled table where none of the dynamic join-key columns resolved, so it surfaced intermittently rather than reproducibly.
The OR branch already guarded this case; the AND branch now does too, returning None so the filter is reported unusable.
_filter_to_sql is additionally hardened against any other construction path: an empty AND renders as TRUE, an empty OR as FALSE — the correct identities, notably FALSE for OR so an empty disjunction cannot silently widen the result set.