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""#
);
}