Fix: GROUPING SETS accept values without parenthesis (#1867)

This commit is contained in:
Denys Tsomenko 2025-06-02 19:04:35 +03:00 committed by GitHub
parent 80d47eee84
commit 394a534486
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 39 additions and 1 deletions

View file

@ -10111,7 +10111,13 @@ impl<'a> Parser<'a> {
} }
if self.parse_keywords(&[Keyword::GROUPING, Keyword::SETS]) { if self.parse_keywords(&[Keyword::GROUPING, Keyword::SETS]) {
self.expect_token(&Token::LParen)?; self.expect_token(&Token::LParen)?;
let result = self.parse_comma_separated(|p| p.parse_tuple(true, true))?; let result = self.parse_comma_separated(|p| {
if p.peek_token_ref().token == Token::LParen {
p.parse_tuple(true, true)
} else {
Ok(vec![p.parse_expr()?])
}
})?;
self.expect_token(&Token::RParen)?; self.expect_token(&Token::RParen)?;
modifiers.push(GroupByWithModifier::GroupingSets(Expr::GroupingSets( modifiers.push(GroupByWithModifier::GroupingSets(Expr::GroupingSets(
result, result,

View file

@ -2822,6 +2822,38 @@ fn parse_group_by_special_grouping_sets() {
} }
} }
#[test]
fn parse_group_by_grouping_sets_single_values() {
let sql = "SELECT a, b, SUM(c) FROM tab1 GROUP BY a, b GROUPING SETS ((a, b), a, (b), c, ())";
let canonical =
"SELECT a, b, SUM(c) FROM tab1 GROUP BY a, b GROUPING SETS ((a, b), (a), (b), (c), ())";
match all_dialects().one_statement_parses_to(sql, canonical) {
Statement::Query(query) => {
let group_by = &query.body.as_select().unwrap().group_by;
assert_eq!(
group_by,
&GroupByExpr::Expressions(
vec![
Expr::Identifier(Ident::new("a")),
Expr::Identifier(Ident::new("b"))
],
vec![GroupByWithModifier::GroupingSets(Expr::GroupingSets(vec![
vec![
Expr::Identifier(Ident::new("a")),
Expr::Identifier(Ident::new("b"))
],
vec![Expr::Identifier(Ident::new("a"))],
vec![Expr::Identifier(Ident::new("b"))],
vec![Expr::Identifier(Ident::new("c"))],
vec![]
]))]
)
);
}
_ => unreachable!(),
}
}
#[test] #[test]
fn parse_select_having() { fn parse_select_having() {
let sql = "SELECT foo FROM bar GROUP BY foo HAVING COUNT(*) > 1"; let sql = "SELECT foo FROM bar GROUP BY foo HAVING COUNT(*) > 1";