Skip to content

Commit ac5fc7c

Browse files
committed
feat: Support multiple values in SET
1 parent b3b4058 commit ac5fc7c

File tree

3 files changed

+72
-15
lines changed

3 files changed

+72
-15
lines changed

src/ast/mod.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1779,12 +1779,13 @@ impl fmt::Display for Statement {
17791779
.iter()
17801780
.map(|key_value| {
17811781
format!(
1782-
"{}{}",
1782+
"{}{} = {}",
17831783
if key_value.local { "LOCAL " } else { "" },
1784+
key_value.key,
17841785
key_value
17851786
.value
17861787
.iter()
1787-
.map(|value| format!("{} = {}", key_value.key, value))
1788+
.map(|value| format!("{}", value))
17881789
.collect::<Vec<String>>()
17891790
.join(", ")
17901791
)

src/parser.rs

Lines changed: 46 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3684,11 +3684,16 @@ impl<'a> Parser<'a> {
36843684
}
36853685

36863686
let mut key_values: Vec<SetVariableKeyValue> = vec![];
3687-
loop {
3687+
3688+
if dialect_of!(self is PostgreSqlDialect | RedshiftSqlDialect) {
36883689
let variable = self.parse_identifier()?;
36893690
let mut values = vec![];
36903691

3691-
if self.consume_token(&Token::Eq) || self.parse_keyword(Keyword::TO) {
3692+
if !self.consume_token(&Token::Eq) && !self.parse_keyword(Keyword::TO) {
3693+
return self.expected("equals sign or TO", self.peek_token());
3694+
}
3695+
3696+
loop {
36923697
let value = if let Ok(expr) = self.parse_expr() {
36933698
expr
36943699
} else {
@@ -3697,22 +3702,50 @@ impl<'a> Parser<'a> {
36973702

36983703
values.push(value);
36993704

3700-
key_values.push(SetVariableKeyValue {
3701-
key: variable,
3702-
value: values,
3703-
local: modifier == Some(Keyword::LOCAL),
3704-
hivevar: false,
3705-
});
3706-
3707-
if self.consume_token(&Token::Comma) {
3708-
continue;
3705+
if !self.consume_token(&Token::Comma) {
3706+
break;
37093707
}
3708+
}
37103709

3711-
return Ok(Statement::SetVariable { key_values });
3712-
} else {
3710+
key_values.push(SetVariableKeyValue {
3711+
key: variable,
3712+
value: values,
3713+
local: modifier == Some(Keyword::LOCAL),
3714+
hivevar: false,
3715+
});
3716+
3717+
return Ok(Statement::SetVariable { key_values });
3718+
}
3719+
3720+
loop {
3721+
let variable = self.parse_identifier()?;
3722+
let mut values = vec![];
3723+
3724+
if !self.consume_token(&Token::Eq) && !self.parse_keyword(Keyword::TO) {
37133725
return self.expected("equals sign or TO", self.peek_token());
37143726
}
3727+
3728+
let value = if let Ok(expr) = self.parse_expr() {
3729+
expr
3730+
} else {
3731+
self.expected("variable value", self.peek_token())?
3732+
};
3733+
3734+
values.push(value);
3735+
3736+
key_values.push(SetVariableKeyValue {
3737+
key: variable,
3738+
value: values,
3739+
local: modifier == Some(Keyword::LOCAL),
3740+
hivevar: false,
3741+
});
3742+
3743+
if !self.consume_token(&Token::Comma) {
3744+
break;
3745+
}
37153746
}
3747+
3748+
Ok(Statement::SetVariable { key_values })
37163749
}
37173750

37183751
pub fn parse_show(&mut self) -> Result<Statement, ParserError> {

tests/sqlparser_postgres.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -790,6 +790,29 @@ fn parse_set() {
790790
}
791791
);
792792

793+
let stmt = pg().verified_stmt("SET a = b, c");
794+
assert_eq!(
795+
stmt,
796+
Statement::SetVariable {
797+
key_values: [SetVariableKeyValue {
798+
key: "a".into(),
799+
value: vec![
800+
Expr::Identifier(Ident {
801+
value: "b".into(),
802+
quote_style: None
803+
}),
804+
Expr::Identifier(Ident {
805+
value: "c".into(),
806+
quote_style: None
807+
}),
808+
],
809+
local: false,
810+
hivevar: false,
811+
}]
812+
.to_vec()
813+
}
814+
);
815+
793816
let stmt = pg_and_generic().verified_stmt("SET a = 'b'");
794817
assert_eq!(
795818
stmt,

0 commit comments

Comments
 (0)