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)