You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by mo...@apache.org on 2021/07/21 04:31:33 UTC
[incubator-doris] branch master updated: [BUG] GROUPING func and
ORDER BY are used at the same time to report NullPointerException (#6266)
This is an automated email from the ASF dual-hosted git repository.
morningman 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 7771233 [BUG] GROUPING func and ORDER BY are used at the same time to report NullPointerException (#6266)
7771233 is described below
commit 7771233f3062eb47db321d977b6f3ea7f44227e7
Author: Xinyi Zou <zo...@foxmail.com>
AuthorDate: Wed Jul 21 12:31:20 2021 +0800
[BUG] GROUPING func and ORDER BY are used at the same time to report NullPointerException (#6266)
fix #6265
The reason for the error is that the `Grouping Func Exprs` is substituted twice. In the first substitution, `VirtualSlotRef` is used to replace the original `SlotRef`, and in the second substitution, `VirtualSlotRef` is reported in the `getTable()` Times Null pointer. IN
```
} else if (((SlotRef) child).getDesc().getParent().getTable().getType()
```
For the first substitution, the List of executable exprs in select clause has been substituted.
```
groupingInfo = new GroupingInfo(analyzer, groupByClause.getGroupingType());
groupingInfo.substituteGroupingFn(resultExprs, analyzer);
```
In the second substitution, actually only need to substitute the unique expr in Ordering exprs.
```
createSortInfo(analyzer);
if (sortInfo != null && CollectionUtils.isNotEmpty(sortInfo.getOrderingExprs())) {
if (groupingInfo != null) {
groupingInfo.substituteGroupingFn(sortInfo.getOrderingExprs(), analyzer);
}
}
```
change into:
```
createSortInfo(analyzer);
if (sortInfo != null && CollectionUtils.isNotEmpty(sortInfo.getOrderingExprs())) {
if (groupingInfo != null) {
List<Expr> orderingExprNotInSelect = sortInfo.getOrderingExprs().stream()
.filter(item -> !resultExprs.contains(item)).collect(Collectors.toList());
groupingInfo.substituteGroupingFn(orderingExprNotInSelect, analyzer);
}
}
```
---
.../src/main/java/org/apache/doris/analysis/SelectStmt.java | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
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 6a60dde..9219489 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
@@ -61,6 +61,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
+import java.util.stream.Collectors;
/**
* Representation of a single select block, including GROUP BY, ORDER BY and HAVING
@@ -508,7 +509,12 @@ public class SelectStmt extends QueryStmt {
createSortInfo(analyzer);
if (sortInfo != null && CollectionUtils.isNotEmpty(sortInfo.getOrderingExprs())) {
if (groupingInfo != null) {
- groupingInfo.substituteGroupingFn(sortInfo.getOrderingExprs(), analyzer);
+ // List of executable exprs in select clause has been substituted, only the unique expr in Ordering
+ // exprs needs to be substituted.
+ // Otherwise, if substitute twice for `Grouping Func Expr`, a null pointer will be reported.
+ List<Expr> orderingExprNotInSelect = sortInfo.getOrderingExprs().stream()
+ .filter(item -> !resultExprs.contains(item)).collect(Collectors.toList());
+ groupingInfo.substituteGroupingFn(orderingExprNotInSelect, analyzer);
}
}
analyzeAggregation(analyzer);
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org