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 581934d73 feat: Support `week`, `decade`, `century` for Interval 
literal (#3038)
581934d73 is described below

commit 581934d73dfca7b99e6cc66767b3af3bbad7755f
Author: Dmitry Patsura <[email protected]>
AuthorDate: Fri Aug 5 15:04:06 2022 +0300

    feat: Support `week`, `decade`, `century` for Interval literal (#3038)
    
    * feat: Support week, decade, century for Interval literal
    
    * fix copy/paste
    
    * fix test
---
 datafusion/core/tests/sql/expr.rs | 20 ++++++++++++++++++++
 datafusion/sql/src/interval.rs    | 25 ++++++++++++++++++-------
 2 files changed, 38 insertions(+), 7 deletions(-)

diff --git a/datafusion/core/tests/sql/expr.rs 
b/datafusion/core/tests/sql/expr.rs
index c9c5d955a..093ab3433 100644
--- a/datafusion/core/tests/sql/expr.rs
+++ b/datafusion/core/tests/sql/expr.rs
@@ -691,6 +691,14 @@ async fn test_interval_expressions() -> Result<()> {
         "interval '1 day'",
         "0 years 0 mons 1 days 0 hours 0 mins 0.00 secs"
     );
+    test_expression!(
+        "interval '1 week'",
+        "0 years 0 mons 7 days 0 hours 0 mins 0.00 secs"
+    );
+    test_expression!(
+        "interval '2 weeks'",
+        "0 years 0 mons 14 days 0 hours 0 mins 0.00 secs"
+    );
     test_expression!(
         "interval '1 day 1'",
         "0 years 0 mons 1 days 0 hours 0 mins 1.00 secs"
@@ -769,6 +777,18 @@ async fn test_interval_expressions() -> Result<()> {
         "interval '1 year'",
         "1 years 0 mons 0 days 0 hours 0 mins 0.00 secs"
     );
+    test_expression!(
+        "interval '1 decade'",
+        "10 years 0 mons 0 days 0 hours 0 mins 0.00 secs"
+    );
+    test_expression!(
+        "interval '2 decades'",
+        "20 years 0 mons 0 days 0 hours 0 mins 0.00 secs"
+    );
+    test_expression!(
+        "interval '1 century'",
+        "100 years 0 mons 0 days 0 hours 0 mins 0.00 secs"
+    );
     test_expression!(
         "interval '2 year'",
         "2 years 0 mons 0 days 0 hours 0 mins 0.00 secs"
diff --git a/datafusion/sql/src/interval.rs b/datafusion/sql/src/interval.rs
index 303b16a23..dbdd038ae 100644
--- a/datafusion/sql/src/interval.rs
+++ b/datafusion/sql/src/interval.rs
@@ -64,17 +64,28 @@ pub(crate) fn parse_interval(leading_field: &str, value: 
&str) -> Result<ScalarV
             }
 
             match interval_type.to_lowercase().as_str() {
-                "year" => Ok(align_interval_parts(interval_period * 12_f32, 
0.0, 0.0)),
-                "month" => Ok(align_interval_parts(interval_period, 0.0, 0.0)),
+                "century" | "centuries" => {
+                    Ok(align_interval_parts(interval_period * 1200_f32, 0.0, 
0.0))
+                }
+                "decade" | "decades" => {
+                    Ok(align_interval_parts(interval_period * 120_f32, 0.0, 
0.0))
+                }
+                "year" | "years" => {
+                    Ok(align_interval_parts(interval_period * 12_f32, 0.0, 
0.0))
+                }
+                "month" | "months" => Ok(align_interval_parts(interval_period, 
0.0, 0.0)),
+                "week" | "weeks" => {
+                    Ok(align_interval_parts(0.0, interval_period * 7_f32, 0.0))
+                }
                 "day" | "days" => Ok(align_interval_parts(0.0, 
interval_period, 0.0)),
                 "hour" | "hours" => {
                     Ok((0, 0, interval_period * SECONDS_PER_HOUR * 
MILLIS_PER_SECOND))
                 }
-                "minutes" | "minute" => {
+                "minute" | "minutes" => {
                     Ok((0, 0, interval_period * 60_f32 * MILLIS_PER_SECOND))
                 }
-                "seconds" | "second" => Ok((0, 0, interval_period * 
MILLIS_PER_SECOND)),
-                "milliseconds" | "millisecond" => Ok((0, 0, interval_period)),
+                "second" | "seconds" => Ok((0, 0, interval_period * 
MILLIS_PER_SECOND)),
+                "millisecond" | "milliseconds" => Ok((0, 0, interval_period)),
                 _ => Err(DataFusionError::NotImplemented(format!(
                     "Invalid input syntax for type interval: {:?}",
                     value
@@ -173,10 +184,10 @@ mod test {
         );
 
         assert_contains!(
-            parse_interval("months", "1 years 1 month")
+            parse_interval("months", "1 centurys 1 month")
                 .unwrap_err()
                 .to_string(),
-            r#"Invalid input syntax for type interval: "1 years 1 month""#
+            r#"Invalid input syntax for type interval: "1 centurys 1 month""#
         );
     }
 

Reply via email to