Skip to content

Commit db46fa3

Browse files
committed
Add support for Hive GROUPING SETS dialect GROUP BY a, b, c GROUPING SETS ((a, b), (a, c))
1 parent e4ec041 commit db46fa3

File tree

4 files changed

+57
-5
lines changed

4 files changed

+57
-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
@@ -2734,6 +2734,19 @@ GroupByElement GroupByColumnReferences():
27342734
<K_GROUP> <K_BY>
27352735
( LOOKAHEAD(2) (
27362736
"(" ")" { groupBy.withUsingBrackets(true); }
2737+
(
2738+
LOOKAHEAD(2) (
2739+
<K_GROUPING> <K_SETS> "("
2740+
( LOOKAHEAD(2) "(" ")" { groupBy.addGroupingSet(new ExpressionList()); }
2741+
| LOOKAHEAD(3) "(" list = SimpleExpressionList(true) ")" { groupBy.addGroupingSet(list); }
2742+
| expr = SimpleExpression() { groupBy.addGroupingSet(expr); } )
2743+
2744+
( "," ( LOOKAHEAD(2) "(" ")" { groupBy.addGroupingSet(new ExpressionList()); }
2745+
| LOOKAHEAD(3) "(" list = SimpleExpressionList(true) ")" { groupBy.addGroupingSet(list); }
2746+
| expr = SimpleExpression() { groupBy.addGroupingSet(expr); } ) )*
2747+
")"
2748+
)
2749+
)?
27372750
)
27382751
|
27392752
LOOKAHEAD(2) (
@@ -2750,6 +2763,19 @@ GroupByElement GroupByColumnReferences():
27502763
|
27512764
LOOKAHEAD(2) (
27522765
list = ComplexExpressionList() { groupBy.setGroupByExpressionList(list.withUsingBrackets(false)); }
2766+
(
2767+
LOOKAHEAD(2) (
2768+
<K_GROUPING> <K_SETS> "("
2769+
( LOOKAHEAD(2) "(" ")" { groupBy.addGroupingSet(new ExpressionList()); }
2770+
| LOOKAHEAD(3) "(" list = SimpleExpressionList(true) ")" { groupBy.addGroupingSet(list); }
2771+
| expr = SimpleExpression() { groupBy.addGroupingSet(expr); } )
2772+
2773+
( "," ( LOOKAHEAD(2) "(" ")" { groupBy.addGroupingSet(new ExpressionList()); }
2774+
| LOOKAHEAD(3) "(" list = SimpleExpressionList(true) ")" { groupBy.addGroupingSet(list); }
2775+
| expr = SimpleExpression() { groupBy.addGroupingSet(expr); } ) )*
2776+
")"
2777+
)
2778+
)?
27532779
)
27542780
)
27552781
{

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

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

4747
assertSqlCanBeParsedAndDeparsed(sql, true);
4848
}
49+
50+
@Test
51+
public void testGroupByGroupingSets() throws Exception {
52+
String sql;
53+
Statement statement;
54+
55+
sql = "SELECT\n"
56+
+ " C1, C2, C3, MAX(Value)\n"
57+
+ "FROM\n"
58+
+ " Sometable\n"
59+
+ "GROUP BY C1, C2, C3 GROUPING SETS ((C1, C2), (C1, C2, C3), ())";
60+
61+
statement = CCJSqlParserUtil.parse(sql);
62+
63+
System.out.println(statement.toString());
64+
65+
Select select = (Select) statement;
66+
assertStatementCanBeDeparsedAs(select, sql, true);
67+
assertSqlCanBeParsedAndDeparsed(sql, true);
68+
}
4969
}

0 commit comments

Comments
 (0)