diff --git a/src/parser.rs b/src/parser.rs index 6d917f027..2796577f6 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -408,6 +408,9 @@ impl<'a> Parser<'a> { self.prev_token(); Ok(Expr::Value(self.parse_value()?)) } + Keyword::CURRENT_TIMESTAMP | Keyword::CURRENT_TIME | Keyword::CURRENT_DATE => { + self.parse_time_functions(ObjectName(vec![w.to_ident()])) + } Keyword::CASE => self.parse_case_expr(), Keyword::CAST => self.parse_cast_expr(), Keyword::TRY_CAST => self.parse_try_cast_expr(), @@ -552,6 +555,20 @@ impl<'a> Parser<'a> { })) } + pub fn parse_time_functions(&mut self, name: ObjectName) -> Result { + let args = if self.consume_token(&Token::LParen) { + self.parse_optional_args()? + } else { + vec![] + }; + Ok(Expr::Function(Function { + name, + args, + over: None, + distinct: false, + })) + } + pub fn parse_window_frame_units(&mut self) -> Result { match self.next_token() { Token::Word(w) => match w.keyword { diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs index 07a0db524..e5b669e2d 100644 --- a/tests/sqlparser_common.rs +++ b/tests/sqlparser_common.rs @@ -4050,3 +4050,51 @@ fn verified_only_select(query: &str) -> Select { fn verified_expr(query: &str) -> Expr { all_dialects().verified_expr(query) } + +#[test] +fn parse_time_functions() { + let sql = "SELECT CURRENT_TIMESTAMP()"; + let select = verified_only_select(sql); + assert_eq!( + &Expr::Function(Function { + name: ObjectName(vec![Ident::new("CURRENT_TIMESTAMP")]), + args: vec![], + over: None, + distinct: false, + }), + expr_from_projection(&select.projection[0]) + ); + + // Validating Parenthesis + one_statement_parses_to("SELECT CURRENT_TIMESTAMP", sql); + + let sql = "SELECT CURRENT_TIME()"; + let select = verified_only_select(sql); + assert_eq!( + &Expr::Function(Function { + name: ObjectName(vec![Ident::new("CURRENT_TIME")]), + args: vec![], + over: None, + distinct: false, + }), + expr_from_projection(&select.projection[0]) + ); + + // Validating Parenthesis + one_statement_parses_to("SELECT CURRENT_TIME", sql); + + let sql = "SELECT CURRENT_DATE()"; + let select = verified_only_select(sql); + assert_eq!( + &Expr::Function(Function { + name: ObjectName(vec![Ident::new("CURRENT_DATE")]), + args: vec![], + over: None, + distinct: false, + }), + expr_from_projection(&select.projection[0]) + ); + + // Validating Parenthesis + one_statement_parses_to("SELECT CURRENT_DATE", sql); +}