Skip to content

Commit 554ac26

Browse files
authored
Fixed the pre-Alter in table display logic && The compatible type written in CN for alter column type && Sequence of limit & offset in tree model show-devices (#17558)
1 parent c9c16a9 commit 554ac26

9 files changed

Lines changed: 269 additions & 32 deletions

File tree

iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/ConfigMTree.java

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import org.apache.iotdb.commons.schema.table.TableNodeStatus;
3737
import org.apache.iotdb.commons.schema.table.TreeViewSchema;
3838
import org.apache.iotdb.commons.schema.table.TsTable;
39+
import org.apache.iotdb.commons.schema.table.column.FieldColumnSchema;
3940
import org.apache.iotdb.commons.schema.table.column.TsTableColumnCategory;
4041
import org.apache.iotdb.commons.schema.table.column.TsTableColumnSchema;
4142
import org.apache.iotdb.commons.utils.MetadataUtils;
@@ -55,6 +56,7 @@
5556
import org.apache.iotdb.db.schemaengine.schemaregion.mtree.traverser.collector.MNodeCollector;
5657
import org.apache.iotdb.db.schemaengine.schemaregion.mtree.traverser.counter.DatabaseCounter;
5758
import org.apache.iotdb.db.schemaengine.schemaregion.utils.MetaFormatUtils;
59+
import org.apache.iotdb.db.utils.SchemaUtils;
5860
import org.apache.iotdb.rpc.TSStatusCode;
5961

6062
import org.apache.tsfile.enums.TSDataType;
@@ -1016,8 +1018,14 @@ public void commitAlterColumnDataType(
10161018
throws MetadataException {
10171019
final ConfigTableNode node = getTableNode(database, tableName);
10181020
final TsTable table = getTable(database, tableName);
1019-
if (Objects.nonNull(table.getColumnSchema(columnName))) {
1020-
table.getColumnSchema(columnName).setDataType(dataType);
1021+
final TsTableColumnSchema columnSchema = table.getColumnSchema(columnName);
1022+
if (Objects.nonNull(columnSchema)) {
1023+
columnSchema.setDataType(dataType);
1024+
if (columnSchema instanceof FieldColumnSchema) {
1025+
final FieldColumnSchema fieldColumnSchema = (FieldColumnSchema) columnSchema;
1026+
fieldColumnSchema.setEncoding(
1027+
SchemaUtils.getDataTypeCompatibleEncoding(dataType, fieldColumnSchema.getEncoding()));
1028+
}
10211029
node.removePreAlteredColumn(columnName);
10221030
}
10231031
}
@@ -1034,7 +1042,17 @@ public TsTable getUsingTableSchema(final PartialPath database, final String tabl
10341042
}
10351043
if (!node.getPreAlteredColumns().isEmpty()) {
10361044
node.getPreAlteredColumns()
1037-
.forEach((col, type) -> newTable.getColumnSchema(col).setDataType(type));
1045+
.forEach(
1046+
(col, type) -> {
1047+
final TsTableColumnSchema columnSchema = newTable.getColumnSchema(col);
1048+
columnSchema.setDataType(type);
1049+
if (columnSchema instanceof FieldColumnSchema) {
1050+
final FieldColumnSchema fieldColumnSchema = (FieldColumnSchema) columnSchema;
1051+
fieldColumnSchema.setEncoding(
1052+
SchemaUtils.getDataTypeCompatibleEncoding(
1053+
type, fieldColumnSchema.getEncoding()));
1054+
}
1055+
});
10381056
}
10391057
return newTable;
10401058
}

iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/persistence/schema/ConfigMTreeTest.java

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.apache.iotdb.commons.utils.PathUtils;
3232
import org.apache.iotdb.confignode.persistence.schema.mnode.IConfigMNode;
3333
import org.apache.iotdb.confignode.rpc.thrift.TDatabaseSchema;
34+
import org.apache.iotdb.db.utils.SchemaUtils;
3435

3536
import org.apache.tsfile.enums.TSDataType;
3637
import org.apache.tsfile.file.metadata.enums.CompressionType;
@@ -406,6 +407,52 @@ public void testTableSerialization() throws Exception {
406407
}
407408
}
408409

410+
@Test
411+
public void testAlterColumnTypeUpdatesCompatibleEncoding() throws Exception {
412+
root = new ConfigMTree(true);
413+
414+
final PartialPath database = new PartialPath("root.sg");
415+
root.setStorageGroup(database);
416+
final IDatabaseMNode<IConfigMNode> databaseNode = root.getDatabaseNodeByDatabasePath(database);
417+
databaseNode
418+
.getAsMNode()
419+
.getDatabaseSchema()
420+
.setName(PathUtils.unQualifyDatabaseName(database.getFullPath()));
421+
databaseNode.getAsMNode().getDatabaseSchema().setIsTableModel(true);
422+
423+
final TsTable table = new TsTable("table1");
424+
table.addColumnSchema(new TagColumnSchema("id", TSDataType.STRING));
425+
table.addColumnSchema(
426+
new FieldColumnSchema(
427+
"measurement", TSDataType.DOUBLE, TSEncoding.GORILLA, CompressionType.SNAPPY));
428+
root.preCreateTable(database, table);
429+
root.commitCreateTable(database, table.getTableName());
430+
431+
root.preAlterColumnDataType(database, table.getTableName(), "measurement", TSDataType.STRING);
432+
433+
final TSEncoding expectedEncoding =
434+
SchemaUtils.getDataTypeCompatibleEncoding(TSDataType.STRING, TSEncoding.GORILLA);
435+
Assert.assertNotEquals(TSEncoding.GORILLA, expectedEncoding);
436+
437+
final TsTable preAlteredTable = root.getUsingTableSchema(database, table.getTableName());
438+
final FieldColumnSchema preAlteredField =
439+
(FieldColumnSchema) preAlteredTable.getColumnSchema("measurement");
440+
Assert.assertEquals(TSDataType.STRING, preAlteredField.getDataType());
441+
Assert.assertEquals(expectedEncoding, preAlteredField.getEncoding());
442+
443+
root.commitAlterColumnDataType(
444+
database, table.getTableName(), "measurement", TSDataType.STRING);
445+
446+
final TsTable committedTable = root.getUsingTableSchema(database, table.getTableName());
447+
final FieldColumnSchema committedField =
448+
(FieldColumnSchema) committedTable.getColumnSchema("measurement");
449+
Assert.assertEquals(TSDataType.STRING, committedField.getDataType());
450+
Assert.assertEquals(expectedEncoding, committedField.getEncoding());
451+
452+
Assert.assertTrue(
453+
root.getTableSchemaDetails(database, table.getTableName()).preAlteredColumns.isEmpty());
454+
}
455+
409456
@Test
410457
public void testSetTemplate() throws MetadataException {
411458
root.setStorageGroup(new PartialPath("root.a"));

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/InformationSchemaContentSupplierFactory.java

Lines changed: 49 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@
9090
import org.apache.iotdb.db.queryengine.plan.relational.security.AccessControl;
9191
import org.apache.iotdb.db.relational.grammar.sql.RelationalSqlKeywords;
9292
import org.apache.iotdb.db.schemaengine.table.InformationSchemaUtils;
93+
import org.apache.iotdb.db.schemaengine.table.TableColumnMetadataUtil;
9394
import org.apache.iotdb.db.storageengine.dataregion.DataRegion;
9495
import org.apache.iotdb.db.storageengine.dataregion.utils.StorageEngineTimePartitionIterator;
9596
import org.apache.iotdb.db.storageengine.dataregion.utils.tableDiskUsageIndex.DataRegionTableSizeQueryContext;
@@ -463,12 +464,13 @@ public boolean hasNext() {
463464
}
464465

465466
private static class ColumnSupplier extends TsBlockSupplier {
466-
private final Iterator<Map.Entry<String, Map<String, Pair<TsTable, Set<String>>>>> dbIterator;
467-
private Iterator<Map.Entry<String, Pair<TsTable, Set<String>>>> tableInfoIterator;
467+
private final Iterator<Map.Entry<String, Map<String, TableColumnDetailInfo>>> dbIterator;
468+
private Iterator<Map.Entry<String, TableColumnDetailInfo>> tableInfoIterator;
468469
private Iterator<TsTableColumnSchema> columnSchemaIterator;
469470
private String dbName;
470471
private String tableName;
471472
private Set<String> preDeletedColumns;
473+
private Map<String, Byte> preAlteredColumns;
472474
private final UserEntity userEntity;
473475

474476
private ColumnSupplier(final List<TSDataType> dataTypes, final UserEntity userEntity)
@@ -477,9 +479,8 @@ private ColumnSupplier(final List<TSDataType> dataTypes, final UserEntity userEn
477479
this.userEntity = userEntity;
478480
try (final ConfigNodeClient client =
479481
ConfigNodeClientManager.getInstance().borrowClient(ConfigNodeInfo.CONFIG_REGION_ID)) {
480-
final TDescTable4InformationSchemaResp resp = client.descTables4InformationSchema();
481-
final Map<String, Map<String, Pair<TsTable, Set<String>>>> resultMap =
482-
resp.getTableColumnInfoMap().entrySet().stream()
482+
final Map<String, Map<String, TableColumnDetailInfo>> resultMap =
483+
client.descTables4InformationSchema().getTableColumnInfoMap().entrySet().stream()
483484
.collect(
484485
Collectors.toMap(
485486
Map.Entry::getKey,
@@ -489,17 +490,20 @@ private ColumnSupplier(final List<TSDataType> dataTypes, final UserEntity userEn
489490
Collectors.toMap(
490491
Map.Entry::getKey,
491492
tableEntry ->
492-
new Pair<>(
493+
new TableColumnDetailInfo(
493494
TsTableInternalRPCUtil.deserializeSingleTsTable(
494495
tableEntry.getValue().getTableInfo()),
495-
tableEntry.getValue().getPreDeletedColumns())))));
496+
tableEntry.getValue().getPreDeletedColumns(),
497+
tableEntry.getValue().getPreAlteredColumns())))));
496498
resultMap.put(
497499
InformationSchema.INFORMATION_DATABASE,
498500
InformationSchema.getSchemaTables().values().stream()
499501
.collect(
500502
Collectors.toMap(
501503
TsTable::getTableName,
502-
table -> new Pair<>(table, Collections.emptySet()))));
504+
table ->
505+
new TableColumnDetailInfo(
506+
table, Collections.emptySet(), Collections.emptyMap()))));
503507
dbIterator = resultMap.entrySet().iterator();
504508
}
505509
}
@@ -512,12 +516,15 @@ protected void constructLine() {
512516
columnBuilders[2].writeBinary(
513517
new Binary(schema.getColumnName(), TSFileConfig.STRING_CHARSET));
514518
columnBuilders[3].writeBinary(
515-
new Binary(schema.getDataType().name(), TSFileConfig.STRING_CHARSET));
519+
new Binary(
520+
TableColumnMetadataUtil.getColumnDataTypeName(schema, preAlteredColumns),
521+
TSFileConfig.STRING_CHARSET));
516522
columnBuilders[4].writeBinary(
517523
new Binary(schema.getColumnCategory().name(), TSFileConfig.STRING_CHARSET));
518524
columnBuilders[5].writeBinary(
519525
new Binary(
520-
preDeletedColumns.contains(schema.getColumnName()) ? "PRE_DELETE" : "USING",
526+
TableColumnMetadataUtil.getColumnStatus(
527+
schema.getColumnName(), preDeletedColumns, preAlteredColumns),
521528
TSFileConfig.STRING_CHARSET));
522529

