Skip to content

Commit 03c58de

Browse files
authored
Add support for Hive dialect GROUPING SETS. (#1539)
* Add support for Hive GROUPING SETS dialect `GROUP BY a, b, c GROUPING SETS ((a, b), (a, c))` * Simplify HiveTest::testGroupByGroupingSets.
1 parent bf8a7db commit 03c58de

File tree

4 files changed

+47
-5
lines changed

4 files changed

+47
-5
lines changed

src/main/java/net/sf/jsqlparser/statement/select/GroupByElement.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,14 @@ public String toString() {
9595
if (groupByExpressions.isUsingBrackets()) {
9696
b.append(" )");
9797
}
98-
} else if (groupingSets.size() > 0) {
98+
} else if (groupByExpressions.isUsingBrackets()) {
99+
b.append("()");
100+
}
101+
102+
if (groupingSets.size() > 0) {
103+
if (b.charAt(b.length() - 1) != ' ') {
104+
b.append(' ');
105+
}
99106
b.append("GROUPING SETS (");
100107
boolean first = true;
101108
for (Object o : groupingSets) {
@@ -112,10 +119,6 @@ public String toString() {
112119
}
113120
}
114121
b.append(")");
115-
} else {
116-
if (groupByExpressions.isUsingBrackets()) {
117-
b.append("()");
118-
}
119122
}
120123

121124
return b.toString();

src/main/java/net/sf/jsqlparser/util/deparser/GroupByDeParser.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@ public void deParse(GroupByElement groupBy) {
5151
buffer.append(" )");
5252
}
5353
if (!groupBy.getGroupingSets().isEmpty()) {
54+
if (buffer.charAt(buffer.length() - 1) != ' ') {
55+
buffer.append(' ');
56+
}
5457
buffer.append("GROUPING SETS (");
5558
boolean first = true;
5659
for (Object o : groupBy.getGroupingSets()) {

src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2747,6 +2747,19 @@ GroupByElement GroupByColumnReferences():
27472747
<K_GROUP> <K_BY>
27482748
( LOOKAHEAD(2) (
27492749
"(" ")" { groupBy.withUsingBrackets(true); }
2750+
(
2751+
LOOKAHEAD(2) (
2752+
<K_GROUPING> <K_SETS> "("
2753+
( LOOKAHEAD(2) "(" ")" { groupBy.addGroupingSet(new ExpressionList()); }
2754+
| LOOKAHEAD(3) "(" list = SimpleExpressionList(true) ")" { groupBy.addGroupingSet(list); }
2755+
| expr = SimpleExpression() { groupBy.addGroupingSet(expr); } )
2756+
2757+
( "," ( LOOKAHEAD(2) "(" ")" { groupBy.addGroupingSet(new ExpressionList()); }
2758+
| LOOKAHEAD(3) "(" list = SimpleExpressionList(true) ")" { groupBy.addGroupingSet(list); }
2759+
| expr = SimpleExpression() { groupBy.addGroupingSet(expr); } ) )*
2760+
")"
2761+
)
2762+
)?
27502763
)
27512764
|
27522765
LOOKAHEAD(2) (
@@ -2763,6 +2776,19 @@ GroupByElement GroupByColumnReferences():
27632776
|
27642777
LOOKAHEAD(2) (
27652778
list = ComplexExpressionList() { groupBy.setGroupByExpressionList(list.withUsingBrackets(false)); }
2779+
(
2780+
LOOKAHEAD(2) (
2781+
<K_GROUPING> <K_SETS> "("
2782+
( LOOKAHEAD(2) "(" ")" { groupBy.addGroupingSet(new ExpressionList()); }
2783+
| LOOKAHEAD(3) "(" list = SimpleExpressionList(true) ")" { groupBy.addGroupingSet(list); }
2784+
| expr = SimpleExpression() { groupBy.addGroupingSet(expr); } )
2785+
2786+
( "," ( LOOKAHEAD(2) "(" ")" { groupBy.addGroupingSet(new ExpressionList()); }
2787+
| LOOKAHEAD(3) "(" list = SimpleExpressionList(true) ")" { groupBy.addGroupingSet(list); }
2788+
| expr = SimpleExpression() { groupBy.addGroupingSet(expr); } ) )*
2789+
")"
2790+
)
2791+
)?
27662792
)
27672793
)
27682794
{

src/test/java/net/sf/jsqlparser/statement/select/HiveTest.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,14 @@ public void testLeftSemiJoin() throws Exception {
4646

4747
assertSqlCanBeParsedAndDeparsed(sql, true);
4848
}
49+
50+
@Test
51+
public void testGroupByGroupingSets() throws Exception {
52+
String sql = "SELECT\n"
53+
+ " C1, C2, C3, MAX(Value)\n"
54+
+ "FROM\n"
55+
+ " Sometable\n"
56+
+ "GROUP BY C1, C2, C3 GROUPING SETS ((C1, C2), (C1, C2, C3), ())";
57+
assertSqlCanBeParsedAndDeparsed(sql, true);
58+
}
4959
}

0 commit comments

Comments
 (0)