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

morningman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-doris.git


The following commit(s) were added to refs/heads/master by this push:
     new d64d653  [Bug][DynamicPartition]Fix bug that Modify a dynamic 
partition property in a non-dynamic partition table will throw a Exception 
(#4127)
d64d653 is described below

commit d64d65322bdf7625bb7eff636f354bc060c54530
Author: WangCong <[email protected]>
AuthorDate: Sun Aug 2 09:03:57 2020 -0500

    [Bug][DynamicPartition]Fix bug that Modify a dynamic partition property in 
a non-dynamic partition table will throw a Exception (#4127)
---
 .../apache/doris/alter/SchemaChangeHandler.java    |  10 ++
 .../doris/common/util/DynamicPartitionUtil.java    |   6 +-
 .../java/org/apache/doris/alter/AlterTest.java     | 136 +++++++++++++++++----
 .../apache/doris/alter/SchemaChangeJobV2Test.java  |   3 +-
 4 files changed, 129 insertions(+), 26 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeHandler.java 
b/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeHandler.java
index 98074f8..6345f45 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeHandler.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeHandler.java
@@ -1392,6 +1392,16 @@ public class SchemaChangeHandler extends AlterHandler {
                     sendClearAlterTask(db, olapTable);
                     return;
                 } else if 
(DynamicPartitionUtil.checkDynamicPartitionPropertiesExist(properties)) {
+                    if (!olapTable.dynamicPartitionExists()) {
+                        try {
+                            
DynamicPartitionUtil.checkInputDynamicPartitionProperties(properties, 
olapTable.getPartitionInfo());
+                        } catch (DdlException e) {
+                            // This table is not a dynamic partition table and 
didn't supply all dynamic partition properties
+                            throw new DdlException("Table " + db.getFullName() 
+ "." +
+                                    olapTable.getName() + " is not a dynamic 
partition table. Use command `HELP ALTER TABLE` " +
+                                    "to see how to change a normal table to a 
dynamic partition table.");
+                        }
+                    }
                     
Catalog.getCurrentCatalog().modifyTableDynamicPartition(db, olapTable, 
properties);
                     return;
                 } else if (properties.containsKey("default." + 
PropertyAnalyzer.PROPERTIES_REPLICATION_NUM)) {
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 8be5b2e..c83eac0 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
@@ -179,7 +179,7 @@ public class DynamicPartitionUtil {
                 
properties.containsKey(DynamicPartitionProperty.START_DAY_OF_MONTH);
     }
 
-    private static boolean checkInputDynamicPartitionProperties(Map<String, 
String> properties, PartitionInfo partitionInfo) throws DdlException{
+    public static boolean checkInputDynamicPartitionProperties(Map<String, 
String> properties, PartitionInfo partitionInfo) throws DdlException{
         if (properties == null || properties.isEmpty()) {
             return false;
         }
@@ -192,7 +192,6 @@ public class DynamicPartitionUtil {
         String timeZone = properties.get(DynamicPartitionProperty.TIME_ZONE);
         String end = properties.get(DynamicPartitionProperty.END);
         String buckets = properties.get(DynamicPartitionProperty.BUCKETS);
-        String replicationNum = 
properties.get(DynamicPartitionProperty.REPLICATION_NUM);
         String enable = properties.get(DynamicPartitionProperty.ENABLE);
         if (!((Strings.isNullOrEmpty(enable) &&
                 Strings.isNullOrEmpty(timeUnit) &&
@@ -312,7 +311,8 @@ public class DynamicPartitionUtil {
         if (tableProperty != null && 
tableProperty.getDynamicPartitionProperty() != null &&
                 tableProperty.getDynamicPartitionProperty().isExist() &&
                 tableProperty.getDynamicPartitionProperty().getEnable()) {
-            throw new DdlException("Cannot add/drop partition on a Dynamic 
Partition Table, set `dynamic_partition.enable` to false firstly.");
+            throw new DdlException("Cannot add/drop partition on a Dynamic 
Partition Table, " +
+                    "Use command `ALTER TABLE tbl_name SET 
(\"dynamic_partition.enable\" = \"false\")` firstly.");
         }
     }
 
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 41dadc0..2e921f6 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
@@ -66,18 +66,18 @@ public class AlterTest {
         CreateDbStmt createDbStmt = (CreateDbStmt) 
UtFrameUtils.parseAndAnalyzeStmt(createDbStmtStr, connectContext);
         Catalog.getCurrentCatalog().createDb(createDbStmt);
 
-        createTable("CREATE TABLE test.tbl1\n" + 
-                "(\n" + 
-                "    k1 date,\n" + 
-                "    k2 int,\n" + 
-                "    v1 int sum\n" + 
-                ")\n" + 
-                "PARTITION BY RANGE(k1)\n" + 
-                "(\n" + 
-                "    PARTITION p1 values less than('2020-02-01'),\n" + 
-                "    PARTITION p2 values less than('2020-03-01')\n" + 
-                ")\n" + 
-                "DISTRIBUTED BY HASH(k2) BUCKETS 3\n" + 
+        createTable("CREATE TABLE test.tbl1\n" +
+                "(\n" +
+                "    k1 date,\n" +
+                "    k2 int,\n" +
+                "    v1 int sum\n" +
+                ")\n" +
+                "PARTITION BY RANGE(k1)\n" +
+                "(\n" +
+                "    PARTITION p1 values less than('2020-02-01'),\n" +
+                "    PARTITION p2 values less than('2020-03-01')\n" +
+                ")\n" +
+                "DISTRIBUTED BY HASH(k2) BUCKETS 3\n" +
                 "PROPERTIES('replication_num' = '1');");
 
         createTable("CREATE TABLE test.tbl2\n" +
@@ -151,6 +151,15 @@ public class AlterTest {
         }
     }
 
+    private static void alterTableWithExceptionMsg(String sql, String msg) 
throws Exception {
+        AlterTableStmt alterTableStmt = (AlterTableStmt) 
UtFrameUtils.parseAndAnalyzeStmt(sql, connectContext);
+        try {
+            Catalog.getCurrentCatalog().alterTable(alterTableStmt);
+        } catch (Exception e) {
+            Assert.assertEquals(msg, e.getMessage());
+        }
+    }
+
     @Test
     public void testConflictAlterOperations() throws Exception {
         String stmt = "alter table test.tbl1 add partition p3 values less 
than('2020-04-01'), add partition p4 values less than('2020-05-01')";
@@ -169,7 +178,7 @@ public class AlterTest {
         stmt = "alter table test.tbl1 add column k3 int, add column k4 int";
         alterTable(stmt, false);
         waitSchemaChangeJobDone(false);
-        
+
         stmt = "alter table test.tbl1 add rollup r1 (k1)";
         alterTable(stmt, false);
         waitSchemaChangeJobDone(true);
@@ -177,22 +186,22 @@ public class AlterTest {
         stmt = "alter table test.tbl1 add rollup r2 (k1), r3 (k1)";
         alterTable(stmt, false);
         waitSchemaChangeJobDone(true);
-        
+
         // enable dynamic partition
         // not adding the `start` property so that it won't drop the origin 
partition p1, p2 and p3
-        stmt = "alter table test.tbl1 set (\n" + 
-                "'dynamic_partition.enable' = 'true',\n" + 
+        stmt = "alter table test.tbl1 set (\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' = '3'\n" + 
+                "'dynamic_partition.end' = '3',\n" +
+                "'dynamic_partition.prefix' = 'p',\n" +
+                "'dynamic_partition.buckets' = '3'\n" +
                 " );";
         alterTable(stmt, false);
         Database db = 
Catalog.getCurrentCatalog().getDb("default_cluster:test");
-        OlapTable tbl = (OlapTable)db.getTable("tbl1");
+        OlapTable tbl = (OlapTable) db.getTable("tbl1");
         
Assert.assertTrue(tbl.getTableProperty().getDynamicPartitionProperty().getEnable());
         Assert.assertEquals(4, tbl.getIndexIdToSchema().size());
-        
+
         // add partition when dynamic partition is enable
         stmt = "alter table test.tbl1 add partition p3 values less 
than('2020-04-01') distributed by hash(k2) buckets 4 PROPERTIES 
('replication_num' = '1')";
         alterTable(stmt, true);
@@ -206,7 +215,7 @@ public class AlterTest {
         stmt = "alter table test.tbl1 set ('dynamic_partition.enable' = 
'false')";
         alterTable(stmt, false);
         
Assert.assertFalse(tbl.getTableProperty().getDynamicPartitionProperty().getEnable());
-        
+
         // add partition when dynamic partition is disable
         stmt = "alter table test.tbl1 add partition p3 values less 
than('2020-04-01') distributed by hash(k2) buckets 4";
         alterTable(stmt, false);
@@ -336,4 +345,87 @@ public class AlterTest {
             Assert.assertEquals(AlterJobV2.JobState.FINISHED, 
alterJobV2.getJobState());
         }
     }
+
+    @Test
+    public void testSetDynamicPropertiesInNormalTable() throws Exception {
+        String tableName = "no_dynamic_table";
+        String createOlapTblStmt = "CREATE TABLE test.`" + tableName + "` (\n" 
+
+                "  `k1` date NULL COMMENT \"\",\n" +
+                "  `k2` int NULL COMMENT \"\",\n" +
+                "  `k3` smallint NULL COMMENT \"\",\n" +
+                "  `v1` varchar(2048) NULL COMMENT \"\",\n" +
+                "  `v2` datetime NULL COMMENT \"\"\n" +
+                ") ENGINE=OLAP\n" +
+                "DUPLICATE KEY(`k1`, `k2`, `k3`)\n" +
+                "COMMENT \"OLAP\"\n" +
+                "PARTITION BY RANGE (k1)\n" +
+                "(\n" +
+                "PARTITION p1 VALUES LESS THAN (\"2014-01-01\"),\n" +
+                "PARTITION p2 VALUES LESS THAN (\"2014-06-01\"),\n" +
+                "PARTITION p3 VALUES LESS THAN (\"2014-12-01\")\n" +
+                ")\n" +
+                "DISTRIBUTED BY HASH(`k1`) BUCKETS 32\n" +
+                "PROPERTIES (\n" +
+                "\"replication_num\" = \"1\"\n" +
+                ");";
+        createTable(createOlapTblStmt);
+        String alterStmt = "alter table test." + tableName + " set 
(\"dynamic_partition.enable\" = \"true\");";
+        String errorMsg = "errCode = 2, detailMessage = Table 
default_cluster:test.no_dynamic_table is not a dynamic partition table. " +
+                "Use command `HELP ALTER TABLE` to see how to change a normal 
table to a dynamic partition table.";
+        alterTableWithExceptionMsg(alterStmt, errorMsg);
+        // test set dynamic properties in a no dynamic partition table
+        String stmt = "alter table test." + tableName + " set (\n" +
+                "'dynamic_partition.enable' = 'true',\n" +
+                "'dynamic_partition.time_unit' = 'DAY',\n" +
+                "'dynamic_partition.start' = '-3',\n" +
+                "'dynamic_partition.end' = '3',\n" +
+                "'dynamic_partition.prefix' = 'p',\n" +
+                "'dynamic_partition.buckets' = '3'\n" +
+                " );";
+        alterTable(stmt, false);
+    }
+
+    @Test
+    public void testSetDynamicPropertiesInDynamicPartitionTable() throws 
Exception {
+        String tableName = "dynamic_table";
+        String createOlapTblStmt = "CREATE TABLE test.`" + tableName + "` (\n" 
+
+                "  `k1` date NULL COMMENT \"\",\n" +
+                "  `k2` int NULL COMMENT \"\",\n" +
+                "  `k3` smallint NULL COMMENT \"\",\n" +
+                "  `v1` varchar(2048) NULL COMMENT \"\",\n" +
+                "  `v2` datetime NULL COMMENT \"\"\n" +
+                ") ENGINE=OLAP\n" +
+                "DUPLICATE KEY(`k1`, `k2`, `k3`)\n" +
+                "COMMENT \"OLAP\"\n" +
+                "PARTITION BY RANGE (k1)\n" +
+                "(\n" +
+                "PARTITION p1 VALUES LESS THAN (\"2014-01-01\"),\n" +
+                "PARTITION p2 VALUES LESS THAN (\"2014-06-01\"),\n" +
+                "PARTITION p3 VALUES LESS THAN (\"2014-12-01\")\n" +
+                ")\n" +
+                "DISTRIBUTED BY HASH(`k1`) BUCKETS 32\n" +
+                "PROPERTIES (\n" +
+                "\"replication_num\" = \"1\",\n" +
+                "\"dynamic_partition.enable\" = \"true\",\n" +
+                "\"dynamic_partition.start\" = \"-3\",\n" +
+                "\"dynamic_partition.end\" = \"3\",\n" +
+                "\"dynamic_partition.time_unit\" = \"day\",\n" +
+                "\"dynamic_partition.prefix\" = \"p\",\n" +
+                "\"dynamic_partition.buckets\" = \"1\"\n" +
+                ");";
+
+        createTable(createOlapTblStmt);
+        String alterStmt1 = "alter table test." + tableName + " set 
(\"dynamic_partition.enable\" = \"false\");";
+        alterTable(alterStmt1, false);
+        String alterStmt2 = "alter table test." + tableName + " set 
(\"dynamic_partition.time_unit\" = \"week\");";
+        alterTable(alterStmt2, false);
+        String alterStmt3 = "alter table test." + tableName + " set 
(\"dynamic_partition.start\" = \"-10\");";
+        alterTable(alterStmt3, false);
+        String alterStmt4 = "alter table test." + tableName + " set 
(\"dynamic_partition.end\" = \"10\");";
+        alterTable(alterStmt4, false);
+        String alterStmt5 = "alter table test." + tableName + " set 
(\"dynamic_partition.prefix\" = \"pp\");";
+        alterTable(alterStmt5, false);
+        String alterStmt6 = "alter table test." + tableName + " set 
(\"dynamic_partition.buckets\" = \"5\");";
+        alterTable(alterStmt6, false);
+    }
 }
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/alter/SchemaChangeJobV2Test.java 
b/fe/fe-core/src/test/java/org/apache/doris/alter/SchemaChangeJobV2Test.java
index 1eea8bb..b48c8b8 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/alter/SchemaChangeJobV2Test.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/alter/SchemaChangeJobV2Test.java
@@ -372,7 +372,8 @@ public class SchemaChangeJobV2Test {
         OlapTable olapTable = (OlapTable) 
db.getTable(CatalogMocker.TEST_TBL2_ID);
 
         expectedEx.expect(DdlException.class);
-        expectedEx.expectMessage(String.format("Must assign %s properties", 
missPropertyKey));
+        expectedEx.expectMessage("errCode = 2, detailMessage = Table 
test_db.test_tbl2 is not a dynamic partition table. " +
+                "Use command `HELP ALTER TABLE` to see how to change a normal 
table to a dynamic partition table.");
 
         schemaChangeHandler.process(alterClauses, "default_cluster", db, 
olapTable);
     }


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

Reply via email to