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

dataroaring pushed a commit to branch routineload_flexible_update
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/routineload_flexible_update by 
this push:
     new a64cdd99f80 fix: Handle conflicting partial_columns and 
unique_key_update_mode settings
a64cdd99f80 is described below

commit a64cdd99f808a4aabb5df378ee9adc49c3227afa
Author: Yongqiang YANG <[email protected]>
AuthorDate: Thu Jan 15 21:58:14 2026 -0800

    fix: Handle conflicting partial_columns and unique_key_update_mode settings
    
    Address review comments:
    - Reset uniqueKeyUpdateMode to UPSERT when partial_columns is set to false
      but mode was UPDATE_FIXED_COLUMNS (in modifyCommonJobProperties)
    - Add backward compatibility handling in gsonPostProcess for inconsistent
      metadata states
    - Add validation to reject partial_columns=false with UPDATE_FIXED_COLUMNS
      or UPDATE_FLEXIBLE_COLUMNS modes in CreateRoutineLoadInfo
---
 .../doris/load/routineload/RoutineLoadJob.java     | 12 ++++++++++-
 .../plans/commands/info/CreateRoutineLoadInfo.java | 25 ++++++++++++++++------
 2 files changed, 29 insertions(+), 8 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/load/routineload/RoutineLoadJob.java
 
b/fe/fe-core/src/main/java/org/apache/doris/load/routineload/RoutineLoadJob.java
index 585c3167154..b098fbba662 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/load/routineload/RoutineLoadJob.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/load/routineload/RoutineLoadJob.java
@@ -1957,12 +1957,19 @@ public abstract class RoutineLoadJob
         // Process remaining properties
         jobProperties.forEach((k, v) -> {
             if (k.equals(CreateRoutineLoadInfo.PARTIAL_COLUMNS)) {
+                boolean partialColumns = Boolean.parseBoolean(v);
                 // Backward compatibility: if unique_key_update_mode is not 
set, use partial_columns
                 if (uniqueKeyUpdateMode == TUniqueKeyUpdateMode.UPSERT) {
-                    isPartialUpdate = Boolean.parseBoolean(v);
+                    isPartialUpdate = partialColumns;
                     if (isPartialUpdate) {
                         uniqueKeyUpdateMode = 
TUniqueKeyUpdateMode.UPDATE_FIXED_COLUMNS;
                     }
+                } else if (!partialColumns
+                        && uniqueKeyUpdateMode == 
TUniqueKeyUpdateMode.UPDATE_FIXED_COLUMNS) {
+                    // Backward compatibility: if partial_columns is false but 
unique_key_update_mode
+                    // was UPDATE_FIXED_COLUMNS, reset to UPSERT for 
consistency
+                    isPartialUpdate = false;
+                    uniqueKeyUpdateMode = TUniqueKeyUpdateMode.UPSERT;
                 }
             } else if 
(k.equals(CreateRoutineLoadInfo.PARTIAL_UPDATE_NEW_KEY_POLICY)) {
                 if ("ERROR".equalsIgnoreCase(v)) {
@@ -2058,6 +2065,9 @@ public abstract class RoutineLoadJob
                     
jobProperties.remove(CreateRoutineLoadInfo.PARTIAL_COLUMNS));
             if (this.isPartialUpdate && uniqueKeyUpdateMode == 
TUniqueKeyUpdateMode.UPSERT) {
                 this.uniqueKeyUpdateMode = 
TUniqueKeyUpdateMode.UPDATE_FIXED_COLUMNS;
+            } else if (!this.isPartialUpdate && uniqueKeyUpdateMode == 
TUniqueKeyUpdateMode.UPDATE_FIXED_COLUMNS) {
+                // Reset to UPSERT when partial_columns is disabled
+                this.uniqueKeyUpdateMode = TUniqueKeyUpdateMode.UPSERT;
             }
             this.jobProperties.put(CreateRoutineLoadInfo.PARTIAL_COLUMNS, 
String.valueOf(isPartialUpdate));
             
this.jobProperties.put(CreateRoutineLoadInfo.UNIQUE_KEY_UPDATE_MODE, 
uniqueKeyUpdateMode.name());
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/CreateRoutineLoadInfo.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/CreateRoutineLoadInfo.java
index 9394257013c..ae2781c5abd 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/CreateRoutineLoadInfo.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/CreateRoutineLoadInfo.java
@@ -630,13 +630,24 @@ public class CreateRoutineLoadInfo {
         if (jobProperties.containsKey(UNIQUE_KEY_UPDATE_MODE)) {
             String modeStr = jobProperties.get(UNIQUE_KEY_UPDATE_MODE);
             TUniqueKeyUpdateMode mode = 
parseAndValidateUniqueKeyUpdateMode(modeStr);
-            // Check for conflicting settings: partial_columns=true with 
unique_key_update_mode=UPSERT
-            if (jobProperties.containsKey(PARTIAL_COLUMNS)
-                    && 
jobProperties.get(PARTIAL_COLUMNS).equalsIgnoreCase("true")
-                    && mode == TUniqueKeyUpdateMode.UPSERT) {
-                throw new AnalysisException("Cannot set both 
'partial_columns=true' and "
-                        + "'unique_key_update_mode=UPSERT'. "
-                        + "Use unique_key_update_mode=UPDATE_FIXED_COLUMNS 
instead.");
+            // Check for conflicting settings between partial_columns and 
unique_key_update_mode
+            if (jobProperties.containsKey(PARTIAL_COLUMNS)) {
+                String partialColumnsVal = jobProperties.get(PARTIAL_COLUMNS);
+                // partial_columns=true is not allowed with UPSERT
+                if (partialColumnsVal.equalsIgnoreCase("true")
+                        && mode == TUniqueKeyUpdateMode.UPSERT) {
+                    throw new AnalysisException("Cannot set both 
'partial_columns=true' and "
+                            + "'unique_key_update_mode=UPSERT'. "
+                            + "Use unique_key_update_mode=UPDATE_FIXED_COLUMNS 
instead.");
+                }
+                // partial_columns=false is not allowed with 
UPDATE_FIXED_COLUMNS or UPDATE_FLEXIBLE_COLUMNS
+                if (partialColumnsVal.equalsIgnoreCase("false")
+                        && (mode == TUniqueKeyUpdateMode.UPDATE_FIXED_COLUMNS
+                            || mode == 
TUniqueKeyUpdateMode.UPDATE_FLEXIBLE_COLUMNS)) {
+                    throw new AnalysisException("Cannot set 
'partial_columns=false' when "
+                            + "'unique_key_update_mode' is 
'UPDATE_FIXED_COLUMNS' or 'UPDATE_FLEXIBLE_COLUMNS'. "
+                            + "Use unique_key_update_mode=UPSERT instead, or 
enable partial columns.");
+                }
             }
         }
 


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

Reply via email to