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

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

commit 73ebeb24a3c1f176d5ff9c4bc794d4d9522b39bb
Author: 谢健 <[email protected]>
AuthorDate: Thu Mar 7 11:18:37 2024 +0800

    [fix](mtmv) support null value in partition for updating  (#31843)
---
 .../plans/commands/UpdateMvByPartitionCommand.java  | 19 ++++++++++++++++++-
 .../commands/UpdateMvByPartitionCommandTest.java    | 21 +++++++++++++++++++++
 2 files changed, 39 insertions(+), 1 deletion(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/UpdateMvByPartitionCommand.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/UpdateMvByPartitionCommand.java
index 0c976506a87..f6bd39ac838 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/UpdateMvByPartitionCommand.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/UpdateMvByPartitionCommand.java
@@ -31,10 +31,12 @@ import org.apache.doris.nereids.parser.NereidsParser;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import org.apache.doris.nereids.trees.expressions.GreaterThanEqual;
 import org.apache.doris.nereids.trees.expressions.InPredicate;
+import org.apache.doris.nereids.trees.expressions.IsNull;
 import org.apache.doris.nereids.trees.expressions.LessThan;
 import org.apache.doris.nereids.trees.expressions.Slot;
 import org.apache.doris.nereids.trees.expressions.literal.BooleanLiteral;
 import org.apache.doris.nereids.trees.expressions.literal.Literal;
+import org.apache.doris.nereids.trees.expressions.literal.NullLiteral;
 import org.apache.doris.nereids.trees.plans.Plan;
 import org.apache.doris.nereids.trees.plans.algebra.Sink;
 import org.apache.doris.nereids.trees.plans.logical.LogicalFilter;
@@ -54,6 +56,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * Update mv by partition
@@ -123,7 +126,21 @@ public class UpdateMvByPartitionCommand extends 
InsertOverwriteTableCommand {
             List<Expression> inValues = ((ListPartitionItem) 
item).getItems().stream()
                     
.map(UpdateMvByPartitionCommand::convertPartitionKeyToLiteral)
                     .collect(ImmutableList.toImmutableList());
-            return new InPredicate(col, inValues);
+            List<Expression> predicates = new ArrayList<>();
+            if (inValues.stream().anyMatch(NullLiteral.class::isInstance)) {
+                inValues = inValues.stream()
+                        .filter(e -> !(e instanceof NullLiteral))
+                        .collect(Collectors.toList());
+                Expression isNullPredicate = new IsNull(col);
+                predicates.add(isNullPredicate);
+            }
+            if (!inValues.isEmpty()) {
+                predicates.add(new InPredicate(col, inValues));
+            }
+            if (predicates.isEmpty()) {
+                return BooleanLiteral.of(true);
+            }
+            return ExpressionUtils.or(predicates);
         } else {
             Range<PartitionKey> range = item.getItems();
             List<Expression> exprs = new ArrayList<>();
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/commands/UpdateMvByPartitionCommandTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/commands/UpdateMvByPartitionCommandTest.java
index af00d8ae464..b7374565da1 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/commands/UpdateMvByPartitionCommandTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/commands/UpdateMvByPartitionCommandTest.java
@@ -19,6 +19,7 @@ package org.apache.doris.nereids.trees.plans.commands;
 
 import org.apache.doris.analysis.PartitionValue;
 import org.apache.doris.catalog.Column;
+import org.apache.doris.catalog.ListPartitionItem;
 import org.apache.doris.catalog.PartitionItem;
 import org.apache.doris.catalog.PartitionKey;
 import org.apache.doris.catalog.PrimitiveType;
@@ -26,6 +27,7 @@ import org.apache.doris.catalog.RangePartitionItem;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import org.apache.doris.nereids.trees.expressions.GreaterThanEqual;
+import org.apache.doris.nereids.trees.expressions.IsNull;
 import org.apache.doris.nereids.trees.expressions.Slot;
 import org.apache.doris.nereids.trees.expressions.SlotReference;
 import org.apache.doris.nereids.types.IntegerType;
@@ -53,4 +55,23 @@ class UpdateMvByPartitionCommandTest {
         Expression expr = (Expression) m.invoke(null, rangePartitionItem, new 
SlotReference("s", IntegerType.INSTANCE));
         Assertions.assertTrue(expr instanceof GreaterThanEqual);
     }
+
+    @Test
+    void testNull() throws AnalysisException, NoSuchMethodException, 
InvocationTargetException,
+            IllegalAccessException {
+        Method m = 
UpdateMvByPartitionCommand.class.getDeclaredMethod("convertPartitionItemToPredicate",
 PartitionItem.class,
+                Slot.class);
+        m.setAccessible(true);
+        Column column = new Column("a", PrimitiveType.INT);
+        PartitionKey v = 
PartitionKey.createListPartitionKeyWithTypes(ImmutableList.of(new 
PartitionValue("NULL", true)), ImmutableList.of(column.getType()), false);
+        ListPartitionItem listPartitionItem = new 
ListPartitionItem(ImmutableList.of(v));
+        Expression expr = (Expression) m.invoke(null, listPartitionItem, new 
SlotReference("s", IntegerType.INSTANCE));
+        Assertions.assertTrue(expr instanceof IsNull);
+
+        PartitionKey v1 = 
PartitionKey.createListPartitionKeyWithTypes(ImmutableList.of(new 
PartitionValue("NULL", true)), ImmutableList.of(column.getType()), false);
+        PartitionKey v2 = 
PartitionKey.createListPartitionKeyWithTypes(ImmutableList.of(new 
PartitionValue("1", false)), ImmutableList.of(column.getType()), false);
+        listPartitionItem = new ListPartitionItem(ImmutableList.of(v1, v2));
+        expr = (Expression) m.invoke(null, listPartitionItem, new 
SlotReference("s", IntegerType.INSTANCE));
+        Assertions.assertEquals("(s IS NULL OR s IN (1))", expr.toSql());
+    }
 }


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

Reply via email to