You are viewing a plain text version of this content. The canonical link for it is here.
Posted to github@datafusion.apache.org by "robertream (via GitHub)" <gi...@apache.org> on 2025/07/26 02:04:35 UTC
[PR] Fix infinite loop in replace_with_partial_sort function (#16899) [datafusion]
robertream opened a new pull request, #16920:
URL: https://github.com/apache/datafusion/pull/16920
## Summary
Fixes issue #16899 - "Entire input is resorted when the data is partially sorted (not using `PartialSortExec`)"
This PR addresses a bug in the `replace_with_partial_sort` function that could cause infinite loops when determining the common prefix length for partial sorting optimization.
## What changed?
- **Fixed infinite loop bug**: Added bounds check in the while loop to prevent infinite iteration when all sort expressions are satisfied by the input ordering
- **Added comprehensive test**: New test case `test_partial_sort_with_prefix_ordering` that reproduces the exact scenario described in the issue
- **Maintains existing behavior**: All existing functionality preserved, only fixes the edge case bug
## Technical Details
The bug was in `/datafusion/physical-optimizer/src/enforce_sorting/mod.rs` at lines 284-290. The while loop would continue indefinitely when `child_eq_properties.ordering_satisfy()` returned `true` for all sort expressions, because there was no bounds check on `common_prefix_length`.
**Before (buggy):**
```rust
let mut common_prefix_length = 0;
while child_eq_properties
.ordering_satisfy(sort_exprs[0..common_prefix_length + 1].to_vec())?
{
common_prefix_length += 1;
}
```
**After (fixed):**
```rust
let mut common_prefix_length = 0;
while common_prefix_length < sort_exprs.len()
&& child_eq_properties
.ordering_satisfy(sort_exprs[0..common_prefix_length + 1].to_vec())?
{
common_prefix_length += 1;
}
```
## Test plan
- [x] New test `test_partial_sort_with_prefix_ordering` verifies the fix works correctly
- [x] All existing enforce_sorting tests continue to pass (59/59 tests)
- [x] Ensures `PartialSortExec` is correctly used when data has partial sort order
- [x] Verifies no regression in existing functionality
The fix now properly detects when data has a partial sort order and uses `PartialSortExec` with the correct `common_prefix_length`, providing better memory efficiency and performance for partially sorted data.
🤖 Generated with [Claude Code](https://claude.ai/code)
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@datafusion.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: github-unsubscribe@datafusion.apache.org
For additional commands, e-mail: github-help@datafusion.apache.org
Re: [PR] Fix infinite loop in replace_with_partial_sort function (#16899) [datafusion]
Posted by "robertream (via GitHub)" <gi...@apache.org>.
robertream closed pull request #16920: Fix infinite loop in replace_with_partial_sort function (#16899)
URL: https://github.com/apache/datafusion/pull/16920
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: github-unsubscribe@datafusion.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: github-unsubscribe@datafusion.apache.org
For additional commands, e-mail: github-help@datafusion.apache.org