Skip to content

Commit 282a01a

Browse files
committed
fix: ensure that equality delete predicate builder correctly handles null values in eq del file
1 parent db2b10a commit 282a01a

File tree

1 file changed

+7
-5
lines changed

1 file changed

+7
-5
lines changed

crates/iceberg/src/arrow/caching_delete_file_loader.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -356,10 +356,12 @@ impl CachingDeleteFileLoader {
356356
let mut row_predicate = AlwaysTrue;
357357
for &mut (ref mut column, ref field_name) in &mut datum_columns_with_names {
358358
if let Some(item) = column.next() {
359-
if let Some(datum) = item? {
360-
row_predicate = row_predicate
361-
.and(Reference::new(field_name.clone()).equal_to(datum.clone()));
362-
}
359+
let cell_predicate = if let Some(datum) = item? {
360+
Reference::new(field_name.clone()).equal_to(datum.clone())
361+
} else {
362+
Reference::new(field_name.clone()).is_null()
363+
};
364+
row_predicate = row_predicate.and(cell_predicate)
363365
}
364366
}
365367
result_predicate = result_predicate.and(row_predicate.not());
@@ -485,7 +487,7 @@ mod tests {
485487
.expect("error parsing batch stream");
486488
println!("{}", parsed_eq_delete);
487489

488-
let expected = "(((y != 1) OR (z != 100)) OR (a != \"HELP\")) AND (y != 2)".to_string();
490+
let expected = "(((y != 1) OR (z != 100)) OR (a != \"HELP\")) AND (((y != 2) OR (z IS NOT NULL)) OR (a IS NOT NULL))".to_string();
489491

490492
assert_eq!(parsed_eq_delete.to_string(), expected);
491493
}

0 commit comments

Comments
 (0)