Skip to content

Commit 3225ad3

Browse files
MazterQyoumcheshkov
authored andcommitted
feat: Support multiple values in SET
1 parent e3018cf commit 3225ad3

File tree

3 files changed

+72
-15
lines changed

3 files changed

+72
-15
lines changed

src/ast/mod.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -1858,12 +1858,13 @@ impl fmt::Display for Statement {
18581858
.iter()
18591859
.map(|key_value| {
18601860
format!(
1861-
"{}{}",
1861+
"{}{} = {}",
18621862
if key_value.local { "LOCAL " } else { "" },
1863+
key_value.key,
18631864
key_value
18641865
.value
18651866
.iter()
1866-
.map(|value| format!("{} = {}", key_value.key, value))
1867+
.map(|value| format!("{}", value))
18671868
.collect::<Vec<String>>()
18681869
.join(", ")
18691870
)

src/parser.rs

+46-13
Original file line numberDiff line numberDiff line change
@@ -3746,11 +3746,16 @@ impl<'a> Parser<'a> {
37463746
}
37473747

37483748
let mut key_values: Vec<SetVariableKeyValue> = vec![];
3749-
loop {
3749+
3750+
if dialect_of!(self is PostgreSqlDialect | RedshiftSqlDialect) {
37503751
let variable = self.parse_object_name()?;
37513752
let mut values = vec![];
37523753

3753-
if self.consume_token(&Token::Eq) || self.parse_keyword(Keyword::TO) {
3754+
if !self.consume_token(&Token::Eq) && !self.parse_keyword(Keyword::TO) {
3755+
return self.expected("equals sign or TO", self.peek_token());
3756+
}
3757+
3758+
loop {
37543759
let value = if let Ok(expr) = self.parse_expr() {
37553760
expr
37563761
} else {
@@ -3759,22 +3764,50 @@ impl<'a> Parser<'a> {
37593764

37603765
values.push(value);
37613766

3762-
key_values.push(SetVariableKeyValue {
3763-
key: variable,
3764-
value: values,
3765-
local: modifier == Some(Keyword::LOCAL),
3766-
hivevar: false,
3767-
});
3768-
3769-
if self.consume_token(&Token::Comma) {
3770-
continue;
3767+
if !self.consume_token(&Token::Comma) {
3768+
break;
37713769
}
3770+
}
37723771

3773-
return Ok(Statement::SetVariable { key_values });
3774-
} else {
3772+
key_values.push(SetVariableKeyValue {
3773+
key: variable,
3774+
value: values,
3775+
local: modifier == Some(Keyword::LOCAL),
3776+
hivevar: false,
3777+
});
3778+
3779+
return Ok(Statement::SetVariable { key_values });
3780+
}
3781+
3782+
loop {
3783+
let variable = self.parse_object_name()?;
3784+
let mut values = vec![];
3785+
3786+
if !self.consume_token(&Token::Eq) && !self.parse_keyword(Keyword::TO) {
37753787
return self.expected("equals sign or TO", self.peek_token());
37763788
}
3789+
3790+
let value = if let Ok(expr) = self.parse_expr() {
3791+
expr
3792+
} else {
3793+
self.expected("variable value", self.peek_token())?
3794+
};
3795+
3796+
values.push(value);
3797+
3798+
key_values.push(SetVariableKeyValue {
3799+
key: variable,
3800+
value: values,
3801+
local: modifier == Some(Keyword::LOCAL),
3802+
hivevar: false,
3803+
});
3804+
3805+
if !self.consume_token(&Token::Comma) {
3806+
break;
3807+
}
37773808
}
3809+
3810+
Ok(Statement::SetVariable { key_values })
37783811
}
37793812

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

tests/sqlparser_postgres.rs

+23
Original file line numberDiff line numberDiff line change
@@ -792,6 +792,29 @@ fn parse_set() {
792792
}
793793
);
794794

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

0 commit comments

Comments
 (0)