523530
if (schema.getProps().containsKey(TsTable.COMMENT_KEY)) {
@@ -536,23 +543,23 @@ public boolean hasNext() {
536543
if (!dbIterator.hasNext()) {
537544
return false;
538545
}
539-
final Map.Entry<String, Map<String, Pair<TsTable, Set<String>>>> entry =
540-
dbIterator.next();
546+
final Map.Entry<String, Map<String, TableColumnDetailInfo>> entry = dbIterator.next();
541547
dbName = entry.getKey();
542548
if (!canShowDB(accessControl, userEntity.getUsername(), dbName, userEntity)) {
543549
continue;
544550
}
545551
tableInfoIterator = entry.getValue().entrySet().iterator();
546552
}
547553

548-
Map.Entry<String, Pair<TsTable, Set<String>>> tableEntry;
554+
Map.Entry<String, TableColumnDetailInfo> tableEntry;
549555
while (tableInfoIterator.hasNext()) {
550556
tableEntry = tableInfoIterator.next();
551557
if (canShowTable(
552558
accessControl, userEntity.getUsername(), dbName, tableEntry.getKey(), userEntity)) {
553559
tableName = tableEntry.getKey();
554-
preDeletedColumns = tableEntry.getValue().getRight();
555-
columnSchemaIterator = tableEntry.getValue().getLeft().getColumnList().iterator();
560+
preDeletedColumns = tableEntry.getValue().getPreDeletedColumns();
561+
preAlteredColumns = tableEntry.getValue().getPreAlteredColumns();
562+
columnSchemaIterator = tableEntry.getValue().getTable().getColumnList().iterator();
556563
break;
557564
}
558565
}
@@ -561,6 +568,33 @@ public boolean hasNext() {
561568
}
562569
}
563570

