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));
+ }
+}