diff --git a/rust/lance-arrow/src/scalar.rs b/rust/lance-arrow/src/scalar.rs index f32a831648b..b320f74dc5d 100644 --- a/rust/lance-arrow/src/scalar.rs +++ b/rust/lance-arrow/src/scalar.rs @@ -184,7 +184,12 @@ pub fn try_inline_value(scalar: &ArrayRef) -> Option> { if data.buffers().len() != 1 { return None; } + + let byte_width = data.data_type().byte_width_opt(); let bytes = data.buffers()[0].as_slice(); + if byte_width.map(|width| bytes.len() != width).unwrap_or(true) { + return None; + } if bytes.len() > INLINE_VALUE_MAX_BYTES { return None; } diff --git a/rust/lance-encoding/src/encodings/logical/primitive.rs b/rust/lance-encoding/src/encodings/logical/primitive.rs index 9e22c414d48..c7f484ff1d1 100644 --- a/rust/lance-encoding/src/encodings/logical/primitive.rs +++ b/rust/lance-encoding/src/encodings/logical/primitive.rs @@ -6352,6 +6352,42 @@ mod tests { check_round_trip_encoding_of_data(vec![arr], &test_cases, HashMap::new()).await; } + #[tokio::test] + async fn test_constant_layout_out_of_line_boolean() { + use crate::format::pb21::page_layout::Layout; + use strum::IntoEnumIterator; + + let versions: Vec = LanceFileVersion::iter() + .filter(|version| { + let (major, minor) = version.to_numbers(); + major >= 2 && minor >= 2 + }) + .collect(); + + for version in versions { + let arr: ArrayRef = Arc::new(arrow_array::BooleanArray::from_iter( + std::iter::repeat_n(Some(true), 512), + )); + let field = arrow_schema::Field::new("c", DataType::Boolean, true); + let page = encode_first_page(field, arr.clone(), version).await; + + let PageEncoding::Structural(layout) = &page.description else { + panic!("Expected structural encoding"); + }; + let Layout::ConstantLayout(layout) = layout.layout.as_ref().unwrap() else { + panic!("Expected constant layout in slot 2"); + }; + assert!(layout.inline_value.is_none()); + assert_eq!(page.data.len(), 1); + + let test_cases = TestCases::default() + .with_min_file_version(version) + .with_max_file_version(version) + .with_page_sizes(vec![4096]); + check_round_trip_encoding_of_data(vec![arr], &test_cases, HashMap::new()).await; + } + } + #[tokio::test] async fn test_constant_layout_nullable_item_v2_2() { use crate::format::pb21::page_layout::Layout;