Repository navigation
fix: ignore NaN sign bits in filters - #9324
lance-gatefixer[bot] wants to merge 6 commits into
Conversation
|
Addressed in 3e35bc6: ordered literal comparisons remain scalar-indexable, including computed JSON paths, and mem-WAL combines the NaN guard into one exact range. The additional |
|
Blocked: PR #9324 still requires an approving review before it can merge. Remote head I revalidated every current Review and inline thread: there are no new actionable requests, and the existing App disposition remains later than the only prior author-facing performance concern. A maintainer can approve the PR; alternatively, Gatekeeper can issue its canonical approval if the documented non-blocking performance risk is acceptable. |
|
Blocked: PR #9324 still requires an approving review before it can merge. Remote head I revalidated all current Reviews, inline threads, and later external contributions: there are no new actionable requests, and the existing App disposition remains valid for the prior performance concern. A maintainer can approve the PR; alternatively, Gatekeeper can issue its canonical approval if the documented non-blocking performance risk is acceptable. |
There was a problem hiding this comment.
The three previously reported blockers are fixed. The NaN repair remains read-side and bit-preserving, with reconstructible filters, single evaluation of volatile operands, and selective two-sided index ranges.
The author’s accepted extra −∞ boundary work for one-sided predicates remains non-blocking. Computed comparisons still scan operands for normalization and may allocate when negative NaNs are present; representative workload performance remains unbenchmarked. Performance-sensitive adopters should benchmark their float filters.
|
Blocked: A maintainer must decide whether #9324 should continue or be replaced by #9628. At remote head Compatibility Tests (GitHub Actions app Confirm that #9324 should continue, allowing the upstream harness correction to be integrated and validated. Alternatively, retire #9324 in favor of #9628 and direct further repair work there. |
|
Bots, please focus on #9628 instead and stop working on this PR. Reasons are: #9628 fixes more
#9628 is faster
Same size
Nothing from this PR is lost
|
Summary
-inflower bounds and restoring one selective index rangeRoot cause
Arrow comparison and scalar-index kernels use total ordering, which places sign-bit-set NaNs below negative infinity while positive NaNs sort above finite values. Lance already rewrote signed-zero literals but did not normalize NaN signs, so logically equivalent NaNs produced different filter results.
The regression tests also pin single evaluation of volatile operands and codec reconstruction. A cold BTree regression with 512 finite values loads one page for
[1, 2], instead of the nine pages loaded by the unsimplified range plan. One-sided>and>=retain the additional negative-NaN boundary search.Validation
cargo test -p lance-datafusion --features substraitcargo test -p lance-index scalar::expression::testscargo test -p lance-index scalar::zonemap::tests::test_nan_zonemap_indexcargo test -p lance --lib --features slow_tests dataset::mem_wal::memtable::scanner::builder::testscargo test -p lance --test integration_tests --features slow_tests query::primitives::test_nan_sign_is_ignored_in_column_comparisonscargo test -p lance --test integration_tests --features slow_tests query::primitives::test_query_float_special_valuescargo test -p lance --test integration_tests --features slow_tests query::primitives::test_float_zero_predicate_uses_scalar_indexcargo fmt --allcargo clippy --all --tests --benches -- -D warningsmake build,uv run make lint, anduv run --no-sync pytest python/tests/test_scalar_index.py::test_nan_handlingFixes #9315