|
17 | 17 | use std::sync::Arc;
|
18 | 18 |
|
19 | 19 | use arrow::compute::cast;
|
20 |
| -use arrow_array::{cast::AsArray, FixedSizeListArray}; |
| 20 | +use arrow_array::{cast::AsArray, ArrayRef}; |
21 | 21 | use arrow_schema::DataType;
|
22 | 22 | use datafusion_common::ScalarValue;
|
23 | 23 |
|
@@ -233,25 +233,51 @@ pub fn safe_coerce_scalar(value: &ScalarValue, ty: &DataType) -> Option<ScalarVa
|
233 | 233 | _ => None,
|
234 | 234 | },
|
235 | 235 | ScalarValue::Null => Some(value.clone()),
|
236 |
| - // In Arrow 50.0.0, we will have support to cast from list -> FSL, and we |
237 |
| - // can remove the special case below. |
238 |
| - ScalarValue::List(values) if matches!(ty, DataType::FixedSizeList(_, _)) => { |
239 |
| - let values = values.as_list::<i32>().values(); |
240 |
| - if let DataType::FixedSizeList(field, size) = ty { |
241 |
| - let new_values = cast(values, field.data_type()).ok()?; |
242 |
| - Some(ScalarValue::FixedSizeList(Arc::new( |
243 |
| - FixedSizeListArray::new(field.clone(), *size, new_values, None), |
244 |
| - ))) |
245 |
| - } else { |
246 |
| - unreachable!() |
| 236 | + ScalarValue::List(values) => { |
| 237 | + let values = values.clone() as ArrayRef; |
| 238 | + let new_values = cast(&values, ty).ok()?; |
| 239 | + match ty { |
| 240 | + DataType::List(_) => { |
| 241 | + Some(ScalarValue::List(Arc::new(new_values.as_list().clone()))) |
| 242 | + } |
| 243 | + DataType::LargeList(_) => Some(ScalarValue::LargeList(Arc::new( |
| 244 | + new_values.as_list().clone(), |
| 245 | + ))), |
| 246 | + DataType::FixedSizeList(_, _) => Some(ScalarValue::FixedSizeList(Arc::new( |
| 247 | + new_values.as_fixed_size_list().clone(), |
| 248 | + ))), |
| 249 | + _ => None, |
| 250 | + } |
| 251 | + } |
| 252 | + ScalarValue::LargeList(values) => { |
| 253 | + let values = values.clone() as ArrayRef; |
| 254 | + let new_values = cast(&values, ty).ok()?; |
| 255 | + match ty { |
| 256 | + DataType::List(_) => { |
| 257 | + Some(ScalarValue::List(Arc::new(new_values.as_list().clone()))) |
| 258 | + } |
| 259 | + DataType::LargeList(_) => Some(ScalarValue::LargeList(Arc::new( |
| 260 | + new_values.as_list().clone(), |
| 261 | + ))), |
| 262 | + DataType::FixedSizeList(_, _) => Some(ScalarValue::FixedSizeList(Arc::new( |
| 263 | + new_values.as_fixed_size_list().clone(), |
| 264 | + ))), |
| 265 | + _ => None, |
247 | 266 | }
|
248 | 267 | }
|
249 |
| - ScalarValue::List(values) | ScalarValue::FixedSizeList(values) => { |
250 |
| - let new_values = cast(values, ty).ok()?; |
| 268 | + ScalarValue::FixedSizeList(values) => { |
| 269 | + let values = values.clone() as ArrayRef; |
| 270 | + let new_values = cast(&values, ty).ok()?; |
251 | 271 | match ty {
|
252 |
| - DataType::List(_) => Some(ScalarValue::List(new_values)), |
253 |
| - DataType::LargeList(_) => Some(ScalarValue::LargeList(new_values)), |
254 |
| - DataType::FixedSizeList(_, _) => Some(ScalarValue::FixedSizeList(new_values)), |
| 272 | + DataType::List(_) => { |
| 273 | + Some(ScalarValue::List(Arc::new(new_values.as_list().clone()))) |
| 274 | + } |
| 275 | + DataType::LargeList(_) => Some(ScalarValue::LargeList(Arc::new( |
| 276 | + new_values.as_list().clone(), |
| 277 | + ))), |
| 278 | + DataType::FixedSizeList(_, _) => Some(ScalarValue::FixedSizeList(Arc::new( |
| 279 | + new_values.as_fixed_size_list().clone(), |
| 280 | + ))), |
255 | 281 | _ => None,
|
256 | 282 | }
|
257 | 283 | }
|
|
0 commit comments