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

Caideyipi pushed a commit to branch schema-fix-offset
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/schema-fix-offset by this push:
     new 7c1420696b7 fix
7c1420696b7 is described below

commit 7c1420696b71c68194549437f95a5ee22a6b7763
Author: Caideyipi <[email protected]>
AuthorDate: Mon Apr 27 16:17:36 2026 +0800

    fix
---
 .../InformationSchemaContentSupplierFactory.java   | 64 +++++++++++++++++-----
 .../relational/DescribeTableDetailsTask.java       | 15 +++--
 .../plan/planner/LogicalPlanVisitor.java           |  4 +-
 .../table/TableColumnMetadataUtil.java             | 62 +++++++++++++++++++++
 .../logical/SchemaQueryLogicalPlannerTest.java     | 17 ++++++
 .../table/TableColumnMetadataUtilTest.java         | 60 ++++++++++++++++++++
 6 files changed, 197 insertions(+), 25 deletions(-)

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/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