Skip to content

Commit 3388c15

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 ec2c602 commit 3388c15

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
@@ -430,6 +430,12 @@ fn apply_byte_range(
430430
}
431431

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

@@ -495,6 +501,9 @@ mod tests {
495501
#[case(50..105, 100, 105, 50..100)]
496502
#[case(0..1, 4, 8, 0..0)]
497503
#[case(1..8, 4, 8, 0..4)]
504+
#[case(0..100, 0, 100, 0..0)]
505+
#[case(10..50, 0, 0, 0..0)]
506+
#[case(0..1, 0, 1, 0..0)]
498507
fn test_range_translation(
499508
#[case] byte_range: Range<u64>,
500509
#[case] row_count: u64,

0 commit comments

Comments
 (0)