Fallback implementation for decimal power when exponent is an array. Casts decimal to float64, computes power, and casts back to original decimal type. This is used for performance when exponent varies per-row.
(
base: &ArrayRef,
exponent: &ColumnarValue,
num_rows: usize,
)
| 373 | /// Casts decimal to float64, computes power, and casts back to original decimal type. |
| 374 | /// This is used for performance when exponent varies per-row. |
| 375 | fn pow_decimal_with_float_fallback( |
| 376 | base: &ArrayRef, |
| 377 | exponent: &ColumnarValue, |
| 378 | num_rows: usize, |
| 379 | ) -> Result<ColumnarValue> { |
| 380 | use arrow::compute::cast; |
| 381 | |
| 382 | let original_type = base.data_type().clone(); |
| 383 | let base_f64 = cast(base.as_ref(), &DataType::Float64)?; |
| 384 | |
| 385 | let exp_f64 = match exponent { |
| 386 | ColumnarValue::Array(arr) => cast(arr.as_ref(), &DataType::Float64)?, |
| 387 | ColumnarValue::Scalar(scalar) => { |
| 388 | let scalar_f64 = scalar.cast_to(&DataType::Float64)?; |
| 389 | scalar_f64.to_array_of_size(num_rows)? |
| 390 | } |
| 391 | }; |
| 392 | |
| 393 | let result_f64 = calculate_binary_math::<Float64Type, Float64Type, Float64Type, _>( |
| 394 | &base_f64, |
| 395 | &ColumnarValue::Array(exp_f64), |
| 396 | float64_power_checked, |
| 397 | )?; |
| 398 | |
| 399 | let result = cast(result_f64.as_ref(), &original_type)?; |
| 400 | Ok(ColumnarValue::Array(result)) |
| 401 | } |
| 402 | |
| 403 | impl ScalarUDFImpl for PowerFunc { |
| 404 | fn name(&self) -> &str { |
no test coverage detected
searching dependent graphs…