This is an automated email from the ASF dual-hosted git repository.
yangzhg pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-doris.git
The following commit(s) were added to refs/heads/master by this push:
new ee26cd2 [fix] (grouping set) fix Unexpected exception: bitIndex < 0:
-1 (#7989)
ee26cd2 is described below
commit ee26cd2d078c782ac2d7a086d81bbe3c2e3ab1f1
Author: Zhengguo Yang <[email protected]>
AuthorDate: Sat Feb 12 15:18:08 2022 +0800
[fix] (grouping set) fix Unexpected exception: bitIndex < 0: -1 (#7989)
---
.../org/apache/doris/analysis/GroupingInfo.java | 10 ++++++---
.../java/org/apache/doris/analysis/SelectStmt.java | 3 +--
.../apache/doris/analysis/GroupByClauseTest.java | 18 +++++++--------
.../org/apache/doris/planner/QueryPlanTest.java | 26 ++++++++++++++++++++++
4 files changed, 43 insertions(+), 14 deletions(-)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/analysis/GroupingInfo.java
b/fe/fe-core/src/main/java/org/apache/doris/analysis/GroupingInfo.java
index e1e7961..41f544d 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/GroupingInfo.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/GroupingInfo.java
@@ -33,7 +33,7 @@ import java.util.stream.Collectors;
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;
@@ -41,8 +41,9 @@ public class GroupingInfo {
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<>());
@@ -190,6 +191,9 @@ public class GroupingInfo {
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
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java
b/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java
index 2b1edb2..502a7fd 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java
@@ -447,7 +447,7 @@ public class SelectStmt extends QueryStmt {
}
}
}
- groupingInfo = new GroupingInfo(analyzer,
groupByClause.getGroupingType());
+ groupingInfo = new GroupingInfo(analyzer, groupByClause);
groupingInfo.substituteGroupingFn(resultExprs, analyzer);
} else {
for (Expr expr : resultExprs) {
@@ -1881,4 +1881,3 @@ public class SelectStmt extends QueryStmt {
return this.id.equals(((SelectStmt) obj).id);
}
}
-
diff --git
a/fe/fe-core/src/test/java/org/apache/doris/analysis/GroupByClauseTest.java
b/fe/fe-core/src/test/java/org/apache/doris/analysis/GroupByClauseTest.java
index e105863..67f2dc5 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/analysis/GroupByClauseTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/analysis/GroupByClauseTest.java
@@ -83,10 +83,10 @@ public class GroupByClauseTest {
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);
@@ -124,10 +124,10 @@ public class GroupByClauseTest {
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);
}
@@ -160,10 +160,10 @@ public class GroupByClauseTest {
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);
}
@@ -264,11 +264,11 @@ public class GroupByClauseTest {
}
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);
}
diff --git
a/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java
b/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java
index 9ef045c..5e876a1 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java
@@ -1962,4 +1962,30 @@ public class QueryPlanTest {
}
// --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"));
+ }
+
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]