This is an automated email from the ASF dual-hosted git repository.

morrysnow pushed a commit to branch branch-3.1
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-3.1 by this push:
     new 38b72e571b2 branch-3.1: [Fix](nereids) Fix incorrect results in GROUP 
BY with Modulo (%) operations #54153 (#54195)
38b72e571b2 is described below

commit 38b72e571b2e7f5c6a6034f924d68e8faf3368f3
Author: github-actions[bot] 
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Mon Aug 4 09:59:12 2025 +0800

    branch-3.1: [Fix](nereids) Fix incorrect results in GROUP BY with Modulo 
(%) operations #54153 (#54195)
    
    Cherry-picked from #54153
    
    Co-authored-by: Jensen <[email protected]>
---
 .../nereids/rules/rewrite/SimplifyAggGroupBy.java  |  17 +++++++++++++--
 .../rules/rewrite/SimplifyAggGroupByTest.java      |  24 +++++++++++++++++++++
 .../aggregate/aggregate_groupby_simplify.out       | Bin 0 -> 137 bytes
 .../aggregate/aggregate_groupby_simplify.groovy    |  23 ++++++++++++++++++++
 4 files changed, 62 insertions(+), 2 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/SimplifyAggGroupBy.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/SimplifyAggGroupBy.java
index 6dc446d88ca..37d4d4806f0 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/SimplifyAggGroupBy.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/SimplifyAggGroupBy.java
@@ -20,13 +20,18 @@ package org.apache.doris.nereids.rules.rewrite;
 import org.apache.doris.nereids.rules.Rule;
 import org.apache.doris.nereids.rules.RuleType;
 import org.apache.doris.nereids.trees.TreeNode;
+import org.apache.doris.nereids.trees.expressions.Add;
 import org.apache.doris.nereids.trees.expressions.BinaryArithmetic;
+import org.apache.doris.nereids.trees.expressions.Divide;
 import org.apache.doris.nereids.trees.expressions.Expression;
+import org.apache.doris.nereids.trees.expressions.Multiply;
 import org.apache.doris.nereids.trees.expressions.Slot;
+import org.apache.doris.nereids.trees.expressions.Subtract;
 import org.apache.doris.nereids.trees.expressions.literal.Literal;
 import org.apache.doris.nereids.util.ExpressionUtils;
 import org.apache.doris.nereids.util.Utils;
 
+import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ImmutableSet;
 
 import java.util.List;
