Skip to content

Commit

Permalink
fix(sqlparser): allow single quoted value for set time zone (#9962)
Browse files Browse the repository at this point in the history
  • Loading branch information
xiangjinwu authored May 23, 2023
1 parent 460d9f2 commit 728edd8
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 13 deletions.
43 changes: 42 additions & 1 deletion e2e_test/database/timezone.slt
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,45 @@ set timezone = 'GMT'
query T
show timezone;
----
GMT
GMT

statement ok
set time zone local;

statement ok
set time zone default;

statement ok
set time zone 'utc';

statement error Invalid value
set time zone 'utcx';

statement ok
set time zone utc;

statement error Invalid value
set time zone utcx;

statement ok
set time zone "utc";

statement error Invalid value
set time zone "utcx";

statement error Invalid value
set time zone "default";

statement error Invalid value
set time zone "local";

statement error Invalid value
set time zone null;

# The following are valid in PostgreSQL but we do not support them for simplicity.

statement error Invalid value
set time zone 12.3;

statement error
set time zone interval '1' hour;
20 changes: 11 additions & 9 deletions src/sqlparser/src/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3581,15 +3581,17 @@ impl Parser {
pub fn parse_set(&mut self) -> Result<Statement, ParserError> {
let modifier = self.parse_one_of_keywords(&[Keyword::SESSION, Keyword::LOCAL]);
if self.parse_keywords(&[Keyword::TIME, Keyword::ZONE]) {
let value = if self.parse_keyword(Keyword::DEFAULT) {
SetTimeZoneValue::Default
} else if self.parse_keyword(Keyword::LOCAL) {
SetTimeZoneValue::Local
} else if let Ok(ident) = self.parse_identifier() {
SetTimeZoneValue::Ident(ident)
} else {
let value = self.parse_value()?;
SetTimeZoneValue::Literal(value)
let token = self.peek_token();
let value = match (self.parse_value(), token.token) {
(Ok(value), _) => SetTimeZoneValue::Literal(value),
(Err(_), Token::Word(w)) if w.keyword == Keyword::DEFAULT => {
SetTimeZoneValue::Default
}
(Err(_), Token::Word(w)) if w.keyword == Keyword::LOCAL => SetTimeZoneValue::Local,
(Err(_), Token::Word(w)) => SetTimeZoneValue::Ident(w.to_ident()?),
(Err(_), unexpected) => {
self.expected("variable value", unexpected.with_location(token.location))?
}
};

return Ok(Statement::SetTimeZone {
Expand Down
4 changes: 1 addition & 3 deletions src/sqlparser/tests/testdata/set.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,7 @@
- input: SET TIME ZONE "Asia/Shanghai"
formatted_sql: SET TIME ZONE "Asia/Shanghai"
- input: SET TIME ZONE 'Asia/Shanghai'
error_msg: |-
sql parser error: Expected a value, found: EOF at the end
Near "SET TIME ZONE 'Asia/Shanghai'"
formatted_sql: SET TIME ZONE 'Asia/Shanghai'
- input: SET TIME ZONE "UTC"
formatted_sql: SET TIME ZONE "UTC"
- input: SET TIME ZONE UTC
Expand Down

0 comments on commit 728edd8

Please sign in to comment.