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

JackieTien97 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 554ac2620ad 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)
554ac2620ad is described below

commit 554ac2620ad22594f977b3a49e9dfcb172c384e4
Author: Caideyipi <[email protected]>
AuthorDate: Tue Apr 28 13:19:28 2026 +0800

    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)
---
 .../confignode/persistence/schema/ConfigMTree.java | 24 +++++++-
 .../persistence/schema/ConfigMTreeTest.java        | 47 ++++++++++++++++
 .../InformationSchemaContentSupplierFactory.java   | 64 +++++++++++++++++-----
 .../relational/DescribeTableDetailsTask.java       | 15 +++--
 .../plan/planner/LogicalPlanVisitor.java           |  4 +-
 .../table/TableColumnMetadataUtil.java             | 62 +++++++++++++++++++++
 .../logical/RegionScanLogicalPlannerTest.java      |  8 +--
 .../logical/SchemaQueryLogicalPlannerTest.java     | 17 ++++++
 .../table/TableColumnMetadataUtilTest.java         | 60 ++++++++++++++++++++
 9 files changed, 269 insertions(+), 32 deletions(-)

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 5ec58655249..c39c5fe3ff9 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
@@ -36,6 +36,7 @@ import 
org.apache.iotdb.commons.schema.node.utils.IMNodeIterator;
 import org.apache.iotdb.commons.schema.table.TableNodeStatus;
 import org.apache.iotdb.commons.schema.table.TreeViewSchema;
 import org.apache.iotdb.commons.schema.table.TsTable;
+import org.apache.iotdb.commons.schema.table.column.FieldColumnSchema;
 import org.apache.iotdb.commons.schema.table.column.TsTableColumnCategory;
 import org.apache.iotdb.commons.schema.table.column.TsTableColumnSchema;
 import org.apache.iotdb.commons.utils.MetadataUtils;
@@ -55,6 +56,7 @@ import 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.traverser.collector.M
 import 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.traverser.collector.MNodeCollector;
 import 
org.apache.iotdb.db.schemaengine.schemaregion.mtree.traverser.counter.DatabaseCounter;
 import org.apache.iotdb.db.schemaengine.schemaregion.utils.MetaFormatUtils;
+import org.apache.iotdb.db.utils.SchemaUtils;
 import org.apache.iotdb.rpc.TSStatusCode;
 
 import org.apache.tsfile.enums.TSDataType;
@@ -1016,8 +1018,14 @@ public class ConfigMTree {
       throws MetadataException {
     final ConfigTableNode node = getTableNode(database, tableName);
     final TsTable table = getTable(database, tableName);
-    if (Objects.nonNull(table.getColumnSchema(columnName))) {
-      table.getColumnSchema(columnName).setDataType(dataType);
+    final TsTableColumnSchema columnSchema = table.getColumnSchema(columnName);
+    if (Objects.nonNull(columnSchema)) {
+      columnSchema.setDataType(dataType);
+      if (columnSchema instanceof FieldColumnSchema) {
+        final FieldColumnSchema fieldColumnSchema = (FieldColumnSchema) 
columnSchema;
+        fieldColumnSchema.setEncoding(
+            SchemaUtils.getDataTypeCompatibleEncoding(dataType, 
fieldColumnSchema.getEncoding()));
+      }
       node.removePreAlteredColumn(columnName);
     }
   }
@@ -1034,7 +1042,17 @@ public class ConfigMTree {
     }
     if (!node.getPreAlteredColumns().isEmpty()) {
       node.getPreAlteredColumns()
-          .forEach((col, type) -> 
newTable.getColumnSchema(col).setDataType(type));
+          .forEach(
+              (col, type) -> {
+                final TsTableColumnSchema columnSchema = 
newTable.getColumnSchema(col);
+                columnSchema.setDataType(type);
+                if (columnSchema instanceof FieldColumnSchema) {
+                  final FieldColumnSchema fieldColumnSchema = 
(FieldColumnSchema) columnSchema;
+                  fieldColumnSchema.setEncoding(
+                      SchemaUtils.getDataTypeCompatibleEncoding(
+                          type, fieldColumnSchema.getEncoding()));
+                }
+              });
     }
     return newTable;
   }
diff --git 
a/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/persistence/schema/ConfigMTreeTest.java
 
b/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/persistence/schema/ConfigMTreeTest.java
index 6f2df1e129a..f4dbd9a3972 100644
--- 
a/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/persistence/schema/ConfigMTreeTest.java
+++ 
b/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/persistence/schema/ConfigMTreeTest.java
@@ -31,6 +31,7 @@ import 
org.apache.iotdb.commons.schema.table.column.TagColumnSchema;
 import org.apache.iotdb.commons.utils.PathUtils;
 import org.apache.iotdb.confignode.persistence.schema.mnode.IConfigMNode;
 import org.apache.iotdb.confignode.rpc.thrift.TDatabaseSchema;
+import org.apache.iotdb.db.utils.SchemaUtils;
 
 import org.apache.tsfile.enums.TSDataType;
 import org.apache.tsfile.file.metadata.enums.CompressionType;
@@ -406,6 +407,52 @@ public class ConfigMTreeTest {
     }
   }
 
