You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by al...@apache.org on 2022/12/09 11:19:58 UTC
[arrow-datafusion] branch master updated: Fix date_part/extract functions to support now() (#4548)
This is an automated email from the ASF dual-hosted git repository.
alamb pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/arrow-datafusion.git
The following commit(s) were added to refs/heads/master by this push:
new d67bb5715 Fix date_part/extract functions to support now() (#4548)
d67bb5715 is described below
commit d67bb5715c62bc811844190a9b8f93929df867e9
Author: comphead <co...@users.noreply.github.com>
AuthorDate: Fri Dec 9 03:19:53 2022 -0800
Fix date_part/extract functions to support now() (#4548)
* extract to support functions
* extract support functions
---
datafusion/core/tests/sql/expr.rs | 76 ++++++++++++++++++++++
datafusion/expr/src/function.rs | 4 ++
.../physical-expr/src/datetime_expressions.rs | 2 +-
3 files changed, 81 insertions(+), 1 deletion(-)
diff --git a/datafusion/core/tests/sql/expr.rs b/datafusion/core/tests/sql/expr.rs
index ad7655f00..4f02c2d74 100644
--- a/datafusion/core/tests/sql/expr.rs
+++ b/datafusion/core/tests/sql/expr.rs
@@ -1296,6 +1296,7 @@ async fn test_extract_date_part() -> Result<()> {
"EXTRACT(microsecond FROM to_timestamp('2020-09-08T12:00:12.12345678+00:00'))",
"12123456.78"
);
+ // Depends on https://github.com/apache/arrow-datafusion/issues/4528
// test_expression!(
// "EXTRACT(nanosecond FROM to_timestamp('2020-09-08T12:00:12.12345678+00:00'))",
// "1212345678"
@@ -1319,6 +1320,81 @@ async fn test_extract_date_part() -> Result<()> {
Ok(())
}
+#[tokio::test]
+async fn test_extract_date_part_func() -> Result<()> {
+ test_expression!(
+ format!(
+ "(date_part('{0}', now()) = EXTRACT({0} FROM now()))",
+ "year"
+ ),
+ "true"
+ );
+ test_expression!(
+ format!(
+ "(date_part('{0}', now()) = EXTRACT({0} FROM now()))",
+ "quarter"
+ ),
+ "true"
+ );
+ test_expression!(
+ format!(
+ "(date_part('{0}', now()) = EXTRACT({0} FROM now()))",
+ "month"
+ ),
+ "true"
+ );
+ test_expression!(
+ format!(
+ "(date_part('{0}', now()) = EXTRACT({0} FROM now()))",
+ "week"
+ ),
+ "true"
+ );
+ test_expression!(
+ format!("(date_part('{0}', now()) = EXTRACT({0} FROM now()))", "day"),
+ "true"
+ );
+ test_expression!(
+ format!(
+ "(date_part('{0}', now()) = EXTRACT({0} FROM now()))",
+ "hour"
+ ),
+ "true"
+ );
+ test_expression!(
+ format!(
+ "(date_part('{0}', now()) = EXTRACT({0} FROM now()))",
+ "minute"
+ ),
+ "true"
+ );
+ test_expression!(
+ format!(
+ "(date_part('{0}', now()) = EXTRACT({0} FROM now()))",
+ "second"
+ ),
+ "true"
+ );
+ test_expression!(
+ format!(
+ "(date_part('{0}', now()) = EXTRACT({0} FROM now()))",
+ "millisecond"
+ ),
+ "true"
+ );
+ test_expression!(
+ format!(
+ "(date_part('{0}', now()) = EXTRACT({0} FROM now()))",
+ "microsecond"
+ ),
+ "true"
+ );
+ // Depends on https://github.com/apache/arrow-datafusion/issues/4528
+ //test_expression!(format!("(date_part('{0}', now()) = EXTRACT({0} FROM now()))", "nanosecond"), "true");
+
+ Ok(())
+}
+
#[tokio::test]
async fn test_in_list_scalar() -> Result<()> {
test_expression!("'a' IN ('a','b')", "true");
diff --git a/datafusion/expr/src/function.rs b/datafusion/expr/src/function.rs
index b57091c3c..459152192 100644
--- a/datafusion/expr/src/function.rs
+++ b/datafusion/expr/src/function.rs
@@ -474,6 +474,10 @@ pub fn signature(fun: &BuiltinScalarFunction) -> Signature {
DataType::Utf8,
DataType::Timestamp(TimeUnit::Nanosecond, None),
]),
+ TypeSignature::Exact(vec![
+ DataType::Utf8,
+ DataType::Timestamp(TimeUnit::Nanosecond, Some("+00:00".to_owned())),
+ ]),
],
fun.volatility(),
),
diff --git a/datafusion/physical-expr/src/datetime_expressions.rs b/datafusion/physical-expr/src/datetime_expressions.rs
index 4cef3f547..76ac4c3bc 100644
--- a/datafusion/physical-expr/src/datetime_expressions.rs
+++ b/datafusion/physical-expr/src/datetime_expressions.rs
@@ -413,7 +413,7 @@ macro_rules! extract_date_part {
Ok($FN(array)
.map(|v| cast(&(Arc::new(v) as ArrayRef), &DataType::Float64))?)
}
- DataType::Timestamp(time_unit, None) => match time_unit {
+ DataType::Timestamp(time_unit, _) => match time_unit {
TimeUnit::Second => {
let array = as_timestamp_second_array($ARRAY)?;
Ok($FN(array)