diff --git a/src/parser.rs b/src/parser.rs index 894bb84f1..968b1a5dd 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(&[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..d2d2646cd 100644 --- a/tests/sqlparser_common.rs +++ b/tests/sqlparser_common.rs @@ -4663,6 +4663,52 @@ 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::SingleQuotedString("1".into()))] + ); + } + _ => 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") {