Skip to content

Commit 22bd055

Browse files
committed
fix: support total_size=0 in byte_range_to_row_range
In certain cases DataFusion might decide to create a ranges for empty files that have zero rows. In order to avoid hitting a division by zero error in the ```rust let average_row = total_size / row_count; ``` line, add a case to `byte_range_to_row_range` that returns an empty 0..0 range in cases when row_count is 0.
1 parent 18359a8 commit 22bd055

1 file changed

Lines changed: 9 additions & 0 deletions

File tree

vortex-datafusion/src/persistent/opener.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,12 @@ fn apply_byte_range(
432432
}
433433

434434
fn byte_range_to_row_range(byte_range: Range<u64>, row_count: u64, total_size: u64) -> Range<u64> {
435+
// Datafusion might generate ranges for files with no rows. In such cases,
436+
// we return an empty range.
437+
if row_count == 0 {
438+
return 0..0;
439+
}
440+
435441
let average_row = total_size / row_count;
436442
assert!(average_row > 0, "A row must always have at least one byte");
437443

@@ -497,6 +503,9 @@ mod tests {
497503
#[case(50..105, 100, 105, 50..100)]
498504
#[case(0..1, 4, 8, 0..0)]
499505
#[case(1..8, 4, 8, 0..4)]
506+
#[case(0..100, 0, 100, 0..0)]
507+
#[case(10..50, 0, 0, 0..0)]
508+
#[case(0..1, 0, 1, 0..0)]
500509
fn test_range_translation(
501510
#[case] byte_range: Range<u64>,
502511
#[case] row_count: u64,

0 commit comments

Comments
 (0)