Skip to content

Commit 15715de

Browse files
authored
chore: Fix bug with extend_nulls (#9)
1 parent 9a66768 commit 15715de

File tree

1 file changed

+38
-3
lines changed
  • arrow/src/array/transform

1 file changed

+38
-3
lines changed

arrow/src/array/transform/mod.rs

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -614,10 +614,12 @@ impl<'a> MutableArrayData<'a> {
614614

615615
/// Extends this [MutableArrayData] with null elements, disregarding the bound arrays
616616
pub fn extend_nulls(&mut self, len: usize) {
617-
// TODO: null_buffer should probably be extended here as well
618-
// otherwise is_valid() could later panic
619-
// add test to confirm
620617
self.data.null_count += len;
618+
619+
let null_bytes_count = bit_util::ceil(self.data.len + len, 8);
620+
if null_bytes_count > self.data.null_buffer.len() {
621+
self.data.null_buffer.resize(null_bytes_count, 0x00);
622+
}
621623
(self.extend_nulls)(&mut self.data, len);
622624
self.data.len += len;
623625
}
@@ -730,6 +732,39 @@ mod tests {
730732
assert_eq!(array, expected);
731733
}
732734

735+
#[test]
736+
fn test_extend_nulls() {
737+
let b = UInt8Array::from(vec![Some(1), Some(2), Some(3)]);
738+
let arrays = vec![b.data()];
739+
let mut a = MutableArrayData::new(arrays, true, 2);
740+
assert_eq!(a.data.null_buffer.len(), 1);
741+
a.extend(0, 0, 3);
742+
a.extend_nulls(6);
743+
assert_eq!(a.data.null_buffer.len(), 2);
744+
let result = a.freeze();
745+
let array = UInt8Array::from(result);
746+
assert_eq!(array.data().null_buffer().unwrap().len(), 2);
747+
let expected = UInt8Array::from(vec![Some(1), Some(2), Some(3), None, None, None, None, None, None]);
748+
assert_eq!(array, expected);
749+
750+
let b = UInt8Array::from(vec![Some(1), Some(2), Some(3)]);
751+
let arrays = vec![b.data()];
752+
let mut a = MutableArrayData::new(arrays, true, 2);
753+
assert_eq!(a.data.null_buffer.len(), 1);
754+
a.extend(0, 0, 3);
755+
a.extend_nulls(6);
756+
assert_eq!(a.data.null_buffer.len(), 2);
757+
a.extend(0, 0, 3);
758+
assert_eq!(a.data.null_buffer.len(), 2);
759+
let result = a.freeze();
760+
let array = UInt8Array::from(result);
761+
assert_eq!(array.data().null_buffer().unwrap().len(), 2);
762+
let expected = UInt8Array::from(vec![Some(1), Some(2), Some(3), None, None, None, None, None, None, Some(1), Some(2), Some(3)]);
763+
assert_eq!(array, expected);
764+
765+
}
766+
767+
733768
#[test]
734769
fn test_list_null_offset() -> Result<()> {
735770
let int_builder = Int64Builder::new(24);

0 commit comments

Comments
 (0)