Skip to content

Commit 7fbbbbd

Browse files
MazterQyouovr
authored andcommitted
fix: Support SET ROLE with TO/=
1 parent 3dd0e30 commit 7fbbbbd

3 files changed

Lines changed: 15 additions & 15 deletions

File tree

src/parser/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15140,6 +15140,7 @@ impl<'a> Parser<'a> {
1514015140
modifier: Option<ContextModifier>,
1514115141
) -> Result<Statement, ParserError> {
1514215142
self.expect_keyword_is(Keyword::ROLE)?;
15143+
let _ = self.consume_token(&Token::Eq) || self.parse_keyword(Keyword::TO);
1514315144

1514415145
let role_name = if self.parse_keyword(Keyword::NONE) {
1514515146
None

tests/sqlparser_common.rs

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9316,22 +9316,16 @@ fn parse_set_variable() {
93169316

93179317
#[test]
93189318
fn parse_set_role_as_variable() {
9319-
match verified_stmt("SET role = 'foobar'") {
9320-
Statement::Set(Set::SingleAssignment {
9321-
scope,
9322-
hivevar,
9323-
variable,
9324-
values,
9319+
// In this fork, `SET ROLE` (including the `=`/`TO` forms) is always parsed as a
9320+
// dedicated SET ROLE statement rather than a generic variable assignment, so
9321+
// `SET role = 'foobar'` becomes a `Set::SetRole` and round-trips to `SET ROLE 'foobar'`.
9322+
match one_statement_parses_to("SET role = 'foobar'", "SET ROLE 'foobar'") {
9323+
Statement::Set(Set::SetRole {
9324+
context_modifier,
9325+
role_name,
93259326
}) => {
9326-
assert_eq!(scope, None);
9327-
assert!(!hivevar);
9328-
assert_eq!(variable, ObjectName::from(vec!["role".into()]));
9329-
assert_eq!(
9330-
values,
9331-
vec![Expr::Value(
9332-
(Value::SingleQuotedString("foobar".into())).with_empty_span()
9333-
)]
9334-
);
9327+
assert_eq!(context_modifier, None);
9328+
assert_eq!(role_name, Some(Ident::with_quote('\'', "foobar")));
93359329
}
93369330
_ => unreachable!(),
93379331
}

tests/sqlparser_postgres.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1878,6 +1878,10 @@ fn parse_set_role() {
18781878

18791879
let query = "SET LOCAL ROLE \"rolename\"";
18801880
let stmt = pg_and_generic().verified_stmt(query);
1881+
pg_and_generic().one_statement_parses_to(
1882+
"SET LOCAL ROLE = \"rolename\"",
1883+
"SET LOCAL ROLE \"rolename\"",
1884+
);
18811885
assert_eq!(
18821886
stmt,
18831887
Statement::Set(Set::SetRole {
@@ -1893,6 +1897,7 @@ fn parse_set_role() {
18931897

18941898
let query = "SET ROLE 'rolename'";
18951899
let stmt = pg_and_generic().verified_stmt(query);
1900+
pg_and_generic().one_statement_parses_to("SET ROLE TO 'rolename'", "SET ROLE 'rolename'");
18961901
assert_eq!(
18971902
stmt,
18981903
Statement::Set(Set::SetRole {

0 commit comments

Comments
 (0)