From b094aba9d5c2fba78c2d1909d1521bbeef7b4124 Mon Sep 17 00:00:00 2001 From: Yuval Shkolar Date: Tue, 14 Dec 2021 17:08:52 +0200 Subject: [PATCH 1/8] Inital support in current_timestamp --- src/parser.rs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/parser.rs b/src/parser.rs index 45b3bea0e..80c3ff0b5 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -357,6 +357,7 @@ impl<'a> Parser<'a> { self.prev_token(); Ok(Expr::Value(self.parse_value()?)) } + Keyword::CURRENT_TIMESTAMP => self.parse_current_timestamp(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(), @@ -508,6 +509,20 @@ impl<'a> Parser<'a> { })) } + pub fn parse_current_timestamp(&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 { From d63d415dcebeb5e57e46fd247d8236ab9082af8d Mon Sep 17 00:00:00 2001 From: Yuval Shkolar Date: Wed, 15 Dec 2021 10:05:17 +0200 Subject: [PATCH 2/8] Support time functions --- src/parser.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/parser.rs b/src/parser.rs index 80c3ff0b5..83daf881c 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -357,7 +357,7 @@ impl<'a> Parser<'a> { self.prev_token(); Ok(Expr::Value(self.parse_value()?)) } - Keyword::CURRENT_TIMESTAMP => self.parse_current_timestamp(ObjectName(vec![w.to_ident()])), + 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(), @@ -509,7 +509,7 @@ impl<'a> Parser<'a> { })) } - pub fn parse_current_timestamp(&mut self, name: ObjectName) -> Result { + pub fn parse_time_functions(&mut self, name: ObjectName) -> Result { let args = if self.consume_token(&Token::LParen) { self.parse_optional_args()? } else { From abae1effb3d830a1bf850309d7eaa687abda4782 Mon Sep 17 00:00:00 2001 From: Yuval Shkolar Date: Wed, 15 Dec 2021 14:27:20 +0200 Subject: [PATCH 3/8] Add Test --- tests/sqlparser_common.rs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs index 65b7869d4..947c91761 100644 --- a/tests/sqlparser_common.rs +++ b/tests/sqlparser_common.rs @@ -3620,3 +3620,18 @@ 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]) + ); +} From 47e06433760a4ab2d675af3e6de2f175018d8b51 Mon Sep 17 00:00:00 2001 From: Yuval Shkolar Date: Sat, 18 Dec 2021 01:11:43 +0200 Subject: [PATCH 4/8] Fix PR --- src/parser.rs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/parser.rs b/src/parser.rs index 83daf881c..46cdf60d6 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -357,7 +357,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::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(), @@ -516,11 +518,11 @@ impl<'a> Parser<'a> { vec![] }; Ok(Expr::Function(Function { - name, - args, - over:None, - distinct:false, - })) + name, + args, + over: None, + distinct: false, + })) } pub fn parse_window_frame_units(&mut self) -> Result { From d9a42f73284918b307fa30aa1963e33b8129059e Mon Sep 17 00:00:00 2001 From: Yuval Shkolar Date: Tue, 21 Dec 2021 16:29:46 +0200 Subject: [PATCH 5/8] Fix tests --- tests/sqlparser_common.rs | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs index 947c91761..a52fc6cac 100644 --- a/tests/sqlparser_common.rs +++ b/tests/sqlparser_common.rs @@ -3634,4 +3634,37 @@ fn parse_time_functions() { }), 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); } From 6c30ef74cfbfc4c6d576942014c5f8aff30db96d Mon Sep 17 00:00:00 2001 From: Yuval Shkolar Date: Thu, 23 Dec 2021 16:42:16 +0200 Subject: [PATCH 6/8] Allow parentheses in group by --- src/parser.rs | 6 ++++++ tests/sqlparser_common.rs | 1 + 2 files changed, 7 insertions(+) diff --git a/src/parser.rs b/src/parser.rs index 46cdf60d6..ff3652355 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -2508,12 +2508,18 @@ impl<'a> Parser<'a> { None }; + let mut is_l_paren = false; let group_by = if self.parse_keywords(&[Keyword::GROUP, Keyword::BY]) { + is_l_paren = self.consume_token(&Token::LParen); self.parse_comma_separated(Parser::parse_expr)? } else { vec![] }; + if is_l_paren { + self.consume_token(&Token::RParen); + } + let cluster_by = if self.parse_keywords(&[Keyword::CLUSTER, Keyword::BY]) { self.parse_comma_separated(Parser::parse_expr)? } else { diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs index a52fc6cac..f70f09ee9 100644 --- a/tests/sqlparser_common.rs +++ b/tests/sqlparser_common.rs @@ -1037,6 +1037,7 @@ fn parse_select_group_by() { ], select.group_by ); + one_statement_parses_to("SELECT id, fname, lname FROM customer GROUP BY (lname, fname)", sql); } #[test] From 55438d4ee4662605507d8c5ffb3183a6d9d23a43 Mon Sep 17 00:00:00 2001 From: Yuval Shkolar Date: Thu, 23 Dec 2021 16:58:30 +0200 Subject: [PATCH 7/8] Allign with main --- src/parser.rs | 17 -------------- tests/sqlparser_common.rs | 48 --------------------------------------- 2 files changed, 65 deletions(-) diff --git a/src/parser.rs b/src/parser.rs index ff3652355..db25f5fe8 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -357,9 +357,6 @@ 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(), @@ -511,20 +508,6 @@ 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 f70f09ee9..28f2c2be1 100644 --- a/tests/sqlparser_common.rs +++ b/tests/sqlparser_common.rs @@ -3621,51 +3621,3 @@ 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); -} From a3d9139752a4a144dc168cc38a7b55fb2f7bbffd Mon Sep 17 00:00:00 2001 From: Yuval Shkolar Date: Sun, 26 Dec 2021 10:32:55 +0200 Subject: [PATCH 8/8] Support Group By --- src/parser.rs | 17 +++++++---------- tests/sqlparser_common.rs | 5 ++++- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/parser.rs b/src/parser.rs index 6d8b05e19..7b0506548 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -2680,18 +2680,15 @@ impl<'a> Parser<'a> { None }; - let mut is_l_paren = false; - let group_by = if self.parse_keywords(&[Keyword::GROUP, Keyword::BY]) { - is_l_paren = self.consume_token(&Token::LParen); - self.parse_comma_separated(Parser::parse_group_by_expr)? - } else { - vec![] + let mut group_by = vec![]; + if self.parse_keywords(&[Keyword::GROUP, Keyword::BY]) { + let is_l_parent = self.consume_token(&Token::LParen); + group_by = self.parse_comma_separated(Parser::parse_group_by_expr)?; + if is_l_parent { + self.consume_token(&Token::RParen); + } }; - if is_l_paren { - self.consume_token(&Token::RParen); - } - let cluster_by = if self.parse_keywords(&[Keyword::CLUSTER, Keyword::BY]) { self.parse_comma_separated(Parser::parse_expr)? } else { diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs index 6d5c96403..255d6a8f5 100644 --- a/tests/sqlparser_common.rs +++ b/tests/sqlparser_common.rs @@ -1096,7 +1096,10 @@ fn parse_select_group_by() { ], select.group_by ); - one_statement_parses_to("SELECT id, fname, lname FROM customer GROUP BY (lname, fname)", sql); + one_statement_parses_to( + "SELECT id, fname, lname FROM customer GROUP BY (lname, fname)", + sql, + ); } #[test]