This is an automated email from the ASF dual-hosted git repository.
jakevin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new a07ca41f8e [Fix](Nereids) fix repeat node nullable error bugs (#15251)
a07ca41f8e is described below
commit a07ca41f8e91da3b6997f573b88b4491801d423e
Author: mch_ucchi <[email protected]>
AuthorDate: Tue Dec 27 17:01:33 2022 +0800
[Fix](Nereids) fix repeat node nullable error bugs (#15251)
---
.../java/org/apache/doris/analysis/SlotRef.java | 2 +-
.../nereids/rules/analysis/NormalizeRepeat.java | 7 ++
.../rules/analysis/NormalizeRepeatTest.java | 56 ++++++++++++++++
.../data/nereids_syntax_p0/grouping_sets.out | 10 +++
.../suites/nereids_syntax_p0/grouping_sets.groovy | 75 ++++++++++++++++++++++
5 files changed, 149 insertions(+), 1 deletion(-)
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/SlotRef.java
b/fe/fe-core/src/main/java/org/apache/doris/analysis/SlotRef.java
index 2c9db0fdad..3a93298067 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/SlotRef.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/SlotRef.java
@@ -84,7 +84,7 @@ public class SlotRef extends Expr {
analysisDone();
}
- // nerieds use this constructor to build aggFnParam
+ // nereids use this constructor to build aggFnParam
public SlotRef(Type type, boolean nullable) {
super();
// tuple id and slot id is meaningless here, nereids just use type and
nullable
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/NormalizeRepeat.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/NormalizeRepeat.java
index d88e9b4591..8c62aab3d4 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/NormalizeRepeat.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/NormalizeRepeat.java
@@ -218,9 +218,16 @@ public class NormalizeRepeat extends
OneAnalysisRuleFactory {
List<Expression> groupingSetExpressions =
ExpressionUtils.flatExpressions(repeat.getGroupingSets());
Set<Expression> commonGroupingSetExpressions =
repeat.getCommonGroupingSetExpressions();
+ // nullable will be different from grouping set and output expressions,
+ // so we can not use the slot in grouping set,but use the equivalent
slot in output expressions.
+ List<NamedExpression> outputs = repeat.getOutputExpressions();
+
Map<Expression, NormalizeToSlotTriplet> normalizeToSlotMap =
Maps.newLinkedHashMap();
for (Expression expression : sourceExpressions) {
Optional<NormalizeToSlotTriplet> pushDownTriplet;
+ if (expression instanceof NamedExpression &&
outputs.contains(expression)) {
+ expression = outputs.get(outputs.indexOf(expression));
+ }
if (groupingSetExpressions.contains(expression)) {
boolean isCommonGroupingSetExpression =
commonGroupingSetExpressions.contains(expression);
pushDownTriplet = toGroupingSetExpressionPushDownTriplet(
diff --git
a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/analysis/NormalizeRepeatTest.java
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/analysis/NormalizeRepeatTest.java
new file mode 100644
index 0000000000..f32f5959d9
--- /dev/null
+++
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/analysis/NormalizeRepeatTest.java
@@ -0,0 +1,56 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package org.apache.doris.nereids.rules.analysis;
+
+import org.apache.doris.nereids.trees.expressions.Alias;
+import org.apache.doris.nereids.trees.expressions.SlotReference;
+import org.apache.doris.nereids.trees.expressions.functions.agg.Sum;
+import org.apache.doris.nereids.trees.plans.Plan;
+import org.apache.doris.nereids.trees.plans.logical.LogicalOlapScan;
+import org.apache.doris.nereids.trees.plans.logical.LogicalRepeat;
+import org.apache.doris.nereids.trees.plans.logical.RelationUtil;
+import org.apache.doris.nereids.types.IntegerType;
+import org.apache.doris.nereids.types.StringType;
+import org.apache.doris.nereids.util.MemoTestUtils;
+import org.apache.doris.nereids.util.PatternMatchSupported;
+import org.apache.doris.nereids.util.PlanChecker;
+import org.apache.doris.nereids.util.PlanConstructor;
+
+import com.google.common.collect.ImmutableList;
+import org.junit.jupiter.api.Test;
+
+public class NormalizeRepeatTest implements PatternMatchSupported {
+
+ @Test
+ public void testKeepNullableAfterNormalizeRepeat() {
+ SlotReference slot1 = new SlotReference("id", IntegerType.INSTANCE,
false);
+ SlotReference slot2 = slot1.withNullable(true);
+ SlotReference slot3 = new SlotReference("name", StringType.INSTANCE,
false);
+ Alias alias = new Alias(new Sum(slot3), "sum(name)");
+ Plan plan = new LogicalRepeat<>(
+ ImmutableList.of(ImmutableList.of(slot1)),
+ ImmutableList.of(slot2, alias),
+ new LogicalOlapScan(RelationUtil.newRelationId(),
PlanConstructor.newOlapTable(0, "t", 0))
+ );
+ PlanChecker.from(MemoTestUtils.createCascadesContext(plan))
+ .applyTopDown(new NormalizeRepeat())
+ .matches(
+ logicalRepeat().when(repeat ->
repeat.getOutputExpressions().get(0).nullable())
+ );
+ }
+}
diff --git a/regression-test/data/nereids_syntax_p0/grouping_sets.out
b/regression-test/data/nereids_syntax_p0/grouping_sets.out
index 78b5a0284a..38b19938d0 100644
--- a/regression-test/data/nereids_syntax_p0/grouping_sets.out
+++ b/regression-test/data/nereids_syntax_p0/grouping_sets.out
@@ -214,3 +214,13 @@
2 \N
3 \N
+-- !select7 --
+1
+2
+3
+4
+1
+2
+3
+4
+
diff --git a/regression-test/suites/nereids_syntax_p0/grouping_sets.groovy
b/regression-test/suites/nereids_syntax_p0/grouping_sets.groovy
index 8343d7923c..5218a4215c 100644
--- a/regression-test/suites/nereids_syntax_p0/grouping_sets.groovy
+++ b/regression-test/suites/nereids_syntax_p0/grouping_sets.groovy
@@ -157,4 +157,79 @@ suite("test_nereids_grouping_sets") {
order_qt_select """
select k1, sum(k2) from (select k1, k2, grouping(k1), grouping(k2)
from groupingSetsTableNotNullable group by grouping sets((k1), (k2)))a group by
k1
"""
+
+ sql """
+ drop table if exists grouping_subquery_table;
+ """
+
+ sql """
+ create table grouping_subquery_table ( a int not null, b int not null )
+ ENGINE=OLAP
+ DISTRIBUTED BY HASH(a) BUCKETS 1
+ PROPERTIES (
+ "replication_allocation" = "tag.location.default: 1",
+ "in_memory" = "false",
+ "storage_format" = "V2"
+ );
+ """
+
+ sql """
+ insert into grouping_subquery_table values
+ (1, 1), (1, 2), (1, 3), (1, 4),
+ (2, 1), (2, 2), (2, 3), (2, 4),
+ (3, 1), (3, 2), (3, 3), (3, 4),
+ (4, 1), (4, 2), (4, 3), (4, 4);
+ """
+
+ qt_select7 """
+ SELECT
+ a
+ FROM
+ (
+ with base_table as (
+ SELECT
+ `a`,
+ sum(`b`) as `sum(b)`
+ FROM
+ (
+ SELECT
+ inv.a,
+ sum(inv.b) as b
+ FROM
+ grouping_subquery_table inv
+ group by
+ inv.a
+ ) T
+ GROUP BY
+ `a`
+ ),
+ grouping_sum_table as (
+ select
+ `a`,
+ sum(`sum(b)`) as `sum(b)`
+ from
+ base_table
+ group by
+ grouping sets (
+ (`base_table`.`a`)
+ )
+ )
+ select
+ *
+ from
+ (
+ select
+ `a`,
+ `sum(b)`
+ from
+ base_table
+ union all
+ select
+ `a`,
+ `sum(b)`
+ from
+ grouping_sum_table
+ ) T
+ ) T2;
+ """
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]