Converts a date_part function to SQL, tailoring it to the supported date field extraction style.
(
unparser: &Unparser,
style: DateFieldExtractStyle,
date_part_args: &[Expr],
)
| 442 | |
| 443 | /// Converts a date_part function to SQL, tailoring it to the supported date field extraction style. |
| 444 | pub(crate) fn date_part_to_sql( |
| 445 | unparser: &Unparser, |
| 446 | style: DateFieldExtractStyle, |
| 447 | date_part_args: &[Expr], |
| 448 | ) -> Result<Option<ast::Expr>> { |
| 449 | match (style, date_part_args.len()) { |
| 450 | (DateFieldExtractStyle::Extract, 2) => { |
| 451 | let date_expr = unparser.expr_to_sql(&date_part_args[1])?; |
| 452 | if let Expr::Literal(ScalarValue::Utf8(Some(field)), _) = &date_part_args[0] { |
| 453 | let field = match field.to_lowercase().as_str() { |
| 454 | "year" => ast::DateTimeField::Year, |
| 455 | "month" => ast::DateTimeField::Month, |
| 456 | "day" => ast::DateTimeField::Day, |
| 457 | "hour" => ast::DateTimeField::Hour, |
| 458 | "minute" => ast::DateTimeField::Minute, |
| 459 | "second" => ast::DateTimeField::Second, |
| 460 | _ => return Ok(None), |
| 461 | }; |
| 462 | |
| 463 | return Ok(Some(ast::Expr::Extract { |
| 464 | field, |
| 465 | expr: Box::new(date_expr), |
| 466 | syntax: ast::ExtractSyntax::From, |
| 467 | })); |
| 468 | } |
| 469 | } |
| 470 | (DateFieldExtractStyle::Strftime, 2) => { |
| 471 | let column = unparser.expr_to_sql(&date_part_args[1])?; |
| 472 | |
| 473 | if let Expr::Literal(ScalarValue::Utf8(Some(field)), _) = &date_part_args[0] { |
| 474 | let field = match field.to_lowercase().as_str() { |
| 475 | "year" => "%Y", |
| 476 | "month" => "%m", |
| 477 | "day" => "%d", |
| 478 | "hour" => "%H", |
| 479 | "minute" => "%M", |
| 480 | "second" => "%S", |
| 481 | _ => return Ok(None), |
| 482 | }; |
| 483 | |
| 484 | return Ok(Some(ast::Expr::Function(ast::Function { |
| 485 | name: ast::ObjectName::from(vec![ast::Ident { |
| 486 | value: "strftime".to_string(), |
| 487 | quote_style: None, |
| 488 | span: Span::empty(), |
| 489 | }]), |
| 490 | args: ast::FunctionArguments::List(ast::FunctionArgumentList { |
| 491 | duplicate_treatment: None, |
| 492 | args: vec![ |
| 493 | ast::FunctionArg::Unnamed(ast::FunctionArgExpr::Expr( |
| 494 | ast::Expr::value(ast::Value::SingleQuotedString( |
| 495 | field.to_string(), |
| 496 | )), |
| 497 | )), |
| 498 | ast::FunctionArg::Unnamed(ast::FunctionArgExpr::Expr(column)), |
| 499 | ], |
| 500 | clauses: vec![], |
| 501 | }), |
no test coverage detected
searching dependent graphs…