From 9b44dccdddd8bf97435f059a1f5d89284a136b01 Mon Sep 17 00:00:00 2001 From: Wei-Ting Kuo Date: Tue, 20 Sep 2022 01:32:21 +0800 Subject: [PATCH 1/3] support "set time zone" --- src/parser.rs | 7 ++++++- tests/sqlparser_common.rs | 43 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/src/parser.rs b/src/parser.rs index 894bb84f1..d97870d23 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -3774,7 +3774,12 @@ impl<'a> Parser<'a> { }); } - let variable = self.parse_object_name()?; + let variable = if self.parse_keywords(&vec![Keyword::TIME, Keyword::ZONE]) { + ObjectName(vec!["TIMEZONE".into()]) + } else { + self.parse_object_name()? + }; + if variable.to_string().eq_ignore_ascii_case("NAMES") && dialect_of!(self is MySqlDialect | GenericDialect) { diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs index 6fee5e88b..295843f3e 100644 --- a/tests/sqlparser_common.rs +++ b/tests/sqlparser_common.rs @@ -4663,6 +4663,49 @@ fn parse_set_transaction() { } } +#[test] +fn parse_set_variable() { + match verified_stmt("SET SOMETHING = 1") { + Statement::SetVariable { + local, + hivevar, + variable, + value, + } => { + assert!(!local); + assert!(!hivevar); + assert_eq!(variable, ObjectName(vec!["SOMETHING".into()])); + assert_eq!(value, vec![Expr::Value(Value::Number("1".into(), false))]); + } + _ => unreachable!(), + } + + one_statement_parses_to("SET SOMETHING TO 1", "SET SOMETHING = 1"); +} + +#[test] +fn parse_set_time_zone() { + match verified_stmt("SET TIMEZONE = 'UTC'") { + Statement::SetVariable { + local, + hivevar, + variable, + value, + } => { + assert!(!local); + assert!(!hivevar); + assert_eq!(variable, ObjectName(vec!["TIMEZONE".into()])); + assert_eq!( + value, + vec![Expr::Value(Value::SingleQuotedString("UTC".into()))] + ); + } + _ => unreachable!(), + } + + one_statement_parses_to("SET TIME ZONE TO 'UTC'", "SET TIMEZONE = 'UTC'"); +} + #[test] fn parse_commit() { match verified_stmt("COMMIT") { From fe102114cbdbfa22efcc1670ab88d15e1b31c4cb Mon Sep 17 00:00:00 2001 From: Wei-Ting Kuo Date: Tue, 20 Sep 2022 01:53:45 +0800 Subject: [PATCH 2/3] fix clippy --- src/parser.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/parser.rs b/src/parser.rs index d97870d23..968b1a5dd 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -3774,7 +3774,7 @@ impl<'a> Parser<'a> { }); } - let variable = if self.parse_keywords(&vec![Keyword::TIME, Keyword::ZONE]) { + let variable = if self.parse_keywords(&[Keyword::TIME, Keyword::ZONE]) { ObjectName(vec!["TIMEZONE".into()]) } else { self.parse_object_name()? From c8a7f6b8e1cbd0771aef1afdbbda38aeda051eee Mon Sep 17 00:00:00 2001 From: Wei-Ting Kuo Date: Tue, 20 Sep 2022 01:59:03 +0800 Subject: [PATCH 3/3] fix test cases --- tests/sqlparser_common.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs index 295843f3e..d2d2646cd 100644 --- a/tests/sqlparser_common.rs +++ b/tests/sqlparser_common.rs @@ -4665,7 +4665,7 @@ fn parse_set_transaction() { #[test] fn parse_set_variable() { - match verified_stmt("SET SOMETHING = 1") { + match verified_stmt("SET SOMETHING = '1'") { Statement::SetVariable { local, hivevar, @@ -4675,12 +4675,15 @@ fn parse_set_variable() { assert!(!local); assert!(!hivevar); assert_eq!(variable, ObjectName(vec!["SOMETHING".into()])); - assert_eq!(value, vec![Expr::Value(Value::Number("1".into(), false))]); + assert_eq!( + value, + vec![Expr::Value(Value::SingleQuotedString("1".into()))] + ); } _ => unreachable!(), } - one_statement_parses_to("SET SOMETHING TO 1", "SET SOMETHING = 1"); + one_statement_parses_to("SET SOMETHING TO '1'", "SET SOMETHING = '1'"); } #[test]