Skip to content

Commit 789390e

Browse files
authored
Fix panic when hashing empty FixedSizeList Array (#13533)
* Fix panic when hashing empty FixedSizeList Array Previously it would panic due to division by zero. * simplify code
1 parent 1a6e9f5 commit 789390e

File tree

1 file changed

+14
-4
lines changed

1 file changed

+14
-4
lines changed

datafusion/common/src/hash_utils.rs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -321,16 +321,16 @@ fn hash_fixed_list_array(
321321
hashes_buffer: &mut [u64],
322322
) -> Result<()> {
323323
let values = Arc::clone(array.values());
324-
let value_len = array.value_length();
325-
let offset_size = value_len as usize / array.len();
324+
let value_length = array.value_length() as usize;
326325
let nulls = array.nulls();
327326
let mut values_hashes = vec![0u64; values.len()];
328327
create_hashes(&[values], random_state, &mut values_hashes)?;
329328
if let Some(nulls) = nulls {
330329
for i in 0..array.len() {
331330
if nulls.is_valid(i) {
332331
let hash = &mut hashes_buffer[i];
333-
for values_hash in &values_hashes[i * offset_size..(i + 1) * offset_size]
332+
for values_hash in
333+
&values_hashes[i * value_length..(i + 1) * value_length]
334334
{
335335
*hash = combine_hashes(*hash, *values_hash);
336336
}
@@ -339,7 +339,7 @@ fn hash_fixed_list_array(
339339
} else {
340340
for i in 0..array.len() {
341341
let hash = &mut hashes_buffer[i];
342-
for values_hash in &values_hashes[i * offset_size..(i + 1) * offset_size] {
342+
for values_hash in &values_hashes[i * value_length..(i + 1) * value_length] {
343343
*hash = combine_hashes(*hash, *values_hash);
344344
}
345345
}
@@ -454,6 +454,16 @@ mod tests {
454454
Ok(())
455455
}
456456

457+
#[test]
458+
fn create_hashes_for_empty_fixed_size_lit() -> Result<()> {
459+
let empty_array = FixedSizeListBuilder::new(StringBuilder::new(), 1).finish();
460+
let random_state = RandomState::with_seeds(0, 0, 0, 0);
461+
let hashes_buff = &mut vec![0; 0];
462+
let hashes = create_hashes(&[Arc::new(empty_array)], &random_state, hashes_buff)?;
463+
assert_eq!(hashes, &Vec::<u64>::new());
464+
Ok(())
465+
}
466+
457467
#[test]
458468
fn create_hashes_for_float_arrays() -> Result<()> {
459469
let f32_arr = Arc::new(Float32Array::from(vec![0.12, 0.5, 1f32, 444.7]));

0 commit comments

Comments
 (0)