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