diff --git a/src/ast/mod.rs b/src/ast/mod.rs index f568c3960..16210f863 100644 --- a/src/ast/mod.rs +++ b/src/ast/mod.rs @@ -1271,6 +1271,11 @@ pub enum Statement { variable: ObjectName, value: Vec, }, + /// SET TIME ZONE + /// + /// Note: this is a PostgreSQL-specific statements + /// SET TIME ZONE is an alias for SET timezone TO in PostgreSQL + SetTimeZone { local: bool, value: Expr }, /// SET NAMES 'charset_name' [COLLATE 'collation_name'] /// /// Note: this is a MySQL-specific statement. @@ -2228,6 +2233,13 @@ impl fmt::Display for Statement { value = display_comma_separated(value) ) } + Statement::SetTimeZone { local, value } => { + f.write_str("SET ")?; + if *local { + f.write_str("LOCAL ")?; + } + write!(f, "TIME ZONE {value}") + } Statement::SetNames { charset_name, collation_name, diff --git a/src/parser.rs b/src/parser.rs index a0b141bc1..33978a681 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -4573,6 +4573,15 @@ impl<'a> Parser<'a> { value: values, }); } + } else if variable.to_string().eq_ignore_ascii_case("TIMEZONE") { + // for some db (e.g. postgresql), SET TIME ZONE is an alias for SET TIMEZONE [TO|=] + match self.parse_expr() { + Ok(expr) => Ok(Statement::SetTimeZone { + local: modifier == Some(Keyword::LOCAL), + value: expr, + }), + _ => self.expected("timezone value", self.peek_token())?, + } } else if variable.to_string() == "CHARACTERISTICS" { self.expect_keywords(&[Keyword::AS, Keyword::TRANSACTION])?; Ok(Statement::SetTransaction { diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs index ec4c2f257..2af06d15e 100644 --- a/tests/sqlparser_common.rs +++ b/tests/sqlparser_common.rs @@ -4979,6 +4979,17 @@ fn parse_set_time_zone() { one_statement_parses_to("SET TIME ZONE TO 'UTC'", "SET TIMEZONE = 'UTC'"); } +#[test] +fn parse_set_time_zone_alias() { + match verified_stmt("SET TIME ZONE 'UTC'") { + Statement::SetTimeZone { local, value } => { + assert!(!local); + assert_eq!(value, Expr::Value(Value::SingleQuotedString("UTC".into()))); + } + _ => unreachable!(), + } +} + #[test] fn parse_commit() { match verified_stmt("COMMIT") {