This is an automated email from the ASF dual-hosted git repository.
agrove pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/datafusion-comet.git
The following commit(s) were added to refs/heads/main by this push:
new 2c71845d8 fix: Native engine crashes on literal DateTrunc and
TimestampTrunc (#3668)
2c71845d8 is described below
commit 2c71845d87645972b23ecc0496eae76280efb0a8
Author: ChenChen Lai <[email protected]>
AuthorDate: Thu Mar 19 22:00:23 2026 +0800
fix: Native engine crashes on literal DateTrunc and TimestampTrunc (#3668)
---
native/spark-expr/src/datetime_funcs/date_trunc.rs | 13 ++++++++++---
native/spark-expr/src/datetime_funcs/timestamp_trunc.rs | 16 +++++++++++++---
.../sql-tests/expressions/datetime/trunc_date.sql | 2 +-
.../sql-tests/expressions/datetime/trunc_timestamp.sql | 2 +-
4 files changed, 25 insertions(+), 8 deletions(-)
diff --git a/native/spark-expr/src/datetime_funcs/date_trunc.rs
b/native/spark-expr/src/datetime_funcs/date_trunc.rs
index 6d36b0975..aeae18e36 100644
--- a/native/spark-expr/src/datetime_funcs/date_trunc.rs
+++ b/native/spark-expr/src/datetime_funcs/date_trunc.rs
@@ -16,7 +16,9 @@
// under the License.
use arrow::datatypes::DataType;
-use datafusion::common::{utils::take_function_args, DataFusionError, Result,
ScalarValue::Utf8};
+use datafusion::common::{
+ utils::take_function_args, DataFusionError, Result, ScalarValue,
ScalarValue::Utf8,
+};
use datafusion::logical_expr::{
ColumnarValue, ScalarFunctionArgs, ScalarUDFImpl, Signature, Volatility,
};
@@ -76,9 +78,14 @@ impl ScalarUDFImpl for SparkDateTrunc {
let result = date_trunc_array_fmt_dyn(&date, &formats)?;
Ok(ColumnarValue::Array(result))
}
+ (ColumnarValue::Scalar(date_scalar),
ColumnarValue::Scalar(Utf8(Some(format)))) => {
+ let date_arr = date_scalar.to_array()?;
+ let result = date_trunc_dyn(&date_arr, format)?;
+ let scalar = ScalarValue::try_from_array(&result, 0)?;
+ Ok(ColumnarValue::Scalar(scalar))
+ }
_ => Err(DataFusionError::Execution(
- "Invalid input to function DateTrunc. Expected
(PrimitiveArray<Date32>, Scalar) or \
- (PrimitiveArray<Date32>, StringArray)".to_string(),
+ "Invalid input to function DateTrunc. Expected (Date32,
Utf8)".to_string(),
)),
}
}
diff --git a/native/spark-expr/src/datetime_funcs/timestamp_trunc.rs
b/native/spark-expr/src/datetime_funcs/timestamp_trunc.rs
index 1a35f02e0..2d7a571b7 100644
--- a/native/spark-expr/src/datetime_funcs/timestamp_trunc.rs
+++ b/native/spark-expr/src/datetime_funcs/timestamp_trunc.rs
@@ -18,7 +18,7 @@
use crate::utils::array_with_timezone;
use arrow::datatypes::{DataType, Schema, TimeUnit::Microsecond};
use arrow::record_batch::RecordBatch;
-use datafusion::common::{DataFusionError, ScalarValue::Utf8};
+use datafusion::common::{DataFusionError, ScalarValue, ScalarValue::Utf8};
use datafusion::logical_expr::ColumnarValue;
use datafusion::physical_expr::PhysicalExpr;
use std::hash::Hash;
@@ -130,10 +130,20 @@ impl PhysicalExpr for TimestampTruncExpr {
let result = timestamp_trunc_array_fmt_dyn(&ts, &formats)?;
Ok(ColumnarValue::Array(result))
}
+ (ColumnarValue::Scalar(ts_scalar),
ColumnarValue::Scalar(Utf8(Some(format)))) => {
+ let ts_arr = ts_scalar.to_array()?;
+ let ts = array_with_timezone(
+ ts_arr,
+ tz.clone(),
+ Some(&DataType::Timestamp(Microsecond, Some(tz.into()))),
+ )?;
+ let result = timestamp_trunc_dyn(&ts, format)?;
+ let scalar = ScalarValue::try_from_array(&result, 0)?;
+ Ok(ColumnarValue::Scalar(scalar))
+ }
_ => Err(DataFusionError::Execution(
"Invalid input to function TimestampTrunc. \
- Expected (PrimitiveArray<TimestampMicrosecondType>,
Scalar, String) or \
- (PrimitiveArray<TimestampMicrosecondType>, StringArray,
String)"
+ Expected (Timestamp, Utf8)"
.to_string(),
)),
}
diff --git
a/spark/src/test/resources/sql-tests/expressions/datetime/trunc_date.sql
b/spark/src/test/resources/sql-tests/expressions/datetime/trunc_date.sql
index 899a06f4b..f1d19ea8a 100644
--- a/spark/src/test/resources/sql-tests/expressions/datetime/trunc_date.sql
+++ b/spark/src/test/resources/sql-tests/expressions/datetime/trunc_date.sql
@@ -33,5 +33,5 @@ query
SELECT trunc(d, 'quarter') FROM test_trunc_date
-- literal arguments
-query ignore(https://github.com/apache/datafusion-comet/issues/3342)
+query
SELECT trunc(date('2024-06-15'), 'year'), trunc(date('2024-06-15'), 'month'),
trunc(date('2024-06-15'), 'quarter')
diff --git
a/spark/src/test/resources/sql-tests/expressions/datetime/trunc_timestamp.sql
b/spark/src/test/resources/sql-tests/expressions/datetime/trunc_timestamp.sql
index 661866543..670c8fbaa 100644
---
a/spark/src/test/resources/sql-tests/expressions/datetime/trunc_timestamp.sql
+++
b/spark/src/test/resources/sql-tests/expressions/datetime/trunc_timestamp.sql
@@ -37,5 +37,5 @@ query
SELECT date_trunc('hour', ts) FROM test_trunc_ts
-- literal arguments
-query ignore(https://github.com/apache/datafusion-comet/issues/3342)
+query
SELECT date_trunc('year', timestamp('2024-06-15 10:30:45')),
date_trunc('month', timestamp('2024-06-15 10:30:45')), date_trunc('day',
timestamp('2024-06-15 10:30:45'))
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]