Skip to content

Commit

Permalink
feat: Support week, decade, century for Interval literal (#3038)
Browse files Browse the repository at this point in the history
* feat: Support week, decade, century for Interval literal

* fix copy/paste

* fix test
  • Loading branch information
ovr committed Aug 5, 2022
1 parent 07b7314 commit 581934d
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 7 deletions.
20 changes: 20 additions & 0 deletions datafusion/core/tests/sql/expr.rs
Expand Up @@ -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"
Expand Down Expand Up @@ -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"
Expand Down
25 changes: 18 additions & 7 deletions datafusion/sql/src/interval.rs
Expand Up @@ -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
Expand Down Expand Up @@ -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""#
);
}

Expand Down

0 comments on commit 581934d

Please sign in to comment.