+  @Test
+  public void testAlterColumnTypeUpdatesCompatibleEncoding() throws Exception {
+    root = new ConfigMTree(true);
+
+    final PartialPath database = new PartialPath("root.sg");
+    root.setStorageGroup(database);
+    final IDatabaseMNode<IConfigMNode> databaseNode = 
root.getDatabaseNodeByDatabasePath(database);
+    databaseNode
+        .getAsMNode()
+        .getDatabaseSchema()
+        .setName(PathUtils.unQualifyDatabaseName(database.getFullPath()));
+    databaseNode.getAsMNode().getDatabaseSchema().setIsTableModel(true);
+
+    final TsTable table = new TsTable("table1");
+    table.addColumnSchema(new TagColumnSchema("id", TSDataType.STRING));
+    table.addColumnSchema(
+        new FieldColumnSchema(
+            "measurement", TSDataType.DOUBLE, TSEncoding.GORILLA, 
CompressionType.SNAPPY));
+    root.preCreateTable(database, table);
+    root.commitCreateTable(database, table.getTableName());
+
+    root.preAlterColumnDataType(database, table.getTableName(), "measurement", 
TSDataType.STRING);
+
+    final TSEncoding expectedEncoding =
+        SchemaUtils.getDataTypeCompatibleEncoding(TSDataType.STRING, 
TSEncoding.GORILLA);
+    Assert.assertNotEquals(TSEncoding.GORILLA, expectedEncoding);
+
+    final TsTable preAlteredTable = root.getUsingTableSchema(database, 
table.getTableName());
+    final FieldColumnSchema preAlteredField =
+        (FieldColumnSchema) preAlteredTable.getColumnSchema("measurement");
+    Assert.assertEquals(TSDataType.STRING, preAlteredField.getDataType());
+    Assert.assertEquals(expectedEncoding, preAlteredField.getEncoding());
+
+    root.commitAlterColumnDataType(
+        database, table.getTableName(), "measurement", TSDataType.STRING);
+
+    final TsTable committedTable = root.getUsingTableSchema(database, 
table.getTableName());
+    final FieldColumnSchema committedField =
+        (FieldColumnSchema) committedTable.getColumnSchema("measurement");
+    Assert.assertEquals(TSDataType.STRING, committedField.getDataType());
+    Assert.assertEquals(expectedEncoding, committedField.getEncoding());
+
+    Assert.assertTrue(
+        root.getTableSchemaDetails(database, 
table.getTableName()).preAlteredColumns.isEmpty());
+  }
+
   @Test
   public void testSetTemplate() throws MetadataException {
     root.setStorageGroup(new PartialPath("root.a"));
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 a1ea9c9dbb8..9c31a23251b 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
@@ -90,6 +90,7 @@ import 
org.apache.iotdb.db.queryengine.plan.relational.planner.node.TableDiskUsa
 import org.apache.iotdb.db.queryengine.plan.relational.security.AccessControl;
 import org.apache.iotdb.db.relational.grammar.sql.RelationalSqlKeywords;
 import org.apache.iotdb.db.schemaengine.table.InformationSchemaUtils;
+import org.apache.iotdb.db.schemaengine.table.TableColumnMetadataUtil;
 import org.apache.iotdb.db.storageengine.dataregion.DataRegion;
 import 
org.apache.iotdb.db.storageengine.dataregion.utils.StorageEngineTimePartitionIterator;
 import 
org.apache.iotdb.db.storageengine.dataregion.utils.tableDiskUsageIndex.DataRegionTableSizeQueryContext;
@@ -463,12 +464,13 @@ public class InformationSchemaContentSupplierFactory {
   }
 
   private static class ColumnSupplier extends TsBlockSupplier {
-    private final Iterator<Map.Entry<String, Map<String, Pair<TsTable, 
Set<String>>>>> dbIterator;
-    private Iterator<Map.Entry<String, Pair<TsTable, Set<String>>>> 
tableInfoIterator;
+    private final Iterator<Map.Entry<String, Map<String, 
TableColumnDetailInfo>>> dbIterator;
+    private Iterator<Map.Entry<String, TableColumnDetailInfo>> 
tableInfoIterator;
     private Iterator<TsTableColumnSchema> columnSchemaIterator;
     private String dbName;
     private String tableName;
     private Set<String> preDeletedColumns;
+    private Map<String, Byte> preAlteredColumns;
     private final UserEntity userEntity;
 
     private ColumnSupplier(final List<TSDataType> dataTypes, final UserEntity 
userEntity)
@@ -477,9 +479,8 @@ public class InformationSchemaContentSupplierFactory {
       this.userEntity = userEntity;
       try (final ConfigNodeClient client =
           
ConfigNodeClientManager.getInstance().borrowClient(ConfigNodeInfo.CONFIG_REGION_ID))
 {
-        final TDescTable4InformationSchemaResp resp = 
client.descTables4InformationSchema();
-        final Map<String, Map<String, Pair<TsTable, Set<String>>>> resultMap =
-            resp.getTableColumnInfoMap().entrySet().stream()
+        final Map<String, Map<String, TableColumnDetailInfo>> resultMap =
+            
client.descTables4InformationSchema().getTableColumnInfoMap().entrySet().stream()
                 .collect(
                     Collectors.toMap(
                         Map.Entry::getKey,
@@ -489,17 +490,20 @@ public class InformationSchemaContentSupplierFactory {
                                     Collectors.toMap(
                                         Map.Entry::getKey,
                                         tableEntry ->
-                                            new Pair<>(
+                                            new TableColumnDetailInfo(
                                                 
TsTableInternalRPCUtil.deserializeSingleTsTable(
                                                     
tableEntry.getValue().getTableInfo()),
-                                                
tableEntry.getValue().getPreDeletedColumns())))));
+                                                
tableEntry.getValue().getPreDeletedColumns(),
+                                                
tableEntry.getValue().getPreAlteredColumns())))));
         resultMap.put(
             InformationSchema.INFORMATION_DATABASE,
             InformationSchema.getSchemaTables().values().stream()
                 .collect(
                     Collectors.toMap(
                         TsTable::getTableName,
-                        table -> new Pair<>(table, Collections.emptySet()))));
+                        table ->
+                            new TableColumnDetailInfo(
+                                table, Collections.emptySet(), 
Collections.emptyMap()))));
         dbIterator = resultMap.entrySet().iterator();
       }
     }
