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


The following commit(s) were added to refs/heads/branch-2.1 by this push:
     new 20a6f2a6598 [Cherry-Pick](branch-2.1) Pick "Fix partial update case 
introduced by #33656 (#34260)" (#34767)
20a6f2a6598 is described below

commit 20a6f2a659806d053ef1494e6840292b560de3ac
Author: abmdocrt <yukang.lian2...@gmail.com>
AuthorDate: Mon May 13 17:00:04 2024 +0800

    [Cherry-Pick](branch-2.1) Pick "Fix partial update case introduced by 
#33656 (#34260)" (#34767)
---
 .../doris/nereids/analyzer/UnboundTableSink.java   |  6 +++-
 .../trees/plans/commands/insert/InsertUtils.java   | 32 ++++++++++++----------
 .../test_partial_update_native_insert_stmt.groovy  |  2 +-
 ...artial_update_native_insert_stmt_complex.groovy |  2 +-
 4 files changed, 25 insertions(+), 17 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundTableSink.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundTableSink.java
index 8ecd417691d..23c58ba42fb 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundTableSink.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundTableSink.java
@@ -48,7 +48,7 @@ public class UnboundTableSink<CHILD_TYPE extends Plan> 
extends UnboundLogicalSin
     private final List<String> hints;
     private final boolean temporaryPartition;
     private final List<String> partitions;
-    private final boolean isPartialUpdate;
+    private boolean isPartialUpdate;
     private final DMLCommandType dmlCommandType;
     private final boolean autoDetectPartition;
 
@@ -114,6 +114,10 @@ public class UnboundTableSink<CHILD_TYPE extends Plan> 
extends UnboundLogicalSin
         return isPartialUpdate;
     }
 
+    public void setPartialUpdate(boolean isPartialUpdate) {
+        this.isPartialUpdate = isPartialUpdate;
+    }
+
     @Override
     public Plan withChildren(List<Plan> children) {
         Preconditions.checkArgument(children.size() == 1, 
"UnboundOlapTableSink only accepts one child");
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/insert/InsertUtils.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/insert/InsertUtils.java
index f0e7fab736c..ad974e9e7bc 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/insert/InsertUtils.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/insert/InsertUtils.java
@@ -247,21 +247,25 @@ public class InsertUtils {
                     && ((UnboundTableSink<? extends Plan>) 
unboundLogicalSink).isPartialUpdate()) {
                 // check the necessary conditions for partial updates
                 OlapTable olapTable = (OlapTable) table;
+
                 if (!olapTable.getEnableUniqueKeyMergeOnWrite()) {
-                    throw new AnalysisException("Partial update is only 
allowed on "
-                            + "unique table with merge-on-write enabled.");
-                }
-                if (unboundLogicalSink.getDMLCommandType() == 
DMLCommandType.INSERT) {
-                    if (unboundLogicalSink.getColNames().isEmpty()) {
-                        throw new AnalysisException("You must explicitly 
specify the columns to be updated when "
-                                + "updating partial columns using the INSERT 
statement.");
-                    }
-                    for (Column col : olapTable.getFullSchema()) {
-                        Optional<String> insertCol = 
unboundLogicalSink.getColNames().stream()
-                                .filter(c -> 
c.equalsIgnoreCase(col.getName())).findFirst();
-                        if (col.isKey() && !insertCol.isPresent()) {
-                            throw new AnalysisException("Partial update should 
include all key columns, missing: "
-                                    + col.getName());
+                    // when enable_unique_key_partial_update = true,
+                    // only unique table with MOW insert with target columns 
can consider be a partial update,
+                    // and unique table without MOW, insert will be like a 
normal insert.
+                    ((UnboundTableSink<? extends Plan>) 
unboundLogicalSink).setPartialUpdate(false);
+                } else {
+                    if (unboundLogicalSink.getDMLCommandType() == 
DMLCommandType.INSERT) {
+                        if (unboundLogicalSink.getColNames().isEmpty()) {
+                            throw new AnalysisException("You must explicitly 
specify the columns to be updated when "
+                                    + "updating partial columns using the 
INSERT statement.");
+                        }
+                        for (Column col : olapTable.getFullSchema()) {
+                            Optional<String> insertCol = 
unboundLogicalSink.getColNames().stream()
+                                    .filter(c -> 
c.equalsIgnoreCase(col.getName())).findFirst();
+                            if (col.isKey() && !insertCol.isPresent()) {
+                                throw new AnalysisException("Partial update 
should include all key columns, missing: "
+                                        + col.getName());
+                            }
                         }
                     }
                 }
diff --git 
a/regression-test/suites/unique_with_mow_p0/partial_update/test_partial_update_native_insert_stmt.groovy
 
b/regression-test/suites/unique_with_mow_p0/partial_update/test_partial_update_native_insert_stmt.groovy
index 18b7ffe6fc2..f5b7a937bcd 100644
--- 
a/regression-test/suites/unique_with_mow_p0/partial_update/test_partial_update_native_insert_stmt.groovy
+++ 
b/regression-test/suites/unique_with_mow_p0/partial_update/test_partial_update_native_insert_stmt.groovy
@@ -52,7 +52,7 @@ suite("test_partial_update_native_insert_stmt", "p0") {
             qt_1 """ select * from ${tableName} order by id; """
             test {
                 sql """insert into ${tableName} 
values(2,400),(1,200),(4,400)"""
-                exception "You must explicitly specify the columns to be 
updated when updating partial columns using the INSERT statement"
+                exception "Column count doesn't match value count"
             }
             sql "set enable_unique_key_partial_update=false;"
             sql "sync;"
diff --git 
a/regression-test/suites/unique_with_mow_p0/partial_update/test_partial_update_native_insert_stmt_complex.groovy
 
b/regression-test/suites/unique_with_mow_p0/partial_update/test_partial_update_native_insert_stmt_complex.groovy
index 99158b66cd6..975f62a685f 100644
--- 
a/regression-test/suites/unique_with_mow_p0/partial_update/test_partial_update_native_insert_stmt_complex.groovy
+++ 
b/regression-test/suites/unique_with_mow_p0/partial_update/test_partial_update_native_insert_stmt_complex.groovy
@@ -89,7 +89,7 @@ suite("test_partial_update_native_insert_stmt_complex", "p0") 
{
                 sql """insert into ${tbName1}
                 select ${tbName2}.id, ${tbName2}.c1, ${tbName2}.c3 * 100
                 from ${tbName2} inner join ${tbName3} on ${tbName2}.id = 
${tbName3}.id; """
-                exception "You must explicitly specify the columns to be 
updated when updating partial columns using the INSERT statement"
+                exception "Column count doesn't match value count"
             }
             sql "truncate table ${tbName1};"
             sql "truncate table ${tbName2};"


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

Reply via email to