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 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]