diff --git a/src/array/dictionary/mod.rs b/src/array/dictionary/mod.rs index 8b62c91dce9..63cdfc7fa7d 100644 --- a/src/array/dictionary/mod.rs +++ b/src/array/dictionary/mod.rs @@ -119,7 +119,9 @@ impl DictionaryArray { ) -> Result { check_data_type(K::KEY_TYPE, &data_type, values.data_type())?; - check_indexes(keys.values(), values.len())?; + if keys.null_count() != keys.len() { + check_indexes(keys.values(), values.len())?; + } Ok(Self { data_type, diff --git a/tests/it/array/dictionary/mod.rs b/tests/it/array/dictionary/mod.rs index 84c16b49cde..b139c94c532 100644 --- a/tests/it/array/dictionary/mod.rs +++ b/tests/it/array/dictionary/mod.rs @@ -40,6 +40,20 @@ fn try_new_incorrect_key() { assert!(r); } +#[test] +fn try_new_nulls() { + let key: Option = None; + let keys = PrimitiveArray::from_iter([key]); + let value: &[&str] = &[]; + let values = Utf8Array::::from_slice(value); + + let data_type = + DataType::Dictionary(u32::KEY_TYPE, Box::new(values.data_type().clone()), false); + let r = DictionaryArray::try_new(data_type, keys, values.boxed()).is_ok(); + + assert!(r); +} + #[test] fn try_new_incorrect_dt() { let values = Utf8Array::::from_slice(["a", "aa"]);