Skip to content

Commit 421381c

Browse files
setting multiple variables at once (MySQL)
1 parent 945e4ac commit 421381c

File tree

7 files changed

+59
-27
lines changed

7 files changed

+59
-27
lines changed

src/dialect/hive.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,6 @@ impl Dialect for HiveDialect {
4444
true
4545
}
4646

47-
fn supports_set_multiple_values(&self) -> bool {
48-
true
49-
}
50-
5147
fn supports_numeric_prefix(&self) -> bool {
5248
true
5349
}

src/dialect/mod.rs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -352,12 +352,6 @@ pub trait Dialect: Debug + Any {
352352
false
353353
}
354354

355-
/// Returns true if the dialect supports multiple values in a SET expression
356-
/// e.g. `SET OFFSETS SELECT, FROM, ORDER, TABLE, PROCEDURE, EXECUTE ON`
357-
fn supports_set_multiple_values(&self) -> bool {
358-
false
359-
}
360-
361355
/// Returns true if the dialects supports specifying null treatment
362356
/// as part of a window function's parameter list as opposed
363357
/// to after the parameter list.

src/dialect/mssql.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,6 @@ impl Dialect for MsSqlDialect {
5858
true
5959
}
6060

61-
fn supports_set_multiple_values(&self) -> bool {
62-
true
63-
}
64-
6561
fn supports_try_convert(&self) -> bool {
6662
true
6763
}

src/keywords.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,6 @@ define_keywords!(
173173
CHANNEL,
174174
CHAR,
175175
CHARACTER,
176-
CHARACTERISTIC,
177176
CHARACTERS,
178177
CHARACTER_LENGTH,
179178
CHARSET,
@@ -558,7 +557,6 @@ define_keywords!(
558557
MULTISET,
559558
MUTATION,
560559
NAME,
561-
NAMES,
562560
NANOSECOND,
563561
NANOSECONDS,
564562
NATIONAL,

src/parser/mod.rs

Lines changed: 54 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10992,17 +10992,66 @@ impl<'a> Parser<'a> {
1099210992
}
1099310993
}
1099410994

10995-
pub fn parse_set(&mut self) -> Result<Statement, ParserError> {
10995+
fn parse_set_assignment(
10996+
&mut self,
10997+
) -> Result<(OneOrManyWithParens<ObjectName>, Expr), ParserError> {
10998+
let variables = if self.dialect.supports_parenthesized_set_variables()
10999+
&& self.consume_token(&Token::LParen)
11000+
{
11001+
let vars = OneOrManyWithParens::Many(
11002+
self.parse_comma_separated(|parser: &mut Parser<'a>| parser.parse_identifier())?
11003+
.into_iter()
11004+
.map(|ident| ObjectName::from(vec![ident]))
11005+
.collect(),
11006+
);
11007+
self.expect_token(&Token::RParen)?;
11008+
vars
11009+
} else {
11010+
OneOrManyWithParens::One(self.parse_object_name(false)?)
11011+
};
11012+
11013+
if !(self.consume_token(&Token::Eq) || self.parse_keyword(Keyword::TO)) {
11014+
return self.expected("assignment operator", self.peek_token());
11015+
}
11016+
11017+
let values = self.parse_expr()?;
11018+
11019+
Ok((variables, values))
11020+
}
11021+
11022+
fn parse_set(&mut self) -> Result<Statement, ParserError> {
1099611023
let modifier =
1099711024
self.parse_one_of_keywords(&[Keyword::SESSION, Keyword::LOCAL, Keyword::HIVEVAR]);
11025+
1099811026
if let Some(Keyword::HIVEVAR) = modifier {
1099911027
self.expect_token(&Token::Colon)?;
11000-
} else if let Some(set_role_stmt) =
11001-
self.maybe_parse(|parser| parser.parse_set_role(modifier))?
11002-
{
11028+
}
11029+
11030+
if let Some(set_role_stmt) = self.maybe_parse(|parser| parser.parse_set_role(modifier))? {
1100311031
return Ok(set_role_stmt);
1100411032
}
1100511033

11034+
if self.dialect.supports_comma_separated_set_assignments() {
11035+
if let Ok(v) = self
11036+
.try_parse(|parser| Ok(parser.parse_comma_separated(Parser::parse_set_assignment)?))
11037+
{
11038+
let (variables, values): (Vec<_>, Vec<_>) = v.into_iter().unzip();
11039+
11040+
let variables = if variables.len() == 1 {
11041+
variables.into_iter().next().unwrap()
11042+
} else {
11043+
OneOrManyWithParens::Many(variables.into_iter().flatten().map(|v| v).collect())
11044+
};
11045+
11046+
return Ok(Statement::SetVariable {
11047+
local: modifier == Some(Keyword::LOCAL),
11048+
hivevar: modifier == Some(Keyword::HIVEVAR),
11049+
variables,
11050+
value: values,
11051+
});
11052+
}
11053+
}
11054+
1100611055
let variables = if self.parse_keywords(&[Keyword::TIME, Keyword::ZONE]) {
1100711056
OneOrManyWithParens::One(ObjectName::from(vec!["TIMEZONE".into()]))
1100811057
} else if self.dialect.supports_parenthesized_set_variables()
@@ -11022,7 +11071,7 @@ impl<'a> Parser<'a> {
1102211071

1102311072
if self.consume_token(&Token::Eq) || self.parse_keyword(Keyword::TO) {
1102411073
let parenthesized_assignment = matches!(&variables, OneOrManyWithParens::Many(_));
11025-
let values = self.parse_set_values(parenthesized_assignment);
11074+
let values = self.parse_set_values(parenthesized_assignment)?;
1102611075

1102711076
return Ok(Statement::SetVariable {
1102811077
local: modifier == Some(Keyword::LOCAL),

t.sql

Lines changed: 0 additions & 1 deletion
This file was deleted.

tests/sqlparser_common.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8618,10 +8618,10 @@ fn parse_set_variable() {
86188618
"SET (a) = ((SELECT 22 FROM tbl1, (SELECT 1 FROM tbl2)))",
86198619
"SET (a) = ((SELECT 22 FROM tbl1, (SELECT 1 FROM tbl2)))",
86208620
),
8621-
// (
8622-
// "SET (a, b) = ((SELECT 22 FROM tbl1, (SELECT 1 FROM tbl2)), SELECT 33 FROM tbl3)",
8623-
// "SET (a, b) = ((SELECT 22 FROM tbl1, (SELECT 1 FROM tbl2)), (SELECT 33 FROM tbl3))",
8624-
// ),
8621+
(
8622+
"SET (a, b) = ((SELECT 22 FROM tbl1, (SELECT 1 FROM tbl2)), SELECT 33 FROM tbl3)",
8623+
"SET (a, b) = ((SELECT 22 FROM tbl1, (SELECT 1 FROM tbl2)), (SELECT 33 FROM tbl3))",
8624+
),
86258625
] {
86268626
multi_variable_dialects.one_statement_parses_to(sql, canonical);
86278627
}
@@ -14653,8 +14653,8 @@ fn parse_multiple_set_statements() -> Result<(), ParserError> {
1465314653
Statement::SetVariable {
1465414654
variables, value, ..
1465514655
} => {
14656-
assert_eq!(variables.len(), 2);
1465714656
assert_eq!(value.len(), 2);
14657+
assert_eq!(variables.len(), 2);
1465814658
}
1465914659
_ => assert!(false, "Expected SetVariable with 2 variables and 2 values"),
1466014660
};

0 commit comments

Comments
 (0)