@@ -40,11 +45,15 @@ import java.util.Set;
  * GROUP BY ClientIP
  */
 public class SimplifyAggGroupBy extends OneRewriteRuleFactory {
+    private static final ImmutableSet<Class<? extends Expression>> 
supportedFunctions
+            = ImmutableSet.of(Add.class, Subtract.class, Multiply.class, 
Divide.class);
+
     @Override
     public Rule build() {
         return logicalAggregate()
                 .when(agg -> agg.getGroupByExpressions().size() > 1
-                        && 
ExpressionUtils.allMatch(agg.getGroupByExpressions(), 
this::isBinaryArithmeticSlot))
+                        && 
ExpressionUtils.allMatch(agg.getGroupByExpressions(),
+                        SimplifyAggGroupBy::isBinaryArithmeticSlot))
                 .then(agg -> {
                     List<Expression> groupByExpressions = 
agg.getGroupByExpressions();
                     ImmutableSet.Builder<Expression> inputSlots
@@ -61,13 +70,17 @@ public class SimplifyAggGroupBy extends 
OneRewriteRuleFactory {
                 .toRule(RuleType.SIMPLIFY_AGG_GROUP_BY);
     }
 
-    private boolean isBinaryArithmeticSlot(TreeNode<Expression> expr) {
+    @VisibleForTesting
+    protected static boolean isBinaryArithmeticSlot(TreeNode<Expression> expr) 
{
         if (expr instanceof Slot) {
             return true;
         }
         if (!(expr instanceof BinaryArithmetic)) {
             return false;
         }
+        if (!supportedFunctions.contains(expr.getClass())) {
+            return false;
+        }
         return ExpressionUtils.isSlotOrCastOnSlot(expr.child(0)).isPresent() 
&& expr.child(1) instanceof Literal
                 || 
ExpressionUtils.isSlotOrCastOnSlot(expr.child(1)).isPresent() && expr.child(0) 
instanceof Literal;
     }
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/SimplifyAggGroupByTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/SimplifyAggGroupByTest.java
index 34c3b012e76..32c2cc4356d 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/SimplifyAggGroupByTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/SimplifyAggGroupByTest.java
@@ -18,10 +18,13 @@
 package org.apache.doris.nereids.rules.rewrite;
 
 import org.apache.doris.nereids.trees.expressions.Add;
+import org.apache.doris.nereids.trees.expressions.Divide;
 import org.apache.doris.nereids.trees.expressions.Expression;
+import org.apache.doris.nereids.trees.expressions.Mod;
 import org.apache.doris.nereids.trees.expressions.Multiply;
 import org.apache.doris.nereids.trees.expressions.NamedExpression;
 import org.apache.doris.nereids.trees.expressions.Slot;
+import org.apache.doris.nereids.trees.expressions.Subtract;
 import org.apache.doris.nereids.trees.expressions.functions.agg.Count;
 import org.apache.doris.nereids.trees.expressions.functions.scalar.Abs;
 import org.apache.doris.nereids.trees.expressions.literal.Literal;
@@ -35,6 +38,7 @@ import org.apache.doris.nereids.util.PlanConstructor;
 import org.apache.doris.qe.ConnectContext;
 
 import com.google.common.collect.ImmutableList;
+import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
 import java.util.List;
@@ -132,4 +136,24 @@ class SimplifyAggGroupByTest implements 
MemoPatternMatchSupported {
                         logicalProject(logicalAggregate().when(a -> 
a.getGroupByExpressions().size() == 2))
                 );
     }
+
+    @Test
+    void testisBinaryArithmeticSlot() {
+        Slot id = scan1.getOutput().get(0);
+
+        Mod mod = new Mod(id, Literal.of(2));
+        Assertions.assertFalse(SimplifyAggGroupBy.isBinaryArithmeticSlot(mod));
+
+        Add add = new Add(id, Literal.of(2));
+        Assertions.assertTrue(SimplifyAggGroupBy.isBinaryArithmeticSlot(add));
+
+        Subtract subtract = new Subtract(id, Literal.of(2));
+        
Assertions.assertTrue(SimplifyAggGroupBy.isBinaryArithmeticSlot(subtract));
+
+        Multiply multiply = new Multiply(id, Literal.of(2));
+        
Assertions.assertTrue(SimplifyAggGroupBy.isBinaryArithmeticSlot(multiply));
+
+        Divide divide = new Divide(id, Literal.of(2));
+        
Assertions.assertTrue(SimplifyAggGroupBy.isBinaryArithmeticSlot(divide));
+    }
 }
diff --git 
a/regression-test/data/nereids_p0/aggregate/aggregate_groupby_simplify.out 
b/regression-test/data/nereids_p0/aggregate/aggregate_groupby_simplify.out
new file mode 100644
index 00000000000..0a2425d53f9
Binary files /dev/null and 
b/regression-test/data/nereids_p0/aggregate/aggregate_groupby_simplify.out 
differ
diff --git 
a/regression-test/suites/nereids_p0/aggregate/aggregate_groupby_simplify.groovy 
b/regression-test/suites/nereids_p0/aggregate/aggregate_groupby_simplify.groovy
new file mode 100644
index 00000000000..0951d9dd2dd
--- /dev/null
+++ 
b/regression-test/suites/nereids_p0/aggregate/aggregate_groupby_simplify.groovy
@@ -0,0 +1,23 @@
+// 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.
+
+suite("aggregate_groupby_simplify") {
+    sql "SET enable_nereids_planner=true"
+    sql "SET enable_fallback_to_original_planner=false"
+
+    qt_aggregate "select number % 3 as a, number % 2 as b from 
numbers('number' = '10') group by a, b order by a, b;"
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to