diff --git a/arrow-cast/src/cast/dictionary.rs b/arrow-cast/src/cast/dictionary.rs index 0092bc0c87dd..601f50a4d001 100644 --- a/arrow-cast/src/cast/dictionary.rs +++ b/arrow-cast/src/cast/dictionary.rs @@ -361,22 +361,18 @@ where D: DecimalType + ArrowPrimitiveType, { let dict = pack_numeric_to_dictionary::(array, dict_value_type, cast_options)?; - let dict = dict - .as_dictionary::() - .downcast_dict::>() - .ok_or_else(|| { - ArrowError::ComputeError(format!( - "Internal Error: Cannot cast dict to {}Array", - D::PREFIX - )) - })?; - let value = dict.values().clone(); - // Set correct precision/scale - let value = value.with_precision_and_scale(precision, scale)?; - Ok(Arc::new(DictionaryArray::::try_new( - dict.keys().clone(), - Arc::new(value), - )?)) + let dict = dict.as_dictionary::(); + let typed = dict.downcast_dict::>().ok_or_else(|| { + ArrowError::ComputeError(format!( + "Internal Error: Cannot cast dict to {}Array", + D::PREFIX + )) + })?; + let value = typed + .values() + .clone() + .with_precision_and_scale(precision, scale)?; + Ok(Arc::new(dict.with_values(Arc::new(value)))) } pub(crate) fn string_view_to_dictionary( diff --git a/arrow-string/src/substring.rs b/arrow-string/src/substring.rs index 05b3888a444a..3dc3bd695c44 100644 --- a/arrow-string/src/substring.rs +++ b/arrow-string/src/substring.rs @@ -86,8 +86,7 @@ pub fn substring( stringify!($gt), array.data_type()) }); let values = substring(dict.values(), start, length)?; - let result = DictionaryArray::try_new(dict.keys().clone(), values)?; - Ok(Arc::new(result)) + Ok(Arc::new(dict.with_values(values))) }, )* t => panic!("Unsupported dictionary key type: {}", t)