|
18 | 18 | use crate::utils::array_with_timezone; |
19 | 19 | use arrow::datatypes::{DataType, Schema, TimeUnit::Microsecond}; |
20 | 20 | use arrow::record_batch::RecordBatch; |
21 | | -use datafusion::common::{DataFusionError, ScalarValue::Utf8}; |
| 21 | +use datafusion::common::{DataFusionError, ScalarValue, ScalarValue::Utf8}; |
22 | 22 | use datafusion::logical_expr::ColumnarValue; |
23 | 23 | use datafusion::physical_expr::PhysicalExpr; |
24 | 24 | use std::hash::Hash; |
@@ -130,10 +130,20 @@ impl PhysicalExpr for TimestampTruncExpr { |
130 | 130 | let result = timestamp_trunc_array_fmt_dyn(&ts, &formats)?; |
131 | 131 | Ok(ColumnarValue::Array(result)) |
132 | 132 | } |
| 133 | + (ColumnarValue::Scalar(ts_scalar), ColumnarValue::Scalar(Utf8(Some(format)))) => { |
| 134 | + let ts_arr = ts_scalar.to_array()?; |
| 135 | + let ts = array_with_timezone( |
| 136 | + ts_arr, |
| 137 | + tz.clone(), |
| 138 | + Some(&DataType::Timestamp(Microsecond, Some(tz.into()))), |
| 139 | + )?; |
| 140 | + let result = timestamp_trunc_dyn(&ts, format)?; |
| 141 | + let scalar = ScalarValue::try_from_array(&result, 0)?; |
| 142 | + Ok(ColumnarValue::Scalar(scalar)) |
| 143 | + } |
133 | 144 | _ => Err(DataFusionError::Execution( |
134 | 145 | "Invalid input to function TimestampTrunc. \ |
135 | | - Expected (PrimitiveArray<TimestampMicrosecondType>, Scalar, String) or \ |
136 | | - (PrimitiveArray<TimestampMicrosecondType>, StringArray, String)" |
| 146 | + Expected (Timestamp, Utf8)" |
137 | 147 | .to_string(), |
138 | 148 | )), |
139 | 149 | } |
|
0 commit comments