Skip to content

Commit f2e6c1b

Browse files
authored
Merge branch 'apache:main' into tomers_branch
2 parents 8ee028a + 7c20d4a commit f2e6c1b

File tree

2 files changed

+48
-16
lines changed

2 files changed

+48
-16
lines changed

src/parser/mod.rs

+24-16
Original file line numberDiff line numberDiff line change
@@ -9400,27 +9400,35 @@ impl<'a> Parser<'a> {
94009400
}
94019401
}
94029402

9403+
/// Parse a `SET ROLE` statement. Expects SET to be consumed already.
9404+
fn parse_set_role(&mut self, modifier: Option<Keyword>) -> Result<Statement, ParserError> {
9405+
self.expect_keyword(Keyword::ROLE)?;
9406+
let context_modifier = match modifier {
9407+
Some(Keyword::LOCAL) => ContextModifier::Local,
9408+
Some(Keyword::SESSION) => ContextModifier::Session,
9409+
_ => ContextModifier::None,
9410+
};
9411+
9412+
let role_name = if self.parse_keyword(Keyword::NONE) {
9413+
None
9414+
} else {
9415+
Some(self.parse_identifier(false)?)
9416+
};
9417+
Ok(Statement::SetRole {
9418+
context_modifier,
9419+
role_name,
9420+
})
9421+
}
9422+
94039423
pub fn parse_set(&mut self) -> Result<Statement, ParserError> {
94049424
let modifier =
94059425
self.parse_one_of_keywords(&[Keyword::SESSION, Keyword::LOCAL, Keyword::HIVEVAR]);
94069426
if let Some(Keyword::HIVEVAR) = modifier {
94079427
self.expect_token(&Token::Colon)?;
9408-
} else if self.parse_keyword(Keyword::ROLE) {
9409-
let context_modifier = match modifier {
9410-
Some(Keyword::LOCAL) => ContextModifier::Local,
9411-
Some(Keyword::SESSION) => ContextModifier::Session,
9412-
_ => ContextModifier::None,
9413-
};
9414-
9415-
let role_name = if self.parse_keyword(Keyword::NONE) {
9416-
None
9417-
} else {
9418-
Some(self.parse_identifier(false)?)
9419-
};
9420-
return Ok(Statement::SetRole {
9421-
context_modifier,
9422-
role_name,
9423-
});
9428+
} else if let Some(set_role_stmt) =
9429+
self.maybe_parse(|parser| parser.parse_set_role(modifier))
9430+
{
9431+
return Ok(set_role_stmt);
94249432
}
94259433

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

tests/sqlparser_common.rs

+24
Original file line numberDiff line numberDiff line change
@@ -7618,6 +7618,30 @@ fn parse_set_variable() {
76187618
one_statement_parses_to("SET SOMETHING TO '1'", "SET SOMETHING = '1'");
76197619
}
76207620

7621+
#[test]
7622+
fn parse_set_role_as_variable() {
7623+
match verified_stmt("SET role = 'foobar'") {
7624+
Statement::SetVariable {
7625+
local,
7626+
hivevar,
7627+
variables,
7628+
value,
7629+
} => {
7630+
assert!(!local);
7631+
assert!(!hivevar);
7632+
assert_eq!(
7633+
variables,
7634+
OneOrManyWithParens::One(ObjectName(vec!["role".into()]))
7635+
);
7636+
assert_eq!(
7637+
value,
7638+
vec![Expr::Value(Value::SingleQuotedString("foobar".into()))]
7639+
);
7640+
}
7641+
_ => unreachable!(),
7642+
}
7643+
}
7644+
76217645
#[test]
76227646
fn parse_double_colon_cast_at_timezone() {
76237647
let sql = "SELECT '2001-01-01T00:00:00.000Z'::TIMESTAMP AT TIME ZONE 'Europe/Brussels' FROM t";

0 commit comments

Comments
 (0)