Skip to content

Commit 5d81654

Browse files
committed
use parse_comma_separated0 for parsing array and map elements
1 parent 0763f52 commit 5d81654

File tree

1 file changed

+29
-26
lines changed

1 file changed

+29
-26
lines changed

src/parser/mod.rs

Lines changed: 29 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1849,17 +1849,9 @@ impl<'a> Parser<'a> {
18491849
/// Parses an array expression `[ex1, ex2, ..]`
18501850
/// if `named` is `true`, came from an expression like `ARRAY[ex1, ex2]`
18511851
pub fn parse_array_expr(&mut self, named: bool) -> Result<Expr, ParserError> {
1852-
if self.peek_token().token == Token::RBracket {
1853-
let _ = self.next_token(); // consume ]
1854-
Ok(Expr::Array(Array {
1855-
elem: vec![],
1856-
named,
1857-
}))
1858-
} else {
1859-
let exprs = self.parse_comma_separated(Parser::parse_expr)?;
1860-
self.expect_token(&Token::RBracket)?;
1861-
Ok(Expr::Array(Array { elem: exprs, named }))
1862-
}
1852+
let exprs = self.parse_comma_separated0(Parser::parse_expr, false, Token::RBracket)?;
1853+
self.expect_token(&Token::RBracket)?;
1854+
Ok(Expr::Array(Array { elem: exprs, named }))
18631855
}
18641856

18651857
pub fn parse_listagg_on_overflow(&mut self) -> Result<Option<ListAggOnOverflow>, ParserError> {
@@ -2352,14 +2344,10 @@ impl<'a> Parser<'a> {
23522344
/// [map]: https://duckdb.org/docs/sql/data_types/map.html#creating-maps
23532345
fn parse_duckdb_map_literal(&mut self) -> Result<Expr, ParserError> {
23542346
self.expect_token(&Token::LBrace)?;
2355-
if self.peek_token().token == Token::RBrace {
2356-
let _ = self.next_token(); // consume }
2357-
Ok(Expr::Map(Map { entries: vec![] }))
2358-
} else {
2359-
let fields = self.parse_comma_separated(Self::parse_duckdb_map_field)?;
2360-
self.expect_token(&Token::RBrace)?;
2361-
Ok(Expr::Map(Map { entries: fields }))
2362-
}
2347+
let fields =
2348+
self.parse_comma_separated0(Self::parse_duckdb_map_field, false, Token::RBrace)?;
2349+
self.expect_token(&Token::RBrace)?;
2350+
Ok(Expr::Map(Map { entries: fields }))
23632351
}
23642352

23652353
/// Parse a field for a duckdb [map]
@@ -2939,7 +2927,11 @@ impl<'a> Parser<'a> {
29392927
Expr::InList {
29402928
expr: Box::new(expr),
29412929
list: if self.dialect.supports_in_empty_list() {
2942-
self.parse_comma_separated0(Parser::parse_expr, self.options.trailing_commas, Token::RParen)?
2930+
self.parse_comma_separated0(
2931+
Parser::parse_expr,
2932+
self.options.trailing_commas,
2933+
Token::RParen,
2934+
)?
29432935
} else {
29442936
self.parse_comma_separated(Parser::parse_expr)?
29452937
},
@@ -3483,17 +3475,20 @@ impl<'a> Parser<'a> {
34833475
/// Parse a comma-separated list of 0+ items accepted by `F`
34843476
/// - [trailing_commas]: support trailing_commas or not
34853477
/// - [end_token]: expected end token for the closure (e.g. [Token::RParen], [Token::RBrace] ...)
3486-
pub fn parse_comma_separated0<T, F>(&mut self, f: F, trailing_commas: bool, end_token: Token) -> Result<Vec<T>, ParserError>
3478+
pub fn parse_comma_separated0<T, F>(
3479+
&mut self,
3480+
f: F,
3481+
trailing_commas: bool,
3482+
end_token: Token,
3483+
) -> Result<Vec<T>, ParserError>
34873484
where
34883485
F: FnMut(&mut Parser<'a>) -> Result<T, ParserError>,
34893486
{
34903487
if self.peek_token().token == end_token {
34913488
return Ok(vec![]);
34923489
}
34933490

3494-
if trailing_commas
3495-
&& self.peek_tokens() == [Token::Comma, end_token]
3496-
{
3491+
if trailing_commas && self.peek_tokens() == [Token::Comma, end_token] {
34973492
let _ = self.consume_token(&Token::Comma);
34983493
return Ok(vec![]);
34993494
}
@@ -4062,7 +4057,11 @@ impl<'a> Parser<'a> {
40624057
})
40634058
};
40644059
self.expect_token(&Token::LParen)?;
4065-
let args = self.parse_comma_separated0(parse_function_param, self.options.trailing_commas, Token::RParen)?;
4060+
let args = self.parse_comma_separated0(
4061+
parse_function_param,
4062+
self.options.trailing_commas,
4063+
Token::RParen,
4064+
)?;
40664065
self.expect_token(&Token::RParen)?;
40674066

40684067
let return_type = if self.parse_keyword(Keyword::RETURNS) {
@@ -10716,7 +10715,11 @@ impl<'a> Parser<'a> {
1071610715
}
1071710716

1071810717
if self.consume_token(&Token::LParen) {
10719-
let interpolations = self.parse_comma_separated0(|p| p.parse_interpolation(), self.options.trailing_commas, Token::RParen)?;
10718+
let interpolations = self.parse_comma_separated0(
10719+
|p| p.parse_interpolation(),
10720+
self.options.trailing_commas,
10721+
Token::RParen,
10722+
)?;
1072010723
self.expect_token(&Token::RParen)?;
1072110724
// INTERPOLATE () and INTERPOLATE ( ... ) variants
1072210725
return Ok(Some(Interpolate {

0 commit comments

Comments
 (0)