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

CRZbulabula pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/master by this push:
     new a98bd569bd0 Supply the max_schema/data_region_group_num param to 
modify schema when create or alter database (#17988)
a98bd569bd0 is described below

commit a98bd569bd0c3930be8dd1e5e987c255941c5231
Author: libo <[email protected]>
AuthorDate: Tue Jun 23 16:24:45 2026 +0800

    Supply the max_schema/data_region_group_num param to modify schema when 
create or alter database (#17988)
---
 .../it/database/IoTDBDatabaseRegionControlIT.java  |  18 +-
 .../manual/enhanced/IoTDBPipeMetaIT.java           |   1 -
 .../auto/enhanced/IoTDBPipeIdempotentIT.java       |   6 +-
 .../relational/it/schema/IoTDBDatabaseIT.java      |  39 ++-
 .../schema/IoTDBDatabaseMaxRegionGroupNumIT.java   | 229 ++++++++++++++++++
 .../IoTDBDatabaseMixedRegionGroupPolicyIT.java     |  83 +++++++
 .../org/apache/iotdb/db/qp/sql/IdentifierParser.g4 |   4 +-
 .../org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4   |   4 +-
 .../antlr4/org/apache/iotdb/db/qp/sql/SqlLexer.g4  |   8 +-
 .../manager/partition/PartitionManager.java        |  10 +-
 .../manager/schema/ClusterSchemaManager.java       | 269 +++++++++++++++------
 .../persistence/schema/ClusterSchemaInfo.java      |  24 +-
 .../execution/config/TableConfigTaskVisitor.java   |  19 +-
 .../config/metadata/DatabaseSchemaTask.java        |   9 +-
 .../metadata/relational/AbstractDatabaseTask.java  |   4 +-
 .../db/queryengine/plan/parser/ASTVisitor.java     |  12 +-
 .../metadata/DatabaseSchemaStatement.java          |  32 +--
 .../reporter/iotdb/IoTDBSessionReporter.java       |   4 +-
 18 files changed, 619 insertions(+), 156 deletions(-)

diff --git 
a/integration-test/src/test/java/org/apache/iotdb/confignode/it/database/IoTDBDatabaseRegionControlIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/confignode/it/database/IoTDBDatabaseRegionControlIT.java
index b66fadeb35f..bcee965cbcd 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/confignode/it/database/IoTDBDatabaseRegionControlIT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/confignode/it/database/IoTDBDatabaseRegionControlIT.java
@@ -58,6 +58,8 @@ public class IoTDBDatabaseRegionControlIT {
     EnvFactory.getEnv()
         .getConfig()
         .getCommonConfig()
+        .setSchemaRegionGroupExtensionPolicy("CUSTOM")
+        .setDataRegionGroupExtensionPolicy("CUSTOM")
         
.setDefaultSchemaRegionGroupNumPerDatabase(testDefaultSchemaRegionGroupNumPerDatabase)
         
.setDefaultDataRegionGroupNumPerDatabase(testDefaultDataRegionGroupNumPerDatabase);
 
@@ -132,7 +134,7 @@ public class IoTDBDatabaseRegionControlIT {
       final int testDataRegionGroupNum = 3;
       String createDatabaseSQL =
           String.format(
-              "CREATE DATABASE %s WITH SCHEMA_REGION_GROUP_NUM=%d, 
DATA_REGION_GROUP_NUM=%d;",
+              "CREATE DATABASE %s WITH MAX_SCHEMA_REGION_GROUP_NUM=%d, 
MAX_DATA_REGION_GROUP_NUM=%d;",
               database, testSchemaRegionGroupNum, testDataRegionGroupNum);
       statement.execute(createDatabaseSQL);
       insertBatchData(statement, database, 0);
@@ -204,7 +206,7 @@ public class IoTDBDatabaseRegionControlIT {
       final int testDataRegionGroupNum = 3;
       String alterDatabaseSQL =
           String.format(
-              "ALTER DATABASE %s WITH SCHEMA_REGION_GROUP_NUM=%d, 
DATA_REGION_GROUP_NUM=%d;",
+              "ALTER DATABASE %s WITH MAX_SCHEMA_REGION_GROUP_NUM=%d, 
MAX_DATA_REGION_GROUP_NUM=%d;",
               database, testSchemaRegionGroupNum, testDataRegionGroupNum);
       statement.execute(alterDatabaseSQL);
       insertBatchData(statement, database, batchSize);
@@ -233,4 +235,16 @@ public class IoTDBDatabaseRegionControlIT {
       Assert.assertEquals(testDataRegionGroupNum, dataRegionGroupNum.get());
     }
   }
+
+  @Test
+  public void testDeprecatedRegionGroupNumSqlRejected() throws SQLException {
+    try (final Connection connection = EnvFactory.getEnv().getConnection();
+        final Statement statement = connection.createStatement()) {
+      Assert.assertThrows(
+          SQLException.class,
+          () ->
+              statement.execute(
+                  "CREATE DATABASE root.paradise3 WITH 
SCHEMA_REGION_GROUP_NUM=3, DATA_REGION_GROUP_NUM=4;"));
+    }
+  }
 }
diff --git 
a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/tablemodel/manual/enhanced/IoTDBPipeMetaIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/tablemodel/manual/enhanced/IoTDBPipeMetaIT.java
index f26aa171ae1..0b0a82999c3 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/tablemodel/manual/enhanced/IoTDBPipeMetaIT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/tablemodel/manual/enhanced/IoTDBPipeMetaIT.java
@@ -230,7 +230,6 @@ public class IoTDBPipeMetaIT extends 
AbstractPipeTableModelDualManualIT {
           senderEnv,
           Arrays.asList(
               "create database root.test",
-              "alter database root.test with schema_region_group_num=2, 
data_region_group_num=3",
               "create timeSeries root.test.d1.s1 int32",
               "insert into root.test.d1 (s1) values (1)"));
 
diff --git 
a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/auto/enhanced/IoTDBPipeIdempotentIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/auto/enhanced/IoTDBPipeIdempotentIT.java
index 6596c779132..33a68d43ff2 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/auto/enhanced/IoTDBPipeIdempotentIT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/auto/enhanced/IoTDBPipeIdempotentIT.java
@@ -65,6 +65,8 @@ public class IoTDBPipeIdempotentIT extends 
AbstractPipeDualTreeModelAutoIT {
         // Limit the schemaRegion number to 1 to guarantee the after sql 
executed on the same region
         // of the tested idempotent sql.
         .setDefaultSchemaRegionGroupNumPerDatabase(1)
+        .setSchemaRegionGroupExtensionPolicy("CUSTOM")
+        .setDataRegionGroupExtensionPolicy("CUSTOM")
         .setConfigNodeConsensusProtocolClass(ConsensusFactory.RATIS_CONSENSUS)
         
.setSchemaRegionConsensusProtocolClass(ConsensusFactory.RATIS_CONSENSUS)
         .setEnforceStrongPassword(false)
@@ -75,6 +77,8 @@ public class IoTDBPipeIdempotentIT extends 
AbstractPipeDualTreeModelAutoIT {
         .getConfig()
         .getCommonConfig()
         .setAutoCreateSchemaEnabled(true)
+        .setSchemaRegionGroupExtensionPolicy("CUSTOM")
+        .setDataRegionGroupExtensionPolicy("CUSTOM")
         .setConfigNodeConsensusProtocolClass(ConsensusFactory.RATIS_CONSENSUS)
         
.setSchemaRegionConsensusProtocolClass(ConsensusFactory.RATIS_CONSENSUS)
         .setEnforceStrongPassword(false)
@@ -289,7 +293,7 @@ public class IoTDBPipeIdempotentIT extends 
AbstractPipeDualTreeModelAutoIT {
   public void testAlterDatabaseIdempotent() throws Exception {
     testIdempotent(
         Collections.singletonList("create database root.sg1"),
-        "ALTER DATABASE root.sg1 WITH SCHEMA_REGION_GROUP_NUM=2, 
DATA_REGION_GROUP_NUM=3;",
+        "ALTER DATABASE root.sg1 WITH MAX_SCHEMA_REGION_GROUP_NUM=2, 
MAX_DATA_REGION_GROUP_NUM=3;",
         "create database root.sg2",
         "count databases",
         "count,",
diff --git 
a/integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBDatabaseIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBDatabaseIT.java
index 58834cb5d79..dac15d8b66b 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBDatabaseIT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBDatabaseIT.java
@@ -27,6 +27,7 @@ import org.apache.iotdb.it.framework.IoTDBTestRunner;
 import org.apache.iotdb.itbase.category.TableClusterIT;
 import org.apache.iotdb.itbase.category.TableLocalStandaloneIT;
 import org.apache.iotdb.itbase.env.BaseEnv;
+import org.apache.iotdb.jdbc.IoTDBSQLException;
 
 import org.junit.After;
 import org.junit.Assert;
@@ -203,8 +204,7 @@ public class IoTDBDatabaseIT {
       statement.execute("drop database IF EXISTS test");
 
       // Test create database with properties
-      statement.execute(
-          "create database test_prop with (ttl=300, 
schema_region_group_num=DEFAULT, time_partition_interval=100000)");
+      statement.execute("create database test_prop with (ttl=300, 
time_partition_interval=100000)");
       databaseNames = new String[] {"test_prop"};
       TTLs = new String[] {"300"};
       timePartitionInterval = new int[] {100000};
@@ -811,8 +811,11 @@ public class IoTDBDatabaseIT {
     try (final Connection connection = EnvFactory.getEnv().getConnection();
         final Statement statement = connection.createStatement()) {
       statement.execute("create database root.test");
-      statement.execute(
-          "alter database root.test WITH SCHEMA_REGION_GROUP_NUM=2, 
DATA_REGION_GROUP_NUM=3");
+      Assert.assertThrows(
+          IoTDBSQLException.class,
+          () ->
+              statement.execute(
+                  "alter database root.test WITH 
MAX_SCHEMA_REGION_GROUP_NUM=2, MAX_DATA_REGION_GROUP_NUM=3"));
       statement.execute("insert into root.test.d1 (s1) values(1)");
       statement.execute("drop database root.test");
     }
@@ -882,6 +885,34 @@ public class IoTDBDatabaseIT {
     }
   }
 
+  @Test
+  public void testMaxRegionGroupNumRejectedInAutoPolicy() throws SQLException {
+    try (final Connection connection =
+            EnvFactory.getEnv().getConnection(BaseEnv.TABLE_SQL_DIALECT);
+        final Statement statement = connection.createStatement()) {
+      try {
+        statement.execute("create database test_max 
with(max_data_region_group_num=4)");
+        fail("max_data_region_group_num should be rejected under AUTO policy");
+      } catch (final SQLException e) {
+        assertTrue(
+            e.getMessage()
+                .contains(
+                    "max_data_region_group_num can only be set when 
data_region_group_extension_policy is CUSTOM"));
+      }
+
+      statement.execute("create database test_max");
+      try {
+        statement.execute("alter database test_max set properties 
max_data_region_group_num=4");
+        fail("max_data_region_group_num should be rejected under AUTO policy");
+      } catch (final SQLException e) {
+        assertTrue(
+            e.getMessage()
+                .contains(
+                    "max_data_region_group_num can only be set when 
data_region_group_extension_policy is CUSTOM"));
+      }
+    }
+  }
+
   @Test
   public void testDBAuth() throws SQLException {
     try (final Connection adminCon = 
EnvFactory.getEnv().getConnection(BaseEnv.TABLE_SQL_DIALECT);
diff --git 
a/integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBDatabaseMaxRegionGroupNumIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBDatabaseMaxRegionGroupNumIT.java
new file mode 100644
index 00000000000..90966f6406e
--- /dev/null
+++ 
b/integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBDatabaseMaxRegionGroupNumIT.java
@@ -0,0 +1,229 @@
+/*
+ * 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.
+ */
+
+package org.apache.iotdb.relational.it.schema;
+
+import org.apache.iotdb.commons.partition.executor.hash.BKDRHashExecutor;
+import org.apache.iotdb.db.it.utils.TestUtils;
+import org.apache.iotdb.it.env.EnvFactory;
+import org.apache.iotdb.it.framework.IoTDBTestRunner;
+import org.apache.iotdb.itbase.category.TableClusterIT;
+import org.apache.iotdb.itbase.category.TableLocalStandaloneIT;
+import org.apache.iotdb.itbase.env.BaseEnv;
+
+import org.apache.tsfile.file.metadata.IDeviceID;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.junit.runner.RunWith;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+@RunWith(IoTDBTestRunner.class)
+@Category({TableLocalStandaloneIT.class, TableClusterIT.class})
+public class IoTDBDatabaseMaxRegionGroupNumIT {
+
+  private static final int SERIES_SLOT_NUM = 8;
+  private static final int DEFAULT_SCHEMA_REGION_GROUP_NUM = 1;
+  private static final int DEFAULT_DATA_REGION_GROUP_NUM = 2;
+  private static final int MAX_SCHEMA_REGION_GROUP_NUM = 3;
+  private static final int MAX_DATA_REGION_GROUP_NUM = 4;
+  private static final String TABLE_NAME = "table1";
+  private static final BKDRHashExecutor PARTITION_EXECUTOR = new 
BKDRHashExecutor(SERIES_SLOT_NUM);
+
+  @Before
+  public void setUp() throws Exception {
+    EnvFactory.getEnv()
+        .getConfig()
+        .getCommonConfig()
+        .setSchemaRegionGroupExtensionPolicy("CUSTOM")
+        .setDataRegionGroupExtensionPolicy("CUSTOM")
+        
.setDefaultSchemaRegionGroupNumPerDatabase(DEFAULT_SCHEMA_REGION_GROUP_NUM)
+        .setDefaultDataRegionGroupNumPerDatabase(DEFAULT_DATA_REGION_GROUP_NUM)
+        .setSeriesSlotNum(SERIES_SLOT_NUM)
+        .setSeriesPartitionExecutorClass(BKDRHashExecutor.class.getName())
+        .setTimePartitionInterval(10);
+    EnvFactory.getEnv().initClusterEnvironment();
+  }
+
+  @After
+  public void tearDown() throws Exception {
+    EnvFactory.getEnv().cleanClusterEnvironment();
+  }
+
+  @Test
+  public void testCreateAndAlterMaxRegionGroupNum() throws SQLException {
+    try (final Connection connection =
+            EnvFactory.getEnv().getConnection(BaseEnv.TABLE_SQL_DIALECT);
+        final Statement statement = connection.createStatement()) {
+      statement.execute(
+          "create database test_create with(max_schema_region_group_num=3, 
max_data_region_group_num=4)");
+      TestUtils.assertResultSetEqual(
+          statement.executeQuery(
+              "select database, max_schema_region_group_num, 
max_data_region_group_num "
+                  + "from information_schema.databases where database = 
'test_create'"),
+          "database,max_schema_region_group_num,max_data_region_group_num,",
+          Collections.singleton("test_create,3,4,"));
+
+      statement.execute("create database test_alter");
+      statement.execute(
+          "alter database test_alter set properties 
max_schema_region_group_num=3, max_data_region_group_num=4");
+      try (final ResultSet resultSet = statement.executeQuery("show databases 
details")) {
+        boolean found = false;
+        while (resultSet.next()) {
+          if (!"test_alter".equals(resultSet.getString("Database"))) {
+            continue;
+          }
+          found = true;
+          org.junit.Assert.assertEquals(3, 
resultSet.getInt("MaxSchemaRegionGroupNum"));
+          org.junit.Assert.assertEquals(4, 
resultSet.getInt("MaxDataRegionGroupNum"));
+        }
+        org.junit.Assert.assertTrue(found);
+      }
+
+      Assert.assertThrows(
+          SQLException.class,
+          () ->
+              statement.execute(
+                  "create database test_deprecated 
with(schema_region_group_num=4, data_region_group_num=5)"));
+    }
+  }
+
+  @Test
+  public void testAllocatedRegionGroupNumEqualsQuotaAfterAlterAndWrite() 
throws SQLException {
+    try (final Connection connection =
+            EnvFactory.getEnv().getConnection(BaseEnv.TABLE_SQL_DIALECT);
+        final Statement statement = connection.createStatement()) {
+      statement.execute("create database test_partition");
+      statement.execute("use test_partition");
+      statement.execute("create table " + TABLE_NAME + "(device string tag, s1 
int32 field)");
+
+      final Set<Integer> usedSeriesSlots = new HashSet<>();
+      final String firstDevice = getDeviceInNewSeriesSlot(usedSeriesSlots);
+      final String secondDevice = getDeviceInNewSeriesSlot(usedSeriesSlots);
+
+      insertData(statement, firstDevice, 0, 0);
+      assertRegionGroupNum(
+          statement,
+          "test_partition",
+          DEFAULT_SCHEMA_REGION_GROUP_NUM,
+          DEFAULT_SCHEMA_REGION_GROUP_NUM,
+          DEFAULT_DATA_REGION_GROUP_NUM,
+          DEFAULT_DATA_REGION_GROUP_NUM);
+
+      statement.execute(
+          "alter database test_partition set properties 
max_schema_region_group_num="
+              + MAX_SCHEMA_REGION_GROUP_NUM);
+      insertData(statement, secondDevice, 0, 1);
+      assertAllocatedRegionGroupNumEqualsQuota(
+          statement, "test_partition", MAX_SCHEMA_REGION_GROUP_NUM, 
DEFAULT_DATA_REGION_GROUP_NUM);
+
+      statement.execute(
+          "alter database test_partition set properties 
max_data_region_group_num="
+              + MAX_DATA_REGION_GROUP_NUM);
+      insertData(statement, secondDevice, 20, 2);
+      assertAllocatedRegionGroupNumEqualsQuota(
+          statement, "test_partition", MAX_SCHEMA_REGION_GROUP_NUM, 
MAX_DATA_REGION_GROUP_NUM);
+
+      TestUtils.assertResultSetEqual(
+          statement.executeQuery("select count(*) from " + TABLE_NAME),
+          "_col0,",
+          Collections.singleton("3,"));
+    }
+  }
+
+  private static void insertData(
+      final Statement statement, final String device, final int time, final 
int value)
+      throws SQLException {
+    statement.execute(
+        "insert into "
+            + TABLE_NAME
+            + "(time, device, s1) values("
+            + time
+            + ", '"
+            + device
+            + "', "
+            + value
+            + ")");
+  }
+
+  private static String getDeviceInNewSeriesSlot(final Set<Integer> 
usedSeriesSlots) {
+    for (int i = 0; i < 1_000; i++) {
+      final String device = "d" + i;
+      if (usedSeriesSlots.add(getSeriesSlot(device))) {
+        return device;
+      }
+    }
+    throw new AssertionError("Failed to find a device in a new series 
partition slot");
+  }
+
+  private static int getSeriesSlot(final String device) {
+    return PARTITION_EXECUTOR
+        .getSeriesPartitionSlot(
+            IDeviceID.Factory.DEFAULT_FACTORY.create(new String[] {TABLE_NAME, 
device}))
+        .getSlotId();
+  }
+
+  private static void assertAllocatedRegionGroupNumEqualsQuota(
+      final Statement statement,
+      final String database,
+      final int schemaRegionGroupQuota,
+      final int dataRegionGroupQuota)
+      throws SQLException {
+    assertRegionGroupNum(
+        statement,
+        database,
+        schemaRegionGroupQuota,
+        schemaRegionGroupQuota,
+        dataRegionGroupQuota,
+        dataRegionGroupQuota);
+  }
+
+  private static void assertRegionGroupNum(
+      final Statement statement,
+      final String database,
+      final int schemaRegionGroupNum,
+      final int maxSchemaRegionGroupNum,
+      final int dataRegionGroupNum,
+      final int maxDataRegionGroupNum)
+      throws SQLException {
+    try (final ResultSet resultSet =
+        statement.executeQuery(
+            "select schema_region_group_num, max_schema_region_group_num, "
+                + "data_region_group_num, max_data_region_group_num "
+                + "from information_schema.databases where database = '"
+                + database
+                + "'")) {
+      Assert.assertTrue(resultSet.next());
+      Assert.assertEquals(schemaRegionGroupNum, 
resultSet.getInt("schema_region_group_num"));
+      Assert.assertEquals(maxSchemaRegionGroupNum, 
resultSet.getInt("max_schema_region_group_num"));
+      Assert.assertEquals(dataRegionGroupNum, 
resultSet.getInt("data_region_group_num"));
+      Assert.assertEquals(maxDataRegionGroupNum, 
resultSet.getInt("max_data_region_group_num"));
+      Assert.assertFalse(resultSet.next());
+    }
+  }
+}
diff --git 
a/integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBDatabaseMixedRegionGroupPolicyIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBDatabaseMixedRegionGroupPolicyIT.java
new file mode 100644
index 00000000000..83e2137de3c
--- /dev/null
+++ 
b/integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBDatabaseMixedRegionGroupPolicyIT.java
@@ -0,0 +1,83 @@
+/*
+ * 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.
+ */
+
+package org.apache.iotdb.relational.it.schema;
+
+import org.apache.iotdb.db.it.utils.TestUtils;
+import org.apache.iotdb.it.env.EnvFactory;
+import org.apache.iotdb.it.framework.IoTDBTestRunner;
+import org.apache.iotdb.itbase.category.TableClusterIT;
+import org.apache.iotdb.itbase.category.TableLocalStandaloneIT;
+import org.apache.iotdb.itbase.env.BaseEnv;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.junit.runner.RunWith;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.Collections;
+
+@RunWith(IoTDBTestRunner.class)
+@Category({TableLocalStandaloneIT.class, TableClusterIT.class})
+public class IoTDBDatabaseMixedRegionGroupPolicyIT {
+
+  private static final int DATA_REGION_PER_DATA_NODE = 4;
+
+  @Before
+  public void setUp() throws Exception {
+    EnvFactory.getEnv()
+        .getConfig()
+        .getCommonConfig()
+        .setSchemaRegionGroupExtensionPolicy("CUSTOM")
+        .setDataRegionGroupExtensionPolicy("AUTO")
+        .setDefaultSchemaRegionGroupNumPerDatabase(1)
+        .setDefaultDataRegionGroupNumPerDatabase(1)
+        .setDataReplicationFactor(1)
+        .setDataRegionPerDataNode(DATA_REGION_PER_DATA_NODE);
+    EnvFactory.getEnv().initClusterEnvironment();
+  }
+
+  @After
+  public void tearDown() throws Exception {
+    EnvFactory.getEnv().cleanClusterEnvironment();
+  }
+
+  @Test
+  public void testAutoPolicyStillAdjustsWhenTheOtherPolicyIsCustom() throws 
SQLException {
+    try (final Connection connection =
+            EnvFactory.getEnv().getConnection(BaseEnv.TABLE_SQL_DIALECT);
+        final Statement statement = connection.createStatement()) {
+      final int expectedMaxDataRegionGroupNum =
+          DATA_REGION_PER_DATA_NODE * 
EnvFactory.getEnv().getDataNodeWrapperList().size();
+
+      statement.execute("create database test_mixed 
with(max_schema_region_group_num=2)");
+
+      TestUtils.assertResultSetEqual(
+          statement.executeQuery(
+              "select database, max_schema_region_group_num, 
max_data_region_group_num "
+                  + "from information_schema.databases where database = 
'test_mixed'"),
+          "database,max_schema_region_group_num,max_data_region_group_num,",
+          Collections.singleton("test_mixed,2," + 
expectedMaxDataRegionGroupNum + ","));
+    }
+  }
+}
diff --git 
a/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IdentifierParser.g4
 
b/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IdentifierParser.g4
index 54d53bab674..e96d84e892c 100644
--- 
a/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IdentifierParser.g4
+++ 
b/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IdentifierParser.g4
@@ -82,7 +82,7 @@ keyWords
     | CURRENT_USER
     | DATA
     | DATA_REPLICATION_FACTOR
-    | DATA_REGION_GROUP_NUM
+    | MAX_DATA_REGION_GROUP_NUM
     | DATABASE
     | DATABASES
     | DATANODE
@@ -215,7 +215,7 @@ keyWords
     | RUNNING
     | SCHEMA
     | SCHEMA_REPLICATION_FACTOR
-    | SCHEMA_REGION_GROUP_NUM
+    | MAX_SCHEMA_REGION_GROUP_NUM
     | SECURITY
     | SELECT
     | SERIESSLOTID
diff --git 
a/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4 
b/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4
index 3ac375b7f15..2f91b573aef 100644
--- 
a/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4
+++ 
b/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4
@@ -121,8 +121,8 @@ databaseAttributeClause
 databaseAttributeKey
     : TTL
     | TIME_PARTITION_INTERVAL
-    | SCHEMA_REGION_GROUP_NUM
-    | DATA_REGION_GROUP_NUM
+    | MAX_SCHEMA_REGION_GROUP_NUM
+    | MAX_DATA_REGION_GROUP_NUM
     ;
 
 // ---- Drop Database
diff --git 
a/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlLexer.g4 
b/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlLexer.g4
index 59bac72fc78..3950de50ea4 100644
--- a/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlLexer.g4
+++ b/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlLexer.g4
@@ -1227,12 +1227,12 @@ TIME_PARTITION_INTERVAL
     : T I M E '_' P A R T I T I O N '_' I N T E R V A L
     ;
 
-SCHEMA_REGION_GROUP_NUM
-    : S C H E M A '_' R E G I O N '_' G R O U P '_' N U M
+MAX_SCHEMA_REGION_GROUP_NUM
+    : M A X '_' S C H E M A '_' R E G I O N '_' G R O U P '_' N U M
     ;
 
-DATA_REGION_GROUP_NUM
-    : D A T A '_' R E G I O N '_' G R O U P '_' N U M
+MAX_DATA_REGION_GROUP_NUM
+    : M A X '_' D A T A '_' R E G I O N '_' G R O U P '_' N U M
     ;
 
 CURRENT_TIMESTAMP
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/partition/PartitionManager.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/partition/PartitionManager.java
index 24b2c5d946c..0edb0e389dc 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/partition/PartitionManager.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/partition/PartitionManager.java
@@ -621,14 +621,14 @@ public class PartitionManager {
 
     for (final Map.Entry<String, Integer> entry : 
unassignedPartitionSlotsCountMap.entrySet()) {
       final String database = entry.getKey();
-      final int minRegionGroupNum =
-          getClusterSchemaManager().getMinRegionGroupNum(database, 
consensusGroupType);
+      final int maxRegionGroupNum =
+          getClusterSchemaManager().getMaxRegionGroupNum(database, 
consensusGroupType);
       final int allocatedRegionGroupCount =
           partitionInfo.getRegionGroupCount(database, consensusGroupType);
 
-      // Extend RegionGroups until allocatedRegionGroupCount == 
minRegionGroupNum
-      if (allocatedRegionGroupCount < minRegionGroupNum) {
-        allotmentMap.put(database, minRegionGroupNum - 
allocatedRegionGroupCount);
+      // Extend RegionGroups until allocatedRegionGroupCount == 
maxRegionGroupNum
+      if (allocatedRegionGroupCount < maxRegionGroupNum) {
+        allotmentMap.put(database, maxRegionGroupNum - 
allocatedRegionGroupCount);
       }
     }
 
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/schema/ClusterSchemaManager.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/schema/ClusterSchemaManager.java
index 1c7ce1e74db..6b0c82ff1f0 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/schema/ClusterSchemaManager.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/schema/ClusterSchemaManager.java
@@ -95,6 +95,7 @@ import 
org.apache.iotdb.confignode.manager.consensus.ConsensusManager;
 import org.apache.iotdb.confignode.manager.node.NodeManager;
 import org.apache.iotdb.confignode.manager.partition.PartitionManager;
 import org.apache.iotdb.confignode.manager.partition.PartitionMetrics;
+import 
org.apache.iotdb.confignode.manager.partition.RegionGroupExtensionPolicy;
 import org.apache.iotdb.confignode.persistence.schema.ClusterSchemaInfo;
 import org.apache.iotdb.confignode.rpc.thrift.TDatabaseInfo;
 import org.apache.iotdb.confignode.rpc.thrift.TDatabaseSchema;
@@ -236,31 +237,23 @@ public class ClusterSchemaManager {
       return result;
     }
 
-    if (databaseSchema.isSetMinSchemaRegionGroupNum()) {
-      // Validate alter SchemaRegionGroupNum
-      final int minSchemaRegionGroupNum =
-          getMinRegionGroupNum(databaseSchema.getName(), 
TConsensusGroupType.SchemaRegion);
-      if (databaseSchema.getMinSchemaRegionGroupNum() <= 
minSchemaRegionGroupNum) {
-        result = new 
TSStatus(TSStatusCode.DATABASE_CONFIG_ERROR.getStatusCode());
-        result.setMessage(
-            String.format(
-                "Failed to alter database. The SchemaRegionGroupNum could only 
be increased. "
-                    + "Current SchemaRegionGroupNum: %d, Alter 
SchemaRegionGroupNum: %d",
-                minSchemaRegionGroupNum, 
databaseSchema.getMinSchemaRegionGroupNum()));
+    if (databaseSchema.isSetMaxSchemaRegionGroupNum()) {
+      result =
+          validateMaxRegionGroupNumOnAlter(
+              databaseSchema.getName(),
+              TConsensusGroupType.SchemaRegion,
+              databaseSchema.getMaxSchemaRegionGroupNum());
+      if (result.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
         return result;
       }
     }
-    if (databaseSchema.isSetMinDataRegionGroupNum()) {
-      // Validate alter DataRegionGroupNum
-      final int minDataRegionGroupNum =
-          getMinRegionGroupNum(databaseSchema.getName(), 
TConsensusGroupType.DataRegion);
-      if (databaseSchema.getMinDataRegionGroupNum() <= minDataRegionGroupNum) {
-        result = new 
TSStatus(TSStatusCode.DATABASE_CONFIG_ERROR.getStatusCode());
-        result.setMessage(
-            String.format(
-                "Failed to alter database. The DataRegionGroupNum could only 
be increased. "
-                    + "Current DataRegionGroupNum: %d, Alter 
DataRegionGroupNum: %d",
-                minDataRegionGroupNum, 
databaseSchema.getMinDataRegionGroupNum()));
+    if (databaseSchema.isSetMaxDataRegionGroupNum()) {
+      result =
+          validateMaxRegionGroupNumOnAlter(
+              databaseSchema.getName(),
+              TConsensusGroupType.DataRegion,
+              databaseSchema.getMaxDataRegionGroupNum());
+      if (result.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
         return result;
       }
     }
@@ -473,6 +466,14 @@ public class ClusterSchemaManager {
    * each Database based on existing cluster resources
    */
   public synchronized void adjustMaxRegionGroupNum() {
+    final boolean isAdjustSchemaRegionGroupNum =
+        
!CONF.getSchemaRegionGroupExtensionPolicy().equals(RegionGroupExtensionPolicy.CUSTOM);
+    final boolean isAdjustDataRegionGroupNum =
+        
!CONF.getDataRegionGroupExtensionPolicy().equals(RegionGroupExtensionPolicy.CUSTOM);
+    if (!isAdjustSchemaRegionGroupNum && !isAdjustDataRegionGroupNum) {
+      return;
+    }
+
     // Get all DatabaseSchemas
     final Map<String, TDatabaseSchema> databaseSchemaMap =
         getMatchedDatabaseSchemasByName(getDatabaseNames(null), null);
@@ -505,60 +506,38 @@ public class ClusterSchemaManager {
         continue;
       }
 
-      // Adjust maxSchemaRegionGroupNum for each Database.
-      // All Databases share the DataNodes equally.
-      // The allocated SchemaRegionGroups will not be shrunk.
-      final int allocatedSchemaRegionGroupCount;
-      try {
-        allocatedSchemaRegionGroupCount =
-            getPartitionManager()
-                .getRegionGroupCount(databaseSchema.getName(), 
TConsensusGroupType.SchemaRegion);
-      } catch (final DatabaseNotExistsException e) {
-        // ignore the pre deleted database
-        continue;
+      int maxSchemaRegionGroupNum = 
databaseSchema.getMaxSchemaRegionGroupNum();
+      if (isAdjustSchemaRegionGroupNum) {
+        try {
+          maxSchemaRegionGroupNum =
+              adjustRegionGroupNum(
+                  TConsensusGroupType.SchemaRegion,
+                  databaseSchema,
+                  dataNodeNum,
+                  databaseNum,
+                  totalCpuCoreNum);
+        } catch (final DatabaseNotExistsException e) {
+          // ignore the pre deleted database
+          continue;
+        }
       }
 
-      final int maxSchemaRegionGroupNum =
-          calcMaxRegionGroupNum(
-              databaseSchema.getMinSchemaRegionGroupNum(),
-              CONF.getSchemaRegionPerDataNode(),
-              dataNodeNum,
-              databaseNum,
-              databaseSchema.getSchemaReplicationFactor(),
-              allocatedSchemaRegionGroupCount);
-      LOGGER.info(
-          
ConfigNodeMessages.ADJUSTREGIONGROUPNUM_THE_MAXIMUM_NUMBER_OF_SCHEMAREGIONGROUPS_FOR,
-          databaseSchema.getName(),
-          maxSchemaRegionGroupNum);
-
-      // Adjust maxDataRegionGroupNum for each Database.
-      // All Databases share the DataNodes equally.
-      // The allocated DataRegionGroups will not be shrunk.
-      final int allocatedDataRegionGroupCount;
-      try {
-        allocatedDataRegionGroupCount =
-            getPartitionManager()
-                .getRegionGroupCount(databaseSchema.getName(), 
TConsensusGroupType.DataRegion);
-      } catch (final DatabaseNotExistsException e) {
-        // ignore the pre deleted database
-        continue;
+      int maxDataRegionGroupNum = databaseSchema.getMaxDataRegionGroupNum();
+      if (isAdjustDataRegionGroupNum) {
+        try {
+          maxDataRegionGroupNum =
+              adjustRegionGroupNum(
+                  TConsensusGroupType.DataRegion,
+                  databaseSchema,
+                  dataNodeNum,
+                  databaseNum,
+                  totalCpuCoreNum);
+        } catch (final DatabaseNotExistsException e) {
+          // ignore the pre deleted database
+          continue;
+        }
       }
 
-      final int maxDataRegionGroupNum =
-          calcMaxRegionGroupNum(
-              databaseSchema.getMinDataRegionGroupNum(),
-              CONF.getDataRegionPerDataNode() == 0
-                  ? CONF.getDataRegionPerDataNodeProportion()
-                  : CONF.getDataRegionPerDataNode(),
-              CONF.getDataRegionPerDataNode() == 0 ? totalCpuCoreNum : 
dataNodeNum,
-              databaseNum,
-              databaseSchema.getDataReplicationFactor(),
-              allocatedDataRegionGroupCount);
-      LOGGER.info(
-          
ConfigNodeMessages.ADJUSTREGIONGROUPNUM_THE_MAXIMUM_NUMBER_OF_DATAREGIONGROUPS_FOR,
-          databaseSchema.getName(),
-          maxDataRegionGroupNum);
-
       adjustMaxRegionGroupNumPlan.putEntry(
           databaseSchema.getName(), new Pair<>(maxSchemaRegionGroupNum, 
maxDataRegionGroupNum));
     }
@@ -591,6 +570,48 @@ public class ClusterSchemaManager {
             allocatedRegionGroupCount));
   }
 
+  /**
+   * Adjust the max quota of schema or data region group. The specific 
implementations are as
+   * follows: 1.Adjust maxSchemaGroupNum or maxDataRegionGroupNum for each 
Database. 2.All Databases
+   * share the DataNodes equally. 3.The allocated SchemaGroups or 
DataRegionGroups will not be
+   * shrunk.
+   */
+  public int adjustRegionGroupNum(
+      TConsensusGroupType consensusGroupType,
+      TDatabaseSchema databaseSchema,
+      int dataNodeNum,
+      int databaseNum,
+      int totalCpuCoreNum)
+      throws DatabaseNotExistsException {
+    final int allocatedRegionGroupCount =
+        getPartitionManager().getRegionGroupCount(databaseSchema.getName(), 
consensusGroupType);
+
+    int maxRegionGroupNum =
+        calcMaxRegionGroupNum(
+            (consensusGroupType == TConsensusGroupType.SchemaRegion)
+                ? databaseSchema.getMinSchemaRegionGroupNum()
+                : databaseSchema.getMinDataRegionGroupNum(),
+            (consensusGroupType == TConsensusGroupType.SchemaRegion)
+                ? CONF.getSchemaRegionPerDataNode()
+                : (CONF.getDataRegionPerDataNode() == 0
+                    ? CONF.getDataRegionPerDataNodeProportion()
+                    : CONF.getDataRegionPerDataNode()),
+            (consensusGroupType == TConsensusGroupType.SchemaRegion)
+                ? dataNodeNum
+                : (CONF.getDataRegionPerDataNode() == 0 ? totalCpuCoreNum : 
dataNodeNum),
+            databaseNum,
+            databaseSchema.getSchemaReplicationFactor(),
+            allocatedRegionGroupCount);
+    LOGGER.info(
+        (consensusGroupType == TConsensusGroupType.SchemaRegion)
+            ? 
ConfigNodeMessages.ADJUSTREGIONGROUPNUM_THE_MAXIMUM_NUMBER_OF_SCHEMAREGIONGROUPS_FOR
+            : 
ConfigNodeMessages.ADJUSTREGIONGROUPNUM_THE_MAXIMUM_NUMBER_OF_DATAREGIONGROUPS_FOR,
+        databaseSchema.getName(),
+        maxRegionGroupNum);
+
+    return maxRegionGroupNum;
+  }
+
   // ======================================================
   // Leader scheduling interfaces
   // ======================================================
@@ -906,14 +927,112 @@ public class ClusterSchemaManager {
                       
.FAILED_TO_CREATE_DATABASE_THE_DATAREGIONGROUPNUM_SHOULD_BE_POSITIVE);
     }
 
+    if (databaseSchema.isSetMaxSchemaRegionGroupNum()) {
+      errorResp =
+          validateMaxRegionGroupNumOnCreation(databaseSchema, 
TConsensusGroupType.SchemaRegion);
+    }
+    if (databaseSchema.isSetMaxDataRegionGroupNum()) {
+      errorResp =
+          validateMaxRegionGroupNumOnCreation(databaseSchema, 
TConsensusGroupType.DataRegion);
+    }
+
     if (errorResp != null) {
       LOGGER.warn(ConfigNodeMessages.EXECUTE_SETDATABASE_WITH_RESULT, 
databaseSchema, errorResp);
       return errorResp;
     }
 
-    // The maxRegionGroupNum is equal to the minRegionGroupNum when initialize
-    
databaseSchema.setMaxSchemaRegionGroupNum(databaseSchema.getMinSchemaRegionGroupNum());
-    
databaseSchema.setMaxDataRegionGroupNum(databaseSchema.getMinDataRegionGroupNum());
+    if (!databaseSchema.isSetMaxSchemaRegionGroupNum()) {
+      
databaseSchema.setMaxSchemaRegionGroupNum(databaseSchema.getMinSchemaRegionGroupNum());
+    }
+    if (!databaseSchema.isSetMaxDataRegionGroupNum()) {
+      
databaseSchema.setMaxDataRegionGroupNum(databaseSchema.getMinDataRegionGroupNum());
+    }
+
+    return StatusUtils.OK;
+  }
+
+  private static TSStatus validateMaxRegionGroupNumOnCreation(
+      final TDatabaseSchema databaseSchema, final TConsensusGroupType 
consensusGroupType) {
+    return validateMaxRegionGroupNum(
+        consensusGroupType,
+        TConsensusGroupType.SchemaRegion.equals(consensusGroupType)
+            ? databaseSchema.getMaxSchemaRegionGroupNum()
+            : databaseSchema.getMaxDataRegionGroupNum(),
+        true);
+  }
+
+  private static TSStatus validateMaxRegionGroupNum(
+      final TConsensusGroupType consensusGroupType,
+      final int maxRegionGroupNum,
+      final boolean isCreate) {
+    final boolean isSchemaRegion = 
TConsensusGroupType.SchemaRegion.equals(consensusGroupType);
+    final RegionGroupExtensionPolicy policy =
+        isSchemaRegion
+            ? CONF.getSchemaRegionGroupExtensionPolicy()
+            : CONF.getDataRegionGroupExtensionPolicy();
+    final String configKey =
+        isSchemaRegion ? "max_schema_region_group_num" : 
"max_data_region_group_num";
+    final String fieldName = isSchemaRegion ? "MaxSchemaRegionGroupNum" : 
"MaxDataRegionGroupNum";
+
+    if (!policy.equals(RegionGroupExtensionPolicy.CUSTOM)) {
+      return new TSStatus(TSStatusCode.DATABASE_CONFIG_ERROR.getStatusCode())
+          .setMessage(
+              String.format(
+                  "Failed to %s database. The %s can only be set when 
%s_region_group_extension_policy is CUSTOM.",
+                  isCreate ? "create" : "alter", configKey, isSchemaRegion ? 
"schema" : "data"));
+    }
+
+    final int defaultRegionGroupNum =
+        isSchemaRegion
+            ? CONF.getDefaultSchemaRegionGroupNumPerDatabase()
+            : CONF.getDefaultDataRegionGroupNumPerDatabase();
+    if (maxRegionGroupNum < defaultRegionGroupNum) {
+      return new TSStatus(TSStatusCode.DATABASE_CONFIG_ERROR.getStatusCode())
+          .setMessage(
+              String.format(
+                  "%s should be greater than or equal to default 
%sRegionGroupNum: %d.",
+                  fieldName, isSchemaRegion ? "Schema" : "Data", 
defaultRegionGroupNum));
+    }
+
+    return StatusUtils.OK;
+  }
+
+  private TSStatus validateMaxRegionGroupNumOnAlter(
+      final String database,
+      final TConsensusGroupType consensusGroupType,
+      final int maxRegionGroupNum) {
+    TSStatus status = validateMaxRegionGroupNum(consensusGroupType, 
maxRegionGroupNum, false);
+    if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
+      return status;
+    }
+
+    final boolean isSchemaRegion = 
TConsensusGroupType.SchemaRegion.equals(consensusGroupType);
+    final String fieldName = isSchemaRegion ? "MaxSchemaRegionGroupNum" : 
"MaxDataRegionGroupNum";
+
+    final int minRegionGroupNum = getMinRegionGroupNum(database, 
consensusGroupType);
+    if (maxRegionGroupNum < minRegionGroupNum) {
+      return new TSStatus(TSStatusCode.DATABASE_CONFIG_ERROR.getStatusCode())
+          .setMessage(
+              String.format(
+                  "%s should be greater than or equal to current min 
%sRegionGroupNum: %d.",
+                  fieldName, isSchemaRegion ? "Schema" : "Data", 
minRegionGroupNum));
+    }
+
+    final int allocatedRegionGroupCount;
+    try {
+      allocatedRegionGroupCount =
+          getPartitionManager().getRegionGroupCount(database, 
consensusGroupType);
+    } catch (final DatabaseNotExistsException e) {
+      return new TSStatus(TSStatusCode.DATABASE_NOT_EXIST.getStatusCode())
+          .setMessage(e.getMessage());
+    }
+    if (maxRegionGroupNum < allocatedRegionGroupCount) {
+      return new TSStatus(TSStatusCode.DATABASE_CONFIG_ERROR.getStatusCode())
+          .setMessage(
+              String.format(
+                  "%s should be greater than or equal to allocated 
%sRegionGroupNum: %d.",
+                  fieldName, isSchemaRegion ? "Schema" : "Data", 
allocatedRegionGroupCount));
+    }
 
     return StatusUtils.OK;
   }
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/ClusterSchemaInfo.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/ClusterSchemaInfo.java
index 47f2264505b..b4e2f349f01 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/ClusterSchemaInfo.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/ClusterSchemaInfo.java
@@ -237,31 +237,15 @@ public class ClusterSchemaInfo implements 
SnapshotProcessor {
           
mTree.getDatabaseNodeByDatabasePath(partialPathName).getAsMNode().getDatabaseSchema();
 
       // TODO: Support alter other fields
-      if (alterSchema.isSetMinSchemaRegionGroupNum()) {
-        
currentSchema.setMinSchemaRegionGroupNum(alterSchema.getMinSchemaRegionGroupNum());
-        currentSchema.setMaxSchemaRegionGroupNum(
-            Math.max(
-                currentSchema.getMinSchemaRegionGroupNum(),
-                currentSchema.getMaxSchemaRegionGroupNum()));
-        LOGGER.info(
-            
ConfigNodeMessages.ADJUSTREGIONGROUPNUM_THE_MINIMUM_NUMBER_OF_SCHEMAREGIONGROUPS_FOR,
-            currentSchema.getName(),
-            currentSchema.getMinSchemaRegionGroupNum());
+      if (alterSchema.isSetMaxSchemaRegionGroupNum()) {
+        
currentSchema.setMaxSchemaRegionGroupNum(alterSchema.getMaxSchemaRegionGroupNum());
         LOGGER.info(
             
ConfigNodeMessages.ADJUSTREGIONGROUPNUM_THE_MAXIMUM_NUMBER_OF_SCHEMAREGIONGROUPS_FOR,
             currentSchema.getName(),
             currentSchema.getMaxSchemaRegionGroupNum());
       }
-      if (alterSchema.isSetMinDataRegionGroupNum()) {
-        
currentSchema.setMinDataRegionGroupNum(alterSchema.getMinDataRegionGroupNum());
-        currentSchema.setMaxDataRegionGroupNum(
-            Math.max(
-                currentSchema.getMinDataRegionGroupNum(),
-                currentSchema.getMaxDataRegionGroupNum()));
-        LOGGER.info(
-            
ConfigNodeMessages.ADJUSTREGIONGROUPNUM_THE_MINIMUM_NUMBER_OF_DATAREGIONGROUPS_FOR,
-            currentSchema.getName(),
-            currentSchema.getMinDataRegionGroupNum());
+      if (alterSchema.isSetMaxDataRegionGroupNum()) {
+        
currentSchema.setMaxDataRegionGroupNum(alterSchema.getMaxDataRegionGroupNum());
         LOGGER.info(
             
ConfigNodeMessages.ADJUSTREGIONGROUPNUM_THE_MAXIMUM_NUMBER_OF_DATAREGIONGROUPS_FOR,
             currentSchema.getName(),
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TableConfigTaskVisitor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TableConfigTaskVisitor.java
index 4eff93bfc12..20f484e10d7 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TableConfigTaskVisitor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TableConfigTaskVisitor.java
@@ -285,8 +285,8 @@ import static 
org.apache.iotdb.commons.queryengine.plan.relational.type.TypeSign
 import static 
org.apache.iotdb.commons.schema.table.TsTable.TABLE_ALLOWED_PROPERTIES;
 import static org.apache.iotdb.commons.schema.table.TsTable.TIME_COLUMN_NAME;
 import static org.apache.iotdb.commons.schema.table.TsTable.TTL_PROPERTY;
-import static 
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.relational.CreateDBTask.DATA_REGION_GROUP_NUM_KEY;
-import static 
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.relational.CreateDBTask.SCHEMA_REGION_GROUP_NUM_KEY;
+import static 
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.relational.CreateDBTask.MAX_DATA_REGION_GROUP_NUM_KEY;
+import static 
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.relational.CreateDBTask.MAX_SCHEMA_REGION_GROUP_NUM_KEY;
 import static 
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.relational.CreateDBTask.TIME_PARTITION_INTERVAL_KEY;
 import static 
org.apache.iotdb.db.queryengine.plan.execution.config.metadata.relational.CreateDBTask.TTL_KEY;
 import static org.apache.tsfile.common.constant.TsFileConstant.PATH_SEPARATOR;
@@ -351,8 +351,8 @@ public class TableConfigTaskVisitor implements 
AstVisitor<IConfigTask, MPPQueryC
       if (property.isSetToDefault()) {
         switch (key) {
           case TIME_PARTITION_INTERVAL_KEY:
-          case SCHEMA_REGION_GROUP_NUM_KEY:
-          case DATA_REGION_GROUP_NUM_KEY:
+          case MAX_SCHEMA_REGION_GROUP_NUM_KEY:
+          case MAX_DATA_REGION_GROUP_NUM_KEY:
             break;
           case TTL_KEY:
             if (node.getType() == 
DatabaseSchemaStatement.DatabaseSchemaStatementType.ALTER) {
@@ -386,12 +386,13 @@ public class TableConfigTaskVisitor implements 
AstVisitor<IConfigTask, MPPQueryC
         case TIME_PARTITION_INTERVAL_KEY:
           schema.setTimePartitionInterval(parseLongFromLiteral(value, 
TIME_PARTITION_INTERVAL_KEY));
           break;
-        case SCHEMA_REGION_GROUP_NUM_KEY:
-          schema.setMinSchemaRegionGroupNum(
-              parseIntFromLiteral(value, SCHEMA_REGION_GROUP_NUM_KEY));
+        case MAX_SCHEMA_REGION_GROUP_NUM_KEY:
+          schema.setMaxSchemaRegionGroupNum(
+              parseIntFromLiteral(value, MAX_SCHEMA_REGION_GROUP_NUM_KEY));
           break;
-        case DATA_REGION_GROUP_NUM_KEY:
-          schema.setMinDataRegionGroupNum(parseIntFromLiteral(value, 
DATA_REGION_GROUP_NUM_KEY));
+        case MAX_DATA_REGION_GROUP_NUM_KEY:
+          schema.setMaxDataRegionGroupNum(
+              parseIntFromLiteral(value, MAX_DATA_REGION_GROUP_NUM_KEY));
           break;
         default:
           throw new SemanticException(
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/DatabaseSchemaTask.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/DatabaseSchemaTask.java
index ab9dee095aa..31c96887600 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/DatabaseSchemaTask.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/DatabaseSchemaTask.java
@@ -66,11 +66,12 @@ public class DatabaseSchemaTask implements IConfigTask {
     if (databaseSchemaStatement.getTimePartitionInterval() != null) {
       
databaseSchema.setTimePartitionInterval(databaseSchemaStatement.getTimePartitionInterval());
     }
-    if (databaseSchemaStatement.getSchemaRegionGroupNum() != null) {
-      
databaseSchema.setMinSchemaRegionGroupNum(databaseSchemaStatement.getSchemaRegionGroupNum());
+    if (databaseSchemaStatement.getMaxSchemaRegionGroupNum() != null) {
+      databaseSchema.setMaxSchemaRegionGroupNum(
+          databaseSchemaStatement.getMaxSchemaRegionGroupNum());
     }
-    if (databaseSchemaStatement.getDataRegionGroupNum() != null) {
-      
databaseSchema.setMinDataRegionGroupNum(databaseSchemaStatement.getDataRegionGroupNum());
+    if (databaseSchemaStatement.getMaxDataRegionGroupNum() != null) {
+      
databaseSchema.setMaxDataRegionGroupNum(databaseSchemaStatement.getMaxDataRegionGroupNum());
     }
     databaseSchema.setIsTableModel(false);
     return databaseSchema;
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/relational/AbstractDatabaseTask.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/relational/AbstractDatabaseTask.java
index df280c8759d..59b50536c15 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/relational/AbstractDatabaseTask.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/relational/AbstractDatabaseTask.java
@@ -27,8 +27,8 @@ public abstract class AbstractDatabaseTask implements 
IConfigTask {
   /////////////////////////////// Allowed properties 
///////////////////////////////
   public static final String TTL_KEY = "ttl";
   public static final String TIME_PARTITION_INTERVAL_KEY = 
"time_partition_interval";
-  public static final String SCHEMA_REGION_GROUP_NUM_KEY = 
"schema_region_group_num";
-  public static final String DATA_REGION_GROUP_NUM_KEY = 
"data_region_group_num";
+  public static final String MAX_SCHEMA_REGION_GROUP_NUM_KEY = 
"max_schema_region_group_num";
+  public static final String MAX_DATA_REGION_GROUP_NUM_KEY = 
"max_data_region_group_num";
 
   // Deprecated
   public static final String SCHEMA_REPLICATION_FACTOR_KEY = 
"schema_replication_factor";
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java
index 6ecf65c86bb..b9e2fe21c7a 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java
@@ -2998,12 +2998,12 @@ public class ASTVisitor extends 
IoTDBSqlParserBaseVisitor<Statement> {
       } else if (attributeKey.TIME_PARTITION_INTERVAL() != null) {
         final long timePartitionInterval = 
Long.parseLong(attribute.INTEGER_LITERAL().getText());
         
databaseSchemaStatement.setTimePartitionInterval(timePartitionInterval);
-      } else if (attributeKey.SCHEMA_REGION_GROUP_NUM() != null) {
-        final int schemaRegionGroupNum = 
Integer.parseInt(attribute.INTEGER_LITERAL().getText());
-        databaseSchemaStatement.setSchemaRegionGroupNum(schemaRegionGroupNum);
-      } else if (attributeKey.DATA_REGION_GROUP_NUM() != null) {
-        final int dataRegionGroupNum = 
Integer.parseInt(attribute.INTEGER_LITERAL().getText());
-        databaseSchemaStatement.setDataRegionGroupNum(dataRegionGroupNum);
+      } else if (attributeKey.MAX_SCHEMA_REGION_GROUP_NUM() != null) {
+        final int maxSchemaRegionGroupNum = 
Integer.parseInt(attribute.INTEGER_LITERAL().getText());
+        
databaseSchemaStatement.setMaxSchemaRegionGroupNum(maxSchemaRegionGroupNum);
+      } else if (attributeKey.MAX_DATA_REGION_GROUP_NUM() != null) {
+        final int maxDataRegionGroupNum = 
Integer.parseInt(attribute.INTEGER_LITERAL().getText());
+        
databaseSchemaStatement.setMaxDataRegionGroupNum(maxDataRegionGroupNum);
       }
     }
   }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/DatabaseSchemaStatement.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/DatabaseSchemaStatement.java
index 9fc9f2704f0..e27dde87b41 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/DatabaseSchemaStatement.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/DatabaseSchemaStatement.java
@@ -36,8 +36,8 @@ public class DatabaseSchemaStatement extends Statement 
implements IConfigStateme
   private PartialPath databasePath;
   private Long ttl = null;
   private Long timePartitionInterval = null;
-  private Integer schemaRegionGroupNum = null;
-  private Integer dataRegionGroupNum = null;
+  private Integer maxSchemaRegionGroupNum = null;
+  private Integer maxDataRegionGroupNum = null;
   private boolean enablePrintExceptionLog = true;
 
   // Deprecated
@@ -94,20 +94,20 @@ public class DatabaseSchemaStatement extends Statement 
implements IConfigStateme
     this.timePartitionInterval = timePartitionInterval;
   }
 
-  public Integer getSchemaRegionGroupNum() {
-    return schemaRegionGroupNum;
+  public Integer getMaxSchemaRegionGroupNum() {
+    return maxSchemaRegionGroupNum;
   }
 
-  public void setSchemaRegionGroupNum(final Integer schemaRegionGroupNum) {
-    this.schemaRegionGroupNum = schemaRegionGroupNum;
+  public void setMaxSchemaRegionGroupNum(final Integer 
maxSchemaRegionGroupNum) {
+    this.maxSchemaRegionGroupNum = maxSchemaRegionGroupNum;
   }
 
-  public Integer getDataRegionGroupNum() {
-    return dataRegionGroupNum;
+  public Integer getMaxDataRegionGroupNum() {
+    return maxDataRegionGroupNum;
   }
 
-  public void setDataRegionGroupNum(final Integer dataRegionGroupNum) {
-    this.dataRegionGroupNum = dataRegionGroupNum;
+  public void setMaxDataRegionGroupNum(final Integer maxDataRegionGroupNum) {
+    this.maxDataRegionGroupNum = maxDataRegionGroupNum;
   }
 
   public boolean getEnablePrintExceptionLog() {
@@ -141,8 +141,8 @@ public class DatabaseSchemaStatement extends Statement 
implements IConfigStateme
 
   @Override
   public String toString() {
-    return "SetStorageGroupStatement{"
-        + "storageGroupPath="
+    return "DatabaseSchemaStatement{"
+        + "databasePath="
         + databasePath
         + ", ttl="
         + ttl
@@ -152,10 +152,10 @@ public class DatabaseSchemaStatement extends Statement 
implements IConfigStateme
         + dataReplicationFactor
         + ", timePartitionInterval="
         + timePartitionInterval
-        + ", schemaRegionGroupNum="
-        + schemaRegionGroupNum
-        + ", dataRegionGroupNum="
-        + dataRegionGroupNum
+        + ", maxSchemaRegionGroupNum="
+        + maxSchemaRegionGroupNum
+        + ", maxDataRegionGroupNum="
+        + maxDataRegionGroupNum
         + '}';
   }
 
diff --git 
a/iotdb-core/metrics/interface/src/main/java/org/apache/iotdb/metrics/reporter/iotdb/IoTDBSessionReporter.java
 
b/iotdb-core/metrics/interface/src/main/java/org/apache/iotdb/metrics/reporter/iotdb/IoTDBSessionReporter.java
index 8e73776e537..4561fac09a9 100644
--- 
a/iotdb-core/metrics/interface/src/main/java/org/apache/iotdb/metrics/reporter/iotdb/IoTDBSessionReporter.java
+++ 
b/iotdb-core/metrics/interface/src/main/java/org/apache/iotdb/metrics/reporter/iotdb/IoTDBSessionReporter.java
@@ -84,9 +84,7 @@ public class IoTDBSessionReporter extends IoTDBReporter {
       if (!result.hasNext()) {
         try (SessionDataSetWrapper result2 =
             this.sessionPool.executeQueryStatement(
-                "CREATE DATABASE "
-                    + metricConfig.getInternalDatabase()
-                    + " WITH SCHEMA_REGION_GROUP_NUM=1, 
DATA_REGION_GROUP_NUM=1")) {
+                "CREATE DATABASE " + metricConfig.getInternalDatabase())) {
           if (!result2.hasNext()) {
             LOGGER.error(MetricsMessages.IOTDB_SESSION_REPORTER_DB_FAILED);
           }

Reply via email to