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

englefly 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 9ccfab24d8a [fix](nereids) fix AND extract uniform slots (#50265)
9ccfab24d8a is described below

commit 9ccfab24d8a51780889b92b537859bcc765e0ba1
Author: yujun <yu...@selectdb.com>
AuthorDate: Thu Apr 24 16:44:34 2025 +0800

    [fix](nereids) fix AND extract uniform slots (#50265)
    
    ### What problem does this PR solve?
    
    #44574 make AND's child size may exceeds 2, need consider.
---
 .../trees/plans/commands/ShowSnapshotCommand.java  | 42 ++++++++++------------
 .../apache/doris/nereids/util/ExpressionUtils.java |  3 +-
 .../doris/nereids/util/ExpressionUtilsTest.java    | 25 +++++++++++++
 3 files changed, 44 insertions(+), 26 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowSnapshotCommand.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowSnapshotCommand.java
index 3d60d4e1462..3e5bd97ecad 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowSnapshotCommand.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ShowSnapshotCommand.java
@@ -109,7 +109,18 @@ public class ShowSnapshotCommand extends ShowCommand {
         return builder.build();
     }
 
-    private boolean analyzeSubExpression(ComparisonPredicate expr) {
+    private boolean analyzeSubExpression(Expression expr) {
+        if (expr instanceof ComparisonPredicate) {
+            return analyzeComparisonPredicate((ComparisonPredicate) expr);
+        }
+        if (expr instanceof And) {
+            return 
expr.children().stream().allMatch(this::analyzeSubExpression);
+        }
+
+        return false;
+    }
+
+    private boolean analyzeComparisonPredicate(ComparisonPredicate expr) {
         Expression key = expr.child(0);
         Expression val = expr.child(1);
 
@@ -166,34 +177,17 @@ public class ShowSnapshotCommand extends ShowCommand {
         }
 
         // validate analyze where clause if not null
-        boolean ok = true;
         if (where != null) {
-            CHECK: {
-                if (where instanceof ComparisonPredicate) {
-                    if (!analyzeSubExpression((ComparisonPredicate) where)) {
-                        ok = false;
-                    }
-                } else if (where instanceof And) {
-                    if (!(where.child(0) instanceof ComparisonPredicate)
-                            || !(where.child(1) instanceof 
ComparisonPredicate)) {
-                        ok = false;
-                        break CHECK;
-                    }
-                    if (!analyzeSubExpression((ComparisonPredicate) 
where.child(0))
-                            || !analyzeSubExpression((ComparisonPredicate) 
where.child(1))) {
-                        ok = false;
-                    }
-                } else {
-                    ok = false;
-                }
+            if (!analyzeSubExpression(where)) {
+                return false;
             }
-
-            if (ok && (Strings.isNullOrEmpty(snapshotName) && 
!Strings.isNullOrEmpty(timestamp))) {
+            if (Strings.isNullOrEmpty(snapshotName) && 
!Strings.isNullOrEmpty(timestamp)) {
                 // can not only set timestamp
-                ok = false;
+                return false;
             }
         }
-        return ok;
+
+        return true;
     }
 
     /**
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/ExpressionUtils.java 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/ExpressionUtils.java
index 97c82fe5ae0..f667e744280 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/ExpressionUtils.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/ExpressionUtils.java
@@ -846,8 +846,7 @@ public class ExpressionUtils {
     public static ImmutableMap<Slot, Expression> extractUniformSlot(Expression 
expression) {
         ImmutableMap.Builder<Slot, Expression> builder = new 
ImmutableMap.Builder<>();
         if (expression instanceof And) {
-            builder.putAll(extractUniformSlot(expression.child(0)));
-            builder.putAll(extractUniformSlot(expression.child(1)));
+            expression.children().forEach(child -> 
builder.putAll(extractUniformSlot(child)));
         }
         if (expression instanceof EqualTo) {
             if (isInjective(expression.child(0)) && 
expression.child(1).isConstant()) {
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/util/ExpressionUtilsTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/util/ExpressionUtilsTest.java
index e24c7d517b6..e8cc9662bfd 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/util/ExpressionUtilsTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/util/ExpressionUtilsTest.java
@@ -18,16 +18,25 @@
 package org.apache.doris.nereids.util;
 
 import org.apache.doris.nereids.parser.NereidsParser;
+import org.apache.doris.nereids.trees.expressions.And;
+import org.apache.doris.nereids.trees.expressions.EqualTo;
 import org.apache.doris.nereids.trees.expressions.Expression;
+import org.apache.doris.nereids.trees.expressions.Slot;
+import org.apache.doris.nereids.trees.expressions.SlotReference;
+import org.apache.doris.nereids.trees.expressions.literal.Literal;
 import org.apache.doris.nereids.trees.plans.Plan;
+import org.apache.doris.nereids.types.IntegerType;
 import org.apache.doris.utframe.TestWithFeService;
 
+import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
+import java.util.Arrays;
 import java.util.BitSet;
 import java.util.List;
+import java.util.Map;
 
 /**
  * ExpressionUtils ut.
@@ -185,6 +194,22 @@ public class ExpressionUtilsTest extends TestWithFeService 
{
                         });
     }
 
+    @Test
+    public void testExtractUniformSlot() {
+        Slot a = new SlotReference("a", IntegerType.INSTANCE);
+        Slot b = new SlotReference("b", IntegerType.INSTANCE);
+        Slot c = new SlotReference("c", IntegerType.INSTANCE);
+        Expression va = Literal.of(1);
+        Expression vb = Literal.of(2);
+        Expression vc = Literal.of(3);
+        Expression expression = new And(Arrays.asList(new EqualTo(a, va), new 
EqualTo(b, vb), new EqualTo(c, vc)));
+        Map<Slot, Expression> expectUniformSlots = Maps.newHashMap();
+        expectUniformSlots.put(a, va);
+        expectUniformSlots.put(b, vb);
+        expectUniformSlots.put(c, vc);
+        Assertions.assertEquals(expectUniformSlots, 
ExpressionUtils.extractUniformSlot(expression));
+    }
+
     private void assertExpect(List<? extends Expression> originalExpressions,
             List<? extends Expression> shuttledExpressions,
             String... expectExpressions) {


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to