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) {