@@ -512,12 +516,15 @@ public class InformationSchemaContentSupplierFactory {
       columnBuilders[2].writeBinary(
           new Binary(schema.getColumnName(), TSFileConfig.STRING_CHARSET));
       columnBuilders[3].writeBinary(
-          new Binary(schema.getDataType().name(), 
TSFileConfig.STRING_CHARSET));
+          new Binary(
+              TableColumnMetadataUtil.getColumnDataTypeName(schema, 
preAlteredColumns),
+              TSFileConfig.STRING_CHARSET));
       columnBuilders[4].writeBinary(
           new Binary(schema.getColumnCategory().name(), 
TSFileConfig.STRING_CHARSET));
       columnBuilders[5].writeBinary(
           new Binary(
-              preDeletedColumns.contains(schema.getColumnName()) ? 
"PRE_DELETE" : "USING",
+              TableColumnMetadataUtil.getColumnStatus(
+                  schema.getColumnName(), preDeletedColumns, 
preAlteredColumns),
               TSFileConfig.STRING_CHARSET));
 
       if (schema.getProps().containsKey(TsTable.COMMENT_KEY)) {
@@ -536,8 +543,7 @@ public class InformationSchemaContentSupplierFactory {
           if (!dbIterator.hasNext()) {
             return false;
           }
-          final Map.Entry<String, Map<String, Pair<TsTable, Set<String>>>> 
entry =
-              dbIterator.next();
+          final Map.Entry<String, Map<String, TableColumnDetailInfo>> entry = 
dbIterator.next();
           dbName = entry.getKey();
           if (!canShowDB(accessControl, userEntity.getUsername(), dbName, 
userEntity)) {
             continue;
@@ -545,14 +551,15 @@ public class InformationSchemaContentSupplierFactory {
           tableInfoIterator = entry.getValue().entrySet().iterator();
         }
 
-        Map.Entry<String, Pair<TsTable, Set<String>>> tableEntry;
+        Map.Entry<String, TableColumnDetailInfo> tableEntry;
         while (tableInfoIterator.hasNext()) {
           tableEntry = tableInfoIterator.next();
           if (canShowTable(
               accessControl, userEntity.getUsername(), dbName, 
tableEntry.getKey(), userEntity)) {
             tableName = tableEntry.getKey();
-            preDeletedColumns = tableEntry.getValue().getRight();
-            columnSchemaIterator = 
tableEntry.getValue().getLeft().getColumnList().iterator();
+            preDeletedColumns = tableEntry.getValue().getPreDeletedColumns();
+            preAlteredColumns = tableEntry.getValue().getPreAlteredColumns();
+            columnSchemaIterator = 
tableEntry.getValue().getTable().getColumnList().iterator();
             break;
           }
         }
@@ -561,6 +568,33 @@ public class InformationSchemaContentSupplierFactory {
     }
   }
 
+  private static class TableColumnDetailInfo {
+    private final TsTable table;
+    private final Set<String> preDeletedColumns;
+    private final Map<String, Byte> preAlteredColumns;
+
+    private TableColumnDetailInfo(
+        final TsTable table,
+        final Set<String> preDeletedColumns,
+        final Map<String, Byte> preAlteredColumns) {
+      this.table = table;
+      this.preDeletedColumns = preDeletedColumns;
+      this.preAlteredColumns = preAlteredColumns;
+    }
+
+    private TsTable getTable() {
+      return table;
+    }
+
+    private Set<String> getPreDeletedColumns() {
+      return preDeletedColumns;
+    }
+
+    private Map<String, Byte> getPreAlteredColumns() {
+      return preAlteredColumns;
+    }
+  }
+
   private static class RegionSupplier extends TsBlockSupplier {
     private final Iterator<TRegionInfo> iterator;
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/relational/DescribeTableDetailsTask.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/relational/DescribeTableDetailsTask.java
index ac2fe718850..79e9a016d5b 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/relational/DescribeTableDetailsTask.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/relational/DescribeTableDetailsTask.java
@@ -27,6 +27,7 @@ import 
org.apache.iotdb.db.queryengine.common.header.DatasetHeader;
 import org.apache.iotdb.db.queryengine.common.header.DatasetHeaderFactory;
 import org.apache.iotdb.db.queryengine.plan.execution.config.ConfigTaskResult;
 import 
org.apache.iotdb.db.queryengine.plan.execution.config.executor.IConfigTaskExecutor;
+import org.apache.iotdb.db.schemaengine.table.TableColumnMetadataUtil;
 import org.apache.iotdb.rpc.TSStatusCode;
 
 import com.google.common.util.concurrent.ListenableFuture;
@@ -65,14 +66,12 @@ public class DescribeTableDetailsTask extends 
AbstractTableTask {
     final TsBlockBuilder builder = new TsBlockBuilder(outputDataTypes);
     for (final TsTableColumnSchema columnSchema : table.getColumnList()) {
       builder.getTimeColumnBuilder().writeLong(0L);
-      String columnStatus = "USING";
-      String dataTypeName = columnSchema.getDataType().name();
-      if (preDeletedColumns.contains(columnSchema.getColumnName())) {
-        columnStatus = "PRE_DELETE";
-      }
-      builder
-          .getColumnBuilder(0)
-          .writeBinary(new Binary(columnSchema.getColumnName(), 
TSFileConfig.STRING_CHARSET));
+      final String columnName = columnSchema.getColumnName();
+      final String columnStatus =
+          TableColumnMetadataUtil.getColumnStatus(columnName, 
preDeletedColumns, preAlteredColumns);
+      final String dataTypeName =
+          TableColumnMetadataUtil.getColumnDataTypeName(columnSchema, 
preAlteredColumns);
+      builder.getColumnBuilder(0).writeBinary(new Binary(columnName, 
TSFileConfig.STRING_CHARSET));
       builder
           .getColumnBuilder(1)
           .writeBinary(new Binary(dataTypeName, TSFileConfig.STRING_CHARSET));
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanVisitor.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanVisitor.java
index 35011051839..a9b0b9d83f4 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanVisitor.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LogicalPlanVisitor.java
@@ -658,8 +658,8 @@ public class LogicalPlanVisitor extends 
StatementVisitor<PlanNode, MPPQueryConte
       planBuilder =
           planBuilder
               .planDeviceRegionScan(analysis.getDevicePathToContextMap(), 
false)
-              .planLimit(showDevicesStatement.getLimit())
-              .planOffset(showDevicesStatement.getOffset());
+              .planOffset(showDevicesStatement.getOffset())
+              .planLimit(showDevicesStatement.getLimit());
       return planBuilder.getRoot();
     }
 
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/table/TableColumnMetadataUtil.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/table/TableColumnMetadataUtil.java
new file mode 100644
index 00000000000..268564056b1
--- /dev/null
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/table/TableColumnMetadataUtil.java
@@ -0,0 +1,62 @@
+/*
+ * 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.db.schemaengine.table;
+
+import org.apache.iotdb.commons.schema.table.column.TsTableColumnSchema;
+
+import org.apache.tsfile.enums.TSDataType;
+
+import java.util.Map;
+import java.util.Set;
+
+public final class TableColumnMetadataUtil {
+
+  public static final String USING_STATUS = "USING";
+  public static final String PRE_DELETE_STATUS = "PRE_DELETE";
+  public static final String PRE_ALTER_STATUS = "PRE_ALTER";
+
+  private TableColumnMetadataUtil() {
+    // Utility class
+  }
+
+  public static String getColumnStatus(
+      final String columnName,
+      final Set<String> preDeletedColumns,
+      final Map<String, ?> preAlteredColumns) {
+    if (preDeletedColumns != null && preDeletedColumns.contains(columnName)) {
+      return PRE_DELETE_STATUS;
+    }
+    if (preAlteredColumns != null && 
preAlteredColumns.containsKey(columnName)) {
+      return PRE_ALTER_STATUS;
+    }
+    return USING_STATUS;
+  }
+
+  public static String getColumnDataTypeName(
+      final TsTableColumnSchema columnSchema, final Map<String, Byte> 
preAlteredColumns) {
+    if (preAlteredColumns != null) {
+      final Byte serializedType = 
preAlteredColumns.get(columnSchema.getColumnName());
+      if (serializedType != null) {
+        return TSDataType.deserialize(serializedType).name();
+      }
+    }
+    return columnSchema.getDataType().name();
+  }
+}
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/logical/RegionScanLogicalPlannerTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/logical/RegionScanLogicalPlannerTest.java
index b7accedfd29..dd3b8b6281e 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/logical/RegionScanLogicalPlannerTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/logical/RegionScanLogicalPlannerTest.java
@@ -216,13 +216,13 @@ public class RegionScanLogicalPlannerTest {
     DeviceRegionScanNode regionScanNode =
         new DeviceRegionScanNode(queryId.genPlanNodeId(), deviceContextMap, 
false, null);
 
-    LimitNode limitNode = new LimitNode(queryId.genPlanNodeId(), 20);
-    limitNode.addChild(regionScanNode);
     OffsetNode offsetNode = new OffsetNode(queryId.genPlanNodeId(), 10);
-    offsetNode.addChild(limitNode);
+    offsetNode.addChild(regionScanNode);
+    LimitNode limitNode = new LimitNode(queryId.genPlanNodeId(), 20);
+    limitNode.addChild(offsetNode);
 
     PlanNode actualPlan = parseSQLToPlanNode(sql);
-    Assert.assertEquals(actualPlan, offsetNode);
+    Assert.assertEquals(actualPlan, limitNode);
   }
 
   @Test
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/logical/SchemaQueryLogicalPlannerTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/logical/SchemaQueryLogicalPlannerTest.java
index e3448929a12..945bad7f6ee 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/logical/SchemaQueryLogicalPlannerTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/planner/logical/SchemaQueryLogicalPlannerTest.java
@@ -47,6 +47,7 @@ import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.process.GroupByTag
 import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.process.LimitNode;
 import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.process.OffsetNode;
 import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.process.RawDataAggregationNode;
+import 
org.apache.iotdb.db.queryengine.plan.planner.plan.node.source.DeviceRegionScanNode;
 import 
org.apache.iotdb.db.queryengine.plan.planner.plan.parameter.AggregationStep;
 import 
org.apache.iotdb.db.queryengine.plan.planner.plan.parameter.CrossSeriesAggregationDescriptor;
 import org.apache.iotdb.db.queryengine.plan.statement.component.Ordering;
@@ -644,6 +645,22 @@ public class SchemaQueryLogicalPlannerTest {
     }
   }
 
+  @Test
+  public void testShowDevicesWithTimeConditionPaginationOrder() {
+    String sql = "SHOW DEVICES root.ln.wf01.wt01 WHERE time >= 10 limit 20 
offset 10";
+    try {
+      LimitNode limitNode = (LimitNode) parseSQLToPlanNode(sql);
+      Assert.assertEquals(20, limitNode.getLimit());
+
+      OffsetNode offsetNode = (OffsetNode) limitNode.getChild();
+      Assert.assertEquals(10, offsetNode.getOffset());
+      Assert.assertTrue(offsetNode.getChild() instanceof DeviceRegionScanNode);
+    } catch (Exception e) {
+      e.printStackTrace();
+      fail();
+    }
+  }
+
   @Test
   public void testCountNodes() {
     String sql = "COUNT NODES root.ln LEVEL=1";
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/schemaengine/table/TableColumnMetadataUtilTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/schemaengine/table/TableColumnMetadataUtilTest.java
new file mode 100644
index 00000000000..879c3cdc94e
--- /dev/null
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/schemaengine/table/TableColumnMetadataUtilTest.java
@@ -0,0 +1,60 @@
+/*
+ * 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.db.schemaengine.table;
+
+import org.apache.iotdb.commons.schema.table.column.FieldColumnSchema;
+
+import org.apache.tsfile.enums.TSDataType;
+import org.junit.Test;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+import static org.junit.Assert.assertEquals;
+
+public class TableColumnMetadataUtilTest {
+
+  @Test
+  public void testPreAlteredColumnUsesPendingTypeAndStatus() {
+    final FieldColumnSchema columnSchema = new FieldColumnSchema("s1", 
TSDataType.INT32);
+    final Map<String, Byte> preAlteredColumns = new HashMap<>();
+    preAlteredColumns.put("s1", TSDataType.INT64.serialize());
+
+    assertEquals(
+        TableColumnMetadataUtil.PRE_ALTER_STATUS,
+        TableColumnMetadataUtil.getColumnStatus("s1", Collections.emptySet(), 
preAlteredColumns));
+    assertEquals(
+        TSDataType.INT64.name(),
+        TableColumnMetadataUtil.getColumnDataTypeName(columnSchema, 
preAlteredColumns));
+  }
+
+  @Test
+  public void testPreDeleteStatusTakesPriority() {
+    final Set<String> preDeletedColumns = Collections.singleton("s1");
+    final Map<String, Byte> preAlteredColumns = new HashMap<>();
+    preAlteredColumns.put("s1", TSDataType.FLOAT.serialize());
+
+    assertEquals(
+        TableColumnMetadataUtil.PRE_DELETE_STATUS,
+        TableColumnMetadataUtil.getColumnStatus("s1", preDeletedColumns, 
preAlteredColumns));
+  }
+}

Reply via email to