mirror of
https://github.com/apache/datafusion-sqlparser-rs.git
synced 2025-09-14 18:05:06 +00:00
Support subquery expression in SET expressions (#1343)
This commit is contained in:
parent
845a1aaddd
commit
028ada8350
2 changed files with 57 additions and 15 deletions
|
@ -1208,10 +1208,8 @@ impl<'a> Parser<'a> {
|
||||||
Ok(Expr::Value(self.parse_value()?))
|
Ok(Expr::Value(self.parse_value()?))
|
||||||
}
|
}
|
||||||
Token::LParen => {
|
Token::LParen => {
|
||||||
let expr =
|
let expr = if let Some(expr) = self.try_parse_expr_sub_query()? {
|
||||||
if self.parse_keyword(Keyword::SELECT) || self.parse_keyword(Keyword::WITH) {
|
expr
|
||||||
self.prev_token();
|
|
||||||
Expr::Subquery(self.parse_boxed_query()?)
|
|
||||||
} else if let Some(lambda) = self.try_parse_lambda() {
|
} else if let Some(lambda) = self.try_parse_lambda() {
|
||||||
return Ok(lambda);
|
return Ok(lambda);
|
||||||
} else {
|
} else {
|
||||||
|
@ -1263,6 +1261,18 @@ impl<'a> Parser<'a> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn try_parse_expr_sub_query(&mut self) -> Result<Option<Expr>, ParserError> {
|
||||||
|
if self
|
||||||
|
.parse_one_of_keywords(&[Keyword::SELECT, Keyword::WITH])
|
||||||
|
.is_none()
|
||||||
|
{
|
||||||
|
return Ok(None);
|
||||||
|
}
|
||||||
|
self.prev_token();
|
||||||
|
|
||||||
|
Ok(Some(Expr::Subquery(self.parse_boxed_query()?)))
|
||||||
|
}
|
||||||
|
|
||||||
fn try_parse_lambda(&mut self) -> Option<Expr> {
|
fn try_parse_lambda(&mut self) -> Option<Expr> {
|
||||||
if !self.dialect.supports_lambda_functions() {
|
if !self.dialect.supports_lambda_functions() {
|
||||||
return None;
|
return None;
|
||||||
|
@ -8709,7 +8719,9 @@ impl<'a> Parser<'a> {
|
||||||
|
|
||||||
let mut values = vec![];
|
let mut values = vec![];
|
||||||
loop {
|
loop {
|
||||||
let value = if let Ok(expr) = self.parse_expr() {
|
let value = if let Some(expr) = self.try_parse_expr_sub_query()? {
|
||||||
|
expr
|
||||||
|
} else if let Ok(expr) = self.parse_expr() {
|
||||||
expr
|
expr
|
||||||
} else {
|
} else {
|
||||||
self.expected("variable value", self.peek_token())?
|
self.expected("variable value", self.peek_token())?
|
||||||
|
|
|
@ -7135,9 +7135,39 @@ fn parse_set_variable() {
|
||||||
_ => unreachable!(),
|
_ => unreachable!(),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Subquery expression
|
||||||
|
for (sql, canonical) in [
|
||||||
|
(
|
||||||
|
"SET (a) = (SELECT 22 FROM tbl1)",
|
||||||
|
"SET (a) = ((SELECT 22 FROM tbl1))",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"SET (a) = (SELECT 22 FROM tbl1, (SELECT 1 FROM tbl2))",
|
||||||
|
"SET (a) = ((SELECT 22 FROM tbl1, (SELECT 1 FROM tbl2)))",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"SET (a) = ((SELECT 22 FROM tbl1, (SELECT 1 FROM tbl2)))",
|
||||||
|
"SET (a) = ((SELECT 22 FROM tbl1, (SELECT 1 FROM tbl2)))",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"SET (a, b) = ((SELECT 22 FROM tbl1, (SELECT 1 FROM tbl2)), SELECT 33 FROM tbl3)",
|
||||||
|
"SET (a, b) = ((SELECT 22 FROM tbl1, (SELECT 1 FROM tbl2)), (SELECT 33 FROM tbl3))",
|
||||||
|
),
|
||||||
|
] {
|
||||||
|
multi_variable_dialects.one_statement_parses_to(sql, canonical);
|
||||||
|
}
|
||||||
|
|
||||||
let error_sqls = [
|
let error_sqls = [
|
||||||
("SET (a, b, c) = (1, 2, 3", "Expected: ), found: EOF"),
|
("SET (a, b, c) = (1, 2, 3", "Expected: ), found: EOF"),
|
||||||
("SET (a, b, c) = 1, 2, 3", "Expected: (, found: 1"),
|
("SET (a, b, c) = 1, 2, 3", "Expected: (, found: 1"),
|
||||||
|
(
|
||||||
|
"SET (a) = ((SELECT 22 FROM tbl1)",
|
||||||
|
"Expected: ), found: EOF",
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"SET (a) = ((SELECT 22 FROM tbl1) (SELECT 22 FROM tbl1))",
|
||||||
|
"Expected: ), found: (",
|
||||||
|
),
|
||||||
];
|
];
|
||||||
for (sql, error) in error_sqls {
|
for (sql, error) in error_sqls {
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue