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

dataroaring 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 6d545273957 [fix](dynamic partition) fix dynamic partition thread met 
uncatch exception #35778 (#36166)
6d545273957 is described below

commit 6d5452739573250b87fd37587f4356156999d446
Author: yujun <[email protected]>
AuthorDate: Wed Jun 12 22:16:51 2024 +0800

    [fix](dynamic partition) fix dynamic partition thread met uncatch exception 
#35778 (#36166)
    
    cherry pick from #35778
---
 .../apache/doris/catalog/ColocateGroupSchema.java  |  5 +-
 .../doris/clone/DynamicPartitionScheduler.java     | 91 ++++++++++++++--------
 .../java/org/apache/doris/common/ErrorCode.java    |  4 +-
 .../doris/common/util/DynamicPartitionUtil.java    | 23 +++---
 .../java/org/apache/doris/alter/AlterTest.java     | 10 ++-
 .../apache/doris/catalog/ColocateTableTest.java    |  4 +-
 .../doris/catalog/DynamicPartitionTableTest.java   | 20 +++++
 .../test_dynamic_partition_failed.groovy           | 74 ++++++++++++++++++
 8 files changed, 181 insertions(+), 50 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/catalog/ColocateGroupSchema.java 
b/fe/fe-core/src/main/java/org/apache/doris/catalog/ColocateGroupSchema.java
index 40b3405069d..72ed921633a 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/ColocateGroupSchema.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/ColocateGroupSchema.java
@@ -89,12 +89,13 @@ public class ColocateGroupSchema implements Writable {
             HashDistributionInfo info = (HashDistributionInfo) 
distributionInfo;
             // buckets num
             if (info.getBucketNum() != bucketsNum) {
-                
ErrorReport.reportDdlException(ErrorCode.ERR_COLOCATE_TABLE_MUST_HAS_SAME_BUCKET_NUM,
 bucketsNum);
+                
ErrorReport.reportDdlException(ErrorCode.ERR_COLOCATE_TABLE_MUST_HAS_SAME_BUCKET_NUM,
+                        info.getBucketNum(), bucketsNum);
             }
             // distribution col size
             if (info.getDistributionColumns().size() != 
distributionColTypes.size()) {
                 
ErrorReport.reportDdlException(ErrorCode.ERR_COLOCATE_TABLE_MUST_HAS_SAME_DISTRIBUTION_COLUMN_SIZE,
-                        distributionColTypes.size());
+                        info.getDistributionColumns().size(), 
distributionColTypes.size());
             }
             // distribution col type
             for (int i = 0; i < distributionColTypes.size(); i++) {
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/clone/DynamicPartitionScheduler.java
 
b/fe/fe-core/src/main/java/org/apache/doris/clone/DynamicPartitionScheduler.java
index 7c884b6fee6..8c5f4f669c5 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/clone/DynamicPartitionScheduler.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/clone/DynamicPartitionScheduler.java
@@ -40,7 +40,6 @@ import org.apache.doris.catalog.PartitionKey;
 import org.apache.doris.catalog.RangePartitionInfo;
 import org.apache.doris.catalog.RangePartitionItem;
 import org.apache.doris.catalog.Table;
-import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.Config;
 import org.apache.doris.common.DdlException;
 import org.apache.doris.common.FeConstants;
@@ -102,9 +101,9 @@ public class DynamicPartitionScheduler extends MasterDaemon 
{
         this.initialize = false;
     }
 
-    public void executeDynamicPartitionFirstTime(Long dbId, Long tableId) {
+    public void executeDynamicPartitionFirstTime(Long dbId, Long tableId) 
throws DdlException {
         List<Pair<Long, Long>> tempDynamicPartitionTableInfo = 
Lists.newArrayList(Pair.of(dbId, tableId));
-        executeDynamicPartition(tempDynamicPartitionTableInfo);
+        executeDynamicPartition(tempDynamicPartitionTableInfo, true);
     }
 
     public void registerDynamicPartitionTable(Long dbId, Long tableId) {
@@ -186,8 +185,10 @@ public class DynamicPartitionScheduler extends 
MasterDaemon {
         }
     }
 
-    private static int getBucketsNum(DynamicPartitionProperty property, 
OlapTable table, String nowPartitionName) {
-        if (!table.isAutoBucket()) {
+    private static int getBucketsNum(DynamicPartitionProperty property, 
OlapTable table,
+            String nowPartitionName, boolean executeFirstTime) {
+        // if execute first time, all partitions no contain data
+        if (!table.isAutoBucket() || executeFirstTime) {
             return property.getBuckets();
         }
 
@@ -217,7 +218,7 @@ public class DynamicPartitionScheduler extends MasterDaemon 
{
     }
 
     private ArrayList<AddPartitionClause> getAddPartitionClause(Database db, 
OlapTable olapTable,
-            Column partitionColumn, String partitionFormat) {
+            Column partitionColumn, String partitionFormat, boolean 
executeFirstTime) throws DdlException {
         ArrayList<AddPartitionClause> addPartitionClauses = new ArrayList<>();
         DynamicPartitionProperty dynamicPartitionProperty = 
olapTable.getTableProperty().getDynamicPartitionProperty();
         RangePartitionInfo rangePartitionInfo = (RangePartitionInfo) 
olapTable.getPartitionInfo();
@@ -225,15 +226,10 @@ public class DynamicPartitionScheduler extends 
MasterDaemon {
 
         boolean createHistoryPartition = 
dynamicPartitionProperty.isCreateHistoryPartition();
         int idx;
-        int start = dynamicPartitionProperty.getStart();
-        int historyPartitionNum = 
dynamicPartitionProperty.getHistoryPartitionNum();
         // When enable create_history_partition, will check the valid value 
from start and history_partition_num.
         if (createHistoryPartition) {
-            if (historyPartitionNum == 
DynamicPartitionProperty.NOT_SET_HISTORY_PARTITION_NUM) {
-                idx = start;
-            } else {
-                idx = Math.max(start, -historyPartitionNum);
-            }
+            idx = 
DynamicPartitionUtil.getRealStart(dynamicPartitionProperty.getStart(),
+                    dynamicPartitionProperty.getHistoryPartitionNum());
         } else {
             idx = 0;
         }
@@ -262,12 +258,14 @@ public class DynamicPartitionScheduler extends 
MasterDaemon {
                 PartitionKey upperBound = 
PartitionKey.createPartitionKey(Collections.singletonList(upperValue),
                         Collections.singletonList(partitionColumn));
                 addPartitionKeyRange = Range.closedOpen(lowerBound, 
upperBound);
-            } catch (AnalysisException | IllegalArgumentException e) {
+            } catch (Exception e) {
                 // AnalysisException: keys.size is always equal to 
column.size, cannot reach this exception
                 // IllegalArgumentException: lb is greater than ub
-                LOG.warn("Error in gen addPartitionKeyRange. Error={}, db: {}, 
table: {}", e.getMessage(),
-                        db.getFullName(), olapTable.getName());
-                continue;
+                LOG.warn("Error in gen addPartitionKeyRange. db: {}, table: 
{}, partition idx: {}",
+                        db.getFullName(), olapTable.getName(), idx, e);
+                recordCreatePartitionFailedMsg(db.getFullName(), 
olapTable.getName(),
+                        e.getMessage(), olapTable.getId());
+                throw new DdlException(e.getMessage());
             }
             for (PartitionItem partitionItem : 
rangePartitionInfo.getIdToItem(false).values()) {
                 // only support single column partition now
@@ -277,13 +275,16 @@ public class DynamicPartitionScheduler extends 
MasterDaemon {
                     isPartitionExists = true;
                     if (addPartitionKeyRange.equals(partitionItem.getItems())) 
{
                         if (LOG.isDebugEnabled()) {
-                            LOG.debug("partition range {} exist in table {}, 
clear fail msg",
-                                    addPartitionKeyRange, olapTable.getName());
+                            LOG.debug("partition range {} exist in db {} table 
{} partition idx {}, clear fail msg",
+                                    addPartitionKeyRange, db.getFullName(), 
olapTable.getName(), idx);
                         }
                         clearCreatePartitionFailedMsg(olapTable.getId());
                     } else {
+                        LOG.warn("check partition range {} in db {} table {} 
partiton idx {} fail",
+                                addPartitionKeyRange, db.getFullName(), 
olapTable.getName(), idx, e);
                         recordCreatePartitionFailedMsg(db.getFullName(), 
olapTable.getName(),
                                 e.getMessage(), olapTable.getId());
+                        throw new DdlException(e.getMessage());
                     }
                     break;
                 }
@@ -319,7 +320,7 @@ public class DynamicPartitionScheduler extends MasterDaemon 
{
 
             DistributionDesc distributionDesc = null;
             DistributionInfo distributionInfo = 
olapTable.getDefaultDistributionInfo();
-            int bucketsNum = getBucketsNum(dynamicPartitionProperty, 
olapTable, nowPartitionName);
+            int bucketsNum = getBucketsNum(dynamicPartitionProperty, 
olapTable, nowPartitionName, executeFirstTime);
             if (distributionInfo.getType() == 
DistributionInfo.DistributionInfoType.HASH) {
                 HashDistributionInfo hashDistributionInfo = 
(HashDistributionInfo) distributionInfo;
                 List<String> distColumnNames = new ArrayList<>();
@@ -393,11 +394,11 @@ public class DynamicPartitionScheduler extends 
MasterDaemon {
             PartitionKey upperBorderBound = PartitionKey.createPartitionKey(
                     Collections.singletonList(upperBorderPartitionValue), 
Collections.singletonList(partitionColumn));
             reservedHistoryPartitionKeyRange = Range.closed(lowerBorderBound, 
upperBorderBound);
-        } catch (AnalysisException e) {
+        } catch (org.apache.doris.common.AnalysisException | 
org.apache.doris.nereids.exceptions.AnalysisException e) {
             // AnalysisException: keys.size is always equal to column.size, 
cannot reach this exception
             // IllegalArgumentException: lb is greater than ub
-            LOG.warn("Error in gen reservePartitionKeyRange. Error={}, db: {}, 
table: {}", e.getMessage(),
-                    db.getFullName(), olapTable.getName());
+            LOG.warn("Error in gen reservePartitionKeyRange. {}, table: {}",
+                    db.getFullName(), olapTable.getName(), e);
         }
         return reservedHistoryPartitionKeyRange;
     }
@@ -415,9 +416,11 @@ public class DynamicPartitionScheduler extends 
MasterDaemon {
             return dropPartitionClauses;
         }
 
+        int realStart = 
DynamicPartitionUtil.getRealStart(dynamicPartitionProperty.getStart(),
+                dynamicPartitionProperty.getHistoryPartitionNum());
         ZonedDateTime now = 
ZonedDateTime.now(dynamicPartitionProperty.getTimeZone().toZoneId());
         String lowerBorder = 
DynamicPartitionUtil.getPartitionRangeString(dynamicPartitionProperty,
-                now, dynamicPartitionProperty.getStart(), partitionFormat);
+                now, realStart, partitionFormat);
         PartitionValue lowerPartitionValue = new PartitionValue(lowerBorder);
         List<Range<PartitionKey>> reservedHistoryPartitionKeyRangeList = new 
ArrayList<Range<PartitionKey>>();
         Range<PartitionKey> reservePartitionKeyRange;
@@ -426,11 +429,12 @@ public class DynamicPartitionScheduler extends 
MasterDaemon {
                     Collections.singletonList(partitionColumn));
             reservePartitionKeyRange = Range.atLeast(lowerBound);
             reservedHistoryPartitionKeyRangeList.add(reservePartitionKeyRange);
-        } catch (AnalysisException | IllegalArgumentException e) {
+        } catch (Exception e) {
             // AnalysisException: keys.size is always equal to column.size, 
cannot reach this exception
             // IllegalArgumentException: lb is greater than ub
-            LOG.warn("Error in gen reservePartitionKeyRange. Error={}, db: {}, 
table: {}", e.getMessage(),
-                    db.getFullName(), olapTable.getName());
+            LOG.warn("Error in gen reservePartitionKeyRange. db: {}, table: 
{}",
+                    db.getFullName(), olapTable.getName(), e);
+            recordDropPartitionFailedMsg(db.getFullName(), 
olapTable.getName(), e.getMessage(), olapTable.getId());
             return dropPartitionClauses;
         }
 
@@ -451,7 +455,8 @@ public class DynamicPartitionScheduler extends MasterDaemon 
{
                     
reservedHistoryPartitionKeyRangeList.add(reservedHistoryPartitionKeyRange);
                 } catch (IllegalArgumentException e) {
                     return dropPartitionClauses;
-                } catch (AnalysisException e) {
+                } catch (org.apache.doris.common.AnalysisException
+                        | 
org.apache.doris.nereids.exceptions.AnalysisException e) {
                     throw new DdlException(e.getMessage());
                 }
             }
@@ -483,7 +488,8 @@ public class DynamicPartitionScheduler extends MasterDaemon 
{
         return dropPartitionClauses;
     }
 
-    private void executeDynamicPartition(Collection<Pair<Long, Long>> 
dynamicPartitionTableInfoCol) {
+    private void executeDynamicPartition(Collection<Pair<Long, Long>> 
dynamicPartitionTableInfoCol,
+            boolean executeFirstTime) throws DdlException {
         Iterator<Pair<Long, Long>> iterator = 
dynamicPartitionTableInfoCol.iterator();
         while (iterator.hasNext()) {
             Pair<Long, Long> tableInfo = iterator.next();
@@ -543,12 +549,16 @@ public class DynamicPartitionScheduler extends 
MasterDaemon {
                 }
 
                 if (!skipAddPartition) {
-                    addPartitionClauses = getAddPartitionClause(db, olapTable, 
partitionColumn, partitionFormat);
+                    addPartitionClauses = getAddPartitionClause(db, olapTable, 
partitionColumn, partitionFormat,
+                            executeFirstTime);
                 }
                 dropPartitionClauses = getDropPartitionClause(db, olapTable, 
partitionColumn, partitionFormat);
                 tableName = olapTable.getName();
-            } catch (DdlException e) {
-                LOG.warn("should not happen", e);
+            } catch (Exception e) {
+                LOG.warn("has error", e);
+                if (executeFirstTime) {
+                    throw new DdlException(e.getMessage());
+                }
             } finally {
                 olapTable.readUnlock();
             }
@@ -562,6 +572,10 @@ public class DynamicPartitionScheduler extends 
MasterDaemon {
                     clearDropPartitionFailedMsg(olapTable.getId());
                 } catch (Exception e) {
                     recordDropPartitionFailedMsg(db.getFullName(), tableName, 
e.getMessage(), olapTable.getId());
+                    LOG.warn("has error", e);
+                    if (executeFirstTime) {
+                        throw new DdlException(e.getMessage());
+                    }
                 } finally {
                     olapTable.writeUnlock();
                 }
@@ -574,6 +588,10 @@ public class DynamicPartitionScheduler extends 
MasterDaemon {
                         clearCreatePartitionFailedMsg(olapTable.getId());
                     } catch (Exception e) {
                         recordCreatePartitionFailedMsg(db.getFullName(), 
tableName, e.getMessage(), olapTable.getId());
+                        LOG.warn("has error", e);
+                        if (executeFirstTime) {
+                            throw new DdlException(e.getMessage());
+                        }
                     }
                 }
             }
@@ -631,7 +649,14 @@ public class DynamicPartitionScheduler extends 
MasterDaemon {
         }
         setInterval(Config.dynamic_partition_check_interval_seconds * 1000L);
         if (Config.dynamic_partition_enable) {
-            executeDynamicPartition(dynamicPartitionTableInfo);
+            try {
+                executeDynamicPartition(dynamicPartitionTableInfo, false);
+            } catch (Exception e) {
+                // previous had log DdlException
+                if (LOG.isDebugEnabled()) {
+                    LOG.debug("dynamic partition has error: ", e);
+                }
+            }
         }
     }
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/common/ErrorCode.java 
b/fe/fe-core/src/main/java/org/apache/doris/common/ErrorCode.java
index 51bece5c800..c1c24baead3 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/common/ErrorCode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/common/ErrorCode.java
@@ -1121,9 +1121,9 @@ public enum ErrorCode {
     ERR_COLOCATE_TABLE_MUST_HAS_SAME_REPLICATION_ALLOCATION(5063, new 
byte[]{'4', '2', '0', '0', '0'},
             "Colocate tables must have same replication allocation: { %s } 
should be { %s }"),
     ERR_COLOCATE_TABLE_MUST_HAS_SAME_BUCKET_NUM(5063, new byte[]{'4', '2', 
'0', '0', '0'},
-            "Colocate tables must have same bucket num: %s"),
+            "Colocate tables must have same bucket num: %s should be %s"),
     ERR_COLOCATE_TABLE_MUST_HAS_SAME_DISTRIBUTION_COLUMN_SIZE(5063, new 
byte[]{'4', '2', '0', '0', '0'},
-            "Colocate tables distribution columns size must be same : %s"),
+            "Colocate tables distribution columns size must be same: %s should 
be %s"),
     ERR_COLOCATE_TABLE_MUST_HAS_SAME_DISTRIBUTION_COLUMN_TYPE(5063, new 
byte[]{'4', '2', '0', '0', '0'},
             "Colocate tables distribution columns must have the same data 
type: %s should be %s"),
     ERR_COLOCATE_NOT_COLOCATE_TABLE(5064, new byte[]{'4', '2', '0', '0', '0'},
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/common/util/DynamicPartitionUtil.java
 
b/fe/fe-core/src/main/java/org/apache/doris/common/util/DynamicPartitionUtil.java
index fe29dfe7eea..6f001ddb2d4 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/common/util/DynamicPartitionUtil.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/common/util/DynamicPartitionUtil.java
@@ -583,21 +583,18 @@ public class DynamicPartitionUtil {
         long expectCreatePartitionNum = 0;
         if (!createHistoryPartition) {
             start = 0;
-            expectCreatePartitionNum = (long) end - start;
         } else {
             int historyPartitionNum = 
Integer.parseInt(analyzedProperties.getOrDefault(
                     DynamicPartitionProperty.HISTORY_PARTITION_NUM,
                     
String.valueOf(DynamicPartitionProperty.NOT_SET_HISTORY_PARTITION_NUM)));
-            if (historyPartitionNum != 
DynamicPartitionProperty.NOT_SET_HISTORY_PARTITION_NUM) {
-                expectCreatePartitionNum = (long) end - Math.max(start, 
-historyPartitionNum);
-            } else {
-                if (start == Integer.MIN_VALUE) {
-                    throw new DdlException("Provide start or 
history_partition_num property"
-                            + " when create_history_partition=true. Otherwise 
set create_history_partition=false");
-                }
-                expectCreatePartitionNum = (long) end - start;
+            start = getRealStart(start, historyPartitionNum);
+            if (start == Integer.MIN_VALUE) {
+                throw new DdlException("Provide start or history_partition_num 
property"
+                        + " when create_history_partition=true. Otherwise set 
create_history_partition=false");
             }
         }
+        expectCreatePartitionNum = (long) end - start;
+
         if (hasEnd && (expectCreatePartitionNum > 
Config.max_dynamic_partition_num)
                 && 
Boolean.parseBoolean(analyzedProperties.getOrDefault(DynamicPartitionProperty.ENABLE,
 "true"))) {
             throw new DdlException("Too many dynamic partitions: "
@@ -683,6 +680,14 @@ public class DynamicPartitionUtil {
         return analyzedProperties;
     }
 
+    public static int getRealStart(int start, int historyPartitionNum) {
+        if (historyPartitionNum == 
DynamicPartitionProperty.NOT_SET_HISTORY_PARTITION_NUM) {
+            return start;
+        } else {
+            return Math.max(start, -historyPartitionNum);
+        }
+    }
+
     public static void checkAlterAllowed(OlapTable olapTable) throws 
DdlException {
         TableProperty tableProperty = olapTable.getTableProperty();
         if (tableProperty != null && 
tableProperty.getDynamicPartitionProperty() != null
diff --git a/fe/fe-core/src/test/java/org/apache/doris/alter/AlterTest.java 
b/fe/fe-core/src/test/java/org/apache/doris/alter/AlterTest.java
index cab0c2ba0f5..bb9cbe0d717 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/alter/AlterTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/alter/AlterTest.java
@@ -163,11 +163,12 @@ public class AlterTest {
                 + "PROPERTIES\n"
                 + "(\n"
                 + "\"colocate_with\" = \"group_3\",\n"
+                + "\"replication_num\" = \"1\",\n"
                 + "\"dynamic_partition.enable\" = \"true\",\n"
                 + "\"dynamic_partition.time_unit\" = \"DAY\",\n"
                 + "\"dynamic_partition.end\" = \"3\",\n"
                 + "\"dynamic_partition.prefix\" = \"p\",\n"
-                + "\"dynamic_partition.buckets\" = \"32\",\n"
+                + "\"dynamic_partition.buckets\" = \"3\",\n"
                 + "\"dynamic_partition.replication_num\" = \"1\",\n"
                 + "\"dynamic_partition.create_history_partition\"=\"true\",\n"
                 + "\"dynamic_partition.start\" = \"-3\"\n"
@@ -254,7 +255,12 @@ public class AlterTest {
     private static void createTable(String sql) throws Exception {
         Config.enable_odbc_mysql_broker_table = true;
         CreateTableStmt createTableStmt = (CreateTableStmt) 
UtFrameUtils.parseAndAnalyzeStmt(sql, connectContext);
-        Env.getCurrentEnv().createTable(createTableStmt);
+        try {
+            Env.getCurrentEnv().createTable(createTableStmt);
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw e;
+        }
     }
 
     private static void createRemoteStorageResource(String sql) throws 
Exception {
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/catalog/ColocateTableTest.java 
b/fe/fe-core/src/test/java/org/apache/doris/catalog/ColocateTableTest.java
index 87b51808431..6def5f1774b 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/catalog/ColocateTableTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/catalog/ColocateTableTest.java
@@ -222,7 +222,7 @@ public class ColocateTableTest {
                 + ");");
 
         expectedEx.expect(DdlException.class);
-        expectedEx.expectMessage("Colocate tables must have same bucket num: 
1");
+        expectedEx.expectMessage("Colocate tables must have same bucket num: 2 
should be 1");
         createTable("create table " + dbName + "." + tableName2 + " (\n"
                 + " `k1` int NULL COMMENT \"\",\n"
                 + " `k2` varchar(10) NULL COMMENT \"\"\n"
@@ -282,7 +282,7 @@ public class ColocateTableTest {
                 + ");");
 
         expectedEx.expect(DdlException.class);
-        expectedEx.expectMessage("Colocate tables distribution columns size 
must be same : 2");
+        expectedEx.expectMessage("Colocate tables distribution columns size 
must be same: 1 should be 2");
         createTable("create table " + dbName + "." + tableName2 + " (\n"
                 + " `k1` int NULL COMMENT \"\",\n"
                 + " `k2` varchar(10) NULL COMMENT \"\"\n"
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/catalog/DynamicPartitionTableTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/catalog/DynamicPartitionTableTest.java
index f5493dedb76..d457be0324f 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/catalog/DynamicPartitionTableTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/catalog/DynamicPartitionTableTest.java
@@ -67,6 +67,7 @@ public class DynamicPartitionTableTest {
         FeConstants.default_scheduler_interval_millisecond = 1000;
         FeConstants.runningUnitTest = true;
         Config.disable_storage_medium_check = true;
+        Config.dynamic_partition_enable = false; // disable auto create 
dynamic partition
 
         UtFrameUtils.createDorisCluster(runningDir);
 
@@ -722,6 +723,25 @@ public class DynamicPartitionTableTest {
         ExceptionChecker.expectThrowsNoException(() -> alterTable(alter4));
         
Env.getCurrentEnv().getDynamicPartitionScheduler().executeDynamicPartitionFirstTime(db.getId(),
 tbl.getId());
         Assert.assertEquals(24, tbl.getPartitionNames().size());
+
+        String createOlapTblStmt5 =
+                "CREATE TABLE test.`dynamic_partition4` (\n" + "  `k1` 
datetime NULL COMMENT \"\"\n" + ")\n"
+                        + "PARTITION BY RANGE (k1)\n" + "()\n" + "DISTRIBUTED 
BY HASH(`k1`) BUCKETS 1\n"
+                        + "PROPERTIES (\n" + "\"replication_num\" = \"1\",\n"
+                        + "\"dynamic_partition.enable\" = \"true\",\n" + 
"\"dynamic_partition.end\" = \"3\",\n"
+                        + "\"dynamic_partition.time_unit\" = \"day\",\n" + 
"\"dynamic_partition.prefix\" = \"p\",\n"
+                        + "\"dynamic_partition.buckets\" = \"1\",\n" + 
"\"dynamic_partition.start\" = \"-99999999\",\n"
+                        + "\"dynamic_partition.history_partition_num\" = 
\"5\",\n"
+                        + "\"dynamic_partition.create_history_partition\" = 
\"true\"\n" + ");";
+        // start and history_partition_num are set, create ok
+        ExceptionChecker.expectThrowsNoException(() -> 
createTable(createOlapTblStmt5));
+        OlapTable tbl4 = (OlapTable) 
db.getTableOrAnalysisException("dynamic_partition4");
+        Assert.assertEquals(9, tbl4.getPartitionNames().size());
+
+        String alter5 = "alter table test.dynamic_partition4 set 
('dynamic_partition.history_partition_num' = '3')";
+        ExceptionChecker.expectThrowsNoException(() -> alterTable(alter5));
+        
Env.getCurrentEnv().getDynamicPartitionScheduler().executeDynamicPartitionFirstTime(db.getId(),
 tbl4.getId());
+        Assert.assertEquals(7, tbl4.getPartitionNames().size());
     }
 
     @Test
diff --git 
a/regression-test/suites/partition_p0/dynamic_partition/test_dynamic_partition_failed.groovy
 
b/regression-test/suites/partition_p0/dynamic_partition/test_dynamic_partition_failed.groovy
new file mode 100644
index 00000000000..7da145a36bc
--- /dev/null
+++ 
b/regression-test/suites/partition_p0/dynamic_partition/test_dynamic_partition_failed.groovy
@@ -0,0 +1,74 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+suite('test_dynamic_partition_failed', 'nonConcurrent') {
+    def old_max_dynamic_partition_num = 
getFeConfig('max_dynamic_partition_num')
+    try {
+        sql 'DROP TABLE IF EXISTS test_dynamic_partition_failed_1'
+        sql '''CREATE TABLE test_dynamic_partition_failed_1
+              ( `k1` datetime NULL )
+              PARTITION BY RANGE (k1)()
+              DISTRIBUTED BY HASH(`k1`) BUCKETS 1
+              PROPERTIES
+              (
+                "replication_num" = "1",
+                "dynamic_partition.enable" = "true",
+                "dynamic_partition.end" = "3",
+                "dynamic_partition.time_unit" = "day",
+                "dynamic_partition.prefix" = "p",
+                "dynamic_partition.buckets" = "1",
+                "dynamic_partition.start" = "-99999999",
+                "dynamic_partition.history_partition_num" = "5",
+                "dynamic_partition.create_history_partition" = "true"
+              )'''
+
+        def partitions = sql_return_maparray "SHOW PARTITIONS FROM 
test_dynamic_partition_failed_1"
+        assertEquals(9, partitions.size());
+
+        setFeConfig('max_dynamic_partition_num', Integer.MAX_VALUE)
+
+        sql 'DROP TABLE IF EXISTS test_dynamic_partition_failed_2'
+        test {
+            sql '''CREATE TABLE test_dynamic_partition_failed_2
+                  ( `k1` datetime NULL )
+                  PARTITION BY RANGE (k1)()
+                  DISTRIBUTED BY HASH(`k1`) BUCKETS 1
+                  PROPERTIES
+                  (
+                    "replication_num" = "1",
+                    "dynamic_partition.enable" = "true",
+                    "dynamic_partition.end" = "3",
+                    "dynamic_partition.time_unit" = "day",
+                    "dynamic_partition.prefix" = "p",
+                    "dynamic_partition.buckets" = "1",
+                    "dynamic_partition.start" = "-99999999",
+                    "dynamic_partition.create_history_partition" = "true"
+                  )'''
+            check { result, exception, startTime, endTime ->
+                assertNotNull(exception)
+                def msg = exception.toString()
+                logger.info("exception: " + msg)
+                // 'date/datetime literal [+271768-09-11 00:00:00] is invalid'
+                assertTrue(msg.contains('date/datetime literal') && 
msg.contains('is invalid'))
+            }
+        }
+    } finally {
+        setFeConfig('max_dynamic_partition_num', old_max_dynamic_partition_num)
+        sql 'DROP TABLE IF EXISTS test_dynamic_partition_failed_1'
+        sql 'DROP TABLE IF EXISTS test_dynamic_partition_failed_2'
+    }
+}


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

Reply via email to