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

jackietien 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 c5ce0a3cb55 Fixed the reuse of time column's comment
c5ce0a3cb55 is described below

commit c5ce0a3cb55dbc27f4e5bc2ce7d405097ac72aac
Author: Caideyipi <[email protected]>
AuthorDate: Mon Apr 14 14:41:34 2025 +0800

    Fixed the reuse of time column's comment
---
 .../iotdb/relational/it/schema/IoTDBTableIT.java   | 34 ++++++++++++++++++----
 .../confignode/persistence/schema/ConfigMTree.java | 23 +++++++++++----
 .../execution/config/TableConfigTaskVisitor.java   | 15 +++++-----
 3 files changed, 54 insertions(+), 18 deletions(-)

diff --git 
a/integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBTableIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBTableIT.java
index 52de0886ac6..88062e59edb 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBTableIT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBTableIT.java
@@ -108,7 +108,7 @@ public class IoTDBTableIT {
       // "FIELD" can be omitted when type is specified
       // "STRING" can be omitted when tag/attribute is specified
       statement.execute(
-          "create table test1.table1(region_id STRING TAG, plant_id STRING 
TAG, device_id TAG, model STRING ATTRIBUTE, temperature FLOAT FIELD, humidity 
DOUBLE) comment 'test' with (TTL='INF')");
+          "create table test1.table1(time TIMESTAMP TIME COMMENT 
'column_comment', region_id STRING TAG, plant_id STRING TAG, device_id TAG, 
model STRING ATTRIBUTE, temperature FLOAT FIELD, humidity DOUBLE) comment 
'test' with (TTL='INF')");
 
       try {
         statement.execute(
@@ -415,15 +415,39 @@ public class IoTDBTableIT {
       statement.execute("alter table table2 drop column color");
 
       // Test comment
+      // Before
+      columnNames = new String[] {"time", "region_id", "plant_id", 
"temperature", "speed"};
+      dataTypes = new String[] {"TIMESTAMP", "STRING", "STRING", "FLOAT", 
"DOUBLE"};
+      categories = new String[] {"TIME", "TAG", "TAG", "FIELD", "FIELD"};
+      statuses = new String[] {"USING", "USING", "USING", "USING", "USING"};
+
+      comments = new String[] {null, null, null, null, "fast"};
+      try (final ResultSet resultSet = statement.executeQuery("describe table2 
details")) {
+        int cnt = 0;
+        ResultSetMetaData metaData = resultSet.getMetaData();
+        assertEquals(describeTableDetailsColumnHeaders.size(), 
metaData.getColumnCount());
+        for (int i = 0; i < describeTableDetailsColumnHeaders.size(); i++) {
+          assertEquals(
+              describeTableDetailsColumnHeaders.get(i).getColumnName(),
+              metaData.getColumnName(i + 1));
+        }
+        while (resultSet.next()) {
+          assertEquals(columnNames[cnt], resultSet.getString(1));
+          assertEquals(dataTypes[cnt], resultSet.getString(2));
+          assertEquals(categories[cnt], resultSet.getString(3));
+          assertEquals(statuses[cnt], resultSet.getString(4));
+          assertEquals(comments[cnt], resultSet.getString(5));
+          cnt++;
+        }
+        assertEquals(columnNames.length, cnt);
+      }
+
+      // After
       statement.execute("COMMENT ON COLUMN table2.region_id IS '重庆'");
       statement.execute("COMMENT ON COLUMN table2.region_id IS NULL");
       statement.execute("COMMENT ON COLUMN test2.table2.time IS 'recent'");
       statement.execute("COMMENT ON COLUMN test2.table2.region_id IS ''");
 
-      columnNames = new String[] {"time", "region_id", "plant_id", 
"temperature", "speed"};
-      dataTypes = new String[] {"TIMESTAMP", "STRING", "STRING", "FLOAT", 
"DOUBLE"};
-      categories = new String[] {"TIME", "TAG", "TAG", "FIELD", "FIELD"};
-      statuses = new String[] {"USING", "USING", "USING", "USING", "USING"};
       comments = new String[] {"recent", "", null, null, "fast"};
       try (final ResultSet resultSet = statement.executeQuery("describe table2 
details")) {
         int cnt = 0;
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/ConfigMTree.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/ConfigMTree.java
index 1cf53c8ffeb..ee2ffc0b936 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/ConfigMTree.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/ConfigMTree.java
@@ -33,6 +33,7 @@ import 
org.apache.iotdb.commons.schema.node.utils.IMNodeFactory;
 import org.apache.iotdb.commons.schema.node.utils.IMNodeIterator;
 import org.apache.iotdb.commons.schema.table.TableNodeStatus;
 import org.apache.iotdb.commons.schema.table.TsTable;
+import org.apache.iotdb.commons.schema.table.column.TimeColumnSchema;
 import org.apache.iotdb.commons.schema.table.column.TsTableColumnCategory;
 import org.apache.iotdb.commons.schema.table.column.TsTableColumnSchema;
 import org.apache.iotdb.commons.utils.PathUtils;
@@ -53,11 +54,15 @@ import 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.traverser.counter.Dat
 import org.apache.iotdb.db.schemaengine.schemaregion.utils.MetaFormatUtils;
 import org.apache.iotdb.rpc.TSStatusCode;
 
+import org.apache.tsfile.enums.TSDataType;
 import org.apache.tsfile.utils.Pair;
 import org.apache.tsfile.utils.ReadWriteIOUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
@@ -88,6 +93,7 @@ import static 
org.apache.iotdb.commons.schema.SchemaConstant.NON_TEMPLATE;
 import static org.apache.iotdb.commons.schema.SchemaConstant.ROOT;
 import static 
org.apache.iotdb.commons.schema.SchemaConstant.STORAGE_GROUP_MNODE_TYPE;
 import static org.apache.iotdb.commons.schema.SchemaConstant.TABLE_MNODE_TYPE;
+import static org.apache.iotdb.commons.schema.table.TsTable.TIME_COLUMN_NAME;
 
 // Since the ConfigMTree is all stored in memory, thus it is not restricted to 
manage MNode through
 // MTreeStore.
@@ -723,20 +729,27 @@ public class ConfigMTree {
   }
 
   public void setTableColumnComment(
-      final PartialPath database,
-      final String tableName,
-      final String columnName,
-      final String comment)
+      final @Nonnull PartialPath database,
+      final @Nonnull String tableName,
+      final @Nonnull String columnName,
+      final @Nullable String comment)
       throws MetadataException {
     final TsTable table = getTable(database, tableName);
 
-    final TsTableColumnSchema columnSchema = table.getColumnSchema(columnName);
+    final TsTableColumnSchema columnSchema =
+        !columnName.equals(TIME_COLUMN_NAME) || Objects.isNull(comment)
+            ? table.getColumnSchema(columnName)
+            : new TimeColumnSchema(TIME_COLUMN_NAME, TSDataType.TIMESTAMP);
     if (Objects.isNull(columnSchema)) {
       throw new ColumnNotExistsException(
           PathUtils.unQualifyDatabaseName(database.getFullPath()), tableName, 
columnName);
     }
     if (Objects.nonNull(comment)) {
       columnSchema.getProps().put(TsTable.COMMENT_KEY, comment);
+      if (columnName.equals("time")) {
+        // Replace the original time column
+        table.addColumnSchema(columnSchema);
+      }
     } else {
       columnSchema.getProps().remove(TsTable.COMMENT_KEY);
     }
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 4bcbca3102c..8a343173545 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
@@ -31,6 +31,7 @@ import 
org.apache.iotdb.commons.pipe.config.constant.SystemConstant;
 import org.apache.iotdb.commons.schema.table.TsTable;
 import org.apache.iotdb.commons.schema.table.column.TimeColumnSchema;
 import org.apache.iotdb.commons.schema.table.column.TsTableColumnCategory;
+import org.apache.iotdb.commons.schema.table.column.TsTableColumnSchema;
 import org.apache.iotdb.confignode.rpc.thrift.TDatabaseSchema;
 import org.apache.iotdb.db.conf.IoTDBConfig;
 import org.apache.iotdb.db.exception.sql.SemanticException;
@@ -473,12 +474,7 @@ public class TableConfigTaskVisitor extends 
AstVisitor<IConfigTask, MPPQueryCont
       final String columnName = columnDefinition.getName().getValue();
       final TSDataType dataType = getDataType(columnDefinition.getType());
       final String comment = columnDefinition.getComment();
-      if (checkTimeColumnIdempotent(
-              category,
-              columnName,
-              dataType,
-              comment,
-              (TimeColumnSchema) table.getColumnSchema(TIME_COLUMN_NAME))
+      if (checkTimeColumnIdempotent(category, columnName, dataType, comment, 
table)
           && !hasTimeColumn) {
         hasTimeColumn = true;
         continue;
@@ -498,13 +494,16 @@ public class TableConfigTaskVisitor extends 
AstVisitor<IConfigTask, MPPQueryCont
       final String columnName,
       final TSDataType dataType,
       final String comment,
-      final TimeColumnSchema timeColumnSchema) {
+      final TsTable table) {
     if (category == TsTableColumnCategory.TIME || 
columnName.equals(TIME_COLUMN_NAME)) {
       if (category == TsTableColumnCategory.TIME
           && columnName.equals(TIME_COLUMN_NAME)
           && dataType == TSDataType.TIMESTAMP) {
         if (Objects.nonNull(comment)) {
-          timeColumnSchema.getProps().put(TsTable.COMMENT_KEY, comment);
+          final TsTableColumnSchema columnSchema =
+              new TimeColumnSchema(TIME_COLUMN_NAME, TSDataType.TIMESTAMP);
+          columnSchema.getProps().put(TsTable.COMMENT_KEY, comment);
+          table.addColumnSchema(columnSchema);
         }
         return true;
       } else if (dataType == TSDataType.TIMESTAMP) {

Reply via email to