From 7f4a2894f7166ae75928c5e09a9aa55aa9666890 Mon Sep 17 00:00:00 2001 From: Ritchie Vink Date: Tue, 6 Dec 2022 07:34:27 +0100 Subject: [PATCH] Fixed failing to accept dictionary full of nulls (#1312) --- src/array/dictionary/mod.rs | 4 +++- tests/it/array/dictionary/mod.rs | 14 ++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) 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"]);