571+
private static class TableColumnDetailInfo {
572+
private final TsTable table;
573+
private final Set<String> preDeletedColumns;
574+
private final Map<String, Byte> preAlteredColumns;
575+
576+
private TableColumnDetailInfo(
577+
final TsTable table,
578+
final Set<String> preDeletedColumns,
579+
final Map<String, Byte> preAlteredColumns) {
580+
this.table = table;
581+
this.preDeletedColumns = preDeletedColumns;
582+
this.preAlteredColumns = preAlteredColumns;
583+
}
584+
585+
private TsTable getTable() {
586+
return table;
587+
}
588+
589+
private Set<String> getPreDeletedColumns() {
590+
return preDeletedColumns;
591+
}
592+
593+
private Map<String, Byte> getPreAlteredColumns() {
594+
return preAlteredColumns;
595+
}
596+
}
597+
564598
private static class RegionSupplier extends TsBlockSupplier {
565599
private final Iterator<TRegionInfo> iterator;
566600

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/relational/DescribeTableDetailsTask.java

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.apache.iotdb.db.queryengine.common.header.DatasetHeaderFactory;
2828
import org.apache.iotdb.db.queryengine.plan.execution.config.ConfigTaskResult;
2929
import org.apache.iotdb.db.queryengine.plan.execution.config.executor.IConfigTaskExecutor;
30+
import org.apache.iotdb.db.schemaengine.table.TableColumnMetadataUtil;
3031
import org.apache.iotdb.rpc.TSStatusCode;
3132

3233
import com.google.common.util.concurrent.ListenableFuture;
@@ -65,14 +66,12 @@ public static void buildTsBlock(
6566
final TsBlockBuilder builder = new TsBlockBuilder(outputDataTypes);
6667
for (final TsTableColumnSchema columnSchema : table.getColumnList()) {
6768
builder.getTimeColumnBuilder().writeLong(0L);
68-
String columnStatus = "USING";
69-
String dataTypeName = columnSchema.getDataType().name();
70-
if (preDeletedColumns.contains(columnSchema.getColumnName())) {
71-
columnStatus = "PRE_DELETE";
72-
}
73-
builder
74-
.getColumnBuilder(0)
75-
.writeBinary(new Binary(columnSchema.getColumnName(), TSFileConfig.STRING_CHARSET));
69+
final String columnName = columnSchema.getColumnName();
70+
final String columnStatus =
71+
TableColumnMetadataUtil.getColumnStatus(columnName, preDeletedColumns, preAlteredColumns);
72+
final String dataTypeName =
73+
TableColumnMetadataUtil.getColumnDataTypeName(columnSchema, preAlteredColumns);
74+
builder.getColumnBuilder(0).writeBinary(new Binary(columnName, TSFileConfig.STRING_CHARSET));
7675
builder
7776
.getColumnBuilder(1)
7877
.writeBinary(new Binary(dataTypeName, TSFileConfig.STRING_CHARSET));

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanVisitor.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -658,8 +658,8 @@ public PlanNode visitShowDevices(
658658
planBuilder =
659659
planBuilder
660660
.planDeviceRegionScan(analysis.getDevicePathToContextMap(), false)
661-
.planLimit(showDevicesStatement.getLimit())
662-
.planOffset(showDevicesStatement.getOffset());
661+
.planOffset(showDevicesStatement.getOffset())
662+
.planLimit(showDevicesStatement.getLimit());
663663
return planBuilder.getRoot();
664664
}
665665

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one
3+
* or more contributor license agreements. See the NOTICE file
4+
* distributed with this work for additional information
5+
* regarding copyright ownership. The ASF licenses this file
6+
* to you under the Apache License, Version 2.0 (the
7+
* "License"); you may not use this file except in compliance
8+
* with the License. You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
20+
package org.apache.iotdb.db.schemaengine.table;
21+
22+
import org.apache.iotdb.commons.schema.table.column.TsTableColumnSchema;
23+
24+
import org.apache.tsfile.enums.TSDataType;
25+
26+
import java.util.Map;
27+
import java.util.Set;
28+
29+
public final class TableColumnMetadataUtil {
30+
31+
public static final String USING_STATUS = "USING";
32+
public static final String PRE_DELETE_STATUS = "PRE_DELETE";
33+
public static final String PRE_ALTER_STATUS = "PRE_ALTER";
34+
35+
private TableColumnMetadataUtil() {
36+
// Utility class
37+
}
38+
39+
public static String getColumnStatus(
40+
final String columnName,
41+
final Set<String> preDeletedColumns,
42+
final Map<String, ?> preAlteredColumns) {
43+
if (preDeletedColumns != null && preDeletedColumns.contains(columnName)) {
44+
return PRE_DELETE_STATUS;
45+
}
46+
if (preAlteredColumns != null && preAlteredColumns.containsKey(columnName)) {
47+
return PRE_ALTER_STATUS;
48+
}
49+
return USING_STATUS;
50+
}
51+
52+
public static String getColumnDataTypeName(
53+
final TsTableColumnSchema columnSchema, final Map<String, Byte> preAlteredColumns) {
54+
if (preAlteredColumns != null) {
55+
final Byte serializedType = preAlteredColumns.get(columnSchema.getColumnName());
56+
if (serializedType != null) {
57+
return TSDataType.deserialize(serializedType).name();
58+
}
59+
}
60+
return columnSchema.getDataType().name();
61+
}
62+
}

iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/logical/RegionScanLogicalPlannerTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -216,13 +216,13 @@ public void testShowDevicesWithTimeConditionWithLimitOffset() throws IllegalPath
216216
DeviceRegionScanNode regionScanNode =
217217
new DeviceRegionScanNode(queryId.genPlanNodeId(), deviceContextMap, false, null);
218218

219-
LimitNode limitNode = new LimitNode(queryId.genPlanNodeId(), 20);
220-
limitNode.addChild(regionScanNode);
221219
OffsetNode offsetNode = new OffsetNode(queryId.genPlanNodeId(), 10);
222-
offsetNode.addChild(limitNode);
220+
offsetNode.addChild(regionScanNode);
221+
LimitNode limitNode = new LimitNode(queryId.genPlanNodeId(), 20);
222+
limitNode.addChild(offsetNode);
223223

224224
PlanNode actualPlan = parseSQLToPlanNode(sql);
225-
Assert.assertEquals(actualPlan, offsetNode);
225+
Assert.assertEquals(actualPlan, limitNode);
226226
}
227227

228228
@Test

0 commit comments

Comments
 (0)