Skip to content

Commit 7c20d4a

Browse files
authored
Fix #1469 (SET ROLE regression) (#1474)
1 parent 749b061 commit 7c20d4a

File tree

2 files changed

+48
-16
lines changed

2 files changed

+48
-16
lines changed

src/parser/mod.rs

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9416,27 +9416,35 @@ impl<'a> Parser<'a> {
94169416
}
94179417
}
94189418

9419+
/// Parse a `SET ROLE` statement. Expects SET to be consumed already.
9420+
fn parse_set_role(&mut self, modifier: Option<Keyword>) -> Result<Statement, ParserError> {
9421+
self.expect_keyword(Keyword::ROLE)?;
9422+
let context_modifier = match modifier {
9423+
Some(Keyword::LOCAL) => ContextModifier::Local,
9424+
Some(Keyword::SESSION) => ContextModifier::Session,
9425+
_ => ContextModifier::None,
9426+
};
9427+
9428+
let role_name = if self.parse_keyword(Keyword::NONE) {
9429+
None
9430+
} else {
9431+
Some(self.parse_identifier(false)?)
9432+
};
9433+
Ok(Statement::SetRole {
9434+
context_modifier,
9435+
role_name,
9436+
})
9437+
}
9438+
94199439
pub fn parse_set(&mut self) -> Result<Statement, ParserError> {
94209440
let modifier =
94219441
self.parse_one_of_keywords(&[Keyword::SESSION, Keyword::LOCAL, Keyword::HIVEVAR]);
94229442
if let Some(Keyword::HIVEVAR) = modifier {
94239443
self.expect_token(&Token::Colon)?;
9424-
} else if self.parse_keyword(Keyword::ROLE) {
9425-
let context_modifier = match modifier {
9426-
Some(Keyword::LOCAL) => ContextModifier::Local,
9427-
Some(Keyword::SESSION) => ContextModifier::Session,
9428-
_ => ContextModifier::None,
9429-
};
9430-
9431-
let role_name = if self.parse_keyword(Keyword::NONE) {
9432-
None
9433-
} else {
9434-
Some(self.parse_identifier(false)?)
9435-
};
9436-
return Ok(Statement::SetRole {
9437-
context_modifier,
9438-
role_name,
9439-
});
9444+
} else if let Some(set_role_stmt) =
9445+
self.maybe_parse(|parser| parser.parse_set_role(modifier))
9446+
{
9447+
return Ok(set_role_stmt);
94409448
}
94419449

94429450
let variables = if self.parse_keywords(&[Keyword::TIME, Keyword::ZONE]) {

tests/sqlparser_common.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7665,6 +7665,30 @@ fn parse_set_variable() {
76657665
one_statement_parses_to("SET SOMETHING TO '1'", "SET SOMETHING = '1'");
76667666
}
76677667

7668+
#[test]
7669+
fn parse_set_role_as_variable() {
7670+
match verified_stmt("SET role = 'foobar'") {
7671+
Statement::SetVariable {
7672+
local,
7673+
hivevar,
7674+
variables,
7675+
value,
7676+
} => {
7677+
assert!(!local);
7678+
assert!(!hivevar);
7679+
assert_eq!(
7680+
variables,
7681+
OneOrManyWithParens::One(ObjectName(vec!["role".into()]))
7682+
);
7683+
assert_eq!(
7684+
value,
7685+
vec![Expr::Value(Value::SingleQuotedString("foobar".into()))]
7686+
);
7687+
}
7688+
_ => unreachable!(),
7689+
}
7690+
}
7691+
76687692
#[test]
76697693
fn parse_double_colon_cast_at_timezone() {
76707694
let sql = "SELECT '2001-01-01T00:00:00.000Z'::TIMESTAMP AT TIME ZONE 'Europe/Brussels' FROM t";

0 commit comments

Comments
 (0)