This is an automated email from the ASF dual-hosted git repository.
alamb pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/datafusion.git
The following commit(s) were added to refs/heads/main by this push:
new 8a98307f2a support to unparse interval to string (#11065)
8a98307f2a is described below
commit 8a98307f2afaae3eb5c3293fe4454af4d472748e
Author: Jax Liu <[email protected]>
AuthorDate: Sat Jun 22 19:34:50 2024 +0800
support to unparse interval to string (#11065)
---
datafusion/expr/src/expr_fn.rs | 14 +++++++++++-
datafusion/sql/src/unparser/expr.rs | 44 +++++++++++++++++++++++--------------
2 files changed, 41 insertions(+), 17 deletions(-)
diff --git a/datafusion/expr/src/expr_fn.rs b/datafusion/expr/src/expr_fn.rs
index a87412ee63..deac205557 100644
--- a/datafusion/expr/src/expr_fn.rs
+++ b/datafusion/expr/src/expr_fn.rs
@@ -31,7 +31,9 @@ use crate::{
Signature, Volatility,
};
use crate::{AggregateUDFImpl, ColumnarValue, ScalarUDFImpl, WindowUDF,
WindowUDFImpl};
-use arrow::compute::kernels::cast_utils::parse_interval_month_day_nano;
+use arrow::compute::kernels::cast_utils::{
+ parse_interval_day_time, parse_interval_month_day_nano,
parse_interval_year_month,
+};
use arrow::datatypes::{DataType, Field};
use datafusion_common::{Column, Result, ScalarValue};
use std::any::Any;
@@ -671,6 +673,16 @@ impl WindowUDFImpl for SimpleWindowUDF {
}
}
+pub fn interval_year_month_lit(value: &str) -> Expr {
+ let interval = parse_interval_year_month(value).ok();
+ Expr::Literal(ScalarValue::IntervalYearMonth(interval))
+}
+
+pub fn interval_datetime_lit(value: &str) -> Expr {
+ let interval = parse_interval_day_time(value).ok();
+ Expr::Literal(ScalarValue::IntervalDayTime(interval))
+}
+
pub fn interval_month_day_nano_lit(value: &str) -> Expr {
let interval = parse_interval_month_day_nano(value).ok();
Expr::Literal(ScalarValue::IntervalMonthDayNano(interval))
diff --git a/datafusion/sql/src/unparser/expr.rs
b/datafusion/sql/src/unparser/expr.rs
index 0aefefc1f0..3ad8759368 100644
--- a/datafusion/sql/src/unparser/expr.rs
+++ b/datafusion/sql/src/unparser/expr.rs
@@ -883,21 +883,13 @@ impl Unparser<'_> {
ScalarValue::TimestampNanosecond(None, _) => {
Ok(ast::Expr::Value(ast::Value::Null))
}
- ScalarValue::IntervalYearMonth(Some(_i)) => {
- not_impl_err!("Unsupported scalar: {v:?}")
- }
- ScalarValue::IntervalYearMonth(None) => {
- Ok(ast::Expr::Value(ast::Value::Null))
- }
- ScalarValue::IntervalDayTime(Some(_i)) => {
- not_impl_err!("Unsupported scalar: {v:?}")
- }
- ScalarValue::IntervalDayTime(None) =>
Ok(ast::Expr::Value(ast::Value::Null)),
- ScalarValue::IntervalMonthDayNano(Some(_i)) => {
+ ScalarValue::IntervalYearMonth(Some(_))
+ | ScalarValue::IntervalDayTime(Some(_))
+ | ScalarValue::IntervalMonthDayNano(Some(_)) => {
let wrap_array = v.to_array()?;
let Some(result) = array_value_to_string(&wrap_array, 0).ok()
else {
return internal_err!(
- "Unable to convert IntervalMonthDayNano to string"
+ "Unable to convert interval scalar value to string"
);
};
let interval = Interval {
@@ -911,6 +903,10 @@ impl Unparser<'_> {
};
Ok(ast::Expr::Interval(interval))
}
+ ScalarValue::IntervalYearMonth(None) => {
+ Ok(ast::Expr::Value(ast::Value::Null))
+ }
+ ScalarValue::IntervalDayTime(None) =>
Ok(ast::Expr::Value(ast::Value::Null)),
ScalarValue::IntervalMonthDayNano(None) => {
Ok(ast::Expr::Value(ast::Value::Null))
}
@@ -1044,10 +1040,10 @@ mod tests {
use arrow_schema::DataType::Int8;
use datafusion_common::TableReference;
use datafusion_expr::{
- case, col, cube, exists, grouping_set, lit, not, not_exists,
out_ref_col,
- placeholder, rollup, table_scan, try_cast, when, wildcard,
ColumnarValue,
- ScalarUDF, ScalarUDFImpl, Signature, Volatility, WindowFrame,
- WindowFunctionDefinition,
+ case, col, cube, exists, grouping_set, interval_datetime_lit,
+ interval_year_month_lit, lit, not, not_exists, out_ref_col,
placeholder, rollup,
+ table_scan, try_cast, when, wildcard, ColumnarValue, ScalarUDF,
ScalarUDFImpl,
+ Signature, Volatility, WindowFrame, WindowFunctionDefinition,
};
use datafusion_expr::{interval_month_day_nano_lit, AggregateExt};
use datafusion_functions_aggregate::count::count_udaf;
@@ -1385,6 +1381,22 @@ mod tests {
.sub(interval_month_day_nano_lit("1 DAY")),
r#"(INTERVAL '0 YEARS 1 MONS 0 DAYS 0 HOURS 0 MINS 0.000000000
SECS' - INTERVAL '0 YEARS 0 MONS 1 DAYS 0 HOURS 0 MINS 0.000000000 SECS')"#,
),
+ (
+ interval_datetime_lit("10 DAY 1 HOUR 10 MINUTE 20 SECOND"),
+ r#"INTERVAL '0 YEARS 0 MONS 10 DAYS 1 HOURS 10 MINS 20.000
SECS'"#,
+ ),
+ (
+ interval_datetime_lit("10 DAY 1.5 HOUR 10 MINUTE 20 SECOND"),
+ r#"INTERVAL '0 YEARS 0 MONS 10 DAYS 1 HOURS 40 MINS 20.000
SECS'"#,
+ ),
+ (
+ interval_year_month_lit("1 YEAR 1 MONTH"),
+ r#"INTERVAL '1 YEARS 1 MONS 0 DAYS 0 HOURS 0 MINS 0.00 SECS'"#,
+ ),
+ (
+ interval_year_month_lit("1.5 YEAR 1 MONTH"),
+ r#"INTERVAL '1 YEARS 7 MONS 0 DAYS 0 HOURS 0 MINS 0.00 SECS'"#,
+ ),
];
for (expr, expected) in tests {
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]