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 2b367b70b2212..21ada458d6392 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 @@ -19,6 +19,8 @@ package org.apache.iotdb.relational.it.schema; +import org.apache.iotdb.commons.schema.table.InformationSchema; +import org.apache.iotdb.commons.schema.table.column.TsTableColumnSchema; import org.apache.iotdb.db.it.utils.TestUtils; import org.apache.iotdb.it.env.EnvFactory; import org.apache.iotdb.it.framework.IoTDBTestRunner; @@ -41,12 +43,14 @@ import java.util.Arrays; import java.util.Collections; import java.util.HashSet; +import java.util.List; import java.util.Set; import static org.apache.iotdb.commons.schema.column.ColumnHeaderConstant.showDBColumnHeaders; import static org.apache.iotdb.commons.schema.column.ColumnHeaderConstant.showDBDetailsColumnHeaders; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; @@ -138,7 +142,10 @@ public void testManageDatabase() { } final int[] schemaRegionGroupNum = new int[] {0}; + // Default min region group numbers come from ConfigNodeConfig (schema = 1, data = 2). + final int[] minSchemaRegionGroupNum = new int[] {1}; final int[] dataRegionGroupNum = new int[] {0}; + final int[] minDataRegionGroupNum = new int[] {2}; // show try (final ResultSet resultSet = statement.executeQuery("SHOW DATABASES DETAILS")) { int cnt = 0; @@ -158,7 +165,11 @@ public void testManageDatabase() { assertEquals(dataReplicaFactors[cnt], resultSet.getInt(4)); assertEquals(timePartitionInterval[cnt], resultSet.getLong(5)); assertEquals(schemaRegionGroupNum[cnt], resultSet.getInt(6)); - assertEquals(dataRegionGroupNum[cnt], resultSet.getInt(7)); + assertEquals(minSchemaRegionGroupNum[cnt], resultSet.getInt(7)); + assertTrue(resultSet.getInt(8) >= minSchemaRegionGroupNum[cnt]); + assertEquals(dataRegionGroupNum[cnt], resultSet.getInt(9)); + assertEquals(minDataRegionGroupNum[cnt], resultSet.getInt(10)); + assertTrue(resultSet.getInt(11) >= minDataRegionGroupNum[cnt]); cnt++; } assertEquals(databaseNames.length, cnt); @@ -430,7 +441,11 @@ public void testInformationSchema() throws SQLException { "data_replication_factor,INT32,ATTRIBUTE,", "time_partition_interval,INT64,ATTRIBUTE,", "schema_region_group_num,INT32,ATTRIBUTE,", - "data_region_group_num,INT32,ATTRIBUTE,"))); + "min_schema_region_group_num,INT32,ATTRIBUTE,", + "max_schema_region_group_num,INT32,ATTRIBUTE,", + "data_region_group_num,INT32,ATTRIBUTE,", + "min_data_region_group_num,INT32,ATTRIBUTE,", + "max_data_region_group_num,INT32,ATTRIBUTE,"))); TestUtils.assertResultSetEqual( statement.executeQuery("desc tables"), "ColumnName,DataType,Category,", @@ -636,13 +651,38 @@ public void testInformationSchema() throws SQLException { statement.execute( "CREATE VIEW test.view_table (tag1 STRING TAG,tag2 STRING TAG,s11 INT32 FIELD,s3 INT32 FIELD FROM s2) RESTRICT WITH (ttl=100) AS root.\"a\".**"); - TestUtils.assertResultSetEqual( - statement.executeQuery("select * from databases"), - "database,ttl(ms),schema_replication_factor,data_replication_factor,time_partition_interval,schema_region_group_num,data_region_group_num,", - new HashSet<>( - Arrays.asList( - "information_schema,INF,null,null,null,null,null,", - "test,INF,1,1,604800000,0,0,"))); + try (final ResultSet resultSet = statement.executeQuery("select * from databases")) { + final ResultSetMetaData metaData = resultSet.getMetaData(); + final List expectedColumnSchemas = + InformationSchema.getSchemaTables().get(InformationSchema.DATABASES).getColumnList(); + assertEquals(expectedColumnSchemas.size(), metaData.getColumnCount()); + for (int i = 0; i < expectedColumnSchemas.size(); i++) { + assertEquals(expectedColumnSchemas.get(i).getColumnName(), metaData.getColumnName(i + 1)); + } + + int cnt = 0; + while (resultSet.next()) { + if ("information_schema".equals(resultSet.getString(1))) { + for (int columnIndex = 3; columnIndex <= 11; columnIndex++) { + assertNull(resultSet.getObject(columnIndex)); + } + } else { + assertEquals("test", resultSet.getString(1)); + assertEquals("INF", resultSet.getString(2)); + assertEquals(1, resultSet.getInt(3)); + assertEquals(1, resultSet.getInt(4)); + assertEquals(604800000, resultSet.getLong(5)); + assertEquals(0, resultSet.getInt(6)); + assertEquals(1, resultSet.getInt(7)); + assertTrue(resultSet.getInt(8) >= resultSet.getInt(7)); + assertEquals(0, resultSet.getInt(9)); + assertEquals(2, resultSet.getInt(10)); + assertTrue(resultSet.getInt(11) >= resultSet.getInt(10)); + } + cnt++; + } + assertEquals(2, cnt); + } TestUtils.assertResultSetEqual( statement.executeQuery("show devices from tables where status = 'USING'"), "database,table_name,ttl(ms),status,comment,table_type,", @@ -844,8 +884,9 @@ public void testDBAuth() throws SQLException { Collections.singleton("information_schema,INF,null,null,null,")); TestUtils.assertResultSetEqual( userStmt.executeQuery("select * from information_schema.databases"), - "database,ttl(ms),schema_replication_factor,data_replication_factor,time_partition_interval,schema_region_group_num,data_region_group_num,", - Collections.singleton("information_schema,INF,null,null,null,null,null,")); + "database,ttl(ms),schema_replication_factor,data_replication_factor,time_partition_interval,schema_region_group_num,min_schema_region_group_num,max_schema_region_group_num,data_region_group_num,min_data_region_group_num,max_data_region_group_num,", + Collections.singleton( + "information_schema,INF,null,null,null,null,null,null,null,null,null,")); } try (final Connection adminCon = EnvFactory.getEnv().getConnection(BaseEnv.TABLE_SQL_DIALECT); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/InformationSchemaContentSupplierFactory.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/InformationSchemaContentSupplierFactory.java index 0dbd86d600c05..6cbfed91971c2 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/InformationSchemaContentSupplierFactory.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/InformationSchemaContentSupplierFactory.java @@ -345,7 +345,11 @@ protected void constructLine() { columnBuilders[3].writeInt(currentDatabase.getDataReplicationFactor()); columnBuilders[4].writeLong(currentDatabase.getTimePartitionInterval()); columnBuilders[5].writeInt(currentDatabase.getSchemaRegionNum()); - columnBuilders[6].writeInt(currentDatabase.getDataRegionNum()); + columnBuilders[6].writeInt(currentDatabase.getMinSchemaRegionNum()); + columnBuilders[7].writeInt(currentDatabase.getMaxSchemaRegionNum()); + columnBuilders[8].writeInt(currentDatabase.getDataRegionNum()); + columnBuilders[9].writeInt(currentDatabase.getMinDataRegionNum()); + columnBuilders[10].writeInt(currentDatabase.getMaxDataRegionNum()); resultBuilder.declarePosition(); currentDatabase = null; } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/relational/ShowDBTask.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/relational/ShowDBTask.java index f5ab58d3ead4f..052f1dc02864f 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/relational/ShowDBTask.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/relational/ShowDBTask.java @@ -166,7 +166,11 @@ private static void buildTSBlockForDetails( builder.getColumnBuilder(3).writeInt(storageGroupInfo.getDataReplicationFactor()); builder.getColumnBuilder(4).writeLong(storageGroupInfo.getTimePartitionInterval()); builder.getColumnBuilder(5).writeInt(storageGroupInfo.getSchemaRegionNum()); - builder.getColumnBuilder(6).writeInt(storageGroupInfo.getDataRegionNum()); + builder.getColumnBuilder(6).writeInt(storageGroupInfo.getMinSchemaRegionNum()); + builder.getColumnBuilder(7).writeInt(storageGroupInfo.getMaxSchemaRegionNum()); + builder.getColumnBuilder(8).writeInt(storageGroupInfo.getDataRegionNum()); + builder.getColumnBuilder(9).writeInt(storageGroupInfo.getMinDataRegionNum()); + builder.getColumnBuilder(10).writeInt(storageGroupInfo.getMaxDataRegionNum()); builder.declarePosition(); } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/table/InformationSchemaUtils.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/table/InformationSchemaUtils.java index f736c96ee76d0..443352ae919c3 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/table/InformationSchemaUtils.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/table/InformationSchemaUtils.java @@ -74,8 +74,11 @@ public static void buildDatabaseTsBlock( builder.getColumnBuilder(3).appendNull(); builder.getColumnBuilder(4).appendNull(); if (details) { - builder.getColumnBuilder(5).appendNull(); - builder.getColumnBuilder(6).appendNull(); + for (int columnIndex = 5; + columnIndex < builder.getValueColumnBuilders().length; + columnIndex++) { + builder.getColumnBuilder(columnIndex).appendNull(); + } } builder.declarePosition(); } diff --git a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/column/ColumnHeaderConstant.java b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/column/ColumnHeaderConstant.java index 186f7daa6846d..d7c5e43b6f1e9 100644 --- a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/column/ColumnHeaderConstant.java +++ b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/column/ColumnHeaderConstant.java @@ -248,7 +248,13 @@ private ColumnHeaderConstant() { public static final String DATA_REPLICATION_FACTOR_TABLE_MODEL = "data_replication_factor"; public static final String TIME_PARTITION_INTERVAL_TABLE_MODEL = "time_partition_interval"; public static final String SCHEMA_REGION_GROUP_NUM_TABLE_MODEL = "schema_region_group_num"; + public static final String MIN_SCHEMA_REGION_GROUP_NUM_TABLE_MODEL = + "min_schema_region_group_num"; + public static final String MAX_SCHEMA_REGION_GROUP_NUM_TABLE_MODEL = + "max_schema_region_group_num"; public static final String DATA_REGION_GROUP_NUM_TABLE_MODEL = "data_region_group_num"; + public static final String MIN_DATA_REGION_GROUP_NUM_TABLE_MODEL = "min_data_region_group_num"; + public static final String MAX_DATA_REGION_GROUP_NUM_TABLE_MODEL = "max_data_region_group_num"; public static final String REGION_ID_TABLE_MODEL = "region_id"; public static final String DATANODE_ID_TABLE_MODEL = "datanode_id"; @@ -730,7 +736,11 @@ private ColumnHeaderConstant() { new ColumnHeader(DATA_REPLICATION_FACTOR, TSDataType.INT32), new ColumnHeader(TIME_PARTITION_INTERVAL, TSDataType.INT64), new ColumnHeader(SCHEMA_REGION_GROUP_NUM, TSDataType.INT32), - new ColumnHeader(DATA_REGION_GROUP_NUM, TSDataType.INT32)); + new ColumnHeader(MIN_SCHEMA_REGION_GROUP_NUM, TSDataType.INT32), + new ColumnHeader(MAX_SCHEMA_REGION_GROUP_NUM, TSDataType.INT32), + new ColumnHeader(DATA_REGION_GROUP_NUM, TSDataType.INT32), + new ColumnHeader(MIN_DATA_REGION_GROUP_NUM, TSDataType.INT32), + new ColumnHeader(MAX_DATA_REGION_GROUP_NUM, TSDataType.INT32)); public static final List describeTableColumnHeaders = ImmutableList.of( diff --git a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/table/InformationSchema.java b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/table/InformationSchema.java index 75b71efc75d0c..71e482152bc54 100644 --- a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/table/InformationSchema.java +++ b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/schema/table/InformationSchema.java @@ -106,9 +106,21 @@ public class InformationSchema { databaseTable.addColumnSchema( new AttributeColumnSchema( ColumnHeaderConstant.SCHEMA_REGION_GROUP_NUM_TABLE_MODEL, TSDataType.INT32)); + databaseTable.addColumnSchema( + new AttributeColumnSchema( + ColumnHeaderConstant.MIN_SCHEMA_REGION_GROUP_NUM_TABLE_MODEL, TSDataType.INT32)); + databaseTable.addColumnSchema( + new AttributeColumnSchema( + ColumnHeaderConstant.MAX_SCHEMA_REGION_GROUP_NUM_TABLE_MODEL, TSDataType.INT32)); databaseTable.addColumnSchema( new AttributeColumnSchema( ColumnHeaderConstant.DATA_REGION_GROUP_NUM_TABLE_MODEL, TSDataType.INT32)); + databaseTable.addColumnSchema( + new AttributeColumnSchema( + ColumnHeaderConstant.MIN_DATA_REGION_GROUP_NUM_TABLE_MODEL, TSDataType.INT32)); + databaseTable.addColumnSchema( + new AttributeColumnSchema( + ColumnHeaderConstant.MAX_DATA_REGION_GROUP_NUM_TABLE_MODEL, TSDataType.INT32)); schemaTables.put(DATABASES, databaseTable); final TsTable tableTable = new TsTable(TABLES);