Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -33,16 +33,17 @@

public class GroupingInfo {
public static final String COL_GROUPING_ID = "GROUPING_ID";

private GroupByClause groupByClause;
private VirtualSlotRef groupingIDSlot;
private TupleDescriptor virtualTuple;
private Set<VirtualSlotRef> groupingSlots;
private List<BitSet> groupingIdList;
private GroupByClause.GroupingType groupingType;
private BitSet bitSetAll;

public GroupingInfo(Analyzer analyzer, GroupByClause.GroupingType groupingType) throws AnalysisException {
this.groupingType = groupingType;
public GroupingInfo(Analyzer analyzer, GroupByClause groupByClause) throws AnalysisException {
this.groupByClause = groupByClause;
this.groupingType = groupByClause.getGroupingType();
groupingSlots = new LinkedHashSet<>();
virtualTuple = analyzer.getDescTbl().createTupleDescriptor("VIRTUAL_TUPLE");
groupingIDSlot = new VirtualSlotRef(COL_GROUPING_ID, Type.BIGINT, virtualTuple, new ArrayList<>());
Expand Down Expand Up @@ -190,6 +191,9 @@ public void substituteGroupingFn(Expr expr, Analyzer analyzer) throws AnalysisEx
if (colIndex != -1 && !(ref.getViewStmt().getResultExprs().get(colIndex) instanceof SlotRef)) {
throw new AnalysisException("grouping functions only support column in current version.");
}
} else if (!groupByClause.getGroupingExprs().contains(child)) {
throw new AnalysisException("select list expression not produced by aggregation output" +
" (missing from GROUP BY clause?): " + ((SlotRef) child).getColumnName());
}
}
// if is substituted skip
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -447,7 +447,7 @@ public void analyze(Analyzer analyzer) throws UserException {
}
}
}
groupingInfo = new GroupingInfo(analyzer, groupByClause.getGroupingType());
groupingInfo = new GroupingInfo(analyzer, groupByClause);
groupingInfo.substituteGroupingFn(resultExprs, analyzer);
} else {
for (Expr expr : resultExprs) {
Expand Down Expand Up @@ -1881,4 +1881,3 @@ public boolean equals(Object obj) {
return this.id.equals(((SelectStmt) obj).id);
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -83,10 +83,10 @@ public void testGroupingSets() {
GroupByClause.GroupingType.GROUPING_SETS);
GroupingInfo groupingInfo = null;
try {
groupingInfo = new GroupingInfo(analyzer, GroupByClause.GroupingType.GROUPING_SETS);
groupByClause.genGroupingExprs();
groupingInfo.buildRepeat(groupByClause.getGroupingExprs(), groupByClause.getGroupingSetList());
groupByClause.analyze(analyzer);
groupingInfo = new GroupingInfo(analyzer, groupByClause);
groupingInfo.buildRepeat(groupByClause.getGroupingExprs(), groupByClause.getGroupingSetList());
} catch (AnalysisException exception) {
exception.printStackTrace();
Assert.assertTrue(false);
Expand Down Expand Up @@ -124,10 +124,10 @@ public void testRollUp() {
GroupByClause.GroupingType.ROLLUP);
GroupingInfo groupingInfo = null;
try {
groupingInfo = new GroupingInfo(analyzer, GroupByClause.GroupingType.ROLLUP);
groupByClause.genGroupingExprs();
groupingInfo.buildRepeat(groupByClause.getGroupingExprs(), groupByClause.getGroupingSetList());
groupByClause.analyze(analyzer);
groupingInfo = new GroupingInfo(analyzer, groupByClause);
groupingInfo.buildRepeat(groupByClause.getGroupingExprs(), groupByClause.getGroupingSetList());
} catch (AnalysisException execption) {
Assert.assertTrue(false);
}
Expand Down Expand Up @@ -160,10 +160,10 @@ public void testCube() {
GroupByClause.GroupingType.CUBE);
GroupingInfo groupingInfo = null;
try {
groupingInfo = new GroupingInfo(analyzer, GroupByClause.GroupingType.CUBE);
groupByClause.genGroupingExprs();
groupingInfo.buildRepeat(groupByClause.getGroupingExprs(), groupByClause.getGroupingSetList());
groupByClause.analyze(analyzer);
groupingInfo = new GroupingInfo(analyzer, groupByClause);
groupingInfo.buildRepeat(groupByClause.getGroupingExprs(), groupByClause.getGroupingSetList());
} catch (AnalysisException exception) {
Assert.assertTrue(false);
}
Expand Down Expand Up @@ -264,11 +264,11 @@ public void testGenGroupingList() throws AnalysisException {
}
GroupingInfo groupingInfo = null;
try {
groupingInfo = new GroupingInfo(analyzer, GroupByClause.GroupingType.CUBE);
groupingInfo.addGroupingSlots(slots, analyzer);
groupByClause.genGroupingExprs();
groupingInfo.buildRepeat(groupByClause.getGroupingExprs(), groupByClause.getGroupingSetList());
groupByClause.analyze(analyzer);
groupingInfo = new GroupingInfo(analyzer, groupByClause);
groupingInfo.addGroupingSlots(slots, analyzer);
groupingInfo.buildRepeat(groupByClause.getGroupingExprs(), groupByClause.getGroupingSetList());
} catch (AnalysisException exception) {
Assert.assertTrue(false);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1962,4 +1962,30 @@ public void testRewriteDateLiteralRule() throws Exception {
}
// --end--

@Test
public void testGroupingSets() throws Exception {
String createDbStmtStr = "create database issue7971;";
CreateDbStmt createDbStmt = (CreateDbStmt) UtFrameUtils.parseAndAnalyzeStmt(createDbStmtStr, connectContext);
Catalog.getCurrentCatalog().createDb(createDbStmt);
createTable("CREATE TABLE issue7971.`t` (\n" +
" `k1` tinyint(4) NULL COMMENT \"\",\n" +
" `k2` smallint(6) NULL COMMENT \"\",\n" +
" `k3` smallint(6) NULL COMMENT \"\"\n" +
") ENGINE=OLAP\n" +
"DUPLICATE KEY(`k1`, `k2`)\n" +
"COMMENT \"OLAP\"\n" +
"DISTRIBUTED BY HASH(`k1`) BUCKETS 1\n" +
"PROPERTIES (\n" +
"\"replication_allocation\" = \"tag.location.default: 1\",\n" +
"\"in_memory\" = \"false\",\n" +
"\"storage_format\" = \"V2\"\n" +
")");
String sql = "SELECT k1, k2, GROUPING(k1), GROUPING(k2), SUM(k3) FROM issue7971.t GROUP BY GROUPING SETS ( (k1, k2), (k2), (k1), ( ) );";
String explainStr = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, sql);
Assert.assertTrue(explainStr.contains("REPEAT_NODE"));
sql = "SELECT k1 ,GROUPING(k2) FROM issue7971.t GROUP BY CUBE (k1) ORDER BY k1;";
explainStr = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, sql);
Assert.assertTrue(explainStr.contains("errCode = 2"));
}

}